From c830097baf41a81b1e054b752538a009474131c8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 20 Jun 2023 01:31:05 +1000 Subject: [PATCH 001/114] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=20bios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP__48.ASM | 6 ++++-- Shared_Includes | 2 +- ZX_EXP.ASM | 2 +- ZX_EXP/SERVICE.ASM | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/SP__48.ASM b/SP__48.ASM index 194685d..76a53a8 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19332,13 +19332,15 @@ L3C97: ; ║ 16 байт + 22 байта ║ ; ╚═══════════════════════════╝ - LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 +// LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 JR JMP_EX BLOCK #3CF8-$,0 JMP_EX: PUSH HL PUSH AF - LD A,ROM.BIOS ; переход в BIOS +// LD A,ROM.BIOS ; переход в BIOS + LD A,ROM.EXPANSION ; переход в EXPANSION OUT (CNF_PORT.ON),A POP AF RET ; возврат diff --git a/Shared_Includes b/Shared_Includes index 6e27011..1b5b9e9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6e27011b6259b0256ce65d91a53ef1185223eafa +Subproject commit 1b5b9e9293232aa9db06065d59a0099a320b43b6 diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index f3c28c9..eb08e87 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -1723,7 +1723,7 @@ SOUND_TEST: HDD_EXE: EXP_HDD: PUSH AF - LD A,D_ROM16ON + LD A,D_ROM16ON ;!FIXIT придумать названия меткам OUT (CNF_PORT),A POP AF RET diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index 74c38c6..fb2ef9f 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -109,7 +109,7 @@ CLEAR_RAM: RST 18h IFDEF ZX_BIOS ; при очистке памяти из меню спектрума поломается возврат в DSS по CAD, поэтому отключаем возврат - LD A,#EE ;!HARDCODE Conf_port.RET_PORT + LD A,#EE ;!HARDCODE ACEX.RET_PORT LD BC,0*256 + #F8 ;!HARDCODE BIOS.SET_PORTS CALL #3D13 ;!HARDCODE ToBIOS_3D13 ENDIF From f0ab2100a7443f7a01f92ee163911bdad777bcc2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 21 Jun 2023 02:26:06 +1000 Subject: [PATCH 002/114] refactoring --- SP__48.ASM | 365 ++++++++++++++++++++------------------------- ZX_EXP/SERVICE.ASM | 4 +- ZX_EXP/TEST.ASM | 43 +++--- 3 files changed, 184 insertions(+), 228 deletions(-) diff --git a/SP__48.ASM b/SP__48.ASM index 76a53a8..76a08f5 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -346,155 +346,103 @@ L0090: SCF ; set the carry flag ; the word. The first is an inverted step-over byte. ;; TKN-TABLE -L0095: DC '?' - DC "RND" - DC "INKEY$" +L0095: + DC "?" + DC 'RND' + DC 'INKEY$' DC 'PI' DC 'FN' - DC "POINT" - DC "SCREEN$" - DC "ATTR" + DC 'POINT' + DC 'SCREEN$' + DC 'ATTR' DC 'AT' - DC "TAB" - DC "VAL$" - DC "CODE" - DC "VAL" - DC "LEN" - DC "SIN" - DC "COS" - DC "TAN" - DC "ASN" - DC "ACS" - DC "ATN" + DC 'TAB' + DC 'VAL$' + DC 'CODE' + DC 'VAL' + DC 'LEN' + DC 'SIN' + DC 'COS' + DC 'TAN' + DC 'ASN' + DC 'ACS' + DC 'ATN' DC 'LN' - DC "EXP" - DC "INT" - DC "SQR" - DC "SGN" - DC "ABS" - DC "PEEK" + DC 'EXP' + DC 'INT' + DC 'SQR' + DC 'SGN' + DC 'ABS' + DC 'PEEK' DC 'IN' - DC "USR" - DC "STR$" - DC "CHR$" - DC "NOT" - DC "BIN" + DC 'USR' + DC 'STR$' + DC 'CHR$' + DC 'NOT' + DC 'BIN' ; The previous 32 function-type words are printed without a leading space ; The following have a leading space if they begin with a letter - DEFB 'O','R'+$80 - DEFM "AN" - DEFB 'D'+$80 - DEFB $3C,'='+$80 ; <= - DEFB $3E,'='+$80 ; >= - DEFB $3C,$3E+$80 ; <> - DEFM "LIN" - DEFB 'E'+$80 - DEFM "THE" - DEFB 'N'+$80 - DEFB 'T','O'+$80 - DEFM "STE" - DEFB 'P'+$80 - DEFM "DEF F" - DEFB 'N'+$80 - DEFM "CA" - DEFB 'T'+$80 - DEFM "FORMA" - DEFB 'T'+$80 - DEFM "MOV" - DEFB 'E'+$80 - DEFM "ERAS" - DEFB 'E'+$80 - DEFM "OPEN " - DEFB '#'+$80 - DEFM "CLOSE " - DEFB '#'+$80 - DEFM "MERG" - DEFB 'E'+$80 - DEFM "VERIF" - DEFB 'Y'+$80 - DEFM "BEE" - DEFB 'P'+$80 - DEFM "CIRCL" - DEFB 'E'+$80 - DEFM "IN" - DEFB 'K'+$80 - DEFM "PAPE" - DEFB 'R'+$80 - DEFM "FLAS" - DEFB 'H'+$80 - DEFM "BRIGH" - DEFB 'T'+$80 - DEFM "INVERS" - DEFB 'E'+$80 - DEFM "OVE" - DEFB 'R'+$80 - DEFM "OU" - DEFB 'T'+$80 - DEFM "LPRIN" - DEFB 'T'+$80 - DEFM "LLIS" - DEFB 'T'+$80 - DEFM "STO" - DEFB 'P'+$80 - DEFM "REA" - DEFB 'D'+$80 - DEFM "DAT" - DEFB 'A'+$80 - DEFM "RESTOR" - DEFB 'E'+$80 - DEFM "NE" - DEFB 'W'+$80 - DEFM "BORDE" - DEFB 'R'+$80 - DEFM "CONTINU" - DEFB 'E'+$80 - DEFM "DI" - DEFB 'M'+$80 - DEFM "RE" - DEFB 'M'+$80 - DEFM "FO" - DEFB 'R'+$80 - DEFM "GO T" - DEFB 'O'+$80 - DEFM "GO SU" - DEFB 'B'+$80 - DEFM "INPU" - DEFB 'T'+$80 - DEFM "LOA" - DEFB 'D'+$80 - DEFM "LIS" - DEFB 'T'+$80 - DEFM "LE" - DEFB 'T'+$80 - DEFM "PAUS" - DEFB 'E'+$80 - DEFM "NEX" - DEFB 'T'+$80 - DEFM "POK" - DEFB 'E'+$80 - DEFM "PRIN" - DEFB 'T'+$80 - DEFM "PLO" - DEFB 'T'+$80 - DEFM "RU" - DEFB 'N'+$80 - DEFM "SAV" - DEFB 'E'+$80 - DEFM "RANDOMIZ" - DEFB 'E'+$80 - DEFB 'I','F'+$80 - DEFM "CL" - DEFB 'S'+$80 - DEFM "DRA" - DEFB 'W'+$80 - DEFM "CLEA" - DEFB 'R'+$80 - DEFM "RETUR" - DEFB 'N'+$80 - DEFM "COP" - DEFB 'Y'+$80 + DC "OR" + DC "AND" + DC "<=" + DC ">=" + DC "<>" + DC "LINE" + DC "THEN" + DC "TO" + DC "STEP" + DC "DEF FN" + DC "CAT" + DC "FORMAT" + DC "MOVE" + DC "ERASE" + DC "OPEN #" + DC "CLOSE #" + DC "MERGE" + DC "VERIFY" + DC "BEEP" + DC "CIRCLE" + DC "INK" + DC "PAPER" + DC "FLASH" + DC "BRIGHT" + DC "INVERSE" + DC "OVER" + DC "OUT" + DC "LPRINT" + DC "LLIST" + DC "STOP" + DC "READ" + DC "DATA" + DC "RESTORE" + DC "NEW" + DC "BORDER" + DC "CONTINUE" + DC "DIM" + DC "REM" + DC "FOR" + DC "GO TO" + DC "GO SUB" + DC "INPUT" + DC "LOAD" + DC "LIST" + DC "LET" + DC "PAUSE" + DC "NEXT" + DC "POKE" + DC "PRINT" + DC "PLOT" + DC "RUN" + DC "SAVE" + DC "RANDOMIZE" + DC "IF" + DC "CLS" + DC "DRAW" + DC "CLEAR" + DC "RETURN" + DC "COPY" ; ---------------- ; THE 'KEY' TABLES @@ -511,45 +459,45 @@ L0095: DC '?' ; the values obtained from this table. ;; MAIN-KEYS -L0205: DEFB $42 ; B - DEFB $48 ; H - DEFB $59 ; Y - DEFB $36 ; 6 - DEFB $35 ; 5 - DEFB $54 ; T - DEFB $47 ; G - DEFB $56 ; V - DEFB $4E ; N - DEFB $4A ; J - DEFB $55 ; U - DEFB $37 ; 7 - DEFB $34 ; 4 - DEFB $52 ; R - DEFB $46 ; F - DEFB $43 ; C - DEFB $4D ; M - DEFB $4B ; K - DEFB $49 ; I - DEFB $38 ; 8 - DEFB $33 ; 3 - DEFB $45 ; E - DEFB $44 ; D - DEFB $58 ; X +L0205: DEFB "B" + DEFB "H" + DEFB "Y" + DEFB "6" + DEFB "5" + DEFB "T" + DEFB "G" + DEFB "V" + DEFB "N" + DEFB "J" + DEFB "U" + DEFB "7" + DEFB "4" + DEFB "R" + DEFB "F" + DEFB "C" + DEFB "M" + DEFB "K" + DEFB "I" + DEFB "8" + DEFB "3" + DEFB "E" + DEFB "D" + DEFB "X" DEFB $0E ; SYMBOL SHIFT - DEFB $4C ; L - DEFB $4F ; O - DEFB $39 ; 9 - DEFB $32 ; 2 - DEFB $57 ; W - DEFB $53 ; S - DEFB $5A ; Z - DEFB $20 ; SPACE + DEFB "L" + DEFB "O" + DEFB "9" + DEFB "2" + DEFB "W" + DEFB "S" + DEFB "Z" + DEFB " " DEFB $0D ; ENTER - DEFB $50 ; P - DEFB $30 ; 0 - DEFB $31 ; 1 - DEFB $51 ; Q - DEFB $41 ; A + DEFB "P" + DEFB "0" + DEFB "1" + DEFB "Q" + DEFB "A" ;; E-UNSHIFT @@ -586,13 +534,13 @@ L022C: DEFB $E3 ; READ ;; EXT-SHIFT ; The 26 shifted extended mode keys for the alphabetic characters. ; The red keywords below keys on the original keyboard. -L0246: DEFB $7E ; ~ +L0246: DEFB '~' DEFB $DC ; BRIGHT DEFB $DA ; PAPER - DEFB $5C ; \ + DEFB '\' ; DEFB $B7 ; ATN - DEFB $7B ; { - DEFB $7D ; } + DEFB '{' + DEFB '}' DEFB $D8 ; CIRCLE DEFB $BF ; IN DEFB $AE ; VAL$ @@ -604,13 +552,13 @@ L0246: DEFB $7E ; ~ DEFB $7F ; (Copyright character) DEFB $B5 ; ASN DEFB $D6 ; VERIFY - DEFB $7C ; | + DEFB '|' DEFB $D5 ; MERGE - DEFB $5D ; ] + DEFB ']' DEFB $DB ; FLASH DEFB $B6 ; ACS DEFB $D9 ; INK - DEFB $5B ; [ + DEFB '[' DEFB $D7 ; BEEP @@ -634,31 +582,31 @@ L0260: DEFB $0C ; DELETE ; The ten single-character digit symbols are converted without the aid of ; a table using subtraction and minor manipulation. L026A: DEFB $E2 ; STOP - DEFB $2A ; * - DEFB $3F ; ? + DEFB '*' + DEFB '?' DEFB $CD ; STEP DEFB $C8 ; >= DEFB $CC ; TO DEFB $CB ; THEN - DEFB $5E ; ^ + DEFB '^' DEFB $AC ; AT - DEFB $2D ; - - DEFB $2B ; + - DEFB $3D ; = - DEFB $2E ; . - DEFB $2C ; , - DEFB $3B ; ; - DEFB $22 ; " + DEFB '-' + DEFB '+' + DEFB '=' + DEFB '.' + DEFB ',' + DEFB ';' + DEFB '"' DEFB $C7 ; <= - DEFB $3C ; < + DEFB '<' DEFB $C3 ; NOT - DEFB $3E ; > + DEFB '>' DEFB $C5 ; OR - DEFB $2F ; / + DEFB '/' DEFB $C9 ; <> DEFB $60 ; pound DEFB $C6 ; AND - DEFB $3A ; : + DEFB ':' ; : ;; E-DIGITS ; The ten keywords assigned to the digits in extended mode. @@ -19330,18 +19278,27 @@ L3C97: ; ║ дополнения для SP48 !! ║ ; ║ для перехода EXP-BAS48 ║ ; ║ 16 байт + 22 байта ║ -; ╚═══════════════════════════╝ -// LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 - LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 +; ╚═══════════════════════════╝ + ;!FIXIT сделать выбор страницы макросом с условиями компиляции, + ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него + //LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + ; JR JMP_EX BLOCK #3CF8-$,0 JMP_EX: PUSH HL PUSH AF -// LD A,ROM.BIOS ; переход в BIOS - LD A,ROM.EXPANSION ; переход в EXPANSION - OUT (CNF_PORT.ON),A + + //LD A,ROM.BIOS ; переход в BIOS + //LD A,ROM.EXPANSION ; переход в EXPANSION + + ;!FIXIT сделать выбор страницы макросом с условиями компиляции, + ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него + LD A,0 + OUT (CNF_PORT.ON),A + ; POP AF RET ; возврат ;< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <; diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index fb2ef9f..f4ec262 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -30,7 +30,7 @@ SR_MENU: DC 'TURBO ON ' DC 'Clear RAM' DC 'RETURN' - DC ' ' ; маркер конца + DC " " ; маркер конца SR_LEN EQU $-SR_MENU @@ -177,7 +177,7 @@ IS_MENU: DC 'Pentagon 512' DC 'Restart ' DC 'RETURN' - DC ' ' ; маркер конца + DC " " ; маркер конца .Size EQU $-IS_MENU ;****************************** diff --git a/ZX_EXP/TEST.ASM b/ZX_EXP/TEST.ASM index b08dd4d..4941bdb 100644 --- a/ZX_EXP/TEST.ASM +++ b/ZX_EXP/TEST.ASM @@ -277,9 +277,9 @@ ERR_TST_M: ;************************************** CALL_DOS_MOVE: - LD DE,5C00H-DOS_PROG_LEN + LD DE,DOS_PROG.Exec LD HL,DOS_PROG - LD BC,DOS_PROG_LEN + LD BC,DOS_PROG.Size LDIR RET ; @@ -295,34 +295,36 @@ CALL_DOS1: LD (5C63H),DE LD (5C65H),DE CALL CALL_DOS_MOVE - JP 5C00H-DOS_PROG_LEN + JP DOS_PROG.Exec CALL_DOS: PUSH HL PUSH DE PUSH BC PUSH AF CALL CALL_DOS_MOVE - LD A,13H - LD (5C00H-DOS_PROG_LEN+DOS_PROG_A),A + LD A,#13 ; #13 из AUTO_1303 + LD (DOS_PROG.Patch),A POP AF POP BC POP DE POP HL - JP 5C00H-DOS_PROG_LEN + JP DOS_PROG.Exec DOS_PROG: - PUSH AF - XOR A - OUT (SYS_PORT_OFF),A - POP AF - CALL 3D03H -DOS_PROG_A EQU $-DOS_PROG-1 - PUSH AF - LD A,0 - OUT (CNF_PORT),A - POP AF - RET -DOS_PROG_LEN EQU $-DOS_PROG + DISP #5C00 - DOS_PROG.Size ;!HARDCODE +.Exec: PUSH AF + XOR A + OUT (SYS_PORT_OFF),A + POP AF +.Patch+2: CALL #3D03 + PUSH AF + LD A,0 + OUT (CNF_PORT),A + POP AF + RET +.Size EQU $ - .Exec + ENT + CONT_PROG: LD HL,1AFDH @@ -334,7 +336,4 @@ CONT_PROG: LD A,0E8H LD (DE),A JP SW_ROM - - - - +; \ No newline at end of file From 7efecd4bb159566117cd1e72cbe6fc9fc0bc9585 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 21 Jun 2023 21:50:30 +1000 Subject: [PATCH 003/114] adaptation to new bios --- SP_128.ASM | 2 +- SP_TRDOS.ASM | 3 + ZX_EXP.ASM | 2 +- ZX_EXP2.ASM | 7 +- inc/char_codes.inc | 203 --------------------------------------------- 5 files changed, 10 insertions(+), 207 deletions(-) delete mode 100644 inc/char_codes.inc diff --git a/SP_128.ASM b/SP_128.ASM index 117d2df..b5ed6bb 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -693,7 +693,7 @@ CHAR_SET EQU #3D00 DEFINE START_PAUSE #0000 INCLUDE 'shared_includes/constants/sp2000.inc' - INCLUDE 'inc/char_codes.inc' + INCLUDE 'shared_includes/constants/zx_char_codes.inc' ;[^]..................................................................................................................... SP2000 [^] ; ----------------------- diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 2b35ae2..d048caf 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6509,6 +6509,9 @@ AUTO_3CFD: JP REDIR_3D13 ; JP AUTO_283C +;***********************************************************************; + BLOCK #3D00-$,FF + AUTO_3D00: NOP JR AUTO_3D31 diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index eb08e87..7ddb0e7 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -14,7 +14,7 @@ SPRIN2 EQU 2 ; 1 - ; 2 - включение Sprinter-2 первой прошивкой INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. - INCLUDE 'INC/CHAR_CODES.INC' + INCLUDE 'shared_includes/constants/zx_char_codes.inc' PORT_JOI EQU 0FFh ;****************************** diff --git a/ZX_EXP2.ASM b/ZX_EXP2.ASM index 394d614..c4a35c8 100644 --- a/ZX_EXP2.ASM +++ b/ZX_EXP2.ASM @@ -23,7 +23,7 @@ START: ;*************************** BLOCK #100-$,255 - INCLUDE 'EXP/EXP_HDD.ASM' + INCLUDE 'ZX_EXP/EXP_HDD.ASM' ; INCLUDE 'EXP_KBD.ASZ' ;GLOBAL_RESET: @@ -63,7 +63,10 @@ SND_TEST_RET: HD_EXP_RET: PUSH AF LD A,D_ROM16OFF - OUT (SYS_PORT_ON),A + ;!TEST + ;OUT (SYS_PORT_ON),A + OUT (CNF_PORT),A + ; JP HD_EXP_EXE BLOCK #3FF0-$,255 diff --git a/inc/char_codes.inc b/inc/char_codes.inc deleted file mode 100644 index 4d8c5c7..0000000 --- a/inc/char_codes.inc +++ /dev/null @@ -1,203 +0,0 @@ -; ZX Spectrum char codes -; By Marcos Cruz (programandala.net) - -; --------------------------------------------------------------------- -; Characters (new format) -ZX_Char: -; Not used equ 0x00 -; Not used equ 0x01 -; Not used equ 0x02 -; Not used equ 0x03 -; Not used equ 0x04 -; Not used equ 0x05 -.caps equ 0x06 ; toggle caps lock -.print_comma equ 0x06 ; (when printed) -.edit equ 0x07 ; edit -.esc equ 0x07 ; escape -.cursor_left equ 0x08 -.backspace equ 0x08 -.right equ 0x09 ; cursor right -.cursor_down equ 0x0A -.cursor_up equ 0x0B -.delete_left equ 0x0C ; delete (backspace) -.form_feed equ 0x0C ; used for printing -.carriage_return equ 0x0D ; enter key -.extended_mode equ 0x0E ; -.number equ 0x0E ; -.graphics equ 0x0F ; toggle graphics mode -.ink equ 0x10 -.paper equ 0x11 -.flash equ 0x12 -.bright equ 0x13 -.inverse equ 0x14 -.over equ 0x15 -.at equ 0x16 -.tab equ 0x17 ; tab (screen only) -; Not used equ 0x18 -; Not used equ 0x19 -; Not used equ 0x1A -; Not used equ 0x1B -; Not used equ 0x1C -; Not used equ 0x1D -; Not used equ 0x1E -; Not used equ 0x1F -.space equ 0x20 - -; Standart symbols -; #21 ! #22 " #23 # #24 $ #25 % #26 & #27 , #28 ( -; #29 ) #2A * #2B + #2C , #2D - #2F . #2F / #30 0 -; #31 1 #32 2 #33 3 #34 4 #35 5 #36 6 #37 7 #38 8 -; #39 9 #3A : #3B ; #3C < #3D = #3E > #3F ? #40 @ -; #41 A #42 B #43 C #44 D #45 E #46 F #47 G #48 H -; #49 I #4A J #4B K #4C L #4D M #4E N #4F O #50 P -; #51 Q #52 R #53 S #54 T #55 U #56 V #57 W #58 X -; #59 Y #5A Z #5B [ #5C / #5D ] #5E ^ #5F _ #60 ? -; #61 a #62 b #63 c #64 d #65 e #66 f #67 g #68 h -; #69 i #6A j #6B k #6C l #6D m #6E n #6F o #70 p -; #71 q #72 r #73 s #74 t #75 u #76 v #77 w #78 x -; #79 y #7A z #7B { #7C | #7D } #7E ~ -.copyright equ 0x7F ; copyright sign - -; --------------------------------------------------------------------- -; User Defined Graphics -; 0 1 2 3 4 5 6 7 -;| | | #| |# | |# #| | | | #| |# | |# #| -;| | | | | | | | | #| | #| | #| | #| -; 8 9 A B C D E F -;| | | #| |# | |# #| | | | #| |# | |# #| -;|# | |# | |# | |# | |# #| |# #| |# #| |# #| -ZX_UDG: -.block_0 equ 0x80 -.block_1 equ 0x81 -.block_2 equ 0x82 -.block_3 equ 0x83 -.block_4 equ 0x84 -.block_5 equ 0x85 -.block_6 equ 0x86 -.block_7 equ 0x87 -.block_8 equ 0x88 -.block_9 equ 0x89 -.block_A equ 0x8A -.block_B equ 0x8B -.block_C equ 0x8C -.block_D equ 0x8D -.block_E equ 0x8E -.block_F equ 0x8F -.a equ 0x90 -.b equ 0x91 -.c equ 0x92 -.d equ 0x93 -.e equ 0x94 -.f equ 0x95 -.g equ 0x96 -.h equ 0x97 -.i equ 0x98 -.j equ 0x99 -.k equ 0x9A -.l equ 0x9B -.m equ 0x9C -.n equ 0x9D -.o equ 0x9E -.p equ 0x9F -.q equ 0xA0 -.r equ 0xA1 -.s equ 0xA2 -.t equ 0xA3 ; token SPECTRUM in 128 basic -.u equ 0xA4 ; token PLAY in 128 basic -; --------------------------------------------------------------------- -; Tokens -ZX_Token -.spectrum equ 0xA3 ; UDG T in 48 basic -.play equ 0xA4 ; UDG U in 48 basic -.rnd equ 0xA5 -.inkey_dollar equ 0xA6 -.pi equ 0xA7 -.fn equ 0xA8 -.point equ 0xA9 -.screen_dollar equ 0xAA -.attr equ 0xAB -.at equ 0xAC -.tab equ 0xAD -.val_dollar equ 0xAE -.code equ 0xAF -.val equ 0xB0 -.len equ 0xB1 -.sin equ 0xB2 -.cos equ 0xB3 -.tan equ 0xB4 -.asn equ 0xB5 -.acs equ 0xB6 -.atn equ 0xB7 -.ln equ 0xB8 -.exp equ 0xB9 -.int equ 0xBA -.sqr equ 0xBB -.sgn equ 0xBC -.abs equ 0xBD -.peek equ 0xBE -.in equ 0xBF -.usr equ 0xC0 -.str_dollar equ 0xC1 -.chr_dollar equ 0xC2 -.not equ 0xC3 -.bin equ 0xC4 -.or equ 0xC5 -.and equ 0xC6 -.less_or_equal equ 0xC7 -.greater_or_equal equ 0xC8 -.not_equal equ 0xC9 -.line equ 0xCA -.then equ 0xCB -.to equ 0xCC -.step equ 0xCD -.def_fn equ 0xCE -.cat equ 0xCF -.format equ 0xD0 -.move equ 0xD1 -.erase equ 0xD2 -.open_channel equ 0xD3 -.close_channel equ 0xD4 -.merge equ 0xD5 -.verify equ 0xD6 -.beep equ 0xD7 -.circle equ 0xD8 -.ink equ 0xD9 -.paper equ 0xDA -.flash equ 0xDB -.bright equ 0xDC -.inverse equ 0xDD -.over equ 0xDE -.out equ 0xDF -.lprint equ 0xE0 -.llist equ 0xE1 -.stop equ 0xE2 -.read equ 0xE3 -.data equ 0xE4 -.restore equ 0xE5 -.new equ 0xE6 -.border equ 0xE7 -.continue equ 0xE8 -.dim equ 0xE9 -.rem equ 0xEA -.for equ 0xEB -.go_to equ 0xEC -.go_sub equ 0xED -.input equ 0xEE -.load equ 0xEF -.list equ 0xF0 -.let equ 0xF1 -.pause equ 0xF2 -.next equ 0xF3 -.poke equ 0xF4 -.print equ 0xF5 -.plot equ 0xF6 -.run equ 0xF7 -.save equ 0xF8 -.randomize equ 0xF9 -.if equ 0xFA -.cls equ 0xFB -.draw equ 0xFC -.clear equ 0xFD -.return equ 0xFE -.copy equ 0xFF -; --------------------------------------------------------------------- \ No newline at end of file From 8a235fe82068752f34e678a86a1927f5dccbc688 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 21 Jun 2023 21:53:12 +1000 Subject: [PATCH 004/114] shared update --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 1b5b9e9..443b74c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 1b5b9e9293232aa9db06065d59a0099a320b43b6 +Subproject commit 443b74c15de8cea63ca89aa89bbb6d60407dc5d0 From 228f513fe83a5b402a99a995f99d539a5ffdb17f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 22 Jun 2023 04:40:19 +1000 Subject: [PATCH 005/114] testing adaptation for bios --- SP_128.ASM | 2 +- SP_TRDOS.ASM | 42 ++++++++++++++------------ SP__48.ASM | 10 ++++--- ZX_EXP.ASM | 74 ++++++++++++++++++++++++---------------------- ZX_EXP/SERVICE.ASM | 2 +- ZX_EXP2.ASM | 30 +++++++++++-------- 6 files changed, 87 insertions(+), 73 deletions(-) diff --git a/SP_128.ASM b/SP_128.ASM index b5ed6bb..5b7c2f2 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -691,7 +691,7 @@ CHAR_SET EQU #3D00 DEFW adr ENDM - DEFINE START_PAUSE #0000 + DEFINE START_PAUSE #0001 INCLUDE 'shared_includes/constants/sp2000.inc' INCLUDE 'shared_includes/constants/zx_char_codes.inc' ;[^]..................................................................................................................... SP2000 [^] diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index d048caf..a11acc9 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6375,43 +6375,48 @@ RUS_PRINT: DISPLAY "14k" BLOCK #3C00 - $,255 - -;********************************************* - AUTO_3C00: RST R38 JR AUTO_3C06 RST R38 JR AUTO_3C09 +; +; + BLOCK #3C06 - $,255 AUTO_3C06: JP AUTO_3D00 +; +; + BLOCK #3C09 - $,255 AUTO_3C09: JP AUTO_3D03 -;***************************** +;************************************ +;!FIXIT not used BLOCK #3C10 - $,255 ;KBD_EXP: LD A,D_ROM16OFF OUT (CNF_PORT),A RET - NOP - NOP - NOP +; +;************************************ +;!FIXIT not used + BLOCK #3C18 - $,255 ;KBD_OFF: LD A,D_ROM16OFF OUT (CNF_PORT),A RET - NOP - NOP - NOP + ;************************************ +;!FIXIT not used + BLOCK #3C20 - $,255 READR_X: - CALL 3E08h + CALL get_disk_time: LD B,A - JP 1FEBh - + JP set_side_0 +;************************************ +;!FIXIT not used BLOCK #3C30 - $,255 - IN A,(WG_COM) RET @@ -6452,7 +6457,6 @@ PRINT_RED: RET ;******************************* - BLOCK #3CC0 - $,255 MAGIC_1: PUSH AF @@ -6460,6 +6464,8 @@ MAGIC_1: OUT (CNF_PORT),A POP AF JP MAGIC_2 +;******************************* + BLOCK #3CC9 - $,255 MAGIC_3: PUSH AF LD A,D_ROM16OFF @@ -6510,7 +6516,7 @@ AUTO_3CFD: ; JP AUTO_283C ;***********************************************************************; - BLOCK #3D00-$,FF + BLOCK #3D00-$,#FF AUTO_3D00: NOP @@ -7010,9 +7016,7 @@ AUTO_3FEC: ;****************************************** BLOCK #3FF0-$, #FF - -HD_CMD: - PUSH AF +HD_CMD: PUSH AF DI LD A,D_ROM16ON OUT (SYS_PORT_ON),A diff --git a/SP__48.ASM b/SP__48.ASM index 76a08f5..dc3f4e6 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19282,8 +19282,8 @@ L3C97: ; ╚═══════════════════════════╝ ;!FIXIT сделать выбор страницы макросом с условиями компиляции, ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него - //LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 - LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + //LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 ; JR JMP_EX @@ -19296,8 +19296,10 @@ JMP_EX: PUSH HL ;!FIXIT сделать выбор страницы макросом с условиями компиляции, ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него - LD A,0 - OUT (CNF_PORT.ON),A + //LD A,0 + //OUT (CNF_PORT.ON),A + LD A,ROM.EXTENSION + OUT (SYS_PORT.ROM),A ; POP AF RET ; возврат diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index 7ddb0e7..817f254 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -204,39 +204,41 @@ REST_LOOP: RESTART_TXT_L EQU $-RESTART_TXT ;********************************** + BLOCK #100 - $,255 +; Выполняется с адреса #C000 SETUP_TXT: - LD A,CNF_0+D_ROM16ON OUT (CNF_PORT),A - LD HL,1000H - LD DE,8000H - LD BC,3000H + LD HL,#1000 + LD DE,#8000 + LD BC,#3000 LDIR LD A,CNF_0+D_ROM16OFF OUT (CNF_PORT),A - LD HL,08005H + LD HL,#8005 - LD A,0FEh - LD BC,204Eh + LD A,#FE + LD BC,#204E ;ALL_MODE OUT (C),A - LD A,7FH - IN A,(0FEH) + LD A,#7F + IN A,(#FE) CPL AND 1 EX AF,AF' - LD A,0FFh + LD A,#FF OUT (C),A EX AF,AF' JP (HL) - SETUP_TXT_LEN EQU $-SETUP_TXT +;********************************** + SYSTEM_ID_TXT: DB "NEW_BIOS" @@ -704,19 +706,19 @@ ELSE LD BC,204Eh ; system_port OUT (C),A - LD SP,0BFFFH + LD SP,#BFFF LD HL,L_PENTAGON CALL SINC_DEF - LD SP,0BFFFH + LD SP,#BFFF LD HL,L_PENTAGON CALL SINC_DEF LD HL,SETUP_TXT - LD DE,0C000H + LD DE,#C000 LD BC,SETUP_TXT_LEN LDIR - CALL 0C000H + CALL #C000 JP NO_SETUP_1 GOTO_SPEC: @@ -743,7 +745,7 @@ NO_SETUP_1: OUT (C),A SND_TEST_RET: - LD SP,0BFFFH + LD SP,#BFFF LD HL,L_PENTAGON CALL SINC_DEF @@ -1396,8 +1398,9 @@ LOOP_EQ: ; OUT (LPT1_D),A RET +; ;********************************************** -; DSS 3C10h,255 +; BLOCK #3C10 - $,255 ;KBD_RET: ; LD A,D_ROM16OFF ; OUT (SYS_PORT_OFF),A @@ -1422,10 +1425,10 @@ LOOP_EQ: ; ; CALL KBD_OFF ; CALL DOS_ON ; JR KBD_RET2 - ;****************************************************** - BLOCK 3CC0h - $,255 +;****************************************************** + BLOCK #3CC0 - $,255 MAGIC_1: ; ЗАГЛУШКА ДЛЯ MAGIC PUSH AF LD A,D_ROM16OFF @@ -1701,43 +1704,44 @@ kbd_loop2: AND A RET - - BLOCK 3FD0H - $,0 +;***********************************************************************; +;!FIXIT not used + BLOCK #3FD0 - $,0 FN1_RET: PUSH AF LD A,D_ROM16ON OUT (CNF_PORT),A POP AF - RST 18H + RST #18 JR FN1_RET -;****************************************** - BLOCK 3FE0H - $,255 - +;***********************************************************************; +;!FIXIT not used + BLOCK #3FE0 - $,255 SOUND_TEST: LD A,D_ROM16ON ; AROM16 = 1 OUT (CNF_PORT),A JP SND_TEST_RET - - BLOCK 3FE8H - $,255 -HDD_EXE: + +;***********************************************************************; + BLOCK #3FE8 - $,255 EXP_HDD: PUSH AF - LD A,D_ROM16ON ;!FIXIT придумать названия меткам + LD A,D_ROM16ON OUT (CNF_PORT),A POP AF RET - - BLOCK 3FF0H-$,255 - - BLOCK 3FF8H-$,255 +;***********************************************************************; + BLOCK #3FF0-$,255 +;***********************************************************************; + BLOCK #3FF8-$,255 EXP_FNS_RET: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A JP EXP_FNS -;****************************************** - BLOCK 4000h-$,255 +;***********************************************************************; + BLOCK #4000-$,255 ; diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index f4ec262..8b8b48f 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -691,7 +691,7 @@ UTILIT: CALL DOS_ON LD A,0 ; DETECT_HDD - CALL HDD_EXE + CALL EXP_HDD CALL DOS_OFF JR C,DISK_UTILIT diff --git a/ZX_EXP2.ASM b/ZX_EXP2.ASM index c4a35c8..37e1e0a 100644 --- a/ZX_EXP2.ASM +++ b/ZX_EXP2.ASM @@ -4,24 +4,24 @@ ORG 0 INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. -;****************************** -; ***** BEGIN EXPANSION ***** -;****************************** + ; *************************** + ; ***** BEGIN EXPANSION ***** + ; *************************** START: DI HALT -;*************************** +;***********************************************************************; BLOCK #10-$,255 RET -;*************************** +;***********************************************************************; BLOCK #38-$,255 EI RETI -;*************************** +;***********************************************************************; BLOCK #66-$,#C9 RETN -;*************************** +;***********************************************************************; BLOCK #100-$,255 INCLUDE 'ZX_EXP/EXP_HDD.ASM' ; INCLUDE 'EXP_KBD.ASZ' @@ -38,9 +38,8 @@ START: ; PUSH HL ; DI ; RET - +;***********************************************************************; BLOCK #3FD0-$,255 - PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_ON),A @@ -48,17 +47,20 @@ START: HD_CMD_XR_RET: RET +;***********************************************************************; + BLOCK #3FD7-$,255 HD_CMD_XR: JP HD_CMD -;************************ +;***********************************************************************; +;!FIXIT not used BLOCK #3FE0-$,255 SND_TEST_RET: LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A JP SND_TEST_RET -;*************************** +;***********************************************************************; BLOCK #3FE8-$,255 HD_EXP_RET: PUSH AF @@ -69,8 +71,8 @@ HD_EXP_RET: ; JP HD_EXP_EXE +;***********************************************************************; BLOCK #3FF0-$,255 - HD_DOS_RET: PUSH AF DI @@ -78,13 +80,15 @@ HD_DOS_RET: OUT (SYS_PORT_OFF),A JR HD_CMD_XR +;***********************************************************************; + BLOCK #3FF8-$,255 EXP_FNS_RET: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A JP HD_CMD_XR_RET -;****************************************** +;***********************************************************************; BLOCK #4000-$,255 ; ; From eb37c13a605b5754dda276920cabfc071a91348a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 23 Jun 2023 00:55:53 +1000 Subject: [PATCH 006/114] =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B4=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=83=20=D1=81=20=D0=B1=D0=B8=D0=BE=D1=81=D0=BE?= =?UTF-8?q?=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_128.ASM | 19 +++++++++++-------- SP__48.ASM | 6 ------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/SP_128.ASM b/SP_128.ASM index 5b7c2f2..0480f7b 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -876,9 +876,9 @@ NMI_POINT: ; BLOCK #6B-$,0 -; ============ -; RAM ROUTINES -; ============ +; ============ +; RAM ROUTINES +; ============ ; The following code will be copied to locations #5B00 to #5B57, within the old ZX Printer buffer. ; ----------------- @@ -922,6 +922,7 @@ NMI_POINT: ; ENT ;SWAP_ROM +RAM_ROUTINES: L006B: PUSH AF ; Save AF and BC. PUSH BC ; LD BC,#7FFD ; @@ -1012,7 +1013,9 @@ L00B5: EX AF,AF' ; Save AF registers. For a read, A holds the byte read OUT (C),A ; Switch back to original paging configuration. EI ; EX AF,AF' ; Restore AF registers. For a read, A holds the byte read and the flags the success status. - RET ; <<< End of RAM Routines >>> + RET +RAM_ROUTINES.Size EQU $-RAM_ROUTINES +;<<<<<<<<<<<<<<<<<<<<<<<<< End of RAM Routines >>>>>>>>>>>>>>>>>>>>>>>>>; ; =============================== @@ -1142,10 +1145,10 @@ L0137: LD B,D ; Complete setting up the sound chip registers. LD A,#FF ; Disable AY-3-8912 sound channels. OUT (C),A ; - LD DE,SWAP_ROM ; #5B00. Copy the various paging routines to the old printer buffer. - LD HL,L006B ; The source is in this ROM. - LD BC,L006B.Size; There are eighty eight bytes to copy. - LDIR ; Copy the block of bytes. + LD DE,SWAP_ROM ; #5B00. Copy the various paging routines to the old printer buffer. + LD HL,RAM_ROUTINES ; The source is in this ROM. + LD BC,RAM_ROUTINES.Size ; There are eighty eight bytes to copy. + LDIR ; Copy the block of bytes. LD A,#CF ; Load A with the code for the Z80 instruction 'RST #08'. LD (RAMRST),A ; #5B5D. Insert into new System Variable RAMRST. diff --git a/SP__48.ASM b/SP__48.ASM index dc3f4e6..8c9301e 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -18971,17 +18971,14 @@ L3B3B: BIT 4,(IY+$01) ; FLAGS 3 - In 128K mode? JR NZ,L3B46 ; NZ=128K mode ; In 48K mode - XOR A ; Replicate code from standard ROM that the patch over-wrote LD DE,$1536 RET ; In 128K mode - L3B46: LD HL,$010F ; Vector table entry in Editor ROM -> JP $03A2 ; Return to Editor ROM at address in HL - L3B49: EX (SP),HL ; Change the return address JP $5B00 ; Page Editor ROM and return to the address on the stack @@ -18993,12 +18990,10 @@ L3B4D: BIT 4,(IY+$01) ; In 128K mode? JR NZ,L3B58 ; NZ=128K mode ; In 48K mode - BIT 7,(IY+$0A) ; replicate code from standard ROM that the patch over-wrote RET ; In 128K mode - L3B58: LD HL,$0112 ; Handle in Editor ROM by jumping to Vector table entry in Editor ROM -> JP #182A JR L3B49 @@ -19010,7 +19005,6 @@ L3B5D: BIT 4,(IY+$01) ; In 128K mode? JR NZ,L3B67 ; NZ=128K mode ; In 48K mode - RST 18H ; replicate code from standard ROM that the patch over-wrote CP $0D RET From b2623d1cd940950c62e71ed53534f36a673f1715 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Jun 2023 05:50:08 +1000 Subject: [PATCH 007/114] No need EXP and EXP2 --- SP_TRDOS.ASM | 33 ++++++++++++++++++--------------- ZX_EXP.ASM | 22 +++++++++++----------- ZX_EXP2.ASM | 23 ++++++++++++----------- 3 files changed, 41 insertions(+), 37 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index a11acc9..b5105f3 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6503,18 +6503,16 @@ REDIR_3D13: RES 6,C JP HD_CMD ;#3FF0 ROM. DI - BLOCK #3CFA - $,255 - ;***************************** - + BLOCK #3CFA - $,255 AUTO_3CFA: JP xchg_intf1 ;****** 3D13 redirection ****** + BLOCK #3CFD - $,255 AUTO_3CFD: JP REDIR_3D13 ; JP AUTO_283C - ;***********************************************************************; BLOCK #3D00-$,#FF @@ -6535,6 +6533,7 @@ AUTO_3D0E: NOP JR AUTO_3CFA ;****** 3D13 point !!! **** + BLOCK #3D13-$,#FF NOP JR AUTO_3CFD AUTO_3D16: @@ -6562,8 +6561,8 @@ AUTO_3D31: JP EDIT_X05 AUTO_3D38: XOR A - OUT (#F7),A ;????? - IN A,(#F7) ;????? + OUT (#F7),A ;проверка ИнтерфейсАДЫН))) + IN A,(#F7) CP 30 JR Z,AUTO_3D44 CP 31 @@ -6579,7 +6578,7 @@ AUTO_3D44: AUTO_3D4C: XOR A OUT (P_DOS_FF),A - IN A,(#F6) ;????? + IN A,(#F6) LD HL,AUTO_3D38 LD DE,MEM_BOT LD BC,AUTO_3D38.Size + AUTO_3D44.Size @@ -6622,7 +6621,7 @@ PRINT_SYM: RST R38 AUTO_3D94: RST RST20 - DW 00010H + DW #0010 ;!HARDCODE RET AUTO_3D98: LD A,8 @@ -6631,11 +6630,11 @@ WG93_EXE: AUTO_3D9C: PUSH HL RST RST20 - DW 01F54H + DW #1F54 ;!HARDCODE ;RET_1F54: JR C,AUTO_3DA5 RST RST20 - DW 01B7BH + DW #1B7B ;!HARDCODE AUTO_3DA5: POP HL IN A,(P_DOS_FF) @@ -7014,7 +7013,8 @@ AUTO_3FEC: ;****************************************** -;****************************************** +;!FIXIT Можно поправить номера функций при вызовах API и прыгать сразу в BIOS через #3FF8 +;-------[ From TR-DOS to API 4x ]------- BLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI @@ -7022,10 +7022,10 @@ HD_CMD: PUSH AF OUT (SYS_PORT_ON),A POP AF RET -;****************************************** +;--------------------------------------- - -;****************************************** +; +;----[ From API #80..#FF to TR-DOS ]----- BLOCK #3FF8-$, #FF EXP_FNS: PUSH AF @@ -7034,7 +7034,10 @@ EXP_FNS: OUT (SYS_PORT_ON),A POP AF RET -;****************************************** +;--------------------------------------- +; + +; BLOCK #4000-$, #FF DISPLAY "16k..ALL!" ; diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index 817f254..839670d 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -1707,21 +1707,21 @@ kbd_loop2: ;***********************************************************************; ;!FIXIT not used BLOCK #3FD0 - $,0 -FN1_RET: - PUSH AF - LD A,D_ROM16ON - OUT (CNF_PORT),A - POP AF - RST #18 - JR FN1_RET +; FN1_RET: +; PUSH AF +; LD A,D_ROM16ON +; OUT (CNF_PORT),A +; POP AF +; RST #18 +; JR FN1_RET ;***********************************************************************; ;!FIXIT not used BLOCK #3FE0 - $,255 -SOUND_TEST: - LD A,D_ROM16ON ; AROM16 = 1 - OUT (CNF_PORT),A - JP SND_TEST_RET +; SOUND_TEST: +; LD A,D_ROM16ON ; AROM16 = 1 +; OUT (CNF_PORT),A +; JP SND_TEST_RET ;***********************************************************************; BLOCK #3FE8 - $,255 diff --git a/ZX_EXP2.ASM b/ZX_EXP2.ASM index 37e1e0a..ac79c80 100644 --- a/ZX_EXP2.ASM +++ b/ZX_EXP2.ASM @@ -40,12 +40,12 @@ START: ; RET ;***********************************************************************; BLOCK #3FD0-$,255 - PUSH AF - LD A,D_ROM16OFF - OUT (SYS_PORT_ON),A - POP AF -HD_CMD_XR_RET: - RET +; PUSH AF +; LD A,D_ROM16OFF +; OUT (SYS_PORT_ON),A +; POP AF +; HD_CMD_XR_RET: +; RET ;***********************************************************************; BLOCK #3FD7-$,255 @@ -55,10 +55,10 @@ HD_CMD_XR: ;***********************************************************************; ;!FIXIT not used BLOCK #3FE0-$,255 -SND_TEST_RET: - LD A,D_ROM16OFF - OUT (SYS_PORT_OFF),A - JP SND_TEST_RET +; SND_TEST_RET: +; LD A,D_ROM16OFF +; OUT (SYS_PORT_OFF),A +; JP SND_TEST_RET ;***********************************************************************; BLOCK #3FE8-$,255 @@ -86,7 +86,8 @@ EXP_FNS_RET: PUSH AF LD A,D_ROM16OFF OUT (SYS_PORT_OFF),A - JP HD_CMD_XR_RET + //JP HD_CMD_XR_RET + RET ;***********************************************************************; BLOCK #4000-$,255 From 53c775b2f6e8a5f7446f12d5241d23105989f381 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 25 Jun 2023 05:25:47 +1000 Subject: [PATCH 008/114] renaming references --- Shared_Includes | 2 +- ZX_EXP/EXP_HDD.ASM | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 443b74c..81f727c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 443b74c15de8cea63ca89aa89bbb6d60407dc5d0 +Subproject commit 81f727ca6ecd8fcaaac4f4e573fe1fd6578c1efa diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index 24d029c..4de9717 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -636,11 +636,11 @@ HD_CALC_LOOP2: FN_HDD_PART: POP AF BIT 0,A - LD A,#21 ; !HARDCODE + LD A,IDE.Chanel.Primary JR Z,.SET_CH - LD A,#01 ; !HARDCODE + LD A,IDE.Chanel.Secondary .SET_CH: - OUT (#BC),A ; !HARDCODE IDE.Chanel.Choose + OUT (IDE.Chanel.Set),A RET ; DB 'HDD_DRV_END' From cc2f5ec57be6cc539f588ef62db2137c2b19ac7a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 26 Jun 2023 02:54:36 +1000 Subject: [PATCH 009/114] some refactoring --- SP_TRDOS.ASM | 1 + Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 15 +++++++-------- TRDOS/TR_MSD_3.ASZ | 8 ++++---- TRDOS/TR_MSD_S.ASZ | 4 ++-- TRDOS/TR_RMD_S.ASZ | 20 ++++++++++---------- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b5105f3..cf9b774 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -3,6 +3,7 @@ ;╟────────────────────────────┴─────────────────────────────╢ ;║ RE-SOURCE'd by Z80MU PROFESSIONAL version 5.2b ║ ;╚══════════════════════════════════════════════════════════╝ +;!TODO использовать внешние порты #E0 и #E3 для сохранения регистров при перехвате всяких #3D2F DEVICE ZXSPECTRUM128 ORG 0 diff --git a/Shared_Includes b/Shared_Includes index 81f727c..fc7af6f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 81f727ca6ecd8fcaaac4f4e573fe1fd6578c1efa +Subproject commit fc7af6fc40d61e9f8e626b39a8423d29a955afb2 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 5677375..88e5175 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -261,8 +261,7 @@ CMD_EXE1: LD L,A CALL JP_HL JP AUTO_03E1 -JP_HL: - JP (HL) +JP_HL: JP (HL) NEXT_WORD: INC HL @@ -568,8 +567,8 @@ WORDS: ; CALL EXP_FNS ; RET AY8910: - LD A,0EAH - LD C,0F3H + LD A,#EA + LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL CALL EXP_FNS EI CALL AUTO_1D97 @@ -579,17 +578,17 @@ AY8910: SPR_1: LD A,(DE) INC DE - CP 20H + CP #20 JR Z,SPR_1 CP "1" - LD C,0F0H + LD C,#F0 ;!HARDCODE BIOS.RST_CONF.SP97_1 JR Z,SP_1 CP "2" SCF RET NZ - LD C,0F1H + LD C,#F1 ;!HARDCODE BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) - CP 21H + CP #21 CCF RET C CALL EXP_FNS diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 4cc80f0..a2de075 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,6 +1,6 @@ INIT_RMD: - LD C,9FH + LD C,#9F ;!HARDCODE BIOS.FullInit CALL EXP_FNS EI RET @@ -57,11 +57,11 @@ TB_ONOFF: CP 'f' JR Z,TB_OFF_EXE TB_ON_EXE: - LD C,8Fh + LD C,#8F ;!HARDCODE BIOS.FN_TURBO LD A,4 JP EXP_FNS TB_OFF_EXE: - LD C,8Fh + LD C,#8F ;!HARDCODE BIOS.FN_TURBO LD A,3 JP EXP_FNS ; @@ -267,7 +267,7 @@ SKEEP_XX1: ;***************************************** MADE_next_blk: PUSH BC - LD C,95h + LD C,#95 ;!HARDCODE BIOS.GetMemPageNext (#C7) CALL EXP_FNS POP BC INC L ; SET ZF, if END BLK !!! diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index bb1fed1..c101509 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -24,7 +24,7 @@ HDD_REDIR: MSD_R_W_UT: PUSH AF CALL DISK_REDIR - CP 40H + CP #40 JR NC,HDD_REDIR POP AF EX AF,AF' @@ -417,7 +417,7 @@ SET_1440: READ_BPB: CALL DISK_REDIR - CP 40H + CP #40 JR NC,HDD_REDIR2 CP 4 JP NC,ERROR_MSDOS diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index ef8d6b2..d4c67de 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -3,7 +3,7 @@ DISK_REDIR: PUSH BC LD A,(OPER_DISK) AND 3 - LD C,0CFH + LD C,#CF ;!HARDCODE BIOS.GET_DRV_ST CALL EXP_FNS EI POP BC @@ -40,7 +40,7 @@ RECALL_MSD: TEST_RAMD: PUSH HL - LD C,0CEH + LD C,#CE ;!HARDCODE BIOS.GET_RAMD_ST CALL EXP_FNS EI POP HL @@ -266,14 +266,14 @@ PAGE_CALC2: RRCA RRCA LD D,A - AND 0F0H + AND #F0 OR E LD E,A LD A,D - AND 0FH + AND #0F LD D,A PUSH HL - LD C,98h + LD C,#98 ;!HARDCODE BIOS.RAMD_CALC_PAGE CALL DISK_REDIR SUB 4 CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk @@ -392,7 +392,7 @@ CLEAR_RMD_A: PUSH HL PUSH DE PUSH BC - LD C,93h ; очистка RAM-Disk + LD C,#93 ;!HARDCODE BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию EI POP BC @@ -403,7 +403,7 @@ CLEAR_RMD_A: ;********************************************************* GET_RMD_A: GET_RAM_BLK: ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk - LD C,92h + LD C,#92 ;!HARDCODE BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока EI RET NC @@ -419,7 +419,7 @@ READ_ONLY: FDD_SET: LD A,(OPER_DISK) LD B,A - LD C,0CCH + LD C,#CC ;!HARDCODE BIOS.FDD_TO_DRV CALL EXP_FNS EI RET @@ -432,7 +432,7 @@ HDD_SET: LD A,(OPER_DISK) LD B,A LD A,0 - LD C,0CDH + LD C,#CD ;!HARDCODE BIOS.HDD_TO_DRV CALL EXP_FNS EI RET @@ -445,7 +445,7 @@ RAMD_SET1: LD A,(OPER_DISK) LD B,A POP AF - LD C,0CBH + LD C,#CB ;!HARDCODE BIOS.RAMD_TO_DRV CALL EXP_FNS EI RET From b7a39665e211b85365da5b36943bc09a7bafabd7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 27 Jun 2023 01:29:58 +1000 Subject: [PATCH 010/114] profROM --- ProfRom_Disasm/!AllConst.asm | 226 + ProfRom_Disasm/!RomDisk.asm | 50 + ProfRom_Disasm/!ram8.asm | 1248 +++ ProfRom_Disasm/!roms.mac | 56 + ProfRom_Disasm/ROM_MAP.TXT | 38 + ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin | Bin 0 -> 12800 bytes ProfRom_Disasm/prof_roms/rom4_fnt.bin | Bin 0 -> 1211 bytes ProfRom_Disasm/prof_roms/rom4_vars.bin | Bin 0 -> 371 bytes ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin | Bin 0 -> 3328 bytes ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin | Bin 0 -> 11776 bytes ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin | Bin 0 -> 6912 bytes ProfRom_Disasm/prof_roms/rom7_data4CRC.bin | Bin 0 -> 512 bytes ProfRom_Disasm/rom0.a80 | 10229 ++++++++++++++++++ ProfRom_Disasm/rom0.bat | 4 + ProfRom_Disasm/rom2.bat | 4 + ProfRom_Disasm/rom2_SrvMon.a80 | 10349 +++++++++++++++++++ ProfRom_Disasm/rom3.bat | 5 + ProfRom_Disasm/rom3_trdos.a80 | 7186 +++++++++++++ ProfRom_Disasm/rom4.a80 | 1082 ++ ProfRom_Disasm/rom4.bat | 4 + ProfRom_Disasm/rom5.a80 | 7671 ++++++++++++++ ProfRom_Disasm/rom5.bat | 4 + ProfRom_Disasm/rom6.a80 | 2902 ++++++ ProfRom_Disasm/rom6.bat | 4 + ProfRom_Disasm/rom7.a80 | 5903 +++++++++++ ProfRom_Disasm/rom7.bat | 4 + 26 files changed, 46969 insertions(+) create mode 100755 ProfRom_Disasm/!AllConst.asm create mode 100755 ProfRom_Disasm/!RomDisk.asm create mode 100755 ProfRom_Disasm/!ram8.asm create mode 100755 ProfRom_Disasm/!roms.mac create mode 100644 ProfRom_Disasm/ROM_MAP.TXT create mode 100755 ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom4_fnt.bin create mode 100755 ProfRom_Disasm/prof_roms/rom4_vars.bin create mode 100755 ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin create mode 100755 ProfRom_Disasm/prof_roms/rom7_data4CRC.bin create mode 100755 ProfRom_Disasm/rom0.a80 create mode 100755 ProfRom_Disasm/rom0.bat create mode 100755 ProfRom_Disasm/rom2.bat create mode 100755 ProfRom_Disasm/rom2_SrvMon.a80 create mode 100755 ProfRom_Disasm/rom3.bat create mode 100755 ProfRom_Disasm/rom3_trdos.a80 create mode 100755 ProfRom_Disasm/rom4.a80 create mode 100755 ProfRom_Disasm/rom4.bat create mode 100755 ProfRom_Disasm/rom5.a80 create mode 100755 ProfRom_Disasm/rom5.bat create mode 100755 ProfRom_Disasm/rom6.a80 create mode 100755 ProfRom_Disasm/rom6.bat create mode 100755 ProfRom_Disasm/rom7.a80 create mode 100755 ProfRom_Disasm/rom7.bat diff --git a/ProfRom_Disasm/!AllConst.asm b/ProfRom_Disasm/!AllConst.asm new file mode 100755 index 0000000..a865920 --- /dev/null +++ b/ProfRom_Disasm/!AllConst.asm @@ -0,0 +1,226 @@ + +romROMx0073 equ #0073 ;загрузка блока из ROM-Disk + +rom0_x1B11 equ #1B11 ;автостарт с диска +rom0_x259F equ #259F ; + +rom2_x0000 equ #0000 ;запись байта в память пользователя (rst #00) +rom2_x0028 equ #0028 ;чтение байта из памяти пользователя +rom2_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=0 +rom2_x013A equ #013A ;выход из монитора +rom2_x03A7 equ #03A7 ;Запись регистра AY +rom2_x03B6 equ #03B6 ;чтение регистра AY +rom2_x04CE equ #04CE ;восстановление Турбо-режима +rom2_x04D5 equ #04D5 ;включение Турбо-режима +rom2_x05A1 equ #05A1 ;????????? +rom2_x0603 equ #0603 ;копирование памяти с #8000 в страницу пользователя +rom2_x0606 equ #0606 ;копирование страницы пользователя в #8000 +rom2_x0665 equ #0665 ;включение режима 48k only +rom2_x0749 equ #0749 ;восстановление области памяти из ram 8 +rom2_x0753 equ #0753 ;сохранение области памяти в ram 8 +rom2_x08D7 equ #08D7 ; печать текущего меню монитора +rom2_x0B06 equ #0B06 ;ввод и обработка команды отладчика +rom2_x0D42 equ #0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D +rom2_x0D46 equ #0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D +rom2_x0DF4 equ #0DF4 ;преобразование строки в число +rom2_x0E73 equ #0E73 ;деление bc=hl/de с проверкой de на ноль +rom2_x0E85 equ #0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) +rom2_x0EE3 equ #0EE3 ;поиск в буфере ввода строки первого печатного символа +rom2_x15B3 equ #15B3 ;печать сообщения из hl длиной b +rom2_x15B9 equ #15B9 ;печать сообщения из hl с заменой непечатных символов на ? +rom2_x15D0 equ #15D0 ;печать сообщения по номеру (на экран/в буфер) +rom2_x15DB equ #15DB ;печать сообщения из hl +rom2_x15F3 equ #15F3 ;печать нескольких пробелов (в B) +rom2_x1612 equ #1612 ;печать числа в hl (dec/hex) с префиксом +rom2_x1629 equ #1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом +rom2_x162C equ #162C ;печать числа в заданной системе счисления +rom2_x165E equ #165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом +rom2_x1661 equ #1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом +rom2_x1669 equ #1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами +rom2_x166E equ #166E ;печать десятичного числа bc [0..65535] с ведущими пробелами +rom2_x1673 equ #1673 ;печать числа bc (на экран/в буфер) +rom2_x16AA equ #16AA ;деление bc=ac/de +rom2_x16DE equ #16DE ;печать числа hl=[#0000..#FFFF] +rom2_x16E3 equ #16E3 ;печать числа a=[#00..#FF] +rom2_x16EC equ #16EC ;печать числа a=[#0..#F] +rom2_x2800 equ #2800 ;печать символа в окне +rom2_x28F6 equ #28F6 ;мигание текстового курсора в строке ввода +rom2_x28B8 equ #28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) +rom2_x28E8 equ #28E8 ;печать/удаление курсора в окне +rom2_x2969 equ #2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей +rom2_x298E equ #298E ;скроллинг окна вверх +rom2_x2A1B equ #2A1B ;обработка управляющего кода #1E (скроллинг окна ввниз) +rom2_x2A5E equ #2A5E ;обработка управляющего кода #0C (очистка текущего окна) +rom2_x2A85 equ #2A85 ;очистка знакоместной строки по координатам курсора +rom2_x2B0B equ #2B0B ;печать символа со сбросом 7го бита (rst #10) +rom2_x2B10 equ #2B10 ;печать пробела (rst #10) +rom2_x2B12 equ #2B12 ;печать символа (rst #10) +rom2_x2C4D equ #2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +rom2_x2E3D equ #2E3D ;печать дампа памяти в окне +rom2_x2E76 equ #2E76 ;удаление курсора на предыдущей ячейке дампа +rom2_x2EBA equ #2EBA ;печать одной строки дампа памяти (8 байт) +rom2_x2F74 equ #2F74 ;вывод дисасма памяти по адресу в de +rom2_x2FED equ #2FED ;печать пробелов до правого края окна +rom2_x2FF1 equ #2FF1 ;печать пробелов до заданной координаты X +rom2_x2FFB equ #2FFB ;установка текущим окна: ввод числа +rom2_x3005 equ #3005 ;установка текущим окна: main menu +rom2_x300F equ #300F ;чтение содержимого регистра ix основной программы +rom2_x3014 equ #3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана +rom2_x3019 equ #3019 ;ix = адрес дескриптора окна монитора: дамп памяти +rom2_x301C equ #301C ;ix = адрес дескриптора окна монитора из hl +rom2_x3107 equ #3107 ;запись области памяти в файл +rom2_x3201 equ #3201 ;печать ON/OFF от флага nz-ON/z-OFF +rom2_x3210 equ #3210 ;определение адреса ловушки +rom2_x35D3 equ #35D3 ;сравнение ix=xE075 +rom2_x35E0 equ #35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя +rom2_x36C3 equ #36C3 ;запись стандартного Magic-файла +rom2_x36F9 equ #36F9 ;получение номера логической страницы пользователя a=[#0..#F] +rom2_x3707 equ #3707 ;сравнение страницы пользователя с заданной +rom2_x3732 equ #3732 ;установка страницы пользователя равной номеру страницы в L +rom2_x37B9 equ #37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) +rom2_x3807 equ #3807 ;пауза 40416t +rom2_x382E equ #382E ;ожидание отжатия всех клавиш +rom2_x3870 equ #3870 ;печать сообщения и продолжение работы текущего меню монитора +rom2_x3A21 equ #3A21 ;копирование активного экрана пользователя в #4000 +rom2_x3A4E equ #3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +rom2_x3A95 equ #3A95 ;подготовка переменных к выводу на экран/принтер +rom2_x3B75 equ #3B75 ;определение типа прерываний im 1/2 +rom2_x3EE6 equ #3EE6 ;названия месяцев +rom2_x3F0A equ #3F0A ;Названия дней недели + +rom3_x0FF3 equ #0FF3 ;Запись памяти на диск +rom3_x3D30 equ #3D30 ;вызов страницы tr-dos +rom3_x3FF0 equ #3FF0 ;вывод в порт +rom3_x3FF3 equ #3FF3 ;чтение порта + +rom4_x0122 equ #0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +rom4_x02E8 equ #02E8 ;проверка оригинальный/совместимый компьютер +rom4_x0305 equ #0305 ;установка переменных из NVRAM/CMOS128 +rom4_x0312 equ #0312 ;установка переменных по данным в CMOS +rom4_x0315 equ #0315 ;установка переменных по данным в CMOS +rom4_x036C equ #036C ;запись переменных в CMOS и в NVRAM +rom4_x0378 equ #0378 ;запись переменных в NVRAM +rom4_x0398 equ #0398 ;запись переменных в CMOS +rom4_x0512 equ #0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) +rom4_x057F equ #057F ;распаковка шрифта в rom 8 +rom4_x0A5A equ #0A5A ;инициализация системы и печать сооветствующих сообщений + +rom5_x0110 equ #0110 ;опрос Break. cy=1 не нажата +rom5_x011C equ #011C ;опрос манипуляторов и печать курсора +rom5_x0176 equ #0176 ;восстановление экрана под курсором мыши +rom5_x0381 equ #0381 ;ожидание нажатия клавиш и обработка реакции на них +rom5_x043B equ #043B ;ОШИБКА!!!! вызов процедуры по номеру в C +rom5_x08EF equ #08EF ;доступность опции K. kempston joystick +rom5_x0C22 equ #0C22 ;установка параметров окна для ввода строки в меню монитора +rom5_x0EB5 equ #0EB5 ;печать текущего меню монитора +rom5_x1061 equ #1061 ;печать закодированного сообщения из hl +rom5_x1095 equ #1095 ;заксоренное сообщение +rom5_x10AB equ #10AB ;заксоренное сообщение +rom5_x11CD equ #11CD ;печать сообщения по номеру в BC +rom5_x1A4C equ #1A4C ;печать даты и времени в окне монитора +rom5_x1AA6 equ #1AA6 ;читаем время в строку в формате ASCII +rom5_x1B18 equ #1B18 ;читаем дату в строку в формате ASCII +rom5_x1C0D equ #1C0D +rom5_x1C73 equ #1C73 ;ввод текстовой строки в нижней строке экрана +rom5_x1C84 equ #1C84 ;инициализация окна ввода +rom5_x1CB3 equ #1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) +rom5_x1CB8 equ #1CB8 ;ввод строки (вых: hl адрес введенной строки) +rom5_x2054 equ #2054 ;печать рамки вокруг окна +rom5_x2278 equ #2278 ;редактирование дампа памяти в окне монитора +rom5_x2503 equ #2503 ;монтирование всех образов с винчестера +rom5_x25EB equ #25EB ;формирование в буфере xEBF5 списка образов коллекции +rom5_x2620 equ #2620 ;формирование в буфере xEBF5 списка подразделов MFS +rom5_x271A equ #271A ;подсчет количества подразделов в MFS +rom5_x2AA4 equ #2AA4 ;преобразование количества секторов в мегабайты +rom5_x302A equ #302A ;декремент (hl)=(hl)-1 +rom5_x3052 equ #3052 ;сложение двух 4х байтных чисел +rom5_x30B9 equ #30B9 ;идентификация жесткого диска +rom5_x30C6 equ #30C6 ;печать окна для тестирования HDD +rom5_x30F3 equ #30F3 ;печать кода ошибки винчестера +rom5_x3135 equ #3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +rom5_x3163 equ #3163 ;печать текущего номера цилиндра +rom5_x31AA equ #31AA ;удаление всех разделов MBR + + +rom6_x0156 equ #0156 ;печать информации о ловушке +rom6_x01E4 equ #01E4 ;установка новой ловушки в отладчике +rom6_x0249 equ #0249 ;вывод каталога текущего дисковода (на экран/принтер) +rom6_x03A1 equ #03A1 ;печать числа в десятичной системе счисления +rom6_x03A9 equ #03A9 ;форматирование/проверка текущей дискеты +rom6_x04E5 equ #04E5 ;быстрое форматирование текущей дискеты (очистка каталога) +rom6_x064D equ #064D ;установка дескриптора окна: запрос на запись MBR +rom6_x066C equ #066C ;установка код дисковой ошибки в переменной для печати числа +rom6_x067F equ #067F ;сохранение экрана пользователя на диск +rom6_x06A6 equ #06A6 ;печать сообщения об ошибке и продолжение работы монитора +rom6_x06AD equ #06AD ;ввод текстовой строки внизу экрана +rom6_x074A equ #074A ;ожидание действий пользователя (опрос управления, вывод часов) +rom6_x093F equ #093F ;rst 8:db #8B загрузка zs-snap с диска +rom6_x0976 equ #0976 ;загрузка zs-snap (S. load ... snap) +rom6_x097E equ #097E ;сохранение zs-snap (S. save ... snap) +rom6_x0D60 equ #0D60 ;установка п/п jp #addr по адресу xE338 +rom6_x0E3B equ #0E3B ;загрузка из ROM-disk +rom6_x1108 equ #1108 ;распаковка блока + +rom7_x01AF equ #01AF ;автостарт с дискеты +rom7_x0229 equ #0229 ;вызов функции R8DOS +rom7_x0394 equ #0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +rom7_x0CFF equ #0CFF ;усттановка переменных дисковой BIOS +rom7_x0D62 equ #0D62 ;определение наличия NVRAM +rom7_x0DAD equ #0DAD ;чтение всей памяти NVRAM в память #7530 +rom7_x0DB6 equ #0DB6 ;чтение данных из NVRAM +rom7_x0DC7 equ #0DC7 ;запись всей памяти NVRAM из памяти #7530 +rom7_x0DD0 equ #0DD0 ;запись данных в NVRAM +rom7_x0E72 equ #0E72 ;что-то пишет в NVRAM +rom7_x0F55 equ #0F55 ;для сравнения чисел +rom7_x0F59 equ #0F59 ;для сравнения чисел +rom7_x0F5D equ #0F5D ;деление hl=dehl'/bc +rom7_x0FB7 equ #0FB7 ;умножение dehl=de'hl' * bc +rom7_x1003 equ #1003 ;копирование из (hl) в (de) 4х байт +rom7_x1035 equ #1035 ;сравнение двух чисел в памяти по адресам в de и hl +rom7_x1065 equ #1065 ;инициализация дисковода +rom7_x107B equ #107B ;инициализация дисковода и настройка на дискету +rom7_x1166 equ #1166 ;загрузка очередного дескриптора файла в буфер +rom7_x11B0 equ #11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +rom7_x11D4 equ #11D4 ;открытие файла для внутренних нужд +rom7_x11DF equ #11DF ;открыть файл для последующих операций с ним +rom7_x1240 equ #1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +rom7_x128C equ #128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +rom7_x1307 equ #1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 +rom7_x1360 equ #1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов +rom7_x1365 equ #1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла +rom7_x1390 equ #1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов +rom7_x1395 equ #1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти +rom7_x1405 equ #1405 ;новое значение указателя в файле R8DOS #22 +rom7_x14C0 equ #14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +rom7_x155A equ #155A ;чтение заголовка первого попавшегося сектора дисковода A +rom7_x1572 equ #1572 ;определение наличия interrupt controller +rom7_x15C7 equ #15C7 ;определение наличия последовательного порта/модема +rom7_x16B9 equ #16B9 ;работа с контроллером прерываний +rom7_x1768 equ #1768 ;поиск раздела MFS +rom7_x17BB equ #17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +rom7_x17EF equ #17EF ;запись 2х секторов из буфера xEBF5 +rom7_x18C0 equ #18C0 ;R8DOS #28(40) подключение раздела к драйверу HDD +rom7_x1AB1 equ #1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 +rom7_x1B04 equ #1B04 ;расчет адреса блока описателя заданного дисковода +rom7_x1D2A equ #1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +rom7_x1D45 equ #1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl +rom7_x1D73 equ #1D73 ;чтение сектора с винчестера в буфер xE5A9 +rom7_x1DDF equ #1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +rom7_x1E3D equ #1E3D ;чтение сектора 3 в буфер xE5A9 и проверка контрольной суммы +rom7_x1E74 equ #1E74 ;R8DOS #22(34) идентификация жесткого диска +rom7_x1F08 equ #1F08 ;проверка геометрии винчестера +rom7_x1F2D equ #1F2D ;расчет произведения головок и секторов +rom7_x1F41 equ #1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора +rom7_x1F59 equ #1F59 ;чтение ячейки CMOS +rom7_x1F76 equ #1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS +rom7_x1F93 equ #1F93 +rom7_x1FB2 equ #1FB2 ;запись в CMOS времени и даты +rom7_x2023 equ #2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +rom7_x2047 equ #2047 ;определение наличия CMOS +rom7_x20F1 equ #20F1 ;тестирование HDD (2. test) (тест на чтение/запись) +rom7_x2105 equ #2105 ;тестирование HDD (1. test) (тест только на чтение) +rom7_x2422 equ #2422 ;определение наличия SMUC + + +romA_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=2 + diff --git a/ProfRom_Disasm/!RomDisk.asm b/ProfRom_Disasm/!RomDisk.asm new file mode 100755 index 0000000..7ab59ae --- /dev/null +++ b/ProfRom_Disasm/!RomDisk.asm @@ -0,0 +1,50 @@ +;АДРЕС: #0073 загрузка блока из ROM-Disk +;вх: h - номер страницы с файлом +; l - смещение в параграфах от начала ROM-disk в этой странице +; b - размер в параграфах +;вых: b - осталось незагруженных параграфов +; l - номер очередного параграфа +; +x0073 ld c,#00 + ld de,(#0070) ;e - начало ROM-disk в параграфах, d - всего параграфов + ld a,l + or a + jr nz,x007F + ld l,e + ld a,e +x007F sub e + ld e,a + ld a,d + sub e + ld e,a ;e - параграфов от начала блока до конца страницы + ld a,b + sub e + jr nc,x008F ;продолжение блока в следующей странице + xor a ;блок целиком в этой странице + push af + call x0099 ;копирование блока в память + pop bc + ret +x008F inc h ;увеличим номер страницы + push af ;запомним кол-во незагруженных параграфов + ld b,e + call x0099 ;копирование блока в память + pop bc + ld l,#00 + ret +;копирование блока в память +;вх: l - номер первого параграфа +; b - кол-во параграфов +; c=#00 +;вых: a,l - номер очередного параграфа +x0099 push hl + ld h,l + ld l,c + ld de,(xE7BE) + ldir + ld (xE7BE),de + ld a,h + pop hl + ld l,a + ret +;x00AA diff --git a/ProfRom_Disasm/!ram8.asm b/ProfRom_Disasm/!ram8.asm new file mode 100755 index 0000000..5ac2559 --- /dev/null +++ b/ProfRom_Disasm/!ram8.asm @@ -0,0 +1,1248 @@ + +x5B88 equ #5B88 ;содержимое порта #7FFD +x7530 equ #7530 ;для контролера прерываний +x9C40 equ #9C40 ;для контролера прерываний + +xC000 +xC001 equ #C001 ;2 для маркера страницы +xC006 equ #C006 ; + +xC063 equ #C063 ;1 <>0 отладчик отключен +xC064 equ #C064 ;2 адрес п/п вызываемой при входе в монитор +xC066 +xC069 equ #C069 ;#1B00 сохраненный экран +xDB69 equ #DB69 ;область для сохранения памяти с адреса #8002 + ;буфер для чтения даты и времени в формате ASCII + ;буфер для загрузки конфигурационного сектора +xDD69 equ #DD69 ;2 адрес текущей ячейки в дампе памяти +xDD6B equ #DD6B ;2 адрес возврата из монитора/ pc программы пользователя +xDD6D equ #DD6D ;2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке +xDD6F equ #DD6F ;2 регистр ix +xDD71 equ #DD71 ;2 регистр iy +xDD73 equ #DD73 ;2 регистр hl +xDD75 equ #DD75 ;2 регистр de +xDD77 equ #DD77 ;2 регистр bc +xDD79 equ #DD79 ;2 регистр hl' +xDD7B equ #DD7B ;2 регистр de' +xDD7D equ #DD7D ;2 регистр bc' +xDD7F equ #DD7F ;2 регистр af +xDD81 equ #DD81 ;2 регистр af' +xDD83 equ #DD83 ;2 вершина стэка для сохранения регистров при входе в монитор + ;2 регистр r и флаг IFFF2 +xDD85 equ #DD85 ;1 i +xDD86 equ #DD86 ;1 номер rom откуда зашли + ; =#01 rom 0 Basic 128k + ; =#02 rom 0 Basic 48k + ; =#04 rom 3 Tr-Dos + ; =#08 rom 2 SrvMon + ; =#80 запрос от принтера +xDD87 equ #DD87 ;2 адрес начала дампа памяти +xDD89 equ #DD89 ;2 адрес текущей ячейки в дампе памяти + ; адрес начала дизасма в дампе памяти + ; номер последней записи в каталоге ROM-disk + ; количество подразделов в разделе MFS +xDD8B equ #DD8B ;2 адрес начала листинга для команды DASM +xDD8D equ #DD8D ;#0A таблица закладок в листинге дизасма +xDD97 +;область для сохранения стэка 11 байт +xDD99 equ #DD99 ;2 (#C001) + ;#0C 6 числовых операндов для команд отладчика +xDD9B equ #DD9B ;2 bc +xDD9D equ #DD9D ;1 номер rom откуда зашли +xDD9E equ #DD9E ;2 af флаг IFFF2 и регистр r +xDDA0 equ #DDA0 ;2 af +xDDA2 equ #DDA2 ;2 адрес возврата из монитора +xDDA4 +xDDA7 equ #DDA7 ;2 для временного сохранения указателя стэка/регистров + ; для печати числа в сообщениях +xDDA9 +xDDAA equ #DDAA ;2 текущий адрес команды ассемблера для дизасма +xDDAC equ #DDAC ;4 буфер для содержимого памяти адресуемой текущим регистром + ;4 буфер команды для дизассемблирования + ;8 буфер вывода строки дампа памяти +xDDB4 equ #DDB4 ;3 команда дизассемблера без префиксов +xDDB7 equ #DDB7 ;9 сообщение для печати команды дизасма + ; +0 =[#7E..#C4] -> -#7E =[#00..#46] из таблицы x1107 + ; +1 код сообщения второго операнда + ;=[#01..#2B] код операнда + ;=[#27..#2B] в операнде есть число в скобках + ;=[#2C..#74] код мнемоники + ;=[#7E..#C4] код команды ассемблера + ;=[#EC] за этим байтом следует адрес сообщения + ;=[#EE] печать db #nn ;BAD + ;=[#F1] прерываем печать команды + ;=[#F7] признак конца команды + ;=[#F8..#FF] за этим байтом следует число + ; ;вх: 0,a =0/1 двухбайтное/однобайтное число + ; ; 1-2,a - система счисления (bin/oct/dec/hex) + ;=[#00,#75..#EB,#ED..#F7] выход без печати hl=hl-1 + +xDDC0 equ #DDC0 ; + +xDDCB equ #DDCB ;2 для сохранения стэка, при формировании команды дизасма +xDDCD equ #DDCD ;1 код команды дизасма +xDDCE equ #DDCE ;2 адрес перехода при дизасме +xDDD0 equ #DDD0 ;2 адрес следующей команды дизасма +xDDD2 equ #DDD2 ;2 адрес на который ссылаются команды работающие с ячейками + ; памяти, такие как LD ( ),reg или SET b,(IX+d). +xDDD4 equ #DDD4 ;2 +xDDD6 equ #DDD6 ;2 +xDDD8 equ #DDD8 ;2 адрес начала текущего блока сообщений +xDDDA equ #DDDA ;2 адрес начала текущего блока слов +xDDDC equ #DDDC ;2 для команд поиска в отладчике: адрес начала поиска +xDDDE equ #DDDE ;2 для команд поиска в отладчике: адрес конца поиска +xDDE0 equ #DDE0 ;1 для команд поиска в отладчике: длина искомой строки +xDDE1 equ #DDE1 ;2 для команд поиска в отладчике: состояние портов #7FFD/#1FFD пользователя +xDDE3 equ #DDE3 ;#14 для команд поиска в оладчике: искомая строка +xDDF7 equ #DDF7 ;2 указатель стэка при входе в монитор, с учетом 11 байт уже сохраненных на стэке +xDDF9 +xDDFF equ #DDFF ;1 номер текущего меню +xDE00 equ #DE00 ;8 номер текущей опции для каждого меню из списка номеров меню +xDE08 equ #DE08 ;8 список номеров меню для возврата в предыдущее +xDE10 equ #DE10 ;2 для сохранения hl +xDE12 equ #DE12 ;2 для сохранения адреса возврата +xDE14 equ #DE14 ;1 код предыдущего нажатия при просмотре списка введенных строк +xDE15 equ #DE15 ;2 адрес буфера ввода строки +xDE17 equ #DE17 ;43 буфер для ввода строки +xDE42 equ #DE42 ;400 список последних введенных строк +xDFD2 equ #DFD2 ;24 буфер для сохранения экрана под курсором мыши +;xDFE9 equ #DFE9 ; +xDFEA equ #DFEA ;4 буфер нажатых клавиш +xDFEE equ #DFEE ;-26 копия порта #7FBA + ; 6,=0/1 образ к дисководу B подключен/не подключен + ; 7,=0/1 образ к дисководу A подключен/не подключен + ; =#FF при инициализации +xDFEF equ #DFEF ;-25 +xDFF0 equ #DFF0 ;-24 1 состояние порта #FFBA + ; 7,=0 активен регистр адреса CMOS + ; =1 активен регистр данных CMOS + ; =#F7 при включении компьютера +xDFF1 equ #DFF1 ;-23 =0..3 с какого диска делать автостарт +xDFF2 equ #DFF2 ;-22 значение Cylinders HDD (2 байта) +xDFF4 equ #DFF4 ;-20 значение head HDD +xDFF5 equ #DFF5 ;-1F значение sector HDD +xDFF6 equ #DFF6 ;-1E значение seconds +xDFF7 equ #DFF7 ;-1D значение minutes +xDFF8 equ #DFF8 ;-1C значение hours +xDFF9 equ #DFF9 ;-1B значение days +xDFFA equ #DFFA ;-1A значение months +xDFFB equ #DFFB ;-19 значение years +xDFFC equ #DFFC ;-18 2 =#FC9D/#FC8B (64669/64651) оригинальный иначе совместимый +xDFFD equ #DFFD ;-17 +xDFFE equ #DFFE ;-16 2 сбойных секторов на диске + ; 1 поиск файла: номер загруженного в буфер сектора [#00..#0F] +xDFFF equ #DFFF ;-15 1 поиск файла: номер загруженного в буфер сектора [#01..#10] +xE000 equ #E000 ;-14 2 всего секторов на диске + ; 1 ROM-disk: смещение в параграфах от начала ROM-disk в этой странице + ; 1 поиск файла: номер текущего файла в считанном секторе [#00..#0F] +xE001 equ #E001 ;-13 1 ROM-disk: номер страницы с файлом ROM-disk +xE002 equ #E002 ;-12 0, + ; 1,=1 загружать/сохранять в zs-snap регистры AY +xE003 equ #E003 ;-11 +xE004 equ #E004 ;-10 1 содержимое регистра 7 AY +xE005 equ #E005 ;-0F 0,=1 эта же клавиша была нажата и в предыдущем цикле + ; 1,=1 работает автоповтор нажатой клавиши + ; 2,=1 клавиша была нажата. код клавиши еще не обработан + ; 3, + ; 4, + ; 5,=1 ????для рисования рамок???? + ; 6,=1 было нажато cs+ss + ; 7,=1 нажат CapsLock (cs+2) +xE006 equ #E006 ;-0E 1 код нажатой клавиши +xE007 equ #E007 ;-0D 1 код нажатой клавиши +xE008 equ #E008 ;-0C координата X курсора мыши в текущем окне (в знакоместах) +xE009 equ #E009 ;-0B координата Y курсора мыши в текущем окне (в знакоместах) +xE00A equ #E00A ;-0A 0-4, - величина задержки для куросра + ; 5,=1 + ; 6,=1 работает счетчик before repeat + ; 7,=1 курсор(стрелка) напечатан на экране +xE00B equ #E00B ;-09 1 координата Y выделенной опции меню +xE00C equ #E00C ;-08 1 номер блока сообщений текущей опции +xE00D equ #E00D ;-07 1 копия байта (#00FB) rom 2 +xE00E equ #E00E ;-6/5 2 копия xE012 +xE010 equ #E010 ;-4/3 2 копия xE012 +xE012 equ #E012 ;-02 1 состояние порта #7FFD при входе в монитор +xE013 equ #E013 ;-01 1 состояние порта #1FFD при входе в монитор + +;d порт #1f 000?0000 +;e порт #7f 001????? / 000????? + + +;значение iy при работе в мониторе (переменные???) +;переменные код 0 +xE014 equ #E014 ;+00 =#84 - [ + ; =#04 - ( + ; =#00 - это не скобка + ; 4,=1 + ; 3,=1/0 - 16/8 бит значение команды + ; 1,=1/0 - чтение из строки команды строкового/числового значения + ; 0,=1/0 - читается из параметра число/строка +xE015 equ #E015 ;+01 0,=0/1 префикс #DD/#FD + ; 1,=1 есть префикс #DD/#FD -> e=#09 + ; 2,=1 есть префикс #ED -> e=#18 если есть #DD/#FD + ; 3,=1 есть префикс #CB -> e=#16 + ; 4,= + ; 5,= + ; 6,=1 байтовое смещение в команде + ; =1 в команде есть ссылка на адрес памяти + ; 7,= +xE016 equ #E016 ;+02 длина команды для дизасма в байтах +xE017 equ #E017 ;+03 тип текущй команды дизасма + ; 0,=1 это команда call/call cc + ; 1,=1 это команда ret/ret cc + ; 2,=1 это команда jr cc + ; 3,=1 это команда jp/jp cc + ; 4,=1 это команда jp (hl)/jp (ix)/jp (iy) + ; 5,=1 при 1,=1 это команда ret cc + ; 6,=1 это неизвестная команда + ; 7,=1 это ex af,af' либо exx +xE018 equ #E018 ;+04 0-1,=00 в дизасме команда не ссылается на память (см xDDD2) + ; 0,=1 если команда считывает из памяти, и Ложь, если считывания не происходит + ; 1,=1 если команда производит запись в память, и Ложь, если запись не выполняется + ; 6,=1 ето команда сдвига с префиксом +xE019 equ #E019 ;+05 0,=1/0 число в десятичной/шестнадцатиричной системе + ; 1,=1 Расширить вывод реассемблера в командах DISS, LDISS и + ; DASM, кроме адреса и мнемоники команды, будут + ; представлены значения байт и их эквиваленты в ASCII + ; 2,=1/0 печатать 1/5 комманд в дизасме монитора + ; 3,=1 Не трассировать (выполнять сразу) подпрограммы, + ; расположенные в ПЗУ + ; 4,=1/0 вводить адрес в команде DASM числом/выражением + ; 5,=1/0 Запретить/разрешить автоматическое выполнение команды SHOW + ; 6,=1 начальный адрес команды SS/D, берется из регистра PC. + ; =0 начальный адрес команды SS/D. Берется из указателя текущей ячейки (mem) + ; 7,=1 печатать в дампе символы из полного набора + ; =0 печатать символы с кодами res 7,[#20..#7F] остальные точками +xE01A equ #E01A ;+06 минимальная длина сообщения с мнемоникой ассемблера +xE01B equ #E01B ;+07 минимум разрядов в числе при переводе в ASCII +xE01C equ #E01C ;+08 для перевода времени в ASCII =#30 +xE01D equ #E01D ;+09 0,=1 экран под курсором сохранен в буфере + ; =0 восстановление экрана под курсором из буфера + ; 1,=1 запрет на установку следующих координа печати в окне + ; 2,=1 печатаем символ + ; 3,=1 курсор напечатан ???? + ; 4,=1 вместо экрана вывод на принтер + ; 5,=1 прочие управляющие коды + ; 6,=1 чтение данных после управляющего кода + ; 7,=1 управляющий код вывод строки #04 +xE01E equ #E01E ;+0A 0,=1 новую информацию записывать поверх старой + ; =0 очищать экран монитора при обновлении информации + ; 1,=1 не обновлять содержимое регистров + ; 2,=1 не обновлять экран монитора + ; =0 обновлять содержимое экрана монитора согласно битам 0, 1, 3:6 + ; 3,=1 не обновлять дамп по содержимому регистров + ; 4,=1 не обновлять дамп памяти + ; 5,=1 не обновлять дизассемблер памяти по содержимому ячейки памяти + ; 6,=1 не выводить дизассемблер в мониторе + ; 7,=1 трассировать все команды + ; =0 не выводить подпрограммы (автоматическое выполнение подрограмм) +xE01F equ #E01F ;+0B 0,=1 отображаются регистры альтернативного набора + ; 1,=1 отображается AF' + ; 4,=0 при вызове функций #00-#13 R8DOS + ; =1 сектор прочитан с HDD + ; 5,=0 функции вызываются из монитора + ; =1 функция rst 8 вызвана пользователем + ; 7,=0 восстанавливать память пользователя под всеми ловушками + ; =1 сохранять память пользователя под всеми ловушками и установка ловушек + ; =0/1 меню mount/dismount +xE020 equ #E020 ;+0C байт управления индикацией регистров =1 не выводится + ; 7 - pc + ; 6 - sp + ; 5 - ix + ; 4 - iy + ; 3 - hl(hl') + ; 2 - de(de') + ; 1 - bc(bc') + ; 0 - af(af') +xE021 equ #E021 ;+0D +xE022 equ #E022 ;+0E 0,=0 используется при компрессии + ; 2,=1 ошибка. деление на ноль + ; 5,=0 ввод параметров в меню + ; =1 ввод строки в окне создания разделов + ; 6,=1 в команде ассемблера нет запятой + ; 7,=0/1 редактирование hex дампа/символьного представления +xE023 equ #E023 ;+0F количество незакрытых скобок в выражении в отладчике +xE024 equ #E024 ;+10/11 делитель для выделения разряда числа +xE025 equ #E025 ;+11 +xE026 equ #E026 ;+12 0,=1 запущен отладчик + ; 1,=1 экран не надо сохранять в ram 8 (экран не сохранен в ram 8) + ; 2,=0/1 print screen positive/negative + ; 3,=1 экран сохранен в ram 8 + ; 4,=1 при вызове команды CALL отладчика + ; 5,=1 выполняется трассировка из отладчика + ; 6,= + ; 7,=1 желто/черный бордюр при входе +xE027 equ #E027 ;+13 0,=1/0 работает команда отладчика search/find + ; 1,=0 запись строки данных в память идет по адресу в MEM + ; 3,=1 продолжаем запись zs-snap после записи 48k + ; =0 ошибка: undefined file + ; 5,=1/0 compression on/off + ; 6,=1/0 запись/чтение + ; 7,=1/0 при сохранении/загрузке zs-snap использовать сжатие + ; =1/0 форматирование/проверка дискеты +xE028 equ #E028 ;+14 0,=1 не трогать регистр 7 AY (sound on/off) + ; 1,=0/1 Autoconfig On/Off + ; 2,=1/0 после загрузки снапа вернуться в монитор/выйти из монитора (запуск снапа) + ; 3,=0 программа анализатора не задана + ; 4,=1 анализатор включен + ; 5,=1 работает команда EVal word + ; 6,=1 "теплый" сброс + ; 7,=0 отладчик отключен / reset RAM on/off +xE029 equ #E029 ;+15 отдельные биты этого байта позволяют управлять выводом на принтер + ; 0,=0/1 interface Centronics/RS232 + ; 1,=0/1 speed 9600/1200 + ; 2,=0/1 data bits 8/7 + ; 3,=0/1 stop bits 2/1 + ; 5,=0/1 режим вывода 1 точка/3 точки + ; 7,=0/1 positive/negative +xE02A equ #E02A ;+16 при отладке, аналог xE01E (параметры команды SLOW) + ; 0,=1 восстанавливать экран + ; 1,= + ; 2,= + ; 3,= + ; 4,= + ; 5,= + ; 6,= + ; 7,=1 выполнение команды в отладчике с быстрым выполнением подпрограмм +xE02B equ #E02B ;+17 текущая система счисления =2/8/10/16 +xE02C equ #E02C ;+18 значение interleaving 1..26 +xE02D equ #E02D ;+19 0,= + ; 3,=1 пауза в водимом листинге + ; 5,=1 чтение порта #7FFD/#1FFD недоступно + ; 6,=1 включено Turbo + ; 7,=1 турбо-режим доступен +xE02E equ #E02E ;+1A 0,=1 было обновление времени и даты в буфере + ; 1, + ; 2, + ; 3, + ; 4,=1 interrupt controller found + ; 5,=1 HDD есть и работоспособен + ; =1 NVRAM найден + ; =1 modem found + ; 6,=1 микросхема CMOS обнаружена + ; 7,=1 HDD физичиски присутствует +xE02F equ #E02F ;+#1B + ; 4,=1 interrupt controller найден. но не совсем???? + ; 6,=1 CMOS 128 байт + ; 7,=1 проверка геометрии винчестера пройдена +xE030 equ #E030 ;+#1C master HDD + ; 0,=1/0 autostart on/off + ; 1,=1/0 автоопределение HDD при старте on/off + ; 2,=1/0 LBA mode on/off + ; 4,=1/0 TRDOS mirror on/off + ; 5,=1/0 HDD обнаружен/отсутствует + ; =1 сектор MBR записан + ; 6,=0 в буфере xEBF5 список разделов без изменений + ; =1 в буфере xEBF5 список разделов изменен + ; 7,=1 на винчестере есть раздел MFS +xE031 equ #E031 ;+#1D slave HDD +xE032 equ #E032 ;+#1E +xE033 equ #E033 ;+#1F/#20 адрес текущего меню в списке номеров меню для возврата в предыдущее +xE035 equ #E035 ;+#21/#22 первый свободный адрес в буфере последних введенных строк(команд) +xE037 equ #E037 ;+#23/#23 адрес начала следующей введенной строки +xE038 equ #E038 ;+#24 + +xE039 equ #E039 ;+#25 значение NMI debouncing +xE03A equ #E03A ;+#26 размер окна сжатия для снапа +xE03B equ #E03B ;+#27 0,=1 нажата fire на джойстике и знакоместные координаты курсора в окне изменились + ; 1,=1 нажата fire на джойстике + ; 2,=1 курсор мыши вне пределов текущего окна + ; 3,=1/0 indicator времени в мониторе on/off + ; 5,=1/0 mouse on/off + ; 6,=1/0 kempston joystick on/off + ; 7,=1/0 manipulators on/off +xE03C equ #E03C ;+#28 crd X графического курсора +xE03D equ #E03D ;+#29 crd Y графического мыши +xE03E equ #E03E ;+#2A значение first debouncing +xE03F equ #E03F ;+#2B значение before repeat +xE040 equ #E040 ;+#2C значение second wait +xE041 equ #E041 ;+#2D значение second debouncing +xE042 equ #E042 ;+#2E значение size of step +xE043 equ #E043 ;+#2F +xE044 equ #E044 ;+#30 содержимое регистра дополнительных возможностей #F9BE (не реализовано) + ; =#00 всегда +xE045 equ #E045 ;+#31 содержимое регистра счетчика секторов (#FABE) + ; число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) +xE046 equ #E046 ;+#32 LBA адрес на HDD(двойное слово) младший байт + ; CHS - номер сектора +xE047 equ #E047 ;+#33 LBA адрес на HDD + ; CHS - номер цилиндра (младший байт) +xE048 equ #E048 ;+#34 LBA адрес на HDD + ; CHS - номер цилиндра (старший байт) +xE049 equ #E049 ;+#35 3-0, - LBA адрес на HDD старший байт + ; CHS номер головки + ; 4,=0/1 текущий винчестер master/slave + ; 5,=1 всегда + ; 6,=0/1 это CHS/LBA адрес + ; 7,=1 всегда +xE04A equ #E04A ;+#36 =#20 код команды винчестера: чтение сектора +xE04B equ #E04B ;+#37 =#30 код команды винчестера: запись сектора +xE04C equ #E04C ;+#38 #90 144 +xE04D equ #E04D ;+#39 количество дополнительных попыток чтения/записи сектора с винчестера + +;переменные код 2 +xE04E equ #E04E ;+00 1 константа антидребезговой задержки монитора +xE04F equ #E04F ;+01 1 константа задержки перед автоповтором +xE050 equ #E050 ;+02 1 счетчик до срабатывания автоповтора (базовое =(xE04F)) +xE051 equ #E051 ;+03 1 период автоповтора +xE052 equ #E052 ;+04 1 счетчик периода автоповтора (базовое =(xE051)) +xE053 equ #E053 ;+05 1 цвет бордюра, устанавливаемый монитором, при подаче звукового сигнала ошибки +xE054 equ #E054 ;+06 1 код символа "возврата каретки" для принтера +xE055 equ #E055 ;+07 1 код символа "перевода строки" для принтера +xE056 equ #E056 ;+08 1 код символа "перевода формата" для принтера +xE057 equ #E057 ;+09 2 код, определяющий скорость передачи для последовательного интерфейса (для 9600 бод - 0bh) +xE059 equ #E059 ;+0B 2 код, определяющий скорость передачи для последовательного интерфейса (для 1200 бод - 6аh) +xE05B equ #E05B ;+0D 11 коды, служащие для перевода принтера в графический режим + ; (непосредственно за ними будет выдано 768 байт + ; графической информации при печати экрана из монитора). + ; Байт +0dh хранит количество управляющих кодов + ; +#06 =#01/#03 режим печати 1 точки/3 точки +xE063 equ #E063 ;+15 4 коды, служащие для перевода принтера в текстовый режим, + ; завершающие печать экрана. Байт +015h хранит количество + ; управляющих кодов +xE067 equ #E067 ;2 =0000 + ;дескриптор окна монитора: вывод каталога диска на принтер + ;дескриптор окна монитора: вывод на принтер +xE06B equ #E06B ;+1D 1 число строк на странице при печати на принтере +xE06C equ #E06C ;+1E 1 число символов в строке при печати на принтере +xE06D + +xE075 equ #E075 ;дескриптор окна монитора: регистры/вывод каталога диска +xE083 equ #E083 ;дескриптор окна монитора: ввод строки низу экрана +xE091 equ #E091 ;дескриптор окна монитора: дизассембер +xE09F equ #E09F ;дескриптор окна монитора: дамп памяти +xE0AD equ #E0AD ;дескриптор окна монитора: информационное окно отладчика +xE0BB +xE0C9 equ #E0C9 ;дескриптор окна: menu +xE0D7 equ #E0D7 ;дескриптор окна: запрос на запись MBR +xE0E5 equ #E0E5 ;дескриптор окна: ввод числа +xE0F3 equ #E0F3 ;дескриптор окна: переименование раздела HDD/каталог ROM-disk +xE101 equ #E101 ;1 атрибуты для выделенной позиции в каталоге ROM-disk +xE102 equ #E102 ;#D дескриптор окна при включении +xE10F +xE110 equ #E110 ;1 атрибуты для печати опции меню +xE111 equ #E111 ;1 атрибуты для печати названия меню, времени +xE112 equ #E112 ;1 атрибуты для печати неактивной опции меню +xE113 equ #E113 ;1 атрибуты для печати выделенной опции меню +xE114 equ #E114 ;1 атрибуты для подсветки ловушки при выводе дизасма +xE115 equ #E115 ;1 атрибуты для печати информационного сообщения внизу экрана +xE116 equ #E116 ;2 очередной(первый пустой) адрес в буфере нажатых клавиш +xE118 equ #E118 ;2 текущий(первый не обработанный) адрес в буфере клавиатуры +xE11A equ #E11A ;2 адрес вершины стэка при входе в монитор + ;2 адрес памяти(8 байт) начала сормированной команды для трассировки +xE11C equ #E11C ;2 адрес первого свободного байта программы анализатора +xE11E equ #E11E ;#0C + ;=x3E2C,x3D01 + ;=x3179,x3161 + ;=x1DDC,x1DD0 +xE12A equ #E12A ;2 адрес изображения текущего графического курсора +xE12C equ #E12C ;последнее состояние порта мыши #FBDF (ось X) +xE12D equ #E12D ;последнее состояние порта мыши #FFDF (ось Y) +xE12E equ #E12E ;#20 изображение графического курсора №1 с маской +xE14E equ #E14E ;#20 изображение графического курсора №2 с маской +xE16E equ #E16E ; +xE17B equ #E17B ; +/* +xE16E db #7F ;знак копирайта + db " 1993" + db #1B,#01,#00 ;координаты + db "-97 " +xE17B db "MOA" + db #1B,#00,#24 ;координаты + db "NCACB" + db #1B,#01,#24 ;координаты + db "05-07" + db #1B,#02,#24 ;координаты + dc "V4.01" +*/ +xE196 + +xE1A6 equ #E1A6 ;#?? буфер для вывода строки с выравниванием +;x +xE336 equ #E336 ;вершина стэка для каких-то задач + ;при работе отладчика +xE338 equ #E338 ;#0E для сохранения дескриптора окна +xE33B equ #E33B ;2 для временного сохранения регистров +xE346 +xE38D equ #E38D ;2 вершина стэка при работе в мониторе +xE38F equ #E38F ;#0B буфер клавиатуры +xE39A equ #E39A ;8 буфер для сохранения памяти пользователя при трассировке + ; команды дизасма +xE3A2 +xE3A4 equ #E3A4 ;#10 буфер для сохранения экрана под символом 6 pix +xE3B4 equ #E3B4 ;1 предыдущие атрибуты окна +;x +xE3B6 equ #E3B6 ;1 счетчик для мигания курсора окна +xE3B7 equ #E3B7 ;2 адрес дескриптора текущего окна +xE3B9 equ #E3B9 ;2 адрес п/п обработки текущего управляющего кода +xE3BB equ #E3BB ;1 новая координата Y курсора +xE3BC equ #E3BC ;2 первый свободный адрес в буфере печати (xE1A6/буфер CMOS) + + ORG #E3BE + +xE3BE rst #30 + dw #0000 + db #00 + ret +xE3C3 dw #E449 ;rom 0, ram 8 текущей плоскости + dw #E44D ;rom 1, ram 8 текущей плоскости + dw #E4C5 ;текущая страница ПЗУ в новой плоскости (rom 2 ???) + dw #E41B ;rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 +xE3CB dw #E499 + dw #E489 + dw #E483 + dw #E484 + +;обработка rst #30 +;переключение плоскости +xE3D3 push hl + ld hl,(#0101) ;номер текущей страницы + ex (sp),hl + push hl + ld hl,#0006 + push af + add hl,sp + push de + push bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld c,(hl) + inc hl + ld b,(hl) ;адрес вызываемой п/п + inc hl + ld a,(hl) ;плоскость и страница вызываемой п/п +xE3E9 call xE478 ;включим страницу ПЗУ с монитором + inc hl + ex de,hl + ld (hl),d ;сохраним новый адрес возврата + dec hl + ld (hl),e + ld (xE408),bc + call xE4AA ;установим плоскость + ld hl,xE3C3 + call xE4B8 ;адрес п/п включения страницы ПЗУ по ее номеру в A + ld (xE405+1),hl + pop bc + pop de + pop af + pop hl +xE405 call #0000 +xE408 db 0 ;адрес вызываемой п/п + db 0 + +;включение предыдущей плоскости + ex (sp),hl + push af + push bc + ld a,l + call xE4AA + ld hl,xE3CB + call xE4B8 + pop bc + pop af + ex (sp),hl + ret + + +;включение rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 +xE41B ex (sp),hl + push de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld (xE43C+1),de ;de адрес вызываемой п/п + pop de + ex (sp),hl + push hl + ld hl,(xE43C+1) + ex (sp),hl ;(sp) адрес вызываемой п/п +xE42C push af +xE42D ld a,#10 + ld (xE468+1),a + pop af + ex (sp),hl + ld (xE43C+1),hl + ld hl,xE478 + ex (sp),hl + push hl +xE43C ld hl,#0000 + ex (sp),hl + ld (xE43C+1),bc + ld bc,#3D30 + jr xE463 + +;включение rom 0, ram 8 и вызов п/п с возвратом в xE478 +xE449 push af + xor a + jr xE450 +;включение rom 1, ram 8 и вызов п/п с возвратом в xE478 +xE44D push af + ld a,#10 +xE450 ld (xE468+1),a + pop af + ld (xE43C+1),bc ;сохраним BC + ex (sp),hl ;берем адрес п/п + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ex (sp),hl ;bc адрес вызываемой п/п + push hl + ld hl,xE478 + ex (sp),hl ;(sp) возврат в xE478 +xE463 push bc ;(sp) адрес вызываемой п/п + push af + ld bc,#7FFD +xE468 ld a,#00 + out (c),a + ld a,#10 + ld b,#1F + out (c),a + pop af + ld bc,(xE43C+1) + ret + +;возврат после обработки rst #30 +;включаем ПЗУ с монитором +xE478 push bc + push af + ld bc,#1FFD + ld a,#12 + out (c),a + pop af + pop bc +xE483 ret + +xE484 push hl ;rom 1, ram 8 с возвратом в x3D30 + ld hl,#3D30 + ex (sp),hl + +xE489 push bc ;включим rom 1, ram 8 + push af + ld bc,#1FFD + ld a,#10 + out (c),a + ld b,#7F + out (c),a + pop af + pop bc + ret + + +xE499 push bc ;rom 0, ram 8 + push af + ld bc,#1FFD + ld a,#10 + out (c),a + xor a + ld b,#7F + out (c),a + pop af + pop bc + ret + +;установка заданной плоскости +;bit 2-3,a - номер плоскости +xE4AA ld c,a + ld hl,#0110 + rrca + rrca + and #03 + add a,l + ld l,a + ld l,(hl) + ld l,(hl) + ld a,c + ret + +;определение адреса п/п по номеру +;вх: bit 0-1,a - номер п/п +; hl - адрес таблицы с адресами п/п +;вых: hl - адрес п/п +xE4B8 and #03 + rla + add a,l + ld l,a + jr nc,xE4C0 + inc h +xE4C0 ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ret + +;вызов п/п +xE4C5 ex (sp),hl + inc hl + inc hl + ex (sp),hl + push hl + ld hl,(xE408) + ex (sp),hl + ret + +;bc =#7FFD +;de - заданная страница +xE4CF ld a,e + and #10 + out (c),a + ld b,#1F + ld a,d + and #03 + or #10 + out (c),a ;rom пользователя, ram 8 + ex af,af' + jr c,xE4E1 + ld a,(hl) +xE4E1 ld (hl),a + ex af,af' + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + jp rom2_x05A1 ;rom 2 + + + + +;АДРЕС: #E4F0 +;сохранение/восстановление стэка из окна [#0000..#3FFF] +;вх: hl' - адрес вершины стэка +; de' - буфер для сохранения +; bc' - размер для сохранения +; de - страница при входе +; bc=#7ffd +; cy'=0 сохранять +; =1 восстанавливать +;вых: hl - адрес вершины стэка+n +; de - буфер для сохранения+n +; +xE4F0 ld a,e + and #10 + out (c),a ;ram 0/8 + ld b,#1F + ld a,d + and #03 + or #10 + out (c),a ;rom при входе, ram 8 + exx + ex af,af' + jr nc,xE503 ;сохраняем + ex de,hl +xE503 ldir + jr nc,xE508 +xE507 ex de,hl +xE508 ex af,af' + exx + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + exx + ret + +;обработчик прерываний im 2 +xE516 xor a +xE517 ei +xE518 ret + +xE519 ei + inc a +xE51B db #32 + +xE51C call #0000;x0212 + ret + +xE520 ld (xE518),a +xE523 ld a,#FB ;ei + ld (xE517),a + im 1 + jp #0000;xF300;x025E + +xE52D equ #E52D ;8 блоков по 11 байт breackpoints + ;+#00 0-1,=nn номер типа ловушки + ; 6,=1 ловушка задана + ; 7,=1 ловушка активна + ;+#01 номер страницы в которой установлена ловушка + ;+#02 адрес ловушки (2 байта) + ;+#04 + ;+#05 начальное значение счетчика проходов по ловушке (2 байта) + ;+#07 текущее значение счетчика проходов (2 байта) + ;+#09 + ;+#0A +xE538 +xE543 +xE54E +xE559 +xE564 +xE56F +xE57A +xE585 equ #E585 ;буфер для установки ловушки + ;+0 #C0+тип ловушки + ;+1 номер страницы ловушки 5,=1 задана в команде 5,=0 текущая страница + ;+2/3 адрес ловушки + ;+4 + ;+5/6 количество проходов + ;+7/8 количество проходов + ;+9 =#00 + ;+10 =#00 +xE590 equ #E590 ;#15 описатель текущего дисковода +xE5A5 equ #E5A5 ;2 head * sector активного HDD +xE5A7 equ #E5A7 ;2 +xE5A9 equ #E5A9 ;#100 каталог ROM-диска + ; временные буферы + ;#200 буфер для чтения сектора HDD +xE6A9 equ #E6A9 ;#100 буфер +xE7A9 equ #E7A9 ;#1C буфер fcb +xE7B2=xE7A9+#09 ;2 адрес начала области памяти при сохранении экрана на диск +xE7BE=xE7A9+#15 ;2 =xE8A9 адрес памяти для копирования из ROM-disk +xE7C5 equ #E7C5 ;2 координаты следующего блока файла ROM-disk + ; текущий адрес на диске (сектор, дорожка) +xE7C7 equ #E7C7 ;#10? строка пути к образу диска +;x +xE7DB equ #E7DB ;6+6 имя полдарздела + имя раздела +xE7E7 +xE81B equ #E81B ;#10 описатель раздела MFS + ; заголовок подраздела, при выборе образа +;x +xE8A9 equ #E8A9 ;#100 первый параграф файла ROM-disk + ; буфер для дисковых операций + ; дескриптор подраздела +xE8E9 equ #E8E9 ;#70 битовая карта параграфов. по 8 байт на страницу + ; =0 параграф пустой +xE9A9 equ #E9A9 ;#14 буфер программы анализатора + ; для зарезервированных слов анализатора st0-st9 +xE9BD equ #E9BD ;#14 адреса ловушек + ; для зарезервированных слов анализатора br0-br9 +xE9D1 equ #E9D1 ;2 адрес начала параметров-слов в программе анализатора +xE9D3 equ #E9D3 ;2 адрес конца названия слова в программе (указывает на #01) +xE9D5 equ #E9D5 ;2 адрес первой ячейки переопределяемого слова +xE9D7 equ #E9D7 ;2 адрес конца названия переопределенного слова в программе (указывает на #01) +x +xE9D9 equ #E9D9 ;2 адрес начала стэка анализатора +xE9DB equ #E9DB ;2 адрес вершины стэка анализатора (адрес первой свободной ячейки) + ; стэк анализатора растет вверх!!! +xE9DD equ #E9DD ;2 для сохранения SP в анализаторе +xE9DF equ #E9DF ;2 для временного сохранения регистров + ; +xE9E1 equ #E9E1 ;2 адрес таблицы со списком процедур для п/п x2028 +xE9E3 equ #E9E3 ;2 номер записи каталога ROM-disk, с которой начинаем печать +xE9E5 equ #E9E5 ;2 адрес шрифта +xE9E7 equ #E9E7 ;4 смещение от начала образа в секторах (512b) +1 + ; размер создаваемого раздела в секторах +xE9EB equ #E9EB ;4 4 байта из дескриптора xE591 + ; смещение первого сектора выбранного подраздела MFS/образа в подразделе +xE9EF equ #E9EF ;1 смещение ширина поля в символах от края окна для переименования раздела HDD +xE9F0 equ #E9F0 ;1 ширина в символах окна для переименования раздела HDD +xE9F1 equ #E9F1 ;1 номер дисковода +xE9F2 equ #E9F2 ;1 номер дисковода (пользовательский для rst 8: db #81) +xE9F3 equ #E9F3 ;2 адрес блока описателей дисковода +xE9F5 equ #E9F5 ;#15 описатель дисковода A + ; +#00 код подраздела (для образа =#01) + ; 2-0,=??? тип подраздела + ; 4,=1 подключен раздел TR-DOS (не образ) + ; 5,=1 образ защищен от записи + ; =#00 - реальный дисковод + ; +#01 4 адрес первого сектора подраздела/образа + ; +#05 4 адрес последнего сектора подраздела/образа + ; +#09 6 имя подраздела + ; 6 имя диска в подразделе +xEA0A equ #EA0A ;#15 описатель дисковода B +xEA1F equ #EA1F ;#15 описатель дисковода C +xEA34 equ #EA34 ;#15 описатель дисковода D +xEA49 equ #EA49 ;#15 описатель дисковода A (пользовательский для rst 8: db #81) +xEA5E equ #EA5E ;#15 описатель дисковода B (пользовательский для rst 8: db #81) +xEA73 equ #EA73 ;#15 описатель дисковода C (пользовательский для rst 8: db #81) +xEA88 equ #EA88 ;#15 описатель дисковода D (пользовательский для rst 8: db #81) +xEA9D equ #EA9D ;буфер для определения последовательного порта/модема +;переменные код 6 ??? +xEAED equ #EAED ;8 список атрибутов Ink для печати опций меню +xEAF5 equ #EAF5 ;#100 признак целостности страницы (байты от #100 до #00) +xEBF5 equ #EBF5 ;#400 буфер для загрузки/записи + ; буфер для первых двух секторов раздела MFS (каталога подразделов) + ; буфер для таблицы секторов пользователя +xEFF5 equ #EFF5 ;#200 буфер для чтения сектора с винчестера +xF1F5 +xF6C0 equ #F6C0 ;#100 программа анализатора +xF7C0 equ #F7C0 ;шрифт 2048 + +;переменные код 4 +;переменные дисковой BIOS +xFFC0 equ #FFC0 ;+00 1 MFM максимальное число секторов на дорожке для сектора 128 +xFFC1 equ #FFC1 ;+01 1 MFM максимальное число секторов на дорожке для сектора 256 +xFFC2 equ #FFC2 ;+02 1 MFM максимальное число секторов на дорожке для сектора 512 +xFFC3 equ #FFC3 ;+03 1 MFM максимальное число секторов на дорожке для сектора 1024 +xFFC4 equ #FFC4 ;+04 1 FM максимальное число секторов на дорожке для сектора 128 +xFFC5 equ #FFC5 ;+05 1 FM максимальное число секторов на дорожке для сектора 256 +xFFC6 equ #FFC6 ;+06 1 FM максимальное число секторов на дорожке для сектора 512 +xFFC7 equ #FFC7 ;+07 1 FM максимальное число секторов на дорожке для сектора 1024 +xFFC8 equ #FFC8 ; 2 адрес таблицы с количеством секторов на дорожке +xFFCA equ #FFCA ;+0A 1 номер текущего дисковода: 0 - дисковода А, 1 - В +xFFCB equ #FFCB ;+0B 1 количество попыток считывания при ошибке, начальное значение 3 +xFFCC equ #FFCC ;+0C 1 коды, определяющие тип дисковода (спецификацию) А + ; =#FF - еще не инициализирован??? + ; =#E0 - если подключен образ диска (без защиты от записи) + ; =#C0/#00 - для реальных дисководов A-B/C-D + ; 0-1, -время перемещения на шаг + ; 1, + ; 4, + ; 5,-0/1 образ не подключен/подключен + ; 6,=0/1 дисковод на 40/80 дорожек + ; 7,=0/1 односторонний/двустронний дисковод +xFFCD equ #FFCD ;+0D 1 коды, определяющие тип дисковода (спецификацию) B +xFFCE equ #FFCE ;+0E 1 коды, определяющие тип дисковода (спецификацию) C +xFFCF equ #FFCF ;+0F 1 коды, определяющие тип дисковода (спецификацию) D +xFFD0 equ #FFD0 ;+10 1 коды, определяющие тип дискеты в дисководе А + ; 0-1,=00/01/10/11 размер сектора в байтах 128/256/512/1024 + ; 2,=1 диск 40 работает на дисководе 80 + ; 5,=0/1 40/80 дорожек на диске + ; 6,=0/1 метод записи FM/MFM + ; 7,=0/1 односторонняя/двустронняя дискета +xFFD1 equ #FFD1 ;+11 1 код, определяющий тип дискеты в дисководе В +xFFD2 equ #FFD2 ;+12 1 код, определяющий тип дискеты в дисководе C +xFFD3 equ #FFD2 ;+13 1 код, определяющий тип дискеты в дисководе D +xFFD4 equ #FFD4 ;+14 1 текущий номер дорожки для дисковода A +xFFD5 equ #FFD5 ;+15 1 текущий номер дорожки для дисковода B +xFFD6 equ #FFD6 ;+16 1 текущий номер дорожки для дисковода C +xFFD7 equ #FFD7 ;+17 1 текущий номер дорожки для дисковода D +xFFD8 equ #FFD8 ;+18 1 код time-out для дисковода А +xFFD9 equ #FFD9 ;+19 1 код time-out для дисковода В +xFFDA equ #FFDA ;+1A 1 код time-out для дисковода C +xFFDB equ #FFDB ;+1B 1 код time-out для дисковода D +xFFDC equ #FFDC ;+1C 0,=0 при вызове функций #00-#13 R8DOS + ; 4,=0 после завершения функций #00..#13 R8DOS + ; =1 текущий диск инициализирован + ; головка на заданной дорожке + ; =1/0 головка на нижней/верхней стороне диска + ; 5,=1/0 работа с дисководами монитора/пользователя + ; 6,=0 при инициализации + ; 7,=1 к текущему дисководу подключен образ +xFFDD equ #FFDD ;+1D 1 код ошибки дискового интерпретатора + ; =#FF при вызове функций #00-#13 R8DOS + ; =#01 нет диска в дисководе + ; =#02 попытка записи на защищенную дискету + ; =#03 нажата Break + ; =#04 ошибка при чтении или записи сектора функциями 5 или 6 + ; =#05 ошибка позицирования (не соответствует номер дорожки) + ; =#06 ошибка позицирования (не считался адресной маркер дорожки/сектора) + ; =#07 неверный номер сектора + ; =#08 ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) + ; ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) + ; =#09 неформатированная дискета (функции 7, 8) + ; =#10 дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - 10h (функция 8) + ; =#11 несовпадение кода типа дискеты TR - DOS реальному формату + ; =#12 не открыт рабочий буфер (функция 8) + ; =#14 были ошибки при чтении/записи дорожки (функции 12, 13) + ; =#21 ошибка образа диска + ; =#22 сектор за пределами образа диска + ; =#3F дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора + ; =#45 неверный путь + ; =#46 конец файла + ; =#48 файл не найден + ; =#49 попытка записи после конца файла + ; =#4A попытка чтения из файла открытого на запись + ; попытка записи в файл открытого на чтение + ; =#50 HDD не вышел в готовность + ; =#55 ошибка заголовка файла zs-snap + ; =#56 нет раздела MFS/винчестер не найден + ; =#57 не прочитался сектор идентификации + ; =#57 ошибки при чтении с HDD + ; =#58 ошибка в секторе идентификации + ; =#61 HDD не вышел в готовность к принятию команды + ; =#62 HDD не вышел в готовность к передаче данных + ; =#63 раздел MFS не найден + ; =#66 путь не найден + ; =#67 к дисководу образ не примонтирован + ; =#FD размер сектора не соответствует (для образа диска) +xFFDE equ #FFDE ;2 адрес стэка при вызове функций #00-#13 R8DOS +xFFE0 equ #FFE0 ;1 количество секторов на дорожке +xFFE1 equ #FFE1 ;1 =#80/#A0 чтение/запись группы секторов +xFFE2 equ #FFE2 ;2 адрес в памяти для чтения/записи группы секторов + ; текущий адрес записи при формировании таблицы секторов на дискете +xFFE4 equ #FFE4 ;2 начальные дорожка и сектор для чтения/записи группы секторов + ; текущий адрес в записи при формировании таблицы секторов на дискете +xFFE6 equ #FFE6 ;1 количество секторов для чтения/записи + ; код при формировании таблицы секторов на дискете +xFFE7 equ #FFE7 ;2 адрес рабочего буфера для функции 8 +xFFE9 equ #FFE9 ;6 буфер для чтения заголовка сектора + ; +0 номер дорожки + ; +1 номер стороны + ; +2 номер сектора + ; +3 длина сектора 0/1/2/3 + ; +4/5 констрольный код +xFFED equ #FFED ;2 размер сектора в байтах +xFFEF equ #FFEF ;1 ret для вызова п/п опроса Break из rom 5 + ;1 код последней команды ВГ93 + ;1 для временного сохранения регистра A при вызове функции R8DOS +xFFF0 equ #FFF0 ;2 адрес рабочего буфера для функции 8 +;x + + +/* +окно пользователя: ++00 координата Y курсора в окне ++01 координата X курсора в окне ++02 координата Y начала окна (в знакоместах) ++03 координата X начала окна (в знакоместах) ++04 высота окна в знакоместах ++05 ширина окна в знакоместах ++06 цифровые атрибуты окна ++07 системные атрибуты окна: + 7-6,??? + 5 Запрет вывода, все выводимые символы игнорируются + 4 Произвольный формат, по достижению правого края окна будут автоматически + выполнены команды перевода строки и возврат каретки + 3 Выполнять автоматический возврат каретки при приходе символа перевода + строки + 2 Выполнять автоматический перевод строки при приходе символа возврат + каретки + 1 Изменять атрибуты при выводе каждого символа (в противном случае атрибуты + устанавливаются только во время очистки окна) + 0 Не выводить символ курсора ++08 + 5-3, номер рамки + 7,=0 нет рамки вокруг окна ++09 атрибуты рамки ++0A размер символов в пикселях 6/8 ++0B размер окна в символах. Для символов в 8 точек этот размер совпадает с + шириной окна. Если размер символа 6 точек, то перед инициализацией + (очисткой) необходимо рассчитать размер окна и поместить в этот байт. ++0C код символа курсора. Код с этим символом будет выводиться вместе, отмечая + положение курсора, если сброшен 0 бит в системных атрибутах окна ++0D 1,=0/1 режим вставки/замены при вводе строки + +*/ + +/* +точки останова (ловушки) ++00 1,=1 ловушка задана но не активна + 7,=0 ловушка не задана ++01 логический номер страницы, где стоит ловушка ++02/03 адрес ловушки ++03 ++04 состояние памяти пользователя по адресу ловушки ++05/06 ++07/08 адрес ++09 ++0A +*/ + + +/*дескриптор файла: fcb + ++#00 8 имя файла ++#08 1 тип файла ++#09 2 при типе C стартовый адрес, при типе B длина бейсик-программы ++#0B 2 длина файла ++#0D 1 объем файла в секторах ++#0E 1 номер первого сектора файла ++#0F 1 номер первой дорожки файла ++#10 ++#13 2 указатель в файле ++#15 2 адрес буфера dma ++#17 1 b - способ открытия + 0-1,=11 файл для модификации + 0,=1 файл для чтения + 1,=1 файл для записи + 2,=1 обмен целыми секторами "физический" файл + (если сброшен - обмен будет вестись байтами "логический" файл) + 7,=1 файл был изменен, но не сохранен ++#18 1 номер текущего дисковода ++#19 1 номер файла на диске ++#1A 1 кол-во секторов для чтения/записи ++#1B 1 максимальный объем файла в секторах + + +*/ + + +/* Формат таблицы расположения секторов. + ++0 Идентификационный байт + #00 - информация о секторе достоверна + #FF - информация о секторе не достоверна (сбойный сектор) + #FE - конец таблицы секторов + #FD и #FC - см. функцию 12 ++1 Физический номер дорожки (0:х) ++2 Номер стороны (0/1) ++3 Номер сектора (1:х) ++4 Код длины сектора + 00 - 128 + 01 - 256 + 02 - 512 + 03 - 1024 +*/ + +/* описатель дисковода (для примонтированных образов) + ++00 =#00 ничего не подмонтировано + =#01 что-то подмонтировано + + +*/ + +/* описатель подраздела раздела MFS + ++00 0-2,=nnn тип подраздела + 7,=1 при печати типа подраздела перед ним печатать "*" ++01 4 смещение первого сектора подраздела ++05 ++06 размер подраздела ++0A 6 имя подраздела + +*/ + +/* описатель подраздела MFS/ + ++00 0-2,=nnn тип подраздела + 7,=1 при печати типа подраздела перед ним печатать "*" ++01 4 смещение первого сектора от начала винчестера (LBA адрес) ++05 для образа =#00 ++06 2 размер подраздела ++08 2 ++0A 6 имя подраздела + +*/ + +/* структура HDD + +сектор 1 - MBR +сектор 3 - данные примонтированных образов + +*/ + + +/* структура раздела MFS + +2 сектора каталог подразделов +n подраздел +n подраздел +n подраздел + + структура подраздела MFS +2 сектора каталог образов дисков +501 секторов на каждый образ (1й сектор пустой) + +*/ + + +/* сектор 3. примонтированне разделы/образы ++#00 1 тип подраздела/образа (для образа =#01) + =#00 ничего не примонтировано ++#01 4 смещение первого сектора от начала винчестера (LBA адрес) ++#05 1 тип подраздела/образа (для образа =#01) ++#06 4 размер подраздела/образа ++#0A 6 имя подраздела ++#10 6 если это подраздел, то имя подраздела + 6 если это образ, то имя образа + +*/ + + + +/* +Формат таблицы расположения секторов. ++0 Идентификационный байт + =#00 - информация о секторе достоверна + =#FF - информация о секторе не достоверна (сбойный сектор) + =#FE - конец таблицы секторов + =#FD/#FC - см. функцию 12 ++1 Физический номер дорожки (0..х) ++2 Номер стороны (0/1) ++3 Номер сектора (1..х) ++4 Код длины сектора + =#00 - 128 + =#01 - 256 + =#02 - 512 + =#03 - 1024 + +*/ + + +/* формат заголовка zs-snap ++#00 =#4D/#41 без компрессии/с компрессией ++#01 =#33 сигнатура с загрузкой регистров AY + =#31 сигнатура без загрузки регистров AY ++#02 (xDD69) 2 адрес текущей ячейки в дампе памяти ++#04 (xDD6B) 2 адрес возврата из монитора/ pc программы пользователя ++#06 (xDD6D) 2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке ++#08 (xDD6F) 2 регистр ix ++#0A (xDD71) 2 регистр iy ++#0C (xDD73) 2 регистр hl ++#0E (xDD75) 2 регистр de ++#10 (xDD77) 2 регистр bc ++#12 (xDD79) 2 регистр hl' ++#14 (xDD7B) 2 регистр de' ++#16 (xDD7D) 2 регистр bc' ++#18 (xDD7F) 2 регистр af ++#1A (xDD81) 2 регистр af' ++#1C (xDD83) 2 регистр r и флаг IFFF2 ++#1E (xDD85) 1 регистр i ++#1F (xDD86) 1 номер rom откуда зашли ++#20 (xE02D) 1 переменная =iy+#19 ++#21 =#00/#01 режим прерываний im 2/im 1 ++#22 цвет paper #5800 (для установки бордюра) ++#23 содержимое регистра 7 AY ++#24 состояние порта #7FFD ++#25 состояние порта #1FFD ++#26 регистр #00 ay ++#27 регистр #01 ay ++#28 регистр #02 ay ++#29 регистр #03 ay ++#2A регистр #04 ay ++#2B регистр #05 ay ++#2C регистр #06 ay ++#2D регистр #08 ay ++#2E регистр #09 ay ++#2F регистр #0A ay ++#30 регистр #0B ay ++#31 регистр #0C ay ++#32 регистр #0D ay ++#33..+#3F не используется +при записи без компрессии ++#40 битовая карта параграфов страниц + по 8 байт на страницу + последовательность соответствует порядку записи страниц + если бит =0 параграф пустой (не сохраняется, при загрузке забивается нулями) +при записи с запаковкой страниц ++#40 размер запакованных страниц + по 8 байт на страницу + +0 количество байт в последнем секторе страницы (=#00 - 256 байт) + +1 количество секторов занимаемых страницей + +2..+7 не используется ++#B0..+#FF не используется + +порядок сохранения страниц: для 48k режима +ram #02 +ram #05 +ram страница включенная при входе в монитор + +порядок сохранения страниц: для 128-256k режима +ram #02 +ram #05 +ram страница включенная при входе в монитор +ram #00-#0F (кроме 8й, 9й и уже сохраненных) + + + +*/ + +/* структура программы в анализаторе +2 #mmmm адрес начала следующего слова +n #80+"W"+"ORD" +1 #01 +2 #nnnn адрес конца слова в словаре (указывает на #00) +2 x2340 (xE024) #????(число) +2 #.... +2 #nnnn адрес конца слова в словаре (указывает на #00) +2 x225D п/п прерывания выполнения слова + +#0000 конец слова + +*/ + diff --git a/ProfRom_Disasm/!roms.mac b/ProfRom_Disasm/!roms.mac new file mode 100755 index 0000000..44d1f70 --- /dev/null +++ b/ProfRom_Disasm/!roms.mac @@ -0,0 +1,56 @@ + DEVICE ZXSPECTRUM128 + org #4000 + + defarray nKeys #1A,#1B,#1C,#1D,#1E,#1F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#00,#01,#02,#03,#04,#05,#06,#07,#08,#09,#0A,#0B,#0C,#0D,#0E,#0F,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19 + +/* +;текст слова анализатора + MACRO Word text +;.nTxt = $ +; db text +;.eTxt = $ +; org .nTxt + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA +; org .eTxt + ENDM +*/ + +;текст слова анализатора + MACRO Word text + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA + ENDM + + +;дескриптор опции +;=0 цифра/буква выбора опции 0-5/A-Z +;=1 номер атрибутов в таблице +;=2 адрес п/п определения доступности опции +;=3 адрес п/п + MACRO dOption Key, nAttr, Proc1, Proc2 +.tKey DEFL Key-#30 + db nAttr*#20+nKeys[.tKey] + db (Proc1-#8DD)/#100*#04+(Proc2-#468)/#100*#10 + db (Proc1-#8DD)%#100 + db (Proc2-#468)%#100 + ENDM + + +; dOption "0",0,#947,#533 + +/* +.nTxt1 equ $ + db "TEXT" +.eTxt1 equ $ + org .nTxt1 + LUA + sj.add_byte(sj.get_byte(sj.current_address) + 128) + ENDLUA + org .eTxt1 +*/ + + Word "NOP1" + diff --git a/ProfRom_Disasm/ROM_MAP.TXT b/ProfRom_Disasm/ROM_MAP.TXT new file mode 100644 index 0000000..73cb8f4 --- /dev/null +++ b/ProfRom_Disasm/ROM_MAP.TXT @@ -0,0 +1,38 @@ +ROM MAP +| --- | --------------- | ------- | +| № | File Name | Address | +| --- | --------------- | ------- | +| 0 | rom0.a80 | 0x0000 | +| 1 | | 0x4000 | +| 2 | rom2_SrvMon.a80 | 0x8000 | +| 3 | rom3_trdos.a80 | 0xC000 | +| 4 | rom4.a80 | 1x0000 | +| 5 | rom5.a80 | 1x4000 | +| 6 | rom6.a80 | 1x8000 | +| 7 | rom7.a80 | 1xC000 | +| 8 | | 2x0000 | +| 9 | | 2x4000 | +| A | | 2x8000 | +| B | | 2xC000 | +| C | | 3x0000 | +| D | | 3x4000 | +| E | | 3x8000 | +| F | | 3xC000 | +| 10 | rom0.a80 | 4x0000 | +| 11 | | 4x4000 | +| 12 | rom2_SrvMon.a80 | 4x8000 | +| 13 | rom3_trdos.a80 | 4xC000 | +| 14 | | 5x0000 | +| 15 | | 5x4000 | +| 16 | | 5x8000 | +| 17 | | 5xC000 | +| 18 | | 6x0000 | +| 19 | | 6x4000 | +| 1A | | 6x8000 | +| 1B | | 6xC000 | +| 1C | | 7x0000 | +| 1D | | 7x4000 | +| 1E | | 7x8000 | +| 1F | | 7xC000 | +| 20 | | | +| --- | --------------- | ------- | diff --git a/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin new file mode 100755 index 0000000000000000000000000000000000000000..00ab98fa3b03d038406c9fd70c264e15b770f41e GIT binary patch literal 12800 zcmc(ld0Z3c+V}6t9@d!z!hj0*BuE3egjA8H5(8@0x)8;!E)}X#0+@s>BrIZPlCX(N zwTtcPLTh_US7@z=YOR8nmPpe_PsIa0O-qiAwWT?QS}e8_-kY9&-p~7apXdGi&2Y_4 zW|B!VncUa)`~I%A_X7Z&pa`x1`wd&d8OFdA{@?ffKetT%apV6_`$zw$jsL&5-KId% zU2O7TuUZnS8les{z6WVyzZyWJ%{WjpYVtxzDZ)Owsru>P~u#d9R1lay?sIy0nhpIXV4!|P7e=$mrLHU9~ zeMxz72X&%EdTEEc^^1dF?83g83Kj8w50!93j*lSk3CLE8D}07(>YUS;uUCmHy5vHi zw}g_==q}Yfy}q>fpak%@ZQZnP+bS)TZ%Bs^hiVW2NpW&NMuLMMGEYVva z`qNoVy50KXa;V#*w@$xvli66Q-=o_D_Zra~&|9o#{bRQ2J;fGiDmGi8aW5>~Z8V#v zAH1y)Di>z|=alHp`?nOEbuiy(uvxUlW%Ht=AzZZ=RvB%uq_`4&Dnk{lu<0z*2eUwQ z^xek&`*jAZ1r|SMv{|G7Ji&9|?&9)tXf?uOo3+GfRz>4c|NXq7jiwT#L8pS5i{|EJ zDd#F5cwp}R3$m1G$6oy&w8yG~O4UNe{fhbbXDjDrflolasd2Ee-2?>giS~&>An<4> zCQJ|{Gti_ExJ~U75TxKZ6o4c=r2$M#3=U3A;CYNzi$l*uV|#le!0SoU)Y@8vZ*?`I zXFlx7k>|i7fWPQi=~y{92td0@+o(0Q184W}=y10a;0n{INrA&6yt+rr04-23?Iqpv zMgWSOMd&zSJp(}ZsP;a30=9NTaD;|1#|;$|3iyGmXrc(dL_6UN9-tjWZ@2)zqWMKJ zydG052NU>gT)|9e0UHBPjJAzxM>U|e6>3^r0noH*uC(DKt-Q6adH`^!ae_ftYv&b0&Y%zTDdzMPwcec(qS0!0gZmP6p59hW1o<|PCF?8PM}v{4bw1hIG+P>tdn@wU4)xj*?@KuMHpa! z34F)K!9r{saT>I5_#NAMv5gtU6+f{CFSc`> z3IQzuw_HV9Eyq#c*x1+J-dAyj8OB-9vIae^?YG+7MV&+e)tEJb8M9iM?lv}Ciql0h zQUv1c`5+6EDriV`6BwtR!l>4)3E~mz7QHoZVrfyugjC>a2kkh=1KPFiTAbtR94rBB zrgN|l(!&})6cU?e&*1VE0xij0!C~UZ+BiyqqkrQZMDN1WVCBMb%~l5HESu7iTJruX zcB%$y6Yxati}Y57(Y00MNL$W0Gzx+qRAjNY(}Nm_r;E!ZX*k45+^E25?ebOtH73oc za0@i0y{d5Fdd+uGjz6t=SMv{$E{XhjBKssWG0{8Ro1>j+rI(H_@LIGYn)4Os`voOZ zn&p(f6u(v6m;fL;QDQw^Byvt~OD01>hLm+E$=lzLnNKR^$RekiCj?hSu;@ zlG$myz>e7$=+U$q7u1YO?EE&meKzECWpdufv?&|#FYvFpS_da)o9M=bHm);4y|+p9 zQ~So4ji0k3HV>u?4h~c7wi|4&G^0eI2IIaZB?4t)iEnWUHK!za37nu+AjY+%WK0p? zF7UoaVvBq)8O9qLjAtqj6qKdH`Y$VjF#zB02sLFT7;02i{1szI! zr!sbDu2Qu_FiEL)1gY~SH$s-&9X@gH?LcVhlO-Ud69d3|V_aQ^@}@faoII)H9OSC; zkK}|p;V}V89u^Zmop&Ied0NB|wWVG@$-nF>(m446x|@IL7+48c zYE~Albgpb$*}ZajCD8IRUeXq6o!T~Sx3>48f-0Z06#q@uQzz@{3rEN&!V(x&2Od5w zt5Y5*m65l?(J;OPY;&s)lr9D$Pnd)Q9U$p2`CnlHj8fH>cFB8lK~)QRA&f(g8j^2? z36v^)2K*)CD~d(g8pmK^ZmyR{~;I zDLEuvr^s+GFD3c#e&&HvFrT3|;ykeM@i3G}grnuWo8N>B;ZOT+1WgY;Ip&3{3>F>A zvKFJwyjwS&fXlk)(LkGUXwP)!G!#!~&!U;2x^b-$CEK}kp*HIAxpIYKcKTdUXe!>V zn`_WH!1|`$X2YE222@2T@RoADK{uyxuBA+Gnio-XVQR`B3=Z^$w%3+s)RlIHHjJl% z(sYbhCajZfP6K7>=~#A|@Nc_h>tuDZy~Z)W(Vqs?0J78*$}6S*chdc6>BT^iU)aMF z^!n?-zky$t7X$k5>nHHvRwTXpu1K8pN~dT>Tn|2stvotMt^5cI=Ydo;c@APatkBbQ zHQ*0aO#Wxdn>;zJ1p@vQU{5T;cs)}X7LH|cMh~+2t|>O_UJ8dhJjDf&o(|rh!AGOu z&k&+90%-n-NHk7I6pH9SBL zM0NT4tKD3UK1I@^KnW+ z`B;~Hc$@+lfdk*I^06>We$^ki+7m#}Z1DOvluOv-fcI?A2k>@09Pje_ipqz4M_9gO z_RwI57ZYmWwpY9>)CW;9$8yNC!wPwPSSgg<)Sfx{n90D++{l-d&VNmO4A_K6(0@Pv5S~Sh54u z9C-BL+|1m0a~_m}#kK04^Fh&e)$IfQx&68GZ?X$`09EbfexW*Edw~-b4JTukaN)$i z@h`&53i|g!LG`J=s;4Ge;>pIKzJi4R6`y=^E_nXzi|R}zK8dVWMceR^*lx- zR>Zt4?htvyP6ay*uc()J2mBQ*zllB470Mq%*?R5rAq5u*j*;=ayE``~4uu{b!tbUJ zg-VAY*K@V{6y$*W8ob!lRA|ExSnv{C@vFYbU)$AP8)gqe&Vlf)LFzlUSD@wz21qDS za{=EyU!dloIa94>gE-g2Y8FUxtyg0JKD%`wc|O+tk?`};nK{3O^1mJ}sJSW4uy&c6rTokY2)9&a41gThyQUtH40N8*28BSVNx^s0Dc~9dlW^`+Le*!+uFrlo zkx_)(m*^L>#_xQyG_yrD0g2Y>1E2FH0nKjYh&lEe1BYmBVw?EUOr zqYrHFfg@u+)^=?o5H-Nt0WbBrQNnXo8ppHw?y)}fjlRfa0WSHZSAr#MG3%{5xVP9= zZiPCt*=XjTXDapFfv2?_)nH2L zr0i|U40?$~bgb6@4lvgE-@*1(``=;h@^5Big)Q()>3LJAu*Won^8R8P{Zc%K3_a0N zq9~fjQqX~XUK6*%tDfrm_yIFF;xCZ=LkN%i_L#A6ehWG7+*>Ta<=bk>DHz8SpZj>d zdCX7sSMX-~&jXm{-^=nFu-g7}2+St?Qpc>wldjXph~uNLB8r0 zTke^huYK#y>fiqPO-hcycj`i=FU3qgmy+|lFWyexS^sX$ivF54Rh8?Um3g_=4c}Qd zMp~E6vM!fe3+G!4KC`UlS+}jVYVTR|<87Nhv~4-*w`H5g7dN?ed8V$^@s#5!!BgauP4kVl^Y`%tNpA~E>9+*>!}xg5)v#4t;uT4&7d zqkgN&m8VjLMluE9o~~|Hp%LKP$oeqrN*A>^>c(+uqoHnbn4N=l*f0InL9H{Aqeb(d z@1`hI-F!QFld3k5cc{z*K1XfN5aK`NH7XlMw|s_ZkngV!mB$c+aWzZ~$z9&+^Hi&+ zlxHfH$88j5;t3>4uHUI}+&eDnvNh=}^R<=xtcL>K7|z+>^omU?t_&@eRElz+o~V@G zuu;i2Q*{^Q)`Vknu!S}6!6>l0!MCT9I%~ZYG4bY}O4XUlu8+BuK4)derEjegX~a4s zoW@6c_2oJXkihstT{(g~aGo|kBC{!G1<6%@V~uh2G#oXifpp^9)77y zeldB9pQxbdYaq{!MFU}4DI*tx0$PTpG2|(jHs4KSYm!i=I$^Xu}9r>Qa20h{EAlsc{nbictFkLMfZ*ajY3sF*0UHN^tTXGTF=k8xU1C^^r2-L3_qT zCGW2;D#y+`$}%LV+!kH=JgL(yx1@vo)t*-z(x)8QWJ756H&z}H_N3SM-|PPci^BR3 zz3d3JO)qsZ0@BemvO{{@?x%oLsB{sSDPlhp>XfCrhcPaTeCF`0j0C5oH z*ZYOOl>LFEC+q8E;d~gGQc25t#BP!+lcl(hSI?X!#}=QLvo|LLnco8ZW-Rt79pvw! zF^+|Kl*NyA4futi@QAN_zrT(ZhLGdWW+^yNFn&9TIK-ak&*skdXY)V?c&6FL_ge+3 zR~>#k#|~`=bq$cZ}rzFeSs+7V`bdCb0SE`v@$ zPwWSD2WPG8lHEGvpPVll$|*eCETmqp%9XRJ$E#u^;(l_&Na_?G^$hh>6k@{ zG;8Qd_-ON96E$Ad1=-YHSX}>2m5MTTfm-?&G%Xlp9ypk?n~9I)3LAZnDk>pL^#T+! z9s>|IpO;5;D60)rNj2v}(m#$sF14|m{F%~Jlc7)YVz2P(T#^`Wtei0ybGnv&S|7u$ z)a&f2y|g9q1d!6!Sm%P9kYL38*ex!d&Hy7_CbK?e7cOy?8~3H&0hDKtSzoEca~mRr z#g^TAJuW=-nBD*+m=K={48ot7y?bLnc$_7KmW@^AIu$P5Z``0mC`#-xR_Zp`RS(5K z^0*2DyWUy?i!EiqpsUoGljeGg%k9Ng;Kk!W!i(Oc-@8|5MxYkLWk`;4o11yj&|0E{ zmg4=ujmJUxvp5bqz6eu5Ltq*VkoHg~HpR+b5$g2j-DbGL$d>vJ2K2J9Kr#A~VY> zWMg*O2-&FA)(Cf{|Bw;e7=A>a6<#Nwn-Nd{6cL}^;8Dy-$@v$#&lL~m;g(Hr(jMz9taWv_|1H}QN)HF6$RR>Pk$16{fEb0f-KSE!>fnU2Gg z>$y}@4LK}`cZXSUJ%~zZYS?;!00GRw*%$3RG5(pMdThKPw0)wI%C)O8UtGypw=ePl z?_Vxox}EnGfA3)eNJ53Rr34rrz_K_mxH?3EsDqI$E@W+hbsitArJ5m+d9enMqTAqJ z1~bh(2~r!pC29;IA^b70(?tbqXMR{8dEip6HAp5fc?Y8U>40#BOL@AsqCB#u@p@hk zC(Oy2Ur|n#(#jZBw`f+v$pVuO zSsl}E0pk6pa%5@DgIcrBg0Md_1j=+(^T3STbnJt-XFTRX!czVtev{sW|5Z5KEn!71 zV>h|d#J_GP{Yxsikh1XE1U!F=yi*)aKI=dqa`n-ljJ}%b?ZO4o7|rZiE|MwBG$g|V;!U1hE0VCz z4m4vTfPr-=!{$FZ<8+duM#qDQ@%j6~LnwI&$vghK1iQ>%N8;S46Ya7YsARg8YY$A* z$vRo6@IkY31=KVn18-(u(6`7O(5!oz{0bRy#ApS=27+ljizlQ;E3$X>2B{kr{~>PR z;M;ctJ&2;s4#&V)weW-NUGm{<$jQv!MGkTyx*-3~vCGt~59F-uUHB(R_R~<23m$$U zNKj@3C6Ijhezz&>m#z;b)!Av#%*1iMtjne1M z0RnXMSfS4UNNH7YN5&j8O3(a^40Dg{={a*%^UOQs*vt>*?0I0H)M3h)Z8e1Ds;hh*l05|Pno(%h6om8SobU!XatDqh(mED4^o7lk>$6rMQd%Wvv+jr6 z>#L&Vq8JfIx+uy_B+^3cXgwKJABhoQbKDtUBZ~0NliZ4of9+5Ob|@dUh7bOIR%K}W zJhKEJt^aaXrPN{7sL;&fZTDTUBKU)dLMD>0(jHR>LJUX>s}q!+Cg1$ZFm}1p7G_

U7 z{QZU!TgF0j8t6%P6Te#%#agDsM%-;cX_ZH9vVor&YB|hk@|OH*Q-h1lJ{22x1Gvcm z|E0y5O$JbkCfBke2(sL!a^oJ2!nILn(LU&wBuN%$#d<8pa-CX>(B3}IlX7QzZ=GF>*H5IO0q_!n-nm-1_gmfF$<-`bFx2*~p|Uzm!#ly=IN2e9`C^Pcfq3%f0GR8+fX4SZ zp51cQ@ox86|5=1G^H*~p1F45PylO)EMrDWcmrAgV9s;xMdP;&zHOXY%ilSkt033yFqrZRc}tU0PCcz`R9M;Jpb z=E|dSfjf>X=i+!nLSO~TpAPKVdZ3XmwD-aaa1kGdkGayEJxKmxTmY_mI=rF65Xf#- zifgKr8>&$0u;dR+7*|Y_;>ku3CIkTEV&ZXEAS~rf(j%g~hh@?VJ8`kf_t}2xT-Cyy zzl1uex2ws>TsfEWSCc}@ZIr%QO&zY5o~;sZY@|TIcczL`qS9e^HHd1ME-$FdRjJT} zBy&szceH4hi@I5b&!^*H6i3zAP%Uk$mL94GA4vKoAG%rJosV@i+>L!Ah9 z%3@-Z(?XreWDF1BM<0#yZ;nl;An(bB>Jfr9+~GU3-~VWge{-y=r8=V- z&T_X@OPj$gTBMleu1gAYuosVU3L5AJ8j)yfPqmN`4#)7p-pBiA)XBN(45eV$UpM0> zoBEQQ?V*ONl2f476?{w&Zh8EHo=AdU)|gn;dGWTLTCVsMzC|a)x7-z(*|WjZ;CXcE zG*^dKw^Z})b3LQra?@TU*X-Olgmn4FokQ=RmM`JmMFe^qBG4Vv2>R%dg6G;2S`F1* z?{-$B68{#POc)BSZmQ;iAtV?P!A2Ar42c!vBLq2&Bo&o3T!%CjD_bF}%bq8*XT@WT z%lGE~EKWT^4Ex^Ok7=>LzODvg)}ZQ#9m?-_sBZ1(lHW)Duwy|+Fq|n3hK*@c*-5f& z5WLF6#Mm#5U@ElzmmL^SD&@~?2!yF`!*vVz>sUEZGFx*PL1yCX9atlWoL$VC zZE1PSFEFe2$FFheHW}icrwuv#MAuoZM?;;cTCMAn^L%eq%g8&t4emFp)e&HNtIuqI;7mg@I4EZg(U^3_+UI~q06(d*-SGh^O8dGd@ zvvbK1L=xsjGhU3_=pgtDeM9jweFKV^sT<%VeFMM99C)9X3%&w_iff7hSZAV46tM(< zpAKkFyGJsQOfPH82HCh4BJ>vV+N~HRLt9N{bX(LTwZI7#7 zcYGihsIi%5o93wN+Wlx*Mu7DyEUxiKxzQ(g7m=UzFj{^m(n#qaP z^thbzrL08^`K4HDGO#pYo+8)X<149T|JxH0P$IAz#j3Opc3Kk1)ZW1=3k@E^d*Y zUc(p&iKdzt1C4V_^YFF)hTSl&`1e#?5`)a~`$VmhJA0goSnip_gi@f8Ue>XPSbH>&D{#lVr=_ow9=@uCX4yc{Enr zyCh&l$icBA%tz)pi))PhP84#D_XdTVA6Gk{6t1ZA6(F{aq}!Ocmu=G|)ECrk+&P06 zbE`!(mU}hOL*Byvl`@b*rg2wTTHyrBNSN8F!#*9t}`OA35+gNHt zhlaT1wNsNr)6 z&vz4X;vo*}`R>Gp3oh?A4}~5Xs++Wf$;_e9`k_RmyW`^J^Y9dxnivAb%z}lc*$kGp)kLUH}b#cLJF%MOqOlfkP8M3{sT58=NsB#q5| z2AbzWf@-rYpblCVQtg&S{gO+rin(w**d1+4(7P1a2Ay!j?8?SQ2odw$V(ePh70}^cl~ zM&i)m*cch)#60VhSo{>$?cX~^rVh zWuz+l)j5X}?<6pX_^%q}-C+>yQDlLgOb%a@`<#C->Y6E8R@J|_e^xHMs|GYO_9`uE z@XEd+RxvZ=XBE+2lO5RU9Fv_?L<-DQS&39UDV&Q)IEXV*lz+jte~!dw;Bl9*TWGdSm26Etx|# zDK9DuDni>qcgkO43mG0OVqa_*6S%5e=n8cXiS9Nc*ueWisNk}eF>q;0^Mx^68ZP~@ zBCS>WYeib8G;E{h+oUgB)k~CbT2TW)uUVa^{N0KSoL8-?f(q(E3$eh`g&gm_7Gjr$ z%yCgbfiI;YiZ&FjC?14M>4RuwqsT|W2TPyvNzBv+3$fZVK!C?F4e0g7S$YsUISvGj zuaSMp<0LSrEp~P60_-dLD*K`v_@1(|rOl!3zgBdFHuSAs7OSI2xIR~BpeKqrM1ZF# zs|5pC?*LeRi~vsrdVJR{#1u$-s;n;U;dH^+iLfwjA}2FCN-ouBPZ`xqUOFI;zRoGq z_oO$hN&Ah&uk-Ne<7?9Hk=&Kn1!-Zuvet}Ypr69tIMI*ST2iyYY~eZiuShA*B44Ax z;{<30=Riq41&$Nom?FwUECFf9fz`7r-Jm>g(ztQ;oqa|5Z>oVy$+MKDJzkf#GF>`g z&H#Wn8W!dx&Yc7K<<|wgU&xqXQT9~eItPEDp`7<~ky2;C;vROB4AERLL$`4)F?OE9!lV3l&MBhu~Gxz}i%&wBD+Xf@xOBsOL)!0(pu z@Q!*r>IO`tV~BQPUgo2#XC&o{KEZb>u(&Fb#EFOeRID?!T441HC#e{EQaCBhi-|qF zmc$ZKUz$Jjj6AA<8|zxspCoIFpKP>ZlbMs5_&1_GZhr>XiknH@Az7L;vu=Sgoxth% z!TK1yU)(Pu*{*0fuF3JpCS~|FUdoYxw?pZ$@lgMb?_JxMk^glF6e!PG)!?M^q7{hh n%hG;bH`~DfvK6G~!h33P+9;LSP*0@|%xguylQ?a(tnPmSC~bvB literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom4_fnt.bin b/ProfRom_Disasm/prof_roms/rom4_fnt.bin new file mode 100755 index 0000000000000000000000000000000000000000..918007f0f808cc296627ef8348ed290d71c42846 GIT binary patch literal 1211 zcmWO5{cjUx0KoC5bKq@GcY`R!OnL&cMiOZ-#51UzWVqW;9MMVw5v!38vkqwi^rAmbu<_8+Uyf596*U|HAi^uMM1< z&~vTl(m;=Zt*>8>4FN0z<2NI2 zv^I5rCP@Lniy|?IyW^D4O9fP!2(!&KCG7?wolA3h2S62DScTo7zV)DWu(ke$V~9c< zMApGe;2=V-px0RgS&E}tVmp&Zdehd|I7v9c`uCLCT_h$u#~IAL3=YZi?QI^P-%$os}l7c6%R2m4V#MT67*oZp;If~neI9x1LmV`}Z8h{{lv8L+s zlxhEX)9vjVYi{~*k>n+>S=adR7bFNs5bj{KC(S|&D(U}x1l&$m(g%P}20Tey0t{e^ zj_(ic6J4gjWniWB0%%Agr{%y{XELVdo;Fn4yc2WpHYK!1j+8(EUj3LGE4Y4l(zeLG4l{;4ZEFd83|=1Aiq z0qFkYW(JhpmE9N1m{6@kc4f4Tg7#ek$P9CjXW3v;L1<8cx^JGKomfsnsDO~P0|?1n zz)vjpW#jps8UOcLD)YD=Ecu-ZxZ{+-(!Z)kk^JNXrazYSnNEc<{lwge>8?1Hub8qy z7)=XhMO!P@EPsErW=$WcS?_mNf0}wpJ5!Y3Se2=!yoxclvTf3bMg1wgQzr^`ZK_!# z4NEEN6F@OmPwDD@t#RT$?=;!$y1^YSUw`}P`Fw#aZoA>AwG(+yJ19Iav`K9pGSHtj ztdZpP(GdIPB$XBi<24m_c)b+0@1|jU+Ycx0F_9lttRr4`(AxIOH+x1si+j&bc-&S; zyjJDxb7P;|6t&rLZ03Afb!<=6v2WG*TQCtN|9fsaHX|io@1BFXfSnO${QU_j-zvD!Ae<*$vGTFKYQB-pRbAIt308Ak^N!D+lA JF2leD!2f*pt^EK1 literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom4_vars.bin b/ProfRom_Disasm/prof_roms/rom4_vars.bin new file mode 100755 index 0000000000000000000000000000000000000000..2d9e35f8b2ea5f6b510997367b03a207fdab34e5 GIT binary patch literal 371 zcmdTs&l4NFJWMJpz;^AP(W?+*xl=fj@W?+&w zVt@is1_lmB1u#cU!Ge{6flUj<6JuafuwVi4ZiD0m*aX0Gq98e51`eo7kQ|!;tAHg) zr2t3{Xc|}_hXRBrp`ghQGZSd4f*}%*kH*nr&nhWZ2b59B|v|7`sK u;Q!D64Gs+o4FU<~kUjXxk+ z5xn;t+O*PyOWDL9{lgln7SVNa|Jcf;FeQXQ+$bZ!+EQ9?i5N^Bv+5Ag!b;-Zz*Qy&A9hTcxxYZmG4q~< zlZUEHbTtdsamBCRtSvDL0Zm%X(vySAecM50njF_(6RMS8<}Fe!pXooztO!>X4&-e& zM)KcQf7hyeyL0Ymm->V`i7mQPRU`%Xj>h@6P&qd-HWqJttID`4@7|jxycbWtsLLqP z=V!i2{=Qx`ytQihK*;vQ(T@ifkB1nQ88EJWaq-{wWh8R{Q2Ry4;=k_egTm}<8Fy&# zdB*UX@z5+;e`@x7GW{gDwCd0 zGphiew*xG+FSI{z7wuMiHJvpS5$Q>^KXt5uXudJmGmk)A2lZ5!hgY~lkiN9>99Kw< zRQ*$C`l%A_bW!icGLf--)e!$ib7oENNT=@@yU3b5#&h`>)p$IA!|m#GVLCvD@``jt z78Uxup~g=A)d0-;SKWtuhfEE8b{RWgz_@`oJS<>4!u6 z2m>JX80^0eP4M8j$4ng_5DSv+xA=qVuvKB_UZym`-%n?O-oOIv^pp-+hvpAGG4!NB z#N?^1;_3Hxh~Z!C67hX6`BNeUi6D~*XcB%cdq16+Yr;W3ps?`D50bGyktEx@*$iN2 z!9~^b>26DEx7cqv+rXc2756uYkt>I<>|p+wPCE2oC!2N2wlk-TGW=DL?~#XJ za9f#{4@->0aTlMj&?EoG4DByCRKR3ztKYWTh9w&oA>vBE+Zl8(-RyJG1vdvhEuLUI z#kaWq0gty8%a#b1HhL~uxd_XaFMqC-l1jw2p2lXUy9L*HTU~xtv3{KqtoT|1>Jshxr6S;pxZ_N4~K>hBX=`z66^WQ^2k1_=$3LIGDaQ+7&ZcHh z0O{in_}q;iXA8Prp5RR6KEHRr$K`fmla~hI2?YI~ouL_yGk`v)KZxEY+}P;#`(}i< zZA43X#eh!zu1#fF8U~}$SVlpAFZo+nN2%DYzX;!W6xG&@m%oqzGwchC6 zyVu!NDlALNU;qYeM*t>a5=ppTYQrbPDKbLo2uWdSxJ|0Z zQl%aZK1mtDk_!-?gsZq&xr#Ph^T6l;j(~5eAor%OLKuCMSVvw~Cw*WD3zGub(t(ai zhp=6#lA3Knr3x#}f>kGNpasYAR5WEvNf3#k6o~*xQE4PfI7O1=J_#-; z*hk34BT;EoiZWXj2@JLcLaF0|>Ts|JItWTK%;|{4Mj}8|bTGM!kB~5N$jt5zM+Aw$ zg`?3F^K>{Rk0R-C$fFS=C@E5llHx!Ddeuj;p8QzKB=5p5l`0(O`yh+-fJ2o4&K>c^ zVo@2})JTeqs-qEbF!QNlStci-mFmk1-Jtu?ZXgrNbkj-2_55B|(Vpq$yp z{tCL7s3NeRviC_LvkwIgry?+YL;wr>8%5@soJq@%HfIKcVBO literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin new file mode 100755 index 0000000000000000000000000000000000000000..460760d07cbb2d46bfefd4d39eff5aa3b1cc4493 GIT binary patch literal 11776 zcmYkC2~-p3`v2d_GD%pHNdjTQI+Fl~pcqm_%!P=E($*>{E>&==fU;x<*^!wf1O)eL z?W$ew|F*qtv8|TcMWGZ+nvS>j7He#$HMQZ_UOKI`;!gMv{oV6F|MQ-Q_izpgnaMlP z^L;+wXYk=`4}%hp_QjHIC7mTFO9o3umKQfuTdI(I>Y)zxz-TB;b0?(0B09jM`_vu! zvMM$Db0`vv?gyJ(hO(+$AajRMY^)!|?nD0-5@HdCO;rP$kv!1chn^217|)2IZ-k^k z=;olWgk%75%FyS)wx`jTq&F+Io2r61h*52-nxG0Qsqc2;=PQAT2mooHR{>%WJ&=Z1 zp?+)*Ij2geJ`}<*xnJb&XlAaxQ^W0_T`bxVF>8qwNv!oR`n`% zhq}r#Nn7YtU<4S)ct`(M6`e-Ekw&MDKwuj!8iIu*bO-ni(CQ^(;G5%`Y{35w0lN$T8zOcO1NnbNIJ?hA1RIh64Kce* zz_z~vVfWdPvLX9#$k{y#bp935>^>U`He&u8D7!1c$-g3&-De|?jrjjY0=p-I!P#&H zN5=es=ca>VCBoT%;69bO>(ioLA)xGwjSd~DMz-Xi0kZ$smp zCQWuor-=^fHSwV(SBi|GZ$n8ZegjRTzTdrAq}!;wVif0xzplSxsMs}MU$M)`@#4?! z3W-NU*k~wn6b6@d#i9=HRy<#woRT_6llJi6-|EmVE(fjcTlUOL&&!zmHx=n-(wTV|RW-{v9eT_U*)kE$@ytuZ*LA zSs6k95`=_6bUi3CVz40n9L7QJ@d6!`rdpJ z+c>n9J2Ai%_;CPMF7xa7KzJC9hVO1(tMoIE`jNY7ex}Bc@!gkN-oikl%rI;G zAnQf0?soMyx@};vEyTTo@!CT_U%~%}>lGSd;TVbujeH<*%@-PZKO}{?3W*F4rxit$i`5zp|>2j1y2LrIss6D41MD80mof|Yhq6U0tiTa!Z zJ{B3Ffp~ssItfRBpT_6bQ2T3;`wBJpC)dCzy&z@yg)E5f;P^2Cy?{e!LxWrWVz9Bp z&s4*En2mlJB081CZ1=0>k=QR@V`->#)CdMXJy~fi)qhrF1Y&5ow!-jPO{j3x@I}qQ zrz4fdLQLsFgV$A}+5qo(*AyL`4*Gd7x`b0gKm0>iK$TcKDdasw`lor>#3U~lz6oFB zx4VE80Nx30$`qps;p&7 z*VQhkTr@tv2KkoM;2?Rv7V-Cb6*6u`W!3hEy87@vUB;P#PcaiO_E`)yKy?F}DQblY`r#habn8K` z=4WcLIj49EQU3GO9MdF?e^>`A>2mio4j0F;HbFAct{5eb$F#jitC3I8{f7P40nL6xc~uC@@q~0=!F7hsRhQwMKSGhZ zKlDm_u|a7azyyX9*1WShG?k+}a6TzVNWEpFU=#XGQqBhyVn=VSerk8o+q)mDx2GvCrSeD3y938)(?%;Z*JU}av>kGYHC~*@vNnOHK&ne)}nY)fVSHFP|C9dRS znK1$=aj6JOJYO0HB`ynx5(~vp;u-`>TrYzXACp6gtD+%fbu^M#B*!uphUA*uajrhO zX85cFAK%?EzY(3nzoQ9^Mdn>NAT3ZG%errga11)HM2a87jMsBr%b$jvGECU)Ye#SB^dbMw>jcT>^ z5C32>9Jhe^yaEsUxna^Up+X{@n;t1CLH1(NrImG+JL<8Fl4#MxJ>nvi zufJ*$Hw}3XSW-cn^y|l!aF|VvJn+ih?D4!I`#1T$RcbB0h=*`6_aN=vQ#05nH5x>#JtkH--F`52g~FK$a5|;1f4fz^s{o&N+2I zDG@ISu&U)f61~hbx#7qGjK{N(MI#G-d4XB+y|ww2hNlci?+gX$fDzU|ZqskJO^uA< z>uupqm?qTHZx+aHm zksDrUwNpHUq6%VV<_gzo+rS`av%6XUoK4Fy?=6$sm=!0i*+3cn5pf6FO`>g(g&&U( zNS`Gh=W~#B@K0oZNk4wn%~R%~ce$~B17b`%Go#^&#d10Hmiq#{Gh<%#b4~!1h$((6 zk+Q9`8_T0Uv<=ro<1;&s-@X>?VmR4m1_JUJLf9Lob;>9QCXLvI_T0k(m=rq z_kct7yaSr{Fe|QFU?3VwbNL=X5s-J^8Ap&gIlBTLa?|a{odW{ZVqO$>z2SG^}EuyA(1(fHyI@F;8EIhHD zP!GvnC||8k+ z?huCY=xmOTcbcRdL0B(0gU;rs(AhB1f~R{M1a!U7@Vy1?O;rMeyF|Aj;CSvVK4# z!cFygyasY}y*PoNMB?or+9|<3>`xJX2#X`0MdFkRk|C!F!dguUtFYtq_8c1Z0H||n%n$EC;yM3% zWkU@X>8H1Z)9WLYy8nqlfAU|NaH#ESn|ktAXQO%oKW@q5XTT?jK@s06y;U1=dcRO6 zM;^c;{8nxD){!6-D1PAPXzm7vB%yz#gv6M{D0)A8tL9oZ#!JuMieBMkTps!ruTgE} zyszP8Z$&P!>X*PciSTKse(7$}6KTI|qq;*IHJPDRnt9q-;`gxFy~car{*a`LOUn5X zbvUE3Z$+PVUj{i}heWzBg>}S6_CBwwnSUU((W`)>5&r6i>Ux9^Km-!D&rr6p(y_U0 zm1Q$fARy6IWIuf_ zAKC?f?WB_J@I}Gvd$H2W?e-nJs?9rNHt#oJPq4kRy&0>oY^ujVsr=ZXZ<|#=H8BoX z3odS>t~cR}F__%Z3?e*IaBU2aY(y9KoWkF5h(*k)z_tV@KHh}PC!(;3u!s9R&8nVe zRc|x1;!j)DJrC^z%Risn1Uq}LNug_y9%N(8DMj^Ou_Q5-IhBZtVSpUi5<#zzH1srU zJ&cS*c(J5_J+%ro}B`o0?#{{vc2FNvadNZlX!Y@oa?d8YyCo^XYFSH z=`)(e@LfqNv5AfTq&dWa`5N~D{|06SW^}%Ns)bkD_cIrb@iQxWnqlCFM;Xj8yL2>*@}pr7`BR+Lx4}`5!lGQd{I7P6_;S!GB04( zB}mfCrS&ZNsK6fERAR4mI7)Zf8_c!XBPMH|rJ{13xz=oHG%x#lX-njz+;(CO8%rGR zj&^lB5%W+xk;MKk=C*qT#w9wAagC#$T;r7;Q1v7y=9C9LYFZt zI3<3%n_8Qc!=+MM#OnPcU!=59plk@6n4~ymB}yRkV1EX@cy3EnS=YYiDVF%4pSeew zR#yx6dsoZ`dv)~1jFl%V?RJYDtEk*v%_5zWHLEbJY)xgoy?Jxlk|!+o`puGMGCy+g z82)0*0xX95ypjb%{7e8AdPA5oCgODh;=b5zRIs>;@>WPcbQV+s?)&mO@^p*54#30? zXxyz}N;g$u*N9BrweUHvVQ)n+CWl zq{52?$ht@%yo=otx-VHOz|G;OJMT6vwtypE1t+ZVFW{5`6dX}0OQXPlo&{Kiy?S@0 zp=`#GAGj;)yN&G*;Q<*}lPs_UCEY<;EOfjHfn89IH_6Myz-mZo8u zixy?g1AJm3cUN!qj$PX;>#!9Ta|L+U*<881G@%=o#`9n)Hym*Lq`Yt`p9dk_P1V+T zKZ%(I?;SEA5fD^wDS-+s^^kSvIxFD!RctUr0%^QRAmv5??g1$;Ldq9G7}jX9*J3NV z%X0zuePC`E3UW)dd#U6%n7Lb^n&#t9+u`BBy|Ym_z7x(U2P ztP$>ZZLh!_dT!5-?e*L1EISdNb@Mhiv0e#vSsLoC4fRXot#0d^T@V60Dj!Su#JRn$ zE^nMf;B8Mi`3ZCt>c`bUu$KHK%{+d9lqsk zT1Rh%i+ml-NsVYI{Y^2K6=r$ZkNVe4d9uIg14Y+}QL47W7_NsmQ@H5bYkmP-EP$%W%VN-wQxS*MKHI4pp+0 zNBcd}>@)<*L7Nl*%mP$I5Xg^BD1DV0PKHFKH8Z7VtM$>L%&GDboc zU_AI67Zp(Vt<-u;Kb2+1vymDi4{AIx%rW&(&7z(X>twD*B#j}ANLOZfuZnN>ol|d7 zuUB^zc^8~fUj2t{P8DNR=_aNu_t*qQU-Wr^O zhRCcAFuoW4MuX`xbSY^7x(=1Q2XN3i3T=1GnNpP*s&+!`;kxa#c&Ct+kh}{L1LhPC zf?ceB$3LpY1jKnv;GSgF(j0(#j8bTN57R6S<7|JHIr-xuv(NtN*JfWE_D60=hC#WZ z=vhoKg3ak0N*zSM^?mTDR$voxilM{Ztpgf}JH-@0|MV;o!%Ugh435ak58o_TnXQw0 z*rpN8`@?I_kfcCYK%HlnCwYS-;4CuF3BmdK^GNpZ*EyklkpDQg=J-&6ZEC&Rl$!oC zZEPDLm7)}GNtA!e=7lJP&+_50z34yja7+r3Mg_!mQ>SY$1*8j(Y-Ba*&qcP98|vzCnW5A} z3T(2%J`JP}wiUUXbWmyhLZk%g#@Z)~z)qKkU@T4Dx=>8X%_mE28D>rSTPS zOtU%<6H*V`sU3FBooRE-bQL2T35Lj+EqDrEcXbOtku*Qv^6S&U7u@b z%3zz4|C}2a+V(d_|HG43qteu%(&%@{zu7@D@-(p)Jnf|V?7AHH=`)}7+8)|s8;n}j z1py#p*6<&44wqV=h;tRPBt_=t5QnF?h^N;}{^~BhT7%t?Yv)e@C+KOomvT?{Vid{p zwO5^*8VKYOBB`d&Ysj)Qg&MY)FR=4kvdle9S&lvRB-=p4Huth(E&CaMIv_9@>}PdQ z@rYre-I96|EbQ8<=wwc{LhDO%2{`I?*QEgrW{<%FyY6t*txVBqOTWmjT4=|%l9~jtfn*A~dk$-O(OZo?ru3pif5Ac3Ik5ZOeV~mT7`48f|1!z; zZLg5U%aEhIjn;#@gB;t@AdP?Qpqd>48b9eUN~wL0QKKA#XT>@ZlQNH_f8o7)h&2M* z&wg3VIw?;&n1ZR`lIX<{N{ZpakZXZGFjzhkk^)_SuAcwo{xvy5DR>0}5vWqBh=9Wm=J3Xb&@g3sdYf83a3?s#HqB%F0goZG zhG~YAqSx?CT=_~kf_H=H2lC|C2wHIKSYT*GaerisI(F7Y5e?09=t(*lbuQY|H)Nb) z3UYP#L&7Wlpc&3~UtpQWBpTcIbGac{&hiO?cD#H@O|}n26R#E<{!@Nd!_5FYRVlTh zp{-EVU{ekZ$vYo6&gexAP5S7DW_?0KE4p$2&GN+j&=MUNhPECVS-tGJZUw@u9$6~p z<8!$sEI1#U^#+ibLqn0sMK8;5Rp)C}AJwW=n&{`zmyWKhopl*ziOH;+zygjKI-3h3 z2p))V@_}~-{Qv8B;KUQ^V~MaI5A-@x2UTSb%4MQFj;np}#9lycw@`QORGN*I%Q;(u z{y>pmr|6z)Kdq5X1}`BfYx1R%=x;#Nh31a=F9k(M5BRafN&ov(ek{g6Nxf>tvYdDA z{``mC3iNF46S@s`g3h(csY&BjwNPSQz^q{x9 zSSH3Ak2<+$0{suovS9A$v8ek-sYn-Tl#6siW0Xk8HO7dTg0y2#jRe!uRu-m-hC~n; z6iNT6V__ftOQ{z;Kc)S%&M0|h=cIQ^d$$g~IiF)n$xQEj(olIZuM#NH|Vk2>j}b=d%l2y^^>BtX4Wrz*9m)>%{=EUJwb)oP2X z%%a+C>DOo0~y^b z3n!@0OhcEjMAqa1J9Lk+hx}3ZEDfE|$w>4kwq4T_L1Z^(0gsTvTQ}(4VLc<|S(64045Yt(O}>HHJ{#cqeuX z5%lZ{K^o>(r#=J~A9|+_>I6ZiAm_UPw828%u>jaLK`pdOlPTaFnJTiboh_S(41d(U zuMrxdoL`MI=+BcwUg-?6ReDyu3pzoTnxscucUtv-AVFdg4v6c}6{2NzB(|UQ6~vdj zAr0qNCz1f3TJj5c*X7%zi36B3W_*t>hP~dmoJ>Igt_5$B3$3b5A}Ebp)QBhqi!@2brdQ%|hOEF}X$py7zX;saw-BNN-IJ3drnvW^ch zv5dDjNIhhlu%|oJmm*(xeuzl{N<`{VLWH5jC0QE#EvNAE2n2~nE)&;F$}{_Pal}LU zaYUQyJUKMU32@cYhcowj7VGMQ6aB@RuM)D=Ysu0HR+sz-T6cI{yV{~w`zq2kf?61SL7jeDnw9yvJD?LnrP9wyG!nl_Xz;ntJC;fA7Q!o; zOQN^AvF^4rpMPMJKhdpyP^VTssGErUUHz0@?hNR{kw@5Df;{Fb4{FyTW}r)agOKD8 zIXg8=ISWbjs$69?bMirkF3&YYU9oY0b2CfJEF-$(GLH2bj-%i^_H>k4#J{<!a+>-vYy&CUlZZU zKN6*?v)wS4Hgo7IuH0fx;D^gD@1xbMKllS3nD9=G1m!6Bz!@+KB`@!b^hNukm=#+r zV!*bZk0Fwi?C8bqBEvSz8H-`7rL!m`%!#-xENZ7VIO?`Hp*Pz3`-mp~eljowF9s?n z3pc<#kQjEB{IfT`!qcv1`EuxDc z!nP3_$yHMI0haE;YFSs}p%IHga#NDGsa;&_>`;e;^j>CZuS0*y5%GoJ0UjldAiVU2 z@Y;o5*8XKy^g8;Pf<$y>q39w=!0x3TNIL+}AT9AP^zw9fjTP@>5FbxRc}G*{H(d@( z*4@8gu(Yv5JMFV3o?VhPUwI%!rvpMEFpBi^t@x95Nw2v&A=O%5!ahv(p(z!pzOwe~ zF>6wgkfs-R4@#lI254q+c&RgwZ72YlY6Wr^#9N##Io(aYP{*uTYYK95dUFtV9D_=- z;t)V!*L-VM0Eh`K$Z&%}mRlxmWr>1N3N3Vru0C3`#DFgnce{seHI7}9kBC~yzq`O+ zj<{fDufJb^u}m+P}@b^ivUwEGI3({G899<^5wEpTJL5r0tJBy&0aIgvtvV1Ptzf-gz*e~^A+ z42mHyl|o;U8e_z69xN7vCJR{;X0bs84tF>n9BikN9miOcq^)HS=rr&Ff_<^L=;Ha}vqR~V^=q}1pF3h5bi%XsO<0;`_&x*f6?36!|i@d&YnPj8(2vAtv3(a)KT~HDo~{su{q6p9 zI=09Vez1l}k4-21+j_eF&HhGzlV1&*K|YC+`KN)A%qc|-uAG&c70@8wEj{Zzt%0SV zcA?++PWwK>?9!L;^T=k`^>+V+&Wr6LCXn;aR(}9|*VW>09A0j=dJdrHrh{}4*Rf#6 z4naKG_dVLRCTJ!k3Jyt^s$yh&#fykE>=Mx-UfL}Mjmj+>#>Q-yISogoI=k|^QSkQ+ zkh{H>pAbrQ z_efux?AI=%6ysdr$o_?D36lG+{+|3S!I7VJ(}C%Lm)A~W@)(7%n0v!z1eb-p=w388 zIN?+KWO>+K?l(k-HpIQ^E;h`!5*W^l>n<9M@pL*F5lrpU`!D?5GG{4@jhlXp+y)9?#&?>e-~)CLW@L=&F$adE;6uu5!k3w(M$?!Se9Qujl2|hTV-V{KNb}EH zqny&tvmnFOuTQWozbS5a4yp)6QT8T5xtQz-yeZnYAE}z5l!C&91KMzbLxm z-((8LUH!B?D|qYJZ6M<&M`zE;Sya>d*z@KjkxU)MHVu$U9TlCua97VW-{$gV^1>02 zPI4fSur2z{uvP&a2Y(o`f-4e)i^4?$g+K`NVFAp~7ARuE!(d@pI3JGY!7=C>Z&?u+n{-e z4^5{}rz1ZI(%pd8-Z3F|WqqGIwKKgV%aSHV2qiCfpBVAUeKKFXFCh|}%Fl7Dr`5>U z$uj2%48)T?jHQ^_nH!xp3)k-G#^reXIUTVT1-hvIU$OA++`X5-JCzy zrDXkeOzy!`Eeq~_Y!N*hcG{H+G;(gVQ`wQr-_Mmoh0j#gq8y_rO-;31X*GJukYF1a zEiys^WSaAD=X;H6&dnZgux&hFAh;mszbD+|QvGDn@}AVRlfmhQbmZ5w13jeB3X*eN z>L~f`>&B{Vn3z6)PqaZ7t#&ahMExRa#Drggwp1Go;KPdyMcy=faLH5)wnOnJn-^ z_2SRN=j}@gUKX-bu*`~h8;>ur@)Jqq9>>ymhBfi&dWcp}2I?RQk&57CXR%dnRTItO z4kw3J!zh_x6LGoIY+wJk-O}Bn*44X3v3P7fIkT9@(v~jcpq{jPW4+L`&f$1Fet<2H zwgXEJ;Jw}cIA4o@a5&YPnt6sdLZn$!XXh9-?@P}1vU50(w}yneQhyxCIV$&KMZqzq z^k)aH9zN&@jB$h8s$=DzoOgm7OXAYN?Y&U`Sy2Z*{gJXu6}=Y%ABghK1$2ieIcLc9 zAuQui&Sx7-0)DxlR*t0w*-2g@2bb#ksid+)W+Xe$s*FgCGYA#Lf6)`160!4X1?=43 zModi_J}yxclMz3&lP+(&#{7W^vEDi1zZ0iR9Cn{*SeF`+P)u%t!m^Jj=`9>OomSnj zKe0tS#kt%h3?@wHvgC;j!<&N!irvwa)K$nYnO6>KfHTi z0Gj?`T14Hl=uov92*{kfxw6}_2Ksex0P(D1_)Eakh5QSzI)fbZ{7FSy8pa&*IV7+ zI{WPJxA*sbdw*-~Z-09?lPp8=oV^(??y5w7U?CT{RA8qbK<$gSwzztJO6%clR0|EX zYShao5*?<}TsNTsw8WB(Onr;)6=$&jB@TtR@L~D=FS7JLCOt104G^sX0UAOt;LyS~ z`deRQA>XNQoepH32ne`!A}i#0cGJv>EQ66^hX!Z-VZMRrJ|t$E6F$qiNd%y{LB}%Yktf zg86E`qeRP9#O+l#XS$tw`L`P<)gxYBlO+aYtCzQCYm_(0>KFFc`K&OAf`bt!QLt;? zIpm247j0R%OKo$0*;2Bd;*-t`sb;Yo+!qQqp8#dIZ-Oj3X#NFky%-qQ*d5v z^v}qoC7`Li1T;yOfX1dJsC#pH3F>#>@=HJ$`z0u3C`pr55F{gzYT+-**v;8pqT`>U zB_Zq88=4hKykt#xn1rcFQKY1$pi)Iji4<@_nx7gCoyT6_QF4^3kbB=$f0v_>)8y)t z*;&I1IZBC=tH}|C+<_INjvk&IB^B~`E1K<>z>_Nyc>9CjK-+1}Sw_W{7Zmvv%~ovD z=hmpQfgE@uTI_8VfHJ=)K26($y#6XFZZ zuMgzA+65O1*li0~B_jKFKu3KRMxdjdmpJ=tBfSD=yZPNd-Tz$hQy?=?U55F;e<&b; zwbf;k5+5~v4)KbDnXKH7yEo;5?O@TNqHxB`lU z7=ZIXFE%s+z&3#`MFt&XAPFg(0eCeTfMvv$py4N3I%%qFO#mC*YX!d>Gv0m zqxqcsf}i+r<9L6L27f*N|C)p5gO{r$;vo1<6+T?ym@E{4Q3~A||43VDE*NYK5Bhyo z(3e$)NYmi-+!I4FXkv@khl%}_Ru&nF_)zNj{YDqk>|$sJ2pv)lBL0|x5JQSxDe*Sv z`?JH6gnb|T9yff9w^cAM_SSsSa(Q|j|KOu(U*C@;SkRRu*e_rw7q4>!QJ&cOs)|%; z5vu(Y5|ZNEO8}KC{*m#~($@#AJS(|qm4DQhgx9ano#;bv zmv7qgM)cifC7m|6vY*xWF0CuSVRNs#X-8VrM~;vB!-Sn%iO6lmGU*K`EN9lI&@9GmJJIy*%SVbDT!hi{$?*{y-w2KZAE z`|<|}CL5kj_qAXoB3>ymPA&uKD+(cZeVLC5s)oG$7|i<;sIlA%)D#b}`?oD(!U65* zx!ggHeFS@J$j^g)OUcuCjOKrp>vv(!wh-&^?Y56&mOzi)Ka7sBKN+!)m7W@&I|YG@ z@ou}pDA} zZJ9mSL!ey(xOSZQp889N#$+H`CoSI-lJe0&CrMa2gO&fSjNr_0q`khRJdk=7iDaZs z6|kmy;FMrc(=4Wmpol*$D#o4^Lv7);g6^WLa@d~S(Sc!|oe)p@<{MBtX&{Yh_etMC zHxjya9V;c>yU53-{6%;=dd6ZU`C{JhEr#4HlydzH&^BFj4khds>{UVlB4ne<0r*d7 zxu7q$G0&d+3TX>l+2_X@zWC6xTVv7lVO6`)d{AFHKD!#oXD#V_8AW^}w6QtEE5WHD z)sT$?2{^F&##<7~?E*4n%|*-2kl@)LEH{eA1pv$nQ#A*4M5`7qDs2o()d+T5G{KXS zg=E++ON(}ork|YrLTBm6ikqT4?`bX5aLgj&Tg?SwFv*?^FeeW-8vuqgJDg-Qz`O9X zIr7-sV7YKK7Yc=djV#MiDy?&1>JzT+lPM)gZE)I0|II#IUt;2NKUgRR`P=h%?qnZZ z0i=7BH}^;ZSel(}vu7*?x$w@t#2s-vfKw{d$)1(Vl4lVYgkJ-&D$)=7MYdxtwG9!z z833fGPdS|dy=r(n;}2LDok^ejF*7oYM`R^WOvnk-Sd8-RVX?J}9l=Tt|uVsmsXdq;d$e7x^! zuwa3=_mb}ch~69o6K_6&8T+(}iTj>YAlM^|PmS9S_JHiAP!zcux;ZDRR9k#s%jNm` zMQPvMTp_6AE(DJB&=JwuA6vME&P)IzHu6=nJuuaC?GD)*072l!z0n(`j9)-x#M>&A zM^ipgMJS^i))uuYnWJNS68HAnRA5b1@m4Yp;h@x|^^mMvQ{Tq(&H*M7;9^ri7HXkkl(ISQ(Vw z;$PB2*_NPcGDkwIU3uSDQAom;`=C<7G3ReQDDj%r+Voc=_DLX5J5}L-xJ9HA&H;Sd ziU~hxdAGH3J;b;%M?y{njLC z7?w2pT(`gbgz$D;XK z^CU0`=`ppCRf|rF#m(i&%M8|+ql;_{IJS<0fzgzMY!ih8v}Er0_pyR0b_(>;$_{%# z42(#m_@l}>i$B$rB;>DbI&pZyLarpVds=~)Ah?RsRzq=r9g}SIv;3?p{_S-IHRDa9V;g);PO$hhf@i59s#&gCdR}5k2AI#cjA%x#F{-$&BQ4b?L%Id3gw$?fB^!2Ws`fuK? zhRnixtiHbEcd*`lOFiveJspB0jD`lcLk*C9p#dxWV@nbI8M|wi->ShMzgMkW-x)q` zb5j$8_ST0Jc~YlNzqDP~U%UN_Y@^Su8^b+1Xg z;#~Dm25lUlx^F!7*>1DaaiQ{_lz0d6JsbzCjmw|H4K>>Y5DIUlHVgE^n=@Y<1idxo zjfPxc52VacLtmP5!cQ$pi)p~GkoAUcr%i2zd9~9qZEu83Z*Tk8Pset(-HI{2-4w0#W>0QpqICJJ7T-ozhaVjpZy){+8xRm{xpAyzH{^3%KIPI8E4w#^j;RcsxG{hz>BImgQ4#iQ%mw&P zv)HoJBe366RNc#&!L)c1`hZFbbVF6uIH-e+h+;?Dz{E$=Q4weI!B8sH{AXIT4qO%m z6IxU4c=<7%`C!1O@KOnbY2pcx2f%0gpRoD!FNMc3t_I*E-DvHhp}XAoC##F;x(Ew( zE|_0mZOE#x@zrH#WG_WbIk{a>yh(LSiH zcx}tXo5}9TIK=R0HTdFM9PZKJO?BF@>KxJI?ernRy6SKSw^<|}6KVWyNL?@9+c25u z&NP&PhfGUuq(%8iYpt8lTsL?c)&lp>n>x)_>I%!%pDbWC89o@y9wZ~|zXbncUrQPD zi>)7|{JU8>J9HiYx(5G#QuX{(OR_m~0P#SGdr;tzq=r^BXpVzy1cHR=)(V3xz4n#JZH zy&Ny4JvE~9#F;`46x&JIKvY$WM0Wl}%6;L7IQa0xLD8Ivp+hFu!BLSN!~2@+VobnL zM*TUFSck-zdK<{$xiva2eq^)6s;n2&j}hh{r%aD+?9EG_Cd*`^hm0)3e(Ba9;iMzF zrR@61f~{Pr(c5Dun=qVmRMNa^LT{D_SCeD9FR?axuhuWW4kMOp z(@_wzXyj;9+p(iR=()=s5lwZRS)?=iU$qzNzUbnb^YJ2M&66jF8j1J%dd!@kq!aSK zB0jw}acwJx&1nN*JsIEi`B8G?XxCXXvdeeVhh%hDA~_o;=8y?pz9YXO-|TusnzwY_ k`w*L5h3{z~upPJDQvUAy)?dBF{N2*O3jFGUe<%<92T;*R#Q*>R literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin b/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin new file mode 100755 index 0000000000000000000000000000000000000000..f4e2f89a5b33f9fc6c1f9a8a97ec873ca76e7c38 GIT binary patch literal 512 zcmV+b0{{I003i@UAY(9uK&4Q|VCQfMfhmznp=+^>!L8BG;qUP=5)cA&GEyS7Qj|jX za@JxwlNf`0vs$CQ)11Tq^WNiPBttYH1OXK0WXE)*M1@pprAxIag$b4J<96@niD{V%sVlklTGUFndX{Q&8c+%|Iua`V+uX~)`=0B0n^=oGyBe#eY=?a0OvPLx zECW1X3_%>O?T`KJ&CT5^tqZ+qjY*xCeztDaUi3~AJ~A#*9&iqy|Gw|t-~7)TzdEm3 zpLmamk*R^ovFo7>(JjGF@o(XP5TO9VFykNuP$fV{aA#n-gP4>1quR4Q!yMCp<6iTz z0+15(BGNK7LKISWVpekMwacZbm5GIJ^-tw2)eXhsG{YpI6oCY0bVp<)R0Txar~0>< zhq#wt=YIDc$2`~5Ch|6s2Cx=aW_ETJMl@DT*=@-V`7i0nndym&xvQx}SY=2CcqeGU z7~u$lIHM?i%Us((>mK|0i`bjHtD3uYN>o}mY8HC&3eXy}Dv~-b{SWPI-A&D^y^F2r zoym_%s&wSsTue!h4kNBS#ZZ>{ZPIO+AF0ww+4)7kp CQ~v<~ literal 0 HcmV?d00001 diff --git a/ProfRom_Disasm/rom0.a80 b/ProfRom_Disasm/rom0.a80 new file mode 100755 index 0000000..7146488 --- /dev/null +++ b/ProfRom_Disasm/rom0.a80 @@ -0,0 +1,10229 @@ + DEVICE ZXSPECTRUM128 +; INCLUDE "!AllConst.asm" +; INCLUDE "!ram8.asm" + ORG #0000 + +x5B00 equ #5B00 ; п/п переключения страниц rom0/1 (=x006B) +x5B14 equ #5B14 ; п/п возврата из basic48 (=x007F) +x5B1D equ #5B1D ; п/п on error +x5B2F equ #5B2F ; п/п ввода rs232 +x5B34 equ #5B34 ; п/п вывода rs232 +x5B4A equ #5B4A ; п/п включения предыдущего rom bacic48/128 (=x00B5) + ; rs232 вывод символов +x5B58 equ #5B58 ;2 адрес вызываемой п/п из basic48 +x5B5A equ #5B5A ;2 адрес возврата в basic128 +x5B5C equ #5B5C ;1 содержимое порта #7FFD +x5B5D equ #5B5D ;1 =#CF rst 8 +x5B5E equ #5B5E ;1 код ошибки для rst 8 basic48 +x5B5F equ #5B5F ;2 rs232 битный период +x5B61 equ #5B61 ;2 флаг состояния второго принимаемого символа и данные +x5B63 equ #5B63 ;1 текущая колонка +x5B64 equ #5B64 ;1 ширина печатной страницы +x5B65 equ #5B65 ;1 номер параметра ожидаемого rs232 +x5B66 equ #5B66 ;1 флаги +x5B67 equ #5B67 ;10 имя файла +x5B71 equ #5B71 ;1 тип файла +x5B72 equ #5B72 ;2 длина блока +x5B74 equ #5B74 ;2 начальный адрес блока +x5B76 equ #5B76 ;2 длина программы +x5B78 equ #5B78 ;2 номер строки +x5B7A equ #5B7A ;1 тип файла +x5B7B equ #5B7B ;??? +x5B7E equ #5B7E ;??? 2 длина блока +x5B7F equ #5B7F ;2 длина программы +x5B81 equ #5B81 ;2 старый SP при использовании TSTACK +x5B83 equ #5B83 ;2 поинтер свободногоместа в directory +x5B85 equ #5B85 ;3 количество свободный байт +x5B88 equ #5B88 ;1 +x5B89 equ #5B89 ;1 +x5B8A equ #5B8A ;1 +x5B8B equ #5B8B ;2 возврат адреса для on err 32768 +x5B8D equ #5B8D ;5 последняя длина, выводимая при вычислениях +x5B92 equ #5B92 ;2 номер строки для renumber +x5B94 equ #5B94 ;2 новый номер строки начала при перенумерации +x5B96 equ #5B96 ;2 приращение номера строки для перенумерации +x5B98 equ #5B98 ;8 STRIP1 +x5BA0 equ #5BA0 ;8 STRIP2 +x5BA8 equ #5BA8 ;стэк +x5BFF equ #5BFF ;вершина стэка + +;Ram7. +;#EC0C - 1 номер текущей опции меню basic128 +;#EC0D - 1 флаги +; 1,=1 текущее меню: основное меню basic128 +;#EC0E - 1 ??? +;#EC0F - 2 постоянные атрибуты экрана для 128 TR-DOS +;#EC11 - 2 временные атрибуты экрана для 128 TR-DOS +;#EC13 - 1 параметры вывода на экран для 128 TR-DOS +;#F6EC - 2 адрес списка опций меню + +Rom1.x0010 equ #0010 ;печать символа из A +Rom1.x0013 equ #0013 ;адрес с байтом #FF в rom 1 +Rom1.x0018 equ #0018 ;чтение очередного символа строки программы +Rom1.x0020 equ #0020 ;чтение следующего символа строки программы +Rom1.x0028 equ #0028 ;вызов калькулятора +Rom1.x0030 equ #0030 ;резервирование памяти +Rom1.x0038 equ #0038 ;обработчик прерываний +Rom1.x0095 equ #0095 ;токены бейсика +Rom1.x03B5 equ #03B5 ;beep +Rom1.x0761 equ #0761 ;LOAD/MERGE/VERIFY +Rom1.x08CE equ #08CE ;MERGE +Rom1.x0970 equ #0970 ;SAVE +Rom1.x0B52 equ #0B52 ;печать токена +Rom1.x0C0A equ #0C0A ;печать сообщения +Rom1.x0D4D equ #0D4D ;копиравоние атрибутов +Rom1.x0D6B equ #0D6B ;CLS +Rom1.x0D6E equ #0D6E ;открыть канал +Rom1.x0DAF equ #0DAF ;очистить экран +Rom1.x0E88 equ #0E88 ;расчет адреса в атрибутах по координатам +Rom1.x0E9B equ #0E9B ;расчет адреса на экране по координатам +Rom1.x0F85 equ #0F85 ;добавить код в строку +Rom1.x107F equ #107F +Rom1.x1097 equ #1097 ;очистка памяти +Rom1.x10DB equ #10DB ;обработка кода клавиши +Rom1.x1303 equ #1303 ;основной цикл basic 48 +Rom1.x1391 equ #1391 +Rom1.x1536 equ #1536 +Rom1.x15EF equ #15EF ;печать символа из a +Rom1.x1601 equ #1601 ;открыть канал +Rom1.x1615 equ #1615 ;установка флагов канала (возврат предыдущего канала) +Rom1.x1655 equ #1655 ;резервирование места (длина в bc) +Rom1.x1661 equ #1661 ;lddr, ret +Rom1.x1664 equ #1664 ;обновление системных переменных +Rom1.x1695 equ #1695 ;получить адрес первой строки программы +Rom1.x16B0 equ #16B0 ;очистка различных областей памяти +Rom1.x16BF equ #16BF ;очистка рабочего буфера +Rom1.x16C5 equ #16C5 ;восстановление стэка +Rom1.x1825 equ #1825 ;LIST-5 +Rom1.x18B6 equ #18B6 ;пропуск натурального числа +Rom1.x196E equ #196E ;получить начальный адрес строки программы +Rom1.x198B equ #198B ;поиск команды в строке +Rom1.x19B8 equ #19B8 ;поиск адрес начала следующей строки программы +Rom1.x19E5 equ #19E5 ;удалить переменные +Rom1.x19E8 equ #19E8 ;удалить массив DIM +Rom1.x19FB equ #19FB ;получить номер редактиремой строки +Rom1.x1A1B equ #1A1B ;печать номера строки +Rom1.x1C1F equ #1C1F ;обработка класса #01 +Rom1.x1C56 equ #1C56 ;полкчить значение параметра +Rom1.x1C6C equ #1C6C ;FOR i +Rom1.x1C7A equ #1C7A ;получение двух значений +Rom1.x1C82 equ #1C82 ;получение числового значения +Rom1.x1C8C equ #1C8C ;параметр - строка +Rom1.x1CBE equ #1CBE ;установка необязательных атрибутов для печати +Rom1.x1CDE equ #1CDE ;получение параметра-числа +Rom1.x1CE6 equ #1CE6 ;ноль на стэк калькулятора +Rom1.x1D16 equ #1D16 ; +Rom1.x1D86 equ #1D86 ;поиск оператора +Rom1.x1E39 equ #1E39 ;проверить инструкцию DATA или DEF FN +Rom1.x1E45 equ #1E45 +Rom1.x1E67 equ #1E67 ;команда GO TO +Rom1.x1E99 equ #1E99 ;извлечь операнд +Rom1.x1F05 equ #1F05 ;проверка наличия свободной памяти +Rom1.x1FDF equ #1FDF ;PRINT_2 +Rom1.x2048 equ #2048 ;PR-ST-END +Rom1.x2070 equ #2070 ;нужно ли изменять поток? +Rom1.x20A0 equ #20A0 ;ввод с клавиатуры +Rom1.x20C1 equ #20C1 ;ввод данных по input +Rom1.x21FC equ #21FC ;изменение временных атрибутов +Rom1.x22AA equ #22AA ;рассчитать адрес на экране по координатам +Rom1.x22E9 equ #22E9 ;печать точки +Rom1.x232D equ #232D ;печать окружности +Rom1.x2394 equ #2394 ;печать линии +Rom1.x2477 equ #2477 ;печать линии +Rom1.x24FB equ #24FB ;ищем следующее выражение +Rom1.x2530 equ #2530 ;проверка флага проверка/исполнение программы +Rom1.x28B2 equ #28B2 ;LOOK-VARS +Rom1.x2996 equ #2996 ;проверкае синтаксиса выражения, заключенного в скобки +Rom1.x2BF1 equ #2BF1 ;прочитать значение со стэка калькулятора +Rom1.x2C15 equ #2C15 ;D-RUN +Rom1.x2C8D equ #2C8D ;это буква? +Rom1.x2D1B equ #2D1B ;это цифра? +Rom1.x2D2B equ #2D2B ;bc на стэк калькулятора +Rom1.x2DA2 equ #2DA2 ;извлечь значение со стэка калькулятора +Rom1.x2DE3 equ #2DE3 ;печать числа с плавающей точкой +Rom1.x30A9 equ #30A9 ;hl=hl*de +Rom1.x33B4 equ #33B4 ;поместить число на смэк калькулятора +Rom1.x34E9 equ #34E9 ;проверка значения на ноль +Rom1.x3B01 equ #3B01 ; +Rom1.x3C04 equ #3C04 ;проверка Break и вызов теста экрана + +Rom1.x03F8 equ #03F8 ; BEEP routine in ROM 1. +;Rom1.x0D6B equ #0D6B ; CLS routine in ROM 1 +Rom1.x16E5 equ #16E5 ; CLOSE # routine in ROM 1 +Rom1.x1736 equ #1736 ; OPEN # routine in ROM 1 +Rom1.x1A0D equ #1A0D ; CLEAR routine in ROM 0 +Rom1.x1CEE equ #1CEE ; STOP routine in ROM 1 +Rom1.x1DAB equ #1DAB ; NEXT routine in ROM 1 +Rom1.x1E42 equ #1E42 ; RESTORE routine in ROM 1 +Rom1.x1E4F equ #1E4F ; RANDOMIZE routine in ROM 1 +Rom1.x1E5F equ #1E5F ; CONTINUE routine in ROM 1 +;Rom1.x1E67 equ #1E67 ; GO TO routine in ROM 1 +Rom1.x1E7A equ #1E7A ; OUT routine in ROM 1 +Rom1.x1E80 equ #1E80 ; POKE routine in ROM 1 +Rom1.x1F3A equ #1F3A ; PAUSE routine in ROM 1 +Rom1.x2294 equ #2294 ; BORDER routine in ROM 1 +Rom1.x22DC equ #22DC ; PLOT routine in ROM 1 + + + +;#0000 включение компьютера/"холодный" старт +;#0004 вход в монитор NMI/rst 8 +;#0008 rst #08 вызов функции монитора +;#000D возврат из монитора +;#0010 rst #10 печать символа из A +;#0014 rst #08 вызов функции монитора +;#0018 чтение очередного символа строки программы +;#001C переход в rom2 при ресете +;#0020 получение следующего символа из бейсик программы +;#0024 переход в rom2 при rst #08 +;#0028 вызов процедуры из basic 48k +;#0038 обработчик прерываний +;#004A обработчик ошибок basic 128 +;#005C вызов процедуры (продолжение rst #28) +;#006B п/п переключения страниц rom0/1 копируется (адрес x5B00) +;#007F сюда возврат после отработки п/п по rst #28 (=#5B14) +;#0088 обработчик ошибок basic 128k +;#009A ввод из канала "P" +;#009F вывод в канал "P" +;#00B5 выход из процедуры ввода/вывода в канал "P" (включение предыдущего rom basic48/128) +;#00C3 обработчик ошибок basic 128k +;#00C7 вход из монитора после "холодного старта" +;#00ED вход из монитора после "теплого старта" +;#0100 !!!NOT USED!!! керналь процедур +;#0131 ошбка проверки памяти (битая память) +;#0137 инициализация переменных и печать меню 128k +;#019D команда NEW +;#026B выполненение введенной строки +;#02BA сюда возвращаемся после проверки синтаксиса бейсика +;#0321 обработчик ошибок +;#03EF обработчик ошибок +;#03F7 вставка строки программы +;#046C адреса сообщений об ошибках +;#048C сообщения об ошибках +;#057D печать строки из de +;#0589 информация о каналах +;#059E информация о потоках +;#05AC обработка ошибки +;#05D6 проверка нажатия break и печать сообщения +;#05E6 RS232 ввод и вывод +;#0641 команда FORMAT +;#06D8 процедура ввода из RS232 +;#06E5 чтение байта из RS232 +;#07CA процедура вывода в RS232 +;#0822 перевод строки на принтере +;#082B !!!NOT USED!!! взврат каретки на принтере +;#0830 продолжение x07CA процедура вывода в RS232 +;#08A3 передача байта на принтер +;#08B1 rst #08 вызов функции монитора +;#08D1 включение компьютера/"холодный" старт +;#08E1 !!!NOT USED!!! вход куда-то +;#08EE возврат из x08A3 +;#08F0 команда COPY +;#0915 печать половины строки +;#095F передача на принтер управляющего кода +;#096D проверить пиксель на экране +;#0979 управляющие коды принтера Epson +;#0985 команда PLAY +;!!!not used!!! #0E89 чтение регистра AY +;#0E93 гасим звуки во всех каналах +;#11EB команда SAVE +;#11F2 команда LOAD +;#11F2 команда VERIFY +;#1200 команда MERGE +;#1219 ошибка C Nonsense in BASIC +;#121D работа с RAM диском +;#137E загрузка данных с RAM диска +;#1385 получить выражения из строки бейсика +;#1393 проверка и копирование имени файла +;#13BE работа с лентой/RAM диском +;#152F печать бейсик программы от текущей строки +;#1630 очистка окна редактирования +;#1639 сдвиг всех строк в буфере редактирования верх и обновление экрана +;#1648 сдвиг всех строк в буфере редактирования верх и обновление экрана +;#166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;#1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;#16AC вставка символа в строку буфера редактирования +;#16C1 вставка символа в строку буфера редактирования со сдвигом влево +;#16DC смещения до параметров команды +;#170E синтаксические параметры команд (аналогично basic 48 #1A7A) +;#17AF анализ и выполнение бейсик программы +;#18B5 таблица смещений до процедур обработки класса оператора +;#18C4 процедуры обработки классов +;#1967 процедуры обработки команд бейсика +;#1AF1 пункт меню Tape Loader +;#1B11 анализ и выполненение введенной строки +;#1B14 пункт меню редактора Print (печать на принтер) +;#1B2B команда SPECTRUM +;#1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 +;#1B4A включение basic48, блокировка #7FFD и переход на адрес в hl +;#1B53 установка канала 'P' +;#1B6E данные для команды LOAD "" +;#1B71 команда LIST +;#1B75 команда LIST +;#1BAD команда RAM disk SAVE! +;#1BE5 команда RAM disk CAT! +;#1C0C команда RAM disk EARSE! +;#1C2E загрузка заголовка файла из RAM диска +;#1C4B загрузка из RAM диска +;#1C64 включение логической страницы в A +;#1C87 сравнение имени файла с заданным +;#1C97 создание новой записи в каталоге RAM-диска +;#1CF3 коррекция сводного места на RAM диске +;#1D12 поиск имени файла в каталоге +;#1D35 поиск файла на RAM диске +;#1D56 обновление записи каталога +;#1DAC сохранение данных на RAM диске +;#1E37 загрузка данных с RAM диска +;#1ECF !!!NOT USED!!! запись данных в RAM 7 +;#1F04 !!!NOT USED!!! чтение данных из RAM 7 +;#1F20 установка другого стэка и ram 0 +;#1F3A включение страницы ram +;#1F45 установка другого стэка и ram 7 +;#1F5F удаление файла из RAM диска +;#20D2 печать каталога RAM диска +;#2135 печать одной записи каталога RAM диска +;#2174 команда LPRINT +;#2178 команда PRINT +;#218C команда INPUT +;#21A7 команда COPY +;#21AA команда NEW +;#21AE команда CIRCLE +;#21BE команда DRAW +;#21D5 команда DIM +;#21EF очистка экрана +;#21F8 вычисличть числовое выражение +;#226F обработка нажатой клавиши +;#228E поиск начала бейсик команды +;#2297 проверка это команда LET? (калькулятор basic 128) +;#22AB проверка это оператор? +;#22BD список токенов операторов +;#22CB проверка это токен? +;#22E0 проверка это число или функция +;#230A проверка это цифра или нет +;#2317 команда PLAY +;#2336 !!!NOT USED!!! возврат в редактор +;#2342 !!!NOT USED!!! bc=hl-de +;#234A !!!NOT USED!!! зарезервировать память на 1 байт +;#2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc +;#236F !!!NOT USED!!! hl=a*#20 +;#2371 !!!NOT USED!!! hl=a*#08 +;#2378 !!!NOT USED!!! расчет свободного места +;#2384 !!!NOT USED!!! печать на экране строки из буфера +;#23B8 !!!NOT USED!!! печать в буфере #FF +;#23CB !!!NOT USED!!! копирование буфера на экран +;#23E1 !!!NOT USED!!! печать символов из буфера на экране +;#2456 !!!NOT USED!!! переключение страниц rom 0/1 +;#2464 !!!NOT USED!!! переключение страниц rom 0/1 +;#246F !!!NOT USED!!! копирование п/п в ram 7 +;#2488 !!!NOT USED!!! установка атрибутов из буфера экрана +;#249B !!!NOT USED!!! установка атрибутов из буфера экрана +;#2513 !!!NOT USED!!! поменять местами ink и paper +;#2537 таблица адресов обработки нажатий в режиме редактирования +;#2577 таблица адресов обработки нажатий в основном меню basic 128k +;#2584 подготовка переменных +;#259F печать главного меню basic 128 и выбор опции +;#25CB возврат в редактор/калькулятор/меню после обработки ошибки +;#2653 основной цикл в basic128/калькулятор +;#2669 обработка нажатия клавиши +;#269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху +;#26BB выбор нижнего экрана +;#26CE выбор верхнего экрана +;#26E7 звуковой сигнал +;#26EC звуковой сигнал +;#26FA звуковой сигнал +;#2704 cs+1 вызов меню +;#2717 нажатие cs+1/enter в главном меню +;#272E курсор вверх в главном меню +;#2731 курсор вниз в главном меню +;#2744 адреса процедур обработки опций основного меню basic 128k +;#2754 текст основного меню basic 128k +;#278D !!!NOT USED!!! +;#2790 адреса процедур обработки опций меню в редакторе basic 128 +;#27A0 текст меню в редакторе basic 128 +;#27CB адреса процедур обработки опций меню в калькуляторе +;#27D2 текст меню в калькуляторе +;#27EB !!!NOT USED!!! +;#2811 смена области редактирования низ/верх +;#2816 выбор опции 128 TR-DOS +;#281С выход из редактора/калькулятора в главное меню +;#2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) +;#283E !!!NOT USED!!! +;#2851 перенумерация строк программы +;#2862 печать программы на принтере +;#286C выбор опции 128 BASIC +;#2885 выбор опции калькулятор +;#28BE инициализация курсора для верхнего окна +;#28C7 возврат в главное меню +;#28DF инициализация настроек нижнего окна +;#28E8 инициализация настроек верхнего окна +;#28F1 обработка нажатия символьной клавиши +;#291B ext+ss+K удаление символа справа от курсора +;#292B delete удаление символа слева от курсора +;#2944 enter ввод строки +;#2983 ext+N/Graph+W переход к первой строке бейсик программы +;#29AB ext+T/Graph+V переход к последней строке бейсик программы +;#29D4 ext+I переход к началу текущего слова +;#29E1 ext+shift+J переход к началу следующего слова +;#29EC удаление курсора, восстановление атрибутов +;#29F2 напечатать курсор +;#29F8 напечатать курсор +;#2A07 получение позиции курсора +;#2A11 сохранить позицию курсора +;#2A1A получение текущего символа в буфере редактирования +;#2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования +;#2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования +;#2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования +;#2A87 ext+ss+2/Graph+Y переход к началу строки редактирования +;#2A94 перемещение курсора вверх в поле редактирования +;#2AB5 перемещение курсора вниз в поле редактирования +;#2AD7 перемещение курсора влево в поле редактирования +;#2AE3 перемещение курсора вправо в поле редактирования +;#2AF9 найти в строке ближайшую редактируемую позицию +;#2B02 найти в строке ближайшую редактируемую позицию +;#2B0B вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран +;#2B30 вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран +;#2B5B поиск редактируемой позиции слева от курсора во всем буфере +;#2B78 поиск редактируемой позиции справа от курсора во всем буфере +;#2BD4 поиск редактируемого символа в строке справа от курсора +;#2BDF поиск в строке влево от курсора редактируемого символа +;#2BEA поиск начала слова слева от курсора +;#2C09 поиск начала слова справа от курсора +;#2C31 поиск начала строки редактирования в буфере +;#2C4C поиск конца строки в буфере редактирования +;#2C68 вставить строку бейсик программы, если были изменения +;#2C7C вставить строку в бейсик программу, если были изменения +;#2C8E вставить строку бейсик программы +;#2D54 получить очередной символ из строки бейсик программы +;#2D8F получить символ из текущей позиции курсора в буфере редактирования +;#2E0E получить символ из строки буфера редактирования +;#2E1F сброс верхнего окна редактирования +;#2E2D сброс нижнего окна редактирования +;#2E41 поиск в строке вправо от курсора редактируемого символа +;#2E63 поиск в строке влево от курсора редактируемого символа +;#2E7B чтение символа из буфера редактирования +;#2E81 вставка символа в буфер редактирования +;#2ECE вставка пустой строки в буфер редактирования +;#2ED3 вставка пустой строки в буфер редактирования +;#2F12 удаление символа в строке в буфере редактирования +;#2F80 сдвиг строк вверх в буфере при удалении строки +;#2FBC ext+E удаление символов от курсора до начала текущего слова +;#3017 ext+W удаление символов от курсора до начала следующего слова +;#303E ext+K удаление символов до наала строки +;#3072 ext+J удаление символов до конца строки +;#3084 удаление курсора и запрет на обновление экрана +;#3095 проверка наличия предыдущего символа в буфере +;#30B4 расчет адреса начала строки в буфере редактирования +;#30C6 !!!NOT USED!!! +;#30D0 параметры для установки буфера редактирования строки внизу экрана +;#30D6 установка буфера редактирования внизу экрана +;#30DF сдвиг строк в буфере редактирования вверх +;#311E сдвиг строк в буфере редактирования вниз +;#316E вставка символа в нижний буфер редактирования +;#31C3 расчет адреса начала строки в буфере редактирования +;#31C9 удаление символа в нижнем буфере редактирования +;#321E параметры для установки буфера редактирования строки вверху экрана +;#3222 установка буфера редактирования в верху экрана +;#322B перемещение курсора вверх в верхнем буфере редактирования +;#326A копирование строки бейсик программы в буфер редактирования вверзу экрана +;#32B7 расчет адреса начала строки в буфере редактирования +;#32BD таблица обработки управляющих кодов при редактировании строки +;#32D6 копирование строки программы в буфер редактирования +;#3331 перенос части строки на следующую строку +;#334A поиск адреса строки бейсик программы +;#3352 преобразование номера строки в ASCII и помещение в буфер +;#335A преобразование токена в текст +;#335F копирование процедур в ram +;#3374 копирование токена в буфер токенов (=#FCAE) +;#33C3 копирование токена (=#FCFD) +;#33F4 распознавание токена (=#FD2E) +;#3430 преобразование номера строки в ASCII и помещение в буфер +;#3495 выделение разряда числа и занесение его в буфер +;#34B6 поиск адрес строки программы с заданным номером или следущей строки, если строка с заданным номером не существует +;#34CF расчет адреса следущей строки бейсик программы +;#34D9 проверка на конец бейсик программы +;#34E0 сравнение номера строки с заданным +;#34EA обнуление указателей в бейсик строке +;#34F6 поиск адрес строки бейсик программы в памяти +;#3517 преобразование токена в текст +;#3594 токены basic128 +;#35BC установка параметров отступа +;#35C5 сохранить символ в указанном столбце текущей строки буфера редактирования +;#35CC процедура обработки нажатия 'enter' в строке +;#35DA процедура обработки зануления до конца строки +;#35E6 зануление до конца строки в буфере редактирования +;#35F4 создание отступа в строке в буфере редактирования +;#3604 печать строки редактируемого буфера, при необходимости +;#3618 сдвиг вверх строк в буфере редактирования при необходимости +;#362C сдвиг вниз строк в буфере редактирования при необходимости +;#3640 печать атрибутов курсора +;#364F восстановление атрибутов под курсором +;#365E установка переменных для ввода символа +;#367F ожидание нажатия клавиши +;#36A8 печать меню basic 128k +;#3719 печать одной линии вокруг меню +;#372B установка координат печати из bc +;#3733 печать строки из hl +;#373B сохранение окна экрана 14*12 в буфере +;#373E восстановление окна экрана 14*12 из буфера +;#377E сохранение/восстановление 14 знакомест экана в буфере +;#37A7 клавиша вверх в меню basic128 +;#37B6 клавиша вниз в меню basic128 +;#37CA инвертирование атрибутов опции меню +;#37EC управляющие коды для печати меню +;#37FA управляющие коды для печати меню +;#3802 данные потоков для печати эмблемы +;#3812 управляющие коды для печати косых полос в меню +;#3822 печать эмблемы ZX (косые цветные полосы) в меню +;#3848 печать информационной строки 128 BASIC +;#384D печать информационной строки Calculator +;#3852 печать информационной строки 48 TR-DOS +;#3857 печать информационной строки 128 TR-DOS +;#3881 очистка двух нижних строк экрана +;#3888 перенумерация строк программы +;#390E анализ строки и перенумерование ссылок на номера строк +;#3A05 подсчет количества строк в бейсик программе +;#3A35 пропуск пробелов в строке +;#3A3C номер строки в ASCII +;#3A60 получить один разря числа в ASCII +;#3A7F установка настроек курсора для верхнего окна +;#3A88 установка настроек курсора для нижнего окна +;#3A91 !!!NOT USED!!! +;#3A96 сохранить атрибуты курсора +;#3A9D печать атрибутов курсора +;#3AB2 восстановление атрибутов под курсором +;#3ABF сдвиг вверх строк в буфере редактирования +;#3AC6 сдвиг вниз строк в буфере редактирования +;#3B1E печать строки редактируемого буфера +;#3B5E очистка строк экрана +;#3B94 расчет количества строк и столцов до конца экрана +;#3B98 расчет количества строк от заданной до низа экрана +;#3BA0 расчет адреса атрибутов +;#3BB8 обмен атрибутов basic 128 с основными атрибутами +;#3BE9 запуск команды randomize 15619: rem: load "boot" +;#3C1C !!!NOT USED!!! копирование и выполненение бейсик строки +;#3C20 !!!NOT USED!!! бейсик строка +;#3C35 возврат из монтора +;#3C4A !!!NOT USED!!! вход в монитор (продолжение x08E1) +;#3C56 пауза 25 фреймов +;#3C63 токенизация строки бейсик программы с синтаксической ошибкой +;#3C67 токенизация строки бейсик программы +;#3D9D получить очередной символ из строки бейсик программы и определить его тип +;#3DC6 проверка символа на принадлежность к буквам нижнего регистра +;#3DCD копирование слова из буфера в строку бейсик программы +;#3DE9 вставить символ в буфер редактирования +;#3E16 вставка символа в сроку бейсик программы с обработкой < и > +;#3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек +;#3E9C вставка символа в сроку бейсик программы с игнорированием пробелов +;#3EFB вставка символа в сроку бейсик программы +;#3F66 проверка наличия свободного места в памяти +;#3F7E распознавание токена +;#3FBA копирование строки из hl в de в (hl+0) кол-во байт +;#3FC3 !!!NOT USED!!! преобразование ASCII в цифру +;#3FCE обработка нажатой управляющей клавиши +;#3FEE вызов call (hl) +;#3FEF инициалы программистов +;#4000 + + + + +;АДРЕС: #0000 включение компьютера/"холодный" старт +x0000 di + jp x08D1 + +;АДРЕС: #0004 вход в монитор +x0004 out (c),a + nop + nop + +;АДРЕС: #0008 rst #08 вызов функции монитора +x0008 jp x0014 + nop + nop + +;АДРЕС: #000D возврат из монитора +x000D jp x3C35 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #28 ;вызов п/п из basic 48k + dw Rom1.x0010 + ret + +;АДРЕС: #0014 rst #08 вызов функции монитора +x0014 jp x08B1 + nop + +;АДРЕС: #0018 чтение очередного символа строки программы +x0018 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0018 + ret + +;АДРЕС: #001C переход в rom2 при ресете +x001C out (c),a + nop + nop + +;АДРЕС: #0020 получение следующего символа из бейсик программы +x0020 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0020 + ret + +;АДРЕС: #0024 переход в rom2 при rst #08 +x0024 out (c),a + nop + nop + +;АДРЕС: #0028 вызов процедуры из basic 48k +x0028 ex (sp),hl + push af + ld a,(hl) + inc hl + inc hl + ld (x5B5A),hl + dec hl + ld h,(hl) + ld l,a + pop af + jp x005C + nop ;not use + +;АДРЕС: #0038 обработчик прерываний +x0038 push hl + ld hl,x0048 + push hl + ld hl,x5B00 + push hl + ld hl,Rom1.x0038 + push hl + jp x5B00 +x0048 pop hl + ret + +;АДРЕС: #004A обработчик ошибок basic 128 +x004A ld bc,#7FFD + xor a + di + out (c),a ;rom 0(128k), ram 0, scr 5, 128k + ld (x5B5C),a + ei + dec a + ld (iy+#00),a ;no error + jp x0321 + +;АДРЕС: #005C вызов процедуры (продолжение rst #28) +x005C ld (x5B58),hl + ld hl,x5B14 + ex (sp),hl + push hl + ld hl,(x5B58) + ex (sp),hl + jp x5B00 + +;АДРЕС: #006B п/п переключения страниц rom0/1 копируется в адрес x5B00 +x006B push af + push bc + ld bc,#7FFD + ld a,(x5B5C) + xor #10 + di + ld (x5B5C),a + out (c),a + ei + pop bc + pop af + ret +;АДРЕС: #007F сюда возврат после отработки п/п по rst #28 (=#5B14) +x007F call x5B00 + push hl + ld hl,(x5B5A) ;адрес возврата в процедуру при вызове rst #28 + ex (sp),hl + ret +;АДРЕС: #0088 обработчик ошибок basic 128k +x0088 di + ld a,(x5B5C) + and #EF + ld (x5B5C),a + ld bc,#7FFD + out (c),a + ei + jp x00C3 +;АДРЕС: #009A ввод из канала "P" +x009A ld hl,x06D8 + jr x00A2 +;АДРЕС: #009F вывод в канал "P" +x009F ld hl,x07CA +x00A2 ex af,af' + ld bc,#7FFD + ld a,(x5B5C) + push af + and #EF + di + ld (x5B5C),a + out (c),a + jp x05E6 ;RS232 ввод и вывод +;АДРЕС: #00B5 выход из процедуры ввода/вывода в канал "P" +; (включение предыдущего rom basic48/128) +x00B5 ex af,af' + pop af + ld bc,#7FFD + di + ld (x5B5C),a + out (c),a + ei + ex af,af' + ret + +;АДРЕС: #00C3 обработчик ошибок basic 128k +x00C3 ld hl,(#5B8B) + jp (hl) + +;АДРЕС: #00C7 вход из монитора после "холодного старта" +x00C7 ld b,#08 +x00C9 ld a,b ;проверка и зануление всех страниц[0..7] памяти + exx + dec a + ld bc,#7FFD + out (c),a + ld hl,#C000 + ld de,#C001 + ld bc,#3FFF + ld a,#FF + ld (hl),a + cp (hl) + jr nz,x0131 ;битая память + xor a + ld (hl),a + cp (hl) + jr nz,x0131 ;битая память + ldir + exx + djnz x00C9 + ld (x5B88),a + +;АДРЕС: #00ED вход из монитора после "теплого старта" +x00ED ld c,#FD + ld d,#FF + ld e,#BF + ld b,d + ld a,#0E ;регистр AY #0E + out (c),a ;bc=#FFFD + ld b,e ;bc=#BFFD + ld a,#FF + out (c),a + jr x0137 +x00FF nop ;not used + +;АДРЕС: #0100 !!!NOT USED!!! керналь процедур +x0100 jp x17AF ;парсер бейсик программы + jp x1838 ;выполнение команды из строки редактирования + jp x1ECF ;запись данных в RAM 7 + jp x1F04 ;чтение данных из RAM 7 + jp x004A ;обработчик ошибок basic 128 + jp x03A2 ;обработчик ошибок + jp x182A ;RETURN + jp x18A8 ;NEXT + jp x012D ;опрос клавиатуры + jp x0A05 ;команда PLAY + jp x11A3 ;загрузка байта в порт MIDI + jp x06D8 ;процедура ввода из RS232 + jp x07CA ;процедура вывода в RS232 + jp x08A3 ;передача байта на принтер + jp x08F0 ;команда COPY +x012D rst #28 ;вызов процедуры из basic 48k + dw Rom1.x3B01 ;опрос клавиатуры + ret + +;АДРЕС: #0131 ошбка проверки памяти (битая память) +x0131 exx + ld a,b + out (#FE),a + jr $ + +;АДРЕС: #0137 инициализация переменных и печать меню 128k +; de=#FFBF +; c=#FD +x0137 ld b,d ;установка регистра #07 AY + ld a,#07 + out (c),a + ld b,e + ld a,#FF + out (c),a ;выключим звук в AY + ld de,#5B00 + ld hl,x006B ;п/п переключения страниц памяти + ld bc,#0058 + ldir + ld a,#CF ;обработчик ошибок basic 48 + ld (x5B5D),a + ld sp,#5BFF + ld a,#04 + call x1C64 ;включим ram 7 + ld ix,#EBEC ;адрес начала каталога rom-disk + ld (x5B83),ix + ld (ix+#0A),#00 + ld (ix+#0B),#C0 + ld (ix+#0C),#00 + ld hl,#2BEC ;свободное место на rom-disk + ld a,#01 + ld (x5B85),hl + ld (x5B85+2),a + ld a,#05 ;ram 0 + call x1C64 + ld hl,#FFFF ;адрес последнего байта физического ОЗУ + ld (#5CB4),hl + ld de,#3D00+#01AF ;адрес последнего байта символа "U" в basic 48 + ld bc,#00A8 ;копирование символов шрифта [A..U] + ex de,hl + rst #28 ;вызов п/п из basic 48k + dw Rom1.x1661 ;lddr, ret + ex de,hl + inc hl + ld (#5C7B),hl ;адрес начала определяемых пользователем символов + dec hl + ld bc,#0040 + ld (#5C38),bc + ld (#5CB2),hl ;последний адрес в ОЗУ разрешенный для basic + +;АДРЕС: #019D команда NEW +x019D ld hl,#3D00-#100 ;адрес символьного набора + ld (#5C36),hl + ld hl,(#5CB2) ;Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика + inc hl + ld sp,hl + im 1 + ld iy,#5C3A + set 4,(iy+#01) ;режим 128k + ei + ld hl,#000B + ld (x5B5F),hl ;скорость принтера 9600 бод + xor a + ld (x5B61),a + ld (x5B63),a + ld (x5B65),a + ld hl,#EC00 ;!!!ОШИБКА!!! должно писаться в rqm 7 + ld (#FF24),hl + ld a,#50 ;ширна печати 80 символов + ld (x5B64),a + ld hl,#000A + ld (x5B94),hl + ld (x5B96),hl + ld hl,#5CB6 ;копируем нформацию о каналах + ld (#5C4F),hl + ld de,x0589 + ld bc,#0015 + ex de,hl + ldir + ex de,hl + dec hl + ld (#5C57),hl ;Адрес начала следующей строки бейсик-программы + inc hl + ld (#5C53),hl ;Адрес начала бейсик-программы + ld (#5C4B),hl ;Адрес начала области переменных бейсик-программы + ld (hl),#80 ;признак конца переменных бейсика + inc hl + ld (#5C59),hl ;Адрес начала редактируемой строки + ld (hl),#0D + inc hl + ld (hl),#80 + inc hl + ld (#5C61),hl ;Адрес начала рабочей области бейсик-программы + ld (#5C63),hl ;Адрес начала стека калькулятора + ld (#5C65),hl ;Адрес вершины стека калькулятора + ld a,#38 + ld (#5C8D),a ;Постоянные атрибуты экрана + ld (#5C8F),a ;Временные атрибуты, используемые при выводе на экран + ld (#5C48),a ;Атрибуты служебного экрана + xor a + ld (#EC13),a ;!!!ОШИБКА!!! должно писаться в rqm 7 + ld a,#07 + out (#FE),a ;бордюр + ld hl,#0523 ;автоповтор и период задержки + ld (#5C09),hl + dec (iy-#3A) ;x5C00 + dec (iy-#36) ;x5C04 + ld hl,x059E + ld de,#5C10 ;Область хранения информации о потоках + ld bc,#000E + ldir + res 1,(iy+#01) + ld (iy+#00),#FF ;no error + ld (iy+#31),#02 ;Количество строк в служебном экране + rst #28 ;вызов п/п x0D6B из basic 48k + dw Rom1.x0D6B ;CLS + rst #28 ;вызов п/п из basic 48k + dw Rom1.x3C04 ;проверка Break и вызов теста экрана + ld de,x0561 ;1992-94 Scorpion ZS 256 + call x057D ;печать строки из de + ld (iy+#31),#02 ;Количество строк в служебном экране + set 5,(iy+#02) + ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#38 + ld (#EC11),a + ld (#EC0F),a + call x2584 ;подготовка переменных 2-3,1=%11 + call x1F20 ;установка другого стэка и ram 0 + rst #08 ;вызов функции монитора + db #8C ;нажатие Enter и переход на rom 0: #259F + nop + +;АДРЕС: #026B выполненение введенной строки +x026B ld hl,x5B66 ;флаги + set 0,(hl) ;режим + ld (iy+#00),#FF ;код ошибки + ld (iy+#31),#02 ;количество строк в служебном экране + ld hl,x5B1D ;сюда вернемся при ошибке + push hl + ld (#5C3D),sp + ld hl,x02BA + ld (x5B8B),hl ;сюда вернемся при ошибке + call x228E ;поиск начала бейсик команды + call x22CB ;проверка токена + jp z,x21F8 ;вычисличть числовое выражение + cp "(" + jp z,x21F8 ;вычисличть числовое выражение + cp "-" + jp z,x21F8 ;вычисличть числовое выражение + cp "+" + jp z,x21F8 ;вычисличть числовое выражение + call x22E0 ;проверка это число или функция + jp z,x21F8 ;вычисличть числовое выражение + call x1F45 ;установка другого стэка и ram 7 + ld a,(#EC0E) + call x1F20 ;установка другого стэка и ram 0 + cp #04 + jp nz,x17AF ;анализ и выполнение программы + call x2297 ;проверка это команда LET? (калькулятор basic 128) + jp z,x17AF ;анализ и выполнение программы + pop hl + ret + +;АДРЕС: #02BA сюда возвращаемся после проверки синтаксиса бейсика +x02BA bit 7,(iy+#00) + jr nz,x02C1 + ret ;ошибок не было +x02C1 ld hl,(#5C59) + ld (#5C5D),hl + rst #28 + dw Rom1.x19FB ;получить номер редактиремой строки + ld a,b + or c + jp nz,x03F7 + rst #18 ;чтение очередного символа строки программы + cp #0D + ret z + call x21EF ;очистка экрана + bit 6,(iy+#02) + jr nz,x02DF + rst #28 + dw Rom1.x0D6E ;открыть канал +x02DF res 6,(iy+#02) + call x1F45 ;установка другого стэка и ram 7 + ld hl,#EC0D + bit 6,(hl) + jr nz,x02F4 + inc hl + ld a,(hl) + cp #00 + call z,x3881 ;очистка двух нижних строк экрана +x02F4 call x1F20 ;установка другого стэка и ram 0 + ld hl,#5C3C + res 3,(hl) + ld a,#19 + sub (iy+#4F) + ld (#5C8C),a + set 7,(iy+#01) + ld (iy+#0A),#01 ;!!!ОШИБКА!!! + ld hl,#3E00 + push hl + ld hl,x5B1D + push hl + ld (#5C3D),sp + ld hl,x0321 + ld (x5B8B),hl + jp x1838 ;выполнение команды из строки редактирования + +;АДРЕС: #0321 обработчик ошибок +x0321 ld sp,(#5CB2) + inc sp + ld hl,x5BFF + ld (x5B81),hl + halt + res 5,(iy+#01) + ld hl,x5B66 + bit 2,(hl) + jr z,x034A + call x1F45 ;установка другого стэка и ram 7 + ld ix,(x5B83) + ld bc,#0014 + add ix,bc + call x1D56 ;обновление записи каталога + call x1F20 ;установка другого стэка и ram 0 +x034A ld a,(#5C3A) + inc a +x034E push af + ld hl,#0000 + ld (iy+#37),h + ld (iy+#26),h + ld (#5C0B),hl + ld hl,#0001 + ld (#5C16),hl + rst #28 + dw Rom1.x16B0 ;очистка различных областей памяти + res 5,(iy+#37) + rst #28 + dw Rom1.x0D6E ;открыть канал + set 5,(iy+#02) + pop af + ld b,a + cp #0A + jr c,x037F + cp #1D + jr c,x037D + add a,#14 + jr x037F +x037D add a,#07 +x037F rst #28 + dw Rom1.x15EF ;печать символа из a + ld a," " + rst #10 + ld a,b + cp #1D + jr c,x039C + sub #1D + ld b,#00 + ld c,a + ld hl,x046C + add hl,bc + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + call x057D ;печать строки из de + jr x03A2 +x039C ld de,Rom1.x1391 + rst #28 + dw Rom1.x0C0A ;печать сообщения +x03A2 xor a + ld de,Rom1.x1536 + rst #28 + dw Rom1.x0C0A ;печать сообщения + ld bc,(#5C45) + rst #28 + dw Rom1.x1A1B ;печать номера строки + ld a,":" + rst #10 + ld c,(iy+#0D) + ld b,#00 + rst #28 + dw Rom1.x1A1B ;печать номера строки + rst #28 + dw Rom1.x1097 ;очистка памяти + ld a,(#5C3A) + inc a + jr z,x03DF + cp #09 + jr z,x03CC + cp #15 + jr nz,x03CF +x03CC inc (iy+#0D) +x03CF ld bc,#0003 + ld de,#5C70 + ld hl,#5C44 + bit 7,(hl) + jr z,x03DD + add hl,bc +x03DD lddr +x03DF ld (iy+#0A),#FF + res 3,(iy+#01) + ld hl,x5B66 + res 0,(hl) + jp x25CB + +;АДРЕС: #03EF обработчик ошибок +x03EF ld a,#10 + ld bc,#0000 + jp x034E + +;АДРЕС: #03F7 вставка строки программы +x03F7 ld (#5C49),bc + call x1F45 ;установка другого стэка и ram 7 + ld a,b + or c + jr z,x040A + ld (#5C49),bc + ld (#EC08),bc +x040A call x1F20 ;установка другого стэка и ram 0 + ld hl,(#5C5D) + ex de,hl + ld hl,x03EF + push hl + ld hl,(#5C61) + scf + sbc hl,de + push hl + ld h,b + ld l,c + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + jr nz,x0429 + rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x0429 pop bc + ld a,c + dec a + or b + jr nz,x0442 + call x1F45 ;установка другого стэка и ram 7 + push hl + ld hl,(#5C49) + call x334A ;поиск адреса строки бейсик программы + ld (#5C49),hl + pop hl + call x1F20 ;установка другого стэка и ram 0 + jr x046A +x0442 push bc + inc bc + inc bc + inc bc + inc bc +x0447 dec hl + ld de,(#5C53) + push de + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + pop hl + ld (#5C53),hl + pop bc + push bc + inc de + ld hl,(#5C61) + dec hl + dec hl + lddr + ld hl,(#5C49) + ex de,hl + pop bc + ld (hl),b + dec hl + ld (hl),c + dec hl + ld (hl),e + dec hl + ld (hl),d +x046A pop af + ret + +;АДРЕС: #046C адреса сообщений об ошибках +x046C dw x048C + dw x0497 + dw x04A6 + dw x04B0 + dw x04C1 + dw x04D4 + dw x04E0 + dw x04E0 + dw x04F3 + dw x0501 + dw x0512 + dw x0523 + dw x0531 + dw x0542 + dw x054E + dw x0561 + +;АДРЕС: #048C сообщения об ошибках +x048C dc "MERGE error" +x0497 dc "Wrong file type" +x04A6 dc "CODE error" +x04B0 dc "Too many brackets" +x04C1 dc "File already exists" +x04D4 dc "Invalid name" +x04E0 dc "File does not exist" +x04F3 dc "Invalid device" +x0501 dc "Invalid baud rate" +x0512 dc "Invalid note name" +x0523 dc "Number too big" +x0531 dc "Note out of range" +x0542 dc "Out of range" +x054E dc "Too many tied notes" +x0561 dc " 1992-94 Scorpion ZS 256 " + +;АДРЕС: #057D печать строки из de +;вх: de - адрес строки для печати +x057D ld a,(de) + and #7F + push de + rst #10 ;печать символа из A + pop de + ld a,(de) + inc de + add a,a + jr nc,x057D + ret + +;АДРЕС: #0589 информация о каналах +x0589 dw #09F4,#10A8: db "K" + dw #09F4,#15C4: db "S" + dw #0F81,#15C4: db "R" + dw x5B34,x5B2F: db "P" + db #80 + +;АДРЕС: #059E информация о потоках +x059E db #01,#00 ; + db #06,#00 + db #0B,#00 + db #01,#00 + db #01,#00 + db #06,#00 + db #10,#00 + +;АДРЕС: #05AC обработка ошибки +x05AC pop hl + ld bc,#7FFD + xor a + di + ld (x5B5C),a + out (c),a ;rom 0, ram 0, scr 5 + ei + ld sp,(#5C3D) + ld a,(hl) ;код ошибки + ld (x5B5E),a ;код сообщения для rst 8 basic48 + inc a + cp #1E ;!!!ОШИБКА!!! должно быть cp #1D + jr nc,x05C8 + rst #28 ;вызов процедуры из basic 48k + dw #5B5D +x05C8 dec a + ld (iy+#00),a ;код ошибки + ld hl,(#5C5D) ;адрес следущего символа в бейсик-программе + ld (#5C5F),hl ;адрес синтаксической ошибки + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16C5 ;восстановление стэка + ret + +;АДРЕС: #05D6 проверка нажатия break и печать сообщения +x05D6 ld a,#7F +x05D8 in a,(#FE) + rra + ret c ;пробел не нажат + ld a,#FE + in a,(#FE) + rra + ret c ;cs не нажата + call x05AC ;без возврата + db #14 ;L BREAK into program, n:m + +;АДРЕС: #05E6 RS232 ввод и вывод +x05E6 ei + ex af,af' + ld de,x5B4A ;п/п включения предыдущего rom bacic48/128 + push de + res 3,(iy+#02) ;проверка режима вывода не экран не требуется + push hl + ld hl,(#5C3D) ;адрес стэка при запуске обработки ошибок + ld e,(hl) + inc hl + ld d,(hl) + and a + ld hl,Rom1.x107F + sbc hl,de + jr nz,x0637 ;обработчик ошибок в basic128 + pop hl + ld sp,(#5C3D) + pop de + pop de + ld (#5C3D),de +x060A push hl + ld de,x0610 + push de + jp (hl) +x0610 jr c,x061B + jr z,x0618 +x0614 call x05AC ;без возврата + db #07 ;8 End of file, n:m +x0618 pop hl + jr x060A +x061B cp #0D + jr z,x062D + ld hl,(x5B5A) ;адрес возврата в basic128 + push hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0F85 ;добавить код в строку + pop hl + ld (x5B5A),hl + pop hl + jr x060A +x062D pop hl + ld a,(x5B5C) + or #10 + push af + jp x5B4A ;включение basic48 +x0637 pop hl + ld de,x063D + push de + jp (hl) +x063D ret c + ret z + jr x0614 + +;АДРЕС: #0641 команда FORMAT +; FORMAT "P";9600 +x0641 rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + jr z,x0661 ;проверка синтаксиса + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + ld a,c + dec a + or b + jr z,x0659 ;длина строки 1 байт + call x05AC ;ошибка + db #24 ;i Invalid device +x0659 ld a,(de) + and #DF + cp "P" + jp nz,x1912 ;ошибка C Nonsense in BASIC +x0661 ld hl,(#5C5D) + ld a,(hl) + cp ";" + jp nz,x1912 ;ошибка C Nonsense in BASIC + rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы +x066D rst #28 + dw Rom1.x1C82 ;получение числового значения + bit 7,(iy+#01) + jr z,x067D ;проверка синтаксиса + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (x5B71),bc +x067D rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp #0D + jr z,x0689 + cp ":" + jp nz,x1912 ;ошибка C Nonsense in BASIC +x0689 call x18A1 + ld bc,(x5B71) + ld a,b + or c + jr nz,x0698 + call x05AC ;ошибка + db #25 ;j invalid baud rate +x0698 ld hl,x06B8 +x069B ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex de,hl + ld a,h + cp #25 + jr nc,x06AF + and a + sbc hl,bc + jr nc,x06AF + ex de,hl + inc hl + inc hl + jr x069B +x06AF ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + ld (x5B5F),de + ret +x06B8 dw #0032,#0AA5 ;Baud=50. + dw #006E,#04D4 ;Baud=110. + dw #012C,#01C3 ;Baud=300. + dw #0258,#00E0 ;Baud=600. + dw #04B0,#006E ;Baud=1200. + dw #0960,#0036 ;Baud=2400. + dw #12C0,#0019 ;Baud=4800. + dw #2580,#000B ;Baud=9600. + +;АДРЕС: #06D8 процедура ввода из RS232 +x06D8 ld hl,x5B61 + ld a,(hl) + and a + jr z,x06E5 + ld (hl),#00 + inc hl + ld a,(hl) + scf + ret + +;АДРЕС: #06E5 чтение байта из RS232 +x06E5 call x05D6 ;проверка нажатия break и печать сообщения + di + exx + ld de,(x5B5F) + ld hl,(x5B5F) + srl h + rr l + or a + ld b,#FA + exx + ld c,#FD + ld d,#FF + ld e,#BF + ld b,d + ld a,#0E + out (c),a ;выбор 14 регистра AY + in a,(c) + or #F0 + and #FB + ld b,e + out (c),a + ld h,a +x070E ld b,d + in a,(c) + and #80 + jr z,x071E ;стартовый бит получен +x0715 exx + dec b + exx + jr nz,x070E + xor a + push af + jr x0757 ;выход по тайиауту +x071E in a,(c) + and #80 + jr nz,x0715 + in a,(c) + and #80 + jr nz,x0715 + exx + ld bc,#FFFD + ld a,#80 + ex af,af' +x0731 add hl,de + nop + nop + nop + nop +x0736 dec hl + ld a,h + or l + jr nz,x0736 + in a,(c) + and #80 + jp z,x074B + ex af,af' + scf + rra + jr c,x0754 + ex af,af' + jp x0731 +x074B ex af,af' + or a + rra + jr c,x0754 + ex af,af' + jp x0731 +x0754 scf + push af + exx +x0757 ld a,h + or #04 + ld b,e + out (c),a + exx + ld h,d + ld l,e + ld bc,#0007 + or a + sbc hl,bc +x0766 dec hl + ld a,h + or l + jr nz,x0766 + ld bc,#FFFD + add hl,de + add hl,de + add hl,de +x0771 in a,(c) + and #80 + jr z,x077F + dec hl + ld a,h + or l + jr nz,x0771 + pop af + ei + ret +x077F in a,(c) + and #80 + jr nz,x0771 + in a,(c) + and #80 + jr nz,x0771 + ld h,d + ld l,e + ld bc,#0002 + srl h + rr l + or a + sbc hl,bc + ld bc,#FFFD + ld a,#80 + ex af,af' +x079D nop + nop + nop + nop + add hl,de +x07A2 dec hl + ld a,h + or l + jr nz,x07A2 + in a,(c) + and #80 + jp z,x07B7 + ex af,af' + scf + rra + jr c,x07C0 + ex af,af' + jp x079D +x07B7 ex af,af' + or a + rra + jr c,x07C0 + ex af,af' + jp x079D +x07C0 ld hl,x5B61 + ld (hl),#01 + inc hl + ld (hl),a + pop af + ei + ret + +;АДРЕС: #07CA процедура вывода в RS232 +x07CA push af + ld a,(x5B65) + or a + jr z,x07E0 + dec a + ld (x5B65),a + jr nz,x07DB + pop af + jp x0872 +x07DB pop af + ld (#5C0F),a + ret +x07E0 pop af + cp #A3 ;SPECTRUM? + jr c,x07F2 ;не токен + ld hl,(x5B5A) + push hl + rst #28 + dw Rom1.x0B52 ;печать токена + pop hl + ld (x5B5A),hl + scf + ret +x07F2 ld hl,#5C3B + res 0,(hl) + cp #20 + jr nz,x07FD + set 0,(hl) +x07FD cp #7F + jr c,x0803 + ld a,"?" +x0803 cp " " + jr c,x081E + push af + ld hl,x5B63 + inc (hl) + ld a,(x5B64) + cp (hl) + jr nc,x081A + call x0822 ;перевод строки + ld a,#01 + ld (x5B63),a +x081A pop af + jp x08A3 ;передача байта на принтер +x081E cp #0D + jr nz,x0830 + +;АДРЕС: #0822 перевод строки на принтере +x0822 xor a + ld (x5B63),a + ld a,#0D + jp x08A3 + +;АДРЕС: #082B !!!NOT USED!!! взврат каретки на принтере +x082B ld a,#0A + jp x08A3 + +;АДРЕС: #0830 продолжение x07CA процедура вывода в RS232 +x0830 cp #06 + jr nz,x0853 + ld bc,(x5B63) + ld e,#00 +x083A inc e + inc c + ld a,c + cp b + jr z,x0848 +x0840 sub #08 + jr z,x0848 + jr nc,x0840 + jr x083A +x0848 push de + ld a," " + call x07CA ;вывод в RS232 + pop de + dec e + ret z + jr x0848 +x0853 cp #16 + jr z,x0860 + cp #17 + jr z,x0860 + cp #10 + ret c + jr x0869 +x0860 ld (#5C0E),a + ld a,#02 + ld (x5B65),a + ret +x0869 ld (#5C0E),a + ld a,#02 + ld (x5B65),a + ret +x0872 ld d,a + ld a,(#5C0E) + cp #16 + jr z,x0882 + cp #17 + ccf + ret nz + ld a,(#5C0F) + ld d,a +x0882 ld a,(x5B64) + cp d + jr z,x088A + jr nc,x0890 +x088A ld b,a + ld a,d + sub b + ld d,a + jr x0882 +x0890 ld a,d + or a + jp z,x0822 +x0895 ld a,(x5B63) + cp d + ret z + push de + ld a," " + call x07CA ;вывод в RS232 + pop de + jr x0895 + +;АДРЕС: #08A3 передача байта на принтер +x08A3 push hl + ld hl,x08EE + ex (sp),hl + push af + ld a,r + di + push af + ld a,#80 + jr x08B8 + +;АДРЕС: #08B1 rst #08 вызов функции монитора +x08B1 push af + ld a,r + di + push af + ld a,#01 +x08B8 push af + inc sp + push bc + ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + ld (#C001),a + cpl + ld (#C002),a + ld a,#12 + jp x0024 ;переход в rom 2 + +;АДРЕС: #08D1 включение компьютера/"холодный" старт +x08D1 ld bc,#692B +x08D4 dec bc ;пауза + ld a,c + or b + jr nz,x08D4 + ld bc,#1FFD + ld a,#12 + jp x001C ;переход в rom2: monitor (инициализация) + +;АДРЕС: #08E1 !!!NOT USED!!! вход куда-то +x08E1 ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + jp x3C4A + +;АДРЕС: #08EE возврат из x08A3 +x08EE ei + ret + +;АДРЕС: #08F0 команда COPY +x08F0 ld hl,x5B72 + ld (hl),#2B +x08F5 ld hl,x0979 + call x095F ;передача на принтер управляющего кода + call x0915 ;печать половины строки + ld hl,x0980 ;!!!not used + call x0822 ;перевод строки + ld hl,x5B72 + xor a + cp (hl) + jr z,x090E + dec (hl) + jr x08F5 +x090E ld hl,x0982 + call x095F ;передача на принтер управляющего кода + ret + +;АДРЕС: #0915 печать половины строки +x0915 ld hl,x5B71 + ld (hl),#FF +x091A call x0926 ;печать столбца пикселей (с двойной высотой) + ld hl,x5B71 + xor a + cp (hl) + ret z + dec (hl) + jr x091A +;печать столбца пикселей (с двойной высотой) +x0926 ld de,#C000 + ld bc,(x5B71) + scf + rl b + scf + rl b + ld a,c + cpl + ld c,a + xor a + push af + push de + push bc +x093A call x096D ;проверить пиксель на экране + pop bc + pop de + ld e,#00 + jr z,x0944 + ld e,d +x0944 pop af + or e + push af + dec b + srl d + srl d + push de + push bc + jr nc,x093A + pop bc + pop de + pop af + ld b,#03 +x0955 push bc + push af + call x08A3 ;передача байта на принтер + pop af + pop bc + djnz x0955 + ret + +;АДРЕС: #095F передача на принтер управляющего кода +x095F ld b,(hl) + inc hl +x0961 ld a,(hl) + push hl + push bc + call x08A3 ;передача байта на принтер + pop bc + pop hl + inc hl + djnz x0961 + ret + +;АДРЕС: #096D проверить пиксель на экране +;вых: a =#00 пикселя нет +x096D rst #28 + dw Rom1.x22AA ;рассчитать адрес на экране по координатам + ld b,a + inc b + xor a + scf +x0974 rra + djnz x0974 + and (hl) + ret + +;АДРЕС: #0979 управляющие коды принтера Epson +x0979 db #06 ;размер в байтах + db #1B,#31 ;ESC '1' - 7/72 дюйма интервал между строками + db #1B,#4C,#00,#03 ;ESC 'L' 0 3 - двойная плотность (768 байт на строку) +x0980 db #01 ;размер в байтах + db #0A ;код перевода строки LF +x0982 db #02 ;размер в байтах + db #1B,#32 ;ESC '2' - 1/6 дюйма интервал между строками + +;АДРЕС: #0985 команда PLAY +x0985 di + push bc + ld de,#0037 + ld hl,#003C +x098D add hl,de ;hl=#003C + (#0037 * b). + djnz x098D + ld c,l + ld b,h + rst #28 + dw Rom1.x0030 ;резервирование памяти + di + push de + pop iy + push hl + pop ix + ld (iy+#10),#FF +x09A0 ld bc,#FFC9 ;-#37 + add ix,bc + ld (ix+#03),#3C + ld (ix+#01),#FF + ld (ix+#04),#0F + ld (ix+#05),#05 + ld (ix+#21),#00 + ld (ix+#0A),#00 + ld (ix+#0B),#00 + ld (ix+#16),#FF + ld (ix+#17),#00 + ld (ix+#18),#00 + rst #28 ;!!!ошибка!!! + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + di + ld (ix+#06),e + ld (ix+#07),d + ld (ix+#0C),e + ld (ix+#0D),d + ex de,hl + add hl,bc + ld (ix+#08),l + ld (ix+#09),h + pop bc + push bc + dec b + ld c,b + ld b,#00 + sla c + push iy + pop hl + add hl,bc + push ix + pop bc +x09F4 ld (hl),c + inc hl + ld (hl),b + or a + rl (iy+#10) + pop bc + dec b + push bc + ld (ix+#02),b + jr nz,x09A0 + pop bc +x0A05 ld (iy+#27),#1A + ld (iy+#28),#0B + push iy + pop hl + ld bc,#002B + add hl,bc + ex de,hl + ld hl,x0A31 + ld bc,#000D + ldir + ld d,#07 + ld e,#F8 + call x0E7C ;вывод значения в регистр AY + ld d,#0B + ld e,#FF + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + jr x0A7D + +;АДРЕС: #0A31 расчет задержки +x0A31 rst #28 + db #A4 ; stk-ten. = x, 10 + db #01 ; exchange. = 10, x + db #05 ; division. = 10/x + db #34 ; stk-data. = 10/x, 7.33e-6 + db #DF ; - exponent $6F (floating point number 7.33e-6). + db #75 ; - mantissa byte 1 + db #F4 ; - mantissa byte 2 + db #38 ; - mantissa byte 3 + db #75 ; - mantissa byte 4 + db #05 ; division. = (10/x)/7.33e-6 + db #38 ; end-calc. + ret + +;АДРЕС: #0A3E опрос клавиши Break +x0A3E ld a,#7F + in a,(#FE) + rra + ret c + ld a,#FE + in a,(#FE) + rra + ret + +;АДРЕС: #0A4A установка указателя на данные для канала AY +x0A4A ld bc,#0011 + jr x0A52 + +;АДРЕС: #0A4F установка указателя на данные для канала AY +x0A4F ld bc,#0000 +x0A52 push iy + pop hl + add hl,bc + ld (iy+#23),l + ld (iy+#24),h + ld a,(iy+#10) + ld (iy+#22),a + ld (iy+#21),#01 + ret + +;АДРЕС: #0A67 установить адрес блока данных канала +x0A67 ld e,(hl) + inc hl + ld d,(hl) + push de + pop ix + ret + +;АДРЕС: #0A6E следующий канал +x0A6E ld l,(iy+#23) + ld h,(iy+#24) + inc hl + inc hl + ld (iy+#23),l + ld (iy+#24),h + ret + +x0A7D call x0A4F ;установка указателя на данные для канала AY +x0A80 rr (iy+#22) + jr c,x0A8C + call x0A67 ;установить адрес блокаданных канала + call x0B5C ;найти следующую ноту +x0A8C sla (iy+#21) + jr c,x0A97 + call x0A6E ;следующий канал + jr x0A80 +x0A97 call x0F91 ;найти наименьшую длительность + push de + call x0F42 ;проиграть ноты во всех каналах + pop de +x0A9F ld a,(iy+#10) + cp #FF + jr nz,x0AAB + call x0E93 ;гасим звуки во всех каналах + ei + ret +x0AAB dec de + call x0F76 ;ожидание + call x0FC1 ;проиграть ноты во всех каналах + call x0F91 ;найти наименьшую длительность + jr x0A9F + +;АДРЕС: #0AB7 список команд +x0AB7 db "HZYXWUVMT)(NO!" + +;АДРЕС: #0AC5 прочитать текущий символ из строки воспроизведения с инкрементом +;вых: cy=1 данных больше нет +x0AC5 call x0EE3 ;прочитать текущий символ из строки воспроизведения + ret c ;нет данных + inc (ix+#06) + ret nz + inc (ix+#07) + ret + +;АДРЕС: #0AD1 получить ноту в полутонах +x0AD1 push hl + ld c,#00 +x0AD4 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jr c,x0AE1 + cp "&" + jr nz,x0AEC + ld a,#80 +x0ADF pop hl + ret +x0AE1 ld a,(iy+#21) + or (iy+#10) + ld (iy+#10),a + jr x0ADF +x0AEC cp "#" + jr nz,x0AF3 + inc c + jr x0AD4 +x0AF3 cp "$" + jr nz,x0AFA + dec c + jr x0AD4 +x0AFA bit 5,a + jr nz,x0B04 + push af + ld a,#0C + add a,c + ld c,a + pop af +x0B04 and #DF + sub "A" + jp c,x0F22 ;k Invalid note name + cp #07 + jp nc,x0F22 ;k Invalid note name + push bc + ld b,#00 + ld c,a + ld hl,x0DF9 + add hl,bc + ld a,(hl) + pop bc + add a,c + pop hl + ret + +;АДРЕС: #0B1D получить числовое значение параметра +x0B1D push hl + push de + ld l,(ix+#06) + ld h,(ix+#07) + ld de,#0000 +x0B28 ld a,(hl) + cp "0" + jr c,x0B45 + cp "9"+1 + jr nc,x0B45 + inc hl + push hl + call x0B50 ;умножение de=de*10 + sub #30 + ld h,#00 + ld l,a + add hl,de + jr c,x0B42 ;переполнение + ex de,hl + pop hl + jr x0B28 +x0B42 jp x0F1A ;l number too big +x0B45 ld (ix+#06),l + ld (ix+#07),h + push de + pop bc + pop de + pop hl + ret + +;АДРЕС: #0B50 умножение de=de*10 +x0B50 ld hl,#0000 + ld b,#0A +x0B55 add hl,de + jr c,x0B42 ;переполнение + djnz x0B55 + ex de,hl + ret + +;АДРЕС: #0B5C найти следующую ноту +x0B5C call x0A3E ;опрос клавиши Break + jr c,x0B69 ;не нажата + call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #14 ;L Break into program +x0B69 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jp c,x0DA2 ;нет данных + call x0DF0 ;идентификация команды + ld b,#00 + sla c + ld hl,x0DCA + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + call x0B84 ;call (hl) + jr x0B5C +x0B83 ret +x0B84 jp (hl) + +;АДРЕС: #0B85 команда ! (коментарий) +x0B85 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + jp c,x0DA1 ;конец строки + cp "!" + ret z + jr x0B85 + +;АДРЕС: #0B85 команда O (октава) +x0B90 call x0B1D ;получить числовое значение параметра + ld a,c + cp #09 + jp nc,x0F12 ;n Out of range + sla a + sla a + ld b,a + sla a + add a,b + ld (ix+#03),a + ret + +;АДРЕС: #0BA5 команда N (разделитель) +x0BA5 ret + +;АДРЕС: #0BA6 команда ( (начало цикла) +x0BA6 ld a,(ix+#0B) + inc a + cp #05 + jp z,x0F2A ;d Too many brackets + ld (ix+#0B),a + ld de,#000C + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + ld (hl),a + inc hl + ld a,(ix+#07) + ld (hl),a + ret + +;АДРЕС: #0BC2 команда ) (конец цикла) +x0BC2 ld a,(ix+#16) + ld de,#0017 + or a + jp m,x0BF0 + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + cp (hl) + jr nz,x0BF0 + inc hl + ld a,(ix+#07) + cp (hl) + jr nz,x0BF0 + dec (ix+#16) + ld a,(ix+#16) + or a + ret p + bit 0,(ix+#0A) + ret z + ld (ix+#16),#00 + xor a + jr x0C0B +x0BF0 ld a,(ix+#16) + inc a + cp #05 + jp z,x0F2A ;d Too many brackets + ld (ix+#16),a + call x0C27 ;получить адрес указателя + ld a,(ix+#06) + ld (hl),a + inc hl + ld a,(ix+#07) + ld (hl),a + ld a,(ix+#0B) +x0C0B ld de,#000C + call x0C27 ;получить адрес указателя + ld a,(hl) + ld (ix+#06),a + inc hl + ld a,(hl) + ld (ix+#07),a + dec (ix+#0B) + ret p + ld (ix+#0B),#00 + set 0,(ix+#0A) + ret + +;АДРЕС: #0C27 получить адрес указателя +x0C27 push ix + pop hl + add hl,de + ld b,#00 + ld c,a + sla c + add hl,bc + ret + +;АДРЕС: #0C32 команда T (темп) +x0C32 call x0B1D ;получить числовое значение параметра + ld a,b + or a + jp nz,x0F12 ;n Out of range + ld a,c + cp #3C + jp c,x0F12 ;n Out of range + cp #F1 + jp nc,x0F12 ;n Out of range + ld a,(ix+#02) + or a + ret nz + ld b,#00 + push bc + pop hl + add hl,hl + add hl,hl + push hl + pop bc + push iy + rst #28 + dw Rom1.x2D2B ;bc на стэк калькулятора + di + pop iy + push iy + push iy + pop hl + ld bc,#002B + add hl,bc + ld iy,#5C3A + push hl + ld hl,x0C76 + ld (x5B5A),hl + ld hl,x5B14 + ex (sp),hl + push hl + jp x5B00 +x0C76 di + rst #28 + dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора + di + pop iy + ld (iy+#27),c + ld (iy+#28),b + ret + +;АДРЕС: #0C84 команда M (микшер) +x0C84 call x0B1D ;получить числовое значение параметра + ld a,c + cp #40 + jp nc,x0F12 ;n Out of range + cpl + ld e,a + ld d,#07 + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0C95 команда V (громкость) +x0C95 call x0B1D ;получить числовое значение параметра + ld a,c + cp #10 + jp nc,x0F12 ;n Out of range + ld (ix+#04),a ;!!!ОШИБКА!!! + ld e,(ix+#02) + ld a,#08 + add a,e + ld d,a + ld e,c + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0CAD команда U (эффекты) +x0CAD ld e,(ix+#02) + ld a,#08 + add a,e + ld d,a + ld e,#1F + ld (ix+#04),e + ret + +;АДРЕС: #0CBA команда W (эффекты) +x0CBA call x0B1D ;получить числовое значение параметра + ld a,c + cp #08 + jp nc,x0F12 ;n Out of range + ld b,#00 + ld hl,x0DE8 + add hl,bc + ld a,(hl) + ld (iy+#29),a + ret + +;АДРЕС: #0CCE команда X (эффекты) +x0CCE call x0B1D ;получить числовое значение параметра + ld d,#0B + ld e,c + call x0E7C ;вывод значения в регистр AY + inc d + ld e,b + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0CDD команда Y (MIDI канал) +x0CDD call x0B1D ;получить числовое значение параметра + ld a,c + dec a + jp m,x0F12 ;n Out of range + cp #10 + jp nc,x0F12 ;n Out of range + ld (ix+#01),a + ret + +;АДРЕС: #0CEE команда Z (MIDI код) +x0CEE call x0B1D ;получить числовое значение параметра + ld a,c + call x11A3 ;загрузка байта в порт MIDI + ret + +;АДРЕС: #0CF6 команда H (стоп) +x0CF6 ld (iy+#10),#FF + ret + +;АДРЕС: #0CFB команды 'a'..'g', 'A'..'G', '1'.."12", '&', '_' +x0CFB call x0E19 ;это цифра? + jp c,x0D81 ;нет + call x0DAC ;расчет указателя на длительность + call x0DB4 ;установка длительности + xor a + ld (ix+#21),a + call x0EC8 ;получение предыдущего параматра + call x0B1D ;получить числовое значение параметра + ld a,c + or a + jp z,x0F12 ;n Out of range + cp #0D + jp nc,x0F12 ;n Out of range + cp #0A + jr c,x0D32 + call x0E00 ;получить длительность ноты + call x0D74 ;увеличение счетчика нот + ld (hl),e + inc hl + ld (hl),d +x0D28 call x0D74 ;увеличение счетчика нот + inc hl + ld (hl),e + inc hl + ld (hl),d + inc hl + jr x0D38 +x0D32 ld (ix+#05),c + call x0E00 ;получить длительность ноты +x0D38 call x0D74 ;увеличение счетчика нот +x0D3B call x0EE3 ;прочитать текущий символ из строки воспроизведения + cp "_" + jr nz,x0D6E + call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом + call x0B1D ;получить числовое значение параметра + ld a,c + cp #0A + jr c,x0D5F + push hl + push de + call x0E00 ;получить длительность ноты + pop hl + add hl,de + ld c,e + ld b,d + ex de,hl + pop hl + ld (hl),e + inc hl + ld (hl),d + ld e,c + ld d,b + jr x0D28 +x0D5F ld (ix+#05),c + push hl + push de + call x0E00 ;получить длительность ноты + pop hl + add hl,de + ex de,hl + pop hl + jp x0D3B +x0D6E ld (hl),e + inc hl + ld (hl),d + jp x0D9C + +;АДРЕС: #0D74 увеличение счетчика нот +x0D74 ld a,(ix+#21) + inc a + cp #0B + jp z,x0F3A ;o Too many tied notes + ld (ix+#21),a + ret + +x0D81 call x0EC8 ;получение предыдущего параматра + ld (ix+#21),#01 + call x0DAC ;расчет указателя на длительность + call x0DB4 ;установка длительности + ld c,(ix+#05) + push hl + call x0E00 ;получить длительность ноты + pop hl + ld (hl),e + inc hl + ld (hl),d + jp x0D9C ;!!!можно убрать +x0D9C pop hl + inc hl + inc hl + push hl + ret + +;АДРЕС: #0DA1 конец строки +x0DA1 pop hl +x0DA2 ld a,(iy+#21) + or (iy+#10) + ld (iy+#10),a + ret + +;АДРЕС: #0DAC расчет указателя на длительность +x0DAC push ix + pop hl + ld bc,#0022 + add hl,bc + ret + +;АДРЕС: #0DB4 установка длительности +x0DB4 push hl + push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + pop de + ld (hl),e + inc hl + ld (hl),d + ex de,hl + ret + +;АДРЕС: #0DCA таблица адресов обработки команд +x0DCA dw x0CFB ;прочие команды + dw x0B85 ; '!' + dw x0B90 ; 'O' + dw x0BA5 ; 'N' + dw x0BA6 ; '(' + dw x0BC2 ; ')' + dw x0C32 ; 'T' + dw x0C84 ; 'M' + dw x0C95 ; 'V' + dw x0CAD ; 'U' + dw x0CBA ; 'W' + dw x0CCE ; 'X' + dw x0CDD ; 'Y' + dw x0CEE ; 'Z' + dw x0CF6 ; 'H' + +;таблица огибающих +x0DE8 db #00 ; W0 - Single decay then off. (Continue off, attack off, alternate off, hold off) + db #04 ; W1 - Single attack then off. (Continue off, attack on, alternate off, hold off) + db #0B ; W2 - Single decay then hold. (Continue on, attack off, alternate on, hold on) + db #0D ; W3 - Single attack then hold. (Continue on, attack on, alternate off, hold on) + db #08 ; W4 - Repeated decay. (Continue on, attack off, alternate off, hold off) + db #0C ; W5 - Repeated attack. (Continue on, attack on, alternate off, hold off) + db #0E ; W6 - Repeated attack-decay. (Continue on, attack on, alternate on, hold off) + db #0A ; W7 - Repeated decay-attack. (Continue on, attack off, alternate on, hold off) + +;АДРЕС: #0DF0 идентификация команды +;вых: z - команда найдена +x0DF0 ld bc,#000F + ld hl,x0AB7 + cpir + ret + +;таблица полутонов +x0DF9 db #09 ; 'A' + db #0B ; 'B' + db #00 ; 'C' + db #02 ; 'D' + db #04 ; 'E' + db #05 ; 'F' + db #07 ; 'G' + +;АДРЕС: #0E00 получить длительность ноты +x0E00 push hl + ld b,#00 + ld hl,x0E0C + add hl,bc + ld d,#00 + ld e,(hl) + pop hl + ret +;длительность нот +x0E0C db #80 ; Rest [Not used since table is always indexed into with a value of 1 or more] + db #06 ; Semi-quaver (sixteenth note). + db #09 ; Dotted semi-quaver (3/32th note). + db #0C ; Quaver (eighth note). + db #12 ; Dotted quaver (3/16th note). + db #18 ; Crotchet (quarter note). + db #24 ; Dotted crotchet (3/8th note). + db #30 ; Minim (half note). + db #48 ; Dotted minim (3/4th note). + db #60 ; Semi-breve (whole note). + db #04 ; Triplet semi-quaver (1/24th note). + db #08 ; Triplet quaver (1/12th note). + db #10 ; Triplet crochet (1/6th note). + +;АДРЕС: #0E19 это цифра? +;вых: cy=0 это цифра +x0E19 cp "0" + ret c + cp "9"+1 + ccf + ret + +;АДРЕС: #0E20 проиграть ноту в канале +x0E20 ld c,a + ld a,(ix+#03) + add a,c + cp #80 + jp nc,x0F32 ;m Note out of range + ld c,a + ld a,(ix+#02) + or a + jr nz,x0E3F + ld a,c + cpl + and #7F + srl a + srl a + ld d,#06 + ld e,a + call x0E7C ;вывод значения в регистр AY +x0E3F ld (ix+#00),c + ld a,(ix+#02) + cp #03 + ret nc + ld hl,x1096 + ld b,#00 + ld a,c + sub #15 + jr nc,x0E57 + ld de,#0FBF + jr x0E5E +x0E57 ld c,a + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) +x0E5E ex de,hl + ld d,(ix+#02) + sla d + ld e,l + call x0E7C ;вывод значения в регистр AY + inc d + ld e,h + call x0E7C ;вывод значения в регистр AY + bit 4,(ix+#04) + ret z + ld d,#0D + ld a,(iy+#29) + ld e,a + call x0E7C ;вывод значения в регистр AY + ret + +;АДРЕС: #0E7C вывод значения в регистр AY +x0E7C push bc + ld bc,#FFFD + out (c),d + ld bc,#BFFD + out (c),e + pop bc + ret + +;АДРЕС: #0E89 чтение регистра AY +x0E89 push bc + ld bc,#FFFD + out (c),a + in a,(c) + pop bc + ret + +;АДРЕС: #0E93 гасим звуки во всех каналах +x0E93 ld d,#07 + ld e,#FF + call x0E7C ;вывод значения в регистр AY + ld d,#08 + ld e,#00 + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + inc d + call x0E7C ;вывод значения в регистр AY + call x0A4F ;установка указателя на данные для канала AY +x0EAC rr (iy+#22) + jr c,x0EB8 + call x0A67 ;установить адрес блока данных канала + call x118D ;гасим звук в канале MIDI +x0EB8 sla (iy+#21) + jr c,x0EC3 + call x0A6E ;следующий канал + jr x0EAC +x0EC3 ld iy,#5C3A + ret + +;АДРЕС: #0EC8 получение предыдущего параматра +x0EC8 push hl + push de + ld l,(ix+#06) + ld h,(ix+#07) +x0ED0 dec hl + ld a,(hl) + cp " " + jr z,x0ED0 + cp #0D + jr z,x0ED0 + ld (ix+#06),l + ld (ix+#07),h + pop de + pop hl + ret + +;АДРЕС: #0EE3 прочитать текущий символ из строки воспроизведения +;вых: cy=1 данных больше нет +x0EE3 push hl + push de + push bc + ld l,(ix+#06) + ld h,(ix+#07) +x0EEC ld a,h + cp (ix+#09) + jr nz,x0EFB + ld a,l + cp (ix+#08) + jr nz,x0EFB + scf + jr x0F05 +x0EFB ld a,(hl) + cp " " + jr z,x0F09 + cp #0D + jr z,x0F09 + or a +x0F05 pop bc + pop de + pop hl + ret +x0F09 inc hl + ld (ix+#06),l + ld (ix+#07),h + jr x0EEC + +;АДРЕС: #0F12 обработка ошибок +x0F12 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #29 ;n Out of range +x0F1A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #27 ;l Number too big +x0F22 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #26 ;k Invalid note name +x0F2A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #1F ;d Too many brackets +x0F32 call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #28 ;m Note out of range +x0F3A call x0E93 ;гасим звуки во всех каналах + ei + call x05AC + db #2A ;o Too many tied notes + +;АДРЕС: #0F42 проиграть ноты во всех каналах +x0F42 call x0A4F ;установка указателя на данные для канала AY +x0F45 rr (iy+#22) + jr c,x0F6C + call x0A67 ;установить адрес блока данных канала + call x0AD1 ;получить ноту в полутонах + cp #80 + jr z,x0F6C + call x0E20 ;проиграть ноту в канале + ld a,(ix+#02) + cp #03 + jr nc,x0F69 + ld d,#08 + add a,d + ld d,a + ld e,(ix+#04) + call x0E7C ;вывод значения в регистр AY +x0F69 call x116E ;проиграть ноту в канале MIDI +x0F6C sla (iy+#21) + ret c + call x0A6E ;следующий канал + jr x0F45 + +;АДРЕС: #0F76 ожидание +x0F76 push hl + ld l,(iy+#27) + ld h,(iy+#28) + ld bc,#0064 + or a + sbc hl,bc + push hl + pop bc + pop hl +x0F86 dec bc + ld a,b + or c + jr nz,x0F86 + dec de + ld a,d + or e + jr nz,x0F76 + ret + +;АДРЕС: #0F91 найти наименьшую длительность +x0F91 ld de,#FFFF + call x0A4A ;установка указателя на данные для канала AY +x0F97 rr (iy+#22) + jr c,x0FAF + push de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld e,(hl) + inc hl + ld d,(hl) + push de + pop hl + pop bc + or a + sbc hl,bc + jr c,x0FAF + push bc + pop de +x0FAF sla (iy+#21) + jr c,x0FBA + call x0A6E ;следующий канал + jr x0F97 +x0FBA ld (iy+#25),e + ld (iy+#26),d + ret + +;АДРЕС: #0FC1 проиграть ноты во всех каналах +x0FC1 xor a + ld (iy+#2A),a + call x0A4F ;установка указателя на данные для канала AY +x0FC8 rr (iy+#22) + jp c,x105A + call x0A67 ;установить адрес блока данных канала + push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + push hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld e,(iy+#25) + ld d,(iy+#26) + or a + sbc hl,de + ex de,hl + pop hl + jr z,x0FFC + ld (hl),e + inc hl + ld (hl),d + jr x105A +x0FFC ld a,(ix+#02) + cp #03 + jr nc,x100C + ld d,#08 + add a,d + ld d,a + ld e,#00 + call x0E7C ;вывод значения в регистр AY +x100C call x118D ;гасим звук в канале MIDI + push ix + pop hl + ld bc,#0021 + add hl,bc + dec (hl) + jr nz,x1026 + call x0B5C ;найти следующую ноту + ld a,(iy+#21) + and (iy+#10) + jr nz,x105A + jr x103D +x1026 push iy + pop hl + ld bc,#0011 + add hl,bc + ld b,#00 + ld c,(ix+#02) + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + inc de + inc de + ld (hl),d + dec hl + ld (hl),e +x103D call x0AD1 ;получить ноту в полутонах + ld c,a + ld a,(iy+#21) + and (iy+#10) + jr nz,x105A + ld a,c + cp #80 + jr z,x105A + call x0E20 ;проиграть ноту в канале + ld a,(iy+#21) + or (iy+#2A) + ld (iy+#2A),a +x105A sla (iy+#21) + jr c,x1066 + call x0A6E ;следующий канал + jp x0FC8 +x1066 ld de,#0001 + call x0F76 ;ожидание + call x0A4F ;установка указателя на данные для канала AY +x106F rr (iy+#2A) + jr nc,x108C + call x0A67 ;установить адрес блока данных канала + ld a,(ix+#02) + cp #03 + jr nc,x1089 + ld d,#08 + add a,d + ld d,a + ld e,(ix+#04) + call x0E7C ;вывод значения в регистр AY +x1089 call x116E ;проиграть ноту в канале MIDI +x108C sla (iy+#21) + ret c + call x0A6E ;следующий канал + jr x106F + +;таблица нот +x1096 dw #0FBF; Octave 1, Note 21 - A (27.50 Hz, Ideal=27.50 Hz, Error=-0.01%) C0 + dw #0EDC; Octave 1, Note 22 - A# (29.14 Hz, Ideal=29.16 Hz, Error=-0.08%) + dw #0E07; Octave 1, Note 23 - B (30.87 Hz, Ideal=30.87 Hz, Error=-0.00%) + + dw #0D3D; Octave 2, Note 24 - C (32.71 Hz, Ideal=32.70 Hz, Error=+0.01%) C1 + dw #0C7F; Octave 2, Note 25 - C# (34.65 Hz, Ideal=34.65 Hz, Error=-0.00%) + dw #0BCC; Octave 2, Note 26 - D (36.70 Hz, Ideal=36.71 Hz, Error=-0.01%) + dw #0B22; Octave 2, Note 27 - D# (38.89 Hz, Ideal=38.89 Hz, Error=+0.01%) + dw #0A82; Octave 2, Note 28 - E (41.20 Hz, Ideal=41.20 Hz, Error=+0.00%) + dw #09EB; Octave 2, Note 29 - F (43.66 Hz, Ideal=43.65 Hz, Error=+0.00%) + dw #095D; Octave 2, Note 30 - F# (46.24 Hz, Ideal=46.25 Hz, Error=-0.02%) + dw #08D6; Octave 2, Note 31 - G (49.00 Hz, Ideal=49.00 Hz, Error=+0.00%) + dw #0857; Octave 2, Note 32 - G# (51.92 Hz, Ideal=51.91 Hz, Error=+0.01%) + dw #07DF; Octave 2, Note 33 - A (55.01 Hz, Ideal=55.00 Hz, Error=+0.01%) + dw #076E; Octave 2, Note 34 - A# (58.28 Hz, Ideal=58.33 Hz, Error=-0.08%) + dw #0703; Octave 2, Note 35 - B (61.75 Hz, Ideal=61.74 Hz, Error=+0.02%) + + dw #069F; Octave 3, Note 36 - C ( 65.39 Hz, Ideal= 65.41 Hz, Error=-0.02%) C2 + dw #0640; Octave 3, Note 37 - C# ( 69.28 Hz, Ideal= 69.30 Hz, Error=-0.04%) + dw #05E6; Octave 3, Note 38 - D ( 73.40 Hz, Ideal= 73.42 Hz, Error=-0.01%) + dw #0591; Octave 3, Note 39 - D# ( 77.78 Hz, Ideal= 77.78 Hz, Error=+0.01%) + dw #0541; Octave 3, Note 40 - E ( 82.41 Hz, Ideal= 82.41 Hz, Error=+0.00%) + dw #04F6; Octave 3, Note 41 - F ( 87.28 Hz, Ideal= 87.31 Hz, Error=-0.04%) + dw #04AE; Octave 3, Note 42 - F# ( 92.52 Hz, Ideal= 92.50 Hz, Error=+0.02%) + dw #046B; Octave 3, Note 43 - G ( 98.00 Hz, Ideal= 98.00 Hz, Error=+0.00%) + dw #042C; Octave 3, Note 44 - G# (103.78 Hz, Ideal=103.83 Hz, Error=-0.04%) + dw #03F0; Octave 3, Note 45 - A (109.96 Hz, Ideal=110.00 Hz, Error=-0.04%) + dw #03B7; Octave 3, Note 46 - A# (116.55 Hz, Ideal=116.65 Hz, Error=-0.08%) + dw #0382; Octave 3, Note 47 - B (123.43 Hz, Ideal=123.47 Hz, Error=-0.03%) + + dw #034F; Octave 4, Note 48 - C (130.86 Hz, Ideal=130.82 Hz, Error=+0.04%) C3 + dw #0320; Octave 4, Note 49 - C# (138.55 Hz, Ideal=138.60 Hz, Error=-0.04%) + dw #02F3; Octave 4, Note 50 - D (146.81 Hz, Ideal=146.83 Hz, Error=-0.01%) + dw #02C8; Octave 4, Note 51 - D# (155.68 Hz, Ideal=155.55 Hz, Error=+0.08%) + dw #02A1; Octave 4, Note 52 - E (164.70 Hz, Ideal=164.82 Hz, Error=-0.07%) + dw #027B; Octave 4, Note 53 - F (174.55 Hz, Ideal=174.62 Hz, Error=-0.04%) + dw #0257; Octave 4, Note 54 - F# (185.04 Hz, Ideal=185.00 Hz, Error=+0.02%) + dw #0236; Octave 4, Note 55 - G (195.83 Hz, Ideal=196.00 Hz, Error=-0.09%) + dw #0216; Octave 4, Note 56 - G# (207.57 Hz, Ideal=207.65 Hz, Error=-0.04%) + dw #01F8; Octave 4, Note 57 - A (219.92 Hz, Ideal=220.00 Hz, Error=-0.04%) + dw #01DC; Octave 4, Note 58 - A# (232.86 Hz, Ideal=233.30 Hz, Error=-0.19%) + dw #01C1; Octave 4, Note 59 - B (246.86 Hz, Ideal=246.94 Hz, Error=-0.03%) + + dw #01A8; Octave 5, Note 60 - C (261.42 Hz, Ideal=261.63 Hz, Error=-0.08%) C4 Middle C + dw #0190; Octave 5, Note 61 - C# (277.10 Hz, Ideal=277.20 Hz, Error=-0.04%) + dw #0179; Octave 5, Note 62 - D (294.01 Hz, Ideal=293.66 Hz, Error=+0.12%) + dw #0164; Octave 5, Note 63 - D# (311.35 Hz, Ideal=311.10 Hz, Error=+0.08%) + dw #0150; Octave 5, Note 64 - E (329.88 Hz, Ideal=329.63 Hz, Error=+0.08%) + dw #013D; Octave 5, Note 65 - F (349.65 Hz, Ideal=349.23 Hz, Error=+0.12%) + dw #012C; Octave 5, Note 66 - F# (369.47 Hz, Ideal=370.00 Hz, Error=-0.14%) + dw #011B; Octave 5, Note 67 - G (391.66 Hz, Ideal=392.00 Hz, Error=-0.09%) + dw #010B; Octave 5, Note 68 - G# (415.13 Hz, Ideal=415.30 Hz, Error=-0.04%) + dw #00FC; Octave 5, Note 69 - A (439.84 Hz, Ideal=440.00 Hz, Error=-0.04%) + dw #00EE; Octave 5, Note 70 - A# (465.72 Hz, Ideal=466.60 Hz, Error=-0.19%) + dw #00E0; Octave 5, Note 71 - B (494.82 Hz, Ideal=493.88 Hz, Error=+0.19%) + + dw #00D4; Octave 6, Note 72 - C (522.83 Hz, Ideal=523.26 Hz, Error=-0.08%) C5 + dw #00C8; Octave 6, Note 73 - C# (554.20 Hz, Ideal=554.40 Hz, Error=-0.04%) + dw #00BD; Octave 6, Note 74 - D (586.46 Hz, Ideal=587.32 Hz, Error=-0.15%) + dw #00B2; Octave 6, Note 75 - D# (622.70 Hz, Ideal=622.20 Hz, Error=+0.08%) + dw #00A8; Octave 6, Note 76 - E (659.77 Hz, Ideal=659.26 Hz, Error=+0.08%) + dw #009F; Octave 6, Note 77 - F (697.11 Hz, Ideal=698.46 Hz, Error=-0.19%) + dw #0096; Octave 6, Note 78 - F# (738.94 Hz, Ideal=740.00 Hz, Error=-0.14%) + dw #008D; Octave 6, Note 79 - G (786.10 Hz, Ideal=784.00 Hz, Error=+0.27%) + dw #0085; Octave 6, Note 80 - G# (833.39 Hz, Ideal=830.60 Hz, Error=+0.34%) + dw #007E; Octave 6, Note 81 - A (879.69 Hz, Ideal=880.00 Hz, Error=-0.04%) + dw #0077; Octave 6, Note 82 - A# (931.43 Hz, Ideal=933.20 Hz, Error=-0.19%) + dw #0070; Octave 6, Note 83 - B (989.65 Hz, Ideal=987.76 Hz, Error=+0.19%) + + dw #006A; Octave 7, Note 84 - C (1045.67 Hz, Ideal=1046.52 Hz, Error=-0.08%) C6 + dw #0064; Octave 7, Note 85 - C# (1108.41 Hz, Ideal=1108.80 Hz, Error=-0.04%) + dw #005E; Octave 7, Note 86 - D (1179.16 Hz, Ideal=1174.64 Hz, Error=+0.38%) + dw #0059; Octave 7, Note 87 - D# (1245.40 Hz, Ideal=1244.40 Hz, Error=+0.08%) + dw #0054; Octave 7, Note 88 - E (1319.53 Hz, Ideal=1318.52 Hz, Error=+0.08%) + dw #004F; Octave 7, Note 89 - F (1403.05 Hz, Ideal=1396.92 Hz, Error=+0.44%) + dw #004B; Octave 7, Note 90 - F# (1477.88 Hz, Ideal=1480.00 Hz, Error=-0.14%) + dw #0047; Octave 7, Note 91 - G (1561.14 Hz, Ideal=1568.00 Hz, Error=-0.44%) + dw #0043; Octave 7, Note 92 - G# (1654.34 Hz, Ideal=1661.20 Hz, Error=-0.41%) + dw #003F; Octave 7, Note 93 - A (1759.38 Hz, Ideal=1760.00 Hz, Error=-0.04%) + dw #003B; Octave 7, Note 94 - A# (1878.65 Hz, Ideal=1866.40 Hz, Error=+0.66%) + dw #0038; Octave 7, Note 95 - B (1979.30 Hz, Ideal=1975.52 Hz, Error=+0.19%) + + dw #0035; Octave 8, Note 96 - C (2091.33 Hz, Ideal=2093.04 Hz, Error=-0.08%) C7 + dw #0032; Octave 8, Note 97 - C# (2216.81 Hz, Ideal=2217.60 Hz, Error=-0.04%) + dw #002F; Octave 8, Note 98 - D (2358.31 Hz, Ideal=2349.28 Hz, Error=+0.38%) + dw #002D; Octave 8, Note 99 - D# (2463.13 Hz, Ideal=2488.80 Hz, Error=-1.03%) + dw #002A; Octave 8, Note 100 - E (2639.06 Hz, Ideal=2637.04 Hz, Error=+0.08%) + dw #0028; Octave 8, Note 101 - F (2771.02 Hz, Ideal=2793.84 Hz, Error=-0.82%) + dw #0025; Octave 8, Note 102 - F# (2995.69 Hz, Ideal=2960.00 Hz, Error=+1.21%) + dw #0023; Octave 8, Note 103 - G (3166.88 Hz, Ideal=3136.00 Hz, Error=+0.98%) + dw #0021; Octave 8, Note 104 - G# (3358.81 Hz, Ideal=3322.40 Hz, Error=+1.10%) + dw #001F; Octave 8, Note 105 - A (3575.50 Hz, Ideal=3520.00 Hz, Error=+1.58%) + dw #001E; Octave 8, Note 106 - A# (3694.69 Hz, Ideal=3732.80 Hz, Error=-1.02%) + dw #001C; Octave 8, Note 107 - B (3958.59 Hz, Ideal=3951.04 Hz, Error=+0.19%) + + dw #001A; Octave 9, Note 108 - C (4263.10 Hz, Ideal=4186.08 Hz, Error=+1.84%) C8 + dw #0019; Octave 9, Note 109 - C# (4433.63 Hz, Ideal=4435.20 Hz, Error=-0.04%) + dw #0018; Octave 9, Note 110 - D (4618.36 Hz, Ideal=4698.56 Hz, Error=-1.71%) + dw #0016; Octave 9, Note 111 - D# (5038.21 Hz, Ideal=4977.60 Hz, Error=+1.22%) + dw #0015; Octave 9, Note 112 - E (5278.13 Hz, Ideal=5274.08 Hz, Error=+0.08%) + dw #0014; Octave 9, Note 113 - F (5542.03 Hz, Ideal=5587.68 Hz, Error=-0.82%) + dw #0013; Octave 9, Note 114 - F# (5833.72 Hz, Ideal=5920.00 Hz, Error=-1.46%) + dw #0012; Octave 9, Note 115 - G (6157.81 Hz, Ideal=6272.00 Hz, Error=-1.82%) + dw #0011; Octave 9, Note 116 - G# (6520.04 Hz, Ideal=6644.80 Hz, Error=-1.88%) + dw #0010; Octave 9, Note 117 - A (6927.54 Hz, Ideal=7040.00 Hz, Error=-1.60%) + dw #000F; Octave 9, Note 118 - A# (7389.38 Hz, Ideal=7465.60 Hz, Error=-1.02%) + dw #000E; Octave 9, Note 119 - B (7917.19 Hz, Ideal=7902.08 Hz, Error=+0.19%) + + dw #000D; Octave 10, Note 120 - C ( 8526.20 Hz, Ideal= 8372.16 Hz, Error=+1.84%) C9 + dw #000C; Octave 10, Note 121 - C# ( 9236.72 Hz, Ideal= 8870.40 Hz, Error=+4.13%) + dw #000C; Octave 10, Note 122 - D ( 9236.72 Hz, Ideal= 9397.12 Hz, Error=-1.71%) + dw #000B; Octave 10, Note 123 - D# (10076.42 Hz, Ideal= 9955.20 Hz, Error=+1.22%) + dw #000B; Octave 10, Note 124 - E (10076.42 Hz, Ideal=10548.16 Hz, Error=-4.47%) + dw #000A; Octave 10, Note 125 - F (11084.06 Hz, Ideal=11175.36 Hz, Error=-0.82%) + dw #0009; Octave 10, Note 126 - F# (12315.63 Hz, Ideal=11840.00 Hz, Error=+4.02%) + dw #0009; Octave 10, Note 127 - G (12315.63 Hz, Ideal=12544.00 Hz, Error=-1.82%) + dw #0008; Octave 10, Note 128 - G# (13855.08 Hz, Ideal=13289.60 Hz, Error=+4.26%) + +;АДРЕС: #116E проиграть ноту в канале MIDI +x116E ld a,(ix+#01) + or a + ret m + or #90 + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#00) + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#04) + res 4,a + sla a + sla a + sla a + call x11A3 ;загрузка байта в порт MIDI + ret + +;АДРЕС: #118D гасим звук в канале MIDI +x118D ld a,(ix+#01) + or a + ret m + or #80 + call x11A3 ;загрузка байта в порт MIDI + ld a,(ix+#00) + call x11A3 ;загрузка байта в порт MIDI + ld a,#40 + call x11A3 ;загрузка байта в порт MIDI + ret ;!!!можно оптимизировать + +;АДРЕС: #11A3 загрузка байта в порт MIDI +x11A3 ld l,a + ld bc,#FFFD + ld a,#0E + out (c),a + ld bc,#BFFD + ld a,#FA ;Set RS232 'RXD' transmit line to 0 + out (c),a + ld e,#03 ;задержка 113 тактов +x11B4 dec e + jr nz,x11B4 + nop + nop + nop + nop + ld a,l + ld d,#08 +x11BE rra + ld l,a + jp nc,x11C9 + ld a,#FE ;Set RS232 'RXD' transmit line to 1 + out (c),a + jr x11CF +x11C9 ld a,#FA ;Set RS232 'RXD' transmit line to 0 + out (c),a + jr x11CF +x11CF ld e,#02 +x11D1 dec e + jr nz,x11D1 + nop + add a,#00 + ld a,l + dec d + jr nz,x11BE + nop + nop + add a,#00 + nop + nop + ld a,#FE ;Set RS232 'RXD' transmit line to 0 + out (c),a + ld e,#06 +x11E7 dec e + jr nz,x11E7 + ret + +;АДРЕС: #11EB команда SAVE +x11EB ld hl,x5B66 + set 5,(hl) + jr x1205 + +;АДРЕС: #11F2 команда LOAD +x11F2 ld hl,x5B66 + set 4,(hl) + jr x1205 + +;АДРЕС: #11F2 команда VERIFY +x11F9 ld hl,x5B66 + set 7,(hl) + jr x1205 + +;АДРЕС: #1200 команда MERGE +x1200 ld hl,x5B66 + set 6,(hl) +x1205 ld hl,x5B66 ;!!!лишнее + res 3,(hl) + rst #18 ;чтение очередного символа строки программы + cp "!" + jp nz,x13BE ;работа с лентой + ld hl,x5B66 + set 3,(hl) + rst #20 ;получение следующего символа из бейсик программы + jp x13BE ;работа с RAM диском + +;АДРЕС: #1219 ошибка C Nonsense in BASIC +x1219 call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #121D работа с RAM диском +x121D ld (x5B74),hl + ld a,(ix+#00) + ld (x5B71),a + ld l,(ix+#0B) + ld h,(ix+#0C) + ld (x5B72),hl + ld l,(ix+#0D) + ld h,(ix+#0E) + ld (x5B78),hl + ld l,(ix+#0F) + ld h,(ix+#10) + ld (x5B76),hl + or a + jr z,x124E ;BASIC + cp #03 + jr z,x124E ;CODE/SCREEN$ + ld a,(ix+#0E) ;DATA + ld (x5B76),a +x124E push ix + pop hl + inc hl + ld de,x5B67 + ld bc,#000A + ldir + ld hl,x5B66 + bit 5,(hl) + jp nz,x1BAD ;SAVE + ld hl,x5B71 + ld de,x5B7A + ld bc,#0007 + ldir + call x1C2E ;загрузка заголовка файла из RAM диска + ld a,(x5B7A) + ld b,a + ld a,(x5B71) + cp b + jr nz,x1280 ;b Wrong file type + cp #03 + jr z,x1290 + jr c,x1284 +x1280 call x05AC + db #1D ;b Wrong file type +x1284 ld a,(x5B66) + bit 6,a + jr nz,x12C5 + bit 7,a + jp z,x12DB +x1290 ld a,(x5B66) + bit 6,a + jr z,x129B + call x05AC + db #1C ;a MERGE error +x129B ld hl,(x5B7B) + ld de,(x5B72) + ld a,h + or l + jr z,x12AE + sbc hl,de + jr nc,x12AE + call x05AC + db #1E ;c CODE error +x12AE ld hl,(x5B7B+2) + ld a,h + or l + jr nz,x12B8 + ld hl,(x5B74) +x12B8 ld a,(x5B71) + and a + jr nz,x12C1 + ld hl,(#5C53) +x12C1 call x137E ;загрузка данных с RAM диска + ret +x12C5 ld bc,(x5B72) + push bc + inc bc + rst #28 + dw Rom1.x0030 ;резервирование памяти +x12CE ld (hl),#80 + ex de,hl + pop de + push hl + call x137E ;загрузка данных с RAM диска + pop hl + rst #28 + dw Rom1.x08CE ;MERGE + ret +x12DB ld de,(x5B72) + ld hl,(x5B7B+2) + push hl + ld a,h + or l + jr nz,x12ED + inc de + inc de + inc de + ex de,hl + jr x12F6 +x12ED ld hl,(x5B7B) + ex de,hl + scf + sbc hl,de + jr c,x12FF +x12F6 ld de,#0005 + add hl,de + ld b,h + ld c,l + rst #28 + dw Rom1.x1F05 ;проверка наличия свободной памяти +x12FF pop hl + ld a,(x5B71) + and a + jr z,x1335 + ld a,h + or l + jr z,x1315 + dec hl + ld b,(hl) + dec hl + ld c,(hl) + dec hl + inc bc + inc bc + inc bc + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x1315 ld hl,(#5C59) + dec hl + ld bc,(x5B72) + push bc + inc bc + inc bc + inc bc + ld a,(x5B7F) + push af + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + pop af + ld (hl),a + pop de + inc hl + ld (hl),e + inc hl + ld (hl),d + inc hl +x1331 call x137E ;загрузка данных с RAM диска + ret +x1335 ld hl,x5B66 + res 1,(hl) + ld de,(#5C53) + ld hl,(#5C59) + dec hl + rst #28 + dw Rom1.x19E5 ;удалить переменные + ld bc,(x5B72) + ld hl,(#5C53) + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + ld bc,(x5B76) + add hl,bc + ld (#5C4B),hl + ld a,(x5B78+1) + ld h,a + and #C0 + jr nz,x1370 + ld a,(x5B78) + ld l,a + ld (#5C42),hl + ld (iy+#0A),#00 + ld hl,x5B66 + set 1,(hl) +x1370 ld hl,(#5C53) + ld de,(x5B72) + dec hl + ld (#5C57),hl + inc hl + jr x1331 ;!!!можно удалить + +;АДРЕС: #137E загрузка данных с RAM диска +x137E ld a,d + or e + ret z + call x1C4B ;загрузка из RAM диска + ret + +;АДРЕС: #1385 получить выражения из строки бейсика +x1385 rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + ret z ;проверка синтаксиса + push af + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + pop af + ret + +;АДРЕС: #1393 проверка и копирование имени файла +x1393 rst #20 + call x1385 ;получить выражения из строки бейсика + ret z ;проверка синтаксиса + push af + ld a,c + or b + jr z,x13BA ;ошибка в имени файла + ld hl,#000A + sbc hl,bc + jr c,x13BA ;ошибка в имени файла + push de + push bc + ld hl,x5B67 + ld b,#0A + ld a," " +x13AD ld (hl),a + inc hl + djnz x13AD + pop bc + pop hl + ld de,x5B67 + ldir + pop af + ret +x13BA call x05AC + db #21 ;f Invalid name + +;АДРЕС: #13BE работа с лентой/RAM диском +x13BE rst #28 + dw Rom1.x1C8C ;параметр - строка + bit 7,(iy+#01) + jr z,x1407 ;проверка синтаксиса + ld bc,#0011 + ld a,(#5C74) + and a + jr z,x13D2 ;SAVE + ld c,#22 ;" +x13D2 rst #28 + dw Rom1.x0030 ;резервирование памяти + push de + pop ix + ld b,#0B + ld a," " +x13DC ld (de),a + inc de + djnz x13DC + ld (ix+#01),#FF + rst #28 + dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора + ld hl,-10 + dec bc + add hl,bc + inc bc + jr nc,x1400 + ld a,(#5C74) + and a + jr nz,x13F9 ;не SAVE + call x05AC ;ошибка + db #0E ;F Invalid file name +x13F9 ld a,b + or c + jr z,x1407 + ld bc,#000A +x1400 push ix + pop hl + inc hl + ex de,hl + ldir +x1407 rst #18 ;чтение очередного символа строки программы + cp #E4 ;это DATA? + jr nz,x145F ;нет + ld a,(#5C74) ; 'xxx' "name" DATA + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x28B2 ;LOOK-VARS + jr nc,x142F + ld hl,#0000 + bit 6,(iy+#01) + jr z,x1425 + set 7,c +x1425 ld a,(#5C74) + dec a + jr z,x1444 + call x05AC ;ошибка запись или проверка пустого массива + db #01 ;2 Variable not found +x142F jp nz,x1219 ;C Nonsense in BASIC + bit 7,(iy+#01) + jr z,x1451 ;проверка синтаксиса + ld c,(hl) + inc hl + ld a,(hl) + ld (ix+#0B),a + inc hl + ld a,(hl) + ld (ix+#0C),a + inc hl +x1444 ld (ix+#0E),c + ld a,#01 ;числовой массив + bit 6,c + jr z,x144E + inc a ;символьный массив +x144E ld (ix+#00),a +x1451 ex de,hl + rst #20 ;чтение следующего символа строки программы + cp ")" + jr nz,x142F + rst #20 ;чтение следующего символа строки программы + call x18A1 + ex de,hl + jp x1519 +x145F cp #AA ;SCREEN$ ? + jr nz,x1482 ;нет + ld a,(#5C74) ; 'xxx' "name" SCREEN$ + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + call x18A1 + ld (ix+#0B),#00 + ld (ix+#0C),#1B + ld hl,#4000 + ld (ix+#0D),l + ld (ix+#0E),h + jr x14CF +x1482 cp #AF ;CODE ? + jr nz,x14D5 ;нет + ld a,(#5C74) ; 'xxx' "name" CODE + cp #03 ;это MERGE? + jp z,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x2048 ;PR-ST-END + jr nz,x14A0 + ld a,(#5C74) + and a + jp z,x1219 ;C Nonsense in BASIC + rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x14AF +x14A0 rst #28 + dw Rom1.x1C82 ;получение числового значения + rst #18 ;чтение очередного символа строки программы + cp "," + jr z,x14B4 + ld a,(#5C74) + and a + jp z,x1219 ;C Nonsense in BASIC +x14AF rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x14B8 +x14B4 rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x1C82 ;получение числового значения +x14B8 call x18A1 + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0B),c + ld (ix+#0C),b + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0D),c + ld (ix+#0E),b + ld h,b + ld l,c +x14CF ld (ix+#00),#03 + jr x1519 +x14D5 cp #CA ;LINE ? + jr z,x14E2 ;да + call x18A1 ;'xxx "name"' / 'SAVE "name" LINE' + ld (ix+#0E),#80 + jr x14F9 +x14E2 ld a,(#5C74) + and a ;SAVE ? + jp nz,x1219 ;C Nonsense in BASIC + rst #20 ;чтение следующего символа строки программы + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x1E99 ;извлечь операнд + ld (ix+#0D),c + ld (ix+#0E),b +x14F9 ld (ix+#00),#00 + ld hl,(#5C59) + ld de,(#5C53) + scf + sbc hl,de + ld (ix+#0B),l + ld (ix+#0C),h + ld hl,(#5C4B) + sbc hl,de + ld (ix+#0F),l + ld (ix+#10),h + ex de,hl +x1519 ld a,(x5B66) + bit 3,a + jp nz,x121D ;операция с RAM диском + ld a,(#5C74) + and a ;это SAVE ? + jr nz,x152B ;нет + rst #28 + dw Rom1.x0970 ;SAVE + ret +x152B rst #28 + dw Rom1.x0761 ;LOAD/MERGE/VERIFY + ret + +;АДРЕС: #152F печать бейсик программы от текущей строки +x152F ld hl,#EEF5 + res 0,(hl) + set 1,(hl) +x1536 ld hl,(#5C49) ;номер строки + ld a,h + or l + jr nz,x1540 + ld (#EC06),hl +x1540 ld a,(#F9DB) + push af + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + ld (#F9D7),hl + call x3222 ;установка буфера редактирования в верху экрана + call x30D6 ;установка буфера редактирования внизу экрана + pop af +x1554 or a + jr z,x1563 + push af + call x30DF ;сдвиг строк в буфере редактирования вверх + ex de,hl + call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана + pop af + dec a + jr x1554 +x1563 ld c,#00 + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,c + ld a,(#EC15) + ld c,a + push bc + push de +x156F call x30DF ;сдвиг строк в буфере редактирования вверх + ld a,(#EEF5) + bit 1,a + jr z,x1596 + push de + push hl + ld de,#0020 + add hl,de + bit 0,(hl) + jr z,x1594 + inc hl + ld d,(hl) + inc hl + ld e,(hl) + or a + ld hl,(#5C49) + sbc hl,de + jr nz,x1594 + ld hl,#EEF5 + set 0,(hl) +x1594 pop hl + pop de +x1596 push bc + push hl + ld bc,#0023 + ldir + pop hl + pop bc + push de + push bc + ex de,hl + ld hl,#EEF5 + bit 0,(hl) + jr z,x15D3 + ld b,#00 +x15AB ld hl,(#EC06) + ld a,h + or l + jr z,x15C0 + push hl ;!!!ОШИБКА!!! + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop hl + jr nc,x15CB + dec hl + inc b + ld (#EC06),hl + jr x15AB +x15C0 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + call nc,x2E63 ;поиск в строке влево от курсора редактируемого символа + ld hl,#EEF5 + ld (hl),#00 +x15CB ld a,b + pop bc + push bc + ld c,b + ld b,a + call x2A11 ;сохранить позицию курсора +x15D3 pop bc + pop de + ld a,c + inc b + cp b + jr nc,x156F + ld a,(#EEF5) + bit 1,a + jr z,x1602 + bit 0,a + jr nz,x1602 + ld hl,(#5C49) + ld a,h + or l + jr z,x15F4 + ld (#FC9A),hl + call x3222 ;установка буфера редактирования в верху экрана + jr x15FD +x15F4 ld (#FC9A),hl + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + ld (#5C49),hl +x15FD pop de + pop bc + jp x1536 +x1602 pop de + pop bc + cp a +x1605 push af + ld a,c + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + ex de,hl +x160C push af + call x3604 ;печать строки редактируемого буфера + pop af + ld de,#0023 + add hl,de + inc c + cp c + jr nc,x160C + pop af + ret z + call x2A07 ;получение позиции курсора +x161E call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + ld hl,(#EC06) + dec hl + ld a,h + or l + ld (#EC06),hl + jr nz,x161E + jp x2A11 ;сохранить позицию курсора + ret ;!!!не используется!!! + +;АДРЕС: #1630 очистка окна редактирования +x1630 ld b,#00 + ld a,(#EC15) + ld d,a + jp x3B5E ;очистка строк экрана + +;АДРЕС: #1639 сдвиг всех строк в буфере редактирования верх и обновление экрана +x1639 ld b,#00 + push hl + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана + pop hl + ret nc + call x30DF ;сдвиг строк в буфере редактирования вверх +x1648 push bc + push hl + ld hl,#0023 + add hl,de + ld a,(#EC15) + ld c,a + cp b + jr z,x1663 + push bc +x1656 push bc + ld bc,#0023 + ldir + pop bc + ld a,c + inc b + cp b + jr nz,x1656 + pop bc +x1663 pop hl + call x3618 ;сдвиг вверх строк в буфере редактирования при необходимости + ld bc,#0023 + ldir + scf + pop bc + ret + +;АДРЕС: #166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана +x166F ld b,#00 + call x322B ;перемещение курсора вверх в верхнем буфере редактирования + ret nc + +;АДРЕС: #1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана +;вых: cy=0 буфер переполнен +; b - последняя строка +x1675 push bc + push hl +;сдвиг всех строк в буфере вниз + ld a,(#EC15) ;номер строки в буфере редактирования + ld c,a + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x311E ;сдвиг строк в буфере редактирования вниз + jr nc,x16A9 ;буфер переполнен + dec de + ld hl,#0023 + add hl,de + ex de,hl + push bc + ld a,b + cp c + jr z,x169A +x168E push bc + ld bc,#0023 + lddr + pop bc + ld a,b + dec c + cp c + jr c,x168E +;все строки сдвинуты вниз +x169A ex de,hl + inc de + pop bc ;c - номер строки + pop hl ;адрес следуюющей строки + call x362C ;сдвиг вниз строк в буфере редактирования при необходимости + ld bc,#0023 + ldir + scf + pop bc + ret +;буфер переполнен +x16A9 pop hl + pop bc + ret + +;АДРЕС: #16AC вставка символа в строку буфера редактирования +;вх: de - адрес начала строки в буфере +; a - код символа +; b - crd X +;вых: a - код последнего символа строки +; z - сждвигать больше нечего +x16AC push de + ld h,#00 + ld l,b + add hl,de ;адрес символа в буфере + ld d,a + ld a,b +x16B3 ld e,(hl) + ld (hl),d + ld d,e + inc hl + inc a + cp #20 + jr c,x16B3 + ld a,e + cp #00 + pop de + ret + +;АДРЕС: #16C1 вставка символа в строку буфера редактирования со сдвигом влево +x16C1 push de + ld hl,#0020 + add hl,de + push hl + ld d,a + ld a,#1F + jr x16D3 +x16CC ld e,(hl) + ld (hl),d + ld d,e + cp b + jr z,x16D6 + dec a +x16D3 dec hl + jr x16CC +x16D6 ld a,e + cp #00 + pop hl + pop de + ret + +;АДРЕС: #16DC смещения до параметров команды +x16DC db #B1 ; DEF FN -> #178D (ROM 0) + db #C9 ; CAT -> #17A6 (ROM 0) + db #BC ; FORMAT -> #179A (ROM 0) + db #BE ; MOVE -> #179D (ROM 0) + db #C3 ; ERASE -> #17A3 (ROM 0) + db #AF ; OPEN # -> #1790 (ROM 0) + db #B4 ; CLOSE # -> #1796 (ROM 0) + db #93 ; MERGE -> #1776 (ROM 0) + db #91 ; VERIFY -> #1775 (ROM 0) + db #92 ; BEEP -> #1777 (ROM 0) + db #95 ; CIRCLE -> #177B (ROM 0) + db #98 ; INK -> #177F (ROM 0) + db #98 ; PAPER -> #1780 (ROM 0) + db #98 ; FLASH -> #1781 (ROM 0) + db #98 ; BRIGHT -> #1782 (ROM 0) + db #98 ; INVERSE -> #1783 (ROM 0) + db #98 ; OVER -> #1784 (ROM 0) + db #98 ; OUT -> #1785 (ROM 0) + db #7F ; LPRINT -> #176D (ROM 0) + db #81 ; LLIST -> #1770 (ROM 0) + db #2E ; STOP -> #171E (ROM 0) + db #6C ; READ -> #175D (ROM 0) + db #6E ; DATA -> #1760 (ROM 0) + db #70 ; RESTORE -> #1763 (ROM 0) + db #48 ; NEW -> #173C (ROM 0) + db #94 ; BORDER -> #1789 (ROM 0) + db #56 ; CONTINUE -> #174C (ROM 0) + db #3F ; DIM -> #1736 (ROM 0) + db #41 ; REM -> #1739 (ROM 0) + db #2B ; FOR -> #1724 (ROM 0) + db #17 ; GO TO -> #1711 (ROM 0) + db #1F ; GO SUB -> #171A (ROM 0) + db #37 ; INPUT -> #1733 (ROM 0) + db #77 ; LOAD -> #1774 (ROM 0) + db #44 ; LIST -> #1742 (ROM 0) + db #0F ; LET -> #170E (ROM 0) + db #59 ; PAUSE -> #1759 (ROM 0) + db #2B ; NEXT -> #172C (ROM 0) + db #43 ; POKE -> #1745 (ROM 0) + db #2D ; PRINT -> #1730 (ROM 0) + db #51 ; PLOT -> #1755 (ROM 0) + db #3A ; RUN -> #173F (ROM 0) + db #6D ; SAVE -> #1773 (ROM 0) + db #42 ; RANDOMIZE -> #1749 (ROM 0) + db #0D ; IF -> #1715 (ROM 0) + db #49 ; CLS -> #1752 (ROM 0) + db #5C ; DRAW -> #1766 (ROM 0) + db #44 ; CLEAR -> #174F (ROM 0) + db #15 ; RETURN -> #1721 (ROM 0) + db #5D ; COPY -> #176A (ROM 0) + +;АДРЕС: #170E синтаксические параметры команд (аналогично basic 48 #1A7A) +; CLASS-00 - больше нет операндов +; CLASS-01 - используется в LET. требуется переменная +; CLASS-02 - используется в LET. за ним выражение числовое или строковое +; CLASS-03 - за этим следует числовое выражение (=0 при отсутствии) +; CLASS-04 - за этим следует односимвольная переменная +; CLASS-05 - +; CLASS-06 - за этим следует числовое выражение +; CLASS-07 - работа с атрибутами +; CLASS-08 - два числа через запятую +; CLASS-09 - два числа через запятую (могут быть упраляющие цветом коды) +; CLASS-0A - строка +; CLASS-0B - для работы с кассетой/RAM-диском +; CLASS-0C - то же что и CLASS-00, но вызывается из ROM 0 +; CLASS-0D - то же что и CLASS-06, но вызывается из ROM 0 +; CLASS-0E - обрабатывается в ROM 0 +x170E db #01 ; CLASS-01 LET + db "=" ; = + db #02 ; CLASS-02 +x1711 db #06 ; CLASS-06 GO TO + db #00 ; CLASS-00 + dw Rom1.x1E67 ; GO TO routine in ROM 1 +x1715 db #06 ; CLASS-06 IF + db #CB ; 'THEN' + db #0E ; CLASS-0E + dw x1967 ; IF routine in ROM 0 +x171A db #06 ; CLASS-06 GO SUB + db #0C ; CLASS-0C + dw x1A53 ; GO SUB routine in ROM 0 +x171E db #00 ; CLASS-00 STOP + dw Rom1.x1CEE ; STOP routine in ROM 1 +x1721 db #0C ; CLASS-0C RETURN + dw x1A6F ; RETURN routine in ROM 0 +x1724 db #04 ; CLASS-04 FOR + db "=" ; '=' + db #06 ; CLASS-06 + db #CC ; 'TO' + db #06 ; CLASS-06 + db #0E ; CLASS-0E + dw x1981 ; FOR routine in ROM 0 +x172C db #04 ; CLASS-04 NEXT + db #00 ; CLASS-00 + dw Rom1.x1DAB ; NEXT routine in ROM 1 +x1730 db #0E ; CLASS-0E PRINT + dw x2178 ; PRINT routine in ROM 0 +x1733: db #0E ; CLASS-0E INPUT + dw x218C ; INPUT routine in ROM 0 +x1736 db #0E ; CLASS-0E DIM + dw x21D5 ; DIM routine in ROM 0 +x1739 db #0E ; CLASS-0E REM + dw x1862 ; REM routine in ROM 0 +x173C db #0C ; CLASS-0C NEW + dw x21AA ; NEW routine in ROM 0 +x173F db #0D ; CLASS-0D RUN + dw x1A02 ; RUN routine in ROM 0 +x1742 db #0E ; CLASS-0E LIST + dw x1B75 ; LIST routine in ROM 0 +x1745 db #08 ; CLASS-08 POKE + db #00 ; CLASS-00 + dw Rom1.x1E80 ; POKE routine in ROM 1 +x1749 db #03 ; CLASS-03 RANDOMIZE + dw Rom1.x1E4F ; RANDOMIZE routine in ROM 1 +x174C db #00 ; CLASS-00 CONTINUE + dw Rom1.x1E5F ; CONTINUE routine in ROM 1 +x174F db #0D ; CLASS-0D CLEAR + dw Rom1.x1A0D ; CLEAR routine in ROM 0 +x1752 db #00 ; CLASS-00 CLS + dw Rom1.x0D6B ; CLS routine in ROM 1 +x1755 db #09 ; CLASS-09 PLOT + db #00 ; CLASS-00 + dw Rom1.x22DC ; PLOT routine in ROM 1 +x1759 db #06 ; CLASS-06 PAUSE + db #00 ; CLASS-00 + dw Rom1.x1F3A ; PAUSE routine in ROM 1 +x175D db #0E ; CLASS-0E READ + dw x19AB ; READ routine in ROM 0 +x1760 db #0E ; CLASS-0E DATA + dw x19EB ; DATA routine in ROM 0 +x1763 db #03 ; CLASS-03 RESTORE + dw Rom1.x1E42 ; RESTORE routine in ROM 1 +x1766 db #09 ; CLASS-09 DRAW + db #0E ; CLASS-0E + dw x21BE ; DRAW routine in ROM 0 +x176A db #0C ; CLASS-0C COPY + dw x21A7 ; New COPY routine in ROM 0. +x176D db #0E ; CLASS-0E LPRINT + dw x2174 ; LPRINT routine in ROM 0 +x1770 db #0E ; CLASS-0E LLIST + dw x1B71 ; LLIST routine in ROM 0 +x1773 db #0B ; CLASS-0B SAVE +x1774 db #0B ; CLASS-0B LOAD +x1775 db #0B ; CLASS-0B VERIFY +x1776 db #0B ; CLASS-0B MERGE +x1777 db #08 ; CLASS-08 BEEP + db #00 ; CLASS-00 + dw Rom1.x03F8 ; BEEP routine in ROM 1 +x177B db #09 ; CLASS-09 CIRCLE + db #0E ; CLASS-0E + dw x21AE ; CIRCLE routine in ROM 0 +x177F db #07 ; CLASS-07 INK +x1780 db #07 ; CLASS-07 PAPER +x1781 db #07 ; CLASS-07 FLASH +x1782 db #07 ; CLASS-07 BRIGHT +x1783 db #07 ; CLASS-07 INVERSE +x1784 db #07 ; CLASS-07 OVER +x1785 db #08 ; CLASS-08 OUT + db #00 ; CLASS-00 + dw Rom1.x1E7A ; OUT routine in ROM 1 +x1789 db #06 ; CLASS-06 BORDER + db #00 ; CLASS-00 + dw Rom1.x2294 ; BORDER routine in ROM 1 +x178D db #0E ; CLASS-0E DEF FN + dw x1A8C ; DEF FN routine in ROM 0 +x1790 db #06 ; CLASS-06 OPEN # + db "," ; ',' + db #0A ; CLASS-0A + db #00 ; CLASS-00 + dw Rom1.x1736 ; OPEN # routine in ROM 1 +x1796 db #06 ; CLASS-06 CLOSE # + db #00 ; CLASS-00 + dw Rom1.x16E5 ; CLOSE # routine in ROM 1 +x179A db #0E ; CLASS-0E FORMAT + dw x0641 ; FORMAT routine in ROM 0 +x179D db #0A ; CLASS-0A MOVE + db "," ; ',' + db #0A ; CLASS-0A + db #0C ; CLASS-0C + dw x1AF0 ; Just execute a RET +x17A3 db #0E ; CLASS-0E ERASE + dw x1C0C ; ERASE routine in ROM 0 +x17A6 db #0E ; CLASS-0E CAT + dw x1BE5 ; CAT routine in ROM 0 +x17A9 db #0C ; CLASS-0C SPECTRUM + dw x1B2B ; SPECTRUM routine in ROM 0 +x17AC: db #0E ; CLASS-0E PLAY + dw x2317 ; PLAY routine in ROM 0 + +;АДРЕС: #17AF анализ и выполнение бейсик программы +x17AF res 7,(iy+#01) + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x19FB ;получить номер редактиремой строки + xor a + ld (#5C47),a + dec a + ld (#5C3A),a + jr x17C1 +x17C0 rst #20 ;получить следующий символ +x17C1 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16BF ;очистка рабочего буфера + inc (iy+#0D) ;номер оператора в строке + jp m,x1912 ;слишком много операторов. ошибка + rst #18 ;получение кода символа + ld b,#00 + cp #0D + jp z,x1863 ;это enter - конец строки + cp ":" + jr z,x17C0 ;следующая команда + ld hl,x1821 ;сюда вернемся + push hl + ld c,a + rst #20 ;получить следующий символ + ld a,c + sub #CE + jr nc,x17F4 ;это DEF FN и дальше + add a,#CE + ld hl,x17A9 + cp #A3 + jr z,x1800 ;это SPECTRUM + ld hl,x17AC + cp #A4 + jr z,x1800 ;это PLAY + jp x1912 ;ошибка +x17F4 ld c,a + ld hl,x16DC + add hl,bc + ld c,(hl) + add hl,bc + jr x1800 +x17FD ld hl,(#5C74) +;вызов п/п обработки команды +x1800 ld a,(hl) + inc hl + ld (#5C74),hl + ld bc,x17FD ;сюда вернемся + push bc + ld c,a + cp #20 + jr nc,x181A ;это разделитель + ld hl,x18B5 + ld b,#00 + add hl,bc + ld c,(hl) + add hl,bc + push hl ;п/п обработки класса + rst #18 ;читаем код команды + dec b + ret +x181A rst #18 ;читаем код команды + cp c + jp nz,x1912 + rst #20 ;читаем код следующей команды + ret +x1821 call x05D6 ;проверка нажатия break и печать сообщения + jr c,x182A + call x05AC ;обработка ошибки без возврата + db #14 ;L Break into program +x182A bit 7,(iy+#0A) + jp nz,x18A8 + ld hl,(#5C42) ;номер строки бейсик программы + bit 7,h + jr z,x184C ;это строка программы +x1838 ld hl,#FFFE ;выполнение команды из строки редактирования + ld (#5C45),hl + ld hl,(#5C61) + dec hl + ld de,(#5C59) + dec de + ld a,(#5C44) + jr x1882 ;следующая строка программы + +;новая строка программы +x184C rst #28 ;вызов процедуры из basic 48k + dw Rom1.x196E ;получить начальный адрес строки программы + ld a,(#5C44) + jr z,x1870 ;поиск следующей строки + and a + jr nz,x189D ;N Statement lost + ld b,a + ld a,(hl) + and #C0 + ld a,b + jr z,x1870 ;еще не конец программы + call x05AC ;обработка ошибки без возврата + db #FF ;0 OK +;обработка команды: REM +x1862 pop bc +;обработка конца строки программы +x1863 bit 7,(iy+#01) + ret z ;это проверка синтаксиса + ld hl,(#5C55) ;адрес следующей строки программы + ld a,#C0 + and (hl) + ret nz ;следующая строка программы в RAM + xor a +;поиск следующей строки +x1870 cp #01 + adc a,#00 + ld d,(hl) + inc hl + ld e,(hl) ;номер строки программы + ld (#5C45),de + inc hl + ld e,(hl) + inc hl + ld d,(hl) ;длина строки программы + ex de,hl + add hl,de + inc hl +;следующая строка программы +x1882 ld (#5C55),hl ;адрес следующей строки + ex de,hl + ld (#5C5D),hl + ld d,a + ld e,#00 + ld (iy+#0A),#FF ;номер следующего оператора в строке + dec d + ld (iy+#0D),d ;номер выполняемого оператора + jp z,x17C0 ;первая команда в строке + inc d + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x198B ;поиск команды в строке + jr z,x18A8 ;команда найдена +x189D call x05AC + db #16 ;N Statement lost +;следующая строка программы +x18A1 bit 7,(iy+#01) + ret nz ;выполнение программы + pop bc + pop bc +;следующая команда в строке программы +x18A8 rst #18 ;читаем символ из строки + cp #0D + jr z,x1863 ;конец строки + cp ":" + jp z,x17C0 ;следующая команда + jp x1912 ;ошибка: noncens in basic + +;АДРЕС: #18B5 таблица смещений до процедур обработки класса оператора +x18B5 db x18D9-$ ;CLASS-00 -> x18D9 = #24 + db x18F9-$ ;CLASS-01 -> x18F9 = #43 + db x18FD-$ ;CLASS-02 -> x18FD = #46 + db x18D6-$ ;CLASS-03 -> x18D6 = #1E + db x1905-$ ;CLASS-04 -> x1905 = #4C + db x18DA-$ ;CLASS-05 -> x18DA = #20 + db x190E-$ ;CLASS-06 -> x190E = #53 + db x191A-$ ;CLASS-07 -> x191A = #5E + db x190A-$ ;CLASS-08 -> x190A = #4D + db x1944-$ ;CLASS-09 -> x1944 = #86 + db x1916-$ ;CLASS-0A -> x1916 = #57 + db x1948-$ ;CLASS-0B -> x1948 = #88 + db x18C7-$ ;CLASS-0C -> x18C7 = #06 + db x18C4-$ ;CLASS-0D -> x18C4 = #02 + db x18C8-$ ;CLASS-0E -> x18C8 = #05 + +;АДРЕС: #18C4 классы #0C,#0D,#0E +x18C4 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CDE ;получение параметра-числа +x18C7 cp a +x18C8 pop bc + call z,x18A1 ;если проверка синтаксиса, переход к следующей команде + ex de,hl + ld hl,(#5C74) + ld c,(hl) + inc hl + ld b,(hl) + ex de,hl + push bc + ret + +;АДРЕС: #18D6 классы #00,#03,#05 +x18D6 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CDE ;получение параметра-числа +x18D9 cp a +x18DA pop bc + call z,x18A1 ;если проверка синтаксиса, переход к следующей команде + ex de,hl + ld hl,(#5C74) + ld c,(hl) + inc hl + ld b,(hl) + ex de,hl + push hl + ld hl,x18F8 ;сюда вернемся + ld (x5B5A),hl + ld hl,x5B14 + ex (sp),hl + push hl + ld h,b + ld l,c + ex (sp),hl + jp x5B00 +x18F8 ret + +;АДРЕС: #18F9 класс #01 +x18F9 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C1F ;идентификация переменной + ret + +;АДРЕС: #18FD класс #02 +x18FD pop bc + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C56 ;получить значение параметра + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ret + +;АДРЕС: #1905 класс #04 FOR/NEXT +x1905 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C6C ;FOR i + ret + +;АДРЕС: #1909 класс #08 +x1909 rst #20 +x190A rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C7A ;получение двух значений + ret + +;АДРЕС: #190E класс #06 +x190E rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C82 ;получение числового значения + ret + +;АДРЕС: #1912 ошибка C Nonsense in BASIC +x1912 call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #1916 класс #0A +x1916 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1C8C ;параметр - строка + ret + +;АДРЕС: #191A класс #07 +x191A bit 7,(iy+#01) + res 0,(iy+#02) + jr z,x1927 ;проверка синтаксиса + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0D4D ;копирование атрибутов +x1927 pop af + ld a,(#5C74) + sub #28+(low x177F) ;#A7 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x21FC ;изменение временных атрибутов + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ld hl,(#5C8F) ;ATTR_T + ld (#5C8D),hl ;ATTR_P + ld hl,#5C91 ;P_FLAG + ld a,(hl) + rlca + xor (hl) + and #AA + xor (hl) + ld (hl),a + ret + +;АДРЕС: #1944 класс #09 +x1944 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1CBE ;установка необязательных атрибутов для печати + ret + +;АДРЕС: #1948 класс #0B +x1948 pop af + ld a,(x5B66) + and #0F + ld (x5B66),a + ld a,(#5C74) + sub 1+(low x1773) ;#74 + ld (#5C74),a + jp z,x11EB ;SAVE + dec a + jp z,x11F2 ;LOAD + dec a + jp z,x11F9 ;VERIFY + jp x1200 ;MERGE + +;АДРЕС: #1967 команда IF +x1967 pop bc + bit 7,(iy+#01) + jr z,x197E ;проверка синтаксиса + ld hl,(#5C65) + ld de,-5 + add hl,de + ld (#5C65),hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x34E9 ;проверка значения на ноль + jp c,x1863 ;если не ноль переход на следующую строку +x197E jp x17C1 ;перехд на следующую команду (THEN) + +;АДРЕС: #1981 команда FOR +x1981 cp #CD + jr nz,x198E ;ищем оператор STEP + rst #20 + call x190E ;получение числового значения + call x18A1 ;если проверка синтаксиса, переход к следующей команде + jr x19A6 +x198E call x18A1 ;если проверка синтаксиса, переход к следующей команде + ld hl,(#5C65) + ld (hl),#00 ;поместим значение на стэк калькулятора + inc hl + ld (hl),#00 + inc hl + ld (hl),#01 + inc hl + ld (hl),#00 + inc hl + ld (hl),#00 + inc hl + ld (#5C65),hl +x19A6 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1D16 + ret + +;АДРЕС: #19AA команда READ +x19AA rst #20 +x19AB call x18F9 ;идентификация переменной + bit 7,(iy+#01) + jr z,x19E2 ;проверка синтаксиса + rst #18 + ld (#5C5F),hl + ld hl,(#5C57) + ld a,(hl) + cp "," + jr z,x19CB + ld e,#E4 ;поиск оператора DATA + rst #28 + dw Rom1.x1D86 ;поиск оператора + jr nc,x19CB ;оператор найден + call x05AC + db #0D ;E Out of Data +x19CB inc hl + ld (#5C5D),hl + ld a,(hl) + rst #28 + dw Rom1.x1C56 ;извлечь значение + rst #18 + ld (#5C57),hl + ld hl,(#5C5F) + ld (iy+#26),#00 + ld (#5C5D),hl + ld a,(hl) +x19E2 rst #18 + cp "," + jr z,x19AA + call x18A1 ;если проверка синтаксиса, переход к следующей команде + ret + +;АДРЕС: #19EB команда DATA +x19EB bit 7,(iy+#01) + jr nz,x19FC ;исполнение программы +x19F1 rst #28 + dw Rom1.x24FB ;ищем следующее выражение + cp "," + call nz,x18A1 ;если проверка синтаксиса, переход к следующей команде + rst #20 + jr x19F1 +x19FC ld a,#E4 +x19FE rst #28 + dw Rom1.x1E39 ;проверить инструкцию DATA или DEF FN + ret + +;АДРЕС: #1A02 команда RUN +x1A02 rst #28 + dw Rom1.x1E67 ;команда GO TO + ld bc,#0000 + rst #28 + dw Rom1.x1E45 + jr x1A10 + +;АДРЕС: #1A0D команда CLEAR +x1A0D rst #28 + dw Rom1.x1E99 ;извлечь операнд +x1A10 ld a,b + or c + jr nz,x1A18 + ld bc,(#5CB2) +x1A18 push bc + ld de,(#5C4B) + ld hl,(#5C59) + dec hl + rst #28 + dw Rom1.x19E5 ;удалить переменные + rst #28 + dw Rom1.x0D6B ;CLS + ld hl,(#5C65) + ld de,#0032 + add hl,de + pop de + sbc hl,de + jr nc,x1A3B + ld hl,(#5CB4) + and a + sbc hl,de + jr nc,x1A3F +x1A3B call x05AC + db #15 ;M Ramtop no good +x1A3F ld (#5CB2),de + pop de + pop hl + pop bc + ld sp,(#5CB2) + inc sp + push bc + push hl + ld (#5C3D),sp + push de + ret + +;АДРЕС: #1A53 команда GO SUB +x1A53 pop de + ld h,(iy+#0D) + inc h + ex (sp),hl + inc sp + ld bc,(#5C45) + push bc + push hl + ld (#5C3D),sp + push de + rst #28 + dw Rom1.x1E67 ;команда GO TO + ld bc,#0014 + rst #28 + dw Rom1.x1F05 ;проверка наличия свободной памяти + ret + +;АДРЕС: #1A6F команда RETURN +x1A6F pop bc + pop hl + pop de + ld a,d + cp #3E + jr z,x1A86 + dec sp + ex (sp),hl + ex de,hl + ld (#5C3D),sp + push bc + ld (#5C42),hl + ld (iy+#0A),d + ret +x1A86 push de + push hl + call x05AC + db #06 ;7 RETURN without GO SUB + +;АДРЕС: #1A8C команда DEF FN +x1A8C bit 7,(iy+#01) + jr z,x1A97 ;проверка синтаксиса + ld a,#CE + jp x19FE +x1A97 set 6,(iy+#01) + rst #28 + dw Rom1.x2C8D ;это буква? + jr nc,x1AB6 ;нет + rst #20 + cp "$" + jr nz,x1AAA + res 6,(iy+#01) + rst #20 +x1AAA cp "(" + jr nz,x1AEA + rst #20 + cp ")" + jr z,x1AD3 +x1AB3 rst #28 + dw Rom1.x2C8D ;это буква? +x1AB6 jp nc,x1912 ;ошибка + ex de,hl + rst #20 + cp "$" + jr nz,x1AC1 + ex de,hl + rst #20 +x1AC1 ex de,hl + ld bc,#0006 + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + inc hl + inc hl + ld (hl),#0E + cp "," + jr nz,x1AD3 + rst #20 + jr x1AB3 +x1AD3 cp ")" + jr nz,x1AEA + rst #20 + cp "=" + jr nz,x1AEA + rst #20 + ld a,(#5C3B) + push af + rst #28 + dw Rom1.x24FB ;ищем следующее выражение + pop af + xor (iy+#01) + and #40 +x1AEA jp nz,x1912 ;ошибка + call x18A1 + +;АДРЕС: #1AF0 команда MOVE +x1AF0 ret + +;АДРЕС: #1AF1 пункт меню Tape Loader +x1AF1 ld hl,#EC0E + ld (hl),#FF + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) + ld bc,#0003 + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + ld hl,x1B6E + ld de,(#5C59) + ld bc,#0003 +x1B0F ldir + +;АДРЕС: #1B11 анализ и выполненение введенной строки +x1B11 call x026B ;анализ и выполненение введенной строки + +;АДРЕС: #1B14 пункт меню редактора Print (печать на принтер) +x1B14 call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) ;адрес начала редактируемой строки + ld bc,#0001 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1655 ;резервирование места (длина в bc) + ld hl,(#5C59) ;адрес начала редактируемой строки + ld (hl),#E1 ;команда LLIST + call x026B ;исполнение команды (без возврата) + +;АДРЕС: #1B2B команда SPECTRUM +x1B2B call x1B53 ;установка канала 'P' + ld sp,(#5C3D) + pop hl + ld hl,Rom1.x1303 ;основной цикл basic 48 + push hl + ld hl,Rom1.x0013 ;адрес с байтом #FF в rom 1 + push hl + ld hl,x0008 ;обработчик ошибок + push hl ;!!!ОШИБКА!!! + ld a,#20 ;basic48, блокировка #7FFD, ram 0 + ld (x5B5C),a + jp x5B00 + +;АДРЕС: #1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 +x1B47 ld hl,#0000 + +;АДРЕС: #1B4A включение basic48, блокировка #7FFD и переход на адрес в hl +x1B4A push hl + ld a,#20 + ld (x5B5C),a + jp x5B00 + +;АДРЕС: #1B53 установка канала 'P' +x1B53 ld hl,(#5C4F) ;адрес начала области информации о каналах + ld de,#0005 + add hl,de ;канал S + ld de,#000A + ex de,hl + add hl,de + ex de,hl ;канал P + ld bc,#0004 + ldir + res 3,(iy+#30) ;курсор L + res 4,(iy+#01) ;режим zx-48 + ret + +;АДРЕС: #1B6E данные для команды LOAD "" +x1B6E db #EF,#22,#22 ;load "" + +;АДРЕС: #1B71 команда LLIST +x1B71 ld a,#03 + jr x1B77 + +;АДРЕС: #1B75 команда LIST +x1B75 ld a,#02 +x1B77 ld (iy+#02),#00 + rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x1B83 ;проверка + rst #28 + dw Rom1.x1601 ;открыть канал +x1B83 rst #28 ;!!!можно rst #18 + dw Rom1.x0018 ;чтение очередного символа строки программы +x1B86 rst #28 + dw Rom1.x2070 ;нужно ли изменять поток? + jr c,x1BA3 ;не нужно + rst #28 ;!!!можно rst #18 + dw Rom1.x0018 ;чтение очередного символа строки программы +x1B8E cp ";" + jr z,x1B96 + cp "," + jr nz,x1B9E +x1B96 rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы +x1B99 call x190E ;получение числового значения + jr x1BA6 +x1B9E rst #28 + dw Rom1.x1CE6 ;ноль на стэк калькулятора + jr x1BA6 +x1BA3 rst #28 + dw Rom1.x1CDE ;получение параметра-числа +x1BA6 call x18A1 + rst #28 + dw Rom1.x1825 ;LIST-5+3 + ret + +;АДРЕС: #1BAD команда RAM disk SAVE! +x1BAD ld (x5B81),sp + ld sp,x5BFF + call x1C97 ;создание новой записи в каталоге RAM-диска + ld bc,(x5B72) + ld hl,-9 + or #FF + sbc hl,bc + call x1CF3 ;коррекция сводного места на RAM диске + ld bc,#0009 + ld hl,x5B71 + call x1DAC ;сохранение данных на RAM диске + ld hl,(x5B74) + ld bc,(x5B72) + call x1DAC ;сохранение данных на RAM диске + call x1D56 ;обновление записи каталога + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1BE5 команда RAM disk CAT! +x1BE5 rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp "!" + jp nz,x1912 ;ошибка + rst #28 + dw Rom1.x0020 ;чтение следующего символа строки программы + call x18A1 + ld a,#02 ;канал #02 + rst #28 + dw Rom1.x1601 ;открыть канал + ld (x5B81),sp + ld sp,x5BFF + call x20D2 ;печать каталога RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C0C команда RAM disk EARSE! +x1C0C rst #28 + dw Rom1.x0018 ;чтение очередного символа строки программы + cp "!" + jp nz,x1912 ;ошибка + call x1393 ;проверка и копирование имени файла + call x18A1 + ld (x5B81),sp + ld sp,x5BFF + call x1F5F ;удаление файла из RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C2E загрузка заголовка файла из RAM диска +x1C2E ld (x5B81),sp + ld sp,x5BFF + call x1D35 ;поиск файла на RAM диске + ld hl,x5B71 + ld bc,#0009 + call x1E37 ;загрузка данных с RAM диска + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C4B загрузка из RAM диска +x1C4B ld (x5B81),sp + ld sp,x5BFF + ld b,d + ld c,e + call x1E37 ;загрузка данных с RAM диска + call x1D56 ;обновление записи каталога + ld a,#05 ;ram 0 + call x1C64 + ld sp,(x5B81) + ret + +;АДРЕС: #1C64 включение логической страницы в A +x1C64 push hl + push bc + ld hl,x1C81 + ld b,#00 + ld c,a + add hl,bc + ld c,(hl) + di + ld a,(x5B5C) + and #F8 + or c + ld (x5B5C),a + ld bc,#7FFD + out (c),a + ei + pop bc + pop hl + ret +x1C81 db #01,#03,#04,#06,#07,#00 + +;АДРЕС: #1C87 сравнение имени файла с заданным +;вых: z - имена совпадают +x1C87 ld de,x5B67 +x1C8A push ix + pop hl + ld b,#0A +x1C8F ld a,(de) + inc de + cp (hl) + inc hl + ret nz + djnz x1C8F + ret + +;АДРЕС: #1C97 создание новой записи в каталоге RAM-диска +x1C97 call x1D12 ;поиск имени файла в каталоге + jr z,x1CA0 ;имя не найдено + call x05AC + db #20 ;e File already exists +x1CA0 push ix + ld bc,#3FEC ;максимальный размер каталога + add ix,bc + pop ix + jr nc,x1D0E ;нехватает памяти + ld hl,-20 + ld a,#FF + call x1CF3 ;коррекция сводного места на RAM диске + ld hl,x5B66 + set 2,(hl) + push ix ;копируем имя файла + pop de + ld hl,x5B67 + ld bc,#000A + ldir + set 0,(ix+#13) ;запись обновлена + ld a,(ix+#0A) ;адрес начала файла = адрес конца файла + ld (ix+#10),a + ld a,(ix+#0B) + ld (ix+#11),a + ld a,(ix+#0C) + ld (ix+#12),a + xor a + ld (ix+#0D),a ;длина файла =#000000 + ld (ix+#0E),a + ld (ix+#0F),a + ld a,#05 + call x1C64 ;ram 0 + push ix + pop hl + ld bc,-20 + add hl,bc + ld (x5B83),hl + ret + +;АДРЕС: #1CF3 коррекция сводного места на RAM диске +x1CF3 ld de,(x5B85) + ex af,af' + ld a,(x5B85+2) + ld c,a + ex af,af' + bit 7,a + jr nz,x1D0A + add hl,de + adc a,c +x1D03 ld (x5B85),hl + ld (x5B85+2),a + ret +x1D0A add hl,de + adc a,c + jr c,x1D03 +x1D0E call x05AC + db #03 ;4 Out of memory + +;АДРЕС: #1D12 поиск имени файла в каталоге +;вых: z - файл не найден +; nz - файл наден -> ix - адрес дескриптора +x1D12 ld a,#04 ;ram 7 + call x1C64 + ld ix,#EBEC ;адрес первой записи в каталоге +x1D1B ld de,(x5B83) + or a + push ix + pop hl + sbc hl,de + ret z + call x1C87 ;сравнение имени файла с заданным + jr nz,x1D2E ;имя не совпало + or #FF + ret +x1D2E ld bc,-20 + add ix,bc + jr x1D1B + +;АДРЕС: #1D35 поиск файла на RAM диске +x1D35 call x1D12 ;поиск имени файла в каталоге + jr nz,x1D3E ;найден + call x05AC + db #23 ;h File does not exist +x1D3E ld a,(ix+#0A) + ld (ix+#10),a + ld a,(ix+#0B) + ld (ix+#11),a + ld a,(ix+#0C) + ld (ix+#12),a + ld a,#05 ;ram 0 + call x1C64 + ret + +;АДРЕС: #1D56 обновление записи каталога +x1D56 ld a,#04 ;ram 7 + call x1C64 + bit 0,(ix+#13) + ret z ;обновлять не надо + res 0,(ix+#13) + ld hl,x5B66 + res 2,(hl) + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + ld e,(ix+#0A) + ld d,(ix+#0B) + ld b,(ix+#0C) + or a + sbc hl,de + sbc a,b + rl h + rl h + sra a + rr h + sra a + rr h + ld (ix+#0D),l + ld (ix+#0E),h + ld (ix+#0F),a + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + ld bc,-20 + add ix,bc + ld (ix+#0A),l + ld (ix+#0B),h + ld (ix+#0C),a + ret + +;АДРЕС: #1DAC сохранение данных на RAM диске +;вх: hl - откуда +; bc - сколько +x1DAC ld a,b + or c + ret z + push hl + ld de,#C000 + ex de,hl + sbc hl,de + jr z,x1DD5 + jr c,x1DD5 + push hl + sbc hl,bc + jr nc,x1DCC + ld h,b + ld l,c + pop bc + or a + sbc hl,bc + ex (sp),hl + ld de,#C000 + push de + jr x1DF4 +x1DCC pop hl + pop hl + ld de,#0000 + push de + push de + jr x1DF4 +x1DD5 ld h,b + ld l,c + ld de,#0020 + or a + sbc hl,de + jr c,x1DE4 + ex (sp),hl + ld b,d + ld c,e + jr x1DE9 +x1DE4 pop hl + ld de,#0000 + push de +x1DE9 push bc + ld de,x5B98 + ldir + pop bc + push hl + ld hl,x5B98 +x1DF4 ld a,#04 + call x1C64 ;ram 7 + ld e,(ix+#10) + ld d,(ix+#11) + ld a,(ix+#12) + call x1C64 +x1E05 ldi + ld a,d + or e + jr z,x1E24 +x1E0B ld a,b + or c + jp nz,x1E05 + ld a,#04 ;ram 7 + call x1C64 + ld (ix+#10),e + ld (ix+#11),d + ld a,#05 ;ram 0 + call x1C64 + pop hl + pop bc + jr x1DAC +x1E24 ld a,#04 ;ram 7 + call x1C64 + inc (ix+#12) + ld a,(ix+#12) + ld de,#C000 + call x1C64 + jr x1E0B + +;АДРЕС: #1E37 загрузка данных с RAM диска +;вх: hl - куда +; bc - сколько +x1E37 ld a,b + or c + ret z + push hl + ld de,#C000 + ex de,hl + sbc hl,de + jr z,x1E67 + jr c,x1E67 + push hl + sbc hl,bc + jr nc,x1E5C + ld h,b + ld l,c + pop bc + or a + sbc hl,bc + ex (sp),hl + ld de,#0000 + push de + ld de,#C000 + push de + ex de,hl + jr x1E80 +x1E5C pop hl + pop hl + ld de,#0000 + push de + push de + push de + ex de,hl + jr x1E80 +x1E67 ld h,b + ld l,c + ld de,#0020 + or a + sbc hl,de + jr c,x1E76 + ex (sp),hl + ld b,d + ld c,e + jr x1E7B +x1E76 pop hl + ld de,#0000 + push de +x1E7B push bc + push hl + ld de,x5B98 +x1E80 ld a,#04 ;ram 7 + call x1C64 + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + call x1C64 +x1E91 ldi + ld a,h + or l + jr z,x1EBC +x1E97 ld a,b + or c + jp nz,x1E91 + ld a,#04 ;ram 0 + call x1C64 + ld (ix+#10),l + ld (ix+#11),h + ld a,#05 ;ram 7 + call x1C64 + pop de + pop bc + ld hl,x5B98 + ld a,b + or c + jr z,x1EB7 + ldir +x1EB7 ex de,hl + pop bc + jp x1E37 +x1EBC ld a,#04 ;ram 0 + call x1C64 + inc (ix+#12) + ld a,(ix+#12) + ld hl,#C000 + call x1C64 + jr x1E97 + +;АДРЕС: #1ECF !!!NOT USED!!! запись данных в RAM 7 +;вх: hl - откуда +; de - куда +; bc - сколько +x1ECF push af + ld a,(x5B5C) + push af + push hl + push de + push bc + ld ix,x5B67+3 ;x5B6A + ld (ix+#10),e + ld (ix+#11),d + ld (ix+#12),#04 + call x1DAC ;сохранение данных на RAM диске +x1EE8 ld a,#05 ;ram 0 + call x1C64 + pop bc + pop de + pop hl + add hl,bc + ex de,hl + add hl,bc + ex de,hl + pop af + ld bc,#7FFD + di + out (c),a + ld (x5B5C),a + ei + ld bc,#0000 + pop af + ret + +;АДРЕС: #1F04 !!!NOT USED!!! чтение данных из RAM 7 +x1F04 push af + ld a,(x5B5C) + push af + push hl + push de + push bc + ld ix,x5B67+3 ;x5B6A + ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),#04 + ex de,hl + call x1E37 ;загрузка данных с RAM диска + jr x1EE8 + +;АДРЕС: #1F20 установка другого стэка и ram 0 +x1F20 ex af,af' + ld a,#00 + di + call x1F3A ;включение страницы ram 0 + pop af + ld (x5B58),hl + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ei + ld hl,(x5B58) + push af + ex af,af' + ret + +;АДРЕС: #1F3A включение физической страницы ram +;вх: a - номер страницы +x1F3A push bc + ld bc,#7FFD + out (c),a + ld (x5B5C),a + pop bc + ret + +;АДРЕС: #1F45 установка другого стэка и ram 7 +;вх: (x5B81) - адрес другого стэка +x1F45 ex af,af' + di + pop af + ld (x5B58),hl + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld hl,(x5B58) + push af + ld a,#07 + call x1F3A ;включение страницы ram + ei + ex af,af' + ret + +;АДРЕС: #1F5F удаление файла из RAM диска +x1F5F call x1D12 ;поиск имени файла в каталоге + jr nz,x1F68 ;файл найден + call x05AC + db #23 ;h File does not exist +x1F68 ld l,(ix+#0D) + ld h,(ix+#0E) + ld a,(ix+#0F) + call x1CF3 ;коррекция свободного места на RAM диске + push iy + ld iy,(x5B83) + ld bc,-20 + add ix,bc + ld l,(iy+#0A) + ld h,(iy+#0B) + ld a,(iy+#0C) + pop iy + ld e,(ix+#0A) + ld d,(ix+#0B) + ld b,(ix+#0C) + or a + sbc hl,de + sbc a,b + rl h + rl h + sra a + rr h + sra a + rr h + ld bc,#0014 + add ix,bc + ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),a + ld bc,-20 + add ix,bc + ld l,(ix+#0A) + ld h,(ix+#0B) + ld d,(ix+#0C) + ld bc,#0014 + add ix,bc + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld bc,#7FFD + ld a,#07 ;rom 0, ram 7 + di + out (c),a + exx + ld l,(ix+#0A) + ld h,(ix+#0B) + ld d,(ix+#0C) + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld bc,#7FFD + exx +x1FEA ld a,#07 ;rom 0, ram 7 + di + out (c),a + ld a,(ix+#10) + sub #01 + ld (ix+#10),a + jr nc,x200D + ld a,(ix+#11) + sub #01 + ld (ix+#11),a + jr nc,x200D + ld a,(ix+#12) + sub #01 + ld (ix+#12),a + jr c,x203E +x200D out (c),e + ld a,(hl) + inc l + jr nz,x2024 + inc h + jr nz,x2024 + ex af,af' + inc d + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld hl,#C000 + ex af,af' +x2024 exx + di + out (c),e + ld (hl),a + inc l + jr nz,x203B + inc h + jr nz,x203B + inc d + ld a,d + call x1C64 + ld a,(x5B5C) + ld e,a + ld hl,#C000 +x203B exx + jr x1FEA +x203E ld a,#04 + call x1C64 + ld a,#00 + ld hl,#0014 + call x1CF3 ;коррекция свободного места на RAM диске + ld e,(ix+#0D) + ld d,(ix+#0E) + ld c,(ix+#0F) + ld a,d + rlca + rl c + rlca + rl c + ld a,d + and #3F + ld d,a + push ix +x2061 push de + ld de,-20 + add ix,de + pop de + ld l,(ix+#0A) + ld h,(ix+#0B) + ld a,(ix+#0C) + or a + sbc hl,de + sub c + bit 6,h + jr nz,x207C + set 6,h + dec a +x207C ld (ix+#0A),l + ld (ix+#0B),h + ld (ix+#0C),a + ld l,(ix+#10) + ld h,(ix+#11) + ld a,(ix+#12) + or a + sbc hl,de + sub c + bit 6,h + jr nz,x2099 + set 6,h + dec a +x2099 ld (ix+#10),l + ld (ix+#11),h + ld (ix+#12),a + push ix + pop hl + push de + ld de,(x5B83) + or a + sbc hl,de + pop de + jr nz,x2061 + ld de,(x5B83) + pop hl + push hl + or a + sbc hl,de + ld b,h + ld c,l + pop hl + push hl + ld de,#0014 + add hl,de + ex de,hl + pop hl + dec de + dec hl + lddr + ld hl,(x5B83) + ld de,#0014 + add hl,de + ld (x5B83),hl + ret + +;АДРЕС: #20D2 печать каталога RAM диска +x20D2 ld a,#04 ;ram 7 + call x1C64 + ld hl,x2121 +x20DA ld bc,x212B + ld ix,#EBEC +x20E1 call x05D6 ;проверка нажатия break и печать сообщения + push ix + ex (sp),hl + ld de,(x5B83) + or a + sbc hl,de + pop hl + jr z,x2111 + ld d,h + ld e,l + push hl + push bc + call x1C8A ;сравнение имени файла с заданным + pop bc + pop hl + jr nc,x210A + ld d,b + ld e,c + push hl + push bc + call x1C8A ;сравнение имени файла с заданным + pop bc + pop hl + jr c,x210A + push ix + pop bc +x210A ld de,-20 + add ix,de + jr x20E1 +x2111 push hl + ld hl,x212B + or a + sbc hl,bc + pop hl + ret z + ld h,b + ld l,c + call x2135 ;печать одной записи каталога RAM диска + jr x20DA +x2121 ds #0A,#00 +x212B ds #0A,#FF + +;АДРЕС: #2135 печать одной записи каталога RAM диска +x2135 push hl + push bc + pop hl + ld de,x5B67 + ld bc,#000A + ldir + ld a,#05 + call x1C64 ;rom 0 + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld hl,x5B67 + ld b,#0A +x2152 ld a,(hl) + push hl + push bc + rst #28 + dw Rom1.x0010 ;печать символа из A + pop bc + pop hl + inc hl + djnz x2152 + ld a,#0D + rst #28 + dw Rom1.x0010 ;перевод строки + rst #28 + dw Rom1.x0D4D ;копиравоние атрибутов + ld hl,(x5B81) + ld (x5B81),sp + ld sp,hl + ld a,#04 ;ram 7 + call x1C64 + pop hl + ret + +;АДРЕС: #2174 команда LPRINT +x2174 ld a,#03 + jr x217A + +;АДРЕС: #2178 команда PRINT +x2178 ld a,#02 +x217A rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x2182 + rst #28 + dw Rom1.x1601 ;открыть канал +x2182 rst #28 + dw Rom1.x0D4D ;копиравоние атрибутов + rst #28 + dw Rom1.x1FDF ;PRINT_2 + call x18A1 + ret + +;АДРЕС: #218C команда INPUT +x218C rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr z,x2199 + ld a,#01 + rst #28 + dw Rom1.x1601 ;открыть канал + rst #28 ;!!!ОШИБКА!!! + dw Rom1.x0D6E +x2199 ld (iy+#02),#01 + rst #28 + dw Rom1.x20C1 ;ввод данных по input + call x18A1 + rst #28 + dw Rom1.x20A0 ;ввод с клавиатуры + ret + +;АДРЕС: #21A7 команда COPY +x21A7 jp x08F0 + +;АДРЕС: #21AA команда NEW +x21AA di + jp x019D + +;АДРЕС: #21AE команда CIRCLE +x21AE rst #18 + cp "," + jr nz,x21EB ;ошибка + rst #20 + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x232D ;печать окружности + ret + +;АДРЕС: #21BE команда DRAW +x21BE rst #18 + cp "," + jr z,x21CA + call x18A1 + rst #28 + dw Rom1.x2477 ;печать линии + ret +x21CA rst #20 + rst #28 + dw Rom1.x1C82 ;получение числового значения + call x18A1 + rst #28 + dw Rom1.x2394 ;печать линии + ret + +;АДРЕС: #21D5 команда DIM +x21D5 rst #28 + dw Rom1.x28B2 ;LOOK-VARS + jr nz,x21EB + rst #28 + dw Rom1.x2530 ;проверка флага проверка/исполнение программы + jr nz,x21E7 + res 6,c + rst #28 + dw Rom1.x2996 ;проверкае синтаксиса выражения, заключенного в скобки + call x18A1 +x21E7 rst #28 + dw Rom1.x2C15 ;D-RUN + ret + +x21EB call x05AC + db #0B ;C Nonsense in BASIC + +;АДРЕС: #21EF очистка экрана +x21EF bit 0,(iy+#30) + ret z + rst #28 + dw Rom1.x0DAF ;очистить экран + ret + +;АДРЕС: #21F8 вычисличть числовое выражение +x21F8 ld hl,#FFFE + ld (#5C45),hl ;выполнение оператора в непосредственном режиме + res 7,(iy+#01) ;проверка синтаксиса + call x228E ;поиск начала бейсик команды + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x24FB ;анализ строки + bit 6,(iy+#01) + jr z,x223A ;обработка символьного выражения + rst #18 ;получить символ + cp #0D + jr nz,x223A + set 7,(iy+#01) ;выполнение программы + call x228E ;поиск начала бейсик команды + ld hl,x0321 ;адрес возврата при ошибке + ld (x5B8B),hl + rst #28 + dw Rom1.x24FB ;анализ строки + bit 6,(iy+#01) + jr z,x223A ;обработка символьного выражения + ld de,x5B8D ;адрес последней длины, выводимой при вычислениях + ld hl,(#5C65) ;адрес вершины стэка калькулятора + ld bc,#0005 + or a + sbc hl,bc + ldir + jp x223E +x223A call x05AC ;без возврата + db #19 ;Q Parameter error, n:m +x223E ld a,#0D + call x226F ;обработка нажатой клавиши + ld bc,#0001 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0030 ;резервирование места +x2249 ld (#5C5B),hl ;адрес символа редактируемой строки + push hl + ld hl,(#5C51) ;адрес описателя текущего канала + push hl + ld a,#FF ;канал -1 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1601 ;открыть канал + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x2DE3 ;печать числа с плавающей точкой + pop hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1615 ;установка флагов канала (возврат предыдущего канала) + pop de + ld hl,(#5C5B) ;адрес символа редактируемой строки + and a + sbc hl,de +x2264 ld a,(de) + call x226F ;обработка нажатой клавиши + inc de + dec hl + ld a,h + or l + jr nz,x2264 + ret + +;АДРЕС: #226F обработка нажатой клавиши +;вх: a - код клавиши +x226F push hl + push de + call x1F45 ;установка другого стэка и ram 7 + ld hl,#EC0D + res 3,(hl) + push af + ld a,#02 + rst #28 + dw Rom1.x1601 ;открыть канал #02 + pop af + call x2669 ;обработка нажатия клавиши + ld hl,#EC0D + res 3,(hl) + call x1F20 ;установка другого стэка и ram 0 + pop de + pop hl + ret + +;АДРЕС: #228E поиск начала бейсик команды +x228E ld hl,(#5C59) + dec hl + ld (#5C5D),hl + rst #20 ;получение следующего символа в бейсик программе + ret + +;АДРЕС: #2297 проверка это команда LET? (калькулятор basic 128) +;вых: z - это только команда LET +x2297 call x228E ;поиск начала бейсик команды + cp #F1 ;LET ? + ret nz + ld hl,(#5C5D) +x22A0 ld a,(hl) + inc hl + cp #0D + ret z + cp ":" + jr nz,x22A0 + or a + ret + +;АДРЕС: #22AB проверка это оператор? +x22AB ld b,a + ld hl,x22BD +x22AF ld a,(hl) + inc hl + or a + jr z,x22B9 + cp b + jr nz,x22AF + ld a,b + ret +x22B9 or #FF + ld a,b + ret + +;АДРЕС: #22BD список токенов операторов +x22BD db #2B,#2D,#2A ; '+', '-', '*' + db #2F,#5E,#3D ; '/', '^', '=' + db #3E,#3C,#C7 ; '>', '<', '<=' + db #C8,#C9,#C5 ; '>=', '<>', 'OR' + db #C6 ; 'AND' + db #00 ;маркер конца таблицы + +;АДРЕС: #22CB проверка это токен? +;вых: z - это токен +x22CB cp #A5 + jr c,x22DD + cp #C4 + jr nc,x22DD + cp #AC + jr z,x22DD + cp #AD + jr z,x22DD + cp a + ret +x22DD cp #A5 + ret + +;АДРЕС: #22E0 проверка это число или функция? +x22E0 ld b,a + or #20 + cp "a" + jr c,x22ED ;это не буква + cp "z"+1 + jr nc,x22ED ;это не буква + cp a + ret +x22ED ld a,b + cp "." + ret z + call x230A ;проверка это цифра или нет + jr nz,x2307 ;не цифра +x22F6 rst #20 ;читаем следующий симввол + call x230A ;проверка это цифра или нет + jr z,x22F6 ;это цифра + cp "." + ret z + cp "E" + ret z + cp "e" + ret z + jr x22AB ;проверка это оператор? +x2307 or #FF + ret + +;АДРЕС: #230A проверка это цифра или нет +;вых: z - это цифра +x230A cp "0" + jr c,x2314 ;это не цифра + cp "9"+1 + jr nc,x2314 ;это не цифра + cp a + ret +x2314 cp "0" + ret + +;АДРЕС: #2317 команда PLAY +x2317 ld b,#00 + rst #18 +x231A push bc + rst #28 + dw Rom1.x1C8C ;параметр - строка + pop bc + inc b + cp "," + jr nz,x2327 + rst #20 + jr x231A +x2327 ld a,b + cp #09 + jr c,x2330 + call x05AC + db #2B ;!!!ОШИБКА!!! +x2330 call x18A1 + jp x0985 + +;АДРЕС: #2336 !!!NOT USED!!! возврат в редактор +x2336 ld hl,x5BFF + ld (x5B81),hl + call x1F45 + jp x25CB + +;АДРЕС: #2342 !!!NOT USED!!! bc=hl-de +x2342 and a + sbc hl,de + ld b,h + ld c,l + add hl,de + ex de,hl + ret + +;АДРЕС: #234A !!!NOT USED!!! зарезервировать память на 1 байт +x234A ld bc,#0001 + push hl + push de + call x2358 + pop de + pop hl + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + ret + +;АДРЕС: #2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc +x2358 ld hl,(#5C65) + add hl,bc + jr c,x2368 + ex de,hl + ld hl,#0082 + add hl,de + jr c,x2368 + sbc hl,sp + ret c +x2368 ld (iy+#00),#03 ;4 Out of Memory + jp x0321 + +;АДРЕС: #236F !!!NOT USED!!! hl=a*#20 +x236F add a,a + add a,a + +;АДРЕС: #2371 !!!NOT USED!!! hl=a*#08 +x2371 ld l,a + ld h,#00 + add hl,hl + add hl,hl + add hl,hl + ret + +;АДРЕС: #2378 !!!NOT USED!!! расчет свободного места +x2378 ld hl,#0000 + add hl,sp + ld de,(#5C65) + or a + sbc hl,de + ret + +;АДРЕС: #2384 !!!NOT USED!!! печать на экране строки из буфера +x2384 res 0,(iy-#39) + call x236F + push hl + ld de,(#FF24) + add hl,de + ld d,h + ld e,l + ex (sp),hl + push hl + push de + ld de,#5800 + add hl,de + ex de,hl + pop hl + ld bc,#0020 + ld a,(#5C8F) + call x249B + pop hl + ld a,h + ld h,#00 + add a,a + add a,a + add a,a + add a,#40 + ld d,a + ld e,h + add hl,de + ex de,hl + pop hl + ld b,#20 + jp x23E1 + +;АДРЕС: #23B8 !!!NOT USED!!! печать в буфере #FF +x23B8 ld d,#FF + call x236F + ld a,d + ld de,(#FF24) + add hl,de + ld e,l + ld d,h + inc de + ld (hl),a + dec bc + ldir + ret + +;АДРЕС: #23CB !!!NOT USED!!! копирование буфера на экран +x23CB call x2488 + ld de,#4000 + ld hl,(#FF24) + ld b,e + call x23E1 + ld d,#48 + call x23E1 + ld d,#50 + ld b,#C0 + +;АДРЕС: #23E1 !!!NOT USED!!! печать символов из буфера на экране +x23E1 ld a,(hl) + push hl + push de + cp #FE + jr c,x23EC + sub #FE + jr x2422 +x23EC cp #20 + jr nc,x23F7 + ld hl,x2527 + and a + ex af,af' + jr x242B +x23F7 cp #80 + jr nc,x2409 + call x2371 + ld de,(#5C36) + add hl,de + pop de + call #FF28 + jr x2450 +x2409 cp #90 + jr nc,x2411 + sub #7F + jr x2422 +x2411 sub #90 + call x2371 + pop de + call x1F20 + push de + ld de,(#5C7B) + scf + jr x2429 +x2422 ld de,x252F + call x2371 + and a +x2429 ex af,af' + add hl,de +x242B pop de +x242C ld c,d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + inc hl + inc d + ld a,(hl) + ld (de),a + ld d,c + ex af,af' + call c,x1F45 +x2450 pop hl + inc hl + inc de + djnz x23E1 + ret + +;АДРЕС: #2456 !!!NOT USED!!! переключение страниц rom 0/1 +x2456 push bc + di + ld bc,#7FFD + ld a,(x5B5C) + xor #10 + out (c),a + ei + ex af,af' + +;АДРЕС: #2464 !!!NOT USED!!! переключение страниц rom 0/1 +x2464 ex af,af' + di + ld c,#FD + xor #10 + out (c),a + ei + pop bc + ret + +;АДРЕС: #246F !!!NOT USED!!! копирование п/п в ram 7 +x246F ld hl,x2456 + ld de,#FF28 + ld bc,#000E + ldir + push hl + ld hl,x242C + ld c,#20 + ldir + pop hl + ld c,#0B + ldir + ret + +;АДРЕС: #2488 !!!NOT USED!!! установка атрибутов из буфера экрана +x2488 res 0,(iy-#39) + ld de,#5800 + ld bc,#02C0 + ld hl,(#FF24) + ld a,(#5C8D) + ld (#5C8F),a + +;АДРЕС: #249B !!!NOT USED!!! установка атрибутов из буфера экрана +x249B ex af,af' +x249C push bc + ld a,(hl) + cp #FF + jr nz,x24AA + ld a,(#5C8D) + ld (de),a + inc hl + inc de + jr x2507 +x24AA ex af,af' + ld (de),a + inc de + ex af,af' + inc hl + cp #15 + jr nc,x2507 + cp #10 + jr c,x2507 + dec hl + jr nz,x24C2 + inc hl + ld a,(hl) + ld c,a + ex af,af' + and #F8 + jr x2505 +x24C2 cp #11 + jr nz,x24D1 + inc hl + ld a,(hl) + add a,a + add a,a + add a,a + ld c,a + ex af,af' + and #C7 + jr x2505 +x24D1 cp #12 + jr nz,x24DE + inc hl + ld a,(hl) + rrca + ld c,a + ex af,af' + and #7F + jr x2505 +x24DE cp #13 + jr nz,x24EC + inc hl + ld a,(hl) + rrca + rrca + ld c,a + ex af,af' + and #BF + jr x2505 +x24EC cp #14 + inc hl + jr nz,x2507 + ld c,(hl) + ld a,(#5C01) + xor c + rra + jr nc,x2507 + ld a,#01 + xor (iy-#39) + ld (#5C01),a + ex af,af' + call x2513 +x2505 or c + ex af,af' +x2507 pop bc + dec bc + ld a,b + or c + jp nz,x249C + ex af,af' + ld (#5C8F),a + ret + +;АДРЕС: #2513 !!!NOT USED!!! поменять местами ink и paper +x2513 ld b,a + and #C0 + ld c,a + ld a,b + add a,a + add a,a + add a,a + and #38 + or c + ld c,a + ld a,b + rra + rra + rra + and #07 + or c + ret + +x2527 db %00000000 ; + db %00111100 ; XXXX + db %01100010 ; XX X + db %01100000 ; XX + db %01101110 ; XX XXX + db %01100010 ; XX X + db %00111110 ; XXXX + db %00000000 ; + +x252F db %00000000 ; + db %01101100 ; XX XX + db %00010000 ; X + db %01010100 ; X X X + db %10111010 ; X XXX X + db %00111000 ; XXX + db %01010100 ; X X X + db %10000010 ; X X + +;АДРЕС: #2537 таблица адресов обработки нажатий в режиме редактирования +x2537 db #15 ;размер таблицы + db #0B: dw #2A94 ;перемещение курсора вверх в поле редактирования + db #0A: dw #2AB5 ;перемещение курсора вниз в поле редактирования + db #08: dw #2AD7 ;перемещение курсора влево в поле редактирования + db #09: dw #2AE3 ;перемещение курсора вправо в поле редактирования + db #AD: dw #2A4F ;ext+P перемещение курсора вверх на 10 строк в поле редактирования + db #AC: dw #2A25 ;ss+I перемещение курсора вниз на 10 строк в поле редактирования + db #AF: dw #29D4 ;ext+I переход к началу текущего слова + db #AE: dw #29E1 ;ext+shift+J переход к началу следующего слова + db #A6: dw #2983 ;ext+N/Graph+W переход к первой строке бейсик программы + db #A5: dw #29AB ;ext+T/Graph+V переход к последней строке бейсик программы + db #A8: dw #2A87 ;ext+ss+2/Graph+Y переход к началу строки редактирования + db #A7: dw #2A7A ;ext+M/graph+X перемещение курсора в конец строки в поле редактирования + db #AA: dw #291B ;ext+ss+K удаление символа справа от курсора + db #0C: dw #292B ;delete удаление символа слева от курсора + db #B3: dw #3017 ;ext+W удаление символов от курсора до начала следующего слова + db #B4: dw #2FBC ;ext+E удаление символов от курсора до начала текущего слова + db #B0: dw #3072 ;ext+J удаление символов до конца строки + db #B1: dw #303E ;ext+K удаление символов до наала строки + db #0D: dw #2944 ;enter ввод строки + db #A9: dw #269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху + db #07: dw #2704 ;cs+1 вызов меню + +;АДРЕС: #2577 таблица адресов обработки нажатий в основном меню basic 128k +x2577 db #04 ;размер таблицы + db #0B: dw x272E ;вверх + db #0A: dw x2731 ;вниз + db #07: dw x2717 ;cs+1 + db #0D: dw x2717 ;enter + +;АДРЕС: #2584 подготовка переменных +x2584 call x28BE ;инициализация курсора для верхнего окна + ld hl,#0000 + ld (#FC9A),hl + ld a,#82 + ld (#EC0D),a + ld hl,#0000 + ld (#5C49),hl ;Номер строки бейсик-программы, отмеченной курсором + call x35BC ;установка параметров отступа + call x365E ;установка переменных для ввода символа + ret + +;АДРЕС: #259F печать главного меню basic 128 и выбор опции +x259F ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#02 ;канал #02 (основной экран) + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1601 ;открыть канал +x25AD ld hl,x2744 ;п/п обработки главного меню + ld (#F6EA),hl + ld hl,x2754 ;текст основного меню basic 128k + ld (#F6EC),hl + push hl + ld hl,#EC0D + set 1,(hl) ;на отображено меню + res 4,(hl) ;возврат в главное меню + dec hl + ld (hl),#00 ;номер опции меню + pop hl + call x36A8 ;печать главного меню basic 128k + jp x2653 ;основной цикл в basic128/калькулятор + +;АДРЕС: #25CB возврат в редактор/калькулятор/меню после обработки ошибки +x25CB ld ix,#FD6C + ld hl,x5BFF + ld (x5B81),hl + call x1F45 ;установка другого стэка и ram 7 + ld a,#02 + rst #28 + dw Rom1.x1601 ;открыть канал + call x3668 ;установка переменных для ввода символа + ld hl,#5C3B +x25E3 bit 5,(hl) + jr z,x25E3 + ld hl,#EC0D + res 3,(hl) + bit 6,(hl) + jr nz,x2604 + ld a,(#EC0E) + cp #04 + jr z,x2601 ;это калькулятор + cp #00 + jp nz,x28C7 + call x3848 ;печать информационной строки 128 BASIC + jr x2604 +x2601 call x384D ;печать информационной строки Calculator +x2604 call x30D6 ;установка буфера редактирования внизу экрана + call x3222 ;установка буфера редактирования в верху экрана + ld a,(#EC0E) + cp #04 + jr z,x2653 ;калькулятор + ld hl,(#5C49) + ld a,h + or l + jr nz,x262D + ld hl,(#5C53) + ld bc,(#5C4B) + and a + sbc hl,bc + jr nz,x262A + ld hl,#0000 + ld (#EC08),hl +x262A ld hl,(#EC08) +x262D call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld hl,#EC0D + bit 5,(hl) + jr nz,x2653 + ld hl,#0000 + ld (#EC06),hl + call x152F ;печать бейсик программы от текущей строки + call x29F2 ;напечатать курсор + call x2944 ;enter ввод строки + +;АДРЕС: #2653 основной цикл в basic128/калькулятор +x2653 ld sp,#5BFF + call x3668 ;установка переменных для ввода символа + call x367F ;ожидание нажатия клавиши + push af ;код клавиши + ld a,(#5C39) ;звук нажатия на клавишу + call x26EC ;звуковой сигнал + pop af + call x2669 ;обработка нажатия клавиши + jr x2653 ;основной цикл в basic128/калькулятор + +;АДРЕС: #2669 обработка нажатия клавиши +;вх: a - код клавиши +;вых: z - отображено меню +x2669 ld hl,#EC0D + bit 1,(hl) + push af + ld hl,x2577 ;основное меню basic 128k + jr nz,x2677 ;отображено меню + ld hl,x2537 ;клавиши для режима редактирования +x2677 call x3FCE ;обработка нажатой управляющей клавиши в меню + jr nz,x2681 ;не найден обработчик клавиши + call nc,x26E7 ;звуковой сигнал + pop af + ret +;не найден обработчик клавиши +x2681 pop af + jr z,x2689 ;это режим редактирования + xor a ;курсор K,L или C + ld (#5C41),a + ret +x2689 ld hl,#EC0D + bit 0,(hl) + jr z,x2694 ;буфер редактирования не переполнен + call x26E7 ;звуковой сигнал + ret ;!!!тут можно сократить!!! +x2694 cp #A3 + jr nc,x2653 ;!!!ОШИБКА!!! должно быть ret nc + jp x28F1 ;обрабока нажатия символьной клавиши + +;АДРЕС: #269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху +x269B ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x1630 ;очистка окна редактирования + ld hl,#EC0D + res 3,(hl) + ld a,(hl) + xor #40 + ld (hl),a + and #40 + jr z,x26B6 + call x26BB ;выбор нижнего экрана + jr x26B9 +x26B6 call x26CE ;выбор верхнего экрана +x26B9 scf + ret + +;АДРЕС: #26BB выбор нижнего экрана +x26BB call x3881 ;очистка двух нижних строк экрана + ld hl,#EC0D + set 6,(hl) + call x2E2D ;сброс нижнего окна редактирования + call x3A88 ;установка настроек курсора для нижнего окна + call x28DF ;инициализация настроек нижнего окна + jr x26D9 + +;АДРЕС: #26CE выбор верхнего экрана +x26CE ld hl,#EC0D + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + call x3848 ;печать информационной строки 128 BASIC +x26D9 ld hl,(#FC9A) + ld a,h + or l + call nz,x334A ;поиск адреса строки бейсик программы + call x152F ;печать бейсик программы от текущей строки + jp x29F2 ;напечатать курсор + +;АДРЕС: #26E7 звуковой сигнал +x26E7 ld a,(#5C38) ;заполнение буфера редактора + srl a + +;АДРЕС: #26EC звуковой сигнал +x26EC push ix + ld d,#00 + ld e,a + ld hl,#0C80 +x26F4 rst #28 ;вызов процедуры из basic 48k + dw Rom1.x03B5 ;beep + pop ix + ret + +;АДРЕС: #26FA звуковой сигнал +x26FA push ix + ld de,#0030 + ld hl,#0300 + jr x26F4 + +;АДРЕС: #2704 cs+1 вызов меню +x2704 call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#EC0D + set 1,(hl) + dec hl + ld (hl),#00 + ld hl,(#F6EC) + call x36A8 ;печать меню basic 128k + scf + ret + +;АДРЕС: #2717 нажатие cs+1/enter в главном меню +x2717 ld hl,#EC0D + res 1,(hl) + dec hl + ld a,(hl) + ld hl,(#F6EA) + push hl + push af + call x373E ;восстановление окна экрана 14*12 из буфера + pop af + pop hl + call x3FCE ;обработка нажатой управляющей клавиши в меню + jp x29F2 + +;АДРЕС: #272E курсор вверх в главном меню +x272E scf + jr x2732 + +;АДРЕС: #2731 курсор вниз в главном меню +x2731 and a +x2732 ld hl,#EC0C + ld a,(hl) + push hl + ld hl,(#F6EC) ;адрес списка опций меню + call c,x37A7 ;вверх + call nc,x37B6 ;вниз + pop hl + ld (hl),a +x2742 scf + ret + +;АДРЕС: #2744 адреса процедур обработки опций основного меню basic 128k +x2744 db #05 ;кол-во опций + db #00: dw x2816 ;выбор опции 128 TR-DOS + db #01: dw x286C ;выбор опции 128 BASIC + db #02: dw x2885 ;выбор опции калькулятор + db #03: dw x1B47 ;выбор опции 48 BASIC + db #04: dw x2831 ;выбор опции 48 TR-DOS (вход в Tr-Dos 48k) + +;АДРЕС: #2754 текст основного меню basic 128k +x2754 db #06 ;кол-во строк + db "128 ",#FF +x275E dc "128 TR-DOS" +x2768 dc "128 BASIC" +x2771 dc "Calculator" + dc "48 BASIC" +x2783 dc "48 TR-DOS" + dc " " ;признак окончания + +;АДРЕС: #278D !!!NOT USED!!! +x278D db #20,#80,#A0 + +;АДРЕС: #2790 адреса процедур обработки опций меню в редакторе basic 128 +x2790 db #05 ;кол-во опций + db #00: dw x2742 ;возврат к редактированию + db #01: dw x2851 ;перенумерация строк программы + db #02: dw x2811 ;смена области редактирования низ/верх + db #03: dw x2862 ;печать программы на принтере + db #04: dw x281C ;выход из редактора + +;АДРЕС: #27A0 текст меню в редакторе basic 128 +x27A0 db #06 + db "Options ",#FF + dc "128 BASIC" + dc "Renumber" + dc "Screen" + dc "Print" + dc "Exit" + dc " " ;признак окончания + +;АДРЕС: #27CB адреса процедур обработки опций меню в калькуляторе +x27CB db #02 + db #00: dw x2742 ;возврат к редактированию + db #01: dw x281C ;выход в главное меню + +;АДРЕС: #27D2 текст меню в калькуляторе +x27D2 db #03 + db "Options ",#FF + dc "Calculator" + dc "Exit" + dc " " ;признак окончания + +;АДРЕС: #27EB !!!NOT USED!!! +x27EB db #16,#01,#00 ;AT 1,0 + db #10,#00 ;ink 0 + db #11,#07 ;paper 7 + db #13,#00 ;bright 0 + dc "To cancel - press BREAK twice" + +;АДРЕС: #2811 смена области редактирования низ/верх +x2811 call x269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху + jr x2874 ; + +;АДРЕС: #2816 выбор опции 128 TR-DOS +x2816 call x3857 ;печать информационной строки 128 TR-DOS + call x3BE9 ;запуск команды randomize 15619: rem: load "boot" + +;АДРЕС: #281С выход из редактора/калькулятора в главное меню +x281C ld hl,#EC0D + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + ld b,#00 + ld d,#17 + call x3B5E ;очистка строк экрана + call x1F20 ;установка другого стэка и ram 0 + jp x259F ;печать главного меню basic 128 и выбор опции + +;АДРЕС: #2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) +x2831 call x3852 ;печать информационной строки 48 TR-DOS + ld hl,#0000 + push hl + ld hl,#3D30 + jp x1B4A ;включение basic48, блокировка #7FFD и переход на адрес в hl + +;АДРЕС: #283E !!!NOT USED!!! +x283E dec b + res 0,(hl) + set 6,(hl) + ld a,#07 + ld (#EC0E),a + ld bc,#0000 + call x372B + jp x1AF1 + +;АДРЕС: #2851 перенумерация строк программы +x2851 call x3888 ;перенумерация строк программы + call nc,x26E7 ;звуковой сигнал + ld hl,#0000 + ld (#5C49),hl + ld (#EC08),hl + jr x2865 + +;АДРЕС: #2862 печать программы на принтере +x2862 call x1B14 ;пункт меню редактора Print (печать на принтер) +x2865 ld hl,#EC0D + bit 6,(hl) + jr nz,x2874 + +;АДРЕС: #286C выбор опции 128 BASIC +x286C ld hl,#5C3C + res 0,(hl) + call x3848 ;печать информационной строки 128 BASIC +x2874 ld hl,#EC0D + res 5,(hl) + res 4,(hl) + ld a,#00 + ld hl,x2790 + ld de,x27A0 + jr x28B1 + +;АДРЕС: #2885 выбор опции калькулятор +x2885 ld hl,#EC0D + set 5,(hl) + set 4,(hl) + res 6,(hl) + call x28BE ;инициализация курсора для верхнего окна + call x384D ;печать информационной строки Calculator + ld a,#04 + ld (#EC0E),a + ld hl,#0000 + ld (#5C49),hl + call x152F ;печать бейсик программы от текущей строки + ld bc,#0000 + ld a,b + call x29F8 ;напечатать курсор + ld a,#04 + ld hl,x27CB + ld de,x27D2 +x28B1 ld (#EC0E),a + ld (#F6EA),hl + ld (#F6EC),de + jp x2604 + +;АДРЕС: #28BE инициализация курсора для верхнего окна +x28BE call x2E1F ;сброс верхнего окна редактирования + call x3A7F ;установка настроек курсора для верхнего окна + jp x28E8 ;инициализация настроек верхнего окна + +;АДРЕС: #28C7 возврат в главное меню +x28C7 ld b,#00 + ld d,#17 + call x3B5E ;очистка строк экрана + jp x25AD + +;настройки верхнего окна +x28D1 db #06 + db #00,#00,#00,#04,#10,#14 + +;настройки нижнего окна +x28D8 db #06 + db #00,#00,#00,#00,#01,#01 + +;АДРЕС: #28DF инициализация настроек нижнего окна +x28DF ld hl,x28D8 + ld de,#F6EE + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #28E8 инициализация настроек верхнего окна +x28E8 ld hl,x28D1 + ld de,#F6EE + jp x3FBA + +;АДРЕС: #28F1 обработка нажатия символьной клавиши +x28F1 ld hl,#EC0D + or a ;!!!ЛИШНЕЕ!!! + or a ;!!!ЛИШНЕЕ!!! + bit 0,(hl) + jp nz,x29F2 + res 7,(hl) + set 3,(hl) + push hl + push af + call x29EC ;удаление курсора, восстановление атрибутов + pop af + push af + call x2E81 ;вставка символа в буфер редактирования + pop af + ld a,b + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + pop hl + set 7,(hl) + jp nc,x29F2 + ld a,b + jp c,x29F8 + jp x29F2 + +;АДРЕС: #291B ext+ss+K удаление символа справа от курсора +x291B ld hl,#EC0D + set 3,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + call x2F12 ;удаление символа в строке в буфере редактирования + scf + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #292B delete удаление символа слева от курсора +x292B ld hl,#EC0D + res 0,(hl) + set 3,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + ccf + jp c,x29F2 ;напечатать курсор + call x2F12 ;удаление символа в строке в буфере редактирования + scf + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2944 enter ввод строки +x2944 call x29EC ;удаление курсора, восстановление атрибутов + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + push bc + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x295E + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #09 + jr z,x297A +x295E ld a,(#EC0D) + bit 3,a + jr z,x296A + call x2C8E ;вставить строку бейсик программы + jr nc,x297F +x296A call x2C4C ;поиск конца строки в буфере редактирования + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + call x2ECE ;вставка пустой строки в буфер редактирования + ld b,#00 + pop af + scf + jp x29F8 ;напечатать курсор +x297A pop af + scf + jp x29F2 ;напечатать курсор +x297F pop af + jp x29F2 ;напечатать курсор + +;АДРЕС: #2983 ext+N/Graph+W переход к первой строке бейсик программы +x2983 ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#0000 + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld a,#0F + call x3A96 ;сохранить атрибуты курсора + call x152F ;печать бейсик программы от текущей строки + scf + jp x29F2 ;напечатать курсор + +;АДРЕС: #29AB ext+T/Graph+V переход к последней строке бейсик программы +x29AB ld a,(#EC0E) + cp #04 + ret z ;это калькулятор + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#270F ;9999 + call x1F20 ;установка другого стэка и ram 0 + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + ex de,hl + rst #28 + dw Rom1.x1695 ;получить адрес первой строки программы + call x1F45 ;установка другого стэка и ram 7 + ld (#5C49),de + ld a,#0F + call x3A96 ;сохранить атрибуты курсора + call x152F ;печать бейсик программы от текущей строки + scf + jp x29F2 ;напечатать курсор + +;АДРЕС: #29D4 ext+I переход к началу текущего слова +x29D4 call x29EC ;удаление курсора, восстановление атрибутов + call x2BEA ;поиск начала слова слева от курсора + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #29E1 ext+shift+J переход к началу следующего слова +x29E1 call x29EC ;удаление курсора, восстановление атрибутов + call x2C09 ;поиск начала слова справа от курсора + jr nc,x29F2 ;напечатать курсор + ld a,b + jr x29F8 ;напечатать курсор + +;АДРЕС: #29EC удаление курсора, восстановление атрибутов +x29EC call x2A07 ;получение позиции курсора + jp x364F ;восстановление атрибутов под курсором + +;АДРЕС: #29F2 напечатать курсор +x29F2 call x2A07 ;получение позиции курсора + jp x3640 ;печать атрибутов курсора + +;АДРЕС: #29F8 напечатать курсор +x29F8 call x2A11 ;сохранить позицию курсора + push af + push bc + ld a,#0F ;paper 1, ink 7 + call x3A96 ;сохранить атрибуты курсора + pop bc + pop af + jp x3640 ;печать атрибутов курсора + +;АДРЕС: #2A07 получение позиции курсора +;вых: c - номер строки +; b - номер столбца +; a - предпочтительный номер столбца +x2A07 ld hl,#F6EE + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld a,(hl) + inc hl + ret + +;АДРЕС: #2A11 сохранить позицию курсора +x2A11 ld hl,#F6EE + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),a + ret + +;АДРЕС: #2A1A получение текущего символа в буфере редактирования +x2A1A push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld h,#00 + ld l,b + add hl,de + ld a,(hl) + pop hl + ret + +;АДРЕС: #2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования +x2A25 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + ld d,#0A +x2A2B push de + call x2B30 ;вставить строку бейсик программы + pop de + jr nc,x29F2 ;напечатать курсор + ld a,e + call x2A11 ;сохранить позицию курсора + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + jr nc,x2A42 + dec d + jr nz,x2A2B + ld a,e + jr c,x29F8 ;напечатать курсор +x2A42 push de + call x2B0B ;вставить строку бейсик программы + pop de + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + ld a,e + or a + jr x29F8 ;напечатать курсор + +;АДРЕС: #2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования +x2A4F call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + ld d,#0A +x2A55 push de + call x2B0B ;вставить строку бейсик программы + pop de + jr nc,x29F2 ;напечатать курсор + ld a,e + call x2A11 ;сохранить позицию курсора + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + jr nc,x2A6D + dec d + jr nz,x2A55 + ld a,e + jp c,x29F8 ;напечатать курсор +x2A6D push af + call x2B30 ;вставить строку бейсик программы + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования +x2A7A call x29EC ;удаление курсора, восстановление атрибутов + call x2C4C ;поиск конца строки в буфере редактирования + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A87 ext+ss+2/Graph+Y переход к началу строки редактирования +x2A87 call x29EC ;удаление курсора, восстановление атрибутов + call x2C31 ;поиск начала строки редактирования в буфере + jp nc,x29F2 ;напечатать курсор + ld a,b + jp x29F8 ;напечатать курсор + +;АДРЕС: #2A94 перемещение курсора вверх в поле редактирования +x2A94 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + push de + call x2B0B ;вставить строку бейсик программы + pop de + jp nc,x29F2 ;напечатать курсор + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + ld a,e + jp c,x29F8 ;напечатать курсор + push af + call x2B30 ;вставить строку бейсик программы + ld b,#00 + call x2AF9 ;найти в строке ближайшую редактируемую позицию + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AB5 перемещение курсора вниз в поле редактирования +x2AB5 call x29EC ;удаление курсора, восстановление атрибутов + ld e,a + push de + call x2B30 ;вставить строку бейсик программы + pop de + jp nc,x29F2 ;напечатать курсор + ld b,e + call x2B02 ;найти в строке ближайшую редактируемую позицию + ld a,e + jp c,x29F8 ;напечатать курсор + push de + call x2B0B ;вставить строку бейсик программы + pop de + ld b,e + call x2AF9 ;найти в строке ближайшую редактируемую позицию + ld a,e + or a + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AD7 перемещение курсора влево в поле редактирования +x2AD7 call x29EC ;удаление курсора, восстановление атрибутов + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jp c,x29F8 ;напечатать курсор + jp x29F2 ;напечатать курсор + +;АДРЕС: #2AE3 перемещение курсора вправо в поле редактирования +x2AE3 call x29EC ;удаление курсора, восстановление атрибутов + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jp c,x29F8 ;напечатать курсор + push af + call x2B0B ;вставить строку бейсик программы + ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа + pop af + jp x29F8 ;напечатать курсор + +;АДРЕС: #2AF9 найти в строке ближайшую редактируемую позицию +x2AF9 push de + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + call nc,x2BDF ;поиск в строке влево от курсора редактируемого символа + pop de + ret + +;АДРЕС: #2B02 найти в строке ближайшую редактируемую позицию +x2B02 push de + call x2BDF ;поиск в строке влево от курсора редактируемого символа + call nc,x2BD4 ;поиск редактируемого символа в строке справа от курсора + pop de + ret + +;АДРЕС: #2B0B вставить строку бейсик программы, если требуется сдвинуть строки +; в буфере вниз и обновить экран +x2B0B call x2C7C ;вставить строку в бейсик программу, если были изменения + jr nc,x2B2F + push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + call nc,x2F80 ;сдивг строк вверх в буфере при удалении строки + pop bc + ld hl,#F6F1 + ld a,(hl) + cp c + jr c,x2B2D + push bc + call x166F ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана + pop bc + ret c + ld a,c + or a + ret z +x2B2D dec c + scf +x2B2F ret + +;АДРЕС: #2B30 вставить строку бейсик программы, если требуется сдвинуть строки +; в буфере вверх и обновить экран +x2B30 push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x2B3F ;!!!можно оптимизировать + jp x2F80 +x2B3F call x2C68 ;вставить строку бейсик программы, если были изменения + jr nc,x2B5A + ld hl,#F6F1 + inc hl + ld a,c + cp (hl) + jr c,x2B58 + push bc + push hl + call x1639 ;сдвиг всех строк в буфере редактирования верх и обновление экрана + pop hl + pop bc + ret c + inc hl + ld a,(hl) + cp c + ret z +x2B58 inc c + scf +x2B5A ret + +;АДРЕС: #2B5B поиск редактируемой позиции слева от курсора во всем буфере +x2B5B ld d,a + dec b + jp m,x2B66 + ld e,b + call x2BDF ;поиск в строке влево от курсора редактируемого символа + ld a,e + ret c +x2B66 push de + call x2B0B ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран + pop de + ld a,e + ret nc + ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа + ld a,b + ret c + ld a,d + ld b,#00 + ret + +;АДРЕС: #2B78 поиск редактируемой позиции справа от курсора во всем буфере +;вх: b - номер столбца +; c - номер строки +;вых: cy=1 справа есть символ +; b - номер столбца с символом +; a - новый номер столбца +; hl - адрес ноовго редактируемого символа +x2B78 ld d,a + inc b + ld a,#1F + cp b + jr c,x2B85 + ld e,b + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + ld a,e + ret c +;переход к следующей строке +x2B85 dec b + push bc + push hl + ld hl,#EC0D + bit 7,(hl) + jr nz,x2BC0 ;клавиша не нажата +;нажата клавиша. вставим новую строку + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + ld a,(hl) + bit 1,a + jr nz,x2BC0 + set 1,(hl) + res 3,(hl) + ld hl,#0023 + add hl,de + ex de,hl + pop hl + pop bc + push af + call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран + pop af + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0023 + add hl,de + ex de,hl + res 0,a + set 3,a + call x2ED3 ;вставка пустой строки в буфер редактирования + call x35F4 ;создание отступа в строке в буфере редактирования + ld a,b + scf + ret +x2BC0 pop hl + pop bc + push de + call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран + pop de + ld a,b + ret nc + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + ld a,b + ret c + ld a,e + ld b,#00 + ret + +;АДРЕС: #2BD4 поиск редактируемого символа в строке справа от курсора +;вх: b - номер столбца +; c - номер строки +;вых: cy=1 справа есть символ +; b - номер столбца с символом +x2BD4 push de + push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jp x2C65 + +;АДРЕС: #2BDF поиск в строке влево от курсора редактируемого символа +x2BDF push de + push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E63 ;поиск в строке влево от курсора редактируемого символа + jp x2C65 + +;АДРЕС: #2BEA поиск начала слова слева от курсора +x2BEA push de + push hl +x2BEC call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x2C07 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2BEC +x2BF8 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x2C07 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr nz,x2BF8 + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере +x2C07 jr x2C65 + +;АДРЕС: #2C09 поиск начала слова справа от курсора +x2C09 push de + push hl +x2C0B call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jr nc,x2C2B + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr nz,x2C0B +x2C17 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + jr nc,x2C2B + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jr nc,x2C2B + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2C17 + scf + jr x2C65 +x2C2B call nc,x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + or a + jr x2C65 + +;АДРЕС: #2C31 поиск начала строки редактирования в буфере +x2C31 push de + push hl +x2C33 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x2C45 + call x2B0B ;вставить строку бейсик программы + jr c,x2C33 + jr x2C65 +x2C45 ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + jr x2C65 + +;АДРЕС: #2C4C поиск конца строки в буфере редактирования +x2C4C push de + push hl +x2C4E call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 3,(hl) + jr nz,x2C60 + call x2B30 ;вставить строку бейсик программы + jr c,x2C4E + jr x2C65 +x2C60 ld b,#1F + call x2BDF ;поиск в строке влево от курсора редактируемого символа +x2C65 pop hl + pop de + ret + +;АДРЕС: #2C68 вставить строку бейсик программы, если были изменения +;вх: c - номер строки +;вых: cy=0 строка вставлена +x2C68 ld a,(#EC0D) + bit 3,a + scf + ret z ;изменений не было + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 3,(hl) + scf + ret z + jr x2C8E + +;АДРЕС: #2C7C вставить строку в бейсик программу, если были изменения +x2C7C ld a,(#EC0D) + bit 3,a + scf + ret z + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + scf + ret z + +;АДРЕС: #2C8E вставить строку бейсик программы +;вх: c - номер строки +;вых: cy=0 синтаксическая ошибка +; cy=1 строка вставлена +; bc - координаты курсора +; a - номер столбца +x2C8E ld a,#02 +x2C90 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x2CA3 ;это первая строка + dec c + jp p,x2C90 + ld c,#00 + ld a,#01 +x2CA3 ld hl,#EC00 + ld de,#EC03 + or #80 + ld (hl),a + ld (de),a + inc hl + inc de + ld a,#00 ;!!!можно записать xor a + ld (hl),a + ld (de),a + inc hl + inc de + ld a,c + ld (hl),a + ld (de),a + ld hl,#0000 + ld (#EC06),hl + call x335F ;копирование процедур в ram + call x3C67 ;токенизация строки бейсик программы + push ix + call x1F20 ;установка другого стэка и ram 0 + call x026B ;выполненение введенной строки + call x1F45 ;установка другого стэка и ram 7 + pop ix + ld a,(#5C3A) + inc a + jr nz,x2CEF ;есть ошибка + ld hl,#EC0D + res 3,(hl) + call x365E ;установка переменных для ввода символа + ld a,(#EC0E) + cp #04 + call nz,x152F ;печать бейсик программы от текущей строки + call x26FA ;звуковой сигнал + call x2A07 ;получение позиции курсора + scf + ret +x2CEF ld hl,#EC00 + ld de,#EC03 + ld a,(de) + res 7,a + ld (hl),a + inc hl + inc de + ld a,(de) + ld (hl),a + inc hl + inc de + ld a,(de) + ld (hl),a + call x3C63 ;токенизация строки бейсик программы с синтаксической ошибкой + jr c,x2D0A + ld bc,(#EC06) +x2D0A ld hl,(#EC06) + or a + sbc hl,bc + push af + push hl + call x2A07 ;получение позиции курсора + pop hl + pop af + jr c,x2D2A + jr z,x2D45 +x2D1B push hl + ld a,b + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2D45 + dec hl + ld a,h + or l + jr nz,x2D1B + jr x2D45 +x2D2A push hl + ld hl,#EC0D + res 7,(hl) + pop hl + ex de,hl + ld hl,#0000 + or a + sbc hl,de +x2D38 push hl + ld a,b + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере + pop hl + jr nc,x2D45 + dec hl + ld a,h + or l + jr nz,x2D38 +x2D45 ld hl,#EC0D + set 7,(hl) + call x2A11 ;сохранить позицию курсора + ld a,#17 ;paper 2, ink 7 + call x3A96 ;сохранить атрибуты курсора + or a + ret + +;АДРЕС: #2D54 получить очередной символ из строки бейсик программы +;вых: a - код символа +x2D54 ld hl,#EC00 + bit 7,(hl) + jr z,x2D62 + ld hl,(#EC06) ;увеличим количество редактируемых символов в строке + inc hl + ld (#EC06),hl +x2D62 ld hl,#EC00 + ld a,(hl) ;флаги + inc hl + ld b,(hl) ;столбец + inc hl + ld c,(hl) ;строка + push hl + and #0F + ld hl,x2D85 ;таблица адресов процедур + call x3FCE ;обработка управляющего кода + ld e,l + pop hl + jr z,x2D79 + ld a,#0D +x2D79 ld (hl),c + dec hl + ld (hl),b + dec hl + push af + ld a,(hl) + and #F0 + or e + ld (hl),a + pop af + ret +;таблица адресов процедур +x2D85 db #03 ;размер таблицы + db #02: dw x2DAC + db #04: dw x2DE9 + db #01: dw x2D8F + +;АДРЕС: #2D8F получить символ из текущей позиции курсора в буфере редактирования +;вх: c - номер строки +;вых: l=#01 -> a - код символа из верхнего буфера +; =#02 -> a - код символа из буфера +; =#04 -> a - код символа из нижнего буфера +; =#08 -> a - =#0D конец буфера редактирования +x2D8F call x32B7 ;расчет адреса начала строки в буфере редактирования +x2D92 call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2D9E ;вне пределов строки + cp #00 + jr z,x2D92 ;нет символа + ld l,#01 + ret +x2D9E inc c ;следующая строка + ld b,#00 + ld hl,(#F9DB) ;!!!ОШИБКА!!! должно быть ld hl,#F9DB + ld a,c + cp (hl) + jr c,x2D8F + ld b,#00 + ld c,#00 +;на отображаемой строчке строки бейсик программы +x2DAC push hl + ld hl,#F6EE + ld a,(hl) + cp c + jr nz,x2DBE + inc hl + ld a,(hl) + cp b + jr nz,x2DBE + ld hl,#EC00 + res 7,(hl) +x2DBE pop hl +x2DBF call x30B4 ;расчет адреса начала строки в буфере редактирования + call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2DCE ;вне пределов строки + cp #00 + jr z,x2DAC + ld l,#02 + ret +x2DCE ld hl,#0020 + add hl,de + bit 3,(hl) + jr z,x2DDB + ld l,#08 + ld a,#0D + ret +x2DDB ld hl,#F6F3 + inc c + ld a,(hl) + cp c + ld b,#00 + jr nc,x2DBF + ld b,#00 + ld c,#01 +;используется нижний экран +x2DE9 call x31C3 ;расчет адреса начала строки в буфере редактирования +x2DEC call x2E0E ;получить символ из строки буфера редактирования + jr nc,x2DF8 ;вне пределов строки + cp #00 + jr z,x2DEC + ld l,#04 + ret +x2DF8 ld hl,#0020 + add hl,de + bit 3,(hl) + jr nz,x2E09 + inc c + ld b,#00 + ld a,(#F6F5) + cp c + jr nc,x2DE9 +x2E09 ld l,#08 + ld a,#0D + ret + +;АДРЕС: #2E0E получить символ из строки буфера редактирования +;вх: b - номер столбца +; de - адрес начала строки +;вых: cy=1 символ получен -> a - код символа +x2E0E ld a,#1F + cp b + ccf + ret nc + ld l,b + ld h,#00 + add hl,de + ld a,(hl) + inc b + scf + ret + +;настройки верхнего окна редактирования +x2E1B db #01 ;количество байт + db #14 ;количество редактируемых строк + +;настройки нижнего окна редактирования +x2E1D db #01 ;количество байт + db #01 ;количество редактируемых строк + +;АДРЕС: #2E1F сброс верхнего окна редактирования +x2E1F ld hl,#5C3C + res 0,(hl) ;вывод на основной экран + ld hl,x2E1B + ld de,#EC15 + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #2E2D сброс нижнего окна редактирования +x2E2D ld hl,#5C3C + set 0,(hl) + ld bc,#0000 + call x372B ;установка координат печати из bc + ld hl,x2E1D + ld de,#EC15 + jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт + +;АДРЕС: #2E41 поиск в строке вправо от курсора редактируемого символа +;вх: b - номер столбца, с которого следует начать поиск +; de - начало строки в буфере редактирования +;вых: cy=1 символ найден +; hl - адрес редактируемой позиции +; b - номер столбца +x2E41 ld h,#00 ;!!!можно сократить!!! call x2E7B + ld l,b + add hl,de + ld a,(hl) + cp #00 + scf + ret nz + ld a,b + or a + jr z,x2E5B + push hl + dec hl + ld a,(hl) + cp #00 + scf + pop hl + ret nz +x2E56 ld a,(hl) + cp #00 + scf + ret nz +x2E5B inc hl + inc b + ld a,b + cp #1F + jr c,x2E56 + ret + +;АДРЕС: #2E63 поиск в строке влево от курсора редактируемого символа +;вх: b - номер столбца, с которого следует начать поиск +; de - начало строки в буфере редактирования +;вых: cy=1 символ найден +; hl - адрес редактируемой позиции +; b - номер столбца +x2E63 ld h,#00 ;!!!можно сократить!!! call x2E7B + ld l,b + add hl,de + ld a,(hl) + cp #00 + scf + ret nz +x2E6C ld a,(hl) + cp #00 + jr nz,x2E78 + ld a,b + or a + ret z + dec hl + dec b + jr x2E6C +x2E78 inc b + scf + ret + +;АДРЕС: #2E7B чтение символа из буфера редактирования +;вх: b - номер столбца +; de - начало строки в буфере редактирования +;вых: a - символ по заданному адресу +x2E7B ld h,#00 + ld l,b + add hl,de + ld a,(hl) + ret + +;АДРЕС: #2E81 вставка символа в буфер редактирования +;вх: a - код символа +; bc - координаты курсора +x2E81 ld hl,#EC0D + or a ;!!!ЛИШНЕЕ!!! + bit 0,(hl) + ret nz ;буфер строки переполнен + push bc + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop af +x2E8E call x16AC ;вставка символа в строку буфера редактирования + push af + ex de,hl + call x3604 ;печать строки редактируемого буфера + ex de,hl + pop af + ccf + jr z,x2ECC ;буфер бельше не надо раздвигать + push af + ld b,#00 + inc c + ld a,(#EC15) + cp c + jr c,x2EC8 + ld a,(hl) + ld e,a + and #D7 + cp (hl) + ld (hl),a + ld a,e + set 1,(hl) + push af + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop af + jr z,x2EC2 + res 0,a + call x2ED3 ;вставка пустой строки в буфер редактирования + jr nc,x2ECC ;буфер переполнен + call x35F4 ;создание отступа в строке в буфере редактирования + pop af + jr x2E8E +x2EC2 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop af + jr x2E8E +x2EC8 pop af + call x316E ;вставка символа в нижний буфер редактирования +x2ECC pop bc + ret + +;АДРЕС: #2ECE вставка пустой строки в буфер редактирования +x2ECE call x30B4 + ld a,#09 + +;АДРЕС: #2ED3 вставка пустой строки в буфер редактирования +;вх: de - адрес строки в бефере редактирования +; a - флаги +; c - номер строки для вставки +x2ED3 push bc + push de + ld b,c + ld hl,x2EEF ;пустая строка + ld c,a + push bc + call x1675 ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана + pop bc + ld a,c + jr nc,x2EEC ;буфер переполнен + ld c,b + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + ld (hl),a + scf +x2EEC pop de + pop bc + ret +x2EEF ds #20,#00 + db #09: dw #0000 + +;АДРЕС: #2F12 удаление символа в строке в буфере редактирования +x2F12 push bc + call x30B4 ;расчет адреса начала строки в буфере редактирования + push bc +x2F17 ld hl,#0020 + add hl,de + bit 1,(hl) + ld a,#00 + jr z,x2F31 + inc c + ld hl,#0023 + add hl,de + ex de,hl + ld a,(#EC15) + cp c + jr nc,x2F17 + dec c + call x31C9 ;удаление символа в нижнем буфере редактирования +x2F31 pop hl +x2F32 push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + pop hl + ld b,a + ld a,c + cp l + ld a,b + push af + jr nz,x2F41 + ld b,h + jr x2F4A +x2F41 push af + push hl + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop hl + pop af +x2F4A push hl + ld hl,#F6F4 + set 0,(hl) + jr z,x2F54 + res 0,(hl) +x2F54 call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево + push af + push bc + push de + ld hl,#F6F4 + bit 0,(hl) + jr nz,x2F6F + ld b,#00 + call x2BD4 ;поиск редактируемого символа в строке справа от курсора + jr c,x2F6F + call x2F80 ;сдивг строк вверх в буфере при удалении строки + pop de + pop bc + jr x2F74 +x2F6F pop hl + pop bc + call x3604 ;печать строки редактируемого буфера, при необходимости +x2F74 pop af + dec c + ld b,a + pop hl + pop af + ld a,b + jp nz,x2F32 + scf + pop bc + ret + +;АДРЕС: #2F80 сдивг строк вверх в буфере при удалении строки +x2F80 ld hl,#0020 + add hl,de + ld a,(hl) + bit 0,(hl) + jr nz,x2FB2 + push af + push bc + ld a,c + or a + jr nz,x2FA4 + push bc + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + ld (#FC9A),hl + ld a,(#F9DB) + ld c,a + dec c + call x32B7 ;расчет адреса начала строки в буфере редактирования + pop bc + jr x2FA8 +x2FA4 dec c + call x30B4 ;расчет адреса начала строки в буфере редактирования +x2FA8 pop bc + pop af + ld hl,#0020 + add hl,de + res 1,(hl) + or (hl) + ld (hl),a +x2FB2 ld b,c + call x30B4 ;расчет адреса начала строки в буфере редактирования + call x30DF ;сдвиг строк в буфере редактирования вверх + jp x1648 ;сдвиг всех строк в буфере редактирования верх и обновление экрана + +;АДРЕС: #2FBC ext+E удаление символов от курсора до начала текущего слова +x2FBC call x3084 ;удаление курсора и запрет на обновление экрана +x2FBF push hl + call x3095 ;проверка наличия предыдущего символа в буфере + jr z,x2FF7 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2FF8 + call x2A1A ;получение текущего символа в буфере редактирования + push af + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + pop af + cp " " + jr z,x2FBF +x2FD9 push hl + call x3095 ;проверка наличия предыдущего символа в буфере + jr z,x2FF7 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + pop hl + jr nc,x2FF8 + call x2A1A ;получение текущего символа в буфере редактирования + cp " " + jr z,x2FF3 + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x2FD9 +x2FF3 push hl + call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере +x2FF7 pop hl +x2FF8 ld a,b + push af + push hl + ld hl,#EEF5 + res 2,(hl) + ld a,(#EC15) + push bc + ld b,#00 + ld c,a + cp a + call x1605 ;печать буфера редактирования на экране + pop bc + ld hl,#EC0D + set 3,(hl) + pop hl + call x29F8 ;напечатать курсор + pop af + ret + +;АДРЕС: #3017 ext+W удаление символов от курсора до начала следующего слова +x3017 call x3084 ;удаление курсора и запрет на обновление экрана +x301A push hl + call x2A1A ;получение текущего символа в буфере редактирования + pop hl + cp #00 + scf + jr z,x2FF8 + push af + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + pop af + cp " " + jr nz,x301A +x302F call x2A1A ;получение текущего символа в буфере редактирования + cp " " + scf + jr nz,x2FF8 + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x302F + +;АДРЕС: #303E ext+K удаление символов до наала строки +x303E call x3084 ;удаление курсора и запрет на обновление экрана +x3041 push hl + call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr nz,x3059 + call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере + jr nc,x306D + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x3041 + push hl ;!!!не используется!!! +x3059 ld a,b + cp #00 + jr z,x306D + dec b + call x2A1A ;получение текущего символа в буфере редактирования + inc b + cp #00 + jr z,x306D + dec b + call x2F12 ;удаление символа в строке в буфере редактирования + jr x3059 +x306D pop hl +x306E scf + jp x2FF8 + +;АДРЕС: #3072 ext+J удаление символов до конца строки +x3072 call x3084 ;удаление курсора и запрет на обновление экрана +x3075 call x2A1A ;получение текущего символа в буфере редактирования + cp #00 + scf + jr z,x306E + push hl + call x2F12 ;удаление символа в строке в буфере редактирования + pop hl + jr x3075 + +;АДРЕС: #3084 удаление курсора и запрет на обновление экрана +x3084 ld hl,#EC0D + res 0,(hl) + call x29EC ;удаление курсора, восстановление атрибутов + ld hl,#EEF5 + set 2,(hl) + ld hl,#F6F1 + ret + +;АДРЕС: #3095 проверка наличия предыдущего символа в буфере +x3095 call x30B4 ;расчет адреса начала строки в буфере редактирования + ld hl,#0020 + add hl,de + bit 0,(hl) + jr z,x30AE + ld a,b + cp #00 + jr z,x30B2 + dec b + call x2A1A ;получение текущего символа в буфере редактирования + inc b + cp #00 + jr z,x30B2 +x30AE ld a,#01 + or a + ret +x30B2 xor a + ret + +;АДРЕС: #30B4 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x30B4 ld hl,#EC16 ;буфер редактируемой строки +x30B7 push af + ld a,c + ld de,#0023 +x30BC or a + jr z,x30C3 + add hl,de + dec a + jr x30BC +x30C3 ex de,hl + pop af + ret + +;АДРЕС: #30C6 !!!NOT USED!!! +x30C6 push de + call x30B4 + ld h,#00 + ld l,b + add hl,de + pop de + ret + +;АДРЕС: #30D0 параметры для установки буфера редактирования строки внизу экрана +x30D0 db #05 + db #00 + dw #0000 + dw #F6F8 + +;АДРЕС: #30D6 установка буфера редактирования внизу экрана +x30D6 ld hl,x30D0 + ld de,#F6F5 + jp x3FBA + +;АДРЕС: #30DF сдвиг строк в буфере редактирования вверх +x30DF push bc + push de + ld hl,#F6F5 ;колво строк в буфере редактирования + push hl + ld a,(hl) ;кол-во строк в буфере редактирования + or a + jr nz,x3101 + push hl + call x335F ;копирование процедур в ram + ld hl,(#F9D7) ;номер строки в редактируемой строке программы + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + jr nc,x30F8 ;строка не существует + ld (#F9D7),hl ;сохраним номер строки +x30F8 ld b,h + ld c,l + pop hl + call x32D6 ;копирование строки программы в буфер редактирования + dec a + jr x3116 +x3101 ld hl,#EC0D ;сдвиг всех строк вверх + res 0,(hl) + ld hl,#F6F8 + ld d,h + ld e,l + ld bc,#0023 + add hl,bc + ld bc,#02BC + ldir + dec a + scf +x3116 pop de + ld (de),a + ld hl,#F6F8 + pop de + pop bc + ret + +;АДРЕС: #311E сдвиг строк в буфере редактирования вниз +;вх: de - адрес последней строки в буфере редактирования +;вых: cy=0 буфер переполнен +; a - количество строк в буфере редактирования +; hl - fдрес первой строки в буфере редактирования +x311E push bc + push de + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #11 + jr nz,x313F ;это не первая строка + push hl + push de + inc hl + ld d,(hl) + inc hl + ld e,(hl) ;de номер строки бейсик программы + push de + call x335F ;копирование процедур в ram + pop hl + call x334A ;поиск адреса строки бейсик программы + jr nc,x313D ;строка не существует + ld (#F9D7),hl +x313D pop de + pop hl +x313F bit 0,(hl) + ld hl,#F6F5 + push hl + jr z,x314C ;это не первая строка в буфере + ld a,#00 + scf + jr x3116 +x314C ld a,(hl) + cp #14 + jr z,x3116 ;это конец буфера + ld bc,#0023 + ld hl,#F6F8 + ex de,hl + ldir + ld hl,#F9D6 + ld d,h + ld e,l + ld bc,#0023 + or a + sbc hl,bc + ld bc,#02BC + lddr + inc a + scf + jr x3116 + +;АДРЕС: #316E вставка символа в нижний буфер редактирования +;вх: hl - адрес флага текущей строки +; a - код символа для вставки в буфер +x316E push bc + push de + push af + ld b,#00 + ld c,#01 + push hl + call x31C3 ;расчет адреса начала строки в буфере редактирования + pop hl + bit 3,(hl) + res 3,(hl) + jr nz,x31A0 +x3180 call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop af +x3184 call x16AC ;вставка символа в строку буфера редактирования + jr z,x31BA + push af + ld b,#00 + inc c + ld a,c + cp #15 + jr c,x31A0 + dec hl + ld a,(hl) + inc hl + cp #00 + jr z,x31A0 + push hl + ld hl,#EC0D + set 0,(hl) ;буфер заполнен + pop hl +x31A0 bit 1,(hl) + set 1,(hl) + res 3,(hl) + call x31C3 ;расчет адреса начала строки в буфере редактирования + jr nz,x3180 + push bc + push de + call x35E6 ;зануление до конца строки в буфере редактирования + ld (hl),#08 + pop de + pop bc + call x35F4 ;создание отступа в строке в буфере редактирования + pop af + jr x3184 +x31BA ld a,c + ld (#F6F5),a + set 3,(hl) + pop de + pop bc + ret + +;АДРЕС: #31C3 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x31C3 ld hl,#F6F8 + jp x30B7 + +;АДРЕС: #31C9 удаление символа в нижнем буфере редактирования +x31C9 push bc + push de + ld hl,#EC0D + res 0,(hl) + ld a,(#F6F5) + ld c,a + or a + ld a,#00 + jr z,x321B +x31D9 call x31C3 ;расчет адреса начала строки в буфере редактирования + push af + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + jr nc,x31F2 + pop af + call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево + push af + push bc + ld b,#00 + call x2E41 ;поиск в строке вправо от курсора редактируемого символа + pop bc + jr c,x3216 +x31F2 inc hl + ld a,(hl) + push af + push bc + ld a,c + cp #01 + jr nz,x3204 + ld a,(#EC15) + ld c,a + call x30B4 ;расчет адреса начала строки в буфере редактирования + jr x3208 +x3204 dec c + call x31C3 ;расчет адреса начала строки в буфере редактирования +x3208 pop bc + pop af + ld hl,#0020 + add hl,de + res 1,(hl) + or (hl) + ld (hl),a + ld hl,#F6F5 + dec (hl) +x3216 pop af + dec c + jr nz,x31D9 + scf +x321B pop de + pop bc + ret + +;АДРЕС: #321E параметры для установки буфера редактирования строки вверху экрана +x321E db #03 + db #00: dw #F9DE + +;АДРЕС: #3222 установка буфера редактирования в верху экрана +x3222 ld hl,x321E + ld de,#F9DB + jp x3FBA + +;АДРЕС: #322B перемещение курсора вверх в верхнем буфере редактирования +x322B push bc + push de + ld hl,#F9DB + push hl + ld a,(hl) + or a + jr nz,x3253 + push hl + call x335F ;копирование процедур в ram + ld hl,(#FC9A) + call x334A ;поиск адреса строки бейсик программы + jr nc,x3244 + ld (#FC9A),hl +x3244 ld b,h + ld c,l + pop hl + inc hl + inc hl + inc hl + jr nc,x325D ;!!!ОШИБКА!!! + call x32D6 ;копирование строки программы в буфер редактирования + dec a + ex de,hl + jr x325D +x3253 ld hl,(#F9DC) + ld bc,#0023 + sbc hl,bc + scf + dec a +x325D ex de,hl + pop hl + jr nc,x3262 + ld (hl),a +x3262 inc hl + ld (hl),e + inc hl + ld (hl),d + ex de,hl + pop de + pop bc + ret + +;АДРЕС: #326A копирование строки бейсик программы в буфер редактирования вверзу экрана +x326A push bc + push de + ld hl,#0020 + add hl,de + ld a,(hl) + cpl + and #11 + jr nz,x3282 + push de + push hl + inc hl + ld d,(hl) + inc hl + ld e,(hl) + ld (#FC9A),de + pop hl + pop de +x3282 bit 3,(hl) + ld hl,#F9DB + push hl + jr z,x32A0 + push hl + call x335F ;копирование процедур в ram + ld hl,(#FC9A) + call x3352 ;преобразование номера строки в ASCII и помещение в буфер + ld (#FC9A),hl + pop hl + inc hl + inc hl + inc hl + ld a,#00 + scf + jr x325D +x32A0 ld a,(hl) + cp #14 + jr z,x32B3 + inc a + ld hl,(#F9DC) + ld bc,#0023 + ex de,hl + ldir + ex de,hl + scf + jr x325D +x32B3 pop hl + pop de + pop bc + ret + +;АДРЕС: #32B7 расчет адреса начала строки в буфере редактирования +;вх: c - номер строки +;вых: de - адрес начала строки +x32B7 ld hl,#F9DE + jp x30B7 + +;АДРЕС: #32DB таблица обработки управляющих кодов при редактировании строки +x32BD db #08 ;всего функций + db #0D: dw x35CC ;enter + db #01: dw x35DA ;null + db #12: dw x335A ;flash + db #13: dw x335A ;bright + db #14: dw x335A ;inverse + db #15: dw x335A ;over + db #10: dw x335A ;ink + db #11: dw x335A ;paper + +;АДРЕС: #32D6 копирование строки программы в буфер редактирования +;вх: hl - адрес флагов предыдущей строки в буфере редактирования +; bc - номер редактируемой строки в буфере редактирования +;вых: a - количество строк в буфере редактирования +; hl - адрес первой строки +; de - адрес последней строки +x32D6 ld d,h + ld e,l + inc de + inc de + inc de ;адрес редактируемой строки в буфере редактирования + push de + ld hl,#0020 + add hl,de ;адрес флагов редактируемой строки + ld (hl),#01 ;первая строка + inc hl + ld (hl),b + inc hl + ld (hl),c ;номер строки + ld c,#01 ;строка 1 + ld b,#00 ;колонка 0 +x32EA push bc + push de + ld a,(#EC0E) + cp #04 ;это режим калькулятора + call nz,x3517 ;нет. преобразование токена в текст + pop de + pop bc + jr c,x3307 ;токен преобразован + ld a,c + cp #01 + ld a,#0D + jr nz,x3307 ;это не 'enter' + ld a,b + or a + ld a,#01 + jr z,x3307 + ld a,#0D +x3307 ld hl,x32BD + call x3FCE ;обработка управляющего кода + jr c,x332C ;код обработан + jr z,x32EA ;следующий символ + push af + ld a,#1F + cp b + jr nc,x3326 + ld a,#12 + call x3331 ;перенос части строки на следующую строку + jr c,x3323 + pop af + ld a,#0D + jr x3307 +x3323 call x35F4 ;создание отступа в строке в буфере редактирования +x3326 pop af + call x35C5 ;сохранить символ в указанном столбце текущей строки буфера редактирования + jr x32EA +x332C pop hl + ld a,c + ret z + scf + ret + +;АДРЕС: #3331 перенос части строки на следующую строку +;вх: de - адрес начала строки в буфере редактирования строки +; b - номер столбца +; c - номер строки +; a - новое значение байта флага +;вых: cy=0 - нижняя строка в буфере +; hl - адрес байта флага для новой строки +x3331 push af + call x35E6 ;зануление до конца строки в буфере редактирования + pop af + xor (hl) + ld (hl),a + ld a,c + cp #14 + ret nc + inc c + ld hl,#0023 + add hl,de + ex de,hl + ld hl,#0020 + add hl,de + ld (hl),#00 + scf + ret + +;АДРЕС: #334A поиск адреса строки бейсик программы +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес первой команды в строке +x334A call x34B6 ;поиск адреса строки программы с заданным номером + ret c + ld hl,#0000 + ret + +;АДРЕС: #3352 преобразование номера строки в ASCII и помещение в буфер +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес начала команд в строке +; hl - номер строки (=#0000 строка не существует) +x3352 call x3430 ;преобразование номера строки в ASCII и помещение в буфер + ret c + ld hl,#0000 + ret + +;АДРЕС: #335A преобразование токена в текст +;вых: cy=0 токен преобразован +x335A call x3517 ;преобразование токена в текст + ccf + ret nc ;!!!ОШИБКА!!! должно быть ret??? + +;АДРЕС: #335F копирование процедур в ram +x335F ld hl,#0000 + ld (#FC9F),hl ;адрес следующего символа в строке бейсик программы + ld (#FCA1),hl ;адрес следующего символа в буфере ключевго слова + ld hl,x3374 + ld de,#FCAE + ld bc,#00BC + ldir + ret + +;АДРЕС: #3374 копирование токена в буфер токенов (=#FCAE) +;вх: a - номер токена -#A5 +; de - адрес в буфере +x3374 di + ld bc,#7FFD + ld d,#17 ;rom 0, ram 7, scr 5 + out (c),d + cp #50 + jr nc,x33B1 ;токен =>#F5 + cp #40 + jr nc,x33AA ;токен =>#E5 + cp #30 + jr nc,x33A3 ;токен =>#D5 + cp #20 + jr nc,x339C ;токен =>#C5 + cp #10 + jr nc,x3395 ;токен =>#B5 + ld hl,Rom1.x0095+#01 + jr x33B6 +x3395 sub #10 + ld hl,Rom1.x0095+#3A + jr x33B6 +x339C sub #20 + ld hl,Rom1.x0095+#6B + jr x33B6 +x33A3 sub #30 + ld hl,Rom1.x0095+#A9 + jr x33B6 +x33AA sub #40 + ld hl,Rom1.x0095+#F6 + jr x33B6 +x33B1 sub #50 + ld hl,Rom1.x0095+#13F +x33B6 ld b,a + or a +x33B8 jr z,x33C3 +x33BA ld a,(hl) + inc hl + and #80 + jr z,x33BA + dec b + jr x33B8 + +;АДРЕС: #33C3 копирование токена (=#FCFD) +;вх: - адрес токена в rom 1 +x33C3 ld de,#FCA3 + ld (#FCA1),de + ld a,(#FC9E) + or a + ld a,#00 + ld (#FC9E),a + jr nz,x33D9 + ld a," " + ld (de),a + inc de +x33D9 ld a,(hl) + ld b,a + inc hl + ld (de),a + inc de + and #80 + jr z,x33D9 + ld a,b + and #7F + dec de + ld (de),a + inc de + ld a," "+#80 + ld (de),a + ld a,#07 ;rom 0, ram 7, scr 5 + ld bc,#7FFD + out (c),a + ei + ret + +;АДРЕС: #33F4 распознавание токена (=#FD2E) +;вых: cy=1 токен найден -> a - код токена +x33F4 di + ld bc,#7FFD + ld d,#17 ;rom 0, ram 7, scr 5 + out (c),d + ld hl,Rom1.x0095+#01 + ld b,#A5 +x3401 ld de,#FD74 ;адрес слова +x3404 ld a,(de) + and #7F + cp #61 + ld a,(de) + jr c,x340E + and #DF ;в верхний регистр +x340E cp (hl) + jr nz,x341A ;не совпадает + inc hl + inc de + and #80 + jr z,x3404 ;совпадает, следующий символ + scf + jr x3426 ;токен найден +x341A inc b + jr z,x3425 +x341D ld a,(hl) ;ищем следующий токен + and #80 + inc hl + jr z,x341D + jr x3401 +x3425 or a +x3426 ld a,b + ld d,#07 ;rom 0, ram 7, scr 5 + ld bc,#7FFD + out (c),d + ei + ret + +;АДРЕС: #3430 преобразование номера строки в ASCII и помещение в буфер +;вх: hl - номер строки +;вых: cy=1 строка существует +; de - адрес начала команд в строке +; hl - номер строки +x3430 call x34EA ;обнуление указателей в бейсик строке + or a ;!!!ОШИБКА!!! должно быть xor a + ld (#FC9E),a + call x1F20 ;установка другого стэка и ram 0 + call x34F6 ;поиск адрес строки бейсик программы в памяти + jr nc,x3491 ;строка не найдена + jr nz,x344D ;строка не найдена, но есть следующая + ld a,b + or c + jr z,x344D ;это первая строки программы + call x34CF ;расчет адреса следущей строки бейсик программы + call x34D9 ;проверка на конец бейсик программы + jr nc,x3491 ;это последняя строка программы +x344D ld d,(hl) + inc hl + ld e,(hl) ;de - номер строки + call x1F45 ;установка другого стэка и ram 7 + push de + push hl + push ix + ld ix,#FCA3 ;буфер токена + ld (#FCA1),ix + ex de,hl + ld b,#00 + ld de,-1000 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-100 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-10 + call x3495 ;выделение разряда числа и занесение его в буфер + ld de,-1 + call x3495 ;выделение разряда числа и занесение его в буфер + dec ix ;!!!можно оптимизировать set 7,(ix-1) + ld a,(ix+#00) ;!!!можно оптимизировать + or #80 ;!!!можно оптимизировать + ld (ix+#00),a ;!!!можно оптимизировать + pop ix + pop hl + pop de + inc hl + inc hl + inc hl + ld (#FC9F),hl + ex de,hl + scf + ret +x3491 call x1F45 ;установка другого стэка и ram 7 + ret + +;АДРЕС: #3495 выделение разряда числа и занесение его в буфер +;вх: de - делитель +; hl - номер строки +; ix - адрес в буфере для записи номера строки в ASCII +; b =#00 старший разряд числа еще не найден +;вых: ix - следующий адрес в буфере +; b =#01 старший разряд числа найден +x3495 xor a +x3496 add hl,de + inc a + jr c,x3496 + sbc hl,de + dec a + add a,#30 + ld (ix+#00),a + cp "0" + jr nz,x34B1 + ld a,b + or a + jr nz,x34B3 + ld a,#00 + ld (ix+#00),a + jr x34B3 +x34B1 ld b,#01 +x34B3 inc ix + ret + +;АДРЕС: #34B6 поиск адрес строки программы с заданным номером или следущей +; строки, если строка с заданным номером не существует +;вх: hl - номер строки +;вых: cy=1 строка найдена +; de - адрес начала команд в строке +; hl - номер строки +x34B6 call x34EA ;обнуление указателей в бейсик строке + or a ;!!!ОШИБКА!!! должно быть xor a + ld (#FC9E),a + call x1F20 ;установка другого стэка и ram 0 + call x34F6 ;поиск адрес строки бейсик программы в памяти + jr nc,x3491 ;строка не существует + ex de,hl + ld a,l + or h + scf + jp nz,x344D + ccf + jr x3491 + +;АДРЕС: #34CF расчет адреса следущей строки бейсик программы +;вх: hl - адрес текущей строки +;вых: de - адрес текущей строки +; hl - адрес следующей строки +x34CF push hl + inc hl + inc hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl + add hl,de + pop de + ret + +;АДРЕС: #34D9 проверка на конец бейсик программы +;вх: hl - адрес в строке +;вых: cy=0 - это конец строки +x34D9 ld a,(hl) + and #C0 + scf + ret z + ccf + ret + +;АДРЕС: #34E0 сравнение номера строки с заданным +;вх: hl - адрес номера строки в бейсик программе +; bc - номер строки +;вых: z, cy=1 - строка найдена +; nz, cy=1 - bc<(hl) +; nz, cy=0 - bc>(hl) +x34E0 ld a,b + cp (hl) + ret nz + ld a,c + inc hl + cp (hl) + dec hl + ret nz + scf + ret + +;АДРЕС: #34EA обнуление указателей в бейсик строке +x34EA push hl + ld hl,#0000 + ld (#FCA1),hl + ld (#FC9F),hl + pop hl + ret + +;АДРЕС: #34F6 поиск адрес строки бейсик программы в памяти +;вх: hl - номер строки (=#0000 первая строка) +;вых: cy=1 - искомая или следующая строка существует +; nz - строка не найдена +; hl - адрес строки программы (=#0000 строка не существует) +; de - адрес предыдущей строки программы (=#0000 строка не существует) +; bc - номер строки (=#0000 первая строка) +x34F6 push hl + pop bc + ld de,#0000 + ld hl,(#5C53) + call x34D9 ;проверка на конец бейсик программы + ret nc ;конец программы + call x34E0 ;сравнение номера строки с заданным + ret c + ld a,b + or c + scf + ret z ;нужна первая строка +x350A call x34CF ;расчет адреса следущей строки бейсик программы + call x34D9 ;проверка на конец бейсик программы + ret nc ;это конец программы + call x34E0 ;сравнение номера строки с заданным + jr nc,x350A ;не та строка, ищем дальше + ret + +;АДРЕС: #3517 преобразование токена в текст +;вых: cy=1 токен преобразован +x3517 ld hl,(#FCA1) ;адрес следующего символа + ld a,l + or h + jr z,x353C ;нет символа + ld a,(hl) + inc hl + cp " "+#80 + ld b,a + ld a,#00 + jr nz,x3529 ;не последний символ + ld a,#FF +x3529 ld (#FC9E),a ;флаг + ld a,b + bit 7,a + jr z,x3534 ;не последний символ +x3531 ld hl,#0000 +x3534 ld (#FCA1),hl + and #7F + jp x358F +x353C ld hl,(#FC9F) + ld a,l + or h + jp z,x3591 ;больше нечего обрабатывать + call x1F20 ;установка другого стэка и ram 0 +x3547 ld a,(hl) + cp #0E + jr nz,x3554 ;это не число с плавающей точкой + inc hl + inc hl + inc hl + inc hl + inc hl + inc hl + jr x3547 +x3554 call x1F45 ;установка другого стэка и ram 7 + inc hl + ld (#FC9F),hl + cp #A5 ;'RND' + jr c,x3567 ;не токен basic48 + sub #A5 ;!!!ОШИБКА + call #FCAE ;x335F копирование токена в буфер + jp x3517 +x3567 cp #A3 ;токены basic128: SPECTRUM или PLAY + jr c,x357B + jr nz,x3572 ;PLAY + ld hl,x3594 + jr x3575 +x3572 ld hl,x359C ;SPECTRUM +x3575 call #FCFD ;x33C3 копирование токена + jp x3517 +x357B push af + ld a,#00 + ld (#FC9E),a + pop af + cp #0D + jr nz,x358F + ld hl,#0000 ;конец строки + ld (#FCA1),hl + ld (#FC9F),hl +x358F scf + ret +x3591 scf + ccf + ret + +;АДРЕС: #3594 токены basic128 +x3594 dc "SPECTRUM" +x359C dc "PLAY" +x35A0 dc "GOTO" +x35A4 dc "GOSUB" +x35A9 dc "DEFFN" +x35AE dc "OPEN#" +x35B3 dc "CLOSE#" + +;АДРЕС: #35BC установка параметров отступа +x35B9 db #02 + db #01,#05 +x35BC ld hl,x35B9 + ld de,#FD6A + jp x3FBA + +;АДРЕС: #35C5 сохранить символ в указанном столбце текущей строки буфера редактирования +;вх: b - номер столбца +; de - начальный адрес строки +; a - код символа +;вых: b - номер следующего столбца +x35C5 ld l,b + ld h,#00 + add hl,de + ld (hl),a + inc b + ret + +;АДРЕС: #35CC процедура обработки нажатия 'enter' в строке +;вых: cy=1 +x35CC call x35E6 ;зануление до конца строки в буфере редактирования + ld a,(hl) + or #18 + ld (hl),a + ld hl,#FD6A + set 0,(hl) + scf + ret + +;АДРЕС: #35DA процедура обработки зануления до конца строки +;вых: cy=1 +x35DA call x35E6 ;зануление до конца строки в буфере редактирования + set 3,(hl) + ld hl,#FD6A ;!!!можно сократить jr x35CC+nn + set 0,(hl) + scf + ret + +;АДРЕС: #35E6 зануление до конца строки в буфере редактирования +;вх: b - номер первого столбца +; de - адрес начала строки редактирования +;вых: hl - адрес байта флага строки +x35E6 ld l,b + ld h,#00 + add hl,de + ld a," " +x35EC cp b + ret z + ld (hl),#00 + inc hl + inc b + jr x35EC + +;АДРЕС: #35F4 создание отступа в строке в буфере редактирования +;вх: de - адрес строки в буфере редактирования +;вых: b - первый используемый номер столбца в строке +x35F4 ld a,(#FD6B) + ld b,#00 +x35F9 ld h,#00 + ld l,b + add hl,de + ld (hl),#00 + inc b + dec a + jr nz,x35F9 + ret + +;АДРЕС: #3604 печать строки редактируемого буфера, при необходимости +x3604 push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x3614 ;обновлять экран не надо + ld b,c + call x3B1E ;печать строки редактируемого буфера +x3614 pop hl + pop de + pop bc + ret + +;АДРЕС: #3618 сдвиг вверх строк в буфере редактирования при необходимости +;вх: hl - адрес первой строки в буфере +; c - количество строк +; b - номер строки от которой будет сдвиг +x3618 push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x3628 + ld e,c + call x3ABF ;сдвиг вверх строк в буфере редактирования +x3628 pop hl + pop de + pop bc + ret + +;АДРЕС: #362C сдвиг вниз строк в буфере редактирования при необходимости +;вх: hl - адрес первой строки в буфере +; c - количество строк +; b - номер строки от которой будет сдвиг +x362C push bc + push de + push hl + push hl + ld hl,#EEF5 + bit 2,(hl) + pop hl + jr nz,x363C + ld e,c + call x3AC6 ;сдвиг вниз строк в буфере редактирования +x363C pop hl + pop de + pop bc + ret + +;АДРЕС: #3640 печать атрибутов курсора +;вх: c - номер строки +; b - номер столбца +x3640 push af + push bc + push de + push hl + ld a,b + ld b,c + ld c,a + call x3A9D ;печать атрибутов курсора + pop hl + pop de + pop bc + pop af + ret + +;АДРЕС: #364F восстановление атрибутов под курсором +;вх: c - crd Y, b - crd X +x364F push af + push bc + push de + push hl + ld a,b + ld b,c + ld c,a + call x3AB2 ;восстановление атрибутов под курсором + pop hl + pop de + pop bc + pop af + ret + +;АДРЕС: #365E установка переменных для ввода символа +x365E ld a,#00 + ld (#5C41),a ;Число, определяющее режим ввода с клавиатуры + ld a,#02 + ld (#5C0A),a ;Период автоповтора +x3668 ld hl,#5C3B + ld a,(hl) + or #0C + ld (hl),a ;ввод символа + ld hl,#EC0D + bit 4,(hl) + ld hl,x5B66 + jr nz,x367C + res 0,(hl) + ret +x367C set 0,(hl) + ret + +;АДРЕС: #367F ожидание нажатия клавиши +;вых: a - код клавиши +x367F push hl +x3680 ld hl,#5C3B +x3683 bit 5,(hl) + jr z,x3683 ;клавиша не нажата + res 5,(hl) + ld a,(#5C08) ;Код нажатой клавиши + ld hl,#5C41 + res 0,(hl) + cp #20 + jr nc,x36A2 ;символьная клавиша + cp #10 + jr nc,x3680 ;нет реакции + cp #06 + jr c,x3680 + call x36A4 + jr nc,x3680 +x36A2 pop hl + ret +x36A4 rst #28 ;вызов п/п из basic 48 + dw Rom1.x10DB ;обработка кода клавиши + ret + +;АДРЕС: #36A8 печать меню basic 128k +;вх: hl - адрес описания меню +x36A8 push hl + call x373B ;сохранение окна экрана 14*12 в буфере + ld hl,#5C3C + res 0,(hl) + pop hl + ld e,(hl) + inc hl + push hl + ld hl,x37EC ;управляющие коды для печати меню + call x3733 ;печать строки из hl + pop hl + call x3733 + push hl + call x3822 ;печать эмблемы ZX (косые цветные полосы) в меню + ld hl,x37FA ;управляющие коды для печати меню + call x3733 ;печать строки из hl + pop hl +;печать строчек меню + push de + ld bc,#0807 + call x372B ;установка координат печати из bc +x36D1 push bc + ld b,#0C + ld a,#20 + rst #10 ;пробел +x36D7 ld a,(hl) ;печать строчки меню + inc hl + cp #80 + jr nc,x36E0 + rst #10 + djnz x36D7 +x36E0 and #7F + rst #10 +x36E3 ld a,#20 ;дополняем пробелами + rst #10 + djnz x36E3 + pop bc + inc b + call x372B ;установка координат печати из bc + dec e + jr nz,x36D1 + ld hl,#6F38 + pop de +;печать рамки вокруг меню + sla e + sla e + sla e + ld d,e + dec d + ld e,#6F + ld bc,#FF00 + ld a,d + call x3719 ;печать одной линии вокруг меню + ld bc,#0001 + ld a,e + call x3719 ;печать одной линии вокруг меню + ld bc,#0100 + ld a,d + inc a + call x3719 ;печать одной линии вокруг меню + xor a + call x37CA ;атрибутов опции меню + ret + +;АДРЕС: #3719 печать одной линии вокруг меню +;вх: hl - координаты +; bc - приращение координат +x3719 push af + push hl + push de + push bc + ld b,h + ld c,l + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x22E9 ;печать точки + pop bc + pop de + pop hl + pop af + add hl,bc + dec a + jr nz,x3719 + ret + +;АДРЕС: #372B установка координат печати из bc +;вх: bc - координаты печати +x372B ld a,#16 + rst #10 + ld a,b + rst #10 + ld a,c + rst #10 + ret + +;АДРЕС: #3733 печать строки из hl +;вх: hl - адрес строки +x3733 ld a,(hl) + inc hl + cp #FF + ret z + rst #10 ;печать символа из A + jr x3733 + +;АДРЕС: #373B сохранение окна экрана 14*12 в буфере +x373B scf + jr x373F + +;АДРЕС: #373E восстановление окна экрана 14*12 из буфера +x373E and a +x373F ld de,#EEF6 + ld hl,#5C3C + jr c,x3748 + ex de,hl +x3748 ldi + jr c,x374D + ex de,hl +x374D ld hl,#5C7D ;Координаты X и Y последней изображенной на экране точки + jr c,x3753 + ex de,hl +x3753 ld bc,#0014 + ldir + jr c,x375B + ex de,hl +x375B ex af,af' + ld bc,#0707 + call x3B94 + ld a,(ix+#01) + add a,b + ld b,a + ld a,#0C +x3769 push bc + push af + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ld bc,#0007 + add hl,bc + pop de + call x377E ;сохранение/восстановление 14 знакомест экана в буфере + pop af + pop bc + dec b + dec a + jr nz,x3769 + ret + +;АДРЕС: #377E сохранение/восстановление 14 знакомест экана в буфере +;вх: cy' =1 сохранение части экрана в буфере +; =0 восстановление части экрана из буфера +; hl - адрес на экране +; de - адрес в буфере +x377E ld bc,#080E +x3781 push bc + ld b,#00 + push hl + ex af,af' + jr c,x3789 + ex de,hl +x3789 ldir + jr c,x378E + ex de,hl +x378E ex af,af' + pop hl + inc h + pop bc + djnz x3781 + push bc + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + pop de + pop bc + ex af,af' + jr c,x37A0 + ex de,hl +x37A0 ldir + jr c,x37A5 + ex de,hl +x37A5 ex af,af' + ret + +;АДРЕС: #37A7 клавиша вверх в меню basic128 +;вх: a - номер опции +; hl - адрес списка опций меню +x37A7 call x37CA ;инвертирование атрибутов опции меню + dec a + jp p,x37B1 + ld a,(hl) + dec a + dec a +x37B1 call x37CA ;инвертирование атрибутов опции меню + scf + ret + +;АДРЕС: #37B6 клавиша вниз в меню basic128 +;вх: a - номер опции +; hl - адрес списка опций меню +x37B6 push de + call x37CA ;инвертирование атрибутов опции меню + inc a + ld d,a + ld a,(hl) + dec a + dec a + cp d + ld a,d + jp p,x37C5 + xor a +x37C5 call x37CA ;инвертирование атрибутов опции меню + pop de + ret + +;АДРЕС: #37CA инвертирование атрибутов опции меню +;вх: a - номер опции +x37CA push af + push hl + push de + ld hl,#5907 + ld de,#0020 + and a + jr z,x37DA +x37D6 add hl,de + dec a + jr nz,x37D6 +x37DA ld a,%01111000 ;bright 1, paper 7, ink 0 + cp (hl) + jr nz,x37E1 + ld a,%01101000 ;bright 1, paper 5, ink 0 +;печать атрибутов опции +x37E1 ld d,#0E +x37E3 ld (hl),a + inc hl + dec d + jr nz,x37E3 + pop de + pop hl + pop af + ret + +;АДРЕС: #37EC управляющие коды для печати меню +x37EC db #16,#07,#07 ;координаты + db #15,#00 ;over 0 + db #14,#00 ;inverse 0 + db #10,#07 ;ink 7 + db #11,#00 ;paper 0 + db #13,#01 ;bright 1 + db #FF + +;АДРЕС: #37FA управляющие коды для печати меню +x37FA db #11,#00,#20 ;paper 0 + db #11,#07 ;paper 7 + db #10,#00 ;ink 0 + db #FF + +;АДРЕС: #3802 данные потоков для печати эмблемы +x3802 db #01,#03,#07,#0F,#1F,#3F,#7F,#FF + db #FE,#FC,#F8,#F0,#E0,#C0,#80,#00 + +;АДРЕС: #3812 управляющие коды для печати косых полос в меню +x3812 db #10,#02,#20 ;ink 2 + db #11,#06,#21 ;paper 6 + db #10,#04,#20 ;ink 4 + db #11,#05,#21 ;paper 5 + db #10,#00,#20 ;ink 0 + db #FF + +;АДРЕС: #3822 печать эмблемы ZX (косые цветные полосы) в меню +x3822 push bc + push de + push hl + ld hl,x3802 + ld de,x5B98 + ld bc,#0010 + ldir + ld hl,(#5C36) + push hl + ld hl,#5A98 + ld (#5C36),hl + ld hl,x3812 ;управляющие коды для печати косых полос в меню + call x3733 ;печать строки из hl + pop hl + ld (#5C36),hl + pop hl + pop de + pop bc + ret + +;АДРЕС: #3848 печать информационной строки 128 BASIC +x3848 ld hl,x2768 + jr x385A + +;АДРЕС: #384D печать информационной строки Calculator +x384D ld hl,x2771 + jr x385A + +;АДРЕС: #3852 печать информационной строки 48 TR-DOS +x3852 ld hl,x2783 + jr x385A + +;АДРЕС: #3857 печать информационной строки 128 TR-DOS +x3857 ld hl,x275E ;сообщение "128 TR-DOS" +x385A push hl + call x3881 ;очистка двух нижних строк экрана + ld hl,#5AA0 ;установка атрибутов в строке + ld b,#20 + ld a,#40 ;bright 1, paper 0, ink 0 +x3865 ld (hl),a + inc hl + djnz x3865 + ld hl,x37EC ;управляющие коды для печати меню + call x3733 ;печать строки из hl + ld bc,#1500 + call x372B ;установка координат печати из bc + pop de + call x057D ;печать строки из de + ld c,#1A + call x372B ;установка координат печати из bc + jp x3822 ;печать эмблемы ZX (косые цветные полосы) в меню + +;АДРЕС: #3881 очистка двух нижних строк экрана +x3881 ld b,#15 + ld d,#17 + jp x3B5E + +;АДРЕС: #3888 перенумерация строк программы +x3888 call x1F20 ;установка другого стэка и ram 0 + call x3A05 ;подсчет количества строк в бейсик программе + ld a,d + or e + jp z,x39C0 + ld hl,(x5B96) + rst #28 ;!!!ОШИБКА!!! + dw Rom1.x30A9 ;hl=hl*de + ex de,hl + ld hl,(x5B94) + add hl,de + ld de,10000 + or a + sbc hl,de + jp nc,x39C0 + ld hl,(#5C53) +x38AA rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + inc hl + inc hl + ld (x5B92),hl + inc hl + inc hl + ld (x5B67+4),de +x38B8 ld a,(hl) + rst #28 + dw Rom1.x18B6 ;пропуск натурального числа + cp #0D + jr z,x38C5 + call x390E ;анализ строки и перенумерование ссылок на номера строк + jr x38B8 +x38C5 ld de,(x5B67+4) + ld hl,(#5C4B) + and a + sbc hl,de + ex de,hl + jr nz,x38AA +x38D2 call x3A05 ;подсчет количества строк в бейсик программе + ld b,d + ld c,e + ld de,#0000 + ld hl,(#5C53) +x38DD push bc + push de + push hl + ld hl,(x5B96) + rst #28 + dw Rom1.x30A9 ;hl=hl*de + ld de,(x5B94) + add hl,de + ex de,hl + pop hl + ld (hl),d + inc hl + ld (hl),e + inc hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + add hl,bc + pop de + inc de + pop bc + dec bc + ld a,b + or c + jr nz,x38DD + call x1F45 ;установка другого стэка и ram 7 + ld (x5B92),bc + scf + ret + +;токены, использующие ссылки на строки +x3907 db #CA ;LINE + db #F0 ;LIST + db #E1 ;LLIST + db #EC ;GO TO + db #ED ;GO SUB + db #E5 ;RESTORE + db #F7 ;RUN + +;АДРЕС: #390E анализ строки и перенумерование ссылок на номера строк +x390E inc hl + ld (x5B78+1),hl + ex de,hl + ld bc,#0007 + ld hl,x3907 +x3919 cpir + ex de,hl + ret nz + ld c,#00 +x391F ld a,(hl) + cp " " + jr z,x393F + rst #28 + dw Rom1.x2D1B ;это цифра? + jr nc,x393F + cp "." + jr z,x393F + cp #0E + jr z,x3943 + or #20 + cp "e" + jr nz,x393B + ld a,b + or c + jr nz,x393F +x393B ld hl,(x5B78+1) + ret +x393F inc bc + inc hl + jr x391F +x3943 ld (x5B71),bc + push hl + rst #28 + dw Rom1.x18B6 ;пропуск натурального числа + call x3A36 ;пропуск пробелов в строке + ld a,(hl) + pop hl + cp ":" + jr z,x3957 + cp #0D + ret nz +x3957 inc hl + rst #28 + dw Rom1.x33B4 ;поместить число на смэк калькулятора + rst #28 + dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора + ld h,b + ld l,c + rst #28 + dw Rom1.x196E ;получить начальный адрес строки программы + jr z,x396F + ld a,(hl) + cp #80 + jr nz,x396F + ld hl,#270F ;9999 + jr x3980 +x396F ld (x5B76+1),hl + call x3A0B ;подсчет количества строк + ld hl,(x5B96) + rst #28 + dw Rom1.x30A9 ;hl=hl*de + ld de,(x5B94) + add hl,de +x3980 ld de,x5B72+1 + push hl + call x3A3C ;номер строки в ASCII + ld e,b + inc e + ld d,#00 + push de + push hl + ld l,e + ld h,#00 + ld bc,(x5B71) + or a + sbc hl,bc + ld (x5B71),hl + jr z,x39CF + jr c,x39C5 + ld b,h + ld c,l + ld hl,(x5B78+1) + push hl + push de + ld hl,(#5C65) + add hl,bc + jr c,x39BE + ex de,hl + ld hl,#0082 + add hl,de + jr c,x39BE + sbc hl,sp + ccf + jr c,x39BE + pop de + pop hl + rst #28 + dw Rom1.x1655 ;резервирование места (длина в bc) + jr x39CF +x39BE pop de + pop hl +x39C0 call x1F45 ;установка другого стэка и ram 7 + and a + ret +x39C5 dec bc + dec e + jr nz,x39C5 + ld hl,(x5B78+1) + rst #28 + dw Rom1.x19E8 ;удалить массив DIM +x39CF ld de,(x5B78+1) + pop hl + pop bc + ldir + ex de,hl + ld (hl),#0E + pop bc + inc hl + push hl + rst #28 + dw Rom1.x2D2B ;bc на стэк калькулятора + pop de + ld bc,#0005 + ldir + ex de,hl + push hl + ld hl,(x5B92) + push hl + ld e,(hl) + inc hl + ld d,(hl) + ld hl,(x5B71) + add hl,de + ex de,hl + pop hl + ld (hl),e + inc hl + ld (hl),d + ld hl,(x5B67+4) + ld de,(x5B71) + add hl,de + ld (x5B67+4),hl + pop hl + ret + +;АДРЕС: #3A05 подсчет количества строк в бейсик программе +x3A05 ld hl,(#5C4B) + ld (x5B76+1),hl +x3A0B ld hl,(#5C53) + ld de,(x5B76+1) + or a + sbc hl,de + jr z,x3A31 + ld hl,(#5C53) + ld bc,#0000 +x3A1D push bc + rst #28 + dw Rom1.x19B8 ;поиск адрес начала следующей строки программы + ld hl,(x5B76+1) + and a + sbc hl,de + jr z,x3A2E + ex de,hl + pop bc + inc bc + jr x3A1D +x3A2E pop de + inc de + ret +x3A31 ld de,#0000 + ret + +;АДРЕС: #3A35 пропуск пробелов в строке +x3A35 inc hl +x3A36 ld a,(hl) + cp " " + jr z,x3A35 + ret + +;АДРЕС: #3A3C номер строки в ASCII +x3A3C push de + ld bc,-1000 + call x3A60 ;получить один разря числа в ASCII + ld bc,-100 + call x3A60 ;получить один разря числа в ASCII + ld c,-10 + call x3A60 ;получить один разря числа в ASCII + ld a,l + add a,"0" + ld (de),a + inc de + ld b,#03 + pop hl +x3A56 ld a,(hl) + cp "0" + ret nz + ld (hl)," " + inc hl + djnz x3A56 + ret + +;АДРЕС: #3A60 получить один разря числа в ASCII +x3A60 xor a +x3A61 add hl,bc + inc a + jr c,x3A61 + sbc hl,bc + dec a + add a,"0" + ld (de),a + inc de + ret + +;настройки курсора +x3A6D db #08 + db #00,#00,#14,#00,#00,#00,#0F,#00 + +;настройки курсора +x3A76 db #08 + db #00,#16,#01,#00,#00,#00,#0F,#00 + +;АДРЕС: #3A7F установка настроек курсора для верхнего окна +x3A7F ld ix,#FD6C + ld hl,x3A6D + jr x3A8B + +;АДРЕС: #3A88 установка настроек курсора для нижнего окна +x3A88 ld hl,x3A76 +x3A8B ld de,#FD6C + jp x3FBA + +;АДРЕС: #3A91 !!!NOT USED!!! +x3A91 rst #10 + ld a,d + rst #10 + scf + ret + +;АДРЕС: #3A96 сохранить атрибуты курсора +x3A96 and #3F + ld (ix+#06),a + scf + ret + +;АДРЕС: #3A9D печать атрибутов курсора +;вх: b - номер строки +; c - номер столбца +; ix - адрес дескриптора курсора +x3A9D ld a,(ix+#01) + add a,b + ld b,a + call x3BA0 ;расчет адреса атрибутов + ld a,(hl) + ld (ix+#07),a ;сохраним атрибуты + cpl + and #C0 + or (ix+#06) + ld (hl),a + scf + ret + +;АДРЕС: #3AB2 восстановление атрибутов под курсором +;вх: b - crd Y +; c - crd X +; ix - адрес описания курсора +x3AB2 ld a,(ix+#01) + add a,b + ld b,a + call x3BA0 ;расчет адреса атрибутов + ld a,(ix+#07) + ld (hl),a + ret + +;АДРЕС: #3ABF сдвиг вверх строк в буфере редактирования +;вх: hl - адрес первой строки в буфере +; e - количество строк +; b - номер строки от которой будет сдвиг +x3ABF push hl + ld h,#00 ;сдвиг вверх + ld a,e + sub b ;a - количество строк для сдвига + jr x3ACD + +;АДРЕС: #3AC6 сдвиг вниз строк в буфере редактирования +;вх: hl - адрес первой строки в буфере +; e - количество строк +; b - номер строки от которой будет сдвиг +x3AC6 push hl + ld a,e + ld e,b + ld b,a + sub e ;a - количество строк для сдвига + ld h,#FF ;сдвиг вниз + +;сдвиг строк +x3ACD ld c,a + ld a,b + cp e + jr z,x3B1D ;сдвигать не надо + push de + call x3B98 ;расчет количества строк от заданной до низа экрана +x3AD6 push bc + ld c,h + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ex de,hl + xor a + or c + jr z,x3AE3 ;вверх + inc b ;вниз + jr x3AE4 +x3AE3 dec b +x3AE4 push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + pop de + ld a,c + ld c,#20 + ld b,#08 +x3AEE push bc ;скролл знакоместной строки + push hl + push de + ld b,#00 + ldir + pop de + pop hl + pop bc + inc h + inc d + djnz x3AEE + push af ;скролл атрибутной строки + push de + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + ex (sp),hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + ex (sp),hl + pop de + ld bc,#0020 + ldir + pop af + pop bc + and a + jr z,x3B16 ;вверх + inc b + jr x3B17 +x3B16 dec b +x3B17 dec c + ld h,a + jr nz,x3AD6 + pop de + ld b,e +x3B1D pop hl + +;АДРЕС: #3B1E печать строки редактируемого буфера +;вх: b - координата печати Y +; hl - адрес начала строки +x3B1E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + ex de,hl + ld a,(#5C3C) ;TVFLAG + push af + ld hl,#EC0D + bit 6,(hl) ;в какой области идет редактирование буфера + res 0,a + jr z,x3B31 + set 0,a +x3B31 ld (#5C3C),a + ld c,#00 + call x372B ;установка координат печати из bc + ex de,hl + ld b,#20 +x3B3C ld a,(hl) + and a + jr nz,x3B42 + ld a,#20 +x3B42 cp #90 + jr nc,x3B55 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0010 ;!!!можно заменить на rst #10!!! +x3B49 inc hl + djnz x3B3C + pop af + ld (#5C3C),a + call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + scf ;!!!ЛИШНЕЕ!!! + ret ;!!!тоже тогда убрать!!! +x3B55 call x1F20 ;установка другого стэка и ram 0 + rst #10 + call x1F45 ;установка другого стэка и ram 7 + jr x3B49 + +;АДРЕС: #3B5E очистка строк экрана +;вх: b - номер первой строки экрана +; d - номер последней строки экрана +x3B5E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + ld a,d + sub b + inc a + ld c,a ;количество строк + call x3B98 ;b - номер начальной строки экрана +x3B68 push bc ;c - кол-во строк + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E9B ;расчет адреса на экране по координатам + ld c,#08 ;занулим строку занкомест +x3B6E push hl + ld b,#20 ;занулим строку пикселей + xor a +x3B72 ld (hl),a + inc hl + djnz x3B72 + pop hl + inc h + dec c + jr nz,x3B6E + ld b,#20 + push bc + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам + ex de,hl + pop bc + ld a,(#5C8D) ;установим атрибуты строки +x3B86 ld (hl),a + inc hl + djnz x3B86 + pop bc + dec b + dec c + jr nz,x3B68 + call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами + scf + ret + +;АДРЕС: #3B94 расчет количества строк и столцов до конца экрана +x3B94 ld a,#21 + sub c + ld c,a + +;АДРЕС: #3B98 расчет количества строк от заданной до низа экрана +;вх: b - номер строки +; ix - адрес описателя курсора +;вых: b - количество строк до низа экрана +x3B98 ld a,#18 + sub b + sub (ix+#01) + ld b,a + ret + +;АДРЕС: #3BA0 расчет адреса атрибутов +;вх: b - crd Y +; c - crd X +;вых: hl - адрес атрибутов +x3BA0 push bc + xor a + ld d,b + ld e,a + rr d + rr e + rr d + rr e + rr d + rr e + ld hl,#5800 + ld b,a + add hl,bc + add hl,de + pop bc + ret + +;АДРЕС: #3BB8 обмен атрибутов basic 128 с основными атрибутами +x3BB8 push af + push hl + push de + ld hl,(#5C8D) ;постоянные атрибуты экрана + ld de,(#5C8F) ;временные атрибуты экрана + exx + ld hl,(#EC0F) + ld de,(#EC11) + ld (#5C8D),hl + ld (#5C8F),de + exx + ld (#EC0F),hl + ld (#EC11),de + ld hl,#EC13 + ld a,(#5C91) ;параметры вывода на экран + ld d,(hl) + ld (hl),a + ld a,d + ld (#5C91),a + pop de + pop hl + pop af + ret + +;АДРЕС: #3BE9 запуск команды randomize 15619: rem: load "boot" +x3BE9 call x3C56 ;пауза 25 фреймов + set 6,(iy+#02) + res 0,(iy+#02) ;вывод на основной экран + rst #08 + db #8D + ld (#EC0E),a ;a=#07 + ld bc,#0000 + call x372B ;установка координат печати из bc + ld hl,#EC0E + ld (hl),#FF + call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + ld hl,(#5C59) ;адрес начала строки basic + ld a,#08 + rst #08 + db #8C ;bc - длина бейсик-строки для автостарта + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1655 ;резервирование места (длина в bc) + ld de,(#5C59) ;адрес начала строки basic + ld a,#04 + rst #08 ;копирование строки автостарта по адресу в de + db #8C ; и переход на rom 0: #1B11 + ; анализ и выполненение введенной строки +;АДРЕС: #3C1C !!!NOT USED!!! копирование и выполненение бейсик строки +x3C1C nop + jp x1B0F + +;АДРЕС: #3C20 !!!NOT USED!!! бейсик строка +x3C20 db #F9 ;RANDOMIZE + db #C0 ;USR + db #B0 ;VAL + db '"15619":' + db #EA ;REM + db ":" + db #F7 ;RUN + db "92,3MOA" + +;АДРЕС: #3C35 возврат из монтора +x3C35 out (c),d + ld b,#7F + out (c),e + pop de + pop bc + inc sp + pop af + ld r,a + jp po,x3C47 + pop af + ei + ret +x3C47 pop af + di + ret + +;АДРЕС: #3C4A !!!NOT USED!!! вход куда-то (продолжение x08E1) +x3C4A ld (#C001),a + cpl + ld (#C002),a + ld a,#04 + jp x0004 + +;АДРЕС: #3C56 пауза 25 фреймов +x3C56 ei + ld b,#19 +x3C59 halt + djnz x3C59 + ld hl,#5C3B + res 5,(hl) ;клавиша не нажата + scf + ret + +;АДРЕС: #3C63 токенизация строки бейсик программы с синтаксической ошибкой +x3C63 ld a,#01 + jr x3C69 + +;АДРЕС: #3C67 токенизация строки бейсик программы +x3C67 ld a,#00 ;!!! можно xor a +x3C69 ld (#FD8A),a + ld hl,#0000 + ld (#FD85),hl + ld (#FD87),hl + add hl,sp + ld (#FD8B),hl + call x34EA ;обнуление указателей в бейсик строке + ld a,#00 ;!!! можно xor a + ld (#FD84),a + ld hl,#FD74 + ld (#FD7D),hl + call x1F20 ;установка другого стэка и ram 0 + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x16B0 ;очистка различных областей памяти + call x1F45 ;установка другого стэка и ram 7 + ld a,#00 ;!!! можно xor a + ld (#FD81),a + ld hl,(#5C59) + ld (#FD82),hl + ld hl,#0000 ;!!! можно ld h,a: ld l,a + ld (#FD7F),hl +x3CA1 ld hl,(#FD85) + inc hl + ld (#FD85),hl + call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип + ld c,a + ld a,(#FD81) + cp #00 + jr nz,x3CF4 +x3CB3 ld a,c + and #04 + jr z,x3CED ;это не буква +x3CB8 call x3DE9 ;!!!ОШИБКА + jr nc,x3CC4 ;в буфере нет места + ld a,#01 + ld (#FD81),a + jr x3CA1 +x3CC4 ld hl,(#FD7F) + ld a,l + or h + jp nz,x3D1E ;!!! млжно jr +x3CCC push bc + call x3DCD ;копирование слова из буфера в строку бейсик программы + pop bc + ld a,#00 + ld (#FD81),a +x3CD6 ld a,c + and #01 + jr nz,x3CB3 + ld a,b + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + ret nc + ld hl,(#FD85) + inc hl + ld (#FD85),hl + call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип + ld c,a + jr x3CD6 +x3CED ld a,b + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + ret nc + jr x3CA1 +x3CF4 cp #01 + jr nz,x3CED + ld a,c + and #01 + jr z,x3CB8 + push bc +x3CFE call x3F7E ;распознавание токена + pop bc + jr c,x3D7D ;токен распознан + ld hl,(#FD7F) + ld a,h + or l + jr nz,x3D1E + ld a,c + and #02 + jr z,x3CCC + call x3DE9 ;вставить символ в буфер редактирования + jr nc,x3CC4 ;нет места в памяти + ld hl,(#FD7D) + dec hl + ld (#FD7F),hl + jr x3CA1 +x3D1E push bc + ld hl,#FD74 + ld de,(#FD7F) + ld a,d ;!!!можно оптимизировать + cp h + jr nz,x3D2F + ld a,e + cp l + jr nz,x3D2F + inc de +x3D2F dec de + jr x3D33 +x3D32 inc hl +x3D33 ld a,(hl) + and #7F + push hl + push de + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + pop de + pop hl + ld a,h + cp d + jr nz,x3D32 + ld a,l + cp e + jr nz,x3D32 + ld de,(#FD7F) + ld hl,#FD74 + ld (#FD7F),hl + ld bc,(#FD7D) + dec bc + ld a,d + cp h + jr nz,x3D70 + ld a,e + cp l + jr nz,x3D70 + inc de + push hl + ld hl,#0000 + ld (#FD7F),hl + pop hl + ld a,b + cp h + jr nz,x3D70 + ld a,c + cp l + jr nz,x3D70 + pop bc + jr x3D8F +x3D70 ld a,(de) + ld (hl),a + inc hl + inc de + and #80 + jr z,x3D70 + ld (#FD7D),hl + jr x3CFE +x3D7D push bc + call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > + pop bc + ld hl,#0000 + ld (#FD7F),hl + ld a,(#FD81) + cp #04 + jr z,x3D94 +x3D8F ld a,#00 + ld (#FD81),a +x3D94 ld hl,#FD74 + ld (#FD7D),hl + jp x3CB3 + +;АДРЕС: #3D9D получить очередной символ из строки бейсик программы и определить его тип +;вых: b - код символа +; a=#01 - прочие символы +; a=#02 - это # или $ +; a=#03 - это пробел +; a=#06 - это буква +x3D9D call x2D54 ;получить очередной символ из строки бейсик программы + ld b,a + cp #3F + jr c,x3DAF + or #20 + call x3DC6 ;проверка символа на принадлежность к буквам нижнего регистра + jr c,x3DC3 ;это буква +x3DAC ld a,#01 ;прочее + ret +x3DAF cp #20 + jr z,x3DC0 ;это пробел + cp "#" + jr z,x3DBD + jr c,x3DAC + cp "$" + jr nz,x3DAC +x3DBD ld a,#02 ;это # или $ + ret +x3DC0 ld a,#03 ;это пробел + ret +x3DC3 ld a,#06 ;это буква + ret + +;АДРЕС: #3DC6 проверка символа на принадлежность к буквам нижнего регистра +;вх: a - клод символа +;вых: cy=1 символ это буква в нижнем регистре +x3DC6 cp #7B + ret nc + cp #61 + ccf + ret + +;АДРЕС: #3DCD копирование слова из буфера в строку бейсик программы +x3DCD ld hl,#FD74 + ld (#FD7D),hl + sub a + ld (#FD7F),a + ld (#FD80),a +x3DDA ld a,(hl) + and #7F + push hl + call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов + pop hl + ld a,(hl) + and #80 + ret nz + inc hl + jr x3DDA + +;АДРЕС: #3DE9 вставить символ в буфер редактирования +;вх: b - код символа +; cy=0 нет места в буфере +x3DE9 ld hl,(#FD7D) + ld de,#FD7D + ld a,d + cp h + jr nz,x3DF8 + ld a,e + cp l + jp z,x3E13 ;!!!можно jr +x3DF8 ld de,#FD74 + ld a,d + cp h + jr nz,x3E03 + ld a,e + cp l + jr z,x3E09 +x3E03 dec hl + ld a,(hl) + and #7F + ld (hl),a + inc hl +x3E09 ld a,b + or #80 + ld (hl),a + inc hl + ld (#FD7D),hl + scf + ret +x3E13 scf + ccf + ret + +;АДРЕС: #3E16 вставка символа в сроку бейсик программы с обработкой < и > +;вх: a - код символа +x3E16 push af ;!!!ОШИБКА!!! + ld a,(#FD89) + or a + jr nz,x3E2F + pop af + cp ">" + jr z,x3E2A + cp "<" + jr z,x3E2A +x3E26 call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + ret ;!!!можно сократить +x3E2A ld (#FD89),a + scf + ret +x3E2F cp "<" + ld a,#00 + ld (#FD89),a + jr nz,x3E52 + pop af + cp ">" + jr nz,x3E41 + ld a,#C9 ;токен <> + jr x3E26 +x3E41 cp "=" + jr nz,x3E49 + ld a,#C7 ;токен <= + jr x3E26 +x3E49 push af + ld a,"<" + call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + pop af + jr x3E26 +x3E52 pop af + cp "=" + jr nz,x3E5B + ld a,#C8 ;токен >= + jr x3E26 +x3E5B push af + ld a,">" + call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек + pop af + jr x3E26 + +;АДРЕС: #3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек +;вх: a - код символа +x3E64 cp #0D + jr z,x3E88 ;это enter + cp #EA + ld b,a + jr nz,x3E74 ;это не REM + ld a,#04 + ld (#FD81),a + jr x3E82 +x3E74 cp #22 ;" + jr nz,x3E82 ;это не " + ld a,(#FD81) + and #FE + xor #02 + ld (#FD81),a +x3E82 ld a,b + call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов + scf + ret +x3E88 ld a,(#FD8A) + cp #00 + jr z,x3E99 + ld bc,(#FD85) ;!!!ОШИБКА!!! + ld hl,(#FD8B) + ld sp,hl + scf + ret +x3E99 scf + ccf + ret + +;АДРЕС: #3E9C вставка символа в сроку бейсик программы с игнорированием пробелов +;вх: a - код символа +;вых: a - новые флаги строки +x3E9C ld e,a + ld a,(#FD84) + ld d,a + ld a,e + cp " " + jr nz,x3EC6 ;это не пробел + ld a,d + and #01 + jr nz,x3EBF ;предыдущий символ был токеном + ld a,d + and #02 + jr nz,x3EB7 ;предыдущий символ был пробелом + ld a,d + or #02 + ld (#FD84),a + ret +x3EB7 ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ld a,(#FD84) + ret +x3EBF ld a,d + and #FE + ld (#FD84),a + ret +x3EC6 cp #A3 + jr nc,x3EEE ;это токен + ld a,d + and #02 + jr nz,x3EDA ;последний символ был пробелом + ld a,d + and #FE + ld (#FD84),a + ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ret ;!!!можно сократить +x3EDA push de + ld a," " + call x3EFB ;вставка символа в сроку бейсик программы + pop de + ld a,d + and #FE ;!!!можно сократить + and #FD + ld (#FD84),a + ld a,e ;!!!можно сократить jr x3ED2 + call x3EFB ;вставка символа в сроку бейсик программы + ret ;!!!можно сократить +x3EEE ld a,d + and #FD + or #01 + ld (#FD84),a ;!!!можно сократить jr x3ECF + ld a,e + call x3EFB ;вставка символа в сроку бейсик программы + ret + +;АДРЕС: #3EFB вставка символа в сроку бейсик программы +;вх: a - код символа +; de - адрес в строке для вставки +x3EFB ld hl,(#FD87) + inc hl + ld (#FD87),hl + ld hl,(#FD82) ;адрес в строке для следующей вставки + ld b,a + ld a,(#FD8A) + cp #00 ;!!! можно or a + ld a,b + jr z,x3F33 + ld de,(#5C5F) ;адрес символа после маркера ошибки + ld a,h ;!!! можно оптимизировать + cp d + jr nz,x3F30 + ld a,l + cp e + jr nz,x3F30 + ld bc,(#FD85) ;!!!ОШИБКА!!! + ld hl,(#FD87) + and a + sbc hl,bc + jr nc,x3F2A + ld bc,(#FD87) +x3F2A ld hl,(#FD8B) + ld sp,hl + scf + ret +x3F30 scf + jr x3F35 +x3F33 scf + ccf +x3F35 call x1F20 ;установка другого стэка и ram 0 + jr nc,x3F47 + ld a,(hl) ;!!!ОШИБКА!!! inc hl:ld a,(hl):dec hl + ex de,hl + cp #0E + jr nz,x3F5D ;не число + inc de + inc de + inc de + inc de + inc de + jr x3F5D +x3F47 push af + ld bc,#0001 + push hl + push de + call x3F66 ;проверка наличия свободного места в памяти + pop de + pop hl + rst #28 ;вызов процедуры из basic 48k + dw Rom1.x1664 ;обновление системных переменных + ld hl,(#5C65) + ex de,hl + lddr + pop af + ld (de),a +x3F5D inc de + call x1F45 ;установка другого стэка и ram 7 + ld (#FD82),de + ret + +;АДРЕС: #3F66 проверка наличия свободного места в памяти +;вх: bc - количество байт +;вых: если места в памяти нет, переход на обработку ошибки: 4 Out of memory +x3F66 ld hl,(#5C65) + add hl,bc + jr c,x3F76 + ex de,hl + ld hl,#0082 + add hl,de + jr c,x3F76 + sbc hl,sp + ret c +x3F76 ld a,#03 + ld (#5C3A),a + jp x0321 + +;АДРЕС: #3F7E распознавание токена +;вых: cy=1 токен распознан -> a - код токена +x3F7E call #FD2E ;распознавание токена (x33F4) + ret c ;токен не распознан + ld b,#F9 + ld de,#FD74 + ld hl,x3594 ;токены basic 128 + call #FD3B ;распознавание токена (x3401) + ret nc ;токен не распознан + cp #FF ;это CLOSE# ? + jr nz,x3F96 + ld a,#D4 ;CLOSE # + jr x3FB8 +x3F96 cp #FE ;это OPEN# ? + jr nz,x3F9E + ld a,#D3 ;OPEN # + jr x3FB8 +x3F9E cp #FD ;это DEFFN ? + jr nz,x3FA6 + ld a,#CE ;DEF FN + jr x3FB8 +x3FA6 cp #FC ;это GOSUB ? + jr nz,x3FAE + ld a,#ED ;GO SUB + jr x3FB8 +x3FAE cp #FB ;это GOTO ? + jr nz,x3FB6 + ld a,#EC ;GO TO + jr x3FB8 +x3FB6 sub #56 +x3FB8 scf + ret + +;АДРЕС: #3FBA копирование строки из hl в de в (hl+0) кол-во байт +x3FBA ld b,(hl) + inc hl +x3FBC ld a,(hl) + ld (de),a + inc de + inc hl + djnz x3FBC + ret + +;АДРЕС: #3FC3 !!!NOT USED!!! преобразование ASCII в цифру +x3FC3 cp "0" + ccf + ret nc + cp "9"+1 + ret nc + sub #30 + scf + ret + +;АДРЕС: #3FCE обработка нажатой управляющей клавиши +;вых: cy=0, nz - не найден обработчик клавиши +; cy=0, z - клавиша обработана, нужен звуковой сигнал +; cy=1, z - клавиша обработана звуковой сигнал не нужен +x3FCE push bc + push de + ld b,(hl) + inc hl +x3FD2 cp (hl) + inc hl + ld e,(hl) + inc hl + ld d,(hl) + jr z,x3FE1 ;клавиша найдена. в de адрес + inc hl + djnz x3FD2 + scf + ccf + pop de + pop bc + ret +x3FE1 ex de,hl + pop de + pop bc + call x3FEE ;call (hl) + jr c,x3FEB + cp a + ret +x3FEB cp a + scf + ret + +;АДРЕС: #3FEE вызов call (hl) +x3FEE jp (hl) + +;АДРЕС: #3FEF инициалы программистов +x3FEF db #00,"MB" ;Martin Brennan + db #00,"SB" ;Steve Berry + db #00,"AC" ;Andrew Cummins + db #00,"RG" ;Rupert Goodwins + db #00,"KM" ;Kevin Males + db #00,#01 ;end of rom marker + + SAVEBIN "../Build/scorp/NewROM0.bin",#0000,#4000 + diff --git a/ProfRom_Disasm/rom0.bat b/ProfRom_Disasm/rom0.bat new file mode 100755 index 0000000..160677f --- /dev/null +++ b/ProfRom_Disasm/rom0.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom0.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2.bat b/ProfRom_Disasm/rom2.bat new file mode 100755 index 0000000..bac81ea --- /dev/null +++ b/ProfRom_Disasm/rom2.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom2_SrvMon.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2_SrvMon.a80 b/ProfRom_Disasm/rom2_SrvMon.a80 new file mode 100755 index 0000000..506c561 --- /dev/null +++ b/ProfRom_Disasm/rom2_SrvMon.a80 @@ -0,0 +1,10349 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 + +;#0000 rst #00 запись байта в память пользователя +;#0006 переход на обработку входа в монитор по NMI/rst 8 +;#0008 rst #08 печать сообщения по номеру в BC +;#000B переход в другой rom +;#000D обработка NMI при активной rom2 +;#0010 rst #10 печать символа в окне +;*not used* #0013 ds 2 +;#0015 вход по rst #08 из basic 48k +;#0018 rst #18 вызов п/п Tr-Dos +;#001B для проверки размера ПЗУ +;#001E вход при включении/reset +;#0020 rst #20 печать строки +;*not used* #0023 ds 3 +;#0026 вход по rst #08 из basic 128k +;#0028 rst #28 чтение байта из памяти пользователя +;*not used* #002D обработка входа в монитор по NMI/rst 8 +;#0030 rst #30 вызов п/п из другого rom +;*not used* #0033 ds 2 +;*not used* #0035 обработка входа в монитор по NMI/rst 8 +;#0038 rst #38 переход на обработку прерываний im 1 +;#003B вход при включении/reset +;#0092 обработка прерываний im 1 +;#009C обработка NMI при активной странице монитора +;#00B6 вход в монитор по NMI/rst 8 +;#00F1 переменные различного характера +;#0101 номер текущего rom +;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +;#0110 Таблица переходов ПрофПЗУ +;#0114 вход в монитор по rst #08 +;#0116 вызов п/п по адресу в BC с задержкой call (bc) +;#011D вход в монитор по кнопке NMI +;#013A выход из монитора +;#0167 вход в монитор по rst #08 +;#01F5 вызов функции rst #08 +;#0241 пауза 26698t +;#024C установка номера дисковода +;#025E определение наличия Турбои и оригинальности (колво тактов) +;#02A5 печать сообщения по номеру в BC +;#02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) +;#02AE rst 8: db #8D хрень какая-то непонятная +;#02CC rst 8: db #8C автостарт с дискеты +;#02D1 установка двойной скорости (rst 8: db #87) +;#02D7 установка обычной скорости (rst 8: db #88) +;не используется??? #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! +;#02F4 rst 8: db #81 вызов функции R8DOS +;#0310 сохранение регистров для основной программы +;#0321 работа с микросхемой CMOS (rst 8: db #89) +;#032A чтение регистров основной программы +;#0339 установка переменных монитора (rst 8: db #82) +;#035F вывод символа на экран пользователя (rst 8: db #84) +;#0368 отключение монитора - отладчика (rst 8: db #85) +;#0370 возврат в отладчик +;#0373 установка текущим блока дисководов монитора +;#0398 запись в регистр 7 AY числа #FF +;#03A7 Запись регистра AY +;#03B6 чтение регистра AY +;#03C2 восстановление содержимого регистра 7 AY +;#03CE сохранение регистров и стэка в ram 8 +;#04CE восстановление режима Турбо +;#04D5 включение Турбо-режима +;#04D9 выключение Турбо-режима +;#04E2 восстановление регистров пользователя +;#0550 сохранение экрана из страницы 5 +;#0557 вход в монитор после трассировки команды +;#055B сохранение экрана из страницы 5 +;#0581 восстановление экрана в странице 5 +;#0589 установка зеленого бордюра (индикация ошибки) +;#058E чтение/запись байта в память пользователя +;#0603 копирование памяти с #8000 в страницу пользователя +;#0606 копирование страницы пользователя в #8000 +;#0665 включение режима 48k only +;#066D повторная инициализация страниц (если битая) +;#0732 установка координат печати crdY=рег C, crdX=#24 +;#0739 копирование части закодированных процедур в ram 8 с раскодированием +;#0749 восстановление области памяти из ram 8 +;#0753 сохранение области памяти в ram 8 +;#08B7 таблица с адресами обработки функций rst 8 +;#08D3 rst 8: db #86 Копия графического экрана на принтер +;#08D7 печать текущего меню монитора +;#0911 rst 8: db #80 Вывод символа из аккумулятора на принтер +;#0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) +;#0950 вывод символа на принтер +;#0A33 проверка нажатия BREAK +;#0A51 печать экрана на принтер +;#0AD7 Команда: EXit выход из отладчика в меню +;#0AE0 печать/обновление окна отладчика +;#0AEB вызов отладчика M. Monitor +;#0AF2 полное обновление окна отладчика +;#0AFB обновление окна отладчика, без информационного окна +;#0B06 ввод и обработка команды отладчика +;#0C98 чтение числового операнда из строки команды +;#0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) +;#0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D +;#0D46 проверка символа в (hl) #2C/#3B/#00/#0D +;#0D55 чтение из строки команды чилового/байта строкового значения +;#0DEC таблица префиксов и основания систем счислений +;#0DF4 преобразование строки в число +;#0E73 деление bc=hl/de с проверкой de на ноль +;#0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) +;#0EBA выделение из строки числовых операндов (не более 6) +;#0EE3 поиск в буфере ввода строки первого печатного символа +;#0EE6 поиск в строке первого печатного символа +;#0EF0 поиск заданной команды в списке +;#0F91 названия регистров для монитора +;#0FA0 названия регистров для монитора +;#1037 инициализация системы и чтение настроек Autoconfig +;#1101 редактирование дампа памяти в окне монитора +;#1107 таблица мнемоник +;#1196 операнды/флаги ассемблера +;#11F7 мнемоники ассемблера +;#12D2 таблица для формирования команд дизасма +;#14B2 таблица для формирования команд дизасма +;#14F6 проверка значения аккумулятора +;#14FD проверка значения аккумулятора +;#1504 проверка значения аккумулятора +;#150B проверка значения аккумулятора +;#1512 печать команды ассемблера +;#1570 печать мнемоники ассемблера с пробелом на конце +;#157F печать операнда/числа команды ассемблера +;#15B3 печать сообщения из hl длиной b +;#15B9 печать сообщения из hl с заменой непечатных символов на ? +;#15C7 печать сообщения из hl +;#15D0 печать сообщения по номеру (на экран/в буфер) +;#15DB печать сообщения из hl +;#15DD печать сообщения не менее заданной длины +;#15F3 печать нескольких пробелов (в B) +;#15FA печать сообщения по номеру в A +;#15FC печать сообщения по номеру в A, не менее заданной длины в С +;#1612 печать числа в hl (dec/hex) с префиксом +;#1614 печать числа в bc (dec/hex) с префиксом +;#1626 печать числа из (hl) (dec/hex) с префиксом +;#1629 печать числа в bc (bin/oct/dec/hex) с префиксом +;#162C печать числа в заданной системе счисления +;#1658 печать числа A с предварительным пробелом +;#165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом +;#1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом +;#1669 печать десятичного числа bc [0..65535] с ведущими пробелами +;#166E печать десятичного числа bc [0..65535] с ведущими пробелами +;#1673 печать числа bc (на экран/в буфер) +;#1677 печать числа bc (на экран/в буфер) +;#16AA деление bc=ac/de +;#16D0 печать строки (rst #20) +;#16DE печать числа hl=[#0000..#FFFF] +;#16E3 печать числа a=[#00..#FF] +;#16EC печать числа a=[#0..#F] +;#16FF исполнение зарезервированных слов анализатора st0-st9 +;#17F0 выполнение одной команды по адресу в PC +;#191E проверка попадания адреса на адреса #3D00-#3DFF +;#197F анализ команды ассемблера +;#1DD0 список команд отладчика +;#1DE5 выполнение слова анализатора +;#1E0F установка кода команды в программу анализатора +;#1E45 Команда: FLOAD track, sector, start, length +;#1E4F Команда: FSAVE track, sector, start, length +;#1E59 открытие файла для чтения/записи программы анализатора +;#1E76 Команда: DEFSave filename +;#1EA5 Команда: DEFLoad filename +;#1F25 Команда: CLear +;#1F42 Команда: ANalyser boolean +;#1F5B поиск введенного слова в словаре/программе пользователя +;#1FB0 Команда: WORD word[:] program +;#2093 Команда: EDit +;#20C8 печать редактируемого слова +;#2104 печать слова анализатора +;#2112 поиск начала и печать слова анализатора +;#2121 чтение ld bc,(hl+1): hl=hl+2 +;#2148 Команда: WORD word[:] program Продолжение (для переопределения уже определенных слов) +;#2214 Команда: PDEFinition вывод на принтер Форт - программы +;#2218 Команда: LDEFinition вывод на экран Форт - программы +;#2297 Команда: EVal word выполнить слово word +;#234D запись элемента на стэк анализатора +;#2364 установка нового значения вершины стэка анализатора +;#236A запись на стэк анализатора байта из ячейки памяти пользователя +;#2374 запись на стэк анализатора слова из ячеек памяти пользователя +;#237F чтение элемента с вершины стэка анализатора +;#2398 чтение двух элементов с вершины стэка анализатора +;#23A3 базовые слова анализатора +;#27DC список управляющих кодов +;#27E7 таблица с адресами обработки управляющих кодов +;#27FD удаление курсора и печать символа в окне +;#2800 печать символа в окне +;#28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) +;#28C5 сохранение экрана под курсором (6 пикселей символ) +;#28E8 печать/удаление курсора в окне +;#28F6 мигание текстового курсора в строке ввода +;#292F расчет экранного адреса курсора в окне для символов 6 пикселей +;#2959 расчет координат курсора на экране для символов шириной 8 пикселей +;#2969 расчет адреса курсора в области атрибутов для символов 8 пикселей +;#297C расчет экранного адреса курсора в окне для символов 8 пикселей +;#298E скроллинг окна вверх +;#29D0 скроллинг строки данных окна +;#29FB скроллинг строки атрибутов окна +;#2A1B обработка управляющего кода #1E (скроллинг окна ввниз) +;#2A5B очистка окна пользователя (rst 8: db #83) +;#2A5E обработка управляющего кода #0C (очистка текущего окна) +;#2A85 очистка знакоместной строки по координатам курсора +;#2AAD обработка управляющего кода #04 (вывод с выравниванием) +;#2ABB расчет для выравнивания строки +;#2ACA печать строки из буфера с выравниваем по центру окна #05 +;#2AED печать строки из буфера с выравниваем по правому краюу окна #06 +;#2AF2 обработка байта после управляющего кода #04 +;#2B07 возврат из п/п печати символа +;#2B0B печать символа со сбросом 7го бита (rst #10) +;#2B10 печать пробела (rst #10) +;#2B12 печать символа (rst #10) +;#2B63 установка адреса п/п обработки управляющего кода +;#2B6E обработка управляющего кода #0D (возврат каретки) +;#2B7D обработка управляющего кода #0A (перевод строки) +;#2B9D установка начальных координат +;#2BA8 короткий звуковой сигнал c установкой бордюра +;#2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) +;#2BF8 обработка управляющего кода #01 (установка атрибутов) +;#2C18 обработка управляющего кода #02 (восстановление атрибутов) +;#2C1F определение турбо-режима +;#2C30 определение турбо-режима вкл/выкл +;#2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +;не используется #2C7A чтение байта по адресу #00FB +;#2C7E поиск и вызов процедуры обработки без возврата(если не найдено возврат) +;#2C92 выполнение одной команды ассемблера с контролем ловушек +;#2CA8 печать/обновление монитора-отладчика +;#2E25 печать байта из L в двоичном виде +;#2E38 печать дампа памяти в окне +;#2E76 удаление курсора на предыдущей ячейке дампа +;#2E3D печать дампа памяти в окне +;#2EBA печать одной строки дампа памяти (8 байт) +;#2EBE печать одной строки дампа памяти (8 байт) +;#2F74 вывод дисасма памяти по адресу в de +;#2F96 анализ команды ассемблера +;#2FAC печать строки дизасма +;#2FED печать пробелов до правого края окна +;#2FF1 печать пробелов до заданной координаты X +;#2FFB установка текущим окна: ввод числа +;#3005 установка текущим окна: main menu +;#300A ix = адрес дескриптора окна монитора: вывод на принтер +;#300F чтение содержимого регистра ix основной программы +;#3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана +;#3019 ix = адрес дескриптора окна монитора: дамп памяти +;#301C ix = адрес дескриптора окна монитора из hl +;#3023 ожидание действий пользователя (опрос управления, вывод часов) +;#302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне +;#303C выполнение команды, на которую указывает PC (cs+3) +;#303F выполнение команды, на которую указывает PC с быстрым выполнением подпрограмм (cs+4) +;#3052 заглушка входа в монитор при несовпадении контрольной суммы +;#305B блокировка работы при ошибке контрольной суммы +;#3065 установка регистров для загрузки/сохранения +;#3074 Команда: ERAse filespec +;#3085 Команда: SAVE filespec start,length +;#3095 Команда: LOAD filespec [start[,length]] +;#30D8 чтение файла в память +;#3107 запись области памяти в файл +;#3135 подсчет контрольной суммы страницы +;#3161 список команд отладчика +;#318C Команда III (работа с контроллером прерываний) +;#3194 Команда OOO (работа с контроллером прерываний) +;#319C Команда CMOS (работа с контроллером прерываний) +;#31A4 Команда RESNVRAM (что-то пишет в NVRAM) +;#31AB Команда: SLOW type автоматическая трассировка +;#31C1 Команда: LISTBreak/LBreak +;#3201 печать ON/OFF от флага nz-ON/z-OFF +;#3210 определение адреса ловушки +;#3222 восстановление памяти пользователя под всеми ловушками +;#3228 сохранение памяти пользователя под всеми ловушками и установка ловушек +;#3281 установка начала списка ловушек +;#328B проверка срабатывания ловушки +;#32AF Команда: DELBreak number +;#32E2 Команда: BRK number, [on|off] +;#3303 Команда: BREak number, type, addr, int_count[,bank] +;#330B установка ловушки #8, по текущему адресу листинга дизасма +;#3326 удаление ловушки #8 +;#3333 Команда: OPTion bit on|off +;#3360 Команда: OUT addr, data +;#336C Команда: OUTD addr, data +;#337A Команда: IND addr +;#3383 Команда: IN addr +;#3389 Команда: ?data +;#33BB установка и очистка информационного окна отладчика +;#33CD печать информационного окна отладчика +;#33D2 Команда: SHow +;#3432 Команда: BASE 0|2|8|10|16 +;#344F Команда: WORKspace addr +;#3461 Команда: SEarch addr_st, addr_end, bank, data +;#346A Команда: FINd addr_st, addr_end, data +;#3517 продолжение поиска в отладчике (для команд FIND/SEARCH) +;#352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] +;#356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] +;#35D3 сравнение ix=xE075 +;#35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя +;#35F5 Команда: FILl addr_st, addr_end, byte [,bank] +;#360D Команда: DATA addr, data +;#3614 Команда: .PC data +;#361E Команда: .data +;#3640 pop de со стэка пользователя +;#364D Команда: POP +;#3655 переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти +;#365C Команда: MEMory addr +;#3662 Команда: EXX +;#3666 Команда: EX AF +;#3683 Команда: INTerrupt on|off +;#3699 Команда: CALl [[addr],bank] +;#36B4 Команда: Jump [[addr],bank] +;#36C3 запись стандартного Magic-файла +;#36DB Команда: ROM bank +;#36F9 получение номера логической страницы пользователя a=[#0..#F] +;#3707 сравнение страницы пользователя с заданной +;#370C Команда: RAM +;#3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL +;#371D установка страницы пользователя равной номеру страницы в HL +;#3732 установка страницы пользователя равной номеру страницы в L +;#3778 Команда: SCReen [on|off|5|7] +;#37B9 управление выводиммым листингом (опрос клавиш space, s, cs+1) +;#3807 пауза 40416t +;#382E ожидание отжатия всех клавиш +;#3837 копирование блока памяти в ram 8 с раскодированием +;не используется #385D не используется +;не используется #3860 не используется +;#3870 печать сообщения и продолжение работы текущего меню монитора +;#3884 получить адрес, на который ссылается команда ассемблера +;#38D8 быстрый вход в команду DASM +;#38E2 Команда: DASm вывод листинга дизасма +;#39A8 Печать одной строки листинга дизасма +;#39EB Команда: LCATalogue [num_drive] +;#39EF Команда: CATalogue [num_drive] +;#3A10 Команда: PUSH data +;#3A14 запись de на стэк пользователя +;#3A21 копирование активного экрана пользователя в #4000 +;#3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +;#3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти на принтер. +;#3A60 Команда: DISs [addr_st [,addr_end]] реассемблирование блока памяти с адреса addr_st по addr_end включительно +;#3A68 Команда: LDUmp [addr_st[,addr_end]] +;#3A71 Команда: DUmp [addr_st[,addr_end]] +;#3A93 вызов п/п по адресу в bc - call (bc) +;#3A95 подготовка переменных к выводу на экран/принтер +;#3AC8 Команда: VList +;#3AD0 Команда: Help +;#3AF9 вызов п/п по адресу в de - call (de) +;#3AFB печать команды отладчика +;#3B55 Команда: IM +;#3B75 определение типа прерываний im 1/2 +;#3B7F установка переменных по конкретным адресам +;#3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE +;#3C01 некодированные процедуры переключения страниц -> ram 8 xE42D +;#3D01 список команд отладчика +;#3E25 чтение портов #1FFD/#7FFD +;#3E2C адреса обработки команд отладчика +;#3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED +;#3EDA данные для установки переменных по конкретным адресам +;#3EE6 названия месяцев +;#3F0A Названия дней недели +;#3F1F free #00E1(225) bytes +;#4000 + + + +;АДРЕС: #0000 запись байта в память пользователя (rst #00) +;вх: hl - адрес в памяти +; a - байт для записи +x0000 scf + bit 7,h +x0003 jp x058E +x0006 jr x0069 +x0008 jp x02A5 ;rst #08 печать сообщения по номеру в BC +x000B out (c),a ;переход в другой rom +x000D jp x009C ;обработка NMI при активной rom2 +x0010 jp x2B12 ;rst #10 печать символа в окне +x0013 nop + nop +x0015 jp x00B6 ;вход по rst #08 из basic 48k +x0018 jp xE41B ;rst #18 вызов п/п Tr-Dos +x001B ld a,#00 ;для проверки размера ПЗУ + ret +x001E jr x003B ;вход при включении/reset +x0020 jp x16D0 ;rst #20 печать строки +x0023 nop + nop + nop +x0026 jr x0069 ;вход по rst #08 из basic 128k + +;АДРЕС: #0028 чтение байта из памяти пользователя (rst #28) +;вх: hl - адрес в памяти +x0028 or a + bit 7,h + jr x0003 +x002D jp x00B6 +x0030 jp xE3D3 ;rst #30 вызов п/п из другого rom +x0033 nop + nop +x0035 jp x00B6 ;сюда переходим по NMI из Tr-Dos +x0038 jp x0092 ;переход на обработку прерываний im 1 + +;АДРЕС: #003B вход при включении/reset +;вх: bc=#1FFD +x003B ld b,#7F + xor a + out (c),a ;ram 8 +x0040 ld sp,#5BFF + ld b,#00 + jr x0049 +x0047 out (c),a ;завершение инициализации и переход в basic 128k +x0049 ld hl,#EAF5 ;проверим память 8й страницы +x004C ld a,b + cp (hl) + inc hl + jr nz,x007B ;ram 8 испорчена. полный сброс + djnz x004C + ld hl,(#E028) +x0056 push hl ;hl=#0000 при полной инициализации + call x1037 ;инициализация системы и чтение настроек Autoconfig + pop hl + ld bc,#7FFD + xor a + ld (x5B88),a + out (c),a ;ram 0/8 + jr x006C +x0066 jp x000D ;нажатие Magic при активной rom2 +x0069 jp x00B6 +x006C ld b,#1F + rlc l + ld hl,#00C7 + jr nc,x0078 + ld hl,#00ED +x0078 push hl + jr x0047 ;rom 0 (basic 128k) +;8я страница испорчена. полная иницаиализация +x007B call x0672 + pop bc ;bc=x3135 + call x3A93 ;вызов п/п по адресу в bc (подсчет контрольной суммы страницы) + xor a ;hl=#00F6 + ld l,a ;hl=#0000 + ld i,a + im 0 + ei + halt + im 1 + halt + im 2 + halt + jr x0056 + +;АДРЕС: #0092 обработка прерываний im 1 +;вых: a=0, b=0, d=d+1 +x0092 ld a,#00 + djnz $ + cp b + jr nz,x009A + inc d +x009A ei + ret + +;АДРЕС: #009C обработка NMI при активной странице монитора +x009C push af + ld a,r + push af + ld a,#08 ;вход при активной странице монитора + push af + inc sp + push bc + push hl + ld hl,(xC001) + ex (sp),hl + ld a,#55 + ld (xC001),a + cpl + ld (xC001+1),a + ld bc,#1FFD + +;АДРЕС: #00B6 вход в монитор по NMI/rst 8 +x00B6 di + ld a,#12 + out (c),a ;rom 2 + ld b,#7F + ld a,#10 + out (c),a ;ram 8 + ld (xDD6D),sp + ld (xDDF7),sp ;сохраним адрес стэка + ld sp,xE38D ;новый стэк + ld bc,(xC064) + ld a,c + or b + jr nz,x0116 ;вызов процедуры вместо входа в монитор + call x03CE ;сохранение регистров и стэка в ram 8 + call x0398 ;запись в регистр 7 AY числа #FF + ld a,(xDD86) ;номер rom откуда зашли + cp #80 + jp z,x0922 + call x3222 ;восстановление памяти пользователя под всеми ловушками + ld a,(xDD86) ;номер rom откуда зашли + and #03 + jr nz,x0114 ;вход по rst #08 из basic 128k или basic 48k + call x0373 ;установка текущим блока дисководов монитора + jr x011D ;вход в монитор по кнопке NMI + +x00F1 db #61 ;второй байт сигнатуры программы анализатора +x00F2 db #6F +x00F3 db #08 +x00F4 db #35 ;байт для раскодирования +x00F5 db #CA ;байт для раскодирования блока атрибутов монитора +x00F6 db #80 +x00F7 db #71 +x00F8 db #1A +x00F9 db #6B +x00FA db #D7 +x00FB db #01 +x00FC db #05 ;байт для раскодирования процедур +x00FD db #07 ;байт для раскодирования процедур +x00FE db #61 ;байт для раскодирования процедур +x00FF dw xE516 ;адрес п/п обработки прерываний im 2 + +;АДРЕС: #0101 номер текущего rom +x0101 db #02 + +;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +x0102 ds #0E + +;АДРЕС: #0110 Таблица переходов ПрофПЗУ +x0110 db #00,#0C,#08,#04 + +;АДРЕС: #0114 вход в монитор по rst #08 +x0114 jr x0167 + +;АДРЕС: #0116 вызов п/п по адресу в BC с задержкой call (bc) +x0116 push bc +x0117 dec bc + ld a,b + or c + jr nz,x0117 + ret + +;АДРЕС: #011D вход в монитор по кнопке NMI +x011D ld a,(xE039) ;значение NMI debouncing + ld b,a +x0121 call x0241 ;пауза 26698t + djnz x0121 + call x2C30 ;определение турбо-режима вкл/выкл +x0129 bit 0,(iy+#12) + jr z,x0136 ;отладчик не запущен + ld a,(xC063) + or a + jp z,x0AF2 ;печать окна отладчика +x0136 rst #30 ;отладчик отключен + dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) + db #05 + +;АДРЕС: #013A выход из монитора +x013A call x0370 ;возврат в отладчик +x013D ld sp,xE38D + call x0581 ;восстановление экрана в странице 5 +x0143 call x3228 ;сохранение памяти пользователя под всеми ловушками и установка ловушек +x0146 call x024C ;установка номера дисковода + res 3,(iy+#12) ;сброс признака сохранения экрана в ram 8 + ld a,(xDD86) ;номер rom откуда зашли + and #0C + call nz,xE483 ; + call x03C2 ;восстановление содержимого регистра 7 AY + res 7,(iy+#12) ; + call x04E2 ;восстановление регистров пользователя + xor a + ld sp,(xDD6D) ;указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке + jp x000B ;возврат в rom пользователя + +;АДРЕС: #0167 вход в монитор по rst #08 +x0167 ld hl,(xDD6B) ;pc программы пользователя + dec hl + ld (xDD6B),hl ;назад, на длину команды rst 8 + ld a,(xE026) + bit 5,a + jr z,x018E +;выполняется трассировка команды из отладчика + ex de,hl + ld hl,(xE11A) ;адрес начала буфера для трассировки команды + push hl + scf + sbc hl,de + ex de,hl + pop de ;адрес начала буфера для трассировки команды + jr nc,x018E ;PC не в пределах буфера + ex de,hl + push de + ld de,#0008 + add hl,de + pop de + sbc hl,de + ex de,hl + jp nc,x0557 ;PC пользователя попадает на буфер с командой трассировки -> значит это выход из трассировки +;проверка ловушек +x018E bit 4,a + res 4,(iy+#12) + jr nz,x01F2 ;при вызове команды CALL отладчика + call x328B ;проверка срабатывания ловушки + ld e,#00 ;de=#0000, b - обратный номер ловушки + jr c,x01F5 ;нет сработавших ловушек. вызов функции rst #08 +; проверка проходов по ловушке +x019D ld l,(ix+#07) + ld h,(ix+#08) + ld a,l + or h + jr z,x01B2 ;нужный проход по ловушке + dec hl ;уменьшим счетчик проходов + ld (ix+#07),l + ld (ix+#08),h + ld a,h + or l + jr nz,x01E0 ;счетчик проходов еще не пустой +; сработала ловушка +x01B2 ld l,(ix+#05) + ld (ix+#07),l + ld h,(ix+#06) + ld (ix+#08),h + push ix + pop hl + bit 1,(hl) + jr nz,x01C7 ;ловушка не активна + res 7,(hl) ;ловушка больше не задана +x01C7 ld a,#09 ;b - обратный номер ловушки + sub b ;a - номер ловушки + call x3210 ;определение адреса ловушки +; работа анализатора + push af + call nz,x1DE5 ;выполнение слова анализатора + pop af +; вход в отладчик по сработавшей ловушке +x01D2 ld l,a + ld a,#83 ;сообщение: breackpoint _число_ +x01D5 ld h,#00 + ld (xDDA7),hl ;число для печати + call x0373 ;установка текущим блока дисководов монитора + jp x0B06 ;ввод и обработка команды отладчика +x01E0 bit 7,e + jp nz,x2C9D ;печать отладчика + ld sp,xE336 + res 7,(iy+#16) + call x17F0 ;выполнение одной команды по адресу в PC +x01EF jp x0143 ;выход из монитора +x01F2 xor a + jr x01D2 + +;АДРЕС: #01F5 вызов функции rst #08 +;вх: 7,e =1 - трассировка в отладчике +; =0 - вызов функции rst #08 +; hl - PC пользователя +x01F5 push de + inc hl + rst #28 ;чтение номера функции rst #08 + cp #FF + jr z,x0200 + sla a + jr c,x0225 ;это функция rst #08 + +;обработчик ошибок стандартного Basic +x0200 ex de,hl + call x3A14 ;запись de на стэк пользователя + bit 4,(iy-#02) + jr z,x01F2 ;был включен Basic 128k при вызове rst #08 + ld hl,(#5C5D) + ld (#5C5F),hl + ld hl,#0053 ;новый pc программы пользователя + ld (xDD6B),hl + +;возврат после отработки функции, вызванной пользователем +x0216 res 5,(iy+#0B) ;функции вызываются из монитора + pop de + bit 7,e + jr z,x01EF ;;выход из монитора + ld hl,(xDD6B) ;PC программы пользователя + jp x18C0 ;исполнение зарезервированных слов анализатора st0-st9 + +;определение адреса и вызов функции rst #08 +x0225 cp #1B + jr nc,x0200 ;не существующий номер функции + inc hl + ld (xDD6B),hl ;PC пользщователя + ld hl,x0216 ;сюда вернемся после отработки + push hl + set 5,(iy+#0B) ;функция вызвана пользователем + ld hl,x08B7 ;таблица с адресами обработки функций rst 8 + ld e,a + ld d,#00 + add hl,de + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + jp (hl) + +;АДРЕС: #0241 пауза 26698t +x0241 push bc + ld bc,#0400 +x0245 dec bc + ld a,c + or b + jr nz,x0245 + pop bc + ret + +;АДРЕС: #024C установка номера дисковода +x024C ld a,(xFFDC) + bit 5,a + ld a,(xFFCA) + jr nz,x025A ;блок дисководов монитора + ld (xE9F2),a ;блок дисководов пользователя + ret +x025A ld (xE9F1),a + ret + +;АДРЕС: #025E определение наличия Турбои и оригинальности (колво тактов) +x025E call x04D9 ;выключение Турбо-режима + call x04D5 ;включение Турбо-режима + ld a,#AF ;xor a + ld (xE516),a + call x2C1F ;определение турбо-режима + jr z,x0276 ;турбо выключен + ld a,(xE02D) ;турбо включен и доступен + or %11000000 + ld (xE02D),a +x0276 ld (xE523+#08),hl ;!!! непонятно !!! + ld a,#CD ;call #nnnn + ld (xE51C),a + ld c,#FF ;???определение скорости??? + xor a + ld e,a + ld d,a + inc a + ld b,a + ei + halt + inc a + ld b,a +x0289 call xE483 ;ret + db #ED,#70 ;in (c) + call xE483 + dec de + or a + jr nz,x0289 + di + rst #30 + dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер + db #04 + ld (xDFFC),de + xor a + jp nz,x3052 ;!!!тут перехда не будет никогда!!! + jp x0056 + +;АДРЕС: #02A5 печать сообщения по номеру в BC +x02A5 rst #30 + dw rom5_x11CD ;печать сообщения по номеру в BC + db #05 + ret + +;АДРЕС: #02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) +;вх: +1 =#00 используем имя bootm +; a - номер дисковода +;вх: +1 ="filename",#00 - имя файла +x02AA rst #30 + dw rom6_x093F ;rst 8:db #8B загрузка zs-snap с диска + db #06 + +;АДРЕС: #02AE rst 8: db #8D хрень какая-то непонятная +;вых: a =#07 +x02AE ld a,#07 + ld (xDD7F+#01),a ;регистр A пользователя + rst #30 + dw rom7_x155A ;чтение заголовка первого попавшегося сектора дисковода A + db #07 + rst #30 + dw rom7_x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + db #07 + ret nz ;подключен образ + ld hl,#E005 +x02BF in a,(#1F) + and h + jr z,x02BF + ret m ;7,a =1 ВГ93 готов + ret pe ;7-5,a =011 + res 5,h ;7-5,a =000/010 + inc (hl) + inc hl + ld (hl),l + ret + +;АДРЕС: #02CC rst 8: db #8C автостарт с дискеты +;вх: a =#0C -> вых: нажатие Enter и переход на rom 0: #259F +; =#08 -> вых: bc - длина бейсик-строки для автостарта +; =#nn -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 +x02CC rst #30 + dw rom7_x01AF ;автостарт с дискеты + db #07 + ret + +;АДРЕС: #02D1 установка двойной скорости (rst 8: db #87) +x02D1 call x02DD + set 6,(hl) + ret + +;АДРЕС: #02D7 установка обычной скорости (rst 8: db #88) +x02D7 call x02DD + res 6,(hl) + ret +x02DD xor a + ld hl,xE02D + bit 7,(hl) + jr nz,x02E7 + inc a + pop bc +x02E7 ld (xDD7F),a ;регистр f, флаг c + ret + +;АДРЕС: #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! +x02EB call x032A ;чтение регистров основной программы + rst #30 + dw rom5_x043B ;ОШИБКА!!!! вызов процедуры по номеру в C + db #05 + jr x0310 ;сохранение регистров для основной программы + +;АДРЕС: #02F4 rst 8: db #81 вызов функции R8DOS +x02F4 ld hl,xEA49 ;блок пользовательский дисководов + ld (xE9F3),hl + ld hl,xFFDC + bit 5,(hl) + jr z,x0309 + res 5,(hl) ;работа с дисководом пользователя + ld a,(xE9F2) + call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +x0309 call x032A ;чтение регистров основной программы + rst #30 ;обработка функции rst8dos #81 + dw rom7_x0229 ;вызов функции R8DOS + db #07 + +;АДРЕС: #0310 сохранение регистров для основной программы +x0310 ld (xDD77),bc + ld (xDD75),de + ld (xDD73),hl + push af + pop hl + ld (xDD7F),hl + ret + +;АДРЕС: #0321 работа с микросхемой CMOS (rst 8: db #89) +x0321 call x032A + rst #30 + dw rom5_x1C0D + db %00000101 + jr x0310 + +;АДРЕС: #032A чтение регистров основной программы +x032A ld hl,(xDD73) + ld de,(xDD75) + ld bc,(xDD77) + ld a,(xDD7F+#01) + ret + +;АДРЕС: #0339 установка переменных монитора (rst 8: db #82) +;вх: --- +; +x0339 ld de,x0357 + ld hl,(xDD75) ;регистр de (номер блока переменных) + add hl,de + ld e,(hl) + inc hl + ld d,(hl) ;адрес начала блока переменных + ld hl,(xDD77) ;регистр bc (номер переменной) + add hl,de ;адрес переменной + ld a,(xDD7F) ;регистр f (флаг cy) + rrca + jr c,x0352 ;запись + ld a,(hl) ;чтение + ld (xDD7F+#01),a ;регистр a (результат) + ret +x0352 ld a,(xDD7F+#01) ;запись + ld (hl),a + ret +x0357 dw xE014 ;de =0 + dw xE04E ;de =2 + dw xFFC0 ;de =4 + dw xEAED ;de =6 + +;АДРЕС: #035F вывод символа на экран пользователя (rst 8: db #84) +x035F call x300F ;регистр ix + ld a,(xDD7F+#01) ;регистр a + jp x2B12 ;печать символа + +;АДРЕС: #0368 отключение монитора - отладчика (rst 8: db #85) +;вх: a<>0 +; +x0368 ld (xC063),a + res 7,(iy+#14) + ret + +;АДРЕС: #0370 возврат в отладчик +x0370 push af + jr x0388 + +;АДРЕС: #0373 установка текущим блока дисководов монитора +x0373 push af + ld hl,xE9F5 + ld (xE9F3),hl ;установка блока описателей дисководов + ld hl,xFFDC + set 5,(hl) + ld a,(xE9F1) + call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ + call x0550 ;сохранение экрана из страницы 5 +x0388 ld a,(x00FB) ;проврека страницы + ld hl,xE00D + cp (hl) + call nz,x2BA8 ;это не страница с монитором. короткий звуковой сигнал c установкой бордюра + pop af + pop hl + ld sp,xE336 + jp (hl) ;возврат (ret) + +;АДРЕС: #0398 Запись в регистр 7 AY числа #FF +x0398 bit 0,(iy+#14) + ret nz + ld b,#07 ;чтение регистра #7 AY + call x03B6 + ld (xE004),a + ld a,#FF + +;АДРЕС: #03A7 Запись регистра AY +x03A7 push bc + push af + ld a,b + ld bc,#FFFD + out (c),a + pop af + ld b,#BF + out (c),a + pop bc + ret + +;АДРЕС: #03B6 чтение регистра AY +;вх: b - номер регистра +;вых: a - значение регистра +; +x03B6 push bc + ld a,b + ld bc,#FFFD + out (c),a + nop + in a,(c) + pop bc + ret + +;АДРЕС: #03C2 Восстановление содержимого регистра 7 AY +x03C2 bit 0,(iy+#14) + ret nz + ld b,#07 + ld a,(xE004) + jr x03A7 + +;АДРЕС: #03CE Сохранение регистров и стэка в ram 8 +x03CE ld bc,#1FFD + ld (xDDA7),sp + ld sp,xDD83 + ex af,af' + push af + ex af,af' + push af + exx + push bc + push de + push hl + exx + push bc + push de + push hl + push iy + push ix + ld iy,xE014 + + ld hl,(xDD6D) ;поиск страницы установленной при входе в монитор + ld de,#0200 ;и определение конфигурации 128k/48k +x03F2 ld bc,#7FFD + out (c),e + ld b,#1F + out (c),d ;rom 2, ram 0 + ld a,(#C001) + cp #55 +x0400 jr z,x0412 +x0402 inc e + bit 3,e + jr z,x03F2 + ld e,#00 + bit 4,d + jp nz,x0589 ;не найдено зеленый бордюр и выход + ld d,#12 + jr x03F2 +x0412 ld a,(#C002) + cp #AA + jr nz,x0402 + ld sp,hl ;страница найдена + pop hl + ld (#C001),hl ;восстановим байты на этой странице + ld b,#1F + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + res 1,d + ld (xE012),de + ld a,#15 ;проверим достуна ди память выше 128k + out (c),a ;ram #D + ld hl,(#C001) + ld (#C001),a + ld a,#10 + out (c),a ;ram 8 + ld (#C001),a + ld a,#15 + out (c),a ;ram #D + ld a,(#C001) + ld (#C001),hl + cp #15 + jr z,x0453 ;память доступна + ld a,e ;режим 48k + or #30 + ld e,a +x0453 ld a,#10 + out (c),a ;ram 8 + ld sp,(xDDA7) + ld a,(#5B5C) ;определяем активный экран по переменной bas128k + and %00001000 + bit 5,e + jr nz,x0466 ;only 48k + or e ;scr 5/7 при входе + ld e,a +x0466 ld a,(xE012) + or e + ld (xE012),a + ld hl,(xDD6D) ;коррекция вершины стэка программы + push hl + ld bc,#000B + add hl,bc + ld (xDD6D),hl + pop hl + ld de,xDD99 ;сохранение стэка в ram 8 + call x0753 + + ld hl,(xDDA2) ;адрес возврата + ld (xDD6B),hl + ld hl,(xDDA0) ;регистр af + ld (xDD7F),hl + ld hl,(xDD9E) ;коррекция регистра r + ld a,h + sub #04 + rlca + sla h + rra + ld h,a + ld (xDD83),hl + ld hl,(xDD9B) ;регистр bc + ld (xDD77),hl + ld a,i ;сохраним регистр i + ld (xDD85),a + xor a + ld i,a + ld a,(xDD9D) ;номер rom откуда зашли + ld (xDD86),a + and %00000110 + ld a,(xE012) + jr z,x04B6 + or #10 +x04B6 ld (xE012),a + + ld hl,xE026 + bit 7,(hl) + set 7,(hl) + jr z,x04CD + ld b,#00 +x04C4 ld a,#06 + out (#FE),a + xor a + out (#FE),a + djnz x04C4 +x04CD ret + +;АДРЕС: #04CE восстановление режима Турбо +; +x04CE ld a,(xE02D) + bit 6,a + jr z,x04D9 ;турбо выключено + +;АДРЕС: #04D5 Включение Турбо-режима +; +x04D5 ld b,#7F + jr x04DB + +;АДРЕС: #04D9 Выключение Турбо-режима +; +x04D9 ld b,#1F +x04DB ld c,#FD + in a,(c) + in a,(c) + ret + +;АДРЕС: #04E2 восстановление регистров пользователя +x04E2 ld hl,(xDD75) ;de пользователя + ld (xDD99),hl + ld hl,(xDD77) ;bc пользователя + ld (xDD9B),hl + ld a,(xDD85) ;i пользователя + ld i,a + ld (xDD9D),a + ld hl,(xDD83) ;r и IFFF2 пользователя + ld a,h ;коррекция регистра r + sub #06 + rlca + sla h + rra + ld h,a + ld (xDD9E),hl + ld hl,(xDD7F) ;af пользователя + ld (xDDA0),hl + ld hl,(xDD6B) ;PC пользователя + ld (xDDA2),hl + ld hl,(xDD6D) ;SP пользователя + ld bc,#FFF5 ;bc = -#0B + add hl,bc + ld (xDD6D),hl + ld de,xDD99 + ex de,hl + ld bc,#000B + call x0749 ;восстановление стэка из ram 8 + ld (xDDA7),sp + ld sp,xDD6F + pop ix + pop iy + pop hl + pop de + pop bc + exx + pop hl + pop de + pop bc + exx + pop af + ex af,af' + pop af + ex af,af' + ld sp,(xDDA7) + call x04CE ;восстановление режима Турбо + ld de,(xE012) ;ПЗУ пользователя + ld a,e + ld b,#7F + and #10 + out (c),a + ld b,#1F + ret + +;АДРЕС: #0550 сохранение экрана из страницы 5 +x0550 bit 3,(iy+#12) + ret nz ;экран уже сохранен в ram 8 + jr x055B + +;АДРЕС: #0557 вход в монитор после трассировки команды +x0557 ld sp,(xE38D) + +;АДРЕС: #055B сохранение экрана из страницы 5 +x055B ld hl,xE026 ;сохраняем экран + bit 1,(hl) + ret nz ;запрет на сохранение экрана + set 3,(hl) + or a +x0564 ld bc,#7FFD + ld a,#10 + out (c),a ;ram 8, scr 5 + ld hl,#4000 + ld de,#C069 + jr nc,x0574 ;cy =1/0 восстанавливаем/сохраняем + ex de,hl +x0574 ld bc,#1B00 + ldir + ld bc,#7FFD + ld a,#10 + out (c),a ;ram 8, scr 5 + ret + +;АДРЕС: #0581 восстановление экрана в странице 5 +x0581 bit 1,(iy+#12) ;восстанавливаем экран + ret nz + scf + jr x0564 + +;АДРЕС: #0589 установка зеленого бордюра (индикация ошибки) +; +x0589 ld a,#04 ;зеленый бордюр + out (#FE),a + halt ;ОШИБКА??? должен быть ret после halt + +;АДРЕС: #058E чтение/запись байта в память пользователя +;вх: hl - адрес в памяти +; cy =1/0 запись/чтение +; a - байт для записи +; +x058E jr nz,x05CD ;адрес >=#8000 + ex af,af' + push bc + push de + bit 6,h + jr nz,x05A5 ;адрес [#4000..#7FFF] + ld de,(xE012) ;адрес [#0000..#3FFF] + ld bc,#7FFD + jp xE4CF +;выход +x05A1 pop de + pop bc + ex af,af' + ret +;чтение/запись байта из памяти [#4000..#7FFF] +x05A5 ld de,#5B00 + or a + sbc hl,de + add hl,de + jr nc,x05FB ;адрес [#5B00..#7FFF] + bit 3,(iy+#12) + jr z,x05FB ;экран не сохранен в ram 8 + ld de,#8069 + add hl,de + ld bc,#7FFD + ld a,#10 + out (c),a ;ram 8 + ex af,af' + jr c,x05C3 ;запись + ld a,(hl) +x05C3 ld (hl),a + ex af,af' + and #10 + out (c),a + sbc hl,de + jr x05A1 +;чтение/запись байта из памяти [#8000..#FFFF] +x05CD bit 6,h + jr z,x05FE ;адрес [#8000..#BFFF] + ex af,af' ;адрес >=#C000 + push bc + push de + ld de,(xE012) + ld bc,#7FFD + ld a,e + and #17 + out (c),a + ld a,d + and #10 + or #02 + ld b,#1F + out (c),a ;страница пользователя + ex af,af' + jr c,x05ED ;запись + ld a,(hl) +x05ED ld (hl),a + ex af,af' + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + jr x05A1 +x05FB pop de ;адрес [#5B00..#7FFF] + pop bc + ex af,af' +x05FE jr c,x0601 ;запись + ld a,(hl) +x0601 ld (hl),a + ret + +;АДРЕС: #0603 копирование памяти с #8000 в страницу пользователя +x0603 scf + jr x0607 + +;АДРЕС: #0606 копирование страницы пользователя в #8000 +;вх: a - номер страницы +x0606 or a +x0607 ex af,af' + push de + ld l,#05 ;номер логической страницы + call x3707 ;сравнение страницы пользователя с заданной + jr z,x0644 ;страница совпадает +;сохранение/восстановление страницы пользователя +x0610 ld de,(xE012) + ld bc,#7FFD + ld a,e + and #17 + out (c),a + ld a,d + and #10 + or #02 + ld b,#1F + out (c),a ;rom 2, ram пользователя + ld hl,#C000 + ld de,#8000 + ld bc,#4000 + ex af,af' + jr nc,x0632 + ex de,hl +x0632 ex af,af' + ldir + ld bc,#1FFD + ld a,#12 + out (c),a + ld b,#7F + ld a,#10 + out (c),a ;rom 2, ram 8 + pop de + ret +;сохранение/восстановление 5й страницы +x0644 ld hl,#4000 + ld de,#8000 + ld c,l + ld b,h + ex af,af' + jr nc,x0650 + ex de,hl +x0650 ex af,af' + ldir + ld hl,xC069 ;копируем экран + ld de,#8000 + ld bc,#1B00 + ex af,af' + jr nc,x0660 + ex de,hl +x0660 ex af,af' + ldir + pop de + ret + +;АДРЕС: #0665 включение режима 48k only +x0665 ld bc,#7FFD + ld a,#30 + out (c),a + ret + +;АДРЕС: #066D повторная инициализация страниц (если битая) +x066D ld a,#04 + out (#FE),a + halt ;зеленый бордюр + +;АДРЕС: #0672 инициализация ram 8 (вход при холодном сбросе) +x0672 ld iy,xE014 ;блок переменных + call x04D5 ;включим Турбо-режим +;очистка всех страниц памяти + ld bc,#1FFD + ld a,#12 + out (c),a ;rom 2 + ld a,#18 + jr x0691 +x0684 ld hl,#C000 ;очистка страницы + ld (hl),#00 + ld de,#C001 + ld bc,#3FFF + ldir +x0691 dec a ;очистка страниц #0F-#09 + ld bc,#7FFD + out (c),a + cp #10 + jr nz,x0684 + xor a ;очистка части 8й страницы + ld hl,#C069 ;#C000-#C068 не очищаются + push hl + ld (hl),a + ld de,xC069+1 + ld bc,#3F96 + ldir + pop hl +x06AA cp (hl) ;проверка целостности ram 8 страницы + inc hl + jr nz,x066D ;если битая, зеленый бордюр и тест сначала + cp h + jr nz,x06AA +;копирование блока атрибутов меню монитора в ram8 + ld hl,x3ED2 ;закодированный блок атрибутов меню монитора + ld de,xEAED ;блок атрибуты для монитора + call x3837 ;копирование блока памяти ram 8 с раскодированием + db #DD + db #2A + db #08 ;длина + db #F5 ;адрес байта для раскодирования +;копирование процедур переключения страниц в ram 8 + call x0739 ;копирование части закодированных процедур в ram 8 с раскодированием + ld bc,#0100 + ldir + rst #30 + dw rom7_x0CFF ;установка переменных дисковой BIOS + db #07 + rst #30 + dw rom4_x057F ;распаковка шрифта в rom 8 + db #04 + rst #30 + dw rom4_x0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD + db #04 + call x3B7F ;установка переменных по конкретным адресам + ld (iy+#08),#30 ;для перевода времени в ASCII =#30 +;формирование строки с версией монитора + ld hl,xE17B+#02 + res 7,(hl) + inc hl + ld (xE3BC),hl + set 6,(iy+#09) ;для п/п печати: чтение данных после управляющего кода + ld c,#00 + call x0732 ;установка координат печати crdY=#00, crdX=#24 + rst #20 + dc "N" + ld l,#F4 + ld h,c + ld a,(hl) + db #ED,#6C ;neg + inc hl + ld h,(hl) + ld l,a ;hl=#CACB + call x16DE ;печать числа hl=[#0000..#FFFF] + ld c,#01 + call x0732 ;установка координат печати crdY=#01, crdX=#24 + ld e,#FC + ld d,c + dec d ;de=#00FC + ld a,(de) ;a=#05 + inc de + push de ;de=#00FD + ld b,#02 + call x1658 ;печать числа A с предварительным пробелом + rst #20 + dc "-" + pop de + ld a,(de) ;a=#07 + ld b,#02 + call x1658 ;печать числа A с предварительным пробелом + ld c,#02 + call x0732 ;установка координат печати crdY=#02, crdX=#24 + rst #20 + dc "V" + rst #20 + dc "4." + rst #20 + dc "01" + ld hl,(xE3BC) + dec hl + set 7,(hl) + res 6,(iy+#09) + call x1F25 ;Команда: CLear + ld hl,x3135 + ex (sp),hl + jp (hl) + +;АДРЕС: #0732 установка координат печати crdY=рег C, crdX=#24 +x0732 rst #20 + db #9B ;признак передачи координат печати + ld a,c + rst #10 ;crd Y + rst #20 + db #A4 ;crd X=#24 + ret + +;АДРЕС: #0739 копирование части закодированных процедур в ram 8 с раскодированием +x0739 ld hl,x3B92 + ld de,xE3BE + call x3837 ;копирование блока памяти ram 8 с раскодированием + db #DD + db #E9 + db #6F ;длина + db #F4 ;адрес в ПЗУ + ret + +;возврат из п/п x0749 +x0747 ex de,hl + ret + +;АДРЕС: #0749 восстановление области памяти из ram 8 +;вх: hl - начало области +; de - адрес буфера для сохранения +; bc - размер для сохранения +; cy =1/0 восстановление/сохранение +; +x0749 scf ;cy =1 восстановление + ex de,hl + exx + ld hl,x0747 + push hl + exx + jr x0754 + +;АДРЕС: #0753 сохранение области памяти в ram 8 +;вх: hl - начало области +; de - адрес буфера для сохранения +; bc - размер для сохранения +; +x0753 or a ;cy =0 сохранение +;восстановление стэка из буфера в ram 8 +x0754 ex af,af' + bit 7,h + jr nz,x079D ;вершина стэка >= #8000 + bit 6,h + jr nz,x0775 ;вершина стэка >= #4000 + push hl ;вершина стэка < #4000 + add hl,bc + dec hl + bit 6,h + pop hl + jp z,x07F1 ;весь стэк в пределах [#0000..#3FFF] + push bc + ld bc,#4000 + ex de,hl + ex (sp),hl + call x07E0 + ex (sp),hl + ex de,hl + call x07F1 ;сохранение стэка из окна [#0000..#3FFF] + pop bc + +;сохранение стэка из окна [#4000..#7FFF] +x0775 push hl + call x07D7 ;проверка попадания стэка на экран + pop hl + jr nc,x07A1 ;стэк не на экране + bit 3,(iy+#12) + jr z,x07A1 ;копируем из памяти + push hl ;копируем из области сохраненного экрана + add hl,bc + dec hl + call x07D7 + pop hl + jp c,x0807 ;весь стэк в пределах [#4000..#5AFF] + push bc + ld bc,#5B00 + ex de,hl + ex (sp),hl + call x07E0 + ex (sp),hl + ex de,hl + call x0807 + pop bc + jr x07A1 + +;сохранение стэка из окна [#8000..#FFFF] +x079D bit 6,h + jr nz,x07BC ;вершина стэка >= #C000 +;сохранение стэка из окна [#5B00..#BFFF] +x07A1 push hl + add hl,bc + dec hl + ld a,h + and #C0 + cp #C0 + pop hl + jp nz,x07FC ;весь стэк в пределах [#8000..#BFFF].сохраняем + push bc + ld bc,#C000 ;вычисление размера стэка до #C000 + ex de,hl + ex (sp),hl + call x07E0 + ex (sp),hl + ex de,hl + call x07FC ;сохраняем часть стэка + pop bc +x07BC push hl ;сохранение стэка из окна [#С000..#FFFF] + add hl,bc ;проверим не выходит ли стэк за пределы окна + dec hl + bit 6,h + pop hl + jp nz,x0821 ;стэк за пределы окна не выходит + push bc ;стэк выходит за пределы #FFFF + ld bc,#0000 + ex de,hl + ex (sp),hl + call x07E0 + ex (sp),hl + ex de,hl + call x0821 + pop bc + jp x07F1 + +;проверка адреса на принадлежность экрану +x07D7 push de + ld de,#5B00 + or a + sbc hl,de + pop de + ret + +;вычисление размеров на границе окон памяти +;вых: hl = hl-(bc-de) +; bc = bc-de +x07E0 ex de,hl + or a + push hl + ld l,c + ld h,b + pop bc + sbc hl,bc + push bc + ld c,l + ld b,h + pop hl + ex de,hl + or a + sbc hl,bc + ret + +;сохранение стэка из окна [#0000..#3FFF] +x07F1 exx + ld de,(xE012) ;страница при входе + ld bc,#7FFD + jp xE4F0 + +;сохранение стэка из памяти +x07FC ex af,af' + jr nc,x0800 + ex de,hl +x0800 ldir + jr nc,x0805 + ex de,hl +x0805 ex af,af' + ret + +;сохранение стэка из копии окна [#4000..#5AFF] +x0807 push bc + ld bc,#8069 ;адрес в копии экрана + add hl,bc + pop bc + push hl + ld hl,x081A ;адрес возврата + ex (sp),hl + push iy + ld iy,#1010 ;rom 1, ram 8, scr 5 + jr x0827 +x081A push bc + ld bc,#7F97 ;-#8069 + add hl,bc + pop bc + ret + +;сохранение стэка из окна [#C000..#FFFF] +x0821 push iy + ld iy,(xE012) ;номер страницы при входе +x0827 push hl + ld hl,(#8000) + ex (sp),hl ;сохраним (#8000/1) + push ix + ld xh,b + ld xl,c + exx + ld bc,#7FFD + ld a,#10 + out (c),a ;ram 8 + ld b,xh + ld c,xl + ld hl,#8002 + ld de,xDB69 + ldir + ld hl,#1210 ;сохраним/восстановим область памяти + ld a,yl + and %00010111 + ld e,a + ld a,yh + and %00010000 + or %00000010 + ld d,a ;de = rom 2, ram при входе + ex af,af' + jr nc,x0859 ;сохраняем + ex de,hl +x0859 ld bc,#7FFD + out (c),e + ld b,#1F + out (c),d + exx + jr nc,x0866 ;сохраняем + ex de,hl +x0866 ld (#8000),de + ld de,#8002 + ldir ;сохраним/восстановим стэк/память + ld de,(#8000) + ld b,xh + ld c,xl + exx + out (c),h + ld b,#7F + out (c),l ;меняем страницу + exx + ld (#8000),hl + ld hl,#8002 + ldir + ld hl,(#8000) + jr nc,x088D ;сохраняем + ex de,hl +x088D ex af,af' + exx + ld a,#10 + out (c),a + ld b,#1F + ld a,#12 + out (c),a ;rom 2, ram 8 + ld hl,xDB69 ;восстанавливаем память + ld de,#8002 + ld b,xh + ld c,xl + ldir + ld bc,#7FFD + ld a,#10 + out (c),a + exx + pop ix + ex (sp),hl + ld (#8000),hl + pop hl + pop iy + ret + +;АДРЕС: #08B7 таблица с адресами обработки функций rst 8 +x08B7 dw x0911 ;rst 8: db #80 Вывод символа из аккумулятора на принтер + dw x02F4 ;rst 8: db #81 Вызов фунций встроенной дисковой BIOS + dw x0339 ;rst 8: db #82 установка переменных монитора + dw x2A5B ;rst 8: db #83 очистка окна пользователя + dw x035F ;rst 8: db #84 Вывод символа на экран пользователя + dw x0368 ;rst 8: db #85 Отключение монитора - отладчика + dw x08D3 ;rst 8: db #86 Копия графического экрана на принтер + dw x02D1 ;rst 8: db #87 Установка двойной скорости + dw x02D7 ;rst 8: db #88 Установка обычной скорости + dw x0321 ;rst 8: db #89 Работа с микросхемой CMOS + dw x02EB ;rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! + dw x02AA ;rst 8: db #8B загрузка zs-snap с диска (без возврата) + dw x02CC ;rst 8: db #8C автостарт с дискеты + dw x02AE ;rst 8: db #8D хрень какая-то непонятная + +;АДРЕС: #08D3 rst 8: db #86 Копия графического экрана на принтер +x08D3 xor a + scf + jr x08D8 + +;АДРЕС: #08D7 печать текущего меню монитора +x08D7 xor a +x08D8 ld hl,x08F7 ;адрес возврата по Break + ld (xDE12),hl + ld hl,(xE3B7) ;адрес дескриптора текущего окна + push hl + call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер + push af + ld (xDDA7),sp + set 4,(iy+#09) ;вместо экрана вывод на принтер + call nc,x3A21 ;копирование активного экрана пользователя в #4000 + call x0A51 ;печать экрана на принтер + pop af + jr x08FE + +;возврат по Break +x08F7 ld sp,(xDDA7) + pop af + ld a,#01 + +;вх: a =#00/#01 +x08FE ld hl,xE01D + res 4,(hl) ;вывод на экран + res 5,(hl) + pop ix + ld (xE3B7),ix ;восстановим адрес дескриптора окна + ret nc ;печать текущего меню монитора + or a + jr z,x0937 ;успешно напечатали + jr x091E ;выход по Break + +;АДРЕС: #0911 rst 8: db #80 Вывод символа из аккумулятора на принтер +x0911 ld hl,x091A + ld (xDDA7),sp + jr x0929 +;возврат по Break +x091A ld sp,(xDDA7) +x091E ld a,#01 ;новые флаги программы cy=1 + jr x0939 + +;АДРЕС: #0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) +x0922 ld hl,#0146 ;выход из монитора + push hl + ld hl,#0941 +x0929 ld (xDE12),hl ;прерывание по Break + call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер + set 4,(iy+9) ;вывод на принтер + ld a,(xDD7F+#01) ;регистр a программы + rst #10 +x0937 ld a,%01000000 ;новые флаги программы Z +x0939 ld (xDD7F),a +x093C res 4,(iy+9) ;вывод на экран + ret +;прерывание по Break +x0941 ld sp,xE336 + call x093C + ld hl,#05E2 + ld (xDD6B),hl + jp x0146 + +;АДРЕС: #0950 вывод символа на принтер +;вх: ix - адрес дескриптора окна +; a - код символа/управляющий код +x0950 bit 5,(iy+9) + jr nz,x09A9 ;есть управляющие коды + cp #0D + jr nz,x0987 ;это не перевод строки + ld (ix+#01),#00 ;crd X =#00 + call x0A05 ;передача кода "возврата каретки" для принтера + bit 2,(ix+#07) + jr z,x0970 ;выполнять автоматический перевод строки при приходе символа возврат каретки + ld a,(xE055) ;код символа "перевода строки" для принтера + or a + jr z,x0970 + call x09A9 ;перевод строки на принтере +; перевод строки, если вышли за пределы окна +x0970 ld a,(ix+#04) + or a + ret z ;высота окна в знакоместах + inc (ix+#00) + cp (ix+#00) + ret nc + ld (ix+#00),#00 + ld a,(xE056) ;код символа "перевода формата" для принтера + or a + ret z + jr x09A9 + +;печать символа на принтере +;вх: a - код символа/управляющий код +x0987 cp #20 + jr c,x09A9 ;это управляющий код + cp #7F ;коррекция печатного символа + jr nz,x0991 + ld a,#2E ;"." +x0991 ld e,a +; возврат каретки, если вышли за пределы окна + ld a,(ix+#05) ;ширина окна в знакоместах + or a + jr z,x09A8 + inc (ix+#01) ;crd X +1 + cp (ix+#01) + jr nc,x09A8 + push de ;перевод строки + rst #20 + db #8D + pop de + xor a + ld (ix+#01),a ;crd X =#00 +x09A8 ld a,e + +;печать символа на принтере +;вх: a - код символа/управляющий код +x09A9 ld d,(iy+#15) + bit 7,d + jr z,x09B1 ;positive + cpl +x09B1 bit 0,d + jr z,x0A10 ;Centronics +;интерфейс RS232 + push af + xor #FF + rlca + rlca + rlca + push af + call x04D9 ;выключение Турбо-режима + pop bc + ld c,b ;символ для печати +; ожидание готовности??? +x09C1 call x0A33 ;проверка нажатия BREAK + jr nc,x0A2F ;нажат BREAK + ld a,#FF + in a,(#FE) + bit 5,a + jr z,x09C1 ;ожидание готовности??? +; побитовая передача кода символа + ld b,#08 + bit 2,d + jr z,x09D5 ;data bits 8 + dec b +x09D5 push bc + ld bc,#1FFD + ld a,%00011010 + out (c),a + pop bc +x09DE call x0A3F ;задержка при передаче данных на принтер + push bc + ld a,c + ld bc,#1FFD + and %00001000 + or %00010010 + out (c),a + pop bc + rrc c + djnz x09DE +; завершение печати + call x0A3F ;задержка при передаче данных на принтер + ld bc,#1FFD + ld a,%00010010 + out (c),a + call x0A3F ;задержка при передаче данных на принтер + bit 3,d ;stop bits 2/1 + call z,x0A3F ;задержка при передаче данных на принтер + pop af + ret + +;передача кода "возврата каретки" для принтера +x0A05 ld a,(xE054) ;код символа "возврата каретки" для принтера + or a + ret z + push bc + call x09A9 + pop bc + ret + +;интерфейс Centronics +x0A10 ld c,a +x0A11 call x0A33 ;проверка нажатия BREAK + jr nc,x0A2F ;нажат + ld a,#FF + in a,(#FE) + rlca + jr c,x0A11 ;ожидание готовности??? + ld a,c ;вывод символа на принтер + ld bc,#FFDD + out (c),a + ld bc,#1FFD + ld a,%00110010 + out (c),a + ld a,%00010010 + out (c),a + ret + +;прерывание по Break +x0A2F ld hl,(xDE12) + jp (hl) + +;АДРЕС: #0A33 проверка нажатия BREAK +;вых: cy=0 нажат BREAK +; +x0A33 ld a,#7F ;проверка нажатия пробела + in a,(#FE) + rra + ret c ;не нажат + ld a,#FE ;проверка нажатия CapsShift + in a,(#FE) + rra + ret + +;задержка при передаче данных на принтер +x0A3F push af + ld hl,(xE057) + bit 1,d + jr z,x0A4A + ld hl,(xE059) +x0A4A dec hl + ld a,h + or l + jr nz,x0A4A + pop af + ret + +;АДРЕС: #0A51 печать экрана на принтер +x0A51 ld bc,#0000 +x0A54 set 5,(iy+#09) ;прочие управляющие коды + +;режим печати +x0A58 bit 5,(iy+#15) ;режим печати + ld a,#01 + jr z,x0A62 ;одна точка + ld a,#03 +x0A62 ld (xE05B+#06),a +;передача управляющих кодов + push bc + ld hl,xE05B ;список кодов для перевода принтера в графический режим + call x0AD2 ;передача кодов на принтер + pop bc +;печать строчки экрана +x0A6D push bc + bit 5,(iy+#15) + ld d,#08 + jr z,x0A78 + ld d,#04 +;печать одного байта +x0A78 push bc +; расчет экранного адреса из пиксельных координат + ld a,b + and a + rra + scf + rra + and a + rra + xor b + and #F8 + xor b + ld h,a + ld a,c + rlca + rlca + rlca + xor b + and #C7 + xor b + rlca + rlca + ld l,a ;hl - адрес + ld a,c + and #07 +; получение байта для печати + ld b,a + inc b + ld a,(hl) +x0A96 rlca + djnz x0A96 + push af + rl e + pop af + bit 5,(iy+#15) ;режим печати + jr z,x0AA5 ;одна точка + rl e +x0AA5 pop bc + inc b + dec d +x0AA8 jr nz,x0A78 ;e - байт для печати +; установка positive/negative + ld a,e +x0AAB bit 2,(iy+#12) + jr z,x0AB2 ;печать positive/negative + cpl +; печать байта +x0AB2 rst #10 + bit 5,(iy+#15) + jr z,x0ABB ;режим печати одна точка + rst #10 + rst #10 +x0ABB inc c + ld a,c + jr z,x0AC3 + pop bc + ld c,a + jr x0A6D +x0AC3 pop de +;следующая строка +x0AC4 res 5,(iy+#09) + rst #20 + dc #8D + ld a,#BF + cp b + jr nc,x0A54 +;первод в текстовый режим и выход + ld hl,xE063 ;список кодов для перевода принтера в текстовый режим + +;передача кодов на принтер +x0AD2 ld b,(hl) + inc hl + jp x15B3 + +;АДРЕС: #0AD7 Команда: EXit выход из отладчика в меню +x0AD7 res 0,(iy+#12) + rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 + ret + +;АДРЕС: #0AE0 печать/обновление окна отладчика +;вх: a - номер сообщения для печати над строкой ввода +x0AE0 ld (iy+#0A),#00 + push af + call x2CA8 ;печать/обновление монитора-отладчика + pop af + jr x0B06 + +;АДРЕС: #0AEB вызов отладчика M. Monitor +x0AEB ld sp,xE336 + set 0,(iy+#12) + +;АДРЕС: #0AF2 полное обновление окна отладчика +x0AF2 call x04D5 ;включение Турбо-режима + xor a + ld (xE01E),a ;настройки отладчика + jr x0AFC + +;АДРЕС: #0AFB обновление окна отладчика, без информационного окна +x0AFB scf +x0AFC push af + call x2CA8 ;печать/обновление монитора-отладчика + pop af + call nc,x33CD ;печать информационного окна отладчика + ld a,#81 ;сообщение: enter command + +;АДРЕС: #0B06 ввод и обработка команды отладчика +x0B06 ld sp,xE336 + call x0550 ;сохранение экрана из страницы 5 + ld hl,x0B06 ;сюда вернемся + push hl + rst #30 ;ввод команды отладчика + dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана + db #05 + jr nc,x0B40 ;команду ввели + call x2C7E ;поиск и вызов процедуры обработки клавиши без возврата(если не найдено возврата) + db #87 ;cs+3 + dw x303C ;выполнение команды, на которую указывает PC + db #88 ;cs+4 + dw x303F ;выполнение команды с быстрым выполнением подпрограмм + db #89 ;cs+9 + dw x1019 ;пропуск программы, содержание регистра PC увеличивается на длину текущей команды (сама команда не выполняется) + db #8A ;ss+a + dw x0FFF ;на следующую команду (если команда не выполняется) + db #1C ;ss+q + dw x0FF5 ;на один байт влево + db #1E ;ss+e + dw x0FFA ;на один байт вправо + db #1D ;ss+w + dw x0FEB ;на одну строку вверх + db #8B ;ss+s + dw x0FF0 ;на одну строку вниз + db #8C ;ss+f + dw x3517 ;продолжение поиска в отладчике (для команд FIND/SEARCH) + db #8E ;ss+d + dw x38D8 ;быстрый вход в команду DASM + db #8D ;ss+g + dw x3655 ;переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти + db #04 ;cs+1+d + dw x1101 ;редактирование дампа памяти + db #FF + xor a + ret +;анализ введенной команды +;hl - введенная строка +x0B40 call x0EE3 ;поиск в буфере ввода строки первого печатного символа + ld e,#00 + cp #0D + jp z,x0AF2 ;пустая строка. полное обновление окна отладчика + cp "[" + jr z,x0B56 ; + cp "(" + jr nz,x0B59 + ld e,#04 + jr x0B58 +x0B56 ld e,#84 +x0B58 inc hl +x0B59 ld (iy+#00),e + bit 2,e + jr nz,x0BCC ;команда начинается со скобки + +;определение кода команды (для установки регистров и переменной MEM) + ld de,x0FA5 + ld bc,x0F66 + call x0F2E ;определение кода команды по введенной строке + jp z,x0C0F ;выполнение введенной команды + ex de,hl ;de адрес введенной строки + cp #21 + jr nc,x0B7D ;регистр R или I + cp #0D + jr nc,x0B7E ;8 бит регистр + set 3,(iy+#00) ;16 бит регистр + sla c + jr x0B82 +x0B7D inc bc +x0B7E ld a,c + sub #07 + ld c,a ;bc смещение до регистра пользователя +;присвоение значения, если есть знак = +x0B82 ld a,(de) + cp #3D ;= + jp nz,x0C0F ;выполнение введенной команды + inc de + ex de,hl ;hl адрес введенной строки + push bc + call x0EBA ;выделение из строки числовых операндов (не более 6) + pop bc ;de значение операнда + cp #01 + ld a,#0A ;сообщение: too few operands + ret c ;ошибка. нет операндов + ld a,#0B ;сообщение: too many operands + ret nz ;ошибка. слишком много операндов + bit 2,(iy+#00) + jr nz,x0BF0 ;есть незакрытая скобка + ld hl,xDD69 + add hl,bc ;адрес регистра пользователя + bit 3,(iy+#00) + jr nz,x0BB1 ;16 бит значение команды +; 8 бит значение команды + ld a,d + or a + jr nz,x0BC9 ;ошибка: out of range + call x0EAA ;установка флагов обновления: регистров + ld (hl),e + jr x0BC6 +; 16 бит значение команды +x0BB1 ld a,c + cp #02 + jr nz,x0BBA ;это не регистр PC + res 6,(iy+#0A) ;обновить дизассемблер в мониторе +x0BBA or a + push af ;a=#00 это указатель MEM + call z,x0EB1 ;обновить дамп памяти и обновлять дизассемблер памяти + pop af + call nz,x0EAA ;обновить регистры + ld (hl),e + inc hl + ld (hl),d +x0BC6 jp x0AFB ;обновление монитора-отладчика +;ошибка +x0BC9 ld a,#0C ;сообщение: out of range + ret + +;вычисление значения операнда в скобках +;вх: hl - адрес введенной строки (начало операнда) +x0BCC call x0C98 ;вычисление значения в введенной строке + ret c ;ошибка в строке: operand not found + ex de,hl ;hl - вычисленное значение + ld c,l + ld b,h + ld a,(de) + inc de + ld hl,xE014 + cp #29 ;) + jr z,x0BE9 + cp #5D + jp nz,x0C0F ;выполнение введенной команды +; закрытие скобки ] + bit 7,(hl) + jr z,x0BED ;ошибка: invalid type brackets + set 3,(hl) + jr x0B82 ;присвоение значения, если есть знак = +; закрытие скобки ) +x0BE9 bit 7,(hl) + jr z,x0B82 ;присвоение значения, если есть знак = +; ошибка: invalid type brackets +x0BED ld a,#15 + ret +;есть незакрытая скобка +x0BF0 bit 3,(iy+#00) + ld l,c + ld h,b + jr nz,x0C08 ;16 бит значение команды +; 8 бит значение команды + ld a,d + or a + jr nz,x0BC9 ;ошибка: out of range + ld a,e + rst #00 ;запись байта в память пользователя +; обновить все значения в отладчике +x0BFE ld a,(xE01E) + and #81 + ld (xE01E),a + jr x0BC6 ;обновление монитора-отладчика +; 16 бит значение команды +x0C08 ld a,e + rst #00 ;запись байта в память пользователя + inc hl + ld a,d + rst #00 ;запись байта в память пользователя + jr x0BFE ;обновить все значения в отладчике + +;выполнение введенной команды +x0C0F ld hl,xE11E + ld b,#03 +x0C14 ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld (xDDA7),de ;de - адрес таблицы с адресами процедур обработки команды + ld a,e + or d + jr z,x0C32 ;ошибка: command not found + ld e,(hl) + inc hl + ld d,(hl) + inc hl ;de - адрес списка команд + push hl + push bc + call x0EE3 ;поиск в буфере ввода строки первого печатного символа + call x0EF0 ;поиск заданной команды в списке + jr nz,x0C37 ;команда найдена + pop bc + pop hl + djnz x0C14 +; ошибка: command not found +x0C32 ld a,#16 ;сообщение: command not found + jp x0B06 ;полное обновление окна отладчика +;команда найдена. выполнение команды +x0C37 pop de + ex (sp),hl ;(sp) следующий адрес в строке + add a,c + add a,c + ld c,a ;*3 + ld hl,(xDDA7) ;hl - адрес таблицы с адресами процедур обработки команды + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) ;de - процедура обработки команды + inc hl + ld c,(hl) ;c - флаги команды + pop hl ;следующий адрес в строке + push de + bit 7,c + jr nz,x0C67 ;проверка корректности команды. в параметрах команды есть строка + bit 5,c + ret nz ;переход на обработку команды + push bc + call x0EBA ;выделение из строки числовых операндов (не более 6) + pop bc ;de - первый операнд, hl - второй операнд, a - количество операндов [0..5] + bit 6,c + jr nz,x0C62 ;переход на обработку команды + cp c + jr z,x0C62 ;количество прочитанных операндов совпадает + ld a,#0A ;ошибка: too few operands + jr c,x0C5F ;введено меньше операндов чем надо + inc a ;ошибка: too many operands +x0C5F jp x0B06 ;полное обновление окна отладчика +x0C62 ld bc,(xDD9D) ;bc - третий операнд + ret ;переход на обработку команды + +;проверка строки команды (в параметрах команды есть строка) +;вых: b - количествор параметров в строке +x0C67 ld b,#00 + push hl +x0C6A dec c + bit 7,c + jr nz,x0C73 ;это еще числовое значение + set 1,(iy+#00) ;читаем из параметров строку +x0C73 bit 1,(iy+#00) + push bc + jr nz,x0C7F ;читаем из параметров строку + call x0C98 ;читаем из параметров число + jr x0C82 +x0C7F call x0D55 ;читаем из параметров строку +x0C82 pop bc + jr z,x0C8A ;прочитано без ошибок + jp nc,x0B06 ;полное обновление окна отладчика +; конец строки команды + pop hl + ret ;переход на обработку команды +x0C8A inc b + bit 7,c + jr nz,x0C6A ;прочитан числовой операнд + ld a,d + or a + jr z,x0C6A + ld a,#0C ;ошибка: out of range + jp x0B06 ;полное обновление окна отладчика + +;АДРЕС: #0C98 чтение числового операнда из строки команды +;вх: hl - адрес введенной строки +;вых: de - вычисленное значение +; hl - следующий адрес в введенной строке +; nz - были ошибки +; cy=1 - ошибка в строке: operand not found +x0C98 dec hl +x0C99 inc hl + call x0D42 ;проверка символа в (hl) пробел , ; #00 #0D + jr nz,x0CA7 ;cy=1 символ =#00/#0D + jr nc,x0C99 + xor a + inc a + ld a,#12 ;сообщение: operand not found + scf + ret +x0CA7 ld (iy+#0F),#00 ;количество незакрытых скобок +x0CAB ld de,#0000 ;базовое число (к нему будем прибавлять/отнимать) + push de +;проверка знака в строке + ld d,#2B ;"+" + ld a,(hl) + call x0D38 ;проверка A = "+" или "-" + jr nz,x0CB9 + inc hl +x0CB8 ld d,a ;знак +/- +;проверка открыия скобки +x0CB9 push de + ld a,(hl) + cp #28 ;( + jr z,x0CC3 + cp #5B ;[ + jr nz,x0CCC +x0CC3 inc hl + inc (iy+#0F) + pop de + ld e,a ;открытая скобка ( или [ + push de + jr x0CAB ;скобка открыта, читаем следующий символ +;выделение числа из строки по адресу в hl +x0CCC call x0D55 ;z a =#00 успешно -> de - число + jr nz,x0CF8 ;не число. в a - сообщение об ошибке. полное обновление окна отладчика +;вычисление суммы/разности чисел +;de - число +x0CD1 pop af ;знак операции +/- + ex (sp),hl ;второе число + cp #2D ;- + jr z,x0CDA + add hl,de + jr x0CDD +x0CDA or a + sbc hl,de +x0CDD ex (sp),hl +;проверка знака в строке + ld a,(hl) + inc hl + call x0D38 ;проверка A = "+" или "-" + jr z,x0CB8 ;повторим сложение/вычитание + cp #29 ;) + jr z,x0CFB ;закроем скобку ) + cp #5D ;] + jr z,x0D0E ;закроем скобку ] + dec hl + xor a + cp (iy+#0F) + jr nz,x0CF6 ;лишняя скобка + pop de + ret +x0CF6 ld a,#13 ;сообщение: quit operand not found +x0CF8 jp x0B06 +;закроем скобку ) +x0CFB pop de ;полученное число + call x0D22 ;уменьшим количество незакрытых скобок + pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая + push af + ld a,#15 ;сообщение: invalid type brackets + jr c,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика +; чтение байта из памяти пользователя + push hl + ex de,hl + rst #28 ;чтение байта из памяти пользователя + ld e,a + ld d,#00 + pop hl + jr x0CD1 ;продолжим анализ +;закроем скобку ] +x0D0E pop de + call x0D22 ;уменьшим количество незакрытых скобок + pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая + push af + ld a,#15 ;сообщение: invalid type brackets + jr nc,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика +; чтение слова из памяти пользователя + push hl + ex de,hl + rst #28 ;чтение байта из памяти пользователя + ld e,a + inc hl + rst #28 ;чтение байта из памяти пользователя + ld d,a + pop hl + jr x0CD1 ;продолжим анализ +;уменьшим количество незакрытых скобок +x0D22 xor a + cp (iy+#0F) + jr z,x0D2C ;нет открытых скобок + dec (iy+#0F) + ret +x0D2C bit 2,(iy+#00) + ld a,#14 ;сообщение: too many > + jr z,x0CF8 ;ошибка. много скобок + pop bc + dec hl + xor a + ret + +;проверка A = "+" или "-" +x0D38 cp #2B ;+ + ret z + cp #2D ;- + ret + +;АДРЕС: #0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) +;вых: z - это разделитель +; cy=1 это конец строки +x0D3E ld a,(hl) + cp #3A ;: + ret z + +;АДРЕС: #0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D +;вых: z - это разделитель +; cy=1 это конец строки +x0D42 ld a,(hl) + cp #20 ;" " + ret z + +;АДРЕС: #0D46 проверка символа в (hl) #2C/#3B/#00/#0D +;вых: z - это разделитель +; cy=1 это конец строки +x0D46 ld a,(hl) + cp #2C ;"," + ret z + cp #3B ;";" + ret z + or a + scf + ret z + cp #0D + ret nz + scf + ret + +;АДРЕС: #0D55 чтение из строки команды чилового/байта строкового значения +;вх: hl - адрес введенной строки (начало параметра команды) +;вых: nz - ошибка. в A - код ошибки +; cy=1 синтаксическая ошибка +; z a =#00 успешно -> de - число +; hl - адрес начала следующего слова в введенной строке +x0D55 bit 0,(iy+#00) + ld a,#10 + ld (xE024),a ;делитель для выделения разряда числа + jr nz,x0D74 ;анализ строки после кавычек +;поиск значимого символа в строке + dec hl +x0D61 inc hl + res 0,(iy+#00) + call x0D42 ;проверка символа в (hl) z -> пробел , ; #00 #0D + jr nz,x0D6F ;cy=1 символ =#00/#0D + jr c,x0DA6 ;ошибка: syntax error + jr x0D61 +x0D6F cp #22 ;" + jr nz,x0DAC ;не кавычки. чтение числа из введенной строки +;анализ строки в кавычках (допустим только один символ чило=код символа) + inc hl +x0D74 ld a,(hl) + cp #0D + jr z,x0DA2 ;конец строки. ошибка: bad string + cp #22 ;" + jr z,x0D9C ;кавычки закрыли + ld e,a + ld d,#00 ;код символа из строки + bit 1,(iy+#00) + jr nz,x0D8E ;параметр =строка + inc hl + ld a,#22 ;" + cp (hl) + jr nz,x0DA2 ;ошибка: bad string + jr x0D92 +; читаем параметр-строку +x0D8E set 0,(iy+#00) +; выход +x0D92 inc hl + xor a + ld (xE024),a + ret +;ошибка: known number + ld a,#0D ;сообщение: known number + or a + ret +;кавычки закрыли +x0D9C bit 1,(iy+#00) + jr nz,x0D61 ;параметр-строка. +;ошибка: bad string +x0DA2 ld a,#0E ;сообщение: bad string + or a + ret +;ошибка: syntax error +x0DA6 xor a + inc a + ld a,#0F ;сообщение: syntax error + scf + ret + +;чтение числа из введенной строки +;вх: hl - адрес строки +;вых: z a =#00 успешно -> de - число +; nz a =#10 не число. сообщение: not number +; nz a =#11 результат более 16 бит. сообщение: number too big +; hl - адрес начала следующего слова в введенной строке +x0DAC ld de,x0FA0 + ld bc,x0F41 + call x0F2E ;определение кода команды по введенной строке + jr nz,x0DBD ;команда(регистр) найдена в списке + call x0DF4 ;преобразование строки в число + ret z + or a + ret +x0DBD ld de,#0001 + ld a,c + or a + ret z ;ON -> de=#0001, a=#00 + dec de + dec a + ret z ;OFF -> de=#0000, a=#00 + push hl + ld hl,xDD83+#01 ;адрес регистра R пользователя + ld a,c + sub #23 + jr nc,x0DE4 ;регитр R или I + ld hl,xDD6F ;начало списка регистров ползьзователя + ld a,c + sub #0F + jr nc,x0DE4 ;регистр 8 bit +; 16 бит регистр + dec bc + dec bc + ld hl,xDD6F-#06 + add hl,bc + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) +x0DE1 pop hl + xor a + ret +; 8 бит регистр +x0DE4 add a,l + ld l,a + jr nc,x0DE9 + inc h +x0DE9 ld e,(hl) + jr x0DE1 + +;АДРЕС: #0DEC таблица префиксов и основания систем счислений +x0DEC db "%",#02 + db "@",#08 + db ".",#0A + db "#",#10 + +;АДРЕС: #0DF4 преобразование строки в число (!!!при base 0 работает неверно!!!) +;вх: hl - адрес строки +;вых: z a =#00 успешно -> de - результат +; nz a =#10 не число. сообщение: not number +; nz a =#11 результат более 16 бит. сообщение: number too big +; +x0DF4 ld a,(xE02B) ;текущая система счисления =2/8/10/16 + ld b,#0A + or a + jr z,x0DFD + ld b,a +x0DFD call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) + jr nc,x0E17 ;это цифра + ld de,x0DEC ;проверим является ли симовол префиксом системы счисления + ld b,#04 +x0E07 ld a,(de) + inc de + cp (hl) + ld a,(de) + inc de + jr z,x0E15 ;да, это префикс. в A основание системы счислений + djnz x0E07 + ld b,(iy+#17) + jr x0E17 +x0E15 inc hl ;строка после префикса + ld b,a ;основание системы счислений +x0E17 ld (iy+#10),b ;делитель для выделения разряда числа + call x0E1F ;преобразование строки в число + or a + ret +;преобразование строки в число (!!!при base 0 работает неверно!!!) +;вх: hl - строка чисел +;вых: a =#00 успешно -> de - результат +; a =#10 не число +; a =#11 результат более 16 бит +x0E1F call x0E59 ;преобразование символа в число, с учетом системы счисления + ld a,#10 + ret c ;выход. не число + ld b,#00 + ld d,b + ld e,c + inc hl +x0E2A call x0E59 ;преобразование символа в число, с учетом системы счисления + jr c,x0E45 ;числа кончились + push hl + ld hl,(xE024) ;делитель для выделения разряда числа + ld h,#00 + ex de,hl + push bc + call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) + pop bc + jr nz,x0E4D ;результат более 16 бит + add hl,bc + jr c,x0E4D ;результат более 16 бит + ex de,hl + pop hl + inc hl + jr x0E2A +x0E45 call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) + ld a,#10 + ret nc + xor a + ret +;-результат более 16 бит +x0E4D pop hl + ld a,#11 + ret +;-проверка в (hl) цифра или нет (cy=1 не цифра) +;вх: hl - адрес в строке +x0E51 ld a,(hl) + cp #30 + ret c + cp #3A + ccf + ret +;-преобразование символа в число, с учетом системы счисления +;вх: hl - адрес строки чисел +;вых: c - число +; cy=1 ошибка. это не число +x0E59 ld a,(hl) + cp #61 + jr c,x0E60 + sub #20 ;буква в верхнем регистре +x0E60 sub #30 + ret c ;неизвестный символ + cp #0A + jr c,x0E6C ;это цифра + cp #11 + ret c ;неизвестный символ + sub #07 +x0E6C ld c,a + ld a,(xE024) ;делитель для выделения разряда числа + dec a + cp c + ret + +;АДРЕС: #0E73 деление bc=hl/de с проверкой de на ноль +; +x0E73 res 2,(iy+#0E) + ld a,d + or e + jr z,x0E80 + ld a,h + ld c,l + jp x16AA +x0E80 set 2,(iy+#0E) + ret + +;АДРЕС: #0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) +;вых: ahl - результат +; 0,(iy+#0E)=1 результат более 16 бит +; +x0E85 res 0,(iy+#0E) + ld c,h + ld a,l + ld b,#10 + ld hl,#0000 +x0E90 add hl,hl + jr nc,x0E97 + set 0,(iy+#0E) +x0E97 rla + rl c + jr nc,x0EA3 + add hl,de + jr nc,x0EA3 + set 0,(iy+#0E) +x0EA3 djnz x0E90 + bit 0,(iy+#0E) + ret + +;установка флагов обновления: содержимого регистров и дамп по содержимому регистров +x0EAA ld a,(xE01E) + and #F5 ;%11110101 + jr x0EB6 +;установка флагов обновления: обновлять дамп памяти и обновлять дизассемблер памяти по содержимому ячейки памяти +x0EB1 ld a,(xE01E) + and #CF ;%11001111 +x0EB6 ld (xE01E),a + ret + +;АДРЕС: #0EBA выделение из строки числовых операндов (не более 6) +;вх: hl - адрес введенной строки +;вых: de - первый операнд +; hl - второй операнд +; a - количество операндов [0..5] +x0EBA xor a + ld bc,xDD99 +x0EBE push af + push bc + call x0C98 ;вычисление значения в введенной строке + pop bc ;de вычисленное значение + jr c,x0EDA ;ошибка в строке + jp nz,x0B06 ;ошибка. полное обновление окна отладчика + ld a,e + ld (bc),a + inc bc + ld a,d + ld (bc),a + inc bc + pop af + inc a + cp #06 + jr nz,x0EBE + ld a,#0B ;ошибка: too many operands + jp x0B06 ;полное обновление окна отладчика +x0EDA pop af + ld de,(xDD99) + ld hl,(xDD99+#02) + ret + +;АДРЕС: #0EE3 поиск в буфере ввода строки первого печатного символа +;вых: hl - адрес в буфере +; z - этот символ перевод строки +x0EE3 ld hl,xDE17 ;буфер для ввода строки + +;АДРЕС: #0EE6 поиск в строке первого печатного символа +;вых: hl - адрес в строке +; z - этот символ перевод строки +x0EE6 ld a,(hl) + cp " " + inc hl + jr z,x0EE6 + dec hl + cp #0D + ret + +;АДРЕС: #0EF0 поиск заданной команды в списке +;вх: hl - строка с введенной командой +; de - список команд +;вых: nz - команда найдена в списке +; a,bc - номер найденной команды в списке +x0EF0 ld c,#00 +x0EF2 push hl + ld a,(de) ;пропуск служебных байтов + cp #20 ;space + jr nc,x0EFA + inc de + inc de +x0EFA ld a,(de) + ld b,a + and #7F + cp #61 ;a + jr c,x0F04 ;буква в контрольном слове в верхнем регистре + set 7,c ;если в нижнем, то не является значимой +x0F04 ld a,b + call x0F89 ;перевод символа в верхний регистр + ld b,a + ld a,(hl) + call x0F89 ;перевод символа в верхний регистр + cp b + jr nz,x0F1E ;нет совпадения + ld a,(de) + bit 7,a + inc hl + inc de + jr z,x0EFA ;следующая буква +;слово найдено +x0F17 pop de + res 7,c + ld a,c + ld b,#00 + ret +x0F1E bit 7,c + jr nz,x0F17 ;буква в контрольном слове в нижнем регистре +;сравниваем со следующим словом + pop hl +x0F23 ld a,(de) + rlca + inc de + jr nc,x0F23 + inc c + ld a,(de) + or a + jr nz,x0EF2 + ret + +;определение кода команды по введенной строке +;вх: hl - адрес строки с введенной командой +; de - список команд +; bc - список кодов соответствующих команде +;вых: z - команда не найдена в списке +; nz - команда найдена в списке +; a,bc - код найденной команды в списке +; hl - адрес начала следующего слова в введенной строке +x0F2E push bc + call x0EF0 ;поиск заданной команды в списке + pop de + ret z ;команда не найдена + push de + ex (sp),hl + push af + add a,l + ld l,a + jr nc,x0F3C + inc h +x0F3C pop af + ld a,(hl) + ld c,a + pop hl + ret + +;номера кодов соответсвующих списку x0FA0 (названия регистров для монитора) +x0F41 db #00,#01,#02,#23 ;ON / OFF/ MEM/ R + db #0E,#0D,#22,#20 ;AF'/ AF / A' / A + db #21,#1F,#0F,#10 ;F' / F / IXL/ IXH + db #11,#12,#05,#06 ;IYL/ IYH/ IX / IY + db #03,#04,#0A,#0B ;PC / SP / HL'/ DE' + db #0C,#07,#08,#09 ;BC'/ HL / DE / BC + db #19,#1A,#1B,#1C ;L' / H' / E' / D' + db #1D,#1E,#13,#14 ;C' / B' / L / H + db #15,#16,#17,#18 ;E / D / C / B + db #24 ;I + +;номера кодов соответсвующих списку x0FA5 (названия регистров для монитора) +x0F66 db #00,#21,#0C,#0B ;MEM/ R / AF'/ AF + db #20,#1E,#1F,#1D ;A' / A / F' / F + db #0D,#0E,#0F,#10 ;IXL/ IXH/ IYL/ IYH + db #03,#04,#01,#02 ;IX / IY / PC / SP + db #08,#09,#0A,#05 ;HL'/ DE'/ BC'/ HL" + db #06,#07,#17,#18 ;DE / BC / L' / H' + db #19,#1A,#1B,#1C ;E' / D' / C' / B' + db #11,#12,#13,#14 ;L / H / E / D + db #15,#16,#22 ;C / B / I + +;перевод символа в нижний регистр +x0F89 and #7F + cp #40 + ret c + and #5F + ret + +;АДРЕС: #0F91 названия регистров для монитора +x0F91 dc "PC" + dc "SP" + dc "IX" + dc "IY" + dc "HL" + dc "DE" + dc "BC" + db #00 + +;АДРЕС: #0FA0 названия команд/регистров +x0FA0 dc "ON" +x0FA2 dc "OFF" +x0FA5 dc "MEM" + dc "R" + dc "AF'" + dc "AF" + dc "A'" + dc "A" + dc "F'" + dc "F" + dc "IXL" + dc "IXH" + dc "IYL" + dc "IYH" + dc "IX" + dc "IY" + dc "PC" + dc "SP" + dc "HL'" + dc "DE'" + dc "BC'" + dc "HL" + dc "DE" + dc "BC" + dc "L'" + dc "H'" + dc "E'" + dc "D'" + dc "C'" + dc "B'" + dc "L" + dc "H" + dc "E" + dc "D" + dc "C" + dc "B" + dc "I" + db #00 + +;АДРЕС: #0FEB на одну строку вверх в отладчике +x0FEB ld bc,#FFF8 + jr x1005 + +;АДРЕС: #0FF0 на одну строку вниз в отладчике +x0FF0 ld bc,#0008 + jr x1005 + +;АДРЕС: #0FF5 на один байт влево в отладчике +x0FF5 ld bc,#FFFF + jr x1005 + +;АДРЕС: #0FFA на один байт вправо в отладчике +x0FFA ld bc,#0001 + jr x1005 + +;АДРЕС: #0FFF на следующую команду (если команда не выполняется) +x0FFF ld hl,(xDD69) ;ячейка mem + call x2F96 ;анализ команды ассемблера + +x1005 ld hl,(xDD69) ;ячейка mem + add hl,bc + ld (xDD69),hl + ld a,#01 + bit 0,(iy+#0A) + jr z,x102B ;очищать экран монитора при обновлении информации + call x2E3D ;печать дампа памяти в окне + xor a + ret + +;АДРЕС: #1019 пропуск программы, содержание регистра PC увеличивается на длину +; текущей команды (сама команда не выполняется) +x1019 ld hl,(xDD6B) ;PC + call x2F96 ;анализ команды ассемблера + ld (xDD6B),hl + ld a,(iy+#0A) + and %10110101 + ld (iy+#0A),a + xor a + +x102B push af + call x2CA8 ;печать/обновление монитора-отладчика + pop af + ret + +;нажата стрелка влево. полный сброс +x1031 ld (xEAF5+#18),hl ;портим память в ram 8 + jp x0040 ;инициализация + +;АДРЕС: #1037 инициализация системы и чтение настроек Autoconfig +x1037 call x1048 ;инициализация системы и чтение настроек Autoconfig + set 6,(iy+#14) ;"теплый" сброс + ld b,#00 + ld hl,xEAF5 ;байты - признак целостности страницы +x1043 ld (hl),b + inc hl + djnz x1043 + ret + +;инициализация системы и чтение настроек Autoconfig +x1048 ld iy,xE014 + call x0739 ;копирование процедуры в ram 8 с раскодированием + ld bc,#FEFE ;проверка нажатия CapsShift+5 + in a,(c) + rrca + jr c,x105F ;не нажата + ld b,#F7 ;проверка нажатия 5 + in a,(c) + bit 4,a + jr z,x1031 ;cs+5 нажата +x105F scf + jr x107A ;чтение настроек Autoconfig + + + +x1062 ld de,xC006 + ld a,(de) + sub e + dec de + jr z,x1073 + call x3E25 ;чтение портов #1FFD/#7FFD + scf + jr x107A ;чтение настроек Autoconfig +x1070 ex de,hl + inc (hl) + ex de,hl +x1073 ld a,(de) + sbc a,e + and #07 + jp z,x001E ;сброс + + +;инициализация системы и чтение настроек Autoconfig +;cy=1 чтение настроек Autoconfig в соответствии с параметрами переменной +; =0 безусловное чтение настроек Autoconfig +x107A push af +; подсчет контрольной суммы Basic128 с адреса #500-#5FF + ld hl,#0000 + ld b,h + ld c,#FE + ld (xE012),hl ;rom 0, ram 0 пользователя + ld h,#05 ;hl=#0500 адрес откуда читаем +x1086 rst #28 ;чтение байта из памяти пользователя + add a,b + ld b,a + inc hl + ld a,h + sub #06 + jr nz,x1086 + ld a,(x2BB2) + sub b + jp nz,x001E ;не совпадает. сброс + call x04CE ;восстановление режима Турбо + rst #30 + dw rom4_x0A5A ;инициализация системы и печать сооветствующих сообщений + db #04 + pop af + jr nc,x10B5 ;чтение и установка настроек из конфигурационного сектора + bit 1,(iy+#14) + ret nz ;Autoconfig Off + ld a,(xFFD0) + push af + call x10B5 ;чтение и установка настроек из конфигурационного сектора + rst #30 + dw rom5_x08EF ;установка доступности мыши + db #05 + pop af + ld (xFFD0),a + ret +;чтение и установка настроек из конфигурационного сектора +x10B5 xor a + call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ + ld bc,#FEFE + in a,(c) + rrca + jr c,x10C8 ;cs не нажата + ld b,#EF + in a,(c) + bit 2,a + ret z ;нажато cs+8 +x10C8 bit 6,(iy+#14) + jr nz,x10D6 ;"теплый" сброс + ld d,#02 + ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D + rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 +x10D6 rst #30 + dw rom7_x107B ;инициализация дисковода и настройка на дискету + db #07 + ret c ;ошибка + ld (ix+1),#00 ;crd X + ld bc,#5D00 ;сообщение: "boot record" + rst #08 ;печать сообщения + call x2FED ;печать пробелов до правого края окна +; чтение конфигурационного сектора + ld hl,xDB69 + push hl + ld bc,#0105 + ld de,#000F ;trk 0, sec #0F + rst #30 + dw rom7_x0229 ;R8DOS #05(5) чтение группы секторов + db #07 + pop hl + ret c ;ошибка чтения + ld a,"A" + cpi + ret nz + ld a,"M" + cpi + ret nz + jp (hl) ;установка настроек из конфигурационного сектора + +;АДРЕС: #1101 редактирование дампа памяти в окне монитора +x1101 rst #30 + dw rom5_x2278 ;редактирование дампа памяти в окне монитора + db #05 + xor a + ret + +;АДРЕС: #1107 таблица мнемоник +x1107 db #5C,#01 ;#00 ;#30 LD IXH + db #5C,#02 ;#30 LD IXL + db #5C,#03 ;#30 LD IYH + db #5C,#04 ;#30 LD IYL + db #53,#15 ;#27 JP Z + db #53,#14 ;#27 JP NZ + db #53,#0D ;#27 JP C + db #53,#16 ;#27 JP NC + db #53,#17 ;#08 ;#27 JP M + db #53,#1A ;#27 JP P + db #53,#19 ;#27 JP PE + db #53,#18 ;#27 JP PO + db #53,#22 ;#27 JP (HL) + db #53,#23 ;#27 JP (IX) + db #53,#24 ;#27 JP (IY) + db #54,#15 ;#28 JR Z + db #54,#14 ;#10 ;#28 JR NZ + db #54,#0D ;#28 JR C + db #54,#16 ;#28 JR NC + db #55,#15 ;#29 CALL Z + db #55,#14 ;#29 CALL NZ + db #55,#0D ;#29 CALL C + db #55,#16 ;#29 CALL NC + db #55,#17 ;#29 CALL M + db #55,#1A ;#18 ;#29 CALL P + db #55,#19 ;#29 CALL PE + db #55,#18 ;#29 CALL PO + db #56,#0B ;#2A ADC A + db #56,#07 ;#2A ADC HL + db #57,#0B ;#2B ADD A + db #57,#07 ;#2B ADD HL + db #57,#12 ;#2B ADD IX + db #57,#13 ;#20 ;#2B ADD IY + db #58,#0B ;#2C SBC A + db #58,#07 ;#2C SBC HL + db #59,#0B ;#2D IN A + db #59,#0C ;#2D IN B + db #59,#0D ;#2D IN C + db #59,#0E ;#2D IN D + db #59,#0F ;#2D IN E + db #59,#10 ;#28 ;#2D IN H + db #59,#11 ;#2D IN L + db #5A,#26 ;#2E OUT (C) + db #5A,#2B ;#2E OUT ( + db #5B,#06 ;#2C ;#2F EX DE + db #5B,#0A ;#2F EX AF + db #5B,#25 ;#2F EX (SP) + db #5C,#20 ;#30 LD (BC) + db #5C,#21 ;#30 ;#30 LD (DE) + db #5C,#22 ;#30 LD (HL) + db #5C,#29 ;#30 LD (IY+ + db #5C,#2A ;#30 LD (IY- + db #5C,#27 ;#30 LD (IX+ + db #5C,#28 ;#30 LD (IX- + db #5C,#2B ;#30 LD ( + db #5C,#0B ;#30 LD A + db #5C,#0C ;#38 ;#30 LD B + db #5C,#0D ;#30 LD C + db #5C,#0E ;#30 LD D + db #5C,#0F ;#30 LD E + db #5C,#10 ;#30 LD H + db #5C,#11 ;#30 LD L + db #5C,#05 ;#30 LD BC + db #5C,#06 ;#30 LD DE + db #5C,#07 ;#40 ;#30 LD HL + db #5C,#13 ;#30 LD IY + db #5C,#12 ;#30 LD IX + db #5C,#1B ;#30 LD I + db #5C,#1C ;#30 LD R + db #5C,#08 ;#30 LD SP + db #59,#22 ;#46 ;#2D IN (HL) + db #00 + +;АДРЕС: #1196 операнды/флаги ассемблера +x1196 dc "IXH" ;#00 + dc "IXL" + dc "IYH" + dc "IYL" + dc "BC" + dc "DE" + dc "HL" + dc "SP" + dc "AF'" ;#08 + dc "AF" + dc "A" + dc "B" + dc "C" + dc "D" + dc "E" + dc "H" + dc "L" ;#10 + dc "IX" + dc "IY" + dc "NZ" + dc "Z" + dc "NC" + dc "M" + dc "PO" + dc "PE" ;#18 + dc "P" + dc "I" + dc "R" + dc "F" + db #80 + db #80 + dc "(BC)" + dc "(DE)" ;#20 + dc "(HL)" + dc "(IX)" + dc "(IY)" + dc "(SP)" + dc "(C)" + dc "(IX+" + dc "(IX-" + dc "(IY+" ;#28 + dc "(IY-" + dc "(" ;#2A + db #00 ;#2B + +;АДРЕС: #11F7 мнемоники ассемблера +x11F7 dc "CCF" ;#00 / #2C + dc "CPL" + dc "DAA" + dc "DI" + dc "EI" + dc "EXX" + dc "HALT" + dc "NOP" + dc "RLA" ;#08 / #34 + dc "RLCA" + dc "RRA" + dc "RRCA" + dc "SCF" + dc "LDIR" + dc "LDDR" + dc "CPIR" + dc "CPDR" ;#10 / #3C + dc "INIR" + dc "INDR" + dc "OTIR" + dc "OTDR" + dc "LDI" + dc "LDD" + dc "CPI" + dc "CPD" ;#18 / #44 + dc "INI" + dc "IND" + dc "OUTI" + dc "OUTD" + dc "RLD" + dc "RRD" + dc "RETI" + dc "RETN" ;#20 / #4C + dc "NEG" + db #80 + db #80 + db #80 + dc "DEC" + dc "INC" + dc "JP" + dc "JR" ;#28 / #54 + dc "CALL" + dc "ADC" + dc "ADD" + dc "SBC" + dc "IN" + dc "OUT" + dc "EX" + dc "LD" ;#30 / #5C + dc "ORG" + dc "AND" + dc "OR" + dc "XOR" + dc "SUB" + dc "CP" + dc "PUSH" + dc "POP" ;#38 / #64 + dc "DJNZ" + dc "RET" + dc "BIT" + dc "SET" + dc "RES" + dc "RLC" + dc "RL" + dc "RRC" ;#40 / #6C + dc "RR" + dc "SLA" + dc "SRA" + dc "SRL" + dc "IM" + dc "RST" + dc "DB" + dc "SLI" ;#48 / #74 + db #00 + +;АДРЕС: #12D2 таблица для формирования команд дизасма +x12D2 db %00000111,%00000001 ;#01 + dw x135E + db %00111000,%00000001 ;#02 + dw x135E + db %00111000,%00000001 ;#03 + dw x1366 + db %00110000,%00000001 ;#04 + dw x136E + db %00110000,%00000001 ;#05 + dw x1372 + db %00111000,%00000001 ;#06 + dw x1376 + db %00111000,%00000001 ;#07 + dw x137E + db %00111000,%00000001 ;#08 + dw x1386 + db %11000000,%00000010 ;#09 + dw x138E + db %00111000,%00000001 ;#0A + dw x1396 + db %00111000,%00000001 ;#0B + dw x139E + db %00001111,%00000010 ;#0C + dw x13A6 + db %00111000,%00000010 ;#0D + dw x13C6 + db %00111000,%00000001 ;#0E + dw x13D6 + db %00110000,%00000001 ;#0F + dw x13DE + db %00110000,%00000010 ;#10 + dw x13E2 + db %00110000,%00000010 ;#11 + dw x13EA + db %00001111,%00000010 ;#12 + dw x13F2 + db %00111000,%00000010 ;#13 + dw x1412 + db %00110000,%00000010 ;#14 + dw x1422 + db %00110000,%00000010 ;#15 + dw x142A + db %11000000,%00000010 ;#16 + dw x1432 + db %00111000,%00000001 ;#17 + dw x143A + db %11100000,%00000001 ;#18 + dw x1442 + db %00001111,%00000010 ;#19 + dw x144A + db %00000111,%00000001 ;#1A + dw x146A + db %00111000,%00000001 ;#1B + dw x1472 + db %00111000,%00000001 ;#1C + dw x147A + db %00111000,%00000001 ;#1D + dw x1482 + db %00111000,%00000001 ;#1E + dw x148A + db %00111000,%00000010 ;#1F + dw x1492 + db %00011000,%00000001 ;#20 + dw x14A2 + db %00011000,%00000001 ;#21 + dw x14A6 + db %00011000,%00000001 ;#22 + dw x14AA + db %00011000,%00000001 ;#23 + dw x14AE + +x135E db #0C,#0D,#0E,#0F,#10,#11,#22,#0B +x1366 db #0C,#0D,#0E,#0F,#10,#11,#EA,#0B +x136E db #05,#06,#07,#08 +x1372 db #05,#06,#07,#0A +x1376 db #14,#15,#16,#0D,#18,#19,#1A,#17 +x137E db #83,#82,#85,#84,#89,#88,#87,#86 +x1386 db #92,#91,#94,#93,#98,#97,#96,#95 +x138E db #D2,#00,#D0,#C7,#D1,#C7,#D8,#00 +x1396 db #B6,#B7,#B8,#B9,#BA,#BB,#AF,#B5 +x139E db #9B,#99,#61,#9F,#5E,#60,#5F,#62 +x13A6 db #D3,#00,#D5,#EB,#D6,#00,#52,#CA + db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 + db #D3,#00,#9C,#CA,#D7,#00,#51,#CA + db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 +x13C6 db #33,#00,#AB,#09,#65,#ED,#54,#ED + db #8E,#ED,#8D,#ED,#90,#ED,#8F,#ED +x13D6 db #35,#37,#34,#36,#2E,#2D,#38,#2C +x13DE db #BC,#BD,#BE,#C3 +x13E2 db #AD,#0B,#AE,#0B,#B4,#07,#B4,#0B +x13EA db #B5,#20,#B5,#21,#BE,#2B,#B5,#2B +x13F2 db #66,#CC,#64,#CB,#CD,#EB,#D9,#00 + db #CE,#EB,#63,#CB,#D1,#EC,#72,#00 + db #66,#CC,#DA,#00,#CD,#EB,#D9,#00 + db #CE,#EB,#DB,#00,#D1,#EC,#72,#00 +x1412 db #53,#EB,#EA,#00,#A9,#0B,#A1,#2B + db #AC,#07,#EA,#00,#2F,#00,#30,#00 +x1422 db #66,#00,#31,#00,#8A,#00,#C3,#07 +x142A db #55,#EB,#EA,#00,#EA,#00,#EA,#00 +x1432 db #DD,#C7,#67,#C7,#69,#C7,#68,#C7 +x143A db #6A,#6C,#6B,#6D,#6E,#6F,#74,#70 +x1442 db #EA,#EA,#DF,#DF,#EA,#E0,#EA,#EA +x144A db #E1,#26,#A8,#C8,#A0,#CA,#B4,#CA + db #E2,#00,#E3,#00,#E4,#00,#E5,#00 + db #E1,#26,#A8,#C8,#9A,#CA,#D5,#2B + db #E2,#00,#E3,#00,#E4,#00,#E5,#00 +x146A db #E6,#E7,#E8,#E9,#EA,#EA,#EA,#EA +x1472 db #A2,#A3,#A4,#A5,#A6,#A7,#C4,#A1 +x147A db #4D,#4E,#4E,#4E,#4E,#4E,#4E,#4E +x1482 db #4C,#4B,#4F,#4F,#4F,#4F,#4F,#4F +x148A db #71,#71,#71,#71,#71,#71,#71,#71 +x1492 db #C1,#0B,#C2,#0B,#B5,#1B,#B5,#1C + db #4A,#00,#49,#00,#50,#00,#50,#00 +x14A2 db #41,#42,#39,#3A +x14A6 db #43,#44,#3B,#3C +x14AA db #45,#46,#3D,#3E +x14AE db #47,#48,#3F,#40 + +;АДРЕС: #14B2 таблицы для формирования команд дизасма +x14B2 db #4E,#74,#BB,#BA,#11,#10,#31,#AB + db #18,#19,#1A,#17,#16,#0D,#14,#15 + db #66,#4C,#4B,#07,#BE,#8A,#9C,#22 + db #AF +x14CB db #71,#72,#67,#68,#69,#2B,#B4,#A9 + db #EC,#EB,#ED,#B2,#27,#9D,#8B,#C0 + db #12,#B0,#29,#9E,#8C,#BF,#13 +x14E2 db #49,#4A,#B4,#AE,#AD,#AF,#2B,#21 + db #20,#22 +x14EC db #52,#51,#6A,#6C,#6B,#6D,#6E,#6F + db #70,#74 + +;АДРЕС: #14F6 проверка значения аккумулятора +;вых: cy=1 -> a<#7E или a>#C4 +x14F6 cp #7E + ret c + cp #C5 + ccf + ret + +;АДРЕС: #14FD проверка значения аккумулятора +;вых: cy=1 -> a<#2C или a>#74 +x14FD cp #2C + ret c + cp #75 + ccf + ret + +;АДРЕС: #1504 проверка значения аккумулятора +;вых: cy=1 -> a<#2C или a>#C4 +x1504 cp #2C + ret c + cp #C5 + ccf + ret + +;АДРЕС: #150B проверка значения аккумулятора +;вых: cy=1 -> a<#01 или a>#2B +x150B cp #01 + ret c + cp #2C + ccf + ret + +;АДРЕС: #1512 печать команды ассемблера +;вх: hl - адрес строки дизассемблированной команды +x1512 res 6,(iy+#0E) ;запятая не напечатана + call x2B10 ;печать пробела + ld a,(hl) + call x14F6 ;cy=1 -> a<#7E или a>#C4 + jr c,x1538 +;печать мнемоники из таблицы x1107 + push hl ;a=[#7E..#C4] -> a=a-#7E =[#00..#46] из таблицы x1107 + ld hl,x1107 + sub #7E + add a,a + ld e,a + ld d,#00 + add hl,de + ld a,(hl) ;мнемоника (номер сообщения) + call x1570 ;печать мнемоники ассемблера с пробелом на конце + ld a,(hl) ;начало операнда команды + and #7F + pop hl +;печать первого операнда + inc hl + call x157F ;печать операнда/числа команды ассемблера + jr x1543 +x1538 call x14FD ;cy=1 -> a<#2C или a>#74 + jr c,x1548 ;+0 =[#00..#2C][#74..#7D][#C5..#FF] + call x1570 ;мнемоника без операндов +x1540 call x1599 ;печать операнда/числа +x1543 ld a,(hl) + call x1504 ;cy=1 -> a<#2C или a>#C4 + ret nc ;a=[#2C..#C4] +x1548 cp #F1 + ret z + cp #F7 + ret z + cp #EE + jr nz,x1561 +;печать комментария (для db #nn ;BAD) + call x2B10 ;печать пробела + ld a,";" + rst #10 + inc hl +x1559 ld a,(hl) + inc hl + cp #F0 + ret z + rst #10 + jr x1559 +;печать зяпятой, если еще не напечатана +x1561 bit 6,(iy+#0E) + set 6,(iy+#0E) + jr nz,x1540 + ld a,"," + rst #10 + jr x1540 + +;АДРЕС: #1570 печать мнемоники ассемблера с пробелом на конце +;вх: a - номер сообщения с мнемоникой =[#2C..#74] +;вых: hl=hl+1 +x1570 ld c,(iy+#06) + sub #2C + ld de,x11F7 + call x15FC ;печать сообщения по номеру в A, не менее заданной длины в С + inc hl + jp x2B10 ;печать пробела + +;АДРЕС: #157F печать операнда/числа команды ассемблера +;вх: a - номер операнда/числа команды ассемблера +;вых: a - номер следующего операнда/числа команды ассемблера +x157F call x150B ;cy=1 -> a<#01 или a>#2B + jr c,x159D +;печать операнда a=[#01..#2B] из списка x1196 + push af + sub #01 + ld de,x1196 + call x15FA ;печать сообщения по номеру в A + pop af + cp #27 ;a=[#01..#26] + jr c,x15B1 ;нет смещения для команд (ix/iy+nn), +;печатам число с закрывающей скобкой + call x1599 ;a=[#27..#2B] + ld a,")" + rst #10 + ret +;печать операнда +x1599 ld a,(hl) + inc hl + jr x157F +;печать числа (a<#01 или a>#2B) +x159D cp #F8 + jr c,x15A6 ;a=[#00,#2C..#F7] + call x1626 ;a=[#F8..#FF] печать числа из (hl) (dec/hex) с префиксом + jr x15B1 +;печать сообщения (a=[#00,#2C..#F7]) +x15A6 cp #EC + jr nz,x15AF + call x15DB ;a=#EC печать сообщения из hl + jr x15B1 +;выход +x15AF dec hl + ret +x15B1 ld a,(hl) + ret + +;АДРЕС: #15B3 печать сообщения из hl +;вх: hl - адрес начала сообщения +; b - длина сообщения +; +x15B3 ld a,(hl) + rst #10 + inc hl + djnz x15B3 + ret + +;АДРЕС: #15B9 печать сообщения из hl с заменой непечатных символов на ? +;вх: hl - адрес начала сообщения +; b - длина сообщения +; +x15B9 ld a,(hl) + cp #20 + jr nc,x15C0 + ld a,"?" +x15C0 call x2B0B ;печать символа + inc hl + djnz x15B9 + ret + +;АДРЕС: #15C7 печать сообщения из hl +;вх: hl - адрес начала сообщения +; +x15C7 ld a,(hl) + call x2B0B ;печать символа + inc hl + rlca + ret c + jr x15C7 + +;АДРЕС: #15D0 печать сообщения по номеру (на экран/в буфер) +;вх: a,e - номер сообщения +; hl - адрес начала блока сообщений +; +x15D0 inc a ;поиск сообщения по номеру +x15D1 dec a + jr z,x15DB +x15D4 bit 7,(hl) + inc hl + jr z,x15D4 + jr x15D1 + +;АДРЕС: #15DB печать сообщения из hl +;вх: hl - адрес сообщения +; +x15DB ld b,#01 + +;АДРЕС: #15DD печать сообщения не менее заданной длины +;вх: b - минимальная длина сообщения (дополняется пробелами) +; hl - адрес сообщения +; +x15DD or a +x15DE ld a,(hl) + bit 7,a + call x2B0B ;печать символа со сбросом 7го бита (rst #10) + inc hl + jr z,x15EC + ret c + ld a," " ;напечатаем пробел + jr x15F6 +x15EC djnz x15DE + scf + ld b,#00 + jr x15DE + +;АДРЕС: #15F3 печать нескольких провелов (в B) +;вх: b - количество пробелов +; +x15F3 ld a," " +x15F5 rst #10 +x15F6 djnz x15F5 + or a + ret + +;АДРЕС: #15FA печать сообщения по номеру в A +;вх: de - адрес блока сообщений +; a - номер сообщения +; +x15FA ld c,#01 + +;АДРЕС: #15FC печать сообщения по номеру в A, не менее заданной длины в С +;вх: c - минимальная длина сообщения (дополняется пробелами) +; de - адрес блока сообщений +; a - номер сообщения +; +x15FC ex de,hl + call x1606 ;поиск сообщения по номеру в A + ld b,c + call x15DD + ex de,hl + ret +;поиск сообщения по номеру в A +x1606 or a + ret z + ld b,a +x1609 bit 7,(hl) + inc hl + jp z,x1609 + djnz x1609 + ret + +;АДРЕС: #1612 печать числа в hl (dec/hex) с префиксом +;вх: hl - число +; +x1612 ld c,l + ld b,h + +;АДРЕС: #1614 печать числа в bc (dec/hex) с префиксом +;вх: bc - число +; +x1614 push de + bit 0,(iy+5) + ld de,#0A00 ;десятичное, без префикса + jr nz,x1621 + ld de,#1023 ;шестнадцатиричное, префикс # +x1621 call x162C ;печать числа с префиксом + pop de + ret + +;АДРЕС: #1626 печать числа из (hl) (dec/hex) с префиксом +;вх: 0,a =0/1 двухбайтное/однобайтное число +; 1-2,a - система счисления (bin/oct/dec/hex) +; hl - адрес ячейки с числом +; +x1626 call x1638 ;загрузка числа в bc + +;АДРЕС: #1629 печать числа в bc (bin/oct/dec/hex) с префиксом +;вх: bc - число +; 1-2,a - система счисления +; +x1629 call x1642 ;установка префикса + +;АДРЕС: #162C печать числа в заданной системе счисления +; bc - число +; d - делитель для выделения разряда числа +; e - код префикса +x162C ld a,d + ld (xE024),a + ld a,e + rst #10 ;печать префикса + ld (iy+7),#01 + jr x1673 ;печать числа +;загрузка числа в bc +x1638 ld b,#00 + ld c,(hl) + inc hl + bit 0,a + ret nz + ld b,(hl) + inc hl + ret +;установка префикса для системы счисления +x1642 and %00000110 + ld de,#0225 ;bin + cp #02 + ret c + ld de,#0840 ;oct + ret z + cp #06 + ld de,#0A00 ;dec + ret c + ld de,#1023 ;hex + ret + +;АДРЕС: #1658 печать числа A с предварительным пробелом +;вх: a - число +; b - минимальная длина +; +x1658 ld c,a + ld a,b + ld b,#00 + jr x166B + +;АДРЕС: #165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом +;вх: bc - число +; +x165E + scf + jr x1662 + +;АДРЕС: #1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом +;вх: bc - число +; +x1661 or a +x1662 ld a," " ;cy=1/0 минимальная длина 1/5 + rst #10 ;печать пробела + ld a,#01 + jr c,x166B + +;АДРЕС: #1669 печать десятичного числа bc [0..65535] с ведущими пробелами +;вх: bc - число +; (xE3BC) адрес строки +; +x1669 ld a,#05 +x166B ld (iy+#07),a + +;АДРЕС: #166E печать десятичного числа bc [0..65535] с ведущими пробелами +;вх: bc - число +; (xE3BC) адрес строки +x166E ld de,#000A + jr x1677 + +;АДРЕС: #1673 печать числа bc (на экран/в буфер) +;вх: bc - число +; (xE024) делитель для выделения разрядов +; (xE01B) количестов разрядов +; (xE3BC) адрес строки +; +x1673 ld de,(xE024) ;делитель для выделения разрядов + +;АДРЕС: #1677 печать числа bc (на экран/в буфер) +;вх: bc - число +; de - делитель для выделения разрядов +; (xE01B) количестов разрядов +; (xE3BC) адрес строки +; +x1677 push hl + call x1681 ;преобразование числа в строку + pop hl + ret +x167D ld a,b + or c + jr z,x169E +x1681 dec (iy+7) ;преобразование числа в строку + ld a,b + call x16AA ;деление bc=ac/de + push hl ;hl остаток от деления + call x167D + pop hl + ld a,l + add a,#90 + daa + adc a,#40 + daa + and #7F + cp #20 + jr nc,x169C + ld a," " +x169C rst #10 + ret +x169E dec (iy+7) + ret m + call x167D + ld a,(iy+8) + rst #10 + ret + +;АДРЕС: #16AA деление bc=ac/de +;вых: bc=ac/de +; hl остаток от деления +; +x16AA ld hl,#0000 + ld b,#10 +x16AF rl c + rla + adc hl,hl + sbc hl,de + ccf + jr nc,x16C8 +x16B9 djnz x16AF + rl c + rla + ld b,a + ret +x16C0 rl c + rla + adc hl,hl + add hl,de + jr c,x16B9 +x16C8 djnz x16C0 + rl c + rla + add hl,de + ld b,a + ret + +;АДРЕС: #16D0 печать строки (rst #20) +;вх: ix - адрес дескриптора окна +; +x16D0 ex (sp),hl + push af +x16D2 ld a,(hl) + call x2B0B ;печать символа со сбросом 7го бита (rst #10) + and #80 + inc hl + jr z,x16D2 + pop af + ex (sp),hl + ret + +;АДРЕС: #16DE печать числа hl=[#0000..#FFFF] +;вх: hl - число +; +x16DE ld a,h + call x16E3 + ld a,l + +;АДРЕС: #16E3 печать числа [#00..#FF] +;вх: a - число +; +x16E3 push af + rlca + rlca + rlca + rlca + call x16EC + pop af + +;АДРЕС: #16EC печать числа [#0..#F] +;вх: 0-3,a - число +; +x16EC and #0F + add a,#90 + daa + adc a,#40 + daa + rst #10 + ret + +;коррекция регистра r пользователя +x16F6 ld l,(iy+#02) ;длина команды для дизасма в байтах + jr x1744 + +;коррекция регистра r пользователя +x16FB ld l,#01 + jr x1744 + +;АДРЕС: #16FF исполнение зарезервированных слов анализатора st0-st9 +x16FF bit 4,(iy+#14) + ret z ;анализатор выключен + ld hl,xE9A9 ;таблица адресов слов st0-st9 анализатора + xor a +x1708 push af + ld e,(hl) + inc hl + ld d,(hl) + inc hl + push hl + ld a,d + or e + call nz,x1DE5 ;выполнение слова анализатора + pop hl + pop af + inc a + cp #0A + jr nz,x1708 + ret + +;АДРЕС: #171B выполнение(трассировка) сформированной команды в отладчике +x171B ld hl,(xDD6B) ;pc программы пользователя + push hl + ld hl,(xE11A) ;адрес начала сормированной команды для трассировки + ld (xDD6B),hl ;новый PC + ld hl,x173A ;адрес возврата + push hl + ld (xE38D),sp ;сохраним стэк + ld hl,xE026 + set 5,(hl) ;выполняется трассировка из отладчика + bit 3,(hl) + call nz,x0581 ;восстановление экрана в странице 5 + jp x0143 ;выход из монитора и выполнение команды +x173A res 5,(iy+#12) + pop hl + ld (xDD6B),hl ;восстановим PC пользователя +;коррекция регистра r пользователя +x1742 ld l,#FF +x1744 ld a,(xDD83+#01) ;коррекция регистра r пользователя + ld h,a + add a,l + rlca + sla h + rra + ld (xDD83+#01),a + ret + +;трассировка команд с условием перехода jr cc +;вых: cy=1 условие выполнено +x1751 ld hl,(xE11A) + inc hl + inc hl + ld (hl),#02 ;jr cc,$+4 + jr x1782 + +;быстрая трассировка команды call +x175A ld hl,(xDDAA) + rst #28 ;чтение байта из памяти пользователя + ld e,a + inc hl + rst #28 ;чтение байта из памяти пользователя + ld d,a + inc hl + ld (xDDAA),hl + ld hl,(xE11A) + inc hl + inc hl + ld (hl),e + inc hl + ld (hl),d + inc hl + ld (hl),#CF ;rst #08 + jr x171B ;выполнение(трассировка) сформированной команды в отладчике + +;трассировка команд с условием перехода jp cc/call cc/ret cc +;вых: cy=1 условие выполнено +x1773 ld hl,(xE11A) + inc hl + inc hl + push hl ;установка команды: jp cc,$+5 + ld de,#0004 + add hl,de + ex de,hl + pop hl + ld (hl),e + inc hl + ld (hl),d +x1782 inc hl + ld (hl),#B7 ;or a + inc hl + ld (hl),#CF ;rst #08 + inc hl + ld (hl),#37 ;scf + inc hl + ld (hl),#CF ;rst #08 + ld a,(xDD7F) ;флаги пользователя + push af + call x171B ;выполнение(трассировка) сформированной команды в отладчике + call x1742 ;коррекция регистра r пользователя + ld a,(xDD7F) ;регистр f + rrca ;флаг CY пользователя + pop hl + ld a,h + ld (xDD7F),a ;восстановим флаги + ret + +;exx регистров пользователя +x17A2 ld hl,xDD73 ;регистр hl + ld de,xDD79 ;регистр hl' + ld b,#06 +x17AA ld a,(de) + ld c,(hl) + ex de,hl + ld (de),a + ld (hl),c + inc de + inc hl + djnz x17AA + ret + +;ex af,af' регистров пользователя +x17B4 ld hl,xDD7F ;регистр af + ld de,xDD81 ;регистр af' + ld b,#02 + jr x17AA + +;трассировка команды rst #08 +x17BE ld de,#0008 + ld hl,(xDDD0) ;адрес следующей команды дизасма + or a + sbc hl,de + jr nz,x1807 ;формируем команду для исполнения + ld hl,(xDD6B) ;pc программы пользователя + ld e,#FF + jp x01F5 ;вызов обработчика ошибок Basic 48k + +;трассировка команды halt +x17D1 ld a,(xDD83) ;флаг IFFF2 + bit 2,a + jr nz,x17EA ;прерываения разрешены + ld a,#AB ;di:halt -> сообщение: finish program + jp x0AE0 ;печать/обновление окна отладчика + +;команды: ex af,af' и exx +x17DD ld a,(xDDB4) ;1й байт команды дизассемблера без префиксов + cp #08 ;команда ex af,af' + push af + call z,x17B4 ;ex af,af' регистров пользователя + pop af + call nz,x17A2 ;exx регистров пользователя +x17EA call x16FB ;коррекция регистра r пользователя + jp x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 + +;АДРЕС: #17F0 выполнение одной команды по адресу в PC +x17F0 ld hl,(xDD6B) ;pc программы пользователя + call x191E ;проверка попадания адреса на адреса #3D00-#3DFF + jp nc,x18F1 ;возможна только быстрая трассировка, pc пользователя в пределах #3D00..#3DFF + call x2F96 ;анализ команды ассемблера по адресу в hl + ld a,(xDDB7) + cp #32 ;это halt + jr z,x17D1 + cp #72 ;это rst #08 + jr z,x17BE + +;формируем команду для исполнения +; сохраним память в буфере +x1807 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки + push hl + ld de,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма + ld bc,#0008 + ldir + pop de +; установим режим прерываний + ld a,(xDD83) ;флаг IFFF2 + bit 2,a + ld a,#F3 ;di + jr z,x181F + ld a,#FB ;ei +x181F ld (de),a + inc de +; копируем команду в буфер для исполнения + ld hl,(xDD6B) ;pc программы пользователя + ld c,(iy+#02) ;длина команды в байтах + ld b,#00 + call x0753 ;сохранение области памяти в ram 8 +; ставим rst #08 для возврата + ld a,#CF ;rst #08 + ld (de),a + ld a,(iy+#03) + or a + jp z,x18BA ;выполнение команды при трассировке +;для команды exx/ex af,af' + bit 7,a + jr nz,x17DD ;команды: ex af,af' и exx +;для команды ret/ret cc + bit 1,a + jr z,x185A ;это не ret + bit 5,a + jr z,x1851 ;это команда ret +; команда ret cc + ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки + inc hl ;поправка на di/ei + ld a,(hl) + and %00111000 + or %11000010 + ld (hl),a + call x1773 ;трассировка команд с условием перехода jp cc/jr cc/call cc/ret cc + jr nc,x1861 ;условие не выполнено +x1851 call nc,x16F6 ;коррекция регистра r пользователя + call x3640 ;pop de со стэка пользователя + ex de,hl + jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 +;для команд jr cc +x185A bit 2,a + jr z,x1865 + call x1751 ;трассировка команд с условием перехода jr cc +x1861 jr nc,x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 + jr x18A7 ;условие выполнено +;для команд call/call cc +x1865 bit 0,a + jr z,x1894 + bit 7,(iy+#16) + jr nz,x18D5 ;выполнение команды в отладчике с быстрым выполнением подпрограмм +; пошаговая трассировка + call x190F + jr c,x18DA ;только быстрая трассировка +x1874 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки + inc hl + ld a,(hl) + or a + bit 0,a + jr nz,x1888 ;это call + and %00111000 ;это call cc + or %11000010 + ld (hl),a + call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc + jr nc,x18BD ;условие не выполнено +; установка регистров и стэка для вызова команды call +x1888 call nc,x16FB ;коррекция регистра r пользователя + ld de,(xDDAA) ;текущий адрес команды ассемблера для дизасма + call x3A14 ;запись de на стэк пользователя + jr x18A7 +;для команд jp/jp cc +x1894 bit 3,a + jr z,x18AC + call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc + jr nc,x18BD ;условие не выполнено + call x190F ;проверка возможности пошаговой трассировки команд call + push af + call c,x1742 ;коррекция регистра r пользователя + pop af + jr c,x18F4 ;только быстрая трассировка +x18A7 ld hl,(xDDD0) ;адрес следующей команды дизасма + jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 +;для пустых команд??? +x18AC bit 4,a + jr z,x18B5 + call x16FB ;коррекция регистра r пользователя + jr x18A7 +;неизвестная команда +x18B5 ld a,#AA + jp x0AE0 ;печать/обновление окна отладчика + +;выполнение команды при трассировке +x18BA call x171B ;выполнение(трассировка) сформированной команды в отладчике +x18BD ld hl,(xDDAA) ;текущий адрес команды ассемблера для дизасма + +;восстановление памяти пользователя и исполнение слов анализатора st0-st9 +;вх: hl - PC пользователя +x18C0 ld (xDD6B),hl ;новый PC пользователя + push hl + ld hl,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма + ld de,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки + ld bc,#0008 + ldir + call x16FF ;исполнение зарезервированных слов анализатора st0-st9 + pop hl + ret + +;выполнение команды в отладчике с быстрым выполнением подпрограмм +; вызов call +x18D5 call x191B ;проверка попадания адреса команды на адреса #3D00-#3DFF + jr nc,x1874 ;вызов невозможен, это Tr-Dos +x18DA ld hl,(xDDD0) + ld de,#0028 + or a + sbc hl,de + jr nz,x18BA ;выполнение команды при трассировке +; это call #28/rst #28 + bit 4,(iy-#02) + jp nz,x1874 ;это Basic 48k + call x175A ;быстрая трассировка команды call + jr x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 + +;только быстрая трассировка +;вх: hl - PC программы пользователя +x18F1 ld (xDDD0),hl ;адрес следующей команды дизасма +x18F4 ld hl,(xE11A) + inc hl + ld (hl),#CD ;call #nnnn + inc hl + ld de,(xDDD0) + ld (hl),e + inc hl + ld (hl),d + inc hl + ld (hl),#CF ;rst #08 + call x3640 ;pop de со стэка пользователя + push de + call x171B ;выполнение(трассировка) сформированной команды в отладчике + pop hl + jr x18C0 + +;проверка возможности пошаговой трассировки команд call +;вых: cy=1 возможна только быстрая трассировка +x190F or a + bit 3,(iy+#05) ;Не трассировать (выполнять сразу) подпрограммы, расположенные в ПЗУ + ret z + ld a,(xDDD0+#01) + cp #40 + ret nc ;это не ПЗУ + +;АДРЕС: #191B проверка попадания адреса команды на адреса #3D00-#3DFF +;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos +x191B ld hl,(xDDD0) ;адрес следующей команды дизасма + +;АДРЕС: #191E проверка попадания адреса на адреса #3D00-#3DFF +;вх: hl - pc программы пользователя +;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos +x191E bit 4,(iy-#02) ;4,#7FFD пользователя + scf + ret z ;ПЗУ Basic128 пользователя + ld de,#3D00 + or a + sbc hl,de + add hl,de + ret c + ld de,#3E00 + sbc hl,de + add hl,de + ccf + ret + +;сообщение дизасма для неопознанной команды +x1934 db #73 ;DB + db #FF ;признак числа hex 1 байт + db #00 ;число + db #EE,"BAD",#F0 ;сообщение + +;выход из п/п x197F анализа команды ассемблера +x193C ld (ix+0),#F7 ;признак конца команды + pop ix + ret + +;команда ex de,hl +x1943 ld (ix+0),#AA ;первая часть: ex de + inc ix + ld (ix+0),#07 ;вторая часть: hl +x194D inc ix +x194F ld (iy+2),#01 ;длина команды в байтах + jp x1A78 + +;команда halt +x1956 ld (ix+0),#32 ;номер сообщения мнемоники: halt + ld a,(hl) + or a + jr z,x194D ;если был префикс, команда неизвестна + +;неизвестная команда +x195E ld hl,x1934 ;команда неизвестна + ld de,xDDB7 + ld bc,#0008 + ldir + push de + pop ix + xor a + ld (iy+#01),a ;нет префикса + ld (iy+#04),a + ld (iy+#03),#40 + ld a,(xDDAC) ;код первого байта команды + ld (xDDB7+#02),a ;отобразится в сообщении DB #?? + jr x194F + +;АДРЕС: #197F анализ команды ассемблера +; формирование сообщения для печати дизасма команды +;вых: bc - длина команды ассеблера +x197F push ix +;установка регистров + ld ix,xDDB7 ;буфер сообщения + ld de,(xDDAA) ;адрес команды + ld hl,x193C ;адрес возврата + push hl + ld (xDDCB),sp + bit 4,(iy+#00) + jr z,x199F + call x1DB3 ;поиск чего-то cy=1 найдено + ld b,#F1 + call c,x1D88 + +;обнуление дизасма команды ассемблера +x199F ld e,#09 + ld hl,xE015 ;iy+#01 + xor a + ld d,a ;начальная длина команды =0 + ld (hl),a + ld (xDDCD),a + ld (xE017),a + ld (xE018),a +;проверка наличия префиксов + ld bc,xDDAC ;начало команды + ld a,(bc) + cp #EB + jr z,x1943 ;это ex de,hl + cp #DD ;проверка на префикс #DD + jr nz,x19C2 ;нет префикса + ld (hl),#02 ;префикс #DD + inc bc + inc d ;длина команды + jr x19CA +x19C2 cp #FD ;проверка на префикс #FD + jr nz,x19CA ;нет префикса + ld (hl),#03 ;префикс #FD + inc bc + inc d ;длина команды +x19CA ld a,(bc) + cp #76 ;halt + jr z,x1956 ;это команда halt + cp #CB ;проверка на префикс #CB + jr nz,x19DB ;нет префикса + set 3,(hl) ;префикс #CB + ld e,#16 + inc bc + inc d ;длина команды + jr x19EA +x19DB cp #ED ;проверка на префикс #ED + jr nz,x19EA ;нет префикса + set 2,(hl) ;префикс #ED + bit 1,(hl) + jp nz,x195E ;есть префикс #DD/#FD. неизвестная команда + inc bc + ld e,#18 + inc d ;длина команды +x19EA inc d ;длина команды + ld (iy+#02),d ;длина команды +;копируем команду в буфер без префикса + push de + ld de,xDDB4 ;копируем в буфер команду без префиксов + ld h,b + ld l,c + ld bc,#0003 + ldir + pop de + ld a,(xE015) ;корректировка команды без учета префиксов + and %00001010 + cp %00001010 + jr nz,x1A09 + ld a,(xDDB4+#01) ;два префикса #CB и #DD/#FD + ld (xDDB4),a ;код команды + +;формирование команды дизасма по таблице +x1A09 xor a + push af + push af + ld a,e ;e=#09/#16/#18 +x1A0D add a,a + add a,a + ld b,#00 + ld c,a + ld hl,x12D2-#04 + add hl,bc + ld c,(hl) + inc hl + ld d,(hl) + inc hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a ;hl - адрес начала таблицы + ld a,(xDDB4) ;код команды без учета префиксов + ld b,#00 + and c +x1A24 inc b + srl c + jr nc,x1A24 + or a +x1A2A dec b + jr z,x1A30 + rrca + jr x1A2A +x1A30 bit 0,d + jr nz,x1A35 + add a,a +x1A35 ld b,#00 + ld c,a + add hl,bc +x1A39 ld a,(hl) + inc hl + dec d + or a + jr z,x1A62 + cp #EA + jp z,x195E ;неизвестная команда + cp #C5 + jr c,x1A94 + cp #EA + jr nc,x1A94 + sub #C6 + cp #17 + jr nz,x1A56 + set 6,(iy+#04) +x1A56 bit 0,d + jr z,x1A0D + push de + push hl + jr x1A0D +x1A5E ld a,d + or a + jr nz,x1A39 +x1A62 pop hl + pop de + ld a,d + or a + jr nz,x1A39 + ld hl,xE015 + bit 1,(hl) + jr z,x1A78 ;нет префикса #DD/#FD + bit 4,(hl) + jr nz,x1A78 + bit 7,(hl) + jp z,x195E ;;неизвестная команда +x1A78 ld bc,(xE016) ;длина команды + ld b,#00 + ld sp,(xDDCB) ;восстановим стэк + ret +x1A83 cp #20 + jr nc,x1AA7 + ld (ix+#00),a + inc ix + set 5,(iy+#01) + ld a,#22 + jr x1AA7 +x1A94 push de + push hl + bit 1,(iy+#01) + jr z,x1AA7 ;нет префикса #DD/#FD + ld hl,xE018 + bit 7,(hl) + jr nz,x1A83 + bit 6,(hl) + jr nz,x1A83 +x1AA7 push af +x1AA8 ld hl,x14B2 + ld bc,#0024 + cpir + ld b,a + jp nz,x1BD1 + ld a,c + cp #1E + jr nc,x1AD5 + cp #1C + jr nc,x1B27 + cp #0B + jp c,x1C5B + cp #14 + ld hl,xE017 + jr nc,x1B2D + cp #11 + jr c,x1B3A + set 1,(hl) + jp x1BD1 +x1AD2 dec b + jr x1B0E +x1AD5 ld hl,xE015 + cp #23 + jr z,x1AD2 + jr c,x1AE9 + cp #2C + jr nc,x1B13 + set 3,(iy+#04) + jp x1BD1 +x1AE9 cp #22 + jr z,x1B0E + bit 1,(hl) + jr z,x1B10 + bit 3,(hl) + jr nz,x1B10 ;есть префикс #СВ + sub #1D + cp #03 + jr nc,x1B23 + bit 7,(hl) + jr nz,x1B10 + bit 5,(iy+#04) + jr nz,x1B10 +x1B05 bit 0,(hl) + jr z,x1B0B ;это префикс #DD + add a,#02 +x1B0B ld b,a + set 4,(hl) +x1B0E set 5,(hl) +x1B10 jp x1BD1 +x1B13 set 5,(hl) + cp #2D + jr nc,x1B1E + ld a,#66 + jp x1AA8 +x1B1E ld b,#33 + jp x1BD1 +x1B23 add a,#7B + jr x1B05 +x1B27 set 7,(iy+#03) ;это ex af,af' либо exx + jr x1B10 +x1B2D bit 1,(hl) + jr z,x1B10 ;нет префикса #DD/#FD + set 5,(hl) + sub #14 + ld (xE032),a + jr x1B10 +x1B3A ld hl,(xDD73) ;регистр hl + ld (xDDCE),hl + cp #0E + jr nz,x1B60 + set 4,(iy+#03) ;это jp (hl) + bit 1,(iy+#01) + jr z,x1B5D ;нет префикса #DD/#FD + ld hl,(xDD6F) ;регистр ix + bit 0,(iy+#01) + jr z,x1B5A + ld hl,(xDD71) ;регистр iy +x1B5A ld (xDDCE),hl +x1B5D ld (xDDD0),hl +x1B60 ld hl,xE015 + ld a,(hl) + bit 1,a + jr z,x1B10 ;нет префикса #DD/#FD + set 7,(hl) + ld e,c + ld hl,x14CB + bit 0,a + ld b,#00 + jr z,x1B78 ;префикс #DD + ld a,c + add a,#06 + ld c,a +x1B78 add hl,bc + ld b,(hl) + ld (ix+#00),b + inc ix + ld a,e + cp #0D + jr nc,x1BD6 + cp #0C + jr nz,x1BA0 + bit 4,(iy+#01) + jr z,x1BA0 + ld a,#01 + and (ix-#02) + add a,#BA + ld (ix-#02),a + res 4,(iy+#01) + res 5,(iy+#01) +x1BA0 inc (iy+#02) + ld a,(xDDAC+#02) + or a + jp p,x1BAF + inc (ix-#01) + neg +x1BAF ld (ix+#00),#FD + inc ix + ld b,a + ld hl,(xDD6F) ;регистр ix + bit 0,(iy+#01) + jr z,x1BC2 ;префикс #DD + ld hl,(xDD71) ;регистр ix +x1BC2 ld de,(xDDAC+#02) + ld d,#00 + bit 7,e + jr z,x1BCD + dec d +x1BCD add hl,de + ld (xDDCE),hl ;адрес перехода при дизасме +x1BD1 ld (ix+#00),b + inc ix +x1BD6 pop af + push af + ld hl,x14E2 + ld bc,#000A + cpir + jr nz,x1C3C + ld a,c + cp #08 + jr nc,x1C45 + and #03 + jr z,x1C00 + dec a + jr z,x1BF6 + dec a + jr z,x1BFB + ld hl,(xDDD0) + jr x1C03 +x1BF6 ld hl,(xDD77) ;регистр bc + jr x1C03 +x1BFB ld hl,(xDD75) ;регистр de + jr x1C03 +x1C00 ld hl,(xDDCE) ;адрес перехода при дизасме +x1C03 ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти + ld a,c + cp #04 + ld b,#02 + jr nc,x1C35 + dec b + cp #03 + jr nz,x1C1B + ld a,(xDDCD) ;код команды дизасма + cp #A1 + jr nz,x1C35 + jr x1C3C +x1C1B or a + jr nz,x1C35 + ld a,(xDDCD) ;код команды дизасма + ld hl,x14EC + ld bc,#000A + cpir + jr z,x1C33 + bit 7,(iy+#04) + ld b,#01 + jr z,x1C35 +x1C33 ld b,#03 +x1C35 ld a,b + or (iy+#04) + ld (iy+#04),a +x1C3C pop af + ld (xDDCD),a ;код команды дизасма + pop hl + pop de + jp x1A5E +x1C45 ld b,#03 + ld hl,(xDD73) ;регистр hl + ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти + jr x1C35 +x1C4F ld (xDDD0),de + ld b,#EC + call x1D88 + jp x1BD6 +x1C5B cp #03 + jr c,x1C64 + ld (ix+#00),b + inc ix +x1C64 ld d,#00 + ld hl,xE017 + cp #01 + jp c,x1D00 + jr z,x1C8E + cp #04 + jr c,x1CC9 + cp #06 + jr c,x1C8E + cp #08 + jr c,x1CE4 + jr z,x1CE8 + cp #0A + jp z,x1D58 + ld a,(xDDB4) ;команда дизассемблера без префиксов + and #38 + set 0,(hl) ;это команда call/call cc + ld e,a + jp x1D44 +x1C8E ld a,(xDDCD) ;код команды дизасма + cp #A1 + jr z,x1CC9 + cp #55 + jr z,x1CBB + cp #53 + jr z,x1CAC + cp #91 + jr nc,x1CB0 + cp #82 + jr c,x1CBD + set 5,(hl) ;это команда ret cc + sub #82 + ld (xE032),a +x1CAC set 3,(hl) ;это команда jp/jp cc + jr x1CBD +x1CB0 cp #99 + jr nc,x1CBD + set 5,(hl) ;это команда ret cc + sub #91 + ld (xE032),a +x1CBB set 0,(hl) ;это команда call/call cc +x1CBD ld de,(xDDB4+#01) + inc (iy+#02) + inc (iy+#02) + jr x1D2C +x1CC9 inc (iy+#02) + ld b,#FF + ld hl,xE015 + bit 1,(hl) + jr z,x1CDE ;нет префикса #DD/#FD + bit 4,(hl) + jr nz,x1CDE + ld a,(xDDB4+#02) + jr x1CE1 +x1CDE ld a,(xDDB4+#01) +x1CE1 ld e,a + jr x1CF7 +x1CE4 set 7,(iy+#04) +x1CE8 ld a,(xDDB4) + set 5,(iy+#04) + and #38 + rrca + rrca + rrca + ld e,a +x1CF5 ld b,#FD +x1CF7 ld (ix+#00),b + inc ix + ld b,e + jp x1BD1 + +;байтовое смещение в команде +x1D00 ld a,(xDDCD) + cp #65 + jr nz,x1D0B + set 2,(iy+#04) +x1D0B sub #8D + jr c,x1D14 + ld (xE032),a + set 5,(hl) +x1D14 inc (iy+#02) + set 2,(hl) + ld a,(xDDB4+#01) ;второй байт команды + ld d,#00 + or a + jp p,x1D23 + dec d +x1D23 ld e,a + ld hl,(xDDAA) ;адрес команды + inc hl + inc hl + add hl,de + ld e,l + ld d,h +x1D2C set 6,(iy+#01) ;байтовое смещение в команде + bit 4,(iy+#00) + jr z,x1D3C + call x1DB3 + jp c,x1C4F +x1D3C ld b,#FC + bit 0,(iy+#05) + jr nz,x1D46 ;число в десятичной +x1D44 ld b,#FE +x1D46 ld (ix+#00),b + inc ix + ld (ix+#00),e + inc ix + ld b,d + ld (xDDD0),de ;адрес следующей команды дизасма + jp x1BD1 + +x1D58 ld e,#00 + ld b,#FC + ld a,(xDDB4) + cp #46 + jr z,x1CF5 + inc e + cp #56 + jr z,x1CF5 + inc e + cp #5E + jr z,x1CF5 + set 5,(iy+#01) + ld e,#00 + cp #4E + jr z,x1D85 + cp #66 + jr z,x1D85 + cp #6E + jr z,x1D85 + inc e + cp #76 + jr z,x1D85 + inc e +x1D85 jp x1CF5 + +x1D88 ld (ix+0),b + ld (ix+1),#4C + inc ix + inc ix + ld c,#04 +x1D95 ld l,#04 + xor a +x1D98 sla e + rl d + rla + dec l + jr nz,x1D98 + add a,#90 + daa + adc a,#40 + daa + ld (ix+0),a + inc ix + dec c + jr nz,x1D95 + set 7,(ix-1) + ret + +;вх: de - данные для поиска (адрес команды для дизасма) +x1DB3 or a + bit 4,(iy+#00) + ret z + ld bc,(xDDD4) ;счетчик + ld hl,(xDDD6) ;адрес чего-то +x1DC0 ld a,b + or c + ret z + ld a,(hl) + inc hl + cp e + jr nz,x1DCC + ld a,(hl) + cp d + scf + ret z +x1DCC inc hl + dec bc + jr x1DC0 + +;АДРЕС: #1DD0 список команд отладчика +x1DD0 dc "$" + dc "FLOAD" + dc "FSAVE" + db #00 +x1DDC dw x1FB0: db %00100000 ;$ (аналог WORD) + dw x1E45: db %00000100 ;FLOAD + dw x1E4F: db %00000100 ;FSAVE + +;АДРЕС: #1DE5 выполнение слова анализатора +;вх: de - адрес слова анализатора +x1DE5 ld hl,(xE11C) ;адрес первого свободного байта программы анализатора +x1DE8 inc hl + ld (xE9D9),hl ;адрес начала стэка анализатора + inc hl + ld (xE9DB),hl ;адрес вершины стэка анализатора (адрес первой свободной ячейки) +;исполнение команды анализатора + ld hl,#0000 + push hl + push de + ex de,hl +x1DF6 ld a,(hl) + or a + inc hl + jr z,x1E04 +x1DFB ld e,(hl) + inc hl + ld d,(hl) + inc hl + push hl + push de + ex de,hl + jr x1DF6 +;исполнение слова из команды анализатора +x1E04 ld (xE9DD),sp + call x1E0E ;call (hl) + jp x2261 +x1E0E jp (hl) + +;АДРЕС: #1E0F установка кода команды в программу анализатора +;вх: de - адрес программы анализатора +; a - байт программы +;вых: de - адрес программы анализатора +1 (если успешно) +x1E0F push hl + or a + ld hl,xF6C0+#FF + sbc hl,de + jr z,x1E1C + ld (de),a + inc de + pop hl + ret +x1E1C ld a,#2D ;ошибка: insufficient program space + jp x0B06 ;ввод и обработка команды отладчика + +;установка параметров буфера fcb +;вх: a - способ открытия файла +; hl - номер сектора +; de - номер дорожки +;вых: hl=bc вх +; bc - четвертый параметр +x1E21 call x306F ;ix=буфер fcb + ld (ix+#17),a + ld h,e + ld (xE7A9+#0E),hl ;номер первого сектора и дорожки файла + push bc + ld hl,#0000 + ld (xE7A9+#13),hl ;указатель в файле + dec l + ld (ix+#0D),l ;объем файла в секторах =#FF + ld (ix+#1B),l ;максимальный объем файла в секторах =#FF + ld hl,xE8A9 + ld (xE7A9+#15),hl ;адрес буфера dma + pop hl + ld bc,(xDD99+#06) ;размер загружаемого файла (4й параметр) + ret + +;АДРЕС: #1E45 Команда: FLOAD track, sector, start, length +; прямое чтение с диска +;вх: de - номер дорожки +; hl - номер сектора +; bc - адрес загрузки +; a - количество операндов [0..5] +x1E45 ld a,#05 + call x1E21 ;установка параметров буфера fcb + call x30D8 ;чтение файла в память + jr x1E9B ;обработка ошибок и выход в отладчик + +;АДРЕС: #1E4F Команда: FSAVE track, sector, start, length +; прямая запись на диск +;вх: de - номер дорожки +; hl - номер сектора +; bc - адрес загрузки +; a - количество операндов [0..5] +x1E4F ld a,#07 + call x1E21 ;установка параметров буфера fcb + call x3107 ;запись области памяти на диск + jr x1E9B ;обработка ошибок и выход в отладчик + +;АДРЕС: #1E59 открытие файла для чтения/записи программы анализатора +;вх: hl - адрес строки имени файла +; b - способ открытия +;вых: hl - стартовый адрес файла +; bc - длина файла в байтах +x1E59 call x3065 ;установка регистров для загрузки/сохранения + ;hl - адрес строки имени файла + ;ix - адрес буфера создаваемого fcb + ;de - адрес буфера dma =xE8A9 + rst #30 + dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + db #07 + jr c,x1E9E ;ошибка чтения/записи + call x0EBA ;выделение из строки числовых операндов (не более 6) + or a + jr z,x1E6C ;больше нет операндов + ld a,#0B ;ошибка: too many operands + jr x1EA2 ;полное обновление окна отладчика +;открываем файл +x1E6C rst #30 + dw rom7_x11DF ;открыть файл для последующих операций с ним + db #07 + jr c,x1E9E ;ошибка чтения/записи + ld hl,(xE7A9+#09) ;стартовый адрес файла + ret + +;АДРЕС: #1E76 Команда: DEFSave filename +x1E76 bit 3,(iy+#14) + ld a,#2E ;ошибка: program undefined + ret z ;ошибка: программы нет + ld b,#02 ;откроем файлна запись + call x1E59 ;открытие файла для записи программы анализатора + ld hl,(xE11C) ;конец программы + ld bc,xF6C0 ;начало программы + push bc + sbc hl,bc + ld a,#2E ;ошибка: program undefined + jr z,x1EA2 ;нулевая длина + ld b,h + ld c,l + pop hl + call x1ED6 ;запись программы анализатора в файл +x1E95 jr c,x1E9E ;ошибка чтения/записи +;закрываем файл. продолжение работы отладчика +x1E97 rst #30 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + db #07 +x1E9B jp nc,x0AFB +x1E9E rst #30 + dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа + db #06 +x1EA2 jp x0B06 ;полное обновление окна отладчика + +;АДРЕС: #1EA5 Команда: DEFLoad filename +x1EA5 ld b,#01 ;для чтения + call x1E59 ;открытие файла для чтения + ld de,xF6C0 ;расположение программы анализатора + push de + sbc hl,de + pop hl + ld a,#2E ;сообщение: program undefined + jr nz,x1EA2 ;ошибка: несовпадение адреса загрузки + dec bc + dec bc ;bc - длина файла в байтах -2 + ld a,b + cp #04 + ld a,#2D ;сообщение: insufficient program space + jr nc,x1EA2 ;ошибка: слишком длинная программа + push bc + push bc + push hl + call x1F25 ;Команда: CLear (очистим область программы) + pop hl + pop bc + call x1EFB ;чтение программы анализатора из файла + jr c,x1E95 ;ошибка чтения + pop de ;длина программы + ld hl,xF6C0 + add hl,de + ex de,hl ;de - адрес первого свободного байта в буфере программы + call x1F28 ;установка первого свободного байта адреса начала программы анализатора + jr x1E97 ;закрываем файл. продолжение работы отладчика + +;запись программы анализатора в файл +;вх: hl - адрес буфера программы анализатора +; bc - размер для записи +;вых: cy=1 ошибка записи +x1ED6 ld (xE7A9+#09),hl ;стартовый адрес файла + ld a,#41 ;первый байт сигнатуры + call x1EF2 ;запись очередного байта в файл + ret c ;ошибка записи + ld a,(x00F1) ;второй байт сигнатуры + call x1EF2 ;запись очередного байта в файл + ret c ;ошибка записи +x1EE6 ld a,(hl) + call x1EF2 ;запись очередного байта в файл + ret c ;ошибка записи + inc hl + dec bc + ld a,b + or c + jr nz,x1EE6 + ret +;запись очередного байта в файл +x1EF2 push hl + push bc + rst #30 + dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" + db #07 + pop bc + pop hl + ret + +;чтение программы анализатора из файла +;вх: hl - адрес буфера программы анализатора +; bc - размер для загрузки +;вых: cy=1 ошибка чтения +x1EFB call x1F1C ;чтение очередного байта из файла + ret c ;ошибка чтения + cp #41 +x1F01 ld a,#55 ;ошибка: illegal fromat file + jr nz,x1EA2 ;ошибка сигнатуры файла + call x1F1C ;чтение очередного байта из файла + ret c ;ошибка чтения + ld e,a + ld a,(x00F1) + cp e + jr nz,x1F01 +x1F10 call x1F1C ;чтение очередного байта из файла + ret c ;ошибка чтения + ld (hl),a + inc hl + dec bc + ld a,b + or c + jr nz,x1F10 + ret +;чтение очередного байта из файла +x1F1C push hl + push bc + rst #30 + dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". + db #07 + pop bc + pop hl + ret + +;АДРЕС: #1F25 Команда: CLear +x1F25 ld de,xF6C0 +x1F28 call x205F ;установка первого свободного байта адреса начала программы анализатора + xor a + call x1E0F ;установка кода команды в программу анализатора + call x1E0F ;установка кода команды в программу анализатора + ld hl,xE9A9 + ld b,#28 ;очистка буфера программы +x1F37 ld (hl),a + inc hl + djnz x1F37 +x1F3B set 3,(iy+#14) ;есть пустая программа + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #1F42 Команда: ANalyser boolean +x1F42 ld hl,xE028 + bit 3,(hl) + ld a,#2E ;сообщение: program undefined + ret z ;программа не задана + ld a,e + and #FE + or d + ld a,#0C ;сообщение: out of range + ret nz + ld a,#81 ;сообщение: enter command + res 4,(hl) ;выключим анализатор + bit 0,e + ret z + set 4,(hl) ;включим анализатор + ret + +;АДРЕС: #1F5B поиск введенного слова в словаре/программе пользователя +;вх: hl - адрес строки с началом слова +;вых: z - слово в словаре не найдено +; hl - адрес начала введенной строки +; de - не определен +; bc =#0000 +; nz - слово в словаре найдено +; hl - адрес начала параметра в введенной строке +; de - адрес конца слова в словаре (указывает на #00) +; bc - адрес начала введенной строки +x1F5B call x0EE6 ;поиск в строке первого печатного символа + push hl +x1F5F call x1F9B ;проверка является ли символ буквой или цифрой + ld a,#2F ;ошибка: illegal word name + jp c,#0B06 ;ввод и обработка команды отладчика + inc hl + call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) + jr nz,x1F5F ;это не разделитель + pop hl + +;АДРЕС: #1F6E поиск слова по словарю +;вых: z - слово в словаре не найдено +; hl - адрес начала введенной строки +; de - не определен +; bc =#0000 +; nz - слово в словаре найдено +; hl - адрес начала параметра в введенной строке +; de - адрес конца слова в словаре (указывает на #00) +; bc - адрес начала введенной строки +; a - код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) +x1F6E ld de,x23A3 ;начало базовых слов анализатора + call x1F78 ;поиск слова в словаре + ret nz ;слово найдено в словаре +;поиск слова в программе пользователя + ld de,xF6C0 ;программа анализатора + +;поиск слова по словарю +;вых: z - слово в словаре не найдено +; hl - адрес начала введенной строки +; de - не определен +; bc =#0000 +; a=#00 +; nz - слово в словаре найдено +; hl - адрес начала параметра в введенной строке +; de - адрес конца слова в словаре (указывает на #00) +; bc - адрес начала введенной строки +; определение адреса следующего слова +x1F78 ld a,(de) + inc de + ld c,a + ld a,(de) + inc de + ld b,a + or c ;bc - адрес следующего слова + ret z ;конец списка +; сравнение введенного слова сос словом из словаря + push hl ;адрес введенной строки +x1F81 ld a,(de) + and #7F + cp #20 + jr c,x1F92 ;конец названия слова в словаре (слово найдено) + cp (hl) + inc de + inc hl + jr z,x1F81 +x1F8D pop hl +; слово не соответствует введенному, будем проверять следующее слово в словаре + ld e,c + ld d,b + jr x1F78 +; проверяем наличие разделителя после введенного слова +x1F92 call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) + jr nz,x1F8D ;это не разделитель, сравниваем со следующим словом в словаре + inc hl + pop bc + or a + ret + +;проверка является ли символ буквой или цифрой +;вх: a - код символа +;вых: cy=1 - этоне буква/цифра +x1F9B cp #30 ;"0" + ret c + cp #3A ;":" + ccf + ret nc + cp #41 ;"A" + ret c + cp #5B ;"Z"+1 + ccf + ret nc + cp #61 ;"a" + ret c + cp #7B ;"z"+1 + ccf + ret + +;АДРЕС: #1FB0 Команда: WORD word[:] program +;вх: hl - адрес начала строки с параметрами команды +x1FB0 call x1F5B ;поиск введенного слова в словаре/программе пользователя + jp nz,x2148 ;слово найдено + +;проверка на совпадение с зарезервированными словами +x1FB6 ld de,(xE11C) ;адрес первого свободного байта программы анализатора + inc de + inc de + push hl + ld bc,xE9A9 ;буфер программы анализатора + ld a,#73 ;"s" + cp (hl) + jr nz,x1FCD + ld a,#74 ;"t" +x1FC7 inc hl + cp (hl) + jr nz,x2001 + jr x1FD9 ;это зарезервированное слово: st?/br? +x1FCD ld bc,xE9BD + ld a,#62 ;"b" + cp (hl) + jr nz,x2001 + ld a,#72 ;"r" + jr x1FC7 +; есть ли цифра после букв +x1FD9 inc hl + ld a,(hl) + sub #30 + jr c,x2001 + cp #0A + jr nc,x2001 + inc hl + push bc ;адрес буфера адресов зарезервированных слов + ld c,a ;номер слова + call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) + jr nz,x2000 ;таки не принадлежит зарезервированным словам +; задаваемое слово - из зарезервированных слов + sla c + ld b,#00 + pop hl ;адрес буфера адресов зарезервированных слов + add hl,bc + ex (sp),hl + call x2002 ;запись нового слова в программу-анализатор + pop hl ;адрес буфера адресов зарезервированных слов + ld de,(xE9D1) ;адрес начала параметров-слов в программе анализатора + ld (hl),e + inc hl + ld (hl),d + jp x1F3B + +;запись нового слова в программу-анализатор +;вх: de - адрес начала программы анализатора +x2000 pop hl +x2001 pop hl +;установка названия слова-программы анализатора +x2002 ld a,(hl) + or #80 ;первый символ слова + call x1E0F ;установка кода команды в программу анализатора +x2008 inc hl + ld a,(hl) ;очередной символ слова + call x1E0F ;установка кода команды в программу анализатора + call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) + jr nz,x2008 ;это еще не разделитель + cp #0D +x2014 ld a,#30 ;сообщение: no definition + jp z,x0B06 ;конец строки. есть имя, но нет содержания +x2019 ld a,#01 + dec de + ld (de),a ;признак конца названия слова + ld (xE9D1),de + inc de +;установка слов-параметров программы + inc hl + call x0EE6 ;поиск в строке первого печатного символа + jr z,x2014 ;нет параметров в пограмме. выход +x2028 push de ;адрес в программе анализатора + call x1F6E ;поиск слова по словарю + ld b,a ;код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) + ld a,e + ld c,d ;ca - адрес конца слова в словаре (указывает на #00) + pop de ;адрес программы анализатора + jr z,x2064 ;слова в словаре нет +; установка адреса конца слова в словаре + call x1E0F ;установка кода команды в программу анализатора + ld a,c + call x1E0F ;установка кода команды в программу анализатора +; проверка конца строки + ld a,b + cp #0D + jr z,x2043 ;больше нет слов в параметрах +x203E call x0EE6 ;поиск в строке первого печатного символа + jr nz,x2028 ;слово найдено +; слова-параметры закончились +x2043 ld hl,x225D ;п/п прерывания выполнения слова + ld a,l + call x1E0F ;установка кода команды в программу анализатора + ld a,h + call x1E0F ;установка кода команды в программу анализатора + xor a + call x1E0F ;установка кода команды в программу анализатора + call x1E0F ;установка кода команды в программу анализатора + dec de + dec de ;указывает на маркер конца определяемого слова +;установка свободного адреса в программе анализаторе + ld hl,(xE11C) + ld (hl),e + inc hl + ld (hl),d + ld a,#81 ;сообщение: enter command + +;АДРЕС: #205F установка адреса начала программы анализатора +;вх: de - адрес программы анализатора +x205F ld (xE11C),de + ret + +;если число, записываем п/п обработки числа, если отсутствующее слово, то выход +;вх: de - первый свободный адрес в программе анализатора +; hl - адрес слова-параметра в введенной строке +; bc =#0000 +x2064 push de + call x0DF4 ;преобразование строки в число (!!!при base 0 работает неверно!!!) + ld c,e + ld b,d ;bc - число + pop de + jr z,x2076 ;это число + cp #0D ;!!!ОШИБКА!!! A не может быть =#0D + jr nz,x2073 + ld a,#31 ;сообщение: word not known +x2073 jp x0B06 +; установка в программу п/п обработки числа +x2076 push hl + ld hl,x2340 ;п/п обработки числа в программе анализатора + ld a,l + call x1E0F + ld a,h + call x1E0F + ld a,(xE024) ;делитель для выделения разряда числа + call x1E0F + ld a,c + call x1E0F + ld a,b + call x1E0F + pop hl + jr x203E + +;АДРЕС: #2093 Команда: EDit +;вх: hl - адрес начала строки с параметрами команды +x2093 call x1F5B ;поиск введенного слова в словаре/программе пользователя + ld a,#31 ;ошибка: word not known + ret z ;слово не найдено + dec hl ;следующий адрес в введенной строке (после найденного слова) + call x0EE6 ;поиск в строке первого печатного символа + ld a,#0B ;ошибка: too many operands + ret nz ;выход + ex de,hl + ld a,(hl) + or a + jr z,x20BD ;слово в базовом словаре есть !!!ОШИБКА(убрать???)!!! приводит к зависанию + ld a,#32 ;ошибка: forbidden type word + ret z ;!!!ОШИБКА!!! тут выхода не будет никогда + call x20AE + ld a,#06 ;_Working ... + ret + +;печать слова из словаря пользователя +;вх: hl - адрес конца команды/слова анализатора +x20AE ld de,x20FF ;адрес выхода из п/п + push de + ld de,xDE17 ;буфер для печати + ld (xE3BC),de + ld a,#20 ;" " + ld b,#2B ;"+" + +;слово есть в базовом словаре +x20BD ld (de),a + inc de + djnz x20BD + set 6,(iy+#09) ;чтение данных после управляющего кода + ld a,#24 ;"$" + rst #10 ;печать символа + +;АДРЕС: #20C8 печать редактируемого слова +;вх: hl - адрес конца команды/слова анализатора +;печать названия программы(слова) +x20C8 call x2112 ;поиск начала и печать слова анализатора + ld a,":" + rst #10 +;печать слов программы +x20CE ld a," " + rst #10 + call x2121 ;чтение ld bc,(hl+1): hl=hl+2 + push hl + ld hl,x225D ;п/п зхавершения выполнения слова + or a + sbc hl,bc + jr z,x20ED ;это конец программы + ld hl,x2340 ;п/п обработки числа + or a + sbc hl,bc + jr z,x20EF ;это число, а не слово + ld l,c + ld h,b + call x2112 ;поиск начала и печать слова анализатора +x20EA pop hl + jr x20CE ;следующее слово программы +;конец программы +x20ED pop hl + ret +;это число, а не слово +x20EF pop hl + inc hl + ld e,(hl) ;система счисления + call x2121 ;чтение ld bc,(hl+1): hl=hl+2 + ld a,e + or a + push hl + jr z,x2126 ;печать однобайтного числа в кавычках +x20FA call x2130 ;печать числа в заданной системе счисления + jr x20EA + +;выход из п/п +x20FF res 6,(iy+#09) + ret + +;АДРЕС: #2104 печать слова анализатора +;вх: hl - адрес слова анализатора +;вых: hl - адрес начала следующего слова +; cy=1 слово напечатано +; cy=0 нет больше слов для печати +x2104 ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,e + or d + ret z + rst #20 + db #8D ;перевод строки + call x2117 ;печать сообщения из hl. конец сообщения [#00..#1F] + ex de,hl + ret + +;АДРЕС: #2112 поиск начала и печать команды отладчика/слова анализатора +;вх: hl - адрес конца команды/слова анализатора +;вх: hl - не изменяется +x2112 dec hl + bit 7,(hl) + jr z,x2112 +;печать сообщения из hl. конец сообщения [#00..#1F] +x2117 ld a,(hl) + and #7F + cp #20 + ret c + rst #10 + inc hl + jr x2117 + +;АДРЕС: #2121 чтение ld bc,(hl+1): hl=hl+2 +x2121 inc hl + ld c,(hl) + inc hl + ld b,(hl) + ret + +;печать однобайтного числа в кавычках +x2126 ld a,#22 ;'"' + push af + rst #10 + ld a,c + rst #10 + pop af + rst #10 + jr x20EA + +;печать числа в заданной системе счисления +;вх: bc - число +; a - основание системы счисления +x2130 ld hl,x162C ;п/п печати числа в заданной системе счисления + push hl + ld d,a + ld e,"%" + cp #02 + ret z ;двоичная + ld e,"@" + cp #08 + ret z ;восьмеричная + ld e,#2E ;"." + cp #0A + ret z ;десятичная + ld de,#1023 + ret ;шестнадцатиричная + +;АДРЕС: #2148 Команда: WORD word[:] program +; Продолжение (для переопределения уже определенных слов) +;Вх: de - адрес конца слова в программе (указывает на #01) +; bc - адрес начала введенной строки +x2148 ld (xE9D3),de ;адрес конца названия слова в программе (указывает на #01) + ld hl,(xE11C) ;адрес первого свободного байта программы анализатора + push hl + ex de,hl +;ищем начало слова +x2151 bit 7,(hl) + dec hl + jr z,x2151 + dec hl + ld (xE9D5),hl ;адрес первой ячейки переопределяемого слова +;записываем новое слов в программу + ld h,b + ld l,c ;адрес начала введенной строки + call x1FB6 ;установка слова праграммы +;удаление переопределяемого слова + ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова + ld e,(hl) + inc hl + ld d,(hl) + dec hl + ex de,hl + push de ;de - адрес начала переопределяемого слова + push hl ;hl - адрес начала следующего слова, после переопределяемого + push hl + ld b,h + ld c,l ;bc - адрес начала следующего слова, после переопределяемого + ld hl,(xE11C) ;адрес первого свободного байта программы анализатора + or a + sbc hl,bc + ld b,h + ld c,l ;bc - длина перемещаемого блока программы + inc bc + inc bc + pop hl + ldir + dec de + dec de + ld (xE11C),de + pop de ;de - адрес начала следующего слова, после переопределяемого + pop hl ;hl - адрес начала переопределяемого слова + or a + sbc hl,de + ld b,h + ld c,l + pop hl + add hl,bc + inc hl +x2189 inc hl + ld a,(hl) + cp #20 + jr nc,x2189 + ld (xE9D7),hl ;адрес конца названия переопределенного слова в программе (указывает на #01) +;коррекция адресов слов в программе + ld hl,xF6C0 ;начало программы +x2195 ld e,(hl) + inc hl + ld d,(hl) + ld a,d + or e ;адрес следующего слова + jr z,x21D7 ;конец программы + push hl ;адрес ячейки с указанием на следующее слово + ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова + or a + sbc hl,de + jr nc,x21AE + ld h,b + ld l,c ;на сколько сократилась программа + add hl,de + ex de,hl + pop hl + push hl + ld (hl),d + dec hl + ld (hl),e +x21AE pop hl + inc hl +; ищем конец слова +x21B0 ld a,(hl) + inc hl + cp #20 + jr nc,x21B0 +x21B6 ld e,(hl) + inc hl + ld d,(hl) ;de - адрес слова программы + inc hl + push hl + ld hl,x2340 + or a + sbc hl,de + jr nz,x21C9 ;это не число + pop hl ;для числа оставляем как есть + inc hl + inc hl + inc hl + jr x21B6 +x21C9 ld hl,x225D ;прерывание выполнения слова + or a + sbc hl,de + pop hl + jr z,x2195 ;это конец слова-программы + call x21F3 ;коррекция адреса конца пользовательского слова в программе + jr x21B6 + +;завершение. коррекция адресов зарезервированных слов в программе +x21D7 ld hl,xE9A9 ;адреса зарезервированных слов анализатора st0-st9 + call x21E0 + ld hl,xE9BD ;адреса зарезервированных слов анализатора br0-br9 +x21E0 ld a,#0A +x21E2 push af + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,d + or e + call nz,x21F3 + pop af + dec a + jr nz,x21E2 + ld a,#88 ;сообщение: word redefined + ret + +;коррекция адреса конца пользовательского слова в программе +x21F3 push hl + ld hl,(xE9D3) + or a + sbc hl,de + jr z,x220E + jr nc,x220C + ld a,(de) + or a + jr z,x220C + ld h,b + ld l,c + add hl,de + ex de,hl +x2206 pop hl + push hl + dec hl + ld (hl),d + dec hl + ld (hl),e +x220C pop hl + ret +x220E ld de,(xE9D7) + jr x2206 + +;АДРЕС: #2214 Команда: PDEFinition вывод на принтер Форт - программы +x2214 set 4,(iy+#09) + +;АДРЕС: #2218 Команда: LDEFinition вывод на экран Форт - программы +x2218 call x3A95 ;подготовка переменных к выводу на экран/принтер + ld bc,#3300 ;сообщение: analyser definitions: + rst #08 + rst #20 + db #0D,#8D +;печать размера свободной области + ld hl,xF6C0+#FF ;адрес конца стэка анализатора + ld de,(xE11C) ;адрес первого свободного байта стэка анализатора + scf + sbc hl,de + ld (xDDA7),hl + ld bc,#3400 ;сообщение: space left for stack _число_ + rst #08 + ld a," " + rst #10 + ld bc,#3500 ;сообщение: bytes + rst #08 + rst #20 + db #0D,#8D +;печать списка заданных слов + ld hl,xF6C0 +x2240 ld c,(hl) + inc hl + ld b,(hl) + ld a,b + or c + jr z,x2256 ;конец программы + push bc ;адрес следующего слова + inc hl + inc hl + call x20C8 ;печать редактируемого слова + ld a,#0D + rst #10 ;перевод строки + call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) + pop hl + jr x2240 +;завершение печати +x2256 res 4,(iy+#09) ;печать в экран + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #225D прерывание выполнения слова/завершение работы форт программы +x225D nop + pop hl + pop hl + pop hl + +;АДРЕС: #2261 переход к обработке следующего слова в программе анализатора +; или выход, если слов больше нет +x2261 pop de + pop hl + ld a,l + or h + jp nz,x1DFB +;слов в программе больше нет + bit 5,(iy+#14) + ret nz ;вызов был из команды EVal + push hl + push de + ld (xE9DD),sp + ld hl,(xE9DB) + ld de,(xE11C) + inc de + inc de + inc de + inc de + or a + sbc hl,de + ld a,#36 ;сообщение: stack not empty + jp nz,x2307 ;обработка ошибок при работе программы анализатора + call x237F ;чтение элемента с вершины стэка анализатора + ld a,c + or b + pop hl + pop hl + ret z + pop hl + pop hl + pop af + ld l,a ;число для сообщения + ld a,#85 ;сообщение: stop number _число_ + jp x01D5 + +;АДРЕС: #2297 Команда: EVal word выполнить слово word +;вх: hl - адрес строки с параметрами +x2297 bit 3,(iy+#14) + ld a,#2E ;сообщение: program undefined + ret z ;программа анализатора не задана +;анализ команды ассемблера по адресу PC + push hl + ld hl,(xDD6B) ;pc программы пользователя + call x2F96 ;анализ команды ассемблера по адресу в hl + pop hl +;установка слов команды в программу анализатора + ld de,(xE11C) ;адрес первого свободного байта программы анализатора + push de + push hl + inc de + inc de ;поправка на адрес + ld hl,x2301 + ld b,#07 +x22B3 ld a,(hl) + call x1E0F ;установка кода команды в программу анализатора + inc hl + djnz x22B3 + pop hl ;hl - адрес строки с параметрами команды (список слов на выполнение) + dec hl ;de - адрес первого свободного байта программы анализатора + push de + call x2019 ;установка слов в программу + pop de + dec de +;выполнение введенных слов + ld hl,(xE11C) ;адрес первого свободного байта программы анализатора + ex (sp),hl + ld (xE11C),hl + xor a + ld (hl),a + inc hl + ld (hl),a ;нет больше слов, только эти + set 5,(iy+#14) ;работает команда EVal word + pop hl + call x1DE8 ;выполнение слова анализатора + res 5,(iy+#14) +;печать содержимого стэка анализатора + call x3A95 ;подготовка переменных к выводу на экран/принтер + ld bc,#3700 ;сообщение: state of stack + rst #08 ;печать сообщения + ld a,#0D + rst #10 ;перевод строки + ld de,(xE9D9) ;адрес начала стэка анализатора + inc de +x22E8 ld hl,(xE9DB) ;адрес вершины стэка анализатора + or a + sbc hl,de + ld a,#81 ;сообщение: enter command + ret z ;стэк пустой + push de + ld a,#0D + rst #10 ;перевод строки + call x237F ;чтение элемента с вершины стэка анализатора + call x1614 ;печать числа в bc (dec/hex) с префиксом + call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) + pop de + jr x22E8 +x2301 db #80+"*","eval*" + +;обработка ошибок при работе программы анализатора +;вх: a - номер сообщения об ошибке +x2307 ld (xDDA7),a + ld sp,(xE9DD) + call x0550 ;сохранение экрана из страницы 5 + call x3A95 ;подготовка переменных к выводу на экран/принтер + ld bc,#3800 ;сообщение: workspace insufficient + rst #08 ;печать сообщения по номеру в BC + rst #20 + db #0D,#8D ;два перевода строки +x231B pop hl + push hl + ld de,x2340 + or a + sbc hl,de + pop hl + jr z,x2332 + push hl + rst #20 + dc "in " + pop hl + call x2112 ;поиск начала и печать слова анализатора + ld a,#0D + rst #10 ;перевод строки +x2332 call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) + pop hl + ld a,h + or l + jr nz,x231B + ld a,(xDDA7) + jp x0B06 + +; обработки числа в программе анализатора +x2340 nop + pop ix + pop de + pop hl + call x2121 ;чтение ld bc,(hl+1): hl=hl+2 + inc hl + push hl + push de + push ix + +;АДРЕС: #234D запись элемента на стэк анализатора +;вх: bc - значение для помещения на стэк анализатора +x234D push hl + push de + ld hl,(xE9DB) ;адрес вершины стэка анализатора + push hl + inc hl + inc hl + ld de,xF6C0+#FF ;xF7BF адрес конца стэка анализатора + or a + sbc hl,de + ld a,#39 ;сообщение: out of stack space + jr nc,x2307 ;нет места на стэке + pop hl + ld (hl),c ;пишем значение на стэк + inc hl + ld (hl),b + inc hl + +;АДРЕС: #2364 установка нового значения вершины стэка анализатора +;вх: hl - адрес новой вершины стэка +x2364 ld (xE9DB),hl + pop de + pop hl + ret + +;АДРЕС: #236A запись на стэк анализатора байта из ячейки памяти пользователя +;вх: bc - адрес памяти +x236A push hl + ld l,c + ld h,b ;адрес в памяти пользователя + rst #28 ;чтение байта из памяти пользователя + pop hl + ld c,a + ld b,#00 + jr x234D ;запись элемента на стэк анализатора + +;АДРЕС: #2374 запись на стэк анализатора слова из ячеек памяти пользователя +;вх: bc - адрес памяти +x2374 push hl + ld l,c + ld h,b + rst #28 ;чтение байта из памяти пользователя + ld c,a + inc hl + rst #28 ;чтение байта из памяти пользователя + ld b,a + pop hl + jr x234D ;запись элемента на стэк анализатора + +;АДРЕС: #237F чтение элемента с вершины стэка анализатора +;вых: bc - считанное значение +x237F push hl + push de + ld hl,(xE9DB) ;адрес вершины стэка анализатора + dec hl + push hl + or a + ld de,(xE9D9) ;адрес начала стэка анализатора + sbc hl,de + ld a,#3A ;сообщение: stack empty + jp z,x2307 ;выход по ошибке + pop hl + ld b,(hl) + dec hl + ld c,(hl) ;bc - содержимое вершины стэка анализатора + jr x2364 + +;АДРЕС: #2398 чтение двух элементов с вершины стэка анализатора +;вых: hl,de - первое значение +; bc - второе значение +x2398 call x237F ;чтение элемента с вершины стэка анализатора + push bc + call x237F ;чтение элемента с вершины стэка анализатора + pop de + ld l,e + ld h,d + ret + +;АДРЕС: #23A3 базовые слова анализатора +;слово: NOP нет операции +; +0 2 адрес следующего слова (=#0000 это конец списка) +; +2 n слово анализатора (в первом байте 7,=1), #00 признак конча слова +; +2+n процедура обработки слова +x23A3 dw x23AA + db #80+"N","OP",#00 +; процедура обработки + ret + +;слово: DUP Дублировать содержимое вершины стека. На стеке создается копия +; верхнего элемента +x23AA dw x23B8 + db #80+"D","UP",#00 +; процедура обработки +x23B0 call x237F ;чтение элемента с вершины стэка анализатора + call x234D ;запись элемента на стэк анализатора + jr x234D ;запись элемента на стэк анализатора + +;слово: SWAP перестановка двух элементов на вершине стека +x23B8 dw x23CC + db #80+"S","WAP",#00 +; процедура обработки +x23BF call x2398 ;чтение двух элементов с вершины стэка анализатора + push bc + ld c,l + ld b,h + call x234D ;запись элемента на стэк анализатора + pop bc +x23C9 jp x234D ;запись элемента на стэк анализатора + +;слово: OVER копирование второго от вершины элемента стека. Копия помещается +; на вершину стека +x23CC dw x23E0 + db #80+"O","VER",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + push bc + call x23B0 ;слово: DUP + pop bc + call x234D ;запись элемента на стэк анализатора + jr x23BF ;слово: SWAP + +;слово: ROT циклический сдвиг трех верхних элементов стека. Третий от вершины +; стека элемент помещается на вершину стека. +x23E0 dw x23FE + db #80+"R","OT",#00 +; процедура обработки +x23E6 call x2398 ;чтение двух элементов с вершины стэка анализатора + push hl + push bc + call x237F ;чтение элемента с вершины стэка анализатора + pop hl + push bc + ld c,l + ld b,h + call x234D ;запись элемента на стэк анализатора + pop de + pop bc + push de + call x234D ;запись элемента на стэк анализатора + pop bc + jr x23C9 ;запись значения на стэк анализатора + +;слово: DROP удаление верхнего элемента стека +x23FE dw x2408 + db #80+"D","ROP",#00 +; процедура обработки + jp x237F ;чтение элемента с вершины стэка анализатора + +;слово: + получить значение суммы двух верхних элементов стека +x2408 dw x2414 + db #80+"+",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + add hl,bc +x2410 ld c,l + ld b,h + jr x23C9 ;запись значения на стэк анализатора + +;слово: - получить значение разности двух верхних элементов стека +x2414 dw x2422 + db #80+"-",#00 +; процедура обработки +x2418 call x2398 ;чтение двух элементов с вершины стэка анализатора + ld h,b + ld l,c + or a + sbc hl,de + jr x2410 ;запись значения на стэк анализатора + +;слово: / получить значение частного от целочисленного деления двух верхних +; элементов стека +x2422 dw x2439 + db #80+"/",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld l,c + ld h,b + call x0E73 ;деление bc=hl/de с проверкой de на ноль + bit 2,(iy+#0E) ;=1 ошибка. деление на ноль + jr z,x2456 ;запись элемента на стэк анализатора + ld a,#40 ;сообщение: devision by zero + jp x2307 + +;слово: * получить значение произведения двух верхних элементов стека +x2439 dw x2447 + db #80+"*",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld l,c + ld h,b + call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) + jr x2410 ;запись значения на стэк анализатора + +;слово: AND получить значение операции поразрядного логического "И" над двумя +; верхними элементами стека +x2447 dw x2459 + db #80+"A","ND",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,c + and l + ld c,a + ld a,b + and h + ld b,a +x2456 jp x234D ;запись элемента на стэк анализатора + +;слово: OR получить значение операции поразрядного логического "ИЛИ" над двумя +; верхними элементами стека +x2459 dw x2469 + db #80+"O","R",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,c + or l + ld c,a + ld a,b + or h + ld b,a + jr x2456 ;запись элемента на стэк анализатора + +;слово: XOR получить значение операции поразрядного логического "Исключающее +; ИЛИ" над двумя верхними элементами стека +x2469 dw x247A + db #80+"X","OR",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,c + xor l + ld c,a + ld a,b + xor h + ld b,a + jr x2456 ;запись элемента на стэк анализатора + +;слово: NOT инвертировать значение находящееся на вершине стека +x247A dw x248B + db #80+"N","OT",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld a,b + cpl + ld b,a + ld a,c + cpl + ld c,a + jr x2456 ;запись элемента на стэк анализатора + +;слово: = истина при равенстве двух элементов, в противном случае Ложь +x248B dw x2494 + db #80+"=",#00 +; процедура обработки + call x2418 ;слово: - + jr x24CB ;слово: 0= + +;слово: 0> истина, если элемент положителен (больше нуля), в противном случае +; Ложь +x2494 dw x24A7 + db #80+"0",">",#00 +; процедура обработки +x2499 call x237F ;чтение элемента с вершины стэка анализатора + ld a,c + or b +x249E ld bc,#0000 + jr z,x24A4 +x24A3 inc bc +x24A4 jp x234D ;запись элемента на стэк анализатора + +;слово: < истина, если n1 меньше чем n2, в противном случае Ложь +x24A7 dw x24BA + db #80+"<",#00 +; процедура обработки +x24AB call x2398 ;чтение двух элементов с вершины стэка анализатора + ld l,c + ld h,b + or a + sbc hl,de +x24B3 ld bc,#0000 + jr c,x24A3 ;запись =1 на стэк анализатора + jr x24A4 ;запись =0 на стэк анализатора + +;слово: > истина, если n1 больше чем n2, в противном случае Ложь +x24BA dw x24C6 + db #80+">",#00 +; процедура обработки +x24BE call x2398 ;чтение двух элементов с вершины стэка анализатора + or a + sbc hl,bc + jr x24B3 + +;слово: 0= истина, если элемент равен нулю, в противном случае Ложь +x24C6 dw x24D8 + db #80+"0","=",#00 +; процедура обработки +x24CB call x237F ;чтение элемента с вершины стэка анализатора + ld a,c + or b + inc bc + jr z,x24D6 + ld bc,#0000 +x24D6 jr x24A4 ;запись элемента на стэк анализатора + +;слово: <= истина, если n1 меньше или равно n2, в противном случае Ложь +x24D8 dw x24E2 + db #80+"<","=",#00 +; процедура обработки +x24DD call x24BE ;слово: > + jr x24CB ;слово: 0= + +;слово: >= истина, если n1 больше или равно n2, в противном случае Лож +x24E2 dw x24EC + db #80+">","=",#00 +; процедура обработки + call x24AB ;слово: < + jr x24CB ;слово: 0= + +;слово: <> истина, если n1 не равно n2, в противном случае Ложь +x24EC dw x24F6 + db #80+"<",">",#00 +; процедура обработки + call x2418 ;слово: - + jr x2499 ;слово: 0> + +;слово: & поместить на вершину стека значение операции логическое "И" над двумя +; верхними элементами стека, сами элементы при этом удаляются. В +; отличие от слова AND, слово & работает с логическими величинами +; (Истина и Ложь) +x24F6 dw x2505 + db #80+"&",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,b + or c + jr z,x249E + ld a,l + or h + jr x249E + +;слово: C@ разместить на вершине стека байт, считанный по адресу n1 +x2505 dw x2510 + db #80+"C","@",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + jp x236A ;запись на стэк анализатора байта из ячейки памяти пользователя + +;слово: C@ разместить на вершине стека байт, считанный по адресу n1 +x2510 dw x251A + db #80+"@",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + jp x2374 ;запись на стэк анализатора слова из ячеек памяти пользователя + +;слово: BIT разместить на вершине стека значение бита с номером n1 в элементе n2 +x251A dw x253D + db #80+"B","IT",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld h,#00 + ld a,l + and #0F + ld de,#0001 + jr x2531 +x252D sla e + rl d +x2531 dec a + jp p,x252D + ld a,e + and c + ld c,a + ld a,d + and b + or c + jr x255E ;запись значения на стэк анализатора + +;слово: ADDR разместить на вершине стека значение адреса на который ссылаются +; команды работающие с ячейками памяти, такие как LD ( ),reg или +; SET b,(IX+d). Для других команд на стек помещается значение 0 +x253D dw x2555 + db #80+"A","DDR",#00 +; процедура обработки + ld a,(iy+#04) + ld bc,#0000 + and %00000011 + jr z,x2552 + ld bc,(xDDD2) +x2552 jp x234D ;запись значения на стэк анализатора + +;слово: RD истина, если команда считывает из памяти, и Ложь, если считывания +; не происходит +x2555 dw x2561 + db #80+"R","D",#00 +; процедура обработки + bit 0,(iy+#04) +x255E jp x249E ;запись значения на стэк анализатора + +;слово: WR истина, если команда производит запись в память, и Ложь, если запись +; не выполняется +x2561 dw x256C + db #80+"W","R",#00 +; процедура обработки + bit 1,(iy+#04) + jr x255E + +;слово: ACF помещает на вершину стека значение Истина, если команда использует +; доступ к ячейке памяти, для других команд - помещается значение Ложь +x256C dw x2579 + db #80+"A","CF",#00 +; процедура обработки + ld a,(xE018) + and %00000011 + jr x255E + +;слово: CF значение флага переноса +x2579 dw x2586 + db #80+"C","F",#00 +; процедура обработки + ld a,#01 +x2580 ld hl,xDD7F + and (hl) + jr x255E + +;слово: NF значение флага команды вычитания +x2586 dw x258F + db #80+"N","F",#00 +; процедура обработки + ld a,#02 + jr x2580 + +;слово: PVF значение флага четности/переполнения +x258F dw x2599 + db #80+"P","VF",#00 +; процедура обработки + ld a,#04 + jr x2580 + +;слово: HF значения флага двоично - десятичного переноса +x2599 dw x25A2 + db #80+"H","F",#00 +; процедура обработки + ld a,#10 + jr x2580 + +;слово: ZF значение флага нулевого результата +x25A2 dw x25AB + db #80+"Z","F",#00 +; процедура обработки + ld a,#40 + jr x2580 + +;слово: SF значение флага отрицательного результата +x25AB dw x25B4 + db #80+"S","F",#00 +; процедура обработки + ld a,#80 + jr x2580 + +;слово: REG размещает на вершине стека значение регистровой пары, соответствующей коду n1 +x25B4 dw x25CC + db #80+"R","EG",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + +;запись регистровой пары на стэк анализатора +;вх: c - код регистровой пары/ячейки MEM +x25BD ld hl,xDD69 ;адрес текущей ячейки в мониторе + ld b,#00 + add hl,bc + ld c,(hl) + inc hl + ld b,(hl) ;bc - значение регистровой пары/ячейки MEM + jr x2552 ;запись элемента на стэк анализатора + +;чтение кода и запись регистровой пары на стэк анализатора +x25C8 pop hl + ld c,(hl) + jr x25BD ;запись регистровой пары на стэк анализатора + +;слово: CREG размещает на вершине стека значение регистра, выбираемого кодом n1 +x25CC dw x25E6 + db #80+"C","REG",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора +x25D6 ld hl,xDD69 + ld b,#00 + add hl,bc + ld c,(hl) + ld b,#00 + jp x234D ;запись элемента на стэк анализатора +x25E2 pop hl + ld c,(hl) + jr x25D6 + +;слово: SP размещает на вершине стека значение регистра SP +x25E6 dw x25EF + db #80+"S","P",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #04 + +;слово: PC размещает на вершине стека значение регистра PC +x25EF dw x25F8 + db #80+"P","C",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #02 + +;слово: IX размещает на вершине стека значение регистра IX +x25F8 dw x2601 + db #80+"I","X",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #06 + +;слово: IY размещает на вершине стека значение регистра IY +x2601 dw x260A + db #80+"I","Y",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #08 + +;слово: BC размещает на вершине стека значение регистра BC +x260A dw x2613 + db #80+"B","C",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #0E + +;слово: DE размещает на вершине стека значение регистра DE +x2613 dw x261C + db #80+"D","E",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #0C + +;слово: HL размещает на вершине стека значение регистра HL +x261C dw x2625 + db #80+"H","L",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #0A + +;слово: AF размещает на вершине стека значение регистра AF +x2625 dw x262E + db #80+"A","F",#00 +; процедура обработки + call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора + db #16 + +;слово: C размещает на вершине стека значение регистра C +x262E dw x2636 + db #80+"C",#00 +; процедура обработки + call x25E2 + db #0E + +;слово: B размещает на вершине стека значение регистра B +x2636 dw x263E + db #80+"B",#00 +; процедура обработки + call x25E2 + db #0F + +;слово: E размещает на вершине стека значение регистра E +x263E dw x2646 + db #80+"E",#00 +; процедура обработки + call x25E2 + db #0C + +;слово: D размещает на вершине стека значение регистра D +x2646 dw x264E + db #80+"D",#00 +; процедура обработки + call x25E2 + db #0D + +;слово: L размещает на вершине стека значение регистра L +x264E dw x2656 + db #80+"L",#00 +; процедура обработки + call x25E2 + db #0A + +;слово: H размещает на вершине стека значение регистра H +x2656 dw x265E + db #80+"H",#00 +; процедура обработки + call x25E2 + db #0B + +;слово: F размещает на вершине стека значение регистра F +x265E dw x2666 + db #80+"F",#00 +; процедура обработки + call x25E2 + db #16 + +;слово: A размещает на вершине стека значение регистра A +x2666 dw x266E + db #80+"A",#00 +; процедура обработки + call x25E2 + db #17 + +;слово: MEM поместить на вершину стека значение текущей ячейки монитора +x266E dw x2678 + db #80+"M","EM",#00 +; процедура обработки + call x25C8 ;чтение кода и запись номера ячейки на стэк анализатора + db #00 ;код ячейки MEM + +;слово: CALL выполнить подпрограмму, расположенную по адресу n1 +x2678 dw x269A + db #80+"C","ALL",#00 +; процедура обработки + push iy + push ix + call x268B + pop ix + pop iy + ret +x268B call x237F ;чтение элемента с вершины стэка анализатора + push bc + ld ix,xDD69 + ld de,x234D ;п/п записи элемента на стэк анализатора + ld hl,x237F ;п/п чтения элемента с вершины стэка анализатора + ret + +;слово: ! слово (два смежных байта) n1 поместить в память по адресу n2 +x269A dw x26A7 + db #80+"!",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,c + rst #00 ;запись байта в память пользователя + inc hl + ld a,b +x26A5 rst #00 ;запись байта в память пользователя + ret + +;слово: C! байт n1 поместить в ячейку памяти, адресуемую n2 +x26A7 dw x26B2 + db #80+"C","!",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,c + jr x26A5 + +;слово: IF если верхний элемент стека имеет значение Ложь (равен нулю), то +; выполнение слова, содержащего IF, прекращается. Управление передается +; вызвавшему слову (либо происходит окончание выполнения +; Форт - программы, если слово является первым). В противном случае +; (верхний элемент - Истина) продолжается выполнение текущего слова +x26B2 dw x26C0 + db #80+"I","F",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld a,b + or c + ret nz ;продолжаем выполнять + jp x225D ;прерывание выполнения слова + +;слово: MEM! установить адрес текущей ячейкой монитора n1 +x26C0 dw x26CF + db #80+"M","EM!",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld (xDD69),bc + ret + +;слово: ?PAUSE ожидание нажатия на любую клавишу, если верхний элемент стека +; имеет значение Истина (не равен нулю). После нажатия на клавишу +; выполнение программы продолжается. Если вовремя ожидания ввести +; комбинацию EDIT/C, то выполнение Форт - программы будет прервано, +; а управление передано монитору +x26CF dw x26EA + db #80+"?","PAUSE",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld a,c + or b + ret z + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + cp #03 ;cs+1+c + ret nz + ld a,#9A ;сообщение: command abandoned + jp x2307 + +;слово: KEY ожидание нажатия на какую-либо клавишу, код клавиш будет помещен на +; вершину стека +x26EA dw x26FA + db #80+"K","EY",#00 +; процедура обработки + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 +x26F4 ld c,a + ld b,#00 +x26F7 jp x234D ;запись элемента на стэк анализатора + + +;слово: ?MEM обновить (перевывести) вывести дамп памяти на экран (используется +; экран дампа памяти теневого монитора), если n1 истина +; (не равно нулю) +x26FA dw x270C + db #80+"?","MEM",#00 +; процедура обработки + call x2736 + and #CF ;обновлять дамп памяти, обновлять дизассемблер памяти по содержимому ячейки памяти +x2706 ld (xE01E),a + jp x2CA8 ;печать/обновление монитора-отладчика + +;слово: ?REG обновить (перевывести) информацию о содержимом регистров на экране +; монитора, если n1 истина (не равно нулю) +x270C dw x271A + db #80+"?","REG",#00 +; процедура обработки + call x2736 + and #F5 + jr x2706 + +;слово: ?DIS вывести реассемблер трассируемых команд (в правый верхний угол +; экрана). Реассемблер выводится по содержимому регистра PC, если +; n1 истина (не равно нулю) +x271A dw x2728 + db #80+"?","DIS",#00 +; процедура обработки + call x2736 + and #BF + jr x2706 + +;слово: ?SCR полностью перевывести экран теневого монитора, если n1 истина +; (не равно нулю) +x2728 dw x2742 + db #80+"?","SCR",#00 +; процедура обработки + call x2736 + and #80 + jr x2706 +;чтение переменной (xE01E) +x2736 call x237F ;чтение элемента с вершины стэка анализатора + ld a,c + or b + pop hl + ret z + push hl + ld a,(xE01E) + ret + +;слово: SYS1 на вершину стека помещается значение системного регистра #7FFD +x2742 dw x2750 + db #80+"S","YS1",#00 +; процедура обработки + ld c,(iy-#02) +x274C ld b,#00 + jr x26F7 ;запись элемента на стэк анализатора + +;слово: SYS2 на вершину стека помещается значение системного регистра #1FFD +x2750 dw x275C + db #80+"S","YS2",#00 +; процедура обработки + ld c,(iy-#01) + jr x274C + +;слово: !SYS1 значение верхнего элемента стека устанавливается в системном +; регистре #7FFD +x275C dw x276B + db #80+"!","SYS1",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld (iy-#02),c + ret + +;слово: !SYS2 значение верхнего элемента стека устанавливается в системном +; регистре #1FFD +x276B dw x277A + db #80+"!","SYS2",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld (iy-#01),c + ret + +;слово: IFF на вершину стека помещается состояние флага разрешения прерываний +; в отлаживаемой программе +x277A dw x278A + db #80+"I","FF",#00 +; процедура обработки + ld a,(xDD83) + and #04 + rrca + rrca + jp x26F4 ;запись элемента на стэк анализатора + +;слово: RAM поместить на вершину стека номер установленного банка +x278A dw x2796 + db #80+"R","AM",#00 +; процедура обработки + call x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + jp x26F4 ;запись элемента на стэк анализатора + +;слово: !RAM изменить номер установленного банка на банк, указываемый верхним +; элементом стека +x2796 dw x27A4 + db #80+"!","RAM",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + ld l,c + jp x3732 ;установка страницы пользователя равной номеру страницы в L + +;слово: IN поместить на вершину стека данные, считанные из порта ввода, +; адресуемого значением верхнего элемента стека +x27A4 dw x27B0 + db #80+"I","N",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + in c,(c) + jr x274C + +;слово: OUT вывести в порт вывода с адресом n2 данные n1 +x27B0 dw x27BC + db #80+"O","UT",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + out (c),l + ret + +;слово: DIN поместить на вершину стека данные, считанные из порта ввода Tr-Dos, +; адресуемого значением верхнего элемента стека +x27BC dw x27CB + db #80+"D","IN",#00 +; процедура обработки + call x237F ;чтение элемента с вершины стэка анализатора + rst #18 ;вызов п/п Tr-Dos + dw rom3_x3FF3 ;чтение порта + ld c,a + jr x274C ;запись элемента на стэк анализатора + +;слово: DOUT вывести в порт вывода Tr-Dos с адресом n2 данные n1 +x27CB dw x27DA + db #80+"D","OUT",#00 +; процедура обработки + call x2398 ;чтение двух элементов с вершины стэка анализатора + ld a,l + rst #18 ;вызов п/п Tr-Dos + dw rom3_x3FF0 ;запись в порт + ret + +;конец списка слов +x27DA dw #0000 + +;список управляющих кодов +x27DC db #01 ;установка атрибутов для последующих символов + db #02 ;восстановление запомненных атрибутов + db #04 ;вывод с выравниванием + db #05 ;вывод строки по центру окна + db #06 ;вывод строки выровненной по правому краю окна + db #07 ;звонок + db #0A ;перевод строки + db #0C ;очистка окна + db #0D ;перевод каретки + db #1B ;позиционирование курсора внутри окна +x27E6 db #1E ;"обратный свиток" + +;таблица с адресами обработки управляющих кодов +x27E7 dw x2BF8 ;#01 + dw x2C18 ;#02 + dw x2AAD ;#04 + dw x2ACA ;#05 + dw x2AED ;#06 + dw x2BA8 ;#07 + dw x2B7D ;#0A + dw x2A5E ;#0C + dw x2B6E ;#0D + dw x2BCA ;#1B + dw x2A1B ;#1E + +;АДРЕС: #27FD удаление курсора и печать символа в окне +;вх: ix - адрес дескриптора окна +; a - код символа +;вых: nz - следующие координаты печати не установлены +; +x27FD call x28B8 ;признак печати и восстановление экрана + +;АДРЕС: #2800 печать символа в окне +;вх: ix - адрес дескриптора окна +; a - код символа +;вых: nz - следующие координаты печати не установлены +; +x2800 ld l,a + ld c,a ;!!! лишняя команда + ld h,#00 + add hl,hl + add hl,hl + add hl,hl + ld de,(xE9E5) + add hl,de ;адрес данных символа + ld a,(ix+#0A) + cp #08 + jr nz,x2847 ;символ 6 пикселей + push hl + call x297C ;расчет экранного адреса курсора + pop de + ld b,#08 ;печать символа 8pix +x281A ld a,(de) + ld (hl),a + inc de + inc h + djnz x281A +x2820 bit 1,(ix+7) ;печать атрибутов, если нужно + jr z,x2834 ;атрибуты не печатаем + dec h + ld a,h + rrca + rrca + rrca + and #03 + xor #58 + ld h,a ;адрес в области атрибутов + ld a,(ix+6) + ld (hl),a +x2834 bit 1,(iy+9) ;установим следующие координаты печати + ret nz + inc (ix+1) ;crd X+1 + ld a,(ix+#0B) ;ширина окна в символах + cp (ix+1) + ret nc ;еще не вышли за пределы окна + dec (ix+1) + ret +;печать символа шириной 6 пикселей +x2847 push hl ;адрес данных символа + call x292F ;расчет экранного адреса курсора + pop de + ld a,b ;печать символа + ld b,#08 + or a + jr z,x28A8 ;нет сдвига символа + cp #04 + jr c,x2896 ;сдвиг 2 пикселя + jr z,x2876 ;сдвиг 4 пикселя +; координата в знакоместе 6 +x2858 ld a,(de) + rlca + rlca + push af ;левая часть + and %00000011 + ld c,a + ld a,(hl) + and %11111100 + or c + ld (hl),a + inc hl + pop af + and %11110000 ;правая часть + ld c,a + ld a,(hl) + and %00001111 + or c + ld (hl),a + dec hl + inc h + inc de + djnz x2858 + jp x2820 ;печать атрибутов и выход +; координата в знакоместе 4 +x2876 ld a,(de) + rlca + rlca + rlca + rlca + push af ;левая часть + and %00001111 + ld c,a + ld a,(hl) + and %11110000 + or c + ld (hl),a + inc hl + pop af ;правая часть + and %11000000 + ld c,a + ld a,(hl) + and %00111111 + or c + ld (hl),a + dec hl + inc h + inc de + djnz x2876 + jp x2820 ;печать атрибутов и выход +; координата в знакоместе 2 +x2896 ld a,(hl) + and %11000000 + ld c,a + ld a,(de) + rrca + rrca + and %00111111 + or c + ld (hl),a + inc h + inc de + djnz x2896 + jp x2820 ;печать атрибутов и выход +; координата в знакоместе 0 +x28A8 ld a,(hl) + and %00000011 + ld c,a + ld a,(de) + and %11111100 + or c + ld (hl),a + inc h + inc de + djnz x28A8 + jp x2820 ;печать атрибутов и выход + +;АДРЕС: #28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) +;вх: ix - адрес дескриптора окна +; +x28B8 set 2,(iy+9) + bit 0,(iy+9) + ret z + res 0,(iy+9) + +;АДРЕС: #28C5 сохранение экрана под курсором (6 пикселей символ) +;вх: ix - адрес дескриптора окна +; +x28C5 push af + call x292F ;расчет экранного адреса курсора в окне для символов 6 пикселей + ld de,xE3A4 ;начало буфера + ld b,#08 +x28CE ld c,#02 +x28D0 bit 0,(iy+9) + jr z,x28DA + ld a,(hl) + ld (de),a + jr x28DC +x28DA ld a,(de) + ld (hl),a +x28DC inc l + inc de + dec c + jr nz,x28D0 + dec l + dec l + inc h + djnz x28CE + pop af + ret + +;АДРЕС: #28E8 печать/удаление курсора в окне +; +x28E8 ld a,#01 + res 2,(iy+9) + bit 0,(iy+9) + ret nz + ld (xE3B6),a + +;АДРЕС: #28F6 мигание текстового курсора в строке ввода +; +x28F6 ld ix,(xE3B7) + bit 0,(ix+7) + ret nz ;символ курсора не выводим + ld hl,xE01D + bit 2,(hl) + res 2,(hl) + ld hl,xE3B6 + jr nz,x292C ;что-то печатается + dec (hl) + ret nz ;счетчик + ld (hl),#0C + ld hl,xE01D + bit 0,(hl) + res 0,(hl) + jr nz,x28C5 ;восстановление экрана под курсором (6 пикселей символ) +;печать курсора + set 0,(hl) + push hl + call x28C5 ;сохранение экрана под курсором (6 пикселей символ) + pop hl + ld a,(ix+#0C) ;код курсора + set 1,(hl) ;запрет изменения координат печати + push hl + call x2800 ;печать символа в окне + pop hl + res 1,(hl) + ret +x292C ld (hl),#0A + ret + +;АДРЕС: #292F Расчет экранного адреса курсора в окне для символов 6 пикселей +;вх: ix - адрес дескриптора окна +;вых: b - смещение в знакоместе +; hl - адрес на экране +; +x292F ld a,(ix+2) ;координата Y + add a,(ix+0) + ld h,a + rrca + rrca + rrca + and #E0 + ld l,a + ld c,(ix+1) ;координата X + ld a,c + add a,c + add a,c + add a,a + ld c,a ;c=X*6 + and #07 + ld b,a ;смещение в знакоместе + ld a,c + rrca + rrca + rrca + add a,(ix+3) + and #1F + or l + ld l,a + ld a,h + and #18 + or #40 + ld h,a + ret + +;АДРЕС: #2959 Расчет координат курсора на экране для символов шириной 8 пикселей +;вх: ix - адрес дескриптора окна +;вых: bc - координаты курсора +; +x2959 ld l,(ix+0) + ld h,(ix+1) + ld c,(ix+2) + ld b,(ix+3) + add hl,bc + ld c,l + ld b,h + ret + +;АДРЕС: #2969 Расчет адреса курсора в области атрибутов для символов 8 пикселей +;вх: ix - адрес дескриптора окна +;вых: hl - адрес в области атрибутов +; +x2969 call x2959 ;координаты курсора на экране + ld a,c + rrca + rrca + rrca + ld c,a + and #E0 + xor b + ld l,a + ld a,c + and #03 + xor #58 + ld h,a + ret + +;АДРЕС: #297C Расчет экранного адреса курсора в окне для символов 8 пикселей +;вх: ix - адрес дескриптора окна +;вых: bc - координаты курсора на экране +; hl - адрес на экране +; +x297C call x2959 ;координаты курсора на экране + ld a,c + rrca + rrca + rrca + and #E0 + xor b + ld l,a + ld a,c + and #18 + xor #40 + ld h,a + ret + +;АДРЕС: #298E скроллинг окна вверх +;вх: ix - адрес дескриптора окна +; +x298E ld c,(ix+0) + ld b,(ix+1) + push bc ;сохраним координаты курсора + ld (ix+0),#01 ;crdY=1 + ld (ix+1),#00 ;crdX=0 + ld b,(ix+4) ;высота окна +x29A0 dec b + jr z,x29BE +;скроллинг вверх + push bc + call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей + or a + call x29D0 ;скроллинг строки данных окна вверх + bit 1,(ix+7) + jr z,x29B8 ;атрибуты не меняются + call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + or a + call x29FB ;скроллинг строки атрибутов окна вверх +x29B8 inc (ix+0) + pop bc + jr x29A0 +;очистка нижней знакоместной строки +x29BE ld a,(ix+4) ;высота окна + dec a + ld (ix+0),a ;координата Y в самом низу + call x2A81 ;очистка знакоместной строки по координатам курсора + pop bc + ld (ix+0),c ;восстановление координат + ld (ix+1),b + ret + +;АДРЕС: #29D0 скроллинг строки данных окна +;вх: ix - адрес дескриптора окна +; hl - экранный адрес начала строки +; cy=1 скроллинг вниз +; =0 скроллинг вверх +; +x29D0 push hl + ld a,(ix+0) ;координата Y курсора + push af + jr c,x29DA + dec a + jr x29DB +x29DA inc a +x29DB ld (ix+0),a + call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей + pop af + ld (ix+0),a + ld e,l + ld d,h + pop hl + ld a,#08 ;копирование строки +x29EA ld b,#00 + ld c,(ix+5) ;ширина окна в знакоместах + push hl + push de + ldir + pop de + pop hl + inc h + inc d + dec a + jr nz,x29EA + ret + +;АДРЕС: #29FB скроллинг строки атрибутов окна +;вх: ix - адрес дескриптора окна +; hl - адрес атрибутов начала строки +; cy=1 скроллинг вниз +; =0 скроллинг вверх +; +x29FB push hl + ld a,(ix+0) + push af + jr c,x2A05 + dec a + jr x2A06 +x2A05 inc a +x2A06 ld (ix+0),a + call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + pop af + ld (ix+0),a + ld e,l ;копирование строки атрибутов + ld d,h + pop hl + ld b,#00 + ld c,(ix+5) + ldir + ret + +;АДРЕС: #2A1B обработка управляющего кода #1E (скроллинг окна ввниз) +;вх: ix - адрес дескриптора окна +; +x2A1B ld c,(ix+0) + ld b,(ix+1) + push bc ;сохраним координаты курсора + ld (ix+1),#00 ;координата X=0 + ld b,(ix+4) ;высота окна + dec b + jr z,x2A4C ;высота =1 просто очищаем строку + dec b + ld (ix+0),b + inc b +;скроллим окно вниз +x2A31 push bc + call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей + scf + call x29D0 + bit 1,(ix+7) + jr z,x2A46 ;атрибуты не скроллим + call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + scf + call x29FB ;скроллинг строки атрибутов окна +x2A46 dec (ix+0) + pop bc + djnz x2A31 +;очищаем верхнюю строку +x2A4C ld (ix+0),#00 ;crdY=0 + call x2A81 ;очистка строки по координатам курсора + pop bc ;восстановим координаты + ld (ix+0),c + ld (ix+1),b + ret + +;АДРЕС: #2A5B очистка окна пользователя (rst 8: db #83) +; +x2A5B call x300F ;читаем ix + +;АДРЕС: #2A5E обработка управляющего кода #0C (очистка текущего окна) +;вх: ix - адрес дескриптора окна +; +x2A5E xor a ;координаты курсора =0 + ld (ix+0),a + ld (ix+1),a + ld b,(ix+4) ;высота окна +x2A68 push bc ;очистка окна + call x2A85 ;очистка знакоместной строки по координатам курсора + pop bc + inc (ix+0) + djnz x2A68 + ld (ix+0),#00 ;crd X =0 + call x28E8 ;печать курсора + ret + +;очистка верхней знакоместной строки окна +x2A7A call x28B8 ;признак печати и восстановление экрана + ld (ix+1),0 ;crd Y =0 + +;очистка знакоместной строки по координатам курсора +x2A81 res 3,(iy+9) + +;АДРЕС: #2A85 очистка знакоместной строки по координатам курсора +x2A85 call x28B8 ;признак печати и восстановление экрана + call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей + ld a,(ix+5) ;ширина окна + sub (ix+1) + ld c,#08 ;очистка знакоместной строки + ld d,a ;ширина очищаемой части окна + ld e,l +x2A95 ld b,d + ld l,e +x2A97 ld (hl),#00 ;очистка пиксельной строки + inc l + djnz x2A97 + inc h + dec c + jr nz,x2A95 + push de + call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + pop bc + ld d,(ix+6) ;атрибуты +x2AA8 ld (hl),d ;очистка атрибутной строки + inc hl + djnz x2AA8 + ret + +;АДРЕС: #2AAD обработка управляющего кода #04 (вывод с выравниванием) +;вх: ix - адрес дескриптора окна +; +x2AAD ld hl,xE01D + set 6,(hl) + set 7,(hl) + ld hl,xE1A6 + ld (xE3BC),hl + ret + +;АДРЕС: #2ABB расчет для выравнивания строки +;вх: ix - адрес дескриптора окна +; +x2ABB ld de,xE1A6 ;начало буфера + ld hl,(xE3BC) ;конец буфера + or a + sbc hl,de + ld b,l ;длина строки + ld a,(ix+#0B) ;размер окна в символах + sub l + ret + +;АДРЕС: #2ACA печать строки из буфера с выравниваем по центру окна #05 +;вх: ix - адрес дескриптора окна +; +x2ACA call x2ABB + srl a ;координата X печати в окне +;печать с выравниванием +x2ACF ld (ix+1),a ;a=crdX, b=длина строки + push bc + call x28B8 ;признак печати и восстановление экрана + pop bc + ld hl,xE1A6 ;печать строки +x2ADA ld a,(hl) + push hl + push bc + call x2800 ;печать символа в окне + pop bc + pop hl + inc hl + djnz x2ADA + ld hl,xE01D ;завершение управляющего кода #05 и #04 + res 6,(hl) + res 7,(hl) + ret + +;АДРЕС: #2AED печать строки из буфера с выравниваем по правому краюу окна #06 +;вх: ix - адрес дескриптора окна +; +x2AED call x2ABB + jr x2ACF + +;АДРЕС: #2AF2 обработка байта после управляющего кода #04 +;вх: ix - адрес дескриптора окна +; +x2AF2 bit 5,(hl) + jr nz,x2B57 ;обработка значения байта управляющего кода + bit 7,(hl) + jr z,x2AFE + cp #20 ;байт после кода #04 + jr c,x2B42 ;управляющий код +x2AFE ld hl,(xE3BC) ;печатный символ в буфер + ld (hl),a + inc hl + ld (xE3BC),hl + ret + +;АДРЕС: #2B07 возврат из п/п печати символа +x2B07 pop bc + pop de + pop hl + ret + +;АДРЕС: #2B0B печать символа со сбросом 7го бита (rst #10) +;вх: ix - адрес дескриптора окна +; a - код символа/управляющий код +; +x2B0B push af + and #7F + jr x2B13 + +;АДРЕС: #2B10 печать пробела (rst #10) +;вх: ix - адрес дескриптора окна +; +x2B10 ld a,#20 + +;АДРЕС: #2B12 печать символа (rst #10) +;вх: ix - адрес дескриптора окна +; a - код символа/управляющий код +; +x2B12 push af +x2B13 call x2B18 + pop af + ret +;печать символа в окне. ix - адрес дескриптора окна, a - код символа/управляющий код +x2B18 push hl + push de + push bc + ld hl,x2B07 ;адрес возврата + push hl + ld hl,xE01D + bit 6,(hl) + jr nz,x2AF2 ;байт(ы) после управляющего кода + bit 5,(ix+7) + ret nz ;запрет вывода в окно + bit 4,(hl) + jp nz,x0950 ;вывод на принтер + cp #20 + jr c,x2B42 ;это управляющий код + call x27FD ;удаление курсора и печать символа в окне + ret nz ;следующие координаты печати не установлены + bit 4,(ix+7) + ret z + call x2B75 ;возрат каретки + jr x2B84 ;перевод строки со скроллингом вверх +;переход на п/п обработки управляющего кода +x2B42 ld hl,x27DC+#0A + ld bc,#000B + ld e,l + ld d,h + cpdr + ret nz ;код не найден + inc de + ex de,hl + sla c + add hl,bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + jp (hl) +;обработка значения байта управляющего кода +x2B57 bit 7,(hl) + jr nz,x2B5D ;если в рамках кода #04 + res 6,(hl) ;сброс признака управляющего кода +x2B5D res 5,(hl) + ld hl,(xE3B9) ;обработка значения байта управляющего кода + jp (hl) + +;АДРЕС: #2B63 установка адреса п/п обработки управляющего кода +; +x2B63 ld (xE3B9),hl + ld hl,xE01D + set 5,(hl) + set 6,(hl) + ret + +;АДРЕС: #2B6E обработка управляющего кода #0D (возврат каретки) +;вх: ix - адрес дескриптора окна +; +x2B6E bit 2,(ix+7) + call nz,x2B84 ;перевод строки со скроллингом вверх +;возрат каретки +x2B75 call x28B8 ;признак печати и восстановление экрана + xor a + ld (ix+1),a ;crdX =0 + ret + +;АДРЕС: #2B7D обработка управляющего кода #0A (перевод строки) +;вх: ix - адрес дескриптора окна +; +x2B7D bit 3,(ix+7) + call nz,x2B75 ;возрат каретки +;перевод строки со скроллингом вверх +x2B84 call x2B8E ;перевод строки + ret nz ;перевод строки выполнен + call x28B8 ;признак печати и восстановление экрана + jp x298E ;скроллинг окна вверх +;перевод строки +x2B8E ld a,(ix+4) ;высота окна + dec a + cp (ix+0) + ret z ;в последней строке нет перевода строки + call x28B8 ;признак печати и восстановление экрана + inc (ix+0) ;координата Y+1 + ret + +;АДРЕС: #2B9D установка начальных координат +;вх: ix - адрес дескриптора окна +; +x2B9D call x28B8 ;признак печати и восстановление экрана + xor a + ld (ix+1),a + ld (ix+0),a + ret + +;АДРЕС: #2BA8 короткий звуковой сигнал c установкой бордюра +; +x2BA8 push de + ld de,#7060 + push bc + push af + ld a,(xE053) + push af +x2BB2 out (#FE),a + xor #10 + push af + ld a,r + and #01 + add a,e + ld b,a + djnz $ + pop af + dec d + jr nz,x2BB2 + pop af + out (#FE),a + pop af + pop bc + pop de + ret + +;АДРЕС: #2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) +;вх: ix - адрес дескриптора окна +; +x2BCA ld hl,x2BD0 + jp x2B63 +;установка координаты Y курсора +x2BD0 ld c,(ix+0) + cp (ix+4) + jr nc,x2BD9 ;за пределами она + ld c,a +x2BD9 ld a,c + ld (xE3BB),a + ld hl,x2BE3 + jp x2B63 +;установка координаты X курсора +x2BE3 call x28B8 ;признак печати и восстановление экрана + ld c,(ix+#0B) ;ширина окна в символах + dec c + cp c + jr nc,x2BEE ;за пределами она + ld c,a +x2BEE ld (ix+1),c + ld a,(xE3BB) + ld (ix+0),a + ret + +;АДРЕС: #2BF8 обработка управляющего кода #01 (установка атрибутов) +;вх: ix - адрес дескриптора окна +; +x2BF8 ld a,(ix+6) ;сохраним текущие атрибуты + ld (xE3B4),a + ld hl,x2C04 + jp x2B63 +x2C04 or (ix+6) ;маска устанавливаемых атрибутов + ld (ix+6),a + ld hl,x2C10 + jp x2B63 +x2C10 cpl ;маска сбрасываемых атрибутов + and (ix+6) + ld (ix+6),a + ret + +;АДРЕС: #2C18 обработка управляющего кода #02 (восстановление атрибутов) +;вх: ix - адрес дескриптора окна +; +x2C18 ld a,(xE3B4) + ld (ix+6),a + ret + +;АДРЕС: #2C1F определение турбо-режима +;вых: nz - турбо включен +; z - выключен +; +x2C1F xor a + ld h,a + ld e,#0E + inc a +x2C24 or a + jr z,x2C2E + dec h + jr nz,x2C24 + dec e + jr nz,x2C24 + inc e +x2C2E di + ret + +;АДРЕС: #2C30 определение турбо-режима вкл/выкл +; +x2C30 bit 7,(iy+#19) + ret z ;турбо-режим недоступен + call x3B75 ;определение типа прерываний im 1/2 + push af + im 1 + ei + call x2C1F ;определение турбо-режима + ld hl,xE02D + res 6,(hl) + jr z,x2C48 ;турбо выключено + set 6,(hl) +x2C48 pop af + ret nz + im 2 + ret + +;АДРЕС: #2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +;вх: a - номер дисковода +; +x2C4D and #03 + ld (xFFCA),a ;номер текущего дисковода + push hl + ld l,a + rlca + rlca + ld h,a + rlca + rlca + add a,h + add a,l ;a=a*#15 + ld hl,(xE9F3) ;адрес блока описателей дисковода + add a,l + ld l,a + jr nc,x2C63 + inc h ;hl адрес блока описателя текущего дисковода +x2C63 ld a,(hl) + or a + jr z,x2C75 ;нет примонтированного образа + push de ;копируем дескриптор дисковода в рабочий буфер + ld de,xE590 + push bc + ld bc,#0015 + ldir + pop bc + pop de + pop hl + ret +x2C75 ld (xE590),a + pop hl + ret + +;АДРЕС: #2C7A чтение байта по адресу #00FB +x2C7A ld a,(x00FB) + ret + +;АДРЕС: #2C7E поиск и вызов процедуры обработки без возврата(если не найдено +; возврат) +x2C7E pop hl + jr x2C83 +x2C81 inc hl + inc hl +x2C83 ld e,(hl) + inc e + jr z,x2C90 ;конец списка. выход + cp (hl) + inc hl + jr nz,x2C81 ;не сответствует коду клавиши + ld e,(hl) + inc hl + ld d,(hl) + dec de + ex de,hl +x2C90 inc hl + jp (hl) + +;АДРЕС: #2C92 выполнение одной команды ассемблера с контролем ловушек +x2C92 call x17F0 ;выполнение одной команды по адресу в PC + call x328B ;проверка срабатывания ловушки + ld e,#FF + jp nc,x019D ;ловушка сработала +x2C9D ld a,(xE02A) + and #7F + bit 2,a + ret nz ;не обновлять экран монитора + ld (xE01E),a + +;АДРЕС: #2CA8 печать/обновление монитора-отладчика +x2CA8 call x0550 ;сохранение экрана из страницы 5 + +;обновление окна регистров + call x3000 + bit 0,(iy+#0A) + jr nz,x2CE9 ;ОШИБКА!!! должно быть x2CEC + call x2A5E ;очистка текущего окна + rst #20 + db "IR" + db #1B,#08,#0A ;crd Y,X + db "SZ-H-PNC" + db #0D,#0D + db "INT RAM ROM SCR" + db #1B,#00,#0B ;crd Y,X + dc "ZX " + bit 5,(iy-#02) + jr z,x2CE6 ;128K + rst #20 ;only 48k + dc "4" + jr x2CE9 +x2CE6 rst #20 + dc "12" +x2CE9 rst #20 + dc "8k" +x2CEC ld (ix+0),#00 ;crd Y =0 + ld (ix+1),#04 ;crd X =4 + ld hl,(xDD83+#01) ;регистры i,r пользователя + call x16DE ;печать числа + inc (ix+0) ;crd Y +1 + ld (ix+1),#00 ;crd X =0 + call x2D70 ;печать названия регистра, его значения и области памяти адресуемой этим регистром + ld (ix+0),#09 ;crd Y =9 + call x2DF6 ;;печать названия регистра af, его значения флагов в двоичном виде + + ld hl,xE01E ;iy+#0A + set 1,(hl) ;не обновлять содержимое регистров + set 2,(hl) ;не обновлять экран монитора + + ld (ix+0),#0B ;печать режима прерываний разрешены/запрещены + ld hl,x0FA0 ;on + ld a,(xDD83) + and #04 + jr nz,x2D23 +x2D20 ld hl,x0FA2 ;off +x2D23 call x15C7 ;печать сообщения из hl +x2D26 call x2B10 ;печать пробела + ld (ix+1),#05 ;печать номера страницы ОЗУ + ld a,(xE012) + and #07 + ld c,a + ld a,(xE012+1) + rrca + and #08 + or c + call x16EC ;печать числа a=[#0..#F] + ld (ix+1),#09 ;печать номера страницы ПЗУ + ld a,(xE012) + rrca + rrca + rrca + rrca + and #01 + call x16EC ;печать числа a=[#0..#F] + ld (ix+1),#0D ;печать номера экрана + ld c,#35 + ld a,(xE012) + and #08 + jr z,x2D5C + ld c,#37 +x2D5C ld a,c + rst #10 + + ld (iy+6),4 + call x2E38 ;обновление окна дампа памяти + call x2F30 ;обновление окна дизассемблера + + ld hl,xE01E ;iy+#0A + ld a,(hl) ;установка флагов + or %01010001 + ld (hl),a + ret + +;печать названия регистра, его значения и области памяти адресуемой этим регистром +x2D70 bit 1,(iy+#0A) + ret nz + ld hl,x0F91 + ld c,(iy+#0C) + ld b,#07 + ld de,xDD6B + jr x2D85 +x2D82 inc (ix+0) +x2D85 ld a,#03 + cp b + jr nz,x2D93 + bit 0,(iy+#0B) + jr z,x2D93 + ld de,xDD79 ;отображаются регистры альтернативного набора +x2D93 sla c + jr nc,x2D9B + inc hl ;этот регистр не выводим + inc hl + jr x2DDF +x2D9B bit 2,(iy+#0A) + jr nz,x2DAE ;название регистра не печатать + call x15C7 ;печать названия регистра + ld a,#03 + cp b + jr c,x2DB0 + call x2DE8 ;печать признака альтернативного набора регистров + jr x2DB0 +x2DAE inc hl + inc hl +x2DB0 ld (ix+1),4 ;crd X =4 + push hl + push de +;печать значения регистра + ex de,hl + ld a,(hl) + inc hl + ld h,(hl) + ld l,a ;hl-значение регистра + call x16DE ;печать числа +;печать содержимого памяти адресуемой текущим регистром + bit 3,(iy+#0A) + jr nz,x2DDD ;содержимое памяти адресуемой текущим регистром не печатать + push bc + ld bc,#0004 + ld de,xDDAC + push de + call x0753 ;сохранение области памяти в ram 8 + pop hl + ld b,#04 +x2DD2 inc (ix+1) + ld a,(hl) + call x16E3 ;печать числа a=[#00..#FF] + inc hl + djnz x2DD2 + pop bc +x2DDD pop de + pop hl +;следующий регистр +x2DDF inc de + inc de + ld (ix+1),#00 + djnz x2D82 + ret +;печать признака альтернативного набора регистров +x2DE8 bit 0,(iy+#0B) +x2DEC ld a," " + jp z,x2B12 ;печать символа + ld a,#27 ;' + jp x2B12 ;печать символа + +;печать названия регистра af, его значения флагов в двоичном виде +x2DF6 ld b,(iy+#0A) + bit 1,b + ret nz ;все регистры в мониторе не выводятся + bit 0,(iy+#0C) + ret nz ;регистр af не выводится + bit 2,b + ld b,(iy+#0B) + jr nz,x2E10 ;название регистра не печатать + rst #20 ;печать названия регистра + dc "AF" + bit 1,b + call x2DEC +x2E10 ld (ix+1),#04 ;crd X =4 + bit 1,b ;;печать значения af/af' + ld hl,(xDD7F) + jr z,x2E1E + ld hl,(xDD81) +x2E1E call x16DE ;печать числа hl=[#0000..#FFFF] + ld (ix+1),#0A ;crd X =10 + +;АДРЕС: #2E25 печать байта в двоичном виде +;вх: l - байт +; +x2E25 ld b,#08 ;печать значения f/f' в двоичном виде +x2E27 ld a,#30 + sla l + jr nc,x2E2E + inc a +x2E2E call x2B12 ;печать символа + djnz x2E27 + ld (ix+1),#00 ;crd X =0 + ret + +;АДРЕС: #2E38 печать дампа памяти в окне +; +x2E38 bit 4,(iy+#0A) + ret nz + +;АДРЕС: #2E3D печать дампа памяти в окне +; +x2E3D call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти + call x2E9D ;;определение нового адреса начала дампа от смещения курсора + bit 5,(iy+#0A) + call z,x2F74 ;обновим дизасм под курсором в дампе + call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти + call x2B9D ;установка начальных координат Y=0,X=0 +;печать дампа памяти + ld hl,(xDD87) + ld b,#08 +x2E55 push bc + call x2EBA ;печать одной строки дампа памяти в окне + inc (ix+0) + pop bc + djnz x2E55 +;печать курсора на текущей ячейке дампа + ld bc,#3E3C ;>< (коды двух символов курсора) + ld hl,(xDD69) +x2E65 call x2E7E ;расчет координат печати курсора в окне дампа памяти + ld a,b ;печать курсора + call x2B12 ;печать символа + inc (ix+1) + inc (ix+1) + ld a,c + jp x2B12 ;печать символа + +;АДРЕС: #2E76 удаление курсора на предыдущей ячейке дампа +x2E76 ld bc,#2020 + ld hl,(xDD89) + jr x2E65 + +;расчет координат печати курсора в окне дампа памяти +;вх: hl адрес текущей ячейки в дампе памяти +x2E7E ld (xDD89),hl + ld de,(xDD87) + or a + sbc hl,de ;смещение в дампе от начала отображения + ld a,l + and #07 + ld h,a + add a,a + add a,h + add a,#07 + ld (ix+1),a ;crd X + ld a,l + and #38 + rra + rra + rra + ld (ix+0),a ;crd Y + ret + +;определение нового адреса начала дампа от смещения курсора +x2E9D call x2E76 ;удаление курсора на предыдущей ячейке дампа + ld hl,(xDD87) ;адрес начала дампа памяти + ld de,(xDD69) ;адрес текущей ячейки в дампе памяти + ld bc,#003F + or a + sbc hl,de + ret z ;позиция курсора в дампе не изменилась + jr nc,x2EB2 ;нужен скроллинг + add hl,bc + ret c ;скроллинг не нужен +x2EB2 ld hl,#FFE8 + add hl,de + ld (xDD87),hl ;новый адрес начала дампа + ret + +;АДРЕС: #2EBA печать одной строки дампа памяти (8 байт) +;вх: hl - адрес памяти (начала дампа) +;вых: hl - следующий адрес памяти (начала дампа) +; +x2EBA ld (ix+1),#02 ;crd X =2 + +;АДРЕС: #2EBE печать одной строки дампа памяти (8 байт) +;вх: hl - адрес памяти (начала дампа) +;вых: hl - следующий адрес памяти (начала дампа) +; +x2EBE call x16DE ;печать адреса начала дампа памяти hl=[#0000..#FFFF] + call x2F22 ;если вывод на принтер, печатаем пробел + call x2F22 ;если вывод на принтер, печатаем пробел + ld de,xDDAC + ld bc,#0008 + push de + call x0753 ;сохранение области памяти в ram 8 + pop de + push de ;печать строки дампа + ld b,#08 + call x2EE6 + pop de + call x2F22 ;если вывод на принтер, печатаем пробел + ld b,#08 + call x2EF1 ;печать строки символов дампа памяти + ld (ix+1),#00 + ret +;печать строки дампа +x2EE6 ld a,(de) + inc de + call x16E3 ;печать числа a=[#00..#FF] + call x2F22 ;если вывод на принтер, печатаем пробел + djnz x2EE6 + ret +;печать строки символов дампа памяти +x2EF1 ld c,(iy+#05) +x2EF4 ld a,(de) + inc de + bit 7,c + jr nz,x2F02 + and #7F + cp #20 + jr nc,x2F02 + ld a,#2E ;. +x2F02 bit 4,(iy+#09) + jr nz,x2F14 ;вывод на принтер + push bc + push de + push hl + call x27FD ;удаление курсора и печать символа в окне + pop hl + pop de + pop bc + djnz x2EF4 + ret +x2F14 and #7F ;вывод на принтер + cp #20 + jr nc,x2F1C + ld a,#2E ;. +x2F1C call x2B12 ;печать символа + djnz x2EF4 + ret +;если вывод на принтер, печатаем пробел +x2F22 inc (ix+1) + bit 4,(iy+#09) + ret z + dec (ix+1) + jp x2B10 ;печать пробела + +;обновление окна дизассемблера +x2F30 ld b,(iy+#0A) + bit 6,b + ret nz ;не надо обновлять + bit 0,b + jr nz,x2F47 + ld hl,#5830 ;подсветка текущей строки дизассемблера + ld (hl),%00110000 + ld bc,#000F + ld de,#5831 + ldir +x2F47 ld hl,xE091 + call x301C ;ix = дескриптор окна монитора: дизассембер + bit 0,(iy+#0A) + call nz,x298E ;скроллинг окна вверх + ld (ix+0),#01 ;crd Y =1 + ld (ix+1),#00 ;crd X =0 +; печать дизассемблированных команд + ld hl,(xDD6B) ;значение pc программы пользователя + ld b,#05 + bit 2,(iy+#05) + jr z,x2F69 + ld b,#01 +x2F69 push bc + call x2F80 ;печать одной строки дизасма + inc (ix+0) + pop bc + djnz x2F69 + ret + +;АДРЕС: #2F74 вывод дисасма памяти по адресу в de +;вх: de - адрес памяти +x2F74 call x3000 ;ix = адрес дескриптора окна монитора: регистры + ld (ix+0),#0B + ld (ix+1),#15 + ex de,hl + +;печать одной строки дизасма +;вх: hl - адрес памяти +x2F80 call x16DE ;печать адреса памяти hl=[#0000..#FFFF] + call x2F96 ;анализ команды ассемблера по адресу в hl + push hl + ld hl,xDDB7 ;текстовая строка с командой дизасма + call x1512 ;печать команды ассемблера + call x2FED ;печать пробелов до правого края окна + pop hl + ld (ix+1),#00 + ret + +;АДРЕС: #2F96 анализ команды ассемблера +;вх: hl - адрес команды ассемблера для дизасма +x2F96 ld (xDDAA),hl + push hl + ld de,xDDAC + ld bc,#0004 + call x0753 ;сохранение области памяти в ram 8 + call x197F ;анализ команды ассемблера + pop hl + add hl,bc + ld (xDDAA),hl ;адрес следующей команды + ret + +;АДРЕС: #2FAC печать строки дизасма +;вх: a - +x2FAC bit 0,(iy+#05) +;печать адреса команды + push af + call z,x16DE ;печать числа hl=[#0000..#FFFF] + pop af + ld c,l + ld b,h + ld (iy+#08),#20 + call nz,x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами +;печать команды ассемблера + call x2F96 ;анализ команды и преобразование в строку для печати + push hl + push bc + ld hl,xDDB7 + call x1512 ;печать команды ассемблера + pop bc +;вывод дополнительной информации + bit 1,(iy+#05) + jr z,x2FEB + ld a,#17 + call x2FF1 ;печать пробелов до заданной координаты X + ld a,";" + rst #10 + ld b,c + push bc + ld de,xDDAC + push de + call x2EE6 ;печать строки дампа + ld a,#25 + call x2FF1 ;печать пробелов до заданной координаты X + pop de + pop bc + call x2EF1 ;печать пробелов до заданной координаты X +x2FEB pop hl + ret + +;АДРЕС: #2FED печать пробелов до правого края окна +;вх: a - crd X +x2FED ld a,(ix+#0B) + dec a + +;АДРЕС: #2FF1 печать пробелов до заданной координаты X +;вх: a - crd X +x2FF1 ld b,(ix+1) ;crd X + sub b + ret z + ret c + ld b,a + jp x15F3 ;печать нескольких провелов (в B) + +;АДРЕС: #2FFB ix = адрес дескриптора окна монитора: дескриптор окна: ввод числа +x2FFB ld hl,xE0E5 + jr x301C + +;АДРЕС: #3000 ix = адрес дескриптора окна монитора: регистры +x3000 ld hl,xE075 + jr x301C + +;АДРЕС: #3005 установка текущим окна: main menu +x3005 ld hl,xE0C9 + jr x301C + +;АДРЕС: #300A ix = адрес дескриптора окна монитора: вывод на принтер +x300A ld hl,xE067 + jr x301C + +;АДРЕС: #300F чтение содержимого регистра ix основной программы +x300F ld hl,(xDD6F) + jr x301C + +;АДРЕС: #3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана +x3014 ld hl,xE083 + jr x301C + +;АДРЕС: #3019 ix = адрес дескриптора окна монитора: дамп памяти +x3019 ld hl,xE09F + +;АДРЕС: #301C ix = адрес дескриптора окна монитора из hl +x301C ld (xE3B7),hl + push hl + pop ix + ret + +;АДРЕС: #3023 ожидание действий пользователя (опрос управления, вывод часов) +x3023 push hl + push de + push bc + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + pop bc + pop de + pop hl + ret + +;АДРЕС: #302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне +x302E ld e,(ix+7) + set 0,(ix+7) ;не выводить символ курсора + call x3023 + ld (ix+7),e + ret + +;АДРЕС: #303C выполнение команды, на которую указывает PC (cs+3) +x303C xor a + jr x3041 + +;АДРЕС: #303F выполнение команды, на которую указывает PC с быстрым выполнением +; подпрограмм (cs+4) +x303F ld a,#80 +x3041 bit 1,(iy+#12) + jr z,x3049 ;экран не сохранен в ram 8 + or #01 +x3049 ld (xE02A),a + call x2C92 ;выполнение одной команды ассемблера с контролем ловушек + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #3052 заглушка входа в монитор при несовпадении контрольной суммы +x3052 di + call x305B + ld hl,x0040 + push hl + ret + +;АДРЕС: #305B блокировка работы при ошибке контрольной суммы +x305B ld hl,x3052 + ld (xC064),hl ;блокируем вызов NMI + pop de ;адрес откуда пришли + ld sp,hl ;стэк в ПЗУ ???? + ex de,hl + jp (hl) ;вернемся + +;АДРЕС: #3065 установка регистров для загрузки/сохранения +;вх: hl - адрес строки +;вых: de - буфер для дисковых операций +; ix - буфер fcb +x3065 call x0EE6 ;поиск в строке первого печатного символа + ld (iy+#0A),#00 ;обновить на экране весь отладчик + ld de,xE8A9 ;буфер для дисковых операций +x306F ld ix,xE7A9 ;буфер fcb + ret + +;АДРЕС: #3074 Команда: ERAse filespec +; удаление заданного файла с диска +x3074 call x3065 ;установка регистров для работы с диском + rst #30 + dw rom7_x14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl + db #07 +x307B jp nc,x0AFB ;ошибок нет. обновление отладчика +x307E rst #30 + dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа + db #06 +x3082 jp x0B06 ;обновление отладчика + +;АДРЕС: #3085 Команда: SAVE filespec start,length +; запись на диск заданной последовательности байт +x3085 ld b,#02 + call x309F ;определение адреса загрузки/сохранения и размера данных + call x3107 ;запись области памяти в файл +x308D jr c,x307E ;ошибка диска. выход + rst #30 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + db #07 + jr x307B ;выход в отладчик + +;АДРЕС: #3095 Команда: LOAD filespec [start[,length]] +; загрузка с диска заданной последовательности байт +x3095 ld b,#01 + call x309F ;определение адреса загрузки/сохранения и размера данных + call x30D8 ;чтение файла в память + jr x308D ;выход в отладчик + +;определение адреса загрузки/сохранения и размера данных +;вх: b - способ открытия файла +;вых: hl - адрес загрузки +; bc - размер загружаемого файла +x309F call x3065 ;установка регистров для работы с диском + rst #30 + dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + db #07 + jr c,x307E ;ошибка диска + call x0EBA ;выделение из строки числовых операндов (не более 6) + cp #02 + jr z,x30BB ;два параметра + jr nc,x30D4 ;слиишком много параметров. выход + bit 0,(ix+#17) + jr nz,x30BB ;файл для чтения + ld a,#0A ;сообщение: too few operands + jr x3082 ;выход. мало параметров для записи +x30BB push hl + push de + push af + rst #30 + dw rom7_x11DF ;открыть файл для последующих операций с ним + db #07 + jr c,x307E ;ошибка диска + ld e,c + ld d,b ;длина файла в байтах + pop af + pop hl + pop bc + cp #01 + jr z,x30D1 ;только один параметр: адрес загрузки + ret nc ;два параметра. запись файла + ld hl,(xE7A9+#09) ;адрес загрузки из заголовка файла +x30D1 ld b,d + ld c,e ;длина файла в байтах + ret +x30D4 ld a,#0B ;сообщение: too many operands + jr x3082 + +;АДРЕС: #30D8 чтение файла в память +;вх: ix - адрес буфера fcb +; hl - адрес загрузки +; bc - размер загружаемого файла +;вых: cy=1 ошибки записи +; a - код ошибки +x30D8 ld a,b + or a + jr z,x30F4 ;менее сектора +;чтение целых секторов +x30DC push bc + push hl + rst #30 + dw rom7_x1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла + db #07 + pop hl + pop bc + ret c ;ошибка диска + push bc + ld de,xE8A9 ;буфер для загрузки + ex de,hl + ld bc,#0100 + call x0749 ;копирование сектора в память пользователя + ex de,hl + pop bc + djnz x30DC + +x30F4 ld a,c + or a + ret z ;закончилась загрузка +;чтение неполного сектора +x30F7 push hl + push bc + rst #30 + dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". + db #07 + pop bc + pop hl + ret c ;ошибка диска + rst #00 ;запись байта в память пользователя + inc hl + dec c + jr nz,x30F7 + or a + ret + +;АДРЕС: #3107 запись области памяти в файл +;вх: ix - адрес буфера fcb +; hl - адрес начала области памяти +; bc - длина области памяти +;вых: cy=1 ошибки записи +; a - код ошибки +x3107 ld (xE7B2),hl ;стартовый адрес + ld a,b + or a + jr z,x3122 ;1 сектор +; запись целых секторов области памяти +x310E push bc + ld de,xE8A9 ;буфер для сохранения + ld bc,#0100 + call x0753 ;сохранение области памяти в ram 8 + push hl + rst #30 + dw rom7_x1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти + db #07 + pop hl + pop bc + ret c ;ошибка записи + djnz x310E +x3122 ld a,c + or a + ret z ;область памяти кратна размеру сектора +x3125 push hl + push bc + rst #28 ;чтение байта из памяти пользователя + rst #30 + dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" + db #07 + pop bc + pop hl + ret c ;ошибка записи + inc hl + dec c + jr nz,x3125 + or a + ret + +;АДРЕС: #3135 подсчет контрольной суммы страницы +;вых: hl=#00F6 +x3135 xor a + ld l,a + ld h,a ;hl=#0000 + ld bc,#00F6 + push bc + call x315A + inc hl ;hl=#00F7, a=#6D + ld bc,#000D + call x315A ;hl=#0104, a=#A5 + ld de,#000C + add hl,de ;hl=#0110 + ld bc,#3EF0 + call x315A ;a=#80 + pop hl ;hl=#00F6 + cp (hl) + jp z,x04D9 ;контрольная сумма совпала.выключим турбои возврат + call x305B ;блокировка работы при ошибке контрольной суммы + jr x3135 ;вечный цикл +x315A add a,(hl) + cpi + jp pe,x315A ;пока bc<>0 + ret + +;АДРЕС: #3161 список команд отладчика +x3161 dc "Help" + dc "?" + dc "III" + dc "OOO" + dc "CMOS" + dc "RESNVRAM" + db #00 +x3179 dw x3AD0: db %00000000 ;Help + dw x3389: db %00000001 ;? + dw x318C: db %00000000 ;III + dw x3194: db %00000000 ;OOO + dw x319C: db %00000000 ;CMOS + dw x31A4: db %00000000 ;RESNVRAM + db #00 + +;АДРЕС: #318C Команда III (работа с контроллером прерываний) +x318C rst #30 + dw rom7_x16B9 ;работа с контроллером прерываний + db #07 + ret c ;ошибка + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #3194 Команда OOO (работа с контроллером прерываний) +x3194 rst #30 + dw rom7_x0DC7 ;запись всей памяти NVRAM из памяти #7530 + db #07 + ret c ;ошибка + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #319C Команда CMOS (работа с контроллером прерываний) +x319C rst #30 + dw rom7_x0DAD ;чтение всей памяти NVRAM в память #7530 + db #07 + ret c ;ошибка + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #31A4 Команда RESNVRAM (что-то пишет в NVRAM) +x31A4 rst #30 + dw rom7_x0E72 ;что-то пишет в NVRAM + db #07 + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #31AB Команда: SLOW type автоматическая трассировка +;вх: de - параметры команды +x31AB ld a,d + or a + ld a,#2C ;сообщение: bad operand + ret nz + ld (iy+#16),e + ld hl,(xDD6B) ;pc программы пользователя + call x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 +x31B9 call x2C92 ;выполнение одной команды ассемблера с контролем ловушек + call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) + jr x31B9 + +;АДРЕС: #31C1 Команда: LISTBreak/LBreak +; вывод на экран информации о ловушках +x31C1 ld hl,xE52D + ld de,#2827 + ld bc,x31FC + ld a,#09 + push bc + push af + push hl + push de + call x3A95 ;подготовка переменных к выводу на экран/принтер + ld b,e + ld c,#00 ;сообщение: curent breackpoint selections: + rst #08 + rst #20 + db #0D,#8D + pop bc + ld c,#00 ;сообщение: no address bank type state init count word + rst #08 + rst #20 + db #0D,#8D + pop hl + pop de + ld e,#01 + pop bc +;hl - адрес ловушки +;d - количество ловушек+1 +;e =#01 номер текщей ловушки +;bc адрес п/п +x31E6 push de + push bc + call x3A93 ;вызов п/п по адресу в bc - call (bc) + jr c,x31F9 ;закончена печать + call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) + rst #20 + db #8D + pop bc + pop de + inc e + ld a,d + cp e + jr nz,x31E6 +x31F9 ld a,#81 ;сообщение: enter command + ret +;печать информации об одной ловушке +x31FC rst #30 + dw rom6_x0156 ;печать информации о ловушке + db #06 + ret + +;АДРЕС #3201 печать ON/OFF от флага nz-ON/z-OFF +x3201 push hl + jr nz,x320A + rst #20 + dc "OFF" + pop hl + ret +x320A rst #20 + dc "ON " + pop hl + ret + +;АДРЕС: #3210 определение адреса ловушки +;вх: a - номер ловушки +;вых: de - адрес ловушки +; hl - адрес ячейки с адресом ловушки +; z - нет ловушки +x3210 ld de,xE9BD + ld l,a + ld h,#00 + add hl,hl ;a*2 + add hl,de ;hl=xE9BD + a*2 + ld e,(hl) + push hl + inc hl + ld d,(hl) + ld l,a + ld a,d + or e + ld a,l + pop hl + ret + +;АДРЕС: #3222 восстановление памяти пользователя под всеми ловушками +x3222 res 7,(iy+#0B) + jr x322C + +;АДРЕС: #3228 сохранение памяти пользователя под всеми ловушками и установка ловушек +x3228 set 7,(iy+#0B) +x322C call x3281 ;установка начала списка breackpoint`ов +x322F call x326C ;проверка наличия текущей ловушки + jr nc,x3267 ;нет ловушки с этим номером + call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + exx + ld a,h + exx + and #C0 + jr z,x3250 ;адрес ловушки [#0000..#3FFF] + bit 5,(iy-#02) + jr z,x324B ;zx128k + call x3707 ;zx48k сравнение страницы пользователя с заданной + exx + jr nz,x3264 + exx +x324B push bc + call x3732 ;установка страницы пользователя равной номеру страницы в L + pop bc +x3250 exx + bit 7,(iy+#0B) + jr z,x3260 + rst #28 ;чтение байта из памяти пользователя + ld (ix+4),a ;сохраним байт в описании ловушки + ld a,#CF ;rst 8 + rst #00 ;запись байта в память пользователя + jr x3264 ;установка байта ловушки +x3260 ld a,(ix+4) ;восстановление памяти пользователя под ловушкой + rst #00 ;запись байта в память пользователя +x3264 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +x3267 add ix,de ;следующая ловушка + djnz x322F + ret + +;проверка наличия текущей ловушки +;вых: cy=0 нет ловушки +; =1 есть ловушка +; hl' - адрес ловушки +; l - логический номер страницы с ловушкой +; +x326C ld a,(ix+0) + rlca + ret nc + ccf + bit 1,a + ret nz + ld l,(ix+2) + ld h,(ix+3) + exx + ld l,(ix+1) + ccf + ret + +;АДРЕС: #3281 установка начала списка ловушек +x3281 ld ix,xE52D + ld b,#08 ;количество блоков + ld de,#000B ;длина одного блока + ret + +;АДРЕС: #328B проверка срабатывания ловушки +;вх: hl - адрес PC пользователя +;вых: cy=1 нет сработавших ловушек +; =0 ловушка сработала -> ix адрес ловушки +; de=#000B +; b - обратный номер ловушки +x328B call x3281 ;установка начала списка ловушек +x328E ld a,(ix+#00) + rlca + jr nc,x32A9 ;ловушки нет + exx + ld l,(ix+#01) + call x3707 ;сравнение страницы пользователя с заданной в l + exx + jr nz,x32A9 ;не та страница + ld a,(ix+#02) + cp l + jr nz,x32A9 ;не тот адрес + ld a,(ix+#03) + cp h + ret z ;ловушка сработала +x32A9 add ix,de + djnz x328E + scf + ret + +;АДРЕС: #32AF Команда: DELBreak number +; удаление информации о ловушке с номером number +x32AF call x32C2 ;проверка номера и определение адреса описания ловушки + ld (ix+#00),#00 + ld a,(xDD99) ;номер ловушки + call x3210 + xor a + ld (hl),a + inc hl + ld (hl),a + jr x32FB ;возврат в отладчик + +;проверка номера и определение адреса описания ловушки +;вх: de - номер ловушки [1..8] +;вых: ix - адрес ловушки +; z - ловушка не задана +x32C2 push af + dec e + ld a,e + and #F8 + or d + ld a,#22 ;сообщение: invalid number breackpoint + jr nz,x3300 ;выход в отладчик + push hl + ld l,e + ld h,d + add hl,hl + add hl,hl + add hl,de + add hl,hl + add hl,de ;hl=hl*11 + ld de,xE52D + add hl,de ;адрес ловушки + push hl + pop ix + pop hl + pop af + bit 6,(ix+#00) + ret + +;АДРЕС: #32E2 Команда: BRK number, [on|off] +; включение (on)/выключение (off) ловушки +x32E2 call x32C2 ;проверка номера и определение адреса описания ловушки + ld a,#26 ;сообщение: breackpoint undefined + jr z,x3300 ;ловушка не определена. выход в отладчик + ld a,l + and #FE + or h + ld a,#23 ;сообщение: invalid state breackpoint + jr nz,x3300 ;неверный параметр. выход в отладчик +x32F1 sla (ix+#00) + srl l + rr (ix+#00) +x32FB ld a,#81 ;сообщение: enter command + ret + +;ошибка мало параметров. выход в отладчик +x32FE ld a,#0A ;сообщение: too few operands +x3300 jp x0B06 ;обновление отладчика + +;АДРЕС: #3303 Команда: BREak number, type, addr, int_count[,bank] +; установка ловушки на адрес addr +;вх: de - первый операнд +; hl - второй операнд +; bc - третий операнд +; a - количество операндов [0..5] +x3303 call x32C2 ;проверка номера и определение адреса описания ловушки + rst #30 + dw rom6_x01E4 ;установка новой ловушки в отладчике + db #06 + ret + +;АДРЕС: #330B установка ловушки #8, по текущему адресу листинга дизасма +x330B ld de,#0008 ;номер ловушки + ld bc,(xDD8B) ;адрес памяти + ld a,b + and #C0 + ld hl,#0001 ;тип ловушки + ld (xDD99+#06),hl ;4й параметр, счетчик + jr z,x331E ;адрес в ПЗУ + dec hl +x331E ld a,#04 ;кол-во параметров + call x3303 ;Команда: BREak number, type, addr, int_count[,bank] +x3323 jp x3960 + +;АДРЕС: #3326 удаление ловушки #8 +x3326 ld de,#0008 + call x32C2 ;проверка номера и определение адреса описания ловушки + ld l,#00 + call x32F1 ;удаление ловушки + jr x3323 + +;АДРЕС: #3333 Команда: OPTion bit on|off +; задание некоторых режимов монитора (переменная xE019) +x3333 ld a,e + and #F8 + or d + ld a,#0D ;сообщение: known number + ret nz ;неверный номер бита. выход в отладчик + ld a,l + and #FE + or h + ld a,#17 ;сообщение: illegal value operand + ret nz ;неверное значение бита. выход в отладчик +;определение маски по номеру бита + inc h + ld a,e +x3343 or a + jr z,x334B + dec a + sla h + jr x3343 +;установка/сброс бита +x334B ld a,h + bit 0,l + jr nz,x335B + xor #FF + and (iy+#05) +x3355 ld (iy+#05),a + ld a,#81 ;сообщение: enter command + ret +x335B or (iy+#05) + jr x3355 + +;АДРЕС: #3360 Команда: OUT addr, data +; запись байта данных data в порт ввода/вывода +x3360 ld a,h + or a + ld a,#11 ;сообщение: number too big + ret nz ;в порт можно вывести только байт + ld c,e + ld b,d + out (c),l +x3369 ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #336C Команда: OUTD addr, data +; запись байта данных data в порт ввода/вывода в адресном пространстве trdos +x336C ld a,h + or a + ld a,#11 ;сообщение: number too big + ret nz ;в порт можно вывести только байт + ld c,e + ld b,d + ld a,l + rst #30 + dw rom3_x3FF0 ;вывод в порт + db #03 + jr x3369 + +;АДРЕС: #337A Команда: IND addr +; чтение байта из порта ввода/вывода в адресном пространстве trdos +x337A ld c,e + ld b,d + rst #30 + dw rom3_x3FF3 ;чтение порта + db #03 + ld e,a + jr x3387 + +;АДРЕС: #3383 Команда: IN addr +; чтение байта из порта ввода/вывода +x3383 ld c,e + ld b,d + in e,(c) +x3387 ld d,#00 + +;АДРЕС: #3389 Команда: ?data +; вывод параметра data в различных системах счисления +;вх: de - параметр data +x3389 call x33BB ;установка и очистка информационного окна отладчика + ld c,e + ld b,d +;вывод печатного символа заданного значения, если возможно + ld a,b + or a + jr nz,x33A3 ;16 бит + ld a,c + rlca + jr c,x33A3 + rrca + cp #20 + jr c,x33A3 + push af + rst #20 + db #0D + db #80+'"' + pop af + rst #10 + rst #20 + db #80+'"' +;вывод значения в разных системах счисления +x33A3 ld hl,x33B6 +x33A6 ld a,(hl) + cp #81 + ret z ;выход + push bc + push af + rst #20 + db #8D + pop af + call x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом + pop bc + inc hl + jr x33A6 +x33B6 db #00,#02,#04,#06,#81 + +;АДРЕС: #33BB установка и очистка информационного окна отладчика +x33BB push de + push bc + push hl + ld hl,xE0AD + call x301C ;ix = дескриптор окна + call x2A5E ;очистка окна + rst #20 + db #8D ;перевод строки в окне + pop hl + pop bc + pop de + ret + +;АДРЕС: #33CD печать информационного окна отладчика +x33CD bit 5,(iy+5) + ret nz ;запрет автоматического выполнения команды SHOW + +;АДРЕС: #33D2 Команда: SHow +; вывод информации о состоянии монитора +x33D2 call x33BB ;установка и очистка окна + rst #20 ;печать сообщения + dc "Analyser " + bit 4,(iy+#14) + call x3201 ;печать ON/OFF от флага nz-ON/z-OFF +;печать текущей системы счисления + rst #20 + db #0D + dc "base " + ld de,#000A + ld c,(iy+#17) + ld b,d + call x1677 ;печать десятичного числа bc + rst #20 + db #8D ;перевод строки +;печать workspace nnnnn + ld bc,#3C00 ;сообщение: workspace + rst #08 ;печать сообщения по номеру в BC + ld bc,(xE11A) + call x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом +;печать состояния настроек отладчика + rst #20 + db #0D + dc "option " + ld l,(iy+5) + call x2E25 ;печать байта из L в двоичном виде +;печать режима прерываний + rst #20 + db #0D + dc "Int mode " + call x3B75 ;определение типа прерываний im 1/2 + ld a,"2" + sub d + rst #10 + bit 6,(iy+#19) + jr z,x3447 ;турбо режим выключен/отсутсвует + rst #20 + dc "(t)" + jr x3447 + +;АДРЕС: #3432 Команда: BASE 0|2|8|10|16 (установка основания системы счисления) +x3432 ld a,d + or a + jr nz,x3441 ;ошибка + ld a,e + ld bc,#0005 + ld hl,x344A + cpir + jr z,x3444 ;система счисления найдена в списке +x3441 ld a,#0D ;сообщение: known number + ret +x3444 ld (iy+#17),e ;установка системы счисления +x3447 ld a,#81 ;сообщение: enter command + ret +x344A db #00,#02,#08,#0A,#10 + +;АДРЕС: #344F Команда: WORKspace addr (задание адреса начала свободного буфера +; для команд трассировки. объем буфера 8 байт) +x344F ld a,d + cp #5B + ld a,#3B ;сообщение: workspace insufficient + ret c + ld a,d + cp #C0 + ld a,#3B ;сообщение: workspace insufficient + ret nc + ld (xE11A),de ;установка адреса + jr x3447 ;выход + +;АДРЕС: #3461 Команда: SEarch addr_st, addr_end, bank, data +; поиск списка байтовых значений data в памяти +;вх: b - количество параметров в строке +x3461 ld de,#0318 + set 0,(iy+#13) + jr x3471 + +;АДРЕС: #346A Команда: FINd addr_st, addr_end, data +; поиск списка байтовых значений data в памяти +;вх: b - количество параметров в строке +x346A ld de,#0217 + res 0,(iy+#13) +x3471 ld a,b + cp d + ld a,#0A ;сообщение: too few operands + ret c ;нехватает параметров в команде + ret z ;нехватает параметров в команде + ld a,b + cp e + ld a,#1F ;сообщение: string too long + ret nc ;слишком длинная строка + ld a,b + sub d ;a - длина искомой строки + push af + xor a + ld (xDDE0),a ;начальная длина искомой строки +;проверка начального и конечного адреса поиска + call x0C98 ;чтение в de адреса начала поиска + push de + call x0C98 ;чтение в de адреса конца поиска + ex (sp),hl + ex de,hl + call x375C ;сравнение hl>=de, в противном случае отмена команды + ld (xDDDC),de ;адрес начала поиска + ld (xDDDE),hl ;адрес конца поиска + ld hl,(xE012) ;сохраним порты пользователя + ld (xDDE1),hl + ld (xE010),hl + pop hl + bit 0,(iy+#13) + jr z,x34B7 ;ищем только в текущей странице +;установка страницы для поиска + call x0C98 ;чтение номера страницы поиска + ex de,hl + call x37EB ;установка страницы для поиска + call x35EC ;установка страницы для команд поиска в отладчике + ld hl,(xE012) + ld (xDDE1),hl + ex de,hl +;чтение в буфер искомой строки +x34B7 ld bc,xDDE3 + pop af + ld (xDDE0),a ;длина искомой строки +x34BE push bc + call x0D55 ;чтение из строки команды чилового/байта строкового значения + pop bc + jr c,x34CA ;конец искомой строки + ld a,e + ld (bc),a + inc bc + jr x34BE +;сравнение строки с памятью +x34CA ld hl,(xDDDC) ;адрес в памяти +x34CD ld bc,(xDDE0-#01) ;b - длина искомой строки + push hl + ld de,xDDE3 ;адрес строки для поиска +x34D5 rst #28 ;чтение байта из памяти пользователя + ld c,a + ld a,(de) + cp c + jr nz,x3502 ;нет совпадения + inc hl + inc de + djnz x34D5 + ld (xDDDC),hl + pop hl + bit 0,(iy+#13) + jr nz,x34EC ;без установки указателя MEM + ld (xDD69),hl ;установим указатель +x34EC ld (xDDA7),hl + ld a,#84 ;сообщение: found at _число_ +; обновление экрана отладчика +x34F1 push af + call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + ld a,(iy+#0A) + and #CF + ld (iy+#0A),a ;обновить дамп и дизассемблер + call x2CA8 ;обновление монитора-отладчика + pop af + ret +; следующий адрес для поиска +x3502 pop hl + push hl + or a + ld de,(xDDDE) ;адрес последней ячейки для поиска + sbc hl,de + pop hl + inc hl + jr c,x34CD ;еще не конец области памяти + xor a + ld (xDDE0),a + ld a,#A0 ;сообщение: string not found + jr x34F1 + +;АДРЕС: #3517 продолжение поиска в отладчике (для команд FIND/SEARCH) +x3517 ld a,(xDDE0) ;длина искомой строки + or a + ld a,#A1 ;сообщение: no search string + ret z + ld a,#0C ;атрибуты + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 + call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + ld hl,(xDDE1) + ld (xE012),hl + jr x34CA + +;АДРЕС: #352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] +; копирование области памяти +;вх: de - первый операнд +; hl - второй операнд +; bc - третий операнд +; a - количество операндов [0..5] +x352F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды + inc hl + or a + sbc hl,de ;длина переносимого блока + push bc + push hl + pop bc + pop hl + ex de,hl ;de - адрес, куда копируем; hl - откуда + ld a,c + or b + ld a,#42 ;сообщение: too few blocks + ret z ;нулевая длина + push hl + sbc hl,de + pop hl + jr c,x3551 +;копирование области памяти с инкрементом +x3546 call x3563 ;копирование одного байта с переключением страницы + inc hl + inc de + ld a,c + or b + jr nz,x3546 + jr x3560 +;копирование области памяти с декрементом +x3551 dec bc + add hl,bc + ex de,hl + add hl,bc + ex de,hl + inc bc +x3557 call x3563 ;копирование одного байта с переключением страницы + dec hl + dec de + ld a,b + or c + jr nz,x3557 +x3560 jp x3679 ;восстановление страницы пользователя и обновление отладчика +;копирование одного байта с переключением страницы +x3563 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + rst #28 ;чтение байта из памяти пользователя + call x35EC ;установка страницы для команды в отладчике + ex de,hl + rst #00 ;запись байта в память пользователя + ex de,hl + dec bc + ret + +;АДРЕС: #356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] +; сравнение двух областей памяти +;вх: de - первый операнд +; hl - второй операнд +; bc - третий операнд +; a - количество операндов [0..5] +x356F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды + push bc + push hl + pop bc ;addr_fin1 + pop hl ; + ex de,hl ;de=addr_st2; hl=addr_st1 +x3577 ex de,hl + call x35EC ;установка страницы + rst #28 ;чтение байта из памяти пользователя + ex de,hl + call x3A4E ;восстановление страницы + push bc + ld c,a + rst #28 ;чтение байта из памяти пользователя + cp c + jr nz,x3598 ;не равны +;следующие адреса +x3586 pop bc + push hl + or a + sbc hl,bc + pop hl + inc de + inc hl + jr nz,x3577 +;искомая строка найдена + call x35D3 ;сравнение ix=xE075 + ld a,#82 ;сообщение: block identical + ret nz + dec a ;сообщение: enter command + ret +;вывод сообщение о несовпадении +x3598 ld b,a + push hl + push de + push bc + call x35D3 ;сравнение ix=xE075 + call nz,x3A95 ;подготовка переменных к выводу на экран/принтер + ld bc,#4100 ;сообщение: failed at _число_ + rst #08 + pop bc + pop de + pop hl + push hl + push de + push bc + call x1612 ;печать числа в hl (dec/hex) с префиксом + rst #20 + dc " #" + pop af + push af + call x16E3 ;печать числа a=[#00..#FF] + rst #20 + dc " : " + pop bc + pop hl + push hl + push bc + call x1612 ;печать числа в hl (dec/hex) с префиксом + rst #20 + dc " #" + pop hl + ld a,l + call x16E3 ;печать числа a=[#00..#FF] + rst #20 + db #8D + call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) + pop de + pop hl + jr x3586 + +;АДРЕС: #35D3 сравнение ix=xE075 +;вых: z - ix=xE075 +x35D3 push de + push ix + ex (sp),hl + ld de,xE075 + or a + sbc hl,de + pop hl + pop de + ret + +;АДРЕС: #35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя +x35E0 push hl + ld hl,(xE012) + ld (xE010),hl + ld (xE00E),hl + pop hl + ret + +;установка страницы для команд поиска в отладчике +x35EC push hl + ld hl,(xE00E) + ld (xE012),hl + pop hl + ret + +;АДРЕС: #35F5 Команда: FILl addr_st, addr_end, byte [,bank] +; заполнение области памяти +;вх: de - первый операнд +; hl - второй операнд +; bc - третий операнд +; a - количество операндов [0..5] +x35F5 call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды + ld a,b + or a + ld a,#0C ;сообщение: out of range + ret nz ;слишком большое значение для заполнения + call x35EC ;;установка страницы + ex de,hl +;заполнение области памяти +x3601 ld a,c + rst #00 ;запись байта в память пользователя + push hl + or a + sbc hl,de + pop hl + inc hl + jr nz,x3601 + jr x3679 ;восстановление страницы и обновление отладчика + +;АДРЕС: #360D Команда: DATA addr, data +; запись списка data, начиная с адреса addr +x360D call x0C98 ;чтение адреса начала области + ld c,e + ld b,d + jr x3618 + +;АДРЕС: #3614 Команда: .PC data +; запись списка data, начиная с адреса в регистре PC +x3614 ld bc,(xDD6B) ;pc программы пользователя +x3618 set 1,(iy+#13) + jr x3626 + +;АДРЕС: #361E Команда: .data +; запись списка data, начиная начиная с текущей ячейки памяти MEM +x361E ld bc,(xDD69) ;адрес текущей ячейки MEM + res 1,(iy+#13) + +;запись строки данных по заданному адресу +x3626 push bc ;адрес куда пишем + call x0D55 ;очередного байта data + pop bc + jr c,x367C ;нет больше байтов для чтения. обновление отладчика + push hl + ld l,c + ld h,b + ld a,e + rst #00 ;запись байта в память пользователя + inc bc + bit 1,(iy+#13) + jr nz,x363D + ld (xDD69),bc ;новый адрес MEM +x363D pop hl ;следующий байт + jr x3626 + +;АДРЕС: #3640 pop de со стэка пользователя +x3640 ld hl,(xDD6D) ;указатель вершины стэка программы пользователя + rst #28 ;чтение байта из памяти пользователя + ld e,a + inc hl + rst #28 ;чтение байта из памяти пользователя + ld d,a + inc hl + ld (xDD6D),hl ;новый указатель вершины стэка программы пользователя + ret + +;АДРЕС: #364D Команда: POP +; извлечение значения из стека пользователя +x364D call x3640 ;pop de со стэка пользователя + call x3389 ;вывод числа в de в различных системах счисления + jr x366E ;обновление отладчика + +;АДРЕС: #3655 переход на адрес, содержащийся в команде, расположенный в текущей +; ячейке памяти +x3655 ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти + call x3884 ;получить адрес, на который ссылается команда ассемблера + ex de,hl + +;АДРЕС: #365C Команда: MEMory addr +; установка адреса текущей ячейки памяти mem +x365C ld (xDD69),de + jr x367C ;выход и обновленеи отладчика + +;АДРЕС: #3662 Команда: EXX +; смена индикации регистров ВС, DE и HL на альтернативные +x3662 ld a,#01 + jr x3668 ;выход и обновленеи отладчика + +;АДРЕС: #3666 Команда: EX AF +; смена индикации регистров AF на альтернативные. Команды +x3666 ld a,#02 +x3668 xor (iy+#0B) + ld (iy+#0B),a +x366E ld a,(iy+#0A) +x3671 and #F1 + ld (iy+#0A),a +x3676 jp x0AFB +x3679 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +x367C ld a,(iy+#0A) + and #8F + jr x3671 + +;АДРЕС: #3683 Команда: INTerrupt on|off +; управление прерываниями +x3683 ld a,e + and #FE + or d + ld a,#17 ;сообщение: illegal value operand + ret nz ;недопустимый параметр + ld hl,xDD83 + ld a,e + or e + jr z,x3695 + set 2,(hl) ;прерывания разрешены + jr x3676 ;выход и обновление отладчика +x3695 res 2,(hl) ;прерывания запрещены + jr x3676 ;выход и обновление отладчика + +;АДРЕС: #3699 Команда: CALl [[addr],bank] +; вызов подпрограммы +x3699 call x3713 ;установка страницы, если задана в команде + set 4,(iy+#12) + push af + push de + ld de,(xDD6B) ;pc программы пользователя + inc de + call x3A14 ;запись de на стэк пользователя + ld de,#0008 ;возврат по адресу #08 + call x3A14 ;запись de на стэк пользователя + pop de + pop af + jr x36B7 + +;АДРЕС: #36B4 Команда: Jump [[addr],bank] +; передача управления программе +x36B4 call x3713 ;установка страницы, если задана в команде +x36B7 jr c,x36BD ;нет параметров, вызов по адресу PC + ld (xDD6B),de +x36BD call x382E ;ожидание отжатия всех клавиш + jp x013D ;выход из монитора + +;АДРЕС: #36C3 запись стандартного Magic-файла +x36C3 ei + halt + di + ld de,(xDD6B) ;pc программы пользователя + call x3A14 ;запись de на стэк пользователя + ld de,rom3_x0FF3 ;п/п Tr-Dos Запись памяти на диск + call x3A14 ;запись de на стэк пользователя + ld hl,rom3_x3D30 ;вызов страницы tr-dos + ld (xDD6B),hl ;новый PC + jr x36BD ;выход из монитора + +;АДРЕС: #36DB Команда: ROM bank +; изменение текущего банка ПЗУ +x36DB ld a,e + and #FE + or d + ld a,#19 ;сообщение: invalid bank ROM + ret nz ;недопустимый номер ROM + ld a,#1B ;сообщение: forbidden bank ROM + bit 5,(iy-#02) + ret nz ;only 48k + ld hl,x367C ;сюда вернемся + ex (sp),hl + res 4,(iy-#02) ;rom 0 + bit 0,e + ret z + set 4,(iy-#02) + ret + +;АДРЕС: #36F9 получение номера логической страницы пользователя a=[#0..#F] +x36F9 push hl + ld hl,(xE012) ;страница пользователя + ld a,%00000111 + and l + bit 4,h + pop hl + ret z ;включена была страница [0..7] + or %00001000 + ret + +;АДРЕС: #3707 сравнение страницы пользователя с заданной +;вых: a - логическая страница пользователя +; z страница совпадает +; nz не совпадает +; +x3707 call x36F9 ;a - логическая страница пользователя + cp l + ret + +;АДРЕС: #370C Команда: RAM +x370C ld bc,x367C ;обновление отладчика + push bc ;сюда вернемся + ex de,hl + jr x371D ;установка страницы пользователя равной номеру страницы в HL + +;АДРЕС: #3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL +;вх: a - количество параметров +x3713 cp #01 + ret c ;нет параметров + ret z ;1 параметр + cp #02 +x3719 ld a,#0B ;сообщение: too many operands + jr nz,x3763 ;слишком много параметров + +;АДРЕС: #371D установка страницы пользователя равной номеру страницы в HL +x371D ld a,l + and #F0 + or h + ld a,#18 + jr nz,x3763 ;сообщение: invalid bank RAM + ld a,l + and #07 + jr z,x3732 + ld a,#1C ;сообщение: forbidden bank RAM + bit 5,(iy-#02) + jr nz,x3763 ;only 48k + +;АДРЕС: #3732 установка страницы пользователя равной номеру страницы в L +x3732 ld bc,(xE012) + res 4,b + bit 3,l + jr z,x373E ;RAM 0-7 + set 4,b +x373E res 3,l + ld a,c + and %11111000 + or l + ld c,a + ld (xE012),bc + xor a + ret + +;проверка допустимости заданных адресов +;вх: de - адрес начала блока памяти +; hl - адрес конца блока памяти +; a - количество операндов [0..5] +x374B cp #02 + jr z,x375C ;если два параметра + jr nc,x3719 ;большк двух параметров. выход в отладчик + ld hl,#FFFF + cp #01 + jr z,x375C + ld de,(xDD69) ;указатель MEM + +;сравнение hl>=de, в противном случае отмена команды +x375C or a + sbc hl,de + add hl,de + ret nc + ld a,#1D ;сообщение: start > _число_ +x3763 jp x0B06 ;полное обновление монитора + +;установка заданной страницы и сравнение hl>=de, с отменой команды +;a - количество операндов [0..5] +x3766 call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + cp #04 + call z,x37F0 ;установка страницы по прочтенному четвертому операнду + jr z,x375C ;сравнение hl>=de, в противном случае отмена команды + cp #03 + jr z,x375C ;сравнение hl>=de, в противном случае отмена команды + ld a,#0A ;сообщение: too few operands +x3776 jr x3763 ;полное обновление монитора + +;АДРЕС: #3778 Команда: SCReen [on|off|5|7] +; установка/отображение экрана пользователя +x3778 cp #01 + jr z,x3787 ;есть параметр + jr nc,x3719 ;много параметров. выход в отладчик + call x3A21 ;копирование активного экрана пользователя в #4000 + call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне + jp x0AF2 ;возврат в монитор с обновлением экрана +x3787 ld a,e + and #FE + or d + jr nz,x379A + ld a,#81 ;сообщение: enter command + ld hl,xE026 + set 1,(hl) + bit 0,e + ret z + res 1,(hl) + ret +x379A ld a,d + or a + ld a,#17 ;сообщение: illegal value operand + ret nz ;ошибка. выход в отладчик + ld hl,xE012 + ld a,e + cp #05 + jr z,x37AE ;установка экрана из страницы 5 + cp #07 + jr z,x37B5 ;установка экрана из страницы 7 + ld a,#17 ;сообщение: illegal value operand + ret +x37AE res 3,(hl) +x37B0 ld a,#81 ;сообщение: enter command + jp x0AFB +x37B5 set 3,(hl) + jr x37B0 + +;АДРЕС: #37B9 управление выводимым листингом (опрос клавиш space, s, cs+1) +x37B9 push hl + ld hl,xE02D + bit 3,(hl) + res 3,(hl) + push af + call nz,x381C ;проверка нажатия клавиш space и s + pop af + call z,x3813 + pop hl + ld a,#FE + in a,(#FE) + rrca + ret c ;cs не нажата + ld a,#F7 + in a,(#FE) + rrca + ret c ;1 не нажата + res 3,(iy+#19) ;нажата cs+1 + call x382E ;ожидание отжатия всех клавиш +x37DD call x093C ;вывод на экран + ld a,#9A + bit 0,(iy+#12) + jr nz,x3776 ;ввод и обработка команды отладчика + jp x0AD7 ;печать меню + +;установка страницы по номеру hl +x37EB push af + push hl + push bc + jr x37F6 + +;установка страницы по прочтенному четвертому операнду +x37F0 push af + push hl + push bc + ld hl,(xDD99+#06) ;третий операнд в команде (bank) +x37F6 call x371D ;установка страницы пользователя равной номеру страницы в HL + ld hl,(xE012) + ld (xE00E),hl + call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + pop bc + pop hl + pop af + scf + ret + +;АДРЕС: #3807 пауза 40416t +x3807 ld a,#C0 +x3809 push bc + ld b,#00 + djnz $ + pop bc + dec a + jr nz,x3809 + ret + +;проверка нажатия клавиш space и s +x3813 ld a,#7F + in a,(#FE) + rrca + ret c ;Space не нажат + call x382E ;ожидание отжатия всех клавиш + +;проверка нажатия клавиш space и s +x381C call x3807 ;пауза 40416t + call x3023 ;ожидание действий пользователя (опрос управления, вывод часов) + cp #20 + jr z,x382B ;нажат пробел + and #5F + cp "S" + ret nz +x382B set 3,(hl) + ret + +;АДРЕС: #382E ожидание отжатия всех клавиш +x382E xor a + in a,(#FE) + cpl + and #1F + ret z + jr x382E + +;АДРЕС: #3837 копирование блока памяти в ram 8 с раскодированием +;вх: hl - адрес закодированной процедуры/данных +; de - адрес этой процедуры/данных для размещения в ram 8 +; db ?,?,n,? - длина +; db ?,?,?,n - адрес байта для раскодирования +x3837 ex (sp),hl + inc hl + inc hl + ld b,(hl) + inc hl + push de + ld e,(hl) + inc hl + ld d,#00 + ld a,(de) ;байт по заданному адресу + pop de + ex (sp),hl + ld c,a ;байт по заданному адресу + ld a,(x00FE) + xor c + ld c,a + ld a,(x00FD) + xor c + ld c,a + ld a,(x00FC) + xor c + ld c,a +x3854 ld a,c + xor b + xor (hl) + ld (de),a + inc hl + inc de + djnz x3854 + ret + + + + +;АДРЕС: #385D не используется +x385D scf + jr x3861 +;АДРЕС: #3860 не используется +x3860 or a +x3861 pop hl + ld e,(hl) + inc hl + ld d,(hl) + inc hl + push hl + ex de,hl + jr c,x3880 + ld a,(hl) + or a + jr nz,x3883 + ld a,#3D ;сообщение: Professional program not found + +;АДРЕС: #3870 печать сообщения и продолжение работы текущего меню монитора +;вх: a - номер сообщения из блока 0 +x3870 sla a + call x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана + scf ;cy=1 с очисткой буфера ввода + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 + call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне + jp x0129 ;печать текущего меню монитора + + +x3880 ld a,(hl) + or a + ret z +x3883 jp (hl) + + + + +;АДРЕС: #3884 получить адрес, на который ссылается команда ассемблера +;вх: hl - адрес команды ассемблера +;вх: z - команда не ссылается на память +; nz -> hl - адрес на который ссылается команда +x3884 push hl + call x2F96 ;анализ команды ассемблера + pop hl + bit 6,(iy+#01) + ret z ;в команде нет ссылки на адрес памяти + ld hl,(xDDD0) + ret + +;переход на адрес, на который ссылается команда ассемблера +x3892 xor a + call x38C6 ;запись в таблицу текущего адреса дизасма + ex de,hl + call x3884 ;получить адрес, на который ссылается команда ассемблера + jr x38C3 ;переход на новый адрес + +;расчет адреса в таблице с записями адресов дизасма +;вх: a - номер ячейки в таблице +;вых: hl - адрес в таблице +x389C ld l,a + ld h,#00 + ld de,xDD8D + add hl,hl + add hl,de + ret + +;ввод нового адреса листинга +x38A5 ld a,#C3 +x38A7 rst #30 + dw rom6_x06AD ;ввод текстовой строки внизу экрана + db #06 + jr c,x38D1 ;нажата Break. Выход из режима + bit 4,(iy+#05) + push af + call z,x0D55 ;вводить адрес выражением + pop af + call nz,x0DF4 ;вводить адрес числом + jr nz,x38A7 ;не верный адрес + push de + ld a,#0C ;сообщение: _Working ... + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 + pop hl +x38C3 jp x394F + +;запись в таблицу текущего адреса дизасма +;вх: a - номер ячейки в таблице +x38C6 call x389C ;расчет адреса в таблице + ld de,(xDD8B) + ld (hl),e + inc hl + ld (hl),d + ret + +;выход из режима дизасма +x38D1 res 1,(ix+#07) + jp x37DD + +;АДРЕС: #38D8 быстрый вход в команду DASM (ss+D) +x38D8 xor a + ld hl,(xDD6B) ;pc программы пользователя + bit 6,(iy+#05) + jr nz,x38E5 ;адрес команды SS/D, берется из регистра PC + +;АДРЕС: #38E2 Команда: DASm [addr] вывод листинга дизасма +x38E2 ld hl,(xDD69) ;адрес команды SS/D. берется из ячейки (mem) +x38E5 or a + jr z,x38EE ;нет параметров, с текущего адреса + cp #02 + ld a,#0B ;сообщение: too many operands + ret nc ;много параметров + ex de,hl +x38EE ld (xDD8B),hl ;адрес начала для команды DASM + ld a,#0C ;сообщение: _Working ... + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 +x38F7 call x3A95 ;подготовка переменных к выводу на экран/принтер + ld (ix+#00),#00 ;crd Y + set 1,(ix+#07) ;Изменять атрибуты при выводе каждого символа + ld hl,(xDD8B) ;адрес начала для команды DASM + ld b,#16 ;кол-во строк для вывода + jr x390C + +;печать листинга дизасма +x3909 inc (ix+#00) +x390C push bc + call x39A8 ;печать одной строки листинга дизасма + pop bc + djnz x3909 + +;опрос клавиатуры и реакция на клавиши +x3913 ld hl,x3913 ;сюда вернемся + push hl + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + call x2C7E ;поиск и вызов процедуры обработки без возврата(если не найдено возврат) + db #8E ;ss+D + dw x38D1 ;выход из режима дизасма + db #03 ;Break + dw x38D1 ;выход из режима дизасма + db #85 ;cs+5 + dw x3951 ;переход на один байт назад + db #83 ;cs+8 + dw x3956 ;переход на один байт вперед + db #86 ;cs+6 + dw x398F ;переход на одну команду вперед + db #84 ;cs+7 + dw x3963 ;переход на одну команду назад + db #0D ;Enter + dw x38A5 ;ввод нового адреса + db #8D ;ss+G + dw x3892 ;переход на адрес, на который ссылается команда ассемблера + db #62 ;b + dw x330B ;установка ловушки #8, по текущему адресу листинга дизасма + db #6E ;n + dw x3326 ;удаление ловушки #8 + db #FF + sub #30 + ret c + ld c,#05 + cp c + jr c,x38C6 ;нажато 0..4 - запись текущего адреса дизасма + sub c + cp c + ret nc ;не цифра + call x389C ;нажато 5..9 - восстановление адреса дизасма + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl +x394F jr x395D + +;переход на один байт назад +x3951 ld bc,#FFFF + jr x3959 + +;переход на один байт вперед +x3956 ld bc,#0001 +x3959 ld hl,(xDD8B) + add hl,bc +x395D ld (xDD8B),hl ;адрес начала листинга +x3960 pop hl + jr x38F7 ;обновление окна с листингом + +;переход на одну команду назад +x3963 call x2A1B ;скроллинг окна вниз + ld (ix+#00),#00 ;crd Y + ld bc,#FFFB ;-5 +x396D inc bc + ld hl,(xDD8B) + add hl,bc + push bc + call x2F96 ;анализ команды ассемблера + pop bc + ld de,(xDD8B) + or a + sbc hl,de + jr z,x3982 ;команда найдена + jr nc,x398B +x3982 add hl,de + jr nz,x396D +;команда найдена + add hl,bc + ld (xDD8B),hl ;адрес начала листинга + jr x39A8 +;ищем дальше +x398B add hl,de + add hl,bc + jr x395D + +;переход на одну команду вперед +x398F call x298E ;скроллинг окна вверх + ld (ix+#00),#15 ;crd Y + ld hl,(xDD8B) + call x2F96 ;анализ команды ассемблера + ld (xDD8B),hl ;адрес начала листинга +;ищем команду для печати в нижней строке + ld b,#15 +x39A1 push bc + call x2F96 ;анализ команды ассемблера + pop bc + djnz x39A1 + +;АДРЕС: #39A8 Печать одной строки листинга дизасма +x39A8 ld a,(ix+#06) ;цифровые атрибуты окна + push af + ld (ix+#01),#00 ;crd X =#00 + push ix + call x3281 ;установка начала списка ловушек +;обработка ловушек, для подсветки строки +x39B5 bit 7,(ix+#00) + jr z,x39DD ;ловушка не активна +; ловушка активна + push hl + ld l,(ix+#01) ;номер страницы в которой установлена ловушка + call x3707 ;сравнение страницы пользователя с заданной + pop hl + jr nz,x39DD ;в другой странице + push de + ld e,(ix+#02) + ld d,(ix+#03) ;адрес ловушки + or a + sbc hl,de + add hl,de + pop de + jr nz,x39DD ;не по текущему адресу + ld a,(xE114) ;атрибуты для подсветки ловушки при выводе дизасма + ex (sp),ix + ld (ix+#06),a + ex (sp),ix +x39DD add ix,de + djnz x39B5 + pop ix + call x2FAC ;печать строки дизасма + pop af + ld (ix+#06),a + ret + +;АДРЕС: #39EB Команда: LCATalogue [num_drive] +; вывод каталога дискеты на принтер +;вх: de - первый операнд +; a - количество операндов [0..5] +x39EB set 4,(iy+#09) ;вывод на принтер + +;АДРЕС: #39EF Команда: CATalogue [num_drive] +; вывод каталога дискеты +;вх: de - первый операнд +; a - количество операндов [0..5] +x39EF or a + jr z,x3A04 ;используем текущий дисковод + cp #04 ;!!!ОШИБКА параметр всего один + ld a,#0B ;сообщение: too many operands + jr nc,x3A08 ;много параметров. выход в отладчик + ld a,e + and #FC + or d + ld a,#3E ;сообщение: known disk + jr nz,x3A08 ;неврный номер дисковода. выход в отладчик + ld a,e + call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ +x3A04 rst #30 + dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) + db #06 +x3A08 call x093C ;вывод на экран + ld a,#81 ;сообщение: enter command + jp x0AE0 ;выход в отладчик + +;АДРЕС: #3A10 Команда: PUSH data +; занесение в стек программы значения data +x3A10 ld hl,x367C ;сюда вернемся + ex (sp),hl + +;АДРЕС: #3A14 запись de на стэк пользователя +;вх: de - число +; +x3A14 ld hl,(xDD6D) ;адрес вершины стэка пользователя + dec hl + ld a,d + rst #00 + dec hl + ld a,e + rst #00 + ld (xDD6D),hl + ret + +;АДРЕС: #3A21 копирование активного экрана пользователя в #4000 +; +x3A21 bit 3,(iy-2) + jp z,x0581 ;был scr 5 при входе + ld bc,#1FFD ;был scr 7 при входе + ld a,#02 + out (c),a + ld b,#7F + ld a,#17 + out (c),a ;rom 2, ram 7 + ld hl,#C000 + ld de,#4000 + ld bc,#1B00 + ldir ;копируем экран из ram 7 + ld bc,#7FFD + ld a,#10 + out (c),a + ld b,#1F + ld a,#12 + out (c),a ;rom 2, ram 8 + ret + +;АДРЕС: #3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +x3A4E push hl + ld hl,(xE010) + ld (xE012),hl + pop hl + ret + +;АДРЕС: #3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти +; на принтер. +;вх: de - первый операнд +; hl - второй операнд +; a - количество операндов [0..5] +x3A57 call x374B ;;проверка допустимости заданных адресов + set 4,(iy+#09) ;вывод на принтер + jr x3A63 + +;АДРЕС: #3A60 Команда: DISs [addr_st [,addr_end]] +; реассемблирование блока памяти с адреса addr_st по addr_end +; включительно +;вх: de - первый операнд +; hl - второй операнд +; a - количество операндов [0..5] +x3A60 call x374B ;проверка допустимости заданных адресов +x3A63 ld bc,x2FAC ;п/п печать строки дизасма + jr x3A77 + +;АДРЕС: #3A68 Команда: LDUmp [addr_st[,addr_end]] +; выдача дампа памяти на принтер с адреса addr_st по addr_end включительно +;вх: de - первый операнд +; hl - второй операнд +; a - количество операндов [0..5] +x3A68 call x374B ;проверка допустимости заданных адресов + set 4,(iy+#09) ;вывод на принтер + jr x3A74 + +;АДРЕС: #3A71 Команда: DUmp [addr_st[,addr_end]] +; выдача дампа памяти с адреса addr_st по addr_end включительно +;вх: de - первый операнд +; hl - второй операнд +; a - количество операндов [0..5] +x3A71 call x374B ;проверка допустимости заданных адресов +x3A74 ld bc,x2EBE ;п/п печати одной строки дампа памяти (8 байт) +x3A77 ex de,hl + call x3A95 ;подготовка переменных к выводу на экран/принтер +x3A7B call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) + rst #20 + db #8D + push de + push bc + call x3A93 ;вызов п/п по адресу в bc - call (bc) + pop bc + pop de + or a + sbc hl,de + add hl,de + jr c,x3A7B ;еще не конец + call x093C ;вывод на экран + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #3A93 вызов п/п по адресу в bc - call (bc) +x3A93 push bc + ret + +;АДРЕС: #3A95 подготовка переменных к выводу на экран/принтер +x3A95 push hl + push de + push bc + bit 4,(iy+#09) + ld hl,xE075 + jr z,x3AA4 ;вывод на экран + ld hl,xE067 ;вывод на принтер +x3AA4 call x301C ;ix = адрес дескриптора окна из hl + push af + call z,x2A5E ;обработка управляющего кода #0C (очистка текущего окна) + ld (iy+#0A),#00 + pop af + jr nz,x3AB6 ;вывод на принтер + ld (ix+#00),#15 ;crd Y +x3AB6 ld hl,x3AC0 + ld (xDE12),hl + pop bc + pop de + pop hl + ret +x3AC0 call x093C + ld a,#9E + jp x0B06 + +;АДРЕС: #3AC8 Команда: VList +x3AC8 ld hl,x23A3 + ld de,x2104 ;п/п печати слова анализатора + jr x3AD8 + +;АДРЕС: #3AD0 Команда: Help +x3AD0 ld hl,x3D01 + ld c,#00 + ld de,x3AFB +;печать команд отладчика/слов анализатора +x3AD8 call x33BB ;установка и очистка информационного окна отладчика +x3ADB ld b,(ix+#04) ;высота окна в знакоместах +x3ADE push de + call x3AF9 ;вызов п/п по адресу в de - call (de) + pop de + ld a,#81 ;сообщение: enter command + ret nc ;завершили печать + djnz x3ADE +; ожидание нажатия клавиши + push hl + push bc + push de + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + pop de + pop bc + pop hl + cp #03 + jr nz,x3ADB ;если не Break печатаем следующую страницу + ld a,#9A ;сообщение: command abandoned + ret + +;АДРЕС: #3AF9 вызов п/п по адресу в de - call (de) +x3AF9 push de + ret + +;АДРЕС: #3AFB печать команды отладчика +;вх: hl - адрес команды отладчика +; c - номер команды в списке +;вых: hl - адрес начала следующей команды +; c - номер следующей команды в списке +; cy=1 слово напечатано +; cy=0 нет больше слов для печати +x3AFB ld a,(hl) + or a + ret z ;выход если конец списка + cp #20 + jr nc,x3B12 ;печать команды +;печать названия группы команд + push bc + ld c,a + dec c ;номер блока соообщений + rst #20 + db #0D + dc "- " + inc hl + ld b,(hl) ;номер сообщения + inc hl + push hl + rst #08 + pop hl + pop bc + jr x3B53 ;выход +;печать команды +x3B12 push bc + rst #20 + db #8D + ld b,#0A + call x15DD ;печать сообщения из hl не менее заданной длины + pop bc + push bc + push hl + ld hl,x3E2C + ld a,c + add a,a + add a,c + ld c,a + inc c + inc c + ld b,#00 + add hl,bc + ld a,(hl) ;флаг описателя команды + bit 7,a + jr z,x3B30 ;в параметрах нет строки + jr x3B34 ;в параметрах команды есть строка +x3B30 bit 5,a + jr z,x3B3C +; в параметрах команды есть строка: печать comp. +x3B34 rst #20 + dc "comp." + jr x3B50 +; печать количества параметров команды +x3B3C bit 6,a + push af + jr nz,x3B46 ;в команде есть необязательные параметры + rst #20 + dc " " + jr x3B49 +x3B46 rst #20 + dc "<=" +x3B49 pop af + and #1F + rst #30 + dw rom6_x03A1 ;печать числа в десятичной системе счисления + db #06 +x3B50 pop hl + pop bc + inc c +;выход +x3B53 scf + ret + +;АДРЕС: #3B55 Команда: IM +x3B55 ld a,e + and #FC + or d + ld a,#17 ;сообщение: illegal value operand + ret nz + ld a,#81 ;сообщение: enter command + ld hl,#0000 + add hl,de + add hl,de + add hl,de + ld de,x3B69 + add hl,de + jp (hl) +;процедуры для установки режима прерываний +x3B69 im 0 + ret + im 1 + ret + im 2 + ret + ld a,#17 ;сообщение: illegal value operand + ret + +;АДРЕС: #3B75 определение типа прерываний im 1/2 +;вых: z режим im 2 +; nz режим im 1 +; a=0 - im 2 +; a=1 - im 1 +x3B75 xor a + ld d,a + ld b,#01 + ei + halt ;если im 2, то d=0 + di ;если im 1, то d=1 + ld a,d + or a + ret + +;АДРЕС: #3B7F установка переменных по конкретным адресам +x3B7F ld hl,x3EDA + ld b,#03 +x3B84 ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,(hl) + ld (de),a + inc hl + inc de + ld a,(hl) + ld (de),a + inc hl + djnz x3B84 + ret + +;АДРЕС: #3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE +x3B92 db #CE,#38,#3B,#3A,#F4,#75,#DB,#73 + db #D5,#F5,#D7,#29,#D1,#AD,#D3,#BF + db #ED,#8B,#EF,#8E,#E9,#E9,#25,#0F + db #00,#E3,#E6,#23,#03,#04,#F2,#3F + db #CC,#DD,#45,#39,#4B,#F7,#51,#3D + db #57,#33,#6D,#DF,#6D,#F0,#34,#FD + db #1B,#43,#18,#87,#2E,#64,#8B,#A3 + db #CB,#84,#42,#A1,#86,#A9,#DF,#82 + db #5B,#7E,#9F,#BB,#AC,#8D,#9E,#B3 + db #71,#70,#73,#72,#96,#81,#B2,#0B + db #84,#E2,#AF,#6B,#86,#AF,#82,#F6 + db #A5,#81,#B2,#A1,#8C,#A7,#92,#18 + db #7A,#0E,#78,#B7,#0E,#61,#BB,#8F + db #B2,#B5,#79,#6F,#B1,#B7,#A2 + +;АДРЕС: #3C01 некодированные процедуры переключения страниц -> ram 8 xE42D +x3C01 db #3E,#10,#32,#69,#E4,#F1,#E3,#22 + db #3D,#E4,#21,#78,#E4,#E3,#E5,#21 + db #01,#32,#E3,#ED,#43,#3D,#E4,#01 + db #30,#3D,#18,#1A,#F5,#AF,#18,#03 + db #F5,#3E,#10,#32,#69,#E4,#F1,#ED + db #43,#3D,#E4,#E3,#4E,#23,#46,#23 + db #E3,#E5,#21,#78,#E4,#E3,#C5,#F5 + db #01,#FD,#7F,#3E,#00,#ED,#79,#3E + db #10,#06,#1F,#ED,#79,#F1,#ED,#4B + db #3D,#E4,#C9,#C5,#F5,#01,#FD,#1F + db #3E,#12,#ED,#79,#F1,#C1,#C9,#E5 + db #21,#30,#3D,#E3,#C5,#F5,#01,#FD + db #1F,#3E,#10,#ED,#79,#06,#7F,#ED + db #79,#F1,#C1,#C9,#C5,#F5,#01,#FD + db #1F,#3E,#10,#ED,#79,#AF,#06,#7F + db #ED,#79,#F1,#C1,#C9,#4F,#21,#10 + db #01,#0F,#0F,#E6,#03,#85,#6F,#6E + db #6E,#79,#C9,#E6,#03,#17,#85,#6F + db #30,#01,#24,#7E,#23,#66,#6F,#C9 + db #E3,#23,#23,#E3,#E5,#2A,#08,#E4 + db #E3,#C9,#7B,#E6,#10,#ED,#79,#06 + db #1F,#7A,#E6,#03,#F6,#10,#ED,#79 + db #08,#38,#01,#7E,#77,#08,#3E,#12 + db #ED,#79,#06,#7F,#3E,#10,#ED,#79 + db #C3,#A1,#05,#7B,#E6,#10,#ED,#79 + db #06,#1F,#7A,#E6,#03,#F6,#10,#ED + db #79,#D9,#08,#30,#01,#EB,#ED,#B0 + db #30,#01,#EB,#08,#D9,#3E,#12,#ED + db #79,#06,#7F,#3E,#10,#ED,#79,#D9 + db #C9,#00,#33,#33,#FB,#3C,#32,#0D + db #E0,#3E,#C9,#32,#18,#E5,#3E,#FB + db #32,#17,#E5,#ED,#56,#C3,#5E,#02 + +;АДРЕС: #3D01 список команд отладчика +x3D01 db #01,"L" ;номер блока сообщений+1, номер сообщения в блоке + dc "ANalyser" + dc "CLear" + dc "DEFLoad" + dc "DEFSave" + dc "EDit" + dc "EVal" + dc "LDEFinition" + dc "PDEFinition" + dc "VList" + dc "WORD" + db #01,"M" + dc "BREak" + dc "BRK" + dc "DELBreak" + dc "LBreak" + dc "LISTBreak" + db #01,"N" + dc "Jump" + dc "CALl" + dc "SLOW" + dc "WORKspace" + db #01,"O" + dc "BASE" + dc "EXX" + dc "EX AF" + dc "EXit" + dc "OPTion" + dc "SHow" + db #01,"Q" + dc ".PC" + dc "." + dc "CHeck" + dc "DASm" + dc "DATA" + dc "DISs" + dc "DUmp" + dc "FILl" + dc "FINd" + dc "LDISs" + dc "LDUmp" + dc "MEMory" + dc "MOVe" + dc "PUSH" + dc "POP" + dc "RAM" + dc "ROM" + dc "SEarch" + db #01,"R" + dc "CATalogue" + dc "ERAse" + dc "LCATalogue" + dc "LOAD" + dc "SAVE" + db #01,"S" + dc "IM" + dc "INTerrupt" + dc "IND" + dc "OUTD" + dc "IN" + dc "OUT" + dc "SCReen" + db #00 + +;АДРЕС: #3E25 чтение портов #1FFD/#7FFD +;вых: cy=1 +x3E25 ld b,#0E + call x03B6 ;чтение регистра AY + rlca + ret + +;АДРЕС: #3E2C адреса обработки команд отладчика +; 7,=1 в параметрах есть строка -> 0-2,=nnn количество числовых параметров перед строкой +; 6,=1 операнды передаются в регистрах de,hl,bc. кол-во операндлов в A +; 5,=1 обрабатывать команду без проверки синтаксиса +; 7-5,=000 -> 0-4,=nnnnn количество операндов +x3E2C dw x1F42: db %00000001 ;ANalyser + dw x1F25: db %00000000 ;CLear + dw x1EA5: db %00100000 ;DEFLoad + dw x1E76: db %00100000 ;DEFSave + dw x2093: db %00100000 ;EDit + dw x2297: db %00100000 ;EVal + dw x2218: db %00000000 ;LDEFinition + dw x2214: db %00000000 ;PDEFinition + dw x3AC8: db %00000000 ;VList + dw x1FB0: db %00100000 ;WORD + dw x3303: db %01000101 ;BREak + dw x32E2: db %00000010 ;BRK + dw x32AF: db %00000001 ;DELBreak + dw x31C1: db %00000000 ;LBreak + dw x31C1: db %00000000 ;LISTBreak + dw x36B4: db %01000010 ;Jump + dw x3699: db %01000010 ;CALl + dw x31AB: db %00000001 ;SLOW + dw x344F: db %00000001 ;WORKspace + dw x3432: db %00000001 ;BASE + dw x3662: db %00000000 ;EXX + dw x3666: db %00000000 ;EX AF + dw x0AD7: db %00000000 ;EXit + dw x3333: db %00000010 ;OPTion + dw x33D2: db %00000000 ;SHow + dw x3614: db %10000000 ;.PC + dw x361E: db %10000000 ;. + dw x356F: db %01000100 ;CHeck + dw x38E2: db %01000001 ;DASm + dw x360D: db %10000001 ;DATA + dw x3A60: db %01000010 ;DISs + dw x3A71: db %01000010 ;DUmp + dw x35F5: db %01000100 ;FILl + dw x346A: db %10000010 ;FINd + dw x3A57: db %01000010 ;LDISs + dw x3A68: db %01000010 ;LDUmp + dw x365C: db %00000001 ;MEMory + dw x352F: db %01000100 ;MOVe + dw x3A10: db %00000001 ;PUSH + dw x364D: db %00000000 ;POP + dw x370C: db %00000001 ;RAM + dw x36DB: db %00000001 ;ROM + dw x3461: db %10000011 ;SEarch + dw x39EF: db %01000001 ;CATalogue + dw x3074: db %00100000 ;ERAse + dw x39EB: db %01000001 ;LCATalogue + dw x3095: db %00100000 ;LOAD + dw x3085: db %00100000 ;SAVE + dw x3B55: db %00000001 ;IM + dw x3683: db %00000001 ;INTerrupt + dw x337A: db %00000001 ;IND + dw x336C: db %00000010 ;OUTD + dw x3383: db %00000001 ;IN + dw x3360: db %00000010 ;OUT + dw x3778: db %01000001 ;SCReen + db #00 + +;АДРЕС: #3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED +x3ED2 db #A1,#AF,#AD,#AF,#A9,#AF,#AD,#AF + +;АДРЕС: #3EDA данные для установки переменных по конкретным адресам +x3EDA dw xC063 ;адрес + dw #0000 ;включение отладчика + dw xC064 ;адрес + dw #0000 ;отключение мерехвата NMI + dw xE9E5 ;адрес + dw xF7C0 ;установка адреса шрифта + +;АДРЕС: #3FE6 названия месяцев +x3EE6 dc "Jan" + dc "Feb" + dc "Mar" + dc "Apr" + dc "May" + dc "Jun" + dc "Jul" + dc "Aug" + dc "Sep" + dc "Oct" + dc "Nov" + dc "Dec" + +;АДРЕС: #3F0A названия дней недели +x3F0A dc "Sun" + dc "Mon" + dc "Tue" + dc "Wed" + dc "Thu" + dc "Fri" + dc "Sat" + +x3F1F DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" + ds #4000-$,#00 + + + SAVEBIN "../Build/scorp/NewROM2.bin",#0000,#4000 + diff --git a/ProfRom_Disasm/rom3.bat b/ProfRom_Disasm/rom3.bat new file mode 100755 index 0000000..3eb1896 --- /dev/null +++ b/ProfRom_Disasm/rom3.bat @@ -0,0 +1,5 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom3_trdos.a80 >> !log\error.txt + diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 new file mode 100755 index 0000000..7c1223e --- /dev/null +++ b/ProfRom_Disasm/rom3_trdos.a80 @@ -0,0 +1,7186 @@ +;АДРЕС: #3FF0 вывод в порт +;АДРЕС: #3FF3 чтение порта + + +;ИСХОДНЫЙ ТЕКСТ TR-DOS 5.03 для SjASMPlus + +;Основано на книге "ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04T (5.03) ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ." +;Автор книги: Федин Павел Юрьевич, 04.04.1996. +;Перевод всех чисел в шестнадцатеричный формат, переформатирование: Spectre, 19.10.2005 +;Исправление, переформатирование: Keeper, 21.06.2009 +;Кодировка: CP-1251 +;Правка под версию Tr-Dos 5.03: PLM, 2022.04.03 + + DEVICE ZXSPECTRUM48 + +;Адрес 0. Полная инициализация системы. + + ORG 0 + +x0000 DI + JP x0844 ;new + LD A,7 + JR x0009 + +;Адрес 8. Инициализация системы. В DE поместите адрес вершины памяти, в A - 7 и запретите прерывания. Используется также с адреса 9. + +x0008 NOP +x0009 NOP + NOP +x000B LD A,#3F +x000D JR x0013 +x000F NOP + +;Адрес #10. Переход к подпрограмме печати символа из регистра A. + +x0010 JP x3D82 + +;Адрес #13. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x0013 LD I,A + JP x001B + +;Адрес #18. Переход к подпрограмме печати строки. + +x0018 JP x2707 + +;Адрес #1B. То же, что и #24. + +x001B ld h,d + ld l,e + inc de + JR x0024 + +;Адрес #20. Переход к подпрограмме вызова подпрограмм из ПЗУ бейсика. Адрес вызываемой подпрограммы поместите в двух байтах после команды RST #20. Например: + +x0020 JP x2F72 +x0023 RET + +;Адрес #24. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x0024 ld (hl),#00 + JR x002B ;инициализация системы + +;Адрес #28. Выборка адреса текущего канала с учетом сдвига, заданного в регистре C. + +x0028 JP x2323 + +;Адрес #2B. Инициализация системы. В DE и HL поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. + +x002B ld bc,#BFFF + jr x003A +x0030 nop + nop + nop +x0033 out (c),a + nop + halt + rst #38 + +;Адрес #38. Обработка маскируемого прерывания. + +x0038 ei + ret + +;Адрес #3A. Инициализация системы. В DE поместите адрес вершины памяти в HL - адрес дна, установите белый бордюр, заполните обозначенную область памяти байтом 2 и запретите прерывания. + +x003A ldir + jr x0048 + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + +x0048 LD (#5CB4),HL ;установка P_RAMT + LD DE,#3EAF ;адрес символов для UDG + LD BC,#A8 ;длина UDG - #A8 байтов + LD A,E + EX DE,HL ;переброска адреса символов для UDG в HL + LD SP,#6000 ;установка временного стека + LD (#5F00),HL ;сохранение адреса символов для UDG + LD HL,#79 ;возвращаться в #79 + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#B8ED ;код команды LDDR + JR x0069 ;установка UDG + +;Адрес #66. Подпрограмма обработки немаскируемого прерывания. + +x0066 JP x2A56 + +;Адрес #69. Выполнение любой команды процессора. Поместите в HL коды команды, установите регистры (#5F00 вместо HL) и поместите в HL коды команды. + +x0069 LD (#5F10),HL ;помещение кодов команды в память + PUSH AF ;сохранение AF + LD A,#C9 ;код команды RET + LD (#5F12),A ;помещение его в память + POP AF ;восстановление AF + LD HL,(#5F00) ;берем адрес символов для UDG + JP #5F10 ;выполнение команды и возврат + +;Адрес #79. Инициализация системы. Установите P_RAMT, знакогенератор пользователя, белый бордюр, поместите в DE адрес начала знакогенератора минус 1 и запретите прерывания. + +x0079 EX DE,HL ;загрузка адреса UDG в HL + INC HL + LD (#5C7B),HL ;установка переменной UDG + DEC HL ;следующий адрес + LD BC,#1E40 ;установка RASP и PIP + LD (#5C38),BC + LD (#5CB2),HL ;установка RAMTOP + LD HL,#3C00 ;установка CHARS + LD (#5C36),HL + LD HL,(#5CB2) ;берем адрес RAMTOP + LD (HL),#3E ;признак конца стека GO SUB + DEC HL ;следующий адрес + LD SP,HL ;установка постоянного стека + DEC HL ;установка ERR_SP + DEC HL + LD (#5C3D),HL + LD DE,#1303 ;адрес подпрограммы обработки ошибок + PUSH DE ;установка его + IM 1 ;установка первого режима прерываний + LD IY,#5C3A ;установка регистра IY + LD HL,#5CB6 ;установка CHANS + LD (#5C4F),HL + LD DE,#15AF ;адрес области описателей каналов в ПЗУ бейсика + LD BC,#15 ;ее длина - #15 байт + EX DE,HL + CALL x0117 ;перенос области описателей каналов в ОЗУ + EX DE,HL + DEC HL ;установка DATADD + LD (#5C57),HL + INC HL ;следующий адрес + LD (#5C53),HL ;установка PROG + LD (#5C4B),HL ;установка VARS + LD (HL),#80 ;конец области + INC HL ;следующий адрес + LD (#5C59),HL ;установка E_LINE + LD (HL),#D ;конец строки + INC HL ;следующий адрес + LD (HL),#80 ;конец области + INC HL ;следующий адрес + LD (#5C61),HL ;установка WORKSP + LD (#5C63),HL ;установка STKBOT + LD (#5C65),HL ;установка STKEND + LD A,#38 ;атрибуты экрана + LD (#5C8D),A ;установка ATTR_P + LD (#5C8F),A ;установка ATTR_T + LD (#5C48),A ;установка BORDER + LD HL,#523 ;установка REPDEL и REPPER + LD (#5C09),HL + DEC (IY-#3A) ;клавиши не нажаты + DEC (IY-#36) + LD HL,#15C6 ;адрес таблицы STRMS в ПЗУ бейсика + LD DE,#5C10 ;адрес переменной STRMS + LD BC,#0E ;длина таблицы - #18 байта + CALL x0117 ;перенос таблицы в ОЗУ + SET 1,(IY+1) ;открыт поток 3 + LD HL,#5CC2 ;помещение команды RET в ОЗУ + LD (HL),#C9 + +;Внимание!!! Системных переменных TR-DOS пока еще нет, и это портит память. + + RST #20 ;инициализация буфера принтера и экрана + DW #0EDF + LD HL,#5C6B ;буфер принтера использовался + LD (HL),2 + LD HL,#128B ;возвращаться в #128B + PUSH HL + LD A,#AA ;выполнять команду RUN "boot" + LD (#5B00),A + EI ;разрешение прерываний + JP x3D31 ;вход в TR-DOS + +;Адрес #117. Выполнение команды LDIR. Установите HL, DE и BC и поместите байт #C9 по адресу #5F12. + +x0117 LD (#5F00),HL ;сохранение HL + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#B0ED ;коды команды LDIR + LD (#5F10),HL ;помещение команды в ОЗУ + LD HL,(#5F00) ;восстановление HL + JP #5F10 ;выполнение команды и возврат + +;Адрес #12A. Обработка номера строки автостарта программы на бейсике. Установите #5D10 и загрузите программу. + +x012A CALL x20E5 ;изменение памяти и удаление буфера + CALL x1D97 ;очистка экрана + LD HL,(#5C59) ;берем адрес, по которому находится номер + INC HL ;строки автозапуска программы + LD E,(HL) ;берем этот номер + INC HL + LD D,(HL) + LD A,D ;это 0? + OR E + EX DE,HL ;переброска его в HL + JR Z,x0140 ;если это не 0, то программу запускать + XOR A + LD (#5D10),A +x0140 PUSH HL ;сохранение номера строки автостарта + CALL x0232 ;восстановление старого адреса подпрограммы обработки ошибок + POP HL ;восстановление номера строки автостарта + LD (#5C42),HL ;установка его + XOR A ;строку запускать с первого оператора + LD (#5C44),A + RST #20 ;очистка рабочей области памяти, стека калькулятора и буфера редактора + DW #16B0 + LD HL,(#5C53) ;выполнение RESTORE + DEC HL + LD (#5C57),HL + LD SP,(#5C3D) ;очистка стека + LD A,(#5D10) ;программу запускать? + OR A + LD HL,#1B76 ;адрес подпрограммы выполнения программы на бейсике + JR Z,x0166 ;если можно, то запуск программы + RST #20 ;сообщение O.K. + DW #1BB0 +x0166 PUSH HL ;помещение на стек адреса подпрограммы выполнения программы на бейсике + LD HL,#5CC2 ;помещение на стек адреса переключателя ПЗУ на бейсик + PUSH HL + RET ;переход к подпрограмме выполнения программы на бейсике + +;Адрес #16C. То же, что и #3D1A, но не создает системные переменные. + +x016C CALL x20F1 ;изменение памяти + CALL x294A ;создание буфера + LD A,#FF ;сообщения не печатать + LD (#5D15),A + XOR A ;обнуление #5CF7 + LD (#5CF7),A + LD A,#AA ;заставку не выводить + LD (#5D17),A + LD HL,#201 ;возвращаться в бейсик + LD (#5D1A),HL + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#5D1C),HL + DEC HL ;выделение места для адреса подпрограммы + DEC HL ;обработки ошибок + LD SP,HL + CALL x021D ;установка адреса подпрограммы обработки ошибок + LD HL,(#5CB2) ;командная строка находится выше RAMTOP? + LD DE,(#5C5D) + SBC HL,DE + EX DE,HL + JR NC,x01A5 ;если да, то при выделении буфера она не + OR A ;перемещалась + LD DE,#101 + SBC HL,DE +x01A5 LD (#5C5D),HL +x01A8 CALL x01C7 ;следующий символ строки ENTER? +x01AB JP Z,x01D3 ;если да, то завершение + CP #EA ;это REM? + INC HL ;следующий символ + JR NZ,x01A8 ;если нет, то следующий символ + CALL x01C7 ;следующий символ строки ENTER? + JR Z,x01AB ;если да, то завершение + CP ":" ;это двоеточие? + JP NZ,x01D3 ;если нет, то возврат + INC HL ;следующий символ + CALL x3048 ;сжатие строки + LD HL,(#5D11) + JP x030A ;выполнение команды + +;Адрес #1C7. берет символ по адресу из HL и возвращает его в аккумуляторе плюс флаг Z если это 0, #D или #80, иначе NZ. + +x01C7 LD A,(HL) ;берем байт по нужному адресу + CP #D ;это #D? + RET Z ;если да, то возврат + CP #80 ;это #80? + RET Z ;если да, то возврат + OR A ;сравнение его с нулем + RET ;возврат + +x01D0 CALL x1E43 + +;Адрес #1D3. Подпрограмма завершения. Вход: установить #5CB6, #5D0C, #5D0F, #5D11, #5D18, #5D1A, #5D1C и #5D1F. Выход: в SP адрес из #5D1C, а в BC код ошибки. + +x01D3 LD HL,0 ;буфер убирать, память изменять + LD (#5CF8),HL + CALL x20E5 ;если есть буфер, то уберем его + CALL x1D63 ;если надо, то очистка рабочей области памяти + LD HL,#5D17 ;заставку не выводить + LD (HL),#AA + LD HL,#5D1F ;команда поступила из машинного кода? + LD A,(HL) + OR A + LD (HL),0 ;следующая команда будет не из машинного кода + JR NZ,x01F3 ;если команда была не из машинного кода, то + CALL x1E1C ;удаление из строки 5-байтовых чисел + CALL x0212 ;и прогон символов до конца строки +x01F3 LD SP,(#5D1C) ;помещаем в SP адрес из #5D1C + LD HL,(#5D1A) ;берем адрес выхода из этой подпрограммы + LD BC,(#5D0F) ;помещаем в BC код ошибки + LD B,0 + JP (HL) ;переход по назначенному адресу + +;Адрес #201. Проверка на ошибку. Вход: установите #5C3A и #5D13. + +x0201 CALL x0232 ;помещение в #5C3D адреса из #5D13 + BIT 7,(IY+0) ;была ошибка? + RET NZ ;если нет, то возврат + LD DE,#5CC2 ;адрес команды RET в ОЗУ + LD SP,(#5C3D) ;установка SP на дно стека + PUSH DE ;переход на обработку ошибок + RET + +;Адрес #212. Прогон символов до конца строки. Установите в #5C5D адрес одного из символов строки. На выходе там будет адрес конца строки. + +x0212 CALL x1D8C ;берем текущий символ строки + CP #D ;это ENTER? + RET Z ;если да, то возврат + CALL x1E2A ;берем следующий символ строки + JR x0212 ;повтор + +;Адрес #21D. Установка адреса обработки ошибок. Вход: в #5D1C должен быть адрес на 2 больше того, по которому размещаете адрес подпрограммы обработки ошибок. Выход: старое содержимое #5C3D копируется в #5D13, а в #5C3D помещается адрес, по которому находится размещенный адрес. + +x021D LD HL,(#5C3D) ;сохранение старого содержимого #5C3D + LD (#5D13),HL + LD HL,(#5D1C) ;берем адрес из #5D12 + DEC HL ;берем нужный нам адрес + DEC HL + LD (#5C3D),HL ;установка #5C3D + LD DE,x3D16 ;адрес подпрограммы обработки ошибок + LD (HL),E ;запись его в наши ячейки + INC HL + LD (HL),D + RET ;возврат + +;Адрес #232. Помещение в #5C3D адреса из #5D13. Установите #5D13. + +x0232 LD HL,(#5D13) + LD (#5C3D),HL + RET + +;Адрес #239. Вход в командный процессор. Используется также с адреса #27B (запуск файла "boot"). + +x0239 LD HL,0 ;обнуление #5CF7 и #5CF8 + LD (#5CF7),HL + ADD HL,SP ;сохранение SP + LD (#5D1C),HL + DEC HL ;выделение места для адреса подпрограммы + DEC HL ;обработки ошибок + LD SP,HL + CALL x021D ;установка адреса подпрограммы обработки ошибок + LD HL,#5D17 ;заставку выводить? + LD A,(HL) + CP #AA + LD A,0 ;ошибок нет + LD (#5D0F),A + JP Z,x02CB ;если заставка не нужна, то переход к командному процессору + LD (HL),#AA ;в следующий раз заставку не выводить + CALL x1D97 ;очистка экрана + CALL x1D88 ;открытие потока 2 + LD HL,x0360 ;вывод текста заставки + RST #18 + CALL x106E ;вывод цветных полос + LD A,(#5CB6) ;интерфейс-1 есть? + CP #F4 + JR Z,x0271 ;если да, то + LD HL,x1000 ;вывод "Interface one fitted" + RST #18 +x0271 LD A,(#5B00) ;файл "boot" запускать? + CP #AA + JR NZ,x02CB ;если нет, то вход в командный процессор + CALL x20F1 ;изменение памяти +x027B LD HL,(#5C59) ;берем адрес буфера команд + LD A,#FE ;был запущен файл "boot" + LD (#5D0E),A + LD (HL),#F7 ;ввод команды RUN "boot" + INC HL + LD (HL),#22 + INC HL + LD (HL),"b" + INC HL + LD (HL),"o" + INC HL + LD (HL),"o" + INC HL + LD (HL),"t" + INC HL + LD (HL),#22 + INC HL + LD (#5C5B),HL ;установка адреса курсора + LD (HL),#D ;ENTER + INC HL + LD (HL),#80 ;конец области + INC HL + LD (#5C61),HL ;установка переменной WORKSP + LD (#5C63),HL ;установка и очистка стека калькулятора + LD (#5C65),HL + SET 3,(IY+1) ;установка режима L + JR x02EF ;выполнение команды + +;Адрес #2B0. Перенос трех байтов из адреса HL по адресу DE. + +x02B0 LD B,3 ;количество байтов +x02B2 LD A,(HL) ;перенос байта + LD (DE),A + INC HL ;адреса следующих байтов + INC DE + DJNZ x02B2 ;повтор до конца + RET ;возврат + +;Адрес #2B9. Остановка дисковода. В A поместите значение системного регистра. + +x02B9 LD B,#20 ;#20 повтора +x02BB PUSH BC ;сохранение количества повторов + XOR 8 ;переключение бита 3 + OUT (#FF),A ;загрузка системного регистра + PUSH AF ;сохранение значения системного регистра + LD A,5 ;задержка в #462A такта + CALL x3DFF + POP AF ;восстановление значения системного регистра + POP BC ;и количества повторов + DJNZ x02BB ;повтор до конца + RET ;возврат + +;Адрес #2CB. Командный процессор. Используется также с адресов: +;#2EF - исполнение команды. Сжатую команду поместите в буфер командной строки; +;#30A - исполнение команды. Установите все для #1D3, #5D11 и загрузите из #5D11 HL. + +x02CB LD HL,(#5D1C) ;очистка стека + DEC HL + DEC HL + LD SP,HL + CALL x20F1 ;изменение памяти + CALL x1D83 ;открытие потока 0 + LD A,(#5D16) ;выбор дисковода D: + OR 3 + CALL x02B9 ;остановка его + LD A,(#5D16) ;остановка текущего дисковода + CALL x02B9 + XOR A ;сообщения об ошибках печатать + LD (#5D15),A + CALL x2135 ;принятие команды + CALL x3032 ;сжатие командной строки +x02EF CALL x1D9F ;очистка низа экрана + LD HL,x02CB ;возвращаться в командный процессор + LD (#5D1A),HL + XOR A ;ошибок не было + LD (#5D0F),A + LD HL,(#5C59) ;берем адрес командной строки + PUSH HL ;сохраняем его + LD DE,#5D20 ;адрес буфера + CALL x02B0 ;сохранение трех первых символов строки + POP HL ;восстановление адреса строки + LD (#5D11),HL ;установка адреса командной строки +x030A LD A,(HL) ;берем первый символ строки + LD B,A ;сохраняем его + AND #80 ;его код меньше #80? + LD A,B ;восстановление символа + JR Z,x031A ;если его код меньше #80, то дисковод не устанавливать + CP #FE ;это RETURN? + JR Z,x031A ;если да, то дисковод не устанавливать + PUSH AF ;сохранение символа + CALL x3DC8 ;активизация дисковода по умолчанию + POP AF ;восстановление символа +x031A LD HL,x2FF3 ;адрес таблицы команд + DEC HL + LD C,0 ;проверка первой команды +x0320 INC C + LD D,A ;сохранение символа + LD A,#15 ;пройдена вся таблица? + CP C + JP C,x01D3 ;если да, то завершение + +;Лучше было бы поставить здесь JP C,#1D1A для выдачи сообщения "*ERROR*". + + LD A,D ;восстановление символа + INC HL ;адрес следующей команды в таблице + CP (HL) ;символы совпали? + JR NZ,x0320 ;если нет, то повтор + CP #FE ;введена команда RETURN? + CALL NZ,x294A ;если нет, то создание буфера + LD A,9 ;поиск файла вести по 9 байтам + LD (#5D06),A + XOR A ;ошибок не было + LD (#5D0F),A + LD (#5CD6),A ;расширение файла принимать + LD (#5D10),A ;на случай загрузки или верификации файла + LD HL,#5C3B ;проверка строки на синтаксис + RES 7,(HL) + LD B,0 ;перевод номера команды в двухбайтную форму + LD HL,x3008 ;адрес таблицы адресов подпрограмм + DEC C ;команды считать с нуля + SLA C ;умножение номера подпрограммы на 2 + ADD HL,BC ;определение адреса в таблице + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + EX DE,HL ;переносим его в HL + PUSH HL ;сохраняем его + LD DE,x0359 ;возврат будет в #359 + PUSH DE + JP (HL) ;вызов подпрограммы +x0359 LD HL,#5C3B ;выполнение команды + SET 7,(HL) + POP HL ;восстановление адреса подпрограммы + JP (HL) ;вызов подпрограммы + +;Адрес #360. Текст заставки TR-DOS. + +x0360 DB #16,1,#5 + DB "* TR-DOS Ver 5.03 *" + DB #D,#D,#7F + DB " 1986 Technology Research Ltd." + DB #16,5,#B + DB "(U.K.)" + DB #16,7,5 + DB "BETA 128" + DB 0 + +;Адрес #3AC. Завершение выдачи каталога. + +x03AC CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + CALL x3D80 ;перевод строки + CALL x3D80 ;еще раз + LD BC,(#5E0A) ;берем количество свободных секторов на диске + CALL x1DA9 ;печать его + LD HL,x29D2 ;печать FREE + RST #18 + +;Адрес #3C0. Переход к подпрограмме завершения. + +x03C0 JP x01D3 + +;Адрес #3C3. Печать сообщения об ошибке. В HL установите адрес сообщения, в A - код ошибки. + +x03C3 PUSH AF ;сохранение кода ошибки + LD A,(#5D0E) ;ошибка произошла при автозагрузке? + CP #FE + JR NZ,x03CD ;если нет, то установка кода ошибки + POP AF ;снятие со стека кода ошибки + RET ;возврат +x03CD POP AF ;восстановление кода ошибки + LD (#5D0F),A ;установка кода ошибки + LD A,(#5D15) ;печать сообщений разрешена? + OR A + CALL Z,x2707 ;если да, то печать сообщения + +;Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. + + RET ;возврат + +x03D9 LD HL,x2A28 + LD A,1 + JP x1C4A + +;Адрес #3E1. Вывод сообщения O.K. + +x03E1 LD HL,x2766 ;адрес сообщения O.K. + XOR A ;код ошибки - 0 + JP x1C4A ;выдача сообщения и завершение + +;Адрес #3E8. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет #5CCC. Используется также с адресов: +;#3EC - загрузка сектора дорожки 0 в буфер. Установите #5CCC. +;#3F2 - загрузка сектора в буфер, номер сектора в E, дорожки ? в D). + +x03E8 XOR A ;текущий сектор 0 + LD (#5CCC),A +x03EC LD DE,(#5CCC) ;берем номер сектора + LD D,0 ;дорожка 0 +x03F2 CALL x294A ;создание буфера + LD HL,#5D25 ;загружать в буфер + LD B,1 ;1 сектор + JP x1E3D ;загрузка сектора + +;Адрес #3FD. Загрузка в буфер сектора 8 дорожки 0. Установите #5D0C. + +x03FD CALL x294A ;создание буфера, если его нет + LD DE,8 ;дорожка 0, сектор 8 + JR x03F2 ;загрузка сектора в буфер + +;Адрес #405. Настройка на диск. Меняет переменную с типом дисковода. + +x0405 CALL x03FD ;чтение в буфер сектора 8 дорожки 0 + LD A,(#5E0C) ;диск от TR-DOS? + CP #10 + JR Z,x0415 ;если да, то установка типа дисковода + LD HL,x29E2 ;адрес сообщения DISC ERROR + RST #18 ;печать сообщения + JR x03C0 ;завершение + +;Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь программа должна быть такой: +; LD HL,#29E2 +; LD A,7 +; JP #1C4A +;А в этом случае ваша программа не получит код ошибки, а внизу экрана совершенно не к месту появится DISC ERROR. + +x0415 CALL x3E11 ;берем тип дисковода + RES 0,(HL) ;установка типа дисковода под тип диска + RES 1,(HL) ;и возврат + LD A,(#5E08) + BIT 0,A + JR NZ,x0425 + SET 0,(HL) +x0425 BIT 3,A + RET NZ + SET 1,(HL) + RET + +;Ошибка!!! Перед установкой типа надо бы проверить совместимость диска и дисковода. + +;Адрес #42B. Проверка второго символа командной строки. Вход: установите #5D11. На выходе будет установлен флаг Z, если это ENTER и сброшен, если нет. + +x042B LD HL,(#5D11) ;берем адрес начала строки команды + INC HL ;берем адрес ее второго символа + LD A,(HL) ;берем этот символ + CP #D ;сравнение его с ENTER + RET ;возврат + +;Адрес #433. Выполнение команды CAT. Установите #5D11 и #5C3B. Используется также с адреса: +;#479 (вывод каталога диска; в A - номер потока, в буфере - сектор 8 дорожки 0). + +x0433 CALL x042B ;второй символ строки команды ENTER? + LD BC,2 ;каталог выводить в поток 2 + LD (#5CDB),BC + JR Z,x046A ;если второй символ строки ENTER, то вывод каталога + CP "#" ;второй символ строки "#"? + JR NZ,x045D ;если нет, то установка дисковода и вывод каталога + LD (#5C5D),HL ;установка CH_ADD на второй символ строки + CALL x1E0B ;установка номера потока + CALL x1D8C ;берем текущий символ + CP #D ;это ENTER? + JR Z,x046A ;если да, то вывод каталога + CP "," ;это запятая? + JP NZ,x1D1A ;если нет, то синтаксическая ошибка + CALL x1E2A ;берем следующий символ + CALL x1DBD ;помещение имени дисковода на стек калькулятора + JR x0460 ;установка дисковода и вывод каталога +x045D CALL x1DDF ;установка CH_ADD и помещение имени дисковода на стек калькулятора +x0460 CALL x1D75 ;если строка проверяется на синтаксис, то возврат + CALL x1DB5 ;снятие имени дисковода со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода +x046A CALL x1D75 ;если проверка на синтаксис, то возврат + LD A,(#5CF6) ;помещение номера дисковода в #5CF9 + LD (#5CF9),A + CALL x0405 ;настройка на диск + LD A,(#5CDB) ;берем номер потока +x0479 CP 2 ;выводим в поток 2? + PUSH AF ;сохранение номера потока + CALL Z,x1D97 ;если назначен поток 2, то очистка экрана + POP AF ;восстановление номера потока + CP #11 ;он больше #10? + +;Ошибка!!! Всего потоков #F, а не #10. + + JP NC,x1D1A ;если да, то ошибка + CALL x1D84 ;открытие потока + +;Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот поток. + + LD A,#FF ;установка #5CF8 в #FF + LD (#5CF8),A + LD HL,x29F7 ;печать TITLE: + RST #18 + LD HL,#5E1A ;печать имени диска + RST #18 + CALL x3D80 ;перевод строки + LD A,(#5E09) ;вычисление количества нестертых файлов на диске + LD HL,#5E19 + SUB (HL) + PUSH HL + CALL x1DA3 ;печать его + LD HL,x2A2B ;печать FILES + RST #18 + POP HL + LD C,(HL) ;берем количество стертых файлов + CALL x1DA4 ;печать его + LD HL,x2A1D ;печать DEL.FILES + RST #18 + CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 + LD HL,#5D25 ;берем начало буфера +x04B6 CALL x04F6 ;проверка достижения конца каталога + CALL x3D80 ;перевод строки + LD A,(#5CF6) ;печать имени дисковода + ADD A,"A" + RST #10 + LD B,2 ;печатаем по 2 имени в строке +x04C4 CALL x04F6 ;если файл стерт, то пропуск его + PUSH BC ;сохранение количества имен файлов в строке + LD A,":" ;печать двоеточия + RST #10 + PUSH HL ;сохранение адреса текущего описателя файла в буфере + CALL x2938 ;печать имени и расширения файла + LD BC,#D ;вычисление адреса, по которому находится + POP HL ;размер файла в секторах + PUSH HL + ADD HL,BC + LD C,(HL) ;берем размер файла + PUSH BC ;сохраним его + LD A,C ;перегрузим его в A + LD B,2 ;вычисление количества пробелов перед числом + CP #A + JR C,x04DF + DEC B +x04DF CP #64 + JR NC,x04E8 +x04E3 LD A," " ;печать пробелов + RST #10 + DJNZ x04E3 +x04E8 POP BC ;восстановление размера файла + CALL x1DA9 ;печать его + POP HL ;восстановление адреса текущего описателя файла + POP BC ;восстановление количества имен файлов в строке + LD DE,#10 ;следующий описатель + ADD HL,DE + DJNZ x04C4 ;если напечатали только 1 файл, то печать второго + JR x04B6 ;следующая строка + +;Адрес #4F6. Проверка переменной #5CF9 и проверка достижения конца каталога при его печати. + +x04F6 PUSH HL ;сохранение HL и BC + PUSH BC + LD A,(#5CF9) ;берем номер дисковода для выдачи каталога + LD HL,#5CF6 ;назначен этот дисковод? + CP (HL) + CALL NZ,x3DCB ;если нет, то о последствиях читайте в конце + +;Ошибка в программе!!! Об этом особо в конце текста. + + POP BC ;восстановление HL и BC + POP HL + JP x2FC6 ;проверка достижения конца каталога и возврат + +;Обратите особое внимание на команду CALL NZ,#3DCB. В аналогичной подпpогpамме для LIST стоит CALL NZ,#3DCB. В нашем же случае упpавление будет передано в подпрограмму печати символа (ее адрес #3D80) на адрес, где находятся 2 байта адреса от команды CALL #3D94. Программа с этого адреса будет такой: +;SUB H +;DEC A +;CALL #20F1 +;POP DE +;POP BC +;POP HL +;RET +;Таким образом, произойдет изменение памяти, если оно разрешено, затем со стека будут сняты 3 адреса и помещены в регистры и затем произойдет возврат. Последствия всего этого определяются программой, вызвавшей #4F6. + +;Адрес #507. Прибавление #10 к HL. + +x0507 LD DE,#10 + ADD HL,DE + RET + +;Адрес #50C. Проверка и обработка достижения конца буфера при работе с каталогом. Установите #5CCC и поместите в HL текущее место буфера. Если достигнут его конец, то в HL будет начало буфера и в него будет загружен следующий сектор каталога. + +x050C PUSH HL ;сохранение HL и BC + PUSH BC + LD BC,#A1DB ;достигнут конец буфера? + ADD HL,BC + JR C,x0517 ;если да, то загрузка следующего сектора + POP BC ;восстановление HL и BC + POP HL + RET ;возврат +x0517 LD HL,#5CCC ;следующий сектор + INC (HL) + CALL x03EC ;загрузка его в буфер + POP BC ;восстановление BC и HL + POP HL + LD HL,#5D25 ;помещение в HL адреса начала буфера + RET ;возврат + +;Адрес #524. Вычисление номера дисковода по его имени. Имя поместите в А, на выходе там будет номер. + +x0524 AND #DF ;буква заглавная + SBC A,#41 ;вычисление номера дисковода + JP C,x1D1A ;если именем был символ меньше "A", то ошибка + CP 4 ;номер получился больше 3? + JP NC,x1D1A ;если да, то ошибка + RET ;возврат + +x0531 CALL x1DB5 + LD A,C + CP B + JP Z,x1D1A + RET + +;Адрес #53A. Выполнение команды NEW. Установите #5D11 и #5C3B. Используется также с адреса #569 (запись информации о файле; номер файла задайте в регистре C). + +x053A CALL x1DCD ;прием имен файлов на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка старого имени файла + LD A,(#5CF6) ;берем номер дисковода + LD (#5CF8),A ;сохраняем его + JP NZ,x03D9 ;если файл не найден, то ошибка + PUSH BC ;сохранение номера файла + CALL x165D ;загрузка описателя файла + CALL x1CB0 ;установка нового имени файла + PUSH AF ;сохранение результата проверки имени файла + LD A,(#5CF8) ;в новом имени файла назначен другой дисковод + LD HL,#5CF6 + CP (HL) + JP NZ,x1D1A ;если да, то ошибка + CALL x0405 ;настройка на диск + POP AF ;восстановление результата проверки имени файла + JP Z,x1C50 ;если такой файл уже есть, то ошибка + POP BC ;восстановление номера файла +x0569 CALL x166B ;загрузка сектора с описателем файла и замена описателя + CALL x1E43 ;перезапись сектора + JP x03E1 ;сообщение O.K. + +;Адрес #572. Проверка переменной #5D10. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. + +x0572 LD A,(#5D10) + OR A + RET + +;Адрес #577. Проверка количества стертых файлов. Установите #5D11. Если там 0, то будет сообщение NO FILE, иначе O.K. + +x0577 LD A,(#5D07) ;берем количество стертых файлов + OR A ;оно равно 0? + JP Z,x03D9 ;если да, то NO FILE + JP x03E1 ;иначе O.K. + +;Адрес #581. Запрос на стирание файла. Установите #5CDD и #5CF6, а в регистр C поместите номер файла. При ответе Y файл будет стерт и включится флаг Z, иначе он будет выключен. + +x0581 PUSH BC ;сохранение номера файла + CALL x1D97 ;очистка экрана и открытие потока 0. + LD A,(#5CF6) ;берем номер дисковода + ADD A,"A" ;вычисляем имя дисковода + CALL x3D82 ;печать его + LD A,":" ;печать двоеточия + CALL x3D82 + LD HL,#5CDD ;адрес переменной с именем и расширением файла + CALL x2938 ;печать имени и расширения файла + LD HL,x2820 ;печать FILE EXISTS. OVERWRITE? + CALL x2707 + CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + PUSH AF ;сохранение результата проверки + CALL x1D97 ;очистка экрана + POP AF ;восстановление AF и номера файла + POP BC + RET NZ ;если был ответ N, то возврат + PUSH BC ;сохранение номера файла + CALL x1D97 ;очистка экрана + POP BC ;восстановление номера файла + CALL x0781 ;стирание файла + XOR A ;включение флага Z + RET ;возврат + +;Адрес #5B4. Проверка на существование блока файла с расширением #. Установите #5CDD, #5CE5 и #5CE6. Если блок найден или у файла другое расширение, то включается флаг Z, иначе он будет выключен. + +x05B4 LD A,(#5CE5) ;берем расширение файла + CP "#" ;это "#"? + JR Z,x05BD ;если нет, то + XOR A ;включение флага Z + RET ;и возврат +x05BD LD A,#A ;файл ищем по #A байтам + LD (#5D06),A + CALL x1CB3 ;поиск файла + LD A,9 ;файл ищем по 9 байтам + LD (#5D06),A + RET ;возврат + +;Адрес #5CB. Выполнение команды COPY "*","*". Первую звездочку поместите в #5CDD, вторую - на стек калькулятора и установите #5CF8, #5D23 и #5CCF. + +x05CB LD A,(#5CDD) ;берем первый символ имени файла + CP "*" ;это "*"? + JP NZ,x03D9 ;если нет, то NO FILE + CALL x1DB5 ;снятие строки со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода-приемника + LD A,(HL) ;берем следующий символ строки + CP "*" ;это "*"? + JP NZ,x1D1A ;если нет, то ошибка + LD A,(#5CF6) ;сохранение номера дисковода-приемника + LD (#5CF9),A + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,#FF ;начнем с файла 0 + LD (#5D0D),A +x05F4 LD A,(#5CF8) ;выбор дисковода-источника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,(#5D0D) ;следующий файл + INC A + LD (#5D0D),A + LD C,A + CALL x165D ;чтение его описателя + LD A,(#5CDD) ;берем первый символ его имени + CP 0 ;это конец каталога? + JP Z,x03E1 ;если да, то O.K. + CP 1 ;файл стерт? + JR Z,x05F4 ;если да, то следующий файл + LD HL,#5CE6 ;сохранение части описателя файла + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + CALL x1CB3 ;поиск файла + JR NZ,x0634 ;если не нашли, то копирование файла + CALL x05B4 ;проверка файла с расширением "#" + JR NZ,x0634 ;если копируется другой блок, то копируем его + CALL x0581 ;запрос OVERWRITE? + JR NZ,x05F4 ;если был ответ N, то следующий файл +x0634 CALL x063C ;копирование файла + CALL x1E43 ;перезапись сектора с описателем файла + JR x05F4 ;повтор до конца каталога + +;Адрес #63C. Копирование файла при двух дисководах. Поместите описатель файла в #5CDD и его часть в #5CED. + +x063C CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + CP #80 ;уже есть #80 файлов? + JP Z,x1C45 ;если да, то NO SPACE + +;Ошибка!!! Надо выводить DIRECTORY FULL. + + LD HL,#5CED ;восстановление описателя файла + LD DE,#5CE6 + LD BC,7 + LDIR + LD DE,(#5CEA) ;берем длину файла в секторах + LD D,0 + OR A + LD HL,(#5E0A) ;берем количество свободных секторов на диске + SBC HL,DE ;уменьшаем свободное место + JP C,x1C45 ;если места не хватило, то NO SPACE + LD (#5E0A),HL ;установка нового количества свободных секторов + LD HL,(#5E06) ;берем адрес свободного пространства на диске + LD (#5CEB),HL ;установка адреса файла на диске + PUSH HL ;сохранение его + CALL x072F ;копирование файла + POP HL ;восстановление адреса файла на диске + LD (#5CEB),HL ;установка его + LD HL,(#5CF4) ;берем новый адрес свободного места на диске + LD (#5E06),HL ;установка его + LD HL,#5E09 ;записали 1 файл + INC (HL) + LD C,(HL) ;берем номер записываемого файла + DEC C + LD B,0 + PUSH BC ;сохраняем его + LD DE,9 ;записывать сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + POP BC ;восстановление номера файла + CALL x166B ;установка описателя файла + RET ;возврат + +;Адрес #690. Выполнение команды COPY. Установите #5D11 и #5C3B. + +x0690 LD HL,(#5D11) ;берем адрес второго символа командной строки + INC HL + LD A,(HL) ;берем этот символ + AND #DF ;буква заглавная + CP "S" ;это "S"? + JP Z,x1360 ;если да, то копируем 1 файл на одном дисководе + CP "B" ;это "B"? + JP Z,x152C ;если да, то копирование всего диска на одном дисководе + CALL x1DCD ;прием имен файлов + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;выделение места в памяти + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка старого имени файла + LD A,(#5CF6) ;сохранение номера дисковода - источника + LD (#5CF8),A + JP NZ,x05CB ;если файл не найден, то проверка COPY "*","*" + +;Ошибка!!! COPY "*","*" надо проверять всегда, иначе при наличии на диске файла с именем "*" скопируется только этот файл, а в целом тут должно быть так: +;LD (#5CF8),A +;PUSH AF +;CALL #5CB +;POP AF +;JP NZ,#3D9 +;А в подпрограмме #5CB вместо JP NZ,#3D9 должно быть RET NZ. + + CALL x165D ;чтение описателя файла + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + CALL x1CB0 ;установка нового имени файла + PUSH AF ;сохранение результата проверки + PUSH BC ;и номера файла + LD A,(#5CF6) ;сохранение номера дисковода - приемника + LD (#5CF9),A + LD A,(#5CF8) ;выбор дисковода - источника + CALL x3DCB + CALL x0405 ;настройка на диск + LD A,(#5CF9) ;выбор дисковода - приемника + CALL x3DCB + CALL x0405 ;настройка на диск + POP BC ;восстановление номера файла + POP AF ;и результата проверки нового имени файла + JR NZ,x06F3 ;если файл не найден, то копирование файла + CALL x05B4 ;проверка файла с расширением "#" + JR NZ,x06F3 ;если копируется другой блок, то копируем его + CALL x0581 ;запрос OVERWRITE? + JP NZ,x03E1 ;если был ответ N, то O.K. +x06F3 CALL x063C ;копирование файла + CALL x1E43 ;перезапись сектора с описателем файла + LD A,(#5CE5) ;берем расширение файла + CP "#" ;это "#"? + JP NZ,x03E1 ;если нет, то O.K. + LD A,#A ;файл искать по #A байтам + LD (#5D06),A + LD HL,#5CE6 ;следующий блок + INC (HL) + LD A,(#5CF8) ;выбор дисковода - источника + CALL x3DCB + CALL x05B4 ;поиск блока + JP NZ,x03E1 ;если не нашли, то O.K. + CALL x165D ;чтение его описателя + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF9) ;выбор дисковода - приемника + CALL x3DCB + CALL x0405 ;настройка на диск + JR x06F3 ;повтор + +;Адрес #72F. Копирование файла при двух дисководах. Установите +;#5CF1, #5D23, #5CF8, #5CF9, #5CF2, #5CCF и #5CEB. + +x072F LD A,(#5CF1) ;берем количество секторов + OR A ;все скопировали? + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;адрес переменной с длиной рабочей области памяти + SUB (HL) ;области хватит? + POP HL ;восстановление HL + JR NC,x0775 ;если рабочей области не хватит, то копируем часть файла + LD A,(#5CF1) ;копируем весь остаток + LD B,A + XOR A ;скопировали все + LD (#5CF1),A +x0744 PUSH BC ;сохранение количества копируемых сектоpов + LD A,(#5CF8) ;выбор дисковода-источника + CALL x3DCB + POP BC ;восстановление количества копируемых секторов + PUSH BC ;и снова сохранение его + LD HL,(#5CCF) ;берем адрес рабочей области памяти + PUSH HL ;сохраняем его + LD DE,(#5CF2) ;берем адрес части файла на диске-источнике + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CF2),HL ;на диске-источнике + LD A,(#5CF9) ;выбор дисковода-приемника + CALL x3DCB + POP HL ;восстановление адреса рабочей области памяти + POP BC ;и количества копируемых секторов + LD DE,(#5CEB) ;берем адрес части файла на диске-приемнике + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CEB),HL ;на диске-приемнике + JR x072F ;повтор +x0775 LD (#5CF1),A ;установка оставшегося количества секторов + PUSH HL ;сохранение HL + LD HL,#5D23 ;копируем столько секторов, сколько + LD B,(HL) ;поместится в рабочую область + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JR x0744 ;копирование секторов + +;Адрес #781. Стирание файлов. Вход: установите #5CDD, #5CE5, и произведите поиск файла. Программа устанавливает #5D08 и #5D07. + +x0781 XOR A ;обнуление количества стертых файлов + LD (#5D07),A + JR x07A0 ;стирание файлов + +;Адрес #787. Выполнение команды ERASE. Установите #5D11 и #5C3B. + +x0787 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + XOR A ;пока ничего не стерто + LD (#5D07),A + CALL x292F ;установка и проверка имени стираемого файла + CALL x07A0 ;стирание файла + JP NZ,x0577 ;если стерли файл не в конце каталога, то проверка, сколько файлов стерли + JP x03E1 ;сообщение O.K. + +;Адрес #7A0. Стирание файлов. Вход: установите #5CDD, #5CE5, обнулите #5D07 и произведите поиск файла. Программа устанавливает #5D08 и #5D07. + +x07A0 LD A,(#5CDD) ;сохранение первого символа имени файла + LD (#5D08),A + RET NZ ;если файл не был найден, то возврат + LD HL,#5D07 ;стерт еще один файл + INC (HL) + PUSH BC ;сохранение номера файла + CALL x03FD ;чтение в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + POP BC ;восстановление номера файла + INC C ;этот файл последний? + CP C + JR NZ,x07BC ;если нет, то стирание обычным порядком + DEC A ;на диске теперь на 1 файл меньше + LD (#5E09),A + XOR A ;стираемый файл в конце каталога +x07BC PUSH AF ;сохранение признака метода стирания + JR Z,x07C3 ;если файл не в конце каталога, + LD HL,#5E19 ;то увеличение на 1 количества стертых файлов + INC (HL) +x07C3 PUSH BC ;сохранение номера стираемого файла + CALL x1E43 ;перезапись сектора 8 дорожки 0 + POP BC ;восстановление номера стираемого файла + DEC C + CALL x165D ;загрузка описателя файла + POP AF ;восстановление флага метода стирания + JP Z,x07D2 ;если файл в конце каталога, то первый символ имени будет CHR$ 0 + LD A,1 ;иначе он будет CHR$ 1 +x07D2 LD (#5CDD),A ;установка первого символа имени + PUSH AF ;сохранение метода стирания + CALL x1E40 ;запись описателя файла + LD A,(#5D08) ;восстановление первого символа имени файла + LD (#5CDD),A + POP AF ;восстановление метода стирания + JR Z,x07E7 ;если стерт файл в конце каталога, то реорганизация описателя диска + CALL x1CB3 ;поиск следующего файла с таким именем + JR x07A0 ;стирание его, если он есть +x07E7 CALL x03FD ;чтение сектора 8 дорожки 0 + LD HL,(#5CEB) ;установка нового начала свободного места + LD (#5E06),HL + LD DE,(#5CEA) ;установка нового количества свободных секторов + LD HL,(#5E0A) + LD D,0 + ADD HL,DE + LD (#5E0A),HL + JP x1E43 ;перезапись сектора 8 дорожки 0 и возврат + +;Адрес #800. Позиционирование с быстрой скоростью перемещения головки. Поместите физический номер дорожки в регистр данных, а команду позиционирования - в аккумулятор. + +x0800 and #FC ;позиционировать с быстрой скоростью + jp x3D9A ;выдача команды и ожидание INTRQ + +x0805 db #FF,#FF + +;new Адpес #807. нажатие magic + +x0807 push af + ld a,r + push af + ld a,#04 + push af + inc sp + push bc + ld bc,#1FFD + push hl + ld hl,(#C001) + ex (sp),hl + ld a,#55 + ld (#C001),a + cpl + ld (#C002),a + ld a,#12 + jp x0033 + +;new Адрес #826. Вызов функции rst 8 +; a - номер дисковода + +x0826 ex (sp),hl + push af + ld a,#CF ;rst 8 + ld (#5CBF),a + ld a,(hl) + inc hl + ld (#5CC0),a + ld a,#C9 + ld (#5CC1),a + pop af + ex (sp),hl + push hl + ld hl,x3D2F + ex (sp), hl + push hl + ld hl,#5CBF + ex (sp),hl + ret + +;new Адрес #844. + +x0844 ld de,#4000 + ld a,#07 + jp x000B + +;new Адрес #84C. + +x084C rst #20 + dw #1F54 + ret c + rst #20 + dw #1B7B + +;new Адрес #853. + +x0853 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp #01 + jr z,x0867 + jr nc,x086B + bit 7,c + jr nz,x08A3 + jr x086F +x0867 bit 6,c + jr nz,x08A3 +x086B cp #04 + jr nc,x08A3 +x086F ld de,(#5CF4) + ld hl,(#5D00) + ld bc,#0105 + ld a,(#5CFE) + cp #A0 + jr nz,x0881 + inc c +x0881 call x0826 + db #81 + jr c,x088B + pop hl + pop de + ei + ret +x088B call x0A64 + ld b,#40 + cp #02 + jr z,x089C + ld b,#01 + cp #01 + jr z,x089C + ld b,#04 +x089C ld a,b + pop hl + pop de + ei + jp x3F39 +x08A3 ld hl,(#5D00) + ret + +;new Адрес #8A7. + +x08A7 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp #01 + jr z,x08BB + jr nc,x08BF + bit 7,c + jr nz,x08C7 + jr x08C3 +x08BB bit 6,c + jr nz,x08C7 +x08BF cp #04 + jr nc,x08C7 +x08C3 xor a + jp x3E63 +x08C7 jp x3D98 + +;new Адрес #8CA. + +x08CA ld (#5CCA),hl ;для дисководов C и D =#00 + ld a,#FF + ld (#5CD1),a ; + ld hl,#8282 + ret + +x08D6 DISPLAY "Free space at ",$,": ",/D,#901-$," byte(s)" + ds #08FF-$,#00 + ds #0901-$,#FF + +;new Адрес #901. +; a - номер дисковода + +x0901 ld (#5CF6),a ;номер дисковода + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0914 ;если да, то переход + jr nc,x0917 ;если дисковод C или D + bit 7,c ;дисковод A + ret nz ;если реальный дисковод, выход + jr x091A +x0914 bit 6,c + ret nz ;если реальный дисковод, выход +x0917 cp #04 + ret nc ;выход, если дисковод >3 +x091A or #80 + ld c,#28 ;подфункция #28 + call x0826 ;вызов rst 8 + db #81 + ld a,(#5CF6) ;номер дисковода + jr nc,x092D ;нет ошибки + cp #02 + ret c ;ошибка +x092A jp x3EE7 ;ошибка no disk +x092D ld hl,#5D16 + ld c,a + ld a,%00111100 + or c + ld (hl),a + ld a,(#5CF6) ;номер дисковода + ld c,#01 ;подфункция #01 (выбор текущего дисковода) + call x0826 ;вызов rst 8 + db #81 + jr c,x092A ;ошибка no disk + call x3E08 ;выборка времени перемещения головки текущего дисковода + ld (hl),#00 + call x3E11 ;выборка типа дисковода + ld (hl),#83 + ld a,#80 + ld (#5CCD),a ;гтовность дисковода + pop hl + ret + +x0951 DISPLAY "Free space at ",$,": ",/D,#A01-$," byte(s)" + ds #09FF-$,#00 + ds #0A01-$,#FF + +;new Адрес #A01. + +x0A01 ld a,(#5CF6) + push bc + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A16 ;если да, то переход + jr nc,x0A1A ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A2D + jr x0A1E +x0A16 bit 6,c + jr nz,x0A2D ;если реальный дисковод +x0A1A cp #04 + jr nc,x0A2D ;если дисковод >3 +x0A1E pop bc + ld d,c + push bc + ld c,#02 + call x0826 + db #81 + pop bc + jp c,x3EE7 + pop hl + ret +x0A2D pop bc + jp x1FEB + +;new Адрес #A31. + +x0A31 ld a,(#5CF6) + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A45 ;если да, то переход + jr nc,x0A49 ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A4F + jr x0A4D +x0A45 bit 6,c + jr nz,x0A4F +x0A49 cp #04 + jr nc,x0A4F +x0A4D pop hl + ret +x0A4F jp x3EB2 + +;new Адрес #A52. Чтение переменной монитора + +x0A52 push de + push bc + push hl + ld bc,#000D + ld de,#0004 + or a + call x0826 + db #82 + bit 5,a + jr x0A72 + +;new Адрес #A64. Чтение переменной монитора + +x0A64 push de + push bc + push hl + ld bc,#001D + ld de,#0004 + or a + call x0826 + db #82 +x0A72 pop hl + pop bc + pop de + ret + +;new Адрес #A76. + +x0A76 ld a,(#5CF6) + push bc + ld bc,#7FBA + in c,(c) + cp 1 ;дисковод B? + jr z,x0A8B ;если да, то переход + jr nc,x0A8F ;если дисковод C или D + bit 7,c ;дисковод A + jr nz,x0A97 + jr x0A93 +x0A8B bit 6,c + jr nz,x0A97 +x0A8F cp #04 + jr nc,x0A97 +x0A93 pop bc + xor a + inc a + ret +x0A97 pop bc + xor a + ret + +x0A9A DISPLAY "Free space at ",$,": ",/D,#B01-$," byte(s)" + ds #0AFF-$,#00 + ds #0B01-$,#FF + +;new Адрес #B01. + +x0B01 call x0A76 + jp z,x1FF6 + pop hl + jp x1F16 + +;new Адрес #B0B. + +x0B0B call x0A76 + ld hl,#5CD7 + ret z + inc hl + ld (hl),#00 + pop hl + ld hl,#5D25 + ld (hl),#00 + ld de,#5D26 + ld bc,#00FF + ldir + ld d,#00 +x0B25 ld e,#00 +x0B27 call x084C + ld hl,#5D25 + ld bc,#0106 + push de + call x0826 + db #81 + jr nc,x0B44 + call x0A64 + ld c,a + ld b,#00 + call x1DA9 + ld hl,#5CD6 + inc (hl) +x0B44 pop de + inc e + bit 4,e + jr z,x0B27 + ld a,#2B + rst #10 +xxx inc d + ld a,d + cp #A0 + jr nz,x0B25 + ret + +;new Адрес #B54. + +x0B54 call x0A76 + jp z,x1FEB + ret + +x0B5B DISPLAY "Free space at ",$,": ",/D,#C01-$," byte(s)" + ds #0BFF-$,#00 + ds #0C01-$,#FF + +;new Адрес #C01. + +x0C01 ld bc,#7FBA + in a,(c) + and %00000100 + jr z,x0C1C + ld bc,#047F +x0C0D in a,(#FF) + and #C0 + jp nz,x3FD1 + inc de + ld a,e + or d + jr nz,x0C0D + djnz x0C0D + ret +x0C1C ret + +;new Адрес #C1D. + +x0C1D ld bc,#7FBA + in a,(c) + and %00000100 + jr z,x0C38 + ld bc,#047F +x0C29 in a,(#FF) + and #C0 + jp nz,x3FEC + inc de + ld a,e + or d + jr nz,x0C29 + djnz x0C29 + ret +x0C38 ret + +x0C39 DISPLAY "Free space at ",$,": ",/D,#FF3-$," byte(s)" + ds #0CFF-$,#00 + ds #0D01-$,#FF + ds #0DFF-$,#00 + ds #0E01-$,#FF + ds #0EFF-$,#00 + ds #0F01-$,#FF + ds #0FF3-$,#00 + +x0FF3 push af + push bc + push de + jp x2A59 + +x0FF9 DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" + ds #FFF-$,#00 + ds #1000-$,#FF + + + DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" + DS #1000-$,#FF + +;Адрес #1000. Текст "Interface one fitted" + +x1000 DB #16,9,5 + DB "Interface one fitted" + DB 0 + +;Адрес #1018. Выполнение команды "*". Установите #5D11 и #5C3B. + +x1018 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x0531 ;снятие имени дисковода со стека калькулятора + LD A,(DE) ;берем первый символ имени + CALL x0524 ;вычисление номера дисковода + LD (#5D19),A ;установка дисковода по умолчанию + CALL x3DCB ;выбор дисковода + JP x03E1 ;сообщение O.K. + +;Адрес #102E. Прием расширения файла. Установите #5C5D и #5CD6. + +x102E LD B,"C" ;расширение C + LD A,(#5CD6) ;расширение принимать? + OR A + JR NZ,x104D ;если нет, то установка расширения файла + CALL x1D8C ;берем текущий символ + CP #AF ;это CODE? + LD B,"C" ;расширение C + JR Z,x104D ;если да, то установка расширения файла + CP #E4 ;это DATA? + LD B,"D" ;расширение D + JR Z,x104D ;если да, то установка расширения файла + CP "#" ;это #? + LD B,"#" ;расширение # + JR Z,x104D ;если да, то установка расширения файла + LD B,"B" ;расширение B +x104D LD HL,#5CE5 ;адрес переменной с расширением файла + LD (HL),B ;установка расширения + RET ;возврат + +;Адрес #1052. Ввод клавиши с ожиданием. + +x1052 DI ;запрет прерываний + PUSH HL ;сохранение регистров + PUSH BC + PUSH DE +x1056 RST #20 ;определение номера нажатой клавиши + DW #028E + LD C,0 ;режим клавиатуры - C или L + JR NZ,x1056 ;если нажата бессмысленная комбинация клавиш, то повтор + RST #20 ;определение кода нажатой клавиши + DW #031E + JR NC,x1056 ;если ничего не нажато, то повтор + DEC D ;режим клавиатуры - C или L + LD E,A ;помещение кода клавиши в регистр E + RST #20 ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT + DW #0333 + POP DE ;восстановление регистров + POP BC + POP HL + AND #DF ;буква будет заглавная + EI ;разрешение прерываний + RET ;возврат + +;Адрес #106E. Вывод цветных полос для заставки. + +x106E LD HL,#58E5 ;адрес линии атрибутов + LD B,#A ;установка атрибутов +x1073 LD (HL),7 + INC HL + DJNZ x1073 + LD (HL),2 + INC HL + LD (HL),#16 + INC HL + LD (HL),#34 + INC HL + LD (HL),#25 + INC HL + LD (HL),#28 + INC HL + LD (HL),7 + LD HL,#40EE ;адрес верхней линии пикселей + LD B,8 ;8 линий пикселей в знакоместе + XOR A ;обнуление аккумулятора +x108F PUSH BC ;сохранение количества линий + SCF ;сдвиг пикселей + RLA + PUSH HL ;сохранение адреса линии пикселей + PUSH AF ;и байта для заполнения + LD B,5 ;в линии 5 байтов +x1096 INC HL ;заполнение линии + LD (HL),A + DJNZ x1096 + POP AF ;восстановление байта для заполнения линии, + POP HL ;адреса линии + POP BC ;и количества линий + LD DE,#100 ;берем адрес следующей линии + ADD HL,DE + DJNZ x108F ;повтор до конца + RET ;возврат + +x10A4 RET + +;Адрес #10A5. Сообщения команды LIST. + +x10A5 DB " Del." +x10AA DB " File(s)" + DB 0 +x10B3 DB "Title:" + DB #A0 +x10BA DB #17,#11 + DB " Disk Drive: " + DB 0 +x10CA DB #17,#10," ",0 +x10CE DB #17,#10," 40 Track S. Side" + DB 0 +x10E2 DB #17,#10," 80 Track S. Side" + DB 0 +x10F6 DB #17,#10," 40 Track D. Side" + DB 0 +x110A DB #17,#10," 80 Track D. Side" + DB 0 +x111E DB #17,#10 + DB " Free Sector " + DB 0 +x112E DB #D,#D + DB " File Name Start Length Line" + DB 0 + +;Адрес #1151. Выделение #222 байтов в рабочей области. Устанавливает #5CCF. + +x1151 LD HL,(#5C61) ;берем адрес рабочей области + LD (#5CCF),HL ;установка адреса пространства + LD BC,#222 ;выделять #222 байтов + JP x1E23 ;выделение области и возврат + +;Адрес #115D. Печать числа из HL с нулями. + +x115D XOR A ;в числе 0 десятков тысяч + LD DE,#2710 +x1161 SBC HL,DE ;вычитание из числа 10000 + JR C,x1168 ;если получилось число меньше 10000, то следующий разряд + INC A ;следующий десяток тысяч + JR x1161 ;повтор +x1168 ADD A,"0" ;печать десятков тысяч + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 тысяч +x116F LD DE,#3E8 +x1172 SBC HL,DE ;вычитание из числа 1000 + JR C,x1179 ;если получилось число меньше 1000, то следующий разряд + INC A ;следующая тысяча + JR x1172 ;повтор +x1179 ADD A,"0" ;печать тысяч + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 сотен + LD DE,#64 +x1183 SBC HL,DE ;вычитание из числа 100 + JR C,x118A ;если получилось число меньше 100, то следующий разряд + INC A ;следующая сотня + JR x1183 ;повтор +x118A ADD A,"0" ;печать сотен + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + XOR A ;в числе 0 десятков + LD DE,#A +x1194 SBC HL,DE ;вычитание из числа 10 + JR C,x119B ;если получилось число меньше 10, то следующий разряд + INC A ;следующий десяток + JR x1194 ;повтор +x119B ADD A,"0" ;печать десятков + CALL x11A8 + ADD HL,DE ;восстановление остатка числа + LD A,L ;печать единиц + ADD A,"0" + CALL x11A8 + RET ;возврат + +;Адрес #11A8. То же, что и #3D82. + +x11A8 PUSH HL ;сохранение HL и DE + PUSH DE + CALL x3D82 ;печать символа + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #11B0. Проверка достижения конца буфера при работе с каталогом. Установите #5CF9 и #5CCC, а в HL поместите текущий адрес буфера. Если конец буфера достигнут, то в буфер загрузится следующий сектор каталога, а в HL будет #5D25. + +x11B0 PUSH HL ;сохранение HL и BC + PUSH BC + LD A,(#5CF9) ;берем номер дисковода из #5CF9 + LD HL,#5CF6 ;берем номер текущего дисковода + CP (HL) ;назначен другой дисковод? + CALL NZ,x3DCB ;если да, то выбор назначенного дисковода + POP BC ;восстановление HL и BC + POP HL + CALL x050C ;проверка достижения конца буфера + LD A,(HL) ;берем первый символ имени файла + OR A ;конец каталога? + JP Z,x01D3 ;если да, то завершение + CP 1 ;файл стерт? + CALL Z,x0507 ;если да, то пропуск файла + RET NZ ;иначе возврат + JR x11B0 ;если файл был пропущен, то повтор + +;Адрес #11CE. Выполнение команды LIST. Установите #5D11 и #5C3B. + +x11CE CALL x042B ;проверка второго символа строки + LD BC,2 ;по умолчанию печатать в поток 2 + LD (#5CDB),BC + JR Z,x1205 ;если второй символ строки ENTER, то вывод каталога + CP "#" ;если второй символ строки "#"? + JR NZ,x11F8 ;если нет, то установка дисковода + LD (#5C5D),HL ;установка CH_ADD + CALL x1E0B ;прием номера потока + CALL x1D8C ;берем текущий символ + CP #D ;это ENTER? + JR Z,x1205 ;если да, то вывод каталога + CP "," ;это ","? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1E2A ;следующий символ + CALL x1DBD ;прием имени дисковода на стек калькулятора + JR x11FB ;установка дисковода +x11F8 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора +x11FB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x1DB5 ;снятие имени дисковода со стека калькулятора + EX DE,HL ;переброска его адреса в HL + CALL x1C81 ;установка дисковода +x1205 CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CF6) ;загрузка имени дисковода в #5CF9 + LD (#5CF9),A + CALL x0405 ;настройка на диск + LD A,(#5CDB) ;берем номер потока + CP 2 ;это 2? + PUSH AF ;сохраняем его + CALL Z,x1D97 ;если да, то очистка экрана + POP AF ;восстановление номера потока + CP #11 ;он больше #10? + JP NC,x1D1A ;если да, то ошибка + CALL x1D84 ;открытие потока + LD A,#FF ;буфер не убирать, память не изменять + LD (#5CF8),A + CALL x1151 ;выделение памяти в рабочей области + LD HL,#5E06 ;начало описателя диска в буфере + LD DE,(#5CCF) ;берем адрес WORKSP + LD BC,#20 ;длина описателя диска + LDIR ;сохранение описателя диска + CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 + LD HL,#5D25 ;адрес буфера + PUSH HL ;сохранение его +x123E LD HL,x10B3 ;адрес сообщения TITLE: + PUSH BC ;сохранение BC + RST #18 ;печать TITLE: + LD HL,(#5CCF) ;берем адрес WORKSP + LD BC,#14 ;#14-й байт + ADD HL,BC + RST #18 ;печать имени диска + LD HL,x10BA ;печать DISC DRIVE: + RST #18 + LD A,(#5CF6) ;берем номер дисковода + ADD A,"A" ;вычисление имени дисковода + CALL x3D82 ;печать его + CALL x3D80 ;перевод строки + LD HL,(#5CCF) ;3-й байт описателя диска + LD BC,3 + ADD HL,BC + LD A,(HL) ;берем количество файлов на диске + LD HL,(#5CCF) ;#13-й байт + LD BC,#13 + ADD HL,BC + SUB (HL) ;вычисление количества нестертых файлов + PUSH HL ;сохранение адреса #13-го байта описателя диска + CALL x1DA3 ;печать количества нестертых файлов + LD HL,x10AA ;печать FILE(S) + RST #18 + LD HL,(#5CCF) ;2-й байт описателя диска + LD BC,2 + ADD HL,BC + LD A,(HL) ;берем тип диска + LD HL,x10CE ;адрес сообщения 40 TRACKS, S.SIDE + CP #19 ;это #19? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x10E2 ;адрес сообщения 80 TRACKS, S.SIDE + CP #18 ;это #18? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x10F6 ;адрес сообщения 40 TRACKS, D.SIDE + CP #17 ;это #17? + JR Z,x1292 ;если да, то печать сообщения + LD HL,x110A ;адpес сообщения 80 TRACKS, D.SIDE +x1292 RST #18 ;печать сообщения + POP HL ;восстановление адреса #13-го байта описателя диска + LD C,(HL) ;берем количество стертых файлов + CALL x1DA4 ;печать его + LD HL,x10A5 ;печать DEL.FILES + RST #18 + LD HL,x111E ;печать FREE SECTORS: + RST #18 + LD HL,(#5CCF) ;4-й байт + LD BC,4 + ADD HL,BC + LD C,(HL) ;берем количество свободных секторов + INC HL + LD B,(HL) + CALL x1DA9 ;печать его + LD HL,x112E ;печать FILE NAME, START, LENGTH, LINE + RST #18 + POP BC ;восстановление BC и текущего адреса в буфеpе + POP HL + LD B,#10 ;печатать информацию о #10 файлах +x12B5 CALL x11B0 ;проверка достижения конца буфера + CALL x3D80 ;перевод строки + PUSH BC ;сохранение количества оставшихся файлов + PUSH HL ;и текущего адреса в буфеpе + CALL x2938 ;печать имени и расширения файла + LD BC,#D ;#D-й байт описателя файла + POP HL ;восстановление текущего адреса в буфере + PUSH HL + ADD HL,BC + LD C,(HL) ;берем размер файла в секторах + PUSH BC ;сохраняем его + LD A,C ;загружаем его в C + LD B,2 ;печатать 2 пробела перед числом + CP #A ;длина файла меньше 10 секторов? + JR C,x12D0 ;если да, то печать пробелов + DEC B ;печатать один пробел +x12D0 CP #64 ;длина файла меньше 100 сектоpов? + JR NC,x12D9 ;если нет, то пробелы не печатать +x12D4 LD A," " ;печать пробелов + RST #10 + DJNZ x12D4 +x12D9 POP BC ;восстановление длины файла в секторах + CALL x1DA9 ;печать ее + LD HL,x10CA ;#10 пробелов + RST #18 + POP HL ;восстановление адреса описателя файла в буфере + PUSH HL ;и снова сохранение его + LD BC,9 ;9-й байт описателя + ADD HL,BC + LD E,(HL) ;берем адрес загрузки файла + INC HL + LD D,(HL) + PUSH HL ;сохранение текущего адреса в описателе файла + EX DE,HL ;переброска адреса загрузки файла в HL + CALL x115D ;печать его + LD A," " ;пробел + CALL x3D82 + POP HL ;восстановление текущего адреса в описателе файла + INC HL ;следующий адрес + LD E,(HL) ;берем длину файла + INC HL + LD D,(HL) + EX DE,HL ;перенос ее в HL + CALL x115D ;печать ее + POP HL ;восстановление адреса описателя файла + PUSH HL ;и снова сохранение его + LD BC,8 ;8-й байт + ADD HL,BC + LD A,(HL) ;берем расширение файла + CP "B" ;это "B"? + CALL Z,x131B ;если да, то печать строки автозапуска + POP HL ;восстановление адреса описателя файла + POP BC ;и счетчика файлов + LD DE,#10 ;адрес следующего описателя файла + ADD HL,DE + DJNZ x12B5 ;повтор до конца + PUSH HL ;сохранение адреса описателя файла + CALL x3D80 ;2 раза перевод строки + CALL x3D80 + JP x123E ;повтор с самого начала + +;Адрес #131B. Печать строки автостарта прогpаммы на бейсике. В HL поместите адрес описателя файла плюс 8 и установите #5CCF. + +x131B LD BC,5 ;берем адрес длины файла в секторах + ADD HL,BC + LD B,(HL) ;берем эту длину + INC HL ;следующий адрес в описателе + LD E,(HL) ;берем адрес файла на диске + INC HL + LD D,(HL) + DEC B ;загружать будем 2 сектоpа + JR Z,x1335 + DEC B + JR Z,x1335 ;если длина файла не больше 2-х секторов, то загрузка секторов + LD A,#10 ;на дорожке #10 секторов +x132C INC E ;следующий сектор + CP E ;конец дорожки? + JR NZ,x1333 ;если да, то + LD E,0 ;следующий сектор 0 + INC D ;и берем следующую дорожку +x1333 DJNZ x132C ;повтор до конца +x1335 LD HL,(#5CCF) ;берем адрес рабочей области + LD BC,#21 ;#21 байт уже занято + ADD HL,BC + LD B,2 ;загружать 2 сектора + PUSH HL ;сохранение адреса загрузки секторов + CALL x1E3D ;загрузка секторов + LD A,#80 ;будем искать конец программы + POP HL ;восстановление адреса секторов в памяти + LD BC,#200 ;длина области - #200 байтов + CPIR ;поиск конца программы + LD A,(HL) ;берем следующий байт + CP #AA ;это #AA? + RET NZ ;если нет, то возврат + INC HL ;берем номер строки автостарта + LD C,(HL) + INC HL + LD B,(HL) + LD A,B ;это 0? + OR C + RET Z ;если да, то возврат + PUSH BC ;сохранение номера строки автостарта + LD A," " ;печать пробела + CALL x3D82 + POP BC ;восстановление номера строки автостарта + CALL x1DA9 ;печать его + RET ;возврат + +;Адрес #1360. Выполнение команды COPY S. Установите #5D11 и #5C3B. + +x1360 CALL x1DC5 ;установка CH_ADD + CALL x1E2A ;следующий символ + CALL x1DBD ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x1375 CALL x1052 ;ввод символа с клавиатуры + CP "Y" ;это "Y"? + JR NZ,x1375 ;если нет, то повтор + CALL x1D9F ;очистка низа экрана + CALL x102E ;прием расширения файла + CALL x1CB0 ;установка имени файла + JP NZ,x03D9 ;если такого файла нет, то ошибка + CALL x13B7 ;копирование файла + LD A,(#5CE5) ;расширение файла #? + CP "#" + JP NZ,x03E1 ;если нет, то O.K. +x1393 LD A,#A ;файл искать по #A символам + LD (#5D06),A + LD HL,#5CE6 ;следующий блок + INC (HL) + CALL x1D97 ;очистка экрана + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x13A5 CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + JR NZ,x13A5 ;если да, то повтор + CALL x1CB3 ;поиск блока + JP NZ,x03E1 ;если не нашли, то O.K. + CALL x13B7 ;копирование блока + JR x1393 ;повтор + +;Адрес #13B7. Копирование файла при одном дисководе. Номер файла поместите в регистр C. + +x13B7 CALL x165D ;чтение описателя файла + LD HL,#5CE6 ;сохранение его части + LD DE,#5CED + LD BC,7 + LDIR + LD A,(#5CF1) ;установка объема файла в секторах + LD (#5D10),A + CALL x0405 ;настройка на диск + CALL x3E11 ;сохранение режима дисковода + LD (#5CD9),A + LD A,#FF ;первый проход + LD (#5D21),A + +;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. + + CALL x1451 ;копирование файла + LD HL,(#5D1F) ;берем адрес файла на диске - приемнике + LD (#5CEB),HL ;устанавливаем его + LD HL,(#5CF4) ;берем новый адрес свободного места на диске + LD (#5E06),HL ;устанавливаем его + LD HL,#5E09 ;записали 1 файл + INC (HL) + LD C,(HL) ;берем номер файла + DEC C + LD B,0 ;переводим его в двухбайтную форму + PUSH BC ;сохраняем его + LD DE,9 ;записывать сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + POP BC ;восстановление номера файла + CALL x166B ;чтение и замена описателя файла + CALL x1E43 ;запись сектора с описателем + RET ;возврат + +;Адрес #1403. Проверка наличия свободного места на диске-приемнике для команды COPY S. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5D10. В дисководе должен быть диск-приемник. Подпрограмма устанавливает #5CEA, #5CEB и #5D1F. + +x1403 XOR A ;не первый проход + LD (#5D21),A + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CDA),A ;сохраняем его + CALL x1CB3 ;поиск файла + JP Z,x1C50 ;если нашли, то FILE EXISTS + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;берем количество файлов на диске + CP #80 ;их 128? + JP Z,x2723 ;если да, то DIRECTORY FULL + LD HL,#5CED ;восстановление описателя файла + LD DE,#5CE6 + LD BC,7 + LDIR + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5D10) ;восстановление длины файла в секторах + LD (#5CEA),A + LD DE,(#5CEA) ;перевод ее в двухбайтную форму + LD D,0 + OR A ;сброс флага C + LD HL,(#5E0A) ;уменьшаем свободное место на диске + SBC HL,DE + JP C,x1C45 ;если его не хватило, то NO SPACE + LD (#5E0A),HL ;установка нового количества свободного места на диске + LD HL,(#5E06) ;берем адрес свободного места на диске + LD (#5CEB),HL ;установка адреса файла на диске-приемнике + LD (#5D1F),HL ;сохранение его + +;Боже мой!!! Ну что это такое! Ведь эта переменная - флаг способа вызова TR-DOS. И на этом DOS все работают. Ужас какой-то. + + RET ;возвpат + +;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. + +x1451 LD A,(#5CF1) ;все скопировали? + OR A + RET Z ;если да, то возврат + LD A,(#5D21) ;первый проход? + OR A + JR NZ,x146F ;если да, то диск - источник уже в дисководе + CALL x1D97 ;очистка экрана + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x1465 CALL x1052 ;ожидание клавиши "Y" + CP "Y" + JR NZ,x1465 + CALL x1D9F ;очистка низа экрана +x146F LD A,(#5CF1) ;все скопировали? + OR A + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;копируется часть файла + SUB (HL) + POP HL ;восстановление HL + JR NC,x14CB ;если еще не конец, то копируется часть файла + LD A,(#5CF1) ;копируем остаток + LD B,A + XOR A ;скопировали все + LD (#5CF1),A +x1484 PUSH BC ;сохранение количества копируемых секторов + LD (#5CCE),A ;обнуление #5CCE + LD HL,(#5CCF) ;берем адрес рабочего пространства + PUSH HL ;сохраняем его + LD DE,(#5CF2) ;берем адрес копируемого участка диска + CALL x14D8 ;настройка дисковода под диск-источник + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса на диске следующего сектора + LD (#5CF2),HL + CALL x1D97 ;очистка экрана + LD HL,x2785 ;печать INSERT DESTINATION DISC + CALL x2707 +x14A5 CALL x1052 ;ожидание клавиши "Y" + CP "Y" + JR NZ,x14A5 + CALL x1D9F ;очистка низа экрана + LD A,(#5D21) ;первый проход? + OR A + CALL NZ,x1403 ;если да, то проверка наличия места на диске + POP HL ;восстановление адреса рабочего пространства + POP BC ;и количества копируемых секторов + LD DE,(#5CEB) ;берем адрес текущего участка диска + CALL x14E4 ;настройка дисковода под диск-приемник + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса на диске следующего сектора + LD (#5CEB),HL + JP x1451 ;повтор +x14CB LD (#5CF1),A ;установка длины оставшейся части файла + PUSH HL ;сохранение HL + LD HL,#5D23 ;берем длину рабочей области + LD B,(HL) + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JP x1484 ;копирование + +;Адрес #14D8. Помещение значения #5CD9 в переменную режима дисковода. Установите #5CD9. + +x14D8 PUSH HL ;сохранение DE и HL + PUSH DE + CALL x3E11 ;берем адрес переменной с типом дисковода + LD A,(#5CD9) ;берем тип дисковода из #5CD9 + LD (HL),A ;установка типа дисковода + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #14E4. Помещение значения #5CDA в переменную режима дисковода. Установите #5CDA. + +x14E4 PUSH HL ;сохранение DE и HL + PUSH DE + CALL x3E11 ;берем адрес переменной с типом дисковода + LD A,(#5CDA) ;берем тип дисковода из #5CD9 + LD (HL),A ;установка типа дисковода + POP DE ;восстановление DE и HL + POP HL + RET ;возврат + +;Адрес #14F0. Проверка наличия места на диске-приемнике для команды COPY B. Установите #5CDF и поместите в дисковод диск-приемник. Устанавливает #5CDA, #5CE7, #5CDD и обнуляет #5D21. + +x14F0 XOR A ;обнуление #5D21 + LD (#5D21),A + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CDA),A ;сохраняем его + LD A,(#5E08) ;сохраняем тип диска + LD (#5CE7),A + LD HL,#280 ;вычисление количества секторов на + CP #19 ;диске-приемнике + JR Z,x151F + LD HL,#500 + CP #18 + JR Z,x151F + CP #17 + JR Z,x151F + LD HL,#A00 + CP #16 + JR Z,x151F + JP x1D1A ;если в качестве типа диска стоит неопределенное значение, то *ERROR* + +;Лучше DISC ERROR. + +x151F LD (#5CDD),HL ;сохранение количества секторов на диске-приемнике + LD BC,(#5CDF) ;берем количество копируемых секторов + SBC HL,BC ;места хватит? + JP C,x1C45 ;если нет, то NO SPACE + RET ;возврат + +;Адрес #152C. Выполнение команды COPY B. Установите #5C3B. + +x152C CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x153E CALL x1052 ;ввод клавиши + CP "Y" ;это "Y"? + JR NZ,x153E ;если да, то повтор + CALL x1D9F ;очистка низа экрана + LD A,#FF ;первый проход + LD (#5D21),A + +;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. + + CALL x0405 ;настройка на диск + CALL x3E11 ;берем режим дисковода + LD (#5CD9),A ;сохраняем его + LD A,(#5E08) ;берем тип диска + CP #19 ;диск 40-дорожечный односторонний? + LD HL,#280 ;всего на диске #280 секторов + JR Z,x1575 ;если да, то копирование + LD HL,#500 ;всего на диске #500 секторов + CP #18 ;диск 80-дорожечный односторонний? + JR Z,x1575 ;если да, то копирование + CP #17 ;диск 40-дорожечный двухсторонний? + JR Z,x1575 ;если да, то копирование + LD HL,#A00 ;всего на диске #A00 секторов + CP #16 ;диск 80-дорожечный двухсторонний? + JR Z,x1575 ;если да, то копирование + JP x1D1A ;иначе *ERROR* + +;Внимание!!! Лучше выдавать сообщение DISC ERROR. + +x1575 LD BC,(#5E0A) ;берем количество свободных секторов + SBC HL,BC ;вычисляем количество занятых секторов + LD (#5CE5),HL ;установка количества секторов + LD (#5CDF),HL + LD HL,0 ;скопировано 0 секторов + LD (#5CE1),HL + LD (#5CE3),HL + CALL x15B8 ;копирование секторов + CALL x0405 ;настройка на диск + LD A,(#5CE7) ;установка нового типа диска-приемника + LD (#5E08),A + LD HL,(#5CDD) ;берем общее число секторов на диске-приемнике + LD BC,(#5CDF) ;берем число скопированных секторов + SBC HL,BC ;вычисление числа свободных секторов на диске - приемнике + LD (#5E0A),HL ;установка его + CALL x14E4 ;настройка дисковода под диск-приемник + LD DE,9 ;записывали сектор 8 дорожки 0 + LD (#5CF4),DE + CALL x1E43 ;запись сектора + JP x03E1 ;O.K. + +;Адрес #15B2. Проверка переменной #5CE5. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в HL. + +x15B2 LD HL,(#5CE5) ;берем содержимое переменной #5CE5 + LD A,H ;проверка его на 0 + OR L + RET ;возврат + +;Адрес #15B8. Копирование секторов. Установите #5CD9, #5CCF, #5CE5, #5D21, #5D23 и #5CDB + +x15B8 CALL x15B2 ;все скопировали? + RET Z ;если да, то возврат + LD A,(#5D21) ;первый проход? + OR A + JR NZ,x15DB ;если да, то диск-источник уже в дисководе + CALL x1D97 + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x27AA ;печать INSERT SOURCE DISC + CALL x2707 +x15D1 CALL x1052 ;ожидание нажатия "Y" + CP "Y" + JR NZ,x15D1 + CALL x1D9F ;очистка низа экрана + +x15DB CALL x15B2 ;все скопировали? + RET Z ;если да, то возврат + PUSH BC ;сохранение BC и количества секторов + PUSH HL + LD HL,#5D23 ;берем длину рабочей области в секторах + LD C,(HL) + LD B,0 + POP HL ;восстановление количества секторов + SBC HL,BC ;уменьшение количества секторов + POP BC ;восстановление BC + JP NC,x1644 ;если рабочего пространства мало, то это еще не конец + LD BC,(#5CE5) ;берем оставшееся количество секторов + LD HL,0 ;все скопировали + LD (#5CE5),HL +x15F8 PUSH BC ;сохранение количества секторов + LD HL,(#5CCF) ;берем адрес рабочей области + PUSH HL ;сохраняем его + CALL x14D8 ;настройка дисковода под диск-источник + LD DE,(#5CE1) ;берем адрес группы секторов на диске-источнике + LD B,C + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CE1),HL ;на диске-источнике + CALL x1D97 ;очистка экрана + LD HL,x2779 ;печать BACKUP DISC + CALL x2707 + LD HL,x2785 ;печать INSERT DESTINATION DISC + CALL x2707 +x161D CALL x1052 ;ожидание нажатия "Y" + CP "Y" + JR NZ,x161D + CALL x1D9F ;очистка низа экрана + LD A,(#5D21) ;первый проход? + OR A + CALL NZ,x14F0 ;если да, то проверка наличия места на диске + POP HL ;восстановление адреса рабочей области + POP BC ;и количества копируемых секторов + LD DE,(#5CE3) ;берем адрес группы секторов на диске-приемнике + LD B,C + CALL x14E4 ;настройка дисковода под диск-приемник + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей группы секторов + LD (#5CE3),HL ;на диске-приемнике + JP x15B8 ;повтор +x1644 LD (#5CE5),HL ;установка оставшегося количества секторов + PUSH HL ;сохранение его + LD HL,#5D23 ;берем длину рабочей области + LD C,(HL) ;столько секторов будем копировать + LD B,0 + POP HL ;восстановление оставшегося количества секторов + XOR A ;обнуление аккумулятора + JP x15F8 ;копирование + +;Адрес #1653. Проверка состояния файла. Номер файла задайте в регистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A будет первый символ имени файла. + +x1653 CALL x165D ;чтение описателя файла + LD A,(#5CDD) ;берем первый символ имени файла + CP 1 ;проверка состояния файла + RET ;возврат + +;Адрес #165C. Чтение описателя файла. На входе в регистр A поместите номер файла. Описатель будет загружен по адресу #5CE5. Используется также с адресов: +;#165D - то же, что и #165C, но номер файла в регистре C. +;#165E - то же, что и #17E9, но сохраняет номер файла. + +x165C LD C,A ;перенос номера файла в рег. C +x165D XOR A ;переносим описатель из буфера в память +x165E PUSH BC ;сохранение номера файла + CALL x17E9 ;чтение сектора с описателем и перенос описателя + POP BC ;восстановление номера файла + RET ;возврат + +;Адрес #1664. запись информации о файле. Вход: описатель расположить по адресу #5CDD, а в аккумулятор поместить номер файла. + +x1664 LD C,A ;перенос в C номера файла + CALL x166B ;чтение сектора и замена описателя файла в нем + JP x1E43 ;перезапись сектора + +;Адрес #166B. Чтение в буфер сектора с описателем файла и замена описателя. Поместите описатель по адресу #5CDD. + +x166B LD A,#FF ;описатель перемещать из переменных в буфер + JR x165E ;то же, что и #17E9, но с сохранением BC + +;Адрес #166F. Резервирование места в памяти. Устанавливает #5CCF и #5D23. + +x166F LD A,#FF ;WORKSP использовалась + LD (#5D0E),A + CALL x1680 ;вычисление размера доступной памяти + LD HL,(#5C61) ;установка адреса рабочей области + LD (#5CCF),HL + JP x1E23 ;выделение места в памяти и возврат + +;Адрес #1680. Вычисление количества свободной памяти в секторах. Размер свободной памяти в байтах будет в BC, а в секторах ? в #5D23. + +x1680 RST #20 ;берем количество свободной памяти в байтах + DW #1F1A + LD HL,#FFFF + SBC HL,BC + LD A,H ;свободно меньше 16 секторов? + CP #10 + JR NC,x168F ;если да, то + LD A,#11 ;будем выделять 16 секторов +x168F DEC A ;1 сектор на всякий случай + LD (#5D23),A ;установка размера свободной памяти в секторах + LD B,A ;установка размера свободной памяти в байтах + LD C,0 + RET ;возврат + +;Адрес #1697. Помещает HL в #5CD7 и #5CDB и прибавляет #5CEA (1 байт) к #5CD9 (2 байта). + +x1697 LD (#5CD7),HL ;установка #5CD7 и #5CD9 + LD (#5CDB),HL + LD DE,(#5CEA) ;сложение #5CEA и #5CD9 + LD HL,(#5CD9) + LD D,0 + ADD HL,DE + LD (#5CD9),HL + RET ;возврат + +;Адрес #16AB. Выполнение команды MOVE. Установите #5C3B. + +x16AB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x166F ;резервирование места в памяти + CALL x0405 ;настройка на диск + LD A,(#5E19) ;стертые файлы на диске есть? + OR A + JP Z,x03E1 ;если нет, то сообщение O.K. + LD HL,0 ;пока освободилось 0 секторов + LD (#5CD9),HL + LD C,#FF ;начнем с файла номер 0 +x16C3 INC C ;следующий файл + CALL x1653 ;он стерт? + JR NZ,x16C3 ;если нет, то следующий файл + LD A,C ;сохранение номера стираемого файла + LD (#5CD4),A + LD HL,(#5CEB) ;берем адрес стираемого файла на диске + LD (#5CD5),HL ;сохраняем его + CALL x1697 ;приращение счетчика освободившихся секторов +x16D6 INC C ;следующий файл + CALL x1653 ;он стерт? + JR Z,x16D6 ;если да, то следующий файл + CP 0 ;это конец каталога? + JP NZ,x1710 ;если нет, то меняем файлы местами + LD A,(#5CD4) ;берем номер стираемого файла + LD C,A +x16E5 INC C ;следующий файл + CALL x1653 ;это конец каталога? + CP 0 + JR Z,x176C ;если да, то реорганизация описателя диска + XOR A ;конец каталога + LD (#5CDD),A + CALL x1E40 ;запись описателя файла + CALL x1697 ;приращение счетчика освободившихся секторов + JR x16E5 ;повтор + +x16F9 call x1701 + ret nz + jr x170D + +x16FF db #FF,#FF + +x1701 in a,(#1F) + and #02 + cp b + ret nz + inc de + ld a,e + or d + jr nz,x1701 + ret + +x170D jp x3EE7 + + +x1710 LD A,(#5CEA) ;берем размер перемещаемого файла в секторах + LD (#5CD3),A ;сохраняем его + LD (#5CD1),A + LD HL,(#5CEB) ;берем адрес перемещаемого файла на диске + LD (#5CD5),HL ;сохраняем его + PUSH BC ;сохранение номера перемещаемого файла + CALL x17A5 ;перемещение файла + POP BC ;восстановление номера перемещаемого файла + LD HL,(#5CF4) ;перемещение продолжится с этого места + LD (#5CD5),HL + LD (#5CEB),HL + XOR A ;размер стертого файла - 0 секторов + LD (#5CEA),A + LD A,(#5CDD) ;сохранение первого символа имени файла + PUSH AF + LD A,1 ;файл стерт + LD (#5CDD),A + CALL x1E40 ;запись описателя стертого файла + POP AF ;восстановление первого символа имени файла + LD (#5CDD),A + LD A,(#5CD4) ;берем номер стертого файла + LD C,A + LD HL,(#5CDB) ;установка нового адреса перемещенного файла + LD (#5CEB),HL ;на диске + LD A,(#5CD1) ;восстановление размера перемещенного файла + LD (#5CEA),A ;на диске + CALL x1E40 ;запись описателя перемещенного файла + LD A,(#5CD4) ;берем номер файла после перемещенного + INC A + LD C,A + CALL x165D ;чтение его описателя + LD HL,(#5CD5) ;установка его нового адреса на диске + LD (#5CEB),HL + CALL x1E40 ;запись его описателя + LD A,(#5CD4) ;берем номер перемещенного файла + LD C,A + JP x16C3 ;повтор + +;Адpес #176C. Реорганизация описателя диска. Установите #5CCF, #5CD9 и #5CD5. + +x176C LD HL,(#5CCF) ;берем адрес рабочего пространства + LD BC,#1000 ;сокращаем его на #1000 байтов + CALL x1E2E + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD HL,(#5E0A) ;увеличение количества свободного места на + LD DE,(#5CD9) ;диске + ADD HL,DE + LD (#5E0A),HL + LD A,(#5E09) ;уменьшение количества файлов на диске на + LD HL,#5E19 ;число стертых + SUB (HL) + LD (#5E09),A + LD (HL),0 ;на диске больше нет стертых файлов + LD HL,(#5CD5) ;установка нового адреса свободного места на + LD (#5E06),HL ;диске + PUSH AF ;сохранение количества файлов на диске + CALL x1E43 ;запись сектора 8 дорожки 0 + POP AF ;восстановление количества файлов на диске + LD C,A + CALL x165D ;чтение описателя файла за последним + XOR A ;это конец каталога + LD (#5CDD),A + JP x0569 ;запись описателя файла и завершение + +;Адрес #17A5. Перемещение файла. Установите #5CD3, #5D23, #5CCF, #5CD5 и #5CD7. + +x17A5 LD A,(#5CD3) ;перемещен весь файл? + OR A + RET Z ;если да, то возврат + PUSH HL ;сохранение HL + LD HL,#5D23 ;буфера хватит на остаток? + SUB (HL) + POP HL ;восстановление HL + JR NC,x17DD ;если буфера не хватит, то перемещаем часть файла + LD A,(#5CD3) ;берем количество оставшихся секторов + LD B,A + XOR A ;переместили все + LD (#5CD3),A +x17BA PUSH BC ;сохранение количества перемещаемых секторов + LD HL,(#5CCF) ;берем адрес рабочей области + PUSH HL ;сохранение его + LD DE,(#5CD5) ;берем адрес части перемещаемого файла на старом месте + CALL x1E3D ;загрузка секторов + LD HL,(#5CF4) ;установка адреса следующей части файла + LD (#5CD5),HL + POP HL ;восстановление адреса рабочей области + POP BC ;и количества перемещаемых секторов + LD DE,(#5CD7) ;берем адрес части перемещаемого файла на новом месте + CALL x1E4D ;запись секторов + LD HL,(#5CF4) ;установка адреса следующей части файла + LD (#5CD7),HL + JR x17A5 ;повтор +x17DD LD (#5CD3),A ;установка количества оставшихся секторов + PUSH HL ;сохранение HL + LD HL,#5D23 ;берем длину рабочей области в секторах + LD B,(HL) + POP HL ;восстановление HL + XOR A ;обнуление аккумулятора + JR x17BA ;перемещение секторов + +;Адрес #17E9. Загрузка в буфер сектора с описателем файла и перенос описателя. В регистре C - номер файла, в A - направление перемещения (0 - в переменные, иначе - в прочитанный сектор). + +x17E9 PUSH AF ;сохранение направления перемещения + LD HL,#5CCC ;первый сектор каталога - 0 + LD (HL),0 + LD A,C ;определение номера сектора с описателем файла +x17F0 SUB #10 + JR C,x17F7 + INC (HL) + JR x17F0 +x17F7 ADD A,#10 ;берем номер описателя в секторе + LD C,A + PUSH BC ;сохраним его + CALL x03EC ;загрузка в буфер сектора с описателем + POP BC ;восстановление номера описателя в секторе + POP AF ;и направление перемещения + CALL x1CA4 ;определение адреса описателя файла в буфере + LD DE,#5CDD ;берем второй адрес для LDIR + LD BC,#10 ;берем длину описателя + OR A ;установка направления перемещения + JR Z,x180D + EX DE,HL +x180D LDIR ;перенос описателя файла + RET ;возврат + +;Адрес #1810. Выполнение команды VERIFY. Установите #5D11 и #5C3B. Используется также с адресов: +;#1815 - выполнение команды LOAD. Установите #5D11 и #5C3B; +;#1818 - выполнение команды LOAD, PEEK или POKE; Установите #5D11, #5C3B и #5D10. + +x1810 LD A,#FF ;верификация файла + LD (#5CF9),A +x1815 CALL x1852 ;обнуление #5D10 +x1818 CALL x1836 ;обработка параметров и загрузка файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,#FF ;выполняется команда LOAD + LD (#5D10),A + LD A,(#5CF9) ;выполняется VERIFY? + CP #FF + JP Z,x03E1 ;если да, то O.K. + LD A,(#5CE5) ;расширение файла B? + CP "B" + +;Внимание!!! Если была операция с одним сектором файла, то надо выходить независимо от расширения. + + JP Z,x012A ;если да, то обработка строки автостарта + JP x03E1 ;иначе O.K. + +;Адрес #1836. Обработка параметров для команды LOAD и загрузка файла. Установите #5D11, #5C3B, #5CF9 и #5D10. + +x1836 CALL x187A ;принятие параметров + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x18AB ;проверка параметров + JP x1921 ;загрузка файла и возврат + +;Адрес #1842. Обработка параметров для команды LOAD...CODE. Установите #5C5D на расширение файла. На выходе устанавливает #5CD6, #5CD9 и #5CDB. + +x1842 LD HL,(#5C5D) ;следующий символ строки ENTER? + INC HL + LD A,(HL) + CP #D + RET Z ;если да, то возврат + LD A,1 ;задан адрес загрузки + LD (#5CD6),A + CALL x1DEB ;прием одного или двух чисел +x1852 XOR A ;обнуление #5D10 + LD (#5D10),A + RET ;возврат + +x1857 CALL x102E ;прием расширения файла + LD A,"B" ;это "B"? + CP B + JR NZ,x1866 ;если да, то декремент CH_ADD, так как для + LD HL,(#5C5D) ;программы на бейсике расширение не + DEC HL ;указывается + LD (#5C5D),HL +x1866 CALL x1DEB ;прием чисел + LD HL,(#5CD9) ;установка адреса загрузки/записи сектора + LD (#5CD7),HL + LD HL,(#5CDB) ;установка номера сектора + LD (#5CD9),HL + XOR A ;обнуление #5CD6 + LD (#5CD6),A + RET ;возврат + +;Адрес #187A. Принятие параметров для команды LOAD. Вход: установите #5D11 и #5C3B. Выход: устанавливает #5CD2, #5CD7, #5CD9, #5CE5 и #5CD6 и читает описатель файла. + +x187A CALL x042B ;второй символ командной строки ENTER? + JP Z,x027B ;если да, то вход в командный процессор с вводом команды RUN "boot" + +;Ошибка!!! это некорректно, так как при ошибке вы попадете в командный процессор TR-DOS, а не вернетесь в бейсик. + + CALL x1DDF ;помещение имени файла на стек калькулятора + CALL x0572 ;операция со всем файлом? + CALL NZ,x1857 ;если нет, то прием расширения и двух чисел + CALL x1D8C ;берем текущий символ строки + CP #AF ;это CODE? + CALL Z,x1842 ;если да, то прием чисел, если они есть + CP #E4 ;это DATA? + PUSH AF ;сохранение результата проверки + CALL x0572 ;операция со всем файлом? + CALL Z,x102E ;если да, то прием расширения + POP AF ;восстановление результата проверки + CALL Z,x1BFC ;если символ DATA, то прием имени массива + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x292F ;установка имени файла и поиск файла + +;Адрес #18A4. Чтение описателя файла, если он был найден. Установите #5CDD, #5CE5 и флаг Z: при Z=1 происходит чтение описателя, иначе ошибка NO FILE. + +x18A4 JP NZ,x03D9 ;если файл не найден, то NO FILE + CALL x165D ;чтение описателя файла + RET ;возврат + +;Адрес #18AB. Обработка параметров для подпрограммы загрузки файла. На входе установите #5CD6, #5CD9 и #5CDB ; считайте описатель нужного вам файла. На выходе в #5CDB будет длина файла для загрузки, в #5CD6 0, если длина менялась, иначе 3. В HL будет адрес загрузки файла, в DE - его адрес на диске, в B - количество секторов для загрузки. При загрузке массива или программы на бейсике будет произведена подготовка памяти к загрузке. + +x18AB LD A,(#5CD6) ;берем флаг загрузки + OR A ;начало и длину брать из каталога? + LD HL,(#5CE6) ;берем начало файла из описателя + JR Z,x18B7 ;если параметры берем не из каталога, то + LD HL,(#5CD9) ;берем начальный адрес, назначенный нами +x18B7 LD DE,(#5CEB) ;берем адрес файла на диске + CP 3 ;все параметры назначены пользователем? + LD A,(#5CEA) ;берем размер файла в секторах + PUSH DE ;сохранение адреса файла на диске + LD DE,(#5CE8) ;берем длину файла из описателя + JR NZ,x18CB ;если нужно брать ее не оттуда, то берем + LD DE,(#5CDB) ;длину загрузки, назначенную нами +x18CB LD B,A ;сохранение размера файла в секторах + LD (#5CDB),DE ;установка длины файла для загрузки + LD A,(#5CE5) ;расширение файла C? + CP "C" + LD A,B ;восстановление длины файла в секторах + JR NZ,x18FD ;если расширение не C, то длину не менять + LD A,B ;если длина файла в байтах соответствует его + CP D ;размеру в секторах, то длина загрузки не меняется + JR Z,x18F6 + DEC A + CP D + LD A,B + JR Z,x18F6 + LD A,(#5CD6) ;длина назначена пользователем? + CP 3 + LD A,B ;восстановление размера файла в секторах + JR Z,x18F6 ;если мы сами назначили длину загрузки, то она не меняется + XOR A ;грузить только полностью заполненные сектора + LD (#5CD6),A + LD D,B ;вычисление длины файла в байтах из его длины + LD E,0 ;в секторах + LD (#5CDB),DE ;установка новой длины + JR x18F9 +x18F6 CALL x191B ;файл загружать весь +x18F9 LD A,B ;восстановление размера файла в секторах + CALL x1EAC ;вычисление количества секторов для загрузки +x18FD LD B,A ;сохранение его + LD A,(#5CE5) ;расширение файла C? + CP "C" + POP DE ;восстановление адреса файла на диске + RET Z ;если расширение файла C, то возврат + +;Ошибка!!! Если выполняется чтение или запись сектора файла, то здесь должен быть возврат. Из-за этой ошибки нельзя прочитать или записать сектор файла с расширением B или D. + + PUSH DE ;сохранение адреса файла на диске + CP "B" ;расширение B? + PUSH AF ;сохранение расширения файла + CALL Z,x1A01 ;если расширение B, то подготовка к загрузке программы на бейсике + POP AF ;восстановление расширения + CP "D" ;расширение D? + CALL Z,x1A4C ;если да, то подготовка к загрузке массива + CALL x191B ;длина загрузки не менялась + LD A,(#5CDC) ;берем количество секторов для загрузки + LD B,A + POP DE ;восстановление адреса файла на диске + RET ;возврат + +;Адрес #191B. Помещает число 3 по адресу #5CD6. + +x191B LD A,3 + LD (#5CD6),A + RET + +;Адрес #1921. Загрузка/верификация файла, а также загрузка/запись сектора файла. Вход: установите #5CF9, #5D10, #5CD7, #5CDB, в HL - адрес загрузки, в DE - адрес файла на диске, в B - количество секторов для загрузки. + +x1921 CALL x0572 ;выполняется загрузка или верификация? + JR Z,x192D ;если да, то выполнение операций со всем файлом + PUSH AF ;сохранение флага операции + CALL x1A94 ;вычисление адреса сектора на диске + POP AF ;восстановление флага операции + CP #FF ;чтение сектора файла? +x192D PUSH AF + CALL Z,x195C ;если да, то чтение сектора или операция с файлом + POP AF + JR Z,x1937 ;и завершение загрузки или верификации + JP x1E4D ;иначе запись сектора и возврат +x1937 LD A,(#5CD6) ;загружать весь файл? + CP 3 + +;Не нужно этого делать!!! Лучше так: +;LD A,(#5D10) +;OR A +;и PEEK будет работать правильно. Не будет грузится мусор после загруженного сектора. ведь если в #5CD6 находится 0, то младший байт длины всегда равен 0 и #1946 не будет работать. + + CALL Z,x1946 ;если да, то загрузка или верификация конца файла + LD HL,(#5C59) ;отметка конца программы на бейсике + DEC HL + LD (HL),#80 + RET ;возврат + +;Адрес #1946. Загрузка или верификация конца файла. Установите #5CF4, #5CDB и #5CF9. + +x1946 LD A,(#5CF9) ;верификация? + CP #FF + JP NZ,x2FDE ;если нет, то загрузка конца файла + LD A,(#5CDB) ;файл занимает сектора без остатка? + OR A + RET Z ;если да, то возврат + LD C,A ;берем длину остатка + LD B,1 ;1 сектор + LD DE,(#5CF4) ;текущее место диска + JR x196A ;верификация конца файла и возврат + +;Адрес #195C. Загрузка/верификация файла, а также загрузка сектора файла. Установите #5CF9 ,в DE поместите адрес файла на диске, в HL - адрес файла в памяти, в B - длину файла в секторах. Используется также с адреса #196A для верификации заданного количества байтов (все для #195C, кроме #5CF9 плюс в B ? количество байтов). + +x195C LD A,(#5CF9) ;верификация? + CP #FF + JP NZ,x1E3D ;если нет, то загрузка секторов и возврат + LD (#5CF4),DE ;запомним адрес файла на диске + LD C,0 ;в секторе #100 байтов +x196A LD A,B ;верифицируем 0 секторов? + OR A + RET Z ;если да, то возврат + LD (#5CD7),HL ;сохранение адреса файла в памяти + LD (#5CD9),DE ;сохранение адреса файла на диске +x1974 PUSH BC ;сохранение количества секторов + LD B,1 ;загружать 1 сектор + LD DE,(#5CD9) ;с текущего места диска + LD HL,#5D25 ;в буфер + CALL x1E3D ;загрузка сектора + LD HL,(#5CF4) ;адрес следующего сектора на диске + LD (#5CD9),HL + POP BC ;восстановление количества секторов + LD HL,(#5CD7) ;берем адрес файла в памяти + LD DE,#5D25 ;адрес сектора в буфере +x198E LD A,(DE) ;сравнение их + CP (HL) + JR NZ,x199D ;если несовпадение, то VERIFY ERROR + INC HL ;следующие байты + INC DE + DEC C + JR NZ,x198E ;повтор до конца + LD (#5CD7),HL ;установка следующего адреса + DJNZ x1974 ;повтор до конца + RET ;возврат +x199D LD HL,x276B ;адрес сообщения VERIFY ERROR + LD A,#D ;код ошибки - #D + JP x1C4A ;обработка ошибок + +;Адрес #19A5. Выполнение команды PEEK. Установите #5D11 и #5C3B. + +x19A5 LD A,#FF ;код функции PEEK + JR x19AB ;выполнение команды + +;Адрес #19A9. Выполнение команды POKE. Установите #5D11 и #5C3B. Используется также с адреса #19AB (выполнение команды LOAD, PEEK или POKE; Установите #5D11 и #5C3B, а в аккумулятор поместите код функции). + +x19A9 LD A,#EE ;код функции POKE +x19AB LD (#5D10),A ;установка кода функции + JP x1818 ;выполнение команды + +;Адрес #19B1. Выполнение команды MERGE. Установите #5D11 и #5C3B. + +x19B1 LD A,#FF ;использовалась рабочая область + LD (#5D1F),A + +;Ошибка!!! Флаг состояния рабочей области находится по адресу #5D15. + + CALL x187A ;обработка параметров + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CE5) ;расширение файла B? + CP "B" + JP NZ,x1D1A ;если нет, то ошибка + LD BC,(#5CE6) ;установка длины файла для загрузки + LD (#5CDB),BC + PUSH BC ;сохранение ее + INC BC ;оставим место для байта #80 + RST #20 ;выделение места в рабочей области + DW #0030 + LD (HL),#80 ;маркер конца программы + EX DE,HL ;переброска адреса загрузки в HL + POP DE ;снятие со стека длины файла + PUSH HL ;сохранение адреса загрузки + LD DE,(#5CEB) ;берем адрес файла на диске + CALL x191B ;загружать весь файл + LD A,(#5CDC) ;берем длину файла в блоках + LD B,A + CALL x1852 ;операция со всем файлом + CALL x1921 ;загрузка файла + POP HL ;восстанавливаем адрес загрузки + LD DE,(#5C53) ;берем адрес программы на бейсике + RST #20 ;объединение программ + DW #08D2 + JP x03E1 ;сообщение O.K. + +;Адрес #19F2. Проверка места в памяти для резервирования нового пространства вместо старого. В HL - старая длина, в DE - новая. Используется также с адреса: +;#19FD (проверка наличия пространства в памяти; длина пространства должна быть в DE). + +x19F2 EX DE,HL + SCF ;вычисление разности длин + SBC HL,DE + RET C ;если новая длина меньше старой, то возврат + LD DE,#A ;должно остаться еще #A байтов + ADD HL,DE + LD B,H ;переброска разности длин в BC + LD C,L +x19FD RST #20 ;проверка наличия пространства в памяти + DW #1F05 + RET ;возврат + +;Адрес #1A01. Подготовка к загрузке программы на бейсике. + +x1A01 LD DE,(#5C53) ;берем адрес начала программы на бейсике + LD HL,(#5C59) ;берем адрес конца программы на бейсике + DEC HL + PUSH HL ;сохранение начала и конца программы + PUSH DE + SBC HL,DE ;вычисление длины программы на бейсике + LD DE,(#5CE6) ;берем длину программы с переменными + PUSH DE ;сохраняем ее + PUSH HL ;сохранение длины старой программы + LD HL,0 ;идет верификация? + LD A,(#5CF9) + CP #FF + JR Z,x1A20 ;если да, то длину не меняем + LD HL,5 ;иначе увеличим ее на 5 байтов +x1A20 ADD HL,DE + LD (#5CDB),HL ;установка длины загрузки + POP HL ;восстановление длины старой программы + LD A,(#5CF9) ;верификация? + CP #FF + JR NZ,x1A31 ;если нет, то подготовка памяти + POP DE ;снятие регистров со стека + POP DE + POP HL + JR x1A48 ;возврат +x1A31 CALL x19F2 ;проверка наличия места для программы + POP BC ;восстановление длины программы с переменными + POP DE ;восстановление начала программы + POP HL ;восстановление конца программы + PUSH BC ;сохранение длины программы + RST #20 ;стирание старой программы + DW #19E5 + POP BC ;восстановление длины программы + CALL x1E32 ;резервирование места для новой программы + INC HL ;установка переменной VARS + LD BC,(#5CE8) + ADD HL,BC + LD (#5C4B),HL +x1A48 LD HL,(#5C53) ;берем адрес загрузки программы + RET ;возврат + +;Адрес #1A4C. Подготовка памяти к загрузке массива. Установите #5CE8, #5CD7, #5CD9 и #5CF9. + +x1A4C LD DE,(#5CE8) ;загружать весь файл + LD (#5CDB),DE + LD HL,(#5CD7) ;берем адрес массива в памяти + LD A,(#5CF9) ;верификация? + CP #FF + RET Z ;если да, то возврат + LD HL,(#5CD9) ;берем адрес загрузки файла + PUSH HL ;сохраняем его +x1A61 CALL x19F2 ;проверка наличия места для массива + POP HL ;восстановление адреса загрузки файла + LD A,H ;он равен 0? + OR L + JR Z,x1A79 ;если да, то старый массив не убираем + LD HL,(#5CD7) ;берем начало старого массива + DEC HL + DEC HL + DEC HL + LD BC,(#5CD9) ;берем его длину + INC BC + INC BC + INC BC + CALL x1E2E ;стирание старого массива +x1A79 LD HL,(#5C59) ;берем начало области переменных + DEC HL + LD BC,(#5CE8) ;берем длину файла + PUSH BC ;сохраняем ее + INC BC + INC BC + INC BC + CALL x1E32 ;резервирование места для нового массива + INC HL ;установка имени массива + LD A,(#5CD2) + LD (HL),A + INC HL ;восстановление и установка длины массива + POP DE + LD (HL),E + INC HL + LD (HL),D + INC HL ;берем адрес тела массива + RET ;возврат + +;Адрес #1A94. Вычисление адреса сектора файла на диске по его номеру в файле. Вход: установите #5CD7 и #5CD9 и поместите в регистр B длину файла в секторах, а в DE - адрес файла на диске. Выход: в DE будет адрес сектора на диске, а в B помещается 1. + +x1A94 LD A,(#5CD9) ;берем номер сектора в файле + LD C,B + LD B,A + LD A,C + CP B ;он меньше, чем количество секторов в файле? + JR C,x1AB6 ;если нет, то ошибка + +;Внимание, ошибка!!! Вы не сможете загрузить последний сектор файла, т.к. его номер равен количеству секторов в файле. + + LD A,B ;он равен 0? + OR A + JP Z,x1D1A ;если да, то синтаксическая ошибка + DEC B ;он был равен 1? + JR Z,x1AB0 ;если да, то его адресом будет адрес файла + LD A,#10 ;на дорожке 16 секторов +x1AA7 INC E ;вычисление адреса сектора на диске + CP E + JR NZ,x1AAE + LD E,0 + INC D +x1AAE DJNZ x1AA7 +x1AB0 LD B,1 ;загружать надо 1 сектор + LD HL,(#5CD7) ;берем адрес загрузки сектора + RET ;возврат +x1AB6 LD HL,x29ED ;адрес сообщения REC.O/F + LD A,5 ;код ошибки - 5 + JP x1C4A ;обработка ошибки + +;Адрес #1ABE. Проверка наличия файла и свободного места в каталоге. Имя файла поместите на стек калькулятора. Используется также с адреса #1AC4 (проверка наличия свободного места в каталоге диска). + +x1ABE CALL x292F ;установка имени и поиск файла + JP Z,x1C50 ;если нашли, то FILE EXISTS +x1AC4 CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + LD A,(#5E09) ;на диске 128 файлов? + CP #80 + JP Z,x2723 ;если да, то сообщение DIRECTORY FULL + RET ;иначе возврат + +;Адрес #1AD0. Выполнение команды SAVE. Установите #5C3B и #5D11. Используется также с адресов: +;#1B27 - запись программы на бейсике. Установите #5CDD и #5CE5. +;#1B53 - запись файла. Установите #5CDD, #5CE5, #5CD7, #5CD9 и #5CDB. + +x1AD0 CALL x1852 ;обнуление #5D10 + LD HL,0 ;автостарт бейсика не производить + LD (#5CD1),HL + CALL x1DDF ;помещение имени файла на стек калькулятора + CALL x1D8C ;берем текущий символ + CP #AF ;это CODE? + JR Z,x1B39 ;если да, то прием начала и длины + CP #CA ;это LINE? + JR NZ,x1AF8 ;если нет, то проверка остальных расширений + CALL x1E0B ;прием строки автостарта бейсика + CALL x1D75 ;если проверка на синтаксис, то возврат + LD HL,(#5CDB) ;установка строки автостарта бейсика + LD (#5CD1),HL + LD HL,#5CE5 + JR x1B1F ;переход на запись бейсика +x1AF8 CP #AA ;текущий символ SCREEN$? + JR NZ,x1B0D ;если нет, то проверка расширения DATA + LD HL,#4000 ;начало файла - #4000 + LD (#5CD7),HL + LD HL,#1B00 ;его длина - #1B00 байтов + LD (#5CD9),HL + LD (#5CDB),HL + JR x1B48 ;запись файла с расширением C +x1B0D CALL x1D75 ;если проверка на синтаксис, то возврат + CALL x1D8C ;берем текущий символ + LD HL,#5CE5 + CP #E4 ;это DATA? + JR Z,x1B2C ;если да, то запись массива + CP #D ;это ENTER? + JP NZ,x1D1A ;если нет, то ошибка +x1B1F LD (HL),"B" ;расширение B + CALL x1ABE ;проверка наличия такого файла и свободного места в каталоге + CALL x1E1C ;удаление из командной строки пятибайтных чисел +x1B27 CALL x1BDE ;установка начала и длины файла + JR x1B53 ;запись файла +x1B2C LD (HL),"D" ;расширение D + CALL x1ABE ;проверка наличия файла и места в каталоге + CALL x1C0F ;установка начала и длины файла + JR NC,x1B53 ;если все в порядке, то запись файла + JP C,x1D1A ;иначе ошибка +x1B39 CALL x1DE5 ;принятие начала и длины файла + LD HL,(#5CD9) ;установка начала файла + LD (#5CD7),HL + LD HL,(#5CDB) ;установка длины файла + LD (#5CD9),HL +x1B48 CALL x1D75 ;если проверка на синтаксис, то возврат + LD A,"C" ;расширение C + LD (#5CE5),A + CALL x1ABE ;проверка наличия файла и места в каталоге +x1B53 CALL x1B59 ;запись файла + JP x0569 ;запись информации о нем + +;Адрес #1B59. Запись файла. Установите #5CD1, #5CD7, #5CD9 и #5CDB, а в буфер загрузите сектор 8 дорожки 0. + +x1B59 LD HL,(#5CD7) ;установка начала файла + LD (#5CE6),HL + EX DE,HL ;переброска его в DE + LD HL,(#5CD9) ;берем длину файла + LD A,L ;она равна 0? + OR H + JP Z,x1D1A ;если да, то ошибка + LD A,L ;вычисление длины файла в секторах + OR A + JR Z,x1B6D + INC H +x1B6D LD A,H ;установка длины файла в секторах + LD (#5CEA),A + LD E,A ;вычисление нового количества свободных секторов + LD D,0 + LD HL,(#5E0A) + SBC HL,DE + JP C,x1C45 ;если на диске нет места, то ошибка +x1B7B PUSH HL ;сохранение нового количества свободных секторов + LD HL,(#5C59) ;добавление к программе на бейсике байта #AA + LD (HL),#AA + INC HL + LD DE,(#5CD1) ;и номера строки автостарта + LD (HL),E + INC HL + LD (HL),D + LD HL,(#5CDB) ;установка длины файла + LD (#5CE8),HL + LD HL,(#5E06) ;установка адреса файла на диске + LD (#5CEB),HL + EX DE,HL ;переброска его в DE + LD HL,(#5CE6) ;берем начало файла + LD A,(#5CEA) ;берем его длину в секторах + LD B,A + CALL x1E4D ;запись файла + LD HL,(#5CF4) ;берем адрес свободного пространства диска + PUSH HL ;сохраняем его + CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 + POP HL ;восстановление адреса свободного места на диске + LD (#5E06),HL ;установка его + POP HL ;восстановление количества свободных секторов + LD (#5E0A),HL ;установка его + LD HL,#5E09 ;берем номер файла + LD A,(HL) + LD (#5D1E),A ;установка его + INC (HL) ;записали еще 1 файл + PUSH HL ;сохранение адреса с кол-вом файлов на диске + CALL x1E43 ;перезапись сектора 8 дорожки 0 + POP HL ;восстановление адреса с кол-вом файлов + LD C,(HL) ;берем номер записанного файла + DEC C + LD A,(#5CE5) ;расширение файла B? + CP "B" + CALL Z,x1BC8 ;если да, то установка длины программы без переменных + RET ;возврат + +;Адрес #1BC8. Установка длины программы на бейсике без переменных. Длину с переменными программа помещает в #5CE6, длину без переменных - в #5CE8. + +x1BC8 LD HL,(#5C59) ;вычисление длины программы с переменными + LD DE,(#5C53) + SCF + SBC HL,DE + LD (#5CE6),HL ;установка ее + LD HL,(#5C4B) ;вычисление длины только программы + SBC HL,DE + LD (#5CE8),HL ;установка ее + RET ;возврат + +;Адрес #1BDE. Установка начала и длины файла для записи программы на бейсике. + +x1BDE LD HL,(#5C4B) ;вычисление длины программы с переменными + LD DE,(#5C53) + SBC HL,DE + LD (#5CDB),HL ;установка длины файла для каталога + LD HL,(#5C53) ;установка начала файла + LD (#5CD7),HL + LD HL,(#5C59) ;вычисление длины файла с параметрами автозапуска + INC HL + INC HL + INC HL + SBC HL,DE + LD (#5CD9),HL ;установка действительной длины файла + RET ;возврат + +;Адрес #1BFC. Прием имени массива для команды LOAD...DATA. Вход: установите #5C5D на расширение файла и установите #5CF9. Выход: устанавливает #5CD2, #5CD7, #5CD9 и #5CDB. Используется также с адреса #1C0F (то же, что и #1C1B, но с обработкой ошибок). + +x1BFC CALL x1C1B ;поиск массива + RET NC ;если массив найден, то возврат + LD HL,0 ;старого массива нет + LD (#5CD9),HL + LD A,(#5CF9) ;идет загрузка? + CP #FF + RET NZ ;если да, то возврат + JP x1C13 ;ошибка +x1C0F CALL x1C1B ;поиск массива + RET NC ;если массив найден, то возврат +x1C13 LD A,#E ;код ошибки - #E + LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND + JP x1C4A ;обработка ошибок + +;Адрес #1C1B. Поиск массива без обработки ошибок. Будут установлены #5CD2, #5CD7, #5CD9 и #5CDB. При ошибке флаг C будет установлен, иначе сброшен. + +x1C1B CALL x1E2A ;берем следующий символ + CALL x1D9B ;поиск массива + SET 7,C ;установка бита 7 в его имени + LD A,C ;установка его имени + LD (#5CD2),A + JR NC,x1C2B ;если массив найден, то установка его параметров +x1C29 SCF ;была ошибка + RET ;возврат +x1C2B JR NZ,x1C29 ;если флаг Z сброшен, то ошибка + INC HL ;берем длину массива + LD E,(HL) ;установка длины массива + INC HL + LD D,(HL) + INC HL + LD (#5CD7),HL ;установка адреса тела массива + LD (#5CDB),DE ;установка длины массива + LD (#5CD9),DE + CALL x1E2A ;следующий символ + CP ")" ;это ")"? + JR NZ,x1C2B ;если нет, то ошибка + RET ;возврат + +;Адрес #1C45. Обработка ошибки NO SPACE. Используется также с адреса #1C4A (обработка ошибок; в A - код ошибки, в HL - адрес сообщения). + +x1C45 LD HL,x29BB ;адрес сообщения NO SPACE + LD A,3 ;код ошибки - 3 +x1C4A CALL x03C3 ;если надо, то печать сообщения + JP x01D3 ;завершение + +;Адрес #1C50. Обработка ошибки FILE EXISTS. + +x1C50 LD HL,x29C5 ;адрес сообщения FILE EXISTS + LD A,2 ;код ошибки - 2 + JR x1C4A ;обработка ошибок + +;Адрес #1C57. Установка имени файла. Установите #5C5D на имя файла. Будет выбран дисковод и установлена переменная #5CDD. + +x1C57 LD HL,#5CDD ;адрес переменной с именем файла + LD B,8 ;ее длина - 8 байтов +x1C5C LD (HL)," " ;очистка ее + INC HL + DJNZ x1C5C + CALL x0531 ;снятие строки со стека калькулятора + EX DE,HL + CALL x1C81 ;установка дисковода + LD A,C ;имя файла - пустая строка? + OR A + +;Ошибка в программе!!! Здесь должно быть OR B. + + JP Z,x1D1A ;если да, то ошибка + CP 9 ;в имени файла больше 8 символов + JR C,x1C73 ;если да, то обрезаем его + LD C,8 + +;Внимание!!! Это будет работать неправильно при длине имени файла больше #FF символов. + +x1C73 LD A,(HL) ;берем первый символ имени файла + CP " " ;его код меньше #20? + JP C,x1D1A ;если да, то ошибка + LD DE,#5CDD ;адрес переменной с именем файла + PUSH BC ;сохранение длины имени + LDIR ;установка имени + POP BC ;восстановление длины имени + RET ;возврат + +;Адрес #1C81. Установка дисковода для операции с файлом. В HL поместите начало имени файла в ASCII представлении, а в BC ? его длину. HL установится на начало имени без дисковода, а в BC будет его длина. + +x1C81 INC HL ;берем адрес следующего символа имени + LD A,(HL) ;берем этот символ + CP ":" ;это двоеточие? + JR NZ,x1C98 ;если нет, то активизация дисковода по умолчанию + DEC HL ;берем адрес имени дисковода + LD A,(HL) ;берем имя дисковода + CALL x0524 ;преобразование имени дисковода в его номер + PUSH BC ;сохранение длины имени файла + PUSH HL ;и адреса имени дисковода + CALL x3DCB ;выбор дисковода + POP HL ;восстановление адреса имени дисковода + POP BC ;и длины имени файла + DEC BC ;отсекли 2 символа + DEC BC + INC HL ;берем адрес имени файла без дисковода + INC HL + RET ;возврат +x1C98 DEC HL ;берем адрес имени файла + LD A,(#5D19) ;берем дисковод по умолчанию + PUSH BC ;сохранение длины и адреса имени файла + PUSH HL + CALL x3DCB ;выбор дисковода + POP HL ;восстановление длины и адреса имени файла + POP BC + RET ;возврат + +;Адрес #1CA4. Определение адреса описателя файла в буфере по его номеру в секторе. В C должен быть номер описателя в секторе. На выходе в HL будет его адрес. + +x1CA4 LD L,C ;перевод номера описателя файла в двухбайтную + LD H,0 ;форму + ADD HL,HL ;умножение его на #10 + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD BC,#5D25 ;адресуемся от начала буфера + ADD HL,BC + RET ;возврат + +;Адрес #1CB0. Установка и проверка имени файла. Имя файла должно быть помещено на стек калькулятора. Выход: если файл с таким именем есть, то будет установлен флаг Z, а в рег. C и в #5D1E будет его номер, а если такого файла нет, то флаг Z сбросится. Используется также с адреса: +;#1CB3 (поиск файла, установите #5CDD и #5CE5, выход как и из #1CB0). + +x1CB0 CALL x1C57 ;установка имени файла +x1CB3 CALL x03E8 ;начнем с сектора 0 + LD B,#80 ;всего 128 файлов + LD C,0 ;начнем с нулевого описателя в секторе +x1CBA PUSH BC ;сохраним номер файла и счетчик + CALL x1CA4 ;определим начало описателя в буфере + CALL x050C ;проверка и обработка достижения конца буфера + POP BC ;восстановление номера описателя в секторе и + PUSH BC ;счетчика файлов без изменения стека + LD A,C ;просмотрен весь сектор? + CP #10 + JR NZ,x1CCD ;если да, то + POP BC ;снятие номера описателя и счетчика со стека + LD C,0 ;нулевой описатель в секторе + JR x1CBA ;повтор проверки +x1CCD LD DE,#5CDD ;берем адрес части описателя для проверки + LD A,(#5D06) ;берем длину этой части + LD B,A + XOR A ;конец каталога? + CP (HL) + JR NZ,x1CDB ;если нет, то переход на проверку описателя + POP BC ;снятие номера описателя и счетчика со стека + JR x1CE4 ;выход с флагом NZ +x1CDB CALL x2713 ;сравнение частей описателей + POP BC ;восстановление номера описателя и счетчика + JR Z,x1CE7 ;если части описателей совпали, то на выход + INC C ;следующий описатель + DJNZ x1CBA ;повтор до конца +x1CE4 OR #FF ;выключение флага Z + RET ;возврат +x1CE7 LD A,#80 ;определение номера файла + SUB B + LD C,A + LD (#5D1E),A ;помещение его в #5D1E + XOR A ;сброс флага Z + RET Z ;возврат + +;Адрес #1CF0. Поиск файла. Часть описателя, подлежащую проверке, установите по адресу #5CDD и установите #5D06. Если файл не найден, то будет сброшен флаг Z и в #5D0F будет #FF, а если найден, то включится флаг Z, а номер файла будет в рег. C и по адресам #5D0F и #5D1E. + +x1CF0 CALL x1CB3 ;поиск файла + LD HL,#5D0F + LD (HL),C ;загрузка регистра C в #5D0F + RET Z ;если файл найден, то возврат + LD (HL),#FF ;помещаем в #5D0F #FF + RET ;возврат + +;Адpес #1CFB. Выполнение команды RETURN. Установите #5C3B, #5D1C и #5D13. + +x1CFB CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x20E5 ;изменение памяти + RES 3,(IY+1) ;установка режима ввода "K" + CALL x0232 ;восстановление старого ERR_SP + LD SP,(#5D1C) ;восстановление стека + LD HL,(#5C3D) ;берем адрес перед адресом из ERR_SP + DEC HL + LD A,#12 ;там находится #12? + CP (HL) + JR NZ,x1D19 ;если нет, то возврат + DEC HL ;установка ERR_SP на адрес ниже + LD (#5C3D),HL +x1D19 RET ;возврат + +;Адрес #1D1A. Обработка синтаксической ошибки. Установите #5C3A, #5D0E, #5D15, и все для подпрограммы #1D3. Используется также с адреса: +;#1D29 (обработка ошибок; в A - код ошибки, в HL ? адрес сообщения). + +x1D1A BIT 7,(IY+0) ;код ошибки бейсика уже назначен? + JR Z,x1D25 ;если нет, то установка ошибки + LD A,#B ;NONSENCE IN BASIC + LD (#5C3A),A +x1D25 INC A ;получение кода ошибки DOS + LD HL,x29B2 ;адрес сообщения ERROR +x1D29 CALL x03C3 ;печать сообщения, если можно + JP x01D3 ;завершение + +;Адрес #1D2F. Обработка ошибки, поступившей из пзу бейсика без очистки стека. Установите #5C3A. + +x1D2F LD A,(#5C3A) ;берем код ошибки бейсика + LD HL,x27CA ;адрес сообщения *BREAK* + CP #14 ;BREAK INTO PROGRAM? + JR Z,x1D29 ;если да, то печать сообщения + CP #C ;BREAK - CONT REPEATS? + JR Z,x1D29 ;если да, то печать сообщения + LD HL,x27D2 ;адрес сообщения OUT OF RAM + CP 3 ;OUT OF MEMORY? + JR Z,x1D29 ;если да, то печать сообщения + LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND + CP 1 ;VARIABLE NOT FOUND? + JR Z,x1D29 ;если да, то печать сообщения + JR x1D1A ;иначе сообщение *ERROR* + +;Адрес #1D4D. Выполнение команды RUN. Установите #5D11 и #5C3B. + +x1D4D CALL x1852 ;выполнять загрузку файла + CALL x1836 ;обработка параметров и загрузка файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD HL,(#5CE6) ;берем адрес загрузки файла по умолчанию + +;Ошибка!!! Ведь файл могли загрузить и по другому адресу. В подпрограмме #18AB надо сохранять в #5D20 действительный адрес загрузки файла, а здесь восстанавливать его. + + LD A,(#5CE5) ;расширение файла B? + CP "B" + JP Z,x012A ;если да, то запуск программы на бейсике + PUSH HL ;запуск программы в кодах + RET + +;Боже!!! Ну кто так делает!!! Во-первых, адрес программы при запуске должен быть в BC; во-вторых, надо совсем выйти из TR-DOS, иначе программа спятит при вызове #3D13; в третьих, куда программа будет возвращаться?; в четвертых... В общем, надо так (после CALL #1D75): +; LD A,(#5CE5) +; CP "D" +; JP Z,#1D1A +; CP "B" +; JP Z,#12A +; LD HL,START +; LD (#5D1A),HL +; JP #1D3 +; +;START CALL #232 +; LD BC,(#5D20) +; PUSH BC +; RET + +;Адрес #1D63. Очистка рабочей области памяти. + +x1D63 LD HL,#5D0E ;рабочую область очищать? + LD A,(HL) + CP #FF + LD (HL),0 ;рабочая область очищена + RET NZ ;если рабочая область очищена, то возврат + RST #20 ;очистка рабочей области + DW #16BF + RET ;возврат + +;Адрес #1D70. Проверка, идет ли проверка строки на синтаксис или выполнение команды. Если идет выполнение, то флаг Z будет сброшен, иначе установлен. + +x1D70 BIT 7,(IY+1) + RET + +;Адрес #1D75. Если идет проверка на синтаксис, то возврат из программы, вызвавшей эту подпрограмму. Установите #5C3B. + +x1D75 CALL x1D70 ;проверка, что делается + RET NZ ;если идет выполнение, то возврат + POP HL ;снятие адреса возврата в вашу программу + RET ;возврат по следующему адресу + +;Адрес #1D7B. Помещение числа на стек калькулятора. Установите #5C5D на символ перед числом. Если строка проверяется на синтаксис, то будет установлен флаг Z, а при выполнении он сброшен. + +x1D7B CALL x1E2A ;берем следующий символ строки + CALL x1DC1 ;помещение числа на стек калькулятора + JR x1D70 ;проверка, идет выполнение или проверка и возврат + +;Адрес #1D83. Открытие потока 0. Используется также с адреса #1D84 (открытие потока; номер в регистре A). + +x1D83 XOR A ;номер потока - 0 +x1D84 RST #20 ;открытие потока + DW #1601 + RET ;возврат + +;Адрес #1D88. Открытие потока 2. + +x1D88 LD A,2 ;номер потока - 2 + JR x1D84 ;открытие потока + +;Адрес #1D8C. Выборка текущего символа строки. Поместите его адрес в #5C5D. + +x1D8C RST #20 + DW #0018 + RET + +;Адрес #1D90. Ввод команды. + +x1D90 CALL x1D83 ;открытие потока 0 + RST #20 ;редактирование командной строки + DW #0F2C + RET ;возврат + +;Адрес #1D97. Очистка экрана и открытие потока 0. + +x1D97 RST #20 + DW #0D6B + RET + +;Адрес #1D9B. Поиск массива. Установите #5C5D на имя массива. Если массив найден, то в HL будет его адрес. + +x1D9B RST #20 + DW #28B2 + RET + +;Адpес #1D9F. Очистка низа экрана. + +x1D9F RST #20 + DW #0D6E + RET + +;Адрес #1DA3. Печать числа из регистра A. Используется также с адресов: +;#1DA4 (печать числа из регистра C), +;#1DA9 (печать числа из регистра BC). + +x1DA3 LD C,A ;переброска числа в C +x1DA4 LD B,0 ;перевод числа в двухбайтную форму + JP x1DA9 ;странная команда! +x1DA9 PUSH BC ;сохранение числа + CALL x20F1 ;изменение памяти + POP BC ;восстановление числа + RST #20 ;печать числа + DW #1A1B + CALL x20F1 ;восстановление памяти + RET ;возврат + +;Адрес #1DB5. Снятие строки со стека калькулятора. В DE будет адрес строки, в BC - ее длина. + +x1DB5 RST #20 + DW #2BF1 + RET + +x1DB9 RST #20 + DW #1E99 + RET + +;Адрес #1DBD. Помещение строки на стек калькулятора. Установите #5C5D на начало строки. + +x1DBD RST #20 + DW #1C8C + RET + +;Адрес #1DC1. Помещение числа из BC на стек калькулятора. + +x1DC1 RST #20 + DW #1C82 + RET + +;Адрес #1DC5. Установка CH_ADD на второй символ строки. Установите #5D11. + +x1DC5 LD HL,(#5D11) ;берем адрес строки команды + INC HL ;берем адрес ее второго символа + LD (#5C5D),HL ;помещаем его в CH_ADD + RET ;возврат + +;Адрес #1DCD. Принятие 2-х строк на стек калькулятора. Поместите в #5D11 адрес первой строки. + +x1DCD CALL x1DDF ;прием первой строки на стек калькулятора +x1DD0 CALL x1D8C ;берем текущий символ + CP "," ;это запятая? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1E2A ;следующий символ + CALL x1DBD ;прием второй строки на стек калькулятора + RET ;возврат + +;Адрес #1DDF. Установка CH_ADD и помещение строки на стек калькулятора. Установите #5D11. + +x1DDF CALL x1DC5 ;установка CH_ADD + JP x1DBD ;помещение строки на стек калькулятора + +;Адрес #1DE5. Принятие одного или двух чисел после символа CODE. Первое число будет в #5CD9, второе - в #5CDB. Если было одно число, то оно будет в обеих ячейках. Если принято 2 числа, то в #5CD6 будет 3. На входе установите #5C5D и #5C3B. Используется также с адреса: +;#1E0B (принятие числа; установите #5C5D и #5C3B; число будет в #5CDB, а в #5CD6 будет 3). + +x1DE5 CALL x1D8C ;берем текущий символ строки + CP #AF ;это CODE? + RET NZ ;если нет, то возврат +x1DEB CALL x1D7B ;принятие числа на стек калькулятора + JR Z,x1DFB ;если идет проверка на синтаксис, то дальнейшая проверка + CALL x1DB9 ;снятие числа со стека калькулятора + LD (#5CD9),BC ;установка первого числа + LD (#5CDB),BC +x1DFB CALL x1D8C ;берем текущий символ + CP "," ;это запятая? + JR Z,x1E0B ;если да, то принятие второго числа + CP #D ;это ENTER? + JP NZ,x1D1A ;если нет, то ошибка + CALL x1D75 ;если строка проверяется на синтаксис, то возврат + RET ;возврат +x1E0B CALL x1D7B ;прием второго числа на стек калькулятора + RET Z ;если проверка на синтаксис, то возврат + CALL x1DB9 ;снятие числа со стека калькулятора + LD (#5CDB),BC ;помещение его в #5CDB + LD A,3 ;приняли 2 числа + LD (#5CD6),A + RET ;возврат + +;Адрес #1E1C. Удаление из командной стpоки пятибайтных чисел + +x1E1C LD HL,(#5D11) ;берем адрес строки команды + RST #20 ;удаление из нее пятибайтных чисел + DW #11A7 + RET ;возврат + +;Адрес #1E23. Выделение пространства в рабочей области. В BC поместите длину требуемого пространства. + +x1E23 LD HL,(#5C61) ;загрузка HL из #5C61 + RST #20 ;выделение пространства + DW #0030 + RET ;возврат + +;Адрес #1E2A. Выборка следующего символа строки. Установите #5C5D. + +x1E2A RST #20 + DW #0020 + RET + +;Адрес #1E2E. Удаление области памяти. В HL поместите начало области, в BC - длину. + +x1E2E RST #20 + DW #19E8 + RET + +x1E32 RST #20 + DW #1655 + RET + +;Адрес #1E36. Загрузка регистра дорожки. Установите #5CD1. При выходе по ошибке в #5D17 помещается #FF. Можно использовать с адреса: +;#1E3A для прямого вывода в порт #3F. + +x1E36 CALL x0A31 ;new определение номера дорожки, на которой стоит головка + LD A,H ;установка регистра дорожки +x1E3A OUT (#3F),A + RET ;возврат + +;Адрес #1E3D. Загрузка секторов. Вход: в HL - адрес загрузки, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. + +x1E3D XOR A ;признак загрузки + JR x1E64 ;переход к подпрограмме загрузки/записи секторов + +;Адрес #1E40. Запись информации о файле. На входе в C должен быть номер файла. Используется также с адресов: +;#1E43 - запись сектора из буфера. Вход: в #5CF4 установите номер сектора+1, а в #5CF5 - номер дорожки. +;#1E4D - запись секторов. В HL - адрес, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. +;#1E64 - загрузка/запись секторов. Предварительные установки как и для предыдущей подпрограммы плюс в A установите 0 для загрузки или что-нибудь другое для записи. + +x1E40 CALL x166B ;чтение сектора с описателем файла и замена описателя +x1E43 LD DE,(#5CF4) ;берем номер сектора для записи + DEC DE + LD B,1 ;записывать 1 сектор + LD HL,#5D25 ;записывать будем из буфера +x1E4D PUSH HL ;сохраним адрес секторов на диске и в памяти + PUSH DE + CALL x3E11 ;берем тип дисковода + BIT 7,(HL) ;он 40-дорожечный? + JR Z,x1E60 ;если да, то записывать можно + BIT 0,(HL) ;используем 40 дорожек на 80-дорожечном? + JR NZ,x1E60 ;если нет, то записывать можно + LD HL,x29D8 ;адрес сообщения READ ONLY + JP x1D29 ;переход на обработку ошибок + +;Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки. + +x1E60 POP DE ;восстановление адресов секторов + POP HL +x1E62 LD A,#FF ;признак записи +x1E64 LD (#5CCE),A ;установка признака операции +x1E67 LD (#5CF4),DE ;установка адреса секторов на диске + PUSH BC ;сохранение количества секторов + PUSH HL ;и адреса загрузки / записи + CALL x1E36 ;чтение индексной области дорожки + POP HL ;восстановление адреса загрузки / записи + POP BC ;и количества секторов + XOR A ;количество секторов равно 0? + OR B + RET Z ;если да, то возврат +x1E75 PUSH BC ;сохраняем адрес и кол-во секторов + PUSH HL + CALL x3F06 ;установка адреса загрузки / записи секторов + LD A,(#5CF4) ;установка номера сектора + CALL x3F02 + LD A,(#5CF5) ;позиционирование головки на дорожку + CALL x3E63 + LD A,(#5CCE) ;берем флаг операции + OR A ;загрузка? + PUSH AF + CALL Z,x3F0E ;если да, то загрузка сектора + POP AF + CALL NZ,x3F0A ;иначе запись сектора + POP HL ;берем адрес следующего сектора + LD DE,#100 + ADD HL,DE + PUSH HL ;сохраняем его + LD A,#10 ;на дорожке 16 секторов + LD HL,#5CF4 + INC (HL) ;следующий сектор + CP (HL) ;конец дорожки? + JR NZ,x1EA7 ;если да, то номер следующего сектора 0 + LD (HL),0 + LD HL,#5CF5 ;и берем следующую дорожку + INC (HL) +x1EA7 POP HL ;восстановление адреса следующего сектора + POP BC ;и количества секторов + DJNZ x1E75 ;если не все, то повтор + RET ;возврат + +;Адрес #1EAC. Вычисление количества полных секторов файла из его длины в байтах. В A должно быть количество секторов файла, а в DE - длина загружаемой части файла. + +x1EAC PUSH HL ;сохранение HL + LD H,A ;берем полную длину файла + LD L,0 + PUSH HL ;сохраняем ее + SBC HL,DE ;она меньше длины загрузки? + CALL C,x1EBC ;если да, то загружать весь файл + POP HL ;восстановление полной длины файла + LD A,H ;вычисление количества полных секторов из полной длины файла + POP HL ;восстановление HL + RET C ;если полная длина файла больше длины загрузки, + LD A,D ;то количество полных секторов берем из длины загрузки + RET ;возврат + +;Адрес #1EBC. Обнуление #5CD6 и установка флага C. + +x1EBC XOR A + LD (#5CD6),A + SCF + RET + +;Адрес #1EC2. Выполнение команды FORMAT. Установите #5D11 и #5C3B. Используется также с адреса #1EDD (повторение форматирования; установите #5CDD). + +x1EC2 LD HL,#FFFF + LD (#5CD7),HL ;дорожки не проверять + LD (#5CD9),HL ;форматировать одну сторону диска + LD (#5CD1),HL ;ошибку при чтении адресного маркера игнорировать + CALL x042B ;следующий символ ENTER? + JP Z,x1D1A ;если да, то ошибка + CALL x1DDF ;прием имени диска на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x1C57 ;установка имени диска +x1EDD CALL x3E11 ;берем тип дисковода + AND #80 ;дисковод 40-дорожечный? + LD A,#28 ;форматировать 40 дорожек + JR Z,x1EE8 ;если дисковод 80-дорожечный, + LD A,#50 ;то форматировать 80 дорожек +x1EE8 LD (#5CD7),A ;установка количества дорожек + CALL x08A7 ;new восстановление + CALL x0B01 ;new выбор нижней стороны диска + CALL x3EA0 ;задержка в 3135098 тактов + LD E,1 ;форматирование дорожки с номером 1 + CALL x1FFD + CALL x1FEB ;выбор верхней стороны диска + LD E,0 ;форматирование дорожки с номером 0 + CALL x1FFD + LD A,(#5CDD) ;форматировать только одну сторону диска + CP "$" + JR Z,x1F1B ;если да, то форматирование диска + CALL x1FF6 ;выбор нижней стороны диска + CALL x3EA0 ;задержка в 3135098 тактов + CALL x3EB5 ;чтение адресного маркера + LD A,H ;номер дорожки - 1? + CP 1 + JR NZ,x1F1B ;если нет, то форматирование диска +x1F16 LD A,#80 ;форматировать обе стороны диска + LD (#5CDA),A +x1F1B CALL x20BD ;форматирование диска + LD HL,#5D25 ;адрес начала буфера + LD (HL),0 ;очистка первого байта + LD DE,#5D26 ;адрес второго байта буфера + LD BC,#FF ;осталось очистить #FF байтов + LDIR ;очистка буфера + LD BC,#5CD7 ;адрес переменной с количеством дорожек + LD DE,#5CDA ;адрес переменной с количеством сторон + LD A,(BC) ;форматировали 80 дорожек? + CP #50 + JR Z,x1F49 ;если да, то диск 80-дорожечный + LD A,(DE) ;форматировали 2 стоpоны? + CP #80 + JR Z,x1F42 ;если да, то диск 40-дорожечный двухстоpонний + LD A,#19 ;диск 40-дорожечный односторонний + LD HL,#270 ;свободно #270 сектора + JR x1F55 ;создание описателя диска +x1F42 LD A,#17 ;диск 40-дорожечный двухсторонний +x1F44 LD HL,#4F0 ;свободно #4F0 сектора + JR x1F55 ;создание описателя диска +x1F49 LD A,(DE) ;форматировали 2 стороны? + CP #80 + LD A,#18 ;если нет, то диск 80-дорожечный односторонний + JR NZ,x1F44 + LD A,#16 ;иначе диск 80-дорожечный двухсторонний + LD HL,#9F0 ;свободно #9F0 сектора +x1F55 LD (#5E08),A ;установка типа диска + LD (#5E0A),HL ;установка количества свободных секторов + LD A,1 ;первая свободная дорожка - 1 + LD (#5E07),A + LD A,#10 ;признак принадлежности диска к TR-DOS + LD (#5E0C),A + LD HL,#5E0F ;9 байтов #20 с адреса #5E0F + LD DE,#5E10 + LD BC,8 + LD (HL),#20 + LDIR + LD HL,#5CDD ;установка имени диска + LD DE,#5E1A + LD BC,8 + LDIR + CALL x0B54 ;new выбор верхней стороны диска + LD B,1 ;записать 1 сектор + LD DE,8 ;сектор 8 дорожки 0 + LD HL,#5D25 ;из буфера + CALL x1E62 ;запись сектора + LD A,(#5CD6) ;берем количество дефектных секторов + PUSH AF ;сохраняем его + XOR A ;расширение - CHR$ 0 + LD (#5CE5),A ;установка расширения + LD HL,(#5E0A) ;берем количество свободных секторов + LD (#5CD7),HL ;сохраняем его + LD HL,#5CDD ;печать имени диска + RST #18 + LD A,#D ;перевод строки + RST #10 + LD HL,(#5CD7) ;восстановление количества свободных секторов + POP AF ;восстановление количества дефектных секторов + PUSH HL ;сохранение количества свободных секторов + LD D,0 ;перевод количества дефектных секторов в + LD E,A ;двухбайтную форму + SBC HL,DE ;вычисление количества хороших секторов + LD B,H ;переброска его в BC + LD C,L + CALL x1DA9 ;печать его + LD A,"/" ;печать "/" + RST #10 + POP BC ;восстановление количества свободных секторов + CALL x1DA9 ;печать его + JP x01D3 + +;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. + +x1FB9 DB 1 +x1FBA DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 + +;Адрес #1FCA. Определение количества дорожек дисковода. Вход: установите время перемещения головки дисковода. Выход: в #5CD7 и регистре A будет количество дорожек дисковода. + +x1FCA CALL x3E08 ;берем время перемещения головки + OR #11 ;позиционирование на дорожку #32 + LD B,A + LD A,#32 + CALL x3E44 + LD A,2 ;затем на дорожку 2 + CALL x3E44 + CALL x3DFD ;задержка в 725779 тактов + IN A,(#1F) ;головка в исходном положении? + AND 4 + LD A,#50 ;если нет, то у дисковода 80 дорожек + JR Z,x1FE7 + LD A,#28 ;иначе 40 +x1FE7 LD (#5CD7),A ;установка количества дорожек + RET ;возврат + +;Адрес #1FEB. Выбор верхней стороны диска. Установите #5D16. Используется также с адреса #1FF0 (загрузка системного регистра, код - в аккумуляторе). Вы можете также использовать с адреса: +;#1FF3 для прямого вывода в порт #FF. + +x1FEB LD A,(#5D16) ;берем копию системного регистра + OR #3C ;формат MFM, верхняя сторона, выключение сброса и готовности +x1FF0 LD (#5D16),A ;запоминаем копию системного регистра +x1FF3 OUT (#FF),A ;установка системного регистра + RET ;возврат + +;Адрес #1FF6. Выбор нижней стороны диска. Установите #5D16. + +x1FF6 LD A,(#5D16) ;берем копию системного регистра + AND #6F ;формат MFM, нижняя сторона, выключение сброса и готовности + JR x1FF0 ;установка системного регистра + +;Адрес #1FFD. Форматирование дорожки. В регистр Е поместите ее номер и спозиционируйте головку дисковода. Из переменных установите #5CD8, #5CE6, #5CE8 и обнулите #5CD6. Используется также с адреса #1FC9 (проверка дорожки; установите #5CD8, #5CE8 и обнулите #5CD6 и спозиционируйте головку). + +x1FFD DI ;запрет прерываний + LD A,#F4 ;запись дорожки + OUT (#1F),A + LD HL,#1FB9 ;берем адрес таблицы секторов для форматирования + LD C,#7F ;адрес регистра данных +x2007 LD B,#A ;#A раз #4E (первый пробел) + LD D,#4E + CALL x20B1 ;запись байта заданное число раз + LD B,#C ;синхропромежуток + LD D,0 + CALL x20B1 + LD B,3 ;синхроимпульс + LD D,#F5 + CALL x20B1 + LD D,#FE ;1 раз #FE (адресная метка идентификатора) + CALL x20AF ;запись байта 1 раз + LD D,E ;номер дорожки + CALL x20AF + LD D,0 ;номер стороны (в TR-DOS всегда 0) + CALL x20AF + LD D,(HL) ;номер сектора из таблицы + CALL x20AF + LD D,1 ;длина сектора - #100 байтов + CALL x20AF + LD D,#F7 ;запись контрольной суммы + CALL x20AF + LD B,#16 ;второй пробел + LD D,#4E + CALL x20B1 + LD B,#C ;синхропромежуток + LD D,0 + CALL x20B1 + LD B,3 ;синхроимпульс + LD D,#F5 + CALL x20B1 + LD D,#FB ;адресная метка данных + CALL x20AF + LD B,0 ;данные (#100 нулей) + LD D,0 + CALL x20B1 + LD D,#F7 ;запись контрольной суммы + CALL x20AF + LD B,#32 ;третий пробел + LD D,#4E + CALL x20B1 + LD A,(HL) ;берем адрес номера следующего сектора + INC HL + CP #10 ;конец таблицы? + JR NZ,x2007 ;если нет, то форматирование следующего сектора + LD B,0 ;пробел до конца дорожки + CALL x20B1 + JP M,x2076 + CALL x20B1 +x2076 IN A,(#1F) ;берем состояние контроллера + AND #40 ;запись запрещена? + JP NZ,x3F39 ;если да, то сообщение READ ONLY +x207D LD A,(#5CD8) ;дорожку проверять? + OR A + RET NZ ;если нет, то возврат + +;Внимание!!! Перед возвратом или выходом по ошибке надо разрешать прерывания. + + LD C,#7F ;адрес регистра данных + LD A,E ;установка номера дорожки + OUT (#3F),A + LD HL,#1FBA ;берем адрес таблицы секторов для проверки +x208A LD B,3 ;3 попытки + LD A,(HL) ;берем номер сектора из таблицы + OUT (#5F),A ;установка сектора + PUSH HL ;сохранение адреса таблицы секторов +x2090 DI ;запрет прерываний + LD A,#80 ;чтение сектора + OUT (#1F),A + PUSH BC ;сохранение количества попыток + CALL x3FE5 ;чтение данных по адресу из HL (в пзу, не страшно) + IN A,(#1F) ;все в порядке? + AND #7F + POP BC ;восстановление счетчика попыток + JR Z,x20A6 ;если все в порядке, то следующий сектор + DJNZ x2090 ;следующая попытка + LD HL,#5CD6 ;есть 1 битый сектор + INC (HL) +x20A6 POP HL ;восстановление адреса таблицы секторов + LD A,(HL) ;берем номер текущего сектора + INC HL ;берем адрес номера следующего сектора + CP 1 ;конец таблицы? + JR NZ,x208A ;если нет, то повтор + EI ;разрешение прерываний + RET ;возврат + +;Адрес #20AF. Запись байта 1 pаз. В регистр D поместите байт, в C - #7F и выдайте команду записи на вг-#5D. Используется также с адреса #20B1 (запись байта несколько раз; все для #20AF плюс в B количество выдач). + +x20AF LD B,1 ;запись 1 раз +x20B1 IN A,(#FF) ;ожидание DRQ или INTRQ + AND #C0 + JR Z,x20B1 + RET M ;если поступил INTRQ, то возврат + OUT (C),D ;выдача байта + DJNZ x20B1 ;повтор до конца + RET ;возврат + +;Адрес #20BD. Форматирование диска. Установите #5CDA, #5CD7, #5CE6 и #5CE8. + +x20BD call x0B0B ;берем число форматируемых дорожек + LD B,(HL) + XOR A ;дорожки проверять + INC HL + LD (HL),A + LD E,#FF ;начнем с дорожки 0 +x20C6 PUSH BC ;сохранение количества дорожек + INC E ;следующая дорожка + LD A,E + LD B,#1B ;позиционирование + CALL x3E44 + CALL x1FEB ;выбор верхней стороны диска + CALL x1FFD ;форматирование дорожки и возврат + LD A,(#5CDA) ;берем флаг количества сторон + CP #80 ;форматировать 2 стороны? + JR NZ,x20E1 ;если да, то + CALL x1FF6 ;выбор нижней стороны диска + CALL x1FFD ;форматирование дорожки и возврат +x20E1 POP BC ;восстановление количества дорожек + DJNZ x20C6 ;если еще не все, то повтор + RET ;возврат + +;Адрес #20E5. Удаление буфера с изменением памяти. На входе установите переменные #5CB6, #5CF8, #5D0C и #5D18. Выход: в #5D18 записывается #FF, а если в #5D0C выл 0, то туда также засылается #FF. Используется также с адреса: +;#20F1 (изменение памяти, работает только с #5CB6 и #5D18). + +x20E5 PUSH AF ;сохранение AF + LD A,(#5CF8) ;ничего не делать? + CP #FF + JR Z,x211C ;если да, то возврат + POP AF ;восстановление AF + CALL x2970 ;удаление буфера +x20F1 PUSH AF ;сохранение AF + LD A,(#5CB6) ;изменение разрешено? + CP #F4 + JR Z,x211C ;если нет, то возврат + XOR A + LD HL,#5D18 ;подтверждение есть? + OR (HL) + LD (HL),#FF ;в следующий раз подтверждение будет + JR Z,x211C ;если его не было, то возврат + LD A,(#5D0C) ;буфер есть? + OR A + LD HL,#5CC3 ;начало первого блока + LD DE,#5D33 ;начало второго блока + JR NZ,x2111 ;если есть буфер, то второй блок смещен на #101 + LD DE,#5E34 ;байтов +x2111 LD B,#2D ;длина блоков - #2D байтов +x2113 LD C,(HL) ;меняем блоки местами + LD A,(DE) + LD (HL),A + LD A,C + LD (DE),A + INC HL + INC DE + DJNZ x2113 +x211C POP AF ;восстановление AF + RET ;возврат + +;Адрес #211E. Очистка буфера редактора. + +x211E LD HL,(#5C59) ;берем адрес буфера редактора + LD (HL),#D ;ENTER + LD (#5C5B),HL ;установка курсора + INC HL ;конец области + LD (HL),#80 + RET ;возврат + +;Адрес #212A. Восстановление командной строки. Установите #5D20. + +x212A LD DE,(#5C59) ;символы переносить в буфер редактора + LD HL,#5D20 ;из #5D20 + CALL x02B0 ;перенос символов + RET ;возврат + +;Адрес #2135. Принятие команды. Установите #5D0F и если там не 0, то и #5D20. + +x2135 LD A,(#5D0F) ;ошибка была? + OR A + PUSH AF ;сохранение результата проверки + CALL NZ,x212A ;если да, то восстановление первых трех символов + +;Не надо этого делать!!! COPY портит буфер по адресу #5D20, а буфер редактора всегда остается цел. + + POP AF ;восстановление результата проверки + CALL Z,x211E ;если ошибки не было, то стирание старой строки + LD HL,(#5C59) ;эта команда тоже не нужна + CALL x3D80 ;перевод строки + LD A,(#5D19) ;берем номер дисковода по умолчанию + ADD A,"A" ;печать его имени + RST #10 + LD A,">" ;печать ">" + RST #10 + LD HL,#5C3A ;для нормального выхода из редактора + LD (HL),#FF + JP x1D90 ;ввод команды и возврат + +;Адрес #2158. Прием числа. CH_ADD установите на символ перед числом. Число, увеличенное на 1, будет помещено в #5CD7, а содержимое #5CDB будет скопировано в #5CD9. Число не должно равняться 0. + +x2158 CALL x1E2A ;следующий символ + CALL x1D8C + CP "," ;это запятая? + JP NZ,x1D1A ;если да, то ошибка + LD HL,(#5CDB) ;сохранение #5CDB + LD (#5CD9),HL + CALL x1E0B ;помещение числа на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD HL,(#5CDB) ;число pавно 0? + LD A,H + OR A + JP NZ,x1D1A ;если да, то ошибка + INC HL ;еще будет байт ENTER + LD (#5CD7),HL ;установка числа + LD HL,(#5CD9) ;восстановление #5CDB + LD (#5CDB),HL + RET ;возврат + +;Адрес #2182. Выполнение команды OPEN#. Установите #5D11 и #5C3B. + +x2182 LD HL,(#5D11) ;установка CH_ADD + LD (#5C5D),HL + CALL x1E0B ;принятие номера потока + CALL x1DD0 ;принятие имени файла на стек калькулятора +x218E CALL x1D8C ;берем текущий символ + CP "A" ;он меньше "A"? + JR NC,x219A ;если нет, то проверка режима файла + CALL x1E2A ;следующий символ + JR x218E ;повтор +x219A CP #A5 ;это RND? + PUSH AF ;сохранение символа и результата проверки + CALL Z,x2158 ;если это RND, то обработка длины записи + POP AF ;восстановление символа и результата проверки + JR Z,x21AE ;если это RND, то открытие потока + AND #DF ;буква заглавная + CP "R" ;это "R"? + JR Z,x21AE ;если да, то открытие потока + CP "W" ;это "W"? + JP NZ,x1D1A ;если нет, то ошибка +x21AE LD (#5D09),A ;сохранение буквы режима файла + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,"#" ;расширение файла - "#" + LD (#5CE5),A + LD A,0 ;поиск начинать с блока 0 + LD (#5CE6),A + CALL x21DB ;поиск последнего блока файла + PUSH AF ;сохранение флага результата поиска + CALL x220F ;проверка потока + POP AF ;восстановление флага результата поиска + PUSH AF ;сохранение флага результата поиска + CALL NZ,x2288 ;если файл не был найден, то создание блока 0 + POP AF ;восстановление флага результата поиска + CALL x2242 ;открытие потока + LD HL,(#5D11) ;коррекция переменной с адресом командной строки + LD BC,#124 + ADD HL,BC + LD (#5D11),HL + JP x01D3 ;завершение + +;Адрес #21DB. Поиск блока файла данных. Вход: поместите имя файла на стек калькулятора, установите #5CDD и #5D09 и поместите в #5CE6 номер первого блока файла. Выход: если файл найден, то будет считан описатель последнего или первого блока в зависимости от #5D09 и обнулен аккумулятор и установлен флаг Z; иначе флаг Z будет сброшен, а в аккумуляторе будет байт из #5D09. + +x21DB LD A,#A ;поиск файла ведем по #A байтам + LD (#5D06),A + CALL x1CB0 ;установка имени файла и поиск файла + PUSH AF ;сохранение результата поиска + CALL x0405 ;настройка на диск + POP AF ;восстановление результата поиска + JR NZ,x2206 ;если файл не найден, то проверка режима файла + LD A,(#5D09) ;открываем файл для чтения? + CP "R" + JR Z,x2201 ;если да, то выход +x21F1 LD HL,#5CE6 ;следующий блок + INC (HL) + CALL x1CB3 ;поиск блока + JR Z,x21F1 ;если блок найден, то следующий блок + LD HL,#5CE6 + DEC (HL) ;последний существующий блок + CALL x1CB3 ;определение его номера в каталоге +x2201 CALL x165D ;чтение его описателя + XOR A ;обнуление аккумулятора и установка флага Z + RET ;возврат +x2206 LD A,(#5D09) ;открываем файл для чтения? + CP "R" + RET NZ ;если да, то возврат + JP x03D9 ;сообщение NO FILE + +;Адрес #220F. Проверка занятости потока. Вход: установите #5CDB. Выход: в HL будет адрес элемента таблицы STRMS, отвечающего за данный поток. Используется также с адреса #2225 (то же, что и #1C4A). + +x220F LD A,(#5CDB) ;берем номер потока + RST #20 ;берем относительный адрес описателя потока, к + DW #1727 ;которому подключен канал + LD A,B ;поток занят? + OR C + JP NZ,x221B ;если да, то ошибка + RET ;возврат +x221B LD A,#19 ;код ошибки бейсика PARAMETER ERROR + +;Внимание!!! Лучше выдавать сообщение INVALID STREAM. + + LD (#5C3A),A + LD HL,x2804 ;адрес сообщения STREAM OPENED + LD A,#A ;код ошибки TR-DOS - #A +x2225 JP x1C4A ;обработка ошибки + +;Адрес #2228. Обработка ошибки NOT DISC FILE. + +x2228 LD A,#B ;код ошибки - #B + LD HL,x2812 ;адрес сообщения NOT DISC FILE + JR x2225 ;обработка ошибки + +;Адрес #222F. Инициализация признаков файла произвольного доступа. Установите #5CD7 и откройте канал файла данных. Подпрограмма помещает в A #7F. + +x222F PUSH HL ;сохранение HL + LD C,#20 ;берем адрес #20-го байта описателя канала + RST #28 + LD A,(#5CD7) ;установка длины записи + LD (HL),A + INC HL + XOR A + LD (HL),A ;адресация от начала записи - 0 + INC HL + LD (HL),A ;будет приниматься номер записи + INC HL + LD (HL),A ;сектор переписывать + LD A,#7F ;загрузка аккумулятора + POP HL ;восстановление HL + RET ;возврат + +;Адрес #2242. Создание описателя канала для файла данных и подключение к нему потока. Установите #5CDB. + +x2242 PUSH AF ;сохранение результата поиска файла + CALL x220F ;берем адрес элемента таблицы STRMS, отвечающего за поток + EX DE,HL ;сохранение его + LD HL,(#5C53) ;вычисление относительного адреса нового + LD BC,(#5C4F) ;описателя канала + SBC HL,BC + EX DE,HL ;восстановление адреса элемента таблицы STRMS + LD (HL),E ;установка относительного адреса описателя + INC HL ;канала + LD (HL),D + CALL x22B2 ;создание описателя канала + LD A,(#5D09) ;берем способ открытия файла + CP #A5 ;это RND? + CALL Z,x222F ;если да, то инициализация признаков файла произвольного доступа + JR Z,x226B ;и установка признака способа открытия файла + LD A,(#5D09) ;берем способ открытия файла + CP "R" ;это R? + LD A,#FF ;если да, то признак способа открытия файла - + JR NZ,x226B ;#FF + XOR A ;иначе это 0 +x226B LD (HL),A ;установка признака способа открытия файла + POP AF + JP x2270 +x2270 PUSH AF + LD BC,#14 ;берем адрес фрагмента текста в описателе + ADD HL,BC ;канала минус 1 + PUSH HL ;сохраняем его + CALL x2423 ;вычисление адреса текущего сектора файла на диске + POP HL ;восстановление адреса фрагмента текста минус 1 + INC HL + LD B,1 ;загружать 1 сектоp + POP AF ;восстановление результата поиска файла + OR A ;был создан новый файл? + PUSH AF ;сохранение результата проверки + CALL NZ,x1E4D ;если был создан новый файл, то запись сектора + POP AF ;сохранение результата проверки + CALL Z,x1E3D ;если файл существовал, то загрузка файла + RET ;возврат + +;Адрес #2288. Создание нулевого блока файла данных. + +x2288 LD HL,(#5CD7) ;сохранение #5CD7 + PUSH HL + LD HL,#2000 ;блок 0 + LD (#5CD7),HL + CALL x229A ;создание блока + POP HL ;восстановление #5CD7 + LD (#5CD7),HL + RET ;возврат + +;Адрес #229A. Создание блока файла данных. Установите #5CD7 и #5CDB, #5CDD и #5CE5. + +x229A LD HL,#1000 ;длина блока - #1000 байтов + LD (#5CD9),HL + CALL x1AC4 ;проверка наличия свободного места на диске + CALL x1B59 ;запись файла + LD HL,0 ;заполнено 0 байтов + LD (#5CE8),HL + CALL x166B ;замена описателя блока + JP x1E43 ;перезапись сектора с описателем и возврат + +;Внимание!!! После записи сектора надо снова открыть канал файла данных, так как при ошибке открывается поток 0. + +;Адрес #22B2. Создание описателя канала и открытие потока. + +x22B2 LD HL,(#5C53) ;открытие потока + DEC HL + LD (#5C51),HL + PUSH HL ;сохранение адреса описателя канала + LD BC,#124 ;его длина - #124 байта + CALL x1E32 ;создание области для описателя канала + LD A,0 ;заполнять область нулями + LD B,0 ;длина области - #100 байтов +x22C4 LD (DE),A ;очистка байта + DEC DE ;следующий адрес + DJNZ x22C4 ;повтор до конца + POP HL ;восстановление адреса описателя канала + PUSH HL ;и снова сохранение + LD DE,x3D0E ;адрес подпрогpаммы вывода в канал + LD (HL),E + INC HL + LD (HL),D + INC HL + LD DE,x3D06 ;адрес подпрограммы ввода из канала + LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),"D" ;имя канала - "D" + INC HL ;пропуск четырех байтов + INC HL + INC HL + INC HL + INC HL + LD (HL),#24 ;байт #24 + INC HL + LD (HL),1 ;байт 1 + INC HL + LD A,(#5CF6) ;номер дисковода + LD (HL),A + INC HL + LD A,(#5D1E) ;номер последнего блока файла + LD (HL),A + INC HL + LD A,(#5D09) ;файл открывается для чтения? + CP "R" + LD (HL),0 ;если да, то пройдено 0 байтов + JR Z,x22FC ;иначе количество пройденных байтов берем из + LD A,(#5CE8) ;поля длины записанной части файла + LD (HL),A +x22FC INC HL + LD (HL),B + JR Z,x2304 + LD A,(#5CE9) + LD (HL),A +x2304 INC HL + EX DE,HL ;сохранение адреса #F-го байта описателя канала + POP HL ;восстановление адреса описателя канала + PUSH DE + LD DE,#10 ;адрес #10-го байта описателя канала + ADD HL,DE + EX DE,HL + LD HL,#5CDD ;установка описателя файла + LD BC,#10 + LDIR + POP HL ;восстановление адреса #F-го байта описателя канала + RET ;возврат + +;Адpес #2317. Вычисление адреса текущего символа файла данных в описателе канала. Откройте поток, связанный с файлом данных. На выходе адрес символа будет в HL. + +x2317 LD C,#D ;адрес #D-го байта описателя канала + RST #28 + LD C,(HL) ;берем номер текущего символа в текущем секторе файла + RST #28 ;вычисление смещения до символа + LD BC,#24 ;текст начинается с #24-го байта описателя канала + ADD HL,BC ;вычисление адреса символа + RET ;возврат + +;Адрес #2321. Вычисление адреса фрагмента текста в описателе канала. Откройте поток, связанный с файлом данных. Используется также с адреса #2323 (вычисление адреса байта в описателе текущего канала; откройте канал и поместите номер байта в C; на выходе в HL будет адрес байта). + +x2321 LD C,#24 ;текст начинается с #24-го байта +x2323 LD B,0 ;перевод номера байта в 2-х байтный формат + LD HL,(#5C51) ;берем адрес описателя текущего канала + ADD HL,BC ;вычисление адреса байта + RET ;возврат + +;Адрес #232A. Проверка достижения конца сектора в описателе канала. Откройте поток, связанный с файлом данных. При достижении конца сектора будет загружен следующий. Если достигнут конец блока, а следующий отсутствует, то он будет создан. + +x232A LD C,#D ;адрес #D-го байта описателя канала + RST #28 + INC (HL) ;следующий байт + RET NZ ;если не конец сектора, то возврат + PUSH HL ;сохранение адреса #D-го байта описателя канала + CALL x2443 ;установка дисковода + CALL x23FC ;запись текущего сектора + POP HL ;восстановление адреса #D-го байта описателя канала + INC HL ;#E-ый байт + INC (HL) ;следующий сектор + PUSH HL ;сохранение адреса #E-го байта описателя канала + CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #E-го байта описателя канала + LD A,#10 ;в блоке 16 секторов + CP (HL) ;конец блока? + RET NZ ;если нет, то возврат + PUSH HL ;сохранение адреса #E-го байта описателя канала + LD C,#F ;#F-ый байт + RST #28 + LD A,(HL) ;файл прямого доступа? + CP #7F + POP HL ;восстановление адреса #E-го байта описателя канала + JR Z,x2358 ;если файл прямого доступа, то проверка наличия следующего блока + LD HL,(#5C51) ;берем адрес описателя канала + CALL x26E1 ;запись описателя блока + LD C,#E ;#E-ый байт + RST #28 + JP x2379 ;создание следующего блока файла +x2358 CALL x23CF ;поиск следующего блока файла + PUSH AF ;сохранение результата поиска + CALL Z,x2418 ;если блок найден, то загрузка сектора из блока + LD C,#E ;#E-ый байт + RST #28 + POP AF ;восстановление результата поиска блока + CALL NZ,x2370 ;если блок не был найден, то создание его + RET ;возврат + +;Адрес #2367. Помещение в D числа #20, в E - содержимого #19-го байта описателя канала и обнуление байта по адресу, помещенному в HL. Откройте нужный канал. + +x2367 LD (HL),0 ;обнуление байта + LD C,#19 ;берем адрес #19-го байта описателя канала + RST #28 + LD D,#20 ;помещение в регистр D числа #20 + LD E,(HL) ;помещение в E числа из #20-го байта описателя канала + RET ;возврат + +;Адрес #2370. Создание блока файла данных. Откройте поток, связанный с файлом данных. + +x2370 CALL x2367 ;берем номер создаваемого блока + LD (#5CD7),DE ;установка его + JR x2381 ;создание и возврат + +;Адрес #2379. Cоздание блока файла данных. Откройте поток, связанный с файлом данных, используется, также, с адреса #2381 (создание блока файла данных; установите #5CD7 и #5CDB, #5CDD и #5CE5). + +x2379 CALL x2367 ;берем номер текущего блока + INC E ;следующий блок + LD (#5CD7),DE ;установка номера блока +x2381 CALL x229A ;создание блока + CALL x2970 ;удаление буфера + +;Внимание!!! Если выполняется команда CAT# или LIST#, то буфеp удалять нельзя. + + LD C,#10 ;берем адрес #10-го байта описателя канала + RST #28 + EX DE,HL ;перенос его в DE + LD HL,#5CDD ;перенос описателя блока в описатель канала + LD BC,#10 + LDIR + LD C,#C ;#C-ый байт + RST #28 + LD A,(#5D1E) ;установка номера блока в каталоге + LD (HL),A + RET ;возврат + +;Адрес #239B. Проверка достижения конца сектора при чтении файла данных. Откройте поток, связанный с файлом данных. + +x239B LD C,#D ;адрес #10-го байта описателя канала + RST #28 + INC (HL) ;следующий байт сектора + RET NZ ;если не конец сектора, то возврат + INC HL ;#11-ый байт + INC (HL) ;следующий сектор + PUSH HL ;сохранение адреса #11-го байта описателя канала + CALL x2443 ;установка дисковода + LD C,#23 ;#23-ый байт + RST #28 + LD A,(HL) ;это 0? + OR A + JR Z,x23B6 ;если да, то сектор не переписывать + POP HL ;восстановление адреса #11-го байта описателя канала + PUSH HL ;и снова сохранение его + DEC (HL) ;восстановление номера текущего сектора + CALL x23FC ;запись сектора + POP HL ;восстановление адреса #11-го байта описателя канала + PUSH HL ;и снова сохранение его + INC (HL) ;следующий сектор +x23B6 CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #11-го байта описателя канала + LD A,#10 ;в блоке 16 секторов + CP (HL) ;конец блока? + CALL Z,x23C1 ;если да, то открытие следующего + RET ;возврат + +;Адрес #23C1. Открытие следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адрес #E-го байта описателя канала и установите #5D06. + +x23C1 CALL x23CF ;поиск следующего блока файла данных + PUSH AF ;сохранение результата поиска + CALL x2970 ;удаление буфера + +;Внимание!!! Hадо проверять #5D16, так как если выполняется команда CAT#, или LIST#, то буфер удалять нельзя. + + POP AF ;восстановление результата поиска блока + JP NZ,x2492 ;если блок не найден, то END OF FILE + JP x2418 ;загрузка сектора из блока + +;Адрес #23CF. Поиск следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адpес #E-го байта описателя канала и установите #5D06. Если блок найден, то флаг Z будет включен, иначе выключен. + +x23CF LD (HL),0 ;номер текущего сектора - 0 + LD C,#19 ;#19-ый байт описателя потока + RST #28 + INC (HL) ;следующий блок + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x1CB3 ;поиск блока + +;Внимание!!! После поиска блока надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. + + RET NZ ;если блок не найден, то возврат + +;Адрес #23E4. Открытие блока. Номер блока в каталоге поместите в A. + +x23E4 CALL x165D ;чтение описателя блока + +;Внимание!!! После чтения описателя надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. + + LD C,#10 ;берем адрес #10-го байта описателя канала + RST #28 + EX DE,HL ;переброска его в DE + LD HL,#5CDD ;перенос описателя блока в описатель канала + LD BC,#10 + LDIR + LD C,#C ;#C-ый байт + RST #28 + LD A,(#5D1E) ;установка номера блока в каталоге + LD (HL),A + XOR A ;обнуление аккумулятора + RET ;возврат + +;Адрес #23FC. Запись текущего сектора файла данных. Откройте поток, связанный с файлом. + +x23FC CALL x2423 ;вычисление адреса текущего сектора файла на диске + CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала + LD B,1 ;записывать 1 сектор + CALL x1E4D ;запись сектора + +;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. + + LD C,#F ;#F-ый байт описателя канала + RST #28 + LD A,(HL) ;файл прямого доступа? + CP #7F + RET Z ;если да, то возврат + CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала + XOR A ;сектор заполнять нулями + LD B,A ;длина его - #100 байтов +x2413 LD (HL),A ;очистка байта + INC HL ;следующий байт + DJNZ x2413 ;повтор до конца + RET ;возврат + +;Адрес #2418. Загрузка текущего сектора в описатель канала. Откройте поток, связанный с файлом данных. + +x2418 CALL x2423 ;вычисление адреса текущего сектора на диске + CALL x2321 ;вычисление адреса сектора в описателе канала + LD B,1 ;загружать 1 сектор + JP x1E3D ;загрузка сектора и возврат + +;Внимание!!! После загрузки сектора надо снова открывать канал, связанный с файлом данных, так как при ошибках открывается поток 0. + +;Адрес #2423. Вычисление адреса текущего сектора файла на диске. Откройте поток, связанный с файлом данных. На выходе в DE будет адрес сектора на диске. + +x2423 LD HL,(#5C51) ;берем адрес #1E-го байта описателя канала + LD BC,#1E + ADD HL,BC + LD E,(HL) ;берем адрес файла на диске + INC HL + LD D,(HL) + LD C,#E ;#E-ый байт + RST #28 + LD B,(HL) ;берем номер текущего сектора файла + DEC B ;он равен 0? + INC B + PUSH AF ;сохранение AF + LD A,#10 ;на дорожке #10 секторов + JR Z,x2441 ;если номер текущего сектора файла pавен 0, то выход +x2438 INC E ;следующий сектор + CP E ;конец дорожки? + JR NZ,x243F ;если да, то + LD E,0 ;сектор 0 + INC D ;и следующая дорожка +x243F DJNZ x2438 ;повтор до конца +x2441 POP AF ;восстановление AF + RET ;возврат + +;Адрес #2443. Установка дисковода для операций с файлом данных. Откройте поток, связанный с файлом. + +x2443 LD C,#B ;берем адрес #B-го байта описателя канала + RST #28 + LD A,(HL) ;берем номер дисковода, на котором находится файл + JP x3DCB ;выбор дисковода + +;Адрес #244A. Вывод символа в файл данных. Символ поместите в аккумулятор и откройте поток, связанный с файлом. + +x244A LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD HL,x20F1 ;адрес подпрограммы изменения памяти + PUSH HL ;помещение его на стек + PUSH AF ;сохранение символа + CALL x20F1 ;изменение памяти + LD A,#A ;файл искать по #A байтам описателя + LD (#5D06),A + POP AF ;восстановление символа + CALL x24A2 ;работа с файлом прямого доступа + PUSH AF ;сохранение символа + CALL x2650 ;файл открывался для чтения? + JP Z,x249E ;если да, то ошибка + POP AF ;восстановление символа + CALL x2317 ;вычисление адреса текущего символа в текущем секторе + LD (HL),A ;запись символа + JP x232A ;проверка достижения конца сектора в описателе канала + +;Адрес #246E. Проверка достижения конца блока. Используется также с адресов: +;#2492 - обработка ошибки END OF FILE через ПЗУ бейсика. +;#2494 - обработка ошибок через ПЗУ бейсика. Код ошибки поместите в аккумулятор. + +x246E LD C,#D ;берем адрес #D-го байта описателя канала + RST #28 + LD A,(HL) ;берем младший байт длины пройденной части файла + LD BC,#E ;#1B-й байт + ADD HL,BC + CP (HL) ;сравнение младших байтов длин пройденной и записанной частей блока + RET NZ ;если они не равны, то возврат + LD C,#E ;аналогично со старшими байтами + RST #28 + LD A,(HL) + LD BC,#E + ADD HL,BC + CP (HL) + RET NZ + LD HL,#5CB6 ;адрес переменной разpешения изменения памяти + LD A,(HL) ;берем ее значение + CP #F4 ;интерфейс-1 есть? + JR Z,x2492 ;если нет, то ошибка + BIT 4,(HL) ;выполняется команда LOAD интерфейса-1? + JR Z,x2492 ;если да, то ошибка + OR 1 ;сброс флага C + POP HL ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x2492 LD A,7 ;код ошибки END OF FILE +x2494 LD (#5C3A),A ;установка кода ошибки + CALL x20E5 ;изменение памяти + RST #20 ;обработка ошибки + DW #0058 + +;Адрес #249D. Команда RET. + +x249D RET + +;Адрес #249E. Обработка ошибки INVALID I/O DEVICE через ПЗУ бейсика. + +x249E LD A,#17 ;код ошибки - #17 + JR x2494 ;обработка ошибки чеpез ПЗУ бейсика + +;Адрес #24A2. Работа с файлом произвольного доступа. Очередной символ поместите в A и откройте поток, связанный с файлом данных. Если окончен прием записи или файл последовательного доступа, то происходит простой возврат, иначе происходит возврат из программы, вызвавшей эту подпрограмму. + +x24A2 LD D,A ;сохранение символа + LD C,#F ;берем адрес #D-го байта описателя канала + RST #28 + LD A,(HL) ;файл произвольного доступа? + CP #7F + LD A,D ;восстановление символа + RET NZ ;если файл произвольного доступа, то возврат + LD BC,#13 ;#22-ый байт + ADD HL,BC + LD A,(HL) ;принимаем номер записи? + OR A + LD A,D ;восстановление символа + JR NZ,x24D5 ;если номер записи принят, то запись символа + DEC HL ;#21-ий байт + LD A,(HL) ;это 0? + OR A + JR NZ,x24C2 ;если нет, то рабочая область уже есть + PUSH BC ;сохранение числа #13, + PUSH HL ;адреса #21-го байта описателя канала и + PUSH DE ;символа + CALL x24F8 ;выделение #10 байтов в рабочей области + POP DE ;восстановление символа, + POP HL ;адреса #21-го байта описателя канала и + POP BC ;числа #13 +x24C2 LD C,(HL) ;берем относительный адрес символа + LD A,D ;восстановление символа + EX DE,HL + LD HL,(#5CCF) ;берем адрес рабочей области + ADD HL,BC ;вычисление адреса для символа + CP 6 ;символ CHR$ 6? + LD (HL),A ;помещение символа в рабочую область + CALL Z,x2504 ;если символ CHR$ 6, то номер записи принят + LD C,#21 ;#21-ий байт + RST #28 + INC (HL) ;записали 1 символ + POP HL ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x24D5 DEC HL ;#21-ий байт + LD A,(HL) ;берем относительный адрес символа + DEC HL ;#20-й байт + INC A ;место для символа ENTER + CP (HL) ;конец записи? + INC HL ;#21-ий байт + INC (HL) ;записали 1 символ + PUSH HL ;сохранение адреса #21-го байта описателя + PUSH AF ;канала и результата проверки наличия места для символа + LD C,#23 ;#23-ый байт + RST #28 + LD (HL),#FF ;сектор переписывать + POP AF ;восстановление результата проверки наличия места + POP HL ;для символа и адреса #21-го байта описателя канала + JR C,x24EE ;если места для символа нет, то следующая запись + LD A,D ;восстановление символа + CP #D ;это ENTER? + JR Z,x24F2 ;если да, то следующая запись + POP BC ;снятие со стека адреса возврата + RET ;возврат по следующему адресу +x24EE LD A,D ;восстановление символа + CP #D ;это ENTER? + RET NZ ;если нет, то возврат +x24F2 XOR A ;относительный адрес символа - 0 + LD (HL),A + INC HL ;#22-ый байт + LD (HL),A ;будем принимать номер записи + LD A,D ;восстановление символа + RET ;возврат + +;Адрес #24F8. Выделение #10 байтов в рабочей области памяти. Устанавливает #5CCF. + +x24F8 LD HL,(#5C61) ;берем адрес рабочей области памяти + LD (#5CCF),HL ;установка его + LD BC,#10 ;выделять #10 байтов + JP x1E23 ;выделение области и возврат + +;Адpес #2504. Обработка номера записи. Поместите в память номер записи в виде текста и поместите его адрес в #5CCF, а в HL поместите адрес последнего символа номера записи плюс 1. + +x2504 LD (HL),#D ;конец строки + LD HL,(#5C5D) ;сохранение CH_ADD + LD (#5CD7),HL + LD HL,(#5CCF) ;установка CH_ADD на номер записи + LD (#5C5D),HL + LD HL,#5C3B ;проверка на синтаксис + RES 7,(HL) + CALL x1DC1 ;перевод числа в 5-байтную форму + LD HL,#5C3B ;выполнение + SET 7,(HL) + LD HL,(#5CCF) ;установка CH_ADD на номер записи + LD (#5C5D),HL + CALL x1DC1 ;прием числа на стек калькулятора + CALL x1DB9 ;снятие его оттуда + PUSH BC ;перенос его в DE + POP DE + LD C,#20 ;берем адрес #D-го байта описателя канала + RST #28 + LD B,(HL) ;берем длину записи + XOR A + LD HL,0 ;вычисление относительного адреса записи в + LD (#5CDB),HL ;секторе, номера сектора и номера блока +x2538 ADD HL,DE ;извините, не понял, как это pаботает + JR NC,x2544 + PUSH HL + LD HL,(#5CDB) + INC HL + LD (#5CDB),HL + POP HL +x2544 DJNZ x2538 + LD (#5CD9),HL + LD A,(#5CDB) ;в блоке всего 16 секторов + LD HL,#5CDA + RRD + AND #F + LD (#5CDB),A + LD HL,(#5CD7) ;восстановление CH_ADD + LD (#5C5D),HL + CALL x2568 ;открытие записи + LD C,#21 ;#21-ий байт + RST #28 + LD A,#FF ;относительный адрес текущего символа будет 0 + LD (HL),A + INC HL ;#22-ый байт + LD (HL),A ;номер записи принят + RET ;возврат + +;Адрес #2568. Открытие записи. Установите #5CD7, #5CD9 и #5CDB. + +x2568 LD C,#19 ;берем адрес #19-го байта описателя канала + RST #28 + LD A,(#5CDA) ;берем номер открываемого блока + CP (HL) ;блок уже открыт? + JP NZ,x2584 ;если нет, то открытие блока + LD C,#E ;#E-ый байт + RST #28 + LD A,(#5CDB) ;берем номер сектора в открываемом блоке + CP (HL) ;сектор уже считан? + JP NZ,x25A7 ;если нет, то загрузка сектора +x257C LD C,#D ;#D-ый байт + RST #28 + LD A,(#5CD9) ;берем относительный адрес открываемой записи + LD (HL),A ;установка его + RET ;возврат +x2584 CALL x25CA ;проверка и обнуление #23-го байта + CALL NZ,x25C3 ;если надо, то запись сектора + LD A,(#5CDA) ;берем номер открываемого блока + LD C,#19 ;#19-ый байт + RST #28 + LD (HL),A ;установка номера блока + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x1CB3 ;поиск блока + +;Ошибка!!! После поиска файла надо снова открывать канал файла данных, так как при ошибке будет открыт поток 0. + + JP NZ,x25D2 ;если блок не найден, то создание блока + CALL x23E4 ;открытие блока + JR x25AD ;загрузка сектора из блока +x25A7 CALL x25CA ;проверка и обнуление #23-го байта + CALL NZ,x25C3 ;если надо, то запись сектора +x25AD LD A,(#5CDB) ;берем номер считываемого сектора + LD C,#E ;#E-ый байт + RST #28 + LD (HL),A ;установка номера сектора + PUSH HL ;сохранение адреса #E-го байта + CALL x2443 ;установка дисковода + CALL x2418 ;загрузка сектора + POP HL ;восстановление адреса #E-го байта + DEC HL ;#D-ый байт + LD A,(#5CD9) ;установка относительного адреса открываемой + LD (HL),A ;записи + JR x257C ;выход + +;Адрес #25C3. Запись текущего сектора. Откройте канал файла данных. + +x25C3 CALL x2443 ;установка дисковода + CALL x23FC ;запись сектора + RET ;возврат + +;Адрес #25CA. Проверка и обнуление #23-го байта описателя канала. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. Откройте нужный канал. + +x25CA LD C,#23 ;берем адрес #23-го байта описателя канала + RST #28 + LD A,(HL) ;берем его содержимое + OR A ;проверка его + LD (HL),0 ;обнуление байта + RET ;возврат + +;Адрес #25D2. Создание блока файла данных. Установите #5CD7, #5CD9 и #5CDB. + +x25D2 LD HL,(#5CDA) ;берем номер блока + LD H,#20 + LD (#5CD7),HL ;установка его + LD HL,(#5CD9) ;сохранение относительного адреса открываемой + PUSH HL ;записи + LD HL,(#5CDB) ;и номера сектора + PUSH HL + CALL x2381 ;создание блока + POP HL ;восстановление номера сектора + LD (#5CDB),HL + POP HL ;и относительного адреса открываемой записи + LD (#5CD9),HL + JR x25AD ;загрузка сектора из блока + +;Адрес #25EF. Ввод из файла данных. Откройте поток, связанный с файлом данных. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает символ из файла в A. + +x25EF CALL x20F1 ;изменение памяти + LD HL,#5C3C ;pежим не менялся + RES 3,(HL) + LD HL,(#5C3D) ;берем адрес подпрограммы обработки ошибок + LD E,(HL) + INC HL + LD D,(HL) + OR A ;он pавен #107F? + LD HL,#107F + SBC HL,DE + JR NZ,x2626 ;если нет, то подпрограмма вызвана не из редактора + LD SP,(#5C3D) ;очистка стека редактора + POP DE ;снятие адреса подпрограммы обработки ошибок + POP DE ;восстановление адреса дна стека + LD (#5C3D),DE ;установка его +x260F CALL x262B ;ввод символа из файла + JR C,x261D ;если был введен символ, то посылка его в буфер редактора +x2614 LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD HL,x20E5 ;адрес подпрограммы удаления буфера и изменения памяти + PUSH HL ;помещение его на стек + RET ;изменение памяти и возврат +x261D CP #D ;символ ENTER? + JR Z,x2614 ;если да, то выход + RST #20 ;ввод символа в буфер редактора + DW #0F85 + JR x260F ;повтор +x2626 CALL x262B ;ввод символа из файла + JR x2614 ;возврат + +;Адрес #262B. Ввод байта из файла данных. На выходе байт будет в аккумуляторе. Откройте поток, связанный с файлом данных. + +x262B LD A,#A ;файл искать по 10 байтам описателя + LD (#5D06),A + CALL x2650 ;файл открыт для чтения? + JR Z,x2642 ;если да, то + CP #7F ;файл произвольного доступа? + JP NZ,x249E ;если нет, то ошибка + LD BC,#13 ;берем адрес #22-го байта описателя канала + ADD HL,BC + LD (HL),0 ;подпрограмма вывода будет принимать номер записи + JR x2645 +x2642 CALL x246E +x2645 CALL x2317 ;вычисление адреса текущего символа + LD A,(HL) ;берем этот символ + PUSH AF ;сохраняем его + CALL x239B ;проверка достижения конца сектора + POP AF ;восстановление символа + SCF ;был введен символ + RET ;возврат + +;Адрес #2650. Проверка #F-го байта описателя текущего канала. Соответственно его содержимому установится флаг Z, а само содержимое будет в регистре A. + +x2650 LD C,#F ;берем адрес #F-го байта описателя канала + RST #28 + LD A,(HL) ;берем этот байт + OR A ;проверка его на 0 + RET ;возврат + +;Адрес #2656. Выполнение команды CLOSE#. Установите #5D11 и #5C3B. + +x2656 LD HL,(#5D11) ;установка CH_ADD + LD (#5C5D),HL + CALL x1E0B ;прием номера потока + CALL x1D75 ;если идет проверка на синтаксис, то возврат + LD A,(#5CDB) ;берем номер потока + RST #20 ;берем относительный адрес описателя канала + DW #1727 + LD A,B ;поток закрыт? + OR C + JP Z,x01D3 ;если да, то завершение + PUSH HL ;сохранение адреса элемента STRMS + LD HL,(#5C4F) ;берем адрес области описателей каналов + ADD HL,BC ;вычисляем адрес первого байта описателя канала + LD A,(HL) ;берем старший байт адреса подпрограммы вывода + LD HL,x3D0E ;он равен #3D? + CP H + POP HL ;восстановление адреса элемента STRMS + JP NZ,x2228 ;если старший байт адреса подпрограммы вывода не равен #3D, то сообщение NOT DISC FILE Дурацкая проверка!!! Мало ли что может изменить пользователь! + LD (HL),0 ;закрытие потока + INC HL + LD (HL),0 + LD (#5CD9),BC ;сохранение относительного адреса описателя канала + LD HL,(#5C4F) ;вычисление адреса описателя канала + ADD HL,BC + DEC HL + LD (#5CD7),HL ;сохранение его + CALL x26CE ;запись остатка файла, если нужно + LD HL,(#5CD7) ;восстановление адреса описателя канала + LD BC,#124 ;его длина - #124 байта + CALL x1E2E ;уничтожение области описателя канала + LD HL,#5C10 ;берем начало таблицы STRMS + LD B,#10 ;всего 16 потоков +x269D PUSH BC ;сохранение количества потоков + LD BC,(#5CD9) ;берем относительный адрес описателя канала + LD E,(HL) ;берем адрес из таблицы + INC HL + LD D,(HL) + EX DE,HL ;переносим его в HL + SBC HL,BC ;он меньше нашего адреса? + EX DE,HL ;переброска его в DE + JR C,x26BC ;если он меньше нашего адреса, то следующий элемент + LD D,(HL) ;снова берем адрес из таблицы + DEC HL + LD E,(HL) + INC HL + PUSH HL ;сохранение адреса текущего элемента таблицы + EX DE,HL ;переброска адреса из таблицы в HL + LD BC,#124 ;коррекция адреса + SBC HL,BC + EX DE,HL ;перенос его в DE + POP HL ;восстановление адреса текущего элемента таблицы + LD (HL),D ;установка нового адреса + DEC HL + LD (HL),E + INC HL +x26BC INC HL ;следующий элемент + POP BC ;восстановление количества элементов + DJNZ x269D ;повтор до конца + LD HL,(#5D11) ;коррекция адреса командной строки + LD BC,#124 + SBC HL,BC + LD (#5D11),HL + JP x01D3 ;завершение + +;Адрес #26CE. Запись текущего сектора файла данных. При записи открывает поток, связанный с файлом. Поместите в HL и #5CD7 адрес описателя канала. + +x26CE LD BC,#F ;берем адрес #F-го байта описателя канала + ADD HL,BC + LD A,(HL) ;файл открывался для чтения? + OR A + RET Z ;если да, то возврат + LD HL,(#5CD7) ;открытие потока + LD (#5C51),HL + CALL x26E1 ;запись описателя блока + JP x23FC ;запись текущего сектора и возврат + +;Адpес #26E1. Запись описателя текущего блока файла данных. Откройте поток, связанный с файлом данных и поместите в HL адрес описателя канала. + +x26E1 LD BC,#D ;берем адрес #D-го байта описателя канала + ADD HL,BC + LD E,(HL) ;берем длину пройденной части блока + INC HL + LD D,(HL) + LD BC,#D ;берем адрес #1A-го байта описателя канала + ADD HL,BC + LD (HL),E ;установка длины записанной части блока + INC HL + LD (HL),D + LD C,#10 ;#10-ый байт + RST #28 + LD DE,#5CDD ;установка описателя блока + LD BC,#10 + LDIR + CALL x2443 ;установка дисковода + LD C,#C ;#C-ый байт + RST #28 + LD C,(HL) ;берем номер блока в каталоге + CALL x166B ;замена описателя блока + JP x1E43 ;запись сектора с описателем и возврат + +;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. + +;Адрес #2707. Печать строки. В HL поместите ее начало. Последний символ должен быть либо CHR$ 0, либо с поднятым седьмым битом. + +x2707 LD A,(HL) ;берем символ из строки + OR A ;это CHR$ 0? + RET Z ;если да, то возврат + AND #7F ;сброс бита 7 + RST #10 ;печать символа + BIT 7,(HL) ;бит 7 установлен? + RET NZ ;если да, то возврат + INC HL ;берем адрес следующего символа + JR x2707 ;повтор + +;Адрес #2713. Сравнение областей памяти. В HL и DE поместите начала сравниваемых областей, а в B - их длину. При несовпадении флаг Z сброшен, иначе включен. + +x2713 LD A,(DE) ;сравнение байтов из областей + CP (HL) + RET NZ ;если они не совпали, то возврат + INC DE ;следующие байты + INC HL + DJNZ x2713 ;повтор до конца + RET ;возврат + +;Адрес #271B. Обработка ошибки NO DISC без установки TAPE LOADING ERROR. + +x271B LD HL,x27FC ;адрес сообщения NO DISC + LD A,6 ;код ошибки - 6 + JP x1C4A ;обработка ошибки + +;Адрес #2723. Обработка ошибки DIRECTORY FULL. + +x2723 LD HL,x27ED ;адрес сообщения DIRECTORY FULL + LD A,4 ;код ошибки - 4 + JP x1C4A ;обработка ошибки + +;Адрес #272B. Установка кода ошибки TAPE LOADING ERROR для ПЗУ бейсика. + +x272B LD A,#1A ;код ошибки TAPE LOADING ERROR + JR x2731 ;установка кода ошибки + +;Адрес #272F. Установка кода ошибки INVALID I/O DEVICE для ПЗУ бейсика. Используется также с адреса: +;#2731 (установка кода ошибки для пзу бейсика; код ошибки поместите в A). + +x272F LD A,#12 ;код ошибки INVALID I/O DEVICE +x2731 LD (#5C3A),A ;установка кода ошибки + RET ;возврат + +;Адрес #2735. Установка кода ошибки OUT OF MEMORY для ПЗУ бейсика. + +x2735 LD A,3 ;код ошибки OUT IF RAM + JR x2731 ;установка кода ошибки + +;Адрес #2739. Проверка дорожки. В регистре D задайте физический номер дорожки. По окончании в #5CD6 получите число битых секторов на дорожке. + +x2739 XOR A ;дорожку проверять + LD (#5CD8),A + LD (#5CD6),A ;дефектных секторов пока не нашли + IN A,(#1F) ;сохраним состояние контроллера дисководов + LD (#5CCD),A + LD E,D ;перегрузка номера дорожки в E + PUSH DE ;сохранение номера дорожки + LD A,E ;помещение номера дорожки в регистр данных + OUT (#7F),A + LD A,#18 ;позиционирование + CALL x3D9A + LD A,(#5CCD) ;берем состояние контроллера до операции + AND #80 ;дисковод был готов? + CALL NZ,x3EA0 ;если нет, то задержка в 3135098 тактов + POP DE ;восстановление номера дорожки + CALL x207D ;проверка дорожки + LD A,(#5CD6) ;битых секторов нет? + OR A + RET Z ;если да, то возврат + LD A,7 ;дисковая ошибка + LD (#5D0F),A + RET ;возврат + +;Адрес #2766. Сообщения TR-DOS. + +x2766 DB "O.K." + DB 0 +x276B DB "Verify Error." + DB #8D +x2779 DB "BACKUP DISK" + DB #8D +x2785 DB "Insert Destination disk" + DB #D + DB "then press Y" + DB 0 +x27AA DB "Insert Source disk then press Y" + DB 0 +x27CA DB "*BREAK*" + DB #8D +x27D2 DB "Out of RAM" + DB #8D +x27DD DB "Array not found" + DB #8D +x27ED DB "Directory full" + DB #8D +x27FC DB "No disk" + DB #8D +x2804 DB "Stream opened" + DB #8D +x2812 DB "Not disk file" + DB #8D +x2820 DB "File exists" + DB #D + DB "Over write?(Y/N" + +x283B XOR C + +;Адрес #283C. Вызов подпрограмм TR-DOS из машинного кода. Вход: в регистре C код команды, остальное согласно описанию. На выходе в регистре BC код ошибки. + +x283C PUSH AF ;сохранение регистров + PUSH BC + LD (#5D04),DE + LD (#5D02),HL + CALL x20F1 ;если нужно, то изменение памяти + LD A,#FF + LD (#5D15),A ;сообщения не печатать + LD (#5D1F),A ;команда поступила из машинного кода + POP BC ;восстановление BC и AF + POP AF + LD HL,#201 ;по возврату пойдем в подпрограмму возврата в + LD (#5D1A),HL ;бейсик + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#5D1C),HL + DEC HL ;резервирование места для адреса возврата по + DEC HL ;ошибке из подпрограмм бейсика + LD SP,HL + PUSH AF ;сохранение AF + CALL x021D ;установка адреса возврата по ошибке из бейсика + LD HL,x288C ;берем адрес начала таблицы команд +x2869 LD A,(HL) ;берем код команды + CP C ;он совпал с требуемым? + JR NZ,x287F ;если нет, то берем код следующей команды + POP AF ;восстановление AF + INC HL ;берем адрес, по которому находится адрес подпрограммы + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + LD HL,x01D3 ;берем адрес подпрограммы завершения + PUSH HL ;кладем его на стек + PUSH DE ;кладем на стек адрес подпрограммы + LD HL,(#5D02) ;восстановление HL и DE + LD DE,(#5D04) + RET ;переход к подпрограмме +x287F CP #FF ;достигнут конец таблицы? + JR NZ,x2887 ;если нет, то берем адрес номера следующей подпрограммы + POP AF ;снятие AF со стека (этого можно было не делать) + JP x01D3 ;переход на подпрограмму завершения +x2887 INC HL ;пропуск двух байтов адреса подпрограммы + INC HL + INC HL + JR x2869 ;повтор + +x288C DB 0 ;таблица номеров и адресов подпрограмм + DW x08A7 ;new было x3D98 + DB 1 + DW x3DCB + DB 2 + DW x3E63 + DB 3 + DW x3F02 + DB 4 + DW x3F06 + DB 5 + DW x1E3D + DB 6 + DW x1E4D + DB 7 + DW x28D8 + DB 8 + DW x165C + DB 9 + DW x1664 + DB #A + DW x1CF0 + DB #B + DW x28FB + DB #C + DW x28F2 + DB #D + DW x01D3 + DB #E + DW x290F + DB #F + DW x01D3 + DB #10 + DW x01D3 + DB #11 + DW x01D3 + DB #12 + DW x2926 + DB #13 + DW x28E0 + DB #14 + DW x28E3 + DB #15 + DW x2739 + DB #16 + DW x1FEB + DB #17 + DW x1FF6 + DB #18 + DW x0405 + DB #FF ;признак конца таблицы + +;Адрес #28D8. Выдача каталога диска с настройкой. На входе в A задайте номер потока, в который будете выводить каталог. + +x28D8 PUSH AF ;сохранение номера потока + CALL x0405 ;настройка на диск + POP AF ;восстановление номера потока + JP x0479 ;вывод каталога + +;Адрес #28E0. Перемещение описателя файла из памяти в #5CDD. В HL задайте адрес описателя файла в памяти. + +x28E0 XOR A ;перемещаем из (HL) в #5CDD + JR x28E5 ;перемещение описателя + +;Адрес #28E3. Перемещение описателя файла из #5CDD в память по адресу, установленному в HL. Используется также с адреса #28E5 (перемещение описателя файла, в HL - адрес описателя в памяти, в A - направление перемещения: 0 - из памяти, иначе - в память). + +x28E3 LD A,#FF ;перемещаем в память +x28E5 LD DE,#5CDD ;установка второго адреса для LDIR + LD BC,#10 ;установка длины описателя + OR A ;установка направления перемещения + JR Z,x28EF + EX DE,HL +x28EF LDIR ;перемещение описателя файла + RET ;возврат + +;Адрес #28F2. Запись программы на бейсике. Установите #5CD1, #5CDD и #5CE5. + +x28F2 CALL x0405 ;настройка на диск + CALL x1AC4 ;проверка свободного места в каталоге + JP x1B27 ;запись программы + +;Адрес #28FB. Запись файла. Имя с расширением поместите в #5CDD, длину в DE, начало в HL. + +x28FB LD (#5CD7),HL ;установка начала + LD (#5CD9),DE ;установка действительной длины файла + LD (#5CDB),DE ;установка длины файла для каталога + CALL x0405 ;настройка на диск + CALL x1AC4 ;проверка наличия свободного места в каталоге + JP x1B53 ;запись файла + +;Адрес #290F. Загрузка/верификация файла а также чтение/запись сектора файла. Установите #5CDD, #5CE5, #5CD7 (только для чтения/записи сектора) и #5CF9; в A поместите флаг загрузки согласно описанию команды #E в HL и DE - старт и длину (в зависимости от аккумулятора). + +x290F OR A + LD (#5CD6),A ;установка флага загрузки + LD (#5CD9),HL ;установка адреса загрузки + LD (#5CDB),DE ;установка длины загрузки + CALL x1CB3 ;поиск файла + CALL x18A4 ;если файл найден, то чтение его описателя + CALL x18AB ;обработка параметров загрузки + JP x1921 ;загрузка файла + +;Адрес #2926. Стирание файла. Установите #5CDD и #5CE5. На выходе будут установлены #5D07 и #5D08. + +x2926 CALL x0405 ;настройка на диск + CALL x1CB3 ;поиск файла + JP x07A0 ;стирание его + +;Адрес #292F. Проверка наличия файла. Имя поместите на стек калькулятора и установите #5D06. Если файл найден, то в рег. C и в #5D1E и будет включен флаг Z, иначе флаг Z будет сброшен, а в C будет #FF. + +x292F CALL x1C57 ;установка имени файла + CALL x0405 ;настройка на диск + JP x1CB3 ;поиск файла и возврат + +;Адрес #2938. Печать имени файла с расширением. В HL установите адрес имени с расширением. + +x2938 PUSH BC ;сохранение BC + LD B,8 ;в имени файла 8 символов +x293B LD A,(HL) ;берем символ из имени файла + RST #10 ;печать его + INC HL ;адрес следующего символа + DJNZ x293B ;повтор до конца + LD A,"<" ;печать "<" + RST #10 + LD A,(HL) ;печать расширения + RST #10 + LD A,">" ;печать ">" + RST #10 + POP BC ;восстановление BC + RET ;возврат + +;Адрес #294A. Создание буфера, если его нет. Установите #5D0C. + +x294A PUSH HL ;сохранение регистров + PUSH DE + PUSH BC + PUSH AF + LD HL,#5D0C ;буфер есть? + LD A,(HL) + OR A + JR Z,x2992 ;если да, то восстановление регистров и возврат + PUSH HL ;сохранение адреса флага наличия буфера + LD BC,#101 ;длина буфера + PUSH BC ;сохранение ее + CALL x19FD ;проверка возможности выделения буфера + POP BC ;восстановление длины буфера + POP HL ;восстановление адреса его флага + LD (HL),0 ;буфер есть + LD HL,#5D25 ;начало буфера + CALL x1E32 ;выделение буфера + LD HL,(#5D11) ;командная строка переместилась на #101 байтов + LD BC,#101 + ADD HL,BC + JR x298F ;установка нового адреса командной строки и возврат + +;Адрес #2970. Удаление буфера, если он есть. Установите #5D0C. Используется также с адресов #298F и #2992 подпрограммой #294A. + +x2970 PUSH HL ;сохранение регистров + PUSH DE + PUSH BC + PUSH AF + LD HL,#5D0C ;буфера нет? + LD A,(HL) + OR A + JR NZ,x2992 ;если да, то возврат + LD (HL),#FF ;буфера нет + LD HL,#5D25 ;начало буфера + LD BC,#101 ;его длина + CALL x1E2E ;удаление области памяти + OR A ;командная строка переместилась на #101 байтов + LD BC,#101 ;надо поменять ее адрес + LD HL,(#5D11) + SBC HL,BC +x298F LD (#5D11),HL +x2992 POP AF ;восстановление регистров + POP BC + POP DE + POP HL + RET ;возврат + +;Адрес #2997. Выполнение команды "40". Установите #5D11 и #5C3B. Используется также с адреса: +;#2998 (выполнение команды установки типа дисковода; установите все для #2997 плюс в A тип дисковода). + +x2997 XOR A ;дисковод 40-дорожечный односторонний + +;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. + +x2998 LD (#5CD7),A ;сохранение типа дисковода + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x042B ;проверка второго символа строки + JP Z,x1D1A ;если это ENTER, то *ERROR* + CALL x3E11 ;берем адрес ячейки с типом дисковода + LD A,(#5CD7) ;установка типа дисковода + LD (HL),A + JP x03E1 ;сообщение O.K. + +;Адрес #29AE. Выполнение команды "80". Установите #5D11 и #5C3B. + +x29AE LD A,#80 ;дисковод 80-дорожечный односторонний + +;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. + + JR x2998 ;выполнение команды + +;Адрес #29B2. Тексты сообщений TR-DOS. + +x29B2 DB #D + DB "*ERROR*" + DB #8D +x29BB DB #D + DB "No space" + DB #8D +x29C5 DB #D + DB "File exists" + DB #8D +x29D2 DB " Free" + DB #8D +x29D8 DB #D + DB "Read Onl" + DB #F9 +x29E2 DB #D + DB "Disc Erro" + DB #F2 +x29ED DB #D + DB "Rec. O/" + DB #C6 +x29F7 DB "Title:" + DB #A0 +x29FE DB #D + DB "Retry,Abort,Ignore?" + DB 0 +x2A13 DB #D + DB "Trk" + DB #A0 +x2A18 DB " sec" + DB #A0 +x2A1D DB " Del. File" + DB #8D +x2A28 DB #D + DB "No" +x2A2B DB " File(s)" + DB #8D,#00 + +;Адрес #2A35. Перенос подпрограммы определение текущего ПЗУ по адресу #4080. + +x2A35 LD HL,x2A41 ;адрес подпрограммы определение текущего ПЗУ + LD DE,#4080 ;ее адрес в ОЗУ + LD BC,#20 ;ее длина - #20 байта + LDIR ;перенос подпрограммы + RET ;возврат + +;Адрес #2A41. Подпрограмма определения текущего ПЗУ. Устанавливает #5C01 и подключает ПЗУ 48-го бейсика. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. Можно использовать также с адреса: +;#2A53 для прямого вывода в любой порт. + +x2A41 LD A,(#3B5) ;берем байт из ПЗУ + CP #F3 ;это #F3? + LD A,#10 ;если да, то это ПЗУ 48-го бейсика + JR Z,x2A4B + XOR A ;иначе это ПЗУ 128-го бейсика +x2A4B LD (#5C01),A ;установка номера ПЗУ + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,#10 ;ПЗУ 48-го бейсика +x2A53 OUT (C),A ;установка ПЗУ + RET ;возврат + +;Адрес #2A56. Запись памяти на диск. + +x2A56 jp x0807 ;new +; PUSH AF ;сохранение регистров +; PUSH BC +; PUSH DE +x2A59 PUSH HL + PUSH IX + PUSH IY + EXX + PUSH BC + PUSH DE + PUSH HL + EX AF,AF' + PUSH AF + LD A,I + PUSH AF + LD A,R + PUSH AF + LD HL,0 + ADD HL,SP ;сохранение SP + PUSH HL + LD A,#3C ;выбор дисковода A и верхней стороны диска + OUT (#FF),A + LD A,#3F ;установка регистра I + LD I,A + IN A,(#1F) ;берем состояние контроллера + AND #80 + RRCA + RRCA + RRCA + LD (#5C01),A ;сохранение его + +;Ошибка!!! Нельзя портить память. + + CALL x2F65 ;восстановление + CALL x3EA0 ;задержка в 3135098 тактов + CALL x3EA0 ;еще раз + LD DE,#A ;сектор #A + LD HL,#4000 ;записывать с адреса #4000 + PUSH HL ;сохранение числа #4000 + CALL x2D73 ;запись сектора + LD HL,#4100 ;записывать с адреса #4100 + LD DE,#B ;сектор #B + CALL x2D73 ;запись сектора + POP HL ;восстановление числа #4000 + PUSH HL ;и снова сохранение + LD DE,8 ;сектор 8 + CALL x2F1B ;загрузка сектора + LD HL,#40E3 ;берем тип диска + LD A,(HL) + LD (#5C00),A ;сохраняем его + +;Ошибка!!! Опять порча памяти. + + INC HL ;берем количество файлов на диске + LD A,(HL) + INC (HL) ;записали еще 1 файл + +;Внимание!!! Не проверяется наличие свободного места в каталоге диска. + + INC HL ;берем количество свободного места на диске + LD E,(HL) + INC HL + LD D,(HL) + OR A ;сброс флага C + EX DE,HL + LD DE,#C0 ;уменьшим количество места на диске на #C0 + SBC HL,DE ;сектора + LD (#40E5),HL ;установка нового количества свободного места на диске + LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + CALL x2D73 ;запись сектора + POP HL ;восстановление адреса #4000 + LD DE,(#40E1) ;берем адрес свободного места на диске + PUSH DE ;сохраняем его + LD DE,#A ;сектор #A + CALL x2F1B ;загрузка сектора + POP DE ;восстановление адреса свободного места на диске + CALL x2D4C ;запись секторов + PUSH DE ;сохранение нового адреса свободного места на диске + LD A,#3C ;выбор дисковода A и верхней стороны диска + OUT (#FF),A + CALL x2F65 ;восстановление + LD HL,#4000 ;грузить с адреса #4000 + LD DE,8 ;сектор 8 + LD B,1 + CALL x2F1B ;загрузка сектора + POP DE ;восстановление нового адреса свободного места на диске + LD HL,(#40E1) ;берем старый адрес свободного места на диске + LD (#40E1),DE ;установка нового адреса + PUSH HL ;сохранение старого адреса + LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + LD B,1 + CALL x2D73 ;запись сектора + LD A,(#40E4) ;берем номер записанного файла + DEC A + CALL x2CE5 ;загрузка сектора с его описателем + LD (HL),"@" ;имя файла - "@" + INC HL + LD B,7 ;7 пробелов +x2B09 LD (HL)," " + INC HL + DJNZ x2B09 + LD (HL),"C" ;расширение файла - "C" + POP DE ;восстановление старого адреса свободного места на диске + POP BC ;и значения SP после сохранения регистров + INC HL ;установка значения SP после сохранения + LD (HL),C ;в поле адреса загрузки файла + INC HL + LD (HL),B + INC HL ;поле длины файла пропускаем + INC HL + INC HL + LD (HL),#C0 ;длина файла - #C0 сектора + INC HL + LD (HL),E ;установка адреса файла на диске + INC HL + LD (HL),D + LD HL,#4000 ;записывать с адреса #4000 + LD DE,0 + IN A,(#5F) ;берем номер сектора, в котором находится + DEC A ;описатель файла + LD E,A + LD B,1 + CALL x2D73 ;запись сектора + LD HL,0 ;сохранение SP + ADD HL,SP + LD (#4140),HL + LD SP,#41FF ;перенос стека в экран + CALL x2A35 ;перенос в экран подпрограммы определения текущего ПЗУ + LD HL,#C000 ;адрес страниц ОЗУ + XOR A ;начало вычисления контрольной суммы страницы +x2B3F ADD A,(HL) ;прибавление к сумме очередного байта + INC HL ;адрес следующего байта + LD B,A ;сохранение контрольной суммы + LD A,H ;берем старший байт текущего адреса в странице + OR A ;это 0? + LD A,B ;восстановление контрольной суммы + JR NZ,x2B3F ;если нет, то повтор + LD HL,#4100 ;сохранение контрольной суммы текущей + LD (HL),A ;страницы + PUSH HL ;сохранение ее адреса + LD HL,x2B58 ;адрес возврата - #2B58 + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + DI ;запрет прерываний + JP #4080 ;определение текущего ПЗУ +x2B58 POP HL ;восстановление адреса контрольной суммы текущей страницы + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,#AA ;контрольный байт + LD (#4130),A ;помещение его в экран + LD D,5 ;банк ОЗУ 5 + LD A,(#5C01) ;выбор ПЗУ + OR D + LD D,A + OUT (C),D ;выбор банка памяти + LD A,(#C130) ;берем адрес контрольного байта + CP #AA ;это #AA? + JP NZ,x2C1B ;если нет, то выход + LD A,D ;ОЗУ 0 + AND #F8 + LD D,A + INC HL ;адрес переменной с кодом текущего банка памяти + LD B,8 ;всего 8 страниц +x2B79 LD (HL),D ;установка банка + OUT (C),D ;выбор банка + XOR A ;начало вычисления контрольной суммы страницы + LD HL,#C000 ;адрес страниц ОЗУ +x2B80 ADD A,(HL) ;прибавление к сумме очередного байта + INC HL ;адрес следующего байта + LD E,A ;сохранение контрольной суммы + LD A,H ;берем старший байт текущего адреса в странице + OR A ;это 0? + LD A,E ;восстановление контрольной суммы + JR NZ,x2B80 ;если нет, то повтор + LD HL,#4100 ;адрес переменной с контрольной суммой текущей страницы + CP (HL) ;суммы совпадают? + INC HL ;адрес переменной с кодом текущего банка памяти + JR Z,x2B93 ;если да, то все + INC D ;следующая страница ОЗУ + DJNZ x2B79 ;повтор до конца + DEC D ;берем код текущего банка памяти +x2B93 LD B,8 ;всего 8 страниц +x2B95 PUSH BC ;сохранение числа страниц + CALL x2C37 ;запись страницы + POP BC ;восстановление числа страниц + DJNZ x2B95 ;повтор до конца + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D2A ;загрузка сектора 8 по адресу #4000 + LD A,(#40E4) ;берем количество файлов на диске + LD (#4102),A ;сохраняем его + INC A ;записали еще 1 файл + LD (#40E4),A ;установка нового количества файлов + LD HL,(#40E5) ;берем количество свободного места на диске + LD DE,1 ;уменьшаем его на 1 сектор + SBC HL,DE + LD (#40E5),HL ;установка нового количества свободного места на диске + RET C ;если места на диске нет, то возврат + +;Внимание!!! Куда возврат? Ведь на вершине стека находится сохраненные регистры R и F. + + LD HL,(#40E1) ;берем адрес свободного места на диске + LD (#411E),HL ;сохраняем его + CALL x2D1E ;установка имени файла + LD A,"8" ;восьмой файл + LD (#4111),A + LD A,1 ;его длина - 1 сектор + LD (#411D),A + LD HL,#4100 ;адрес загрузки - #4100 + LD (#4119),HL + LD HL,#100 ;длина - #100 байтов + LD (#411B),HL + LD DE,(#40E1) ;берем адрес свободного места на диске + CALL x2F65 ;восстановление + LD C,D ;берем номер дорожки + CALL x2F3A ;позиционирование + LD HL,#4100 ;записывать с адреса #4100 + LD B,1 ;1 сектор + CALL x2D58 ;запись сектора + LD (#40E1),DE ;установка нового адреса свободного места на диске + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D34 ;запись сектора 8 с адреса #4000 + LD A,(#4102) ;берем номер записанного файла + CALL x2CE5 ;загрузка сектора с его описателем + LD DE,#4110 ;замена описателя файла + LD BC,#10 + EX DE,HL + LDIR + IN A,(#5F) ;берем номер загруженного сектора + DEC A + LD E,A + LD D,0 + LD HL,#4000 ;записывать с адреса #4000 + CALL x2D73 ;запись сектора + LD BC,#7FFD ;адрес порта конфигурации системы + LD A,(#4101) ;берем код текущего банка памяти + OUT (C),A ;установка его +x2C1B LD HL,(#4140) ;восстановление SP + LD SP,HL + LD HL,#4000 ;загружать с адреса #4000 + LD DE,#A ;сектор #A + CALL x2F1B ;загрузка сектора + LD HL,#4100 ;загружать с адреса #4100 + LD DE,#B ;сектор #B + CALL x2F1B ;загрузка сектора + LD A,#3C ;помещение на стек числа #3C + PUSH AF + JP x2EBC ;восстановление регистров и возврат + +;Адрес #2C37. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы плюс 1 и установите #5C00 и #4101. + +x2C37 LD A,B ;берем номер страницы + DEC A + LD (#4103),A ;установка его + LD B,A ;сохранение его + LD A,(#4101) ;берем номер текущей страницы + AND 7 + CP B ;записываем ее? + RET Z ;если да, то возврат + LD A,2 ;записываем страницу 2? + CP B + RET Z ;если да, то возврат + LD A,(#4101) ;берем код текущего банка памяти + AND 8 ;текущий экран 0? + JR Z,x2C55 ;если да, то не записываем страницу 5 + LD A,B ;записываем страницу 7? + CP 7 + RET Z ;если да, то возврат + JR x2C59 ;запись страницы +x2C55 LD A,B ;записываем страницу 5? + CP 5 + RET Z ;если да, то возврат +x2C59 CALL x2C5D ;запись страницы + RET ;возврат + +;Адрес #2C5D. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы и установите #5C00 и #4101. + +x2C5D LD HL,#4101 ;берем код текущего банка памяти + LD A,(HL) + AND #F8 ;оставляем экран и ПЗУ + LD C,A + LD A,B ;вычисление байта для порта конфигурации + OR C ;системы + PUSH BC ;сохранение кода текущего банка памяти + LD BC,#7FFD ;адрес порта конфигурации + OUT (C),A ;установка банка памяти + POP BC ;восстановление кода текущего банка + LD HL,#C000 ;адрес страницы +x2C70 LD A,(HL) ;берем байт из страницы + OR A ;это 0? + JR NZ,x2C7A ;если нет, то запись страницы + INC HL ;следующий байт + LD A,H ;конец страницы? + OR A + JR NZ,x2C70 ;если нет, то повтор + RET ;возврат +x2C7A CALL x2C7E ;запись страницы + RET ;возврат + +;Адрес #2C7E. Запись страницы ОЗУ. Установите #4103 и #5C00. + +x2C7E LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D2A ;загрузка сектора 8 по адресу #4000 + LD A,(#40E4) ;берем количество файлов на диске + LD (#4102),A ;сохраняем его + INC A ;записали 1 файл + LD (#40E4),A + LD HL,(#40E5) ;берем количество свободного места на диске + LD DE,#40 ;уменьшаем его на #40 секторов + SBC HL,DE + LD (#40E5),HL ;установка нового количества свободного места + RET C ;если места нет, то возврат + LD HL,(#40E1) ;берем адрес свободного места на диске + LD (#411E),HL ;установка адреса файла на диске + CALL x2D1E ;установка имени файла + LD A,#40 ;размер файла - #40 секторов + LD (#411D),A + LD HL,#C000 ;адрес загрузки - #C000 + LD (#4119),HL + LD HL,#4000 ;длина - #4000 байта + LD (#411B),HL + LD DE,(#40E1) ;берем адрес свободного места на диске + CALL x2D3E ;запись файла + LD (#40E1),DE ;установка нового адреса свободного места + LD C,0 ;дорожка 0 + CALL x2F3A ;позиционирование + CALL x2D34 ;запись сектора 8 с адреса #4000 + LD A,(#4102) ;восстановление номера файла + CALL x2CE5 ;загрузка сектора с описателем файла + LD DE,#4110 ;замена описателя файла + LD BC,#10 + EX DE,HL + LDIR + IN A,(#5F) ;берем номер загруженного сектора + DEC A + LD E,A + LD D,0 + LD HL,#4000 ;записывать с адреса #4000 + CALL x2D73 ;запись сектора + RET ;возврат + +;Адрес #2CE5. Загрузка по адресу #4000 Номер файла поместите в A. На выходе в HL будет адрес описателя файла. + +x2CE5 LD C,A ;сохранение номера файла + AND #F0 ;вычисление номера сектора с описателем файла + RRCA + RRCA + RRCA + RRCA + LD B,A + PUSH BC + LD E,B + LD D,0 + LD HL,#4000 ;загружать с адреса #4000 + PUSH DE ;сохранение номера сектора + CALL x2F1B ;загрузка сектора + POP DE ;восстановление номера сектора + POP BC ;и номера файла + LD B,0 + LD A,C ;вычисление относительного адреса описателя + AND #F ;файла в секторе + RLCA + RLCA + RLCA + RLCA + LD HL,#4000 ;вычисление абсолютного адреса + ADD A,L + LD L,A + RET ;возврат + +;Адрес #2D09. Помещение имени и расширения файла "@"CODE по адресу #4110. + +x2D09 LD HL,#4110 ;адрес имени файла + LD B,9 ;длина области - 9 байтов +x2D0E LD (HL)," " ;очистка области + INC HL + DJNZ x2D0E + LD A,"@" ;имя файла - "@" + LD (#4110),A + LD A,"C" ;расширение файла - "C" + LD (#4118),A + RET ;возврат + +;Адрес #2D1E. Установка имени файла страницы. Установите #4103. Имя файла будет находиться по адресу #4110. + +x2D1E CALL x2D09 ;установка имени главного файла + LD A,(#4103) ;берем номер страницы + ADD A,"0" ;преобразование его в символ + LD (#4111),A ;установка номера страницы + RET ;возврат + +;Адрес #2D2A. Загрузка сектора 8 по адресу #4000. Спозиционируйте головку. + +x2D2A LD HL,#4000 ;грузить по адресу #4000 + LD DE,8 ;сектор 8 + CALL x2F1B ;загрузка сектора + RET ;возврат + +;Адрес #2D34. Запись сектора 8 с адреса #4000. Спозиционируйте головку. + +x2D34 LD HL,#4000 ;записывать с адреса #4000 + LD DE,8 ;сектор 8 + CALL x2D73 ;запись сектора + RET ;возврат + +;Адрес #2D3E. Запись #40-х секторов с адреса #C000. Установите все для #2D4C. + +x2D3E CALL x2F65 ;восстановление + LD C,D ;берем номер первой дорожки + CALL x2F3A ;позиционирование + LD HL,#C000 ;записывать с адреса #C000 + LD B,#40 ;#40 секторов + JR x2D58 ;запись секторов и возврат + +;Адрес #2D4C. Запись #C0 секторов с адреса #4000 для подпрограммы MAGIC. В DE поместите адрес на диске и установите #5C00. Используется также с адреса: +;#2D58 (запись секторов; в HL поместите адрес в памяти, в DE - адрес на диске, в B ? количество секторов, установите #5C00 и спозиционируйте головку на первую дорожку). + +x2D4C CALL x2F65 ;восстановление + LD C,D ;берем номер первой дорожки + CALL x2F3A ;позиционирование + LD HL,#4000 ;записывать с адреса #4000 + LD B,#C0 ;#C0 секторов +x2D58 PUSH BC ;сохранение количества секторов + PUSH DE ;и адреса на диске + CALL x2D73 ;запись сектора + LD DE,#100 ;адрес следующего сектора в памяти + ADD HL,DE + POP DE ;восстановление адреса на диске + INC E ;следующий сектор + LD A,E ;конец дорожки? + CP #10 + JR NZ,x2D6F ;если да, то + LD E,0 ;текущий сектор 0, + INC D ;следующая дорожка, + LD C,D + CALL x2F3A ;позиционирование +x2D6F POP BC ;восстановление количества секторов + DJNZ x2D58 ;повтор до конца + RET ;возврат + +;Адрес #2D73. Запись сектора для команды GO TO. В HL поместите адрес записи, в E - номер сектора. + +x2D73 LD A,E ;установка номера сектора + INC A + OUT (#5F),A + PUSH HL ;сохранение адреса записи + LD D,#14 ;20 попыток + PUSH DE ;сохранение числа попыток +x2D7B DI ;запрет прерываний + LD C,#7F ;адрес регистра данных контроллера + LD A,#A0 ;команда записи сектора + OUT (#1F),A + CALL x3FCA ;запись байтов + POP DE ;восстановление количества попыток + POP HL ;и адреса записи сектора + IN A,(#1F) ;берем состояние контроллера + AND #7F ;все в порядке? + RET Z ;если да, то возврат + DEC D ;следующая попытка + PUSH HL ;сохранение адреса записи сектора + PUSH DE ;и количества попыток + JR NZ,x2D7B ;если попытки не кончились, то повтор + +;Внимание!!! Самая большая ошибка!!! Диск с заклеенной прорезью защиты от записи будет, скорее всего, испорчен. Подробное объяснение вы найдете в ZX-PЕВЮ #5F/4 на странице #23. + + HALT ;остановка процессора + +;Адрес #2D92. Загрузка секторов. Установите #5CE6, #5CEB и #5CEA. + +x2D92 LD HL,(#5CE6) ;берем адрес загрузки + LD DE,(#5CEB) ;берем адрес секторов на диске + LD A,(#5CEA) ;берем количество секторов + LD B,A + CALL x1E3D ;загрузка секторов + RET ;возврат + +;Адрес #2DA1. Выполнение команды GO TO. Установите #5D11 и #5C3B. Можно использовать также с адреса #2E27 (GO TO для 48К; параметры, как и для #2DA1). Используется также с адреса #2EBC для возврата из подпрограммы обработки немаскируемого прерывания. + +x2DA1 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + +;Зачем это нужно? Ведь MAGIC записывает файлы только с расширением C. + + CALL x1C57 ;установка имени файла + LD (#4020),BC ;сохранение длины имени файла + LD A,C ;она равна 8 символам? + CP 8 + JR NC,x2DD2 ;если да, то работа с 48К + CALL x0405 ;настройка на диск + CALL x1CB3 ;поиск файла + JP NZ,x03D9 ;если не нашли, то NO FILE + LD HL,#5CDD ;берем адрес имени файла + LD BC,(#4020) ;и его длину + +;Зачем портить экран без надобности? Ведь длину имени файла можно сохранять и в другом месте. + + ADD HL,BC ;вычисляем адрес конца имени файла + LD (HL),"8" ;прибавление "8" к имени файла + PUSH HL ;сохранение адреса этого символа + CALL x1CB3 ;поиск файла + POP HL ;восстановление последнего символа имени файла + JR Z,x2DD8 ;если файл нашелся, то загрузка страниц + LD (HL)," " ;восстановление имени главного файла +x2DD2 CALL x1CB3 ;поиск файла + JP x2E33 ;загрузка файла +x2DD8 CALL x165D ;чтение описателя файла + CALL x2D92 ;загрузка файла + LD SP,#40FF ;перенос стека + LD B,8 ;всего 8 страниц +x2DE3 PUSH BC ;сохранение номера файла страницы + LD A,B + LD BC,#7FFD ;адрес порта конфигурации системы + DEC A ;страницы считаем с 0 + PUSH AF ;сохранение номера страницы + OR #10 ;экран 0, ПЗУ 1 + OUT (C),A ;установка страницы + POP AF ;восстановление номера страницы + ADD A,"0" ;вычисление последнего символа имени файла страницы + LD HL,#5CDD ;вычисление адреса для этого символа + LD BC,(#4020) + ADD HL,BC + LD (HL),A ;установка последнего символа имени файла страницы + CALL x1CB3 ;поиск файла + JR NZ,x2E05 ;если не нашли, то загрузка следующей страницы + CALL x165D ;чтение описателя файла + CALL x2D92 ;загрузка файла + +;Внимание!!! При ответе A на вопpос "DISC ERROR. RETRY,ABORT,IGNORE?", может произойти что угодно, если значение ERR_SP больше #C000, так как старый стек будет затираться загружаемым файлом или находиться в другой странице. + +x2E05 POP BC ;восстановление номера файла страницы + DJNZ x2DE3 ;повтор до конца + LD A," " ;восстановление имени главного файла + LD HL,#5CDD + LD BC,(#4020) + ADD HL,BC + LD (HL),A + CALL x1CB3 ;поиск файла + CALL x165D ;чтение описателя файла + PUSH BC ;сохранение номера файла + PUSH AF ;и AF + LD BC,#7FFD ;адрес порта конфигурации + LD A,(#4101) ;берем его значение в момент записи файла (из восьмого файла) + OUT (C),A ;установка рабочего состояния порта + POP AF ;востановление номера файла и AF + POP BC + JR x2E39 ;загрузка главного файла +x2E27 CALL x1DDF ;прием имени файла на стек калькулятора + CALL x1D75 ;если идет проверка на синтаксис, то возврат + CALL x102E ;прием расширения файла + CALL x292F ;поиск файла +x2E33 JP NZ,x03D9 ;если он не найден, то NO FILE + CALL x165D ;чтение его описателя +x2E39 LD A,(#5CDD) ;берем первый символ имени файла + CP "$" ;это "$"? + DI ;запрет прерываний + JR NZ,x2E43 ;если да, то + IM 2 ;установка второго режима прерываний +x2E43 LD SP,#40F0 ;перенос стека + CALL x3E11 ;берем тип дисковода + LD (#4010),A ;сохраняем его + LD A,(#5D16) ;сохранение копии системного регистра, + LD (#4011),A + LD HL,(#5CE6) ;адреса стека для программы, + PUSH HL + LD DE,(#5CEB) ;и адреса файла на диске + PUSH DE + INC E ;первый сектор файла пока не загружаем + LD A,E + CP #10 + JR NZ,x2E64 + LD E,0 + INC D +x2E64 LD C,D ;берем логический номер дорожки + CALL x2F07 ;выбор верхней стороны диска + LD A,(#4010) ;берем режим дисковода + AND 2 ;дисковод двухсторонний? + CALL NZ,x2F0F ;если да, то выбор стороны диска + LD A,C ;берем физический номер дорожки + CALL x2F50 ;позиционирование + LD HL,#4100 ;загружать с адреса #4100 + LD B,#BF ;#BF секторов +x2E79 PUSH BC ;сохранение количества секторов + PUSH DE ;и адреса текушего сектора на диске + CALL x2F1B ;загрузка сектора + LD DE,#100 ;вычисление адреса загрузки следующего сектора + ADD HL,DE + POP DE ;восстановление адреса текушего сектора на диске + INC E ;следующий сектор + LD A,E ;конец дорожки? + CP #10 + JR NZ,x2E9C ;если нет, то продолжение загрузки + LD E,0 ;сектор 0 + INC D ;следующая дорожка + LD C,D + CALL x2F07 ;позиционирование (смотрите выше) + LD A,(#4010) + AND 2 + CALL NZ,x2F0F + LD A,C + CALL x2F50 +x2E9C POP BC ;восстановление количества секторов + DJNZ x2E79 ;повтор до конца + POP DE ;восстановление адреса файла на диске + POP HL ;и адреса стека + LD SP,HL ;установка стека + LD A,(#4011) ;берем копию системного регистра + PUSH AF ;сохраняем ее + LD C,D ;позиционирование (смотрите выше) + CALL x2F07 + LD A,(#4010) + AND 2 + CALL NZ,x2F0F + LD A,C + CALL x2F50 + LD HL,#4000 ;адрес загрузки первого сектора файла + CALL x2F1B ;загрузка сектора +x2EBC POP AF ;востановление копии системного регистра + EX AF,AF' ;и снова сохранение + POP AF ;восстановление регистров R и I + LD R,A + POP AF + LD I,A + DI ;запрет прерываний + LD A,#FF ;установка флага прерываний + JP PO,x2ECC + LD A,0 +x2ECC LD (#5C00),A + POP AF ;восстановление регистров + POP HL + POP DE + POP BC + EXX + EX AF,AF' + POP IY + POP IX + POP HL + POP DE + POP BC + LD A,(#5C48) ;установка цвета бордюра + AND #38 + RRCA + RRCA + RRCA + nop ;new + nop ;new +; OUT (#FE),A + LD A,(#5B08) ;берем байт из #5B08 + CP #EE ;там #EE? + JR NZ,x2EF7 ;если нет, то системных переменных 128К нет + +;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. + + PUSH BC ;сохранение BC + LD BC,#7FFD ;адрес порта конфигурации + LD A,(#5B5C) ;берем значение переменной BANK_M + OUT (C),A ;установка рабочей страницы + POP BC ;восстановление BC +x2EF7 LD A,(#5C00) ;берем флаг прерываний + OR A ;прерывания разрешать? + LD A,#C9 ;установка переключателя ПЗУ на бейсик + LD (#5C00),A + JR NZ,x2F03 ;если в #5C00 был 0, то + EI ;разрешение прерываний +x2F03 POP AF ;восстановление AF + JP #5C00 ;запуск программы + +;Адрес #2F07. Выбор верхней стороны диска для команды GO TO. Установите #4011. Можно использовать также с адреса: +;#2F0C для прямого вывода в порт #FF. + +x2F07 LD A,(#4011) ;берем копию системного регистра + OR #3C ;сторона - верхняя +x2F0C OUT (#FF),A ;загрузка системного регистра + RET ;возврат + +;Адрес #2F0F. Выбор верхней стороны диска для команды GO TO. Вход: установите #4011, поместите в C логический номер дорожки и выберите верхнюю сторону диска. Выход: в C будет физический номер дорожки и выбрана сторона диска. + +x2F0F LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + RET NC ;если дорожка четная, то возврат + LD A,(#4011) ;берем копию системного регистра + AND #6F ;сторона - нижняя + JR x2F0C ;загрузка системного регистра и возврат + +;Адpес #2F1B. Чтение сектора для команды GO TO. В HL поместите адрес загрузки, в E - номер сектора. + +x2F1B LD A,E ;установка номера сектора + INC A + OUT (#5F),A + PUSH HL ;сохранение адреса загрузки + LD D,#14 ;20 попыток + PUSH DE ;сохранение числа попыток +x2F23 DI ;запрет прерываний + LD C,#7F ;адрес регистра данных контроллера + LD A,#80 ;команда чтения сектора + OUT (#1F),A + CALL x3FE5 ;чтение байтов + POP DE ;восстановление количества попыток + POP HL ;и адреса загрузки сектора + IN A,(#1F) ;берем состояние контроллера + AND #7F ;все в порядке? + RET Z ;если да, то возврат + DEC D ;следующая попытка + PUSH HL ;сохранение адреса загрузки сектора + PUSH DE ;и количества попыток + JR NZ,x2F23 ;если попытки не кончились, то повтор + HALT ;остановка процессора + +;Адрес #2F3A. Позиционирование для подпрограммы MAGIC. Логический номер дорожки поместите в C и установите #5C00. Используется также с адресов: +;#2F50 - позиционирование для команды GO TO. Поместите в A физический номер дорожки. +;#2F57 - выдача команды и ожидание INTRQ. Команду поместите в A. + +x2F3A LD A,#3C ;выбор верхней стороны диска + OUT (#FF),A + LD A,(#5C00) ;берем тип дисковода + AND 8 ;он двухсторонний? + JR NZ,x2F4F ;если нет, то позиционирование + LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + JR NC,x2F4F ;если дорожка четная, то позиционирование + LD A,#2C ;выбор нижней стороны диска + OUT (#FF),A +x2F4F LD A,C +x2F50 OUT (#7F),A ;загрузка номера дорожки в регистр данных + CALL x3DFD ;задержка в 725779 тактов + LD A,#18 ;new команда позиционирования +x2F57 OUT (#1F),A +x2F59 IN A,(#FF) ;ожидание сигнала INTRQ + AND #80 + JR Z,x2F59 + PUSH BC ;сохранение BC + CALL x3DFD ;задержка в 725779 тактов + POP BC ;восстановление BC + RET ;возврат + +;Адрес #2F65. Восстановление для подпрограммы MAGIC. + +x2F65 LD A,#08 ;new команда восстановления + JR x2F57 ;выдача команды, ожидание INTRQ и возврат + +;Адрес #2F69. Подпрограмма обработки ошибок, поступающих из ПЗУ бейсика. Установите #5C3A и все для подпрограммы #1D3. + +x2F69 LD HL,(#5D1C) ;очистка стека + DEC HL + DEC HL + LD SP,HL + JP x1D2F ;выдача сообщения и завершение + +;Адрес #2F72. Вызов подпрограмм из ПЗУ бейсика. Адрес задайте в двух байтах после CALL #2F72: +;CALL #2F72 +;DW #0D6B + +x2F72 LD (#5D02),HL ;сохранение HL и DE + LD (#5D04),DE + POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы + LD E,(HL) ;берем адрес подпрограммы + INC HL + LD D,(HL) + INC HL + PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую #2F72 + LD HL,x3D2F ;помещение на стек адреса переключателя ПЗУ на TR-DOS + PUSH HL + PUSH DE ;помещение на стек адреса вызываемой подпрограммы + LD HL,#5CC2 ;помещение на стек адреса команды RET в ОЗУ + PUSH HL + LD HL,(#5D02) ;восстановление HL и DE + LD DE,(#5D04) + RET ;переход к команде RET в ОЗУ + +;Адрес #2F90. Установка начальных значений системных пеpеменных TR-DOS. В переменные помещает: +;в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16, #5D0C - #FF; #5D17 - #5D19, #5D1F - 0; #5CC2 - #C9; в системный регистр помещается #FF и выполняется команда прерывания. Подпрограмма может использоваться также с адреса: +;#2FC3 для прямого вывода в порт #1F. + +x2F90 LD HL,#0000 ;new было #FFFF + LD (#5CFA),HL ;типы дисководов неизвестны + LD (#5CFC),HL + call x08CA ;new + LD (#5CC8),HL ;время перемещения головок дисководов +; LD (#5CCA),HL ;неизвестно + XOR A + LD (#5D17),A ;заставку выводить + LD (#5D19),A ;дисковод по умолчанию - A: + LD (#5D18),A ;память не изменять + LD (#5D0F),A ;pаботает командный процессор TR-DOS + LD (#5D1F),A + LD A,#FF ;загрузка системного регистра + OUT (#FF),A + LD (#5C3A),A ;ошибки нет + LD (#5D16),A ;сохранение значения системного регистра + LD (#5D0C),A ;буфера нет + LD A,#C9 ;помещение в ОЗУ команды RET + LD (#5CC2),A + LD A,#D0 ;команда прерывания +x2FC3 OUT (#1F),A ;выдача команды + RET ;возврат + +;Адрес #2FC6. Проверка достижения конца каталога при его печати. + +x2FC6 CALL x050C ;проверка и обработка достижения конца буфера + LD A,(HL) ;берем первый символ имени файла + OR A ;конец каталога? + JP Z,x03AC ;если да, то окончание выдачи + CP 1 ;файл стерт? + CALL Z,x0507 ;если да, то пропуск его + RET NZ ;иначе возврат + JR x2FC6 ;повтор + +;Адрес #2FD6. Загрузка сектора в буфер. В DE поместите адрес сектора на диске. + +x2FD6 LD B,1 ;загружать 1 сектор + LD HL,#5D25 ;загружать в буфер + JP x1E67 ;загрузка сектора + +;Адрес #2FDE. Загрузка конца файла. В HL - адрес загрузки, в #5CDC - длина, в #5CF4 - откуда грузить. + +x2FDE PUSH HL ;сохранение адреса загрузки + LD DE,(#5CF4) ;берем адрес сектора на диске + CALL x2FD6 ;загрузка его в буфер + LD A,(#5CDB) ;берем количество байтов для загрузки + POP DE ;восстановление адреса загрузки + OR A ;загружаем 0 байтов? + RET Z ;если да, то возврат + LD C,A ;перевод длины загружаемой части в двухбайтную форму + LD HL,#5D25 ;перемещаем байты из буфера + LDIR + RET ;возврат + +;Адрес #2FF3. Таблица команд TR-DOS. + +x2FF3 DB #CF,"*",#D0,#D1,#E6,#D2,#EF,#F8,#FE,#BE,#F4,#D5,#F7 + DB #D3,#D4,#FF,"4",#EC,"8",#F0,#D6 + +;Адрес #3008. Таблица адресов подпрограмм, выполняющих команды TR-DOS. + +x3008 DW x0433,x1018,x1EC2,x16AB,x053A,x0787,x1815,x1AD0,x1CFB,x19A5 + DW x19A9,x19B1,x1D4D,x2182,x2656,x0690,x2997,x2DA1,x29AE,x11CE + DW x1810 + +;Адрес #3032. Сжатие командной строки. Строку поместите в буфер редактора. Помещает в #5CD6 #FF и устанавливает #5D11. + +x3032 LD HL,(#5C59) ;берем адрес буфера редактора + LD (#5D11),HL ;установка адреса командной строки + LD (#5CD9),HL ;установка адреса текущего символа + LD A,#FF ;подана прямая команда + LD (#5CD6),A + LD HL,#5CDB ;любой адрес + LD (#5CD7),HL + JR x3057 ;сжатие строки и возврат + +;Адрес #3048. Сжатие командной строки. В HL поместите адрес строки. Устанавливает #5CD6 и #5D11. Используется также с адреса: +;#3057 (сжатие строки; установите #5CD6, #5CD7 и #5CD9). + +x3048 LD (#5D11),HL ;установка адреса строки + LD (#5CD9),HL ;и адреса текущего ключевого слова + CALL x30E1 ;проверка, где находится строка + RET NZ ;если строка не найдена, то возврат + INC HL ;вычисление адреса поля длины строки + INC HL + LD (#5CD7),HL ;установка адреса поля длины строки +x3057 CALL x30A9 ;определение номера ключевого слова + JR NZ,x3087 ;если это не ключевое слово, то следующий символ + EX DE,HL ;переброска адреса последнего символа ключевого слова в DE + INC DE ;вычисление адреса символа после ключевого слова + LD B,0 ;перевод номера ключевого слова в 2-х байтную форму + LD HL,x31C8 ;адрес таблицы кодов ключевых слов + ADD HL,BC ;вычисление адреса кода ключевого слова + LD A,(HL) ;берем этот код + LD HL,(#5CD9) ;берем адрес ключевого слова + LD (HL),A ;замена его одним символом + INC HL ;вычисление адреса второго символа ключевого слова + EX DE,HL ;переброска его в DE + RST #20 ;вычисление количества стираемых символов + DW #19DD + PUSH BC ;сохранение его + RST #20 ;уничтожение ненужных символов + DW #19E8 + POP BC ;восстановление количества стертых символов + LD A,(#5CD6) ;строка находится в программе на бейсике? + OR A + JR NZ,x3087 ;если нет, то ее длина нигде не обозначена + LD HL,(#5CD7) ;берем адрес поля длины строки + LD E,(HL) ;берем длину строки + INC HL + LD D,(HL) + EX DE,HL ;перебросим ее в HL + OR A + SBC HL,BC ;скорректируем ее + EX DE,HL ;перебросим в DE + LD (HL),D ;и загрузим обратно + DEC HL + LD (HL),E +x3087 LD HL,(#5CD9) ;берем адрес текущего символа + LD A,(HL) ;берем этот символ + CP #D ;это ENTER? + RET Z ;если да, то возврат + INC HL ;следующий символ + LD (#5CD9),HL + LD A,(HL) ;берем его + CP #D ;это ENTER? + RET Z ;если да, то возврат + CP #22 ;это кавычки? + JR NZ,x3057 ;если нет, то повтор +x309A INC HL ;следующий символ + LD A,(HL) ;берем его + CP #D ;это ENTER? + RET Z ;если да, то возврат + CP #22 ;это кавычки? + JR NZ,x309A ;если нет, то следующий символ + INC HL ;следующий символ + LD (#5CD9),HL + JR x3057 ;повтор + +;Адрес #30A9. Определение номера ключевого слова. Установите #5CD9. После возврата если флаг Z установлен, то в C будет номер ключевого слова, а в HL - адрес последнего символа ключевого слова; иначе ключевое слово не было опознано, а в HL будет адрес из #5CD9. + +x30A9 LD HL,(#5CD9) ;берем адрес ключевого слова в строке + LD DE,x30FD ;адрес таблицы ключевых слов + LD C,0 ;начнем со слова 0 +x30B1 LD A,(HL) ;берем символ слова из нашей строки + AND #DF ;буква заглавная + LD B,A ;загрузка символа в B + OR A ;это CHR$ 0? + JR NZ,x30BB ;если да, то + INC HL ;следующий символ + JR x30B1 ;и повтор +x30BB LD A,(DE) ;берем символ из таблицы + AND #80 ;его бит 7 включен? + JR NZ,x30C8 ;если да, то этот символ последний + LD A,(DE) ;снова берем символ из таблицы + CP B ;сравнение символов + JR NZ,x30D9 ;если они не совпадают, то проверка следующего слова + INC HL ;адреса следующих символов + INC DE + JR x30B1 ;повтор +x30C8 LD A,(DE) ;берем символ из таблицы + AND #7F ;сбрасываем бит 7 + CP B ;сравниваем символы + RET Z ;если они совпали, то возврат +x30CD INC C ;номер следующего слова + LD HL,(#5CD9) ;берем адрес ключевого слова в строке + INC DE ;следующий символ из таблицы + LD A,(DE) + CP #FF ;конец таблицы? + JR NZ,x30B1 ;если нет, то повтор + OR A ;сброс флага Z + RET ;возврат +x30D9 INC DE ;следующий символ из таблицы + LD A,(DE) + AND #80 ;его бит 7 включен? + JR Z,x30D9 ;если да, то следующий символ + JR x30CD ;проверка достижения конца таблицы + +;Адрес #30E1. Проверка местонахождения строки. Устанавливает #5CD6, а в HL помещает адрес поля длины строки минус 2. + +x30E1 LD HL,(#5C45) ;берем номер выполняющейся строки + INC HL ;подана прямая команда? + INC HL + LD A,H + OR L + JR Z,x30F4 ;если да, то установка флага + XOR A ;команда находится в строке программы на бейсике + LD (#5CD6),A + DEC HL ;восстановление номера строки + DEC HL + RST #20 ;определение адреса строки + DW #196E + RET ;возврат +x30F4 LD A,#FF ;подана прямая команда + LD (#5CD6),A + LD HL,(#5C59) ;любой адрес + RET ;возврат + +;Адрес #30FD. Таблица ключевых слов TR-DOS. + +x30FD DB "SAVE" + DB #80 + DB "SAV" + DB #C5 + DB "LOAD" + DB #80 + DB "LOA" + DB #C4 + DB "RUN" + DB #80 + DB "RU" + DB #CE + DB "CAT" + DB #80 + DB "CA" + DB #D4 + DB "ERASE" + DB #80 + DB "ERAS" + DB #C5 + DB "NEW" + DB #80 + DB "NE" + DB #D7 + DB "MOVE" + DB #80 + DB "MOV" + DB #C5 + DB "MERGE" + DB #80 + DB "MERG" + DB #C5 + DB "PEEK" + DB #80 + DB "PEE" + DB #CB + DB "POKE" + DB #80 + DB "POK" + DB #C5 + DB "OPEN" + DB #83 + DB "CLOSE" + DB #83 + DB "CODE" + DB #80 + DB "COD" + DB #C5 + DB "RND" + DB #80 + DB "RN" + DB #C4 + DB "DATA" + DB #80 + DB "DAT" + DB #C1 + DB "SCREEN" + DB 4,#84 + DB "SCREEN" + DB #84 + DB "COPY" + DB #80 + DB "COP" + DB #D9 + DB "FORMAT" + DB #80 + DB "FORMA" + DB #D4 + DB "GOTO" + DB #80 + DB "GOT" + DB #CF + DB "LIST" + DB #80 + DB "LIS" + DB #D4 + DB "LINE" + DB #80 + DB "LIN" + DB #C5 + DB "VERIFY" + DB #80 + DB "VERIF" + DB #D9 + DB #FF,#FF + +;Адрес #31C8. Таблица кодов ключевых слов TR-DOS. + +x31C8 DB #F8,#F8,#EF,#EF,#F7,#F7,#CF,#CF,#D2,#D2,#E6,#E6,#D1 + DB #D1,#D5,#D5,#BE,#BE,#F4,#F4,#D3,#D4,#AF,#AF,#A5,#A5 + DB #E4,#E4,#AA,#AA,#FF,#FF,#D0,#D0,#EC,#EC,#F0,#F0,#CA + DB #CA,#D6,#D6,0 + +;Адрес #31F3. Проверка наличия системных переменных TR-DOS. Если они есть, то флаг C будет сброшен, иначе установлен. + +x31F3 LD HL,(#5C4F) ;берем адрес области описателей каналов + OR A ;для правильного вычитания + LD BC,#5D25 ;адрес области описателей каналов при наличии системных переменных TR-DOS. + SBC HL,BC ;установка флага C + RET ;возврат + +x31FD DISPLAY "Free space at ",$,": ",/D,#3201-$," byte(s)" + DS #3201-$,#FF + +x3201 ld hl,x3219 + ld de,#FCA0 + ld bc,#0318 + ld a,#FF + jr x3210 +x320E inc hl + inc hl +x3210 cp l + jr z,x320E + ldi + jp pe,x3210 + ret + +;шрифт +x3219 db #00,#00,#00,#00,#00,#00,#00,#00 + db #00,#20,#20,#20,#20,#20,#00,#20 + db #00,#50,#50,#00,#00,#00,#00,#00 + db #00,#00,#50,#F8,#50,#F8,#50,#00 + db #00,#20,#70,#A0,#70,#28,#70,#20 + db #00,#40,#48,#10,#20,#48,#08,#00 + db #00,#20,#50,#50,#60,#A8,#90,#68 + db #00,#20,#40,#00,#00,#00,#00,#00 + db #00,#08,#10,#10,#10,#10,#10,#08 + db #00,#40,#20,#20,#20,#20,#20,#40 + db #00,#00,#50,#20,#F8,#20,#50,#00 + db #00,#00,#20,#20,#F8,#20,#20,#00 + db #00,#00,#00,#00,#00,#60,#20,#40 + db #00,#00,#00,#00,#F8,#00,#00,#00 + db #00,#00,#00,#00,#00,#00,#60,#60 + db #00,#00,#08,#10,#20,#40,#80,#00 + db #00,#70,#88,#98,#A8,#C8,#88,#70 + db #00,#20,#60,#A0,#20,#20,#20,#F8 + db #00,#70,#88,#08,#30,#40,#80,#F8 + db #00,#70,#88,#08,#30,#08,#88,#70 + db #00,#18,#28,#48,#88,#F8,#08,#08 + db #00,#F8,#80,#F0,#08,#08,#08,#F0 + db #00,#70,#80,#F0,#88,#88,#88,#70 + db #00,#F8,#08,#10,#20,#40,#80,#80 + db #00,#70,#88,#88,#70,#88,#88,#70 + db #00,#70,#88,#88,#88,#78,#08,#70 + db #00,#00,#60,#60,#00,#00,#60,#60 + db #00,#00,#60,#60,#00,#60,#20,#40 +x32F9 db #00,#00,#10,#20,#40,#20 +x32FF dw #FFFF +x3301 db #10,#00 +x3203 db #00,#00,#00,#F8,#00,#F8,#00,#00 + db #00,#00,#40,#20,#10,#20,#40,#00 + db #00,#70,#88,#08,#10,#20,#00,#20 + db #00,#70,#88,#B8,#A8,#B8,#80,#78 + db #00,#70,#88,#88,#88,#F8,#88,#88 + db #00,#F0,#88,#88,#F0,#88,#88,#F0 + db #00,#70,#88,#80,#80,#80,#88,#70 + db #00,#E0,#90,#88,#88,#88,#90,#E0 + db #00,#F8,#80,#80,#F0,#80,#80,#F8 + db #00,#F8,#80,#80,#F0,#80,#80,#80 + db #00,#70,#88,#80,#B8,#88,#88,#70 + db #00,#88,#88,#88,#F8,#88,#88,#88 + db #00,#F8,#20,#20,#20,#20,#20,#F8 + db #00,#38,#10,#10,#10,#90,#90,#60 + db #00,#88,#90,#A0,#C0,#A0,#90,#88 + db #00,#80,#80,#80,#80,#80,#80,#F8 + db #00,#88,#D8,#A8,#88,#88,#88,#88 + db #00,#88,#88,#C8,#A8,#98,#88,#88 + db #00,#70,#88,#88,#88,#88,#88,#70 + db #00,#F0,#88,#88,#88,#F0,#80,#80 + db #00,#70,#88,#88,#88,#A8,#90,#68 + db #00,#F0,#88,#88,#88,#F0,#90,#88 + db #00,#70,#88,#80,#70,#08,#88,#70 + db #00,#F8,#20,#20,#20,#20,#20,#20 + db #00,#88,#88,#88,#88,#88,#88,#70 + db #00,#88,#88,#88,#88,#88,#50,#20 + db #00,#88,#88,#88,#88,#88,#A8,#50 + db #00,#88,#88,#50,#20,#50,#88,#88 + db #00,#88,#88,#50,#20,#20,#20,#20 + db #00,#F8,#08,#10,#20,#40,#80,#F8 + db #00,#38,#20,#20,#20,#20,#20,#38 +x33FB db #00,#00,#80,#40 +x33FF dw #FFFF +x3401 db #20,#10,#08,#00 +x3405 db #00,#E0,#20,#20,#20,#20,#20,#E0 + db #00,#20,#70,#A8,#20,#20,#20,#20 + db #00,#00,#00,#00,#00,#00,#00,#FC + db #00,#40,#20,#00,#00,#00,#00,#00 + db #00,#00,#60,#10,#70,#90,#90,#68 + db #00,#80,#80,#80,#E0,#90,#90,#E0 + db #00,#00,#60,#90,#80,#80,#90,#60 + db #00,#10,#10,#10,#70,#90,#90,#70 + db #00,#00,#60,#90,#90,#E0,#80,#70 + db #00,#18,#20,#20,#70,#20,#20,#20 + db #00,#00,#70,#90,#90,#70,#10,#60 + db #00,#80,#80,#80,#E0,#90,#90,#90 + db #00,#40,#00,#40,#40,#40,#40,#30 + db #00,#20,#00,#20,#20,#20,#20,#C0 + db #00,#80,#90,#A0,#C0,#A0,#90,#88 + db #00,#40,#40,#40,#40,#40,#40,#30 + db #00,#00,#D0,#A8,#A8,#A8,#A8,#A8 + db #00,#00,#E0,#90,#90,#90,#90,#90 + db #00,#00,#60,#90,#90,#90,#90,#60 + db #00,#00,#E0,#90,#90,#E0,#80,#80 + db #00,#00,#70,#90,#90,#70,#18,#10 + db #00,#00,#90,#A8,#C0,#80,#80,#80 + db #00,#00,#60,#80,#60,#10,#10,#E0 + db #00,#40,#40,#E0,#40,#40,#40,#30 + db #00,#00,#90,#90,#90,#90,#90,#60 + db #00,#00,#88,#88,#88,#50,#50,#20 + db #00,#00,#88,#88,#A8,#A8,#A8,#50 + db #00,#00,#00,#88,#50,#20,#50,#88 + db #00,#00,#90,#90,#90,#70,#10,#E0 + db #00,#00,#F0,#10,#20,#40,#80,#F0 + db #00,#20,#40,#40,#80,#40,#40,#20 +x34FD db #00,#20 +x34FF dw #FFFF +x3501 db #20,#20,#20,#20,#20,#20 +x3507 db #00,#20,#10,#10,#08,#10,#10,#20 + db #00,#00,#A8,#50,#00,#00,#00,#00 + db #00,#78,#84,#B4,#A4,#B4,#84,#78 + db #00,#FC,#FC,#FC,#FC,#FC,#FC,#FC + db #00,#00,#00,#00,#FC,#FC,#FC,#FC + db #00,#60,#F0,#78,#3C,#78,#F0,#60 + +x3537 DISPLAY "Free space at ",$,": ",/D,#35FF-$," byte(s)" + ds #35FF-$,#00 + dw #FFFF +x3601 DISPLAY "Free space at ",$,": ",/D,#36FF-$," byte(s)" + ds #36FF-$,#00 + dw #FFFF +x3701 DISPLAY "Free space at ",$,": ",/D,#37FF-$," byte(s)" + ds #37FF-$,#00 + dw #FFFF +x3801 DISPLAY "Free space at ",$,": ",/D,#38FF-$," byte(s)" + ds #38FF-$,#00 + dw #FFFF +x3901 DISPLAY "Free space at ",$,": ",/D,#39FF-$," byte(s)" + ds #39FF-$,#00 + dw #FFFF +x3A01 DISPLAY "Free space at ",$,": ",/D,#3AFF-$," byte(s)" + ds #3AFF-$,#00 + dw #FFFF +x3B01 DISPLAY "Free space at ",$,": ",/D,#3BFF-$," byte(s)" + ds #3BFF-$,#00 + dw #FFFF + +;Адрес #3C01. То же, что и #3D31. + +x3C01 JR x3C06 + +x3C03 DB #FF + +;Адрес #3C04. То же, что и #3D1A + +x3C04 JR x3C09 + +;Адрес #3C06. То же, что и #3D31. + +x3C06 JP x3D00 + +;Адрес #3C09. То же, что и #3D1A. + +x3C09 JP x3D03 + +x3C0C ret + +x3C0D push af + push hl + push de + call x3E08 + ld b,a + pop de + pop hl + pop af + jp x3E44 + +x3C1A DISPLAY "Free space at ",$,": ",/D,#3C30-$," byte(s)" + ds #3C30-$,#00 + +x3C30 in a,(#1F) + ret + +x3C33 DISPLAY "Free space at ",$,": ",/D,#3CFA-$," byte(s)" + ds #3CFA-$,#00 + +;Адрес #3CFA. То же, что и #20F1. + +x3CFA JP x20F1 + +;Адрес #3CFD. То же, что и #3D13, но не переключает ПЗУ. + +x3CFD JP x283C + +;Адрес #3D00. Вход в TR-DOS. Переключает ПЗУ. + +x3D00 NOP + JR x3D31 + +;Адрес #3D03. Выполнение команд TR-DOS из бейсика. Установите CH_ADD на префикс :REM: перед командой. Возвращает в BC код ошибки. Переключает ПЗУ. + +x3D03 NOP + JR x3D1A + +;Адрес #3D06. Подпрограмма ввода из файла данных. Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в A символ из файла. + +x3D06 NOP + JP x25EF + +;Адрес #3D0A. То же, что и #3D0D, но не переключает ПЗУ. + +x3D0A JP x244A + +;Адрес #3D0D. Подпрограмма вывода в файл данных. Символ поместите в аккумулятор. Используется также с адреса #3D0E. Обе точки входа переключают ПЗУ. + +x3D0D NOP +x3D0E JR x3D0A + +;Адрес #3D10. То же, что и #20F1. Переключает ПЗУ. + +x3D10 NOP + JR x3CFA + +;Адрес #3D13. Переход на подпрограмму вызова подпрограмм TR-DOS из машинного кода. Адрес является переключателем. + +x3D13 NOP + JR x3CFD + +;Адрес #3D16. Переход на подпрограмму обработки ошибок. Адрес является переключателем. + +x3D16 NOP + JP x2F69 + +;Адрес #3D1A. То же, что и #3D03, но не переключает ПЗУ. + +x3D1A CALL x3D21 ;создание системных переменных TR-DOS + PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик + JP x016C ;выполнение команды + +;Адрес #3D21. Создание области системных переменных TR-DOS, если ее нет. В HL помещается #5CC2. + +x3D21 CALL x31F3 ;проверка наличия области системных переменных + NOP + NOP + CALL C,x3D4C ;если ее нет, то создание ее + LD HL,#5CC2 ;загрузка в HL адреса переключателя ПЗУ на бейсик + RET ;возврат + + NOP + NOP + +;Адрес #3D2F. Переключение пзу на TR-DOS и переход на любой адрес. Адрес поместите на стек. + +x3D2F NOP + RET + +;Адрес #3D31. Вход в TR-DOS. + +x3D31 CALL x3D21 ;создание области системных переменных + PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик + JP x0239 ;вход в TR-DOS + +;Адрес #3D38. Проверка наличия интерфейса-1. В случае его обнаружения происходит создание его системных переменных и в #5CF1 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. + +x3D38 XOR A ;интерфейс-1 есть? + OUT (#F7),A + IN A,(#F7) + CP #1E + JR Z,x3D44 ;если да, то создание его системных переменных + CP #1F + RET NZ ;если нет, то возврат +x3D44 RST 8 ;создание системных переменных интерфейса-1 + DB #31 + LD A,1 ;по команде SAVE записывать 1 копию + LD (#5CEF),A + RET ;возврат + +;Адрес #3D4C. Создание системных переменных TR-DOS. При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные и в #5CEF помещается 1. В переменные TR-DOS помещаются: в #5CFA - #5CFC, #5CC8 - #5CCA, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора. + +x3D4C XOR A ;выбор дисковода A: и сброс ВГ93 + OUT (#FF),A + IN A,(#F6) ;это ничего не дает + LD HL,x3D38 ;адрес подпрограммы проверки наличия интерфейса-1 + LD DE,#5C92 ;любой свободный адрес, ОЗУ + LD BC,#14 ;длина подпрограммы + LDIR ;перенос подпрограммы в ОЗУ + LD HL,x3D67 ;адрес возврата из подпрограммы + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + JP #5CA5 ;new запуск подпрограммы (переход на ret) + +;Адрес #3D67. Создание системных переменных TR-DOS. В переменные помещаются: в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. + +x3D67 LD HL,x2F90 ;адрес возврата из пзу бейсика + PUSH HL ;помещение его на стек + LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS + PUSH HL ;помещение его на стек + LD HL,#1655 ;адрес подпрограммы MAKE_ROOM из ПЗУ бейсика + PUSH HL ;помещение его на стек + LD HL,#5BFF ;адрес переключателя ПЗУ на бейсик + PUSH HL ;помещение его на стек + LD (HL),#C9 ;помещение в озу команды RET + LD HL,#5CB5 ;начальный адрес области системных переменных + LD BC,#70 ;длина ее + RET ;запуск подпрограммы MAKE_ROOM + +;Адрес #3D80. Перевод строки. Используется также с адреса #3D82 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса #3D8B подпрограммой #4F6. + +x3D80 LD A,#D ;символ ENTER +x3D82 PUSH HL ;сохранение регистров + PUSH BC + PUSH DE + PUSH AF ;сохранение символа + CALL x20F1 ;изменение памяти + POP AF ;восстановление символа +x3D8A CALL x3D94 ;печать символа + CALL x20F1 ;восстановление памяти + POP DE ;восстановление регистров + POP BC + POP HL + RET ;возврат + +;Адрес #3D94. Печать символа без изменения памяти. Символ поместите в аккумулятор. + +x3D94 RST #20 + DW #0010 + RET + +;Адрес #3D98. Восстановление с ожиданием INTRQ. Используется также с адреса #3D9A (отдача команды из рег.A с ожиданием INTRQ). + +x3D98 LD A,#08 ;new восстановление +x3D9A OUT (#1F),A +x3D9C PUSH HL ;сохранение HL + RST #20 ;проверка нажатия BREAK + DW #1F54 + JR C,x3DA5 ;если нажато, то сообщение *BREAK* + RST #20 + DW #1B7B +x3DA5 POP HL ;восстановление HL + IN A,(#FF) ;INTRQ поступил? + AND #80 + JR Z,x3D9C ;если нет, то повтор + RET ;возврат + +;Адрес #3DAD. Проверка наличия диска в дисководе. Никаких установок не требуется. + +x3DAD LD A,#08 ;new команда восстановления + CALL x3D9A ;выдача команды и ожидание INTRQ + LD DE,0 ;за #10000 проходов индексный сигнал должен измениться + IN A,(#1F) ;берем индексный сигнал для образца + AND 2 + LD B,A ;запоминаем его +x3DBA IN A,(#1F) ;берем его снова + AND 2 + CP B ;он изменился? + RET NZ ;если да, то возврат + INC DE ;следующая попытка + LD A,E ;попытки кончились + OR D + JR NZ,x3DBA ;если нет, то повтор + JP x16F9 ;обработка ошибки NO DISC + +;Адрес #3DC8. Выбор дисковода, определенного по умолчанию. Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01. Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов: +;#3DCB - выбор дисковода. Номер задайте в рег.A, остальное как и для предыдущей подпрограммы. +;#3DFD - задержка в 725779 тактов. +;#3DFF - задержка любой нужной длительности. В рег.A установите число, определяющее длительность задержки. + +x3DC8 LD A,(#5D19) ;берем номер дисковода по умолчанию +x3DCB call x0901 +; LD (#5CF6),A ;установка номера выбранного дисковода + LD HL,#5D16 ;выбор дисковода + LD C,A + LD A,#3C + OR C + OUT (#FF),A + LD (HL),A + CALL x3E08 ;берем время перемещения головки дисковода + AND #80 ;бит 7 выключен? + JR Z,x3DFA ;если да, то инициализацию не проводим + CALL x3DAD ;проверка наличия диска в дисководе + CALL x3E16 ;определение времени перемещения головки дисковода + CALL x3E11 ;берем тип дисковода + CP #82 ;new в этой переменной #FF? + JR Z,x3DFA ;new если да, то не определяем его + PUSH HL ;сохраняем адрес переменной с типом дисковода + CALL x1FCA ;определение количества дорожек дисковода + POP HL ;восстановление адреса переменной типа + CP #50 ;установка этой переменной + LD A,0 + JR NZ,x3DF9 + LD A,#80 +x3DF9 LD (HL),A + +;Внимание, ошибка!!! Не проверяется количество сторон дисковода и предполагается, что он односторонний. + +x3DFA CALL x1E36 ;проверка индексной области диска +x3DFD LD A,#50 ;задержка в 327842 тактов +x3DFF LD C,#FF +x3E01 DEC C + JR NZ,x3E01 + DEC A + JR NZ,x3DFF + RET ;возврат + +;Адрес #3E08. Выборка времени перемещения головки текущего дисковода. Установите #5CF6. На выходе в A будет время перемещения головки дисковода, а в HL - адрес, по которому оно находится. Используется также с адреса #3E0B (выборка параметра дисковода; в DE поместите адрес таблицы параметров и установите #5CF6; На выходе в A будет параметр, в HL - адрес его ячейки). + +x3E08 LD DE,#5CFA ;берем адрес таблицы скоростей перемещения головок +x3E0B LD HL,(#5CF6) ;смещение равно номеру дисковода + ADD HL,DE ;вычисление адреса ячейки с параметром + LD A,(HL) ;берем оттуда параметр + RET ;возврат + +;Адрес #3E11. Выборка типа дисковода. Вход: установите #5CF6. Выход: в A тип дисковода, в HL - адрес его ячейки. + +x3E11 LD DE,#5CC8 ;берем адрес таблицы типов дисководов + JR x3E0B ;выборка параметра и возврат + +;Адрес #3E16. Определение времени перемещения головки дисковода. + +x3E16 CALL x3E08 ;берем адрес ячейки со временем перемещения головки + LD B,8 ;начнем с наименьшего + LD C,4 ;4 попытки +x3E1D LD (HL),B ;установка времени перемещения головки + LD A,#08 ;new восстановление + CALL x3D9A + LD A,#20 ;позиционирование на дорожку #20 + LD B,#B + CALL x3E44 + LD B,(HL) ;берем время перемещения головки + LD A,1 ;позиционирование на дорожку 1 с заданным временем + CALL x3E44 + IN A,(#1F) ;головка на дорожке 0? + AND 4 + JR NZ,x3E3F ;если да, то ошибка + XOR A ;позиционирование на дорожку 0 + CALL x3E44 + IN A,(#1F) ;головка на дорожке 0? + AND 4 + RET NZ ;если да, то возврат +x3E3F INC B ;увеличение времени перемещения головки на 1 + DEC C ;следующая попытка + RET Z ;если попытки кончились, то возврат + JR x3E1D ;повтор + +;Адрес #3E44. Позиционирование. В A поместите физический номер дорожки, в B - время перемещения головки и выберите сторону. + +x3E44 OUT (#7F),A ;помещение номера дорожки в регистр данных + LD A,B ;получение команды позиционирования + OR #18 + JP x0800 ;отдача команды из рег.A с ожиданием INTRQ + +;Внимание!!! Здесь нужно JP #3D9A, т.к. #800 гасит биты скорости перемещения головки дисковода, следовательно позиционирование работает только с быстрой скоростью. + +;Адрес #3E4C. Позиционирование. На входе в A должен быть физический номер дорожки, а в B - время перемещения головки дисковода. + +x3E4C OUT (#7F),A ;загрузка номера дорожки в регистр данных + PUSH BC ;сохранение времени перемещения головки дисковода + LD B,A ;головка уже спозиционирована? + IN A,(#3F) + CP B + POP BC ;восстановление времени перемещения головки + PUSH AF ;сохранение результата проверки + LD A,B ;получение команды позиционирования + OR #18 + CALL x0800 ;отдача команды из рег.A с ожиданием INTRQ + +;Внимание!!! Позиционирование осуществляется только с быстрой скоростью перемещения головки, т.к. в #800 используется AND #FC. Для исправления ситуации здесь нужно поставить JP #3D9A. + + POP AF ;восстановление результата проверки положения головки + RET Z ;если головка была спозиционирована, то возврат + PUSH BC ;сохранение времени перемещения головки? + CALL x3DFD ;задержка в 725779 тактов + POP BC ;восстановление времени перемещения головки + RET ;возврат + +;Адрес #3E63. Позиционирование головки дисковода. Вход: в рег.A установите логический номер требуемой дорожки и установите #5CCD. На выходе #5CCD обнуляется. Используется также с адреса: +;#3EA0 (задержка в 3135098 тактов). + +x3E63 LD C,A ;загрузка номера дорожки в регистр C + CALL x0A01 ;выбор верхней стороны диска + CALL x3E11 ;берем тип дисковода + AND 2 ;дисковод двухсторонний? + CALL NZ,x3EAA ;если да, то выбор стороны + PUSH BC ;сохраним номер дорожки + BIT 7,(HL) ;дисковод 40-дорожечный? + JR Z,x3E83 ;если да, то номера дорожек не меняем + BIT 0,(HL) ;используем только 40 дорожек? + JR NZ,x3E83 ;если нет, то номера дорожек не меняем + IN A,(#3F) ;берем номер текущей дорожки + CP C ;головка уже спозиционирована? + JR Z,x3E82 ;если да, то номера дорожек не меняем + RLCA ;делим номер текущей дорожки на 2 + OUT (#3F),A + LD A,C ;делим номер требуемой дорожки на 2 + RLCA +x3E82 LD C,A +x3E83 CALL x3E08 ;берем время перемещения головки дисковода + LD B,A + IN A,(#3F) ;головка уже спозиционирована? + CP C + PUSH BC ;сохраним номер требуемой дорожки + CALL NZ,x3DFD ;если головка не спозиционирована, то задержка в 725779 тактов + POP BC ;восстановление номера требуемой дорожки + LD A,C + CALL x3E4C ;позиционирование + POP BC ;восстановление номера требуемой дорожки + LD A,C ;установка регистра дорожки + OUT (#3F),A + LD A,(#5CCD) ;нужна задержка после операции? + OR A + RET Z ;если нет, то возврат + XOR A ;в следующий раз задержка не понадобится + LD (#5CCD),A +x3EA0 LD B,3 ;задержка в 3135098 тактов +x3EA2 LD A,#FF + CALL x3DFF + DJNZ x3EA2 + RET ;возврат + +;Адрес #3EAA. Выбор стороны при позиционировании. Вход: в C поместите логический номер дорожки и выберите верхнюю сторону диска. Выход: будет выбрана сторона, а в C будет физический номер дорожки. + +x3EAA LD A,C ;деление номера дорожки на 2 + OR A + RRA + LD C,A + RET NC ;если номер дорожки был четный, то возврат + JP x1FF6 ;иначе выбор нижней стороны диска + +;Адрес #3EB2. Проверка индексной области дорожки. Установите #5CD1 и поместите в B время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в #5D17 помещается #FF. В регистр H помещается номер текущей дорожки. Используется также с адреса: +;#3EE7 (обработка ошибки NO DISC). + +x3EB2 CALL x1FEB ;выбор верхней стороны диска +x3EB5 IN A,(#1F) ;берем состояние контроллера + AND #80 ;сохранение флага готовности + LD (#5CCD),A + IN A,(#3F) ;берем номер текущей дорожки + LD H,A ;на случай возврата + CALL x3C0D ;преобразование и выполнение команды из рег.B + +;Внимание!!! Перед CALL #3E44 в регистр B надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра B на входе в подпрограмму и последствия могут быть весьма плачевными. + + LD C,#7F ;адрес регистра данных + LD D,1 ;число, определяющее количество попыток + DI ;запрет прерываний + LD A,#C0 ;чтение индексной области + OUT (#1F),A + PUSH BC ;сохранение адреса регистра данных + LD B,3 ;определяем количество попыток +x3ECE IN A,(#FF) ;берем состояние сигналов DRQ и INTRQ + AND #C0 + JR NZ,x3EF2 ;если какой-нибудь сигнал поступил, то начало чтения + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3ECE + DJNZ x3ECE ;повтор до конца попыток + POP BC ;восстановление адреса регистра данных + EI ;разрешение прерываний + LD A,#D0 ;остановка контроллера + OUT (#1F),A + LD A,(#5CD1) ;ошибку игнорировать? + +;Ошибка!!! Надо LD A,(#5D17). + + CP #FF + RET Z ;если да, то возврат +x3EE7 CALL x272B ;установка TAPE LOADING ERROR + LD A,#FF ;в следующий раз ошибку игнорировать + LD (#5D17),A + JP x271B ;обработка ошибки NO DISC +x3EF2 POP BC ;восстановление адреса регистра данных + IN H,(C) ;чтение первого байта +x3EF5 IN A,(#FF) ;ожидание какого-нибудь сигнала + AND #C0 + JR Z,x3EF5 + EI ;на случай возврата + +;Ошибка!!! Так можно потерять байт при чтении. + + RET M ;если поступил INTRQ, то возврат + DI ;запрет прерываний + IN A,(#7F) ;чтение байта + JR x3EF5 ;повтор + +;Адрес #3F02. В комментариях не нуждается. + +x3F02 LD (#5CFF),A + RET + +;Адрес #3F06. Похоже на предыдущее. + +x3F06 LD (#5D00),HL + RET + +;Адрес #3F0A. Запись сектора. Спозиционируйте головку и установите #5CFF и #5D00. + +x3F0A LD A,#A0 ;команда записи сектора + JR x3F10 ;переход к подпрограмме чтения / записи сектора + +;Адрес #3F0E. Загрузка сектора. Установите #5CFF и #5D00 и спозиционируйте головку. Используется также с адреса: +;#3F10 (загрузка/запись сектора; установите все для #3F0E плюс в A поместите команду чтения или записи сектора). + +x3F0E LD A,#80 ;команда чтения сектора +x3F10 LD (#5CFE),A ;установка команды +x3F13 LD D,#A ;10 попыток +x3F15 PUSH DE ;сохранение счетчика попыток + DI ;запрет прерываний + LD A,(#5CFF) ;установка сектора + INC A + OUT (#5F),A + call x0853 +; LD HL,(#5D00) ;берем адрес чтения/записи + LD C,#7F ;берем адрес регистра данных + LD A,(#5CFE) ;отдаем команду + OUT (#1F),A + CP #A0 ;была команда записи сектора? + PUSH AF + CALL Z,x3FBA ;если да, то запись данных + POP AF + CALL NZ,x3FD5 ;иначе чтение данных + POP DE ;восстановление счетчика попыток + EI ;разрешение прерываний + IN A,(#1F) ;берем состояние контроллера + LD B,A ;сохраняем его + AND #7F ;все в порядке? + RET Z ;если да, то возврат +x3F39 LD HL,x29D8 ;адрес сообщения READ ONLY + AND #40 ;запрещена запись? + JR NZ,x3F4B ;если да, то переход на обработку ошибки + LD A,B ;восстановление состояния контроллера + AND 4 ;была потеря данных? + JR Z,x3FA0 ;если нет, то обработка дисковых ошибок + DEC D ;следующая попытка + JR NZ,x3F15 ;если попытки не кончились, то повтор +x3F48 LD HL,x29E2 ;адрес сообщения DISC ERROR +x3F4B LD A,#D0 ;команда прерывания + OUT (#1F),A + LD A,B ;восстановление состояния контроллера + AND 1 ;контроллер был занят? + JP NZ,x3EE7 ;если да, то обработка ситуации NO DISC + IN A,(#3F) ;если ошибка произошла в секторе #A дорожки + OR A ;0, то возврат (игнорирование) + JR NZ,x3F5F + IN A,(#5F) + CP #A + RET Z +x3F5F PUSH HL ;сохранение адреса сообщения + CALL x1D97 ;очистка экрана + POP HL ;восстановление адреса сообщения + RST #18 ;печать сообщения + LD HL,x2A13 ;печать TRK: + RST #18 + IN A,(#3F) ;печать номера дорожки + CALL x1DA3 + LD HL,x2A18 ;печать SEC: + RST #18 + IN A,(#5F) ;печать номера сектора + CALL x1DA3 + LD HL,x29FE ;печать RETRY,ABORT,IGNORE? + RST #18 +x3F7B CALL x1052 ;ввод клавиши + CP "I" ;нажато I? + RET Z ;если да, то возврат + CP "R" ;нажато R? + JR Z,x3F94 ;если да, то перепозиционирование и повтор + CP "A" ;нажато A? + JR NZ,x3F7B ;если нет, то повтор ввода клавиши + CALL x272B ;установка TAPE LOADING ERROR + LD A,7 ;дисковая ошибка + LD (#5D0F),A + JP x01D3 ;завершение +x3F94 LD A,(#5CF5) ;перепозиционирование + CALL x3E63 + CALL x3EA0 ;задержка в 3135098 тактов + JP x3F13 ;повтор + +;Ошибка!!! Надо JP #3F13 для того, чтобы обновить число попыток. + +x3FA0 DEC D ;следующая попытка + JP Z,x3F48 ;если попытки кончились, то обработка DISC ERROR + PUSH DE ;сохранение счетчика попыток + CALL x3E08 ;берем время перемещения головки дисковода + AND 2 ;оно равно #A? + JR NZ,x3FAD + INC (HL) ;если нет, то увеличение его на 1 +x3FAD CALL x08A7 ;восстановление + LD A,(#5CF5) ;перепозиционирование + CALL x3E63 + POP DE ;восстановление счетчика попыток + JP x3F15 ;повтор + +;Адрес #3FBA. Запись данных на диск. Установите в HL адрес блока данных, в DE - число, определяющее количество циклов, за которое должна начаться запись, в C - адрес регистра данных контроллера и отдайте команду записи. Используется также с адреса #3FCA (то же, что и #3FBA, но без обработки NO DISC). + +x3FBA LD B,4 ;установка количества попыток +x3FBC IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR NZ,x3FD1 ;если да, то начинаем запись + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3FBC + DJNZ x3FBC + RET ;если попытки кончились, то возврат +x3FCA IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR Z,x3FCA ;если нет, то ожидание его + RET M ;если поступил INTRQ, то возврат +x3FD1 OUTI ;вывод байта из вашей области в регистр данных + JR x3FCA ;повтор + +;Адрес #3FD5. Чтение данных с диска. Все установки аналогично подпрограмме #3FBA, но отдать нужно команду чтения. Используется также с адpеса #3FE5 (то же, что и #3FD5, но без обработки NO DISC). + +x3FD5 LD B,4 ;установка количества попыток +x3FD7 IN A,(#FF) ;поступило что-нибудь? + AND #C0 + JR NZ,x3FEC ;если да, то начинаем читать + INC DE ;следующая попытка + LD A,E + OR D + JR NZ,x3FD7 + DJNZ x3FD7 + RET ;если попытки кончились, то возврат +x3FE5 IN A,(#FF) ;поступил какой-нибудь сигнал? + AND #C0 + JR Z,x3FE5 ;если нет, то ждем его + RET M ;если это INTRQ, то возврат +x3FEC INI ;чтение байта + JR x3FE5 ;повтор + +;АДРЕС: #3FF0 вывод в порт +x3FF0 out (c),a + ret + +;АДРЕС: #3FF3 чтение порта +x3FF3 in a,(c) + ret + +x3FF6 DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" + ds #4000-$,#FF + + SAVEBIN "../Build/scorp/NewROM3_Tr-Dos.bin",#0000,#4000 + + + + diff --git a/ProfRom_Disasm/rom4.a80 b/ProfRom_Disasm/rom4.a80 new file mode 100755 index 0000000..87acfab --- /dev/null +++ b/ProfRom_Disasm/rom4.a80 @@ -0,0 +1,1082 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #0E00 + +;#0000 reset computer +;#0004 *NOT USED* (#04 байта) +;#0008 rst #08 печать сообщения по номеру в BC +;#000D *NOT USED* (#03 байта) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#0B байт) +;#0020 rst #20 печать строки +;#0022 *NOT USED* (#0E байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#003B печать строки (rst #20) +;#004A *NOT USED* (#26 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#0103 reset computer +;#0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +;#0175 переменные монитора +;#02E8 проверка оригинальный/совместимый компьютер +;#02F4 установка переменных из NVRAM +;#0305 установка переменных из NVRAM/CMOS128 +;#0312 установка переменных по данным в CMOS +;#0315 установка переменных по данным в CMOS +;#036C запись переменных в CMOS и в NVRAM +;#0378 запись переменных в NVRAM +;#0398 запись переменных в CMOS +;#046E таблица для записи переменных в CMOS +;#04FF таблица для записи переменных в NVRAM +;#0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) +;#057F распаковка шрифта в rom 8 +;#059F запакованный шрифт +;#0A5A инициализация системы и печать сооветствующих сообщений +;#0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него +;#0CFA дескрипторы окон +;#0D32 копирайты +;#0E00 ROM-disk +;#4000 + + +;АДРЕС: #0000 reset computer +x0000 di + jp x0103 + +;АДРЕС: #0004 *NOT USED* (#04 байта) +x0004 ds #04 + +;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC +x0008 rst #30 + dw rom5_x11CD ;печать сообщения по номеру в BC + db #05 + ret + +;АДРЕС: #000D *NOT USED* (#03 байта) +x000D ds #03 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#0B байт) +x0015 ds #0B + +;АДРЕС: #0020 rst #20 печать строки +x0020 jr x003B + +;АДРЕС: #0022 *NOT USED* (#0E байт) +x0022 ds #0E + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 ei + reti + +;АДРЕС: #003B печать строки (rst #20) +x003B ex (sp),hl + push af +x003D ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x003D + pop af + ex (sp),hl + ret + +;АДРЕС: #004A *NOT USED* (#26 байт) +x004A ds #26 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) + db #40-ROMdisk/#100;количество свободных секторов в странице + db #00 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #04 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 ret + +;АДРЕС: #0103 reset computer +x0103 ld de,#5BEE + ld hl,x0111 + ld bc,#0011 + ldir + jp #5BEE +x0111 ld bc,#1FFD + ld a,#02 + out (c),a + ld hl,#010C ;включим плоскость 0 + ld l,(hl) + xor a + out (c),a ;rom 0/1 + jp x0000 ;reset + +;АДРЕС: #0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD +x0122 ld hl,x0175 ;базовые переменные монитора + ld de,xE033 + ld bc,#0173 + ldir + ld hl,xE9F5 + ld (xE9F3),hl ;адрес блока описателей дисковода + ld hl,xE02C + ld (hl),#01 ;значение interleaving + ld de,#7F1F + ld c,#FD + ld a,#0E + ld b,#FF + out (c),a ;регистр #E AY + nop + in a,(c) ;читаем значение портов #7FFD и #1FFD + and #3F + cp #3F + ret z ;rom 1, ram #F, scr 5 (прочитано #FF ???) + cp #10 + ret nz ;rom 0, ram 8, scr 7 (то, что включено) + ld b,d ;bc=#7FFD + ld a,#0F ;rom 0, ram 7/F, scr 5 + out (c),a + ld b,e ;bc=#1FFD + ld a,#00 + out (c),a ;rom 0, ram 7, scr 5 + ld a,#0E + ld b,#FF + out (c),a ;регистр #E AY + nop + in a,(c) ;читаем значение портов #7FFD и #1FFD + and #3F + cp #0F + ld b,e ;bc=#1FFD + ld a,#10 + out (c),a ;rom 0, ram #F, scr 5 + ld b,d ;bc=#7FFD + ld a,#00 + out (c),a ;rom 0, ram 8, scr 7 + ret nz ; + set 5,(iy+#19) + ret + +;АДРЕС: #0175 переменные монитора +x0175: INCBIN "prof_roms/rom4_vars.bin" + +;АДРЕС: #02E8 проверка оригинальный/совместимый компьютер +;вых: nz - совместимый +; z - оригинал +x02E8 ld a,d + sub #FC + ret nz ;совместимый + ld a,e + sub #9D + ret z ;оригинал + ld a,e + sub #8B + ret ;nz - совместимый + +;АДРЕС: #02F4 установка переменных из NVRAM +x02F4 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 + call x0312 ;установка переменных по данным в NVRAM + ld hl,xDB69+#2E ;xDB97 + ld (xDDA7),hl + ld hl,x04FF + jr x0315 + +;АДРЕС: #0305 установка переменных из NVRAM/CMOS128 +x0305 ld hl,xE02E + bit 5,(hl) +x030A jr nz,x02F4 ;NVRAM найден + bit 6,(hl) + ret z ;CMOS отсутствует + call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) + +;АДРЕС: #0312 установка переменных по данным в CMOS +;вх: b - номер ячейки CMOS +; 7,c=1 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 2,c=0 +; 1,c=1 запись нескольких битов переменной по маске в (hl) +; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке +x0312 ld hl,x046E + +;АДРЕС: #0315 установка переменных по данным в CMOS +x0315 inc b ;b=#40 +x0316 ld c,(hl) + inc hl + bit 7,c + jr z,x0347 ;установка значения бита переменной + bit 2,c + jr nz,x0343 ;установка номера ячейки CMOS + bit 1,c + jr nz,x0325 ;установка значения битов переменной + ret + +;установка значения бита переменной +x0325 call x0419 ;определение адреса переменной (de - адрес) + bit 0,c + jr z,x033D ;запись переменной в память + ld c,(hl) + inc hl + ld a,(de) + cpl + or c + cpl ;сброс битов в переменной + ld (de),a + call x0459 ;чтение значения из буфера CMOS по адресу в B + and c ;выделение битов + ld c,a + ld a,(de) + or c + ld (de),a ;установка переменной + jr x0316 + +;запись переменной в ячейку CMOS +x033D call x0459 ;чтение значения из буфера CMOS по адресу в B + ld (de),a + jr x0315 + +;установка номера ячейки CMOS +x0343 ld b,(hl) + inc hl + jr x0316 + +;установка значения бита переменной +x0347 call x0419 ;определение адреса переменной (de - адрес) + push hl + ld a,c + and #07 + call x0410 ;получение маски для переменной (l - маска) + call x0459 ;чтение значения из буфера CMOS по адресу в B + and l + push af + ld a,c + and %00111000 + rrca + rrca + rrca + call x0410 ;получение маски для переменной (l - маска) + pop af + ld a,(de) + jr z,x0366 ;сброс бита в переменной + or l ;установка бита в переменной + jr x0368 +x0366 or l + xor l +x0368 ld (de),a ;запись переменной + pop hl + jr x0316 + +;АДРЕС: #036C запись переменных в CMOS и в NVRAM +x036C bit 6,(iy+#1A) + call nz,x0398 ;запись переменных в CMOS + bit 5,(iy+#1A) + ret z + +;АДРЕС: #0378 запись переменных в NVRAM +x0378 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 + call x03B0 ;установка переменных в буфере для записи в NVRAM + ld hl,xDB69+#2E + ld (xDDA7),hl + ld hl,x04FF + call x03B3 ;установка переменных в буфере для записи в NVRAM + ld hl,xDB69 + ld de,#00FD + ld bc,#0001 + rst #30 + dw rom7_x0DD0 ;запись данных в NVRAM + db #07 + ret + +;АДРЕС: #0398 запись переменных в CMOS +x0398 call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) + call x03B0 ;установка переменных в буфере для записи в CMOS + ld hl,xDB69 ;запись буфера в CMOS + ld b,#10 +x03A3 ld a,(hl) + inc hl + rst #30 + dw rom7_x2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F + db #07 + inc b + ld a,b + cp #3F + jr nz,x03A3 + ret + +;установка переменных в буфере для записи в CMOS +x03B0 ld hl,x046E +x03B3 inc b +x03B4 ld c,(hl) + inc hl + bit 7,c + jr z,x03E7 ;установка значения бита ячейки CMOS + bit 2,c + jr nz,x03E3 ;установка номера ячейки CMOS + bit 1,c + jr nz,x03C3 ;установка значения бита ячейки CMOS в буфере + ret + +;установка значения бита ячейки CMOS в буфере +;вх: b - номер ячейки CMOS +; 7,c=1 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 2,c=0 +; 1,c=1 запись нескольких битов переменной по маске в (hl) +; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке +x03C3 call x0419 ;определение адреса переменной (de - адрес) + bit 0,c + jr z,x03DD ;запись переменной в ячейку CMOS + ld c,(hl) + inc hl + push hl + call x0459 ;чтение значения из буфера CMOS по адресу в B + cpl + or c + cpl ;сброс битов ячейки + ld l,a + ld a,(de) + and c ;выделение битов переменной + or l + pop hl + call x0456 ;запись значения в буфер CMOS по адресу в B + jr x03B4 +x03DD ld a,(de) + call x0456 ;запись значения в буфер CMOS по адресу в B + jr x03B3 + +;установка номера ячейки CMOS +;вх: 7,c=1 +; 2,c=1 +; b - номер ячейки CMOS +x03E3 ld b,(hl) + inc hl + jr x03B4 + +;установка значения бита ячейки CMOS +;вх: b - номер ячейки CMOS +; 7,c=0 +; 6,c=1 в (hl) слово-адрес +; =0 в (hl) байт-смещение от xE014 +; 5-3, номер бита в переменной +; 2-1, номер бита в ячейке CMOS +; +x03E7 call x0419 ;определение адреса переменной (de - адрес) + push hl + ld a,c + and %00111000 + rrca + rrca + rrca + call x0410 ;получение маски для переменной (l - маска) + ld a,(de) + and l ;выделение бита в переменной + push af + ld a,c + and #07 + call x0410 ;получение маски для переменной (l - маска) + call x0459 ;чтение значения из буфера CMOS по адресу в B + ld h,a ;значение ячейки CMOS + pop af + ld a,h + jr z,x0408 ;сброс бита в CMOS + or l ;установка бита в CMOS + jr x040A +x0408 or l + xor l +x040A call x0456 ;запись значения в буфер CMOS по адресу в B + pop hl + jr x03B4 + +;получение маски для переменной (l - маска) +;вх: a - номер бита +x0410 ld l,#01 + ret z +x0413 sla l + dec a + jr nz,x0413 + ret + +;определение адреса переменной +;вых: de - адрес +x0419 bit 6,c + ld e,(hl) + inc hl + jr z,x0422 + ld d,(hl) + inc hl + ret +; это байт-смещение от xE014 +x0422 bit 7,e + ld d,#00 + jr z,x0429 + dec d +x0429 push iy + ex (sp),hl + add hl,de + ex de,hl + pop hl + ret + +;чтение CMOS[#10..#3E] в буфер xDB69 +;вых: b=#3F +x0430 ld hl,xDB69 + ld (xDDA7),hl + ld b,#10 +x0438 rst #30 + dw rom7_x1F59 ;чтение ячейки CMOS + db #07 + ld (hl),a + inc hl + inc b + ld a,b + cp #3F + jr nz,x0438 + ret + +;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 +x0445 ld hl,xDB69 + ld (xDDA7),hl + ld de,#00FD + ld bc,#0001 + rst #30 + dw rom7_x0DB6 ;чтение данных из NVRAM + db #07 + ret + +;запись значения в буфер CMOS по адресу в B +x0456 scf + jr x045A +;чтение значения из буфера CMOS по адресу в B +x0459 or a +x045A push hl ;cy=1/0 - запись/чтение + ld hl,(xDDA7) ;адрес буфера CMOS + push bc + ld c,b + ld b,#00 + push af + add hl,bc + pop af + jr nc,x046A + ld (hl),a + jr x046B +x046A ld a,(hl) +x046B pop bc + pop hl + ret + +;АДРЕС: #046E таблица для записи переменных в CMOS и NVRAM +x046E db %10000100 + db #00 ;ячейка: +#00 + db %11000010 + dw xFFCC ;переменная: xFFCC, ячейка: +#01 + db %11000010 + dw xFFCD ;переменная: xFFCD, ячейка: +#02 + db %11000010 + dw xFFCE ;переменная: xFFCE, ячейка: +#03 + db %11000010 + dw xFFCF ;переменная: xFFCF, ячейка: +#04 + db %11000010 + dw xFFD0 ;переменная: xFFD0, ячейка: +#05 + db %11000010 + dw xFFD1 ;переменная: xFFD1, ячейка: +#06 + db %11000011 + dw xFFCB ;переменная: xFFCB + db %00000111 ;маска переменной + db %00000011 + db #39 ;переменная: xE014+#39 + db %00001100 + db #39 ;переменная: xE014+#39 + db %00010101 + db #39 ;переменная: xE014+#39 + db %00000110 + db #1C ;переменная: xE014+#1C + db %00001111 + db #1C ;переменная: xE014+#1C + db %10000100 + db #07 ;ячейка: +#07 + db %10000011 + db #18 ;переменная: xE014+#18 + db %00011111 + db %00010101 + db #1C ;переменная: xE014+#1C + db %00100110 + db #1C ;переменная: xE014+#1C + db %10000100 + db #08 ;ячейка: +#08 + db %10000010 + db #DE ;переменная: xE014-#22, ячейка: +#09 + db %10000010 + db #DF ;переменная: xE014-#21, ячейка: +#0A + db %10000100 + db #0A ;ячейка: +#0A + db %10000011 + db #E0 ;переменная: xE014-#20 + db %00111111 + db %10000100 + db #0B ;ячейка: +#0B + db %10000011 + db #E1 ;переменная: xE014-#1F + db %00111111 + db %10000100 + db #0C ;ячейка: +#0C + db %10000010 + db #05 ;переменная: xE014-#05, ячейка: +#0D + db %10000100 + db #0D ;ячейка: +#0D + db %10000010 + db #0A ;переменная: xE014-#0A, ячейка: +#0E + db %10000010 + db #0C ;переменная: xE014-#0C, ячейка: +#0F + db %10000011 + db #14 ;переменная: xE014+#14 + db %10011111 + db %00100101 + db #00 ;переменная: xE014+#00 + db %00110110 + db #19 ;переменная: xE014+#19 + db %10000100 + db #10 ;ячейка: +#10 + db %10000011 + db #12 ;переменная: xE014+#12 + db %00000111 + db %00101011 + db #13 ;переменная: xE014+#13 + db %10000100 + db #11 ;ячейка: +#11 + db %10000011 + db #15 ;переменная: xE014+#15 + db %10101111 + db %10000100 + db #12 ;ячейка: +#12 + db %10000011 + db #40 ;переменная: xE014+#40 + db %00011111 + db %10000100 + db #13 ;ячейка: +#13 + db %10000011 + db #41 ;переменная: xE014+#41 + db %00011111 + db %10000100 + db #14 ;ячейка: +#14 + db %10000011 + db #42 ;переменная: xE014+#42 + db %00011111 + db %10000100 + db #15 ;ячейка: +#15 + db %10000011 + db #25 ;переменная: xE014+#25 + db %01111111 + db %10000100 + db #16 ;ячейка: +#16 + db %10000011 + db #27 ;переменная: xE014+#27 + db %11101000 + db %10000100 + db #17 ;ячейка: +#17 + db %10000011 + db #2E ;переменная: xE014+#2E + db %00000111 + db %00000011 + db #2F ;переменная: xE014+#2F + db %00001100 + db #2F ;переменная: xE014+#2F + db %00010101 + db #2F ;переменная: xE014+#2F + db %10000100 + db #18 ;ячейка: +#18 + db %11000010 + dw xE11A ;переменная: xE11A, ячейка: +#19 + db %11000010 + dw xE11A+#01 ;переменная: xE11B, ячейка: +#1A + db %10000010 + db #58 ;переменная: xE014-#58, ячейка: +#1B + db %10000011 + db #57 ;переменная: xE014+#57 + db %01111111 + db %10000100 + db #1C ;ячейка: +#1C + db %10000011 + db #DD ;переменная: xE014-#23 + db %00000011 + db %10000100 + db #1D ;ячейка: +#1D + db #80 ;конец + +;АДРЕС: #04FF таблица для записи переменных в NVRAM +x04FF db %10000100 + db #00 ;ячейка: +#00 + db %10000010 + db #2A ;переменная: xE014+#2A, ячейка: +#01 + db %10000010 + db #2B ;переменная: xE014+#2B, ячейка: +#02 + db %10000010 + db #2C ;переменная: xE014+#2C, ячейка: +#03 + db %10000010 + db #2D ;переменная: xE014+#2D, ячейка: +#04 + db %10000010 + db #3A ;переменная: xE014+#3A, ячейка: +#05 + db %10000010 + db #3B ;переменная: xE014+#3B, ячейка: +#06 + db %10000010 + db #3D ;переменная: xE014+#3D, ячейка: +#07 + db %10000010 + db #26 ;переменная: xE014+#26, ячейка: +#08 + db #80 ;конец + +;АДРЕС: #0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) +x0512 ld de,xDB69 + push de +;копируем подпрограмму в буфер + ld hl,x0549 + ld bc,#0100 + ldir +;установка переменных в буфере для записи на диск + ld hl,xDB69+#36 ;xDB9F + ld (xDDA7),hl + call x03B0 ;установка переменных в буфере для записи на диск + ld hl,xDB69+#64 ;xDBCD + ld (xDDA7),hl + ld hl,x04FF + call x03B3 ;установка переменных в буфере для записи на диск +;запись сектора с настройками на дискету + rst #30 + dw rom7_x107B ;инициализация дисковода и настройка на дискету + db #07 + pop hl + jr c,x0545 ;ошибка инициализации диска + ld bc,#0106 + ld de,#000F ;trk 0, sec #0F + rst #30 + dw rom7_x0229 ;R8DOS #06(6) запись группы секторов + db #07 + ret nc ;ошибок не было +x0545 rst #30 ;печать сообщения об ошибке + dw rom6_x06A6 ;печать сообщения об ошибке и продолжение работы монитора + db #06 ;(без возврата) +;процедура установки настроек из сектора диска (сохраняется на диск вместе переменными) +x0549 db "AM" ;сигнатура начала данных + ld a,(#00F1) ;rom 2 + cp #61 + jr z,x0557 ;проверка текущей страницы ПЗУ + ld a,#03 + out (#FE),a + ret +x0557 ld hl,xDB69+#36 ;xDB9F + ld (xDDA7),hl + rst #30 + dw rom4_x0312 ;установка переменных по данным в CMOS + db #04 + ld hl,xDB69+#64 ;xDBCD + ld (xDDA7),hl + ld hl,x04FF + rst #30 + dw rom4_x0315 ;установка переменных по данным в CMOS + db #04 + rst #20 + db #0D + db "AutoConfig Ok" + db #8D + ret + +;АДРЕС: #057F распаковка шрифта в rom 8 +x057F ld hl,xE483 ;адрес ret + rst #30 + dw rom6_x0D60 ;установка п/п jp xE483 по адресу xE338 + db #06 + ld hl,x059F ;адрес сжатого шрифта + ld de,xEBF5 ;буфер + push de + ld bc,#04BB ;размер + ldir ;кипируем в буфер + pop hl + ld de,xEBF5+#04BB ;xF0B0 + exx + ld hl,xF7C0 + rst #30 + dw rom6_x1108 ;распаковка блока + db #06 + ret + +;АДРЕС: #059F запакованный шрифт +x059F INCBIN "prof_roms/rom4_fnt.bin" + +;АДРЕС: #0A5A инициализация системы и печать сооветствующих сообщений +x0A5A bit 6,(iy+#14) + jr nz,x0A67 ;"теплый" сброс + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld a,#0C + rst #10 ;очистка окна +x0A67 ld hl,x0D24 + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db " ",#7F," " ;знак копирайта + dc "1993-1997 MOA Shadow Service Monitor" + bit 6,(iy+#14) + jr nz,x0B07 ;теплый сброс + ld hl,x0D08 + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db #1B,#00,#07 ;координаты печати + dc "* fast test of computer *" + ld hl,x0CFA + call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него + rst #20 + db " Computer :",#0D + db " RAM :",#0D + db " ROM :" + db #1B,#00,#8C ;координаты + call x0C8A ;вывод сообщения с названием компьютера + ld (ix+0),#01 ;crdY=1 + ld (ix+1),#0C ;crdX=12 + call x0C74 ;сообщение: 256 K + ld (ix+0),#02 ;crdY=2 + ld (ix+1),#0C ;crdX=12 + call x0C7B ;вывод сообщения с размером ПЗУ + call x0B3B ;инициализация SMUC +;обнуление bit4 спецификации дисководов +x0B07 ld a,(xFFCA) + push af + xor a +x0B0C ld (xFFCA),a + ld c,#11 ;R8DOS #11(17) чтение кода спецификации дисковода + push af + rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 + res 4,(hl) + pop af + inc a + cp #04 + jr c,x0B0C + pop af + ld (xFFCA),a +;установка координаты Y курсора в окне, при необходимости + ld de,xE0C9 + or a + push ix + pop hl + sbc hl,de + ret z + ld a,(ix+2) + add a,(ix+4) + inc a ;координата Y нижней строки окна + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld (ix+0),a ;координата Y курсора в окне + ret +;инициализация SMUC +x0B3B ld bc,#FEFE + in a,(c) + rrca + jr c,x0B58 ;cs не нажата + ld b,#EF + in a,(c) + bit 2,a + jr nz,x0B58 ;8 не нажата +; SMUC не проверяем + ld hl,xE02E ;cs+8 нажата + ld a,(hl) + and #07 + ld (hl),a + inc hl + ld a,(hl) + and #37 + ld (hl),a + ret +x0B58 bit 6,(iy+#14) + ret nz ;"теплый" сброс +;определение наличия SMUC, и вывод сообщения с версией + rst #30 + dw rom7_x2422 ;определение наличия SMUC + db #07 + ret c ;SMUC не найден + push de + ld hl,x0D16 + call x0CDF + rst #20 + dc " SMUC : " + pop de + call x0CC2 ;печать версии и ревизии SMUC +;определение наличия CMOS, и вывод сообщения + ld a,(ix+2) + add a,(ix+4) + inc a + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 + ld (ix+0),a + rst #30 ;определение наличия CMOS + dw rom7_x2047 ;a=#5A CMOS checksum error + db #07 ;a=#5B CMOS not found + ;a=#5C _число_ bytes CMOS found + call x0C5C ;печать сообщения + db #00 +;определение наличия NVRAM, и вывод сообщения + rst #30 ;определение наличия NVRAM + dw rom7_x0D62 ;a=#26 NVRAM not found + db #07 ;a=#27 NVRAM found + ;a=#33 NVRAM checksum error + call x0C5C ;печать сообщения + db #02 +;определение наличия interrupt controller, и вывод сообщения + call x0305 ;установка переменных из NVRAM/CMOS128 + rst #30 ;определение наличия interrupt controller + dw rom7_x1572 ;a=#24 interrupt controller not found + db #07 ;a=#25 interrupt controller found + call x0C5C ;печать сообщения + db #02 +;определение наличия последовательного порта/модема, и вывод сообщения + rst #30 + dw rom7_x15C7 ;определение наличия последовательного порта/модема + db #07 ;a=#28 modem not found + call x0C5C ;a=#29 modem found + db #02 ;a=#2A serial port not found +;индентификация HDD и печать информиции о винчестере + ld e,#00 + rst #30 + dw rom5_x30B9 ;идентификация жесткого диска + db #05 + jr nc,x0BB9 ;нет ошибок + call x0C5C ;печать сообщения с ошибкой + db #00 + jr x0C27 +x0BB9 ld a,%00101011 ;paper 5, ink 3 + ld (ix+6),a + rst #20 + dc " IDE/AT " +; печать размера винчестера + ld hl,(xE5A5) + ld de,#0000 + exx + ld bc,(xDFF2) + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + rst #30 + dw rom5_x2AA4 ;преобразование количества секторов в мегабайты + db #05 + ld a,#59 + or a + call x0C5C ;печать размера винчестера + db #00 +; печать названия(модели) винчестера + ld a,%00101000 ;paper 5, ink 0 + ld (ix+6),a + ld hl,xE5A9+#036 ;xE5DF + ld b,#14 + call x0C4D +; печать серийного номера винчестера + rst #20 + db #0D + dc "Serial Number: " + ld hl,xE5A9+#014 ;xE5BD + ld b,#0A + call x0C4D +; печать версии прошивки винчестера + rst #20 + db #0D + dc "Firmware rev.: " + ld hl,xE5A9+#02E ;xE5D7 + ld b,#04 + call x0C4D + ld a,%00101001 ;paper 5, ink 1 + ld (ix+6),a + rst #20 + db #8D +;монтирование подключенных образов +x0C27 bit 7,(iy+#1B) + jr z,x0C39 ;HDD не найден + set 5,(iy+#0B) + rst #30 + dw rom5_x2503 ;монтирование всех образов с винчестера + db #05 + res 5,(iy+#0B) +;проверка нажатия клавиши +x0C39 ld hl,xE028 + bit 6,(hl) + ret nz ;"теплый" сброс +x0C3F xor a + in a,(#FE) + and #1F + xor #1F + ret nz + dec hl + ld a,l + or h + ret z + jr x0C3F + +;печать сообщения из (hl), длиной не более b*2 +x0C4D ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,d + or a + ret z + rst #10 + ld a,e + or a + ret z + rst #10 + djnz x0C4D + ret + +;печать сообщения +;вх: a - номер сообщения +; db ? номер блока сообщений +x0C5C ld b,a + ex (sp),hl + ld c,(hl) + inc hl + ex (sp),hl + set 0,(iy+#05) ;десятичная система + ld a,%00101001 ;paper 5, ink 1 + jr c,x0C6B + ld a,%00101011 ;paper 5, ink 3 +x0C6B ld (ix+6),a ;атрибуты печати + rst #20 + dc " " + rst #08 + rst #20 + db #8D + ret + +;сообщение: 256 K +x0C74 rst #20 + dc "256 K" + ret + +;вывод сообщения с размером ПЗУ +x0C7B rst #30 ;для провреки размера ПЗУ: при 128k включится rom 2 и a=#00 + dw romA_x001B ;при 256k включится rom #A и a=#02 + db #0A + cp #02 + jr z,x0C74 ;256k ПЗУ + rst #20 + dc "128 K" + ret + +;вывод сообщения с названием компьютера +x0C8A ld de,(xDFFC) + rst #30 ;ЗАЧЕМ!!! можно напрямую + dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер + db #04 + jr nz,x0CA9 + rst #20 + dc "Scorpion ZS 256 (R)" + ret +x0CA9 rst #20 + dc "Scorpion (R) compatible" + ret + +;печать версии и ревизии SMUC +;вх: d - номер версии +; e - номер ревизии +x0CC2 push de + rst #20 + dc "Ver. " + pop de + ld a,d + push de + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + rst #20 + dc ", rev. " + pop de + ld a,e + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + ret + +;АДРЕС: #0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него +;вх: hl - дескриптор окна +x0CDF call x0CEA + ld hl,#0000 + rst #30 + dw rom5_x2054 ;печать рамки вокруг окна + db #05 + ret +;копирование дескриптора окна в рабочуюю область +x0CEA ld de,xE102 + push de + ld bc,#000D + ldir + pop ix + ld (xE3B7),ix + ret + +;АДРЕС #0CFA дескрипторы окон: +;окно высотой 3 знакоместа на всю ширину экрана +x0CFA db #00,#00 + db #05,#01 + db #03,#1E + db %00101001 + db #07,#90,%00101000 + db #06,#28,#20,#00 +;окно высотой 1 знакоместо на всю ширину экрана +x0D08 db #00,#00 + db #03,#01 + db #01,#1E + db %00101001 + db #03,#88,%00101000 + db #06,#28,#20,#00 +;окно высотой 9 знакомест на всю ширину экрана +x0D16 db #00,#00 + db #09,#01 + db #01,#1E + db %00101001 + db #03,#88,%00101000 + db #06,#28,#20,#00 +;окно высотой 1 знакоместо на всю ширину экрана +x0D24 db #00,#00 + db #01,#01 + db #01,#1E + db %00101001 + db #03,#80,%00101000 + db #06,#28,#20,#00 + +;АДРЕС #0D32 копирайты +x0D32 db "Copyright(c) 1993, 1997 by Andrew MOA",#00 + db "FidoNet 2:5030/25.1",#00 + db "E-mail: moa@deeds.spb.ru",#00 + db "Compiled: Jul 13 1997 14:24:13 (IBM PC, MA80 crossassembler)",#00 +x0DC2 ds ROMdisk-$,#00 + +;АДРЕС: #0E00 ROM-disk +x0E00 INCBIN "prof_roms/rom4_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM4.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom4.bat b/ProfRom_Disasm/rom4.bat new file mode 100755 index 0000000..9ba0cb7 --- /dev/null +++ b/ProfRom_Disasm/rom4.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom4.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom5.a80 b/ProfRom_Disasm/rom5.a80 new file mode 100755 index 0000000..864300d --- /dev/null +++ b/ProfRom_Disasm/rom5.a80 @@ -0,0 +1,7671 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #3300 + +;#0000 *NOT USED* (#08 байт) +;#0008 rst #08 печать сообщения по номеру в BC +;#000B *NOT USED* (#05 байт) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#0B байт) +;#0020 rst #20 печать строки +;#0025 *NOT USED* (#0B байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#3D байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (#55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#0103 печать строки (rst #20) +;#0110 опрос Break. cy=1 не нажата +;#011C опрос манипуляторов и печать курсора +;#0169 печать курсора мыши +;#0176 восстановление экрана под курсором мыши +;#021B опрос мыши +;#0260 опрос kempston joystick +;#02A1 обработка задержек для графического курсора +;#0344 определение попадания курсора мыши в границы текущего окна +;#0381 ожидание нажатия клавиш и обработка реакции на них +;#0385 обработка реакции на нажатия клавиш +;не используется #03C9 таблица адресов процедур графического курсора +;не используется #03DF загрузка в RAM8 графического изображения курсора №2 из hl +;не используется #03E4 загрузка в RAM8 графического изображения курсора №1 из hl +;не используется #03EF загрузка из RAM8 в память hl графического изображения курсора №2 +;не используется #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 +;не используется #03FF определение попадания курсора мыши в границы текущего окна +;не используется #040D опрос управления с заданными параматрами опроса манипуляторов +;не используется #041D опрос управления без опроса манипуляторов +;не используется #042C чтение координат курсора +;не используется #0431 проверка выхода курсора за нижнюю границу экрана +;#043B ОШИБКА!!!! вызов процедуры по номеру в C +;#044A таблица адресов дескрипторов меню +;#0468 сообщения для печати опций меню +;#0660 дескрипторы меню +;#08DD блок п/п определяющих доступность опций +;#08EF доступность опции K. kempston joystick +;не используется #098A проверка наличия раздела MFS на винчетере +;#09A0 процедуры обработки пунктов меню +;#0B4B ввод и сохранение значений времени/даты +;#0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) +;#0B9B ввод параметра текущей опции (число 0..255) +;#0BD0 ввод числа. в BC начальное значение +;#0BD9 ввод числа. в BC начальное значение +;#0BF3 ввод строки символов +;#0CAA печать числа bc в буфере ввода строки +;#0CB0 печать числа A в буфере ввода строки +;#0CB9 печать числа bc в буфере ввода строки +;#0CCA очистка буфера для ввода строки +;#0CDA печать числа bc в буфер hl +;#0CF6 установка и инициализация окна для ввода строки внизу экрана +;#0D02 очистка нижней строки окна меню +;#0D1A определение типа нажатой клавиши +;#0D2F определение адреса дескриптора текущего меню +;#0D42 приведение номера горячей клавиши опции к печатному символу +;#0D45 приведение номера горячей клавиши опции к печатному символу +;#0D52 определение адреса дескриптора опции +;#0D60 определение адреса с номером текущей опции текущего меню +;#0D6B печать текущего меню +;#0E6F выделение атрибутами заданной опции меню (по курсору) +;#0E8C снятие выделения атрибутами заданной опции меню (по курсору) +;#0E98 печать атрибутов заданной опции меню (по курсору) +;#0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? +;#0EB2 очистка текущего окна +;#0EB5 печать текущего меню монитора +;#0F51 вызов п/п обработки доступности опции +;#0F65 выделение старшего байта смещения +;#0F6D опредение адреса описания опции +;#0F95 перемещение курсора на следующую опцию (вниз) +;#0FA6 перемещение курсора на предыдущую опцию (вверх) +;#0FB6 определение опции под курсором мыши и переход на ее обработку +;#0FE3 получение адреса переменной и адреса маски для заданной опции +;#0FE9 получение адреса переменной и адреса маски для заданной опции +;#102E проверка диапазона числа +;#1033 процедура обработки нажатий клавиш +;#1047 печать количества цилиндров HDD +;#105B печать шапки меню монитора +;#1061 печать закодированного сообщения из hl +;#10C2 установка текущим окна: menu +;#10C7 Копирование каталога ROM-диска в ram 8 +;#10DB обработка пункта меню: R. ROM disk +;#1150 вывод окна выбора дисковода +;не используется #1181 ret +;#11A4 поиск сообщения по номеру в B[#01..#??] +;#11AF установка блока слов/сообщений по номеру в A +;#11CD печать сообщения по номеру в BC +;#122D блок слов 2 (#35 слов) +;#1353 блок слов 1 (#6A слов) +;#1554 блок слов 0 (#5E слов) +;#176D Блок сообщений 2 +;#181A Блок сообщений 1 +;#1906 Блок сообщений 0 +;не используется #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора +;#1A4C печать даты и времени в окне монитора +;#1AA6 читаем время в строку в формате ASCII +;#1AAF читаем время в строку в формате ASCII +;#1B05 чтение даты из буфера и расчет номера дня недели +;#1B18 читаем дату в строку в формате ASCII +;#1B21 читаем дату в строку в формате ASCII +;#1B93 таблица для вычисления кода месяца +;#1BAC расчет номера дня недели +;#1C0D работа с микросхемой CMOS (rst 8: db #89) +;#1C73 ввод текстовой строки в нижней строке экрана +;#1C84 инициализация окна ввода +;#1CB3 продолжение ввода строки (вых: hl адрес введенной строки) +;#1CB8 ввод строки (вых: hl адрес введенной строки) +;#1D10 добавление символа в вводимую строку +;#1D40 удаление символа перед курсором (delete) +;#1D5A перемещение курсора в водимой строке влево +;#1D64 перемещение курсора в вводимой строке вправо +;#1D70 позиционирование курсора в конец строки +;#1D98 печать вводимой строки на экране +;#1DB7 получение адреса под курсором в буфере строки +;#1DC2 смена режима вставки/замены при вводе строки +;#1DD6 очистка буфера вводимой строки +;#1DEC удаление кода возврата каретки из строки +;#1E13 помещение символа в строку и приращение адреса в буфере строк +;#1E18 циклическое приращение адреса в буфере введенных строк +;#1E22 получем адрес конца последней введенной строки +;#1E2D сохранение введенной строки в буфере последних введенных строк +;#1E5B копирование в буфер ввода предпоследней введенной строки +;#1E91 копирование строки из буфера введенных строк в буфер ввода строки +;#1EC0 копирование в буфер ввода следующей введенной строки +;#1EE1 проверка списка на наличие введенных строк +;#1EEE звонок с установкой бордюра +;#1EF1 печать каталога и выбор позиции в нем +;#2023 сложение hl=hl+a +;#2028 вызов процедуры по таблице, адрес которой в (xE9E1) +;#202C вызов процедуры по таблице, адрес которой в (xE9E1) +;#203C расчет размеров и печать окна под каталог ROM-disk +;#2054 печать рамки вокруг окна +;#205A установка текущим окна: вывод каталога +;#207A печать рамки вокруг окна +;#2133 коррекция координат и размеров окна +;#213F координаты Y и X полей для окна редактирования дампа +;#2168 таблица со списком процедур для окна редактирования дампа +;#2278 редактирование дампа памяти в окне монитора +;#245E переименование подраздела +;Не используется #247D ret +;#247E печать нового пути после выбора пунктов меню mount/dismount DRIVE +;#249C печать буквы дисковода или пути, если это образ +;#24CE обработка пункта меню: Z. dismount.../Z. mount... +;#24F0 монтирование образа к дисководу +;#2503 монтирование всех образов с винчестера +;#2536 монтирование/отключение подраздела/образа диска +;#25EB формирование в буфере xEBF5 списка образов коллекции +;#261A удаление всех подразделов +;#2620 формирование в буфере xEBF5 списка подразделов MFS +;#2671 сортировка записей в буфере xEBF5 по порядку местоположения +;#2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере +;#26AC проверка разрывов между подразделами/образами и создание пустой записи в буфере +;#2707 загрузка числа в регистры из памяти xE81B+1 +;#270D загрузка числа в регистры из памяти xE81B+8 +;#271A подсчет количества подразделов в MFS +;#2733 удаление всех разделов MBR +;#2739 формирование в буфере xEBF5 списка разделов MBR +;#2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) +;#28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения +;#28C6 уплотнение каталога MBR (удаление в буфере записей unused) +;не используется #2928 подсчет количества разделов/подразделов в каталоге +;#2936 подсчет пустых записей в каталоге разделов/подразделов +;#2960 сортировка дескрипторов подразделов +;#2990 вставляем новую запись в список записей +;#29C6 расчет адреса в каталоге +;#29D0 печать окна с образами дисков и выбор образа в нем +;#29D5 печать окна local partition information и выбор записи в нем +;#29D7 печать окна с подразделами и выбор подраздела в нем +;#29DC печать окна global partition information и выбор записи в нем +;#29F4 выбран некорректный раздел. продолжаем выбор +;#29FE блок процедур для печати окон со списком разделов/подразделов/образов +;#2AA4 преобразование количества секторов в мегабайты +;#2AC0 преобразование количества секторов в мегабайты +;#2ACC преобразование количества секторов в килобайты +;#2AE7 умножение dehl=de*#800 +;#2AF5 умножение dehl=de*2 +;#2B03 проверка первого байта записи каталога подраздела на #FF +;#2B05 проверка первого байта записи каталога подраздела на #FF +;#2B12 печать сообщения: Unused +;#2B8C поиск и печать сообщения из HL по типу в A +;#2BB8 подготовка к печати окна выбора раздела +;#2BCA создание раздела MFS +;#2C1F удаление раздела MBR +;#2C37 создание подраздела +;#2D2F ввод имени подраздела +;#2D45 удаление подраздела +;#2D5D сравнение (hl) с #FF, cy=1 если равны +;#2D63 формирование коллекции образов в подразделе TR-DOS +;#2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода +;#2E30 расчет количества образов исходя из размеров подраздела +;#2E5D сформируем пустой сектор MBR в буфере xE5A9 +;#2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS +;#2E85 ввод имени подраздела +;#2EA7 проверка введенного имени +;#2F10 выбор типа подраздела +;#2F5D запрос на сохранение сектора MBR, если были изменения +;#2F66 формирование и запись сектора MBR +;не используется #2F94 чтение сектора в буфер xE5A9 +;#2FA8 запрос на сохранение каталога MFS, если были изменения +;#2FB1 запись каталога MFS/подраздела +;#2FCA сравнение двух чисел в памяти по адресам в de и hl +;#2FCF обнуление переменной xE9EB +;#2FDB инкременит слова (xDD89)=(xDD89)+1 +;#2FE5 декремент слова (xDD89)=(xDD89)-1 +;#2FEF умножение bc=bc*#10 +;#3000 копирование из (hl) в (de) 4х байт +;#3005 загрузка числа в регистры из памяти +6 байт к адресу hl +;#300A загрузка числа в регистры из памяти +12 байт к адресу hl +;#300E загрузка числа в регистры из памяти +;#301C загрузка числа из регистров в память +;#302A декремент (hl)=(hl)-1 +;#3035 вычитание (hl)=(hl)-(de) +;#3047 инкремент числа по адресу hl +;#3052 сложение двух 4х байтных чисел +;#3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши +;#30B9 идентификация жесткого диска +;#30C6 печать окна для тестирования HDD +;#30F3 печать кода ошибки винчестера +;#3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +;#3163 печать текущего номера цилиндра +;#31AA удаление всех разделов MBR +;#31D4 неиспользуемая область +;#3200 каталог ROM-disk +;#3300 ROM-disk + + +;АДРЕС: #0000 *NOT USED* (#08 байт) +x0000 ds #08 + +;АДРЕС: #0008 печать сообщения по номеру в BC +x0008 jp x11CD + +;АДРЕС: #000B *NOT USED* (#05 байт) +x000B ds #05 + +;АДРЕС: #0010 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#0B байт) +x0015 ds #0B + +;АДРЕС: #0020 печать строки +x0020 ex (sp),hl + push af + jp x0103 + +;АДРЕС: #0025 *NOT USED* (#0B байт) +x0025 ds #0B + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#3D байт) +x0033 ds #3D + +;АДРЕС: #0070 переменные ROM-disk +x0070 db #33 ;смещение начала ром диска (в блоках по 256 байт) +x0071 db #0D ;количество свободных секторов в странице + db #32 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #05 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 ret + +;АДРЕС: #0103 печать строки (rst #20) +x0103 ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x0103 + pop af + ex (sp),hl + ret + +;АДРЕС: #0110 опрос Break. cy=1 не нажата +x0110 ld a,#FE + in a,(#FE) + rrca + ret c ;cs не нажата + ld a,#7F + in a,(#FE) + rrca + ret + +;АДРЕС: #011C опрос манипуляторов и печать курсора +;вых: cy=1 нажата fire на джойстике/кнопка мыши +; a=#80 - курсор изменил положение +; a=#81 - курсор в пределах текущего окна +; a=#82 - курсор мыши вне пределов текущего окна +; cy=1 нажата кнопка мыши +; a=#91 - нажата левая кнопка мыши +; a=#92 - нажата правая кнопка мыши +; a=#93 - нажата средняя кнопка мыши +; a>=#94 - курсор вне пределов текущего окна +; cy=0 fire на джойстике/кнопки мыши не нажаты +x011C or a + ld hl,xE03B + bit 7,(hl) + ret z ;мышь и джойстик отключены + ld c,#00 + bit 6,(hl) + call nz,x0260 ;опрос kempston joystick + bit 4,c + jr nz,x0149 ;нажата Fire + bit 5,(hl) + jr z,x0149 ;мышь отключена + call x021B ;опрос мыши + jr z,x015E ;кнопки не нажаты, печать курсора + push hl + call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (xE008),hl ;координаты курсора в окне + pop hl + ld a,c ;состояние кнопок мыши + or %10010000 + scf + bit 2,(hl) + ret z + set 3,a + ret +;нажата Fire kempstone joy/не нажата Fire kempstone joy при отключенной мыши +;hl=xE03B +;c - состояние кнопок джойстика +x0149 push hl + call x02A1 ;обработка задержек дял графического курсора + pop hl + scf + ld a,#80 + bit 0,(hl) + res 0,(hl) + jr nz,x0163 + inc a + bit 1,(hl) + res 1,(hl) + jr nz,x0163 +x015E call x0169 ;печать курсора мыши + or a + ret +x0163 bit 2,(hl) + ret z ;курсор в пределах текущего окна + ld a,#82 + ret + +;АДРЕС: #0169 печать курсора мыши +;вых: a - смещение курсора в знакоместе +; +x0169 set 7,(iy-#0A) ;курсор напечатан + ld ix,(xE12A) ;адрес данных курсора + ld hl,x01C3 ;п/п печати курсора мыши + jr x0186 + +;АДРЕС: #0176 восстановление экрана под курсором мыши +;вых: a - смещение курсора в знакоместе +; +x0176 bit 7,(iy+#27) + ret z ;мышь и джойстик отключены + ld hl,xE00A + bit 7,(hl) + ret z ;курсор не напечатан + res 7,(hl) + ld hl,x0212 ;п/п восстановления 3х байт экрана +x0186 ld (xE51C+1),hl + ld de,xDFD2 ;адрес буфера + ld hl,(xE03C) ;координаты курсора мыши + ld b,h + ld a,#C0 + sub b + ret z ;crd Y за пределами экрана + ret c ;crd Y за пределами экрана + cp #08 + jr c,x019B + ld a,#08 +x019B ld b,a ;высота для сохранения/восстановления экрана +;сохранение/восстановление экрана под курсором мыши +x019C push bc + ld c,l + ld b,h ;координаты + push bc + ld a,b + or a + rra + scf + rra + or a + rra + xor b + and #F8 + xor b + ld h,a + ld a,c + rlca + rlca + rlca + xor b + and #C7 + xor b + rlca + rlca + ld l,a ;адрес на экране + ld a,c + and #07 ;смещение в знакоместе + call xE51C ;сохраним/восстановим 3 байта + pop hl + inc h ;crd Y +1 + pop bc + djnz x019C + ret + +;печать одной линии курсора на экране с сохранением экрана в буфере +x01C3 push hl ;сохраним в буфере + ldi + ldi + ldi + pop hl + push de + push hl + ld b,(ix+0) + ld e,(ix+1) + ld h,#00 ;линия данных + ld c,(ix+#10) + ld d,(ix+#11) + ld l,#FF ;линия маски + or a + jr z,x01F0 ;курсор печатаем с начала знакоместа +x01E0 srl b ;ротация данных и маски + rr e + rr h + scf + rr c + rr d + rr l + dec a + jr nz,0x1E0 +x01F0 ex (sp),hl ;hl адрес на экране + ld a,c + and (hl) + or b + ld (hl),a ;1й байт + inc hl + ld a,l + and #1F + jr z,x020B ;край экрана + ld a,d + and (hl) + or e + ld (hl),a ;2й байт + inc hl + ld a,l + and #1F + jr z,x020B ;край экрана + pop de + push de + ld a,e + and (hl) + or d + ld (hl),a ;3й байт +x020B pop de + inc ix + inc ix + pop de + ret + +;восстановление одной линии экрана под курсором +x0212 ex de,hl + ldi + ldi + ldi + ex de,hl + ret + +;АДРЕС: #021B опрос мыши +;вых: c - состояние кнопок мыши +; z - нет нажатых кнопок +; +x021B push hl + ld bc,#FBDF ;по оси X + in a,(c) + ld b,#FF ;крайняя координата X + ld hl,xE12C ;предыдущее состояние портов мыши + ld de,xE03C ;координаты курсора мыши + call x0244 ;коррекция crd X курсора + ld b,#FF + in a,(c) + neg + ld b,#BF ;крайняя координата Y + ex de,hl + inc hl + inc de + call x0244 ;коррекция crd Y курсора + ld b,#FA + in a,(c) + cpl + and #07 + ld c,a ;нажатые кнопки + pop hl + ret +;коррекция crd X/Y курсора +x0244 push bc + ld b,(hl) + ld (hl),a + sub b ;a - +/- дельта crd + ex de,hl + pop bc + ret z ;не было перемещения + jp m,x0256 ;движение влево/вверх + add a,(hl) ;движение вправо/вниз + jr c,x0254 + cp b ;правый/нижний предел экрана + ld (hl),a + ret c +x0254 ld (hl),b ;достигли предела экрана + ret +x0256 neg ;движение влево/вверх + ld b,a ;ABS(delta Crd) + ld a,(hl) + sub b + ld (hl),a + ret nc + ld (hl),#00 ;достигли предела экрана + ret + +;АДРЕС: #0260 опрос kempston joystick +;вых: c - состояние кнопок джойстика +; +x0260 ld bc,#FF1F + in c,(c) + ld d,(iy+#2E) ;шаг перемещения + push hl + ld hl,(xE03C) ;crd Y/X + bit 1,c ;нажатие влево + jr z,x0276 + ld a,l + sub d + jr nc,x0275 + xor a +x0275 ld l,a +x0276 bit 0,c ;нажатие вправо + jr z,x0285 + ld a,l + add a,d + jr c,x0282 + cp #FC + jr c,x0284 +x0282 ld a,#FC ;крайняя координата X +x0284 ld l,a +x0285 bit 3,c ;нажатие вверх + jr z,x028F + ld a,h + sub d + jr nc,x028E + xor a +x028E ld h,a +x028F bit 2,c ;нажатие вниз + jr z,x029C + ld a,h + add a,d + cp #BE + jr c,x029B + ld a,#BE ;крайняя координата Y +x029B ld h,a +x029C ld (xE03C),hl + pop hl + ret + +;АДРЕС: #02A1 обработка задержек дял графического курсора +;вх: c - состояние кнопок джойстика +x02A1 ld hl,xE00A + bit 4,c + jr nz,x02D8 ;нажата fire на джойстике + bit 6,(hl) + jr nz,x02C0 ;установка задержки second wait при необходимости + bit 5,(hl) + jr z,x02B5 ;сброс задержек и установка курсора №1 + ld a,(hl) + and #1F + jr nz,x0322 ;уменьшение счетчика задержки +;сброс задержек и установка курсора №1 +x02B5 ld a,(hl) + and #80 + ld (hl),a +;установка курсора №1 +x02B9 ld hl,xE12E + ld (xE12A),hl + ret +;установка задержки second wait при необходимости +x02C0 bit 5,(hl) + jr nz,x02B5 ;сброс задержек и установка курсора №1 + ld a,(hl) + and #1F + jr z,x02B5 ;сброс задержек и установка курсора №1 + res 6,(hl) + set 5,(hl) + ld a,(iy+#2C) ;значение second wait +;установка величины задержки +x02D0 push af + ld a,#E0 + and (hl) + pop de + or d + ld (hl),a + ret +;если нажата fire на джойстике +x02D8 bit 5,(hl) + jr nz,x0312 ;установка и обработка задержки second debouncing + bit 6,(hl) + jr nz,x02FF + ld a,(hl) + and #1F + jr nz,x02EA + ld a,(iy+#2A) ;значение first debouncing + jr x02D0 ;установка величины задержки +x02EA dec (hl) + ld a,(hl) + and #1F + ret nz + set 6,(hl) + ld a,(iy+#2B) ;значение before repeat + call x02D0 ;установка величины задержки + ld hl,xE14E + ld (xE12A),hl + jr x0307 +x02FF ld a,(hl) + and #1F + jr nz,x0322 ;уменьшение счетчика задержки + call x02B9 ;установка курсора №1 +x0307 call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (xE008),hl ;координаты курсора мыши в текущем окне (в знакоместах) +x030D set 0,(iy+#27) + ret +;установка и обработка задержки second debouncing +x0312 bit 6,(hl) + jr nz,x031D + set 6,(hl) + ld a,(iy+#2D) ;значение second debouncing + jr x02D0 ;установка величины задержки +x031D ld a,(hl) + and #1F + jr z,x0324 +x0322 dec (hl) ;уменьшение счетчика задержки + ret +x0324 push hl + call x02B5 ;сброс задержек и установка курсора №1 + pop hl + ld a,#1F + call x02D0 ;установка величины задержки + call x0344 ;определение попадания курсора в границы текущего окна + or a + ld de,(xE008) ;предыдущие координаты курсора в текущем окне (в знакоместах) + ld (xE008),hl ;новые координаты курсора в текущем окне (в знакоместах) + sbc hl,de + ld a,h + or l + jr nz,x030D ;координаты изменились + set 1,(iy+#27) + ret + +;АДРЕС: #0344 определение попадания курсора мыши в границы текущего окна +;вых: во флагах состояние режима прерываний +; hl - координаты курсора мыши в окне в знакоместах окна +; +x0344 ld a,r + push af ;сохраним режим прерываний + di + res 2,(iy+#27) + ld hl,(xE03C) ;координаты курсора мыши + srl h + srl h + srl h + ld a,h + sub (ix+2) + jr c,x037B ;выше текущего окна + ld h,a ;координата Y в окне + cp (ix+4) + jr nc,x037B ;ниже текущего окна + ld a,(ix+3) + rlca + rlca + rlca + ld b,a + ld a,l + sub b + jr c,x037B ;левее окна + ld b,(ix+#0A) + ld l,#FF +x0371 inc l + sub b + jr nc,x0371 + ld a,l + cp (ix+#0B) + jr c,x037F ;в пределах окна +x037B set 2,(iy+#27) +x037F pop af + ret + +;АДРЕС: #0381 ожидание нажатия клавиш и обработка реакции на них +;вых: cy=0 a=#0D опция выбрана +; cy=1, a=#03 отмена с закрытием окна +; cy=1, a=a неиспользуемые комбинации. нет реакции +x0381 rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + +;АДРЕС: #0385 обработка реакции на нажатия клавиш +;вх: a - код нажатой клавиши +;вых: cy=0 a=#0D опция выбрана +; cy=1, a=#03 отмена с закрытием окна +; cy=1, a=a неиспользуемые комбинации. нет реакции +x0385 cp #82 + jr c,x03B0 ;a=[#00..#81] + jr z,x03AC ;a=#82 KempJoy fire вне окна + cp #91 + ret c ;a=[#83..#90] + cp #A0 + ccf + ret c ;a=[#A0..#FF] ???задел для кириллицы??? + bit 3,a ;a=[#91..#9F] mouse + jr nz,x03AC ;кнопка мыши вне окна + and #03 + jr z,x03A8 ;не нажата ни левая, ни правая кнопка мыши + cp #03 + jr z,x03A8 ;fire+cancel + rrca + jr nc,x03AC ;cancel на окне + call x03BD ;устанавливаем координаты в окне по курсору мыши + ccf + ld a,#0D + ret +x03A8 or #94 + scf + ret +x03AC ld a,#03 + scf + ret +x03B0 cp #80 + ret c ;a=[#00..#7F] + call x03BD ;устанавливаем координаты в окне по курсору KempJoy + cp #81 + ret c ;!!! ОШИБКА fire joy =#80 а не #81 + ld a,#0D + or a + ret +;устанавливаем координаты в окне по курсору мыши +x03BD push af + call x0344 ;определение попадания курсора мыши в границы текущего окна + ld (ix+0),h + ld (ix+1),l + pop af + ret + +;АДРЕС: #03C9 таблица адресов процедур графического курсора +x03C9 dw x041D ;опрос управления без опроса манипуляторов + dw x040D ;опрос управления с заданными параматрами опроса манипуляторов + dw x0385 ;обработка реакции на нажатия клавиш + dw x042C ;чтение координат курсора + dw x0431 ;проверка выхода курсора за нижнюю границу экрана + dw x03FF ;определение попадания курсора мыши в границы текущего окна + dw x03F4 ;загрузка из RAM8 в память hl графического изображения курсора №1 + dw x03E4 ;загрузка в RAM8 графического изображения курсора №1 из hl + dw x03EF ;загрузка из RAM8 в память hl графического изображения курсора №2 + dw x03DF ;загрузка в RAM8 графического изображения курсора №2 из hl + dw x08FB ;проверка наличия мыши + +;АДРЕС: #03DF загрузка в RAM8 графического изображения курсора №2 из hl +;вх: hl - адрес данных курсора +x03DF ld de,xE14E + jr x03E7 + +;АДРЕС: #03E4 загрузка в RAM8 графического изображения курсора №1 из hl +;вх: hl - адрес данных курсора +x03E4 ld de,xE12E +x03E7 ld bc,#0020 + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + ret + +;АДРЕС: #03EF загрузка из RAM8 в память hl графического изображения курсора №2 +;вх: hl - адрес в памяти +x03EF ld hl,xE14E + jr x03F7 + +;АДРЕС: #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 +;вх: hl - адрес в памяти +x03F4 ld hl,xE12E +x03F7 ld bc,#0020 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret + +;АДРЕС: #03FF определение попадания курсора мыши в границы текущего окна +;вых: de - координаты курсора на экране +; cy =0 курсор мыши в пределах текущего окна +; cy =1 курсор мыши вне пределов текущего окна +x03FF call x0344 ;определение попадания курсора мыши в границы текущего окна + call x042C ;de - координаты курсора на экране + or a + bit 2,(iy+#27) + ret z ;курсор мыши в пределах текущего окна + scf + ret + +;АДРЕС: #040D опрос управления с заданными параматрами опроса манипуляторов +;вх: 7-5,b - новые значения установок графических манипуляторов +;вых: de - координаты курсора +x040D ld hl,xE03B + push hl + ld a,b + and #E0 + ld b,a + ld a,(hl) + push af + and #1F + or b + ld (hl),a + jr x0425 + +;АДРЕС: #041D опрос управления без опроса манипуляторов +;вых: de - координаты курсора +x041D ld hl,xE03B + push hl + ld a,(hl) + res 7,(hl) ;оключение манипуляторов + push af +x0425 rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + pop bc + pop hl + ld (hl),b + +;АДРЕС: #042C чтение координат курсора +;вых: de - координаты курсора +x042C ld de,(xE03C) + ret + +;АДРЕС: #0431 проверка выхода курсора за нижнюю границу экрана +;вх: hl - координаты графического курсора +;вых: (xE03C),hl - новые координаты курсора +x0431 ld a,#BF + cp h + jr nc,x0437 + ld h,a +x0437 ld (xE03C),hl + ret + +;АДРЕС: #043B ОШИБКА!!!! вызов процедуры по номеру в C +;вх: c - номер процедуры +x043B push hl + rst #30 + dw rom2_x300F ;чтение содержимого регистра ix основной программы + db #02 + ld hl,x03C9 + ld b,#00 ;ОШИБКА!!!! в B может передаваться параметр + sla c + add hl,bc + ex (sp),hl ;ОШИБКА!!!! + ret + +;АДРЕС: #044A таблица адресов дескрипторов меню +x044A dw x0660 ;окно 0 (main menu) + dw x06B6 + dw x06CD + dw x068B + dw x0882 + dw x06F8 + dw 0 + dw x0737 + dw x0797 + dw x0762 + dw x08B2 + dw x07C2 + dw x07F2 + dw x081D + dw x084D + +;АДРЕС: #0468 сообщения для печати опций меню +;+0 7-6, дополнительное смещение координаты Y +; 5,=1 в байтах +1/2 адрес отдельно п/п печати опции меню +; 4,=1 в байте +3 номер плоскости/страницы, если п/п в другой странице +; 5,=0 в байтах +1/2 номер группы сообщений и номер сообщения в ней +; 4,=1 (+3/4) адрес переменной с номером строки [0..3] +; +5 список строк в формате: +0 длина строки без учета данного байта +; +n строка в формате +0 флаги, +1/2 смещение +; 4,=0 (+3/4) смещение до переменной/блока переменных +; 2,=0 -> смещение в следующей ячейке однобайтное +; 2,=1 -> смещение в следующих ячейках двухбайтное +; 3,=1 -> это блок переменных и в следущих ячейках адрес до ячейки со смещением до нужной переменной +; 1-0,=01 два состояния опции, номера сообщений после маски +; =10 состояние опции это число по адресу переменной опции +; =11 1-4 состояния опции, по номеру в de +;+1 номер блока сообщений +;+2 номер сообщения в этом блоке +; +x0468 db %01000000 ;C. catalogue disk + db #01,#51 +x046B db %01000000 ;format НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #01,#4B +x046E db %01000000 ;D. Disk utility + db #01,#4D +x0471 db %01000000 ;F. format disk + db #01,#45 +x0474 db %01000000 ;Q. quick format + db #01,#68 +x0477 db %01000000 ;T. test disk + db #01,#4E +x047A db %01000110 ;Y. retry constant + db #01,#4C + dw #1FB7 ;#E014+#1FB7=#FFCB + db #01,#08 +x0481 db %00001101 ;I. side + db #01,#3B + dw #1FBC ;=#FFD0 + dw #FFCA + db #80 + db #3C,#3D +x048B db %00001101 ;R. track + db #01,#38 + dw #1FBC ;=#FFD0 + dw #FFCA + db #20 + db #39,#3A +x0495 db %01000010 ;L. interleaving + db #01,#52 + db #18 + db #01,#1B ;минимум и максимум +x049B db %00001101 ;S. side + db #01,#3B + dw #1FB8 ;=#FFCC + dw #FFCA + db #80 + db #3C,#3D +x04A5 db %01001101 ;T. track + db #01,#38 + dw #1FB8 ;=#FFCC + dw #FFCA + db #40 + db #39,#3A +x04AF db %01000111 ;D. disk drive + db #01,#33 + dw #1FB6 ;=#FFCA + db #34,#35,#36,#37 +x04B8 db %00001111 ;E. sector + db #01,#40 + dw #1FBC ;=#FFD0 + dw #FFCA + db #41,#42,#43,#44 +x04C3 db %00001111 ;P. speed + db #01,#1A + dw #1FB8 ;=#FFCC + dw #FFCA + db #47,#48,#49,#4A +x04CE db %01000001 ;S. sound + db #01,#31 + db #14,#01 + db #25,#26 +x04D5 db %00000001 ;A. autoconfig + db #02,#0C + db #14,#02 + db #05,#04 +x04DC db %01000001 ;R. reset RAM + db #01,#30 + db #14,#80 + db #25,#26 +x04E3 db %01000000 ;M. monitor + db #01,#0A +x04E6 db %01000000 ;R. reset + db #01,#29 +x04E9 db %00000010 ;L. string width + db #01,#27 + db #58 + db #00,#EA ;0..233 +x04EF db %00000010 ;W. page length + db #01,#28 + db #57 + db #00,#79 +x04F5 db %00000010 ;F. line feed + db #01,#2A + db #41 + db #00,#21 +x04FB db %01000010 ;C. carriage return + db #01,#2B +x04FE db %01000000 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #00,#21 +x0501 db %00000010 ;V. form feed + db #01,#2E +x0504 db %01000010 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #00,#21 +x0507 db %00000001 ;D. data + db #01,#23 + db #15,#80 + db #0E,#0F +x050E db %01000001 ;S. speed + db #01,#1A + db #15,#02 + db #1B,#1C +x0515 db %00000001 ;A. data bits + db #01,#1D + db #15,#04 + db #1E,#1F +x051C db %00000001 ;P. stop bits + db #01,#20 + db #15,#08 + db #21,#22 +x0523 db %01000001 ;I. interface + db #01,#17 + db #15,#01 + db #18,#19 +x052A db %01000000 ;P. printer + db #01,#0B +x052D db %01000000 ;computer НЕ ИСПОЛЬЗУЕТСЯ!!!! + db #01,#2C +x0530 db %10000000 ;0. previous menu + db #01,#07 +x0533 db %10000000 ;0. Continue program + db #01,#08 +x0536 db %01000000 ;G. magic button + db #01,#09 +x0539 db %01000000 ;B. Save & load + db #01,#2D +x053C db %01000000 ;M. Monitor + db #01,#0A +x053F db %01000001 ;S. print screen + db #01,#03 + db #12,#04 + db #0E,#0F +x0546 db %01000000 ;P. Print Screen + db #01,#03 +x0549 db %01000000 ;P. printer * 2 + db #01,#55 +x054C db %01000000 ;S. printer * 1 + db #01,#54 +x054F db %01000000 ;D. disk ... + db #01,#0C +x0552 db %01000000 ;S. Set Up + db #01,#04 +x0555 db %01000000 ;R. reset monitor + db #01,#53 +x0558 db %01000000 ;S. save ... + db #01,#5A +x055B db %01000000 ;L. load ... + db #01,#5B +x055E db %10000000 ;R. ROM disk + db #00,#5E +x0561 db %01000001 ;A. autostart + db #01,#69 + db #14,#04 + db #25,#26 +x0568 db %00000001 ;Z. compression + db #02,#0D + db #13,#20 + db #04,#05 +x056F db %00000010 ;?. degree + db #02,#0E + db #26,#01 + db #FF +x0575 db %01000001 ;V. Computer Speed + db #01,#58 + db #19,#40 + db #56,#57 +x057C db %01000010 ;N. NMI debouncing + db #01,#5D + db #25 + db #01,#80 ;1..127 +x0582 db %01000000 ;G. graphics manipulators + db #01,#5E +x0585 db %01000001 ;G. manipulators + db #01,#60 + db #27,#80 + db #26,#25 +x058C db %01000001 ;M. mouse + db #01,#61 + db #27,#20 + db #26,#25 +x0593 db %00000001 ;K. kempston joystick + db #01,#62 + db #27,#40 + db #26,#25 +x059A db %01000010 ;1. first debouncing + db #01,#63 + db #2A + db #01,#C8 +x05A0 db %00000010 ;2. before repeat + db #01,#64 + db #2B + db #01,#C8 +x05A6 db %00000010 ;3. second wait + db #01,#65 + db #2C + db #01,#C8 +x05AC db %00000010 ;4. second debouncing + db #01,#66 + db #2D + db #01,#C8 +x05B2 db %00000010 ;S. size of step + db #01,#67 + db #2E + db #01,#08 +x05B8 db %01000000 ;T. time & date + db #02,#01 +x05BB db %01000001 ;I. indicator + db #02,#03 + db #27,#08 + db #04,#05 +x05C2 db %01000010 ;H. hours + db #02,#06 + db #E4 ;=#1C + db #00,#18 +x05C8 db %00000010 ;M. minutes + db #02,#07 + db #E3 ;-#1D + db #00,#3C +x05CE db %00000010 ;S. seconds + db #02,#08 + db #E2 ;-#1E + db #00,#3C +x05D4 db %00000010 ;Y. years + db #02,#09 + db #E7 ;-#19 + db #00,#64 +x05DA db %00000010 ;O. months + db #02,#0A + db #E6 ;-#1A + db #01,#0D +x05E0 db %01000010 ;D. days + db #02,#0B + db #E5 ;-#1B + db #01,#20 +x05E6 db %01000000 ;P. save CMOS + db #01,#6A +x05E9 db %00000000 ;G. load CMOS + db #01,#6B +x05EC db %01000000 ;C. save Set Up to disk + db #01,#6C +x05EF db %01000000 ;H. Hard disk utility + db #02,#0F +x05F2 db %01100000 ;C. cylinders + dw x1047 ;печать количества цилиндров HDD +x05F5 db %00000010 ;H. head + db #02,#11 + db #E0 ;-#20 + db #01,#40 +x05FB db %00000010 ;S. sector + db #01,#40 + db #E1 ;-#1F + db #01,#40 +x0601 db %00000001 ;L. LBA mode + db #02,#35 + db #1C,#04 + db #04,#05 +x0608 db %01000001 ;M. TRDOS mirror + db #02,#36 + db #1C,#10 + db #05,#04 +x060F db %01000000 ;P. partition manager + db #02,#12 +x0612 db %01000000 ;A. delete all part + db #02,#14 +x0615 db %01000000 ;G. global part. table + db #02,#13 +x0618 db %01000000 ;V. partition information + db #02,#16 +x061B db %01000000 ;L. local part. table + db #02,#15 +x061E db %01000000 ;D. delete partition + db #02,#18 +x0621 db %01000000 ;C. create partition + db #02,#19 +x0624 db %00000000 ;N. rename partition + db #02,#32 +x0627 db %00000000 ;W. write to disk + db #02,#1A +x062A db %10000000 ;R. restore from disk + db #02,#1B +x062D db %01000000 ;A. auto detection hdd + db #02,#1C +x0630 db %00100011 ;D. mount on D: + dw x247E ;печать нового пути +x0633 db %00100010 ;C. mount on C: + dw x247E ;печать нового пути +x0636 db %00100001 ;B. mount on B: + dw x247E ;печать нового пути +x0639 db %01100000 ;A. mount on A: + dw x247E ;печать нового пути +x063C db %01000001 ;A. autostart + db #01,#69 + db #1C,#01 + db #26,#25 +x0643 db %00000011 ;V. from drive + db #01,#70 + db #DD ;-#23 + db #34,#35,#36,#37 +x064B db %00100000 ;Z. dismount... + dw x24CE ;печать нового названия пункта + db #0B,#80 +x0650 db %00000001 ;O. on start + db #02,#31 + db #1C,#02 + db #05,#04 +x0657 db %01000000 ;1. test + db #01,#06 +x065A db %00000000 ;2. test + db #01,#06 +x065D db %01000000 ;D. delete all part + db #02,#14 + +;АДРЕС: #0660 дескрипторы меню +;дескриптор опций +;+0,4-0 цифра/буква выбора опции 0-5/A-Z +; ,7-5 номер атрибутов печати из таблицы xEAED +;+1,3-2 старший байт смещения от x08DD до п/п определения доступности опции +; 5-4 старший байт смещения от x0468 параметры опции +; 7-6 старший байт смещения от x08DD до п/п обработки опции +;+2 младший байт смещения от x08DD до п/п определения доступности опции +;+3 младший байт смещения от x0468 параметры опции +;+4 младший байт смещения от x08DD до п/п обработки опции +x0660 db #07 ;количество опций в меню -1 + db #01,#02 ;меню: main menu + db 0*#20+#1A,%01000000,#6A,#CB,#E4 ;0. Continue program x0947/x0533/ x0AC1 + db 1*#20+#01,%01000000,#6A,#D1,#C1 ;B. Save & load x0947/x0539/x0A9E + db 2*#20+#0C,%01000000,#6F,#D4,#B2 ;M. Monitor x094C/x053C/ x0A8F + db 1*#20+#0F,%01000000,#64,#DE,#C3 ;P. Print Screen x0941/x0546/x0AA0 + db 1*#20+#03,%01000000,#6A,#06,#BC ;D. Disk utility x0947/x046E/x0A99 + db 1*#20+#07,%01010000,#5E,#87,#7A ;H. Hard disk utility x093B/x05EF/x0A57 + db 1*#20+#12,%01000000,#6A,#EA,#C2 ;S. Set Up x0947/x0552/x0A9F + db 1*#20+#15,%10010000,#3C,#0D,#9D ;V. Computer Speed x0919/x0575/x0B7A + +x068B db #07 ;количество опций в меню -1 + db #01,#5C ;меню: save & load of program + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#06,%01000000,#2F,#CE,#EC ;G. magic button x090C/x0536/ x0AC9 + db 1*#20+#12,%00000000,#6F,#F0,#D8 ;S. save ... x094C/x0558/x09B5 + db 1*#20+#19,%10010000,#6F,#00,#9D ;Z. compression x094C/x0568/x0B7A + db 1*#20+#16,%10010000,#48,#07,#A4 ;W. degree x0925/x056F/x0B81 + db 1*#20+#0B,%00000000,#6F,#F3,#DE ;L. load ... x094C/x055B/x09BB + db 1*#20+#00,%10000000,#6F,#F9,#9D ;A. autostart x094C/x0561/x0B7A + db 1*#20+#11,%00000000,#7B,#F6,#C3 ;R. ROM disk x0958/x055E/x09A0 + +x06B6 db #03 + db #01,#03 ;меню: print screen + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#12,%01000000,#6A,#E4,#A2 ;S. printer * 1 x0947/x054C/ x0A7F + db 1*#20+#0F,%01000000,#6A,#E1,#A3 ;P. printer * 2 x0947/x0549/ x0A80 + db 1*#20+#03,%00000000,#6A,#E7,#E4 ;D. disk ... x0947/x054F/x09C1 + +x06CD db #07 + db #01,#04 ;меню: Set Up + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#12,%10000000,#64,#D7,#9D ;S. print screen x0941/x053F/x0B7A + db 1*#20+#0F,%01000000,#6A,#C2,#BF ;P. printer x0947/x052A/x0A9C + db 1*#20+#0C,%01000000,#6A,#7B,#BD ;M. monitor x0947/x04E3/x0A9A + db 1*#20+#03,%01000000,#6A,#06,#BB ;D. Disk utility x0947/x046E/x0A98 + db 1*#20+#06,%01010000,#6A,#1A,#C0 ;G. graphics manipulat. x0947/x0582/x0A9D + db 1*#20+#13,%01010000,#57,#50,#BA ;T. time & date x0934/x05B8/x0A97 + db 2*#20+#11,%01000000,#6A,#ED,#73 ;R. reset monitor x0947/x0555/x0A50 + +x06F8 db #0B + db #01,#16 ;меню: Set Up printer + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#08,%10000000,#6A,#BB,#9D ;I. interface x0947/x0523/x0B7A + db 1*#20+#12,%10000000,#75,#A6,#9D ;S. speed x0952/x050E/x0B7A + db 1*#20+#00,%10000000,#75,#AD,#9D ;A. data bits x0952/x0515/x0B7A + db 1*#20+#0F,%10000000,#75,#B4,#9D ;P. stop bits x0952/x051C/x0B7A + db 1*#20+#03,%10000000,#6A,#9F,#9D ;D. data x0947/x0507/x0B7A + db 1*#20+#02,%10000000,#6A,#93,#A4 ;C. carriage return x0947/x04FB/x0B81 + db 1*#20+#05,%10000000,#6A,#8D,#A4 ;F. line feed x0947/x04F5/x0B81 + db 1*#20+#15,%10000000,#6A,#99,#A4 ;V. form feed x0947/x0501/x0B81 + db 1*#20+#0B,%10000000,#6A,#81,#A4 ;L. string width x0947/x04E9/x0B81 + db 1*#20+#16,%10000000,#6A,#87,#A4 ;W. page length x0947/x04EF/x0B81 + db 1*#20+#11,%01000000,#6A,#7E,#9B ;R. reset x0947/x04E6/x0A78 + +x0737 db #07 + db #01,#2F ;меню: Set Up monitor + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#0D,%10010000,#6A,#14,#A4 ;N. NMI debouncing x0947/x057C/x0B81 + db 1*#20+#11,%10000000,#6F,#74,#9D ;R. reset RAM x094C/x04DC/x0B7A + db 1*#20+#12,%10000000,#6A,#66,#98 ;S. sound x0947/x04CE/x0B75 + db 1*#20+#0F,%00010000,#4E,#7E,#C6 ;P. save CMOS x092B/x05E6/x09A3 + db 1*#20+#06,%00010000,#4E,#81,#CC ;G. load CMOS x092B/x05E9/x09A9 + db 1*#20+#02,%00010000,#6B,#84,#D2 ;C. save Set Up to disk x0948/x05EC/x09AF + db 1*#20+#00,%10000000,#6A,#6D,#9D ;A. autoconfig x0947/x04D5/x0B7A + +x0762 db #09 + db #01,#32 ;меню: Set Up disk utility + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 + db 1*#20+#13,%10000000,#6A,#3D,#9D ;T. track x0947/x04A5/x0B7A + db 1*#20+#12,%10000000,#6A,#33,#9D ;S. side x0947/x049B/x0B7A + db 1*#20+#0F,%10000000,#6A,#5B,#06 ;P. speed x0947/x04C3/x0AE3 + db 1*#20+#0B,%10000000,#6A,#2D,#A4 ;L. interleaving x0947/x0495/x0B81 + db 1*#20+#11,%10000000,#6A,#23,#9D ;R. track x0947/x048B/x0B7A + db 1*#20+#08,%10000000,#6A,#19,#9D ;I. side x0947/x0481/x0B7A + db 1*#20+#04,%10000000,#6A,#50,#0B ;E. sector x0947/x04B8/x0AE8 + db 1*#20+#18,%10000000,#6A,#12,#A4 ;Y. retry constant x0947/x047A/x0B81 + +x0797 db #07 + db #01,#4D ;меню: disk utility + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 + db 1*#20+#02,%10000000,#6A,#00,#48 ;C. catalogue disk x0947/x0468/x0B25 + db 1*#20+#05,%10000000,#6A,#09,#33 ;F. format disk x0947/x0471/x0B10 + db 1*#20+#10,%10000000,#6A,#0C,#26 ;Q. quick format x0947/x0474/x0B03 + db 1*#20+#13,%10000000,#6A,#0F,#3A ;T. test disk x0947/x0477/x0B17 + db 1*#20+#00,%10010000,#6A,#D4,#9D ;A. autostart x0947/x063C/x0B7A + db 1*#20+#15,%01010000,#6A,#DB,#F0 ;V. from drive x0947/x0643/x0ACD + +x07C2 db #08 + db #02,#0F ;меню: hard disk utility + db 0*#20+#1A,%01000000,#AD,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#00,%00010000,#80,#D1,#F5 ;A. mount on A: x095D/x0639/x09D2 + db 1*#20+#01,%00010000,#80,#CE,#F1 ;B. mount on B: x095D/x0636/x09CE + db 1*#20+#02,%00010000,#80,#CB,#ED ;C. mount on C: x095D/x0633/x09CA + db 1*#20+#03,%00010000,#80,#C8,#E9 ;D. mount on D: x095D/x0630/x09C6 + db 1*#20+#19,%10010000,#80,#E3,#9D ;Z. dismount... x095D/x064B/x0B7A + db 1*#20+#0C,%10010000,#80,#A0,#9D ;M. TRDOS mirror x095D/x0608/x0B7A + db 1*#20+#0F,%01010000,#06,#A7,#0B ;P. partition manager x08E3/x060F/x09E8 + db 1*#20+#12,%01000000,#6A,#EA,#B6 ;S. Set Up x0947/x0552/x0A93 + +x07F2 db #07 + db #02,#13 ;меню: global partition table + db 0*#20+#1A,%01000000,#6A,#C8,#DC ;0. previous menu x0947/x0530/x0AB9 + db 1*#20+#0B,%01010000,#80,#B3,#05 ;L. local part. table x095D/x061B/x09E2 + db 1*#20+#15,%01010000,#6A,#B0,#00 ;V. partition info. x0947/x0618/x09DD + db 1*#20+#02,%01010000,#86,#B9,#3F ;C. create partition x0963/x0621/x0A1C + db 2*#20+#03,%01010000,#9A,#B6,#35 ;D. delete partition x0977/x061E/x0A12 + db 2*#20+#00,%01010000,#6A,#AA,#4E ;A. delete all part x0947/x0612/x0A2B + db 1*#20+#11,%01010000,#6A,#C2,#30 ;R. restore from disk x0947/x062A/x0A0D + db 3*#20+#16,%01010000,#A1,#BF,#58 ;W. write to disk x097E/x0627/x0A35 + + +x081D db #08 + db #02,#15 ;меню: local partition table + db 0*#20+#1A,%01000000,#6A,#C8,#D7 ;0. previous menu x0947/x0530/x0AB4 + db 1*#20+#06,%01010000,#A7,#AD,#30 ;G. global part. table x0984/x0615/x0A0D + db 1*#20+#15,%00010000,#6A,#B0,#FB ;V. partition info. x0947/x0618/x09D8 + db 1*#20+#02,%01010000,#90,#B9,#44 ;C. create partition x096D/x0621/x0A21 + db 1*#20+#0D,%01010000,#9A,#BC,#49 ;N. rename partition x0977/x0624/x0A26 + db 2*#20+#03,%01010000,#9A,#B6,#3A ;D. delete partition x0977/x061E/x0A17 + db 2*#20+#00,%01010000,#6A,#AA,#53 ;A. delete all part x0947/x0612/x0A30 + db 1*#20+#11,%01010000,#6A,#C2,#08 ;R. restore from disk x0947/x062A/x09E5 + db 3*#20+#16,%01010000,#A1,#BF,#62 ;W. write to disk x097E/x0627/x0A3F + +x084D db #09 + db #01,#6D ;меню: Set Up hard disk + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#00,%01010000,#6A,#C5,#6C ;A. auto detection hdd x0947/x062D/x0A49 + db 1*#20+#0E,%10010000,#6A,#E8,#9D ;O. on start x0947/x0650/x0B7A + db 1*#20+#02,%10010000,#6A,#8A,#51 ;C. cylinders x0947/x05F2/x0B2E + db 1*#20+#07,%10010000,#6A,#8D,#89 ;H. head x0947/x05F5/x0B66 + db 1*#20+#12,%10010000,#6A,#93,#89 ;S. sector x0947/x05FB/x0B66 + db 1*#20+#0B,%10010000,#6A,#99,#9D ;L. LBA mode x0947/x0601/x0B7A + db 1*#20+#1B,%01010000,#00,#EF,#8F ;1. test x08DD/x0657/x0A6C + db 1*#20+#1C,%01010000,#00,#F2,#93 ;2. test x08DD/x065A/x0A70 + db 2*#20+#03,%01010000,#00,#F5,#97 ;D. delete all part x08DD/x065D/x0A74 + +x0882 db #08 + db #01,#5F ;меню: Set Up graphics manipulators + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#06,%10010000,#6A,#1D,#9D ;G. manipulators x0947/x0585/x0B7A + db 1*#20+#0C,%10010000,#1E,#24,#9D ;M. mouse x08FB/x058C/x0B7A + db 1*#20+#0A,%10010000,#12,#2B,#9D ;K. kempston joystick x08EF/x0593/x0B7A + db 1*#20+#12,%10010000,#0C,#4A,#A4 ;S. size of step x08E9/x05B2/x0B81 + db 1*#20+#1B,%10010000,#0C,#32,#A4 ;1. first debouncing x08E9/x059A/x0B81 + db 1*#20+#1C,%10010000,#0C,#38,#A4 ;2. before repeat x08E9/x05A0/x0B81 + db 1*#20+#1D,%10010000,#0C,#3E,#A4 ;3. second wait x08E9/x05A6/x0B81 + db 1*#20+#1E,%10010000,#0C,#44,#A4 ;4. second debouncing x08E9/x05AC/x0B81 + +x08B2 db #07 + db #02,#02 ;меню: Set Up time & date + db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC + db 1*#20+#07,%10010000,#57,#5A,#6E ;H. hours x0934/x05C2/x0B4B + db 1*#20+#0C,%10010000,#57,#60,#6E ;M. minutes x0934/x05C8/x0B4B + db 1*#20+#12,%10010000,#57,#66,#6E ;S. seconds x0934/x05CE/x0B4B + db 1*#20+#03,%10010000,#57,#78,#6E ;D. days x0934/x05E0/x0B4B + db 1*#20+#0E,%10010000,#57,#72,#6E ;O. months x0934/x05DA/x0B4B + db 1*#20+#18,%10010000,#57,#6C,#6E ;Y. years x0934/x05D4/x0B4B + db 1*#20+#08,%10010000,#57,#53,#84 ;I. indicator x0934/x05BB/x0B61 + +;АДРЕС: #08DD блок п/п определяющих доступность опций +;вых: cy =1 опция недоступна +; +;АДРЕС: #08DD блок п/п обработки опций +;вых: +; +x08DD bit 7,(iy+#1A) ;доступность опции 1. test + jr x0938 + +x08E3 bit 7,(iy+#1B) ;доступность опции P. partition manager + jr x0938 + +x08E9 bit 7,(iy+#27) ;доступность опции S. size of step + jr x0938 + +;АДРЕС: #08EF доступность опции K. kempston joystick +x08EF call x08FB ;доступность опции K. kempston joystick + or a + ret + +x08F4 ccf ;НЕ ИСПОЛЬЗУЕТСЯ!!!! + ret nc + res 6,(iy+#27) + ret + +x08FB push bc ;доступность опции M. mouse + ld bc,#FADF + in a,(c) + pop bc + and #38 + cp #38 + ret nc + res 5,(iy+#27) + ret + +x090C scf ;доступность опции G. magic button + bit 4,(iy-#02) + ret z ;48k + ld a,(iy-#01) + and #13 + jr x0945 + +x0919 ld a,(xE02D) ;определение доступности турбо-режима + rlca + ccf + ret + +x091F bit 5,(iy-#02) ;48k? + jr x0945 + +x0925 bit 5,(iy+#13) ;доступность опции W. degree + jr x0938 + +x092B call x091F ;доступность опции P. save CMOS + ret c + bit 5,(iy+#1A) + ret nz + +x0934 bit 6,(iy+#1A) ;доступность опции T. time & date +x0938 ret nz + scf + ret + +x093B bit 5,(iy+#1A) ;доступность опции Hard disk utility + jr x0938 + +x0941 bit 1,(iy+#12) ;доступность опции Print Screen +x0945 ret z + scf +x0947 ret + +x0948 call x091F ;доступность опции C. save Set Up to disk + ret c + +x094C ld a,(xC063) ;доступность опции Monitor + or a + jr x0945 + +x0952 bit 0,(iy+#15) ;доступность опции параметров принтера + jr x0938 + +x0958 call x10C7 ;доступность опции R. ROM disk + jr x0938 + +x095D bit 7,(iy+#1C) ;доступность монтирования образов + jr x0938 + +x0963 call x2936 ;доступность опции C. create partition + ld hl,#0003 + or a + sbc hl,de + ret + +x096D call x2936 ;доступность опции C. create partition + ld hl,#003F + or a + sbc hl,de + ret + +x0977 call x2936 ;доступность опции D. delete partition + ld a,e + or d + jr x0938 + +x097E bit 6,(iy+#1C) ;доступность опции W. write to disk + jr x0938 + +x0984 bit 6,(iy+#1C) ;доступность опции G. global part. table + jr x0945 + +;АДРЕС: #098A проверка наличия раздела MFS на винчетере +;вых: z - нет раздела MFS/либо нет винчестера +; nz - есть раздел MFS +x098A xor a + bit 7,(iy+#1B) + ret z ;проверка геометрии винчестера не пройдена + bit 7,(iy+#1C) + ret nz ;на винчестере есть раздел MFS + res 7,(iy+#0B) ;меню mount + push bc + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + pop bc + xor a + ret + +;пункт меню: R. ROM disk +x09A0 jp x10DB ;обработка пункта меню: R. ROM disk + +;пункт меню: P. save CMOS +x09A3 rst #30 + dw rom4_x036C ;запись переменных в CMOS и в NVRAM + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: G. load CMOS +x09A9 rst #30 + dw rom4_x0305 ;установка переменных из NVRAM/CMOS128 + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: C. save Set Up to disk +x09AF rst #30 + dw rom4_x0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) + db #04 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: S. save ... +x09B5 rst #30 + dw rom6_x097E ;сохранение zs-snap (S. save ... snap) + db #06 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: L. load ... +x09BB rst #30 + dw rom6_x0976 ;загрузка zs-snap (S. load ... snap) + db #06 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: D. disk ... (сохранение экрана на диск) +x09C1 rst #30 + dw rom6_x067F ;сохранение экрана пользователя на диск + db #06 + ret + +;пункт меню: D. mount on D: +x09C6 ld a,#03 + jr x09D3 +;пункт меню: C. mount on C: +x09CA ld a,#02 + jr x09D3 +;пункт меню: B. mount on B: +x09CE ld a,#01 + jr x09D3 +;пункт меню: A. mount on A: +x09D2 xor a +x09D3 call x24F0 ;монтирование образа к дисководу + jr x09E0 ;печать текущего меню монитора + +;пункт меню: V. local partition infomation +x09D8 call x29D5 + jr x09E0 ;печать текущего меню монитора + +;пункт меню: V. global partition infomation +x09DD call x29DC ;печать окна global partition information и выбор записи в нем +x09E0 jr x0A54 ;печать текущего меню монитора + +;пункт меню: L. local part. table +x09E2 call x2F5D ;запрос на сохранение сектора MBR, если были изменения + +;пункт меню: R. restore from disk чтение каталога подразделов +x09E5 call x0B86 + +;пункт меню: P. partition manager (local) +x09E8 rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x09F6 ;найден + cp #63 + jr z,x0A01 ;нет подраздела MFS + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 +x09F6 res 6,(iy+#1C) ;сброс признака изменения раздела + call x2620 ;формирование в буфере xEBF5 списка подразделов MFS + ld a,#0D + jr x0A0A +x0A01 res 6,(iy+#1C) ;сброс признака изменения раздела + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + ld a,#0C +x0A0A jp x0AA1 + +;пункт меню: G. global partition table/R. restore from disk чтение каталога разделов +x0A0D call x0B86 + jr x0A01 + +;пункт меню: D. delete global partition +x0A12 call x2C1F + jr x0A54 ;печать текущего меню монитора + +;пункт меню: D. delete local partition +x0A17 call x2D45 ;удаление подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: C. create global partition +x0A1C call x2BCA + jr x0A54 ;печать текущего меню монитора + +;пункт меню: C. create local partition +x0A21 call x2C37 ;создание подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: N. rename local partition +x0A26 call x245E ;переименование подраздела + jr x0A54 ;печать текущего меню монитора + +;пункт меню: A. delete all global partition +x0A2B call x2733 + jr x0A54 ;печать текущего меню монитора + +;пункт меню: A. delete all local partition +x0A30 call x261A ;удаление всех подразделов + jr x0A54 ;печать текущего меню монитора + +;пункт меню: W. write to disk (запись MBR на винчестер) +x0A35 call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x0A54 ;отмена записи + call x2F66 ;формирование и запись сектора MBR + jr x0A0D ;перечитаем его и в меню + +;пункт меню: W. write to disk (запись каталога MFS на винчестер) +x0A3F call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x0A54 ;оказ от записи. возврат в меню + call x2FB1 ;запись каталога MFS + jr x09E5 ;чтение каталога подразделов + +;пункт меню: A. auto detection hdd (запуск идентификации HDD) +x0A49 ld e,#01 + call x30B9 ;идентификация жесткого диска + jr x0A54 ;печать текущего меню монитора + +;пункт меню: R. reset monitor +x0A50 xor a + ld (xEAF5+#0A),a ;xEAFF испортим память +;печать текущего меню монитора +x0A54 jp x0EB5 + +;пункт меню: H. Hard disk utility +x0A57 xor a + res 7,(iy+#0B) ;меню mount + res 7,(iy+#1C) + bit 7,(iy+#1B) + jr z,x0A96 + call x2739 ;формирование в буфере xEBF5 списка разделов MBR + xor a + jr x0A96 + +;пункт меню: 1. test (тест только на чтение) +x0A6C rst #30 + dw rom7_x2105 ;тестирование HDD (1. test) (тест только на чтение) + db #07 ;возврат в текущее меню монтора + +;пункт меню: 2. test (тест на чтение/запись) +x0A70 rst #30 + dw rom7_x20F1 ;тестирование HDD (2. test) (тест на чтение/запись) + db #07 ;возврат в текущее меню монтора + +;пункт меню: D. delete all part (удаление всех разделов MBR) +x0A74 rst #30 ;!!! можно вызвать нарямую !!! + dw rom5_x31AA ;удаление всех разделов MBR + db #05 + +;пункт меню: R. reset printer +x0A78 ld hl,#0000 + ld (xE067),hl + ret + +;пункт меню: S. printer * 1 +x0A7F scf +;пункт меню: S. printer * 2 +x0A80 ld hl,xE029 + set 5,(hl) + jr nc,x0A89 + res 5,(hl) +x0A89 rst #30 + dw rom2_x08D7 + db #02 + jr x0A54 ;печать текущего меню монитора + + +;пункт меню: M. Monitor +x0A8F rst #30 + dw 0AEBh + db #02 + +x0A93 inc a ;(a=#0E) S. Set Up hard disk +x0A94 inc a +x0A95 inc a +x0A96 inc a ;(a=#0B) H. Hard disk utility +x0A97 inc a ;(a=#09) T. time & date +x0A98 inc a ;(a=#09) D. Disk utility +x0A99 inc a ;(a=#08) D. Disk utility +x0A9A inc a ;(a=#07) M. monitor +x0A9B inc a +x0A9C inc a ;(a=#05) P. printer +x0A9D inc a ;(a=#04) G. graphics manipulator +x0A9E inc a ;(a=#03) B. Save & load +x0A9F inc a ;(a=#02) S. Set Up +x0AA0 inc a ;(a=#01) P. Print Screen +x0AA1 push af + ld hl,(xE033) ;a - номер нового меню + ld a,(xDDFF) ;номер текущего меню + ld (hl),a + inc hl + ld (xE033),hl + pop af + ld (xDDFF),a +x0AB1 jp x0EB5 ;печать текущего меню монитора + +;выход из меню: L. local partition table +x0AB4 call x2FA8 ;запрос на сохранение каталога MFS, если были изменения + jr x0ABC + +;выход из меню: G. global partition table +x0AB9 call x2F5D ;запрос на сохранение сектора MBR, если были изменения + +;вызов предыдущего меню: 0. previous menu +x0ABC call x0B86 + jr x0AB1 ;печать текущего меню монитора + +;выход из монитора: 0. Continue program +x0AC1 rst #30 ;обработка 0. Continue program + dw rom2_x382E ;ожидание отжатия всех клавиш + db #02 + rst #30 + dw rom2_x013A ;выход из монитора + db #02 + +;пункт меню: G. magic button +x0AC9 rst #30 + dw rom2_x36C3 ;запись стандартного Magic-файла + db #02 + +;пункт меню: V. from drive (изменение диска автозапуска) +x0ACD ld hl,xDFF1 ;с какого диска делать автостарт + ld bc,#0004 ;мин/макс + jr x0AF8 ;циклическое изменение многовариантных параметров монитора + +;пункт меню: D. disk drive (смена текущего дисковода) +x0AD5 ld hl,xFFCA + ld bc,#0004 + call x0AF8 ;циклическое изменение многовариантных параметров монитора + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ + db #02 + ret + +;пункт меню: P. speed (изменение скорости работы текущего дисковода) +x0AE3 ld hl,xFFCC + jr x0AEB + +;пункт меню: E. sector (изменение размера сектора текущего дисковода) +x0AE8 ld hl,xFFD0 +x0AEB ld bc,(xFFCA) + ld b,#00 ;номер текущего дисковода + add hl,bc + ld a,(hl) + and #E0 + ld b,a + ld c,#04 + +;циклическое изменение многовариантных параметров монитора +;вх: hl - адрес пееременной +; c - максимальное значение+1 +; b - минимальное значение +; +x0AF8 ld a,(hl) + and #03 + inc a + cp c + jr c,x0B00 + xor a +x0B00 or b + ld (hl),a + ret + +;пункт меню: Q. quick format (быстрое форматирование текущего диска) +x0B03 set 7,(iy+#13) + call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана + rst #30 + dw rom6_x04E5 ;быстрое форматирование текущей дискеты (очистка каталога) + db #06 + jr x0B2B ;;печать текущего меню монитора + +;пункт меню: F. format disk (форматирование текущего диска) +x0B10 ld hl,xE027 + set 7,(hl) + jr x0B1C + +;пункт меню: T. test disk (проверка текущего диска) +x0B17 ld hl,xE027 + res 7,(hl) +x0B1C call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана + rst #30 + dw rom6_x03A9 ;форматирование/проверка текущей дискеты + db #06 + jr x0B2B ;;печать текущего меню монитора + +;пункт меню: C. catalogue disk (вывод каталога текущего диска) +x0B25 rst #20 + db #8C + rst #30 + dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) + db #06 +x0B2B jp x0EB5 ;печать текущего меню монитора + +;пункт меню: C. cylinders (установка цилиндров) +x0B2E ld hl,x0EB5 ;печать текущего меню монитора + push hl + ld bc,(xDFF2) ;значение Cylinders HDD (2 байта) + ld a,#07 +x0B38 call x0BD9 ;ввод числа. в BC начальное значение + ret c ;омена ввода + ld a,e + or d + ld a,#0C + jr z,x0B38 ;ввели ноль. повтор ввода + ld (xDFF2),de ;новое значение Cylinders HDD (2 байта) + rst #30 + dw rom7_x1F08 ;проверка геометрии винчестера + db #07 + ret + +;АДРЕС: #0B4B ввод и сохранение значений времени/даты +x0B4B res 3,(iy+#27) ;гасим индикатор времени + call x0B9B ;ввод параметра текущей опции (число 0..255) + set 3,(iy+#27) + jr c,x0B2B ;завершение по break/cancel + ld hl,xDFF6 ;бефер занчений времени/даты + rst #30 + dw rom7_x1FB2 ;запись в CMOS времени и даты + db #07 + jr x0B2B ;завершение ввода + +;АДРЕС: #0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) +;вх: bc - адрес описания опции (x0468) +; +x0B61 call x0B7A + jr x0B2B ;печать текущего меню монитора + +;пункт меню: H. head; S. sector +x0B66 call x0B9B ;ввод параметра текущей опции (число 0..255) + jr c,x0B2B ;отмена ввода. печать текущего меню монитора + rst #30 + dw rom7_x1F2D ;расчет произведения головок и секторов + db #07 + rst #30 + dw rom7_x1F08 ;проверка геометрии винчестера + db #07 + jr x0B2B ;печать текущего меню монитора + +;пункт меню: S. sound +x0B75 ld a,#FF + ld (xE004),a ;глушим звук + +;АДРЕС: #0B7A смена параметра опции на противоположное (ON/OFF, normal/trubo и т.п.) +;вх: bc - адрес описания опции (xNNNN) +x0B7A call x0FE3 + ld a,(de) + xor (hl) + ld (de),a + ret + +;АДРЕС: #0B81 ввод и сохранение значений опций +;вх: bc - адрес описания опции (xNNNN) +x0B81 call x0B9B ;ввод параметра текущей опции (число 0..255) + jr x0B2B ;печать текущего меню монитора + +;АДРЕС: #0B86 +x0B86 ld de,xDE08 + ld hl,(xE033) + xor a + sbc hl,de + add hl,de + jr z,x0B97 + dec hl + ld (xE033),hl + ld a,(hl) +x0B97 ld (xDDFF),a + ret + +;АДРЕС: #0B9B ввод параметра текущей опции (число 0..255) +;вх: bc - адрес описания опции (x0468) +;вых: cy=1 завершение по break/cancel +; +x0B9B res 5,(iy+#0E) ;ввод строки параметров + call x0FE3 ;получение адреса переменной опции + ld c,(hl) ;минимальное значение + inc hl + ld b,(hl) ;максимальное значение + ld a,(de) ;текущее значение + call x0CB0 ;печать числа A в буфере ввода строки + push de + push bc + ld a,#07 ;сообщение: enter number +x0BAD call x0BF3 ;ввод строки символов + jr c,x0BCD ;завершение ввода по break/cancel + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + jr nz,x0BAD ;неудачное преобразование. продолжаем ввод + ld a,d + or a + ld a,#0C ;сообщение: out of range + jr nz,x0BAD ;слишком большое число. продолжаем ввод + pop bc + push bc + ld a,e + call x102E ;проверка диапазона числа + ld a,#0C ;сообщение: out of range + jr c,x0BAD ;слишком большое число. продолжаем ввод + pop bc + ld a,e + pop de + ld (de),a ;меняем переменную + ret +;завершение ввода по break/cancel +x0BCD pop bc + pop de + ret + +;АДРЕС: #0BD0 ввод числа. в BC начальное значение +;вх: bc - начальное число +; hl - параметры окна ввода +;вых: cy=1 отмена ввода +; cy=0 число введено +; de - введенное число +x0BD0 ld (xE9EF),hl ;параметры окна ввода + set 5,(iy+#0E) + jr x0BDD + +;АДРЕС: #0BD9 ввод числа. в BC начальное значение +;вх: bc - начальное число +;вых: cy=1 отмена ввода +; cy=0 число введено +; de - введенное число +x0BD9 res 5,(iy+#0E) +x0BDD push af + call x0CAA ;печать числа bc в буфере ввода строки + pop af + push de + push bc +x0BE4 call x0BF3 ;ввод строки символов + jr c,x0BCD ;отмена ввода + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + jr nz,x0BE4 ;неудачное преобразование (не число/слишком большое) + pop bc + pop af + or a + ret + +;АДРЕС: #0BF3 ввод строки символов +;вх: a-номер сообщения в группе 0 (для нижней строки) +;вых: cy=1 завершение ввода по break/cancel +; cy-0 завершение ввода по enter/fire cursor +; hl - адрес первого введенного символа в буфере +; z - этот символ перевод строки +; +x0BF3 call x0C0B ;ввод строки + jr nc,x0C04 ;завершение ввода по enter + call x0D1A + jr nc,x0C04 ;завершение ввода по fire cursor + cp #03 + scf + ret z ;завершение ввода по break/cancel + xor a + jr x0BF3 ;продолжение ввода строки +x0C04 rst #30 + dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа + db #02 + scf + ccf + ret +;ввод строки +;вх: a-номер сообщения в группе 0 (для нижней строки) +;вых: cy=0 завершение ввода по enter +; cy=1 -> a=3 break/cancel +; cy=1 -> a=a нет эффекта от нажатия +x0C0B rst #30 + dw rom2_x2FFB ;установка текущим окна: ввод числа + db #02 + or a + jr z,x0C69 ;продолжим ввод строки + call x0C22 ;установка параметров окна для ввода строки в меню монитора + rst #30 ;!!! ОШИБКА. можно вызвать напрямую + dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) + db #05 + jr nc,x0C1F ;cy=0 выход по enter + call x0D1A ;определение типа нажатой клавиши + ret c ;отмена/нет эффекта +;завершение ввода по enter/fire cursor +x0C1F or a + ld a,#06 ;сообщение: _Working ... +;установка параметров окна для ввода строки в меню монитора +;вх: a - номер сообщения в группе 0 (для нижней строки) +x0C22 push af + ld b,a ;номер сообщения в группе 0 + call x10C2 ;установка текущим окна: menu + ld a,(ix+6) + push af ;сохраним атрибуты + ld a,(xE115) + ld (ix+6),a ;атрибуты печати сообщения + ld (ix+0),#17 ;координаты печати + ld (ix+1),#00 + rst #20 + dc " " ;пробел + ld c,#00 + rst #08 ;печать сообщения + ld a,#2B + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + pop af + ld (ix+6),a ;восстановим атрибуты + rst #30 + dw rom2_x2FFB ;установка текущим окна: ввод числа + db #02 + bit 5,(iy+#0E) + jr nz,x0C6E ;ввод имени раздела HDD + ld (ix+3),#16 ;crd X окна + ld (ix+6),#4E ;атрибуты %01001110 + ld l,#08 ;ширина в символах + call x0CA0 ;установка ширины окна в знакоместах и символах + ld a,(iy-#09) ;crd Y опции меню +x0C62 ld (ix+2),a ;crd Y окна + rst #20 + db #8C ;очистка окна + pop af + ret +;продолжение ввода строки +x0C69 rst #30 + dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + db #05 + ret +;ввод имени раздела HDD +x0C6E ld (ix+6),#71 ;атрибуты %01110001 + ld hl,(xE9EF) + push hl + call x0C8F ;l=l*6/8 + ld a,(xE0F3+#03) ;xE0F6 координата X окна со списком разделов HDD + add a,l + ld (ix+3),a ;crd X окна + pop hl + ld l,h + call x0CA0 ;установка ширины окна в знакоместах и символах + ld a,(xE0F3) ;координата Y курсора в окне + ld l,a + ld a,(xE0F3+#02) ;xE0F5 координата Y окна + add a,l + jr x0C62 +;вычисление l=l*6/8 +x0C8F push de + ld de,#0006 + ld h,d + rst #30 + dw rom2_x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) + db #02 + ld b,#03 +x0C9A srl l + djnz x0C9A + pop de + ret +;установка ширины окна в знакоместах и символах +;вх: l - ширина окна в символах +x0CA0 ld (ix+#0B),l + call x0C8F + ld (ix+5),l + ret + +;АДРЕС: #0CAA печать числа bc в буфере ввода строки +;вх: bc - число +x0CAA push bc + call x0CB9 + pop bc + ret + +;АДРЕС: #0CB0 печать числа A в буфере ввода строки +;вх: bc - число +x0CB0 push bc + ld c,a + ld b,#00 + call x0CB9 + pop bc + ret + +;АДРЕС: #0CB9 печать числа bc в буфере ввода строки +;вх: bc - число +x0CB9 push de + push bc + call x0CCA ;очистка буфера для ввода строки + inc hl + ld de,#2E0A + ld a,#03 + pop bc + call x0CDA ;печать числа bc в буйфер hl + pop de + ret + +;АДРЕС: #0CCA очистка буфера для ввода строки +;вых: hl - адрес буфера для ввода строки +x0CCA ld b,#2B + ld hl,xDE17 + push hl + ld (xDE15),hl +x0CD3 ld (hl)," " + inc hl + djnz x0CD3 + pop hl + ret + +;АДРЕС: #0CDA печать числа bc в буйфер hl +;вх: hl - адрес буфера для печати числа +; bc - число +; d - символ перед числом +; e - делитель для выделения разряда числа +; a - кол-во разрядов в числе +x0CDA ld (hl),d + inc hl +x0CDC ld (xE3BC),hl ;адрес в буфере печати + set 6,(iy+#09) ;печать в буфер + ld (iy+#07),a ;минимум разрядов в числе при переводе в ASCII + ld (iy+#08),"0" + ld (iy+#10),e ;делитель для выделения разряда числа + rst #30 + dw rom2_x1673 ;печать числа bc /в буфер + db #02 + res 6,(iy+#09) + ret + +;АДРЕС: #0CF6 установка и инициализация окна для ввода строки внизу экрана +;вых: ix - адрес дескриптора окна монитора: ввод строки внизу экрана +x0CF6 rst #30 + dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана + db #02 + ld a,#0C + or a + rst #30 + dw rom5_x1C84 ;инициализация окна ввода + db #05 + ret + +;АДРЕС: #0D02 очистка нижней строки окна меню +x0D02 call x10C2 ;установка текущим окна: menu + ld a,(xE110) + ld (ix+6),a ;атрибуты для печати опции меню + ld (ix+0),#17 ;crd Y курсора + ld (ix+1),#00 ;crd X курсора + ld a,#2B + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + ret + +;АДРЕС: #0D1A определение типа нажатой клавиши +;вх: a - код нажатой клавиши +;вых: cy=0 - это подтверждение ввода (entre/fire cursor) +; =1 -> a=3 break/cancel +; =1 -> a=a нет эффекта от нажатия +x0D1A ld c,a + cp #82 + jr z,x0D29 ;ss+space + cp #80 + ret z ;ss + cp #91 + ret z ;mouse fire + res 3,a ;исключаем прочие комбинации + cp #92 ;mouse cancel +x0D29 ld a,c + scf + ret nz + ld a,#03 + ret + +;АДРЕС: #0D2F определение адреса дескриптора текущего меню +;вых: hl - адрес дескриптора меню +1 +; a = (+0) количество опций в меню -1 (номер последней опции) +x0D2F ld hl,x044A + ld a,(xDDFF) + add a,a + add a,l + ld l,a + jr nc,x0D3B + inc h ;hl адрес в таблице +x0D3B ld a,(hl) + inc hl + ld h,(hl) + ld l,a ;hl адрес описателя окна + ld a,(hl) + inc hl + ret + +;АДРЕС: #0D42 приведение номера горячей клавиши опции к печатному символу +;вх: hl - адрес начала опций в дескрипторе меню +; c - номер опции +;вых: a - печатный символ +; hl - адрес дескриптора заданной опции +2 +; e =(+1) опции +; +x0D42 call x0D52 + +;АДРЕС: #0D45 приведение номера горячей клавиши опции к печатному символу +;вх: a =[#00..#19] -> номер буквы A..Z +; =[#1A..#1F] -> цифра 1..5 +;вых: a - печатный символ +x0D45 and #1F + cp #1A + jr nc,x0D4F + inc a + or #40 + ret +x0D4F add a,#16 + ret + +;АДРЕС: #0D52 определение адреса дескриптора опции +;вх: hl - адрес начала опций в дескрипторе меню +; c - номер опции +;вых: hl - адрес дескриптора заданной опции +2 +; a =(+0) опции +; e =(+1) опции +; +x0D52 ld a,c + add a,a + add a,a + add a,c + add a,l + ld l,a + jr nc,x0D5B + inc h +x0D5B ld a,(hl) + inc hl + ld e,(hl) + inc hl + ret + +;АДРЕС: #0D60 определение адреса с номером текущей опции текущего меню +;вых: hl - адрес ячейки с номером опции +; +x0D60 ld hl,xDE00 + ld a,(xDDFF) + add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #0D6B печать текущего меню +x0D6B call x10C2 ;установка текущим окна: menu +;печать названия меню + ld a,(xE111) ;печать названия окна + ld (ix+6),a ;атрибуты печати + ld (ix+0),#03 ;crd Y =3 + rst #20 ;вывод с выравниванием + db #84 + call x0D2F + ld c,(hl) + inc hl + ld b,(hl) ;bc номер блока сообщений и сообщения в нем + rst #08 ;печать сообщения по номеру в BC (название меню) + rst #20 + db #85 ;выровнять по центру + inc (ix+0) ;crd Y +1 +;печать опций меню + ld c,#00 ;номер опции + ld a,(xE110) ;атрибуты печати опций меню + ld (ix+6),a +x0D8E call x0D2F ;;c=номер текущей опции [0..n] + inc a + cp c + ret z ;все опции напечатаны + inc hl + inc hl ;hl адрес начала опций в дескрипторе меню + call x0D52 ;hl - адрес начала заданной опции +2 + ld b,a +; установка атрибутов печати опции + call x0F51 ;вызов п/п определения доступности опции. cy=1 недоступна + push hl + ld a,(xE112) ;атрибуты неактивной опции + jr c,x0DBB + ld a,b ;выделение Ink печати активной опции + rlca + rlca + rlca + and #07 ;номер Ink в таблице + ld hl,xEAED + add a,l + ld l,a + jr nc,x0DB1 ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы + inc h ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы +x0DB1 ld a,(hl) + and #07 + ld l,a ;Ink печати опции + ld a,(xE110) + and %11111000 + or l +x0DBB ld (ix+6),a ;атрибуты печати опции + pop hl +; установка crdY, выделение опции, печать горячей клавиши вызова + call x0F6D + ld a,(hl) + inc hl + push af + push hl + rlca + rlca + and #03 + add a,(ix+0) + ld (ix+0),a + ld a,b + call x0D45 ;приведение номера горячей клавиши опции к печатному символу + ld b,a ;цифра/буква выбора опции + call x0D60 ;определение адреса с номером текущей опции текущего меню + ld a,(hl) + cp c + call z,x0E6F ;выделение текущей опции меню + pop hl + ld (ix+1),#09 ;печать номера опции + rst #20 + dc " " + ld a,b ;печать цифры/буквы выбора опции + rst #10 + rst #20 + dc ". " + pop af +; печать названия опции + push af + bit 5,a + jr nz,x0E03 ;печать названия отдельной п/п + push bc + ld c,(hl) ;номер блока сообщений + ld (iy-#08),c ;xE00C + inc hl + ld b,(hl) ;номер сообщения в блоке + inc hl + push hl + rst #08 ;печать названия опции + rst #20 + dc " " + ld (ix+1),#1F ;crd X =31 + pop hl + pop bc + jr x0E25 +x0E03 push bc ;печать названия опции отдельной процедурой + ld bc,x0E1F ;сюда вернемся + push bc + ld c,(hl) + inc hl + ld b,(hl) ;bc - адрес п/п печать опции + bit 4,a + jr nz,x0E11 ;она в другой странице + push bc + ret +x0E11 ld (xE3BE+#01),bc ;вызов п/п из другой страницы ROM + inc hl + ld c,a + ld a,(hl) + ld (xE3BE+#03),a + ld a,c + jp xE3BE +x0E1F pop bc + pop af + and #E0 + jr x0E26 ;печать следующей опции +x0E25 pop af +x0E26 and #1F + jr z,x0E68 ;печать следующей опции +; печать текущего параметра опции + push bc + call x0FE9 ;de - адрес переменной/hl - адрес маски для переменной + and #03 + cp #01 + jr nz,x0E45 + ld a,(de) ;два состояния опции, определяем по маске в (hl) + and (hl) + inc hl + ld b,(hl) + inc hl + jr z,x0E3C +x0E3B ld b,(hl) +x0E3C ld c,(iy-#08) ;номер блока сообщений + rst #08 + rst #20 + dc " " + pop bc + jr x0E62 +x0E45 cp #02 + jr nz,x0E57 + ld a,(de) ;это число по адресу переменной + ld c,a + ld b,#00 + ld de,#0A00 + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + pop bc + jr x0E68 ;печать следующей опции +x0E57 ld a,(de) ;1-4 состояния опции, по номеру в de + and #03 + jr z,x0E3B + ld b,a +x0E5D inc hl + djnz x0E5D + jr x0E3B +x0E62 ld a,#29 ;печать пробелов до правого края экрана + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +x0E68 inc c ;печать следующей опции + inc (ix+0) + jp x0D8E + +;АДРЕС: #0E6F выделение атрибутами заданной опции меню (по курсору) +x0E6F push hl + push bc + ld a,(xE113) + and %00111000 + ld c,a ;выделяем paper + ld a,(ix+6) + and %11000111 + or c + ld (ix+6),a ;устанавливаем атрибуты + call x0E98 ;выделение атрибутами заданной опции меню (по курсору) + ld a,(ix+0) + ld (iy-#09),a + pop bc + pop hl + ret + +;АДРЕС: #0E8C снятие выделения атрибутами заданной опции меню (по курсору) +x0E8C ld a,(iy-#09) ;координата Y выделенной опции + ld (ix+0),a ;crd Y + ld a,(xE110) + and %00111000 + ld c,a ;атрибуты печати + +;АДРЕС: #0E98 печать атрибутов заданной опции меню (по курсору) +;вх: c - атрибуты, только Paper +; +x0E98 push bc + ld (ix+1),#00 ;crd X =0 + rst #30 + dw rom2_x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей + db #02 + pop bc + inc hl + ld b,#1E +x0EA5 ld a,(hl) + and %11000111 + or c + ld (hl),a + inc hl + djnz x0EA5 + ret + +;АДРЕС: #0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? +x0EAE rst #30 + dw #000B + db #02 + +;АДРЕС: #0EB2 очистка текущего окна +x0EB2 rst #20 ;очистка текущего окна + db #8C + ret + +;АДРЕС: #0EB5 печать текущего меню монитора +x0EB5 ld sp,xE336 + rst #30 + dw rom2_x04D5 ;включение Турбо-режима + db #02 ;bc =#7FFD + ld h,#E1 ;проверка в ram 8 признака MOA + ld l,#7B + ld a,"M" + cpi + jr nz,x0EAE ;нет буквы M. портится регистр bc -> зависание + ld a,"O" + cpi + jr nz,x0EAE ;нет буквы O. портится регистр bc -> зависание + call x10C2 ;установка текущим окна: menu + ld a,(xE110) + ld (ix+6),a ;атрибуты окна + call x0EB2 ;очистка окна + ld hl,xE16E + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 + call x105B ;сообщение Profesional Extention + ld a,(xE111) + ld (ix+6),a + ld bc,#0101 ;сообщение Shadow service monitor + rst 8 +;основной цикл меню монитора +x0EEC ld hl,x0EEC ;сюда вернемся после обработки выбранной опции + push hl + call x0D6B ;печать текущего меню + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + push af ;код нажатой клавиши + ld a,(xE110) ;атрибуты печати опции меню + ld (ix+6),a + call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) + pop af + call x1033 ;вызов п/п обработки нажатия клавиши + db #86 ;cs+6 вниз + dw x0F95 ;перемещение курсора на следующую опцию (вниз) + db #84 ;cs+7 вверх + dw x0FA6 ;перемещение курсора на предыдущую опцию (вверх) + db #0D ;enter / cs+1+m + dw x0F87 ;выбор выделенной опции + db #11 ;cs+1+q + dw x0F78 ;переход в главное меню + db #04 ;cs+1+d + dw x1150 ;вызов окна выбора диска + db #80 ;kempston joy + dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку + db #91 ;mouse + dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку + db #92 ;mouse + dw x0F78 ;переход в главное меню + db #FF + cp #7B + jr nc,x0F28 ;a=[#7B..#FF] + cp #40 + jr c,x0F28 ;a=[#00..#3F] + and %01011111 ;букву в верхний регистр +x0F28 ld b,a ;код нажатой клавиши + ld c,#FF +x0F2B inc c + call x0D2F ;определение адреса дескриптора текущего меню + inc a + cp c + ret z ;закончились опции в меню. ничего не делаем + inc hl + inc hl + call x0D42 ;приведение номера горячей клавиши опции к печатному символу + cp b + jr nz,x0F2B ;клавиша не соответствует гарячей клавиши опции +;переход на п/п обработки выбранной опции + push hl + push de + call x0D60 + ld (hl),c ;сохраним номер текущей опции в меню + call x0D6B ;печать текущего меню + pop de + pop hl + call x0F51 ;проверка доступности опции + ret c ;опция недоступна + push hl + call x0F6D ;опредение адреса описания опции + ld c,l + ld b,h ;адрес описания опции (xNNNN) + pop hl + inc hl +;bc - адрес описания опции (xNNNN) +;вызов п/п обработки опции + +;АДРЕС: #0F51 вызов п/п обработки доступности опции/обработки опции +;вх: hl - адрес в дескрипторе опции (+2/4 от начала) +; 3-2,e биты старшего байта +;вых: hl - адрес в дескрипторе опции (+3 от начала) +; d - старший байт смещения +; e=e>>2 +; +x0F51 call x0F65 ;выделение старшего байта смещения + push de + ld e,(hl) ;младший байт + inc hl + push hl + ld hl,x08DD + add hl,de + ld de,x0F62 + push de + xor a + jp (hl) +x0F62 pop hl + pop de + ret + +;АДРЕС: #0F65 выделение старшего байта смещения +;вх: 3-2,e биты старшего байта +;вых: d - старший байт смещения +; e=e>>2 +; +x0F65 ld a,e + rrca + rrca + ld e,a + and #03 + ld d,a + ret + +;АДРЕС: #0F6D опредение адреса описания опции +;вх: hl - адрес в дескрипторе опции (+3 от начала) +; 3-2,e биты старшего байта +;вых: hl - адрес описания опции +; d - старший байт смещения +; e=e>>2 +; +x0F6D call x0F65 + push de + ld e,(hl) + ld hl,x0468 + add hl,de + pop de + ret +;переход в главное меню +x0F78 ld hl,x0EB5 + ex (sp),hl + xor a + ld (xDDFF),a + ld hl,xDE08 + ld (xE033),hl + ret +;enter / cs+1+m +x0F87 call x0D60 ;определение адреса с номером текущей опции текущего меню + ld c,(hl) ;номер текущей опции текущего меню + call x0D2F ;определение адреса дескриптора текущего меню + inc hl + inc hl + call x0D42 ;приведение номера горячей клавиши опции к печатному символу +x0F93 jr x0F28 ;a - горячая клавиша выбранной опции + +;АДРЕС: #0F95 перемещение курсора на следующую опцию (вниз) +x0F95 call x0D60 ;определение адреса с номером текущей опции текущего меню + push hl + ld c,(hl) + inc c ;c - номер опции + call x0D2F ;определение адреса дескриптора текущего меню + cp c ;a - номер последней опции + jr nc,x0FA3 + ld c,#00 +x0FA3 pop hl + ld (hl),c + ret + +;АДРЕС: #0FA6 перемещение курсора на предыдущую опцию (вверх) +x0FA6 call x0D60 ;определение адреса с номером текущей опции текущего меню + ld a,(hl) + or a + jr z,x0FAF + dec (hl) + ret +x0FAF push hl + call x0D2F ;определение адреса дескриптора текущего меню + pop hl + ld (hl),a + ret + +;АДРЕС: #0FB6 определение опции под курсором мыши и переход на ее обработку +; +x0FB6 ld c,#FF + ld d,#03 ;начальная crd Y +x0FBA inc d + inc c ;номер опции + call x0D2F ;определение адреса дескриптора текущего меню + inc a ;кол-во опций в меню + cp c + ret z ;опция не найдена + inc hl + inc hl + push de + call x0D52 ;определение адреса дескриптора опции + ld b,a + call x0F65 ;выделение старшего байта смещения + inc hl + call x0F6D ;опредение адреса описания опции + pop de + ld a,(hl) + rlca + rlca + and #03 + add a,d + ld d,a ;координата Y опции + cp (iy-#0B) + jr nz,x0FBA ;курсор не на этой опции + ld a,b + call x0D45 ;приведение номера горячей клавиши опции к печатному символу + jr x0F93 ;a - горячая клавиша выбранной опции + +;АДРЕС: #0FE3 получение адреса переменной и адреса маски для заданной опции +;вх: bc - адрес описания опции (x0468) +;вых: hl - адрес маски для переменной +; de - адрес переменной +; +x0FE3 ld l,c + ld h,b + ld a,(bc) + inc hl + inc hl + inc hl + +;АДРЕС: #0FE9 получение адреса переменной и адреса маски для заданной опции +;вх: a - флаги описания опции +; hl - адрес в описании опции +;вых: hl - адрес маски для переменной +; de - адрес переменной +; +x0FE9 bit 4,a + jr z,x1001 +;получение подстроки с описанием опции + ld e,(hl) + inc hl + ld d,(hl) ;адрес переменной с номером строки + inc hl ;hl=адрес+5 + ld a,(de) + and #03 ;номер строки [0..3] + inc a ;поиск строки +x0FF5 dec a + ld b,(hl) + inc hl + jr z,x0FFF +x0FFA inc hl + djnz x0FFA + jr x0FF5 +x0FFF ld a,(hl) ;a - флаги + inc hl +;получение адреса переменной опции +x1001 ld e,(hl) ;получение смещения от iy(xE014) + inc hl + bit 2,a + jr z,x100B + ld d,(hl) + inc hl + jr x1012 +x100B bit 7,e + ld d,#00 + jr z,x1012 + dec d ;de - смещение от iy(xE014) +x1012 push iy + ex (sp),hl + add hl,de + ex de,hl + pop hl ;de - адрес переменной опции +;если это блок переменных, определяем нужную переменную в блоке + bit 3,a + ret z + push af + ld b,(hl) + inc hl + ld a,(hl) + inc hl ;ab - адрес переменной со смещением в блоке + push hl + ld l,b + ld h,a + ld a,(hl) + and #03 + ld l,a ;hl - смещение в блоке + ld h,#00 + add hl,de + ex de,hl + pop hl + pop af + ret + +;АДРЕС: #102E проверка диапазона числа +;вх: a - число +; c - минимальное значение +; b - максимальное значение+1 +;вых: cy=1 вне пределов заданных значений +; +x102E cp c + ret c + cp b + ccf + ret + +;АДРЕС: #1033 процедура обработки нажатий клавиш +;вх: параметры передаются через db ?:dw ?? +x1033 pop hl + jr x1038 +x1036 inc hl + inc hl +x1038 ld e,(hl) + inc e + jr z,x1045 ;e=#FF -> возврат + cp (hl) + inc hl + jr nz,x1036 + ld e,(hl) + inc hl + ld d,(hl) + dec de + ex de,hl +x1045 inc hl + jp (hl) + +;АДРЕС: #1047 печать количества цилиндров HDD +x1047 ld bc,#1002 ;Cylinders + rst #08 + ld (ix+1),#1F + ld bc,(xDFF2) ;колво цилиндров + ld de,#0A00 ;десятичная система счисления + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + ret + +;АДРЕС: #105B печать шапки меню монитора +x105B call x10C2 ;установка текущим окна: menu + ld hl,x106B + +;АДРЕС: #1061 печать закодированного сообщения из hl +x1061 ld a,(hl) + xor #6A + cp #FF + ret z + rst #10 ;печать символа из A + inc hl + jr x1061 + +;заксоренное сообщение +x106B db #6B,#40,#BF + db #71,#6A,#63 + db #3A,#18,#05,#0C,#0F,#19,#03,#05 + db #04,#0B,#06,#4A,#4A,#2F,#12,#1E + db #0F,#04,#1E,#03,#05,#04,#4A + db #71,#68,#6A + db #2B,#04,#0B,#06,#13,#19,#0F,#18 + db #68 + db #95 +/*оно же, но раскодированное + db #01,%00101010,%11010101 ;атрибуты + db #1B,#00,#09 ;координаты + db "Profesional Extention " + db #1B,#02,#00 ;координаты + db "Analyser" + db #02 ;восстановим атрибуты + db #FF ;конец +*/ + +;заксоренное сообщение +x1095 db #6B,#1B,#E4 + db #71,#61,#60 + db #39,#0B,#1C,#0F,#0E,#4A,#38,#2B + db #27,#4A,#08,#0B,#04,#01,#4A + db #95 +/*оно же, но раскодированное +x1095 db #01,%01110001,%10001110 ;атрибуты + db #1B,#0B,#0A ;координаты + db "Saved RAM bank " + db #FF ;конец +*/ + +;заксоренное сообщение +x10AB db #6B,#1B,#0E4 + db #71,#61,#60 + db #26,#05,#0B,#0E,#0F,#0E,#4A,#38 + db #2B,#27,#4A,#08,#0B,#04,#01,#4A + db #95 +/*оно же, но раскодированное + db #01,%01110001,%10001110 ;атрибуты + db #1B,#0B,#0A ;координаты + db "Loaded RAM bank " + db #FF ;конец +*/ + +;АДРЕС: #10C2 установка текущим окна: menu +x10C2 rst #30 + dw rom2_x3005 ;установка текущим окна: menu + db %00000010 + ret + +;АДРЕС: #10C7 Копирование каталога ROM-диска в ram 8 +;вых: a =0 нет ROM-диска +x10C7 push bc + ld hl,(x0071) + ld l,#00 + ld bc,#0100 + ld de,xE5A9 + push de + ldir + pop de + ld a,(de) + or a + pop bc + ret + +;АДРЕС: #10DB обработка пункта меню: R. ROM disk +x10DB call x0D02 ;очистка нижней строки окна меню + call x10C7 ;Копирование каталога ROM-диска в ram 8 + ld hl,#1006 ;координаты окна + ld de,#100C ;ширина окна в символах и знакоместах + call x2133 ;коррекция координат и размеров окна + ld hl,x1111 + ld (xE9E1),hl +x10F0 call x1EF1 ;печать каталога и выбор позиции в нем + jr nc,x10FF ;выбор произведен успешно + cp #03 + jr z,x110E ;break/cancel закрываем окно + cp #11 + jr nz,x10F0 ;повторим выбор + jr x110E ;отмена с закрытием окна +;выбор произведен успешно +;hl - номер позиции в каталоге +x10FF call x1130 ;определение начала записи в каталоге ROM-disk по номеру в hl + ld de,#000E + add hl,de + ld a,(hl) ;смещение от начала страницы + inc hl + ld h,(hl) ;номер страницы + ld l,a ;смещение от начала страницым + rst #30 + dw rom6_x0E3B ;загрузка из ROM-disk + db #06 +;break/cancel закрываем окно +x110E jp x0EB5 ;печать текущего меню монитора + +;АДРЕС: #1111 таблица со списком процедур +x1111 dw x1128 ;печать одного имени из каталога ROM-disk + dw x113D ;определение номера последней записи в каталоге ROM-disk + dw x1117 ;звголовок: печать сообщения: _Select a file_ +;печать сообщения: _Select a file_ +x1117 rst #20 + dc " Select a file " + ret +;печать одного имени из каталога ROM-disk +;вх: hl - номер записи в каталоге +x1128 call x1130 + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 + ret +;определение начала записи в каталоге ROM-disk по номеру в hl +x1130 ld de,xE5A9 ;каталог ROM-disk + ld b,#04 +x1135 sla l ;hl=hl*16 + rl h + djnz x1135 + add hl,de + ret +;определение номера последней записи в каталоге ROM-disk +;вых: hl - номер последней записи в каталоге ROM-disk +x113D ld hl,xE5A9 ;каталог ROM-disk + ld de,#0010 + ld c,d +x1144 ld a,(hl) + or a + jr nz,x114C + dec c + ld l,c + ld h,d + ret +x114C add hl,de + inc c + jr x1144 + +;АДРЕС: #1150 вывод окна выбора дисковода +x1150 call x0D02 ;очистка нижней строки окна меню + ld hl,#1006 ;координаты окна + ld de,#140F ;размеры окна + call x2133 ;коррекция координат и размеров окна + ld hl,x1182 ;адрес таблицы со списком процедур для п/п x2028 + ld (xE9E1),hl +x1162 call x1EF1 ;печать каталога и выбор позиции в нем + jr nc,x117A ;что-то выбрали + cp #03 + jr z,x110E ;отмена break/cancel + cp #11 + jr z,x110E ;cs+1+q + and #5F ;проверка букв A..D + cp #45 + jr nc,x1162 ;продолжим + sub #41 + jr c,x1162 ;продолжим + ld l,a ;номер дисковода +x117A ld a,l + ld (xFFCA),a ;выбранный дисковод + jp x0B25 ;вывод каталога текущего диска + +;АДРЕС: #1181 ret +x1181 ret + +;таблица со списком процедур для печати окна выбора дисковода +x1182 dw x119D ;печать одного имени дисковода + dw x1188 ;определение номера последней записи =3 + dw x118C ;заголовок: печать сообщения: _Select a disk_ + +;определение номера последней записи =3 +x1188 ld hl,#0003 + ret + +;заголовок: печать сообщения: _Select a disk_ +x118C rst #20 + dc " Select a Disk " + ret + +;печать буквы дисковода или пути, если это образ +x119D ld a,l + and #03 + call x249C ;печать буквы дисковода или пути, если это образ + ret + +;АДРЕС: #11A4 поиск сообщения по номеру в B[#01..#??] +;вх: hl - адрес блока сообщений +;вых: de - адрес начала сообщения +; +x11A4 ex de,hl +x11A5 dec b + ret z +x11A7 ld a,(de) + inc de + and #80 + jr nz,x11A5 + jr x11A7 + +;АДРЕС: #11AF установка блока слов/сообщений по номеру в A +;вх: a=[#00..#02] - номер блока сообщений/слов +;вых: (xDDDA) - адрес блока слов +; hl - адрес в таблице блоков слов/сообщений +; +x11AF ld hl,x11C1 ;список блоков сообщений + rlca + rlca + add a,l + ld l,a + jr nc,x11B9 + inc h +x11B9 ld e,(hl) + inc hl + ld d,(hl) + ld (xDDDA),de + ret +x11C1 dw x1554,x1906 + dw x1353,x181A + dw x122D,x176D + +;АДРЕС: #11CD печать сообщения по номеру в BC +;вх: c=[0..2] номер блока сообщений +; b - номер сообщения в этом блоке +; +x11CD ld a,c + call x11AF ;установка блока слов/сообщений по номеру в A + inc hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld (xDDD8),hl ;адрес блока сообщений + ld c,#80 ;первая буква заглавная + call x11A4 ;поиск сообщения по номеру в B[#01..#??] + ex de,hl ;hl - адрес начала сообщения +x11DF ld a,(hl) ;печать сообщения + cp #7F + jr nz,x11ED + inc hl ;смена блока слов + ld a,(hl) + push hl + call x11AF ;установка блока слов/сообщений по номеру в A + pop hl + jr x1216 +x11ED and #7F + jr z,x121C ;печать указателя стэка + ld b,a + push hl + ld hl,(xDDDA) + call x11A4 ;поиск слова по номеру в B[#01..#??] + pop hl +x11FA ld a,(de) ;печать слова + sla c + jr nc,x120C + push af ;первый символ слова заглавный + and #7F + cp #40 + jr c,x120B + pop af + and %11011111 + jr x120C +x120B pop af +x120C rst #30 ;печать символа + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db %00000010 + rla + inc de + jr nc,x11FA + rst #20 ;печать пробела в конце слова + dc " " +x1216 bit 7,(hl) + inc hl + jr z,x11DF ;следующее слово + ret + +;печать числа из (xDDA7) +x121C push hl + sla c + push bc + ld hl,(xDDA7) + rst #30 + dw rom2_x1612 ;печать числа в hl (dec/hex) с префиксом + db %00000010 + rst #20 ;печать пробела + dc " " + pop bc + pop hl + jr x1216 + +;АДРЕС: #122D блок слов 2 (#35 слов) +x122D dc "time" ;#01 + dc "date" + dc "&" + dc "Set Up" + dc "indicator" + dc "ON" + dc "OFF" + dc "hours" + dc "minutes" ;#09 + dc "seconds" + dc "years" + dc "months" + dc "days" + dc "autoconfig" + dc "from" + dc "degree" + dc "compression" ;#11 + dc "Cylinders" + dc "head" + dc "partition" + dc "manager" + dc "global" + dc "-" + dc "delete" + dc "part" ;#19 + dc "all" + dc "local" + dc "table" + dc "information" + dc "select" + dc "..." + dc "create" + dc "write" ;#21 + dc "restore" + dc "auto" + dc "detection" + dc "mount" + dc "dismount" + dc "on" + dc "input" + dc "output" ;#29 + dc "interrupt" + dc "controller" + dc "NVRAM" + dc "modem" + dc "port" + dc "serial" + dc " " + dc "rename" ;#31 + dc "SMUC" + dc "mode" + dc "LBA" + dc "mirror" ;#35 + +;АДРЕС: #1353 блок слов 1 (#6A слов) +x1353 dc "main" ;#01 + dc "menu" + dc "previous" + dc "continue" + dc "magic" + dc "button" + dc "monitor" + dc "print" + dc "screen" ;#09 + dc "test" + dc "printer" + dc "disk" + dc "Set Up" + dc "about" + dc "positive" + dc "negative" + dc "Shadow" ;#11 + dc "service" + db #1B,#01,#88 + db #1B,#03,#8D + dc "keyboard" + dc "constant" + dc "debouncing" + dc "delay" + dc "repeat" ;#19 + dc "before" + dc "interface" + dc "speed" + dc "data" + dc "bits" + dc "stop" + dc "to" + dc "limiter" ;#21 + dc "+LF" + dc "length" + dc "page" + dc "width" + dc "centronics" + dc "RS232" + dc "9600" + dc "1200" ;#29 + dc "8" + dc "7" + dc "1" + dc "2" + dc "OFF" + dc "ON" + dc "reset" + dc "line" ;#31 + dc "feed" + dc "carriage" + dc "return" + dc "computer" + dc "form" + dc "sound" + dc "format" + dc "drive" ;#39 + dc "track" + dc "side" + dc "sector" + dc "A" + dc "B" + dc "C" + dc "D" + dc "40" ;#41 + dc "80" + dc "FM" + dc "MFM" + dc "128" + dc "256" + dc "512" + dc "1024" + dc "one" ;#49 + dc "double" + dc "half" + dc "LOW" + dc "HIGH" + dc "retry" + dc "utility" + dc "analys" + dc "catalogue" ;#51 + dc "interleaving" + dc "*" + dc "normal" + dc "fast" + db #0C,#1B,#00,#87 + db #1B,#0C,#8D + dc "save" + dc "load" ;#59 + dc "..." + dc "&" + dc "NMI" + dc "graphics" + dc "manipulators" + dc "mouse" + dc "kempston" + dc "joystick" ;#61 + dc "wait" + dc "second" + dc "first" + dc "of" + dc "step" + dc "size" + dc "quick" + dc "autostart" ;#69 + dc "I/O" ;#6A + +;АДРЕС: #1554 блок слов 0 (#5E слов) +x1554 dc "at" ;#01 + dc "abandoned" + dc "already" + dc "bad" + dc "big" + dc "blocks" + dc "breakpoint" + dc "by" + dc "command" ;#09 + dc "enter" + dc "empty" + dc "definition" + dc "devision" + dc "failed" + dc "file" + dc "finish" + dc "found" ;#11 + dc "few" + dc "identical" + dc "insufficient" + dc "known" + dc "long" + dc "many" + dc "no" + dc "not" ;#19 + dc "number" + dc "name" + dc "of" + dc "operands" + dc "opcode" + dc "open" + dc "out" + dc "present" ;#21 + dc "program" + dc "range" + dc "redefined" + dc "stack" + dc "space" + dc "syntax" + dc "string" + dc "small" ;#29 + dc "start" + dc "search" + dc "too" + dc "undefined" + dc "workspace" + dc "word" + dc "zero" + dc ">" ;#31 + dc "error" + dc "quit" + dc "operand" + dc ")" + dc "brackets" + dc "invalid" + dc "type" + dc "illegal" ;#39 + dc "value" + dc "bank" + dc "RAM" + dc "ROM" + dc "forbidden" + dc " Working ..." + dc "address" + dc "state" ;#41 + dc "selections:" + dc "init" + dc "count" + dc "***" + dc "curent" + dc "analyser" + dc "definitions:" + dc "left" ;#49 + dc "for" + dc "bytes" + dc "Professional" + dc "TRDOS" + dc "exist" + dc "R/W" + dc "disk" + dc "other" ;#51 + dc "execution" + dc "configuration" + dc "memory" + dc "control" + dc "hard" + dc "checksum" + dc "CMOS" + dc "boot" ;#59 + dc "record" + dc "busy" + dc "ready" + dc "duplicate" + dc "CRC" ;#5E + +;АДРЕС: #176D Блок сообщений 2 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов +x176D db #01,#03,#82 ;#01 time & date + db #04,#01,#03,#82 ;#02 Set Up time & date + db #85 ;#03 indicator + db #87 ;#04 OFF + db #86 ;#05 ON + db #88 ;#06 hours + db #89 ;#07 minutes + db #8A ;#08 seconds + db #8B ;#09 years + db #8C ;#0A months + db #8D ;#0B days + db #8E ;#0C autoconfig + db #91 ;#0D compression + db #90 ;#0E degree + db #7F,#00,#56 ;#0F hard disk utility + db #7F,#01,#0C,#CF + db #92 ;#10 Cylinders + db #93 ;#11 head + db #14,#95 ;#12 partition manager + db #16,#14,#9C ;#13 global partition table + db #18,#1A,#99 ;#14 delete all part + db #1B,#14,#9C ;#15 local partition table + db #14,#9D ;#16 partition information + db #18,#94 ;#17 delete partition + db #18,#14,#9F ;#18 delete partition ... + db #20,#14,#9F ;#19 create partition ... + db #21,#7F,#01,#20,#8C ;#1A write to disk + db #22,#0F,#7F,#01,#8C ;#1B restore from disk + db #23,#24,#7F,#00,#56 ;#1C auto detection hard disk + db #D0 + db #25,#27,#7F,#01,#39 ;#1D mount on drive C + db #BF + db #1E,#1B,#94 ;#1E select local partition + db #1E,#7F,#01,#8C ;#1F select disk + db #25,#27,#7F,#01,#39 ;#20 mount on drive D + db #C0 + db #25,#27,#7F,#01,#39 ;#21 mount on drive B + db #BE + db #A8 ;#22 input + db #A9 ;#23 output + db #2A,#2B,#7F,#00,#19 ;#24 interrupt controller not found + db #91 + db #2A,#2B,#7F,#00,#91 ;#25 interrupt controller found + db #2C,#7F,#00,#19,#91 ;#26 NVRAM not found + db #2C,#7F,#00,#91 ;#27 NVRAM found + db #2D,#7F,#00,#19,#91 ;#28 modem not found + db #2D,#7F,#00,#91 ;#29 modem found + db #2F,#2E,#7F,#00,#19 ;#2A serial port not found + db #91 + db #25,#A7 ;#2B mount on + db #30,#0F,#7F,#01,#B9 ;#2C __from drive + db #26,#7F,#01,#DA ;#2D dismount ... + db #B0 ;#2E __ + db #A6 ;#2F dismount + db #25,#7F,#01,#5A ;#30 mount ... ___ + db #7F,#02,#B0 + db #30,#27,#7F,#00,#AA ;#31 __ on start + db #31,#14,#9F ;#32 rename partition ... + db #2C,#7F,#00,#57,#B2 ;#33 NVRAM checksum error + db #2B,#32,#7F,#00,#91 ;#34 controller SMUC found + db #34,#B3 ;#35 LBA mode + db #7F,#00,#4D,#7F,#02 ;#36 TRDOS mirror + db #B5 + +;АДРЕС: #181A Блок сообщений 1 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов +x181A db #13,#11,#12,#87 ;#01 crd Y=1, crd X=8 Shadow service monitor + db #01,#82 ;#02 main menu + db #08,#89 ;#03 print screen + db #8D ;#04 Set Up + db #0D,#95 ;#05 Set Up keyboard + db #8A ;#06 test + db #03,#82 ;#07 previous menu + db #04,#7F,#00,#A2 ;#08 continue program + db #05,#86 ;#09 magic button + db #87 ;#0A monitor + db #8B ;#0B printer + db #0C,#DA ;#0C disk ... + db #0E,#87 ;#0D about monitor + db #8F ;#0E positive + db #90 ;#0F negative + db #89 ;#10 screen + db #7F,#00,#BC ;#11 RAM + db #16,#97 ;#12 constant debouncing + db #18,#99 ;#13 delay repeat + db #95 ;#14 keyboard + db #18,#1A,#99 ;#15 delay before repeat + db #0D,#8B ;#16 Set Up printer + db #9B ;#17 interface + db #A6 ;#18 centronics + db #A7 ;#19 RS232 + db #9C ;#1A speed + db #A8 ;#1B 9600 + db #A9 ;#1C 1200 + db #1D,#9E ;#1D data bits + db #AA ;#1E 8 + db #AB ;#1F 7 + db #1F,#9E ;#20 stop + db #AD ;#21 2 + db #AC ;#22 1 + db #9D ;#23 data + db #7F,#00,#28,#7F,#01 ;#24 string limiter +LF + db #21,#A2 + db #AF ;#25 ON + db #AE ;#26 OFF + db #7F,#00,#28,#7F,#01 ;#27 string width + db #A5 + db #24,#A3 ;#28 page lenth + db #B0 ;#29 reset + db #31,#B2 ;#2A line feed + db #33,#B4 ;#2B carriage return + db #B5 ;#2C computer + db #58,#5B,#D9 ;#2D save & load + db #36,#B2 ;#2E form feed + db #0D,#87 ;#2F Set Up monitor + db #30,#7F,#00,#BC ;#30 reset RAM + db #B7 ;#31 sound + db #0D,#0C,#CF ;#32 Set Up disk utility + db #0C,#B9 ;#33 disk drive + db #BD ;#34 A + db #BE ;#35 B + db #BF ;#36 C + db #C0 ;#37 D + db #BA ;#38 track + db #C1 ;#39 40 + db #C2 ;#3A 80 + db #BB ;#3B side + db #C9 ;#3C one + db #CA ;#3D double + db #C4 ;#3E MFM + db #C3 ;#3F FM + db #BC ;#40 sector + db #C5 ;#41 128 + db #C6 ;#42 256 + db #C7 ;#43 512 + db #C8 ;#44 1024 + db #38,#8C ;#45 format disk + db #1F,#38,#80 ;#47 stop format _число_ + db #CD ;#47 HIGH + db #4B,#CD ;#48 half HIGH + db #4B,#CC ;#49 half LOW + db #CC ;#4A LOW + db #B8 ;#4B format + db #4E,#96 ;#4C retry constant + db #0C,#CF ;#4D disk utility + db #0A,#8C ;#4E test disk + db #50,#8C ;#4F analys disk + db #7F,#00,#04,#7F,#01 ;#50 bad disk _число_ + db #0C,#80 ; + db #51,#8C ;#51 catalogue disk + db #D2 ;#52 interleaving + db #30,#87 ;#53 reset monitor + db #0B,#53,#AC ;#54 printer * 1 + db #0B,#53,#AD ;#55 printer * 2 + db #D4 ;#56 normal + db #D5 ;#57 fast + db #35,#9C ;#58 computer speed + db #56,#53,#55,#0A ;#59 очистить окно, crd Y=0, crd X=7 + db #7F,#00,#1C,#7F,#01 ; * fast test of computer * + db #35,#53,#D7 ; crd Y=12, crd X=13 + db #58,#DA ;#5A save ... + db #59,#DA ;#5B load ... + db #58,#5B,#59,#7F,#00 ;#5C save & load of program + db #1C,#A2 ; + db #5C,#97 ;#5D NMY debouncing + db #5D,#DE ;#5E graphics manipulators + db #0D,#5D,#DE ;#5F Set Up graphics manipulators + db #DE ;#60 manipulators + db #DF ;#61 mouse + db #60,#E1 ;#62 kempston joystick + db #64,#97 ;#63 first debouncing + db #1A,#99 ;#64 before repeat + db #63,#E2 ;#65 second wait + db #63,#97 ;#66 second debouncing + db #67,#65,#E6 ;#67 size of step + db #68,#38,#8C ;#68 quick format disk + db #E9 ;#69 autostart + db #58,#7F,#00,#D8 ;#6A save CMOS + db #59,#7F,#00,#D8 ;#6B load CMOS + db #58,#0D,#20,#8C ;#6C save Set Up to disk + db #0D,#7F,#00,#56,#D0 ;#6D Set Up hard disk + db #7F,#00,#38,#7F,#01 ;#6E type I/O + db #EA ; + db #91 ;#6F Shadow + db #7F,#02,#30,#0F ;#70 __ from drive + db #7F,#01,#B9 + +;АДРЕС: #1906 Блок сообщений 0 +; #00 печать числа из ячейки (xDDA7) +; #7F,[0..2] - смена блока слов + +x1906 db #0A,#89 ;#01 enter command + db #06,#93 ;#02 block identical + db #07,#80 ;#03 breackpoint _число_ + db #11,#01,#80 ;#04 found at _число_ + db #7F,#01,#1F,#7F,#00 ;#05 stop number _число_ + db #1A,#80 + db #BF ;#06 _Working ... + db #0A,#9A ;#07 enter number + db #2F,#A4 ;#08 word redefined + db #0A,#9B ;#09 enter name + db #2C,#12,#9D ;#0A too few operands + db #2C,#17,#9D ;#0B too many operands + db #20,#1C,#A3 ;#0C out of range + db #15,#9A ;#0D known number + db #04,#A8 ;#0E bad string + db #27,#B2 ;#0F syntax error + db #19,#9A ;#10 not number + db #1A,#2C,#85 ;#11 number too big + db #34,#19,#91 ;#12 operand not found + db #33,#34,#19,#91 ;#13 quit operand not found + db #2C,#17,#B5 ;#14 too many > + db #37,#38,#B6 ;#15 invalid type brackets + db #09,#19,#91 ;#16 command not found + db #39,#3A,#B4 ;#17 illegal value operand + db #37,#3B,#BC ;#18 invalid bank RAM + db #37,#3B,#BD ;#19 invalid bank ROM + db #09,#82 ;#1A command abandoned + db #3E,#3B,#BD ;#1B forbidden bank ROM + db #3E,#3B,#BC ;#1C forbidden bank RAM + db #2A,#31,#90 ;#1D start > _число_ + db #7F,#01,#08 ;#1E print abandoned + db #7F,#00,#82 + db #28,#2C,#96 ;#1F string too long + db #28,#19,#91 ;#20 string not found + db #18,#2B,#A8 ;#21 no search string + db #37,#1A,#87 ;#22 invalid number breackpoint + db #37,#41,#87 ;#23 invalid state breackpoint + db #37,#38,#87 ;#24 invalid type breackpoint + db #04,#40,#87 ;#25 bad address breackpoint + db #07,#AD ;#26 breackpoint undefined + db #46,#07,#C2 ;#27 curent breackpoint selections: + db #18,#40,#3B,#38,#41 ;#28 no address bank type state init count word + db #43,#44,#AF + db #45,#AD ;#29 *** undefined + db #04,#9E ;#2A bad opcode + db #10,#A2 ;#2B finish program + db #04,#B4 ;#2C bad operand + db #14,#22,#A6 ;#2D insufficient program space + db #22,#AD ;#2E program undefined + db #39,#2F,#9B ;#2F illegal word name + db #18,#8C ;#30 no definition + db #2F,#19,#95 ;#31 word not known + db #3E,#38,#AF ;#32 forbidden type word + db #47,#C8 ;#33 analyser definitions: + db #26,#49,#4A,#25,#80 ;#34 space left for stack _число_ + db #CB ;#35 bytes + db #25,#19,#8B ;#36 stack not empty + db #41,#1C,#A5 ;#37 state of stack + db #47,#B2 ;#38 analyser error + db #20,#1C,#25,#A6 ;#39 out of stack space + db #25,#8B ;#3A stack empty + db #2E,#94 ;#3B workspace insufficient + db #AE ;#3C workspace + db #4C,#22,#19,#91 ;#3D Professional program not found + db #15,#D0 ;#3E known disk + db #50,#19,#CD ;#3F disk not TRDOS + db #0D,#08,#B0 ;#40 devision by zero + db #0E,#01,#80 ;#41 failed at _число_ + db #2C,#12,#86 ;#42 too few blocks + db #0A,#C0 ;#43 enter address + db #0E,#D0 ;#44 failed disk + db #37,#0F,#9B ;#45 invalid file name + db #04,#44,#1C,#8F ;#46 bad count of file + db #0F,#03,#CE ;#47 file not exist + db #0F,#19,#91 ;#48 file not found + db #50,#18,#A6 ;#49 disk no space + db #39,#0F,#B8 ;#4A illegal file type + db #D0 ;#4B disk + db #C7 ;#4C analyser + db #87 ;#4D breackpoint + db #D2 ;#4E execution + db #D3 ;#4F configuration + db #4F,#32,#80 ;#50 R/W error _число_ + db #54,#D5 ;#51 memory control + db #D0 ;#52 disk + db #D1 ;#53 other + db #2D,#8F ;#54 undefined file + db #39,#7F,#01,#38 ;#55 illegal fromat file + db #7F,#00,#8F + db #56,#50,#19,#91 ;#56 hard disk not found + db #56,#50,#4F,#32,#80 ;#57 hard disk R/W error _число_ + db #56,#50,#AD ;#58 hard disk undefined + db #56,#50,#91 ;#59 hard disk found + db #58,#57,#B2 ;#5A CMOS checksum error + db #58,#19,#91 ;#5B CMOS not found + db #00,#4B,#58,#91 ;#5C _число_ bytes CMOS found + db #59,#DA ;#5D boot record + db #3D,#D0 ;#5E ROM disk + db #C2 ;#5F selections: + db #5B,#19,#91 ;#60 busy not found + db #56,#50,#19,#DC ;#61 hard disk not ready + db #56,#50,#7F,#01,#1D ;#62 hard disk data not ready + db #7F,#00,#19,#DC + db #37,#7F,#02,#14,#95 ;#63 invalid partition manager + db #7F,#02,#9E ;#64 select + db #5D,#9B ;#65 duplicate name + db #7F,#02,#14,#7F,#00 ;#66 partition not found + db #19,#91 + db #7F,#02,#14,#7F,#00 ;#67 partition undefined + db #AD + db #7F,#01,#1D,#7F,#00 ;#68 data CRC error + db #5E,#B2 + db #7F,#02,#2C,#7F,#00 ;#69 NVRAM R/W error + db #4F,#B2 + db #C5 ;#6A *** + +;АДРЕС: #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора +x1A40 ld bc,#0000 +x1A43 ld a,c + out (#FE),a + dec bc + ld a,c + or b + jr nz,x1A43 + pop bc + +;АДРЕС: #1A4C печать даты и времени в окне монитора +; +x1A4C bit 3,(iy+#27) + ret z ;индикация времени отлючена + ld hl,(xE3B7) ;адрес дескриптора текущего окна + ld de,xE0C9 + or a + sbc hl,de + ret nz ;отображено окно в котором нельзя выводить время + ld hl,xDB69 ;буфер для чтения даты и времени в формате ASCII + push hl + ld d,%11111010 + call x1AAF ;читаем время в строку в формате ASCII + ld hl,(xE3BC) ;первый свободный адрес в буфере печати + ld (hl)," " + inc hl + ld d,%10100000 + call x1B21 ;читаем дату в строку в формате ASCII + ld hl,(xE3BC) ;первый свободный адрес в буфере печати + pop bc + or a + sbc hl,bc + ld b,l ;длина строки + ld hl,(xE0C9) + push hl ;запомним координаты курсора в окне + ld a,(xE0C9+#06) ;xE0CF + push af ;запомним атрибуты окна + ld hl,#0017 + ld (xE0C9),hl ;координаты печати времени + ld a,(xE111) ;атрибуты печати + dec e ;если воскресенье, выводим красным цветом + inc e + jr nz,x1A8E + ld a,%00101010 +x1A8E ld (xE0C9+#06),a ;атрибуты печати + rst #20 + db #84 ;вывод с выравниванием + ld hl,xDB69 ;адрес строки + rst #30 + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 + rst #20 + db " " + db #86 ;выровняем по правому краю + pop af + ld (xE0C9+#06),a ;восстановим атрибуты + pop hl + ld (xE0C9),hl ;восстановим координаты курсора + ret + +;АДРЕС: #1AA6 читаем время в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 можно выводить секунды +; 6,d,=1 можно выводить минуты +; 7,d,=1 можно выводить часы +x1AA6 call x1AEC ;установка переменных для печати даты и времени + ret c ;CMOS отсутствует + call x1C67 ;чтение из CMOS времени и даты + jr x1AB2 + +;АДРЕС: #1AAF читаем время в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 можно выводить секунды +; 6,d,=1 можно выводить минуты +; 7,d,=1 можно выводить часы +; hl - адрес буфера +; +x1AAF call x1AF5 +x1AB2 ld hl,xDFF6+2 + bit 7,d + jr z,x1ABF ;часы не выводим + call x1ADE ;час в строку + call x1AD7 ;вывод разделителя в строку +x1ABF dec hl + bit 6,d + jr z,x1AC7 ;минуты не выводим + call x1ADE ;минуты в строку +x1AC7 dec hl + bit 5,d + jr z,x1AD2 ;секунды не выводим + call x1AD7 ;вывод разделителя в строку + call x1ADE ;секунды в строку +x1AD2 res 6,(iy+9) + ret +;вывод разделителя в строку +x1AD7 ld a,d + and #1F + or #20 + rst #10 + ret +;преобразование часа/минуты/секунды в строку +x1ADE push de + ld c,(hl) + ld b,#00 ;час + ld (iy+7),#02 + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + ret +;установка переменных для печати даты и времени +;вых: cy=1 CMOS отсутствует +x1AEC bit 6,(iy+#1A) + scf + ret z ;CMOS отсутствует + ccf + jr x1AFC +x1AF5 ld (xE3BC),hl + set 6,(iy+9) ;печать в буфер +x1AFC ld (iy+#08),#30 ;код ведущего ноля + ld (iy+#10),#0A ;делитель для выделения разрядов числа + ret + +;АДРЕС: #1B05 чтение даты из буфера и расчет номера дня недели +;вых: c день +; b месяц +; a,e год +; l номер дня недели (0 - Вс, 1 - Пн и т.д.) +; +x1B05 ld bc,(xDFF9) + ld a,(xDFFB) + push de + push af + push bc + ld e,a + call x1BAC + pop bc + pop af + pop de + ld e,a + ret + +;АДРЕС: #1B18 читаем дату в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 выводить месяц словом и перед годом добавлять "19" +; 6,d,=1 ставить символ 0 перед числом +; 7,d,=1 выводить день недели +x1B18 call x1AEC ;установка переменных для печати даты и времени + ret c ;CMOS отсутствует + call x1C67 ;чтение из CMOS времени и даты + jr x1B24 + +;АДРЕС: #1B21 читаем дату в строку в формате ASCII +;вх: 0-4,d байт разделитель +#20 +; 5,d,=1 выводить месяц словом и перед годом добавлять "19" +; 6,d,=1 ставить символ 0 перед числом +; 7,d,=1 выводить день недели +; hl - адрес буфера +; +x1B21 call x1AF5 +x1B24 call x1B05 ;чтение даты из буфера и расчет номера дня недели + push af + push bc + bit 7,d + jr z,x1B39 ;день недели не выводим + ld a,l ;день недели в строку + ld e,l + ld hl,rom2_x3F0A ;Названия дней недели + rst #30 + dw rom2_x15D0 + db %00000010 + call x1AD7 ;вывод разделителя в строку +x1B39 pop hl + ld c,l ;день + push hl + ld b,#00 + ld a,#01 + bit 6,d + jr z,x1B45 ;ведущий 0 не ставить + inc a +x1B45 ld (iy+7),a ;минимум разрядов в числе + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + call x1AD7 ;вывод разделителя в строку + pop af ;месяц + bit 5,d + jr z,x1B60 ;выводим цифрой + dec a ;выводим словом + ld hl,rom2_x3EE6 ;названия месяцев + rst #30 + dw rom2_x15D0 + db %00000010 + jr x1B6D +x1B60 ld c,a + ld b,0 + ld (iy+7),#02 + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de +x1B6D call x1AD7 ;вывод разделителя в строку + pop af + ld c,a + bit 5,d + jr z,x1B82 ;год выводим двумя цифрами + cp 80 + jr nc,x1B7F + rst #20 + dc "20" + jr x1B82 +x1B7F rst #20 + dc "19" +x1B82 ld b,#00 + ld (iy+7),#02 + push de + rst #30 + dw rom2_x1673 ;преобразование числа в строку + db %00000010 + pop de + res 6,(iy+9) + ret + +;АДРЕС: #1B93 таблица для вычисления кода месяца +x1B93 db 2 ;март + db 5 ;апрель + db 7 ;май + db 10 ;июнь + db 12 ;июль + db 15 ;август + db 18 ;сентябрь + db 20 ;октябрь + db 23 ;ноябрь + db 25 ;декабрь + db 28 ;январь + db 31 ;февраль +x1B9F db 33 ; +;количество дней в месяцах + db 31 ;январь + db 28 ;февраль + db 31 ;март + db 30 ;апрель + db 31 ;май + db 30 ;июнь + db 31 ;июль + db 31 ;август + db 30 ;сентябрь + db 31 ;октябрь + db 30 ;ноябрь + db 31 ;декабрь + +;АДРЕС: #1BAC расчет номера дня недели +;вх: c день +; b месяц +; e год +;вых: l номер дня недели (0 - Вс, 1 - Пн и т.д.) +; +x1BAC exx + push hl + push de + push bc + exx + ld a,e ;a,de - год + ld d,#00 + ld hl,1900 + add hl,de + cp 80 + jr nc,x1BC0 ;год >=80 + ld de,100 + add hl,de ;hl текущий год в формате yyyy +x1BC0 ld a,b ;определение кода месяца + sub 3 + jr nc,x1BC8 + add a,12 + dec hl +x1BC8 ld de,x1B93 + add a,e + ld e,a + jr nc,x1BD0 + inc d +x1BD0 ld a,(de) ;a код месяца + add a,c ;+день + push hl ;год + add a,l + ld l,a + jr nc,x1BD8 + inc h +x1BD8 ex (sp),hl + push hl + srl h + rr l + srl h + rr l + ex (sp),hl + push hl + ld de,100 + rst #30 + dw rom2_x0E73 ;bc=hl/de + db %00000010 + pop hl ;bc=год/100 + push bc + ld de,400 + rst #30 + dw rom2_x0E73 ;bc=hl/de + db %00000010 + pop de ;bc=год/400 + pop hl + add hl,bc + or a + sbc hl,de ;hl год/4 + год/400 - год/100 + pop bc ;bc день + (31 * месяц)/12 + год + add hl,bc + ld de,#0000 + exx + ld bc,#0007 + rst #30 + dw rom7_x0F5D ;l остаток от деления + db %00000111 + exx + pop bc + pop de + pop hl + exx + ret + +;АДРЕС: #1C0D работа с микросхемой CMOS (rst 8: db #89) +;вх: d - код операции: 7,=1/0 записать/считать +; 6,=1/0 читать в буфер/только в регистры +; 5,=0 =0 читать в строку ASCII +; 0,=1/0 дата/время +; e - при чтении в ASCII формат перевода +; 0-4,e байт разделитель +#20 +; 5,e,=1 выводить месяц словом и перед годом добавлять "19" +; 6,e,=1 ставить символ 0 перед числом +; 7,e,=1 выводить день недели +; 5,e,=1 можно выводить секунды +; 6,e,=1 можно выводить минуты +; 7,e,=1 можно выводить часы +; hl - адрес буфера (если бит 6,d =1) +; c - секунды/число +; b - минуты/месяц +; e - часы/год +;вых: cy=1 - если микросхемы CMOS нет или задан неверный формат запроса +; hl - строка текста ASCIZ (если бит 6,d =1) +; c - секунды/число +; b - минуты/месяц +; e - часы/год +; l - день недели +; +x1C0D bit 6,(iy+#1A) + scf + ret z ;CMOS отсутствует + bit 7,d + jr nz,x1C4A ;запись времени или даты в CMOS + bit 6,d + jr z,x1C34 ;чтение в регистры из CMOS времени/даты + bit 5,d + jr nz,x1C2E ;чтение в буфер времени и даты + bit 0,d ;читаем в формате ASCII + ld d,e + jr nz,x1C29 ;читаем дату в строку в формате ASCII + call x1AAF ;читаем время в строку в формате ASCII + or a + ret +x1C29 call x1B21 + or a + ret +;чтение времени и даты из CMOS в буфер +x1C2E rst #30 + dw rom7_x1F93 + db %00000111 + or a + ret +;чтение из CMOS вренени и даты +x1C34 call x1C67 + bit 0,d + jr z,x1C40 ;время + call x1B05 ;дата + or a + ret +x1C40 ld hl,xDFF6 + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld e,(hl) + or a + ret +;запись времени или даты в CMOS +x1C4A call x1C67 ;чтение из CMOS вренени и даты + bit 0,d + jr nz,x1C62 ;это дата + ld hl,xDFF6 ;адрес времени +x1C54 ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),e + ld hl,xDFF6 ;запись времени и даты в CMOS + rst #30 + dw rom7_x1FB2 + db %00000111 + or a + ret +x1C62 ld hl,xDFF9 ;адрес даты + jr x1C54 +;чтение из CMOS времени и даты +x1C67 ld hl,xDFF6 + push bc + push de + rst #30 + dw rom7_x1F93 + db %00000111 + pop de + pop bc + ret + +;АДРЕС: #1C73 ввод текстовой строки в нижней строке экрана +;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 6-0,a - номер сообщения из блока 0 +; a =#00 продолжение ввода +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1C73 rst #30 + dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана + db #02 + rlc a + jr z,x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + call x1C84 ;инициализация окна ввода + call x1CB8 ;ввод строки (вых: hl адрес введенной строки) + ret c ;отмена ввода + ld a,#0C ;сообщение _Working ... + +;АДРЕС: #1C84 инициализация окна ввода +;вх: 0,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 7-1,a - номер сообщения из блока 0 +; cy=1 с очисткой буфера ввода +x1C84 push af + ld hl,xDE17 ;буфер для ввода строки + ld (xDE15),hl + call c,x1DD6 ;очистка буфера вводимой строки + rst #30 + dw rom2_x2A5E ;очистка текущего окна + db #02 + pop af + push af + srl a + ld hl,#5AC0 ;атрибуты информационной строки на экране + ld e,l + ld d,h + ld (hl),#29 ;bright 0, paper 5, ink 1 + cp #0A + jr c,x1CA3 + ld (hl),#2A ;bright 0, paper 5, ink 2 +x1CA3 inc de + ld bc,#001F + ldir + inc (ix+1) + ld b,a + rst #08 + inc (ix+0) + pop af + ret + +;АДРЕС: #1CB3 продолжение ввода строки (вых: hl адрес введенной строки) +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1CB3 call x1DEC ;удаление кода возврата каретки из строки + jr x1CC7 + +;АДРЕС: #1CB8 ввод строки (вых: hl адрес введенной строки) +;вых: hl = xDE17 адрес введенной строки +; a - код нажатой клавиши +; cy=0 выход по enter +; =1 выход по другой комбинации +; +x1CB8 call x1DEC ;удаление кода возврата каретки из строки ввода + ld hl,xDE17 + ld (xDE15),hl + call x1D70 ;позиционирование курсора в конец строки +x1CC4 call x1D98 ;печать вводимой строки на экране +x1CC7 ld hl,x1CC4 ;тут зациклим + push hl + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 +x1CD3 call x1033 ;вызов п/п обработки нажатия клавиши + db #85 ;cs+5 + dw x1D5A ;перемещение курсора в водимой строке влево + db #83 ;cs+8 + dw x1D64 ;перемещение курсора в водимой строке вправо + db #7F ;cs+0 + dw x1D40 ;удаление символа перед курсором (delete) + db #0D ;enter / cs+1+m + dw x1D0D ; + db #86 ;cs+6 вниз + dw x1E5B ;копирование в буфер ввода предпоследней введенной строки + db #84 ;cs+7 вверх + dw x1EC0 ;копирование в буфер ввода следующей введенной строки + db #1F ;ss+i + dw x1DC2 ;смена режима вставки/замены при вводе строки + db #FF + cp #20 ;a - код нажатой клавиши + jr c,x1CF4 ;a=[#00..#1F] + cp #80 + jr c,x1D10 ;a=[#20..#7F] +x1CF4 scf ;a - непечатный символ +x1CF5 push af ;cy =1/0 отмена/ввод + push de + push af + call nc,x1E2D ;сохранение введенной строки в буфере последних введенных строк + call x1D98 ;печать введенной строки на экране + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 + pop af + call nc,x1D10 ;добавление символа в вводимую строку + pop de + pop af + pop hl + ld hl,xDE17 ;адрес введенной строки + ret +x1D0D or a + jr x1CF5 + +;АДРЕС: #1D10 добавление символа в вводимую строку +;вх: a - код нажатой клавиши +x1D10 ld e,a + call x1DB7 ;получение адреса под курсором в буфере строки + ld d,(ix+#0B) + dec d + ld c,(ix+1) + ld a,d + cp c + jr z,x1D38 ;курсор в последней позиции. предупреждаем звонком + bit 1,(ix+#0D) + jr nz,x1D36 ;режим замены символов +x1D25 sub c ;раздвигаем строку + ld c,a + ld b,#00 + push hl + add hl,bc + ld a,(hl) + push de + ld e,l + ld d,h + dec hl + lddr + pop de + pop hl + jr x1D38 +x1D36 ld a," " +x1D38 ld (hl),e ;ставим символ + cp " " + call nz,x1EEE ;звонок с установкой бордюра + jr x1D64 ;перемещение курсора в введенной строке вправо + +;АДРЕС: #1D40 удаление символа перед курсором (delete) +x1D40 call x1D5A ;перемещение курсора в вводимой строке влево + ret z + call x1DB7 ;получение адреса под курсором в буфере строки + ld a,(ix+#0B) + dec a + sub (ix+1) + ld c,a + ld e,l + ld d,h + inc hl + ld b,#00 + ldir ;удаление символа под курсором + ld a," " ;в конец строки допишем пробел + ld (de),a + ret + +;АДРЕС: #1D5A перемещение курсора в водимой строке влево +;вых: z - курсор в крайнем положении +x1D5A ld a,(ix+1) + or a + ret z + dec (ix+1) + inc a + ret + +;АДРЕС: #1D64 перемещение курсора в вводимой строке вправо +x1D64 ld a,(ix+1) + inc a + cp (ix+#0B) + ret nc + inc (ix+1) + ret + +;АДРЕС: #1D70 позиционирование курсора в конец строки +x1D70 ld hl,(xDE15) ;адрес буфера вводимой строки + ld a,(ix+#0B) ;размер окна в символах + ld c,a + dec a ;крайняя правая координата + add a,l + ld l,a + jr nc,x1D7D + inc h ;hl адрес конца строки +x1D7D ld b,#00 ;bc длина сроки + ld a," " +x1D81 cpd ;ищем символ не пробел + jp po,x1D94 ;bc=0 конец поиска + jr z,x1D81 +x1D88 ld a,(ix+#0B) ;такой символ найден + dec a + cp c + jr z,x1D90 + inc c ;ставим курсор после этого символа +x1D90 ld (ix+1),c + ret +x1D94 jr z,x1D90 ;если все-таки найден пробел + jr x1D88 + +;АДРЕС: #1D98 печать вводимой строки на экране +x1D98 rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 + ld a,(ix+1) ;сохраним координату X курсора + push af + ld hl,(xDE15) ;начало вводимой строки + ld b,(ix+#0B) ;длина строки + ld (ix+1),#00 + rst #30 + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 + pop af + ld (ix+1),a ;восстановим координату X курсора + rst #30 + dw rom2_x28E8 ;печать курсора в окне + db #02 + ret + +;АДРЕС: #1DB7 получение адреса под курсором в буфере строки +;вых: hl - адрес в буфере +x1DB7 ld a,(ix+1) + ld hl,(xDE15) + add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #1DC2 смена режима вставки/замены при вводе строки +; +x1DC2 ld a,(ix+#0D) + xor %00000010 + ld (ix+#0D),a + bit 1,a + ld a,#DB + jr z,x1DD2 + ld a,#DC +x1DD2 ld (ix+#0C),a + ret + +;АДРЕС: #1DD6 очистка буфера вводимой строки +x1DD6 ld hl,(xDE15) + ld c,(ix+#0B) + ld (hl)," " + dec c + ret z + ld b,#00 + ld e,l + ld d,h + inc de + ldir + ld (ix+1),#00 + ret + +;АДРЕС: #1DEC удаление кода возврата каретки из строки +x1DEC ld a,#0A + ld (xDE14),a + ld a,(ix+1) ;сохраним координату X + push af + call x1D70 ;позиционирование курсора в конец строки + ld a,(ix+1) + inc a + cp (ix+#0B) + jr z,x1E04 ;курсор на последнем символе строки + call x1D5A ;перемещение курсора в водимой строке влево +x1E04 call x1DB7 ;получение адреса под курсором в буфере строки + ld a,(hl) ;enter заменим на пробел + cp #0D + jr nz,x1E0E + ld (hl)," " +x1E0E pop af + ld (ix+1),a ;восстановим координату курсора + ret + +;АДРЕС: #1E13 помещение символа в строку и приращение адреса в буфере строк +;вх: hl - адрес в буфере +; de - адрес конца буфера +;вых: hl - очередной адрес в буфере +x1E13 ld (ix+0),a + inc ix + +;АДРЕС: #1E18 циклическое приращение адреса в буфере введенных строк +;вх: hl - адрес в буфере +; de - адрес конца буфера +;вых: hl - очередной адрес в буфере +x1E18 inc hl + or a + sbc hl,de + add hl,de + ret nz + ld hl,xDE42 + ret + +;АДРЕС: #1E22 получем адрес конца последней введенной строки +;вх: hl - адрес конца последней введенной строки +; de - адрес начала буфера +;вых: hl - адрес последнего символа последней введенной строки +x1E22 or a + sbc hl,de + add hl,de + jr nz,x1E2B + ld hl,xDFD2 +x1E2B dec hl + ret + +;АДРЕС: #1E2D сохранение введенной строки в буфере последних введенных строк +x1E2D call x1D70 ;позиционирование курсора в конец строки + ld b,(ix+1) ;длина введенной строки + ld a,b + or a + ret z ;пустая строка + push ix + ld ix,(xDE15) ;адрес начала введенной строки + ld hl,(xE035) + ld de,xDFD2 ;конец буфера последних введенных строк +x1E42 ld a,(ix+0) ;сохранение строки в буфере последних введенных строк + inc ix + ld (hl),a + call x1E18 ;циклическое приращение адреса в буфере введенных строк + djnz x1E42 + pop ix + ld (hl),#00 ;маркер конца введенной строки + call x1E18 ;циклическое приращение адреса в буфере введенных строк + ld (xE035),hl + ld (xE037),hl + ret + +;АДРЕС: #1E5B копирование в буфер ввода предпоследней введенной строки +;вх: a - код нажатой клавиши #86 +; +x1E5B ld bc,(xDE14) ; + cp c ; + ld b,#02 ; + jr nz,x1E65 ; + dec b ; +x1E65 ld (xDE14),a ; +x1E68 ld hl,(xE037) + ld de,xDE42 + call x1E22 ;получем адрес конца последней введенной строки +x1E71 call x1E22 ;ищем начало строки + ld a,(hl) + or a + jr nz,x1E71 + ld de,xDFD2 + call x1E18 ;циклическое приращение адреса в буфере введенных строк + call x1EE1 ;проверка списка на наличие введенных строк + ld a,(hl) + or a + jp z,x1DD6 ;эта строка пустая + ld (xE037),hl ;начало последней введенной строки + push bc + call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки + pop bc + djnz x1E68 + ret + +;АДРЕС: #1E91 копирование строки из буфера введенных строк в буфер ввода строки +x1E91 call x1DD6 ;очистка буфера вводимой строки + ld b,(ix+#0B) + ld hl,(xE037) ;начало последней введенной строки + ld de,xDFD2 ;конец буфера + push ix + ld ix,(xDE15) ;адрес буфера для ввода строки +x1EA3 ld a,(hl) ;копирование строки в буфер ввода + or a + jr z,x1EB5 ;конец строки + call x1E13 ;помещение символа в строку и приращение адреса в буфере строк + djnz x1EA3 +x1EAC ld a,(hl) ;если строка была длиннее буфера ввода, ищем ее конец + or a + jr z,x1EB5 + call x1E18 ;циклическое приращение адреса в буфере введенных строк + jr x1EAC +x1EB5 call x1E18 ;hl - адрес следующей строки в буфере введенных строк + pop ix + push hl + call x1D70 ;позиционирование курсора в конец строки + pop hl + ret + +;АДРЕС: #1EC0 копирование в буфер ввода следующей введенной строки +;вх: a - код нажатой клавиши #84 +; +x1EC0 ld hl,(xE037) + ld bc,(xDE14) + cp c + ld b,#02 + jr nz,x1ECD + dec b +x1ECD ld (xDE14),a +x1ED0 call x1EE1 ;проверка списка на наличие введенных строк + ld a,(hl) + or a + ret z ;строка пустая + push bc + call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки + ld (xE037),hl + pop bc + djnz x1ED0 + ret + +;АДРЕС: #1EE1 проверка списка на наличие введенных строк +;вх: hl - начало последней введенной строки +x1EE1 ld de,(xE035) ;первый свободный адрес в буфере последних введенных строк(команд) + or a + sbc hl,de + add hl,de + ret nz + pop hl ;список пустой + jp x1DD6 ;очистка буфера вводимой строки + +;АДРЕС: #1EEE звонок с установкой бордюра +x1EEE rst #20 + db #87 + ret + +;АДРЕС: #1EF1 печать каталога и выбор позиции в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +; +x1EF1 call x2028 ;определение номера последней записи в каталоге + db #02 + ld (xDD89),hl ;номер последней записи + call x203C ;расчет размеров и печать окна под каталог + ld hl,#0000 ;номер записи каталога, с которой начинаем печать + ld (xE9E3),hl + call x1F7F ;печать каталога в окне +x1F04 ld hl,x1F04 ;сюда вернемся + push hl + call x1FF4 ;печать выделенной позиции в каталоге + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + push af ;a - код нажатой клавиши + call x1FBA ;снимаем выделение строки каталога + pop af + call x0385 ;обработка реакции на нажатия клавиш + call nc,x1FDC ;покажем выбранную позицию + call x1033 + db #84 ;cs+7 вверх + dw x1F4C ;нажата клавиша вверх, двигаем выделение вверх + db #86 ;cs+6 вниз + dw x1F94 ;нажата клавиша вниз, двигаем выделение вниз + db #0D ;enter + dw x1F44 ;выбор позиции в каталоге + db #80 ;fire KempJoy в окне + dw x1F4B ;!!!ОШИБКА должно быть x1F44 + db #FF + cp #3A + ccf + jr c,x1F45 ;не цифра + cp #30 + jr c,x1F45 ;не цифра + sub #30 + jr nz,x1F39 + ld a,#0A ;"0" =10 +x1F39 dec a + cp (ix+4) + ret nc ;нет позиции с таким номером + ld (ix+0),a + call x1FDC ;покажем выбранную позицию +;выбор позиции в каталоге +x1F44 or a +x1F45 pop hl + push af + call x201D ;(xE9E3) +crd Y курсора + pop af +x1F4B ret +;нажата клавиша вверх, двигаем выделение вверх +x1F4C call x201D ;(xE9E3) +crd Y курсора + ld a,l + or h + jr z,x1F64 ;достигнут предел + call x2012 ;уменьшаем координату Y + ret nz ;умеyьшили успешно + rst #30 + dw rom2_x2A1B ;скроллинг окна ввниз + db #02 + ld hl,(xE9E3) + dec hl + ld (xE9E3),hl + jr x1FBA ;печать одной строки каталога ROM-disk +x1F64 ld hl,(xDD89) ;переход на нижнюю строчку + ld c,(ix+4) + dec c + ld (ix+0),c + xor a + ld b,a + sbc hl,bc + jr nc,x1F7C + ld a,l + add a,c + ld (ix+0),a + ld hl,#0000 +x1F7C ld (xE9E3),hl +;печать каталога ROM-disk в окне +x1F7F ld a,(ix+0) + push af ;сохраним crd Y курсора + xor a + ld (ix+0),a ;crd Y =0 +x1F87 call x1FBA ;;печать одной строки каталога ROM-disk + call x2006 ;приращение координаты Y курсора + jr nz,x1F87 ;печатаем следующую строку + pop af + ld (ix+0),a ;восстановим crd Y курсора + ret +;нажата клавиша вниз, двигаем выделение вниз +x1F94 ld hl,(xDD89) + push hl + call x201D ;(xE9E3) +crd Y курсора + pop de + xor a + sbc hl,de + jr c,x1FAB + ld h,a ;достигнут нижний предел. переходим на верхнюю строку + ld l,a + ld (xE9E3),hl + ld (ix+0),a + jr x1F7F ;печать каталога ROM-disk в окне +x1FAB call x2006 ;приращение координаты Y курсора + ret nz ;успешно + rst #30 + dw rom2_x298E ;скроллинг окна вверх + db #02 + ld hl,(xE9E3) + inc hl + ld (xE9E3),hl +;печать одной строки каталога ROM-disk +x1FBA ld (ix+1),#00 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + call x201D ;(xE9E3) +crd Y курсора + ex de,hl + ld hl,(xDD89) + or a + sbc hl,de ;номер последней записи в каталоге ROM-disk + jr c,x1FD3 + ex de,hl + call x2028 ;печать одного имени из каталога ROM-disk + db #00 ;вх: hl - номер записи +x1FD3 rst #30 + dw rom2_x2FED ;печать пробелов до правого края окна + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ret +;покажем выбранную позицию +x1FDC push af + call x1FF4 ;печать выделенной позиции в каталоге ROM-disk + call x1FE8 ;пауза примерно 646k тактов + call x1FBA ;снимаем выделение позиции + pop af + ret +;пауза примерно 646k тактов +x1FE8 ld a,#C0 +x1FEA push bc +x1FEB ld b,#00 + djnz $ + pop bc + dec a + jr nz,x1FEA + ret +;печать выделенной позиции в каталоге ROM-disk +x1FF4 ld a,(ix+6) + push af ;сохраним атрибуты + ld a,(ix+#0E) + ld (ix+6),a + call x1FBA ;печать одной строки каталога ROM-disk + pop af + ld (ix+6),a + ret +;приращение координаты Y курсора +;вых: z - не было приращения +x2006 ld a,(ix+4) + dec a + cp (ix+0) + ret z + inc (ix+0) + ret +;уменьшаем координату Y +x2012 ld a,(ix+0) + or a + ret z + dec (ix+0) + xor a + inc a + ret +;(xE9E3) +crd Y курсора +x201D ld hl,(xE9E3) + ld a,(ix+0) + +;АДРЕС: #2023 сложение hl=hl+a +x2023 add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #2028 вызов процедуры по таблице, адрес которой в (xE9E1) +;вх: db ? номер процедуры +; =#04 заголовок +x2028 ex (sp),hl + ld a,(hl) + inc hl + ex (sp),hl + +;АДРЕС: #202C вызов процедуры по таблице, адрес которой в (xE9E1) +;вх: a - номер процедуры +; =#04 заголовок +x202C push hl + ld hl,(xE9E1) + call x2023 ;сложение hl=hl+a + ld a,(hl) + inc hl + ld h,(hl) + ld l,a + ex (sp),hl + ld a,(xDDA7) + ret + +;АДРЕС: #203C расчет размеров и печать окна под каталог ROM-disk +x203C call x205A ;установка текущим окна: вывод каталога + ld bc,(xDD89) ;номер последней записи каталога ROM-disk + ld hl,#000F ;высота окна не более 16 + or a + sbc hl,bc + jr nc,x204D + ld c,#10 +x204D inc c + ld (ix+4),c ;высота окна + ld hl,#0531 ;атрибуты заголовка и выравнивание + +;АДРЕС: #2054 печать рамки вокруг окна +x2054 call x207A ;печать рамки вокруг окна + rst #20 + db #8C ;очистка окна + ret + +;АДРЕС: #205A установка текущим окна: вывод каталога +x205A ld hl,xE0F3 + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 + ret + +;печатные коды рамок +x2062 db #BB,#CD,#C9,#BA,#BA,#BC,#CD,#C8 + db #B9,#CD,#CC,#BA,#BA,#BC,#CD,#C8 + db #B6,#C4,#C7,#BA,#BA,#BC,#CD,#C8 + +;АДРЕС: #207A печать рамки вокруг окна +;вх: l - атрибуты заголовка +; h - выравнивание загловка (=0 нет выравнивания) +; hl=#0000 нет заголовка +; +x207A bit 7,(ix+8) + ret z ;нет рамки + push hl + ld de,xE338 ;сохраним дескриптор окна + push ix + pop hl + push hl + ld bc,#000E + ldir + pop hl + ld (hl),#00 ;координаты курсора =0 + inc hl + ld (hl),#00 + inc hl + dec (hl) ;увеличим размерыокна на 2 + inc hl + dec (hl) + inc hl + inc (hl) ;высота +2 + inc (hl) + inc hl + inc (hl) ;ширина +2 + inc (hl) + ld (ix+7),#03 ;системные атрибуты окна + ld a,(ix+9) + ld (ix+6),a ;атрибуты рамки + ld a,(ix+8) + and %00111000 + ld l,a + ld h,#00 ;номер рамки *8 + ld de,x2062 + add hl,de ;адрес рамки + ld (ix+#0A),#08 ;размер символов в пикселях + ld a,(ix+#0B) + push af ;сохраним ширину окна + ld (ix+#0B),#20 ;ширина окна 32 + call x2120 ;печать верхней линии рамки + ld b,(ix+4) + dec b + dec b ;высота + jr z,x20E0 ;средних линий нет + ld c,(ix+5) + dec c ;правая координата X + ld e,(hl) + inc hl + ld d,(hl) + inc hl ;de печатные коды рамки +x20D0 inc (ix+0) ;печать средных линий рамки + ld (ix+1),#00 + ld a,e + rst #10 + ld (ix+1),c + ld a,d + rst #10 + djnz x20D0 +x20E0 inc (ix+0) + ld (ix+1),#00 + call x2120 ;печать нижней линии рамки + pop af + inc a + inc a + inc a + ld (ix+#0B),a + ld (ix+#0A),#06 + pop hl + ld a,l + or h + jr z,x2114 ;нет загаловка + ld (ix+0),#00 + ld (ix+1),#01 + ld (ix+6),l + ld a,h + or a + push af + jr z,x210C ;нет выравнивания + rst #20 + db #84 ;вывод с выравниванием +x210C call x2028 + db #04 ;печать заголовка окна + pop af + jr z,x2114 + rst #10 ;выровняли заголовок +x2114 ld hl,xE338 ;восстановим дескриптор окна + push ix + pop de + ld bc,#000E + ldir + ret +;печать линии рамки +x2120 ld e,(hl) + inc hl + ld d,(hl) + inc hl + ld a,(hl) + inc hl + rst #10 + ld b,(ix+5) ;ширина окна + dec b + dec b +x212C ld a,d + rst #10 + djnz x212C + ld a,e + rst #10 + ret + +;АДРЕС: #2133 коррекция координат и размеров окна +;вх: hl - координаты окна +; e - ширина окна в знакоместах +; d - ширина окна в символах +x2133 ld (xE0F3+#02),hl + ld a,e + ld (xE0F3++#05),a + ld a,d + ld (xE0F3++#0B),a + ret + +;АДРЕС: #213F координаты Y и X полей для окна редактирования дампа +x213F db #00,#02,#05 + db #08,#09,#0B,#0C,#0E,#0F,#11,#12 + db #14,#15,#17,#18,#1A,#1B,#1D,#1E + db #21,#28 + db #FC + db #08,#09,#0B,#0C,#0E,#0F,#11,#12 + db #14,#15,#17,#18,#1A,#1B,#1D,#1E + db #21,#28 + db #FF + +;АДРЕС: #2168 таблица со списком процедур для окна редактирования дампа +x2168 dw x2447 ;#00 печать одной строки дампа памяти (8 байт) + dw x2365 ;#02 обновление окна дампа памяти + dw x21A7 ;#04 заглушка ret + dw x2286 ;#06 скроллинг дампа + dw x2286 ;#08 скроллинг дампа + dw x243D ;#0A чтение байта из памяти пользователя + dw x2442 ;#0C запись байта в память пользователя + dw x2409 ;#0E редактирование слово в bc + dw x244C ;#10 обновление окна с дизасмом памяти начиная с текущей ячейки + +;АДРЕС: #217A поиск чего-то (такое впечатление, что тут ошибка, по логике +; должно быть сравнение с координатой X) +;вых: при текущем раскладе на выходе всегда z +; hl=x213F+#15 +x217A ld hl,(xE9DF) +x217D ld a,(hl) + cp #FD + ret nc + cp #FC + ret z + and #7F + cp (ix+#00) + ret z +x218A inc hl + bit 7,(hl) + jr nz,x217D + jr x218A + +;АДРЕС: #2191 проверка попадания курсора по X на редактируемый байт в дампе +;вых: z - crdX на каком-то байте поля дампа +x2191 ld a,(hl) + cp #FD + ret nc +x2195 inc hl + ld a,(hl) + bit 7,a + ret nz + cp (ix+#01) + ret nc + inc hl + ld a,(hl) + cp (ix+#01) + ret z + jr c,x2195 + xor a +x21A7 ret + +;АДРЕС: #21A8 коррекция координаты X, при движении курсора влево +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21A8 push hl + call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе + pop hl + ret z ;crdX на каком-то байте поля дампа + call x2253 ;декремент координаты X + jr nz,x21A8 ;координата X уменьшена + jr x2208 ;декремента не было + +;АДРЕС: #21B5 коррекция координаты X, при движении курсора +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21B5 ld c,(ix+#01) ;crd X + call x21FD ;коррекция координаты X, при движении курсора вправо + ret z ;курсор на байте дампа + ld (ix+#01),c ;восстановим координату X + call x21A8 ;коррекция координаты X, при движении курсора влево + ret z ;курсор на байте дампа + ld (ix+#01),c ;восстановим координату X + ret + +;АДРЕС: #21C7 инкремент координаты X, и изменение адреса текущей ячейки дампа +;вых: z - курсор на байте дампа +x21C7 call x2247 ;инкремент координаты X в рамках окна + jr z,x21D3 ;инкремента небыло + call x217A + call x21FD ;коррекция координаты X, при движении курсора вправо + ret z ;курсор на байте дампа +; crd X =#00 +x21D3 ld (ix+#01),#00 + +;АДРЕС: #21D7 перемещение курсора на 8 байт вниз (нажатие cs+6/ss+S курсор вниз) +x21D7 ld e,#08 + jr x21DD +;перемещение курсора на один байт вниз +x21DB ld e,#01 +;перемещение курсора на E байт вниз +x21DD call x2006 ;приращение координаты Y курсора + ld a,#08 ;скроллинг дампа + jp z,x202C ;Y не изменилась. вызов процедуры по таблице, адрес которой в (xE9E1) + +;АДРЕС: #21E5 коррекция координаты X, при движении курсора +;вых: z - курсор на байте дампа +; nz - +x21E5 call x21ED + ret z + ld (ix+#00),#00 ;crd Y =0 +x21ED call x217A ;при текущем раскладе на выходе всегда z + jr nz,x21F6 + call x21B5 ;коррекция координаты X, при движении курсора + ret z ;курсор на байте дампа +x21F6 call x2006 ;приращение координаты Y курсора + jr nz,x21ED ;координата Y изменилась + jr x2208 ;установка nz и выход + +;АДРЕС: #21FD коррекция координаты X, при движении курсора вправо +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x21FD push hl + call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе + pop hl + ret z ;crdX на каком-то байте поля дампа + call x2247 ;инкремент координаты X в рамках окна + jr nz,x21FD ;инкремент был +;установка флага nz +x2208 xor a + inc a + ret + +;АДРЕС: #220B декремент координаты X в рамках текущего поля со скроллингом +x220B call x2253 ;декремент координаты X + jr z,x2217 ;декремента не было + call x217A + call x21A8 ;коррекция координаты X, при движении курсора влево + ret z ;курсор на байте дампа +; ставим курсор на крайнюю правую позицию +x2217 ld a,(ix+#0B) ;размер окна в символах + dec a + ld (ix+#01),a ;новая координата X (крайняя правая позиция) + +;АДРЕС: #221E перемещение курсора на 8 байт вверх (нажатие cs+7/ss+W курсор вверх) +x221E ld e,#F8 + jr x2224 +;скроллинг на строку вверх +x2222 ld e,#FF +x2224 call x2012 ;уменьшаем координату Y + ld a,#06 ;скроллинг дампа + jp z,x202C ;координата Y не была уменьшена (вызов процедуры скроллинга) + call x2237 ;коррекция координаты Y, при движении курсора + ret z ;курсор на байте дампа +; установка координаты Y в нижний край окна + ld a,(ix+#04) + dec a + ld (ix+#01),a + +;АДРЕС: #2237 коррекция координаты Y, при движении курсора +;вых: z - курсор на байте дампа +; nz - невозможно откорректировать координату +x2237 call x217A + jr nz,x2240 ;на выходе всегда z + call x21B5 ;коррекция координаты X, при движении курсора + ret z ;курсор на байте дампа +; невозможно откорректировать координату X +x2240 call x2012 ;уменьшаем координату Y + jr nz,x2237 ;координата уменьшена + jr x2208 ;установка nz + +;АДРЕС: #2247 инкремент координаты X в рамках окна +;вых: z - инкремента не было +x2247 ld a,(ix+#0B) ;ширина окна в символах + dec a + cp (ix+#01) + ret z + inc (ix+#01) + ret + +;АДРЕС: #2253 декремент координаты X в рамках окна +;вых: z - декремента не было +x2253 ld a,(ix+#01) + or a + ret z + dec (ix+#01) + jr x2208 + +;АДРЕС: #225D нажатие cs+5/ss+Q курсор влево +;вх: c - crd X курсора +x225D ld a,c + cp #21 + jr c,x226B +; в поле редактирования символов + jr nz,x220B ;не крайняя левая позиция + ld a,#28 +x2266 ld (ix+#01),a ;крайняя правая позиция + jr x2222 ;скроллинг на строку вверх +; в поле редактирования hex дампа или адреса +x226B cp #02 + ret z ;крайняя позиция в адресе + cp #08 + jr z,x2274 ;крайняя позиция в hex дампе + jr x220B ;декремент координаты X в рамках текущего поля со скроллингом +x2274 ld a,#1E ;новая координата X в hex дампе + jr x2266 + +;АДРЕС: #2278 редактирование дампа памяти в окне монитора +x2278 ld hl,x2168 + ld (xE9E1),hl ;адрес таблицы со списком процедур для п/п x2028 + ld hl,x213F + ld (xE9DF),hl + jr x2298 + +;АДРЕС: #2286 скроллинг дампа +;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) +x2286 call x23A9 ;расчет приращения для скроллинга дампа + ld hl,(xDD87) ;адрес начала дампа памяти + add hl,bc ;новый адрес + ld (xDD87),hl + ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти + add hl,de + ld (xDD69),hl + pop hl + +;обновление окна дампа +x2298 call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #02 ;обновление окна дампа памяти + call x21E5 ;коррекция координаты X, при движении курсора + +;основной цикл редактирования дампа памяти +x229F ld hl,x229F ;адрес возврата + push hl + call x23C0 ;определение поля в окне редактирования дампа + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #10 ;обновление окна с дизасмом памяти начиная с текущей ячейки + res 0,(ix+#07) ;выводить символ курсора +;ожидание нажатия клавиши + rst #30 + dw rom2_x28E8 ;печать/удаление курсора в окне + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 ;a - код нажатой клавиши + rst #30 + dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) + db #02 +;реакция на нажатую клавишу + set 0,(ix+#07) ;не выводить символ курсора + ld d,a ;d - код нажатой клавиши + call x23C0 ;определение поля в окне редактирования дампа + jr c,x22E9 ;курсор в поле редактирования адреса дампа + jr nz,x230D ;курсор в поле редактирования символов дампа +; изменение hex значения под курсором в дампе + call x2400 ;чтение байта из памяти пользователя в bc + call x2412 ;редактирование байта в bc + jr nz,x2328 ;байт не изменился. проверка нажатия управляющей клавиши + ld (xDDA7),bc ;новое значение байта + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0C ;запись байта в память пользователя + call x2393 ;печать одной(текущей) строки дампа +; проверка координаты X +x22D9 ld de,#1E08 ;граничные координаты +x22DC ld a,(ix+#01) ;crd X + cp d + jp c,x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа + ld (ix+#01),e + jp x21DB ;перемещение курсора на один байт вниз +; изменение адреса дампа памяти +x22E9 ld bc,(xDD87) ;адрес начала дампа памяти + ld (xDDA7),a ;номер байта в строке дампа + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0E ;редактирование слова в bc + jr nz,x2328 ;слово не изменилось. проверка нажатия управляющей клавиши + ld (xDD69),bc ;новый адрес текущей ячейки в дампе памяти + ld (xDD87),bc ;адрес начала дампа памяти + ld a,(ix+#01) + push af + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #02 ;обновление окна дампа памяти + pop af + ld (ix+#01),a + jp x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа +; изменение символа в символьном поле дампа +x230D call x2400 ;чтение байта из памяти пользователя в bc + ld a,d + cp #20 + jr c,x2328 ;это не символ, проверка нажатия управляющей клавиши + cp #7F + jr nc,x2328 ;это не символ, проверка нажатия управляющей клавиши + ld (xDDA7),a + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #0C ;запись байта в память пользователя + call x2393 ;печать одной(текущей) строки дампа +x2323 ld de,#2821 ;граничные координаты поля редактирования сомволов дампа + jr x22DC ;проверка координат +;проверка и обработка нажатия управляющей клавиши +;вх: d - код нажатой клавиши +x2328 ld a,d + ld c,(ix+#01) ;crd X + call x1033 ;вызов п/п обработки нажатой клавиши + db #85 ;cs+5 + dw x225D ;курсор влево + db #1C ;ss+Q + dw x225D ;курсор влево + db #83 ;cs+8 + dw x235D ;курсор вправо + db #1E ;ss+E + dw x235D ;курсор вправо + db #84 ;cs+7 + dw x221E ;курсор вверх + db #1D ;ss+W + dw x221E ;курсор вверх + db #86 ;cs+6 + dw x21D7 ;курсор вниз + db #8B ;ss+S + dw x21D7 ;курсор вниз + db #89 ;cs+9 + dw x237A ;смена поля редактирования hex <-> символы + db #01 ;cs+1+A + dw x2352 ;установка курсора на редактирование адреса дампа + db #03 ;break/cancel + dw x235B ;выход + db #FF + ret + +;АДРЕС: #2352 установка курсора на редактирование адреса дампа +x2352 ld (ix+#00),#00 ;crd Y =#00 + ld (ix+#01),#02 ;crd X =#02 + ret + +;АДРЕС: #235B выход из режима редактирования дампа +x235B pop hl + ret + +;АДРЕС: #235D нажатие cs+8/ss+E курсор вправо +x235D ld a,c ;crd X + cp #20 + jr nc,x2323 ;в поле редактирования символов + jp x22D9 ;поле редактирования адреса или hex дампа + +;АДРЕС: #2365 обновление окна дампа памяти +x2365 rst #30 + dw rom2_x2E3D ;печать дампа памяти в окне + db #02 + rst #30 + dw rom2_x2E76 ;удаление курсора на предыдущей ячейке дампа + db #02 + ld a,(ix+#01) ;координата X курсора в окне + sub #03 + ld (ix+#01),a + bit 7,(iy+#0E) + ret z ;редактируем hex дамп + +;АДРЕС: #237A смена поля редактирования hex <-> символы +x237A call x23C0 ;определение поля в окне редактирования дампа + ret c ;редактируем адрес дампа + ld hl,xE022 + jr nz,x238B +; установка координат для редактирования символьного представления дампа + set 7,(hl) + add a,#21 +x2387 ld (ix+#01),a + ret +; установка координат для редактирования hex дампа +x238B res 7,(hl) + add a,a + add a,c + add a,#08 + jr x2387 + +;АДРЕС: #2393 печать одной(текущей) строки дампа +x2393 ld c,#00 + call x23F3 ;hl - адрес текущей ячейки в дампе памяти + ld a,(ix+#01) ;crd X + push af + ld (ix+#01),#00 ;crd X =#00 + call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) + db #00 ;печать одной строки дампа памяти (8 байт) + pop af + ld (ix+#01),a ;восстановим координату X + ret + +;АДРЕС: #23A9 расчет приращения для скроллинга дампа +;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) +;вых: bc - приращение для скроллинга дампа +; d =#00/#FF - скроллим вперед/назад +; cy =1 скроллим назад +x23A9 xor a + ld b,(ix+#04) ;высота окна в знакоместах +x23AD add a,#08 + djnz x23AD + ld c,a ;bc - приращение для скроллинга дампа + ld d,#00 + ld a,e + or a + ret p ;e<#80 + dec d ;d=#FF + ld hl,#0000 + sbc hl,bc + ld c,l + ld b,h + ret + +;АДРЕС: #23C0 определение поля в окне редактирования дампа +;вых: cy =1 курсор в поле редактирования адреса дампа +; cy =0, z - курсор в поле редактирования hex дампа +; cy =0, nz - курсор в поле редактирования симвлов дампа +; c,a - номер байта в строке дампа +; hl - адрес текущей ячейки в дампе памяти +x23C0 ld a,(ix+#01) ;crd X + cp #06 + jr nc,x23CB ;это не адресное поле +; это адресное поле + sub #02 + scf + ret +x23CB cp #20 + jr nc,x23E5 +; это hex дамп + sub #08 ;(CrdX-8)/3 + push de + ld c,a + xor a + ld de,#0003 + rst #30 + dw rom2_x16AA ;деление bc=ac/de + db #02 ;l остаток от деления + pop de ;с - номер ячейки в строке дампа памяти + ld a,#01 + sub l ;a - смещение от начала строки до редактируемого разряда + call x23E8 + xor a + ld a,c + ret +;это символьное представление дампа +;вх: a - координата курсора +;вых: nz +x23E5 sub #21 + ld c,a +;установка адреса текущей редактируемой ячейки памяти +;вх: с - номер ячейки в строке дампа памяти +; a - смещение от начала строки до редактируемого разряда +x23E8 ld e,a + call x23F3 + ld (xDD69),hl ;адрес текущей редактируемой ячейки памяти + xor a + inc a + ld a,e + ret + +;АДРЕС: #23F3 расчет адреса текущей редактируемой ячейки памяти +;вх: с - номер ячейки в строке дампа памяти +;вых: hl - адрес текущей ячейки в дампе памяти +x23F3 ld a,(ix+#00) ;координата Y курсора в окне + rlca + rlca + rlca + add a,c + ld hl,(xDD87) ;адрес начала дампа памяти + jp x2023 ;сложение hl=hl+a + +;АДРЕС: #2400 чтение байта из памяти пользователя в bc +;вх: hl - адрес памяти пользователя +;вых: bc,a - прочитанный байт +x2400 ld a,#0A ;номер процедуры *2 (чтение байта из памяти пользователя) + call x202C ;вызов процедуры по таблице, адрес которой в (xE9E1) + ld c,a + ld b,#00 + ret + +;АДРЕС: #2409 редактирование числа в bc +;вх: bc - слово для редактирования +; a - смещение от начала строки до редактируемого разряда +; d - код нажатой клавиши +;вых: bc - отредактированный байт/слово +; nz - число не изменилось +x2409 sub #03 + neg + ld e,a + ld a,#04 ;кол-во разрядов в числе + jr x2414 + +;АДРЕС: #2412 редактирование байта в bc +;вх: bc - байт для редактирования +; e - смещение от конца строки до редактируемого разряда +; d - код нажатой клавиши +;вых: bc - отредактированный байт/слово +; nz - число не изменилось +x2412 ld a,#02 ;кол-во разрядов в числе +x2414 push hl + push de + ld hl,xE1A6 ;буфер для вывода строки + push de + ld de,#2310 ;шестнадцатиразрядное + call x0CDA ;печать числа bc в буфер hl + ld hl,(xE3BC) + ld (hl),#FF + dec hl ;адрес последнего символа + pop de + ld a,d + ld d,#00 + or a + sbc hl,de ;адрес разряда числа + ld (hl),a ;новое значение разряда + ld hl,xE1A6 + rst #30 + dw rom2_x0DF4 ;преобразование строки в число + db #02 + ld c,e ;результат преобразования + ld b,d + jr nz,x243A ;это не число + inc (hl) ;маркер конца строки +x243A pop de + pop hl + ret + +;АДРЕС: #243D чтение байта из памяти пользователя +;вх: hl - адрес в памяти +;вых: a - прочитанный байт +x243D rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + ret + +;АДРЕС: #2442 запись байта в память пользователя +;вх: hl - адрес в памяти +; a - байт для записи +x2442 rst #30 + dw rom2_x0000 ;запись байта в память пользователя (rst #00) + db #02 + ret + +;АДРЕС: #2447 печать одной строки дампа памяти (8 байт) +;вх: hl - адрес памяти (начало дампа) +;вых: hl - следующий адрес памяти (начало дампа) +x2447 rst #30 + dw rom2_x2EBA ;печать одной строки дампа памяти (8 байт) + db #02 + ret + +;АДРЕС: #244C обновление окна с дизасмом памяти начиная с текущей ячейки +x244C bit 5,(iy+#0A) + ret nz ;не обновлять дизассемблер памяти по содержимому ячейки памяти + ld de,(xDD69) ;адрес текущей ячейки в дампе памяти + rst #30 + dw rom2_x2F74 ;вывод дисасма памяти по адресу в de + db #02 + rst #30 + dw rom2_x3019 ;ix = адрес дескриптора окна монитора: дамп памяти + db #02 + ret + +;АДРЕС: #245E переименование подраздела +x245E ld a,#32 ;сообщение заголовка: rename partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем + ;hl - номер позиции в каталоге +x2463 ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr nz,x2471 ;подраздел существует +x246C call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2463 +x2471 ld a,(hl) + ld (xDFFE),a ;тип подраздела + call x2D2F ;ввод имени подраздела + jr c,x246C ;отмена ввода. продолжим выбор + jp x2D50 ;сортировка каталога и выход в меню + +;Не используется АДРЕС: #247D ret +x247D ret + +;АДРЕС: #247E печать нового пути после выбора пунктов меню mount/dismount DRIVE +;вх: a - номер дисковода +x247E and #03 +;печеть сообщения + push af + bit 7,(iy+#0B) + jr nz,x248D ;меню dismount + ld bc,#2B02 ;сообщение: mount on + rst #08 + jr x2491 +x248D ld bc,#2F02 ;сообщение: dismount + rst #08 +x2491 pop af + call x249C ;печать буквы дисковода или пути, если это образ + ld a,#26 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + ret + +;АДРЕС: #249C печать буквы дисковода или пути, если это образ +;вх: a - номер дисковода +x249C push af +;печать буквы дисковода + add a,"A" + rst #10 + pop af + rst #30 + dw rom7_x1B04 ;расчет адреса блока описателя заданного дисковода + db #07 + ld c,a ;код подраздела (для образа =#01) +;печать двоеточия + push af + ld a,":" + rst #10 + pop af + jr z,x24CD ;это реальная дискета +;это образ. печать пути + ld de,#0009 + add hl,de + ld de,xE7C7 ;строка пути к образу диска + push de + call x24DE ;копирование имени из (hl) в (de) + ld a,c + cp #01 + jr nz,x24C4 ;это не образ tr-dos + ld a,#5C ;"\" + ld (de),a + inc de + call x24DE +x24C4 ex de,hl + dec hl + set 7,(hl) + pop hl + rst #30 + dw rom2_x15DB ;печать сообщения из hl + db #02 +x24CD ret + +;АДРЕС: #24CE обработка пункта меню: Z. dismount.../Z. mount... +x24CE bit 7,(iy+#0B) + jr nz,x24D9 ;меню dismount + ld bc,#2D02 ;сообщение: dismount ... + rst #08 + ret +x24D9 ld bc,#3002 ;сообщение: mount ... ___ + rst #08 + ret + +;копирование имени из (hl) в (de) +;вх: b - смещение в имени подраздела +; hl - начало имени подраздела в блоке описателя дисковода +x24DE ld a,l + add a,b + ld l,a + jr nc,x24E4 + inc h +x24E4 ld b,#06 +x24E6 ld a,(hl) + cp #21 + ret c ;непечатный символ. выход + ld (de),a + inc hl + inc de + djnz x24E6 + ret + +;АДРЕС: #24F0 монтирование образа к дисководу +;вх: a - номер дисковода +x24F0 call x2536 ;монтирование/отключение подраздела/образа диска + ret c ;отмена выбора + ld c,#11 ;чтение кода спецификации дисковода + rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 ;hl - адрес кода, определяющего тип текущего дисковода + bit 4,(hl) + jr nz,x2503 + ld hl,xFFDC + res 6,(hl) + +;АДРЕС: #2503 монтирование всех образов с винчестера +x2503 ld a,(xFFCA) + and #03 + ld e,a ;номер текущего дисковода + ld d,#03 +; для всех кроме текущего дисковода +x250B push de + ld a,d + cp e + call nz,x251A + pop de + ld a,d + or a + jr z,x2519 + dec d + jr x250B +x2519 ld a,e +; в конце и для текущего +;монтирование образа с обработкой неудачной попытки +x251A push af + or #80 + rst #30 + dw rom7_x18C0 ;R8DOS #28(40) автоподключение, т. е. подключить то, что задано в секторе автонастроек + db #07 + pop bc + ret nc ;прошло без ошибок +; были ошибки при монтировании образа + push af + ld a,b ;номер дисковода + push bc + or #40 + rst #30 + dw rom7_x18C0 ;R8DOS #28(40) отключить подраздел от драйвера + db #07 + pop bc + pop af + cp #67 + ret z ;нет примонтированнго подраздела/образа + ld a,b + set 7,(iy+#0B) + +;АДРЕС: #2536 монтирование/отключение подраздела/образа диска +;вх: a - номер дисковода +; 7,(iy+#0B) =0/1 mount/dismount +; +x2536 rst #30 + dw rom7_x1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 + db #07 + push hl ;адрес начала записи для заданного дисковода в буфере xE5A9 + ld b,#00 + bit 7,(iy+#0B) ;=0/1 mount/dismount + call z,x259D ;если да, печать списка разделов и выбор подраздела/образа + pop bc + ret c ;отмена выбора +; подраздел/образ выбран + push hl ;hl - адрес записи в каталоге + push bc + rst #30 + dw rom7_x1E3D ;чтение сектора 3(сектор с настройками) в буфер xE5A9 и проверка контрольной суммы + db #07 + jr nc,x2552 ;успешно + cp #63 ;ошибка контрольной суммы. настройки обнулены + jr nz,x2599 ;ошибки чтения +x2552 pop hl ;hl адрес строки с примонтированным образом в буфере (для заданного дисковода) + bit 7,(iy+#0B) ;=0/1 mount/dismount + res 7,(iy+#0B) + ld (hl),#00 + pop de ;de - адрес записи в каталоге + jr nz,x2592 ;dismount +;формирование записи о примонтированном подразделе/образе + ld a,(de) + push de + ld (hl),a ;+#00 тип раздела/образа + inc hl + ex de,hl + ld bc,#0001 + add hl,bc + ld bc,#0004 + ldir ;+#01 смещение первого сектора от начала винчестера (LBA адрес) + ld (de),a ;+#05 тип раздела/образа + and #DF ;сброс бита защиты от записи + inc de + pop hl ;hl - адрес записи в каталоге + push hl + ld bc,#0006 + add hl,bc + ld bc,#0004 + ldir ;+#06 размер подраздела/образа + cp #01 + jr z,x2588 ;это образ диска + pop hl ;hl - адрес записи в каталоге + push hl + call x25E1 ;+#0A имя подраздела + jr x258E +; это образ диска +x2588 ld hl,xE81B+#0A + call x25E5 ;+#0A имя подраздела, которому принадлежит образ +x258E pop hl ;hl - адрес записи в каталоге + call x25E1 ;+#0A имя подраздела/образа +x2592 rst #30 + dw rom7_x1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер + db #07 + ret nc ;ошибок нет + jr x25D1 ;ошибка записи +;ошибка чтения/записи винчестера +x2599 pop bc + pop hl + jr x25D1 + +;печать списка разделов и выбор подраздела/образа +;вых: cy =1 отмена выбора +; =0 образ/раздел выбран +; hl - адрес записи в каталоге +; (xE81B) заголовок выбранного подраздела/образа +x259D call x2620 ;формирование в буфере xEBF5 списка подразделов MFS + ld bc,(xDD89) ;количество подразделов + ld a,c + or b + jp z,x0EB5 ;подразделов нет. печать текущего меню монитора + ld a,#1E + call x29D7 ;печать окна с подразделами и выбор подраздела в нем +x25AE ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,(hl) + and #DF + cp #01 + jr z,x25C4 ;подраздел TR-DOS + cp #02 + ret z ;MicroDOS + cp #03 + ret z ;IS-DOS + call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x25AE +;выбран подраздел TR-DOS +x25C4 ld de,xE81B ;копируем запись подраздела + ld bc,#0010 + ldir + call x25EB ;формирование в буфере xEBF5 списка образов коллекции + jr nc,x25D6 ;сформировано без ошибок +; ошибки винчестера +x25D1 rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +x25D6 ld a,#1F ;сообщение: select disk + call x29D0 ;печать окна с образами дисков и выбор образа в нем + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + or a + ret +;копирование 6 байт из (hl+#0A) в (de) +x25E1 ld bc,#000A + add hl,bc +;копирование 6 байт из (hl) в (de) +x25E5 ld bc,#0006 + ldir + ret + +;АДРЕС: #25EB формирование в буфере xEBF5 списка образов коллекции +; (xE81B) заголовок выбранного подраздела +x25EB call x2707 ;dehl - смещение(LBA адрес) первого сектора подраздела + rst #30 + dw rom7_x17BB ;чтение в буфер xEBF5 каталог выбранного подраздела + db #07 + ret c ;ошибка +;проверка наличия сигнатуры + ld hl,(xEBF5+#3FC) ;сигнатура подраздела + ld de,#5254 + sbc hl,de + jr z,x2601 ;сигнатура совпадает + ld a,#63 + scf + ret +x2601 push ix + call x2671 ;сортировка записей в буфере по порядку местоположения + ;ix=xEBF5 + call x2707 ;dehl - смещение первого сектора выбранного подраздела + call x2683 ;проверка разрывов между образами и создание пустых записей в буфере + call x2707 ;dehl - смещение первого сектора выбранного подраздела + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ;de=xE9E7 + ld bc,#0006 + jr x2661 ;формирование последней unused записи в буфере + +;АДРЕС: #261A удаление всех подразделов +x261A set 6,(iy+#1C) ;признак изменения каталога + jr x2647 + +;АДРЕС: #2620 формирование в буфере xEBF5 списка подразделов MFS +x2620 res 6,(iy+#1C) + rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x262F ;раздел найден +x262A rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +x262F push hl ;dehl - смещение первого сектора раздела + push de ;bc - адрес дескриптора раздела MFS в буфере + ld l,c + ld h,b + ld de,xE81B + ld bc,#0010 + ldir + pop de + pop hl + rst #30 + dw rom7_x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS + db #07 + jr nc,x264A ;нет ошибок + cp #63 ;раздел не инициализирован + jr nz,x262A ;ошибка чтения +x2647 call x2E71 ;очистка буфера xEBF5 и установка сигнатуры раздела MFS +x264A push ix + call x2671 ;сортировка подразделов в буфере xEBF5 по порядку местоположения + ;ix=xEBF5, bc - количество подразделов в буфере + call x270D ;загрузка числа в dehl из памяти xE81B+8 + call x2683 ;проверка разрывов между подразделами/образами и создание пустых записей в буфере + call x270D ;загрузка числа в dehl из памяти xE81B+8 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ;de=xE9E7 + ld bc,#000C +; формирование последней unused записи в буфере +x2661 ld hl,xE81B + add hl,bc ;адрес количества секторов раздела MFS + ex de,hl + push hl + call x3052 ;(xE9E7) - адрес первого свободного сектора после раздела MFS + pop hl + call x26AC ;проверка конца раздела MFS на наличие пустого места + pop ix + ret + +;АДРЕС: #2671 сортировка записей в буфере xEBF5 по порядку местоположения +;вых: ix,xEBF5 +; bc - количество записей в буфере +x2671 call x271A ;подсчет количества записей + ld hl,x28B9 ;по порядку местоположения + call x2960 ;сортировка дескрипторов записей + ld ix,xEBF5 + ld bc,(xDD89) ;количество записей в буфере + ret + +;АДРЕС: #2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере +;вх: ix=xEBF5 - адрес буфера с каталогом подразделов/образов +; bc - количество подразделов/образов +; dehl - смещение первого сектора MFS раздела (LBA адрес) +x2683 ld (xE9EB),hl + ld (xE9EB+#02),de + push bc + ld hl,xE9EB + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl + pop bc +x2695 ld a,c + or b + ret z ;нет записей + dec bc ;номер последней записи + push bc + push ix + pop hl ;адрес смещения первой записи в буфере + ld bc,#0001 + add hl,bc ;адрес с LBA адресом первой записи в буфере + call x26AC ;проверка разрыва между подразделами/образами и создание пустой записи в буфере + ld bc,#0010 + add ix,bc ;адрес следующей записи в буфере + pop bc + jr x2695 ;повторим + +;АДРЕС: #26AC проверка разрыва между подразделами/образами и создание пустой записи в буфере +;вх: ix=xEBF5 - адрес записи в буфере с каталогом подразделов/образов +; hl - адрес с LBA адресом подраздела/образа (LBA адрес) +; (xE9EB) - расчетный адрес начала этого подраздела/образа (LBA адрес) +;вых: (xE9EB) - расчетный адрес начала следующего подраздела/образа (LBA адрес) +; +x26AC push hl + ld de,xE9EB ;смещение первого сектора MFS раздела (LBA адрес) +2 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl + jr z,x26F8 ;они равны +;есть пустое место. формируем запись unused в буфере + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + ld de,xE9EB + push hl + call x3035 ;вычитание (hl)=(hl)-(de) + pop hl ;(xE9E7) размер пустого пространства + ld de,rom7_x0F59 ;=#00000200 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + jp c,x26F8 ;менее 256Kb + call x2990 ;вставляем новую запись в список записей + push ix + pop hl +; устанавливаем смещение первого сектора новой записи + push hl + ld bc,#0001 + add hl,bc ;адрес смещения первого сектора новой записи + ld de,xE9EB + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + pop hl +; устанавливаем размер новой записи + ld bc,#0006 + add hl,bc ;адрес размера новой записи + ld de,xE9E7 + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + ld (ix+0),#FF ;помечаем как unused + call x26F8 ;расчет адреса начала следующего подраздела/образа (LBA адрес) + ld bc,#0010 + add ix,bc ;двигаем указатель на сдвинутую запись +;расчет адреса начала следующего подраздела/образа (LBA адрес) +x26F8 push ix + pop hl + ld bc,#0006 + add hl,bc ;адрес с размером подраздела/образа + ex de,hl + ld hl,xE9EB + call x3052 ;сложение двух 4х байтных чисел + ret + +;АДРЕС: #2707 загрузка числа в регистры из памяти xE81B+1 +x2707 push bc + ld bc,#0001 + jr x2711 + +;АДРЕС: #270D загрузка числа в регистры из памяти xE81B+8 +x270D push bc + ld bc,#0008 +x2711 ld hl,xE81B + add hl,bc + call x300E ;загрузка числа в регистры из памяти + pop bc + ret + +;АДРЕС: #271A подсчет количества подразделов в MFS +;вых: (xDD89),bc - количество подразделов в разделе MFS +x271A ld hl,xEBF5 + ld e,#10 + xor a + ld d,a + ld b,a + ld c,a +x2723 ld a,(hl) + cp b + jr z,x272E + inc c + add hl,de + ld a,c + cp #3F + jr c,x2723 +x272E ld (xDD89),bc + ret + +;АДРЕС: #2733 удаление всех разделов MBR +x2733 set 6,(iy+#1C) + jr x275F + +;АДРЕС: #2739 формирование в буфере xEBF5 списка разделов MBR +x2739 res 6,(iy+#1C) + set 7,(iy+#1C) + rst #30 + dw rom7_x1768 ;поиск раздела MFS + db #07 + jr nc,x2762 ;раздел найден + res 7,(iy+#1C) + cp #63 + jr z,x2754 ;раздел не найден + rst #30 ;ошибка чтения диска + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret +;раздел MFS не найден. проверяем наличие MBR +x2754 ld hl,(xE5A9+#1FE) ;сигнатура сектора MBR + ld de,#AA55 + or a + sbc hl,de + jr z,x2762 ;сигнатура есть +x275F call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 +;ищем записи в MBR и копируем их в буфер xEBF5 +x2762 ld de,xEBF5 ;сюда сложим существующие записи в MBR + push ix + ld bc,#0400 + ld ix,xE5A9+#1BE ;начало записей в MBR +x276E push bc + xor a + or (ix+4) ;код типа раздела + ld a,c + ld bc,#0010 + jr z,x2781 ;пустая запись + inc a ;+1 найденная запись + push ix + pop hl + push bc + ldir ;копируем в буфер xEBF5 + pop bc +x2781 add ix,bc ;адрес следующей записи в MBR + pop bc + ld c,a ;количество найденных записей + djnz x276E + ld (xDD89),bc ;количество найденных записей + pop ix +;проверка разрывов между разделами и создание пустых записей в буфере +x278D ld hl,x2895 + call x2960 ;сортировка записей MBR по адресу расположения + push ix + ld ix,xEBF5 ;буфер с записями MBR + ld bc,(xDD89) ;количество записей + call x2FCF ;обнуление переменной xE9EB + ld a,(xDFF5) ;значение sector HDD + ld (xE9EB),a ;раздел может начинаться только с начала дорожки + ld a,c + or b + jr z,x27C2 ;нет записей в MBR +x27AA ld a,c + or b + jr z,x27C2 ;больше нет записей MBR для обработки + dec bc + push bc + push ix + pop hl ;адрес начала записи MBR в буфере xEBF5 + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора записи MBR + call x27E1 ;проверка разрывов между разделами и создание + ;пустой записи в буфере + ld bc,#0010 + add ix,bc + pop bc + jr x27AA ;проврека следующей записи MBR +;буфер с записями построен +x27C2 ld hl,(xE5A5) + ld de,#0000 ;head * sector активного HDD + exx + ld bc,(xDFF2) ;значение Cylinders HDD + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + ex de,hl ;hl=xE9E7 (адрес последнего сектора в CHS) + call x302A ;декремент (hl)=(hl)-1 + call x27E1 + pop ix + ret + +;проверка разрывов между разделами и создание пустой записи в буфере +;вх: ix адрес начала записи MBR в буфере xEBF5 +; hl - адрес смещения первого сектора записи MBR +; (xE9EB) первый свободный сектор +;вых: (xE9EB) новый первый свободный сектор +; ix - адрес следующей записи +x27E1 push hl + ld de,xE9EB + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl + jr z,x282C ;нет пропущенных секторов +; вычисляем количество незанятых секторов + ld de,xE9E7 ;переменная + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + ld de,xE9EB + push hl + call x3035 ;вычитание (hl)=(hl)-(de) + pop hl ;(xE9E7) - количество незанятых секторов + ld de,rom7_x0F55 ;это адрес в rom 7 содержит dd #800 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + jp c,x282C ;меньше мегабайта. неучитываем +; создаем новую запись с количеством незанятых секторов + call x2990 ;вставляем новую запись в список записей + push ix + pop hl + push hl ;адрес новой записи + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора новой записи + ld de,xE9EB + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + pop hl ;адрес новой записи + ld bc,#000C + add hl,bc ;адрес количества секторов раздела + ld de,xE9E7 ;количество незанятых секторов + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + call x283B ;установка остальных параметров в новой записи + call x282C ;(xE9EB) новый первый свободный сектор + ld bc,#0010 + add ix,bc ;следующая запись +;расчет нового первого свободного сектора +x282C push ix + pop hl + ld bc,#000C + add hl,bc ;адрес количества секторов раздела + ex de,hl + ld hl,xE9EB + call x3052 ;сложение двух 4х байтных чисел + ret +;установка остальных параметров в новой записи +;вх: ix - адрес новой записи +x283B ld (ix+#00),#FF ;тип unused + ld (ix+#04),#53 ;код типа раздела (MFS) + push ix + pop hl + ld bc,#0008 + add hl,bc ;адрес смещения первого сектора новой записи + push hl + push ix + pop bc + inc bc ;адрес структуры описания раздела MBR +1 + call x2874 ;расчет и установка в структуре записи MBR параметров CHS + pop hl ;адрес смещения первого сектора новой записи +; расчет количества секторов новой записи + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl + push hl + inc de + inc de + inc de + inc de ;адрес количества секторов новой записи + call x3052 ;сложение двух 4х байтных чисел + pop hl + push hl + call x302A ;декремент (hl)=(hl)-1 +; установка конца раздела в CHS + push ix + pop hl + ld bc,#0005 + add hl,bc ;конец раздела - головка + ld c,l + ld b,h + pop hl + ld hl,xE9E7 +;расчет и установка в структуре записи MBR параметров CHS +;вх: bc - адрес структуры описания раздела MBR +1 +; hl - адрес смещения первого сектора новой записи +x2874 push bc + call x300E ;загрузка числа в регистры из памяти + ;dehl - смещение первого сектора новой записи + rst #30 + dw rom7_x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + db #07 + pop hl ;начало раздела - головка + ld a,(iy+#35) + and #0F + ld (hl),a ;головка + inc hl + ld a,(iy+#34) + and #03 + rlca + rlca ;цилиндр (биты 6, 7) + or (iy+#32) ;сектор (биты 0-5) + ld (hl),a + inc hl + ld a,(iy+#33) + ld (hl),a ;цилиндр (старшие биты 8, 9 хранятся в байте номера сектора) + ret + +;АДРЕС: #2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) +;вх: bc - номер подраздела +x2895 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5+#08 ;буфер с секторами раздела +8 + add hl,bc + ex de,hl + ld hl,xEBF5+#18 ;#EC0D + +;сортировка двух дескрипторов по возрастанию заданного поля +;вх: hl - адрес ячейки второго подраздела с полем для сортировки +; bc - смещение до дескриптора подраздела в буфере +; de - адрес ячейки подраздела с полем для сортировки +;вых: cy=0 обмена не было +; cy=1 дескрипторы поменяны местами +x28A0 add hl,bc ;адрес ячейки со смещением до начала последнего подраздела + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + ret nc ;расположены по возрастанию + ld hl,xEBF5 ;обмен местами дескриторов + add hl,bc + ex de,hl + ld hl,xEBF5+#10 + add hl,bc + ld b,#10 +x28B0 ld a,(de) + ld c,(hl) + ld (hl),a + ld a,c + ld (de),a + djnz x28B0 + scf + ret + +;АДРЕС: #28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения +;вх: bc - номер подраздела +x28B9 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5+#01 ;буфер с секторами раздела +1 + add hl,bc ;адрес ячейки со смещением до начала подраздела + ex de,hl ; + ld hl,xEBF5+#11 ;адрес ячейки со смещением до начала второго подраздела + jr x28A0 ;сортировка по возрастанию местоположения двух дескрипторов + +;АДРЕС: #28C6 уплотнение каталога MBR (удаление в буфере записей unused) +;вх: hl=x2D5D п/п сравнения (hl) с #FF, cy=1 если равны +; +x28C6 ld (xE51C+1),hl + ld bc,(xDD89) ;количество записей в буфере каталога + call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 ;буфер + push hl + push hl + add hl,bc ;конец каталога + ld (xE9E7),hl ;адрес конца каталога + pop hl + ld bc,#0000 +x28DD ex de,hl + ld hl,(xDD89) ;количество записей в буфере каталога + scf ;тут счетчик записей в каталоге + sbc hl,bc ; + inc bc ; + ex de,hl ;hl адрес обрабатываемой записи в каталоге + jr c,x2914 ;нет больше записей + call xE51C ;сравним с #FF + jr nc,x290E ;не равны, следующая запись + push hl ;адрес текущей записи + ex de,hl + ld hl,(xE9E7) + or a + sbc hl,de ;размер необработанного каталога + jr z,x290D ;просмотрели весь каталог + push bc + push hl + ld bc,#0010 ;убираем из каталога запись unused + or a ;и уплотняем каталог + sbc hl,bc + add hl,de + ld (xE9E7),hl ;новый адрес конца каталога, после уплотнения + ld l,e + ld h,d + add hl,bc ;адрес следующей записи + pop bc + ldir ;уплотняем + pop bc + pop hl + jr x28DD ;следущая запись +;конец каталога +x290D pop hl ;адрес конца каталога +;следущая запись +x290E ld de,#0010 + add hl,de + jr x28DD +;завершили уплотнение +;hl адрес конца каталога +x2914 pop de ;de адрес первой записи в каталоге + xor a + sbc hl,de + push hl + ld b,#04 +x291B srl h + rr l + djnz x291B ;hl=hl/#10 + ld (xDD89),hl ;количество записей + pop hl + add hl,de + ld (hl),a + ret + +;АДРЕС: #2928 подсчет количества разделов/подразделов в каталоге +;вых: de - фактическое количество разделов/подразделов в каталоге +x2928 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны + call x2939 ;de - количество пустых записей в каталоге разделов/подразделов + ld hl,(xDD89) ;количество разделов/подразделов в каталоге + or a + sbc hl,de + ex de,hl + ret + +;АДРЕС: #2936 подсчет пустых записей в каталоге разделов/подразделов +;вых: de - количество пустых записей в каталоге разделов/подразделов +x2936 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны +x2939 ld (xE51C+#01),hl + ld hl,xEBF5 ;каталог разделов/подразделов + ld de,(xDD89) ;количество разделов/подразделов + ld a,e + or d + ret z ;a=#00 нет разделов/подразделов + push bc + ld c,e + ld b,d ;bc количество разделов/подразделов в каталоге + ld de,#0000 ;количество пустых записей в каталоге +x294C dec bc + call xE51C + jr c,x2953 ;запись о разделе/подразделе не пустая + inc de +x2953 ld a,c + or b + jr z,x295E + ld a,#10 ;следующая запись + call x2023 ;сложение hl=hl+a + jr x294C +x295E pop bc + ret + +;АДРЕС: #2960 сортировка дескрипторов подразделов +;вх: hl=x28B9 - по порядку местоположения на винчестере +; hl=x2895 - по адресу расположения (для записей MBR) +x2960 ld (xE51C+1),hl + ld bc,(xDD89) ;количество подразделов + ld a,c + or b + ret z ;подразделы отсутствуют + ld hl,#0001 + sbc hl,bc + ret z ;подраздел только 1 +x2970 xor a + ld r,a + ld bc,(xDD89) ;количество подразделов + dec bc +x2978 push bc + dec bc + call xE51C ;п/п сортировки + jr nc,x2983 ;обмена не было + ld a,#FF + ld r,a ;7,r =1 был зотя бы один обмен +x2983 pop bc + dec bc + ld a,c + or b + jr nz,x2978 ;следующая пара дескрипторов + ld a,r + bit 7,a + jr nz,x2970 ;будем повторять, пока сортировка не закончится + ret + +;АДРЕС: #2990 вставляем новую запись в список записей +;вх: ix адрес начала записи в буфере =xEBF5, с которой надо раздвинуть список +; (xDD89) - количестов записей +x2990 ld bc,(xDD89) ;количество записей (оно же номер первой свободной) + call x2FEF ;умножение bc=bc*#10 + call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 + ld hl,xEBF5 ;буфер с записями + add hl,bc ;адрес новой записи в конце списка + push ix + pop de ;адрес текущей записи + or a + sbc hl,de + ret c ;ошибка + push hl ;на сколько байт сдвинуть + push ix + pop hl ;адрес текущей записи + ld bc,#0010 + ld e,l + ld d,h ;адрес текущей записи + add hl,bc ;куда сдвигаем + ex de,hl + pop bc ;на сколько байт сдвинуть + ld a,c + or b + ret z + push hl + sbc hl,de ;направление переноса + pop hl + jr c,x29BD + ldir + ret +x29BD dec bc + add hl,bc + ex de,hl + add hl,bc + ex de,hl + inc bc + lddr + ret + +;АДРЕС: #29C6 расчет адреса в каталоге +;вх: hl - номер записи в каталоге +;вых: hl - адрес записи в каталоге +x29C6 ld c,l + ld b,h + call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 + add hl,bc + ret + +;АДРЕС: #29D0 печать окна с образами дисков и выбор образа в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D0 ld hl,x2A0A + jr x29E1 + +;АДРЕС: #29D5 печать окна local partition information и выбор записи в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D5 ld a,#16 ;сообщение заголовка: partition information + +;АДРЕС: #29D7 печать окна с подразделами и выбор подраздела в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29D7 ld hl,x2A04 ;таблица со списком процедур для печати окна выбора раздела + jr x29E1 + +;АДРЕС: #29DC печать окна global partition information и выбор записи в нем +;вых: cy=0 выбор произведен успешно +; hl - номер позиции в каталоге +; cy=1 ошибка выбора +x29DC ld a,#16 ;сообщение заголовка: partition information +x29DE ld hl,x29FE ;таблица со списком процедур для печати окна partition information +x29E1 ld (iy-#08),a ;номер сообщения текущей опции + call x2BB8 ;подготовка к печати окна выбора раздела + ld (xE9E1),hl ;адрес списка процедур + call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 + call x1EF1 ;печать каталога и выбор позиции в нем + call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 + ret + +;АДРЕС: #29F4 выбран некорректный раздел. продолжаем выбор +x29F4 call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 + call x1F04 ;продолжаем выбор + call x2FDB ;инкремнт слова (xDD89)=(xDD89)+1 + ret + +;таблица со списком процедур для печати окна global partition information +x29FE dw x2A77 ;печать одного имени из каталога разделов MBR + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: partition information + +;таблица со списком процедур для печати окна выбора раздела +x2A04 dw x2A33 ;печать одного имени из каталога подразделов + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: _select local partition_ + +;#2A0A таблица со списком процедур для печати окна выбора образа диска +x2A0A dw x2A1D ;печать одного имени из каталога образов дисков + dw x2A19 ;получение номера последней записи в каталоге подразделов + dw x2A10 ;заголовок: select disk + +;заголовок: _select local partition _ +x2A10 rst #20 + dc " " + ld b,(iy-#08) ;номер сообщения в блоке + ld c,#02 ;номер блока сообщений + rst #08 ;select local partition + ret +;получение номера последней записи в каталоге разделов/подразделов/образов +x2A19 ld hl,(xDD89) + ret + +;печать одного имени из каталога образов дисков +x2A1D call x2B05 ;проверка первого байта записи каталога на #FF + jr nz,x2A27 ;печать имени + call x2B12 ;печать сообщения: Unused + jr x2A6C ;печать размера +x2A27 rst #20 + dc "Disk Name" + jr x2A59 ;продолжение печати имени диска + +;печать одного имени из каталога подразделов +x2A33 call x2B05 ;проверка первого байта записи каталога подраздела на #FF + jr nz,x2A3D ;<>#FF +x2A38 call x2B12 ;печать сообщения: Unused + jr x2A6C +x2A3D bit 7,(hl) + ld a," " + jr z,x2A45 + ld a,"*" +x2A45 rst #10 ;печать символа из A + + push hl ;печать типа подраздела + ld a,(hl) + and #07 + ld hl,x2B71 ;список сообщений + call x2B8C ;поиск и печать сообщения из HL по типу в A + jr nc,x2A6B ;тип раздела не опознан + ld a,#0A + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + pop hl +x2A59 ld a,":" ;разделитель + rst #10 + + push hl ;печать имени подраздела + ld bc,#000A + add hl,bc + xor a + cp (hl) + jr z,x2A6B ;нет имени + ld b,#06 + rst #30 ;печать имени подраздела + dw rom2_x15B3 ;печать сообщения из hl длиной b + db #02 +x2A6B pop hl +x2A6C ld a,#13 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + call x3005 ;dehl = размер подраздела + jr x2A97 ;печать размера подраздела + +;печать одного имени из каталога разделов MBR +x2A77 call x2B03 ;проверка первого байта записи каталога подраздела на #FF + jr nz,x2A81 ;есть запись + call x2B12 ;печать сообщения: Unused + jr x2A8E ; +; печать типа раздела MBR +x2A81 push hl ;номер записи + ld bc,#0004 + add hl,bc + ld a,(hl) ;код типа раздела + ld hl,x2B1A ;таблица с сообщениями типов разделов + call x2B8C ;поиск и печать сообщения из HL по типу в A + pop hl +; печать размера раздела +x2A8E ld a,#13 + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 + call x300A ;dehl - чоличество секторов раздела MBR + +;печать размера в мегабайтах +;dehl - размер подраздела +x2A97 ld a,e + or d + jr nz,x2AA4 ;мегабайты + ld bc,#0800 + push hl + sbc hl,bc + pop hl + jr c,x2AB2 ;килобайты + +;АДРЕС: #2AA4 преобразование количества секторов в мегабайты +x2AA4 call x2AC0 ;преобразование количества секторов в мегабайты + ld a,#04 + rst #30 + dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом + db #02 + rst #20 + dc " MB" + ret +x2AB2 call x2ACC ;преобразование количества секторов в килобайты + ld a,#04 + rst #30 + dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом + db #02 + rst #20 + dc " KB" + ret + +;АДРЕС: #2AC0 преобразование количества секторов в мегабайты +;вх: dehl - размер в секторах +;вых: bc - размер в мегабайтах +x2AC0 exx + ld bc,#800 + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx +x2AC9 ld c,l + ld b,h + ret + +;АДРЕС: #2ACC преобразование количества секторов в килобайты +;вх: dehl - размер в секторах +;вых: bc - размер в килобайтах +x2ACC exx + ld bc,#0002 + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx + ld a,e + or d + jr nz,x2AE2 ;более 16 bit + push hl + ld bc,#8000 + sbc hl,bc + pop hl + jr c,x2AC9 ;менее #8000 +x2AE2 ld hl,#7FFF ;результат более #7FFF + jr x2AC9 + +;АДРЕС: #2AE7 умножение dehl=de*#800 +;вх: de - число +;вых: dehl - результат +x2AE7 ld l,e + ld h,d + ld de,#0000 + exx + ld bc,#0800 + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ret + +;АДРЕС: #2AF5 умножение dehl=de*2 +;вх: de - число +;вых: dehl - значение +x2AF5 ld l,e + ld h,d + ld de,#0000 + exx +x2AFB ld bc,#0002 + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ret + +;АДРЕС: #2B03 проверка первого байта записи каталога подраздела на #FF +;вх: hl - номер записи в каталоге +;вых: z - первый байт =#FF +x2B03 rst #20 + dc " " + +;АДРЕС: #2B05 проверка первого байта записи каталога подраздела на #FF +;вх: hl - номер записи в каталоге +;вых: z - первый байт =#FF +x2B05 push hl + pop bc +x2B07 call x2FEF ;умножение bc=bc*#10 + ld hl,xEBF5 + add hl,bc + ld a,(hl) + cp #FF + ret + +;АДРЕС: #2B12 печать сообщения: Unused +x2B12 rst #20 + dc "Unused" + ret + +;таблица с названиями разделов MBR +x2B1A db #00 + dc "Unknown DOS" + db #01 + dc "MS-DOS 12FAT" + db #04 + dc "MS-DOS 16FAT" + db #05 + dc "MS-DOS Ext" + db #06 + dc "MS-DOS 3.31+" + db #07 + dc "OS/2 HPFS" + db #0A + dc "OS/2 Boot" + dc "SMFS" + db #FF + +;таблица с названиями разделов MFS +x2B71 db #01 + dc "TR-DOS" + db #02 + dc "MicroDOS" + db #03 + dc "IsDOS" + db #04 + dc "BAD" + db #FF + +;АДРЕС: x2B8C поиск и печать сообщения из HL по типу в A +;вх: hl - список сообщений +; a - тип сообщения +;вых: cy=1 напечатано +; cy=0 сообщение не найдено +x2B8C call x2B9A ;поиск и печать сообщения из HL по типу в A + ret c ;напечатано + rst #20 ;печать сообщения "Unknown" + dc "Unknown" + or a + ret +;поиск и печать сообщения из HL по типу в A +;cy=1 напечатано +;cy=0 сообщение не найдено +x2B9A ld c,a +x2B9B ld a,(hl) + cp #FF + ret z ;конец списка + ld a,c + cp (hl) + inc hl + jr z,x2BAC ;сообщние найдено +x2BA4 ld a,(hl) ;ищем конец сообщения + and #80 + inc hl + jr z,x2BA4 + jr x2B9B +;печать сообщения из hl +;cy=1 напечатано +x2BAC ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x2BAC ;еще не конец сообщения + scf + ret + +;АДРЕС: #2BB8 подготовка к печати окна выбора раздела +x2BB8 push hl + call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) + ld hl,#0506 ;координаты окна + ld de,#1C15 ;ширина окна в знакоместах и символах + call x2133 ;коррекция координат и размеров окна + call x0D02 ;очистка нижней строки окна меню + pop hl + ret + +;АДРЕС: #2BCA создание раздела MFS +x2BCA ld a,#19 ;заголовок окна: create partition ... + call x29DE ;печать окна global partition information и выбор записи в нем + ;hl - номер записи в каталоге +x2BCF ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr z,x2BDD ;выбрано незанятое место +x2BD8 call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2BCF +;назанятая область выбрана. создаем раздел MFS (все незанятые области в буфере +; уже помечены признаком раздела MFS) +x2BDD ld a,#07 +x2BDF push hl + push af + call x300A ;загрузка числа в регистры из памяти +12 байт к адресу hl + call x2AC0 ;преобразование количества секторов в мегабайты + pop af ;bc - размер в мегабайтах + ld hl,#0813 + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl + jr c,x2BD8 ;отмена ввода числа + ld a,e + or d + jr z,x2BD8 ;введен ноль + push hl + call x2AE7 ;умножение dehl=de*#800 + ld bc,xE9E7 ;dehl размер создаваемого раздела в секторах + call x301C ;загрузка числа из регистров в память + pop hl + push hl + ld bc,#000C + add hl,bc ;размер раздела MBR в записи в каталоге + call x2FCA ;сравнение со сободным местом + pop hl + ld a,#0C + jr c,x2BDF ;слишком большой раздел хотим создать + ld (hl),#00 ;признак наличия раздела +0 в записи + ld bc,#000C ;заносим в запись в каталоге размера раздела + add hl,bc + ld de,xE9E7 ;размер создаваемого раздела + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + jr x2C2A ;проверка разрывов между разделами и создание пустых записей в буфере + +;АДРЕС: #2C1F удаление раздела MBR +x2C1F ld a,#18 ;сообщение заголовка: delete partition ... + call x29DE ;печать окна global partition information и выбор записи в нем + ;hl - номер записи в каталоге + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ;hl - адрес записи в каталоге + ld (hl),#FF ;помечаем как пустую запись +;проверка разрывов между разделами и создание пустых записей в буфере +x2C2A set 6,(iy+#1C) + ld hl,x2D5D ;!!!это лишняя команда + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + jp x278D ;проверка разрывов между разделами и создание пустых записей в буфере + +;АДРЕС: #2C37 создание подраздела +x2C37 ld a,#19 ;сообщение заголовка: create partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем +x2C3C ret c ;ошибка + call x29C6 ;расчет адреса в каталоге + ld a,#FF + cp (hl) + jr z,x2C4A ;эта запись пустая +x2C45 call x29F4 ;выбран некорректный раздел. продолжаем выбор + jr x2C3C +;создаем подраздел +x2C4A push hl ;адрес начала записи в каталоге + ld hl,#0A01 + ld de,#2B71 + call x2F10 ;выбор типа подраздела + call x205A ;установка текущим окна: вывод каталога + pop hl ;адрес начала записи в каталоге + jr c,x2C45 ;отмена выбора типа подраздела. продолжаем выбор + ld (xDFFE),a ;код типа подраздела + call x2D2F ;ввод имени подраздела + jr c,x2C45 ;отмена ввода + ld a,#07 +x2C64 ld c,a + ld a,(xDFFE) ;код типа подраздела + cp #01 + ld a,c + jr z,x2CEB ;ввод размера подраздела TR-DOS в образах +;ввод числа. размер подраздела в килобайтах + push hl + push af + call x3005 ;dehl - размер подраздела в секторах + call x2ACC ;преобразование количества секторов в килобайты + pop af ;bc - размер в килобайтах + ld hl,#0812 ;параметры окна ввода + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl ;адрес начала записи в каталоге + jr c,x2C45 ;отмена ввода числа + ld a,e ;de - введенное число + or d + ld a,#0C + jr z,x2C64 ;ввели ноль. повторим ввод +;проверка числа + push hl + call x2AF5 ;умножение dehl=de*2 +x2C8C push de + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память + pop bc ;de=xE9E7 + ld a,c + or b + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr nz,x2C64 ;нельзя создать подраздел более 32Mb. повторим ввод +;проверка свободного места под заданный размер + push hl + ld bc,#0006 + add hl,bc ;адрес начала записи в каталоге+6 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr c,x2C64 ;нет места под такой раздел. повторим ввод +;проверка минимально допустимого размера подраздела + push hl + ld hl,xE9E7 ;введенное число + ld de,rom7_x0F59 ;=#00000200 + call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl + pop hl ;адрес начала записи в каталоге + ld a,#0C + jr c,x2C64 ;слишком маленький. продолжим ввод + ld a,(xDFFE) ;код типа подраздела + ld (hl),a + push hl + ld bc,#0006 + add hl,bc + ld de,xE9E7 ;введенное число + ex de,hl + call x3000 ;запишем в дескриптор подраздела размер + pop hl ;адрес начала записи в каталоге + ld a,(hl) + cp #01 + jr nz,x2CE8 ;это не TR-DOS подраздел +;создаем коллекцию образов + push hl ;адрес начала записи в каталоге + ld de,xE8A9 + ld bc,#0010 + ldir ;скопируем дескриптор подраздела + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + pop hl ;адрес начала записи в каталоге + jp nz,x2CE6 ;отказ от сохранения + call x2FB1 ;запись каталога MFS + call x2D63 ;формирование коллекции образов в подразделе TR-DOS + jp x09E5 ;чтение каталога подразделов + +x2CE6 ld (hl),#FF ;помечаем подраздел как удаленный +x2CE8 jp x2D50 ;сортировка каталога и выход в меню +;ввод размера подраздела TR-DOS в образах +;hl - адрес дескриптора подраздела +x2CEB push hl + push af + call x2E30 ;расчет максимального количества образов исходя из размеров подраздела + ld a,c + or a + jr z,x2D2A ;нет образов. продолжаем выбор + pop af + ld hl,#0812 + call x0BD0 ;ввод числа. в BC начальное значение + call x205A ;установка текущим окна: вывод каталога + pop hl + jp c,x2C45 ;отмена ввода. продолжаем выбор + ld a,e + or d + ld a,#0C + jp z,x2C64 ;ноль образов нель создать. продолжаем ввод +; расчет размера подраздела исходя из кол-ва образов + push hl ;адрес дескриптора подраздела + ld l,e + ld h,d + ld de,#0000 + exx + ld bc,#0501 ;размер образа в секторах + rst #30 + dw rom7_x0FB7 ;умножение dehl=de'hl' * bc + db #07 + ld bc,xE9E7 + call x301C ;загрузка числа из регистров в память (de=xE9E7) + ex de,hl + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl +2 сектора на каталог + call x300E ;загрузка числа в регистры из памяти + ;dehl - размер подраздела в секторах + jp x2C8C ;формирование подраздела +x2D2A pop af + pop hl + jp x2C45 ;нет образов. продолжаем выбор + +;АДРЕС: #2D2F ввод имени подраздела +;вх: hl - адрес начала записи в каталоге +;вых: cy=1 отмкна ввода +x2D2F ld a,#09 +x2D31 push hl + ld hl,#070B + call x2E85 ;ввод имени подраздела + call x205A ;установка текущим окна: вывод каталога + pop hl + ret c ;отмена ввода + call x2EA7 ;проверка введенного имени + ld a,#65 + jr c,x2D31 ;имя некорректно, повторим ввод + ret + +;АДРЕС: #2D45 удаление подраздела +x2D45 ld a,#18 ;сообщение заголовка:delete partition ... + call x29D7 ;печать окна с подразделами и выбор подраздела в нем + ;hl - номер позиции в каталоге + ret c ;отмена выбора + call x29C6 ;расчет адреса в каталоге + ld (hl),#FF + +x2D50 set 6,(iy+#1C) ;признак изменения каталога подразделов + ld hl,x2D5D + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + jp x264A ;сортировка каталога и выход в меню + +;АДРЕС: #2D5D сравнение (hl) с #FF, cy=1 если равны +x2D5D ld a,#FF + cp (hl) + ret nz + scf + ret + +;АДРЕС: #2D63 формирование коллекции образов в подразделе TR-DOS +;вх: (xE8A9) - дескриптор подраздела +x2D63 ld hl,xE8A9 ;дескриптор подраздела + call x2E30 ;расчет количества образов исходя из размеров подраздела + ld a,c + or b + ret z ;ни одного образа не поместится + ld b,c + ld c,#01 + push bc + ld de,#0001 + add hl,de + ld de,xE9E7 + call x3000 ;копирование из (hl) в (de) 4х байт + ex de,hl ;hl=xE9E7 + call x3047 ;инкремент числа по адресу hl + call x3047 ;инкремент числа по адресу hl + pop bc ;(xE9E7) LBA адрес начала образа + ld hl,xEBF5 ;начало каталога +;формирование каталога образов и очистка служебного сектора у каждого образа +x2D85 push bc + ld (hl),#01 ;признак образа TR-DOS + inc hl + ld de,xE9E7 + ex de,hl + call x3000 ;копирование из (hl) в (de) 4х байт + ;установка LBA адреса начала образа + ex de,hl ;hl=xE9E7 + call x2DF0 ;создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода + ld bc,#0004 + add hl,bc ;адрес дескриптора образа +5 + ld (hl),#00 +; размер образа + inc hl ;адрес дескриптора образа +6 + ld de,x2DE8 + ex de,hl + ld bc,#0004 + ldir ;размер образа (всегда #0501) +; имя образа + ld bc,#0004 + ld hl,x2DEC + ldir ;постоянное имя образа + ex de,hl + pop bc + push bc ;c - номер образа + ld b,#00 + ld a,#02 + ld e,#0A + push hl + call x0CDC ;печать числа bc в буфер hl + pop hl +; установка адреса следующего образа + inc hl + inc hl ;адрес следующего дескриптора образа + push hl + ld hl,xE9E7 ;сложение двух 4х байтных чисел + ld de,x2DE8 + call x3052 ;(xE9E7) LBA адрес следующего образа + pop hl ;адрес следующего дескриптора образа + pop bc ;номер следующего образа + inc c + djnz x2D85 +;установка сигнатур каталога + ld (hl),#00 + ld hl,#AA54 ;сигнатура каталога образов + ld (xEBF5+#3FE),hl + ld hl,#5254 ;дополнитьельная сигнатура каталога образов + ld (xEBF5+#3FC),hl + + + ld hl,xE8A9 ;дескриптор подраздела + ld de,#0001 + add hl,de ;дескриптор подраздела+1 + call x300E ;загрузка числа в регистры из памяти + ;dehl - LBA адрес начала подраздела + rst #30 + dw rom7_x17EF ;запись каталога образао из буфера xEBF5 + db #07 + ret + +x2DE8 db #01,#05,#00,#00 ;размер образа в секторах +x2DEC db "Disk" ;постоянная часть имени + +;АДРЕС: #2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода +;вх: hl - адрес дескриптора образа +1 +; de - LBA адрес начала данных образа +x2DF0 push hl + ld hl,xE5A9 ;очистка буфера 512b + ld de,xE5A9+1 + ld (hl),#00 + ld bc,#01FF + ldir + pop hl ;адрес дескриптора образа +1 +;создание первого (служебного) сектора образа + push hl + call x300E ;загрузка числа в регистры из памяти (hl) + ;dehl - LBA адрес начала образа + rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + pop hl +;формирование данных в описателе текущего дисковода (а нахрена???) +; LBA адрес начала образа + push hl ;адрес дескриптора образа +1 + ld de,xE590+1 ;LBA адрес начала образа + call x3000 ;копирование из (hl) в (de) 4х байт +; признак образа + ld a,#01 + ld (xE590),a ;признак образа + ld a,#E0 + ld (xFFCE),a ;для дисковода C + pop hl +; размер образа + push hl ;адрес дескриптора образа +1 + ld de,xE590+5 + call x3000 ;копирование из (hl) в (de) 4х байт + ld hl,x2DE8 ;адрес размера образа + ex de,hl + call x3052 ;сложение двух 4х байтных чисел + ld hl,xE590+5 + call x302A ;декремент (hl)=(hl)-1 + pop hl + ret + +;АДРЕС: #2E30 расчет количества образов исходя из размеров подраздела +;вх: hl - адрес дескриптора подраздела +;вых: bc - количество образов +x2E30 push hl + call x3005 ;загрузка числа в регистры из памяти +6 байт к адресу hl + ld bc,xE9E7 ;dehl - размер подраздела + call x301C ;загрузка числа из регистров в память + ex de,hl ;hl=xE9E7 + call x302A ;декремент (hl)=(hl)-1 + call x302A ;декремент (hl)=(hl)-1 -2 сектора + call x300E ;загрузка числа в регистры из памяти (hl) + exx + ld bc,#0501 ;размер образа в секторах + rst #30 + dw rom7_x0F5D ;деление de'hl'=de'hl'/bc + db #07 + exx + ld bc,#0033 ;определение количества образов в подразделе + ld a,e + or d + or h + jr nz,x2E5B + ld a,l + cp #34 + jr nc,x2E5B + ld c,a +x2E5B pop hl + ret + +;АДРЕС: #2E5D сформируем пустой сектор MBR в буфере xE5A9 +x2E5D ld hl,xE5A9+#1BE ;начало списка разделов + ld bc,#0041 + ld de,xE5A9+#1BF + ld (hl),#00 + ldir + ld hl,#AA55 + ld (xE5A9+#1FE),hl ;запишем сигнатуру + ret + +;АДРЕС: #2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS +x2E71 ld hl,xEBF5 + ld bc,#03FF + ld de,xEBF5+#01 + ld (hl),#00 + ldir + ld hl,#AA54 + ld (xEBF5+#3FE),hl ;xEFF3 + ret + +;АДРЕС: #2E85 ввод имени подраздела +;вх: hl - настройки окна ввода строки +;вых: cy=1 отмена ввода строки +; de - адрес введенной строки +x2E85 ld (xE9EF),hl + set 5,(iy+#0E) + call x0CCA ;очистка буфера для ввода строки + rst #30 ;можно и напрямую вызвать + dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора + db #05 + rst #30 ;можно и напрямую вызвать + dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) + db #05 +x2E97 ld de,xDE17 ;буфер для ввода строки + ret nc ;строка введена +;отмена ввода + cp #03 + jr nz,x2EA1 + scf ;break/cancel + ret +x2EA1 rst #30 ;можно и напрямую вызвать + dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) + db #05 + jr x2E97 + +;АДРЕС: #2EA7 проверка введенного имени +;вх: hl - адрес начала записи в каталоге +; de - адрес введенной строки +;вых: cy=1 ошибка при проверке +; cy=0 имя корректно +x2EA7 push hl + ld bc,#000A + add hl,bc ;начало имени подраздела в дескрипторе + ld a,(xDFFE) ;код типа подраздела + ld c,a + ld b,#06 +x2EB2 ld a,(de) + cp #21 + jr nc,x2EC9 ;это допустимый символ + ld a,b + cp #06 + jr z,x2EC1 ;пустое имя + ld a,(de) + cp " " + jr c,x2EC6 ;недопустимый символ. конец имени +x2EC1 ld a,c + cp #04 + jr nz,x2F0D ;пустое имя только для BAD можно +x2EC6 ld a," " + dec de +x2EC9 inc de ;заполняем остаток пробелами + ld (hl),a + inc hl + djnz x2EB2 + pop hl ;адрес начала записи в каталоге + ld a,c + cp #04 + ret z ;если BAD подраздел +;проверка совпадения имени + push hl + ld a,(xDD89) ;количество записей в каталоге + ld b,a + ld hl,xEBF5 ;начало каталога +x2EDB ld a,(hl) + cp #FF + jr z,x2F04 ;пустая запись + pop de + push de + or a + push hl + sbc hl,de + pop hl + jr z,x2F04 ;запись, на месте которй создаем подраздел + push bc + ex de,hl + ld bc,#000A + add hl,bc + ex de,hl + push hl + add hl,bc + ld bc,#0600 ;проверка совпадения имени +x2EF5 ld a,(de) + cp (hl) + jr z,x2EFA + inc c +x2EFA inc hl + inc de + djnz x2EF5 + pop hl + ld a,c + pop bc + or a + jr z,x2F0D ;есть совпадение по имени. нельзя два одинаковых +x2F04 ld de,#0010 + add hl,de + djnz x2EDB + pop hl + or a + ret +;ошибка при проверке имени +x2F0D pop hl + scf + ret + +;АДРЕС: #2F10 выбор типа подраздела +;вх: hl - настройки окна ввода строки +; de - адрес таблицы с названиями разделов MFS +;вых: cy=1 отмена выбора +; cy=0 тип подраздела выбран +; hl - адрес сообщения с типом и названием подраздела +; a - код типа подраздела +x2F10 ld (xE9EF),hl ;настройки окна ввода строки + set 5,(iy+#0E) + push de + ld a,#64 ;сообщение: select + rst #30 ;можно и напрямую вызвать + dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора + db #05 + pop hl ;адрес таблицы с названиями разделов MFS +;выбор типа подраздела +x2F1F push hl +x2F20 xor a ;!!!нет нуля в этой таблице + cp (hl) + jr z,x2F49 +;печать типа подраздела (tr-dos/is-dos/microdos/bad) + push hl + inc hl + ld (ix+1),#01 ;координата X + set 0,(ix+7) ; + call x2BAC ;печать сообщения из hl + rst #30 + dw rom2_x2FED ;печать пробелов до правого края окна + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + res 0,(ix+7) + pop hl + cp #0D + jr z,x2F58 ;enter + cp #03 + jr nz,x2F49 ;что-то нажато + scf ;отмена создания + pop hl + ret +;обработка нажатия любой клавиши +x2F49 inc hl +x2F4A ld a,(hl) ;ищем конец сообщения + and #80 + inc hl + jr z,x2F4A + ld a,(hl) + cp #FF + jr nz,x2F20 ;если не конец блока + pop hl ;если конец блока, переход на начало блока + jr x2F1F +;выбрали тип подраздела в (hl) - тип +x2F58 ld a,(hl) + ex (sp),hl + pop hl + or a + ret + +;АДРЕС: #2F5D запрос на сохранение сектора MBR, если были изменения +x2F5D bit 6,(iy+#1C) + ret z + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + ret nz + +;АДРЕС: #2F66 формирование и запись сектора MBR +x2F66 set 5,(iy+#1C) + ld hl,x2D5D + call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) + call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 + ld de,xE5A9+#1BE ;начала дескрипторов разделов в секторе MBR + ld hl,xEBF5 ;буфер с каталогом + ld a,(xDD89) ;записей в каталоге + cp #04 + jr c,x2F82 ;допустимое значение + ld a,#04 ;можно не больше 4х +x2F82 or a + jr z,x2F8D ;разделов нет + dec a + ld bc,#0010 + ldir ;копируем дескриптор раздела + jr x2F82 ;повторим +x2F8D ld hl,#0000 ;LBA адрес (нулевой сектор) + ld e,l + ld d,h + jr x2F9E ;запись сектора из буфера xE5A9 + +;АДРЕС: #2F94 !!!не используется!!! чтение сектора в буфер xE5A9 +x2F94 rst #30 + dw rom7_x1D73 ;чтение сектора с винчестера в буфер xE5A9 + db #07 + ret nc ;нет ошибок + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;запись сектора из буфера xE5A9 +x2F9E rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + ret nc ;нет ошибок + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;АДРЕС: #2FA8 запрос на сохранение каталога MFS, если были изменения +x2FA8 bit 6,(iy+#1C) + ret z ;список разделов в буфере без изменений + call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + ret nz ;отказ от сохранения + +;АДРЕС: #2FB1 запись каталога MFS/подраздела +x2FB1 set 5,(iy+#1C) + ld hl,x2D5D + call x28C6 ;уплотнение каталога (удаление в буфере записей unused) + call x270D ;загрузка числа в регистры из памяти xE81B+8 + ;dehl - LBA адрес начала раздела MFS + rst #30 ;запись каталога MFS + dw rom7_x17EF ;запись 2х секторов из буфера xEBF5 + db #07 + jp nc,x2503 ;ошибок не было + rst #30 + dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора + db #07 + ret + +;АДРЕС: #2FCA сравнение двух чисел в памяти по адресам в de и hl +x2FCA rst #30 + dw rom7_x1035 ;сравнение двух чисел в памяти по адресам в de и hl + db #07 + ret + +;АДРЕС: #2FCF обнуление переменной xE9EB +x2FCF push hl + ld hl,#0000 + ld (xE9EB),hl + ld (xE9EB+#02),hl + pop hl + ret + +;АДРЕС: #2FDB инкремнт слова (xDD89)=(xDD89)+1 +x2FDB push hl + ld hl,(xDD89) + inc hl + ld (xDD89),hl + pop hl + ret + +;АДРЕС: #2FE5 декремент слова (xDD89)=(xDD89)-1 +x2FE5 push hl + ld hl,(xDD89) + dec hl + ld (xDD89),hl + pop hl + ret + +;АДРЕС: #2FEF умножение bc=bc*#10 +x2FEF sla c + rl b + sla c + rl b + sla c + rl b + sla c + rl b + ret + +;АДРЕС: #3000 копирование из (hl) в (de) 4х байт +x3000 rst #30 + dw rom7_x1003 ;копирование из (hl) в (de) 4х байт + db #07 + ret + +;АДРЕС: #3005 загрузка числа в регистры из памяти +6 байт к адресу hl +x3005 ld bc,#0006 + jr x300D + +;АДРЕС: #300A загрузка числа в регистры из памяти +12 байт к адресу hl +x300A ld bc,#000C +x300D add hl,bc + +;АДРЕС: #300E загрузка числа в регистры из памяти +;вх: hl - адрес откуда грузим +;вых: dehl - число +x300E push hl + pop bc + ld a,(bc) + ld l,a + inc bc + ld a,(bc) + ld h,a + inc bc + ld a,(bc) + ld e,a + inc bc + ld a,(bc) + ld d,a + ret + +;АДРЕС: #301C загрузка числа из регистров в память +;вх: dehl - число +; bc - адрес куда грузим +;вых: de - адрес куда загрузили +x301C push bc + ld a,l + ld (bc),a + inc bc + ld a,h + ld (bc),a + inc bc + ld a,e + ld (bc),a + inc bc + ld a,d + ld (bc),a + pop de + ret + +;АДРЕС: #302A декремент (hl)=(hl)-1 +x302A push hl + push de +x302C ld de,x3043 + call x3035 + pop de + pop hl + ret + +;АДРЕС: #3035 вычитание (hl)=(hl)-(de) +x3035 ex de,hl + push bc + xor a + ld b,#04 +x303A ld a,(de) + sbc a,(hl) + ld (de),a + inc hl + inc de + djnz x303A + pop bc + ret + +;для инкремента +x3043 db #01,#00,#00,#00 ;dd #01 + +;АДРЕС: #3047 инкремент числа по адресу hl +x3047 push hl + push de + ld de,x3043 + call x3052 ;сложение двух 4х байтных чисел + pop de + pop hl + ret + +;АДРЕС: #3052 сложение двух 4х байтных чисел +;вх: hl - адрес первого числа +; de - адрес второго числа +;вых: hl - сумма чисел +x3052 ex de,hl + push bc + xor a + ld b,#04 +x3057 ld a,(de) + adc a,(hl) + ld (de),a + inc hl + inc de + djnz x3057 + pop bc + ret + +;АДРЕС: #3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши +;вых: z - нажата Y +x3060 ld hl,xE0D7 ;дескриптор окна: запрос на запись MBR + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 +x3067 ld (ix+4),#18 ;высота окна + ld (ix+6),#17 ;атрибуты окна + rst #20 + db #0C ;очистка окна + db #1B,#09,#0F ;координаты печати + db "Warning!" + db #1B,#0B,#08 ;координаты печати + db "Partition will be changed." + db #1B,#0D,#0E ;координаты печати + dc "Write (Y/N)?" + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + ld (ix+6),#31 + ld (ix+4),#16 + and #DF + cp "Y" + ret + +;АДРЕС: #30B9 идентификация жесткого диска +x30B9 push ix + ld ix,xE5A9 + rst #30 + dw rom7_x1E74 ;R8DOS #22(34) идентификация жесткого диска + db #07 + pop ix + ret + +;АДРЕС: #30C6 печать окна для тестирования HDD +x30C6 call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана +x30C9 ld (ix+#01),#00 ;crd X =0 + rst #20 + dc "Press BREAK to exit. ONLY!" + rst #30 + dw rom6_x064D ;установка дескриптора окна: запрос на запись MBR + db #06 + rst #20 + db #8C ;очистка окна + ld (ix+#00),#15 ;crd Y =#15 + ret + +;АДРЕС: #30F3 печать кода ошибки +;вх: a - код ошибки (номер сообщения из блока 0) +x30F3 push af + call x310F ;печать текущих номера головки и сектора + pop bc + ld c,#00 + rst #08 + rst #20 + db #8D ;перевод строки + jr x315E + +;печать текущего номера цилиндра HDD +x30FF ld (ix+#01),#00 ;crd X =0 + rst #20 + dc "C:" + ld bc,(xE047) ;номер цилиндра + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + ret + +;печать текущих номера головки и сектора +x310F call x30FF ;печать текущего номера цилиндра HDD +x3112 rst #20 + dc " H:" + ld a,(xE049) ;номер головки + and #0F + ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #20 + dc " S:" + ld a,(xE046) ;номер сектора + ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ret + +;АДРЕС: #3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD +;вх: hl - номер байта в секторе +; c - контрольное значение байта +; b - считанное значение байта +x3135 push bc + push hl + call x310F ;печать текущих номера головки и сектора + rst #20 + dc "data bad " + pop hl + rst #30 + dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + pop bc + push bc + ld a,c + rst #30 + dw rom2_x16E3 ;печать числа a=[#00..#FF] + db #02 + rst #20 + dc ":" + pop bc + ld a,b + rst #30 + dw rom2_x16E3 ;печать числа a=[#00..#FF] + db #02 + rst #20 + db #8D ;перевод строки + +;управление выводимым листингом (опрос клавиш space, s, cs+1) +x315E rst #30 + dw rom2_x37B9 + db #02 + ret + +;АДРЕС: #3163 печать текущего номера цилиндра +x3163 call x30FF ;печать текущего номера цилиндра HDD + call x0110 ;опрос Break. cy=1 не нажата + jr c,x3183 + call x3112 ;нажата Break + rst #20 + dc "Break" +x3174 ld b,#06 ;пауза примерно 245k тактов +x3176 rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + djnz x3176 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 +x3180 jp x0EB5 ;печать текущего меню монитора +x3183 rst #20 + dc " of" + ld bc,(xDFF2) ;значение Cylinders HDD + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #30 + dw rom2_x2B10 ;печать пробела (rst #10) + db #02 + ld a,(iy+#01) + inc (iy+#01) + and #03 + ld hl,x31A6 + add a,l + ld l,a + jr nc,x31A3 + inc hl ;!!!ОШИБКА!!! должно быть inc h +x31A3 ld a,(hl) + rst #10 + ret +x31A6 db #2D,#5C,#7C,#2F ;"-\|/" индикация работы + +;АДРЕС: #31AA удаление всех разделов MBR +x31AA call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши + jr nz,x3180 ;нажата не Y. печать текущего меню монитора + ld hl,xE5A9 ;очитска буфера + ld de,xE5A9+1 + ld (hl),#00 + ld bc,#01FF + ldir + xor a + ld l,a + ld h,a + ld e,a + ld d,a + rst #30 + dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl + db #07 + jr nc,x3180 ;ошибок не было. печать текущего меню монитора + ld (ix+#00),#17 ;crd Y + ld (ix+#01),#00 ;crd X + call x30F3 ;печать кода ошибки + jr x3174 ;ждем нажатие клавиши и печать текущего меню монитора + +;АДРЕС: #31D4 неиспользуемая область +x31D4 ds #2C,#00 + +;АДРЕС: #3200 каталог ROM-disk +x3200 dc "ZxUnZip" : ds 7 :db #0E,#04 + dc "ZxZip" : ds 9 :db #39,#05 + dc "TASM_4.0" : ds 6 :db #2F,#07 + dc "SM_2.01" : ds 7 :db #36,#08 + dc "HD_Copy_1.7" : ds 3 :db #02,#0A + dc "TESTFDD" : ds 7 :db #3D,#0A + DUP 10 + ds #10 + EDUP + +;АДРЕС: #3300 ROM-disk +x3300 INCBIN "prof_roms/rom5_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM5.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom5.bat b/ProfRom_Disasm/rom5.bat new file mode 100755 index 0000000..897a2b9 --- /dev/null +++ b/ProfRom_Disasm/rom5.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom5.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom6.a80 b/ProfRom_Disasm/rom6.a80 new file mode 100755 index 0000000..d01ca46 --- /dev/null +++ b/ProfRom_Disasm/rom6.a80 @@ -0,0 +1,2902 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #1200 + +;#0000 *NOT USED* (#08 байт) +;#0008 rst #08 печать сообщения по номеру в BC +;#000D *NOT USED* (#03 байта) +;#0010 rst #10 печать символа из A +;#0015 *NOT USED* (#03 байт) +;#0018 вызов процедуры из rom7 (rst #18: dw addr) +;#001B *NOT USED* (ld a,#01) +;#001E *NOT USED* (#02 байта) +;#0020 rst #20 печать строки +;#0025 *NOT USED* (#0B байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#003B *NOT USED* (#2B байт) +;#0066 обработка NMI (зависание с желто-черным бордюром) +;#006F *NOT USED* (#01 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;#00AA *NOT USED* (#55 байт) +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +;#0110 Таблица переходов ПрофПЗУ +;#0114 обработчик прерываний im 1/2 +;#0149 печать строки (rst #20) +;#0156 печать информации о ловушке +;#01E4 установка новой ловушки в отладчике +;#0249 вывод каталога текущего дисковода (на экран/принтер) +;#03A1 печать числа в десятичной системе счисления +;#03A9 форматирование/проверка текущей дискеты +;#04E5 быстрое форматирование текущей дискеты (очистка каталога) +;#064D установка дескриптора окна: запрос на запись MBR +;#0655 hl=hl+5: hl=de (z равны) +;#0667 вызоф функции R8DOS +;#066C установка код дисковой ошибки в переменной для печати числа +;#0675 зануление #100 байт буфера xE5A9 +;#0678 зануление #100 байт памяти с hl +;#067F сохранение экрана пользователя на диск +;#06A6 печать сообщения об ошибке и продолжение работы монитора +;#06AD ввод текстовой строки внизу экрана +;#06С1 печать текущего меню монитора (без возврата) +;не используется #06C5 вывод в порт #FE содержимое ячейки (#7530) +;#06CB таблица соответствий нажатой клавиши печатному символу +;#06F2 таблица кодов клавиш cs+1+клавиша +;#0719 таблица кодов клавиш ss+клавиша +;#0740 таблица кодов клавиш cs+цифра +;#074A ожидание действий пользователя (опрос управления, вывод часов) +;#0773 проверка наличия нажатых клавиш в буфере клавиатуры +;#0777 проверка наличия нажатых клавиш в буфере клавиатуры +;#0780 проверка переполнения буфера клавиатуры +;#078B сброс буфера клавиатуры +;#0792 опрос клавиатуры и установка кода нажатой клавиши в буфере +;#07B2 опрос клавиатуры и установка кода нажатой клавиши +;#0845 опрос клавиатуры +;#086A определение кода нажатой клавиши/комбинации клавиш +;#093F RST #08:db #8B загрузка zs-snap с диска +;#096D копирование активного экрана пользователя в #4000 +;#0972 печать текущего меню монитора (без возврата) +;#0976 загрузка zs-snap (S. load ... snap) +;#097E сохранение zs-snap (S. save ... snap) +;#0B71 расчет начала битовой карты параграфов заданной страницы +;#0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) +;#0D59 включение режима 48k only +;#0D60 установка п/п jp #addr по адресу xE338 +;#0D6D установка/восстановление параметров заголовка zs-snap +;#0E3B загрузка из ROM-disk +;#0EE0 загрузка блока из ROM-disk +;#0EE6 загрузка блока из ROM-disk +;#0F08 загрузка страницы из ROM-disk в память #8000 +;не используется #0F4D заполнение области памяти [#4000..#7FFF] пользователя +;#0F60 запаковка блока +;#1103 сложение hl=hl+a +;#1108 распаковка блока +;#11AF NOT USED +;#1200 ROM-disk +;#4000 + + + +;АДРЕС: #0000 *NOT USED* (#08 байт) +x0000 ds #08 + +;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC +x0008 rst #30 + dw rom5_x11CD ;печать сообщения по номеру в BC + db #05 + ret + +;АДРЕС: #000D *NOT USED* (#03 байта) +x000D ds #03 + +;АДРЕС: #0010 rst #10 печать символа из A +x0010 rst #30 + dw rom2_x2B12 ;печать символа (rst #10) + db #02 + ret + +;АДРЕС: #0015 *NOT USED* (#03 байт) +x0015 ds #03 + +;АДРЕС: #0018 вызов процедуры из rom7 (rst #18: dw addr) +x0018 jp xE41B + +;АДРЕС: #001B *NOT USED* (ld a,#01) +x001B ld a,#01 + ret + +;АДРЕС: #001E *NOT USED* (#02 байта) +x001E ds #02 + +;АДРЕС: #0020 rst #20 печать строки +x0020 ex (sp),hl + push af + jp x0149 + +;АДРЕС: #0025 *NOT USED* (#0B байт) +x0025 ds #0B + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp xE3D3 + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 jp x0114 + +;АДРЕС: #003B *NOT USED* (#2B байт) +x003B ds #2B + +;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) +x0066 ld a,#06 + out (#FE),a + xor a + out (#FE),a + jr x0066 + +;АДРЕС: #006F *NOT USED* (#01 байт) +x006F ds #01 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) + db #40-ROMdisk/#100;количество свободных секторов в странице + db #00 ;смещение до начала каталога + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#55 байт) +x00AA ds #55 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0114 + +;АДРЕС: #0101 номер текущего rom +x0101 db #06 + +;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) +x0102 ds #0E + +;АДРЕС: #0110 Таблица переходов ПрофПЗУ +x0110 db #0C,#00,#08,#04 + +;АДРЕС: #0114 обработчик прерываний im 1/2 +x0114 push af + push hl + push de + push bc + ld ix,(xE3B7) ;адрес дескриптора текущего окна + call x0792 ;опрос клавиатуры и установка кода нажатой клавиши в буфере + rst #30 + dw rom5_x0176 ;восстановление экрана под курсором мыши + db #05 + rst #30 + dw rom2_x28F6 ;мигание текстового курсора в строке ввода + db #02 + push ix ;адрес дескриптора текущего окна + rst #30 + dw rom5_x011C ;опрос манипуляторов и печать курсора + db #05 + call c,x07A0 ;помещение кода нажатой кнопки джойстика/мыши в буфер клавиатуры + bit 6,(iy+#1A) ;чтение времени из CMOS, если возможно + jr z,x0140 ;CMOS отсутствует + bit 3,(iy+#27) + jr z,x0140 ;индикация времени выключена + rst #30 + dw rom7_x1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS + db #07 +x0140 pop ix + pop bc + pop de + pop hl + pop af + ei + reti + +;АДРЕС: #0149 печать строки (rst #20) +x0149 ld a,(hl) + rst #30 + dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) + db #02 + and #80 + inc hl + jr z,x0149 + pop af + ex (sp),hl + ret + +;АДРЕС: #0156 печать информации о ловушке +;вх: hl - адрес ловушки +; d - количество ловушек+1 +; e - номер текущей ловушки +;вых: hl - адрес следующей ловушки +x0156 ld c,e + ld b,#00 + push de +;печать номера ловушки + ld (iy+#08)," " + ld (iy+#07),#02 ;минимум разрядов в числе при переводе в ASCII + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + pop de + rst #20 + dc " " + push hl + bit 6,(hl) + jr nz,x0174 +;ловушка не задана + ld bc,#2900 ;сообщение: *** undefined + rst #08 ;печать сообщения + jr x01D7 ;следующая ловушка +;ловушка задана +x0174 push de + ld b,#02 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 +; печать адреса ловушки + rst #20 + dc "#" + push hl + inc hl + ld e,(hl) + push de + inc hl + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + rst #30 + dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] + db #02 + pop de + pop hl +; печать номера страницы ловушки + ld b,#04 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + ld a,e + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 +; печать типа ловушки + ld b,#04 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + ld a,(hl) + and #03 + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 +; состояние ловушка (активна/неактивна) + ld b,#03 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + bit 7,(hl) + rst #30 + dw rom2_x3201 ;печать ON/OFF от флага nz-ON/z-OFF + db #02 +; начальное значение счетчика проходов по ловушке + ld de,#0005 + add hl,de + ld c,(hl) + inc hl + ld b,(hl) + inc hl + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 +; текущее значение счетчика проходов + ld c,(hl) + inc hl + ld b,(hl) + inc hl + rst #30 + dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом + db #02 +; наличие (+) или отсутствие (-) программы для анализатора + ld b,#02 + rst #30 + dw rom2_x15F3 ;печать нескольких пробелов (в B) + db #02 + pop de + ld a,e + rst #30 + dw rom2_x3210 ;определение адреса ловушки + db #02 + ld a,"-" + jr z,x01D6 + ld a,"+" +x01D6 rst #10 +;адрес следующей ловушки +x01D7 pop hl + ld de,#000B + add hl,de + or a + ret + +;выход в отладчик +x01DE ld a,#0A ;сообщение: too few operands +x01E0 rst #30 + dw rom2_x0B06 ;ввод и обработка команды отладчика + db #02 ;без возврата + +;АДРЕС: #01E4 установка новой ловушки в отладчике +;вх: ix - адрес ловушки +; hl - тип ловушки +; bc - адрес установки ловушки +; a - количество операндов [0..5] +; z - ловушка не задана +x01E4 push ix + ld de,xE585+#01 + ex de,hl +;проверка валидности типа ловушки + push af + ld a,e + and #FC + or d + ld a,#24 ;сообщение: invalid type breackpoint + jr nz,x01E0 ;возврат в отладчик + pop af +;проверка количества параметров + cp #04 + jr z,x0213 ;в текущую страницу + jr c,x01DE ;мало параметров. выход в отладчик + cp #06 + ld a,#0B ;сообщение: too many operands + jr nc,x01E0 ;много параметров. выход в отладчик +;ставим страницу + push hl + ld hl,(xDD99+#08) ;номер страницы + ld a,l + and #F0 + or h + ld a,#18 ;сообщение: invalid bank RAM + jr nz,x01E0 ;неверный номер страницы. выход в отладчик + ld a,l + pop hl + ld (hl),a + set 5,e + jr x0218 +x0213 rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + ld (hl),a +;установка адреса ловушки +x0218 bit 0,e ;e - тип ловушки ???ВОЗМОЖНО ОШИБКА??? + inc hl + jr nz,x0224 ;активная после выполнения + ld a,b + and #C0 + ld a,#25 ;сообщение: bad address breackpoint + jr z,x01E0 ;в ПЗУ ставить нельзя. выход в отладчик +x0224 ld (hl),c + inc hl + ld (hl),b + inc hl + inc hl +;установка количества проходов + ld bc,(xDD99+#06) ;количество проходов по ловушке до ее активизации + ld (hl),c + inc hl + ld (hl),b + inc hl + ld (hl),c + inc hl + ld (hl),b + inc hl + xor a + ld (hl),a + inc hl + ld (hl),a +;установка типа ловушки + ld hl,xE585 + ld a,e + or #C0 + ld (hl),a +;копирование ловушки из временного буфера и выход в отладчик + pop de + ld bc,#000B + ldir + ld a,#81 ;сообщение: enter command + ret + +;АДРЕС: #0249 вывод каталога текущего дисковода (на экран/принтер) +x0249 rst #30 + dw rom2_x3A95 ;подготовка переменных к выводу на экран/принтер + db #02 + ld (iy+#08),#20 + ld hl,(xFFD0) + push hl + rst #30 + dw rom7_x107B ;инициализация дисковода и настройка на дискету + db #07 + jp c,x0382 ;ошибка чтения/записи + push bc + ld bc,#4B00 ;сообщение: disk + rst #08 + ld a,(xFFCA) + add a,"A" + rst #10 ;печать буквы дисковода + rst #20 + dc ':"' +; печать имени диска + ld hl,xE5A9+#F5 + ld b,#08 + rst #30 + dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? + db #02 + rst #20 + dc '", ' +; печать времени и даты + ld d,#DA ;%11011010 + rst #30 + dw rom5_x1AA6 ;читаем время в строку в формате ASCII + db #05 + rst #20 + dc " " + ld d,#20 + rst #30 + dw rom5_x1B18 ;читаем дату в строку в формате ASCII + db #05 + rst #20 + db #8D + pop af ;a - код, определяющий тип дискеты в дисководе + push af +; печать количества дорожек + bit 5,a + ld b,#39 + jr z,x0290 ;40 дорожек на дискете + inc b +x0290 ld c,#01 ;сообщение: 40/80 + rst #08 + ld bc,#3801 ;сообщение: track + rst #08 +; печать количества сторон + pop af + rlca + ld b,#3C + jr nc,x029E + inc b ;сообщение: one/double +x029E ld c,#01 + rst #08 + ld bc,#3B01 ;сообщение: side + rst #08 +; печать идентификационного кода и типа дискеты + rst #20 + dc "(" + ld a,(xE5A9+#E7) ;Идентификационный код TR-DOS (#10) + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#E3) ;Тип дискеты + call x0396 ;печать числа в шестнадцатиричной системе счисления +; печать кол-ва файлов, свободного места + rst #20 + db ")",#0D + dc "File" + ld a,(xE5A9+#E4) ;Количество файлов на дискете + call x03A1 ;печать числа в десятичной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#F4) ;Количество удаленных файлов + call x03A1 ;печать числа в десятичной системе счисления + rst #20 + dc ", free" + ld bc,(xE5A9+#E5) ;Количество свободных секторов + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + rst #20 + dc " (" + ld a,(xE5A9+#E1) ;Номер первого незанятого сектора на дискете + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + dc "/" + ld a,(xE5A9+#E2) ;Номер дорожки первого незанятого сектора + call x0396 ;печать числа в шестнадцатиричной системе счисления + rst #20 + db ")",#0D,#8D +;печать списка файлов на диске (одна страница не более 16 имён) +x02EE ld b,#10 +x02F0 push bc + rst #30 + dw rom7_x1166 ;загрузка очередного дескриптора файла в буфер + db #07 + pop bc + jp c,x0382 ;ошибка чтения + ld a,(hl) + or a + jp z,x037B ;больше нет файлов + push bc + dec a + jr nz,x0312 ;это не удаленнй файл +; печать первого сивола удаленного файла + inc hl + bit 4,(iy+#09) + ld a,#82 + jr z,x030D ;печать на экран + ld a,"?" +x030D rst #10 + ld b,#07 + jr x0314 +; печать имени файла +x0312 ld b,#08 +x0314 rst #30 + dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? + db #02 +; печать типа файла + rst #20 + dc " <" + ld a,(hl) + inc hl + rst #10 + rst #20 + dc ">" +; печать стартового адреса и длины файла + ld b,#02 +x0322 push bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + push hl + rst #30 + dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом + db #02 + pop hl + pop bc + djnz x0322 + rst #20 + dc " " +; печать размера в секторах + ld a,(hl) + inc hl + push hl + call x03A1 ;печать числа в десятичной системе счисления + pop hl + ld a,#1E + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +; печать номера первого сектора и дорожки + ld b,#02 +x0341 push bc + rst #20 + dc " " + ld a,(hl) + inc hl + push hl + call x0396 ;печать числа в шестнадцатиричной системе счисления + pop hl + pop bc + djnz x0341 + rst #20 + db #8D + pop bc + djnz x02F0 + rst #30 + dw rom2_x35D3 ;сравнение ix=xE075 + db #02 +x0357 jr nz,x02EE ;продолжение вывода на принтер +; одидание нажатия клавиши для продолжения печати + rst #20 + dc "More..." + ld b,(ix+#00) + push bc + rst #30 + dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них + db #05 + pop bc + ld (ix+#00),b ;crd Y + ld (ix+#01),#00 ;crd X + cp #03 + jr nz,x0357 ;продолжаем вывод + ld a,#0A ;прерываем. break/cancel + rst #30 + dw rom2_x2FF1 ;печать пробелов до заданной координаты X + db #02 +;больше нет файлов +x037B rst #20 + db #0D + dc "END" + jr x0387 +;ошибка чтения/записи +x0382 ld b,a + call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа + rst #08 +x0387 res 4,(iy+#09) + pop hl + ld (xFFD0),hl +x038F rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + jp x074A ;ожидание действий пользователя (опрос управления, вывод часов) + +;печать числа в шестнадцатиричной системе счисления +;вх: a - число +x0396 ld b,#00 + ld c,a + ld de,#1023 ;de - делитель для выделения разряда числа/код префикса + rst #30 + dw rom2_x162C ;печать числа в заданной системе счисления + db #02 + ret + +;АДРЕС: #03A1 печать числа в десятичной системе счисления +;вх: a - число +x03A1 ld c,a + ld b,#00 + rst #30 + dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом + db #02 + ret + +;АДРЕС: #03A9 форматирование/проверка текущей дискеты +x03A9 call x060E ;предложение начать работу с диском (Insert disk, press Y key) + ld d,#27 ;39 + bit 5,a + jr z,x03B4 ;дискета на 40 дорожек + ld d,#4F ;79 +x03B4 ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld e,#01 + rlca + jr c,x03C1 ;двусторонняя +x03BF ld e,#00 +x03C1 push de + ld (ix+#01),#00 ;crd X + rst #30 + dw rom2_x2A85 ;очистка знакоместной строки по координатам курсора + db #02 + pop bc + push bc + ld (iy+#07),#01 ;минимум разрядов в числе при переводе в ASCII + ld c,b + ld b,#00 ;номер дорожки + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + rst #20 + dc "/" + pop bc + push bc + ld b,#00 ;номер стороны + rst #30 + dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + call x05CE ;определение количества секторов на дорожке +;печать графического отображения текущей дорожки + ld b,a ;количество секторов на дорожке + ld (ix+#01),#05 ;crd X + ld (ix+#0A),#08 ;размер символов в пикселях +x03ED push bc + ld a,#10 + rst #30 + dw rom2_x2800 ;печать символа в окне + db #02 + pop bc + djnz x03ED + ld (ix+#0A),#06 ;размер символов в пикселях + rst #20 + db #8D + bit 7,(iy+#13) + jr z,x0411 ;проверка дискеты +;форматирование дискеты + rst #20 + dc "Formating." + call x05A2 ;печать количества отфрматированных/сбойных секторов +x0411 pop de + push de + ld a,e + ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D + call x0667 ;вызов функции R8DOS + jr c,x047B ;ошибка чтения/записи + call x05CE ;определение количества секторов на дорожке + pop de +;формирование таблицы секторов с учётом interleaving + ld c,#00 + ld hl,xE5A9 + push hl +x0425 ld (hl),#00 + inc hl + ld (hl),d + inc hl + ld (hl),e + inc hl + inc c + ld (hl),#00 + inc hl + ld (hl),b + inc hl + cp c + jr nz,x0425 + ld (hl),#FE + ex de,hl + push hl + ld c,#01 +x043B ld hl,xE5A9+#03 + ld b,#00 +x0440 ld a,(hl) + or a + jr nz,x0449 + ld (hl),c + inc c + inc b + jr x0450 +x0449 call x0655 ;hl=hl+5: hl=de (z равны) + jr nc,x045D ;hl>=de + jr x0440 +x0450 ld a,(iy+#18) ;значение interleaving 1..26 +x0453 call x0655 ;hl=hl+5: hl=de (z равны) + jr nc,x045D + dec a + jr nz,x0453 + jr x0440 +x045D ld a,b + or a + jr nz,x043B + pop de + pop hl +;форматирование дорожки + push de + push hl + ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + pop hl + ld b,a + ld de,#5A85 + push de + ld c,#0B ;форматирование дорожки + or a + bit 7,(iy+#13) + call nz,x0667 ;вызов функции R8DOS +;проверка дорожки +x047B jp c,x058D ;ошибка чтения/записи + ld (ix+#01),#00 ;crd X + rst #20 + dc "Checking. " + call x05A2 ;печать количества проверенных/сбойных секторов + ld de,#0000 + ld hl,xE5A9 + push hl + ld c,#0C ;чтение дорожки + call x0667 ;вызов функции R8DOS + call c,x0587 ;ошибка чтения дорожки + call x05CE ;определение количества секторов на дорожке + pop hl + exx + pop hl + exx + ld de,(xDFFE) + ld bc,(xE000) +x04AE ld a,(hl) + cp #FE + jr z,x04C7 ;конец таблицы секторов + inc de + or a + ld a,#34 ;paper 6, ink 4 + jr z,x04BC ;сектор без ошибок + ld a,#32 ;paper 6, ink 2 + inc bc +x04BC exx + ld (hl),a + inc hl + exx + inc hl + inc hl + inc hl + inc hl + inc hl + jr x04AE +;следующая сторона/дорожка +x04C7 ld (xDFFE),de + ld (xE000),bc + ld (ix+#01),#0A ;crd X + call x05AA ;печать количества отформатированных/сбойных секторов + pop de + ld a,e + or a + jp nz,x03BF ;следующая сторона + dec d + ld a,d + cp #FF + jp nz,x03B4 ;следующая дорожка + jr x051B ;завершение форматирования/проверки дискеты + +;АДРЕС: #04E5 быстрое форматирование текущей дискеты (очистка каталога) +x04E5 call x060E ;предложение начать работу с диском (Insert disk, press Y key) + ld hl,#0A00 + bit 7,a + jr nz,x04F3 ;двухсторонняя дискета + srl h + rr l +x04F3 bit 5,a + jr nz,x04FB ;80 дорожек + srl h + rr l +x04FB ld (xDFFE),hl ;кол-во секторов + ld hl,#0000 + ld (xE000),hl + and #43 + cp #01 + jr nz,x0573 ;диск не tr-dos +; очищаем нулевую дорожку + call x0675 ;зануление #100 байт буфера xE5A9 + ld e,a +x050E push de + call x065F ;запись сектора из буфера xE5A9 + jp c,x058D ;ошибка чтения/записи + pop de + inc e + bit 4,e + jr z,x050E + +;завершение форматирования/проверки дискеты +x051B ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld e,a + and #43 ;%01000011 + cp #01 + jr nz,x0573 ;формат не tr-dos +; стандартная дискета tr-dos (формирование служебного сектора) + bit 7,(iy+#13) + jr z,x0573 ;провера дискеты + call x0675 ;зануление #100 байт буфера xE5A9 + ld a,#16 + bit 7,e + jr nz,x0539 ;двустронняя дискета + ld a,#18 +x0539 bit 5,e + jr nz,x053F ;80 дорожек на диске + or #01 +x053F ld (xE5A9+#E3),a ;Тип дискеты + ld hl,(xDFFE) + ld de,-#0010 + add hl,de + ld (xE5A9+#DF),hl + ld (xE5A9+#E5),hl ;Количество свободных секторов + ld hl,(xE000) + ld (xE5A9+#DD),hl + ld a,#10 + ld (xE5A9+#E7),a ;Идентификационный код TR-DOS (#10) + ld a,#01 + ld (xE5A9+#E2),a ;Номер дорожки первого незанятого сектора +; ввод имени дискеты + ld hl,xE5A9+#F5 + call x05E8 ;ввод имени диска + ld c,#07 ;идентификация диска + call x0667 ;вызов функции R8DOS + jr c,x058D ;ошибки чтения/записи + ld e,#08 + call x065F ;запись сектора из буфера xE5A9 + jr c,x058D ;ошибки чтения/записи +x0573 call x064D ;установка дескриптора окна + res 4,(iy+#09) ;вывод на экран + rst #20 + db #0D + dc "Complete" + jp x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) + +;ошибка чтения дорожки +x0587 ld a,(xFFDD) ;код ошибки дискового интерпретатора + cp #14 ;были ошибки при чтении/записи дорожки (функции 12, 13) + ret z + +;ошибка чтения/записи +x058D ld b,#46 ;сообщение: stop format _число_ + call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа + rst #08 + call x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) + rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;без возврата + +;перевод строки и установка кода дисковой ошибки в переменной для печати числа +x059A rst #20 + db #8D + ld c,#01 + call x066C ;установка кода дисковой ошибки в переменной для печати числа + ret + +;печать количества отфрматированных/сбойных секторов +x05A2 ld de,(xDFFE) + ld bc,(xE000) +x05AA push hl + push bc + push de + rst #20 + dc " Total " + pop bc + pop de + push bc + push de + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + rst #20 + dc "/ Bad " + pop bc + push bc + rst #30 + dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами + db #02 + pop bc + pop de + pop hl + ret + +;определение количества секторов на дорожке +;вых: a - количество секторов на дорожке +; b - код размера сектора +x05CE ld bc,#0010 ;чтение спецификации дискеты + call x0667 ;вызов функции R8DOS + ld b,a + and #03 ;размер сектора в байтах 128/256/512/1024 + push af + bit 6,b + jr nz,x05DE ;метод записи MFM + add a,#04 +x05DE ld d,#00 + ld e,a + pop bc + ld hl,(xFFC8) ;адрес таблицы с количеством секторов на дорожке + add hl,de + ld a,(hl) + ret + +;ввод имени диска +;вых: cy=1 ввод отменен +x05E8 push hl + ld b,#08 +x05EB ld (hl)," " + inc hl + djnz x05EB + ld a,#89 + call x06AD ;ввод текстовой строки внизу экрана + jr c,x060B ;ввод отменен + jr z,x060B ;пустая строка + pop de + push de + ld bc,#0008 +x05FE ld a,(hl) + cp " " + jr c,x0608 + ldi + jp pe,x05FE +x0608 or a + pop hl + ret +x060B scf + pop hl + ret + +;предложение начать работу с диском (Insert disk, press Y key) +x060E call x064D ;установка дескриптора окна + rst #20 + db #8C ;очистка окна + rst #20 + db #1B,#00,#0A ;установка координат + dc "Insert disk, press Y key" + rst #30 + dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них + db #05 + pop hl + jr c,x063A + cp #0D + jr z,x063F ;выбор курсором. начинаем работу +x063A and #5F + cp "Y" + ret nz ;нажата другая клавиша +x063F push hl + rst #30 + dw rom7_x1065 ;инициализация дисковода + db #07 + ld (ix+#00),#15 ;crd Y + ld bc,#0010 ;чтение спецификации дискеты + jr x0667 ;вызов функции R8DOS + +;АДРЕС: #064D установка дескриптора окна: запрос на запись MBR +;вых: ix - адрес дескриптора окна запрос на запись MBR +x064D ld hl,xE0D7 + rst #30 + dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl + db #02 + ret + +;АДРЕС: #0655 hl=hl+5: hl=de (z равны) +x0655 inc hl + inc hl + inc hl + inc hl + inc hl + or a + sbc hl,de + add hl,de + ret + +;запись сектора из буфера xE5A9 +x065F ld hl,xE5A9 + ld d,#00 + ld bc,#0106 + +;АДРЕС: #0667 вызоф функции R8DOS +x0667 rst #30 + dw rom7_x0229 ;вызов функции R8DOS + db #07 + ret + +;АДРЕС: #066C установка кода дисковой ошибки в переменной для печати числа +x066C ld hl,(xFFDD) ;l - код ошибки дискового интерпретатора + ld h,#00 + ld (xDDA7),hl ;установим код ошибки в переменной для печати числа + ret + +;АДРЕС: #0675 зануление #100 байт буфера xE5A9 +x0675 ld hl,xE5A9 + +;АДРЕС: #0678 зануление #100 байт памяти с hl +;вх: hl - адрес начала памяти +x0678 xor a + ld b,a +x067A ld (hl),a + inc hl + djnz x067A + ret + +;АДРЕС: #067F сохранение экрана пользователя на диск +x067F ld a,#89 ;сообщение: enter name + call x06AD ;ввод текстовой строки внизу экрана + jr c,x06C1 ;ввод отменен + jr z,x06C1 ;пустая строка + ld b,#02 ;файл для записи + rst #30 + dw rom7_x11D4 ;открытие файла для внутренних нужд + db #07 + jr c,x06A6 ;ошибка открытия файла + rst #30 + dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 + db #02 + ld hl,#4000 + ld bc,#1B00 + rst #30 + dw rom2_x3107 ;запись области памяти в файл + db #02 + jr c,x06A6 ;ошибки записи + rst #30 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + db #07 + jr nc,x06C1 ;ошибокнет. выход + +;АДРЕС: #06A6 печать сообщения об ошибке и продолжение работы монитора +;вх: a - номер сообщения из блока 0 +x06A6 call x066C ;установка кода дисковой ошибки в переменной для печати числа +x06A9 rst #30 + dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора + db #02 ;(без возврата) + +;АДРЕС: #06AD ввод текстовой строки внизу экрана +;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 +; 6-0,a - номер сообщения из блока 0 +;вых: cy=1 ввод отменен +; cy=0 строка введена +; z - введена пустая строка +x06AD rst #30 + dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана + db #05 + jr nc,x06BA ;строка введена + cp #03 ;break/cancel ? + scf + ret z ;отмена ввода + xor a + jr x06AD ;продолжение ввода строки +x06BA rst #30 + dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа + db #02 + scf + ccf + ret + +;АДРЕС: #06С1 печать текущего меню монитора (без возврата) +x06C1 rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;переход без возврата + +;АДРЕС: #06C5 вывод в порт #FE содержимое ячейки (#7530) +x06C5 ld a,(#7530) + out (#FE),a + ret + +;АДРЕС: #06CB таблица соответствий нажатой клавиши печатному символу +x06CB db "ZXCV" + db "ASDFG" + db "QWERT" + db "12345" + db "09876" + db "POIUY" + db #0D,"LKJH" + db " ",#80,"MNB" + +;АДРЕС: #06F2 таблица кодов клавиш cs+1+клавиша +x06F2 db #1A,#18,#03,#16 + db #01,#13,#04,#06,#07 + db #11,#17,#05,#12,#14 + db #FF,#FF,#FF,#FF,#FF + db #FF,#FF,#FF,#FF,#FF + db #10,#0F,#09,#15,#19 + db #FF,#0C,#0B,#0A,#08 + db #00,#FF,#0D,#0E,#02 + +;АДРЕС: #0719 таблица кодов клавиш ss+клавиша (ss+cs =#03) +x0719 db ":`?/" + db #8A,#8B,#8E,#8C,#8D + db #1C,#1D,#1E,"<>" + db "!@#$%" + db "_)('&" + db #22,";",#1F,"][" + db #FF,"=+-^" + db #82," .,*" + +;АДРЕС: #0740 таблица кодов клавиш cs+цифра +x0740 db #FF ;cs+1 + db #81 ;cs+2 + db #87 ;cs+3 + db #88 ;cs+4 + db #85 ;cs+5 + db #7F ;cs+0 + db #89 ;cs+9 + db #83 ;cs+8 + db #84 ;cs+7 + db #86 ;cs+6 + +;АДРЕС: #074A ожидание действий пользователя (опрос управления, вывод часов) +;вых: a - код нажатой клавиши +; +x074A call x078B ;сброс буфера клавиатуры +x074D ld hl,xE02E ;печать времени и даты + bit 0,(hl) + jr z,x075B + di + res 0,(hl) + rst #30 + dw rom5_x1A4C ;печать даты и времени в окне монитора + db #05 +x075B ei + call x0773 ;проверка наличия нажатых клавиш в буфере клавиатуры + jr z,x074D ;буфер пустой + di + ex de,hl + ld a,(de) ;читаем код клавиши из буфера + inc de + call x0780 ;проверка достижения конца буфера клавиатуры + ld (xE118),de + push af ;код клавиши + rst #30 + dw rom5_x0176 ;восстановление экрана под курсором мыши + db #05 + pop af + ret + +;АДРЕС: #0773 проверка наличия нажатых клавиш в буфере клавиатуры +;вых: z - буфер пустой +; de - очередной адрес в буфере +; hl - адрес начала буфера +; +x0773 ld de,(xE116) + +;АДРЕС: #0777 проверка наличия нажатых клавиш в буфере клавиатуры +;вх: de - адрес в буфере клавиатуры +;вых: z - буфер пустой +; hl - адрес начала буфера +; +x0777 ld hl,(xE118) + or a + push hl + sbc hl,de + pop hl + ret + +;АДРЕС: #0780 проверка переполнения буфера клавиатуры +;вх: de - очередной адрес в буфере клавиатуры +;вых: cy =0 адрес в пределах буфера +; =1 буфер переполнен. сброс буфера +; de - адрес начала буфера +; +x0780 ld hl,xE38F+#0A ;xE399 + or a + sbc hl,de + ret nc + ld de,xE38F + ret + +;АДРЕС: #078B сброс буфера клавиатуры +; +x078B ld hl,(xE118) + ld (xE116),hl + ret + +;АДРЕС: #0792 опрос клавиатуры и установка кода нажатой клавиши в буфере +; +x0792 call x07B2 ;опрос клавиатуры и установка кода нажатой клавиши + ld hl,xE005 + bit 2,(hl) + ret z ;ничего не нажато + ld a,(xE006) ;код клавиши + res 2,(hl) +x07A0 ld de,(xE116) ;помещение кода клавиши в буфер клавиатуры + ld (de),a + inc de ;нажатую клавишу в буфер клавиатуры + call x0780 ;проверка переполнения буфера клавиатуры + call x0777 ;проверка не был ли сброшен буфер + ret z ;буфер пустой + ld (xE116),de ;очередной адрес в буфере + ret + +;АДРЕС: #07B2 опрос клавиатуры и установка кода нажатой клавиши +;вых: a - код нажатой клавиши, если нажата +; +x07B2 call x0845 ;опрос клавиатуры + jr z,x07BA ;ничего не нажато + call x086A ;определение кода нажатой клавиши/комбинации клавиш +x07BA ld hl,xE005 + jr nz,x07C4 ;что-то нажато +x07BF res 0,(hl) ;автоповтор не активен +x07C1 res 1,(hl) ; + ret +x07C4 bit 0,(hl) + jr nz,x07D5 ;не первое нажатие, проверим возможность автоповтора + set 0,(hl) ;первое нажатие + ld (xE007),a + ld hl,(xE051) ;период автоповтора + ld h,l + ld (xE051),hl + ret +x07D5 ld e,a ;код клавиши + ld a,(xE007) + cp e + jr nz,x07BF ;другая клавиша, сброс счетчика автоповтора + bit 1,(hl) + jr nz,x0834 ;работает автоповтор + ld de,(xE051) ;счетчик периода автоповтора + dec d + ld (xE051),de + ret nz + set 1,(hl) ;активируем автоповтор + ld e,a ;код клавиши + ld a,(xE04E) ;антидребезговая задержка + ld (xE050),a + ld a,e +;обработка нажатой клавиши +x07F4 cp #80 + jr nz,x0804 + ld a,%01000000 ;cs+ss +x07FA xor (hl) + ld (hl),a + ld a,(xE04E) + ld (xE052),a + jr x07C1 +x0804 cp #81 + jr nz,x080C + ld a,#80 ;cs+2 + jr x07FA +x080C cp #82 + jr nz,x0817 + call x0916 ;ss+space + ld a,#00 + jr x07FA +;установка кода нажатой клавиши в переменную +x0817 bit 2,(hl) + ret nz + bit 5,(hl) + jr z,x082E ;???? возможно для ввода кириллицы + cp #40 + jr c,x082E ;a=[#00..#3F] + cp #80 + jr nc,x082E ;a=[#80..#FF] + cp #60 + jr nc,x082C ;a=[#60..#7F]+#60 + add a,#40 ;a=[#40..#5F]+#40+#60 +x082C add a,#60 +x082E ld (xE006),a ;код клавиши + set 2,(hl) + ret +x0834 ld de,(xE04F) ;счетчик автоповтора + dec d + ld (xE04F),de + ret nz ;до срабатывания автоповтора еще рано + ld d,e + ld (xE04F),de + jr x07F4 + +;АДРЕС: #0845 опрос клавиатуры +;вых: z - нажато много клавиш/не нажато ни одной +; nz - что-то нажато +; hl - адрес в буфере последней нажатой клавиши +; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4, +;соответсвие клавиш скан-кодам +;12345 67890 +;QWERT YUIOP +;ASDFG HJKLe +;cZXCV BNMss +; +;0F 10 11 12 13 18 17 16 15 14 +;0A 0B 0C 0D 0E 1D 1C 1B 1A 19 +;05 06 07 08 09 22 21 20 1F 1E +;00 01 02 03 04 27 26 25 24 23 +; +x0845 ld bc,#FEFE + ld hl,xDFEA-1 + ld de,#05FF +x084E in a,(c) + push bc + ld b,#05 +x0853 inc e + rrca + jr c,x085F ;не нажата + dec d + inc sp + inc sp + ret z + dec sp + dec sp + inc hl + ld (hl),e +x085F djnz x0853 + pop bc + sli b + jr c,x084E + ld a,d + sub #05 + ret + +;АДРЕС: #086A определение кода нажатой клавиши/комбинации клавиш +;вх: hl - адрес в буфере последней нажатой клавиши +; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4 +;вых: z - клавиша/комбинация клавиш не функциональна +; nz - на клавише/комбинации клавиш есть функция +; a - код нажатой клавиши/комбинации клавиш +; +x086A ld e,(hl) + ld a,d + sub #02 + jr z,x08AE ;нажато 3 клавиши + jr c,x088E ;нажато 4 клавиши + rra + jr c,x08C6 ;нажато 2 клавиши +;нажата 1 клавиша + ld a,e + or a + ret z ;нажата CapsShift + cp #24 + ret z ;нажата SymbolShift + ld d,#00 + ld hl,x06CB-1 ;таблица соответствий нажатой клавиши печатному символу + add hl,de + ld a,(hl) + cp #3A + ret c ;это не буква + ld hl,xE005 + bit 7,(hl) + ret nz + add a,#20 ;переводим в нижний регистр + ret +;нажато 4 клавиши +x088E ld hl,xDFEA + ld a,(hl) + or a + jr nz,x08C4 ;cs не нажата + inc hl + ld d,(hl) + inc hl + ld a,(hl) + cp #0F + jr nz,x08C4 ;cs+1 не нажата + ld a,e + sub #0F + cp d + jr nz,x08C4 +;cs+1+клавиша +x08A3 ld e,a + ld d,#00 + ld hl,x06F2-1 +x08A9 add hl,de + ld a,(hl) +;cs+цифра/ss +x08AB cp #FF ;это cs+1? + ret +;нажато 3 клавиши +x08AE ld hl,xDFEA ;буфер нажатых клавиш + ld a,(hl) + or a + jr nz,x08C4 ;cs не нажата + inc hl + ld a,(hl) + cp #0F + jr nz,x08BF ;1 не нажата + inc hl +x08BC ld a,(hl) + jr x08A3 ;cs+1+клавиша +x08BF ld a,e + cp #0F + jr z,x08BC ;cs+1+клавиша +x08C4 xor a ;неизвестная комбинация + ret +;нажато 2 клавиши +x08C6 dec hl + ld a,(hl) ;код первой клавиши + or a + jr z,x08DC ;это CapsShift + cp #24 + jr z,x08D5 ;это SymbolShift + ld a,e + ld e,(hl) + cp #24 + jr nz,x08C4 ;вторая клавиша не SymbolShift +x08D5 ld d,#00 ;ss+клавиша + ld hl,x0719-1 + jr x08A9 +; комбинация с CapsShift +x08DC ld hl,x06CB-1 + ld a,e + cp #23 + jr z,x090F ;cs+space + cp #0F + jr c,x08F2 ;cs+буква + cp #19 + jr nc,x08F2 ;cs+буква/ss/enter + ld hl,x0740 ;cs+цифра + sub #0F + ld e,a +x08F2 ld d,#00 + add hl,de + ld a,(hl) + cp #3F + ret c ;если cs+enter + cp #7F + jr z,x0909 ;cs+0 + jr nc,x08AB ;cs+цифра/ss + ld hl,xE005 ;cs+буква + bit 7,(hl) + jr z,x0909 + add a,#20 ;CapsLock включен, переводим в нижний регистр + ret +x0909 cp #80 ;cs+ss + ret nz + cp #81 ;cs+2 + ret +;нажата cs+space +x090F call x078B + ld a,#03 + jr x0909 +;нажата ss+space (???режим рисования рамок) +;hl=xE005 +x0916 bit 5,(hl) + ld a,#05 + jr z,x091E + ld a,#07 +x091E ld (xE053),a ;цвет бордюра при подаче звукового сигнала + ret + +;продолжение RST #08:db #8B загрузка zs-snap с диска +x0922 db "bootm",#00 +;вх: a - номер дисковода 0..3 +x0928 ld a,(xDD7F+#01) ;xDD80 регистр A пользователя + add a,"A" + ld (de),a + inc de + ld a,":" + ld (de),a + inc de + push hl + ld hl,x0922 + ld bc,#0006 + ldir + pop hl + jr x095B + +;АДРЕС: #093F RST #08:db #8B загрузка zs-snap с диска +;вх: +1 =#00 используем имя bootm +; a - номер дисковода +;вх: +1 ="filename",#00 - имя файла +x093F ld b,#00 + ld hl,(xDD6B) ;pc программы пользователя + ld de,xEBF5 + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + inc hl + or a + jr z,x0928 ;имя файла по умолчанию + +;читаем имя файла из памяти пользователя +x094F ld (de),a + inc de + or a + jr z,x095B + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + inc hl + djnz x094F +x095B ld (xDD6B),hl ;новый pc программы пользователя + ld hl,xEBF5 ;адрес строки с именем файла + res 6,(iy+#13) ;чтение + res 5,(iy+#0B) ;функции вызываются из монитора + ld b,#01 + jr x098D ;чтение snap + +;АДРЕС: #096D копирование активного экрана пользователя в #4000 +x096D rst #30 + dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 + db #02 + ret + +;АДРЕС: #0972 печать текущего меню монитора (без возврата) +x0972 rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора + db #05 ;переход без возврата + +;АДРЕС: #0976 загрузка zs-snap (S. load ... snap) +x0976 res 6,(iy+#13) + ld b,#01 + jr x0984 + +;АДРЕС: #097E сохранение zs-snap (S. save ... snap) +x097E set 6,(iy+#13) + ld b,#02 +x0984 push bc + ld a,#89 + call x06AD ;ввод текстовой строки внизу экрана + pop bc + jr c,x0972 ;ввод отменен +x098D rst #18 + dw rom7_x11D4 ;открытие файла для внутренних нужд R8DOS #14 + jr c,x09B4 ;ошибка открытия файла + ld l,(ix+#0E) ;ix - адрес буфера fcb + ld h,(ix+#0F) ;l - номер первого сектора файла + ld (xE7C5),hl ;h - номер первой дорожки файла + bit 6,(iy+#13) + push af + call nz,x096D ;если запись файла, копирование активного экрана пользователя в #4000 + pop af + push af + jr nz,x09AE ;запись файла + +;чтение файла + rst #18 + dw rom7_x1365 ;последовательное чтение очередного сектора из файла R8DOS #1C + jr c,x09B4 ;ошибка открытия файла + jr x09BD + +;запись файла +x09AE ld bc,#0100 ;новый указатель + rst #18 + dw rom7_x1405 ;новое значение указателя в файле R8DOS #20 +x09B4 jp c,x06A6 ;ошибка чтения/записи + ld hl,xE8A9 ;заголовок файла + call x0678 ;занулим это заголовок (#100 байт) +x09BD pop af + ld hl,xE8A9 ;заголовок файла + call x0D6D ;установка/восстановление параметров заголовка zs-snap + rst #30 + dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld a,#02 + bit 6,(iy+#13) + jr z,x09F6 ;чтение файла +;запись файла +; RAM 2 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без +; RAM 5 + ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + rst #30 + dw rom2_x0606 ;копирование страницы 5 в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 +; RAM активная страница при входе в монитор + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + rst #30 + dw rom2_x0606 ;копирование страницы пользователя в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + jr x0A2D + +;чтение файла +x09F6 set 3,(iy+#13) + call x0B71 ;расчет начала битовой карты параграфов заданной страницы + call x0D01 ;определение адреса загрузки страницы в памяти + ld a,h + sub #80 + jr z,x0A0F ;пустая страница. не загружаем + inc a + ld b,a + ld c,#00 + rst #30 ;!!! можно через rst #18 вызвать + dw rom7_x1405 ;новое значение указателя в файле R8DOS #22 + db #07 + jr c,x0A86 ;ошибка чтения +; RAM 5 +x0A0F ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 +; RAM активная при входе в монитор + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + +;проверка режима памяти 48k/128-256k +x0A2D rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + jr c,x0A86 ;ошибки чтения/записи + bit 5,(iy-#02) + call nz,x0D59 ;включение режима 48k only + jp nz,x0A9D ;режим 48k only. завершение загрузки/сохранения zs-snap +;загрузка остальных страниц + ld (ix+#07),#2F + xor a + push af + call x0B41 ;откроем следующий файл zs-snap + pop af +x0A46 push af + cp #02 + jr z,x0A8B ;ram 2 уже сохранена + cp #05 + jr z,x0A8B ;ram 5 уже сохранена + cp #08 + jr z,x0A8B ;ram 8 не сохраняем + cp #09 + jr z,x0A8B ;ram 9 не сохраняем + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld l,a + rst #30 + dw rom2_x3707 ;сравнение страницы пользователя с заданной + db #02 + jr z,x0A8B ;страница пользователя уже загружена/сохранена +; загрузка/сохранение очередной страницы + ld a,l + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + bit 6,(iy+#13) + jr z,x0A75 ;загрузка страницы + rst #30 + dw rom2_x0606 ;копирование страницы пользователя в #8000 + db #02 + call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без + jr x0A7C +x0A75 call x0BB6 ;загрузка страницы zs-snap с адреса #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 +x0A7C ld a,(xE7A9+#14) ;указатель в файле (старший байт) + cp #BE + jr c,x0A8B + rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 +x0A86 jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + call x0B41 ;откроем следующий файл zs-snap +;следующая страница +x0A8B pop af + inc a + cp #10 + jr c,x0A46 ;еще не все загружено + ld hl,(xE7A9+#13) ;указатель в файле (младший байт) + ld a,h + or e + jr z,x0A9D + rst #18 + dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 + jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + +;завершение загрузки/сохранения zs-snap +x0A9D bit 6,(iy+#13) + jr z,x0AB2 ;чтение файла +; запись заголовка zs-snap + ld hl,xE8A9 ;адрес заголовка + ld de,(xE7C5) ;номер первого сектора/дорожки файла + ld bc,#0106 + rst #18 + dw rom7_x0229 ;вызов функции R8DOS +x0AB0 jr c,x0B2E ;ошибки записи +; чтение файла +x0AB2 call x0AC8 ;загрузка RAM 2 из файла zs-snap + bit 6,(iy+#13) + ret nz ;запись zs-snap +x0ABA bit 2,(iy+#14) + ret nz ; + rst #30 + dw rom2_x013A ;выход из монитора + db #02 ;без возврата + +;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя +x0AC3 rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ret + +;загрузка RAM 2 из файла zs-snap +x0AC8 ld hl,(xE7C5) ;номер первого сектора/дорожки файла zs-snap + inc l ;следующий сектор + bit 4,l + res 4,l + jr z,x0AD3 + inc h ;следующая дорожка +x0AD3 ld (xE7C5),hl + ld a,#02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0D01 ;определение адреса загрузки страницы в память/кол-ва секторов + bit 7,(iy+#13) + jr z,x0B10 ;без компрессии +; с компрессией + ld a,(de) + ld (xE33B),a ;размер в секторах запакованной страницы + ld a,h + sub #80 + jr nz,x0AF2 ;надо что-то загрузить + call x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 + jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход +; загружаем запакованную страницу +x0AF2 ld hl,x0C50 ;процедура загрузки секторов страницы в буфер xE5A9 + call x0D60 ;установка п/п jp x0C50 по адресу xE338 + ld hl,xE5A9 ;адрес буфера откуда распаковывать + ld de,xE5A9+#200 ;первая свободная ячейка в буфере (de-hl длина запакованного блока) + exx + ld hl,#8000 ;адрес куда распаковывать + call x1108 ;загрузка и распаковка блока длиной #100 + ld hl,#4000 + or a + sbc hl,bc + jr z,x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход + jp x0BEF ;ошибка. размер распакованного блока не равен размеру страницы +; без компрессии +x0B10 push hl + ld a,h + sub #80 + jr z,x0B28 ;пустая страница +; загружаем страницу + push de + ld b,a ;количество секторов + ld hl,#8000 + ld de,(xE7C5) ;номер первого сектора/дорожки странцы zs-snap + ld c,#05 + rst #18 + dw rom7_x0229 ;вызов функции R8DOS. загрузка секторов + jp c,x0B3B ;ошибки чтения + pop de +x0B28 pop hl + call x0C0C ;распределение загруженной страницы по памяти с учетом пустых параграфов + jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход + +;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход +x0B2E push af + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + cp #02 + jr z,x0B3A ;2я страница уже сохранена + call x0AC8 ;загрузка RAM 2 из файла zs-snap +x0B3A pop af +x0B3B call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + jp x06A6 ;печать сообщения об ошибке и продолжение работы монитора + +;формирование следующего имени файла для zs-snap +x0B41 push de + push hl + ld hl,xE7A9 ;буфер fcb + ld b,#07 +x0B48 ld a,(hl) ;замена пробелов в имени файла подчерками + cp " " + jr nz,x0B4F + ld (hl),"_" +x0B4F inc hl + djnz x0B48 + inc (ix+#07) ;последний символ имени файла +1 + ld hl,#0000 + ld (xE7A9+#13),hl ;стартовый адрес + ld (xE7A9+#0C),hl ;адрес буфера dma + rst #18 + dw rom7_x11DF ;открыть файл для последующих операций с ним + ld hl,xE027 + set 3,(hl) + jr nc,x0B6E ;не было ошибок + bit 6,(hl) + jr nz,x0B2E ;ошибки при записи. восстановление RAM 2, печать сообщения и выход + res 3,(hl) +x0B6E pop hl + pop de + ret + +;АДРЕС: #0B71 расчет начала битовой карты параграфов заданной страницы +;вх: a - номер страницы +;вых: de - адрес начала битовой карты параграфов заданной страницы +x0B71 push hl + jr x0B9F + +;АДРЕС: #0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) +;вх: a - номер страницы +;вых: de - адрес начала битовой карты параграфов заданной страницы +x0B74 push hl + push ix + ld l,a + ld h,#00 + push af + rst #30 + dw rom2_x3732 ;установка страницы пользователя равной номеру страницы в L + db #02 + rst #30 + dw rom2_x3005 ;установка текущим окна: main menu + db #02 +x0B83 bit 6,(iy+#13) + ld hl,rom5_x1095 ;сообщение: Saved RAM bank_ + jr nz,x0B8F ;запись + ld hl,rom5_x10AB ;сообщение: Loaded RAM bank_ +x0B8F rst #30 + dw rom5_x1061 ;печать закодированного сообщения из hl + db #05 + pop af + push af + rst #30 + dw rom2_x16EC ;печать числа a=[#0..#F] + db #02 + rst #20 + db " " + db #82 ;восстановление атрибутов + pop af + pop ix +;a - номер страницы +x0B9F add a,a + add a,a + add a,a + ld hl,xE8A9+#40 ;xE8E9 + call x1103 ;сложение hl=hl+a + ex de,hl + pop hl + ret + +;ошибка: undefined file +x0BAB call x0AC8 ;загрузка RAM 2 из файла zs-snap + call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + ld a,#54 ;ошибка undefined file + jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора + +;загрузка страницы zs-snap с адреса #8000 +x0BB6 call x0D01 ;определение адреса загрузки страницы в память + bit 7,(iy+#13) + jr z,x0BF4 ;без компрессии +; с компрессией + ld a,(de) + ld (xE33B),a ;количество секторов для загрузки + ld a,h + sub #80 + jr nz,x0BD5 ;есть что загружать +;заполнение памяти [#8000..#BFFF] байтом в A +;вх: a - байт для заполнения +x0BC8 ld hl,#8000 + ld (hl),a + ld de,#8001 + ld bc,#3FFF + ldir + ret +;загрузка и распаковка страницы с компрессией +x0BD5 ld hl,x0C41 ;процедура загрузки секторов в буфер hl + call x0D60 ;установка п/п jp x0C41 по адресу xE338 + ld hl,xE5A9 + ld de,xE5A9+#200 + exx + ld hl,#8000 + call x1108 ;загрузка и распаковка блока длиной #100 + ld hl,#4000 + or a + sbc hl,bc + ret z ;загружена вся страница +;ошибка чтения/записи +x0BEF ld a,#55 + jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора +;загрузка страницы без компрессии +x0BF4 push hl + ld a,h + sub #80 + jr z,x0C0B ;пустая страница +; загрузка страницы + push de + bit 3,(iy+#13) + jr z,x0BAB ;ошибка: undefined file + call x0CE3 ;установка размера буфера dma + rst #18 + dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов +x0C07 jp c,x0B2E ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход + pop de +x0C0B pop hl + +;распределение загруженной страницы по памяти с учетом пустых параграфов +;вх: hl - адрес загрузки +; de - адрес битовой карты следующей страницы (для незапакованного файла) +x0C0C push hl + ex de,hl + ld c,#01 + exx + pop hl + dec hl + ld de,#BFFF +x0C16 exx + dec c + jr nz,x0C1E + ld c,#08 + dec hl + ld b,(hl) +x0C1E rlc b + exx + jr c,x0C35 ;копируем параграф на свое место +; параграф пустой. зануляем его + push hl + ld h,d + ld l,e + dec de + ld bc,#00FF + ld (hl),#00 + lddr + pop hl + ld a,d + cp #7F + ret z ;конец страницы + jr x0C16 ;следующий параграф +; копируем параграф на свое место +x0C35 xor a + sbc hl,de + add hl,de + ret z ;конец страницы + ld bc,#0100 + lddr + jr x0C16 ;следующий параграф + +;загрузка секторов в буфер hl +;вх: (xE7C5) - дорожка/сектор откуда грузить +; hl - адрес загрузки +; b - размер блока в секторах +;вых: (xE7C5) - следующие дорожка/сектор +x0C41 ld (ix+#15),l + ld (ix+#16),h + call x0C7D ;вычисление размера блока для загрузки + rst #18 + dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов + jr c,x0C07 ;ошибка чтения + ret + +;загрузка секторов в буфер hl +;вх: (xE7C5) - дорожка/сектор откуда грузить +; hl - адрес загрузки +; b - размер блока в секторах +;вых: (xE7C5) - следующие дорожка/сектор +x0C50 push hl + call x0C7D ;вычисление размера блока для загрузки + ld de,(xE7C5) ;дорожка/сектор + push de + ld a,b + and #F0 + rrca + rrca + rrca + rrca + add a,d + ld d,a + ld a,b + and #0F + add a,e + bit 4,a + jr z,x0C6B + inc d +x0C6B and #0F + ld e,a + ld (xE7C5),de ;следующие дорожка/сектор + pop de + ld c,#05 + pop hl + rst #18 + dw rom7_x0229 ;вызов функции R8DOS. загрузка блока секторов + jp c,x0B3B ;ошибка загрузки + ret + +;вычисление размера блока для загрузки +;вх: (xE33B) размер блока в секторах +; b - размер блока в секторах +;вых: (xE33B) оставшийся размер блока в секторах +; b - размер блока в секторах для загрузки +x0C7D ld hl,xE33B + ld a,(hl) + or a + jp z,x0BEF ;ошибка. нечего загружать + sub b + jr nc,x0C8A + ld b,(hl) + xor a +x0C8A ld (hl),a + ret + +;запись страницы с адреса #8000 на диск, с компрессией/без +;вх: de - адрес начала битовой карты параграфов +x0C8C bit 5,(iy+#13) + jr z,x0CD5 ;компрессия отключена +;запись с компрессией + inc de + ex de,hl + ld (xE33B),hl + xor a + ld (hl),a + ld hl,#8000 + ld bc,#4000 +x0C9F cpi + jr nz,x0CA7 ;в странице есть ненулевые байты + jp pe,x0C9F ;еще не конец + ret +; в странице есть ненулевые байты +x0CA7 ld hl,x0CED ;адрес процедуры + call x0D60 ;установка п/п jp x0CED по адресу xE338 + ld hl,xE5A9 + ld de,xE5A9+#100 + exx + ld hl,#8000 + ld e,(iy+#26) ;размер окна сжатия для снапа + ld d,l + ld b,#03 +x0CBD sla e + rl d + djnz x0CBD + ld bc,#4000 + call x0F60 ;запаковка блока +;hl - адрес запакованного блока +;bc - размер запакованного блока + ret z ;пустая страница + ld a,c + or a + jr z,x0CCF + inc b +x0CCF call x0CED ;запись запакованой страницы + dec hl + ld (hl),c ;количество байт в последнем секторе =#00 - 256 байт + ret +;компрессия отключена +;вх: de - адрес начала битовой карты параграфов +x0CD5 call x0D20 ;уплотнение памяти, за счет пустых параграфов + ret z ;страница пустая + call x0CE3 + rst #18 + dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов +x0CDF jp c,x0B2E ;ошибка + ret +;установка размера области +;вх: a - кол-во параграфов с учетом уплотнения +x0CE3 ld b,a + ld (ix+#15),#00 + ld (ix+#16),#80 + ret +;запись запакованой страницы +;вх: ix - адрес буфера fcb +; b - число записываемых секторов +; hl - адрес запакованного блока +x0CED ld (ix+#15),l + ld (ix+#16),h + push bc + rst #18 + dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов + jr c,x0CDF ;ошибка записи + pop bc + ld hl,(xE33B) ;адрес начала битовой карты параграфов + ld a,b + add a,(hl) + ld (hl),a ;количество секторов в запакованной странице + ret + +;определение адреса загрузки страницы в памяти +;вх: de - адрес битовой карты параграфов для текущей страницы +;вых: h =#80+кол-во секторов страницы (для запакованного файла) +; hl - адрес начала загрузки (для незапакованного файла) +; de - адрес битовой карты следующей страницы (для незапакованного файла) +; de - адрес ячейки с размером страницы в секторах (для запакованного файла) +x0D01 ld bc,#4001 + ld hl,#8000 + bit 7,(iy+#13) + jr z,x0D12 ;без компрессии + inc de + ld a,(de) ;количество секторов + add a,h + ld h,a + ret +x0D12 dec c + jr nz,x0D19 + ld c,#08 + ld a,(de) + inc de +x0D19 rrca + jr nc,x0D1D + inc h +x0D1D djnz x0D12 + ret + +;уплотнение памяти [#8000..#BFFF], за счет пустых параграфов +;построение битовой карты параграфов в области [#8000..#BFFF] +;вх: de - адрес начала битовой карты параграфов +;вых: a - кол-во параграфов с учетом уплотнения +; z - вся область пустая +x0D20 ld c,#08 + ex de,hl + exx + ld hl,#8000 + ld d,h + ld e,l +x0D29 xor a ;проверка параграфа на ноль + ld b,a +x0D2B cp (hl) + jr nz,x0D46 ;не пустой + inc hl + djnz x0D2B +x0D31 exx ;все #100 байт =#00 + rra ;установка бита для карты параграфов + rr b + dec c + jr nz,x0D3C + ld c,#08 ;запись байта карты параграфов + ld (hl),b + inc hl +x0D3C exx + ld a,h + cp #C0 + jr nz,x0D29 + ld a,d + sub #80 + ret +x0D46 xor a ;уплотнение памяти, за счет пустых параграфов + ld l,a + ld c,a + ld b,a + sbc hl,de + add hl,de + jr z,x0D55 + inc b + ldir +x0D52 cpl + jr x0D31 +x0D55 inc h + inc d + jr x0D52 + +;АДРЕС: #0D59 включение режима 48k only +x0D59 push af + rst #30 + dw rom2_x0665 ;включение режима 48k only + db #02 + pop af + ret + +;АДРЕС: #0D60 установка п/п jp #addr по адресу xE338 +;вх: hl - адрес п/п +x0D60 push de + ex de,hl + ld hl,xE338 + ld (hl),#C3 + inc hl + ld (hl),e + inc hl + ld (hl),d + pop de + ret + +;АДРЕС: #0D6D установка/восстановление параметров заголовка zs-snap +;вх: z - чтение файла +; nz - запись файла +; hl,xE8A9 - буфер заголовка файла +x0D6D push af + jr nz,x0D93 ;запись файла +;чтение файла + ex de,hl + ld a,(de) + inc de + ld hl,xE027 + res 7,(hl) + cp #4D + jr z,x0D85 ;без компрессии + set 7,(hl) + cp #41 +x0D80 ld a,#55 + jp nz,x06A9 ;печать сообщения об ошибке и продолжение работы монитора +x0D85 ex de,hl + ld a,(hl) + and #FD + cp #31 + jr nz,x0D80 ;ошибка + ld a,(hl) + ld (iy-#12),a + jr x0DA8 +;запись файла +x0D93 ex de,hl + ld hl,xE027 + ld a,#4D ;=#4D - без компрессии + res 7,(hl) + bit 5,(hl) + jr z,x0DA3 ;compression off + ld a,#41 ;=#41 - с компрессией + set 7,(hl) +x0DA3 ex de,hl + ld (hl),a + inc hl + ld (hl),#33 +x0DA8 inc hl + pop af + ld de,xDD69 + ld bc,#001E + jr z,x0DB3 ;чтение файла + ex de,hl +x0DB3 ldir + jr nz,x0DB8 ;запись файла + ex de,hl +x0DB8 jr nz,x0DD9 ;запись файла + ld a,(de) + inc de + ld hl,xE02D + bit 7,(hl) + jr z,x0DCB ;турбо-режим не доступен + res 6,(hl) ;выключим турбо + bit 6,a + jr z,x0DCB ;в снапе турбо выключено + set 6,(hl) ;включим турбо +x0DCB ld a,(de) + im 1 ;установим режим прерываний + dec a + jr z,x0DD3 + im 2 +x0DD3 inc de + ld a,(de) + out (#FE),a ;установим бордюр + jr x0DF3 +;запись файла +x0DD9 ld a,(xE02D) + ld (de),a + inc de + push de + rst #30 + dw rom2_x3B75 ;определение типа прерываний im 1/2 + db #02 + pop de + ld (de),a + inc de + ld hl,#5800 + rst #30 + dw rom2_x0028 ;чтение байта из памяти пользователя + db #02 + rrca + rrca + rrca + and #07 + ld (de),a +x0DF3 inc de + bit 6,(iy+#13) + ld hl,x0E35 + ld b,#03 +x0DFD push bc + ld c,(hl) + inc hl + ld b,(hl) + inc hl + jr nz,x0E08 ;запись файла + ld a,(de) ;восстановление переменных + ld (bc),a + jr x0E0A +x0E08 ld a,(bc) ;сохранение переменных + ld (de),a +x0E0A inc de + pop bc + djnz x0DFD + bit 1,(iy-#12) + ret z +;чтение/сохранение регистров AY + ld b,#FF + dec de +x0E16 inc de + ld a,b +x0E18 inc a + cp #0E + ret nc + cp #07 + jr z,x0E18 + ld b,a + bit 6,(iy+#13) + jr nz,x0E2E ;запись файла + ld a,(de) + rst #30 + dw rom2_x03A7 ;Запись регистра AY + db #02 + jr x0E16 +x0E2E rst #30 + dw rom2_x03B6 ;чтение регистра AY + db #02 + ld (de),a + jr x0E16 +;адреса переменных +x0E35 dw xE004 ;адрес содержимого регистра 7 AY + dw xE012 ;адрес состояния порта #7FFD + dw xE013 ;адрес состояния порта #1FFD + +;АДРЕС: #0E3B загрузка из ROM-disk +;вх: h - номер страницы с файлом +; l - смещение в параграфах от начала ROM-disk в этой странице +x0E3B res 6,(iy+#13) + ld (xE000),hl ;сохраним координаты файла + ld hl,xE8A9 ;куда грузим (буфер dma в записи fcb) + ld (xE7BE),hl + ld b,#01 ;1 параграф. заголовок файла + push hl + call x0EE6 ;загрузка блока из ROM-disk + ld (xE7C5),hl ;hl - координаты следующего блока файла (RAM 2) + pop hl + bit 6,(iy+#13) + call x0D6D ;восстановление параметров из заголовка zs-snap + ld hl,xE012 + ld a,(hl) + ld (xE00C),a ;копия порта #7FFD + res 5,(hl) ;режим 128k + rst #30 + dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld a,#02 ;номер страницы + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + ld a,#05 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + rst #30 + dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] + db #02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 + bit 5,(iy-#08) + jp nz,x0EC1 ;режим 48k. конец загрузки + xor a +x0E94 push af + cp #02 + jr z,x0EBB ;RAM 2 пропускаем + cp #05 + jr z,x0EBB ;RAM 5 пропускаем + cp #08 + jr z,x0EBB ;RAM 8 пропускаем + cp #09 + jr z,x0EBB ;RAM 9 пропускаем + rst #30 + dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + db #02 + ld l,a + rst #30 + dw rom2_x3707 ;сравнение страницы пользователя с заданной + db #02 + jr z,x0EBB ;RAM пользователя пропускаем + ld a,l + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + rst #30 + dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя + db #02 +x0EBB pop af + inc a + cp #10 + jr c,x0E94 +;загрузка страниц законцена. грузим RAM 2 +x0EC1 ld hl,(xE7C5) ;координаты страницы RAM 2 + ld (xE000),hl + ld a,#02 + call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) + call x0F08 ;загрузка страницы из ROM-disk в память #8000 + call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя + ld a,(xE00C) + ld (xE012),a + bit 5,a + call nz,x0D59 ;включение режима 48k only + jp x0ABA ;выход из монитора + +;АДРЕС: #0EE0 загрузка блока из ROM-disk +;вх: hl - адрес загрузки +; b - размер блока в секторах +;вых: hl - координаты следующего блока файла +; b - осталось незагруженных параграфов +x0EE0 ld (xE7A9+#15),hl ;xE7BE куда грузим + call x0C7D ;коррекция размера блока для загрузки + +;АДРЕС: #0EE6 загрузка блока из ROM-disk +;вх: b - кол-во параграфов для загрузки +;вых: hl - координаты следующего блока файла +x0EE6 xor a + ld hl,xDD99 ;формируем процедуру вызова п/п из страницы с ROM-disk + ld (hl),#F7 ;rst #30 + inc hl + ld (hl),#73 ;dw #0073 = romROMx0073 + inc hl + ld (hl),a + inc hl + ld (hl),a ;db #00 + inc hl + ld (hl),#C9 ;ret + ld hl,(xE000) ;координаты файла +x0EF9 ld a,h + ld (xDD9B+#01),a ;xDD9C плоскость и страница в которой выбранная прогармма + call xDD99 ;загрузка блока из ROM-Disk + inc b + dec b + jr nz,x0EF9 ;загрузка из следующей страницы + ld (xE000),hl ;координаты следующего блока файла + ret + +;АДРЕС: #0F08 загрузка страницы из ROM-disk в память #8000 +;вх: de - адрес битовой карты параграфов +x0F08 call x0D01 ;определение адреса загрузки страницы в памяти + bit 7,(iy+#13) + jr z,x0F38 ;без компрессии +; загрузка снапа с компрессией + ld a,(de) + ld (xE33B),a ;размер страницы в секторах + ld a,h + sub #80 + jp z,x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 + ld hl,x0EE0 ;процедура для загрузки блока из ROM-disk + call x0D60 ;установка п/п jp x0EE0 по адресу xE338 + ld hl,xE5A9 ;буфер для распаковки + ld de,xE5A9+#200 + exx + ld hl,#8000 + call x1108 ;распаковка блока + ld hl,#4000 + or a + sbc hl,bc + ret z + jp x0BEF ;ошибка чтения/записи +; загрузка снапа без компрессии +x0F38 push hl + ld a,h + sub #80 + jr z,x0F4A ;нечего грузить + push de + ld b,a ;кол-во параграфов для загрузки + ld hl,#8000 + ld (xE7A9+#15),hl ;адрес загрузки + call x0EE6 ;загрузка блока в память + pop de +x0F4A jp x0C0B ;распределение загруженной страницы по памяти с учетом пустых параграфов + +;АДРЕС: #0F4D заполнение области памяти [#4000..#7FFF] пользователя +x0F4D ld hl,#4000 + xor a +x0F51 ld b,#00 +x0F53 rst #30 + dw rom2_x0000 ;запись байта в память пользователя (rst #00) + db #02 + inc hl + djnz x0F53 + inc a + cp #40 + ret z + jr x0F51 + +;АДРЕС: #0F60 запаковка блока +;вх: hl - адрес окуда запаковывать +; de - размер окна сжатия *8 +; bc - размер области запакорвки +; hl',de' - адреса буферов +x0F60 ld (xDD89),hl + exx + ld (xE9DF),hl + ld (xE9E1),de + call x10D0 ;bc'=hl; hl'=hl+1; de'=#0000 + ld a,c + or b + jp z,x1083 ;конец области сохранения + ld a,#01 + call x10B9 + ld a,(hl) + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + ld (iy-#15),#FF + res 0,(iy+#0E) + jr x0F89 +x0F86 pop hl +x0F87 pop bc + pop de +x0F89 inc hl + dec bc + ld (iy-#16),#00 + ld a,b + or a + jr nz,x0F9B ;не последний параграф + ld (iy-#15),c + ld a,c + or a + jp z,x1083 ;данных больше нет +x0F9B push de + push bc + push hl + ld b,d + ld c,e + bit 0,(iy+#0E) + jr nz,x0FB9 + ld de,(xDD89) + sbc hl,de + ld d,h + ld e,l + or a + sbc hl,bc + jr c,x0FB7 + set 0,(iy+#0E) +x0FB7 ld b,d + ld c,e +x0FB9 ld a,b + or c + jr z,x0FF2 + pop hl + ld a,(hl) + push hl + sbc hl,bc + cpir + jr nz,x0FF2 + pop de + push de + inc de + push bc + ld b,(iy-#15) + ld c,b + dec b + jr z,x0FDC +x0FD1 ld a,(de) + cp (hl) + inc hl + inc de + jr nz,x0FDC + djnz x0FD1 + jr x0FDC +x0FDB dec b +x0FDC ld a,c + sub b + cp (iy-#16) + pop bc + jr z,x0FB9 + jr c,x0FB9 + ld (iy-#16),a + ld (xDDA7),bc + cp (iy-#15) + jr nz,x0FB9 +x0FF2 ld bc,(xDDA7) + inc bc + ld a,(iy-#16) + cp #02 + jr c,x1076 + jr z,x1002 + jr x1009 +x1002 ld hl,#00FF + sbc hl,bc + jr c,x1076 +x1009 dec a + ld e,a + pop hl + call x1103 ;сложение hl=hl+a + ex (sp),hl + xor a + ld d,a + sbc hl,de + ex (sp),hl + push hl + xor a + call x10B9 + or a + ld hl,#00FF + sbc hl,bc + ld a,(iy-#16) + ld e,a + jr c,x1042 + cp #06 + jr nc,x1042 + dec e + dec e + xor a + call x10B9 + ld a,e + rrca + call x10B9 + ld a,e + call x10B9 + ld a,c + neg + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x1042 push af + xor a + ld h,a + ld l,a + sbc hl,bc + inc a + call x10B9 + ld a,l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + ld b,#05 +x1052 sra h + rr l + djnz x1052 + ld a,l + and #F8 + ld l,a + pop af + cp #0A + jr nc,x106A + dec a + dec a + or l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x106A push af + ld a,l + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + pop af + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F86 +x1076 ld a,#01 + call x10B9 + pop hl + ld a,(hl) + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + jp x0F87 +;конец области сохранения +x1083 xor a + push af + call x10B9 + pop af + inc a + push af + call x10B9 + pop af + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + xor a + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + xor a + call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' + exx + ld a,#08 + sub d + jr z,x10A7 + push bc + ld b,a +x10A2 srl e + djnz x10A2 + pop bc +x10A7 ld a,e + ld (bc),a + ld de,(xE9DF) + or a + sbc hl,de + ex de,hl + ld c,e + ld b,d + ret +;запись байта в буфер ld (hl'),a; inc hl' +x10B4 exx + ld (hl),a + inc hl + exx + ret +x10B9 exx + rra + rr e + inc d + bit 3,d + exx + ret z + exx + ld a,e + ld (bc),a + ld de,(xE9E1) + or a + push hl + sbc hl,de + pop hl + jr nc,x10D8 +;установка регистров +;вх: hl - адрес буфера +;вых: bc'=hl +; hl'=hl+1 +; de'=#0000 +x10D0 ld c,l + ld b,h + inc hl + ld de,#0000 + exx + ret +x10D8 exx + push hl + push de + push bc + exx + ld de,(xE9DF) + push de + push de + sbc hl,de + push hl + ld l,#00 + push hl + ex de,hl + ld c,e + ld b,d + call xE338 + pop de + pop bc + pop hl + add hl,de + pop de + xor a + ld b,a + or c + jr z,x10FB + ldir +x10FB ex de,hl + exx + pop bc + pop de + pop hl + exx + jr x10D0 + +;АДРЕС: #1103 сложение hl=hl+a +x1103 add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #1108 распаковка блока +;вх: hl - адрес куда распаковывать +; hl' - адрес буфера откуда распаковывать +; de' - первая свободная ячейка в буфере (de-hl длина запакованного блока) +;вых: bc - размер распакованного блока +x1108 ld (xDD89),hl ;куда распаковывать + exx + ld (xE9DF),hl ;откуда распаковывать + ex de,hl + or a + sbc hl,de + ld (xE9E1),hl ;размер запакованного блока + call x1194 + exx + call x117A + ex de,hl +x111E call x1174 + jr nc,x112A + call x1185 + ld (de),a + inc de + jr x111E +x112A call x1174 + jr c,x114A + ld c,#00 + call x1174 + rl c + call x1174 + rl c + inc c + inc c + call x1185 + ld l,a + ld h,#FF +x1143 ld b,#00 + add hl,de + ldir + jr x111E +x114A call x1185 + ld l,a + call x1185 + ld c,a + or #07 + rrca + rrca + rrca + ld h,a + ld a,#07 + and c + inc a + inc a + ld c,a + cp #02 + jr nz,x1143 + call x1185 + ld c,a + or a + jr nz,x1143 + + ld hl,(xDD89) + push de + ex de,hl + sbc hl,de + ld c,l + ld b,h + pop de + ret +x1174 exx + srl e + dec d + exx + ret nz +x117A push af + call x1185 + exx + ld e,a + pop af + ld d,#08 + exx + ret +x1185 exx + ld a,b + or c + jr z,x118F +x118A ld a,(hl) + inc hl + dec bc + exx + ret +x118F call x1194 + jr x118A +x1194 exx + push hl + push de + push bc + exx + push de + ld hl,(xE9DF) + push hl + ld bc,(xE9E1) + push bc + call xE338 + pop bc + pop hl + pop de + exx + pop bc + pop de + pop hl + exx + ret + +;неиспользуемая область +x11AF ds #51,0 + +;АДРЕС: #1200 ROM-disk +x1200 INCBIN "prof_roms/rom6_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM6.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom6.bat b/ProfRom_Disasm/rom6.bat new file mode 100755 index 0000000..3991554 --- /dev/null +++ b/ProfRom_Disasm/rom6.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom6.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom7.a80 b/ProfRom_Disasm/rom7.a80 new file mode 100755 index 0000000..2f4fe78 --- /dev/null +++ b/ProfRom_Disasm/rom7.a80 @@ -0,0 +1,5903 @@ + DEVICE ZXSPECTRUM128 + INCLUDE "!AllConst.asm" + INCLUDE "!ram8.asm" + ORG #0000 +ROMdisk equ #2500 + +;#0000 *NOT USED* (#30 байт) +;#0030 rst #30 вызов процедуры из другого rom +;#0033 *NOT USED* (#05 байт) +;#0038 обработчик прерываний im 0/1 +;#0041 *NOT USED* (#25 байт) +;#0066 обработка NMI (зависание с желто-черным бордюром) +;#006F *NOT USED* (#01 байт) +;#0070 переменные ROM-disk +;#0073 загрузка блока из ROM-Disk +;не используется #00BF вероятно что-то для контроллера прерываний +;#00FF адрес п/п обработки прерываний im 2 +;#0101 номер текущего rom +;#0102 процедура обработки прерываний im 2 +;#010E вызов процедуры из другого rom +;не используется #0127 вызов процедуры из rom 2 call x0127: dw addr +;не используется #0146 работа с контроллером прерываний +;не используется #015F работа с контроллером прерываний +;не используется #0180 работа с контроллером прерываний +;не используется #018B работа с контроллером прерываний +;не используется #0193 работа с контроллером прерываний +;#01AF автостарт с дискеты +;#0229 вызов функции R8DOS +;#029C R8DOS #00(0) сброс контроллера +;#02BE код time-out +;без вызовов пока #02C8 уменьшение time-out на 1 для всех дисководов +;#02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода +;#02F6 проверка наличия диска в дисководе +;#0322 опрос Break и прерывание, если нажата +;#032B R8DOS #10(16) чтение/установка спецификации дискеты +;#0335 R8DOS #11(17) чтение кода спецификации дисковода +;#033A в hl адрес кода time-out для текущего дисковода +;#033F в hl адрес кода, определяющего номер дорожки в текущем дисководе +;#0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе +;#0349 в hl адрес кода, определяющего тип текущего дисковода +;#0356 подготовка байта для выбора заданного дисковода +;#0366 проверка наличия образа в текущем дисководе +;#0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +;#03A2 установка номера дорожки для позиционирования +;#03C5 R8DOS #01(1) выбор текущего дисковода +;#03E4 инициализация текущего дисковода при необходимости +;#042C позиционирование на заданную дорожку +;#0430 поиск дорожки +;#0434 поиск дорожки с проверкой +;#0438 выдача команды в порт #1F ВГ93 +;#0441 ожидание готовности ВГ93 +;#0457 R8DOS #02(2) позиционирование на заданный логический трек +;#04D1 ошибка. прерывание функции +;#0502 R8DOS #0E(14) физическое позиционирование на трек +;#0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке +;#054A ошибка. неверный номер сектора +;#054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) +;#0553 R8DOS #05(5) чтение группы секторов +;#0557 R8DOS #06(6) запись группы секторов +;#05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) +;#0610 чтение сектора +;#063B чтение данных с дискеты в память +;#066B чтение сектора образа HDD в память +;#0694 чтение сектора с винчестера в буфер xEFF5 +;#06B4 запись сектора +;#0708 запись сектора на образ HDD +;#074C расчет смещения от начала образа в секторах (512b) +;#0768 чтение заголовка сектора с позиционированием на заданную дорожку +;#076D чтение заголовка сектора +;#077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера +;#0824 позиционирование на заданную дорожку c тайим-аутом +;#084F R8DOS #07(7) идентификация диска +;#08D4 R8DOS #08(8) идентификация диска для tr-dos +;#0922 R8DOS #09(9) установка рабочего буфера для функции 8 +;#092F вычисление размера таблицы секторов +;#0948 R8DOS #0B(11) форматирование дорожки +;#0B52 преобразование кода размера сектора в байтах в число +;#0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов +;#0B94 R8DOS #0C(12) чтение дорожки +;#0B98 R8DOS #0D(13) запись дорожки +;#0C83 опрос Break. cy=1 не нажата +;#0C98 остановка контроллера ВГ93 +;#0CAD таблица адресоф функций R8DOS +;#0CFF установка переменных дисковой BIOS +;#0D51 определение наличия SMUC +;#0D62 определение наличия NVRAM +;#0DA5 cy=1, a=#01 !!!Not Used!!! +;#0DA9 cy=1, a=#02 !!!Not Used!!! +;#0DAD чтение всей памяти NVRAM в память #7530 +;#0DB6 чтение данных из NVRAM +;#0DC7 запись всей памяти NVRAM из памяти #7530 +;#0DD0 запись данных в NVRAM +;#0E72 что-то пишет в NVRAM +;#0F55 для сравнения чисел +;#0F59 для сравнения чисел +;#0F5D деление hl=dehl'/bc +;#0FB7 умножение dehl=de'hl' * bc +;#0FF3 инкремент dehl +;#1003 копирование из (hl) в (de) 4х байт +;#100F загрузка числа в регистры из памяти +;#101D сложение 4х байтного числа с двухбатным +;#1035 сравнение двух чисел в памяти по адресам в de и hl +;#1065 инициализация дисковода +;#107B инициализация дисковода и настройка на дискету +;#10A4 распознавание имени файла и занесение его в fcb +;#111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска +;#1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb. !!!ОШИБКА!!! маски, после первого поиска больше нету +;#114E загрузка дескриптора файла в буфер +;#1166 загрузка очередного дескриптора файла в буфер +;#11A7 получение адреса байта в буфере dma +;#11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +;#11D4 открыть файл(для нужд монитора) для последующих операций с ним +;#11DB R8DOS #14(20) открыть файл для последующих операций с ним +;#11DF открыть файл для последующих операций с ним +;#1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +;#128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +;#12FF установка в fcb указателя в файле из bc +;#1307 R8DOS #15(21) закрыть файл, открытый функцией 20 +;#1360 R8DOS #1E(30) последовательное считывание заданного количества секторов +;#1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла +;#1390 R8DOS #1F(31) последовательная запись заданного количества секторов +;#1395 R8DOS #1D(29) последовательная запись одного сектора из памяти +;#13D5 создание записи в каталоге диска (на основе fcb) +;#1405 установка нового значения указателя в файле +;#1407 R8DOS #20(32) установка нового значения указателя в файле +;#1472 чтение сектора в буфер dma +;#1484 сохранение буфера dma в файл +;#148D чтение секторов в буфер dma +;#1498 запись секторов из буфера dma +;#14A0 расчет адреса в файле на диске (дорожка и сектор) +;#14A6 расчет нового номера дорожки и сектора +;#14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +;#153D копирование дескриптора дисковода в буфер +;#1545 R8DOS #21(33) чтение из fcb в bc указателя файла +;#154C чтение из fcb в hl длины файла +;#1553 чтение из fcb в hl адреса буфера dma +;#155A чтение заголовка первого попавшегося сектора дисковода A +;#1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) +;#1572 определение наличия interrupt controller +;#15C7 определение наличия последовательного порта/модема +;#16B9 работа с контроллером прерываний +;не используется #1738 работа с контроллером прерываний +;#1768 поиск раздела MFS +;#17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +;#17EF запись 2х секторов из буфера xEBF5 +;#1813 чтение сектора с винчестера +;#1829 запись сектора на винчестер +;#1848 расчет номера сектора на винчестере +;#187F R8DOS #23(35) подключение раздела к драйверу HDD +;#188A установка кода, определяющий тип дисковода без образа по номеру в С +;#189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +;#18C0 R8DOS #28(40) подключение раздела к драйверу HDD +;#1A0E расчет адреса кода, определяющие тип дисковода по номеру в С +;#1A19 завершение процедуры x18C0 R8DOS #28(40) +;#1A6A проверка совпадения имени +;#1A82 выделение из строки имени подраздела/образа (6 символов имя) +;#1A9F копирование имени подраздела/образа по адресу в de +;#1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 +;#1ACC формирование текстовой строки - пути к примонтированному подразделу/образу +;#1B04 расчет адреса блока описателя заданного дисковода +;#1B18 установка признака подмонтированных дисков A/B в порту #7FBA +;#1B45 определение необходимости копирования памяти пользователя +;#1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) +;#1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска +;#1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска +;#1BFA ошибка #56. нет раздела MFS +;#1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела +;#1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) +;#1C70 бесконечное чтение порта bc +;#1C74 бесконечная запись в порт bc +;#1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства +;#1C86 чтение 512b данных в буфер адресуемый hl +;#1C98 запись 512b данных из буфер адресуемого hl +;#1CAC посылаем команду винчестеру +;#1CCA ожидание готовности HDD к передаче данных +;#1CE5 ожидание готовности HDD к принятию команды +;#1D04 ожидание готовности HDD +;#1D1B чтение сектора идентификации в буфер по адресу в ix +;#1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +;#1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;#1D4A запись сектора из буфера ix на винчестер +;#1D4F запись сектора из буфера xE5A9 на винчестер +;#1D73 чтение сектора с винчестера в буфер xE5A9 +;#1D78 чтение сектора с винчестера в буфер ix +;#1D7D чтение сектора с винчестера в буфер xE5A9 +;#1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +;#1E2A установка в переменных сектора номер 3 для винчестера +;#1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы +;#1E74 R8DOS #22(34) идентификация жесткого диска +;#1F08 проверка геометрии винчестера +;#1F2D расчет произведения головок и секторов +;#1F59 чтение ячейки CMOS +;#1F76 чтение из CMOS времени и даты, в случае готовности CMOS +;#1F8B проверка готовности CMOS +;#1F93 чтение из CMOS времени и даты +;#1FB2 запись в CMOS времени и даты +;#1FDD запись данных в ячейку CMOS +;#2010 запись в порт +;#2016 чтение порта +;#201C пауза 293t +;#2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +;#2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) +;#2047 определение наличия CMOS +;не используется #20EC работа с контроллером прерываний ??? +;#20F1 тестирование HDD (2. test) (тест на чтение/запись) +;#2105 тестирование HDD (1. test) (тест только на чтение) +;#21E5 подсчет контрольной суммы области памяти CRC16 +;#220F суммирование байта с контрольной суммой CMOS CRC8 +;#2222 данные для подсчета контрольной суммы +;#2223 данные для подсчета контрольной суммы +;#2422 определение наличия SMUC +;#2452 *** Not Used *** +;#2500 ROM-disk +;#3D00 +;#4000 + + +;АДРЕС: #0000 *NOT USED* (#30 байт) +x0000 ds #30 + +;АДРЕС: #0030 rst #30 вызов процедуры из другого rom +x0030 jp x010E + +;АДРЕС: #0033 *NOT USED* (#05 байт) +x0033 ds #05 + +;АДРЕС: #0038 обработчик прерываний im 0/1 +x0038 push af + ld a,#06 + ld (#7530),a + pop af + ei + ret + +;АДРЕС: #0041 *NOT USED* (#25 байт) +x0041 ds #25 + +;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) +x0066 ld a,#06 + out (#FE),a + xor a + out (#FE),a + jr x0066 + +;АДРЕС: #006F *NOT USED* (#01 байт) +x006F ds #01 + +;АДРЕС: #0070 переменные ROM-disk +x0070 db #25 ;смещение начала ром диска (в блоках по 256 байт) + db #18 ;количество свободных секторов в странице + db #00 ;=#00 каталог отсутсвует + +;АДРЕС: #0073 загрузка блока из ROM-Disk + INCLUDE "!RomDisk.asm" + +;АДРЕС: #00AA *NOT USED* (#15 байт) +x00AA ds #15 + +;АДРЕС: #00BF вероятно что-то для контроллера прерываний +x00BF db #93,#01 + ds #04 + db #8B,#01,#00,#CA,#00: jp x015F + db #80,#01,#00,#D2,#00: jp x015F + db #FB,#C9,#00,#DA,#00: jp x015F + db #00,#00,#00,#E2,#00: jp x015F + db #00,#00,#00,#EA,#00: jp x015F + db #00,#00,#00,#F2,#00: jp x015F + db #00,#00,#00,#FA,#00: jp x015F + db #00,#00 + +;АДРЕС: #00FF адрес п/п обработки прерываний im 2 +x00FF dw x0102 + +;АДРЕС: #0101 номер текущего rom +x0101 db #07 + +;АДРЕС: #0102 процедура обработки прерываний im 2 +x0102 push hl + ld a,#06 + ld hl,x9C40 + call x175D ;установка бордюра + pop hl + ei + ret + +;АДРЕС: #010E вызов процедуры из другого rom +x010E push hl + ld hl,(x0101) + ex (sp),hl + push hl + ld hl,#0006 + push af + add hl,sp + push de + push bc + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld a,(hl) + jp xE3E9 + +;АДРЕС: #0127 вызов процедуры из rom 2 call x0127: dw addr +x0127 ld (xDE10),hl + pop hl + push de + ld e,(hl) + inc hl + ld d,(hl) + inc hl + ex (sp),hl + push hl + ld hl,x0143 ;сюда вернемся + ex (sp),hl + push hl + ld hl,xE42C ;п/п включения страницы для возврата + ex (sp),hl + ex de,hl + push hl + ld hl,(xDE10) + jp xE478 ;включаем rom 2 +x0143 inc sp +x0144 inc sp + ret + +;АДРЕС: #0146 работа с контроллером прерываний +x0146 ei + nop + push af + push bc + ld b,#0C + call x1F59 ;чтение ячейки CMOS + ld a,#02 + ld (x7530),a + ld bc,#7EBE + ld a,#20 + out (c),a + pop bc + pop af + ei + ret + +;АДРЕС: #015F работа с контроллером прерываний +x015F push af + push bc + ld b,#0C + call x1F59 ;чтение ячейки CMOS + ld a,#02 + ld (#7530),a + push hl + ld a,#02 + ld hl,#9C40 + call x175D ;вызов процедуры из основной памяти + pop hl + ld bc,#7EBE + ld a,#20 + out (c),a + pop bc + pop af + ei + ret + +;АДРЕС: #0180 работа с контроллером прерываний +x0180 di + halt + push af + ld a,#04 + ld (#7530),a + pop af + ei + ret + +;АДРЕС: #018B работа с контроллером прерываний +x018B push af + ld a,#05 + ld (#7530),a + pop af + ret + +;АДРЕС: #0193 работа с контроллером прерываний +x0193 push af + push bc + ld bc,#7EBE + ld a,#0C + out (c),a + nop + nop + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + pop bc + pop af + ei + ret + +;АДРЕС: #01AF автостарт с дискеты +;вх: 2-3,a =#11 -> вых: нажатие Enter и переход на rom 0: #259F +; =#10 -> вых: bc - длина бейсик-строки для автостарта +; =#0? -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 +x01AF ld a,(xDD7F+#01) ;регистр A пользователя + and #0C + cp #0C + jr z,x01EC + cp #08 + jr z,x01E4 ;длина бейсик строки для дисковода автостарта + ld hl,rom0_x1B11 ;п/п загрузки с диска + ld (xDD6B),hl ;новый pc программы пользователя + ld de,(xDD75) ;регистр de пользователя + call x0207 ;bc - длина бейсик строки для автостарта + ld hl,x0213 + ldir + ret z ;автостарт с дисковода A + push af + call x1B04 ;расчет адреса блока описателя заданного дисковода + pop bc ;b - номер дисковода + jr nz,x01D8 ;в дисководе образ диска + res 1,b ;реальные диски только в дисководах A/B +x01D8 ld a,"A" + add a,b + ld hl,(xDD75) ;регистр de пользователя + ld de,#000F + add hl,de + ld (hl),a ;установим букву дисковода + ret +;длина бейсик строки для дисковода автостарта +x01E4 call x0207 ;bc - длина бейсик строки для автостарта + ld (xDD77),bc ;регистр bc пользователя + ret +;запуск с винчестера +x01EC ld hl,rom0_x259F + ld (xDD6B),hl ;новый pc программы пользователя + bit 7,(iy+#1B) + ret z ;проверка геометрии винчестера не пройдена + bit 0,(iy+#1C) + ret z ;autostart off + ld a,#0D + ld (#5C08),a ;код последней нажатой клавиши: enter + ld hl,#5C3B + set 5,(hl) ;устанавливается при нажатии на любую символьную клавишу + ret +;вых: bc - длина бейсик строки для автостарта +; z - автостарт с дисковода A +x0207 ld a,(iy-#23) ;номер диска автостарта + or a + ld bc,#000E ;для дисковода A + ret z + ld bc,#0016 ;для дисководов B/C/D + ret +x0213 db #F9 ;randomize + db #C0 ;usr + db #B0 ;val + db '"15619"' ;"15619" + db ":",#EA,":",#F7 ;:rem:run + db '"A:boot"' + +;АДРЕС: #0229 вызов функции R8DOS +;вх: c - номер функции +x0229 push ix + ld (xFFEF),a + ld a,r + push af ;сохраним флаг прерываний + di + ld a,c + cp #14 + jr nc,x0293 + ld a,(xFFEF) ;для функций #00..#13 + ld (xFFDE),sp + push hl + ld hl,xFFDC + res 0,(hl) + res 4,(iy+#0B) + inc hl + ld (hl),#FF ;код ошибки #FF + ld hl,x0264 ;сюда вернемся +x024E ex (sp),hl + push hl + push de + ld l,c + ld h,#00 + add hl,hl + ld de,x0CAD ;функции R8DOS + add hl,de + ld e,(hl) + inc hl + ld d,(hl) + ex de,hl ;адрес п/п обработки заданной функции + pop de + ex (sp),hl + ld ix,(xFFF0) ;!!!ОШИБКА, должно быть ld ix,(xDD6F) + ret +;выход из функции по ошибке +;возврат из функций #00..#13 +x0264 ld sp,(xFFDE) ;восстановим стэк + ld (xFFEF),a ;временно сохраним регистр A + push hl + ld hl,xFFDC + res 4,(hl) + inc hl + ld a,(hl) ;код ошибки + cp #FF + pop hl + ex (sp),hl + res 0,l ;сбросим флаг CY + jr z,x027D ;нет ошибки +x027B set 0,l ;установим флаг CY +x027D ex (sp),hl + pop af + ld a,(xFFEF) ;восстановим A + jp po,x0286 ;восстановим режим прерываний ei/di + ei +x0286 pop ix + ret +;возврат из функций #14..#nn +x0289 ld (xFFEF),a + ex (sp),hl + res 0,l ;сбросим флаг CY + jr nc,x027D ;нет ошибки + jr x027B ;была ошибка +x0293 ld a,(xFFEF) ;для функций #14..#nn + push hl + ld hl,x0289 ;сюда вернемся + jr x024E + +;АДРЕС: #029C R8DOS #00(0) сброс контроллера +x029C xor a + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),a ;номер дорожки =#00 + call x0394 ;bit 7,(xFFDC) + ret nz ;к текущему дисководу подключен образ + call x0C98 ;остановка контроллера ВГ93 + out (#FF),a ;загрузка головки, сторона верхняя, метод записи + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + and #03 ;скорость перемещения головки + or #0C ;головку опустить, проверить номер дорожки + out (#1F),a ;команда восстановления + call x0441 ;ожидание готовности ВГ93 + call x02F6 ;проверка наличия диска в дисководе + in a,(#1F) ;читаем регистр состояния + set 4,(hl) ;hl=xFFDC + +;АДРЕС: #02BE код time-out +;вых: z код time-out текущего дисковода =#FF/#00 +x02BE call x033A ;hl адрес кода time-out для текущего дисковода + ld a,(hl) + inc a + ret z + dec a + ld (hl),#0A + ret + +;АДРЕС: #02C8 уменьшение time-out на 1 для всех дисководов +;вых: hl - адрес процедуры time-out +x02C8 ld b,#00 + +;АДРЕС: #02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода +;вх: b - байт установки time-out +; 3-0,b =0000 уменьшение time-out на 1 для всех дисководов +;вых: hl - адрес процедуры time-out +x02CA ld hl,xFFD8 ;коды time-out для дисководов + ld a,b + and #0F + jr nz,x02E3 + ld b,#04 ;для всех дисководов +x02D4 ld a,(hl) + inc a + jr z,x02DC ;(hl)=#FF + dec a + jr z,x02DC ;(hl)=#00 + dec (hl) ;(hl)=(hl)-1 +x02DC inc hl + djnz x02D4 +x02DF ld hl,x02C8 + ret +x02E3 ld a,b + ld b,#04 +x02E6 rra + jr nc,x02F1 ;следующий дисковод + ld c,#00 + bit 3,a + jr nz,x02F0 + dec c +x02F0 ld (hl),c ;#00/#FF +x02F1 inc hl + djnz x02E6 + jr x02DF + +;АДРЕС: #02F6 проверка наличия диска в дисководе +x02F6 call x0322 ;опрос Break и прерывание, если нажата + ld hl,xFFDC + ld de,#0000 + in a,(#1F) ;берем индексный сигнал для образца + and #02 + ld b,a + call x0316 ;ждем изменения индексного сигнала + ret nz ;индексный сигнал изменился + call x0316 ;повторим еще раз + ret nz ;индексный сигнал изменился +x030C bit 0,(hl) + ret nz + call x0C98 ;остановка контроллера ВГ93 + ld a,#01 + jr x0328 ;ошибка. прерывание функции +;ждем изменения индексного сигнала +x0316 in a,(#1F) + and #02 + cp b + ret nz + inc de + ld a,e + or d + jr nz,x0316 + ret + +;АДРЕС: #0322 опрос Break и прерывание, если нажата +x0322 call x0C83 ;опрос Break. cy=1 не нажата + ret c + ld a,#03 +x0328 jp x04D1 ;ошибка. прерывание функции + +;АДРЕС: #032B R8DOS #10(16) чтение/установка спецификации дискеты +;вх: a - спецификация диска +; b - режим: 0FFh - установка, другое - чтение. +; +x032B call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе + inc b + jr nz,x0333 ;чтение + ld (hl),a ;запись + ret +x0333 ld a,(hl) + ret + +;АДРЕС: #0335 R8DOS #11(17) чтение кода спецификации дисковода +;вых: a - код спецификации дисковода +x0335 call x0349 ;адрес кода, определяющего тип текущего дисковода + ld a,(hl) + ret + +;АДРЕС: #033A в hl адрес кода time-out для текущего дисковода +x033A ld hl,xFFD8 + jr x034C + +;АДРЕС: #033F в hl адрес кода, определяющего номер дорожки в текущем дисководе +x033F ld hl,xFFD4 + jr x034C + +;АДРЕС: #0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе +x0344 ld hl,xFFD0 ;коды, определяющие тип дискеты в дисководах + jr x034C + +;АДРЕС: #0349 в hl адрес кода, определяющего тип текущего дисковода +x0349 ld hl,xFFCC ;коды, определяющие тип дисковода +;расчет адреса для текущего дисковода +x034C push de + ld de,(xFFCA) ;номер текущего дисковода + ld d,#00 + add hl,de + pop de + ret + +;АДРЕС: #0356 подготовка байта для выбора заданного дисковода +;вых: a - байт +x0356 ld a,(xFFCA) ;номер текущего дисковода + call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе + and #03 ;номер текущего дисковода + or %00011100 ;загрузка головки, сторона верхняя + ld c,a + ld a,(hl) ;метод записи 0/1=FM/MFM + and %01000000 + or c + ret + +;АДРЕС: #0366 проверка наличия образа в текущем дисководе +;вых: nz - к текущему дисководу образ подключен +; z - к текущему дисководу образ не подключен +x0366 call x0349 ;в hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + cp #FF + jr z,x038C ;еще не инициалищирован + bit 5,a + jr z,x038C ;образ не подключен +;проверка наличия образа TR-DOS в текущем дисководе +x0372 ld a,(xE590) + and %11011111 + cp #01 + jr nz,x03DF ;нет подключенного образа TR-DOS. ошибка: нет диска в дисководе + ld hl,xFFDC + set 7,(hl) ;признак подключенного образа TR-DOS + xor a ;cy=0 + inc a ;nz + ret +;установка дескриптора образа для текущего дисковода +x0383 ld a,(xFFCA) ;номер текущего дисковода + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, + db #02 ;если к нему примонтирован образ + jr x0372 ;проверка наличия образа TR-DOS в текущем дисководе +;для дисководов C/D возможна работа только с образами +x038C ld a,(xFFCA) ;номер текущего дисковода + bit 1,a + ret z ;дисковод A/B + jr x03DF ;ошибка: нет диска в дисководе + +;АДРЕС: #0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу +x0394 push hl + ld hl,xFFDC + bit 7,(hl) + pop hl + ret + +;текущий дисковод инициализирован +x039C ld hl,xFFDC + set 6,(hl) + ret + +;АДРЕС: #03A2 установка номера дорожки для позиционирования +x03A2 ld a,(xFFDC) + bit 6,a + ret nz ;дисковод инициализирован + push hl + push de + push bc + call x0366 ;проверка наличия образа в текущем дисководе + jr nz,x03BE ;к текущему дисководу образ подключен + ld b,#10 + call x0356 ;подготовка байта для выбора заданного дисковода + xor b + out (#FF),a + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a ;установим номер дорожки +x03BE call x039C ;текущий дисковод инициализирован + pop bc + pop de + pop hl + ret + +;АДРЕС: #03C5 R8DOS #01(1) выбор текущего дисковода +;вх: a - номер дисковода [0..3] +x03C5 and #03 + ld (xFFCA),a ;номер текущего дисковода + ld hl,xFFDC + res 6,(hl) + res 7,(hl) + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 5,(hl) ;образ на текущем дисководе? + jr nz,x0383 ;к дисководу подключен образ. установка дескриптора образа для текущего дисковода + bit 1,a + ret z ;дисковод A/B + xor a + ld (xE590),a ;текущий дисковод без образа +x03DF ld a,#01 ;дисководы C/D только с образами могуть быть + jp x04D1 ;ошибка #01 нет диска в дисководе. прерывание функции + +;АДРЕС: #03E4 инициализация текущего дисковода при необходимости +x03E4 ld hl,xFFDC + bit 6,(hl) + ret nz ;дисковод уже инициализирован + ld hl,x039C ;адрес возврата + push hl + ld hl,xFFDC ;!!!ЛИШНЕЕ + call x0366 ;проверка наличия образа в текущем дисководе + ret nz ;к текущему дисководу подключен образ + call x0356 ;подготовка байта для выбора заданного дисковода + out (#FF),a ;выбор дисковода + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + inc a + ret nz ;уже инициализирован + push hl + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + ld ix,xFFDC + set 0,(ix+0) + xor a ;дорожка 0 + call x042C ;позиционирование на заданную дорожку + ld a,#32 ;дорожка #32(50) + call x042C ;позиционирование на заданную дорожку + ld a,#02 ;дорожка #02 + call x042C ;позиционирование на заданную дорожку + res 0,(ix+0) + pop hl + bit 2,a ;регистр состояния. потеря данных + res 6,(hl) + jr nz,x0427 ;потеря данных + set 6,(hl) ;80 дорожек на дисководе +x0427 ld a,(hl) + and %11000011 + ld (hl),a + xor a ;уходим на нулевую дорожку + +;АДРЕС: #042C позиционирование на заданную дорожку +;вх: a - номер дорожки +;вых: a - регистр состояния +x042C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),a ;номер дорожки + +;АДРЕС: #0430 поиск дорожки +;вх: a - номер дорожки +;вых: a - регистр состояния +x0430 ld b,#18 ;команда поиска + jr x0436 + +;АДРЕС: #0434 поиск дорожки с проверкой +;вх: a - номер дорожки +;вых: a - регистр состояния +x0434 ld b,#1C ;команда поиска +x0436 out (#7F),a ;запись в регистр данных + +;АДРЕС: #0438 выдача команды в порт #1F ВГ93 +;вх: b - команда для ВГ93 +;вых: a - регистр состояния +x0438 call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + and #03 ;время перемещения на шаг + or b + out (#1F),a ;выдаем команду в порт + +;АДРЕС: #0441 ожидание готовности ВГ93 +;вых: a - регистр состояния +x0441 ld de,26300 ;количество попыток +x0444 in a,(#FF) ;ожидание сигнала INTRQ + rlca + jr nc,x044C + in a,(#1F) ;чтение регистра состояния + ret +x044C call x0322 ;опрос Break и прерывание, если нажата + dec de + ld a,e + or d + jr nz,x0444 ;повторим + jp x030C ;превышено кол-во попыток + +;АДРЕС: #0457 R8DOS #02(2) позиционирование на заданный логический трек +;вх: d - номер дорожки +x0457 push de + call x03E4 ;инициализация текущего дисковода при необходимости + pop de + call x0394 ;проверка bit 7,(xFFDC) + jr z,x046D ;реальная дискета +;подключен образ диска +x0461 call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld (hl),d + ld a,d + cp #A0 ;не больше 160 + ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) + ret c + jr x04D1 ;ошибка. прерывание функции +;реальная дискета +x046D call x0356 ;подготовка байта для выбора заданного дисковода + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld e,(hl) + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 5,e + jr z,x0483 ;диск 40 дорожек + bit 6,(hl) + jr nz,x0492 ;дисковод на 80 дорожек +x047F ld a,#08 ;код ошибки: ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) + jr x04D1 +x0483 bit 6,(hl) + jr z,x0492 ;дисковод на 40 дорожек +;дисковод на 80 дорожек + sla d ;определение стороны диска и номера физической дорожки + bit 7,e + jr z,x0492 ;односторонняя дискета + bit 1,d + jr z,x0492 ;верхняя сторона + dec d +x0492 bit 7,e + jr z,x04A0 ;односторонняя дискета + bit 7,(hl) + jr z,x047F ;ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) + srl d + jr nc,x04A0 + res 4,a ;нижняя головка +x04A0 out (#FF),a + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) + jp c,x04D1 + ld a,(ix+0) ;номер дорожки в заголовке + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + cp (hl) ;сравнение с заданным + push hl + push de + call nz,x029C ;R8DOS #00(0) сброс контроллера + pop de + pop hl + ld a,(hl) ;номер дорожки + bit 2,e + jr z,x04BF + sla a ;диск 40 работает на дисководе 80 +x04BF cp d + ret z + out (#3F),a ;установим номер дорожки + ld a,d + bit 2,e + jr nz,x04EC ;диск 40 работает на дисководе 80 + ld (hl),a + call x0434 ;поиск дорожки с проверкой + bit 4,a ;ошибка позиционирования? + ret z ;нет ошибки +x04CF ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) + +;АДРЕС: #04D1 ошибка. прерывание функции +;вх: a - код ошибки +x04D1 ld (xFFDD),a ;код ошибки дискового интерпретатора + ld a,#D0 + out (#1F),a ;команда прерывания + call x04DE + jp x0264 +;проверка кода time-out для текущего дисковода +x04DE push hl + push af + call x033A ;в hl адрес кода time-out для текущего дисковода + ld a,(hl) + inc a + jr z,x04E9 + ld (hl),#00 +x04E9 pop af + pop hl + ret +;диск 40 работает на дисководе 80 +x04EC srl d + ld (hl),d + push de + call x0430 ;поиск дорожки + pop de + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) + jr c,x04D1 + ld a,(ix+0) ;номер дорожки + cp d + ret z + jr x04CF ;ошибка позицирования (не соответствует номер дорожки) + +;АДРЕС: #0502 R8DOS #0E(14) физическое позиционирование на трек +;вх: d - номер физической дорожки [0...х] +; a - номер стороны: 0/1 - нижняя/верхняя +x0502 and #01 + ld e,a ;номер стороны + push de + call x03A2 ;установка номера дорожки для позиционирования + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x0517 ;образ не подключен + pop de + ld a,d + sla a + add a,e + ld d,a ;логический номер дорожки + jp x0461 ;проверка номера дорожки образа +x0517 call x0824 ;позиционирование на заданную дорожку c тайим-аутом + call x0356 ;подготовка байта для выбора заданного дисковода + pop de + rrc e + ld hl,xFFDC + set 4,(hl) + jr nc,x052B ;нижняя сторона + res 4,a + res 4,(hl) +x052B out (#FF),a + ld a,d + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + bit 2,(hl) + jp z,x042C ;позиционирование на заданную дорожку +;диск 40 работает на дисководе 80 + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + sla a + out (#3F),a + ld (hl),d + ld a,d + sla a + jp x0430 ;поиск дорожки + ret ;!!!ЛИШНЕЕ!!! + +;АДРЕС: #0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке +x0546 ld hl,(xFFC8) + ret + +;АДРЕС: #054A ошибка. неверный номер сектора +x054A ld a,#07 + jr x04D1 + +;АДРЕС: #054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) +x054E call x0824 ;позиционирование на заданную дорожку c тайим-аутом + jr x05A8 + +;АДРЕС: #0553 R8DOS #05(5) чтение группы секторов +;вх: hl - адрес буфера +; d[0...x] - номер логического трека (первого обрабатываемого сектора) +; e[0...х] - номер первого обрабатываемого сектора +; b - количество секторов в операции +; +x0553 ld a,#80 ;признак чтения + jr x0559 + +;АДРЕС: #0557 R8DOS #06(6) запись группы секторов +;вх: hl - адрес буфера +; d[0...x] - номер логического трека (первого обрабатываемого сектора) +; e[0...х] - номер первого обрабатываемого сектора +; b - количество секторов в операции +; +x0557 ld a,#A0 ;признак записи +x0559 ld (xFFE1),a + push bc + push de + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and #03 ;код размера сектора в байтах + push af + ld c,a + call x0B52 ;преобразование кода размера сектора в байтах в число + ld (xFFED),bc ;размер сектора в байтах + pop af + bit 6,(hl) + jr nz,x0575 ;метод записи MFM + add a,#04 +x0575 ld b,#00 + ld c,a + ld hl,(xFFC8) ;адрес таблицы количеством секторов на дорожке + add hl,bc + ld a,(hl) + ld (xFFE0),a ;количество секторов на дорожке + dec a + cp e + jr c,x054A ;ошибка. неверный номер сектора + call x03E4 ;инициализация текущего дисковода при необходимости + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + pop hl + pop de + pop bc +x058D ld (xFFE2),hl + ld (xFFE4),de + ld a,b + ld (xFFE6),a + call x0457 ;позиционирование на заданную дорожку + jr x05A8 +x059D ld a,b + ld (xFFE6),a + ld (xFFE2),hl + ld (xFFE4),de +;головка спозицонирована на заданную дорожку +x05A8 ld a,(xFFCB) + ld b,a ;число попыток считывания при ошибке +x05AC ld de,(xFFE4) ;дорожка и сектор + call x0322 ;опрос Break и прерывание, если нажата + ld hl,(xFFE2) ;адрес для чтения + push bc + ld bc,(xFFED) ;размер сектора в байтах + push de + ld a,(xFFE1) ;=#80/#A0 чтение/запись группы секторов + bit 5,a + push af + call nz,x06B4 ;запись сектора + pop af + call z,x0610 ;чтение сектора + pop de + ld c,a + and #1F + ld a,c + pop bc + jr z,x05EB ;прочиталось без ошибки + djnz x05AC ;ошибка. повторим чтение + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 +x05D5 jp x04D1 ;прервем функцию + +;АДРЕС: #05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) +x05D8 call x0824 ;позиционирование на заданную дорожку c тайим-аутом + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and #03 + ld c,a ;код размера сектора + call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) + add hl,bc ;пропускаем сектор + jr x05F1 +;проверка защиты от записи +x05EB bit 6,a ;защита записи? + ld a,#02 ;код ошибки: попытка записи на защищенную дискету + jr nz,x05D5 ;ошибка. если была запись. при чтении не устанавливается +;расчет номера следующего сектора +x05F1 ld de,(xFFE4) ;дорожка и сектор для чтения/записи + inc e + ld a,e + push hl ;следующий адрес в памяти + ld hl,(xFFE0) ;количество секторов на дорожке + cp l + pop hl + jr c,x0609 ;дорожка еще не кончилась + ld e,#00 ;нулевой сектор, следующая дорожка + inc d + ld a,(xFFE6) ;количество секторов для чтения/записи + ld b,a + djnz x058D ;следующий сектор + ret ;завершили чтение/запись +;дорожка еще не кончилась +x0609 ld a,(xFFE6) + ld b,a + djnz x059D + ret ;завершили чтение/запись + +;АДРЕС: #0610 чтение сектора +;вх: de - дорожка и сектор +; hl - адрес для чтения +; bc - размер сектора в байтах +; a - команда =#80/#A0 чтение/запись группы секторов +;вых: nz - ошибка чтения +; a - регистр состояния +; hl - следующий адрес в памяти +x0610 ld d,a + bit 5,(iy+#0B) + jr z,x0635 ;вызов функции из монитора + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0635 ;копировать не надо + push hl + ld hl,xEBF5 ;читаем в буфер в ram 8 + push bc + call x0635 ;читаем сектор + ld b,a ;регистр состояния + and #1F + ld a,b + pop bc + pop hl + ret nz ;была ошибка чтения + ld de,xEBF5 ;буфер в память пользователя + ex de,hl + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + xor a + ret +x0635 ld a,(xFFDC) + rlca + jr c,x066B ;это образ на HDD + +;АДРЕС: #063B чтение данных с дискеты в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: a - регистр состояния +; hl - следующий адрес в памяти +x063B call x0648 ;чтение данных в память + ld a,b + or a + ld a,#01 ;код ошибки: нет диска в дисководе + jp z,x04D1 ;нет готовности + in a,(#1F) + ret +;чтение данных в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: b=#00 нет готовности +; hl - следующий адрес в памяти +x0648 ld a,e + inc a + out (#5F),a ;регистр сектора + ld a,d + out (#1F),a ;регистр команд + ld bc,#047F +x0652 in a,(#FF) ;чтение системного регистра + and #C0 + jr nz,x0667 ;есть готовность + inc de + ld a,d + or e + jr nz,x0652 ;ожидаем готовность + djnz x0652 + ret +;чтение сектора +x0660 in a,(#FF) + and #C0 + jr z,x0660 ;ждем готовности + ret m ;сигнал окончания выполнения команды +x0667 ini ;читаем байт с дискеты + jr x0660 + +;АДРЕС: #066B чтение сектора образа HDD в память +;вх: hl - адрес в памяти +; d - команда +; e - номер сектора +;вых: hl - следующий адрес в памяти +; bc=#0100 +x066B push hl + call x074C ;расчет смещения от начала образа в секторах (512b) + push bc + inc hl ;+1 сервисный сектор + bit 4,(iy+#0B) + jr z,x0682 ;сектор с HDD еще не прочитан + push hl ;расчет смещения от начала образа в секторах (512b) + ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) + or a + sbc hl,bc + pop hl + jr z,x0685 ;сектор уже в памяти, не читаем +x0682 call x0694 ;чтение сектора с винчестера в буфер xEFF5 +x0685 pop bc ;#0000/#0100 смещение в секторе + pop de ;адрес в памяти куда читать + ld hl,xEFF5 + add hl,bc ;какую половину копировать + ld bc,#0100 + ldir ;копируем из буфера в память + ex de,hl + inc b + xor a + ret + +;АДРЕС: #0694 чтение сектора с винчестера в буфер xEFF5 +;вх: hl - смещение от начала образа в секторах (512b) +x0694 ld a,(xE590) + and #DF + cp #01 + ld a,#21 ;код ошибки: + jp nz,x04D1 + ld (xE5A7),hl ;смещение от начала образа в секторах (512b) + ld de,xEFF5 ;адрес буфера для чтения + ex de,hl + call x1813 ;чтение сектора с винчестера + ld a,#04 + jp c,x04D1 ;ошибка. прерываем функцию + set 4,(iy+#0B) ;сектор прочитан + ret + +;АДРЕС: #06B4 запись сектора +;вх: de - дорожка и сектор +; hl - адрес для чтения +; bc - размер сектора в байтах +; a - команда =#80/#A0 чтение/запись группы секторов +;вых: nz - ошибка записи +; a - регистр состояния +; hl - следующий адрес в памяти +x06B4 ld d,a + bit 5,(iy+#0B) + jr z,x06D2 ;вызов функции из монитора + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x06D2 ;копировать не надо + push de + ld de,xEBF5 ;буфер в ram 8 + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop de + push hl + ld hl,xEBF5 ;буфер с данными пользователя + call x06D2 + pop hl + ret +x06D2 ld a,(xFFDC) + rlca + jr c,x0708 ;это образ на HDD. запись сектора на образ HDD + call x06E5 ;запись сектора + ld a,b + or a + ld a,#01 ;код ошибки: нет диска в дисководе + jp z,x04D1 ;прерывание функции + in a,(#1F) ;регистр состояния + ret +;запись сектора +;вх: hl - адрес для чтения +; e - номер сектора +; d - команда =#80/#A0 чтение/запись группы секторов +;вых: b=#00 нет готовности +x06E5 ld a,e + inc a + out (#5F),a ;регистр сектора + ld a,d + out (#1F),a ;регистр команд (команда запись сектора) + ld bc,#047F +x06EF in a,(#FF) ;чтение системного регистра + and #C0 + jr nz,x0704 ;есть готовность к приему данных + inc de + ld a,d + or e + jr nz,x06EF ;ожидаем готовность + djnz x06EF + ret +;передача данных сектора +x06FD in a,(#FF) + and #C0 + jr z,x06FD ;ждем готовности + ret m ;сигнал окончания выполнения команды +x0704 outi ;запись байта на дискету + jr x06FD + +;АДРЕС: #0708 запись сектора на образ HDD +;вх: hl - адрес в памяти +; e - номер сектора +;вых: hl - следующий адрес в памяти +; bc=#0100 +x0708 ld a,(xE590) + cp #01 + ld a,#21 + jp nz,x04D1 ;образ не подключен/защита от записи + push hl + call x074C ;расчет смещения от начала образа в секторах (512b) + push bc + inc hl ;+1 сервисный сектор + bit 4,(iy+#0B) ;сектор еще не записан + jr z,x0729 ;читаем сектор с HDD. нужно чтобы записать сектор 256b + push hl ;расчет смещения от начала образа в секторах (512b) + ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) + or a + sbc hl,bc + pop hl + jr z,x072E ;этот сектор уже прочитан +x0729 push hl ;смещение от начала образа в секторах (512b) + call x0694 ;чтение сектора с винчестера в буфер xEFF5 + pop hl +x072E pop bc ;#0000/#0100 смещение в секторе + ex (sp),hl ;адрес в памяти + ld de,xEFF5 ;буфер куда прочитали сектор + ex de,hl + add hl,bc ;смещение в секторе + ex de,hl + ld bc,#0100 + ldir ;коприруем данные в буфер + pop de ;смещение от начала образа в секторах (512b) + push hl ;следующий адрес в памяти + ld hl,xEFF5 + call x1829 ;запись сектора на винчестер + pop hl + ld a,#00 + ret nc ;нет ошибок + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 + jp x04D1 + +;АДРЕС: #074C расчет смещения от начала образа в секторах (512b) +;вх: e - номер сектора +;вых: hl - смещение от начала образа в секторах (512b) +; bc - #0000/#0100 смещение в секторе +x074C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld l,(hl) ;номер дорожки + ld h,#00 + add hl,hl + add hl,hl + add hl,hl + add hl,hl ;номер дорожки *16 + ld a,l + add a,e + ld l,a + jr nc,x075C + inc h +x075C srl h + rr l ;(trk * 16 + sec)/2 + ld bc,#0000 ;первая половина сектора HDD + ret nc + ld bc,#0100 ;вторая половина сектора HDD + ret + +;АДРЕС: #0768 чтение заголовка сектора с позиционированием на заданную дорожку +;вх: e - номер сектора +;вых: cy=1 была ошибка при чтении +; ix - адрес буфера с прочитанныи загловком +x0768 push de + call x0824 ;позиционирование на заданную дорожку c тайим-аутом + pop de + +;АДРЕС: #076D чтение заголовка сектора +;вых: cy=1 была ошибка при чтении +; ix - адрес буфера с прочитанныи загловком +x076D push de + ld hl,xFFE9 ;куда читаем + ld d,#C0 ;чтение адреса + push hl + call x063B ;чтение данных в память + pop ix + pop de + and #1F + ret z ;ошибок нет + scf + ret + +;АДРЕС: #077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера +;вх: hl - адрес таблицы +;вых: таблица заголовков секторов, находящихся на дорожке +x077F call x03A2 ;установка номера дорожки для позиционирования + bit 5,(iy+#0B) + jr z,x07AB ;функция вызвана из монитора + ld bc,#012C + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x07AB ;копировать не надо + push hl + ld hl,xEBF5 + push hl + call x07AB + inc hl + pop bc + or a + sbc hl,bc + ld a,h + or l + ld c,l + ld b,h ;длина таблицы + pop de + ret z ;таблица пустая + ld hl,xEBF5 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret +;формирование таблицы секторов +x07AB call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x07CF ;реальная дискета +; для образа диска + push hl + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld e,(hl) + srl e + pop hl + ld a,#01 +x07BA ld (hl),#00 ;информация о секторе достоверна + inc hl + ld (hl),e ;Физический номер дорожки (0..х) + inc hl + ld (hl),#00 ;сторона 0 + inc hl + ld (hl),a ;Номер сектора (1..х) + inc hl + ld (hl),#01 ;Код длины сектора =#01 - 256b + inc hl + inc a + cp #11 + jr c,x07BA + ld (hl),#FE + ret +; для реальной дискеты +x07CF ld (xFFE2),hl + ld (hl),#FE + inc hl + inc hl + inc hl + ld (xFFE4),hl + ld (hl),#00 ;номер сектора 0 + ld a,#3C ;максимальное количество секторов + ld (xFFE6),a + call x0824 ;позиционирование на заданную дорожку c тайм-аутом +x07E4 call x0322 ;опрос Break и прерывание, если нажата + in a,(#1F) + bit 1,a + jr z,x07E4 ;ожидание индексного импульса +x07ED call x076D ;чтение заголовка сектора + ;ix - адрес буфера с прочитанныи загловком + ld hl,(xFFE2) + ld (hl),#00 + jr nc,x07F9 ;ошибок не было + ld (hl),#FF ;сбой чтения +x07F9 inc hl + ld de,(xFFE4) + ld a,(de) + cp (ix+#02) ;номер сектора + jr z,x0820 ;конец дорожки + push ix ;копируем в таблицу + pop de + ex de,hl + ld bc,#0004 + ldir + ex de,hl + ld (hl),#FE + ld (xFFE2),hl + ld a,(xFFE6) + dec a + ret z + ld (xFFE6),a + call x0322 ;опрос Break и прерывание, если нажата + jr x07ED +x0820 dec hl + ld (hl),#FE + ret + +;АДРЕС: #0824 позиционирование на заданную дорожку c тайим-аутом +x0824 push hl + ld hl,xFFDC + bit 4,(hl) + jr nz,x084D ;выход + bit 7,(hl) + jr nz,x084D ;выход + set 4,(hl) + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a ;номер дорожки + nop + out (#7F),a ;номер дорожки + ld b,#18 ;позиционирование на заданную дорожку + call x0438 ;выдача команды в порт #1F ВГ93 + call x02BE ;проверка байта time-out + jr nz,x084D ;задержка не нужна + ld hl,15010 ;задержка 390277t +x0848 dec hl + ld a,h + or l + jr nz,x0848 +x084D pop hl + ret + +;АДРЕС: #084F R8DOS #07(7) идентификация диска +x084F call x03E4 ;инициализация текущего дисковода при необходимости + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld a,(hl) + or #C0 + ld (hl),a + call x0394 ;bit 7,(xFFDC) + jr z,x0868 ;образ не подключен + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),#A1 ;%10100001 + ld d,#02 + jp x0457 ;R8DOS #02(2) позиционирование на заданный логический трек +;реальный дисковод +x0868 call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),#A0 + push hl + call x029C ;R8DOS #00(0) сброс контроллера + ld a,#02 + call x042C ;позиционирование на заданную дорожку + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + ;ix - адрес буфера с прочитанныи загловком + pop hl + jr nc,x088D ;ошибки не было + set 6,(hl) ;метод записи MFM + push hl + call x0356 ;подготовка байта для выбора заданного дисковода + out (#FF),a ;выбор дисковода + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + pop hl + ld a,#09 ;код ошибки: неформатированная дискета + jp c,x04D1 ;ошибка. прерывание функции +; установка длины сектора в переменной +x088D ld a,(ix+3) ;код длины сектора + and #03 + ld c,a ;код длины сектора + ld a,(hl) + and #FC + or c + ld (hl),a ;установим код длины сектора в переменной +; коррекция номера дорожки для 40 дорожечного дисковода + ld d,(ix+#00) ;номер дорожки + push hl + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + bit 6,(hl) + ld e,(hl) + jr nz,x08A6 ;80 дорожек в дисководе + srl d +x08A6 pop hl + res 2,(hl) ;hl адрес кода, определяющего тип дискеты в текущем дисководе + srl d + jr nc,x08BB + res 5,(hl) ;40 дорожек на дискете + bit 6,e ;код, определяющий тип текущего дисковода + jr z,x08BB ;дисковод на 40 дорожек + set 2,(hl) ;диск 40 работает на дисководе 80 + push hl + call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + dec (hl) + pop hl + +x08BB call x0356 ;подготовка байта для выбора заданного дисковода + res 4,a ;сторона 0 + out (#FF),a + push hl + call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку + pop hl + jr nc,x08CC ;ошибок не было + res 7,(hl) ;односторонняя дискета + ret +x08CC ld a,(ix+#01) ;номер стороны + or a + ret nz + res 7,(hl) ;односторонняя дискета + ret + +;АДРЕС: #08D4 R8DOS #08(8) идентификация диска для tr-dos, аналогична функции #18 +; интерпретатора системных функций. Перед вызовом необходимо +; установить рабочий буфер, размером не менее 256 байт, используя функцию 9 +x08D4 call x084F ;R8DOS #07(7) идентификация диска + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld a,(hl) + and %01000011 + dec a + ld a,#10 + jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos + ld de,#0008 + ld b,#01 + ld hl,(xFFE7) ;адрес рабочего буфера для функции + ld a,h + or l + ld a,#12 + jp z,x04D1 ;ошибка #12. не открыт рабочий буфер + call x0553 ;R8DOS #05(5) чтение служебного сектора + ld ix,(xFFE7) ;адрес рабочего буфера для функции + ld de,#00E1 + add ix,de ;начало служебной информации + ld a,#10 + cp (ix+#06) ;идентификационный код TR-DOS (#10) + jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos + call x0349 ;hl адрес кода, определяющего тип текущего дисковода + ld e,(hl) + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + inc a + res 7,(hl) ;односторонняя дискета + bit 2,(ix+#02) ;тип дискеты + jr z,x0918 ;односторонняя + set 7,(hl) ;двухсторонняя +x0918 res 5,(hl) ;40 дорожек на диске + bit 0,(ix+#02) ;кол-во дорожек + ret nz ;40 дорожек + set 5,(hl) ;80 дорожек + ret + +;АДРЕС: #0922 R8DOS #09(9) установка рабочего буфера для функции 8 +;вх: hl - адрес рабочего буфера +;вых: d - версия компиляции монитора +; c - число компиляций монитора +; b - месяц компиляции монитора +; e - год компиляции монитора +x0922 ld (xFFE7),hl + ld (xFFF0),hl + ld de,#6161 + ld bc,#0705 + ret + +;АДРЕС: #092F вычисление размера таблицы секторов +;вх: hl - адрес таблицы секторов +;вых: bc - размер таблицы сеторов +x092F push hl + push hl +x0931 ld a,(hl) + cp #FE + jr z,x093F ;конец таблицы секторов + ld a,#05 ;следующий сектор + add a,l + ld l,a + jr nc,x0931 + inc hl ;!!!ОШИБКА??? должно быть inc h + jr x0931 +x093F inc hl + pop bc + or a + sbc hl,bc + ld c,l + ld b,h ;размер таблицы секторов + pop hl + ret + +;АДРЕС: #0948 R8DOS #0B(11) форматирование дорожки, на которой находится +; магнитная головка дисковода. Форматирование производится согласно +; таблице секторов. Данные из таблицы напрямую переносятся на +; дискету, никаких проверок на их корректность не производится, +; заканчивает таблицу идентификационный байт, больший 128. Размер +; сектора выбирается согласно байту +4, заполняется сектор +; константой #00/#FF. После записи очередного сектора в байт по +; адресу, содержащемуся в регистре DE, записывается число 2Ch, а +; значение DE увеличивается на единицу. +;вх: b =#00/#40 - режим FM/MFM +; hl - таблица расположения секторов +; de - адрес рабочего буфера (6 - 7 килобайт) +x0948 call x03A2 ;установка номера дорожки для позиционирования + ld (xDDA7),de ;сохраним de + ld e,b + bit 5,(iy+#0B) + jr z,x0969 ;функции вызываются из монитора + call x092F ;вычисление размера таблицы секторов + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0969 ;память копировать не надо + push de + ld de,xEBF5 + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + pop de +;форматирование дорожки +x0969 ld b,e + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + jr z,x09B2 ;реальная дискета +; образ диска tr-dos + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),b + ld hl,xE6A9 ;очистка буфера + ld (hl),#00 + ld de,xE6A9+1 + ld bc,#00FF + ldir + pop hl + ld de,(xDDA7) +x0986 ld a,(hl) + cp #FE + ret z ;конец таблицы секторов + or a + jr nz,x09A1 ;сектор не прочитан + inc hl + inc hl + inc hl + push de + ld e,(hl) + dec e ;логический номер сектора + push hl + ld hl,xE6A9 + call x0708 ;запись сектора на образ HDD + pop hl + pop de + dec hl + dec hl + dec hl + jr nc,x09A5 ;ошибок не было +x09A1 ld a,#2B ;ошибка + jr x09A7 +x09A5 ld a,#2C ;ошибок не было +x09A7 ld (de),a + inc de + ld a,#05 + add a,l + ld l,a + jr nc,x0986 + inc h + jr x0986 +; реальная дискета +x09B2 ld de,(xDDA7) + push de + push hl + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld (hl),b + push bc + call x0824 ;позиционирование на заданную дорожку + call x0322 ;опрос Break и прерывание, если нажата + pop bc + pop hl + exx + ex (sp),hl ;hl' - адрес рабочего буфера + exx + ld c,#7F + ld e,#C0 + ld a,#F0 ;команда: запись дорожки + bit 6,b + jp nz,x0AAC ;режим MFM + +;запись дорожки в режиме FM +;вх: c=#7F +; e=#C0 +; a=#F0 + out (#1F),a ;команда запись дорожки +; индексное поле + ld d,#4E + ld b,#50 + call x0A98 ;запись #50 байт #4E (послеиндексный промежуток) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F6 + ld b,#03 + call x0A98 ;запись #03 байт #F6 (запись C2 - синхронизирующий AM) + ld d,#FC + call x0AA3 ;запись байта #FC (индексная метка) +; секторы +x09EF ld d,#4E + ld b,#32 + call x0A98 ;запись #32 байт #4E (первый пробел) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F5 + ld b,#03 + call x0A98 ;запись A1 - синхроимпульс + ld d,#FE + call x0AA3 ;запись байта #FE (адресная метка идентификатора) + inc hl + ld d,(hl) + call x0AA3 ;запись номера дорожки + inc hl + ld d,(hl) + call x0AA3 ;запись номера головки (сторона) + inc hl + ld d,(hl) + call x0AA3 ;запись номера сектора + inc hl + ld d,(hl) + call x0AA3 ;запись кода длины сектора + ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#4E + ld b,#16 + call x0A98 ;запись #16 байт #4E (второй пробел) + ld d,#00 + ld b,#0C + call x0A98 ;запись #0C байт #00 (синхропромежуток) + ld d,#F5 + ld b,#03 + call x0A98 ;запись A1 - синхроимпульс + ld d,#FB + call x0AA3 ;запись байта #FB (адресная метка данных) + ld d,#00 + ld b,c + call x0A98 ;запись #7F байт #00 (данные сектора) + call x0AA3 ;запись байта #00 (данные сектора) + ld a,(hl) + or a + jr z,x0A61 ;длина сектора 128 байт + ld b,c + call x0A98 ;запись #7F байт #00 (данные сектора) + call x0AA3 ;запись байта #00 (данные сектора) + ld a,(hl) + dec a + jr z,x0A61 ;длина сектора 256 байт + call x0A98 ;запись #100 байт #00 (данные сектора) + ld a,(hl) + rrca + jr nc,x0A61 ;длина сектора 512 байт + call x0A98 ;запись #100 байт #00 (данные сектора) + call x0A98 ;запись #100 байт #00 (данные сектора) +x0A61 ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#4E + ld b,#09 + call x0A98 ;запись #09 байт #4E (третий пробел) + inc hl + call x0AA3 ;запись байта #4E + exx + ld (hl),#2C ;признак записи сектора + inc hl + exx + call x0AA3 ;запись байта #4E + ld a,(hl) + rlca + jp nc,x09EF ;повторим, если не конец + call x0A8E ;запись байта #4E до конца дорожки + in a,(#1F) + exx + pop hl + exx + bit 6,a + ret z ;выход без ошибок + ld a,#02 + jp x04D1 ;ошибка: защита от записи + +;запись чисел D в порт C до конца дорожки +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +x0A8E in a,(#FF) + and e + jr z,x0A8E + ret m + out (c),d + jr x0A8E + +;запись B чисел D в порт C +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +; b - количество байт для записи +x0A98 in a,(#FF) + and e + jr z,x0A98 + ret m + out (c),d + djnz x0A98 + ret + +;запись числа D в порт C +;вх: e - маска для регистра состояния +; d - байт для записи +; c - порт +x0AA3 in a,(#FF) + and e + jr z,x0AA3 + ret m + out (c),d + ret + +;запись дорожки в режиме MFM +;вх: c=#7F +; e=#C0 +; a=#F0 +x0AAC out (#1F),a ;команда запись дорожки +; индексное поле + ld d,#FF + ld b,#28 + call x0A98 ;запись #28 байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 + ld d,#FC + call x0AA3 ;запись байта #FC +; секторы +x0AC1 ld d,#FF + ld b,#0C + call x0A98 ;запись #0C байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 (пробел) + ld d,#FE + call x0AA3 ;запись байта #FE (адресная метка индексных данных) + inc hl + ld d,(hl) + call x0AA3 ;запись номера дорожки + inc hl + ld d,(hl) + call x0AA3 ;запись номера головки (сторона) + inc hl + ld d,(hl) + call x0AA3 ;запись номера сектора + inc hl + ld d,(hl) + call x0AA3 ;запись кода длины сектора + ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#FF + ld b,#0B + call x0A98 ;запись #0B байт #FF + ld d,#00 + ld b,#06 + call x0A98 ;запись #06 байт #00 (второй пробел) + ld d,#FB + call x0AA3 ;запись байта #FB (адресная метка данных) + ld d,#FF + ld b,c + call x0A98 ;запись #7F байт #FF (данные сектора) + call x0AA3 ;запись байта #FF (данные сектора) + ld a,(hl) + or a + jr z,x0B25 ;длина сектора 128 байт + ld b,c + call x0A98 ;запись #7F байт #FF (данные сектора) + call x0AA3 ;запись байта #FF (данные сектора) + ld a,(hl) + dec a + jr z,x0B25 ;длина сектора 256 байт + call x0A98 ;запись #100 байт #FF (данные сектора) + ld a,(hl) + rrca + jr nc,x0B25 ;длина сектора 512 байт + call x0A98 ;запись #100 байт #FF (данные сектора) + call x0A98 ;запись #100 байт #FF (данные сектора) +x0B25 ld d,#F7 + call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) + ld d,#FF + ld b,#05 + call x0A98 ;запись #05 байт #FF (третий пробел) + inc hl + call x0AA3 ;запись байта #FF + exx + ld (hl),#2C ;признак записи сектора + inc hl + exx + call x0AA3 ;запись байта #FF + ld a,(hl) + rlca + jp nc,x0AC1 ;повторим, если не конец + call x0A8E ;запись байта #FF до конца дорожки + in a,(#1F) + exx + pop hl + exx + bit 6,a + ret z ;выход без ошибок + ld a,#02 + jp x04D1 ;ошибка: защита от записи + +;АДРЕС: #0B52 преобразование кода размера сектора в байтах в число +;вх: c[0..3] - код размера сектора в байтах +;вых: bc - размер сектора в байтах +x0B52 ld a,c + and #03 + ld b,a + inc b + ld c,#01 +x0B59 sla c + djnz x0B59 + ld b,c + srl b + ld c,#00 + srl b + rr c + ret + +;АДРЕС: #0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов +;вх: hl - адрес таблицы секторов +; e - заменяемый идентификатор +; d - устанавливаемый идентификатор +; +x0B67 bit 5,(iy+#0B) + jr z,x0B8F ;замена идентификаторов в таблице секторов + call x092F ;bc - размер таблицы секторов + call x1B45 + jr nc,x0B8F ;вся таблица в пределах [#4000..#BFFF] + push hl ;замена с переносом в буфер + push bc + push de + ld de,xE5A9 ;буфер + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + pop de + call x0B8F ;замена идентификаторов в таблице секторов + pop bc + pop de + ld hl,xE5A9 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret +x0B8F push hl + pop ix + jr x0BF5 ;замена идентификаторов в таблице секторов + +;АДРЕС: #0B94 R8DOS #0C(12) чтение дорожки. Порядок считывания определяется +; содержимым таблицы расположения секторов. Считанные сектора +; помещаются в буфер дорожки, никаких разделителей между ними не +; ставится. Сектора со значением идентификационного байта #FF или +; #FC не считываются, но в буфере для них пропускается +; соответствующее длине (байт +4) место. Если сектор не может быть +; считан, то соответствующий идентификатор в таблице заменяется на +; #FD. Идентификатор успешно считанного сектора заменяется на #FC, +; а по окончании операции все идентификаторы #FC автоматически +; переводятся в #00 +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0B94 ld a,#80 + jr x0B9A + +;АДРЕС: #0B98 R8DOS #0D(13) последовательная запись. Порядок записи определяется +; содержимым таблицы расположения секторов. Сектора, для которых значение +; идентификационного байта #FF или #FC не записываются, а в буфере +; пропускается соответствующее длине такого сектора (байт + 4) место. +; Если сектор не может быть записан, то соответствующий идентификатор в +; таблице заменяется на #FD. По окончании записи все идентификаторы #FC +; автоматически переводятся в #00. +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0B98 ld a,#A0 +x0B9A ld (xFFE1),a + ld (xFFE2),de + ld (xFFE4),de + call x03A2 ;установка номера дорожки для позиционирования + bit 5,(iy+#0B) + jr z,x0C08 ;вызов из монитора + call x092F ;вычисление размера таблицы секторов + call x1B45 ;определение необходимости копирования памяти пользователя + jr nc,x0C08 ;копировать не надо + push hl + ld de,xE5A9 + push bc + push de + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + pop hl + call x0C08 ;чтение/запись дорожки + pop bc + pop de + ld hl,xE5A9 + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + ret + +;завершение. дорожка прочитана +x0BCE pop ix + pop bc + ld hl,xFFDD + ld a,(hl) ;код ошибки + inc a + jr z,x0BEC ;ошибок не было + ld (hl),#FF + ld de,(xFFE4) ;начало буфера дорожки + ld (xFFE2),de + ld a,(xFFDC) + rlca + jr c,x0BEA ;подключен образ, повторять нет смысла + djnz x0C12 ;повторим попытку +x0BEA ld (hl),#14 +x0BEC call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе + ld a,(hl) + out (#3F),a + ld de,#00FC + +;замена идентификаторов в таблице секторов +;вх: ix - адрес таблицы секторов +; e - заменяемый идентификатор +; d - устанавливаемый идентификатор +x0BF5 ld bc,#0005 +x0BF8 ld a,(ix+0) + cp #FE + ret z ;конец таблицы + cp e + jr nz,x0C04 ;слезующий сектор + ld (ix+0),d ;заменяем идентификатор +x0C04 add ix,bc + jr x0BF8 + +;чтение/запись дорожки +;вх: hl - адрес таблицы секторов +; de - адрес буфера дорожки +x0C08 push hl + call x0824 ;позиционирование на заданную дорожку c тайм-аутом + pop ix ;адрес таблицы секторов + ld a,(xFFCB) ;количество попыток считывания при ошибке + ld b,a +x0C12 push bc + push ix +x0C15 ld a,(ix+0) + inc ix + cp #FC + jr z,x0C6F ;сектор не читаем. пропускаем место для него + cp #FF + jr z,x0C6F ;сектор не читаем. пропускаем место для него + cp #FE + jr z,x0BCE ;конец таблицы + call x0322 ;опрос Break и прерывание, если нажата + ld a,(ix+0) + out (#3F),a ;номер дорожки + ld c,(ix+3) ;код длины сектора + ld a,(xFFDC) + rlca + jr nc,x0C3E ;реальная дискета + ld a,c + cp #01 + ld a,#FD + jr nz,x0C67 ;на образе сектор может быть только 256 байт +x0C3E call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) ;адрес в буфере дорожки + ld a,(ix+2) ;номер сектора + dec a + ld e,a + push de + ld a,(xFFE1) + bit 5,a + push af + call nz,x06B4 ;запись сектора + pop af + call z,x0610 ;чтение сектора + pop de + bit 6,a ;защита от записи + push af ;!!!ОШИБКА!!! при записи состояние регистра + ld a,#02 ;состояния не сохраняется + jp nz,x04D1 ;ошибка. прерывание функции + pop af + and #1F + ld a,#FC ;признак успешной операции + jr z,x0C6C ;!!!ОШИБКА!!! при операции записи будет всегда z +x0C67 ld (xFFDD),a ;код ошибки + ld a,#FD +x0C6C ld (ix-1),a +x0C6F ld c,(ix+3) ;код размера сектора + call x0B52 ;преобразование кода размера сектора в байтах в число + ld hl,(xFFE2) ;адрес в буфере дорожки + add hl,bc + ld (xFFE2),hl + ld bc,#0004 ;следующая запись в таблице секторов + add ix,bc + jr x0C15 + +;АДРЕС: #0C83 опрос Break. cy=1 не нажата +x0C83 push hl + ld hl,x0C96 ;адрес возврата + push hl + ld hl,rom3_x3D30 ;включение rom 7 + push hl + ld hl,rom5_x0110 ;опрос Break. cy=1 не нажата x0110 + push hl + ld hl,xFFEF + ld (hl),#C9 ;ret + jp (hl) +x0C96 pop hl + ret + +;АДРЕС: #0C98 остановка контроллера ВГ93 +;вых: a - значение выведенное в порт #FF +x0C98 call x0356 ;подготовка байта для выбора заданного дисковода + and %11111011 + out (#FF),a ;сброс ВГ93 + nop + nop + nop + or #04 + out (#FF),a ;загрузка головки, сторона верхняя, метод записи + push af + ld a,#D0 + out (#1F),a ;команда прерывания + pop af + ret + +;АДРЕС: #0CAD таблица адресоф функций R8DOS +x0CAD dw x029C ;#00(0) сброс контроллера + dw x03C5 ;#01(1) выбор текущего дисковода + dw x0457 ;#02(2) позиционирование на заданный логический трек + dw x05D8 ;#03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) + dw x054E ;#04(4) повторить в случае ошибки функцию 5 (или 6) + dw x0553 ;#05(5) чтение группы секторов + dw x0557 ;#06(6) запись группы секторов + dw x084F ;#07(7) идентификация диска + dw x08D4 ;#08(8) идентификация диска для tr-dos + dw x0922 ;#09(9) установка рабочего буфера для функции 8 + dw x077F ;#0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера + dw x0948 ;#0B(11) форматирование дорожки + dw x0B94 ;#0C(12) чтение дорожки + dw x0B98 ;#0D(13) запись дорожки + dw x0502 ;#0E(14) физическое позиционирование на трек + dw x0B67 ;#0F(15) замена идентификатора в таблице расположения секторов + dw x032B ;#10(16) чтение/установка спецификации дискеты + dw x0335 ;#11(17) чтение кода спецификации дисковода + dw x0546 ;#12(18) в hl адрес таблицы с количеством секторов на дорожке + dw x02CA ;#13(19) установка режима time-out для счетчика включения двигателя дисковода + dw x11DB ;#14(20) открыть файл для последующих операций с ним + dw x1307 ;#15(21) закрыть файл, открытый функцией 20 + dw x1240 ;#16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". + dw x128C ;#17(23) запись байта в файл. Файл должен быть открыт как "логический" + dw x14C0 ;#18(24) удаление файла, адрес спецификации которого задан в регистрах hl + dw x111E ;#19(25) физический поиск файла, указанного в fcb, в каталоге диска + dw x1125 ;#1A(26) !!!ОШИБКА!!! маски, после первого поиска больше нету + dw x11B0 ;#1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + dw x1365 ;#1C(28) последовательное чтение очередного сектора из файла + dw x1395 ;#1D(29) последовательная запись одного сектора из памяти + dw x1360 ;#1E(30) последовательное считывание заданного количества секторов + dw x1390 ;#1F(31) последовательная запись заданного количества секторов + dw x1407 ;#20(32) установка нового значения указателя в файле + dw x1545 ;#21(33) чтение из fcb в bc указателя файла + dw x1E74 ;#22(34) идентификация жесткого диска + dw x187F ;#23(35) подключение раздела к драйверу HDD + dw x1B7E ;#24(36) прямое чтение секторов из подраздела жесткого диска + dw x1BC0 ;#25(37) прямая запись секторов в подраздел жесткого диска + dw x1BFE ;#26(38) Вернуть таблицу (каталог) подраздела + dw x1C2D ;#27(39) чтение/запись сектора (???ОШИБКА???) + dw x18C0 ;#28(40) подключение раздела к драйверу HDD + +;АДРЕС: #0CFF установка переменных дисковой BIOS +x0CFF ld bc,#FFBA + ld a,%11110111 ;запрет прерываний от PIC + ld (xDFF0),a + out (c),a ;регистр данных + ld bc,#7FBA ;регистр виртуальных дисководов + ld a,#FF + ld (xDFEE),a + out (c),a + ld hl,x0D1F + ld de,xFFC0 + ld bc,#0032 + ldir + ret +;переменные дисковой BIOS +x0D1F db #1A,#0F,#08,#04 ;MFM максимальное число секторов на дорожке для сектора 128/256/512/1024 + db #16,#10,#09,#05 ;FM максимальное число секторов на дорожке для сектора 128/256/512/1024 + dw #FFC0 ;адрес таблицы с количеством секторов на дорожке + db #00 ;номер текущего дисковода: 0 - дисковода А, 1 - В + db #03 ;число попыток считывания при ошибке, начальное значение 3 + db #C0,#C0,#C0,#C0 ;коды, определяющие тип дисковода (спецификацию) A/B/C/D + db #A1,#A1,#A1,#A1 ;коды, определяющие тип дискеты в дисководе А/B/C/D + db #00,#00,#00,#00 ;текущий номер дорожки для дисковода A/B/C/D + db #FF,#FF,#FF,#FF ;код time-out для дисковода А/B/C/D + db #00 ;флаги R8DOS + db #FF ;код ошибки дискового интерпретатора + ds #11,0 ;прочие переменные + db #C9 ;ret для вызова п/п опроса Break из rom 5 + dw #0000 ;адрес рабочего буфера для функции 8 + +;АДРЕС: #0D51 определение наличия SMUC +;вых: cy=1 SMUC не найден +x0D51 ld bc,#00FE + call x0E01 + jr c,x0DA1 ;SMUC не найден + ld l,a + inc bc + call x0E01 + jr c,x0DA1 + ld h,a + ret + +;АДРЕС: #0D62 определение наличия NVRAM +x0D62 call x0D51 ;определение наличия SMUC + ret c ;если SMUC отсутствует. то и NVRAM тоже + call x0DE8 + jr c,x0DA1 ;NVRAM не найден + sbc hl,de + jr z,x0D8E +x0D6F rst #30 + dw rom4_x0378 ;запись переменных в NVRAM + db #04 + ld bc,#0000 + ld a,#61 + call x0E4B ;запись числа в A в ячейку NVRAM в BC + jr c,x0DA1 + call x0DE8 + jr c,x0DA1 + call x0E72 + jr c,x0DA1 + call x0D9A + ld a,#33 ;сообщение: NVRAM checksum error + scf + ret +x0D8E ld bc,#0000 + call x0E01 + jr c,x0DA1 ;NVRAM не найден + cp #61 + jr nz,x0D6F ;контрольное значение не совпадает. перезаписываем переменные +x0D9A set 5,(iy+#1A) + ld a,#27 ;сообщение: NVRAM found + ret +x0DA1 ld a,#26 ;сообщение: NVRAM not found + scf + ret + +;АДРЕС: #0DA5 cy=1, a=#01 !!!Not Used!!! +x0DA5 ld a,#01 + scf + ret + +;АДРЕС: #0DA9 cy=1, a=#02 !!!Not Used!!! +x0DA9 ld a,#02 + scf + ret + +;АДРЕС: #0DAD чтение всей памяти NVRAM в память #7530 +x0DAD ld hl,#7530 + ld de,#0800 + ld bc,#0000 + +;АДРЕС: #0DB6 чтение данных из NVRAM +;вх: hl - адрес куда читать +; de - сколько читать +; bc - адрес в NVRAM для чтения +x0DB6 call x0E01 + jr c,x0DC4 + ld (hl),a + inc hl + inc bc + dec de + ld a,e + or d + jr nz,x0DB6 + ret +;ошибки чтения NVRAM +x0DC4 ld a,#69 ;сообщение: NVRAM R/W error + ret + +;АДРЕС: #0DC7 запись всей памяти NVRAM из памяти #7530 +x0DC7 ld hl,#7530 + ld de,#0800 + ld bc,#0000 + +;АДРЕС: #0DD0 запись данных в NVRAM +;вх: hl - адрес откуда записывать +; de - сколько читать +; bc - адрес в NVRAM для записи +x0DD0 ld a,(hl) + call x0E4B ;запись одной ячейки NVRAM + jr c,x0DC4 + inc hl + inc bc + dec de + ld a,e + or d + jr nz,x0DD0 + call x0DE8 + jr c,x0DC4 + call x0E72 + jr c,x0DC4 + ret + +x0DE8 ld de,#FFFF + ld bc,#0000 +x0DEE call x0E01 + ret c + call x220F ;суммирование байта с контрольной суммой CRC8 + inc bc + ld a,#FE + cp c + jr nz,x0DEE + ld a,#00 + cp b + jr nz,x0DEE + ret + +x0E01 push bc + exx + ex (sp),hl + exx + push hl + push de + push af + call x0F42 + call x0E91 + jr nz,x0E41 + call x0EB1 + call x0EF7 + call x0EDE + jr nz,x0E41 + call x0F2C + call x0EA5 + set 0,d + call x0EF7 + call x0EDE + jr nz,x0E41 + call x0EB8 + call x0EDE +x0E31 call x0F1C + call x0F3E + pop af + ld a,d + or a +x0E3A pop de + pop hl + exx + ex (sp),hl + exx + pop bc + ret +x0E41 call x0F1C + call x0F3E + pop af + scf + jr x0E3A + +;запись числа в A в ячейку NVRAM в BC +x0E4B push bc + exx + ex (sp),hl ;адрес в NVRAM + exx + push hl + push de + push af + ld e,a + call x0F42 + call x0E91 + jr nz,x0E41 + call x0EB1 + call x0EF7 + call x0EDE + jr nz,x0E41 + ld d,e + call x0EF7 + call x0EDE + jr nz,x0E41 + ld d,e + jr x0E31 + +;АДРЕС: #0E72 что-то пишет в NVRAM +x0E72 ld bc,#00FE + ld a,e + call x0E4B ;запись числа в A в ячейку NVRAM в BC + ret c + inc bc + ld a,d + call x0E4B ;запись числа в A в ячейку NVRAM в BC + ret c + push bc + exx + ex (sp),hl + exx + push hl + push de + push af + call x0F42 + call x0E91 + jr nz,x0E41 + jr x0E31 + +x0E91 ld l,#C8 +x0E93 call x0F2C + call x0EA5 + call x0EF7 + call x0EDE + ret z + dec l + jr nz,x0E93 + scf + ret + +x0EA5 push af + exx + ld a,h + exx + and #07 + rlca + or %10100000 + ld d,a + pop af + ret + +x0EB1 push af + exx + ld a,l + exx + ld d,a + pop af + ret + +x0EB8 push hl + ld l,#08 + and %10111111 + or %00010000 + out (c),a +x0EC1 call x0F52 + or %01000000 + out (c),a + nop + nop + in h,(c) + sla h + sla h + rl d + call x0F52 + and %10111111 + out (c),a + dec l + jr nz,x0EC1 + pop hl + ret + +x0EDE or %00010000 + out (c),a + call x0F52 + or %01000000 + out (c),a + push hl + in l,(c) + call x0F52 + and %10111111 + out (c),a + bit 6,l + pop hl + ret + +x0EF7 push hl + ld l,#08 + and %10111111 + out (c),a +x0EFE push bc + pop bc + and %11101111 + rl d + jr nc,x0F08 + or %00010000 +x0F08 out (c),a + push bc + pop bc + or %01000000 + out (c),a + call x0F52 + and %10111111 + out (c),a + dec l + jr nz,x0EFE + pop hl + ret + +x0F1C and %11101111 + out (c),a + call x0F52 + or %01000000 + out (c),a + call x0F52 + jr x0F4A +x0F2C or %01010000 + out (c),a + call x0F52 + and %11101111 + out (c),a + call x0F52 + and %10111111 + jr x0F4C +x0F3E or %00100000 + jr x0F4A +x0F42 ld bc,#FFBA + ld a,(xDFF0) + and #DF ;%11011111 +x0F4A or #50 ;%01010000 +x0F4C ld (xDFF0),a + out (c),a + ret + +x0F52 push bc + pop bc + ret + +x0F55 db #00,#08,#00,#00 ;для сравнения чисел +x0F59 db #00,#02,#00,#00 ;для сравнения чисел + +;АДРЕС: #0F5D деление de'hl'=de'hl'/bc +;вх: de'hl' - делимое +; bc - делитель +;вых: de'hl' - значение +; hl остаток от деления +; +x0F5D ld hl,#0000 + push hl + ld e,l + ld d,h + exx + ld b,#20 +x0F66 xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + rla + or a + sbc hl,bc + ex (sp),hl + ex de,hl + sbc hl,de + ex de,hl + ex (sp),hl + exx + sbc a,#00 + jr nz,x0FAD +x0F87 inc l + djnz x0F66 + inc sp + inc sp + exx + ret +x0F8E xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + rla + add hl,bc + ex (sp),hl + ex de,hl + adc hl,de + ex de,hl + ex (sp),hl + exx + sbc a,#00 + jr z,x0F87 +x0FAD djnz x0F8E + exx + add hl,bc + jr nc,x0FB4 + inc de +x0FB4 inc sp + inc sp + ret + +;АДРЕС: #0FB7 умножение dehl=de'hl' * bc +;вх: de'hl' - первый множитель +; bc - второй множитель +;вых: dehl - значение +; +x0FB7 ld hl,#0000 + push hl + ld e,l + ld d,h + exx + ld b,#20 +x0FC0 exx + xor a + rl l + rl h + rl e + rl d + exx + rl l + rl h + rl e + rl d + jr nc,x0FED + exx + add hl,bc + ld a,e + adc a,#00 + ld e,a + ld a,d + adc a,#00 + ld d,a + exx + jr nc,x0FED + ld l,a + adc a,#00 + ld l,a + ld h,a + adc a,#00 + ld h,a + jr nc,x0FED + inc de +x0FED djnz x0FC0 + exx + inc sp + inc sp + ret + +;АДРЕС: #0FF3 инкремент dehl +;вх: dehl - число +;вых: dehl=dehl + 1 +; +x0FF3 ld c,#00 + ld a,l + add a,#01 + ld l,a + ld a,h + adc a,c + ld h,a + ld a,e + adc a,c + ld e,a + ld a,d + adc a,c + ld d,a + ret + +;АДРЕС: #1003 копирование из (hl) в (de) 4х байт +x1003 push bc + push hl + push de + ld bc,#0004 + ldir + pop de + pop hl + pop bc + ret + +;АДРЕС: #100F загрузка числа в регистры из памяти +;вх: hl - адрес откуда грузим +;вых: dehl - число +x100F push hl + pop bc + ld a,(bc) + ld l,a + inc bc + ld a,(bc) + ld h,a + inc bc + ld a,(bc) + ld e,a + inc bc + ld a,(bc) + ld d,a + ret + +;АДРЕС: #101D сложение 4х байтного числа с двухбайтным +;вх: de - адрес 2х байтного числа +; hl - адрес 4х байтного числа +;вых: по адресу hl сумма этих чисел +x101D ex de,hl + push bc + xor a + ld b,#02 +x1022 ld a,(de) + adc a,(hl) + ld (de),a + inc hl + inc de + djnz x1022 + ld a,(de) + adc a,#00 + ld (de),a + inc hl + inc de + ld a,(de) + adc a,#00 + ld (de),a + pop bc + ret + +;АДРЕС: #1035 сравнение двух чисел в памяти по адресам в de и hl +;вх: de - адрес 4х байтного числа e9e7 +; hl - адрес 4х байтного числа e9eb +;вых: nz,c,m - (hl)<(de) +; nz,nc,p - (hl)>(de) +; z,nc,p - (hl)=(de) +; +x1035 push bc + ex de,hl + inc hl + inc hl + inc hl + inc de + inc de + inc de + ld a,(de) + or a + jp m,x1048 ;(de) отрицательное + xor (hl) + jp m,x1060 ;(hl) отрицательное + jr x104C +x1048 xor (hl) + jp m,x105B ;(de) отрицательное, (hl) положительное +;сравнение чисел с одинаковым знаком +x104C ld b,#04 +x104E ld a,(de) + cp (hl) + jr c,x105B ;(de)<(hl) + jr nz,x1060 + dec hl + dec de + djnz x104E + xor a + pop bc + ret +;nz,c,m - (de вх)>(hl вх) +x105B xor a + sub #01 + pop bc + ret +;nz,nc,p - (de вх)<(hl вх) +x1060 xor a + add a,#01 + pop bc + ret + +;АДРЕС: #1065 инициализация дисковода +x1065 ld hl,#0000 + ld (xDFFE),hl + ld (xE000),hl + ld a,(xFFCA) ;номер текущего дисковода +x1071 ld c,#01 + call x0229 ;R8DOS #01(1) + xor a + ld c,a + jp x0229 ;R8DOS #00(0) + +;АДРЕС: #107B инициализация дисковода и настройка на дискету +;вых: b - код, определяющий тип дискеты в дисководе +; a - код ошибки +x107B call x1065 ;инициализация дисковода + jr c,x1097 ;ошибка + ld hl,xE5A9 + ld (xFFE7),hl ;;адрес рабочего буфера для функции 8 + ld c,#08 ;идентификация диска + call x0229 ;R8DOS #08(8) + push af + call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе + ld b,(hl) + ld hl,#0000 + ld (xFFE7),hl ;адрес рабочего буфера для функции 8 + pop af +x1097 ret nc + ld a,(xFFDD) ;код ошибки дискового интерпретатора + cp #10 + scf + ld a,#3F ;дискета не соответствует формату TR-DOS + ret z + ld a,#50 ;HDD не вышел в готовность + ret + +;АДРЕС: #10A4 распознавание имени файла и занесение его в fcb +;вх: ix - адрес буфера для fcb +; hl - адрес строки, содержащей имя и тип файла в asciz +;вых: nz - успешно +; z - ошибка +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; +x10A4 ld a,(xFFCA) + ld (ix+#18),a ;номер текущего дисковода +;выделение дисковода из строки + ld c,(hl) + inc hl + ld a,":" + cp (hl) + jr nz,x10CB ;дисковод не указан + ld a,c + cp "A"-1 + jr c,x10BA ;не буква + and #5F + sub #11 +x10BA sub #30 + jr nc,x10C2 +x10BE ld a,#44 ;несуществующий дисковод + or a + ret +x10C2 cp #04 + jr nc,x10BE ;несуществующий дисковод + ld (ix+#18),a ;номер дисковода + inc hl + inc hl +x10CB ld (ix+#08),"C" ;тип файла по умолчанию + dec hl +;распознаем имя и расширение файла + push ix + pop de + ld bc,#0009 +x10D6 rst #30 + dw rom2_x0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D + db #02 + jr z,x1102 ;символ конца имент + cp #2E ;. + jr nz,x10E7 ;допустимый в имени символ + inc hl + call x110F ;проверка символа расширения файла + jr z,x10F7 ;допустимый символ расширения + dec hl ;иначе распознаем точку как символ имени файла +x10E7 ldi + jp pe,x10D6 +x10EC rst #30 ;имя и расширение заполнено + dw rom2_x0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D + db #02 + scf + ccf + ret z ;конец строки +x10F3 ld a,#45 ;ошибка в имени файла + or a + ret +x10F7 ld (ix+#08),a + call x1102 ;заполнение остатка имени пробелами + jr nz,x10F3 ;пустое имя. ошибка в имени файла + inc hl + jr x10EC ;проверка остатка строки +x1102 ld a,#09 + cp c + jr z,x10F3 ;пустое имя. ошибка в имени файла +x1107 dec c ;заполнение остатки мени пробелами + ret z + ld a," " + ld (de),a + inc de + jr x1107 +;проверка символа расширения файла +x110F ld a,(hl) + cp #23 ;# + ret z + and %11011111 + cp #43 ;C + ret z + cp #42 ;B + ret z + cp #44 ;D + ret + +;АДРЕС: #111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска +;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z +; a=#50(80) - ошибка диска +; cy=0, z - файл не найден +; cy=0, nz - файл найден и скопирован в fcb +; +x111E call x153D ;копирование дескриптора дисковода в буфер + call x107B ;инициализация дисковода + ret c ;ошибка + +;АДРЕС: #1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb !!!ОШИБКА!!! маски, после первого поиска больше нету +;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z +; a=#50(80) - ошибка диска +; cy=0, z - файл не найден +; cy=0, nz - файл найден и скопирован в fcb +; +x1125 push hl +x1126 pop hl + call x1166 ;загрузка очередного дескриптора файла в буфер + ld (ix+#19),c + ret c ;ошибка загрузки: a=#50 + ret z ;конец каталога. файл не найден +;сравнение имени файла с маской поиска + push hl + push ix + pop de + ld b,#09 +x1135 ld a,(de) + cp "?" + jr z,x113D + cp (hl) + jr nz,x1126 ;не совпало, следующее имя файла +x113D inc hl + inc de + djnz x1135 + pop hl +;файл найден. копируем дескриптор в fcb +x1142 push hl + ld bc,#0010 + push ix + pop de + ldir + pop hl + inc b ;флаг nz + ret + +;АДРЕС: #114E загрузка дескриптора файла в буфер +;вх: c - номер файла на диске +;вых: cy=1 -> a=#50 ошибка чтения диска +; hl - адрес дескриптора файла в буфере +; c - номер этого файла на диске [#00..#7F] +x114E ld hl,xDFFE + ld a,c + and %01110000 + rrca + rrca + rrca + rrca + ld (hl),a ;номер сектора + inc hl + inc a + ld (hl),a ;номер следующего сектора + inc hl + ld a,c + and #0F + dec a + ld (hl),a ;номер записи в секторе + dec hl + ld a,(hl) + jr x1177 + +;АДРЕС: #1166 загрузка очередного дескриптора файла в буфер +;вых: cy=1 -> a=#50 ошибка чтения диска +; cy=0, z - конец каталога. файл не найден +; cy=0, nz - дескриптор найден +; hl - адрес дескриптора файла в буфере +; c - номер этого файла на диске [#00..#7F] +x1166 ld hl,xDFFE + ld a,(hl) + inc a + inc hl + cp (hl) + inc hl + jr z,x1182 ;сектор уже загружен + ld (hl),#FF ;сброс номера дескриптора файла + cp #09 + ret nc ;выход. конец каталога + dec hl + ld (hl),a ;номер следующего сектора +x1177 inc hl + push hl + ld e,a + dec e ;e - номер сектора + call x1567 ;чтение одного сектора нулевой дорожки в буфер + pop hl + ld a,#50 + ret c ;ошибка +x1182 ld a,(hl) + inc a + cp #10 + jr c,x118D ;следующий номер дескриптора файла в загруженном секторе + dec hl ;нет больше записей в загруженном секторе + dec hl + inc (hl) + jr x1166 ;грузим следующий сектор +x118D ld (hl),a ;номер дескриптора файла в загруженном секторе [#0..#F] + rlca + rlca + rlca + rlca + ld hl,xE5A9 ;буфер загруженного сектора + call x11AB ;hl=hl+a*#10 (адрес дескриптора файла) + ld a,(xDFFE) ;номер загруженного сектора [#01..#10] + rlca + rlca + rlca + rlca + ld c,a + ld a,(xE000) ;номер дескриптора файла в загруженном секторе [#0..#F] + or c + ld c,a ;номер дескрптора файла на диске [#00..#7F] + inc a ;установка флага nz + ret + +;АДРЕС: #11A7 получение адреса байта в буфере dma +;вх: c - смещенеи в буфере +x11A7 call x1553 ;чтение из fcb в hl адреса буфера dma + ld a,c +x11AB add a,l + ld l,a + ret nc + inc h + ret + +;АДРЕС: #11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) +;вх: hl - адрес строки имени файла в asciz +; ix - адрес буфера создаваемого fcb +; de - адрес буфера dma +; b - способ открытия +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: +; a=#4A(74) - неверный тип файла +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; ix - адрес буфера fcb +; +x11B0 push bc ;очищаем блок fcb + push ix + ex (sp),hl + ld b,#1C + xor a +x11B7 ld (hl),a + inc hl + djnz x11B7 + pop hl + pop bc + ld (ix+#15),e ;адрес буфера + ld (ix+#16),d + ld (ix+#17),b ;способ открытия + ld a,#03 ;проверка типа открытия файла + and b + ld a,#4A + ccf + ret z + call x10A4 ;распознавание имени файла и занесение его в fcb + scf + ret nz ;ошибка распознавания + or a + ret + +;АДРЕС: #11D4 открыть файл(для нужд монитора) для последующих операций с ним +x11D4 ld de,xE8A9 ;адрес буфера dma + ld ix,xE7A9 ;адрес буфера для fcb + +;АДРЕС: #11DB R8DOS #14(20) открыть файл для последующих операций с ним +;вх: ix - адрес буфера для fcb +; hl - адрес строки, содержащей имя и тип файла в asciz +; de - адрес буфера dma +; b - способ открытия +; 2,b =1 обмен целыми секторами "физический" файл +; (если сброшен - обмен будет вестись байтами "логический" файл) +; 1,b =1 файл для записи +; 0,b =1 файл для чтения +; 0-1,b=11 файл для модификации +;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: +; a=#47(71) - нельзя открыть существующий файл только для записи +; a=#48(72) - нельзя создать файл только для чтения +; a=#49(73) - нет места на диске +; a=#4A(74) - неверный тип файла +; a=#44(68) - несуществующий номер устройства +; a=#45(69) - ошибка в имени файла +; cy=0 - успешно +; bc - длина файла в байтах +; +x11DB call x11B0 ;разбор спецификации файла + ret c ;ошибка + +;АДРЕС: #11DF открыть файл для последующих операций с ним +x11DF call x111E ;поиск файла на диске по имени в fcb + ret c ;ошибка чтения диска + jr z,x1200 ;файл не найден + bit 0,(ix+#17) ;файл найден + ld a,#47 + scf + ret z ;нельзя открыть существующий файл только для записи + xor a + bit 2,(ix+#17) + jr nz,x11FB ;обмен секторами + ld c,(ix+#0B) + ld b,(ix+#0C) ;bc - длина файла + ret +x11FB ld c,a + ld b,(ix+#0D) ;bc - длина файла (кратна сектору) + ret +x1200 bit 1,(ix+#17) ;файл не найден + ld a,#48 + scf + ret z ;нельзя создать файл только для чтения + call x107B + ret c ;ошибка чтения/записи + ld a,(xE5A9+#E4) ;xE68D количество файлов на дискете + ld (ix+#19),a ;номер файла на дискете + cp #80 + ld a,#49 + ccf + ret c ;нет места на диске + ld bc,(xE5A9+#E5) ;xE68E кол-во свободных секторов + ld a,c + or b + ld a,#49 + ccf + ret z ;нет места на диске + ld a,b + or a + jr z,x1228 + ld c,#FF +x1228 ld (ix+#1B),c ;максимальный объем файла в секторах + ld hl,(xE5A9+#E1) ;xE68A номер первой свободной дорожки и сектора + ld (ix+#0E),l ;сектор + ld (ix+#0F),h ;дорожка + ld a,b + or a + jr nz,x123C + ld b,c + ld c,#00 ;максимальный размер файла в байтах + ret +x123C ld bc,#FFFF ;!!!ОШИБКА!!! должно быть ld bc,#FF00 + ret + +;АДРЕС: #1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". +;вх: ix - адрес буфера fcb +;вых: cy=1 были ошибки +; a - код ошибки возвращается в аккумуляторе +; a - очередной считанный байт (при cy=0) +x1240 ld c,(ix+#17) + bit 0,c + ld a,#4A + scf + ret z ;ошибка. файл открыт на запись + bit 2,c + call x1545 ;чтение из fcb в bc указателя файла + jr nz,x125E ;файл открыт как физический (чтение целых секторов) + call x154C ;чтение из fcb в hl длины файла + or a + sbc hl,bc + jr z,x125A + jr nc,x125E +x125A scf ;ошибка. конец файла + ld a,#46 + ret +x125E ld a,c + or a + jr nz,x126C ;указатель не в начале сектора + ld a,b + cp (ix+#0D) + jr nc,x125A ;ошибка. конец файла + call x1472 ;чтение сектора в буфер dma + ret c ;ошибка чтения +x126C call x11A7 ;получение адреса байта в буфере dma + ld a,(hl) + ld (ix+#1A),a + ld a,#FF + cp c + jr nz,x1287 ;еще не конец сектора + ld a,(ix+#17) + bit 1,a + jr z,x1287 ;файл открыт для чтения + bit 7,a + jr z,x1287 ;файл не был изменен + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи +x1287 ld a,(ix+#1A) + jr x12FE ;установка в fcb нового указателя в файле из bc + +;АДРЕС: #128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" +;вх: ix - адрес буфера fcb +; a - байт для записи +;вых: cy=1 были ошибки +; a - код ошибки возвращается в аккумуляторе +x128C ld (ix+#1A),a + call x1545 ;чтение из fcb в bc указателя файла + ld e,(ix+#17) + bit 1,e + ld a,#4A ;!!!ОШИБКА!!! не устанавливается cy + ret z ;ошибка. файл открыт на чтение + bit 0,e + jr z,x12B8 ;файл открыт только на запись + bit 2,e ;обмен целыми секторами "физический" файл + jr nz,x12B8 ;запись байта в файл + call x154C ;чтение из fcb в hl длины файла + or a + sbc hl,bc + jr z,x12AC ;ошибка #46. конец файла + jr nc,x12B8 ;запись байта в файл +x12AC bit 7,e + jr z,x12B4 ;изменение в файле не было + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи + +;код ошибки #46. конец файла +x12B4 ld a,#46 + scf + ret + +;запись байта в файл +x12B8 ld a,c + or a + jr nz,x12EA ;указатель не в начале сектора + bit 0,e + jr nz,x12DB ;файл открыт для модификации + ld a,b + cp (ix+#1B) + jr nc,x12D3 ;попытка записи после конца файла + ld a,(ix+#0D) + cp #FF + jr nz,x12E7 ;увеличение размена файла на один сектор + call x1329 ;создание записи в каталоге диска + ret c ;ошибка записи + jr x12B4 ;ошибка #46. конец файла + +;ошибка #49. попытка записи после конца файла +x12D3 call x1329 ;создание записи в каталоге диска + ret c + ld a,#49 ;ошибка #49. попытка записи после конца файла + scf + ret +x12DB ld a,b + cp (ix+#0D) + jr nc,x12B4 ;ошибка #46. конец файла + call x1472 ;чтение сектора в буфер dma + ret c ;ошибка чтения + jr x12EA + +x12E7 inc (ix+#0D) ;увеличим размер файла в секторах +x12EA call x11A7 ;получение адреса байта в буфере dma + ld a,(ix+#1A) + ld (hl),a ;запись файла в буфер + set 7,(ix+#17) ;файл был изменен, но не сохранен + ld a,c + cp #FF + jr nz,x12FE ;установка в fcb нового указателя в файле из bc + call x1484 ;сохранение буфера dma в файл + ret c ;ошибка записи +x12FE inc bc + +;АДРЕС: #12FF установка в fcb указателя в файле из bc +x12FF ld (ix+#13),c + ld (ix+#14),b + or a + ret + +;АДРЕС: #1307 R8DOS #15(21) закрыть файл, открытый функцией 20. При закрытии +; файла происходит дозапись (при необходимости) информации из +; открытых буферов +;вх: ix - адрес буфера fcb +;вых: cy=1 - были ошибки +; a - код ошибки +x1307 call x1545 ;чтение из fcb в bc указателя файла + ld a,c + or b + jr z,x130F ;файл пустой + dec bc +x130F call x12FF ;установка в fcb указателя в файле из bc + ld a,(ix+#17) + bit 1,a + ret z ;файл только для чтения + bit 7,a + jr z,x1320 ;не сохраненных изменений нет + call x1484 ;сохранение буфера dma в файл + ret c ;была ошибка +x1320 bit 0,(ix+#17) + ret nz ;файл для модификации + call x1545 ;чтение из fcb в bc указателя файла + inc bc + +;создание записи в каталоге диска +;вх: bc - длина файла в байтах +x1329 call x1440 ;сохранение из bc в fcb длины файла в байтах и секторах + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c + call x107B ;чтение в буфер служебного сектора + ret c + ld a,(xE5A9+#E4) ;xE68D + inc a + ld (xE5A9+#E4),a ;xE68D количество файлов +1 + ld hl,(xE5A9+#E5) ;xE68E + ld c,(ix+#0D) + ld b,#00 + or a + sbc hl,bc + ld (xE5A9+#E5),hl ;xE68E оставшееся свободное место в секторах + ld b,c + call x14A6 ;расчет нового номера дорожки и сектора + ld (xE5A9+#E1),de ;xE68A первая свободная дорожка и сектор + ld de,#0008 ;запишем служебный сектор +;запись буфера на диск (d - дорожка, e - сектор) +x1354 ld hl,xE5A9 +x1357 ld bc,#0106 + call x0229 + ld a,#50 + ret + +;АДРЕС: #1360 R8DOS #1E(30) последовательное считывание заданного количества +; целых секторов. Функция 30 (R_MS) подобна многократному +; выполнению функции #1C(28), с той лишь разницей, что значение, +; указанное в поле dma не изменяется. В случае ошибки полагается, +; что все сектора не считались +;вх: ix - адрес буфера fcb +; b - число считываемых секторов +;вых: cy=1 если были ошибки +; a - код ошибки + +x1360 ld (ix+#1A),b + jr x1369 + +;АДРЕС: #1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла, +; содержимое сектора размещается в памяти с адреса, указанного полем +; dma в блоке управления файлом (fcb). Для обеспечения максимальной +; скорости выполнения операции Файл должен быть открыт как +; "физический". Если файл был в режиме "логический" и если +; предварительно был считан байт (т. е. счетчик указывает не на +; границу целого сектора) подфункцией будет "пересчитан" текущий +; сектор. Максимальный номер сектора - 254. +;вх: ix - адрес буфера fcb +;вых: cy=1 если были ошибки +; a - код ошибки +x1365 ld (ix+#1A),#01 +x1369 bit 0,(ix+#17) + ld a,#4A + scf + ret z ;ошибка. файл открыт на запись + call x1545 ;чтение из fcb в bc указателя файла + ld c,#00 + ld a,b + add a,(ix+#1A) + jp c,x12B4 ;ошибка #46. конец файла + dec a + cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла + call x148D ;чтение секторов в буфер dma + ret c ;ошибка чтения +x1388 ld a,b + add a,(ix+#1A) + ld b,a + jp x12FF ;установка в fcb нового указателя в файле из bc + +;АДРЕС: #1390 R8DOS #1F(31) последовательная запись заданного количества +; секторов. Подфункция 31 (W_MS) подобна многократному выполнению +; подфункции #1D(29), с той лишь разницей, что значение, указанное +; в поле dma не изменяется. В случае ошибки полагается, что все +; сектора, принимавшие участие в операции получили случайные +; значения. +;вх: ix - адрес буфера fcb +; b - число записываемых секторов +;вых: cy=1 если были ошибки +; a - код ошибки +x1390 ld (ix+#1A),b + jr x1399 + +;АДРЕС: #1395 R8DOS #1D(29) последовательная запись одного сектора из памяти с +; адреса, указанного полем dma в блоке управления файлом (fcb), в +; файл +;вх: ix - адрес буфера fcb +;вых: cy=1 если были ошибки +; a - код ошибки +x1395 ld (ix+#1A),#01 +x1399 ld e,(ix+#17) + bit 1,e + ld a,#4A + ret z ;!!!ОШИБКА!!! cy не установлен + call x1545 ;чтение из fcb в bc указателя файла + ld c,#00 + ld a,b + add a,(ix+#1A) + jp c,x12B4 ;ошибка #46 конец файла + dec a + bit 0,e + jr nz,x13BA ;файл открыт на модификацию + cp (ix+#1B) + jp nc,x12D3 ;ошибка #49. попытка записи после конца файла + jr x13C0 +x13BA cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла +x13C0 call x1498 ;запись секторов из буфера dma + ret c ;ошибка записи + bit 0,(ix+#17) + jr nz,x1388 ;файл для модификации + ld a,(ix+#0D) + add a,(ix+#1A) + ld (ix+#0D),a ;новый размер файла + jr x1388 + +;АДРЕС: #13D5 создание записи в каталоге диска (на основе fcb) +x13D5 call x153D ;копирование дескриптора дисковода в буфер + ld b,#04 + ld d,#00 + ld e,(ix+#19) ;номер файла на диске +x13DF sla e + rl d + djnz x13DF ;de - адрес дескриптора в каталоге диска + push de + ld e,d + call x1567 ;чтение одного сектора нулевой дорожки в буфер (e - номер сектора) + pop de + ld a,#50 + ret c ;ошибка чтения + push de + ld d,#00 + ld hl,xE5A9 + add hl,de ;адрес дескриптора в буфере + ex de,hl + ld bc,#0010 + push ix + pop hl + ldir ;копируем дескриптор файла из fcb в буфер + pop de + ld e,d + ld d,#00 + jp x1354 ;запись буфера на диск (дорожка 0, e - сектор) + +;АДРЕС: #1405 установка нового значения указателя в файле +;вх: ix - адрес буфера fcb +; bc - новое значение указателя +;вых: cy=1 - если были ошибки +; a - код ошибки +x1405 ld e,c + ld d,b + +;АДРЕС: #1407 R8DOS #20(32) установка нового значения указателя в файле +;вх: ix - адрес буфера fcb +; de - новое значение указателя +;вых: cy=1 - если были ошибки +; a - код ошибки +x1407 call x1545 ;чтение из fcb в bc указателя файла + ld a,(ix+#17) + bit 0,a + jr nz,x1419 ;файл для чтения + ex de,hl + add hl,bc + ex de,hl + jr nc,x1419 ;нет переполнения + ld a,#46 ;ошибка #46 конец файла + ret +x1419 bit 1,a + jr z,x144F ;файл только для чтения + ld a,d + cp b + jr z,x142D ;новый указатель в пределах текущего сектора + bit 7,(ix+#17) + jr z,x142D ;не сохраненных изменений в файле нет + push de + call x1484 ;сохранение буфера dma в файл + pop de + ret c ;ошибка записи +x142D bit 0,(ix+#17) + jr nz,x144F ;файл открыт на модификацию + ld a,d + cp (ix+#1B) ;максимальный объем файла в секторах + jp nc,x12B4 ;ошибка #46 конец файла + ld b,d + ld c,e + call x12FF ;установка в fcb указателя в файле из bc + inc bc + +;сохранение из bc в fcb длины файла в байтах и секторах +x1440 ld (ix+#0B),c + ld (ix+#0C),b ;длина файла в байтах + ld a,c + or a + jr z,x144B + inc b +x144B ld (ix+#0D),b ;длина файла в секторах + ret + +;файл только для чтения +x144F bit 2,(ix+#17) + jr z,x145E ;обмен байтами "логический" файл + ld a,d + cp (ix+#0D) + jp nc,x12B4 ;ошибка #46. конец файла + jr x146A +x145E call x154C ;чтение из fcb в hl длины файла + push de + ex de,hl + or a + sbc hl,de + pop de + jp nc,x12B4 ;ошибка #46. конец файла +x146A ld c,e + ld b,d ;новый указатель + call x12FF ;установка в fcb указателя в файле из bc + ld a,c + or a + ret z + +;АДРЕС: #1472 чтение сектора в буфер dma +x1472 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld bc,#0105 + +;запись/чтение сектора +x1479 call x0229 + pop bc + ld a,#50 + res 7,(ix+#17) + ret + +;АДРЕС: #1484 сохранение буфера dma в файл +;вх: bc - указатель из fcb +x1484 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld bc,#0106 + jr x1479 ;запись сектора + +;АДРЕС: #148D чтение секторов в буфер dma +;вх: bc - указатель в файле +x148D push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld c,#05 +x1493 ld b,(ix+#1A) + jr x1479 ;чтение секторов + +;АДРЕС: #1498 запись секторов из буфера dma +x1498 push bc + call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) + ld c,#06 + jr x1493 + +;АДРЕС: #14A0 расчет адреса в файле на диске (дорожка и сектор) +;вх: bc - указатель в файле +;вых: d - дорожка +; e - сектор +x14A0 call x153D ;копирование дескриптора дисковода в буфер + call x1553 ;чтение из fcb в hl адреса буфера dma + +;АДРЕС: #14A6 расчет нового номера дорожки и сектора +;вх: b - кол-во секторов +;вых: d - новый номер дорожки +; e - новый номер сектора +x14A6 ld a,b + and #F0 + rrca + rrca + rrca + rrca + add a,(ix+#0F) ;+номер начальной дорожки файла + ld d,a ;новый номер дорожки + ld a,b + and #0F + add a,(ix+#0E) ;+номер первого сектора файла + bit 4,a + jr z,x14BC + inc d +x14BC and #0F + ld e,a ;новый номер сектора + ret + +;АДРЕС: #14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl +;вх: ix - адрес буфера для fcb +; hl - имя и тип в asciz +;вых: cy=1 - были ошибки +; a - код ошибки +x14C0 ld b,#01 + call x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) + ret c ;были ошибки + call x111E ;R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска + ret c ;были ошибки + ld a,#48 ;ошибка #48 файл не найден + scf + ret z + push hl + ld hl,xE6A9 + ld bc,#0105 + ld de,#0008 + call x0229 ;чтение служебного сектора + pop hl + ld a,#50 + ret c ;ошибка #50. диск не вышел в готовность + ld a,(xE6A9+#E4) + dec a + cp (ix+#19) + jr z,x14FD ;этот файл последный на диске + ld hl,xE6A9+#F4 + inc (hl) ;количество удаленных файлов +1 + ld (ix+#00),#01 ;признак удаленного файла + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c ;ошибка записи +x14F4 ld hl,xE6A9 + ld de,#0008 + jp x1357 ;запись служебного сектора на диск +;удаляемый файл последний в каталоге +x14FD ld hl,xE6A9+#E4 + dec (hl) ;количество файлов -1 + ld e,(ix+#0D) + ld d,#00 ;объем удаляемого файла в секторах + ld hl,(xE6A9+#E5) ;количество свободных секторов + add hl,de + ld (xE6A9+#E5),hl ;новое количество свободных секторов + ld l,(ix+#0E) + ld h,(ix+#0F) + ld (xE6A9+#E1),hl ;номер первой свободной дорожки и сектора + ld (ix+#00),#00 ;признак удаленного файла + call x13D5 ;создание записи в каталоге диска (на основе fcb) + ret c ;ошибка записи + ld c,(ix+#19) + ld a,c + or a + jr z,x14F4 ;файл первый на диске + dec c + ld (ix+#19),c + call x114E ;загрузка дескриптора файла в буфер + ret c ;ошибка чтения + call x1142 ;копируем дескриптор в fcb + ld a,(ix+#00) + cp #02 + jr nc,x14F4 ;файл существует. запись служебного сектора на диск + ld hl,xE6A9+#F4 ;файл удален + dec (hl) + jr x14FD + +;АДРЕС: #153D копирование дескриптора дисковода в буфер +x153D ld a,(ix+#18) ;номер дисковода + rst #30 + dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, + db #02 ;если к нему примонтирован образ + ret + +;АДРЕС: #1545 R8DOS #21(33) чтение из fcb в bc указателя файла +;вх: ix - адрес буфера fcb +;вых: bc - текущее значение указателя +x1545 ld c,(ix+#13) + ld b,(ix+#14) + ret + +;АДРЕС: #154C чтение из fcb в hl длины файла +x154C ld l,(ix+#0B) + ld h,(ix+#0C) + ret + +;АДРЕС: #1553 чтение из fcb в hl адреса буфера dma +x1553 ld l,(ix+#15) + ld h,(ix+#16) + ret + +;АДРЕС: #155A чтение заголовка первого попавшегося сектора дисковода A +x155A xor a + call x1071 ;инициализация дисковода A + call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу + ret nz ;к дисководу A подключен образ + ld a,#C4 + out (#1F),a ;чтение заголовка сектора + ret + +;АДРЕС: #1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) +x1567 ld d,#00 ;дорожка 0 + ld hl,xE5A9 ;буфер + ld bc,#0105 + jp x0229 ;R8DOS #05(5) + +;АДРЕС: #1572 определение наличия interrupt controller +x1572 ld bc,#FFBA + ld a,(xDFF0) ;состояние порта #FFBA + and #F7 + out (c),a + ld (xDFF0),a + ld bc,#7EBE + ld a,#F3 + out (c),a + nop + ld b,#7F + ld a,#C5 + out (c),a + nop + ld a,#01 + out (c),a + nop + nop + in a,(c) + or a + jr z,x15A1 + cp #01 + jr z,x15A5 +x159D ld a,#24 ;сообщение: interrupt controller not found + scf + ret +x15A1 set 4,(iy+#1B) +x15A5 ld b,#7E + ld a,#F2 + out (c),a + nop + ld b,#7F + ld a,#C5 + out (c),a + nop + ld a,#FF + out (c),a + nop + nop + in a,(c) + cp #FF + jr nz,x159D + set 4,(iy+#1A) + xor a + ld a,#25 ;сообщение: interrupt controller found + ret + +;АДРЕС: #15C7 определение наличия последовательного порта/модема +;#28 modem not found +;#29 modem found +;#2A serial port not found +x15C7 ld bc,#FFBA + ld a,(xDFF0) ;состояние порта #FFBA + or %00000110 + and %01111110 + out (c),a + push bc + ld b,#0F + djnz $ + pop bc + or %00000001 + ld (xDFF0),a ;состояние порта #FFBA + out (c),a + ld b,#6B + djnz $ + ld hl,xEA9D + xor a + or (hl) + jr nz,x15F6 + ld de,x169A ;сброс модема + push hl + ex de,hl + ld bc,#0007 + ldir + pop hl +x15F6 call x1601 + ret c + set 5,(iy+#1A) + ld a,#29 ;сообщение: modem found + ret +; передача команды модему +x1601 ld bc,#7AFE ;hl=xEA9D + in a,(c) + cp #FF + jr nz,x160E +x160A ld a,#2A ;сообщение: serial port not found + scf + ret +x160E ld a,(hl) + bit 6,a + jr z,x1647 + and #1F + or #80 + ld b,#7B + out (c),a + nop + in e,(c) + cp e + jr nz,x160A ;нет порта + inc hl + ld a,(hl) + dec hl + and #0F + cp #0C + jr c,x162C + ld a,#05 +x162C add a,a + ld e,a + ld d,#00 + push hl + ld hl,x16A1 + add hl,de + ld b,#78 + ld a,(hl) + out (c),a + inc hl + ld a,(hl) + inc b + out (c),a + pop hl + ld a,(hl) + and #1F + ld b,#7B + out (c),a +x1647 bit 5,(hl) + jr z,x1658 + inc hl + ld a,(hl) + dec hl + and #F0 + rlca + rlca + rlca + rlca + ld b,#79 + out (c),a +x1658 or a + bit 7,(hl) + ret z + inc hl +x165D inc hl + ld a,(hl) + or a + ret z + cp #7C + jr nz,x166D + ld a,#0D + call x1673 ;передача команды модему (в com порт) + ret c + ld a,#0A +x166D call x1673 ;передача команды модему (в com порт) + ret c + jr x165D +; передача команды модему (в com порт) +x1673 push hl + push af + ld hl,#0814 ;счетчик попыток + ld bc,#00FE +x167B push bc + ld b,#05 + in a,(c) + pop bc + bit 5,a + jr nz,x1692 + djnz x167B + dec hl + ld a,h + or l + jr nz,x167B + pop af + pop hl + ld a,#28 ;modem not found + scf + ret +x1692 pop af + ld b,#78 + out (c),a + or a + pop hl + ret +x169A db %11100011,#05,"ATZ",#7C,#00 ;команда сброса модема +x16A1 db #10,#04 ;#00 + db #00,#03 ;#01 + db #80,#01 ;#02 + db #C0,#00 ;#03 + db #60,#00 ;#04 + db #30,#00 ;#05 + db #18,#00 ;#06 + db #0C,#00 ;#07 + db #06,#00 ;#08 + db #03,#00 ;#09 + db #02,#00 ;#0A + db #01,#00 ;#0B + +;АДРЕС: #16B9 работа с контроллером прерываний +x16B9 ld hl,x1764 + ld de,#9C40 + ld bc,#0003 + ldir + di + ld a,#01 + ld hl,#9C40 + call x175D ;вызов процедуры из основной памяти + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + ld bc,#7EBE + ld a,#1A + out (c),a + nop + ld b,#7F + ld a,#F8 + out (c),a + nop + ld a,#FE + out (c),a + nop + ld b,#0A + ld a,#26 ;%00100110 + call x1FDD ;запись данных в ячейку CMOS + ld b,#0B + ld a,#D6 ;%11010110 + call x1FDD ;запись данных в ячейку CMOS + ld b,#0B + ld a,#56 ;%01010110 + call x1FDD ;запись данных в ячейку CMOS + xor a + ld i,a + im 2 + xor a + ld (#7530),a + ld bc,#FFBA + ld a,(xDFF0) + or #08 + out (c),a + ld (xDFF0),a + ei +x171A halt + ld a,(#7530) + or a + jr z,x171A + di + ld a,#05 + ld hl,x9C40 + call x175D ;вызов процедуры из основной памяти + ld bc,#FFBA + ld a,(xDFF0) + and #F7 + out (c),a + ld (xDFF0),a + ret + +;АДРЕС: #1738 работа с контроллером прерываний +x1738 di + ld bc,#7FBE + ld a,#00 + out (c),a + ld bc,#FFBA + ld a,(xDFF0) + or #08 + out (c),a + ld (xDFF0),a + xor a + ld i,a + im 2 +x1752 ei + ld a,(xDFF0) + bit 3,a + jr nz,x1752 + ret + jr $ + +;вызов процедуры из основной памяти +;вх: hl - адрес процедуры +x175D push hl + ld hl,rom3_x3D30 + ex (sp),hl + push hl + ret + +;установка бордюра +x1764 out (#FE),a + ret + db #00 + +;АДРЕС: #1768 поиск раздела MFS +;вых: cy=1 раздел не найден +; dehl=#00000000 +; cy=0 раздел найден +; bc - адрес дескриптора раздела MFS в буфере +; dehl - смещение первого сектора раздела +x1768 push ix + call x1791 ;hl=de=#0000 (нулевой сектор) + ld (iy+#31),#01 ;число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) + call x1D73 ;чтение нулевого сектора с винчестера в буфер xE5A9 + jp c,x178E ;ошибка чтения + call x1797 ;поиск раздела MFS в MBR + jr c,x178E ;раздел не найден + ld l,(ix+#08) + ld h,(ix+#09) + ld e,(ix+#0A) + ld d,(ix+#0B) ;dehl - смещение первого сектора радела + push ix + pop bc + pop ix + ret +x178E pop ix + scf +;hl=de=#0000 +x1791 ld hl,#0000 + ld e,l + ld d,l + ret +;поиск раздела MFS в MBR +; cy=1 раздел MFS не найден +x1797 ld hl,(xE5A9+#1FE) ;xE7A7 + ld de,#AA55 ;сигнатура (55h AAh) + or a + sbc hl,de + jr nz,x17B7 ;сигнатура отсутствует: MBR отсутствует +x17A2 ld b,#04 + ld ix,xE5A9+#1BE ;xE767 начало дескрипторов разделов HDD +x17A8 ld a,#53 ;код типа раздела MFS + cp (ix+#04) + jr nz,x17B0 + ret +x17B0 ld de,#0010 + add ix,de ;дескриптор следующего раздела + djnz x17A8 +x17B7 ld a,#63 + scf + ret + +;АДРЕС: #17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: cy=1 была ошибка +x17BB push ix + push de + push hl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5 ;грузим первый сектор раздела MFS + call x1D78 ;чтение сектора с винчестера в буфер ix + pop hl + pop de + jr c,x17EB ;ошибка загрузки + call x0FF3 ;инкремент dehl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5+#200 ;грузим втоорой сектор раздела MFS + call x1D78 ;чтение сектора с винчестера в буфер ix + jr c,x17EB ;ошибка загрузки + ld hl,(xEBF5+#3FE) ;xEFF3 сравнение ситгнатуры + ld de,#AA54 + sbc hl,de + ld a,#63 + jr nz,x17EB ;сигнатуры нет + pop ix + ret +x17EB scf ;ошибка + pop ix + ret + +;АДРЕС: #17EF запись 2х секторов из буфера xEBF5 +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x17EF push ix + push de + push hl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5 ;буфер + call x1D4A ;запись сектора из буфера ix на винчестер + pop hl + pop de + jr c,x17EB ;ошибка + call x0FF3 ;инкремент dehl + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ld ix,xEBF5+#200 ;вторй сектор + call x1D4A ;запись сектора из буфера ix на винчестер + jr c,x17EB ;ошибка + pop ix + ret + +;АДРЕС: #1813 чтение сектора с винчестера +;вх: hl - адрес буфера для чтения +; de - смещение от начала образа в секторах (512b) +1 +;вых: hl - адрес буфера для чтения +; cy=1 были ошибки. код ошибки в A +x1813 push hl + call x1848 ;расчет номера сектора на винчестере + ;dehl - смещение в секторах (512b) от начала винчестера до нужного сектора + jr c,x1827 ;ошибка: адрес за пределами образа диска + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ex (sp),ix + call x1D78 ;чтение сектора с винчестера в буфер ix + pop ix + ret nc ;ошибок не было + ld a,#04 + ret +x1827 pop hl ;ошибка: адрес за пределами образа диска + ret + +;АДРЕС: #1829 запись сектора на винчестер +;вх: hl - адрес буфера для записи +; de - смещение от начала образа в секторах (512b) +;вых: hl - адрес буфера для записи +; cy=1 были ошибки. код ошибки в A +x1829 ld a,(xE590) + and %00100000 + jr nz,x1844 ;защита от записи + push hl ;адрес буфера для записи + call x1848 ;расчет номера сектора на винчестере + jr c,x1827 ;ошибка: адрес за пределами образа диска + call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + ex (sp),ix ;адрес буфера для записи + call x1D4A ;запись сектора из буфера ix на винчестер + pop ix + ret nc ;нет ошибок записи + ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 + ret +x1844 ld a,#02 ;код ошибки: попытка записи на защищенную дискету + scf + ret + +;АДРЕС: #1848 расчет номера сектора на винчестере +;вх: de - смещение от начала образа до нужного сектора в секторах (512b) +;вых: cy=1 ошибка: адрес за пределами образа диска +; =0 dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x1848 ld (xE9E7),de ;смещение до нужного сектора + ld de,xE9EB ;адрес числа + push de + ld hl,xE590+#01 ;смещение образа от начала HDD + call x1003 ;копирование из (hl) в (de) 4х байт + pop hl + ld de,xE9E7 + call x101D ;(hl)=(hl)+(de) сложение 4х байтного числа с двухбайтным + ld de,xE9E7 + ld hl,xE590+#05 ;смещение от начала HDD до последнего(служебного) сектора образа + push hl + call x1003 ;копирование из (hl) в (de) 4х байт + pop de + ld hl,xE9EB ;смещение в секторах (512b) от начала винчестера до нужного сектора + call x1035 ;сравнение двух чисел + jr z,x1873 ;(hl)=(de) + jp p,x187B ;(hl)>(de) ошибка +x1873 ld hl,xE9EB ;(hl)<(de) + call x100F ;загрузка числа в регистры из памяти + or a + ret +x187B ld a,#22 ;код ошибки: адрес за пределами образа диска + scf + ret + +;АДРЕС: #187F R8DOS #23(35) подключение раздела к драйверу HDD +;вх: 1-0,a - номер дисковода +; 2,a =0 +; 6,a =1 отключить подраздел от драйвера +; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек +; 3,a =1 подключение по имени, адрес имени в памяти в DE +; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела +;вых: cy=1 ошибка +; cy=0 ошибок не было +; 4,(hl) =1 +x187F call x18C0 ;вых: при 4,a=1 -> hl=xE5A5 + ;вых: при 4,a=0 -> hl=как при входе + ret c ;были ошибки + push af + ld c,#11 + set 4,(hl) ;!!!ОШИБКА!!! портится память + pop af + ret + +;АДРЕС: #188A установка кода, определяющий тип дисковода без образа по номеру в С +x188A xor a + ld (xE590),a ;реальный дисковод + ld e,#C0 + bit 1,c + jr z,x1895 ;это дисковод A/B + ld e,a +x1895 call x1A0E ;hl адрес кода, определяющий тип дисковода по номеру в С + ld (hl),e + ret + +;АДРЕС: #189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +;вх: de - адрес дескриптора дисковода +x189A bit 5,(iy+#1C) + jp nz,x1B00 ;ошибка #67. нет винчестера + ld hl,xE590 ;описатель текущего дисковода + push hl + push bc + ex de,hl + ld bc,#0015 + bit 5,(iy+#0B) + jr z,x18B6 ;функция вызывается из монитора +;вызов пользователем + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + jr x18B8 +;функция вызывается из монитора +x18B6 ldir +x18B8 pop bc + pop hl + ld a,(hl) + or a + ret nz ;выход без ошибок + jp x1983 ;ошибка #66. путь не найден + +;АДРЕС: #18C0 R8DOS #28(40) подключение раздела к драйверу HDD +;вх: 1-0,a - номер дисковода +; 2,a =0 +; 6,a =1 отключить подраздел от драйвера +; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) +; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек +; 3,a =1 подключение по имени, адрес имени в памяти в DE +; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела +;вых: cy=1 ошибка +x18C0 bit 7,(iy+#1B) + jp z,x1BFA ;ошибка #56 нет раздела MFS + push hl + push af + push hl + ld hl,x1A19 + ex (sp),hl ;адрес возврата + ld c,a + bit 6,c + jr nz,x188A ;отключить подраздел от драйвера + bit 5,c + jr nz,x189A ;подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) + bit 7,c + jr nz,x1901 ;автоподключение, т. е. подключить то, что задано в секторе автонастроек + bit 3,c + ret z ;переход на x1A19 + +;подключение по имени, адрес имени в памяти в de + ld a,e + or d + jr z,x18FD ;;ошибка #45. неверный путь + push bc + ex de,hl + ld de,xE7C7 + ld bc,#0014 + bit 5,(iy+#0B) + jr z,x18F6 ;;функция вызывается из монитора + rst #30 + dw rom2_x0753 ;сохранение области памяти в ram 8 + db #02 + jr x18F8 +x18F6 ldir +x18F8 xor a + ld (de),a + pop bc + jr x190E ;анализ имени и подключение +;ошибка #45. неверный путь +x18FD ld a,#45 + scf + ret + +;автоподключение, т е. подключить то, что задано в секторе автонастроек +;вх: 1-0,c - номер дисковода +x1901 push bc + call x1E3D ;чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы + pop bc + ret c ;ошибка чтения + ld de,xE7C7 + call x1ACC ;формирование текстовой строки - пути к примонтированному подразделу/образу + ret c ;ошибка чтения +x190E ld hl,xE7C7+#01 + ld a,":" + cp (hl) + jr nz,x192C ;это подраздел +; это образ диска + dec hl + ld a,(hl) + and #5F + sub #41 + jr c,x18FD ;не буква диска. ошибка #45. неверный путь + cp #04 + jr nc,x18FD ;не буква диска. ошибка #45. неверный путь + ld b,a + ld a,c + and #F0 + or b + ld c,a ;новый дисковод + inc hl + inc hl + jr x192F ;hl начало имени подраздела +; это подраздел +x192C ld hl,xE7C7 +x192F ld a,(hl) + cp #5C ;"\" + jr nz,x1935 + inc hl +; формирование строки с именами для поиска в каталоге +x1935 ld de,xE7DB ;буфер для имени подраздела и образа + push bc + call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) + call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) + pop bc +; поиск имени подраздела в каталоге + ld de,xEBF5 ;буфер с каталогом +x1943 push bc + push de + rst #30 + dw rom5_x2620 ;формирование в буфере xEBF5 списка подразделов MFS/образов + db #05 + pop de + pop bc + ret c ;ошибка чтения + res 7,c ;7,=0 поиск имени +x194E push bc + ld bc,xEBF5 ;определение номера текущей записи + ld l,e + ld h,d + sbc hl,bc + ld b,#04 +x1958 srl h ;hl=hl/#10 + rr l + djnz x1958 ;l - номер записи в каталоге + pop bc + ld a,(xDD89) ;всего записей + cp l + jr z,x1983 ;конец каталога. ошибка #66. путь не найден + jr c,x1983 ;конец каталога. ошибка #66. путь не найден + ld hl,xE7DB ;тут имя подраздела и образа + call x1A6A ;проверка совпадения имени + jr nz,x19C1 ;не совпало +; имя совпало + ld a,(de) + and #DF + cp #01 + jr nz,x19D8 ;это не TR-DOS. формирование описателя текущего дисковода + ld a,(xE7DB+#06) + cp " " + jr nz,x1987 ;есть имя образа + ld a,(de) + or #10 + ld (de),a + jr x19D8 ;формирование описателя текущего дисковода +;ошибка #66. путь не найден +x1983 ld a,#66 + scf + ret +; поиск имени образа в каталоге +x1987 push de + push bc + ld bc,#0010 + ex de,hl + ld de,xE81B + ldir ;сохраним запись подраздела в буфере + rst #30 + dw rom5_x25EB ;формирование в буфере xEBF5 списка образов коллекции + db #05 + pop bc + pop de + ret c ;ошибка чтения + set 7,c ;в буфере каталог коолекции образов + push bc + push de + ld de,xEBF5 ;адрес каталога коллекции + ld c,#01 +x19A2 ld a,(xDD89) ;количество образов в каталоге + cp c + jr c,x19BF ;каталог закончился + ld a,(de) + and #01 + cp #01 + jr nz,x19B7 ;это не образ диска. следующая запись + ld hl,xE7DB+#06 ;имя образа + call x1A6A ;проверка совпадения имени + jr z,x19CF ;есть совпадение +x19B7 inc c + ld hl,#0010 + add hl,de + ex de,hl + jr x19A2 ;продолжим поиск +x19BF pop de ;конец каталога образов + pop bc +x19C1 ld a,e + add a,#10 + ld e,a + jr nc,x19C8 + inc d ;de=de+#10 +x19C8 bit 7,c + jr z,x194E ; + jp x1943 ;7,c =1 в буфере каталог коолекции образов, читать MBR не надо +;имя образа найдено +x19CF pop hl + pop bc + ld a,(de) + and #20 ;сохраним признак защиты от записи + or #01 + jr x19D9 +;формирование описателя текущего дисковода +x19D8 ld a,(de) +x19D9 ld (xE590),a ;код подраздела в описателе текущего дисковода + ex de,hl + ld de,xE590+#01 + inc hl + call x1003 ;копирование из (hl) в (de) 4х байт + ld de,xE590+#05 + call x1003 ;копирование из (hl) в (de) 4х байт + push de + ld de,#0005 + add hl,de + pop de + ex de,hl + push bc + rst #30 + dw rom5_x3052 ;сложение двух 4х байтных чисел + db #05 + ld hl,xE590+#05 + rst #30 + dw rom5_x302A ;декремент (hl)=(hl)-1 + db #05 + pop bc + ld a,(xE590) ;!!!ОШИБКА!!! перед сравнением надо сделать and #DF + cp #01 ;иначе диски с защитой от записи не будут видны + jr z,x1A07 ;это TR-DOS образ, без защиты от записи + or a + ret +x1A07 call x1A0E ;hl адрес кода, определяющий тип дисковода + ld (hl),#E0 ;%11100000 + or a + ret + +;АДРЕС: #1A0E расчет адреса кода, определяющие тип дисковода по номеру в С +x1A0E ld a,c + and #03 + ld c,a + ld b,#00 + ld hl,xFFCC + add hl,bc + ret + +;завершение процедуры x18C0 R8DOS #28(40) +;cy=1 была ошибка +x1A19 push af + jr nc,x1A20 ;нет ошибки + xor a + ld (xE590),a ;была ошибка. образ не подключен +x1A20 ld a,c + and #03 + ld (xFFCA),a ;текущий дисковод + bit 4,(iy+#1C) + call z,x1B54 ;1/0 TRDOS mirror on/off + call x1B04 ;расчет адреса блока описателя заданного дисковода +;сохранение описателя текущего дисковода в блоке xE9F5 + ld de,xE590 ;описатель текущего дисковода + ex de,hl + ld bc,#0009 + ldir + push hl + ld hl,xE7DB ;имена подраздела/образа + push hl + ld bc,#000C + push bc + ldir ;копирование имен подраздела/образа в описатель текущего дисковода + pop bc + pop hl + pop de + ldir ;копирование в блок описаний дисководов + call x1B18 ;установка признака подмонтированных дисков A/B в порту #7FBA + pop af + pop de + pop hl + ret c ;была ошибка +;вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела + bit 4,d + ret z + ld de,xE590 + ex de,hl + ld bc,#0015 + bit 5,(iy+#0B) + jr z,x1A66 ;функция вызывается из монитора + rst #30 + dw rom2_x0749 ;восстановление области памяти из ram 8 + db #02 + jr x1A68 +x1A66 ldir +x1A68 or a + ret + + +;АДРЕС: #1A6A проверка совпадения имени +;вх: de - адрес в каталоге +; hl - адрес имени для поиска +;вых: z - имя совпало +x1A6A push bc + push de + ld bc,#000A ;приращение в записи до имени + ex de,hl + add hl,bc + ld bc,#0600 +x1A74 ld a,(de) + cp (hl) + jr z,x1A79 + inc c +x1A79 inc hl + inc de + djnz x1A74 + ld a,c ;c=0 сть совпадение + or a + pop de + pop bc + ret + +;АДРЕС: #1A82 выделение из строки имени подраздела/образа (6 символов имя) +;вх: de - буфер приемник +; hl - адрес строки +x1A82 ld b,#06 +x1A84 ld a,(hl) + cp #5C ;"\" + jr z,x1A97 ;конец имени + or a + jr z,x1A98 ;конец строки + ld (de),a + inc hl + inc de + djnz x1A84 + ld a,(hl) + cp #5C ;"\" + ret nz ;не маркер конца имени + inc hl ;следующий символ + ret +x1A97 inc hl +x1A98 ld a," " + ld (de),a + inc de + djnz x1A98 + ret + +;АДРЕС: #1A9F копирование имени подраздела/образа по адресу в de +;вх: de - адрес буфера +; hl - адрес пути примонтированного подраздела/образа +; b - смещение в пути до имени +x1A9F ld a,l + add a,b + ld l,a + jr nc,x1AA5 + inc h +x1AA5 ld b,#06 +x1AA7 ld a,(hl) + cp #21 + ret c + ld (de),a + inc hl + inc de + djnz x1AA7 + ret + +;АДРЕС: #1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 +;вх: a - номер дисковода для монтирования образа +;вых: hl - адрес буфера +; a - первый байт буфера со сброшенным битом защиты от записи +x1AB1 push de + and #03 + ld hl,x1AC8 + add a,l + ld l,a + jr nc,x1ABC + inc h +x1ABC ld l,(hl) + ld h,#00 + ld de,xE5A9 + add hl,de + ld a,(hl) + and #DF + pop de + ret +x1AC8 db #00,#16,#2C,#42 + +;АДРЕС: #1ACC формирование текстовой строки - пути к примонтированному +; подразделу/образу. вида X:part\disk,#00 либо part,#00 +;вх: de - адрес буфера для текcтовой строки +; 0-1,c - номер дисковода +x1ACC ld a,c + call x1AB1 ;hl адрес начала пути к примонтированному образу + ld (de),a ;a - первый байт пути со сброшенным битом защиты от записи + and #DF + jp z,x1B00 ;ошибка #67. к дисководу образ не примонтирован + cp #01 + jr z,x1AE1 ;это образ диска +;для подраздела + ld b,#0A + call x1A9F ;копирование имени подраздела по адресу в de + jr x1AFC +;для образа диска +x1AE1 ld a,c + and #03 + add a,#41 + ld (de),a ;буква дисковода + inc de + ld a,":" + ld (de),a + inc de + ld b,#0A + push hl + call x1A9F ;копирование имени подраздела по адресу в de + pop hl + ld a,#5C ;"\" + ld (de),a + inc de + ld b,#10 + call x1A9F ;копирование имени образа по адресу в de +x1AFC ex de,hl + xor a + ld (hl),a + ret +;ошибка #67. к дисководу образ не примонтирован +x1B00 ld a,#67 + scf + ret + +;АДРЕС: #1B04 расчет адреса блока описателя заданного дисковода +;вх: a - номер дисковода +;вых: hl - адрес блока описателя текущего дисковода +; a - первый байт описателя +; nz - это образ диска +x1B04 ld l,a + rlca + rlca + ld h,a + rlca + rlca + add a,h + add a,l ;a=a*#15 + ld hl,(xE9F3) + add a,l + ld l,a + jr nc,x1B14 + inc h +x1B14 ld a,(hl) ;hl адрес блока описателя заданного дисковода + and #DF + ret + +;АДРЕС: #1B18 установка признака подмонтированных дисков A/B в порту #7FBA +x1B18 ld a,(xFFCA) ;номер текущего дисковода + bit 1,a + ret nz ;это дисковод C/D + ld c,a + ld e,a + call x1A0E ;расчет адреса кода, определяющие тип дисковода по номеру в С + ld bc,#7FBA + bit 0,e + ld d,(iy-#26) + jr z,x1B37 ;дисковод A + set 6,d ;для дисковода B + bit 5,(hl) + jr z,x1B3F ;образ не подключен + res 6,d ;образ подключен + jr x1B3F +x1B37 set 7,d ;для дисковода A + bit 5,(hl) ;образ не подключен + jr z,x1B3F + res 7,d ;образ подключен +x1B3F ld (iy-#26),d + out (c),d + ret + +;АДРЕС: #1B45 определение необходимости копирования памяти пользователя +;вх: hl - адрес начала блока памяти +; bc - размер блока памяти +;вых: cy=1 блок памяти попадает на системные области +; =0 блок памяти в пределах [#4000..#BFFF] +x1B45 ld a,h + cp #40 + ret c + push hl + dec bc + add hl,bc ;адрес конца таблицы + inc bc + ld a,h + pop hl + ret c + cp #C0 + ccf + ret + +;АДРЕС: #1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) +x1B54 bit 5,(iy+#0B) + ret z ;функции вызываются из монитора + push af + ld hl,(xE9F3) ;адрес блока описателей дисковода + push hl + ld hl,xE9F5 + ld (xE9F3),hl ;начало блока + call x1B04 ;расчет адреса блока описателя заданного дисковода + ld de,xE590 ;описатель текущего дисковода + ex de,hl + ld bc,#0009 + ldir ;тип и адрес подраздела/образа в секторах + ld hl,xE7DB + ld bc,#000C ;имена подраздела/образа + ldir + pop hl + ld (xE9F3),hl + pop af + ret + +;АДРЕС: #1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска +;вх: hl - адрес в памяти, куда считывать +; de - начальный номер сектора (считая с 1!) +; b - число секторов (размер сектора 512 байт!) +;вых: cy=1 - ошибки +x1B7E bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld a,(xE590) ;код типа примонтированного подраздела/образа + or a + jr z,x1BBC ;ошибка. образ не примонтирован + ld a,b + or a + ret z ;0 секторов. нечего читать +;читаем сектора +x1B8D push hl + push de + push bc + call x1B9D ;чтение одного сектора + pop bc + pop de + pop hl + ret c ;были ошибки + inc h + inc h + inc de + djnz x1B8D + ret +;чтение одного сектора +x1B9D ld bc,#0200 + call x1B45 ;определение необходимости копирования памяти пользователя + jp nc,x1813 ;чтение сектора с винчестера + push hl + ld hl,xEBF5 ;читаем в буфер в ram 8 + call x1813 ;чтение сектора с винчестера + pop hl + ret c ;ошибки + ld de,xEBF5 + ex de,hl + ld bc,#0200 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + xor a + ret +;ошибка #67. к дисководу образ не примонтирован +x1BBC scf + ld a,#67 + ret + +;АДРЕС: #1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска +;вх: hl - адрес в памяти, откуда записывать +; de - начальный номер сектора (считая с 1!) +; b - число секторов (размер сектора 512 байт!) +;вых: cy=1 - ошибки + +x1BC0 bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld a,(xE590) ;код типа примонтированного подраздела/образа + or a + jr z,x1BBC ;ошибка. образ не примонтирован + ld a,b + or a + ret z ;0 секторов. нечего записывать +;записываем сектора +x1BCF push hl + push de + push bc + call x1BDF ;запись одного сектора + pop bc + pop de + pop hl + ret c ;были ошибки + inc h + inc h + inc de + djnz x1BCF + ret +;запись одного сектора +x1BDF ld bc,#0200 + call x1B45 ;определение необходимости копирования памяти пользователя + jp nc,x1829 ;запись сектора на винчестер + push de + ld de,xEBF5 ;буфер для записи + ld bc,#0200 + rst #30 + dw rom2_x0753 ;копируем область пользователя в буфер для записи + db #02 + pop de + ld hl,xEBF5 + jp x1829 ;запись сектора на винчестер + +;АДРЕС: #1BFA ошибка #56. нет раздела MFS +x1BFA ld a,#56 + scf + ret + +;АДРЕС: #1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела +;вх: hl - адрес буфера для таблицы (1024) +;вых: cy=1 - ошибки +;вых: de - количество подразделов +; +x1BFE bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + push hl + call x1C21 ;чтение в буфер xEBF5 катлога раздела MFS + pop hl + ret c ;ошибка + push hl + ld de,xEBF5 ;буфер с каталогом + ex de,hl + ld bc,#0400 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + rst #30 + dw rom5_x271A ;подсчет количества подразделов в MFS + db #05 + ld de,(xDD89) ;количество подразделов + pop hl + xor a + ret +;чтение в буфер xEBF5 катлога раздела MFS +x1C21 res 6,(iy+#1C) + call x1768 ;поиск раздела MFS + ret c ;ошибка + call x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела + ret + +;АДРЕС: #1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) +;вх: a =#90/#94 запись сектора +; =#50/#54 чтение сектора +; hl - адрес начала данных 512b +;вых: cy=1 - ошибки +; +x1C2D bit 7,(iy+#1B) + jr z,x1BFA ;ошибка. нет раздела MFS + ld c,a + and #FB ;%11111011 + cp #90 + jr z,x1C42 + cp #50 + jr z,x1C56 + ld a,#56 ;ошибка. нет раздела MFS + scf + ret +;запись сектора +x1C42 ld de,xE5A9 + ld bc,#0200 + rst #30 + dw rom2_x0753 ;копируем область пользователя в буфер для записи + db #02 + ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + jp x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;чтение сектора +x1C56 push hl + ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? + call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + pop hl + ret c ;ошибки + ld de,xE5A9 + ex de,hl + ld bc,#0200 + rst #30 + dw rom2_x0749 ;копируем в память пользователя + db #02 + xor a + ret + +;АДРЕС: #1C70 бесконечное чтение порта bc +x1C70 in a,(c) + jr x1C70 + +;АДРЕС: #1C74 бесконечная запись в порт bc +x1C74 out (c),a + jr x1C74 + +;АДРЕС: #1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства +;вх: hl - адрес откуда грузим в регистры 6 байт +x1C78 ld bc,#F8BE +x1C7B ld a,(hl) + inc hl + inc b + out (c),a + ld a,b + cp #FE + ret z + jr x1C7B + +;АДРЕС: #1C86 чтение 512b данных в буфер адресуемый hl +;вх: hl - адрес буфера для чтения данных +x1C86 push hl + ld c,#BE + ld de,#D8F8 + xor a +x1C8D ld b,e ;порт #F8BE регистр данных (младшая часть) + ini + ld b,d ;порт #D8BE регистр данных (старшая часть) + ini + dec a + jr nz,x1C8D + pop hl + ret + +;АДРЕС: #1C98 запись 512b данных из буфер адресуемого hl +;вх: hl - адрес буфера для записи данных + +x1C98 push hl + ld c,#BE + ld de,#D9F9 ;команда outd вначале делает dec b + xor a +x1C9F ld b,d ;порт #D8BE регистр данных (старшая часть) + inc hl + outd + ld b,e ;порт #F8BE регистр данных (младшая часть) + outi + inc hl + dec a + jr nz,x1C9F + pop hl + ret + +;АДРЕС: #1CAC посылаем команду винчестеру +;вх: a - команда винчестеру +;вых: cy=1 HDD не вышел в готовность +; =0 команда загружена в регистр +; d - регистр состояния +x1CAC ld e,a + ld c,#BE + call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + ld b,#FE + ld a,(xE049) ;тип адресации LBA/CHS и выбор винчестера master/slave + out (c),a + ld hl,xE044 + call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства + call x1CE5 ;ожидание готовности HDD к принятию команды + ret c ;ошибка: hdd не вышел в готовность + ld bc,#FFBE + out (c),e + ret + +;АДРЕС: #1CCA ожидание готовности HDD к передаче данных +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов к передаче данных +; d - регистр состояния +x1CCA call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + bit 3,d + ret nz ;винчестер готов к передаче данных +;ждем готовности к передаче данных + ld hl,#C350 +x1CD4 ld bc,#FFBE + in d,(c) + bit 3,d + ret nz ;винчестер готов к передаче данных + dec hl + ld a,h + or l + jr nz,x1CD4 + ld a,#62 + scf + ret + +;АДРЕС: #1CE5 ожидание готовности HDD к принятию команды +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов к принятию команды +; d - регистр состояния +x1CE5 call x1D04 ;ожидание готовности HDD + ret c ;ошибка: hdd не вышел в готовность + bit 6,d + ret nz ;выход. винчестер готов принять команду +;ждем готовности принять команду + ld hl,#14E6 + or a +x1CF0 ld bc,#FFBE + in d,(c) + bit 6,d + ret nz ;выход. винчестер готов принять команду + dec a + jr nz,x1CF0 + dec hl + ld a,h + or l + jr nz,x1CF0 + ld a,#61 + scf + ret + +;АДРЕС: #1D04 ожидание готовности HDD +;вх: c - младший байт порта +;вых: cy=1 HDD не вышел в готовность +; =0 HDD готов +; d - регистр состояния +x1D04 ld hl,#4FD3 ;количество попыток +x1D07 xor a + ld b,#FF +x1D0A in d,(c) ;читаем регистр состояния + bit 7,d + ret z ;HDD готов + dec a ;HDD занят + jr nz,x1D0A ;повторяем попытки + dec hl + ld a,h + or l + jr nz,x1D07 + ld a,#60 ;HDD не вышел в готовность + scf + ret + +;АДРЕС: #1D1B чтение сектора идентификации в буфер по адресу в ix +;вх: ix - адрес буфера для чтения сектора идентификации +x1D1B ld hl,xE04A + ld b,(hl) ;сохраним код команды винчестера: чтение сектора + push bc + ld (hl),#EC ;команда идентификации + push hl + call x1D78 ;чтение сектора идентификации в ix + pop hl + pop bc + ld (hl),b + ret + +;АДРЕС: #1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер +x1D2A call x1E2A ;установка в переменных - сектора номер 3 для винчестера + ld hl,#4155 ;сигнатура сектора с примонтированными образами + ld (xE5A9+#1FE),hl + ld de,xE5A9 ;адрес начала памяти + ld bc,#01FC ;размер области памяти + call x21E5 ;подсчет контрольной суммы области памяти CRC16 + ld (xE5A9+#1FC),hl ;контрольная сумма + ld (iy+#31),#01 ;количество секторов + jr x1D4F ;запись сектора из буфера xE5A9 на винчестер + +;АДРЕС: #1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: cy=1 ошибки +x1D45 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + jr x1D4F ;запись сектора из буфера xE5A9 на винчестер + +;АДРЕС: #1D4A запись сектора из буфера ix на винчестер +;вх: ix - адрес буфера для записи сектора +x1D4A push ix + pop hl + jr x1D52 + +;АДРЕС: #1D4F запись сектора из буфера xE5A9 на винчестер +x1D4F ld hl,xE5A9 +x1D52 ld b,(iy+#39) ;количество дополнительных попыток записи сектора +x1D55 push bc + ld a,(xE04B) ;код команды винчестера + call x1D60 ;запись сектора на винчестер + pop bc + ret nc ;нет ошибок + djnz x1D55 ;еще раз попытаемся записать +;запись сектора на винчестер +;вх: a - команда винчестеру +; hl - адрес буфера для записи данных +;вых: cy=1 были ошибки +; hl - не изменяется +x1D60 push hl + call x1CAC ;посылаем команду винчестеру + pop hl + jr c,x1DB3 ;ошибка + push hl + call x1CCA ;ожидание готовности HDD к передаче данных + pop hl + jr c,x1DB3 ;ошибка + call x1C98 ;запись 512b данных из буфер адресуемого hl + jr x1D9F ;проверка на ошибки и выход + +;АДРЕС: #1D73 чтение сектора с винчестера в буфер xE5A9 +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +x1D73 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек + jr x1D7D + +;АДРЕС: #1D78 чтение сектора с винчестера в буфер ix +;вх: ix - адрес буфера для чтения сектора +x1D78 push ix + pop hl + jr x1D80 + +;АДРЕС: #1D7D чтение сектора с винчестера в буфер xE5A9 +x1D7D ld hl,xE5A9 +x1D80 ld b,(iy+#39) ;количество дополнительных попыток чтения сектора +x1D83 push bc + ld a,(xE04A) ;код команды винчестера + call x1D8E ;чтение сектора с винчестера + pop bc + ret nc + djnz x1D83 +;чтение сектора с винчестера +;вх: a - команда винчестеру +;вх: hl - адрес буфера для чтения данных +;вых: cy=1 были ошибки +; hl - не изменяется +x1D8E push hl + call x1CAC ;посылаем команду винчестеру + pop hl + jr c,x1DB3 ;ошибка + push hl + call x1CCA ;ожидание готовности HDD к передаче данных + pop hl + jr c,x1DB3 ;ошибка + call x1C86 ;чтение 512b данных в буфер адресуемый hl +;проверка на ошибки и выход +x1D9F ld bc,#FFBE + in a,(c) + ld d,a ;регистр состояния + and %01110001 + xor %01010000 + ret z ;выход при готовности винчестера и отсутствии ошибок + ld b,#F9 ;#F9BE + in a,(c) ;читаем код ошибки + ld (xFFDD),a ;сохраняем + ld a,#57 ;код ошибки драйвера +x1DB3 call x1DB8 ;програмный сброс винчестера + scf + ret +;програмный сброс винчестера +x1DB8 push af + push bc + ld bc,#FFBA + ld a,(xDFF0) + push af + or #80 + out (c),a ;активация регистра Device Control + push bc + ld bc,#FEBE + ld a,%00001100 + out (c),a ;програмный сброс винчестера + call x201C ;пауза 293t + xor a + out (c),a ;завершаем програмный сброс винчестера + pop bc + pop af + and #7F + out (c),a ;активация регистра головки + ld (xDFF0),a + pop bc + pop af + ret + +;АДРЕС: #1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек +;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора +;вых: (xE046) параметры LBA/CHS в зависимости от настроек +x1DDF exx + ld hl,xE030 + bit 4,(iy+#35) + jr z,x1DEA ;master HDD + inc hl ;slave HDD +x1DEA bit 2,(hl) + jr nz,x1E10 ;LBA on +;LBA off. преобразование адреса LBA в C/H/S + ld bc,(xE5A5) ;head*sector (секторов на цилиндре) + call x0F5D ;деление de'hl'=de'hl'/bc + exx + ld (xE047),hl ;номер цилиндра + ld c,(iy-#1F) ;значение sector HDD + ld b,#00 + call x0F5D ;деление de'hl'=de'hl'/bc + inc l + ld (iy+#32),l + exx + ld a,(iy+#35) + and #B0 ;%10110000 + or l + ld (iy+#35),a ;головка + ret +;LBA on +x1E10 exx + ld (iy+#32),l + ld (iy+#33),h + ld (iy+#34),e + ld a,d + and #0F + ld d,a ;старший полубайт + ld a,(iy+#35) + and #B0 ;%10110000 + or d + or #40 + ld (iy+#35),a + ret + +;АДРЕС: #1E2A установка в переменных сектора номер 3 для винчестера +x1E2A ld hl,#0000 + ld (xE047),hl + ld (iy+#32),#03 + ld a,(iy+#35) + and #F0 + ld (iy+#35),a + ret + +;АДРЕС: #1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы +;вых: cy=1 были ошибки +x1E3D call x1E2A ;установка в переменных сектора номер 3 для инчестера + ld (iy+#31),#01 ;кол-во секторов =1 + call x1D7D ;чтение сектора с винчестера в буфер xE5A9 + ret c ;ошибка + ld hl,(xE5A9+#1FE) + ld de,#4155 ;сигнатура + sbc hl,de + ld a,#63 + scf + ret nz ;сигнатура отсутствует + ld de,xE5A9 ;начало области памяти + push de + ld bc,#01FC ;размер области памяти + call x21E5 ;подсчет контрольной суммы области памяти CRC16 + ld bc,(xE5A9+#1FC) + xor a + sbc hl,bc + pop hl + ret z ;контрольная сумма совпала + ld b,a ;контрольная сумма не совпадает +x1E68 ld (hl),a ;очищаем буфер + inc hl + djnz x1E68 +x1E6C ld (hl),a + inc hl + djnz x1E6C + ld a,#63 + scf + ret + +;АДРЕС: #1E74 R8DOS #22(34) идентификация жесткого диска +;вх: ix - адрес буфера для загрузки сектора идентификации +; 0,e =1 принудительно инициализировать переменные геометрии винчестра +;вых: cy=1 ошибки +x1E74 xor a + ld (xFFDD),a ;код ошибки дискового интерпретатора + ld bc,#FFBA + ld hl,xDFF0 + ld a,(hl) + or #81 + ld (hl),a + out (c),a ;device control/alt status + push bc + ld bc,#FEBE + xor a + out (c),a ;сброс + pop bc + ld a,(hl) + and #7F + or #01 + ld (hl),a + out (c),a ;вернем регистр команд + djnz $ ;задержка + ld bc,#FFBE + in a,(c) ;регистр состояния + xor #FF + jr z,x1ECC ;прочитано #FF. нет винчестера + set 7,(iy+#1A) ;признак наличия HDD + bit 0,e + jr nz,x1EAD + bit 1,(iy+#1C) ;автоопределение HDD при старте включено + jr nz,x1EFA ;читать сектор идентификации не надо +;чтение сектора идентификации и установка переменных геометрии винчестера +x1EAD ld hl,#4FD3 + call x1D07 ;ожидание готовности HDD + ld b,#FC ;bc=#FCBE регистр цилиндра + xor a +x1EB6 out (c),a + nop + in d,(c) + cp d + jr nz,x1ECC ;значения не совпадают. винчестера нет + dec a + jr nz,x1EB6 ;повторим 256 раз + ld hl,xE044 ;адрес переменной откуда грузим + call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства + call x1D04 ;ожидание готовности HDD + jr nc,x1ED4 ;в готовность вышел +;винчестер не найден +x1ECC res 7,(iy+#1A) + ld a,#56 + scf + ret +x1ED4 call x1D1B ;чтение сектора идентификации в буфер по адресу в ix + ld a,#57 + ret c ;ошибка #57. не прочитался сектор идентификации + push ix + pop hl + xor a + or (hl) + inc hl + or (hl) + inc hl + jr z,x1F04 ;ошибка в секторе идентификации + ld c,(hl) + inc hl + ld b,(hl) + inc hl + ld (xDFF2),bc ;количество цилиндров + inc hl + inc hl + ld a,(hl) + ld (iy-#20),a ;количество головок + ld de,#0006 + add hl,de + ld a,(hl) + ld (iy-#1F),a ;количество секторов +x1EFA call x1F2D ;расчет произыедения головок и секторов + call x1F08 ;проверка геометрии винчестера + jr z,x1F04 ;проверка геометрии винчестера не пройдена + or a + ret +;ошибка #58. ошибка в секторе идентификации +x1F04 ld a,#58 + scf + ret + +;АДРЕС: #1F08 проверка геометрии винчестера +x1F08 res 7,(iy+#1B) + ld a,(xDFF2) ;ицлиндров (младший байт) + or (iy-#21) + ret z ;ноль цилинлров + xor a + or (iy-#20) + ret z ;ноль головок + xor a + or (iy-#1F) + ret z ;ноль секторов + ld hl,(xE5A5) + ld a,l + or h + ret z ;нулевое произведение головок и секторов + bit 7,(iy+#1A) + ret z ;винчест не найден + set 7,(iy+#1B) + ret + +;АДРЕС: #1F2D расчет произведения головок и секторов +x1F2D xor a + ld c,(iy-#20) ;головок + ld b,a + exx + ld l,(iy-#1F) ;секторов + ld h,a + ld e,a + ld d,a + exx + call x0FB7 ;умножение dehl=de'hl' * bc + ld (xE5A5),hl ;произведение head * sectors + ret + +;АДРЕС: #1F41 ошибка HDD. вывод сообщения об ошибке в нижней строке монитора +;вх: a - код ошибки, если =#00 -> d - параметр ошибки чтения/записи +x1F41 bit 5,(iy+#0B) + jr z,x1F49 ;функции вызываются из монитора + scf + ret +x1F49 push af + ld a,(xFFDD) + ld (xDDA7),a ;сохраним код ошибки дискового интерпретатора + ld a,d + ld (xDDA7+#01),a ; + pop af + rst #30 + dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора + db #02 + +;АДРЕС: #1F59 чтение ячейки CMOS +;вх: b - адрес в CMOS +;вых: a - значение +; +x1F59 push bc + push bc +x1F5B ld bc,#FFBA + ld a,(xDFF0) + and #7F ;7,=0 регистр адреса CMOS + ld (xDFF0),a + call x2010 ;запись в порт + pop af + ld b,#DF + call x2010 ;запись в порт + ld b,#DF + call x2016 ;чтение порта + pop bc + ret + +;АДРЕС: #1F76 чтение из CMOS времени и даты, в случае готовности CMOS +; +x1F76 ld hl,xDFF6 + ld b,#0C + call x1F59 ;читаем регистр C cmos + bit 4,a + ret z ;еще не обновился + call x1F8B ;bit 7 регистра A cmos + ret nz ;cmos обновляется + set 0,(iy+#1A) + jr x1F98 ;;читаем секунды/минуты/часы + + +;АДРЕС: #1F8B проверка готовности CMOS +;вых: nz - cmos обновляется +; +x1F8B ld b,#0A + call x1F59 ;читаем регистр A cmos + bit 7,a + ret + +;АДРЕС: #1F93 чтение из CMOS времени и даты +;вх: hl - адрес куда читать (6 байт) +; +x1F93 call x1F8B ;проверка готовности cmos + jr nz,x1F93 ;cmos обновляется, ждём +;читаем секунды/минуты/часы +x1F98 ld bc,#0003 +x1F9B call x1F59 + ld (hl),a + inc hl + inc b + inc b + dec c + jr nz,x1F9B +;читаем число/месяц/год + inc b + ld c,#03 +x1FA8 call x1F59 + ld (hl),a + inc hl + inc b + dec c + jr nz,x1FA8 + ret + +;АДРЕС: #1FB2 запись в CMOS времени и даты +;вх: hl - адрес откуда писать (6 байт) +; +x1FB2 ld b,#0B ;регистр B + ld a,#9E ;%10011110 + call x1FDD ;запрет обновления cmos + ld bc,#0003 +x1FBC ld a,(hl) ;запись секунд/минут/часов + inc hl + call x1FDD + inc b + call x1FDD + inc b + dec c + jr nz,x1FBC + inc b + ld c,#03 +x1FCC ld a,(hl) ;запись число/месяц/год + inc hl + call x1FDD + inc b + dec c + jr nz,x1FCC + ld a,%00101010 ;регистр A cmos + call x1FDD + inc b + ld a,%01011110 ;разрешенеи обновления cmos + +;АДРЕС: #1FDD запись данных в ячейку CMOS +;вх: b - адрес в CMOS +; a - новое значение ячейки +; +x1FDD push bc + push af + push bc + ld bc,#FFBA + ld a,(xDFF0) + and #7F + call x2010 ;запись в порт + pop af + ld b,#DF + call x2010 ;выбираем адрес + ld b,#FF ;режим записи данных + ld a,(xDFF0) + or #80 + call x2010 ;запись в порт + pop af ;запись данных в ячейку + ld b,#DF + call x2010 ;запись в порт + ld b,#FF + ld a,(xDFF0) + and #7F + ld (xDFF0),a + call x2010 ;режим чтения cmos + pop bc + ret + +;АДРЕС: #2010 запись в порт +;вх: bc - адрес порта +; a - значение +; +x2010 call x201C ;пауза 293t + out (c),a + ret + +;АДРЕС: #2016 чтение порта +;вх: bc - адрес порта +;вых: a - значение +; +x2016 call x201C ;пауза 293t + in a,(c) + ret + +;АДРЕС: #201C пауза 293t +; +x201C push bc + ld b,#14 + djnz $ + pop bc + ret + +;АДРЕС: #2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F +;вх: a - значение ячейки +; b - номер ячейкм +x2023 call x1FDD ;запись данных в ячейку CMOS + push bc + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + call x1FDD ;запись контрольной суммы + pop bc + ret + +;АДРЕС: #2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) +;вых: e - контрольная сумма +; b=#3F +x2030 push de + ld de,#FFFF + ld b,#10 +x2036 call x1F59 ;чтение ячейки CMOS + call x220F ;суммирование байта с контрольной суммой CMOS CRC8 + inc b + ld a,#3F + cp b + jr nz,x2036 + ld a,e + add a,d + pop de + ld e,a + ret + +;АДРЕС: #2047 определение наличия CMOS +;вых: cy=1 были ошибки +; a=#5A - checksum error +; a - номер сообщения для вывода +x2047 ld b,#3F ;номер ячейки + call x1F59 ;чтение ячейки CMOS + ld d,a + ld a,#55 + call x1FDD ;запись данных в ячейку CMOS + call x1F59 ;чтение ячейки CMOS + cp #55 + jr nz,x2065 ;CMOS отсутствует + ld a,#AA + call x1FDD ;запись данных в ячейку CMOS + call x1F59 ;чтение ячейки CMOS + cp #AA + jr z,x2069 ;CMOS найден +x2065 ld a,#5B ;сообщение: CMOS not found + scf + ret +;CMOS найден. определяем размер CMOS +x2069 ld b,#7F + call x1F59 ;чтение ячейки CMOS + ld e,a + ld a,#55 + call x1FDD ;запись данных в ячейку CMOS + ld b,#3F + call x1F59 ;чтение ячейки CMOS + cp #AA + jr nz,x2087 ;64 байт + ld b,#7F + ld a,e + call x1FDD ;запись данных в ячейку CMOS + set 6,(iy+#1B) ;CMOS 128 байт +x2087 ld b,#3F + ld a,d + call x1FDD ;запись данных в ячейку CMOS + set 6,(iy+#1A) ;CMOS обнаружен +;подсчет контрольной суммы CMOS [#10..#3E] (#3F - контрольная сумма) + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + cp d + jr z,x20C2 ;контрольная сумма совпала +; контрольная сумма не совпала. перезапись CMOS +x2098 ld hl,#0705 ;день и месяц: 5 июля + ld (xDFF9),hl + ld (iy-#19),#61 ;год: 1997 + ld (iy-#1C),#0C ;час: 12 + ld hl,xDFF6 + call x1FB2 ;запись в CMOS времени и даты + rst #30 + dw rom4_x0398 ;запись переменных в CMOS + db #04 + ld b,#0E + ld a,#61 ;признак записи в CMOS переменных + call x1FDD ;запись данных в ячейку CMOS + call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) + ld a,e + call x1FDD ;запись данных в ячейку CMOS + ld a,#5A ;сообщение: CMOS checksum error + scf + ret +; контрольная сумма совпала +x20C2 ld b,#0D ;регистр #D + call x1F59 ;чтение ячейки CMOS + bit 7,a + jr z,x2098 ;пропадало питание. перезапись CMOS + inc b + call x1F59 ;чтение ячейки CMOS + cp #61 + jr nz,x2098 ;переменные не были сохранены. перезапись CMOS + ld hl,xDFF6 + call x1F93 ;чтение из CMOS времени и даты + ld hl,#0040 + bit 6,(iy+#1B) + jr z,x20E5 ;CMOS 64 байта + ld hl,#0080 +x20E5 ld (xDDA7),hl ;для печати размера CMOS + xor a + ld a,#5C ;сообщение: _число_ bytes CMOS found + ret + +;АДРЕС: #20EC работа с контроллером прерываний ???? +x20EC di + ld a,#0F + scf + ret + +;АДРЕС: #20F1 тестирование HDD (2. test) (тест на чтение/запись) +x20F1 ld hl,xEBF5+#200 ;заполним буфер значениями + xor a + ld b,a +x20F6 ld (hl),a + inc a + inc hl + djnz x20F6 +x20FB ld (hl),a + inc a + inc hl + djnz x20FB + ld hl,x217B ;адрес п/п тестирования сектора на чтение/запись + jr x2108 + +;АДРЕС: #2105 тестирование HDD (1. test) (тест только на чтение) +x2105 ld hl,x2172 ;адрес п/п тестирования сектора на чтение +x2108 ld (xE338),hl + ld (iy+#01),#00 + rst #30 + dw rom5_x30C6 ;печать окна для тестирования HDD + db #05 + ld hl,(xDFF2) ;значение Cylinders HDD + ld de,#0000 + exx + ld bc,(xE5A5) ;head * sector активного HDD + call x0FB7 ;умножение dehl=de'hl' * bc (кол-во секторов на HDD) + push de + push hl + xor a + ld l,a + ld h,a + ld e,a + ld d,a + push de + push hl +x212A ld hl,#0000 + add hl,sp + ex de,hl ;de адрес стэка + ld hl,#0004 + add hl,sp + call x1035 ;сравнение двух чисел в памяти по адресам в de и hl + jp p,x214C ;еще не конец винчестера + call x2169 ;печать текущего номера цилиндра + pop hl + pop hl + pop hl + pop hl + rst #30 + dw rom2_x3807 ;пауза 40416t + db #02 + rst #30 + dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) + db #06 + rst #30 + dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) + db #05 +x214C pop hl + pop de + push de + push hl + ld bc,x215A ;адрес п/п перехода к следующему сектору + push bc + ld bc,(xE338) ;адрес п/п тестирования сектора + push bc + ret +;переход к следующему сектору +x215A pop hl + pop de + ld a,l + and #3F + call z,x2169 ;печать текущего номера цилиндра + call x0FF3 ;инкремент dehl + push de + push hl + jr x212A +;печать текущего номера цилиндра +x2169 push de + push hl + rst #30 + dw rom5_x3163 ;печать текущего номера цилиндра + db #05 + pop hl + pop de + ret +;тестирование одного сектора на чтение +x2172 call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + ret nc ;нет ошибок +x2176 rst #30 + dw rom5_x30F3 ;печать кода ошибки винчестера + db #05 + ret +;тестирование одного сектора на чтение/запись +x217B call x1D73 ;чтение сектора с винчестера в буфер xE5A9 + jr c,x2176 ;ошибка чтения. печать кода ошибки винчестера + ld hl,xE5A9 ;сохраним прочитанный сектор + ld de,xEBF5 + ld bc,#0200 + ldir + push ix + ld ix,xEBF5+#200 + call x1D4A ;запись сектора из буфера ix на винчестер + jr c,x21C6 ;ошибка записи + ld ix,xE5A9 + call x1D78 ;чтение сектора с винчестера в буфер ix + jr c,x21C6 ;ошибка чтения + call x21BF ;запись изначальных данных сектора + pop ix + jr c,x2176 ;ошибка записи. печать кода ошибки винчестера + ld hl,xE5A9 + ld bc,#0000 +x21AC ld a,c + cp (hl) + call nz,x21CF ; + inc c + inc hl + djnz x21AC +x21B5 ld a,c + cp (hl) + call nz,x21CF ; + inc c + inc hl + djnz x21B5 + ret +;запись сектора из буфера xEBF5 на винчестер +x21BF ld ix,xEBF5 + jp x1D4A ;запись сектора из буфера ix на винчестер +;ошибка чтения/записи +x21C6 push af + call x21BF ;запись сектора из буфера xEBF5 на винчестер + pop af + pop ix + jr x2176 ;печать кода ошибки винчестера + +x21CF pop de + pop ix + push ix + push de + push hl + push bc + ld b,(hl) + ld de,xE5A9 + or a + sbc hl,de + rst #30 + dw rom5_x3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD + db #05 + pop bc + pop hl + ret + +;АДРЕС: #21E5 подсчет контрольной суммы области памяти CRC16 +;вх: bc - размер области памяти +; de - адрес начала памяти +;вых: hl - контрольная сумма +x21E5 ld hl,#FFFF + ld a,c + or b + ret z + push ix + push de + pop ix + ex de,hl +x21F1 ld hl,x2222 + ld a,(ix+0) + inc ix + xor e + add a,l + ld l,a + jr nc,x21FF + inc h +x21FF ld a,d + xor (hl) + ld e,a + inc hl + xor a + xor (hl) + ld d,a + dec bc + ld a,c + or b + jr nz,x21F1 + pop ix + ex de,hl + ret + +;АДРЕС: #220F суммирование байта с контрольной суммой CMOS CRC8 +;вх: a - значение +; de - контрольная сумма +;вых: de - контрольная сумма (новое значение) +x220F push hl + ld hl,x2222 + xor e + add a,l + ld l,a + jr nc,x2219 + inc h +x2219 ld a,d + xor (hl) + ld e,a + inc hl + xor a + xor (hl) + ld d,a + pop hl + ret + +;АДРЕС: #2222 данные для подсчета контрольной суммы +;АДРЕС: #2223 данные для подсчета контрольной суммы +x2222 INCBIN "prof_roms/rom7_data4CRC.bin" + +;АДРЕС: #2422 определение наличия SMUC +;вых: cy=1 SMUC не найден +; =0 SMUC обнаружен +; d - номер версии +; e - номер ревизии +x2422 ld de,#FFFF + call x0D51 ;определение наличия SMUC + jr c,x2441 ;не найден + ld bc,#5FBA + in a,(c) + inc a + jr z,x2441 ;версии нет. не найден + dec a + call x2443 ;преобразование версии/ревизии в число + ld d,a + ld bc,#5FBE + in a,(c) + call x2443 ;преобразование версии/ревизии в число + ld e,a + ret +x2441 scf + ret +;преобразование версии/ревизии в число +x2443 ld b,a + rrca + rrca + rrca + and #01 + ld c,a + ld a,b + rlca + rlca + rlca + or c + and #07 + ret + +;неиспользуемая область +x2452 ds #AE,0 ;not used + +;АДРЕС: #2500 ROM-disk +x2500 INCBIN "prof_roms/rom7_ROMdisk.bin" + + SAVEBIN "../Build/scorp/NewROM7.bin",#0000,#4000 + diff --git a/ProfRom_Disasm/rom7.bat b/ProfRom_Disasm/rom7.bat new file mode 100755 index 0000000..bb8713f --- /dev/null +++ b/ProfRom_Disasm/rom7.bat @@ -0,0 +1,4 @@ +MkDir !bin +MkDir !log +DEL /Q !log\*.* +..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom7.a80 >> !log\error.txt From 5e3c28682267f2165067d46d4b8de90dfd7c88a6 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 28 Jun 2023 04:05:47 +1000 Subject: [PATCH 011/114] label rename --- Shared_Includes | 2 +- ZX_EXP/EXP_FN2.ASM | 2 +- ZX_EXP/EXP_LP2.ASM | 2 +- ZX_EXP/FONT.ASM | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index fc7af6f..520455d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit fc7af6fc40d61e9f8e626b39a8423d29a955afb2 +Subproject commit 520455dbdc4c10f1850fd697aa5be4703d6cfd27 diff --git a/ZX_EXP/EXP_FN2.ASM b/ZX_EXP/EXP_FN2.ASM index 8abdb5b..ea1afb7 100644 --- a/ZX_EXP/EXP_FN2.ASM +++ b/ZX_EXP/EXP_FN2.ASM @@ -708,7 +708,7 @@ INIT_SYS_ALL: LD (HL),0 LDIR - LD DE,ZG_ADRESS + LD DE,ZG_ADDRESS LD (WIN_ZG-4000h),DE LD HL,L_SCORPION LD (CONFIG_ALL-4000h),HL diff --git a/ZX_EXP/EXP_LP2.ASM b/ZX_EXP/EXP_LP2.ASM index 1e7b664..bd768a8 100644 --- a/ZX_EXP/EXP_LP2.ASM +++ b/ZX_EXP/EXP_LP2.ASM @@ -868,7 +868,7 @@ LP_BEG_P: ; for low printer & save WIN_GET_ZG: ; DE - адрес куда переслать фонт - LD HL,ZG_ADRESS + LD HL,ZG_ADDRESS LD BC,800H LDIR AND A diff --git a/ZX_EXP/FONT.ASM b/ZX_EXP/FONT.ASM index bde6d66..46f9495 100644 --- a/ZX_EXP/FONT.ASM +++ b/ZX_EXP/FONT.ASM @@ -1,4 +1,4 @@ -ZG_ADRESS: +ZG_ADDRESS: DB 000h,07Eh,07Eh,06Ch,010h,038h,010h,000h,0FFh,000h,0FFh,00Fh,03Ch,03Fh,07Fh,018h DB 080h,002h,018h,066h,07Fh,03Eh,000h,018h,018h,018h,000h,000h,000h,000h,000h,000h DB 000h,030h,06Ch,06Ch,030h,000h,038h,060h,018h,060h,000h,000h,000h,000h,000h,006h From cbba008a6260cb6b897ffd6138b57597447386f1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 29 Jun 2023 19:29:19 +1000 Subject: [PATCH 012/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 520455d..5808d28 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 520455dbdc4c10f1850fd697aa5be4703d6cfd27 +Subproject commit 5808d28cf9725f6e1d239934e29a1b12a80dce81 From 7c1e15a4680df4df54bf647f020b134886ad0c26 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 4 Jul 2023 22:59:18 +1000 Subject: [PATCH 013/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5808d28..3fa91af 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5808d28cf9725f6e1d239934e29a1b12a80dce81 +Subproject commit 3fa91af2db4f96a96f3342d7291deb4d63a90591 From c87bd450cd547b59007752cf90726aa5545540e5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 19 Jul 2023 01:20:00 +1000 Subject: [PATCH 014/114] refactoring --- Shared_Includes | 2 +- ZX_EXP.ASM | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 3fa91af..3a3a4fe 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3fa91af2db4f96a96f3342d7291deb4d63a90591 +Subproject commit 3a3a4fe44981e0a75f4925234aa2609ee81b96b4 diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index 839670d..2056ff0 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -11,7 +11,7 @@ ORG 0 SPRIN2 EQU 2 ; 1 - включение Sprinter-1 первой прошивкой - ; 2 - включение Sprinter-2 первой прошивкой + ; 2 - включение Sprinter-2 первой прошивкой INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. INCLUDE 'shared_includes/constants/zx_char_codes.inc' @@ -661,20 +661,21 @@ NO_CONFIG_: POP HL ; конфигурация LD A,H - CP 0FFH + CP #FF JR NZ,NO_SETUP_1 LD A,L - IF SPRIN2 EQ 2 - CP 0FDH + IF SPRIN2 = 2 + CP #FD ; LD BC,0FFFDH ; Конфигурация Sprinter-2 -PG_SP1 equ 0ECH -PG_SP2 equ 0EEH -PG_AY equ 0EAH -ELSE +PG_SP1 EQU #EC +PG_SP2 EQU #EE +PG_AY EQU #EA + + ELSE ; LD BC,0FFFEH ; Конфигурация Sprinter-1 - CP 0FEH - PG_AY equ 0EAH + CP #FE +PG_AY EQU #EA ENDIF JR NZ,NO_SETUP_2 ; AND A @@ -737,7 +738,7 @@ NO_SETUP_2: NO_SETUP_1: - LD A,(0A8h) + LD A,(TABLE_X + 8) OUT (LPT1_D),A LD A,0FEh ; ACC-off From 1f599b0a0cbbf6d95e858428e13e411d3e0e1a6c Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 31 Jul 2023 01:46:04 +1000 Subject: [PATCH 015/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 3a3a4fe..3bc0bf4 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3a3a4fe44981e0a75f4925234aa2609ee81b96b4 +Subproject commit 3bc0bf4868ef3bb368e43e509d443e661e146359 From 5edf364e910542991a80659988dc529e1917d041 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 3 Aug 2023 00:17:40 +1000 Subject: [PATCH 016/114] ... --- Shared_Includes | 2 +- ZX_EXP/EXP_LP2.ASM | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 3bc0bf4..785b2ad 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3bc0bf4868ef3bb368e43e509d443e661e146359 +Subproject commit 785b2adeb82bc426c6a7cc5da0d2c041d414ebc3 diff --git a/ZX_EXP/EXP_LP2.ASM b/ZX_EXP/EXP_LP2.ASM index bd768a8..a9f757e 100644 --- a/ZX_EXP/EXP_LP2.ASM +++ b/ZX_EXP/EXP_LP2.ASM @@ -1837,19 +1837,22 @@ WIN_PUT_SYM: ; DE - CALL LP_END_P RET -WIN_MOVE_WIN: ; HL - размер окна - ; DE - положение окна - AND A ; A - номер окна - SCF ; IX - новое положение окна +; HL - размер окна +; DE - положение окна +; A - номер окна +; IX - новое положение окна +WIN_MOVE_WIN: + AND A + SCF RET NZ PUSH IX PUSH HL - LD B,0FFH + LD B,0FFH ;!HARDCODE SHARED_PAGE LD IX,0C000H CALL WIN_COPY_WIN1 POP HL POP DE - LD B,0FFH + LD B,0FFH ;!HARDCODE SHARED_PAGE LD IX,0C000H CALL WIN_REST_WIN1 AND A From 4fb166161b3e1319b62d9e84777085c9126cea27 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 4 Aug 2023 02:42:34 +1000 Subject: [PATCH 017/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 785b2ad..b325c32 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 785b2adeb82bc426c6a7cc5da0d2c041d414ebc3 +Subproject commit b325c3281f76e83037cb0019450ae6e36689db65 From f24c58de1612faef3755949ffe03998bab4fbd3f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 8 Aug 2023 23:47:12 +1000 Subject: [PATCH 018/114] ref --- ZX_EXP.ASM | 1 - ZX_EXP/EXP_HDD.ASM | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index 2056ff0..a799285 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -1583,7 +1583,6 @@ HDD_MSG_LEN EQU $-HDD_MSG ;HDD_MSG_NO: DB "Boot record not found" ;HDD_NO_LEN EQU $-HDD_MSG_NO - SAVE_AUTOSTART: LD HL,8000H LD DE,HDD_MSG diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index 4de9717..ddda963 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -23,23 +23,23 @@ HD_CMD: JP HD_DOS_RET -HD_CMD_X: ; C - COMAND ( 5 - RD, 6 - WR ) +HD_CMD_X: ; C - COMAND ( 5 - RD, 6 - WR ) PUSH AF - LD A,C ; 0 - INIT, 1 - DIAG + LD A,C AND A - JP Z,HD_CMD_0 ; инициализация + JP Z,HD_CMD_0 ; 0 - инициализация DEC A - JP Z,HD_CMD_1 ; ?? + JP Z,HD_CMD_1 ; 1 - DIAG DEC A - JP Z,HD_CMD_2 ; тест + JP Z,HD_CMD_2 ; 2 - тест DEC A - JP Z,HD_CMD_3 ; preread + JP Z,HD_CMD_3 ; 3 - preread DEC A - JP Z,HD_CMD_4 ; read bpb + JP Z,HD_CMD_4 ; 4 - read bpb DEC A - JP Z,HD_CMD_5 ; read + JP Z,HD_CMD_5 ; 5 - read DEC A - JP Z,HD_CMD_6 ; write + JP Z,HD_CMD_6 ; 6 - write DEC A JP Z,FN_HDD_PART POP AF From 24dbd478db7d07733e32521604890c5c4982e8a5 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 8 Aug 2023 23:47:42 +1000 Subject: [PATCH 019/114] shared update --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index b325c32..7e4985b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b325c3281f76e83037cb0019450ae6e36689db65 +Subproject commit 7e4985b40214f573ba17b707ad5191319841acdd From 1105ed98ca4eee7f1c371513d3c9995fbda427f9 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 16 Aug 2023 23:50:29 +1000 Subject: [PATCH 020/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 7e4985b..84a9262 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e4985b40214f573ba17b707ad5191319841acdd +Subproject commit 84a92620cab98867eb5b892d1ae17cd206c2b1bd From d9219a584769ab9d6491a2ded3372e0707ca137b Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 17 Aug 2023 02:41:12 +1000 Subject: [PATCH 021/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 84a9262..3bb9484 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 84a92620cab98867eb5b892d1ae17cd206c2b1bd +Subproject commit 3bb94842957f7b5df05da6bcf9e5b12dbab2d3b3 From 9cd72d1262d476481ba4f54dfbcbc1ebbf0a1c7d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 30 Aug 2023 23:43:38 +1000 Subject: [PATCH 022/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 3bb9484..5aa6fff 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3bb94842957f7b5df05da6bcf9e5b12dbab2d3b3 +Subproject commit 5aa6ffff2b5879e26a8ccf0925c18223c76da539 From 22082b4f922360e25606b49b9479d735c415da34 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 6 Sep 2023 00:21:04 +1000 Subject: [PATCH 023/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5aa6fff..cc23cc9 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5aa6ffff2b5879e26a8ccf0925c18223c76da539 +Subproject commit cc23cc96bb8bb12432622cc688b2e1afe39c6105 From e6ee7dc433d4b99f5183a60c376ea712698e652a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 6 Sep 2023 04:37:10 +1000 Subject: [PATCH 024/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index cc23cc9..9a65a38 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit cc23cc96bb8bb12432622cc688b2e1afe39c6105 +Subproject commit 9a65a386bfb6aaccc7fb476a3e159a684af65743 From 735d1d7b4af4812c197ead1788463b6338d71f36 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 11 Sep 2023 01:58:32 +1000 Subject: [PATCH 025/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 9a65a38..6c92964 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9a65a386bfb6aaccc7fb476a3e159a684af65743 +Subproject commit 6c92964be4fbbbec546d52ad6e2b51fd596d8a02 From b92a942b8b7180b1147df5801d1ccd0c95dfa4cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 11 Sep 2023 02:58:56 +1000 Subject: [PATCH 026/114] ... --- ZX_EXP/SERVICE.ASM | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index 8b8b48f..c5c5e96 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -3,7 +3,7 @@ SERVICE: LD HL,SR_TAB LD DE,SR_MENU - LD BC,SR_LEN + LD BC,SR_MENU.Size PUSH HL CALL RUN_MENU ;09f3 POP HL @@ -31,8 +31,7 @@ SR_MENU: DC 'Clear RAM' DC 'RETURN' DC " " ; маркер конца - -SR_LEN EQU $-SR_MENU +.Size EQU $-SR_MENU ;***************************** From b2a90ab3a1853ca445a08d3ea3036099305a64f7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 14 Sep 2023 03:34:59 +1000 Subject: [PATCH 027/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 6c92964..947627f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 6c92964be4fbbbec546d52ad6e2b51fd596d8a02 +Subproject commit 947627f58f37509150f653c81c82d742a4123cb6 From a67f6f67b23a9aeaf9cd60effca9cc5611320659 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 16 Sep 2023 05:03:39 +1000 Subject: [PATCH 028/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 947627f..5e191ab 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 947627f58f37509150f653c81c82d742a4123cb6 +Subproject commit 5e191abb607579b956507225290109767456271a From 133cbaa603a81e9b2e0ff7fabdb079b3a74e7c8f Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 17 Sep 2023 02:46:30 +1000 Subject: [PATCH 029/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5e191ab..b593cb6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5e191abb607579b956507225290109767456271a +Subproject commit b593cb606636c961e49597b9b1e5b6ee72d191c9 From 6d1ee48bc21d35e4d1203488335f0e73a508fd69 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 3 Nov 2023 02:27:25 +1000 Subject: [PATCH 030/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index b593cb6..2308a92 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b593cb606636c961e49597b9b1e5b6ee72d191c9 +Subproject commit 2308a92341b8cf17b710c05123feec4d4dc55609 From 96cc4816a16a47b73b56566013c923c41db6f7e7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 5 Nov 2023 04:51:07 +1000 Subject: [PATCH 031/114] ... --- SP__48.ASM | 3 +-- Shared_Includes | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/SP__48.ASM b/SP__48.ASM index 8c9301e..f576190 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19272,12 +19272,11 @@ L3C97: ; ║ дополнения для SP48 !! ║ ; ║ для перехода EXP-BAS48 ║ ; ║ 16 байт + 22 байта ║ - ; ╚═══════════════════════════╝ ;!FIXIT сделать выбор страницы макросом с условиями компиляции, ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 - //LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 + //LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 ; JR JMP_EX diff --git a/Shared_Includes b/Shared_Includes index 2308a92..866c86e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 2308a92341b8cf17b710c05123feec4d4dc55609 +Subproject commit 866c86ed7b05965f52b41997aab711a32c669cbc From 125f9faa01e183058e60a5b65ea9c58000d8ecbe Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 7 Nov 2023 03:03:24 +1000 Subject: [PATCH 032/114] ... --- SP_TRDOS.ASM | 286 +++--- Shared_Includes | 2 +- TRDOS/TR_RMD_S.ASZ | 6 +- ZX_EXP.ASM | 4 +- ZX_EXP/EXP_HDD.ASM | 135 ++- ZX_EXP2.ASM | 13 +- inc/rom_routines.inc | 2258 +++++++++++++++++++++--------------------- 7 files changed, 1346 insertions(+), 1358 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index cf9b774..eeb9234 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -9,6 +9,8 @@ ;*************************************** INCLUDE 'INC/SPRINT00.INC' + INCLUDE 'inc/rom_routines.inc' + INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' ;*************************************** ;CNF_PORT EQU #74 AUTO_4000 EQU 04000H @@ -214,8 +216,7 @@ AUTO_00C8: LD HL,RET_INS AUTO_0100: LD (HL),201 - RST RST20 - DW 00EDFH + RST_ROM ROUTINE.clear_prb LD HL,L_SCR_SIZE LD (HL),2 LD HL,AUTO_128B @@ -254,8 +255,7 @@ AUTO_0140: LD (NEW_PPC),HL XOR A LD (NEW_S_PPC),A - RST RST20 - DW 016B0H + RST_ROM ROUTINE.set_min LD HL,(BAS_PROG) DEC HL LD (DATA_ADR),HL @@ -264,8 +264,7 @@ AUTO_0140: OR A LD HL,AUTO_1B76 JR Z,AUTO_0166 - RST RST20 - DW 01BB0H + RST_ROM ROUTINE.report_0 AUTO_0166: PUSH HL LD HL,RET_INS @@ -498,7 +497,7 @@ AUTO_030A: CALL AUTO_3DC8 ; SET CONT_DISK POP AF AUTO_031A: - LD HL,AUTO_2FF3 ; СПИСОК КОМАНД + LD HL,TRDOS_CMD.LIST ; СПИСОК КОМАНД DEC HL LD C,0 AUTO_0320: @@ -522,7 +521,7 @@ AUTO_0320: LD HL,FLAGS RES 7,(HL) LD B,0 - LD HL,AUTO_3008 + LD HL,TRDOS_CMD.TABLE DEC C SLA C ADD HL,BC @@ -1215,18 +1214,15 @@ AUTO_1052: PUSH BC PUSH DE AUTO_1056: - RST RST20 - DW 0028EH + RST_ROM ROUTINE.key_scan AUTO_1059: LD C,0 JR NZ,AUTO_1056 - RST RST20 - DW 0031EH + RST_ROM ROUTINE.key_test JR NC,AUTO_1056 DEC D LD E,A - RST RST20 - DW 00333H + RST_ROM ROUTINE.key_decode POP DE POP BC POP HL @@ -1966,9 +1962,8 @@ AUTO_166F: LD (VAR_1),HL JP AUTO_1E23 AUTO_1680: - RST RST20 - DW 01F1AH - LD HL,0FFFFh + RST_ROM ROUTINE.free_mem + LD HL,#FFFF SBC HL,BC LD A,H CP 16 @@ -2435,8 +2430,7 @@ CMD_MERGE: LD (MED_LEN),BC PUSH BC INC BC - RST RST20 - DW 00030H + RST_ROM ROUTINE.bc_spaces AUTO_19D1: LD (HL),128 EX DE,HL @@ -2450,8 +2444,7 @@ AUTO_19D1: CALL AUTO_1921 POP HL LD DE,(BAS_PROG) - RST RST20 - DW 008D2H + RST_ROM ROUTINE.me_new_lp JP AUTO_03E1 AUTO_19F2: EX DE,HL @@ -2463,8 +2456,7 @@ AUTO_19F2: LD B,H LD C,L AUTO_19FD: - RST RST20 - DW 01F05H + RST_ROM ROUTINE.test_room RET AUTO_1A01: LD DE,(BAS_PROG) @@ -2498,8 +2490,7 @@ AUTO_1A31: POP DE POP HL PUSH BC - RST RST20 - DW 019E5H + RST_ROM ROUTINE.reclaim_1 POP BC CALL AUTO_1E32 INC HL @@ -2963,14 +2954,13 @@ CMD_RUN: AUTO_1D63: LD HL,BAS_DOS_FLG LD A,(HL) - DB 254 -AUTO_1D68: - RST R38 + CP #FF LD (HL),0 RET NZ - RST RST20 - DW 016BFH + RST_ROM ROUTINE.set_work RET +; Проверка, идет ли проверка строки на синтаксис или выполнение команды. +; Если идет выполнение, то флаг Z будет сброшен, иначе установлен. AUTO_1D70: BIT 7,(IY+1) RET @@ -2986,32 +2976,26 @@ AUTO_1D7B: OPEN_CH0: XOR A AUTO_1D84: - RST RST20 - DW 01601H + RST_ROM ROUTINE.chan_open RET OPEN_CH2: LD A,2 JR AUTO_1D84 AUTO_1D8C: - RST RST20 - DW 00018H + RST_ROM ROUTINE.get_char AUTO_1D8F: RET CALL OPEN_CH0 - RST RST20 - DW 00F2CH + RST_ROM ROUTINE.editor RET AUTO_1D97: - RST RST20 - DW 00D6BH + RST_ROM ROUTINE.cls RET AUTO_1D9B: - RST RST20 - DW 028B2H + RST_ROM ROUTINE.look_vars RET AUTO_1D9F: - RST RST20 - DW 00D6EH + RST_ROM ROUTINE.cls_lower RET AUTO_1DA3: LD C,A @@ -3022,25 +3006,20 @@ AUTO_1DA9: PUSH BC CALL xchg_intf1 POP BC - RST RST20 - DW 01A1BH + RST_ROM ROUTINE.out_num_1 CALL xchg_intf1 RET BAS_2BF1: - RST RST20 - DW 02BF1H + RST_ROM ROUTINE.stack_fetch RET AUTO_1DB9: - RST RST20 - DW 01E99H + RST_ROM ROUTINE.find_int2 RET AUTO_1DBD: - RST RST20 - DW 01C8CH + RST_ROM ROUTINE.expt_exp RET AUTO_1DC1: - RST RST20 - DW 01C82H + RST_ROM ROUTINE.expt_1num RET AUTO_1DC5: LD HL,(ADR_DOS_COM) @@ -3088,27 +3067,22 @@ AUTO_1E0B: RET AUTO_1E1C: LD HL,(ADR_DOS_COM) - RST RST20 - DW 011A7H + RST_ROM ROUTINE.remove_fp RET AUTO_1E23: LD HL,(WORK_SP) - RST RST20 - DW 00030H + RST_ROM ROUTINE.bc_spaces AUTO_1E29: RET BASIC_RST20: - RST RST20 - DW 00020H + RST_ROM ROUTINE.next_char AUTO_1E2D: RET AUTO_1E2E: - RST RST20 - DW 019E8H + RST_ROM ROUTINE.reclaim_2 RET AUTO_1E32: - RST RST20 - DW 01655H + RST_ROM ROUTINE.make_room RET READ_TRK_NUM: CALL READ_ADR_LABL @@ -3319,8 +3293,7 @@ AUTO_1F55: CALL AUTO_1DA9 JP AUTO_01D3 AUTO_1FB9: - DB 1,9,2,10,3,11,4,12,5,13,6,14,7,15,8 - DB 16,1 + DB 1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1 test_d_traks: CALL get_disk_time OR 17 @@ -3650,8 +3623,7 @@ AUTO_2206: JP AUTO_03D9 AUTO_220F: LD A,(MED_LEN) - RST RST20 - DW 01727H + RST_ROM ROUTINE.str_data1 LD A,B OR C JP NZ,AUTO_221B @@ -4052,8 +4024,7 @@ AUTO_2492: AUTO_2494: LD (ERR_NR),A CALL AUTO_20E5 - RST RST20 - DW 00058H + RST_ROM ROUTINE.error_4 RET AUTO_249E: LD A,23 @@ -4285,8 +4256,7 @@ AUTO_2614: AUTO_261D: CP 13 JR Z,AUTO_2614 - RST RST20 - DW 00F85H + RST_ROM ROUTINE.add_char_keeping_current_mode JR AUTO_260F AUTO_2626: CALL AUTO_262B @@ -4327,8 +4297,7 @@ CMD_CLOSE: CALL AUTO_1E0B CALL SINTAX_RET LD A,(MED_LEN) - RST RST20 - DW 01727H + RST_ROM ROUTINE.str_data1 LD A,B OR C JP Z,AUTO_01D3 @@ -4718,27 +4687,29 @@ AUTO_2992: RET ; ; -; -CMD_40: - XOR A - - +; Выполнение команды "40". Установите #5D11 и #5C3B. Используется также с адреса: +;#2998 (выполнение команды установки типа дисковода; установите все для #2997 плюс в A тип дисковода). +CMD_40: XOR A ;дисковод 40-дорожечный односторонний +;Ошибка!!! Во-первых, почему дисковод односторонний? +; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. AUTO_2998: - BLOCK #2998 - $,255 - LD (MED_START),A - CALL SINTAX_RET - CALL TEST_CR - JP Z,CMD_ERROR - CALL get_disk_type - LD A,(MED_START) - LD (HL),A - JP AUTO_03E1 -; -; -; -CMD_80: - LD A,128 + LD (MED_START),A ;сохранение типа дисковода + CALL SINTAX_RET ;если идет проверка на синтакси + CALL TEST_CR ;проверка второго символа строк + JP Z,CMD_ERROR ;если это ENTER, то *ERROR* + CALL get_disk_type ;берем адрес ячейки с типом дис + LD A,(MED_START) ;установка типа дисковода + LD (HL),A + JP AUTO_03E1 ;сообщение O.K. + ; Выполнение команды "80". Установите #5D11 и #5C3B. +CMD_80: LD A,#80 ;дисковод 80-дорожечный односторонний +;Ошибка!!! Во-первых, почему дисковод односторонний? +; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. JR AUTO_2998 +; +; +; +;Адрес #29B2. Тексты сообщений TR-DOS. AUTO_29B2: DB 13,"*ERROR*",141 AUTO_29BB: @@ -5589,44 +5560,69 @@ AUTO_2FDE: LD HL,BUFER LDIR RET -; -; COMANDS -; -AUTO_2FF3: - DB 207,42,208,209 - DB 230,210,239,248 - DB 254,190,244,213 - DB 247,211,212,255 - DB 52,236,56,240 - DB 214,'/' -AUTO_3008: - DW CMD_CAT - DW CMD_STAR - DW CMD_FORMAT - DW CMD_MOVE - DW CMD_NEW - DW CMD_ERASE - DW CMD_LOAD - DW CMD_SAVE - - DW CMD_RETURN - DW CMD_PEEK - DW CMD_POKE - DW CMD_MERGE - - DW CMD_RUN - DW CMD_OPEN - DW CMD_CLOSE - DW CMD_COPY - - DW CMD_40 - DW CMD_GOTO - DW CMD_80 - DW CMD_LIST - - DW CMD_VERIFY +//////////////////////////////////////////// +TRDOS_CMD: + ; Таблица команд TR-DOS. +.LIST: DB ZX_Token.cat + DB '*' + DB ZX_Token.format + DB ZX_Token.move + ; + DB ZX_Token.new + DB ZX_Token.erase + DB ZX_Token.load + DB ZX_Token.save + ; + DB ZX_Token.return + DB ZX_Token.peek + DB ZX_Token.poke + DB ZX_Token.merge + ; + DB ZX_Token.run + DB ZX_Token.open_channel + DB ZX_Token.close_channel + DB ZX_Token.copy + ; + DB '4' + DB ZX_Token.go_to + DB '8' + DB ZX_Token.list + ; + DB ZX_Token.verify + DB '/' + ;; + ;; +.Size EQU $ - TRDOS_CMD.LIST + ; Таблица адресов подпрограмм, выполняющих команды TR-DOS. +.TABLE: DW CMD_CAT + DW CMD_STAR + DW CMD_FORMAT + DW CMD_MOVE + ; + DW CMD_NEW + DW CMD_ERASE + DW CMD_LOAD + DW CMD_SAVE + ; + DW CMD_RETURN + DW CMD_PEEK + DW CMD_POKE + DW CMD_MERGE + ; + DW CMD_RUN + DW CMD_OPEN + DW CMD_CLOSE + DW CMD_COPY + ; + DW CMD_40 + DW CMD_GOTO + DW CMD_80 + DW CMD_LIST + ; + DW CMD_VERIFY DW CMD_MSDOS +//////////////////////////////////////////// ; ; ; @@ -5665,11 +5661,9 @@ AUTO_3057: ; LD (HL),A INC HL EX DE,HL - RST RST20 - DW 019DDH + RST_ROM ROUTINE.differ PUSH BC - RST RST20 - DW 019E8H + RST_ROM ROUTINE.reclaim_2 POP BC LD A,(DOS_ERROR) OR A @@ -5760,8 +5754,7 @@ AUTO_30E1: LD (DOS_ERROR),A DEC HL DEC HL - RST RST20 - DW 0196EH + RST_ROM ROUTINE.line_addr RET AUTO_30F4: LD A,255 @@ -5947,14 +5940,14 @@ FORM_STATE: INC HL LD A,(HL) FORM_NO_NEXT: - CP 0Dh + CP #0D RET Z - CP 80H + CP #80 RET Z JP NC,CMD_ERROR CP ' ' JP C,CMD_ERROR - AND 0DFh + AND #DF LD (MED_START+1),A RET ; @@ -6048,8 +6041,7 @@ FORM_X03: CALL AUTO_1C57 CALL AUTO_1D97 LD A,2 - RST RST20 - DW 01601H + RST_ROM ROUTINE.chan_open LD HL,NEW_NAME RST PRINT_LN @@ -6102,8 +6094,7 @@ F_FAST: ; Turbo/FAST FORMAT JR FORM_X08 F_TURBO_DT: - DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 - DB 16,1 + DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1 SUB_HL_14: @@ -6115,8 +6106,7 @@ SUB_HL_14: RET LOW_CLS_AT00: - RST RST20 - DW 00D6EH + RST_ROM ROUTINE.cls_lower LD HL,MSG_AT00 JP PRINT_LINE @@ -6480,8 +6470,7 @@ BEEP_1: LD HL,200 ; BEEP LD D,H LD E,(IY-1) - RST RST20 - DW 03B5h + RST_ROM ROUTINE.beeper POP AF RET @@ -6621,8 +6610,7 @@ PRINT_SYM: RST R38 RST R38 AUTO_3D94: - RST RST20 - DW #0010 ;!HARDCODE + RST_ROM ROUTINE.print_a RET AUTO_3D98: LD A,8 @@ -6630,12 +6618,10 @@ WG93_EXE: OUT (WG_COM),A AUTO_3D9C: PUSH HL - RST RST20 - DW #1F54 ;!HARDCODE + RST_ROM ROUTINE.break_key ;RET_1F54: JR C,AUTO_3DA5 - RST RST20 - DW #1B7B ;!HARDCODE + RST_ROM ROUTINE.report_l AUTO_3DA5: POP HL IN A,(P_DOS_FF) diff --git a/Shared_Includes b/Shared_Includes index 866c86e..4c835d3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 866c86ed7b05965f52b41997aab711a32c669cbc +Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index d4c67de..68ea148 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -453,9 +453,9 @@ RAMD_SET1: RAMD_SYM: LD A,(DE) INC DE - CP 20H + CP ' ' JR Z,RAMD_SYM - AND 223 + AND %1101'1111 CP 'E' RET C SUB 'E' @@ -468,7 +468,7 @@ RAMD_SYM: INC DE JR Z,RAMD_SYM_OK DEC DE - CP 21H + CP ' '+1 JR C,RAMD_SYM_OK POP AF SCF diff --git a/ZX_EXP.ASM b/ZX_EXP.ASM index a799285..ddb1096 100644 --- a/ZX_EXP.ASM +++ b/ZX_EXP.ASM @@ -1584,7 +1584,7 @@ HDD_MSG_LEN EQU $-HDD_MSG ;HDD_MSG_NO: DB "Boot record not found" ;HDD_NO_LEN EQU $-HDD_MSG_NO SAVE_AUTOSTART: - LD HL,8000H + LD HL,#8000 LD DE,HDD_MSG LD B,HDD_MSG_LEN SAVE_AUTO_L1: @@ -1599,7 +1599,7 @@ SAVE_AUTO_L1: CALL EXP_HDD RET C - LD HL,8000H + LD HL,#8000 LD A,0 LD DE,1 LD IX,0 diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index ddda963..2903b09 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -4,7 +4,7 @@ MACRO WAIT_HDD .LL1: - LD BC,P_HDST + LD BC,IDE.Read.Status IN A,(C) BIT 7,A JR NZ,.LL1 @@ -49,14 +49,14 @@ HD_CMD_X: ; C - COMAND ( 5 - RD, 6 - WR ) HD_BPB_PREP: LD D,A - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(HD_IDF_ADR+12) + OUT (SLOT3),A + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) LD E,A EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A LD A,D LD D,0 LD IX,0 @@ -76,16 +76,16 @@ HD_PREPARE: HD_PREP_L1: LD A,B - LD BC,P_S_CNT ; Установить число секторов для чтения + LD BC,IDE.Write.Counter ; Установить число секторов для чтения OUT (C),A - LD BC,P_S_NUM + LD BC,IDE.Write.Sector OUT (C),L ; СЕКТОР - LD BC,P_C_LOW + LD BC,IDE.Write.CylinderLow OUT (C),E ; дорожка low - LD BC,P_C_HIG + LD BC,IDE.Write.CylinderHigh OUT (C),D ; дорожка high - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead DEC B IN A,(C) AND 0F0H @@ -112,19 +112,18 @@ HD_CMD_3: ; RET C EXX - LD C,PAGE3 + LD C,SLOT3 IN B,(C) EXX - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' LD A,0C0H OUT (RGADR),A - LD BC,P_CMD - LD A,20H + LD BC,IDE.Write.Command + LD A,#20 ; OUT (C),A - AND A RET @@ -159,16 +158,16 @@ HD_RD_CMD: HD_RD_L1: EXX - LD C,PAGE3 + LD C,SLOT3 IN B,(C) EXX - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' LD A,0C0H OUT (RGADR),A - LD BC,P_CMD + LD BC,IDE.Write.Command LD A,20H OUT (C),A @@ -184,7 +183,7 @@ HD_RET: EXX OUT (C),B EXX - LD BC,P_ERR + LD BC,IDE.Read.Error IN A,(C) AND A SCF @@ -195,7 +194,7 @@ HD_RET: RET HD_READ_CONT: - LD BC,P_DATS + LD BC,IDE.Read.Data HD_RD_CONT1: DUP 16 @@ -216,12 +215,12 @@ HD_RD_CONT2: JR NZ,HD_RD_L2 LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' - LD HL,RAMD_FAT + LD HL,SYS_PAGE.RAMD_FAT LD L,A LD A,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' LD HL,0C000H JR HD_RD_L2 @@ -243,13 +242,13 @@ HD_WR_CMD: RET C EXX - LD C,PAGE3 + LD C,SLOT3 IN B,(C) EXX - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' - LD BC,P_CMD + LD BC,IDE.Write.Command LD A,30H OUT (C),A @@ -262,7 +261,7 @@ HD_WR_L2: ;####################################### IF HDD_TYPE - LD BC,P_DATS+100H + LD BC,IDE.Read.Data+100H LD D,32 HD_WR_CONT1: DUP 16 @@ -274,7 +273,7 @@ HD_WR_CONT1: ;####################################### ELSE LD D,64 - LD BC,P_DATS+100H + LD BC,IDE.Read.Data+100H HD_WR_LOOP: @@ -316,12 +315,12 @@ HD_WR_LOOP: JR NZ,HD_WR_L2 LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' - LD HL,RAMD_FAT + LD HL,SYS_PAGE.RAMD_FAT LD L,A LD A,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' LD HL,0C000H @@ -333,14 +332,14 @@ HD_CMD_1: POP AF HD_CMD1_EX: ld a,0A0h - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead OUT (C),A LD A,90h ; DIAGNOSTICS CALL HD_CMD_EXE AND A BIT 0,A RET Z - LD BC,P_ERR + LD BC,IDE.Read.Error IN A,(C) CP 1 RET Z @@ -354,7 +353,7 @@ HD_CMD_2: LD E,0 - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead LD A,0A0H OUT (C),A @@ -364,7 +363,7 @@ HD_CMD_2: SET 0,E NO_HDD1: - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead LD A,0B0H OUT (C),A @@ -383,15 +382,15 @@ NO_HDD2: TEST_HDD_DRV: LD HL,01FEH - LD BC,P_S_CNT + LD BC,IDE.Write.Counter OUT (C),L - LD BC,P_S_NUM + LD BC,IDE.Write.Sector OUT (C),H - LD BC,P_S_CNT+256 + LD BC,IDE.Write.Counter+256 IN A,(C) CP L RET NZ - LD BC,P_S_NUM+256 + LD BC,IDE.Write.Sector+256 IN A,(C) CP H RET @@ -400,7 +399,7 @@ HD_CMD_0: POP AF - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead LD A,0A0H OUT (C),A @@ -412,14 +411,14 @@ HD_C0_L3: WAIT_HDD - LD BC,P_CMD + LD BC,IDE.Write.Command LD A,0ECH OUT (C),A WAIT_HDD ;HD_C0_L1: ; -; LD BC,P_HDST +; LD BC,IDE.Read.Status ; IN A,(C) ; BIT 7,A ; JR NZ,HD_C0_L1 @@ -431,7 +430,7 @@ HD_C0_L3: RET HD_ABSENT: - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead LD A,0B0H OUT (C),A @@ -442,40 +441,40 @@ HD_ABSENT: RET HD_C0_L2: - LD BC,P_DATS - LD HL,HD_IDF_ADR - IN A,(PAGE3) + LD BC,IDE.Read.Data + LD HL,SYS_PAGE.HD_IDF_ADR + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A INIR INIR ;HD_C0_L4: -; LD BC,P_HDST +; LD BC,IDE.Read.Status ; IN A,(C) ; BIT 7,A ; JR NZ,HD_C0_L4 - LD A,(HD_IDF_ADR+12) ; число секторов + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; число секторов LD C,A LD B,0 LD HL,0 - LD A,(HD_IDF_ADR+6) ; число головок + LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; число головок LOOP_XX: ADD HL,BC DEC A JR NZ,LOOP_XX - LD (HD_IDF_ADR+4),HL + LD (SYS_PAGE.HD_IDF_ADR.sec_cyl),HL WAIT_HDD - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead DEC B IN A,(C) AND 010H LD B,A - LD A,(HD_IDF_ADR+6) ; число головок + LD A,(SYS_PAGE.HD_IDF_ADR.heads) ; число головок DEC A AND 0FH @@ -483,22 +482,22 @@ LOOP_XX: OR B LD H,A - LD A,(HD_IDF_ADR+99) + LD A,(SYS_PAGE.HD_IDF_ADR+99) ;!HARDCODE BIT 1,A JR Z,HD_C0_NO_LBA SET 6,H HD_C0_NO_LBA: - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead OUT (C),H - LD A,(HD_IDF_ADR+12) ; число секторов + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; число секторов - LD BC,P_S_CNT + LD BC,IDE.Write.Counter OUT (C),A LD A,D - OUT (PAGE3),A + OUT (SLOT3),A LD A,91H ; SET HDD PARAMETERS CALL HD_CMD_EXE @@ -512,7 +511,7 @@ HD_C0_NO_LBA: HD_CMD_EXE: CALL HD_WAIT RET C - LD BC,P_CMD + LD BC,IDE.Write.Command OUT (C),A HD_WAIT: PUSH DE @@ -522,7 +521,7 @@ HD_WAIT: LD DE,0 HD_WAIT1: - LD BC,P_HDST + LD BC,IDE.Read.Status IN A,(C) BIT 7,A JR Z,HD_W_EXIT @@ -565,7 +564,7 @@ HD_CALC_SECS: RET NZ ; ошибка, слишком большой HDD.. PUSH BC - LD BC,P_HD_CS + LD BC,IDE.Write.DeviceHead DEC B IN A,(C) BIT 6,A @@ -577,14 +576,14 @@ HD_CALC_SECS: PUSH IX POP HL - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD (COPY_PAGE3),A + LD (SYS_PAGE.COPY_SLOT3),A - LD BC,(HD_IDF_ADR+4) ; число секторов на цилиндре + LD BC,(SYS_PAGE.HD_IDF_ADR.sec_cyl) ; число секторов на цилиндре ; HL,DE - номер сектора ; BC - число секторов на цилиндре @@ -609,7 +608,7 @@ NO_ADD: INC DE DIV_END: ; DE - результат, HL - остаток ; DE - цилиндр - LD A,(HD_IDF_ADR+12) ; A - число секторов на дорожке + LD A,(SYS_PAGE.HD_IDF_ADR.sectors) ; A - число секторов на дорожке ; HL - номер сектора в цилиндре LD B,0 LD C,A @@ -626,8 +625,8 @@ HD_CALC_LOOP2: INC L LD H,A ; HL - HEAD,SEC - LD A,(COPY_PAGE3) - OUT (PAGE3),A + LD A,(SYS_PAGE.COPY_SLOT3) + OUT (SLOT3),A POP BC AND A diff --git a/ZX_EXP2.ASM b/ZX_EXP2.ASM index ac79c80..3f72b3c 100644 --- a/ZX_EXP2.ASM +++ b/ZX_EXP2.ASM @@ -3,7 +3,8 @@ DEVICE ZXSPECTRUM128 ORG 0 - INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. + ;INCLUDE 'INC/SPRINT00.INC' ; константы, макросы.. + INCLUDE 'shared_includes/constants/sp2000.INC' ; константы, макросы.. ; *************************** ; ***** BEGIN EXPANSION ***** ; *************************** @@ -64,7 +65,7 @@ HD_CMD_XR: BLOCK #3FE8-$,255 HD_EXP_RET: PUSH AF - LD A,D_ROM16OFF + LD A,CNF_PORT.ZX_BIOS ;!TEST ;OUT (SYS_PORT_ON),A OUT (CNF_PORT),A @@ -76,16 +77,16 @@ HD_EXP_RET: HD_DOS_RET: PUSH AF DI - LD A,D_ROM16OFF - OUT (SYS_PORT_OFF),A + LD A,CNF_PORT.ZX_BIOS + OUT (SYS_PORT.OFF),A JR HD_CMD_XR ;***********************************************************************; BLOCK #3FF8-$,255 EXP_FNS_RET: PUSH AF - LD A,D_ROM16OFF - OUT (SYS_PORT_OFF),A + LD A,CNF_PORT.ZX_BIOS + OUT (SYS_PORT.OFF),A //JP HD_CMD_XR_RET RET diff --git a/inc/rom_routines.inc b/inc/rom_routines.inc index 4a011dd..1bec256 100644 --- a/inc/rom_routines.inc +++ b/inc/rom_routines.inc @@ -27,1134 +27,1136 @@ ; 2017-02-09: Add two additional entry points, and two 128K routines. ; ============================================================== + MACRO RST_ROM name + RST #20 + DW name + ENDM -rom_0058: equ 0x0058 ; XXX TODO -- name -rom_abs: equ 0x346A -rom_acs: equ 0x3843 -rom_add_back: equ 0x3004 -rom_add_ch_1: equ 0x0F8B -rom_add_char: equ 0x0F81 -rom_add_char_keeping_current_mode: equ 0x0F85 -rom_add_rep_6: equ 0x309F -rom_addend_0: equ 0x2FF9 -rom_addition: equ 0x3014 -rom_addn_oflw: equ 0x303C -rom_all_added: equ 0x300D -rom_alpha: equ 0x2C8D -rom_alphanum: equ 0x2C88 -rom_arc_end: equ 0x245F -rom_arc_loop: equ 0x2425 -rom_arc_start: equ 0x2439 -rom_asn: equ 0x3833 -rom_atn: equ 0x37E2 -rom_auto_l_1: equ 0x17CE -rom_auto_l_2: equ 0x17E1 -rom_auto_l_3: equ 0x17E4 -rom_auto_l_4: equ 0x17ED -rom_auto_list: equ 0x1795 -rom_bc_spaces: equ 0x0030 -rom_be_end: equ 0x03F6 -rom_be_h_and_l_lp: equ 0x03D6 -rom_be_ix_plus_0: equ 0x03D4 -rom_be_ix_plus_1: equ 0x03D3 -rom_be_ix_plus_2: equ 0x03D2 -rom_be_ix_plus_3: equ 0x03D1 -rom_beep: equ 0x03F8 -rom_beeper: equ 0x03B5 -rom_bin_digit: equ 0x2CA2 -rom_bin_end: equ 0x2CB3 -rom_bits_zero: equ 0x3283 -rom_border: equ 0x2294 -rom_border_1: equ 0x22A6 -rom_border_2297: equ 0x2297 ; secondary entry to rom_border -rom_border_229b: equ 0x229B ; secondary entry to rom_border -rom_both_null: equ 0x3572 -rom_break_key: equ 0x1F54 ; return the carry flag reset if SHIFT and BREAK keys are both being pressed. -rom_byte_comp: equ 0x3564 -rom_byte_zero: equ 0x327E -rom_c_arc_ge1: equ 0x235A -rom_c_ent: equ 0x37B7 -rom_c_r_gre_1: equ 0x233B -rom_ca_10_by_a_plus_c: equ 0x2F8B -rom_calculate: equ 0x335B -rom_call_jump: equ 0x162C -rom_call_sub: equ 0x15F7 -rom_cases: equ 0x37FA -rom_cat_etc: equ 0x1793 -rom_cd_prms1: equ 0x247D -rom_ch_add_plus_1: equ 0x0074 -rom_chan_flag: equ 0x1615 -rom_chan_k: equ 0x1634 -rom_chan_op_1: equ 0x1610 -rom_chan_open: equ 0x1601 ; open a channel (channel in A) -rom_chan_p: equ 0x164D -rom_chan_s: equ 0x1642 ; set flags for upper screen channel -rom_chan_s_1: equ 0x1646 -rom_check_end: equ 0x1BEE -rom_chn_cd_lu: equ 0x162D -rom_chrs: equ 0x35C9 -rom_circle: equ 0x2320 -rom_cl_09_1: equ 0x1CD6 -rom_cl_addr: equ 0x0E9B -rom_cl_all: equ 0x0DAF ; clear whole (upper) display area -rom_cl_attr: equ 0x0E88 -rom_cl_chan: equ 0x0D94 -rom_cl_chan_a: equ 0x0DA0 -rom_cl_line: equ 0x0E44 -rom_cl_line_1: equ 0x0E4A -rom_cl_line_2: equ 0x0E4D -rom_cl_line_3: equ 0x0E80 -rom_cl_sc_all: equ 0x0DFE -rom_cl_scr_1: equ 0x0E05 -rom_cl_scr_2: equ 0x0E0D -rom_cl_scr_3: equ 0x0E19 -rom_cl_scroll: equ 0x0E00 ; scroll the number of lines in the B register -rom_cl_set: equ 0x0DD9 -rom_cl_set_1: equ 0x0DEE -rom_cl_set_2: equ 0x0DF4 -rom_cl_str_lu: equ 0x1716 -rom_class_01: equ 0x1C1F -rom_class_02: equ 0x1C4E -rom_class_03: equ 0x1C0D -rom_class_04: equ 0x1C6C -rom_class_05: equ 0x1C11 -rom_class_07: equ 0x1C96 -rom_class_09: equ 0x1CBE -rom_class_0b: equ 0x1CDB -rom_class_tbl: equ 0x1C01 -rom_clear: equ 0x1EAC -rom_clear_1: equ 0x1EB7 -rom_clear_2: equ 0x1EDC -rom_clear_prb: equ 0x0EDF -rom_clear_run: equ 0x1EAF -rom_clear_sp: equ 0x1097 -rom_close: equ 0x16E5 -rom_close_0_16EB: equ 0x16EB -rom_close_1: equ 0x16FC -rom_close_2: equ 0x1701 -rom_close_str: equ 0x171C -rom_cls: equ 0x0D6B ; CLS -rom_cls_1: equ 0x0D87 -rom_cls_2: equ 0x0D89 -rom_cls_3: equ 0x0D8E -rom_cls_lower: equ 0x0D6E -rom_co_change: equ 0x226C -rom_co_temp_1: equ 0x21E1 -rom_co_temp_2: equ 0x21E2 -rom_co_temp_3: equ 0x21F2 -rom_co_temp_4: equ 0x21FC -rom_co_temp_5: equ 0x2211 -rom_co_temp_6: equ 0x2228 -rom_co_temp_7: equ 0x2234 -rom_co_temp_8: equ 0x223E -rom_co_temp_9: equ 0x2246 -rom_co_temp_a: equ 0x2257 -rom_co_temp_b: equ 0x2258 -rom_co_temp_c: equ 0x2273 -rom_co_temp_d: equ 0x227D -rom_co_temp_e: equ 0x2287 -rom_code: equ 0x3669 -rom_comma_sp: equ 0x1537 -rom_continue: equ 0x1E5F -rom_copy: equ 0x0EAC -rom_copy_1: equ 0x0EB2 -rom_copy_2: equ 0x0EC9 -rom_copy_3: equ 0x0ED3 -rom_copy_buff: equ 0x0ECD -rom_copy_end: equ 0x0EDA -rom_copy_l_1: equ 0x0EFD -rom_copy_l_2: equ 0x0F0C -rom_copy_l_3: equ 0x0F14 -rom_copy_l_4: equ 0x0F18 -rom_copy_l_5: equ 0x0F1E -rom_copy_line: equ 0x0EF4 -rom_copyright: equ 0x1539 -rom_cos: equ 0x37AA -rom_count_one: equ 0x31FA -rom_cp_lines: equ 0x1980 -rom_ctlchrtab: equ 0x0A11 -rom_d_l_diag: equ 0x24D4 -rom_d_l_hr_vt: equ 0x24DB -rom_d_l_loop: equ 0x24CE -rom_d_l_plot: equ 0x24EC -rom_d_l_range: equ 0x24F7 -rom_d_l_step: equ 0x24DF -rom_d_letter: equ 0x2C1F -rom_d_no_loop: equ 0x2C2E -rom_d_rport_c: equ 0x2C05 -rom_d_run: equ 0x2C15 -rom_d_size: equ 0x2C2D -rom_data: equ 0x1E27 -rom_data_1: equ 0x1E2C -rom_data_2: equ 0x1E37 -rom_de_comma_paren_de_plus_1_paren: equ 0x2AEE -rom_dec_jr_nz: equ 0x367A -rom_dec_rpt_c: equ 0x2CCF -rom_dec_sto_1: equ 0x2CD5 -rom_dec_to_fp: equ 0x2C9B -rom_decimal: equ 0x2CCB -rom_def_fn: equ 0x1F60 -rom_def_fn_1: equ 0x1F6A -rom_def_fn_2: equ 0x1F7D -rom_def_fn_3: equ 0x1F86 -rom_def_fn_4: equ 0x1F89 -rom_def_fn_5: equ 0x1F94 -rom_def_fn_6: equ 0x1FA6 -rom_def_fn_7: equ 0x1FBD -rom_delete: equ 0x33A1 -rom_differ: equ 0x19DD -rom_dim: equ 0x2C02 -rom_dim_clear: equ 0x2C7C -rom_dim_sizes: equ 0x2C7F -rom_div_34th: equ 0x31DB -rom_div_loop: equ 0x31D2 -rom_div_start: equ 0x31E2 -rom_division: equ 0x31AF -rom_divn_expt: equ 0x313D -rom_dl_larger: equ 0x24CB -rom_dl_x_ge_y: equ 0x24C4 -rom_double_a: equ 0x338C -rom_dr_3_prms: equ 0x238D -rom_dr_prms: equ 0x23C1 -rom_dr_sin_nz: equ 0x23A3 -rom_draw: equ 0x2382 -rom_draw_line: equ 0x24B7 -rom_draw_line_24BA: equ 0x24BA ; entry point of the draw_line routine -rom_draw_save: equ 0x2497 -rom_drw_steps: equ 0x2420 -rom_e_divsn: equ 0x2D6D -rom_e_end: equ 0x2D7B -rom_e_fetch: equ 0x2D6E -rom_e_format: equ 0x2CEB -rom_e_fp_jump: equ 0x2D18 -rom_e_l_1: equ 0x1A15 -rom_e_line_no: equ 0x19FB -rom_e_loop: equ 0x2D60 -rom_e_save: equ 0x2D55 -rom_e_to_fp: equ 0x2D4F -rom_e_tst_end: equ 0x2D71 -rom_each_s_1: equ 0x1990 -rom_each_s_2: equ 0x1998 -rom_each_s_3: equ 0x199A -rom_each_s_4: equ 0x19A5 -rom_each_s_5: equ 0x19AD -rom_each_s_6: equ 0x19B1 -rom_each_stmt: equ 0x198B -rom_ed_again: equ 0x0F30 -rom_ed_blank: equ 0x1150 -rom_ed_c_done: equ 0x117C -rom_ed_c_end: equ 0x117E -rom_ed_contr: equ 0x0F6C -rom_ed_copy: equ 0x111D -rom_ed_cur: equ 0x1011 -rom_ed_delete: equ 0x1015 -rom_ed_down: equ 0x0FF3 -rom_ed_edge: equ 0x1031 -rom_ed_edge_1: equ 0x103E -rom_ed_edge_2: equ 0x1051 -rom_ed_edit: equ 0x0FA9 -rom_ed_end: equ 0x1026 -rom_ed_enter: equ 0x1024 -rom_ed_error: equ 0x107F -rom_ed_full: equ 0x1167 -rom_ed_graph: equ 0x107C -rom_ed_ignore: equ 0x101E -rom_ed_keys: equ 0x0F92 -rom_ed_keys_t: equ 0x0FA0 -rom_ed_left: equ 0x1007 -rom_ed_list: equ 0x106E -rom_ed_loop: equ 0x0F38 -rom_ed_right: equ 0x100C -rom_ed_spaces: equ 0x115E -rom_ed_stop: equ 0x1001 -rom_ed_symbol: equ 0x1076 -rom_ed_up: equ 0x1059 -rom_editor: equ 0x0F2C -rom_end_calc: equ 0x369B -rom_end_compl: equ 0x30A3 -rom_end_tests: equ 0x358C -rom_ent_table: equ 0x338E -rom_error_1: equ 0x0008 -rom_error_2: equ 0x0053 -rom_error_3: equ 0x0055 -rom_ex_or_not: equ 0x3543 -rom_exchange: equ 0x343C -rom_exit: equ 0x36C2 -rom_exp: equ 0x36C4 -rom_expt_1num: equ 0x1C82 -rom_expt_2num: equ 0x1C7A -rom_expt_exp: equ 0x1C8C -rom_f_found: equ 0x1D7C -rom_f_l_s: equ 0x1D34 -rom_f_loop: equ 0x1D64 -rom_f_reorder: equ 0x1D16 -rom_f_use_1: equ 0x1D10 -rom_fetch_num: equ 0x1CDE -rom_fetch_two: equ 0x2FBA -rom_find_i_1: equ 0x1E9C -rom_find_int1: equ 0x1E94 -rom_find_int2: equ 0x1E99 -rom_first_3d: equ 0x3380 -rom_fn_skpovr: equ 0x28AB -rom_for: equ 0x1D03 -rom_form_exp: equ 0x33DE -rom_fp_0_or_1: equ 0x350B -rom_fp_a_end: equ 0x2DE1 -rom_fp_calc: equ 0x0028 -rom_fp_calc_2: equ 0x33A2 -rom_fp_delete: equ 0x2DAD -rom_fp_to_a: equ 0x2DD5 -rom_fp_to_bc: equ 0x2DA2 -rom_free_mem: equ 0x1F1A -rom_frst_less: equ 0x3585 -rom_full_addn: equ 0x303E -rom_g_loop: equ 0x3453 -rom_gen_ent_1: equ 0x335E -rom_gen_ent_2: equ 0x3362 -rom_get_argt: equ 0x3783 -rom_get_char: equ 0x0018 -rom_get_hl_by_de: equ 0x2AF4 -rom_get_mem_xx: equ 0x340F -rom_get_param: equ 0x1B55 -rom_go_nc_mlt: equ 0x30A5 -rom_go_sub: equ 0x1EED -rom_go_to: equ 0x1E67 -rom_go_to_2: equ 0x1E73 -rom_go_to_bc: equ 0x1E6A ; 'GO TO' line in BC register -rom_go_to_hl: equ 0x1E6C ; 'GO TO' line in HL register XXX not tested -rom_gre.8: equ 0x373D -rom_greater_0: equ 0x34F9 -rom_hl_again: equ 0x30BC -rom_hl_by_de_to_hl: equ 0x30A9 ; HL=HL*DE -rom_hl_end: equ 0x30BE -rom_hl_hl_by_de: equ 0x30A9 -rom_hl_loop: equ 0x30B1 -rom_hlxde: equ 0x30A9 ; HL=HL*DE -rom_i_carry: equ 0x2AE8 -rom_i_restore: equ 0x2AEB -rom_if: equ 0x1CF0 -rom_if_1: equ 0x1D00 -rom_in: equ 0x34A5 -rom_in_assign: equ 0x21B9 -rom_in_chan_k: equ 0x21D6 -rom_in_item_1: equ 0x20C1 -rom_in_item_2: equ 0x20D8 -rom_in_item_3: equ 0x20ED -rom_in_next_1: equ 0x21AF -rom_in_next_2: equ 0x21B2 -rom_in_pk_stk: equ 0x34B0 -rom_in_pr_1: equ 0x211A -rom_in_pr_2: equ 0x211C -rom_in_pr_3: equ 0x2129 -rom_in_prompt: equ 0x20FA -rom_in_stop: equ 0x21D0 -rom_in_var_1: equ 0x213A -rom_in_var_2: equ 0x2148 -rom_in_var_3: equ 0x215E -rom_in_var_4: equ 0x2161 -rom_in_var_5: equ 0x2174 -rom_in_var_6: equ 0x219B -rom_indexer: equ 0x16DC -rom_indexer_1: equ 0x16DB -rom_init_chan: equ 0x15AF -rom_init_strm: equ 0x15C6 -rom_input: equ 0x2089 -rom_input_1: equ 0x2096 -rom_input_2: equ 0x20AD -rom_input_ad: equ 0x15E6 -rom_int: equ 0x36AF -rom_int_case: equ 0x3483 -rom_int_exp1: equ 0x2ACC -rom_int_exp2: equ 0x2ACD -rom_int_fetch: equ 0x2D7F -rom_int_store: equ 0x2D8E -rom_int_to_fp: equ 0x2D3B -rom_ix_end: equ 0x3290 -rom_jump: equ 0x3686 -rom_jump_2: equ 0x3687 -rom_jump_true: equ 0x368F -rom_k_8_and_9: equ 0x0382 -rom_k_@_char: equ 0x03B2 -rom_k_ch_set: equ 0x02D1 -rom_k_decode: equ 0x0333 -rom_k_digit: equ 0x0367 -rom_k_e_let: equ 0x0341 -rom_k_end: equ 0x0308 -rom_k_gra_dgt: equ 0x0389 -rom_k_klc_dgt: equ 0x039D -rom_k_klc_let: equ 0x034F -rom_k_look_up: equ 0x034A -rom_k_main: equ 0x032C -rom_k_new: equ 0x02F1 -rom_k_repeat: equ 0x0310 -rom_k_st_loop: equ 0x02C6 -rom_k_test: equ 0x031E -rom_k_tokens: equ 0x0364 -rom_key_3keys: equ 0x029F -rom_key_bits: equ 0x02A1 -rom_key_chan: equ 0x1113 -rom_key_contr: equ 0x10FA -rom_key_data: equ 0x1105 -rom_key_decode: equ 0x0333 -rom_key_done2: equ 0x111B -rom_key_done: equ 0x02AB -rom_key_flag: equ 0x10F4 -rom_key_input: equ 0x10A8 -rom_key_int: equ 0x0048 -rom_key_line: equ 0x0296 -rom_key_m_cl: equ 0x10DB -rom_key_mode: equ 0x10E6 -rom_key_next: equ 0x110D -rom_key_scan: equ 0x028E -rom_key_test: equ 0x031E -rom_keyboard: equ 0x02BF -rom_l_add_string: equ 0x2BAF -rom_l_char: equ 0x2B3E -rom_l_delete_string: equ 0x2B72 -rom_l_each_ch: equ 0x2B0B -rom_l_enter: equ 0x2BA6 -rom_l_exists: equ 0x2B66 -rom_l_first: equ 0x2BEA -rom_l_in_w_or_s: equ 0x2BA3 -rom_l_length: equ 0x2B9B -rom_l_new_string: equ 0x2BC0 -rom_l_no_sp: equ 0x2B0C -rom_l_numeric: equ 0x2B59 -rom_l_single: equ 0x2B4F -rom_l_spaces: equ 0x2B29 -rom_l_string: equ 0x2BC6 -rom_l_test_ch: equ 0x2B1F -rom_last: equ 0x386C -rom_ld_8_bits: equ 0x05CA -rom_ld_block: equ 0x0802 -rom_ld_break: equ 0x056B -rom_ld_bytes: equ 0x0556 -rom_ld_ch_pr: equ 0x07AD -rom_ld_cont_1: equ 0x0819 -rom_ld_cont_2: equ 0x0825 -rom_ld_contrl: equ 0x0808 -rom_ld_data: equ 0x082E -rom_ld_data_1: equ 0x084C -rom_ld_dec: equ 0x05C4 -rom_ld_delay: equ 0x05E9 -rom_ld_edge_1: equ 0x05E7 -rom_ld_edge_2: equ 0x05E3 -rom_ld_flag: equ 0x05B3 -rom_ld_leader: equ 0x0580 -rom_ld_look_h: equ 0x0767 -rom_ld_loop: equ 0x05A9 -rom_ld_marker: equ 0x05C8 -rom_ld_name: equ 0x07A6 -rom_ld_next: equ 0x05C2 -rom_ld_prog: equ 0x0873 -rom_ld_prog_1: equ 0x08AD -rom_ld_sample: equ 0x05ED -rom_ld_start: equ 0x056C -rom_ld_sync: equ 0x058F -rom_ld_type: equ 0x078A -rom_ld_verify: equ 0x05BD -rom_ld_wait: equ 0x0574 -rom_len: equ 0x3674 -rom_less_0: equ 0x3506 -rom_less_mask: equ 0x328A -rom_let: equ 0x2AFF -rom_line_ad_1: equ 0x1974 -rom_line_addr: equ 0x196E -rom_line_draw: equ 0x2477 -rom_line_end: equ 0x1BB3 -rom_line_new: equ 0x1B9E -rom_line_no: equ 0x1695 -rom_line_no_a: equ 0x1691 -rom_line_run: equ 0x1B8A -rom_line_scan: equ 0x1B17 -rom_line_use: equ 0x1BBF -rom_line_zero: equ 0x168F -rom_list: equ 0x17F9 -rom_list_1: equ 0x17FB -rom_list_2: equ 0x1814 -rom_list_3: equ 0x181A -rom_list_4: equ 0x181F -rom_list_5: equ 0x1822 -rom_list_all: equ 0x1833 -rom_list_all_2: equ 0x1835 -rom_llist: equ 0x17F5 -rom_ln: equ 0x3713 -rom_ln_fetch: equ 0x190F -rom_ln_store: equ 0x191C -rom_loc_mem: equ 0x3406 -rom_log_paren_2_power_a_paren: equ 0x2DC1 -rom_look_p_1: equ 0x1D8B -rom_look_p_2: equ 0x1DA3 -rom_look_prog: equ 0x1D86 -rom_look_vars: equ 0x28B2 -rom_lprint: equ 0x1FC9 -rom_main_1: equ 0x12A9 -rom_main_2: equ 0x12AC -rom_main_3: equ 0x12CF -rom_main_4: equ 0x1303 -rom_main_5: equ 0x133C -rom_main_5_1349: equ 0x1349 -rom_main_6: equ 0x1373 -rom_main_7: equ 0x1376 -rom_main_8: equ 0x1384 -rom_main_9: equ 0x1386 -rom_main_add1: equ 0x157D -rom_main_add2: equ 0x15AB -rom_main_add: equ 0x155D -rom_main_exec: equ 0x12A2 -rom_main_g: equ 0x1313 ; runtime error (error in A) -rom_main_keys: equ 0x0205 -rom_make_expt: equ 0x313B -rom_make_room: equ 0x1655 -rom_mask_int: equ 0x0038 -rom_me_contrl: equ 0x08B6 -rom_me_ent_1: equ 0x093E -rom_me_ent_2: equ 0x0955 -rom_me_ent_3: equ 0x0958 -rom_me_enter: equ 0x092C -rom_me_new_l2: equ 0x08EB -rom_me_new_lp: equ 0x08D2 -rom_me_old_l1: equ 0x08DF -rom_me_old_lp: equ 0x08D7 -rom_me_old_v1: equ 0x0901 -rom_me_old_v2: equ 0x0909 -rom_me_old_v3: equ 0x0912 -rom_me_old_v4: equ 0x091E -rom_me_old_vp: equ 0x08F9 -rom_me_var_l1: equ 0x0921 -rom_me_var_l2: equ 0x0923 -rom_me_var_lp: equ 0x08F0 -rom_mlt_loop: equ 0x3114 -rom_move_fp: equ 0x33C0 -rom_mult_long: equ 0x30F0 -rom_mult_oflw: equ 0x30EF -rom_mult_rslt: equ 0x30EA -rom_multiply: equ 0x30CA -rom_n_mod_m: equ 0x36A0 -rom_n_negtv: equ 0x3705 -rom_near_zero: equ 0x3159 -rom_neg_byte: equ 0x2FAF -rom_neg_test: equ 0x3474 -rom_negate: equ 0x346E -rom_new: equ 0x11B7 -rom_next: equ 0x1DAB -rom_next_1: equ 0x1DE2 -rom_next_2: equ 0x1DE9 -rom_next_2num: equ 0x1C79 -rom_next_char: equ 0x0020 -rom_next_line: equ 0x1BD1 -rom_next_loop: equ 0x1DDA -rom_next_o_1: equ 0x19C7 -rom_next_o_2: equ 0x19CE -rom_next_o_3: equ 0x19D5 -rom_next_o_4: equ 0x19D6 -rom_next_o_5: equ 0x19DB -rom_next_one: equ 0x19B8 -rom_nil_bytes: equ 0x3272 -rom_nmi_vect: equ 0x121C -rom_no_add: equ 0x311B -rom_no_and_no: equ 0x3524 -rom_no_l_eql_etc: equ 0x353B -rom_no_reset: equ 0x0070 -rom_no_rstore: equ 0x31F9 -rom_normalise: equ 0x316C -rom_norml_now: equ 0x3186 -rom_not: equ 0x3501 -rom_not_bin: equ 0x2CB8 -rom_not_used: equ 0x1988 -rom_nu_or_str: equ 0x354E -rom_number: equ 0x18B6 -rom_numeric: equ 0x2D1B -rom_nxt_dgt_1: equ 0x2CDA -rom_nxt_dgt_2: equ 0x2D40 -rom_offst_tbl: equ 0x1A48 -rom_oflow_clr: equ 0x3195 -rom_oflw1_clr: equ 0x3146 -rom_oflw2_clr: equ 0x3151 -rom_one: equ 0x386A -rom_one_shift: equ 0x2FE5 -rom_one_space: equ 0x1652 -rom_op_str_lu: equ 0x177A -rom_open: equ 0x1736 -rom_open_1: equ 0x1756 -rom_open_2: equ 0x175D -rom_open_3: equ 0x1767 -rom_open_end: equ 0x178B -rom_open_k: equ 0x1781 -rom_open_p: equ 0x1789 -rom_open_s: equ 0x1785 -rom_or: equ 0x351B -rom_other_str: equ 0x35B7 -rom_out: equ 0x1E7A -rom_out_c_1: equ 0x18F3 -rom_out_c_2: equ 0x1909 -rom_out_ch_1: equ 0x195A -rom_out_ch_2: equ 0x1968 -rom_out_ch_3: equ 0x196C -rom_out_char: equ 0x1937 -rom_out_code: equ 0x15EF -rom_out_curs: equ 0x18E1 -rom_out_flash: equ 0x18C1 -rom_out_line1: equ 0x1865 -rom_out_line2: equ 0x187D -rom_out_line3: equ 0x1881 -rom_out_line4: equ 0x1894 -rom_out_line5: equ 0x18A1 -rom_out_line6: equ 0x18B4 -rom_out_line: equ 0x1855 -rom_out_num_1: equ 0x1A1B -rom_out_num_2: equ 0x1A28 -rom_out_num_3: equ 0x1A30 -rom_out_num_4: equ 0x1A42 -rom_out_sp_1: equ 0x192B -rom_out_sp_2: equ 0x1925 -rom_out_sp_no: equ 0x192A -rom_p_beep: equ 0x1AE3 -rom_p_border: equ 0x1AF5 -rom_p_bright: equ 0x1AEE -rom_p_cat: equ 0x1B14 -rom_p_circle: equ 0x1AE7 -rom_p_clear: equ 0x1ABB -rom_p_close: equ 0x1B02 -rom_p_cls: equ 0x1ABE -rom_p_cont: equ 0x1AB8 -rom_p_copy: equ 0x1AD6 -rom_p_data: equ 0x1ACC -rom_p_def_fn: equ 0x1AF9 -rom_p_dim: equ 0x1AA2 -rom_p_draw: equ 0x1AD2 -rom_p_erase: equ 0x1B10 -rom_p_flash: equ 0x1AED -rom_p_for: equ 0x1A90 -rom_p_format: equ 0x1B06 -rom_p_go_sub: equ 0x1A86 -rom_p_go_to: equ 0x1A7D -rom_p_if: equ 0x1A81 -rom_p_ink: equ 0x1AEB -rom_p_input: equ 0x1A9F -rom_p_int_sto: equ 0x2D8C -rom_p_inverse: equ 0x1AEF -rom_p_let: equ 0x1A7A -rom_p_list: equ 0x1AAE -rom_p_llist: equ 0x1ADC -rom_p_load: equ 0x1AE0 -rom_p_lprint: equ 0x1AD9 -rom_p_merge: equ 0x1AE2 -rom_p_move: equ 0x1B0A -rom_p_new: equ 0x1AA8 -rom_p_next: equ 0x1A98 -rom_p_open: equ 0x1AFC -rom_p_out: equ 0x1AF1 -rom_p_over: equ 0x1AF0 -rom_p_paper: equ 0x1AEC -rom_p_pause: equ 0x1AC5 -rom_p_plot: equ 0x1AC1 -rom_p_poke: equ 0x1AB1 -rom_p_print: equ 0x1A9C -rom_p_random: equ 0x1AB5 -rom_p_read: equ 0x1AC9 -rom_p_rem: equ 0x1AA5 -rom_p_restore: equ 0x1ACF -rom_p_return: equ 0x1A8D -rom_p_run: equ 0x1AAB -rom_p_save: equ 0x1ADF -rom_p_stop: equ 0x1A8A -rom_p_verify: equ 0x1AE1 -rom_pass_by: equ 0x1E39 -rom_pause: equ 0x1F3A -rom_pause_1: equ 0x1F3D -rom_pause_2: equ 0x1F49 -rom_pause_end: equ 0x1F4F -rom_peek: equ 0x34AC -rom_perm: equ 0x1C96 -rom_pf_all_9: equ 0x2EB8 -rom_pf_bits: equ 0x2E7B -rom_pf_bytes: equ 0x2E8A -rom_pf_count: equ 0x2F2D -rom_pf_dc_out: equ 0x2F5E -rom_pf_dec_0s: equ 0x2F64 -rom_pf_digits: equ 0x2EA1 -rom_pf_e_frmt: equ 0x2F6C -rom_pf_e_pos: equ 0x2F83 -rom_pf_e_sbrn: equ 0x2F4A -rom_pf_e_sign: equ 0x2F85 -rom_pf_fr_dgt: equ 0x2EEC -rom_pf_fr_exx: equ 0x2EEF -rom_pf_fractn: equ 0x2ECF -rom_pf_frn_lp: equ 0x2EDF -rom_pf_insert: equ 0x2EA9 -rom_pf_large: equ 0x2E56 -rom_pf_loop: equ 0x2E01 -rom_pf_medium: equ 0x2E6F -rom_pf_more: equ 0x2ECB -rom_pf_negtve: equ 0x2DF2 -rom_pf_not_e: equ 0x2F46 -rom_pf_out_dt: equ 0x2F59 -rom_pf_out_lp: equ 0x2F52 -rom_pf_postve: equ 0x2DF8 -rom_pf_r_back: equ 0x2F25 -rom_pf_rnd_lp: equ 0x2F18 -rom_pf_round: equ 0x2F0C -rom_pf_save: equ 0x2E1E -rom_pf_small: equ 0x2E24 -rom_pf_test_2: equ 0x2EB3 -rom_pixel_add: equ 0x22AA -rom_pl_tst_in: equ 0x22FD -rom_plot: equ 0x22DC -rom_plot_22df: equ 0x22DF ; secondary entry to PLOT -rom_plot_end: equ 0x2303 -rom_plot_loop: equ 0x22F0 -rom_plot_sub: equ 0x22E5 ; the plot subroutine (coords in BC) -rom_po_1_oper: equ 0x0A7A -rom_po_2_oper: equ 0x0A75 -rom_po_able: equ 0x0AD9 -rom_po_any: equ 0x0B24 -rom_po_at_err: equ 0x0AAC -rom_po_at_set: equ 0x0ABF -rom_po_attr: equ 0x0BDB -rom_po_attr_1: equ 0x0BFA -rom_po_attr_2: equ 0x0C08 -rom_po_back_1: equ 0x0A23 -rom_po_back_2: equ 0x0A38 -rom_po_back_3: equ 0x0A3A -rom_po_change: equ 0x0A80 -rom_po_char: equ 0x0B65 -rom_po_char_2: equ 0x0B6A -rom_po_char_3: equ 0x0B76 -rom_po_comma: equ 0x0A5F -rom_po_cont: equ 0x0A87 -rom_po_each: equ 0x0C22 -rom_po_enter: equ 0x0A4F -rom_po_f_pr: equ 0x0B1D -rom_po_fetch: equ 0x0B03 -rom_po_fill: equ 0x0AC3 -rom_po_gr_1: equ 0x0B38 -rom_po_gr_2: equ 0x0B3E -rom_po_gr_3: equ 0x0B4C -rom_po_msg: equ 0x0C0A -rom_po_quest: equ 0x0A69 -rom_po_right: equ 0x0A3D -rom_po_save: equ 0x0C3B -rom_po_scr: equ 0x0C55 -rom_po_scr_2: equ 0x0C88 -rom_po_scr_3: equ 0x0CD2 -rom_po_scr_3a: equ 0x0CF0 -rom_po_scr_4: equ 0x0D02 -rom_po_scr_4a: equ 0x0D1C -rom_po_scr_4b: equ 0x0D2D -rom_po_search: equ 0x0C41 -rom_po_space: equ 0x0AD0 -rom_po_st_e: equ 0x0AF0 -rom_po_st_pr: equ 0x0AFC -rom_po_step: equ 0x0C44 -rom_po_store: equ 0x0ADC -rom_po_t: equ 0x0B5F -rom_po_t_and_udg: equ 0x0B52 -rom_po_t_udg: equ 0x0B52 -rom_po_tab: equ 0x0AC2 -rom_po_table: equ 0x0C14 -rom_po_tokens: equ 0x0C10 -rom_po_tr_sp: equ 0x0C35 -rom_po_tv_1: equ 0x0A7D -rom_po_tv_2: equ 0x0A6D -rom_point_lp: equ 0x22D4 -rom_point_sub: equ 0x22CB -rom_point_sub_22ce: equ 0x22CE ; secondary entry to POINT-SUB -rom_pointers: equ 0x1664 -rom_poke: equ 0x1E80 -rom_pr_all: equ 0x0B7F ; "print all characters" -rom_pr_all_1: equ 0x0B93 -rom_pr_all_2: equ 0x0BA4 -rom_pr_all_3: equ 0x0BB6 -rom_pr_all_4: equ 0x0BB7 -rom_pr_all_5: equ 0x0BC1 -rom_pr_all_6: equ 0x0BD3 -rom_pr_at_tab: equ 0x201E -rom_pr_end_z: equ 0x2045 -rom_pr_item_1: equ 0x1FFC -rom_pr_item_2: equ 0x200E -rom_pr_item_3: equ 0x2024 -rom_pr_posn_1: equ 0x204E -rom_pr_posn_2: equ 0x2061 -rom_pr_posn_3: equ 0x2067 -rom_pr_posn_4: equ 0x206E -rom_pr_st_end: equ 0x2048 -rom_pr_string: equ 0x203C ; print a string (start in DE, count in BC) -rom_prb_bytes: equ 0x0EE7 -rom_prep_add: equ 0x2F9B -rom_prep_m_or_d: equ 0x30C0 -rom_print: equ 0x1FCD -rom_print_1: equ 0x1FCF -rom_print_2: equ 0x1FDF -rom_print_3: equ 0x1FE5 -rom_print_4: equ 0x1FF2 -rom_print_a: equ 0x0010 -rom_print_a_2: equ 0x15F2 -rom_print_cr: equ 0x1FF5 -rom_print_fp: equ 0x2DE3 ; print a floating point number -rom_print_out: equ 0x09F4 -rom_print_string: equ 0x203C -rom_ptr_done: equ 0x167F -rom_ptr_next: equ 0x166B -rom_r_i_store: equ 0x365F -rom_ram_check: equ 0x11DA -rom_ram_done: equ 0x11EF -rom_ram_fill: equ 0x11DC -rom_ram_read: equ 0x11E2 -rom_ram_set: equ 0x1219 -rom_rand_1: equ 0x1E5A -rom_randomize: equ 0x1E4F -rom_re_entry: equ 0x3365 -rom_re_st_two: equ 0x3293 -rom_re_stack: equ 0x3297 -rom_read: equ 0x1DED -rom_read_1: equ 0x1E0A -rom_read_2: equ 0x1E1E -rom_read_3: equ 0x1DEC -rom_read_in: equ 0x3645 -rom_rec_edit: equ 0x16D4 -rom_reclaim_1: equ 0x19E5 -rom_reclaim_2: equ 0x19E8 -rom_rem: equ 0x1BB2 -rom_remove_fp: equ 0x11A7 -rom_report_0: equ 0x1BB0 -rom_report_1: equ 0x1DD8 -rom_report_2: equ 0x1C2E -rom_report_2a: equ 0x0670 -rom_report_3: equ 0x2A20 -rom_report_4: equ 0x1F15 -rom_report_5: equ 0x0C86 -rom_report_6: equ 0x31AD -rom_report_6b: equ 0x3703 -rom_report_7: equ 0x1F36 -rom_report_8: equ 0x15E4 -rom_report_a: equ 0x34E7 -rom_report_ab: equ 0x371A -rom_report_b: equ 0x046C -rom_report_bb: equ 0x1E9F -rom_report_bc: equ 0x24F9 -rom_report_bd: equ 0x35DC -rom_report_c: equ 0x1C8A -rom_report_cb: equ 0x21CE -rom_report_d: equ 0x0D00 -rom_report_da: equ 0x0552 -rom_report_dc: equ 0x0F0A -rom_report_e: equ 0x1E08 -rom_report_fa: equ 0x0642 -rom_report_fb: equ 0x1765 -rom_report_h: equ 0x21D4 -rom_report_i: equ 0x1D84 -rom_report_j: equ 0x15C4 -rom_report_k: equ 0x2244 -rom_report_l: equ 0x1B7B -rom_report_m: equ 0x1EDA -rom_report_n: equ 0x1BEC -rom_report_oa: equ 0x160E -rom_report_ob: equ 0x1725 -rom_report_p: equ 0x2812 -rom_report_q: equ 0x288B -rom_report_r: equ 0x0806 -rom_reserve: equ 0x169E -rom_reset: equ 0x0066 -rom_rest_run: equ 0x1E45 -rom_restk_sub: equ 0x3296 -rom_restore: equ 0x1E42 -rom_result_ok: equ 0x370C -rom_return: equ 0x1F23 -rom_rom_trap: equ 0x1708 -rom_rpt_mesgs: equ 0x1391 -rom_rs_nrmlse: equ 0x32B1 -rom_rs_store: equ 0x32BD -rom_rslt_zero: equ 0x370E -rom_rstk_loop: equ 0x32B2 -rom_run: equ 0x1EA1 -rom_s_2_coord: equ 0x2522 -rom_s_alphnum: equ 0x2684 -rom_s_attr: equ 0x2672 -rom_s_attr_s: equ 0x2580 -rom_s_attr_s_2583: equ 0x2583 ; secondary entry to S-ATTR-S -rom_s_bracket: equ 0x25E8 -rom_s_cont_1: equ 0x26DD -rom_s_cont_2: equ 0x2712 -rom_s_cont_3: equ 0x2713 -rom_s_decimal: equ 0x268D -rom_s_fn: equ 0x25F5 -rom_s_fn_sbrn: equ 0x27BD -rom_s_ik_dollar_stk: equ 0x2660 -rom_s_ink_dollar_en: equ 0x2665 -rom_s_inkey_dollar: equ 0x2634 -rom_s_letter: equ 0x26C9 -rom_s_loop: equ 0x2734 -rom_s_loop_1: equ 0x24FF -rom_s_loopend: equ 0x2770 -rom_s_negate: equ 0x26DF -rom_s_next: equ 0x2790 -rom_s_no_to_string: equ 0x2707 -rom_s_not_and: equ 0x2788 -rom_s_numeric: equ 0x26C3 -rom_s_opertr: equ 0x2723 -rom_s_pi: equ 0x2627 -rom_s_pi_end: equ 0x2630 -rom_s_point: equ 0x267B -rom_s_push_po: equ 0x270D -rom_s_q_again: equ 0x25BE -rom_s_q_copy: equ 0x25CB -rom_s_q_prms: equ 0x25D9 -rom_s_quote: equ 0x25B3 -rom_s_quote_s: equ 0x250F -rom_s_rnd: equ 0x25F8 -rom_s_rnd_end: equ 0x2625 -rom_s_rport_c2: equ 0x2761 -rom_s_rport_c: equ 0x252D -rom_s_runtest: equ 0x2764 -rom_s_sc_mtch: equ 0x255A -rom_s_sc_rows: equ 0x255D -rom_s_scr_nxt: equ 0x2573 -rom_s_scr_sto: equ 0x257D -rom_s_screen_dollar: equ 0x2668 -rom_s_scrn_dollar_s: equ 0x2535 -rom_s_scrn_lp: equ 0x254F -rom_s_scrn_s: equ 0x2535 -rom_s_scrn_s_2538: equ 0x2538 ; secondary entry to S-SCRN$-S -rom_s_sd_skip: equ 0x26B6 -rom_s_stk_dec: equ 0x26B5 -rom_s_stk_lst: equ 0x274C -rom_s_string: equ 0x25DB -rom_s_syntest: equ 0x275B -rom_s_tighter: equ 0x2773 -rom_s_u_plus: equ 0x25AF -rom_sa_1_sec: equ 0x0991 -rom_sa_8_bits: equ 0x0525 -rom_sa_all: equ 0x075A ; tape save/load -rom_sa_bit_1: equ 0x0514 -rom_sa_bit_2: equ 0x0511 -rom_sa_blank: equ 0x0629 -rom_sa_bytes: equ 0x04C2 -rom_sa_code: equ 0x06C3 -rom_sa_code_1: equ 0x06E1 -rom_sa_code_2: equ 0x06F0 -rom_sa_code_3: equ 0x06F5 -rom_sa_code_4: equ 0x06F9 -rom_sa_contrl: equ 0x0970 -rom_sa_data: equ 0x0652 -rom_sa_data_1: equ 0x0692 -rom_sa_delay: equ 0x053C -rom_sa_flag: equ 0x04D0 -rom_sa_leader: equ 0x04D8 -rom_sa_line: equ 0x0716 -rom_sa_line_1: equ 0x0723 -rom_sa_loop: equ 0x04FE -rom_sa_loop_p: equ 0x0505 -rom_sa_name: equ 0x064B -rom_sa_null: equ 0x0644 -rom_sa_or_ld_end: equ 0x0554 -rom_sa_or_ld_ret: equ 0x053F -rom_sa_out: equ 0x051C -rom_sa_parity: equ 0x050E -rom_sa_scr_dollar: equ 0x06A0 -rom_sa_set: equ 0x051A -rom_sa_space: equ 0x0621 -rom_sa_start: equ 0x0507 -rom_sa_sync_1: equ 0x04EA -rom_sa_sync_2: equ 0x04F2 -rom_sa_type_0: equ 0x073A -rom_sa_type_3: equ 0x0710 -rom_sa_v_new: equ 0x0685 -rom_sa_v_old: equ 0x0672 -rom_sa_v_type: equ 0x068F -rom_save_etc: equ 0x0605 -rom_scan_ent: equ 0x336C -rom_scan_func: equ 0x2596 -rom_scan_loop: equ 0x1B52 -rom_scanning: equ 0x24FB -rom_scrl_mssg: equ 0x0CF8 -rom_sec_plus: equ 0x3575 -rom_secnd_low: equ 0x356B -rom_separator: equ 0x1B6F -rom_series_xx: equ 0x3449 -rom_set_de: equ 0x1195 -rom_set_hl: equ 0x1190 -rom_set_min: equ 0x16B0 -rom_set_permanent_colors_0x1CAD: equ 0x1CAD ; special entry point -rom_set_permanent_colors_1CAD: equ 0x1CAD ; special entry point -rom_set_stk: equ 0x16C5 -rom_set_work: equ 0x16BF -rom_sf_arg_lp: equ 0x2843 -rom_sf_arg_vl: equ 0x2852 -rom_sf_argmt1: equ 0x2802 -rom_sf_argmts: equ 0x27D9 -rom_sf_brkt_1: equ 0x27D0 -rom_sf_brkt_2: equ 0x27E4 -rom_sf_cp_def: equ 0x2814 -rom_sf_flag_6: equ 0x27E9 -rom_sf_fnd_df: equ 0x2808 -rom_sf_not_fd: equ 0x2825 -rom_sf_r_br_2: equ 0x2885 -rom_sf_rprt_c: equ 0x27E6 -rom_sf_run: equ 0x27F7 -rom_sf_syn_en: equ 0x27F4 -rom_sf_value: equ 0x288D -rom_sf_values: equ 0x2831 -rom_sfa_cp_vr: equ 0x296B -rom_sfa_end: equ 0x2991 -rom_sfa_loop: equ 0x295A -rom_sfa_match: equ 0x2981 -rom_sgn: equ 0x3492 -rom_shift_fp: equ 0x2FDD -rom_shift_len: equ 0x3055 -rom_shift_one: equ 0x316E -rom_sign_done: equ 0x2CFE -rom_sign_flag: equ 0x2CF2 -rom_sign_to_c: equ 0x3507 -rom_sin: equ 0x37B5 -rom_skip_cons: equ 0x33F7 -rom_skip_next: equ 0x33F8 -rom_skip_over: equ 0x007D -rom_skip_zero: equ 0x315E -rom_skips: equ 0x0090 -rom_sl_define: equ 0x2A94 -rom_sl_over: equ 0x2AA8 -rom_sl_rpt_c: equ 0x2A7A -rom_sl_second: equ 0x2A81 -rom_sl_store: equ 0x2AAD -rom_slicing: equ 0x2A52 -rom_small: equ 0x37F8 -rom_spare: equ 0x386E -rom_sqr: equ 0x384A -rom_st_e_part: equ 0x2CFF -rom_st_mem_xx: equ 0x342D -rom_stack_a: equ 0x2D28 -rom_stack_bc: equ 0x2D2B ; stack BC register pair -rom_stack_fetch: equ 0x2BF1 ; get last value from calculator stack -rom_stack_num: equ 0x33B4 -rom_start: equ 0x0000 -rom_start_new: equ 0x11CB -rom_stk_code: equ 0x3671 -rom_stk_const: equ 0x33C8 -rom_stk_const_xx: equ 0x341B -rom_stk_data: equ 0x33C6 -rom_stk_digit: equ 0x2D22 -rom_stk_f_arg: equ 0x2951 -rom_stk_fetch: equ 0x2BF1 -rom_stk_pntrs: equ 0x35BF -rom_stk_st_0: equ 0x2AB1 -rom_stk_sto_string: equ 0x2AB2 -rom_stk_store: equ 0x2AB6 -rom_stk_to_a: equ 0x2314 -rom_stk_to_bc: equ 0x2307 -rom_stk_var: equ 0x2996 -rom_stk_zeros: equ 0x33F1 -rom_stmt_l_1: equ 0x1B29 -rom_stmt_loop: equ 0x1B28 -rom_stmt_next: equ 0x1BF4 -rom_stmt_r_1: equ 0x1B7D -rom_stmt_ret: equ 0x1B76 -rom_stop: equ 0x1CEE -rom_str_alter: equ 0x2070 -rom_str_and_no: equ 0x352D -rom_str_data1: equ 0x1727 -rom_str_data: equ 0x171E -rom_str_dollar: equ 0x361F -rom_str_test: equ 0x3588 -rom_strings: equ 0x3559 -rom_strs_add: equ 0x359C -rom_strt_mlt: equ 0x3125 -rom_subn_only: equ 0x31F2 -rom_subtract: equ 0x300F -rom_sv_arrays: equ 0x29AE -rom_sv_ch_add: equ 0x29E0 -rom_sv_close: equ 0x29D8 -rom_sv_comma: equ 0x29C3 -rom_sv_count: equ 0x29E7 -rom_sv_dim: equ 0x2A48 -rom_sv_elem_string: equ 0x2A2C -rom_sv_loop: equ 0x29EA -rom_sv_mult: equ 0x29FB -rom_sv_number: equ 0x2A22 -rom_sv_ptr: equ 0x29C0 -rom_sv_rpt_c: equ 0x2A12 -rom_sv_simple_string: equ 0x29A1 -rom_sv_slice: equ 0x2A45 -rom_sv_slice?: equ 0x2A49 -rom_swap_byte: equ 0x343E -rom_syntax_z: equ 0x2530 -rom_t_expnent: equ 0x326C -rom_t_first: equ 0x3233 -rom_t_gr_zero: equ 0x3221 -rom_t_numeric: equ 0x3252 -rom_t_shift: equ 0x3261 -rom_t_small: equ 0x323F -rom_t_store: equ 0x3267 -rom_t_test: equ 0x325E -rom_tan: equ 0x37DA -rom_tape_msgs: equ 0x09A1 -rom_tbl_addrs: equ 0x32D7 -rom_tbl_of_ops: equ 0x2795 -rom_tbl_priors: equ 0x27B0 -rom_temp_ptr1: equ 0x0077 -rom_temp_ptr2: equ 0x0078 -rom_temps: equ 0x0D4D ; copy the permanent color items to the temporary ones -rom_temps_1: equ 0x0D5B -rom_temps_2: equ 0x0D65 -rom_test_5_sp: equ 0x33A9 -rom_test_char: equ 0x001C -rom_test_neg: equ 0x307C -rom_test_norm: equ 0x3155 -rom_test_room: equ 0x1F05 -rom_test_zero: equ 0x34E9 -rom_tkn_table: equ 0x0095 -rom_to_power: equ 0x3851 -rom_truncate: equ 0x3214 -rom_two_p_1: equ 0x1E8E -rom_two_param: equ 0x1E85 -rom_unstack_z: equ 0x1FC3 -rom_use_252: equ 0x2495 -rom_use_zero: equ 0x1CE6 -rom_usr_no: equ 0x34B3 -rom_usr_range: equ 0x34D3 -rom_usr_stack: equ 0x34E4 -rom_usr_string: equ 0x34BC -rom_v_80_byte: equ 0x2932 -rom_v_char: equ 0x28D4 -rom_v_each: equ 0x2900 -rom_v_end: equ 0x294B -rom_v_found_1: equ 0x293E -rom_v_found_2: equ 0x293F -rom_v_get_ptr: equ 0x2929 -rom_v_matches: equ 0x2912 -rom_v_next: equ 0x292A -rom_v_pass: equ 0x2943 -rom_v_rport_c: equ 0x360C -rom_v_run: equ 0x28FD -rom_v_run_or_syn: equ 0x28EF -rom_v_spaces: equ 0x2913 -rom_v_str_var: equ 0x28DE -rom_v_syntax: equ 0x2934 -rom_v_test_fn: equ 0x28E3 -rom_val_dollar: equ 0x35DE -rom_val_fet_1: equ 0x1C56 -rom_val_fet_2: equ 0x1C59 -rom_valid: equ 0x371C -rom_var_a_1: equ 0x1C22 -rom_var_a_2: equ 0x1C30 -rom_var_a_3: equ 0x1C46 -rom_vr_cont_1: equ 0x07E9 -rom_vr_cont_2: equ 0x07F4 -rom_vr_cont_3: equ 0x0800 -rom_vr_contrl: equ 0x07CB -rom_wait_key1: equ 0x15DE -rom_wait_key: equ 0x15D4 -rom_x_large: equ 0x326D -rom_x_neg: equ 0x36B7 -rom_xis0: equ 0x385D -rom_yneg: equ 0x37A8 -rom_zero_rslt: equ 0x315D -rom_zeros_4_or_5: equ 0x2FFB -rom_zplus: equ 0x37A1 -rom_zx81_name: equ 0x04AA +; ============================================================== +ROUTINE: +.abs EQU 0x346A +.acs EQU 0x3843 +.add_back EQU 0x3004 +.add_ch_1 EQU 0x0F8B +.add_char EQU 0x0F81 +.add_char_keeping_current_mode EQU 0x0F85 +.add_rep_6 EQU 0x309F +.addend_0 EQU 0x2FF9 +.addition EQU 0x3014 +.addn_oflw EQU 0x303C +.all_added EQU 0x300D +.alpha EQU 0x2C8D +.alphanum EQU 0x2C88 +.arc_end EQU 0x245F +.arc_loop EQU 0x2425 +.arc_start EQU 0x2439 +.asn EQU 0x3833 +.atn EQU 0x37E2 +.auto_l_1 EQU 0x17CE +.auto_l_2 EQU 0x17E1 +.auto_l_3 EQU 0x17E4 +.auto_l_4 EQU 0x17ED +.auto_list EQU 0x1795 +.bc_spaces EQU 0x0030 +.be_end EQU 0x03F6 +.be_h_and_l_lp EQU 0x03D6 +.be_ix_plus_0 EQU 0x03D4 +.be_ix_plus_1 EQU 0x03D3 +.be_ix_plus_2 EQU 0x03D2 +.be_ix_plus_3 EQU 0x03D1 +.beep EQU 0x03F8 +.beeper EQU 0x03B5 +.bin_digit EQU 0x2CA2 +.bin_end EQU 0x2CB3 +.bits_zero EQU 0x3283 +.border EQU 0x2294 +.border_1 EQU 0x22A6 +.border_2297 EQU 0x2297 ; secondary entry to rom_border +.border_229b EQU 0x229B ; secondary entry to rom_border +.both_null EQU 0x3572 +.break_key EQU 0x1F54 ; return the carry flag reset if SHIFT and BREAK keys are both being pressed. +.byte_comp EQU 0x3564 +.byte_zero EQU 0x327E +.c_arc_ge1 EQU 0x235A +.c_ent EQU 0x37B7 +.c_r_gre_1 EQU 0x233B +.ca_10_by_a_plus_c EQU 0x2F8B +.calculate EQU 0x335B +.call_jump EQU 0x162C +.call_sub EQU 0x15F7 +.cases EQU 0x37FA +.cat_etc EQU 0x1793 +.cd_prms1 EQU 0x247D +.ch_add_plus_1 EQU 0x0074 +.chan_flag EQU 0x1615 +.chan_k EQU 0x1634 +.chan_op_1 EQU 0x1610 +.chan_open EQU 0x1601 ; open a channel (channel in A) +.chan_p EQU 0x164D +.chan_s EQU 0x1642 ; set flags for upper screen channel +.chan_s_1 EQU 0x1646 +.check_end EQU 0x1BEE +.chn_cd_lu EQU 0x162D +.chrs EQU 0x35C9 +.circle EQU 0x2320 +.cl_09_1 EQU 0x1CD6 +.cl_addr EQU 0x0E9B +.cl_all EQU 0x0DAF ; clear whole (upper) display area +.cl_attr EQU 0x0E88 +.cl_chan EQU 0x0D94 +.cl_chan_a EQU 0x0DA0 +.cl_line EQU 0x0E44 +.cl_line_1 EQU 0x0E4A +.cl_line_2 EQU 0x0E4D +.cl_line_3 EQU 0x0E80 +.cl_sc_all EQU 0x0DFE +.cl_scr_1 EQU 0x0E05 +.cl_scr_2 EQU 0x0E0D +.cl_scr_3 EQU 0x0E19 +.cl_scroll EQU 0x0E00 ; scroll the number of lines in the B register +.cl_set EQU 0x0DD9 +.cl_set_1 EQU 0x0DEE +.cl_set_2 EQU 0x0DF4 +.cl_str_lu EQU 0x1716 +.class_01 EQU 0x1C1F +.class_02 EQU 0x1C4E +.class_03 EQU 0x1C0D +.class_04 EQU 0x1C6C +.class_05 EQU 0x1C11 +.class_07 EQU 0x1C96 +.class_09 EQU 0x1CBE +.class_0b EQU 0x1CDB +.class_tbl EQU 0x1C01 +.clear EQU 0x1EAC +.clear_1 EQU 0x1EB7 +.clear_2 EQU 0x1EDC +.clear_prb EQU 0x0EDF +.clear_run EQU 0x1EAF +.clear_sp EQU 0x1097 +.close EQU 0x16E5 +.close_0_16EB EQU 0x16EB +.close_1 EQU 0x16FC +.close_2 EQU 0x1701 +.close_str EQU 0x171C +.cls EQU 0x0D6B ; CLS +.cls_1 EQU 0x0D87 +.cls_2 EQU 0x0D89 +.cls_3 EQU 0x0D8E +.cls_lower EQU 0x0D6E +.co_change EQU 0x226C +.co_temp_1 EQU 0x21E1 +.co_temp_2 EQU 0x21E2 +.co_temp_3 EQU 0x21F2 +.co_temp_4 EQU 0x21FC +.co_temp_5 EQU 0x2211 +.co_temp_6 EQU 0x2228 +.co_temp_7 EQU 0x2234 +.co_temp_8 EQU 0x223E +.co_temp_9 EQU 0x2246 +.co_temp_a EQU 0x2257 +.co_temp_b EQU 0x2258 +.co_temp_c EQU 0x2273 +.co_temp_d EQU 0x227D +.co_temp_e EQU 0x2287 +.code EQU 0x3669 +.comma_sp EQU 0x1537 +.continue EQU 0x1E5F +.copy EQU 0x0EAC +.copy_1 EQU 0x0EB2 +.copy_2 EQU 0x0EC9 +.copy_3 EQU 0x0ED3 +.copy_buff EQU 0x0ECD +.copy_end EQU 0x0EDA +.copy_l_1 EQU 0x0EFD +.copy_l_2 EQU 0x0F0C +.copy_l_3 EQU 0x0F14 +.copy_l_4 EQU 0x0F18 +.copy_l_5 EQU 0x0F1E +.copy_line EQU 0x0EF4 +.copyright EQU 0x1539 +.cos EQU 0x37AA +.count_one EQU 0x31FA +.cp_lines EQU 0x1980 +.ctlchrtab EQU 0x0A11 +.d_l_diag EQU 0x24D4 +.d_l_hr_vt EQU 0x24DB +.d_l_loop EQU 0x24CE +.d_l_plot EQU 0x24EC +.d_l_range EQU 0x24F7 +.d_l_step EQU 0x24DF +.d_letter EQU 0x2C1F +.d_no_loop EQU 0x2C2E +.d_rport_c EQU 0x2C05 +.d_run EQU 0x2C15 +.d_size EQU 0x2C2D +.data EQU 0x1E27 +.data_1 EQU 0x1E2C +.data_2 EQU 0x1E37 +.de_comma_paren_de_plus_1_parenequ EQU 0x2AEE +.dec_jr_nz EQU 0x367A +.dec_rpt_c EQU 0x2CCF +.dec_sto_1 EQU 0x2CD5 +.dec_to_fp EQU 0x2C9B +.decimal EQU 0x2CCB +.def_fn EQU 0x1F60 +.def_fn_1 EQU 0x1F6A +.def_fn_2 EQU 0x1F7D +.def_fn_3 EQU 0x1F86 +.def_fn_4 EQU 0x1F89 +.def_fn_5 EQU 0x1F94 +.def_fn_6 EQU 0x1FA6 +.def_fn_7 EQU 0x1FBD +.delete EQU 0x33A1 +.differ EQU 0x19DD +.dim EQU 0x2C02 +.dim_clear EQU 0x2C7C +.dim_sizes EQU 0x2C7F +.div_34th EQU 0x31DB +.div_loop EQU 0x31D2 +.div_start EQU 0x31E2 +.division EQU 0x31AF +.divn_expt EQU 0x313D +.dl_larger EQU 0x24CB +.dl_x_ge_y EQU 0x24C4 +.double_a EQU 0x338C +.dr_3_prms EQU 0x238D +.dr_prms EQU 0x23C1 +.dr_sin_nz EQU 0x23A3 +.draw EQU 0x2382 +.draw_line EQU 0x24B7 +.draw_line_24BA EQU 0x24BA ; entry point of the draw_line routine +.draw_save EQU 0x2497 +.drw_steps EQU 0x2420 +.e_divsn EQU 0x2D6D +.e_end EQU 0x2D7B +.e_fetch EQU 0x2D6E +.e_format EQU 0x2CEB +.e_fp_jump EQU 0x2D18 +.e_l_1 EQU 0x1A15 +.e_line_no EQU 0x19FB +.e_loop EQU 0x2D60 +.e_save EQU 0x2D55 +.e_to_fp EQU 0x2D4F +.e_tst_end EQU 0x2D71 +.each_s_1 EQU 0x1990 +.each_s_2 EQU 0x1998 +.each_s_3 EQU 0x199A +.each_s_4 EQU 0x19A5 +.each_s_5 EQU 0x19AD +.each_s_6 EQU 0x19B1 +.each_stmt EQU 0x198B +.ed_again EQU 0x0F30 +.ed_blank EQU 0x1150 +.ed_c_done EQU 0x117C +.ed_c_end EQU 0x117E +.ed_contr EQU 0x0F6C +.ed_copy EQU 0x111D +.ed_cur EQU 0x1011 +.ed_delete EQU 0x1015 +.ed_down EQU 0x0FF3 +.ed_edge EQU 0x1031 +.ed_edge_1 EQU 0x103E +.ed_edge_2 EQU 0x1051 +.ed_edit EQU 0x0FA9 +.ed_end EQU 0x1026 +.ed_enter EQU 0x1024 +.ed_error EQU 0x107F +.ed_full EQU 0x1167 +.ed_graph EQU 0x107C +.ed_ignore EQU 0x101E +.ed_keys EQU 0x0F92 +.ed_keys_t EQU 0x0FA0 +.ed_left EQU 0x1007 +.ed_list EQU 0x106E +.ed_loop EQU 0x0F38 +.ed_right EQU 0x100C +.ed_spaces EQU 0x115E +.ed_stop EQU 0x1001 +.ed_symbol EQU 0x1076 +.ed_up EQU 0x1059 +.editor EQU 0x0F2C +.end_calc EQU 0x369B +.end_compl EQU 0x30A3 +.end_tests EQU 0x358C +.ent_table EQU 0x338E +.error_1 EQU 0x0008 +.error_2 EQU 0x0053 +.error_3 EQU 0x0055 +.error_4 EQU 0x0058 +.ex_or_not EQU 0x3543 +.exchange EQU 0x343C +.exit EQU 0x36C2 +.exp EQU 0x36C4 +.expt_1num EQU 0x1C82 +.expt_2num EQU 0x1C7A +.expt_exp EQU 0x1C8C +.f_found EQU 0x1D7C +.f_l_s EQU 0x1D34 +.f_loop EQU 0x1D64 +.f_reorder EQU 0x1D16 +.f_use_1 EQU 0x1D10 +.fetch_num EQU 0x1CDE +.fetch_two EQU 0x2FBA +.find_i_1 EQU 0x1E9C +.find_int1 EQU 0x1E94 +.find_int2 EQU 0x1E99 +.first_3d EQU 0x3380 +.fn_skpovr EQU 0x28AB +.for EQU 0x1D03 +.form_exp EQU 0x33DE +.fp_0_or_1 EQU 0x350B +.fp_a_end EQU 0x2DE1 +.fp_calc EQU 0x0028 +.fp_calc_2 EQU 0x33A2 +.fp_delete EQU 0x2DAD +.fp_to_a EQU 0x2DD5 +.fp_to_bc EQU 0x2DA2 +.free_mem EQU 0x1F1A +.frst_less EQU 0x3585 +.full_addn EQU 0x303E +.g_loop EQU 0x3453 +.gen_ent_1 EQU 0x335E +.gen_ent_2 EQU 0x3362 +.get_argt EQU 0x3783 +.get_char EQU 0x0018 +.get_hl_by_de EQU 0x2AF4 +.get_mem_xx EQU 0x340F +.get_param EQU 0x1B55 +.go_nc_mlt EQU 0x30A5 +.go_sub EQU 0x1EED +.go_to EQU 0x1E67 +.go_to_2 EQU 0x1E73 +.go_to_bc EQU 0x1E6A ; 'GO TO' line in BC register +.go_to_hl EQU 0x1E6C ; 'GO TO' line in HL register XXX not tested +.gre.8 EQU 0x373D +.greater_0 EQU 0x34F9 +.hl_again EQU 0x30BC +.hl_by_de_to_hl EQU 0x30A9 ; HL=HL*DE +.hl_end EQU 0x30BE +.hl_hl_by_de EQU 0x30A9 +.hl_loop EQU 0x30B1 +.hlxde EQU 0x30A9 ; HL=HL*DE +.i_carry EQU 0x2AE8 +.i_restore EQU 0x2AEB +.if EQU 0x1CF0 +.if_1 EQU 0x1D00 +.in EQU 0x34A5 +.in_assign EQU 0x21B9 +.in_chan_k EQU 0x21D6 +.in_item_1 EQU 0x20C1 +.in_item_2 EQU 0x20D8 +.in_item_3 EQU 0x20ED +.in_next_1 EQU 0x21AF +.in_next_2 EQU 0x21B2 +.in_pk_stk EQU 0x34B0 +.in_pr_1 EQU 0x211A +.in_pr_2 EQU 0x211C +.in_pr_3 EQU 0x2129 +.in_prompt EQU 0x20FA +.in_stop EQU 0x21D0 +.in_var_1 EQU 0x213A +.in_var_2 EQU 0x2148 +.in_var_3 EQU 0x215E +.in_var_4 EQU 0x2161 +.in_var_5 EQU 0x2174 +.in_var_6 EQU 0x219B +.indexer EQU 0x16DC +.indexer_1 EQU 0x16DB +.init_chan EQU 0x15AF +.init_strm EQU 0x15C6 +.input EQU 0x2089 +.input_1 EQU 0x2096 +.input_2 EQU 0x20AD +.input_ad EQU 0x15E6 +.int EQU 0x36AF +.int_case EQU 0x3483 +.int_exp1 EQU 0x2ACC +.int_exp2 EQU 0x2ACD +.int_fetch EQU 0x2D7F +.int_store EQU 0x2D8E +.int_to_fp EQU 0x2D3B +.ix_end EQU 0x3290 +.jump EQU 0x3686 +.jump_2 EQU 0x3687 +.jump_true EQU 0x368F +.k_8_and_9 EQU 0x0382 +.k_@_char EQU 0x03B2 +.k_ch_set EQU 0x02D1 +.k_digit EQU 0x0367 +.k_e_let EQU 0x0341 +.k_end EQU 0x0308 +.k_gra_dgt EQU 0x0389 +.k_klc_dgt EQU 0x039D +.k_klc_let EQU 0x034F +.k_look_up EQU 0x034A +.k_main EQU 0x032C +.k_new EQU 0x02F1 +.k_repeat EQU 0x0310 +.k_st_loop EQU 0x02C6 +.k_tokens EQU 0x0364 +.key_3keys EQU 0x029F +.key_bits EQU 0x02A1 +.key_chan EQU 0x1113 +.key_contr EQU 0x10FA +.key_data EQU 0x1105 +.key_decode EQU 0x0333 +.key_done2 EQU 0x111B +.key_done EQU 0x02AB +.key_flag EQU 0x10F4 +.key_input EQU 0x10A8 +.key_int EQU 0x0048 +.key_line EQU 0x0296 +.key_m_cl EQU 0x10DB +.key_mode EQU 0x10E6 +.key_next EQU 0x110D +.key_scan EQU 0x028E +.key_test EQU 0x031E +.keyboard EQU 0x02BF +.l_add_string EQU 0x2BAF +.l_char EQU 0x2B3E +.l_delete_string EQU 0x2B72 +.l_each_ch EQU 0x2B0B +.l_enter EQU 0x2BA6 +.l_exists EQU 0x2B66 +.l_first EQU 0x2BEA +.l_in_w_or_s EQU 0x2BA3 +.l_length EQU 0x2B9B +.l_new_string EQU 0x2BC0 +.l_no_sp EQU 0x2B0C +.l_numeric EQU 0x2B59 +.l_single EQU 0x2B4F +.l_spaces EQU 0x2B29 +.l_string EQU 0x2BC6 +.l_test_ch EQU 0x2B1F +.last EQU 0x386C +.ld_8_bits EQU 0x05CA +.ld_block EQU 0x0802 +.ld_break EQU 0x056B +.ld_bytes EQU 0x0556 +.ld_ch_pr EQU 0x07AD +.ld_cont_1 EQU 0x0819 +.ld_cont_2 EQU 0x0825 +.ld_contrl EQU 0x0808 +.ld_data EQU 0x082E +.ld_data_1 EQU 0x084C +.ld_dec EQU 0x05C4 +.ld_delay EQU 0x05E9 +.ld_edge_1 EQU 0x05E7 +.ld_edge_2 EQU 0x05E3 +.ld_flag EQU 0x05B3 +.ld_leader EQU 0x0580 +.ld_look_h EQU 0x0767 +.ld_loop EQU 0x05A9 +.ld_marker EQU 0x05C8 +.ld_name EQU 0x07A6 +.ld_next EQU 0x05C2 +.ld_prog EQU 0x0873 +.ld_prog_1 EQU 0x08AD +.ld_sample EQU 0x05ED +.ld_start EQU 0x056C +.ld_sync EQU 0x058F +.ld_type EQU 0x078A +.ld_verify EQU 0x05BD +.ld_wait EQU 0x0574 +.len EQU 0x3674 +.less_0 EQU 0x3506 +.less_mask EQU 0x328A +.let EQU 0x2AFF +.line_ad_1 EQU 0x1974 +.line_addr EQU 0x196E +.line_draw EQU 0x2477 +.line_end EQU 0x1BB3 +.line_new EQU 0x1B9E +.line_no EQU 0x1695 +.line_no_a EQU 0x1691 +.line_run EQU 0x1B8A +.line_scan EQU 0x1B17 +.line_use EQU 0x1BBF +.line_zero EQU 0x168F +.list EQU 0x17F9 +.list_1 EQU 0x17FB +.list_2 EQU 0x1814 +.list_3 EQU 0x181A +.list_4 EQU 0x181F +.list_5 EQU 0x1822 +.list_all EQU 0x1833 +.list_all_2 EQU 0x1835 +.llist EQU 0x17F5 +.ln EQU 0x3713 +.ln_fetch EQU 0x190F +.ln_store EQU 0x191C +.loc_mem EQU 0x3406 +.log_paren_2_power_a_paren EQU 0x2DC1 +.look_p_1 EQU 0x1D8B +.look_p_2 EQU 0x1DA3 +.look_prog EQU 0x1D86 +.look_vars EQU 0x28B2 +.lprint EQU 0x1FC9 +.main_1 EQU 0x12A9 +.main_2 EQU 0x12AC +.main_3 EQU 0x12CF +.main_4 EQU 0x1303 +.main_5 EQU 0x133C +.main_5_1349 EQU 0x1349 +.main_6 EQU 0x1373 +.main_7 EQU 0x1376 +.main_8 EQU 0x1384 +.main_9 EQU 0x1386 +.main_add1 EQU 0x157D +.main_add2 EQU 0x15AB +.main_add EQU 0x155D +.main_exec EQU 0x12A2 +.main_g EQU 0x1313 ; runtime error (error in A) +.main_keys EQU 0x0205 +.make_expt EQU 0x313B +.make_room EQU 0x1655 +.mask_int EQU 0x0038 +.me_contrl EQU 0x08B6 +.me_ent_1 EQU 0x093E +.me_ent_2 EQU 0x0955 +.me_ent_3 EQU 0x0958 +.me_enter EQU 0x092C +.me_new_l2 EQU 0x08EB +.me_new_lp EQU 0x08D2 +.me_old_l1 EQU 0x08DF +.me_old_lp EQU 0x08D7 +.me_old_v1 EQU 0x0901 +.me_old_v2 EQU 0x0909 +.me_old_v3 EQU 0x0912 +.me_old_v4 EQU 0x091E +.me_old_vp EQU 0x08F9 +.me_var_l1 EQU 0x0921 +.me_var_l2 EQU 0x0923 +.me_var_lp EQU 0x08F0 +.mlt_loop EQU 0x3114 +.move_fp EQU 0x33C0 +.mult_long EQU 0x30F0 +.mult_oflw EQU 0x30EF +.mult_rslt EQU 0x30EA +.multiply EQU 0x30CA +.n_mod_m EQU 0x36A0 +.n_negtv EQU 0x3705 +.near_zero EQU 0x3159 +.neg_byte EQU 0x2FAF +.neg_test EQU 0x3474 +.negate EQU 0x346E +.new EQU 0x11B7 +.next EQU 0x1DAB +.next_1 EQU 0x1DE2 +.next_2 EQU 0x1DE9 +.next_2num EQU 0x1C79 +.next_char EQU 0x0020 +.next_line EQU 0x1BD1 +.next_loop EQU 0x1DDA +.next_o_1 EQU 0x19C7 +.next_o_2 EQU 0x19CE +.next_o_3 EQU 0x19D5 +.next_o_4 EQU 0x19D6 +.next_o_5 EQU 0x19DB +.next_one EQU 0x19B8 +.nil_bytes EQU 0x3272 +.nmi_vect EQU 0x121C +.no_add EQU 0x311B +.no_and_no EQU 0x3524 +.no_l_eql_etc EQU 0x353B +.no_reset EQU 0x0070 +.no_rstore EQU 0x31F9 +.normalise EQU 0x316C +.norml_now EQU 0x3186 +.not EQU 0x3501 +.not_bin EQU 0x2CB8 +.not_used EQU 0x1988 +.nu_or_str EQU 0x354E +.number EQU 0x18B6 +.numeric EQU 0x2D1B +.nxt_dgt_1 EQU 0x2CDA +.nxt_dgt_2 EQU 0x2D40 +.offst_tbl EQU 0x1A48 +.oflow_clr EQU 0x3195 +.oflw1_clr EQU 0x3146 +.oflw2_clr EQU 0x3151 +.one EQU 0x386A +.one_shift EQU 0x2FE5 +.one_space EQU 0x1652 +.op_str_lu EQU 0x177A +.open EQU 0x1736 +.open_1 EQU 0x1756 +.open_2 EQU 0x175D +.open_3 EQU 0x1767 +.open_end EQU 0x178B +.open_k EQU 0x1781 +.open_p EQU 0x1789 +.open_s EQU 0x1785 +.or EQU 0x351B +.other_str EQU 0x35B7 +.out EQU 0x1E7A +.out_c_1 EQU 0x18F3 +.out_c_2 EQU 0x1909 +.out_ch_1 EQU 0x195A +.out_ch_2 EQU 0x1968 +.out_ch_3 EQU 0x196C +.out_char EQU 0x1937 +.out_code EQU 0x15EF +.out_curs EQU 0x18E1 +.out_flash EQU 0x18C1 +.out_line1 EQU 0x1865 +.out_line2 EQU 0x187D +.out_line3 EQU 0x1881 +.out_line4 EQU 0x1894 +.out_line5 EQU 0x18A1 +.out_line6 EQU 0x18B4 +.out_line EQU 0x1855 +.out_num_1 EQU 0x1A1B +.out_num_2 EQU 0x1A28 +.out_num_3 EQU 0x1A30 +.out_num_4 EQU 0x1A42 +.out_sp_1 EQU 0x192B +.out_sp_2 EQU 0x1925 +.out_sp_no EQU 0x192A +.p_beep EQU 0x1AE3 +.p_border EQU 0x1AF5 +.p_bright EQU 0x1AEE +.p_cat EQU 0x1B14 +.p_circle EQU 0x1AE7 +.p_clear EQU 0x1ABB +.p_close EQU 0x1B02 +.p_cls EQU 0x1ABE +.p_cont EQU 0x1AB8 +.p_copy EQU 0x1AD6 +.p_data EQU 0x1ACC +.p_def_fn EQU 0x1AF9 +.p_dim EQU 0x1AA2 +.p_draw EQU 0x1AD2 +.p_erase EQU 0x1B10 +.p_flash EQU 0x1AED +.p_for EQU 0x1A90 +.p_format EQU 0x1B06 +.p_go_sub EQU 0x1A86 +.p_go_to EQU 0x1A7D +.p_if EQU 0x1A81 +.p_ink EQU 0x1AEB +.p_input EQU 0x1A9F +.p_int_sto EQU 0x2D8C +.p_inverse EQU 0x1AEF +.p_let EQU 0x1A7A +.p_list EQU 0x1AAE +.p_llist EQU 0x1ADC +.p_load EQU 0x1AE0 +.p_lprint EQU 0x1AD9 +.p_merge EQU 0x1AE2 +.p_move EQU 0x1B0A +.p_new EQU 0x1AA8 +.p_next EQU 0x1A98 +.p_open EQU 0x1AFC +.p_out EQU 0x1AF1 +.p_over EQU 0x1AF0 +.p_paper EQU 0x1AEC +.p_pause EQU 0x1AC5 +.p_plot EQU 0x1AC1 +.p_poke EQU 0x1AB1 +.p_print EQU 0x1A9C +.p_random EQU 0x1AB5 +.p_read EQU 0x1AC9 +.p_rem EQU 0x1AA5 +.p_restore EQU 0x1ACF +.p_return EQU 0x1A8D +.p_run EQU 0x1AAB +.p_save EQU 0x1ADF +.p_stop EQU 0x1A8A +.p_verify EQU 0x1AE1 +.pass_by EQU 0x1E39 +.pause EQU 0x1F3A +.pause_1 EQU 0x1F3D +.pause_2 EQU 0x1F49 +.pause_end EQU 0x1F4F +.peek EQU 0x34AC +.perm EQU 0x1C96 +.pf_all_9 EQU 0x2EB8 +.pf_bits EQU 0x2E7B +.pf_bytes EQU 0x2E8A +.pf_count EQU 0x2F2D +.pf_dc_out EQU 0x2F5E +.pf_dec_0s EQU 0x2F64 +.pf_digits EQU 0x2EA1 +.pf_e_frmt EQU 0x2F6C +.pf_e_pos EQU 0x2F83 +.pf_e_sbrn EQU 0x2F4A +.pf_e_sign EQU 0x2F85 +.pf_fr_dgt EQU 0x2EEC +.pf_fr_exx EQU 0x2EEF +.pf_fractn EQU 0x2ECF +.pf_frn_lp EQU 0x2EDF +.pf_insert EQU 0x2EA9 +.pf_large EQU 0x2E56 +.pf_loop EQU 0x2E01 +.pf_medium EQU 0x2E6F +.pf_more EQU 0x2ECB +.pf_negtve EQU 0x2DF2 +.pf_not_e EQU 0x2F46 +.pf_out_dt EQU 0x2F59 +.pf_out_lp EQU 0x2F52 +.pf_postve EQU 0x2DF8 +.pf_r_back EQU 0x2F25 +.pf_rnd_lp EQU 0x2F18 +.pf_round EQU 0x2F0C +.pf_save EQU 0x2E1E +.pf_small EQU 0x2E24 +.pf_test_2 EQU 0x2EB3 +.pixel_add EQU 0x22AA +.pl_tst_in EQU 0x22FD +.plot EQU 0x22DC +.plot_22df EQU 0x22DF ; secondary entry to PLOT +.plot_end EQU 0x2303 +.plot_loop EQU 0x22F0 +.plot_sub EQU 0x22E5 ; the plot subroutine (coords in BC) +.po_1_oper EQU 0x0A7A +.po_2_oper EQU 0x0A75 +.po_able EQU 0x0AD9 +.po_any EQU 0x0B24 +.po_at_err EQU 0x0AAC +.po_at_set EQU 0x0ABF +.po_attr EQU 0x0BDB +.po_attr_1 EQU 0x0BFA +.po_attr_2 EQU 0x0C08 +.po_back_1 EQU 0x0A23 +.po_back_2 EQU 0x0A38 +.po_back_3 EQU 0x0A3A +.po_change EQU 0x0A80 +.po_char EQU 0x0B65 +.po_char_2 EQU 0x0B6A +.po_char_3 EQU 0x0B76 +.po_comma EQU 0x0A5F +.po_cont EQU 0x0A87 +.po_each EQU 0x0C22 +.po_enter EQU 0x0A4F +.po_f_pr EQU 0x0B1D +.po_fetch EQU 0x0B03 +.po_fill EQU 0x0AC3 +.po_gr_1 EQU 0x0B38 +.po_gr_2 EQU 0x0B3E +.po_gr_3 EQU 0x0B4C +.po_msg EQU 0x0C0A +.po_quest EQU 0x0A69 +.po_right EQU 0x0A3D +.po_save EQU 0x0C3B +.po_scr EQU 0x0C55 +.po_scr_2 EQU 0x0C88 +.po_scr_3 EQU 0x0CD2 +.po_scr_3a EQU 0x0CF0 +.po_scr_4 EQU 0x0D02 +.po_scr_4a EQU 0x0D1C +.po_scr_4b EQU 0x0D2D +.po_search EQU 0x0C41 +.po_space EQU 0x0AD0 +.po_st_e EQU 0x0AF0 +.po_st_pr EQU 0x0AFC +.po_step EQU 0x0C44 +.po_store EQU 0x0ADC +.po_t EQU 0x0B5F +.po_t_and_udg EQU 0x0B52 +.po_t_udg EQU 0x0B52 +.po_tab EQU 0x0AC2 +.po_table EQU 0x0C14 +.po_tokens EQU 0x0C10 +.po_tr_sp EQU 0x0C35 +.po_tv_1 EQU 0x0A7D +.po_tv_2 EQU 0x0A6D +.point_lp EQU 0x22D4 +.point_sub EQU 0x22CB +.point_sub_22ce EQU 0x22CE ; secondary entry to POINT-SUB +.pointers EQU 0x1664 +.poke EQU 0x1E80 +.pr_all EQU 0x0B7F ; "print all characters" +.pr_all_1 EQU 0x0B93 +.pr_all_2 EQU 0x0BA4 +.pr_all_3 EQU 0x0BB6 +.pr_all_4 EQU 0x0BB7 +.pr_all_5 EQU 0x0BC1 +.pr_all_6 EQU 0x0BD3 +.pr_at_tab EQU 0x201E +.pr_end_z EQU 0x2045 +.pr_item_1 EQU 0x1FFC +.pr_item_2 EQU 0x200E +.pr_item_3 EQU 0x2024 +.pr_posn_1 EQU 0x204E +.pr_posn_2 EQU 0x2061 +.pr_posn_3 EQU 0x2067 +.pr_posn_4 EQU 0x206E +.pr_st_end EQU 0x2048 +.pr_string EQU 0x203C ; print a string (start in DE, count in BC) +.prb_bytes EQU 0x0EE7 +.prep_add EQU 0x2F9B +.prep_m_or_d EQU 0x30C0 +.print EQU 0x1FCD +.print_1 EQU 0x1FCF +.print_2 EQU 0x1FDF +.print_3 EQU 0x1FE5 +.print_4 EQU 0x1FF2 +.print_a EQU 0x0010 +.print_a_2 EQU 0x15F2 +.print_cr EQU 0x1FF5 +.print_fp EQU 0x2DE3 ; print a floating point number +.print_out EQU 0x09F4 +.print_string EQU 0x203C +.ptr_done EQU 0x167F +.ptr_next EQU 0x166B +.r_i_store EQU 0x365F +.ram_check EQU 0x11DA +.ram_done EQU 0x11EF +.ram_fill EQU 0x11DC +.ram_read EQU 0x11E2 +.ram_set EQU 0x1219 +.rand_1 EQU 0x1E5A +.randomize EQU 0x1E4F +.re_entry EQU 0x3365 +.re_st_two EQU 0x3293 +.re_stack EQU 0x3297 +.read EQU 0x1DED +.read_1 EQU 0x1E0A +.read_2 EQU 0x1E1E +.read_3 EQU 0x1DEC +.read_in EQU 0x3645 +.rec_edit EQU 0x16D4 +.reclaim_1 EQU 0x19E5 +.reclaim_2 EQU 0x19E8 +.rem EQU 0x1BB2 +.remove_fp EQU 0x11A7 +.report_0 EQU 0x1BB0 +.report_1 EQU 0x1DD8 +.report_2 EQU 0x1C2E +.report_2a EQU 0x0670 +.report_3 EQU 0x2A20 +.report_4 EQU 0x1F15 +.report_5 EQU 0x0C86 +.report_6 EQU 0x31AD +.report_6b EQU 0x3703 +.report_7 EQU 0x1F36 +.report_8 EQU 0x15E4 +.report_a EQU 0x34E7 +.report_ab EQU 0x371A +.report_b EQU 0x046C +.report_bb EQU 0x1E9F +.report_bc EQU 0x24F9 +.report_bd EQU 0x35DC +.report_c EQU 0x1C8A +.report_cb EQU 0x21CE +.report_d EQU 0x0D00 +.report_da EQU 0x0552 +.report_dc EQU 0x0F0A +.report_e EQU 0x1E08 +.report_fa EQU 0x0642 +.report_fb EQU 0x1765 +.report_h EQU 0x21D4 +.report_i EQU 0x1D84 +.report_j EQU 0x15C4 +.report_k EQU 0x2244 +.report_l EQU 0x1B7B +.report_m EQU 0x1EDA +.report_n EQU 0x1BEC +.report_oa EQU 0x160E +.report_ob EQU 0x1725 +.report_p EQU 0x2812 +.report_q EQU 0x288B +.report_r EQU 0x0806 +.reserve EQU 0x169E +.reset EQU 0x0066 +.rest_run EQU 0x1E45 +.restk_sub EQU 0x3296 +.restore EQU 0x1E42 +.result_ok EQU 0x370C +.return EQU 0x1F23 +.rom_trap EQU 0x1708 +.rpt_mesgs EQU 0x1391 +.rs_nrmlse EQU 0x32B1 +.rs_store EQU 0x32BD +.rslt_zero EQU 0x370E +.rstk_loop EQU 0x32B2 +.run EQU 0x1EA1 +.s_2_coord EQU 0x2522 +.s_alphnum EQU 0x2684 +.s_attr EQU 0x2672 +.s_attr_s EQU 0x2580 +.s_attr_s_2583 EQU 0x2583 ; secondary entry to S-ATTR-S +.s_bracket EQU 0x25E8 +.s_cont_1 EQU 0x26DD +.s_cont_2 EQU 0x2712 +.s_cont_3 EQU 0x2713 +.s_decimal EQU 0x268D +.s_fn EQU 0x25F5 +.s_fn_sbrn EQU 0x27BD +.s_ik_dollar_stk EQU 0x2660 +.s_ink_dollar_en EQU 0x2665 +.s_inkey_dollar EQU 0x2634 +.s_letter EQU 0x26C9 +.s_loop EQU 0x2734 +.s_loop_1 EQU 0x24FF +.s_loopend EQU 0x2770 +.s_negate EQU 0x26DF +.s_next EQU 0x2790 +.s_no_to_string EQU 0x2707 +.s_not_and EQU 0x2788 +.s_numeric EQU 0x26C3 +.s_opertr EQU 0x2723 +.s_pi EQU 0x2627 +.s_pi_end EQU 0x2630 +.s_point EQU 0x267B +.s_push_po EQU 0x270D +.s_q_again EQU 0x25BE +.s_q_copy EQU 0x25CB +.s_q_prms EQU 0x25D9 +.s_quote EQU 0x25B3 +.s_quote_s EQU 0x250F +.s_rnd EQU 0x25F8 +.s_rnd_end EQU 0x2625 +.s_rport_c2 EQU 0x2761 +.s_rport_c EQU 0x252D +.s_runtest EQU 0x2764 +.s_sc_mtch EQU 0x255A +.s_sc_rows EQU 0x255D +.s_scr_nxt EQU 0x2573 +.s_scr_sto EQU 0x257D +.s_screen_dollar EQU 0x2668 +.s_scrn_dollar_s EQU 0x2535 +.s_scrn_lp EQU 0x254F +.s_scrn_s EQU 0x2535 +.s_scrn_s_2538 EQU 0x2538 ; secondary entry to S-SCRN$-S +.s_sd_skip EQU 0x26B6 +.s_stk_dec EQU 0x26B5 +.s_stk_lst EQU 0x274C +.s_string EQU 0x25DB +.s_syntest EQU 0x275B +.s_tighter EQU 0x2773 +.s_u_plus EQU 0x25AF +.sa_1_sec EQU 0x0991 +.sa_8_bits EQU 0x0525 +.sa_all EQU 0x075A ; tape save/load +.sa_bit_1 EQU 0x0514 +.sa_bit_2 EQU 0x0511 +.sa_blank EQU 0x0629 +.sa_bytes EQU 0x04C2 +.sa_code EQU 0x06C3 +.sa_code_1 EQU 0x06E1 +.sa_code_2 EQU 0x06F0 +.sa_code_3 EQU 0x06F5 +.sa_code_4 EQU 0x06F9 +.sa_contrl EQU 0x0970 +.sa_data EQU 0x0652 +.sa_data_1 EQU 0x0692 +.sa_delay EQU 0x053C +.sa_flag EQU 0x04D0 +.sa_leader EQU 0x04D8 +.sa_line EQU 0x0716 +.sa_line_1 EQU 0x0723 +.sa_loop EQU 0x04FE +.sa_loop_p EQU 0x0505 +.sa_name EQU 0x064B +.sa_null EQU 0x0644 +.sa_or_ld_end EQU 0x0554 +.sa_or_ld_ret EQU 0x053F +.sa_out EQU 0x051C +.sa_parity EQU 0x050E +.sa_scr_dollar EQU 0x06A0 +.sa_set EQU 0x051A +.sa_space EQU 0x0621 +.sa_start EQU 0x0507 +.sa_sync_1 EQU 0x04EA +.sa_sync_2 EQU 0x04F2 +.sa_type_0 EQU 0x073A +.sa_type_3 EQU 0x0710 +.sa_v_new EQU 0x0685 +.sa_v_old EQU 0x0672 +.sa_v_type EQU 0x068F +.save_etc EQU 0x0605 +.scan_ent EQU 0x336C +.scan_func EQU 0x2596 +.scan_loop EQU 0x1B52 +.scanning EQU 0x24FB +.scrl_mssg EQU 0x0CF8 +.sec_plus EQU 0x3575 +.secnd_low EQU 0x356B +.separator EQU 0x1B6F +.series_xx EQU 0x3449 +.set_de EQU 0x1195 +.set_hl EQU 0x1190 +.set_min EQU 0x16B0 +.set_permanent_colors_0x1CAD EQU 0x1CAD ; special entry point +.set_permanent_colors_1CAD EQU 0x1CAD ; special entry point +.set_stk EQU 0x16C5 +.set_work EQU 0x16BF +.sf_arg_lp EQU 0x2843 +.sf_arg_vl EQU 0x2852 +.sf_argmt1 EQU 0x2802 +.sf_argmts EQU 0x27D9 +.sf_brkt_1 EQU 0x27D0 +.sf_brkt_2 EQU 0x27E4 +.sf_cp_def EQU 0x2814 +.sf_flag_6 EQU 0x27E9 +.sf_fnd_df EQU 0x2808 +.sf_not_fd EQU 0x2825 +.sf_r_br_2 EQU 0x2885 +.sf_rprt_c EQU 0x27E6 +.sf_run EQU 0x27F7 +.sf_syn_en EQU 0x27F4 +.sf_value EQU 0x288D +.sf_values EQU 0x2831 +.sfa_cp_vr EQU 0x296B +.sfa_end EQU 0x2991 +.sfa_loop EQU 0x295A +.sfa_match EQU 0x2981 +.sgn EQU 0x3492 +.shift_fp EQU 0x2FDD +.shift_len EQU 0x3055 +.shift_one EQU 0x316E +.sign_done EQU 0x2CFE +.sign_flag EQU 0x2CF2 +.sign_to_c EQU 0x3507 +.sin EQU 0x37B5 +.skip_cons EQU 0x33F7 +.skip_next EQU 0x33F8 +.skip_over EQU 0x007D +.skip_zero EQU 0x315E +.skips EQU 0x0090 +.sl_define EQU 0x2A94 +.sl_over EQU 0x2AA8 +.sl_rpt_c EQU 0x2A7A +.sl_second EQU 0x2A81 +.sl_store EQU 0x2AAD +.slicing EQU 0x2A52 +.small EQU 0x37F8 +.spare EQU 0x386E +.sqr EQU 0x384A +.st_e_part EQU 0x2CFF +.st_mem_xx EQU 0x342D +.stack_a EQU 0x2D28 +.stack_bc EQU 0x2D2B ; stack BC register pair +.stack_fetch EQU 0x2BF1 ; get last value from calculator stack +.stack_num EQU 0x33B4 +.start EQU 0x0000 +.start_new EQU 0x11CB +.stk_code EQU 0x3671 +.stk_const EQU 0x33C8 +.stk_const_xx EQU 0x341B +.stk_data EQU 0x33C6 +.stk_digit EQU 0x2D22 +.stk_f_arg EQU 0x2951 +.stk_fetch EQU 0x2BF1 +.stk_pntrs EQU 0x35BF +.stk_st_0 EQU 0x2AB1 +.stk_sto_string EQU 0x2AB2 +.stk_store EQU 0x2AB6 +.stk_to_a EQU 0x2314 +.stk_to_bc EQU 0x2307 +.stk_var EQU 0x2996 +.stk_zeros EQU 0x33F1 +.stmt_l_1 EQU 0x1B29 +.stmt_loop EQU 0x1B28 +.stmt_next EQU 0x1BF4 +.stmt_r_1 EQU 0x1B7D +.stmt_ret EQU 0x1B76 +.stop EQU 0x1CEE +.str_alter EQU 0x2070 +.str_and_no EQU 0x352D +.str_data1 EQU 0x1727 +.str_data EQU 0x171E +.str_dollar EQU 0x361F +.str_test EQU 0x3588 +.strings EQU 0x3559 +.strs_add EQU 0x359C +.strt_mlt EQU 0x3125 +.subn_only EQU 0x31F2 +.subtract EQU 0x300F +.sv_arrays EQU 0x29AE +.sv_ch_add EQU 0x29E0 +.sv_close EQU 0x29D8 +.sv_comma EQU 0x29C3 +.sv_count EQU 0x29E7 +.sv_dim EQU 0x2A48 +.sv_elem_string EQU 0x2A2C +.sv_loop EQU 0x29EA +.sv_mult EQU 0x29FB +.sv_number EQU 0x2A22 +.sv_ptr EQU 0x29C0 +.sv_rpt_c EQU 0x2A12 +.sv_simple_string EQU 0x29A1 +.sv_slice EQU 0x2A45 +.sv_slice? EQU 0x2A49 +.swap_byte EQU 0x343E +.syntax_z EQU 0x2530 +.t_expnent EQU 0x326C +.t_first EQU 0x3233 +.t_gr_zero EQU 0x3221 +.t_numeric EQU 0x3252 +.t_shift EQU 0x3261 +.t_small EQU 0x323F +.t_store EQU 0x3267 +.t_test EQU 0x325E +.tan EQU 0x37DA +.tape_msgs EQU 0x09A1 +.tbl_addrs EQU 0x32D7 +.tbl_of_ops EQU 0x2795 +.tbl_priors EQU 0x27B0 +.temp_ptr1 EQU 0x0077 +.temp_ptr2 EQU 0x0078 +.temps EQU 0x0D4D ; copy the permanent color items to the temporary ones +.temps_1 EQU 0x0D5B +.temps_2 EQU 0x0D65 +.test_5_sp EQU 0x33A9 +.test_char EQU 0x001C +.test_neg EQU 0x307C +.test_norm EQU 0x3155 +.test_room EQU 0x1F05 +.test_zero EQU 0x34E9 +.tkn_table EQU 0x0095 +.to_power EQU 0x3851 +.truncate EQU 0x3214 +.two_p_1 EQU 0x1E8E +.two_param EQU 0x1E85 +.unstack_z EQU 0x1FC3 +.use_252 EQU 0x2495 +.use_zero EQU 0x1CE6 +.usr_no EQU 0x34B3 +.usr_range EQU 0x34D3 +.usr_stack EQU 0x34E4 +.usr_string EQU 0x34BC +.v_80_byte EQU 0x2932 +.v_char EQU 0x28D4 +.v_each EQU 0x2900 +.v_end EQU 0x294B +.v_found_1 EQU 0x293E +.v_found_2 EQU 0x293F +.v_get_ptr EQU 0x2929 +.v_matches EQU 0x2912 +.v_next EQU 0x292A +.v_pass EQU 0x2943 +.v_rport_c EQU 0x360C +.v_run EQU 0x28FD +.v_run_or_syn EQU 0x28EF +.v_spaces EQU 0x2913 +.v_str_var EQU 0x28DE +.v_syntax EQU 0x2934 +.v_test_fn EQU 0x28E3 +.val_dollar EQU 0x35DE +.val_fet_1 EQU 0x1C56 +.val_fet_2 EQU 0x1C59 +.valid EQU 0x371C +.var_a_1 EQU 0x1C22 +.var_a_2 EQU 0x1C30 +.var_a_3 EQU 0x1C46 +.vr_cont_1 EQU 0x07E9 +.vr_cont_2 EQU 0x07F4 +.vr_cont_3 EQU 0x0800 +.vr_contrl EQU 0x07CB +.wait_key1 EQU 0x15DE +.wait_key EQU 0x15D4 +.x_large EQU 0x326D +.x_neg EQU 0x36B7 +.xis0 EQU 0x385D +.yneg EQU 0x37A8 +.zero_rslt EQU 0x315D +.zeros_4_or_5 EQU 0x2FFB +.zplus EQU 0x37A1 +.zx81_name EQU 0x04AA ; ZX Spectrum 128K - -ROM_SWAP: equ 0x5B00 ; 128K paging subroutine in RAM - -rom_128_new: equ 0x0057 +.ROM_SWAP EQU 0x5B00 ; 128K paging subroutine in RAM +._128_new EQU 0x0057 From 74af6c077d360fa89fa58e80ee10bb20bd0e9ff9 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 11 Nov 2023 00:25:21 +1000 Subject: [PATCH 033/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 4c835d3..3833984 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4c835d305fd5d1bc296039706d5e163c1f2224ca +Subproject commit 3833984686ab7fcf57295541864f15c175a9c9d9 From 64c96d17508c2a1880368320728b13801ffa099a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 11 Nov 2023 00:39:38 +1000 Subject: [PATCH 034/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 3833984..8641b77 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 3833984686ab7fcf57295541864f15c175a9c9d9 +Subproject commit 8641b77d8ebe42ae042bb8df3902300e678048eb From f8bd4475c6cdadd6068bd74d4fa049b276fb9274 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 17 Nov 2023 03:10:10 +1000 Subject: [PATCH 035/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 8641b77..b69773d 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 8641b77d8ebe42ae042bb8df3902300e678048eb +Subproject commit b69773d50cb2c0e1da44f7f20c7daa32871f2308 From 87f5fedbbef1653132126a7d0b0a25c1e2163178 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Dec 2023 05:20:57 +1000 Subject: [PATCH 036/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index b69773d..c135d9b 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b69773d50cb2c0e1da44f7f20c7daa32871f2308 +Subproject commit c135d9b6038fcabca6cef3234d876f93d5865dee From d6ed41730cc80a595385627a78a6616956c52aea Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 5 Jan 2024 01:32:23 +1000 Subject: [PATCH 037/114] bug --- SP_TRDOS.ASM | 1 + Shared_Includes | 2 +- TRDOS/TR_MSD_3.ASZ | 14 +++++++------- TRDOS/TR_MSD_S.ASZ | 19 ++++++++----------- TRDOS/TR_RMD_S.ASZ | 4 ++-- ZX_EXP/EXP_HDD.ASM | 3 +-- 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index eeb9234..b3a35f6 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -11,6 +11,7 @@ INCLUDE 'INC/SPRINT00.INC' INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' ;*************************************** ;CNF_PORT EQU #74 AUTO_4000 EQU 04000H diff --git a/Shared_Includes b/Shared_Includes index c135d9b..d1ce639 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit c135d9b6038fcabca6cef3234d876f93d5865dee +Subproject commit d1ce63928bdbb44e48b311f9d4a0005c2f44fcd4 diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index a2de075..57179c7 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -336,7 +336,7 @@ FAT_DE_to_HL: PUSH HL LD A,H - AND 80H + AND #80 LD C,A LD H,D LD L,E @@ -412,18 +412,18 @@ FAT_HALF_L: JR NZ,FAT_HALF_L FAT_HALF: BIT 7,D - LD A,0FFH + LD A,#FF JR NZ,FAT_16_L2 - LD A,0FH + LD A,#0F AND B LD B,A - LD A,0FH + LD A,#0F FAT_16_L2: CP B JR NZ,NO_END_CLAST FAT_ALL: LD A,C - CP 0F0H + CP #F0 JR C,NO_END_CLAST LD L,C LD H,B @@ -548,7 +548,7 @@ GET_FL_L2: ;*************************************************************************** HDD_PROG: - LD C,0 + LD C,BIOS.HDD_INIT and #BF CALL HD_CMD JP C,HDD_PROG_E LD HL,HD_IDF_ADR+54 @@ -576,7 +576,7 @@ HDD_PROG_L: RST 10H POP BC DJNZ HDD_PROG_L - LD C,1 + LD C,BIOS.HDD_RECAL and #BF CALL HD_CMD JP NC,AUTO_03E1 diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index c101509..eed69d8 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -14,7 +14,6 @@ ;* 4. Команда - C * ;* 5. Страница ОЗУ - A * ;************************************************ - HDD_REDIR: POP AF CALL HD_CMD @@ -429,7 +428,6 @@ READ_BPB: JP ERROR_MSDOS HDD_REDIR2: - CALL MAIN_BPB RET NC @@ -438,7 +436,7 @@ SPACIAL_BPB: LD DE,63 LD A,SYS_PAGE LD HL,MS_BPB - LD C,5 + LD C,BIOS.HDD_READ and #BF LD B,1 CALL MSD_R_W_UT CALL BPB_PARAMS @@ -446,12 +444,12 @@ SPACIAL_BPB: JP ERROR_MSDOS MAIN_BPB: - LD IX,0 - LD DE,0 + ;LD IX,0 + ;LD DE,0 LD A,SYS_PAGE LD HL,MS_BPB - LD C,4 - LD B,1 + LD C,BIOS.HDD_READ_BPB and #BF + ;LD B,1 CALL MSD_R_W_UT CALL BPB_PARAMS RET @@ -478,7 +476,6 @@ MAIN_BPB: ; CALL HD_CMD BPB_PARAMS: - DI IN A,(PAGE3) EX AF,AF' @@ -486,7 +483,7 @@ BPB_PARAMS: OUT (PAGE3),A LD A,(MS_BPB+FORM_CODE) - CP 0F0H + CP #F0 JP C,ERROR_BPB LD HL,MS_BPB+FAT_ID @@ -507,13 +504,13 @@ R_BPB_L11: DJNZ R_BPB_L1 LD A,(HL) CP '6' - LD HL,81FFH ; FAT16 флаг + LD HL,#81FF ; FAT16 флаг JR Z,BPB_FAT CP '2' JP NZ,ERROR_BPB PC_DOS_BPB: - LD HL,01FFH ; FAT12 флаг + LD HL,#01FF ; FAT12 флаг BPB_FAT: LD (FAT_FLAG),HL diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 68ea148..e213620 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -3,7 +3,7 @@ DISK_REDIR: PUSH BC LD A,(OPER_DISK) AND 3 - LD C,#CF ;!HARDCODE BIOS.GET_DRV_ST + LD C,BIOS.GET_DRV_ST CALL EXP_FNS EI POP BC @@ -425,7 +425,7 @@ FDD_SET: RET HDD_SET: - LD C,0 + LD C,BIOS.HDD_INIT and #BF CALL HD_CMD JP C,HDD_PROG_E diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index 2903b09..98d15c0 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -17,8 +17,7 @@ HD_EXP_EXE: CALL HD_CMD_X JP HD_EXP_RET -HD_CMD: - POP AF +HD_CMD: POP AF CALL HD_CMD_X JP HD_DOS_RET From f734b2a36170ca1025bcd499473914f05c65e978 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 6 Jan 2024 00:55:03 +1000 Subject: [PATCH 038/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 168 +++++++++++++++++++++------------------------ 2 files changed, 78 insertions(+), 92 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index d1ce639..24e0629 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d1ce63928bdbb44e48b311f9d4a0005c2f44fcd4 +Subproject commit 24e062942e2c89a1bcd5817cc82316b52186f86c diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index eed69d8..5dc90dd 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -6,25 +6,25 @@ ; MS-DOS utilites ;******************************************** -;************************************************ -;* Программа чтения/записи MS-DOS дисков * -;* 1. Адрес буфера - HL * -;* 2. Номер сектора - DE * -;* 3. Число секторов - B * -;* 4. Команда - C * -;* 5. Страница ОЗУ - A * -;************************************************ -HDD_REDIR: - POP AF - CALL HD_CMD - RET NC - JP HDD_ERROR - MSD_R_W_UT: PUSH AF CALL DISK_REDIR CP #40 - JR NC,HDD_REDIR + JR C,.NOT_HDD + ;************************************************ + ;* Подпрограмма чтения/записи MS-DOS дисков * + ;* 1. Адрес буфера - HL * + ;* 2. Номер сектора - DE * + ;* 3. Число секторов - B * + ;* 4. Команда - C * + ;* 5. Страница ОЗУ - A * + ;************************************************ +.HDD: POP AF + CALL HD_CMD + RET NC + JP HDD_ERROR + ;************************************************ +.NOT_HDD: POP AF EX AF,AF' LD A,C @@ -417,21 +417,19 @@ SET_1440: READ_BPB: CALL DISK_REDIR CP #40 - JR NC,HDD_REDIR2 + JR NC,.HDD_REDIR2 CP 4 - JP NC,ERROR_MSDOS + JP NC,.ERROR_MSDOS CALL SET_DISK - CALL MAIN_BPB + CALL .MAIN RET NC - JP ERROR_MSDOS - -HDD_REDIR2: - CALL MAIN_BPB + JP .ERROR_MSDOS +.HDD_REDIR2: + CALL .MAIN RET NC - -SPACIAL_BPB: +.SPACIAL: LD IX,0 LD DE,63 LD A,SYS_PAGE @@ -439,43 +437,38 @@ SPACIAL_BPB: LD C,BIOS.HDD_READ and #BF LD B,1 CALL MSD_R_W_UT - CALL BPB_PARAMS + CALL READ_BPB.PARAMS RET NC - JP ERROR_MSDOS - -MAIN_BPB: - ;LD IX,0 - ;LD DE,0 - LD A,SYS_PAGE + JP .ERROR_MSDOS +.MAIN: LD A,SYS_PAGE LD HL,MS_BPB LD C,BIOS.HDD_READ_BPB and #BF - ;LD B,1 CALL MSD_R_W_UT - CALL BPB_PARAMS - RET + ;CALL BPB_PARAMS + ;RET -; LD C,18H -; LD A,(OPER_DISK) -; CALL HD_CMD + ; LD C,18H + ; LD A,(OPER_DISK) + ; CALL HD_CMD + ; ; + ; DI + ; IN A,(PAGE3) + ; EX AF,AF' + ; LD A,SYS_PAGE + ; OUT (PAGE3),A + ; ; + ; LD A,(MS_BPB+S_P_T) ; Количество секторов на трек + ; LD L,A + ; ; + ; EX AF,AF' + ; OUT (PAGE3),A + ; EI + ; ; + ; LD A,(OPER_DISK) + ; LD C,19H + ; CALL HD_CMD -; DI -; IN A,(PAGE3) -; EX AF,AF' -; LD A,SYS_PAGE -; OUT (PAGE3),A -; -; LD A,(MS_BPB+S_P_T) ; Количество секторов на трек -; LD L,A -; -; EX AF,AF' -; OUT (PAGE3),A -; EI -; -; LD A,(OPER_DISK) -; LD C,19H -; CALL HD_CMD - -BPB_PARAMS: +.PARAMS: DI IN A,(PAGE3) EX AF,AF' @@ -484,35 +477,32 @@ BPB_PARAMS: LD A,(MS_BPB+FORM_CODE) CP #F0 - JP C,ERROR_BPB + JP C,.ERROR_BPB LD HL,MS_BPB+FAT_ID - LD DE,FAT1_MSG + LD DE,.FAT1_MSG LD B,4 -R_BPB_L1: - LD A,(DE) +.L1: LD A,(DE) CP ' ' - JR NZ,R_BPB_L11 + JR NZ,.L11 INC DE - JR R_BPB_L1 -R_BPB_L11: - CP (HL) - JR NZ,PC_DOS_BPB + JR .L1 +.L11: CP (HL) + JR NZ,.PC_DOS INC HL INC DE - DJNZ R_BPB_L1 + DJNZ .L1 LD A,(HL) CP '6' LD HL,#81FF ; FAT16 флаг - JR Z,BPB_FAT + JR Z,.FAT CP '2' - JP NZ,ERROR_BPB + JP NZ,.ERROR_BPB -PC_DOS_BPB: +.PC_DOS: LD HL,#01FF ; FAT12 флаг -BPB_FAT: - LD (FAT_FLAG),HL +.FAT: LD (FAT_FLAG),HL LD A,(MS_BPB+S_P_T) ; Количество секторов на трек LD (MSD_SECS),A @@ -522,11 +512,10 @@ BPB_FAT: LD IX,0 LD HL,0 ; вычислить начальный сектор FAT - JR Z,NO_LD_SPECIAL + JR Z,.NO_LD_SPECIAL LD IX,(MS_BPB+SPECIAL_SECS) LD HL,(MS_BPB+SPECIAL_SECS+2) -NO_LD_SPECIAL: - +.NO_LD_SPECIAL: LD BC,0 LD DE,(MS_BPB+RESERV_SECS) @@ -540,11 +529,11 @@ NO_LD_SPECIAL: LD BC,0 LD A,(MS_BPB+FATS_NUM) ; количество FATs -NEXT_ADD: +.NEXT_ADD: ADD IX,DE ADC HL,BC DEC A - JR NZ,NEXT_ADD + JR NZ,.NEXT_ADD LD (MSD_CAT_SEC),IX ; начальный сектор DIR LD (MSD_CAT_SEC2),HL ; начальный сектор DIR @@ -566,11 +555,11 @@ NEXT_ADD: EX DE,HL DEC HL XOR A -NEXT_ADD2: +.NEXT_ADD2: INC A - JR Z,ERROR_BPB + JR Z,.ERROR_BPB SBC HL,BC - JR NC,NEXT_ADD2 + JR NC,.NEXT_ADD2 EX DE,HL LD E,A ; A - число секторов в DIR @@ -589,11 +578,11 @@ NEXT_ADD2: LD A,(MS_BPB+CLAST_SIZE) LD D,A LD A,0 -NEXT_ADD3: +.NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,0 DEC D - JR NZ,NEXT_ADD3 + JR NZ,.NEXT_ADD3 LD (CLASTER_LEN),HL LD B,0 @@ -603,31 +592,28 @@ NEXT_ADD3: LD HL,0 LD BC,(MS_BPB+S_P_T) LD A,(MS_BPB+H_P_S) -BPB_L1: ; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР +.BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР ADD HL,BC DEC A - JR NZ,BPB_L1 + JR NZ,.BPB_L1 LD (S_X_H),HL - + ; EX AF,AF' OUT (PAGE3),A EI AND A RET - -ERROR_BPB: +.ERROR_BPB: EX AF,AF' OUT (PAGE3),A SCF EI RET - - -ERROR_MSDOS: +.ERROR_MSDOS: LD HL,MSG_3 JP AUTO_03E4 - -FAT1_MSG: DB 'FAT1' +.FAT1_MSG: + DB 'FAT1' ;******************************************** READ_NEXT_DIR: DI @@ -713,7 +699,7 @@ LOOP_TRK: INC A JR NZ,LOOP_TRK POP BC - JP ERROR_BPB + JP READ_BPB.ERROR_BPB SEC_ENDER: ADD HL,BC From ae88e6864e10a7e8df1c42ae75eaf387f9732d60 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 6 Jan 2024 02:57:48 +1000 Subject: [PATCH 039/114] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=B2=D0=BE=D1=81=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D1=82=D0=B0=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=20EXP=5FFNS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 40 ++++++++++++++++++++++++++++++++++--- TRDOS/TR_MSD_2.ASZ | 8 ++++++-- TRDOS/TR_MSD_3.ASZ | 14 +++++++------ TRDOS/TR_MSD_S.ASZ | 2 +- TRDOS/TR_RMD_S.ASZ | 50 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b3a35f6..a8903e1 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6447,6 +6447,36 @@ PRINT_RED: POP BC POP HL RET +;******************************* + + +;******************************* +;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то +EXP_FNS_PREPARE: + PUSH HL + PUSH AF + LD A,R + DI + PUSH AF + POP HL + POP AF + EX (SP),HL + CALL EXP_FNS_PREPARE_EXIT + EX (SP),HL + PUSH AF + LD A,L + AND 4 + JR Z,.no_EI + EI +.no_EI: POP AF + POP HL + RET +EXP_FNS_PREPARE_EXIT: + PUSH AF + XOR A + JP EXP_FNS_PREPARE_RET +;******************************* + ;******************************* BLOCK #3CC0 - $,255 @@ -7016,9 +7046,13 @@ HD_CMD: PUSH AF ;----[ From API #80..#FF to TR-DOS ]----- BLOCK #3FF8-$, #FF EXP_FNS: - PUSH AF - DI - XOR A ; D_ROM16OFF + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;PUSH AF + ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать + ;XOR A ; D_ROM16OFF + JP EXP_FNS_PREPARE +EXP_FNS_PREPARE_RET: + ; OUT (SYS_PORT_ON),A POP AF RET diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 88e5175..141ddec 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -570,7 +570,9 @@ AY8910: LD A,#EA LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; CALL AUTO_1D97 AND A RET @@ -592,7 +594,9 @@ SP_1: LD A,(DE) CCF RET C CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; CALL AUTO_1D97 AND A RET diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 57179c7..c524135 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,9 +1,13 @@ INIT_RMD: LD C,#9F ;!HARDCODE BIOS.FullInit - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; + ; DI ; LD C,PAGE3 @@ -220,9 +224,7 @@ CONT_XX1: ADD A,A INC A - LOOP_128: - PUSH AF PUSH DE PUSH IX @@ -271,7 +273,7 @@ MADE_next_blk: CALL EXP_FNS POP BC INC L ; SET ZF, if END BLK !!! - LD HL,0C000H + LD HL,#C000 RET ;***************************************** diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 5dc90dd..2ee025a 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -431,7 +431,7 @@ READ_BPB: RET NC .SPACIAL: LD IX,0 - LD DE,63 + LD DE,63 ;!HARDCODE LD A,SYS_PAGE LD HL,MS_BPB LD C,BIOS.HDD_READ and #BF diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index e213620..d34babd 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,3 +1,4 @@ +; DISK_REDIR: PUSH HL PUSH BC @@ -5,7 +6,9 @@ DISK_REDIR: AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP BC POP HL RET @@ -42,7 +45,9 @@ TEST_RAMD: PUSH HL LD C,#CE ;!HARDCODE BIOS.GET_RAMD_ST CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP HL RET @@ -273,11 +278,13 @@ PAGE_CALC2: AND #0F LD D,A PUSH HL - LD C,#98 ;!HARDCODE BIOS.RAMD_CALC_PAGE + LD C,BIOS.RAMD_CALC_PAGE CALL DISK_REDIR SUB 4 CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; LD B,A LD C,H POP HL @@ -394,7 +401,9 @@ CLEAR_RMD_A: PUSH BC LD C,#93 ;!HARDCODE BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP BC POP DE POP HL @@ -405,7 +414,9 @@ GET_RMD_A: GET_RAM_BLK: ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk LD C,#92 ;!HARDCODE BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; RET NC NO_MEM: LD HL,NO_MEMORY @@ -420,9 +431,12 @@ FDD_SET: LD A,(OPER_DISK) LD B,A LD C,#CC ;!HARDCODE BIOS.FDD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; HDD_SET: LD C,BIOS.HDD_INIT and #BF @@ -433,9 +447,12 @@ HDD_SET: LD B,A LD A,0 LD C,#CD ;!HARDCODE BIOS.HDD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; RAMD_SET: CALL RAMD_SYM @@ -446,9 +463,12 @@ RAMD_SET1: LD B,A POP AF LD C,#CB ;!HARDCODE BIOS.RAMD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; RAMD_SYM: LD A,(DE) From 9d3482c7b0052e6411b6295f9fba1c57ec33a5c1 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Jan 2024 00:54:43 +1000 Subject: [PATCH 040/114] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?HD=5FCMD=20=D0=BD=D0=B0=20EXP=5FFNS=20=D0=B2=20TRDOS.=20=D0=9C?= =?UTF-8?q?=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 336 ++++++++++++++++++++++++++------------------- SP__48.ASM | 5 +- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 90 ++++++------ TRDOS/TR_MSD_3.ASZ | 75 +++++----- TRDOS/TR_MSD_S.ASZ | 76 +++++----- TRDOS/TR_RMD_S.ASZ | 80 +++++++++-- 7 files changed, 396 insertions(+), 268 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index a8903e1..e81b60c 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -12,74 +12,87 @@ INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' -;*************************************** -;CNF_PORT EQU #74 -AUTO_4000 EQU 04000H -AUTO_4010 EQU 04010H -AUTO_4011 EQU 04011H -AUTO_4020 EQU 04020H -AUTO_4080 EQU 04080H -AUTO_40E1 EQU 040E1H -AUTO_40E3 EQU 040E3H -AUTO_40E4 EQU 040E4H -AUTO_40E5 EQU 040E5H -AUTO_40F0 EQU 040F0H -AUTO_40F1 EQU 040F1H -AUTO_40FF EQU 040FFH -AUTO_4100 EQU 04100H -AUTO_4101 EQU 04101H -AUTO_4102 EQU 04102H -AUTO_4103 EQU 04103H -AUTO_4110 EQU 04110H -AUTO_4111 EQU 04111H -AUTO_4118 EQU 04118H -AUTO_4119 EQU 04119H -AUTO_411B EQU 0411BH -AUTO_411D EQU 0411DH -AUTO_411E EQU 0411EH -AUTO_4130 EQU 04130H -AUTO_4140 EQU 04140H -AUTO_41FF EQU 041FFH -AUTO_5220 EQU 05220H -AUTO_58E8 EQU 058E8H -AUTO_5E34 EQU 05E34H -AUTO_5F00 EQU 05F00H -AUTO_5F10 EQU 05F10H -AUTO_5F12 EQU 05F12H -AUTO_6000 EQU 06000H -PORT_128 EQU 07FFDH -AUTO_A1DB EQU 0A1DBH -AUTO_B0ED EQU 0B0EDH -AUTO_B8ED EQU 0B8EDH -AUTO_C000 EQU 0C000H -AUTO_C130 EQU 0C130H -AUTO_C308 EQU 0C308H -AUTO_C916 EQU 0C916H -AUTO_FE15 EQU 0FE15H -AUTO_FF00 EQU 0FF00H -AUTO_FFFF EQU 0FFFFH +TRDOS_ROM_CMD: +.READ_BPB EQU BIOS.HDD_READ_BPB and #BF +.READ EQU BIOS.HDD_READ and #BF +.WRITE EQU BIOS.HDD_WRITE and #BF +;*************************************** + + +;CNF_PORT EQU #74 +AUTO_4000 EQU #4000 +AUTO_4010 EQU #4010 +AUTO_4011 EQU #4011 +AUTO_4020 EQU #4020 +AUTO_4080 EQU #4080 +AUTO_40E1 EQU #40E1 +AUTO_40E3 EQU #40E3 +AUTO_40E4 EQU #40E4 +AUTO_40E5 EQU #40E5 +AUTO_40F0 EQU #40F0 +AUTO_40F1 EQU #40F1 +AUTO_40FF EQU #40FF +AUTO_4100 EQU #4100 +AUTO_4101 EQU #4101 +AUTO_4102 EQU #4102 +AUTO_4103 EQU #4103 +AUTO_4110 EQU #4110 +AUTO_4111 EQU #4111 +AUTO_4118 EQU #4118 +AUTO_4119 EQU #4119 +AUTO_411B EQU #411B +AUTO_411D EQU #411D +AUTO_411E EQU #411E +AUTO_4130 EQU #4130 +AUTO_4140 EQU #4140 +AUTO_41FF EQU #41FF +AUTO_5220 EQU #5220 +AUTO_58E8 EQU #58E8 + +AUTO_5E34 EQU #5E34 +AUTO_5F00 EQU #5F00 +AUTO_5F10 EQU #5F10 +AUTO_5F12 EQU #5F12 +AUTO_6000 EQU #6000 +PORT_128 EQU #7FFD +AUTO_A1DB EQU #A1DB +AUTO_B0ED EQU #B0ED +AUTO_B8ED EQU #B8ED +AUTO_C000 EQU #C000 +AUTO_C130 EQU #C130 +AUTO_C308 EQU #C308 +AUTO_C916 EQU #C916 +AUTO_FE15 EQU #FE15 +AUTO_FF00 EQU #FF00 +AUTO_FFFF EQU #FFFF ;**************************************** DISPLAY "Start." -START: - DI - LD DE,0FFFFh +START: DI + LD DE,#FFFF LD A,7 JR CONT_1 RST08: NOP CONT_1: - OUT (0FEH),A + OUT (#FE),A LD A,'?' JR CONT_2 - NOP + +//////////////////////////////////////////////////////////////////////// + BLOCK #10-$,0 RST10: JP PRINT_SYM +//////////////////////////////////////////////////////////////////////// + CONT_2: LD I,A JP CONT_3 + +//////////////////////////////////////////////////////////////////////// + BLOCK #18-$,0 PRINT_LN: JP PRINT_L CONT_3: @@ -88,32 +101,39 @@ CONT_3: NOP AUTO_001E: JR CONT_4 + +//////////////////////////////////////////////////////////////////////// + BLOCK #20-$,0 RST20: JP RST20_EXE RET +//////////////////////////////////////////////////////////////////////// + CONT_4: LD H,D LD L,E JR CONT_5 + +//////////////////////////////////////////////////////////////////////// + BLOCK #28-$,0 RST28: JP RST28_EXE +//////////////////////////////////////////////////////////////////////// + CONT_5: LD (HL),2 DEC HL CP H JR NZ,CONT_5 JR CONT_6 + +//////////////////////////////////////////////////////////////////////// REDIR_RST38: + BLOCK #38-$,#FF ; JP RST38X ; EI ; RET - RST 38H - RST 38H - RST 38H - RST 38H - RST 38H -R38: - EI +R38: EI RET CONT_6: OR A @@ -128,25 +148,33 @@ CONT_6: CONT_7: DEC HL LD (P_RAMTOP),HL - LD DE,3EAFh - LD BC,00A8h + LD DE,#3EAF + LD BC,#00A8 LD A,E EX DE,HL - LD SP,6000h + LD SP,#6000 LD (AUTO_5F00),HL LD HL,RET_1 PUSH HL - LD HL,3D2Fh + LD HL,#3D2F PUSH HL - LD HL,0B8EDh + LD HL,#B8ED + +//////////////////////////////////////////////////////////////////////// + BLOCK #64-$,0 AUTO_0064: JR CONT_8 +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// + BLOCK #66-$,0 ;********** MAGIC *********** ; JP MAGIC_1 ;AUTO_2A56 RETN NOP -;********************************* +//////////////////////////////////////////////////////////////////////// + CONT_8: LD (AUTO_5F10),HL PUSH AF @@ -567,6 +595,7 @@ AUTO_03CD: LD A,(MSG_FLAG) OR A CALL Z,PRINT_L +;!FIXIT Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. RET AUTO_03D9: LD HL,AUTO_2A28 @@ -597,9 +626,16 @@ RD_HEAD_DSK: LD A,(CODE_10H) CP 16 JR Z,AUTO_0415 - LD HL,DISK_ERROR_MSG - RST PRINT_LN - JR AUTO_03C0 + ;!TEST + ; Неправильно обрабатывалась ошибка. Программа не получала код + ; ошибки, а внизу экрана совершенно не к месту появлялся DISK ERROR. + ;LD HL,DISK_ERROR_MSG + ;RST PRINT_LN + ;JR AUTO_03C0 + LD HL,DISK_ERROR_MSG + JP RD_HEAD_DSK.FIXED + ; + AUTO_0415: CALL get_disk_type RES 0,(HL) @@ -659,8 +695,11 @@ AUTO_0479: PUSH AF CALL Z,AUTO_1D97 POP AF - CP 17 - JP NC,CMD_ERROR + ;!TEST + ;CP 17 + CP #10 + ; + JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 LD (DISK_1_FLG),A @@ -846,8 +885,10 @@ AUTO_05BD: AUTO_05CB: LD A,(FL_NAME) CP '*' - JP NZ,AUTO_03D9 - CALL BAS_2BF1 + ;JP NZ,AUTO_03D9 + JR Z,.next + RET +.next: CALL BAS_2BF1 EX DE,HL CALL SET_DRIVE LD A,(HL) @@ -876,7 +917,7 @@ AUTO_05F4: JR Z,AUTO_05F4 LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(DISK_2_FLG) CALL SET_DISK @@ -897,7 +938,7 @@ AUTO_063C: JP Z,AUTO_1C45 LD HL,VAR_2 LD DE,FL_START - LD BC,START+7 + LD BC,7 LDIR LD DE,(FL_SIZE) LD D,0 @@ -945,11 +986,15 @@ CMD_COPY: CALL AUTO_1CB0 LD A,(OPER_DISK) LD (DISK_1_FLG),A - JP NZ,AUTO_05CB + ;!TEST Ошибка!!! COPY "*","*" надо проверять всегда, иначе при + ; наличии на диске файла с именем "*" скопируется только этот файл + ;JP NZ,AUTO_05CB + CALL CMD_COPY.FIXED + ; CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR CALL AUTO_1CB0 PUSH AF @@ -987,7 +1032,7 @@ AUTO_0716: CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(DISK_2_FLG) CALL SET_DISK @@ -1378,7 +1423,7 @@ AUTO_11B0: ; CMD_LIST: CALL TEST_CR - LD BC,START+2 + LD BC,2 LD (MED_LEN),BC JR Z,AUTO_1205 CP '#' @@ -1438,7 +1483,7 @@ AUTO_123E: CALL PRINT_SYM CALL PRINT_CR LD HL,(VAR_1) - LD BC,START+3 + LD BC,3 ADD HL,BC LD A,(HL) LD HL,(VAR_1) @@ -1450,7 +1495,7 @@ AUTO_123E: LD HL,AUTO_10AA RST PRINT_LN LD HL,(VAR_1) - LD BC,START+2 + LD BC,2 ADD HL,BC LD A,(HL) LD HL,AUTO_10CE @@ -1474,7 +1519,7 @@ AUTO_1292: LD HL,AUTO_111E RST PRINT_LN LD HL,(VAR_1) - LD BC,START+4 + LD BC,4 ADD HL,BC LD C,(HL) INC HL @@ -1551,7 +1596,7 @@ AUTO_1303: CALL PRINT_CR JP AUTO_123E AUTO_131B: - LD BC,START+5 + LD BC,5 ADD HL,BC LD B,(HL) INC HL @@ -1638,7 +1683,7 @@ AUTO_13B7: CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(VAR_2_0) LD (ERR_3D00),A @@ -1679,7 +1724,7 @@ AUTO_1403: JP Z,AUTO_2723 LD HL,VAR_2 LD DE,FL_START - LD BC,START+7 + LD BC,7 LDIR CALL AUTO_03FD LD A,(ERR_3D00) @@ -1839,7 +1884,7 @@ AUTO_1575: SBC HL,BC LD (FL_TYPE),HL LD (FL_N_2),HL - LD HL,START + LD HL,0 LD (FL_N_4),HL LD (FL_N_6),HL CALL AUTO_15B8 @@ -1890,7 +1935,7 @@ AUTO_15DB: POP BC JP NC,AUTO_1644 LD BC,(FL_TYPE) - LD HL,START + LD HL,0 LD (FL_TYPE),HL AUTO_15F8: PUSH BC @@ -1976,6 +2021,7 @@ AUTO_168F: LD B,A LD C,0 RET + ; LD (MED_START),HL LD (MED_LEN),HL LD DE,(FL_SIZE) @@ -2001,7 +2047,7 @@ CMD_MOVE: SUB 9 LD (L_5D23),A LD HL,(FL_N_4) - LD DE,START + LD DE,0 LD B,9 CALL READ_DISK LD HL,(FL_N_4) @@ -2085,7 +2131,7 @@ CMD_MOVE: ADD HL,DE LD (HL),0 LD HL,(FL_N_4) - LD DE,START + LD DE,0 LD B,9 CALL WRITE_DISK LD A,(L_5D23) @@ -2469,11 +2515,11 @@ AUTO_1A01: LD DE,(FL_START) PUSH DE PUSH HL - LD HL,START + LD HL,0 LD A,(DISK_2_FLG) CP 255 JR Z,AUTO_1A20 - LD HL,START+5 + LD HL,5 AUTO_1A20: ADD HL,DE LD (MED_LEN),HL @@ -2586,7 +2632,7 @@ AUTO_1AC4: ; CMD_SAVE: CALL AUTO_1852 - LD HL,START + LD HL,0 LD (AUTO_5CD1),HL CALL INPUT_TXT CALL AUTO_1D8C @@ -2734,7 +2780,7 @@ AUTO_1BDE: AUTO_1BFC: CALL AUTO_1C1B RET NC - LD HL,START + LD HL,0 LD (DOS_CH_ADR),HL LD A,(DISK_2_FLG) CP 255 @@ -3121,8 +3167,8 @@ AUTO_1E67: LD (CONT_SEC),DE JP R_W_REDIR - LD (HL),30 ; НЕ исп. !!! - + ;LD (HL),30 ; НЕ исп. !!! + BLOCK #1E70-$,0 AUTO_1E70: POP HL POP BC @@ -3182,7 +3228,7 @@ AUTO_1EBC: ; ; CMD_FORMAT: - LD HL,START + LD HL,0 LD (MED_START),HL LD (DOS_CH_ADR),HL LD (AUTO_5CD1),HL @@ -3711,7 +3757,7 @@ AUTO_229A: LD (DOS_CH_ADR),HL CALL AUTO_1AC4 CALL AUTO_1B59 - LD HL,START + LD HL,0 LD (FL_LEN),HL CALL AUTO_166B JP AUTO_1E43 @@ -4127,7 +4173,7 @@ AUTO_2504: RST RST28 LD B,(HL) XOR A - LD HL,START + LD HL,0 LD (MED_LEN),HL AUTO_2538: ADD HL,DE @@ -4455,8 +4501,8 @@ AUTO_276B: AUTO_2779: DB "BACKUP DISK",141 AUTO_2785: - DB "Insert Destination disk",13,"then " - DB "press Y",0 + DB "Insert Destination disk",13 + DB "then press Y",0 AUTO_27AA: DB "Insert Source disk then press Y",0 AUTO_27CA: @@ -4469,13 +4515,16 @@ AUTO_27ED: DB "Directory full",141 AUTO_27FC: DB "No disk",141 - DISPLAY "10k" + + DISPLAY "10k" + AUTO_2804: DB "Stream opened",141 AUTO_2812: DB "Not disk file",141 AUTO_2820: - DB "File exists",13,"Over write?(Y/N",169 + DB "File exists",13 + DC "Over write?(Y/N)" AUTO_283C: PUSH AF PUSH BC @@ -4489,7 +4538,7 @@ AUTO_283C: POP AF LD HL,AUTO_0201 LD (ADR_RET),HL - LD HL,START + LD HL,0 ADD HL,SP LD (DOS_SP),HL DEC HL @@ -4711,34 +4760,20 @@ CMD_80: LD A,#80 ; ; ; ;Адрес #29B2. Тексты сообщений TR-DOS. -AUTO_29B2: - DB 13,"*ERROR*",141 -AUTO_29BB: - DB 13,"No space",141 -AUTO_29C5: - DB 13,"File exists",141 -AUTO_29D2: - DB " Free",141 -READ_ONLY_MSG: - DB 13,"Read Onl",249 -DISK_ERROR_MSG: - DB 13,"Disc Erro",242 -AUTO_29ED: - DB 13,"Rec. O/",198 -AUTO_29F7: - DB "Title:",160 -AUTO_29FE: - DB 13,"Retry,Abort,Ignore?",0 -AUTO_2A13: - DB 13,"Trk",160 -AUTO_2A18: - DB " sec",160 -AUTO_2A1D: - DB " Del. File",141 -AUTO_2A28: - DB 13,"No" -AUTO_2A2B: - DB " File(s)",141,0 +AUTO_29B2: DB 13, "*ERROR*", 141 +AUTO_29BB: DB 13, "No space", 141 +AUTO_29C5: DB 13, "File exists", 141 +AUTO_29D2: DB " Free", 141 +READ_ONLY_MSG: DC 13, "Read Only" +DISK_ERROR_MSG: DC 13, "Disk Error" +AUTO_29ED: DC 13, "Rec. O/F" +AUTO_29F7: DC "Title: " +AUTO_29FE: DZ 13, "Retry,Abort,Ignore?" +AUTO_2A13: DC 13, "Trk " +AUTO_2A18: DC " sec " +AUTO_2A1D: DB " Del. File", 141 +AUTO_2A28: DB 13, "No" +AUTO_2A2B: DZ " File(s)", 141 AUTO_2A35: LD HL,AUTO_2A41 LD DE,AUTO_4080 @@ -4778,7 +4813,7 @@ AUTO_2A56: PUSH AF LD A,R PUSH AF - LD HL,START + LD HL,0 ADD HL,SP PUSH HL LD A,3Ch @@ -4872,13 +4907,13 @@ AUTO_2B09: INC HL LD (HL),D LD HL,AUTO_4000 - LD DE,START + LD DE,0 IN A,(WG_SEC) DEC A LD E,A LD B,1 CALL AUTO_2D73 - LD HL,START + LD HL,0 ADD HL,SP LD (AUTO_4140),HL LD SP,AUTO_41FF @@ -4955,7 +4990,7 @@ AUTO_2B95: INC A LD (AUTO_40E4),A LD HL,(AUTO_40E5) - LD DE,START+1 + LD DE,1 SBC HL,DE LD (AUTO_40E5),HL RET C @@ -6473,11 +6508,22 @@ EXP_FNS_PREPARE: RET EXP_FNS_PREPARE_EXIT: PUSH AF - XOR A + XOR A ; SYS_PORT.BIOS JP EXP_FNS_PREPARE_RET ;******************************* +RD_HEAD_DSK.FIXED: + LD A,7 + JP AUTO_1C4A +CMD_COPY.FIXED: + PUSH AF + CALL AUTO_05CB + POP AF + RET Z + INC SP + INC SP + JP AUTO_03D9 ;******************************* BLOCK #3CC0 - $,255 MAGIC_1: @@ -6521,9 +6567,11 @@ REDIR_3D13: JP NZ,EXP_FNS ;#3FF8 EXP BIT 6,C JP Z,AUTO_283C - RES 6,C - JP HD_CMD ;#3FF0 ROM. DI - + ;!TEST 06/01/2024 убираем лишние телодвижения + ;RES 6,C + ;JP HD_CMD ;#3FF0 ROM. DI + JP EXP_FNS + ; ;***************************** BLOCK #3CFA - $,255 AUTO_3CFA: @@ -6662,7 +6710,7 @@ AUTO_3DA5: RESET_WG: LD A,8 CALL WG93_EXE - LD DE,START + LD DE,0 IN A,(WG_COM) AND 2 LD B,A @@ -7031,25 +7079,25 @@ AUTO_3FEC: ;****************************************** -;!FIXIT Можно поправить номера функций при вызовах API и прыгать сразу в BIOS через #3FF8 +;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- BLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI - LD A,D_ROM16ON + ;LD A,SYS_PORT.EXTENSION + LD A,1 OUT (SYS_PORT_ON),A POP AF RET ;--------------------------------------- ; -;----[ From API #80..#FF to TR-DOS ]----- +;----[ From TR-DOS to API #80..#FF]----- BLOCK #3FF8-$, #FF -EXP_FNS: - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то +EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;PUSH AF ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать - ;XOR A ; D_ROM16OFF + ;XOR A ; SYS_PORT.BIOS JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: ; diff --git a/SP__48.ASM b/SP__48.ASM index f576190..2762a51 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19260,13 +19260,12 @@ L3C8F: DEFB $13, $00 ; Bright, off DEFB $31, $39 ; '1', '9' DEFB $13, $01 ; Bright, on DEFB $38, $36 ; '8', '6' - +L3C97: ; ------ ; UNUSED ; ------ -L3C97: - BLOCK #3CF0-$,0 ;15600 + BLOCK #3CF0-$,0 ;15600 ;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >; ; ╔═══════════════════════════╗ ; ║ дополнения для SP48 !! ║ diff --git a/Shared_Includes b/Shared_Includes index 24e0629..e7e58e7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 24e062942e2c89a1bcd5817cc82316b52186f86c +Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 141ddec..87dbeac 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -100,12 +100,12 @@ MSDOS_CAT: CALL AUTO_1D97 ; CLS CALL OPEN_CH2 LD A,13 - RST 10H + RST #10 POP DE ; СТРОКА ПОСЛЕ CAT CAT_SPACES: LD A,(DE) - CP 20H + CP #20 JR NZ,CAT_NO_SPACE INC DE JR CAT_SPACES @@ -523,44 +523,47 @@ CALC_CL_LP: POP BC RET -HD_TX: DB ' ERR_HD',0A0H -HD_TX2: DB 'HDD not found',0A0H -MSG_3: DB 'ERROR...',0A0H -MSDOS_MSG: DB 'File not found...',0A0H -NO_MEMORY: DB 'No RAM-Disk MEM',0A0H +HD_TX: DC ' ERR_HD ' +HD_TX2: DC 'HDD not found ' +MSG_3: DC 'ERROR... ' +MSDOS_MSG: DC 'File not found... ' +NO_MEMORY: DC 'No RAM-Disk MEM ' -WORDS: - DB 5,'CLEAR' ; очистить RAM-Disk - DW CLEAR_RAMD_X - DB 3,'CAT' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'DIR' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'HDD' ; подключить HDD - DW HDD_SET - DB 3,'FDD' ; подключить FDD - DW FDD_SET - DB 3,'RMD' ; подключить RMD - DW RAMD_SET - DB 3,'HDT' ; тест HDD - DW HDD_PROG - DB 2,'RD' ; тест RAM-Disk space - DW RAMD_FAT_PROG - DB 4,'SAVE' ; сохранить RAM-Disk - DW SAVE_RMD - DB 4,'LOAD' ; загрузить RAM-Disk - DW LOAD_RMD - DB 4,'TBON' ; включить турбо - DW TB_ONOFF - DB 5,'TBOFF' ; выключить турбо - DW TB_ONOFF - DB 4,'INIT' ; инизиализация - DW INIT_RMD - DB 8,"SPRINTER" - DW SPR_1 - DB 2,"AY" - DW AY8910 - DB 0 +WORDS: DB 5,'CLEAR' ; очистить RAM-Disk + DW CLEAR_RAMD_X + DB 3,'CAT' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'DIR' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'HDD' ; подключить HDD + DW HDD_SET + DB 3,'FDD' ; подключить FDD + DW FDD_SET + DB 3,'RMD' ; подключить RMD + DW RAMD_SET + DB 3,'HDT' ; тест HDD + DW HDD_PROG + DB 2,'RD' ; тест RAM-Disk space + DW RAMD_FAT_PROG + DB 4,'SAVE' ; сохранить RAM-Disk + DW SAVE_RMD + DB 4,'LOAD' ; загрузить RAM-Disk + DW LOAD_RMD + DB 4,'TBON' ; включить турбо + DW TB_ONOFF + DB 5,'TBOFF' ; выключить турбо + DW TB_ONOFF + DB 4,'INIT' ; инизиализация + DW INIT_RMD + DB 8,"SPRINTER" + DW SPR_1 + DB 2,"AY" + DW AY8910 + ;[ ] 07/01/2024 + DB 6,'SETHDD' ; /SETHDD XYZ, где X - chanel, Y - master/slave, Z - 0..3 - номер раздела + DW CHOOSE_HDD + ; + DB 0 ;SAVE_AUTOEXEC: ; LD C,0FEH @@ -577,18 +580,17 @@ AY8910: AND A RET -SPR_1: - LD A,(DE) +SPR_1: LD A,(DE) INC DE - CP #20 + CP " " JR Z,SPR_1 CP "1" - LD C,#F0 ;!HARDCODE BIOS.RST_CONF.SP97_1 + LD C,BIOS.RST_CONF.SP97_1 JR Z,SP_1 CP "2" SCF RET NZ - LD C,#F1 ;!HARDCODE BIOS.RST_CONF.SP97_2 + LD C,BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) CP #21 CCF diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index c524135..d9ec5d5 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,6 +1,6 @@ INIT_RMD: - LD C,#9F ;!HARDCODE BIOS.FullInit + LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -30,8 +30,8 @@ INIT_RMD: RAMD_FAT_PROG: CALL AUTO_1D97 ; CLS - CALL OPEN_CH2 - LD HL,RAMD_FAT + CALL OPEN_CH2 + LD HL,RAMD_FAT RAMD_F_L1: DI IN A,(PAGE3) @@ -41,7 +41,6 @@ RAMD_F_L1: LD A,C LD C,(HL) OUT (PAGE3),A -; RET_PAGE3 EI PUSH HL LD A,C @@ -52,22 +51,28 @@ RAMD_F_L1: CALL OPEN_CH0 JP AUTO_03E1 ;*************************************************************************** +;[x] исправлен баг с неработающими командами TBON/TBOFF TB_ONOFF: - DEC DE - DEC DE - LD A,(DE) - CP 'F' - JR Z,TB_OFF_EXE - CP 'f' - JR Z,TB_OFF_EXE -TB_ON_EXE: - LD C,#8F ;!HARDCODE BIOS.FN_TURBO - LD A,4 - JP EXP_FNS -TB_OFF_EXE: - LD C,#8F ;!HARDCODE BIOS.FN_TURBO - LD A,3 - JP EXP_FNS + DEC DE + DEC DE + LD A,(DE) + OR %0010'0000 + CP 'f' + LD C,BIOS.FN_TURBO + LD A,BIOS.FN_TURBO.OFF + JR Z,.set + ; + LD A,BIOS.FN_TURBO.ON +.set: JP EXP_FNS + +; TB_ON_EXE: +; LD C,BIOS.FN_TURBO +; LD A,4 +; JP EXP_FNS +; TB_OFF_EXE: +; LD C,BIOS.FN_TURBO +; LD A,3 +; JP EXP_FNS ; ;*************************************************************************** ; @@ -82,19 +87,19 @@ TB_OFF_EXE: MSDOS_WRITE_FILE: LD (CONT_BUF_ADR),HL ; адрес загрузки LD (MED_START),A ; страница загрузки - LD A,6 + LD A,TRDOS_ROM_CMD.WRITE JR MSDOS_R_W_FILE ; MSDOS_READ_FILE: LD (CONT_BUF_ADR),HL ; адрес загрузки LD (MED_START),A ; страница загрузки - LD A,5 + LD A,TRDOS_ROM_CMD.READ MSDOS_R_W_FILE: LD (MED_LEN),A -; beg=start_claster ; Получить начальный кластер + ; beg=start_claster. Получить начальный кластер LD IX,(START_CLASTER) ; стартовый кластер -; next=beg -; max=file_len ; длина в кластерах + ; next=beg + ; max=file_len. длина в кластерах CALL GET_FILE_CLASTERS_BC ; LD A,B ; CALL PRINT_HEX_A @@ -215,10 +220,11 @@ READ_num_clasters_from_beg: PUSH AF LD A,(MED_LEN) LD C,A - SUB 5 + SUB TRDOS_ROM_CMD.READ JR Z,CONT_XX1 DEC A JR NZ,SKEEP_XX1 + ;TRDOS_ROM_CMD.WRITE CONT_XX1: POP AF @@ -497,8 +503,7 @@ READ_FAT_SEC: LD HL,MS_FAT LD A,SYS_PAGE - LD B,2 - LD C,5 + LD BC,256*2 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT POP HL @@ -550,8 +555,12 @@ GET_FL_L2: ;*************************************************************************** HDD_PROG: - LD C,BIOS.HDD_INIT and #BF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; JP C,HDD_PROG_E LD HL,HD_IDF_ADR+54 LD B,32 @@ -578,8 +587,12 @@ HDD_PROG_L: RST 10H POP BC DJNZ HDD_PROG_L - LD C,BIOS.HDD_RECAL and #BF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_RECAL and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_RECAL + CALL EXP_FNS + ; JP NC,AUTO_03E1 HDD_ERROR: diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 2ee025a..e6fc1d0 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -5,7 +5,6 @@ ;******************************************** ; MS-DOS utilites ;******************************************** - MSD_R_W_UT: PUSH AF CALL DISK_REDIR @@ -20,7 +19,11 @@ MSD_R_W_UT: ;* 5. Страница ОЗУ - A * ;************************************************ .HDD: POP AF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;CALL HD_CMD + SET 6,C + CALL EXP_FNS + ; RET NC JP HDD_ERROR ;************************************************ @@ -162,50 +165,50 @@ MSD_R_W_LOOP: POP AF CALL NZ,MSD_3F0A DI - IN A,(PAGE2) - LD C,A + IN A,(PAGE2) + LD C,A LD A,SYS_PAGE OUT (PAGE2),A - LD DE,(MS_BPB+SEC_SIZE-4000h) - LD A,C - OUT (PAGE2),A + LD DE,(MS_BPB+SEC_SIZE-#4000) + LD A,C + OUT (PAGE2),A EI POP HL ADD HL,DE - LD A,H - OR L - JR NZ,MSD_NO_PAGE + LD A,H + OR L + JR NZ,MSD_NO_PAGE DI - IN A,(PAGE2) - LD C,A - LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(MED_START) - LD HL,RAMD_FAT-4000H - LD L,A - LD L,(HL) - LD A,C - OUT (PAGE2),A + IN A,(PAGE2) + LD C,A + LD A,SYS_PAGE + OUT (PAGE2),A + LD A,(MED_START) + LD HL,RAMD_FAT-#4000 + LD L,A + LD L,(HL) + LD A,C + OUT (PAGE2),A EI - LD A,L - LD HL,0C000H - LD (MED_START),A + LD A,L + LD HL,#C000 + LD (MED_START),A MSD_NO_PAGE: LD (CONT_BUF_ADR),HL PUSH HL DI - IN A,(PAGE2) - LD C,A + IN A,(PAGE2) + LD C,A LD A,SYS_PAGE OUT (PAGE2),A - LD A,(DS_1440-4000H) - RES 0,A - LD (DS_1440-4000H),A - LD A,(MSD_SECS-4000h) + LD A,(DS_1440-#4000) + AND %1111'1110 + LD (DS_1440-#4000),A + LD A,(MSD_SECS-#4000) LD L,A - LD A,C - OUT (PAGE2),A + LD A,C + OUT (PAGE2),A EI LD A,L LD HL,CONT_SEC @@ -434,16 +437,18 @@ READ_BPB: LD DE,63 ;!HARDCODE LD A,SYS_PAGE LD HL,MS_BPB - LD C,BIOS.HDD_READ and #BF - LD B,1 + ; + LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT CALL READ_BPB.PARAMS RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE LD HL,MS_BPB - LD C,BIOS.HDD_READ_BPB and #BF + LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT + + ;CALL BPB_PARAMS ;RET @@ -644,8 +649,7 @@ READ_NEXT2: EI LD HL,MS_DIR LD A,SYS_PAGE - LD B,1 - LD C,5 + LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT DI IN A,(PAGE3) diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index d34babd..1cf7929 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -288,7 +288,7 @@ PAGE_CALC2: LD B,A LD C,H POP HL - EI + ;EI RET NC JP ERROR_DISK @@ -399,7 +399,7 @@ CLEAR_RMD_A: PUSH HL PUSH DE PUSH BC - LD C,#93 ;!HARDCODE BIOS.FreeMemRMD + LD C,BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -410,9 +410,10 @@ CLEAR_RMD_A: RET ;********************************************************* +; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk GET_RMD_A: -GET_RAM_BLK: ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk - LD C,#92 ;!HARDCODE BIOS.GetMemRMD +GET_RAM_BLK: + LD C,BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -438,15 +439,18 @@ FDD_SET: ;RET ; -HDD_SET: - LD C,BIOS.HDD_INIT and #BF - CALL HD_CMD +HDD_SET:;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; JP C,HDD_PROG_E LD A,(OPER_DISK) LD B,A - LD A,0 - LD C,#CD ;!HARDCODE BIOS.HDD_TO_DRV + XOR A + LD C,BIOS.HDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -498,3 +502,61 @@ RAMD_SYM_OK: RET +;[ ] 07/01/2024 +CHOOSE_HDD: + PUSH DE + LD A,(OPER_DISK) + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + POP DE + JR C,.error + AND #40 ;!HARDCODE HDD + JR Z,.error + ; +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + LD A,(DE) + CP #0D + JR Z,.error + ; номер раздела + INC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + RLA + LD C,A + ; master/slave + DEC DE + LD A,(DE) + CP "2" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + OR C + LD C,A + ; Primary/Secondary + DEC DE + LD A,(DE) + CP "2" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + OR C + ; + LD C,BIOS.HDD_PART + CALL EXP_FNS + RET NC + ; +.error: LD HL,MSG_3 + JP ERR_EXIT + +;bit0: Primary/Secondary, bit1 - master/slave, bit2..3: использующийся раздел в MBR \ No newline at end of file From aee7f4e05f037d74bc30b3d30bdc7812860e2fd8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 27 Jan 2024 03:42:21 +1000 Subject: [PATCH 041/114] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20/SETHDD=20=D0=B2=20TR-DO?= =?UTF-8?q?S?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 3 ++- TRDOS/TR_RMD_S.ASZ | 32 ++++++++++++++++---------------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index e7e58e7..5cb5d02 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e +Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673 diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index e6fc1d0..4bccc88 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -440,7 +440,8 @@ READ_BPB: ; LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT - CALL READ_BPB.PARAMS + ; + CALL .PARAMS RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 1cf7929..8597159 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -431,7 +431,7 @@ READ_ONLY: FDD_SET: LD A,(OPER_DISK) LD B,A - LD C,#CC ;!HARDCODE BIOS.FDD_TO_DRV + LD C,BIOS.FDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -466,7 +466,7 @@ RAMD_SET1: LD A,(OPER_DISK) LD B,A POP AF - LD C,#CB ;!HARDCODE BIOS.RAMD_TO_DRV + LD C,BIOS.RAMD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -521,7 +521,7 @@ CHOOSE_HDD: CP #0D JR Z,.error ; номер раздела - INC DE + ;INC DE LD A,(DE) CP "4" JR NC,.error @@ -531,21 +531,21 @@ CHOOSE_HDD: RLA RLA LD C,A - ; master/slave + ; ; master/slave + ; DEC DE + ; LD A,(DE) + ; CP "2" + ; JR NC,.error + ; CP "0" + ; JR C,.error + ; SUB "0" + ; RLA + ; OR C + ; LD C,A + ; Primary/Secondary, master/slave DEC DE LD A,(DE) - CP "2" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - RLA - OR C - LD C,A - ; Primary/Secondary - DEC DE - LD A,(DE) - CP "2" + CP "4" JR NC,.error CP "0" JR C,.error From 523f36dc6d8250091f467a34cf9c2814b5fcf356 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 27 Jan 2024 04:13:40 +1000 Subject: [PATCH 042/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5cb5d02..d3cdfc6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673 +Subproject commit d3cdfc6e7644fab96ebe2c6e87959359cda6319c From 2a869d746e2b709f086fb35a628148edffddd48d Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 28 Jan 2024 01:52:52 +1000 Subject: [PATCH 043/114] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=BA=20=D0=BD=D0=B0=20Sp2000.inc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 1878 ++++++++++++++++++++++---------------------- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 82 +- TRDOS/TR_MSD_3.ASZ | 104 +-- TRDOS/TR_MSD_S.ASZ | 270 +++---- TRDOS/TR_RMD_S.ASZ | 60 +- 6 files changed, 1197 insertions(+), 1199 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index e81b60c..2989ddf 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -8,7 +8,7 @@ ORG 0 ;*************************************** - INCLUDE 'INC/SPRINT00.INC' + INCLUDE 'Shared_Includes/constants/sp2000.inc' INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' @@ -147,7 +147,7 @@ CONT_6: JR Z,CONT_6 CONT_7: DEC HL - LD (P_RAMTOP),HL + LD (ZX_VARS.P_RAMTOP),HL LD DE,#3EAF LD BC,#00A8 LD A,E @@ -186,72 +186,72 @@ CONT_8: RET_1: EX DE,HL INC HL - LD (UDG),HL + LD (ZX_VARS.UDG),HL DEC HL LD BC,AUTO_0540 - LD (ERR_BEEP),BC - LD (TOP_CLEAR),HL + LD (ZX_VARS.ERR_BEEP),BC + LD (ZX_VARS.TOP_CLEAR),HL LD HL,03C00h - LD (ZG),HL - LD HL,(TOP_CLEAR) + LD (ZX_VARS.ZG),HL + LD HL,(ZX_VARS.TOP_CLEAR) LD (HL),'>' DEC HL LD SP,HL DEC HL DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL LD DE,01303h PUSH DE IM 1 - LD IY,ERR_NR - LD HL,BEG_ADRESS + LD IY,ZX_VARS.ERR_NR + LD HL,ZX_VARS.BEG_ADRESS AUTO_00A8: - LD (CHANS),HL + LD (ZX_VARS.CHANS),HL LD DE,AUTO_15AF LD BC,15h EX DE,HL CALL AUTO_0117 EX DE,HL DEC HL - LD (DATA_ADR),HL + LD (ZX_VARS.DATA_ADR),HL INC HL - LD (BAS_PROG),HL - LD (BAS_VARS),HL + LD (ZX_VARS.BAS_PROG),HL + LD (ZX_VARS.BAS_VARS),HL LD (HL),128 INC HL - LD (E_LINE),HL + LD (ZX_VARS.E_LINE),HL DB 54 AUTO_00C8: DEC C INC HL LD (HL),128 INC HL - LD (WORK_SP),HL - LD (STK_BOT),HL - LD (STK_END),HL + LD (ZX_VARS.WORK_SPACE),HL + LD (ZX_VARS.STK_BOT),HL + LD (ZX_VARS.STK_END),HL LD A,'8' - LD (ATTR_P),A - LD (ATTR_T),A - LD (BORDER),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.ATTR_T),A + LD (ZX_VARS.BORDER),A LD HL,0223h - LD (KEY_TIME),HL + LD (ZX_VARS.KEY_TIME),HL DEC (IY-58) DEC (IY-54) LD HL,015C6h - LD DE,REP_K_TYME + LD DE,ZX_VARS.REP_K_TYME LD BC,14 CALL AUTO_0117 SET 1,(IY+1) - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS AUTO_0100: LD (HL),201 RST_ROM ROUTINE.clear_prb - LD HL,L_SCR_SIZE + LD HL,ZX_VARS.L_SCR_SIZE LD (HL),2 LD HL,AUTO_128B PUSH HL LD A,170 - LD (PR_BUFER),A + LD (ZX_VARS.PRINTER_BUFFER),A EI JP AUTO_3D31 AUTO_0117: @@ -266,7 +266,7 @@ AUTO_0124: AUTO_012A: CALL AUTO_20E5 CALL AUTO_1D97 - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) INC HL LD E,(HL) INC HL @@ -276,49 +276,49 @@ AUTO_012A: EX DE,HL JR Z,AUTO_0140 XOR A - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A AUTO_0140: PUSH HL CALL AUTO_0232 POP HL - LD (NEW_PPC),HL + LD (ZX_VARS.NEW_PPC),HL XOR A - LD (NEW_S_PPC),A + LD (ZX_VARS.NEW_S_PPC),A RST_ROM ROUTINE.set_min - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) DEC HL - LD (DATA_ADR),HL - LD SP,(ERR_SP) - LD A,(ERR_3D00) + LD (ZX_VARS.DATA_ADR),HL + LD SP,(ZX_VARS.ERR_SP) + LD A,(ZX_VARS.ERR_3D00) OR A LD HL,AUTO_1B76 JR Z,AUTO_0166 RST_ROM ROUTINE.report_0 AUTO_0166: PUSH HL - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL RET AUTO_016C: ; вход через 3D03 CALL xchg_intf1 CALL BUFER_ON LD A,255 - LD (MSG_FLAG),A + LD (ZX_VARS.MSG_FLAG),A XOR A - LD (DOS_FLAG),A + LD (ZX_VARS.DOS_FLAG),A LD A,170 - LD (FLAG_BOOT),A + LD (ZX_VARS.FLAG_BOOT),A LD HL,AUTO_0201 - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL LD HL,0 ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL CALL AUTO_021D - LD HL,(TOP_CLEAR) - LD DE,(CH_ADR) + LD HL,(ZX_VARS.TOP_CLEAR) + LD DE,(ZX_VARS.CH_ADR) SBC HL,DE EX DE,HL JR NC,AUTO_01A5 @@ -326,7 +326,7 @@ AUTO_016C: ; LD DE,101h SBC HL,DE AUTO_01A5: - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL AUTO_01A8: CALL AUTO_01C7 AUTO_01AB: @@ -340,7 +340,7 @@ AUTO_01AB: JP NZ,AUTO_01D3 INC HL CALL AUTO_3048 ; convert words - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) JP AUTO_030A AUTO_01C7: LD A,(HL) @@ -353,12 +353,12 @@ AUTO_01C7: CALL AUTO_1E43 AUTO_01D3: LD HL,0 - LD (DISK_1_FLG),HL + LD (ZX_VARS.DISK_1_FLG),HL CALL AUTO_20E5 CALL AUTO_1D63 - LD HL,FLAG_BOOT + LD HL,ZX_VARS.FLAG_BOOT LD (HL),170 - LD HL,FL_NUMBER+1 + LD HL,ZX_VARS.FL_NUMBER+1 LD A,(HL) OR A LD (HL),0 @@ -366,9 +366,9 @@ AUTO_01D3: CALL AUTO_1E1C CALL AUTO_0212 AUTO_01F3: - LD SP,(DOS_SP) - LD HL,(ADR_RET) - LD BC,(DOS_ERR_2) + LD SP,(ZX_VARS.DOS_SP) + LD HL,(ZX_VARS.ADR_RET) + LD BC,(ZX_VARS.DOS_ERR_2) LD B,0 AUTO_0200: JP (HL) @@ -376,8 +376,8 @@ AUTO_0201: CALL AUTO_0232 BIT 7,(IY+0) RET NZ - LD DE,RET_INS - LD SP,(ERR_SP) + LD DE,ZX_VARS.RET_INS + LD SP,(ZX_VARS.ERR_SP) PUSH DE RET AUTO_0212: @@ -387,35 +387,35 @@ AUTO_0212: CALL BASIC_RST20 JR AUTO_0212 AUTO_021D: - LD HL,(ERR_SP) - LD (ERR_SP_COPY),HL - LD HL,(DOS_SP) + LD HL,(ZX_VARS.ERR_SP) + LD (ZX_VARS.ERR_SP_COPY),HL + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL LD DE,AUTO_3D16 LD (HL),E INC HL LD (HL),D RET AUTO_0232: - LD HL,(ERR_SP_COPY) - LD (ERR_SP),HL + LD HL,(ZX_VARS.ERR_SP_COPY) + LD (ZX_VARS.ERR_SP),HL RET AUTO_0239: ; вход через 3D00 LD HL,0 - LD (DOS_FLAG),HL + LD (ZX_VARS.DOS_FLAG),HL ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL CALL LOAD_CR - LD HL,FLAG_BOOT + LD HL,ZX_VARS.FLAG_BOOT LD A,(HL) CP 170 LD A,0 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP Z,AUTO_02CB LD (HL),170 CALL AUTO_1D97 @@ -423,22 +423,22 @@ AUTO_0239: ; LD HL,NEW_NAME RST PRINT_LN CALL INIT_2X80 - LD A,(BEG_ADRESS) + LD A,(ZX_VARS.BEG_ADRESS) CP 244 JR Z,AUTO_0271 LD HL,AUTO_1000 AUTO_0270: RST PRINT_LN AUTO_0271: - LD A,(PR_BUFER) + LD A,(ZX_VARS.PRINTER_BUFFER) CP 170 JR NZ,AUTO_02CB CALL xchg_intf1 AUTO_027B: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD A,254 AUTO_0280: - LD (BAS_DOS_FLG),A + LD (ZX_VARS.BAS_DOS_FLG),A LD (HL),247 INC HL LD (HL),'"' @@ -454,14 +454,14 @@ AUTO_0280: LD (HL),'"' INC HL CMD_NEW_EXEC: - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL LD (HL),13 INC HL LD (HL),128 INC HL - LD (WORK_SP),HL - LD (STK_BOT),HL - LD (STK_END),HL + LD (ZX_VARS.WORK_SPACE),HL + LD (ZX_VARS.STK_BOT),HL + LD (ZX_VARS.STK_END),HL SET 3,(IY+1) JR AUTO_02EF AUTO_02B0: @@ -478,7 +478,7 @@ AUTO_02B9: AUTO_02BB: PUSH BC XOR 8 - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A PUSH AF LD A,5 CALL pause_1ms @@ -487,33 +487,33 @@ AUTO_02BB: DJNZ AUTO_02BB RET AUTO_02CB: - LD HL,(DOS_SP) + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL LD SP,HL CALL xchg_intf1 CALL OPEN_CH0 - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) OR 3 CALL AUTO_02B9 - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) CALL AUTO_02B9 XOR A - LD (MSG_FLAG),A + LD (ZX_VARS.MSG_FLAG),A CALL INPUT_LINE CALL AUTO_3032 ; ПРЕОБРАЗОВАНИЕ СТРОКИ AUTO_02EF: CALL AUTO_1D9F ; ФУНКЦИЯ BASIC ??? ( CLS LOW SCR ) LD HL,AUTO_02CB - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL XOR A - LD (DOS_ERR_2),A - LD HL,(E_LINE) + LD (ZX_VARS.DOS_ERR_2),A + LD HL,(ZX_VARS.E_LINE) PUSH HL - LD DE,COM_LN_COPY + LD DE,ZX_VARS.COM_LN_COPY CALL AUTO_02B0 POP HL - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL AUTO_030A: LD A,(HL) LD B,A @@ -523,7 +523,7 @@ AUTO_030A: CP 254 ; RETURN JR Z,AUTO_031A PUSH AF - CALL AUTO_3DC8 ; SET CONT_DISK + CALL AUTO_3DC8 ; SET ZX_VARS.CONT_DISK POP AF AUTO_031A: LD HL,TRDOS_CMD.LIST ; СПИСОК КОМАНД @@ -542,12 +542,12 @@ AUTO_0320: CP 254 CALL NZ,BUFER_ON ; Включить буфер, если не RETURN LD A,9 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A XOR A - LD (DOS_ERR_2),A - LD (DOS_ERROR),A - LD (ERR_3D00),A - LD HL,FLAGS + LD (ZX_VARS.DOS_ERR_2),A + LD (ZX_VARS.DOS_ERROR),A + LD (ZX_VARS.ERR_3D00),A + LD HL,ZX_VARS.FLAGS RES 7,(HL) LD B,0 LD HL,TRDOS_CMD.TABLE @@ -563,7 +563,7 @@ AUTO_0320: PUSH DE JP (HL) AUTO_0359: - LD HL,FLAGS + LD HL,ZX_VARS.FLAGS SET 7,(HL) POP HL JP (HL) @@ -576,7 +576,7 @@ AUTO_03AC: CALL PRINT_CR CALL PRINT_CR AUTO_03B5: - LD BC,(FREE_SEC) + LD BC,(ZX_VARS.FREE_SEC) CALL AUTO_1DA9 LD HL,AUTO_29D2 RST PRINT_LN @@ -584,15 +584,15 @@ AUTO_03C0: JP AUTO_01D3 AUTO_03C3: PUSH AF - LD A,(BAS_DOS_FLG) + LD A,(ZX_VARS.BAS_DOS_FLG) CP 254 JR NZ,AUTO_03CD POP AF RET AUTO_03CD: POP AF - LD (DOS_ERR_2),A - LD A,(MSG_FLAG) + LD (ZX_VARS.DOS_ERR_2),A + LD A,(ZX_VARS.MSG_FLAG) OR A CALL Z,PRINT_L ;!FIXIT Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. @@ -608,13 +608,13 @@ AUTO_03E4: JP AUTO_1C4A AUTO_03E8: XOR A - LD (CAT_SEC),A + LD (ZX_VARS.CAT_SEC),A AUTO_03EC: - LD DE,(CAT_SEC) + LD DE,(ZX_VARS.CAT_SEC) LD D,0 AUTO_03F2: CALL BUFER_ON - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD B,1 JP READ_DISK AUTO_03FD: @@ -623,7 +623,7 @@ AUTO_03FD: JR AUTO_03F2 RD_HEAD_DSK: CALL AUTO_03FD - LD A,(CODE_10H) + LD A,(ZX_VARS.CODE_10H) CP 16 JR Z,AUTO_0415 ;!TEST @@ -640,7 +640,7 @@ AUTO_0415: CALL get_disk_type RES 0,(HL) RES 1,(HL) - LD A,(TYPE_DISK) + LD A,(ZX_VARS.TYPE_DISK) BIT 0,A JR NZ,AUTO_0425 SET 0,(HL) @@ -650,7 +650,7 @@ AUTO_0425: SET 1,(HL) RET TEST_CR: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) INC HL LD A,(HL) CP 13 @@ -661,12 +661,12 @@ TEST_CR: CMD_CAT: CALL TEST_CR LD BC,2 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC JR Z,AUTO_046A CP '#' JR NZ,AUTO_045D - LD (CH_ADR),HL ; КАНАЛ ДЛЯ CAT + LD (ZX_VARS.CH_ADR),HL ; КАНАЛ ДЛЯ CAT CALL AUTO_1E0B CALL AUTO_1D8C CP 13 @@ -686,10 +686,10 @@ AUTO_0460: CALL SET_DRIVE AUTO_046A: CALL SINTAX_RET - LD A,(OPER_DISK) - LD (DISK_2_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A CALL RD_HEAD_DSK - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) AUTO_0479: CP 2 PUSH AF @@ -702,14 +702,14 @@ AUTO_0479: JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 - LD (DISK_1_FLG),A + LD (ZX_VARS.DISK_1_FLG),A LD HL,AUTO_29F7 RST PRINT_LN - LD HL,DISK_NAME + LD HL,ZX_VARS.DISK_NAME RST PRINT_LN CALL PRINT_CR - LD A,(N_FILES) - LD HL,N_DEL_FL + LD A,(ZX_VARS.N_FILES) + LD HL,ZX_VARS.N_DEL_FL SUB (HL) PUSH HL CALL AUTO_1DA3 @@ -721,11 +721,11 @@ AUTO_0479: LD HL,AUTO_2A1D RST PRINT_LN CALL AUTO_03E8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER AUTO_04B6: CALL AUTO_04F6 CALL PRINT_CR - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' RST RST10 LD B,2 @@ -766,8 +766,8 @@ AUTO_04E8: AUTO_04F6: PUSH HL PUSH BC - LD A,(DISK_2_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_2_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) CALL NZ,SET_DISK POP BC @@ -787,12 +787,12 @@ AUTO_050C: POP HL RET AUTO_0517: - LD HL,CAT_SEC + LD HL,ZX_VARS.CAT_SEC INC (HL) CALL AUTO_03EC POP BC POP HL - LD HL,BUFER + LD HL,ZX_VARS.BUFFER RET GET_DISK: AND 223 @@ -816,15 +816,15 @@ CMD_NEW: AUTO_0540: CALL AUTO_102E CALL AUTO_1CB0 - LD A,(OPER_DISK) - LD (DISK_1_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_1_FLG),A JP NZ,AUTO_03D9 PUSH BC CALL AUTO_165D CALL AUTO_1CB0 PUSH AF - LD A,(DISK_1_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_1_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) JP NZ,CMD_ERROR CALL RD_HEAD_DSK @@ -836,23 +836,23 @@ AUTO_0569: CALL AUTO_1E43 JP AUTO_03E1 AUTO_0572: - LD A,(ERR_3D00) + LD A,(ZX_VARS.ERR_3D00) OR A RET AUTO_0577: - LD A,(N_DEL_FLS) + LD A,(ZX_VARS.N_DEL_FLS) OR A JP Z,AUTO_03D9 JP AUTO_03E1 AUTO_0581: PUSH BC CALL AUTO_1D97 - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' CALL PRINT_SYM LD A,':' CALL PRINT_SYM - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME CALL AUTO_2938 LD HL,AUTO_2820 CALL PRINT_L @@ -870,20 +870,20 @@ AUTO_0581: XOR A RET AUTO_05B4: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JR Z,AUTO_05BD XOR A RET AUTO_05BD: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_1CB3 LD A,9 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A RET AUTO_05CB: - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '*' ;JP NZ,AUTO_03D9 JR Z,.next @@ -894,32 +894,32 @@ AUTO_05CB: LD A,(HL) CP '*' JP NZ,CMD_ERROR - LD A,(OPER_DISK) - LD (DISK_2_FLG),A - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK LD A,255 - LD (BUF_FLAG+1),A + LD (ZX_VARS.BUF_FLAG+1),A AUTO_05F4: - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL RD_HEAD_DSK - LD A,(BUF_FLAG+1) + LD A,(ZX_VARS.BUF_FLAG+1) INC A - LD (BUF_FLAG+1),A + LD (ZX_VARS.BUF_FLAG+1),A LD C,A CALL AUTO_165D - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP 0 JP Z,AUTO_03E1 CP 1 JR Z,AUTO_05F4 - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL AUTO_1CB3 JR NZ,AUTO_0634 @@ -933,36 +933,36 @@ AUTO_0634: JR AUTO_05F4 AUTO_063C: CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_1C45 - LD HL,VAR_2 - LD DE,FL_START + LD HL,ZX_VARS.VAR_2 + LD DE,ZX_VARS.FL_START LD BC,7 LDIR - LD DE,(FL_SIZE) + LD DE,(ZX_VARS.FL_SIZE) LD D,0 OR A - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FREE_SEC) SBC HL,DE JP C,AUTO_1C45 - LD (FREE_SEC),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL + LD (ZX_VARS.FREE_SEC),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL PUSH HL CALL AUTO_072F POP HL - LD (FL_PLACE),HL - LD HL,(CONT_SEC) - LD (CLEAR_SEC),HL - LD HL,N_FILES + LD (ZX_VARS.FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.CLEAR_SEC),HL + LD HL,ZX_VARS.N_FILES INC (HL) LD C,(HL) DEC C LD B,0 PUSH BC LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 POP BC CALL AUTO_166B @@ -971,7 +971,7 @@ AUTO_063C: ; ; CMD_COPY: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) INC HL LD A,(HL) AND 223 @@ -984,27 +984,27 @@ CMD_COPY: CALL AUTO_166F CALL AUTO_102E CALL AUTO_1CB0 - LD A,(OPER_DISK) - LD (DISK_1_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_1_FLG),A ;!TEST Ошибка!!! COPY "*","*" надо проверять всегда, иначе при ; наличии на диске файла с именем "*" скопируется только этот файл ;JP NZ,AUTO_05CB CALL CMD_COPY.FIXED ; CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR CALL AUTO_1CB0 PUSH AF PUSH BC - LD A,(OPER_DISK) - LD (DISK_2_FLG),A - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL RD_HEAD_DSK - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK POP BC @@ -1017,72 +1017,72 @@ CMD_COPY: AUTO_06F3: CALL AUTO_063C CALL AUTO_1E43 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JP NZ,AUTO_03E1 LD A,10 - LD (S_NAME_NUM),A - LD HL,FL_START + LD (ZX_VARS.S_NAME_NUM),A + LD HL,ZX_VARS.FL_START INC (HL) - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL AUTO_05B4 JP NZ,AUTO_03E1 AUTO_0716: CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK JR AUTO_06F3 AUTO_072F: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_0775 - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) LD B,A XOR A - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A AUTO_0744: PUSH BC - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK POP BC PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(VAR_2_1) + LD DE,(ZX_VARS.VAR_2_1) CALL READ_DISK - LD HL,(CONT_SEC) - LD (VAR_2_1),HL - LD A,(DISK_2_FLG) + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.VAR_2_1),HL + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK POP HL POP BC - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_PLACE),HL JR AUTO_072F AUTO_0775: - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A JR AUTO_0744 AUTO_0781: XOR A - LD (N_DEL_FLS),A + LD (ZX_VARS.N_DEL_FLS),A JR AUTO_07A0 ; ; @@ -1092,31 +1092,31 @@ CMD_ERASE: CALL SINTAX_RET CALL AUTO_102E XOR A - LD (N_DEL_FLS),A + LD (ZX_VARS.N_DEL_FLS),A CALL AUTO_292F CALL AUTO_07A0 JP NZ,AUTO_0577 JP AUTO_03E1 AUTO_07A0: - LD A,(FL_NAME) - LD (FST_SYM_NAME),A + LD A,(ZX_VARS.FL_NAME) + LD (ZX_VARS.FST_SYM_NAME),A RET NZ - LD HL,N_DEL_FLS + LD HL,ZX_VARS.N_DEL_FLS INC (HL) PUSH BC CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) POP BC INC C CP C JR NZ,AUTO_07BC DEC A - LD (N_FILES),A + LD (ZX_VARS.N_FILES),A XOR A AUTO_07BC: PUSH AF JR Z,AUTO_07C3 - LD HL,N_DEL_FL + LD HL,ZX_VARS.N_DEL_FL INC (HL) AUTO_07C3: PUSH BC @@ -1128,11 +1128,11 @@ AUTO_07C3: JP Z,AUTO_07D2 LD A,1 AUTO_07D2: - LD (FL_NAME),A + LD (ZX_VARS.FL_NAME),A PUSH AF CALL AUTO_1E40 - LD A,(FST_SYM_NAME) - LD (FL_NAME),A + LD A,(ZX_VARS.FST_SYM_NAME) + LD (ZX_VARS.FL_NAME),A POP AF JR Z,AUTO_07E7 CALL AUTO_1CB3 @@ -1142,13 +1142,13 @@ AUTO_07D2: AUTO_07E7: BLOCK #07E7-$,255 CALL AUTO_03FD - LD HL,(FL_PLACE) - LD (CLEAR_SEC),HL - LD DE,(FL_SIZE) - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FL_PLACE) + LD (ZX_VARS.CLEAR_SEC),HL + LD DE,(ZX_VARS.FL_SIZE) + LD HL,(ZX_VARS.FREE_SEC) LD D,0 ADD HL,DE - LD (FREE_SEC),HL + LD (ZX_VARS.FREE_SEC),HL JP AUTO_1E43 WG93_EXE_: AND 252 @@ -1231,12 +1231,12 @@ CMD_STAR: CALL AUTO_0531 LD A,(DE) CALL GET_DISK - LD (CONT_DISK),A + LD (ZX_VARS.CONT_DISK),A CALL SET_DISK JP AUTO_03E1 AUTO_102E: LD B,'C' - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A JR NZ,AUTO_104D CALL AUTO_1D8C @@ -1251,7 +1251,7 @@ AUTO_102E: JR Z,AUTO_104D LD B,'B' AUTO_104D: - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE LD (HL),B RET AUTO_1052: @@ -1341,8 +1341,8 @@ AUTO_112E: DB 13,13," File Name Start Length " DB "Line",0 AUTO_1151: - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL LD BC,AUTO_021D+5 JP AUTO_1E23 AUTO_115D: @@ -1404,8 +1404,8 @@ AUTO_11A8: AUTO_11B0: PUSH HL PUSH BC - LD A,(DISK_2_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_2_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) CALL NZ,SET_DISK POP BC @@ -1424,11 +1424,11 @@ AUTO_11B0: CMD_LIST: CALL TEST_CR LD BC,2 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC JR Z,AUTO_1205 CP '#' JR NZ,AUTO_11F8 - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL AUTO_1D8C CP 13 @@ -1447,10 +1447,10 @@ AUTO_11FB: CALL SET_DRIVE AUTO_1205: CALL SINTAX_RET - LD A,(OPER_DISK) - LD (DISK_2_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A CALL RD_HEAD_DSK - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) CP 2 PUSH AF CALL Z,AUTO_1D97 @@ -1459,34 +1459,34 @@ AUTO_1205: JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 - LD (DISK_1_FLG),A + LD (ZX_VARS.DISK_1_FLG),A CALL AUTO_1151 - LD HL,CLEAR_SEC - LD DE,(VAR_1) + LD HL,ZX_VARS.CLEAR_SEC + LD DE,(ZX_VARS.VAR_1) LD BC,RST20 LDIR CALL AUTO_03E8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER PUSH HL AUTO_123E: LD HL,AUTO_10B3 PUSH BC RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,CONT_2+1 ADD HL,BC RST PRINT_LN LD HL,AUTO_10BA RST PRINT_LN - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' CALL PRINT_SYM CALL PRINT_CR - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,3 ADD HL,BC LD A,(HL) - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,CONT_2 ADD HL,BC SUB (HL) @@ -1494,7 +1494,7 @@ AUTO_123E: CALL AUTO_1DA3 LD HL,AUTO_10AA RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,2 ADD HL,BC LD A,(HL) @@ -1518,7 +1518,7 @@ AUTO_1292: RST PRINT_LN LD HL,AUTO_111E RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,4 ADD HL,BC LD C,(HL) @@ -1617,7 +1617,7 @@ AUTO_132C: AUTO_1333: DJNZ AUTO_132C AUTO_1335: - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,RST20+1 ADD HL,BC LD B,2 @@ -1660,13 +1660,13 @@ AUTO_1375: CALL AUTO_1CB0 JP NZ,AUTO_03D9 CALL AUTO_13B7 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JP NZ,AUTO_03E1 AUTO_1393: LD A,10 - LD (S_NAME_NUM),A - LD HL,FL_START + LD (ZX_VARS.S_NAME_NUM),A + LD HL,ZX_VARS.FL_START INC (HL) CALL AUTO_1D97 LD HL,AUTO_27AA @@ -1681,30 +1681,30 @@ AUTO_13A5: JR AUTO_1393 AUTO_13B7: CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(VAR_2_0) - LD (ERR_3D00),A + LD A,(ZX_VARS.VAR_2_0) + LD (ZX_VARS.ERR_3D00),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR),A + LD (ZX_VARS.DOS_CH_ADR),A LD A,255 - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL AUTO_1451 - LD HL,(FL_NUMBER+1) - LD (FL_PLACE),HL - LD HL,(CONT_SEC) - LD (CLEAR_SEC),HL - LD HL,N_FILES + LD HL,(ZX_VARS.FL_NUMBER+1) + LD (ZX_VARS.FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.CLEAR_SEC),HL + LD HL,ZX_VARS.N_FILES INC (HL) LD C,(HL) DEC C LD B,0 PUSH BC LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 POP BC CALL AUTO_166B @@ -1712,39 +1712,39 @@ AUTO_13B7: RET AUTO_1403: XOR A - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A CALL AUTO_1CB3 JP Z,AUTO_1C50 CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_2723 - LD HL,VAR_2 - LD DE,FL_START + LD HL,ZX_VARS.VAR_2 + LD DE,ZX_VARS.FL_START LD BC,7 LDIR CALL AUTO_03FD - LD A,(ERR_3D00) - LD (FL_SIZE),A - LD DE,(FL_SIZE) + LD A,(ZX_VARS.ERR_3D00) + LD (ZX_VARS.FL_SIZE),A + LD DE,(ZX_VARS.FL_SIZE) LD D,0 OR A - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FREE_SEC) SBC HL,DE JP C,AUTO_1C45 - LD (FREE_SEC),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL - LD (FL_NUMBER+1),HL + LD (ZX_VARS.FREE_SEC),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL + LD (ZX_VARS.FL_NUMBER+1),HL RET AUTO_1451: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A JR NZ,AUTO_146F CALL AUTO_1D97 @@ -1756,28 +1756,28 @@ AUTO_1465: JR NZ,AUTO_1465 CALL AUTO_1D9F AUTO_146F: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_14CB - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) LD B,A XOR A - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A AUTO_1484: PUSH BC - LD (RD_WR_COM),A - LD HL,(VAR_1) + LD (ZX_VARS.RD_WR_COM),A + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(VAR_2_1) + LD DE,(ZX_VARS.VAR_2_1) CALL AUTO_14D8 CALL READ_DISK - LD HL,(CONT_SEC) - LD (VAR_2_1),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.VAR_2_1),HL CALL AUTO_1D97 LD HL,AUTO_2785 CALL PRINT_L @@ -1786,21 +1786,21 @@ AUTO_14A5: CP 'Y' JR NZ,AUTO_14A5 CALL AUTO_1D9F - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A CALL NZ,AUTO_1403 POP HL POP BC - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL AUTO_14E4 CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_PLACE),HL JP AUTO_1451 AUTO_14CB: - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A @@ -1809,7 +1809,7 @@ AUTO_14D8: PUSH HL PUSH DE CALL get_disk_type - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A POP DE POP HL @@ -1818,19 +1818,19 @@ AUTO_14E4: PUSH HL PUSH DE CALL get_disk_type - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) LD (HL),A POP DE POP HL RET AUTO_14F0: XOR A - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR+1),A - LD A,(TYPE_DISK) - LD (FL_START+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A + LD A,(ZX_VARS.TYPE_DISK) + LD (ZX_VARS.FL_START+1),A LD HL,AUTO_0280 CP 25 JR Z,AUTO_151F @@ -1844,8 +1844,8 @@ AUTO_14F0: JR Z,AUTO_151F JP CMD_ERROR AUTO_151F: - LD (FL_NAME),HL - LD BC,(FL_N_2) + LD (ZX_VARS.FL_NAME),HL + LD BC,(ZX_VARS.FL_N_2) SBC HL,BC JP C,AUTO_1C45 RET @@ -1862,11 +1862,11 @@ AUTO_153E: JR NZ,AUTO_153E CALL AUTO_1D9F LD A,255 - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR),A - LD A,(TYPE_DISK) + LD (ZX_VARS.DOS_CH_ADR),A + LD A,(ZX_VARS.TYPE_DISK) CP 25 LD HL,AUTO_0280 JR Z,AUTO_1575 @@ -1880,36 +1880,36 @@ AUTO_153E: JR Z,AUTO_1575 JP CMD_ERROR AUTO_1575: - LD BC,(FREE_SEC) + LD BC,(ZX_VARS.FREE_SEC) SBC HL,BC - LD (FL_TYPE),HL - LD (FL_N_2),HL + LD (ZX_VARS.FL_TYPE),HL + LD (ZX_VARS.FL_N_2),HL LD HL,0 - LD (FL_N_4),HL - LD (FL_N_6),HL + LD (ZX_VARS.FL_N_4),HL + LD (ZX_VARS.FL_N_6),HL CALL AUTO_15B8 CALL RD_HEAD_DSK - LD A,(FL_START+1) - LD (TYPE_DISK),A - LD HL,(FL_NAME) - LD BC,(FL_N_2) + LD A,(ZX_VARS.FL_START+1) + LD (ZX_VARS.TYPE_DISK),A + LD HL,(ZX_VARS.FL_NAME) + LD BC,(ZX_VARS.FL_N_2) SBC HL,BC - LD (FREE_SEC),HL + LD (ZX_VARS.FREE_SEC),HL CALL AUTO_14E4 LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 AUTO_15AF: JP AUTO_03E1 AUTO_15B2: - LD HL,(FL_TYPE) + LD HL,(ZX_VARS.FL_TYPE) LD A,H OR L RET AUTO_15B8: CALL AUTO_15B2 RET Z - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A JR NZ,AUTO_15DB CALL AUTO_1D97 @@ -1927,26 +1927,26 @@ AUTO_15DB: RET Z PUSH BC PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD C,(HL) LD B,0 POP HL SBC HL,BC POP BC JP NC,AUTO_1644 - LD BC,(FL_TYPE) + LD BC,(ZX_VARS.FL_TYPE) LD HL,0 - LD (FL_TYPE),HL + LD (ZX_VARS.FL_TYPE),HL AUTO_15F8: PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL CALL AUTO_14D8 - LD DE,(FL_N_4) + LD DE,(ZX_VARS.FL_N_4) LD B,C CALL READ_DISK - LD HL,(CONT_SEC) - LD (FL_N_4),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_N_4),HL CALL AUTO_1D97 LD HL,AUTO_2779 CALL PRINT_L @@ -1957,30 +1957,30 @@ AUTO_161D: CP 'Y' JR NZ,AUTO_161D CALL AUTO_1D9F - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) AUTO_162A: OR A CALL NZ,AUTO_14F0 POP HL POP BC - LD DE,(FL_N_6) + LD DE,(ZX_VARS.FL_N_6) LD B,C CALL AUTO_14E4 CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_N_6),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_N_6),HL JP AUTO_15B8 AUTO_1644: - LD (FL_TYPE),HL + LD (ZX_VARS.FL_TYPE),HL PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD C,(HL) LD B,0 POP HL XOR A JP AUTO_15F8 CALL AUTO_165D - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP 1 RET AUTO_165C: @@ -2002,10 +2002,10 @@ AUTO_166B: JR AUTO_165E AUTO_166F: LD A,255 - LD (BAS_DOS_FLG),A + LD (ZX_VARS.BAS_DOS_FLG),A CALL AUTO_1680 - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL JP AUTO_1E23 AUTO_1680: RST_ROM ROUTINE.free_mem @@ -2017,18 +2017,18 @@ AUTO_1680: LD A,17 AUTO_168F: DEC A - LD (L_5D23),A + LD (ZX_VARS.L_5D23),A LD B,A LD C,0 RET ; - LD (MED_START),HL - LD (MED_LEN),HL - LD DE,(FL_SIZE) - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.MED_LEN),HL + LD DE,(ZX_VARS.FL_SIZE) + LD HL,(ZX_VARS.DOS_CH_ADR) LD D,0 ADD HL,DE - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL RET ; ; @@ -2038,29 +2038,29 @@ CMD_MOVE: JP NZ,AUTO_1775 CALL SINTAX_RET CALL AUTO_166F - LD HL,(VAR_1) - LD (FL_N_4),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.FL_N_4),HL LD DE,0900h ADD HL,DE - LD (VAR_1),HL - LD A,(L_5D23) + LD (ZX_VARS.VAR_1),HL + LD A,(ZX_VARS.L_5D23) SUB 9 - LD (L_5D23),A - LD HL,(FL_N_4) + LD (ZX_VARS.L_5D23),A + LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 CALL READ_DISK - LD HL,(FL_N_4) - LD (FL_N_2),HL + LD HL,(ZX_VARS.FL_N_4) + LD (ZX_VARS.FL_N_2),HL LD HL,AUTO_0100 - LD (MED_START),HL - LD (FL_NAME),HL + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.FL_NAME),HL XOR A - LD (FL_N_6),HL - LD (FL_N_7),A + LD (ZX_VARS.FL_N_6),HL + LD (ZX_VARS.FL_N_7),A CALL MOVE_X00 - LD DE,(FL_N_4) - LD HL,(FL_N_2) + LD DE,(ZX_VARS.FL_N_4) + LD HL,(ZX_VARS.FL_N_2) EX DE,HL LD BC,WG93_EXE_ ADD HL,BC @@ -2075,13 +2075,13 @@ CMD_MOVE: INC DE LD (HL),0 LDIR - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) LD DE,08E1h ADD HL,DE LD E,(HL) INC HL LD D,(HL) - LD BC,(MED_START) + LD BC,(ZX_VARS.MED_START) LD (HL),B DEC HL LD (HL),C @@ -2104,8 +2104,8 @@ CMD_MOVE: ADD A,L LD L,A ADD HL,BC - LD BC,(MED_START) - LD (MED_START),HL + LD BC,(ZX_VARS.MED_START) + LD (ZX_VARS.MED_START),HL LD L,B LD H,0 ADD HL,HL @@ -2117,7 +2117,7 @@ CMD_MOVE: ADD A,L LD C,A LD B,H - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) AND A SBC HL,BC EX DE,HL @@ -2125,20 +2125,20 @@ CMD_MOVE: DEC HL LD (HL),E DEC HL - LD A,(FL_N_6) + LD A,(ZX_VARS.FL_N_6) LD (HL),A LD DE,RST10 ADD HL,DE LD (HL),0 - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 CALL WRITE_DISK - LD A,(L_5D23) + LD A,(ZX_VARS.L_5D23) ADD A,9 LD B,A LD C,0 - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) CALL AUTO_1E2E JP AUTO_03E1 AUTO_1775: @@ -2146,8 +2146,8 @@ AUTO_1775: CALL SINTAX_RET CALL AUTO_1C57 CALL AUTO_03FD - LD HL,FL_NAME - LD DE,DISK_NAME + LD HL,ZX_VARS.FL_NAME + LD DE,ZX_VARS.DISK_NAME LD BC,RST08 LDIR CALL AUTO_1E43 @@ -2172,44 +2172,44 @@ AUTO_1775: RST R38 RST R38 AUTO_17A5: - LD A,(AUTO_5CD3) + LD A,(ZX_VARS.AUTO_5CD3) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_17DD - LD A,(AUTO_5CD3) + LD A,(ZX_VARS.AUTO_5CD3) LD B,A XOR A - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A AUTO_17BA: PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(AUTO_5CD5) + LD DE,(ZX_VARS.AUTO_5CD5) CALL READ_DISK - LD HL,(CONT_SEC) - LD (AUTO_5CD5),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.AUTO_5CD5),HL POP HL POP BC - LD DE,(MED_START) + LD DE,(ZX_VARS.MED_START) CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (MED_START),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.MED_START),HL JR AUTO_17A5 AUTO_17DD: - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A JR AUTO_17BA AUTO_17E9: PUSH AF - LD HL,CAT_SEC + LD HL,ZX_VARS.CAT_SEC LD (HL),0 LD A,C AUTO_17F0: @@ -2225,7 +2225,7 @@ AUTO_17F7: POP BC POP AF CALL AUTO_1CA4 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 OR A JR Z,AUTO_180D @@ -2239,7 +2239,7 @@ AUTO_180D: ; CMD_VERIFY: LD A,255 - LD (DISK_2_FLG),A + LD (ZX_VARS.DISK_2_FLG),A ; ; ; @@ -2249,11 +2249,11 @@ AUTO_1818: CALL AUTO_1836 CALL SINTAX_RET LD A,255 - LD (ERR_3D00),A - LD A,(DISK_2_FLG) + LD (ZX_VARS.ERR_3D00),A + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP Z,AUTO_03E1 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP Z,AUTO_012A JP AUTO_03E1 @@ -2263,34 +2263,34 @@ AUTO_1836: CALL AUTO_18AB JP AUTO_1921 AUTO_1842: - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) INC HL LD A,(HL) CP 13 RET Z LD A,1 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A CALL AUTO_1DEB AUTO_1852: XOR A - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A RET AUTO_1857: CALL AUTO_102E LD A,'B' CP B JR NZ,AUTO_1866 - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) DEC HL - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL AUTO_1866: CALL AUTO_1DEB - LD HL,(DOS_CH_ADR) - LD (MED_START),HL - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_187A: CALL TEST_CR @@ -2316,21 +2316,21 @@ AUTO_18A4: AUTO_18AB: CALL TYPE_FL_X00 OR A - LD HL,(FL_START) + LD HL,(ZX_VARS.FL_START) JR Z,AUTO_18B7 - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) AUTO_18B7: - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CP 3 - LD A,(FL_SIZE) + LD A,(ZX_VARS.FL_SIZE) PUSH DE - LD DE,(FL_LEN) + LD DE,(ZX_VARS.FL_LEN) JR NZ,AUTO_18CB - LD DE,(MED_LEN) + LD DE,(ZX_VARS.MED_LEN) AUTO_18CB: LD B,A - LD (MED_LEN),DE - LD A,(FL_TYPE) + LD (ZX_VARS.MED_LEN),DE + LD A,(ZX_VARS.FL_TYPE) CP 'C' LD A,B JR NZ,AUTO_18FD @@ -2341,15 +2341,15 @@ AUTO_18CB: CP D LD A,B JR Z,AUTO_18F6 - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) CP 3 LD A,B JR Z,AUTO_18F6 XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A LD D,B LD E,0 - LD (MED_LEN),DE + LD (ZX_VARS.MED_LEN),DE JR AUTO_18F9 AUTO_18F6: CALL AUTO_191B @@ -2358,7 +2358,7 @@ AUTO_18F9: CALL AUTO_1EAC AUTO_18FD: LD B,A - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'C' POP DE RET Z @@ -2370,13 +2370,13 @@ AUTO_18FD: CP 'D' CALL Z,AUTO_1A4C CALL AUTO_191B - LD A,(MED_LEN+1) + LD A,(ZX_VARS.MED_LEN+1) LD B,A POP DE RET AUTO_191B: LD A,3 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_1921: CALL AUTO_0572 @@ -2392,47 +2392,47 @@ AUTO_192D: JR Z,AUTO_1937 JP WRITE_DISK AUTO_1937: - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) CP 3 CALL Z,AUTO_1946 - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) DEC HL LD (HL),128 RET AUTO_1946: - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP NZ,AUTO_2FDE - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) OR A RET Z LD C,A LD B,1 - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) JR AUTO_196A AUTO_195C: - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP NZ,READ_DISK - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE LD C,0 AUTO_196A: LD A,B OR A RET Z - LD (MED_START),HL - LD (DOS_CH_ADR),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),DE AUTO_1974: PUSH BC LD B,1 - LD DE,(DOS_CH_ADR) - LD HL,BUFER + LD DE,(ZX_VARS.DOS_CH_ADR) + LD HL,ZX_VARS.BUFFER CALL READ_DISK - LD HL,(CONT_SEC) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.DOS_CH_ADR),HL POP BC - LD HL,(MED_START) - LD DE,BUFER + LD HL,(ZX_VARS.MED_START) + LD DE,ZX_VARS.BUFFER AUTO_198E: LD A,(DE) CP (HL) @@ -2441,7 +2441,7 @@ AUTO_198E: INC DE DEC C JR NZ,AUTO_198E - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL DJNZ AUTO_1974 RET AUTO_199D: @@ -2460,21 +2460,21 @@ CMD_PEEK: CMD_POKE: LD A,238 AUTO_19AB: - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A JP AUTO_1818 ; ; ; CMD_MERGE: LD A,255 - LD (FL_NUMBER+1),A + LD (ZX_VARS.FL_NUMBER+1),A CALL AUTO_187A CALL SINTAX_RET - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP NZ,CMD_ERROR - LD BC,(FL_START) - LD (MED_LEN),BC + LD BC,(ZX_VARS.FL_START) + LD (ZX_VARS.MED_LEN),BC PUSH BC INC BC RST_ROM ROUTINE.bc_spaces @@ -2483,14 +2483,14 @@ AUTO_19D1: EX DE,HL POP DE PUSH HL - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL AUTO_191B - LD A,(MED_LEN+1) + LD A,(ZX_VARS.MED_LEN+1) LD B,A CALL AUTO_1852 CALL AUTO_1921 POP HL - LD DE,(BAS_PROG) + LD DE,(ZX_VARS.BAS_PROG) RST_ROM ROUTINE.me_new_lp JP AUTO_03E1 AUTO_19F2: @@ -2506,25 +2506,25 @@ AUTO_19FD: RST_ROM ROUTINE.test_room RET AUTO_1A01: - LD DE,(BAS_PROG) - LD HL,(E_LINE) + LD DE,(ZX_VARS.BAS_PROG) + LD HL,(ZX_VARS.E_LINE) DEC HL PUSH HL PUSH DE SBC HL,DE - LD DE,(FL_START) + LD DE,(ZX_VARS.FL_START) PUSH DE PUSH HL LD HL,0 - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JR Z,AUTO_1A20 LD HL,5 AUTO_1A20: ADD HL,DE - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JR NZ,AUTO_1A31 POP DE @@ -2541,46 +2541,46 @@ AUTO_1A31: POP BC CALL AUTO_1E32 INC HL - LD BC,(FL_LEN) + LD BC,(ZX_VARS.FL_LEN) ADD HL,BC - LD (BAS_VARS),HL + LD (ZX_VARS.BAS_VARS),HL AUTO_1A48: - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) RET AUTO_1A4C: - LD DE,(FL_LEN) - LD (MED_LEN),DE - LD HL,(MED_START) - LD A,(DISK_2_FLG) + LD DE,(ZX_VARS.FL_LEN) + LD (ZX_VARS.MED_LEN),DE + LD HL,(ZX_VARS.MED_START) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 RET Z - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) PUSH HL CALL AUTO_19F2 POP HL LD A,H OR L JR Z,AUTO_1A79 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) DEC HL DEC HL DEC HL - LD BC,(DOS_CH_ADR) + LD BC,(ZX_VARS.DOS_CH_ADR) INC BC INC BC INC BC CALL AUTO_1E2E AUTO_1A79: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) DEC HL - LD BC,(FL_LEN) + LD BC,(ZX_VARS.FL_LEN) PUSH BC INC BC INC BC INC BC CALL AUTO_1E32 INC HL - LD A,(AUTO_5CD2) + LD A,(ZX_VARS.AUTO_5CD2) LD (HL),A INC HL POP DE @@ -2590,7 +2590,7 @@ AUTO_1A79: INC HL RET AUTO_1A94: - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD C,B LD B,A LD A,C @@ -2612,7 +2612,7 @@ AUTO_1AAE: DJNZ AUTO_1AA7 AUTO_1AB0: LD B,1 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) RET AUTO_1AB6: LD HL,AUTO_29ED @@ -2623,7 +2623,7 @@ AUTO_1ABE: CALL Z,SET_7_TYPE AUTO_1AC4: CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_2723 RET @@ -2633,7 +2633,7 @@ AUTO_1AC4: CMD_SAVE: CALL AUTO_1852 LD HL,0 - LD (AUTO_5CD1),HL + LD (ZX_VARS.AUTO_5CD1),HL CALL INPUT_TXT CALL AUTO_1D8C CP 175 @@ -2642,9 +2642,9 @@ CMD_SAVE: JR NZ,AUTO_1AF8 CALL AUTO_1E0B CALL SINTAX_RET - LD HL,(MED_LEN) - LD (AUTO_5CD1),HL - LD HL,FL_TYPE + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.AUTO_5CD1),HL + LD HL,ZX_VARS.FL_TYPE JR AUTO_1B1F AUTO_1AF8: CP 170 @@ -2655,13 +2655,13 @@ AUTO_1B00: RST RST10 LD E,H LD HL,AUTO_1B00 - LD (DOS_CH_ADR),HL - LD (MED_LEN),HL + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.MED_LEN),HL JR AUTO_1B48 AUTO_1B0D: CALL SINTAX_RET CALL AUTO_1D8C - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE CP 228 JR Z,AUTO_1B2C CP 13 @@ -2681,23 +2681,23 @@ AUTO_1B2C: JP C,CMD_ERROR AUTO_1B39: CALL AUTO_1DE5 - LD HL,(DOS_CH_ADR) - LD (MED_START),HL - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL AUTO_1B48: CALL SINTAX_RET LD A,'C' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A CALL AUTO_1ABE AUTO_1B53: CALL OWERWR_X01 JP AUTO_0569 AUTO_1B59: - LD HL,(MED_START) - LD (FL_START),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_START),HL EX DE,HL - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,L OR H JP Z,CMD_ERROR @@ -2707,7 +2707,7 @@ AUTO_1B59: INC H AUTO_1B6D: LD A,H - LD (FL_SIZE),A + LD (ZX_VARS.FL_SIZE),A LD E,A LD D,0 DB 42,10 @@ -2716,32 +2716,32 @@ AUTO_1B76: SBC HL,DE JP C,AUTO_1C45 PUSH HL - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),170 INC HL - LD DE,(AUTO_5CD1) + LD DE,(ZX_VARS.AUTO_5CD1) LD (HL),E INC HL LD (HL),D - LD HL,(MED_LEN) - LD (FL_LEN),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.FL_LEN),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL EX DE,HL - LD HL,(FL_START) - LD A,(FL_SIZE) + LD HL,(ZX_VARS.FL_START) + LD A,(ZX_VARS.FL_SIZE) LD B,A CALL WRITE_DISK - LD HL,(CONT_SEC) + LD HL,(ZX_VARS.CONT_SEC) PUSH HL CALL AUTO_03FD POP HL - LD (CLEAR_SEC),HL + LD (ZX_VARS.CLEAR_SEC),HL POP HL - LD (FREE_SEC),HL - LD HL,N_FILES + LD (ZX_VARS.FREE_SEC),HL + LD HL,ZX_VARS.N_FILES LD A,(HL) - LD (FL_NUMBER),A + LD (ZX_VARS.FL_NUMBER),A INC (HL) PUSH HL CALL AUTO_1E43 @@ -2749,40 +2749,40 @@ AUTO_1B76: LD C,(HL) DEC C AUTO_1BBF: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' CALL Z,AUTO_1BC8 RET AUTO_1BC8: - LD HL,(E_LINE) - LD DE,(BAS_PROG) + LD HL,(ZX_VARS.E_LINE) + LD DE,(ZX_VARS.BAS_PROG) SCF SBC HL,DE - LD (FL_START),HL - LD HL,(BAS_VARS) + LD (ZX_VARS.FL_START),HL + LD HL,(ZX_VARS.BAS_VARS) SBC HL,DE - LD (FL_LEN),HL + LD (ZX_VARS.FL_LEN),HL RET AUTO_1BDE: - LD HL,(BAS_VARS) - LD DE,(BAS_PROG) + LD HL,(ZX_VARS.BAS_VARS) + LD DE,(ZX_VARS.BAS_PROG) SBC HL,DE - LD (MED_LEN),HL - LD HL,(BAS_PROG) - LD (MED_START),HL - LD HL,(E_LINE) + LD (ZX_VARS.MED_LEN),HL + LD HL,(ZX_VARS.BAS_PROG) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.E_LINE) INC HL INC HL INC HL SBC HL,DE - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL RET AUTO_1BFC: CALL AUTO_1C1B RET NC LD HL,0 - LD (DOS_CH_ADR),HL - LD A,(DISK_2_FLG) + LD (ZX_VARS.DOS_CH_ADR),HL + LD A,(ZX_VARS.DISK_2_FLG) CP 255 RET NZ JP AUTO_1C13 @@ -2798,7 +2798,7 @@ AUTO_1C1B: CALL AUTO_1D9B SET 7,C LD A,C - LD (AUTO_5CD2),A + LD (ZX_VARS.AUTO_5CD2),A JR NC,AUTO_1C2B AUTO_1C29: SCF @@ -2810,9 +2810,9 @@ AUTO_1C2B: INC HL LD D,(HL) INC HL - LD (MED_START),HL - LD (MED_LEN),DE - LD (DOS_CH_ADR),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.MED_LEN),DE + LD (ZX_VARS.DOS_CH_ADR),DE CALL BASIC_RST20 CP ')' JR NZ,AUTO_1C2B @@ -2828,7 +2828,7 @@ AUTO_1C50: LD A,2 JR AUTO_1C4A AUTO_1C57: - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD B,8 AUTO_1C5C: LD (HL),' ' @@ -2847,7 +2847,7 @@ AUTO_1C73: LD A,(HL) CP ' ' JP C,CMD_ERROR - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME PUSH BC LDIR POP BC @@ -2874,7 +2874,7 @@ SET_DRIVE: RET AUTO_1C98: DEC HL - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) PUSH BC PUSH HL @@ -2889,7 +2889,7 @@ AUTO_1CA4: ADD HL,HL ADD HL,HL ADD HL,HL - LD BC,BUFER + LD BC,ZX_VARS.BUFFER ADD HL,BC RET AUTO_1CB0: @@ -2911,8 +2911,8 @@ AUTO_1CBA: LD C,0 JR AUTO_1CBA AUTO_1CCD: - LD DE,FL_NAME - LD A,(S_NAME_NUM) + LD DE,ZX_VARS.FL_NAME + LD A,(ZX_VARS.S_NAME_NUM) LD B,A XOR A CP (HL) @@ -2932,12 +2932,12 @@ AUTO_1CE7: LD A,128 SUB B LD C,A - LD (FL_NUMBER),A + LD (ZX_VARS.FL_NUMBER),A XOR A RET Z AUTO_1CF0: CALL AUTO_1CB3 - LD HL,DOS_ERR_2 + LD HL,ZX_VARS.DOS_ERR_2 LD (HL),C RET Z LD (HL),255 @@ -2950,21 +2950,21 @@ CMD_RETURN: CALL AUTO_20E5 RES 3,(IY+1) CALL AUTO_0232 - LD SP,(DOS_SP) - LD HL,(ERR_SP) + LD SP,(ZX_VARS.DOS_SP) + LD HL,(ZX_VARS.ERR_SP) DEC HL LD A,18 CP (HL) JR NZ,AUTO_1D19 DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL AUTO_1D19: RET CMD_ERROR: BIT 7,(IY+0) JR Z,AUTO_1D25 LD A,11 - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A AUTO_1D25: INC A LD HL,AUTO_29B2 @@ -2972,7 +2972,7 @@ ERR_EXIT: CALL AUTO_03C3 JP AUTO_01D3 AUTO_1D2F: - LD A,(ERR_NR) + LD A,(ZX_VARS.ERR_NR) LD HL,AUTO_27CA CP 20 JR Z,ERR_EXIT @@ -2992,14 +2992,14 @@ CMD_RUN: CALL AUTO_1852 CALL AUTO_1836 CALL SINTAX_RET - LD HL,(FL_START) - LD A,(FL_TYPE) + LD HL,(ZX_VARS.FL_START) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP Z,AUTO_012A PUSH HL RET AUTO_1D63: - LD HL,BAS_DOS_FLG + LD HL,ZX_VARS.BAS_DOS_FLG LD A,(HL) CP #FF LD (HL),0 @@ -3069,10 +3069,10 @@ AUTO_1DC1: RST_ROM ROUTINE.expt_1num RET AUTO_1DC5: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) AUTO_1DC8: INC HL - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL RET AUTO_1DCD: CALL INPUT_TXT @@ -3094,8 +3094,8 @@ AUTO_1DEB: CALL AUTO_1D7B JR Z,AUTO_1DFB CALL AUTO_1DB9 - LD (DOS_CH_ADR),BC - LD (MED_LEN),BC + LD (ZX_VARS.DOS_CH_ADR),BC + LD (ZX_VARS.MED_LEN),BC AUTO_1DFB: CALL AUTO_1D8C CP ',' @@ -3108,16 +3108,16 @@ AUTO_1E0B: CALL AUTO_1D7B RET Z CALL AUTO_1DB9 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC LD A,3 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_1E1C: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) RST_ROM ROUTINE.remove_fp RET AUTO_1E23: - LD HL,(WORK_SP) + LD HL,(ZX_VARS.WORK_SPACE) RST_ROM ROUTINE.bc_spaces AUTO_1E29: RET @@ -3134,7 +3134,7 @@ AUTO_1E32: READ_TRK_NUM: CALL READ_ADR_LABL LD A,H - OUT (WG_TRK),A + OUT (FDC_93.Track),A RET READ_DISK: XOR A @@ -3142,10 +3142,10 @@ READ_DISK: AUTO_1E40: CALL AUTO_166B AUTO_1E43: - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) DEC DE LD B,1 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER WRITE_DISK: PUSH HL PUSH DE @@ -3162,9 +3162,9 @@ AUTO_1E60: AUTO_1E62: LD A,255 AUTO_1E64: - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A AUTO_1E67: - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE JP R_W_REDIR ;LD (HL),30 ; НЕ исп. !!! @@ -3179,11 +3179,11 @@ AUTO_1E75: PUSH BC PUSH HL CALL save_bufer - LD A,(CONT_SEC) + LD A,(ZX_VARS.CONT_SEC) CALL save_sector - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) OR A PUSH AF CALL Z,AUTO_3F0E @@ -3194,12 +3194,12 @@ AUTO_1E75: ADD HL,DE PUSH HL LD A,16 - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC INC (HL) CP (HL) JR NZ,AUTO_1EA7 LD (HL),0 - LD HL,CONT_TRK + LD HL,ZX_VARS.CONT_TRK INC (HL) AUTO_1EA7: POP HL @@ -3221,7 +3221,7 @@ AUTO_1EAC: RET AUTO_1EBC: XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A SCF RET ; @@ -3229,9 +3229,9 @@ AUTO_1EBC: ; CMD_FORMAT: LD HL,0 - LD (MED_START),HL - LD (DOS_CH_ADR),HL - LD (AUTO_5CD1),HL + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.AUTO_5CD1),HL CALL TEST_CR JP Z,CMD_ERROR ; FORMATER ; !!!!! ( CMD_ERROR ) CALL FORM_STATE ; 1/2/3 INPUT_TXT @@ -3244,7 +3244,7 @@ AUTO_1EE0: JR Z,AUTO_1EE8 LD A,'P' AUTO_1EE8: - LD (MED_START),A + LD (ZX_VARS.MED_START),A CALL AUTO_3D98 CALL set_side_1 CALL pause_750ms @@ -3253,7 +3253,7 @@ AUTO_1EE8: CALL set_side_0 LD E,0 CALL AUTO_1FFD - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '$' JR Z,AUTO_1F1B CALL set_side_1 @@ -3263,16 +3263,16 @@ AUTO_1EE8: CP 1 JR NZ,AUTO_1F1B LD A,128 - LD (DOS_CH_ADR+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A AUTO_1F1B: CALL FORM_X02 ; форматирование !!! - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD (HL),0 - LD DE,BUFER+1 + LD DE,ZX_VARS.BUFFER+1 LD BC,0FFh LDIR - LD BC,MED_START - LD DE,DOS_CH_ADR+1 + LD BC,ZX_VARS.MED_START + LD DE,ZX_VARS.DOS_CH_ADR+1 LD A,(BC) CP 'P' JR Z,AUTO_1F49 @@ -3295,37 +3295,37 @@ AUTO_1F49: LD A,22 LD HL,09F0h AUTO_1F55: - LD (TYPE_DISK),A - LD (FREE_SEC),HL + LD (ZX_VARS.TYPE_DISK),A + LD (ZX_VARS.FREE_SEC),HL LD A,1 - LD (CLEAR_TRK),A + LD (ZX_VARS.CLEAR_TRK),A LD A,16 - LD (CODE_10H),A - LD HL,DISK_MRK_1 - LD DE,DISK_ALT_NM + LD (ZX_VARS.CODE_10H),A + LD HL,ZX_VARS.DISK_MRK_1 + LD DE,ZX_VARS.DISK_ALT_NM LD BC,RST08 LD (HL),' ' LDIR - LD HL,FL_NAME - LD DE,DISK_NAME + LD HL,ZX_VARS.FL_NAME + LD DE,ZX_VARS.DISK_NAME LD BC,RST08 LDIR CALL set_side_0 LD B,1 LD DE,8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER CALL AUTO_1E62 - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) PUSH AF XOR A - LD (FL_TYPE),A - LD HL,(FREE_SEC) - LD (MED_START),HL - LD HL,FL_NAME + LD (ZX_VARS.FL_TYPE),A + LD HL,(ZX_VARS.FREE_SEC) + LD (ZX_VARS.MED_START),HL + LD HL,ZX_VARS.FL_NAME RST PRINT_LN LD A,13 RST RST10 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) POP AF PUSH HL LD D,0 @@ -3350,31 +3350,31 @@ test_d_traks: LD A,2 CALL Goto_trk CALL pause_50ms - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 LD A,'P' JR Z,AUTO_1FE7 LD A,'(' AUTO_1FE7: - LD (MED_START),A + LD (ZX_VARS.MED_START),A RET set_side_0: - LD A,(PDOS_COPY) - OR '<' ; 3C - сторона 0 3C..3F + LD A,(ZX_VARS.PDOS_COPY) + OR #3C ; сторона 0 3C..3F AUTO_1FF0: - LD (PDOS_COPY),A - OUT (P_DOS_FF),A + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A RET set_side_1: - LD A,(PDOS_COPY) - AND 'o' ; 06Fh - сторона 1 2C..2F + LD A,(ZX_VARS.PDOS_COPY) + AND #6F ; сторона 1 2C..2F JR AUTO_1FF0 ; ld a,(pdos_copy) AUTO_1FFD: ; add a,0C0h DI ; ld d,0 LD A,244 ; rl d AUTO_2000: ; - OUT (WG_COM),A ; - LD HL,(FL_START) ; + OUT (FDC_93.Command),A ; + LD HL,(ZX_VARS.FL_START) ; LD C,127 @@ -3426,13 +3426,13 @@ FORM_TR_LOOP: INC HL CP 16 ; проверка на посл. сектор JR NZ,FORM_TR_LOOP ; если нет, то продолжать - IN A,(WG_COM) + IN A,(FDC_93.Command) AND '@' JP NZ,AUTO_3F39 LD A,216 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A ;////////////////////////////////////// @@ -3440,30 +3440,30 @@ FORM_TR_LOOP: NOP NOP AUTO_207D: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) OR A RET NZ LD C,127 LD A,E - OUT (WG_TRK),A + OUT (FDC_93.Track),A CALL SUB_HL_14 AUTO_208A: LD B,3 LD A,(HL) - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL AUTO_2090: DI LD A,128 - OUT (WG_COM),A + OUT (FDC_93.Command),A PUSH BC CALL AUTO_3FE5 - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 POP BC JR Z,AUTO_20A6 DJNZ AUTO_2090 - LD HL,DOS_ERROR + LD HL,ZX_VARS.DOS_ERROR INC (HL) AUTO_20A6: POP HL @@ -3476,7 +3476,7 @@ AUTO_20A6: AUTO_20AF: LD B,1 AUTO_20B1: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_20B1 RET M @@ -3485,7 +3485,7 @@ AUTO_20B1: RET FORMAT_ALL: - LD HL,MED_START + LD HL,ZX_VARS.MED_START LD B,(HL) CALL FORM_F01 LD E,255 @@ -3497,7 +3497,7 @@ AUTO_20C6: CALL PRINT_TRK CALL set_side_0 ; SET SIDE 0 CALL PRINT_SIDE0 ; FORMATING ! - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) CP 128 JR NZ,AUTO_20E1 CALL set_side_1 ; SET SIDE 1 @@ -3509,25 +3509,25 @@ AUTO_20E1: AUTO_20E5: PUSH AF - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CP 255 JR Z,AUTO_211C POP AF CALL BUFER_OFF xchg_intf1: PUSH AF - LD A,(BEG_ADRESS) + LD A,(ZX_VARS.BEG_ADRESS) CP 244 JR Z,AUTO_211C XOR A - LD HL,INT_1_VAR + LD HL,ZX_VARS.INT_1_VAR OR (HL) LD (HL),255 JR Z,AUTO_211C - LD A,(BUF_FLAG) + LD A,(ZX_VARS.BUF_FLAG) OR A - LD HL,AUTO_5CC3 - LD DE,AUTO_5D33 + LD HL,ZX_VARS.AUTO_5CC3 + LD DE,ZX_VARS.AUTO_5D33 JR NZ,AUTO_2111 LD DE,AUTO_5E34 AUTO_2111: @@ -3547,29 +3547,29 @@ AUTO_211C: RET AUTO_211E: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),13 - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL INC HL LD (HL),128 RET AUTO_212A: - LD DE,(E_LINE) - LD HL,COM_LN_COPY + LD DE,(ZX_VARS.E_LINE) + LD HL,ZX_VARS.COM_LN_COPY CALL AUTO_02B0 RET INPUT_LINE: - LD A,(DOS_ERR_2) + LD A,(ZX_VARS.DOS_ERR_2) OR A PUSH AF CALL NZ,AUTO_212A POP AF CALL Z,AUTO_211E - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) CALL PRINT_CR - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) ADD A,'A' RST RST10 LD A,'>' @@ -3582,25 +3582,25 @@ AUTO_2158: CALL AUTO_1D8C CP ',' JP NZ,CMD_ERROR - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_1E0B CALL SINTAX_RET - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) LD A,H OR A JP NZ,CMD_ERROR INC HL - LD (MED_START),HL - LD HL,(DOS_CH_ADR) - LD (MED_LEN),HL + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_LEN),HL RET ; ; ; CMD_OPEN: - LD HL,(ADR_DOS_COM) - LD (CH_ADR),HL + LD HL,(ZX_VARS.ADR_DOS_COM) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL AUTO_1DD0 AUTO_218E: @@ -3621,12 +3621,12 @@ AUTO_219A: CP 'W' JP NZ,CMD_ERROR AUTO_21AE: - LD (VAR_3),A + LD (ZX_VARS.VAR_3),A CALL SINTAX_RET LD A,'#' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A LD A,0 - LD (FL_START),A + LD (ZX_VARS.FL_START),A CALL AUTO_21DB PUSH AF CALL AUTO_220F @@ -3635,28 +3635,28 @@ AUTO_21AE: CALL NZ,AUTO_2288 POP AF CALL AUTO_2242 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0124 ADD HL,BC - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL JP AUTO_01D3 AUTO_21DB: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_1CB0 PUSH AF CALL RD_HEAD_DSK POP AF JR NZ,AUTO_2206 - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' JR Z,AUTO_2201 AUTO_21F1: - LD HL,FL_START + LD HL,ZX_VARS.FL_START INC (HL) CALL AUTO_1CB3 JR Z,AUTO_21F1 - LD HL,FL_START + LD HL,ZX_VARS.FL_START DEC (HL) CALL AUTO_1CB3 AUTO_2201: @@ -3664,12 +3664,12 @@ AUTO_2201: XOR A RET AUTO_2206: - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' RET NZ JP AUTO_03D9 AUTO_220F: - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) RST_ROM ROUTINE.str_data1 LD A,B OR C @@ -3677,7 +3677,7 @@ AUTO_220F: RET AUTO_221B: LD A,25 - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A LD HL,AUTO_2804 LD A,10 AUTO_2225: @@ -3690,7 +3690,7 @@ AUTO_222F: PUSH HL LD C,' ' RST RST28 - LD A,(MED_START) + LD A,(ZX_VARS.MED_START) LD (HL),A INC HL XOR A @@ -3706,19 +3706,19 @@ AUTO_2242: PUSH AF CALL AUTO_220F EX DE,HL - LD HL,(BAS_PROG) - LD BC,(CHANS) + LD HL,(ZX_VARS.BAS_PROG) + LD BC,(ZX_VARS.CHANS) SBC HL,BC EX DE,HL LD (HL),E INC HL LD (HL),D CALL AUTO_22B2 - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 165 CALL Z,AUTO_222F JR Z,AUTO_226B - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' LD A,255 JR NZ,AUTO_226B @@ -3744,27 +3744,27 @@ AUTO_2270: CALL Z,READ_DISK RET AUTO_2288: - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) PUSH HL LD HL,AUTO_2000 - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL CALL AUTO_229A POP HL - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL RET AUTO_229A: LD HL,AUTO_1000 - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_1AC4 CALL AUTO_1B59 LD HL,0 - LD (FL_LEN),HL + LD (ZX_VARS.FL_LEN),HL CALL AUTO_166B JP AUTO_1E43 AUTO_22B2: - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) DEC HL - LD (CUR_CHL),HL + LD (ZX_VARS.CUR_CHL),HL PUSH HL LD BC,AUTO_0124 CALL AUTO_1E32 @@ -3796,23 +3796,23 @@ AUTO_22C4: INC HL LD (HL),1 INC HL - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD (HL),A INC HL - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A INC HL - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' LD (HL),0 JR Z,AUTO_22FC - LD A,(FL_LEN) + LD A,(ZX_VARS.FL_LEN) LD (HL),A AUTO_22FC: INC HL LD (HL),B JR Z,AUTO_2304 - LD A,(FL_LEN+1) + LD A,(ZX_VARS.FL_LEN+1) LD (HL),A AUTO_2304: INC HL @@ -3822,7 +3822,7 @@ AUTO_2304: LD DE,RST10 ADD HL,DE EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR POP HL @@ -3839,7 +3839,7 @@ AUTO_2321: LD C,'$' RST28_EXE: LD B,0 - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) ADD HL,BC RET AUTO_232A: @@ -3866,7 +3866,7 @@ AUTO_232A: CP 127 POP HL JR Z,AUTO_2358 - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) CALL AUTO_26E1 LD C,14 RST RST28 @@ -3889,24 +3889,24 @@ AUTO_2367: RET AUTO_2370: CALL AUTO_2367 - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE JR AUTO_2381 AUTO_2379: CALL AUTO_2367 INC E - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE AUTO_2381: CALL AUTO_229A CALL BUFER_OFF LD C,16 RST RST28 EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR LD C,12 RST RST28 - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A RET AUTO_239B: @@ -3951,7 +3951,7 @@ AUTO_23CF: INC (HL) LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_1CB3 @@ -3961,12 +3961,12 @@ AUTO_23E4: LD C,16 RST RST28 EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR LD C,12 RST RST28 - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A XOR A RET @@ -3994,7 +3994,7 @@ AUTO_2418: LD B,1 JP READ_DISK AUTO_2423: - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) LD BC,AUTO_001E ADD HL,BC LD E,(HL) @@ -4025,14 +4025,14 @@ AUTO_2443: LD A,(HL) JP SET_DISK AUTO_244A: - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL LD HL,xchg_intf1 PUSH HL PUSH AF CALL xchg_intf1 LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A POP AF CALL AUTO_24A2 PUSH AF @@ -4057,7 +4057,7 @@ AUTO_246E: ADD HL,BC CP (HL) RET NZ - LD HL,BEG_ADRESS + LD HL,ZX_VARS.BEG_ADRESS LD A,(HL) CP 244 JR Z,AUTO_2492 @@ -4069,7 +4069,7 @@ AUTO_246E: AUTO_2492: LD A,7 AUTO_2494: - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A CALL AUTO_20E5 RST_ROM ROUTINE.error_4 RET @@ -4105,7 +4105,7 @@ AUTO_24C2: LD C,(HL) LD A,D EX DE,HL - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) ADD HL,BC CP 6 LD (HL),A @@ -4148,23 +4148,23 @@ AUTO_24F2: LD A,D RET AUTO_24F8: - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL LD BC,RST10 JP AUTO_1E23 AUTO_2504: LD (HL),13 - LD HL,(CH_ADR) - LD (MED_START),HL - LD HL,(VAR_1) - LD (CH_ADR),HL - LD HL,FLAGS + LD HL,(ZX_VARS.CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.CH_ADR),HL + LD HL,ZX_VARS.FLAGS RES 7,(HL) CALL AUTO_1DC1 - LD HL,FLAGS + LD HL,ZX_VARS.FLAGS SET 7,(HL) - LD HL,(VAR_1) - LD (CH_ADR),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1DC1 CALL AUTO_1DB9 PUSH BC @@ -4174,25 +4174,25 @@ AUTO_2504: LD B,(HL) XOR A LD HL,0 - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL AUTO_2538: ADD HL,DE JR NC,AUTO_2544 PUSH HL - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) INC HL - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL AUTO_2544: DJNZ AUTO_2538 - LD (DOS_CH_ADR),HL - LD A,(MED_LEN) - LD HL,DOS_CH_ADR+1 + LD (ZX_VARS.DOS_CH_ADR),HL + LD A,(ZX_VARS.MED_LEN) + LD HL,ZX_VARS.DOS_CH_ADR+1 RRD AND 15 - LD (MED_LEN),A - LD HL,(MED_START) - LD (CH_ADR),HL + LD (ZX_VARS.MED_LEN),A + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_2568 LD C,'!' RST RST28 @@ -4204,30 +4204,30 @@ AUTO_2544: AUTO_2568: LD C,25 RST RST28 - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) CP (HL) JP NZ,AUTO_2584 LD C,14 RST RST28 - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) CP (HL) JP NZ,AUTO_25A7 AUTO_257C: LD C,13 RST RST28 - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A RET AUTO_2584: CALL AUTO_25CA CALL NZ,AUTO_25C3 - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) LD C,25 RST RST28 LD (HL),A LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_1CB3 @@ -4238,7 +4238,7 @@ AUTO_25A7: CALL AUTO_25CA CALL NZ,AUTO_25C3 AUTO_25AD: - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) LD C,14 RST RST28 LD (HL),A @@ -4247,7 +4247,7 @@ AUTO_25AD: CALL AUTO_2418 POP HL DEC HL - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A JR AUTO_257C AUTO_25C3: @@ -4262,24 +4262,24 @@ AUTO_25CA: LD (HL),0 RET AUTO_25D2: - LD HL,(DOS_CH_ADR+1) + LD HL,(ZX_VARS.DOS_CH_ADR+1) LD H,' ' - LD (MED_START),HL - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) PUSH HL - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) PUSH HL CALL AUTO_2381 POP HL - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL JR AUTO_25AD AUTO_25EF: CALL xchg_intf1 - LD HL,TV_FLAG + LD HL,ZX_VARS.TV_FLAG RES 3,(HL) - LD HL,(ERR_SP) + LD HL,(ZX_VARS.ERR_SP) LD E,(HL) INC HL LD D,(HL) @@ -4287,15 +4287,15 @@ AUTO_25EF: LD HL,AUTO_107F SBC HL,DE JR NZ,AUTO_2626 - LD SP,(ERR_SP) + LD SP,(ZX_VARS.ERR_SP) POP DE POP DE - LD (ERR_SP),DE + LD (ZX_VARS.ERR_SP),DE AUTO_260F: CALL AUTO_262B JR C,AUTO_261D AUTO_2614: - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL LD HL,AUTO_20E5 PUSH HL @@ -4310,7 +4310,7 @@ AUTO_2626: JR AUTO_2614 AUTO_262B: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_2650 JR Z,AUTO_2642 CP 127 @@ -4339,17 +4339,17 @@ AUTO_2650: ; ; CMD_CLOSE: - LD HL,(ADR_DOS_COM) - LD (CH_ADR),HL + LD HL,(ZX_VARS.ADR_DOS_COM) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL SINTAX_RET - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) RST_ROM ROUTINE.str_data1 LD A,B OR C JP Z,AUTO_01D3 PUSH HL - LD HL,(CHANS) + LD HL,(ZX_VARS.CHANS) ADD HL,BC LD A,(HL) LD HL,AUTO_3D0E @@ -4359,20 +4359,20 @@ CMD_CLOSE: LD (HL),0 INC HL LD (HL),0 - LD (DOS_CH_ADR),BC - LD HL,(CHANS) + LD (ZX_VARS.DOS_CH_ADR),BC + LD HL,(ZX_VARS.CHANS) ADD HL,BC DEC HL - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL CALL AUTO_26CE - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) LD BC,AUTO_0124 CALL AUTO_1E2E - LD HL,REP_K_TYME + LD HL,ZX_VARS.REP_K_TYME LD B,16 AUTO_269D: PUSH BC - LD BC,(DOS_CH_ADR) + LD BC,(ZX_VARS.DOS_CH_ADR) LD E,(HL) INC HL LD D,(HL) @@ -4398,10 +4398,10 @@ AUTO_26BC: INC HL POP BC DJNZ AUTO_269D - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0124 SBC HL,BC - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL JP AUTO_01D3 AUTO_26CE: LD BC,CONT_1+6 @@ -4409,8 +4409,8 @@ AUTO_26CE: LD A,(HL) OR A RET Z - LD HL,(MED_START) - LD (CUR_CHL),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.CUR_CHL),HL CALL AUTO_26E1 JP AUTO_23FC AUTO_26E1: @@ -4426,7 +4426,7 @@ AUTO_26E1: LD (HL),D LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_2443 @@ -4467,32 +4467,32 @@ set_error_26: JR AUTO_2731 LD A,18 AUTO_2731: - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A RET LD A,3 JR AUTO_2731 AUTO_2739: XOR A - LD (MED_START+1),A - LD (DOS_ERROR),A - IN A,(WG_COM) - LD (DRV_READY),A + LD (ZX_VARS.MED_START+1),A + LD (ZX_VARS.DOS_ERROR),A + IN A,(FDC_93.Command) + LD (ZX_VARS.DRV_READY),A LD E,D PUSH DE LD A,E - OUT (WG_DATA),A + OUT (FDC_93.Data),A LD A,24 CALL WG93_EXE - LD A,(DRV_READY) + LD A,(ZX_VARS.DRV_READY) AND 128 CALL NZ,pause_750ms POP DE CALL AUTO_207D - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A RET Z LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A RET AUTO_2766: DB "O.K.",0 @@ -4528,19 +4528,19 @@ AUTO_2820: AUTO_283C: PUSH AF PUSH BC - LD (WORK_4),DE - LD (WORK_2),HL + LD (ZX_VARS.WORK_4),DE + LD (ZX_VARS.WORK_2),HL CALL xchg_intf1 LD A,255 - LD (MSG_FLAG),A - LD (FL_NUMBER+1),A + LD (ZX_VARS.MSG_FLAG),A + LD (ZX_VARS.FL_NUMBER+1),A POP BC POP AF LD HL,AUTO_0201 - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL LD HL,0 ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL @@ -4559,8 +4559,8 @@ AUTO_2869: LD HL,AUTO_01D3 PUSH HL PUSH DE - LD HL,(WORK_2) - LD DE,(WORK_4) + LD HL,(ZX_VARS.WORK_2) + LD DE,(ZX_VARS.WORK_4) RET AUTO_287F: CP 255 @@ -4635,7 +4635,7 @@ AUTO_28E0: AUTO_28E3: LD A,255 AUTO_28E5: - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 OR A JR Z,AUTO_28EF @@ -4648,18 +4648,18 @@ AUTO_28F2: CALL AUTO_1AC4 JP AUTO_1B27 AUTO_28FB: - LD (MED_START),HL - LD (DOS_CH_ADR),DE - LD (MED_LEN),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),DE + LD (ZX_VARS.MED_LEN),DE JP TYPE_FL_X02 CALL AUTO_1AC4 ; ??? JP FORM_X04 ; ??? AUTO_290F: OR A - LD (DOS_ERROR),A - LD (DOS_CH_ADR),HL - LD (MED_LEN),DE + LD (ZX_VARS.DOS_ERROR),A + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.MED_LEN),DE CALL AUTO_1CB3 CALL AUTO_18A4 CALL AUTO_18AB @@ -4693,7 +4693,7 @@ BUFER_ON: PUSH DE PUSH BC PUSH AF - LD HL,BUF_FLAG + LD HL,ZX_VARS.BUF_FLAG LD A,(HL) OR A JR Z,AUTO_2992 @@ -4704,9 +4704,9 @@ BUFER_ON: POP BC POP HL LD (HL),0 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER CALL AUTO_1E32 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0100+1 ADD HL,BC JR AUTO_298F @@ -4715,20 +4715,20 @@ BUFER_OFF: PUSH DE PUSH BC PUSH AF - LD HL,BUF_FLAG + LD HL,ZX_VARS.BUF_FLAG LD A,(HL) OR A JR NZ,AUTO_2992 LD (HL),255 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD BC,AUTO_0100+1 CALL AUTO_1E2E OR A LD BC,AUTO_0100+1 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) SBC HL,BC AUTO_298F: - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL AUTO_2992: POP AF POP BC @@ -4743,12 +4743,12 @@ CMD_40: XOR A ; ;Ошибка!!! Во-первых, почему дисковод односторонний? ; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. AUTO_2998: - LD (MED_START),A ;сохранение типа дисковода + LD (ZX_VARS.MED_START),A ;сохранение типа дисковода CALL SINTAX_RET ;если идет проверка на синтакси CALL TEST_CR ;проверка второго символа строк JP Z,CMD_ERROR ;если это ENTER, то *ERROR* CALL get_disk_type ;берем адрес ячейки с типом дис - LD A,(MED_START) ;установка типа дисковода + LD A,(ZX_VARS.MED_START) ;установка типа дисковода LD (HL),A JP AUTO_03E1 ;сообщение O.K. ; Выполнение команды "80". Установите #5D11 и #5C3B. @@ -4790,7 +4790,7 @@ AUTO_2A41: JR Z,AUTO_2A4B XOR A AUTO_2A4B: - LD (K_STATE+1),A + LD (ZX_VARS.K_STATE+1),A LD BC,PORT_128 LD A,16 OUT (C),A @@ -4817,15 +4817,15 @@ AUTO_2A56: ADD HL,SP PUSH HL LD A,3Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A LD A,'?' LD I,A - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 128 RRCA RRCA RRCA - LD (K_STATE+1),A + LD (ZX_VARS.K_STATE+1),A CALL AUTO_2F65 CALL pause_750ms CALL pause_750ms @@ -4842,7 +4842,7 @@ AUTO_2A56: CALL AUTO_2F1B LD HL,AUTO_40E3 LD A,(HL) - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A INC HL LD A,(HL) INC (HL) @@ -4867,7 +4867,7 @@ AUTO_2A56: CALL AUTO_2D4C PUSH DE LD A,3Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A CALL AUTO_2F65 LD HL,AUTO_4000 LD DE,RST08 @@ -4908,7 +4908,7 @@ AUTO_2B09: LD (HL),D LD HL,AUTO_4000 LD DE,0 - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD B,1 @@ -4943,7 +4943,7 @@ AUTO_2B58: LD A,170 LD (AUTO_4130),A LD D,5 - LD A,(K_STATE+1) + LD A,(ZX_VARS.K_STATE+1) OR D LD D,A OUT (C),D @@ -5022,7 +5022,7 @@ AUTO_2B95: LD BC,RST10 EX DE,HL LDIR - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD D,0 @@ -5127,7 +5127,7 @@ AUTO_2C7E: LD BC,RST10 EX DE,HL LDIR - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD D,0 @@ -5224,7 +5224,7 @@ AUTO_2D6F: AUTO_2D73: LD A,E INC A - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL LD D,20 PUSH DE @@ -5232,11 +5232,11 @@ AUTO_2D7B: DI LD C,127 LD A,160 - OUT (WG_COM),A + OUT (FDC_93.Command),A CALL AUTO_3FCA POP DE POP HL - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 RET Z DEC D @@ -5245,9 +5245,9 @@ AUTO_2D7B: JR NZ,AUTO_2D7B HALT AUTO_2D92: - LD HL,(FL_START) - LD DE,(FL_PLACE) - LD A,(FL_SIZE) + LD HL,(ZX_VARS.FL_START) + LD DE,(ZX_VARS.FL_PLACE) + LD A,(ZX_VARS.FL_SIZE) LD B,A CALL READ_DISK RET @@ -5266,7 +5266,7 @@ CMD_GOTO: CALL RD_HEAD_DSK CALL AUTO_1CB3 JP NZ,AUTO_03D9 - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),'8' @@ -5293,7 +5293,7 @@ AUTO_2DE3: OUT (C),A POP AF ADD A,'0' - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),A @@ -5305,7 +5305,7 @@ AUTO_2E05: POP BC DJNZ AUTO_2DE3 LD A,' ' - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),A @@ -5327,7 +5327,7 @@ AUTO_2E33: JP NZ,AUTO_03D9 CALL AUTO_165D AUTO_2E39: - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '$' DI JR NZ,AUTO_2E43 @@ -5336,11 +5336,11 @@ AUTO_2E43: LD SP,AUTO_40F0 CALL get_disk_type LD (AUTO_4010),A - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) LD (AUTO_4011),A - LD HL,(FL_START) + LD HL,(ZX_VARS.FL_START) PUSH HL - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) PUSH DE INC E LD A,E @@ -5407,7 +5407,7 @@ AUTO_2EBC: JP PO,AUTO_2ECC LD A,0 AUTO_2ECC: - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A POP AF POP HL POP DE @@ -5419,35 +5419,35 @@ AUTO_2ECC: POP HL POP DE POP BC - LD A,(BORDER) + LD A,(ZX_VARS.BORDER) AND '8' RRCA RRCA RRCA OUT (0FEH),A - LD A,(AUTO_5B08) + LD A,(ZX_VARS.AUTO_5B08) CP 238 JR NZ,AUTO_2EF7 PUSH BC LD BC,PORT_128 - LD A,(AUTO_5B5C) + LD A,(ZX_VARS.AUTO_5B5C) OUT (C),A POP BC AUTO_2EF7: - LD A,(K_STATE) + LD A,(ZX_VARS.K_STATE) OR A LD A,201 - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A JR NZ,AUTO_2F03 EI AUTO_2F03: POP AF - JP K_STATE + JP ZX_VARS.K_STATE AUTO_2F07: LD A,(AUTO_4011) OR 3Ch AUTO_2F0C: - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A RET AUTO_2F0F: LD A,C @@ -5461,7 +5461,7 @@ AUTO_2F0F: AUTO_2F1B: LD A,E INC A - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL LD D,20 PUSH DE @@ -5469,11 +5469,11 @@ AUTO_2F23: DI LD C,127 LD A,128 - OUT (WG_COM),A + OUT (FDC_93.Command),A CALL AUTO_3FE5 POP DE POP HL - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 RET Z DEC D @@ -5483,8 +5483,8 @@ AUTO_2F23: HALT AUTO_2F3A: LD A,3Ch - OUT (P_DOS_FF),A - LD A,(K_STATE) + OUT (FDC_93.DrvCTRL),A + LD A,(ZX_VARS.K_STATE) AND 8 JR NZ,AUTO_2F4F LD A,C @@ -5493,17 +5493,17 @@ AUTO_2F3A: LD C,A JR NC,AUTO_2F4F LD A,2Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A AUTO_2F4F: LD A,C AUTO_2F50: - OUT (WG_DATA),A + OUT (FDC_93.Data),A CALL pause_50ms LD A,24 AUTO_2F57: - OUT (WG_COM),A + OUT (FDC_93.Command),A AUTO_2F59: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 128 JR Z,AUTO_2F59 PUSH BC @@ -5514,7 +5514,7 @@ AUTO_2F65: LD A,8 JR AUTO_2F57 AUTO_2F69: - LD HL,(DOS_SP) + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL LD SP,HL @@ -5523,8 +5523,8 @@ AUTO_2F69: ; RST20 procedure ; RST20_EXE: - LD (WORK_2),HL - LD (WORK_4),DE + LD (ZX_VARS.WORK_2),HL + LD (ZX_VARS.WORK_4),DE POP HL LD E,(HL) INC HL @@ -5534,36 +5534,36 @@ RST20_EXE: LD HL,AUTO_3D2F PUSH HL PUSH DE - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL - LD HL,(WORK_2) - LD DE,(WORK_4) + LD HL,(ZX_VARS.WORK_2) + LD DE,(ZX_VARS.WORK_4) RET ; ; INIT DOS VARS ; AUTO_2F90: ; INIT DATA DOS LD HL,0FFFFh - LD (TIME_A),HL - LD (TIME_C),HL - LD (DISK_C),HL + LD (ZX_VARS.TIME_A),HL + LD (ZX_VARS.TIME_C),HL + LD (ZX_VARS.DISK_C),HL CALL INIT_2X80_1 ; *** !!! *** -; LD (DISK_A),HL +; LD (ZX_VARS.DISK_A),HL XOR A - LD (FLAG_BOOT),A - LD (CONT_DISK),A - LD (INT_1_VAR),A - LD (DOS_ERR_2),A - LD (FL_NUMBER+1),A + LD (ZX_VARS.FLAG_BOOT),A + LD (ZX_VARS.CONT_DISK),A + LD (ZX_VARS.INT_1_VAR),A + LD (ZX_VARS.DOS_ERR_2),A + LD (ZX_VARS.FL_NUMBER+1),A LD A,255 - OUT (P_DOS_FF),A - LD (ERR_NR),A - LD (PDOS_COPY),A - LD (BUF_FLAG),A + OUT (FDC_93.DrvCTRL),A + LD (ZX_VARS.ERR_NR),A + LD (ZX_VARS.PDOS_COPY),A + LD (ZX_VARS.BUF_FLAG),A LD A,201 - LD (RET_INS),A + LD (ZX_VARS.RET_INS),A LD A,0D0h - OUT (WG_COM),A + OUT (FDC_93.Command),A RET ; ; @@ -5582,18 +5582,18 @@ AUTO_2FC6: ; AUTO_2FD6: LD B,1 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER JP AUTO_1E67 AUTO_2FDE: PUSH HL - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) CALL AUTO_2FD6 - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) POP DE OR A RET Z LD C,A - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LDIR RET @@ -5663,27 +5663,27 @@ TRDOS_CMD: ; ; AUTO_3032: - LD HL,(E_LINE) - LD (ADR_DOS_COM),HL - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.E_LINE) + LD (ZX_VARS.ADR_DOS_COM),HL + LD (ZX_VARS.DOS_CH_ADR),HL LD A,255 - LD (DOS_ERROR),A - LD HL,MED_LEN + LD (ZX_VARS.DOS_ERROR),A + LD HL,ZX_VARS.MED_LEN JR AUTO_3054 -; LD (MED_START),HL ; 3 байта заняты списком команд +; LD (ZX_VARS.MED_START),HL ; 3 байта заняты списком команд ; nop ; nop ; nop AUTO_3048: - LD (ADR_DOS_COM),HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.ADR_DOS_COM),HL + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_30E1 RET NZ INC HL INC HL AUTO_3054: JP REDIR_LINE_CODING -; LD (MED_START),HL +; LD (ZX_VARS.MED_START),HL AUTO_3057: ; преобразование командной строки !!! CALL AUTO_30A9 ; поиск слова JR NZ,AUTO_3087 ; если нет, выход @@ -5693,7 +5693,7 @@ AUTO_3057: ; LD HL,AUTO_31C8 ADD HL,BC LD A,(HL) - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD (HL),A INC HL EX DE,HL @@ -5701,10 +5701,10 @@ AUTO_3057: ; PUSH BC RST_ROM ROUTINE.reclaim_2 POP BC - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A JR NZ,AUTO_3087 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) LD E,(HL) INC HL LD D,(HL) @@ -5716,12 +5716,12 @@ AUTO_3057: ; DEC HL LD (HL),E AUTO_3087: - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,(HL) CP 13 RET Z INC HL ; следующее слово - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL LD A,(HL) CP 13 RET Z @@ -5735,10 +5735,10 @@ AUTO_309A: CP '"' JR NZ,AUTO_309A INC HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL JR AUTO_3057 AUTO_30A9: - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD DE,AUTO_30FD LD C,0 AUTO_30B1: @@ -5766,7 +5766,7 @@ AUTO_30C8: RET Z AUTO_30CD: INC C - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) INC DE LD A,(DE) CP 255 @@ -5780,22 +5780,22 @@ AUTO_30D9: JR Z,AUTO_30D9 JR AUTO_30CD AUTO_30E1: - LD HL,(PPC) + LD HL,(ZX_VARS.PPC) INC HL INC HL LD A,H OR L JR Z,AUTO_30F4 XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A DEC HL DEC HL RST_ROM ROUTINE.line_addr RET AUTO_30F4: LD A,255 - LD (DOS_ERROR),A - LD HL,(E_LINE) + LD (ZX_VARS.DOS_ERROR),A + LD HL,(ZX_VARS.E_LINE) RET ; ; @@ -5860,37 +5860,34 @@ AUTO_31C8: ; ; ; -AUTO_31F3: BLOCK #31F3 - $,255 - LD HL,(CHANS) +AUTO_31F3: + LD HL,(ZX_VARS.CHANS) OR A - LD BC,BUFER + LD BC,ZX_VARS.BUFFER SBC HL,BC RET - RST R38 - RST R38 - RST R38 -; -; -; + + + BLOCK #3200-$,#FF INIT_2X80: JP AUTO_106E INIT_2X80_1: XOR A - LD (OPER_DISK),A - LD A,3Ch - LD (PDOS_COPY),A - OUT (P_DOS_FF),A - LD HL,8383h - LD (DISK_A),HL - LD (DISK_B),HL - LD (DISK_C),HL - LD (DISK_D),HL - LD HL,303H - LD (TIME_A),HL - LD (TIME_B),HL - LD (TIME_C),HL - LD (TIME_D),HL + LD (ZX_VARS.OPER_DISK),A + LD A,#3C + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A + LD HL,#8383 + LD (ZX_VARS.DISK_A),HL + LD (ZX_VARS.DISK_B),HL + LD (ZX_VARS.DISK_C),HL + LD (ZX_VARS.DISK_D),HL + LD HL,#0303 + LD (ZX_VARS.TIME_A),HL + LD (ZX_VARS.TIME_B),HL + LD (ZX_VARS.TIME_C),HL + LD (ZX_VARS.TIME_D),HL ; CALL INIT_SYS_PAGE RET ; @@ -5898,7 +5895,7 @@ INIT_2X80_1: ; LOAD_CR: LD A,13 - LD (COM_LN_COPY),A + LD (ZX_VARS.COM_LN_COPY),A JP AUTO_021D ; ; @@ -5909,9 +5906,9 @@ PRINT_TRK: PUSH AF PUSH DE LD A,207 - LD (SCR_PL_L),A + LD (ZX_VARS.SCR_PL_L),A LD A,15 - LD (SCR_POS_L),A + LD (ZX_VARS.SCR_POS_L),A LD A,E JR CONV1 ; @@ -5969,7 +5966,7 @@ MSG_AT00: FORM_STATE: CALL INPUT_TXT CALL SINTAX_RET - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) LD A,(HL) CP '"' JR NZ,FORM_NO_NEXT @@ -5984,13 +5981,13 @@ FORM_NO_NEXT: CP ' ' JP C,CMD_ERROR AND #DF - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A RET ; ; FORM_F01: INC HL - LD A,(FL_LEN) + LD A,(ZX_VARS.FL_LEN) LD (HL),A XOR A RET @@ -6006,9 +6003,9 @@ PRINT_SIDE0: PR_SIDE_X: PUSH AF LD A,219 - LD (SCR_PL_L),A + LD (ZX_VARS.SCR_PL_L),A LD A,27 - LD (SCR_POS_L),A + LD (ZX_VARS.SCR_POS_L),A POP AF RST RST10 POP AF @@ -6035,12 +6032,12 @@ PAUSE_X01: PRINT_NAME: - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' RST RST10 LD A,':' RST RST10 - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME JP AUTO_2938 @@ -6057,7 +6054,7 @@ REWR_CONT1: SET_7_TYPE: CALL AUTO_165D - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE SET 7,(HL) RET @@ -6072,7 +6069,7 @@ FORM_X02: RET FORM_X03: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CP 15H CALL AUTO_1C57 CALL AUTO_1D97 @@ -6083,7 +6080,7 @@ FORM_X03: FORM_X04: CALL AUTO_106E - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) AND A JR NZ,FORM_NO_Q CALL DISK_REDIR @@ -6098,7 +6095,7 @@ FORM_X05: AND A JP Z,AUTO_01D3 FORM_NO_Q: - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A SUB 11H JR Z,F_ORIGINAL JR C,FORM_X05 @@ -6115,8 +6112,8 @@ F_ORIGINAL: ; Original FORMAT FORM_X07: XOR A FORM_X08: - LD (FL_LEN),A - LD (FL_START),HL + LD (ZX_VARS.FL_LEN),A + LD (ZX_VARS.FL_START),HL CALL LOW_CLS_AT00 RET @@ -6147,7 +6144,7 @@ LOW_CLS_AT00: JP PRINT_LINE TYPE_FL_X00: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JR Z,TYPE_FL_X01 CP 'D' @@ -6155,9 +6152,9 @@ TYPE_FL_X00: CP '#' JR Z,TYPE_FL_X01 LD A,'C' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A TYPE_FL_X01: - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) RET @@ -6170,7 +6167,7 @@ TYPE_FL_X03: JP AUTO_1B53 OWERWR_X01: - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE BIT 7,(HL) JR NZ,OWERWR_X02 JP AUTO_1B59 @@ -6178,34 +6175,34 @@ OWERWR_X02: RES 7,(HL) CALL OWERWR_1 JP NZ,AUTO_01D3 - LD DE,(DOS_CH_ADR) + LD DE,(ZX_VARS.DOS_CH_ADR) LD A,E OR A JR Z,OWERWR_X03 INC D OWERWR_X03: - LD A,(FL_SIZE) + LD A,(ZX_VARS.FL_SIZE) CP D JR NC,OWERWR_X04 CALL AUTO_2926 JR TYPE_FL_X03 OWERWR_X04: LD B,D - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),170 INC HL - LD DE,(AUTO_5CD1) + LD DE,(ZX_VARS.AUTO_5CD1) LD (HL),E INC HL LD (HL),D LD C,6 - LD HL,(MED_LEN) - LD (FL_LEN),HL - LD HL,(MED_START) - LD (FL_START),HL - LD DE,(FL_PLACE) + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.FL_LEN),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_START),HL + LD DE,(ZX_VARS.FL_PLACE) CALL WRITE_DISK - LD BC,(FL_NUMBER) + LD BC,(ZX_VARS.FL_NUMBER) CALL AUTO_1BBF CALL AUTO_1665 RET @@ -6218,12 +6215,12 @@ LABEL_X00: ;/////////////////////////////////// SIDE_FORMAT: ; Для форматирования с номером стороны !!! - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) BIT 5,A JR Z,SIDE_OUTS INC D SIDE_OUTS: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,SIDE_OUTS RET M @@ -6239,7 +6236,7 @@ SIDE_OUTS: ;************************************** MOVE_X00: - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) MOVE_X01: LD A,(HL) CP 0 @@ -6260,31 +6257,31 @@ MOVE_X03: LD E,(HL) INC HL LD D,(HL) - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) AND A SBC HL,DE ADD HL,DE JR Z,MOVE_X05 - LD (AUTO_5CD5),DE + LD (ZX_VARS.AUTO_5CD5),DE LD A,C - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A CALL AUTO_17A5 MOVE_X04: POP HL PUSH HL - LD DE,(FL_N_2) + LD DE,(ZX_VARS.FL_N_2) LD BC,RST10 LDIR - LD (FL_N_2),DE + LD (ZX_VARS.FL_N_2),DE EX DE,HL - LD DE,(FL_NAME) + LD DE,(ZX_VARS.FL_NAME) DEC HL LD (HL),D DEC HL LD (HL),E - LD HL,(MED_START) - LD (FL_NAME),HL - LD HL,FL_N_6 + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_NAME),HL + LD HL,ZX_VARS.FL_N_6 INC (HL) POP HL RET @@ -6306,12 +6303,12 @@ MOVE_X06: AND 15 ADD A,D LD D,A - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE JR MOVE_X04 ;************************************* EDIT_RET: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),254 INC HL LD (HL),13 @@ -6329,12 +6326,12 @@ EDIT_X00: JR NZ,EDIT_X02 CALL BEEP_1 CALL AUTO_212A ; восстановление ком. строки - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD A,13 LD BC,0 CPIR DEC HL - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL INC HL INC HL LD (HL),128 @@ -6391,8 +6388,8 @@ RUS_PRINT: LD BC,RST08 LDIR LD A,201 - LD (AUTO_5C9A),A - JP AUTO_5C9A + LD (ZX_VARS.AUTO_5C9A),A + JP ZX_VARS.AUTO_5C9A ;************************************** @@ -6422,43 +6419,43 @@ AUTO_3C09: ;!FIXIT not used BLOCK #3C10 - $,255 ;KBD_EXP: - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A RET ; ;************************************ ;!FIXIT not used BLOCK #3C18 - $,255 ;KBD_OFF: - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A RET ;************************************ ;!FIXIT not used BLOCK #3C20 - $,255 READR_X: - CALL get_disk_time: + CALL get_disk_time LD B,A JP set_side_0 ;************************************ ;!FIXIT not used BLOCK #3C30 - $,255 - IN A,(WG_COM) + IN A,(FDC_93.Command) RET ;***************************** NEW_NAME: - DB 22,1,3,"* Sprinter TR-DOS v.7.01 *" - DB 22,3,6, "(c) 2001 PETERS PLUS" - DB 22,5,12, "* R.F.*" + DB 22,1,3, "* Sprinter TR-DOS v.7.02 *" + DB 22,3,6, "(c) 2023 Sprinter Team" + DB 22,5,14, "*R.F.*" DB 22,7,9, "BETA 4Mb",0 ;***************************** ;FORMATER: -; LD DE,(E_LINE) +; LD DE,(ZX_VARS.E_LINE) ; LD HL,TX_FORMAT ; LD BC,LEN_TX_F ; LDIR @@ -6499,8 +6496,9 @@ EXP_FNS_PREPARE: CALL EXP_FNS_PREPARE_EXIT EX (SP),HL PUSH AF - LD A,L - AND 4 + BIT 2,L + ; LD A,L + ; AND 4 JR Z,.no_EI EI .no_EI: POP AF @@ -6528,16 +6526,16 @@ CMD_COPY.FIXED: BLOCK #3CC0 - $,255 MAGIC_1: PUSH AF - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A POP AF JP MAGIC_2 ;******************************* BLOCK #3CC9 - $,255 MAGIC_3: PUSH AF - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A POP AF RETN @@ -6617,7 +6615,7 @@ AUTO_3D21: NOP NOP CALL C,AUTO_3D4C ; если нет, то вызвать программу иниц. - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS RET NOP NOP @@ -6641,22 +6639,22 @@ AUTO_3D44: RST RST08 DB 49 ;!HARDCODE LD A,1 - LD (INTERF_I),A + LD (ZX_VARS.INTERF_I),A RET .Size EQU $-AUTO_3D44 AUTO_3D4C: XOR A - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A IN A,(#F6) LD HL,AUTO_3D38 - LD DE,MEM_BOT + LD DE,ZX_VARS.MEM_BOT LD BC,AUTO_3D38.Size + AUTO_3D44.Size LDIR LD HL,AUTO_3D67 PUSH HL LD HL,AUTO_3D2F PUSH HL - JP MEM_BOT + JP ZX_VARS.MEM_BOT AUTO_3D67: ; получить память для DOS LD HL,AUTO_2F90 ; и вернуться в программу иниц. VARS @@ -6665,10 +6663,10 @@ AUTO_3D67: ; PUSH HL LD HL,1655h ;!HARDCODE PUSH HL - LD HL,AUTO_5BFF + LD HL,ZX_VARS.AUTO_5BFF PUSH HL LD (HL),#C9 ; RET code - LD HL,P_RAMTOP+1 + LD HL,ZX_VARS.P_RAMTOP+1 LD BC,CONT_8+7 RET PRINT_CR: @@ -6694,7 +6692,7 @@ AUTO_3D94: AUTO_3D98: LD A,8 WG93_EXE: - OUT (WG_COM),A + OUT (FDC_93.Command),A AUTO_3D9C: PUSH HL RST_ROM ROUTINE.break_key @@ -6703,7 +6701,7 @@ AUTO_3D9C: RST_ROM ROUTINE.report_l AUTO_3DA5: POP HL - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 128 JR Z,AUTO_3D9C RET @@ -6711,11 +6709,11 @@ RESET_WG: LD A,8 CALL WG93_EXE LD DE,0 - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 2 LD B,A AUTO_3DBA: - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 2 CP B RET NZ @@ -6725,15 +6723,15 @@ AUTO_3DBA: JR NZ,AUTO_3DBA JP AUTO_3EE7 AUTO_3DC8: - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) SET_DISK: JP RAMD_X12 AUTO_3DCE: - LD HL,PDOS_COPY + LD HL,ZX_VARS.PDOS_COPY LD C,A LD A,3Ch OR C - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A LD (HL),A CALL get_disk_time AND 128 @@ -6765,14 +6763,14 @@ AUTO_3E01: JR NZ,pause_1ms RET get_disk_time: - LD DE,TIME_A + LD DE,ZX_VARS.TIME_A AUTO_3E0B: - LD HL,(OPER_DISK) + LD HL,(ZX_VARS.OPER_DISK) ADD HL,DE LD A,(HL) RET get_disk_type: - LD DE,DISK_A + LD DE,ZX_VARS.DISK_A JR AUTO_3E0B test_disk: CALL get_disk_time @@ -6788,12 +6786,12 @@ AUTO_3E1D: LD B,(HL) LD A,1 CALL Goto_trk - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 JR NZ,AUTO_3E3F XOR A CALL Goto_trk - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 RET NZ AUTO_3E3F: @@ -6802,15 +6800,15 @@ AUTO_3E3F: RET Z JR AUTO_3E1D Goto_trk: - OUT (WG_DATA),A + OUT (FDC_93.Data),A LD A,B OR 24 JP WG93_EXE_ Goto_trkx: - OUT (WG_DATA),A + OUT (FDC_93.Data),A PUSH BC LD B,A - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP B POP BC PUSH AF @@ -6834,11 +6832,11 @@ Global_trk: JR Z,AUTO_3E83 BIT 0,(HL) JR NZ,AUTO_3E83 - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP C JR Z,AUTO_3E82 RLCA - OUT (WG_TRK),A + OUT (FDC_93.Track),A LD A,C RLCA AUTO_3E82: @@ -6846,7 +6844,7 @@ AUTO_3E82: AUTO_3E83: CALL get_disk_time LD B,A - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP C PUSH BC CALL NZ,pause_50ms @@ -6855,12 +6853,12 @@ AUTO_3E83: CALL Goto_trkx POP BC LD A,C - OUT (WG_TRK),A - LD A,(DRV_READY) + OUT (FDC_93.Track),A + LD A,(ZX_VARS.DRV_READY) OR A RET Z XOR A - LD (DRV_READY),A + LD (ZX_VARS.DRV_READY),A pause_750ms: LD B,3 AUTO_3EA2: @@ -6878,10 +6876,10 @@ made_trk_side2: READ_ADR_LABL: CALL set_side_0 ; SET SIDE 0 READ_ADR_LABL2: - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 128 - LD (DRV_READY),A - IN A,(WG_TRK) + LD (ZX_VARS.DRV_READY),A + IN A,(FDC_93.Track) LD H,A ; на текущую дорожку CALL Goto_trk ; позиционирование ; CALL READR_X @@ -6889,11 +6887,11 @@ READ_ADR_LABL2: LD D,1 DI LD A,0C0h ; чтение адресной метки - OUT (WG_COM),A + OUT (FDC_93.Command),A PUSH BC LD B,6 AUTO_3ECE: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3EF2 INC DE @@ -6904,32 +6902,32 @@ AUTO_3ECE: POP BC EI LD A,208 ; прервать выполнение - OUT (WG_COM),A - LD A,(AUTO_5CD1) + OUT (FDC_93.Command),A + LD A,(ZX_VARS.AUTO_5CD1) CP 255 RET Z AUTO_3EE7: CALL set_error_26 LD A,255 - LD (FLAG_BOOT),A + LD (ZX_VARS.FLAG_BOOT),A JP exit_No_disk AUTO_3EF2: POP BC IN H,(C) AUTO_3EF5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3EF5 EI RET M DI - IN A,(WG_DATA) + IN A,(FDC_93.Data) JR AUTO_3EF5 save_sector: - LD (SEC_NUM),A + LD (ZX_VARS.SEC_NUM),A RET save_bufer: - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.CONT_BUF_ADR),HL RET AUTO_3F0A: LD A,160 @@ -6937,19 +6935,19 @@ AUTO_3F0A: AUTO_3F0E: LD A,128 AUTO_3F10: - LD (COMAND_WG),A + LD (ZX_VARS.COMAND_WG),A AUTO_3F13: LD D,10 AUTO_3F15: PUSH DE DI - LD A,(SEC_NUM) + LD A,(ZX_VARS.SEC_NUM) INC A - OUT (WG_SEC),A - LD HL,(CONT_BUF_ADR) + OUT (FDC_93.Sector),A + LD HL,(ZX_VARS.CONT_BUF_ADR) LD C,127 - LD A,(COMAND_WG) - OUT (WG_COM),A + LD A,(ZX_VARS.COMAND_WG) + OUT (FDC_93.Command),A CP 160 PUSH AF CALL Z,AUTO_3FBA @@ -6957,7 +6955,7 @@ AUTO_3F15: CALL NZ,AUTO_3FD5 POP DE EI - IN A,(WG_COM) + IN A,(FDC_93.Command) LD B,A AND 127 RET Z @@ -6974,14 +6972,14 @@ AUTO_3F48: LD HL,DISK_ERROR_MSG AUTO_3F4B: LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,B AND 1 JP NZ,AUTO_3EE7 - IN A,(WG_TRK) + IN A,(FDC_93.Track) OR A JR NZ,AUTO_3F5F - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CP 10 RET Z AUTO_3F5F: @@ -6991,11 +6989,11 @@ AUTO_3F5F: RST PRINT_LN LD HL,AUTO_2A13 RST PRINT_LN - IN A,(WG_TRK) + IN A,(FDC_93.Track) CALL AUTO_1DA3 LD HL,AUTO_2A18 RST PRINT_LN - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CALL AUTO_1DA3 LD HL,AUTO_29FE RST PRINT_LN @@ -7009,10 +7007,10 @@ AUTO_3F7B: JR NZ,AUTO_3F7B CALL set_error_26 LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP AUTO_01D3 AUTO_3F94: - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk CALL pause_750ms JP AUTO_3F13 @@ -7026,7 +7024,7 @@ AUTO_3FA0: INC (HL) AUTO_3FAD: CALL AUTO_3D98 - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk POP DE JP AUTO_3F15 @@ -7036,7 +7034,7 @@ AUTO_3FAD: AUTO_3FBA: LD B,4 AUTO_3FBC: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3FD1 INC DE @@ -7046,7 +7044,7 @@ AUTO_3FBC: DJNZ AUTO_3FBC RET AUTO_3FCA: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3FCA RET M @@ -7059,7 +7057,7 @@ AUTO_3FD1: AUTO_3FD5: LD B,4 AUTO_3FD7: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3FEC INC DE @@ -7069,7 +7067,7 @@ AUTO_3FD7: DJNZ AUTO_3FD7 RET AUTO_3FE5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3FE5 RET M @@ -7086,7 +7084,7 @@ HD_CMD: PUSH AF DI ;LD A,SYS_PORT.EXTENSION LD A,1 - OUT (SYS_PORT_ON),A + OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- @@ -7101,7 +7099,7 @@ EXP_FNS:;!TEST 06/01/2024 JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: ; - OUT (SYS_PORT_ON),A + OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- diff --git a/Shared_Includes b/Shared_Includes index d3cdfc6..84d47b2 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d3cdfc6e7644fab96ebe2c6e87959359cda6319c +Subproject commit 84d47b2818758fdceda21ecf2953324c1f339858 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 87dbeac..f68ecc2 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -28,13 +28,13 @@ MSDOS_1ST_FL: MSDOS_TEST_FL: PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD E,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,E LD E,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EI LD A,E POP DE @@ -53,16 +53,16 @@ MSDOS_NEXT_FL: LD DE,20H ADD HL,DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(COUNT_FL) + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_FL) DEC A - LD (COUNT_FL),A + LD (SYS_PAGE.COUNT_FL),A LD E,A LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,E @@ -71,16 +71,16 @@ MSDOS_NEXT_FL: JR NZ,MSDOS_TEST_FL PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(COUNT_SEC) + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_SEC) DEC A - LD (COUNT_SEC),A + LD (SYS_PAGE.COUNT_SEC),A LD E,A LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,E @@ -91,7 +91,7 @@ MSDOS_NEXT_FL: PUSH DE CALL READ_NEXT_DIR POP DE - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR JR MSDOS_TEST_FL ;********************************** @@ -140,7 +140,7 @@ CAT_END: PRINT_MSD_NAME: PUSH HL PUSH DE - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD A,' ' RST 10H LD A,' ' @@ -169,7 +169,7 @@ PRINT_MSD_L2: PRINT_MSD_DATS: PUSH HL PUSH DE - LD HL,FL_PLACE+1 + LD HL,ZX_VARS.FL_PLACE+1 LD A,(HL) DEC HL CALL PRINT_HEX_A @@ -199,12 +199,12 @@ COPY_NAME_MSD: PUSH HL PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,11 LDIR @@ -214,7 +214,7 @@ COPY_NAME_MSD: LDIR LD L,(HL) - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,L @@ -230,7 +230,7 @@ CMD_MSDOS: ; MS-DOS CALL SINTAX_RET LD HL,WORDS LOOP_FIND2: - LD DE,(ADR_DOS_COM) + LD DE,(ZX_VARS.ADR_DOS_COM) INC DE ; Пропустить / LD A,(HL) @@ -283,19 +283,19 @@ END_TAB: JR C,END_TAB3 CP 4 JR NC,END_TAB2 - LD (OPER_DISK),A - LD (CONT_DISK),A + LD (ZX_VARS.OPER_DISK),A + LD (ZX_VARS.CONT_DISK),A LD B,A - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) AND 7CH OR B - LD (PDOS_COPY),A - OUT (P_DOS_FF),A + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A JP AUTO_03E1 END_TAB2: SUB 4 - CP RAMD_KEY_NUM + CP SYS_PAGE.RAMD_KEYS.NUM JR NC,END_TAB3 CALL RAMD_SET1 JP AUTO_03E1 @@ -314,12 +314,12 @@ LOAD_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR LOAD_RMD_XX: - LD (MED_START+1),A ; сохранить + LD (ZX_VARS.MED_START+1),A ; сохранить CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL ; B - число блоков , DE - абсолютный сектор - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) PUSH AF CALL CLEAR_RMD_A ; освободить RAM-Disk A POP AF @@ -332,13 +332,13 @@ LOAD_RMD_XX: SAVE_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CALL TEST_RAMD ; проверить наличие RAM-Disk A размером B JP C,MSD_ERR ; A - номер первого блока JP Z,MSD_ERR @@ -348,9 +348,9 @@ SAVE_RMD: JP AUTO_03E1 RMD_BLKS_FL: - LD A,(FL_SIZE+2) + LD A,(ZX_VARS.FL_SIZE+2) PUSH HL - LD HL,(FL_SIZE) + LD HL,(ZX_VARS.FL_SIZE) LD B,A AND A RL L @@ -372,7 +372,7 @@ RMD_BLKS_L2: MSDOS_KOMP_FL: ; DE - ИМЯ ФАЙЛА СО *,? ; HL - ИМЯ В КАТАЛОГЕ CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) AND A JR NZ,KOMP_CONT1 LD A,2 ; КОНЕЦ КАТАЛОГА @@ -389,7 +389,7 @@ KOMP_CONT1: KOMP_CONT2: PUSH DE PUSH HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME CALL MSDOS_KOMP_ALL POP HL POP DE @@ -485,11 +485,11 @@ CALC_CLAST: ; HL - DEC HL DEC HL DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(MS_BPB+CLAST_SIZE) + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) EX DE,HL LD BC,0 @@ -504,14 +504,14 @@ CALC_CL_LP: DEC A JR NZ,CALC_CL_LP - LD DE,(MSD_DAT_SEC) - LD BC,(MSD_DAT_SEC2) + LD DE,(SYS_PAGE.MSD_DAT_SEC) + LD BC,(SYS_PAGE.MSD_DAT_SEC2) ADD IX,DE ADC HL,BC ; HL,IX - СМЕЩЕНИЕ КЛАСТЕРА ОТ НАЧАЛА ДАННЫХ EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A PUSH IX EX (SP),HL diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index d9ec5d5..6f8675a 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -31,16 +31,16 @@ INIT_RMD: RAMD_FAT_PROG: CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD HL,RAMD_FAT + LD HL,SYS_PAGE.RAMD_FAT RAMD_F_L1: DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C LD C,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EI PUSH HL LD A,C @@ -85,19 +85,19 @@ TB_ONOFF: ; загрузки ;*************************************************************************** MSDOS_WRITE_FILE: - LD (CONT_BUF_ADR),HL ; адрес загрузки - LD (MED_START),A ; страница загрузки + LD (ZX_VARS.CONT_BUF_ADR),HL ; адрес загрузки + LD (ZX_VARS.MED_START),A ; страница загрузки LD A,TRDOS_ROM_CMD.WRITE JR MSDOS_R_W_FILE ; MSDOS_READ_FILE: - LD (CONT_BUF_ADR),HL ; адрес загрузки - LD (MED_START),A ; страница загрузки + LD (ZX_VARS.CONT_BUF_ADR),HL ; адрес загрузки + LD (ZX_VARS.MED_START),A ; страница загрузки LD A,TRDOS_ROM_CMD.READ MSDOS_R_W_FILE: - LD (MED_LEN),A + LD (ZX_VARS.MED_LEN),A ; beg=start_claster. Получить начальный кластер - LD IX,(START_CLASTER) ; стартовый кластер + LD IX,(ZX_VARS.START_CLUSTER) ; стартовый кластер ; next=beg ; max=file_len. длина в кластерах CALL GET_FILE_CLASTERS_BC @@ -109,14 +109,14 @@ msd_rf_cont2: ; max2=blk_len ; длина блока в кластерах ; DI ; GET_BLK_CLASTERS_L -; IN A,(PAGE3) +; IN A,(SLOT3) ; EX AF,AF' ; LD A,SYS_PAGE -; OUT (PAGE3),A +; OUT (SLOT3),A ; LD A,(C_P_B) ; LD L,A ; EX AF,AF' -; OUT (PAGE3),A +; OUT (SLOT3),A ; EI LD L,128 @@ -218,7 +218,7 @@ READ_num_clasters_from_beg: CALL CLAST_TO_SEC PUSH AF - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) LD C,A SUB TRDOS_ROM_CMD.READ JR Z,CONT_XX1 @@ -236,13 +236,13 @@ LOOP_128: PUSH IX PUSH BC - LD HL,(CONT_BUF_ADR) - LD A,(MED_START) + LD HL,(ZX_VARS.CONT_BUF_ADR) + LD A,(ZX_VARS.MED_START) CALL MSD_R_W_UT - LD (CONT_BUF_ADR),HL - LD (MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A POP BC POP IX @@ -289,14 +289,14 @@ CLAST_TO_SEC: CALL CALC_CLAST DI - IN A,(PAGE3) + IN A,(SLOT3) LD B,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(MS_BPB+CLAST_SIZE) + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD C,A LD A,B - OUT (PAGE3),A + OUT (SLOT3),A EI POP AF @@ -332,14 +332,14 @@ FAT_DE_to_HL: PUSH BC PUSH IX DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD HL,(FAT_FLAG) - LD BC,(MS_BPB+SEC_SIZE) ; размер сектора - OUT (PAGE3),A + LD HL,(SYS_PAGE.FAT_FLAG) + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; размер сектора + OUT (SLOT3),A EI PUSH HL @@ -394,20 +394,20 @@ CALL_ALL: AND B LD H,A - LD BC,MS_FAT + LD BC,SYS_PAGE.MS_FAT ADD HL,BC DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD (FAT_FLAG),DE + LD (SYS_PAGE.FAT_FLAG),DE LD C,(HL) ; считать кластер INC HL LD B,(HL) INC HL - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI POP AF @@ -477,14 +477,14 @@ READ_FAT_SEC: LD D,0 DI - IN A,(PAGE3) + IN A,(SLOT3) LD L,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L - LD IX,(MSD_FAT_SEC) - LD HL,(MSD_FAT_SEC2) - OUT (PAGE3),A + LD IX,(SYS_PAGE.MSD_FAT_SEC) + LD HL,(SYS_PAGE.MSD_FAT_SEC2) + OUT (SLOT3),A EI LD BC,0 @@ -496,20 +496,20 @@ READ_FAT_SEC: PUSH HL POP IX - LD HL,(CONT_BUF_ADR) - LD A,(MED_START) + LD HL,(ZX_VARS.CONT_BUF_ADR) + LD A,(ZX_VARS.MED_START) PUSH AF PUSH HL - LD HL,MS_FAT + LD HL,SYS_PAGE.MS_FAT LD A,SYS_PAGE LD BC,256*2 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT POP HL POP AF - LD (CONT_BUF_ADR),HL - LD (MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A POP DE POP BC @@ -524,17 +524,17 @@ READ_FAT_SEC: GET_FILE_CLASTERS_BC: DI - IN A,(PAGE3) + IN A,(SLOT3) LD L,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L - LD HL,(CLASTER_LEN) - OUT (PAGE3),A + LD HL,(SYS_PAGE.CLASTER_LEN) + OUT (SLOT3),A ; RET_PAGE3 EI - LD BC,(FL_SIZE) - LD A,(FL_SIZE+2) + LD BC,(ZX_VARS.FL_SIZE) + LD A,(ZX_VARS.FL_SIZE+2) LD DE,0 SCF GET_FL_CL_2: ; вычисление количества кластеров в файле @@ -562,14 +562,14 @@ HDD_PROG: CALL EXP_FNS ; JP C,HDD_PROG_E - LD HL,HD_IDF_ADR+54 + LD HL,SYS_PAGE.HD_IDF_ADR+54 LD B,32 HDD_PROG_L: DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L XOR 1 LD L,A @@ -579,7 +579,7 @@ HDD_PROG_L: LD L,A INC HL LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,C diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 4bccc88..6819648 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -53,7 +53,7 @@ MSD_R_W_UT: ; EX (SP),HL ; POP IX ; LD C,12H -; LD A,(OPER_DISK) +; LD A,(ZX_VARS.OPER_DISK) ; DI ; PUSH IY ; CALL HD_CMD @@ -74,7 +74,7 @@ MSD_R_W_UT: ; EX (SP),HL ; POP IX ; LD C,13H -; LD A,(OPER_DISK) +; LD A,(ZX_VARS.OPER_DISK) ; DI ; PUSH IY ; CALL HD_CMD @@ -102,37 +102,37 @@ MSD_cmd4: LD DE,0 MSD_cmd5: LD A,0 - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 MSD_cmd6: LD A,255 - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 PREPARE1: - LD (MED_START),A - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A + OUT (SLOT2),A - LD A,(DS_1440-4000H) + LD A,(SYS_PAGE.DS_1440-4000H) AND BIT_MASK_1440 SET 0,A - LD (DS_1440-4000H),A + LD (SYS_PAGE.DS_1440-4000H),A LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI CALL Z,RES_1440 CALL NZ,SET_1440 CALL CALC_SECTOR - LD (CONT_SEC),DE - LD A,(RD_WR_COM) + LD (ZX_VARS.CONT_SEC),DE + LD A,(ZX_VARS.RD_WR_COM) RET MSD_RWU1: @@ -144,34 +144,34 @@ MSD_RWU1: MSD_R_W_LOOP: POP HL POP BC - LD A,(MED_START) + LD A,(ZX_VARS.MED_START) INC B DEC B - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) RET Z DEC B PUSH BC PUSH HL - LD (CONT_BUF_ADR),HL - LD A,(CONT_SEC) - LD (SEC_NUM),A - LD A,(CONT_TRK) + LD (ZX_VARS.CONT_BUF_ADR),HL + LD A,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.SEC_NUM),A + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) OR A PUSH AF CALL Z,MSD_3F0E POP AF CALL NZ,MSD_3F0A DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD DE,(MS_BPB+SEC_SIZE-#4000) + OUT (SLOT2),A + LD DE,(SYS_PAGE.MS_BPB+SEC_SIZE-#4000) LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI POP HL ADD HL,DE @@ -179,44 +179,44 @@ MSD_R_W_LOOP: OR L JR NZ,MSD_NO_PAGE DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(MED_START) - LD HL,RAMD_FAT-#4000 + OUT (SLOT2),A + LD A,(ZX_VARS.MED_START) + LD HL,SYS_PAGE.RAMD_FAT-#4000 LD L,A LD L,(HL) LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI LD A,L LD HL,#C000 - LD (MED_START),A + LD (ZX_VARS.MED_START),A MSD_NO_PAGE: - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.CONT_BUF_ADR),HL PUSH HL DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(DS_1440-#4000) + OUT (SLOT2),A + LD A,(SYS_PAGE.DS_1440-#4000) AND %1111'1110 - LD (DS_1440-#4000),A - LD A,(MSD_SECS-#4000) + LD (SYS_PAGE.DS_1440-#4000),A + LD A,(SYS_PAGE.MSD_SECS-#4000) LD L,A LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI LD A,L - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC INC (HL) CP (HL) JP NZ,MSD_R_W_LOOP LD (HL),0 - LD HL,CONT_TRK + LD HL,ZX_VARS.CONT_TRK INC (HL) JP MSD_R_W_LOOP ;***************************************** @@ -228,30 +228,30 @@ MSD_3F0A: MSD_3F0E: LD A,128 MSD_3F10: - LD (COMAND_WG),A + LD (ZX_VARS.COMAND_WG),A MSD_3F13: LD D,5 ; ЧИСЛО ПОВТОРЕНИЙ MSD_3F15: PUSH DE PUSH IX DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' - LD A,(MED_START) - OUT (PAGE3),A + LD A,(ZX_VARS.MED_START) + OUT (SLOT3),A AND A JR Z,NO_OFF_SCR LD A,0C0H OUT (RGADR),A NO_OFF_SCR: LD IX,MSD_RET_ADR - LD A,(SEC_NUM) + LD A,(ZX_VARS.SEC_NUM) INC A - OUT (WG_SEC),A - LD HL,(CONT_BUF_ADR) + OUT (FDC_93.Sector),A + LD HL,(ZX_VARS.CONT_BUF_ADR) LD C,127 - LD A,(COMAND_WG) - OUT (WG_COM),A + LD A,(ZX_VARS.COMAND_WG) + OUT (FDC_93.Command),A CP 160 JP Z,MSD_3FBA ; ЗАПИСЬ СЕКТОРА JP MSD_3FD5 ; ЧТЕНИЕ СЕКТОРА @@ -259,11 +259,11 @@ MSD_RET_ADR: LD A,0 OUT (RGADR),A EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A POP IX POP DE EI - IN A,(WG_COM) + IN A,(FDC_93.Command) LD B,A AND 127 RET Z @@ -283,7 +283,7 @@ MSD_3F48: LD HL,DISK_ERROR_MSG MSD_3F4B: LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,B AND 1 JP NZ,AUTO_3EE7 @@ -294,11 +294,11 @@ MSD_3F4B: RST PRINT_LN LD HL,AUTO_2A13 RST PRINT_LN - IN A,(WG_TRK) + IN A,(FDC_93.Track) CALL AUTO_1DA3 LD HL,AUTO_2A18 RST PRINT_LN - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CALL AUTO_1DA3 LD HL,AUTO_29FE RST PRINT_LN @@ -312,10 +312,10 @@ MSD_3F7B: JR NZ,MSD_3F7B CALL exit_No_disk LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP AUTO_01D3 MSD_3F94: - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk CALL pause_750ms JP MSD_3F13 @@ -325,7 +325,7 @@ MSD_3FA0: CALL SWITCH_DT PUSH DE CALL AUTO_3D98 ; RESET_WG - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk ; ПОЗИЦИОНИРОВАНИЕ POP DE JP MSD_3F15 @@ -333,25 +333,25 @@ MSD_3FA0: SWITCH_DT: DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(DS_1440-4000H) + OUT (SLOT2),A + LD A,(SYS_PAGE.DS_1440-4000H) BIT 0,A JR Z,NO_SW_DT XOR BIT_MASK_1440 - LD (DS_1440-4000H),A + LD (SYS_PAGE.DS_1440-4000H),A AND BIT_MASK_1440 LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI CALL Z,RES_1440 CALL NZ,SET_1440 RET NO_SW_DT: LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI RET @@ -361,7 +361,7 @@ NO_SW_DT: MSD_3FBA: LD B,4 MSD_3FBC: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,MSD_3FD1 INC DE @@ -372,7 +372,7 @@ MSD_3FBC: MSD_RET_IX: JP (IX) MSD_3FCA: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,MSD_3FCA JP M,MSD_RET_IX @@ -385,7 +385,7 @@ MSD_3FD1: MSD_3FD5: LD B,4 MSD_3FD7: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,MSD_3FEC INC DE @@ -396,7 +396,7 @@ MSD_3FD7: MSD_RET_IX2: JP (IX) MSD_3FE5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,MSD_3FE5 JP M,MSD_RET_IX2 @@ -436,7 +436,7 @@ READ_BPB: LD IX,0 LD DE,63 ;!HARDCODE LD A,SYS_PAGE - LD HL,MS_BPB + LD HL,SYS_PAGE.MS_BPB ; LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT @@ -445,7 +445,7 @@ READ_BPB: RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE - LD HL,MS_BPB + LD HL,SYS_PAGE.MS_BPB LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT @@ -454,38 +454,38 @@ READ_BPB: ;RET ; LD C,18H - ; LD A,(OPER_DISK) + ; LD A,(ZX_VARS.OPER_DISK) ; CALL HD_CMD ; ; ; DI - ; IN A,(PAGE3) + ; IN A,(SLOT3) ; EX AF,AF' ; LD A,SYS_PAGE - ; OUT (PAGE3),A + ; OUT (SLOT3),A ; ; - ; LD A,(MS_BPB+S_P_T) ; Количество секторов на трек + ; LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек ; LD L,A ; ; ; EX AF,AF' - ; OUT (PAGE3),A + ; OUT (SLOT3),A ; EI ; ; - ; LD A,(OPER_DISK) + ; LD A,(ZX_VARS.OPER_DISK) ; LD C,19H ; CALL HD_CMD .PARAMS: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A - LD A,(MS_BPB+FORM_CODE) + LD A,(SYS_PAGE.MS_BPB+FORM_CODE) CP #F0 JP C,.ERROR_BPB - LD HL,MS_BPB+FAT_ID + LD HL,SYS_PAGE.MS_BPB+FAT_ID LD DE,.FAT1_MSG LD B,4 .L1: LD A,(DE) @@ -508,10 +508,10 @@ READ_BPB: .PC_DOS: LD HL,#01FF ; FAT12 флаг -.FAT: LD (FAT_FLAG),HL +.FAT: LD (SYS_PAGE.FAT_FLAG),HL - LD A,(MS_BPB+S_P_T) ; Количество секторов на трек - LD (MSD_SECS),A + LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек + LD (SYS_PAGE.MSD_SECS),A BIT 7,H @@ -519,32 +519,32 @@ READ_BPB: LD HL,0 ; вычислить начальный сектор FAT JR Z,.NO_LD_SPECIAL - LD IX,(MS_BPB+SPECIAL_SECS) - LD HL,(MS_BPB+SPECIAL_SECS+2) + LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) + LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) .NO_LD_SPECIAL: LD BC,0 - LD DE,(MS_BPB+RESERV_SECS) + LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) ADD IX,DE ADC HL,BC - LD (MSD_FAT_SEC),IX ; начальный сектор FAT - LD (MSD_FAT_SEC2),HL ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT - LD DE,(MS_BPB+S_P_F) ; число секторов в FAT + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT LD BC,0 - LD A,(MS_BPB+FATS_NUM) ; количество FATs + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs .NEXT_ADD: ADD IX,DE ADC HL,BC DEC A JR NZ,.NEXT_ADD - LD (MSD_CAT_SEC),IX ; начальный сектор DIR - LD (MSD_CAT_SEC2),HL ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR - LD BC,(MS_BPB+SEC_SIZE) ; Размер сектора + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора RL C RL B RL C @@ -554,9 +554,9 @@ READ_BPB: LD C,B LD B,0 ; BC - число файловых записей в секторе LD A,C - LD (F_P_S),A + LD (SYS_PAGE.F_P_S),A - LD DE,(MS_BPB+FLS_NUM) ; Число файловых записей + LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей EX DE,HL DEC HL @@ -571,17 +571,17 @@ READ_BPB: LD E,A ; A - число секторов в DIR LD D,0 LD BC,0 - LD (S_P_C),A + LD (SYS_PAGE.S_P_C),A ADD IX,DE ; Начало DATA area ADC HL,BC - LD (MSD_DAT_SEC),IX - LD (MSD_DAT_SEC2),HL + LD (SYS_PAGE.MSD_DAT_SEC),IX + LD (SYS_PAGE.MSD_DAT_SEC2),HL - LD BC,(MS_BPB+SEC_SIZE) ; Размер сектора + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора LD HL,0 - LD A,(MS_BPB+CLAST_SIZE) + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A LD A,0 .NEXT_ADD3: @@ -590,28 +590,28 @@ READ_BPB: DEC D JR NZ,.NEXT_ADD3 - LD (CLASTER_LEN),HL + LD (SYS_PAGE.CLASTER_LEN),HL LD B,0 LD C,A - LD (CLASTER_LEN2),BC + LD (SYS_PAGE.CLASTER_LEN2),BC LD HL,0 - LD BC,(MS_BPB+S_P_T) - LD A,(MS_BPB+H_P_S) + LD BC,(SYS_PAGE.MS_BPB+S_P_T) + LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР ADD HL,BC DEC A JR NZ,.BPB_L1 - LD (S_X_H),HL + LD (SYS_PAGE.S_X_H),HL ; EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EI AND A RET .ERROR_BPB: EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A SCF EI RET @@ -623,59 +623,59 @@ READ_BPB: ;******************************************** READ_NEXT_DIR: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD DE,(MSD_CONT_SEC) - LD IX,(MSD_CONT_SEC2) + OUT (SLOT3),A + LD DE,(SYS_PAGE.MSD_CONT_SEC) + LD IX,(SYS_PAGE.MSD_CONT_SEC2) JR READ_NEXT2 ;******************************************** READ_1ST_DIR: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD IX,(MSD_CAT_SEC2) ; - LD DE,(MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА - LD (MSD_CONT_SEC),DE - LD (MSD_CONT_SEC2),IX - LD A,(S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ - LD (COUNT_SEC),A + OUT (SLOT3),A + LD IX,(SYS_PAGE.MSD_CAT_SEC2) ; + LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА + LD (SYS_PAGE.MSD_CONT_SEC),DE + LD (SYS_PAGE.MSD_CONT_SEC2),IX + LD A,(SYS_PAGE.S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ + LD (SYS_PAGE.COUNT_SEC),A READ_NEXT2: EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR LD A,SYS_PAGE LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A - LD DE,(MSD_CONT_SEC) + LD DE,(SYS_PAGE.MSD_CONT_SEC) INC DE - LD (MSD_CONT_SEC),DE + LD (SYS_PAGE.MSD_CONT_SEC),DE LD A,D OR E JR NZ,READ_NEXT3 - LD IX,(MSD_CONT_SEC2) + LD IX,(SYS_PAGE.MSD_CONT_SEC2) INC IX - LD (MSD_CONT_SEC2),IX + LD (SYS_PAGE.MSD_CONT_SEC2),IX READ_NEXT3: - LD A,(F_P_S) ; ФАЙЛОВ В СЕКТОРЕ - LD (COUNT_FL),A + LD A,(SYS_PAGE.F_P_S) ; ФАЙЛОВ В СЕКТОРЕ + LD (SYS_PAGE.COUNT_FL),A EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR AND A RET @@ -692,11 +692,11 @@ CALC_SECT_L1: PUSH BC EX DE,HL DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD BC,(MS_BPB+S_P_T) + OUT (SLOT3),A + LD BC,(SYS_PAGE.MS_BPB+S_P_T) XOR A LOOP_TRK: SBC HL,BC @@ -711,7 +711,7 @@ SEC_ENDER: LD H,A ; ТРЕК ; LD L,L ; СЕКТОР EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EI EX DE,HL POP BC @@ -720,8 +720,8 @@ SEC_ENDER: ;************************************************ REDIR_LINE_CODING: - LD (MED_START),HL - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,(HL) CP '/' RET Z diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 8597159..469e611 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -2,7 +2,7 @@ DISK_REDIR: PUSH HL PUSH BC - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS @@ -24,7 +24,7 @@ ERROR_DISK: RECALL_1E70: CALL RES_1440 - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) PUSH BC PUSH HL CALL READ_TRK_NUM @@ -52,8 +52,8 @@ TEST_RAMD: RET ; ╔═══════════════════════════════════╗ -; ║ RD/WR SECTOR HL - BUFER ║\ -; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD/WR SECTOR HL - ZX_VARS.BUFFER ║\ +; ║ ZX_VARS.CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ COM_RD_WR - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ @@ -73,14 +73,14 @@ READ_WRITE_RAMD: ; LD HL,RAMD_KEYS ; ADD A,L ; LD L,A -; IN A,(PAGE3) +; IN A,(SLOT3) ; LD C,A ; LD A,SYS_PAGE ; DI -; OUT (PAGE3),A +; OUT (SLOT3),A ; LD L,(HL) ; LD A,C -; OUT (PAGE3),A +; OUT (SLOT3),A ; EI ; LD A,L ; 1-st block ; POP HL @@ -97,7 +97,7 @@ READ_WRITE_RAMD: ; PUSH DE ; PUSH BC ; -; LD DE,(CONT_SEC) +; LD DE,(ZX_VARS.CONT_SEC) ; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! ; RRCA ; RRCA @@ -111,7 +111,7 @@ READ_WRITE_RAMD: ; AND 0FH ; LD D,A ; -; LD A,(RD_WR_COM) +; LD A,(ZX_VARS.RD_WR_COM) ; AND A ; JR Z,RAMD_READ ; PUSH AF @@ -132,7 +132,7 @@ READ_WRITE_RAMD: ; POP HL ; POP AF ; OUT (RGADR),A -; LD DE,(CONT_SEC) +; LD DE,(ZX_VARS.CONT_SEC) ; ; LD A,B ; @@ -158,7 +158,7 @@ READ_WRITE_RAMD: ; ; LD B,0 ; -; LD (CONT_SEC),DE +; LD (ZX_VARS.CONT_SEC),DE ; AND A ; RET ; @@ -180,7 +180,7 @@ WD_WR_RAMD_LOOP: RAMD_NEXT_SEC: PUSH HL - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC LD A,16 INC (HL) CP (HL) @@ -195,15 +195,15 @@ RAMD_NEXT_1: RET RD_WR_1SEC: - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) CALL PAGE_CALC2 DI - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) AND 0C0H OUT (RGADR),A LD A,H CP 0A0H - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) LD E,0 LD D,C SET 6,D @@ -211,7 +211,7 @@ RD_WR_1SEC: RD_WR_4000: RES 7,D ; DE - адрес данных RAMD - LD C,PAGE1 + LD C,SLOT1 EX AF,AF' IN A,(C) EX AF,AF' @@ -229,7 +229,7 @@ MOVE_NOT_EX3: MOVE_NOT_EX4: ;******************************* EX AF,AF' - OUT (PAGE1),A + OUT (SLOT1),A EX AF,AF' ; RET_PAGE1 MOVE_RET: @@ -240,7 +240,7 @@ MOVE_RET: RD_WR_C000: SET 7,D - LD C,PAGE3 + LD C,SLOT3 EX AF,AF' IN A,(C) EX AF,AF' @@ -258,7 +258,7 @@ MOVE_NOT_EX1: MOVE_NOT_EX2: ;******************************* EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' ; RET_PAGE3 JR MOVE_RET @@ -296,7 +296,7 @@ PAGE_CALC2: ;********************************************* RAMD_X12: ; проверка диска - LD (OPER_DISK),A + LD (ZX_VARS.OPER_DISK),A CALL DISK_REDIR CP 4 JR C,X_AUTO_3DCE @@ -308,7 +308,7 @@ NO_DISK2: X_AUTO_3DCE: CALL RES_1440 - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) JP AUTO_3DCE ;************************************* @@ -325,7 +325,7 @@ RAMD_X14: ; FORMATING JP READ_ONLY DISK_FORM: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CP 14H JR Z,QVICK_FORMAT POP HL @@ -356,15 +356,15 @@ RAMD_FORMAT: CALL GET_RAM_BLK ; ВЫДЕЛЕНИЕ ПАМЯТИ ; LD C,A ; КЛЮЧ RAM-Disk Q_FORM_1: - LD HL,BUFER ; CLEAR DISK BUFER - LD DE,BUFER+1 + LD HL,ZX_VARS.BUFFER ; CLEAR DISK ZX_VARS.BUFFER + LD DE,ZX_VARS.BUFFER+1 LD BC,0FFh LD (HL),0 LDIR LD DE,0 RAMD_F_LOOP: - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD B,1 PUSH DE CALL WRITE_DISK @@ -391,7 +391,7 @@ CLEAR_RAMD: CLEAR_NEXT: SUB 4 RET C - CP RAMD_KEY_NUM + CP SYS_PAGE.RAMD_KEYS.NUM CCF RET C @@ -429,7 +429,7 @@ READ_ONLY: JP ERR_EXIT FDD_SET: - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A LD C,BIOS.FDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то @@ -447,7 +447,7 @@ HDD_SET:;!TEST 06/01/2024 убирае ; JP C,HDD_PROG_E - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A XOR A LD C,BIOS.HDD_TO_DRV @@ -463,7 +463,7 @@ RAMD_SET: RET C RAMD_SET1: PUSH AF - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A POP AF LD C,BIOS.RAMD_TO_DRV @@ -505,7 +505,7 @@ RAMD_SYM_OK: ;[ ] 07/01/2024 CHOOSE_HDD: PUSH DE - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD C,BIOS.GET_DRV_ST CALL EXP_FNS POP DE From ac2ca08a88b6069cf0c474884667adc9f062880a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Jan 2024 00:19:10 +1000 Subject: [PATCH 044/114] SetHDD --> HDD --- SP_TRDOS.ASM | 2 + TRDOS/TR_MSD_2.ASZ | 2 +- TRDOS/TR_MSD_3.ASZ | 11 ++++- TRDOS/TR_MSD_4.ASZ | 101 +++++++++++++++++++++++++++++++++++++++++++++ TRDOS/TR_RMD_S.ASZ | 80 +---------------------------------- 5 files changed, 114 insertions(+), 82 deletions(-) create mode 100644 TRDOS/TR_MSD_4.ASZ diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 2989ddf..b1a6fa4 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -1155,6 +1155,7 @@ WG93_EXE_: JP WG93_EXE ;************************************** DISPLAY "2k" + ;INCLUDE 'trdos/tr_msd_4.asz' BLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' @@ -1215,6 +1216,7 @@ ZG_RUS: ; ;************************************** ;************************************** + INCLUDE 'trdos/tr_msd_4.asz' BLOCK #1000 - $,255 ;************************************** diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index f68ecc2..95974eb 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -249,7 +249,7 @@ LOOP_FIND: LD A,(DE) CP 13 JR Z,CMD_EXE1 - CP 20H + CP ' ' JR Z,CMD_EXE JR NEXT_WORD2 CMD_EXE: diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 6f8675a..be188e1 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -275,7 +275,7 @@ SKEEP_XX1: ;***************************************** MADE_next_blk: PUSH BC - LD C,#95 ;!HARDCODE BIOS.GetMemPageNext (#C7) + LD C,BIOS.GetMemPageNext CALL EXP_FNS POP BC INC L ; SET ZF, if END BLK !!! @@ -441,9 +441,15 @@ FAT_ALL: POP AF SCF RET +;----------------------------------------------------------------------- + ;INCLUDE 'trdos/tr_msd_4.asz' + +;----------------------------------------------------------------------- BLOCK #09FF-$, #FF - BLOCK #0A01-$, #FF + ;родионовский вектор прерывания + DW #FFFF +;----------------------------------------------------------------------- NO_END_CLAST: ; PUSH AF @@ -605,6 +611,7 @@ HDD_ERROR: HDD_PROG_E: LD HL,HD_TX2 JP AUTO_03E4 + ; ;*************************************************************************** diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_MSD_4.ASZ new file mode 100644 index 0000000..9900652 --- /dev/null +++ b/TRDOS/TR_MSD_4.ASZ @@ -0,0 +1,101 @@ + +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + CP #0D + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ; + +.init: ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; + +;[ ] 07/01/2024 +;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR +CHOOSE_HDD: + PUSH DE + LD A,(ZX_VARS.OPER_DISK) + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + POP DE + JR C,.error + AND #40 ;!HARDCODE HDD + CALL Z,.setUp_HDD + ; +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + LD A,(DE) + CP #0D + JR Z,.error +.cont: ; номер раздела + ;INC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + RLA + LD C,A + ; ; master/slave + ; DEC DE + ; LD A,(DE) + ; CP "2" + ; JR NC,.error + ; CP "0" + ; JR C,.error + ; SUB "0" + ; RLA + ; OR C + ; LD C,A + ; Primary/Secondary, master/slave + DEC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + OR C + ; + LD C,BIOS.HDD_PART + CALL EXP_FNS + RET NC + ; +.error: LD HL,MSG_3 + JP ERR_EXIT + ; +.setUp_HDD: + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + PUSH DE + CALL EXP_FNS + POP DE + RET +; \ No newline at end of file diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 469e611..c78a596 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -439,25 +439,6 @@ FDD_SET: ;RET ; -HDD_SET:;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; - RAMD_SET: CALL RAMD_SYM RET C @@ -500,63 +481,4 @@ RAMD_SYM: RAMD_SYM_OK: POP AF RET - - -;[ ] 07/01/2024 -CHOOSE_HDD: - PUSH DE - LD A,(ZX_VARS.OPER_DISK) - LD C,BIOS.GET_DRV_ST - CALL EXP_FNS - POP DE - JR C,.error - AND #40 ;!HARDCODE HDD - JR Z,.error - ; -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - LD A,(DE) - CP #0D - JR Z,.error - ; номер раздела - ;INC DE - LD A,(DE) - CP "4" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - RLA - RLA - LD C,A - ; ; master/slave - ; DEC DE - ; LD A,(DE) - ; CP "2" - ; JR NC,.error - ; CP "0" - ; JR C,.error - ; SUB "0" - ; RLA - ; OR C - ; LD C,A - ; Primary/Secondary, master/slave - DEC DE - LD A,(DE) - CP "4" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - OR C - ; - LD C,BIOS.HDD_PART - CALL EXP_FNS - RET NC - ; -.error: LD HL,MSG_3 - JP ERR_EXIT - -;bit0: Primary/Secondary, bit1 - master/slave, bit2..3: использующийся раздел в MBR \ No newline at end of file +; From 4ff08eb3651228e29c618de01e373c8719782446 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Jan 2024 00:21:15 +1000 Subject: [PATCH 045/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 4 ---- TRDOS/TR_MSD_4.ASZ | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 84d47b2..713bcf1 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 84d47b2818758fdceda21ecf2953324c1f339858 +Subproject commit 713bcf1538ff822231da15aed4d8fb7611ebe205 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 95974eb..b6278be 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -559,10 +559,6 @@ WORDS: DB 5,'CLEAR' ; DW SPR_1 DB 2,"AY" DW AY8910 - ;[ ] 07/01/2024 - DB 6,'SETHDD' ; /SETHDD XYZ, где X - chanel, Y - master/slave, Z - 0..3 - номер раздела - DW CHOOSE_HDD - ; DB 0 ;SAVE_AUTOEXEC: diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_MSD_4.ASZ index 9900652..41ac92f 100644 --- a/TRDOS/TR_MSD_4.ASZ +++ b/TRDOS/TR_MSD_4.ASZ @@ -31,7 +31,7 @@ HDD_SET:;!TEST ;RET ; -;[ ] 07/01/2024 +;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: PUSH DE From bf811fce1b681e98ea38dc7aebd20a027fa9b110 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 31 Jan 2024 23:11:19 +1000 Subject: [PATCH 046/114] ... --- ProfRom_Disasm/rom3_trdos.a80 | 3 +- SP_TRDOS.ASM | 315 +++++++------- SP__48.ASM | 7 +- Shared_Includes | 2 +- TRDOS/{TR_MSD_4.ASZ => TR_HDD_4.ASZ} | 32 -- TRDOS/TR_MSD_3.ASZ | 33 +- TRDOS/TR_RMD_S.ASZ | 603 ++++++++++++++++----------- 7 files changed, 548 insertions(+), 447 deletions(-) rename TRDOS/{TR_MSD_4.ASZ => TR_HDD_4.ASZ} (66%) diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 index 7c1223e..ab49106 100755 --- a/ProfRom_Disasm/rom3_trdos.a80 +++ b/ProfRom_Disasm/rom3_trdos.a80 @@ -2079,7 +2079,8 @@ x1403 XOR A ; RET ;возвpат -;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. +;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, +; #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. x1451 LD A,(#5CF1) ;все скопировали? OR A diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b1a6fa4..735d468 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -12,6 +12,8 @@ INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/macroses/macros.z80' TRDOS_ROM_CMD: .READ_BPB EQU BIOS.HDD_READ_BPB and #BF @@ -68,8 +70,6 @@ AUTO_FF00 EQU #FF00 AUTO_FFFF EQU #FFFF ;**************************************** - - DISPLAY "Start." START: DI LD DE,#FFFF LD A,7 @@ -82,7 +82,7 @@ CONT_1: JR CONT_2 //////////////////////////////////////////////////////////////////////// - BLOCK #10-$,0 + _mInfoBLOCK #10-$,0 RST10: JP PRINT_SYM //////////////////////////////////////////////////////////////////////// @@ -92,7 +92,7 @@ CONT_2: JP CONT_3 //////////////////////////////////////////////////////////////////////// - BLOCK #18-$,0 + _mInfoBLOCK #18-$,0 PRINT_LN: JP PRINT_L CONT_3: @@ -103,7 +103,7 @@ AUTO_001E: JR CONT_4 //////////////////////////////////////////////////////////////////////// - BLOCK #20-$,0 + _mInfoBLOCK #20-$,0 RST20: JP RST20_EXE RET @@ -115,7 +115,7 @@ CONT_4: JR CONT_5 //////////////////////////////////////////////////////////////////////// - BLOCK #28-$,0 + _mInfoBLOCK #28-$,0 RST28: JP RST28_EXE //////////////////////////////////////////////////////////////////////// @@ -129,7 +129,7 @@ CONT_5: //////////////////////////////////////////////////////////////////////// REDIR_RST38: - BLOCK #38-$,#FF + _mInfoBLOCK #38-$,#FF ; JP RST38X ; EI ; RET @@ -161,14 +161,14 @@ CONT_7: LD HL,#B8ED //////////////////////////////////////////////////////////////////////// - BLOCK #64-$,0 + _mInfoBLOCK #64-$,0 AUTO_0064: JR CONT_8 //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// - BLOCK #66-$,0 + _mInfoBLOCK #66-$,0 ;********** MAGIC *********** ; JP MAGIC_1 ;AUTO_2A56 RETN @@ -191,7 +191,7 @@ RET_1: LD BC,AUTO_0540 LD (ZX_VARS.ERR_BEEP),BC LD (ZX_VARS.TOP_CLEAR),HL - LD HL,03C00h + LD HL,#3C00 LD (ZX_VARS.ZG),HL LD HL,(ZX_VARS.TOP_CLEAR) LD (HL),'>' @@ -246,7 +246,7 @@ AUTO_00C8: AUTO_0100: LD (HL),201 RST_ROM ROUTINE.clear_prb - LD HL,ZX_VARS.L_SCR_SIZE + LD HL,ZX_VARS.SCR_SIZE LD (HL),2 LD HL,AUTO_128B PUSH HL @@ -935,7 +935,7 @@ AUTO_063C: CALL AUTO_03FD LD A,(ZX_VARS.N_FILES) CP 128 - JP Z,AUTO_1C45 + JP Z,AUTO_2723 LD HL,ZX_VARS.VAR_2 LD DE,ZX_VARS.FL_START LD BC,7 @@ -1043,7 +1043,7 @@ AUTO_072F: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_0775 @@ -1075,7 +1075,7 @@ AUTO_0744: AUTO_0775: LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -1140,7 +1140,7 @@ AUTO_07D2: ; AUTO_07E7: - BLOCK #07E7-$,255 + _mInfoBLOCK #07E7-$,255 CALL AUTO_03FD LD HL,(ZX_VARS.FL_PLACE) LD (ZX_VARS.CLEAR_SEC),HL @@ -1154,74 +1154,71 @@ WG93_EXE_: AND 252 JP WG93_EXE ;************************************** - DISPLAY "2k" - ;INCLUDE 'trdos/tr_msd_4.asz' - BLOCK #0840-$,255 + ;INCLUDE 'trdos/tr_HDD_4.asz' + _mInfoBLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' - BLOCK #0B00-$,255 -ZG_RUS: - DB 3 ; идентификатор версии TR-DOS ??? + _mInfoBLOCK #0B00-$,255 +;!TODO russian charset +ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** INCLUDE 'trdos/tr_msd_2.asz' ; DSS 0E00h,255 ;************************************** -; +;!TODO russian charset ; Русский знакогенератор - 40h..7Fh символы. ; ; DSS 0E00h,255 -; DB 0,0,76,82,114,82,76,0,0,0,56,4,60,68 -; DB 60,0,0,0,120,64,120,68,120,0,0,0,72 -; DB 72,72,72,124,4,0,0,24,40,40,40,124,68 -; DB 0,0,56,68,120,64,60,0,0,16,56,84,84 -; DB 56,16,0,0,0,124,64,64,64,64,0,0,0,68 -; DB 40,16,40,68,0,0,0,68,76,84,100,68,0 -; DB 0,16,68,76,84,100,68,0,0,0,72,80,112 -; DB 72,68,0,0,0,28,36,36,36,68,0,0,0,68 -; DB 108,84,84,68,0,0,0,68,68,124,68,68,0 -; DB 0,0,56,68,68,68,56,0,0,0,124,68,68,68 -; DB 68,0,0,0,60,68,60,36,68,0,0,0,120,68 -; DB 68,120,64,64,0,0,56,64,64,64,56,0,0 -; DB 0,124,16,16,16,16,0,0,0,68,68,60,4,56 -; DB 0,0,0,84,84,56,84,84,0,0,0,120,68,120 -; DB 68,120,0,0,0,64,64,120,68,120,0,0,0 -; DB 68,68,116,76,116,0,0,0,56,68,24,68,56 -; DB 0,0,0,84,84,84,84,124,0,0,0,56,4,28 -; DB 4,56,0,0,0,84,84,84,84,126,2,0,0,68 -; DB 68,60,4,4,0,0,0,96,32,56,36,56,0,0,76 -; DB 82,114,82,82,76,0,0,60,66,66,126,66 -; DB 66,0,0,124,64,124,66,66,124,0,0,68,68 -; DB 68,68,68,126,2,0,24,36,36,36,36,126 -; DB 66,0,126,64,124,64,64,126,0,0,56,84 -; DB 84,56,16,16,0,0,126,64,64,64,64,64,0 -; DB 0,66,36,24,24,36,66,0,0,66,70,74,82 -; DB 98,66,0,0,90,70,74,82,98,66,0,0,68,72 -; DB 112,72,68,66,0,0,30,34,34,34,34,66,0 -; DB 0,66,102,90,66,66,66,0,0,66,66,126,66 -; DB 66,66,0,0,60,66,66,66,66,60,0,0,126 -; DB 66,66,66,66,66,0,0,62,66,66,62,34,66 -; DB 0,0,124,66,66,124,64,64,0,0,60,66,64 -; DB 64,66,60,0,0,254,16,16,16,16,16,0,0 -; DB 66,66,62,2,66,60,0,0,84,84,56,84,84 -; DB 84,0,0,124,66,124,66,66,124,0,0,64,64 -; DB 124,66,66,124,0,0,66,66,114,74,74,114 -; DB 0,0,60,66,12,2,66,60,0,0,84,84,84,84 -; DB 84,124,0,0,60,66,14,2,66,60,0,0,84,84 -; DB 84,84,84,126,2,0,66,66,66,126,2,2,0 -; DB 60,66,153,161,161,153,66,60 + ; DB 0,0,76,82,114,82,76,0,0,0,56,4,60,68 + ; DB 60,0,0,0,120,64,120,68,120,0,0,0,72 + ; DB 72,72,72,124,4,0,0,24,40,40,40,124,68 + ; DB 0,0,56,68,120,64,60,0,0,16,56,84,84 + ; DB 56,16,0,0,0,124,64,64,64,64,0,0,0,68 + ; DB 40,16,40,68,0,0,0,68,76,84,100,68,0 + ; DB 0,16,68,76,84,100,68,0,0,0,72,80,112 + ; DB 72,68,0,0,0,28,36,36,36,68,0,0,0,68 + ; DB 108,84,84,68,0,0,0,68,68,124,68,68,0 + ; DB 0,0,56,68,68,68,56,0,0,0,124,68,68,68 + ; DB 68,0,0,0,60,68,60,36,68,0,0,0,120,68 + ; DB 68,120,64,64,0,0,56,64,64,64,56,0,0 + ; DB 0,124,16,16,16,16,0,0,0,68,68,60,4,56 + ; DB 0,0,0,84,84,56,84,84,0,0,0,120,68,120 + ; DB 68,120,0,0,0,64,64,120,68,120,0,0,0 + ; DB 68,68,116,76,116,0,0,0,56,68,24,68,56 + ; DB 0,0,0,84,84,84,84,124,0,0,0,56,4,28 + ; DB 4,56,0,0,0,84,84,84,84,126,2,0,0,68 + ; DB 68,60,4,4,0,0,0,96,32,56,36,56,0,0,76 + ; DB 82,114,82,82,76,0,0,60,66,66,126,66 + ; DB 66,0,0,124,64,124,66,66,124,0,0,68,68 + ; DB 68,68,68,126,2,0,24,36,36,36,36,126 + ; DB 66,0,126,64,124,64,64,126,0,0,56,84 + ; DB 84,56,16,16,0,0,126,64,64,64,64,64,0 + ; DB 0,66,36,24,24,36,66,0,0,66,70,74,82 + ; DB 98,66,0,0,90,70,74,82,98,66,0,0,68,72 + ; DB 112,72,68,66,0,0,30,34,34,34,34,66,0 + ; DB 0,66,102,90,66,66,66,0,0,66,66,126,66 + ; DB 66,66,0,0,60,66,66,66,66,60,0,0,126 + ; DB 66,66,66,66,66,0,0,62,66,66,62,34,66 + ; DB 0,0,124,66,66,124,64,64,0,0,60,66,64 + ; DB 64,66,60,0,0,254,16,16,16,16,16,0,0 + ; DB 66,66,62,2,66,60,0,0,84,84,56,84,84 + ; DB 84,0,0,124,66,124,66,66,124,0,0,64,64 + ; DB 124,66,66,124,0,0,66,66,114,74,74,114 + ; DB 0,0,60,66,12,2,66,60,0,0,84,84,84,84 + ; DB 84,124,0,0,60,66,14,2,66,60,0,0,84,84 + ; DB 84,84,84,126,2,0,66,66,66,126,2,2,0 + ; DB 60,66,153,161,161,153,66,60 ; ;************************************** ;************************************** - INCLUDE 'trdos/tr_msd_4.asz' - BLOCK #1000 - $,255 + INCLUDE 'trdos/tr_HDD_4.asz' + _mInfoBLOCK #1000 - $,255 ;************************************** - DISPLAY "4k" - AUTO_1000: DB 22,9,5,"Interface one fitted",0 ; @@ -1762,7 +1759,7 @@ AUTO_146F: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_14CB @@ -1802,7 +1799,7 @@ AUTO_14A5: AUTO_14CB: LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -1929,7 +1926,7 @@ AUTO_15DB: RET Z PUSH BC PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD C,(HL) LD B,0 POP HL @@ -1975,7 +1972,7 @@ AUTO_162A: AUTO_1644: LD (ZX_VARS.FL_TYPE),HL PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD C,(HL) LD B,0 POP HL @@ -2019,7 +2016,7 @@ AUTO_1680: LD A,17 AUTO_168F: DEC A - LD (ZX_VARS.L_5D23),A + LD (ZX_VARS.WORK_SPACE.Size),A LD B,A LD C,0 RET @@ -2045,9 +2042,9 @@ CMD_MOVE: LD DE,0900h ADD HL,DE LD (ZX_VARS.VAR_1),HL - LD A,(ZX_VARS.L_5D23) + LD A,(ZX_VARS.WORK_SPACE.Size) SUB 9 - LD (ZX_VARS.L_5D23),A + LD (ZX_VARS.WORK_SPACE.Size),A LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 @@ -2136,7 +2133,7 @@ CMD_MOVE: LD DE,0 LD B,9 CALL WRITE_DISK - LD A,(ZX_VARS.L_5D23) + LD A,(ZX_VARS.WORK_SPACE.Size) ADD A,9 LD B,A LD C,0 @@ -2178,7 +2175,7 @@ AUTO_17A5: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_17DD @@ -2204,7 +2201,7 @@ AUTO_17BA: AUTO_17DD: LD (ZX_VARS.AUTO_5CD3),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -2235,7 +2232,6 @@ AUTO_17F7: AUTO_180D: LDIR RET - DISPLAY "6k" ; ; ; @@ -3170,7 +3166,7 @@ AUTO_1E67: JP R_W_REDIR ;LD (HL),30 ; НЕ исп. !!! - BLOCK #1E70-$,0 + _mInfoBLOCK #1E70-$,0 AUTO_1E70: POP HL POP BC @@ -3342,21 +3338,24 @@ AUTO_1F55: CALL AUTO_1DA9 JP AUTO_01D3 AUTO_1FB9: - DB 1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1 +;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. + DB 1 + DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 + test_d_traks: CALL get_disk_time OR 17 LD B,A - LD A,'2' + LD A,#32 CALL Goto_trk LD A,2 CALL Goto_trk CALL pause_50ms IN A,(FDC_93.Command) AND 4 - LD A,'P' + LD A,#50 JR Z,AUTO_1FE7 - LD A,'(' + LD A,#28 AUTO_1FE7: LD (ZX_VARS.MED_START),A RET @@ -3519,7 +3518,7 @@ AUTO_20E5: xchg_intf1: PUSH AF LD A,(ZX_VARS.BEG_ADRESS) - CP 244 + CP #F4 JR Z,AUTO_211C XOR A LD HL,ZX_VARS.INT_1_VAR @@ -3533,7 +3532,7 @@ xchg_intf1: JR NZ,AUTO_2111 LD DE,AUTO_5E34 AUTO_2111: - LD B,'-' + LD B,#2D AUTO_2113: LD C,(HL) LD A,(DE) @@ -4517,9 +4516,6 @@ AUTO_27ED: DB "Directory full",141 AUTO_27FC: DB "No disk",141 - - DISPLAY "10k" - AUTO_2804: DB "Stream opened",141 AUTO_2812: @@ -5426,19 +5422,20 @@ AUTO_2ECC: RRCA RRCA RRCA - OUT (0FEH),A - LD A,(ZX_VARS.AUTO_5B08) - CP 238 - JR NZ,AUTO_2EF7 + OUT (BorderColor),A + LD A,(ZX_VARS.SWAP_ROM_PRESENCE) ;берем байт из #5B08 + CP #EE ;там #EE? опкод XOR в процедуре переключения банок ROM Basic 48<->128 + ;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. + JR NZ,AUTO_2EF7 ;если нет, то системных переменных 128К нет PUSH BC LD BC,PORT_128 - LD A,(ZX_VARS.AUTO_5B5C) + LD A,(ZX_VARS.COPY_P128) OUT (C),A POP BC AUTO_2EF7: - LD A,(ZX_VARS.K_STATE) + LD A,(ZX_VARS.K_STATE) ;берем флаг прерываний OR A - LD A,201 + LD A,#C9 ;установка переключателя ПЗУ на бейсик LD (ZX_VARS.K_STATE),A JR NZ,AUTO_2F03 EI @@ -5447,7 +5444,7 @@ AUTO_2F03: JP ZX_VARS.K_STATE AUTO_2F07: LD A,(AUTO_4011) - OR 3Ch + OR #3C AUTO_2F0C: OUT (FDC_93.DrvCTRL),A RET @@ -5862,7 +5859,7 @@ AUTO_31C8: ; ; ; - BLOCK #31F3 - $,255 + _mInfoBLOCK #31F3 - $,255 AUTO_31F3: LD HL,(ZX_VARS.CHANS) OR A @@ -5871,7 +5868,7 @@ AUTO_31F3: RET - BLOCK #3200-$,#FF + _mInfoBLOCK #3200-$,#FF INIT_2X80: JP AUTO_106E INIT_2X80_1: @@ -6339,7 +6336,7 @@ EDIT_X00: LD (HL),128 EDIT_X01: RST RST20 ; ввод клавиши - DW 015D4H + DW #15D4 EDIT_X02: CALL BEEP_1 CP 24 @@ -6349,11 +6346,11 @@ EDIT_X02: CP 16 ; от 7 до 16 - ред. строки JR C,EDIT_X04 RST RST20 ; ввод спец символов - DW 00F58H + DW #0F58 JR EDIT_X01 EDIT_X03: RST RST20 ; станд. ввод в буфер редактирования - DW 00F81H + DW #0F81 JR EDIT_X01 EDIT_X04: CP 7 ; на 7 - нет операции @@ -6365,7 +6362,7 @@ EDIT_X04: CP 11 JR Z,EDIT_X01 RST RST20 ; выполнить операцию редактирования - DW 00F92H + DW #0F92 JR EDIT_X01 @@ -6375,32 +6372,29 @@ EDIT_X05: ;****************************************** -RUS_PRINT: - AND '?' - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,ZG_RUS - ADD HL,BC - DB 17 - SUB D - LD E,H - LD BC,RST08 - LDIR - LD A,201 - LD (ZX_VARS.AUTO_5C9A),A - JP ZX_VARS.AUTO_5C9A +;!TODO russian charset +; RUS_PRINT: +; AND #3F +; LD L,A +; LD H,0 +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; LD BC,ZG_RUS +; ADD HL,BC +; LD DE,#5C92 +; LD BC,8 +; LDIR +; LD A,#C9 +; LD (ZX_VARS.AUTO_5C9A),A +; JP ZX_VARS.AUTO_5C9A ;************************************** ; DSS 3900H,'#' ;********************************** - DISPLAY "14k" - - BLOCK #3C00 - $,255 + _mInfoBLOCK #3C00 - $,255 AUTO_3C00: RST R38 JR AUTO_3C06 @@ -6408,18 +6402,18 @@ AUTO_3C00: JR AUTO_3C09 ; ; - BLOCK #3C06 - $,255 + _mInfoBLOCK #3C06 - $,255 AUTO_3C06: JP AUTO_3D00 ; ; - BLOCK #3C09 - $,255 + _mInfoBLOCK #3C09 - $,255 AUTO_3C09: JP AUTO_3D03 ;************************************ ;!FIXIT not used - BLOCK #3C10 - $,255 + _mInfoBLOCK #3C10 - $,255 ;KBD_EXP: LD A,CNF_PORT.ZX_BIOS OUT (CNF_PORT.ON),A @@ -6427,7 +6421,7 @@ AUTO_3C09: ; ;************************************ ;!FIXIT not used - BLOCK #3C18 - $,255 + _mInfoBLOCK #3C18 - $,255 ;KBD_OFF: LD A,CNF_PORT.ZX_BIOS OUT (CNF_PORT.ON),A @@ -6435,14 +6429,14 @@ AUTO_3C09: ;************************************ ;!FIXIT not used - BLOCK #3C20 - $,255 + _mInfoBLOCK #3C20 - $,255 READR_X: CALL get_disk_time LD B,A JP set_side_0 ;************************************ ;!FIXIT not used - BLOCK #3C30 - $,255 + _mInfoBLOCK #3C30 - $,255 IN A,(FDC_93.Command) RET @@ -6525,7 +6519,7 @@ CMD_COPY.FIXED: INC SP JP AUTO_03D9 ;******************************* - BLOCK #3CC0 - $,255 + _mInfoBLOCK #3CC0 - $,255 MAGIC_1: PUSH AF LD A,CNF_PORT.ZX_BIOS @@ -6533,7 +6527,7 @@ MAGIC_1: POP AF JP MAGIC_2 ;******************************* - BLOCK #3CC9 - $,255 + _mInfoBLOCK #3CC9 - $,255 MAGIC_3: PUSH AF LD A,CNF_PORT.ZX_BIOS @@ -6573,17 +6567,17 @@ REDIR_3D13: JP EXP_FNS ; ;***************************** - BLOCK #3CFA - $,255 + _mInfoBLOCK #3CFA - $,255 AUTO_3CFA: JP xchg_intf1 ;****** 3D13 redirection ****** - BLOCK #3CFD - $,255 + _mInfoBLOCK #3CFD - $,255 AUTO_3CFD: JP REDIR_3D13 ; JP AUTO_283C ;***********************************************************************; - BLOCK #3D00-$,#FF + _mInfoBLOCK #3D00-$,#FF AUTO_3D00: NOP @@ -6602,7 +6596,7 @@ AUTO_3D0E: NOP JR AUTO_3CFA ;****** 3D13 point !!! **** - BLOCK #3D13-$,#FF + _mInfoBLOCK #3D13-$,#FF NOP JR AUTO_3CFD AUTO_3D16: @@ -6647,7 +6641,7 @@ AUTO_3D44: AUTO_3D4C: XOR A OUT (FDC_93.DrvCTRL),A - IN A,(#F6) + IN A,(#F6) ; ничего не даёт LD HL,AUTO_3D38 LD DE,ZX_VARS.MEM_BOT LD BC,AUTO_3D38.Size + AUTO_3D44.Size @@ -6663,31 +6657,34 @@ AUTO_3D67: ; PUSH HL LD HL,AUTO_3D2F PUSH HL - LD HL,1655h ;!HARDCODE + LD HL,ZX_VARS.PROG.MAKE_ROOM PUSH HL - LD HL,ZX_VARS.AUTO_5BFF + LD HL,ZX_VARS.TSTACK PUSH HL LD (HL),#C9 ; RET code LD HL,ZX_VARS.P_RAMTOP+1 LD BC,CONT_8+7 RET PRINT_CR: - LD A,13 + LD A,#0D ; enter PRINT_SYM: JP PRINT_RED - RST R38 - RST R38 - NOP - NOP - JP RUS_PRINT - RST R38 - RST R38 - RST R38 - NOP - NOP - RST R38 - RST R38 - RST R38 + + _mInfoBLOCK #3D8F-$,#FF ; ХЕР + DW 0000 ; ЗНАЕТ + _mInfoBLOCK 3,#FF ; ЗАЧЕМ + +;======================================================================= +;!TODO russian charset +; PRINT_CR: +; LD A,#0D ; enter +; PRINT_SYM: +; CP #80 +; JP C,PRINT_RED +; JP RUS_PRINT +;======================================================================= + + AUTO_3D94: RST_ROM ROUTINE.print_a RET @@ -6731,22 +6728,22 @@ SET_DISK: AUTO_3DCE: LD HL,ZX_VARS.PDOS_COPY LD C,A - LD A,3Ch + LD A,#3C OR C OUT (FDC_93.DrvCTRL),A LD (HL),A CALL get_disk_time - AND 128 + AND #80 JR Z,AUTO_3DFA CALL RESET_WG CALL test_disk CALL get_disk_type - CP 255 + CP #FF JR NZ,AUTO_3DFA PUSH HL CALL test_d_traks POP HL - CP 'P' + CP #50 LD A,0 JR NZ,AUTO_3DF9 LD A,128 @@ -6755,7 +6752,7 @@ AUTO_3DF9: AUTO_3DFA: CALL READ_TRK_NUM pause_50ms: - LD A,12 ;'P' + LD A,12 ; #50 pause_1ms: LD C,255 AUTO_3E01: @@ -7081,7 +7078,7 @@ AUTO_3FEC: ;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- - BLOCK #3FF0-$, #FF + _mInfoBLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI ;LD A,SYS_PORT.EXTENSION @@ -7093,7 +7090,7 @@ HD_CMD: PUSH AF ; ;----[ From TR-DOS to API #80..#FF]----- - BLOCK #3FF8-$, #FF + _mInfoBLOCK #3FF8-$, #FF EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;PUSH AF ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать @@ -7108,7 +7105,7 @@ EXP_FNS_PREPARE_RET: ; ; - BLOCK #4000-$, #FF - DISPLAY "16k..ALL!" + _mInfoBLOCK #4000-$, #FF ; - + DISPLAY "\n\rNEW RAMDRV READ = ",/D,NEW_RAMDRV_READ +; \ No newline at end of file diff --git a/SP__48.ASM b/SP__48.ASM index 2762a51..cda53cf 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19096,11 +19096,8 @@ L3BC9: SCF ; Return as if no trailing space JP $0B03 ; PO-FETCH - Return via Position Fetch routine -L3BD2: DEFM "SPECTRU" ; SPECTRUM token - DEFB 'M'+$80 - -L3BDA: DEFM "PLA" ; PLAY token - DEFB 'Y'+$80 +L3BD2: DC "SPECTRUM" ; SPECTRUM token +L3BDA: DC "PLAY" ; PLAY token ;; KP_SCAN2 L3BDE: JP L3C01 ; This is not called from either ROM. It can be used to scan the keypad. diff --git a/Shared_Includes b/Shared_Includes index 713bcf1..4d14c95 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 713bcf1538ff822231da15aed4d8fb7611ebe205 +Subproject commit 4d14c951c21a9e98b8c301bece3f16bd5d5e5cfc diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_HDD_4.ASZ similarity index 66% rename from TRDOS/TR_MSD_4.ASZ rename to TRDOS/TR_HDD_4.ASZ index 41ac92f..d601814 100644 --- a/TRDOS/TR_MSD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -1,36 +1,4 @@ -HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - CP #0D - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ; - -.init: ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; - ;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index be188e1..670fff2 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -446,7 +446,7 @@ FAT_ALL: ;INCLUDE 'trdos/tr_msd_4.asz' ;----------------------------------------------------------------------- - BLOCK #09FF-$, #FF + _mInfoBLOCK #09FF-$, #FF ;родионовский вектор прерывания DW #FFFF ;----------------------------------------------------------------------- @@ -613,6 +613,35 @@ HDD_PROG_E: JP AUTO_03E4 ; -;*************************************************************************** +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + CP #0D + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ; +.init: ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; +;*************************************************************************** \ No newline at end of file diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index c78a596..6a90741 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,4 +1,7 @@ ; + DEFINE NEW_RAMDRV_READ 0 + + DISK_REDIR: PUSH HL PUSH BC @@ -43,7 +46,7 @@ RECALL_MSD: TEST_RAMD: PUSH HL - LD C,#CE ;!HARDCODE BIOS.GET_RAMD_ST + LD C,BIOS.GET_RAMD_ST CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -51,250 +54,7 @@ TEST_RAMD: POP HL RET -; ╔═══════════════════════════════════╗ -; ║ RD/WR SECTOR HL - ZX_VARS.BUFFER ║\ -; ║ ZX_VARS.CONT_SEC - SEC/TRK FOR READ/WRITE ║\ -; ║ COM_RD_WR - команда чтение/запись ║\ -; ║ 0 - чтение, 255 - запись ║\ -; ╚═══════════════════════════════════╝\ -; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -READ_WRITE_RAMD: - -; -; CALL DISK_REDIR -; SUB 4 -; RET C -; CP 16 -; CCF -; RET C -; -; PUSH HL -; LD HL,RAMD_KEYS -; ADD A,L -; LD L,A -; IN A,(SLOT3) -; LD C,A -; LD A,SYS_PAGE -; DI -; OUT (SLOT3),A -; LD L,(HL) -; LD A,C -; OUT (SLOT3),A -; EI -; LD A,L ; 1-st block -; POP HL -; -; AND A -; SCF -; RET Z -; EX AF,AF' -; -; IN A,(RGADR) -; PUSH AF -; -; PUSH HL -; PUSH DE -; PUSH BC -; -; LD DE,(ZX_VARS.CONT_SEC) -; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! -; RRCA -; RRCA -; RRCA -; RRCA -; LD D,A -; AND 0F0H -; OR E -; LD E,A -; LD A,D -; AND 0FH -; LD D,A -; -; LD A,(ZX_VARS.RD_WR_COM) -; AND A -; JR Z,RAMD_READ -; PUSH AF -; LD A,0C0H -; OUT (RGADR),A -; POP AF -;RAMD_READ: -; -; POP BC -; PUSH BC -; LD C,0C8H -; DI -; EX AF,AF' -; CALL EXP_FNS ; чтение/запись RAM-Disk -; EI -; POP BC -; POP DE -; POP HL -; POP AF -; OUT (RGADR),A -; LD DE,(ZX_VARS.CONT_SEC) -; -; LD A,B -; -;RAMD_TRK_CONT: -; SUB 16 -; JR C,RAMD_NO_TRK -; INC D -; JR RAMD_TRK_CONT -; -;RAMD_NO_TRK: -; ADD A,16 -; ADD A,E -; CP 16 -; JR C,RAMD_NO_TRK1 -; SUB 16 -; INC D -;RAMD_NO_TRK1: -; LD E,A -; -; LD A,H -; ADD A,B -; LD H,A -; -; LD B,0 -; -; LD (ZX_VARS.CONT_SEC),DE -; AND A -; RET -; -; - - - - INC B -WD_WR_RAMD_LOOP: - DEC B - RET Z - PUSH BC - PUSH HL - CALL RD_WR_1SEC - POP HL - CALL RAMD_NEXT_SEC - POP BC - JR WD_WR_RAMD_LOOP - -RAMD_NEXT_SEC: - PUSH HL - LD HL,ZX_VARS.CONT_SEC - LD A,16 - INC (HL) - CP (HL) - JR NZ,RAMD_NEXT_1 - LD (HL),0 - INC HL - INC (HL) -RAMD_NEXT_1: - POP HL - LD BC,0100h - ADD HL,BC - RET - -RD_WR_1SEC: - LD DE,(ZX_VARS.CONT_SEC) - CALL PAGE_CALC2 - DI - LD A,(ZX_VARS.RD_WR_COM) - AND 0C0H - OUT (RGADR),A - LD A,H - CP 0A0H - LD A,(ZX_VARS.RD_WR_COM) - LD E,0 - LD D,C - SET 6,D - JR C,RD_WR_C000 - -RD_WR_4000: - RES 7,D ; DE - адрес данных RAMD - LD C,SLOT1 - EX AF,AF' - IN A,(C) - EX AF,AF' - OUT (C),B -;****** ПЕРЕМЕЩЕНИЕ ДАННЫХ ***** - LD BC,100H - AND A - JR NZ,MOVE_NOT_EX3 - EX DE,HL -MOVE_NOT_EX3: - LDIR ; работать здесь же, в TR-DOS !!! - AND A - JR NZ,MOVE_NOT_EX4 - EX DE,HL -MOVE_NOT_EX4: -;******************************* - EX AF,AF' - OUT (SLOT1),A - EX AF,AF' -; RET_PAGE1 -MOVE_RET: - LD A,0 - OUT (RGADR),A - EI - RET - -RD_WR_C000: - SET 7,D - LD C,SLOT3 - EX AF,AF' - IN A,(C) - EX AF,AF' - OUT (C),B -;****** ПЕРЕМЕЩЕНИЕ ДАННЫХ ***** - LD BC,100H - AND A - JR NZ,MOVE_NOT_EX1 - EX DE,HL -MOVE_NOT_EX1: - LDIR ; работать здесь же, в TR-DOS !!! - AND A - JR NZ,MOVE_NOT_EX2 - EX DE,HL -MOVE_NOT_EX2: -;******************************* - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' -; RET_PAGE3 - JR MOVE_RET - -;********************************************** -PAGE_CALC2: - LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! - RRCA - RRCA - RRCA - RRCA - LD D,A - AND #F0 - OR E - LD E,A - LD A,D - AND #0F - LD D,A - PUSH HL - LD C,BIOS.RAMD_CALC_PAGE - CALL DISK_REDIR - SUB 4 - CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; - LD B,A - LD C,H - POP HL - ;EI - RET NC - JP ERROR_DISK - - - -;********************************************* RAMD_X12: ; проверка диска LD (ZX_VARS.OPER_DISK),A CALL DISK_REDIR @@ -326,7 +86,7 @@ RAMD_X14: ; FORMATING DISK_FORM: LD A,(ZX_VARS.MED_START+1) - CP 14H + CP #14 JR Z,QVICK_FORMAT POP HL POP BC @@ -349,7 +109,7 @@ RAMD_FORMAT: POP HL POP BC POP AF - LD B,28H ; размер 640K + LD B,#28 ; размер 640K CALL DISK_REDIR SUB 4 @@ -358,7 +118,7 @@ RAMD_FORMAT: Q_FORM_1: LD HL,ZX_VARS.BUFFER ; CLEAR DISK ZX_VARS.BUFFER LD DE,ZX_VARS.BUFFER+1 - LD BC,0FFh + LD BC,#FF LD (HL),0 LDIR @@ -481,4 +241,353 @@ RAMD_SYM: RAMD_SYM_OK: POP AF RET + ; +;======================================================================- +; READ_WRITE_RAMD: +; +; CALL DISK_REDIR +; SUB 4 +; RET C +; CP 16 +; CCF +; RET C +; +; PUSH HL +; LD HL,RAMD_KEYS +; ADD A,L +; LD L,A +; IN A,(SLOT3) +; LD C,A +; LD A,SYS_PAGE +; DI +; OUT (SLOT3),A +; LD L,(HL) +; LD A,C +; OUT (SLOT3),A +; EI +; LD A,L ; 1-st block +; POP HL +; +; AND A +; SCF +; RET Z +; EX AF,AF' +; +; IN A,(RGADR) +; PUSH AF +; +; PUSH HL +; PUSH DE +; PUSH BC +; +; LD DE,(ZX_VARS.CONT_SEC) +; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! +; RRCA +; RRCA +; RRCA +; RRCA +; LD D,A +; AND 0F0H +; OR E +; LD E,A +; LD A,D +; AND 0FH +; LD D,A +; +; LD A,(ZX_VARS.RD_WR_COM) +; AND A +; JR Z,RAMD_READ +; PUSH AF +; LD A,0C0H +; OUT (RGADR),A +; POP AF +;RAMD_READ: +; +; POP BC +; PUSH BC +; LD C,0C8H +; DI +; EX AF,AF' +; CALL EXP_FNS ; чтение/запись RAM-Disk +; EI +; POP BC +; POP DE +; POP HL +; POP AF +; OUT (RGADR),A +; LD DE,(ZX_VARS.CONT_SEC) +; +; LD A,B +; +;RAMD_TRK_CONT: +; SUB 16 +; JR C,RAMD_NO_TRK +; INC D +; JR RAMD_TRK_CONT +; +;RAMD_NO_TRK: +; ADD A,16 +; ADD A,E +; CP 16 +; JR C,RAMD_NO_TRK1 +; SUB 16 +; INC D +;RAMD_NO_TRK1: +; LD E,A +; +; LD A,H +; ADD A,B +; LD H,A +; +; LD B,0 +; +; LD (ZX_VARS.CONT_SEC),DE +; AND A +; RET +;======================================================================- + + + + +;*********************************************************************** +READ_WRITE_RAMD: + + IFN NEW_RAMDRV_READ + + +; ╔═══════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFFER ║\ +; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD_WR_COM - команда чтение/запись ║\ +; ║ 0 - чтение, 255 - запись ║\ +; ╚═══════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + INC B +WD_WR_RAMD_LOOP: + DEC B + RET Z + PUSH BC + PUSH HL + CALL RD_WR_1SEC + POP HL + CALL RAMD_NEXT_SEC + POP BC + JR WD_WR_RAMD_LOOP + +RAMD_NEXT_SEC: + PUSH HL + LD HL,ZX_VARS.CONT_SEC + LD A,16 + INC (HL) + CP (HL) + JR NZ,.RAMD_NEXT_1 + LD (HL),0 + INC HL + INC (HL) +.RAMD_NEXT_1: + POP HL + LD BC,#100 + ADD HL,BC + RET + +RD_WR_1SEC: + LD DE,(ZX_VARS.CONT_SEC) + CALL PAGE_CALC2 + DI + LD A,(ZX_VARS.RD_WR_COM) + AND #C0 + OUT (RGADR),A + LD A,H + CP #A0 + LD A,(ZX_VARS.RD_WR_COM) + LD E,0 + LD D,C + SET 6,D + JR C,.RD_WR_C000 + ;RD_WR_4000: + RES 7,D ; DE - адрес данных RAMD + LD C,SLOT1 + EX AF,AF' + IN A,(C) + EX AF,AF' + OUT (C),B + ; ПЕРЕМЕЩЕНИЕ ДАННЫХ + LD BC,#100 + AND A + JR NZ,.MOVE_NOT_EX3 + EX DE,HL +.MOVE_NOT_EX3: + LDIR ; работать здесь же, в TR-DOS !!! + AND A + JR NZ,.MOVE_NOT_EX4 + EX DE,HL +.MOVE_NOT_EX4: + ;******************* + EX AF,AF' + OUT (SLOT1),A + EX AF,AF' +; RET_PAGE1 +.MOVE_RET: + LD A,0 + OUT (RGADR),A + EI + RET +.RD_WR_C000: + SET 7,D + LD C,SLOT3 + EX AF,AF' + IN A,(C) + EX AF,AF' + OUT (C),B + ; ПЕРЕМЕЩЕНИЕ ДАННЫХ + LD BC,#100 + AND A + JR NZ,.MOVE_NOT_EX1 + EX DE,HL +.MOVE_NOT_EX1: + LDIR ; работать здесь же, в TR-DOS !!! + AND A + JR NZ,.MOVE_NOT_EX2 + EX DE,HL + ;******************** +.MOVE_NOT_EX2: + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' +; RET_PAGE3 + JR .MOVE_RET + +;********************************************** +PAGE_CALC2: + LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + PUSH HL + LD C,BIOS.RAMD_CALC_PAGE + CALL DISK_REDIR + SUB 4 + CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; + LD B,A + LD C,H + POP HL + ;EI + RET NC + JP ERROR_DISK +;******************************************** + + ELSE + +;******************************************** +; ╔═══════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFFER ║\ +; ║ B - Number of sectors ║\ +; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD_WR_COM - команда чтение/запись ║\ +; ║ 0 - чтение, 255 - запись ║\ +; ╚═══════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + PUSH HL + PUSH BC + ;Get RAM Block ID + LD A,(ZX_VARS.OPER_DISK) + AND 3 + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + JP C,.ERROR + SUB 4 + LD C,BIOS.GET_RAMD_ST + CALL EXP_FNS + JP C,.ERROR + ; A = RAM Block ID + EX AF,AF' + ; + POP BC + LD C,B + ; !TEST накручиваем счётчик r/w секторов + LD HL,(ZX_VARS.CONT_SEC) + LD A,16 + INC C +.loop: DEC C + JR Z,.next + INC L + CP L + JR NZ,.loop + INC H + LD L,0 + JR .loop +.next: ; + ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ + LD DE,(ZX_VARS.CONT_SEC) + LD A,D + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + ; + EX (SP),HL + ; Get command r/w + LD A,(ZX_VARS.RD_WR_COM) + EX AF,AF' + LD C,BIOS.BLK_RD_WR + CALL EXP_FNS + POP HL + JP C,AUTO_3EE7 + ; сохраняем накрученный счётчик + LD (ZX_VARS.CONT_SEC),HL + RET + +.ERROR: POP BC + POP HL + JP AUTO_3EE7 ;Disk error +; ╔════════════════════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFER ║\ +; ║ DE - ABS sector в 256b блоках ║\ +; ║ B - число данных в 256b блоках ║\ +; ║ A - block RAM ║\ +; ║ A' - команда чтение/запись/чтение ROM Disk ║\ +; ║ 0 - read, 255 - write, 70 - read ROM DISK ║\ +; ║ ** NOT USED TR-DOS VARS ** ║\ +; ╚════════════════════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + +; RAMD_NEXT_SEC: +; PUSH HL +; LD HL,ZX_VARS.CONT_SEC +; LD A,16 +; INC (HL) +; CP (HL) +; JR NZ,.RAMD_NEXT_1 +; LD (HL),0 +; INC HL +; INC (HL) +; .RAMD_NEXT_1: +; POP HL +; LD BC,#100 +; ADD HL,BC +; RET + + ENDIF +;*********************************************************************** From 2ed9d1a06efb0aa48b94955401877a6600a958f4 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 2 Feb 2024 01:19:53 +1000 Subject: [PATCH 047/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 4d14c95..b5606d6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4d14c951c21a9e98b8c301bece3f16bd5d5e5cfc +Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 From 423b79ef306d883ed5ac9e8b05f2123f157a0f89 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 6 Feb 2024 23:50:14 +1000 Subject: [PATCH 048/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index b5606d6..f74ae7e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 +Subproject commit f74ae7e760de5541ee4966d509442c6421225c3b diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 6819648..c17e924 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -583,7 +583,7 @@ READ_BPB: LD HL,0 LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A - LD A,0 + LD A,L .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,0 @@ -615,6 +615,7 @@ READ_BPB: SCF EI RET + ; .ERROR_MSDOS: LD HL,MSG_3 JP AUTO_03E4 From 492f998a143d7ffeb3e1ddeb7602a6ae0d5dea8a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 13 Feb 2024 00:18:33 +1000 Subject: [PATCH 049/114] ... --- SP_TRDOS.ASM | 58 +++++++++++++++++++--------------------------- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 4 ++-- TRDOS/TR_MSD_S.ASZ | 27 +++++++++++---------- TRDOS/TR_RMD_S.ASZ | 8 +++++-- ZX_EXP/EXP_HDD.ASM | 3 --- 6 files changed, 48 insertions(+), 54 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 735d468..68810b3 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -67,17 +67,14 @@ AUTO_C308 EQU #C308 AUTO_C916 EQU #C916 AUTO_FE15 EQU #FE15 AUTO_FF00 EQU #FF00 -AUTO_FFFF EQU #FFFF ;**************************************** START: DI LD DE,#FFFF LD A,7 JR CONT_1 -RST08: - NOP -CONT_1: - OUT (#FE),A +RST08: NOP +CONT_1: OUT (#FE),A LD A,'?' JR CONT_2 @@ -158,10 +155,7 @@ CONT_7: PUSH HL LD HL,#3D2F PUSH HL - LD HL,#B8ED - -//////////////////////////////////////////////////////////////////////// - _mInfoBLOCK #64-$,0 + LD HL,#B8ED ;код команды LDDR AUTO_0064: JR CONT_8 //////////////////////////////////////////////////////////////////////// @@ -1579,7 +1573,7 @@ AUTO_12D9: CALL AUTO_115D POP HL PUSH HL - LD BC,RST08 + LD BC,8 ADD HL,BC AUTO_1303: LD A,(HL) @@ -2147,7 +2141,7 @@ AUTO_1775: CALL AUTO_03FD LD HL,ZX_VARS.FL_NAME LD DE,ZX_VARS.DISK_NAME - LD BC,RST08 + LD BC,8 LDIR CALL AUTO_1E43 JP AUTO_03E1 @@ -2645,14 +2639,11 @@ CMD_SAVE: LD HL,ZX_VARS.FL_TYPE JR AUTO_1B1F AUTO_1AF8: - CP 170 + CP ZX_Token.screen_dollar JR NZ,AUTO_1B0D - LD HL,AUTO_4000 - DB 34 -AUTO_1B00: - RST RST10 - LD E,H - LD HL,AUTO_1B00 + LD HL,AUTO_4000 ;начало файла - #4000 + LD (#5CD7),HL + LD HL,#1B00 ;его длина - #1B00 байтов LD (ZX_VARS.DOS_CH_ADR),HL LD (ZX_VARS.MED_LEN),HL JR AUTO_1B48 @@ -3301,12 +3292,12 @@ AUTO_1F55: LD (ZX_VARS.CODE_10H),A LD HL,ZX_VARS.DISK_MRK_1 LD DE,ZX_VARS.DISK_ALT_NM - LD BC,RST08 + LD BC,8 LD (HL),' ' LDIR LD HL,ZX_VARS.FL_NAME LD DE,ZX_VARS.DISK_NAME - LD BC,RST08 + LD BC,8 LDIR CALL set_side_0 LD B,1 @@ -4775,7 +4766,7 @@ AUTO_2A2B: DZ " File(s)", 141 AUTO_2A35: LD HL,AUTO_2A41 LD DE,AUTO_4080 - LD BC,RST20 + LD BC,20 LDIR RET ; @@ -4783,7 +4774,7 @@ AUTO_2A35: ; AUTO_2A41: LD A,(AUTO_03B5) - CP 243 + CP #F3 LD A,16 JR Z,AUTO_2A4B XOR A @@ -4836,7 +4827,7 @@ AUTO_2A56: CALL AUTO_2D73 POP HL PUSH HL - LD DE,RST08 + LD DE,8 CALL AUTO_2F1B LD HL,AUTO_40E3 LD A,(HL) @@ -4854,7 +4845,7 @@ AUTO_2A56: SBC HL,DE LD (AUTO_40E5),HL LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2D73 POP HL LD DE,(AUTO_40E1) @@ -4864,11 +4855,11 @@ AUTO_2A56: POP DE CALL AUTO_2D4C PUSH DE - LD A,3Ch + LD A,#3C OUT (FDC_93.DrvCTRL),A CALL AUTO_2F65 LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 LD B,1 CALL AUTO_2F1B POP DE @@ -4876,7 +4867,7 @@ AUTO_2A56: LD (AUTO_40E1),DE PUSH HL LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 LD B,1 CALL AUTO_2D73 LD A,(AUTO_40E4) @@ -5179,12 +5170,12 @@ AUTO_2D1E: RET AUTO_2D2A: LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2F1B RET AUTO_2D34: LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2D73 RET AUTO_2D3E: @@ -5192,14 +5183,14 @@ AUTO_2D3E: LD C,D CALL AUTO_2F3A LD HL,AUTO_C000 - LD B,'@' + LD B,#40 JR AUTO_2D58 AUTO_2D4C: CALL AUTO_2F65 LD C,D CALL AUTO_2F3A LD HL,AUTO_4000 - LD B,192 + LD B,#C0 AUTO_2D58: PUSH BC PUSH DE @@ -6451,8 +6442,8 @@ NEW_NAME: ;***************************** ;FORMATER: -; LD DE,(ZX_VARS.E_LINE) ; LD HL,TX_FORMAT +; LD DE,(ZX_VARS.E_LINE) ; LD BC,LEN_TX_F ; LDIR ; EX DE,HL @@ -7081,8 +7072,7 @@ AUTO_3FEC: _mInfoBLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI - ;LD A,SYS_PORT.EXTENSION - LD A,1 + LD A,SYS_PORT.EXTENSION OUT (SYS_PORT.ROM),A POP AF RET diff --git a/Shared_Includes b/Shared_Includes index f74ae7e..68bdeeb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f74ae7e760de5541ee4966d509442c6421225c3b +Subproject commit 68bdeebdecb62a68058d57f255ab646a4eb50512 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index b6278be..6800937 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -41,7 +41,7 @@ MSDOS_TEST_FL: AND A SCF RET Z ; КОНЕЦ КАТАЛОГА - CP 0E5H + CP #E5 SCF CCF ; DEC A ; СТЕРТЫЙ ФАЙЛ @@ -50,7 +50,7 @@ MSDOS_TEST_FL: ;********************************** MSDOS_NEXT_FL: PUSH DE - LD DE,20H + LD DE," " ADD HL,DE DI IN A,(SLOT3) diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index c17e924..84e70e4 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -129,7 +129,6 @@ PREPARE1: EI CALL Z,RES_1440 CALL NZ,SET_1440 - CALL CALC_SECTOR LD (ZX_VARS.CONT_SEC),DE LD A,(ZX_VARS.RD_WR_COM) @@ -346,9 +345,13 @@ SWITCH_DT: LD A,C OUT (SLOT2),A EI - CALL Z,RES_1440 - CALL NZ,SET_1440 - RET + ;!TEST + ;CALL Z,RES_1440 + ;CALL NZ,SET_1440 + ;RET + JR Z,RES_1440 + JR SET_1440 + ; NO_SW_DT: LD A,C OUT (SLOT2),A @@ -362,7 +365,7 @@ MSD_3FBA: LD B,4 MSD_3FBC: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR NZ,MSD_3FD1 INC DE LD A,E @@ -373,7 +376,7 @@ MSD_RET_IX: JP (IX) MSD_3FCA: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR Z,MSD_3FCA JP M,MSD_RET_IX MSD_3FD1: @@ -386,7 +389,7 @@ MSD_3FD5: LD B,4 MSD_3FD7: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR NZ,MSD_3FEC INC DE LD A,E @@ -397,7 +400,7 @@ MSD_RET_IX2: JP (IX) MSD_3FE5: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR Z,MSD_3FE5 JP M,MSD_RET_IX2 MSD_3FEC: @@ -408,13 +411,13 @@ MSD_3FEC: ;**************************************** RES_1440: - LD A,01h - OUT (0BDh),A + LD A,FDD_Density.SET_720 + OUT (FDD_Density),A RET SET_1440: - LD A,21h - OUT (0BDh),A + LD A,FDD_Density.SET_1440 + OUT (FDD_Density),A RET READ_BPB: diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 6a90741..567e1ab 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -396,8 +396,11 @@ RD_WR_1SEC: LD DE,(ZX_VARS.CONT_SEC) CALL PAGE_CALC2 DI - LD A,(ZX_VARS.RD_WR_COM) - AND #C0 + ;!TEST + ;LD A,(ZX_VARS.RD_WR_COM) + ;AND #C0 + LD A,#C0 + ; OUT (RGADR),A LD A,H CP #A0 @@ -434,6 +437,7 @@ RD_WR_1SEC: OUT (RGADR),A EI RET + ; .RD_WR_C000: SET 7,D LD C,SLOT3 diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index 98d15c0..eb89e41 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -46,7 +46,6 @@ HD_CMD_X: ; C - COMAND ( 5 - RD, 6 - WR ) RET HD_BPB_PREP: - LD D,A IN A,(SLOT3) EX AF,AF' @@ -395,9 +394,7 @@ TEST_HDD_DRV: RET HD_CMD_0: - POP AF - LD BC,IDE.Write.DeviceHead LD A,0A0H OUT (C),A From 914bb82468340d43be2ddb95c4b4a669f056c030 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 20 Feb 2024 19:15:00 +1000 Subject: [PATCH 050/114] ... --- Shared_Includes | 2 +- TRDOS/TR_RMD_S.ASZ | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 68bdeeb..dbf3e86 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68bdeebdecb62a68058d57f255ab646a4eb50512 +Subproject commit dbf3e86b6290d71e5789cabf7af6981a5a42db0e diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 567e1ab..cc63735 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -355,10 +355,10 @@ READ_WRITE_RAMD: IFN NEW_RAMDRV_READ - ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ +; ║ B - Number of sectors ║\ ; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ RD_WR_COM - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ From 74cf21127bdf4e12b66b0123bd3bd4f582cddb83 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 22 Feb 2024 01:08:38 +1000 Subject: [PATCH 051/114] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20READ=5FWR?= =?UTF-8?q?ITE=5FRAMD=20=D0=BD=D0=B0=20BIOS=20(BLK=5FRD=5FWR)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TRDOS/TR_MSD_S.ASZ | 13 +++++++++---- TRDOS/TR_RMD_S.ASZ | 36 +++++++++++++++++------------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 84e70e4..cd4e27e 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -94,14 +94,19 @@ MSD_R_W_UT: MSD_cmd4: PUSH HL - PUSH AF + ;PUSH AF ;!TEST 21/2/2024 CALL RESET_WG - POP AF + ;POP AF ;!TEST 21/2/2024 POP HL LD B,1 - LD DE,0 + ;!TEST 21/2/2024 + ; LD DE,0 + XOR A + LD D,A + LD E,A MSD_cmd5: - LD A,0 + ; LD A,0 + ; A=0 LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index cc63735..c89774e 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,5 +1,5 @@ ; - DEFINE NEW_RAMDRV_READ 0 + DEFINE NEW_RAMDRV_READ 1 DISK_REDIR: @@ -352,9 +352,7 @@ RAMD_SYM_OK: ;*********************************************************************** READ_WRITE_RAMD: - IFN NEW_RAMDRV_READ - ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ @@ -365,18 +363,18 @@ READ_WRITE_RAMD: ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INC B -WD_WR_RAMD_LOOP: +.WD_WR_RAMD_LOOP: DEC B RET Z PUSH BC PUSH HL - CALL RD_WR_1SEC + CALL .RD_WR_1SEC POP HL - CALL RAMD_NEXT_SEC + CALL .RAMD_NEXT_SEC POP BC - JR WD_WR_RAMD_LOOP + JR .WD_WR_RAMD_LOOP -RAMD_NEXT_SEC: +.RAMD_NEXT_SEC: PUSH HL LD HL,ZX_VARS.CONT_SEC LD A,16 @@ -392,15 +390,12 @@ RAMD_NEXT_SEC: ADD HL,BC RET -RD_WR_1SEC: +.RD_WR_1SEC: LD DE,(ZX_VARS.CONT_SEC) - CALL PAGE_CALC2 + CALL .PAGE_CALC2 DI - ;!TEST - ;LD A,(ZX_VARS.RD_WR_COM) - ;AND #C0 - LD A,#C0 - ; + LD A,(ZX_VARS.RD_WR_COM) + AND #C0 OUT (RGADR),A LD A,H CP #A0 @@ -460,11 +455,10 @@ RD_WR_1SEC: EX AF,AF' OUT (SLOT3),A EX AF,AF' -; RET_PAGE3 + ; RET_PAGE3 JR .MOVE_RET - -;********************************************** -PAGE_CALC2: + ; +.PAGE_CALC2: LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! RRCA RRCA @@ -505,6 +499,10 @@ PAGE_CALC2: ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + INC B + DEC B + RET Z + ; PUSH HL PUSH BC ;Get RAM Block ID From 360a049cb5526a80ba6967021a4f31b42854737a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 22 Feb 2024 01:09:52 +1000 Subject: [PATCH 052/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index dbf3e86..215d0f3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit dbf3e86b6290d71e5789cabf7af6981a5a42db0e +Subproject commit 215d0f3c90865dd2c4c0d92d17e64513a0b0407e From cc0aa06b0d360137ecb80304af846372fe2252bb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Feb 2024 00:56:27 +1000 Subject: [PATCH 053/114] -bug in READ_WRITE_RAMD --- ProfRom_Disasm/!AllConst.asm | 226 - ProfRom_Disasm/!RomDisk.asm | 50 - ProfRom_Disasm/!ram8.asm | 1248 --- ProfRom_Disasm/!roms.mac | 56 - ProfRom_Disasm/ROM_MAP.TXT | 38 - ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin | Bin 12800 -> 0 bytes ProfRom_Disasm/prof_roms/rom4_fnt.bin | Bin 1211 -> 0 bytes ProfRom_Disasm/prof_roms/rom4_vars.bin | Bin 371 -> 0 bytes ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin | Bin 3328 -> 0 bytes ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin | Bin 11776 -> 0 bytes ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin | Bin 6912 -> 0 bytes ProfRom_Disasm/prof_roms/rom7_data4CRC.bin | Bin 512 -> 0 bytes ProfRom_Disasm/rom0.a80 | 10229 ------------------ ProfRom_Disasm/rom0.bat | 4 - ProfRom_Disasm/rom2.bat | 4 - ProfRom_Disasm/rom2_SrvMon.a80 | 10349 ------------------- ProfRom_Disasm/rom3.bat | 5 - ProfRom_Disasm/rom3_trdos.a80 | 7187 ------------- ProfRom_Disasm/rom4.a80 | 1082 -- ProfRom_Disasm/rom4.bat | 4 - ProfRom_Disasm/rom5.a80 | 7671 -------------- ProfRom_Disasm/rom5.bat | 4 - ProfRom_Disasm/rom6.a80 | 2902 ------ ProfRom_Disasm/rom6.bat | 4 - ProfRom_Disasm/rom7.a80 | 5903 ----------- ProfRom_Disasm/rom7.bat | 4 - SP_128.ASM | 2 +- TRDOS/TR_MSD_3.ASZ | 11 +- TRDOS/TR_RMD_S.ASZ | 117 +- 29 files changed, 84 insertions(+), 47016 deletions(-) delete mode 100755 ProfRom_Disasm/!AllConst.asm delete mode 100755 ProfRom_Disasm/!RomDisk.asm delete mode 100755 ProfRom_Disasm/!ram8.asm delete mode 100755 ProfRom_Disasm/!roms.mac delete mode 100644 ProfRom_Disasm/ROM_MAP.TXT delete mode 100755 ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom4_fnt.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom4_vars.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom7_data4CRC.bin delete mode 100755 ProfRom_Disasm/rom0.a80 delete mode 100755 ProfRom_Disasm/rom0.bat delete mode 100755 ProfRom_Disasm/rom2.bat delete mode 100755 ProfRom_Disasm/rom2_SrvMon.a80 delete mode 100755 ProfRom_Disasm/rom3.bat delete mode 100755 ProfRom_Disasm/rom3_trdos.a80 delete mode 100755 ProfRom_Disasm/rom4.a80 delete mode 100755 ProfRom_Disasm/rom4.bat delete mode 100755 ProfRom_Disasm/rom5.a80 delete mode 100755 ProfRom_Disasm/rom5.bat delete mode 100755 ProfRom_Disasm/rom6.a80 delete mode 100755 ProfRom_Disasm/rom6.bat delete mode 100755 ProfRom_Disasm/rom7.a80 delete mode 100755 ProfRom_Disasm/rom7.bat diff --git a/ProfRom_Disasm/!AllConst.asm b/ProfRom_Disasm/!AllConst.asm deleted file mode 100755 index a865920..0000000 --- a/ProfRom_Disasm/!AllConst.asm +++ /dev/null @@ -1,226 +0,0 @@ - -romROMx0073 equ #0073 ;загрузка блока из ROM-Disk - -rom0_x1B11 equ #1B11 ;автостарт с диска -rom0_x259F equ #259F ; - -rom2_x0000 equ #0000 ;запись байта в память пользователя (rst #00) -rom2_x0028 equ #0028 ;чтение байта из памяти пользователя -rom2_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=0 -rom2_x013A equ #013A ;выход из монитора -rom2_x03A7 equ #03A7 ;Запись регистра AY -rom2_x03B6 equ #03B6 ;чтение регистра AY -rom2_x04CE equ #04CE ;восстановление Турбо-режима -rom2_x04D5 equ #04D5 ;включение Турбо-режима -rom2_x05A1 equ #05A1 ;????????? -rom2_x0603 equ #0603 ;копирование памяти с #8000 в страницу пользователя -rom2_x0606 equ #0606 ;копирование страницы пользователя в #8000 -rom2_x0665 equ #0665 ;включение режима 48k only -rom2_x0749 equ #0749 ;восстановление области памяти из ram 8 -rom2_x0753 equ #0753 ;сохранение области памяти в ram 8 -rom2_x08D7 equ #08D7 ; печать текущего меню монитора -rom2_x0B06 equ #0B06 ;ввод и обработка команды отладчика -rom2_x0D42 equ #0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D -rom2_x0D46 equ #0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D -rom2_x0DF4 equ #0DF4 ;преобразование строки в число -rom2_x0E73 equ #0E73 ;деление bc=hl/de с проверкой de на ноль -rom2_x0E85 equ #0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -rom2_x0EE3 equ #0EE3 ;поиск в буфере ввода строки первого печатного символа -rom2_x15B3 equ #15B3 ;печать сообщения из hl длиной b -rom2_x15B9 equ #15B9 ;печать сообщения из hl с заменой непечатных символов на ? -rom2_x15D0 equ #15D0 ;печать сообщения по номеру (на экран/в буфер) -rom2_x15DB equ #15DB ;печать сообщения из hl -rom2_x15F3 equ #15F3 ;печать нескольких пробелов (в B) -rom2_x1612 equ #1612 ;печать числа в hl (dec/hex) с префиксом -rom2_x1629 equ #1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом -rom2_x162C equ #162C ;печать числа в заданной системе счисления -rom2_x165E equ #165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -rom2_x1661 equ #1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -rom2_x1669 equ #1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами -rom2_x166E equ #166E ;печать десятичного числа bc [0..65535] с ведущими пробелами -rom2_x1673 equ #1673 ;печать числа bc (на экран/в буфер) -rom2_x16AA equ #16AA ;деление bc=ac/de -rom2_x16DE equ #16DE ;печать числа hl=[#0000..#FFFF] -rom2_x16E3 equ #16E3 ;печать числа a=[#00..#FF] -rom2_x16EC equ #16EC ;печать числа a=[#0..#F] -rom2_x2800 equ #2800 ;печать символа в окне -rom2_x28F6 equ #28F6 ;мигание текстового курсора в строке ввода -rom2_x28B8 equ #28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) -rom2_x28E8 equ #28E8 ;печать/удаление курсора в окне -rom2_x2969 equ #2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей -rom2_x298E equ #298E ;скроллинг окна вверх -rom2_x2A1B equ #2A1B ;обработка управляющего кода #1E (скроллинг окна ввниз) -rom2_x2A5E equ #2A5E ;обработка управляющего кода #0C (очистка текущего окна) -rom2_x2A85 equ #2A85 ;очистка знакоместной строки по координатам курсора -rom2_x2B0B equ #2B0B ;печать символа со сбросом 7го бита (rst #10) -rom2_x2B10 equ #2B10 ;печать пробела (rst #10) -rom2_x2B12 equ #2B12 ;печать символа (rst #10) -rom2_x2C4D equ #2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -rom2_x2E3D equ #2E3D ;печать дампа памяти в окне -rom2_x2E76 equ #2E76 ;удаление курсора на предыдущей ячейке дампа -rom2_x2EBA equ #2EBA ;печать одной строки дампа памяти (8 байт) -rom2_x2F74 equ #2F74 ;вывод дисасма памяти по адресу в de -rom2_x2FED equ #2FED ;печать пробелов до правого края окна -rom2_x2FF1 equ #2FF1 ;печать пробелов до заданной координаты X -rom2_x2FFB equ #2FFB ;установка текущим окна: ввод числа -rom2_x3005 equ #3005 ;установка текущим окна: main menu -rom2_x300F equ #300F ;чтение содержимого регистра ix основной программы -rom2_x3014 equ #3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана -rom2_x3019 equ #3019 ;ix = адрес дескриптора окна монитора: дамп памяти -rom2_x301C equ #301C ;ix = адрес дескриптора окна монитора из hl -rom2_x3107 equ #3107 ;запись области памяти в файл -rom2_x3201 equ #3201 ;печать ON/OFF от флага nz-ON/z-OFF -rom2_x3210 equ #3210 ;определение адреса ловушки -rom2_x35D3 equ #35D3 ;сравнение ix=xE075 -rom2_x35E0 equ #35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -rom2_x36C3 equ #36C3 ;запись стандартного Magic-файла -rom2_x36F9 equ #36F9 ;получение номера логической страницы пользователя a=[#0..#F] -rom2_x3707 equ #3707 ;сравнение страницы пользователя с заданной -rom2_x3732 equ #3732 ;установка страницы пользователя равной номеру страницы в L -rom2_x37B9 equ #37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) -rom2_x3807 equ #3807 ;пауза 40416t -rom2_x382E equ #382E ;ожидание отжатия всех клавиш -rom2_x3870 equ #3870 ;печать сообщения и продолжение работы текущего меню монитора -rom2_x3A21 equ #3A21 ;копирование активного экрана пользователя в #4000 -rom2_x3A4E equ #3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -rom2_x3A95 equ #3A95 ;подготовка переменных к выводу на экран/принтер -rom2_x3B75 equ #3B75 ;определение типа прерываний im 1/2 -rom2_x3EE6 equ #3EE6 ;названия месяцев -rom2_x3F0A equ #3F0A ;Названия дней недели - -rom3_x0FF3 equ #0FF3 ;Запись памяти на диск -rom3_x3D30 equ #3D30 ;вызов страницы tr-dos -rom3_x3FF0 equ #3FF0 ;вывод в порт -rom3_x3FF3 equ #3FF3 ;чтение порта - -rom4_x0122 equ #0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -rom4_x02E8 equ #02E8 ;проверка оригинальный/совместимый компьютер -rom4_x0305 equ #0305 ;установка переменных из NVRAM/CMOS128 -rom4_x0312 equ #0312 ;установка переменных по данным в CMOS -rom4_x0315 equ #0315 ;установка переменных по данным в CMOS -rom4_x036C equ #036C ;запись переменных в CMOS и в NVRAM -rom4_x0378 equ #0378 ;запись переменных в NVRAM -rom4_x0398 equ #0398 ;запись переменных в CMOS -rom4_x0512 equ #0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) -rom4_x057F equ #057F ;распаковка шрифта в rom 8 -rom4_x0A5A equ #0A5A ;инициализация системы и печать сооветствующих сообщений - -rom5_x0110 equ #0110 ;опрос Break. cy=1 не нажата -rom5_x011C equ #011C ;опрос манипуляторов и печать курсора -rom5_x0176 equ #0176 ;восстановление экрана под курсором мыши -rom5_x0381 equ #0381 ;ожидание нажатия клавиш и обработка реакции на них -rom5_x043B equ #043B ;ОШИБКА!!!! вызов процедуры по номеру в C -rom5_x08EF equ #08EF ;доступность опции K. kempston joystick -rom5_x0C22 equ #0C22 ;установка параметров окна для ввода строки в меню монитора -rom5_x0EB5 equ #0EB5 ;печать текущего меню монитора -rom5_x1061 equ #1061 ;печать закодированного сообщения из hl -rom5_x1095 equ #1095 ;заксоренное сообщение -rom5_x10AB equ #10AB ;заксоренное сообщение -rom5_x11CD equ #11CD ;печать сообщения по номеру в BC -rom5_x1A4C equ #1A4C ;печать даты и времени в окне монитора -rom5_x1AA6 equ #1AA6 ;читаем время в строку в формате ASCII -rom5_x1B18 equ #1B18 ;читаем дату в строку в формате ASCII -rom5_x1C0D equ #1C0D -rom5_x1C73 equ #1C73 ;ввод текстовой строки в нижней строке экрана -rom5_x1C84 equ #1C84 ;инициализация окна ввода -rom5_x1CB3 equ #1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) -rom5_x1CB8 equ #1CB8 ;ввод строки (вых: hl адрес введенной строки) -rom5_x2054 equ #2054 ;печать рамки вокруг окна -rom5_x2278 equ #2278 ;редактирование дампа памяти в окне монитора -rom5_x2503 equ #2503 ;монтирование всех образов с винчестера -rom5_x25EB equ #25EB ;формирование в буфере xEBF5 списка образов коллекции -rom5_x2620 equ #2620 ;формирование в буфере xEBF5 списка подразделов MFS -rom5_x271A equ #271A ;подсчет количества подразделов в MFS -rom5_x2AA4 equ #2AA4 ;преобразование количества секторов в мегабайты -rom5_x302A equ #302A ;декремент (hl)=(hl)-1 -rom5_x3052 equ #3052 ;сложение двух 4х байтных чисел -rom5_x30B9 equ #30B9 ;идентификация жесткого диска -rom5_x30C6 equ #30C6 ;печать окна для тестирования HDD -rom5_x30F3 equ #30F3 ;печать кода ошибки винчестера -rom5_x3135 equ #3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -rom5_x3163 equ #3163 ;печать текущего номера цилиндра -rom5_x31AA equ #31AA ;удаление всех разделов MBR - - -rom6_x0156 equ #0156 ;печать информации о ловушке -rom6_x01E4 equ #01E4 ;установка новой ловушки в отладчике -rom6_x0249 equ #0249 ;вывод каталога текущего дисковода (на экран/принтер) -rom6_x03A1 equ #03A1 ;печать числа в десятичной системе счисления -rom6_x03A9 equ #03A9 ;форматирование/проверка текущей дискеты -rom6_x04E5 equ #04E5 ;быстрое форматирование текущей дискеты (очистка каталога) -rom6_x064D equ #064D ;установка дескриптора окна: запрос на запись MBR -rom6_x066C equ #066C ;установка код дисковой ошибки в переменной для печати числа -rom6_x067F equ #067F ;сохранение экрана пользователя на диск -rom6_x06A6 equ #06A6 ;печать сообщения об ошибке и продолжение работы монитора -rom6_x06AD equ #06AD ;ввод текстовой строки внизу экрана -rom6_x074A equ #074A ;ожидание действий пользователя (опрос управления, вывод часов) -rom6_x093F equ #093F ;rst 8:db #8B загрузка zs-snap с диска -rom6_x0976 equ #0976 ;загрузка zs-snap (S. load ... snap) -rom6_x097E equ #097E ;сохранение zs-snap (S. save ... snap) -rom6_x0D60 equ #0D60 ;установка п/п jp #addr по адресу xE338 -rom6_x0E3B equ #0E3B ;загрузка из ROM-disk -rom6_x1108 equ #1108 ;распаковка блока - -rom7_x01AF equ #01AF ;автостарт с дискеты -rom7_x0229 equ #0229 ;вызов функции R8DOS -rom7_x0394 equ #0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -rom7_x0CFF equ #0CFF ;усттановка переменных дисковой BIOS -rom7_x0D62 equ #0D62 ;определение наличия NVRAM -rom7_x0DAD equ #0DAD ;чтение всей памяти NVRAM в память #7530 -rom7_x0DB6 equ #0DB6 ;чтение данных из NVRAM -rom7_x0DC7 equ #0DC7 ;запись всей памяти NVRAM из памяти #7530 -rom7_x0DD0 equ #0DD0 ;запись данных в NVRAM -rom7_x0E72 equ #0E72 ;что-то пишет в NVRAM -rom7_x0F55 equ #0F55 ;для сравнения чисел -rom7_x0F59 equ #0F59 ;для сравнения чисел -rom7_x0F5D equ #0F5D ;деление hl=dehl'/bc -rom7_x0FB7 equ #0FB7 ;умножение dehl=de'hl' * bc -rom7_x1003 equ #1003 ;копирование из (hl) в (de) 4х байт -rom7_x1035 equ #1035 ;сравнение двух чисел в памяти по адресам в de и hl -rom7_x1065 equ #1065 ;инициализация дисковода -rom7_x107B equ #107B ;инициализация дисковода и настройка на дискету -rom7_x1166 equ #1166 ;загрузка очередного дескриптора файла в буфер -rom7_x11B0 equ #11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -rom7_x11D4 equ #11D4 ;открытие файла для внутренних нужд -rom7_x11DF equ #11DF ;открыть файл для последующих операций с ним -rom7_x1240 equ #1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -rom7_x128C equ #128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -rom7_x1307 equ #1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 -rom7_x1360 equ #1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов -rom7_x1365 equ #1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла -rom7_x1390 equ #1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов -rom7_x1395 equ #1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти -rom7_x1405 equ #1405 ;новое значение указателя в файле R8DOS #22 -rom7_x14C0 equ #14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -rom7_x155A equ #155A ;чтение заголовка первого попавшегося сектора дисковода A -rom7_x1572 equ #1572 ;определение наличия interrupt controller -rom7_x15C7 equ #15C7 ;определение наличия последовательного порта/модема -rom7_x16B9 equ #16B9 ;работа с контроллером прерываний -rom7_x1768 equ #1768 ;поиск раздела MFS -rom7_x17BB equ #17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -rom7_x17EF equ #17EF ;запись 2х секторов из буфера xEBF5 -rom7_x18C0 equ #18C0 ;R8DOS #28(40) подключение раздела к драйверу HDD -rom7_x1AB1 equ #1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 -rom7_x1B04 equ #1B04 ;расчет адреса блока описателя заданного дисковода -rom7_x1D2A equ #1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -rom7_x1D45 equ #1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl -rom7_x1D73 equ #1D73 ;чтение сектора с винчестера в буфер xE5A9 -rom7_x1DDF equ #1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -rom7_x1E3D equ #1E3D ;чтение сектора 3 в буфер xE5A9 и проверка контрольной суммы -rom7_x1E74 equ #1E74 ;R8DOS #22(34) идентификация жесткого диска -rom7_x1F08 equ #1F08 ;проверка геометрии винчестера -rom7_x1F2D equ #1F2D ;расчет произведения головок и секторов -rom7_x1F41 equ #1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора -rom7_x1F59 equ #1F59 ;чтение ячейки CMOS -rom7_x1F76 equ #1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS -rom7_x1F93 equ #1F93 -rom7_x1FB2 equ #1FB2 ;запись в CMOS времени и даты -rom7_x2023 equ #2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -rom7_x2047 equ #2047 ;определение наличия CMOS -rom7_x20F1 equ #20F1 ;тестирование HDD (2. test) (тест на чтение/запись) -rom7_x2105 equ #2105 ;тестирование HDD (1. test) (тест только на чтение) -rom7_x2422 equ #2422 ;определение наличия SMUC - - -romA_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=2 - diff --git a/ProfRom_Disasm/!RomDisk.asm b/ProfRom_Disasm/!RomDisk.asm deleted file mode 100755 index 7ab59ae..0000000 --- a/ProfRom_Disasm/!RomDisk.asm +++ /dev/null @@ -1,50 +0,0 @@ -;АДРЕС: #0073 загрузка блока из ROM-Disk -;вх: h - номер страницы с файлом -; l - смещение в параграфах от начала ROM-disk в этой странице -; b - размер в параграфах -;вых: b - осталось незагруженных параграфов -; l - номер очередного параграфа -; -x0073 ld c,#00 - ld de,(#0070) ;e - начало ROM-disk в параграфах, d - всего параграфов - ld a,l - or a - jr nz,x007F - ld l,e - ld a,e -x007F sub e - ld e,a - ld a,d - sub e - ld e,a ;e - параграфов от начала блока до конца страницы - ld a,b - sub e - jr nc,x008F ;продолжение блока в следующей странице - xor a ;блок целиком в этой странице - push af - call x0099 ;копирование блока в память - pop bc - ret -x008F inc h ;увеличим номер страницы - push af ;запомним кол-во незагруженных параграфов - ld b,e - call x0099 ;копирование блока в память - pop bc - ld l,#00 - ret -;копирование блока в память -;вх: l - номер первого параграфа -; b - кол-во параграфов -; c=#00 -;вых: a,l - номер очередного параграфа -x0099 push hl - ld h,l - ld l,c - ld de,(xE7BE) - ldir - ld (xE7BE),de - ld a,h - pop hl - ld l,a - ret -;x00AA diff --git a/ProfRom_Disasm/!ram8.asm b/ProfRom_Disasm/!ram8.asm deleted file mode 100755 index 5ac2559..0000000 --- a/ProfRom_Disasm/!ram8.asm +++ /dev/null @@ -1,1248 +0,0 @@ - -x5B88 equ #5B88 ;содержимое порта #7FFD -x7530 equ #7530 ;для контролера прерываний -x9C40 equ #9C40 ;для контролера прерываний - -xC000 -xC001 equ #C001 ;2 для маркера страницы -xC006 equ #C006 ; - -xC063 equ #C063 ;1 <>0 отладчик отключен -xC064 equ #C064 ;2 адрес п/п вызываемой при входе в монитор -xC066 -xC069 equ #C069 ;#1B00 сохраненный экран -xDB69 equ #DB69 ;область для сохранения памяти с адреса #8002 - ;буфер для чтения даты и времени в формате ASCII - ;буфер для загрузки конфигурационного сектора -xDD69 equ #DD69 ;2 адрес текущей ячейки в дампе памяти -xDD6B equ #DD6B ;2 адрес возврата из монитора/ pc программы пользователя -xDD6D equ #DD6D ;2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке -xDD6F equ #DD6F ;2 регистр ix -xDD71 equ #DD71 ;2 регистр iy -xDD73 equ #DD73 ;2 регистр hl -xDD75 equ #DD75 ;2 регистр de -xDD77 equ #DD77 ;2 регистр bc -xDD79 equ #DD79 ;2 регистр hl' -xDD7B equ #DD7B ;2 регистр de' -xDD7D equ #DD7D ;2 регистр bc' -xDD7F equ #DD7F ;2 регистр af -xDD81 equ #DD81 ;2 регистр af' -xDD83 equ #DD83 ;2 вершина стэка для сохранения регистров при входе в монитор - ;2 регистр r и флаг IFFF2 -xDD85 equ #DD85 ;1 i -xDD86 equ #DD86 ;1 номер rom откуда зашли - ; =#01 rom 0 Basic 128k - ; =#02 rom 0 Basic 48k - ; =#04 rom 3 Tr-Dos - ; =#08 rom 2 SrvMon - ; =#80 запрос от принтера -xDD87 equ #DD87 ;2 адрес начала дампа памяти -xDD89 equ #DD89 ;2 адрес текущей ячейки в дампе памяти - ; адрес начала дизасма в дампе памяти - ; номер последней записи в каталоге ROM-disk - ; количество подразделов в разделе MFS -xDD8B equ #DD8B ;2 адрес начала листинга для команды DASM -xDD8D equ #DD8D ;#0A таблица закладок в листинге дизасма -xDD97 -;область для сохранения стэка 11 байт -xDD99 equ #DD99 ;2 (#C001) - ;#0C 6 числовых операндов для команд отладчика -xDD9B equ #DD9B ;2 bc -xDD9D equ #DD9D ;1 номер rom откуда зашли -xDD9E equ #DD9E ;2 af флаг IFFF2 и регистр r -xDDA0 equ #DDA0 ;2 af -xDDA2 equ #DDA2 ;2 адрес возврата из монитора -xDDA4 -xDDA7 equ #DDA7 ;2 для временного сохранения указателя стэка/регистров - ; для печати числа в сообщениях -xDDA9 -xDDAA equ #DDAA ;2 текущий адрес команды ассемблера для дизасма -xDDAC equ #DDAC ;4 буфер для содержимого памяти адресуемой текущим регистром - ;4 буфер команды для дизассемблирования - ;8 буфер вывода строки дампа памяти -xDDB4 equ #DDB4 ;3 команда дизассемблера без префиксов -xDDB7 equ #DDB7 ;9 сообщение для печати команды дизасма - ; +0 =[#7E..#C4] -> -#7E =[#00..#46] из таблицы x1107 - ; +1 код сообщения второго операнда - ;=[#01..#2B] код операнда - ;=[#27..#2B] в операнде есть число в скобках - ;=[#2C..#74] код мнемоники - ;=[#7E..#C4] код команды ассемблера - ;=[#EC] за этим байтом следует адрес сообщения - ;=[#EE] печать db #nn ;BAD - ;=[#F1] прерываем печать команды - ;=[#F7] признак конца команды - ;=[#F8..#FF] за этим байтом следует число - ; ;вх: 0,a =0/1 двухбайтное/однобайтное число - ; ; 1-2,a - система счисления (bin/oct/dec/hex) - ;=[#00,#75..#EB,#ED..#F7] выход без печати hl=hl-1 - -xDDC0 equ #DDC0 ; - -xDDCB equ #DDCB ;2 для сохранения стэка, при формировании команды дизасма -xDDCD equ #DDCD ;1 код команды дизасма -xDDCE equ #DDCE ;2 адрес перехода при дизасме -xDDD0 equ #DDD0 ;2 адрес следующей команды дизасма -xDDD2 equ #DDD2 ;2 адрес на который ссылаются команды работающие с ячейками - ; памяти, такие как LD ( ),reg или SET b,(IX+d). -xDDD4 equ #DDD4 ;2 -xDDD6 equ #DDD6 ;2 -xDDD8 equ #DDD8 ;2 адрес начала текущего блока сообщений -xDDDA equ #DDDA ;2 адрес начала текущего блока слов -xDDDC equ #DDDC ;2 для команд поиска в отладчике: адрес начала поиска -xDDDE equ #DDDE ;2 для команд поиска в отладчике: адрес конца поиска -xDDE0 equ #DDE0 ;1 для команд поиска в отладчике: длина искомой строки -xDDE1 equ #DDE1 ;2 для команд поиска в отладчике: состояние портов #7FFD/#1FFD пользователя -xDDE3 equ #DDE3 ;#14 для команд поиска в оладчике: искомая строка -xDDF7 equ #DDF7 ;2 указатель стэка при входе в монитор, с учетом 11 байт уже сохраненных на стэке -xDDF9 -xDDFF equ #DDFF ;1 номер текущего меню -xDE00 equ #DE00 ;8 номер текущей опции для каждого меню из списка номеров меню -xDE08 equ #DE08 ;8 список номеров меню для возврата в предыдущее -xDE10 equ #DE10 ;2 для сохранения hl -xDE12 equ #DE12 ;2 для сохранения адреса возврата -xDE14 equ #DE14 ;1 код предыдущего нажатия при просмотре списка введенных строк -xDE15 equ #DE15 ;2 адрес буфера ввода строки -xDE17 equ #DE17 ;43 буфер для ввода строки -xDE42 equ #DE42 ;400 список последних введенных строк -xDFD2 equ #DFD2 ;24 буфер для сохранения экрана под курсором мыши -;xDFE9 equ #DFE9 ; -xDFEA equ #DFEA ;4 буфер нажатых клавиш -xDFEE equ #DFEE ;-26 копия порта #7FBA - ; 6,=0/1 образ к дисководу B подключен/не подключен - ; 7,=0/1 образ к дисководу A подключен/не подключен - ; =#FF при инициализации -xDFEF equ #DFEF ;-25 -xDFF0 equ #DFF0 ;-24 1 состояние порта #FFBA - ; 7,=0 активен регистр адреса CMOS - ; =1 активен регистр данных CMOS - ; =#F7 при включении компьютера -xDFF1 equ #DFF1 ;-23 =0..3 с какого диска делать автостарт -xDFF2 equ #DFF2 ;-22 значение Cylinders HDD (2 байта) -xDFF4 equ #DFF4 ;-20 значение head HDD -xDFF5 equ #DFF5 ;-1F значение sector HDD -xDFF6 equ #DFF6 ;-1E значение seconds -xDFF7 equ #DFF7 ;-1D значение minutes -xDFF8 equ #DFF8 ;-1C значение hours -xDFF9 equ #DFF9 ;-1B значение days -xDFFA equ #DFFA ;-1A значение months -xDFFB equ #DFFB ;-19 значение years -xDFFC equ #DFFC ;-18 2 =#FC9D/#FC8B (64669/64651) оригинальный иначе совместимый -xDFFD equ #DFFD ;-17 -xDFFE equ #DFFE ;-16 2 сбойных секторов на диске - ; 1 поиск файла: номер загруженного в буфер сектора [#00..#0F] -xDFFF equ #DFFF ;-15 1 поиск файла: номер загруженного в буфер сектора [#01..#10] -xE000 equ #E000 ;-14 2 всего секторов на диске - ; 1 ROM-disk: смещение в параграфах от начала ROM-disk в этой странице - ; 1 поиск файла: номер текущего файла в считанном секторе [#00..#0F] -xE001 equ #E001 ;-13 1 ROM-disk: номер страницы с файлом ROM-disk -xE002 equ #E002 ;-12 0, - ; 1,=1 загружать/сохранять в zs-snap регистры AY -xE003 equ #E003 ;-11 -xE004 equ #E004 ;-10 1 содержимое регистра 7 AY -xE005 equ #E005 ;-0F 0,=1 эта же клавиша была нажата и в предыдущем цикле - ; 1,=1 работает автоповтор нажатой клавиши - ; 2,=1 клавиша была нажата. код клавиши еще не обработан - ; 3, - ; 4, - ; 5,=1 ????для рисования рамок???? - ; 6,=1 было нажато cs+ss - ; 7,=1 нажат CapsLock (cs+2) -xE006 equ #E006 ;-0E 1 код нажатой клавиши -xE007 equ #E007 ;-0D 1 код нажатой клавиши -xE008 equ #E008 ;-0C координата X курсора мыши в текущем окне (в знакоместах) -xE009 equ #E009 ;-0B координата Y курсора мыши в текущем окне (в знакоместах) -xE00A equ #E00A ;-0A 0-4, - величина задержки для куросра - ; 5,=1 - ; 6,=1 работает счетчик before repeat - ; 7,=1 курсор(стрелка) напечатан на экране -xE00B equ #E00B ;-09 1 координата Y выделенной опции меню -xE00C equ #E00C ;-08 1 номер блока сообщений текущей опции -xE00D equ #E00D ;-07 1 копия байта (#00FB) rom 2 -xE00E equ #E00E ;-6/5 2 копия xE012 -xE010 equ #E010 ;-4/3 2 копия xE012 -xE012 equ #E012 ;-02 1 состояние порта #7FFD при входе в монитор -xE013 equ #E013 ;-01 1 состояние порта #1FFD при входе в монитор - -;d порт #1f 000?0000 -;e порт #7f 001????? / 000????? - - -;значение iy при работе в мониторе (переменные???) -;переменные код 0 -xE014 equ #E014 ;+00 =#84 - [ - ; =#04 - ( - ; =#00 - это не скобка - ; 4,=1 - ; 3,=1/0 - 16/8 бит значение команды - ; 1,=1/0 - чтение из строки команды строкового/числового значения - ; 0,=1/0 - читается из параметра число/строка -xE015 equ #E015 ;+01 0,=0/1 префикс #DD/#FD - ; 1,=1 есть префикс #DD/#FD -> e=#09 - ; 2,=1 есть префикс #ED -> e=#18 если есть #DD/#FD - ; 3,=1 есть префикс #CB -> e=#16 - ; 4,= - ; 5,= - ; 6,=1 байтовое смещение в команде - ; =1 в команде есть ссылка на адрес памяти - ; 7,= -xE016 equ #E016 ;+02 длина команды для дизасма в байтах -xE017 equ #E017 ;+03 тип текущй команды дизасма - ; 0,=1 это команда call/call cc - ; 1,=1 это команда ret/ret cc - ; 2,=1 это команда jr cc - ; 3,=1 это команда jp/jp cc - ; 4,=1 это команда jp (hl)/jp (ix)/jp (iy) - ; 5,=1 при 1,=1 это команда ret cc - ; 6,=1 это неизвестная команда - ; 7,=1 это ex af,af' либо exx -xE018 equ #E018 ;+04 0-1,=00 в дизасме команда не ссылается на память (см xDDD2) - ; 0,=1 если команда считывает из памяти, и Ложь, если считывания не происходит - ; 1,=1 если команда производит запись в память, и Ложь, если запись не выполняется - ; 6,=1 ето команда сдвига с префиксом -xE019 equ #E019 ;+05 0,=1/0 число в десятичной/шестнадцатиричной системе - ; 1,=1 Расширить вывод реассемблера в командах DISS, LDISS и - ; DASM, кроме адреса и мнемоники команды, будут - ; представлены значения байт и их эквиваленты в ASCII - ; 2,=1/0 печатать 1/5 комманд в дизасме монитора - ; 3,=1 Не трассировать (выполнять сразу) подпрограммы, - ; расположенные в ПЗУ - ; 4,=1/0 вводить адрес в команде DASM числом/выражением - ; 5,=1/0 Запретить/разрешить автоматическое выполнение команды SHOW - ; 6,=1 начальный адрес команды SS/D, берется из регистра PC. - ; =0 начальный адрес команды SS/D. Берется из указателя текущей ячейки (mem) - ; 7,=1 печатать в дампе символы из полного набора - ; =0 печатать символы с кодами res 7,[#20..#7F] остальные точками -xE01A equ #E01A ;+06 минимальная длина сообщения с мнемоникой ассемблера -xE01B equ #E01B ;+07 минимум разрядов в числе при переводе в ASCII -xE01C equ #E01C ;+08 для перевода времени в ASCII =#30 -xE01D equ #E01D ;+09 0,=1 экран под курсором сохранен в буфере - ; =0 восстановление экрана под курсором из буфера - ; 1,=1 запрет на установку следующих координа печати в окне - ; 2,=1 печатаем символ - ; 3,=1 курсор напечатан ???? - ; 4,=1 вместо экрана вывод на принтер - ; 5,=1 прочие управляющие коды - ; 6,=1 чтение данных после управляющего кода - ; 7,=1 управляющий код вывод строки #04 -xE01E equ #E01E ;+0A 0,=1 новую информацию записывать поверх старой - ; =0 очищать экран монитора при обновлении информации - ; 1,=1 не обновлять содержимое регистров - ; 2,=1 не обновлять экран монитора - ; =0 обновлять содержимое экрана монитора согласно битам 0, 1, 3:6 - ; 3,=1 не обновлять дамп по содержимому регистров - ; 4,=1 не обновлять дамп памяти - ; 5,=1 не обновлять дизассемблер памяти по содержимому ячейки памяти - ; 6,=1 не выводить дизассемблер в мониторе - ; 7,=1 трассировать все команды - ; =0 не выводить подпрограммы (автоматическое выполнение подрограмм) -xE01F equ #E01F ;+0B 0,=1 отображаются регистры альтернативного набора - ; 1,=1 отображается AF' - ; 4,=0 при вызове функций #00-#13 R8DOS - ; =1 сектор прочитан с HDD - ; 5,=0 функции вызываются из монитора - ; =1 функция rst 8 вызвана пользователем - ; 7,=0 восстанавливать память пользователя под всеми ловушками - ; =1 сохранять память пользователя под всеми ловушками и установка ловушек - ; =0/1 меню mount/dismount -xE020 equ #E020 ;+0C байт управления индикацией регистров =1 не выводится - ; 7 - pc - ; 6 - sp - ; 5 - ix - ; 4 - iy - ; 3 - hl(hl') - ; 2 - de(de') - ; 1 - bc(bc') - ; 0 - af(af') -xE021 equ #E021 ;+0D -xE022 equ #E022 ;+0E 0,=0 используется при компрессии - ; 2,=1 ошибка. деление на ноль - ; 5,=0 ввод параметров в меню - ; =1 ввод строки в окне создания разделов - ; 6,=1 в команде ассемблера нет запятой - ; 7,=0/1 редактирование hex дампа/символьного представления -xE023 equ #E023 ;+0F количество незакрытых скобок в выражении в отладчике -xE024 equ #E024 ;+10/11 делитель для выделения разряда числа -xE025 equ #E025 ;+11 -xE026 equ #E026 ;+12 0,=1 запущен отладчик - ; 1,=1 экран не надо сохранять в ram 8 (экран не сохранен в ram 8) - ; 2,=0/1 print screen positive/negative - ; 3,=1 экран сохранен в ram 8 - ; 4,=1 при вызове команды CALL отладчика - ; 5,=1 выполняется трассировка из отладчика - ; 6,= - ; 7,=1 желто/черный бордюр при входе -xE027 equ #E027 ;+13 0,=1/0 работает команда отладчика search/find - ; 1,=0 запись строки данных в память идет по адресу в MEM - ; 3,=1 продолжаем запись zs-snap после записи 48k - ; =0 ошибка: undefined file - ; 5,=1/0 compression on/off - ; 6,=1/0 запись/чтение - ; 7,=1/0 при сохранении/загрузке zs-snap использовать сжатие - ; =1/0 форматирование/проверка дискеты -xE028 equ #E028 ;+14 0,=1 не трогать регистр 7 AY (sound on/off) - ; 1,=0/1 Autoconfig On/Off - ; 2,=1/0 после загрузки снапа вернуться в монитор/выйти из монитора (запуск снапа) - ; 3,=0 программа анализатора не задана - ; 4,=1 анализатор включен - ; 5,=1 работает команда EVal word - ; 6,=1 "теплый" сброс - ; 7,=0 отладчик отключен / reset RAM on/off -xE029 equ #E029 ;+15 отдельные биты этого байта позволяют управлять выводом на принтер - ; 0,=0/1 interface Centronics/RS232 - ; 1,=0/1 speed 9600/1200 - ; 2,=0/1 data bits 8/7 - ; 3,=0/1 stop bits 2/1 - ; 5,=0/1 режим вывода 1 точка/3 точки - ; 7,=0/1 positive/negative -xE02A equ #E02A ;+16 при отладке, аналог xE01E (параметры команды SLOW) - ; 0,=1 восстанавливать экран - ; 1,= - ; 2,= - ; 3,= - ; 4,= - ; 5,= - ; 6,= - ; 7,=1 выполнение команды в отладчике с быстрым выполнением подпрограмм -xE02B equ #E02B ;+17 текущая система счисления =2/8/10/16 -xE02C equ #E02C ;+18 значение interleaving 1..26 -xE02D equ #E02D ;+19 0,= - ; 3,=1 пауза в водимом листинге - ; 5,=1 чтение порта #7FFD/#1FFD недоступно - ; 6,=1 включено Turbo - ; 7,=1 турбо-режим доступен -xE02E equ #E02E ;+1A 0,=1 было обновление времени и даты в буфере - ; 1, - ; 2, - ; 3, - ; 4,=1 interrupt controller found - ; 5,=1 HDD есть и работоспособен - ; =1 NVRAM найден - ; =1 modem found - ; 6,=1 микросхема CMOS обнаружена - ; 7,=1 HDD физичиски присутствует -xE02F equ #E02F ;+#1B - ; 4,=1 interrupt controller найден. но не совсем???? - ; 6,=1 CMOS 128 байт - ; 7,=1 проверка геометрии винчестера пройдена -xE030 equ #E030 ;+#1C master HDD - ; 0,=1/0 autostart on/off - ; 1,=1/0 автоопределение HDD при старте on/off - ; 2,=1/0 LBA mode on/off - ; 4,=1/0 TRDOS mirror on/off - ; 5,=1/0 HDD обнаружен/отсутствует - ; =1 сектор MBR записан - ; 6,=0 в буфере xEBF5 список разделов без изменений - ; =1 в буфере xEBF5 список разделов изменен - ; 7,=1 на винчестере есть раздел MFS -xE031 equ #E031 ;+#1D slave HDD -xE032 equ #E032 ;+#1E -xE033 equ #E033 ;+#1F/#20 адрес текущего меню в списке номеров меню для возврата в предыдущее -xE035 equ #E035 ;+#21/#22 первый свободный адрес в буфере последних введенных строк(команд) -xE037 equ #E037 ;+#23/#23 адрес начала следующей введенной строки -xE038 equ #E038 ;+#24 - -xE039 equ #E039 ;+#25 значение NMI debouncing -xE03A equ #E03A ;+#26 размер окна сжатия для снапа -xE03B equ #E03B ;+#27 0,=1 нажата fire на джойстике и знакоместные координаты курсора в окне изменились - ; 1,=1 нажата fire на джойстике - ; 2,=1 курсор мыши вне пределов текущего окна - ; 3,=1/0 indicator времени в мониторе on/off - ; 5,=1/0 mouse on/off - ; 6,=1/0 kempston joystick on/off - ; 7,=1/0 manipulators on/off -xE03C equ #E03C ;+#28 crd X графического курсора -xE03D equ #E03D ;+#29 crd Y графического мыши -xE03E equ #E03E ;+#2A значение first debouncing -xE03F equ #E03F ;+#2B значение before repeat -xE040 equ #E040 ;+#2C значение second wait -xE041 equ #E041 ;+#2D значение second debouncing -xE042 equ #E042 ;+#2E значение size of step -xE043 equ #E043 ;+#2F -xE044 equ #E044 ;+#30 содержимое регистра дополнительных возможностей #F9BE (не реализовано) - ; =#00 всегда -xE045 equ #E045 ;+#31 содержимое регистра счетчика секторов (#FABE) - ; число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) -xE046 equ #E046 ;+#32 LBA адрес на HDD(двойное слово) младший байт - ; CHS - номер сектора -xE047 equ #E047 ;+#33 LBA адрес на HDD - ; CHS - номер цилиндра (младший байт) -xE048 equ #E048 ;+#34 LBA адрес на HDD - ; CHS - номер цилиндра (старший байт) -xE049 equ #E049 ;+#35 3-0, - LBA адрес на HDD старший байт - ; CHS номер головки - ; 4,=0/1 текущий винчестер master/slave - ; 5,=1 всегда - ; 6,=0/1 это CHS/LBA адрес - ; 7,=1 всегда -xE04A equ #E04A ;+#36 =#20 код команды винчестера: чтение сектора -xE04B equ #E04B ;+#37 =#30 код команды винчестера: запись сектора -xE04C equ #E04C ;+#38 #90 144 -xE04D equ #E04D ;+#39 количество дополнительных попыток чтения/записи сектора с винчестера - -;переменные код 2 -xE04E equ #E04E ;+00 1 константа антидребезговой задержки монитора -xE04F equ #E04F ;+01 1 константа задержки перед автоповтором -xE050 equ #E050 ;+02 1 счетчик до срабатывания автоповтора (базовое =(xE04F)) -xE051 equ #E051 ;+03 1 период автоповтора -xE052 equ #E052 ;+04 1 счетчик периода автоповтора (базовое =(xE051)) -xE053 equ #E053 ;+05 1 цвет бордюра, устанавливаемый монитором, при подаче звукового сигнала ошибки -xE054 equ #E054 ;+06 1 код символа "возврата каретки" для принтера -xE055 equ #E055 ;+07 1 код символа "перевода строки" для принтера -xE056 equ #E056 ;+08 1 код символа "перевода формата" для принтера -xE057 equ #E057 ;+09 2 код, определяющий скорость передачи для последовательного интерфейса (для 9600 бод - 0bh) -xE059 equ #E059 ;+0B 2 код, определяющий скорость передачи для последовательного интерфейса (для 1200 бод - 6аh) -xE05B equ #E05B ;+0D 11 коды, служащие для перевода принтера в графический режим - ; (непосредственно за ними будет выдано 768 байт - ; графической информации при печати экрана из монитора). - ; Байт +0dh хранит количество управляющих кодов - ; +#06 =#01/#03 режим печати 1 точки/3 точки -xE063 equ #E063 ;+15 4 коды, служащие для перевода принтера в текстовый режим, - ; завершающие печать экрана. Байт +015h хранит количество - ; управляющих кодов -xE067 equ #E067 ;2 =0000 - ;дескриптор окна монитора: вывод каталога диска на принтер - ;дескриптор окна монитора: вывод на принтер -xE06B equ #E06B ;+1D 1 число строк на странице при печати на принтере -xE06C equ #E06C ;+1E 1 число символов в строке при печати на принтере -xE06D - -xE075 equ #E075 ;дескриптор окна монитора: регистры/вывод каталога диска -xE083 equ #E083 ;дескриптор окна монитора: ввод строки низу экрана -xE091 equ #E091 ;дескриптор окна монитора: дизассембер -xE09F equ #E09F ;дескриптор окна монитора: дамп памяти -xE0AD equ #E0AD ;дескриптор окна монитора: информационное окно отладчика -xE0BB -xE0C9 equ #E0C9 ;дескриптор окна: menu -xE0D7 equ #E0D7 ;дескриптор окна: запрос на запись MBR -xE0E5 equ #E0E5 ;дескриптор окна: ввод числа -xE0F3 equ #E0F3 ;дескриптор окна: переименование раздела HDD/каталог ROM-disk -xE101 equ #E101 ;1 атрибуты для выделенной позиции в каталоге ROM-disk -xE102 equ #E102 ;#D дескриптор окна при включении -xE10F -xE110 equ #E110 ;1 атрибуты для печати опции меню -xE111 equ #E111 ;1 атрибуты для печати названия меню, времени -xE112 equ #E112 ;1 атрибуты для печати неактивной опции меню -xE113 equ #E113 ;1 атрибуты для печати выделенной опции меню -xE114 equ #E114 ;1 атрибуты для подсветки ловушки при выводе дизасма -xE115 equ #E115 ;1 атрибуты для печати информационного сообщения внизу экрана -xE116 equ #E116 ;2 очередной(первый пустой) адрес в буфере нажатых клавиш -xE118 equ #E118 ;2 текущий(первый не обработанный) адрес в буфере клавиатуры -xE11A equ #E11A ;2 адрес вершины стэка при входе в монитор - ;2 адрес памяти(8 байт) начала сормированной команды для трассировки -xE11C equ #E11C ;2 адрес первого свободного байта программы анализатора -xE11E equ #E11E ;#0C - ;=x3E2C,x3D01 - ;=x3179,x3161 - ;=x1DDC,x1DD0 -xE12A equ #E12A ;2 адрес изображения текущего графического курсора -xE12C equ #E12C ;последнее состояние порта мыши #FBDF (ось X) -xE12D equ #E12D ;последнее состояние порта мыши #FFDF (ось Y) -xE12E equ #E12E ;#20 изображение графического курсора №1 с маской -xE14E equ #E14E ;#20 изображение графического курсора №2 с маской -xE16E equ #E16E ; -xE17B equ #E17B ; -/* -xE16E db #7F ;знак копирайта - db " 1993" - db #1B,#01,#00 ;координаты - db "-97 " -xE17B db "MOA" - db #1B,#00,#24 ;координаты - db "NCACB" - db #1B,#01,#24 ;координаты - db "05-07" - db #1B,#02,#24 ;координаты - dc "V4.01" -*/ -xE196 - -xE1A6 equ #E1A6 ;#?? буфер для вывода строки с выравниванием -;x -xE336 equ #E336 ;вершина стэка для каких-то задач - ;при работе отладчика -xE338 equ #E338 ;#0E для сохранения дескриптора окна -xE33B equ #E33B ;2 для временного сохранения регистров -xE346 -xE38D equ #E38D ;2 вершина стэка при работе в мониторе -xE38F equ #E38F ;#0B буфер клавиатуры -xE39A equ #E39A ;8 буфер для сохранения памяти пользователя при трассировке - ; команды дизасма -xE3A2 -xE3A4 equ #E3A4 ;#10 буфер для сохранения экрана под символом 6 pix -xE3B4 equ #E3B4 ;1 предыдущие атрибуты окна -;x -xE3B6 equ #E3B6 ;1 счетчик для мигания курсора окна -xE3B7 equ #E3B7 ;2 адрес дескриптора текущего окна -xE3B9 equ #E3B9 ;2 адрес п/п обработки текущего управляющего кода -xE3BB equ #E3BB ;1 новая координата Y курсора -xE3BC equ #E3BC ;2 первый свободный адрес в буфере печати (xE1A6/буфер CMOS) - - ORG #E3BE - -xE3BE rst #30 - dw #0000 - db #00 - ret -xE3C3 dw #E449 ;rom 0, ram 8 текущей плоскости - dw #E44D ;rom 1, ram 8 текущей плоскости - dw #E4C5 ;текущая страница ПЗУ в новой плоскости (rom 2 ???) - dw #E41B ;rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 -xE3CB dw #E499 - dw #E489 - dw #E483 - dw #E484 - -;обработка rst #30 -;переключение плоскости -xE3D3 push hl - ld hl,(#0101) ;номер текущей страницы - ex (sp),hl - push hl - ld hl,#0006 - push af - add hl,sp - push de - push bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld c,(hl) - inc hl - ld b,(hl) ;адрес вызываемой п/п - inc hl - ld a,(hl) ;плоскость и страница вызываемой п/п -xE3E9 call xE478 ;включим страницу ПЗУ с монитором - inc hl - ex de,hl - ld (hl),d ;сохраним новый адрес возврата - dec hl - ld (hl),e - ld (xE408),bc - call xE4AA ;установим плоскость - ld hl,xE3C3 - call xE4B8 ;адрес п/п включения страницы ПЗУ по ее номеру в A - ld (xE405+1),hl - pop bc - pop de - pop af - pop hl -xE405 call #0000 -xE408 db 0 ;адрес вызываемой п/п - db 0 - -;включение предыдущей плоскости - ex (sp),hl - push af - push bc - ld a,l - call xE4AA - ld hl,xE3CB - call xE4B8 - pop bc - pop af - ex (sp),hl - ret - - -;включение rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 -xE41B ex (sp),hl - push de - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld (xE43C+1),de ;de адрес вызываемой п/п - pop de - ex (sp),hl - push hl - ld hl,(xE43C+1) - ex (sp),hl ;(sp) адрес вызываемой п/п -xE42C push af -xE42D ld a,#10 - ld (xE468+1),a - pop af - ex (sp),hl - ld (xE43C+1),hl - ld hl,xE478 - ex (sp),hl - push hl -xE43C ld hl,#0000 - ex (sp),hl - ld (xE43C+1),bc - ld bc,#3D30 - jr xE463 - -;включение rom 0, ram 8 и вызов п/п с возвратом в xE478 -xE449 push af - xor a - jr xE450 -;включение rom 1, ram 8 и вызов п/п с возвратом в xE478 -xE44D push af - ld a,#10 -xE450 ld (xE468+1),a - pop af - ld (xE43C+1),bc ;сохраним BC - ex (sp),hl ;берем адрес п/п - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ex (sp),hl ;bc адрес вызываемой п/п - push hl - ld hl,xE478 - ex (sp),hl ;(sp) возврат в xE478 -xE463 push bc ;(sp) адрес вызываемой п/п - push af - ld bc,#7FFD -xE468 ld a,#00 - out (c),a - ld a,#10 - ld b,#1F - out (c),a - pop af - ld bc,(xE43C+1) - ret - -;возврат после обработки rst #30 -;включаем ПЗУ с монитором -xE478 push bc - push af - ld bc,#1FFD - ld a,#12 - out (c),a - pop af - pop bc -xE483 ret - -xE484 push hl ;rom 1, ram 8 с возвратом в x3D30 - ld hl,#3D30 - ex (sp),hl - -xE489 push bc ;включим rom 1, ram 8 - push af - ld bc,#1FFD - ld a,#10 - out (c),a - ld b,#7F - out (c),a - pop af - pop bc - ret - - -xE499 push bc ;rom 0, ram 8 - push af - ld bc,#1FFD - ld a,#10 - out (c),a - xor a - ld b,#7F - out (c),a - pop af - pop bc - ret - -;установка заданной плоскости -;bit 2-3,a - номер плоскости -xE4AA ld c,a - ld hl,#0110 - rrca - rrca - and #03 - add a,l - ld l,a - ld l,(hl) - ld l,(hl) - ld a,c - ret - -;определение адреса п/п по номеру -;вх: bit 0-1,a - номер п/п -; hl - адрес таблицы с адресами п/п -;вых: hl - адрес п/п -xE4B8 and #03 - rla - add a,l - ld l,a - jr nc,xE4C0 - inc h -xE4C0 ld a,(hl) - inc hl - ld h,(hl) - ld l,a - ret - -;вызов п/п -xE4C5 ex (sp),hl - inc hl - inc hl - ex (sp),hl - push hl - ld hl,(xE408) - ex (sp),hl - ret - -;bc =#7FFD -;de - заданная страница -xE4CF ld a,e - and #10 - out (c),a - ld b,#1F - ld a,d - and #03 - or #10 - out (c),a ;rom пользователя, ram 8 - ex af,af' - jr c,xE4E1 - ld a,(hl) -xE4E1 ld (hl),a - ex af,af' - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - jp rom2_x05A1 ;rom 2 - - - - -;АДРЕС: #E4F0 -;сохранение/восстановление стэка из окна [#0000..#3FFF] -;вх: hl' - адрес вершины стэка -; de' - буфер для сохранения -; bc' - размер для сохранения -; de - страница при входе -; bc=#7ffd -; cy'=0 сохранять -; =1 восстанавливать -;вых: hl - адрес вершины стэка+n -; de - буфер для сохранения+n -; -xE4F0 ld a,e - and #10 - out (c),a ;ram 0/8 - ld b,#1F - ld a,d - and #03 - or #10 - out (c),a ;rom при входе, ram 8 - exx - ex af,af' - jr nc,xE503 ;сохраняем - ex de,hl -xE503 ldir - jr nc,xE508 -xE507 ex de,hl -xE508 ex af,af' - exx - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - exx - ret - -;обработчик прерываний im 2 -xE516 xor a -xE517 ei -xE518 ret - -xE519 ei - inc a -xE51B db #32 - -xE51C call #0000;x0212 - ret - -xE520 ld (xE518),a -xE523 ld a,#FB ;ei - ld (xE517),a - im 1 - jp #0000;xF300;x025E - -xE52D equ #E52D ;8 блоков по 11 байт breackpoints - ;+#00 0-1,=nn номер типа ловушки - ; 6,=1 ловушка задана - ; 7,=1 ловушка активна - ;+#01 номер страницы в которой установлена ловушка - ;+#02 адрес ловушки (2 байта) - ;+#04 - ;+#05 начальное значение счетчика проходов по ловушке (2 байта) - ;+#07 текущее значение счетчика проходов (2 байта) - ;+#09 - ;+#0A -xE538 -xE543 -xE54E -xE559 -xE564 -xE56F -xE57A -xE585 equ #E585 ;буфер для установки ловушки - ;+0 #C0+тип ловушки - ;+1 номер страницы ловушки 5,=1 задана в команде 5,=0 текущая страница - ;+2/3 адрес ловушки - ;+4 - ;+5/6 количество проходов - ;+7/8 количество проходов - ;+9 =#00 - ;+10 =#00 -xE590 equ #E590 ;#15 описатель текущего дисковода -xE5A5 equ #E5A5 ;2 head * sector активного HDD -xE5A7 equ #E5A7 ;2 -xE5A9 equ #E5A9 ;#100 каталог ROM-диска - ; временные буферы - ;#200 буфер для чтения сектора HDD -xE6A9 equ #E6A9 ;#100 буфер -xE7A9 equ #E7A9 ;#1C буфер fcb -xE7B2=xE7A9+#09 ;2 адрес начала области памяти при сохранении экрана на диск -xE7BE=xE7A9+#15 ;2 =xE8A9 адрес памяти для копирования из ROM-disk -xE7C5 equ #E7C5 ;2 координаты следующего блока файла ROM-disk - ; текущий адрес на диске (сектор, дорожка) -xE7C7 equ #E7C7 ;#10? строка пути к образу диска -;x -xE7DB equ #E7DB ;6+6 имя полдарздела + имя раздела -xE7E7 -xE81B equ #E81B ;#10 описатель раздела MFS - ; заголовок подраздела, при выборе образа -;x -xE8A9 equ #E8A9 ;#100 первый параграф файла ROM-disk - ; буфер для дисковых операций - ; дескриптор подраздела -xE8E9 equ #E8E9 ;#70 битовая карта параграфов. по 8 байт на страницу - ; =0 параграф пустой -xE9A9 equ #E9A9 ;#14 буфер программы анализатора - ; для зарезервированных слов анализатора st0-st9 -xE9BD equ #E9BD ;#14 адреса ловушек - ; для зарезервированных слов анализатора br0-br9 -xE9D1 equ #E9D1 ;2 адрес начала параметров-слов в программе анализатора -xE9D3 equ #E9D3 ;2 адрес конца названия слова в программе (указывает на #01) -xE9D5 equ #E9D5 ;2 адрес первой ячейки переопределяемого слова -xE9D7 equ #E9D7 ;2 адрес конца названия переопределенного слова в программе (указывает на #01) -x -xE9D9 equ #E9D9 ;2 адрес начала стэка анализатора -xE9DB equ #E9DB ;2 адрес вершины стэка анализатора (адрес первой свободной ячейки) - ; стэк анализатора растет вверх!!! -xE9DD equ #E9DD ;2 для сохранения SP в анализаторе -xE9DF equ #E9DF ;2 для временного сохранения регистров - ; -xE9E1 equ #E9E1 ;2 адрес таблицы со списком процедур для п/п x2028 -xE9E3 equ #E9E3 ;2 номер записи каталога ROM-disk, с которой начинаем печать -xE9E5 equ #E9E5 ;2 адрес шрифта -xE9E7 equ #E9E7 ;4 смещение от начала образа в секторах (512b) +1 - ; размер создаваемого раздела в секторах -xE9EB equ #E9EB ;4 4 байта из дескриптора xE591 - ; смещение первого сектора выбранного подраздела MFS/образа в подразделе -xE9EF equ #E9EF ;1 смещение ширина поля в символах от края окна для переименования раздела HDD -xE9F0 equ #E9F0 ;1 ширина в символах окна для переименования раздела HDD -xE9F1 equ #E9F1 ;1 номер дисковода -xE9F2 equ #E9F2 ;1 номер дисковода (пользовательский для rst 8: db #81) -xE9F3 equ #E9F3 ;2 адрес блока описателей дисковода -xE9F5 equ #E9F5 ;#15 описатель дисковода A - ; +#00 код подраздела (для образа =#01) - ; 2-0,=??? тип подраздела - ; 4,=1 подключен раздел TR-DOS (не образ) - ; 5,=1 образ защищен от записи - ; =#00 - реальный дисковод - ; +#01 4 адрес первого сектора подраздела/образа - ; +#05 4 адрес последнего сектора подраздела/образа - ; +#09 6 имя подраздела - ; 6 имя диска в подразделе -xEA0A equ #EA0A ;#15 описатель дисковода B -xEA1F equ #EA1F ;#15 описатель дисковода C -xEA34 equ #EA34 ;#15 описатель дисковода D -xEA49 equ #EA49 ;#15 описатель дисковода A (пользовательский для rst 8: db #81) -xEA5E equ #EA5E ;#15 описатель дисковода B (пользовательский для rst 8: db #81) -xEA73 equ #EA73 ;#15 описатель дисковода C (пользовательский для rst 8: db #81) -xEA88 equ #EA88 ;#15 описатель дисковода D (пользовательский для rst 8: db #81) -xEA9D equ #EA9D ;буфер для определения последовательного порта/модема -;переменные код 6 ??? -xEAED equ #EAED ;8 список атрибутов Ink для печати опций меню -xEAF5 equ #EAF5 ;#100 признак целостности страницы (байты от #100 до #00) -xEBF5 equ #EBF5 ;#400 буфер для загрузки/записи - ; буфер для первых двух секторов раздела MFS (каталога подразделов) - ; буфер для таблицы секторов пользователя -xEFF5 equ #EFF5 ;#200 буфер для чтения сектора с винчестера -xF1F5 -xF6C0 equ #F6C0 ;#100 программа анализатора -xF7C0 equ #F7C0 ;шрифт 2048 - -;переменные код 4 -;переменные дисковой BIOS -xFFC0 equ #FFC0 ;+00 1 MFM максимальное число секторов на дорожке для сектора 128 -xFFC1 equ #FFC1 ;+01 1 MFM максимальное число секторов на дорожке для сектора 256 -xFFC2 equ #FFC2 ;+02 1 MFM максимальное число секторов на дорожке для сектора 512 -xFFC3 equ #FFC3 ;+03 1 MFM максимальное число секторов на дорожке для сектора 1024 -xFFC4 equ #FFC4 ;+04 1 FM максимальное число секторов на дорожке для сектора 128 -xFFC5 equ #FFC5 ;+05 1 FM максимальное число секторов на дорожке для сектора 256 -xFFC6 equ #FFC6 ;+06 1 FM максимальное число секторов на дорожке для сектора 512 -xFFC7 equ #FFC7 ;+07 1 FM максимальное число секторов на дорожке для сектора 1024 -xFFC8 equ #FFC8 ; 2 адрес таблицы с количеством секторов на дорожке -xFFCA equ #FFCA ;+0A 1 номер текущего дисковода: 0 - дисковода А, 1 - В -xFFCB equ #FFCB ;+0B 1 количество попыток считывания при ошибке, начальное значение 3 -xFFCC equ #FFCC ;+0C 1 коды, определяющие тип дисковода (спецификацию) А - ; =#FF - еще не инициализирован??? - ; =#E0 - если подключен образ диска (без защиты от записи) - ; =#C0/#00 - для реальных дисководов A-B/C-D - ; 0-1, -время перемещения на шаг - ; 1, - ; 4, - ; 5,-0/1 образ не подключен/подключен - ; 6,=0/1 дисковод на 40/80 дорожек - ; 7,=0/1 односторонний/двустронний дисковод -xFFCD equ #FFCD ;+0D 1 коды, определяющие тип дисковода (спецификацию) B -xFFCE equ #FFCE ;+0E 1 коды, определяющие тип дисковода (спецификацию) C -xFFCF equ #FFCF ;+0F 1 коды, определяющие тип дисковода (спецификацию) D -xFFD0 equ #FFD0 ;+10 1 коды, определяющие тип дискеты в дисководе А - ; 0-1,=00/01/10/11 размер сектора в байтах 128/256/512/1024 - ; 2,=1 диск 40 работает на дисководе 80 - ; 5,=0/1 40/80 дорожек на диске - ; 6,=0/1 метод записи FM/MFM - ; 7,=0/1 односторонняя/двустронняя дискета -xFFD1 equ #FFD1 ;+11 1 код, определяющий тип дискеты в дисководе В -xFFD2 equ #FFD2 ;+12 1 код, определяющий тип дискеты в дисководе C -xFFD3 equ #FFD2 ;+13 1 код, определяющий тип дискеты в дисководе D -xFFD4 equ #FFD4 ;+14 1 текущий номер дорожки для дисковода A -xFFD5 equ #FFD5 ;+15 1 текущий номер дорожки для дисковода B -xFFD6 equ #FFD6 ;+16 1 текущий номер дорожки для дисковода C -xFFD7 equ #FFD7 ;+17 1 текущий номер дорожки для дисковода D -xFFD8 equ #FFD8 ;+18 1 код time-out для дисковода А -xFFD9 equ #FFD9 ;+19 1 код time-out для дисковода В -xFFDA equ #FFDA ;+1A 1 код time-out для дисковода C -xFFDB equ #FFDB ;+1B 1 код time-out для дисковода D -xFFDC equ #FFDC ;+1C 0,=0 при вызове функций #00-#13 R8DOS - ; 4,=0 после завершения функций #00..#13 R8DOS - ; =1 текущий диск инициализирован - ; головка на заданной дорожке - ; =1/0 головка на нижней/верхней стороне диска - ; 5,=1/0 работа с дисководами монитора/пользователя - ; 6,=0 при инициализации - ; 7,=1 к текущему дисководу подключен образ -xFFDD equ #FFDD ;+1D 1 код ошибки дискового интерпретатора - ; =#FF при вызове функций #00-#13 R8DOS - ; =#01 нет диска в дисководе - ; =#02 попытка записи на защищенную дискету - ; =#03 нажата Break - ; =#04 ошибка при чтении или записи сектора функциями 5 или 6 - ; =#05 ошибка позицирования (не соответствует номер дорожки) - ; =#06 ошибка позицирования (не считался адресной маркер дорожки/сектора) - ; =#07 неверный номер сектора - ; =#08 ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) - ; ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) - ; =#09 неформатированная дискета (функции 7, 8) - ; =#10 дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - 10h (функция 8) - ; =#11 несовпадение кода типа дискеты TR - DOS реальному формату - ; =#12 не открыт рабочий буфер (функция 8) - ; =#14 были ошибки при чтении/записи дорожки (функции 12, 13) - ; =#21 ошибка образа диска - ; =#22 сектор за пределами образа диска - ; =#3F дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - ; =#45 неверный путь - ; =#46 конец файла - ; =#48 файл не найден - ; =#49 попытка записи после конца файла - ; =#4A попытка чтения из файла открытого на запись - ; попытка записи в файл открытого на чтение - ; =#50 HDD не вышел в готовность - ; =#55 ошибка заголовка файла zs-snap - ; =#56 нет раздела MFS/винчестер не найден - ; =#57 не прочитался сектор идентификации - ; =#57 ошибки при чтении с HDD - ; =#58 ошибка в секторе идентификации - ; =#61 HDD не вышел в готовность к принятию команды - ; =#62 HDD не вышел в готовность к передаче данных - ; =#63 раздел MFS не найден - ; =#66 путь не найден - ; =#67 к дисководу образ не примонтирован - ; =#FD размер сектора не соответствует (для образа диска) -xFFDE equ #FFDE ;2 адрес стэка при вызове функций #00-#13 R8DOS -xFFE0 equ #FFE0 ;1 количество секторов на дорожке -xFFE1 equ #FFE1 ;1 =#80/#A0 чтение/запись группы секторов -xFFE2 equ #FFE2 ;2 адрес в памяти для чтения/записи группы секторов - ; текущий адрес записи при формировании таблицы секторов на дискете -xFFE4 equ #FFE4 ;2 начальные дорожка и сектор для чтения/записи группы секторов - ; текущий адрес в записи при формировании таблицы секторов на дискете -xFFE6 equ #FFE6 ;1 количество секторов для чтения/записи - ; код при формировании таблицы секторов на дискете -xFFE7 equ #FFE7 ;2 адрес рабочего буфера для функции 8 -xFFE9 equ #FFE9 ;6 буфер для чтения заголовка сектора - ; +0 номер дорожки - ; +1 номер стороны - ; +2 номер сектора - ; +3 длина сектора 0/1/2/3 - ; +4/5 констрольный код -xFFED equ #FFED ;2 размер сектора в байтах -xFFEF equ #FFEF ;1 ret для вызова п/п опроса Break из rom 5 - ;1 код последней команды ВГ93 - ;1 для временного сохранения регистра A при вызове функции R8DOS -xFFF0 equ #FFF0 ;2 адрес рабочего буфера для функции 8 -;x - - -/* -окно пользователя: -+00 координата Y курсора в окне -+01 координата X курсора в окне -+02 координата Y начала окна (в знакоместах) -+03 координата X начала окна (в знакоместах) -+04 высота окна в знакоместах -+05 ширина окна в знакоместах -+06 цифровые атрибуты окна -+07 системные атрибуты окна: - 7-6,??? - 5 Запрет вывода, все выводимые символы игнорируются - 4 Произвольный формат, по достижению правого края окна будут автоматически - выполнены команды перевода строки и возврат каретки - 3 Выполнять автоматический возврат каретки при приходе символа перевода - строки - 2 Выполнять автоматический перевод строки при приходе символа возврат - каретки - 1 Изменять атрибуты при выводе каждого символа (в противном случае атрибуты - устанавливаются только во время очистки окна) - 0 Не выводить символ курсора -+08 - 5-3, номер рамки - 7,=0 нет рамки вокруг окна -+09 атрибуты рамки -+0A размер символов в пикселях 6/8 -+0B размер окна в символах. Для символов в 8 точек этот размер совпадает с - шириной окна. Если размер символа 6 точек, то перед инициализацией - (очисткой) необходимо рассчитать размер окна и поместить в этот байт. -+0C код символа курсора. Код с этим символом будет выводиться вместе, отмечая - положение курсора, если сброшен 0 бит в системных атрибутах окна -+0D 1,=0/1 режим вставки/замены при вводе строки - -*/ - -/* -точки останова (ловушки) -+00 1,=1 ловушка задана но не активна - 7,=0 ловушка не задана -+01 логический номер страницы, где стоит ловушка -+02/03 адрес ловушки -+03 -+04 состояние памяти пользователя по адресу ловушки -+05/06 -+07/08 адрес -+09 -+0A -*/ - - -/*дескриптор файла: fcb - -+#00 8 имя файла -+#08 1 тип файла -+#09 2 при типе C стартовый адрес, при типе B длина бейсик-программы -+#0B 2 длина файла -+#0D 1 объем файла в секторах -+#0E 1 номер первого сектора файла -+#0F 1 номер первой дорожки файла -+#10 -+#13 2 указатель в файле -+#15 2 адрес буфера dma -+#17 1 b - способ открытия - 0-1,=11 файл для модификации - 0,=1 файл для чтения - 1,=1 файл для записи - 2,=1 обмен целыми секторами "физический" файл - (если сброшен - обмен будет вестись байтами "логический" файл) - 7,=1 файл был изменен, но не сохранен -+#18 1 номер текущего дисковода -+#19 1 номер файла на диске -+#1A 1 кол-во секторов для чтения/записи -+#1B 1 максимальный объем файла в секторах - - -*/ - - -/* Формат таблицы расположения секторов. - -+0 Идентификационный байт - #00 - информация о секторе достоверна - #FF - информация о секторе не достоверна (сбойный сектор) - #FE - конец таблицы секторов - #FD и #FC - см. функцию 12 -+1 Физический номер дорожки (0:х) -+2 Номер стороны (0/1) -+3 Номер сектора (1:х) -+4 Код длины сектора - 00 - 128 - 01 - 256 - 02 - 512 - 03 - 1024 -*/ - -/* описатель дисковода (для примонтированных образов) - -+00 =#00 ничего не подмонтировано - =#01 что-то подмонтировано - - -*/ - -/* описатель подраздела раздела MFS - -+00 0-2,=nnn тип подраздела - 7,=1 при печати типа подраздела перед ним печатать "*" -+01 4 смещение первого сектора подраздела -+05 -+06 размер подраздела -+0A 6 имя подраздела - -*/ - -/* описатель подраздела MFS/ - -+00 0-2,=nnn тип подраздела - 7,=1 при печати типа подраздела перед ним печатать "*" -+01 4 смещение первого сектора от начала винчестера (LBA адрес) -+05 для образа =#00 -+06 2 размер подраздела -+08 2 -+0A 6 имя подраздела - -*/ - -/* структура HDD - -сектор 1 - MBR -сектор 3 - данные примонтированных образов - -*/ - - -/* структура раздела MFS - -2 сектора каталог подразделов -n подраздел -n подраздел -n подраздел - - структура подраздела MFS -2 сектора каталог образов дисков -501 секторов на каждый образ (1й сектор пустой) - -*/ - - -/* сектор 3. примонтированне разделы/образы -+#00 1 тип подраздела/образа (для образа =#01) - =#00 ничего не примонтировано -+#01 4 смещение первого сектора от начала винчестера (LBA адрес) -+#05 1 тип подраздела/образа (для образа =#01) -+#06 4 размер подраздела/образа -+#0A 6 имя подраздела -+#10 6 если это подраздел, то имя подраздела - 6 если это образ, то имя образа - -*/ - - - -/* -Формат таблицы расположения секторов. -+0 Идентификационный байт - =#00 - информация о секторе достоверна - =#FF - информация о секторе не достоверна (сбойный сектор) - =#FE - конец таблицы секторов - =#FD/#FC - см. функцию 12 -+1 Физический номер дорожки (0..х) -+2 Номер стороны (0/1) -+3 Номер сектора (1..х) -+4 Код длины сектора - =#00 - 128 - =#01 - 256 - =#02 - 512 - =#03 - 1024 - -*/ - - -/* формат заголовка zs-snap -+#00 =#4D/#41 без компрессии/с компрессией -+#01 =#33 сигнатура с загрузкой регистров AY - =#31 сигнатура без загрузки регистров AY -+#02 (xDD69) 2 адрес текущей ячейки в дампе памяти -+#04 (xDD6B) 2 адрес возврата из монитора/ pc программы пользователя -+#06 (xDD6D) 2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке -+#08 (xDD6F) 2 регистр ix -+#0A (xDD71) 2 регистр iy -+#0C (xDD73) 2 регистр hl -+#0E (xDD75) 2 регистр de -+#10 (xDD77) 2 регистр bc -+#12 (xDD79) 2 регистр hl' -+#14 (xDD7B) 2 регистр de' -+#16 (xDD7D) 2 регистр bc' -+#18 (xDD7F) 2 регистр af -+#1A (xDD81) 2 регистр af' -+#1C (xDD83) 2 регистр r и флаг IFFF2 -+#1E (xDD85) 1 регистр i -+#1F (xDD86) 1 номер rom откуда зашли -+#20 (xE02D) 1 переменная =iy+#19 -+#21 =#00/#01 режим прерываний im 2/im 1 -+#22 цвет paper #5800 (для установки бордюра) -+#23 содержимое регистра 7 AY -+#24 состояние порта #7FFD -+#25 состояние порта #1FFD -+#26 регистр #00 ay -+#27 регистр #01 ay -+#28 регистр #02 ay -+#29 регистр #03 ay -+#2A регистр #04 ay -+#2B регистр #05 ay -+#2C регистр #06 ay -+#2D регистр #08 ay -+#2E регистр #09 ay -+#2F регистр #0A ay -+#30 регистр #0B ay -+#31 регистр #0C ay -+#32 регистр #0D ay -+#33..+#3F не используется -при записи без компрессии -+#40 битовая карта параграфов страниц - по 8 байт на страницу - последовательность соответствует порядку записи страниц - если бит =0 параграф пустой (не сохраняется, при загрузке забивается нулями) -при записи с запаковкой страниц -+#40 размер запакованных страниц - по 8 байт на страницу - +0 количество байт в последнем секторе страницы (=#00 - 256 байт) - +1 количество секторов занимаемых страницей - +2..+7 не используется -+#B0..+#FF не используется - -порядок сохранения страниц: для 48k режима -ram #02 -ram #05 -ram страница включенная при входе в монитор - -порядок сохранения страниц: для 128-256k режима -ram #02 -ram #05 -ram страница включенная при входе в монитор -ram #00-#0F (кроме 8й, 9й и уже сохраненных) - - - -*/ - -/* структура программы в анализаторе -2 #mmmm адрес начала следующего слова -n #80+"W"+"ORD" -1 #01 -2 #nnnn адрес конца слова в словаре (указывает на #00) -2 x2340 (xE024) #????(число) -2 #.... -2 #nnnn адрес конца слова в словаре (указывает на #00) -2 x225D п/п прерывания выполнения слова - -#0000 конец слова - -*/ - diff --git a/ProfRom_Disasm/!roms.mac b/ProfRom_Disasm/!roms.mac deleted file mode 100755 index 44d1f70..0000000 --- a/ProfRom_Disasm/!roms.mac +++ /dev/null @@ -1,56 +0,0 @@ - DEVICE ZXSPECTRUM128 - org #4000 - - defarray nKeys #1A,#1B,#1C,#1D,#1E,#1F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#00,#01,#02,#03,#04,#05,#06,#07,#08,#09,#0A,#0B,#0C,#0D,#0E,#0F,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19 - -/* -;текст слова анализатора - MACRO Word text -;.nTxt = $ -; db text -;.eTxt = $ -; org .nTxt - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA -; org .eTxt - ENDM -*/ - -;текст слова анализатора - MACRO Word text - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA - ENDM - - -;дескриптор опции -;=0 цифра/буква выбора опции 0-5/A-Z -;=1 номер атрибутов в таблице -;=2 адрес п/п определения доступности опции -;=3 адрес п/п - MACRO dOption Key, nAttr, Proc1, Proc2 -.tKey DEFL Key-#30 - db nAttr*#20+nKeys[.tKey] - db (Proc1-#8DD)/#100*#04+(Proc2-#468)/#100*#10 - db (Proc1-#8DD)%#100 - db (Proc2-#468)%#100 - ENDM - - -; dOption "0",0,#947,#533 - -/* -.nTxt1 equ $ - db "TEXT" -.eTxt1 equ $ - org .nTxt1 - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA - org .eTxt1 -*/ - - Word "NOP1" - diff --git a/ProfRom_Disasm/ROM_MAP.TXT b/ProfRom_Disasm/ROM_MAP.TXT deleted file mode 100644 index 73cb8f4..0000000 --- a/ProfRom_Disasm/ROM_MAP.TXT +++ /dev/null @@ -1,38 +0,0 @@ -ROM MAP -| --- | --------------- | ------- | -| № | File Name | Address | -| --- | --------------- | ------- | -| 0 | rom0.a80 | 0x0000 | -| 1 | | 0x4000 | -| 2 | rom2_SrvMon.a80 | 0x8000 | -| 3 | rom3_trdos.a80 | 0xC000 | -| 4 | rom4.a80 | 1x0000 | -| 5 | rom5.a80 | 1x4000 | -| 6 | rom6.a80 | 1x8000 | -| 7 | rom7.a80 | 1xC000 | -| 8 | | 2x0000 | -| 9 | | 2x4000 | -| A | | 2x8000 | -| B | | 2xC000 | -| C | | 3x0000 | -| D | | 3x4000 | -| E | | 3x8000 | -| F | | 3xC000 | -| 10 | rom0.a80 | 4x0000 | -| 11 | | 4x4000 | -| 12 | rom2_SrvMon.a80 | 4x8000 | -| 13 | rom3_trdos.a80 | 4xC000 | -| 14 | | 5x0000 | -| 15 | | 5x4000 | -| 16 | | 5x8000 | -| 17 | | 5xC000 | -| 18 | | 6x0000 | -| 19 | | 6x4000 | -| 1A | | 6x8000 | -| 1B | | 6xC000 | -| 1C | | 7x0000 | -| 1D | | 7x4000 | -| 1E | | 7x8000 | -| 1F | | 7xC000 | -| 20 | | | -| --- | --------------- | ------- | diff --git a/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin deleted file mode 100755 index 00ab98fa3b03d038406c9fd70c264e15b770f41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 zcmc(ld0Z3c+V}6t9@d!z!hj0*BuE3egjA8H5(8@0x)8;!E)}X#0+@s>BrIZPlCX(N zwTtcPLTh_US7@z=YOR8nmPpe_PsIa0O-qiAwWT?QS}e8_-kY9&-p~7apXdGi&2Y_4 zW|B!VncUa)`~I%A_X7Z&pa`x1`wd&d8OFdA{@?ffKetT%apV6_`$zw$jsL&5-KId% zU2O7TuUZnS8les{z6WVyzZyWJ%{WjpYVtxzDZ)Owsru>P~u#d9R1lay?sIy0nhpIXV4!|P7e=$mrLHU9~ zeMxz72X&%EdTEEc^^1dF?83g83Kj8w50!93j*lSk3CLE8D}07(>YUS;uUCmHy5vHi zw}g_==q}Yfy}q>fpak%@ZQZnP+bS)TZ%Bs^hiVW2NpW&NMuLMMGEYVva z`qNoVy50KXa;V#*w@$xvli66Q-=o_D_Zra~&|9o#{bRQ2J;fGiDmGi8aW5>~Z8V#v zAH1y)Di>z|=alHp`?nOEbuiy(uvxUlW%Ht=AzZZ=RvB%uq_`4&Dnk{lu<0z*2eUwQ z^xek&`*jAZ1r|SMv{|G7Ji&9|?&9)tXf?uOo3+GfRz>4c|NXq7jiwT#L8pS5i{|EJ zDd#F5cwp}R3$m1G$6oy&w8yG~O4UNe{fhbbXDjDrflolasd2Ee-2?>giS~&>An<4> zCQJ|{Gti_ExJ~U75TxKZ6o4c=r2$M#3=U3A;CYNzi$l*uV|#le!0SoU)Y@8vZ*?`I zXFlx7k>|i7fWPQi=~y{92td0@+o(0Q184W}=y10a;0n{INrA&6yt+rr04-23?Iqpv zMgWSOMd&zSJp(}ZsP;a30=9NTaD;|1#|;$|3iyGmXrc(dL_6UN9-tjWZ@2)zqWMKJ zydG052NU>gT)|9e0UHBPjJAzxM>U|e6>3^r0noH*uC(DKt-Q6adH`^!ae_ftYv&b0&Y%zTDdzMPwcec(qS0!0gZmP6p59hW1o<|PCF?8PM}v{4bw1hIG+P>tdn@wU4)xj*?@KuMHpa! z34F)K!9r{saT>I5_#NAMv5gtU6+f{CFSc`> z3IQzuw_HV9Eyq#c*x1+J-dAyj8OB-9vIae^?YG+7MV&+e)tEJb8M9iM?lv}Ciql0h zQUv1c`5+6EDriV`6BwtR!l>4)3E~mz7QHoZVrfyugjC>a2kkh=1KPFiTAbtR94rBB zrgN|l(!&})6cU?e&*1VE0xij0!C~UZ+BiyqqkrQZMDN1WVCBMb%~l5HESu7iTJruX zcB%$y6Yxati}Y57(Y00MNL$W0Gzx+qRAjNY(}Nm_r;E!ZX*k45+^E25?ebOtH73oc za0@i0y{d5Fdd+uGjz6t=SMv{$E{XhjBKssWG0{8Ro1>j+rI(H_@LIGYn)4Os`voOZ zn&p(f6u(v6m;fL;QDQw^Byvt~OD01>hLm+E$=lzLnNKR^$RekiCj?hSu;@ zlG$myz>e7$=+U$q7u1YO?EE&meKzECWpdufv?&|#FYvFpS_da)o9M=bHm);4y|+p9 zQ~So4ji0k3HV>u?4h~c7wi|4&G^0eI2IIaZB?4t)iEnWUHK!za37nu+AjY+%WK0p? zF7UoaVvBq)8O9qLjAtqj6qKdH`Y$VjF#zB02sLFT7;02i{1szI! zr!sbDu2Qu_FiEL)1gY~SH$s-&9X@gH?LcVhlO-Ud69d3|V_aQ^@}@faoII)H9OSC; zkK}|p;V}V89u^Zmop&Ied0NB|wWVG@$-nF>(m446x|@IL7+48c zYE~Albgpb$*}ZajCD8IRUeXq6o!T~Sx3>48f-0Z06#q@uQzz@{3rEN&!V(x&2Od5w zt5Y5*m65l?(J;OPY;&s)lr9D$Pnd)Q9U$p2`CnlHj8fH>cFB8lK~)QRA&f(g8j^2? z36v^)2K*)CD~d(g8pmK^ZmyR{~;I zDLEuvr^s+GFD3c#e&&HvFrT3|;ykeM@i3G}grnuWo8N>B;ZOT+1WgY;Ip&3{3>F>A zvKFJwyjwS&fXlk)(LkGUXwP)!G!#!~&!U;2x^b-$CEK}kp*HIAxpIYKcKTdUXe!>V zn`_WH!1|`$X2YE222@2T@RoADK{uyxuBA+Gnio-XVQR`B3=Z^$w%3+s)RlIHHjJl% z(sYbhCajZfP6K7>=~#A|@Nc_h>tuDZy~Z)W(Vqs?0J78*$}6S*chdc6>BT^iU)aMF z^!n?-zky$t7X$k5>nHHvRwTXpu1K8pN~dT>Tn|2stvotMt^5cI=Ydo;c@APatkBbQ zHQ*0aO#Wxdn>;zJ1p@vQU{5T;cs)}X7LH|cMh~+2t|>O_UJ8dhJjDf&o(|rh!AGOu z&k&+90%-n-NHk7I6pH9SBL zM0NT4tKD3UK1I@^KnW+ z`B;~Hc$@+lfdk*I^06>We$^ki+7m#}Z1DOvluOv-fcI?A2k>@09Pje_ipqz4M_9gO z_RwI57ZYmWwpY9>)CW;9$8yNC!wPwPSSgg<)Sfx{n90D++{l-d&VNmO4A_K6(0@Pv5S~Sh54u z9C-BL+|1m0a~_m}#kK04^Fh&e)$IfQx&68GZ?X$`09EbfexW*Edw~-b4JTukaN)$i z@h`&53i|g!LG`J=s;4Ge;>pIKzJi4R6`y=^E_nXzi|R}zK8dVWMceR^*lx- zR>Zt4?htvyP6ay*uc()J2mBQ*zllB470Mq%*?R5rAq5u*j*;=ayE``~4uu{b!tbUJ zg-VAY*K@V{6y$*W8ob!lRA|ExSnv{C@vFYbU)$AP8)gqe&Vlf)LFzlUSD@wz21qDS za{=EyU!dloIa94>gE-g2Y8FUxtyg0JKD%`wc|O+tk?`};nK{3O^1mJ}sJSW4uy&c6rTokY2)9&a41gThyQUtH40N8*28BSVNx^s0Dc~9dlW^`+Le*!+uFrlo zkx_)(m*^L>#_xQyG_yrD0g2Y>1E2FH0nKjYh&lEe1BYmBVw?EUOr zqYrHFfg@u+)^=?o5H-Nt0WbBrQNnXo8ppHw?y)}fjlRfa0WSHZSAr#MG3%{5xVP9= zZiPCt*=XjTXDapFfv2?_)nH2L zr0i|U40?$~bgb6@4lvgE-@*1(``=;h@^5Big)Q()>3LJAu*Won^8R8P{Zc%K3_a0N zq9~fjQqX~XUK6*%tDfrm_yIFF;xCZ=LkN%i_L#A6ehWG7+*>Ta<=bk>DHz8SpZj>d zdCX7sSMX-~&jXm{-^=nFu-g7}2+St?Qpc>wldjXph~uNLB8r0 zTke^huYK#y>fiqPO-hcycj`i=FU3qgmy+|lFWyexS^sX$ivF54Rh8?Um3g_=4c}Qd zMp~E6vM!fe3+G!4KC`UlS+}jVYVTR|<87Nhv~4-*w`H5g7dN?ed8V$^@s#5!!BgauP4kVl^Y`%tNpA~E>9+*>!}xg5)v#4t;uT4&7d zqkgN&m8VjLMluE9o~~|Hp%LKP$oeqrN*A>^>c(+uqoHnbn4N=l*f0InL9H{Aqeb(d z@1`hI-F!QFld3k5cc{z*K1XfN5aK`NH7XlMw|s_ZkngV!mB$c+aWzZ~$z9&+^Hi&+ zlxHfH$88j5;t3>4uHUI}+&eDnvNh=}^R<=xtcL>K7|z+>^omU?t_&@eRElz+o~V@G zuu;i2Q*{^Q)`Vknu!S}6!6>l0!MCT9I%~ZYG4bY}O4XUlu8+BuK4)derEjegX~a4s zoW@6c_2oJXkihstT{(g~aGo|kBC{!G1<6%@V~uh2G#oXifpp^9)77y zeldB9pQxbdYaq{!MFU}4DI*tx0$PTpG2|(jHs4KSYm!i=I$^Xu}9r>Qa20h{EAlsc{nbictFkLMfZ*ajY3sF*0UHN^tTXGTF=k8xU1C^^r2-L3_qT zCGW2;D#y+`$}%LV+!kH=JgL(yx1@vo)t*-z(x)8QWJ756H&z}H_N3SM-|PPci^BR3 zz3d3JO)qsZ0@BemvO{{@?x%oLsB{sSDPlhp>XfCrhcPaTeCF`0j0C5oH z*ZYOOl>LFEC+q8E;d~gGQc25t#BP!+lcl(hSI?X!#}=QLvo|LLnco8ZW-Rt79pvw! zF^+|Kl*NyA4futi@QAN_zrT(ZhLGdWW+^yNFn&9TIK-ak&*skdXY)V?c&6FL_ge+3 zR~>#k#|~`=bq$cZ}rzFeSs+7V`bdCb0SE`v@$ zPwWSD2WPG8lHEGvpPVll$|*eCETmqp%9XRJ$E#u^;(l_&Na_?G^$hh>6k@{ zG;8Qd_-ON96E$Ad1=-YHSX}>2m5MTTfm-?&G%Xlp9ypk?n~9I)3LAZnDk>pL^#T+! z9s>|IpO;5;D60)rNj2v}(m#$sF14|m{F%~Jlc7)YVz2P(T#^`Wtei0ybGnv&S|7u$ z)a&f2y|g9q1d!6!Sm%P9kYL38*ex!d&Hy7_CbK?e7cOy?8~3H&0hDKtSzoEca~mRr z#g^TAJuW=-nBD*+m=K={48ot7y?bLnc$_7KmW@^AIu$P5Z``0mC`#-xR_Zp`RS(5K z^0*2DyWUy?i!EiqpsUoGljeGg%k9Ng;Kk!W!i(Oc-@8|5MxYkLWk`;4o11yj&|0E{ zmg4=ujmJUxvp5bqz6eu5Ltq*VkoHg~HpR+b5$g2j-DbGL$d>vJ2K2J9Kr#A~VY> zWMg*O2-&FA)(Cf{|Bw;e7=A>a6<#Nwn-Nd{6cL}^;8Dy-$@v$#&lL~m;g(Hr(jMz9taWv_|1H}QN)HF6$RR>Pk$16{fEb0f-KSE!>fnU2Gg z>$y}@4LK}`cZXSUJ%~zZYS?;!00GRw*%$3RG5(pMdThKPw0)wI%C)O8UtGypw=ePl z?_Vxox}EnGfA3)eNJ53Rr34rrz_K_mxH?3EsDqI$E@W+hbsitArJ5m+d9enMqTAqJ z1~bh(2~r!pC29;IA^b70(?tbqXMR{8dEip6HAp5fc?Y8U>40#BOL@AsqCB#u@p@hk zC(Oy2Ur|n#(#jZBw`f+v$pVuO zSsl}E0pk6pa%5@DgIcrBg0Md_1j=+(^T3STbnJt-XFTRX!czVtev{sW|5Z5KEn!71 zV>h|d#J_GP{Yxsikh1XE1U!F=yi*)aKI=dqa`n-ljJ}%b?ZO4o7|rZiE|MwBG$g|V;!U1hE0VCz z4m4vTfPr-=!{$FZ<8+duM#qDQ@%j6~LnwI&$vghK1iQ>%N8;S46Ya7YsARg8YY$A* z$vRo6@IkY31=KVn18-(u(6`7O(5!oz{0bRy#ApS=27+ljizlQ;E3$X>2B{kr{~>PR z;M;ctJ&2;s4#&V)weW-NUGm{<$jQv!MGkTyx*-3~vCGt~59F-uUHB(R_R~<23m$$U zNKj@3C6Ijhezz&>m#z;b)!Av#%*1iMtjne1M z0RnXMSfS4UNNH7YN5&j8O3(a^40Dg{={a*%^UOQs*vt>*?0I0H)M3h)Z8e1Ds;hh*l05|Pno(%h6om8SobU!XatDqh(mED4^o7lk>$6rMQd%Wvv+jr6 z>#L&Vq8JfIx+uy_B+^3cXgwKJABhoQbKDtUBZ~0NliZ4of9+5Ob|@dUh7bOIR%K}W zJhKEJt^aaXrPN{7sL;&fZTDTUBKU)dLMD>0(jHR>LJUX>s}q!+Cg1$ZFm}1p7G_

U7 z{QZU!TgF0j8t6%P6Te#%#agDsM%-;cX_ZH9vVor&YB|hk@|OH*Q-h1lJ{22x1Gvcm z|E0y5O$JbkCfBke2(sL!a^oJ2!nILn(LU&wBuN%$#d<8pa-CX>(B3}IlX7QzZ=GF>*H5IO0q_!n-nm-1_gmfF$<-`bFx2*~p|Uzm!#ly=IN2e9`C^Pcfq3%f0GR8+fX4SZ zp51cQ@ox86|5=1G^H*~p1F45PylO)EMrDWcmrAgV9s;xMdP;&zHOXY%ilSkt033yFqrZRc}tU0PCcz`R9M;Jpb z=E|dSfjf>X=i+!nLSO~TpAPKVdZ3XmwD-aaa1kGdkGayEJxKmxTmY_mI=rF65Xf#- zifgKr8>&$0u;dR+7*|Y_;>ku3CIkTEV&ZXEAS~rf(j%g~hh@?VJ8`kf_t}2xT-Cyy zzl1uex2ws>TsfEWSCc}@ZIr%QO&zY5o~;sZY@|TIcczL`qS9e^HHd1ME-$FdRjJT} zBy&szceH4hi@I5b&!^*H6i3zAP%Uk$mL94GA4vKoAG%rJosV@i+>L!Ah9 z%3@-Z(?XreWDF1BM<0#yZ;nl;An(bB>Jfr9+~GU3-~VWge{-y=r8=V- z&T_X@OPj$gTBMleu1gAYuosVU3L5AJ8j)yfPqmN`4#)7p-pBiA)XBN(45eV$UpM0> zoBEQQ?V*ONl2f476?{w&Zh8EHo=AdU)|gn;dGWTLTCVsMzC|a)x7-z(*|WjZ;CXcE zG*^dKw^Z})b3LQra?@TU*X-Olgmn4FokQ=RmM`JmMFe^qBG4Vv2>R%dg6G;2S`F1* z?{-$B68{#POc)BSZmQ;iAtV?P!A2Ar42c!vBLq2&Bo&o3T!%CjD_bF}%bq8*XT@WT z%lGE~EKWT^4Ex^Ok7=>LzODvg)}ZQ#9m?-_sBZ1(lHW)Duwy|+Fq|n3hK*@c*-5f& z5WLF6#Mm#5U@ElzmmL^SD&@~?2!yF`!*vVz>sUEZGFx*PL1yCX9atlWoL$VC zZE1PSFEFe2$FFheHW}icrwuv#MAuoZM?;;cTCMAn^L%eq%g8&t4emFp)e&HNtIuqI;7mg@I4EZg(U^3_+UI~q06(d*-SGh^O8dGd@ zvvbK1L=xsjGhU3_=pgtDeM9jweFKV^sT<%VeFMM99C)9X3%&w_iff7hSZAV46tM(< zpAKkFyGJsQOfPH82HCh4BJ>vV+N~HRLt9N{bX(LTwZI7#7 zcYGihsIi%5o93wN+Wlx*Mu7DyEUxiKxzQ(g7m=UzFj{^m(n#qaP z^thbzrL08^`K4HDGO#pYo+8)X<149T|JxH0P$IAz#j3Opc3Kk1)ZW1=3k@E^d*Y zUc(p&iKdzt1C4V_^YFF)hTSl&`1e#?5`)a~`$VmhJA0goSnip_gi@f8Ue>XPSbH>&D{#lVr=_ow9=@uCX4yc{Enr zyCh&l$icBA%tz)pi))PhP84#D_XdTVA6Gk{6t1ZA6(F{aq}!Ocmu=G|)ECrk+&P06 zbE`!(mU}hOL*Byvl`@b*rg2wTTHyrBNSN8F!#*9t}`OA35+gNHt zhlaT1wNsNr)6 z&vz4X;vo*}`R>Gp3oh?A4}~5Xs++Wf$;_e9`k_RmyW`^J^Y9dxnivAb%z}lc*$kGp)kLUH}b#cLJF%MOqOlfkP8M3{sT58=NsB#q5| z2AbzWf@-rYpblCVQtg&S{gO+rin(w**d1+4(7P1a2Ay!j?8?SQ2odw$V(ePh70}^cl~ zM&i)m*cch)#60VhSo{>$?cX~^rVh zWuz+l)j5X}?<6pX_^%q}-C+>yQDlLgOb%a@`<#C->Y6E8R@J|_e^xHMs|GYO_9`uE z@XEd+RxvZ=XBE+2lO5RU9Fv_?L<-DQS&39UDV&Q)IEXV*lz+jte~!dw;Bl9*TWGdSm26Etx|# zDK9DuDni>qcgkO43mG0OVqa_*6S%5e=n8cXiS9Nc*ueWisNk}eF>q;0^Mx^68ZP~@ zBCS>WYeib8G;E{h+oUgB)k~CbT2TW)uUVa^{N0KSoL8-?f(q(E3$eh`g&gm_7Gjr$ z%yCgbfiI;YiZ&FjC?14M>4RuwqsT|W2TPyvNzBv+3$fZVK!C?F4e0g7S$YsUISvGj zuaSMp<0LSrEp~P60_-dLD*K`v_@1(|rOl!3zgBdFHuSAs7OSI2xIR~BpeKqrM1ZF# zs|5pC?*LeRi~vsrdVJR{#1u$-s;n;U;dH^+iLfwjA}2FCN-ouBPZ`xqUOFI;zRoGq z_oO$hN&Ah&uk-Ne<7?9Hk=&Kn1!-Zuvet}Ypr69tIMI*ST2iyYY~eZiuShA*B44Ax z;{<30=Riq41&$Nom?FwUECFf9fz`7r-Jm>g(ztQ;oqa|5Z>oVy$+MKDJzkf#GF>`g z&H#Wn8W!dx&Yc7K<<|wgU&xqXQT9~eItPEDp`7<~ky2;C;vROB4AERLL$`4)F?OE9!lV3l&MBhu~Gxz}i%&wBD+Xf@xOBsOL)!0(pu z@Q!*r>IO`tV~BQPUgo2#XC&o{KEZb>u(&Fb#EFOeRID?!T441HC#e{EQaCBhi-|qF zmc$ZKUz$Jjj6AA<8|zxspCoIFpKP>ZlbMs5_&1_GZhr>XiknH@Az7L;vu=Sgoxth% z!TK1yU)(Pu*{*0fuF3JpCS~|FUdoYxw?pZ$@lgMb?_JxMk^glF6e!PG)!?M^q7{hh n%hG;bH`~DfvK6G~!h33P+9;LSP*0@|%xguylQ?a(tnPmSC~bvB diff --git a/ProfRom_Disasm/prof_roms/rom4_fnt.bin b/ProfRom_Disasm/prof_roms/rom4_fnt.bin deleted file mode 100755 index 918007f0f808cc296627ef8348ed290d71c42846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcmWO5{cjUx0KoC5bKq@GcY`R!OnL&cMiOZ-#51UzWVqW;9MMVw5v!38vkqwi^rAmbu<_8+Uyf596*U|HAi^uMM1< z&~vTl(m;=Zt*>8>4FN0z<2NI2 zv^I5rCP@Lniy|?IyW^D4O9fP!2(!&KCG7?wolA3h2S62DScTo7zV)DWu(ke$V~9c< zMApGe;2=V-px0RgS&E}tVmp&Zdehd|I7v9c`uCLCT_h$u#~IAL3=YZi?QI^P-%$os}l7c6%R2m4V#MT67*oZp;If~neI9x1LmV`}Z8h{{lv8L+s zlxhEX)9vjVYi{~*k>n+>S=adR7bFNs5bj{KC(S|&D(U}x1l&$m(g%P}20Tey0t{e^ zj_(ic6J4gjWniWB0%%Agr{%y{XELVdo;Fn4yc2WpHYK!1j+8(EUj3LGE4Y4l(zeLG4l{;4ZEFd83|=1Aiq z0qFkYW(JhpmE9N1m{6@kc4f4Tg7#ek$P9CjXW3v;L1<8cx^JGKomfsnsDO~P0|?1n zz)vjpW#jps8UOcLD)YD=Ecu-ZxZ{+-(!Z)kk^JNXrazYSnNEc<{lwge>8?1Hub8qy z7)=XhMO!P@EPsErW=$WcS?_mNf0}wpJ5!Y3Se2=!yoxclvTf3bMg1wgQzr^`ZK_!# z4NEEN6F@OmPwDD@t#RT$?=;!$y1^YSUw`}P`Fw#aZoA>AwG(+yJ19Iav`K9pGSHtj ztdZpP(GdIPB$XBi<24m_c)b+0@1|jU+Ycx0F_9lttRr4`(AxIOH+x1si+j&bc-&S; zyjJDxb7P;|6t&rLZ03Afb!<=6v2WG*TQCtN|9fsaHX|io@1BFXfSnO${QU_j-zvD!Ae<*$vGTFKYQB-pRbAIt308Ak^N!D+lA JF2leD!2f*pt^EK1 diff --git a/ProfRom_Disasm/prof_roms/rom4_vars.bin b/ProfRom_Disasm/prof_roms/rom4_vars.bin deleted file mode 100755 index 2d9e35f8b2ea5f6b510997367b03a207fdab34e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmdTs&l4NFJWMJpz;^AP(W?+*xl=fj@W?+&w zVt@is1_lmB1u#cU!Ge{6flUj<6JuafuwVi4ZiD0m*aX0Gq98e51`eo7kQ|!;tAHg) zr2t3{Xc|}_hXRBrp`ghQGZSd4f*}%*kH*nr&nhWZ2b59B|v|7`sK u;Q!D64Gs+o4FU<~kUjXxk+ z5xn;t+O*PyOWDL9{lgln7SVNa|Jcf;FeQXQ+$bZ!+EQ9?i5N^Bv+5Ag!b;-Zz*Qy&A9hTcxxYZmG4q~< zlZUEHbTtdsamBCRtSvDL0Zm%X(vySAecM50njF_(6RMS8<}Fe!pXooztO!>X4&-e& zM)KcQf7hyeyL0Ymm->V`i7mQPRU`%Xj>h@6P&qd-HWqJttID`4@7|jxycbWtsLLqP z=V!i2{=Qx`ytQihK*;vQ(T@ifkB1nQ88EJWaq-{wWh8R{Q2Ry4;=k_egTm}<8Fy&# zdB*UX@z5+;e`@x7GW{gDwCd0 zGphiew*xG+FSI{z7wuMiHJvpS5$Q>^KXt5uXudJmGmk)A2lZ5!hgY~lkiN9>99Kw< zRQ*$C`l%A_bW!icGLf--)e!$ib7oENNT=@@yU3b5#&h`>)p$IA!|m#GVLCvD@``jt z78Uxup~g=A)d0-;SKWtuhfEE8b{RWgz_@`oJS<>4!u6 z2m>JX80^0eP4M8j$4ng_5DSv+xA=qVuvKB_UZym`-%n?O-oOIv^pp-+hvpAGG4!NB z#N?^1;_3Hxh~Z!C67hX6`BNeUi6D~*XcB%cdq16+Yr;W3ps?`D50bGyktEx@*$iN2 z!9~^b>26DEx7cqv+rXc2756uYkt>I<>|p+wPCE2oC!2N2wlk-TGW=DL?~#XJ za9f#{4@->0aTlMj&?EoG4DByCRKR3ztKYWTh9w&oA>vBE+Zl8(-RyJG1vdvhEuLUI z#kaWq0gty8%a#b1HhL~uxd_XaFMqC-l1jw2p2lXUy9L*HTU~xtv3{KqtoT|1>Jshxr6S;pxZ_N4~K>hBX=`z66^WQ^2k1_=$3LIGDaQ+7&ZcHh z0O{in_}q;iXA8Prp5RR6KEHRr$K`fmla~hI2?YI~ouL_yGk`v)KZxEY+}P;#`(}i< zZA43X#eh!zu1#fF8U~}$SVlpAFZo+nN2%DYzX;!W6xG&@m%oqzGwchC6 zyVu!NDlALNU;qYeM*t>a5=ppTYQrbPDKbLo2uWdSxJ|0Z zQl%aZK1mtDk_!-?gsZq&xr#Ph^T6l;j(~5eAor%OLKuCMSVvw~Cw*WD3zGub(t(ai zhp=6#lA3Knr3x#}f>kGNpasYAR5WEvNf3#k6o~*xQE4PfI7O1=J_#-; z*hk34BT;EoiZWXj2@JLcLaF0|>Ts|JItWTK%;|{4Mj}8|bTGM!kB~5N$jt5zM+Aw$ zg`?3F^K>{Rk0R-C$fFS=C@E5llHx!Ddeuj;p8QzKB=5p5l`0(O`yh+-fJ2o4&K>c^ zVo@2})JTeqs-qEbF!QNlStci-mFmk1-Jtu?ZXgrNbkj-2_55B|(Vpq$yp z{tCL7s3NeRviC_LvkwIgry?+YL;wr>8%5@soJq@%HfIKcVBO diff --git a/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin deleted file mode 100755 index 460760d07cbb2d46bfefd4d39eff5aa3b1cc4493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 zcmYkC2~-p3`v2d_GD%pHNdjTQI+Fl~pcqm_%!P=E($*>{E>&==fU;x<*^!wf1O)eL z?W$ew|F*qtv8|TcMWGZ+nvS>j7He#$HMQZ_UOKI`;!gMv{oV6F|MQ-Q_izpgnaMlP z^L;+wXYk=`4}%hp_QjHIC7mTFO9o3umKQfuTdI(I>Y)zxz-TB;b0?(0B09jM`_vu! zvMM$Db0`vv?gyJ(hO(+$AajRMY^)!|?nD0-5@HdCO;rP$kv!1chn^217|)2IZ-k^k z=;olWgk%75%FyS)wx`jTq&F+Io2r61h*52-nxG0Qsqc2;=PQAT2mooHR{>%WJ&=Z1 zp?+)*Ij2geJ`}<*xnJb&XlAaxQ^W0_T`bxVF>8qwNv!oR`n`% zhq}r#Nn7YtU<4S)ct`(M6`e-Ekw&MDKwuj!8iIu*bO-ni(CQ^(;G5%`Y{35w0lN$T8zOcO1NnbNIJ?hA1RIh64Kce* zz_z~vVfWdPvLX9#$k{y#bp935>^>U`He&u8D7!1c$-g3&-De|?jrjjY0=p-I!P#&H zN5=es=ca>VCBoT%;69bO>(ioLA)xGwjSd~DMz-Xi0kZ$smp zCQWuor-=^fHSwV(SBi|GZ$n8ZegjRTzTdrAq}!;wVif0xzplSxsMs}MU$M)`@#4?! z3W-NU*k~wn6b6@d#i9=HRy<#woRT_6llJi6-|EmVE(fjcTlUOL&&!zmHx=n-(wTV|RW-{v9eT_U*)kE$@ytuZ*LA zSs6k95`=_6bUi3CVz40n9L7QJ@d6!`rdpJ z+c>n9J2Ai%_;CPMF7xa7KzJC9hVO1(tMoIE`jNY7ex}Bc@!gkN-oikl%rI;G zAnQf0?soMyx@};vEyTTo@!CT_U%~%}>lGSd;TVbujeH<*%@-PZKO}{?3W*F4rxit$i`5zp|>2j1y2LrIss6D41MD80mof|Yhq6U0tiTa!Z zJ{B3Ffp~ssItfRBpT_6bQ2T3;`wBJpC)dCzy&z@yg)E5f;P^2Cy?{e!LxWrWVz9Bp z&s4*En2mlJB081CZ1=0>k=QR@V`->#)CdMXJy~fi)qhrF1Y&5ow!-jPO{j3x@I}qQ zrz4fdLQLsFgV$A}+5qo(*AyL`4*Gd7x`b0gKm0>iK$TcKDdasw`lor>#3U~lz6oFB zx4VE80Nx30$`qps;p&7 z*VQhkTr@tv2KkoM;2?Rv7V-Cb6*6u`W!3hEy87@vUB;P#PcaiO_E`)yKy?F}DQblY`r#habn8K` z=4WcLIj49EQU3GO9MdF?e^>`A>2mio4j0F;HbFAct{5eb$F#jitC3I8{f7P40nL6xc~uC@@q~0=!F7hsRhQwMKSGhZ zKlDm_u|a7azyyX9*1WShG?k+}a6TzVNWEpFU=#XGQqBhyVn=VSerk8o+q)mDx2GvCrSeD3y938)(?%;Z*JU}av>kGYHC~*@vNnOHK&ne)}nY)fVSHFP|C9dRS znK1$=aj6JOJYO0HB`ynx5(~vp;u-`>TrYzXACp6gtD+%fbu^M#B*!uphUA*uajrhO zX85cFAK%?EzY(3nzoQ9^Mdn>NAT3ZG%errga11)HM2a87jMsBr%b$jvGECU)Ye#SB^dbMw>jcT>^ z5C32>9Jhe^yaEsUxna^Up+X{@n;t1CLH1(NrImG+JL<8Fl4#MxJ>nvi zufJ*$Hw}3XSW-cn^y|l!aF|VvJn+ih?D4!I`#1T$RcbB0h=*`6_aN=vQ#05nH5x>#JtkH--F`52g~FK$a5|;1f4fz^s{o&N+2I zDG@ISu&U)f61~hbx#7qGjK{N(MI#G-d4XB+y|ww2hNlci?+gX$fDzU|ZqskJO^uA< z>uupqm?qTHZx+aHm zksDrUwNpHUq6%VV<_gzo+rS`av%6XUoK4Fy?=6$sm=!0i*+3cn5pf6FO`>g(g&&U( zNS`Gh=W~#B@K0oZNk4wn%~R%~ce$~B17b`%Go#^&#d10Hmiq#{Gh<%#b4~!1h$((6 zk+Q9`8_T0Uv<=ro<1;&s-@X>?VmR4m1_JUJLf9Lob;>9QCXLvI_T0k(m=rq z_kct7yaSr{Fe|QFU?3VwbNL=X5s-J^8Ap&gIlBTLa?|a{odW{ZVqO$>z2SG^}EuyA(1(fHyI@F;8EIhHD zP!GvnC||8k+ z?huCY=xmOTcbcRdL0B(0gU;rs(AhB1f~R{M1a!U7@Vy1?O;rMeyF|Aj;CSvVK4# z!cFygyasY}y*PoNMB?or+9|<3>`xJX2#X`0MdFkRk|C!F!dguUtFYtq_8c1Z0H||n%n$EC;yM3% zWkU@X>8H1Z)9WLYy8nqlfAU|NaH#ESn|ktAXQO%oKW@q5XTT?jK@s06y;U1=dcRO6 zM;^c;{8nxD){!6-D1PAPXzm7vB%yz#gv6M{D0)A8tL9oZ#!JuMieBMkTps!ruTgE} zyszP8Z$&P!>X*PciSTKse(7$}6KTI|qq;*IHJPDRnt9q-;`gxFy~car{*a`LOUn5X zbvUE3Z$+PVUj{i}heWzBg>}S6_CBwwnSUU((W`)>5&r6i>Ux9^Km-!D&rr6p(y_U0 zm1Q$fARy6IWIuf_ zAKC?f?WB_J@I}Gvd$H2W?e-nJs?9rNHt#oJPq4kRy&0>oY^ujVsr=ZXZ<|#=H8BoX z3odS>t~cR}F__%Z3?e*IaBU2aY(y9KoWkF5h(*k)z_tV@KHh}PC!(;3u!s9R&8nVe zRc|x1;!j)DJrC^z%Risn1Uq}LNug_y9%N(8DMj^Ou_Q5-IhBZtVSpUi5<#zzH1srU zJ&cS*c(J5_J+%ro}B`o0?#{{vc2FNvadNZlX!Y@oa?d8YyCo^XYFSH z=`)(e@LfqNv5AfTq&dWa`5N~D{|06SW^}%Ns)bkD_cIrb@iQxWnqlCFM;Xj8yL2>*@}pr7`BR+Lx4}`5!lGQd{I7P6_;S!GB04( zB}mfCrS&ZNsK6fERAR4mI7)Zf8_c!XBPMH|rJ{13xz=oHG%x#lX-njz+;(CO8%rGR zj&^lB5%W+xk;MKk=C*qT#w9wAagC#$T;r7;Q1v7y=9C9LYFZt zI3<3%n_8Qc!=+MM#OnPcU!=59plk@6n4~ymB}yRkV1EX@cy3EnS=YYiDVF%4pSeew zR#yx6dsoZ`dv)~1jFl%V?RJYDtEk*v%_5zWHLEbJY)xgoy?Jxlk|!+o`puGMGCy+g z82)0*0xX95ypjb%{7e8AdPA5oCgODh;=b5zRIs>;@>WPcbQV+s?)&mO@^p*54#30? zXxyz}N;g$u*N9BrweUHvVQ)n+CWl zq{52?$ht@%yo=otx-VHOz|G;OJMT6vwtypE1t+ZVFW{5`6dX}0OQXPlo&{Kiy?S@0 zp=`#GAGj;)yN&G*;Q<*}lPs_UCEY<;EOfjHfn89IH_6Myz-mZo8u zixy?g1AJm3cUN!qj$PX;>#!9Ta|L+U*<881G@%=o#`9n)Hym*Lq`Yt`p9dk_P1V+T zKZ%(I?;SEA5fD^wDS-+s^^kSvIxFD!RctUr0%^QRAmv5??g1$;Ldq9G7}jX9*J3NV z%X0zuePC`E3UW)dd#U6%n7Lb^n&#t9+u`BBy|Ym_z7x(U2P ztP$>ZZLh!_dT!5-?e*L1EISdNb@Mhiv0e#vSsLoC4fRXot#0d^T@V60Dj!Su#JRn$ zE^nMf;B8Mi`3ZCt>c`bUu$KHK%{+d9lqsk zT1Rh%i+ml-NsVYI{Y^2K6=r$ZkNVe4d9uIg14Y+}QL47W7_NsmQ@H5bYkmP-EP$%W%VN-wQxS*MKHI4pp+0 zNBcd}>@)<*L7Nl*%mP$I5Xg^BD1DV0PKHFKH8Z7VtM$>L%&GDboc zU_AI67Zp(Vt<-u;Kb2+1vymDi4{AIx%rW&(&7z(X>twD*B#j}ANLOZfuZnN>ol|d7 zuUB^zc^8~fUj2t{P8DNR=_aNu_t*qQU-Wr^O zhRCcAFuoW4MuX`xbSY^7x(=1Q2XN3i3T=1GnNpP*s&+!`;kxa#c&Ct+kh}{L1LhPC zf?ceB$3LpY1jKnv;GSgF(j0(#j8bTN57R6S<7|JHIr-xuv(NtN*JfWE_D60=hC#WZ z=vhoKg3ak0N*zSM^?mTDR$voxilM{Ztpgf}JH-@0|MV;o!%Ugh435ak58o_TnXQw0 z*rpN8`@?I_kfcCYK%HlnCwYS-;4CuF3BmdK^GNpZ*EyklkpDQg=J-&6ZEC&Rl$!oC zZEPDLm7)}GNtA!e=7lJP&+_50z34yja7+r3Mg_!mQ>SY$1*8j(Y-Ba*&qcP98|vzCnW5A} z3T(2%J`JP}wiUUXbWmyhLZk%g#@Z)~z)qKkU@T4Dx=>8X%_mE28D>rSTPS zOtU%<6H*V`sU3FBooRE-bQL2T35Lj+EqDrEcXbOtku*Qv^6S&U7u@b z%3zz4|C}2a+V(d_|HG43qteu%(&%@{zu7@D@-(p)Jnf|V?7AHH=`)}7+8)|s8;n}j z1py#p*6<&44wqV=h;tRPBt_=t5QnF?h^N;}{^~BhT7%t?Yv)e@C+KOomvT?{Vid{p zwO5^*8VKYOBB`d&Ysj)Qg&MY)FR=4kvdle9S&lvRB-=p4Huth(E&CaMIv_9@>}PdQ z@rYre-I96|EbQ8<=wwc{LhDO%2{`I?*QEgrW{<%FyY6t*txVBqOTWmjT4=|%l9~jtfn*A~dk$-O(OZo?ru3pif5Ac3Ik5ZOeV~mT7`48f|1!z; zZLg5U%aEhIjn;#@gB;t@AdP?Qpqd>48b9eUN~wL0QKKA#XT>@ZlQNH_f8o7)h&2M* z&wg3VIw?;&n1ZR`lIX<{N{ZpakZXZGFjzhkk^)_SuAcwo{xvy5DR>0}5vWqBh=9Wm=J3Xb&@g3sdYf83a3?s#HqB%F0goZG zhG~YAqSx?CT=_~kf_H=H2lC|C2wHIKSYT*GaerisI(F7Y5e?09=t(*lbuQY|H)Nb) z3UYP#L&7Wlpc&3~UtpQWBpTcIbGac{&hiO?cD#H@O|}n26R#E<{!@Nd!_5FYRVlTh zp{-EVU{ekZ$vYo6&gexAP5S7DW_?0KE4p$2&GN+j&=MUNhPECVS-tGJZUw@u9$6~p z<8!$sEI1#U^#+ibLqn0sMK8;5Rp)C}AJwW=n&{`zmyWKhopl*ziOH;+zygjKI-3h3 z2p))V@_}~-{Qv8B;KUQ^V~MaI5A-@x2UTSb%4MQFj;np}#9lycw@`QORGN*I%Q;(u z{y>pmr|6z)Kdq5X1}`BfYx1R%=x;#Nh31a=F9k(M5BRafN&ov(ek{g6Nxf>tvYdDA z{``mC3iNF46S@s`g3h(csY&BjwNPSQz^q{x9 zSSH3Ak2<+$0{suovS9A$v8ek-sYn-Tl#6siW0Xk8HO7dTg0y2#jRe!uRu-m-hC~n; z6iNT6V__ftOQ{z;Kc)S%&M0|h=cIQ^d$$g~IiF)n$xQEj(olIZuM#NH|Vk2>j}b=d%l2y^^>BtX4Wrz*9m)>%{=EUJwb)oP2X z%%a+C>DOo0~y^b z3n!@0OhcEjMAqa1J9Lk+hx}3ZEDfE|$w>4kwq4T_L1Z^(0gsTvTQ}(4VLc<|S(64045Yt(O}>HHJ{#cqeuX z5%lZ{K^o>(r#=J~A9|+_>I6ZiAm_UPw828%u>jaLK`pdOlPTaFnJTiboh_S(41d(U zuMrxdoL`MI=+BcwUg-?6ReDyu3pzoTnxscucUtv-AVFdg4v6c}6{2NzB(|UQ6~vdj zAr0qNCz1f3TJj5c*X7%zi36B3W_*t>hP~dmoJ>Igt_5$B3$3b5A}Ebp)QBhqi!@2brdQ%|hOEF}X$py7zX;saw-BNN-IJ3drnvW^ch zv5dDjNIhhlu%|oJmm*(xeuzl{N<`{VLWH5jC0QE#EvNAE2n2~nE)&;F$}{_Pal}LU zaYUQyJUKMU32@cYhcowj7VGMQ6aB@RuM)D=Ysu0HR+sz-T6cI{yV{~w`zq2kf?61SL7jeDnw9yvJD?LnrP9wyG!nl_Xz;ntJC;fA7Q!o; zOQN^AvF^4rpMPMJKhdpyP^VTssGErUUHz0@?hNR{kw@5Df;{Fb4{FyTW}r)agOKD8 zIXg8=ISWbjs$69?bMirkF3&YYU9oY0b2CfJEF-$(GLH2bj-%i^_H>k4#J{<!a+>-vYy&CUlZZU zKN6*?v)wS4Hgo7IuH0fx;D^gD@1xbMKllS3nD9=G1m!6Bz!@+KB`@!b^hNukm=#+r zV!*bZk0Fwi?C8bqBEvSz8H-`7rL!m`%!#-xENZ7VIO?`Hp*Pz3`-mp~eljowF9s?n z3pc<#kQjEB{IfT`!qcv1`EuxDc z!nP3_$yHMI0haE;YFSs}p%IHga#NDGsa;&_>`;e;^j>CZuS0*y5%GoJ0UjldAiVU2 z@Y;o5*8XKy^g8;Pf<$y>q39w=!0x3TNIL+}AT9AP^zw9fjTP@>5FbxRc}G*{H(d@( z*4@8gu(Yv5JMFV3o?VhPUwI%!rvpMEFpBi^t@x95Nw2v&A=O%5!ahv(p(z!pzOwe~ zF>6wgkfs-R4@#lI254q+c&RgwZ72YlY6Wr^#9N##Io(aYP{*uTYYK95dUFtV9D_=- z;t)V!*L-VM0Eh`K$Z&%}mRlxmWr>1N3N3Vru0C3`#DFgnce{seHI7}9kBC~yzq`O+ zj<{fDufJb^u}m+P}@b^ivUwEGI3({G899<^5wEpTJL5r0tJBy&0aIgvtvV1Ptzf-gz*e~^A+ z42mHyl|o;U8e_z69xN7vCJR{;X0bs84tF>n9BikN9miOcq^)HS=rr&Ff_<^L=;Ha}vqR~V^=q}1pF3h5bi%XsO<0;`_&x*f6?36!|i@d&YnPj8(2vAtv3(a)KT~HDo~{su{q6p9 zI=09Vez1l}k4-21+j_eF&HhGzlV1&*K|YC+`KN)A%qc|-uAG&c70@8wEj{Zzt%0SV zcA?++PWwK>?9!L;^T=k`^>+V+&Wr6LCXn;aR(}9|*VW>09A0j=dJdrHrh{}4*Rf#6 z4naKG_dVLRCTJ!k3Jyt^s$yh&#fykE>=Mx-UfL}Mjmj+>#>Q-yISogoI=k|^QSkQ+ zkh{H>pAbrQ z_efux?AI=%6ysdr$o_?D36lG+{+|3S!I7VJ(}C%Lm)A~W@)(7%n0v!z1eb-p=w388 zIN?+KWO>+K?l(k-HpIQ^E;h`!5*W^l>n<9M@pL*F5lrpU`!D?5GG{4@jhlXp+y)9?#&?>e-~)CLW@L=&F$adE;6uu5!k3w(M$?!Se9Qujl2|hTV-V{KNb}EH zqny&tvmnFOuTQWozbS5a4yp)6QT8T5xtQz-yeZnYAE}z5l!C&91KMzbLxm z-((8LUH!B?D|qYJZ6M<&M`zE;Sya>d*z@KjkxU)MHVu$U9TlCua97VW-{$gV^1>02 zPI4fSur2z{uvP&a2Y(o`f-4e)i^4?$g+K`NVFAp~7ARuE!(d@pI3JGY!7=C>Z&?u+n{-e z4^5{}rz1ZI(%pd8-Z3F|WqqGIwKKgV%aSHV2qiCfpBVAUeKKFXFCh|}%Fl7Dr`5>U z$uj2%48)T?jHQ^_nH!xp3)k-G#^reXIUTVT1-hvIU$OA++`X5-JCzy zrDXkeOzy!`Eeq~_Y!N*hcG{H+G;(gVQ`wQr-_Mmoh0j#gq8y_rO-;31X*GJukYF1a zEiys^WSaAD=X;H6&dnZgux&hFAh;mszbD+|QvGDn@}AVRlfmhQbmZ5w13jeB3X*eN z>L~f`>&B{Vn3z6)PqaZ7t#&ahMExRa#Drggwp1Go;KPdyMcy=faLH5)wnOnJn-^ z_2SRN=j}@gUKX-bu*`~h8;>ur@)Jqq9>>ymhBfi&dWcp}2I?RQk&57CXR%dnRTItO z4kw3J!zh_x6LGoIY+wJk-O}Bn*44X3v3P7fIkT9@(v~jcpq{jPW4+L`&f$1Fet<2H zwgXEJ;Jw}cIA4o@a5&YPnt6sdLZn$!XXh9-?@P}1vU50(w}yneQhyxCIV$&KMZqzq z^k)aH9zN&@jB$h8s$=DzoOgm7OXAYN?Y&U`Sy2Z*{gJXu6}=Y%ABghK1$2ieIcLc9 zAuQui&Sx7-0)DxlR*t0w*-2g@2bb#ksid+)W+Xe$s*FgCGYA#Lf6)`160!4X1?=43 zModi_J}yxclMz3&lP+(&#{7W^vEDi1zZ0iR9Cn{*SeF`+P)u%t!m^Jj=`9>OomSnj zKe0tS#kt%h3?@wHvgC;j!<&N!irvwa)K$nYnO6>KfHTi z0Gj?`T14Hl=uov92*{kfxw6}_2Ksex0P(D1_)Eakh5QSzI)fbZ{7FSy8pa&*IV7+ zI{WPJxA*sbdw*-~Z-09?lPp8=oV^(??y5w7U?CT{RA8qbK<$gSwzztJO6%clR0|EX zYShao5*?<}TsNTsw8WB(Onr;)6=$&jB@TtR@L~D=FS7JLCOt104G^sX0UAOt;LyS~ z`deRQA>XNQoepH32ne`!A}i#0cGJv>EQ66^hX!Z-VZMRrJ|t$E6F$qiNd%y{LB}%Yktf zg86E`qeRP9#O+l#XS$tw`L`P<)gxYBlO+aYtCzQCYm_(0>KFFc`K&OAf`bt!QLt;? zIpm247j0R%OKo$0*;2Bd;*-t`sb;Yo+!qQqp8#dIZ-Oj3X#NFky%-qQ*d5v z^v}qoC7`Li1T;yOfX1dJsC#pH3F>#>@=HJ$`z0u3C`pr55F{gzYT+-**v;8pqT`>U zB_Zq88=4hKykt#xn1rcFQKY1$pi)Iji4<@_nx7gCoyT6_QF4^3kbB=$f0v_>)8y)t z*;&I1IZBC=tH}|C+<_INjvk&IB^B~`E1K<>z>_Nyc>9CjK-+1}Sw_W{7Zmvv%~ovD z=hmpQfgE@uTI_8VfHJ=)K26($y#6XFZZ zuMgzA+65O1*li0~B_jKFKu3KRMxdjdmpJ=tBfSD=yZPNd-Tz$hQy?=?U55F;e<&b; zwbf;k5+5~v4)KbDnXKH7yEo;5?O@TNqHxB`lU z7=ZIXFE%s+z&3#`MFt&XAPFg(0eCeTfMvv$py4N3I%%qFO#mC*YX!d>Gv0m zqxqcsf}i+r<9L6L27f*N|C)p5gO{r$;vo1<6+T?ym@E{4Q3~A||43VDE*NYK5Bhyo z(3e$)NYmi-+!I4FXkv@khl%}_Ru&nF_)zNj{YDqk>|$sJ2pv)lBL0|x5JQSxDe*Sv z`?JH6gnb|T9yff9w^cAM_SSsSa(Q|j|KOu(U*C@;SkRRu*e_rw7q4>!QJ&cOs)|%; z5vu(Y5|ZNEO8}KC{*m#~($@#AJS(|qm4DQhgx9ano#;bv zmv7qgM)cifC7m|6vY*xWF0CuSVRNs#X-8VrM~;vB!-Sn%iO6lmGU*K`EN9lI&@9GmJJIy*%SVbDT!hi{$?*{y-w2KZAE z`|<|}CL5kj_qAXoB3>ymPA&uKD+(cZeVLC5s)oG$7|i<;sIlA%)D#b}`?oD(!U65* zx!ggHeFS@J$j^g)OUcuCjOKrp>vv(!wh-&^?Y56&mOzi)Ka7sBKN+!)m7W@&I|YG@ z@ou}pDA} zZJ9mSL!ey(xOSZQp889N#$+H`CoSI-lJe0&CrMa2gO&fSjNr_0q`khRJdk=7iDaZs z6|kmy;FMrc(=4Wmpol*$D#o4^Lv7);g6^WLa@d~S(Sc!|oe)p@<{MBtX&{Yh_etMC zHxjya9V;c>yU53-{6%;=dd6ZU`C{JhEr#4HlydzH&^BFj4khds>{UVlB4ne<0r*d7 zxu7q$G0&d+3TX>l+2_X@zWC6xTVv7lVO6`)d{AFHKD!#oXD#V_8AW^}w6QtEE5WHD z)sT$?2{^F&##<7~?E*4n%|*-2kl@)LEH{eA1pv$nQ#A*4M5`7qDs2o()d+T5G{KXS zg=E++ON(}ork|YrLTBm6ikqT4?`bX5aLgj&Tg?SwFv*?^FeeW-8vuqgJDg-Qz`O9X zIr7-sV7YKK7Yc=djV#MiDy?&1>JzT+lPM)gZE)I0|II#IUt;2NKUgRR`P=h%?qnZZ z0i=7BH}^;ZSel(}vu7*?x$w@t#2s-vfKw{d$)1(Vl4lVYgkJ-&D$)=7MYdxtwG9!z z833fGPdS|dy=r(n;}2LDok^ejF*7oYM`R^WOvnk-Sd8-RVX?J}9l=Tt|uVsmsXdq;d$e7x^! zuwa3=_mb}ch~69o6K_6&8T+(}iTj>YAlM^|PmS9S_JHiAP!zcux;ZDRR9k#s%jNm` zMQPvMTp_6AE(DJB&=JwuA6vME&P)IzHu6=nJuuaC?GD)*072l!z0n(`j9)-x#M>&A zM^ipgMJS^i))uuYnWJNS68HAnRA5b1@m4Yp;h@x|^^mMvQ{Tq(&H*M7;9^ri7HXkkl(ISQ(Vw z;$PB2*_NPcGDkwIU3uSDQAom;`=C<7G3ReQDDj%r+Voc=_DLX5J5}L-xJ9HA&H;Sd ziU~hxdAGH3J;b;%M?y{njLC z7?w2pT(`gbgz$D;XK z^CU0`=`ppCRf|rF#m(i&%M8|+ql;_{IJS<0fzgzMY!ih8v}Er0_pyR0b_(>;$_{%# z42(#m_@l}>i$B$rB;>DbI&pZyLarpVds=~)Ah?RsRzq=r9g}SIv;3?p{_S-IHRDa9V;g);PO$hhf@i59s#&gCdR}5k2AI#cjA%x#F{-$&BQ4b?L%Id3gw$?fB^!2Ws`fuK? zhRnixtiHbEcd*`lOFiveJspB0jD`lcLk*C9p#dxWV@nbI8M|wi->ShMzgMkW-x)q` zb5j$8_ST0Jc~YlNzqDP~U%UN_Y@^Su8^b+1Xg z;#~Dm25lUlx^F!7*>1DaaiQ{_lz0d6JsbzCjmw|H4K>>Y5DIUlHVgE^n=@Y<1idxo zjfPxc52VacLtmP5!cQ$pi)p~GkoAUcr%i2zd9~9qZEu83Z*Tk8Pset(-HI{2-4w0#W>0QpqICJJ7T-ozhaVjpZy){+8xRm{xpAyzH{^3%KIPI8E4w#^j;RcsxG{hz>BImgQ4#iQ%mw&P zv)HoJBe366RNc#&!L)c1`hZFbbVF6uIH-e+h+;?Dz{E$=Q4weI!B8sH{AXIT4qO%m z6IxU4c=<7%`C!1O@KOnbY2pcx2f%0gpRoD!FNMc3t_I*E-DvHhp}XAoC##F;x(Ew( zE|_0mZOE#x@zrH#WG_WbIk{a>yh(LSiH zcx}tXo5}9TIK=R0HTdFM9PZKJO?BF@>KxJI?ernRy6SKSw^<|}6KVWyNL?@9+c25u z&NP&PhfGUuq(%8iYpt8lTsL?c)&lp>n>x)_>I%!%pDbWC89o@y9wZ~|zXbncUrQPD zi>)7|{JU8>J9HiYx(5G#QuX{(OR_m~0P#SGdr;tzq=r^BXpVzy1cHR=)(V3xz4n#JZH zy&Ny4JvE~9#F;`46x&JIKvY$WM0Wl}%6;L7IQa0xLD8Ivp+hFu!BLSN!~2@+VobnL zM*TUFSck-zdK<{$xiva2eq^)6s;n2&j}hh{r%aD+?9EG_Cd*`^hm0)3e(Ba9;iMzF zrR@61f~{Pr(c5Dun=qVmRMNa^LT{D_SCeD9FR?axuhuWW4kMOp z(@_wzXyj;9+p(iR=()=s5lwZRS)?=iU$qzNzUbnb^YJ2M&66jF8j1J%dd!@kq!aSK zB0jw}acwJx&1nN*JsIEi`B8G?XxCXXvdeeVhh%hDA~_o;=8y?pz9YXO-|TusnzwY_ k`w*L5h3{z~upPJDQvUAy)?dBF{N2*O3jFGUe<%<92T;*R#Q*>R diff --git a/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin b/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin deleted file mode 100755 index f4e2f89a5b33f9fc6c1f9a8a97ec873ca76e7c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{I003i@UAY(9uK&4Q|VCQfMfhmznp=+^>!L8BG;qUP=5)cA&GEyS7Qj|jX za@JxwlNf`0vs$CQ)11Tq^WNiPBttYH1OXK0WXE)*M1@pprAxIag$b4J<96@niD{V%sVlklTGUFndX{Q&8c+%|Iua`V+uX~)`=0B0n^=oGyBe#eY=?a0OvPLx zECW1X3_%>O?T`KJ&CT5^tqZ+qjY*xCeztDaUi3~AJ~A#*9&iqy|Gw|t-~7)TzdEm3 zpLmamk*R^ovFo7>(JjGF@o(XP5TO9VFykNuP$fV{aA#n-gP4>1quR4Q!yMCp<6iTz z0+15(BGNK7LKISWVpekMwacZbm5GIJ^-tw2)eXhsG{YpI6oCY0bVp<)R0Txar~0>< zhq#wt=YIDc$2`~5Ch|6s2Cx=aW_ETJMl@DT*=@-V`7i0nndym&xvQx}SY=2CcqeGU z7~u$lIHM?i%Us((>mK|0i`bjHtD3uYN>o}mY8HC&3eXy}Dv~-b{SWPI-A&D^y^F2r zoym_%s&wSsTue!h4kNBS#ZZ>{ZPIO+AF0ww+4)7kp CQ~v<~ diff --git a/ProfRom_Disasm/rom0.a80 b/ProfRom_Disasm/rom0.a80 deleted file mode 100755 index 7146488..0000000 --- a/ProfRom_Disasm/rom0.a80 +++ /dev/null @@ -1,10229 +0,0 @@ - DEVICE ZXSPECTRUM128 -; INCLUDE "!AllConst.asm" -; INCLUDE "!ram8.asm" - ORG #0000 - -x5B00 equ #5B00 ; п/п переключения страниц rom0/1 (=x006B) -x5B14 equ #5B14 ; п/п возврата из basic48 (=x007F) -x5B1D equ #5B1D ; п/п on error -x5B2F equ #5B2F ; п/п ввода rs232 -x5B34 equ #5B34 ; п/п вывода rs232 -x5B4A equ #5B4A ; п/п включения предыдущего rom bacic48/128 (=x00B5) - ; rs232 вывод символов -x5B58 equ #5B58 ;2 адрес вызываемой п/п из basic48 -x5B5A equ #5B5A ;2 адрес возврата в basic128 -x5B5C equ #5B5C ;1 содержимое порта #7FFD -x5B5D equ #5B5D ;1 =#CF rst 8 -x5B5E equ #5B5E ;1 код ошибки для rst 8 basic48 -x5B5F equ #5B5F ;2 rs232 битный период -x5B61 equ #5B61 ;2 флаг состояния второго принимаемого символа и данные -x5B63 equ #5B63 ;1 текущая колонка -x5B64 equ #5B64 ;1 ширина печатной страницы -x5B65 equ #5B65 ;1 номер параметра ожидаемого rs232 -x5B66 equ #5B66 ;1 флаги -x5B67 equ #5B67 ;10 имя файла -x5B71 equ #5B71 ;1 тип файла -x5B72 equ #5B72 ;2 длина блока -x5B74 equ #5B74 ;2 начальный адрес блока -x5B76 equ #5B76 ;2 длина программы -x5B78 equ #5B78 ;2 номер строки -x5B7A equ #5B7A ;1 тип файла -x5B7B equ #5B7B ;??? -x5B7E equ #5B7E ;??? 2 длина блока -x5B7F equ #5B7F ;2 длина программы -x5B81 equ #5B81 ;2 старый SP при использовании TSTACK -x5B83 equ #5B83 ;2 поинтер свободногоместа в directory -x5B85 equ #5B85 ;3 количество свободный байт -x5B88 equ #5B88 ;1 -x5B89 equ #5B89 ;1 -x5B8A equ #5B8A ;1 -x5B8B equ #5B8B ;2 возврат адреса для on err 32768 -x5B8D equ #5B8D ;5 последняя длина, выводимая при вычислениях -x5B92 equ #5B92 ;2 номер строки для renumber -x5B94 equ #5B94 ;2 новый номер строки начала при перенумерации -x5B96 equ #5B96 ;2 приращение номера строки для перенумерации -x5B98 equ #5B98 ;8 STRIP1 -x5BA0 equ #5BA0 ;8 STRIP2 -x5BA8 equ #5BA8 ;стэк -x5BFF equ #5BFF ;вершина стэка - -;Ram7. -;#EC0C - 1 номер текущей опции меню basic128 -;#EC0D - 1 флаги -; 1,=1 текущее меню: основное меню basic128 -;#EC0E - 1 ??? -;#EC0F - 2 постоянные атрибуты экрана для 128 TR-DOS -;#EC11 - 2 временные атрибуты экрана для 128 TR-DOS -;#EC13 - 1 параметры вывода на экран для 128 TR-DOS -;#F6EC - 2 адрес списка опций меню - -Rom1.x0010 equ #0010 ;печать символа из A -Rom1.x0013 equ #0013 ;адрес с байтом #FF в rom 1 -Rom1.x0018 equ #0018 ;чтение очередного символа строки программы -Rom1.x0020 equ #0020 ;чтение следующего символа строки программы -Rom1.x0028 equ #0028 ;вызов калькулятора -Rom1.x0030 equ #0030 ;резервирование памяти -Rom1.x0038 equ #0038 ;обработчик прерываний -Rom1.x0095 equ #0095 ;токены бейсика -Rom1.x03B5 equ #03B5 ;beep -Rom1.x0761 equ #0761 ;LOAD/MERGE/VERIFY -Rom1.x08CE equ #08CE ;MERGE -Rom1.x0970 equ #0970 ;SAVE -Rom1.x0B52 equ #0B52 ;печать токена -Rom1.x0C0A equ #0C0A ;печать сообщения -Rom1.x0D4D equ #0D4D ;копиравоние атрибутов -Rom1.x0D6B equ #0D6B ;CLS -Rom1.x0D6E equ #0D6E ;открыть канал -Rom1.x0DAF equ #0DAF ;очистить экран -Rom1.x0E88 equ #0E88 ;расчет адреса в атрибутах по координатам -Rom1.x0E9B equ #0E9B ;расчет адреса на экране по координатам -Rom1.x0F85 equ #0F85 ;добавить код в строку -Rom1.x107F equ #107F -Rom1.x1097 equ #1097 ;очистка памяти -Rom1.x10DB equ #10DB ;обработка кода клавиши -Rom1.x1303 equ #1303 ;основной цикл basic 48 -Rom1.x1391 equ #1391 -Rom1.x1536 equ #1536 -Rom1.x15EF equ #15EF ;печать символа из a -Rom1.x1601 equ #1601 ;открыть канал -Rom1.x1615 equ #1615 ;установка флагов канала (возврат предыдущего канала) -Rom1.x1655 equ #1655 ;резервирование места (длина в bc) -Rom1.x1661 equ #1661 ;lddr, ret -Rom1.x1664 equ #1664 ;обновление системных переменных -Rom1.x1695 equ #1695 ;получить адрес первой строки программы -Rom1.x16B0 equ #16B0 ;очистка различных областей памяти -Rom1.x16BF equ #16BF ;очистка рабочего буфера -Rom1.x16C5 equ #16C5 ;восстановление стэка -Rom1.x1825 equ #1825 ;LIST-5 -Rom1.x18B6 equ #18B6 ;пропуск натурального числа -Rom1.x196E equ #196E ;получить начальный адрес строки программы -Rom1.x198B equ #198B ;поиск команды в строке -Rom1.x19B8 equ #19B8 ;поиск адрес начала следующей строки программы -Rom1.x19E5 equ #19E5 ;удалить переменные -Rom1.x19E8 equ #19E8 ;удалить массив DIM -Rom1.x19FB equ #19FB ;получить номер редактиремой строки -Rom1.x1A1B equ #1A1B ;печать номера строки -Rom1.x1C1F equ #1C1F ;обработка класса #01 -Rom1.x1C56 equ #1C56 ;полкчить значение параметра -Rom1.x1C6C equ #1C6C ;FOR i -Rom1.x1C7A equ #1C7A ;получение двух значений -Rom1.x1C82 equ #1C82 ;получение числового значения -Rom1.x1C8C equ #1C8C ;параметр - строка -Rom1.x1CBE equ #1CBE ;установка необязательных атрибутов для печати -Rom1.x1CDE equ #1CDE ;получение параметра-числа -Rom1.x1CE6 equ #1CE6 ;ноль на стэк калькулятора -Rom1.x1D16 equ #1D16 ; -Rom1.x1D86 equ #1D86 ;поиск оператора -Rom1.x1E39 equ #1E39 ;проверить инструкцию DATA или DEF FN -Rom1.x1E45 equ #1E45 -Rom1.x1E67 equ #1E67 ;команда GO TO -Rom1.x1E99 equ #1E99 ;извлечь операнд -Rom1.x1F05 equ #1F05 ;проверка наличия свободной памяти -Rom1.x1FDF equ #1FDF ;PRINT_2 -Rom1.x2048 equ #2048 ;PR-ST-END -Rom1.x2070 equ #2070 ;нужно ли изменять поток? -Rom1.x20A0 equ #20A0 ;ввод с клавиатуры -Rom1.x20C1 equ #20C1 ;ввод данных по input -Rom1.x21FC equ #21FC ;изменение временных атрибутов -Rom1.x22AA equ #22AA ;рассчитать адрес на экране по координатам -Rom1.x22E9 equ #22E9 ;печать точки -Rom1.x232D equ #232D ;печать окружности -Rom1.x2394 equ #2394 ;печать линии -Rom1.x2477 equ #2477 ;печать линии -Rom1.x24FB equ #24FB ;ищем следующее выражение -Rom1.x2530 equ #2530 ;проверка флага проверка/исполнение программы -Rom1.x28B2 equ #28B2 ;LOOK-VARS -Rom1.x2996 equ #2996 ;проверкае синтаксиса выражения, заключенного в скобки -Rom1.x2BF1 equ #2BF1 ;прочитать значение со стэка калькулятора -Rom1.x2C15 equ #2C15 ;D-RUN -Rom1.x2C8D equ #2C8D ;это буква? -Rom1.x2D1B equ #2D1B ;это цифра? -Rom1.x2D2B equ #2D2B ;bc на стэк калькулятора -Rom1.x2DA2 equ #2DA2 ;извлечь значение со стэка калькулятора -Rom1.x2DE3 equ #2DE3 ;печать числа с плавающей точкой -Rom1.x30A9 equ #30A9 ;hl=hl*de -Rom1.x33B4 equ #33B4 ;поместить число на смэк калькулятора -Rom1.x34E9 equ #34E9 ;проверка значения на ноль -Rom1.x3B01 equ #3B01 ; -Rom1.x3C04 equ #3C04 ;проверка Break и вызов теста экрана - -Rom1.x03F8 equ #03F8 ; BEEP routine in ROM 1. -;Rom1.x0D6B equ #0D6B ; CLS routine in ROM 1 -Rom1.x16E5 equ #16E5 ; CLOSE # routine in ROM 1 -Rom1.x1736 equ #1736 ; OPEN # routine in ROM 1 -Rom1.x1A0D equ #1A0D ; CLEAR routine in ROM 0 -Rom1.x1CEE equ #1CEE ; STOP routine in ROM 1 -Rom1.x1DAB equ #1DAB ; NEXT routine in ROM 1 -Rom1.x1E42 equ #1E42 ; RESTORE routine in ROM 1 -Rom1.x1E4F equ #1E4F ; RANDOMIZE routine in ROM 1 -Rom1.x1E5F equ #1E5F ; CONTINUE routine in ROM 1 -;Rom1.x1E67 equ #1E67 ; GO TO routine in ROM 1 -Rom1.x1E7A equ #1E7A ; OUT routine in ROM 1 -Rom1.x1E80 equ #1E80 ; POKE routine in ROM 1 -Rom1.x1F3A equ #1F3A ; PAUSE routine in ROM 1 -Rom1.x2294 equ #2294 ; BORDER routine in ROM 1 -Rom1.x22DC equ #22DC ; PLOT routine in ROM 1 - - - -;#0000 включение компьютера/"холодный" старт -;#0004 вход в монитор NMI/rst 8 -;#0008 rst #08 вызов функции монитора -;#000D возврат из монитора -;#0010 rst #10 печать символа из A -;#0014 rst #08 вызов функции монитора -;#0018 чтение очередного символа строки программы -;#001C переход в rom2 при ресете -;#0020 получение следующего символа из бейсик программы -;#0024 переход в rom2 при rst #08 -;#0028 вызов процедуры из basic 48k -;#0038 обработчик прерываний -;#004A обработчик ошибок basic 128 -;#005C вызов процедуры (продолжение rst #28) -;#006B п/п переключения страниц rom0/1 копируется (адрес x5B00) -;#007F сюда возврат после отработки п/п по rst #28 (=#5B14) -;#0088 обработчик ошибок basic 128k -;#009A ввод из канала "P" -;#009F вывод в канал "P" -;#00B5 выход из процедуры ввода/вывода в канал "P" (включение предыдущего rom basic48/128) -;#00C3 обработчик ошибок basic 128k -;#00C7 вход из монитора после "холодного старта" -;#00ED вход из монитора после "теплого старта" -;#0100 !!!NOT USED!!! керналь процедур -;#0131 ошбка проверки памяти (битая память) -;#0137 инициализация переменных и печать меню 128k -;#019D команда NEW -;#026B выполненение введенной строки -;#02BA сюда возвращаемся после проверки синтаксиса бейсика -;#0321 обработчик ошибок -;#03EF обработчик ошибок -;#03F7 вставка строки программы -;#046C адреса сообщений об ошибках -;#048C сообщения об ошибках -;#057D печать строки из de -;#0589 информация о каналах -;#059E информация о потоках -;#05AC обработка ошибки -;#05D6 проверка нажатия break и печать сообщения -;#05E6 RS232 ввод и вывод -;#0641 команда FORMAT -;#06D8 процедура ввода из RS232 -;#06E5 чтение байта из RS232 -;#07CA процедура вывода в RS232 -;#0822 перевод строки на принтере -;#082B !!!NOT USED!!! взврат каретки на принтере -;#0830 продолжение x07CA процедура вывода в RS232 -;#08A3 передача байта на принтер -;#08B1 rst #08 вызов функции монитора -;#08D1 включение компьютера/"холодный" старт -;#08E1 !!!NOT USED!!! вход куда-то -;#08EE возврат из x08A3 -;#08F0 команда COPY -;#0915 печать половины строки -;#095F передача на принтер управляющего кода -;#096D проверить пиксель на экране -;#0979 управляющие коды принтера Epson -;#0985 команда PLAY -;!!!not used!!! #0E89 чтение регистра AY -;#0E93 гасим звуки во всех каналах -;#11EB команда SAVE -;#11F2 команда LOAD -;#11F2 команда VERIFY -;#1200 команда MERGE -;#1219 ошибка C Nonsense in BASIC -;#121D работа с RAM диском -;#137E загрузка данных с RAM диска -;#1385 получить выражения из строки бейсика -;#1393 проверка и копирование имени файла -;#13BE работа с лентой/RAM диском -;#152F печать бейсик программы от текущей строки -;#1630 очистка окна редактирования -;#1639 сдвиг всех строк в буфере редактирования верх и обновление экрана -;#1648 сдвиг всех строк в буфере редактирования верх и обновление экрана -;#166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;#1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;#16AC вставка символа в строку буфера редактирования -;#16C1 вставка символа в строку буфера редактирования со сдвигом влево -;#16DC смещения до параметров команды -;#170E синтаксические параметры команд (аналогично basic 48 #1A7A) -;#17AF анализ и выполнение бейсик программы -;#18B5 таблица смещений до процедур обработки класса оператора -;#18C4 процедуры обработки классов -;#1967 процедуры обработки команд бейсика -;#1AF1 пункт меню Tape Loader -;#1B11 анализ и выполненение введенной строки -;#1B14 пункт меню редактора Print (печать на принтер) -;#1B2B команда SPECTRUM -;#1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 -;#1B4A включение basic48, блокировка #7FFD и переход на адрес в hl -;#1B53 установка канала 'P' -;#1B6E данные для команды LOAD "" -;#1B71 команда LIST -;#1B75 команда LIST -;#1BAD команда RAM disk SAVE! -;#1BE5 команда RAM disk CAT! -;#1C0C команда RAM disk EARSE! -;#1C2E загрузка заголовка файла из RAM диска -;#1C4B загрузка из RAM диска -;#1C64 включение логической страницы в A -;#1C87 сравнение имени файла с заданным -;#1C97 создание новой записи в каталоге RAM-диска -;#1CF3 коррекция сводного места на RAM диске -;#1D12 поиск имени файла в каталоге -;#1D35 поиск файла на RAM диске -;#1D56 обновление записи каталога -;#1DAC сохранение данных на RAM диске -;#1E37 загрузка данных с RAM диска -;#1ECF !!!NOT USED!!! запись данных в RAM 7 -;#1F04 !!!NOT USED!!! чтение данных из RAM 7 -;#1F20 установка другого стэка и ram 0 -;#1F3A включение страницы ram -;#1F45 установка другого стэка и ram 7 -;#1F5F удаление файла из RAM диска -;#20D2 печать каталога RAM диска -;#2135 печать одной записи каталога RAM диска -;#2174 команда LPRINT -;#2178 команда PRINT -;#218C команда INPUT -;#21A7 команда COPY -;#21AA команда NEW -;#21AE команда CIRCLE -;#21BE команда DRAW -;#21D5 команда DIM -;#21EF очистка экрана -;#21F8 вычисличть числовое выражение -;#226F обработка нажатой клавиши -;#228E поиск начала бейсик команды -;#2297 проверка это команда LET? (калькулятор basic 128) -;#22AB проверка это оператор? -;#22BD список токенов операторов -;#22CB проверка это токен? -;#22E0 проверка это число или функция -;#230A проверка это цифра или нет -;#2317 команда PLAY -;#2336 !!!NOT USED!!! возврат в редактор -;#2342 !!!NOT USED!!! bc=hl-de -;#234A !!!NOT USED!!! зарезервировать память на 1 байт -;#2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc -;#236F !!!NOT USED!!! hl=a*#20 -;#2371 !!!NOT USED!!! hl=a*#08 -;#2378 !!!NOT USED!!! расчет свободного места -;#2384 !!!NOT USED!!! печать на экране строки из буфера -;#23B8 !!!NOT USED!!! печать в буфере #FF -;#23CB !!!NOT USED!!! копирование буфера на экран -;#23E1 !!!NOT USED!!! печать символов из буфера на экране -;#2456 !!!NOT USED!!! переключение страниц rom 0/1 -;#2464 !!!NOT USED!!! переключение страниц rom 0/1 -;#246F !!!NOT USED!!! копирование п/п в ram 7 -;#2488 !!!NOT USED!!! установка атрибутов из буфера экрана -;#249B !!!NOT USED!!! установка атрибутов из буфера экрана -;#2513 !!!NOT USED!!! поменять местами ink и paper -;#2537 таблица адресов обработки нажатий в режиме редактирования -;#2577 таблица адресов обработки нажатий в основном меню basic 128k -;#2584 подготовка переменных -;#259F печать главного меню basic 128 и выбор опции -;#25CB возврат в редактор/калькулятор/меню после обработки ошибки -;#2653 основной цикл в basic128/калькулятор -;#2669 обработка нажатия клавиши -;#269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху -;#26BB выбор нижнего экрана -;#26CE выбор верхнего экрана -;#26E7 звуковой сигнал -;#26EC звуковой сигнал -;#26FA звуковой сигнал -;#2704 cs+1 вызов меню -;#2717 нажатие cs+1/enter в главном меню -;#272E курсор вверх в главном меню -;#2731 курсор вниз в главном меню -;#2744 адреса процедур обработки опций основного меню basic 128k -;#2754 текст основного меню basic 128k -;#278D !!!NOT USED!!! -;#2790 адреса процедур обработки опций меню в редакторе basic 128 -;#27A0 текст меню в редакторе basic 128 -;#27CB адреса процедур обработки опций меню в калькуляторе -;#27D2 текст меню в калькуляторе -;#27EB !!!NOT USED!!! -;#2811 смена области редактирования низ/верх -;#2816 выбор опции 128 TR-DOS -;#281С выход из редактора/калькулятора в главное меню -;#2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) -;#283E !!!NOT USED!!! -;#2851 перенумерация строк программы -;#2862 печать программы на принтере -;#286C выбор опции 128 BASIC -;#2885 выбор опции калькулятор -;#28BE инициализация курсора для верхнего окна -;#28C7 возврат в главное меню -;#28DF инициализация настроек нижнего окна -;#28E8 инициализация настроек верхнего окна -;#28F1 обработка нажатия символьной клавиши -;#291B ext+ss+K удаление символа справа от курсора -;#292B delete удаление символа слева от курсора -;#2944 enter ввод строки -;#2983 ext+N/Graph+W переход к первой строке бейсик программы -;#29AB ext+T/Graph+V переход к последней строке бейсик программы -;#29D4 ext+I переход к началу текущего слова -;#29E1 ext+shift+J переход к началу следующего слова -;#29EC удаление курсора, восстановление атрибутов -;#29F2 напечатать курсор -;#29F8 напечатать курсор -;#2A07 получение позиции курсора -;#2A11 сохранить позицию курсора -;#2A1A получение текущего символа в буфере редактирования -;#2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования -;#2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования -;#2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования -;#2A87 ext+ss+2/Graph+Y переход к началу строки редактирования -;#2A94 перемещение курсора вверх в поле редактирования -;#2AB5 перемещение курсора вниз в поле редактирования -;#2AD7 перемещение курсора влево в поле редактирования -;#2AE3 перемещение курсора вправо в поле редактирования -;#2AF9 найти в строке ближайшую редактируемую позицию -;#2B02 найти в строке ближайшую редактируемую позицию -;#2B0B вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран -;#2B30 вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран -;#2B5B поиск редактируемой позиции слева от курсора во всем буфере -;#2B78 поиск редактируемой позиции справа от курсора во всем буфере -;#2BD4 поиск редактируемого символа в строке справа от курсора -;#2BDF поиск в строке влево от курсора редактируемого символа -;#2BEA поиск начала слова слева от курсора -;#2C09 поиск начала слова справа от курсора -;#2C31 поиск начала строки редактирования в буфере -;#2C4C поиск конца строки в буфере редактирования -;#2C68 вставить строку бейсик программы, если были изменения -;#2C7C вставить строку в бейсик программу, если были изменения -;#2C8E вставить строку бейсик программы -;#2D54 получить очередной символ из строки бейсик программы -;#2D8F получить символ из текущей позиции курсора в буфере редактирования -;#2E0E получить символ из строки буфера редактирования -;#2E1F сброс верхнего окна редактирования -;#2E2D сброс нижнего окна редактирования -;#2E41 поиск в строке вправо от курсора редактируемого символа -;#2E63 поиск в строке влево от курсора редактируемого символа -;#2E7B чтение символа из буфера редактирования -;#2E81 вставка символа в буфер редактирования -;#2ECE вставка пустой строки в буфер редактирования -;#2ED3 вставка пустой строки в буфер редактирования -;#2F12 удаление символа в строке в буфере редактирования -;#2F80 сдвиг строк вверх в буфере при удалении строки -;#2FBC ext+E удаление символов от курсора до начала текущего слова -;#3017 ext+W удаление символов от курсора до начала следующего слова -;#303E ext+K удаление символов до наала строки -;#3072 ext+J удаление символов до конца строки -;#3084 удаление курсора и запрет на обновление экрана -;#3095 проверка наличия предыдущего символа в буфере -;#30B4 расчет адреса начала строки в буфере редактирования -;#30C6 !!!NOT USED!!! -;#30D0 параметры для установки буфера редактирования строки внизу экрана -;#30D6 установка буфера редактирования внизу экрана -;#30DF сдвиг строк в буфере редактирования вверх -;#311E сдвиг строк в буфере редактирования вниз -;#316E вставка символа в нижний буфер редактирования -;#31C3 расчет адреса начала строки в буфере редактирования -;#31C9 удаление символа в нижнем буфере редактирования -;#321E параметры для установки буфера редактирования строки вверху экрана -;#3222 установка буфера редактирования в верху экрана -;#322B перемещение курсора вверх в верхнем буфере редактирования -;#326A копирование строки бейсик программы в буфер редактирования вверзу экрана -;#32B7 расчет адреса начала строки в буфере редактирования -;#32BD таблица обработки управляющих кодов при редактировании строки -;#32D6 копирование строки программы в буфер редактирования -;#3331 перенос части строки на следующую строку -;#334A поиск адреса строки бейсик программы -;#3352 преобразование номера строки в ASCII и помещение в буфер -;#335A преобразование токена в текст -;#335F копирование процедур в ram -;#3374 копирование токена в буфер токенов (=#FCAE) -;#33C3 копирование токена (=#FCFD) -;#33F4 распознавание токена (=#FD2E) -;#3430 преобразование номера строки в ASCII и помещение в буфер -;#3495 выделение разряда числа и занесение его в буфер -;#34B6 поиск адрес строки программы с заданным номером или следущей строки, если строка с заданным номером не существует -;#34CF расчет адреса следущей строки бейсик программы -;#34D9 проверка на конец бейсик программы -;#34E0 сравнение номера строки с заданным -;#34EA обнуление указателей в бейсик строке -;#34F6 поиск адрес строки бейсик программы в памяти -;#3517 преобразование токена в текст -;#3594 токены basic128 -;#35BC установка параметров отступа -;#35C5 сохранить символ в указанном столбце текущей строки буфера редактирования -;#35CC процедура обработки нажатия 'enter' в строке -;#35DA процедура обработки зануления до конца строки -;#35E6 зануление до конца строки в буфере редактирования -;#35F4 создание отступа в строке в буфере редактирования -;#3604 печать строки редактируемого буфера, при необходимости -;#3618 сдвиг вверх строк в буфере редактирования при необходимости -;#362C сдвиг вниз строк в буфере редактирования при необходимости -;#3640 печать атрибутов курсора -;#364F восстановление атрибутов под курсором -;#365E установка переменных для ввода символа -;#367F ожидание нажатия клавиши -;#36A8 печать меню basic 128k -;#3719 печать одной линии вокруг меню -;#372B установка координат печати из bc -;#3733 печать строки из hl -;#373B сохранение окна экрана 14*12 в буфере -;#373E восстановление окна экрана 14*12 из буфера -;#377E сохранение/восстановление 14 знакомест экана в буфере -;#37A7 клавиша вверх в меню basic128 -;#37B6 клавиша вниз в меню basic128 -;#37CA инвертирование атрибутов опции меню -;#37EC управляющие коды для печати меню -;#37FA управляющие коды для печати меню -;#3802 данные потоков для печати эмблемы -;#3812 управляющие коды для печати косых полос в меню -;#3822 печать эмблемы ZX (косые цветные полосы) в меню -;#3848 печать информационной строки 128 BASIC -;#384D печать информационной строки Calculator -;#3852 печать информационной строки 48 TR-DOS -;#3857 печать информационной строки 128 TR-DOS -;#3881 очистка двух нижних строк экрана -;#3888 перенумерация строк программы -;#390E анализ строки и перенумерование ссылок на номера строк -;#3A05 подсчет количества строк в бейсик программе -;#3A35 пропуск пробелов в строке -;#3A3C номер строки в ASCII -;#3A60 получить один разря числа в ASCII -;#3A7F установка настроек курсора для верхнего окна -;#3A88 установка настроек курсора для нижнего окна -;#3A91 !!!NOT USED!!! -;#3A96 сохранить атрибуты курсора -;#3A9D печать атрибутов курсора -;#3AB2 восстановление атрибутов под курсором -;#3ABF сдвиг вверх строк в буфере редактирования -;#3AC6 сдвиг вниз строк в буфере редактирования -;#3B1E печать строки редактируемого буфера -;#3B5E очистка строк экрана -;#3B94 расчет количества строк и столцов до конца экрана -;#3B98 расчет количества строк от заданной до низа экрана -;#3BA0 расчет адреса атрибутов -;#3BB8 обмен атрибутов basic 128 с основными атрибутами -;#3BE9 запуск команды randomize 15619: rem: load "boot" -;#3C1C !!!NOT USED!!! копирование и выполненение бейсик строки -;#3C20 !!!NOT USED!!! бейсик строка -;#3C35 возврат из монтора -;#3C4A !!!NOT USED!!! вход в монитор (продолжение x08E1) -;#3C56 пауза 25 фреймов -;#3C63 токенизация строки бейсик программы с синтаксической ошибкой -;#3C67 токенизация строки бейсик программы -;#3D9D получить очередной символ из строки бейсик программы и определить его тип -;#3DC6 проверка символа на принадлежность к буквам нижнего регистра -;#3DCD копирование слова из буфера в строку бейсик программы -;#3DE9 вставить символ в буфер редактирования -;#3E16 вставка символа в сроку бейсик программы с обработкой < и > -;#3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек -;#3E9C вставка символа в сроку бейсик программы с игнорированием пробелов -;#3EFB вставка символа в сроку бейсик программы -;#3F66 проверка наличия свободного места в памяти -;#3F7E распознавание токена -;#3FBA копирование строки из hl в de в (hl+0) кол-во байт -;#3FC3 !!!NOT USED!!! преобразование ASCII в цифру -;#3FCE обработка нажатой управляющей клавиши -;#3FEE вызов call (hl) -;#3FEF инициалы программистов -;#4000 - - - - -;АДРЕС: #0000 включение компьютера/"холодный" старт -x0000 di - jp x08D1 - -;АДРЕС: #0004 вход в монитор -x0004 out (c),a - nop - nop - -;АДРЕС: #0008 rst #08 вызов функции монитора -x0008 jp x0014 - nop - nop - -;АДРЕС: #000D возврат из монитора -x000D jp x3C35 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #28 ;вызов п/п из basic 48k - dw Rom1.x0010 - ret - -;АДРЕС: #0014 rst #08 вызов функции монитора -x0014 jp x08B1 - nop - -;АДРЕС: #0018 чтение очередного символа строки программы -x0018 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0018 - ret - -;АДРЕС: #001C переход в rom2 при ресете -x001C out (c),a - nop - nop - -;АДРЕС: #0020 получение следующего символа из бейсик программы -x0020 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0020 - ret - -;АДРЕС: #0024 переход в rom2 при rst #08 -x0024 out (c),a - nop - nop - -;АДРЕС: #0028 вызов процедуры из basic 48k -x0028 ex (sp),hl - push af - ld a,(hl) - inc hl - inc hl - ld (x5B5A),hl - dec hl - ld h,(hl) - ld l,a - pop af - jp x005C - nop ;not use - -;АДРЕС: #0038 обработчик прерываний -x0038 push hl - ld hl,x0048 - push hl - ld hl,x5B00 - push hl - ld hl,Rom1.x0038 - push hl - jp x5B00 -x0048 pop hl - ret - -;АДРЕС: #004A обработчик ошибок basic 128 -x004A ld bc,#7FFD - xor a - di - out (c),a ;rom 0(128k), ram 0, scr 5, 128k - ld (x5B5C),a - ei - dec a - ld (iy+#00),a ;no error - jp x0321 - -;АДРЕС: #005C вызов процедуры (продолжение rst #28) -x005C ld (x5B58),hl - ld hl,x5B14 - ex (sp),hl - push hl - ld hl,(x5B58) - ex (sp),hl - jp x5B00 - -;АДРЕС: #006B п/п переключения страниц rom0/1 копируется в адрес x5B00 -x006B push af - push bc - ld bc,#7FFD - ld a,(x5B5C) - xor #10 - di - ld (x5B5C),a - out (c),a - ei - pop bc - pop af - ret -;АДРЕС: #007F сюда возврат после отработки п/п по rst #28 (=#5B14) -x007F call x5B00 - push hl - ld hl,(x5B5A) ;адрес возврата в процедуру при вызове rst #28 - ex (sp),hl - ret -;АДРЕС: #0088 обработчик ошибок basic 128k -x0088 di - ld a,(x5B5C) - and #EF - ld (x5B5C),a - ld bc,#7FFD - out (c),a - ei - jp x00C3 -;АДРЕС: #009A ввод из канала "P" -x009A ld hl,x06D8 - jr x00A2 -;АДРЕС: #009F вывод в канал "P" -x009F ld hl,x07CA -x00A2 ex af,af' - ld bc,#7FFD - ld a,(x5B5C) - push af - and #EF - di - ld (x5B5C),a - out (c),a - jp x05E6 ;RS232 ввод и вывод -;АДРЕС: #00B5 выход из процедуры ввода/вывода в канал "P" -; (включение предыдущего rom basic48/128) -x00B5 ex af,af' - pop af - ld bc,#7FFD - di - ld (x5B5C),a - out (c),a - ei - ex af,af' - ret - -;АДРЕС: #00C3 обработчик ошибок basic 128k -x00C3 ld hl,(#5B8B) - jp (hl) - -;АДРЕС: #00C7 вход из монитора после "холодного старта" -x00C7 ld b,#08 -x00C9 ld a,b ;проверка и зануление всех страниц[0..7] памяти - exx - dec a - ld bc,#7FFD - out (c),a - ld hl,#C000 - ld de,#C001 - ld bc,#3FFF - ld a,#FF - ld (hl),a - cp (hl) - jr nz,x0131 ;битая память - xor a - ld (hl),a - cp (hl) - jr nz,x0131 ;битая память - ldir - exx - djnz x00C9 - ld (x5B88),a - -;АДРЕС: #00ED вход из монитора после "теплого старта" -x00ED ld c,#FD - ld d,#FF - ld e,#BF - ld b,d - ld a,#0E ;регистр AY #0E - out (c),a ;bc=#FFFD - ld b,e ;bc=#BFFD - ld a,#FF - out (c),a - jr x0137 -x00FF nop ;not used - -;АДРЕС: #0100 !!!NOT USED!!! керналь процедур -x0100 jp x17AF ;парсер бейсик программы - jp x1838 ;выполнение команды из строки редактирования - jp x1ECF ;запись данных в RAM 7 - jp x1F04 ;чтение данных из RAM 7 - jp x004A ;обработчик ошибок basic 128 - jp x03A2 ;обработчик ошибок - jp x182A ;RETURN - jp x18A8 ;NEXT - jp x012D ;опрос клавиатуры - jp x0A05 ;команда PLAY - jp x11A3 ;загрузка байта в порт MIDI - jp x06D8 ;процедура ввода из RS232 - jp x07CA ;процедура вывода в RS232 - jp x08A3 ;передача байта на принтер - jp x08F0 ;команда COPY -x012D rst #28 ;вызов процедуры из basic 48k - dw Rom1.x3B01 ;опрос клавиатуры - ret - -;АДРЕС: #0131 ошбка проверки памяти (битая память) -x0131 exx - ld a,b - out (#FE),a - jr $ - -;АДРЕС: #0137 инициализация переменных и печать меню 128k -; de=#FFBF -; c=#FD -x0137 ld b,d ;установка регистра #07 AY - ld a,#07 - out (c),a - ld b,e - ld a,#FF - out (c),a ;выключим звук в AY - ld de,#5B00 - ld hl,x006B ;п/п переключения страниц памяти - ld bc,#0058 - ldir - ld a,#CF ;обработчик ошибок basic 48 - ld (x5B5D),a - ld sp,#5BFF - ld a,#04 - call x1C64 ;включим ram 7 - ld ix,#EBEC ;адрес начала каталога rom-disk - ld (x5B83),ix - ld (ix+#0A),#00 - ld (ix+#0B),#C0 - ld (ix+#0C),#00 - ld hl,#2BEC ;свободное место на rom-disk - ld a,#01 - ld (x5B85),hl - ld (x5B85+2),a - ld a,#05 ;ram 0 - call x1C64 - ld hl,#FFFF ;адрес последнего байта физического ОЗУ - ld (#5CB4),hl - ld de,#3D00+#01AF ;адрес последнего байта символа "U" в basic 48 - ld bc,#00A8 ;копирование символов шрифта [A..U] - ex de,hl - rst #28 ;вызов п/п из basic 48k - dw Rom1.x1661 ;lddr, ret - ex de,hl - inc hl - ld (#5C7B),hl ;адрес начала определяемых пользователем символов - dec hl - ld bc,#0040 - ld (#5C38),bc - ld (#5CB2),hl ;последний адрес в ОЗУ разрешенный для basic - -;АДРЕС: #019D команда NEW -x019D ld hl,#3D00-#100 ;адрес символьного набора - ld (#5C36),hl - ld hl,(#5CB2) ;Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика - inc hl - ld sp,hl - im 1 - ld iy,#5C3A - set 4,(iy+#01) ;режим 128k - ei - ld hl,#000B - ld (x5B5F),hl ;скорость принтера 9600 бод - xor a - ld (x5B61),a - ld (x5B63),a - ld (x5B65),a - ld hl,#EC00 ;!!!ОШИБКА!!! должно писаться в rqm 7 - ld (#FF24),hl - ld a,#50 ;ширна печати 80 символов - ld (x5B64),a - ld hl,#000A - ld (x5B94),hl - ld (x5B96),hl - ld hl,#5CB6 ;копируем нформацию о каналах - ld (#5C4F),hl - ld de,x0589 - ld bc,#0015 - ex de,hl - ldir - ex de,hl - dec hl - ld (#5C57),hl ;Адрес начала следующей строки бейсик-программы - inc hl - ld (#5C53),hl ;Адрес начала бейсик-программы - ld (#5C4B),hl ;Адрес начала области переменных бейсик-программы - ld (hl),#80 ;признак конца переменных бейсика - inc hl - ld (#5C59),hl ;Адрес начала редактируемой строки - ld (hl),#0D - inc hl - ld (hl),#80 - inc hl - ld (#5C61),hl ;Адрес начала рабочей области бейсик-программы - ld (#5C63),hl ;Адрес начала стека калькулятора - ld (#5C65),hl ;Адрес вершины стека калькулятора - ld a,#38 - ld (#5C8D),a ;Постоянные атрибуты экрана - ld (#5C8F),a ;Временные атрибуты, используемые при выводе на экран - ld (#5C48),a ;Атрибуты служебного экрана - xor a - ld (#EC13),a ;!!!ОШИБКА!!! должно писаться в rqm 7 - ld a,#07 - out (#FE),a ;бордюр - ld hl,#0523 ;автоповтор и период задержки - ld (#5C09),hl - dec (iy-#3A) ;x5C00 - dec (iy-#36) ;x5C04 - ld hl,x059E - ld de,#5C10 ;Область хранения информации о потоках - ld bc,#000E - ldir - res 1,(iy+#01) - ld (iy+#00),#FF ;no error - ld (iy+#31),#02 ;Количество строк в служебном экране - rst #28 ;вызов п/п x0D6B из basic 48k - dw Rom1.x0D6B ;CLS - rst #28 ;вызов п/п из basic 48k - dw Rom1.x3C04 ;проверка Break и вызов теста экрана - ld de,x0561 ;1992-94 Scorpion ZS 256 - call x057D ;печать строки из de - ld (iy+#31),#02 ;Количество строк в служебном экране - set 5,(iy+#02) - ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#38 - ld (#EC11),a - ld (#EC0F),a - call x2584 ;подготовка переменных 2-3,1=%11 - call x1F20 ;установка другого стэка и ram 0 - rst #08 ;вызов функции монитора - db #8C ;нажатие Enter и переход на rom 0: #259F - nop - -;АДРЕС: #026B выполненение введенной строки -x026B ld hl,x5B66 ;флаги - set 0,(hl) ;режим - ld (iy+#00),#FF ;код ошибки - ld (iy+#31),#02 ;количество строк в служебном экране - ld hl,x5B1D ;сюда вернемся при ошибке - push hl - ld (#5C3D),sp - ld hl,x02BA - ld (x5B8B),hl ;сюда вернемся при ошибке - call x228E ;поиск начала бейсик команды - call x22CB ;проверка токена - jp z,x21F8 ;вычисличть числовое выражение - cp "(" - jp z,x21F8 ;вычисличть числовое выражение - cp "-" - jp z,x21F8 ;вычисличть числовое выражение - cp "+" - jp z,x21F8 ;вычисличть числовое выражение - call x22E0 ;проверка это число или функция - jp z,x21F8 ;вычисличть числовое выражение - call x1F45 ;установка другого стэка и ram 7 - ld a,(#EC0E) - call x1F20 ;установка другого стэка и ram 0 - cp #04 - jp nz,x17AF ;анализ и выполнение программы - call x2297 ;проверка это команда LET? (калькулятор basic 128) - jp z,x17AF ;анализ и выполнение программы - pop hl - ret - -;АДРЕС: #02BA сюда возвращаемся после проверки синтаксиса бейсика -x02BA bit 7,(iy+#00) - jr nz,x02C1 - ret ;ошибок не было -x02C1 ld hl,(#5C59) - ld (#5C5D),hl - rst #28 - dw Rom1.x19FB ;получить номер редактиремой строки - ld a,b - or c - jp nz,x03F7 - rst #18 ;чтение очередного символа строки программы - cp #0D - ret z - call x21EF ;очистка экрана - bit 6,(iy+#02) - jr nz,x02DF - rst #28 - dw Rom1.x0D6E ;открыть канал -x02DF res 6,(iy+#02) - call x1F45 ;установка другого стэка и ram 7 - ld hl,#EC0D - bit 6,(hl) - jr nz,x02F4 - inc hl - ld a,(hl) - cp #00 - call z,x3881 ;очистка двух нижних строк экрана -x02F4 call x1F20 ;установка другого стэка и ram 0 - ld hl,#5C3C - res 3,(hl) - ld a,#19 - sub (iy+#4F) - ld (#5C8C),a - set 7,(iy+#01) - ld (iy+#0A),#01 ;!!!ОШИБКА!!! - ld hl,#3E00 - push hl - ld hl,x5B1D - push hl - ld (#5C3D),sp - ld hl,x0321 - ld (x5B8B),hl - jp x1838 ;выполнение команды из строки редактирования - -;АДРЕС: #0321 обработчик ошибок -x0321 ld sp,(#5CB2) - inc sp - ld hl,x5BFF - ld (x5B81),hl - halt - res 5,(iy+#01) - ld hl,x5B66 - bit 2,(hl) - jr z,x034A - call x1F45 ;установка другого стэка и ram 7 - ld ix,(x5B83) - ld bc,#0014 - add ix,bc - call x1D56 ;обновление записи каталога - call x1F20 ;установка другого стэка и ram 0 -x034A ld a,(#5C3A) - inc a -x034E push af - ld hl,#0000 - ld (iy+#37),h - ld (iy+#26),h - ld (#5C0B),hl - ld hl,#0001 - ld (#5C16),hl - rst #28 - dw Rom1.x16B0 ;очистка различных областей памяти - res 5,(iy+#37) - rst #28 - dw Rom1.x0D6E ;открыть канал - set 5,(iy+#02) - pop af - ld b,a - cp #0A - jr c,x037F - cp #1D - jr c,x037D - add a,#14 - jr x037F -x037D add a,#07 -x037F rst #28 - dw Rom1.x15EF ;печать символа из a - ld a," " - rst #10 - ld a,b - cp #1D - jr c,x039C - sub #1D - ld b,#00 - ld c,a - ld hl,x046C - add hl,bc - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - call x057D ;печать строки из de - jr x03A2 -x039C ld de,Rom1.x1391 - rst #28 - dw Rom1.x0C0A ;печать сообщения -x03A2 xor a - ld de,Rom1.x1536 - rst #28 - dw Rom1.x0C0A ;печать сообщения - ld bc,(#5C45) - rst #28 - dw Rom1.x1A1B ;печать номера строки - ld a,":" - rst #10 - ld c,(iy+#0D) - ld b,#00 - rst #28 - dw Rom1.x1A1B ;печать номера строки - rst #28 - dw Rom1.x1097 ;очистка памяти - ld a,(#5C3A) - inc a - jr z,x03DF - cp #09 - jr z,x03CC - cp #15 - jr nz,x03CF -x03CC inc (iy+#0D) -x03CF ld bc,#0003 - ld de,#5C70 - ld hl,#5C44 - bit 7,(hl) - jr z,x03DD - add hl,bc -x03DD lddr -x03DF ld (iy+#0A),#FF - res 3,(iy+#01) - ld hl,x5B66 - res 0,(hl) - jp x25CB - -;АДРЕС: #03EF обработчик ошибок -x03EF ld a,#10 - ld bc,#0000 - jp x034E - -;АДРЕС: #03F7 вставка строки программы -x03F7 ld (#5C49),bc - call x1F45 ;установка другого стэка и ram 7 - ld a,b - or c - jr z,x040A - ld (#5C49),bc - ld (#EC08),bc -x040A call x1F20 ;установка другого стэка и ram 0 - ld hl,(#5C5D) - ex de,hl - ld hl,x03EF - push hl - ld hl,(#5C61) - scf - sbc hl,de - push hl - ld h,b - ld l,c - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - jr nz,x0429 - rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x0429 pop bc - ld a,c - dec a - or b - jr nz,x0442 - call x1F45 ;установка другого стэка и ram 7 - push hl - ld hl,(#5C49) - call x334A ;поиск адреса строки бейсик программы - ld (#5C49),hl - pop hl - call x1F20 ;установка другого стэка и ram 0 - jr x046A -x0442 push bc - inc bc - inc bc - inc bc - inc bc -x0447 dec hl - ld de,(#5C53) - push de - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - pop hl - ld (#5C53),hl - pop bc - push bc - inc de - ld hl,(#5C61) - dec hl - dec hl - lddr - ld hl,(#5C49) - ex de,hl - pop bc - ld (hl),b - dec hl - ld (hl),c - dec hl - ld (hl),e - dec hl - ld (hl),d -x046A pop af - ret - -;АДРЕС: #046C адреса сообщений об ошибках -x046C dw x048C - dw x0497 - dw x04A6 - dw x04B0 - dw x04C1 - dw x04D4 - dw x04E0 - dw x04E0 - dw x04F3 - dw x0501 - dw x0512 - dw x0523 - dw x0531 - dw x0542 - dw x054E - dw x0561 - -;АДРЕС: #048C сообщения об ошибках -x048C dc "MERGE error" -x0497 dc "Wrong file type" -x04A6 dc "CODE error" -x04B0 dc "Too many brackets" -x04C1 dc "File already exists" -x04D4 dc "Invalid name" -x04E0 dc "File does not exist" -x04F3 dc "Invalid device" -x0501 dc "Invalid baud rate" -x0512 dc "Invalid note name" -x0523 dc "Number too big" -x0531 dc "Note out of range" -x0542 dc "Out of range" -x054E dc "Too many tied notes" -x0561 dc " 1992-94 Scorpion ZS 256 " - -;АДРЕС: #057D печать строки из de -;вх: de - адрес строки для печати -x057D ld a,(de) - and #7F - push de - rst #10 ;печать символа из A - pop de - ld a,(de) - inc de - add a,a - jr nc,x057D - ret - -;АДРЕС: #0589 информация о каналах -x0589 dw #09F4,#10A8: db "K" - dw #09F4,#15C4: db "S" - dw #0F81,#15C4: db "R" - dw x5B34,x5B2F: db "P" - db #80 - -;АДРЕС: #059E информация о потоках -x059E db #01,#00 ; - db #06,#00 - db #0B,#00 - db #01,#00 - db #01,#00 - db #06,#00 - db #10,#00 - -;АДРЕС: #05AC обработка ошибки -x05AC pop hl - ld bc,#7FFD - xor a - di - ld (x5B5C),a - out (c),a ;rom 0, ram 0, scr 5 - ei - ld sp,(#5C3D) - ld a,(hl) ;код ошибки - ld (x5B5E),a ;код сообщения для rst 8 basic48 - inc a - cp #1E ;!!!ОШИБКА!!! должно быть cp #1D - jr nc,x05C8 - rst #28 ;вызов процедуры из basic 48k - dw #5B5D -x05C8 dec a - ld (iy+#00),a ;код ошибки - ld hl,(#5C5D) ;адрес следущего символа в бейсик-программе - ld (#5C5F),hl ;адрес синтаксической ошибки - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16C5 ;восстановление стэка - ret - -;АДРЕС: #05D6 проверка нажатия break и печать сообщения -x05D6 ld a,#7F -x05D8 in a,(#FE) - rra - ret c ;пробел не нажат - ld a,#FE - in a,(#FE) - rra - ret c ;cs не нажата - call x05AC ;без возврата - db #14 ;L BREAK into program, n:m - -;АДРЕС: #05E6 RS232 ввод и вывод -x05E6 ei - ex af,af' - ld de,x5B4A ;п/п включения предыдущего rom bacic48/128 - push de - res 3,(iy+#02) ;проверка режима вывода не экран не требуется - push hl - ld hl,(#5C3D) ;адрес стэка при запуске обработки ошибок - ld e,(hl) - inc hl - ld d,(hl) - and a - ld hl,Rom1.x107F - sbc hl,de - jr nz,x0637 ;обработчик ошибок в basic128 - pop hl - ld sp,(#5C3D) - pop de - pop de - ld (#5C3D),de -x060A push hl - ld de,x0610 - push de - jp (hl) -x0610 jr c,x061B - jr z,x0618 -x0614 call x05AC ;без возврата - db #07 ;8 End of file, n:m -x0618 pop hl - jr x060A -x061B cp #0D - jr z,x062D - ld hl,(x5B5A) ;адрес возврата в basic128 - push hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0F85 ;добавить код в строку - pop hl - ld (x5B5A),hl - pop hl - jr x060A -x062D pop hl - ld a,(x5B5C) - or #10 - push af - jp x5B4A ;включение basic48 -x0637 pop hl - ld de,x063D - push de - jp (hl) -x063D ret c - ret z - jr x0614 - -;АДРЕС: #0641 команда FORMAT -; FORMAT "P";9600 -x0641 rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - jr z,x0661 ;проверка синтаксиса - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - ld a,c - dec a - or b - jr z,x0659 ;длина строки 1 байт - call x05AC ;ошибка - db #24 ;i Invalid device -x0659 ld a,(de) - and #DF - cp "P" - jp nz,x1912 ;ошибка C Nonsense in BASIC -x0661 ld hl,(#5C5D) - ld a,(hl) - cp ";" - jp nz,x1912 ;ошибка C Nonsense in BASIC - rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы -x066D rst #28 - dw Rom1.x1C82 ;получение числового значения - bit 7,(iy+#01) - jr z,x067D ;проверка синтаксиса - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (x5B71),bc -x067D rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp #0D - jr z,x0689 - cp ":" - jp nz,x1912 ;ошибка C Nonsense in BASIC -x0689 call x18A1 - ld bc,(x5B71) - ld a,b - or c - jr nz,x0698 - call x05AC ;ошибка - db #25 ;j invalid baud rate -x0698 ld hl,x06B8 -x069B ld e,(hl) - inc hl - ld d,(hl) - inc hl - ex de,hl - ld a,h - cp #25 - jr nc,x06AF - and a - sbc hl,bc - jr nc,x06AF - ex de,hl - inc hl - inc hl - jr x069B -x06AF ex de,hl - ld e,(hl) - inc hl - ld d,(hl) - ld (x5B5F),de - ret -x06B8 dw #0032,#0AA5 ;Baud=50. - dw #006E,#04D4 ;Baud=110. - dw #012C,#01C3 ;Baud=300. - dw #0258,#00E0 ;Baud=600. - dw #04B0,#006E ;Baud=1200. - dw #0960,#0036 ;Baud=2400. - dw #12C0,#0019 ;Baud=4800. - dw #2580,#000B ;Baud=9600. - -;АДРЕС: #06D8 процедура ввода из RS232 -x06D8 ld hl,x5B61 - ld a,(hl) - and a - jr z,x06E5 - ld (hl),#00 - inc hl - ld a,(hl) - scf - ret - -;АДРЕС: #06E5 чтение байта из RS232 -x06E5 call x05D6 ;проверка нажатия break и печать сообщения - di - exx - ld de,(x5B5F) - ld hl,(x5B5F) - srl h - rr l - or a - ld b,#FA - exx - ld c,#FD - ld d,#FF - ld e,#BF - ld b,d - ld a,#0E - out (c),a ;выбор 14 регистра AY - in a,(c) - or #F0 - and #FB - ld b,e - out (c),a - ld h,a -x070E ld b,d - in a,(c) - and #80 - jr z,x071E ;стартовый бит получен -x0715 exx - dec b - exx - jr nz,x070E - xor a - push af - jr x0757 ;выход по тайиауту -x071E in a,(c) - and #80 - jr nz,x0715 - in a,(c) - and #80 - jr nz,x0715 - exx - ld bc,#FFFD - ld a,#80 - ex af,af' -x0731 add hl,de - nop - nop - nop - nop -x0736 dec hl - ld a,h - or l - jr nz,x0736 - in a,(c) - and #80 - jp z,x074B - ex af,af' - scf - rra - jr c,x0754 - ex af,af' - jp x0731 -x074B ex af,af' - or a - rra - jr c,x0754 - ex af,af' - jp x0731 -x0754 scf - push af - exx -x0757 ld a,h - or #04 - ld b,e - out (c),a - exx - ld h,d - ld l,e - ld bc,#0007 - or a - sbc hl,bc -x0766 dec hl - ld a,h - or l - jr nz,x0766 - ld bc,#FFFD - add hl,de - add hl,de - add hl,de -x0771 in a,(c) - and #80 - jr z,x077F - dec hl - ld a,h - or l - jr nz,x0771 - pop af - ei - ret -x077F in a,(c) - and #80 - jr nz,x0771 - in a,(c) - and #80 - jr nz,x0771 - ld h,d - ld l,e - ld bc,#0002 - srl h - rr l - or a - sbc hl,bc - ld bc,#FFFD - ld a,#80 - ex af,af' -x079D nop - nop - nop - nop - add hl,de -x07A2 dec hl - ld a,h - or l - jr nz,x07A2 - in a,(c) - and #80 - jp z,x07B7 - ex af,af' - scf - rra - jr c,x07C0 - ex af,af' - jp x079D -x07B7 ex af,af' - or a - rra - jr c,x07C0 - ex af,af' - jp x079D -x07C0 ld hl,x5B61 - ld (hl),#01 - inc hl - ld (hl),a - pop af - ei - ret - -;АДРЕС: #07CA процедура вывода в RS232 -x07CA push af - ld a,(x5B65) - or a - jr z,x07E0 - dec a - ld (x5B65),a - jr nz,x07DB - pop af - jp x0872 -x07DB pop af - ld (#5C0F),a - ret -x07E0 pop af - cp #A3 ;SPECTRUM? - jr c,x07F2 ;не токен - ld hl,(x5B5A) - push hl - rst #28 - dw Rom1.x0B52 ;печать токена - pop hl - ld (x5B5A),hl - scf - ret -x07F2 ld hl,#5C3B - res 0,(hl) - cp #20 - jr nz,x07FD - set 0,(hl) -x07FD cp #7F - jr c,x0803 - ld a,"?" -x0803 cp " " - jr c,x081E - push af - ld hl,x5B63 - inc (hl) - ld a,(x5B64) - cp (hl) - jr nc,x081A - call x0822 ;перевод строки - ld a,#01 - ld (x5B63),a -x081A pop af - jp x08A3 ;передача байта на принтер -x081E cp #0D - jr nz,x0830 - -;АДРЕС: #0822 перевод строки на принтере -x0822 xor a - ld (x5B63),a - ld a,#0D - jp x08A3 - -;АДРЕС: #082B !!!NOT USED!!! взврат каретки на принтере -x082B ld a,#0A - jp x08A3 - -;АДРЕС: #0830 продолжение x07CA процедура вывода в RS232 -x0830 cp #06 - jr nz,x0853 - ld bc,(x5B63) - ld e,#00 -x083A inc e - inc c - ld a,c - cp b - jr z,x0848 -x0840 sub #08 - jr z,x0848 - jr nc,x0840 - jr x083A -x0848 push de - ld a," " - call x07CA ;вывод в RS232 - pop de - dec e - ret z - jr x0848 -x0853 cp #16 - jr z,x0860 - cp #17 - jr z,x0860 - cp #10 - ret c - jr x0869 -x0860 ld (#5C0E),a - ld a,#02 - ld (x5B65),a - ret -x0869 ld (#5C0E),a - ld a,#02 - ld (x5B65),a - ret -x0872 ld d,a - ld a,(#5C0E) - cp #16 - jr z,x0882 - cp #17 - ccf - ret nz - ld a,(#5C0F) - ld d,a -x0882 ld a,(x5B64) - cp d - jr z,x088A - jr nc,x0890 -x088A ld b,a - ld a,d - sub b - ld d,a - jr x0882 -x0890 ld a,d - or a - jp z,x0822 -x0895 ld a,(x5B63) - cp d - ret z - push de - ld a," " - call x07CA ;вывод в RS232 - pop de - jr x0895 - -;АДРЕС: #08A3 передача байта на принтер -x08A3 push hl - ld hl,x08EE - ex (sp),hl - push af - ld a,r - di - push af - ld a,#80 - jr x08B8 - -;АДРЕС: #08B1 rst #08 вызов функции монитора -x08B1 push af - ld a,r - di - push af - ld a,#01 -x08B8 push af - inc sp - push bc - ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - ld (#C001),a - cpl - ld (#C002),a - ld a,#12 - jp x0024 ;переход в rom 2 - -;АДРЕС: #08D1 включение компьютера/"холодный" старт -x08D1 ld bc,#692B -x08D4 dec bc ;пауза - ld a,c - or b - jr nz,x08D4 - ld bc,#1FFD - ld a,#12 - jp x001C ;переход в rom2: monitor (инициализация) - -;АДРЕС: #08E1 !!!NOT USED!!! вход куда-то -x08E1 ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - jp x3C4A - -;АДРЕС: #08EE возврат из x08A3 -x08EE ei - ret - -;АДРЕС: #08F0 команда COPY -x08F0 ld hl,x5B72 - ld (hl),#2B -x08F5 ld hl,x0979 - call x095F ;передача на принтер управляющего кода - call x0915 ;печать половины строки - ld hl,x0980 ;!!!not used - call x0822 ;перевод строки - ld hl,x5B72 - xor a - cp (hl) - jr z,x090E - dec (hl) - jr x08F5 -x090E ld hl,x0982 - call x095F ;передача на принтер управляющего кода - ret - -;АДРЕС: #0915 печать половины строки -x0915 ld hl,x5B71 - ld (hl),#FF -x091A call x0926 ;печать столбца пикселей (с двойной высотой) - ld hl,x5B71 - xor a - cp (hl) - ret z - dec (hl) - jr x091A -;печать столбца пикселей (с двойной высотой) -x0926 ld de,#C000 - ld bc,(x5B71) - scf - rl b - scf - rl b - ld a,c - cpl - ld c,a - xor a - push af - push de - push bc -x093A call x096D ;проверить пиксель на экране - pop bc - pop de - ld e,#00 - jr z,x0944 - ld e,d -x0944 pop af - or e - push af - dec b - srl d - srl d - push de - push bc - jr nc,x093A - pop bc - pop de - pop af - ld b,#03 -x0955 push bc - push af - call x08A3 ;передача байта на принтер - pop af - pop bc - djnz x0955 - ret - -;АДРЕС: #095F передача на принтер управляющего кода -x095F ld b,(hl) - inc hl -x0961 ld a,(hl) - push hl - push bc - call x08A3 ;передача байта на принтер - pop bc - pop hl - inc hl - djnz x0961 - ret - -;АДРЕС: #096D проверить пиксель на экране -;вых: a =#00 пикселя нет -x096D rst #28 - dw Rom1.x22AA ;рассчитать адрес на экране по координатам - ld b,a - inc b - xor a - scf -x0974 rra - djnz x0974 - and (hl) - ret - -;АДРЕС: #0979 управляющие коды принтера Epson -x0979 db #06 ;размер в байтах - db #1B,#31 ;ESC '1' - 7/72 дюйма интервал между строками - db #1B,#4C,#00,#03 ;ESC 'L' 0 3 - двойная плотность (768 байт на строку) -x0980 db #01 ;размер в байтах - db #0A ;код перевода строки LF -x0982 db #02 ;размер в байтах - db #1B,#32 ;ESC '2' - 1/6 дюйма интервал между строками - -;АДРЕС: #0985 команда PLAY -x0985 di - push bc - ld de,#0037 - ld hl,#003C -x098D add hl,de ;hl=#003C + (#0037 * b). - djnz x098D - ld c,l - ld b,h - rst #28 - dw Rom1.x0030 ;резервирование памяти - di - push de - pop iy - push hl - pop ix - ld (iy+#10),#FF -x09A0 ld bc,#FFC9 ;-#37 - add ix,bc - ld (ix+#03),#3C - ld (ix+#01),#FF - ld (ix+#04),#0F - ld (ix+#05),#05 - ld (ix+#21),#00 - ld (ix+#0A),#00 - ld (ix+#0B),#00 - ld (ix+#16),#FF - ld (ix+#17),#00 - ld (ix+#18),#00 - rst #28 ;!!!ошибка!!! - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - di - ld (ix+#06),e - ld (ix+#07),d - ld (ix+#0C),e - ld (ix+#0D),d - ex de,hl - add hl,bc - ld (ix+#08),l - ld (ix+#09),h - pop bc - push bc - dec b - ld c,b - ld b,#00 - sla c - push iy - pop hl - add hl,bc - push ix - pop bc -x09F4 ld (hl),c - inc hl - ld (hl),b - or a - rl (iy+#10) - pop bc - dec b - push bc - ld (ix+#02),b - jr nz,x09A0 - pop bc -x0A05 ld (iy+#27),#1A - ld (iy+#28),#0B - push iy - pop hl - ld bc,#002B - add hl,bc - ex de,hl - ld hl,x0A31 - ld bc,#000D - ldir - ld d,#07 - ld e,#F8 - call x0E7C ;вывод значения в регистр AY - ld d,#0B - ld e,#FF - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - jr x0A7D - -;АДРЕС: #0A31 расчет задержки -x0A31 rst #28 - db #A4 ; stk-ten. = x, 10 - db #01 ; exchange. = 10, x - db #05 ; division. = 10/x - db #34 ; stk-data. = 10/x, 7.33e-6 - db #DF ; - exponent $6F (floating point number 7.33e-6). - db #75 ; - mantissa byte 1 - db #F4 ; - mantissa byte 2 - db #38 ; - mantissa byte 3 - db #75 ; - mantissa byte 4 - db #05 ; division. = (10/x)/7.33e-6 - db #38 ; end-calc. - ret - -;АДРЕС: #0A3E опрос клавиши Break -x0A3E ld a,#7F - in a,(#FE) - rra - ret c - ld a,#FE - in a,(#FE) - rra - ret - -;АДРЕС: #0A4A установка указателя на данные для канала AY -x0A4A ld bc,#0011 - jr x0A52 - -;АДРЕС: #0A4F установка указателя на данные для канала AY -x0A4F ld bc,#0000 -x0A52 push iy - pop hl - add hl,bc - ld (iy+#23),l - ld (iy+#24),h - ld a,(iy+#10) - ld (iy+#22),a - ld (iy+#21),#01 - ret - -;АДРЕС: #0A67 установить адрес блока данных канала -x0A67 ld e,(hl) - inc hl - ld d,(hl) - push de - pop ix - ret - -;АДРЕС: #0A6E следующий канал -x0A6E ld l,(iy+#23) - ld h,(iy+#24) - inc hl - inc hl - ld (iy+#23),l - ld (iy+#24),h - ret - -x0A7D call x0A4F ;установка указателя на данные для канала AY -x0A80 rr (iy+#22) - jr c,x0A8C - call x0A67 ;установить адрес блокаданных канала - call x0B5C ;найти следующую ноту -x0A8C sla (iy+#21) - jr c,x0A97 - call x0A6E ;следующий канал - jr x0A80 -x0A97 call x0F91 ;найти наименьшую длительность - push de - call x0F42 ;проиграть ноты во всех каналах - pop de -x0A9F ld a,(iy+#10) - cp #FF - jr nz,x0AAB - call x0E93 ;гасим звуки во всех каналах - ei - ret -x0AAB dec de - call x0F76 ;ожидание - call x0FC1 ;проиграть ноты во всех каналах - call x0F91 ;найти наименьшую длительность - jr x0A9F - -;АДРЕС: #0AB7 список команд -x0AB7 db "HZYXWUVMT)(NO!" - -;АДРЕС: #0AC5 прочитать текущий символ из строки воспроизведения с инкрементом -;вых: cy=1 данных больше нет -x0AC5 call x0EE3 ;прочитать текущий символ из строки воспроизведения - ret c ;нет данных - inc (ix+#06) - ret nz - inc (ix+#07) - ret - -;АДРЕС: #0AD1 получить ноту в полутонах -x0AD1 push hl - ld c,#00 -x0AD4 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jr c,x0AE1 - cp "&" - jr nz,x0AEC - ld a,#80 -x0ADF pop hl - ret -x0AE1 ld a,(iy+#21) - or (iy+#10) - ld (iy+#10),a - jr x0ADF -x0AEC cp "#" - jr nz,x0AF3 - inc c - jr x0AD4 -x0AF3 cp "$" - jr nz,x0AFA - dec c - jr x0AD4 -x0AFA bit 5,a - jr nz,x0B04 - push af - ld a,#0C - add a,c - ld c,a - pop af -x0B04 and #DF - sub "A" - jp c,x0F22 ;k Invalid note name - cp #07 - jp nc,x0F22 ;k Invalid note name - push bc - ld b,#00 - ld c,a - ld hl,x0DF9 - add hl,bc - ld a,(hl) - pop bc - add a,c - pop hl - ret - -;АДРЕС: #0B1D получить числовое значение параметра -x0B1D push hl - push de - ld l,(ix+#06) - ld h,(ix+#07) - ld de,#0000 -x0B28 ld a,(hl) - cp "0" - jr c,x0B45 - cp "9"+1 - jr nc,x0B45 - inc hl - push hl - call x0B50 ;умножение de=de*10 - sub #30 - ld h,#00 - ld l,a - add hl,de - jr c,x0B42 ;переполнение - ex de,hl - pop hl - jr x0B28 -x0B42 jp x0F1A ;l number too big -x0B45 ld (ix+#06),l - ld (ix+#07),h - push de - pop bc - pop de - pop hl - ret - -;АДРЕС: #0B50 умножение de=de*10 -x0B50 ld hl,#0000 - ld b,#0A -x0B55 add hl,de - jr c,x0B42 ;переполнение - djnz x0B55 - ex de,hl - ret - -;АДРЕС: #0B5C найти следующую ноту -x0B5C call x0A3E ;опрос клавиши Break - jr c,x0B69 ;не нажата - call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #14 ;L Break into program -x0B69 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jp c,x0DA2 ;нет данных - call x0DF0 ;идентификация команды - ld b,#00 - sla c - ld hl,x0DCA - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - call x0B84 ;call (hl) - jr x0B5C -x0B83 ret -x0B84 jp (hl) - -;АДРЕС: #0B85 команда ! (коментарий) -x0B85 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jp c,x0DA1 ;конец строки - cp "!" - ret z - jr x0B85 - -;АДРЕС: #0B85 команда O (октава) -x0B90 call x0B1D ;получить числовое значение параметра - ld a,c - cp #09 - jp nc,x0F12 ;n Out of range - sla a - sla a - ld b,a - sla a - add a,b - ld (ix+#03),a - ret - -;АДРЕС: #0BA5 команда N (разделитель) -x0BA5 ret - -;АДРЕС: #0BA6 команда ( (начало цикла) -x0BA6 ld a,(ix+#0B) - inc a - cp #05 - jp z,x0F2A ;d Too many brackets - ld (ix+#0B),a - ld de,#000C - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - ld (hl),a - inc hl - ld a,(ix+#07) - ld (hl),a - ret - -;АДРЕС: #0BC2 команда ) (конец цикла) -x0BC2 ld a,(ix+#16) - ld de,#0017 - or a - jp m,x0BF0 - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - cp (hl) - jr nz,x0BF0 - inc hl - ld a,(ix+#07) - cp (hl) - jr nz,x0BF0 - dec (ix+#16) - ld a,(ix+#16) - or a - ret p - bit 0,(ix+#0A) - ret z - ld (ix+#16),#00 - xor a - jr x0C0B -x0BF0 ld a,(ix+#16) - inc a - cp #05 - jp z,x0F2A ;d Too many brackets - ld (ix+#16),a - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - ld (hl),a - inc hl - ld a,(ix+#07) - ld (hl),a - ld a,(ix+#0B) -x0C0B ld de,#000C - call x0C27 ;получить адрес указателя - ld a,(hl) - ld (ix+#06),a - inc hl - ld a,(hl) - ld (ix+#07),a - dec (ix+#0B) - ret p - ld (ix+#0B),#00 - set 0,(ix+#0A) - ret - -;АДРЕС: #0C27 получить адрес указателя -x0C27 push ix - pop hl - add hl,de - ld b,#00 - ld c,a - sla c - add hl,bc - ret - -;АДРЕС: #0C32 команда T (темп) -x0C32 call x0B1D ;получить числовое значение параметра - ld a,b - or a - jp nz,x0F12 ;n Out of range - ld a,c - cp #3C - jp c,x0F12 ;n Out of range - cp #F1 - jp nc,x0F12 ;n Out of range - ld a,(ix+#02) - or a - ret nz - ld b,#00 - push bc - pop hl - add hl,hl - add hl,hl - push hl - pop bc - push iy - rst #28 - dw Rom1.x2D2B ;bc на стэк калькулятора - di - pop iy - push iy - push iy - pop hl - ld bc,#002B - add hl,bc - ld iy,#5C3A - push hl - ld hl,x0C76 - ld (x5B5A),hl - ld hl,x5B14 - ex (sp),hl - push hl - jp x5B00 -x0C76 di - rst #28 - dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора - di - pop iy - ld (iy+#27),c - ld (iy+#28),b - ret - -;АДРЕС: #0C84 команда M (микшер) -x0C84 call x0B1D ;получить числовое значение параметра - ld a,c - cp #40 - jp nc,x0F12 ;n Out of range - cpl - ld e,a - ld d,#07 - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0C95 команда V (громкость) -x0C95 call x0B1D ;получить числовое значение параметра - ld a,c - cp #10 - jp nc,x0F12 ;n Out of range - ld (ix+#04),a ;!!!ОШИБКА!!! - ld e,(ix+#02) - ld a,#08 - add a,e - ld d,a - ld e,c - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0CAD команда U (эффекты) -x0CAD ld e,(ix+#02) - ld a,#08 - add a,e - ld d,a - ld e,#1F - ld (ix+#04),e - ret - -;АДРЕС: #0CBA команда W (эффекты) -x0CBA call x0B1D ;получить числовое значение параметра - ld a,c - cp #08 - jp nc,x0F12 ;n Out of range - ld b,#00 - ld hl,x0DE8 - add hl,bc - ld a,(hl) - ld (iy+#29),a - ret - -;АДРЕС: #0CCE команда X (эффекты) -x0CCE call x0B1D ;получить числовое значение параметра - ld d,#0B - ld e,c - call x0E7C ;вывод значения в регистр AY - inc d - ld e,b - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0CDD команда Y (MIDI канал) -x0CDD call x0B1D ;получить числовое значение параметра - ld a,c - dec a - jp m,x0F12 ;n Out of range - cp #10 - jp nc,x0F12 ;n Out of range - ld (ix+#01),a - ret - -;АДРЕС: #0CEE команда Z (MIDI код) -x0CEE call x0B1D ;получить числовое значение параметра - ld a,c - call x11A3 ;загрузка байта в порт MIDI - ret - -;АДРЕС: #0CF6 команда H (стоп) -x0CF6 ld (iy+#10),#FF - ret - -;АДРЕС: #0CFB команды 'a'..'g', 'A'..'G', '1'.."12", '&', '_' -x0CFB call x0E19 ;это цифра? - jp c,x0D81 ;нет - call x0DAC ;расчет указателя на длительность - call x0DB4 ;установка длительности - xor a - ld (ix+#21),a - call x0EC8 ;получение предыдущего параматра - call x0B1D ;получить числовое значение параметра - ld a,c - or a - jp z,x0F12 ;n Out of range - cp #0D - jp nc,x0F12 ;n Out of range - cp #0A - jr c,x0D32 - call x0E00 ;получить длительность ноты - call x0D74 ;увеличение счетчика нот - ld (hl),e - inc hl - ld (hl),d -x0D28 call x0D74 ;увеличение счетчика нот - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl - jr x0D38 -x0D32 ld (ix+#05),c - call x0E00 ;получить длительность ноты -x0D38 call x0D74 ;увеличение счетчика нот -x0D3B call x0EE3 ;прочитать текущий символ из строки воспроизведения - cp "_" - jr nz,x0D6E - call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - call x0B1D ;получить числовое значение параметра - ld a,c - cp #0A - jr c,x0D5F - push hl - push de - call x0E00 ;получить длительность ноты - pop hl - add hl,de - ld c,e - ld b,d - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d - ld e,c - ld d,b - jr x0D28 -x0D5F ld (ix+#05),c - push hl - push de - call x0E00 ;получить длительность ноты - pop hl - add hl,de - ex de,hl - pop hl - jp x0D3B -x0D6E ld (hl),e - inc hl - ld (hl),d - jp x0D9C - -;АДРЕС: #0D74 увеличение счетчика нот -x0D74 ld a,(ix+#21) - inc a - cp #0B - jp z,x0F3A ;o Too many tied notes - ld (ix+#21),a - ret - -x0D81 call x0EC8 ;получение предыдущего параматра - ld (ix+#21),#01 - call x0DAC ;расчет указателя на длительность - call x0DB4 ;установка длительности - ld c,(ix+#05) - push hl - call x0E00 ;получить длительность ноты - pop hl - ld (hl),e - inc hl - ld (hl),d - jp x0D9C ;!!!можно убрать -x0D9C pop hl - inc hl - inc hl - push hl - ret - -;АДРЕС: #0DA1 конец строки -x0DA1 pop hl -x0DA2 ld a,(iy+#21) - or (iy+#10) - ld (iy+#10),a - ret - -;АДРЕС: #0DAC расчет указателя на длительность -x0DAC push ix - pop hl - ld bc,#0022 - add hl,bc - ret - -;АДРЕС: #0DB4 установка длительности -x0DB4 push hl - push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - pop de - ld (hl),e - inc hl - ld (hl),d - ex de,hl - ret - -;АДРЕС: #0DCA таблица адресов обработки команд -x0DCA dw x0CFB ;прочие команды - dw x0B85 ; '!' - dw x0B90 ; 'O' - dw x0BA5 ; 'N' - dw x0BA6 ; '(' - dw x0BC2 ; ')' - dw x0C32 ; 'T' - dw x0C84 ; 'M' - dw x0C95 ; 'V' - dw x0CAD ; 'U' - dw x0CBA ; 'W' - dw x0CCE ; 'X' - dw x0CDD ; 'Y' - dw x0CEE ; 'Z' - dw x0CF6 ; 'H' - -;таблица огибающих -x0DE8 db #00 ; W0 - Single decay then off. (Continue off, attack off, alternate off, hold off) - db #04 ; W1 - Single attack then off. (Continue off, attack on, alternate off, hold off) - db #0B ; W2 - Single decay then hold. (Continue on, attack off, alternate on, hold on) - db #0D ; W3 - Single attack then hold. (Continue on, attack on, alternate off, hold on) - db #08 ; W4 - Repeated decay. (Continue on, attack off, alternate off, hold off) - db #0C ; W5 - Repeated attack. (Continue on, attack on, alternate off, hold off) - db #0E ; W6 - Repeated attack-decay. (Continue on, attack on, alternate on, hold off) - db #0A ; W7 - Repeated decay-attack. (Continue on, attack off, alternate on, hold off) - -;АДРЕС: #0DF0 идентификация команды -;вых: z - команда найдена -x0DF0 ld bc,#000F - ld hl,x0AB7 - cpir - ret - -;таблица полутонов -x0DF9 db #09 ; 'A' - db #0B ; 'B' - db #00 ; 'C' - db #02 ; 'D' - db #04 ; 'E' - db #05 ; 'F' - db #07 ; 'G' - -;АДРЕС: #0E00 получить длительность ноты -x0E00 push hl - ld b,#00 - ld hl,x0E0C - add hl,bc - ld d,#00 - ld e,(hl) - pop hl - ret -;длительность нот -x0E0C db #80 ; Rest [Not used since table is always indexed into with a value of 1 or more] - db #06 ; Semi-quaver (sixteenth note). - db #09 ; Dotted semi-quaver (3/32th note). - db #0C ; Quaver (eighth note). - db #12 ; Dotted quaver (3/16th note). - db #18 ; Crotchet (quarter note). - db #24 ; Dotted crotchet (3/8th note). - db #30 ; Minim (half note). - db #48 ; Dotted minim (3/4th note). - db #60 ; Semi-breve (whole note). - db #04 ; Triplet semi-quaver (1/24th note). - db #08 ; Triplet quaver (1/12th note). - db #10 ; Triplet crochet (1/6th note). - -;АДРЕС: #0E19 это цифра? -;вых: cy=0 это цифра -x0E19 cp "0" - ret c - cp "9"+1 - ccf - ret - -;АДРЕС: #0E20 проиграть ноту в канале -x0E20 ld c,a - ld a,(ix+#03) - add a,c - cp #80 - jp nc,x0F32 ;m Note out of range - ld c,a - ld a,(ix+#02) - or a - jr nz,x0E3F - ld a,c - cpl - and #7F - srl a - srl a - ld d,#06 - ld e,a - call x0E7C ;вывод значения в регистр AY -x0E3F ld (ix+#00),c - ld a,(ix+#02) - cp #03 - ret nc - ld hl,x1096 - ld b,#00 - ld a,c - sub #15 - jr nc,x0E57 - ld de,#0FBF - jr x0E5E -x0E57 ld c,a - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) -x0E5E ex de,hl - ld d,(ix+#02) - sla d - ld e,l - call x0E7C ;вывод значения в регистр AY - inc d - ld e,h - call x0E7C ;вывод значения в регистр AY - bit 4,(ix+#04) - ret z - ld d,#0D - ld a,(iy+#29) - ld e,a - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0E7C вывод значения в регистр AY -x0E7C push bc - ld bc,#FFFD - out (c),d - ld bc,#BFFD - out (c),e - pop bc - ret - -;АДРЕС: #0E89 чтение регистра AY -x0E89 push bc - ld bc,#FFFD - out (c),a - in a,(c) - pop bc - ret - -;АДРЕС: #0E93 гасим звуки во всех каналах -x0E93 ld d,#07 - ld e,#FF - call x0E7C ;вывод значения в регистр AY - ld d,#08 - ld e,#00 - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - call x0A4F ;установка указателя на данные для канала AY -x0EAC rr (iy+#22) - jr c,x0EB8 - call x0A67 ;установить адрес блока данных канала - call x118D ;гасим звук в канале MIDI -x0EB8 sla (iy+#21) - jr c,x0EC3 - call x0A6E ;следующий канал - jr x0EAC -x0EC3 ld iy,#5C3A - ret - -;АДРЕС: #0EC8 получение предыдущего параматра -x0EC8 push hl - push de - ld l,(ix+#06) - ld h,(ix+#07) -x0ED0 dec hl - ld a,(hl) - cp " " - jr z,x0ED0 - cp #0D - jr z,x0ED0 - ld (ix+#06),l - ld (ix+#07),h - pop de - pop hl - ret - -;АДРЕС: #0EE3 прочитать текущий символ из строки воспроизведения -;вых: cy=1 данных больше нет -x0EE3 push hl - push de - push bc - ld l,(ix+#06) - ld h,(ix+#07) -x0EEC ld a,h - cp (ix+#09) - jr nz,x0EFB - ld a,l - cp (ix+#08) - jr nz,x0EFB - scf - jr x0F05 -x0EFB ld a,(hl) - cp " " - jr z,x0F09 - cp #0D - jr z,x0F09 - or a -x0F05 pop bc - pop de - pop hl - ret -x0F09 inc hl - ld (ix+#06),l - ld (ix+#07),h - jr x0EEC - -;АДРЕС: #0F12 обработка ошибок -x0F12 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #29 ;n Out of range -x0F1A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #27 ;l Number too big -x0F22 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #26 ;k Invalid note name -x0F2A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #1F ;d Too many brackets -x0F32 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #28 ;m Note out of range -x0F3A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #2A ;o Too many tied notes - -;АДРЕС: #0F42 проиграть ноты во всех каналах -x0F42 call x0A4F ;установка указателя на данные для канала AY -x0F45 rr (iy+#22) - jr c,x0F6C - call x0A67 ;установить адрес блока данных канала - call x0AD1 ;получить ноту в полутонах - cp #80 - jr z,x0F6C - call x0E20 ;проиграть ноту в канале - ld a,(ix+#02) - cp #03 - jr nc,x0F69 - ld d,#08 - add a,d - ld d,a - ld e,(ix+#04) - call x0E7C ;вывод значения в регистр AY -x0F69 call x116E ;проиграть ноту в канале MIDI -x0F6C sla (iy+#21) - ret c - call x0A6E ;следующий канал - jr x0F45 - -;АДРЕС: #0F76 ожидание -x0F76 push hl - ld l,(iy+#27) - ld h,(iy+#28) - ld bc,#0064 - or a - sbc hl,bc - push hl - pop bc - pop hl -x0F86 dec bc - ld a,b - or c - jr nz,x0F86 - dec de - ld a,d - or e - jr nz,x0F76 - ret - -;АДРЕС: #0F91 найти наименьшую длительность -x0F91 ld de,#FFFF - call x0A4A ;установка указателя на данные для канала AY -x0F97 rr (iy+#22) - jr c,x0FAF - push de - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld e,(hl) - inc hl - ld d,(hl) - push de - pop hl - pop bc - or a - sbc hl,bc - jr c,x0FAF - push bc - pop de -x0FAF sla (iy+#21) - jr c,x0FBA - call x0A6E ;следующий канал - jr x0F97 -x0FBA ld (iy+#25),e - ld (iy+#26),d - ret - -;АДРЕС: #0FC1 проиграть ноты во всех каналах -x0FC1 xor a - ld (iy+#2A),a - call x0A4F ;установка указателя на данные для канала AY -x0FC8 rr (iy+#22) - jp c,x105A - call x0A67 ;установить адрес блока данных канала - push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - push hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld e,(iy+#25) - ld d,(iy+#26) - or a - sbc hl,de - ex de,hl - pop hl - jr z,x0FFC - ld (hl),e - inc hl - ld (hl),d - jr x105A -x0FFC ld a,(ix+#02) - cp #03 - jr nc,x100C - ld d,#08 - add a,d - ld d,a - ld e,#00 - call x0E7C ;вывод значения в регистр AY -x100C call x118D ;гасим звук в канале MIDI - push ix - pop hl - ld bc,#0021 - add hl,bc - dec (hl) - jr nz,x1026 - call x0B5C ;найти следующую ноту - ld a,(iy+#21) - and (iy+#10) - jr nz,x105A - jr x103D -x1026 push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - inc de - inc de - ld (hl),d - dec hl - ld (hl),e -x103D call x0AD1 ;получить ноту в полутонах - ld c,a - ld a,(iy+#21) - and (iy+#10) - jr nz,x105A - ld a,c - cp #80 - jr z,x105A - call x0E20 ;проиграть ноту в канале - ld a,(iy+#21) - or (iy+#2A) - ld (iy+#2A),a -x105A sla (iy+#21) - jr c,x1066 - call x0A6E ;следующий канал - jp x0FC8 -x1066 ld de,#0001 - call x0F76 ;ожидание - call x0A4F ;установка указателя на данные для канала AY -x106F rr (iy+#2A) - jr nc,x108C - call x0A67 ;установить адрес блока данных канала - ld a,(ix+#02) - cp #03 - jr nc,x1089 - ld d,#08 - add a,d - ld d,a - ld e,(ix+#04) - call x0E7C ;вывод значения в регистр AY -x1089 call x116E ;проиграть ноту в канале MIDI -x108C sla (iy+#21) - ret c - call x0A6E ;следующий канал - jr x106F - -;таблица нот -x1096 dw #0FBF; Octave 1, Note 21 - A (27.50 Hz, Ideal=27.50 Hz, Error=-0.01%) C0 - dw #0EDC; Octave 1, Note 22 - A# (29.14 Hz, Ideal=29.16 Hz, Error=-0.08%) - dw #0E07; Octave 1, Note 23 - B (30.87 Hz, Ideal=30.87 Hz, Error=-0.00%) - - dw #0D3D; Octave 2, Note 24 - C (32.71 Hz, Ideal=32.70 Hz, Error=+0.01%) C1 - dw #0C7F; Octave 2, Note 25 - C# (34.65 Hz, Ideal=34.65 Hz, Error=-0.00%) - dw #0BCC; Octave 2, Note 26 - D (36.70 Hz, Ideal=36.71 Hz, Error=-0.01%) - dw #0B22; Octave 2, Note 27 - D# (38.89 Hz, Ideal=38.89 Hz, Error=+0.01%) - dw #0A82; Octave 2, Note 28 - E (41.20 Hz, Ideal=41.20 Hz, Error=+0.00%) - dw #09EB; Octave 2, Note 29 - F (43.66 Hz, Ideal=43.65 Hz, Error=+0.00%) - dw #095D; Octave 2, Note 30 - F# (46.24 Hz, Ideal=46.25 Hz, Error=-0.02%) - dw #08D6; Octave 2, Note 31 - G (49.00 Hz, Ideal=49.00 Hz, Error=+0.00%) - dw #0857; Octave 2, Note 32 - G# (51.92 Hz, Ideal=51.91 Hz, Error=+0.01%) - dw #07DF; Octave 2, Note 33 - A (55.01 Hz, Ideal=55.00 Hz, Error=+0.01%) - dw #076E; Octave 2, Note 34 - A# (58.28 Hz, Ideal=58.33 Hz, Error=-0.08%) - dw #0703; Octave 2, Note 35 - B (61.75 Hz, Ideal=61.74 Hz, Error=+0.02%) - - dw #069F; Octave 3, Note 36 - C ( 65.39 Hz, Ideal= 65.41 Hz, Error=-0.02%) C2 - dw #0640; Octave 3, Note 37 - C# ( 69.28 Hz, Ideal= 69.30 Hz, Error=-0.04%) - dw #05E6; Octave 3, Note 38 - D ( 73.40 Hz, Ideal= 73.42 Hz, Error=-0.01%) - dw #0591; Octave 3, Note 39 - D# ( 77.78 Hz, Ideal= 77.78 Hz, Error=+0.01%) - dw #0541; Octave 3, Note 40 - E ( 82.41 Hz, Ideal= 82.41 Hz, Error=+0.00%) - dw #04F6; Octave 3, Note 41 - F ( 87.28 Hz, Ideal= 87.31 Hz, Error=-0.04%) - dw #04AE; Octave 3, Note 42 - F# ( 92.52 Hz, Ideal= 92.50 Hz, Error=+0.02%) - dw #046B; Octave 3, Note 43 - G ( 98.00 Hz, Ideal= 98.00 Hz, Error=+0.00%) - dw #042C; Octave 3, Note 44 - G# (103.78 Hz, Ideal=103.83 Hz, Error=-0.04%) - dw #03F0; Octave 3, Note 45 - A (109.96 Hz, Ideal=110.00 Hz, Error=-0.04%) - dw #03B7; Octave 3, Note 46 - A# (116.55 Hz, Ideal=116.65 Hz, Error=-0.08%) - dw #0382; Octave 3, Note 47 - B (123.43 Hz, Ideal=123.47 Hz, Error=-0.03%) - - dw #034F; Octave 4, Note 48 - C (130.86 Hz, Ideal=130.82 Hz, Error=+0.04%) C3 - dw #0320; Octave 4, Note 49 - C# (138.55 Hz, Ideal=138.60 Hz, Error=-0.04%) - dw #02F3; Octave 4, Note 50 - D (146.81 Hz, Ideal=146.83 Hz, Error=-0.01%) - dw #02C8; Octave 4, Note 51 - D# (155.68 Hz, Ideal=155.55 Hz, Error=+0.08%) - dw #02A1; Octave 4, Note 52 - E (164.70 Hz, Ideal=164.82 Hz, Error=-0.07%) - dw #027B; Octave 4, Note 53 - F (174.55 Hz, Ideal=174.62 Hz, Error=-0.04%) - dw #0257; Octave 4, Note 54 - F# (185.04 Hz, Ideal=185.00 Hz, Error=+0.02%) - dw #0236; Octave 4, Note 55 - G (195.83 Hz, Ideal=196.00 Hz, Error=-0.09%) - dw #0216; Octave 4, Note 56 - G# (207.57 Hz, Ideal=207.65 Hz, Error=-0.04%) - dw #01F8; Octave 4, Note 57 - A (219.92 Hz, Ideal=220.00 Hz, Error=-0.04%) - dw #01DC; Octave 4, Note 58 - A# (232.86 Hz, Ideal=233.30 Hz, Error=-0.19%) - dw #01C1; Octave 4, Note 59 - B (246.86 Hz, Ideal=246.94 Hz, Error=-0.03%) - - dw #01A8; Octave 5, Note 60 - C (261.42 Hz, Ideal=261.63 Hz, Error=-0.08%) C4 Middle C - dw #0190; Octave 5, Note 61 - C# (277.10 Hz, Ideal=277.20 Hz, Error=-0.04%) - dw #0179; Octave 5, Note 62 - D (294.01 Hz, Ideal=293.66 Hz, Error=+0.12%) - dw #0164; Octave 5, Note 63 - D# (311.35 Hz, Ideal=311.10 Hz, Error=+0.08%) - dw #0150; Octave 5, Note 64 - E (329.88 Hz, Ideal=329.63 Hz, Error=+0.08%) - dw #013D; Octave 5, Note 65 - F (349.65 Hz, Ideal=349.23 Hz, Error=+0.12%) - dw #012C; Octave 5, Note 66 - F# (369.47 Hz, Ideal=370.00 Hz, Error=-0.14%) - dw #011B; Octave 5, Note 67 - G (391.66 Hz, Ideal=392.00 Hz, Error=-0.09%) - dw #010B; Octave 5, Note 68 - G# (415.13 Hz, Ideal=415.30 Hz, Error=-0.04%) - dw #00FC; Octave 5, Note 69 - A (439.84 Hz, Ideal=440.00 Hz, Error=-0.04%) - dw #00EE; Octave 5, Note 70 - A# (465.72 Hz, Ideal=466.60 Hz, Error=-0.19%) - dw #00E0; Octave 5, Note 71 - B (494.82 Hz, Ideal=493.88 Hz, Error=+0.19%) - - dw #00D4; Octave 6, Note 72 - C (522.83 Hz, Ideal=523.26 Hz, Error=-0.08%) C5 - dw #00C8; Octave 6, Note 73 - C# (554.20 Hz, Ideal=554.40 Hz, Error=-0.04%) - dw #00BD; Octave 6, Note 74 - D (586.46 Hz, Ideal=587.32 Hz, Error=-0.15%) - dw #00B2; Octave 6, Note 75 - D# (622.70 Hz, Ideal=622.20 Hz, Error=+0.08%) - dw #00A8; Octave 6, Note 76 - E (659.77 Hz, Ideal=659.26 Hz, Error=+0.08%) - dw #009F; Octave 6, Note 77 - F (697.11 Hz, Ideal=698.46 Hz, Error=-0.19%) - dw #0096; Octave 6, Note 78 - F# (738.94 Hz, Ideal=740.00 Hz, Error=-0.14%) - dw #008D; Octave 6, Note 79 - G (786.10 Hz, Ideal=784.00 Hz, Error=+0.27%) - dw #0085; Octave 6, Note 80 - G# (833.39 Hz, Ideal=830.60 Hz, Error=+0.34%) - dw #007E; Octave 6, Note 81 - A (879.69 Hz, Ideal=880.00 Hz, Error=-0.04%) - dw #0077; Octave 6, Note 82 - A# (931.43 Hz, Ideal=933.20 Hz, Error=-0.19%) - dw #0070; Octave 6, Note 83 - B (989.65 Hz, Ideal=987.76 Hz, Error=+0.19%) - - dw #006A; Octave 7, Note 84 - C (1045.67 Hz, Ideal=1046.52 Hz, Error=-0.08%) C6 - dw #0064; Octave 7, Note 85 - C# (1108.41 Hz, Ideal=1108.80 Hz, Error=-0.04%) - dw #005E; Octave 7, Note 86 - D (1179.16 Hz, Ideal=1174.64 Hz, Error=+0.38%) - dw #0059; Octave 7, Note 87 - D# (1245.40 Hz, Ideal=1244.40 Hz, Error=+0.08%) - dw #0054; Octave 7, Note 88 - E (1319.53 Hz, Ideal=1318.52 Hz, Error=+0.08%) - dw #004F; Octave 7, Note 89 - F (1403.05 Hz, Ideal=1396.92 Hz, Error=+0.44%) - dw #004B; Octave 7, Note 90 - F# (1477.88 Hz, Ideal=1480.00 Hz, Error=-0.14%) - dw #0047; Octave 7, Note 91 - G (1561.14 Hz, Ideal=1568.00 Hz, Error=-0.44%) - dw #0043; Octave 7, Note 92 - G# (1654.34 Hz, Ideal=1661.20 Hz, Error=-0.41%) - dw #003F; Octave 7, Note 93 - A (1759.38 Hz, Ideal=1760.00 Hz, Error=-0.04%) - dw #003B; Octave 7, Note 94 - A# (1878.65 Hz, Ideal=1866.40 Hz, Error=+0.66%) - dw #0038; Octave 7, Note 95 - B (1979.30 Hz, Ideal=1975.52 Hz, Error=+0.19%) - - dw #0035; Octave 8, Note 96 - C (2091.33 Hz, Ideal=2093.04 Hz, Error=-0.08%) C7 - dw #0032; Octave 8, Note 97 - C# (2216.81 Hz, Ideal=2217.60 Hz, Error=-0.04%) - dw #002F; Octave 8, Note 98 - D (2358.31 Hz, Ideal=2349.28 Hz, Error=+0.38%) - dw #002D; Octave 8, Note 99 - D# (2463.13 Hz, Ideal=2488.80 Hz, Error=-1.03%) - dw #002A; Octave 8, Note 100 - E (2639.06 Hz, Ideal=2637.04 Hz, Error=+0.08%) - dw #0028; Octave 8, Note 101 - F (2771.02 Hz, Ideal=2793.84 Hz, Error=-0.82%) - dw #0025; Octave 8, Note 102 - F# (2995.69 Hz, Ideal=2960.00 Hz, Error=+1.21%) - dw #0023; Octave 8, Note 103 - G (3166.88 Hz, Ideal=3136.00 Hz, Error=+0.98%) - dw #0021; Octave 8, Note 104 - G# (3358.81 Hz, Ideal=3322.40 Hz, Error=+1.10%) - dw #001F; Octave 8, Note 105 - A (3575.50 Hz, Ideal=3520.00 Hz, Error=+1.58%) - dw #001E; Octave 8, Note 106 - A# (3694.69 Hz, Ideal=3732.80 Hz, Error=-1.02%) - dw #001C; Octave 8, Note 107 - B (3958.59 Hz, Ideal=3951.04 Hz, Error=+0.19%) - - dw #001A; Octave 9, Note 108 - C (4263.10 Hz, Ideal=4186.08 Hz, Error=+1.84%) C8 - dw #0019; Octave 9, Note 109 - C# (4433.63 Hz, Ideal=4435.20 Hz, Error=-0.04%) - dw #0018; Octave 9, Note 110 - D (4618.36 Hz, Ideal=4698.56 Hz, Error=-1.71%) - dw #0016; Octave 9, Note 111 - D# (5038.21 Hz, Ideal=4977.60 Hz, Error=+1.22%) - dw #0015; Octave 9, Note 112 - E (5278.13 Hz, Ideal=5274.08 Hz, Error=+0.08%) - dw #0014; Octave 9, Note 113 - F (5542.03 Hz, Ideal=5587.68 Hz, Error=-0.82%) - dw #0013; Octave 9, Note 114 - F# (5833.72 Hz, Ideal=5920.00 Hz, Error=-1.46%) - dw #0012; Octave 9, Note 115 - G (6157.81 Hz, Ideal=6272.00 Hz, Error=-1.82%) - dw #0011; Octave 9, Note 116 - G# (6520.04 Hz, Ideal=6644.80 Hz, Error=-1.88%) - dw #0010; Octave 9, Note 117 - A (6927.54 Hz, Ideal=7040.00 Hz, Error=-1.60%) - dw #000F; Octave 9, Note 118 - A# (7389.38 Hz, Ideal=7465.60 Hz, Error=-1.02%) - dw #000E; Octave 9, Note 119 - B (7917.19 Hz, Ideal=7902.08 Hz, Error=+0.19%) - - dw #000D; Octave 10, Note 120 - C ( 8526.20 Hz, Ideal= 8372.16 Hz, Error=+1.84%) C9 - dw #000C; Octave 10, Note 121 - C# ( 9236.72 Hz, Ideal= 8870.40 Hz, Error=+4.13%) - dw #000C; Octave 10, Note 122 - D ( 9236.72 Hz, Ideal= 9397.12 Hz, Error=-1.71%) - dw #000B; Octave 10, Note 123 - D# (10076.42 Hz, Ideal= 9955.20 Hz, Error=+1.22%) - dw #000B; Octave 10, Note 124 - E (10076.42 Hz, Ideal=10548.16 Hz, Error=-4.47%) - dw #000A; Octave 10, Note 125 - F (11084.06 Hz, Ideal=11175.36 Hz, Error=-0.82%) - dw #0009; Octave 10, Note 126 - F# (12315.63 Hz, Ideal=11840.00 Hz, Error=+4.02%) - dw #0009; Octave 10, Note 127 - G (12315.63 Hz, Ideal=12544.00 Hz, Error=-1.82%) - dw #0008; Octave 10, Note 128 - G# (13855.08 Hz, Ideal=13289.60 Hz, Error=+4.26%) - -;АДРЕС: #116E проиграть ноту в канале MIDI -x116E ld a,(ix+#01) - or a - ret m - or #90 - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#00) - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#04) - res 4,a - sla a - sla a - sla a - call x11A3 ;загрузка байта в порт MIDI - ret - -;АДРЕС: #118D гасим звук в канале MIDI -x118D ld a,(ix+#01) - or a - ret m - or #80 - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#00) - call x11A3 ;загрузка байта в порт MIDI - ld a,#40 - call x11A3 ;загрузка байта в порт MIDI - ret ;!!!можно оптимизировать - -;АДРЕС: #11A3 загрузка байта в порт MIDI -x11A3 ld l,a - ld bc,#FFFD - ld a,#0E - out (c),a - ld bc,#BFFD - ld a,#FA ;Set RS232 'RXD' transmit line to 0 - out (c),a - ld e,#03 ;задержка 113 тактов -x11B4 dec e - jr nz,x11B4 - nop - nop - nop - nop - ld a,l - ld d,#08 -x11BE rra - ld l,a - jp nc,x11C9 - ld a,#FE ;Set RS232 'RXD' transmit line to 1 - out (c),a - jr x11CF -x11C9 ld a,#FA ;Set RS232 'RXD' transmit line to 0 - out (c),a - jr x11CF -x11CF ld e,#02 -x11D1 dec e - jr nz,x11D1 - nop - add a,#00 - ld a,l - dec d - jr nz,x11BE - nop - nop - add a,#00 - nop - nop - ld a,#FE ;Set RS232 'RXD' transmit line to 0 - out (c),a - ld e,#06 -x11E7 dec e - jr nz,x11E7 - ret - -;АДРЕС: #11EB команда SAVE -x11EB ld hl,x5B66 - set 5,(hl) - jr x1205 - -;АДРЕС: #11F2 команда LOAD -x11F2 ld hl,x5B66 - set 4,(hl) - jr x1205 - -;АДРЕС: #11F2 команда VERIFY -x11F9 ld hl,x5B66 - set 7,(hl) - jr x1205 - -;АДРЕС: #1200 команда MERGE -x1200 ld hl,x5B66 - set 6,(hl) -x1205 ld hl,x5B66 ;!!!лишнее - res 3,(hl) - rst #18 ;чтение очередного символа строки программы - cp "!" - jp nz,x13BE ;работа с лентой - ld hl,x5B66 - set 3,(hl) - rst #20 ;получение следующего символа из бейсик программы - jp x13BE ;работа с RAM диском - -;АДРЕС: #1219 ошибка C Nonsense in BASIC -x1219 call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #121D работа с RAM диском -x121D ld (x5B74),hl - ld a,(ix+#00) - ld (x5B71),a - ld l,(ix+#0B) - ld h,(ix+#0C) - ld (x5B72),hl - ld l,(ix+#0D) - ld h,(ix+#0E) - ld (x5B78),hl - ld l,(ix+#0F) - ld h,(ix+#10) - ld (x5B76),hl - or a - jr z,x124E ;BASIC - cp #03 - jr z,x124E ;CODE/SCREEN$ - ld a,(ix+#0E) ;DATA - ld (x5B76),a -x124E push ix - pop hl - inc hl - ld de,x5B67 - ld bc,#000A - ldir - ld hl,x5B66 - bit 5,(hl) - jp nz,x1BAD ;SAVE - ld hl,x5B71 - ld de,x5B7A - ld bc,#0007 - ldir - call x1C2E ;загрузка заголовка файла из RAM диска - ld a,(x5B7A) - ld b,a - ld a,(x5B71) - cp b - jr nz,x1280 ;b Wrong file type - cp #03 - jr z,x1290 - jr c,x1284 -x1280 call x05AC - db #1D ;b Wrong file type -x1284 ld a,(x5B66) - bit 6,a - jr nz,x12C5 - bit 7,a - jp z,x12DB -x1290 ld a,(x5B66) - bit 6,a - jr z,x129B - call x05AC - db #1C ;a MERGE error -x129B ld hl,(x5B7B) - ld de,(x5B72) - ld a,h - or l - jr z,x12AE - sbc hl,de - jr nc,x12AE - call x05AC - db #1E ;c CODE error -x12AE ld hl,(x5B7B+2) - ld a,h - or l - jr nz,x12B8 - ld hl,(x5B74) -x12B8 ld a,(x5B71) - and a - jr nz,x12C1 - ld hl,(#5C53) -x12C1 call x137E ;загрузка данных с RAM диска - ret -x12C5 ld bc,(x5B72) - push bc - inc bc - rst #28 - dw Rom1.x0030 ;резервирование памяти -x12CE ld (hl),#80 - ex de,hl - pop de - push hl - call x137E ;загрузка данных с RAM диска - pop hl - rst #28 - dw Rom1.x08CE ;MERGE - ret -x12DB ld de,(x5B72) - ld hl,(x5B7B+2) - push hl - ld a,h - or l - jr nz,x12ED - inc de - inc de - inc de - ex de,hl - jr x12F6 -x12ED ld hl,(x5B7B) - ex de,hl - scf - sbc hl,de - jr c,x12FF -x12F6 ld de,#0005 - add hl,de - ld b,h - ld c,l - rst #28 - dw Rom1.x1F05 ;проверка наличия свободной памяти -x12FF pop hl - ld a,(x5B71) - and a - jr z,x1335 - ld a,h - or l - jr z,x1315 - dec hl - ld b,(hl) - dec hl - ld c,(hl) - dec hl - inc bc - inc bc - inc bc - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x1315 ld hl,(#5C59) - dec hl - ld bc,(x5B72) - push bc - inc bc - inc bc - inc bc - ld a,(x5B7F) - push af - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - pop af - ld (hl),a - pop de - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl -x1331 call x137E ;загрузка данных с RAM диска - ret -x1335 ld hl,x5B66 - res 1,(hl) - ld de,(#5C53) - ld hl,(#5C59) - dec hl - rst #28 - dw Rom1.x19E5 ;удалить переменные - ld bc,(x5B72) - ld hl,(#5C53) - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - ld bc,(x5B76) - add hl,bc - ld (#5C4B),hl - ld a,(x5B78+1) - ld h,a - and #C0 - jr nz,x1370 - ld a,(x5B78) - ld l,a - ld (#5C42),hl - ld (iy+#0A),#00 - ld hl,x5B66 - set 1,(hl) -x1370 ld hl,(#5C53) - ld de,(x5B72) - dec hl - ld (#5C57),hl - inc hl - jr x1331 ;!!!можно удалить - -;АДРЕС: #137E загрузка данных с RAM диска -x137E ld a,d - or e - ret z - call x1C4B ;загрузка из RAM диска - ret - -;АДРЕС: #1385 получить выражения из строки бейсика -x1385 rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - ret z ;проверка синтаксиса - push af - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - pop af - ret - -;АДРЕС: #1393 проверка и копирование имени файла -x1393 rst #20 - call x1385 ;получить выражения из строки бейсика - ret z ;проверка синтаксиса - push af - ld a,c - or b - jr z,x13BA ;ошибка в имени файла - ld hl,#000A - sbc hl,bc - jr c,x13BA ;ошибка в имени файла - push de - push bc - ld hl,x5B67 - ld b,#0A - ld a," " -x13AD ld (hl),a - inc hl - djnz x13AD - pop bc - pop hl - ld de,x5B67 - ldir - pop af - ret -x13BA call x05AC - db #21 ;f Invalid name - -;АДРЕС: #13BE работа с лентой/RAM диском -x13BE rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - jr z,x1407 ;проверка синтаксиса - ld bc,#0011 - ld a,(#5C74) - and a - jr z,x13D2 ;SAVE - ld c,#22 ;" -x13D2 rst #28 - dw Rom1.x0030 ;резервирование памяти - push de - pop ix - ld b,#0B - ld a," " -x13DC ld (de),a - inc de - djnz x13DC - ld (ix+#01),#FF - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - ld hl,-10 - dec bc - add hl,bc - inc bc - jr nc,x1400 - ld a,(#5C74) - and a - jr nz,x13F9 ;не SAVE - call x05AC ;ошибка - db #0E ;F Invalid file name -x13F9 ld a,b - or c - jr z,x1407 - ld bc,#000A -x1400 push ix - pop hl - inc hl - ex de,hl - ldir -x1407 rst #18 ;чтение очередного символа строки программы - cp #E4 ;это DATA? - jr nz,x145F ;нет - ld a,(#5C74) ; 'xxx' "name" DATA - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x28B2 ;LOOK-VARS - jr nc,x142F - ld hl,#0000 - bit 6,(iy+#01) - jr z,x1425 - set 7,c -x1425 ld a,(#5C74) - dec a - jr z,x1444 - call x05AC ;ошибка запись или проверка пустого массива - db #01 ;2 Variable not found -x142F jp nz,x1219 ;C Nonsense in BASIC - bit 7,(iy+#01) - jr z,x1451 ;проверка синтаксиса - ld c,(hl) - inc hl - ld a,(hl) - ld (ix+#0B),a - inc hl - ld a,(hl) - ld (ix+#0C),a - inc hl -x1444 ld (ix+#0E),c - ld a,#01 ;числовой массив - bit 6,c - jr z,x144E - inc a ;символьный массив -x144E ld (ix+#00),a -x1451 ex de,hl - rst #20 ;чтение следующего символа строки программы - cp ")" - jr nz,x142F - rst #20 ;чтение следующего символа строки программы - call x18A1 - ex de,hl - jp x1519 -x145F cp #AA ;SCREEN$ ? - jr nz,x1482 ;нет - ld a,(#5C74) ; 'xxx' "name" SCREEN$ - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - call x18A1 - ld (ix+#0B),#00 - ld (ix+#0C),#1B - ld hl,#4000 - ld (ix+#0D),l - ld (ix+#0E),h - jr x14CF -x1482 cp #AF ;CODE ? - jr nz,x14D5 ;нет - ld a,(#5C74) ; 'xxx' "name" CODE - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x2048 ;PR-ST-END - jr nz,x14A0 - ld a,(#5C74) - and a - jp z,x1219 ;C Nonsense in BASIC - rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x14AF -x14A0 rst #28 - dw Rom1.x1C82 ;получение числового значения - rst #18 ;чтение очередного символа строки программы - cp "," - jr z,x14B4 - ld a,(#5C74) - and a - jp z,x1219 ;C Nonsense in BASIC -x14AF rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x14B8 -x14B4 rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x1C82 ;получение числового значения -x14B8 call x18A1 - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0B),c - ld (ix+#0C),b - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0D),c - ld (ix+#0E),b - ld h,b - ld l,c -x14CF ld (ix+#00),#03 - jr x1519 -x14D5 cp #CA ;LINE ? - jr z,x14E2 ;да - call x18A1 ;'xxx "name"' / 'SAVE "name" LINE' - ld (ix+#0E),#80 - jr x14F9 -x14E2 ld a,(#5C74) - and a ;SAVE ? - jp nz,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0D),c - ld (ix+#0E),b -x14F9 ld (ix+#00),#00 - ld hl,(#5C59) - ld de,(#5C53) - scf - sbc hl,de - ld (ix+#0B),l - ld (ix+#0C),h - ld hl,(#5C4B) - sbc hl,de - ld (ix+#0F),l - ld (ix+#10),h - ex de,hl -x1519 ld a,(x5B66) - bit 3,a - jp nz,x121D ;операция с RAM диском - ld a,(#5C74) - and a ;это SAVE ? - jr nz,x152B ;нет - rst #28 - dw Rom1.x0970 ;SAVE - ret -x152B rst #28 - dw Rom1.x0761 ;LOAD/MERGE/VERIFY - ret - -;АДРЕС: #152F печать бейсик программы от текущей строки -x152F ld hl,#EEF5 - res 0,(hl) - set 1,(hl) -x1536 ld hl,(#5C49) ;номер строки - ld a,h - or l - jr nz,x1540 - ld (#EC06),hl -x1540 ld a,(#F9DB) - push af - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - ld (#F9D7),hl - call x3222 ;установка буфера редактирования в верху экрана - call x30D6 ;установка буфера редактирования внизу экрана - pop af -x1554 or a - jr z,x1563 - push af - call x30DF ;сдвиг строк в буфере редактирования вверх - ex de,hl - call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана - pop af - dec a - jr x1554 -x1563 ld c,#00 - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,c - ld a,(#EC15) - ld c,a - push bc - push de -x156F call x30DF ;сдвиг строк в буфере редактирования вверх - ld a,(#EEF5) - bit 1,a - jr z,x1596 - push de - push hl - ld de,#0020 - add hl,de - bit 0,(hl) - jr z,x1594 - inc hl - ld d,(hl) - inc hl - ld e,(hl) - or a - ld hl,(#5C49) - sbc hl,de - jr nz,x1594 - ld hl,#EEF5 - set 0,(hl) -x1594 pop hl - pop de -x1596 push bc - push hl - ld bc,#0023 - ldir - pop hl - pop bc - push de - push bc - ex de,hl - ld hl,#EEF5 - bit 0,(hl) - jr z,x15D3 - ld b,#00 -x15AB ld hl,(#EC06) - ld a,h - or l - jr z,x15C0 - push hl ;!!!ОШИБКА!!! - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop hl - jr nc,x15CB - dec hl - inc b - ld (#EC06),hl - jr x15AB -x15C0 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - call nc,x2E63 ;поиск в строке влево от курсора редактируемого символа - ld hl,#EEF5 - ld (hl),#00 -x15CB ld a,b - pop bc - push bc - ld c,b - ld b,a - call x2A11 ;сохранить позицию курсора -x15D3 pop bc - pop de - ld a,c - inc b - cp b - jr nc,x156F - ld a,(#EEF5) - bit 1,a - jr z,x1602 - bit 0,a - jr nz,x1602 - ld hl,(#5C49) - ld a,h - or l - jr z,x15F4 - ld (#FC9A),hl - call x3222 ;установка буфера редактирования в верху экрана - jr x15FD -x15F4 ld (#FC9A),hl - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - ld (#5C49),hl -x15FD pop de - pop bc - jp x1536 -x1602 pop de - pop bc - cp a -x1605 push af - ld a,c - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - ex de,hl -x160C push af - call x3604 ;печать строки редактируемого буфера - pop af - ld de,#0023 - add hl,de - inc c - cp c - jr nc,x160C - pop af - ret z - call x2A07 ;получение позиции курсора -x161E call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - ld hl,(#EC06) - dec hl - ld a,h - or l - ld (#EC06),hl - jr nz,x161E - jp x2A11 ;сохранить позицию курсора - ret ;!!!не используется!!! - -;АДРЕС: #1630 очистка окна редактирования -x1630 ld b,#00 - ld a,(#EC15) - ld d,a - jp x3B5E ;очистка строк экрана - -;АДРЕС: #1639 сдвиг всех строк в буфере редактирования верх и обновление экрана -x1639 ld b,#00 - push hl - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана - pop hl - ret nc - call x30DF ;сдвиг строк в буфере редактирования вверх -x1648 push bc - push hl - ld hl,#0023 - add hl,de - ld a,(#EC15) - ld c,a - cp b - jr z,x1663 - push bc -x1656 push bc - ld bc,#0023 - ldir - pop bc - ld a,c - inc b - cp b - jr nz,x1656 - pop bc -x1663 pop hl - call x3618 ;сдвиг вверх строк в буфере редактирования при необходимости - ld bc,#0023 - ldir - scf - pop bc - ret - -;АДРЕС: #166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана -x166F ld b,#00 - call x322B ;перемещение курсора вверх в верхнем буфере редактирования - ret nc - -;АДРЕС: #1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;вых: cy=0 буфер переполнен -; b - последняя строка -x1675 push bc - push hl -;сдвиг всех строк в буфере вниз - ld a,(#EC15) ;номер строки в буфере редактирования - ld c,a - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x311E ;сдвиг строк в буфере редактирования вниз - jr nc,x16A9 ;буфер переполнен - dec de - ld hl,#0023 - add hl,de - ex de,hl - push bc - ld a,b - cp c - jr z,x169A -x168E push bc - ld bc,#0023 - lddr - pop bc - ld a,b - dec c - cp c - jr c,x168E -;все строки сдвинуты вниз -x169A ex de,hl - inc de - pop bc ;c - номер строки - pop hl ;адрес следуюющей строки - call x362C ;сдвиг вниз строк в буфере редактирования при необходимости - ld bc,#0023 - ldir - scf - pop bc - ret -;буфер переполнен -x16A9 pop hl - pop bc - ret - -;АДРЕС: #16AC вставка символа в строку буфера редактирования -;вх: de - адрес начала строки в буфере -; a - код символа -; b - crd X -;вых: a - код последнего символа строки -; z - сждвигать больше нечего -x16AC push de - ld h,#00 - ld l,b - add hl,de ;адрес символа в буфере - ld d,a - ld a,b -x16B3 ld e,(hl) - ld (hl),d - ld d,e - inc hl - inc a - cp #20 - jr c,x16B3 - ld a,e - cp #00 - pop de - ret - -;АДРЕС: #16C1 вставка символа в строку буфера редактирования со сдвигом влево -x16C1 push de - ld hl,#0020 - add hl,de - push hl - ld d,a - ld a,#1F - jr x16D3 -x16CC ld e,(hl) - ld (hl),d - ld d,e - cp b - jr z,x16D6 - dec a -x16D3 dec hl - jr x16CC -x16D6 ld a,e - cp #00 - pop hl - pop de - ret - -;АДРЕС: #16DC смещения до параметров команды -x16DC db #B1 ; DEF FN -> #178D (ROM 0) - db #C9 ; CAT -> #17A6 (ROM 0) - db #BC ; FORMAT -> #179A (ROM 0) - db #BE ; MOVE -> #179D (ROM 0) - db #C3 ; ERASE -> #17A3 (ROM 0) - db #AF ; OPEN # -> #1790 (ROM 0) - db #B4 ; CLOSE # -> #1796 (ROM 0) - db #93 ; MERGE -> #1776 (ROM 0) - db #91 ; VERIFY -> #1775 (ROM 0) - db #92 ; BEEP -> #1777 (ROM 0) - db #95 ; CIRCLE -> #177B (ROM 0) - db #98 ; INK -> #177F (ROM 0) - db #98 ; PAPER -> #1780 (ROM 0) - db #98 ; FLASH -> #1781 (ROM 0) - db #98 ; BRIGHT -> #1782 (ROM 0) - db #98 ; INVERSE -> #1783 (ROM 0) - db #98 ; OVER -> #1784 (ROM 0) - db #98 ; OUT -> #1785 (ROM 0) - db #7F ; LPRINT -> #176D (ROM 0) - db #81 ; LLIST -> #1770 (ROM 0) - db #2E ; STOP -> #171E (ROM 0) - db #6C ; READ -> #175D (ROM 0) - db #6E ; DATA -> #1760 (ROM 0) - db #70 ; RESTORE -> #1763 (ROM 0) - db #48 ; NEW -> #173C (ROM 0) - db #94 ; BORDER -> #1789 (ROM 0) - db #56 ; CONTINUE -> #174C (ROM 0) - db #3F ; DIM -> #1736 (ROM 0) - db #41 ; REM -> #1739 (ROM 0) - db #2B ; FOR -> #1724 (ROM 0) - db #17 ; GO TO -> #1711 (ROM 0) - db #1F ; GO SUB -> #171A (ROM 0) - db #37 ; INPUT -> #1733 (ROM 0) - db #77 ; LOAD -> #1774 (ROM 0) - db #44 ; LIST -> #1742 (ROM 0) - db #0F ; LET -> #170E (ROM 0) - db #59 ; PAUSE -> #1759 (ROM 0) - db #2B ; NEXT -> #172C (ROM 0) - db #43 ; POKE -> #1745 (ROM 0) - db #2D ; PRINT -> #1730 (ROM 0) - db #51 ; PLOT -> #1755 (ROM 0) - db #3A ; RUN -> #173F (ROM 0) - db #6D ; SAVE -> #1773 (ROM 0) - db #42 ; RANDOMIZE -> #1749 (ROM 0) - db #0D ; IF -> #1715 (ROM 0) - db #49 ; CLS -> #1752 (ROM 0) - db #5C ; DRAW -> #1766 (ROM 0) - db #44 ; CLEAR -> #174F (ROM 0) - db #15 ; RETURN -> #1721 (ROM 0) - db #5D ; COPY -> #176A (ROM 0) - -;АДРЕС: #170E синтаксические параметры команд (аналогично basic 48 #1A7A) -; CLASS-00 - больше нет операндов -; CLASS-01 - используется в LET. требуется переменная -; CLASS-02 - используется в LET. за ним выражение числовое или строковое -; CLASS-03 - за этим следует числовое выражение (=0 при отсутствии) -; CLASS-04 - за этим следует односимвольная переменная -; CLASS-05 - -; CLASS-06 - за этим следует числовое выражение -; CLASS-07 - работа с атрибутами -; CLASS-08 - два числа через запятую -; CLASS-09 - два числа через запятую (могут быть упраляющие цветом коды) -; CLASS-0A - строка -; CLASS-0B - для работы с кассетой/RAM-диском -; CLASS-0C - то же что и CLASS-00, но вызывается из ROM 0 -; CLASS-0D - то же что и CLASS-06, но вызывается из ROM 0 -; CLASS-0E - обрабатывается в ROM 0 -x170E db #01 ; CLASS-01 LET - db "=" ; = - db #02 ; CLASS-02 -x1711 db #06 ; CLASS-06 GO TO - db #00 ; CLASS-00 - dw Rom1.x1E67 ; GO TO routine in ROM 1 -x1715 db #06 ; CLASS-06 IF - db #CB ; 'THEN' - db #0E ; CLASS-0E - dw x1967 ; IF routine in ROM 0 -x171A db #06 ; CLASS-06 GO SUB - db #0C ; CLASS-0C - dw x1A53 ; GO SUB routine in ROM 0 -x171E db #00 ; CLASS-00 STOP - dw Rom1.x1CEE ; STOP routine in ROM 1 -x1721 db #0C ; CLASS-0C RETURN - dw x1A6F ; RETURN routine in ROM 0 -x1724 db #04 ; CLASS-04 FOR - db "=" ; '=' - db #06 ; CLASS-06 - db #CC ; 'TO' - db #06 ; CLASS-06 - db #0E ; CLASS-0E - dw x1981 ; FOR routine in ROM 0 -x172C db #04 ; CLASS-04 NEXT - db #00 ; CLASS-00 - dw Rom1.x1DAB ; NEXT routine in ROM 1 -x1730 db #0E ; CLASS-0E PRINT - dw x2178 ; PRINT routine in ROM 0 -x1733: db #0E ; CLASS-0E INPUT - dw x218C ; INPUT routine in ROM 0 -x1736 db #0E ; CLASS-0E DIM - dw x21D5 ; DIM routine in ROM 0 -x1739 db #0E ; CLASS-0E REM - dw x1862 ; REM routine in ROM 0 -x173C db #0C ; CLASS-0C NEW - dw x21AA ; NEW routine in ROM 0 -x173F db #0D ; CLASS-0D RUN - dw x1A02 ; RUN routine in ROM 0 -x1742 db #0E ; CLASS-0E LIST - dw x1B75 ; LIST routine in ROM 0 -x1745 db #08 ; CLASS-08 POKE - db #00 ; CLASS-00 - dw Rom1.x1E80 ; POKE routine in ROM 1 -x1749 db #03 ; CLASS-03 RANDOMIZE - dw Rom1.x1E4F ; RANDOMIZE routine in ROM 1 -x174C db #00 ; CLASS-00 CONTINUE - dw Rom1.x1E5F ; CONTINUE routine in ROM 1 -x174F db #0D ; CLASS-0D CLEAR - dw Rom1.x1A0D ; CLEAR routine in ROM 0 -x1752 db #00 ; CLASS-00 CLS - dw Rom1.x0D6B ; CLS routine in ROM 1 -x1755 db #09 ; CLASS-09 PLOT - db #00 ; CLASS-00 - dw Rom1.x22DC ; PLOT routine in ROM 1 -x1759 db #06 ; CLASS-06 PAUSE - db #00 ; CLASS-00 - dw Rom1.x1F3A ; PAUSE routine in ROM 1 -x175D db #0E ; CLASS-0E READ - dw x19AB ; READ routine in ROM 0 -x1760 db #0E ; CLASS-0E DATA - dw x19EB ; DATA routine in ROM 0 -x1763 db #03 ; CLASS-03 RESTORE - dw Rom1.x1E42 ; RESTORE routine in ROM 1 -x1766 db #09 ; CLASS-09 DRAW - db #0E ; CLASS-0E - dw x21BE ; DRAW routine in ROM 0 -x176A db #0C ; CLASS-0C COPY - dw x21A7 ; New COPY routine in ROM 0. -x176D db #0E ; CLASS-0E LPRINT - dw x2174 ; LPRINT routine in ROM 0 -x1770 db #0E ; CLASS-0E LLIST - dw x1B71 ; LLIST routine in ROM 0 -x1773 db #0B ; CLASS-0B SAVE -x1774 db #0B ; CLASS-0B LOAD -x1775 db #0B ; CLASS-0B VERIFY -x1776 db #0B ; CLASS-0B MERGE -x1777 db #08 ; CLASS-08 BEEP - db #00 ; CLASS-00 - dw Rom1.x03F8 ; BEEP routine in ROM 1 -x177B db #09 ; CLASS-09 CIRCLE - db #0E ; CLASS-0E - dw x21AE ; CIRCLE routine in ROM 0 -x177F db #07 ; CLASS-07 INK -x1780 db #07 ; CLASS-07 PAPER -x1781 db #07 ; CLASS-07 FLASH -x1782 db #07 ; CLASS-07 BRIGHT -x1783 db #07 ; CLASS-07 INVERSE -x1784 db #07 ; CLASS-07 OVER -x1785 db #08 ; CLASS-08 OUT - db #00 ; CLASS-00 - dw Rom1.x1E7A ; OUT routine in ROM 1 -x1789 db #06 ; CLASS-06 BORDER - db #00 ; CLASS-00 - dw Rom1.x2294 ; BORDER routine in ROM 1 -x178D db #0E ; CLASS-0E DEF FN - dw x1A8C ; DEF FN routine in ROM 0 -x1790 db #06 ; CLASS-06 OPEN # - db "," ; ',' - db #0A ; CLASS-0A - db #00 ; CLASS-00 - dw Rom1.x1736 ; OPEN # routine in ROM 1 -x1796 db #06 ; CLASS-06 CLOSE # - db #00 ; CLASS-00 - dw Rom1.x16E5 ; CLOSE # routine in ROM 1 -x179A db #0E ; CLASS-0E FORMAT - dw x0641 ; FORMAT routine in ROM 0 -x179D db #0A ; CLASS-0A MOVE - db "," ; ',' - db #0A ; CLASS-0A - db #0C ; CLASS-0C - dw x1AF0 ; Just execute a RET -x17A3 db #0E ; CLASS-0E ERASE - dw x1C0C ; ERASE routine in ROM 0 -x17A6 db #0E ; CLASS-0E CAT - dw x1BE5 ; CAT routine in ROM 0 -x17A9 db #0C ; CLASS-0C SPECTRUM - dw x1B2B ; SPECTRUM routine in ROM 0 -x17AC: db #0E ; CLASS-0E PLAY - dw x2317 ; PLAY routine in ROM 0 - -;АДРЕС: #17AF анализ и выполнение бейсик программы -x17AF res 7,(iy+#01) - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x19FB ;получить номер редактиремой строки - xor a - ld (#5C47),a - dec a - ld (#5C3A),a - jr x17C1 -x17C0 rst #20 ;получить следующий символ -x17C1 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16BF ;очистка рабочего буфера - inc (iy+#0D) ;номер оператора в строке - jp m,x1912 ;слишком много операторов. ошибка - rst #18 ;получение кода символа - ld b,#00 - cp #0D - jp z,x1863 ;это enter - конец строки - cp ":" - jr z,x17C0 ;следующая команда - ld hl,x1821 ;сюда вернемся - push hl - ld c,a - rst #20 ;получить следующий символ - ld a,c - sub #CE - jr nc,x17F4 ;это DEF FN и дальше - add a,#CE - ld hl,x17A9 - cp #A3 - jr z,x1800 ;это SPECTRUM - ld hl,x17AC - cp #A4 - jr z,x1800 ;это PLAY - jp x1912 ;ошибка -x17F4 ld c,a - ld hl,x16DC - add hl,bc - ld c,(hl) - add hl,bc - jr x1800 -x17FD ld hl,(#5C74) -;вызов п/п обработки команды -x1800 ld a,(hl) - inc hl - ld (#5C74),hl - ld bc,x17FD ;сюда вернемся - push bc - ld c,a - cp #20 - jr nc,x181A ;это разделитель - ld hl,x18B5 - ld b,#00 - add hl,bc - ld c,(hl) - add hl,bc - push hl ;п/п обработки класса - rst #18 ;читаем код команды - dec b - ret -x181A rst #18 ;читаем код команды - cp c - jp nz,x1912 - rst #20 ;читаем код следующей команды - ret -x1821 call x05D6 ;проверка нажатия break и печать сообщения - jr c,x182A - call x05AC ;обработка ошибки без возврата - db #14 ;L Break into program -x182A bit 7,(iy+#0A) - jp nz,x18A8 - ld hl,(#5C42) ;номер строки бейсик программы - bit 7,h - jr z,x184C ;это строка программы -x1838 ld hl,#FFFE ;выполнение команды из строки редактирования - ld (#5C45),hl - ld hl,(#5C61) - dec hl - ld de,(#5C59) - dec de - ld a,(#5C44) - jr x1882 ;следующая строка программы - -;новая строка программы -x184C rst #28 ;вызов процедуры из basic 48k - dw Rom1.x196E ;получить начальный адрес строки программы - ld a,(#5C44) - jr z,x1870 ;поиск следующей строки - and a - jr nz,x189D ;N Statement lost - ld b,a - ld a,(hl) - and #C0 - ld a,b - jr z,x1870 ;еще не конец программы - call x05AC ;обработка ошибки без возврата - db #FF ;0 OK -;обработка команды: REM -x1862 pop bc -;обработка конца строки программы -x1863 bit 7,(iy+#01) - ret z ;это проверка синтаксиса - ld hl,(#5C55) ;адрес следующей строки программы - ld a,#C0 - and (hl) - ret nz ;следующая строка программы в RAM - xor a -;поиск следующей строки -x1870 cp #01 - adc a,#00 - ld d,(hl) - inc hl - ld e,(hl) ;номер строки программы - ld (#5C45),de - inc hl - ld e,(hl) - inc hl - ld d,(hl) ;длина строки программы - ex de,hl - add hl,de - inc hl -;следующая строка программы -x1882 ld (#5C55),hl ;адрес следующей строки - ex de,hl - ld (#5C5D),hl - ld d,a - ld e,#00 - ld (iy+#0A),#FF ;номер следующего оператора в строке - dec d - ld (iy+#0D),d ;номер выполняемого оператора - jp z,x17C0 ;первая команда в строке - inc d - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x198B ;поиск команды в строке - jr z,x18A8 ;команда найдена -x189D call x05AC - db #16 ;N Statement lost -;следующая строка программы -x18A1 bit 7,(iy+#01) - ret nz ;выполнение программы - pop bc - pop bc -;следующая команда в строке программы -x18A8 rst #18 ;читаем символ из строки - cp #0D - jr z,x1863 ;конец строки - cp ":" - jp z,x17C0 ;следующая команда - jp x1912 ;ошибка: noncens in basic - -;АДРЕС: #18B5 таблица смещений до процедур обработки класса оператора -x18B5 db x18D9-$ ;CLASS-00 -> x18D9 = #24 - db x18F9-$ ;CLASS-01 -> x18F9 = #43 - db x18FD-$ ;CLASS-02 -> x18FD = #46 - db x18D6-$ ;CLASS-03 -> x18D6 = #1E - db x1905-$ ;CLASS-04 -> x1905 = #4C - db x18DA-$ ;CLASS-05 -> x18DA = #20 - db x190E-$ ;CLASS-06 -> x190E = #53 - db x191A-$ ;CLASS-07 -> x191A = #5E - db x190A-$ ;CLASS-08 -> x190A = #4D - db x1944-$ ;CLASS-09 -> x1944 = #86 - db x1916-$ ;CLASS-0A -> x1916 = #57 - db x1948-$ ;CLASS-0B -> x1948 = #88 - db x18C7-$ ;CLASS-0C -> x18C7 = #06 - db x18C4-$ ;CLASS-0D -> x18C4 = #02 - db x18C8-$ ;CLASS-0E -> x18C8 = #05 - -;АДРЕС: #18C4 классы #0C,#0D,#0E -x18C4 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CDE ;получение параметра-числа -x18C7 cp a -x18C8 pop bc - call z,x18A1 ;если проверка синтаксиса, переход к следующей команде - ex de,hl - ld hl,(#5C74) - ld c,(hl) - inc hl - ld b,(hl) - ex de,hl - push bc - ret - -;АДРЕС: #18D6 классы #00,#03,#05 -x18D6 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CDE ;получение параметра-числа -x18D9 cp a -x18DA pop bc - call z,x18A1 ;если проверка синтаксиса, переход к следующей команде - ex de,hl - ld hl,(#5C74) - ld c,(hl) - inc hl - ld b,(hl) - ex de,hl - push hl - ld hl,x18F8 ;сюда вернемся - ld (x5B5A),hl - ld hl,x5B14 - ex (sp),hl - push hl - ld h,b - ld l,c - ex (sp),hl - jp x5B00 -x18F8 ret - -;АДРЕС: #18F9 класс #01 -x18F9 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C1F ;идентификация переменной - ret - -;АДРЕС: #18FD класс #02 -x18FD pop bc - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C56 ;получить значение параметра - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ret - -;АДРЕС: #1905 класс #04 FOR/NEXT -x1905 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C6C ;FOR i - ret - -;АДРЕС: #1909 класс #08 -x1909 rst #20 -x190A rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C7A ;получение двух значений - ret - -;АДРЕС: #190E класс #06 -x190E rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C82 ;получение числового значения - ret - -;АДРЕС: #1912 ошибка C Nonsense in BASIC -x1912 call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #1916 класс #0A -x1916 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C8C ;параметр - строка - ret - -;АДРЕС: #191A класс #07 -x191A bit 7,(iy+#01) - res 0,(iy+#02) - jr z,x1927 ;проверка синтаксиса - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0D4D ;копирование атрибутов -x1927 pop af - ld a,(#5C74) - sub #28+(low x177F) ;#A7 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x21FC ;изменение временных атрибутов - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ld hl,(#5C8F) ;ATTR_T - ld (#5C8D),hl ;ATTR_P - ld hl,#5C91 ;P_FLAG - ld a,(hl) - rlca - xor (hl) - and #AA - xor (hl) - ld (hl),a - ret - -;АДРЕС: #1944 класс #09 -x1944 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CBE ;установка необязательных атрибутов для печати - ret - -;АДРЕС: #1948 класс #0B -x1948 pop af - ld a,(x5B66) - and #0F - ld (x5B66),a - ld a,(#5C74) - sub 1+(low x1773) ;#74 - ld (#5C74),a - jp z,x11EB ;SAVE - dec a - jp z,x11F2 ;LOAD - dec a - jp z,x11F9 ;VERIFY - jp x1200 ;MERGE - -;АДРЕС: #1967 команда IF -x1967 pop bc - bit 7,(iy+#01) - jr z,x197E ;проверка синтаксиса - ld hl,(#5C65) - ld de,-5 - add hl,de - ld (#5C65),hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x34E9 ;проверка значения на ноль - jp c,x1863 ;если не ноль переход на следующую строку -x197E jp x17C1 ;перехд на следующую команду (THEN) - -;АДРЕС: #1981 команда FOR -x1981 cp #CD - jr nz,x198E ;ищем оператор STEP - rst #20 - call x190E ;получение числового значения - call x18A1 ;если проверка синтаксиса, переход к следующей команде - jr x19A6 -x198E call x18A1 ;если проверка синтаксиса, переход к следующей команде - ld hl,(#5C65) - ld (hl),#00 ;поместим значение на стэк калькулятора - inc hl - ld (hl),#00 - inc hl - ld (hl),#01 - inc hl - ld (hl),#00 - inc hl - ld (hl),#00 - inc hl - ld (#5C65),hl -x19A6 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1D16 - ret - -;АДРЕС: #19AA команда READ -x19AA rst #20 -x19AB call x18F9 ;идентификация переменной - bit 7,(iy+#01) - jr z,x19E2 ;проверка синтаксиса - rst #18 - ld (#5C5F),hl - ld hl,(#5C57) - ld a,(hl) - cp "," - jr z,x19CB - ld e,#E4 ;поиск оператора DATA - rst #28 - dw Rom1.x1D86 ;поиск оператора - jr nc,x19CB ;оператор найден - call x05AC - db #0D ;E Out of Data -x19CB inc hl - ld (#5C5D),hl - ld a,(hl) - rst #28 - dw Rom1.x1C56 ;извлечь значение - rst #18 - ld (#5C57),hl - ld hl,(#5C5F) - ld (iy+#26),#00 - ld (#5C5D),hl - ld a,(hl) -x19E2 rst #18 - cp "," - jr z,x19AA - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ret - -;АДРЕС: #19EB команда DATA -x19EB bit 7,(iy+#01) - jr nz,x19FC ;исполнение программы -x19F1 rst #28 - dw Rom1.x24FB ;ищем следующее выражение - cp "," - call nz,x18A1 ;если проверка синтаксиса, переход к следующей команде - rst #20 - jr x19F1 -x19FC ld a,#E4 -x19FE rst #28 - dw Rom1.x1E39 ;проверить инструкцию DATA или DEF FN - ret - -;АДРЕС: #1A02 команда RUN -x1A02 rst #28 - dw Rom1.x1E67 ;команда GO TO - ld bc,#0000 - rst #28 - dw Rom1.x1E45 - jr x1A10 - -;АДРЕС: #1A0D команда CLEAR -x1A0D rst #28 - dw Rom1.x1E99 ;извлечь операнд -x1A10 ld a,b - or c - jr nz,x1A18 - ld bc,(#5CB2) -x1A18 push bc - ld de,(#5C4B) - ld hl,(#5C59) - dec hl - rst #28 - dw Rom1.x19E5 ;удалить переменные - rst #28 - dw Rom1.x0D6B ;CLS - ld hl,(#5C65) - ld de,#0032 - add hl,de - pop de - sbc hl,de - jr nc,x1A3B - ld hl,(#5CB4) - and a - sbc hl,de - jr nc,x1A3F -x1A3B call x05AC - db #15 ;M Ramtop no good -x1A3F ld (#5CB2),de - pop de - pop hl - pop bc - ld sp,(#5CB2) - inc sp - push bc - push hl - ld (#5C3D),sp - push de - ret - -;АДРЕС: #1A53 команда GO SUB -x1A53 pop de - ld h,(iy+#0D) - inc h - ex (sp),hl - inc sp - ld bc,(#5C45) - push bc - push hl - ld (#5C3D),sp - push de - rst #28 - dw Rom1.x1E67 ;команда GO TO - ld bc,#0014 - rst #28 - dw Rom1.x1F05 ;проверка наличия свободной памяти - ret - -;АДРЕС: #1A6F команда RETURN -x1A6F pop bc - pop hl - pop de - ld a,d - cp #3E - jr z,x1A86 - dec sp - ex (sp),hl - ex de,hl - ld (#5C3D),sp - push bc - ld (#5C42),hl - ld (iy+#0A),d - ret -x1A86 push de - push hl - call x05AC - db #06 ;7 RETURN without GO SUB - -;АДРЕС: #1A8C команда DEF FN -x1A8C bit 7,(iy+#01) - jr z,x1A97 ;проверка синтаксиса - ld a,#CE - jp x19FE -x1A97 set 6,(iy+#01) - rst #28 - dw Rom1.x2C8D ;это буква? - jr nc,x1AB6 ;нет - rst #20 - cp "$" - jr nz,x1AAA - res 6,(iy+#01) - rst #20 -x1AAA cp "(" - jr nz,x1AEA - rst #20 - cp ")" - jr z,x1AD3 -x1AB3 rst #28 - dw Rom1.x2C8D ;это буква? -x1AB6 jp nc,x1912 ;ошибка - ex de,hl - rst #20 - cp "$" - jr nz,x1AC1 - ex de,hl - rst #20 -x1AC1 ex de,hl - ld bc,#0006 - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - inc hl - ld (hl),#0E - cp "," - jr nz,x1AD3 - rst #20 - jr x1AB3 -x1AD3 cp ")" - jr nz,x1AEA - rst #20 - cp "=" - jr nz,x1AEA - rst #20 - ld a,(#5C3B) - push af - rst #28 - dw Rom1.x24FB ;ищем следующее выражение - pop af - xor (iy+#01) - and #40 -x1AEA jp nz,x1912 ;ошибка - call x18A1 - -;АДРЕС: #1AF0 команда MOVE -x1AF0 ret - -;АДРЕС: #1AF1 пункт меню Tape Loader -x1AF1 ld hl,#EC0E - ld (hl),#FF - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) - ld bc,#0003 - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - ld hl,x1B6E - ld de,(#5C59) - ld bc,#0003 -x1B0F ldir - -;АДРЕС: #1B11 анализ и выполненение введенной строки -x1B11 call x026B ;анализ и выполненение введенной строки - -;АДРЕС: #1B14 пункт меню редактора Print (печать на принтер) -x1B14 call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) ;адрес начала редактируемой строки - ld bc,#0001 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1655 ;резервирование места (длина в bc) - ld hl,(#5C59) ;адрес начала редактируемой строки - ld (hl),#E1 ;команда LLIST - call x026B ;исполнение команды (без возврата) - -;АДРЕС: #1B2B команда SPECTRUM -x1B2B call x1B53 ;установка канала 'P' - ld sp,(#5C3D) - pop hl - ld hl,Rom1.x1303 ;основной цикл basic 48 - push hl - ld hl,Rom1.x0013 ;адрес с байтом #FF в rom 1 - push hl - ld hl,x0008 ;обработчик ошибок - push hl ;!!!ОШИБКА!!! - ld a,#20 ;basic48, блокировка #7FFD, ram 0 - ld (x5B5C),a - jp x5B00 - -;АДРЕС: #1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 -x1B47 ld hl,#0000 - -;АДРЕС: #1B4A включение basic48, блокировка #7FFD и переход на адрес в hl -x1B4A push hl - ld a,#20 - ld (x5B5C),a - jp x5B00 - -;АДРЕС: #1B53 установка канала 'P' -x1B53 ld hl,(#5C4F) ;адрес начала области информации о каналах - ld de,#0005 - add hl,de ;канал S - ld de,#000A - ex de,hl - add hl,de - ex de,hl ;канал P - ld bc,#0004 - ldir - res 3,(iy+#30) ;курсор L - res 4,(iy+#01) ;режим zx-48 - ret - -;АДРЕС: #1B6E данные для команды LOAD "" -x1B6E db #EF,#22,#22 ;load "" - -;АДРЕС: #1B71 команда LLIST -x1B71 ld a,#03 - jr x1B77 - -;АДРЕС: #1B75 команда LIST -x1B75 ld a,#02 -x1B77 ld (iy+#02),#00 - rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x1B83 ;проверка - rst #28 - dw Rom1.x1601 ;открыть канал -x1B83 rst #28 ;!!!можно rst #18 - dw Rom1.x0018 ;чтение очередного символа строки программы -x1B86 rst #28 - dw Rom1.x2070 ;нужно ли изменять поток? - jr c,x1BA3 ;не нужно - rst #28 ;!!!можно rst #18 - dw Rom1.x0018 ;чтение очередного символа строки программы -x1B8E cp ";" - jr z,x1B96 - cp "," - jr nz,x1B9E -x1B96 rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы -x1B99 call x190E ;получение числового значения - jr x1BA6 -x1B9E rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x1BA6 -x1BA3 rst #28 - dw Rom1.x1CDE ;получение параметра-числа -x1BA6 call x18A1 - rst #28 - dw Rom1.x1825 ;LIST-5+3 - ret - -;АДРЕС: #1BAD команда RAM disk SAVE! -x1BAD ld (x5B81),sp - ld sp,x5BFF - call x1C97 ;создание новой записи в каталоге RAM-диска - ld bc,(x5B72) - ld hl,-9 - or #FF - sbc hl,bc - call x1CF3 ;коррекция сводного места на RAM диске - ld bc,#0009 - ld hl,x5B71 - call x1DAC ;сохранение данных на RAM диске - ld hl,(x5B74) - ld bc,(x5B72) - call x1DAC ;сохранение данных на RAM диске - call x1D56 ;обновление записи каталога - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1BE5 команда RAM disk CAT! -x1BE5 rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp "!" - jp nz,x1912 ;ошибка - rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы - call x18A1 - ld a,#02 ;канал #02 - rst #28 - dw Rom1.x1601 ;открыть канал - ld (x5B81),sp - ld sp,x5BFF - call x20D2 ;печать каталога RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C0C команда RAM disk EARSE! -x1C0C rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp "!" - jp nz,x1912 ;ошибка - call x1393 ;проверка и копирование имени файла - call x18A1 - ld (x5B81),sp - ld sp,x5BFF - call x1F5F ;удаление файла из RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C2E загрузка заголовка файла из RAM диска -x1C2E ld (x5B81),sp - ld sp,x5BFF - call x1D35 ;поиск файла на RAM диске - ld hl,x5B71 - ld bc,#0009 - call x1E37 ;загрузка данных с RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C4B загрузка из RAM диска -x1C4B ld (x5B81),sp - ld sp,x5BFF - ld b,d - ld c,e - call x1E37 ;загрузка данных с RAM диска - call x1D56 ;обновление записи каталога - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C64 включение логической страницы в A -x1C64 push hl - push bc - ld hl,x1C81 - ld b,#00 - ld c,a - add hl,bc - ld c,(hl) - di - ld a,(x5B5C) - and #F8 - or c - ld (x5B5C),a - ld bc,#7FFD - out (c),a - ei - pop bc - pop hl - ret -x1C81 db #01,#03,#04,#06,#07,#00 - -;АДРЕС: #1C87 сравнение имени файла с заданным -;вых: z - имена совпадают -x1C87 ld de,x5B67 -x1C8A push ix - pop hl - ld b,#0A -x1C8F ld a,(de) - inc de - cp (hl) - inc hl - ret nz - djnz x1C8F - ret - -;АДРЕС: #1C97 создание новой записи в каталоге RAM-диска -x1C97 call x1D12 ;поиск имени файла в каталоге - jr z,x1CA0 ;имя не найдено - call x05AC - db #20 ;e File already exists -x1CA0 push ix - ld bc,#3FEC ;максимальный размер каталога - add ix,bc - pop ix - jr nc,x1D0E ;нехватает памяти - ld hl,-20 - ld a,#FF - call x1CF3 ;коррекция сводного места на RAM диске - ld hl,x5B66 - set 2,(hl) - push ix ;копируем имя файла - pop de - ld hl,x5B67 - ld bc,#000A - ldir - set 0,(ix+#13) ;запись обновлена - ld a,(ix+#0A) ;адрес начала файла = адрес конца файла - ld (ix+#10),a - ld a,(ix+#0B) - ld (ix+#11),a - ld a,(ix+#0C) - ld (ix+#12),a - xor a - ld (ix+#0D),a ;длина файла =#000000 - ld (ix+#0E),a - ld (ix+#0F),a - ld a,#05 - call x1C64 ;ram 0 - push ix - pop hl - ld bc,-20 - add hl,bc - ld (x5B83),hl - ret - -;АДРЕС: #1CF3 коррекция сводного места на RAM диске -x1CF3 ld de,(x5B85) - ex af,af' - ld a,(x5B85+2) - ld c,a - ex af,af' - bit 7,a - jr nz,x1D0A - add hl,de - adc a,c -x1D03 ld (x5B85),hl - ld (x5B85+2),a - ret -x1D0A add hl,de - adc a,c - jr c,x1D03 -x1D0E call x05AC - db #03 ;4 Out of memory - -;АДРЕС: #1D12 поиск имени файла в каталоге -;вых: z - файл не найден -; nz - файл наден -> ix - адрес дескриптора -x1D12 ld a,#04 ;ram 7 - call x1C64 - ld ix,#EBEC ;адрес первой записи в каталоге -x1D1B ld de,(x5B83) - or a - push ix - pop hl - sbc hl,de - ret z - call x1C87 ;сравнение имени файла с заданным - jr nz,x1D2E ;имя не совпало - or #FF - ret -x1D2E ld bc,-20 - add ix,bc - jr x1D1B - -;АДРЕС: #1D35 поиск файла на RAM диске -x1D35 call x1D12 ;поиск имени файла в каталоге - jr nz,x1D3E ;найден - call x05AC - db #23 ;h File does not exist -x1D3E ld a,(ix+#0A) - ld (ix+#10),a - ld a,(ix+#0B) - ld (ix+#11),a - ld a,(ix+#0C) - ld (ix+#12),a - ld a,#05 ;ram 0 - call x1C64 - ret - -;АДРЕС: #1D56 обновление записи каталога -x1D56 ld a,#04 ;ram 7 - call x1C64 - bit 0,(ix+#13) - ret z ;обновлять не надо - res 0,(ix+#13) - ld hl,x5B66 - res 2,(hl) - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - ld e,(ix+#0A) - ld d,(ix+#0B) - ld b,(ix+#0C) - or a - sbc hl,de - sbc a,b - rl h - rl h - sra a - rr h - sra a - rr h - ld (ix+#0D),l - ld (ix+#0E),h - ld (ix+#0F),a - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - ld bc,-20 - add ix,bc - ld (ix+#0A),l - ld (ix+#0B),h - ld (ix+#0C),a - ret - -;АДРЕС: #1DAC сохранение данных на RAM диске -;вх: hl - откуда -; bc - сколько -x1DAC ld a,b - or c - ret z - push hl - ld de,#C000 - ex de,hl - sbc hl,de - jr z,x1DD5 - jr c,x1DD5 - push hl - sbc hl,bc - jr nc,x1DCC - ld h,b - ld l,c - pop bc - or a - sbc hl,bc - ex (sp),hl - ld de,#C000 - push de - jr x1DF4 -x1DCC pop hl - pop hl - ld de,#0000 - push de - push de - jr x1DF4 -x1DD5 ld h,b - ld l,c - ld de,#0020 - or a - sbc hl,de - jr c,x1DE4 - ex (sp),hl - ld b,d - ld c,e - jr x1DE9 -x1DE4 pop hl - ld de,#0000 - push de -x1DE9 push bc - ld de,x5B98 - ldir - pop bc - push hl - ld hl,x5B98 -x1DF4 ld a,#04 - call x1C64 ;ram 7 - ld e,(ix+#10) - ld d,(ix+#11) - ld a,(ix+#12) - call x1C64 -x1E05 ldi - ld a,d - or e - jr z,x1E24 -x1E0B ld a,b - or c - jp nz,x1E05 - ld a,#04 ;ram 7 - call x1C64 - ld (ix+#10),e - ld (ix+#11),d - ld a,#05 ;ram 0 - call x1C64 - pop hl - pop bc - jr x1DAC -x1E24 ld a,#04 ;ram 7 - call x1C64 - inc (ix+#12) - ld a,(ix+#12) - ld de,#C000 - call x1C64 - jr x1E0B - -;АДРЕС: #1E37 загрузка данных с RAM диска -;вх: hl - куда -; bc - сколько -x1E37 ld a,b - or c - ret z - push hl - ld de,#C000 - ex de,hl - sbc hl,de - jr z,x1E67 - jr c,x1E67 - push hl - sbc hl,bc - jr nc,x1E5C - ld h,b - ld l,c - pop bc - or a - sbc hl,bc - ex (sp),hl - ld de,#0000 - push de - ld de,#C000 - push de - ex de,hl - jr x1E80 -x1E5C pop hl - pop hl - ld de,#0000 - push de - push de - push de - ex de,hl - jr x1E80 -x1E67 ld h,b - ld l,c - ld de,#0020 - or a - sbc hl,de - jr c,x1E76 - ex (sp),hl - ld b,d - ld c,e - jr x1E7B -x1E76 pop hl - ld de,#0000 - push de -x1E7B push bc - push hl - ld de,x5B98 -x1E80 ld a,#04 ;ram 7 - call x1C64 - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - call x1C64 -x1E91 ldi - ld a,h - or l - jr z,x1EBC -x1E97 ld a,b - or c - jp nz,x1E91 - ld a,#04 ;ram 0 - call x1C64 - ld (ix+#10),l - ld (ix+#11),h - ld a,#05 ;ram 7 - call x1C64 - pop de - pop bc - ld hl,x5B98 - ld a,b - or c - jr z,x1EB7 - ldir -x1EB7 ex de,hl - pop bc - jp x1E37 -x1EBC ld a,#04 ;ram 0 - call x1C64 - inc (ix+#12) - ld a,(ix+#12) - ld hl,#C000 - call x1C64 - jr x1E97 - -;АДРЕС: #1ECF !!!NOT USED!!! запись данных в RAM 7 -;вх: hl - откуда -; de - куда -; bc - сколько -x1ECF push af - ld a,(x5B5C) - push af - push hl - push de - push bc - ld ix,x5B67+3 ;x5B6A - ld (ix+#10),e - ld (ix+#11),d - ld (ix+#12),#04 - call x1DAC ;сохранение данных на RAM диске -x1EE8 ld a,#05 ;ram 0 - call x1C64 - pop bc - pop de - pop hl - add hl,bc - ex de,hl - add hl,bc - ex de,hl - pop af - ld bc,#7FFD - di - out (c),a - ld (x5B5C),a - ei - ld bc,#0000 - pop af - ret - -;АДРЕС: #1F04 !!!NOT USED!!! чтение данных из RAM 7 -x1F04 push af - ld a,(x5B5C) - push af - push hl - push de - push bc - ld ix,x5B67+3 ;x5B6A - ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),#04 - ex de,hl - call x1E37 ;загрузка данных с RAM диска - jr x1EE8 - -;АДРЕС: #1F20 установка другого стэка и ram 0 -x1F20 ex af,af' - ld a,#00 - di - call x1F3A ;включение страницы ram 0 - pop af - ld (x5B58),hl - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ei - ld hl,(x5B58) - push af - ex af,af' - ret - -;АДРЕС: #1F3A включение физической страницы ram -;вх: a - номер страницы -x1F3A push bc - ld bc,#7FFD - out (c),a - ld (x5B5C),a - pop bc - ret - -;АДРЕС: #1F45 установка другого стэка и ram 7 -;вх: (x5B81) - адрес другого стэка -x1F45 ex af,af' - di - pop af - ld (x5B58),hl - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld hl,(x5B58) - push af - ld a,#07 - call x1F3A ;включение страницы ram - ei - ex af,af' - ret - -;АДРЕС: #1F5F удаление файла из RAM диска -x1F5F call x1D12 ;поиск имени файла в каталоге - jr nz,x1F68 ;файл найден - call x05AC - db #23 ;h File does not exist -x1F68 ld l,(ix+#0D) - ld h,(ix+#0E) - ld a,(ix+#0F) - call x1CF3 ;коррекция свободного места на RAM диске - push iy - ld iy,(x5B83) - ld bc,-20 - add ix,bc - ld l,(iy+#0A) - ld h,(iy+#0B) - ld a,(iy+#0C) - pop iy - ld e,(ix+#0A) - ld d,(ix+#0B) - ld b,(ix+#0C) - or a - sbc hl,de - sbc a,b - rl h - rl h - sra a - rr h - sra a - rr h - ld bc,#0014 - add ix,bc - ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),a - ld bc,-20 - add ix,bc - ld l,(ix+#0A) - ld h,(ix+#0B) - ld d,(ix+#0C) - ld bc,#0014 - add ix,bc - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld bc,#7FFD - ld a,#07 ;rom 0, ram 7 - di - out (c),a - exx - ld l,(ix+#0A) - ld h,(ix+#0B) - ld d,(ix+#0C) - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld bc,#7FFD - exx -x1FEA ld a,#07 ;rom 0, ram 7 - di - out (c),a - ld a,(ix+#10) - sub #01 - ld (ix+#10),a - jr nc,x200D - ld a,(ix+#11) - sub #01 - ld (ix+#11),a - jr nc,x200D - ld a,(ix+#12) - sub #01 - ld (ix+#12),a - jr c,x203E -x200D out (c),e - ld a,(hl) - inc l - jr nz,x2024 - inc h - jr nz,x2024 - ex af,af' - inc d - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld hl,#C000 - ex af,af' -x2024 exx - di - out (c),e - ld (hl),a - inc l - jr nz,x203B - inc h - jr nz,x203B - inc d - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld hl,#C000 -x203B exx - jr x1FEA -x203E ld a,#04 - call x1C64 - ld a,#00 - ld hl,#0014 - call x1CF3 ;коррекция свободного места на RAM диске - ld e,(ix+#0D) - ld d,(ix+#0E) - ld c,(ix+#0F) - ld a,d - rlca - rl c - rlca - rl c - ld a,d - and #3F - ld d,a - push ix -x2061 push de - ld de,-20 - add ix,de - pop de - ld l,(ix+#0A) - ld h,(ix+#0B) - ld a,(ix+#0C) - or a - sbc hl,de - sub c - bit 6,h - jr nz,x207C - set 6,h - dec a -x207C ld (ix+#0A),l - ld (ix+#0B),h - ld (ix+#0C),a - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - or a - sbc hl,de - sub c - bit 6,h - jr nz,x2099 - set 6,h - dec a -x2099 ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),a - push ix - pop hl - push de - ld de,(x5B83) - or a - sbc hl,de - pop de - jr nz,x2061 - ld de,(x5B83) - pop hl - push hl - or a - sbc hl,de - ld b,h - ld c,l - pop hl - push hl - ld de,#0014 - add hl,de - ex de,hl - pop hl - dec de - dec hl - lddr - ld hl,(x5B83) - ld de,#0014 - add hl,de - ld (x5B83),hl - ret - -;АДРЕС: #20D2 печать каталога RAM диска -x20D2 ld a,#04 ;ram 7 - call x1C64 - ld hl,x2121 -x20DA ld bc,x212B - ld ix,#EBEC -x20E1 call x05D6 ;проверка нажатия break и печать сообщения - push ix - ex (sp),hl - ld de,(x5B83) - or a - sbc hl,de - pop hl - jr z,x2111 - ld d,h - ld e,l - push hl - push bc - call x1C8A ;сравнение имени файла с заданным - pop bc - pop hl - jr nc,x210A - ld d,b - ld e,c - push hl - push bc - call x1C8A ;сравнение имени файла с заданным - pop bc - pop hl - jr c,x210A - push ix - pop bc -x210A ld de,-20 - add ix,de - jr x20E1 -x2111 push hl - ld hl,x212B - or a - sbc hl,bc - pop hl - ret z - ld h,b - ld l,c - call x2135 ;печать одной записи каталога RAM диска - jr x20DA -x2121 ds #0A,#00 -x212B ds #0A,#FF - -;АДРЕС: #2135 печать одной записи каталога RAM диска -x2135 push hl - push bc - pop hl - ld de,x5B67 - ld bc,#000A - ldir - ld a,#05 - call x1C64 ;rom 0 - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld hl,x5B67 - ld b,#0A -x2152 ld a,(hl) - push hl - push bc - rst #28 - dw Rom1.x0010 ;печать символа из A - pop bc - pop hl - inc hl - djnz x2152 - ld a,#0D - rst #28 - dw Rom1.x0010 ;перевод строки - rst #28 - dw Rom1.x0D4D ;копиравоние атрибутов - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld a,#04 ;ram 7 - call x1C64 - pop hl - ret - -;АДРЕС: #2174 команда LPRINT -x2174 ld a,#03 - jr x217A - -;АДРЕС: #2178 команда PRINT -x2178 ld a,#02 -x217A rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x2182 - rst #28 - dw Rom1.x1601 ;открыть канал -x2182 rst #28 - dw Rom1.x0D4D ;копиравоние атрибутов - rst #28 - dw Rom1.x1FDF ;PRINT_2 - call x18A1 - ret - -;АДРЕС: #218C команда INPUT -x218C rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x2199 - ld a,#01 - rst #28 - dw Rom1.x1601 ;открыть канал - rst #28 ;!!!ОШИБКА!!! - dw Rom1.x0D6E -x2199 ld (iy+#02),#01 - rst #28 - dw Rom1.x20C1 ;ввод данных по input - call x18A1 - rst #28 - dw Rom1.x20A0 ;ввод с клавиатуры - ret - -;АДРЕС: #21A7 команда COPY -x21A7 jp x08F0 - -;АДРЕС: #21AA команда NEW -x21AA di - jp x019D - -;АДРЕС: #21AE команда CIRCLE -x21AE rst #18 - cp "," - jr nz,x21EB ;ошибка - rst #20 - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x232D ;печать окружности - ret - -;АДРЕС: #21BE команда DRAW -x21BE rst #18 - cp "," - jr z,x21CA - call x18A1 - rst #28 - dw Rom1.x2477 ;печать линии - ret -x21CA rst #20 - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x2394 ;печать линии - ret - -;АДРЕС: #21D5 команда DIM -x21D5 rst #28 - dw Rom1.x28B2 ;LOOK-VARS - jr nz,x21EB - rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr nz,x21E7 - res 6,c - rst #28 - dw Rom1.x2996 ;проверкае синтаксиса выражения, заключенного в скобки - call x18A1 -x21E7 rst #28 - dw Rom1.x2C15 ;D-RUN - ret - -x21EB call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #21EF очистка экрана -x21EF bit 0,(iy+#30) - ret z - rst #28 - dw Rom1.x0DAF ;очистить экран - ret - -;АДРЕС: #21F8 вычисличть числовое выражение -x21F8 ld hl,#FFFE - ld (#5C45),hl ;выполнение оператора в непосредственном режиме - res 7,(iy+#01) ;проверка синтаксиса - call x228E ;поиск начала бейсик команды - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x24FB ;анализ строки - bit 6,(iy+#01) - jr z,x223A ;обработка символьного выражения - rst #18 ;получить символ - cp #0D - jr nz,x223A - set 7,(iy+#01) ;выполнение программы - call x228E ;поиск начала бейсик команды - ld hl,x0321 ;адрес возврата при ошибке - ld (x5B8B),hl - rst #28 - dw Rom1.x24FB ;анализ строки - bit 6,(iy+#01) - jr z,x223A ;обработка символьного выражения - ld de,x5B8D ;адрес последней длины, выводимой при вычислениях - ld hl,(#5C65) ;адрес вершины стэка калькулятора - ld bc,#0005 - or a - sbc hl,bc - ldir - jp x223E -x223A call x05AC ;без возврата - db #19 ;Q Parameter error, n:m -x223E ld a,#0D - call x226F ;обработка нажатой клавиши - ld bc,#0001 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0030 ;резервирование места -x2249 ld (#5C5B),hl ;адрес символа редактируемой строки - push hl - ld hl,(#5C51) ;адрес описателя текущего канала - push hl - ld a,#FF ;канал -1 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1601 ;открыть канал - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x2DE3 ;печать числа с плавающей точкой - pop hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1615 ;установка флагов канала (возврат предыдущего канала) - pop de - ld hl,(#5C5B) ;адрес символа редактируемой строки - and a - sbc hl,de -x2264 ld a,(de) - call x226F ;обработка нажатой клавиши - inc de - dec hl - ld a,h - or l - jr nz,x2264 - ret - -;АДРЕС: #226F обработка нажатой клавиши -;вх: a - код клавиши -x226F push hl - push de - call x1F45 ;установка другого стэка и ram 7 - ld hl,#EC0D - res 3,(hl) - push af - ld a,#02 - rst #28 - dw Rom1.x1601 ;открыть канал #02 - pop af - call x2669 ;обработка нажатия клавиши - ld hl,#EC0D - res 3,(hl) - call x1F20 ;установка другого стэка и ram 0 - pop de - pop hl - ret - -;АДРЕС: #228E поиск начала бейсик команды -x228E ld hl,(#5C59) - dec hl - ld (#5C5D),hl - rst #20 ;получение следующего символа в бейсик программе - ret - -;АДРЕС: #2297 проверка это команда LET? (калькулятор basic 128) -;вых: z - это только команда LET -x2297 call x228E ;поиск начала бейсик команды - cp #F1 ;LET ? - ret nz - ld hl,(#5C5D) -x22A0 ld a,(hl) - inc hl - cp #0D - ret z - cp ":" - jr nz,x22A0 - or a - ret - -;АДРЕС: #22AB проверка это оператор? -x22AB ld b,a - ld hl,x22BD -x22AF ld a,(hl) - inc hl - or a - jr z,x22B9 - cp b - jr nz,x22AF - ld a,b - ret -x22B9 or #FF - ld a,b - ret - -;АДРЕС: #22BD список токенов операторов -x22BD db #2B,#2D,#2A ; '+', '-', '*' - db #2F,#5E,#3D ; '/', '^', '=' - db #3E,#3C,#C7 ; '>', '<', '<=' - db #C8,#C9,#C5 ; '>=', '<>', 'OR' - db #C6 ; 'AND' - db #00 ;маркер конца таблицы - -;АДРЕС: #22CB проверка это токен? -;вых: z - это токен -x22CB cp #A5 - jr c,x22DD - cp #C4 - jr nc,x22DD - cp #AC - jr z,x22DD - cp #AD - jr z,x22DD - cp a - ret -x22DD cp #A5 - ret - -;АДРЕС: #22E0 проверка это число или функция? -x22E0 ld b,a - or #20 - cp "a" - jr c,x22ED ;это не буква - cp "z"+1 - jr nc,x22ED ;это не буква - cp a - ret -x22ED ld a,b - cp "." - ret z - call x230A ;проверка это цифра или нет - jr nz,x2307 ;не цифра -x22F6 rst #20 ;читаем следующий симввол - call x230A ;проверка это цифра или нет - jr z,x22F6 ;это цифра - cp "." - ret z - cp "E" - ret z - cp "e" - ret z - jr x22AB ;проверка это оператор? -x2307 or #FF - ret - -;АДРЕС: #230A проверка это цифра или нет -;вых: z - это цифра -x230A cp "0" - jr c,x2314 ;это не цифра - cp "9"+1 - jr nc,x2314 ;это не цифра - cp a - ret -x2314 cp "0" - ret - -;АДРЕС: #2317 команда PLAY -x2317 ld b,#00 - rst #18 -x231A push bc - rst #28 - dw Rom1.x1C8C ;параметр - строка - pop bc - inc b - cp "," - jr nz,x2327 - rst #20 - jr x231A -x2327 ld a,b - cp #09 - jr c,x2330 - call x05AC - db #2B ;!!!ОШИБКА!!! -x2330 call x18A1 - jp x0985 - -;АДРЕС: #2336 !!!NOT USED!!! возврат в редактор -x2336 ld hl,x5BFF - ld (x5B81),hl - call x1F45 - jp x25CB - -;АДРЕС: #2342 !!!NOT USED!!! bc=hl-de -x2342 and a - sbc hl,de - ld b,h - ld c,l - add hl,de - ex de,hl - ret - -;АДРЕС: #234A !!!NOT USED!!! зарезервировать память на 1 байт -x234A ld bc,#0001 - push hl - push de - call x2358 - pop de - pop hl - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - ret - -;АДРЕС: #2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc -x2358 ld hl,(#5C65) - add hl,bc - jr c,x2368 - ex de,hl - ld hl,#0082 - add hl,de - jr c,x2368 - sbc hl,sp - ret c -x2368 ld (iy+#00),#03 ;4 Out of Memory - jp x0321 - -;АДРЕС: #236F !!!NOT USED!!! hl=a*#20 -x236F add a,a - add a,a - -;АДРЕС: #2371 !!!NOT USED!!! hl=a*#08 -x2371 ld l,a - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - ret - -;АДРЕС: #2378 !!!NOT USED!!! расчет свободного места -x2378 ld hl,#0000 - add hl,sp - ld de,(#5C65) - or a - sbc hl,de - ret - -;АДРЕС: #2384 !!!NOT USED!!! печать на экране строки из буфера -x2384 res 0,(iy-#39) - call x236F - push hl - ld de,(#FF24) - add hl,de - ld d,h - ld e,l - ex (sp),hl - push hl - push de - ld de,#5800 - add hl,de - ex de,hl - pop hl - ld bc,#0020 - ld a,(#5C8F) - call x249B - pop hl - ld a,h - ld h,#00 - add a,a - add a,a - add a,a - add a,#40 - ld d,a - ld e,h - add hl,de - ex de,hl - pop hl - ld b,#20 - jp x23E1 - -;АДРЕС: #23B8 !!!NOT USED!!! печать в буфере #FF -x23B8 ld d,#FF - call x236F - ld a,d - ld de,(#FF24) - add hl,de - ld e,l - ld d,h - inc de - ld (hl),a - dec bc - ldir - ret - -;АДРЕС: #23CB !!!NOT USED!!! копирование буфера на экран -x23CB call x2488 - ld de,#4000 - ld hl,(#FF24) - ld b,e - call x23E1 - ld d,#48 - call x23E1 - ld d,#50 - ld b,#C0 - -;АДРЕС: #23E1 !!!NOT USED!!! печать символов из буфера на экране -x23E1 ld a,(hl) - push hl - push de - cp #FE - jr c,x23EC - sub #FE - jr x2422 -x23EC cp #20 - jr nc,x23F7 - ld hl,x2527 - and a - ex af,af' - jr x242B -x23F7 cp #80 - jr nc,x2409 - call x2371 - ld de,(#5C36) - add hl,de - pop de - call #FF28 - jr x2450 -x2409 cp #90 - jr nc,x2411 - sub #7F - jr x2422 -x2411 sub #90 - call x2371 - pop de - call x1F20 - push de - ld de,(#5C7B) - scf - jr x2429 -x2422 ld de,x252F - call x2371 - and a -x2429 ex af,af' - add hl,de -x242B pop de -x242C ld c,d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - ld d,c - ex af,af' - call c,x1F45 -x2450 pop hl - inc hl - inc de - djnz x23E1 - ret - -;АДРЕС: #2456 !!!NOT USED!!! переключение страниц rom 0/1 -x2456 push bc - di - ld bc,#7FFD - ld a,(x5B5C) - xor #10 - out (c),a - ei - ex af,af' - -;АДРЕС: #2464 !!!NOT USED!!! переключение страниц rom 0/1 -x2464 ex af,af' - di - ld c,#FD - xor #10 - out (c),a - ei - pop bc - ret - -;АДРЕС: #246F !!!NOT USED!!! копирование п/п в ram 7 -x246F ld hl,x2456 - ld de,#FF28 - ld bc,#000E - ldir - push hl - ld hl,x242C - ld c,#20 - ldir - pop hl - ld c,#0B - ldir - ret - -;АДРЕС: #2488 !!!NOT USED!!! установка атрибутов из буфера экрана -x2488 res 0,(iy-#39) - ld de,#5800 - ld bc,#02C0 - ld hl,(#FF24) - ld a,(#5C8D) - ld (#5C8F),a - -;АДРЕС: #249B !!!NOT USED!!! установка атрибутов из буфера экрана -x249B ex af,af' -x249C push bc - ld a,(hl) - cp #FF - jr nz,x24AA - ld a,(#5C8D) - ld (de),a - inc hl - inc de - jr x2507 -x24AA ex af,af' - ld (de),a - inc de - ex af,af' - inc hl - cp #15 - jr nc,x2507 - cp #10 - jr c,x2507 - dec hl - jr nz,x24C2 - inc hl - ld a,(hl) - ld c,a - ex af,af' - and #F8 - jr x2505 -x24C2 cp #11 - jr nz,x24D1 - inc hl - ld a,(hl) - add a,a - add a,a - add a,a - ld c,a - ex af,af' - and #C7 - jr x2505 -x24D1 cp #12 - jr nz,x24DE - inc hl - ld a,(hl) - rrca - ld c,a - ex af,af' - and #7F - jr x2505 -x24DE cp #13 - jr nz,x24EC - inc hl - ld a,(hl) - rrca - rrca - ld c,a - ex af,af' - and #BF - jr x2505 -x24EC cp #14 - inc hl - jr nz,x2507 - ld c,(hl) - ld a,(#5C01) - xor c - rra - jr nc,x2507 - ld a,#01 - xor (iy-#39) - ld (#5C01),a - ex af,af' - call x2513 -x2505 or c - ex af,af' -x2507 pop bc - dec bc - ld a,b - or c - jp nz,x249C - ex af,af' - ld (#5C8F),a - ret - -;АДРЕС: #2513 !!!NOT USED!!! поменять местами ink и paper -x2513 ld b,a - and #C0 - ld c,a - ld a,b - add a,a - add a,a - add a,a - and #38 - or c - ld c,a - ld a,b - rra - rra - rra - and #07 - or c - ret - -x2527 db %00000000 ; - db %00111100 ; XXXX - db %01100010 ; XX X - db %01100000 ; XX - db %01101110 ; XX XXX - db %01100010 ; XX X - db %00111110 ; XXXX - db %00000000 ; - -x252F db %00000000 ; - db %01101100 ; XX XX - db %00010000 ; X - db %01010100 ; X X X - db %10111010 ; X XXX X - db %00111000 ; XXX - db %01010100 ; X X X - db %10000010 ; X X - -;АДРЕС: #2537 таблица адресов обработки нажатий в режиме редактирования -x2537 db #15 ;размер таблицы - db #0B: dw #2A94 ;перемещение курсора вверх в поле редактирования - db #0A: dw #2AB5 ;перемещение курсора вниз в поле редактирования - db #08: dw #2AD7 ;перемещение курсора влево в поле редактирования - db #09: dw #2AE3 ;перемещение курсора вправо в поле редактирования - db #AD: dw #2A4F ;ext+P перемещение курсора вверх на 10 строк в поле редактирования - db #AC: dw #2A25 ;ss+I перемещение курсора вниз на 10 строк в поле редактирования - db #AF: dw #29D4 ;ext+I переход к началу текущего слова - db #AE: dw #29E1 ;ext+shift+J переход к началу следующего слова - db #A6: dw #2983 ;ext+N/Graph+W переход к первой строке бейсик программы - db #A5: dw #29AB ;ext+T/Graph+V переход к последней строке бейсик программы - db #A8: dw #2A87 ;ext+ss+2/Graph+Y переход к началу строки редактирования - db #A7: dw #2A7A ;ext+M/graph+X перемещение курсора в конец строки в поле редактирования - db #AA: dw #291B ;ext+ss+K удаление символа справа от курсора - db #0C: dw #292B ;delete удаление символа слева от курсора - db #B3: dw #3017 ;ext+W удаление символов от курсора до начала следующего слова - db #B4: dw #2FBC ;ext+E удаление символов от курсора до начала текущего слова - db #B0: dw #3072 ;ext+J удаление символов до конца строки - db #B1: dw #303E ;ext+K удаление символов до наала строки - db #0D: dw #2944 ;enter ввод строки - db #A9: dw #269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху - db #07: dw #2704 ;cs+1 вызов меню - -;АДРЕС: #2577 таблица адресов обработки нажатий в основном меню basic 128k -x2577 db #04 ;размер таблицы - db #0B: dw x272E ;вверх - db #0A: dw x2731 ;вниз - db #07: dw x2717 ;cs+1 - db #0D: dw x2717 ;enter - -;АДРЕС: #2584 подготовка переменных -x2584 call x28BE ;инициализация курсора для верхнего окна - ld hl,#0000 - ld (#FC9A),hl - ld a,#82 - ld (#EC0D),a - ld hl,#0000 - ld (#5C49),hl ;Номер строки бейсик-программы, отмеченной курсором - call x35BC ;установка параметров отступа - call x365E ;установка переменных для ввода символа - ret - -;АДРЕС: #259F печать главного меню basic 128 и выбор опции -x259F ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#02 ;канал #02 (основной экран) - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1601 ;открыть канал -x25AD ld hl,x2744 ;п/п обработки главного меню - ld (#F6EA),hl - ld hl,x2754 ;текст основного меню basic 128k - ld (#F6EC),hl - push hl - ld hl,#EC0D - set 1,(hl) ;на отображено меню - res 4,(hl) ;возврат в главное меню - dec hl - ld (hl),#00 ;номер опции меню - pop hl - call x36A8 ;печать главного меню basic 128k - jp x2653 ;основной цикл в basic128/калькулятор - -;АДРЕС: #25CB возврат в редактор/калькулятор/меню после обработки ошибки -x25CB ld ix,#FD6C - ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#02 - rst #28 - dw Rom1.x1601 ;открыть канал - call x3668 ;установка переменных для ввода символа - ld hl,#5C3B -x25E3 bit 5,(hl) - jr z,x25E3 - ld hl,#EC0D - res 3,(hl) - bit 6,(hl) - jr nz,x2604 - ld a,(#EC0E) - cp #04 - jr z,x2601 ;это калькулятор - cp #00 - jp nz,x28C7 - call x3848 ;печать информационной строки 128 BASIC - jr x2604 -x2601 call x384D ;печать информационной строки Calculator -x2604 call x30D6 ;установка буфера редактирования внизу экрана - call x3222 ;установка буфера редактирования в верху экрана - ld a,(#EC0E) - cp #04 - jr z,x2653 ;калькулятор - ld hl,(#5C49) - ld a,h - or l - jr nz,x262D - ld hl,(#5C53) - ld bc,(#5C4B) - and a - sbc hl,bc - jr nz,x262A - ld hl,#0000 - ld (#EC08),hl -x262A ld hl,(#EC08) -x262D call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld hl,#EC0D - bit 5,(hl) - jr nz,x2653 - ld hl,#0000 - ld (#EC06),hl - call x152F ;печать бейсик программы от текущей строки - call x29F2 ;напечатать курсор - call x2944 ;enter ввод строки - -;АДРЕС: #2653 основной цикл в basic128/калькулятор -x2653 ld sp,#5BFF - call x3668 ;установка переменных для ввода символа - call x367F ;ожидание нажатия клавиши - push af ;код клавиши - ld a,(#5C39) ;звук нажатия на клавишу - call x26EC ;звуковой сигнал - pop af - call x2669 ;обработка нажатия клавиши - jr x2653 ;основной цикл в basic128/калькулятор - -;АДРЕС: #2669 обработка нажатия клавиши -;вх: a - код клавиши -;вых: z - отображено меню -x2669 ld hl,#EC0D - bit 1,(hl) - push af - ld hl,x2577 ;основное меню basic 128k - jr nz,x2677 ;отображено меню - ld hl,x2537 ;клавиши для режима редактирования -x2677 call x3FCE ;обработка нажатой управляющей клавиши в меню - jr nz,x2681 ;не найден обработчик клавиши - call nc,x26E7 ;звуковой сигнал - pop af - ret -;не найден обработчик клавиши -x2681 pop af - jr z,x2689 ;это режим редактирования - xor a ;курсор K,L или C - ld (#5C41),a - ret -x2689 ld hl,#EC0D - bit 0,(hl) - jr z,x2694 ;буфер редактирования не переполнен - call x26E7 ;звуковой сигнал - ret ;!!!тут можно сократить!!! -x2694 cp #A3 - jr nc,x2653 ;!!!ОШИБКА!!! должно быть ret nc - jp x28F1 ;обрабока нажатия символьной клавиши - -;АДРЕС: #269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху -x269B ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x1630 ;очистка окна редактирования - ld hl,#EC0D - res 3,(hl) - ld a,(hl) - xor #40 - ld (hl),a - and #40 - jr z,x26B6 - call x26BB ;выбор нижнего экрана - jr x26B9 -x26B6 call x26CE ;выбор верхнего экрана -x26B9 scf - ret - -;АДРЕС: #26BB выбор нижнего экрана -x26BB call x3881 ;очистка двух нижних строк экрана - ld hl,#EC0D - set 6,(hl) - call x2E2D ;сброс нижнего окна редактирования - call x3A88 ;установка настроек курсора для нижнего окна - call x28DF ;инициализация настроек нижнего окна - jr x26D9 - -;АДРЕС: #26CE выбор верхнего экрана -x26CE ld hl,#EC0D - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - call x3848 ;печать информационной строки 128 BASIC -x26D9 ld hl,(#FC9A) - ld a,h - or l - call nz,x334A ;поиск адреса строки бейсик программы - call x152F ;печать бейсик программы от текущей строки - jp x29F2 ;напечатать курсор - -;АДРЕС: #26E7 звуковой сигнал -x26E7 ld a,(#5C38) ;заполнение буфера редактора - srl a - -;АДРЕС: #26EC звуковой сигнал -x26EC push ix - ld d,#00 - ld e,a - ld hl,#0C80 -x26F4 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x03B5 ;beep - pop ix - ret - -;АДРЕС: #26FA звуковой сигнал -x26FA push ix - ld de,#0030 - ld hl,#0300 - jr x26F4 - -;АДРЕС: #2704 cs+1 вызов меню -x2704 call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#EC0D - set 1,(hl) - dec hl - ld (hl),#00 - ld hl,(#F6EC) - call x36A8 ;печать меню basic 128k - scf - ret - -;АДРЕС: #2717 нажатие cs+1/enter в главном меню -x2717 ld hl,#EC0D - res 1,(hl) - dec hl - ld a,(hl) - ld hl,(#F6EA) - push hl - push af - call x373E ;восстановление окна экрана 14*12 из буфера - pop af - pop hl - call x3FCE ;обработка нажатой управляющей клавиши в меню - jp x29F2 - -;АДРЕС: #272E курсор вверх в главном меню -x272E scf - jr x2732 - -;АДРЕС: #2731 курсор вниз в главном меню -x2731 and a -x2732 ld hl,#EC0C - ld a,(hl) - push hl - ld hl,(#F6EC) ;адрес списка опций меню - call c,x37A7 ;вверх - call nc,x37B6 ;вниз - pop hl - ld (hl),a -x2742 scf - ret - -;АДРЕС: #2744 адреса процедур обработки опций основного меню basic 128k -x2744 db #05 ;кол-во опций - db #00: dw x2816 ;выбор опции 128 TR-DOS - db #01: dw x286C ;выбор опции 128 BASIC - db #02: dw x2885 ;выбор опции калькулятор - db #03: dw x1B47 ;выбор опции 48 BASIC - db #04: dw x2831 ;выбор опции 48 TR-DOS (вход в Tr-Dos 48k) - -;АДРЕС: #2754 текст основного меню basic 128k -x2754 db #06 ;кол-во строк - db "128 ",#FF -x275E dc "128 TR-DOS" -x2768 dc "128 BASIC" -x2771 dc "Calculator" - dc "48 BASIC" -x2783 dc "48 TR-DOS" - dc " " ;признак окончания - -;АДРЕС: #278D !!!NOT USED!!! -x278D db #20,#80,#A0 - -;АДРЕС: #2790 адреса процедур обработки опций меню в редакторе basic 128 -x2790 db #05 ;кол-во опций - db #00: dw x2742 ;возврат к редактированию - db #01: dw x2851 ;перенумерация строк программы - db #02: dw x2811 ;смена области редактирования низ/верх - db #03: dw x2862 ;печать программы на принтере - db #04: dw x281C ;выход из редактора - -;АДРЕС: #27A0 текст меню в редакторе basic 128 -x27A0 db #06 - db "Options ",#FF - dc "128 BASIC" - dc "Renumber" - dc "Screen" - dc "Print" - dc "Exit" - dc " " ;признак окончания - -;АДРЕС: #27CB адреса процедур обработки опций меню в калькуляторе -x27CB db #02 - db #00: dw x2742 ;возврат к редактированию - db #01: dw x281C ;выход в главное меню - -;АДРЕС: #27D2 текст меню в калькуляторе -x27D2 db #03 - db "Options ",#FF - dc "Calculator" - dc "Exit" - dc " " ;признак окончания - -;АДРЕС: #27EB !!!NOT USED!!! -x27EB db #16,#01,#00 ;AT 1,0 - db #10,#00 ;ink 0 - db #11,#07 ;paper 7 - db #13,#00 ;bright 0 - dc "To cancel - press BREAK twice" - -;АДРЕС: #2811 смена области редактирования низ/верх -x2811 call x269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху - jr x2874 ; - -;АДРЕС: #2816 выбор опции 128 TR-DOS -x2816 call x3857 ;печать информационной строки 128 TR-DOS - call x3BE9 ;запуск команды randomize 15619: rem: load "boot" - -;АДРЕС: #281С выход из редактора/калькулятора в главное меню -x281C ld hl,#EC0D - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - ld b,#00 - ld d,#17 - call x3B5E ;очистка строк экрана - call x1F20 ;установка другого стэка и ram 0 - jp x259F ;печать главного меню basic 128 и выбор опции - -;АДРЕС: #2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) -x2831 call x3852 ;печать информационной строки 48 TR-DOS - ld hl,#0000 - push hl - ld hl,#3D30 - jp x1B4A ;включение basic48, блокировка #7FFD и переход на адрес в hl - -;АДРЕС: #283E !!!NOT USED!!! -x283E dec b - res 0,(hl) - set 6,(hl) - ld a,#07 - ld (#EC0E),a - ld bc,#0000 - call x372B - jp x1AF1 - -;АДРЕС: #2851 перенумерация строк программы -x2851 call x3888 ;перенумерация строк программы - call nc,x26E7 ;звуковой сигнал - ld hl,#0000 - ld (#5C49),hl - ld (#EC08),hl - jr x2865 - -;АДРЕС: #2862 печать программы на принтере -x2862 call x1B14 ;пункт меню редактора Print (печать на принтер) -x2865 ld hl,#EC0D - bit 6,(hl) - jr nz,x2874 - -;АДРЕС: #286C выбор опции 128 BASIC -x286C ld hl,#5C3C - res 0,(hl) - call x3848 ;печать информационной строки 128 BASIC -x2874 ld hl,#EC0D - res 5,(hl) - res 4,(hl) - ld a,#00 - ld hl,x2790 - ld de,x27A0 - jr x28B1 - -;АДРЕС: #2885 выбор опции калькулятор -x2885 ld hl,#EC0D - set 5,(hl) - set 4,(hl) - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - call x384D ;печать информационной строки Calculator - ld a,#04 - ld (#EC0E),a - ld hl,#0000 - ld (#5C49),hl - call x152F ;печать бейсик программы от текущей строки - ld bc,#0000 - ld a,b - call x29F8 ;напечатать курсор - ld a,#04 - ld hl,x27CB - ld de,x27D2 -x28B1 ld (#EC0E),a - ld (#F6EA),hl - ld (#F6EC),de - jp x2604 - -;АДРЕС: #28BE инициализация курсора для верхнего окна -x28BE call x2E1F ;сброс верхнего окна редактирования - call x3A7F ;установка настроек курсора для верхнего окна - jp x28E8 ;инициализация настроек верхнего окна - -;АДРЕС: #28C7 возврат в главное меню -x28C7 ld b,#00 - ld d,#17 - call x3B5E ;очистка строк экрана - jp x25AD - -;настройки верхнего окна -x28D1 db #06 - db #00,#00,#00,#04,#10,#14 - -;настройки нижнего окна -x28D8 db #06 - db #00,#00,#00,#00,#01,#01 - -;АДРЕС: #28DF инициализация настроек нижнего окна -x28DF ld hl,x28D8 - ld de,#F6EE - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #28E8 инициализация настроек верхнего окна -x28E8 ld hl,x28D1 - ld de,#F6EE - jp x3FBA - -;АДРЕС: #28F1 обработка нажатия символьной клавиши -x28F1 ld hl,#EC0D - or a ;!!!ЛИШНЕЕ!!! - or a ;!!!ЛИШНЕЕ!!! - bit 0,(hl) - jp nz,x29F2 - res 7,(hl) - set 3,(hl) - push hl - push af - call x29EC ;удаление курсора, восстановление атрибутов - pop af - push af - call x2E81 ;вставка символа в буфер редактирования - pop af - ld a,b - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - pop hl - set 7,(hl) - jp nc,x29F2 - ld a,b - jp c,x29F8 - jp x29F2 - -;АДРЕС: #291B ext+ss+K удаление символа справа от курсора -x291B ld hl,#EC0D - set 3,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - call x2F12 ;удаление символа в строке в буфере редактирования - scf - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #292B delete удаление символа слева от курсора -x292B ld hl,#EC0D - res 0,(hl) - set 3,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - ccf - jp c,x29F2 ;напечатать курсор - call x2F12 ;удаление символа в строке в буфере редактирования - scf - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2944 enter ввод строки -x2944 call x29EC ;удаление курсора, восстановление атрибутов - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - push bc - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x295E - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #09 - jr z,x297A -x295E ld a,(#EC0D) - bit 3,a - jr z,x296A - call x2C8E ;вставить строку бейсик программы - jr nc,x297F -x296A call x2C4C ;поиск конца строки в буфере редактирования - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - call x2ECE ;вставка пустой строки в буфер редактирования - ld b,#00 - pop af - scf - jp x29F8 ;напечатать курсор -x297A pop af - scf - jp x29F2 ;напечатать курсор -x297F pop af - jp x29F2 ;напечатать курсор - -;АДРЕС: #2983 ext+N/Graph+W переход к первой строке бейсик программы -x2983 ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#0000 - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld a,#0F - call x3A96 ;сохранить атрибуты курсора - call x152F ;печать бейсик программы от текущей строки - scf - jp x29F2 ;напечатать курсор - -;АДРЕС: #29AB ext+T/Graph+V переход к последней строке бейсик программы -x29AB ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#270F ;9999 - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - ex de,hl - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld a,#0F - call x3A96 ;сохранить атрибуты курсора - call x152F ;печать бейсик программы от текущей строки - scf - jp x29F2 ;напечатать курсор - -;АДРЕС: #29D4 ext+I переход к началу текущего слова -x29D4 call x29EC ;удаление курсора, восстановление атрибутов - call x2BEA ;поиск начала слова слева от курсора - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #29E1 ext+shift+J переход к началу следующего слова -x29E1 call x29EC ;удаление курсора, восстановление атрибутов - call x2C09 ;поиск начала слова справа от курсора - jr nc,x29F2 ;напечатать курсор - ld a,b - jr x29F8 ;напечатать курсор - -;АДРЕС: #29EC удаление курсора, восстановление атрибутов -x29EC call x2A07 ;получение позиции курсора - jp x364F ;восстановление атрибутов под курсором - -;АДРЕС: #29F2 напечатать курсор -x29F2 call x2A07 ;получение позиции курсора - jp x3640 ;печать атрибутов курсора - -;АДРЕС: #29F8 напечатать курсор -x29F8 call x2A11 ;сохранить позицию курсора - push af - push bc - ld a,#0F ;paper 1, ink 7 - call x3A96 ;сохранить атрибуты курсора - pop bc - pop af - jp x3640 ;печать атрибутов курсора - -;АДРЕС: #2A07 получение позиции курсора -;вых: c - номер строки -; b - номер столбца -; a - предпочтительный номер столбца -x2A07 ld hl,#F6EE - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld a,(hl) - inc hl - ret - -;АДРЕС: #2A11 сохранить позицию курсора -x2A11 ld hl,#F6EE - ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),a - ret - -;АДРЕС: #2A1A получение текущего символа в буфере редактирования -x2A1A push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld h,#00 - ld l,b - add hl,de - ld a,(hl) - pop hl - ret - -;АДРЕС: #2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования -x2A25 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - ld d,#0A -x2A2B push de - call x2B30 ;вставить строку бейсик программы - pop de - jr nc,x29F2 ;напечатать курсор - ld a,e - call x2A11 ;сохранить позицию курсора - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - jr nc,x2A42 - dec d - jr nz,x2A2B - ld a,e - jr c,x29F8 ;напечатать курсор -x2A42 push de - call x2B0B ;вставить строку бейсик программы - pop de - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - ld a,e - or a - jr x29F8 ;напечатать курсор - -;АДРЕС: #2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования -x2A4F call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - ld d,#0A -x2A55 push de - call x2B0B ;вставить строку бейсик программы - pop de - jr nc,x29F2 ;напечатать курсор - ld a,e - call x2A11 ;сохранить позицию курсора - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - jr nc,x2A6D - dec d - jr nz,x2A55 - ld a,e - jp c,x29F8 ;напечатать курсор -x2A6D push af - call x2B30 ;вставить строку бейсик программы - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования -x2A7A call x29EC ;удаление курсора, восстановление атрибутов - call x2C4C ;поиск конца строки в буфере редактирования - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A87 ext+ss+2/Graph+Y переход к началу строки редактирования -x2A87 call x29EC ;удаление курсора, восстановление атрибутов - call x2C31 ;поиск начала строки редактирования в буфере - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A94 перемещение курсора вверх в поле редактирования -x2A94 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - push de - call x2B0B ;вставить строку бейсик программы - pop de - jp nc,x29F2 ;напечатать курсор - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - ld a,e - jp c,x29F8 ;напечатать курсор - push af - call x2B30 ;вставить строку бейсик программы - ld b,#00 - call x2AF9 ;найти в строке ближайшую редактируемую позицию - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AB5 перемещение курсора вниз в поле редактирования -x2AB5 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - push de - call x2B30 ;вставить строку бейсик программы - pop de - jp nc,x29F2 ;напечатать курсор - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - ld a,e - jp c,x29F8 ;напечатать курсор - push de - call x2B0B ;вставить строку бейсик программы - pop de - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - ld a,e - or a - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AD7 перемещение курсора влево в поле редактирования -x2AD7 call x29EC ;удаление курсора, восстановление атрибутов - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jp c,x29F8 ;напечатать курсор - jp x29F2 ;напечатать курсор - -;АДРЕС: #2AE3 перемещение курсора вправо в поле редактирования -x2AE3 call x29EC ;удаление курсора, восстановление атрибутов - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jp c,x29F8 ;напечатать курсор - push af - call x2B0B ;вставить строку бейсик программы - ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AF9 найти в строке ближайшую редактируемую позицию -x2AF9 push de - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - call nc,x2BDF ;поиск в строке влево от курсора редактируемого символа - pop de - ret - -;АДРЕС: #2B02 найти в строке ближайшую редактируемую позицию -x2B02 push de - call x2BDF ;поиск в строке влево от курсора редактируемого символа - call nc,x2BD4 ;поиск редактируемого символа в строке справа от курсора - pop de - ret - -;АДРЕС: #2B0B вставить строку бейсик программы, если требуется сдвинуть строки -; в буфере вниз и обновить экран -x2B0B call x2C7C ;вставить строку в бейсик программу, если были изменения - jr nc,x2B2F - push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - call nc,x2F80 ;сдивг строк вверх в буфере при удалении строки - pop bc - ld hl,#F6F1 - ld a,(hl) - cp c - jr c,x2B2D - push bc - call x166F ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана - pop bc - ret c - ld a,c - or a - ret z -x2B2D dec c - scf -x2B2F ret - -;АДРЕС: #2B30 вставить строку бейсик программы, если требуется сдвинуть строки -; в буфере вверх и обновить экран -x2B30 push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x2B3F ;!!!можно оптимизировать - jp x2F80 -x2B3F call x2C68 ;вставить строку бейсик программы, если были изменения - jr nc,x2B5A - ld hl,#F6F1 - inc hl - ld a,c - cp (hl) - jr c,x2B58 - push bc - push hl - call x1639 ;сдвиг всех строк в буфере редактирования верх и обновление экрана - pop hl - pop bc - ret c - inc hl - ld a,(hl) - cp c - ret z -x2B58 inc c - scf -x2B5A ret - -;АДРЕС: #2B5B поиск редактируемой позиции слева от курсора во всем буфере -x2B5B ld d,a - dec b - jp m,x2B66 - ld e,b - call x2BDF ;поиск в строке влево от курсора редактируемого символа - ld a,e - ret c -x2B66 push de - call x2B0B ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран - pop de - ld a,e - ret nc - ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа - ld a,b - ret c - ld a,d - ld b,#00 - ret - -;АДРЕС: #2B78 поиск редактируемой позиции справа от курсора во всем буфере -;вх: b - номер столбца -; c - номер строки -;вых: cy=1 справа есть символ -; b - номер столбца с символом -; a - новый номер столбца -; hl - адрес ноовго редактируемого символа -x2B78 ld d,a - inc b - ld a,#1F - cp b - jr c,x2B85 - ld e,b - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - ld a,e - ret c -;переход к следующей строке -x2B85 dec b - push bc - push hl - ld hl,#EC0D - bit 7,(hl) - jr nz,x2BC0 ;клавиша не нажата -;нажата клавиша. вставим новую строку - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - ld a,(hl) - bit 1,a - jr nz,x2BC0 - set 1,(hl) - res 3,(hl) - ld hl,#0023 - add hl,de - ex de,hl - pop hl - pop bc - push af - call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран - pop af - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0023 - add hl,de - ex de,hl - res 0,a - set 3,a - call x2ED3 ;вставка пустой строки в буфер редактирования - call x35F4 ;создание отступа в строке в буфере редактирования - ld a,b - scf - ret -x2BC0 pop hl - pop bc - push de - call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран - pop de - ld a,b - ret nc - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - ld a,b - ret c - ld a,e - ld b,#00 - ret - -;АДРЕС: #2BD4 поиск редактируемого символа в строке справа от курсора -;вх: b - номер столбца -; c - номер строки -;вых: cy=1 справа есть символ -; b - номер столбца с символом -x2BD4 push de - push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jp x2C65 - -;АДРЕС: #2BDF поиск в строке влево от курсора редактируемого символа -x2BDF push de - push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E63 ;поиск в строке влево от курсора редактируемого символа - jp x2C65 - -;АДРЕС: #2BEA поиск начала слова слева от курсора -x2BEA push de - push hl -x2BEC call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x2C07 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2BEC -x2BF8 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x2C07 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr nz,x2BF8 - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере -x2C07 jr x2C65 - -;АДРЕС: #2C09 поиск начала слова справа от курсора -x2C09 push de - push hl -x2C0B call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jr nc,x2C2B - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr nz,x2C0B -x2C17 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jr nc,x2C2B - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jr nc,x2C2B - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2C17 - scf - jr x2C65 -x2C2B call nc,x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - or a - jr x2C65 - -;АДРЕС: #2C31 поиск начала строки редактирования в буфере -x2C31 push de - push hl -x2C33 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x2C45 - call x2B0B ;вставить строку бейсик программы - jr c,x2C33 - jr x2C65 -x2C45 ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - jr x2C65 - -;АДРЕС: #2C4C поиск конца строки в буфере редактирования -x2C4C push de - push hl -x2C4E call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 3,(hl) - jr nz,x2C60 - call x2B30 ;вставить строку бейсик программы - jr c,x2C4E - jr x2C65 -x2C60 ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа -x2C65 pop hl - pop de - ret - -;АДРЕС: #2C68 вставить строку бейсик программы, если были изменения -;вх: c - номер строки -;вых: cy=0 строка вставлена -x2C68 ld a,(#EC0D) - bit 3,a - scf - ret z ;изменений не было - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 3,(hl) - scf - ret z - jr x2C8E - -;АДРЕС: #2C7C вставить строку в бейсик программу, если были изменения -x2C7C ld a,(#EC0D) - bit 3,a - scf - ret z - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - scf - ret z - -;АДРЕС: #2C8E вставить строку бейсик программы -;вх: c - номер строки -;вых: cy=0 синтаксическая ошибка -; cy=1 строка вставлена -; bc - координаты курсора -; a - номер столбца -x2C8E ld a,#02 -x2C90 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x2CA3 ;это первая строка - dec c - jp p,x2C90 - ld c,#00 - ld a,#01 -x2CA3 ld hl,#EC00 - ld de,#EC03 - or #80 - ld (hl),a - ld (de),a - inc hl - inc de - ld a,#00 ;!!!можно записать xor a - ld (hl),a - ld (de),a - inc hl - inc de - ld a,c - ld (hl),a - ld (de),a - ld hl,#0000 - ld (#EC06),hl - call x335F ;копирование процедур в ram - call x3C67 ;токенизация строки бейсик программы - push ix - call x1F20 ;установка другого стэка и ram 0 - call x026B ;выполненение введенной строки - call x1F45 ;установка другого стэка и ram 7 - pop ix - ld a,(#5C3A) - inc a - jr nz,x2CEF ;есть ошибка - ld hl,#EC0D - res 3,(hl) - call x365E ;установка переменных для ввода символа - ld a,(#EC0E) - cp #04 - call nz,x152F ;печать бейсик программы от текущей строки - call x26FA ;звуковой сигнал - call x2A07 ;получение позиции курсора - scf - ret -x2CEF ld hl,#EC00 - ld de,#EC03 - ld a,(de) - res 7,a - ld (hl),a - inc hl - inc de - ld a,(de) - ld (hl),a - inc hl - inc de - ld a,(de) - ld (hl),a - call x3C63 ;токенизация строки бейсик программы с синтаксической ошибкой - jr c,x2D0A - ld bc,(#EC06) -x2D0A ld hl,(#EC06) - or a - sbc hl,bc - push af - push hl - call x2A07 ;получение позиции курсора - pop hl - pop af - jr c,x2D2A - jr z,x2D45 -x2D1B push hl - ld a,b - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2D45 - dec hl - ld a,h - or l - jr nz,x2D1B - jr x2D45 -x2D2A push hl - ld hl,#EC0D - res 7,(hl) - pop hl - ex de,hl - ld hl,#0000 - or a - sbc hl,de -x2D38 push hl - ld a,b - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - pop hl - jr nc,x2D45 - dec hl - ld a,h - or l - jr nz,x2D38 -x2D45 ld hl,#EC0D - set 7,(hl) - call x2A11 ;сохранить позицию курсора - ld a,#17 ;paper 2, ink 7 - call x3A96 ;сохранить атрибуты курсора - or a - ret - -;АДРЕС: #2D54 получить очередной символ из строки бейсик программы -;вых: a - код символа -x2D54 ld hl,#EC00 - bit 7,(hl) - jr z,x2D62 - ld hl,(#EC06) ;увеличим количество редактируемых символов в строке - inc hl - ld (#EC06),hl -x2D62 ld hl,#EC00 - ld a,(hl) ;флаги - inc hl - ld b,(hl) ;столбец - inc hl - ld c,(hl) ;строка - push hl - and #0F - ld hl,x2D85 ;таблица адресов процедур - call x3FCE ;обработка управляющего кода - ld e,l - pop hl - jr z,x2D79 - ld a,#0D -x2D79 ld (hl),c - dec hl - ld (hl),b - dec hl - push af - ld a,(hl) - and #F0 - or e - ld (hl),a - pop af - ret -;таблица адресов процедур -x2D85 db #03 ;размер таблицы - db #02: dw x2DAC - db #04: dw x2DE9 - db #01: dw x2D8F - -;АДРЕС: #2D8F получить символ из текущей позиции курсора в буфере редактирования -;вх: c - номер строки -;вых: l=#01 -> a - код символа из верхнего буфера -; =#02 -> a - код символа из буфера -; =#04 -> a - код символа из нижнего буфера -; =#08 -> a - =#0D конец буфера редактирования -x2D8F call x32B7 ;расчет адреса начала строки в буфере редактирования -x2D92 call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2D9E ;вне пределов строки - cp #00 - jr z,x2D92 ;нет символа - ld l,#01 - ret -x2D9E inc c ;следующая строка - ld b,#00 - ld hl,(#F9DB) ;!!!ОШИБКА!!! должно быть ld hl,#F9DB - ld a,c - cp (hl) - jr c,x2D8F - ld b,#00 - ld c,#00 -;на отображаемой строчке строки бейсик программы -x2DAC push hl - ld hl,#F6EE - ld a,(hl) - cp c - jr nz,x2DBE - inc hl - ld a,(hl) - cp b - jr nz,x2DBE - ld hl,#EC00 - res 7,(hl) -x2DBE pop hl -x2DBF call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2DCE ;вне пределов строки - cp #00 - jr z,x2DAC - ld l,#02 - ret -x2DCE ld hl,#0020 - add hl,de - bit 3,(hl) - jr z,x2DDB - ld l,#08 - ld a,#0D - ret -x2DDB ld hl,#F6F3 - inc c - ld a,(hl) - cp c - ld b,#00 - jr nc,x2DBF - ld b,#00 - ld c,#01 -;используется нижний экран -x2DE9 call x31C3 ;расчет адреса начала строки в буфере редактирования -x2DEC call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2DF8 ;вне пределов строки - cp #00 - jr z,x2DEC - ld l,#04 - ret -x2DF8 ld hl,#0020 - add hl,de - bit 3,(hl) - jr nz,x2E09 - inc c - ld b,#00 - ld a,(#F6F5) - cp c - jr nc,x2DE9 -x2E09 ld l,#08 - ld a,#0D - ret - -;АДРЕС: #2E0E получить символ из строки буфера редактирования -;вх: b - номер столбца -; de - адрес начала строки -;вых: cy=1 символ получен -> a - код символа -x2E0E ld a,#1F - cp b - ccf - ret nc - ld l,b - ld h,#00 - add hl,de - ld a,(hl) - inc b - scf - ret - -;настройки верхнего окна редактирования -x2E1B db #01 ;количество байт - db #14 ;количество редактируемых строк - -;настройки нижнего окна редактирования -x2E1D db #01 ;количество байт - db #01 ;количество редактируемых строк - -;АДРЕС: #2E1F сброс верхнего окна редактирования -x2E1F ld hl,#5C3C - res 0,(hl) ;вывод на основной экран - ld hl,x2E1B - ld de,#EC15 - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #2E2D сброс нижнего окна редактирования -x2E2D ld hl,#5C3C - set 0,(hl) - ld bc,#0000 - call x372B ;установка координат печати из bc - ld hl,x2E1D - ld de,#EC15 - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #2E41 поиск в строке вправо от курсора редактируемого символа -;вх: b - номер столбца, с которого следует начать поиск -; de - начало строки в буфере редактирования -;вых: cy=1 символ найден -; hl - адрес редактируемой позиции -; b - номер столбца -x2E41 ld h,#00 ;!!!можно сократить!!! call x2E7B - ld l,b - add hl,de - ld a,(hl) - cp #00 - scf - ret nz - ld a,b - or a - jr z,x2E5B - push hl - dec hl - ld a,(hl) - cp #00 - scf - pop hl - ret nz -x2E56 ld a,(hl) - cp #00 - scf - ret nz -x2E5B inc hl - inc b - ld a,b - cp #1F - jr c,x2E56 - ret - -;АДРЕС: #2E63 поиск в строке влево от курсора редактируемого символа -;вх: b - номер столбца, с которого следует начать поиск -; de - начало строки в буфере редактирования -;вых: cy=1 символ найден -; hl - адрес редактируемой позиции -; b - номер столбца -x2E63 ld h,#00 ;!!!можно сократить!!! call x2E7B - ld l,b - add hl,de - ld a,(hl) - cp #00 - scf - ret nz -x2E6C ld a,(hl) - cp #00 - jr nz,x2E78 - ld a,b - or a - ret z - dec hl - dec b - jr x2E6C -x2E78 inc b - scf - ret - -;АДРЕС: #2E7B чтение символа из буфера редактирования -;вх: b - номер столбца -; de - начало строки в буфере редактирования -;вых: a - символ по заданному адресу -x2E7B ld h,#00 - ld l,b - add hl,de - ld a,(hl) - ret - -;АДРЕС: #2E81 вставка символа в буфер редактирования -;вх: a - код символа -; bc - координаты курсора -x2E81 ld hl,#EC0D - or a ;!!!ЛИШНЕЕ!!! - bit 0,(hl) - ret nz ;буфер строки переполнен - push bc - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop af -x2E8E call x16AC ;вставка символа в строку буфера редактирования - push af - ex de,hl - call x3604 ;печать строки редактируемого буфера - ex de,hl - pop af - ccf - jr z,x2ECC ;буфер бельше не надо раздвигать - push af - ld b,#00 - inc c - ld a,(#EC15) - cp c - jr c,x2EC8 - ld a,(hl) - ld e,a - and #D7 - cp (hl) - ld (hl),a - ld a,e - set 1,(hl) - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop af - jr z,x2EC2 - res 0,a - call x2ED3 ;вставка пустой строки в буфер редактирования - jr nc,x2ECC ;буфер переполнен - call x35F4 ;создание отступа в строке в буфере редактирования - pop af - jr x2E8E -x2EC2 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop af - jr x2E8E -x2EC8 pop af - call x316E ;вставка символа в нижний буфер редактирования -x2ECC pop bc - ret - -;АДРЕС: #2ECE вставка пустой строки в буфер редактирования -x2ECE call x30B4 - ld a,#09 - -;АДРЕС: #2ED3 вставка пустой строки в буфер редактирования -;вх: de - адрес строки в бефере редактирования -; a - флаги -; c - номер строки для вставки -x2ED3 push bc - push de - ld b,c - ld hl,x2EEF ;пустая строка - ld c,a - push bc - call x1675 ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана - pop bc - ld a,c - jr nc,x2EEC ;буфер переполнен - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - ld (hl),a - scf -x2EEC pop de - pop bc - ret -x2EEF ds #20,#00 - db #09: dw #0000 - -;АДРЕС: #2F12 удаление символа в строке в буфере редактирования -x2F12 push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - push bc -x2F17 ld hl,#0020 - add hl,de - bit 1,(hl) - ld a,#00 - jr z,x2F31 - inc c - ld hl,#0023 - add hl,de - ex de,hl - ld a,(#EC15) - cp c - jr nc,x2F17 - dec c - call x31C9 ;удаление символа в нижнем буфере редактирования -x2F31 pop hl -x2F32 push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop hl - ld b,a - ld a,c - cp l - ld a,b - push af - jr nz,x2F41 - ld b,h - jr x2F4A -x2F41 push af - push hl - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop hl - pop af -x2F4A push hl - ld hl,#F6F4 - set 0,(hl) - jr z,x2F54 - res 0,(hl) -x2F54 call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево - push af - push bc - push de - ld hl,#F6F4 - bit 0,(hl) - jr nz,x2F6F - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - jr c,x2F6F - call x2F80 ;сдивг строк вверх в буфере при удалении строки - pop de - pop bc - jr x2F74 -x2F6F pop hl - pop bc - call x3604 ;печать строки редактируемого буфера, при необходимости -x2F74 pop af - dec c - ld b,a - pop hl - pop af - ld a,b - jp nz,x2F32 - scf - pop bc - ret - -;АДРЕС: #2F80 сдивг строк вверх в буфере при удалении строки -x2F80 ld hl,#0020 - add hl,de - ld a,(hl) - bit 0,(hl) - jr nz,x2FB2 - push af - push bc - ld a,c - or a - jr nz,x2FA4 - push bc - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - ld (#FC9A),hl - ld a,(#F9DB) - ld c,a - dec c - call x32B7 ;расчет адреса начала строки в буфере редактирования - pop bc - jr x2FA8 -x2FA4 dec c - call x30B4 ;расчет адреса начала строки в буфере редактирования -x2FA8 pop bc - pop af - ld hl,#0020 - add hl,de - res 1,(hl) - or (hl) - ld (hl),a -x2FB2 ld b,c - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x30DF ;сдвиг строк в буфере редактирования вверх - jp x1648 ;сдвиг всех строк в буфере редактирования верх и обновление экрана - -;АДРЕС: #2FBC ext+E удаление символов от курсора до начала текущего слова -x2FBC call x3084 ;удаление курсора и запрет на обновление экрана -x2FBF push hl - call x3095 ;проверка наличия предыдущего символа в буфере - jr z,x2FF7 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2FF8 - call x2A1A ;получение текущего символа в буфере редактирования - push af - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - pop af - cp " " - jr z,x2FBF -x2FD9 push hl - call x3095 ;проверка наличия предыдущего символа в буфере - jr z,x2FF7 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2FF8 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2FF3 - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x2FD9 -x2FF3 push hl - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере -x2FF7 pop hl -x2FF8 ld a,b - push af - push hl - ld hl,#EEF5 - res 2,(hl) - ld a,(#EC15) - push bc - ld b,#00 - ld c,a - cp a - call x1605 ;печать буфера редактирования на экране - pop bc - ld hl,#EC0D - set 3,(hl) - pop hl - call x29F8 ;напечатать курсор - pop af - ret - -;АДРЕС: #3017 ext+W удаление символов от курсора до начала следующего слова -x3017 call x3084 ;удаление курсора и запрет на обновление экрана -x301A push hl - call x2A1A ;получение текущего символа в буфере редактирования - pop hl - cp #00 - scf - jr z,x2FF8 - push af - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - pop af - cp " " - jr nz,x301A -x302F call x2A1A ;получение текущего символа в буфере редактирования - cp " " - scf - jr nz,x2FF8 - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x302F - -;АДРЕС: #303E ext+K удаление символов до наала строки -x303E call x3084 ;удаление курсора и запрет на обновление экрана -x3041 push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x3059 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x306D - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x3041 - push hl ;!!!не используется!!! -x3059 ld a,b - cp #00 - jr z,x306D - dec b - call x2A1A ;получение текущего символа в буфере редактирования - inc b - cp #00 - jr z,x306D - dec b - call x2F12 ;удаление символа в строке в буфере редактирования - jr x3059 -x306D pop hl -x306E scf - jp x2FF8 - -;АДРЕС: #3072 ext+J удаление символов до конца строки -x3072 call x3084 ;удаление курсора и запрет на обновление экрана -x3075 call x2A1A ;получение текущего символа в буфере редактирования - cp #00 - scf - jr z,x306E - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x3075 - -;АДРЕС: #3084 удаление курсора и запрет на обновление экрана -x3084 ld hl,#EC0D - res 0,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#EEF5 - set 2,(hl) - ld hl,#F6F1 - ret - -;АДРЕС: #3095 проверка наличия предыдущего символа в буфере -x3095 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr z,x30AE - ld a,b - cp #00 - jr z,x30B2 - dec b - call x2A1A ;получение текущего символа в буфере редактирования - inc b - cp #00 - jr z,x30B2 -x30AE ld a,#01 - or a - ret -x30B2 xor a - ret - -;АДРЕС: #30B4 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x30B4 ld hl,#EC16 ;буфер редактируемой строки -x30B7 push af - ld a,c - ld de,#0023 -x30BC or a - jr z,x30C3 - add hl,de - dec a - jr x30BC -x30C3 ex de,hl - pop af - ret - -;АДРЕС: #30C6 !!!NOT USED!!! -x30C6 push de - call x30B4 - ld h,#00 - ld l,b - add hl,de - pop de - ret - -;АДРЕС: #30D0 параметры для установки буфера редактирования строки внизу экрана -x30D0 db #05 - db #00 - dw #0000 - dw #F6F8 - -;АДРЕС: #30D6 установка буфера редактирования внизу экрана -x30D6 ld hl,x30D0 - ld de,#F6F5 - jp x3FBA - -;АДРЕС: #30DF сдвиг строк в буфере редактирования вверх -x30DF push bc - push de - ld hl,#F6F5 ;колво строк в буфере редактирования - push hl - ld a,(hl) ;кол-во строк в буфере редактирования - or a - jr nz,x3101 - push hl - call x335F ;копирование процедур в ram - ld hl,(#F9D7) ;номер строки в редактируемой строке программы - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - jr nc,x30F8 ;строка не существует - ld (#F9D7),hl ;сохраним номер строки -x30F8 ld b,h - ld c,l - pop hl - call x32D6 ;копирование строки программы в буфер редактирования - dec a - jr x3116 -x3101 ld hl,#EC0D ;сдвиг всех строк вверх - res 0,(hl) - ld hl,#F6F8 - ld d,h - ld e,l - ld bc,#0023 - add hl,bc - ld bc,#02BC - ldir - dec a - scf -x3116 pop de - ld (de),a - ld hl,#F6F8 - pop de - pop bc - ret - -;АДРЕС: #311E сдвиг строк в буфере редактирования вниз -;вх: de - адрес последней строки в буфере редактирования -;вых: cy=0 буфер переполнен -; a - количество строк в буфере редактирования -; hl - fдрес первой строки в буфере редактирования -x311E push bc - push de - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #11 - jr nz,x313F ;это не первая строка - push hl - push de - inc hl - ld d,(hl) - inc hl - ld e,(hl) ;de номер строки бейсик программы - push de - call x335F ;копирование процедур в ram - pop hl - call x334A ;поиск адреса строки бейсик программы - jr nc,x313D ;строка не существует - ld (#F9D7),hl -x313D pop de - pop hl -x313F bit 0,(hl) - ld hl,#F6F5 - push hl - jr z,x314C ;это не первая строка в буфере - ld a,#00 - scf - jr x3116 -x314C ld a,(hl) - cp #14 - jr z,x3116 ;это конец буфера - ld bc,#0023 - ld hl,#F6F8 - ex de,hl - ldir - ld hl,#F9D6 - ld d,h - ld e,l - ld bc,#0023 - or a - sbc hl,bc - ld bc,#02BC - lddr - inc a - scf - jr x3116 - -;АДРЕС: #316E вставка символа в нижний буфер редактирования -;вх: hl - адрес флага текущей строки -; a - код символа для вставки в буфер -x316E push bc - push de - push af - ld b,#00 - ld c,#01 - push hl - call x31C3 ;расчет адреса начала строки в буфере редактирования - pop hl - bit 3,(hl) - res 3,(hl) - jr nz,x31A0 -x3180 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop af -x3184 call x16AC ;вставка символа в строку буфера редактирования - jr z,x31BA - push af - ld b,#00 - inc c - ld a,c - cp #15 - jr c,x31A0 - dec hl - ld a,(hl) - inc hl - cp #00 - jr z,x31A0 - push hl - ld hl,#EC0D - set 0,(hl) ;буфер заполнен - pop hl -x31A0 bit 1,(hl) - set 1,(hl) - res 3,(hl) - call x31C3 ;расчет адреса начала строки в буфере редактирования - jr nz,x3180 - push bc - push de - call x35E6 ;зануление до конца строки в буфере редактирования - ld (hl),#08 - pop de - pop bc - call x35F4 ;создание отступа в строке в буфере редактирования - pop af - jr x3184 -x31BA ld a,c - ld (#F6F5),a - set 3,(hl) - pop de - pop bc - ret - -;АДРЕС: #31C3 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x31C3 ld hl,#F6F8 - jp x30B7 - -;АДРЕС: #31C9 удаление символа в нижнем буфере редактирования -x31C9 push bc - push de - ld hl,#EC0D - res 0,(hl) - ld a,(#F6F5) - ld c,a - or a - ld a,#00 - jr z,x321B -x31D9 call x31C3 ;расчет адреса начала строки в буфере редактирования - push af - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jr nc,x31F2 - pop af - call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево - push af - push bc - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x3216 -x31F2 inc hl - ld a,(hl) - push af - push bc - ld a,c - cp #01 - jr nz,x3204 - ld a,(#EC15) - ld c,a - call x30B4 ;расчет адреса начала строки в буфере редактирования - jr x3208 -x3204 dec c - call x31C3 ;расчет адреса начала строки в буфере редактирования -x3208 pop bc - pop af - ld hl,#0020 - add hl,de - res 1,(hl) - or (hl) - ld (hl),a - ld hl,#F6F5 - dec (hl) -x3216 pop af - dec c - jr nz,x31D9 - scf -x321B pop de - pop bc - ret - -;АДРЕС: #321E параметры для установки буфера редактирования строки вверху экрана -x321E db #03 - db #00: dw #F9DE - -;АДРЕС: #3222 установка буфера редактирования в верху экрана -x3222 ld hl,x321E - ld de,#F9DB - jp x3FBA - -;АДРЕС: #322B перемещение курсора вверх в верхнем буфере редактирования -x322B push bc - push de - ld hl,#F9DB - push hl - ld a,(hl) - or a - jr nz,x3253 - push hl - call x335F ;копирование процедур в ram - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - jr nc,x3244 - ld (#FC9A),hl -x3244 ld b,h - ld c,l - pop hl - inc hl - inc hl - inc hl - jr nc,x325D ;!!!ОШИБКА!!! - call x32D6 ;копирование строки программы в буфер редактирования - dec a - ex de,hl - jr x325D -x3253 ld hl,(#F9DC) - ld bc,#0023 - sbc hl,bc - scf - dec a -x325D ex de,hl - pop hl - jr nc,x3262 - ld (hl),a -x3262 inc hl - ld (hl),e - inc hl - ld (hl),d - ex de,hl - pop de - pop bc - ret - -;АДРЕС: #326A копирование строки бейсик программы в буфер редактирования вверзу экрана -x326A push bc - push de - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #11 - jr nz,x3282 - push de - push hl - inc hl - ld d,(hl) - inc hl - ld e,(hl) - ld (#FC9A),de - pop hl - pop de -x3282 bit 3,(hl) - ld hl,#F9DB - push hl - jr z,x32A0 - push hl - call x335F ;копирование процедур в ram - ld hl,(#FC9A) - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - ld (#FC9A),hl - pop hl - inc hl - inc hl - inc hl - ld a,#00 - scf - jr x325D -x32A0 ld a,(hl) - cp #14 - jr z,x32B3 - inc a - ld hl,(#F9DC) - ld bc,#0023 - ex de,hl - ldir - ex de,hl - scf - jr x325D -x32B3 pop hl - pop de - pop bc - ret - -;АДРЕС: #32B7 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x32B7 ld hl,#F9DE - jp x30B7 - -;АДРЕС: #32DB таблица обработки управляющих кодов при редактировании строки -x32BD db #08 ;всего функций - db #0D: dw x35CC ;enter - db #01: dw x35DA ;null - db #12: dw x335A ;flash - db #13: dw x335A ;bright - db #14: dw x335A ;inverse - db #15: dw x335A ;over - db #10: dw x335A ;ink - db #11: dw x335A ;paper - -;АДРЕС: #32D6 копирование строки программы в буфер редактирования -;вх: hl - адрес флагов предыдущей строки в буфере редактирования -; bc - номер редактируемой строки в буфере редактирования -;вых: a - количество строк в буфере редактирования -; hl - адрес первой строки -; de - адрес последней строки -x32D6 ld d,h - ld e,l - inc de - inc de - inc de ;адрес редактируемой строки в буфере редактирования - push de - ld hl,#0020 - add hl,de ;адрес флагов редактируемой строки - ld (hl),#01 ;первая строка - inc hl - ld (hl),b - inc hl - ld (hl),c ;номер строки - ld c,#01 ;строка 1 - ld b,#00 ;колонка 0 -x32EA push bc - push de - ld a,(#EC0E) - cp #04 ;это режим калькулятора - call nz,x3517 ;нет. преобразование токена в текст - pop de - pop bc - jr c,x3307 ;токен преобразован - ld a,c - cp #01 - ld a,#0D - jr nz,x3307 ;это не 'enter' - ld a,b - or a - ld a,#01 - jr z,x3307 - ld a,#0D -x3307 ld hl,x32BD - call x3FCE ;обработка управляющего кода - jr c,x332C ;код обработан - jr z,x32EA ;следующий символ - push af - ld a,#1F - cp b - jr nc,x3326 - ld a,#12 - call x3331 ;перенос части строки на следующую строку - jr c,x3323 - pop af - ld a,#0D - jr x3307 -x3323 call x35F4 ;создание отступа в строке в буфере редактирования -x3326 pop af - call x35C5 ;сохранить символ в указанном столбце текущей строки буфера редактирования - jr x32EA -x332C pop hl - ld a,c - ret z - scf - ret - -;АДРЕС: #3331 перенос части строки на следующую строку -;вх: de - адрес начала строки в буфере редактирования строки -; b - номер столбца -; c - номер строки -; a - новое значение байта флага -;вых: cy=0 - нижняя строка в буфере -; hl - адрес байта флага для новой строки -x3331 push af - call x35E6 ;зануление до конца строки в буфере редактирования - pop af - xor (hl) - ld (hl),a - ld a,c - cp #14 - ret nc - inc c - ld hl,#0023 - add hl,de - ex de,hl - ld hl,#0020 - add hl,de - ld (hl),#00 - scf - ret - -;АДРЕС: #334A поиск адреса строки бейсик программы -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес первой команды в строке -x334A call x34B6 ;поиск адреса строки программы с заданным номером - ret c - ld hl,#0000 - ret - -;АДРЕС: #3352 преобразование номера строки в ASCII и помещение в буфер -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес начала команд в строке -; hl - номер строки (=#0000 строка не существует) -x3352 call x3430 ;преобразование номера строки в ASCII и помещение в буфер - ret c - ld hl,#0000 - ret - -;АДРЕС: #335A преобразование токена в текст -;вых: cy=0 токен преобразован -x335A call x3517 ;преобразование токена в текст - ccf - ret nc ;!!!ОШИБКА!!! должно быть ret??? - -;АДРЕС: #335F копирование процедур в ram -x335F ld hl,#0000 - ld (#FC9F),hl ;адрес следующего символа в строке бейсик программы - ld (#FCA1),hl ;адрес следующего символа в буфере ключевго слова - ld hl,x3374 - ld de,#FCAE - ld bc,#00BC - ldir - ret - -;АДРЕС: #3374 копирование токена в буфер токенов (=#FCAE) -;вх: a - номер токена -#A5 -; de - адрес в буфере -x3374 di - ld bc,#7FFD - ld d,#17 ;rom 0, ram 7, scr 5 - out (c),d - cp #50 - jr nc,x33B1 ;токен =>#F5 - cp #40 - jr nc,x33AA ;токен =>#E5 - cp #30 - jr nc,x33A3 ;токен =>#D5 - cp #20 - jr nc,x339C ;токен =>#C5 - cp #10 - jr nc,x3395 ;токен =>#B5 - ld hl,Rom1.x0095+#01 - jr x33B6 -x3395 sub #10 - ld hl,Rom1.x0095+#3A - jr x33B6 -x339C sub #20 - ld hl,Rom1.x0095+#6B - jr x33B6 -x33A3 sub #30 - ld hl,Rom1.x0095+#A9 - jr x33B6 -x33AA sub #40 - ld hl,Rom1.x0095+#F6 - jr x33B6 -x33B1 sub #50 - ld hl,Rom1.x0095+#13F -x33B6 ld b,a - or a -x33B8 jr z,x33C3 -x33BA ld a,(hl) - inc hl - and #80 - jr z,x33BA - dec b - jr x33B8 - -;АДРЕС: #33C3 копирование токена (=#FCFD) -;вх: - адрес токена в rom 1 -x33C3 ld de,#FCA3 - ld (#FCA1),de - ld a,(#FC9E) - or a - ld a,#00 - ld (#FC9E),a - jr nz,x33D9 - ld a," " - ld (de),a - inc de -x33D9 ld a,(hl) - ld b,a - inc hl - ld (de),a - inc de - and #80 - jr z,x33D9 - ld a,b - and #7F - dec de - ld (de),a - inc de - ld a," "+#80 - ld (de),a - ld a,#07 ;rom 0, ram 7, scr 5 - ld bc,#7FFD - out (c),a - ei - ret - -;АДРЕС: #33F4 распознавание токена (=#FD2E) -;вых: cy=1 токен найден -> a - код токена -x33F4 di - ld bc,#7FFD - ld d,#17 ;rom 0, ram 7, scr 5 - out (c),d - ld hl,Rom1.x0095+#01 - ld b,#A5 -x3401 ld de,#FD74 ;адрес слова -x3404 ld a,(de) - and #7F - cp #61 - ld a,(de) - jr c,x340E - and #DF ;в верхний регистр -x340E cp (hl) - jr nz,x341A ;не совпадает - inc hl - inc de - and #80 - jr z,x3404 ;совпадает, следующий символ - scf - jr x3426 ;токен найден -x341A inc b - jr z,x3425 -x341D ld a,(hl) ;ищем следующий токен - and #80 - inc hl - jr z,x341D - jr x3401 -x3425 or a -x3426 ld a,b - ld d,#07 ;rom 0, ram 7, scr 5 - ld bc,#7FFD - out (c),d - ei - ret - -;АДРЕС: #3430 преобразование номера строки в ASCII и помещение в буфер -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес начала команд в строке -; hl - номер строки -x3430 call x34EA ;обнуление указателей в бейсик строке - or a ;!!!ОШИБКА!!! должно быть xor a - ld (#FC9E),a - call x1F20 ;установка другого стэка и ram 0 - call x34F6 ;поиск адрес строки бейсик программы в памяти - jr nc,x3491 ;строка не найдена - jr nz,x344D ;строка не найдена, но есть следующая - ld a,b - or c - jr z,x344D ;это первая строки программы - call x34CF ;расчет адреса следущей строки бейсик программы - call x34D9 ;проверка на конец бейсик программы - jr nc,x3491 ;это последняя строка программы -x344D ld d,(hl) - inc hl - ld e,(hl) ;de - номер строки - call x1F45 ;установка другого стэка и ram 7 - push de - push hl - push ix - ld ix,#FCA3 ;буфер токена - ld (#FCA1),ix - ex de,hl - ld b,#00 - ld de,-1000 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-100 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-10 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-1 - call x3495 ;выделение разряда числа и занесение его в буфер - dec ix ;!!!можно оптимизировать set 7,(ix-1) - ld a,(ix+#00) ;!!!можно оптимизировать - or #80 ;!!!можно оптимизировать - ld (ix+#00),a ;!!!можно оптимизировать - pop ix - pop hl - pop de - inc hl - inc hl - inc hl - ld (#FC9F),hl - ex de,hl - scf - ret -x3491 call x1F45 ;установка другого стэка и ram 7 - ret - -;АДРЕС: #3495 выделение разряда числа и занесение его в буфер -;вх: de - делитель -; hl - номер строки -; ix - адрес в буфере для записи номера строки в ASCII -; b =#00 старший разряд числа еще не найден -;вых: ix - следующий адрес в буфере -; b =#01 старший разряд числа найден -x3495 xor a -x3496 add hl,de - inc a - jr c,x3496 - sbc hl,de - dec a - add a,#30 - ld (ix+#00),a - cp "0" - jr nz,x34B1 - ld a,b - or a - jr nz,x34B3 - ld a,#00 - ld (ix+#00),a - jr x34B3 -x34B1 ld b,#01 -x34B3 inc ix - ret - -;АДРЕС: #34B6 поиск адрес строки программы с заданным номером или следущей -; строки, если строка с заданным номером не существует -;вх: hl - номер строки -;вых: cy=1 строка найдена -; de - адрес начала команд в строке -; hl - номер строки -x34B6 call x34EA ;обнуление указателей в бейсик строке - or a ;!!!ОШИБКА!!! должно быть xor a - ld (#FC9E),a - call x1F20 ;установка другого стэка и ram 0 - call x34F6 ;поиск адрес строки бейсик программы в памяти - jr nc,x3491 ;строка не существует - ex de,hl - ld a,l - or h - scf - jp nz,x344D - ccf - jr x3491 - -;АДРЕС: #34CF расчет адреса следущей строки бейсик программы -;вх: hl - адрес текущей строки -;вых: de - адрес текущей строки -; hl - адрес следующей строки -x34CF push hl - inc hl - inc hl - ld e,(hl) - inc hl - ld d,(hl) - inc hl - add hl,de - pop de - ret - -;АДРЕС: #34D9 проверка на конец бейсик программы -;вх: hl - адрес в строке -;вых: cy=0 - это конец строки -x34D9 ld a,(hl) - and #C0 - scf - ret z - ccf - ret - -;АДРЕС: #34E0 сравнение номера строки с заданным -;вх: hl - адрес номера строки в бейсик программе -; bc - номер строки -;вых: z, cy=1 - строка найдена -; nz, cy=1 - bc<(hl) -; nz, cy=0 - bc>(hl) -x34E0 ld a,b - cp (hl) - ret nz - ld a,c - inc hl - cp (hl) - dec hl - ret nz - scf - ret - -;АДРЕС: #34EA обнуление указателей в бейсик строке -x34EA push hl - ld hl,#0000 - ld (#FCA1),hl - ld (#FC9F),hl - pop hl - ret - -;АДРЕС: #34F6 поиск адрес строки бейсик программы в памяти -;вх: hl - номер строки (=#0000 первая строка) -;вых: cy=1 - искомая или следующая строка существует -; nz - строка не найдена -; hl - адрес строки программы (=#0000 строка не существует) -; de - адрес предыдущей строки программы (=#0000 строка не существует) -; bc - номер строки (=#0000 первая строка) -x34F6 push hl - pop bc - ld de,#0000 - ld hl,(#5C53) - call x34D9 ;проверка на конец бейсик программы - ret nc ;конец программы - call x34E0 ;сравнение номера строки с заданным - ret c - ld a,b - or c - scf - ret z ;нужна первая строка -x350A call x34CF ;расчет адреса следущей строки бейсик программы - call x34D9 ;проверка на конец бейсик программы - ret nc ;это конец программы - call x34E0 ;сравнение номера строки с заданным - jr nc,x350A ;не та строка, ищем дальше - ret - -;АДРЕС: #3517 преобразование токена в текст -;вых: cy=1 токен преобразован -x3517 ld hl,(#FCA1) ;адрес следующего символа - ld a,l - or h - jr z,x353C ;нет символа - ld a,(hl) - inc hl - cp " "+#80 - ld b,a - ld a,#00 - jr nz,x3529 ;не последний символ - ld a,#FF -x3529 ld (#FC9E),a ;флаг - ld a,b - bit 7,a - jr z,x3534 ;не последний символ -x3531 ld hl,#0000 -x3534 ld (#FCA1),hl - and #7F - jp x358F -x353C ld hl,(#FC9F) - ld a,l - or h - jp z,x3591 ;больше нечего обрабатывать - call x1F20 ;установка другого стэка и ram 0 -x3547 ld a,(hl) - cp #0E - jr nz,x3554 ;это не число с плавающей точкой - inc hl - inc hl - inc hl - inc hl - inc hl - inc hl - jr x3547 -x3554 call x1F45 ;установка другого стэка и ram 7 - inc hl - ld (#FC9F),hl - cp #A5 ;'RND' - jr c,x3567 ;не токен basic48 - sub #A5 ;!!!ОШИБКА - call #FCAE ;x335F копирование токена в буфер - jp x3517 -x3567 cp #A3 ;токены basic128: SPECTRUM или PLAY - jr c,x357B - jr nz,x3572 ;PLAY - ld hl,x3594 - jr x3575 -x3572 ld hl,x359C ;SPECTRUM -x3575 call #FCFD ;x33C3 копирование токена - jp x3517 -x357B push af - ld a,#00 - ld (#FC9E),a - pop af - cp #0D - jr nz,x358F - ld hl,#0000 ;конец строки - ld (#FCA1),hl - ld (#FC9F),hl -x358F scf - ret -x3591 scf - ccf - ret - -;АДРЕС: #3594 токены basic128 -x3594 dc "SPECTRUM" -x359C dc "PLAY" -x35A0 dc "GOTO" -x35A4 dc "GOSUB" -x35A9 dc "DEFFN" -x35AE dc "OPEN#" -x35B3 dc "CLOSE#" - -;АДРЕС: #35BC установка параметров отступа -x35B9 db #02 - db #01,#05 -x35BC ld hl,x35B9 - ld de,#FD6A - jp x3FBA - -;АДРЕС: #35C5 сохранить символ в указанном столбце текущей строки буфера редактирования -;вх: b - номер столбца -; de - начальный адрес строки -; a - код символа -;вых: b - номер следующего столбца -x35C5 ld l,b - ld h,#00 - add hl,de - ld (hl),a - inc b - ret - -;АДРЕС: #35CC процедура обработки нажатия 'enter' в строке -;вых: cy=1 -x35CC call x35E6 ;зануление до конца строки в буфере редактирования - ld a,(hl) - or #18 - ld (hl),a - ld hl,#FD6A - set 0,(hl) - scf - ret - -;АДРЕС: #35DA процедура обработки зануления до конца строки -;вых: cy=1 -x35DA call x35E6 ;зануление до конца строки в буфере редактирования - set 3,(hl) - ld hl,#FD6A ;!!!можно сократить jr x35CC+nn - set 0,(hl) - scf - ret - -;АДРЕС: #35E6 зануление до конца строки в буфере редактирования -;вх: b - номер первого столбца -; de - адрес начала строки редактирования -;вых: hl - адрес байта флага строки -x35E6 ld l,b - ld h,#00 - add hl,de - ld a," " -x35EC cp b - ret z - ld (hl),#00 - inc hl - inc b - jr x35EC - -;АДРЕС: #35F4 создание отступа в строке в буфере редактирования -;вх: de - адрес строки в буфере редактирования -;вых: b - первый используемый номер столбца в строке -x35F4 ld a,(#FD6B) - ld b,#00 -x35F9 ld h,#00 - ld l,b - add hl,de - ld (hl),#00 - inc b - dec a - jr nz,x35F9 - ret - -;АДРЕС: #3604 печать строки редактируемого буфера, при необходимости -x3604 push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x3614 ;обновлять экран не надо - ld b,c - call x3B1E ;печать строки редактируемого буфера -x3614 pop hl - pop de - pop bc - ret - -;АДРЕС: #3618 сдвиг вверх строк в буфере редактирования при необходимости -;вх: hl - адрес первой строки в буфере -; c - количество строк -; b - номер строки от которой будет сдвиг -x3618 push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x3628 - ld e,c - call x3ABF ;сдвиг вверх строк в буфере редактирования -x3628 pop hl - pop de - pop bc - ret - -;АДРЕС: #362C сдвиг вниз строк в буфере редактирования при необходимости -;вх: hl - адрес первой строки в буфере -; c - количество строк -; b - номер строки от которой будет сдвиг -x362C push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x363C - ld e,c - call x3AC6 ;сдвиг вниз строк в буфере редактирования -x363C pop hl - pop de - pop bc - ret - -;АДРЕС: #3640 печать атрибутов курсора -;вх: c - номер строки -; b - номер столбца -x3640 push af - push bc - push de - push hl - ld a,b - ld b,c - ld c,a - call x3A9D ;печать атрибутов курсора - pop hl - pop de - pop bc - pop af - ret - -;АДРЕС: #364F восстановление атрибутов под курсором -;вх: c - crd Y, b - crd X -x364F push af - push bc - push de - push hl - ld a,b - ld b,c - ld c,a - call x3AB2 ;восстановление атрибутов под курсором - pop hl - pop de - pop bc - pop af - ret - -;АДРЕС: #365E установка переменных для ввода символа -x365E ld a,#00 - ld (#5C41),a ;Число, определяющее режим ввода с клавиатуры - ld a,#02 - ld (#5C0A),a ;Период автоповтора -x3668 ld hl,#5C3B - ld a,(hl) - or #0C - ld (hl),a ;ввод символа - ld hl,#EC0D - bit 4,(hl) - ld hl,x5B66 - jr nz,x367C - res 0,(hl) - ret -x367C set 0,(hl) - ret - -;АДРЕС: #367F ожидание нажатия клавиши -;вых: a - код клавиши -x367F push hl -x3680 ld hl,#5C3B -x3683 bit 5,(hl) - jr z,x3683 ;клавиша не нажата - res 5,(hl) - ld a,(#5C08) ;Код нажатой клавиши - ld hl,#5C41 - res 0,(hl) - cp #20 - jr nc,x36A2 ;символьная клавиша - cp #10 - jr nc,x3680 ;нет реакции - cp #06 - jr c,x3680 - call x36A4 - jr nc,x3680 -x36A2 pop hl - ret -x36A4 rst #28 ;вызов п/п из basic 48 - dw Rom1.x10DB ;обработка кода клавиши - ret - -;АДРЕС: #36A8 печать меню basic 128k -;вх: hl - адрес описания меню -x36A8 push hl - call x373B ;сохранение окна экрана 14*12 в буфере - ld hl,#5C3C - res 0,(hl) - pop hl - ld e,(hl) - inc hl - push hl - ld hl,x37EC ;управляющие коды для печати меню - call x3733 ;печать строки из hl - pop hl - call x3733 - push hl - call x3822 ;печать эмблемы ZX (косые цветные полосы) в меню - ld hl,x37FA ;управляющие коды для печати меню - call x3733 ;печать строки из hl - pop hl -;печать строчек меню - push de - ld bc,#0807 - call x372B ;установка координат печати из bc -x36D1 push bc - ld b,#0C - ld a,#20 - rst #10 ;пробел -x36D7 ld a,(hl) ;печать строчки меню - inc hl - cp #80 - jr nc,x36E0 - rst #10 - djnz x36D7 -x36E0 and #7F - rst #10 -x36E3 ld a,#20 ;дополняем пробелами - rst #10 - djnz x36E3 - pop bc - inc b - call x372B ;установка координат печати из bc - dec e - jr nz,x36D1 - ld hl,#6F38 - pop de -;печать рамки вокруг меню - sla e - sla e - sla e - ld d,e - dec d - ld e,#6F - ld bc,#FF00 - ld a,d - call x3719 ;печать одной линии вокруг меню - ld bc,#0001 - ld a,e - call x3719 ;печать одной линии вокруг меню - ld bc,#0100 - ld a,d - inc a - call x3719 ;печать одной линии вокруг меню - xor a - call x37CA ;атрибутов опции меню - ret - -;АДРЕС: #3719 печать одной линии вокруг меню -;вх: hl - координаты -; bc - приращение координат -x3719 push af - push hl - push de - push bc - ld b,h - ld c,l - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x22E9 ;печать точки - pop bc - pop de - pop hl - pop af - add hl,bc - dec a - jr nz,x3719 - ret - -;АДРЕС: #372B установка координат печати из bc -;вх: bc - координаты печати -x372B ld a,#16 - rst #10 - ld a,b - rst #10 - ld a,c - rst #10 - ret - -;АДРЕС: #3733 печать строки из hl -;вх: hl - адрес строки -x3733 ld a,(hl) - inc hl - cp #FF - ret z - rst #10 ;печать символа из A - jr x3733 - -;АДРЕС: #373B сохранение окна экрана 14*12 в буфере -x373B scf - jr x373F - -;АДРЕС: #373E восстановление окна экрана 14*12 из буфера -x373E and a -x373F ld de,#EEF6 - ld hl,#5C3C - jr c,x3748 - ex de,hl -x3748 ldi - jr c,x374D - ex de,hl -x374D ld hl,#5C7D ;Координаты X и Y последней изображенной на экране точки - jr c,x3753 - ex de,hl -x3753 ld bc,#0014 - ldir - jr c,x375B - ex de,hl -x375B ex af,af' - ld bc,#0707 - call x3B94 - ld a,(ix+#01) - add a,b - ld b,a - ld a,#0C -x3769 push bc - push af - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ld bc,#0007 - add hl,bc - pop de - call x377E ;сохранение/восстановление 14 знакомест экана в буфере - pop af - pop bc - dec b - dec a - jr nz,x3769 - ret - -;АДРЕС: #377E сохранение/восстановление 14 знакомест экана в буфере -;вх: cy' =1 сохранение части экрана в буфере -; =0 восстановление части экрана из буфера -; hl - адрес на экране -; de - адрес в буфере -x377E ld bc,#080E -x3781 push bc - ld b,#00 - push hl - ex af,af' - jr c,x3789 - ex de,hl -x3789 ldir - jr c,x378E - ex de,hl -x378E ex af,af' - pop hl - inc h - pop bc - djnz x3781 - push bc - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - pop de - pop bc - ex af,af' - jr c,x37A0 - ex de,hl -x37A0 ldir - jr c,x37A5 - ex de,hl -x37A5 ex af,af' - ret - -;АДРЕС: #37A7 клавиша вверх в меню basic128 -;вх: a - номер опции -; hl - адрес списка опций меню -x37A7 call x37CA ;инвертирование атрибутов опции меню - dec a - jp p,x37B1 - ld a,(hl) - dec a - dec a -x37B1 call x37CA ;инвертирование атрибутов опции меню - scf - ret - -;АДРЕС: #37B6 клавиша вниз в меню basic128 -;вх: a - номер опции -; hl - адрес списка опций меню -x37B6 push de - call x37CA ;инвертирование атрибутов опции меню - inc a - ld d,a - ld a,(hl) - dec a - dec a - cp d - ld a,d - jp p,x37C5 - xor a -x37C5 call x37CA ;инвертирование атрибутов опции меню - pop de - ret - -;АДРЕС: #37CA инвертирование атрибутов опции меню -;вх: a - номер опции -x37CA push af - push hl - push de - ld hl,#5907 - ld de,#0020 - and a - jr z,x37DA -x37D6 add hl,de - dec a - jr nz,x37D6 -x37DA ld a,%01111000 ;bright 1, paper 7, ink 0 - cp (hl) - jr nz,x37E1 - ld a,%01101000 ;bright 1, paper 5, ink 0 -;печать атрибутов опции -x37E1 ld d,#0E -x37E3 ld (hl),a - inc hl - dec d - jr nz,x37E3 - pop de - pop hl - pop af - ret - -;АДРЕС: #37EC управляющие коды для печати меню -x37EC db #16,#07,#07 ;координаты - db #15,#00 ;over 0 - db #14,#00 ;inverse 0 - db #10,#07 ;ink 7 - db #11,#00 ;paper 0 - db #13,#01 ;bright 1 - db #FF - -;АДРЕС: #37FA управляющие коды для печати меню -x37FA db #11,#00,#20 ;paper 0 - db #11,#07 ;paper 7 - db #10,#00 ;ink 0 - db #FF - -;АДРЕС: #3802 данные потоков для печати эмблемы -x3802 db #01,#03,#07,#0F,#1F,#3F,#7F,#FF - db #FE,#FC,#F8,#F0,#E0,#C0,#80,#00 - -;АДРЕС: #3812 управляющие коды для печати косых полос в меню -x3812 db #10,#02,#20 ;ink 2 - db #11,#06,#21 ;paper 6 - db #10,#04,#20 ;ink 4 - db #11,#05,#21 ;paper 5 - db #10,#00,#20 ;ink 0 - db #FF - -;АДРЕС: #3822 печать эмблемы ZX (косые цветные полосы) в меню -x3822 push bc - push de - push hl - ld hl,x3802 - ld de,x5B98 - ld bc,#0010 - ldir - ld hl,(#5C36) - push hl - ld hl,#5A98 - ld (#5C36),hl - ld hl,x3812 ;управляющие коды для печати косых полос в меню - call x3733 ;печать строки из hl - pop hl - ld (#5C36),hl - pop hl - pop de - pop bc - ret - -;АДРЕС: #3848 печать информационной строки 128 BASIC -x3848 ld hl,x2768 - jr x385A - -;АДРЕС: #384D печать информационной строки Calculator -x384D ld hl,x2771 - jr x385A - -;АДРЕС: #3852 печать информационной строки 48 TR-DOS -x3852 ld hl,x2783 - jr x385A - -;АДРЕС: #3857 печать информационной строки 128 TR-DOS -x3857 ld hl,x275E ;сообщение "128 TR-DOS" -x385A push hl - call x3881 ;очистка двух нижних строк экрана - ld hl,#5AA0 ;установка атрибутов в строке - ld b,#20 - ld a,#40 ;bright 1, paper 0, ink 0 -x3865 ld (hl),a - inc hl - djnz x3865 - ld hl,x37EC ;управляющие коды для печати меню - call x3733 ;печать строки из hl - ld bc,#1500 - call x372B ;установка координат печати из bc - pop de - call x057D ;печать строки из de - ld c,#1A - call x372B ;установка координат печати из bc - jp x3822 ;печать эмблемы ZX (косые цветные полосы) в меню - -;АДРЕС: #3881 очистка двух нижних строк экрана -x3881 ld b,#15 - ld d,#17 - jp x3B5E - -;АДРЕС: #3888 перенумерация строк программы -x3888 call x1F20 ;установка другого стэка и ram 0 - call x3A05 ;подсчет количества строк в бейсик программе - ld a,d - or e - jp z,x39C0 - ld hl,(x5B96) - rst #28 ;!!!ОШИБКА!!! - dw Rom1.x30A9 ;hl=hl*de - ex de,hl - ld hl,(x5B94) - add hl,de - ld de,10000 - or a - sbc hl,de - jp nc,x39C0 - ld hl,(#5C53) -x38AA rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - inc hl - inc hl - ld (x5B92),hl - inc hl - inc hl - ld (x5B67+4),de -x38B8 ld a,(hl) - rst #28 - dw Rom1.x18B6 ;пропуск натурального числа - cp #0D - jr z,x38C5 - call x390E ;анализ строки и перенумерование ссылок на номера строк - jr x38B8 -x38C5 ld de,(x5B67+4) - ld hl,(#5C4B) - and a - sbc hl,de - ex de,hl - jr nz,x38AA -x38D2 call x3A05 ;подсчет количества строк в бейсик программе - ld b,d - ld c,e - ld de,#0000 - ld hl,(#5C53) -x38DD push bc - push de - push hl - ld hl,(x5B96) - rst #28 - dw Rom1.x30A9 ;hl=hl*de - ld de,(x5B94) - add hl,de - ex de,hl - pop hl - ld (hl),d - inc hl - ld (hl),e - inc hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - add hl,bc - pop de - inc de - pop bc - dec bc - ld a,b - or c - jr nz,x38DD - call x1F45 ;установка другого стэка и ram 7 - ld (x5B92),bc - scf - ret - -;токены, использующие ссылки на строки -x3907 db #CA ;LINE - db #F0 ;LIST - db #E1 ;LLIST - db #EC ;GO TO - db #ED ;GO SUB - db #E5 ;RESTORE - db #F7 ;RUN - -;АДРЕС: #390E анализ строки и перенумерование ссылок на номера строк -x390E inc hl - ld (x5B78+1),hl - ex de,hl - ld bc,#0007 - ld hl,x3907 -x3919 cpir - ex de,hl - ret nz - ld c,#00 -x391F ld a,(hl) - cp " " - jr z,x393F - rst #28 - dw Rom1.x2D1B ;это цифра? - jr nc,x393F - cp "." - jr z,x393F - cp #0E - jr z,x3943 - or #20 - cp "e" - jr nz,x393B - ld a,b - or c - jr nz,x393F -x393B ld hl,(x5B78+1) - ret -x393F inc bc - inc hl - jr x391F -x3943 ld (x5B71),bc - push hl - rst #28 - dw Rom1.x18B6 ;пропуск натурального числа - call x3A36 ;пропуск пробелов в строке - ld a,(hl) - pop hl - cp ":" - jr z,x3957 - cp #0D - ret nz -x3957 inc hl - rst #28 - dw Rom1.x33B4 ;поместить число на смэк калькулятора - rst #28 - dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора - ld h,b - ld l,c - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - jr z,x396F - ld a,(hl) - cp #80 - jr nz,x396F - ld hl,#270F ;9999 - jr x3980 -x396F ld (x5B76+1),hl - call x3A0B ;подсчет количества строк - ld hl,(x5B96) - rst #28 - dw Rom1.x30A9 ;hl=hl*de - ld de,(x5B94) - add hl,de -x3980 ld de,x5B72+1 - push hl - call x3A3C ;номер строки в ASCII - ld e,b - inc e - ld d,#00 - push de - push hl - ld l,e - ld h,#00 - ld bc,(x5B71) - or a - sbc hl,bc - ld (x5B71),hl - jr z,x39CF - jr c,x39C5 - ld b,h - ld c,l - ld hl,(x5B78+1) - push hl - push de - ld hl,(#5C65) - add hl,bc - jr c,x39BE - ex de,hl - ld hl,#0082 - add hl,de - jr c,x39BE - sbc hl,sp - ccf - jr c,x39BE - pop de - pop hl - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - jr x39CF -x39BE pop de - pop hl -x39C0 call x1F45 ;установка другого стэка и ram 7 - and a - ret -x39C5 dec bc - dec e - jr nz,x39C5 - ld hl,(x5B78+1) - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x39CF ld de,(x5B78+1) - pop hl - pop bc - ldir - ex de,hl - ld (hl),#0E - pop bc - inc hl - push hl - rst #28 - dw Rom1.x2D2B ;bc на стэк калькулятора - pop de - ld bc,#0005 - ldir - ex de,hl - push hl - ld hl,(x5B92) - push hl - ld e,(hl) - inc hl - ld d,(hl) - ld hl,(x5B71) - add hl,de - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d - ld hl,(x5B67+4) - ld de,(x5B71) - add hl,de - ld (x5B67+4),hl - pop hl - ret - -;АДРЕС: #3A05 подсчет количества строк в бейсик программе -x3A05 ld hl,(#5C4B) - ld (x5B76+1),hl -x3A0B ld hl,(#5C53) - ld de,(x5B76+1) - or a - sbc hl,de - jr z,x3A31 - ld hl,(#5C53) - ld bc,#0000 -x3A1D push bc - rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - ld hl,(x5B76+1) - and a - sbc hl,de - jr z,x3A2E - ex de,hl - pop bc - inc bc - jr x3A1D -x3A2E pop de - inc de - ret -x3A31 ld de,#0000 - ret - -;АДРЕС: #3A35 пропуск пробелов в строке -x3A35 inc hl -x3A36 ld a,(hl) - cp " " - jr z,x3A35 - ret - -;АДРЕС: #3A3C номер строки в ASCII -x3A3C push de - ld bc,-1000 - call x3A60 ;получить один разря числа в ASCII - ld bc,-100 - call x3A60 ;получить один разря числа в ASCII - ld c,-10 - call x3A60 ;получить один разря числа в ASCII - ld a,l - add a,"0" - ld (de),a - inc de - ld b,#03 - pop hl -x3A56 ld a,(hl) - cp "0" - ret nz - ld (hl)," " - inc hl - djnz x3A56 - ret - -;АДРЕС: #3A60 получить один разря числа в ASCII -x3A60 xor a -x3A61 add hl,bc - inc a - jr c,x3A61 - sbc hl,bc - dec a - add a,"0" - ld (de),a - inc de - ret - -;настройки курсора -x3A6D db #08 - db #00,#00,#14,#00,#00,#00,#0F,#00 - -;настройки курсора -x3A76 db #08 - db #00,#16,#01,#00,#00,#00,#0F,#00 - -;АДРЕС: #3A7F установка настроек курсора для верхнего окна -x3A7F ld ix,#FD6C - ld hl,x3A6D - jr x3A8B - -;АДРЕС: #3A88 установка настроек курсора для нижнего окна -x3A88 ld hl,x3A76 -x3A8B ld de,#FD6C - jp x3FBA - -;АДРЕС: #3A91 !!!NOT USED!!! -x3A91 rst #10 - ld a,d - rst #10 - scf - ret - -;АДРЕС: #3A96 сохранить атрибуты курсора -x3A96 and #3F - ld (ix+#06),a - scf - ret - -;АДРЕС: #3A9D печать атрибутов курсора -;вх: b - номер строки -; c - номер столбца -; ix - адрес дескриптора курсора -x3A9D ld a,(ix+#01) - add a,b - ld b,a - call x3BA0 ;расчет адреса атрибутов - ld a,(hl) - ld (ix+#07),a ;сохраним атрибуты - cpl - and #C0 - or (ix+#06) - ld (hl),a - scf - ret - -;АДРЕС: #3AB2 восстановление атрибутов под курсором -;вх: b - crd Y -; c - crd X -; ix - адрес описания курсора -x3AB2 ld a,(ix+#01) - add a,b - ld b,a - call x3BA0 ;расчет адреса атрибутов - ld a,(ix+#07) - ld (hl),a - ret - -;АДРЕС: #3ABF сдвиг вверх строк в буфере редактирования -;вх: hl - адрес первой строки в буфере -; e - количество строк -; b - номер строки от которой будет сдвиг -x3ABF push hl - ld h,#00 ;сдвиг вверх - ld a,e - sub b ;a - количество строк для сдвига - jr x3ACD - -;АДРЕС: #3AC6 сдвиг вниз строк в буфере редактирования -;вх: hl - адрес первой строки в буфере -; e - количество строк -; b - номер строки от которой будет сдвиг -x3AC6 push hl - ld a,e - ld e,b - ld b,a - sub e ;a - количество строк для сдвига - ld h,#FF ;сдвиг вниз - -;сдвиг строк -x3ACD ld c,a - ld a,b - cp e - jr z,x3B1D ;сдвигать не надо - push de - call x3B98 ;расчет количества строк от заданной до низа экрана -x3AD6 push bc - ld c,h - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ex de,hl - xor a - or c - jr z,x3AE3 ;вверх - inc b ;вниз - jr x3AE4 -x3AE3 dec b -x3AE4 push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - pop de - ld a,c - ld c,#20 - ld b,#08 -x3AEE push bc ;скролл знакоместной строки - push hl - push de - ld b,#00 - ldir - pop de - pop hl - pop bc - inc h - inc d - djnz x3AEE - push af ;скролл атрибутной строки - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - ex (sp),hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - ex (sp),hl - pop de - ld bc,#0020 - ldir - pop af - pop bc - and a - jr z,x3B16 ;вверх - inc b - jr x3B17 -x3B16 dec b -x3B17 dec c - ld h,a - jr nz,x3AD6 - pop de - ld b,e -x3B1D pop hl - -;АДРЕС: #3B1E печать строки редактируемого буфера -;вх: b - координата печати Y -; hl - адрес начала строки -x3B1E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - ex de,hl - ld a,(#5C3C) ;TVFLAG - push af - ld hl,#EC0D - bit 6,(hl) ;в какой области идет редактирование буфера - res 0,a - jr z,x3B31 - set 0,a -x3B31 ld (#5C3C),a - ld c,#00 - call x372B ;установка координат печати из bc - ex de,hl - ld b,#20 -x3B3C ld a,(hl) - and a - jr nz,x3B42 - ld a,#20 -x3B42 cp #90 - jr nc,x3B55 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0010 ;!!!можно заменить на rst #10!!! -x3B49 inc hl - djnz x3B3C - pop af - ld (#5C3C),a - call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - scf ;!!!ЛИШНЕЕ!!! - ret ;!!!тоже тогда убрать!!! -x3B55 call x1F20 ;установка другого стэка и ram 0 - rst #10 - call x1F45 ;установка другого стэка и ram 7 - jr x3B49 - -;АДРЕС: #3B5E очистка строк экрана -;вх: b - номер первой строки экрана -; d - номер последней строки экрана -x3B5E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - ld a,d - sub b - inc a - ld c,a ;количество строк - call x3B98 ;b - номер начальной строки экрана -x3B68 push bc ;c - кол-во строк - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ld c,#08 ;занулим строку занкомест -x3B6E push hl - ld b,#20 ;занулим строку пикселей - xor a -x3B72 ld (hl),a - inc hl - djnz x3B72 - pop hl - inc h - dec c - jr nz,x3B6E - ld b,#20 - push bc - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - pop bc - ld a,(#5C8D) ;установим атрибуты строки -x3B86 ld (hl),a - inc hl - djnz x3B86 - pop bc - dec b - dec c - jr nz,x3B68 - call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - scf - ret - -;АДРЕС: #3B94 расчет количества строк и столцов до конца экрана -x3B94 ld a,#21 - sub c - ld c,a - -;АДРЕС: #3B98 расчет количества строк от заданной до низа экрана -;вх: b - номер строки -; ix - адрес описателя курсора -;вых: b - количество строк до низа экрана -x3B98 ld a,#18 - sub b - sub (ix+#01) - ld b,a - ret - -;АДРЕС: #3BA0 расчет адреса атрибутов -;вх: b - crd Y -; c - crd X -;вых: hl - адрес атрибутов -x3BA0 push bc - xor a - ld d,b - ld e,a - rr d - rr e - rr d - rr e - rr d - rr e - ld hl,#5800 - ld b,a - add hl,bc - add hl,de - pop bc - ret - -;АДРЕС: #3BB8 обмен атрибутов basic 128 с основными атрибутами -x3BB8 push af - push hl - push de - ld hl,(#5C8D) ;постоянные атрибуты экрана - ld de,(#5C8F) ;временные атрибуты экрана - exx - ld hl,(#EC0F) - ld de,(#EC11) - ld (#5C8D),hl - ld (#5C8F),de - exx - ld (#EC0F),hl - ld (#EC11),de - ld hl,#EC13 - ld a,(#5C91) ;параметры вывода на экран - ld d,(hl) - ld (hl),a - ld a,d - ld (#5C91),a - pop de - pop hl - pop af - ret - -;АДРЕС: #3BE9 запуск команды randomize 15619: rem: load "boot" -x3BE9 call x3C56 ;пауза 25 фреймов - set 6,(iy+#02) - res 0,(iy+#02) ;вывод на основной экран - rst #08 - db #8D - ld (#EC0E),a ;a=#07 - ld bc,#0000 - call x372B ;установка координат печати из bc - ld hl,#EC0E - ld (hl),#FF - call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) ;адрес начала строки basic - ld a,#08 - rst #08 - db #8C ;bc - длина бейсик-строки для автостарта - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1655 ;резервирование места (длина в bc) - ld de,(#5C59) ;адрес начала строки basic - ld a,#04 - rst #08 ;копирование строки автостарта по адресу в de - db #8C ; и переход на rom 0: #1B11 - ; анализ и выполненение введенной строки -;АДРЕС: #3C1C !!!NOT USED!!! копирование и выполненение бейсик строки -x3C1C nop - jp x1B0F - -;АДРЕС: #3C20 !!!NOT USED!!! бейсик строка -x3C20 db #F9 ;RANDOMIZE - db #C0 ;USR - db #B0 ;VAL - db '"15619":' - db #EA ;REM - db ":" - db #F7 ;RUN - db "92,3MOA" - -;АДРЕС: #3C35 возврат из монтора -x3C35 out (c),d - ld b,#7F - out (c),e - pop de - pop bc - inc sp - pop af - ld r,a - jp po,x3C47 - pop af - ei - ret -x3C47 pop af - di - ret - -;АДРЕС: #3C4A !!!NOT USED!!! вход куда-то (продолжение x08E1) -x3C4A ld (#C001),a - cpl - ld (#C002),a - ld a,#04 - jp x0004 - -;АДРЕС: #3C56 пауза 25 фреймов -x3C56 ei - ld b,#19 -x3C59 halt - djnz x3C59 - ld hl,#5C3B - res 5,(hl) ;клавиша не нажата - scf - ret - -;АДРЕС: #3C63 токенизация строки бейсик программы с синтаксической ошибкой -x3C63 ld a,#01 - jr x3C69 - -;АДРЕС: #3C67 токенизация строки бейсик программы -x3C67 ld a,#00 ;!!! можно xor a -x3C69 ld (#FD8A),a - ld hl,#0000 - ld (#FD85),hl - ld (#FD87),hl - add hl,sp - ld (#FD8B),hl - call x34EA ;обнуление указателей в бейсик строке - ld a,#00 ;!!! можно xor a - ld (#FD84),a - ld hl,#FD74 - ld (#FD7D),hl - call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - call x1F45 ;установка другого стэка и ram 7 - ld a,#00 ;!!! можно xor a - ld (#FD81),a - ld hl,(#5C59) - ld (#FD82),hl - ld hl,#0000 ;!!! можно ld h,a: ld l,a - ld (#FD7F),hl -x3CA1 ld hl,(#FD85) - inc hl - ld (#FD85),hl - call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип - ld c,a - ld a,(#FD81) - cp #00 - jr nz,x3CF4 -x3CB3 ld a,c - and #04 - jr z,x3CED ;это не буква -x3CB8 call x3DE9 ;!!!ОШИБКА - jr nc,x3CC4 ;в буфере нет места - ld a,#01 - ld (#FD81),a - jr x3CA1 -x3CC4 ld hl,(#FD7F) - ld a,l - or h - jp nz,x3D1E ;!!! млжно jr -x3CCC push bc - call x3DCD ;копирование слова из буфера в строку бейсик программы - pop bc - ld a,#00 - ld (#FD81),a -x3CD6 ld a,c - and #01 - jr nz,x3CB3 - ld a,b - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - ret nc - ld hl,(#FD85) - inc hl - ld (#FD85),hl - call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип - ld c,a - jr x3CD6 -x3CED ld a,b - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - ret nc - jr x3CA1 -x3CF4 cp #01 - jr nz,x3CED - ld a,c - and #01 - jr z,x3CB8 - push bc -x3CFE call x3F7E ;распознавание токена - pop bc - jr c,x3D7D ;токен распознан - ld hl,(#FD7F) - ld a,h - or l - jr nz,x3D1E - ld a,c - and #02 - jr z,x3CCC - call x3DE9 ;вставить символ в буфер редактирования - jr nc,x3CC4 ;нет места в памяти - ld hl,(#FD7D) - dec hl - ld (#FD7F),hl - jr x3CA1 -x3D1E push bc - ld hl,#FD74 - ld de,(#FD7F) - ld a,d ;!!!можно оптимизировать - cp h - jr nz,x3D2F - ld a,e - cp l - jr nz,x3D2F - inc de -x3D2F dec de - jr x3D33 -x3D32 inc hl -x3D33 ld a,(hl) - and #7F - push hl - push de - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - pop de - pop hl - ld a,h - cp d - jr nz,x3D32 - ld a,l - cp e - jr nz,x3D32 - ld de,(#FD7F) - ld hl,#FD74 - ld (#FD7F),hl - ld bc,(#FD7D) - dec bc - ld a,d - cp h - jr nz,x3D70 - ld a,e - cp l - jr nz,x3D70 - inc de - push hl - ld hl,#0000 - ld (#FD7F),hl - pop hl - ld a,b - cp h - jr nz,x3D70 - ld a,c - cp l - jr nz,x3D70 - pop bc - jr x3D8F -x3D70 ld a,(de) - ld (hl),a - inc hl - inc de - and #80 - jr z,x3D70 - ld (#FD7D),hl - jr x3CFE -x3D7D push bc - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - pop bc - ld hl,#0000 - ld (#FD7F),hl - ld a,(#FD81) - cp #04 - jr z,x3D94 -x3D8F ld a,#00 - ld (#FD81),a -x3D94 ld hl,#FD74 - ld (#FD7D),hl - jp x3CB3 - -;АДРЕС: #3D9D получить очередной символ из строки бейсик программы и определить его тип -;вых: b - код символа -; a=#01 - прочие символы -; a=#02 - это # или $ -; a=#03 - это пробел -; a=#06 - это буква -x3D9D call x2D54 ;получить очередной символ из строки бейсик программы - ld b,a - cp #3F - jr c,x3DAF - or #20 - call x3DC6 ;проверка символа на принадлежность к буквам нижнего регистра - jr c,x3DC3 ;это буква -x3DAC ld a,#01 ;прочее - ret -x3DAF cp #20 - jr z,x3DC0 ;это пробел - cp "#" - jr z,x3DBD - jr c,x3DAC - cp "$" - jr nz,x3DAC -x3DBD ld a,#02 ;это # или $ - ret -x3DC0 ld a,#03 ;это пробел - ret -x3DC3 ld a,#06 ;это буква - ret - -;АДРЕС: #3DC6 проверка символа на принадлежность к буквам нижнего регистра -;вх: a - клод символа -;вых: cy=1 символ это буква в нижнем регистре -x3DC6 cp #7B - ret nc - cp #61 - ccf - ret - -;АДРЕС: #3DCD копирование слова из буфера в строку бейсик программы -x3DCD ld hl,#FD74 - ld (#FD7D),hl - sub a - ld (#FD7F),a - ld (#FD80),a -x3DDA ld a,(hl) - and #7F - push hl - call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов - pop hl - ld a,(hl) - and #80 - ret nz - inc hl - jr x3DDA - -;АДРЕС: #3DE9 вставить символ в буфер редактирования -;вх: b - код символа -; cy=0 нет места в буфере -x3DE9 ld hl,(#FD7D) - ld de,#FD7D - ld a,d - cp h - jr nz,x3DF8 - ld a,e - cp l - jp z,x3E13 ;!!!можно jr -x3DF8 ld de,#FD74 - ld a,d - cp h - jr nz,x3E03 - ld a,e - cp l - jr z,x3E09 -x3E03 dec hl - ld a,(hl) - and #7F - ld (hl),a - inc hl -x3E09 ld a,b - or #80 - ld (hl),a - inc hl - ld (#FD7D),hl - scf - ret -x3E13 scf - ccf - ret - -;АДРЕС: #3E16 вставка символа в сроку бейсик программы с обработкой < и > -;вх: a - код символа -x3E16 push af ;!!!ОШИБКА!!! - ld a,(#FD89) - or a - jr nz,x3E2F - pop af - cp ">" - jr z,x3E2A - cp "<" - jr z,x3E2A -x3E26 call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - ret ;!!!можно сократить -x3E2A ld (#FD89),a - scf - ret -x3E2F cp "<" - ld a,#00 - ld (#FD89),a - jr nz,x3E52 - pop af - cp ">" - jr nz,x3E41 - ld a,#C9 ;токен <> - jr x3E26 -x3E41 cp "=" - jr nz,x3E49 - ld a,#C7 ;токен <= - jr x3E26 -x3E49 push af - ld a,"<" - call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - pop af - jr x3E26 -x3E52 pop af - cp "=" - jr nz,x3E5B - ld a,#C8 ;токен >= - jr x3E26 -x3E5B push af - ld a,">" - call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - pop af - jr x3E26 - -;АДРЕС: #3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек -;вх: a - код символа -x3E64 cp #0D - jr z,x3E88 ;это enter - cp #EA - ld b,a - jr nz,x3E74 ;это не REM - ld a,#04 - ld (#FD81),a - jr x3E82 -x3E74 cp #22 ;" - jr nz,x3E82 ;это не " - ld a,(#FD81) - and #FE - xor #02 - ld (#FD81),a -x3E82 ld a,b - call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов - scf - ret -x3E88 ld a,(#FD8A) - cp #00 - jr z,x3E99 - ld bc,(#FD85) ;!!!ОШИБКА!!! - ld hl,(#FD8B) - ld sp,hl - scf - ret -x3E99 scf - ccf - ret - -;АДРЕС: #3E9C вставка символа в сроку бейсик программы с игнорированием пробелов -;вх: a - код символа -;вых: a - новые флаги строки -x3E9C ld e,a - ld a,(#FD84) - ld d,a - ld a,e - cp " " - jr nz,x3EC6 ;это не пробел - ld a,d - and #01 - jr nz,x3EBF ;предыдущий символ был токеном - ld a,d - and #02 - jr nz,x3EB7 ;предыдущий символ был пробелом - ld a,d - or #02 - ld (#FD84),a - ret -x3EB7 ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ld a,(#FD84) - ret -x3EBF ld a,d - and #FE - ld (#FD84),a - ret -x3EC6 cp #A3 - jr nc,x3EEE ;это токен - ld a,d - and #02 - jr nz,x3EDA ;последний символ был пробелом - ld a,d - and #FE - ld (#FD84),a - ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ret ;!!!можно сократить -x3EDA push de - ld a," " - call x3EFB ;вставка символа в сроку бейсик программы - pop de - ld a,d - and #FE ;!!!можно сократить - and #FD - ld (#FD84),a - ld a,e ;!!!можно сократить jr x3ED2 - call x3EFB ;вставка символа в сроку бейсик программы - ret ;!!!можно сократить -x3EEE ld a,d - and #FD - or #01 - ld (#FD84),a ;!!!можно сократить jr x3ECF - ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ret - -;АДРЕС: #3EFB вставка символа в сроку бейсик программы -;вх: a - код символа -; de - адрес в строке для вставки -x3EFB ld hl,(#FD87) - inc hl - ld (#FD87),hl - ld hl,(#FD82) ;адрес в строке для следующей вставки - ld b,a - ld a,(#FD8A) - cp #00 ;!!! можно or a - ld a,b - jr z,x3F33 - ld de,(#5C5F) ;адрес символа после маркера ошибки - ld a,h ;!!! можно оптимизировать - cp d - jr nz,x3F30 - ld a,l - cp e - jr nz,x3F30 - ld bc,(#FD85) ;!!!ОШИБКА!!! - ld hl,(#FD87) - and a - sbc hl,bc - jr nc,x3F2A - ld bc,(#FD87) -x3F2A ld hl,(#FD8B) - ld sp,hl - scf - ret -x3F30 scf - jr x3F35 -x3F33 scf - ccf -x3F35 call x1F20 ;установка другого стэка и ram 0 - jr nc,x3F47 - ld a,(hl) ;!!!ОШИБКА!!! inc hl:ld a,(hl):dec hl - ex de,hl - cp #0E - jr nz,x3F5D ;не число - inc de - inc de - inc de - inc de - inc de - jr x3F5D -x3F47 push af - ld bc,#0001 - push hl - push de - call x3F66 ;проверка наличия свободного места в памяти - pop de - pop hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1664 ;обновление системных переменных - ld hl,(#5C65) - ex de,hl - lddr - pop af - ld (de),a -x3F5D inc de - call x1F45 ;установка другого стэка и ram 7 - ld (#FD82),de - ret - -;АДРЕС: #3F66 проверка наличия свободного места в памяти -;вх: bc - количество байт -;вых: если места в памяти нет, переход на обработку ошибки: 4 Out of memory -x3F66 ld hl,(#5C65) - add hl,bc - jr c,x3F76 - ex de,hl - ld hl,#0082 - add hl,de - jr c,x3F76 - sbc hl,sp - ret c -x3F76 ld a,#03 - ld (#5C3A),a - jp x0321 - -;АДРЕС: #3F7E распознавание токена -;вых: cy=1 токен распознан -> a - код токена -x3F7E call #FD2E ;распознавание токена (x33F4) - ret c ;токен не распознан - ld b,#F9 - ld de,#FD74 - ld hl,x3594 ;токены basic 128 - call #FD3B ;распознавание токена (x3401) - ret nc ;токен не распознан - cp #FF ;это CLOSE# ? - jr nz,x3F96 - ld a,#D4 ;CLOSE # - jr x3FB8 -x3F96 cp #FE ;это OPEN# ? - jr nz,x3F9E - ld a,#D3 ;OPEN # - jr x3FB8 -x3F9E cp #FD ;это DEFFN ? - jr nz,x3FA6 - ld a,#CE ;DEF FN - jr x3FB8 -x3FA6 cp #FC ;это GOSUB ? - jr nz,x3FAE - ld a,#ED ;GO SUB - jr x3FB8 -x3FAE cp #FB ;это GOTO ? - jr nz,x3FB6 - ld a,#EC ;GO TO - jr x3FB8 -x3FB6 sub #56 -x3FB8 scf - ret - -;АДРЕС: #3FBA копирование строки из hl в de в (hl+0) кол-во байт -x3FBA ld b,(hl) - inc hl -x3FBC ld a,(hl) - ld (de),a - inc de - inc hl - djnz x3FBC - ret - -;АДРЕС: #3FC3 !!!NOT USED!!! преобразование ASCII в цифру -x3FC3 cp "0" - ccf - ret nc - cp "9"+1 - ret nc - sub #30 - scf - ret - -;АДРЕС: #3FCE обработка нажатой управляющей клавиши -;вых: cy=0, nz - не найден обработчик клавиши -; cy=0, z - клавиша обработана, нужен звуковой сигнал -; cy=1, z - клавиша обработана звуковой сигнал не нужен -x3FCE push bc - push de - ld b,(hl) - inc hl -x3FD2 cp (hl) - inc hl - ld e,(hl) - inc hl - ld d,(hl) - jr z,x3FE1 ;клавиша найдена. в de адрес - inc hl - djnz x3FD2 - scf - ccf - pop de - pop bc - ret -x3FE1 ex de,hl - pop de - pop bc - call x3FEE ;call (hl) - jr c,x3FEB - cp a - ret -x3FEB cp a - scf - ret - -;АДРЕС: #3FEE вызов call (hl) -x3FEE jp (hl) - -;АДРЕС: #3FEF инициалы программистов -x3FEF db #00,"MB" ;Martin Brennan - db #00,"SB" ;Steve Berry - db #00,"AC" ;Andrew Cummins - db #00,"RG" ;Rupert Goodwins - db #00,"KM" ;Kevin Males - db #00,#01 ;end of rom marker - - SAVEBIN "../Build/scorp/NewROM0.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom0.bat b/ProfRom_Disasm/rom0.bat deleted file mode 100755 index 160677f..0000000 --- a/ProfRom_Disasm/rom0.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom0.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2.bat b/ProfRom_Disasm/rom2.bat deleted file mode 100755 index bac81ea..0000000 --- a/ProfRom_Disasm/rom2.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom2_SrvMon.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2_SrvMon.a80 b/ProfRom_Disasm/rom2_SrvMon.a80 deleted file mode 100755 index 506c561..0000000 --- a/ProfRom_Disasm/rom2_SrvMon.a80 +++ /dev/null @@ -1,10349 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 - -;#0000 rst #00 запись байта в память пользователя -;#0006 переход на обработку входа в монитор по NMI/rst 8 -;#0008 rst #08 печать сообщения по номеру в BC -;#000B переход в другой rom -;#000D обработка NMI при активной rom2 -;#0010 rst #10 печать символа в окне -;*not used* #0013 ds 2 -;#0015 вход по rst #08 из basic 48k -;#0018 rst #18 вызов п/п Tr-Dos -;#001B для проверки размера ПЗУ -;#001E вход при включении/reset -;#0020 rst #20 печать строки -;*not used* #0023 ds 3 -;#0026 вход по rst #08 из basic 128k -;#0028 rst #28 чтение байта из памяти пользователя -;*not used* #002D обработка входа в монитор по NMI/rst 8 -;#0030 rst #30 вызов п/п из другого rom -;*not used* #0033 ds 2 -;*not used* #0035 обработка входа в монитор по NMI/rst 8 -;#0038 rst #38 переход на обработку прерываний im 1 -;#003B вход при включении/reset -;#0092 обработка прерываний im 1 -;#009C обработка NMI при активной странице монитора -;#00B6 вход в монитор по NMI/rst 8 -;#00F1 переменные различного характера -;#0101 номер текущего rom -;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -;#0110 Таблица переходов ПрофПЗУ -;#0114 вход в монитор по rst #08 -;#0116 вызов п/п по адресу в BC с задержкой call (bc) -;#011D вход в монитор по кнопке NMI -;#013A выход из монитора -;#0167 вход в монитор по rst #08 -;#01F5 вызов функции rst #08 -;#0241 пауза 26698t -;#024C установка номера дисковода -;#025E определение наличия Турбои и оригинальности (колво тактов) -;#02A5 печать сообщения по номеру в BC -;#02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) -;#02AE rst 8: db #8D хрень какая-то непонятная -;#02CC rst 8: db #8C автостарт с дискеты -;#02D1 установка двойной скорости (rst 8: db #87) -;#02D7 установка обычной скорости (rst 8: db #88) -;не используется??? #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! -;#02F4 rst 8: db #81 вызов функции R8DOS -;#0310 сохранение регистров для основной программы -;#0321 работа с микросхемой CMOS (rst 8: db #89) -;#032A чтение регистров основной программы -;#0339 установка переменных монитора (rst 8: db #82) -;#035F вывод символа на экран пользователя (rst 8: db #84) -;#0368 отключение монитора - отладчика (rst 8: db #85) -;#0370 возврат в отладчик -;#0373 установка текущим блока дисководов монитора -;#0398 запись в регистр 7 AY числа #FF -;#03A7 Запись регистра AY -;#03B6 чтение регистра AY -;#03C2 восстановление содержимого регистра 7 AY -;#03CE сохранение регистров и стэка в ram 8 -;#04CE восстановление режима Турбо -;#04D5 включение Турбо-режима -;#04D9 выключение Турбо-режима -;#04E2 восстановление регистров пользователя -;#0550 сохранение экрана из страницы 5 -;#0557 вход в монитор после трассировки команды -;#055B сохранение экрана из страницы 5 -;#0581 восстановление экрана в странице 5 -;#0589 установка зеленого бордюра (индикация ошибки) -;#058E чтение/запись байта в память пользователя -;#0603 копирование памяти с #8000 в страницу пользователя -;#0606 копирование страницы пользователя в #8000 -;#0665 включение режима 48k only -;#066D повторная инициализация страниц (если битая) -;#0732 установка координат печати crdY=рег C, crdX=#24 -;#0739 копирование части закодированных процедур в ram 8 с раскодированием -;#0749 восстановление области памяти из ram 8 -;#0753 сохранение области памяти в ram 8 -;#08B7 таблица с адресами обработки функций rst 8 -;#08D3 rst 8: db #86 Копия графического экрана на принтер -;#08D7 печать текущего меню монитора -;#0911 rst 8: db #80 Вывод символа из аккумулятора на принтер -;#0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) -;#0950 вывод символа на принтер -;#0A33 проверка нажатия BREAK -;#0A51 печать экрана на принтер -;#0AD7 Команда: EXit выход из отладчика в меню -;#0AE0 печать/обновление окна отладчика -;#0AEB вызов отладчика M. Monitor -;#0AF2 полное обновление окна отладчика -;#0AFB обновление окна отладчика, без информационного окна -;#0B06 ввод и обработка команды отладчика -;#0C98 чтение числового операнда из строки команды -;#0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) -;#0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D -;#0D46 проверка символа в (hl) #2C/#3B/#00/#0D -;#0D55 чтение из строки команды чилового/байта строкового значения -;#0DEC таблица префиксов и основания систем счислений -;#0DF4 преобразование строки в число -;#0E73 деление bc=hl/de с проверкой de на ноль -;#0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -;#0EBA выделение из строки числовых операндов (не более 6) -;#0EE3 поиск в буфере ввода строки первого печатного символа -;#0EE6 поиск в строке первого печатного символа -;#0EF0 поиск заданной команды в списке -;#0F91 названия регистров для монитора -;#0FA0 названия регистров для монитора -;#1037 инициализация системы и чтение настроек Autoconfig -;#1101 редактирование дампа памяти в окне монитора -;#1107 таблица мнемоник -;#1196 операнды/флаги ассемблера -;#11F7 мнемоники ассемблера -;#12D2 таблица для формирования команд дизасма -;#14B2 таблица для формирования команд дизасма -;#14F6 проверка значения аккумулятора -;#14FD проверка значения аккумулятора -;#1504 проверка значения аккумулятора -;#150B проверка значения аккумулятора -;#1512 печать команды ассемблера -;#1570 печать мнемоники ассемблера с пробелом на конце -;#157F печать операнда/числа команды ассемблера -;#15B3 печать сообщения из hl длиной b -;#15B9 печать сообщения из hl с заменой непечатных символов на ? -;#15C7 печать сообщения из hl -;#15D0 печать сообщения по номеру (на экран/в буфер) -;#15DB печать сообщения из hl -;#15DD печать сообщения не менее заданной длины -;#15F3 печать нескольких пробелов (в B) -;#15FA печать сообщения по номеру в A -;#15FC печать сообщения по номеру в A, не менее заданной длины в С -;#1612 печать числа в hl (dec/hex) с префиксом -;#1614 печать числа в bc (dec/hex) с префиксом -;#1626 печать числа из (hl) (dec/hex) с префиксом -;#1629 печать числа в bc (bin/oct/dec/hex) с префиксом -;#162C печать числа в заданной системе счисления -;#1658 печать числа A с предварительным пробелом -;#165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -;#1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;#1669 печать десятичного числа bc [0..65535] с ведущими пробелами -;#166E печать десятичного числа bc [0..65535] с ведущими пробелами -;#1673 печать числа bc (на экран/в буфер) -;#1677 печать числа bc (на экран/в буфер) -;#16AA деление bc=ac/de -;#16D0 печать строки (rst #20) -;#16DE печать числа hl=[#0000..#FFFF] -;#16E3 печать числа a=[#00..#FF] -;#16EC печать числа a=[#0..#F] -;#16FF исполнение зарезервированных слов анализатора st0-st9 -;#17F0 выполнение одной команды по адресу в PC -;#191E проверка попадания адреса на адреса #3D00-#3DFF -;#197F анализ команды ассемблера -;#1DD0 список команд отладчика -;#1DE5 выполнение слова анализатора -;#1E0F установка кода команды в программу анализатора -;#1E45 Команда: FLOAD track, sector, start, length -;#1E4F Команда: FSAVE track, sector, start, length -;#1E59 открытие файла для чтения/записи программы анализатора -;#1E76 Команда: DEFSave filename -;#1EA5 Команда: DEFLoad filename -;#1F25 Команда: CLear -;#1F42 Команда: ANalyser boolean -;#1F5B поиск введенного слова в словаре/программе пользователя -;#1FB0 Команда: WORD word[:] program -;#2093 Команда: EDit -;#20C8 печать редактируемого слова -;#2104 печать слова анализатора -;#2112 поиск начала и печать слова анализатора -;#2121 чтение ld bc,(hl+1): hl=hl+2 -;#2148 Команда: WORD word[:] program Продолжение (для переопределения уже определенных слов) -;#2214 Команда: PDEFinition вывод на принтер Форт - программы -;#2218 Команда: LDEFinition вывод на экран Форт - программы -;#2297 Команда: EVal word выполнить слово word -;#234D запись элемента на стэк анализатора -;#2364 установка нового значения вершины стэка анализатора -;#236A запись на стэк анализатора байта из ячейки памяти пользователя -;#2374 запись на стэк анализатора слова из ячеек памяти пользователя -;#237F чтение элемента с вершины стэка анализатора -;#2398 чтение двух элементов с вершины стэка анализатора -;#23A3 базовые слова анализатора -;#27DC список управляющих кодов -;#27E7 таблица с адресами обработки управляющих кодов -;#27FD удаление курсора и печать символа в окне -;#2800 печать символа в окне -;#28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) -;#28C5 сохранение экрана под курсором (6 пикселей символ) -;#28E8 печать/удаление курсора в окне -;#28F6 мигание текстового курсора в строке ввода -;#292F расчет экранного адреса курсора в окне для символов 6 пикселей -;#2959 расчет координат курсора на экране для символов шириной 8 пикселей -;#2969 расчет адреса курсора в области атрибутов для символов 8 пикселей -;#297C расчет экранного адреса курсора в окне для символов 8 пикселей -;#298E скроллинг окна вверх -;#29D0 скроллинг строки данных окна -;#29FB скроллинг строки атрибутов окна -;#2A1B обработка управляющего кода #1E (скроллинг окна ввниз) -;#2A5B очистка окна пользователя (rst 8: db #83) -;#2A5E обработка управляющего кода #0C (очистка текущего окна) -;#2A85 очистка знакоместной строки по координатам курсора -;#2AAD обработка управляющего кода #04 (вывод с выравниванием) -;#2ABB расчет для выравнивания строки -;#2ACA печать строки из буфера с выравниваем по центру окна #05 -;#2AED печать строки из буфера с выравниваем по правому краюу окна #06 -;#2AF2 обработка байта после управляющего кода #04 -;#2B07 возврат из п/п печати символа -;#2B0B печать символа со сбросом 7го бита (rst #10) -;#2B10 печать пробела (rst #10) -;#2B12 печать символа (rst #10) -;#2B63 установка адреса п/п обработки управляющего кода -;#2B6E обработка управляющего кода #0D (возврат каретки) -;#2B7D обработка управляющего кода #0A (перевод строки) -;#2B9D установка начальных координат -;#2BA8 короткий звуковой сигнал c установкой бордюра -;#2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) -;#2BF8 обработка управляющего кода #01 (установка атрибутов) -;#2C18 обработка управляющего кода #02 (восстановление атрибутов) -;#2C1F определение турбо-режима -;#2C30 определение турбо-режима вкл/выкл -;#2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -;не используется #2C7A чтение байта по адресу #00FB -;#2C7E поиск и вызов процедуры обработки без возврата(если не найдено возврат) -;#2C92 выполнение одной команды ассемблера с контролем ловушек -;#2CA8 печать/обновление монитора-отладчика -;#2E25 печать байта из L в двоичном виде -;#2E38 печать дампа памяти в окне -;#2E76 удаление курсора на предыдущей ячейке дампа -;#2E3D печать дампа памяти в окне -;#2EBA печать одной строки дампа памяти (8 байт) -;#2EBE печать одной строки дампа памяти (8 байт) -;#2F74 вывод дисасма памяти по адресу в de -;#2F96 анализ команды ассемблера -;#2FAC печать строки дизасма -;#2FED печать пробелов до правого края окна -;#2FF1 печать пробелов до заданной координаты X -;#2FFB установка текущим окна: ввод числа -;#3005 установка текущим окна: main menu -;#300A ix = адрес дескриптора окна монитора: вывод на принтер -;#300F чтение содержимого регистра ix основной программы -;#3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана -;#3019 ix = адрес дескриптора окна монитора: дамп памяти -;#301C ix = адрес дескриптора окна монитора из hl -;#3023 ожидание действий пользователя (опрос управления, вывод часов) -;#302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне -;#303C выполнение команды, на которую указывает PC (cs+3) -;#303F выполнение команды, на которую указывает PC с быстрым выполнением подпрограмм (cs+4) -;#3052 заглушка входа в монитор при несовпадении контрольной суммы -;#305B блокировка работы при ошибке контрольной суммы -;#3065 установка регистров для загрузки/сохранения -;#3074 Команда: ERAse filespec -;#3085 Команда: SAVE filespec start,length -;#3095 Команда: LOAD filespec [start[,length]] -;#30D8 чтение файла в память -;#3107 запись области памяти в файл -;#3135 подсчет контрольной суммы страницы -;#3161 список команд отладчика -;#318C Команда III (работа с контроллером прерываний) -;#3194 Команда OOO (работа с контроллером прерываний) -;#319C Команда CMOS (работа с контроллером прерываний) -;#31A4 Команда RESNVRAM (что-то пишет в NVRAM) -;#31AB Команда: SLOW type автоматическая трассировка -;#31C1 Команда: LISTBreak/LBreak -;#3201 печать ON/OFF от флага nz-ON/z-OFF -;#3210 определение адреса ловушки -;#3222 восстановление памяти пользователя под всеми ловушками -;#3228 сохранение памяти пользователя под всеми ловушками и установка ловушек -;#3281 установка начала списка ловушек -;#328B проверка срабатывания ловушки -;#32AF Команда: DELBreak number -;#32E2 Команда: BRK number, [on|off] -;#3303 Команда: BREak number, type, addr, int_count[,bank] -;#330B установка ловушки #8, по текущему адресу листинга дизасма -;#3326 удаление ловушки #8 -;#3333 Команда: OPTion bit on|off -;#3360 Команда: OUT addr, data -;#336C Команда: OUTD addr, data -;#337A Команда: IND addr -;#3383 Команда: IN addr -;#3389 Команда: ?data -;#33BB установка и очистка информационного окна отладчика -;#33CD печать информационного окна отладчика -;#33D2 Команда: SHow -;#3432 Команда: BASE 0|2|8|10|16 -;#344F Команда: WORKspace addr -;#3461 Команда: SEarch addr_st, addr_end, bank, data -;#346A Команда: FINd addr_st, addr_end, data -;#3517 продолжение поиска в отладчике (для команд FIND/SEARCH) -;#352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] -;#356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] -;#35D3 сравнение ix=xE075 -;#35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -;#35F5 Команда: FILl addr_st, addr_end, byte [,bank] -;#360D Команда: DATA addr, data -;#3614 Команда: .PC data -;#361E Команда: .data -;#3640 pop de со стэка пользователя -;#364D Команда: POP -;#3655 переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти -;#365C Команда: MEMory addr -;#3662 Команда: EXX -;#3666 Команда: EX AF -;#3683 Команда: INTerrupt on|off -;#3699 Команда: CALl [[addr],bank] -;#36B4 Команда: Jump [[addr],bank] -;#36C3 запись стандартного Magic-файла -;#36DB Команда: ROM bank -;#36F9 получение номера логической страницы пользователя a=[#0..#F] -;#3707 сравнение страницы пользователя с заданной -;#370C Команда: RAM -;#3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL -;#371D установка страницы пользователя равной номеру страницы в HL -;#3732 установка страницы пользователя равной номеру страницы в L -;#3778 Команда: SCReen [on|off|5|7] -;#37B9 управление выводиммым листингом (опрос клавиш space, s, cs+1) -;#3807 пауза 40416t -;#382E ожидание отжатия всех клавиш -;#3837 копирование блока памяти в ram 8 с раскодированием -;не используется #385D не используется -;не используется #3860 не используется -;#3870 печать сообщения и продолжение работы текущего меню монитора -;#3884 получить адрес, на который ссылается команда ассемблера -;#38D8 быстрый вход в команду DASM -;#38E2 Команда: DASm вывод листинга дизасма -;#39A8 Печать одной строки листинга дизасма -;#39EB Команда: LCATalogue [num_drive] -;#39EF Команда: CATalogue [num_drive] -;#3A10 Команда: PUSH data -;#3A14 запись de на стэк пользователя -;#3A21 копирование активного экрана пользователя в #4000 -;#3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -;#3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти на принтер. -;#3A60 Команда: DISs [addr_st [,addr_end]] реассемблирование блока памяти с адреса addr_st по addr_end включительно -;#3A68 Команда: LDUmp [addr_st[,addr_end]] -;#3A71 Команда: DUmp [addr_st[,addr_end]] -;#3A93 вызов п/п по адресу в bc - call (bc) -;#3A95 подготовка переменных к выводу на экран/принтер -;#3AC8 Команда: VList -;#3AD0 Команда: Help -;#3AF9 вызов п/п по адресу в de - call (de) -;#3AFB печать команды отладчика -;#3B55 Команда: IM -;#3B75 определение типа прерываний im 1/2 -;#3B7F установка переменных по конкретным адресам -;#3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE -;#3C01 некодированные процедуры переключения страниц -> ram 8 xE42D -;#3D01 список команд отладчика -;#3E25 чтение портов #1FFD/#7FFD -;#3E2C адреса обработки команд отладчика -;#3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED -;#3EDA данные для установки переменных по конкретным адресам -;#3EE6 названия месяцев -;#3F0A Названия дней недели -;#3F1F free #00E1(225) bytes -;#4000 - - - -;АДРЕС: #0000 запись байта в память пользователя (rst #00) -;вх: hl - адрес в памяти -; a - байт для записи -x0000 scf - bit 7,h -x0003 jp x058E -x0006 jr x0069 -x0008 jp x02A5 ;rst #08 печать сообщения по номеру в BC -x000B out (c),a ;переход в другой rom -x000D jp x009C ;обработка NMI при активной rom2 -x0010 jp x2B12 ;rst #10 печать символа в окне -x0013 nop - nop -x0015 jp x00B6 ;вход по rst #08 из basic 48k -x0018 jp xE41B ;rst #18 вызов п/п Tr-Dos -x001B ld a,#00 ;для проверки размера ПЗУ - ret -x001E jr x003B ;вход при включении/reset -x0020 jp x16D0 ;rst #20 печать строки -x0023 nop - nop - nop -x0026 jr x0069 ;вход по rst #08 из basic 128k - -;АДРЕС: #0028 чтение байта из памяти пользователя (rst #28) -;вх: hl - адрес в памяти -x0028 or a - bit 7,h - jr x0003 -x002D jp x00B6 -x0030 jp xE3D3 ;rst #30 вызов п/п из другого rom -x0033 nop - nop -x0035 jp x00B6 ;сюда переходим по NMI из Tr-Dos -x0038 jp x0092 ;переход на обработку прерываний im 1 - -;АДРЕС: #003B вход при включении/reset -;вх: bc=#1FFD -x003B ld b,#7F - xor a - out (c),a ;ram 8 -x0040 ld sp,#5BFF - ld b,#00 - jr x0049 -x0047 out (c),a ;завершение инициализации и переход в basic 128k -x0049 ld hl,#EAF5 ;проверим память 8й страницы -x004C ld a,b - cp (hl) - inc hl - jr nz,x007B ;ram 8 испорчена. полный сброс - djnz x004C - ld hl,(#E028) -x0056 push hl ;hl=#0000 при полной инициализации - call x1037 ;инициализация системы и чтение настроек Autoconfig - pop hl - ld bc,#7FFD - xor a - ld (x5B88),a - out (c),a ;ram 0/8 - jr x006C -x0066 jp x000D ;нажатие Magic при активной rom2 -x0069 jp x00B6 -x006C ld b,#1F - rlc l - ld hl,#00C7 - jr nc,x0078 - ld hl,#00ED -x0078 push hl - jr x0047 ;rom 0 (basic 128k) -;8я страница испорчена. полная иницаиализация -x007B call x0672 - pop bc ;bc=x3135 - call x3A93 ;вызов п/п по адресу в bc (подсчет контрольной суммы страницы) - xor a ;hl=#00F6 - ld l,a ;hl=#0000 - ld i,a - im 0 - ei - halt - im 1 - halt - im 2 - halt - jr x0056 - -;АДРЕС: #0092 обработка прерываний im 1 -;вых: a=0, b=0, d=d+1 -x0092 ld a,#00 - djnz $ - cp b - jr nz,x009A - inc d -x009A ei - ret - -;АДРЕС: #009C обработка NMI при активной странице монитора -x009C push af - ld a,r - push af - ld a,#08 ;вход при активной странице монитора - push af - inc sp - push bc - push hl - ld hl,(xC001) - ex (sp),hl - ld a,#55 - ld (xC001),a - cpl - ld (xC001+1),a - ld bc,#1FFD - -;АДРЕС: #00B6 вход в монитор по NMI/rst 8 -x00B6 di - ld a,#12 - out (c),a ;rom 2 - ld b,#7F - ld a,#10 - out (c),a ;ram 8 - ld (xDD6D),sp - ld (xDDF7),sp ;сохраним адрес стэка - ld sp,xE38D ;новый стэк - ld bc,(xC064) - ld a,c - or b - jr nz,x0116 ;вызов процедуры вместо входа в монитор - call x03CE ;сохранение регистров и стэка в ram 8 - call x0398 ;запись в регистр 7 AY числа #FF - ld a,(xDD86) ;номер rom откуда зашли - cp #80 - jp z,x0922 - call x3222 ;восстановление памяти пользователя под всеми ловушками - ld a,(xDD86) ;номер rom откуда зашли - and #03 - jr nz,x0114 ;вход по rst #08 из basic 128k или basic 48k - call x0373 ;установка текущим блока дисководов монитора - jr x011D ;вход в монитор по кнопке NMI - -x00F1 db #61 ;второй байт сигнатуры программы анализатора -x00F2 db #6F -x00F3 db #08 -x00F4 db #35 ;байт для раскодирования -x00F5 db #CA ;байт для раскодирования блока атрибутов монитора -x00F6 db #80 -x00F7 db #71 -x00F8 db #1A -x00F9 db #6B -x00FA db #D7 -x00FB db #01 -x00FC db #05 ;байт для раскодирования процедур -x00FD db #07 ;байт для раскодирования процедур -x00FE db #61 ;байт для раскодирования процедур -x00FF dw xE516 ;адрес п/п обработки прерываний im 2 - -;АДРЕС: #0101 номер текущего rom -x0101 db #02 - -;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -x0102 ds #0E - -;АДРЕС: #0110 Таблица переходов ПрофПЗУ -x0110 db #00,#0C,#08,#04 - -;АДРЕС: #0114 вход в монитор по rst #08 -x0114 jr x0167 - -;АДРЕС: #0116 вызов п/п по адресу в BC с задержкой call (bc) -x0116 push bc -x0117 dec bc - ld a,b - or c - jr nz,x0117 - ret - -;АДРЕС: #011D вход в монитор по кнопке NMI -x011D ld a,(xE039) ;значение NMI debouncing - ld b,a -x0121 call x0241 ;пауза 26698t - djnz x0121 - call x2C30 ;определение турбо-режима вкл/выкл -x0129 bit 0,(iy+#12) - jr z,x0136 ;отладчик не запущен - ld a,(xC063) - or a - jp z,x0AF2 ;печать окна отладчика -x0136 rst #30 ;отладчик отключен - dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) - db #05 - -;АДРЕС: #013A выход из монитора -x013A call x0370 ;возврат в отладчик -x013D ld sp,xE38D - call x0581 ;восстановление экрана в странице 5 -x0143 call x3228 ;сохранение памяти пользователя под всеми ловушками и установка ловушек -x0146 call x024C ;установка номера дисковода - res 3,(iy+#12) ;сброс признака сохранения экрана в ram 8 - ld a,(xDD86) ;номер rom откуда зашли - and #0C - call nz,xE483 ; - call x03C2 ;восстановление содержимого регистра 7 AY - res 7,(iy+#12) ; - call x04E2 ;восстановление регистров пользователя - xor a - ld sp,(xDD6D) ;указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке - jp x000B ;возврат в rom пользователя - -;АДРЕС: #0167 вход в монитор по rst #08 -x0167 ld hl,(xDD6B) ;pc программы пользователя - dec hl - ld (xDD6B),hl ;назад, на длину команды rst 8 - ld a,(xE026) - bit 5,a - jr z,x018E -;выполняется трассировка команды из отладчика - ex de,hl - ld hl,(xE11A) ;адрес начала буфера для трассировки команды - push hl - scf - sbc hl,de - ex de,hl - pop de ;адрес начала буфера для трассировки команды - jr nc,x018E ;PC не в пределах буфера - ex de,hl - push de - ld de,#0008 - add hl,de - pop de - sbc hl,de - ex de,hl - jp nc,x0557 ;PC пользователя попадает на буфер с командой трассировки -> значит это выход из трассировки -;проверка ловушек -x018E bit 4,a - res 4,(iy+#12) - jr nz,x01F2 ;при вызове команды CALL отладчика - call x328B ;проверка срабатывания ловушки - ld e,#00 ;de=#0000, b - обратный номер ловушки - jr c,x01F5 ;нет сработавших ловушек. вызов функции rst #08 -; проверка проходов по ловушке -x019D ld l,(ix+#07) - ld h,(ix+#08) - ld a,l - or h - jr z,x01B2 ;нужный проход по ловушке - dec hl ;уменьшим счетчик проходов - ld (ix+#07),l - ld (ix+#08),h - ld a,h - or l - jr nz,x01E0 ;счетчик проходов еще не пустой -; сработала ловушка -x01B2 ld l,(ix+#05) - ld (ix+#07),l - ld h,(ix+#06) - ld (ix+#08),h - push ix - pop hl - bit 1,(hl) - jr nz,x01C7 ;ловушка не активна - res 7,(hl) ;ловушка больше не задана -x01C7 ld a,#09 ;b - обратный номер ловушки - sub b ;a - номер ловушки - call x3210 ;определение адреса ловушки -; работа анализатора - push af - call nz,x1DE5 ;выполнение слова анализатора - pop af -; вход в отладчик по сработавшей ловушке -x01D2 ld l,a - ld a,#83 ;сообщение: breackpoint _число_ -x01D5 ld h,#00 - ld (xDDA7),hl ;число для печати - call x0373 ;установка текущим блока дисководов монитора - jp x0B06 ;ввод и обработка команды отладчика -x01E0 bit 7,e - jp nz,x2C9D ;печать отладчика - ld sp,xE336 - res 7,(iy+#16) - call x17F0 ;выполнение одной команды по адресу в PC -x01EF jp x0143 ;выход из монитора -x01F2 xor a - jr x01D2 - -;АДРЕС: #01F5 вызов функции rst #08 -;вх: 7,e =1 - трассировка в отладчике -; =0 - вызов функции rst #08 -; hl - PC пользователя -x01F5 push de - inc hl - rst #28 ;чтение номера функции rst #08 - cp #FF - jr z,x0200 - sla a - jr c,x0225 ;это функция rst #08 - -;обработчик ошибок стандартного Basic -x0200 ex de,hl - call x3A14 ;запись de на стэк пользователя - bit 4,(iy-#02) - jr z,x01F2 ;был включен Basic 128k при вызове rst #08 - ld hl,(#5C5D) - ld (#5C5F),hl - ld hl,#0053 ;новый pc программы пользователя - ld (xDD6B),hl - -;возврат после отработки функции, вызванной пользователем -x0216 res 5,(iy+#0B) ;функции вызываются из монитора - pop de - bit 7,e - jr z,x01EF ;;выход из монитора - ld hl,(xDD6B) ;PC программы пользователя - jp x18C0 ;исполнение зарезервированных слов анализатора st0-st9 - -;определение адреса и вызов функции rst #08 -x0225 cp #1B - jr nc,x0200 ;не существующий номер функции - inc hl - ld (xDD6B),hl ;PC пользщователя - ld hl,x0216 ;сюда вернемся после отработки - push hl - set 5,(iy+#0B) ;функция вызвана пользователем - ld hl,x08B7 ;таблица с адресами обработки функций rst 8 - ld e,a - ld d,#00 - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - jp (hl) - -;АДРЕС: #0241 пауза 26698t -x0241 push bc - ld bc,#0400 -x0245 dec bc - ld a,c - or b - jr nz,x0245 - pop bc - ret - -;АДРЕС: #024C установка номера дисковода -x024C ld a,(xFFDC) - bit 5,a - ld a,(xFFCA) - jr nz,x025A ;блок дисководов монитора - ld (xE9F2),a ;блок дисководов пользователя - ret -x025A ld (xE9F1),a - ret - -;АДРЕС: #025E определение наличия Турбои и оригинальности (колво тактов) -x025E call x04D9 ;выключение Турбо-режима - call x04D5 ;включение Турбо-режима - ld a,#AF ;xor a - ld (xE516),a - call x2C1F ;определение турбо-режима - jr z,x0276 ;турбо выключен - ld a,(xE02D) ;турбо включен и доступен - or %11000000 - ld (xE02D),a -x0276 ld (xE523+#08),hl ;!!! непонятно !!! - ld a,#CD ;call #nnnn - ld (xE51C),a - ld c,#FF ;???определение скорости??? - xor a - ld e,a - ld d,a - inc a - ld b,a - ei - halt - inc a - ld b,a -x0289 call xE483 ;ret - db #ED,#70 ;in (c) - call xE483 - dec de - or a - jr nz,x0289 - di - rst #30 - dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер - db #04 - ld (xDFFC),de - xor a - jp nz,x3052 ;!!!тут перехда не будет никогда!!! - jp x0056 - -;АДРЕС: #02A5 печать сообщения по номеру в BC -x02A5 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) -;вх: +1 =#00 используем имя bootm -; a - номер дисковода -;вх: +1 ="filename",#00 - имя файла -x02AA rst #30 - dw rom6_x093F ;rst 8:db #8B загрузка zs-snap с диска - db #06 - -;АДРЕС: #02AE rst 8: db #8D хрень какая-то непонятная -;вых: a =#07 -x02AE ld a,#07 - ld (xDD7F+#01),a ;регистр A пользователя - rst #30 - dw rom7_x155A ;чтение заголовка первого попавшегося сектора дисковода A - db #07 - rst #30 - dw rom7_x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - db #07 - ret nz ;подключен образ - ld hl,#E005 -x02BF in a,(#1F) - and h - jr z,x02BF - ret m ;7,a =1 ВГ93 готов - ret pe ;7-5,a =011 - res 5,h ;7-5,a =000/010 - inc (hl) - inc hl - ld (hl),l - ret - -;АДРЕС: #02CC rst 8: db #8C автостарт с дискеты -;вх: a =#0C -> вых: нажатие Enter и переход на rom 0: #259F -; =#08 -> вых: bc - длина бейсик-строки для автостарта -; =#nn -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 -x02CC rst #30 - dw rom7_x01AF ;автостарт с дискеты - db #07 - ret - -;АДРЕС: #02D1 установка двойной скорости (rst 8: db #87) -x02D1 call x02DD - set 6,(hl) - ret - -;АДРЕС: #02D7 установка обычной скорости (rst 8: db #88) -x02D7 call x02DD - res 6,(hl) - ret -x02DD xor a - ld hl,xE02D - bit 7,(hl) - jr nz,x02E7 - inc a - pop bc -x02E7 ld (xDD7F),a ;регистр f, флаг c - ret - -;АДРЕС: #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! -x02EB call x032A ;чтение регистров основной программы - rst #30 - dw rom5_x043B ;ОШИБКА!!!! вызов процедуры по номеру в C - db #05 - jr x0310 ;сохранение регистров для основной программы - -;АДРЕС: #02F4 rst 8: db #81 вызов функции R8DOS -x02F4 ld hl,xEA49 ;блок пользовательский дисководов - ld (xE9F3),hl - ld hl,xFFDC - bit 5,(hl) - jr z,x0309 - res 5,(hl) ;работа с дисководом пользователя - ld a,(xE9F2) - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -x0309 call x032A ;чтение регистров основной программы - rst #30 ;обработка функции rst8dos #81 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - -;АДРЕС: #0310 сохранение регистров для основной программы -x0310 ld (xDD77),bc - ld (xDD75),de - ld (xDD73),hl - push af - pop hl - ld (xDD7F),hl - ret - -;АДРЕС: #0321 работа с микросхемой CMOS (rst 8: db #89) -x0321 call x032A - rst #30 - dw rom5_x1C0D - db %00000101 - jr x0310 - -;АДРЕС: #032A чтение регистров основной программы -x032A ld hl,(xDD73) - ld de,(xDD75) - ld bc,(xDD77) - ld a,(xDD7F+#01) - ret - -;АДРЕС: #0339 установка переменных монитора (rst 8: db #82) -;вх: --- -; -x0339 ld de,x0357 - ld hl,(xDD75) ;регистр de (номер блока переменных) - add hl,de - ld e,(hl) - inc hl - ld d,(hl) ;адрес начала блока переменных - ld hl,(xDD77) ;регистр bc (номер переменной) - add hl,de ;адрес переменной - ld a,(xDD7F) ;регистр f (флаг cy) - rrca - jr c,x0352 ;запись - ld a,(hl) ;чтение - ld (xDD7F+#01),a ;регистр a (результат) - ret -x0352 ld a,(xDD7F+#01) ;запись - ld (hl),a - ret -x0357 dw xE014 ;de =0 - dw xE04E ;de =2 - dw xFFC0 ;de =4 - dw xEAED ;de =6 - -;АДРЕС: #035F вывод символа на экран пользователя (rst 8: db #84) -x035F call x300F ;регистр ix - ld a,(xDD7F+#01) ;регистр a - jp x2B12 ;печать символа - -;АДРЕС: #0368 отключение монитора - отладчика (rst 8: db #85) -;вх: a<>0 -; -x0368 ld (xC063),a - res 7,(iy+#14) - ret - -;АДРЕС: #0370 возврат в отладчик -x0370 push af - jr x0388 - -;АДРЕС: #0373 установка текущим блока дисководов монитора -x0373 push af - ld hl,xE9F5 - ld (xE9F3),hl ;установка блока описателей дисководов - ld hl,xFFDC - set 5,(hl) - ld a,(xE9F1) - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - call x0550 ;сохранение экрана из страницы 5 -x0388 ld a,(x00FB) ;проврека страницы - ld hl,xE00D - cp (hl) - call nz,x2BA8 ;это не страница с монитором. короткий звуковой сигнал c установкой бордюра - pop af - pop hl - ld sp,xE336 - jp (hl) ;возврат (ret) - -;АДРЕС: #0398 Запись в регистр 7 AY числа #FF -x0398 bit 0,(iy+#14) - ret nz - ld b,#07 ;чтение регистра #7 AY - call x03B6 - ld (xE004),a - ld a,#FF - -;АДРЕС: #03A7 Запись регистра AY -x03A7 push bc - push af - ld a,b - ld bc,#FFFD - out (c),a - pop af - ld b,#BF - out (c),a - pop bc - ret - -;АДРЕС: #03B6 чтение регистра AY -;вх: b - номер регистра -;вых: a - значение регистра -; -x03B6 push bc - ld a,b - ld bc,#FFFD - out (c),a - nop - in a,(c) - pop bc - ret - -;АДРЕС: #03C2 Восстановление содержимого регистра 7 AY -x03C2 bit 0,(iy+#14) - ret nz - ld b,#07 - ld a,(xE004) - jr x03A7 - -;АДРЕС: #03CE Сохранение регистров и стэка в ram 8 -x03CE ld bc,#1FFD - ld (xDDA7),sp - ld sp,xDD83 - ex af,af' - push af - ex af,af' - push af - exx - push bc - push de - push hl - exx - push bc - push de - push hl - push iy - push ix - ld iy,xE014 - - ld hl,(xDD6D) ;поиск страницы установленной при входе в монитор - ld de,#0200 ;и определение конфигурации 128k/48k -x03F2 ld bc,#7FFD - out (c),e - ld b,#1F - out (c),d ;rom 2, ram 0 - ld a,(#C001) - cp #55 -x0400 jr z,x0412 -x0402 inc e - bit 3,e - jr z,x03F2 - ld e,#00 - bit 4,d - jp nz,x0589 ;не найдено зеленый бордюр и выход - ld d,#12 - jr x03F2 -x0412 ld a,(#C002) - cp #AA - jr nz,x0402 - ld sp,hl ;страница найдена - pop hl - ld (#C001),hl ;восстановим байты на этой странице - ld b,#1F - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - res 1,d - ld (xE012),de - ld a,#15 ;проверим достуна ди память выше 128k - out (c),a ;ram #D - ld hl,(#C001) - ld (#C001),a - ld a,#10 - out (c),a ;ram 8 - ld (#C001),a - ld a,#15 - out (c),a ;ram #D - ld a,(#C001) - ld (#C001),hl - cp #15 - jr z,x0453 ;память доступна - ld a,e ;режим 48k - or #30 - ld e,a -x0453 ld a,#10 - out (c),a ;ram 8 - ld sp,(xDDA7) - ld a,(#5B5C) ;определяем активный экран по переменной bas128k - and %00001000 - bit 5,e - jr nz,x0466 ;only 48k - or e ;scr 5/7 при входе - ld e,a -x0466 ld a,(xE012) - or e - ld (xE012),a - ld hl,(xDD6D) ;коррекция вершины стэка программы - push hl - ld bc,#000B - add hl,bc - ld (xDD6D),hl - pop hl - ld de,xDD99 ;сохранение стэка в ram 8 - call x0753 - - ld hl,(xDDA2) ;адрес возврата - ld (xDD6B),hl - ld hl,(xDDA0) ;регистр af - ld (xDD7F),hl - ld hl,(xDD9E) ;коррекция регистра r - ld a,h - sub #04 - rlca - sla h - rra - ld h,a - ld (xDD83),hl - ld hl,(xDD9B) ;регистр bc - ld (xDD77),hl - ld a,i ;сохраним регистр i - ld (xDD85),a - xor a - ld i,a - ld a,(xDD9D) ;номер rom откуда зашли - ld (xDD86),a - and %00000110 - ld a,(xE012) - jr z,x04B6 - or #10 -x04B6 ld (xE012),a - - ld hl,xE026 - bit 7,(hl) - set 7,(hl) - jr z,x04CD - ld b,#00 -x04C4 ld a,#06 - out (#FE),a - xor a - out (#FE),a - djnz x04C4 -x04CD ret - -;АДРЕС: #04CE восстановление режима Турбо -; -x04CE ld a,(xE02D) - bit 6,a - jr z,x04D9 ;турбо выключено - -;АДРЕС: #04D5 Включение Турбо-режима -; -x04D5 ld b,#7F - jr x04DB - -;АДРЕС: #04D9 Выключение Турбо-режима -; -x04D9 ld b,#1F -x04DB ld c,#FD - in a,(c) - in a,(c) - ret - -;АДРЕС: #04E2 восстановление регистров пользователя -x04E2 ld hl,(xDD75) ;de пользователя - ld (xDD99),hl - ld hl,(xDD77) ;bc пользователя - ld (xDD9B),hl - ld a,(xDD85) ;i пользователя - ld i,a - ld (xDD9D),a - ld hl,(xDD83) ;r и IFFF2 пользователя - ld a,h ;коррекция регистра r - sub #06 - rlca - sla h - rra - ld h,a - ld (xDD9E),hl - ld hl,(xDD7F) ;af пользователя - ld (xDDA0),hl - ld hl,(xDD6B) ;PC пользователя - ld (xDDA2),hl - ld hl,(xDD6D) ;SP пользователя - ld bc,#FFF5 ;bc = -#0B - add hl,bc - ld (xDD6D),hl - ld de,xDD99 - ex de,hl - ld bc,#000B - call x0749 ;восстановление стэка из ram 8 - ld (xDDA7),sp - ld sp,xDD6F - pop ix - pop iy - pop hl - pop de - pop bc - exx - pop hl - pop de - pop bc - exx - pop af - ex af,af' - pop af - ex af,af' - ld sp,(xDDA7) - call x04CE ;восстановление режима Турбо - ld de,(xE012) ;ПЗУ пользователя - ld a,e - ld b,#7F - and #10 - out (c),a - ld b,#1F - ret - -;АДРЕС: #0550 сохранение экрана из страницы 5 -x0550 bit 3,(iy+#12) - ret nz ;экран уже сохранен в ram 8 - jr x055B - -;АДРЕС: #0557 вход в монитор после трассировки команды -x0557 ld sp,(xE38D) - -;АДРЕС: #055B сохранение экрана из страницы 5 -x055B ld hl,xE026 ;сохраняем экран - bit 1,(hl) - ret nz ;запрет на сохранение экрана - set 3,(hl) - or a -x0564 ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8, scr 5 - ld hl,#4000 - ld de,#C069 - jr nc,x0574 ;cy =1/0 восстанавливаем/сохраняем - ex de,hl -x0574 ld bc,#1B00 - ldir - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8, scr 5 - ret - -;АДРЕС: #0581 восстановление экрана в странице 5 -x0581 bit 1,(iy+#12) ;восстанавливаем экран - ret nz - scf - jr x0564 - -;АДРЕС: #0589 установка зеленого бордюра (индикация ошибки) -; -x0589 ld a,#04 ;зеленый бордюр - out (#FE),a - halt ;ОШИБКА??? должен быть ret после halt - -;АДРЕС: #058E чтение/запись байта в память пользователя -;вх: hl - адрес в памяти -; cy =1/0 запись/чтение -; a - байт для записи -; -x058E jr nz,x05CD ;адрес >=#8000 - ex af,af' - push bc - push de - bit 6,h - jr nz,x05A5 ;адрес [#4000..#7FFF] - ld de,(xE012) ;адрес [#0000..#3FFF] - ld bc,#7FFD - jp xE4CF -;выход -x05A1 pop de - pop bc - ex af,af' - ret -;чтение/запись байта из памяти [#4000..#7FFF] -x05A5 ld de,#5B00 - or a - sbc hl,de - add hl,de - jr nc,x05FB ;адрес [#5B00..#7FFF] - bit 3,(iy+#12) - jr z,x05FB ;экран не сохранен в ram 8 - ld de,#8069 - add hl,de - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8 - ex af,af' - jr c,x05C3 ;запись - ld a,(hl) -x05C3 ld (hl),a - ex af,af' - and #10 - out (c),a - sbc hl,de - jr x05A1 -;чтение/запись байта из памяти [#8000..#FFFF] -x05CD bit 6,h - jr z,x05FE ;адрес [#8000..#BFFF] - ex af,af' ;адрес >=#C000 - push bc - push de - ld de,(xE012) - ld bc,#7FFD - ld a,e - and #17 - out (c),a - ld a,d - and #10 - or #02 - ld b,#1F - out (c),a ;страница пользователя - ex af,af' - jr c,x05ED ;запись - ld a,(hl) -x05ED ld (hl),a - ex af,af' - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - jr x05A1 -x05FB pop de ;адрес [#5B00..#7FFF] - pop bc - ex af,af' -x05FE jr c,x0601 ;запись - ld a,(hl) -x0601 ld (hl),a - ret - -;АДРЕС: #0603 копирование памяти с #8000 в страницу пользователя -x0603 scf - jr x0607 - -;АДРЕС: #0606 копирование страницы пользователя в #8000 -;вх: a - номер страницы -x0606 or a -x0607 ex af,af' - push de - ld l,#05 ;номер логической страницы - call x3707 ;сравнение страницы пользователя с заданной - jr z,x0644 ;страница совпадает -;сохранение/восстановление страницы пользователя -x0610 ld de,(xE012) - ld bc,#7FFD - ld a,e - and #17 - out (c),a - ld a,d - and #10 - or #02 - ld b,#1F - out (c),a ;rom 2, ram пользователя - ld hl,#C000 - ld de,#8000 - ld bc,#4000 - ex af,af' - jr nc,x0632 - ex de,hl -x0632 ex af,af' - ldir - ld bc,#1FFD - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - pop de - ret -;сохранение/восстановление 5й страницы -x0644 ld hl,#4000 - ld de,#8000 - ld c,l - ld b,h - ex af,af' - jr nc,x0650 - ex de,hl -x0650 ex af,af' - ldir - ld hl,xC069 ;копируем экран - ld de,#8000 - ld bc,#1B00 - ex af,af' - jr nc,x0660 - ex de,hl -x0660 ex af,af' - ldir - pop de - ret - -;АДРЕС: #0665 включение режима 48k only -x0665 ld bc,#7FFD - ld a,#30 - out (c),a - ret - -;АДРЕС: #066D повторная инициализация страниц (если битая) -x066D ld a,#04 - out (#FE),a - halt ;зеленый бордюр - -;АДРЕС: #0672 инициализация ram 8 (вход при холодном сбросе) -x0672 ld iy,xE014 ;блок переменных - call x04D5 ;включим Турбо-режим -;очистка всех страниц памяти - ld bc,#1FFD - ld a,#12 - out (c),a ;rom 2 - ld a,#18 - jr x0691 -x0684 ld hl,#C000 ;очистка страницы - ld (hl),#00 - ld de,#C001 - ld bc,#3FFF - ldir -x0691 dec a ;очистка страниц #0F-#09 - ld bc,#7FFD - out (c),a - cp #10 - jr nz,x0684 - xor a ;очистка части 8й страницы - ld hl,#C069 ;#C000-#C068 не очищаются - push hl - ld (hl),a - ld de,xC069+1 - ld bc,#3F96 - ldir - pop hl -x06AA cp (hl) ;проверка целостности ram 8 страницы - inc hl - jr nz,x066D ;если битая, зеленый бордюр и тест сначала - cp h - jr nz,x06AA -;копирование блока атрибутов меню монитора в ram8 - ld hl,x3ED2 ;закодированный блок атрибутов меню монитора - ld de,xEAED ;блок атрибуты для монитора - call x3837 ;копирование блока памяти ram 8 с раскодированием - db #DD - db #2A - db #08 ;длина - db #F5 ;адрес байта для раскодирования -;копирование процедур переключения страниц в ram 8 - call x0739 ;копирование части закодированных процедур в ram 8 с раскодированием - ld bc,#0100 - ldir - rst #30 - dw rom7_x0CFF ;установка переменных дисковой BIOS - db #07 - rst #30 - dw rom4_x057F ;распаковка шрифта в rom 8 - db #04 - rst #30 - dw rom4_x0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD - db #04 - call x3B7F ;установка переменных по конкретным адресам - ld (iy+#08),#30 ;для перевода времени в ASCII =#30 -;формирование строки с версией монитора - ld hl,xE17B+#02 - res 7,(hl) - inc hl - ld (xE3BC),hl - set 6,(iy+#09) ;для п/п печати: чтение данных после управляющего кода - ld c,#00 - call x0732 ;установка координат печати crdY=#00, crdX=#24 - rst #20 - dc "N" - ld l,#F4 - ld h,c - ld a,(hl) - db #ED,#6C ;neg - inc hl - ld h,(hl) - ld l,a ;hl=#CACB - call x16DE ;печать числа hl=[#0000..#FFFF] - ld c,#01 - call x0732 ;установка координат печати crdY=#01, crdX=#24 - ld e,#FC - ld d,c - dec d ;de=#00FC - ld a,(de) ;a=#05 - inc de - push de ;de=#00FD - ld b,#02 - call x1658 ;печать числа A с предварительным пробелом - rst #20 - dc "-" - pop de - ld a,(de) ;a=#07 - ld b,#02 - call x1658 ;печать числа A с предварительным пробелом - ld c,#02 - call x0732 ;установка координат печати crdY=#02, crdX=#24 - rst #20 - dc "V" - rst #20 - dc "4." - rst #20 - dc "01" - ld hl,(xE3BC) - dec hl - set 7,(hl) - res 6,(iy+#09) - call x1F25 ;Команда: CLear - ld hl,x3135 - ex (sp),hl - jp (hl) - -;АДРЕС: #0732 установка координат печати crdY=рег C, crdX=#24 -x0732 rst #20 - db #9B ;признак передачи координат печати - ld a,c - rst #10 ;crd Y - rst #20 - db #A4 ;crd X=#24 - ret - -;АДРЕС: #0739 копирование части закодированных процедур в ram 8 с раскодированием -x0739 ld hl,x3B92 - ld de,xE3BE - call x3837 ;копирование блока памяти ram 8 с раскодированием - db #DD - db #E9 - db #6F ;длина - db #F4 ;адрес в ПЗУ - ret - -;возврат из п/п x0749 -x0747 ex de,hl - ret - -;АДРЕС: #0749 восстановление области памяти из ram 8 -;вх: hl - начало области -; de - адрес буфера для сохранения -; bc - размер для сохранения -; cy =1/0 восстановление/сохранение -; -x0749 scf ;cy =1 восстановление - ex de,hl - exx - ld hl,x0747 - push hl - exx - jr x0754 - -;АДРЕС: #0753 сохранение области памяти в ram 8 -;вх: hl - начало области -; de - адрес буфера для сохранения -; bc - размер для сохранения -; -x0753 or a ;cy =0 сохранение -;восстановление стэка из буфера в ram 8 -x0754 ex af,af' - bit 7,h - jr nz,x079D ;вершина стэка >= #8000 - bit 6,h - jr nz,x0775 ;вершина стэка >= #4000 - push hl ;вершина стэка < #4000 - add hl,bc - dec hl - bit 6,h - pop hl - jp z,x07F1 ;весь стэк в пределах [#0000..#3FFF] - push bc - ld bc,#4000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x07F1 ;сохранение стэка из окна [#0000..#3FFF] - pop bc - -;сохранение стэка из окна [#4000..#7FFF] -x0775 push hl - call x07D7 ;проверка попадания стэка на экран - pop hl - jr nc,x07A1 ;стэк не на экране - bit 3,(iy+#12) - jr z,x07A1 ;копируем из памяти - push hl ;копируем из области сохраненного экрана - add hl,bc - dec hl - call x07D7 - pop hl - jp c,x0807 ;весь стэк в пределах [#4000..#5AFF] - push bc - ld bc,#5B00 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x0807 - pop bc - jr x07A1 - -;сохранение стэка из окна [#8000..#FFFF] -x079D bit 6,h - jr nz,x07BC ;вершина стэка >= #C000 -;сохранение стэка из окна [#5B00..#BFFF] -x07A1 push hl - add hl,bc - dec hl - ld a,h - and #C0 - cp #C0 - pop hl - jp nz,x07FC ;весь стэк в пределах [#8000..#BFFF].сохраняем - push bc - ld bc,#C000 ;вычисление размера стэка до #C000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x07FC ;сохраняем часть стэка - pop bc -x07BC push hl ;сохранение стэка из окна [#С000..#FFFF] - add hl,bc ;проверим не выходит ли стэк за пределы окна - dec hl - bit 6,h - pop hl - jp nz,x0821 ;стэк за пределы окна не выходит - push bc ;стэк выходит за пределы #FFFF - ld bc,#0000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x0821 - pop bc - jp x07F1 - -;проверка адреса на принадлежность экрану -x07D7 push de - ld de,#5B00 - or a - sbc hl,de - pop de - ret - -;вычисление размеров на границе окон памяти -;вых: hl = hl-(bc-de) -; bc = bc-de -x07E0 ex de,hl - or a - push hl - ld l,c - ld h,b - pop bc - sbc hl,bc - push bc - ld c,l - ld b,h - pop hl - ex de,hl - or a - sbc hl,bc - ret - -;сохранение стэка из окна [#0000..#3FFF] -x07F1 exx - ld de,(xE012) ;страница при входе - ld bc,#7FFD - jp xE4F0 - -;сохранение стэка из памяти -x07FC ex af,af' - jr nc,x0800 - ex de,hl -x0800 ldir - jr nc,x0805 - ex de,hl -x0805 ex af,af' - ret - -;сохранение стэка из копии окна [#4000..#5AFF] -x0807 push bc - ld bc,#8069 ;адрес в копии экрана - add hl,bc - pop bc - push hl - ld hl,x081A ;адрес возврата - ex (sp),hl - push iy - ld iy,#1010 ;rom 1, ram 8, scr 5 - jr x0827 -x081A push bc - ld bc,#7F97 ;-#8069 - add hl,bc - pop bc - ret - -;сохранение стэка из окна [#C000..#FFFF] -x0821 push iy - ld iy,(xE012) ;номер страницы при входе -x0827 push hl - ld hl,(#8000) - ex (sp),hl ;сохраним (#8000/1) - push ix - ld xh,b - ld xl,c - exx - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8 - ld b,xh - ld c,xl - ld hl,#8002 - ld de,xDB69 - ldir - ld hl,#1210 ;сохраним/восстановим область памяти - ld a,yl - and %00010111 - ld e,a - ld a,yh - and %00010000 - or %00000010 - ld d,a ;de = rom 2, ram при входе - ex af,af' - jr nc,x0859 ;сохраняем - ex de,hl -x0859 ld bc,#7FFD - out (c),e - ld b,#1F - out (c),d - exx - jr nc,x0866 ;сохраняем - ex de,hl -x0866 ld (#8000),de - ld de,#8002 - ldir ;сохраним/восстановим стэк/память - ld de,(#8000) - ld b,xh - ld c,xl - exx - out (c),h - ld b,#7F - out (c),l ;меняем страницу - exx - ld (#8000),hl - ld hl,#8002 - ldir - ld hl,(#8000) - jr nc,x088D ;сохраняем - ex de,hl -x088D ex af,af' - exx - ld a,#10 - out (c),a - ld b,#1F - ld a,#12 - out (c),a ;rom 2, ram 8 - ld hl,xDB69 ;восстанавливаем память - ld de,#8002 - ld b,xh - ld c,xl - ldir - ld bc,#7FFD - ld a,#10 - out (c),a - exx - pop ix - ex (sp),hl - ld (#8000),hl - pop hl - pop iy - ret - -;АДРЕС: #08B7 таблица с адресами обработки функций rst 8 -x08B7 dw x0911 ;rst 8: db #80 Вывод символа из аккумулятора на принтер - dw x02F4 ;rst 8: db #81 Вызов фунций встроенной дисковой BIOS - dw x0339 ;rst 8: db #82 установка переменных монитора - dw x2A5B ;rst 8: db #83 очистка окна пользователя - dw x035F ;rst 8: db #84 Вывод символа на экран пользователя - dw x0368 ;rst 8: db #85 Отключение монитора - отладчика - dw x08D3 ;rst 8: db #86 Копия графического экрана на принтер - dw x02D1 ;rst 8: db #87 Установка двойной скорости - dw x02D7 ;rst 8: db #88 Установка обычной скорости - dw x0321 ;rst 8: db #89 Работа с микросхемой CMOS - dw x02EB ;rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! - dw x02AA ;rst 8: db #8B загрузка zs-snap с диска (без возврата) - dw x02CC ;rst 8: db #8C автостарт с дискеты - dw x02AE ;rst 8: db #8D хрень какая-то непонятная - -;АДРЕС: #08D3 rst 8: db #86 Копия графического экрана на принтер -x08D3 xor a - scf - jr x08D8 - -;АДРЕС: #08D7 печать текущего меню монитора -x08D7 xor a -x08D8 ld hl,x08F7 ;адрес возврата по Break - ld (xDE12),hl - ld hl,(xE3B7) ;адрес дескриптора текущего окна - push hl - call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер - push af - ld (xDDA7),sp - set 4,(iy+#09) ;вместо экрана вывод на принтер - call nc,x3A21 ;копирование активного экрана пользователя в #4000 - call x0A51 ;печать экрана на принтер - pop af - jr x08FE - -;возврат по Break -x08F7 ld sp,(xDDA7) - pop af - ld a,#01 - -;вх: a =#00/#01 -x08FE ld hl,xE01D - res 4,(hl) ;вывод на экран - res 5,(hl) - pop ix - ld (xE3B7),ix ;восстановим адрес дескриптора окна - ret nc ;печать текущего меню монитора - or a - jr z,x0937 ;успешно напечатали - jr x091E ;выход по Break - -;АДРЕС: #0911 rst 8: db #80 Вывод символа из аккумулятора на принтер -x0911 ld hl,x091A - ld (xDDA7),sp - jr x0929 -;возврат по Break -x091A ld sp,(xDDA7) -x091E ld a,#01 ;новые флаги программы cy=1 - jr x0939 - -;АДРЕС: #0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) -x0922 ld hl,#0146 ;выход из монитора - push hl - ld hl,#0941 -x0929 ld (xDE12),hl ;прерывание по Break - call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер - set 4,(iy+9) ;вывод на принтер - ld a,(xDD7F+#01) ;регистр a программы - rst #10 -x0937 ld a,%01000000 ;новые флаги программы Z -x0939 ld (xDD7F),a -x093C res 4,(iy+9) ;вывод на экран - ret -;прерывание по Break -x0941 ld sp,xE336 - call x093C - ld hl,#05E2 - ld (xDD6B),hl - jp x0146 - -;АДРЕС: #0950 вывод символа на принтер -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -x0950 bit 5,(iy+9) - jr nz,x09A9 ;есть управляющие коды - cp #0D - jr nz,x0987 ;это не перевод строки - ld (ix+#01),#00 ;crd X =#00 - call x0A05 ;передача кода "возврата каретки" для принтера - bit 2,(ix+#07) - jr z,x0970 ;выполнять автоматический перевод строки при приходе символа возврат каретки - ld a,(xE055) ;код символа "перевода строки" для принтера - or a - jr z,x0970 - call x09A9 ;перевод строки на принтере -; перевод строки, если вышли за пределы окна -x0970 ld a,(ix+#04) - or a - ret z ;высота окна в знакоместах - inc (ix+#00) - cp (ix+#00) - ret nc - ld (ix+#00),#00 - ld a,(xE056) ;код символа "перевода формата" для принтера - or a - ret z - jr x09A9 - -;печать символа на принтере -;вх: a - код символа/управляющий код -x0987 cp #20 - jr c,x09A9 ;это управляющий код - cp #7F ;коррекция печатного символа - jr nz,x0991 - ld a,#2E ;"." -x0991 ld e,a -; возврат каретки, если вышли за пределы окна - ld a,(ix+#05) ;ширина окна в знакоместах - or a - jr z,x09A8 - inc (ix+#01) ;crd X +1 - cp (ix+#01) - jr nc,x09A8 - push de ;перевод строки - rst #20 - db #8D - pop de - xor a - ld (ix+#01),a ;crd X =#00 -x09A8 ld a,e - -;печать символа на принтере -;вх: a - код символа/управляющий код -x09A9 ld d,(iy+#15) - bit 7,d - jr z,x09B1 ;positive - cpl -x09B1 bit 0,d - jr z,x0A10 ;Centronics -;интерфейс RS232 - push af - xor #FF - rlca - rlca - rlca - push af - call x04D9 ;выключение Турбо-режима - pop bc - ld c,b ;символ для печати -; ожидание готовности??? -x09C1 call x0A33 ;проверка нажатия BREAK - jr nc,x0A2F ;нажат BREAK - ld a,#FF - in a,(#FE) - bit 5,a - jr z,x09C1 ;ожидание готовности??? -; побитовая передача кода символа - ld b,#08 - bit 2,d - jr z,x09D5 ;data bits 8 - dec b -x09D5 push bc - ld bc,#1FFD - ld a,%00011010 - out (c),a - pop bc -x09DE call x0A3F ;задержка при передаче данных на принтер - push bc - ld a,c - ld bc,#1FFD - and %00001000 - or %00010010 - out (c),a - pop bc - rrc c - djnz x09DE -; завершение печати - call x0A3F ;задержка при передаче данных на принтер - ld bc,#1FFD - ld a,%00010010 - out (c),a - call x0A3F ;задержка при передаче данных на принтер - bit 3,d ;stop bits 2/1 - call z,x0A3F ;задержка при передаче данных на принтер - pop af - ret - -;передача кода "возврата каретки" для принтера -x0A05 ld a,(xE054) ;код символа "возврата каретки" для принтера - or a - ret z - push bc - call x09A9 - pop bc - ret - -;интерфейс Centronics -x0A10 ld c,a -x0A11 call x0A33 ;проверка нажатия BREAK - jr nc,x0A2F ;нажат - ld a,#FF - in a,(#FE) - rlca - jr c,x0A11 ;ожидание готовности??? - ld a,c ;вывод символа на принтер - ld bc,#FFDD - out (c),a - ld bc,#1FFD - ld a,%00110010 - out (c),a - ld a,%00010010 - out (c),a - ret - -;прерывание по Break -x0A2F ld hl,(xDE12) - jp (hl) - -;АДРЕС: #0A33 проверка нажатия BREAK -;вых: cy=0 нажат BREAK -; -x0A33 ld a,#7F ;проверка нажатия пробела - in a,(#FE) - rra - ret c ;не нажат - ld a,#FE ;проверка нажатия CapsShift - in a,(#FE) - rra - ret - -;задержка при передаче данных на принтер -x0A3F push af - ld hl,(xE057) - bit 1,d - jr z,x0A4A - ld hl,(xE059) -x0A4A dec hl - ld a,h - or l - jr nz,x0A4A - pop af - ret - -;АДРЕС: #0A51 печать экрана на принтер -x0A51 ld bc,#0000 -x0A54 set 5,(iy+#09) ;прочие управляющие коды - -;режим печати -x0A58 bit 5,(iy+#15) ;режим печати - ld a,#01 - jr z,x0A62 ;одна точка - ld a,#03 -x0A62 ld (xE05B+#06),a -;передача управляющих кодов - push bc - ld hl,xE05B ;список кодов для перевода принтера в графический режим - call x0AD2 ;передача кодов на принтер - pop bc -;печать строчки экрана -x0A6D push bc - bit 5,(iy+#15) - ld d,#08 - jr z,x0A78 - ld d,#04 -;печать одного байта -x0A78 push bc -; расчет экранного адреса из пиксельных координат - ld a,b - and a - rra - scf - rra - and a - rra - xor b - and #F8 - xor b - ld h,a - ld a,c - rlca - rlca - rlca - xor b - and #C7 - xor b - rlca - rlca - ld l,a ;hl - адрес - ld a,c - and #07 -; получение байта для печати - ld b,a - inc b - ld a,(hl) -x0A96 rlca - djnz x0A96 - push af - rl e - pop af - bit 5,(iy+#15) ;режим печати - jr z,x0AA5 ;одна точка - rl e -x0AA5 pop bc - inc b - dec d -x0AA8 jr nz,x0A78 ;e - байт для печати -; установка positive/negative - ld a,e -x0AAB bit 2,(iy+#12) - jr z,x0AB2 ;печать positive/negative - cpl -; печать байта -x0AB2 rst #10 - bit 5,(iy+#15) - jr z,x0ABB ;режим печати одна точка - rst #10 - rst #10 -x0ABB inc c - ld a,c - jr z,x0AC3 - pop bc - ld c,a - jr x0A6D -x0AC3 pop de -;следующая строка -x0AC4 res 5,(iy+#09) - rst #20 - dc #8D - ld a,#BF - cp b - jr nc,x0A54 -;первод в текстовый режим и выход - ld hl,xE063 ;список кодов для перевода принтера в текстовый режим - -;передача кодов на принтер -x0AD2 ld b,(hl) - inc hl - jp x15B3 - -;АДРЕС: #0AD7 Команда: EXit выход из отладчика в меню -x0AD7 res 0,(iy+#12) - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 - ret - -;АДРЕС: #0AE0 печать/обновление окна отладчика -;вх: a - номер сообщения для печати над строкой ввода -x0AE0 ld (iy+#0A),#00 - push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - jr x0B06 - -;АДРЕС: #0AEB вызов отладчика M. Monitor -x0AEB ld sp,xE336 - set 0,(iy+#12) - -;АДРЕС: #0AF2 полное обновление окна отладчика -x0AF2 call x04D5 ;включение Турбо-режима - xor a - ld (xE01E),a ;настройки отладчика - jr x0AFC - -;АДРЕС: #0AFB обновление окна отладчика, без информационного окна -x0AFB scf -x0AFC push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - call nc,x33CD ;печать информационного окна отладчика - ld a,#81 ;сообщение: enter command - -;АДРЕС: #0B06 ввод и обработка команды отладчика -x0B06 ld sp,xE336 - call x0550 ;сохранение экрана из страницы 5 - ld hl,x0B06 ;сюда вернемся - push hl - rst #30 ;ввод команды отладчика - dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана - db #05 - jr nc,x0B40 ;команду ввели - call x2C7E ;поиск и вызов процедуры обработки клавиши без возврата(если не найдено возврата) - db #87 ;cs+3 - dw x303C ;выполнение команды, на которую указывает PC - db #88 ;cs+4 - dw x303F ;выполнение команды с быстрым выполнением подпрограмм - db #89 ;cs+9 - dw x1019 ;пропуск программы, содержание регистра PC увеличивается на длину текущей команды (сама команда не выполняется) - db #8A ;ss+a - dw x0FFF ;на следующую команду (если команда не выполняется) - db #1C ;ss+q - dw x0FF5 ;на один байт влево - db #1E ;ss+e - dw x0FFA ;на один байт вправо - db #1D ;ss+w - dw x0FEB ;на одну строку вверх - db #8B ;ss+s - dw x0FF0 ;на одну строку вниз - db #8C ;ss+f - dw x3517 ;продолжение поиска в отладчике (для команд FIND/SEARCH) - db #8E ;ss+d - dw x38D8 ;быстрый вход в команду DASM - db #8D ;ss+g - dw x3655 ;переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти - db #04 ;cs+1+d - dw x1101 ;редактирование дампа памяти - db #FF - xor a - ret -;анализ введенной команды -;hl - введенная строка -x0B40 call x0EE3 ;поиск в буфере ввода строки первого печатного символа - ld e,#00 - cp #0D - jp z,x0AF2 ;пустая строка. полное обновление окна отладчика - cp "[" - jr z,x0B56 ; - cp "(" - jr nz,x0B59 - ld e,#04 - jr x0B58 -x0B56 ld e,#84 -x0B58 inc hl -x0B59 ld (iy+#00),e - bit 2,e - jr nz,x0BCC ;команда начинается со скобки - -;определение кода команды (для установки регистров и переменной MEM) - ld de,x0FA5 - ld bc,x0F66 - call x0F2E ;определение кода команды по введенной строке - jp z,x0C0F ;выполнение введенной команды - ex de,hl ;de адрес введенной строки - cp #21 - jr nc,x0B7D ;регистр R или I - cp #0D - jr nc,x0B7E ;8 бит регистр - set 3,(iy+#00) ;16 бит регистр - sla c - jr x0B82 -x0B7D inc bc -x0B7E ld a,c - sub #07 - ld c,a ;bc смещение до регистра пользователя -;присвоение значения, если есть знак = -x0B82 ld a,(de) - cp #3D ;= - jp nz,x0C0F ;выполнение введенной команды - inc de - ex de,hl ;hl адрес введенной строки - push bc - call x0EBA ;выделение из строки числовых операндов (не более 6) - pop bc ;de значение операнда - cp #01 - ld a,#0A ;сообщение: too few operands - ret c ;ошибка. нет операндов - ld a,#0B ;сообщение: too many operands - ret nz ;ошибка. слишком много операндов - bit 2,(iy+#00) - jr nz,x0BF0 ;есть незакрытая скобка - ld hl,xDD69 - add hl,bc ;адрес регистра пользователя - bit 3,(iy+#00) - jr nz,x0BB1 ;16 бит значение команды -; 8 бит значение команды - ld a,d - or a - jr nz,x0BC9 ;ошибка: out of range - call x0EAA ;установка флагов обновления: регистров - ld (hl),e - jr x0BC6 -; 16 бит значение команды -x0BB1 ld a,c - cp #02 - jr nz,x0BBA ;это не регистр PC - res 6,(iy+#0A) ;обновить дизассемблер в мониторе -x0BBA or a - push af ;a=#00 это указатель MEM - call z,x0EB1 ;обновить дамп памяти и обновлять дизассемблер памяти - pop af - call nz,x0EAA ;обновить регистры - ld (hl),e - inc hl - ld (hl),d -x0BC6 jp x0AFB ;обновление монитора-отладчика -;ошибка -x0BC9 ld a,#0C ;сообщение: out of range - ret - -;вычисление значения операнда в скобках -;вх: hl - адрес введенной строки (начало операнда) -x0BCC call x0C98 ;вычисление значения в введенной строке - ret c ;ошибка в строке: operand not found - ex de,hl ;hl - вычисленное значение - ld c,l - ld b,h - ld a,(de) - inc de - ld hl,xE014 - cp #29 ;) - jr z,x0BE9 - cp #5D - jp nz,x0C0F ;выполнение введенной команды -; закрытие скобки ] - bit 7,(hl) - jr z,x0BED ;ошибка: invalid type brackets - set 3,(hl) - jr x0B82 ;присвоение значения, если есть знак = -; закрытие скобки ) -x0BE9 bit 7,(hl) - jr z,x0B82 ;присвоение значения, если есть знак = -; ошибка: invalid type brackets -x0BED ld a,#15 - ret -;есть незакрытая скобка -x0BF0 bit 3,(iy+#00) - ld l,c - ld h,b - jr nz,x0C08 ;16 бит значение команды -; 8 бит значение команды - ld a,d - or a - jr nz,x0BC9 ;ошибка: out of range - ld a,e - rst #00 ;запись байта в память пользователя -; обновить все значения в отладчике -x0BFE ld a,(xE01E) - and #81 - ld (xE01E),a - jr x0BC6 ;обновление монитора-отладчика -; 16 бит значение команды -x0C08 ld a,e - rst #00 ;запись байта в память пользователя - inc hl - ld a,d - rst #00 ;запись байта в память пользователя - jr x0BFE ;обновить все значения в отладчике - -;выполнение введенной команды -x0C0F ld hl,xE11E - ld b,#03 -x0C14 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld (xDDA7),de ;de - адрес таблицы с адресами процедур обработки команды - ld a,e - or d - jr z,x0C32 ;ошибка: command not found - ld e,(hl) - inc hl - ld d,(hl) - inc hl ;de - адрес списка команд - push hl - push bc - call x0EE3 ;поиск в буфере ввода строки первого печатного символа - call x0EF0 ;поиск заданной команды в списке - jr nz,x0C37 ;команда найдена - pop bc - pop hl - djnz x0C14 -; ошибка: command not found -x0C32 ld a,#16 ;сообщение: command not found - jp x0B06 ;полное обновление окна отладчика -;команда найдена. выполнение команды -x0C37 pop de - ex (sp),hl ;(sp) следующий адрес в строке - add a,c - add a,c - ld c,a ;*3 - ld hl,(xDDA7) ;hl - адрес таблицы с адресами процедур обработки команды - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) ;de - процедура обработки команды - inc hl - ld c,(hl) ;c - флаги команды - pop hl ;следующий адрес в строке - push de - bit 7,c - jr nz,x0C67 ;проверка корректности команды. в параметрах команды есть строка - bit 5,c - ret nz ;переход на обработку команды - push bc - call x0EBA ;выделение из строки числовых операндов (не более 6) - pop bc ;de - первый операнд, hl - второй операнд, a - количество операндов [0..5] - bit 6,c - jr nz,x0C62 ;переход на обработку команды - cp c - jr z,x0C62 ;количество прочитанных операндов совпадает - ld a,#0A ;ошибка: too few operands - jr c,x0C5F ;введено меньше операндов чем надо - inc a ;ошибка: too many operands -x0C5F jp x0B06 ;полное обновление окна отладчика -x0C62 ld bc,(xDD9D) ;bc - третий операнд - ret ;переход на обработку команды - -;проверка строки команды (в параметрах команды есть строка) -;вых: b - количествор параметров в строке -x0C67 ld b,#00 - push hl -x0C6A dec c - bit 7,c - jr nz,x0C73 ;это еще числовое значение - set 1,(iy+#00) ;читаем из параметров строку -x0C73 bit 1,(iy+#00) - push bc - jr nz,x0C7F ;читаем из параметров строку - call x0C98 ;читаем из параметров число - jr x0C82 -x0C7F call x0D55 ;читаем из параметров строку -x0C82 pop bc - jr z,x0C8A ;прочитано без ошибок - jp nc,x0B06 ;полное обновление окна отладчика -; конец строки команды - pop hl - ret ;переход на обработку команды -x0C8A inc b - bit 7,c - jr nz,x0C6A ;прочитан числовой операнд - ld a,d - or a - jr z,x0C6A - ld a,#0C ;ошибка: out of range - jp x0B06 ;полное обновление окна отладчика - -;АДРЕС: #0C98 чтение числового операнда из строки команды -;вх: hl - адрес введенной строки -;вых: de - вычисленное значение -; hl - следующий адрес в введенной строке -; nz - были ошибки -; cy=1 - ошибка в строке: operand not found -x0C98 dec hl -x0C99 inc hl - call x0D42 ;проверка символа в (hl) пробел , ; #00 #0D - jr nz,x0CA7 ;cy=1 символ =#00/#0D - jr nc,x0C99 - xor a - inc a - ld a,#12 ;сообщение: operand not found - scf - ret -x0CA7 ld (iy+#0F),#00 ;количество незакрытых скобок -x0CAB ld de,#0000 ;базовое число (к нему будем прибавлять/отнимать) - push de -;проверка знака в строке - ld d,#2B ;"+" - ld a,(hl) - call x0D38 ;проверка A = "+" или "-" - jr nz,x0CB9 - inc hl -x0CB8 ld d,a ;знак +/- -;проверка открыия скобки -x0CB9 push de - ld a,(hl) - cp #28 ;( - jr z,x0CC3 - cp #5B ;[ - jr nz,x0CCC -x0CC3 inc hl - inc (iy+#0F) - pop de - ld e,a ;открытая скобка ( или [ - push de - jr x0CAB ;скобка открыта, читаем следующий символ -;выделение числа из строки по адресу в hl -x0CCC call x0D55 ;z a =#00 успешно -> de - число - jr nz,x0CF8 ;не число. в a - сообщение об ошибке. полное обновление окна отладчика -;вычисление суммы/разности чисел -;de - число -x0CD1 pop af ;знак операции +/- - ex (sp),hl ;второе число - cp #2D ;- - jr z,x0CDA - add hl,de - jr x0CDD -x0CDA or a - sbc hl,de -x0CDD ex (sp),hl -;проверка знака в строке - ld a,(hl) - inc hl - call x0D38 ;проверка A = "+" или "-" - jr z,x0CB8 ;повторим сложение/вычитание - cp #29 ;) - jr z,x0CFB ;закроем скобку ) - cp #5D ;] - jr z,x0D0E ;закроем скобку ] - dec hl - xor a - cp (iy+#0F) - jr nz,x0CF6 ;лишняя скобка - pop de - ret -x0CF6 ld a,#13 ;сообщение: quit operand not found -x0CF8 jp x0B06 -;закроем скобку ) -x0CFB pop de ;полученное число - call x0D22 ;уменьшим количество незакрытых скобок - pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая - push af - ld a,#15 ;сообщение: invalid type brackets - jr c,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика -; чтение байта из памяти пользователя - push hl - ex de,hl - rst #28 ;чтение байта из памяти пользователя - ld e,a - ld d,#00 - pop hl - jr x0CD1 ;продолжим анализ -;закроем скобку ] -x0D0E pop de - call x0D22 ;уменьшим количество незакрытых скобок - pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая - push af - ld a,#15 ;сообщение: invalid type brackets - jr nc,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика -; чтение слова из памяти пользователя - push hl - ex de,hl - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - pop hl - jr x0CD1 ;продолжим анализ -;уменьшим количество незакрытых скобок -x0D22 xor a - cp (iy+#0F) - jr z,x0D2C ;нет открытых скобок - dec (iy+#0F) - ret -x0D2C bit 2,(iy+#00) - ld a,#14 ;сообщение: too many > - jr z,x0CF8 ;ошибка. много скобок - pop bc - dec hl - xor a - ret - -;проверка A = "+" или "-" -x0D38 cp #2B ;+ - ret z - cp #2D ;- - ret - -;АДРЕС: #0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) -;вых: z - это разделитель -; cy=1 это конец строки -x0D3E ld a,(hl) - cp #3A ;: - ret z - -;АДРЕС: #0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D -;вых: z - это разделитель -; cy=1 это конец строки -x0D42 ld a,(hl) - cp #20 ;" " - ret z - -;АДРЕС: #0D46 проверка символа в (hl) #2C/#3B/#00/#0D -;вых: z - это разделитель -; cy=1 это конец строки -x0D46 ld a,(hl) - cp #2C ;"," - ret z - cp #3B ;";" - ret z - or a - scf - ret z - cp #0D - ret nz - scf - ret - -;АДРЕС: #0D55 чтение из строки команды чилового/байта строкового значения -;вх: hl - адрес введенной строки (начало параметра команды) -;вых: nz - ошибка. в A - код ошибки -; cy=1 синтаксическая ошибка -; z a =#00 успешно -> de - число -; hl - адрес начала следующего слова в введенной строке -x0D55 bit 0,(iy+#00) - ld a,#10 - ld (xE024),a ;делитель для выделения разряда числа - jr nz,x0D74 ;анализ строки после кавычек -;поиск значимого символа в строке - dec hl -x0D61 inc hl - res 0,(iy+#00) - call x0D42 ;проверка символа в (hl) z -> пробел , ; #00 #0D - jr nz,x0D6F ;cy=1 символ =#00/#0D - jr c,x0DA6 ;ошибка: syntax error - jr x0D61 -x0D6F cp #22 ;" - jr nz,x0DAC ;не кавычки. чтение числа из введенной строки -;анализ строки в кавычках (допустим только один символ чило=код символа) - inc hl -x0D74 ld a,(hl) - cp #0D - jr z,x0DA2 ;конец строки. ошибка: bad string - cp #22 ;" - jr z,x0D9C ;кавычки закрыли - ld e,a - ld d,#00 ;код символа из строки - bit 1,(iy+#00) - jr nz,x0D8E ;параметр =строка - inc hl - ld a,#22 ;" - cp (hl) - jr nz,x0DA2 ;ошибка: bad string - jr x0D92 -; читаем параметр-строку -x0D8E set 0,(iy+#00) -; выход -x0D92 inc hl - xor a - ld (xE024),a - ret -;ошибка: known number - ld a,#0D ;сообщение: known number - or a - ret -;кавычки закрыли -x0D9C bit 1,(iy+#00) - jr nz,x0D61 ;параметр-строка. -;ошибка: bad string -x0DA2 ld a,#0E ;сообщение: bad string - or a - ret -;ошибка: syntax error -x0DA6 xor a - inc a - ld a,#0F ;сообщение: syntax error - scf - ret - -;чтение числа из введенной строки -;вх: hl - адрес строки -;вых: z a =#00 успешно -> de - число -; nz a =#10 не число. сообщение: not number -; nz a =#11 результат более 16 бит. сообщение: number too big -; hl - адрес начала следующего слова в введенной строке -x0DAC ld de,x0FA0 - ld bc,x0F41 - call x0F2E ;определение кода команды по введенной строке - jr nz,x0DBD ;команда(регистр) найдена в списке - call x0DF4 ;преобразование строки в число - ret z - or a - ret -x0DBD ld de,#0001 - ld a,c - or a - ret z ;ON -> de=#0001, a=#00 - dec de - dec a - ret z ;OFF -> de=#0000, a=#00 - push hl - ld hl,xDD83+#01 ;адрес регистра R пользователя - ld a,c - sub #23 - jr nc,x0DE4 ;регитр R или I - ld hl,xDD6F ;начало списка регистров ползьзователя - ld a,c - sub #0F - jr nc,x0DE4 ;регистр 8 bit -; 16 бит регистр - dec bc - dec bc - ld hl,xDD6F-#06 - add hl,bc - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) -x0DE1 pop hl - xor a - ret -; 8 бит регистр -x0DE4 add a,l - ld l,a - jr nc,x0DE9 - inc h -x0DE9 ld e,(hl) - jr x0DE1 - -;АДРЕС: #0DEC таблица префиксов и основания систем счислений -x0DEC db "%",#02 - db "@",#08 - db ".",#0A - db "#",#10 - -;АДРЕС: #0DF4 преобразование строки в число (!!!при base 0 работает неверно!!!) -;вх: hl - адрес строки -;вых: z a =#00 успешно -> de - результат -; nz a =#10 не число. сообщение: not number -; nz a =#11 результат более 16 бит. сообщение: number too big -; -x0DF4 ld a,(xE02B) ;текущая система счисления =2/8/10/16 - ld b,#0A - or a - jr z,x0DFD - ld b,a -x0DFD call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) - jr nc,x0E17 ;это цифра - ld de,x0DEC ;проверим является ли симовол префиксом системы счисления - ld b,#04 -x0E07 ld a,(de) - inc de - cp (hl) - ld a,(de) - inc de - jr z,x0E15 ;да, это префикс. в A основание системы счислений - djnz x0E07 - ld b,(iy+#17) - jr x0E17 -x0E15 inc hl ;строка после префикса - ld b,a ;основание системы счислений -x0E17 ld (iy+#10),b ;делитель для выделения разряда числа - call x0E1F ;преобразование строки в число - or a - ret -;преобразование строки в число (!!!при base 0 работает неверно!!!) -;вх: hl - строка чисел -;вых: a =#00 успешно -> de - результат -; a =#10 не число -; a =#11 результат более 16 бит -x0E1F call x0E59 ;преобразование символа в число, с учетом системы счисления - ld a,#10 - ret c ;выход. не число - ld b,#00 - ld d,b - ld e,c - inc hl -x0E2A call x0E59 ;преобразование символа в число, с учетом системы счисления - jr c,x0E45 ;числа кончились - push hl - ld hl,(xE024) ;делитель для выделения разряда числа - ld h,#00 - ex de,hl - push bc - call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - pop bc - jr nz,x0E4D ;результат более 16 бит - add hl,bc - jr c,x0E4D ;результат более 16 бит - ex de,hl - pop hl - inc hl - jr x0E2A -x0E45 call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) - ld a,#10 - ret nc - xor a - ret -;-результат более 16 бит -x0E4D pop hl - ld a,#11 - ret -;-проверка в (hl) цифра или нет (cy=1 не цифра) -;вх: hl - адрес в строке -x0E51 ld a,(hl) - cp #30 - ret c - cp #3A - ccf - ret -;-преобразование символа в число, с учетом системы счисления -;вх: hl - адрес строки чисел -;вых: c - число -; cy=1 ошибка. это не число -x0E59 ld a,(hl) - cp #61 - jr c,x0E60 - sub #20 ;буква в верхнем регистре -x0E60 sub #30 - ret c ;неизвестный символ - cp #0A - jr c,x0E6C ;это цифра - cp #11 - ret c ;неизвестный символ - sub #07 -x0E6C ld c,a - ld a,(xE024) ;делитель для выделения разряда числа - dec a - cp c - ret - -;АДРЕС: #0E73 деление bc=hl/de с проверкой de на ноль -; -x0E73 res 2,(iy+#0E) - ld a,d - or e - jr z,x0E80 - ld a,h - ld c,l - jp x16AA -x0E80 set 2,(iy+#0E) - ret - -;АДРЕС: #0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -;вых: ahl - результат -; 0,(iy+#0E)=1 результат более 16 бит -; -x0E85 res 0,(iy+#0E) - ld c,h - ld a,l - ld b,#10 - ld hl,#0000 -x0E90 add hl,hl - jr nc,x0E97 - set 0,(iy+#0E) -x0E97 rla - rl c - jr nc,x0EA3 - add hl,de - jr nc,x0EA3 - set 0,(iy+#0E) -x0EA3 djnz x0E90 - bit 0,(iy+#0E) - ret - -;установка флагов обновления: содержимого регистров и дамп по содержимому регистров -x0EAA ld a,(xE01E) - and #F5 ;%11110101 - jr x0EB6 -;установка флагов обновления: обновлять дамп памяти и обновлять дизассемблер памяти по содержимому ячейки памяти -x0EB1 ld a,(xE01E) - and #CF ;%11001111 -x0EB6 ld (xE01E),a - ret - -;АДРЕС: #0EBA выделение из строки числовых операндов (не более 6) -;вх: hl - адрес введенной строки -;вых: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x0EBA xor a - ld bc,xDD99 -x0EBE push af - push bc - call x0C98 ;вычисление значения в введенной строке - pop bc ;de вычисленное значение - jr c,x0EDA ;ошибка в строке - jp nz,x0B06 ;ошибка. полное обновление окна отладчика - ld a,e - ld (bc),a - inc bc - ld a,d - ld (bc),a - inc bc - pop af - inc a - cp #06 - jr nz,x0EBE - ld a,#0B ;ошибка: too many operands - jp x0B06 ;полное обновление окна отладчика -x0EDA pop af - ld de,(xDD99) - ld hl,(xDD99+#02) - ret - -;АДРЕС: #0EE3 поиск в буфере ввода строки первого печатного символа -;вых: hl - адрес в буфере -; z - этот символ перевод строки -x0EE3 ld hl,xDE17 ;буфер для ввода строки - -;АДРЕС: #0EE6 поиск в строке первого печатного символа -;вых: hl - адрес в строке -; z - этот символ перевод строки -x0EE6 ld a,(hl) - cp " " - inc hl - jr z,x0EE6 - dec hl - cp #0D - ret - -;АДРЕС: #0EF0 поиск заданной команды в списке -;вх: hl - строка с введенной командой -; de - список команд -;вых: nz - команда найдена в списке -; a,bc - номер найденной команды в списке -x0EF0 ld c,#00 -x0EF2 push hl - ld a,(de) ;пропуск служебных байтов - cp #20 ;space - jr nc,x0EFA - inc de - inc de -x0EFA ld a,(de) - ld b,a - and #7F - cp #61 ;a - jr c,x0F04 ;буква в контрольном слове в верхнем регистре - set 7,c ;если в нижнем, то не является значимой -x0F04 ld a,b - call x0F89 ;перевод символа в верхний регистр - ld b,a - ld a,(hl) - call x0F89 ;перевод символа в верхний регистр - cp b - jr nz,x0F1E ;нет совпадения - ld a,(de) - bit 7,a - inc hl - inc de - jr z,x0EFA ;следующая буква -;слово найдено -x0F17 pop de - res 7,c - ld a,c - ld b,#00 - ret -x0F1E bit 7,c - jr nz,x0F17 ;буква в контрольном слове в нижнем регистре -;сравниваем со следующим словом - pop hl -x0F23 ld a,(de) - rlca - inc de - jr nc,x0F23 - inc c - ld a,(de) - or a - jr nz,x0EF2 - ret - -;определение кода команды по введенной строке -;вх: hl - адрес строки с введенной командой -; de - список команд -; bc - список кодов соответствующих команде -;вых: z - команда не найдена в списке -; nz - команда найдена в списке -; a,bc - код найденной команды в списке -; hl - адрес начала следующего слова в введенной строке -x0F2E push bc - call x0EF0 ;поиск заданной команды в списке - pop de - ret z ;команда не найдена - push de - ex (sp),hl - push af - add a,l - ld l,a - jr nc,x0F3C - inc h -x0F3C pop af - ld a,(hl) - ld c,a - pop hl - ret - -;номера кодов соответсвующих списку x0FA0 (названия регистров для монитора) -x0F41 db #00,#01,#02,#23 ;ON / OFF/ MEM/ R - db #0E,#0D,#22,#20 ;AF'/ AF / A' / A - db #21,#1F,#0F,#10 ;F' / F / IXL/ IXH - db #11,#12,#05,#06 ;IYL/ IYH/ IX / IY - db #03,#04,#0A,#0B ;PC / SP / HL'/ DE' - db #0C,#07,#08,#09 ;BC'/ HL / DE / BC - db #19,#1A,#1B,#1C ;L' / H' / E' / D' - db #1D,#1E,#13,#14 ;C' / B' / L / H - db #15,#16,#17,#18 ;E / D / C / B - db #24 ;I - -;номера кодов соответсвующих списку x0FA5 (названия регистров для монитора) -x0F66 db #00,#21,#0C,#0B ;MEM/ R / AF'/ AF - db #20,#1E,#1F,#1D ;A' / A / F' / F - db #0D,#0E,#0F,#10 ;IXL/ IXH/ IYL/ IYH - db #03,#04,#01,#02 ;IX / IY / PC / SP - db #08,#09,#0A,#05 ;HL'/ DE'/ BC'/ HL" - db #06,#07,#17,#18 ;DE / BC / L' / H' - db #19,#1A,#1B,#1C ;E' / D' / C' / B' - db #11,#12,#13,#14 ;L / H / E / D - db #15,#16,#22 ;C / B / I - -;перевод символа в нижний регистр -x0F89 and #7F - cp #40 - ret c - and #5F - ret - -;АДРЕС: #0F91 названия регистров для монитора -x0F91 dc "PC" - dc "SP" - dc "IX" - dc "IY" - dc "HL" - dc "DE" - dc "BC" - db #00 - -;АДРЕС: #0FA0 названия команд/регистров -x0FA0 dc "ON" -x0FA2 dc "OFF" -x0FA5 dc "MEM" - dc "R" - dc "AF'" - dc "AF" - dc "A'" - dc "A" - dc "F'" - dc "F" - dc "IXL" - dc "IXH" - dc "IYL" - dc "IYH" - dc "IX" - dc "IY" - dc "PC" - dc "SP" - dc "HL'" - dc "DE'" - dc "BC'" - dc "HL" - dc "DE" - dc "BC" - dc "L'" - dc "H'" - dc "E'" - dc "D'" - dc "C'" - dc "B'" - dc "L" - dc "H" - dc "E" - dc "D" - dc "C" - dc "B" - dc "I" - db #00 - -;АДРЕС: #0FEB на одну строку вверх в отладчике -x0FEB ld bc,#FFF8 - jr x1005 - -;АДРЕС: #0FF0 на одну строку вниз в отладчике -x0FF0 ld bc,#0008 - jr x1005 - -;АДРЕС: #0FF5 на один байт влево в отладчике -x0FF5 ld bc,#FFFF - jr x1005 - -;АДРЕС: #0FFA на один байт вправо в отладчике -x0FFA ld bc,#0001 - jr x1005 - -;АДРЕС: #0FFF на следующую команду (если команда не выполняется) -x0FFF ld hl,(xDD69) ;ячейка mem - call x2F96 ;анализ команды ассемблера - -x1005 ld hl,(xDD69) ;ячейка mem - add hl,bc - ld (xDD69),hl - ld a,#01 - bit 0,(iy+#0A) - jr z,x102B ;очищать экран монитора при обновлении информации - call x2E3D ;печать дампа памяти в окне - xor a - ret - -;АДРЕС: #1019 пропуск программы, содержание регистра PC увеличивается на длину -; текущей команды (сама команда не выполняется) -x1019 ld hl,(xDD6B) ;PC - call x2F96 ;анализ команды ассемблера - ld (xDD6B),hl - ld a,(iy+#0A) - and %10110101 - ld (iy+#0A),a - xor a - -x102B push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - ret - -;нажата стрелка влево. полный сброс -x1031 ld (xEAF5+#18),hl ;портим память в ram 8 - jp x0040 ;инициализация - -;АДРЕС: #1037 инициализация системы и чтение настроек Autoconfig -x1037 call x1048 ;инициализация системы и чтение настроек Autoconfig - set 6,(iy+#14) ;"теплый" сброс - ld b,#00 - ld hl,xEAF5 ;байты - признак целостности страницы -x1043 ld (hl),b - inc hl - djnz x1043 - ret - -;инициализация системы и чтение настроек Autoconfig -x1048 ld iy,xE014 - call x0739 ;копирование процедуры в ram 8 с раскодированием - ld bc,#FEFE ;проверка нажатия CapsShift+5 - in a,(c) - rrca - jr c,x105F ;не нажата - ld b,#F7 ;проверка нажатия 5 - in a,(c) - bit 4,a - jr z,x1031 ;cs+5 нажата -x105F scf - jr x107A ;чтение настроек Autoconfig - - - -x1062 ld de,xC006 - ld a,(de) - sub e - dec de - jr z,x1073 - call x3E25 ;чтение портов #1FFD/#7FFD - scf - jr x107A ;чтение настроек Autoconfig -x1070 ex de,hl - inc (hl) - ex de,hl -x1073 ld a,(de) - sbc a,e - and #07 - jp z,x001E ;сброс - - -;инициализация системы и чтение настроек Autoconfig -;cy=1 чтение настроек Autoconfig в соответствии с параметрами переменной -; =0 безусловное чтение настроек Autoconfig -x107A push af -; подсчет контрольной суммы Basic128 с адреса #500-#5FF - ld hl,#0000 - ld b,h - ld c,#FE - ld (xE012),hl ;rom 0, ram 0 пользователя - ld h,#05 ;hl=#0500 адрес откуда читаем -x1086 rst #28 ;чтение байта из памяти пользователя - add a,b - ld b,a - inc hl - ld a,h - sub #06 - jr nz,x1086 - ld a,(x2BB2) - sub b - jp nz,x001E ;не совпадает. сброс - call x04CE ;восстановление режима Турбо - rst #30 - dw rom4_x0A5A ;инициализация системы и печать сооветствующих сообщений - db #04 - pop af - jr nc,x10B5 ;чтение и установка настроек из конфигурационного сектора - bit 1,(iy+#14) - ret nz ;Autoconfig Off - ld a,(xFFD0) - push af - call x10B5 ;чтение и установка настроек из конфигурационного сектора - rst #30 - dw rom5_x08EF ;установка доступности мыши - db #05 - pop af - ld (xFFD0),a - ret -;чтение и установка настроек из конфигурационного сектора -x10B5 xor a - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - ld bc,#FEFE - in a,(c) - rrca - jr c,x10C8 ;cs не нажата - ld b,#EF - in a,(c) - bit 2,a - ret z ;нажато cs+8 -x10C8 bit 6,(iy+#14) - jr nz,x10D6 ;"теплый" сброс - ld d,#02 - ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 -x10D6 rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - ret c ;ошибка - ld (ix+1),#00 ;crd X - ld bc,#5D00 ;сообщение: "boot record" - rst #08 ;печать сообщения - call x2FED ;печать пробелов до правого края окна -; чтение конфигурационного сектора - ld hl,xDB69 - push hl - ld bc,#0105 - ld de,#000F ;trk 0, sec #0F - rst #30 - dw rom7_x0229 ;R8DOS #05(5) чтение группы секторов - db #07 - pop hl - ret c ;ошибка чтения - ld a,"A" - cpi - ret nz - ld a,"M" - cpi - ret nz - jp (hl) ;установка настроек из конфигурационного сектора - -;АДРЕС: #1101 редактирование дампа памяти в окне монитора -x1101 rst #30 - dw rom5_x2278 ;редактирование дампа памяти в окне монитора - db #05 - xor a - ret - -;АДРЕС: #1107 таблица мнемоник -x1107 db #5C,#01 ;#00 ;#30 LD IXH - db #5C,#02 ;#30 LD IXL - db #5C,#03 ;#30 LD IYH - db #5C,#04 ;#30 LD IYL - db #53,#15 ;#27 JP Z - db #53,#14 ;#27 JP NZ - db #53,#0D ;#27 JP C - db #53,#16 ;#27 JP NC - db #53,#17 ;#08 ;#27 JP M - db #53,#1A ;#27 JP P - db #53,#19 ;#27 JP PE - db #53,#18 ;#27 JP PO - db #53,#22 ;#27 JP (HL) - db #53,#23 ;#27 JP (IX) - db #53,#24 ;#27 JP (IY) - db #54,#15 ;#28 JR Z - db #54,#14 ;#10 ;#28 JR NZ - db #54,#0D ;#28 JR C - db #54,#16 ;#28 JR NC - db #55,#15 ;#29 CALL Z - db #55,#14 ;#29 CALL NZ - db #55,#0D ;#29 CALL C - db #55,#16 ;#29 CALL NC - db #55,#17 ;#29 CALL M - db #55,#1A ;#18 ;#29 CALL P - db #55,#19 ;#29 CALL PE - db #55,#18 ;#29 CALL PO - db #56,#0B ;#2A ADC A - db #56,#07 ;#2A ADC HL - db #57,#0B ;#2B ADD A - db #57,#07 ;#2B ADD HL - db #57,#12 ;#2B ADD IX - db #57,#13 ;#20 ;#2B ADD IY - db #58,#0B ;#2C SBC A - db #58,#07 ;#2C SBC HL - db #59,#0B ;#2D IN A - db #59,#0C ;#2D IN B - db #59,#0D ;#2D IN C - db #59,#0E ;#2D IN D - db #59,#0F ;#2D IN E - db #59,#10 ;#28 ;#2D IN H - db #59,#11 ;#2D IN L - db #5A,#26 ;#2E OUT (C) - db #5A,#2B ;#2E OUT ( - db #5B,#06 ;#2C ;#2F EX DE - db #5B,#0A ;#2F EX AF - db #5B,#25 ;#2F EX (SP) - db #5C,#20 ;#30 LD (BC) - db #5C,#21 ;#30 ;#30 LD (DE) - db #5C,#22 ;#30 LD (HL) - db #5C,#29 ;#30 LD (IY+ - db #5C,#2A ;#30 LD (IY- - db #5C,#27 ;#30 LD (IX+ - db #5C,#28 ;#30 LD (IX- - db #5C,#2B ;#30 LD ( - db #5C,#0B ;#30 LD A - db #5C,#0C ;#38 ;#30 LD B - db #5C,#0D ;#30 LD C - db #5C,#0E ;#30 LD D - db #5C,#0F ;#30 LD E - db #5C,#10 ;#30 LD H - db #5C,#11 ;#30 LD L - db #5C,#05 ;#30 LD BC - db #5C,#06 ;#30 LD DE - db #5C,#07 ;#40 ;#30 LD HL - db #5C,#13 ;#30 LD IY - db #5C,#12 ;#30 LD IX - db #5C,#1B ;#30 LD I - db #5C,#1C ;#30 LD R - db #5C,#08 ;#30 LD SP - db #59,#22 ;#46 ;#2D IN (HL) - db #00 - -;АДРЕС: #1196 операнды/флаги ассемблера -x1196 dc "IXH" ;#00 - dc "IXL" - dc "IYH" - dc "IYL" - dc "BC" - dc "DE" - dc "HL" - dc "SP" - dc "AF'" ;#08 - dc "AF" - dc "A" - dc "B" - dc "C" - dc "D" - dc "E" - dc "H" - dc "L" ;#10 - dc "IX" - dc "IY" - dc "NZ" - dc "Z" - dc "NC" - dc "M" - dc "PO" - dc "PE" ;#18 - dc "P" - dc "I" - dc "R" - dc "F" - db #80 - db #80 - dc "(BC)" - dc "(DE)" ;#20 - dc "(HL)" - dc "(IX)" - dc "(IY)" - dc "(SP)" - dc "(C)" - dc "(IX+" - dc "(IX-" - dc "(IY+" ;#28 - dc "(IY-" - dc "(" ;#2A - db #00 ;#2B - -;АДРЕС: #11F7 мнемоники ассемблера -x11F7 dc "CCF" ;#00 / #2C - dc "CPL" - dc "DAA" - dc "DI" - dc "EI" - dc "EXX" - dc "HALT" - dc "NOP" - dc "RLA" ;#08 / #34 - dc "RLCA" - dc "RRA" - dc "RRCA" - dc "SCF" - dc "LDIR" - dc "LDDR" - dc "CPIR" - dc "CPDR" ;#10 / #3C - dc "INIR" - dc "INDR" - dc "OTIR" - dc "OTDR" - dc "LDI" - dc "LDD" - dc "CPI" - dc "CPD" ;#18 / #44 - dc "INI" - dc "IND" - dc "OUTI" - dc "OUTD" - dc "RLD" - dc "RRD" - dc "RETI" - dc "RETN" ;#20 / #4C - dc "NEG" - db #80 - db #80 - db #80 - dc "DEC" - dc "INC" - dc "JP" - dc "JR" ;#28 / #54 - dc "CALL" - dc "ADC" - dc "ADD" - dc "SBC" - dc "IN" - dc "OUT" - dc "EX" - dc "LD" ;#30 / #5C - dc "ORG" - dc "AND" - dc "OR" - dc "XOR" - dc "SUB" - dc "CP" - dc "PUSH" - dc "POP" ;#38 / #64 - dc "DJNZ" - dc "RET" - dc "BIT" - dc "SET" - dc "RES" - dc "RLC" - dc "RL" - dc "RRC" ;#40 / #6C - dc "RR" - dc "SLA" - dc "SRA" - dc "SRL" - dc "IM" - dc "RST" - dc "DB" - dc "SLI" ;#48 / #74 - db #00 - -;АДРЕС: #12D2 таблица для формирования команд дизасма -x12D2 db %00000111,%00000001 ;#01 - dw x135E - db %00111000,%00000001 ;#02 - dw x135E - db %00111000,%00000001 ;#03 - dw x1366 - db %00110000,%00000001 ;#04 - dw x136E - db %00110000,%00000001 ;#05 - dw x1372 - db %00111000,%00000001 ;#06 - dw x1376 - db %00111000,%00000001 ;#07 - dw x137E - db %00111000,%00000001 ;#08 - dw x1386 - db %11000000,%00000010 ;#09 - dw x138E - db %00111000,%00000001 ;#0A - dw x1396 - db %00111000,%00000001 ;#0B - dw x139E - db %00001111,%00000010 ;#0C - dw x13A6 - db %00111000,%00000010 ;#0D - dw x13C6 - db %00111000,%00000001 ;#0E - dw x13D6 - db %00110000,%00000001 ;#0F - dw x13DE - db %00110000,%00000010 ;#10 - dw x13E2 - db %00110000,%00000010 ;#11 - dw x13EA - db %00001111,%00000010 ;#12 - dw x13F2 - db %00111000,%00000010 ;#13 - dw x1412 - db %00110000,%00000010 ;#14 - dw x1422 - db %00110000,%00000010 ;#15 - dw x142A - db %11000000,%00000010 ;#16 - dw x1432 - db %00111000,%00000001 ;#17 - dw x143A - db %11100000,%00000001 ;#18 - dw x1442 - db %00001111,%00000010 ;#19 - dw x144A - db %00000111,%00000001 ;#1A - dw x146A - db %00111000,%00000001 ;#1B - dw x1472 - db %00111000,%00000001 ;#1C - dw x147A - db %00111000,%00000001 ;#1D - dw x1482 - db %00111000,%00000001 ;#1E - dw x148A - db %00111000,%00000010 ;#1F - dw x1492 - db %00011000,%00000001 ;#20 - dw x14A2 - db %00011000,%00000001 ;#21 - dw x14A6 - db %00011000,%00000001 ;#22 - dw x14AA - db %00011000,%00000001 ;#23 - dw x14AE - -x135E db #0C,#0D,#0E,#0F,#10,#11,#22,#0B -x1366 db #0C,#0D,#0E,#0F,#10,#11,#EA,#0B -x136E db #05,#06,#07,#08 -x1372 db #05,#06,#07,#0A -x1376 db #14,#15,#16,#0D,#18,#19,#1A,#17 -x137E db #83,#82,#85,#84,#89,#88,#87,#86 -x1386 db #92,#91,#94,#93,#98,#97,#96,#95 -x138E db #D2,#00,#D0,#C7,#D1,#C7,#D8,#00 -x1396 db #B6,#B7,#B8,#B9,#BA,#BB,#AF,#B5 -x139E db #9B,#99,#61,#9F,#5E,#60,#5F,#62 -x13A6 db #D3,#00,#D5,#EB,#D6,#00,#52,#CA - db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 - db #D3,#00,#9C,#CA,#D7,#00,#51,#CA - db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 -x13C6 db #33,#00,#AB,#09,#65,#ED,#54,#ED - db #8E,#ED,#8D,#ED,#90,#ED,#8F,#ED -x13D6 db #35,#37,#34,#36,#2E,#2D,#38,#2C -x13DE db #BC,#BD,#BE,#C3 -x13E2 db #AD,#0B,#AE,#0B,#B4,#07,#B4,#0B -x13EA db #B5,#20,#B5,#21,#BE,#2B,#B5,#2B -x13F2 db #66,#CC,#64,#CB,#CD,#EB,#D9,#00 - db #CE,#EB,#63,#CB,#D1,#EC,#72,#00 - db #66,#CC,#DA,#00,#CD,#EB,#D9,#00 - db #CE,#EB,#DB,#00,#D1,#EC,#72,#00 -x1412 db #53,#EB,#EA,#00,#A9,#0B,#A1,#2B - db #AC,#07,#EA,#00,#2F,#00,#30,#00 -x1422 db #66,#00,#31,#00,#8A,#00,#C3,#07 -x142A db #55,#EB,#EA,#00,#EA,#00,#EA,#00 -x1432 db #DD,#C7,#67,#C7,#69,#C7,#68,#C7 -x143A db #6A,#6C,#6B,#6D,#6E,#6F,#74,#70 -x1442 db #EA,#EA,#DF,#DF,#EA,#E0,#EA,#EA -x144A db #E1,#26,#A8,#C8,#A0,#CA,#B4,#CA - db #E2,#00,#E3,#00,#E4,#00,#E5,#00 - db #E1,#26,#A8,#C8,#9A,#CA,#D5,#2B - db #E2,#00,#E3,#00,#E4,#00,#E5,#00 -x146A db #E6,#E7,#E8,#E9,#EA,#EA,#EA,#EA -x1472 db #A2,#A3,#A4,#A5,#A6,#A7,#C4,#A1 -x147A db #4D,#4E,#4E,#4E,#4E,#4E,#4E,#4E -x1482 db #4C,#4B,#4F,#4F,#4F,#4F,#4F,#4F -x148A db #71,#71,#71,#71,#71,#71,#71,#71 -x1492 db #C1,#0B,#C2,#0B,#B5,#1B,#B5,#1C - db #4A,#00,#49,#00,#50,#00,#50,#00 -x14A2 db #41,#42,#39,#3A -x14A6 db #43,#44,#3B,#3C -x14AA db #45,#46,#3D,#3E -x14AE db #47,#48,#3F,#40 - -;АДРЕС: #14B2 таблицы для формирования команд дизасма -x14B2 db #4E,#74,#BB,#BA,#11,#10,#31,#AB - db #18,#19,#1A,#17,#16,#0D,#14,#15 - db #66,#4C,#4B,#07,#BE,#8A,#9C,#22 - db #AF -x14CB db #71,#72,#67,#68,#69,#2B,#B4,#A9 - db #EC,#EB,#ED,#B2,#27,#9D,#8B,#C0 - db #12,#B0,#29,#9E,#8C,#BF,#13 -x14E2 db #49,#4A,#B4,#AE,#AD,#AF,#2B,#21 - db #20,#22 -x14EC db #52,#51,#6A,#6C,#6B,#6D,#6E,#6F - db #70,#74 - -;АДРЕС: #14F6 проверка значения аккумулятора -;вых: cy=1 -> a<#7E или a>#C4 -x14F6 cp #7E - ret c - cp #C5 - ccf - ret - -;АДРЕС: #14FD проверка значения аккумулятора -;вых: cy=1 -> a<#2C или a>#74 -x14FD cp #2C - ret c - cp #75 - ccf - ret - -;АДРЕС: #1504 проверка значения аккумулятора -;вых: cy=1 -> a<#2C или a>#C4 -x1504 cp #2C - ret c - cp #C5 - ccf - ret - -;АДРЕС: #150B проверка значения аккумулятора -;вых: cy=1 -> a<#01 или a>#2B -x150B cp #01 - ret c - cp #2C - ccf - ret - -;АДРЕС: #1512 печать команды ассемблера -;вх: hl - адрес строки дизассемблированной команды -x1512 res 6,(iy+#0E) ;запятая не напечатана - call x2B10 ;печать пробела - ld a,(hl) - call x14F6 ;cy=1 -> a<#7E или a>#C4 - jr c,x1538 -;печать мнемоники из таблицы x1107 - push hl ;a=[#7E..#C4] -> a=a-#7E =[#00..#46] из таблицы x1107 - ld hl,x1107 - sub #7E - add a,a - ld e,a - ld d,#00 - add hl,de - ld a,(hl) ;мнемоника (номер сообщения) - call x1570 ;печать мнемоники ассемблера с пробелом на конце - ld a,(hl) ;начало операнда команды - and #7F - pop hl -;печать первого операнда - inc hl - call x157F ;печать операнда/числа команды ассемблера - jr x1543 -x1538 call x14FD ;cy=1 -> a<#2C или a>#74 - jr c,x1548 ;+0 =[#00..#2C][#74..#7D][#C5..#FF] - call x1570 ;мнемоника без операндов -x1540 call x1599 ;печать операнда/числа -x1543 ld a,(hl) - call x1504 ;cy=1 -> a<#2C или a>#C4 - ret nc ;a=[#2C..#C4] -x1548 cp #F1 - ret z - cp #F7 - ret z - cp #EE - jr nz,x1561 -;печать комментария (для db #nn ;BAD) - call x2B10 ;печать пробела - ld a,";" - rst #10 - inc hl -x1559 ld a,(hl) - inc hl - cp #F0 - ret z - rst #10 - jr x1559 -;печать зяпятой, если еще не напечатана -x1561 bit 6,(iy+#0E) - set 6,(iy+#0E) - jr nz,x1540 - ld a,"," - rst #10 - jr x1540 - -;АДРЕС: #1570 печать мнемоники ассемблера с пробелом на конце -;вх: a - номер сообщения с мнемоникой =[#2C..#74] -;вых: hl=hl+1 -x1570 ld c,(iy+#06) - sub #2C - ld de,x11F7 - call x15FC ;печать сообщения по номеру в A, не менее заданной длины в С - inc hl - jp x2B10 ;печать пробела - -;АДРЕС: #157F печать операнда/числа команды ассемблера -;вх: a - номер операнда/числа команды ассемблера -;вых: a - номер следующего операнда/числа команды ассемблера -x157F call x150B ;cy=1 -> a<#01 или a>#2B - jr c,x159D -;печать операнда a=[#01..#2B] из списка x1196 - push af - sub #01 - ld de,x1196 - call x15FA ;печать сообщения по номеру в A - pop af - cp #27 ;a=[#01..#26] - jr c,x15B1 ;нет смещения для команд (ix/iy+nn), -;печатам число с закрывающей скобкой - call x1599 ;a=[#27..#2B] - ld a,")" - rst #10 - ret -;печать операнда -x1599 ld a,(hl) - inc hl - jr x157F -;печать числа (a<#01 или a>#2B) -x159D cp #F8 - jr c,x15A6 ;a=[#00,#2C..#F7] - call x1626 ;a=[#F8..#FF] печать числа из (hl) (dec/hex) с префиксом - jr x15B1 -;печать сообщения (a=[#00,#2C..#F7]) -x15A6 cp #EC - jr nz,x15AF - call x15DB ;a=#EC печать сообщения из hl - jr x15B1 -;выход -x15AF dec hl - ret -x15B1 ld a,(hl) - ret - -;АДРЕС: #15B3 печать сообщения из hl -;вх: hl - адрес начала сообщения -; b - длина сообщения -; -x15B3 ld a,(hl) - rst #10 - inc hl - djnz x15B3 - ret - -;АДРЕС: #15B9 печать сообщения из hl с заменой непечатных символов на ? -;вх: hl - адрес начала сообщения -; b - длина сообщения -; -x15B9 ld a,(hl) - cp #20 - jr nc,x15C0 - ld a,"?" -x15C0 call x2B0B ;печать символа - inc hl - djnz x15B9 - ret - -;АДРЕС: #15C7 печать сообщения из hl -;вх: hl - адрес начала сообщения -; -x15C7 ld a,(hl) - call x2B0B ;печать символа - inc hl - rlca - ret c - jr x15C7 - -;АДРЕС: #15D0 печать сообщения по номеру (на экран/в буфер) -;вх: a,e - номер сообщения -; hl - адрес начала блока сообщений -; -x15D0 inc a ;поиск сообщения по номеру -x15D1 dec a - jr z,x15DB -x15D4 bit 7,(hl) - inc hl - jr z,x15D4 - jr x15D1 - -;АДРЕС: #15DB печать сообщения из hl -;вх: hl - адрес сообщения -; -x15DB ld b,#01 - -;АДРЕС: #15DD печать сообщения не менее заданной длины -;вх: b - минимальная длина сообщения (дополняется пробелами) -; hl - адрес сообщения -; -x15DD or a -x15DE ld a,(hl) - bit 7,a - call x2B0B ;печать символа со сбросом 7го бита (rst #10) - inc hl - jr z,x15EC - ret c - ld a," " ;напечатаем пробел - jr x15F6 -x15EC djnz x15DE - scf - ld b,#00 - jr x15DE - -;АДРЕС: #15F3 печать нескольких провелов (в B) -;вх: b - количество пробелов -; -x15F3 ld a," " -x15F5 rst #10 -x15F6 djnz x15F5 - or a - ret - -;АДРЕС: #15FA печать сообщения по номеру в A -;вх: de - адрес блока сообщений -; a - номер сообщения -; -x15FA ld c,#01 - -;АДРЕС: #15FC печать сообщения по номеру в A, не менее заданной длины в С -;вх: c - минимальная длина сообщения (дополняется пробелами) -; de - адрес блока сообщений -; a - номер сообщения -; -x15FC ex de,hl - call x1606 ;поиск сообщения по номеру в A - ld b,c - call x15DD - ex de,hl - ret -;поиск сообщения по номеру в A -x1606 or a - ret z - ld b,a -x1609 bit 7,(hl) - inc hl - jp z,x1609 - djnz x1609 - ret - -;АДРЕС: #1612 печать числа в hl (dec/hex) с префиксом -;вх: hl - число -; -x1612 ld c,l - ld b,h - -;АДРЕС: #1614 печать числа в bc (dec/hex) с префиксом -;вх: bc - число -; -x1614 push de - bit 0,(iy+5) - ld de,#0A00 ;десятичное, без префикса - jr nz,x1621 - ld de,#1023 ;шестнадцатиричное, префикс # -x1621 call x162C ;печать числа с префиксом - pop de - ret - -;АДРЕС: #1626 печать числа из (hl) (dec/hex) с префиксом -;вх: 0,a =0/1 двухбайтное/однобайтное число -; 1-2,a - система счисления (bin/oct/dec/hex) -; hl - адрес ячейки с числом -; -x1626 call x1638 ;загрузка числа в bc - -;АДРЕС: #1629 печать числа в bc (bin/oct/dec/hex) с префиксом -;вх: bc - число -; 1-2,a - система счисления -; -x1629 call x1642 ;установка префикса - -;АДРЕС: #162C печать числа в заданной системе счисления -; bc - число -; d - делитель для выделения разряда числа -; e - код префикса -x162C ld a,d - ld (xE024),a - ld a,e - rst #10 ;печать префикса - ld (iy+7),#01 - jr x1673 ;печать числа -;загрузка числа в bc -x1638 ld b,#00 - ld c,(hl) - inc hl - bit 0,a - ret nz - ld b,(hl) - inc hl - ret -;установка префикса для системы счисления -x1642 and %00000110 - ld de,#0225 ;bin - cp #02 - ret c - ld de,#0840 ;oct - ret z - cp #06 - ld de,#0A00 ;dec - ret c - ld de,#1023 ;hex - ret - -;АДРЕС: #1658 печать числа A с предварительным пробелом -;вх: a - число -; b - минимальная длина -; -x1658 ld c,a - ld a,b - ld b,#00 - jr x166B - -;АДРЕС: #165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -;вх: bc - число -; -x165E - scf - jr x1662 - -;АДРЕС: #1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;вх: bc - число -; -x1661 or a -x1662 ld a," " ;cy=1/0 минимальная длина 1/5 - rst #10 ;печать пробела - ld a,#01 - jr c,x166B - -;АДРЕС: #1669 печать десятичного числа bc [0..65535] с ведущими пробелами -;вх: bc - число -; (xE3BC) адрес строки -; -x1669 ld a,#05 -x166B ld (iy+#07),a - -;АДРЕС: #166E печать десятичного числа bc [0..65535] с ведущими пробелами -;вх: bc - число -; (xE3BC) адрес строки -x166E ld de,#000A - jr x1677 - -;АДРЕС: #1673 печать числа bc (на экран/в буфер) -;вх: bc - число -; (xE024) делитель для выделения разрядов -; (xE01B) количестов разрядов -; (xE3BC) адрес строки -; -x1673 ld de,(xE024) ;делитель для выделения разрядов - -;АДРЕС: #1677 печать числа bc (на экран/в буфер) -;вх: bc - число -; de - делитель для выделения разрядов -; (xE01B) количестов разрядов -; (xE3BC) адрес строки -; -x1677 push hl - call x1681 ;преобразование числа в строку - pop hl - ret -x167D ld a,b - or c - jr z,x169E -x1681 dec (iy+7) ;преобразование числа в строку - ld a,b - call x16AA ;деление bc=ac/de - push hl ;hl остаток от деления - call x167D - pop hl - ld a,l - add a,#90 - daa - adc a,#40 - daa - and #7F - cp #20 - jr nc,x169C - ld a," " -x169C rst #10 - ret -x169E dec (iy+7) - ret m - call x167D - ld a,(iy+8) - rst #10 - ret - -;АДРЕС: #16AA деление bc=ac/de -;вых: bc=ac/de -; hl остаток от деления -; -x16AA ld hl,#0000 - ld b,#10 -x16AF rl c - rla - adc hl,hl - sbc hl,de - ccf - jr nc,x16C8 -x16B9 djnz x16AF - rl c - rla - ld b,a - ret -x16C0 rl c - rla - adc hl,hl - add hl,de - jr c,x16B9 -x16C8 djnz x16C0 - rl c - rla - add hl,de - ld b,a - ret - -;АДРЕС: #16D0 печать строки (rst #20) -;вх: ix - адрес дескриптора окна -; -x16D0 ex (sp),hl - push af -x16D2 ld a,(hl) - call x2B0B ;печать символа со сбросом 7го бита (rst #10) - and #80 - inc hl - jr z,x16D2 - pop af - ex (sp),hl - ret - -;АДРЕС: #16DE печать числа hl=[#0000..#FFFF] -;вх: hl - число -; -x16DE ld a,h - call x16E3 - ld a,l - -;АДРЕС: #16E3 печать числа [#00..#FF] -;вх: a - число -; -x16E3 push af - rlca - rlca - rlca - rlca - call x16EC - pop af - -;АДРЕС: #16EC печать числа [#0..#F] -;вх: 0-3,a - число -; -x16EC and #0F - add a,#90 - daa - adc a,#40 - daa - rst #10 - ret - -;коррекция регистра r пользователя -x16F6 ld l,(iy+#02) ;длина команды для дизасма в байтах - jr x1744 - -;коррекция регистра r пользователя -x16FB ld l,#01 - jr x1744 - -;АДРЕС: #16FF исполнение зарезервированных слов анализатора st0-st9 -x16FF bit 4,(iy+#14) - ret z ;анализатор выключен - ld hl,xE9A9 ;таблица адресов слов st0-st9 анализатора - xor a -x1708 push af - ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - ld a,d - or e - call nz,x1DE5 ;выполнение слова анализатора - pop hl - pop af - inc a - cp #0A - jr nz,x1708 - ret - -;АДРЕС: #171B выполнение(трассировка) сформированной команды в отладчике -x171B ld hl,(xDD6B) ;pc программы пользователя - push hl - ld hl,(xE11A) ;адрес начала сормированной команды для трассировки - ld (xDD6B),hl ;новый PC - ld hl,x173A ;адрес возврата - push hl - ld (xE38D),sp ;сохраним стэк - ld hl,xE026 - set 5,(hl) ;выполняется трассировка из отладчика - bit 3,(hl) - call nz,x0581 ;восстановление экрана в странице 5 - jp x0143 ;выход из монитора и выполнение команды -x173A res 5,(iy+#12) - pop hl - ld (xDD6B),hl ;восстановим PC пользователя -;коррекция регистра r пользователя -x1742 ld l,#FF -x1744 ld a,(xDD83+#01) ;коррекция регистра r пользователя - ld h,a - add a,l - rlca - sla h - rra - ld (xDD83+#01),a - ret - -;трассировка команд с условием перехода jr cc -;вых: cy=1 условие выполнено -x1751 ld hl,(xE11A) - inc hl - inc hl - ld (hl),#02 ;jr cc,$+4 - jr x1782 - -;быстрая трассировка команды call -x175A ld hl,(xDDAA) - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - inc hl - ld (xDDAA),hl - ld hl,(xE11A) - inc hl - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl - ld (hl),#CF ;rst #08 - jr x171B ;выполнение(трассировка) сформированной команды в отладчике - -;трассировка команд с условием перехода jp cc/call cc/ret cc -;вых: cy=1 условие выполнено -x1773 ld hl,(xE11A) - inc hl - inc hl - push hl ;установка команды: jp cc,$+5 - ld de,#0004 - add hl,de - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d -x1782 inc hl - ld (hl),#B7 ;or a - inc hl - ld (hl),#CF ;rst #08 - inc hl - ld (hl),#37 ;scf - inc hl - ld (hl),#CF ;rst #08 - ld a,(xDD7F) ;флаги пользователя - push af - call x171B ;выполнение(трассировка) сформированной команды в отладчике - call x1742 ;коррекция регистра r пользователя - ld a,(xDD7F) ;регистр f - rrca ;флаг CY пользователя - pop hl - ld a,h - ld (xDD7F),a ;восстановим флаги - ret - -;exx регистров пользователя -x17A2 ld hl,xDD73 ;регистр hl - ld de,xDD79 ;регистр hl' - ld b,#06 -x17AA ld a,(de) - ld c,(hl) - ex de,hl - ld (de),a - ld (hl),c - inc de - inc hl - djnz x17AA - ret - -;ex af,af' регистров пользователя -x17B4 ld hl,xDD7F ;регистр af - ld de,xDD81 ;регистр af' - ld b,#02 - jr x17AA - -;трассировка команды rst #08 -x17BE ld de,#0008 - ld hl,(xDDD0) ;адрес следующей команды дизасма - or a - sbc hl,de - jr nz,x1807 ;формируем команду для исполнения - ld hl,(xDD6B) ;pc программы пользователя - ld e,#FF - jp x01F5 ;вызов обработчика ошибок Basic 48k - -;трассировка команды halt -x17D1 ld a,(xDD83) ;флаг IFFF2 - bit 2,a - jr nz,x17EA ;прерываения разрешены - ld a,#AB ;di:halt -> сообщение: finish program - jp x0AE0 ;печать/обновление окна отладчика - -;команды: ex af,af' и exx -x17DD ld a,(xDDB4) ;1й байт команды дизассемблера без префиксов - cp #08 ;команда ex af,af' - push af - call z,x17B4 ;ex af,af' регистров пользователя - pop af - call nz,x17A2 ;exx регистров пользователя -x17EA call x16FB ;коррекция регистра r пользователя - jp x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - -;АДРЕС: #17F0 выполнение одной команды по адресу в PC -x17F0 ld hl,(xDD6B) ;pc программы пользователя - call x191E ;проверка попадания адреса на адреса #3D00-#3DFF - jp nc,x18F1 ;возможна только быстрая трассировка, pc пользователя в пределах #3D00..#3DFF - call x2F96 ;анализ команды ассемблера по адресу в hl - ld a,(xDDB7) - cp #32 ;это halt - jr z,x17D1 - cp #72 ;это rst #08 - jr z,x17BE - -;формируем команду для исполнения -; сохраним память в буфере -x1807 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - push hl - ld de,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма - ld bc,#0008 - ldir - pop de -; установим режим прерываний - ld a,(xDD83) ;флаг IFFF2 - bit 2,a - ld a,#F3 ;di - jr z,x181F - ld a,#FB ;ei -x181F ld (de),a - inc de -; копируем команду в буфер для исполнения - ld hl,(xDD6B) ;pc программы пользователя - ld c,(iy+#02) ;длина команды в байтах - ld b,#00 - call x0753 ;сохранение области памяти в ram 8 -; ставим rst #08 для возврата - ld a,#CF ;rst #08 - ld (de),a - ld a,(iy+#03) - or a - jp z,x18BA ;выполнение команды при трассировке -;для команды exx/ex af,af' - bit 7,a - jr nz,x17DD ;команды: ex af,af' и exx -;для команды ret/ret cc - bit 1,a - jr z,x185A ;это не ret - bit 5,a - jr z,x1851 ;это команда ret -; команда ret cc - ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - inc hl ;поправка на di/ei - ld a,(hl) - and %00111000 - or %11000010 - ld (hl),a - call x1773 ;трассировка команд с условием перехода jp cc/jr cc/call cc/ret cc - jr nc,x1861 ;условие не выполнено -x1851 call nc,x16F6 ;коррекция регистра r пользователя - call x3640 ;pop de со стэка пользователя - ex de,hl - jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;для команд jr cc -x185A bit 2,a - jr z,x1865 - call x1751 ;трассировка команд с условием перехода jr cc -x1861 jr nc,x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - jr x18A7 ;условие выполнено -;для команд call/call cc -x1865 bit 0,a - jr z,x1894 - bit 7,(iy+#16) - jr nz,x18D5 ;выполнение команды в отладчике с быстрым выполнением подпрограмм -; пошаговая трассировка - call x190F - jr c,x18DA ;только быстрая трассировка -x1874 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - inc hl - ld a,(hl) - or a - bit 0,a - jr nz,x1888 ;это call - and %00111000 ;это call cc - or %11000010 - ld (hl),a - call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc - jr nc,x18BD ;условие не выполнено -; установка регистров и стэка для вызова команды call -x1888 call nc,x16FB ;коррекция регистра r пользователя - ld de,(xDDAA) ;текущий адрес команды ассемблера для дизасма - call x3A14 ;запись de на стэк пользователя - jr x18A7 -;для команд jp/jp cc -x1894 bit 3,a - jr z,x18AC - call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc - jr nc,x18BD ;условие не выполнено - call x190F ;проверка возможности пошаговой трассировки команд call - push af - call c,x1742 ;коррекция регистра r пользователя - pop af - jr c,x18F4 ;только быстрая трассировка -x18A7 ld hl,(xDDD0) ;адрес следующей команды дизасма - jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;для пустых команд??? -x18AC bit 4,a - jr z,x18B5 - call x16FB ;коррекция регистра r пользователя - jr x18A7 -;неизвестная команда -x18B5 ld a,#AA - jp x0AE0 ;печать/обновление окна отладчика - -;выполнение команды при трассировке -x18BA call x171B ;выполнение(трассировка) сформированной команды в отладчике -x18BD ld hl,(xDDAA) ;текущий адрес команды ассемблера для дизасма - -;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;вх: hl - PC пользователя -x18C0 ld (xDD6B),hl ;новый PC пользователя - push hl - ld hl,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма - ld de,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - ld bc,#0008 - ldir - call x16FF ;исполнение зарезервированных слов анализатора st0-st9 - pop hl - ret - -;выполнение команды в отладчике с быстрым выполнением подпрограмм -; вызов call -x18D5 call x191B ;проверка попадания адреса команды на адреса #3D00-#3DFF - jr nc,x1874 ;вызов невозможен, это Tr-Dos -x18DA ld hl,(xDDD0) - ld de,#0028 - or a - sbc hl,de - jr nz,x18BA ;выполнение команды при трассировке -; это call #28/rst #28 - bit 4,(iy-#02) - jp nz,x1874 ;это Basic 48k - call x175A ;быстрая трассировка команды call - jr x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - -;только быстрая трассировка -;вх: hl - PC программы пользователя -x18F1 ld (xDDD0),hl ;адрес следующей команды дизасма -x18F4 ld hl,(xE11A) - inc hl - ld (hl),#CD ;call #nnnn - inc hl - ld de,(xDDD0) - ld (hl),e - inc hl - ld (hl),d - inc hl - ld (hl),#CF ;rst #08 - call x3640 ;pop de со стэка пользователя - push de - call x171B ;выполнение(трассировка) сформированной команды в отладчике - pop hl - jr x18C0 - -;проверка возможности пошаговой трассировки команд call -;вых: cy=1 возможна только быстрая трассировка -x190F or a - bit 3,(iy+#05) ;Не трассировать (выполнять сразу) подпрограммы, расположенные в ПЗУ - ret z - ld a,(xDDD0+#01) - cp #40 - ret nc ;это не ПЗУ - -;АДРЕС: #191B проверка попадания адреса команды на адреса #3D00-#3DFF -;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos -x191B ld hl,(xDDD0) ;адрес следующей команды дизасма - -;АДРЕС: #191E проверка попадания адреса на адреса #3D00-#3DFF -;вх: hl - pc программы пользователя -;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos -x191E bit 4,(iy-#02) ;4,#7FFD пользователя - scf - ret z ;ПЗУ Basic128 пользователя - ld de,#3D00 - or a - sbc hl,de - add hl,de - ret c - ld de,#3E00 - sbc hl,de - add hl,de - ccf - ret - -;сообщение дизасма для неопознанной команды -x1934 db #73 ;DB - db #FF ;признак числа hex 1 байт - db #00 ;число - db #EE,"BAD",#F0 ;сообщение - -;выход из п/п x197F анализа команды ассемблера -x193C ld (ix+0),#F7 ;признак конца команды - pop ix - ret - -;команда ex de,hl -x1943 ld (ix+0),#AA ;первая часть: ex de - inc ix - ld (ix+0),#07 ;вторая часть: hl -x194D inc ix -x194F ld (iy+2),#01 ;длина команды в байтах - jp x1A78 - -;команда halt -x1956 ld (ix+0),#32 ;номер сообщения мнемоники: halt - ld a,(hl) - or a - jr z,x194D ;если был префикс, команда неизвестна - -;неизвестная команда -x195E ld hl,x1934 ;команда неизвестна - ld de,xDDB7 - ld bc,#0008 - ldir - push de - pop ix - xor a - ld (iy+#01),a ;нет префикса - ld (iy+#04),a - ld (iy+#03),#40 - ld a,(xDDAC) ;код первого байта команды - ld (xDDB7+#02),a ;отобразится в сообщении DB #?? - jr x194F - -;АДРЕС: #197F анализ команды ассемблера -; формирование сообщения для печати дизасма команды -;вых: bc - длина команды ассеблера -x197F push ix -;установка регистров - ld ix,xDDB7 ;буфер сообщения - ld de,(xDDAA) ;адрес команды - ld hl,x193C ;адрес возврата - push hl - ld (xDDCB),sp - bit 4,(iy+#00) - jr z,x199F - call x1DB3 ;поиск чего-то cy=1 найдено - ld b,#F1 - call c,x1D88 - -;обнуление дизасма команды ассемблера -x199F ld e,#09 - ld hl,xE015 ;iy+#01 - xor a - ld d,a ;начальная длина команды =0 - ld (hl),a - ld (xDDCD),a - ld (xE017),a - ld (xE018),a -;проверка наличия префиксов - ld bc,xDDAC ;начало команды - ld a,(bc) - cp #EB - jr z,x1943 ;это ex de,hl - cp #DD ;проверка на префикс #DD - jr nz,x19C2 ;нет префикса - ld (hl),#02 ;префикс #DD - inc bc - inc d ;длина команды - jr x19CA -x19C2 cp #FD ;проверка на префикс #FD - jr nz,x19CA ;нет префикса - ld (hl),#03 ;префикс #FD - inc bc - inc d ;длина команды -x19CA ld a,(bc) - cp #76 ;halt - jr z,x1956 ;это команда halt - cp #CB ;проверка на префикс #CB - jr nz,x19DB ;нет префикса - set 3,(hl) ;префикс #CB - ld e,#16 - inc bc - inc d ;длина команды - jr x19EA -x19DB cp #ED ;проверка на префикс #ED - jr nz,x19EA ;нет префикса - set 2,(hl) ;префикс #ED - bit 1,(hl) - jp nz,x195E ;есть префикс #DD/#FD. неизвестная команда - inc bc - ld e,#18 - inc d ;длина команды -x19EA inc d ;длина команды - ld (iy+#02),d ;длина команды -;копируем команду в буфер без префикса - push de - ld de,xDDB4 ;копируем в буфер команду без префиксов - ld h,b - ld l,c - ld bc,#0003 - ldir - pop de - ld a,(xE015) ;корректировка команды без учета префиксов - and %00001010 - cp %00001010 - jr nz,x1A09 - ld a,(xDDB4+#01) ;два префикса #CB и #DD/#FD - ld (xDDB4),a ;код команды - -;формирование команды дизасма по таблице -x1A09 xor a - push af - push af - ld a,e ;e=#09/#16/#18 -x1A0D add a,a - add a,a - ld b,#00 - ld c,a - ld hl,x12D2-#04 - add hl,bc - ld c,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl - адрес начала таблицы - ld a,(xDDB4) ;код команды без учета префиксов - ld b,#00 - and c -x1A24 inc b - srl c - jr nc,x1A24 - or a -x1A2A dec b - jr z,x1A30 - rrca - jr x1A2A -x1A30 bit 0,d - jr nz,x1A35 - add a,a -x1A35 ld b,#00 - ld c,a - add hl,bc -x1A39 ld a,(hl) - inc hl - dec d - or a - jr z,x1A62 - cp #EA - jp z,x195E ;неизвестная команда - cp #C5 - jr c,x1A94 - cp #EA - jr nc,x1A94 - sub #C6 - cp #17 - jr nz,x1A56 - set 6,(iy+#04) -x1A56 bit 0,d - jr z,x1A0D - push de - push hl - jr x1A0D -x1A5E ld a,d - or a - jr nz,x1A39 -x1A62 pop hl - pop de - ld a,d - or a - jr nz,x1A39 - ld hl,xE015 - bit 1,(hl) - jr z,x1A78 ;нет префикса #DD/#FD - bit 4,(hl) - jr nz,x1A78 - bit 7,(hl) - jp z,x195E ;;неизвестная команда -x1A78 ld bc,(xE016) ;длина команды - ld b,#00 - ld sp,(xDDCB) ;восстановим стэк - ret -x1A83 cp #20 - jr nc,x1AA7 - ld (ix+#00),a - inc ix - set 5,(iy+#01) - ld a,#22 - jr x1AA7 -x1A94 push de - push hl - bit 1,(iy+#01) - jr z,x1AA7 ;нет префикса #DD/#FD - ld hl,xE018 - bit 7,(hl) - jr nz,x1A83 - bit 6,(hl) - jr nz,x1A83 -x1AA7 push af -x1AA8 ld hl,x14B2 - ld bc,#0024 - cpir - ld b,a - jp nz,x1BD1 - ld a,c - cp #1E - jr nc,x1AD5 - cp #1C - jr nc,x1B27 - cp #0B - jp c,x1C5B - cp #14 - ld hl,xE017 - jr nc,x1B2D - cp #11 - jr c,x1B3A - set 1,(hl) - jp x1BD1 -x1AD2 dec b - jr x1B0E -x1AD5 ld hl,xE015 - cp #23 - jr z,x1AD2 - jr c,x1AE9 - cp #2C - jr nc,x1B13 - set 3,(iy+#04) - jp x1BD1 -x1AE9 cp #22 - jr z,x1B0E - bit 1,(hl) - jr z,x1B10 - bit 3,(hl) - jr nz,x1B10 ;есть префикс #СВ - sub #1D - cp #03 - jr nc,x1B23 - bit 7,(hl) - jr nz,x1B10 - bit 5,(iy+#04) - jr nz,x1B10 -x1B05 bit 0,(hl) - jr z,x1B0B ;это префикс #DD - add a,#02 -x1B0B ld b,a - set 4,(hl) -x1B0E set 5,(hl) -x1B10 jp x1BD1 -x1B13 set 5,(hl) - cp #2D - jr nc,x1B1E - ld a,#66 - jp x1AA8 -x1B1E ld b,#33 - jp x1BD1 -x1B23 add a,#7B - jr x1B05 -x1B27 set 7,(iy+#03) ;это ex af,af' либо exx - jr x1B10 -x1B2D bit 1,(hl) - jr z,x1B10 ;нет префикса #DD/#FD - set 5,(hl) - sub #14 - ld (xE032),a - jr x1B10 -x1B3A ld hl,(xDD73) ;регистр hl - ld (xDDCE),hl - cp #0E - jr nz,x1B60 - set 4,(iy+#03) ;это jp (hl) - bit 1,(iy+#01) - jr z,x1B5D ;нет префикса #DD/#FD - ld hl,(xDD6F) ;регистр ix - bit 0,(iy+#01) - jr z,x1B5A - ld hl,(xDD71) ;регистр iy -x1B5A ld (xDDCE),hl -x1B5D ld (xDDD0),hl -x1B60 ld hl,xE015 - ld a,(hl) - bit 1,a - jr z,x1B10 ;нет префикса #DD/#FD - set 7,(hl) - ld e,c - ld hl,x14CB - bit 0,a - ld b,#00 - jr z,x1B78 ;префикс #DD - ld a,c - add a,#06 - ld c,a -x1B78 add hl,bc - ld b,(hl) - ld (ix+#00),b - inc ix - ld a,e - cp #0D - jr nc,x1BD6 - cp #0C - jr nz,x1BA0 - bit 4,(iy+#01) - jr z,x1BA0 - ld a,#01 - and (ix-#02) - add a,#BA - ld (ix-#02),a - res 4,(iy+#01) - res 5,(iy+#01) -x1BA0 inc (iy+#02) - ld a,(xDDAC+#02) - or a - jp p,x1BAF - inc (ix-#01) - neg -x1BAF ld (ix+#00),#FD - inc ix - ld b,a - ld hl,(xDD6F) ;регистр ix - bit 0,(iy+#01) - jr z,x1BC2 ;префикс #DD - ld hl,(xDD71) ;регистр ix -x1BC2 ld de,(xDDAC+#02) - ld d,#00 - bit 7,e - jr z,x1BCD - dec d -x1BCD add hl,de - ld (xDDCE),hl ;адрес перехода при дизасме -x1BD1 ld (ix+#00),b - inc ix -x1BD6 pop af - push af - ld hl,x14E2 - ld bc,#000A - cpir - jr nz,x1C3C - ld a,c - cp #08 - jr nc,x1C45 - and #03 - jr z,x1C00 - dec a - jr z,x1BF6 - dec a - jr z,x1BFB - ld hl,(xDDD0) - jr x1C03 -x1BF6 ld hl,(xDD77) ;регистр bc - jr x1C03 -x1BFB ld hl,(xDD75) ;регистр de - jr x1C03 -x1C00 ld hl,(xDDCE) ;адрес перехода при дизасме -x1C03 ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти - ld a,c - cp #04 - ld b,#02 - jr nc,x1C35 - dec b - cp #03 - jr nz,x1C1B - ld a,(xDDCD) ;код команды дизасма - cp #A1 - jr nz,x1C35 - jr x1C3C -x1C1B or a - jr nz,x1C35 - ld a,(xDDCD) ;код команды дизасма - ld hl,x14EC - ld bc,#000A - cpir - jr z,x1C33 - bit 7,(iy+#04) - ld b,#01 - jr z,x1C35 -x1C33 ld b,#03 -x1C35 ld a,b - or (iy+#04) - ld (iy+#04),a -x1C3C pop af - ld (xDDCD),a ;код команды дизасма - pop hl - pop de - jp x1A5E -x1C45 ld b,#03 - ld hl,(xDD73) ;регистр hl - ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти - jr x1C35 -x1C4F ld (xDDD0),de - ld b,#EC - call x1D88 - jp x1BD6 -x1C5B cp #03 - jr c,x1C64 - ld (ix+#00),b - inc ix -x1C64 ld d,#00 - ld hl,xE017 - cp #01 - jp c,x1D00 - jr z,x1C8E - cp #04 - jr c,x1CC9 - cp #06 - jr c,x1C8E - cp #08 - jr c,x1CE4 - jr z,x1CE8 - cp #0A - jp z,x1D58 - ld a,(xDDB4) ;команда дизассемблера без префиксов - and #38 - set 0,(hl) ;это команда call/call cc - ld e,a - jp x1D44 -x1C8E ld a,(xDDCD) ;код команды дизасма - cp #A1 - jr z,x1CC9 - cp #55 - jr z,x1CBB - cp #53 - jr z,x1CAC - cp #91 - jr nc,x1CB0 - cp #82 - jr c,x1CBD - set 5,(hl) ;это команда ret cc - sub #82 - ld (xE032),a -x1CAC set 3,(hl) ;это команда jp/jp cc - jr x1CBD -x1CB0 cp #99 - jr nc,x1CBD - set 5,(hl) ;это команда ret cc - sub #91 - ld (xE032),a -x1CBB set 0,(hl) ;это команда call/call cc -x1CBD ld de,(xDDB4+#01) - inc (iy+#02) - inc (iy+#02) - jr x1D2C -x1CC9 inc (iy+#02) - ld b,#FF - ld hl,xE015 - bit 1,(hl) - jr z,x1CDE ;нет префикса #DD/#FD - bit 4,(hl) - jr nz,x1CDE - ld a,(xDDB4+#02) - jr x1CE1 -x1CDE ld a,(xDDB4+#01) -x1CE1 ld e,a - jr x1CF7 -x1CE4 set 7,(iy+#04) -x1CE8 ld a,(xDDB4) - set 5,(iy+#04) - and #38 - rrca - rrca - rrca - ld e,a -x1CF5 ld b,#FD -x1CF7 ld (ix+#00),b - inc ix - ld b,e - jp x1BD1 - -;байтовое смещение в команде -x1D00 ld a,(xDDCD) - cp #65 - jr nz,x1D0B - set 2,(iy+#04) -x1D0B sub #8D - jr c,x1D14 - ld (xE032),a - set 5,(hl) -x1D14 inc (iy+#02) - set 2,(hl) - ld a,(xDDB4+#01) ;второй байт команды - ld d,#00 - or a - jp p,x1D23 - dec d -x1D23 ld e,a - ld hl,(xDDAA) ;адрес команды - inc hl - inc hl - add hl,de - ld e,l - ld d,h -x1D2C set 6,(iy+#01) ;байтовое смещение в команде - bit 4,(iy+#00) - jr z,x1D3C - call x1DB3 - jp c,x1C4F -x1D3C ld b,#FC - bit 0,(iy+#05) - jr nz,x1D46 ;число в десятичной -x1D44 ld b,#FE -x1D46 ld (ix+#00),b - inc ix - ld (ix+#00),e - inc ix - ld b,d - ld (xDDD0),de ;адрес следующей команды дизасма - jp x1BD1 - -x1D58 ld e,#00 - ld b,#FC - ld a,(xDDB4) - cp #46 - jr z,x1CF5 - inc e - cp #56 - jr z,x1CF5 - inc e - cp #5E - jr z,x1CF5 - set 5,(iy+#01) - ld e,#00 - cp #4E - jr z,x1D85 - cp #66 - jr z,x1D85 - cp #6E - jr z,x1D85 - inc e - cp #76 - jr z,x1D85 - inc e -x1D85 jp x1CF5 - -x1D88 ld (ix+0),b - ld (ix+1),#4C - inc ix - inc ix - ld c,#04 -x1D95 ld l,#04 - xor a -x1D98 sla e - rl d - rla - dec l - jr nz,x1D98 - add a,#90 - daa - adc a,#40 - daa - ld (ix+0),a - inc ix - dec c - jr nz,x1D95 - set 7,(ix-1) - ret - -;вх: de - данные для поиска (адрес команды для дизасма) -x1DB3 or a - bit 4,(iy+#00) - ret z - ld bc,(xDDD4) ;счетчик - ld hl,(xDDD6) ;адрес чего-то -x1DC0 ld a,b - or c - ret z - ld a,(hl) - inc hl - cp e - jr nz,x1DCC - ld a,(hl) - cp d - scf - ret z -x1DCC inc hl - dec bc - jr x1DC0 - -;АДРЕС: #1DD0 список команд отладчика -x1DD0 dc "$" - dc "FLOAD" - dc "FSAVE" - db #00 -x1DDC dw x1FB0: db %00100000 ;$ (аналог WORD) - dw x1E45: db %00000100 ;FLOAD - dw x1E4F: db %00000100 ;FSAVE - -;АДРЕС: #1DE5 выполнение слова анализатора -;вх: de - адрес слова анализатора -x1DE5 ld hl,(xE11C) ;адрес первого свободного байта программы анализатора -x1DE8 inc hl - ld (xE9D9),hl ;адрес начала стэка анализатора - inc hl - ld (xE9DB),hl ;адрес вершины стэка анализатора (адрес первой свободной ячейки) -;исполнение команды анализатора - ld hl,#0000 - push hl - push de - ex de,hl -x1DF6 ld a,(hl) - or a - inc hl - jr z,x1E04 -x1DFB ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - push de - ex de,hl - jr x1DF6 -;исполнение слова из команды анализатора -x1E04 ld (xE9DD),sp - call x1E0E ;call (hl) - jp x2261 -x1E0E jp (hl) - -;АДРЕС: #1E0F установка кода команды в программу анализатора -;вх: de - адрес программы анализатора -; a - байт программы -;вых: de - адрес программы анализатора +1 (если успешно) -x1E0F push hl - or a - ld hl,xF6C0+#FF - sbc hl,de - jr z,x1E1C - ld (de),a - inc de - pop hl - ret -x1E1C ld a,#2D ;ошибка: insufficient program space - jp x0B06 ;ввод и обработка команды отладчика - -;установка параметров буфера fcb -;вх: a - способ открытия файла -; hl - номер сектора -; de - номер дорожки -;вых: hl=bc вх -; bc - четвертый параметр -x1E21 call x306F ;ix=буфер fcb - ld (ix+#17),a - ld h,e - ld (xE7A9+#0E),hl ;номер первого сектора и дорожки файла - push bc - ld hl,#0000 - ld (xE7A9+#13),hl ;указатель в файле - dec l - ld (ix+#0D),l ;объем файла в секторах =#FF - ld (ix+#1B),l ;максимальный объем файла в секторах =#FF - ld hl,xE8A9 - ld (xE7A9+#15),hl ;адрес буфера dma - pop hl - ld bc,(xDD99+#06) ;размер загружаемого файла (4й параметр) - ret - -;АДРЕС: #1E45 Команда: FLOAD track, sector, start, length -; прямое чтение с диска -;вх: de - номер дорожки -; hl - номер сектора -; bc - адрес загрузки -; a - количество операндов [0..5] -x1E45 ld a,#05 - call x1E21 ;установка параметров буфера fcb - call x30D8 ;чтение файла в память - jr x1E9B ;обработка ошибок и выход в отладчик - -;АДРЕС: #1E4F Команда: FSAVE track, sector, start, length -; прямая запись на диск -;вх: de - номер дорожки -; hl - номер сектора -; bc - адрес загрузки -; a - количество операндов [0..5] -x1E4F ld a,#07 - call x1E21 ;установка параметров буфера fcb - call x3107 ;запись области памяти на диск - jr x1E9B ;обработка ошибок и выход в отладчик - -;АДРЕС: #1E59 открытие файла для чтения/записи программы анализатора -;вх: hl - адрес строки имени файла -; b - способ открытия -;вых: hl - стартовый адрес файла -; bc - длина файла в байтах -x1E59 call x3065 ;установка регистров для загрузки/сохранения - ;hl - адрес строки имени файла - ;ix - адрес буфера создаваемого fcb - ;de - адрес буфера dma =xE8A9 - rst #30 - dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - db #07 - jr c,x1E9E ;ошибка чтения/записи - call x0EBA ;выделение из строки числовых операндов (не более 6) - or a - jr z,x1E6C ;больше нет операндов - ld a,#0B ;ошибка: too many operands - jr x1EA2 ;полное обновление окна отладчика -;открываем файл -x1E6C rst #30 - dw rom7_x11DF ;открыть файл для последующих операций с ним - db #07 - jr c,x1E9E ;ошибка чтения/записи - ld hl,(xE7A9+#09) ;стартовый адрес файла - ret - -;АДРЕС: #1E76 Команда: DEFSave filename -x1E76 bit 3,(iy+#14) - ld a,#2E ;ошибка: program undefined - ret z ;ошибка: программы нет - ld b,#02 ;откроем файлна запись - call x1E59 ;открытие файла для записи программы анализатора - ld hl,(xE11C) ;конец программы - ld bc,xF6C0 ;начало программы - push bc - sbc hl,bc - ld a,#2E ;ошибка: program undefined - jr z,x1EA2 ;нулевая длина - ld b,h - ld c,l - pop hl - call x1ED6 ;запись программы анализатора в файл -x1E95 jr c,x1E9E ;ошибка чтения/записи -;закрываем файл. продолжение работы отладчика -x1E97 rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 -x1E9B jp nc,x0AFB -x1E9E rst #30 - dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа - db #06 -x1EA2 jp x0B06 ;полное обновление окна отладчика - -;АДРЕС: #1EA5 Команда: DEFLoad filename -x1EA5 ld b,#01 ;для чтения - call x1E59 ;открытие файла для чтения - ld de,xF6C0 ;расположение программы анализатора - push de - sbc hl,de - pop hl - ld a,#2E ;сообщение: program undefined - jr nz,x1EA2 ;ошибка: несовпадение адреса загрузки - dec bc - dec bc ;bc - длина файла в байтах -2 - ld a,b - cp #04 - ld a,#2D ;сообщение: insufficient program space - jr nc,x1EA2 ;ошибка: слишком длинная программа - push bc - push bc - push hl - call x1F25 ;Команда: CLear (очистим область программы) - pop hl - pop bc - call x1EFB ;чтение программы анализатора из файла - jr c,x1E95 ;ошибка чтения - pop de ;длина программы - ld hl,xF6C0 - add hl,de - ex de,hl ;de - адрес первого свободного байта в буфере программы - call x1F28 ;установка первого свободного байта адреса начала программы анализатора - jr x1E97 ;закрываем файл. продолжение работы отладчика - -;запись программы анализатора в файл -;вх: hl - адрес буфера программы анализатора -; bc - размер для записи -;вых: cy=1 ошибка записи -x1ED6 ld (xE7A9+#09),hl ;стартовый адрес файла - ld a,#41 ;первый байт сигнатуры - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи - ld a,(x00F1) ;второй байт сигнатуры - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи -x1EE6 ld a,(hl) - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи - inc hl - dec bc - ld a,b - or c - jr nz,x1EE6 - ret -;запись очередного байта в файл -x1EF2 push hl - push bc - rst #30 - dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" - db #07 - pop bc - pop hl - ret - -;чтение программы анализатора из файла -;вх: hl - адрес буфера программы анализатора -; bc - размер для загрузки -;вых: cy=1 ошибка чтения -x1EFB call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - cp #41 -x1F01 ld a,#55 ;ошибка: illegal fromat file - jr nz,x1EA2 ;ошибка сигнатуры файла - call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - ld e,a - ld a,(x00F1) - cp e - jr nz,x1F01 -x1F10 call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - ld (hl),a - inc hl - dec bc - ld a,b - or c - jr nz,x1F10 - ret -;чтение очередного байта из файла -x1F1C push hl - push bc - rst #30 - dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - db #07 - pop bc - pop hl - ret - -;АДРЕС: #1F25 Команда: CLear -x1F25 ld de,xF6C0 -x1F28 call x205F ;установка первого свободного байта адреса начала программы анализатора - xor a - call x1E0F ;установка кода команды в программу анализатора - call x1E0F ;установка кода команды в программу анализатора - ld hl,xE9A9 - ld b,#28 ;очистка буфера программы -x1F37 ld (hl),a - inc hl - djnz x1F37 -x1F3B set 3,(iy+#14) ;есть пустая программа - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #1F42 Команда: ANalyser boolean -x1F42 ld hl,xE028 - bit 3,(hl) - ld a,#2E ;сообщение: program undefined - ret z ;программа не задана - ld a,e - and #FE - or d - ld a,#0C ;сообщение: out of range - ret nz - ld a,#81 ;сообщение: enter command - res 4,(hl) ;выключим анализатор - bit 0,e - ret z - set 4,(hl) ;включим анализатор - ret - -;АДРЕС: #1F5B поиск введенного слова в словаре/программе пользователя -;вх: hl - адрес строки с началом слова -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -x1F5B call x0EE6 ;поиск в строке первого печатного символа - push hl -x1F5F call x1F9B ;проверка является ли символ буквой или цифрой - ld a,#2F ;ошибка: illegal word name - jp c,#0B06 ;ввод и обработка команды отладчика - inc hl - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x1F5F ;это не разделитель - pop hl - -;АДРЕС: #1F6E поиск слова по словарю -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -; a - код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) -x1F6E ld de,x23A3 ;начало базовых слов анализатора - call x1F78 ;поиск слова в словаре - ret nz ;слово найдено в словаре -;поиск слова в программе пользователя - ld de,xF6C0 ;программа анализатора - -;поиск слова по словарю -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; a=#00 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -; определение адреса следующего слова -x1F78 ld a,(de) - inc de - ld c,a - ld a,(de) - inc de - ld b,a - or c ;bc - адрес следующего слова - ret z ;конец списка -; сравнение введенного слова сос словом из словаря - push hl ;адрес введенной строки -x1F81 ld a,(de) - and #7F - cp #20 - jr c,x1F92 ;конец названия слова в словаре (слово найдено) - cp (hl) - inc de - inc hl - jr z,x1F81 -x1F8D pop hl -; слово не соответствует введенному, будем проверять следующее слово в словаре - ld e,c - ld d,b - jr x1F78 -; проверяем наличие разделителя после введенного слова -x1F92 call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x1F8D ;это не разделитель, сравниваем со следующим словом в словаре - inc hl - pop bc - or a - ret - -;проверка является ли символ буквой или цифрой -;вх: a - код символа -;вых: cy=1 - этоне буква/цифра -x1F9B cp #30 ;"0" - ret c - cp #3A ;":" - ccf - ret nc - cp #41 ;"A" - ret c - cp #5B ;"Z"+1 - ccf - ret nc - cp #61 ;"a" - ret c - cp #7B ;"z"+1 - ccf - ret - -;АДРЕС: #1FB0 Команда: WORD word[:] program -;вх: hl - адрес начала строки с параметрами команды -x1FB0 call x1F5B ;поиск введенного слова в словаре/программе пользователя - jp nz,x2148 ;слово найдено - -;проверка на совпадение с зарезервированными словами -x1FB6 ld de,(xE11C) ;адрес первого свободного байта программы анализатора - inc de - inc de - push hl - ld bc,xE9A9 ;буфер программы анализатора - ld a,#73 ;"s" - cp (hl) - jr nz,x1FCD - ld a,#74 ;"t" -x1FC7 inc hl - cp (hl) - jr nz,x2001 - jr x1FD9 ;это зарезервированное слово: st?/br? -x1FCD ld bc,xE9BD - ld a,#62 ;"b" - cp (hl) - jr nz,x2001 - ld a,#72 ;"r" - jr x1FC7 -; есть ли цифра после букв -x1FD9 inc hl - ld a,(hl) - sub #30 - jr c,x2001 - cp #0A - jr nc,x2001 - inc hl - push bc ;адрес буфера адресов зарезервированных слов - ld c,a ;номер слова - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x2000 ;таки не принадлежит зарезервированным словам -; задаваемое слово - из зарезервированных слов - sla c - ld b,#00 - pop hl ;адрес буфера адресов зарезервированных слов - add hl,bc - ex (sp),hl - call x2002 ;запись нового слова в программу-анализатор - pop hl ;адрес буфера адресов зарезервированных слов - ld de,(xE9D1) ;адрес начала параметров-слов в программе анализатора - ld (hl),e - inc hl - ld (hl),d - jp x1F3B - -;запись нового слова в программу-анализатор -;вх: de - адрес начала программы анализатора -x2000 pop hl -x2001 pop hl -;установка названия слова-программы анализатора -x2002 ld a,(hl) - or #80 ;первый символ слова - call x1E0F ;установка кода команды в программу анализатора -x2008 inc hl - ld a,(hl) ;очередной символ слова - call x1E0F ;установка кода команды в программу анализатора - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x2008 ;это еще не разделитель - cp #0D -x2014 ld a,#30 ;сообщение: no definition - jp z,x0B06 ;конец строки. есть имя, но нет содержания -x2019 ld a,#01 - dec de - ld (de),a ;признак конца названия слова - ld (xE9D1),de - inc de -;установка слов-параметров программы - inc hl - call x0EE6 ;поиск в строке первого печатного символа - jr z,x2014 ;нет параметров в пограмме. выход -x2028 push de ;адрес в программе анализатора - call x1F6E ;поиск слова по словарю - ld b,a ;код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) - ld a,e - ld c,d ;ca - адрес конца слова в словаре (указывает на #00) - pop de ;адрес программы анализатора - jr z,x2064 ;слова в словаре нет -; установка адреса конца слова в словаре - call x1E0F ;установка кода команды в программу анализатора - ld a,c - call x1E0F ;установка кода команды в программу анализатора -; проверка конца строки - ld a,b - cp #0D - jr z,x2043 ;больше нет слов в параметрах -x203E call x0EE6 ;поиск в строке первого печатного символа - jr nz,x2028 ;слово найдено -; слова-параметры закончились -x2043 ld hl,x225D ;п/п прерывания выполнения слова - ld a,l - call x1E0F ;установка кода команды в программу анализатора - ld a,h - call x1E0F ;установка кода команды в программу анализатора - xor a - call x1E0F ;установка кода команды в программу анализатора - call x1E0F ;установка кода команды в программу анализатора - dec de - dec de ;указывает на маркер конца определяемого слова -;установка свободного адреса в программе анализаторе - ld hl,(xE11C) - ld (hl),e - inc hl - ld (hl),d - ld a,#81 ;сообщение: enter command - -;АДРЕС: #205F установка адреса начала программы анализатора -;вх: de - адрес программы анализатора -x205F ld (xE11C),de - ret - -;если число, записываем п/п обработки числа, если отсутствующее слово, то выход -;вх: de - первый свободный адрес в программе анализатора -; hl - адрес слова-параметра в введенной строке -; bc =#0000 -x2064 push de - call x0DF4 ;преобразование строки в число (!!!при base 0 работает неверно!!!) - ld c,e - ld b,d ;bc - число - pop de - jr z,x2076 ;это число - cp #0D ;!!!ОШИБКА!!! A не может быть =#0D - jr nz,x2073 - ld a,#31 ;сообщение: word not known -x2073 jp x0B06 -; установка в программу п/п обработки числа -x2076 push hl - ld hl,x2340 ;п/п обработки числа в программе анализатора - ld a,l - call x1E0F - ld a,h - call x1E0F - ld a,(xE024) ;делитель для выделения разряда числа - call x1E0F - ld a,c - call x1E0F - ld a,b - call x1E0F - pop hl - jr x203E - -;АДРЕС: #2093 Команда: EDit -;вх: hl - адрес начала строки с параметрами команды -x2093 call x1F5B ;поиск введенного слова в словаре/программе пользователя - ld a,#31 ;ошибка: word not known - ret z ;слово не найдено - dec hl ;следующий адрес в введенной строке (после найденного слова) - call x0EE6 ;поиск в строке первого печатного символа - ld a,#0B ;ошибка: too many operands - ret nz ;выход - ex de,hl - ld a,(hl) - or a - jr z,x20BD ;слово в базовом словаре есть !!!ОШИБКА(убрать???)!!! приводит к зависанию - ld a,#32 ;ошибка: forbidden type word - ret z ;!!!ОШИБКА!!! тут выхода не будет никогда - call x20AE - ld a,#06 ;_Working ... - ret - -;печать слова из словаря пользователя -;вх: hl - адрес конца команды/слова анализатора -x20AE ld de,x20FF ;адрес выхода из п/п - push de - ld de,xDE17 ;буфер для печати - ld (xE3BC),de - ld a,#20 ;" " - ld b,#2B ;"+" - -;слово есть в базовом словаре -x20BD ld (de),a - inc de - djnz x20BD - set 6,(iy+#09) ;чтение данных после управляющего кода - ld a,#24 ;"$" - rst #10 ;печать символа - -;АДРЕС: #20C8 печать редактируемого слова -;вх: hl - адрес конца команды/слова анализатора -;печать названия программы(слова) -x20C8 call x2112 ;поиск начала и печать слова анализатора - ld a,":" - rst #10 -;печать слов программы -x20CE ld a," " - rst #10 - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - push hl - ld hl,x225D ;п/п зхавершения выполнения слова - or a - sbc hl,bc - jr z,x20ED ;это конец программы - ld hl,x2340 ;п/п обработки числа - or a - sbc hl,bc - jr z,x20EF ;это число, а не слово - ld l,c - ld h,b - call x2112 ;поиск начала и печать слова анализатора -x20EA pop hl - jr x20CE ;следующее слово программы -;конец программы -x20ED pop hl - ret -;это число, а не слово -x20EF pop hl - inc hl - ld e,(hl) ;система счисления - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - ld a,e - or a - push hl - jr z,x2126 ;печать однобайтного числа в кавычках -x20FA call x2130 ;печать числа в заданной системе счисления - jr x20EA - -;выход из п/п -x20FF res 6,(iy+#09) - ret - -;АДРЕС: #2104 печать слова анализатора -;вх: hl - адрес слова анализатора -;вых: hl - адрес начала следующего слова -; cy=1 слово напечатано -; cy=0 нет больше слов для печати -x2104 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,e - or d - ret z - rst #20 - db #8D ;перевод строки - call x2117 ;печать сообщения из hl. конец сообщения [#00..#1F] - ex de,hl - ret - -;АДРЕС: #2112 поиск начала и печать команды отладчика/слова анализатора -;вх: hl - адрес конца команды/слова анализатора -;вх: hl - не изменяется -x2112 dec hl - bit 7,(hl) - jr z,x2112 -;печать сообщения из hl. конец сообщения [#00..#1F] -x2117 ld a,(hl) - and #7F - cp #20 - ret c - rst #10 - inc hl - jr x2117 - -;АДРЕС: #2121 чтение ld bc,(hl+1): hl=hl+2 -x2121 inc hl - ld c,(hl) - inc hl - ld b,(hl) - ret - -;печать однобайтного числа в кавычках -x2126 ld a,#22 ;'"' - push af - rst #10 - ld a,c - rst #10 - pop af - rst #10 - jr x20EA - -;печать числа в заданной системе счисления -;вх: bc - число -; a - основание системы счисления -x2130 ld hl,x162C ;п/п печати числа в заданной системе счисления - push hl - ld d,a - ld e,"%" - cp #02 - ret z ;двоичная - ld e,"@" - cp #08 - ret z ;восьмеричная - ld e,#2E ;"." - cp #0A - ret z ;десятичная - ld de,#1023 - ret ;шестнадцатиричная - -;АДРЕС: #2148 Команда: WORD word[:] program -; Продолжение (для переопределения уже определенных слов) -;Вх: de - адрес конца слова в программе (указывает на #01) -; bc - адрес начала введенной строки -x2148 ld (xE9D3),de ;адрес конца названия слова в программе (указывает на #01) - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - push hl - ex de,hl -;ищем начало слова -x2151 bit 7,(hl) - dec hl - jr z,x2151 - dec hl - ld (xE9D5),hl ;адрес первой ячейки переопределяемого слова -;записываем новое слов в программу - ld h,b - ld l,c ;адрес начала введенной строки - call x1FB6 ;установка слова праграммы -;удаление переопределяемого слова - ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова - ld e,(hl) - inc hl - ld d,(hl) - dec hl - ex de,hl - push de ;de - адрес начала переопределяемого слова - push hl ;hl - адрес начала следующего слова, после переопределяемого - push hl - ld b,h - ld c,l ;bc - адрес начала следующего слова, после переопределяемого - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - or a - sbc hl,bc - ld b,h - ld c,l ;bc - длина перемещаемого блока программы - inc bc - inc bc - pop hl - ldir - dec de - dec de - ld (xE11C),de - pop de ;de - адрес начала следующего слова, после переопределяемого - pop hl ;hl - адрес начала переопределяемого слова - or a - sbc hl,de - ld b,h - ld c,l - pop hl - add hl,bc - inc hl -x2189 inc hl - ld a,(hl) - cp #20 - jr nc,x2189 - ld (xE9D7),hl ;адрес конца названия переопределенного слова в программе (указывает на #01) -;коррекция адресов слов в программе - ld hl,xF6C0 ;начало программы -x2195 ld e,(hl) - inc hl - ld d,(hl) - ld a,d - or e ;адрес следующего слова - jr z,x21D7 ;конец программы - push hl ;адрес ячейки с указанием на следующее слово - ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова - or a - sbc hl,de - jr nc,x21AE - ld h,b - ld l,c ;на сколько сократилась программа - add hl,de - ex de,hl - pop hl - push hl - ld (hl),d - dec hl - ld (hl),e -x21AE pop hl - inc hl -; ищем конец слова -x21B0 ld a,(hl) - inc hl - cp #20 - jr nc,x21B0 -x21B6 ld e,(hl) - inc hl - ld d,(hl) ;de - адрес слова программы - inc hl - push hl - ld hl,x2340 - or a - sbc hl,de - jr nz,x21C9 ;это не число - pop hl ;для числа оставляем как есть - inc hl - inc hl - inc hl - jr x21B6 -x21C9 ld hl,x225D ;прерывание выполнения слова - or a - sbc hl,de - pop hl - jr z,x2195 ;это конец слова-программы - call x21F3 ;коррекция адреса конца пользовательского слова в программе - jr x21B6 - -;завершение. коррекция адресов зарезервированных слов в программе -x21D7 ld hl,xE9A9 ;адреса зарезервированных слов анализатора st0-st9 - call x21E0 - ld hl,xE9BD ;адреса зарезервированных слов анализатора br0-br9 -x21E0 ld a,#0A -x21E2 push af - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,d - or e - call nz,x21F3 - pop af - dec a - jr nz,x21E2 - ld a,#88 ;сообщение: word redefined - ret - -;коррекция адреса конца пользовательского слова в программе -x21F3 push hl - ld hl,(xE9D3) - or a - sbc hl,de - jr z,x220E - jr nc,x220C - ld a,(de) - or a - jr z,x220C - ld h,b - ld l,c - add hl,de - ex de,hl -x2206 pop hl - push hl - dec hl - ld (hl),d - dec hl - ld (hl),e -x220C pop hl - ret -x220E ld de,(xE9D7) - jr x2206 - -;АДРЕС: #2214 Команда: PDEFinition вывод на принтер Форт - программы -x2214 set 4,(iy+#09) - -;АДРЕС: #2218 Команда: LDEFinition вывод на экран Форт - программы -x2218 call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3300 ;сообщение: analyser definitions: - rst #08 - rst #20 - db #0D,#8D -;печать размера свободной области - ld hl,xF6C0+#FF ;адрес конца стэка анализатора - ld de,(xE11C) ;адрес первого свободного байта стэка анализатора - scf - sbc hl,de - ld (xDDA7),hl - ld bc,#3400 ;сообщение: space left for stack _число_ - rst #08 - ld a," " - rst #10 - ld bc,#3500 ;сообщение: bytes - rst #08 - rst #20 - db #0D,#8D -;печать списка заданных слов - ld hl,xF6C0 -x2240 ld c,(hl) - inc hl - ld b,(hl) - ld a,b - or c - jr z,x2256 ;конец программы - push bc ;адрес следующего слова - inc hl - inc hl - call x20C8 ;печать редактируемого слова - ld a,#0D - rst #10 ;перевод строки - call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - pop hl - jr x2240 -;завершение печати -x2256 res 4,(iy+#09) ;печать в экран - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #225D прерывание выполнения слова/завершение работы форт программы -x225D nop - pop hl - pop hl - pop hl - -;АДРЕС: #2261 переход к обработке следующего слова в программе анализатора -; или выход, если слов больше нет -x2261 pop de - pop hl - ld a,l - or h - jp nz,x1DFB -;слов в программе больше нет - bit 5,(iy+#14) - ret nz ;вызов был из команды EVal - push hl - push de - ld (xE9DD),sp - ld hl,(xE9DB) - ld de,(xE11C) - inc de - inc de - inc de - inc de - or a - sbc hl,de - ld a,#36 ;сообщение: stack not empty - jp nz,x2307 ;обработка ошибок при работе программы анализатора - call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - pop hl - pop hl - ret z - pop hl - pop hl - pop af - ld l,a ;число для сообщения - ld a,#85 ;сообщение: stop number _число_ - jp x01D5 - -;АДРЕС: #2297 Команда: EVal word выполнить слово word -;вх: hl - адрес строки с параметрами -x2297 bit 3,(iy+#14) - ld a,#2E ;сообщение: program undefined - ret z ;программа анализатора не задана -;анализ команды ассемблера по адресу PC - push hl - ld hl,(xDD6B) ;pc программы пользователя - call x2F96 ;анализ команды ассемблера по адресу в hl - pop hl -;установка слов команды в программу анализатора - ld de,(xE11C) ;адрес первого свободного байта программы анализатора - push de - push hl - inc de - inc de ;поправка на адрес - ld hl,x2301 - ld b,#07 -x22B3 ld a,(hl) - call x1E0F ;установка кода команды в программу анализатора - inc hl - djnz x22B3 - pop hl ;hl - адрес строки с параметрами команды (список слов на выполнение) - dec hl ;de - адрес первого свободного байта программы анализатора - push de - call x2019 ;установка слов в программу - pop de - dec de -;выполнение введенных слов - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - ex (sp),hl - ld (xE11C),hl - xor a - ld (hl),a - inc hl - ld (hl),a ;нет больше слов, только эти - set 5,(iy+#14) ;работает команда EVal word - pop hl - call x1DE8 ;выполнение слова анализатора - res 5,(iy+#14) -;печать содержимого стэка анализатора - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3700 ;сообщение: state of stack - rst #08 ;печать сообщения - ld a,#0D - rst #10 ;перевод строки - ld de,(xE9D9) ;адрес начала стэка анализатора - inc de -x22E8 ld hl,(xE9DB) ;адрес вершины стэка анализатора - or a - sbc hl,de - ld a,#81 ;сообщение: enter command - ret z ;стэк пустой - push de - ld a,#0D - rst #10 ;перевод строки - call x237F ;чтение элемента с вершины стэка анализатора - call x1614 ;печать числа в bc (dec/hex) с префиксом - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - pop de - jr x22E8 -x2301 db #80+"*","eval*" - -;обработка ошибок при работе программы анализатора -;вх: a - номер сообщения об ошибке -x2307 ld (xDDA7),a - ld sp,(xE9DD) - call x0550 ;сохранение экрана из страницы 5 - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3800 ;сообщение: workspace insufficient - rst #08 ;печать сообщения по номеру в BC - rst #20 - db #0D,#8D ;два перевода строки -x231B pop hl - push hl - ld de,x2340 - or a - sbc hl,de - pop hl - jr z,x2332 - push hl - rst #20 - dc "in " - pop hl - call x2112 ;поиск начала и печать слова анализатора - ld a,#0D - rst #10 ;перевод строки -x2332 call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - pop hl - ld a,h - or l - jr nz,x231B - ld a,(xDDA7) - jp x0B06 - -; обработки числа в программе анализатора -x2340 nop - pop ix - pop de - pop hl - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - inc hl - push hl - push de - push ix - -;АДРЕС: #234D запись элемента на стэк анализатора -;вх: bc - значение для помещения на стэк анализатора -x234D push hl - push de - ld hl,(xE9DB) ;адрес вершины стэка анализатора - push hl - inc hl - inc hl - ld de,xF6C0+#FF ;xF7BF адрес конца стэка анализатора - or a - sbc hl,de - ld a,#39 ;сообщение: out of stack space - jr nc,x2307 ;нет места на стэке - pop hl - ld (hl),c ;пишем значение на стэк - inc hl - ld (hl),b - inc hl - -;АДРЕС: #2364 установка нового значения вершины стэка анализатора -;вх: hl - адрес новой вершины стэка -x2364 ld (xE9DB),hl - pop de - pop hl - ret - -;АДРЕС: #236A запись на стэк анализатора байта из ячейки памяти пользователя -;вх: bc - адрес памяти -x236A push hl - ld l,c - ld h,b ;адрес в памяти пользователя - rst #28 ;чтение байта из памяти пользователя - pop hl - ld c,a - ld b,#00 - jr x234D ;запись элемента на стэк анализатора - -;АДРЕС: #2374 запись на стэк анализатора слова из ячеек памяти пользователя -;вх: bc - адрес памяти -x2374 push hl - ld l,c - ld h,b - rst #28 ;чтение байта из памяти пользователя - ld c,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld b,a - pop hl - jr x234D ;запись элемента на стэк анализатора - -;АДРЕС: #237F чтение элемента с вершины стэка анализатора -;вых: bc - считанное значение -x237F push hl - push de - ld hl,(xE9DB) ;адрес вершины стэка анализатора - dec hl - push hl - or a - ld de,(xE9D9) ;адрес начала стэка анализатора - sbc hl,de - ld a,#3A ;сообщение: stack empty - jp z,x2307 ;выход по ошибке - pop hl - ld b,(hl) - dec hl - ld c,(hl) ;bc - содержимое вершины стэка анализатора - jr x2364 - -;АДРЕС: #2398 чтение двух элементов с вершины стэка анализатора -;вых: hl,de - первое значение -; bc - второе значение -x2398 call x237F ;чтение элемента с вершины стэка анализатора - push bc - call x237F ;чтение элемента с вершины стэка анализатора - pop de - ld l,e - ld h,d - ret - -;АДРЕС: #23A3 базовые слова анализатора -;слово: NOP нет операции -; +0 2 адрес следующего слова (=#0000 это конец списка) -; +2 n слово анализатора (в первом байте 7,=1), #00 признак конча слова -; +2+n процедура обработки слова -x23A3 dw x23AA - db #80+"N","OP",#00 -; процедура обработки - ret - -;слово: DUP Дублировать содержимое вершины стека. На стеке создается копия -; верхнего элемента -x23AA dw x23B8 - db #80+"D","UP",#00 -; процедура обработки -x23B0 call x237F ;чтение элемента с вершины стэка анализатора - call x234D ;запись элемента на стэк анализатора - jr x234D ;запись элемента на стэк анализатора - -;слово: SWAP перестановка двух элементов на вершине стека -x23B8 dw x23CC - db #80+"S","WAP",#00 -; процедура обработки -x23BF call x2398 ;чтение двух элементов с вершины стэка анализатора - push bc - ld c,l - ld b,h - call x234D ;запись элемента на стэк анализатора - pop bc -x23C9 jp x234D ;запись элемента на стэк анализатора - -;слово: OVER копирование второго от вершины элемента стека. Копия помещается -; на вершину стека -x23CC dw x23E0 - db #80+"O","VER",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - push bc - call x23B0 ;слово: DUP - pop bc - call x234D ;запись элемента на стэк анализатора - jr x23BF ;слово: SWAP - -;слово: ROT циклический сдвиг трех верхних элементов стека. Третий от вершины -; стека элемент помещается на вершину стека. -x23E0 dw x23FE - db #80+"R","OT",#00 -; процедура обработки -x23E6 call x2398 ;чтение двух элементов с вершины стэка анализатора - push hl - push bc - call x237F ;чтение элемента с вершины стэка анализатора - pop hl - push bc - ld c,l - ld b,h - call x234D ;запись элемента на стэк анализатора - pop de - pop bc - push de - call x234D ;запись элемента на стэк анализатора - pop bc - jr x23C9 ;запись значения на стэк анализатора - -;слово: DROP удаление верхнего элемента стека -x23FE dw x2408 - db #80+"D","ROP",#00 -; процедура обработки - jp x237F ;чтение элемента с вершины стэка анализатора - -;слово: + получить значение суммы двух верхних элементов стека -x2408 dw x2414 - db #80+"+",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - add hl,bc -x2410 ld c,l - ld b,h - jr x23C9 ;запись значения на стэк анализатора - -;слово: - получить значение разности двух верхних элементов стека -x2414 dw x2422 - db #80+"-",#00 -; процедура обработки -x2418 call x2398 ;чтение двух элементов с вершины стэка анализатора - ld h,b - ld l,c - or a - sbc hl,de - jr x2410 ;запись значения на стэк анализатора - -;слово: / получить значение частного от целочисленного деления двух верхних -; элементов стека -x2422 dw x2439 - db #80+"/",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - call x0E73 ;деление bc=hl/de с проверкой de на ноль - bit 2,(iy+#0E) ;=1 ошибка. деление на ноль - jr z,x2456 ;запись элемента на стэк анализатора - ld a,#40 ;сообщение: devision by zero - jp x2307 - -;слово: * получить значение произведения двух верхних элементов стека -x2439 dw x2447 - db #80+"*",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - jr x2410 ;запись значения на стэк анализатора - -;слово: AND получить значение операции поразрядного логического "И" над двумя -; верхними элементами стека -x2447 dw x2459 - db #80+"A","ND",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - and l - ld c,a - ld a,b - and h - ld b,a -x2456 jp x234D ;запись элемента на стэк анализатора - -;слово: OR получить значение операции поразрядного логического "ИЛИ" над двумя -; верхними элементами стека -x2459 dw x2469 - db #80+"O","R",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - or l - ld c,a - ld a,b - or h - ld b,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: XOR получить значение операции поразрядного логического "Исключающее -; ИЛИ" над двумя верхними элементами стека -x2469 dw x247A - db #80+"X","OR",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - xor l - ld c,a - ld a,b - xor h - ld b,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: NOT инвертировать значение находящееся на вершине стека -x247A dw x248B - db #80+"N","OT",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,b - cpl - ld b,a - ld a,c - cpl - ld c,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: = истина при равенстве двух элементов, в противном случае Ложь -x248B dw x2494 - db #80+"=",#00 -; процедура обработки - call x2418 ;слово: - - jr x24CB ;слово: 0= - -;слово: 0> истина, если элемент положителен (больше нуля), в противном случае -; Ложь -x2494 dw x24A7 - db #80+"0",">",#00 -; процедура обработки -x2499 call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b -x249E ld bc,#0000 - jr z,x24A4 -x24A3 inc bc -x24A4 jp x234D ;запись элемента на стэк анализатора - -;слово: < истина, если n1 меньше чем n2, в противном случае Ложь -x24A7 dw x24BA - db #80+"<",#00 -; процедура обработки -x24AB call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - or a - sbc hl,de -x24B3 ld bc,#0000 - jr c,x24A3 ;запись =1 на стэк анализатора - jr x24A4 ;запись =0 на стэк анализатора - -;слово: > истина, если n1 больше чем n2, в противном случае Ложь -x24BA dw x24C6 - db #80+">",#00 -; процедура обработки -x24BE call x2398 ;чтение двух элементов с вершины стэка анализатора - or a - sbc hl,bc - jr x24B3 - -;слово: 0= истина, если элемент равен нулю, в противном случае Ложь -x24C6 dw x24D8 - db #80+"0","=",#00 -; процедура обработки -x24CB call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - inc bc - jr z,x24D6 - ld bc,#0000 -x24D6 jr x24A4 ;запись элемента на стэк анализатора - -;слово: <= истина, если n1 меньше или равно n2, в противном случае Ложь -x24D8 dw x24E2 - db #80+"<","=",#00 -; процедура обработки -x24DD call x24BE ;слово: > - jr x24CB ;слово: 0= - -;слово: >= истина, если n1 больше или равно n2, в противном случае Лож -x24E2 dw x24EC - db #80+">","=",#00 -; процедура обработки - call x24AB ;слово: < - jr x24CB ;слово: 0= - -;слово: <> истина, если n1 не равно n2, в противном случае Ложь -x24EC dw x24F6 - db #80+"<",">",#00 -; процедура обработки - call x2418 ;слово: - - jr x2499 ;слово: 0> - -;слово: & поместить на вершину стека значение операции логическое "И" над двумя -; верхними элементами стека, сами элементы при этом удаляются. В -; отличие от слова AND, слово & работает с логическими величинами -; (Истина и Ложь) -x24F6 dw x2505 - db #80+"&",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,b - or c - jr z,x249E - ld a,l - or h - jr x249E - -;слово: C@ разместить на вершине стека байт, считанный по адресу n1 -x2505 dw x2510 - db #80+"C","@",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - jp x236A ;запись на стэк анализатора байта из ячейки памяти пользователя - -;слово: C@ разместить на вершине стека байт, считанный по адресу n1 -x2510 dw x251A - db #80+"@",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - jp x2374 ;запись на стэк анализатора слова из ячеек памяти пользователя - -;слово: BIT разместить на вершине стека значение бита с номером n1 в элементе n2 -x251A dw x253D - db #80+"B","IT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld h,#00 - ld a,l - and #0F - ld de,#0001 - jr x2531 -x252D sla e - rl d -x2531 dec a - jp p,x252D - ld a,e - and c - ld c,a - ld a,d - and b - or c - jr x255E ;запись значения на стэк анализатора - -;слово: ADDR разместить на вершине стека значение адреса на который ссылаются -; команды работающие с ячейками памяти, такие как LD ( ),reg или -; SET b,(IX+d). Для других команд на стек помещается значение 0 -x253D dw x2555 - db #80+"A","DDR",#00 -; процедура обработки - ld a,(iy+#04) - ld bc,#0000 - and %00000011 - jr z,x2552 - ld bc,(xDDD2) -x2552 jp x234D ;запись значения на стэк анализатора - -;слово: RD истина, если команда считывает из памяти, и Ложь, если считывания -; не происходит -x2555 dw x2561 - db #80+"R","D",#00 -; процедура обработки - bit 0,(iy+#04) -x255E jp x249E ;запись значения на стэк анализатора - -;слово: WR истина, если команда производит запись в память, и Ложь, если запись -; не выполняется -x2561 dw x256C - db #80+"W","R",#00 -; процедура обработки - bit 1,(iy+#04) - jr x255E - -;слово: ACF помещает на вершину стека значение Истина, если команда использует -; доступ к ячейке памяти, для других команд - помещается значение Ложь -x256C dw x2579 - db #80+"A","CF",#00 -; процедура обработки - ld a,(xE018) - and %00000011 - jr x255E - -;слово: CF значение флага переноса -x2579 dw x2586 - db #80+"C","F",#00 -; процедура обработки - ld a,#01 -x2580 ld hl,xDD7F - and (hl) - jr x255E - -;слово: NF значение флага команды вычитания -x2586 dw x258F - db #80+"N","F",#00 -; процедура обработки - ld a,#02 - jr x2580 - -;слово: PVF значение флага четности/переполнения -x258F dw x2599 - db #80+"P","VF",#00 -; процедура обработки - ld a,#04 - jr x2580 - -;слово: HF значения флага двоично - десятичного переноса -x2599 dw x25A2 - db #80+"H","F",#00 -; процедура обработки - ld a,#10 - jr x2580 - -;слово: ZF значение флага нулевого результата -x25A2 dw x25AB - db #80+"Z","F",#00 -; процедура обработки - ld a,#40 - jr x2580 - -;слово: SF значение флага отрицательного результата -x25AB dw x25B4 - db #80+"S","F",#00 -; процедура обработки - ld a,#80 - jr x2580 - -;слово: REG размещает на вершине стека значение регистровой пары, соответствующей коду n1 -x25B4 dw x25CC - db #80+"R","EG",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - -;запись регистровой пары на стэк анализатора -;вх: c - код регистровой пары/ячейки MEM -x25BD ld hl,xDD69 ;адрес текущей ячейки в мониторе - ld b,#00 - add hl,bc - ld c,(hl) - inc hl - ld b,(hl) ;bc - значение регистровой пары/ячейки MEM - jr x2552 ;запись элемента на стэк анализатора - -;чтение кода и запись регистровой пары на стэк анализатора -x25C8 pop hl - ld c,(hl) - jr x25BD ;запись регистровой пары на стэк анализатора - -;слово: CREG размещает на вершине стека значение регистра, выбираемого кодом n1 -x25CC dw x25E6 - db #80+"C","REG",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора -x25D6 ld hl,xDD69 - ld b,#00 - add hl,bc - ld c,(hl) - ld b,#00 - jp x234D ;запись элемента на стэк анализатора -x25E2 pop hl - ld c,(hl) - jr x25D6 - -;слово: SP размещает на вершине стека значение регистра SP -x25E6 dw x25EF - db #80+"S","P",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #04 - -;слово: PC размещает на вершине стека значение регистра PC -x25EF dw x25F8 - db #80+"P","C",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #02 - -;слово: IX размещает на вершине стека значение регистра IX -x25F8 dw x2601 - db #80+"I","X",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #06 - -;слово: IY размещает на вершине стека значение регистра IY -x2601 dw x260A - db #80+"I","Y",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #08 - -;слово: BC размещает на вершине стека значение регистра BC -x260A dw x2613 - db #80+"B","C",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0E - -;слово: DE размещает на вершине стека значение регистра DE -x2613 dw x261C - db #80+"D","E",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0C - -;слово: HL размещает на вершине стека значение регистра HL -x261C dw x2625 - db #80+"H","L",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0A - -;слово: AF размещает на вершине стека значение регистра AF -x2625 dw x262E - db #80+"A","F",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #16 - -;слово: C размещает на вершине стека значение регистра C -x262E dw x2636 - db #80+"C",#00 -; процедура обработки - call x25E2 - db #0E - -;слово: B размещает на вершине стека значение регистра B -x2636 dw x263E - db #80+"B",#00 -; процедура обработки - call x25E2 - db #0F - -;слово: E размещает на вершине стека значение регистра E -x263E dw x2646 - db #80+"E",#00 -; процедура обработки - call x25E2 - db #0C - -;слово: D размещает на вершине стека значение регистра D -x2646 dw x264E - db #80+"D",#00 -; процедура обработки - call x25E2 - db #0D - -;слово: L размещает на вершине стека значение регистра L -x264E dw x2656 - db #80+"L",#00 -; процедура обработки - call x25E2 - db #0A - -;слово: H размещает на вершине стека значение регистра H -x2656 dw x265E - db #80+"H",#00 -; процедура обработки - call x25E2 - db #0B - -;слово: F размещает на вершине стека значение регистра F -x265E dw x2666 - db #80+"F",#00 -; процедура обработки - call x25E2 - db #16 - -;слово: A размещает на вершине стека значение регистра A -x2666 dw x266E - db #80+"A",#00 -; процедура обработки - call x25E2 - db #17 - -;слово: MEM поместить на вершину стека значение текущей ячейки монитора -x266E dw x2678 - db #80+"M","EM",#00 -; процедура обработки - call x25C8 ;чтение кода и запись номера ячейки на стэк анализатора - db #00 ;код ячейки MEM - -;слово: CALL выполнить подпрограмму, расположенную по адресу n1 -x2678 dw x269A - db #80+"C","ALL",#00 -; процедура обработки - push iy - push ix - call x268B - pop ix - pop iy - ret -x268B call x237F ;чтение элемента с вершины стэка анализатора - push bc - ld ix,xDD69 - ld de,x234D ;п/п записи элемента на стэк анализатора - ld hl,x237F ;п/п чтения элемента с вершины стэка анализатора - ret - -;слово: ! слово (два смежных байта) n1 поместить в память по адресу n2 -x269A dw x26A7 - db #80+"!",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - rst #00 ;запись байта в память пользователя - inc hl - ld a,b -x26A5 rst #00 ;запись байта в память пользователя - ret - -;слово: C! байт n1 поместить в ячейку памяти, адресуемую n2 -x26A7 dw x26B2 - db #80+"C","!",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - jr x26A5 - -;слово: IF если верхний элемент стека имеет значение Ложь (равен нулю), то -; выполнение слова, содержащего IF, прекращается. Управление передается -; вызвавшему слову (либо происходит окончание выполнения -; Форт - программы, если слово является первым). В противном случае -; (верхний элемент - Истина) продолжается выполнение текущего слова -x26B2 dw x26C0 - db #80+"I","F",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,b - or c - ret nz ;продолжаем выполнять - jp x225D ;прерывание выполнения слова - -;слово: MEM! установить адрес текущей ячейкой монитора n1 -x26C0 dw x26CF - db #80+"M","EM!",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (xDD69),bc - ret - -;слово: ?PAUSE ожидание нажатия на любую клавишу, если верхний элемент стека -; имеет значение Истина (не равен нулю). После нажатия на клавишу -; выполнение программы продолжается. Если вовремя ожидания ввести -; комбинацию EDIT/C, то выполнение Форт - программы будет прервано, -; а управление передано монитору -x26CF dw x26EA - db #80+"?","PAUSE",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - ret z - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - cp #03 ;cs+1+c - ret nz - ld a,#9A ;сообщение: command abandoned - jp x2307 - -;слово: KEY ожидание нажатия на какую-либо клавишу, код клавиш будет помещен на -; вершину стека -x26EA dw x26FA - db #80+"K","EY",#00 -; процедура обработки - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 -x26F4 ld c,a - ld b,#00 -x26F7 jp x234D ;запись элемента на стэк анализатора - - -;слово: ?MEM обновить (перевывести) вывести дамп памяти на экран (используется -; экран дампа памяти теневого монитора), если n1 истина -; (не равно нулю) -x26FA dw x270C - db #80+"?","MEM",#00 -; процедура обработки - call x2736 - and #CF ;обновлять дамп памяти, обновлять дизассемблер памяти по содержимому ячейки памяти -x2706 ld (xE01E),a - jp x2CA8 ;печать/обновление монитора-отладчика - -;слово: ?REG обновить (перевывести) информацию о содержимом регистров на экране -; монитора, если n1 истина (не равно нулю) -x270C dw x271A - db #80+"?","REG",#00 -; процедура обработки - call x2736 - and #F5 - jr x2706 - -;слово: ?DIS вывести реассемблер трассируемых команд (в правый верхний угол -; экрана). Реассемблер выводится по содержимому регистра PC, если -; n1 истина (не равно нулю) -x271A dw x2728 - db #80+"?","DIS",#00 -; процедура обработки - call x2736 - and #BF - jr x2706 - -;слово: ?SCR полностью перевывести экран теневого монитора, если n1 истина -; (не равно нулю) -x2728 dw x2742 - db #80+"?","SCR",#00 -; процедура обработки - call x2736 - and #80 - jr x2706 -;чтение переменной (xE01E) -x2736 call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - pop hl - ret z - push hl - ld a,(xE01E) - ret - -;слово: SYS1 на вершину стека помещается значение системного регистра #7FFD -x2742 dw x2750 - db #80+"S","YS1",#00 -; процедура обработки - ld c,(iy-#02) -x274C ld b,#00 - jr x26F7 ;запись элемента на стэк анализатора - -;слово: SYS2 на вершину стека помещается значение системного регистра #1FFD -x2750 dw x275C - db #80+"S","YS2",#00 -; процедура обработки - ld c,(iy-#01) - jr x274C - -;слово: !SYS1 значение верхнего элемента стека устанавливается в системном -; регистре #7FFD -x275C dw x276B - db #80+"!","SYS1",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (iy-#02),c - ret - -;слово: !SYS2 значение верхнего элемента стека устанавливается в системном -; регистре #1FFD -x276B dw x277A - db #80+"!","SYS2",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (iy-#01),c - ret - -;слово: IFF на вершину стека помещается состояние флага разрешения прерываний -; в отлаживаемой программе -x277A dw x278A - db #80+"I","FF",#00 -; процедура обработки - ld a,(xDD83) - and #04 - rrca - rrca - jp x26F4 ;запись элемента на стэк анализатора - -;слово: RAM поместить на вершину стека номер установленного банка -x278A dw x2796 - db #80+"R","AM",#00 -; процедура обработки - call x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - jp x26F4 ;запись элемента на стэк анализатора - -;слово: !RAM изменить номер установленного банка на банк, указываемый верхним -; элементом стека -x2796 dw x27A4 - db #80+"!","RAM",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld l,c - jp x3732 ;установка страницы пользователя равной номеру страницы в L - -;слово: IN поместить на вершину стека данные, считанные из порта ввода, -; адресуемого значением верхнего элемента стека -x27A4 dw x27B0 - db #80+"I","N",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - in c,(c) - jr x274C - -;слово: OUT вывести в порт вывода с адресом n2 данные n1 -x27B0 dw x27BC - db #80+"O","UT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - out (c),l - ret - -;слово: DIN поместить на вершину стека данные, считанные из порта ввода Tr-Dos, -; адресуемого значением верхнего элемента стека -x27BC dw x27CB - db #80+"D","IN",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - rst #18 ;вызов п/п Tr-Dos - dw rom3_x3FF3 ;чтение порта - ld c,a - jr x274C ;запись элемента на стэк анализатора - -;слово: DOUT вывести в порт вывода Tr-Dos с адресом n2 данные n1 -x27CB dw x27DA - db #80+"D","OUT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,l - rst #18 ;вызов п/п Tr-Dos - dw rom3_x3FF0 ;запись в порт - ret - -;конец списка слов -x27DA dw #0000 - -;список управляющих кодов -x27DC db #01 ;установка атрибутов для последующих символов - db #02 ;восстановление запомненных атрибутов - db #04 ;вывод с выравниванием - db #05 ;вывод строки по центру окна - db #06 ;вывод строки выровненной по правому краю окна - db #07 ;звонок - db #0A ;перевод строки - db #0C ;очистка окна - db #0D ;перевод каретки - db #1B ;позиционирование курсора внутри окна -x27E6 db #1E ;"обратный свиток" - -;таблица с адресами обработки управляющих кодов -x27E7 dw x2BF8 ;#01 - dw x2C18 ;#02 - dw x2AAD ;#04 - dw x2ACA ;#05 - dw x2AED ;#06 - dw x2BA8 ;#07 - dw x2B7D ;#0A - dw x2A5E ;#0C - dw x2B6E ;#0D - dw x2BCA ;#1B - dw x2A1B ;#1E - -;АДРЕС: #27FD удаление курсора и печать символа в окне -;вх: ix - адрес дескриптора окна -; a - код символа -;вых: nz - следующие координаты печати не установлены -; -x27FD call x28B8 ;признак печати и восстановление экрана - -;АДРЕС: #2800 печать символа в окне -;вх: ix - адрес дескриптора окна -; a - код символа -;вых: nz - следующие координаты печати не установлены -; -x2800 ld l,a - ld c,a ;!!! лишняя команда - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - ld de,(xE9E5) - add hl,de ;адрес данных символа - ld a,(ix+#0A) - cp #08 - jr nz,x2847 ;символ 6 пикселей - push hl - call x297C ;расчет экранного адреса курсора - pop de - ld b,#08 ;печать символа 8pix -x281A ld a,(de) - ld (hl),a - inc de - inc h - djnz x281A -x2820 bit 1,(ix+7) ;печать атрибутов, если нужно - jr z,x2834 ;атрибуты не печатаем - dec h - ld a,h - rrca - rrca - rrca - and #03 - xor #58 - ld h,a ;адрес в области атрибутов - ld a,(ix+6) - ld (hl),a -x2834 bit 1,(iy+9) ;установим следующие координаты печати - ret nz - inc (ix+1) ;crd X+1 - ld a,(ix+#0B) ;ширина окна в символах - cp (ix+1) - ret nc ;еще не вышли за пределы окна - dec (ix+1) - ret -;печать символа шириной 6 пикселей -x2847 push hl ;адрес данных символа - call x292F ;расчет экранного адреса курсора - pop de - ld a,b ;печать символа - ld b,#08 - or a - jr z,x28A8 ;нет сдвига символа - cp #04 - jr c,x2896 ;сдвиг 2 пикселя - jr z,x2876 ;сдвиг 4 пикселя -; координата в знакоместе 6 -x2858 ld a,(de) - rlca - rlca - push af ;левая часть - and %00000011 - ld c,a - ld a,(hl) - and %11111100 - or c - ld (hl),a - inc hl - pop af - and %11110000 ;правая часть - ld c,a - ld a,(hl) - and %00001111 - or c - ld (hl),a - dec hl - inc h - inc de - djnz x2858 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 4 -x2876 ld a,(de) - rlca - rlca - rlca - rlca - push af ;левая часть - and %00001111 - ld c,a - ld a,(hl) - and %11110000 - or c - ld (hl),a - inc hl - pop af ;правая часть - and %11000000 - ld c,a - ld a,(hl) - and %00111111 - or c - ld (hl),a - dec hl - inc h - inc de - djnz x2876 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 2 -x2896 ld a,(hl) - and %11000000 - ld c,a - ld a,(de) - rrca - rrca - and %00111111 - or c - ld (hl),a - inc h - inc de - djnz x2896 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 0 -x28A8 ld a,(hl) - and %00000011 - ld c,a - ld a,(de) - and %11111100 - or c - ld (hl),a - inc h - inc de - djnz x28A8 - jp x2820 ;печать атрибутов и выход - -;АДРЕС: #28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) -;вх: ix - адрес дескриптора окна -; -x28B8 set 2,(iy+9) - bit 0,(iy+9) - ret z - res 0,(iy+9) - -;АДРЕС: #28C5 сохранение экрана под курсором (6 пикселей символ) -;вх: ix - адрес дескриптора окна -; -x28C5 push af - call x292F ;расчет экранного адреса курсора в окне для символов 6 пикселей - ld de,xE3A4 ;начало буфера - ld b,#08 -x28CE ld c,#02 -x28D0 bit 0,(iy+9) - jr z,x28DA - ld a,(hl) - ld (de),a - jr x28DC -x28DA ld a,(de) - ld (hl),a -x28DC inc l - inc de - dec c - jr nz,x28D0 - dec l - dec l - inc h - djnz x28CE - pop af - ret - -;АДРЕС: #28E8 печать/удаление курсора в окне -; -x28E8 ld a,#01 - res 2,(iy+9) - bit 0,(iy+9) - ret nz - ld (xE3B6),a - -;АДРЕС: #28F6 мигание текстового курсора в строке ввода -; -x28F6 ld ix,(xE3B7) - bit 0,(ix+7) - ret nz ;символ курсора не выводим - ld hl,xE01D - bit 2,(hl) - res 2,(hl) - ld hl,xE3B6 - jr nz,x292C ;что-то печатается - dec (hl) - ret nz ;счетчик - ld (hl),#0C - ld hl,xE01D - bit 0,(hl) - res 0,(hl) - jr nz,x28C5 ;восстановление экрана под курсором (6 пикселей символ) -;печать курсора - set 0,(hl) - push hl - call x28C5 ;сохранение экрана под курсором (6 пикселей символ) - pop hl - ld a,(ix+#0C) ;код курсора - set 1,(hl) ;запрет изменения координат печати - push hl - call x2800 ;печать символа в окне - pop hl - res 1,(hl) - ret -x292C ld (hl),#0A - ret - -;АДРЕС: #292F Расчет экранного адреса курсора в окне для символов 6 пикселей -;вх: ix - адрес дескриптора окна -;вых: b - смещение в знакоместе -; hl - адрес на экране -; -x292F ld a,(ix+2) ;координата Y - add a,(ix+0) - ld h,a - rrca - rrca - rrca - and #E0 - ld l,a - ld c,(ix+1) ;координата X - ld a,c - add a,c - add a,c - add a,a - ld c,a ;c=X*6 - and #07 - ld b,a ;смещение в знакоместе - ld a,c - rrca - rrca - rrca - add a,(ix+3) - and #1F - or l - ld l,a - ld a,h - and #18 - or #40 - ld h,a - ret - -;АДРЕС: #2959 Расчет координат курсора на экране для символов шириной 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: bc - координаты курсора -; -x2959 ld l,(ix+0) - ld h,(ix+1) - ld c,(ix+2) - ld b,(ix+3) - add hl,bc - ld c,l - ld b,h - ret - -;АДРЕС: #2969 Расчет адреса курсора в области атрибутов для символов 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: hl - адрес в области атрибутов -; -x2969 call x2959 ;координаты курсора на экране - ld a,c - rrca - rrca - rrca - ld c,a - and #E0 - xor b - ld l,a - ld a,c - and #03 - xor #58 - ld h,a - ret - -;АДРЕС: #297C Расчет экранного адреса курсора в окне для символов 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: bc - координаты курсора на экране -; hl - адрес на экране -; -x297C call x2959 ;координаты курсора на экране - ld a,c - rrca - rrca - rrca - and #E0 - xor b - ld l,a - ld a,c - and #18 - xor #40 - ld h,a - ret - -;АДРЕС: #298E скроллинг окна вверх -;вх: ix - адрес дескриптора окна -; -x298E ld c,(ix+0) - ld b,(ix+1) - push bc ;сохраним координаты курсора - ld (ix+0),#01 ;crdY=1 - ld (ix+1),#00 ;crdX=0 - ld b,(ix+4) ;высота окна -x29A0 dec b - jr z,x29BE -;скроллинг вверх - push bc - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - or a - call x29D0 ;скроллинг строки данных окна вверх - bit 1,(ix+7) - jr z,x29B8 ;атрибуты не меняются - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - or a - call x29FB ;скроллинг строки атрибутов окна вверх -x29B8 inc (ix+0) - pop bc - jr x29A0 -;очистка нижней знакоместной строки -x29BE ld a,(ix+4) ;высота окна - dec a - ld (ix+0),a ;координата Y в самом низу - call x2A81 ;очистка знакоместной строки по координатам курсора - pop bc - ld (ix+0),c ;восстановление координат - ld (ix+1),b - ret - -;АДРЕС: #29D0 скроллинг строки данных окна -;вх: ix - адрес дескриптора окна -; hl - экранный адрес начала строки -; cy=1 скроллинг вниз -; =0 скроллинг вверх -; -x29D0 push hl - ld a,(ix+0) ;координата Y курсора - push af - jr c,x29DA - dec a - jr x29DB -x29DA inc a -x29DB ld (ix+0),a - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - pop af - ld (ix+0),a - ld e,l - ld d,h - pop hl - ld a,#08 ;копирование строки -x29EA ld b,#00 - ld c,(ix+5) ;ширина окна в знакоместах - push hl - push de - ldir - pop de - pop hl - inc h - inc d - dec a - jr nz,x29EA - ret - -;АДРЕС: #29FB скроллинг строки атрибутов окна -;вх: ix - адрес дескриптора окна -; hl - адрес атрибутов начала строки -; cy=1 скроллинг вниз -; =0 скроллинг вверх -; -x29FB push hl - ld a,(ix+0) - push af - jr c,x2A05 - dec a - jr x2A06 -x2A05 inc a -x2A06 ld (ix+0),a - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - pop af - ld (ix+0),a - ld e,l ;копирование строки атрибутов - ld d,h - pop hl - ld b,#00 - ld c,(ix+5) - ldir - ret - -;АДРЕС: #2A1B обработка управляющего кода #1E (скроллинг окна ввниз) -;вх: ix - адрес дескриптора окна -; -x2A1B ld c,(ix+0) - ld b,(ix+1) - push bc ;сохраним координаты курсора - ld (ix+1),#00 ;координата X=0 - ld b,(ix+4) ;высота окна - dec b - jr z,x2A4C ;высота =1 просто очищаем строку - dec b - ld (ix+0),b - inc b -;скроллим окно вниз -x2A31 push bc - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - scf - call x29D0 - bit 1,(ix+7) - jr z,x2A46 ;атрибуты не скроллим - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - scf - call x29FB ;скроллинг строки атрибутов окна -x2A46 dec (ix+0) - pop bc - djnz x2A31 -;очищаем верхнюю строку -x2A4C ld (ix+0),#00 ;crdY=0 - call x2A81 ;очистка строки по координатам курсора - pop bc ;восстановим координаты - ld (ix+0),c - ld (ix+1),b - ret - -;АДРЕС: #2A5B очистка окна пользователя (rst 8: db #83) -; -x2A5B call x300F ;читаем ix - -;АДРЕС: #2A5E обработка управляющего кода #0C (очистка текущего окна) -;вх: ix - адрес дескриптора окна -; -x2A5E xor a ;координаты курсора =0 - ld (ix+0),a - ld (ix+1),a - ld b,(ix+4) ;высота окна -x2A68 push bc ;очистка окна - call x2A85 ;очистка знакоместной строки по координатам курсора - pop bc - inc (ix+0) - djnz x2A68 - ld (ix+0),#00 ;crd X =0 - call x28E8 ;печать курсора - ret - -;очистка верхней знакоместной строки окна -x2A7A call x28B8 ;признак печати и восстановление экрана - ld (ix+1),0 ;crd Y =0 - -;очистка знакоместной строки по координатам курсора -x2A81 res 3,(iy+9) - -;АДРЕС: #2A85 очистка знакоместной строки по координатам курсора -x2A85 call x28B8 ;признак печати и восстановление экрана - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - ld a,(ix+5) ;ширина окна - sub (ix+1) - ld c,#08 ;очистка знакоместной строки - ld d,a ;ширина очищаемой части окна - ld e,l -x2A95 ld b,d - ld l,e -x2A97 ld (hl),#00 ;очистка пиксельной строки - inc l - djnz x2A97 - inc h - dec c - jr nz,x2A95 - push de - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - pop bc - ld d,(ix+6) ;атрибуты -x2AA8 ld (hl),d ;очистка атрибутной строки - inc hl - djnz x2AA8 - ret - -;АДРЕС: #2AAD обработка управляющего кода #04 (вывод с выравниванием) -;вх: ix - адрес дескриптора окна -; -x2AAD ld hl,xE01D - set 6,(hl) - set 7,(hl) - ld hl,xE1A6 - ld (xE3BC),hl - ret - -;АДРЕС: #2ABB расчет для выравнивания строки -;вх: ix - адрес дескриптора окна -; -x2ABB ld de,xE1A6 ;начало буфера - ld hl,(xE3BC) ;конец буфера - or a - sbc hl,de - ld b,l ;длина строки - ld a,(ix+#0B) ;размер окна в символах - sub l - ret - -;АДРЕС: #2ACA печать строки из буфера с выравниваем по центру окна #05 -;вх: ix - адрес дескриптора окна -; -x2ACA call x2ABB - srl a ;координата X печати в окне -;печать с выравниванием -x2ACF ld (ix+1),a ;a=crdX, b=длина строки - push bc - call x28B8 ;признак печати и восстановление экрана - pop bc - ld hl,xE1A6 ;печать строки -x2ADA ld a,(hl) - push hl - push bc - call x2800 ;печать символа в окне - pop bc - pop hl - inc hl - djnz x2ADA - ld hl,xE01D ;завершение управляющего кода #05 и #04 - res 6,(hl) - res 7,(hl) - ret - -;АДРЕС: #2AED печать строки из буфера с выравниваем по правому краюу окна #06 -;вх: ix - адрес дескриптора окна -; -x2AED call x2ABB - jr x2ACF - -;АДРЕС: #2AF2 обработка байта после управляющего кода #04 -;вх: ix - адрес дескриптора окна -; -x2AF2 bit 5,(hl) - jr nz,x2B57 ;обработка значения байта управляющего кода - bit 7,(hl) - jr z,x2AFE - cp #20 ;байт после кода #04 - jr c,x2B42 ;управляющий код -x2AFE ld hl,(xE3BC) ;печатный символ в буфер - ld (hl),a - inc hl - ld (xE3BC),hl - ret - -;АДРЕС: #2B07 возврат из п/п печати символа -x2B07 pop bc - pop de - pop hl - ret - -;АДРЕС: #2B0B печать символа со сбросом 7го бита (rst #10) -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -; -x2B0B push af - and #7F - jr x2B13 - -;АДРЕС: #2B10 печать пробела (rst #10) -;вх: ix - адрес дескриптора окна -; -x2B10 ld a,#20 - -;АДРЕС: #2B12 печать символа (rst #10) -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -; -x2B12 push af -x2B13 call x2B18 - pop af - ret -;печать символа в окне. ix - адрес дескриптора окна, a - код символа/управляющий код -x2B18 push hl - push de - push bc - ld hl,x2B07 ;адрес возврата - push hl - ld hl,xE01D - bit 6,(hl) - jr nz,x2AF2 ;байт(ы) после управляющего кода - bit 5,(ix+7) - ret nz ;запрет вывода в окно - bit 4,(hl) - jp nz,x0950 ;вывод на принтер - cp #20 - jr c,x2B42 ;это управляющий код - call x27FD ;удаление курсора и печать символа в окне - ret nz ;следующие координаты печати не установлены - bit 4,(ix+7) - ret z - call x2B75 ;возрат каретки - jr x2B84 ;перевод строки со скроллингом вверх -;переход на п/п обработки управляющего кода -x2B42 ld hl,x27DC+#0A - ld bc,#000B - ld e,l - ld d,h - cpdr - ret nz ;код не найден - inc de - ex de,hl - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - jp (hl) -;обработка значения байта управляющего кода -x2B57 bit 7,(hl) - jr nz,x2B5D ;если в рамках кода #04 - res 6,(hl) ;сброс признака управляющего кода -x2B5D res 5,(hl) - ld hl,(xE3B9) ;обработка значения байта управляющего кода - jp (hl) - -;АДРЕС: #2B63 установка адреса п/п обработки управляющего кода -; -x2B63 ld (xE3B9),hl - ld hl,xE01D - set 5,(hl) - set 6,(hl) - ret - -;АДРЕС: #2B6E обработка управляющего кода #0D (возврат каретки) -;вх: ix - адрес дескриптора окна -; -x2B6E bit 2,(ix+7) - call nz,x2B84 ;перевод строки со скроллингом вверх -;возрат каретки -x2B75 call x28B8 ;признак печати и восстановление экрана - xor a - ld (ix+1),a ;crdX =0 - ret - -;АДРЕС: #2B7D обработка управляющего кода #0A (перевод строки) -;вх: ix - адрес дескриптора окна -; -x2B7D bit 3,(ix+7) - call nz,x2B75 ;возрат каретки -;перевод строки со скроллингом вверх -x2B84 call x2B8E ;перевод строки - ret nz ;перевод строки выполнен - call x28B8 ;признак печати и восстановление экрана - jp x298E ;скроллинг окна вверх -;перевод строки -x2B8E ld a,(ix+4) ;высота окна - dec a - cp (ix+0) - ret z ;в последней строке нет перевода строки - call x28B8 ;признак печати и восстановление экрана - inc (ix+0) ;координата Y+1 - ret - -;АДРЕС: #2B9D установка начальных координат -;вх: ix - адрес дескриптора окна -; -x2B9D call x28B8 ;признак печати и восстановление экрана - xor a - ld (ix+1),a - ld (ix+0),a - ret - -;АДРЕС: #2BA8 короткий звуковой сигнал c установкой бордюра -; -x2BA8 push de - ld de,#7060 - push bc - push af - ld a,(xE053) - push af -x2BB2 out (#FE),a - xor #10 - push af - ld a,r - and #01 - add a,e - ld b,a - djnz $ - pop af - dec d - jr nz,x2BB2 - pop af - out (#FE),a - pop af - pop bc - pop de - ret - -;АДРЕС: #2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) -;вх: ix - адрес дескриптора окна -; -x2BCA ld hl,x2BD0 - jp x2B63 -;установка координаты Y курсора -x2BD0 ld c,(ix+0) - cp (ix+4) - jr nc,x2BD9 ;за пределами она - ld c,a -x2BD9 ld a,c - ld (xE3BB),a - ld hl,x2BE3 - jp x2B63 -;установка координаты X курсора -x2BE3 call x28B8 ;признак печати и восстановление экрана - ld c,(ix+#0B) ;ширина окна в символах - dec c - cp c - jr nc,x2BEE ;за пределами она - ld c,a -x2BEE ld (ix+1),c - ld a,(xE3BB) - ld (ix+0),a - ret - -;АДРЕС: #2BF8 обработка управляющего кода #01 (установка атрибутов) -;вх: ix - адрес дескриптора окна -; -x2BF8 ld a,(ix+6) ;сохраним текущие атрибуты - ld (xE3B4),a - ld hl,x2C04 - jp x2B63 -x2C04 or (ix+6) ;маска устанавливаемых атрибутов - ld (ix+6),a - ld hl,x2C10 - jp x2B63 -x2C10 cpl ;маска сбрасываемых атрибутов - and (ix+6) - ld (ix+6),a - ret - -;АДРЕС: #2C18 обработка управляющего кода #02 (восстановление атрибутов) -;вх: ix - адрес дескриптора окна -; -x2C18 ld a,(xE3B4) - ld (ix+6),a - ret - -;АДРЕС: #2C1F определение турбо-режима -;вых: nz - турбо включен -; z - выключен -; -x2C1F xor a - ld h,a - ld e,#0E - inc a -x2C24 or a - jr z,x2C2E - dec h - jr nz,x2C24 - dec e - jr nz,x2C24 - inc e -x2C2E di - ret - -;АДРЕС: #2C30 определение турбо-режима вкл/выкл -; -x2C30 bit 7,(iy+#19) - ret z ;турбо-режим недоступен - call x3B75 ;определение типа прерываний im 1/2 - push af - im 1 - ei - call x2C1F ;определение турбо-режима - ld hl,xE02D - res 6,(hl) - jr z,x2C48 ;турбо выключено - set 6,(hl) -x2C48 pop af - ret nz - im 2 - ret - -;АДРЕС: #2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -;вх: a - номер дисковода -; -x2C4D and #03 - ld (xFFCA),a ;номер текущего дисковода - push hl - ld l,a - rlca - rlca - ld h,a - rlca - rlca - add a,h - add a,l ;a=a*#15 - ld hl,(xE9F3) ;адрес блока описателей дисковода - add a,l - ld l,a - jr nc,x2C63 - inc h ;hl адрес блока описателя текущего дисковода -x2C63 ld a,(hl) - or a - jr z,x2C75 ;нет примонтированного образа - push de ;копируем дескриптор дисковода в рабочий буфер - ld de,xE590 - push bc - ld bc,#0015 - ldir - pop bc - pop de - pop hl - ret -x2C75 ld (xE590),a - pop hl - ret - -;АДРЕС: #2C7A чтение байта по адресу #00FB -x2C7A ld a,(x00FB) - ret - -;АДРЕС: #2C7E поиск и вызов процедуры обработки без возврата(если не найдено -; возврат) -x2C7E pop hl - jr x2C83 -x2C81 inc hl - inc hl -x2C83 ld e,(hl) - inc e - jr z,x2C90 ;конец списка. выход - cp (hl) - inc hl - jr nz,x2C81 ;не сответствует коду клавиши - ld e,(hl) - inc hl - ld d,(hl) - dec de - ex de,hl -x2C90 inc hl - jp (hl) - -;АДРЕС: #2C92 выполнение одной команды ассемблера с контролем ловушек -x2C92 call x17F0 ;выполнение одной команды по адресу в PC - call x328B ;проверка срабатывания ловушки - ld e,#FF - jp nc,x019D ;ловушка сработала -x2C9D ld a,(xE02A) - and #7F - bit 2,a - ret nz ;не обновлять экран монитора - ld (xE01E),a - -;АДРЕС: #2CA8 печать/обновление монитора-отладчика -x2CA8 call x0550 ;сохранение экрана из страницы 5 - -;обновление окна регистров - call x3000 - bit 0,(iy+#0A) - jr nz,x2CE9 ;ОШИБКА!!! должно быть x2CEC - call x2A5E ;очистка текущего окна - rst #20 - db "IR" - db #1B,#08,#0A ;crd Y,X - db "SZ-H-PNC" - db #0D,#0D - db "INT RAM ROM SCR" - db #1B,#00,#0B ;crd Y,X - dc "ZX " - bit 5,(iy-#02) - jr z,x2CE6 ;128K - rst #20 ;only 48k - dc "4" - jr x2CE9 -x2CE6 rst #20 - dc "12" -x2CE9 rst #20 - dc "8k" -x2CEC ld (ix+0),#00 ;crd Y =0 - ld (ix+1),#04 ;crd X =4 - ld hl,(xDD83+#01) ;регистры i,r пользователя - call x16DE ;печать числа - inc (ix+0) ;crd Y +1 - ld (ix+1),#00 ;crd X =0 - call x2D70 ;печать названия регистра, его значения и области памяти адресуемой этим регистром - ld (ix+0),#09 ;crd Y =9 - call x2DF6 ;;печать названия регистра af, его значения флагов в двоичном виде - - ld hl,xE01E ;iy+#0A - set 1,(hl) ;не обновлять содержимое регистров - set 2,(hl) ;не обновлять экран монитора - - ld (ix+0),#0B ;печать режима прерываний разрешены/запрещены - ld hl,x0FA0 ;on - ld a,(xDD83) - and #04 - jr nz,x2D23 -x2D20 ld hl,x0FA2 ;off -x2D23 call x15C7 ;печать сообщения из hl -x2D26 call x2B10 ;печать пробела - ld (ix+1),#05 ;печать номера страницы ОЗУ - ld a,(xE012) - and #07 - ld c,a - ld a,(xE012+1) - rrca - and #08 - or c - call x16EC ;печать числа a=[#0..#F] - ld (ix+1),#09 ;печать номера страницы ПЗУ - ld a,(xE012) - rrca - rrca - rrca - rrca - and #01 - call x16EC ;печать числа a=[#0..#F] - ld (ix+1),#0D ;печать номера экрана - ld c,#35 - ld a,(xE012) - and #08 - jr z,x2D5C - ld c,#37 -x2D5C ld a,c - rst #10 - - ld (iy+6),4 - call x2E38 ;обновление окна дампа памяти - call x2F30 ;обновление окна дизассемблера - - ld hl,xE01E ;iy+#0A - ld a,(hl) ;установка флагов - or %01010001 - ld (hl),a - ret - -;печать названия регистра, его значения и области памяти адресуемой этим регистром -x2D70 bit 1,(iy+#0A) - ret nz - ld hl,x0F91 - ld c,(iy+#0C) - ld b,#07 - ld de,xDD6B - jr x2D85 -x2D82 inc (ix+0) -x2D85 ld a,#03 - cp b - jr nz,x2D93 - bit 0,(iy+#0B) - jr z,x2D93 - ld de,xDD79 ;отображаются регистры альтернативного набора -x2D93 sla c - jr nc,x2D9B - inc hl ;этот регистр не выводим - inc hl - jr x2DDF -x2D9B bit 2,(iy+#0A) - jr nz,x2DAE ;название регистра не печатать - call x15C7 ;печать названия регистра - ld a,#03 - cp b - jr c,x2DB0 - call x2DE8 ;печать признака альтернативного набора регистров - jr x2DB0 -x2DAE inc hl - inc hl -x2DB0 ld (ix+1),4 ;crd X =4 - push hl - push de -;печать значения регистра - ex de,hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl-значение регистра - call x16DE ;печать числа -;печать содержимого памяти адресуемой текущим регистром - bit 3,(iy+#0A) - jr nz,x2DDD ;содержимое памяти адресуемой текущим регистром не печатать - push bc - ld bc,#0004 - ld de,xDDAC - push de - call x0753 ;сохранение области памяти в ram 8 - pop hl - ld b,#04 -x2DD2 inc (ix+1) - ld a,(hl) - call x16E3 ;печать числа a=[#00..#FF] - inc hl - djnz x2DD2 - pop bc -x2DDD pop de - pop hl -;следующий регистр -x2DDF inc de - inc de - ld (ix+1),#00 - djnz x2D82 - ret -;печать признака альтернативного набора регистров -x2DE8 bit 0,(iy+#0B) -x2DEC ld a," " - jp z,x2B12 ;печать символа - ld a,#27 ;' - jp x2B12 ;печать символа - -;печать названия регистра af, его значения флагов в двоичном виде -x2DF6 ld b,(iy+#0A) - bit 1,b - ret nz ;все регистры в мониторе не выводятся - bit 0,(iy+#0C) - ret nz ;регистр af не выводится - bit 2,b - ld b,(iy+#0B) - jr nz,x2E10 ;название регистра не печатать - rst #20 ;печать названия регистра - dc "AF" - bit 1,b - call x2DEC -x2E10 ld (ix+1),#04 ;crd X =4 - bit 1,b ;;печать значения af/af' - ld hl,(xDD7F) - jr z,x2E1E - ld hl,(xDD81) -x2E1E call x16DE ;печать числа hl=[#0000..#FFFF] - ld (ix+1),#0A ;crd X =10 - -;АДРЕС: #2E25 печать байта в двоичном виде -;вх: l - байт -; -x2E25 ld b,#08 ;печать значения f/f' в двоичном виде -x2E27 ld a,#30 - sla l - jr nc,x2E2E - inc a -x2E2E call x2B12 ;печать символа - djnz x2E27 - ld (ix+1),#00 ;crd X =0 - ret - -;АДРЕС: #2E38 печать дампа памяти в окне -; -x2E38 bit 4,(iy+#0A) - ret nz - -;АДРЕС: #2E3D печать дампа памяти в окне -; -x2E3D call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - call x2E9D ;;определение нового адреса начала дампа от смещения курсора - bit 5,(iy+#0A) - call z,x2F74 ;обновим дизасм под курсором в дампе - call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - call x2B9D ;установка начальных координат Y=0,X=0 -;печать дампа памяти - ld hl,(xDD87) - ld b,#08 -x2E55 push bc - call x2EBA ;печать одной строки дампа памяти в окне - inc (ix+0) - pop bc - djnz x2E55 -;печать курсора на текущей ячейке дампа - ld bc,#3E3C ;>< (коды двух символов курсора) - ld hl,(xDD69) -x2E65 call x2E7E ;расчет координат печати курсора в окне дампа памяти - ld a,b ;печать курсора - call x2B12 ;печать символа - inc (ix+1) - inc (ix+1) - ld a,c - jp x2B12 ;печать символа - -;АДРЕС: #2E76 удаление курсора на предыдущей ячейке дампа -x2E76 ld bc,#2020 - ld hl,(xDD89) - jr x2E65 - -;расчет координат печати курсора в окне дампа памяти -;вх: hl адрес текущей ячейки в дампе памяти -x2E7E ld (xDD89),hl - ld de,(xDD87) - or a - sbc hl,de ;смещение в дампе от начала отображения - ld a,l - and #07 - ld h,a - add a,a - add a,h - add a,#07 - ld (ix+1),a ;crd X - ld a,l - and #38 - rra - rra - rra - ld (ix+0),a ;crd Y - ret - -;определение нового адреса начала дампа от смещения курсора -x2E9D call x2E76 ;удаление курсора на предыдущей ячейке дампа - ld hl,(xDD87) ;адрес начала дампа памяти - ld de,(xDD69) ;адрес текущей ячейки в дампе памяти - ld bc,#003F - or a - sbc hl,de - ret z ;позиция курсора в дампе не изменилась - jr nc,x2EB2 ;нужен скроллинг - add hl,bc - ret c ;скроллинг не нужен -x2EB2 ld hl,#FFE8 - add hl,de - ld (xDD87),hl ;новый адрес начала дампа - ret - -;АДРЕС: #2EBA печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начала дампа) -;вых: hl - следующий адрес памяти (начала дампа) -; -x2EBA ld (ix+1),#02 ;crd X =2 - -;АДРЕС: #2EBE печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начала дампа) -;вых: hl - следующий адрес памяти (начала дампа) -; -x2EBE call x16DE ;печать адреса начала дампа памяти hl=[#0000..#FFFF] - call x2F22 ;если вывод на принтер, печатаем пробел - call x2F22 ;если вывод на принтер, печатаем пробел - ld de,xDDAC - ld bc,#0008 - push de - call x0753 ;сохранение области памяти в ram 8 - pop de - push de ;печать строки дампа - ld b,#08 - call x2EE6 - pop de - call x2F22 ;если вывод на принтер, печатаем пробел - ld b,#08 - call x2EF1 ;печать строки символов дампа памяти - ld (ix+1),#00 - ret -;печать строки дампа -x2EE6 ld a,(de) - inc de - call x16E3 ;печать числа a=[#00..#FF] - call x2F22 ;если вывод на принтер, печатаем пробел - djnz x2EE6 - ret -;печать строки символов дампа памяти -x2EF1 ld c,(iy+#05) -x2EF4 ld a,(de) - inc de - bit 7,c - jr nz,x2F02 - and #7F - cp #20 - jr nc,x2F02 - ld a,#2E ;. -x2F02 bit 4,(iy+#09) - jr nz,x2F14 ;вывод на принтер - push bc - push de - push hl - call x27FD ;удаление курсора и печать символа в окне - pop hl - pop de - pop bc - djnz x2EF4 - ret -x2F14 and #7F ;вывод на принтер - cp #20 - jr nc,x2F1C - ld a,#2E ;. -x2F1C call x2B12 ;печать символа - djnz x2EF4 - ret -;если вывод на принтер, печатаем пробел -x2F22 inc (ix+1) - bit 4,(iy+#09) - ret z - dec (ix+1) - jp x2B10 ;печать пробела - -;обновление окна дизассемблера -x2F30 ld b,(iy+#0A) - bit 6,b - ret nz ;не надо обновлять - bit 0,b - jr nz,x2F47 - ld hl,#5830 ;подсветка текущей строки дизассемблера - ld (hl),%00110000 - ld bc,#000F - ld de,#5831 - ldir -x2F47 ld hl,xE091 - call x301C ;ix = дескриптор окна монитора: дизассембер - bit 0,(iy+#0A) - call nz,x298E ;скроллинг окна вверх - ld (ix+0),#01 ;crd Y =1 - ld (ix+1),#00 ;crd X =0 -; печать дизассемблированных команд - ld hl,(xDD6B) ;значение pc программы пользователя - ld b,#05 - bit 2,(iy+#05) - jr z,x2F69 - ld b,#01 -x2F69 push bc - call x2F80 ;печать одной строки дизасма - inc (ix+0) - pop bc - djnz x2F69 - ret - -;АДРЕС: #2F74 вывод дисасма памяти по адресу в de -;вх: de - адрес памяти -x2F74 call x3000 ;ix = адрес дескриптора окна монитора: регистры - ld (ix+0),#0B - ld (ix+1),#15 - ex de,hl - -;печать одной строки дизасма -;вх: hl - адрес памяти -x2F80 call x16DE ;печать адреса памяти hl=[#0000..#FFFF] - call x2F96 ;анализ команды ассемблера по адресу в hl - push hl - ld hl,xDDB7 ;текстовая строка с командой дизасма - call x1512 ;печать команды ассемблера - call x2FED ;печать пробелов до правого края окна - pop hl - ld (ix+1),#00 - ret - -;АДРЕС: #2F96 анализ команды ассемблера -;вх: hl - адрес команды ассемблера для дизасма -x2F96 ld (xDDAA),hl - push hl - ld de,xDDAC - ld bc,#0004 - call x0753 ;сохранение области памяти в ram 8 - call x197F ;анализ команды ассемблера - pop hl - add hl,bc - ld (xDDAA),hl ;адрес следующей команды - ret - -;АДРЕС: #2FAC печать строки дизасма -;вх: a - -x2FAC bit 0,(iy+#05) -;печать адреса команды - push af - call z,x16DE ;печать числа hl=[#0000..#FFFF] - pop af - ld c,l - ld b,h - ld (iy+#08),#20 - call nz,x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами -;печать команды ассемблера - call x2F96 ;анализ команды и преобразование в строку для печати - push hl - push bc - ld hl,xDDB7 - call x1512 ;печать команды ассемблера - pop bc -;вывод дополнительной информации - bit 1,(iy+#05) - jr z,x2FEB - ld a,#17 - call x2FF1 ;печать пробелов до заданной координаты X - ld a,";" - rst #10 - ld b,c - push bc - ld de,xDDAC - push de - call x2EE6 ;печать строки дампа - ld a,#25 - call x2FF1 ;печать пробелов до заданной координаты X - pop de - pop bc - call x2EF1 ;печать пробелов до заданной координаты X -x2FEB pop hl - ret - -;АДРЕС: #2FED печать пробелов до правого края окна -;вх: a - crd X -x2FED ld a,(ix+#0B) - dec a - -;АДРЕС: #2FF1 печать пробелов до заданной координаты X -;вх: a - crd X -x2FF1 ld b,(ix+1) ;crd X - sub b - ret z - ret c - ld b,a - jp x15F3 ;печать нескольких провелов (в B) - -;АДРЕС: #2FFB ix = адрес дескриптора окна монитора: дескриптор окна: ввод числа -x2FFB ld hl,xE0E5 - jr x301C - -;АДРЕС: #3000 ix = адрес дескриптора окна монитора: регистры -x3000 ld hl,xE075 - jr x301C - -;АДРЕС: #3005 установка текущим окна: main menu -x3005 ld hl,xE0C9 - jr x301C - -;АДРЕС: #300A ix = адрес дескриптора окна монитора: вывод на принтер -x300A ld hl,xE067 - jr x301C - -;АДРЕС: #300F чтение содержимого регистра ix основной программы -x300F ld hl,(xDD6F) - jr x301C - -;АДРЕС: #3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана -x3014 ld hl,xE083 - jr x301C - -;АДРЕС: #3019 ix = адрес дескриптора окна монитора: дамп памяти -x3019 ld hl,xE09F - -;АДРЕС: #301C ix = адрес дескриптора окна монитора из hl -x301C ld (xE3B7),hl - push hl - pop ix - ret - -;АДРЕС: #3023 ожидание действий пользователя (опрос управления, вывод часов) -x3023 push hl - push de - push bc - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop bc - pop de - pop hl - ret - -;АДРЕС: #302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне -x302E ld e,(ix+7) - set 0,(ix+7) ;не выводить символ курсора - call x3023 - ld (ix+7),e - ret - -;АДРЕС: #303C выполнение команды, на которую указывает PC (cs+3) -x303C xor a - jr x3041 - -;АДРЕС: #303F выполнение команды, на которую указывает PC с быстрым выполнением -; подпрограмм (cs+4) -x303F ld a,#80 -x3041 bit 1,(iy+#12) - jr z,x3049 ;экран не сохранен в ram 8 - or #01 -x3049 ld (xE02A),a - call x2C92 ;выполнение одной команды ассемблера с контролем ловушек - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3052 заглушка входа в монитор при несовпадении контрольной суммы -x3052 di - call x305B - ld hl,x0040 - push hl - ret - -;АДРЕС: #305B блокировка работы при ошибке контрольной суммы -x305B ld hl,x3052 - ld (xC064),hl ;блокируем вызов NMI - pop de ;адрес откуда пришли - ld sp,hl ;стэк в ПЗУ ???? - ex de,hl - jp (hl) ;вернемся - -;АДРЕС: #3065 установка регистров для загрузки/сохранения -;вх: hl - адрес строки -;вых: de - буфер для дисковых операций -; ix - буфер fcb -x3065 call x0EE6 ;поиск в строке первого печатного символа - ld (iy+#0A),#00 ;обновить на экране весь отладчик - ld de,xE8A9 ;буфер для дисковых операций -x306F ld ix,xE7A9 ;буфер fcb - ret - -;АДРЕС: #3074 Команда: ERAse filespec -; удаление заданного файла с диска -x3074 call x3065 ;установка регистров для работы с диском - rst #30 - dw rom7_x14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl - db #07 -x307B jp nc,x0AFB ;ошибок нет. обновление отладчика -x307E rst #30 - dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа - db #06 -x3082 jp x0B06 ;обновление отладчика - -;АДРЕС: #3085 Команда: SAVE filespec start,length -; запись на диск заданной последовательности байт -x3085 ld b,#02 - call x309F ;определение адреса загрузки/сохранения и размера данных - call x3107 ;запись области памяти в файл -x308D jr c,x307E ;ошибка диска. выход - rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 - jr x307B ;выход в отладчик - -;АДРЕС: #3095 Команда: LOAD filespec [start[,length]] -; загрузка с диска заданной последовательности байт -x3095 ld b,#01 - call x309F ;определение адреса загрузки/сохранения и размера данных - call x30D8 ;чтение файла в память - jr x308D ;выход в отладчик - -;определение адреса загрузки/сохранения и размера данных -;вх: b - способ открытия файла -;вых: hl - адрес загрузки -; bc - размер загружаемого файла -x309F call x3065 ;установка регистров для работы с диском - rst #30 - dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - db #07 - jr c,x307E ;ошибка диска - call x0EBA ;выделение из строки числовых операндов (не более 6) - cp #02 - jr z,x30BB ;два параметра - jr nc,x30D4 ;слиишком много параметров. выход - bit 0,(ix+#17) - jr nz,x30BB ;файл для чтения - ld a,#0A ;сообщение: too few operands - jr x3082 ;выход. мало параметров для записи -x30BB push hl - push de - push af - rst #30 - dw rom7_x11DF ;открыть файл для последующих операций с ним - db #07 - jr c,x307E ;ошибка диска - ld e,c - ld d,b ;длина файла в байтах - pop af - pop hl - pop bc - cp #01 - jr z,x30D1 ;только один параметр: адрес загрузки - ret nc ;два параметра. запись файла - ld hl,(xE7A9+#09) ;адрес загрузки из заголовка файла -x30D1 ld b,d - ld c,e ;длина файла в байтах - ret -x30D4 ld a,#0B ;сообщение: too many operands - jr x3082 - -;АДРЕС: #30D8 чтение файла в память -;вх: ix - адрес буфера fcb -; hl - адрес загрузки -; bc - размер загружаемого файла -;вых: cy=1 ошибки записи -; a - код ошибки -x30D8 ld a,b - or a - jr z,x30F4 ;менее сектора -;чтение целых секторов -x30DC push bc - push hl - rst #30 - dw rom7_x1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла - db #07 - pop hl - pop bc - ret c ;ошибка диска - push bc - ld de,xE8A9 ;буфер для загрузки - ex de,hl - ld bc,#0100 - call x0749 ;копирование сектора в память пользователя - ex de,hl - pop bc - djnz x30DC - -x30F4 ld a,c - or a - ret z ;закончилась загрузка -;чтение неполного сектора -x30F7 push hl - push bc - rst #30 - dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - db #07 - pop bc - pop hl - ret c ;ошибка диска - rst #00 ;запись байта в память пользователя - inc hl - dec c - jr nz,x30F7 - or a - ret - -;АДРЕС: #3107 запись области памяти в файл -;вх: ix - адрес буфера fcb -; hl - адрес начала области памяти -; bc - длина области памяти -;вых: cy=1 ошибки записи -; a - код ошибки -x3107 ld (xE7B2),hl ;стартовый адрес - ld a,b - or a - jr z,x3122 ;1 сектор -; запись целых секторов области памяти -x310E push bc - ld de,xE8A9 ;буфер для сохранения - ld bc,#0100 - call x0753 ;сохранение области памяти в ram 8 - push hl - rst #30 - dw rom7_x1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти - db #07 - pop hl - pop bc - ret c ;ошибка записи - djnz x310E -x3122 ld a,c - or a - ret z ;область памяти кратна размеру сектора -x3125 push hl - push bc - rst #28 ;чтение байта из памяти пользователя - rst #30 - dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" - db #07 - pop bc - pop hl - ret c ;ошибка записи - inc hl - dec c - jr nz,x3125 - or a - ret - -;АДРЕС: #3135 подсчет контрольной суммы страницы -;вых: hl=#00F6 -x3135 xor a - ld l,a - ld h,a ;hl=#0000 - ld bc,#00F6 - push bc - call x315A - inc hl ;hl=#00F7, a=#6D - ld bc,#000D - call x315A ;hl=#0104, a=#A5 - ld de,#000C - add hl,de ;hl=#0110 - ld bc,#3EF0 - call x315A ;a=#80 - pop hl ;hl=#00F6 - cp (hl) - jp z,x04D9 ;контрольная сумма совпала.выключим турбои возврат - call x305B ;блокировка работы при ошибке контрольной суммы - jr x3135 ;вечный цикл -x315A add a,(hl) - cpi - jp pe,x315A ;пока bc<>0 - ret - -;АДРЕС: #3161 список команд отладчика -x3161 dc "Help" - dc "?" - dc "III" - dc "OOO" - dc "CMOS" - dc "RESNVRAM" - db #00 -x3179 dw x3AD0: db %00000000 ;Help - dw x3389: db %00000001 ;? - dw x318C: db %00000000 ;III - dw x3194: db %00000000 ;OOO - dw x319C: db %00000000 ;CMOS - dw x31A4: db %00000000 ;RESNVRAM - db #00 - -;АДРЕС: #318C Команда III (работа с контроллером прерываний) -x318C rst #30 - dw rom7_x16B9 ;работа с контроллером прерываний - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3194 Команда OOO (работа с контроллером прерываний) -x3194 rst #30 - dw rom7_x0DC7 ;запись всей памяти NVRAM из памяти #7530 - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #319C Команда CMOS (работа с контроллером прерываний) -x319C rst #30 - dw rom7_x0DAD ;чтение всей памяти NVRAM в память #7530 - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #31A4 Команда RESNVRAM (что-то пишет в NVRAM) -x31A4 rst #30 - dw rom7_x0E72 ;что-то пишет в NVRAM - db #07 - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #31AB Команда: SLOW type автоматическая трассировка -;вх: de - параметры команды -x31AB ld a,d - or a - ld a,#2C ;сообщение: bad operand - ret nz - ld (iy+#16),e - ld hl,(xDD6B) ;pc программы пользователя - call x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -x31B9 call x2C92 ;выполнение одной команды ассемблера с контролем ловушек - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - jr x31B9 - -;АДРЕС: #31C1 Команда: LISTBreak/LBreak -; вывод на экран информации о ловушках -x31C1 ld hl,xE52D - ld de,#2827 - ld bc,x31FC - ld a,#09 - push bc - push af - push hl - push de - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld b,e - ld c,#00 ;сообщение: curent breackpoint selections: - rst #08 - rst #20 - db #0D,#8D - pop bc - ld c,#00 ;сообщение: no address bank type state init count word - rst #08 - rst #20 - db #0D,#8D - pop hl - pop de - ld e,#01 - pop bc -;hl - адрес ловушки -;d - количество ловушек+1 -;e =#01 номер текщей ловушки -;bc адрес п/п -x31E6 push de - push bc - call x3A93 ;вызов п/п по адресу в bc - call (bc) - jr c,x31F9 ;закончена печать - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - rst #20 - db #8D - pop bc - pop de - inc e - ld a,d - cp e - jr nz,x31E6 -x31F9 ld a,#81 ;сообщение: enter command - ret -;печать информации об одной ловушке -x31FC rst #30 - dw rom6_x0156 ;печать информации о ловушке - db #06 - ret - -;АДРЕС #3201 печать ON/OFF от флага nz-ON/z-OFF -x3201 push hl - jr nz,x320A - rst #20 - dc "OFF" - pop hl - ret -x320A rst #20 - dc "ON " - pop hl - ret - -;АДРЕС: #3210 определение адреса ловушки -;вх: a - номер ловушки -;вых: de - адрес ловушки -; hl - адрес ячейки с адресом ловушки -; z - нет ловушки -x3210 ld de,xE9BD - ld l,a - ld h,#00 - add hl,hl ;a*2 - add hl,de ;hl=xE9BD + a*2 - ld e,(hl) - push hl - inc hl - ld d,(hl) - ld l,a - ld a,d - or e - ld a,l - pop hl - ret - -;АДРЕС: #3222 восстановление памяти пользователя под всеми ловушками -x3222 res 7,(iy+#0B) - jr x322C - -;АДРЕС: #3228 сохранение памяти пользователя под всеми ловушками и установка ловушек -x3228 set 7,(iy+#0B) -x322C call x3281 ;установка начала списка breackpoint`ов -x322F call x326C ;проверка наличия текущей ловушки - jr nc,x3267 ;нет ловушки с этим номером - call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - exx - ld a,h - exx - and #C0 - jr z,x3250 ;адрес ловушки [#0000..#3FFF] - bit 5,(iy-#02) - jr z,x324B ;zx128k - call x3707 ;zx48k сравнение страницы пользователя с заданной - exx - jr nz,x3264 - exx -x324B push bc - call x3732 ;установка страницы пользователя равной номеру страницы в L - pop bc -x3250 exx - bit 7,(iy+#0B) - jr z,x3260 - rst #28 ;чтение байта из памяти пользователя - ld (ix+4),a ;сохраним байт в описании ловушки - ld a,#CF ;rst 8 - rst #00 ;запись байта в память пользователя - jr x3264 ;установка байта ловушки -x3260 ld a,(ix+4) ;восстановление памяти пользователя под ловушкой - rst #00 ;запись байта в память пользователя -x3264 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x3267 add ix,de ;следующая ловушка - djnz x322F - ret - -;проверка наличия текущей ловушки -;вых: cy=0 нет ловушки -; =1 есть ловушка -; hl' - адрес ловушки -; l - логический номер страницы с ловушкой -; -x326C ld a,(ix+0) - rlca - ret nc - ccf - bit 1,a - ret nz - ld l,(ix+2) - ld h,(ix+3) - exx - ld l,(ix+1) - ccf - ret - -;АДРЕС: #3281 установка начала списка ловушек -x3281 ld ix,xE52D - ld b,#08 ;количество блоков - ld de,#000B ;длина одного блока - ret - -;АДРЕС: #328B проверка срабатывания ловушки -;вх: hl - адрес PC пользователя -;вых: cy=1 нет сработавших ловушек -; =0 ловушка сработала -> ix адрес ловушки -; de=#000B -; b - обратный номер ловушки -x328B call x3281 ;установка начала списка ловушек -x328E ld a,(ix+#00) - rlca - jr nc,x32A9 ;ловушки нет - exx - ld l,(ix+#01) - call x3707 ;сравнение страницы пользователя с заданной в l - exx - jr nz,x32A9 ;не та страница - ld a,(ix+#02) - cp l - jr nz,x32A9 ;не тот адрес - ld a,(ix+#03) - cp h - ret z ;ловушка сработала -x32A9 add ix,de - djnz x328E - scf - ret - -;АДРЕС: #32AF Команда: DELBreak number -; удаление информации о ловушке с номером number -x32AF call x32C2 ;проверка номера и определение адреса описания ловушки - ld (ix+#00),#00 - ld a,(xDD99) ;номер ловушки - call x3210 - xor a - ld (hl),a - inc hl - ld (hl),a - jr x32FB ;возврат в отладчик - -;проверка номера и определение адреса описания ловушки -;вх: de - номер ловушки [1..8] -;вых: ix - адрес ловушки -; z - ловушка не задана -x32C2 push af - dec e - ld a,e - and #F8 - or d - ld a,#22 ;сообщение: invalid number breackpoint - jr nz,x3300 ;выход в отладчик - push hl - ld l,e - ld h,d - add hl,hl - add hl,hl - add hl,de - add hl,hl - add hl,de ;hl=hl*11 - ld de,xE52D - add hl,de ;адрес ловушки - push hl - pop ix - pop hl - pop af - bit 6,(ix+#00) - ret - -;АДРЕС: #32E2 Команда: BRK number, [on|off] -; включение (on)/выключение (off) ловушки -x32E2 call x32C2 ;проверка номера и определение адреса описания ловушки - ld a,#26 ;сообщение: breackpoint undefined - jr z,x3300 ;ловушка не определена. выход в отладчик - ld a,l - and #FE - or h - ld a,#23 ;сообщение: invalid state breackpoint - jr nz,x3300 ;неверный параметр. выход в отладчик -x32F1 sla (ix+#00) - srl l - rr (ix+#00) -x32FB ld a,#81 ;сообщение: enter command - ret - -;ошибка мало параметров. выход в отладчик -x32FE ld a,#0A ;сообщение: too few operands -x3300 jp x0B06 ;обновление отладчика - -;АДРЕС: #3303 Команда: BREak number, type, addr, int_count[,bank] -; установка ловушки на адрес addr -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x3303 call x32C2 ;проверка номера и определение адреса описания ловушки - rst #30 - dw rom6_x01E4 ;установка новой ловушки в отладчике - db #06 - ret - -;АДРЕС: #330B установка ловушки #8, по текущему адресу листинга дизасма -x330B ld de,#0008 ;номер ловушки - ld bc,(xDD8B) ;адрес памяти - ld a,b - and #C0 - ld hl,#0001 ;тип ловушки - ld (xDD99+#06),hl ;4й параметр, счетчик - jr z,x331E ;адрес в ПЗУ - dec hl -x331E ld a,#04 ;кол-во параметров - call x3303 ;Команда: BREak number, type, addr, int_count[,bank] -x3323 jp x3960 - -;АДРЕС: #3326 удаление ловушки #8 -x3326 ld de,#0008 - call x32C2 ;проверка номера и определение адреса описания ловушки - ld l,#00 - call x32F1 ;удаление ловушки - jr x3323 - -;АДРЕС: #3333 Команда: OPTion bit on|off -; задание некоторых режимов монитора (переменная xE019) -x3333 ld a,e - and #F8 - or d - ld a,#0D ;сообщение: known number - ret nz ;неверный номер бита. выход в отладчик - ld a,l - and #FE - or h - ld a,#17 ;сообщение: illegal value operand - ret nz ;неверное значение бита. выход в отладчик -;определение маски по номеру бита - inc h - ld a,e -x3343 or a - jr z,x334B - dec a - sla h - jr x3343 -;установка/сброс бита -x334B ld a,h - bit 0,l - jr nz,x335B - xor #FF - and (iy+#05) -x3355 ld (iy+#05),a - ld a,#81 ;сообщение: enter command - ret -x335B or (iy+#05) - jr x3355 - -;АДРЕС: #3360 Команда: OUT addr, data -; запись байта данных data в порт ввода/вывода -x3360 ld a,h - or a - ld a,#11 ;сообщение: number too big - ret nz ;в порт можно вывести только байт - ld c,e - ld b,d - out (c),l -x3369 ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #336C Команда: OUTD addr, data -; запись байта данных data в порт ввода/вывода в адресном пространстве trdos -x336C ld a,h - or a - ld a,#11 ;сообщение: number too big - ret nz ;в порт можно вывести только байт - ld c,e - ld b,d - ld a,l - rst #30 - dw rom3_x3FF0 ;вывод в порт - db #03 - jr x3369 - -;АДРЕС: #337A Команда: IND addr -; чтение байта из порта ввода/вывода в адресном пространстве trdos -x337A ld c,e - ld b,d - rst #30 - dw rom3_x3FF3 ;чтение порта - db #03 - ld e,a - jr x3387 - -;АДРЕС: #3383 Команда: IN addr -; чтение байта из порта ввода/вывода -x3383 ld c,e - ld b,d - in e,(c) -x3387 ld d,#00 - -;АДРЕС: #3389 Команда: ?data -; вывод параметра data в различных системах счисления -;вх: de - параметр data -x3389 call x33BB ;установка и очистка информационного окна отладчика - ld c,e - ld b,d -;вывод печатного символа заданного значения, если возможно - ld a,b - or a - jr nz,x33A3 ;16 бит - ld a,c - rlca - jr c,x33A3 - rrca - cp #20 - jr c,x33A3 - push af - rst #20 - db #0D - db #80+'"' - pop af - rst #10 - rst #20 - db #80+'"' -;вывод значения в разных системах счисления -x33A3 ld hl,x33B6 -x33A6 ld a,(hl) - cp #81 - ret z ;выход - push bc - push af - rst #20 - db #8D - pop af - call x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - pop bc - inc hl - jr x33A6 -x33B6 db #00,#02,#04,#06,#81 - -;АДРЕС: #33BB установка и очистка информационного окна отладчика -x33BB push de - push bc - push hl - ld hl,xE0AD - call x301C ;ix = дескриптор окна - call x2A5E ;очистка окна - rst #20 - db #8D ;перевод строки в окне - pop hl - pop bc - pop de - ret - -;АДРЕС: #33CD печать информационного окна отладчика -x33CD bit 5,(iy+5) - ret nz ;запрет автоматического выполнения команды SHOW - -;АДРЕС: #33D2 Команда: SHow -; вывод информации о состоянии монитора -x33D2 call x33BB ;установка и очистка окна - rst #20 ;печать сообщения - dc "Analyser " - bit 4,(iy+#14) - call x3201 ;печать ON/OFF от флага nz-ON/z-OFF -;печать текущей системы счисления - rst #20 - db #0D - dc "base " - ld de,#000A - ld c,(iy+#17) - ld b,d - call x1677 ;печать десятичного числа bc - rst #20 - db #8D ;перевод строки -;печать workspace nnnnn - ld bc,#3C00 ;сообщение: workspace - rst #08 ;печать сообщения по номеру в BC - ld bc,(xE11A) - call x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;печать состояния настроек отладчика - rst #20 - db #0D - dc "option " - ld l,(iy+5) - call x2E25 ;печать байта из L в двоичном виде -;печать режима прерываний - rst #20 - db #0D - dc "Int mode " - call x3B75 ;определение типа прерываний im 1/2 - ld a,"2" - sub d - rst #10 - bit 6,(iy+#19) - jr z,x3447 ;турбо режим выключен/отсутсвует - rst #20 - dc "(t)" - jr x3447 - -;АДРЕС: #3432 Команда: BASE 0|2|8|10|16 (установка основания системы счисления) -x3432 ld a,d - or a - jr nz,x3441 ;ошибка - ld a,e - ld bc,#0005 - ld hl,x344A - cpir - jr z,x3444 ;система счисления найдена в списке -x3441 ld a,#0D ;сообщение: known number - ret -x3444 ld (iy+#17),e ;установка системы счисления -x3447 ld a,#81 ;сообщение: enter command - ret -x344A db #00,#02,#08,#0A,#10 - -;АДРЕС: #344F Команда: WORKspace addr (задание адреса начала свободного буфера -; для команд трассировки. объем буфера 8 байт) -x344F ld a,d - cp #5B - ld a,#3B ;сообщение: workspace insufficient - ret c - ld a,d - cp #C0 - ld a,#3B ;сообщение: workspace insufficient - ret nc - ld (xE11A),de ;установка адреса - jr x3447 ;выход - -;АДРЕС: #3461 Команда: SEarch addr_st, addr_end, bank, data -; поиск списка байтовых значений data в памяти -;вх: b - количество параметров в строке -x3461 ld de,#0318 - set 0,(iy+#13) - jr x3471 - -;АДРЕС: #346A Команда: FINd addr_st, addr_end, data -; поиск списка байтовых значений data в памяти -;вх: b - количество параметров в строке -x346A ld de,#0217 - res 0,(iy+#13) -x3471 ld a,b - cp d - ld a,#0A ;сообщение: too few operands - ret c ;нехватает параметров в команде - ret z ;нехватает параметров в команде - ld a,b - cp e - ld a,#1F ;сообщение: string too long - ret nc ;слишком длинная строка - ld a,b - sub d ;a - длина искомой строки - push af - xor a - ld (xDDE0),a ;начальная длина искомой строки -;проверка начального и конечного адреса поиска - call x0C98 ;чтение в de адреса начала поиска - push de - call x0C98 ;чтение в de адреса конца поиска - ex (sp),hl - ex de,hl - call x375C ;сравнение hl>=de, в противном случае отмена команды - ld (xDDDC),de ;адрес начала поиска - ld (xDDDE),hl ;адрес конца поиска - ld hl,(xE012) ;сохраним порты пользователя - ld (xDDE1),hl - ld (xE010),hl - pop hl - bit 0,(iy+#13) - jr z,x34B7 ;ищем только в текущей странице -;установка страницы для поиска - call x0C98 ;чтение номера страницы поиска - ex de,hl - call x37EB ;установка страницы для поиска - call x35EC ;установка страницы для команд поиска в отладчике - ld hl,(xE012) - ld (xDDE1),hl - ex de,hl -;чтение в буфер искомой строки -x34B7 ld bc,xDDE3 - pop af - ld (xDDE0),a ;длина искомой строки -x34BE push bc - call x0D55 ;чтение из строки команды чилового/байта строкового значения - pop bc - jr c,x34CA ;конец искомой строки - ld a,e - ld (bc),a - inc bc - jr x34BE -;сравнение строки с памятью -x34CA ld hl,(xDDDC) ;адрес в памяти -x34CD ld bc,(xDDE0-#01) ;b - длина искомой строки - push hl - ld de,xDDE3 ;адрес строки для поиска -x34D5 rst #28 ;чтение байта из памяти пользователя - ld c,a - ld a,(de) - cp c - jr nz,x3502 ;нет совпадения - inc hl - inc de - djnz x34D5 - ld (xDDDC),hl - pop hl - bit 0,(iy+#13) - jr nz,x34EC ;без установки указателя MEM - ld (xDD69),hl ;установим указатель -x34EC ld (xDDA7),hl - ld a,#84 ;сообщение: found at _число_ -; обновление экрана отладчика -x34F1 push af - call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,(iy+#0A) - and #CF - ld (iy+#0A),a ;обновить дамп и дизассемблер - call x2CA8 ;обновление монитора-отладчика - pop af - ret -; следующий адрес для поиска -x3502 pop hl - push hl - or a - ld de,(xDDDE) ;адрес последней ячейки для поиска - sbc hl,de - pop hl - inc hl - jr c,x34CD ;еще не конец области памяти - xor a - ld (xDDE0),a - ld a,#A0 ;сообщение: string not found - jr x34F1 - -;АДРЕС: #3517 продолжение поиска в отладчике (для команд FIND/SEARCH) -x3517 ld a,(xDDE0) ;длина искомой строки - or a - ld a,#A1 ;сообщение: no search string - ret z - ld a,#0C ;атрибуты - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - ld hl,(xDDE1) - ld (xE012),hl - jr x34CA - -;АДРЕС: #352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] -; копирование области памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x352F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - inc hl - or a - sbc hl,de ;длина переносимого блока - push bc - push hl - pop bc - pop hl - ex de,hl ;de - адрес, куда копируем; hl - откуда - ld a,c - or b - ld a,#42 ;сообщение: too few blocks - ret z ;нулевая длина - push hl - sbc hl,de - pop hl - jr c,x3551 -;копирование области памяти с инкрементом -x3546 call x3563 ;копирование одного байта с переключением страницы - inc hl - inc de - ld a,c - or b - jr nz,x3546 - jr x3560 -;копирование области памяти с декрементом -x3551 dec bc - add hl,bc - ex de,hl - add hl,bc - ex de,hl - inc bc -x3557 call x3563 ;копирование одного байта с переключением страницы - dec hl - dec de - ld a,b - or c - jr nz,x3557 -x3560 jp x3679 ;восстановление страницы пользователя и обновление отладчика -;копирование одного байта с переключением страницы -x3563 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - rst #28 ;чтение байта из памяти пользователя - call x35EC ;установка страницы для команды в отладчике - ex de,hl - rst #00 ;запись байта в память пользователя - ex de,hl - dec bc - ret - -;АДРЕС: #356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] -; сравнение двух областей памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x356F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - push bc - push hl - pop bc ;addr_fin1 - pop hl ; - ex de,hl ;de=addr_st2; hl=addr_st1 -x3577 ex de,hl - call x35EC ;установка страницы - rst #28 ;чтение байта из памяти пользователя - ex de,hl - call x3A4E ;восстановление страницы - push bc - ld c,a - rst #28 ;чтение байта из памяти пользователя - cp c - jr nz,x3598 ;не равны -;следующие адреса -x3586 pop bc - push hl - or a - sbc hl,bc - pop hl - inc de - inc hl - jr nz,x3577 -;искомая строка найдена - call x35D3 ;сравнение ix=xE075 - ld a,#82 ;сообщение: block identical - ret nz - dec a ;сообщение: enter command - ret -;вывод сообщение о несовпадении -x3598 ld b,a - push hl - push de - push bc - call x35D3 ;сравнение ix=xE075 - call nz,x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#4100 ;сообщение: failed at _число_ - rst #08 - pop bc - pop de - pop hl - push hl - push de - push bc - call x1612 ;печать числа в hl (dec/hex) с префиксом - rst #20 - dc " #" - pop af - push af - call x16E3 ;печать числа a=[#00..#FF] - rst #20 - dc " : " - pop bc - pop hl - push hl - push bc - call x1612 ;печать числа в hl (dec/hex) с префиксом - rst #20 - dc " #" - pop hl - ld a,l - call x16E3 ;печать числа a=[#00..#FF] - rst #20 - db #8D - call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - pop de - pop hl - jr x3586 - -;АДРЕС: #35D3 сравнение ix=xE075 -;вых: z - ix=xE075 -x35D3 push de - push ix - ex (sp),hl - ld de,xE075 - or a - sbc hl,de - pop hl - pop de - ret - -;АДРЕС: #35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -x35E0 push hl - ld hl,(xE012) - ld (xE010),hl - ld (xE00E),hl - pop hl - ret - -;установка страницы для команд поиска в отладчике -x35EC push hl - ld hl,(xE00E) - ld (xE012),hl - pop hl - ret - -;АДРЕС: #35F5 Команда: FILl addr_st, addr_end, byte [,bank] -; заполнение области памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x35F5 call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - ld a,b - or a - ld a,#0C ;сообщение: out of range - ret nz ;слишком большое значение для заполнения - call x35EC ;;установка страницы - ex de,hl -;заполнение области памяти -x3601 ld a,c - rst #00 ;запись байта в память пользователя - push hl - or a - sbc hl,de - pop hl - inc hl - jr nz,x3601 - jr x3679 ;восстановление страницы и обновление отладчика - -;АДРЕС: #360D Команда: DATA addr, data -; запись списка data, начиная с адреса addr -x360D call x0C98 ;чтение адреса начала области - ld c,e - ld b,d - jr x3618 - -;АДРЕС: #3614 Команда: .PC data -; запись списка data, начиная с адреса в регистре PC -x3614 ld bc,(xDD6B) ;pc программы пользователя -x3618 set 1,(iy+#13) - jr x3626 - -;АДРЕС: #361E Команда: .data -; запись списка data, начиная начиная с текущей ячейки памяти MEM -x361E ld bc,(xDD69) ;адрес текущей ячейки MEM - res 1,(iy+#13) - -;запись строки данных по заданному адресу -x3626 push bc ;адрес куда пишем - call x0D55 ;очередного байта data - pop bc - jr c,x367C ;нет больше байтов для чтения. обновление отладчика - push hl - ld l,c - ld h,b - ld a,e - rst #00 ;запись байта в память пользователя - inc bc - bit 1,(iy+#13) - jr nz,x363D - ld (xDD69),bc ;новый адрес MEM -x363D pop hl ;следующий байт - jr x3626 - -;АДРЕС: #3640 pop de со стэка пользователя -x3640 ld hl,(xDD6D) ;указатель вершины стэка программы пользователя - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - inc hl - ld (xDD6D),hl ;новый указатель вершины стэка программы пользователя - ret - -;АДРЕС: #364D Команда: POP -; извлечение значения из стека пользователя -x364D call x3640 ;pop de со стэка пользователя - call x3389 ;вывод числа в de в различных системах счисления - jr x366E ;обновление отладчика - -;АДРЕС: #3655 переход на адрес, содержащийся в команде, расположенный в текущей -; ячейке памяти -x3655 ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти - call x3884 ;получить адрес, на который ссылается команда ассемблера - ex de,hl - -;АДРЕС: #365C Команда: MEMory addr -; установка адреса текущей ячейки памяти mem -x365C ld (xDD69),de - jr x367C ;выход и обновленеи отладчика - -;АДРЕС: #3662 Команда: EXX -; смена индикации регистров ВС, DE и HL на альтернативные -x3662 ld a,#01 - jr x3668 ;выход и обновленеи отладчика - -;АДРЕС: #3666 Команда: EX AF -; смена индикации регистров AF на альтернативные. Команды -x3666 ld a,#02 -x3668 xor (iy+#0B) - ld (iy+#0B),a -x366E ld a,(iy+#0A) -x3671 and #F1 - ld (iy+#0A),a -x3676 jp x0AFB -x3679 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x367C ld a,(iy+#0A) - and #8F - jr x3671 - -;АДРЕС: #3683 Команда: INTerrupt on|off -; управление прерываниями -x3683 ld a,e - and #FE - or d - ld a,#17 ;сообщение: illegal value operand - ret nz ;недопустимый параметр - ld hl,xDD83 - ld a,e - or e - jr z,x3695 - set 2,(hl) ;прерывания разрешены - jr x3676 ;выход и обновление отладчика -x3695 res 2,(hl) ;прерывания запрещены - jr x3676 ;выход и обновление отладчика - -;АДРЕС: #3699 Команда: CALl [[addr],bank] -; вызов подпрограммы -x3699 call x3713 ;установка страницы, если задана в команде - set 4,(iy+#12) - push af - push de - ld de,(xDD6B) ;pc программы пользователя - inc de - call x3A14 ;запись de на стэк пользователя - ld de,#0008 ;возврат по адресу #08 - call x3A14 ;запись de на стэк пользователя - pop de - pop af - jr x36B7 - -;АДРЕС: #36B4 Команда: Jump [[addr],bank] -; передача управления программе -x36B4 call x3713 ;установка страницы, если задана в команде -x36B7 jr c,x36BD ;нет параметров, вызов по адресу PC - ld (xDD6B),de -x36BD call x382E ;ожидание отжатия всех клавиш - jp x013D ;выход из монитора - -;АДРЕС: #36C3 запись стандартного Magic-файла -x36C3 ei - halt - di - ld de,(xDD6B) ;pc программы пользователя - call x3A14 ;запись de на стэк пользователя - ld de,rom3_x0FF3 ;п/п Tr-Dos Запись памяти на диск - call x3A14 ;запись de на стэк пользователя - ld hl,rom3_x3D30 ;вызов страницы tr-dos - ld (xDD6B),hl ;новый PC - jr x36BD ;выход из монитора - -;АДРЕС: #36DB Команда: ROM bank -; изменение текущего банка ПЗУ -x36DB ld a,e - and #FE - or d - ld a,#19 ;сообщение: invalid bank ROM - ret nz ;недопустимый номер ROM - ld a,#1B ;сообщение: forbidden bank ROM - bit 5,(iy-#02) - ret nz ;only 48k - ld hl,x367C ;сюда вернемся - ex (sp),hl - res 4,(iy-#02) ;rom 0 - bit 0,e - ret z - set 4,(iy-#02) - ret - -;АДРЕС: #36F9 получение номера логической страницы пользователя a=[#0..#F] -x36F9 push hl - ld hl,(xE012) ;страница пользователя - ld a,%00000111 - and l - bit 4,h - pop hl - ret z ;включена была страница [0..7] - or %00001000 - ret - -;АДРЕС: #3707 сравнение страницы пользователя с заданной -;вых: a - логическая страница пользователя -; z страница совпадает -; nz не совпадает -; -x3707 call x36F9 ;a - логическая страница пользователя - cp l - ret - -;АДРЕС: #370C Команда: RAM -x370C ld bc,x367C ;обновление отладчика - push bc ;сюда вернемся - ex de,hl - jr x371D ;установка страницы пользователя равной номеру страницы в HL - -;АДРЕС: #3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL -;вх: a - количество параметров -x3713 cp #01 - ret c ;нет параметров - ret z ;1 параметр - cp #02 -x3719 ld a,#0B ;сообщение: too many operands - jr nz,x3763 ;слишком много параметров - -;АДРЕС: #371D установка страницы пользователя равной номеру страницы в HL -x371D ld a,l - and #F0 - or h - ld a,#18 - jr nz,x3763 ;сообщение: invalid bank RAM - ld a,l - and #07 - jr z,x3732 - ld a,#1C ;сообщение: forbidden bank RAM - bit 5,(iy-#02) - jr nz,x3763 ;only 48k - -;АДРЕС: #3732 установка страницы пользователя равной номеру страницы в L -x3732 ld bc,(xE012) - res 4,b - bit 3,l - jr z,x373E ;RAM 0-7 - set 4,b -x373E res 3,l - ld a,c - and %11111000 - or l - ld c,a - ld (xE012),bc - xor a - ret - -;проверка допустимости заданных адресов -;вх: de - адрес начала блока памяти -; hl - адрес конца блока памяти -; a - количество операндов [0..5] -x374B cp #02 - jr z,x375C ;если два параметра - jr nc,x3719 ;большк двух параметров. выход в отладчик - ld hl,#FFFF - cp #01 - jr z,x375C - ld de,(xDD69) ;указатель MEM - -;сравнение hl>=de, в противном случае отмена команды -x375C or a - sbc hl,de - add hl,de - ret nc - ld a,#1D ;сообщение: start > _число_ -x3763 jp x0B06 ;полное обновление монитора - -;установка заданной страницы и сравнение hl>=de, с отменой команды -;a - количество операндов [0..5] -x3766 call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - cp #04 - call z,x37F0 ;установка страницы по прочтенному четвертому операнду - jr z,x375C ;сравнение hl>=de, в противном случае отмена команды - cp #03 - jr z,x375C ;сравнение hl>=de, в противном случае отмена команды - ld a,#0A ;сообщение: too few operands -x3776 jr x3763 ;полное обновление монитора - -;АДРЕС: #3778 Команда: SCReen [on|off|5|7] -; установка/отображение экрана пользователя -x3778 cp #01 - jr z,x3787 ;есть параметр - jr nc,x3719 ;много параметров. выход в отладчик - call x3A21 ;копирование активного экрана пользователя в #4000 - call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне - jp x0AF2 ;возврат в монитор с обновлением экрана -x3787 ld a,e - and #FE - or d - jr nz,x379A - ld a,#81 ;сообщение: enter command - ld hl,xE026 - set 1,(hl) - bit 0,e - ret z - res 1,(hl) - ret -x379A ld a,d - or a - ld a,#17 ;сообщение: illegal value operand - ret nz ;ошибка. выход в отладчик - ld hl,xE012 - ld a,e - cp #05 - jr z,x37AE ;установка экрана из страницы 5 - cp #07 - jr z,x37B5 ;установка экрана из страницы 7 - ld a,#17 ;сообщение: illegal value operand - ret -x37AE res 3,(hl) -x37B0 ld a,#81 ;сообщение: enter command - jp x0AFB -x37B5 set 3,(hl) - jr x37B0 - -;АДРЕС: #37B9 управление выводимым листингом (опрос клавиш space, s, cs+1) -x37B9 push hl - ld hl,xE02D - bit 3,(hl) - res 3,(hl) - push af - call nz,x381C ;проверка нажатия клавиш space и s - pop af - call z,x3813 - pop hl - ld a,#FE - in a,(#FE) - rrca - ret c ;cs не нажата - ld a,#F7 - in a,(#FE) - rrca - ret c ;1 не нажата - res 3,(iy+#19) ;нажата cs+1 - call x382E ;ожидание отжатия всех клавиш -x37DD call x093C ;вывод на экран - ld a,#9A - bit 0,(iy+#12) - jr nz,x3776 ;ввод и обработка команды отладчика - jp x0AD7 ;печать меню - -;установка страницы по номеру hl -x37EB push af - push hl - push bc - jr x37F6 - -;установка страницы по прочтенному четвертому операнду -x37F0 push af - push hl - push bc - ld hl,(xDD99+#06) ;третий операнд в команде (bank) -x37F6 call x371D ;установка страницы пользователя равной номеру страницы в HL - ld hl,(xE012) - ld (xE00E),hl - call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - pop bc - pop hl - pop af - scf - ret - -;АДРЕС: #3807 пауза 40416t -x3807 ld a,#C0 -x3809 push bc - ld b,#00 - djnz $ - pop bc - dec a - jr nz,x3809 - ret - -;проверка нажатия клавиш space и s -x3813 ld a,#7F - in a,(#FE) - rrca - ret c ;Space не нажат - call x382E ;ожидание отжатия всех клавиш - -;проверка нажатия клавиш space и s -x381C call x3807 ;пауза 40416t - call x3023 ;ожидание действий пользователя (опрос управления, вывод часов) - cp #20 - jr z,x382B ;нажат пробел - and #5F - cp "S" - ret nz -x382B set 3,(hl) - ret - -;АДРЕС: #382E ожидание отжатия всех клавиш -x382E xor a - in a,(#FE) - cpl - and #1F - ret z - jr x382E - -;АДРЕС: #3837 копирование блока памяти в ram 8 с раскодированием -;вх: hl - адрес закодированной процедуры/данных -; de - адрес этой процедуры/данных для размещения в ram 8 -; db ?,?,n,? - длина -; db ?,?,?,n - адрес байта для раскодирования -x3837 ex (sp),hl - inc hl - inc hl - ld b,(hl) - inc hl - push de - ld e,(hl) - inc hl - ld d,#00 - ld a,(de) ;байт по заданному адресу - pop de - ex (sp),hl - ld c,a ;байт по заданному адресу - ld a,(x00FE) - xor c - ld c,a - ld a,(x00FD) - xor c - ld c,a - ld a,(x00FC) - xor c - ld c,a -x3854 ld a,c - xor b - xor (hl) - ld (de),a - inc hl - inc de - djnz x3854 - ret - - - - -;АДРЕС: #385D не используется -x385D scf - jr x3861 -;АДРЕС: #3860 не используется -x3860 or a -x3861 pop hl - ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - ex de,hl - jr c,x3880 - ld a,(hl) - or a - jr nz,x3883 - ld a,#3D ;сообщение: Professional program not found - -;АДРЕС: #3870 печать сообщения и продолжение работы текущего меню монитора -;вх: a - номер сообщения из блока 0 -x3870 sla a - call x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - scf ;cy=1 с очисткой буфера ввода - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне - jp x0129 ;печать текущего меню монитора - - -x3880 ld a,(hl) - or a - ret z -x3883 jp (hl) - - - - -;АДРЕС: #3884 получить адрес, на который ссылается команда ассемблера -;вх: hl - адрес команды ассемблера -;вх: z - команда не ссылается на память -; nz -> hl - адрес на который ссылается команда -x3884 push hl - call x2F96 ;анализ команды ассемблера - pop hl - bit 6,(iy+#01) - ret z ;в команде нет ссылки на адрес памяти - ld hl,(xDDD0) - ret - -;переход на адрес, на который ссылается команда ассемблера -x3892 xor a - call x38C6 ;запись в таблицу текущего адреса дизасма - ex de,hl - call x3884 ;получить адрес, на который ссылается команда ассемблера - jr x38C3 ;переход на новый адрес - -;расчет адреса в таблице с записями адресов дизасма -;вх: a - номер ячейки в таблице -;вых: hl - адрес в таблице -x389C ld l,a - ld h,#00 - ld de,xDD8D - add hl,hl - add hl,de - ret - -;ввод нового адреса листинга -x38A5 ld a,#C3 -x38A7 rst #30 - dw rom6_x06AD ;ввод текстовой строки внизу экрана - db #06 - jr c,x38D1 ;нажата Break. Выход из режима - bit 4,(iy+#05) - push af - call z,x0D55 ;вводить адрес выражением - pop af - call nz,x0DF4 ;вводить адрес числом - jr nz,x38A7 ;не верный адрес - push de - ld a,#0C ;сообщение: _Working ... - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - pop hl -x38C3 jp x394F - -;запись в таблицу текущего адреса дизасма -;вх: a - номер ячейки в таблице -x38C6 call x389C ;расчет адреса в таблице - ld de,(xDD8B) - ld (hl),e - inc hl - ld (hl),d - ret - -;выход из режима дизасма -x38D1 res 1,(ix+#07) - jp x37DD - -;АДРЕС: #38D8 быстрый вход в команду DASM (ss+D) -x38D8 xor a - ld hl,(xDD6B) ;pc программы пользователя - bit 6,(iy+#05) - jr nz,x38E5 ;адрес команды SS/D, берется из регистра PC - -;АДРЕС: #38E2 Команда: DASm [addr] вывод листинга дизасма -x38E2 ld hl,(xDD69) ;адрес команды SS/D. берется из ячейки (mem) -x38E5 or a - jr z,x38EE ;нет параметров, с текущего адреса - cp #02 - ld a,#0B ;сообщение: too many operands - ret nc ;много параметров - ex de,hl -x38EE ld (xDD8B),hl ;адрес начала для команды DASM - ld a,#0C ;сообщение: _Working ... - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 -x38F7 call x3A95 ;подготовка переменных к выводу на экран/принтер - ld (ix+#00),#00 ;crd Y - set 1,(ix+#07) ;Изменять атрибуты при выводе каждого символа - ld hl,(xDD8B) ;адрес начала для команды DASM - ld b,#16 ;кол-во строк для вывода - jr x390C - -;печать листинга дизасма -x3909 inc (ix+#00) -x390C push bc - call x39A8 ;печать одной строки листинга дизасма - pop bc - djnz x3909 - -;опрос клавиатуры и реакция на клавиши -x3913 ld hl,x3913 ;сюда вернемся - push hl - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - call x2C7E ;поиск и вызов процедуры обработки без возврата(если не найдено возврат) - db #8E ;ss+D - dw x38D1 ;выход из режима дизасма - db #03 ;Break - dw x38D1 ;выход из режима дизасма - db #85 ;cs+5 - dw x3951 ;переход на один байт назад - db #83 ;cs+8 - dw x3956 ;переход на один байт вперед - db #86 ;cs+6 - dw x398F ;переход на одну команду вперед - db #84 ;cs+7 - dw x3963 ;переход на одну команду назад - db #0D ;Enter - dw x38A5 ;ввод нового адреса - db #8D ;ss+G - dw x3892 ;переход на адрес, на который ссылается команда ассемблера - db #62 ;b - dw x330B ;установка ловушки #8, по текущему адресу листинга дизасма - db #6E ;n - dw x3326 ;удаление ловушки #8 - db #FF - sub #30 - ret c - ld c,#05 - cp c - jr c,x38C6 ;нажато 0..4 - запись текущего адреса дизасма - sub c - cp c - ret nc ;не цифра - call x389C ;нажато 5..9 - восстановление адреса дизасма - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl -x394F jr x395D - -;переход на один байт назад -x3951 ld bc,#FFFF - jr x3959 - -;переход на один байт вперед -x3956 ld bc,#0001 -x3959 ld hl,(xDD8B) - add hl,bc -x395D ld (xDD8B),hl ;адрес начала листинга -x3960 pop hl - jr x38F7 ;обновление окна с листингом - -;переход на одну команду назад -x3963 call x2A1B ;скроллинг окна вниз - ld (ix+#00),#00 ;crd Y - ld bc,#FFFB ;-5 -x396D inc bc - ld hl,(xDD8B) - add hl,bc - push bc - call x2F96 ;анализ команды ассемблера - pop bc - ld de,(xDD8B) - or a - sbc hl,de - jr z,x3982 ;команда найдена - jr nc,x398B -x3982 add hl,de - jr nz,x396D -;команда найдена - add hl,bc - ld (xDD8B),hl ;адрес начала листинга - jr x39A8 -;ищем дальше -x398B add hl,de - add hl,bc - jr x395D - -;переход на одну команду вперед -x398F call x298E ;скроллинг окна вверх - ld (ix+#00),#15 ;crd Y - ld hl,(xDD8B) - call x2F96 ;анализ команды ассемблера - ld (xDD8B),hl ;адрес начала листинга -;ищем команду для печати в нижней строке - ld b,#15 -x39A1 push bc - call x2F96 ;анализ команды ассемблера - pop bc - djnz x39A1 - -;АДРЕС: #39A8 Печать одной строки листинга дизасма -x39A8 ld a,(ix+#06) ;цифровые атрибуты окна - push af - ld (ix+#01),#00 ;crd X =#00 - push ix - call x3281 ;установка начала списка ловушек -;обработка ловушек, для подсветки строки -x39B5 bit 7,(ix+#00) - jr z,x39DD ;ловушка не активна -; ловушка активна - push hl - ld l,(ix+#01) ;номер страницы в которой установлена ловушка - call x3707 ;сравнение страницы пользователя с заданной - pop hl - jr nz,x39DD ;в другой странице - push de - ld e,(ix+#02) - ld d,(ix+#03) ;адрес ловушки - or a - sbc hl,de - add hl,de - pop de - jr nz,x39DD ;не по текущему адресу - ld a,(xE114) ;атрибуты для подсветки ловушки при выводе дизасма - ex (sp),ix - ld (ix+#06),a - ex (sp),ix -x39DD add ix,de - djnz x39B5 - pop ix - call x2FAC ;печать строки дизасма - pop af - ld (ix+#06),a - ret - -;АДРЕС: #39EB Команда: LCATalogue [num_drive] -; вывод каталога дискеты на принтер -;вх: de - первый операнд -; a - количество операндов [0..5] -x39EB set 4,(iy+#09) ;вывод на принтер - -;АДРЕС: #39EF Команда: CATalogue [num_drive] -; вывод каталога дискеты -;вх: de - первый операнд -; a - количество операндов [0..5] -x39EF or a - jr z,x3A04 ;используем текущий дисковод - cp #04 ;!!!ОШИБКА параметр всего один - ld a,#0B ;сообщение: too many operands - jr nc,x3A08 ;много параметров. выход в отладчик - ld a,e - and #FC - or d - ld a,#3E ;сообщение: known disk - jr nz,x3A08 ;неврный номер дисковода. выход в отладчик - ld a,e - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -x3A04 rst #30 - dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) - db #06 -x3A08 call x093C ;вывод на экран - ld a,#81 ;сообщение: enter command - jp x0AE0 ;выход в отладчик - -;АДРЕС: #3A10 Команда: PUSH data -; занесение в стек программы значения data -x3A10 ld hl,x367C ;сюда вернемся - ex (sp),hl - -;АДРЕС: #3A14 запись de на стэк пользователя -;вх: de - число -; -x3A14 ld hl,(xDD6D) ;адрес вершины стэка пользователя - dec hl - ld a,d - rst #00 - dec hl - ld a,e - rst #00 - ld (xDD6D),hl - ret - -;АДРЕС: #3A21 копирование активного экрана пользователя в #4000 -; -x3A21 bit 3,(iy-2) - jp z,x0581 ;был scr 5 при входе - ld bc,#1FFD ;был scr 7 при входе - ld a,#02 - out (c),a - ld b,#7F - ld a,#17 - out (c),a ;rom 2, ram 7 - ld hl,#C000 - ld de,#4000 - ld bc,#1B00 - ldir ;копируем экран из ram 7 - ld bc,#7FFD - ld a,#10 - out (c),a - ld b,#1F - ld a,#12 - out (c),a ;rom 2, ram 8 - ret - -;АДРЕС: #3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x3A4E push hl - ld hl,(xE010) - ld (xE012),hl - pop hl - ret - -;АДРЕС: #3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти -; на принтер. -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A57 call x374B ;;проверка допустимости заданных адресов - set 4,(iy+#09) ;вывод на принтер - jr x3A63 - -;АДРЕС: #3A60 Команда: DISs [addr_st [,addr_end]] -; реассемблирование блока памяти с адреса addr_st по addr_end -; включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A60 call x374B ;проверка допустимости заданных адресов -x3A63 ld bc,x2FAC ;п/п печать строки дизасма - jr x3A77 - -;АДРЕС: #3A68 Команда: LDUmp [addr_st[,addr_end]] -; выдача дампа памяти на принтер с адреса addr_st по addr_end включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A68 call x374B ;проверка допустимости заданных адресов - set 4,(iy+#09) ;вывод на принтер - jr x3A74 - -;АДРЕС: #3A71 Команда: DUmp [addr_st[,addr_end]] -; выдача дампа памяти с адреса addr_st по addr_end включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A71 call x374B ;проверка допустимости заданных адресов -x3A74 ld bc,x2EBE ;п/п печати одной строки дампа памяти (8 байт) -x3A77 ex de,hl - call x3A95 ;подготовка переменных к выводу на экран/принтер -x3A7B call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - rst #20 - db #8D - push de - push bc - call x3A93 ;вызов п/п по адресу в bc - call (bc) - pop bc - pop de - or a - sbc hl,de - add hl,de - jr c,x3A7B ;еще не конец - call x093C ;вывод на экран - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3A93 вызов п/п по адресу в bc - call (bc) -x3A93 push bc - ret - -;АДРЕС: #3A95 подготовка переменных к выводу на экран/принтер -x3A95 push hl - push de - push bc - bit 4,(iy+#09) - ld hl,xE075 - jr z,x3AA4 ;вывод на экран - ld hl,xE067 ;вывод на принтер -x3AA4 call x301C ;ix = адрес дескриптора окна из hl - push af - call z,x2A5E ;обработка управляющего кода #0C (очистка текущего окна) - ld (iy+#0A),#00 - pop af - jr nz,x3AB6 ;вывод на принтер - ld (ix+#00),#15 ;crd Y -x3AB6 ld hl,x3AC0 - ld (xDE12),hl - pop bc - pop de - pop hl - ret -x3AC0 call x093C - ld a,#9E - jp x0B06 - -;АДРЕС: #3AC8 Команда: VList -x3AC8 ld hl,x23A3 - ld de,x2104 ;п/п печати слова анализатора - jr x3AD8 - -;АДРЕС: #3AD0 Команда: Help -x3AD0 ld hl,x3D01 - ld c,#00 - ld de,x3AFB -;печать команд отладчика/слов анализатора -x3AD8 call x33BB ;установка и очистка информационного окна отладчика -x3ADB ld b,(ix+#04) ;высота окна в знакоместах -x3ADE push de - call x3AF9 ;вызов п/п по адресу в de - call (de) - pop de - ld a,#81 ;сообщение: enter command - ret nc ;завершили печать - djnz x3ADE -; ожидание нажатия клавиши - push hl - push bc - push de - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop de - pop bc - pop hl - cp #03 - jr nz,x3ADB ;если не Break печатаем следующую страницу - ld a,#9A ;сообщение: command abandoned - ret - -;АДРЕС: #3AF9 вызов п/п по адресу в de - call (de) -x3AF9 push de - ret - -;АДРЕС: #3AFB печать команды отладчика -;вх: hl - адрес команды отладчика -; c - номер команды в списке -;вых: hl - адрес начала следующей команды -; c - номер следующей команды в списке -; cy=1 слово напечатано -; cy=0 нет больше слов для печати -x3AFB ld a,(hl) - or a - ret z ;выход если конец списка - cp #20 - jr nc,x3B12 ;печать команды -;печать названия группы команд - push bc - ld c,a - dec c ;номер блока соообщений - rst #20 - db #0D - dc "- " - inc hl - ld b,(hl) ;номер сообщения - inc hl - push hl - rst #08 - pop hl - pop bc - jr x3B53 ;выход -;печать команды -x3B12 push bc - rst #20 - db #8D - ld b,#0A - call x15DD ;печать сообщения из hl не менее заданной длины - pop bc - push bc - push hl - ld hl,x3E2C - ld a,c - add a,a - add a,c - ld c,a - inc c - inc c - ld b,#00 - add hl,bc - ld a,(hl) ;флаг описателя команды - bit 7,a - jr z,x3B30 ;в параметрах нет строки - jr x3B34 ;в параметрах команды есть строка -x3B30 bit 5,a - jr z,x3B3C -; в параметрах команды есть строка: печать comp. -x3B34 rst #20 - dc "comp." - jr x3B50 -; печать количества параметров команды -x3B3C bit 6,a - push af - jr nz,x3B46 ;в команде есть необязательные параметры - rst #20 - dc " " - jr x3B49 -x3B46 rst #20 - dc "<=" -x3B49 pop af - and #1F - rst #30 - dw rom6_x03A1 ;печать числа в десятичной системе счисления - db #06 -x3B50 pop hl - pop bc - inc c -;выход -x3B53 scf - ret - -;АДРЕС: #3B55 Команда: IM -x3B55 ld a,e - and #FC - or d - ld a,#17 ;сообщение: illegal value operand - ret nz - ld a,#81 ;сообщение: enter command - ld hl,#0000 - add hl,de - add hl,de - add hl,de - ld de,x3B69 - add hl,de - jp (hl) -;процедуры для установки режима прерываний -x3B69 im 0 - ret - im 1 - ret - im 2 - ret - ld a,#17 ;сообщение: illegal value operand - ret - -;АДРЕС: #3B75 определение типа прерываний im 1/2 -;вых: z режим im 2 -; nz режим im 1 -; a=0 - im 2 -; a=1 - im 1 -x3B75 xor a - ld d,a - ld b,#01 - ei - halt ;если im 2, то d=0 - di ;если im 1, то d=1 - ld a,d - or a - ret - -;АДРЕС: #3B7F установка переменных по конкретным адресам -x3B7F ld hl,x3EDA - ld b,#03 -x3B84 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - ld (de),a - inc hl - inc de - ld a,(hl) - ld (de),a - inc hl - djnz x3B84 - ret - -;АДРЕС: #3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE -x3B92 db #CE,#38,#3B,#3A,#F4,#75,#DB,#73 - db #D5,#F5,#D7,#29,#D1,#AD,#D3,#BF - db #ED,#8B,#EF,#8E,#E9,#E9,#25,#0F - db #00,#E3,#E6,#23,#03,#04,#F2,#3F - db #CC,#DD,#45,#39,#4B,#F7,#51,#3D - db #57,#33,#6D,#DF,#6D,#F0,#34,#FD - db #1B,#43,#18,#87,#2E,#64,#8B,#A3 - db #CB,#84,#42,#A1,#86,#A9,#DF,#82 - db #5B,#7E,#9F,#BB,#AC,#8D,#9E,#B3 - db #71,#70,#73,#72,#96,#81,#B2,#0B - db #84,#E2,#AF,#6B,#86,#AF,#82,#F6 - db #A5,#81,#B2,#A1,#8C,#A7,#92,#18 - db #7A,#0E,#78,#B7,#0E,#61,#BB,#8F - db #B2,#B5,#79,#6F,#B1,#B7,#A2 - -;АДРЕС: #3C01 некодированные процедуры переключения страниц -> ram 8 xE42D -x3C01 db #3E,#10,#32,#69,#E4,#F1,#E3,#22 - db #3D,#E4,#21,#78,#E4,#E3,#E5,#21 - db #01,#32,#E3,#ED,#43,#3D,#E4,#01 - db #30,#3D,#18,#1A,#F5,#AF,#18,#03 - db #F5,#3E,#10,#32,#69,#E4,#F1,#ED - db #43,#3D,#E4,#E3,#4E,#23,#46,#23 - db #E3,#E5,#21,#78,#E4,#E3,#C5,#F5 - db #01,#FD,#7F,#3E,#00,#ED,#79,#3E - db #10,#06,#1F,#ED,#79,#F1,#ED,#4B - db #3D,#E4,#C9,#C5,#F5,#01,#FD,#1F - db #3E,#12,#ED,#79,#F1,#C1,#C9,#E5 - db #21,#30,#3D,#E3,#C5,#F5,#01,#FD - db #1F,#3E,#10,#ED,#79,#06,#7F,#ED - db #79,#F1,#C1,#C9,#C5,#F5,#01,#FD - db #1F,#3E,#10,#ED,#79,#AF,#06,#7F - db #ED,#79,#F1,#C1,#C9,#4F,#21,#10 - db #01,#0F,#0F,#E6,#03,#85,#6F,#6E - db #6E,#79,#C9,#E6,#03,#17,#85,#6F - db #30,#01,#24,#7E,#23,#66,#6F,#C9 - db #E3,#23,#23,#E3,#E5,#2A,#08,#E4 - db #E3,#C9,#7B,#E6,#10,#ED,#79,#06 - db #1F,#7A,#E6,#03,#F6,#10,#ED,#79 - db #08,#38,#01,#7E,#77,#08,#3E,#12 - db #ED,#79,#06,#7F,#3E,#10,#ED,#79 - db #C3,#A1,#05,#7B,#E6,#10,#ED,#79 - db #06,#1F,#7A,#E6,#03,#F6,#10,#ED - db #79,#D9,#08,#30,#01,#EB,#ED,#B0 - db #30,#01,#EB,#08,#D9,#3E,#12,#ED - db #79,#06,#7F,#3E,#10,#ED,#79,#D9 - db #C9,#00,#33,#33,#FB,#3C,#32,#0D - db #E0,#3E,#C9,#32,#18,#E5,#3E,#FB - db #32,#17,#E5,#ED,#56,#C3,#5E,#02 - -;АДРЕС: #3D01 список команд отладчика -x3D01 db #01,"L" ;номер блока сообщений+1, номер сообщения в блоке - dc "ANalyser" - dc "CLear" - dc "DEFLoad" - dc "DEFSave" - dc "EDit" - dc "EVal" - dc "LDEFinition" - dc "PDEFinition" - dc "VList" - dc "WORD" - db #01,"M" - dc "BREak" - dc "BRK" - dc "DELBreak" - dc "LBreak" - dc "LISTBreak" - db #01,"N" - dc "Jump" - dc "CALl" - dc "SLOW" - dc "WORKspace" - db #01,"O" - dc "BASE" - dc "EXX" - dc "EX AF" - dc "EXit" - dc "OPTion" - dc "SHow" - db #01,"Q" - dc ".PC" - dc "." - dc "CHeck" - dc "DASm" - dc "DATA" - dc "DISs" - dc "DUmp" - dc "FILl" - dc "FINd" - dc "LDISs" - dc "LDUmp" - dc "MEMory" - dc "MOVe" - dc "PUSH" - dc "POP" - dc "RAM" - dc "ROM" - dc "SEarch" - db #01,"R" - dc "CATalogue" - dc "ERAse" - dc "LCATalogue" - dc "LOAD" - dc "SAVE" - db #01,"S" - dc "IM" - dc "INTerrupt" - dc "IND" - dc "OUTD" - dc "IN" - dc "OUT" - dc "SCReen" - db #00 - -;АДРЕС: #3E25 чтение портов #1FFD/#7FFD -;вых: cy=1 -x3E25 ld b,#0E - call x03B6 ;чтение регистра AY - rlca - ret - -;АДРЕС: #3E2C адреса обработки команд отладчика -; 7,=1 в параметрах есть строка -> 0-2,=nnn количество числовых параметров перед строкой -; 6,=1 операнды передаются в регистрах de,hl,bc. кол-во операндлов в A -; 5,=1 обрабатывать команду без проверки синтаксиса -; 7-5,=000 -> 0-4,=nnnnn количество операндов -x3E2C dw x1F42: db %00000001 ;ANalyser - dw x1F25: db %00000000 ;CLear - dw x1EA5: db %00100000 ;DEFLoad - dw x1E76: db %00100000 ;DEFSave - dw x2093: db %00100000 ;EDit - dw x2297: db %00100000 ;EVal - dw x2218: db %00000000 ;LDEFinition - dw x2214: db %00000000 ;PDEFinition - dw x3AC8: db %00000000 ;VList - dw x1FB0: db %00100000 ;WORD - dw x3303: db %01000101 ;BREak - dw x32E2: db %00000010 ;BRK - dw x32AF: db %00000001 ;DELBreak - dw x31C1: db %00000000 ;LBreak - dw x31C1: db %00000000 ;LISTBreak - dw x36B4: db %01000010 ;Jump - dw x3699: db %01000010 ;CALl - dw x31AB: db %00000001 ;SLOW - dw x344F: db %00000001 ;WORKspace - dw x3432: db %00000001 ;BASE - dw x3662: db %00000000 ;EXX - dw x3666: db %00000000 ;EX AF - dw x0AD7: db %00000000 ;EXit - dw x3333: db %00000010 ;OPTion - dw x33D2: db %00000000 ;SHow - dw x3614: db %10000000 ;.PC - dw x361E: db %10000000 ;. - dw x356F: db %01000100 ;CHeck - dw x38E2: db %01000001 ;DASm - dw x360D: db %10000001 ;DATA - dw x3A60: db %01000010 ;DISs - dw x3A71: db %01000010 ;DUmp - dw x35F5: db %01000100 ;FILl - dw x346A: db %10000010 ;FINd - dw x3A57: db %01000010 ;LDISs - dw x3A68: db %01000010 ;LDUmp - dw x365C: db %00000001 ;MEMory - dw x352F: db %01000100 ;MOVe - dw x3A10: db %00000001 ;PUSH - dw x364D: db %00000000 ;POP - dw x370C: db %00000001 ;RAM - dw x36DB: db %00000001 ;ROM - dw x3461: db %10000011 ;SEarch - dw x39EF: db %01000001 ;CATalogue - dw x3074: db %00100000 ;ERAse - dw x39EB: db %01000001 ;LCATalogue - dw x3095: db %00100000 ;LOAD - dw x3085: db %00100000 ;SAVE - dw x3B55: db %00000001 ;IM - dw x3683: db %00000001 ;INTerrupt - dw x337A: db %00000001 ;IND - dw x336C: db %00000010 ;OUTD - dw x3383: db %00000001 ;IN - dw x3360: db %00000010 ;OUT - dw x3778: db %01000001 ;SCReen - db #00 - -;АДРЕС: #3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED -x3ED2 db #A1,#AF,#AD,#AF,#A9,#AF,#AD,#AF - -;АДРЕС: #3EDA данные для установки переменных по конкретным адресам -x3EDA dw xC063 ;адрес - dw #0000 ;включение отладчика - dw xC064 ;адрес - dw #0000 ;отключение мерехвата NMI - dw xE9E5 ;адрес - dw xF7C0 ;установка адреса шрифта - -;АДРЕС: #3FE6 названия месяцев -x3EE6 dc "Jan" - dc "Feb" - dc "Mar" - dc "Apr" - dc "May" - dc "Jun" - dc "Jul" - dc "Aug" - dc "Sep" - dc "Oct" - dc "Nov" - dc "Dec" - -;АДРЕС: #3F0A названия дней недели -x3F0A dc "Sun" - dc "Mon" - dc "Tue" - dc "Wed" - dc "Thu" - dc "Fri" - dc "Sat" - -x3F1F DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" - ds #4000-$,#00 - - - SAVEBIN "../Build/scorp/NewROM2.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom3.bat b/ProfRom_Disasm/rom3.bat deleted file mode 100755 index 3eb1896..0000000 --- a/ProfRom_Disasm/rom3.bat +++ /dev/null @@ -1,5 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom3_trdos.a80 >> !log\error.txt - diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 deleted file mode 100755 index ab49106..0000000 --- a/ProfRom_Disasm/rom3_trdos.a80 +++ /dev/null @@ -1,7187 +0,0 @@ -;АДРЕС: #3FF0 вывод в порт -;АДРЕС: #3FF3 чтение порта - - -;ИСХОДНЫЙ ТЕКСТ TR-DOS 5.03 для SjASMPlus - -;Основано на книге "ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04T (5.03) ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ." -;Автор книги: Федин Павел Юрьевич, 04.04.1996. -;Перевод всех чисел в шестнадцатеричный формат, переформатирование: Spectre, 19.10.2005 -;Исправление, переформатирование: Keeper, 21.06.2009 -;Кодировка: CP-1251 -;Правка под версию Tr-Dos 5.03: PLM, 2022.04.03 - - DEVICE ZXSPECTRUM48 - -;Адрес 0. Полная инициализация системы. - - ORG 0 - -x0000 DI - JP x0844 ;new - LD A,7 - JR x0009 - -;Адрес 8. Инициализация системы. В DE поместите адрес вершины памяти, в A - 7 и запретите прерывания. Используется также с адреса 9. - -x0008 NOP -x0009 NOP - NOP -x000B LD A,#3F -x000D JR x0013 -x000F NOP - -;Адрес #10. Переход к подпрограмме печати символа из регистра A. - -x0010 JP x3D82 - -;Адрес #13. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x0013 LD I,A - JP x001B - -;Адрес #18. Переход к подпрограмме печати строки. - -x0018 JP x2707 - -;Адрес #1B. То же, что и #24. - -x001B ld h,d - ld l,e - inc de - JR x0024 - -;Адрес #20. Переход к подпрограмме вызова подпрограмм из ПЗУ бейсика. Адрес вызываемой подпрограммы поместите в двух байтах после команды RST #20. Например: - -x0020 JP x2F72 -x0023 RET - -;Адрес #24. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x0024 ld (hl),#00 - JR x002B ;инициализация системы - -;Адрес #28. Выборка адреса текущего канала с учетом сдвига, заданного в регистре C. - -x0028 JP x2323 - -;Адрес #2B. Инициализация системы. В DE и HL поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x002B ld bc,#BFFF - jr x003A -x0030 nop - nop - nop -x0033 out (c),a - nop - halt - rst #38 - -;Адрес #38. Обработка маскируемого прерывания. - -x0038 ei - ret - -;Адрес #3A. Инициализация системы. В DE поместите адрес вершины памяти в HL - адрес дна, установите белый бордюр, заполните обозначенную область памяти байтом 2 и запретите прерывания. - -x003A ldir - jr x0048 - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - -x0048 LD (#5CB4),HL ;установка P_RAMT - LD DE,#3EAF ;адрес символов для UDG - LD BC,#A8 ;длина UDG - #A8 байтов - LD A,E - EX DE,HL ;переброска адреса символов для UDG в HL - LD SP,#6000 ;установка временного стека - LD (#5F00),HL ;сохранение адреса символов для UDG - LD HL,#79 ;возвращаться в #79 - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#B8ED ;код команды LDDR - JR x0069 ;установка UDG - -;Адрес #66. Подпрограмма обработки немаскируемого прерывания. - -x0066 JP x2A56 - -;Адрес #69. Выполнение любой команды процессора. Поместите в HL коды команды, установите регистры (#5F00 вместо HL) и поместите в HL коды команды. - -x0069 LD (#5F10),HL ;помещение кодов команды в память - PUSH AF ;сохранение AF - LD A,#C9 ;код команды RET - LD (#5F12),A ;помещение его в память - POP AF ;восстановление AF - LD HL,(#5F00) ;берем адрес символов для UDG - JP #5F10 ;выполнение команды и возврат - -;Адрес #79. Инициализация системы. Установите P_RAMT, знакогенератор пользователя, белый бордюр, поместите в DE адрес начала знакогенератора минус 1 и запретите прерывания. - -x0079 EX DE,HL ;загрузка адреса UDG в HL - INC HL - LD (#5C7B),HL ;установка переменной UDG - DEC HL ;следующий адрес - LD BC,#1E40 ;установка RASP и PIP - LD (#5C38),BC - LD (#5CB2),HL ;установка RAMTOP - LD HL,#3C00 ;установка CHARS - LD (#5C36),HL - LD HL,(#5CB2) ;берем адрес RAMTOP - LD (HL),#3E ;признак конца стека GO SUB - DEC HL ;следующий адрес - LD SP,HL ;установка постоянного стека - DEC HL ;установка ERR_SP - DEC HL - LD (#5C3D),HL - LD DE,#1303 ;адрес подпрограммы обработки ошибок - PUSH DE ;установка его - IM 1 ;установка первого режима прерываний - LD IY,#5C3A ;установка регистра IY - LD HL,#5CB6 ;установка CHANS - LD (#5C4F),HL - LD DE,#15AF ;адрес области описателей каналов в ПЗУ бейсика - LD BC,#15 ;ее длина - #15 байт - EX DE,HL - CALL x0117 ;перенос области описателей каналов в ОЗУ - EX DE,HL - DEC HL ;установка DATADD - LD (#5C57),HL - INC HL ;следующий адрес - LD (#5C53),HL ;установка PROG - LD (#5C4B),HL ;установка VARS - LD (HL),#80 ;конец области - INC HL ;следующий адрес - LD (#5C59),HL ;установка E_LINE - LD (HL),#D ;конец строки - INC HL ;следующий адрес - LD (HL),#80 ;конец области - INC HL ;следующий адрес - LD (#5C61),HL ;установка WORKSP - LD (#5C63),HL ;установка STKBOT - LD (#5C65),HL ;установка STKEND - LD A,#38 ;атрибуты экрана - LD (#5C8D),A ;установка ATTR_P - LD (#5C8F),A ;установка ATTR_T - LD (#5C48),A ;установка BORDER - LD HL,#523 ;установка REPDEL и REPPER - LD (#5C09),HL - DEC (IY-#3A) ;клавиши не нажаты - DEC (IY-#36) - LD HL,#15C6 ;адрес таблицы STRMS в ПЗУ бейсика - LD DE,#5C10 ;адрес переменной STRMS - LD BC,#0E ;длина таблицы - #18 байта - CALL x0117 ;перенос таблицы в ОЗУ - SET 1,(IY+1) ;открыт поток 3 - LD HL,#5CC2 ;помещение команды RET в ОЗУ - LD (HL),#C9 - -;Внимание!!! Системных переменных TR-DOS пока еще нет, и это портит память. - - RST #20 ;инициализация буфера принтера и экрана - DW #0EDF - LD HL,#5C6B ;буфер принтера использовался - LD (HL),2 - LD HL,#128B ;возвращаться в #128B - PUSH HL - LD A,#AA ;выполнять команду RUN "boot" - LD (#5B00),A - EI ;разрешение прерываний - JP x3D31 ;вход в TR-DOS - -;Адрес #117. Выполнение команды LDIR. Установите HL, DE и BC и поместите байт #C9 по адресу #5F12. - -x0117 LD (#5F00),HL ;сохранение HL - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#B0ED ;коды команды LDIR - LD (#5F10),HL ;помещение команды в ОЗУ - LD HL,(#5F00) ;восстановление HL - JP #5F10 ;выполнение команды и возврат - -;Адрес #12A. Обработка номера строки автостарта программы на бейсике. Установите #5D10 и загрузите программу. - -x012A CALL x20E5 ;изменение памяти и удаление буфера - CALL x1D97 ;очистка экрана - LD HL,(#5C59) ;берем адрес, по которому находится номер - INC HL ;строки автозапуска программы - LD E,(HL) ;берем этот номер - INC HL - LD D,(HL) - LD A,D ;это 0? - OR E - EX DE,HL ;переброска его в HL - JR Z,x0140 ;если это не 0, то программу запускать - XOR A - LD (#5D10),A -x0140 PUSH HL ;сохранение номера строки автостарта - CALL x0232 ;восстановление старого адреса подпрограммы обработки ошибок - POP HL ;восстановление номера строки автостарта - LD (#5C42),HL ;установка его - XOR A ;строку запускать с первого оператора - LD (#5C44),A - RST #20 ;очистка рабочей области памяти, стека калькулятора и буфера редактора - DW #16B0 - LD HL,(#5C53) ;выполнение RESTORE - DEC HL - LD (#5C57),HL - LD SP,(#5C3D) ;очистка стека - LD A,(#5D10) ;программу запускать? - OR A - LD HL,#1B76 ;адрес подпрограммы выполнения программы на бейсике - JR Z,x0166 ;если можно, то запуск программы - RST #20 ;сообщение O.K. - DW #1BB0 -x0166 PUSH HL ;помещение на стек адреса подпрограммы выполнения программы на бейсике - LD HL,#5CC2 ;помещение на стек адреса переключателя ПЗУ на бейсик - PUSH HL - RET ;переход к подпрограмме выполнения программы на бейсике - -;Адрес #16C. То же, что и #3D1A, но не создает системные переменные. - -x016C CALL x20F1 ;изменение памяти - CALL x294A ;создание буфера - LD A,#FF ;сообщения не печатать - LD (#5D15),A - XOR A ;обнуление #5CF7 - LD (#5CF7),A - LD A,#AA ;заставку не выводить - LD (#5D17),A - LD HL,#201 ;возвращаться в бейсик - LD (#5D1A),HL - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#5D1C),HL - DEC HL ;выделение места для адреса подпрограммы - DEC HL ;обработки ошибок - LD SP,HL - CALL x021D ;установка адреса подпрограммы обработки ошибок - LD HL,(#5CB2) ;командная строка находится выше RAMTOP? - LD DE,(#5C5D) - SBC HL,DE - EX DE,HL - JR NC,x01A5 ;если да, то при выделении буфера она не - OR A ;перемещалась - LD DE,#101 - SBC HL,DE -x01A5 LD (#5C5D),HL -x01A8 CALL x01C7 ;следующий символ строки ENTER? -x01AB JP Z,x01D3 ;если да, то завершение - CP #EA ;это REM? - INC HL ;следующий символ - JR NZ,x01A8 ;если нет, то следующий символ - CALL x01C7 ;следующий символ строки ENTER? - JR Z,x01AB ;если да, то завершение - CP ":" ;это двоеточие? - JP NZ,x01D3 ;если нет, то возврат - INC HL ;следующий символ - CALL x3048 ;сжатие строки - LD HL,(#5D11) - JP x030A ;выполнение команды - -;Адрес #1C7. берет символ по адресу из HL и возвращает его в аккумуляторе плюс флаг Z если это 0, #D или #80, иначе NZ. - -x01C7 LD A,(HL) ;берем байт по нужному адресу - CP #D ;это #D? - RET Z ;если да, то возврат - CP #80 ;это #80? - RET Z ;если да, то возврат - OR A ;сравнение его с нулем - RET ;возврат - -x01D0 CALL x1E43 - -;Адрес #1D3. Подпрограмма завершения. Вход: установить #5CB6, #5D0C, #5D0F, #5D11, #5D18, #5D1A, #5D1C и #5D1F. Выход: в SP адрес из #5D1C, а в BC код ошибки. - -x01D3 LD HL,0 ;буфер убирать, память изменять - LD (#5CF8),HL - CALL x20E5 ;если есть буфер, то уберем его - CALL x1D63 ;если надо, то очистка рабочей области памяти - LD HL,#5D17 ;заставку не выводить - LD (HL),#AA - LD HL,#5D1F ;команда поступила из машинного кода? - LD A,(HL) - OR A - LD (HL),0 ;следующая команда будет не из машинного кода - JR NZ,x01F3 ;если команда была не из машинного кода, то - CALL x1E1C ;удаление из строки 5-байтовых чисел - CALL x0212 ;и прогон символов до конца строки -x01F3 LD SP,(#5D1C) ;помещаем в SP адрес из #5D1C - LD HL,(#5D1A) ;берем адрес выхода из этой подпрограммы - LD BC,(#5D0F) ;помещаем в BC код ошибки - LD B,0 - JP (HL) ;переход по назначенному адресу - -;Адрес #201. Проверка на ошибку. Вход: установите #5C3A и #5D13. - -x0201 CALL x0232 ;помещение в #5C3D адреса из #5D13 - BIT 7,(IY+0) ;была ошибка? - RET NZ ;если нет, то возврат - LD DE,#5CC2 ;адрес команды RET в ОЗУ - LD SP,(#5C3D) ;установка SP на дно стека - PUSH DE ;переход на обработку ошибок - RET - -;Адрес #212. Прогон символов до конца строки. Установите в #5C5D адрес одного из символов строки. На выходе там будет адрес конца строки. - -x0212 CALL x1D8C ;берем текущий символ строки - CP #D ;это ENTER? - RET Z ;если да, то возврат - CALL x1E2A ;берем следующий символ строки - JR x0212 ;повтор - -;Адрес #21D. Установка адреса обработки ошибок. Вход: в #5D1C должен быть адрес на 2 больше того, по которому размещаете адрес подпрограммы обработки ошибок. Выход: старое содержимое #5C3D копируется в #5D13, а в #5C3D помещается адрес, по которому находится размещенный адрес. - -x021D LD HL,(#5C3D) ;сохранение старого содержимого #5C3D - LD (#5D13),HL - LD HL,(#5D1C) ;берем адрес из #5D12 - DEC HL ;берем нужный нам адрес - DEC HL - LD (#5C3D),HL ;установка #5C3D - LD DE,x3D16 ;адрес подпрограммы обработки ошибок - LD (HL),E ;запись его в наши ячейки - INC HL - LD (HL),D - RET ;возврат - -;Адрес #232. Помещение в #5C3D адреса из #5D13. Установите #5D13. - -x0232 LD HL,(#5D13) - LD (#5C3D),HL - RET - -;Адрес #239. Вход в командный процессор. Используется также с адреса #27B (запуск файла "boot"). - -x0239 LD HL,0 ;обнуление #5CF7 и #5CF8 - LD (#5CF7),HL - ADD HL,SP ;сохранение SP - LD (#5D1C),HL - DEC HL ;выделение места для адреса подпрограммы - DEC HL ;обработки ошибок - LD SP,HL - CALL x021D ;установка адреса подпрограммы обработки ошибок - LD HL,#5D17 ;заставку выводить? - LD A,(HL) - CP #AA - LD A,0 ;ошибок нет - LD (#5D0F),A - JP Z,x02CB ;если заставка не нужна, то переход к командному процессору - LD (HL),#AA ;в следующий раз заставку не выводить - CALL x1D97 ;очистка экрана - CALL x1D88 ;открытие потока 2 - LD HL,x0360 ;вывод текста заставки - RST #18 - CALL x106E ;вывод цветных полос - LD A,(#5CB6) ;интерфейс-1 есть? - CP #F4 - JR Z,x0271 ;если да, то - LD HL,x1000 ;вывод "Interface one fitted" - RST #18 -x0271 LD A,(#5B00) ;файл "boot" запускать? - CP #AA - JR NZ,x02CB ;если нет, то вход в командный процессор - CALL x20F1 ;изменение памяти -x027B LD HL,(#5C59) ;берем адрес буфера команд - LD A,#FE ;был запущен файл "boot" - LD (#5D0E),A - LD (HL),#F7 ;ввод команды RUN "boot" - INC HL - LD (HL),#22 - INC HL - LD (HL),"b" - INC HL - LD (HL),"o" - INC HL - LD (HL),"o" - INC HL - LD (HL),"t" - INC HL - LD (HL),#22 - INC HL - LD (#5C5B),HL ;установка адреса курсора - LD (HL),#D ;ENTER - INC HL - LD (HL),#80 ;конец области - INC HL - LD (#5C61),HL ;установка переменной WORKSP - LD (#5C63),HL ;установка и очистка стека калькулятора - LD (#5C65),HL - SET 3,(IY+1) ;установка режима L - JR x02EF ;выполнение команды - -;Адрес #2B0. Перенос трех байтов из адреса HL по адресу DE. - -x02B0 LD B,3 ;количество байтов -x02B2 LD A,(HL) ;перенос байта - LD (DE),A - INC HL ;адреса следующих байтов - INC DE - DJNZ x02B2 ;повтор до конца - RET ;возврат - -;Адрес #2B9. Остановка дисковода. В A поместите значение системного регистра. - -x02B9 LD B,#20 ;#20 повтора -x02BB PUSH BC ;сохранение количества повторов - XOR 8 ;переключение бита 3 - OUT (#FF),A ;загрузка системного регистра - PUSH AF ;сохранение значения системного регистра - LD A,5 ;задержка в #462A такта - CALL x3DFF - POP AF ;восстановление значения системного регистра - POP BC ;и количества повторов - DJNZ x02BB ;повтор до конца - RET ;возврат - -;Адрес #2CB. Командный процессор. Используется также с адресов: -;#2EF - исполнение команды. Сжатую команду поместите в буфер командной строки; -;#30A - исполнение команды. Установите все для #1D3, #5D11 и загрузите из #5D11 HL. - -x02CB LD HL,(#5D1C) ;очистка стека - DEC HL - DEC HL - LD SP,HL - CALL x20F1 ;изменение памяти - CALL x1D83 ;открытие потока 0 - LD A,(#5D16) ;выбор дисковода D: - OR 3 - CALL x02B9 ;остановка его - LD A,(#5D16) ;остановка текущего дисковода - CALL x02B9 - XOR A ;сообщения об ошибках печатать - LD (#5D15),A - CALL x2135 ;принятие команды - CALL x3032 ;сжатие командной строки -x02EF CALL x1D9F ;очистка низа экрана - LD HL,x02CB ;возвращаться в командный процессор - LD (#5D1A),HL - XOR A ;ошибок не было - LD (#5D0F),A - LD HL,(#5C59) ;берем адрес командной строки - PUSH HL ;сохраняем его - LD DE,#5D20 ;адрес буфера - CALL x02B0 ;сохранение трех первых символов строки - POP HL ;восстановление адреса строки - LD (#5D11),HL ;установка адреса командной строки -x030A LD A,(HL) ;берем первый символ строки - LD B,A ;сохраняем его - AND #80 ;его код меньше #80? - LD A,B ;восстановление символа - JR Z,x031A ;если его код меньше #80, то дисковод не устанавливать - CP #FE ;это RETURN? - JR Z,x031A ;если да, то дисковод не устанавливать - PUSH AF ;сохранение символа - CALL x3DC8 ;активизация дисковода по умолчанию - POP AF ;восстановление символа -x031A LD HL,x2FF3 ;адрес таблицы команд - DEC HL - LD C,0 ;проверка первой команды -x0320 INC C - LD D,A ;сохранение символа - LD A,#15 ;пройдена вся таблица? - CP C - JP C,x01D3 ;если да, то завершение - -;Лучше было бы поставить здесь JP C,#1D1A для выдачи сообщения "*ERROR*". - - LD A,D ;восстановление символа - INC HL ;адрес следующей команды в таблице - CP (HL) ;символы совпали? - JR NZ,x0320 ;если нет, то повтор - CP #FE ;введена команда RETURN? - CALL NZ,x294A ;если нет, то создание буфера - LD A,9 ;поиск файла вести по 9 байтам - LD (#5D06),A - XOR A ;ошибок не было - LD (#5D0F),A - LD (#5CD6),A ;расширение файла принимать - LD (#5D10),A ;на случай загрузки или верификации файла - LD HL,#5C3B ;проверка строки на синтаксис - RES 7,(HL) - LD B,0 ;перевод номера команды в двухбайтную форму - LD HL,x3008 ;адрес таблицы адресов подпрограмм - DEC C ;команды считать с нуля - SLA C ;умножение номера подпрограммы на 2 - ADD HL,BC ;определение адреса в таблице - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - EX DE,HL ;переносим его в HL - PUSH HL ;сохраняем его - LD DE,x0359 ;возврат будет в #359 - PUSH DE - JP (HL) ;вызов подпрограммы -x0359 LD HL,#5C3B ;выполнение команды - SET 7,(HL) - POP HL ;восстановление адреса подпрограммы - JP (HL) ;вызов подпрограммы - -;Адрес #360. Текст заставки TR-DOS. - -x0360 DB #16,1,#5 - DB "* TR-DOS Ver 5.03 *" - DB #D,#D,#7F - DB " 1986 Technology Research Ltd." - DB #16,5,#B - DB "(U.K.)" - DB #16,7,5 - DB "BETA 128" - DB 0 - -;Адрес #3AC. Завершение выдачи каталога. - -x03AC CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - CALL x3D80 ;перевод строки - CALL x3D80 ;еще раз - LD BC,(#5E0A) ;берем количество свободных секторов на диске - CALL x1DA9 ;печать его - LD HL,x29D2 ;печать FREE - RST #18 - -;Адрес #3C0. Переход к подпрограмме завершения. - -x03C0 JP x01D3 - -;Адрес #3C3. Печать сообщения об ошибке. В HL установите адрес сообщения, в A - код ошибки. - -x03C3 PUSH AF ;сохранение кода ошибки - LD A,(#5D0E) ;ошибка произошла при автозагрузке? - CP #FE - JR NZ,x03CD ;если нет, то установка кода ошибки - POP AF ;снятие со стека кода ошибки - RET ;возврат -x03CD POP AF ;восстановление кода ошибки - LD (#5D0F),A ;установка кода ошибки - LD A,(#5D15) ;печать сообщений разрешена? - OR A - CALL Z,x2707 ;если да, то печать сообщения - -;Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. - - RET ;возврат - -x03D9 LD HL,x2A28 - LD A,1 - JP x1C4A - -;Адрес #3E1. Вывод сообщения O.K. - -x03E1 LD HL,x2766 ;адрес сообщения O.K. - XOR A ;код ошибки - 0 - JP x1C4A ;выдача сообщения и завершение - -;Адрес #3E8. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет #5CCC. Используется также с адресов: -;#3EC - загрузка сектора дорожки 0 в буфер. Установите #5CCC. -;#3F2 - загрузка сектора в буфер, номер сектора в E, дорожки ? в D). - -x03E8 XOR A ;текущий сектор 0 - LD (#5CCC),A -x03EC LD DE,(#5CCC) ;берем номер сектора - LD D,0 ;дорожка 0 -x03F2 CALL x294A ;создание буфера - LD HL,#5D25 ;загружать в буфер - LD B,1 ;1 сектор - JP x1E3D ;загрузка сектора - -;Адрес #3FD. Загрузка в буфер сектора 8 дорожки 0. Установите #5D0C. - -x03FD CALL x294A ;создание буфера, если его нет - LD DE,8 ;дорожка 0, сектор 8 - JR x03F2 ;загрузка сектора в буфер - -;Адрес #405. Настройка на диск. Меняет переменную с типом дисковода. - -x0405 CALL x03FD ;чтение в буфер сектора 8 дорожки 0 - LD A,(#5E0C) ;диск от TR-DOS? - CP #10 - JR Z,x0415 ;если да, то установка типа дисковода - LD HL,x29E2 ;адрес сообщения DISC ERROR - RST #18 ;печать сообщения - JR x03C0 ;завершение - -;Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь программа должна быть такой: -; LD HL,#29E2 -; LD A,7 -; JP #1C4A -;А в этом случае ваша программа не получит код ошибки, а внизу экрана совершенно не к месту появится DISC ERROR. - -x0415 CALL x3E11 ;берем тип дисковода - RES 0,(HL) ;установка типа дисковода под тип диска - RES 1,(HL) ;и возврат - LD A,(#5E08) - BIT 0,A - JR NZ,x0425 - SET 0,(HL) -x0425 BIT 3,A - RET NZ - SET 1,(HL) - RET - -;Ошибка!!! Перед установкой типа надо бы проверить совместимость диска и дисковода. - -;Адрес #42B. Проверка второго символа командной строки. Вход: установите #5D11. На выходе будет установлен флаг Z, если это ENTER и сброшен, если нет. - -x042B LD HL,(#5D11) ;берем адрес начала строки команды - INC HL ;берем адрес ее второго символа - LD A,(HL) ;берем этот символ - CP #D ;сравнение его с ENTER - RET ;возврат - -;Адрес #433. Выполнение команды CAT. Установите #5D11 и #5C3B. Используется также с адреса: -;#479 (вывод каталога диска; в A - номер потока, в буфере - сектор 8 дорожки 0). - -x0433 CALL x042B ;второй символ строки команды ENTER? - LD BC,2 ;каталог выводить в поток 2 - LD (#5CDB),BC - JR Z,x046A ;если второй символ строки ENTER, то вывод каталога - CP "#" ;второй символ строки "#"? - JR NZ,x045D ;если нет, то установка дисковода и вывод каталога - LD (#5C5D),HL ;установка CH_ADD на второй символ строки - CALL x1E0B ;установка номера потока - CALL x1D8C ;берем текущий символ - CP #D ;это ENTER? - JR Z,x046A ;если да, то вывод каталога - CP "," ;это запятая? - JP NZ,x1D1A ;если нет, то синтаксическая ошибка - CALL x1E2A ;берем следующий символ - CALL x1DBD ;помещение имени дисковода на стек калькулятора - JR x0460 ;установка дисковода и вывод каталога -x045D CALL x1DDF ;установка CH_ADD и помещение имени дисковода на стек калькулятора -x0460 CALL x1D75 ;если строка проверяется на синтаксис, то возврат - CALL x1DB5 ;снятие имени дисковода со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода -x046A CALL x1D75 ;если проверка на синтаксис, то возврат - LD A,(#5CF6) ;помещение номера дисковода в #5CF9 - LD (#5CF9),A - CALL x0405 ;настройка на диск - LD A,(#5CDB) ;берем номер потока -x0479 CP 2 ;выводим в поток 2? - PUSH AF ;сохранение номера потока - CALL Z,x1D97 ;если назначен поток 2, то очистка экрана - POP AF ;восстановление номера потока - CP #11 ;он больше #10? - -;Ошибка!!! Всего потоков #F, а не #10. - - JP NC,x1D1A ;если да, то ошибка - CALL x1D84 ;открытие потока - -;Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот поток. - - LD A,#FF ;установка #5CF8 в #FF - LD (#5CF8),A - LD HL,x29F7 ;печать TITLE: - RST #18 - LD HL,#5E1A ;печать имени диска - RST #18 - CALL x3D80 ;перевод строки - LD A,(#5E09) ;вычисление количества нестертых файлов на диске - LD HL,#5E19 - SUB (HL) - PUSH HL - CALL x1DA3 ;печать его - LD HL,x2A2B ;печать FILES - RST #18 - POP HL - LD C,(HL) ;берем количество стертых файлов - CALL x1DA4 ;печать его - LD HL,x2A1D ;печать DEL.FILES - RST #18 - CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 - LD HL,#5D25 ;берем начало буфера -x04B6 CALL x04F6 ;проверка достижения конца каталога - CALL x3D80 ;перевод строки - LD A,(#5CF6) ;печать имени дисковода - ADD A,"A" - RST #10 - LD B,2 ;печатаем по 2 имени в строке -x04C4 CALL x04F6 ;если файл стерт, то пропуск его - PUSH BC ;сохранение количества имен файлов в строке - LD A,":" ;печать двоеточия - RST #10 - PUSH HL ;сохранение адреса текущего описателя файла в буфере - CALL x2938 ;печать имени и расширения файла - LD BC,#D ;вычисление адреса, по которому находится - POP HL ;размер файла в секторах - PUSH HL - ADD HL,BC - LD C,(HL) ;берем размер файла - PUSH BC ;сохраним его - LD A,C ;перегрузим его в A - LD B,2 ;вычисление количества пробелов перед числом - CP #A - JR C,x04DF - DEC B -x04DF CP #64 - JR NC,x04E8 -x04E3 LD A," " ;печать пробелов - RST #10 - DJNZ x04E3 -x04E8 POP BC ;восстановление размера файла - CALL x1DA9 ;печать его - POP HL ;восстановление адреса текущего описателя файла - POP BC ;восстановление количества имен файлов в строке - LD DE,#10 ;следующий описатель - ADD HL,DE - DJNZ x04C4 ;если напечатали только 1 файл, то печать второго - JR x04B6 ;следующая строка - -;Адрес #4F6. Проверка переменной #5CF9 и проверка достижения конца каталога при его печати. - -x04F6 PUSH HL ;сохранение HL и BC - PUSH BC - LD A,(#5CF9) ;берем номер дисковода для выдачи каталога - LD HL,#5CF6 ;назначен этот дисковод? - CP (HL) - CALL NZ,x3DCB ;если нет, то о последствиях читайте в конце - -;Ошибка в программе!!! Об этом особо в конце текста. - - POP BC ;восстановление HL и BC - POP HL - JP x2FC6 ;проверка достижения конца каталога и возврат - -;Обратите особое внимание на команду CALL NZ,#3DCB. В аналогичной подпpогpамме для LIST стоит CALL NZ,#3DCB. В нашем же случае упpавление будет передано в подпрограмму печати символа (ее адрес #3D80) на адрес, где находятся 2 байта адреса от команды CALL #3D94. Программа с этого адреса будет такой: -;SUB H -;DEC A -;CALL #20F1 -;POP DE -;POP BC -;POP HL -;RET -;Таким образом, произойдет изменение памяти, если оно разрешено, затем со стека будут сняты 3 адреса и помещены в регистры и затем произойдет возврат. Последствия всего этого определяются программой, вызвавшей #4F6. - -;Адрес #507. Прибавление #10 к HL. - -x0507 LD DE,#10 - ADD HL,DE - RET - -;Адрес #50C. Проверка и обработка достижения конца буфера при работе с каталогом. Установите #5CCC и поместите в HL текущее место буфера. Если достигнут его конец, то в HL будет начало буфера и в него будет загружен следующий сектор каталога. - -x050C PUSH HL ;сохранение HL и BC - PUSH BC - LD BC,#A1DB ;достигнут конец буфера? - ADD HL,BC - JR C,x0517 ;если да, то загрузка следующего сектора - POP BC ;восстановление HL и BC - POP HL - RET ;возврат -x0517 LD HL,#5CCC ;следующий сектор - INC (HL) - CALL x03EC ;загрузка его в буфер - POP BC ;восстановление BC и HL - POP HL - LD HL,#5D25 ;помещение в HL адреса начала буфера - RET ;возврат - -;Адрес #524. Вычисление номера дисковода по его имени. Имя поместите в А, на выходе там будет номер. - -x0524 AND #DF ;буква заглавная - SBC A,#41 ;вычисление номера дисковода - JP C,x1D1A ;если именем был символ меньше "A", то ошибка - CP 4 ;номер получился больше 3? - JP NC,x1D1A ;если да, то ошибка - RET ;возврат - -x0531 CALL x1DB5 - LD A,C - CP B - JP Z,x1D1A - RET - -;Адрес #53A. Выполнение команды NEW. Установите #5D11 и #5C3B. Используется также с адреса #569 (запись информации о файле; номер файла задайте в регистре C). - -x053A CALL x1DCD ;прием имен файлов на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка старого имени файла - LD A,(#5CF6) ;берем номер дисковода - LD (#5CF8),A ;сохраняем его - JP NZ,x03D9 ;если файл не найден, то ошибка - PUSH BC ;сохранение номера файла - CALL x165D ;загрузка описателя файла - CALL x1CB0 ;установка нового имени файла - PUSH AF ;сохранение результата проверки имени файла - LD A,(#5CF8) ;в новом имени файла назначен другой дисковод - LD HL,#5CF6 - CP (HL) - JP NZ,x1D1A ;если да, то ошибка - CALL x0405 ;настройка на диск - POP AF ;восстановление результата проверки имени файла - JP Z,x1C50 ;если такой файл уже есть, то ошибка - POP BC ;восстановление номера файла -x0569 CALL x166B ;загрузка сектора с описателем файла и замена описателя - CALL x1E43 ;перезапись сектора - JP x03E1 ;сообщение O.K. - -;Адрес #572. Проверка переменной #5D10. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. - -x0572 LD A,(#5D10) - OR A - RET - -;Адрес #577. Проверка количества стертых файлов. Установите #5D11. Если там 0, то будет сообщение NO FILE, иначе O.K. - -x0577 LD A,(#5D07) ;берем количество стертых файлов - OR A ;оно равно 0? - JP Z,x03D9 ;если да, то NO FILE - JP x03E1 ;иначе O.K. - -;Адрес #581. Запрос на стирание файла. Установите #5CDD и #5CF6, а в регистр C поместите номер файла. При ответе Y файл будет стерт и включится флаг Z, иначе он будет выключен. - -x0581 PUSH BC ;сохранение номера файла - CALL x1D97 ;очистка экрана и открытие потока 0. - LD A,(#5CF6) ;берем номер дисковода - ADD A,"A" ;вычисляем имя дисковода - CALL x3D82 ;печать его - LD A,":" ;печать двоеточия - CALL x3D82 - LD HL,#5CDD ;адрес переменной с именем и расширением файла - CALL x2938 ;печать имени и расширения файла - LD HL,x2820 ;печать FILE EXISTS. OVERWRITE? - CALL x2707 - CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - PUSH AF ;сохранение результата проверки - CALL x1D97 ;очистка экрана - POP AF ;восстановление AF и номера файла - POP BC - RET NZ ;если был ответ N, то возврат - PUSH BC ;сохранение номера файла - CALL x1D97 ;очистка экрана - POP BC ;восстановление номера файла - CALL x0781 ;стирание файла - XOR A ;включение флага Z - RET ;возврат - -;Адрес #5B4. Проверка на существование блока файла с расширением #. Установите #5CDD, #5CE5 и #5CE6. Если блок найден или у файла другое расширение, то включается флаг Z, иначе он будет выключен. - -x05B4 LD A,(#5CE5) ;берем расширение файла - CP "#" ;это "#"? - JR Z,x05BD ;если нет, то - XOR A ;включение флага Z - RET ;и возврат -x05BD LD A,#A ;файл ищем по #A байтам - LD (#5D06),A - CALL x1CB3 ;поиск файла - LD A,9 ;файл ищем по 9 байтам - LD (#5D06),A - RET ;возврат - -;Адрес #5CB. Выполнение команды COPY "*","*". Первую звездочку поместите в #5CDD, вторую - на стек калькулятора и установите #5CF8, #5D23 и #5CCF. - -x05CB LD A,(#5CDD) ;берем первый символ имени файла - CP "*" ;это "*"? - JP NZ,x03D9 ;если нет, то NO FILE - CALL x1DB5 ;снятие строки со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода-приемника - LD A,(HL) ;берем следующий символ строки - CP "*" ;это "*"? - JP NZ,x1D1A ;если нет, то ошибка - LD A,(#5CF6) ;сохранение номера дисковода-приемника - LD (#5CF9),A - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,#FF ;начнем с файла 0 - LD (#5D0D),A -x05F4 LD A,(#5CF8) ;выбор дисковода-источника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,(#5D0D) ;следующий файл - INC A - LD (#5D0D),A - LD C,A - CALL x165D ;чтение его описателя - LD A,(#5CDD) ;берем первый символ его имени - CP 0 ;это конец каталога? - JP Z,x03E1 ;если да, то O.K. - CP 1 ;файл стерт? - JR Z,x05F4 ;если да, то следующий файл - LD HL,#5CE6 ;сохранение части описателя файла - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - CALL x1CB3 ;поиск файла - JR NZ,x0634 ;если не нашли, то копирование файла - CALL x05B4 ;проверка файла с расширением "#" - JR NZ,x0634 ;если копируется другой блок, то копируем его - CALL x0581 ;запрос OVERWRITE? - JR NZ,x05F4 ;если был ответ N, то следующий файл -x0634 CALL x063C ;копирование файла - CALL x1E43 ;перезапись сектора с описателем файла - JR x05F4 ;повтор до конца каталога - -;Адрес #63C. Копирование файла при двух дисководах. Поместите описатель файла в #5CDD и его часть в #5CED. - -x063C CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - CP #80 ;уже есть #80 файлов? - JP Z,x1C45 ;если да, то NO SPACE - -;Ошибка!!! Надо выводить DIRECTORY FULL. - - LD HL,#5CED ;восстановление описателя файла - LD DE,#5CE6 - LD BC,7 - LDIR - LD DE,(#5CEA) ;берем длину файла в секторах - LD D,0 - OR A - LD HL,(#5E0A) ;берем количество свободных секторов на диске - SBC HL,DE ;уменьшаем свободное место - JP C,x1C45 ;если места не хватило, то NO SPACE - LD (#5E0A),HL ;установка нового количества свободных секторов - LD HL,(#5E06) ;берем адрес свободного пространства на диске - LD (#5CEB),HL ;установка адреса файла на диске - PUSH HL ;сохранение его - CALL x072F ;копирование файла - POP HL ;восстановление адреса файла на диске - LD (#5CEB),HL ;установка его - LD HL,(#5CF4) ;берем новый адрес свободного места на диске - LD (#5E06),HL ;установка его - LD HL,#5E09 ;записали 1 файл - INC (HL) - LD C,(HL) ;берем номер записываемого файла - DEC C - LD B,0 - PUSH BC ;сохраняем его - LD DE,9 ;записывать сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - POP BC ;восстановление номера файла - CALL x166B ;установка описателя файла - RET ;возврат - -;Адрес #690. Выполнение команды COPY. Установите #5D11 и #5C3B. - -x0690 LD HL,(#5D11) ;берем адрес второго символа командной строки - INC HL - LD A,(HL) ;берем этот символ - AND #DF ;буква заглавная - CP "S" ;это "S"? - JP Z,x1360 ;если да, то копируем 1 файл на одном дисководе - CP "B" ;это "B"? - JP Z,x152C ;если да, то копирование всего диска на одном дисководе - CALL x1DCD ;прием имен файлов - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;выделение места в памяти - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка старого имени файла - LD A,(#5CF6) ;сохранение номера дисковода - источника - LD (#5CF8),A - JP NZ,x05CB ;если файл не найден, то проверка COPY "*","*" - -;Ошибка!!! COPY "*","*" надо проверять всегда, иначе при наличии на диске файла с именем "*" скопируется только этот файл, а в целом тут должно быть так: -;LD (#5CF8),A -;PUSH AF -;CALL #5CB -;POP AF -;JP NZ,#3D9 -;А в подпрограмме #5CB вместо JP NZ,#3D9 должно быть RET NZ. - - CALL x165D ;чтение описателя файла - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - CALL x1CB0 ;установка нового имени файла - PUSH AF ;сохранение результата проверки - PUSH BC ;и номера файла - LD A,(#5CF6) ;сохранение номера дисковода - приемника - LD (#5CF9),A - LD A,(#5CF8) ;выбор дисковода - источника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,(#5CF9) ;выбор дисковода - приемника - CALL x3DCB - CALL x0405 ;настройка на диск - POP BC ;восстановление номера файла - POP AF ;и результата проверки нового имени файла - JR NZ,x06F3 ;если файл не найден, то копирование файла - CALL x05B4 ;проверка файла с расширением "#" - JR NZ,x06F3 ;если копируется другой блок, то копируем его - CALL x0581 ;запрос OVERWRITE? - JP NZ,x03E1 ;если был ответ N, то O.K. -x06F3 CALL x063C ;копирование файла - CALL x1E43 ;перезапись сектора с описателем файла - LD A,(#5CE5) ;берем расширение файла - CP "#" ;это "#"? - JP NZ,x03E1 ;если нет, то O.K. - LD A,#A ;файл искать по #A байтам - LD (#5D06),A - LD HL,#5CE6 ;следующий блок - INC (HL) - LD A,(#5CF8) ;выбор дисковода - источника - CALL x3DCB - CALL x05B4 ;поиск блока - JP NZ,x03E1 ;если не нашли, то O.K. - CALL x165D ;чтение его описателя - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF9) ;выбор дисковода - приемника - CALL x3DCB - CALL x0405 ;настройка на диск - JR x06F3 ;повтор - -;Адрес #72F. Копирование файла при двух дисководах. Установите -;#5CF1, #5D23, #5CF8, #5CF9, #5CF2, #5CCF и #5CEB. - -x072F LD A,(#5CF1) ;берем количество секторов - OR A ;все скопировали? - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;адрес переменной с длиной рабочей области памяти - SUB (HL) ;области хватит? - POP HL ;восстановление HL - JR NC,x0775 ;если рабочей области не хватит, то копируем часть файла - LD A,(#5CF1) ;копируем весь остаток - LD B,A - XOR A ;скопировали все - LD (#5CF1),A -x0744 PUSH BC ;сохранение количества копируемых сектоpов - LD A,(#5CF8) ;выбор дисковода-источника - CALL x3DCB - POP BC ;восстановление количества копируемых секторов - PUSH BC ;и снова сохранение его - LD HL,(#5CCF) ;берем адрес рабочей области памяти - PUSH HL ;сохраняем его - LD DE,(#5CF2) ;берем адрес части файла на диске-источнике - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CF2),HL ;на диске-источнике - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - POP HL ;восстановление адреса рабочей области памяти - POP BC ;и количества копируемых секторов - LD DE,(#5CEB) ;берем адрес части файла на диске-приемнике - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CEB),HL ;на диске-приемнике - JR x072F ;повтор -x0775 LD (#5CF1),A ;установка оставшегося количества секторов - PUSH HL ;сохранение HL - LD HL,#5D23 ;копируем столько секторов, сколько - LD B,(HL) ;поместится в рабочую область - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JR x0744 ;копирование секторов - -;Адрес #781. Стирание файлов. Вход: установите #5CDD, #5CE5, и произведите поиск файла. Программа устанавливает #5D08 и #5D07. - -x0781 XOR A ;обнуление количества стертых файлов - LD (#5D07),A - JR x07A0 ;стирание файлов - -;Адрес #787. Выполнение команды ERASE. Установите #5D11 и #5C3B. - -x0787 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - XOR A ;пока ничего не стерто - LD (#5D07),A - CALL x292F ;установка и проверка имени стираемого файла - CALL x07A0 ;стирание файла - JP NZ,x0577 ;если стерли файл не в конце каталога, то проверка, сколько файлов стерли - JP x03E1 ;сообщение O.K. - -;Адрес #7A0. Стирание файлов. Вход: установите #5CDD, #5CE5, обнулите #5D07 и произведите поиск файла. Программа устанавливает #5D08 и #5D07. - -x07A0 LD A,(#5CDD) ;сохранение первого символа имени файла - LD (#5D08),A - RET NZ ;если файл не был найден, то возврат - LD HL,#5D07 ;стерт еще один файл - INC (HL) - PUSH BC ;сохранение номера файла - CALL x03FD ;чтение в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - POP BC ;восстановление номера файла - INC C ;этот файл последний? - CP C - JR NZ,x07BC ;если нет, то стирание обычным порядком - DEC A ;на диске теперь на 1 файл меньше - LD (#5E09),A - XOR A ;стираемый файл в конце каталога -x07BC PUSH AF ;сохранение признака метода стирания - JR Z,x07C3 ;если файл не в конце каталога, - LD HL,#5E19 ;то увеличение на 1 количества стертых файлов - INC (HL) -x07C3 PUSH BC ;сохранение номера стираемого файла - CALL x1E43 ;перезапись сектора 8 дорожки 0 - POP BC ;восстановление номера стираемого файла - DEC C - CALL x165D ;загрузка описателя файла - POP AF ;восстановление флага метода стирания - JP Z,x07D2 ;если файл в конце каталога, то первый символ имени будет CHR$ 0 - LD A,1 ;иначе он будет CHR$ 1 -x07D2 LD (#5CDD),A ;установка первого символа имени - PUSH AF ;сохранение метода стирания - CALL x1E40 ;запись описателя файла - LD A,(#5D08) ;восстановление первого символа имени файла - LD (#5CDD),A - POP AF ;восстановление метода стирания - JR Z,x07E7 ;если стерт файл в конце каталога, то реорганизация описателя диска - CALL x1CB3 ;поиск следующего файла с таким именем - JR x07A0 ;стирание его, если он есть -x07E7 CALL x03FD ;чтение сектора 8 дорожки 0 - LD HL,(#5CEB) ;установка нового начала свободного места - LD (#5E06),HL - LD DE,(#5CEA) ;установка нового количества свободных секторов - LD HL,(#5E0A) - LD D,0 - ADD HL,DE - LD (#5E0A),HL - JP x1E43 ;перезапись сектора 8 дорожки 0 и возврат - -;Адрес #800. Позиционирование с быстрой скоростью перемещения головки. Поместите физический номер дорожки в регистр данных, а команду позиционирования - в аккумулятор. - -x0800 and #FC ;позиционировать с быстрой скоростью - jp x3D9A ;выдача команды и ожидание INTRQ - -x0805 db #FF,#FF - -;new Адpес #807. нажатие magic - -x0807 push af - ld a,r - push af - ld a,#04 - push af - inc sp - push bc - ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - ld (#C001),a - cpl - ld (#C002),a - ld a,#12 - jp x0033 - -;new Адрес #826. Вызов функции rst 8 -; a - номер дисковода - -x0826 ex (sp),hl - push af - ld a,#CF ;rst 8 - ld (#5CBF),a - ld a,(hl) - inc hl - ld (#5CC0),a - ld a,#C9 - ld (#5CC1),a - pop af - ex (sp),hl - push hl - ld hl,x3D2F - ex (sp), hl - push hl - ld hl,#5CBF - ex (sp),hl - ret - -;new Адрес #844. - -x0844 ld de,#4000 - ld a,#07 - jp x000B - -;new Адрес #84C. - -x084C rst #20 - dw #1F54 - ret c - rst #20 - dw #1B7B - -;new Адрес #853. - -x0853 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp #01 - jr z,x0867 - jr nc,x086B - bit 7,c - jr nz,x08A3 - jr x086F -x0867 bit 6,c - jr nz,x08A3 -x086B cp #04 - jr nc,x08A3 -x086F ld de,(#5CF4) - ld hl,(#5D00) - ld bc,#0105 - ld a,(#5CFE) - cp #A0 - jr nz,x0881 - inc c -x0881 call x0826 - db #81 - jr c,x088B - pop hl - pop de - ei - ret -x088B call x0A64 - ld b,#40 - cp #02 - jr z,x089C - ld b,#01 - cp #01 - jr z,x089C - ld b,#04 -x089C ld a,b - pop hl - pop de - ei - jp x3F39 -x08A3 ld hl,(#5D00) - ret - -;new Адрес #8A7. - -x08A7 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp #01 - jr z,x08BB - jr nc,x08BF - bit 7,c - jr nz,x08C7 - jr x08C3 -x08BB bit 6,c - jr nz,x08C7 -x08BF cp #04 - jr nc,x08C7 -x08C3 xor a - jp x3E63 -x08C7 jp x3D98 - -;new Адрес #8CA. - -x08CA ld (#5CCA),hl ;для дисководов C и D =#00 - ld a,#FF - ld (#5CD1),a ; - ld hl,#8282 - ret - -x08D6 DISPLAY "Free space at ",$,": ",/D,#901-$," byte(s)" - ds #08FF-$,#00 - ds #0901-$,#FF - -;new Адрес #901. -; a - номер дисковода - -x0901 ld (#5CF6),a ;номер дисковода - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0914 ;если да, то переход - jr nc,x0917 ;если дисковод C или D - bit 7,c ;дисковод A - ret nz ;если реальный дисковод, выход - jr x091A -x0914 bit 6,c - ret nz ;если реальный дисковод, выход -x0917 cp #04 - ret nc ;выход, если дисковод >3 -x091A or #80 - ld c,#28 ;подфункция #28 - call x0826 ;вызов rst 8 - db #81 - ld a,(#5CF6) ;номер дисковода - jr nc,x092D ;нет ошибки - cp #02 - ret c ;ошибка -x092A jp x3EE7 ;ошибка no disk -x092D ld hl,#5D16 - ld c,a - ld a,%00111100 - or c - ld (hl),a - ld a,(#5CF6) ;номер дисковода - ld c,#01 ;подфункция #01 (выбор текущего дисковода) - call x0826 ;вызов rst 8 - db #81 - jr c,x092A ;ошибка no disk - call x3E08 ;выборка времени перемещения головки текущего дисковода - ld (hl),#00 - call x3E11 ;выборка типа дисковода - ld (hl),#83 - ld a,#80 - ld (#5CCD),a ;гтовность дисковода - pop hl - ret - -x0951 DISPLAY "Free space at ",$,": ",/D,#A01-$," byte(s)" - ds #09FF-$,#00 - ds #0A01-$,#FF - -;new Адрес #A01. - -x0A01 ld a,(#5CF6) - push bc - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A16 ;если да, то переход - jr nc,x0A1A ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A2D - jr x0A1E -x0A16 bit 6,c - jr nz,x0A2D ;если реальный дисковод -x0A1A cp #04 - jr nc,x0A2D ;если дисковод >3 -x0A1E pop bc - ld d,c - push bc - ld c,#02 - call x0826 - db #81 - pop bc - jp c,x3EE7 - pop hl - ret -x0A2D pop bc - jp x1FEB - -;new Адрес #A31. - -x0A31 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A45 ;если да, то переход - jr nc,x0A49 ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A4F - jr x0A4D -x0A45 bit 6,c - jr nz,x0A4F -x0A49 cp #04 - jr nc,x0A4F -x0A4D pop hl - ret -x0A4F jp x3EB2 - -;new Адрес #A52. Чтение переменной монитора - -x0A52 push de - push bc - push hl - ld bc,#000D - ld de,#0004 - or a - call x0826 - db #82 - bit 5,a - jr x0A72 - -;new Адрес #A64. Чтение переменной монитора - -x0A64 push de - push bc - push hl - ld bc,#001D - ld de,#0004 - or a - call x0826 - db #82 -x0A72 pop hl - pop bc - pop de - ret - -;new Адрес #A76. - -x0A76 ld a,(#5CF6) - push bc - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A8B ;если да, то переход - jr nc,x0A8F ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A97 - jr x0A93 -x0A8B bit 6,c - jr nz,x0A97 -x0A8F cp #04 - jr nc,x0A97 -x0A93 pop bc - xor a - inc a - ret -x0A97 pop bc - xor a - ret - -x0A9A DISPLAY "Free space at ",$,": ",/D,#B01-$," byte(s)" - ds #0AFF-$,#00 - ds #0B01-$,#FF - -;new Адрес #B01. - -x0B01 call x0A76 - jp z,x1FF6 - pop hl - jp x1F16 - -;new Адрес #B0B. - -x0B0B call x0A76 - ld hl,#5CD7 - ret z - inc hl - ld (hl),#00 - pop hl - ld hl,#5D25 - ld (hl),#00 - ld de,#5D26 - ld bc,#00FF - ldir - ld d,#00 -x0B25 ld e,#00 -x0B27 call x084C - ld hl,#5D25 - ld bc,#0106 - push de - call x0826 - db #81 - jr nc,x0B44 - call x0A64 - ld c,a - ld b,#00 - call x1DA9 - ld hl,#5CD6 - inc (hl) -x0B44 pop de - inc e - bit 4,e - jr z,x0B27 - ld a,#2B - rst #10 -xxx inc d - ld a,d - cp #A0 - jr nz,x0B25 - ret - -;new Адрес #B54. - -x0B54 call x0A76 - jp z,x1FEB - ret - -x0B5B DISPLAY "Free space at ",$,": ",/D,#C01-$," byte(s)" - ds #0BFF-$,#00 - ds #0C01-$,#FF - -;new Адрес #C01. - -x0C01 ld bc,#7FBA - in a,(c) - and %00000100 - jr z,x0C1C - ld bc,#047F -x0C0D in a,(#FF) - and #C0 - jp nz,x3FD1 - inc de - ld a,e - or d - jr nz,x0C0D - djnz x0C0D - ret -x0C1C ret - -;new Адрес #C1D. - -x0C1D ld bc,#7FBA - in a,(c) - and %00000100 - jr z,x0C38 - ld bc,#047F -x0C29 in a,(#FF) - and #C0 - jp nz,x3FEC - inc de - ld a,e - or d - jr nz,x0C29 - djnz x0C29 - ret -x0C38 ret - -x0C39 DISPLAY "Free space at ",$,": ",/D,#FF3-$," byte(s)" - ds #0CFF-$,#00 - ds #0D01-$,#FF - ds #0DFF-$,#00 - ds #0E01-$,#FF - ds #0EFF-$,#00 - ds #0F01-$,#FF - ds #0FF3-$,#00 - -x0FF3 push af - push bc - push de - jp x2A59 - -x0FF9 DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" - ds #FFF-$,#00 - ds #1000-$,#FF - - - DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" - DS #1000-$,#FF - -;Адрес #1000. Текст "Interface one fitted" - -x1000 DB #16,9,5 - DB "Interface one fitted" - DB 0 - -;Адрес #1018. Выполнение команды "*". Установите #5D11 и #5C3B. - -x1018 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x0531 ;снятие имени дисковода со стека калькулятора - LD A,(DE) ;берем первый символ имени - CALL x0524 ;вычисление номера дисковода - LD (#5D19),A ;установка дисковода по умолчанию - CALL x3DCB ;выбор дисковода - JP x03E1 ;сообщение O.K. - -;Адрес #102E. Прием расширения файла. Установите #5C5D и #5CD6. - -x102E LD B,"C" ;расширение C - LD A,(#5CD6) ;расширение принимать? - OR A - JR NZ,x104D ;если нет, то установка расширения файла - CALL x1D8C ;берем текущий символ - CP #AF ;это CODE? - LD B,"C" ;расширение C - JR Z,x104D ;если да, то установка расширения файла - CP #E4 ;это DATA? - LD B,"D" ;расширение D - JR Z,x104D ;если да, то установка расширения файла - CP "#" ;это #? - LD B,"#" ;расширение # - JR Z,x104D ;если да, то установка расширения файла - LD B,"B" ;расширение B -x104D LD HL,#5CE5 ;адрес переменной с расширением файла - LD (HL),B ;установка расширения - RET ;возврат - -;Адрес #1052. Ввод клавиши с ожиданием. - -x1052 DI ;запрет прерываний - PUSH HL ;сохранение регистров - PUSH BC - PUSH DE -x1056 RST #20 ;определение номера нажатой клавиши - DW #028E - LD C,0 ;режим клавиатуры - C или L - JR NZ,x1056 ;если нажата бессмысленная комбинация клавиш, то повтор - RST #20 ;определение кода нажатой клавиши - DW #031E - JR NC,x1056 ;если ничего не нажато, то повтор - DEC D ;режим клавиатуры - C или L - LD E,A ;помещение кода клавиши в регистр E - RST #20 ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT - DW #0333 - POP DE ;восстановление регистров - POP BC - POP HL - AND #DF ;буква будет заглавная - EI ;разрешение прерываний - RET ;возврат - -;Адрес #106E. Вывод цветных полос для заставки. - -x106E LD HL,#58E5 ;адрес линии атрибутов - LD B,#A ;установка атрибутов -x1073 LD (HL),7 - INC HL - DJNZ x1073 - LD (HL),2 - INC HL - LD (HL),#16 - INC HL - LD (HL),#34 - INC HL - LD (HL),#25 - INC HL - LD (HL),#28 - INC HL - LD (HL),7 - LD HL,#40EE ;адрес верхней линии пикселей - LD B,8 ;8 линий пикселей в знакоместе - XOR A ;обнуление аккумулятора -x108F PUSH BC ;сохранение количества линий - SCF ;сдвиг пикселей - RLA - PUSH HL ;сохранение адреса линии пикселей - PUSH AF ;и байта для заполнения - LD B,5 ;в линии 5 байтов -x1096 INC HL ;заполнение линии - LD (HL),A - DJNZ x1096 - POP AF ;восстановление байта для заполнения линии, - POP HL ;адреса линии - POP BC ;и количества линий - LD DE,#100 ;берем адрес следующей линии - ADD HL,DE - DJNZ x108F ;повтор до конца - RET ;возврат - -x10A4 RET - -;Адрес #10A5. Сообщения команды LIST. - -x10A5 DB " Del." -x10AA DB " File(s)" - DB 0 -x10B3 DB "Title:" - DB #A0 -x10BA DB #17,#11 - DB " Disk Drive: " - DB 0 -x10CA DB #17,#10," ",0 -x10CE DB #17,#10," 40 Track S. Side" - DB 0 -x10E2 DB #17,#10," 80 Track S. Side" - DB 0 -x10F6 DB #17,#10," 40 Track D. Side" - DB 0 -x110A DB #17,#10," 80 Track D. Side" - DB 0 -x111E DB #17,#10 - DB " Free Sector " - DB 0 -x112E DB #D,#D - DB " File Name Start Length Line" - DB 0 - -;Адрес #1151. Выделение #222 байтов в рабочей области. Устанавливает #5CCF. - -x1151 LD HL,(#5C61) ;берем адрес рабочей области - LD (#5CCF),HL ;установка адреса пространства - LD BC,#222 ;выделять #222 байтов - JP x1E23 ;выделение области и возврат - -;Адрес #115D. Печать числа из HL с нулями. - -x115D XOR A ;в числе 0 десятков тысяч - LD DE,#2710 -x1161 SBC HL,DE ;вычитание из числа 10000 - JR C,x1168 ;если получилось число меньше 10000, то следующий разряд - INC A ;следующий десяток тысяч - JR x1161 ;повтор -x1168 ADD A,"0" ;печать десятков тысяч - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 тысяч -x116F LD DE,#3E8 -x1172 SBC HL,DE ;вычитание из числа 1000 - JR C,x1179 ;если получилось число меньше 1000, то следующий разряд - INC A ;следующая тысяча - JR x1172 ;повтор -x1179 ADD A,"0" ;печать тысяч - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 сотен - LD DE,#64 -x1183 SBC HL,DE ;вычитание из числа 100 - JR C,x118A ;если получилось число меньше 100, то следующий разряд - INC A ;следующая сотня - JR x1183 ;повтор -x118A ADD A,"0" ;печать сотен - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 десятков - LD DE,#A -x1194 SBC HL,DE ;вычитание из числа 10 - JR C,x119B ;если получилось число меньше 10, то следующий разряд - INC A ;следующий десяток - JR x1194 ;повтор -x119B ADD A,"0" ;печать десятков - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - LD A,L ;печать единиц - ADD A,"0" - CALL x11A8 - RET ;возврат - -;Адрес #11A8. То же, что и #3D82. - -x11A8 PUSH HL ;сохранение HL и DE - PUSH DE - CALL x3D82 ;печать символа - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #11B0. Проверка достижения конца буфера при работе с каталогом. Установите #5CF9 и #5CCC, а в HL поместите текущий адрес буфера. Если конец буфера достигнут, то в буфер загрузится следующий сектор каталога, а в HL будет #5D25. - -x11B0 PUSH HL ;сохранение HL и BC - PUSH BC - LD A,(#5CF9) ;берем номер дисковода из #5CF9 - LD HL,#5CF6 ;берем номер текущего дисковода - CP (HL) ;назначен другой дисковод? - CALL NZ,x3DCB ;если да, то выбор назначенного дисковода - POP BC ;восстановление HL и BC - POP HL - CALL x050C ;проверка достижения конца буфера - LD A,(HL) ;берем первый символ имени файла - OR A ;конец каталога? - JP Z,x01D3 ;если да, то завершение - CP 1 ;файл стерт? - CALL Z,x0507 ;если да, то пропуск файла - RET NZ ;иначе возврат - JR x11B0 ;если файл был пропущен, то повтор - -;Адрес #11CE. Выполнение команды LIST. Установите #5D11 и #5C3B. - -x11CE CALL x042B ;проверка второго символа строки - LD BC,2 ;по умолчанию печатать в поток 2 - LD (#5CDB),BC - JR Z,x1205 ;если второй символ строки ENTER, то вывод каталога - CP "#" ;если второй символ строки "#"? - JR NZ,x11F8 ;если нет, то установка дисковода - LD (#5C5D),HL ;установка CH_ADD - CALL x1E0B ;прием номера потока - CALL x1D8C ;берем текущий символ - CP #D ;это ENTER? - JR Z,x1205 ;если да, то вывод каталога - CP "," ;это ","? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1E2A ;следующий символ - CALL x1DBD ;прием имени дисковода на стек калькулятора - JR x11FB ;установка дисковода -x11F8 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора -x11FB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x1DB5 ;снятие имени дисковода со стека калькулятора - EX DE,HL ;переброска его адреса в HL - CALL x1C81 ;установка дисковода -x1205 CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CF6) ;загрузка имени дисковода в #5CF9 - LD (#5CF9),A - CALL x0405 ;настройка на диск - LD A,(#5CDB) ;берем номер потока - CP 2 ;это 2? - PUSH AF ;сохраняем его - CALL Z,x1D97 ;если да, то очистка экрана - POP AF ;восстановление номера потока - CP #11 ;он больше #10? - JP NC,x1D1A ;если да, то ошибка - CALL x1D84 ;открытие потока - LD A,#FF ;буфер не убирать, память не изменять - LD (#5CF8),A - CALL x1151 ;выделение памяти в рабочей области - LD HL,#5E06 ;начало описателя диска в буфере - LD DE,(#5CCF) ;берем адрес WORKSP - LD BC,#20 ;длина описателя диска - LDIR ;сохранение описателя диска - CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 - LD HL,#5D25 ;адрес буфера - PUSH HL ;сохранение его -x123E LD HL,x10B3 ;адрес сообщения TITLE: - PUSH BC ;сохранение BC - RST #18 ;печать TITLE: - LD HL,(#5CCF) ;берем адрес WORKSP - LD BC,#14 ;#14-й байт - ADD HL,BC - RST #18 ;печать имени диска - LD HL,x10BA ;печать DISC DRIVE: - RST #18 - LD A,(#5CF6) ;берем номер дисковода - ADD A,"A" ;вычисление имени дисковода - CALL x3D82 ;печать его - CALL x3D80 ;перевод строки - LD HL,(#5CCF) ;3-й байт описателя диска - LD BC,3 - ADD HL,BC - LD A,(HL) ;берем количество файлов на диске - LD HL,(#5CCF) ;#13-й байт - LD BC,#13 - ADD HL,BC - SUB (HL) ;вычисление количества нестертых файлов - PUSH HL ;сохранение адреса #13-го байта описателя диска - CALL x1DA3 ;печать количества нестертых файлов - LD HL,x10AA ;печать FILE(S) - RST #18 - LD HL,(#5CCF) ;2-й байт описателя диска - LD BC,2 - ADD HL,BC - LD A,(HL) ;берем тип диска - LD HL,x10CE ;адрес сообщения 40 TRACKS, S.SIDE - CP #19 ;это #19? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x10E2 ;адрес сообщения 80 TRACKS, S.SIDE - CP #18 ;это #18? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x10F6 ;адрес сообщения 40 TRACKS, D.SIDE - CP #17 ;это #17? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x110A ;адpес сообщения 80 TRACKS, D.SIDE -x1292 RST #18 ;печать сообщения - POP HL ;восстановление адреса #13-го байта описателя диска - LD C,(HL) ;берем количество стертых файлов - CALL x1DA4 ;печать его - LD HL,x10A5 ;печать DEL.FILES - RST #18 - LD HL,x111E ;печать FREE SECTORS: - RST #18 - LD HL,(#5CCF) ;4-й байт - LD BC,4 - ADD HL,BC - LD C,(HL) ;берем количество свободных секторов - INC HL - LD B,(HL) - CALL x1DA9 ;печать его - LD HL,x112E ;печать FILE NAME, START, LENGTH, LINE - RST #18 - POP BC ;восстановление BC и текущего адреса в буфеpе - POP HL - LD B,#10 ;печатать информацию о #10 файлах -x12B5 CALL x11B0 ;проверка достижения конца буфера - CALL x3D80 ;перевод строки - PUSH BC ;сохранение количества оставшихся файлов - PUSH HL ;и текущего адреса в буфеpе - CALL x2938 ;печать имени и расширения файла - LD BC,#D ;#D-й байт описателя файла - POP HL ;восстановление текущего адреса в буфере - PUSH HL - ADD HL,BC - LD C,(HL) ;берем размер файла в секторах - PUSH BC ;сохраняем его - LD A,C ;загружаем его в C - LD B,2 ;печатать 2 пробела перед числом - CP #A ;длина файла меньше 10 секторов? - JR C,x12D0 ;если да, то печать пробелов - DEC B ;печатать один пробел -x12D0 CP #64 ;длина файла меньше 100 сектоpов? - JR NC,x12D9 ;если нет, то пробелы не печатать -x12D4 LD A," " ;печать пробелов - RST #10 - DJNZ x12D4 -x12D9 POP BC ;восстановление длины файла в секторах - CALL x1DA9 ;печать ее - LD HL,x10CA ;#10 пробелов - RST #18 - POP HL ;восстановление адреса описателя файла в буфере - PUSH HL ;и снова сохранение его - LD BC,9 ;9-й байт описателя - ADD HL,BC - LD E,(HL) ;берем адрес загрузки файла - INC HL - LD D,(HL) - PUSH HL ;сохранение текущего адреса в описателе файла - EX DE,HL ;переброска адреса загрузки файла в HL - CALL x115D ;печать его - LD A," " ;пробел - CALL x3D82 - POP HL ;восстановление текущего адреса в описателе файла - INC HL ;следующий адрес - LD E,(HL) ;берем длину файла - INC HL - LD D,(HL) - EX DE,HL ;перенос ее в HL - CALL x115D ;печать ее - POP HL ;восстановление адреса описателя файла - PUSH HL ;и снова сохранение его - LD BC,8 ;8-й байт - ADD HL,BC - LD A,(HL) ;берем расширение файла - CP "B" ;это "B"? - CALL Z,x131B ;если да, то печать строки автозапуска - POP HL ;восстановление адреса описателя файла - POP BC ;и счетчика файлов - LD DE,#10 ;адрес следующего описателя файла - ADD HL,DE - DJNZ x12B5 ;повтор до конца - PUSH HL ;сохранение адреса описателя файла - CALL x3D80 ;2 раза перевод строки - CALL x3D80 - JP x123E ;повтор с самого начала - -;Адрес #131B. Печать строки автостарта прогpаммы на бейсике. В HL поместите адрес описателя файла плюс 8 и установите #5CCF. - -x131B LD BC,5 ;берем адрес длины файла в секторах - ADD HL,BC - LD B,(HL) ;берем эту длину - INC HL ;следующий адрес в описателе - LD E,(HL) ;берем адрес файла на диске - INC HL - LD D,(HL) - DEC B ;загружать будем 2 сектоpа - JR Z,x1335 - DEC B - JR Z,x1335 ;если длина файла не больше 2-х секторов, то загрузка секторов - LD A,#10 ;на дорожке #10 секторов -x132C INC E ;следующий сектор - CP E ;конец дорожки? - JR NZ,x1333 ;если да, то - LD E,0 ;следующий сектор 0 - INC D ;и берем следующую дорожку -x1333 DJNZ x132C ;повтор до конца -x1335 LD HL,(#5CCF) ;берем адрес рабочей области - LD BC,#21 ;#21 байт уже занято - ADD HL,BC - LD B,2 ;загружать 2 сектора - PUSH HL ;сохранение адреса загрузки секторов - CALL x1E3D ;загрузка секторов - LD A,#80 ;будем искать конец программы - POP HL ;восстановление адреса секторов в памяти - LD BC,#200 ;длина области - #200 байтов - CPIR ;поиск конца программы - LD A,(HL) ;берем следующий байт - CP #AA ;это #AA? - RET NZ ;если нет, то возврат - INC HL ;берем номер строки автостарта - LD C,(HL) - INC HL - LD B,(HL) - LD A,B ;это 0? - OR C - RET Z ;если да, то возврат - PUSH BC ;сохранение номера строки автостарта - LD A," " ;печать пробела - CALL x3D82 - POP BC ;восстановление номера строки автостарта - CALL x1DA9 ;печать его - RET ;возврат - -;Адрес #1360. Выполнение команды COPY S. Установите #5D11 и #5C3B. - -x1360 CALL x1DC5 ;установка CH_ADD - CALL x1E2A ;следующий символ - CALL x1DBD ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x1375 CALL x1052 ;ввод символа с клавиатуры - CP "Y" ;это "Y"? - JR NZ,x1375 ;если нет, то повтор - CALL x1D9F ;очистка низа экрана - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка имени файла - JP NZ,x03D9 ;если такого файла нет, то ошибка - CALL x13B7 ;копирование файла - LD A,(#5CE5) ;расширение файла #? - CP "#" - JP NZ,x03E1 ;если нет, то O.K. -x1393 LD A,#A ;файл искать по #A символам - LD (#5D06),A - LD HL,#5CE6 ;следующий блок - INC (HL) - CALL x1D97 ;очистка экрана - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x13A5 CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - JR NZ,x13A5 ;если да, то повтор - CALL x1CB3 ;поиск блока - JP NZ,x03E1 ;если не нашли, то O.K. - CALL x13B7 ;копирование блока - JR x1393 ;повтор - -;Адрес #13B7. Копирование файла при одном дисководе. Номер файла поместите в регистр C. - -x13B7 CALL x165D ;чтение описателя файла - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF1) ;установка объема файла в секторах - LD (#5D10),A - CALL x0405 ;настройка на диск - CALL x3E11 ;сохранение режима дисковода - LD (#5CD9),A - LD A,#FF ;первый проход - LD (#5D21),A - -;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. - - CALL x1451 ;копирование файла - LD HL,(#5D1F) ;берем адрес файла на диске - приемнике - LD (#5CEB),HL ;устанавливаем его - LD HL,(#5CF4) ;берем новый адрес свободного места на диске - LD (#5E06),HL ;устанавливаем его - LD HL,#5E09 ;записали 1 файл - INC (HL) - LD C,(HL) ;берем номер файла - DEC C - LD B,0 ;переводим его в двухбайтную форму - PUSH BC ;сохраняем его - LD DE,9 ;записывать сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - POP BC ;восстановление номера файла - CALL x166B ;чтение и замена описателя файла - CALL x1E43 ;запись сектора с описателем - RET ;возврат - -;Адрес #1403. Проверка наличия свободного места на диске-приемнике для команды COPY S. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5D10. В дисководе должен быть диск-приемник. Подпрограмма устанавливает #5CEA, #5CEB и #5D1F. - -x1403 XOR A ;не первый проход - LD (#5D21),A - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CDA),A ;сохраняем его - CALL x1CB3 ;поиск файла - JP Z,x1C50 ;если нашли, то FILE EXISTS - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - CP #80 ;их 128? - JP Z,x2723 ;если да, то DIRECTORY FULL - LD HL,#5CED ;восстановление описателя файла - LD DE,#5CE6 - LD BC,7 - LDIR - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5D10) ;восстановление длины файла в секторах - LD (#5CEA),A - LD DE,(#5CEA) ;перевод ее в двухбайтную форму - LD D,0 - OR A ;сброс флага C - LD HL,(#5E0A) ;уменьшаем свободное место на диске - SBC HL,DE - JP C,x1C45 ;если его не хватило, то NO SPACE - LD (#5E0A),HL ;установка нового количества свободного места на диске - LD HL,(#5E06) ;берем адрес свободного места на диске - LD (#5CEB),HL ;установка адреса файла на диске-приемнике - LD (#5D1F),HL ;сохранение его - -;Боже мой!!! Ну что это такое! Ведь эта переменная - флаг способа вызова TR-DOS. И на этом DOS все работают. Ужас какой-то. - - RET ;возвpат - -;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, -; #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. - -x1451 LD A,(#5CF1) ;все скопировали? - OR A - RET Z ;если да, то возврат - LD A,(#5D21) ;первый проход? - OR A - JR NZ,x146F ;если да, то диск - источник уже в дисководе - CALL x1D97 ;очистка экрана - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x1465 CALL x1052 ;ожидание клавиши "Y" - CP "Y" - JR NZ,x1465 - CALL x1D9F ;очистка низа экрана -x146F LD A,(#5CF1) ;все скопировали? - OR A - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;копируется часть файла - SUB (HL) - POP HL ;восстановление HL - JR NC,x14CB ;если еще не конец, то копируется часть файла - LD A,(#5CF1) ;копируем остаток - LD B,A - XOR A ;скопировали все - LD (#5CF1),A -x1484 PUSH BC ;сохранение количества копируемых секторов - LD (#5CCE),A ;обнуление #5CCE - LD HL,(#5CCF) ;берем адрес рабочего пространства - PUSH HL ;сохраняем его - LD DE,(#5CF2) ;берем адрес копируемого участка диска - CALL x14D8 ;настройка дисковода под диск-источник - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса на диске следующего сектора - LD (#5CF2),HL - CALL x1D97 ;очистка экрана - LD HL,x2785 ;печать INSERT DESTINATION DISC - CALL x2707 -x14A5 CALL x1052 ;ожидание клавиши "Y" - CP "Y" - JR NZ,x14A5 - CALL x1D9F ;очистка низа экрана - LD A,(#5D21) ;первый проход? - OR A - CALL NZ,x1403 ;если да, то проверка наличия места на диске - POP HL ;восстановление адреса рабочего пространства - POP BC ;и количества копируемых секторов - LD DE,(#5CEB) ;берем адрес текущего участка диска - CALL x14E4 ;настройка дисковода под диск-приемник - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса на диске следующего сектора - LD (#5CEB),HL - JP x1451 ;повтор -x14CB LD (#5CF1),A ;установка длины оставшейся части файла - PUSH HL ;сохранение HL - LD HL,#5D23 ;берем длину рабочей области - LD B,(HL) - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JP x1484 ;копирование - -;Адрес #14D8. Помещение значения #5CD9 в переменную режима дисковода. Установите #5CD9. - -x14D8 PUSH HL ;сохранение DE и HL - PUSH DE - CALL x3E11 ;берем адрес переменной с типом дисковода - LD A,(#5CD9) ;берем тип дисковода из #5CD9 - LD (HL),A ;установка типа дисковода - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #14E4. Помещение значения #5CDA в переменную режима дисковода. Установите #5CDA. - -x14E4 PUSH HL ;сохранение DE и HL - PUSH DE - CALL x3E11 ;берем адрес переменной с типом дисковода - LD A,(#5CDA) ;берем тип дисковода из #5CD9 - LD (HL),A ;установка типа дисковода - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #14F0. Проверка наличия места на диске-приемнике для команды COPY B. Установите #5CDF и поместите в дисковод диск-приемник. Устанавливает #5CDA, #5CE7, #5CDD и обнуляет #5D21. - -x14F0 XOR A ;обнуление #5D21 - LD (#5D21),A - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CDA),A ;сохраняем его - LD A,(#5E08) ;сохраняем тип диска - LD (#5CE7),A - LD HL,#280 ;вычисление количества секторов на - CP #19 ;диске-приемнике - JR Z,x151F - LD HL,#500 - CP #18 - JR Z,x151F - CP #17 - JR Z,x151F - LD HL,#A00 - CP #16 - JR Z,x151F - JP x1D1A ;если в качестве типа диска стоит неопределенное значение, то *ERROR* - -;Лучше DISC ERROR. - -x151F LD (#5CDD),HL ;сохранение количества секторов на диске-приемнике - LD BC,(#5CDF) ;берем количество копируемых секторов - SBC HL,BC ;места хватит? - JP C,x1C45 ;если нет, то NO SPACE - RET ;возврат - -;Адрес #152C. Выполнение команды COPY B. Установите #5C3B. - -x152C CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x153E CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - JR NZ,x153E ;если да, то повтор - CALL x1D9F ;очистка низа экрана - LD A,#FF ;первый проход - LD (#5D21),A - -;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. - - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CD9),A ;сохраняем его - LD A,(#5E08) ;берем тип диска - CP #19 ;диск 40-дорожечный односторонний? - LD HL,#280 ;всего на диске #280 секторов - JR Z,x1575 ;если да, то копирование - LD HL,#500 ;всего на диске #500 секторов - CP #18 ;диск 80-дорожечный односторонний? - JR Z,x1575 ;если да, то копирование - CP #17 ;диск 40-дорожечный двухсторонний? - JR Z,x1575 ;если да, то копирование - LD HL,#A00 ;всего на диске #A00 секторов - CP #16 ;диск 80-дорожечный двухсторонний? - JR Z,x1575 ;если да, то копирование - JP x1D1A ;иначе *ERROR* - -;Внимание!!! Лучше выдавать сообщение DISC ERROR. - -x1575 LD BC,(#5E0A) ;берем количество свободных секторов - SBC HL,BC ;вычисляем количество занятых секторов - LD (#5CE5),HL ;установка количества секторов - LD (#5CDF),HL - LD HL,0 ;скопировано 0 секторов - LD (#5CE1),HL - LD (#5CE3),HL - CALL x15B8 ;копирование секторов - CALL x0405 ;настройка на диск - LD A,(#5CE7) ;установка нового типа диска-приемника - LD (#5E08),A - LD HL,(#5CDD) ;берем общее число секторов на диске-приемнике - LD BC,(#5CDF) ;берем число скопированных секторов - SBC HL,BC ;вычисление числа свободных секторов на диске - приемнике - LD (#5E0A),HL ;установка его - CALL x14E4 ;настройка дисковода под диск-приемник - LD DE,9 ;записывали сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - JP x03E1 ;O.K. - -;Адрес #15B2. Проверка переменной #5CE5. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в HL. - -x15B2 LD HL,(#5CE5) ;берем содержимое переменной #5CE5 - LD A,H ;проверка его на 0 - OR L - RET ;возврат - -;Адрес #15B8. Копирование секторов. Установите #5CD9, #5CCF, #5CE5, #5D21, #5D23 и #5CDB - -x15B8 CALL x15B2 ;все скопировали? - RET Z ;если да, то возврат - LD A,(#5D21) ;первый проход? - OR A - JR NZ,x15DB ;если да, то диск-источник уже в дисководе - CALL x1D97 - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x15D1 CALL x1052 ;ожидание нажатия "Y" - CP "Y" - JR NZ,x15D1 - CALL x1D9F ;очистка низа экрана - -x15DB CALL x15B2 ;все скопировали? - RET Z ;если да, то возврат - PUSH BC ;сохранение BC и количества секторов - PUSH HL - LD HL,#5D23 ;берем длину рабочей области в секторах - LD C,(HL) - LD B,0 - POP HL ;восстановление количества секторов - SBC HL,BC ;уменьшение количества секторов - POP BC ;восстановление BC - JP NC,x1644 ;если рабочего пространства мало, то это еще не конец - LD BC,(#5CE5) ;берем оставшееся количество секторов - LD HL,0 ;все скопировали - LD (#5CE5),HL -x15F8 PUSH BC ;сохранение количества секторов - LD HL,(#5CCF) ;берем адрес рабочей области - PUSH HL ;сохраняем его - CALL x14D8 ;настройка дисковода под диск-источник - LD DE,(#5CE1) ;берем адрес группы секторов на диске-источнике - LD B,C - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CE1),HL ;на диске-источнике - CALL x1D97 ;очистка экрана - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x2785 ;печать INSERT DESTINATION DISC - CALL x2707 -x161D CALL x1052 ;ожидание нажатия "Y" - CP "Y" - JR NZ,x161D - CALL x1D9F ;очистка низа экрана - LD A,(#5D21) ;первый проход? - OR A - CALL NZ,x14F0 ;если да, то проверка наличия места на диске - POP HL ;восстановление адреса рабочей области - POP BC ;и количества копируемых секторов - LD DE,(#5CE3) ;берем адрес группы секторов на диске-приемнике - LD B,C - CALL x14E4 ;настройка дисковода под диск-приемник - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CE3),HL ;на диске-приемнике - JP x15B8 ;повтор -x1644 LD (#5CE5),HL ;установка оставшегося количества секторов - PUSH HL ;сохранение его - LD HL,#5D23 ;берем длину рабочей области - LD C,(HL) ;столько секторов будем копировать - LD B,0 - POP HL ;восстановление оставшегося количества секторов - XOR A ;обнуление аккумулятора - JP x15F8 ;копирование - -;Адрес #1653. Проверка состояния файла. Номер файла задайте в регистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A будет первый символ имени файла. - -x1653 CALL x165D ;чтение описателя файла - LD A,(#5CDD) ;берем первый символ имени файла - CP 1 ;проверка состояния файла - RET ;возврат - -;Адрес #165C. Чтение описателя файла. На входе в регистр A поместите номер файла. Описатель будет загружен по адресу #5CE5. Используется также с адресов: -;#165D - то же, что и #165C, но номер файла в регистре C. -;#165E - то же, что и #17E9, но сохраняет номер файла. - -x165C LD C,A ;перенос номера файла в рег. C -x165D XOR A ;переносим описатель из буфера в память -x165E PUSH BC ;сохранение номера файла - CALL x17E9 ;чтение сектора с описателем и перенос описателя - POP BC ;восстановление номера файла - RET ;возврат - -;Адрес #1664. запись информации о файле. Вход: описатель расположить по адресу #5CDD, а в аккумулятор поместить номер файла. - -x1664 LD C,A ;перенос в C номера файла - CALL x166B ;чтение сектора и замена описателя файла в нем - JP x1E43 ;перезапись сектора - -;Адрес #166B. Чтение в буфер сектора с описателем файла и замена описателя. Поместите описатель по адресу #5CDD. - -x166B LD A,#FF ;описатель перемещать из переменных в буфер - JR x165E ;то же, что и #17E9, но с сохранением BC - -;Адрес #166F. Резервирование места в памяти. Устанавливает #5CCF и #5D23. - -x166F LD A,#FF ;WORKSP использовалась - LD (#5D0E),A - CALL x1680 ;вычисление размера доступной памяти - LD HL,(#5C61) ;установка адреса рабочей области - LD (#5CCF),HL - JP x1E23 ;выделение места в памяти и возврат - -;Адрес #1680. Вычисление количества свободной памяти в секторах. Размер свободной памяти в байтах будет в BC, а в секторах ? в #5D23. - -x1680 RST #20 ;берем количество свободной памяти в байтах - DW #1F1A - LD HL,#FFFF - SBC HL,BC - LD A,H ;свободно меньше 16 секторов? - CP #10 - JR NC,x168F ;если да, то - LD A,#11 ;будем выделять 16 секторов -x168F DEC A ;1 сектор на всякий случай - LD (#5D23),A ;установка размера свободной памяти в секторах - LD B,A ;установка размера свободной памяти в байтах - LD C,0 - RET ;возврат - -;Адрес #1697. Помещает HL в #5CD7 и #5CDB и прибавляет #5CEA (1 байт) к #5CD9 (2 байта). - -x1697 LD (#5CD7),HL ;установка #5CD7 и #5CD9 - LD (#5CDB),HL - LD DE,(#5CEA) ;сложение #5CEA и #5CD9 - LD HL,(#5CD9) - LD D,0 - ADD HL,DE - LD (#5CD9),HL - RET ;возврат - -;Адрес #16AB. Выполнение команды MOVE. Установите #5C3B. - -x16AB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - CALL x0405 ;настройка на диск - LD A,(#5E19) ;стертые файлы на диске есть? - OR A - JP Z,x03E1 ;если нет, то сообщение O.K. - LD HL,0 ;пока освободилось 0 секторов - LD (#5CD9),HL - LD C,#FF ;начнем с файла номер 0 -x16C3 INC C ;следующий файл - CALL x1653 ;он стерт? - JR NZ,x16C3 ;если нет, то следующий файл - LD A,C ;сохранение номера стираемого файла - LD (#5CD4),A - LD HL,(#5CEB) ;берем адрес стираемого файла на диске - LD (#5CD5),HL ;сохраняем его - CALL x1697 ;приращение счетчика освободившихся секторов -x16D6 INC C ;следующий файл - CALL x1653 ;он стерт? - JR Z,x16D6 ;если да, то следующий файл - CP 0 ;это конец каталога? - JP NZ,x1710 ;если нет, то меняем файлы местами - LD A,(#5CD4) ;берем номер стираемого файла - LD C,A -x16E5 INC C ;следующий файл - CALL x1653 ;это конец каталога? - CP 0 - JR Z,x176C ;если да, то реорганизация описателя диска - XOR A ;конец каталога - LD (#5CDD),A - CALL x1E40 ;запись описателя файла - CALL x1697 ;приращение счетчика освободившихся секторов - JR x16E5 ;повтор - -x16F9 call x1701 - ret nz - jr x170D - -x16FF db #FF,#FF - -x1701 in a,(#1F) - and #02 - cp b - ret nz - inc de - ld a,e - or d - jr nz,x1701 - ret - -x170D jp x3EE7 - - -x1710 LD A,(#5CEA) ;берем размер перемещаемого файла в секторах - LD (#5CD3),A ;сохраняем его - LD (#5CD1),A - LD HL,(#5CEB) ;берем адрес перемещаемого файла на диске - LD (#5CD5),HL ;сохраняем его - PUSH BC ;сохранение номера перемещаемого файла - CALL x17A5 ;перемещение файла - POP BC ;восстановление номера перемещаемого файла - LD HL,(#5CF4) ;перемещение продолжится с этого места - LD (#5CD5),HL - LD (#5CEB),HL - XOR A ;размер стертого файла - 0 секторов - LD (#5CEA),A - LD A,(#5CDD) ;сохранение первого символа имени файла - PUSH AF - LD A,1 ;файл стерт - LD (#5CDD),A - CALL x1E40 ;запись описателя стертого файла - POP AF ;восстановление первого символа имени файла - LD (#5CDD),A - LD A,(#5CD4) ;берем номер стертого файла - LD C,A - LD HL,(#5CDB) ;установка нового адреса перемещенного файла - LD (#5CEB),HL ;на диске - LD A,(#5CD1) ;восстановление размера перемещенного файла - LD (#5CEA),A ;на диске - CALL x1E40 ;запись описателя перемещенного файла - LD A,(#5CD4) ;берем номер файла после перемещенного - INC A - LD C,A - CALL x165D ;чтение его описателя - LD HL,(#5CD5) ;установка его нового адреса на диске - LD (#5CEB),HL - CALL x1E40 ;запись его описателя - LD A,(#5CD4) ;берем номер перемещенного файла - LD C,A - JP x16C3 ;повтор - -;Адpес #176C. Реорганизация описателя диска. Установите #5CCF, #5CD9 и #5CD5. - -x176C LD HL,(#5CCF) ;берем адрес рабочего пространства - LD BC,#1000 ;сокращаем его на #1000 байтов - CALL x1E2E - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD HL,(#5E0A) ;увеличение количества свободного места на - LD DE,(#5CD9) ;диске - ADD HL,DE - LD (#5E0A),HL - LD A,(#5E09) ;уменьшение количества файлов на диске на - LD HL,#5E19 ;число стертых - SUB (HL) - LD (#5E09),A - LD (HL),0 ;на диске больше нет стертых файлов - LD HL,(#5CD5) ;установка нового адреса свободного места на - LD (#5E06),HL ;диске - PUSH AF ;сохранение количества файлов на диске - CALL x1E43 ;запись сектора 8 дорожки 0 - POP AF ;восстановление количества файлов на диске - LD C,A - CALL x165D ;чтение описателя файла за последним - XOR A ;это конец каталога - LD (#5CDD),A - JP x0569 ;запись описателя файла и завершение - -;Адрес #17A5. Перемещение файла. Установите #5CD3, #5D23, #5CCF, #5CD5 и #5CD7. - -x17A5 LD A,(#5CD3) ;перемещен весь файл? - OR A - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;буфера хватит на остаток? - SUB (HL) - POP HL ;восстановление HL - JR NC,x17DD ;если буфера не хватит, то перемещаем часть файла - LD A,(#5CD3) ;берем количество оставшихся секторов - LD B,A - XOR A ;переместили все - LD (#5CD3),A -x17BA PUSH BC ;сохранение количества перемещаемых секторов - LD HL,(#5CCF) ;берем адрес рабочей области - PUSH HL ;сохранение его - LD DE,(#5CD5) ;берем адрес части перемещаемого файла на старом месте - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей части файла - LD (#5CD5),HL - POP HL ;восстановление адреса рабочей области - POP BC ;и количества перемещаемых секторов - LD DE,(#5CD7) ;берем адрес части перемещаемого файла на новом месте - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей части файла - LD (#5CD7),HL - JR x17A5 ;повтор -x17DD LD (#5CD3),A ;установка количества оставшихся секторов - PUSH HL ;сохранение HL - LD HL,#5D23 ;берем длину рабочей области в секторах - LD B,(HL) - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JR x17BA ;перемещение секторов - -;Адрес #17E9. Загрузка в буфер сектора с описателем файла и перенос описателя. В регистре C - номер файла, в A - направление перемещения (0 - в переменные, иначе - в прочитанный сектор). - -x17E9 PUSH AF ;сохранение направления перемещения - LD HL,#5CCC ;первый сектор каталога - 0 - LD (HL),0 - LD A,C ;определение номера сектора с описателем файла -x17F0 SUB #10 - JR C,x17F7 - INC (HL) - JR x17F0 -x17F7 ADD A,#10 ;берем номер описателя в секторе - LD C,A - PUSH BC ;сохраним его - CALL x03EC ;загрузка в буфер сектора с описателем - POP BC ;восстановление номера описателя в секторе - POP AF ;и направление перемещения - CALL x1CA4 ;определение адреса описателя файла в буфере - LD DE,#5CDD ;берем второй адрес для LDIR - LD BC,#10 ;берем длину описателя - OR A ;установка направления перемещения - JR Z,x180D - EX DE,HL -x180D LDIR ;перенос описателя файла - RET ;возврат - -;Адрес #1810. Выполнение команды VERIFY. Установите #5D11 и #5C3B. Используется также с адресов: -;#1815 - выполнение команды LOAD. Установите #5D11 и #5C3B; -;#1818 - выполнение команды LOAD, PEEK или POKE; Установите #5D11, #5C3B и #5D10. - -x1810 LD A,#FF ;верификация файла - LD (#5CF9),A -x1815 CALL x1852 ;обнуление #5D10 -x1818 CALL x1836 ;обработка параметров и загрузка файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,#FF ;выполняется команда LOAD - LD (#5D10),A - LD A,(#5CF9) ;выполняется VERIFY? - CP #FF - JP Z,x03E1 ;если да, то O.K. - LD A,(#5CE5) ;расширение файла B? - CP "B" - -;Внимание!!! Если была операция с одним сектором файла, то надо выходить независимо от расширения. - - JP Z,x012A ;если да, то обработка строки автостарта - JP x03E1 ;иначе O.K. - -;Адрес #1836. Обработка параметров для команды LOAD и загрузка файла. Установите #5D11, #5C3B, #5CF9 и #5D10. - -x1836 CALL x187A ;принятие параметров - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x18AB ;проверка параметров - JP x1921 ;загрузка файла и возврат - -;Адрес #1842. Обработка параметров для команды LOAD...CODE. Установите #5C5D на расширение файла. На выходе устанавливает #5CD6, #5CD9 и #5CDB. - -x1842 LD HL,(#5C5D) ;следующий символ строки ENTER? - INC HL - LD A,(HL) - CP #D - RET Z ;если да, то возврат - LD A,1 ;задан адрес загрузки - LD (#5CD6),A - CALL x1DEB ;прием одного или двух чисел -x1852 XOR A ;обнуление #5D10 - LD (#5D10),A - RET ;возврат - -x1857 CALL x102E ;прием расширения файла - LD A,"B" ;это "B"? - CP B - JR NZ,x1866 ;если да, то декремент CH_ADD, так как для - LD HL,(#5C5D) ;программы на бейсике расширение не - DEC HL ;указывается - LD (#5C5D),HL -x1866 CALL x1DEB ;прием чисел - LD HL,(#5CD9) ;установка адреса загрузки/записи сектора - LD (#5CD7),HL - LD HL,(#5CDB) ;установка номера сектора - LD (#5CD9),HL - XOR A ;обнуление #5CD6 - LD (#5CD6),A - RET ;возврат - -;Адрес #187A. Принятие параметров для команды LOAD. Вход: установите #5D11 и #5C3B. Выход: устанавливает #5CD2, #5CD7, #5CD9, #5CE5 и #5CD6 и читает описатель файла. - -x187A CALL x042B ;второй символ командной строки ENTER? - JP Z,x027B ;если да, то вход в командный процессор с вводом команды RUN "boot" - -;Ошибка!!! это некорректно, так как при ошибке вы попадете в командный процессор TR-DOS, а не вернетесь в бейсик. - - CALL x1DDF ;помещение имени файла на стек калькулятора - CALL x0572 ;операция со всем файлом? - CALL NZ,x1857 ;если нет, то прием расширения и двух чисел - CALL x1D8C ;берем текущий символ строки - CP #AF ;это CODE? - CALL Z,x1842 ;если да, то прием чисел, если они есть - CP #E4 ;это DATA? - PUSH AF ;сохранение результата проверки - CALL x0572 ;операция со всем файлом? - CALL Z,x102E ;если да, то прием расширения - POP AF ;восстановление результата проверки - CALL Z,x1BFC ;если символ DATA, то прием имени массива - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x292F ;установка имени файла и поиск файла - -;Адрес #18A4. Чтение описателя файла, если он был найден. Установите #5CDD, #5CE5 и флаг Z: при Z=1 происходит чтение описателя, иначе ошибка NO FILE. - -x18A4 JP NZ,x03D9 ;если файл не найден, то NO FILE - CALL x165D ;чтение описателя файла - RET ;возврат - -;Адрес #18AB. Обработка параметров для подпрограммы загрузки файла. На входе установите #5CD6, #5CD9 и #5CDB ; считайте описатель нужного вам файла. На выходе в #5CDB будет длина файла для загрузки, в #5CD6 0, если длина менялась, иначе 3. В HL будет адрес загрузки файла, в DE - его адрес на диске, в B - количество секторов для загрузки. При загрузке массива или программы на бейсике будет произведена подготовка памяти к загрузке. - -x18AB LD A,(#5CD6) ;берем флаг загрузки - OR A ;начало и длину брать из каталога? - LD HL,(#5CE6) ;берем начало файла из описателя - JR Z,x18B7 ;если параметры берем не из каталога, то - LD HL,(#5CD9) ;берем начальный адрес, назначенный нами -x18B7 LD DE,(#5CEB) ;берем адрес файла на диске - CP 3 ;все параметры назначены пользователем? - LD A,(#5CEA) ;берем размер файла в секторах - PUSH DE ;сохранение адреса файла на диске - LD DE,(#5CE8) ;берем длину файла из описателя - JR NZ,x18CB ;если нужно брать ее не оттуда, то берем - LD DE,(#5CDB) ;длину загрузки, назначенную нами -x18CB LD B,A ;сохранение размера файла в секторах - LD (#5CDB),DE ;установка длины файла для загрузки - LD A,(#5CE5) ;расширение файла C? - CP "C" - LD A,B ;восстановление длины файла в секторах - JR NZ,x18FD ;если расширение не C, то длину не менять - LD A,B ;если длина файла в байтах соответствует его - CP D ;размеру в секторах, то длина загрузки не меняется - JR Z,x18F6 - DEC A - CP D - LD A,B - JR Z,x18F6 - LD A,(#5CD6) ;длина назначена пользователем? - CP 3 - LD A,B ;восстановление размера файла в секторах - JR Z,x18F6 ;если мы сами назначили длину загрузки, то она не меняется - XOR A ;грузить только полностью заполненные сектора - LD (#5CD6),A - LD D,B ;вычисление длины файла в байтах из его длины - LD E,0 ;в секторах - LD (#5CDB),DE ;установка новой длины - JR x18F9 -x18F6 CALL x191B ;файл загружать весь -x18F9 LD A,B ;восстановление размера файла в секторах - CALL x1EAC ;вычисление количества секторов для загрузки -x18FD LD B,A ;сохранение его - LD A,(#5CE5) ;расширение файла C? - CP "C" - POP DE ;восстановление адреса файла на диске - RET Z ;если расширение файла C, то возврат - -;Ошибка!!! Если выполняется чтение или запись сектора файла, то здесь должен быть возврат. Из-за этой ошибки нельзя прочитать или записать сектор файла с расширением B или D. - - PUSH DE ;сохранение адреса файла на диске - CP "B" ;расширение B? - PUSH AF ;сохранение расширения файла - CALL Z,x1A01 ;если расширение B, то подготовка к загрузке программы на бейсике - POP AF ;восстановление расширения - CP "D" ;расширение D? - CALL Z,x1A4C ;если да, то подготовка к загрузке массива - CALL x191B ;длина загрузки не менялась - LD A,(#5CDC) ;берем количество секторов для загрузки - LD B,A - POP DE ;восстановление адреса файла на диске - RET ;возврат - -;Адрес #191B. Помещает число 3 по адресу #5CD6. - -x191B LD A,3 - LD (#5CD6),A - RET - -;Адрес #1921. Загрузка/верификация файла, а также загрузка/запись сектора файла. Вход: установите #5CF9, #5D10, #5CD7, #5CDB, в HL - адрес загрузки, в DE - адрес файла на диске, в B - количество секторов для загрузки. - -x1921 CALL x0572 ;выполняется загрузка или верификация? - JR Z,x192D ;если да, то выполнение операций со всем файлом - PUSH AF ;сохранение флага операции - CALL x1A94 ;вычисление адреса сектора на диске - POP AF ;восстановление флага операции - CP #FF ;чтение сектора файла? -x192D PUSH AF - CALL Z,x195C ;если да, то чтение сектора или операция с файлом - POP AF - JR Z,x1937 ;и завершение загрузки или верификации - JP x1E4D ;иначе запись сектора и возврат -x1937 LD A,(#5CD6) ;загружать весь файл? - CP 3 - -;Не нужно этого делать!!! Лучше так: -;LD A,(#5D10) -;OR A -;и PEEK будет работать правильно. Не будет грузится мусор после загруженного сектора. ведь если в #5CD6 находится 0, то младший байт длины всегда равен 0 и #1946 не будет работать. - - CALL Z,x1946 ;если да, то загрузка или верификация конца файла - LD HL,(#5C59) ;отметка конца программы на бейсике - DEC HL - LD (HL),#80 - RET ;возврат - -;Адрес #1946. Загрузка или верификация конца файла. Установите #5CF4, #5CDB и #5CF9. - -x1946 LD A,(#5CF9) ;верификация? - CP #FF - JP NZ,x2FDE ;если нет, то загрузка конца файла - LD A,(#5CDB) ;файл занимает сектора без остатка? - OR A - RET Z ;если да, то возврат - LD C,A ;берем длину остатка - LD B,1 ;1 сектор - LD DE,(#5CF4) ;текущее место диска - JR x196A ;верификация конца файла и возврат - -;Адрес #195C. Загрузка/верификация файла, а также загрузка сектора файла. Установите #5CF9 ,в DE поместите адрес файла на диске, в HL - адрес файла в памяти, в B - длину файла в секторах. Используется также с адреса #196A для верификации заданного количества байтов (все для #195C, кроме #5CF9 плюс в B ? количество байтов). - -x195C LD A,(#5CF9) ;верификация? - CP #FF - JP NZ,x1E3D ;если нет, то загрузка секторов и возврат - LD (#5CF4),DE ;запомним адрес файла на диске - LD C,0 ;в секторе #100 байтов -x196A LD A,B ;верифицируем 0 секторов? - OR A - RET Z ;если да, то возврат - LD (#5CD7),HL ;сохранение адреса файла в памяти - LD (#5CD9),DE ;сохранение адреса файла на диске -x1974 PUSH BC ;сохранение количества секторов - LD B,1 ;загружать 1 сектор - LD DE,(#5CD9) ;с текущего места диска - LD HL,#5D25 ;в буфер - CALL x1E3D ;загрузка сектора - LD HL,(#5CF4) ;адрес следующего сектора на диске - LD (#5CD9),HL - POP BC ;восстановление количества секторов - LD HL,(#5CD7) ;берем адрес файла в памяти - LD DE,#5D25 ;адрес сектора в буфере -x198E LD A,(DE) ;сравнение их - CP (HL) - JR NZ,x199D ;если несовпадение, то VERIFY ERROR - INC HL ;следующие байты - INC DE - DEC C - JR NZ,x198E ;повтор до конца - LD (#5CD7),HL ;установка следующего адреса - DJNZ x1974 ;повтор до конца - RET ;возврат -x199D LD HL,x276B ;адрес сообщения VERIFY ERROR - LD A,#D ;код ошибки - #D - JP x1C4A ;обработка ошибок - -;Адрес #19A5. Выполнение команды PEEK. Установите #5D11 и #5C3B. - -x19A5 LD A,#FF ;код функции PEEK - JR x19AB ;выполнение команды - -;Адрес #19A9. Выполнение команды POKE. Установите #5D11 и #5C3B. Используется также с адреса #19AB (выполнение команды LOAD, PEEK или POKE; Установите #5D11 и #5C3B, а в аккумулятор поместите код функции). - -x19A9 LD A,#EE ;код функции POKE -x19AB LD (#5D10),A ;установка кода функции - JP x1818 ;выполнение команды - -;Адрес #19B1. Выполнение команды MERGE. Установите #5D11 и #5C3B. - -x19B1 LD A,#FF ;использовалась рабочая область - LD (#5D1F),A - -;Ошибка!!! Флаг состояния рабочей области находится по адресу #5D15. - - CALL x187A ;обработка параметров - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CE5) ;расширение файла B? - CP "B" - JP NZ,x1D1A ;если нет, то ошибка - LD BC,(#5CE6) ;установка длины файла для загрузки - LD (#5CDB),BC - PUSH BC ;сохранение ее - INC BC ;оставим место для байта #80 - RST #20 ;выделение места в рабочей области - DW #0030 - LD (HL),#80 ;маркер конца программы - EX DE,HL ;переброска адреса загрузки в HL - POP DE ;снятие со стека длины файла - PUSH HL ;сохранение адреса загрузки - LD DE,(#5CEB) ;берем адрес файла на диске - CALL x191B ;загружать весь файл - LD A,(#5CDC) ;берем длину файла в блоках - LD B,A - CALL x1852 ;операция со всем файлом - CALL x1921 ;загрузка файла - POP HL ;восстанавливаем адрес загрузки - LD DE,(#5C53) ;берем адрес программы на бейсике - RST #20 ;объединение программ - DW #08D2 - JP x03E1 ;сообщение O.K. - -;Адрес #19F2. Проверка места в памяти для резервирования нового пространства вместо старого. В HL - старая длина, в DE - новая. Используется также с адреса: -;#19FD (проверка наличия пространства в памяти; длина пространства должна быть в DE). - -x19F2 EX DE,HL - SCF ;вычисление разности длин - SBC HL,DE - RET C ;если новая длина меньше старой, то возврат - LD DE,#A ;должно остаться еще #A байтов - ADD HL,DE - LD B,H ;переброска разности длин в BC - LD C,L -x19FD RST #20 ;проверка наличия пространства в памяти - DW #1F05 - RET ;возврат - -;Адрес #1A01. Подготовка к загрузке программы на бейсике. - -x1A01 LD DE,(#5C53) ;берем адрес начала программы на бейсике - LD HL,(#5C59) ;берем адрес конца программы на бейсике - DEC HL - PUSH HL ;сохранение начала и конца программы - PUSH DE - SBC HL,DE ;вычисление длины программы на бейсике - LD DE,(#5CE6) ;берем длину программы с переменными - PUSH DE ;сохраняем ее - PUSH HL ;сохранение длины старой программы - LD HL,0 ;идет верификация? - LD A,(#5CF9) - CP #FF - JR Z,x1A20 ;если да, то длину не меняем - LD HL,5 ;иначе увеличим ее на 5 байтов -x1A20 ADD HL,DE - LD (#5CDB),HL ;установка длины загрузки - POP HL ;восстановление длины старой программы - LD A,(#5CF9) ;верификация? - CP #FF - JR NZ,x1A31 ;если нет, то подготовка памяти - POP DE ;снятие регистров со стека - POP DE - POP HL - JR x1A48 ;возврат -x1A31 CALL x19F2 ;проверка наличия места для программы - POP BC ;восстановление длины программы с переменными - POP DE ;восстановление начала программы - POP HL ;восстановление конца программы - PUSH BC ;сохранение длины программы - RST #20 ;стирание старой программы - DW #19E5 - POP BC ;восстановление длины программы - CALL x1E32 ;резервирование места для новой программы - INC HL ;установка переменной VARS - LD BC,(#5CE8) - ADD HL,BC - LD (#5C4B),HL -x1A48 LD HL,(#5C53) ;берем адрес загрузки программы - RET ;возврат - -;Адрес #1A4C. Подготовка памяти к загрузке массива. Установите #5CE8, #5CD7, #5CD9 и #5CF9. - -x1A4C LD DE,(#5CE8) ;загружать весь файл - LD (#5CDB),DE - LD HL,(#5CD7) ;берем адрес массива в памяти - LD A,(#5CF9) ;верификация? - CP #FF - RET Z ;если да, то возврат - LD HL,(#5CD9) ;берем адрес загрузки файла - PUSH HL ;сохраняем его -x1A61 CALL x19F2 ;проверка наличия места для массива - POP HL ;восстановление адреса загрузки файла - LD A,H ;он равен 0? - OR L - JR Z,x1A79 ;если да, то старый массив не убираем - LD HL,(#5CD7) ;берем начало старого массива - DEC HL - DEC HL - DEC HL - LD BC,(#5CD9) ;берем его длину - INC BC - INC BC - INC BC - CALL x1E2E ;стирание старого массива -x1A79 LD HL,(#5C59) ;берем начало области переменных - DEC HL - LD BC,(#5CE8) ;берем длину файла - PUSH BC ;сохраняем ее - INC BC - INC BC - INC BC - CALL x1E32 ;резервирование места для нового массива - INC HL ;установка имени массива - LD A,(#5CD2) - LD (HL),A - INC HL ;восстановление и установка длины массива - POP DE - LD (HL),E - INC HL - LD (HL),D - INC HL ;берем адрес тела массива - RET ;возврат - -;Адрес #1A94. Вычисление адреса сектора файла на диске по его номеру в файле. Вход: установите #5CD7 и #5CD9 и поместите в регистр B длину файла в секторах, а в DE - адрес файла на диске. Выход: в DE будет адрес сектора на диске, а в B помещается 1. - -x1A94 LD A,(#5CD9) ;берем номер сектора в файле - LD C,B - LD B,A - LD A,C - CP B ;он меньше, чем количество секторов в файле? - JR C,x1AB6 ;если нет, то ошибка - -;Внимание, ошибка!!! Вы не сможете загрузить последний сектор файла, т.к. его номер равен количеству секторов в файле. - - LD A,B ;он равен 0? - OR A - JP Z,x1D1A ;если да, то синтаксическая ошибка - DEC B ;он был равен 1? - JR Z,x1AB0 ;если да, то его адресом будет адрес файла - LD A,#10 ;на дорожке 16 секторов -x1AA7 INC E ;вычисление адреса сектора на диске - CP E - JR NZ,x1AAE - LD E,0 - INC D -x1AAE DJNZ x1AA7 -x1AB0 LD B,1 ;загружать надо 1 сектор - LD HL,(#5CD7) ;берем адрес загрузки сектора - RET ;возврат -x1AB6 LD HL,x29ED ;адрес сообщения REC.O/F - LD A,5 ;код ошибки - 5 - JP x1C4A ;обработка ошибки - -;Адрес #1ABE. Проверка наличия файла и свободного места в каталоге. Имя файла поместите на стек калькулятора. Используется также с адреса #1AC4 (проверка наличия свободного места в каталоге диска). - -x1ABE CALL x292F ;установка имени и поиск файла - JP Z,x1C50 ;если нашли, то FILE EXISTS -x1AC4 CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;на диске 128 файлов? - CP #80 - JP Z,x2723 ;если да, то сообщение DIRECTORY FULL - RET ;иначе возврат - -;Адрес #1AD0. Выполнение команды SAVE. Установите #5C3B и #5D11. Используется также с адресов: -;#1B27 - запись программы на бейсике. Установите #5CDD и #5CE5. -;#1B53 - запись файла. Установите #5CDD, #5CE5, #5CD7, #5CD9 и #5CDB. - -x1AD0 CALL x1852 ;обнуление #5D10 - LD HL,0 ;автостарт бейсика не производить - LD (#5CD1),HL - CALL x1DDF ;помещение имени файла на стек калькулятора - CALL x1D8C ;берем текущий символ - CP #AF ;это CODE? - JR Z,x1B39 ;если да, то прием начала и длины - CP #CA ;это LINE? - JR NZ,x1AF8 ;если нет, то проверка остальных расширений - CALL x1E0B ;прием строки автостарта бейсика - CALL x1D75 ;если проверка на синтаксис, то возврат - LD HL,(#5CDB) ;установка строки автостарта бейсика - LD (#5CD1),HL - LD HL,#5CE5 - JR x1B1F ;переход на запись бейсика -x1AF8 CP #AA ;текущий символ SCREEN$? - JR NZ,x1B0D ;если нет, то проверка расширения DATA - LD HL,#4000 ;начало файла - #4000 - LD (#5CD7),HL - LD HL,#1B00 ;его длина - #1B00 байтов - LD (#5CD9),HL - LD (#5CDB),HL - JR x1B48 ;запись файла с расширением C -x1B0D CALL x1D75 ;если проверка на синтаксис, то возврат - CALL x1D8C ;берем текущий символ - LD HL,#5CE5 - CP #E4 ;это DATA? - JR Z,x1B2C ;если да, то запись массива - CP #D ;это ENTER? - JP NZ,x1D1A ;если нет, то ошибка -x1B1F LD (HL),"B" ;расширение B - CALL x1ABE ;проверка наличия такого файла и свободного места в каталоге - CALL x1E1C ;удаление из командной строки пятибайтных чисел -x1B27 CALL x1BDE ;установка начала и длины файла - JR x1B53 ;запись файла -x1B2C LD (HL),"D" ;расширение D - CALL x1ABE ;проверка наличия файла и места в каталоге - CALL x1C0F ;установка начала и длины файла - JR NC,x1B53 ;если все в порядке, то запись файла - JP C,x1D1A ;иначе ошибка -x1B39 CALL x1DE5 ;принятие начала и длины файла - LD HL,(#5CD9) ;установка начала файла - LD (#5CD7),HL - LD HL,(#5CDB) ;установка длины файла - LD (#5CD9),HL -x1B48 CALL x1D75 ;если проверка на синтаксис, то возврат - LD A,"C" ;расширение C - LD (#5CE5),A - CALL x1ABE ;проверка наличия файла и места в каталоге -x1B53 CALL x1B59 ;запись файла - JP x0569 ;запись информации о нем - -;Адрес #1B59. Запись файла. Установите #5CD1, #5CD7, #5CD9 и #5CDB, а в буфер загрузите сектор 8 дорожки 0. - -x1B59 LD HL,(#5CD7) ;установка начала файла - LD (#5CE6),HL - EX DE,HL ;переброска его в DE - LD HL,(#5CD9) ;берем длину файла - LD A,L ;она равна 0? - OR H - JP Z,x1D1A ;если да, то ошибка - LD A,L ;вычисление длины файла в секторах - OR A - JR Z,x1B6D - INC H -x1B6D LD A,H ;установка длины файла в секторах - LD (#5CEA),A - LD E,A ;вычисление нового количества свободных секторов - LD D,0 - LD HL,(#5E0A) - SBC HL,DE - JP C,x1C45 ;если на диске нет места, то ошибка -x1B7B PUSH HL ;сохранение нового количества свободных секторов - LD HL,(#5C59) ;добавление к программе на бейсике байта #AA - LD (HL),#AA - INC HL - LD DE,(#5CD1) ;и номера строки автостарта - LD (HL),E - INC HL - LD (HL),D - LD HL,(#5CDB) ;установка длины файла - LD (#5CE8),HL - LD HL,(#5E06) ;установка адреса файла на диске - LD (#5CEB),HL - EX DE,HL ;переброска его в DE - LD HL,(#5CE6) ;берем начало файла - LD A,(#5CEA) ;берем его длину в секторах - LD B,A - CALL x1E4D ;запись файла - LD HL,(#5CF4) ;берем адрес свободного пространства диска - PUSH HL ;сохраняем его - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - POP HL ;восстановление адреса свободного места на диске - LD (#5E06),HL ;установка его - POP HL ;восстановление количества свободных секторов - LD (#5E0A),HL ;установка его - LD HL,#5E09 ;берем номер файла - LD A,(HL) - LD (#5D1E),A ;установка его - INC (HL) ;записали еще 1 файл - PUSH HL ;сохранение адреса с кол-вом файлов на диске - CALL x1E43 ;перезапись сектора 8 дорожки 0 - POP HL ;восстановление адреса с кол-вом файлов - LD C,(HL) ;берем номер записанного файла - DEC C - LD A,(#5CE5) ;расширение файла B? - CP "B" - CALL Z,x1BC8 ;если да, то установка длины программы без переменных - RET ;возврат - -;Адрес #1BC8. Установка длины программы на бейсике без переменных. Длину с переменными программа помещает в #5CE6, длину без переменных - в #5CE8. - -x1BC8 LD HL,(#5C59) ;вычисление длины программы с переменными - LD DE,(#5C53) - SCF - SBC HL,DE - LD (#5CE6),HL ;установка ее - LD HL,(#5C4B) ;вычисление длины только программы - SBC HL,DE - LD (#5CE8),HL ;установка ее - RET ;возврат - -;Адрес #1BDE. Установка начала и длины файла для записи программы на бейсике. - -x1BDE LD HL,(#5C4B) ;вычисление длины программы с переменными - LD DE,(#5C53) - SBC HL,DE - LD (#5CDB),HL ;установка длины файла для каталога - LD HL,(#5C53) ;установка начала файла - LD (#5CD7),HL - LD HL,(#5C59) ;вычисление длины файла с параметрами автозапуска - INC HL - INC HL - INC HL - SBC HL,DE - LD (#5CD9),HL ;установка действительной длины файла - RET ;возврат - -;Адрес #1BFC. Прием имени массива для команды LOAD...DATA. Вход: установите #5C5D на расширение файла и установите #5CF9. Выход: устанавливает #5CD2, #5CD7, #5CD9 и #5CDB. Используется также с адреса #1C0F (то же, что и #1C1B, но с обработкой ошибок). - -x1BFC CALL x1C1B ;поиск массива - RET NC ;если массив найден, то возврат - LD HL,0 ;старого массива нет - LD (#5CD9),HL - LD A,(#5CF9) ;идет загрузка? - CP #FF - RET NZ ;если да, то возврат - JP x1C13 ;ошибка -x1C0F CALL x1C1B ;поиск массива - RET NC ;если массив найден, то возврат -x1C13 LD A,#E ;код ошибки - #E - LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND - JP x1C4A ;обработка ошибок - -;Адрес #1C1B. Поиск массива без обработки ошибок. Будут установлены #5CD2, #5CD7, #5CD9 и #5CDB. При ошибке флаг C будет установлен, иначе сброшен. - -x1C1B CALL x1E2A ;берем следующий символ - CALL x1D9B ;поиск массива - SET 7,C ;установка бита 7 в его имени - LD A,C ;установка его имени - LD (#5CD2),A - JR NC,x1C2B ;если массив найден, то установка его параметров -x1C29 SCF ;была ошибка - RET ;возврат -x1C2B JR NZ,x1C29 ;если флаг Z сброшен, то ошибка - INC HL ;берем длину массива - LD E,(HL) ;установка длины массива - INC HL - LD D,(HL) - INC HL - LD (#5CD7),HL ;установка адреса тела массива - LD (#5CDB),DE ;установка длины массива - LD (#5CD9),DE - CALL x1E2A ;следующий символ - CP ")" ;это ")"? - JR NZ,x1C2B ;если нет, то ошибка - RET ;возврат - -;Адрес #1C45. Обработка ошибки NO SPACE. Используется также с адреса #1C4A (обработка ошибок; в A - код ошибки, в HL - адрес сообщения). - -x1C45 LD HL,x29BB ;адрес сообщения NO SPACE - LD A,3 ;код ошибки - 3 -x1C4A CALL x03C3 ;если надо, то печать сообщения - JP x01D3 ;завершение - -;Адрес #1C50. Обработка ошибки FILE EXISTS. - -x1C50 LD HL,x29C5 ;адрес сообщения FILE EXISTS - LD A,2 ;код ошибки - 2 - JR x1C4A ;обработка ошибок - -;Адрес #1C57. Установка имени файла. Установите #5C5D на имя файла. Будет выбран дисковод и установлена переменная #5CDD. - -x1C57 LD HL,#5CDD ;адрес переменной с именем файла - LD B,8 ;ее длина - 8 байтов -x1C5C LD (HL)," " ;очистка ее - INC HL - DJNZ x1C5C - CALL x0531 ;снятие строки со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода - LD A,C ;имя файла - пустая строка? - OR A - -;Ошибка в программе!!! Здесь должно быть OR B. - - JP Z,x1D1A ;если да, то ошибка - CP 9 ;в имени файла больше 8 символов - JR C,x1C73 ;если да, то обрезаем его - LD C,8 - -;Внимание!!! Это будет работать неправильно при длине имени файла больше #FF символов. - -x1C73 LD A,(HL) ;берем первый символ имени файла - CP " " ;его код меньше #20? - JP C,x1D1A ;если да, то ошибка - LD DE,#5CDD ;адрес переменной с именем файла - PUSH BC ;сохранение длины имени - LDIR ;установка имени - POP BC ;восстановление длины имени - RET ;возврат - -;Адрес #1C81. Установка дисковода для операции с файлом. В HL поместите начало имени файла в ASCII представлении, а в BC ? его длину. HL установится на начало имени без дисковода, а в BC будет его длина. - -x1C81 INC HL ;берем адрес следующего символа имени - LD A,(HL) ;берем этот символ - CP ":" ;это двоеточие? - JR NZ,x1C98 ;если нет, то активизация дисковода по умолчанию - DEC HL ;берем адрес имени дисковода - LD A,(HL) ;берем имя дисковода - CALL x0524 ;преобразование имени дисковода в его номер - PUSH BC ;сохранение длины имени файла - PUSH HL ;и адреса имени дисковода - CALL x3DCB ;выбор дисковода - POP HL ;восстановление адреса имени дисковода - POP BC ;и длины имени файла - DEC BC ;отсекли 2 символа - DEC BC - INC HL ;берем адрес имени файла без дисковода - INC HL - RET ;возврат -x1C98 DEC HL ;берем адрес имени файла - LD A,(#5D19) ;берем дисковод по умолчанию - PUSH BC ;сохранение длины и адреса имени файла - PUSH HL - CALL x3DCB ;выбор дисковода - POP HL ;восстановление длины и адреса имени файла - POP BC - RET ;возврат - -;Адрес #1CA4. Определение адреса описателя файла в буфере по его номеру в секторе. В C должен быть номер описателя в секторе. На выходе в HL будет его адрес. - -x1CA4 LD L,C ;перевод номера описателя файла в двухбайтную - LD H,0 ;форму - ADD HL,HL ;умножение его на #10 - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,#5D25 ;адресуемся от начала буфера - ADD HL,BC - RET ;возврат - -;Адрес #1CB0. Установка и проверка имени файла. Имя файла должно быть помещено на стек калькулятора. Выход: если файл с таким именем есть, то будет установлен флаг Z, а в рег. C и в #5D1E будет его номер, а если такого файла нет, то флаг Z сбросится. Используется также с адреса: -;#1CB3 (поиск файла, установите #5CDD и #5CE5, выход как и из #1CB0). - -x1CB0 CALL x1C57 ;установка имени файла -x1CB3 CALL x03E8 ;начнем с сектора 0 - LD B,#80 ;всего 128 файлов - LD C,0 ;начнем с нулевого описателя в секторе -x1CBA PUSH BC ;сохраним номер файла и счетчик - CALL x1CA4 ;определим начало описателя в буфере - CALL x050C ;проверка и обработка достижения конца буфера - POP BC ;восстановление номера описателя в секторе и - PUSH BC ;счетчика файлов без изменения стека - LD A,C ;просмотрен весь сектор? - CP #10 - JR NZ,x1CCD ;если да, то - POP BC ;снятие номера описателя и счетчика со стека - LD C,0 ;нулевой описатель в секторе - JR x1CBA ;повтор проверки -x1CCD LD DE,#5CDD ;берем адрес части описателя для проверки - LD A,(#5D06) ;берем длину этой части - LD B,A - XOR A ;конец каталога? - CP (HL) - JR NZ,x1CDB ;если нет, то переход на проверку описателя - POP BC ;снятие номера описателя и счетчика со стека - JR x1CE4 ;выход с флагом NZ -x1CDB CALL x2713 ;сравнение частей описателей - POP BC ;восстановление номера описателя и счетчика - JR Z,x1CE7 ;если части описателей совпали, то на выход - INC C ;следующий описатель - DJNZ x1CBA ;повтор до конца -x1CE4 OR #FF ;выключение флага Z - RET ;возврат -x1CE7 LD A,#80 ;определение номера файла - SUB B - LD C,A - LD (#5D1E),A ;помещение его в #5D1E - XOR A ;сброс флага Z - RET Z ;возврат - -;Адрес #1CF0. Поиск файла. Часть описателя, подлежащую проверке, установите по адресу #5CDD и установите #5D06. Если файл не найден, то будет сброшен флаг Z и в #5D0F будет #FF, а если найден, то включится флаг Z, а номер файла будет в рег. C и по адресам #5D0F и #5D1E. - -x1CF0 CALL x1CB3 ;поиск файла - LD HL,#5D0F - LD (HL),C ;загрузка регистра C в #5D0F - RET Z ;если файл найден, то возврат - LD (HL),#FF ;помещаем в #5D0F #FF - RET ;возврат - -;Адpес #1CFB. Выполнение команды RETURN. Установите #5C3B, #5D1C и #5D13. - -x1CFB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x20E5 ;изменение памяти - RES 3,(IY+1) ;установка режима ввода "K" - CALL x0232 ;восстановление старого ERR_SP - LD SP,(#5D1C) ;восстановление стека - LD HL,(#5C3D) ;берем адрес перед адресом из ERR_SP - DEC HL - LD A,#12 ;там находится #12? - CP (HL) - JR NZ,x1D19 ;если нет, то возврат - DEC HL ;установка ERR_SP на адрес ниже - LD (#5C3D),HL -x1D19 RET ;возврат - -;Адрес #1D1A. Обработка синтаксической ошибки. Установите #5C3A, #5D0E, #5D15, и все для подпрограммы #1D3. Используется также с адреса: -;#1D29 (обработка ошибок; в A - код ошибки, в HL ? адрес сообщения). - -x1D1A BIT 7,(IY+0) ;код ошибки бейсика уже назначен? - JR Z,x1D25 ;если нет, то установка ошибки - LD A,#B ;NONSENCE IN BASIC - LD (#5C3A),A -x1D25 INC A ;получение кода ошибки DOS - LD HL,x29B2 ;адрес сообщения ERROR -x1D29 CALL x03C3 ;печать сообщения, если можно - JP x01D3 ;завершение - -;Адрес #1D2F. Обработка ошибки, поступившей из пзу бейсика без очистки стека. Установите #5C3A. - -x1D2F LD A,(#5C3A) ;берем код ошибки бейсика - LD HL,x27CA ;адрес сообщения *BREAK* - CP #14 ;BREAK INTO PROGRAM? - JR Z,x1D29 ;если да, то печать сообщения - CP #C ;BREAK - CONT REPEATS? - JR Z,x1D29 ;если да, то печать сообщения - LD HL,x27D2 ;адрес сообщения OUT OF RAM - CP 3 ;OUT OF MEMORY? - JR Z,x1D29 ;если да, то печать сообщения - LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND - CP 1 ;VARIABLE NOT FOUND? - JR Z,x1D29 ;если да, то печать сообщения - JR x1D1A ;иначе сообщение *ERROR* - -;Адрес #1D4D. Выполнение команды RUN. Установите #5D11 и #5C3B. - -x1D4D CALL x1852 ;выполнять загрузку файла - CALL x1836 ;обработка параметров и загрузка файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD HL,(#5CE6) ;берем адрес загрузки файла по умолчанию - -;Ошибка!!! Ведь файл могли загрузить и по другому адресу. В подпрограмме #18AB надо сохранять в #5D20 действительный адрес загрузки файла, а здесь восстанавливать его. - - LD A,(#5CE5) ;расширение файла B? - CP "B" - JP Z,x012A ;если да, то запуск программы на бейсике - PUSH HL ;запуск программы в кодах - RET - -;Боже!!! Ну кто так делает!!! Во-первых, адрес программы при запуске должен быть в BC; во-вторых, надо совсем выйти из TR-DOS, иначе программа спятит при вызове #3D13; в третьих, куда программа будет возвращаться?; в четвертых... В общем, надо так (после CALL #1D75): -; LD A,(#5CE5) -; CP "D" -; JP Z,#1D1A -; CP "B" -; JP Z,#12A -; LD HL,START -; LD (#5D1A),HL -; JP #1D3 -; -;START CALL #232 -; LD BC,(#5D20) -; PUSH BC -; RET - -;Адрес #1D63. Очистка рабочей области памяти. - -x1D63 LD HL,#5D0E ;рабочую область очищать? - LD A,(HL) - CP #FF - LD (HL),0 ;рабочая область очищена - RET NZ ;если рабочая область очищена, то возврат - RST #20 ;очистка рабочей области - DW #16BF - RET ;возврат - -;Адрес #1D70. Проверка, идет ли проверка строки на синтаксис или выполнение команды. Если идет выполнение, то флаг Z будет сброшен, иначе установлен. - -x1D70 BIT 7,(IY+1) - RET - -;Адрес #1D75. Если идет проверка на синтаксис, то возврат из программы, вызвавшей эту подпрограмму. Установите #5C3B. - -x1D75 CALL x1D70 ;проверка, что делается - RET NZ ;если идет выполнение, то возврат - POP HL ;снятие адреса возврата в вашу программу - RET ;возврат по следующему адресу - -;Адрес #1D7B. Помещение числа на стек калькулятора. Установите #5C5D на символ перед числом. Если строка проверяется на синтаксис, то будет установлен флаг Z, а при выполнении он сброшен. - -x1D7B CALL x1E2A ;берем следующий символ строки - CALL x1DC1 ;помещение числа на стек калькулятора - JR x1D70 ;проверка, идет выполнение или проверка и возврат - -;Адрес #1D83. Открытие потока 0. Используется также с адреса #1D84 (открытие потока; номер в регистре A). - -x1D83 XOR A ;номер потока - 0 -x1D84 RST #20 ;открытие потока - DW #1601 - RET ;возврат - -;Адрес #1D88. Открытие потока 2. - -x1D88 LD A,2 ;номер потока - 2 - JR x1D84 ;открытие потока - -;Адрес #1D8C. Выборка текущего символа строки. Поместите его адрес в #5C5D. - -x1D8C RST #20 - DW #0018 - RET - -;Адрес #1D90. Ввод команды. - -x1D90 CALL x1D83 ;открытие потока 0 - RST #20 ;редактирование командной строки - DW #0F2C - RET ;возврат - -;Адрес #1D97. Очистка экрана и открытие потока 0. - -x1D97 RST #20 - DW #0D6B - RET - -;Адрес #1D9B. Поиск массива. Установите #5C5D на имя массива. Если массив найден, то в HL будет его адрес. - -x1D9B RST #20 - DW #28B2 - RET - -;Адpес #1D9F. Очистка низа экрана. - -x1D9F RST #20 - DW #0D6E - RET - -;Адрес #1DA3. Печать числа из регистра A. Используется также с адресов: -;#1DA4 (печать числа из регистра C), -;#1DA9 (печать числа из регистра BC). - -x1DA3 LD C,A ;переброска числа в C -x1DA4 LD B,0 ;перевод числа в двухбайтную форму - JP x1DA9 ;странная команда! -x1DA9 PUSH BC ;сохранение числа - CALL x20F1 ;изменение памяти - POP BC ;восстановление числа - RST #20 ;печать числа - DW #1A1B - CALL x20F1 ;восстановление памяти - RET ;возврат - -;Адрес #1DB5. Снятие строки со стека калькулятора. В DE будет адрес строки, в BC - ее длина. - -x1DB5 RST #20 - DW #2BF1 - RET - -x1DB9 RST #20 - DW #1E99 - RET - -;Адрес #1DBD. Помещение строки на стек калькулятора. Установите #5C5D на начало строки. - -x1DBD RST #20 - DW #1C8C - RET - -;Адрес #1DC1. Помещение числа из BC на стек калькулятора. - -x1DC1 RST #20 - DW #1C82 - RET - -;Адрес #1DC5. Установка CH_ADD на второй символ строки. Установите #5D11. - -x1DC5 LD HL,(#5D11) ;берем адрес строки команды - INC HL ;берем адрес ее второго символа - LD (#5C5D),HL ;помещаем его в CH_ADD - RET ;возврат - -;Адрес #1DCD. Принятие 2-х строк на стек калькулятора. Поместите в #5D11 адрес первой строки. - -x1DCD CALL x1DDF ;прием первой строки на стек калькулятора -x1DD0 CALL x1D8C ;берем текущий символ - CP "," ;это запятая? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1E2A ;следующий символ - CALL x1DBD ;прием второй строки на стек калькулятора - RET ;возврат - -;Адрес #1DDF. Установка CH_ADD и помещение строки на стек калькулятора. Установите #5D11. - -x1DDF CALL x1DC5 ;установка CH_ADD - JP x1DBD ;помещение строки на стек калькулятора - -;Адрес #1DE5. Принятие одного или двух чисел после символа CODE. Первое число будет в #5CD9, второе - в #5CDB. Если было одно число, то оно будет в обеих ячейках. Если принято 2 числа, то в #5CD6 будет 3. На входе установите #5C5D и #5C3B. Используется также с адреса: -;#1E0B (принятие числа; установите #5C5D и #5C3B; число будет в #5CDB, а в #5CD6 будет 3). - -x1DE5 CALL x1D8C ;берем текущий символ строки - CP #AF ;это CODE? - RET NZ ;если нет, то возврат -x1DEB CALL x1D7B ;принятие числа на стек калькулятора - JR Z,x1DFB ;если идет проверка на синтаксис, то дальнейшая проверка - CALL x1DB9 ;снятие числа со стека калькулятора - LD (#5CD9),BC ;установка первого числа - LD (#5CDB),BC -x1DFB CALL x1D8C ;берем текущий символ - CP "," ;это запятая? - JR Z,x1E0B ;если да, то принятие второго числа - CP #D ;это ENTER? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1D75 ;если строка проверяется на синтаксис, то возврат - RET ;возврат -x1E0B CALL x1D7B ;прием второго числа на стек калькулятора - RET Z ;если проверка на синтаксис, то возврат - CALL x1DB9 ;снятие числа со стека калькулятора - LD (#5CDB),BC ;помещение его в #5CDB - LD A,3 ;приняли 2 числа - LD (#5CD6),A - RET ;возврат - -;Адрес #1E1C. Удаление из командной стpоки пятибайтных чисел - -x1E1C LD HL,(#5D11) ;берем адрес строки команды - RST #20 ;удаление из нее пятибайтных чисел - DW #11A7 - RET ;возврат - -;Адрес #1E23. Выделение пространства в рабочей области. В BC поместите длину требуемого пространства. - -x1E23 LD HL,(#5C61) ;загрузка HL из #5C61 - RST #20 ;выделение пространства - DW #0030 - RET ;возврат - -;Адрес #1E2A. Выборка следующего символа строки. Установите #5C5D. - -x1E2A RST #20 - DW #0020 - RET - -;Адрес #1E2E. Удаление области памяти. В HL поместите начало области, в BC - длину. - -x1E2E RST #20 - DW #19E8 - RET - -x1E32 RST #20 - DW #1655 - RET - -;Адрес #1E36. Загрузка регистра дорожки. Установите #5CD1. При выходе по ошибке в #5D17 помещается #FF. Можно использовать с адреса: -;#1E3A для прямого вывода в порт #3F. - -x1E36 CALL x0A31 ;new определение номера дорожки, на которой стоит головка - LD A,H ;установка регистра дорожки -x1E3A OUT (#3F),A - RET ;возврат - -;Адрес #1E3D. Загрузка секторов. Вход: в HL - адрес загрузки, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. - -x1E3D XOR A ;признак загрузки - JR x1E64 ;переход к подпрограмме загрузки/записи секторов - -;Адрес #1E40. Запись информации о файле. На входе в C должен быть номер файла. Используется также с адресов: -;#1E43 - запись сектора из буфера. Вход: в #5CF4 установите номер сектора+1, а в #5CF5 - номер дорожки. -;#1E4D - запись секторов. В HL - адрес, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. -;#1E64 - загрузка/запись секторов. Предварительные установки как и для предыдущей подпрограммы плюс в A установите 0 для загрузки или что-нибудь другое для записи. - -x1E40 CALL x166B ;чтение сектора с описателем файла и замена описателя -x1E43 LD DE,(#5CF4) ;берем номер сектора для записи - DEC DE - LD B,1 ;записывать 1 сектор - LD HL,#5D25 ;записывать будем из буфера -x1E4D PUSH HL ;сохраним адрес секторов на диске и в памяти - PUSH DE - CALL x3E11 ;берем тип дисковода - BIT 7,(HL) ;он 40-дорожечный? - JR Z,x1E60 ;если да, то записывать можно - BIT 0,(HL) ;используем 40 дорожек на 80-дорожечном? - JR NZ,x1E60 ;если нет, то записывать можно - LD HL,x29D8 ;адрес сообщения READ ONLY - JP x1D29 ;переход на обработку ошибок - -;Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки. - -x1E60 POP DE ;восстановление адресов секторов - POP HL -x1E62 LD A,#FF ;признак записи -x1E64 LD (#5CCE),A ;установка признака операции -x1E67 LD (#5CF4),DE ;установка адреса секторов на диске - PUSH BC ;сохранение количества секторов - PUSH HL ;и адреса загрузки / записи - CALL x1E36 ;чтение индексной области дорожки - POP HL ;восстановление адреса загрузки / записи - POP BC ;и количества секторов - XOR A ;количество секторов равно 0? - OR B - RET Z ;если да, то возврат -x1E75 PUSH BC ;сохраняем адрес и кол-во секторов - PUSH HL - CALL x3F06 ;установка адреса загрузки / записи секторов - LD A,(#5CF4) ;установка номера сектора - CALL x3F02 - LD A,(#5CF5) ;позиционирование головки на дорожку - CALL x3E63 - LD A,(#5CCE) ;берем флаг операции - OR A ;загрузка? - PUSH AF - CALL Z,x3F0E ;если да, то загрузка сектора - POP AF - CALL NZ,x3F0A ;иначе запись сектора - POP HL ;берем адрес следующего сектора - LD DE,#100 - ADD HL,DE - PUSH HL ;сохраняем его - LD A,#10 ;на дорожке 16 секторов - LD HL,#5CF4 - INC (HL) ;следующий сектор - CP (HL) ;конец дорожки? - JR NZ,x1EA7 ;если да, то номер следующего сектора 0 - LD (HL),0 - LD HL,#5CF5 ;и берем следующую дорожку - INC (HL) -x1EA7 POP HL ;восстановление адреса следующего сектора - POP BC ;и количества секторов - DJNZ x1E75 ;если не все, то повтор - RET ;возврат - -;Адрес #1EAC. Вычисление количества полных секторов файла из его длины в байтах. В A должно быть количество секторов файла, а в DE - длина загружаемой части файла. - -x1EAC PUSH HL ;сохранение HL - LD H,A ;берем полную длину файла - LD L,0 - PUSH HL ;сохраняем ее - SBC HL,DE ;она меньше длины загрузки? - CALL C,x1EBC ;если да, то загружать весь файл - POP HL ;восстановление полной длины файла - LD A,H ;вычисление количества полных секторов из полной длины файла - POP HL ;восстановление HL - RET C ;если полная длина файла больше длины загрузки, - LD A,D ;то количество полных секторов берем из длины загрузки - RET ;возврат - -;Адрес #1EBC. Обнуление #5CD6 и установка флага C. - -x1EBC XOR A - LD (#5CD6),A - SCF - RET - -;Адрес #1EC2. Выполнение команды FORMAT. Установите #5D11 и #5C3B. Используется также с адреса #1EDD (повторение форматирования; установите #5CDD). - -x1EC2 LD HL,#FFFF - LD (#5CD7),HL ;дорожки не проверять - LD (#5CD9),HL ;форматировать одну сторону диска - LD (#5CD1),HL ;ошибку при чтении адресного маркера игнорировать - CALL x042B ;следующий символ ENTER? - JP Z,x1D1A ;если да, то ошибка - CALL x1DDF ;прием имени диска на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x1C57 ;установка имени диска -x1EDD CALL x3E11 ;берем тип дисковода - AND #80 ;дисковод 40-дорожечный? - LD A,#28 ;форматировать 40 дорожек - JR Z,x1EE8 ;если дисковод 80-дорожечный, - LD A,#50 ;то форматировать 80 дорожек -x1EE8 LD (#5CD7),A ;установка количества дорожек - CALL x08A7 ;new восстановление - CALL x0B01 ;new выбор нижней стороны диска - CALL x3EA0 ;задержка в 3135098 тактов - LD E,1 ;форматирование дорожки с номером 1 - CALL x1FFD - CALL x1FEB ;выбор верхней стороны диска - LD E,0 ;форматирование дорожки с номером 0 - CALL x1FFD - LD A,(#5CDD) ;форматировать только одну сторону диска - CP "$" - JR Z,x1F1B ;если да, то форматирование диска - CALL x1FF6 ;выбор нижней стороны диска - CALL x3EA0 ;задержка в 3135098 тактов - CALL x3EB5 ;чтение адресного маркера - LD A,H ;номер дорожки - 1? - CP 1 - JR NZ,x1F1B ;если нет, то форматирование диска -x1F16 LD A,#80 ;форматировать обе стороны диска - LD (#5CDA),A -x1F1B CALL x20BD ;форматирование диска - LD HL,#5D25 ;адрес начала буфера - LD (HL),0 ;очистка первого байта - LD DE,#5D26 ;адрес второго байта буфера - LD BC,#FF ;осталось очистить #FF байтов - LDIR ;очистка буфера - LD BC,#5CD7 ;адрес переменной с количеством дорожек - LD DE,#5CDA ;адрес переменной с количеством сторон - LD A,(BC) ;форматировали 80 дорожек? - CP #50 - JR Z,x1F49 ;если да, то диск 80-дорожечный - LD A,(DE) ;форматировали 2 стоpоны? - CP #80 - JR Z,x1F42 ;если да, то диск 40-дорожечный двухстоpонний - LD A,#19 ;диск 40-дорожечный односторонний - LD HL,#270 ;свободно #270 сектора - JR x1F55 ;создание описателя диска -x1F42 LD A,#17 ;диск 40-дорожечный двухсторонний -x1F44 LD HL,#4F0 ;свободно #4F0 сектора - JR x1F55 ;создание описателя диска -x1F49 LD A,(DE) ;форматировали 2 стороны? - CP #80 - LD A,#18 ;если нет, то диск 80-дорожечный односторонний - JR NZ,x1F44 - LD A,#16 ;иначе диск 80-дорожечный двухсторонний - LD HL,#9F0 ;свободно #9F0 сектора -x1F55 LD (#5E08),A ;установка типа диска - LD (#5E0A),HL ;установка количества свободных секторов - LD A,1 ;первая свободная дорожка - 1 - LD (#5E07),A - LD A,#10 ;признак принадлежности диска к TR-DOS - LD (#5E0C),A - LD HL,#5E0F ;9 байтов #20 с адреса #5E0F - LD DE,#5E10 - LD BC,8 - LD (HL),#20 - LDIR - LD HL,#5CDD ;установка имени диска - LD DE,#5E1A - LD BC,8 - LDIR - CALL x0B54 ;new выбор верхней стороны диска - LD B,1 ;записать 1 сектор - LD DE,8 ;сектор 8 дорожки 0 - LD HL,#5D25 ;из буфера - CALL x1E62 ;запись сектора - LD A,(#5CD6) ;берем количество дефектных секторов - PUSH AF ;сохраняем его - XOR A ;расширение - CHR$ 0 - LD (#5CE5),A ;установка расширения - LD HL,(#5E0A) ;берем количество свободных секторов - LD (#5CD7),HL ;сохраняем его - LD HL,#5CDD ;печать имени диска - RST #18 - LD A,#D ;перевод строки - RST #10 - LD HL,(#5CD7) ;восстановление количества свободных секторов - POP AF ;восстановление количества дефектных секторов - PUSH HL ;сохранение количества свободных секторов - LD D,0 ;перевод количества дефектных секторов в - LD E,A ;двухбайтную форму - SBC HL,DE ;вычисление количества хороших секторов - LD B,H ;переброска его в BC - LD C,L - CALL x1DA9 ;печать его - LD A,"/" ;печать "/" - RST #10 - POP BC ;восстановление количества свободных секторов - CALL x1DA9 ;печать его - JP x01D3 - -;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. - -x1FB9 DB 1 -x1FBA DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 - -;Адрес #1FCA. Определение количества дорожек дисковода. Вход: установите время перемещения головки дисковода. Выход: в #5CD7 и регистре A будет количество дорожек дисковода. - -x1FCA CALL x3E08 ;берем время перемещения головки - OR #11 ;позиционирование на дорожку #32 - LD B,A - LD A,#32 - CALL x3E44 - LD A,2 ;затем на дорожку 2 - CALL x3E44 - CALL x3DFD ;задержка в 725779 тактов - IN A,(#1F) ;головка в исходном положении? - AND 4 - LD A,#50 ;если нет, то у дисковода 80 дорожек - JR Z,x1FE7 - LD A,#28 ;иначе 40 -x1FE7 LD (#5CD7),A ;установка количества дорожек - RET ;возврат - -;Адрес #1FEB. Выбор верхней стороны диска. Установите #5D16. Используется также с адреса #1FF0 (загрузка системного регистра, код - в аккумуляторе). Вы можете также использовать с адреса: -;#1FF3 для прямого вывода в порт #FF. - -x1FEB LD A,(#5D16) ;берем копию системного регистра - OR #3C ;формат MFM, верхняя сторона, выключение сброса и готовности -x1FF0 LD (#5D16),A ;запоминаем копию системного регистра -x1FF3 OUT (#FF),A ;установка системного регистра - RET ;возврат - -;Адрес #1FF6. Выбор нижней стороны диска. Установите #5D16. - -x1FF6 LD A,(#5D16) ;берем копию системного регистра - AND #6F ;формат MFM, нижняя сторона, выключение сброса и готовности - JR x1FF0 ;установка системного регистра - -;Адрес #1FFD. Форматирование дорожки. В регистр Е поместите ее номер и спозиционируйте головку дисковода. Из переменных установите #5CD8, #5CE6, #5CE8 и обнулите #5CD6. Используется также с адреса #1FC9 (проверка дорожки; установите #5CD8, #5CE8 и обнулите #5CD6 и спозиционируйте головку). - -x1FFD DI ;запрет прерываний - LD A,#F4 ;запись дорожки - OUT (#1F),A - LD HL,#1FB9 ;берем адрес таблицы секторов для форматирования - LD C,#7F ;адрес регистра данных -x2007 LD B,#A ;#A раз #4E (первый пробел) - LD D,#4E - CALL x20B1 ;запись байта заданное число раз - LD B,#C ;синхропромежуток - LD D,0 - CALL x20B1 - LD B,3 ;синхроимпульс - LD D,#F5 - CALL x20B1 - LD D,#FE ;1 раз #FE (адресная метка идентификатора) - CALL x20AF ;запись байта 1 раз - LD D,E ;номер дорожки - CALL x20AF - LD D,0 ;номер стороны (в TR-DOS всегда 0) - CALL x20AF - LD D,(HL) ;номер сектора из таблицы - CALL x20AF - LD D,1 ;длина сектора - #100 байтов - CALL x20AF - LD D,#F7 ;запись контрольной суммы - CALL x20AF - LD B,#16 ;второй пробел - LD D,#4E - CALL x20B1 - LD B,#C ;синхропромежуток - LD D,0 - CALL x20B1 - LD B,3 ;синхроимпульс - LD D,#F5 - CALL x20B1 - LD D,#FB ;адресная метка данных - CALL x20AF - LD B,0 ;данные (#100 нулей) - LD D,0 - CALL x20B1 - LD D,#F7 ;запись контрольной суммы - CALL x20AF - LD B,#32 ;третий пробел - LD D,#4E - CALL x20B1 - LD A,(HL) ;берем адрес номера следующего сектора - INC HL - CP #10 ;конец таблицы? - JR NZ,x2007 ;если нет, то форматирование следующего сектора - LD B,0 ;пробел до конца дорожки - CALL x20B1 - JP M,x2076 - CALL x20B1 -x2076 IN A,(#1F) ;берем состояние контроллера - AND #40 ;запись запрещена? - JP NZ,x3F39 ;если да, то сообщение READ ONLY -x207D LD A,(#5CD8) ;дорожку проверять? - OR A - RET NZ ;если нет, то возврат - -;Внимание!!! Перед возвратом или выходом по ошибке надо разрешать прерывания. - - LD C,#7F ;адрес регистра данных - LD A,E ;установка номера дорожки - OUT (#3F),A - LD HL,#1FBA ;берем адрес таблицы секторов для проверки -x208A LD B,3 ;3 попытки - LD A,(HL) ;берем номер сектора из таблицы - OUT (#5F),A ;установка сектора - PUSH HL ;сохранение адреса таблицы секторов -x2090 DI ;запрет прерываний - LD A,#80 ;чтение сектора - OUT (#1F),A - PUSH BC ;сохранение количества попыток - CALL x3FE5 ;чтение данных по адресу из HL (в пзу, не страшно) - IN A,(#1F) ;все в порядке? - AND #7F - POP BC ;восстановление счетчика попыток - JR Z,x20A6 ;если все в порядке, то следующий сектор - DJNZ x2090 ;следующая попытка - LD HL,#5CD6 ;есть 1 битый сектор - INC (HL) -x20A6 POP HL ;восстановление адреса таблицы секторов - LD A,(HL) ;берем номер текущего сектора - INC HL ;берем адрес номера следующего сектора - CP 1 ;конец таблицы? - JR NZ,x208A ;если нет, то повтор - EI ;разрешение прерываний - RET ;возврат - -;Адрес #20AF. Запись байта 1 pаз. В регистр D поместите байт, в C - #7F и выдайте команду записи на вг-#5D. Используется также с адреса #20B1 (запись байта несколько раз; все для #20AF плюс в B количество выдач). - -x20AF LD B,1 ;запись 1 раз -x20B1 IN A,(#FF) ;ожидание DRQ или INTRQ - AND #C0 - JR Z,x20B1 - RET M ;если поступил INTRQ, то возврат - OUT (C),D ;выдача байта - DJNZ x20B1 ;повтор до конца - RET ;возврат - -;Адрес #20BD. Форматирование диска. Установите #5CDA, #5CD7, #5CE6 и #5CE8. - -x20BD call x0B0B ;берем число форматируемых дорожек - LD B,(HL) - XOR A ;дорожки проверять - INC HL - LD (HL),A - LD E,#FF ;начнем с дорожки 0 -x20C6 PUSH BC ;сохранение количества дорожек - INC E ;следующая дорожка - LD A,E - LD B,#1B ;позиционирование - CALL x3E44 - CALL x1FEB ;выбор верхней стороны диска - CALL x1FFD ;форматирование дорожки и возврат - LD A,(#5CDA) ;берем флаг количества сторон - CP #80 ;форматировать 2 стороны? - JR NZ,x20E1 ;если да, то - CALL x1FF6 ;выбор нижней стороны диска - CALL x1FFD ;форматирование дорожки и возврат -x20E1 POP BC ;восстановление количества дорожек - DJNZ x20C6 ;если еще не все, то повтор - RET ;возврат - -;Адрес #20E5. Удаление буфера с изменением памяти. На входе установите переменные #5CB6, #5CF8, #5D0C и #5D18. Выход: в #5D18 записывается #FF, а если в #5D0C выл 0, то туда также засылается #FF. Используется также с адреса: -;#20F1 (изменение памяти, работает только с #5CB6 и #5D18). - -x20E5 PUSH AF ;сохранение AF - LD A,(#5CF8) ;ничего не делать? - CP #FF - JR Z,x211C ;если да, то возврат - POP AF ;восстановление AF - CALL x2970 ;удаление буфера -x20F1 PUSH AF ;сохранение AF - LD A,(#5CB6) ;изменение разрешено? - CP #F4 - JR Z,x211C ;если нет, то возврат - XOR A - LD HL,#5D18 ;подтверждение есть? - OR (HL) - LD (HL),#FF ;в следующий раз подтверждение будет - JR Z,x211C ;если его не было, то возврат - LD A,(#5D0C) ;буфер есть? - OR A - LD HL,#5CC3 ;начало первого блока - LD DE,#5D33 ;начало второго блока - JR NZ,x2111 ;если есть буфер, то второй блок смещен на #101 - LD DE,#5E34 ;байтов -x2111 LD B,#2D ;длина блоков - #2D байтов -x2113 LD C,(HL) ;меняем блоки местами - LD A,(DE) - LD (HL),A - LD A,C - LD (DE),A - INC HL - INC DE - DJNZ x2113 -x211C POP AF ;восстановление AF - RET ;возврат - -;Адрес #211E. Очистка буфера редактора. - -x211E LD HL,(#5C59) ;берем адрес буфера редактора - LD (HL),#D ;ENTER - LD (#5C5B),HL ;установка курсора - INC HL ;конец области - LD (HL),#80 - RET ;возврат - -;Адрес #212A. Восстановление командной строки. Установите #5D20. - -x212A LD DE,(#5C59) ;символы переносить в буфер редактора - LD HL,#5D20 ;из #5D20 - CALL x02B0 ;перенос символов - RET ;возврат - -;Адрес #2135. Принятие команды. Установите #5D0F и если там не 0, то и #5D20. - -x2135 LD A,(#5D0F) ;ошибка была? - OR A - PUSH AF ;сохранение результата проверки - CALL NZ,x212A ;если да, то восстановление первых трех символов - -;Не надо этого делать!!! COPY портит буфер по адресу #5D20, а буфер редактора всегда остается цел. - - POP AF ;восстановление результата проверки - CALL Z,x211E ;если ошибки не было, то стирание старой строки - LD HL,(#5C59) ;эта команда тоже не нужна - CALL x3D80 ;перевод строки - LD A,(#5D19) ;берем номер дисковода по умолчанию - ADD A,"A" ;печать его имени - RST #10 - LD A,">" ;печать ">" - RST #10 - LD HL,#5C3A ;для нормального выхода из редактора - LD (HL),#FF - JP x1D90 ;ввод команды и возврат - -;Адрес #2158. Прием числа. CH_ADD установите на символ перед числом. Число, увеличенное на 1, будет помещено в #5CD7, а содержимое #5CDB будет скопировано в #5CD9. Число не должно равняться 0. - -x2158 CALL x1E2A ;следующий символ - CALL x1D8C - CP "," ;это запятая? - JP NZ,x1D1A ;если да, то ошибка - LD HL,(#5CDB) ;сохранение #5CDB - LD (#5CD9),HL - CALL x1E0B ;помещение числа на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD HL,(#5CDB) ;число pавно 0? - LD A,H - OR A - JP NZ,x1D1A ;если да, то ошибка - INC HL ;еще будет байт ENTER - LD (#5CD7),HL ;установка числа - LD HL,(#5CD9) ;восстановление #5CDB - LD (#5CDB),HL - RET ;возврат - -;Адрес #2182. Выполнение команды OPEN#. Установите #5D11 и #5C3B. - -x2182 LD HL,(#5D11) ;установка CH_ADD - LD (#5C5D),HL - CALL x1E0B ;принятие номера потока - CALL x1DD0 ;принятие имени файла на стек калькулятора -x218E CALL x1D8C ;берем текущий символ - CP "A" ;он меньше "A"? - JR NC,x219A ;если нет, то проверка режима файла - CALL x1E2A ;следующий символ - JR x218E ;повтор -x219A CP #A5 ;это RND? - PUSH AF ;сохранение символа и результата проверки - CALL Z,x2158 ;если это RND, то обработка длины записи - POP AF ;восстановление символа и результата проверки - JR Z,x21AE ;если это RND, то открытие потока - AND #DF ;буква заглавная - CP "R" ;это "R"? - JR Z,x21AE ;если да, то открытие потока - CP "W" ;это "W"? - JP NZ,x1D1A ;если нет, то ошибка -x21AE LD (#5D09),A ;сохранение буквы режима файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,"#" ;расширение файла - "#" - LD (#5CE5),A - LD A,0 ;поиск начинать с блока 0 - LD (#5CE6),A - CALL x21DB ;поиск последнего блока файла - PUSH AF ;сохранение флага результата поиска - CALL x220F ;проверка потока - POP AF ;восстановление флага результата поиска - PUSH AF ;сохранение флага результата поиска - CALL NZ,x2288 ;если файл не был найден, то создание блока 0 - POP AF ;восстановление флага результата поиска - CALL x2242 ;открытие потока - LD HL,(#5D11) ;коррекция переменной с адресом командной строки - LD BC,#124 - ADD HL,BC - LD (#5D11),HL - JP x01D3 ;завершение - -;Адрес #21DB. Поиск блока файла данных. Вход: поместите имя файла на стек калькулятора, установите #5CDD и #5D09 и поместите в #5CE6 номер первого блока файла. Выход: если файл найден, то будет считан описатель последнего или первого блока в зависимости от #5D09 и обнулен аккумулятор и установлен флаг Z; иначе флаг Z будет сброшен, а в аккумуляторе будет байт из #5D09. - -x21DB LD A,#A ;поиск файла ведем по #A байтам - LD (#5D06),A - CALL x1CB0 ;установка имени файла и поиск файла - PUSH AF ;сохранение результата поиска - CALL x0405 ;настройка на диск - POP AF ;восстановление результата поиска - JR NZ,x2206 ;если файл не найден, то проверка режима файла - LD A,(#5D09) ;открываем файл для чтения? - CP "R" - JR Z,x2201 ;если да, то выход -x21F1 LD HL,#5CE6 ;следующий блок - INC (HL) - CALL x1CB3 ;поиск блока - JR Z,x21F1 ;если блок найден, то следующий блок - LD HL,#5CE6 - DEC (HL) ;последний существующий блок - CALL x1CB3 ;определение его номера в каталоге -x2201 CALL x165D ;чтение его описателя - XOR A ;обнуление аккумулятора и установка флага Z - RET ;возврат -x2206 LD A,(#5D09) ;открываем файл для чтения? - CP "R" - RET NZ ;если да, то возврат - JP x03D9 ;сообщение NO FILE - -;Адрес #220F. Проверка занятости потока. Вход: установите #5CDB. Выход: в HL будет адрес элемента таблицы STRMS, отвечающего за данный поток. Используется также с адреса #2225 (то же, что и #1C4A). - -x220F LD A,(#5CDB) ;берем номер потока - RST #20 ;берем относительный адрес описателя потока, к - DW #1727 ;которому подключен канал - LD A,B ;поток занят? - OR C - JP NZ,x221B ;если да, то ошибка - RET ;возврат -x221B LD A,#19 ;код ошибки бейсика PARAMETER ERROR - -;Внимание!!! Лучше выдавать сообщение INVALID STREAM. - - LD (#5C3A),A - LD HL,x2804 ;адрес сообщения STREAM OPENED - LD A,#A ;код ошибки TR-DOS - #A -x2225 JP x1C4A ;обработка ошибки - -;Адрес #2228. Обработка ошибки NOT DISC FILE. - -x2228 LD A,#B ;код ошибки - #B - LD HL,x2812 ;адрес сообщения NOT DISC FILE - JR x2225 ;обработка ошибки - -;Адрес #222F. Инициализация признаков файла произвольного доступа. Установите #5CD7 и откройте канал файла данных. Подпрограмма помещает в A #7F. - -x222F PUSH HL ;сохранение HL - LD C,#20 ;берем адрес #20-го байта описателя канала - RST #28 - LD A,(#5CD7) ;установка длины записи - LD (HL),A - INC HL - XOR A - LD (HL),A ;адресация от начала записи - 0 - INC HL - LD (HL),A ;будет приниматься номер записи - INC HL - LD (HL),A ;сектор переписывать - LD A,#7F ;загрузка аккумулятора - POP HL ;восстановление HL - RET ;возврат - -;Адрес #2242. Создание описателя канала для файла данных и подключение к нему потока. Установите #5CDB. - -x2242 PUSH AF ;сохранение результата поиска файла - CALL x220F ;берем адрес элемента таблицы STRMS, отвечающего за поток - EX DE,HL ;сохранение его - LD HL,(#5C53) ;вычисление относительного адреса нового - LD BC,(#5C4F) ;описателя канала - SBC HL,BC - EX DE,HL ;восстановление адреса элемента таблицы STRMS - LD (HL),E ;установка относительного адреса описателя - INC HL ;канала - LD (HL),D - CALL x22B2 ;создание описателя канала - LD A,(#5D09) ;берем способ открытия файла - CP #A5 ;это RND? - CALL Z,x222F ;если да, то инициализация признаков файла произвольного доступа - JR Z,x226B ;и установка признака способа открытия файла - LD A,(#5D09) ;берем способ открытия файла - CP "R" ;это R? - LD A,#FF ;если да, то признак способа открытия файла - - JR NZ,x226B ;#FF - XOR A ;иначе это 0 -x226B LD (HL),A ;установка признака способа открытия файла - POP AF - JP x2270 -x2270 PUSH AF - LD BC,#14 ;берем адрес фрагмента текста в описателе - ADD HL,BC ;канала минус 1 - PUSH HL ;сохраняем его - CALL x2423 ;вычисление адреса текущего сектора файла на диске - POP HL ;восстановление адреса фрагмента текста минус 1 - INC HL - LD B,1 ;загружать 1 сектоp - POP AF ;восстановление результата поиска файла - OR A ;был создан новый файл? - PUSH AF ;сохранение результата проверки - CALL NZ,x1E4D ;если был создан новый файл, то запись сектора - POP AF ;сохранение результата проверки - CALL Z,x1E3D ;если файл существовал, то загрузка файла - RET ;возврат - -;Адрес #2288. Создание нулевого блока файла данных. - -x2288 LD HL,(#5CD7) ;сохранение #5CD7 - PUSH HL - LD HL,#2000 ;блок 0 - LD (#5CD7),HL - CALL x229A ;создание блока - POP HL ;восстановление #5CD7 - LD (#5CD7),HL - RET ;возврат - -;Адрес #229A. Создание блока файла данных. Установите #5CD7 и #5CDB, #5CDD и #5CE5. - -x229A LD HL,#1000 ;длина блока - #1000 байтов - LD (#5CD9),HL - CALL x1AC4 ;проверка наличия свободного места на диске - CALL x1B59 ;запись файла - LD HL,0 ;заполнено 0 байтов - LD (#5CE8),HL - CALL x166B ;замена описателя блока - JP x1E43 ;перезапись сектора с описателем и возврат - -;Внимание!!! После записи сектора надо снова открыть канал файла данных, так как при ошибке открывается поток 0. - -;Адрес #22B2. Создание описателя канала и открытие потока. - -x22B2 LD HL,(#5C53) ;открытие потока - DEC HL - LD (#5C51),HL - PUSH HL ;сохранение адреса описателя канала - LD BC,#124 ;его длина - #124 байта - CALL x1E32 ;создание области для описателя канала - LD A,0 ;заполнять область нулями - LD B,0 ;длина области - #100 байтов -x22C4 LD (DE),A ;очистка байта - DEC DE ;следующий адрес - DJNZ x22C4 ;повтор до конца - POP HL ;восстановление адреса описателя канала - PUSH HL ;и снова сохранение - LD DE,x3D0E ;адрес подпрогpаммы вывода в канал - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,x3D06 ;адрес подпрограммы ввода из канала - LD (HL),E - INC HL - LD (HL),D - INC HL - LD (HL),"D" ;имя канала - "D" - INC HL ;пропуск четырех байтов - INC HL - INC HL - INC HL - INC HL - LD (HL),#24 ;байт #24 - INC HL - LD (HL),1 ;байт 1 - INC HL - LD A,(#5CF6) ;номер дисковода - LD (HL),A - INC HL - LD A,(#5D1E) ;номер последнего блока файла - LD (HL),A - INC HL - LD A,(#5D09) ;файл открывается для чтения? - CP "R" - LD (HL),0 ;если да, то пройдено 0 байтов - JR Z,x22FC ;иначе количество пройденных байтов берем из - LD A,(#5CE8) ;поля длины записанной части файла - LD (HL),A -x22FC INC HL - LD (HL),B - JR Z,x2304 - LD A,(#5CE9) - LD (HL),A -x2304 INC HL - EX DE,HL ;сохранение адреса #F-го байта описателя канала - POP HL ;восстановление адреса описателя канала - PUSH DE - LD DE,#10 ;адрес #10-го байта описателя канала - ADD HL,DE - EX DE,HL - LD HL,#5CDD ;установка описателя файла - LD BC,#10 - LDIR - POP HL ;восстановление адреса #F-го байта описателя канала - RET ;возврат - -;Адpес #2317. Вычисление адреса текущего символа файла данных в описателе канала. Откройте поток, связанный с файлом данных. На выходе адрес символа будет в HL. - -x2317 LD C,#D ;адрес #D-го байта описателя канала - RST #28 - LD C,(HL) ;берем номер текущего символа в текущем секторе файла - RST #28 ;вычисление смещения до символа - LD BC,#24 ;текст начинается с #24-го байта описателя канала - ADD HL,BC ;вычисление адреса символа - RET ;возврат - -;Адрес #2321. Вычисление адреса фрагмента текста в описателе канала. Откройте поток, связанный с файлом данных. Используется также с адреса #2323 (вычисление адреса байта в описателе текущего канала; откройте канал и поместите номер байта в C; на выходе в HL будет адрес байта). - -x2321 LD C,#24 ;текст начинается с #24-го байта -x2323 LD B,0 ;перевод номера байта в 2-х байтный формат - LD HL,(#5C51) ;берем адрес описателя текущего канала - ADD HL,BC ;вычисление адреса байта - RET ;возврат - -;Адрес #232A. Проверка достижения конца сектора в описателе канала. Откройте поток, связанный с файлом данных. При достижении конца сектора будет загружен следующий. Если достигнут конец блока, а следующий отсутствует, то он будет создан. - -x232A LD C,#D ;адрес #D-го байта описателя канала - RST #28 - INC (HL) ;следующий байт - RET NZ ;если не конец сектора, то возврат - PUSH HL ;сохранение адреса #D-го байта описателя канала - CALL x2443 ;установка дисковода - CALL x23FC ;запись текущего сектора - POP HL ;восстановление адреса #D-го байта описателя канала - INC HL ;#E-ый байт - INC (HL) ;следующий сектор - PUSH HL ;сохранение адреса #E-го байта описателя канала - CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #E-го байта описателя канала - LD A,#10 ;в блоке 16 секторов - CP (HL) ;конец блока? - RET NZ ;если нет, то возврат - PUSH HL ;сохранение адреса #E-го байта описателя канала - LD C,#F ;#F-ый байт - RST #28 - LD A,(HL) ;файл прямого доступа? - CP #7F - POP HL ;восстановление адреса #E-го байта описателя канала - JR Z,x2358 ;если файл прямого доступа, то проверка наличия следующего блока - LD HL,(#5C51) ;берем адрес описателя канала - CALL x26E1 ;запись описателя блока - LD C,#E ;#E-ый байт - RST #28 - JP x2379 ;создание следующего блока файла -x2358 CALL x23CF ;поиск следующего блока файла - PUSH AF ;сохранение результата поиска - CALL Z,x2418 ;если блок найден, то загрузка сектора из блока - LD C,#E ;#E-ый байт - RST #28 - POP AF ;восстановление результата поиска блока - CALL NZ,x2370 ;если блок не был найден, то создание его - RET ;возврат - -;Адрес #2367. Помещение в D числа #20, в E - содержимого #19-го байта описателя канала и обнуление байта по адресу, помещенному в HL. Откройте нужный канал. - -x2367 LD (HL),0 ;обнуление байта - LD C,#19 ;берем адрес #19-го байта описателя канала - RST #28 - LD D,#20 ;помещение в регистр D числа #20 - LD E,(HL) ;помещение в E числа из #20-го байта описателя канала - RET ;возврат - -;Адрес #2370. Создание блока файла данных. Откройте поток, связанный с файлом данных. - -x2370 CALL x2367 ;берем номер создаваемого блока - LD (#5CD7),DE ;установка его - JR x2381 ;создание и возврат - -;Адрес #2379. Cоздание блока файла данных. Откройте поток, связанный с файлом данных, используется, также, с адреса #2381 (создание блока файла данных; установите #5CD7 и #5CDB, #5CDD и #5CE5). - -x2379 CALL x2367 ;берем номер текущего блока - INC E ;следующий блок - LD (#5CD7),DE ;установка номера блока -x2381 CALL x229A ;создание блока - CALL x2970 ;удаление буфера - -;Внимание!!! Если выполняется команда CAT# или LIST#, то буфеp удалять нельзя. - - LD C,#10 ;берем адрес #10-го байта описателя канала - RST #28 - EX DE,HL ;перенос его в DE - LD HL,#5CDD ;перенос описателя блока в описатель канала - LD BC,#10 - LDIR - LD C,#C ;#C-ый байт - RST #28 - LD A,(#5D1E) ;установка номера блока в каталоге - LD (HL),A - RET ;возврат - -;Адрес #239B. Проверка достижения конца сектора при чтении файла данных. Откройте поток, связанный с файлом данных. - -x239B LD C,#D ;адрес #10-го байта описателя канала - RST #28 - INC (HL) ;следующий байт сектора - RET NZ ;если не конец сектора, то возврат - INC HL ;#11-ый байт - INC (HL) ;следующий сектор - PUSH HL ;сохранение адреса #11-го байта описателя канала - CALL x2443 ;установка дисковода - LD C,#23 ;#23-ый байт - RST #28 - LD A,(HL) ;это 0? - OR A - JR Z,x23B6 ;если да, то сектор не переписывать - POP HL ;восстановление адреса #11-го байта описателя канала - PUSH HL ;и снова сохранение его - DEC (HL) ;восстановление номера текущего сектора - CALL x23FC ;запись сектора - POP HL ;восстановление адреса #11-го байта описателя канала - PUSH HL ;и снова сохранение его - INC (HL) ;следующий сектор -x23B6 CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #11-го байта описателя канала - LD A,#10 ;в блоке 16 секторов - CP (HL) ;конец блока? - CALL Z,x23C1 ;если да, то открытие следующего - RET ;возврат - -;Адрес #23C1. Открытие следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адрес #E-го байта описателя канала и установите #5D06. - -x23C1 CALL x23CF ;поиск следующего блока файла данных - PUSH AF ;сохранение результата поиска - CALL x2970 ;удаление буфера - -;Внимание!!! Hадо проверять #5D16, так как если выполняется команда CAT#, или LIST#, то буфер удалять нельзя. - - POP AF ;восстановление результата поиска блока - JP NZ,x2492 ;если блок не найден, то END OF FILE - JP x2418 ;загрузка сектора из блока - -;Адрес #23CF. Поиск следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адpес #E-го байта описателя канала и установите #5D06. Если блок найден, то флаг Z будет включен, иначе выключен. - -x23CF LD (HL),0 ;номер текущего сектора - 0 - LD C,#19 ;#19-ый байт описателя потока - RST #28 - INC (HL) ;следующий блок - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x1CB3 ;поиск блока - -;Внимание!!! После поиска блока надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. - - RET NZ ;если блок не найден, то возврат - -;Адрес #23E4. Открытие блока. Номер блока в каталоге поместите в A. - -x23E4 CALL x165D ;чтение описателя блока - -;Внимание!!! После чтения описателя надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. - - LD C,#10 ;берем адрес #10-го байта описателя канала - RST #28 - EX DE,HL ;переброска его в DE - LD HL,#5CDD ;перенос описателя блока в описатель канала - LD BC,#10 - LDIR - LD C,#C ;#C-ый байт - RST #28 - LD A,(#5D1E) ;установка номера блока в каталоге - LD (HL),A - XOR A ;обнуление аккумулятора - RET ;возврат - -;Адрес #23FC. Запись текущего сектора файла данных. Откройте поток, связанный с файлом. - -x23FC CALL x2423 ;вычисление адреса текущего сектора файла на диске - CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала - LD B,1 ;записывать 1 сектор - CALL x1E4D ;запись сектора - -;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. - - LD C,#F ;#F-ый байт описателя канала - RST #28 - LD A,(HL) ;файл прямого доступа? - CP #7F - RET Z ;если да, то возврат - CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала - XOR A ;сектор заполнять нулями - LD B,A ;длина его - #100 байтов -x2413 LD (HL),A ;очистка байта - INC HL ;следующий байт - DJNZ x2413 ;повтор до конца - RET ;возврат - -;Адрес #2418. Загрузка текущего сектора в описатель канала. Откройте поток, связанный с файлом данных. - -x2418 CALL x2423 ;вычисление адреса текущего сектора на диске - CALL x2321 ;вычисление адреса сектора в описателе канала - LD B,1 ;загружать 1 сектор - JP x1E3D ;загрузка сектора и возврат - -;Внимание!!! После загрузки сектора надо снова открывать канал, связанный с файлом данных, так как при ошибках открывается поток 0. - -;Адрес #2423. Вычисление адреса текущего сектора файла на диске. Откройте поток, связанный с файлом данных. На выходе в DE будет адрес сектора на диске. - -x2423 LD HL,(#5C51) ;берем адрес #1E-го байта описателя канала - LD BC,#1E - ADD HL,BC - LD E,(HL) ;берем адрес файла на диске - INC HL - LD D,(HL) - LD C,#E ;#E-ый байт - RST #28 - LD B,(HL) ;берем номер текущего сектора файла - DEC B ;он равен 0? - INC B - PUSH AF ;сохранение AF - LD A,#10 ;на дорожке #10 секторов - JR Z,x2441 ;если номер текущего сектора файла pавен 0, то выход -x2438 INC E ;следующий сектор - CP E ;конец дорожки? - JR NZ,x243F ;если да, то - LD E,0 ;сектор 0 - INC D ;и следующая дорожка -x243F DJNZ x2438 ;повтор до конца -x2441 POP AF ;восстановление AF - RET ;возврат - -;Адрес #2443. Установка дисковода для операций с файлом данных. Откройте поток, связанный с файлом. - -x2443 LD C,#B ;берем адрес #B-го байта описателя канала - RST #28 - LD A,(HL) ;берем номер дисковода, на котором находится файл - JP x3DCB ;выбор дисковода - -;Адрес #244A. Вывод символа в файл данных. Символ поместите в аккумулятор и откройте поток, связанный с файлом. - -x244A LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD HL,x20F1 ;адрес подпрограммы изменения памяти - PUSH HL ;помещение его на стек - PUSH AF ;сохранение символа - CALL x20F1 ;изменение памяти - LD A,#A ;файл искать по #A байтам описателя - LD (#5D06),A - POP AF ;восстановление символа - CALL x24A2 ;работа с файлом прямого доступа - PUSH AF ;сохранение символа - CALL x2650 ;файл открывался для чтения? - JP Z,x249E ;если да, то ошибка - POP AF ;восстановление символа - CALL x2317 ;вычисление адреса текущего символа в текущем секторе - LD (HL),A ;запись символа - JP x232A ;проверка достижения конца сектора в описателе канала - -;Адрес #246E. Проверка достижения конца блока. Используется также с адресов: -;#2492 - обработка ошибки END OF FILE через ПЗУ бейсика. -;#2494 - обработка ошибок через ПЗУ бейсика. Код ошибки поместите в аккумулятор. - -x246E LD C,#D ;берем адрес #D-го байта описателя канала - RST #28 - LD A,(HL) ;берем младший байт длины пройденной части файла - LD BC,#E ;#1B-й байт - ADD HL,BC - CP (HL) ;сравнение младших байтов длин пройденной и записанной частей блока - RET NZ ;если они не равны, то возврат - LD C,#E ;аналогично со старшими байтами - RST #28 - LD A,(HL) - LD BC,#E - ADD HL,BC - CP (HL) - RET NZ - LD HL,#5CB6 ;адрес переменной разpешения изменения памяти - LD A,(HL) ;берем ее значение - CP #F4 ;интерфейс-1 есть? - JR Z,x2492 ;если нет, то ошибка - BIT 4,(HL) ;выполняется команда LOAD интерфейса-1? - JR Z,x2492 ;если да, то ошибка - OR 1 ;сброс флага C - POP HL ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x2492 LD A,7 ;код ошибки END OF FILE -x2494 LD (#5C3A),A ;установка кода ошибки - CALL x20E5 ;изменение памяти - RST #20 ;обработка ошибки - DW #0058 - -;Адрес #249D. Команда RET. - -x249D RET - -;Адрес #249E. Обработка ошибки INVALID I/O DEVICE через ПЗУ бейсика. - -x249E LD A,#17 ;код ошибки - #17 - JR x2494 ;обработка ошибки чеpез ПЗУ бейсика - -;Адрес #24A2. Работа с файлом произвольного доступа. Очередной символ поместите в A и откройте поток, связанный с файлом данных. Если окончен прием записи или файл последовательного доступа, то происходит простой возврат, иначе происходит возврат из программы, вызвавшей эту подпрограмму. - -x24A2 LD D,A ;сохранение символа - LD C,#F ;берем адрес #D-го байта описателя канала - RST #28 - LD A,(HL) ;файл произвольного доступа? - CP #7F - LD A,D ;восстановление символа - RET NZ ;если файл произвольного доступа, то возврат - LD BC,#13 ;#22-ый байт - ADD HL,BC - LD A,(HL) ;принимаем номер записи? - OR A - LD A,D ;восстановление символа - JR NZ,x24D5 ;если номер записи принят, то запись символа - DEC HL ;#21-ий байт - LD A,(HL) ;это 0? - OR A - JR NZ,x24C2 ;если нет, то рабочая область уже есть - PUSH BC ;сохранение числа #13, - PUSH HL ;адреса #21-го байта описателя канала и - PUSH DE ;символа - CALL x24F8 ;выделение #10 байтов в рабочей области - POP DE ;восстановление символа, - POP HL ;адреса #21-го байта описателя канала и - POP BC ;числа #13 -x24C2 LD C,(HL) ;берем относительный адрес символа - LD A,D ;восстановление символа - EX DE,HL - LD HL,(#5CCF) ;берем адрес рабочей области - ADD HL,BC ;вычисление адреса для символа - CP 6 ;символ CHR$ 6? - LD (HL),A ;помещение символа в рабочую область - CALL Z,x2504 ;если символ CHR$ 6, то номер записи принят - LD C,#21 ;#21-ий байт - RST #28 - INC (HL) ;записали 1 символ - POP HL ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x24D5 DEC HL ;#21-ий байт - LD A,(HL) ;берем относительный адрес символа - DEC HL ;#20-й байт - INC A ;место для символа ENTER - CP (HL) ;конец записи? - INC HL ;#21-ий байт - INC (HL) ;записали 1 символ - PUSH HL ;сохранение адреса #21-го байта описателя - PUSH AF ;канала и результата проверки наличия места для символа - LD C,#23 ;#23-ый байт - RST #28 - LD (HL),#FF ;сектор переписывать - POP AF ;восстановление результата проверки наличия места - POP HL ;для символа и адреса #21-го байта описателя канала - JR C,x24EE ;если места для символа нет, то следующая запись - LD A,D ;восстановление символа - CP #D ;это ENTER? - JR Z,x24F2 ;если да, то следующая запись - POP BC ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x24EE LD A,D ;восстановление символа - CP #D ;это ENTER? - RET NZ ;если нет, то возврат -x24F2 XOR A ;относительный адрес символа - 0 - LD (HL),A - INC HL ;#22-ый байт - LD (HL),A ;будем принимать номер записи - LD A,D ;восстановление символа - RET ;возврат - -;Адрес #24F8. Выделение #10 байтов в рабочей области памяти. Устанавливает #5CCF. - -x24F8 LD HL,(#5C61) ;берем адрес рабочей области памяти - LD (#5CCF),HL ;установка его - LD BC,#10 ;выделять #10 байтов - JP x1E23 ;выделение области и возврат - -;Адpес #2504. Обработка номера записи. Поместите в память номер записи в виде текста и поместите его адрес в #5CCF, а в HL поместите адрес последнего символа номера записи плюс 1. - -x2504 LD (HL),#D ;конец строки - LD HL,(#5C5D) ;сохранение CH_ADD - LD (#5CD7),HL - LD HL,(#5CCF) ;установка CH_ADD на номер записи - LD (#5C5D),HL - LD HL,#5C3B ;проверка на синтаксис - RES 7,(HL) - CALL x1DC1 ;перевод числа в 5-байтную форму - LD HL,#5C3B ;выполнение - SET 7,(HL) - LD HL,(#5CCF) ;установка CH_ADD на номер записи - LD (#5C5D),HL - CALL x1DC1 ;прием числа на стек калькулятора - CALL x1DB9 ;снятие его оттуда - PUSH BC ;перенос его в DE - POP DE - LD C,#20 ;берем адрес #D-го байта описателя канала - RST #28 - LD B,(HL) ;берем длину записи - XOR A - LD HL,0 ;вычисление относительного адреса записи в - LD (#5CDB),HL ;секторе, номера сектора и номера блока -x2538 ADD HL,DE ;извините, не понял, как это pаботает - JR NC,x2544 - PUSH HL - LD HL,(#5CDB) - INC HL - LD (#5CDB),HL - POP HL -x2544 DJNZ x2538 - LD (#5CD9),HL - LD A,(#5CDB) ;в блоке всего 16 секторов - LD HL,#5CDA - RRD - AND #F - LD (#5CDB),A - LD HL,(#5CD7) ;восстановление CH_ADD - LD (#5C5D),HL - CALL x2568 ;открытие записи - LD C,#21 ;#21-ий байт - RST #28 - LD A,#FF ;относительный адрес текущего символа будет 0 - LD (HL),A - INC HL ;#22-ый байт - LD (HL),A ;номер записи принят - RET ;возврат - -;Адрес #2568. Открытие записи. Установите #5CD7, #5CD9 и #5CDB. - -x2568 LD C,#19 ;берем адрес #19-го байта описателя канала - RST #28 - LD A,(#5CDA) ;берем номер открываемого блока - CP (HL) ;блок уже открыт? - JP NZ,x2584 ;если нет, то открытие блока - LD C,#E ;#E-ый байт - RST #28 - LD A,(#5CDB) ;берем номер сектора в открываемом блоке - CP (HL) ;сектор уже считан? - JP NZ,x25A7 ;если нет, то загрузка сектора -x257C LD C,#D ;#D-ый байт - RST #28 - LD A,(#5CD9) ;берем относительный адрес открываемой записи - LD (HL),A ;установка его - RET ;возврат -x2584 CALL x25CA ;проверка и обнуление #23-го байта - CALL NZ,x25C3 ;если надо, то запись сектора - LD A,(#5CDA) ;берем номер открываемого блока - LD C,#19 ;#19-ый байт - RST #28 - LD (HL),A ;установка номера блока - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x1CB3 ;поиск блока - -;Ошибка!!! После поиска файла надо снова открывать канал файла данных, так как при ошибке будет открыт поток 0. - - JP NZ,x25D2 ;если блок не найден, то создание блока - CALL x23E4 ;открытие блока - JR x25AD ;загрузка сектора из блока -x25A7 CALL x25CA ;проверка и обнуление #23-го байта - CALL NZ,x25C3 ;если надо, то запись сектора -x25AD LD A,(#5CDB) ;берем номер считываемого сектора - LD C,#E ;#E-ый байт - RST #28 - LD (HL),A ;установка номера сектора - PUSH HL ;сохранение адреса #E-го байта - CALL x2443 ;установка дисковода - CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #E-го байта - DEC HL ;#D-ый байт - LD A,(#5CD9) ;установка относительного адреса открываемой - LD (HL),A ;записи - JR x257C ;выход - -;Адрес #25C3. Запись текущего сектора. Откройте канал файла данных. - -x25C3 CALL x2443 ;установка дисковода - CALL x23FC ;запись сектора - RET ;возврат - -;Адрес #25CA. Проверка и обнуление #23-го байта описателя канала. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. Откройте нужный канал. - -x25CA LD C,#23 ;берем адрес #23-го байта описателя канала - RST #28 - LD A,(HL) ;берем его содержимое - OR A ;проверка его - LD (HL),0 ;обнуление байта - RET ;возврат - -;Адрес #25D2. Создание блока файла данных. Установите #5CD7, #5CD9 и #5CDB. - -x25D2 LD HL,(#5CDA) ;берем номер блока - LD H,#20 - LD (#5CD7),HL ;установка его - LD HL,(#5CD9) ;сохранение относительного адреса открываемой - PUSH HL ;записи - LD HL,(#5CDB) ;и номера сектора - PUSH HL - CALL x2381 ;создание блока - POP HL ;восстановление номера сектора - LD (#5CDB),HL - POP HL ;и относительного адреса открываемой записи - LD (#5CD9),HL - JR x25AD ;загрузка сектора из блока - -;Адрес #25EF. Ввод из файла данных. Откройте поток, связанный с файлом данных. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает символ из файла в A. - -x25EF CALL x20F1 ;изменение памяти - LD HL,#5C3C ;pежим не менялся - RES 3,(HL) - LD HL,(#5C3D) ;берем адрес подпрограммы обработки ошибок - LD E,(HL) - INC HL - LD D,(HL) - OR A ;он pавен #107F? - LD HL,#107F - SBC HL,DE - JR NZ,x2626 ;если нет, то подпрограмма вызвана не из редактора - LD SP,(#5C3D) ;очистка стека редактора - POP DE ;снятие адреса подпрограммы обработки ошибок - POP DE ;восстановление адреса дна стека - LD (#5C3D),DE ;установка его -x260F CALL x262B ;ввод символа из файла - JR C,x261D ;если был введен символ, то посылка его в буфер редактора -x2614 LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD HL,x20E5 ;адрес подпрограммы удаления буфера и изменения памяти - PUSH HL ;помещение его на стек - RET ;изменение памяти и возврат -x261D CP #D ;символ ENTER? - JR Z,x2614 ;если да, то выход - RST #20 ;ввод символа в буфер редактора - DW #0F85 - JR x260F ;повтор -x2626 CALL x262B ;ввод символа из файла - JR x2614 ;возврат - -;Адрес #262B. Ввод байта из файла данных. На выходе байт будет в аккумуляторе. Откройте поток, связанный с файлом данных. - -x262B LD A,#A ;файл искать по 10 байтам описателя - LD (#5D06),A - CALL x2650 ;файл открыт для чтения? - JR Z,x2642 ;если да, то - CP #7F ;файл произвольного доступа? - JP NZ,x249E ;если нет, то ошибка - LD BC,#13 ;берем адрес #22-го байта описателя канала - ADD HL,BC - LD (HL),0 ;подпрограмма вывода будет принимать номер записи - JR x2645 -x2642 CALL x246E -x2645 CALL x2317 ;вычисление адреса текущего символа - LD A,(HL) ;берем этот символ - PUSH AF ;сохраняем его - CALL x239B ;проверка достижения конца сектора - POP AF ;восстановление символа - SCF ;был введен символ - RET ;возврат - -;Адрес #2650. Проверка #F-го байта описателя текущего канала. Соответственно его содержимому установится флаг Z, а само содержимое будет в регистре A. - -x2650 LD C,#F ;берем адрес #F-го байта описателя канала - RST #28 - LD A,(HL) ;берем этот байт - OR A ;проверка его на 0 - RET ;возврат - -;Адрес #2656. Выполнение команды CLOSE#. Установите #5D11 и #5C3B. - -x2656 LD HL,(#5D11) ;установка CH_ADD - LD (#5C5D),HL - CALL x1E0B ;прием номера потока - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CDB) ;берем номер потока - RST #20 ;берем относительный адрес описателя канала - DW #1727 - LD A,B ;поток закрыт? - OR C - JP Z,x01D3 ;если да, то завершение - PUSH HL ;сохранение адреса элемента STRMS - LD HL,(#5C4F) ;берем адрес области описателей каналов - ADD HL,BC ;вычисляем адрес первого байта описателя канала - LD A,(HL) ;берем старший байт адреса подпрограммы вывода - LD HL,x3D0E ;он равен #3D? - CP H - POP HL ;восстановление адреса элемента STRMS - JP NZ,x2228 ;если старший байт адреса подпрограммы вывода не равен #3D, то сообщение NOT DISC FILE Дурацкая проверка!!! Мало ли что может изменить пользователь! - LD (HL),0 ;закрытие потока - INC HL - LD (HL),0 - LD (#5CD9),BC ;сохранение относительного адреса описателя канала - LD HL,(#5C4F) ;вычисление адреса описателя канала - ADD HL,BC - DEC HL - LD (#5CD7),HL ;сохранение его - CALL x26CE ;запись остатка файла, если нужно - LD HL,(#5CD7) ;восстановление адреса описателя канала - LD BC,#124 ;его длина - #124 байта - CALL x1E2E ;уничтожение области описателя канала - LD HL,#5C10 ;берем начало таблицы STRMS - LD B,#10 ;всего 16 потоков -x269D PUSH BC ;сохранение количества потоков - LD BC,(#5CD9) ;берем относительный адрес описателя канала - LD E,(HL) ;берем адрес из таблицы - INC HL - LD D,(HL) - EX DE,HL ;переносим его в HL - SBC HL,BC ;он меньше нашего адреса? - EX DE,HL ;переброска его в DE - JR C,x26BC ;если он меньше нашего адреса, то следующий элемент - LD D,(HL) ;снова берем адрес из таблицы - DEC HL - LD E,(HL) - INC HL - PUSH HL ;сохранение адреса текущего элемента таблицы - EX DE,HL ;переброска адреса из таблицы в HL - LD BC,#124 ;коррекция адреса - SBC HL,BC - EX DE,HL ;перенос его в DE - POP HL ;восстановление адреса текущего элемента таблицы - LD (HL),D ;установка нового адреса - DEC HL - LD (HL),E - INC HL -x26BC INC HL ;следующий элемент - POP BC ;восстановление количества элементов - DJNZ x269D ;повтор до конца - LD HL,(#5D11) ;коррекция адреса командной строки - LD BC,#124 - SBC HL,BC - LD (#5D11),HL - JP x01D3 ;завершение - -;Адрес #26CE. Запись текущего сектора файла данных. При записи открывает поток, связанный с файлом. Поместите в HL и #5CD7 адрес описателя канала. - -x26CE LD BC,#F ;берем адрес #F-го байта описателя канала - ADD HL,BC - LD A,(HL) ;файл открывался для чтения? - OR A - RET Z ;если да, то возврат - LD HL,(#5CD7) ;открытие потока - LD (#5C51),HL - CALL x26E1 ;запись описателя блока - JP x23FC ;запись текущего сектора и возврат - -;Адpес #26E1. Запись описателя текущего блока файла данных. Откройте поток, связанный с файлом данных и поместите в HL адрес описателя канала. - -x26E1 LD BC,#D ;берем адрес #D-го байта описателя канала - ADD HL,BC - LD E,(HL) ;берем длину пройденной части блока - INC HL - LD D,(HL) - LD BC,#D ;берем адрес #1A-го байта описателя канала - ADD HL,BC - LD (HL),E ;установка длины записанной части блока - INC HL - LD (HL),D - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x2443 ;установка дисковода - LD C,#C ;#C-ый байт - RST #28 - LD C,(HL) ;берем номер блока в каталоге - CALL x166B ;замена описателя блока - JP x1E43 ;запись сектора с описателем и возврат - -;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. - -;Адрес #2707. Печать строки. В HL поместите ее начало. Последний символ должен быть либо CHR$ 0, либо с поднятым седьмым битом. - -x2707 LD A,(HL) ;берем символ из строки - OR A ;это CHR$ 0? - RET Z ;если да, то возврат - AND #7F ;сброс бита 7 - RST #10 ;печать символа - BIT 7,(HL) ;бит 7 установлен? - RET NZ ;если да, то возврат - INC HL ;берем адрес следующего символа - JR x2707 ;повтор - -;Адрес #2713. Сравнение областей памяти. В HL и DE поместите начала сравниваемых областей, а в B - их длину. При несовпадении флаг Z сброшен, иначе включен. - -x2713 LD A,(DE) ;сравнение байтов из областей - CP (HL) - RET NZ ;если они не совпали, то возврат - INC DE ;следующие байты - INC HL - DJNZ x2713 ;повтор до конца - RET ;возврат - -;Адрес #271B. Обработка ошибки NO DISC без установки TAPE LOADING ERROR. - -x271B LD HL,x27FC ;адрес сообщения NO DISC - LD A,6 ;код ошибки - 6 - JP x1C4A ;обработка ошибки - -;Адрес #2723. Обработка ошибки DIRECTORY FULL. - -x2723 LD HL,x27ED ;адрес сообщения DIRECTORY FULL - LD A,4 ;код ошибки - 4 - JP x1C4A ;обработка ошибки - -;Адрес #272B. Установка кода ошибки TAPE LOADING ERROR для ПЗУ бейсика. - -x272B LD A,#1A ;код ошибки TAPE LOADING ERROR - JR x2731 ;установка кода ошибки - -;Адрес #272F. Установка кода ошибки INVALID I/O DEVICE для ПЗУ бейсика. Используется также с адреса: -;#2731 (установка кода ошибки для пзу бейсика; код ошибки поместите в A). - -x272F LD A,#12 ;код ошибки INVALID I/O DEVICE -x2731 LD (#5C3A),A ;установка кода ошибки - RET ;возврат - -;Адрес #2735. Установка кода ошибки OUT OF MEMORY для ПЗУ бейсика. - -x2735 LD A,3 ;код ошибки OUT IF RAM - JR x2731 ;установка кода ошибки - -;Адрес #2739. Проверка дорожки. В регистре D задайте физический номер дорожки. По окончании в #5CD6 получите число битых секторов на дорожке. - -x2739 XOR A ;дорожку проверять - LD (#5CD8),A - LD (#5CD6),A ;дефектных секторов пока не нашли - IN A,(#1F) ;сохраним состояние контроллера дисководов - LD (#5CCD),A - LD E,D ;перегрузка номера дорожки в E - PUSH DE ;сохранение номера дорожки - LD A,E ;помещение номера дорожки в регистр данных - OUT (#7F),A - LD A,#18 ;позиционирование - CALL x3D9A - LD A,(#5CCD) ;берем состояние контроллера до операции - AND #80 ;дисковод был готов? - CALL NZ,x3EA0 ;если нет, то задержка в 3135098 тактов - POP DE ;восстановление номера дорожки - CALL x207D ;проверка дорожки - LD A,(#5CD6) ;битых секторов нет? - OR A - RET Z ;если да, то возврат - LD A,7 ;дисковая ошибка - LD (#5D0F),A - RET ;возврат - -;Адрес #2766. Сообщения TR-DOS. - -x2766 DB "O.K." - DB 0 -x276B DB "Verify Error." - DB #8D -x2779 DB "BACKUP DISK" - DB #8D -x2785 DB "Insert Destination disk" - DB #D - DB "then press Y" - DB 0 -x27AA DB "Insert Source disk then press Y" - DB 0 -x27CA DB "*BREAK*" - DB #8D -x27D2 DB "Out of RAM" - DB #8D -x27DD DB "Array not found" - DB #8D -x27ED DB "Directory full" - DB #8D -x27FC DB "No disk" - DB #8D -x2804 DB "Stream opened" - DB #8D -x2812 DB "Not disk file" - DB #8D -x2820 DB "File exists" - DB #D - DB "Over write?(Y/N" - -x283B XOR C - -;Адрес #283C. Вызов подпрограмм TR-DOS из машинного кода. Вход: в регистре C код команды, остальное согласно описанию. На выходе в регистре BC код ошибки. - -x283C PUSH AF ;сохранение регистров - PUSH BC - LD (#5D04),DE - LD (#5D02),HL - CALL x20F1 ;если нужно, то изменение памяти - LD A,#FF - LD (#5D15),A ;сообщения не печатать - LD (#5D1F),A ;команда поступила из машинного кода - POP BC ;восстановление BC и AF - POP AF - LD HL,#201 ;по возврату пойдем в подпрограмму возврата в - LD (#5D1A),HL ;бейсик - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#5D1C),HL - DEC HL ;резервирование места для адреса возврата по - DEC HL ;ошибке из подпрограмм бейсика - LD SP,HL - PUSH AF ;сохранение AF - CALL x021D ;установка адреса возврата по ошибке из бейсика - LD HL,x288C ;берем адрес начала таблицы команд -x2869 LD A,(HL) ;берем код команды - CP C ;он совпал с требуемым? - JR NZ,x287F ;если нет, то берем код следующей команды - POP AF ;восстановление AF - INC HL ;берем адрес, по которому находится адрес подпрограммы - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - LD HL,x01D3 ;берем адрес подпрограммы завершения - PUSH HL ;кладем его на стек - PUSH DE ;кладем на стек адрес подпрограммы - LD HL,(#5D02) ;восстановление HL и DE - LD DE,(#5D04) - RET ;переход к подпрограмме -x287F CP #FF ;достигнут конец таблицы? - JR NZ,x2887 ;если нет, то берем адрес номера следующей подпрограммы - POP AF ;снятие AF со стека (этого можно было не делать) - JP x01D3 ;переход на подпрограмму завершения -x2887 INC HL ;пропуск двух байтов адреса подпрограммы - INC HL - INC HL - JR x2869 ;повтор - -x288C DB 0 ;таблица номеров и адресов подпрограмм - DW x08A7 ;new было x3D98 - DB 1 - DW x3DCB - DB 2 - DW x3E63 - DB 3 - DW x3F02 - DB 4 - DW x3F06 - DB 5 - DW x1E3D - DB 6 - DW x1E4D - DB 7 - DW x28D8 - DB 8 - DW x165C - DB 9 - DW x1664 - DB #A - DW x1CF0 - DB #B - DW x28FB - DB #C - DW x28F2 - DB #D - DW x01D3 - DB #E - DW x290F - DB #F - DW x01D3 - DB #10 - DW x01D3 - DB #11 - DW x01D3 - DB #12 - DW x2926 - DB #13 - DW x28E0 - DB #14 - DW x28E3 - DB #15 - DW x2739 - DB #16 - DW x1FEB - DB #17 - DW x1FF6 - DB #18 - DW x0405 - DB #FF ;признак конца таблицы - -;Адрес #28D8. Выдача каталога диска с настройкой. На входе в A задайте номер потока, в который будете выводить каталог. - -x28D8 PUSH AF ;сохранение номера потока - CALL x0405 ;настройка на диск - POP AF ;восстановление номера потока - JP x0479 ;вывод каталога - -;Адрес #28E0. Перемещение описателя файла из памяти в #5CDD. В HL задайте адрес описателя файла в памяти. - -x28E0 XOR A ;перемещаем из (HL) в #5CDD - JR x28E5 ;перемещение описателя - -;Адрес #28E3. Перемещение описателя файла из #5CDD в память по адресу, установленному в HL. Используется также с адреса #28E5 (перемещение описателя файла, в HL - адрес описателя в памяти, в A - направление перемещения: 0 - из памяти, иначе - в память). - -x28E3 LD A,#FF ;перемещаем в память -x28E5 LD DE,#5CDD ;установка второго адреса для LDIR - LD BC,#10 ;установка длины описателя - OR A ;установка направления перемещения - JR Z,x28EF - EX DE,HL -x28EF LDIR ;перемещение описателя файла - RET ;возврат - -;Адрес #28F2. Запись программы на бейсике. Установите #5CD1, #5CDD и #5CE5. - -x28F2 CALL x0405 ;настройка на диск - CALL x1AC4 ;проверка свободного места в каталоге - JP x1B27 ;запись программы - -;Адрес #28FB. Запись файла. Имя с расширением поместите в #5CDD, длину в DE, начало в HL. - -x28FB LD (#5CD7),HL ;установка начала - LD (#5CD9),DE ;установка действительной длины файла - LD (#5CDB),DE ;установка длины файла для каталога - CALL x0405 ;настройка на диск - CALL x1AC4 ;проверка наличия свободного места в каталоге - JP x1B53 ;запись файла - -;Адрес #290F. Загрузка/верификация файла а также чтение/запись сектора файла. Установите #5CDD, #5CE5, #5CD7 (только для чтения/записи сектора) и #5CF9; в A поместите флаг загрузки согласно описанию команды #E в HL и DE - старт и длину (в зависимости от аккумулятора). - -x290F OR A - LD (#5CD6),A ;установка флага загрузки - LD (#5CD9),HL ;установка адреса загрузки - LD (#5CDB),DE ;установка длины загрузки - CALL x1CB3 ;поиск файла - CALL x18A4 ;если файл найден, то чтение его описателя - CALL x18AB ;обработка параметров загрузки - JP x1921 ;загрузка файла - -;Адрес #2926. Стирание файла. Установите #5CDD и #5CE5. На выходе будут установлены #5D07 и #5D08. - -x2926 CALL x0405 ;настройка на диск - CALL x1CB3 ;поиск файла - JP x07A0 ;стирание его - -;Адрес #292F. Проверка наличия файла. Имя поместите на стек калькулятора и установите #5D06. Если файл найден, то в рег. C и в #5D1E и будет включен флаг Z, иначе флаг Z будет сброшен, а в C будет #FF. - -x292F CALL x1C57 ;установка имени файла - CALL x0405 ;настройка на диск - JP x1CB3 ;поиск файла и возврат - -;Адрес #2938. Печать имени файла с расширением. В HL установите адрес имени с расширением. - -x2938 PUSH BC ;сохранение BC - LD B,8 ;в имени файла 8 символов -x293B LD A,(HL) ;берем символ из имени файла - RST #10 ;печать его - INC HL ;адрес следующего символа - DJNZ x293B ;повтор до конца - LD A,"<" ;печать "<" - RST #10 - LD A,(HL) ;печать расширения - RST #10 - LD A,">" ;печать ">" - RST #10 - POP BC ;восстановление BC - RET ;возврат - -;Адрес #294A. Создание буфера, если его нет. Установите #5D0C. - -x294A PUSH HL ;сохранение регистров - PUSH DE - PUSH BC - PUSH AF - LD HL,#5D0C ;буфер есть? - LD A,(HL) - OR A - JR Z,x2992 ;если да, то восстановление регистров и возврат - PUSH HL ;сохранение адреса флага наличия буфера - LD BC,#101 ;длина буфера - PUSH BC ;сохранение ее - CALL x19FD ;проверка возможности выделения буфера - POP BC ;восстановление длины буфера - POP HL ;восстановление адреса его флага - LD (HL),0 ;буфер есть - LD HL,#5D25 ;начало буфера - CALL x1E32 ;выделение буфера - LD HL,(#5D11) ;командная строка переместилась на #101 байтов - LD BC,#101 - ADD HL,BC - JR x298F ;установка нового адреса командной строки и возврат - -;Адрес #2970. Удаление буфера, если он есть. Установите #5D0C. Используется также с адресов #298F и #2992 подпрограммой #294A. - -x2970 PUSH HL ;сохранение регистров - PUSH DE - PUSH BC - PUSH AF - LD HL,#5D0C ;буфера нет? - LD A,(HL) - OR A - JR NZ,x2992 ;если да, то возврат - LD (HL),#FF ;буфера нет - LD HL,#5D25 ;начало буфера - LD BC,#101 ;его длина - CALL x1E2E ;удаление области памяти - OR A ;командная строка переместилась на #101 байтов - LD BC,#101 ;надо поменять ее адрес - LD HL,(#5D11) - SBC HL,BC -x298F LD (#5D11),HL -x2992 POP AF ;восстановление регистров - POP BC - POP DE - POP HL - RET ;возврат - -;Адрес #2997. Выполнение команды "40". Установите #5D11 и #5C3B. Используется также с адреса: -;#2998 (выполнение команды установки типа дисковода; установите все для #2997 плюс в A тип дисковода). - -x2997 XOR A ;дисковод 40-дорожечный односторонний - -;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. - -x2998 LD (#5CD7),A ;сохранение типа дисковода - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x042B ;проверка второго символа строки - JP Z,x1D1A ;если это ENTER, то *ERROR* - CALL x3E11 ;берем адрес ячейки с типом дисковода - LD A,(#5CD7) ;установка типа дисковода - LD (HL),A - JP x03E1 ;сообщение O.K. - -;Адрес #29AE. Выполнение команды "80". Установите #5D11 и #5C3B. - -x29AE LD A,#80 ;дисковод 80-дорожечный односторонний - -;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. - - JR x2998 ;выполнение команды - -;Адрес #29B2. Тексты сообщений TR-DOS. - -x29B2 DB #D - DB "*ERROR*" - DB #8D -x29BB DB #D - DB "No space" - DB #8D -x29C5 DB #D - DB "File exists" - DB #8D -x29D2 DB " Free" - DB #8D -x29D8 DB #D - DB "Read Onl" - DB #F9 -x29E2 DB #D - DB "Disc Erro" - DB #F2 -x29ED DB #D - DB "Rec. O/" - DB #C6 -x29F7 DB "Title:" - DB #A0 -x29FE DB #D - DB "Retry,Abort,Ignore?" - DB 0 -x2A13 DB #D - DB "Trk" - DB #A0 -x2A18 DB " sec" - DB #A0 -x2A1D DB " Del. File" - DB #8D -x2A28 DB #D - DB "No" -x2A2B DB " File(s)" - DB #8D,#00 - -;Адрес #2A35. Перенос подпрограммы определение текущего ПЗУ по адресу #4080. - -x2A35 LD HL,x2A41 ;адрес подпрограммы определение текущего ПЗУ - LD DE,#4080 ;ее адрес в ОЗУ - LD BC,#20 ;ее длина - #20 байта - LDIR ;перенос подпрограммы - RET ;возврат - -;Адрес #2A41. Подпрограмма определения текущего ПЗУ. Устанавливает #5C01 и подключает ПЗУ 48-го бейсика. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. Можно использовать также с адреса: -;#2A53 для прямого вывода в любой порт. - -x2A41 LD A,(#3B5) ;берем байт из ПЗУ - CP #F3 ;это #F3? - LD A,#10 ;если да, то это ПЗУ 48-го бейсика - JR Z,x2A4B - XOR A ;иначе это ПЗУ 128-го бейсика -x2A4B LD (#5C01),A ;установка номера ПЗУ - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,#10 ;ПЗУ 48-го бейсика -x2A53 OUT (C),A ;установка ПЗУ - RET ;возврат - -;Адрес #2A56. Запись памяти на диск. - -x2A56 jp x0807 ;new -; PUSH AF ;сохранение регистров -; PUSH BC -; PUSH DE -x2A59 PUSH HL - PUSH IX - PUSH IY - EXX - PUSH BC - PUSH DE - PUSH HL - EX AF,AF' - PUSH AF - LD A,I - PUSH AF - LD A,R - PUSH AF - LD HL,0 - ADD HL,SP ;сохранение SP - PUSH HL - LD A,#3C ;выбор дисковода A и верхней стороны диска - OUT (#FF),A - LD A,#3F ;установка регистра I - LD I,A - IN A,(#1F) ;берем состояние контроллера - AND #80 - RRCA - RRCA - RRCA - LD (#5C01),A ;сохранение его - -;Ошибка!!! Нельзя портить память. - - CALL x2F65 ;восстановление - CALL x3EA0 ;задержка в 3135098 тактов - CALL x3EA0 ;еще раз - LD DE,#A ;сектор #A - LD HL,#4000 ;записывать с адреса #4000 - PUSH HL ;сохранение числа #4000 - CALL x2D73 ;запись сектора - LD HL,#4100 ;записывать с адреса #4100 - LD DE,#B ;сектор #B - CALL x2D73 ;запись сектора - POP HL ;восстановление числа #4000 - PUSH HL ;и снова сохранение - LD DE,8 ;сектор 8 - CALL x2F1B ;загрузка сектора - LD HL,#40E3 ;берем тип диска - LD A,(HL) - LD (#5C00),A ;сохраняем его - -;Ошибка!!! Опять порча памяти. - - INC HL ;берем количество файлов на диске - LD A,(HL) - INC (HL) ;записали еще 1 файл - -;Внимание!!! Не проверяется наличие свободного места в каталоге диска. - - INC HL ;берем количество свободного места на диске - LD E,(HL) - INC HL - LD D,(HL) - OR A ;сброс флага C - EX DE,HL - LD DE,#C0 ;уменьшим количество места на диске на #C0 - SBC HL,DE ;сектора - LD (#40E5),HL ;установка нового количества свободного места на диске - LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - CALL x2D73 ;запись сектора - POP HL ;восстановление адреса #4000 - LD DE,(#40E1) ;берем адрес свободного места на диске - PUSH DE ;сохраняем его - LD DE,#A ;сектор #A - CALL x2F1B ;загрузка сектора - POP DE ;восстановление адреса свободного места на диске - CALL x2D4C ;запись секторов - PUSH DE ;сохранение нового адреса свободного места на диске - LD A,#3C ;выбор дисковода A и верхней стороны диска - OUT (#FF),A - CALL x2F65 ;восстановление - LD HL,#4000 ;грузить с адреса #4000 - LD DE,8 ;сектор 8 - LD B,1 - CALL x2F1B ;загрузка сектора - POP DE ;восстановление нового адреса свободного места на диске - LD HL,(#40E1) ;берем старый адрес свободного места на диске - LD (#40E1),DE ;установка нового адреса - PUSH HL ;сохранение старого адреса - LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - LD B,1 - CALL x2D73 ;запись сектора - LD A,(#40E4) ;берем номер записанного файла - DEC A - CALL x2CE5 ;загрузка сектора с его описателем - LD (HL),"@" ;имя файла - "@" - INC HL - LD B,7 ;7 пробелов -x2B09 LD (HL)," " - INC HL - DJNZ x2B09 - LD (HL),"C" ;расширение файла - "C" - POP DE ;восстановление старого адреса свободного места на диске - POP BC ;и значения SP после сохранения регистров - INC HL ;установка значения SP после сохранения - LD (HL),C ;в поле адреса загрузки файла - INC HL - LD (HL),B - INC HL ;поле длины файла пропускаем - INC HL - INC HL - LD (HL),#C0 ;длина файла - #C0 сектора - INC HL - LD (HL),E ;установка адреса файла на диске - INC HL - LD (HL),D - LD HL,#4000 ;записывать с адреса #4000 - LD DE,0 - IN A,(#5F) ;берем номер сектора, в котором находится - DEC A ;описатель файла - LD E,A - LD B,1 - CALL x2D73 ;запись сектора - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#4140),HL - LD SP,#41FF ;перенос стека в экран - CALL x2A35 ;перенос в экран подпрограммы определения текущего ПЗУ - LD HL,#C000 ;адрес страниц ОЗУ - XOR A ;начало вычисления контрольной суммы страницы -x2B3F ADD A,(HL) ;прибавление к сумме очередного байта - INC HL ;адрес следующего байта - LD B,A ;сохранение контрольной суммы - LD A,H ;берем старший байт текущего адреса в странице - OR A ;это 0? - LD A,B ;восстановление контрольной суммы - JR NZ,x2B3F ;если нет, то повтор - LD HL,#4100 ;сохранение контрольной суммы текущей - LD (HL),A ;страницы - PUSH HL ;сохранение ее адреса - LD HL,x2B58 ;адрес возврата - #2B58 - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - DI ;запрет прерываний - JP #4080 ;определение текущего ПЗУ -x2B58 POP HL ;восстановление адреса контрольной суммы текущей страницы - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,#AA ;контрольный байт - LD (#4130),A ;помещение его в экран - LD D,5 ;банк ОЗУ 5 - LD A,(#5C01) ;выбор ПЗУ - OR D - LD D,A - OUT (C),D ;выбор банка памяти - LD A,(#C130) ;берем адрес контрольного байта - CP #AA ;это #AA? - JP NZ,x2C1B ;если нет, то выход - LD A,D ;ОЗУ 0 - AND #F8 - LD D,A - INC HL ;адрес переменной с кодом текущего банка памяти - LD B,8 ;всего 8 страниц -x2B79 LD (HL),D ;установка банка - OUT (C),D ;выбор банка - XOR A ;начало вычисления контрольной суммы страницы - LD HL,#C000 ;адрес страниц ОЗУ -x2B80 ADD A,(HL) ;прибавление к сумме очередного байта - INC HL ;адрес следующего байта - LD E,A ;сохранение контрольной суммы - LD A,H ;берем старший байт текущего адреса в странице - OR A ;это 0? - LD A,E ;восстановление контрольной суммы - JR NZ,x2B80 ;если нет, то повтор - LD HL,#4100 ;адрес переменной с контрольной суммой текущей страницы - CP (HL) ;суммы совпадают? - INC HL ;адрес переменной с кодом текущего банка памяти - JR Z,x2B93 ;если да, то все - INC D ;следующая страница ОЗУ - DJNZ x2B79 ;повтор до конца - DEC D ;берем код текущего банка памяти -x2B93 LD B,8 ;всего 8 страниц -x2B95 PUSH BC ;сохранение числа страниц - CALL x2C37 ;запись страницы - POP BC ;восстановление числа страниц - DJNZ x2B95 ;повтор до конца - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D2A ;загрузка сектора 8 по адресу #4000 - LD A,(#40E4) ;берем количество файлов на диске - LD (#4102),A ;сохраняем его - INC A ;записали еще 1 файл - LD (#40E4),A ;установка нового количества файлов - LD HL,(#40E5) ;берем количество свободного места на диске - LD DE,1 ;уменьшаем его на 1 сектор - SBC HL,DE - LD (#40E5),HL ;установка нового количества свободного места на диске - RET C ;если места на диске нет, то возврат - -;Внимание!!! Куда возврат? Ведь на вершине стека находится сохраненные регистры R и F. - - LD HL,(#40E1) ;берем адрес свободного места на диске - LD (#411E),HL ;сохраняем его - CALL x2D1E ;установка имени файла - LD A,"8" ;восьмой файл - LD (#4111),A - LD A,1 ;его длина - 1 сектор - LD (#411D),A - LD HL,#4100 ;адрес загрузки - #4100 - LD (#4119),HL - LD HL,#100 ;длина - #100 байтов - LD (#411B),HL - LD DE,(#40E1) ;берем адрес свободного места на диске - CALL x2F65 ;восстановление - LD C,D ;берем номер дорожки - CALL x2F3A ;позиционирование - LD HL,#4100 ;записывать с адреса #4100 - LD B,1 ;1 сектор - CALL x2D58 ;запись сектора - LD (#40E1),DE ;установка нового адреса свободного места на диске - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D34 ;запись сектора 8 с адреса #4000 - LD A,(#4102) ;берем номер записанного файла - CALL x2CE5 ;загрузка сектора с его описателем - LD DE,#4110 ;замена описателя файла - LD BC,#10 - EX DE,HL - LDIR - IN A,(#5F) ;берем номер загруженного сектора - DEC A - LD E,A - LD D,0 - LD HL,#4000 ;записывать с адреса #4000 - CALL x2D73 ;запись сектора - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,(#4101) ;берем код текущего банка памяти - OUT (C),A ;установка его -x2C1B LD HL,(#4140) ;восстановление SP - LD SP,HL - LD HL,#4000 ;загружать с адреса #4000 - LD DE,#A ;сектор #A - CALL x2F1B ;загрузка сектора - LD HL,#4100 ;загружать с адреса #4100 - LD DE,#B ;сектор #B - CALL x2F1B ;загрузка сектора - LD A,#3C ;помещение на стек числа #3C - PUSH AF - JP x2EBC ;восстановление регистров и возврат - -;Адрес #2C37. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы плюс 1 и установите #5C00 и #4101. - -x2C37 LD A,B ;берем номер страницы - DEC A - LD (#4103),A ;установка его - LD B,A ;сохранение его - LD A,(#4101) ;берем номер текущей страницы - AND 7 - CP B ;записываем ее? - RET Z ;если да, то возврат - LD A,2 ;записываем страницу 2? - CP B - RET Z ;если да, то возврат - LD A,(#4101) ;берем код текущего банка памяти - AND 8 ;текущий экран 0? - JR Z,x2C55 ;если да, то не записываем страницу 5 - LD A,B ;записываем страницу 7? - CP 7 - RET Z ;если да, то возврат - JR x2C59 ;запись страницы -x2C55 LD A,B ;записываем страницу 5? - CP 5 - RET Z ;если да, то возврат -x2C59 CALL x2C5D ;запись страницы - RET ;возврат - -;Адрес #2C5D. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы и установите #5C00 и #4101. - -x2C5D LD HL,#4101 ;берем код текущего банка памяти - LD A,(HL) - AND #F8 ;оставляем экран и ПЗУ - LD C,A - LD A,B ;вычисление байта для порта конфигурации - OR C ;системы - PUSH BC ;сохранение кода текущего банка памяти - LD BC,#7FFD ;адрес порта конфигурации - OUT (C),A ;установка банка памяти - POP BC ;восстановление кода текущего банка - LD HL,#C000 ;адрес страницы -x2C70 LD A,(HL) ;берем байт из страницы - OR A ;это 0? - JR NZ,x2C7A ;если нет, то запись страницы - INC HL ;следующий байт - LD A,H ;конец страницы? - OR A - JR NZ,x2C70 ;если нет, то повтор - RET ;возврат -x2C7A CALL x2C7E ;запись страницы - RET ;возврат - -;Адрес #2C7E. Запись страницы ОЗУ. Установите #4103 и #5C00. - -x2C7E LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D2A ;загрузка сектора 8 по адресу #4000 - LD A,(#40E4) ;берем количество файлов на диске - LD (#4102),A ;сохраняем его - INC A ;записали 1 файл - LD (#40E4),A - LD HL,(#40E5) ;берем количество свободного места на диске - LD DE,#40 ;уменьшаем его на #40 секторов - SBC HL,DE - LD (#40E5),HL ;установка нового количества свободного места - RET C ;если места нет, то возврат - LD HL,(#40E1) ;берем адрес свободного места на диске - LD (#411E),HL ;установка адреса файла на диске - CALL x2D1E ;установка имени файла - LD A,#40 ;размер файла - #40 секторов - LD (#411D),A - LD HL,#C000 ;адрес загрузки - #C000 - LD (#4119),HL - LD HL,#4000 ;длина - #4000 байта - LD (#411B),HL - LD DE,(#40E1) ;берем адрес свободного места на диске - CALL x2D3E ;запись файла - LD (#40E1),DE ;установка нового адреса свободного места - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D34 ;запись сектора 8 с адреса #4000 - LD A,(#4102) ;восстановление номера файла - CALL x2CE5 ;загрузка сектора с описателем файла - LD DE,#4110 ;замена описателя файла - LD BC,#10 - EX DE,HL - LDIR - IN A,(#5F) ;берем номер загруженного сектора - DEC A - LD E,A - LD D,0 - LD HL,#4000 ;записывать с адреса #4000 - CALL x2D73 ;запись сектора - RET ;возврат - -;Адрес #2CE5. Загрузка по адресу #4000 Номер файла поместите в A. На выходе в HL будет адрес описателя файла. - -x2CE5 LD C,A ;сохранение номера файла - AND #F0 ;вычисление номера сектора с описателем файла - RRCA - RRCA - RRCA - RRCA - LD B,A - PUSH BC - LD E,B - LD D,0 - LD HL,#4000 ;загружать с адреса #4000 - PUSH DE ;сохранение номера сектора - CALL x2F1B ;загрузка сектора - POP DE ;восстановление номера сектора - POP BC ;и номера файла - LD B,0 - LD A,C ;вычисление относительного адреса описателя - AND #F ;файла в секторе - RLCA - RLCA - RLCA - RLCA - LD HL,#4000 ;вычисление абсолютного адреса - ADD A,L - LD L,A - RET ;возврат - -;Адрес #2D09. Помещение имени и расширения файла "@"CODE по адресу #4110. - -x2D09 LD HL,#4110 ;адрес имени файла - LD B,9 ;длина области - 9 байтов -x2D0E LD (HL)," " ;очистка области - INC HL - DJNZ x2D0E - LD A,"@" ;имя файла - "@" - LD (#4110),A - LD A,"C" ;расширение файла - "C" - LD (#4118),A - RET ;возврат - -;Адрес #2D1E. Установка имени файла страницы. Установите #4103. Имя файла будет находиться по адресу #4110. - -x2D1E CALL x2D09 ;установка имени главного файла - LD A,(#4103) ;берем номер страницы - ADD A,"0" ;преобразование его в символ - LD (#4111),A ;установка номера страницы - RET ;возврат - -;Адрес #2D2A. Загрузка сектора 8 по адресу #4000. Спозиционируйте головку. - -x2D2A LD HL,#4000 ;грузить по адресу #4000 - LD DE,8 ;сектор 8 - CALL x2F1B ;загрузка сектора - RET ;возврат - -;Адрес #2D34. Запись сектора 8 с адреса #4000. Спозиционируйте головку. - -x2D34 LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - CALL x2D73 ;запись сектора - RET ;возврат - -;Адрес #2D3E. Запись #40-х секторов с адреса #C000. Установите все для #2D4C. - -x2D3E CALL x2F65 ;восстановление - LD C,D ;берем номер первой дорожки - CALL x2F3A ;позиционирование - LD HL,#C000 ;записывать с адреса #C000 - LD B,#40 ;#40 секторов - JR x2D58 ;запись секторов и возврат - -;Адрес #2D4C. Запись #C0 секторов с адреса #4000 для подпрограммы MAGIC. В DE поместите адрес на диске и установите #5C00. Используется также с адреса: -;#2D58 (запись секторов; в HL поместите адрес в памяти, в DE - адрес на диске, в B ? количество секторов, установите #5C00 и спозиционируйте головку на первую дорожку). - -x2D4C CALL x2F65 ;восстановление - LD C,D ;берем номер первой дорожки - CALL x2F3A ;позиционирование - LD HL,#4000 ;записывать с адреса #4000 - LD B,#C0 ;#C0 секторов -x2D58 PUSH BC ;сохранение количества секторов - PUSH DE ;и адреса на диске - CALL x2D73 ;запись сектора - LD DE,#100 ;адрес следующего сектора в памяти - ADD HL,DE - POP DE ;восстановление адреса на диске - INC E ;следующий сектор - LD A,E ;конец дорожки? - CP #10 - JR NZ,x2D6F ;если да, то - LD E,0 ;текущий сектор 0, - INC D ;следующая дорожка, - LD C,D - CALL x2F3A ;позиционирование -x2D6F POP BC ;восстановление количества секторов - DJNZ x2D58 ;повтор до конца - RET ;возврат - -;Адрес #2D73. Запись сектора для команды GO TO. В HL поместите адрес записи, в E - номер сектора. - -x2D73 LD A,E ;установка номера сектора - INC A - OUT (#5F),A - PUSH HL ;сохранение адреса записи - LD D,#14 ;20 попыток - PUSH DE ;сохранение числа попыток -x2D7B DI ;запрет прерываний - LD C,#7F ;адрес регистра данных контроллера - LD A,#A0 ;команда записи сектора - OUT (#1F),A - CALL x3FCA ;запись байтов - POP DE ;восстановление количества попыток - POP HL ;и адреса записи сектора - IN A,(#1F) ;берем состояние контроллера - AND #7F ;все в порядке? - RET Z ;если да, то возврат - DEC D ;следующая попытка - PUSH HL ;сохранение адреса записи сектора - PUSH DE ;и количества попыток - JR NZ,x2D7B ;если попытки не кончились, то повтор - -;Внимание!!! Самая большая ошибка!!! Диск с заклеенной прорезью защиты от записи будет, скорее всего, испорчен. Подробное объяснение вы найдете в ZX-PЕВЮ #5F/4 на странице #23. - - HALT ;остановка процессора - -;Адрес #2D92. Загрузка секторов. Установите #5CE6, #5CEB и #5CEA. - -x2D92 LD HL,(#5CE6) ;берем адрес загрузки - LD DE,(#5CEB) ;берем адрес секторов на диске - LD A,(#5CEA) ;берем количество секторов - LD B,A - CALL x1E3D ;загрузка секторов - RET ;возврат - -;Адрес #2DA1. Выполнение команды GO TO. Установите #5D11 и #5C3B. Можно использовать также с адреса #2E27 (GO TO для 48К; параметры, как и для #2DA1). Используется также с адреса #2EBC для возврата из подпрограммы обработки немаскируемого прерывания. - -x2DA1 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - -;Зачем это нужно? Ведь MAGIC записывает файлы только с расширением C. - - CALL x1C57 ;установка имени файла - LD (#4020),BC ;сохранение длины имени файла - LD A,C ;она равна 8 символам? - CP 8 - JR NC,x2DD2 ;если да, то работа с 48К - CALL x0405 ;настройка на диск - CALL x1CB3 ;поиск файла - JP NZ,x03D9 ;если не нашли, то NO FILE - LD HL,#5CDD ;берем адрес имени файла - LD BC,(#4020) ;и его длину - -;Зачем портить экран без надобности? Ведь длину имени файла можно сохранять и в другом месте. - - ADD HL,BC ;вычисляем адрес конца имени файла - LD (HL),"8" ;прибавление "8" к имени файла - PUSH HL ;сохранение адреса этого символа - CALL x1CB3 ;поиск файла - POP HL ;восстановление последнего символа имени файла - JR Z,x2DD8 ;если файл нашелся, то загрузка страниц - LD (HL)," " ;восстановление имени главного файла -x2DD2 CALL x1CB3 ;поиск файла - JP x2E33 ;загрузка файла -x2DD8 CALL x165D ;чтение описателя файла - CALL x2D92 ;загрузка файла - LD SP,#40FF ;перенос стека - LD B,8 ;всего 8 страниц -x2DE3 PUSH BC ;сохранение номера файла страницы - LD A,B - LD BC,#7FFD ;адрес порта конфигурации системы - DEC A ;страницы считаем с 0 - PUSH AF ;сохранение номера страницы - OR #10 ;экран 0, ПЗУ 1 - OUT (C),A ;установка страницы - POP AF ;восстановление номера страницы - ADD A,"0" ;вычисление последнего символа имени файла страницы - LD HL,#5CDD ;вычисление адреса для этого символа - LD BC,(#4020) - ADD HL,BC - LD (HL),A ;установка последнего символа имени файла страницы - CALL x1CB3 ;поиск файла - JR NZ,x2E05 ;если не нашли, то загрузка следующей страницы - CALL x165D ;чтение описателя файла - CALL x2D92 ;загрузка файла - -;Внимание!!! При ответе A на вопpос "DISC ERROR. RETRY,ABORT,IGNORE?", может произойти что угодно, если значение ERR_SP больше #C000, так как старый стек будет затираться загружаемым файлом или находиться в другой странице. - -x2E05 POP BC ;восстановление номера файла страницы - DJNZ x2DE3 ;повтор до конца - LD A," " ;восстановление имени главного файла - LD HL,#5CDD - LD BC,(#4020) - ADD HL,BC - LD (HL),A - CALL x1CB3 ;поиск файла - CALL x165D ;чтение описателя файла - PUSH BC ;сохранение номера файла - PUSH AF ;и AF - LD BC,#7FFD ;адрес порта конфигурации - LD A,(#4101) ;берем его значение в момент записи файла (из восьмого файла) - OUT (C),A ;установка рабочего состояния порта - POP AF ;востановление номера файла и AF - POP BC - JR x2E39 ;загрузка главного файла -x2E27 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - CALL x292F ;поиск файла -x2E33 JP NZ,x03D9 ;если он не найден, то NO FILE - CALL x165D ;чтение его описателя -x2E39 LD A,(#5CDD) ;берем первый символ имени файла - CP "$" ;это "$"? - DI ;запрет прерываний - JR NZ,x2E43 ;если да, то - IM 2 ;установка второго режима прерываний -x2E43 LD SP,#40F0 ;перенос стека - CALL x3E11 ;берем тип дисковода - LD (#4010),A ;сохраняем его - LD A,(#5D16) ;сохранение копии системного регистра, - LD (#4011),A - LD HL,(#5CE6) ;адреса стека для программы, - PUSH HL - LD DE,(#5CEB) ;и адреса файла на диске - PUSH DE - INC E ;первый сектор файла пока не загружаем - LD A,E - CP #10 - JR NZ,x2E64 - LD E,0 - INC D -x2E64 LD C,D ;берем логический номер дорожки - CALL x2F07 ;выбор верхней стороны диска - LD A,(#4010) ;берем режим дисковода - AND 2 ;дисковод двухсторонний? - CALL NZ,x2F0F ;если да, то выбор стороны диска - LD A,C ;берем физический номер дорожки - CALL x2F50 ;позиционирование - LD HL,#4100 ;загружать с адреса #4100 - LD B,#BF ;#BF секторов -x2E79 PUSH BC ;сохранение количества секторов - PUSH DE ;и адреса текушего сектора на диске - CALL x2F1B ;загрузка сектора - LD DE,#100 ;вычисление адреса загрузки следующего сектора - ADD HL,DE - POP DE ;восстановление адреса текушего сектора на диске - INC E ;следующий сектор - LD A,E ;конец дорожки? - CP #10 - JR NZ,x2E9C ;если нет, то продолжение загрузки - LD E,0 ;сектор 0 - INC D ;следующая дорожка - LD C,D - CALL x2F07 ;позиционирование (смотрите выше) - LD A,(#4010) - AND 2 - CALL NZ,x2F0F - LD A,C - CALL x2F50 -x2E9C POP BC ;восстановление количества секторов - DJNZ x2E79 ;повтор до конца - POP DE ;восстановление адреса файла на диске - POP HL ;и адреса стека - LD SP,HL ;установка стека - LD A,(#4011) ;берем копию системного регистра - PUSH AF ;сохраняем ее - LD C,D ;позиционирование (смотрите выше) - CALL x2F07 - LD A,(#4010) - AND 2 - CALL NZ,x2F0F - LD A,C - CALL x2F50 - LD HL,#4000 ;адрес загрузки первого сектора файла - CALL x2F1B ;загрузка сектора -x2EBC POP AF ;востановление копии системного регистра - EX AF,AF' ;и снова сохранение - POP AF ;восстановление регистров R и I - LD R,A - POP AF - LD I,A - DI ;запрет прерываний - LD A,#FF ;установка флага прерываний - JP PO,x2ECC - LD A,0 -x2ECC LD (#5C00),A - POP AF ;восстановление регистров - POP HL - POP DE - POP BC - EXX - EX AF,AF' - POP IY - POP IX - POP HL - POP DE - POP BC - LD A,(#5C48) ;установка цвета бордюра - AND #38 - RRCA - RRCA - RRCA - nop ;new - nop ;new -; OUT (#FE),A - LD A,(#5B08) ;берем байт из #5B08 - CP #EE ;там #EE? - JR NZ,x2EF7 ;если нет, то системных переменных 128К нет - -;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. - - PUSH BC ;сохранение BC - LD BC,#7FFD ;адрес порта конфигурации - LD A,(#5B5C) ;берем значение переменной BANK_M - OUT (C),A ;установка рабочей страницы - POP BC ;восстановление BC -x2EF7 LD A,(#5C00) ;берем флаг прерываний - OR A ;прерывания разрешать? - LD A,#C9 ;установка переключателя ПЗУ на бейсик - LD (#5C00),A - JR NZ,x2F03 ;если в #5C00 был 0, то - EI ;разрешение прерываний -x2F03 POP AF ;восстановление AF - JP #5C00 ;запуск программы - -;Адрес #2F07. Выбор верхней стороны диска для команды GO TO. Установите #4011. Можно использовать также с адреса: -;#2F0C для прямого вывода в порт #FF. - -x2F07 LD A,(#4011) ;берем копию системного регистра - OR #3C ;сторона - верхняя -x2F0C OUT (#FF),A ;загрузка системного регистра - RET ;возврат - -;Адрес #2F0F. Выбор верхней стороны диска для команды GO TO. Вход: установите #4011, поместите в C логический номер дорожки и выберите верхнюю сторону диска. Выход: в C будет физический номер дорожки и выбрана сторона диска. - -x2F0F LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - RET NC ;если дорожка четная, то возврат - LD A,(#4011) ;берем копию системного регистра - AND #6F ;сторона - нижняя - JR x2F0C ;загрузка системного регистра и возврат - -;Адpес #2F1B. Чтение сектора для команды GO TO. В HL поместите адрес загрузки, в E - номер сектора. - -x2F1B LD A,E ;установка номера сектора - INC A - OUT (#5F),A - PUSH HL ;сохранение адреса загрузки - LD D,#14 ;20 попыток - PUSH DE ;сохранение числа попыток -x2F23 DI ;запрет прерываний - LD C,#7F ;адрес регистра данных контроллера - LD A,#80 ;команда чтения сектора - OUT (#1F),A - CALL x3FE5 ;чтение байтов - POP DE ;восстановление количества попыток - POP HL ;и адреса загрузки сектора - IN A,(#1F) ;берем состояние контроллера - AND #7F ;все в порядке? - RET Z ;если да, то возврат - DEC D ;следующая попытка - PUSH HL ;сохранение адреса загрузки сектора - PUSH DE ;и количества попыток - JR NZ,x2F23 ;если попытки не кончились, то повтор - HALT ;остановка процессора - -;Адрес #2F3A. Позиционирование для подпрограммы MAGIC. Логический номер дорожки поместите в C и установите #5C00. Используется также с адресов: -;#2F50 - позиционирование для команды GO TO. Поместите в A физический номер дорожки. -;#2F57 - выдача команды и ожидание INTRQ. Команду поместите в A. - -x2F3A LD A,#3C ;выбор верхней стороны диска - OUT (#FF),A - LD A,(#5C00) ;берем тип дисковода - AND 8 ;он двухсторонний? - JR NZ,x2F4F ;если нет, то позиционирование - LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - JR NC,x2F4F ;если дорожка четная, то позиционирование - LD A,#2C ;выбор нижней стороны диска - OUT (#FF),A -x2F4F LD A,C -x2F50 OUT (#7F),A ;загрузка номера дорожки в регистр данных - CALL x3DFD ;задержка в 725779 тактов - LD A,#18 ;new команда позиционирования -x2F57 OUT (#1F),A -x2F59 IN A,(#FF) ;ожидание сигнала INTRQ - AND #80 - JR Z,x2F59 - PUSH BC ;сохранение BC - CALL x3DFD ;задержка в 725779 тактов - POP BC ;восстановление BC - RET ;возврат - -;Адрес #2F65. Восстановление для подпрограммы MAGIC. - -x2F65 LD A,#08 ;new команда восстановления - JR x2F57 ;выдача команды, ожидание INTRQ и возврат - -;Адрес #2F69. Подпрограмма обработки ошибок, поступающих из ПЗУ бейсика. Установите #5C3A и все для подпрограммы #1D3. - -x2F69 LD HL,(#5D1C) ;очистка стека - DEC HL - DEC HL - LD SP,HL - JP x1D2F ;выдача сообщения и завершение - -;Адрес #2F72. Вызов подпрограмм из ПЗУ бейсика. Адрес задайте в двух байтах после CALL #2F72: -;CALL #2F72 -;DW #0D6B - -x2F72 LD (#5D02),HL ;сохранение HL и DE - LD (#5D04),DE - POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - INC HL - PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую #2F72 - LD HL,x3D2F ;помещение на стек адреса переключателя ПЗУ на TR-DOS - PUSH HL - PUSH DE ;помещение на стек адреса вызываемой подпрограммы - LD HL,#5CC2 ;помещение на стек адреса команды RET в ОЗУ - PUSH HL - LD HL,(#5D02) ;восстановление HL и DE - LD DE,(#5D04) - RET ;переход к команде RET в ОЗУ - -;Адрес #2F90. Установка начальных значений системных пеpеменных TR-DOS. В переменные помещает: -;в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16, #5D0C - #FF; #5D17 - #5D19, #5D1F - 0; #5CC2 - #C9; в системный регистр помещается #FF и выполняется команда прерывания. Подпрограмма может использоваться также с адреса: -;#2FC3 для прямого вывода в порт #1F. - -x2F90 LD HL,#0000 ;new было #FFFF - LD (#5CFA),HL ;типы дисководов неизвестны - LD (#5CFC),HL - call x08CA ;new - LD (#5CC8),HL ;время перемещения головок дисководов -; LD (#5CCA),HL ;неизвестно - XOR A - LD (#5D17),A ;заставку выводить - LD (#5D19),A ;дисковод по умолчанию - A: - LD (#5D18),A ;память не изменять - LD (#5D0F),A ;pаботает командный процессор TR-DOS - LD (#5D1F),A - LD A,#FF ;загрузка системного регистра - OUT (#FF),A - LD (#5C3A),A ;ошибки нет - LD (#5D16),A ;сохранение значения системного регистра - LD (#5D0C),A ;буфера нет - LD A,#C9 ;помещение в ОЗУ команды RET - LD (#5CC2),A - LD A,#D0 ;команда прерывания -x2FC3 OUT (#1F),A ;выдача команды - RET ;возврат - -;Адрес #2FC6. Проверка достижения конца каталога при его печати. - -x2FC6 CALL x050C ;проверка и обработка достижения конца буфера - LD A,(HL) ;берем первый символ имени файла - OR A ;конец каталога? - JP Z,x03AC ;если да, то окончание выдачи - CP 1 ;файл стерт? - CALL Z,x0507 ;если да, то пропуск его - RET NZ ;иначе возврат - JR x2FC6 ;повтор - -;Адрес #2FD6. Загрузка сектора в буфер. В DE поместите адрес сектора на диске. - -x2FD6 LD B,1 ;загружать 1 сектор - LD HL,#5D25 ;загружать в буфер - JP x1E67 ;загрузка сектора - -;Адрес #2FDE. Загрузка конца файла. В HL - адрес загрузки, в #5CDC - длина, в #5CF4 - откуда грузить. - -x2FDE PUSH HL ;сохранение адреса загрузки - LD DE,(#5CF4) ;берем адрес сектора на диске - CALL x2FD6 ;загрузка его в буфер - LD A,(#5CDB) ;берем количество байтов для загрузки - POP DE ;восстановление адреса загрузки - OR A ;загружаем 0 байтов? - RET Z ;если да, то возврат - LD C,A ;перевод длины загружаемой части в двухбайтную форму - LD HL,#5D25 ;перемещаем байты из буфера - LDIR - RET ;возврат - -;Адрес #2FF3. Таблица команд TR-DOS. - -x2FF3 DB #CF,"*",#D0,#D1,#E6,#D2,#EF,#F8,#FE,#BE,#F4,#D5,#F7 - DB #D3,#D4,#FF,"4",#EC,"8",#F0,#D6 - -;Адрес #3008. Таблица адресов подпрограмм, выполняющих команды TR-DOS. - -x3008 DW x0433,x1018,x1EC2,x16AB,x053A,x0787,x1815,x1AD0,x1CFB,x19A5 - DW x19A9,x19B1,x1D4D,x2182,x2656,x0690,x2997,x2DA1,x29AE,x11CE - DW x1810 - -;Адрес #3032. Сжатие командной строки. Строку поместите в буфер редактора. Помещает в #5CD6 #FF и устанавливает #5D11. - -x3032 LD HL,(#5C59) ;берем адрес буфера редактора - LD (#5D11),HL ;установка адреса командной строки - LD (#5CD9),HL ;установка адреса текущего символа - LD A,#FF ;подана прямая команда - LD (#5CD6),A - LD HL,#5CDB ;любой адрес - LD (#5CD7),HL - JR x3057 ;сжатие строки и возврат - -;Адрес #3048. Сжатие командной строки. В HL поместите адрес строки. Устанавливает #5CD6 и #5D11. Используется также с адреса: -;#3057 (сжатие строки; установите #5CD6, #5CD7 и #5CD9). - -x3048 LD (#5D11),HL ;установка адреса строки - LD (#5CD9),HL ;и адреса текущего ключевого слова - CALL x30E1 ;проверка, где находится строка - RET NZ ;если строка не найдена, то возврат - INC HL ;вычисление адреса поля длины строки - INC HL - LD (#5CD7),HL ;установка адреса поля длины строки -x3057 CALL x30A9 ;определение номера ключевого слова - JR NZ,x3087 ;если это не ключевое слово, то следующий символ - EX DE,HL ;переброска адреса последнего символа ключевого слова в DE - INC DE ;вычисление адреса символа после ключевого слова - LD B,0 ;перевод номера ключевого слова в 2-х байтную форму - LD HL,x31C8 ;адрес таблицы кодов ключевых слов - ADD HL,BC ;вычисление адреса кода ключевого слова - LD A,(HL) ;берем этот код - LD HL,(#5CD9) ;берем адрес ключевого слова - LD (HL),A ;замена его одним символом - INC HL ;вычисление адреса второго символа ключевого слова - EX DE,HL ;переброска его в DE - RST #20 ;вычисление количества стираемых символов - DW #19DD - PUSH BC ;сохранение его - RST #20 ;уничтожение ненужных символов - DW #19E8 - POP BC ;восстановление количества стертых символов - LD A,(#5CD6) ;строка находится в программе на бейсике? - OR A - JR NZ,x3087 ;если нет, то ее длина нигде не обозначена - LD HL,(#5CD7) ;берем адрес поля длины строки - LD E,(HL) ;берем длину строки - INC HL - LD D,(HL) - EX DE,HL ;перебросим ее в HL - OR A - SBC HL,BC ;скорректируем ее - EX DE,HL ;перебросим в DE - LD (HL),D ;и загрузим обратно - DEC HL - LD (HL),E -x3087 LD HL,(#5CD9) ;берем адрес текущего символа - LD A,(HL) ;берем этот символ - CP #D ;это ENTER? - RET Z ;если да, то возврат - INC HL ;следующий символ - LD (#5CD9),HL - LD A,(HL) ;берем его - CP #D ;это ENTER? - RET Z ;если да, то возврат - CP #22 ;это кавычки? - JR NZ,x3057 ;если нет, то повтор -x309A INC HL ;следующий символ - LD A,(HL) ;берем его - CP #D ;это ENTER? - RET Z ;если да, то возврат - CP #22 ;это кавычки? - JR NZ,x309A ;если нет, то следующий символ - INC HL ;следующий символ - LD (#5CD9),HL - JR x3057 ;повтор - -;Адрес #30A9. Определение номера ключевого слова. Установите #5CD9. После возврата если флаг Z установлен, то в C будет номер ключевого слова, а в HL - адрес последнего символа ключевого слова; иначе ключевое слово не было опознано, а в HL будет адрес из #5CD9. - -x30A9 LD HL,(#5CD9) ;берем адрес ключевого слова в строке - LD DE,x30FD ;адрес таблицы ключевых слов - LD C,0 ;начнем со слова 0 -x30B1 LD A,(HL) ;берем символ слова из нашей строки - AND #DF ;буква заглавная - LD B,A ;загрузка символа в B - OR A ;это CHR$ 0? - JR NZ,x30BB ;если да, то - INC HL ;следующий символ - JR x30B1 ;и повтор -x30BB LD A,(DE) ;берем символ из таблицы - AND #80 ;его бит 7 включен? - JR NZ,x30C8 ;если да, то этот символ последний - LD A,(DE) ;снова берем символ из таблицы - CP B ;сравнение символов - JR NZ,x30D9 ;если они не совпадают, то проверка следующего слова - INC HL ;адреса следующих символов - INC DE - JR x30B1 ;повтор -x30C8 LD A,(DE) ;берем символ из таблицы - AND #7F ;сбрасываем бит 7 - CP B ;сравниваем символы - RET Z ;если они совпали, то возврат -x30CD INC C ;номер следующего слова - LD HL,(#5CD9) ;берем адрес ключевого слова в строке - INC DE ;следующий символ из таблицы - LD A,(DE) - CP #FF ;конец таблицы? - JR NZ,x30B1 ;если нет, то повтор - OR A ;сброс флага Z - RET ;возврат -x30D9 INC DE ;следующий символ из таблицы - LD A,(DE) - AND #80 ;его бит 7 включен? - JR Z,x30D9 ;если да, то следующий символ - JR x30CD ;проверка достижения конца таблицы - -;Адрес #30E1. Проверка местонахождения строки. Устанавливает #5CD6, а в HL помещает адрес поля длины строки минус 2. - -x30E1 LD HL,(#5C45) ;берем номер выполняющейся строки - INC HL ;подана прямая команда? - INC HL - LD A,H - OR L - JR Z,x30F4 ;если да, то установка флага - XOR A ;команда находится в строке программы на бейсике - LD (#5CD6),A - DEC HL ;восстановление номера строки - DEC HL - RST #20 ;определение адреса строки - DW #196E - RET ;возврат -x30F4 LD A,#FF ;подана прямая команда - LD (#5CD6),A - LD HL,(#5C59) ;любой адрес - RET ;возврат - -;Адрес #30FD. Таблица ключевых слов TR-DOS. - -x30FD DB "SAVE" - DB #80 - DB "SAV" - DB #C5 - DB "LOAD" - DB #80 - DB "LOA" - DB #C4 - DB "RUN" - DB #80 - DB "RU" - DB #CE - DB "CAT" - DB #80 - DB "CA" - DB #D4 - DB "ERASE" - DB #80 - DB "ERAS" - DB #C5 - DB "NEW" - DB #80 - DB "NE" - DB #D7 - DB "MOVE" - DB #80 - DB "MOV" - DB #C5 - DB "MERGE" - DB #80 - DB "MERG" - DB #C5 - DB "PEEK" - DB #80 - DB "PEE" - DB #CB - DB "POKE" - DB #80 - DB "POK" - DB #C5 - DB "OPEN" - DB #83 - DB "CLOSE" - DB #83 - DB "CODE" - DB #80 - DB "COD" - DB #C5 - DB "RND" - DB #80 - DB "RN" - DB #C4 - DB "DATA" - DB #80 - DB "DAT" - DB #C1 - DB "SCREEN" - DB 4,#84 - DB "SCREEN" - DB #84 - DB "COPY" - DB #80 - DB "COP" - DB #D9 - DB "FORMAT" - DB #80 - DB "FORMA" - DB #D4 - DB "GOTO" - DB #80 - DB "GOT" - DB #CF - DB "LIST" - DB #80 - DB "LIS" - DB #D4 - DB "LINE" - DB #80 - DB "LIN" - DB #C5 - DB "VERIFY" - DB #80 - DB "VERIF" - DB #D9 - DB #FF,#FF - -;Адрес #31C8. Таблица кодов ключевых слов TR-DOS. - -x31C8 DB #F8,#F8,#EF,#EF,#F7,#F7,#CF,#CF,#D2,#D2,#E6,#E6,#D1 - DB #D1,#D5,#D5,#BE,#BE,#F4,#F4,#D3,#D4,#AF,#AF,#A5,#A5 - DB #E4,#E4,#AA,#AA,#FF,#FF,#D0,#D0,#EC,#EC,#F0,#F0,#CA - DB #CA,#D6,#D6,0 - -;Адрес #31F3. Проверка наличия системных переменных TR-DOS. Если они есть, то флаг C будет сброшен, иначе установлен. - -x31F3 LD HL,(#5C4F) ;берем адрес области описателей каналов - OR A ;для правильного вычитания - LD BC,#5D25 ;адрес области описателей каналов при наличии системных переменных TR-DOS. - SBC HL,BC ;установка флага C - RET ;возврат - -x31FD DISPLAY "Free space at ",$,": ",/D,#3201-$," byte(s)" - DS #3201-$,#FF - -x3201 ld hl,x3219 - ld de,#FCA0 - ld bc,#0318 - ld a,#FF - jr x3210 -x320E inc hl - inc hl -x3210 cp l - jr z,x320E - ldi - jp pe,x3210 - ret - -;шрифт -x3219 db #00,#00,#00,#00,#00,#00,#00,#00 - db #00,#20,#20,#20,#20,#20,#00,#20 - db #00,#50,#50,#00,#00,#00,#00,#00 - db #00,#00,#50,#F8,#50,#F8,#50,#00 - db #00,#20,#70,#A0,#70,#28,#70,#20 - db #00,#40,#48,#10,#20,#48,#08,#00 - db #00,#20,#50,#50,#60,#A8,#90,#68 - db #00,#20,#40,#00,#00,#00,#00,#00 - db #00,#08,#10,#10,#10,#10,#10,#08 - db #00,#40,#20,#20,#20,#20,#20,#40 - db #00,#00,#50,#20,#F8,#20,#50,#00 - db #00,#00,#20,#20,#F8,#20,#20,#00 - db #00,#00,#00,#00,#00,#60,#20,#40 - db #00,#00,#00,#00,#F8,#00,#00,#00 - db #00,#00,#00,#00,#00,#00,#60,#60 - db #00,#00,#08,#10,#20,#40,#80,#00 - db #00,#70,#88,#98,#A8,#C8,#88,#70 - db #00,#20,#60,#A0,#20,#20,#20,#F8 - db #00,#70,#88,#08,#30,#40,#80,#F8 - db #00,#70,#88,#08,#30,#08,#88,#70 - db #00,#18,#28,#48,#88,#F8,#08,#08 - db #00,#F8,#80,#F0,#08,#08,#08,#F0 - db #00,#70,#80,#F0,#88,#88,#88,#70 - db #00,#F8,#08,#10,#20,#40,#80,#80 - db #00,#70,#88,#88,#70,#88,#88,#70 - db #00,#70,#88,#88,#88,#78,#08,#70 - db #00,#00,#60,#60,#00,#00,#60,#60 - db #00,#00,#60,#60,#00,#60,#20,#40 -x32F9 db #00,#00,#10,#20,#40,#20 -x32FF dw #FFFF -x3301 db #10,#00 -x3203 db #00,#00,#00,#F8,#00,#F8,#00,#00 - db #00,#00,#40,#20,#10,#20,#40,#00 - db #00,#70,#88,#08,#10,#20,#00,#20 - db #00,#70,#88,#B8,#A8,#B8,#80,#78 - db #00,#70,#88,#88,#88,#F8,#88,#88 - db #00,#F0,#88,#88,#F0,#88,#88,#F0 - db #00,#70,#88,#80,#80,#80,#88,#70 - db #00,#E0,#90,#88,#88,#88,#90,#E0 - db #00,#F8,#80,#80,#F0,#80,#80,#F8 - db #00,#F8,#80,#80,#F0,#80,#80,#80 - db #00,#70,#88,#80,#B8,#88,#88,#70 - db #00,#88,#88,#88,#F8,#88,#88,#88 - db #00,#F8,#20,#20,#20,#20,#20,#F8 - db #00,#38,#10,#10,#10,#90,#90,#60 - db #00,#88,#90,#A0,#C0,#A0,#90,#88 - db #00,#80,#80,#80,#80,#80,#80,#F8 - db #00,#88,#D8,#A8,#88,#88,#88,#88 - db #00,#88,#88,#C8,#A8,#98,#88,#88 - db #00,#70,#88,#88,#88,#88,#88,#70 - db #00,#F0,#88,#88,#88,#F0,#80,#80 - db #00,#70,#88,#88,#88,#A8,#90,#68 - db #00,#F0,#88,#88,#88,#F0,#90,#88 - db #00,#70,#88,#80,#70,#08,#88,#70 - db #00,#F8,#20,#20,#20,#20,#20,#20 - db #00,#88,#88,#88,#88,#88,#88,#70 - db #00,#88,#88,#88,#88,#88,#50,#20 - db #00,#88,#88,#88,#88,#88,#A8,#50 - db #00,#88,#88,#50,#20,#50,#88,#88 - db #00,#88,#88,#50,#20,#20,#20,#20 - db #00,#F8,#08,#10,#20,#40,#80,#F8 - db #00,#38,#20,#20,#20,#20,#20,#38 -x33FB db #00,#00,#80,#40 -x33FF dw #FFFF -x3401 db #20,#10,#08,#00 -x3405 db #00,#E0,#20,#20,#20,#20,#20,#E0 - db #00,#20,#70,#A8,#20,#20,#20,#20 - db #00,#00,#00,#00,#00,#00,#00,#FC - db #00,#40,#20,#00,#00,#00,#00,#00 - db #00,#00,#60,#10,#70,#90,#90,#68 - db #00,#80,#80,#80,#E0,#90,#90,#E0 - db #00,#00,#60,#90,#80,#80,#90,#60 - db #00,#10,#10,#10,#70,#90,#90,#70 - db #00,#00,#60,#90,#90,#E0,#80,#70 - db #00,#18,#20,#20,#70,#20,#20,#20 - db #00,#00,#70,#90,#90,#70,#10,#60 - db #00,#80,#80,#80,#E0,#90,#90,#90 - db #00,#40,#00,#40,#40,#40,#40,#30 - db #00,#20,#00,#20,#20,#20,#20,#C0 - db #00,#80,#90,#A0,#C0,#A0,#90,#88 - db #00,#40,#40,#40,#40,#40,#40,#30 - db #00,#00,#D0,#A8,#A8,#A8,#A8,#A8 - db #00,#00,#E0,#90,#90,#90,#90,#90 - db #00,#00,#60,#90,#90,#90,#90,#60 - db #00,#00,#E0,#90,#90,#E0,#80,#80 - db #00,#00,#70,#90,#90,#70,#18,#10 - db #00,#00,#90,#A8,#C0,#80,#80,#80 - db #00,#00,#60,#80,#60,#10,#10,#E0 - db #00,#40,#40,#E0,#40,#40,#40,#30 - db #00,#00,#90,#90,#90,#90,#90,#60 - db #00,#00,#88,#88,#88,#50,#50,#20 - db #00,#00,#88,#88,#A8,#A8,#A8,#50 - db #00,#00,#00,#88,#50,#20,#50,#88 - db #00,#00,#90,#90,#90,#70,#10,#E0 - db #00,#00,#F0,#10,#20,#40,#80,#F0 - db #00,#20,#40,#40,#80,#40,#40,#20 -x34FD db #00,#20 -x34FF dw #FFFF -x3501 db #20,#20,#20,#20,#20,#20 -x3507 db #00,#20,#10,#10,#08,#10,#10,#20 - db #00,#00,#A8,#50,#00,#00,#00,#00 - db #00,#78,#84,#B4,#A4,#B4,#84,#78 - db #00,#FC,#FC,#FC,#FC,#FC,#FC,#FC - db #00,#00,#00,#00,#FC,#FC,#FC,#FC - db #00,#60,#F0,#78,#3C,#78,#F0,#60 - -x3537 DISPLAY "Free space at ",$,": ",/D,#35FF-$," byte(s)" - ds #35FF-$,#00 - dw #FFFF -x3601 DISPLAY "Free space at ",$,": ",/D,#36FF-$," byte(s)" - ds #36FF-$,#00 - dw #FFFF -x3701 DISPLAY "Free space at ",$,": ",/D,#37FF-$," byte(s)" - ds #37FF-$,#00 - dw #FFFF -x3801 DISPLAY "Free space at ",$,": ",/D,#38FF-$," byte(s)" - ds #38FF-$,#00 - dw #FFFF -x3901 DISPLAY "Free space at ",$,": ",/D,#39FF-$," byte(s)" - ds #39FF-$,#00 - dw #FFFF -x3A01 DISPLAY "Free space at ",$,": ",/D,#3AFF-$," byte(s)" - ds #3AFF-$,#00 - dw #FFFF -x3B01 DISPLAY "Free space at ",$,": ",/D,#3BFF-$," byte(s)" - ds #3BFF-$,#00 - dw #FFFF - -;Адрес #3C01. То же, что и #3D31. - -x3C01 JR x3C06 - -x3C03 DB #FF - -;Адрес #3C04. То же, что и #3D1A - -x3C04 JR x3C09 - -;Адрес #3C06. То же, что и #3D31. - -x3C06 JP x3D00 - -;Адрес #3C09. То же, что и #3D1A. - -x3C09 JP x3D03 - -x3C0C ret - -x3C0D push af - push hl - push de - call x3E08 - ld b,a - pop de - pop hl - pop af - jp x3E44 - -x3C1A DISPLAY "Free space at ",$,": ",/D,#3C30-$," byte(s)" - ds #3C30-$,#00 - -x3C30 in a,(#1F) - ret - -x3C33 DISPLAY "Free space at ",$,": ",/D,#3CFA-$," byte(s)" - ds #3CFA-$,#00 - -;Адрес #3CFA. То же, что и #20F1. - -x3CFA JP x20F1 - -;Адрес #3CFD. То же, что и #3D13, но не переключает ПЗУ. - -x3CFD JP x283C - -;Адрес #3D00. Вход в TR-DOS. Переключает ПЗУ. - -x3D00 NOP - JR x3D31 - -;Адрес #3D03. Выполнение команд TR-DOS из бейсика. Установите CH_ADD на префикс :REM: перед командой. Возвращает в BC код ошибки. Переключает ПЗУ. - -x3D03 NOP - JR x3D1A - -;Адрес #3D06. Подпрограмма ввода из файла данных. Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в A символ из файла. - -x3D06 NOP - JP x25EF - -;Адрес #3D0A. То же, что и #3D0D, но не переключает ПЗУ. - -x3D0A JP x244A - -;Адрес #3D0D. Подпрограмма вывода в файл данных. Символ поместите в аккумулятор. Используется также с адреса #3D0E. Обе точки входа переключают ПЗУ. - -x3D0D NOP -x3D0E JR x3D0A - -;Адрес #3D10. То же, что и #20F1. Переключает ПЗУ. - -x3D10 NOP - JR x3CFA - -;Адрес #3D13. Переход на подпрограмму вызова подпрограмм TR-DOS из машинного кода. Адрес является переключателем. - -x3D13 NOP - JR x3CFD - -;Адрес #3D16. Переход на подпрограмму обработки ошибок. Адрес является переключателем. - -x3D16 NOP - JP x2F69 - -;Адрес #3D1A. То же, что и #3D03, но не переключает ПЗУ. - -x3D1A CALL x3D21 ;создание системных переменных TR-DOS - PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик - JP x016C ;выполнение команды - -;Адрес #3D21. Создание области системных переменных TR-DOS, если ее нет. В HL помещается #5CC2. - -x3D21 CALL x31F3 ;проверка наличия области системных переменных - NOP - NOP - CALL C,x3D4C ;если ее нет, то создание ее - LD HL,#5CC2 ;загрузка в HL адреса переключателя ПЗУ на бейсик - RET ;возврат - - NOP - NOP - -;Адрес #3D2F. Переключение пзу на TR-DOS и переход на любой адрес. Адрес поместите на стек. - -x3D2F NOP - RET - -;Адрес #3D31. Вход в TR-DOS. - -x3D31 CALL x3D21 ;создание области системных переменных - PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик - JP x0239 ;вход в TR-DOS - -;Адрес #3D38. Проверка наличия интерфейса-1. В случае его обнаружения происходит создание его системных переменных и в #5CF1 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. - -x3D38 XOR A ;интерфейс-1 есть? - OUT (#F7),A - IN A,(#F7) - CP #1E - JR Z,x3D44 ;если да, то создание его системных переменных - CP #1F - RET NZ ;если нет, то возврат -x3D44 RST 8 ;создание системных переменных интерфейса-1 - DB #31 - LD A,1 ;по команде SAVE записывать 1 копию - LD (#5CEF),A - RET ;возврат - -;Адрес #3D4C. Создание системных переменных TR-DOS. При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные и в #5CEF помещается 1. В переменные TR-DOS помещаются: в #5CFA - #5CFC, #5CC8 - #5CCA, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора. - -x3D4C XOR A ;выбор дисковода A: и сброс ВГ93 - OUT (#FF),A - IN A,(#F6) ;это ничего не дает - LD HL,x3D38 ;адрес подпрограммы проверки наличия интерфейса-1 - LD DE,#5C92 ;любой свободный адрес, ОЗУ - LD BC,#14 ;длина подпрограммы - LDIR ;перенос подпрограммы в ОЗУ - LD HL,x3D67 ;адрес возврата из подпрограммы - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - JP #5CA5 ;new запуск подпрограммы (переход на ret) - -;Адрес #3D67. Создание системных переменных TR-DOS. В переменные помещаются: в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. - -x3D67 LD HL,x2F90 ;адрес возврата из пзу бейсика - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#1655 ;адрес подпрограммы MAKE_ROOM из ПЗУ бейсика - PUSH HL ;помещение его на стек - LD HL,#5BFF ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD (HL),#C9 ;помещение в озу команды RET - LD HL,#5CB5 ;начальный адрес области системных переменных - LD BC,#70 ;длина ее - RET ;запуск подпрограммы MAKE_ROOM - -;Адрес #3D80. Перевод строки. Используется также с адреса #3D82 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса #3D8B подпрограммой #4F6. - -x3D80 LD A,#D ;символ ENTER -x3D82 PUSH HL ;сохранение регистров - PUSH BC - PUSH DE - PUSH AF ;сохранение символа - CALL x20F1 ;изменение памяти - POP AF ;восстановление символа -x3D8A CALL x3D94 ;печать символа - CALL x20F1 ;восстановление памяти - POP DE ;восстановление регистров - POP BC - POP HL - RET ;возврат - -;Адрес #3D94. Печать символа без изменения памяти. Символ поместите в аккумулятор. - -x3D94 RST #20 - DW #0010 - RET - -;Адрес #3D98. Восстановление с ожиданием INTRQ. Используется также с адреса #3D9A (отдача команды из рег.A с ожиданием INTRQ). - -x3D98 LD A,#08 ;new восстановление -x3D9A OUT (#1F),A -x3D9C PUSH HL ;сохранение HL - RST #20 ;проверка нажатия BREAK - DW #1F54 - JR C,x3DA5 ;если нажато, то сообщение *BREAK* - RST #20 - DW #1B7B -x3DA5 POP HL ;восстановление HL - IN A,(#FF) ;INTRQ поступил? - AND #80 - JR Z,x3D9C ;если нет, то повтор - RET ;возврат - -;Адрес #3DAD. Проверка наличия диска в дисководе. Никаких установок не требуется. - -x3DAD LD A,#08 ;new команда восстановления - CALL x3D9A ;выдача команды и ожидание INTRQ - LD DE,0 ;за #10000 проходов индексный сигнал должен измениться - IN A,(#1F) ;берем индексный сигнал для образца - AND 2 - LD B,A ;запоминаем его -x3DBA IN A,(#1F) ;берем его снова - AND 2 - CP B ;он изменился? - RET NZ ;если да, то возврат - INC DE ;следующая попытка - LD A,E ;попытки кончились - OR D - JR NZ,x3DBA ;если нет, то повтор - JP x16F9 ;обработка ошибки NO DISC - -;Адрес #3DC8. Выбор дисковода, определенного по умолчанию. Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01. Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов: -;#3DCB - выбор дисковода. Номер задайте в рег.A, остальное как и для предыдущей подпрограммы. -;#3DFD - задержка в 725779 тактов. -;#3DFF - задержка любой нужной длительности. В рег.A установите число, определяющее длительность задержки. - -x3DC8 LD A,(#5D19) ;берем номер дисковода по умолчанию -x3DCB call x0901 -; LD (#5CF6),A ;установка номера выбранного дисковода - LD HL,#5D16 ;выбор дисковода - LD C,A - LD A,#3C - OR C - OUT (#FF),A - LD (HL),A - CALL x3E08 ;берем время перемещения головки дисковода - AND #80 ;бит 7 выключен? - JR Z,x3DFA ;если да, то инициализацию не проводим - CALL x3DAD ;проверка наличия диска в дисководе - CALL x3E16 ;определение времени перемещения головки дисковода - CALL x3E11 ;берем тип дисковода - CP #82 ;new в этой переменной #FF? - JR Z,x3DFA ;new если да, то не определяем его - PUSH HL ;сохраняем адрес переменной с типом дисковода - CALL x1FCA ;определение количества дорожек дисковода - POP HL ;восстановление адреса переменной типа - CP #50 ;установка этой переменной - LD A,0 - JR NZ,x3DF9 - LD A,#80 -x3DF9 LD (HL),A - -;Внимание, ошибка!!! Не проверяется количество сторон дисковода и предполагается, что он односторонний. - -x3DFA CALL x1E36 ;проверка индексной области диска -x3DFD LD A,#50 ;задержка в 327842 тактов -x3DFF LD C,#FF -x3E01 DEC C - JR NZ,x3E01 - DEC A - JR NZ,x3DFF - RET ;возврат - -;Адрес #3E08. Выборка времени перемещения головки текущего дисковода. Установите #5CF6. На выходе в A будет время перемещения головки дисковода, а в HL - адрес, по которому оно находится. Используется также с адреса #3E0B (выборка параметра дисковода; в DE поместите адрес таблицы параметров и установите #5CF6; На выходе в A будет параметр, в HL - адрес его ячейки). - -x3E08 LD DE,#5CFA ;берем адрес таблицы скоростей перемещения головок -x3E0B LD HL,(#5CF6) ;смещение равно номеру дисковода - ADD HL,DE ;вычисление адреса ячейки с параметром - LD A,(HL) ;берем оттуда параметр - RET ;возврат - -;Адрес #3E11. Выборка типа дисковода. Вход: установите #5CF6. Выход: в A тип дисковода, в HL - адрес его ячейки. - -x3E11 LD DE,#5CC8 ;берем адрес таблицы типов дисководов - JR x3E0B ;выборка параметра и возврат - -;Адрес #3E16. Определение времени перемещения головки дисковода. - -x3E16 CALL x3E08 ;берем адрес ячейки со временем перемещения головки - LD B,8 ;начнем с наименьшего - LD C,4 ;4 попытки -x3E1D LD (HL),B ;установка времени перемещения головки - LD A,#08 ;new восстановление - CALL x3D9A - LD A,#20 ;позиционирование на дорожку #20 - LD B,#B - CALL x3E44 - LD B,(HL) ;берем время перемещения головки - LD A,1 ;позиционирование на дорожку 1 с заданным временем - CALL x3E44 - IN A,(#1F) ;головка на дорожке 0? - AND 4 - JR NZ,x3E3F ;если да, то ошибка - XOR A ;позиционирование на дорожку 0 - CALL x3E44 - IN A,(#1F) ;головка на дорожке 0? - AND 4 - RET NZ ;если да, то возврат -x3E3F INC B ;увеличение времени перемещения головки на 1 - DEC C ;следующая попытка - RET Z ;если попытки кончились, то возврат - JR x3E1D ;повтор - -;Адрес #3E44. Позиционирование. В A поместите физический номер дорожки, в B - время перемещения головки и выберите сторону. - -x3E44 OUT (#7F),A ;помещение номера дорожки в регистр данных - LD A,B ;получение команды позиционирования - OR #18 - JP x0800 ;отдача команды из рег.A с ожиданием INTRQ - -;Внимание!!! Здесь нужно JP #3D9A, т.к. #800 гасит биты скорости перемещения головки дисковода, следовательно позиционирование работает только с быстрой скоростью. - -;Адрес #3E4C. Позиционирование. На входе в A должен быть физический номер дорожки, а в B - время перемещения головки дисковода. - -x3E4C OUT (#7F),A ;загрузка номера дорожки в регистр данных - PUSH BC ;сохранение времени перемещения головки дисковода - LD B,A ;головка уже спозиционирована? - IN A,(#3F) - CP B - POP BC ;восстановление времени перемещения головки - PUSH AF ;сохранение результата проверки - LD A,B ;получение команды позиционирования - OR #18 - CALL x0800 ;отдача команды из рег.A с ожиданием INTRQ - -;Внимание!!! Позиционирование осуществляется только с быстрой скоростью перемещения головки, т.к. в #800 используется AND #FC. Для исправления ситуации здесь нужно поставить JP #3D9A. - - POP AF ;восстановление результата проверки положения головки - RET Z ;если головка была спозиционирована, то возврат - PUSH BC ;сохранение времени перемещения головки? - CALL x3DFD ;задержка в 725779 тактов - POP BC ;восстановление времени перемещения головки - RET ;возврат - -;Адрес #3E63. Позиционирование головки дисковода. Вход: в рег.A установите логический номер требуемой дорожки и установите #5CCD. На выходе #5CCD обнуляется. Используется также с адреса: -;#3EA0 (задержка в 3135098 тактов). - -x3E63 LD C,A ;загрузка номера дорожки в регистр C - CALL x0A01 ;выбор верхней стороны диска - CALL x3E11 ;берем тип дисковода - AND 2 ;дисковод двухсторонний? - CALL NZ,x3EAA ;если да, то выбор стороны - PUSH BC ;сохраним номер дорожки - BIT 7,(HL) ;дисковод 40-дорожечный? - JR Z,x3E83 ;если да, то номера дорожек не меняем - BIT 0,(HL) ;используем только 40 дорожек? - JR NZ,x3E83 ;если нет, то номера дорожек не меняем - IN A,(#3F) ;берем номер текущей дорожки - CP C ;головка уже спозиционирована? - JR Z,x3E82 ;если да, то номера дорожек не меняем - RLCA ;делим номер текущей дорожки на 2 - OUT (#3F),A - LD A,C ;делим номер требуемой дорожки на 2 - RLCA -x3E82 LD C,A -x3E83 CALL x3E08 ;берем время перемещения головки дисковода - LD B,A - IN A,(#3F) ;головка уже спозиционирована? - CP C - PUSH BC ;сохраним номер требуемой дорожки - CALL NZ,x3DFD ;если головка не спозиционирована, то задержка в 725779 тактов - POP BC ;восстановление номера требуемой дорожки - LD A,C - CALL x3E4C ;позиционирование - POP BC ;восстановление номера требуемой дорожки - LD A,C ;установка регистра дорожки - OUT (#3F),A - LD A,(#5CCD) ;нужна задержка после операции? - OR A - RET Z ;если нет, то возврат - XOR A ;в следующий раз задержка не понадобится - LD (#5CCD),A -x3EA0 LD B,3 ;задержка в 3135098 тактов -x3EA2 LD A,#FF - CALL x3DFF - DJNZ x3EA2 - RET ;возврат - -;Адрес #3EAA. Выбор стороны при позиционировании. Вход: в C поместите логический номер дорожки и выберите верхнюю сторону диска. Выход: будет выбрана сторона, а в C будет физический номер дорожки. - -x3EAA LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - RET NC ;если номер дорожки был четный, то возврат - JP x1FF6 ;иначе выбор нижней стороны диска - -;Адрес #3EB2. Проверка индексной области дорожки. Установите #5CD1 и поместите в B время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в #5D17 помещается #FF. В регистр H помещается номер текущей дорожки. Используется также с адреса: -;#3EE7 (обработка ошибки NO DISC). - -x3EB2 CALL x1FEB ;выбор верхней стороны диска -x3EB5 IN A,(#1F) ;берем состояние контроллера - AND #80 ;сохранение флага готовности - LD (#5CCD),A - IN A,(#3F) ;берем номер текущей дорожки - LD H,A ;на случай возврата - CALL x3C0D ;преобразование и выполнение команды из рег.B - -;Внимание!!! Перед CALL #3E44 в регистр B надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра B на входе в подпрограмму и последствия могут быть весьма плачевными. - - LD C,#7F ;адрес регистра данных - LD D,1 ;число, определяющее количество попыток - DI ;запрет прерываний - LD A,#C0 ;чтение индексной области - OUT (#1F),A - PUSH BC ;сохранение адреса регистра данных - LD B,3 ;определяем количество попыток -x3ECE IN A,(#FF) ;берем состояние сигналов DRQ и INTRQ - AND #C0 - JR NZ,x3EF2 ;если какой-нибудь сигнал поступил, то начало чтения - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3ECE - DJNZ x3ECE ;повтор до конца попыток - POP BC ;восстановление адреса регистра данных - EI ;разрешение прерываний - LD A,#D0 ;остановка контроллера - OUT (#1F),A - LD A,(#5CD1) ;ошибку игнорировать? - -;Ошибка!!! Надо LD A,(#5D17). - - CP #FF - RET Z ;если да, то возврат -x3EE7 CALL x272B ;установка TAPE LOADING ERROR - LD A,#FF ;в следующий раз ошибку игнорировать - LD (#5D17),A - JP x271B ;обработка ошибки NO DISC -x3EF2 POP BC ;восстановление адреса регистра данных - IN H,(C) ;чтение первого байта -x3EF5 IN A,(#FF) ;ожидание какого-нибудь сигнала - AND #C0 - JR Z,x3EF5 - EI ;на случай возврата - -;Ошибка!!! Так можно потерять байт при чтении. - - RET M ;если поступил INTRQ, то возврат - DI ;запрет прерываний - IN A,(#7F) ;чтение байта - JR x3EF5 ;повтор - -;Адрес #3F02. В комментариях не нуждается. - -x3F02 LD (#5CFF),A - RET - -;Адрес #3F06. Похоже на предыдущее. - -x3F06 LD (#5D00),HL - RET - -;Адрес #3F0A. Запись сектора. Спозиционируйте головку и установите #5CFF и #5D00. - -x3F0A LD A,#A0 ;команда записи сектора - JR x3F10 ;переход к подпрограмме чтения / записи сектора - -;Адрес #3F0E. Загрузка сектора. Установите #5CFF и #5D00 и спозиционируйте головку. Используется также с адреса: -;#3F10 (загрузка/запись сектора; установите все для #3F0E плюс в A поместите команду чтения или записи сектора). - -x3F0E LD A,#80 ;команда чтения сектора -x3F10 LD (#5CFE),A ;установка команды -x3F13 LD D,#A ;10 попыток -x3F15 PUSH DE ;сохранение счетчика попыток - DI ;запрет прерываний - LD A,(#5CFF) ;установка сектора - INC A - OUT (#5F),A - call x0853 -; LD HL,(#5D00) ;берем адрес чтения/записи - LD C,#7F ;берем адрес регистра данных - LD A,(#5CFE) ;отдаем команду - OUT (#1F),A - CP #A0 ;была команда записи сектора? - PUSH AF - CALL Z,x3FBA ;если да, то запись данных - POP AF - CALL NZ,x3FD5 ;иначе чтение данных - POP DE ;восстановление счетчика попыток - EI ;разрешение прерываний - IN A,(#1F) ;берем состояние контроллера - LD B,A ;сохраняем его - AND #7F ;все в порядке? - RET Z ;если да, то возврат -x3F39 LD HL,x29D8 ;адрес сообщения READ ONLY - AND #40 ;запрещена запись? - JR NZ,x3F4B ;если да, то переход на обработку ошибки - LD A,B ;восстановление состояния контроллера - AND 4 ;была потеря данных? - JR Z,x3FA0 ;если нет, то обработка дисковых ошибок - DEC D ;следующая попытка - JR NZ,x3F15 ;если попытки не кончились, то повтор -x3F48 LD HL,x29E2 ;адрес сообщения DISC ERROR -x3F4B LD A,#D0 ;команда прерывания - OUT (#1F),A - LD A,B ;восстановление состояния контроллера - AND 1 ;контроллер был занят? - JP NZ,x3EE7 ;если да, то обработка ситуации NO DISC - IN A,(#3F) ;если ошибка произошла в секторе #A дорожки - OR A ;0, то возврат (игнорирование) - JR NZ,x3F5F - IN A,(#5F) - CP #A - RET Z -x3F5F PUSH HL ;сохранение адреса сообщения - CALL x1D97 ;очистка экрана - POP HL ;восстановление адреса сообщения - RST #18 ;печать сообщения - LD HL,x2A13 ;печать TRK: - RST #18 - IN A,(#3F) ;печать номера дорожки - CALL x1DA3 - LD HL,x2A18 ;печать SEC: - RST #18 - IN A,(#5F) ;печать номера сектора - CALL x1DA3 - LD HL,x29FE ;печать RETRY,ABORT,IGNORE? - RST #18 -x3F7B CALL x1052 ;ввод клавиши - CP "I" ;нажато I? - RET Z ;если да, то возврат - CP "R" ;нажато R? - JR Z,x3F94 ;если да, то перепозиционирование и повтор - CP "A" ;нажато A? - JR NZ,x3F7B ;если нет, то повтор ввода клавиши - CALL x272B ;установка TAPE LOADING ERROR - LD A,7 ;дисковая ошибка - LD (#5D0F),A - JP x01D3 ;завершение -x3F94 LD A,(#5CF5) ;перепозиционирование - CALL x3E63 - CALL x3EA0 ;задержка в 3135098 тактов - JP x3F13 ;повтор - -;Ошибка!!! Надо JP #3F13 для того, чтобы обновить число попыток. - -x3FA0 DEC D ;следующая попытка - JP Z,x3F48 ;если попытки кончились, то обработка DISC ERROR - PUSH DE ;сохранение счетчика попыток - CALL x3E08 ;берем время перемещения головки дисковода - AND 2 ;оно равно #A? - JR NZ,x3FAD - INC (HL) ;если нет, то увеличение его на 1 -x3FAD CALL x08A7 ;восстановление - LD A,(#5CF5) ;перепозиционирование - CALL x3E63 - POP DE ;восстановление счетчика попыток - JP x3F15 ;повтор - -;Адрес #3FBA. Запись данных на диск. Установите в HL адрес блока данных, в DE - число, определяющее количество циклов, за которое должна начаться запись, в C - адрес регистра данных контроллера и отдайте команду записи. Используется также с адреса #3FCA (то же, что и #3FBA, но без обработки NO DISC). - -x3FBA LD B,4 ;установка количества попыток -x3FBC IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR NZ,x3FD1 ;если да, то начинаем запись - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3FBC - DJNZ x3FBC - RET ;если попытки кончились, то возврат -x3FCA IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR Z,x3FCA ;если нет, то ожидание его - RET M ;если поступил INTRQ, то возврат -x3FD1 OUTI ;вывод байта из вашей области в регистр данных - JR x3FCA ;повтор - -;Адрес #3FD5. Чтение данных с диска. Все установки аналогично подпрограмме #3FBA, но отдать нужно команду чтения. Используется также с адpеса #3FE5 (то же, что и #3FD5, но без обработки NO DISC). - -x3FD5 LD B,4 ;установка количества попыток -x3FD7 IN A,(#FF) ;поступило что-нибудь? - AND #C0 - JR NZ,x3FEC ;если да, то начинаем читать - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3FD7 - DJNZ x3FD7 - RET ;если попытки кончились, то возврат -x3FE5 IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR Z,x3FE5 ;если нет, то ждем его - RET M ;если это INTRQ, то возврат -x3FEC INI ;чтение байта - JR x3FE5 ;повтор - -;АДРЕС: #3FF0 вывод в порт -x3FF0 out (c),a - ret - -;АДРЕС: #3FF3 чтение порта -x3FF3 in a,(c) - ret - -x3FF6 DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" - ds #4000-$,#FF - - SAVEBIN "../Build/scorp/NewROM3_Tr-Dos.bin",#0000,#4000 - - - - diff --git a/ProfRom_Disasm/rom4.a80 b/ProfRom_Disasm/rom4.a80 deleted file mode 100755 index 87acfab..0000000 --- a/ProfRom_Disasm/rom4.a80 +++ /dev/null @@ -1,1082 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #0E00 - -;#0000 reset computer -;#0004 *NOT USED* (#04 байта) -;#0008 rst #08 печать сообщения по номеру в BC -;#000D *NOT USED* (#03 байта) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#0B байт) -;#0020 rst #20 печать строки -;#0022 *NOT USED* (#0E байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#003B печать строки (rst #20) -;#004A *NOT USED* (#26 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#0103 reset computer -;#0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -;#0175 переменные монитора -;#02E8 проверка оригинальный/совместимый компьютер -;#02F4 установка переменных из NVRAM -;#0305 установка переменных из NVRAM/CMOS128 -;#0312 установка переменных по данным в CMOS -;#0315 установка переменных по данным в CMOS -;#036C запись переменных в CMOS и в NVRAM -;#0378 запись переменных в NVRAM -;#0398 запись переменных в CMOS -;#046E таблица для записи переменных в CMOS -;#04FF таблица для записи переменных в NVRAM -;#0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) -;#057F распаковка шрифта в rom 8 -;#059F запакованный шрифт -;#0A5A инициализация системы и печать сооветствующих сообщений -;#0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него -;#0CFA дескрипторы окон -;#0D32 копирайты -;#0E00 ROM-disk -;#4000 - - -;АДРЕС: #0000 reset computer -x0000 di - jp x0103 - -;АДРЕС: #0004 *NOT USED* (#04 байта) -x0004 ds #04 - -;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC -x0008 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #000D *NOT USED* (#03 байта) -x000D ds #03 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#0B байт) -x0015 ds #0B - -;АДРЕС: #0020 rst #20 печать строки -x0020 jr x003B - -;АДРЕС: #0022 *NOT USED* (#0E байт) -x0022 ds #0E - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 ei - reti - -;АДРЕС: #003B печать строки (rst #20) -x003B ex (sp),hl - push af -x003D ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x003D - pop af - ex (sp),hl - ret - -;АДРЕС: #004A *NOT USED* (#26 байт) -x004A ds #26 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) - db #40-ROMdisk/#100;количество свободных секторов в странице - db #00 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #04 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 ret - -;АДРЕС: #0103 reset computer -x0103 ld de,#5BEE - ld hl,x0111 - ld bc,#0011 - ldir - jp #5BEE -x0111 ld bc,#1FFD - ld a,#02 - out (c),a - ld hl,#010C ;включим плоскость 0 - ld l,(hl) - xor a - out (c),a ;rom 0/1 - jp x0000 ;reset - -;АДРЕС: #0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -x0122 ld hl,x0175 ;базовые переменные монитора - ld de,xE033 - ld bc,#0173 - ldir - ld hl,xE9F5 - ld (xE9F3),hl ;адрес блока описателей дисковода - ld hl,xE02C - ld (hl),#01 ;значение interleaving - ld de,#7F1F - ld c,#FD - ld a,#0E - ld b,#FF - out (c),a ;регистр #E AY - nop - in a,(c) ;читаем значение портов #7FFD и #1FFD - and #3F - cp #3F - ret z ;rom 1, ram #F, scr 5 (прочитано #FF ???) - cp #10 - ret nz ;rom 0, ram 8, scr 7 (то, что включено) - ld b,d ;bc=#7FFD - ld a,#0F ;rom 0, ram 7/F, scr 5 - out (c),a - ld b,e ;bc=#1FFD - ld a,#00 - out (c),a ;rom 0, ram 7, scr 5 - ld a,#0E - ld b,#FF - out (c),a ;регистр #E AY - nop - in a,(c) ;читаем значение портов #7FFD и #1FFD - and #3F - cp #0F - ld b,e ;bc=#1FFD - ld a,#10 - out (c),a ;rom 0, ram #F, scr 5 - ld b,d ;bc=#7FFD - ld a,#00 - out (c),a ;rom 0, ram 8, scr 7 - ret nz ; - set 5,(iy+#19) - ret - -;АДРЕС: #0175 переменные монитора -x0175: INCBIN "prof_roms/rom4_vars.bin" - -;АДРЕС: #02E8 проверка оригинальный/совместимый компьютер -;вых: nz - совместимый -; z - оригинал -x02E8 ld a,d - sub #FC - ret nz ;совместимый - ld a,e - sub #9D - ret z ;оригинал - ld a,e - sub #8B - ret ;nz - совместимый - -;АДРЕС: #02F4 установка переменных из NVRAM -x02F4 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 - call x0312 ;установка переменных по данным в NVRAM - ld hl,xDB69+#2E ;xDB97 - ld (xDDA7),hl - ld hl,x04FF - jr x0315 - -;АДРЕС: #0305 установка переменных из NVRAM/CMOS128 -x0305 ld hl,xE02E - bit 5,(hl) -x030A jr nz,x02F4 ;NVRAM найден - bit 6,(hl) - ret z ;CMOS отсутствует - call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) - -;АДРЕС: #0312 установка переменных по данным в CMOS -;вх: b - номер ячейки CMOS -; 7,c=1 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 2,c=0 -; 1,c=1 запись нескольких битов переменной по маске в (hl) -; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке -x0312 ld hl,x046E - -;АДРЕС: #0315 установка переменных по данным в CMOS -x0315 inc b ;b=#40 -x0316 ld c,(hl) - inc hl - bit 7,c - jr z,x0347 ;установка значения бита переменной - bit 2,c - jr nz,x0343 ;установка номера ячейки CMOS - bit 1,c - jr nz,x0325 ;установка значения битов переменной - ret - -;установка значения бита переменной -x0325 call x0419 ;определение адреса переменной (de - адрес) - bit 0,c - jr z,x033D ;запись переменной в память - ld c,(hl) - inc hl - ld a,(de) - cpl - or c - cpl ;сброс битов в переменной - ld (de),a - call x0459 ;чтение значения из буфера CMOS по адресу в B - and c ;выделение битов - ld c,a - ld a,(de) - or c - ld (de),a ;установка переменной - jr x0316 - -;запись переменной в ячейку CMOS -x033D call x0459 ;чтение значения из буфера CMOS по адресу в B - ld (de),a - jr x0315 - -;установка номера ячейки CMOS -x0343 ld b,(hl) - inc hl - jr x0316 - -;установка значения бита переменной -x0347 call x0419 ;определение адреса переменной (de - адрес) - push hl - ld a,c - and #07 - call x0410 ;получение маски для переменной (l - маска) - call x0459 ;чтение значения из буфера CMOS по адресу в B - and l - push af - ld a,c - and %00111000 - rrca - rrca - rrca - call x0410 ;получение маски для переменной (l - маска) - pop af - ld a,(de) - jr z,x0366 ;сброс бита в переменной - or l ;установка бита в переменной - jr x0368 -x0366 or l - xor l -x0368 ld (de),a ;запись переменной - pop hl - jr x0316 - -;АДРЕС: #036C запись переменных в CMOS и в NVRAM -x036C bit 6,(iy+#1A) - call nz,x0398 ;запись переменных в CMOS - bit 5,(iy+#1A) - ret z - -;АДРЕС: #0378 запись переменных в NVRAM -x0378 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 - call x03B0 ;установка переменных в буфере для записи в NVRAM - ld hl,xDB69+#2E - ld (xDDA7),hl - ld hl,x04FF - call x03B3 ;установка переменных в буфере для записи в NVRAM - ld hl,xDB69 - ld de,#00FD - ld bc,#0001 - rst #30 - dw rom7_x0DD0 ;запись данных в NVRAM - db #07 - ret - -;АДРЕС: #0398 запись переменных в CMOS -x0398 call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) - call x03B0 ;установка переменных в буфере для записи в CMOS - ld hl,xDB69 ;запись буфера в CMOS - ld b,#10 -x03A3 ld a,(hl) - inc hl - rst #30 - dw rom7_x2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F - db #07 - inc b - ld a,b - cp #3F - jr nz,x03A3 - ret - -;установка переменных в буфере для записи в CMOS -x03B0 ld hl,x046E -x03B3 inc b -x03B4 ld c,(hl) - inc hl - bit 7,c - jr z,x03E7 ;установка значения бита ячейки CMOS - bit 2,c - jr nz,x03E3 ;установка номера ячейки CMOS - bit 1,c - jr nz,x03C3 ;установка значения бита ячейки CMOS в буфере - ret - -;установка значения бита ячейки CMOS в буфере -;вх: b - номер ячейки CMOS -; 7,c=1 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 2,c=0 -; 1,c=1 запись нескольких битов переменной по маске в (hl) -; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке -x03C3 call x0419 ;определение адреса переменной (de - адрес) - bit 0,c - jr z,x03DD ;запись переменной в ячейку CMOS - ld c,(hl) - inc hl - push hl - call x0459 ;чтение значения из буфера CMOS по адресу в B - cpl - or c - cpl ;сброс битов ячейки - ld l,a - ld a,(de) - and c ;выделение битов переменной - or l - pop hl - call x0456 ;запись значения в буфер CMOS по адресу в B - jr x03B4 -x03DD ld a,(de) - call x0456 ;запись значения в буфер CMOS по адресу в B - jr x03B3 - -;установка номера ячейки CMOS -;вх: 7,c=1 -; 2,c=1 -; b - номер ячейки CMOS -x03E3 ld b,(hl) - inc hl - jr x03B4 - -;установка значения бита ячейки CMOS -;вх: b - номер ячейки CMOS -; 7,c=0 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 5-3, номер бита в переменной -; 2-1, номер бита в ячейке CMOS -; -x03E7 call x0419 ;определение адреса переменной (de - адрес) - push hl - ld a,c - and %00111000 - rrca - rrca - rrca - call x0410 ;получение маски для переменной (l - маска) - ld a,(de) - and l ;выделение бита в переменной - push af - ld a,c - and #07 - call x0410 ;получение маски для переменной (l - маска) - call x0459 ;чтение значения из буфера CMOS по адресу в B - ld h,a ;значение ячейки CMOS - pop af - ld a,h - jr z,x0408 ;сброс бита в CMOS - or l ;установка бита в CMOS - jr x040A -x0408 or l - xor l -x040A call x0456 ;запись значения в буфер CMOS по адресу в B - pop hl - jr x03B4 - -;получение маски для переменной (l - маска) -;вх: a - номер бита -x0410 ld l,#01 - ret z -x0413 sla l - dec a - jr nz,x0413 - ret - -;определение адреса переменной -;вых: de - адрес -x0419 bit 6,c - ld e,(hl) - inc hl - jr z,x0422 - ld d,(hl) - inc hl - ret -; это байт-смещение от xE014 -x0422 bit 7,e - ld d,#00 - jr z,x0429 - dec d -x0429 push iy - ex (sp),hl - add hl,de - ex de,hl - pop hl - ret - -;чтение CMOS[#10..#3E] в буфер xDB69 -;вых: b=#3F -x0430 ld hl,xDB69 - ld (xDDA7),hl - ld b,#10 -x0438 rst #30 - dw rom7_x1F59 ;чтение ячейки CMOS - db #07 - ld (hl),a - inc hl - inc b - ld a,b - cp #3F - jr nz,x0438 - ret - -;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 -x0445 ld hl,xDB69 - ld (xDDA7),hl - ld de,#00FD - ld bc,#0001 - rst #30 - dw rom7_x0DB6 ;чтение данных из NVRAM - db #07 - ret - -;запись значения в буфер CMOS по адресу в B -x0456 scf - jr x045A -;чтение значения из буфера CMOS по адресу в B -x0459 or a -x045A push hl ;cy=1/0 - запись/чтение - ld hl,(xDDA7) ;адрес буфера CMOS - push bc - ld c,b - ld b,#00 - push af - add hl,bc - pop af - jr nc,x046A - ld (hl),a - jr x046B -x046A ld a,(hl) -x046B pop bc - pop hl - ret - -;АДРЕС: #046E таблица для записи переменных в CMOS и NVRAM -x046E db %10000100 - db #00 ;ячейка: +#00 - db %11000010 - dw xFFCC ;переменная: xFFCC, ячейка: +#01 - db %11000010 - dw xFFCD ;переменная: xFFCD, ячейка: +#02 - db %11000010 - dw xFFCE ;переменная: xFFCE, ячейка: +#03 - db %11000010 - dw xFFCF ;переменная: xFFCF, ячейка: +#04 - db %11000010 - dw xFFD0 ;переменная: xFFD0, ячейка: +#05 - db %11000010 - dw xFFD1 ;переменная: xFFD1, ячейка: +#06 - db %11000011 - dw xFFCB ;переменная: xFFCB - db %00000111 ;маска переменной - db %00000011 - db #39 ;переменная: xE014+#39 - db %00001100 - db #39 ;переменная: xE014+#39 - db %00010101 - db #39 ;переменная: xE014+#39 - db %00000110 - db #1C ;переменная: xE014+#1C - db %00001111 - db #1C ;переменная: xE014+#1C - db %10000100 - db #07 ;ячейка: +#07 - db %10000011 - db #18 ;переменная: xE014+#18 - db %00011111 - db %00010101 - db #1C ;переменная: xE014+#1C - db %00100110 - db #1C ;переменная: xE014+#1C - db %10000100 - db #08 ;ячейка: +#08 - db %10000010 - db #DE ;переменная: xE014-#22, ячейка: +#09 - db %10000010 - db #DF ;переменная: xE014-#21, ячейка: +#0A - db %10000100 - db #0A ;ячейка: +#0A - db %10000011 - db #E0 ;переменная: xE014-#20 - db %00111111 - db %10000100 - db #0B ;ячейка: +#0B - db %10000011 - db #E1 ;переменная: xE014-#1F - db %00111111 - db %10000100 - db #0C ;ячейка: +#0C - db %10000010 - db #05 ;переменная: xE014-#05, ячейка: +#0D - db %10000100 - db #0D ;ячейка: +#0D - db %10000010 - db #0A ;переменная: xE014-#0A, ячейка: +#0E - db %10000010 - db #0C ;переменная: xE014-#0C, ячейка: +#0F - db %10000011 - db #14 ;переменная: xE014+#14 - db %10011111 - db %00100101 - db #00 ;переменная: xE014+#00 - db %00110110 - db #19 ;переменная: xE014+#19 - db %10000100 - db #10 ;ячейка: +#10 - db %10000011 - db #12 ;переменная: xE014+#12 - db %00000111 - db %00101011 - db #13 ;переменная: xE014+#13 - db %10000100 - db #11 ;ячейка: +#11 - db %10000011 - db #15 ;переменная: xE014+#15 - db %10101111 - db %10000100 - db #12 ;ячейка: +#12 - db %10000011 - db #40 ;переменная: xE014+#40 - db %00011111 - db %10000100 - db #13 ;ячейка: +#13 - db %10000011 - db #41 ;переменная: xE014+#41 - db %00011111 - db %10000100 - db #14 ;ячейка: +#14 - db %10000011 - db #42 ;переменная: xE014+#42 - db %00011111 - db %10000100 - db #15 ;ячейка: +#15 - db %10000011 - db #25 ;переменная: xE014+#25 - db %01111111 - db %10000100 - db #16 ;ячейка: +#16 - db %10000011 - db #27 ;переменная: xE014+#27 - db %11101000 - db %10000100 - db #17 ;ячейка: +#17 - db %10000011 - db #2E ;переменная: xE014+#2E - db %00000111 - db %00000011 - db #2F ;переменная: xE014+#2F - db %00001100 - db #2F ;переменная: xE014+#2F - db %00010101 - db #2F ;переменная: xE014+#2F - db %10000100 - db #18 ;ячейка: +#18 - db %11000010 - dw xE11A ;переменная: xE11A, ячейка: +#19 - db %11000010 - dw xE11A+#01 ;переменная: xE11B, ячейка: +#1A - db %10000010 - db #58 ;переменная: xE014-#58, ячейка: +#1B - db %10000011 - db #57 ;переменная: xE014+#57 - db %01111111 - db %10000100 - db #1C ;ячейка: +#1C - db %10000011 - db #DD ;переменная: xE014-#23 - db %00000011 - db %10000100 - db #1D ;ячейка: +#1D - db #80 ;конец - -;АДРЕС: #04FF таблица для записи переменных в NVRAM -x04FF db %10000100 - db #00 ;ячейка: +#00 - db %10000010 - db #2A ;переменная: xE014+#2A, ячейка: +#01 - db %10000010 - db #2B ;переменная: xE014+#2B, ячейка: +#02 - db %10000010 - db #2C ;переменная: xE014+#2C, ячейка: +#03 - db %10000010 - db #2D ;переменная: xE014+#2D, ячейка: +#04 - db %10000010 - db #3A ;переменная: xE014+#3A, ячейка: +#05 - db %10000010 - db #3B ;переменная: xE014+#3B, ячейка: +#06 - db %10000010 - db #3D ;переменная: xE014+#3D, ячейка: +#07 - db %10000010 - db #26 ;переменная: xE014+#26, ячейка: +#08 - db #80 ;конец - -;АДРЕС: #0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) -x0512 ld de,xDB69 - push de -;копируем подпрограмму в буфер - ld hl,x0549 - ld bc,#0100 - ldir -;установка переменных в буфере для записи на диск - ld hl,xDB69+#36 ;xDB9F - ld (xDDA7),hl - call x03B0 ;установка переменных в буфере для записи на диск - ld hl,xDB69+#64 ;xDBCD - ld (xDDA7),hl - ld hl,x04FF - call x03B3 ;установка переменных в буфере для записи на диск -;запись сектора с настройками на дискету - rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - pop hl - jr c,x0545 ;ошибка инициализации диска - ld bc,#0106 - ld de,#000F ;trk 0, sec #0F - rst #30 - dw rom7_x0229 ;R8DOS #06(6) запись группы секторов - db #07 - ret nc ;ошибок не было -x0545 rst #30 ;печать сообщения об ошибке - dw rom6_x06A6 ;печать сообщения об ошибке и продолжение работы монитора - db #06 ;(без возврата) -;процедура установки настроек из сектора диска (сохраняется на диск вместе переменными) -x0549 db "AM" ;сигнатура начала данных - ld a,(#00F1) ;rom 2 - cp #61 - jr z,x0557 ;проверка текущей страницы ПЗУ - ld a,#03 - out (#FE),a - ret -x0557 ld hl,xDB69+#36 ;xDB9F - ld (xDDA7),hl - rst #30 - dw rom4_x0312 ;установка переменных по данным в CMOS - db #04 - ld hl,xDB69+#64 ;xDBCD - ld (xDDA7),hl - ld hl,x04FF - rst #30 - dw rom4_x0315 ;установка переменных по данным в CMOS - db #04 - rst #20 - db #0D - db "AutoConfig Ok" - db #8D - ret - -;АДРЕС: #057F распаковка шрифта в rom 8 -x057F ld hl,xE483 ;адрес ret - rst #30 - dw rom6_x0D60 ;установка п/п jp xE483 по адресу xE338 - db #06 - ld hl,x059F ;адрес сжатого шрифта - ld de,xEBF5 ;буфер - push de - ld bc,#04BB ;размер - ldir ;кипируем в буфер - pop hl - ld de,xEBF5+#04BB ;xF0B0 - exx - ld hl,xF7C0 - rst #30 - dw rom6_x1108 ;распаковка блока - db #06 - ret - -;АДРЕС: #059F запакованный шрифт -x059F INCBIN "prof_roms/rom4_fnt.bin" - -;АДРЕС: #0A5A инициализация системы и печать сооветствующих сообщений -x0A5A bit 6,(iy+#14) - jr nz,x0A67 ;"теплый" сброс - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld a,#0C - rst #10 ;очистка окна -x0A67 ld hl,x0D24 - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db " ",#7F," " ;знак копирайта - dc "1993-1997 MOA Shadow Service Monitor" - bit 6,(iy+#14) - jr nz,x0B07 ;теплый сброс - ld hl,x0D08 - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db #1B,#00,#07 ;координаты печати - dc "* fast test of computer *" - ld hl,x0CFA - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db " Computer :",#0D - db " RAM :",#0D - db " ROM :" - db #1B,#00,#8C ;координаты - call x0C8A ;вывод сообщения с названием компьютера - ld (ix+0),#01 ;crdY=1 - ld (ix+1),#0C ;crdX=12 - call x0C74 ;сообщение: 256 K - ld (ix+0),#02 ;crdY=2 - ld (ix+1),#0C ;crdX=12 - call x0C7B ;вывод сообщения с размером ПЗУ - call x0B3B ;инициализация SMUC -;обнуление bit4 спецификации дисководов -x0B07 ld a,(xFFCA) - push af - xor a -x0B0C ld (xFFCA),a - ld c,#11 ;R8DOS #11(17) чтение кода спецификации дисковода - push af - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - res 4,(hl) - pop af - inc a - cp #04 - jr c,x0B0C - pop af - ld (xFFCA),a -;установка координаты Y курсора в окне, при необходимости - ld de,xE0C9 - or a - push ix - pop hl - sbc hl,de - ret z - ld a,(ix+2) - add a,(ix+4) - inc a ;координата Y нижней строки окна - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld (ix+0),a ;координата Y курсора в окне - ret -;инициализация SMUC -x0B3B ld bc,#FEFE - in a,(c) - rrca - jr c,x0B58 ;cs не нажата - ld b,#EF - in a,(c) - bit 2,a - jr nz,x0B58 ;8 не нажата -; SMUC не проверяем - ld hl,xE02E ;cs+8 нажата - ld a,(hl) - and #07 - ld (hl),a - inc hl - ld a,(hl) - and #37 - ld (hl),a - ret -x0B58 bit 6,(iy+#14) - ret nz ;"теплый" сброс -;определение наличия SMUC, и вывод сообщения с версией - rst #30 - dw rom7_x2422 ;определение наличия SMUC - db #07 - ret c ;SMUC не найден - push de - ld hl,x0D16 - call x0CDF - rst #20 - dc " SMUC : " - pop de - call x0CC2 ;печать версии и ревизии SMUC -;определение наличия CMOS, и вывод сообщения - ld a,(ix+2) - add a,(ix+4) - inc a - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld (ix+0),a - rst #30 ;определение наличия CMOS - dw rom7_x2047 ;a=#5A CMOS checksum error - db #07 ;a=#5B CMOS not found - ;a=#5C _число_ bytes CMOS found - call x0C5C ;печать сообщения - db #00 -;определение наличия NVRAM, и вывод сообщения - rst #30 ;определение наличия NVRAM - dw rom7_x0D62 ;a=#26 NVRAM not found - db #07 ;a=#27 NVRAM found - ;a=#33 NVRAM checksum error - call x0C5C ;печать сообщения - db #02 -;определение наличия interrupt controller, и вывод сообщения - call x0305 ;установка переменных из NVRAM/CMOS128 - rst #30 ;определение наличия interrupt controller - dw rom7_x1572 ;a=#24 interrupt controller not found - db #07 ;a=#25 interrupt controller found - call x0C5C ;печать сообщения - db #02 -;определение наличия последовательного порта/модема, и вывод сообщения - rst #30 - dw rom7_x15C7 ;определение наличия последовательного порта/модема - db #07 ;a=#28 modem not found - call x0C5C ;a=#29 modem found - db #02 ;a=#2A serial port not found -;индентификация HDD и печать информиции о винчестере - ld e,#00 - rst #30 - dw rom5_x30B9 ;идентификация жесткого диска - db #05 - jr nc,x0BB9 ;нет ошибок - call x0C5C ;печать сообщения с ошибкой - db #00 - jr x0C27 -x0BB9 ld a,%00101011 ;paper 5, ink 3 - ld (ix+6),a - rst #20 - dc " IDE/AT " -; печать размера винчестера - ld hl,(xE5A5) - ld de,#0000 - exx - ld bc,(xDFF2) - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - rst #30 - dw rom5_x2AA4 ;преобразование количества секторов в мегабайты - db #05 - ld a,#59 - or a - call x0C5C ;печать размера винчестера - db #00 -; печать названия(модели) винчестера - ld a,%00101000 ;paper 5, ink 0 - ld (ix+6),a - ld hl,xE5A9+#036 ;xE5DF - ld b,#14 - call x0C4D -; печать серийного номера винчестера - rst #20 - db #0D - dc "Serial Number: " - ld hl,xE5A9+#014 ;xE5BD - ld b,#0A - call x0C4D -; печать версии прошивки винчестера - rst #20 - db #0D - dc "Firmware rev.: " - ld hl,xE5A9+#02E ;xE5D7 - ld b,#04 - call x0C4D - ld a,%00101001 ;paper 5, ink 1 - ld (ix+6),a - rst #20 - db #8D -;монтирование подключенных образов -x0C27 bit 7,(iy+#1B) - jr z,x0C39 ;HDD не найден - set 5,(iy+#0B) - rst #30 - dw rom5_x2503 ;монтирование всех образов с винчестера - db #05 - res 5,(iy+#0B) -;проверка нажатия клавиши -x0C39 ld hl,xE028 - bit 6,(hl) - ret nz ;"теплый" сброс -x0C3F xor a - in a,(#FE) - and #1F - xor #1F - ret nz - dec hl - ld a,l - or h - ret z - jr x0C3F - -;печать сообщения из (hl), длиной не более b*2 -x0C4D ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,d - or a - ret z - rst #10 - ld a,e - or a - ret z - rst #10 - djnz x0C4D - ret - -;печать сообщения -;вх: a - номер сообщения -; db ? номер блока сообщений -x0C5C ld b,a - ex (sp),hl - ld c,(hl) - inc hl - ex (sp),hl - set 0,(iy+#05) ;десятичная система - ld a,%00101001 ;paper 5, ink 1 - jr c,x0C6B - ld a,%00101011 ;paper 5, ink 3 -x0C6B ld (ix+6),a ;атрибуты печати - rst #20 - dc " " - rst #08 - rst #20 - db #8D - ret - -;сообщение: 256 K -x0C74 rst #20 - dc "256 K" - ret - -;вывод сообщения с размером ПЗУ -x0C7B rst #30 ;для провреки размера ПЗУ: при 128k включится rom 2 и a=#00 - dw romA_x001B ;при 256k включится rom #A и a=#02 - db #0A - cp #02 - jr z,x0C74 ;256k ПЗУ - rst #20 - dc "128 K" - ret - -;вывод сообщения с названием компьютера -x0C8A ld de,(xDFFC) - rst #30 ;ЗАЧЕМ!!! можно напрямую - dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер - db #04 - jr nz,x0CA9 - rst #20 - dc "Scorpion ZS 256 (R)" - ret -x0CA9 rst #20 - dc "Scorpion (R) compatible" - ret - -;печать версии и ревизии SMUC -;вх: d - номер версии -; e - номер ревизии -x0CC2 push de - rst #20 - dc "Ver. " - pop de - ld a,d - push de - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - rst #20 - dc ", rev. " - pop de - ld a,e - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - ret - -;АДРЕС: #0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него -;вх: hl - дескриптор окна -x0CDF call x0CEA - ld hl,#0000 - rst #30 - dw rom5_x2054 ;печать рамки вокруг окна - db #05 - ret -;копирование дескриптора окна в рабочуюю область -x0CEA ld de,xE102 - push de - ld bc,#000D - ldir - pop ix - ld (xE3B7),ix - ret - -;АДРЕС #0CFA дескрипторы окон: -;окно высотой 3 знакоместа на всю ширину экрана -x0CFA db #00,#00 - db #05,#01 - db #03,#1E - db %00101001 - db #07,#90,%00101000 - db #06,#28,#20,#00 -;окно высотой 1 знакоместо на всю ширину экрана -x0D08 db #00,#00 - db #03,#01 - db #01,#1E - db %00101001 - db #03,#88,%00101000 - db #06,#28,#20,#00 -;окно высотой 9 знакомест на всю ширину экрана -x0D16 db #00,#00 - db #09,#01 - db #01,#1E - db %00101001 - db #03,#88,%00101000 - db #06,#28,#20,#00 -;окно высотой 1 знакоместо на всю ширину экрана -x0D24 db #00,#00 - db #01,#01 - db #01,#1E - db %00101001 - db #03,#80,%00101000 - db #06,#28,#20,#00 - -;АДРЕС #0D32 копирайты -x0D32 db "Copyright(c) 1993, 1997 by Andrew MOA",#00 - db "FidoNet 2:5030/25.1",#00 - db "E-mail: moa@deeds.spb.ru",#00 - db "Compiled: Jul 13 1997 14:24:13 (IBM PC, MA80 crossassembler)",#00 -x0DC2 ds ROMdisk-$,#00 - -;АДРЕС: #0E00 ROM-disk -x0E00 INCBIN "prof_roms/rom4_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM4.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom4.bat b/ProfRom_Disasm/rom4.bat deleted file mode 100755 index 9ba0cb7..0000000 --- a/ProfRom_Disasm/rom4.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom4.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom5.a80 b/ProfRom_Disasm/rom5.a80 deleted file mode 100755 index 864300d..0000000 --- a/ProfRom_Disasm/rom5.a80 +++ /dev/null @@ -1,7671 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #3300 - -;#0000 *NOT USED* (#08 байт) -;#0008 rst #08 печать сообщения по номеру в BC -;#000B *NOT USED* (#05 байт) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#0B байт) -;#0020 rst #20 печать строки -;#0025 *NOT USED* (#0B байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#3D байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (#55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#0103 печать строки (rst #20) -;#0110 опрос Break. cy=1 не нажата -;#011C опрос манипуляторов и печать курсора -;#0169 печать курсора мыши -;#0176 восстановление экрана под курсором мыши -;#021B опрос мыши -;#0260 опрос kempston joystick -;#02A1 обработка задержек для графического курсора -;#0344 определение попадания курсора мыши в границы текущего окна -;#0381 ожидание нажатия клавиш и обработка реакции на них -;#0385 обработка реакции на нажатия клавиш -;не используется #03C9 таблица адресов процедур графического курсора -;не используется #03DF загрузка в RAM8 графического изображения курсора №2 из hl -;не используется #03E4 загрузка в RAM8 графического изображения курсора №1 из hl -;не используется #03EF загрузка из RAM8 в память hl графического изображения курсора №2 -;не используется #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 -;не используется #03FF определение попадания курсора мыши в границы текущего окна -;не используется #040D опрос управления с заданными параматрами опроса манипуляторов -;не используется #041D опрос управления без опроса манипуляторов -;не используется #042C чтение координат курсора -;не используется #0431 проверка выхода курсора за нижнюю границу экрана -;#043B ОШИБКА!!!! вызов процедуры по номеру в C -;#044A таблица адресов дескрипторов меню -;#0468 сообщения для печати опций меню -;#0660 дескрипторы меню -;#08DD блок п/п определяющих доступность опций -;#08EF доступность опции K. kempston joystick -;не используется #098A проверка наличия раздела MFS на винчетере -;#09A0 процедуры обработки пунктов меню -;#0B4B ввод и сохранение значений времени/даты -;#0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) -;#0B9B ввод параметра текущей опции (число 0..255) -;#0BD0 ввод числа. в BC начальное значение -;#0BD9 ввод числа. в BC начальное значение -;#0BF3 ввод строки символов -;#0CAA печать числа bc в буфере ввода строки -;#0CB0 печать числа A в буфере ввода строки -;#0CB9 печать числа bc в буфере ввода строки -;#0CCA очистка буфера для ввода строки -;#0CDA печать числа bc в буфер hl -;#0CF6 установка и инициализация окна для ввода строки внизу экрана -;#0D02 очистка нижней строки окна меню -;#0D1A определение типа нажатой клавиши -;#0D2F определение адреса дескриптора текущего меню -;#0D42 приведение номера горячей клавиши опции к печатному символу -;#0D45 приведение номера горячей клавиши опции к печатному символу -;#0D52 определение адреса дескриптора опции -;#0D60 определение адреса с номером текущей опции текущего меню -;#0D6B печать текущего меню -;#0E6F выделение атрибутами заданной опции меню (по курсору) -;#0E8C снятие выделения атрибутами заданной опции меню (по курсору) -;#0E98 печать атрибутов заданной опции меню (по курсору) -;#0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? -;#0EB2 очистка текущего окна -;#0EB5 печать текущего меню монитора -;#0F51 вызов п/п обработки доступности опции -;#0F65 выделение старшего байта смещения -;#0F6D опредение адреса описания опции -;#0F95 перемещение курсора на следующую опцию (вниз) -;#0FA6 перемещение курсора на предыдущую опцию (вверх) -;#0FB6 определение опции под курсором мыши и переход на ее обработку -;#0FE3 получение адреса переменной и адреса маски для заданной опции -;#0FE9 получение адреса переменной и адреса маски для заданной опции -;#102E проверка диапазона числа -;#1033 процедура обработки нажатий клавиш -;#1047 печать количества цилиндров HDD -;#105B печать шапки меню монитора -;#1061 печать закодированного сообщения из hl -;#10C2 установка текущим окна: menu -;#10C7 Копирование каталога ROM-диска в ram 8 -;#10DB обработка пункта меню: R. ROM disk -;#1150 вывод окна выбора дисковода -;не используется #1181 ret -;#11A4 поиск сообщения по номеру в B[#01..#??] -;#11AF установка блока слов/сообщений по номеру в A -;#11CD печать сообщения по номеру в BC -;#122D блок слов 2 (#35 слов) -;#1353 блок слов 1 (#6A слов) -;#1554 блок слов 0 (#5E слов) -;#176D Блок сообщений 2 -;#181A Блок сообщений 1 -;#1906 Блок сообщений 0 -;не используется #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора -;#1A4C печать даты и времени в окне монитора -;#1AA6 читаем время в строку в формате ASCII -;#1AAF читаем время в строку в формате ASCII -;#1B05 чтение даты из буфера и расчет номера дня недели -;#1B18 читаем дату в строку в формате ASCII -;#1B21 читаем дату в строку в формате ASCII -;#1B93 таблица для вычисления кода месяца -;#1BAC расчет номера дня недели -;#1C0D работа с микросхемой CMOS (rst 8: db #89) -;#1C73 ввод текстовой строки в нижней строке экрана -;#1C84 инициализация окна ввода -;#1CB3 продолжение ввода строки (вых: hl адрес введенной строки) -;#1CB8 ввод строки (вых: hl адрес введенной строки) -;#1D10 добавление символа в вводимую строку -;#1D40 удаление символа перед курсором (delete) -;#1D5A перемещение курсора в водимой строке влево -;#1D64 перемещение курсора в вводимой строке вправо -;#1D70 позиционирование курсора в конец строки -;#1D98 печать вводимой строки на экране -;#1DB7 получение адреса под курсором в буфере строки -;#1DC2 смена режима вставки/замены при вводе строки -;#1DD6 очистка буфера вводимой строки -;#1DEC удаление кода возврата каретки из строки -;#1E13 помещение символа в строку и приращение адреса в буфере строк -;#1E18 циклическое приращение адреса в буфере введенных строк -;#1E22 получем адрес конца последней введенной строки -;#1E2D сохранение введенной строки в буфере последних введенных строк -;#1E5B копирование в буфер ввода предпоследней введенной строки -;#1E91 копирование строки из буфера введенных строк в буфер ввода строки -;#1EC0 копирование в буфер ввода следующей введенной строки -;#1EE1 проверка списка на наличие введенных строк -;#1EEE звонок с установкой бордюра -;#1EF1 печать каталога и выбор позиции в нем -;#2023 сложение hl=hl+a -;#2028 вызов процедуры по таблице, адрес которой в (xE9E1) -;#202C вызов процедуры по таблице, адрес которой в (xE9E1) -;#203C расчет размеров и печать окна под каталог ROM-disk -;#2054 печать рамки вокруг окна -;#205A установка текущим окна: вывод каталога -;#207A печать рамки вокруг окна -;#2133 коррекция координат и размеров окна -;#213F координаты Y и X полей для окна редактирования дампа -;#2168 таблица со списком процедур для окна редактирования дампа -;#2278 редактирование дампа памяти в окне монитора -;#245E переименование подраздела -;Не используется #247D ret -;#247E печать нового пути после выбора пунктов меню mount/dismount DRIVE -;#249C печать буквы дисковода или пути, если это образ -;#24CE обработка пункта меню: Z. dismount.../Z. mount... -;#24F0 монтирование образа к дисководу -;#2503 монтирование всех образов с винчестера -;#2536 монтирование/отключение подраздела/образа диска -;#25EB формирование в буфере xEBF5 списка образов коллекции -;#261A удаление всех подразделов -;#2620 формирование в буфере xEBF5 списка подразделов MFS -;#2671 сортировка записей в буфере xEBF5 по порядку местоположения -;#2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере -;#26AC проверка разрывов между подразделами/образами и создание пустой записи в буфере -;#2707 загрузка числа в регистры из памяти xE81B+1 -;#270D загрузка числа в регистры из памяти xE81B+8 -;#271A подсчет количества подразделов в MFS -;#2733 удаление всех разделов MBR -;#2739 формирование в буфере xEBF5 списка разделов MBR -;#2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) -;#28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения -;#28C6 уплотнение каталога MBR (удаление в буфере записей unused) -;не используется #2928 подсчет количества разделов/подразделов в каталоге -;#2936 подсчет пустых записей в каталоге разделов/подразделов -;#2960 сортировка дескрипторов подразделов -;#2990 вставляем новую запись в список записей -;#29C6 расчет адреса в каталоге -;#29D0 печать окна с образами дисков и выбор образа в нем -;#29D5 печать окна local partition information и выбор записи в нем -;#29D7 печать окна с подразделами и выбор подраздела в нем -;#29DC печать окна global partition information и выбор записи в нем -;#29F4 выбран некорректный раздел. продолжаем выбор -;#29FE блок процедур для печати окон со списком разделов/подразделов/образов -;#2AA4 преобразование количества секторов в мегабайты -;#2AC0 преобразование количества секторов в мегабайты -;#2ACC преобразование количества секторов в килобайты -;#2AE7 умножение dehl=de*#800 -;#2AF5 умножение dehl=de*2 -;#2B03 проверка первого байта записи каталога подраздела на #FF -;#2B05 проверка первого байта записи каталога подраздела на #FF -;#2B12 печать сообщения: Unused -;#2B8C поиск и печать сообщения из HL по типу в A -;#2BB8 подготовка к печати окна выбора раздела -;#2BCA создание раздела MFS -;#2C1F удаление раздела MBR -;#2C37 создание подраздела -;#2D2F ввод имени подраздела -;#2D45 удаление подраздела -;#2D5D сравнение (hl) с #FF, cy=1 если равны -;#2D63 формирование коллекции образов в подразделе TR-DOS -;#2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода -;#2E30 расчет количества образов исходя из размеров подраздела -;#2E5D сформируем пустой сектор MBR в буфере xE5A9 -;#2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS -;#2E85 ввод имени подраздела -;#2EA7 проверка введенного имени -;#2F10 выбор типа подраздела -;#2F5D запрос на сохранение сектора MBR, если были изменения -;#2F66 формирование и запись сектора MBR -;не используется #2F94 чтение сектора в буфер xE5A9 -;#2FA8 запрос на сохранение каталога MFS, если были изменения -;#2FB1 запись каталога MFS/подраздела -;#2FCA сравнение двух чисел в памяти по адресам в de и hl -;#2FCF обнуление переменной xE9EB -;#2FDB инкременит слова (xDD89)=(xDD89)+1 -;#2FE5 декремент слова (xDD89)=(xDD89)-1 -;#2FEF умножение bc=bc*#10 -;#3000 копирование из (hl) в (de) 4х байт -;#3005 загрузка числа в регистры из памяти +6 байт к адресу hl -;#300A загрузка числа в регистры из памяти +12 байт к адресу hl -;#300E загрузка числа в регистры из памяти -;#301C загрузка числа из регистров в память -;#302A декремент (hl)=(hl)-1 -;#3035 вычитание (hl)=(hl)-(de) -;#3047 инкремент числа по адресу hl -;#3052 сложение двух 4х байтных чисел -;#3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши -;#30B9 идентификация жесткого диска -;#30C6 печать окна для тестирования HDD -;#30F3 печать кода ошибки винчестера -;#3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -;#3163 печать текущего номера цилиндра -;#31AA удаление всех разделов MBR -;#31D4 неиспользуемая область -;#3200 каталог ROM-disk -;#3300 ROM-disk - - -;АДРЕС: #0000 *NOT USED* (#08 байт) -x0000 ds #08 - -;АДРЕС: #0008 печать сообщения по номеру в BC -x0008 jp x11CD - -;АДРЕС: #000B *NOT USED* (#05 байт) -x000B ds #05 - -;АДРЕС: #0010 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#0B байт) -x0015 ds #0B - -;АДРЕС: #0020 печать строки -x0020 ex (sp),hl - push af - jp x0103 - -;АДРЕС: #0025 *NOT USED* (#0B байт) -x0025 ds #0B - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#3D байт) -x0033 ds #3D - -;АДРЕС: #0070 переменные ROM-disk -x0070 db #33 ;смещение начала ром диска (в блоках по 256 байт) -x0071 db #0D ;количество свободных секторов в странице - db #32 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #05 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 ret - -;АДРЕС: #0103 печать строки (rst #20) -x0103 ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x0103 - pop af - ex (sp),hl - ret - -;АДРЕС: #0110 опрос Break. cy=1 не нажата -x0110 ld a,#FE - in a,(#FE) - rrca - ret c ;cs не нажата - ld a,#7F - in a,(#FE) - rrca - ret - -;АДРЕС: #011C опрос манипуляторов и печать курсора -;вых: cy=1 нажата fire на джойстике/кнопка мыши -; a=#80 - курсор изменил положение -; a=#81 - курсор в пределах текущего окна -; a=#82 - курсор мыши вне пределов текущего окна -; cy=1 нажата кнопка мыши -; a=#91 - нажата левая кнопка мыши -; a=#92 - нажата правая кнопка мыши -; a=#93 - нажата средняя кнопка мыши -; a>=#94 - курсор вне пределов текущего окна -; cy=0 fire на джойстике/кнопки мыши не нажаты -x011C or a - ld hl,xE03B - bit 7,(hl) - ret z ;мышь и джойстик отключены - ld c,#00 - bit 6,(hl) - call nz,x0260 ;опрос kempston joystick - bit 4,c - jr nz,x0149 ;нажата Fire - bit 5,(hl) - jr z,x0149 ;мышь отключена - call x021B ;опрос мыши - jr z,x015E ;кнопки не нажаты, печать курсора - push hl - call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (xE008),hl ;координаты курсора в окне - pop hl - ld a,c ;состояние кнопок мыши - or %10010000 - scf - bit 2,(hl) - ret z - set 3,a - ret -;нажата Fire kempstone joy/не нажата Fire kempstone joy при отключенной мыши -;hl=xE03B -;c - состояние кнопок джойстика -x0149 push hl - call x02A1 ;обработка задержек дял графического курсора - pop hl - scf - ld a,#80 - bit 0,(hl) - res 0,(hl) - jr nz,x0163 - inc a - bit 1,(hl) - res 1,(hl) - jr nz,x0163 -x015E call x0169 ;печать курсора мыши - or a - ret -x0163 bit 2,(hl) - ret z ;курсор в пределах текущего окна - ld a,#82 - ret - -;АДРЕС: #0169 печать курсора мыши -;вых: a - смещение курсора в знакоместе -; -x0169 set 7,(iy-#0A) ;курсор напечатан - ld ix,(xE12A) ;адрес данных курсора - ld hl,x01C3 ;п/п печати курсора мыши - jr x0186 - -;АДРЕС: #0176 восстановление экрана под курсором мыши -;вых: a - смещение курсора в знакоместе -; -x0176 bit 7,(iy+#27) - ret z ;мышь и джойстик отключены - ld hl,xE00A - bit 7,(hl) - ret z ;курсор не напечатан - res 7,(hl) - ld hl,x0212 ;п/п восстановления 3х байт экрана -x0186 ld (xE51C+1),hl - ld de,xDFD2 ;адрес буфера - ld hl,(xE03C) ;координаты курсора мыши - ld b,h - ld a,#C0 - sub b - ret z ;crd Y за пределами экрана - ret c ;crd Y за пределами экрана - cp #08 - jr c,x019B - ld a,#08 -x019B ld b,a ;высота для сохранения/восстановления экрана -;сохранение/восстановление экрана под курсором мыши -x019C push bc - ld c,l - ld b,h ;координаты - push bc - ld a,b - or a - rra - scf - rra - or a - rra - xor b - and #F8 - xor b - ld h,a - ld a,c - rlca - rlca - rlca - xor b - and #C7 - xor b - rlca - rlca - ld l,a ;адрес на экране - ld a,c - and #07 ;смещение в знакоместе - call xE51C ;сохраним/восстановим 3 байта - pop hl - inc h ;crd Y +1 - pop bc - djnz x019C - ret - -;печать одной линии курсора на экране с сохранением экрана в буфере -x01C3 push hl ;сохраним в буфере - ldi - ldi - ldi - pop hl - push de - push hl - ld b,(ix+0) - ld e,(ix+1) - ld h,#00 ;линия данных - ld c,(ix+#10) - ld d,(ix+#11) - ld l,#FF ;линия маски - or a - jr z,x01F0 ;курсор печатаем с начала знакоместа -x01E0 srl b ;ротация данных и маски - rr e - rr h - scf - rr c - rr d - rr l - dec a - jr nz,0x1E0 -x01F0 ex (sp),hl ;hl адрес на экране - ld a,c - and (hl) - or b - ld (hl),a ;1й байт - inc hl - ld a,l - and #1F - jr z,x020B ;край экрана - ld a,d - and (hl) - or e - ld (hl),a ;2й байт - inc hl - ld a,l - and #1F - jr z,x020B ;край экрана - pop de - push de - ld a,e - and (hl) - or d - ld (hl),a ;3й байт -x020B pop de - inc ix - inc ix - pop de - ret - -;восстановление одной линии экрана под курсором -x0212 ex de,hl - ldi - ldi - ldi - ex de,hl - ret - -;АДРЕС: #021B опрос мыши -;вых: c - состояние кнопок мыши -; z - нет нажатых кнопок -; -x021B push hl - ld bc,#FBDF ;по оси X - in a,(c) - ld b,#FF ;крайняя координата X - ld hl,xE12C ;предыдущее состояние портов мыши - ld de,xE03C ;координаты курсора мыши - call x0244 ;коррекция crd X курсора - ld b,#FF - in a,(c) - neg - ld b,#BF ;крайняя координата Y - ex de,hl - inc hl - inc de - call x0244 ;коррекция crd Y курсора - ld b,#FA - in a,(c) - cpl - and #07 - ld c,a ;нажатые кнопки - pop hl - ret -;коррекция crd X/Y курсора -x0244 push bc - ld b,(hl) - ld (hl),a - sub b ;a - +/- дельта crd - ex de,hl - pop bc - ret z ;не было перемещения - jp m,x0256 ;движение влево/вверх - add a,(hl) ;движение вправо/вниз - jr c,x0254 - cp b ;правый/нижний предел экрана - ld (hl),a - ret c -x0254 ld (hl),b ;достигли предела экрана - ret -x0256 neg ;движение влево/вверх - ld b,a ;ABS(delta Crd) - ld a,(hl) - sub b - ld (hl),a - ret nc - ld (hl),#00 ;достигли предела экрана - ret - -;АДРЕС: #0260 опрос kempston joystick -;вых: c - состояние кнопок джойстика -; -x0260 ld bc,#FF1F - in c,(c) - ld d,(iy+#2E) ;шаг перемещения - push hl - ld hl,(xE03C) ;crd Y/X - bit 1,c ;нажатие влево - jr z,x0276 - ld a,l - sub d - jr nc,x0275 - xor a -x0275 ld l,a -x0276 bit 0,c ;нажатие вправо - jr z,x0285 - ld a,l - add a,d - jr c,x0282 - cp #FC - jr c,x0284 -x0282 ld a,#FC ;крайняя координата X -x0284 ld l,a -x0285 bit 3,c ;нажатие вверх - jr z,x028F - ld a,h - sub d - jr nc,x028E - xor a -x028E ld h,a -x028F bit 2,c ;нажатие вниз - jr z,x029C - ld a,h - add a,d - cp #BE - jr c,x029B - ld a,#BE ;крайняя координата Y -x029B ld h,a -x029C ld (xE03C),hl - pop hl - ret - -;АДРЕС: #02A1 обработка задержек дял графического курсора -;вх: c - состояние кнопок джойстика -x02A1 ld hl,xE00A - bit 4,c - jr nz,x02D8 ;нажата fire на джойстике - bit 6,(hl) - jr nz,x02C0 ;установка задержки second wait при необходимости - bit 5,(hl) - jr z,x02B5 ;сброс задержек и установка курсора №1 - ld a,(hl) - and #1F - jr nz,x0322 ;уменьшение счетчика задержки -;сброс задержек и установка курсора №1 -x02B5 ld a,(hl) - and #80 - ld (hl),a -;установка курсора №1 -x02B9 ld hl,xE12E - ld (xE12A),hl - ret -;установка задержки second wait при необходимости -x02C0 bit 5,(hl) - jr nz,x02B5 ;сброс задержек и установка курсора №1 - ld a,(hl) - and #1F - jr z,x02B5 ;сброс задержек и установка курсора №1 - res 6,(hl) - set 5,(hl) - ld a,(iy+#2C) ;значение second wait -;установка величины задержки -x02D0 push af - ld a,#E0 - and (hl) - pop de - or d - ld (hl),a - ret -;если нажата fire на джойстике -x02D8 bit 5,(hl) - jr nz,x0312 ;установка и обработка задержки second debouncing - bit 6,(hl) - jr nz,x02FF - ld a,(hl) - and #1F - jr nz,x02EA - ld a,(iy+#2A) ;значение first debouncing - jr x02D0 ;установка величины задержки -x02EA dec (hl) - ld a,(hl) - and #1F - ret nz - set 6,(hl) - ld a,(iy+#2B) ;значение before repeat - call x02D0 ;установка величины задержки - ld hl,xE14E - ld (xE12A),hl - jr x0307 -x02FF ld a,(hl) - and #1F - jr nz,x0322 ;уменьшение счетчика задержки - call x02B9 ;установка курсора №1 -x0307 call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (xE008),hl ;координаты курсора мыши в текущем окне (в знакоместах) -x030D set 0,(iy+#27) - ret -;установка и обработка задержки second debouncing -x0312 bit 6,(hl) - jr nz,x031D - set 6,(hl) - ld a,(iy+#2D) ;значение second debouncing - jr x02D0 ;установка величины задержки -x031D ld a,(hl) - and #1F - jr z,x0324 -x0322 dec (hl) ;уменьшение счетчика задержки - ret -x0324 push hl - call x02B5 ;сброс задержек и установка курсора №1 - pop hl - ld a,#1F - call x02D0 ;установка величины задержки - call x0344 ;определение попадания курсора в границы текущего окна - or a - ld de,(xE008) ;предыдущие координаты курсора в текущем окне (в знакоместах) - ld (xE008),hl ;новые координаты курсора в текущем окне (в знакоместах) - sbc hl,de - ld a,h - or l - jr nz,x030D ;координаты изменились - set 1,(iy+#27) - ret - -;АДРЕС: #0344 определение попадания курсора мыши в границы текущего окна -;вых: во флагах состояние режима прерываний -; hl - координаты курсора мыши в окне в знакоместах окна -; -x0344 ld a,r - push af ;сохраним режим прерываний - di - res 2,(iy+#27) - ld hl,(xE03C) ;координаты курсора мыши - srl h - srl h - srl h - ld a,h - sub (ix+2) - jr c,x037B ;выше текущего окна - ld h,a ;координата Y в окне - cp (ix+4) - jr nc,x037B ;ниже текущего окна - ld a,(ix+3) - rlca - rlca - rlca - ld b,a - ld a,l - sub b - jr c,x037B ;левее окна - ld b,(ix+#0A) - ld l,#FF -x0371 inc l - sub b - jr nc,x0371 - ld a,l - cp (ix+#0B) - jr c,x037F ;в пределах окна -x037B set 2,(iy+#27) -x037F pop af - ret - -;АДРЕС: #0381 ожидание нажатия клавиш и обработка реакции на них -;вых: cy=0 a=#0D опция выбрана -; cy=1, a=#03 отмена с закрытием окна -; cy=1, a=a неиспользуемые комбинации. нет реакции -x0381 rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - -;АДРЕС: #0385 обработка реакции на нажатия клавиш -;вх: a - код нажатой клавиши -;вых: cy=0 a=#0D опция выбрана -; cy=1, a=#03 отмена с закрытием окна -; cy=1, a=a неиспользуемые комбинации. нет реакции -x0385 cp #82 - jr c,x03B0 ;a=[#00..#81] - jr z,x03AC ;a=#82 KempJoy fire вне окна - cp #91 - ret c ;a=[#83..#90] - cp #A0 - ccf - ret c ;a=[#A0..#FF] ???задел для кириллицы??? - bit 3,a ;a=[#91..#9F] mouse - jr nz,x03AC ;кнопка мыши вне окна - and #03 - jr z,x03A8 ;не нажата ни левая, ни правая кнопка мыши - cp #03 - jr z,x03A8 ;fire+cancel - rrca - jr nc,x03AC ;cancel на окне - call x03BD ;устанавливаем координаты в окне по курсору мыши - ccf - ld a,#0D - ret -x03A8 or #94 - scf - ret -x03AC ld a,#03 - scf - ret -x03B0 cp #80 - ret c ;a=[#00..#7F] - call x03BD ;устанавливаем координаты в окне по курсору KempJoy - cp #81 - ret c ;!!! ОШИБКА fire joy =#80 а не #81 - ld a,#0D - or a - ret -;устанавливаем координаты в окне по курсору мыши -x03BD push af - call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (ix+0),h - ld (ix+1),l - pop af - ret - -;АДРЕС: #03C9 таблица адресов процедур графического курсора -x03C9 dw x041D ;опрос управления без опроса манипуляторов - dw x040D ;опрос управления с заданными параматрами опроса манипуляторов - dw x0385 ;обработка реакции на нажатия клавиш - dw x042C ;чтение координат курсора - dw x0431 ;проверка выхода курсора за нижнюю границу экрана - dw x03FF ;определение попадания курсора мыши в границы текущего окна - dw x03F4 ;загрузка из RAM8 в память hl графического изображения курсора №1 - dw x03E4 ;загрузка в RAM8 графического изображения курсора №1 из hl - dw x03EF ;загрузка из RAM8 в память hl графического изображения курсора №2 - dw x03DF ;загрузка в RAM8 графического изображения курсора №2 из hl - dw x08FB ;проверка наличия мыши - -;АДРЕС: #03DF загрузка в RAM8 графического изображения курсора №2 из hl -;вх: hl - адрес данных курсора -x03DF ld de,xE14E - jr x03E7 - -;АДРЕС: #03E4 загрузка в RAM8 графического изображения курсора №1 из hl -;вх: hl - адрес данных курсора -x03E4 ld de,xE12E -x03E7 ld bc,#0020 - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - ret - -;АДРЕС: #03EF загрузка из RAM8 в память hl графического изображения курсора №2 -;вх: hl - адрес в памяти -x03EF ld hl,xE14E - jr x03F7 - -;АДРЕС: #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 -;вх: hl - адрес в памяти -x03F4 ld hl,xE12E -x03F7 ld bc,#0020 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret - -;АДРЕС: #03FF определение попадания курсора мыши в границы текущего окна -;вых: de - координаты курсора на экране -; cy =0 курсор мыши в пределах текущего окна -; cy =1 курсор мыши вне пределов текущего окна -x03FF call x0344 ;определение попадания курсора мыши в границы текущего окна - call x042C ;de - координаты курсора на экране - or a - bit 2,(iy+#27) - ret z ;курсор мыши в пределах текущего окна - scf - ret - -;АДРЕС: #040D опрос управления с заданными параматрами опроса манипуляторов -;вх: 7-5,b - новые значения установок графических манипуляторов -;вых: de - координаты курсора -x040D ld hl,xE03B - push hl - ld a,b - and #E0 - ld b,a - ld a,(hl) - push af - and #1F - or b - ld (hl),a - jr x0425 - -;АДРЕС: #041D опрос управления без опроса манипуляторов -;вых: de - координаты курсора -x041D ld hl,xE03B - push hl - ld a,(hl) - res 7,(hl) ;оключение манипуляторов - push af -x0425 rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop bc - pop hl - ld (hl),b - -;АДРЕС: #042C чтение координат курсора -;вых: de - координаты курсора -x042C ld de,(xE03C) - ret - -;АДРЕС: #0431 проверка выхода курсора за нижнюю границу экрана -;вх: hl - координаты графического курсора -;вых: (xE03C),hl - новые координаты курсора -x0431 ld a,#BF - cp h - jr nc,x0437 - ld h,a -x0437 ld (xE03C),hl - ret - -;АДРЕС: #043B ОШИБКА!!!! вызов процедуры по номеру в C -;вх: c - номер процедуры -x043B push hl - rst #30 - dw rom2_x300F ;чтение содержимого регистра ix основной программы - db #02 - ld hl,x03C9 - ld b,#00 ;ОШИБКА!!!! в B может передаваться параметр - sla c - add hl,bc - ex (sp),hl ;ОШИБКА!!!! - ret - -;АДРЕС: #044A таблица адресов дескрипторов меню -x044A dw x0660 ;окно 0 (main menu) - dw x06B6 - dw x06CD - dw x068B - dw x0882 - dw x06F8 - dw 0 - dw x0737 - dw x0797 - dw x0762 - dw x08B2 - dw x07C2 - dw x07F2 - dw x081D - dw x084D - -;АДРЕС: #0468 сообщения для печати опций меню -;+0 7-6, дополнительное смещение координаты Y -; 5,=1 в байтах +1/2 адрес отдельно п/п печати опции меню -; 4,=1 в байте +3 номер плоскости/страницы, если п/п в другой странице -; 5,=0 в байтах +1/2 номер группы сообщений и номер сообщения в ней -; 4,=1 (+3/4) адрес переменной с номером строки [0..3] -; +5 список строк в формате: +0 длина строки без учета данного байта -; +n строка в формате +0 флаги, +1/2 смещение -; 4,=0 (+3/4) смещение до переменной/блока переменных -; 2,=0 -> смещение в следующей ячейке однобайтное -; 2,=1 -> смещение в следующих ячейках двухбайтное -; 3,=1 -> это блок переменных и в следущих ячейках адрес до ячейки со смещением до нужной переменной -; 1-0,=01 два состояния опции, номера сообщений после маски -; =10 состояние опции это число по адресу переменной опции -; =11 1-4 состояния опции, по номеру в de -;+1 номер блока сообщений -;+2 номер сообщения в этом блоке -; -x0468 db %01000000 ;C. catalogue disk - db #01,#51 -x046B db %01000000 ;format НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #01,#4B -x046E db %01000000 ;D. Disk utility - db #01,#4D -x0471 db %01000000 ;F. format disk - db #01,#45 -x0474 db %01000000 ;Q. quick format - db #01,#68 -x0477 db %01000000 ;T. test disk - db #01,#4E -x047A db %01000110 ;Y. retry constant - db #01,#4C - dw #1FB7 ;#E014+#1FB7=#FFCB - db #01,#08 -x0481 db %00001101 ;I. side - db #01,#3B - dw #1FBC ;=#FFD0 - dw #FFCA - db #80 - db #3C,#3D -x048B db %00001101 ;R. track - db #01,#38 - dw #1FBC ;=#FFD0 - dw #FFCA - db #20 - db #39,#3A -x0495 db %01000010 ;L. interleaving - db #01,#52 - db #18 - db #01,#1B ;минимум и максимум -x049B db %00001101 ;S. side - db #01,#3B - dw #1FB8 ;=#FFCC - dw #FFCA - db #80 - db #3C,#3D -x04A5 db %01001101 ;T. track - db #01,#38 - dw #1FB8 ;=#FFCC - dw #FFCA - db #40 - db #39,#3A -x04AF db %01000111 ;D. disk drive - db #01,#33 - dw #1FB6 ;=#FFCA - db #34,#35,#36,#37 -x04B8 db %00001111 ;E. sector - db #01,#40 - dw #1FBC ;=#FFD0 - dw #FFCA - db #41,#42,#43,#44 -x04C3 db %00001111 ;P. speed - db #01,#1A - dw #1FB8 ;=#FFCC - dw #FFCA - db #47,#48,#49,#4A -x04CE db %01000001 ;S. sound - db #01,#31 - db #14,#01 - db #25,#26 -x04D5 db %00000001 ;A. autoconfig - db #02,#0C - db #14,#02 - db #05,#04 -x04DC db %01000001 ;R. reset RAM - db #01,#30 - db #14,#80 - db #25,#26 -x04E3 db %01000000 ;M. monitor - db #01,#0A -x04E6 db %01000000 ;R. reset - db #01,#29 -x04E9 db %00000010 ;L. string width - db #01,#27 - db #58 - db #00,#EA ;0..233 -x04EF db %00000010 ;W. page length - db #01,#28 - db #57 - db #00,#79 -x04F5 db %00000010 ;F. line feed - db #01,#2A - db #41 - db #00,#21 -x04FB db %01000010 ;C. carriage return - db #01,#2B -x04FE db %01000000 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #00,#21 -x0501 db %00000010 ;V. form feed - db #01,#2E -x0504 db %01000010 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #00,#21 -x0507 db %00000001 ;D. data - db #01,#23 - db #15,#80 - db #0E,#0F -x050E db %01000001 ;S. speed - db #01,#1A - db #15,#02 - db #1B,#1C -x0515 db %00000001 ;A. data bits - db #01,#1D - db #15,#04 - db #1E,#1F -x051C db %00000001 ;P. stop bits - db #01,#20 - db #15,#08 - db #21,#22 -x0523 db %01000001 ;I. interface - db #01,#17 - db #15,#01 - db #18,#19 -x052A db %01000000 ;P. printer - db #01,#0B -x052D db %01000000 ;computer НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #01,#2C -x0530 db %10000000 ;0. previous menu - db #01,#07 -x0533 db %10000000 ;0. Continue program - db #01,#08 -x0536 db %01000000 ;G. magic button - db #01,#09 -x0539 db %01000000 ;B. Save & load - db #01,#2D -x053C db %01000000 ;M. Monitor - db #01,#0A -x053F db %01000001 ;S. print screen - db #01,#03 - db #12,#04 - db #0E,#0F -x0546 db %01000000 ;P. Print Screen - db #01,#03 -x0549 db %01000000 ;P. printer * 2 - db #01,#55 -x054C db %01000000 ;S. printer * 1 - db #01,#54 -x054F db %01000000 ;D. disk ... - db #01,#0C -x0552 db %01000000 ;S. Set Up - db #01,#04 -x0555 db %01000000 ;R. reset monitor - db #01,#53 -x0558 db %01000000 ;S. save ... - db #01,#5A -x055B db %01000000 ;L. load ... - db #01,#5B -x055E db %10000000 ;R. ROM disk - db #00,#5E -x0561 db %01000001 ;A. autostart - db #01,#69 - db #14,#04 - db #25,#26 -x0568 db %00000001 ;Z. compression - db #02,#0D - db #13,#20 - db #04,#05 -x056F db %00000010 ;?. degree - db #02,#0E - db #26,#01 - db #FF -x0575 db %01000001 ;V. Computer Speed - db #01,#58 - db #19,#40 - db #56,#57 -x057C db %01000010 ;N. NMI debouncing - db #01,#5D - db #25 - db #01,#80 ;1..127 -x0582 db %01000000 ;G. graphics manipulators - db #01,#5E -x0585 db %01000001 ;G. manipulators - db #01,#60 - db #27,#80 - db #26,#25 -x058C db %01000001 ;M. mouse - db #01,#61 - db #27,#20 - db #26,#25 -x0593 db %00000001 ;K. kempston joystick - db #01,#62 - db #27,#40 - db #26,#25 -x059A db %01000010 ;1. first debouncing - db #01,#63 - db #2A - db #01,#C8 -x05A0 db %00000010 ;2. before repeat - db #01,#64 - db #2B - db #01,#C8 -x05A6 db %00000010 ;3. second wait - db #01,#65 - db #2C - db #01,#C8 -x05AC db %00000010 ;4. second debouncing - db #01,#66 - db #2D - db #01,#C8 -x05B2 db %00000010 ;S. size of step - db #01,#67 - db #2E - db #01,#08 -x05B8 db %01000000 ;T. time & date - db #02,#01 -x05BB db %01000001 ;I. indicator - db #02,#03 - db #27,#08 - db #04,#05 -x05C2 db %01000010 ;H. hours - db #02,#06 - db #E4 ;=#1C - db #00,#18 -x05C8 db %00000010 ;M. minutes - db #02,#07 - db #E3 ;-#1D - db #00,#3C -x05CE db %00000010 ;S. seconds - db #02,#08 - db #E2 ;-#1E - db #00,#3C -x05D4 db %00000010 ;Y. years - db #02,#09 - db #E7 ;-#19 - db #00,#64 -x05DA db %00000010 ;O. months - db #02,#0A - db #E6 ;-#1A - db #01,#0D -x05E0 db %01000010 ;D. days - db #02,#0B - db #E5 ;-#1B - db #01,#20 -x05E6 db %01000000 ;P. save CMOS - db #01,#6A -x05E9 db %00000000 ;G. load CMOS - db #01,#6B -x05EC db %01000000 ;C. save Set Up to disk - db #01,#6C -x05EF db %01000000 ;H. Hard disk utility - db #02,#0F -x05F2 db %01100000 ;C. cylinders - dw x1047 ;печать количества цилиндров HDD -x05F5 db %00000010 ;H. head - db #02,#11 - db #E0 ;-#20 - db #01,#40 -x05FB db %00000010 ;S. sector - db #01,#40 - db #E1 ;-#1F - db #01,#40 -x0601 db %00000001 ;L. LBA mode - db #02,#35 - db #1C,#04 - db #04,#05 -x0608 db %01000001 ;M. TRDOS mirror - db #02,#36 - db #1C,#10 - db #05,#04 -x060F db %01000000 ;P. partition manager - db #02,#12 -x0612 db %01000000 ;A. delete all part - db #02,#14 -x0615 db %01000000 ;G. global part. table - db #02,#13 -x0618 db %01000000 ;V. partition information - db #02,#16 -x061B db %01000000 ;L. local part. table - db #02,#15 -x061E db %01000000 ;D. delete partition - db #02,#18 -x0621 db %01000000 ;C. create partition - db #02,#19 -x0624 db %00000000 ;N. rename partition - db #02,#32 -x0627 db %00000000 ;W. write to disk - db #02,#1A -x062A db %10000000 ;R. restore from disk - db #02,#1B -x062D db %01000000 ;A. auto detection hdd - db #02,#1C -x0630 db %00100011 ;D. mount on D: - dw x247E ;печать нового пути -x0633 db %00100010 ;C. mount on C: - dw x247E ;печать нового пути -x0636 db %00100001 ;B. mount on B: - dw x247E ;печать нового пути -x0639 db %01100000 ;A. mount on A: - dw x247E ;печать нового пути -x063C db %01000001 ;A. autostart - db #01,#69 - db #1C,#01 - db #26,#25 -x0643 db %00000011 ;V. from drive - db #01,#70 - db #DD ;-#23 - db #34,#35,#36,#37 -x064B db %00100000 ;Z. dismount... - dw x24CE ;печать нового названия пункта - db #0B,#80 -x0650 db %00000001 ;O. on start - db #02,#31 - db #1C,#02 - db #05,#04 -x0657 db %01000000 ;1. test - db #01,#06 -x065A db %00000000 ;2. test - db #01,#06 -x065D db %01000000 ;D. delete all part - db #02,#14 - -;АДРЕС: #0660 дескрипторы меню -;дескриптор опций -;+0,4-0 цифра/буква выбора опции 0-5/A-Z -; ,7-5 номер атрибутов печати из таблицы xEAED -;+1,3-2 старший байт смещения от x08DD до п/п определения доступности опции -; 5-4 старший байт смещения от x0468 параметры опции -; 7-6 старший байт смещения от x08DD до п/п обработки опции -;+2 младший байт смещения от x08DD до п/п определения доступности опции -;+3 младший байт смещения от x0468 параметры опции -;+4 младший байт смещения от x08DD до п/п обработки опции -x0660 db #07 ;количество опций в меню -1 - db #01,#02 ;меню: main menu - db 0*#20+#1A,%01000000,#6A,#CB,#E4 ;0. Continue program x0947/x0533/ x0AC1 - db 1*#20+#01,%01000000,#6A,#D1,#C1 ;B. Save & load x0947/x0539/x0A9E - db 2*#20+#0C,%01000000,#6F,#D4,#B2 ;M. Monitor x094C/x053C/ x0A8F - db 1*#20+#0F,%01000000,#64,#DE,#C3 ;P. Print Screen x0941/x0546/x0AA0 - db 1*#20+#03,%01000000,#6A,#06,#BC ;D. Disk utility x0947/x046E/x0A99 - db 1*#20+#07,%01010000,#5E,#87,#7A ;H. Hard disk utility x093B/x05EF/x0A57 - db 1*#20+#12,%01000000,#6A,#EA,#C2 ;S. Set Up x0947/x0552/x0A9F - db 1*#20+#15,%10010000,#3C,#0D,#9D ;V. Computer Speed x0919/x0575/x0B7A - -x068B db #07 ;количество опций в меню -1 - db #01,#5C ;меню: save & load of program - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#06,%01000000,#2F,#CE,#EC ;G. magic button x090C/x0536/ x0AC9 - db 1*#20+#12,%00000000,#6F,#F0,#D8 ;S. save ... x094C/x0558/x09B5 - db 1*#20+#19,%10010000,#6F,#00,#9D ;Z. compression x094C/x0568/x0B7A - db 1*#20+#16,%10010000,#48,#07,#A4 ;W. degree x0925/x056F/x0B81 - db 1*#20+#0B,%00000000,#6F,#F3,#DE ;L. load ... x094C/x055B/x09BB - db 1*#20+#00,%10000000,#6F,#F9,#9D ;A. autostart x094C/x0561/x0B7A - db 1*#20+#11,%00000000,#7B,#F6,#C3 ;R. ROM disk x0958/x055E/x09A0 - -x06B6 db #03 - db #01,#03 ;меню: print screen - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#12,%01000000,#6A,#E4,#A2 ;S. printer * 1 x0947/x054C/ x0A7F - db 1*#20+#0F,%01000000,#6A,#E1,#A3 ;P. printer * 2 x0947/x0549/ x0A80 - db 1*#20+#03,%00000000,#6A,#E7,#E4 ;D. disk ... x0947/x054F/x09C1 - -x06CD db #07 - db #01,#04 ;меню: Set Up - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#12,%10000000,#64,#D7,#9D ;S. print screen x0941/x053F/x0B7A - db 1*#20+#0F,%01000000,#6A,#C2,#BF ;P. printer x0947/x052A/x0A9C - db 1*#20+#0C,%01000000,#6A,#7B,#BD ;M. monitor x0947/x04E3/x0A9A - db 1*#20+#03,%01000000,#6A,#06,#BB ;D. Disk utility x0947/x046E/x0A98 - db 1*#20+#06,%01010000,#6A,#1A,#C0 ;G. graphics manipulat. x0947/x0582/x0A9D - db 1*#20+#13,%01010000,#57,#50,#BA ;T. time & date x0934/x05B8/x0A97 - db 2*#20+#11,%01000000,#6A,#ED,#73 ;R. reset monitor x0947/x0555/x0A50 - -x06F8 db #0B - db #01,#16 ;меню: Set Up printer - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#08,%10000000,#6A,#BB,#9D ;I. interface x0947/x0523/x0B7A - db 1*#20+#12,%10000000,#75,#A6,#9D ;S. speed x0952/x050E/x0B7A - db 1*#20+#00,%10000000,#75,#AD,#9D ;A. data bits x0952/x0515/x0B7A - db 1*#20+#0F,%10000000,#75,#B4,#9D ;P. stop bits x0952/x051C/x0B7A - db 1*#20+#03,%10000000,#6A,#9F,#9D ;D. data x0947/x0507/x0B7A - db 1*#20+#02,%10000000,#6A,#93,#A4 ;C. carriage return x0947/x04FB/x0B81 - db 1*#20+#05,%10000000,#6A,#8D,#A4 ;F. line feed x0947/x04F5/x0B81 - db 1*#20+#15,%10000000,#6A,#99,#A4 ;V. form feed x0947/x0501/x0B81 - db 1*#20+#0B,%10000000,#6A,#81,#A4 ;L. string width x0947/x04E9/x0B81 - db 1*#20+#16,%10000000,#6A,#87,#A4 ;W. page length x0947/x04EF/x0B81 - db 1*#20+#11,%01000000,#6A,#7E,#9B ;R. reset x0947/x04E6/x0A78 - -x0737 db #07 - db #01,#2F ;меню: Set Up monitor - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#0D,%10010000,#6A,#14,#A4 ;N. NMI debouncing x0947/x057C/x0B81 - db 1*#20+#11,%10000000,#6F,#74,#9D ;R. reset RAM x094C/x04DC/x0B7A - db 1*#20+#12,%10000000,#6A,#66,#98 ;S. sound x0947/x04CE/x0B75 - db 1*#20+#0F,%00010000,#4E,#7E,#C6 ;P. save CMOS x092B/x05E6/x09A3 - db 1*#20+#06,%00010000,#4E,#81,#CC ;G. load CMOS x092B/x05E9/x09A9 - db 1*#20+#02,%00010000,#6B,#84,#D2 ;C. save Set Up to disk x0948/x05EC/x09AF - db 1*#20+#00,%10000000,#6A,#6D,#9D ;A. autoconfig x0947/x04D5/x0B7A - -x0762 db #09 - db #01,#32 ;меню: Set Up disk utility - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 - db 1*#20+#13,%10000000,#6A,#3D,#9D ;T. track x0947/x04A5/x0B7A - db 1*#20+#12,%10000000,#6A,#33,#9D ;S. side x0947/x049B/x0B7A - db 1*#20+#0F,%10000000,#6A,#5B,#06 ;P. speed x0947/x04C3/x0AE3 - db 1*#20+#0B,%10000000,#6A,#2D,#A4 ;L. interleaving x0947/x0495/x0B81 - db 1*#20+#11,%10000000,#6A,#23,#9D ;R. track x0947/x048B/x0B7A - db 1*#20+#08,%10000000,#6A,#19,#9D ;I. side x0947/x0481/x0B7A - db 1*#20+#04,%10000000,#6A,#50,#0B ;E. sector x0947/x04B8/x0AE8 - db 1*#20+#18,%10000000,#6A,#12,#A4 ;Y. retry constant x0947/x047A/x0B81 - -x0797 db #07 - db #01,#4D ;меню: disk utility - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 - db 1*#20+#02,%10000000,#6A,#00,#48 ;C. catalogue disk x0947/x0468/x0B25 - db 1*#20+#05,%10000000,#6A,#09,#33 ;F. format disk x0947/x0471/x0B10 - db 1*#20+#10,%10000000,#6A,#0C,#26 ;Q. quick format x0947/x0474/x0B03 - db 1*#20+#13,%10000000,#6A,#0F,#3A ;T. test disk x0947/x0477/x0B17 - db 1*#20+#00,%10010000,#6A,#D4,#9D ;A. autostart x0947/x063C/x0B7A - db 1*#20+#15,%01010000,#6A,#DB,#F0 ;V. from drive x0947/x0643/x0ACD - -x07C2 db #08 - db #02,#0F ;меню: hard disk utility - db 0*#20+#1A,%01000000,#AD,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#00,%00010000,#80,#D1,#F5 ;A. mount on A: x095D/x0639/x09D2 - db 1*#20+#01,%00010000,#80,#CE,#F1 ;B. mount on B: x095D/x0636/x09CE - db 1*#20+#02,%00010000,#80,#CB,#ED ;C. mount on C: x095D/x0633/x09CA - db 1*#20+#03,%00010000,#80,#C8,#E9 ;D. mount on D: x095D/x0630/x09C6 - db 1*#20+#19,%10010000,#80,#E3,#9D ;Z. dismount... x095D/x064B/x0B7A - db 1*#20+#0C,%10010000,#80,#A0,#9D ;M. TRDOS mirror x095D/x0608/x0B7A - db 1*#20+#0F,%01010000,#06,#A7,#0B ;P. partition manager x08E3/x060F/x09E8 - db 1*#20+#12,%01000000,#6A,#EA,#B6 ;S. Set Up x0947/x0552/x0A93 - -x07F2 db #07 - db #02,#13 ;меню: global partition table - db 0*#20+#1A,%01000000,#6A,#C8,#DC ;0. previous menu x0947/x0530/x0AB9 - db 1*#20+#0B,%01010000,#80,#B3,#05 ;L. local part. table x095D/x061B/x09E2 - db 1*#20+#15,%01010000,#6A,#B0,#00 ;V. partition info. x0947/x0618/x09DD - db 1*#20+#02,%01010000,#86,#B9,#3F ;C. create partition x0963/x0621/x0A1C - db 2*#20+#03,%01010000,#9A,#B6,#35 ;D. delete partition x0977/x061E/x0A12 - db 2*#20+#00,%01010000,#6A,#AA,#4E ;A. delete all part x0947/x0612/x0A2B - db 1*#20+#11,%01010000,#6A,#C2,#30 ;R. restore from disk x0947/x062A/x0A0D - db 3*#20+#16,%01010000,#A1,#BF,#58 ;W. write to disk x097E/x0627/x0A35 - - -x081D db #08 - db #02,#15 ;меню: local partition table - db 0*#20+#1A,%01000000,#6A,#C8,#D7 ;0. previous menu x0947/x0530/x0AB4 - db 1*#20+#06,%01010000,#A7,#AD,#30 ;G. global part. table x0984/x0615/x0A0D - db 1*#20+#15,%00010000,#6A,#B0,#FB ;V. partition info. x0947/x0618/x09D8 - db 1*#20+#02,%01010000,#90,#B9,#44 ;C. create partition x096D/x0621/x0A21 - db 1*#20+#0D,%01010000,#9A,#BC,#49 ;N. rename partition x0977/x0624/x0A26 - db 2*#20+#03,%01010000,#9A,#B6,#3A ;D. delete partition x0977/x061E/x0A17 - db 2*#20+#00,%01010000,#6A,#AA,#53 ;A. delete all part x0947/x0612/x0A30 - db 1*#20+#11,%01010000,#6A,#C2,#08 ;R. restore from disk x0947/x062A/x09E5 - db 3*#20+#16,%01010000,#A1,#BF,#62 ;W. write to disk x097E/x0627/x0A3F - -x084D db #09 - db #01,#6D ;меню: Set Up hard disk - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#00,%01010000,#6A,#C5,#6C ;A. auto detection hdd x0947/x062D/x0A49 - db 1*#20+#0E,%10010000,#6A,#E8,#9D ;O. on start x0947/x0650/x0B7A - db 1*#20+#02,%10010000,#6A,#8A,#51 ;C. cylinders x0947/x05F2/x0B2E - db 1*#20+#07,%10010000,#6A,#8D,#89 ;H. head x0947/x05F5/x0B66 - db 1*#20+#12,%10010000,#6A,#93,#89 ;S. sector x0947/x05FB/x0B66 - db 1*#20+#0B,%10010000,#6A,#99,#9D ;L. LBA mode x0947/x0601/x0B7A - db 1*#20+#1B,%01010000,#00,#EF,#8F ;1. test x08DD/x0657/x0A6C - db 1*#20+#1C,%01010000,#00,#F2,#93 ;2. test x08DD/x065A/x0A70 - db 2*#20+#03,%01010000,#00,#F5,#97 ;D. delete all part x08DD/x065D/x0A74 - -x0882 db #08 - db #01,#5F ;меню: Set Up graphics manipulators - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#06,%10010000,#6A,#1D,#9D ;G. manipulators x0947/x0585/x0B7A - db 1*#20+#0C,%10010000,#1E,#24,#9D ;M. mouse x08FB/x058C/x0B7A - db 1*#20+#0A,%10010000,#12,#2B,#9D ;K. kempston joystick x08EF/x0593/x0B7A - db 1*#20+#12,%10010000,#0C,#4A,#A4 ;S. size of step x08E9/x05B2/x0B81 - db 1*#20+#1B,%10010000,#0C,#32,#A4 ;1. first debouncing x08E9/x059A/x0B81 - db 1*#20+#1C,%10010000,#0C,#38,#A4 ;2. before repeat x08E9/x05A0/x0B81 - db 1*#20+#1D,%10010000,#0C,#3E,#A4 ;3. second wait x08E9/x05A6/x0B81 - db 1*#20+#1E,%10010000,#0C,#44,#A4 ;4. second debouncing x08E9/x05AC/x0B81 - -x08B2 db #07 - db #02,#02 ;меню: Set Up time & date - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#07,%10010000,#57,#5A,#6E ;H. hours x0934/x05C2/x0B4B - db 1*#20+#0C,%10010000,#57,#60,#6E ;M. minutes x0934/x05C8/x0B4B - db 1*#20+#12,%10010000,#57,#66,#6E ;S. seconds x0934/x05CE/x0B4B - db 1*#20+#03,%10010000,#57,#78,#6E ;D. days x0934/x05E0/x0B4B - db 1*#20+#0E,%10010000,#57,#72,#6E ;O. months x0934/x05DA/x0B4B - db 1*#20+#18,%10010000,#57,#6C,#6E ;Y. years x0934/x05D4/x0B4B - db 1*#20+#08,%10010000,#57,#53,#84 ;I. indicator x0934/x05BB/x0B61 - -;АДРЕС: #08DD блок п/п определяющих доступность опций -;вых: cy =1 опция недоступна -; -;АДРЕС: #08DD блок п/п обработки опций -;вых: -; -x08DD bit 7,(iy+#1A) ;доступность опции 1. test - jr x0938 - -x08E3 bit 7,(iy+#1B) ;доступность опции P. partition manager - jr x0938 - -x08E9 bit 7,(iy+#27) ;доступность опции S. size of step - jr x0938 - -;АДРЕС: #08EF доступность опции K. kempston joystick -x08EF call x08FB ;доступность опции K. kempston joystick - or a - ret - -x08F4 ccf ;НЕ ИСПОЛЬЗУЕТСЯ!!!! - ret nc - res 6,(iy+#27) - ret - -x08FB push bc ;доступность опции M. mouse - ld bc,#FADF - in a,(c) - pop bc - and #38 - cp #38 - ret nc - res 5,(iy+#27) - ret - -x090C scf ;доступность опции G. magic button - bit 4,(iy-#02) - ret z ;48k - ld a,(iy-#01) - and #13 - jr x0945 - -x0919 ld a,(xE02D) ;определение доступности турбо-режима - rlca - ccf - ret - -x091F bit 5,(iy-#02) ;48k? - jr x0945 - -x0925 bit 5,(iy+#13) ;доступность опции W. degree - jr x0938 - -x092B call x091F ;доступность опции P. save CMOS - ret c - bit 5,(iy+#1A) - ret nz - -x0934 bit 6,(iy+#1A) ;доступность опции T. time & date -x0938 ret nz - scf - ret - -x093B bit 5,(iy+#1A) ;доступность опции Hard disk utility - jr x0938 - -x0941 bit 1,(iy+#12) ;доступность опции Print Screen -x0945 ret z - scf -x0947 ret - -x0948 call x091F ;доступность опции C. save Set Up to disk - ret c - -x094C ld a,(xC063) ;доступность опции Monitor - or a - jr x0945 - -x0952 bit 0,(iy+#15) ;доступность опции параметров принтера - jr x0938 - -x0958 call x10C7 ;доступность опции R. ROM disk - jr x0938 - -x095D bit 7,(iy+#1C) ;доступность монтирования образов - jr x0938 - -x0963 call x2936 ;доступность опции C. create partition - ld hl,#0003 - or a - sbc hl,de - ret - -x096D call x2936 ;доступность опции C. create partition - ld hl,#003F - or a - sbc hl,de - ret - -x0977 call x2936 ;доступность опции D. delete partition - ld a,e - or d - jr x0938 - -x097E bit 6,(iy+#1C) ;доступность опции W. write to disk - jr x0938 - -x0984 bit 6,(iy+#1C) ;доступность опции G. global part. table - jr x0945 - -;АДРЕС: #098A проверка наличия раздела MFS на винчетере -;вых: z - нет раздела MFS/либо нет винчестера -; nz - есть раздел MFS -x098A xor a - bit 7,(iy+#1B) - ret z ;проверка геометрии винчестера не пройдена - bit 7,(iy+#1C) - ret nz ;на винчестере есть раздел MFS - res 7,(iy+#0B) ;меню mount - push bc - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - pop bc - xor a - ret - -;пункт меню: R. ROM disk -x09A0 jp x10DB ;обработка пункта меню: R. ROM disk - -;пункт меню: P. save CMOS -x09A3 rst #30 - dw rom4_x036C ;запись переменных в CMOS и в NVRAM - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: G. load CMOS -x09A9 rst #30 - dw rom4_x0305 ;установка переменных из NVRAM/CMOS128 - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: C. save Set Up to disk -x09AF rst #30 - dw rom4_x0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: S. save ... -x09B5 rst #30 - dw rom6_x097E ;сохранение zs-snap (S. save ... snap) - db #06 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: L. load ... -x09BB rst #30 - dw rom6_x0976 ;загрузка zs-snap (S. load ... snap) - db #06 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: D. disk ... (сохранение экрана на диск) -x09C1 rst #30 - dw rom6_x067F ;сохранение экрана пользователя на диск - db #06 - ret - -;пункт меню: D. mount on D: -x09C6 ld a,#03 - jr x09D3 -;пункт меню: C. mount on C: -x09CA ld a,#02 - jr x09D3 -;пункт меню: B. mount on B: -x09CE ld a,#01 - jr x09D3 -;пункт меню: A. mount on A: -x09D2 xor a -x09D3 call x24F0 ;монтирование образа к дисководу - jr x09E0 ;печать текущего меню монитора - -;пункт меню: V. local partition infomation -x09D8 call x29D5 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: V. global partition infomation -x09DD call x29DC ;печать окна global partition information и выбор записи в нем -x09E0 jr x0A54 ;печать текущего меню монитора - -;пункт меню: L. local part. table -x09E2 call x2F5D ;запрос на сохранение сектора MBR, если были изменения - -;пункт меню: R. restore from disk чтение каталога подразделов -x09E5 call x0B86 - -;пункт меню: P. partition manager (local) -x09E8 rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x09F6 ;найден - cp #63 - jr z,x0A01 ;нет подраздела MFS - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 -x09F6 res 6,(iy+#1C) ;сброс признака изменения раздела - call x2620 ;формирование в буфере xEBF5 списка подразделов MFS - ld a,#0D - jr x0A0A -x0A01 res 6,(iy+#1C) ;сброс признака изменения раздела - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - ld a,#0C -x0A0A jp x0AA1 - -;пункт меню: G. global partition table/R. restore from disk чтение каталога разделов -x0A0D call x0B86 - jr x0A01 - -;пункт меню: D. delete global partition -x0A12 call x2C1F - jr x0A54 ;печать текущего меню монитора - -;пункт меню: D. delete local partition -x0A17 call x2D45 ;удаление подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: C. create global partition -x0A1C call x2BCA - jr x0A54 ;печать текущего меню монитора - -;пункт меню: C. create local partition -x0A21 call x2C37 ;создание подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: N. rename local partition -x0A26 call x245E ;переименование подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: A. delete all global partition -x0A2B call x2733 - jr x0A54 ;печать текущего меню монитора - -;пункт меню: A. delete all local partition -x0A30 call x261A ;удаление всех подразделов - jr x0A54 ;печать текущего меню монитора - -;пункт меню: W. write to disk (запись MBR на винчестер) -x0A35 call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x0A54 ;отмена записи - call x2F66 ;формирование и запись сектора MBR - jr x0A0D ;перечитаем его и в меню - -;пункт меню: W. write to disk (запись каталога MFS на винчестер) -x0A3F call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x0A54 ;оказ от записи. возврат в меню - call x2FB1 ;запись каталога MFS - jr x09E5 ;чтение каталога подразделов - -;пункт меню: A. auto detection hdd (запуск идентификации HDD) -x0A49 ld e,#01 - call x30B9 ;идентификация жесткого диска - jr x0A54 ;печать текущего меню монитора - -;пункт меню: R. reset monitor -x0A50 xor a - ld (xEAF5+#0A),a ;xEAFF испортим память -;печать текущего меню монитора -x0A54 jp x0EB5 - -;пункт меню: H. Hard disk utility -x0A57 xor a - res 7,(iy+#0B) ;меню mount - res 7,(iy+#1C) - bit 7,(iy+#1B) - jr z,x0A96 - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - xor a - jr x0A96 - -;пункт меню: 1. test (тест только на чтение) -x0A6C rst #30 - dw rom7_x2105 ;тестирование HDD (1. test) (тест только на чтение) - db #07 ;возврат в текущее меню монтора - -;пункт меню: 2. test (тест на чтение/запись) -x0A70 rst #30 - dw rom7_x20F1 ;тестирование HDD (2. test) (тест на чтение/запись) - db #07 ;возврат в текущее меню монтора - -;пункт меню: D. delete all part (удаление всех разделов MBR) -x0A74 rst #30 ;!!! можно вызвать нарямую !!! - dw rom5_x31AA ;удаление всех разделов MBR - db #05 - -;пункт меню: R. reset printer -x0A78 ld hl,#0000 - ld (xE067),hl - ret - -;пункт меню: S. printer * 1 -x0A7F scf -;пункт меню: S. printer * 2 -x0A80 ld hl,xE029 - set 5,(hl) - jr nc,x0A89 - res 5,(hl) -x0A89 rst #30 - dw rom2_x08D7 - db #02 - jr x0A54 ;печать текущего меню монитора - - -;пункт меню: M. Monitor -x0A8F rst #30 - dw 0AEBh - db #02 - -x0A93 inc a ;(a=#0E) S. Set Up hard disk -x0A94 inc a -x0A95 inc a -x0A96 inc a ;(a=#0B) H. Hard disk utility -x0A97 inc a ;(a=#09) T. time & date -x0A98 inc a ;(a=#09) D. Disk utility -x0A99 inc a ;(a=#08) D. Disk utility -x0A9A inc a ;(a=#07) M. monitor -x0A9B inc a -x0A9C inc a ;(a=#05) P. printer -x0A9D inc a ;(a=#04) G. graphics manipulator -x0A9E inc a ;(a=#03) B. Save & load -x0A9F inc a ;(a=#02) S. Set Up -x0AA0 inc a ;(a=#01) P. Print Screen -x0AA1 push af - ld hl,(xE033) ;a - номер нового меню - ld a,(xDDFF) ;номер текущего меню - ld (hl),a - inc hl - ld (xE033),hl - pop af - ld (xDDFF),a -x0AB1 jp x0EB5 ;печать текущего меню монитора - -;выход из меню: L. local partition table -x0AB4 call x2FA8 ;запрос на сохранение каталога MFS, если были изменения - jr x0ABC - -;выход из меню: G. global partition table -x0AB9 call x2F5D ;запрос на сохранение сектора MBR, если были изменения - -;вызов предыдущего меню: 0. previous menu -x0ABC call x0B86 - jr x0AB1 ;печать текущего меню монитора - -;выход из монитора: 0. Continue program -x0AC1 rst #30 ;обработка 0. Continue program - dw rom2_x382E ;ожидание отжатия всех клавиш - db #02 - rst #30 - dw rom2_x013A ;выход из монитора - db #02 - -;пункт меню: G. magic button -x0AC9 rst #30 - dw rom2_x36C3 ;запись стандартного Magic-файла - db #02 - -;пункт меню: V. from drive (изменение диска автозапуска) -x0ACD ld hl,xDFF1 ;с какого диска делать автостарт - ld bc,#0004 ;мин/макс - jr x0AF8 ;циклическое изменение многовариантных параметров монитора - -;пункт меню: D. disk drive (смена текущего дисковода) -x0AD5 ld hl,xFFCA - ld bc,#0004 - call x0AF8 ;циклическое изменение многовариантных параметров монитора - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - db #02 - ret - -;пункт меню: P. speed (изменение скорости работы текущего дисковода) -x0AE3 ld hl,xFFCC - jr x0AEB - -;пункт меню: E. sector (изменение размера сектора текущего дисковода) -x0AE8 ld hl,xFFD0 -x0AEB ld bc,(xFFCA) - ld b,#00 ;номер текущего дисковода - add hl,bc - ld a,(hl) - and #E0 - ld b,a - ld c,#04 - -;циклическое изменение многовариантных параметров монитора -;вх: hl - адрес пееременной -; c - максимальное значение+1 -; b - минимальное значение -; -x0AF8 ld a,(hl) - and #03 - inc a - cp c - jr c,x0B00 - xor a -x0B00 or b - ld (hl),a - ret - -;пункт меню: Q. quick format (быстрое форматирование текущего диска) -x0B03 set 7,(iy+#13) - call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана - rst #30 - dw rom6_x04E5 ;быстрое форматирование текущей дискеты (очистка каталога) - db #06 - jr x0B2B ;;печать текущего меню монитора - -;пункт меню: F. format disk (форматирование текущего диска) -x0B10 ld hl,xE027 - set 7,(hl) - jr x0B1C - -;пункт меню: T. test disk (проверка текущего диска) -x0B17 ld hl,xE027 - res 7,(hl) -x0B1C call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана - rst #30 - dw rom6_x03A9 ;форматирование/проверка текущей дискеты - db #06 - jr x0B2B ;;печать текущего меню монитора - -;пункт меню: C. catalogue disk (вывод каталога текущего диска) -x0B25 rst #20 - db #8C - rst #30 - dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) - db #06 -x0B2B jp x0EB5 ;печать текущего меню монитора - -;пункт меню: C. cylinders (установка цилиндров) -x0B2E ld hl,x0EB5 ;печать текущего меню монитора - push hl - ld bc,(xDFF2) ;значение Cylinders HDD (2 байта) - ld a,#07 -x0B38 call x0BD9 ;ввод числа. в BC начальное значение - ret c ;омена ввода - ld a,e - or d - ld a,#0C - jr z,x0B38 ;ввели ноль. повтор ввода - ld (xDFF2),de ;новое значение Cylinders HDD (2 байта) - rst #30 - dw rom7_x1F08 ;проверка геометрии винчестера - db #07 - ret - -;АДРЕС: #0B4B ввод и сохранение значений времени/даты -x0B4B res 3,(iy+#27) ;гасим индикатор времени - call x0B9B ;ввод параметра текущей опции (число 0..255) - set 3,(iy+#27) - jr c,x0B2B ;завершение по break/cancel - ld hl,xDFF6 ;бефер занчений времени/даты - rst #30 - dw rom7_x1FB2 ;запись в CMOS времени и даты - db #07 - jr x0B2B ;завершение ввода - -;АДРЕС: #0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) -;вх: bc - адрес описания опции (x0468) -; -x0B61 call x0B7A - jr x0B2B ;печать текущего меню монитора - -;пункт меню: H. head; S. sector -x0B66 call x0B9B ;ввод параметра текущей опции (число 0..255) - jr c,x0B2B ;отмена ввода. печать текущего меню монитора - rst #30 - dw rom7_x1F2D ;расчет произведения головок и секторов - db #07 - rst #30 - dw rom7_x1F08 ;проверка геометрии винчестера - db #07 - jr x0B2B ;печать текущего меню монитора - -;пункт меню: S. sound -x0B75 ld a,#FF - ld (xE004),a ;глушим звук - -;АДРЕС: #0B7A смена параметра опции на противоположное (ON/OFF, normal/trubo и т.п.) -;вх: bc - адрес описания опции (xNNNN) -x0B7A call x0FE3 - ld a,(de) - xor (hl) - ld (de),a - ret - -;АДРЕС: #0B81 ввод и сохранение значений опций -;вх: bc - адрес описания опции (xNNNN) -x0B81 call x0B9B ;ввод параметра текущей опции (число 0..255) - jr x0B2B ;печать текущего меню монитора - -;АДРЕС: #0B86 -x0B86 ld de,xDE08 - ld hl,(xE033) - xor a - sbc hl,de - add hl,de - jr z,x0B97 - dec hl - ld (xE033),hl - ld a,(hl) -x0B97 ld (xDDFF),a - ret - -;АДРЕС: #0B9B ввод параметра текущей опции (число 0..255) -;вх: bc - адрес описания опции (x0468) -;вых: cy=1 завершение по break/cancel -; -x0B9B res 5,(iy+#0E) ;ввод строки параметров - call x0FE3 ;получение адреса переменной опции - ld c,(hl) ;минимальное значение - inc hl - ld b,(hl) ;максимальное значение - ld a,(de) ;текущее значение - call x0CB0 ;печать числа A в буфере ввода строки - push de - push bc - ld a,#07 ;сообщение: enter number -x0BAD call x0BF3 ;ввод строки символов - jr c,x0BCD ;завершение ввода по break/cancel - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - jr nz,x0BAD ;неудачное преобразование. продолжаем ввод - ld a,d - or a - ld a,#0C ;сообщение: out of range - jr nz,x0BAD ;слишком большое число. продолжаем ввод - pop bc - push bc - ld a,e - call x102E ;проверка диапазона числа - ld a,#0C ;сообщение: out of range - jr c,x0BAD ;слишком большое число. продолжаем ввод - pop bc - ld a,e - pop de - ld (de),a ;меняем переменную - ret -;завершение ввода по break/cancel -x0BCD pop bc - pop de - ret - -;АДРЕС: #0BD0 ввод числа. в BC начальное значение -;вх: bc - начальное число -; hl - параметры окна ввода -;вых: cy=1 отмена ввода -; cy=0 число введено -; de - введенное число -x0BD0 ld (xE9EF),hl ;параметры окна ввода - set 5,(iy+#0E) - jr x0BDD - -;АДРЕС: #0BD9 ввод числа. в BC начальное значение -;вх: bc - начальное число -;вых: cy=1 отмена ввода -; cy=0 число введено -; de - введенное число -x0BD9 res 5,(iy+#0E) -x0BDD push af - call x0CAA ;печать числа bc в буфере ввода строки - pop af - push de - push bc -x0BE4 call x0BF3 ;ввод строки символов - jr c,x0BCD ;отмена ввода - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - jr nz,x0BE4 ;неудачное преобразование (не число/слишком большое) - pop bc - pop af - or a - ret - -;АДРЕС: #0BF3 ввод строки символов -;вх: a-номер сообщения в группе 0 (для нижней строки) -;вых: cy=1 завершение ввода по break/cancel -; cy-0 завершение ввода по enter/fire cursor -; hl - адрес первого введенного символа в буфере -; z - этот символ перевод строки -; -x0BF3 call x0C0B ;ввод строки - jr nc,x0C04 ;завершение ввода по enter - call x0D1A - jr nc,x0C04 ;завершение ввода по fire cursor - cp #03 - scf - ret z ;завершение ввода по break/cancel - xor a - jr x0BF3 ;продолжение ввода строки -x0C04 rst #30 - dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа - db #02 - scf - ccf - ret -;ввод строки -;вх: a-номер сообщения в группе 0 (для нижней строки) -;вых: cy=0 завершение ввода по enter -; cy=1 -> a=3 break/cancel -; cy=1 -> a=a нет эффекта от нажатия -x0C0B rst #30 - dw rom2_x2FFB ;установка текущим окна: ввод числа - db #02 - or a - jr z,x0C69 ;продолжим ввод строки - call x0C22 ;установка параметров окна для ввода строки в меню монитора - rst #30 ;!!! ОШИБКА. можно вызвать напрямую - dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) - db #05 - jr nc,x0C1F ;cy=0 выход по enter - call x0D1A ;определение типа нажатой клавиши - ret c ;отмена/нет эффекта -;завершение ввода по enter/fire cursor -x0C1F or a - ld a,#06 ;сообщение: _Working ... -;установка параметров окна для ввода строки в меню монитора -;вх: a - номер сообщения в группе 0 (для нижней строки) -x0C22 push af - ld b,a ;номер сообщения в группе 0 - call x10C2 ;установка текущим окна: menu - ld a,(ix+6) - push af ;сохраним атрибуты - ld a,(xE115) - ld (ix+6),a ;атрибуты печати сообщения - ld (ix+0),#17 ;координаты печати - ld (ix+1),#00 - rst #20 - dc " " ;пробел - ld c,#00 - rst #08 ;печать сообщения - ld a,#2B - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - pop af - ld (ix+6),a ;восстановим атрибуты - rst #30 - dw rom2_x2FFB ;установка текущим окна: ввод числа - db #02 - bit 5,(iy+#0E) - jr nz,x0C6E ;ввод имени раздела HDD - ld (ix+3),#16 ;crd X окна - ld (ix+6),#4E ;атрибуты %01001110 - ld l,#08 ;ширина в символах - call x0CA0 ;установка ширины окна в знакоместах и символах - ld a,(iy-#09) ;crd Y опции меню -x0C62 ld (ix+2),a ;crd Y окна - rst #20 - db #8C ;очистка окна - pop af - ret -;продолжение ввода строки -x0C69 rst #30 - dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - db #05 - ret -;ввод имени раздела HDD -x0C6E ld (ix+6),#71 ;атрибуты %01110001 - ld hl,(xE9EF) - push hl - call x0C8F ;l=l*6/8 - ld a,(xE0F3+#03) ;xE0F6 координата X окна со списком разделов HDD - add a,l - ld (ix+3),a ;crd X окна - pop hl - ld l,h - call x0CA0 ;установка ширины окна в знакоместах и символах - ld a,(xE0F3) ;координата Y курсора в окне - ld l,a - ld a,(xE0F3+#02) ;xE0F5 координата Y окна - add a,l - jr x0C62 -;вычисление l=l*6/8 -x0C8F push de - ld de,#0006 - ld h,d - rst #30 - dw rom2_x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - db #02 - ld b,#03 -x0C9A srl l - djnz x0C9A - pop de - ret -;установка ширины окна в знакоместах и символах -;вх: l - ширина окна в символах -x0CA0 ld (ix+#0B),l - call x0C8F - ld (ix+5),l - ret - -;АДРЕС: #0CAA печать числа bc в буфере ввода строки -;вх: bc - число -x0CAA push bc - call x0CB9 - pop bc - ret - -;АДРЕС: #0CB0 печать числа A в буфере ввода строки -;вх: bc - число -x0CB0 push bc - ld c,a - ld b,#00 - call x0CB9 - pop bc - ret - -;АДРЕС: #0CB9 печать числа bc в буфере ввода строки -;вх: bc - число -x0CB9 push de - push bc - call x0CCA ;очистка буфера для ввода строки - inc hl - ld de,#2E0A - ld a,#03 - pop bc - call x0CDA ;печать числа bc в буйфер hl - pop de - ret - -;АДРЕС: #0CCA очистка буфера для ввода строки -;вых: hl - адрес буфера для ввода строки -x0CCA ld b,#2B - ld hl,xDE17 - push hl - ld (xDE15),hl -x0CD3 ld (hl)," " - inc hl - djnz x0CD3 - pop hl - ret - -;АДРЕС: #0CDA печать числа bc в буйфер hl -;вх: hl - адрес буфера для печати числа -; bc - число -; d - символ перед числом -; e - делитель для выделения разряда числа -; a - кол-во разрядов в числе -x0CDA ld (hl),d - inc hl -x0CDC ld (xE3BC),hl ;адрес в буфере печати - set 6,(iy+#09) ;печать в буфер - ld (iy+#07),a ;минимум разрядов в числе при переводе в ASCII - ld (iy+#08),"0" - ld (iy+#10),e ;делитель для выделения разряда числа - rst #30 - dw rom2_x1673 ;печать числа bc /в буфер - db #02 - res 6,(iy+#09) - ret - -;АДРЕС: #0CF6 установка и инициализация окна для ввода строки внизу экрана -;вых: ix - адрес дескриптора окна монитора: ввод строки внизу экрана -x0CF6 rst #30 - dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - db #02 - ld a,#0C - or a - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - ret - -;АДРЕС: #0D02 очистка нижней строки окна меню -x0D02 call x10C2 ;установка текущим окна: menu - ld a,(xE110) - ld (ix+6),a ;атрибуты для печати опции меню - ld (ix+0),#17 ;crd Y курсора - ld (ix+1),#00 ;crd X курсора - ld a,#2B - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - ret - -;АДРЕС: #0D1A определение типа нажатой клавиши -;вх: a - код нажатой клавиши -;вых: cy=0 - это подтверждение ввода (entre/fire cursor) -; =1 -> a=3 break/cancel -; =1 -> a=a нет эффекта от нажатия -x0D1A ld c,a - cp #82 - jr z,x0D29 ;ss+space - cp #80 - ret z ;ss - cp #91 - ret z ;mouse fire - res 3,a ;исключаем прочие комбинации - cp #92 ;mouse cancel -x0D29 ld a,c - scf - ret nz - ld a,#03 - ret - -;АДРЕС: #0D2F определение адреса дескриптора текущего меню -;вых: hl - адрес дескриптора меню +1 -; a = (+0) количество опций в меню -1 (номер последней опции) -x0D2F ld hl,x044A - ld a,(xDDFF) - add a,a - add a,l - ld l,a - jr nc,x0D3B - inc h ;hl адрес в таблице -x0D3B ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl адрес описателя окна - ld a,(hl) - inc hl - ret - -;АДРЕС: #0D42 приведение номера горячей клавиши опции к печатному символу -;вх: hl - адрес начала опций в дескрипторе меню -; c - номер опции -;вых: a - печатный символ -; hl - адрес дескриптора заданной опции +2 -; e =(+1) опции -; -x0D42 call x0D52 - -;АДРЕС: #0D45 приведение номера горячей клавиши опции к печатному символу -;вх: a =[#00..#19] -> номер буквы A..Z -; =[#1A..#1F] -> цифра 1..5 -;вых: a - печатный символ -x0D45 and #1F - cp #1A - jr nc,x0D4F - inc a - or #40 - ret -x0D4F add a,#16 - ret - -;АДРЕС: #0D52 определение адреса дескриптора опции -;вх: hl - адрес начала опций в дескрипторе меню -; c - номер опции -;вых: hl - адрес дескриптора заданной опции +2 -; a =(+0) опции -; e =(+1) опции -; -x0D52 ld a,c - add a,a - add a,a - add a,c - add a,l - ld l,a - jr nc,x0D5B - inc h -x0D5B ld a,(hl) - inc hl - ld e,(hl) - inc hl - ret - -;АДРЕС: #0D60 определение адреса с номером текущей опции текущего меню -;вых: hl - адрес ячейки с номером опции -; -x0D60 ld hl,xDE00 - ld a,(xDDFF) - add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #0D6B печать текущего меню -x0D6B call x10C2 ;установка текущим окна: menu -;печать названия меню - ld a,(xE111) ;печать названия окна - ld (ix+6),a ;атрибуты печати - ld (ix+0),#03 ;crd Y =3 - rst #20 ;вывод с выравниванием - db #84 - call x0D2F - ld c,(hl) - inc hl - ld b,(hl) ;bc номер блока сообщений и сообщения в нем - rst #08 ;печать сообщения по номеру в BC (название меню) - rst #20 - db #85 ;выровнять по центру - inc (ix+0) ;crd Y +1 -;печать опций меню - ld c,#00 ;номер опции - ld a,(xE110) ;атрибуты печати опций меню - ld (ix+6),a -x0D8E call x0D2F ;;c=номер текущей опции [0..n] - inc a - cp c - ret z ;все опции напечатаны - inc hl - inc hl ;hl адрес начала опций в дескрипторе меню - call x0D52 ;hl - адрес начала заданной опции +2 - ld b,a -; установка атрибутов печати опции - call x0F51 ;вызов п/п определения доступности опции. cy=1 недоступна - push hl - ld a,(xE112) ;атрибуты неактивной опции - jr c,x0DBB - ld a,b ;выделение Ink печати активной опции - rlca - rlca - rlca - and #07 ;номер Ink в таблице - ld hl,xEAED - add a,l - ld l,a - jr nc,x0DB1 ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы - inc h ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы -x0DB1 ld a,(hl) - and #07 - ld l,a ;Ink печати опции - ld a,(xE110) - and %11111000 - or l -x0DBB ld (ix+6),a ;атрибуты печати опции - pop hl -; установка crdY, выделение опции, печать горячей клавиши вызова - call x0F6D - ld a,(hl) - inc hl - push af - push hl - rlca - rlca - and #03 - add a,(ix+0) - ld (ix+0),a - ld a,b - call x0D45 ;приведение номера горячей клавиши опции к печатному символу - ld b,a ;цифра/буква выбора опции - call x0D60 ;определение адреса с номером текущей опции текущего меню - ld a,(hl) - cp c - call z,x0E6F ;выделение текущей опции меню - pop hl - ld (ix+1),#09 ;печать номера опции - rst #20 - dc " " - ld a,b ;печать цифры/буквы выбора опции - rst #10 - rst #20 - dc ". " - pop af -; печать названия опции - push af - bit 5,a - jr nz,x0E03 ;печать названия отдельной п/п - push bc - ld c,(hl) ;номер блока сообщений - ld (iy-#08),c ;xE00C - inc hl - ld b,(hl) ;номер сообщения в блоке - inc hl - push hl - rst #08 ;печать названия опции - rst #20 - dc " " - ld (ix+1),#1F ;crd X =31 - pop hl - pop bc - jr x0E25 -x0E03 push bc ;печать названия опции отдельной процедурой - ld bc,x0E1F ;сюда вернемся - push bc - ld c,(hl) - inc hl - ld b,(hl) ;bc - адрес п/п печать опции - bit 4,a - jr nz,x0E11 ;она в другой странице - push bc - ret -x0E11 ld (xE3BE+#01),bc ;вызов п/п из другой страницы ROM - inc hl - ld c,a - ld a,(hl) - ld (xE3BE+#03),a - ld a,c - jp xE3BE -x0E1F pop bc - pop af - and #E0 - jr x0E26 ;печать следующей опции -x0E25 pop af -x0E26 and #1F - jr z,x0E68 ;печать следующей опции -; печать текущего параметра опции - push bc - call x0FE9 ;de - адрес переменной/hl - адрес маски для переменной - and #03 - cp #01 - jr nz,x0E45 - ld a,(de) ;два состояния опции, определяем по маске в (hl) - and (hl) - inc hl - ld b,(hl) - inc hl - jr z,x0E3C -x0E3B ld b,(hl) -x0E3C ld c,(iy-#08) ;номер блока сообщений - rst #08 - rst #20 - dc " " - pop bc - jr x0E62 -x0E45 cp #02 - jr nz,x0E57 - ld a,(de) ;это число по адресу переменной - ld c,a - ld b,#00 - ld de,#0A00 - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - pop bc - jr x0E68 ;печать следующей опции -x0E57 ld a,(de) ;1-4 состояния опции, по номеру в de - and #03 - jr z,x0E3B - ld b,a -x0E5D inc hl - djnz x0E5D - jr x0E3B -x0E62 ld a,#29 ;печать пробелов до правого края экрана - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -x0E68 inc c ;печать следующей опции - inc (ix+0) - jp x0D8E - -;АДРЕС: #0E6F выделение атрибутами заданной опции меню (по курсору) -x0E6F push hl - push bc - ld a,(xE113) - and %00111000 - ld c,a ;выделяем paper - ld a,(ix+6) - and %11000111 - or c - ld (ix+6),a ;устанавливаем атрибуты - call x0E98 ;выделение атрибутами заданной опции меню (по курсору) - ld a,(ix+0) - ld (iy-#09),a - pop bc - pop hl - ret - -;АДРЕС: #0E8C снятие выделения атрибутами заданной опции меню (по курсору) -x0E8C ld a,(iy-#09) ;координата Y выделенной опции - ld (ix+0),a ;crd Y - ld a,(xE110) - and %00111000 - ld c,a ;атрибуты печати - -;АДРЕС: #0E98 печать атрибутов заданной опции меню (по курсору) -;вх: c - атрибуты, только Paper -; -x0E98 push bc - ld (ix+1),#00 ;crd X =0 - rst #30 - dw rom2_x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - db #02 - pop bc - inc hl - ld b,#1E -x0EA5 ld a,(hl) - and %11000111 - or c - ld (hl),a - inc hl - djnz x0EA5 - ret - -;АДРЕС: #0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? -x0EAE rst #30 - dw #000B - db #02 - -;АДРЕС: #0EB2 очистка текущего окна -x0EB2 rst #20 ;очистка текущего окна - db #8C - ret - -;АДРЕС: #0EB5 печать текущего меню монитора -x0EB5 ld sp,xE336 - rst #30 - dw rom2_x04D5 ;включение Турбо-режима - db #02 ;bc =#7FFD - ld h,#E1 ;проверка в ram 8 признака MOA - ld l,#7B - ld a,"M" - cpi - jr nz,x0EAE ;нет буквы M. портится регистр bc -> зависание - ld a,"O" - cpi - jr nz,x0EAE ;нет буквы O. портится регистр bc -> зависание - call x10C2 ;установка текущим окна: menu - ld a,(xE110) - ld (ix+6),a ;атрибуты окна - call x0EB2 ;очистка окна - ld hl,xE16E - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 - call x105B ;сообщение Profesional Extention - ld a,(xE111) - ld (ix+6),a - ld bc,#0101 ;сообщение Shadow service monitor - rst 8 -;основной цикл меню монитора -x0EEC ld hl,x0EEC ;сюда вернемся после обработки выбранной опции - push hl - call x0D6B ;печать текущего меню - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - push af ;код нажатой клавиши - ld a,(xE110) ;атрибуты печати опции меню - ld (ix+6),a - call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) - pop af - call x1033 ;вызов п/п обработки нажатия клавиши - db #86 ;cs+6 вниз - dw x0F95 ;перемещение курсора на следующую опцию (вниз) - db #84 ;cs+7 вверх - dw x0FA6 ;перемещение курсора на предыдущую опцию (вверх) - db #0D ;enter / cs+1+m - dw x0F87 ;выбор выделенной опции - db #11 ;cs+1+q - dw x0F78 ;переход в главное меню - db #04 ;cs+1+d - dw x1150 ;вызов окна выбора диска - db #80 ;kempston joy - dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку - db #91 ;mouse - dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку - db #92 ;mouse - dw x0F78 ;переход в главное меню - db #FF - cp #7B - jr nc,x0F28 ;a=[#7B..#FF] - cp #40 - jr c,x0F28 ;a=[#00..#3F] - and %01011111 ;букву в верхний регистр -x0F28 ld b,a ;код нажатой клавиши - ld c,#FF -x0F2B inc c - call x0D2F ;определение адреса дескриптора текущего меню - inc a - cp c - ret z ;закончились опции в меню. ничего не делаем - inc hl - inc hl - call x0D42 ;приведение номера горячей клавиши опции к печатному символу - cp b - jr nz,x0F2B ;клавиша не соответствует гарячей клавиши опции -;переход на п/п обработки выбранной опции - push hl - push de - call x0D60 - ld (hl),c ;сохраним номер текущей опции в меню - call x0D6B ;печать текущего меню - pop de - pop hl - call x0F51 ;проверка доступности опции - ret c ;опция недоступна - push hl - call x0F6D ;опредение адреса описания опции - ld c,l - ld b,h ;адрес описания опции (xNNNN) - pop hl - inc hl -;bc - адрес описания опции (xNNNN) -;вызов п/п обработки опции - -;АДРЕС: #0F51 вызов п/п обработки доступности опции/обработки опции -;вх: hl - адрес в дескрипторе опции (+2/4 от начала) -; 3-2,e биты старшего байта -;вых: hl - адрес в дескрипторе опции (+3 от начала) -; d - старший байт смещения -; e=e>>2 -; -x0F51 call x0F65 ;выделение старшего байта смещения - push de - ld e,(hl) ;младший байт - inc hl - push hl - ld hl,x08DD - add hl,de - ld de,x0F62 - push de - xor a - jp (hl) -x0F62 pop hl - pop de - ret - -;АДРЕС: #0F65 выделение старшего байта смещения -;вх: 3-2,e биты старшего байта -;вых: d - старший байт смещения -; e=e>>2 -; -x0F65 ld a,e - rrca - rrca - ld e,a - and #03 - ld d,a - ret - -;АДРЕС: #0F6D опредение адреса описания опции -;вх: hl - адрес в дескрипторе опции (+3 от начала) -; 3-2,e биты старшего байта -;вых: hl - адрес описания опции -; d - старший байт смещения -; e=e>>2 -; -x0F6D call x0F65 - push de - ld e,(hl) - ld hl,x0468 - add hl,de - pop de - ret -;переход в главное меню -x0F78 ld hl,x0EB5 - ex (sp),hl - xor a - ld (xDDFF),a - ld hl,xDE08 - ld (xE033),hl - ret -;enter / cs+1+m -x0F87 call x0D60 ;определение адреса с номером текущей опции текущего меню - ld c,(hl) ;номер текущей опции текущего меню - call x0D2F ;определение адреса дескриптора текущего меню - inc hl - inc hl - call x0D42 ;приведение номера горячей клавиши опции к печатному символу -x0F93 jr x0F28 ;a - горячая клавиша выбранной опции - -;АДРЕС: #0F95 перемещение курсора на следующую опцию (вниз) -x0F95 call x0D60 ;определение адреса с номером текущей опции текущего меню - push hl - ld c,(hl) - inc c ;c - номер опции - call x0D2F ;определение адреса дескриптора текущего меню - cp c ;a - номер последней опции - jr nc,x0FA3 - ld c,#00 -x0FA3 pop hl - ld (hl),c - ret - -;АДРЕС: #0FA6 перемещение курсора на предыдущую опцию (вверх) -x0FA6 call x0D60 ;определение адреса с номером текущей опции текущего меню - ld a,(hl) - or a - jr z,x0FAF - dec (hl) - ret -x0FAF push hl - call x0D2F ;определение адреса дескриптора текущего меню - pop hl - ld (hl),a - ret - -;АДРЕС: #0FB6 определение опции под курсором мыши и переход на ее обработку -; -x0FB6 ld c,#FF - ld d,#03 ;начальная crd Y -x0FBA inc d - inc c ;номер опции - call x0D2F ;определение адреса дескриптора текущего меню - inc a ;кол-во опций в меню - cp c - ret z ;опция не найдена - inc hl - inc hl - push de - call x0D52 ;определение адреса дескриптора опции - ld b,a - call x0F65 ;выделение старшего байта смещения - inc hl - call x0F6D ;опредение адреса описания опции - pop de - ld a,(hl) - rlca - rlca - and #03 - add a,d - ld d,a ;координата Y опции - cp (iy-#0B) - jr nz,x0FBA ;курсор не на этой опции - ld a,b - call x0D45 ;приведение номера горячей клавиши опции к печатному символу - jr x0F93 ;a - горячая клавиша выбранной опции - -;АДРЕС: #0FE3 получение адреса переменной и адреса маски для заданной опции -;вх: bc - адрес описания опции (x0468) -;вых: hl - адрес маски для переменной -; de - адрес переменной -; -x0FE3 ld l,c - ld h,b - ld a,(bc) - inc hl - inc hl - inc hl - -;АДРЕС: #0FE9 получение адреса переменной и адреса маски для заданной опции -;вх: a - флаги описания опции -; hl - адрес в описании опции -;вых: hl - адрес маски для переменной -; de - адрес переменной -; -x0FE9 bit 4,a - jr z,x1001 -;получение подстроки с описанием опции - ld e,(hl) - inc hl - ld d,(hl) ;адрес переменной с номером строки - inc hl ;hl=адрес+5 - ld a,(de) - and #03 ;номер строки [0..3] - inc a ;поиск строки -x0FF5 dec a - ld b,(hl) - inc hl - jr z,x0FFF -x0FFA inc hl - djnz x0FFA - jr x0FF5 -x0FFF ld a,(hl) ;a - флаги - inc hl -;получение адреса переменной опции -x1001 ld e,(hl) ;получение смещения от iy(xE014) - inc hl - bit 2,a - jr z,x100B - ld d,(hl) - inc hl - jr x1012 -x100B bit 7,e - ld d,#00 - jr z,x1012 - dec d ;de - смещение от iy(xE014) -x1012 push iy - ex (sp),hl - add hl,de - ex de,hl - pop hl ;de - адрес переменной опции -;если это блок переменных, определяем нужную переменную в блоке - bit 3,a - ret z - push af - ld b,(hl) - inc hl - ld a,(hl) - inc hl ;ab - адрес переменной со смещением в блоке - push hl - ld l,b - ld h,a - ld a,(hl) - and #03 - ld l,a ;hl - смещение в блоке - ld h,#00 - add hl,de - ex de,hl - pop hl - pop af - ret - -;АДРЕС: #102E проверка диапазона числа -;вх: a - число -; c - минимальное значение -; b - максимальное значение+1 -;вых: cy=1 вне пределов заданных значений -; -x102E cp c - ret c - cp b - ccf - ret - -;АДРЕС: #1033 процедура обработки нажатий клавиш -;вх: параметры передаются через db ?:dw ?? -x1033 pop hl - jr x1038 -x1036 inc hl - inc hl -x1038 ld e,(hl) - inc e - jr z,x1045 ;e=#FF -> возврат - cp (hl) - inc hl - jr nz,x1036 - ld e,(hl) - inc hl - ld d,(hl) - dec de - ex de,hl -x1045 inc hl - jp (hl) - -;АДРЕС: #1047 печать количества цилиндров HDD -x1047 ld bc,#1002 ;Cylinders - rst #08 - ld (ix+1),#1F - ld bc,(xDFF2) ;колво цилиндров - ld de,#0A00 ;десятичная система счисления - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - ret - -;АДРЕС: #105B печать шапки меню монитора -x105B call x10C2 ;установка текущим окна: menu - ld hl,x106B - -;АДРЕС: #1061 печать закодированного сообщения из hl -x1061 ld a,(hl) - xor #6A - cp #FF - ret z - rst #10 ;печать символа из A - inc hl - jr x1061 - -;заксоренное сообщение -x106B db #6B,#40,#BF - db #71,#6A,#63 - db #3A,#18,#05,#0C,#0F,#19,#03,#05 - db #04,#0B,#06,#4A,#4A,#2F,#12,#1E - db #0F,#04,#1E,#03,#05,#04,#4A - db #71,#68,#6A - db #2B,#04,#0B,#06,#13,#19,#0F,#18 - db #68 - db #95 -/*оно же, но раскодированное - db #01,%00101010,%11010101 ;атрибуты - db #1B,#00,#09 ;координаты - db "Profesional Extention " - db #1B,#02,#00 ;координаты - db "Analyser" - db #02 ;восстановим атрибуты - db #FF ;конец -*/ - -;заксоренное сообщение -x1095 db #6B,#1B,#E4 - db #71,#61,#60 - db #39,#0B,#1C,#0F,#0E,#4A,#38,#2B - db #27,#4A,#08,#0B,#04,#01,#4A - db #95 -/*оно же, но раскодированное -x1095 db #01,%01110001,%10001110 ;атрибуты - db #1B,#0B,#0A ;координаты - db "Saved RAM bank " - db #FF ;конец -*/ - -;заксоренное сообщение -x10AB db #6B,#1B,#0E4 - db #71,#61,#60 - db #26,#05,#0B,#0E,#0F,#0E,#4A,#38 - db #2B,#27,#4A,#08,#0B,#04,#01,#4A - db #95 -/*оно же, но раскодированное - db #01,%01110001,%10001110 ;атрибуты - db #1B,#0B,#0A ;координаты - db "Loaded RAM bank " - db #FF ;конец -*/ - -;АДРЕС: #10C2 установка текущим окна: menu -x10C2 rst #30 - dw rom2_x3005 ;установка текущим окна: menu - db %00000010 - ret - -;АДРЕС: #10C7 Копирование каталога ROM-диска в ram 8 -;вых: a =0 нет ROM-диска -x10C7 push bc - ld hl,(x0071) - ld l,#00 - ld bc,#0100 - ld de,xE5A9 - push de - ldir - pop de - ld a,(de) - or a - pop bc - ret - -;АДРЕС: #10DB обработка пункта меню: R. ROM disk -x10DB call x0D02 ;очистка нижней строки окна меню - call x10C7 ;Копирование каталога ROM-диска в ram 8 - ld hl,#1006 ;координаты окна - ld de,#100C ;ширина окна в символах и знакоместах - call x2133 ;коррекция координат и размеров окна - ld hl,x1111 - ld (xE9E1),hl -x10F0 call x1EF1 ;печать каталога и выбор позиции в нем - jr nc,x10FF ;выбор произведен успешно - cp #03 - jr z,x110E ;break/cancel закрываем окно - cp #11 - jr nz,x10F0 ;повторим выбор - jr x110E ;отмена с закрытием окна -;выбор произведен успешно -;hl - номер позиции в каталоге -x10FF call x1130 ;определение начала записи в каталоге ROM-disk по номеру в hl - ld de,#000E - add hl,de - ld a,(hl) ;смещение от начала страницы - inc hl - ld h,(hl) ;номер страницы - ld l,a ;смещение от начала страницым - rst #30 - dw rom6_x0E3B ;загрузка из ROM-disk - db #06 -;break/cancel закрываем окно -x110E jp x0EB5 ;печать текущего меню монитора - -;АДРЕС: #1111 таблица со списком процедур -x1111 dw x1128 ;печать одного имени из каталога ROM-disk - dw x113D ;определение номера последней записи в каталоге ROM-disk - dw x1117 ;звголовок: печать сообщения: _Select a file_ -;печать сообщения: _Select a file_ -x1117 rst #20 - dc " Select a file " - ret -;печать одного имени из каталога ROM-disk -;вх: hl - номер записи в каталоге -x1128 call x1130 - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 - ret -;определение начала записи в каталоге ROM-disk по номеру в hl -x1130 ld de,xE5A9 ;каталог ROM-disk - ld b,#04 -x1135 sla l ;hl=hl*16 - rl h - djnz x1135 - add hl,de - ret -;определение номера последней записи в каталоге ROM-disk -;вых: hl - номер последней записи в каталоге ROM-disk -x113D ld hl,xE5A9 ;каталог ROM-disk - ld de,#0010 - ld c,d -x1144 ld a,(hl) - or a - jr nz,x114C - dec c - ld l,c - ld h,d - ret -x114C add hl,de - inc c - jr x1144 - -;АДРЕС: #1150 вывод окна выбора дисковода -x1150 call x0D02 ;очистка нижней строки окна меню - ld hl,#1006 ;координаты окна - ld de,#140F ;размеры окна - call x2133 ;коррекция координат и размеров окна - ld hl,x1182 ;адрес таблицы со списком процедур для п/п x2028 - ld (xE9E1),hl -x1162 call x1EF1 ;печать каталога и выбор позиции в нем - jr nc,x117A ;что-то выбрали - cp #03 - jr z,x110E ;отмена break/cancel - cp #11 - jr z,x110E ;cs+1+q - and #5F ;проверка букв A..D - cp #45 - jr nc,x1162 ;продолжим - sub #41 - jr c,x1162 ;продолжим - ld l,a ;номер дисковода -x117A ld a,l - ld (xFFCA),a ;выбранный дисковод - jp x0B25 ;вывод каталога текущего диска - -;АДРЕС: #1181 ret -x1181 ret - -;таблица со списком процедур для печати окна выбора дисковода -x1182 dw x119D ;печать одного имени дисковода - dw x1188 ;определение номера последней записи =3 - dw x118C ;заголовок: печать сообщения: _Select a disk_ - -;определение номера последней записи =3 -x1188 ld hl,#0003 - ret - -;заголовок: печать сообщения: _Select a disk_ -x118C rst #20 - dc " Select a Disk " - ret - -;печать буквы дисковода или пути, если это образ -x119D ld a,l - and #03 - call x249C ;печать буквы дисковода или пути, если это образ - ret - -;АДРЕС: #11A4 поиск сообщения по номеру в B[#01..#??] -;вх: hl - адрес блока сообщений -;вых: de - адрес начала сообщения -; -x11A4 ex de,hl -x11A5 dec b - ret z -x11A7 ld a,(de) - inc de - and #80 - jr nz,x11A5 - jr x11A7 - -;АДРЕС: #11AF установка блока слов/сообщений по номеру в A -;вх: a=[#00..#02] - номер блока сообщений/слов -;вых: (xDDDA) - адрес блока слов -; hl - адрес в таблице блоков слов/сообщений -; -x11AF ld hl,x11C1 ;список блоков сообщений - rlca - rlca - add a,l - ld l,a - jr nc,x11B9 - inc h -x11B9 ld e,(hl) - inc hl - ld d,(hl) - ld (xDDDA),de - ret -x11C1 dw x1554,x1906 - dw x1353,x181A - dw x122D,x176D - -;АДРЕС: #11CD печать сообщения по номеру в BC -;вх: c=[0..2] номер блока сообщений -; b - номер сообщения в этом блоке -; -x11CD ld a,c - call x11AF ;установка блока слов/сообщений по номеру в A - inc hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld (xDDD8),hl ;адрес блока сообщений - ld c,#80 ;первая буква заглавная - call x11A4 ;поиск сообщения по номеру в B[#01..#??] - ex de,hl ;hl - адрес начала сообщения -x11DF ld a,(hl) ;печать сообщения - cp #7F - jr nz,x11ED - inc hl ;смена блока слов - ld a,(hl) - push hl - call x11AF ;установка блока слов/сообщений по номеру в A - pop hl - jr x1216 -x11ED and #7F - jr z,x121C ;печать указателя стэка - ld b,a - push hl - ld hl,(xDDDA) - call x11A4 ;поиск слова по номеру в B[#01..#??] - pop hl -x11FA ld a,(de) ;печать слова - sla c - jr nc,x120C - push af ;первый символ слова заглавный - and #7F - cp #40 - jr c,x120B - pop af - and %11011111 - jr x120C -x120B pop af -x120C rst #30 ;печать символа - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db %00000010 - rla - inc de - jr nc,x11FA - rst #20 ;печать пробела в конце слова - dc " " -x1216 bit 7,(hl) - inc hl - jr z,x11DF ;следующее слово - ret - -;печать числа из (xDDA7) -x121C push hl - sla c - push bc - ld hl,(xDDA7) - rst #30 - dw rom2_x1612 ;печать числа в hl (dec/hex) с префиксом - db %00000010 - rst #20 ;печать пробела - dc " " - pop bc - pop hl - jr x1216 - -;АДРЕС: #122D блок слов 2 (#35 слов) -x122D dc "time" ;#01 - dc "date" - dc "&" - dc "Set Up" - dc "indicator" - dc "ON" - dc "OFF" - dc "hours" - dc "minutes" ;#09 - dc "seconds" - dc "years" - dc "months" - dc "days" - dc "autoconfig" - dc "from" - dc "degree" - dc "compression" ;#11 - dc "Cylinders" - dc "head" - dc "partition" - dc "manager" - dc "global" - dc "-" - dc "delete" - dc "part" ;#19 - dc "all" - dc "local" - dc "table" - dc "information" - dc "select" - dc "..." - dc "create" - dc "write" ;#21 - dc "restore" - dc "auto" - dc "detection" - dc "mount" - dc "dismount" - dc "on" - dc "input" - dc "output" ;#29 - dc "interrupt" - dc "controller" - dc "NVRAM" - dc "modem" - dc "port" - dc "serial" - dc " " - dc "rename" ;#31 - dc "SMUC" - dc "mode" - dc "LBA" - dc "mirror" ;#35 - -;АДРЕС: #1353 блок слов 1 (#6A слов) -x1353 dc "main" ;#01 - dc "menu" - dc "previous" - dc "continue" - dc "magic" - dc "button" - dc "monitor" - dc "print" - dc "screen" ;#09 - dc "test" - dc "printer" - dc "disk" - dc "Set Up" - dc "about" - dc "positive" - dc "negative" - dc "Shadow" ;#11 - dc "service" - db #1B,#01,#88 - db #1B,#03,#8D - dc "keyboard" - dc "constant" - dc "debouncing" - dc "delay" - dc "repeat" ;#19 - dc "before" - dc "interface" - dc "speed" - dc "data" - dc "bits" - dc "stop" - dc "to" - dc "limiter" ;#21 - dc "+LF" - dc "length" - dc "page" - dc "width" - dc "centronics" - dc "RS232" - dc "9600" - dc "1200" ;#29 - dc "8" - dc "7" - dc "1" - dc "2" - dc "OFF" - dc "ON" - dc "reset" - dc "line" ;#31 - dc "feed" - dc "carriage" - dc "return" - dc "computer" - dc "form" - dc "sound" - dc "format" - dc "drive" ;#39 - dc "track" - dc "side" - dc "sector" - dc "A" - dc "B" - dc "C" - dc "D" - dc "40" ;#41 - dc "80" - dc "FM" - dc "MFM" - dc "128" - dc "256" - dc "512" - dc "1024" - dc "one" ;#49 - dc "double" - dc "half" - dc "LOW" - dc "HIGH" - dc "retry" - dc "utility" - dc "analys" - dc "catalogue" ;#51 - dc "interleaving" - dc "*" - dc "normal" - dc "fast" - db #0C,#1B,#00,#87 - db #1B,#0C,#8D - dc "save" - dc "load" ;#59 - dc "..." - dc "&" - dc "NMI" - dc "graphics" - dc "manipulators" - dc "mouse" - dc "kempston" - dc "joystick" ;#61 - dc "wait" - dc "second" - dc "first" - dc "of" - dc "step" - dc "size" - dc "quick" - dc "autostart" ;#69 - dc "I/O" ;#6A - -;АДРЕС: #1554 блок слов 0 (#5E слов) -x1554 dc "at" ;#01 - dc "abandoned" - dc "already" - dc "bad" - dc "big" - dc "blocks" - dc "breakpoint" - dc "by" - dc "command" ;#09 - dc "enter" - dc "empty" - dc "definition" - dc "devision" - dc "failed" - dc "file" - dc "finish" - dc "found" ;#11 - dc "few" - dc "identical" - dc "insufficient" - dc "known" - dc "long" - dc "many" - dc "no" - dc "not" ;#19 - dc "number" - dc "name" - dc "of" - dc "operands" - dc "opcode" - dc "open" - dc "out" - dc "present" ;#21 - dc "program" - dc "range" - dc "redefined" - dc "stack" - dc "space" - dc "syntax" - dc "string" - dc "small" ;#29 - dc "start" - dc "search" - dc "too" - dc "undefined" - dc "workspace" - dc "word" - dc "zero" - dc ">" ;#31 - dc "error" - dc "quit" - dc "operand" - dc ")" - dc "brackets" - dc "invalid" - dc "type" - dc "illegal" ;#39 - dc "value" - dc "bank" - dc "RAM" - dc "ROM" - dc "forbidden" - dc " Working ..." - dc "address" - dc "state" ;#41 - dc "selections:" - dc "init" - dc "count" - dc "***" - dc "curent" - dc "analyser" - dc "definitions:" - dc "left" ;#49 - dc "for" - dc "bytes" - dc "Professional" - dc "TRDOS" - dc "exist" - dc "R/W" - dc "disk" - dc "other" ;#51 - dc "execution" - dc "configuration" - dc "memory" - dc "control" - dc "hard" - dc "checksum" - dc "CMOS" - dc "boot" ;#59 - dc "record" - dc "busy" - dc "ready" - dc "duplicate" - dc "CRC" ;#5E - -;АДРЕС: #176D Блок сообщений 2 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов -x176D db #01,#03,#82 ;#01 time & date - db #04,#01,#03,#82 ;#02 Set Up time & date - db #85 ;#03 indicator - db #87 ;#04 OFF - db #86 ;#05 ON - db #88 ;#06 hours - db #89 ;#07 minutes - db #8A ;#08 seconds - db #8B ;#09 years - db #8C ;#0A months - db #8D ;#0B days - db #8E ;#0C autoconfig - db #91 ;#0D compression - db #90 ;#0E degree - db #7F,#00,#56 ;#0F hard disk utility - db #7F,#01,#0C,#CF - db #92 ;#10 Cylinders - db #93 ;#11 head - db #14,#95 ;#12 partition manager - db #16,#14,#9C ;#13 global partition table - db #18,#1A,#99 ;#14 delete all part - db #1B,#14,#9C ;#15 local partition table - db #14,#9D ;#16 partition information - db #18,#94 ;#17 delete partition - db #18,#14,#9F ;#18 delete partition ... - db #20,#14,#9F ;#19 create partition ... - db #21,#7F,#01,#20,#8C ;#1A write to disk - db #22,#0F,#7F,#01,#8C ;#1B restore from disk - db #23,#24,#7F,#00,#56 ;#1C auto detection hard disk - db #D0 - db #25,#27,#7F,#01,#39 ;#1D mount on drive C - db #BF - db #1E,#1B,#94 ;#1E select local partition - db #1E,#7F,#01,#8C ;#1F select disk - db #25,#27,#7F,#01,#39 ;#20 mount on drive D - db #C0 - db #25,#27,#7F,#01,#39 ;#21 mount on drive B - db #BE - db #A8 ;#22 input - db #A9 ;#23 output - db #2A,#2B,#7F,#00,#19 ;#24 interrupt controller not found - db #91 - db #2A,#2B,#7F,#00,#91 ;#25 interrupt controller found - db #2C,#7F,#00,#19,#91 ;#26 NVRAM not found - db #2C,#7F,#00,#91 ;#27 NVRAM found - db #2D,#7F,#00,#19,#91 ;#28 modem not found - db #2D,#7F,#00,#91 ;#29 modem found - db #2F,#2E,#7F,#00,#19 ;#2A serial port not found - db #91 - db #25,#A7 ;#2B mount on - db #30,#0F,#7F,#01,#B9 ;#2C __from drive - db #26,#7F,#01,#DA ;#2D dismount ... - db #B0 ;#2E __ - db #A6 ;#2F dismount - db #25,#7F,#01,#5A ;#30 mount ... ___ - db #7F,#02,#B0 - db #30,#27,#7F,#00,#AA ;#31 __ on start - db #31,#14,#9F ;#32 rename partition ... - db #2C,#7F,#00,#57,#B2 ;#33 NVRAM checksum error - db #2B,#32,#7F,#00,#91 ;#34 controller SMUC found - db #34,#B3 ;#35 LBA mode - db #7F,#00,#4D,#7F,#02 ;#36 TRDOS mirror - db #B5 - -;АДРЕС: #181A Блок сообщений 1 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов -x181A db #13,#11,#12,#87 ;#01 crd Y=1, crd X=8 Shadow service monitor - db #01,#82 ;#02 main menu - db #08,#89 ;#03 print screen - db #8D ;#04 Set Up - db #0D,#95 ;#05 Set Up keyboard - db #8A ;#06 test - db #03,#82 ;#07 previous menu - db #04,#7F,#00,#A2 ;#08 continue program - db #05,#86 ;#09 magic button - db #87 ;#0A monitor - db #8B ;#0B printer - db #0C,#DA ;#0C disk ... - db #0E,#87 ;#0D about monitor - db #8F ;#0E positive - db #90 ;#0F negative - db #89 ;#10 screen - db #7F,#00,#BC ;#11 RAM - db #16,#97 ;#12 constant debouncing - db #18,#99 ;#13 delay repeat - db #95 ;#14 keyboard - db #18,#1A,#99 ;#15 delay before repeat - db #0D,#8B ;#16 Set Up printer - db #9B ;#17 interface - db #A6 ;#18 centronics - db #A7 ;#19 RS232 - db #9C ;#1A speed - db #A8 ;#1B 9600 - db #A9 ;#1C 1200 - db #1D,#9E ;#1D data bits - db #AA ;#1E 8 - db #AB ;#1F 7 - db #1F,#9E ;#20 stop - db #AD ;#21 2 - db #AC ;#22 1 - db #9D ;#23 data - db #7F,#00,#28,#7F,#01 ;#24 string limiter +LF - db #21,#A2 - db #AF ;#25 ON - db #AE ;#26 OFF - db #7F,#00,#28,#7F,#01 ;#27 string width - db #A5 - db #24,#A3 ;#28 page lenth - db #B0 ;#29 reset - db #31,#B2 ;#2A line feed - db #33,#B4 ;#2B carriage return - db #B5 ;#2C computer - db #58,#5B,#D9 ;#2D save & load - db #36,#B2 ;#2E form feed - db #0D,#87 ;#2F Set Up monitor - db #30,#7F,#00,#BC ;#30 reset RAM - db #B7 ;#31 sound - db #0D,#0C,#CF ;#32 Set Up disk utility - db #0C,#B9 ;#33 disk drive - db #BD ;#34 A - db #BE ;#35 B - db #BF ;#36 C - db #C0 ;#37 D - db #BA ;#38 track - db #C1 ;#39 40 - db #C2 ;#3A 80 - db #BB ;#3B side - db #C9 ;#3C one - db #CA ;#3D double - db #C4 ;#3E MFM - db #C3 ;#3F FM - db #BC ;#40 sector - db #C5 ;#41 128 - db #C6 ;#42 256 - db #C7 ;#43 512 - db #C8 ;#44 1024 - db #38,#8C ;#45 format disk - db #1F,#38,#80 ;#47 stop format _число_ - db #CD ;#47 HIGH - db #4B,#CD ;#48 half HIGH - db #4B,#CC ;#49 half LOW - db #CC ;#4A LOW - db #B8 ;#4B format - db #4E,#96 ;#4C retry constant - db #0C,#CF ;#4D disk utility - db #0A,#8C ;#4E test disk - db #50,#8C ;#4F analys disk - db #7F,#00,#04,#7F,#01 ;#50 bad disk _число_ - db #0C,#80 ; - db #51,#8C ;#51 catalogue disk - db #D2 ;#52 interleaving - db #30,#87 ;#53 reset monitor - db #0B,#53,#AC ;#54 printer * 1 - db #0B,#53,#AD ;#55 printer * 2 - db #D4 ;#56 normal - db #D5 ;#57 fast - db #35,#9C ;#58 computer speed - db #56,#53,#55,#0A ;#59 очистить окно, crd Y=0, crd X=7 - db #7F,#00,#1C,#7F,#01 ; * fast test of computer * - db #35,#53,#D7 ; crd Y=12, crd X=13 - db #58,#DA ;#5A save ... - db #59,#DA ;#5B load ... - db #58,#5B,#59,#7F,#00 ;#5C save & load of program - db #1C,#A2 ; - db #5C,#97 ;#5D NMY debouncing - db #5D,#DE ;#5E graphics manipulators - db #0D,#5D,#DE ;#5F Set Up graphics manipulators - db #DE ;#60 manipulators - db #DF ;#61 mouse - db #60,#E1 ;#62 kempston joystick - db #64,#97 ;#63 first debouncing - db #1A,#99 ;#64 before repeat - db #63,#E2 ;#65 second wait - db #63,#97 ;#66 second debouncing - db #67,#65,#E6 ;#67 size of step - db #68,#38,#8C ;#68 quick format disk - db #E9 ;#69 autostart - db #58,#7F,#00,#D8 ;#6A save CMOS - db #59,#7F,#00,#D8 ;#6B load CMOS - db #58,#0D,#20,#8C ;#6C save Set Up to disk - db #0D,#7F,#00,#56,#D0 ;#6D Set Up hard disk - db #7F,#00,#38,#7F,#01 ;#6E type I/O - db #EA ; - db #91 ;#6F Shadow - db #7F,#02,#30,#0F ;#70 __ from drive - db #7F,#01,#B9 - -;АДРЕС: #1906 Блок сообщений 0 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов - -x1906 db #0A,#89 ;#01 enter command - db #06,#93 ;#02 block identical - db #07,#80 ;#03 breackpoint _число_ - db #11,#01,#80 ;#04 found at _число_ - db #7F,#01,#1F,#7F,#00 ;#05 stop number _число_ - db #1A,#80 - db #BF ;#06 _Working ... - db #0A,#9A ;#07 enter number - db #2F,#A4 ;#08 word redefined - db #0A,#9B ;#09 enter name - db #2C,#12,#9D ;#0A too few operands - db #2C,#17,#9D ;#0B too many operands - db #20,#1C,#A3 ;#0C out of range - db #15,#9A ;#0D known number - db #04,#A8 ;#0E bad string - db #27,#B2 ;#0F syntax error - db #19,#9A ;#10 not number - db #1A,#2C,#85 ;#11 number too big - db #34,#19,#91 ;#12 operand not found - db #33,#34,#19,#91 ;#13 quit operand not found - db #2C,#17,#B5 ;#14 too many > - db #37,#38,#B6 ;#15 invalid type brackets - db #09,#19,#91 ;#16 command not found - db #39,#3A,#B4 ;#17 illegal value operand - db #37,#3B,#BC ;#18 invalid bank RAM - db #37,#3B,#BD ;#19 invalid bank ROM - db #09,#82 ;#1A command abandoned - db #3E,#3B,#BD ;#1B forbidden bank ROM - db #3E,#3B,#BC ;#1C forbidden bank RAM - db #2A,#31,#90 ;#1D start > _число_ - db #7F,#01,#08 ;#1E print abandoned - db #7F,#00,#82 - db #28,#2C,#96 ;#1F string too long - db #28,#19,#91 ;#20 string not found - db #18,#2B,#A8 ;#21 no search string - db #37,#1A,#87 ;#22 invalid number breackpoint - db #37,#41,#87 ;#23 invalid state breackpoint - db #37,#38,#87 ;#24 invalid type breackpoint - db #04,#40,#87 ;#25 bad address breackpoint - db #07,#AD ;#26 breackpoint undefined - db #46,#07,#C2 ;#27 curent breackpoint selections: - db #18,#40,#3B,#38,#41 ;#28 no address bank type state init count word - db #43,#44,#AF - db #45,#AD ;#29 *** undefined - db #04,#9E ;#2A bad opcode - db #10,#A2 ;#2B finish program - db #04,#B4 ;#2C bad operand - db #14,#22,#A6 ;#2D insufficient program space - db #22,#AD ;#2E program undefined - db #39,#2F,#9B ;#2F illegal word name - db #18,#8C ;#30 no definition - db #2F,#19,#95 ;#31 word not known - db #3E,#38,#AF ;#32 forbidden type word - db #47,#C8 ;#33 analyser definitions: - db #26,#49,#4A,#25,#80 ;#34 space left for stack _число_ - db #CB ;#35 bytes - db #25,#19,#8B ;#36 stack not empty - db #41,#1C,#A5 ;#37 state of stack - db #47,#B2 ;#38 analyser error - db #20,#1C,#25,#A6 ;#39 out of stack space - db #25,#8B ;#3A stack empty - db #2E,#94 ;#3B workspace insufficient - db #AE ;#3C workspace - db #4C,#22,#19,#91 ;#3D Professional program not found - db #15,#D0 ;#3E known disk - db #50,#19,#CD ;#3F disk not TRDOS - db #0D,#08,#B0 ;#40 devision by zero - db #0E,#01,#80 ;#41 failed at _число_ - db #2C,#12,#86 ;#42 too few blocks - db #0A,#C0 ;#43 enter address - db #0E,#D0 ;#44 failed disk - db #37,#0F,#9B ;#45 invalid file name - db #04,#44,#1C,#8F ;#46 bad count of file - db #0F,#03,#CE ;#47 file not exist - db #0F,#19,#91 ;#48 file not found - db #50,#18,#A6 ;#49 disk no space - db #39,#0F,#B8 ;#4A illegal file type - db #D0 ;#4B disk - db #C7 ;#4C analyser - db #87 ;#4D breackpoint - db #D2 ;#4E execution - db #D3 ;#4F configuration - db #4F,#32,#80 ;#50 R/W error _число_ - db #54,#D5 ;#51 memory control - db #D0 ;#52 disk - db #D1 ;#53 other - db #2D,#8F ;#54 undefined file - db #39,#7F,#01,#38 ;#55 illegal fromat file - db #7F,#00,#8F - db #56,#50,#19,#91 ;#56 hard disk not found - db #56,#50,#4F,#32,#80 ;#57 hard disk R/W error _число_ - db #56,#50,#AD ;#58 hard disk undefined - db #56,#50,#91 ;#59 hard disk found - db #58,#57,#B2 ;#5A CMOS checksum error - db #58,#19,#91 ;#5B CMOS not found - db #00,#4B,#58,#91 ;#5C _число_ bytes CMOS found - db #59,#DA ;#5D boot record - db #3D,#D0 ;#5E ROM disk - db #C2 ;#5F selections: - db #5B,#19,#91 ;#60 busy not found - db #56,#50,#19,#DC ;#61 hard disk not ready - db #56,#50,#7F,#01,#1D ;#62 hard disk data not ready - db #7F,#00,#19,#DC - db #37,#7F,#02,#14,#95 ;#63 invalid partition manager - db #7F,#02,#9E ;#64 select - db #5D,#9B ;#65 duplicate name - db #7F,#02,#14,#7F,#00 ;#66 partition not found - db #19,#91 - db #7F,#02,#14,#7F,#00 ;#67 partition undefined - db #AD - db #7F,#01,#1D,#7F,#00 ;#68 data CRC error - db #5E,#B2 - db #7F,#02,#2C,#7F,#00 ;#69 NVRAM R/W error - db #4F,#B2 - db #C5 ;#6A *** - -;АДРЕС: #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора -x1A40 ld bc,#0000 -x1A43 ld a,c - out (#FE),a - dec bc - ld a,c - or b - jr nz,x1A43 - pop bc - -;АДРЕС: #1A4C печать даты и времени в окне монитора -; -x1A4C bit 3,(iy+#27) - ret z ;индикация времени отлючена - ld hl,(xE3B7) ;адрес дескриптора текущего окна - ld de,xE0C9 - or a - sbc hl,de - ret nz ;отображено окно в котором нельзя выводить время - ld hl,xDB69 ;буфер для чтения даты и времени в формате ASCII - push hl - ld d,%11111010 - call x1AAF ;читаем время в строку в формате ASCII - ld hl,(xE3BC) ;первый свободный адрес в буфере печати - ld (hl)," " - inc hl - ld d,%10100000 - call x1B21 ;читаем дату в строку в формате ASCII - ld hl,(xE3BC) ;первый свободный адрес в буфере печати - pop bc - or a - sbc hl,bc - ld b,l ;длина строки - ld hl,(xE0C9) - push hl ;запомним координаты курсора в окне - ld a,(xE0C9+#06) ;xE0CF - push af ;запомним атрибуты окна - ld hl,#0017 - ld (xE0C9),hl ;координаты печати времени - ld a,(xE111) ;атрибуты печати - dec e ;если воскресенье, выводим красным цветом - inc e - jr nz,x1A8E - ld a,%00101010 -x1A8E ld (xE0C9+#06),a ;атрибуты печати - rst #20 - db #84 ;вывод с выравниванием - ld hl,xDB69 ;адрес строки - rst #30 - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 - rst #20 - db " " - db #86 ;выровняем по правому краю - pop af - ld (xE0C9+#06),a ;восстановим атрибуты - pop hl - ld (xE0C9),hl ;восстановим координаты курсора - ret - -;АДРЕС: #1AA6 читаем время в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 можно выводить секунды -; 6,d,=1 можно выводить минуты -; 7,d,=1 можно выводить часы -x1AA6 call x1AEC ;установка переменных для печати даты и времени - ret c ;CMOS отсутствует - call x1C67 ;чтение из CMOS времени и даты - jr x1AB2 - -;АДРЕС: #1AAF читаем время в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 можно выводить секунды -; 6,d,=1 можно выводить минуты -; 7,d,=1 можно выводить часы -; hl - адрес буфера -; -x1AAF call x1AF5 -x1AB2 ld hl,xDFF6+2 - bit 7,d - jr z,x1ABF ;часы не выводим - call x1ADE ;час в строку - call x1AD7 ;вывод разделителя в строку -x1ABF dec hl - bit 6,d - jr z,x1AC7 ;минуты не выводим - call x1ADE ;минуты в строку -x1AC7 dec hl - bit 5,d - jr z,x1AD2 ;секунды не выводим - call x1AD7 ;вывод разделителя в строку - call x1ADE ;секунды в строку -x1AD2 res 6,(iy+9) - ret -;вывод разделителя в строку -x1AD7 ld a,d - and #1F - or #20 - rst #10 - ret -;преобразование часа/минуты/секунды в строку -x1ADE push de - ld c,(hl) - ld b,#00 ;час - ld (iy+7),#02 - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - ret -;установка переменных для печати даты и времени -;вых: cy=1 CMOS отсутствует -x1AEC bit 6,(iy+#1A) - scf - ret z ;CMOS отсутствует - ccf - jr x1AFC -x1AF5 ld (xE3BC),hl - set 6,(iy+9) ;печать в буфер -x1AFC ld (iy+#08),#30 ;код ведущего ноля - ld (iy+#10),#0A ;делитель для выделения разрядов числа - ret - -;АДРЕС: #1B05 чтение даты из буфера и расчет номера дня недели -;вых: c день -; b месяц -; a,e год -; l номер дня недели (0 - Вс, 1 - Пн и т.д.) -; -x1B05 ld bc,(xDFF9) - ld a,(xDFFB) - push de - push af - push bc - ld e,a - call x1BAC - pop bc - pop af - pop de - ld e,a - ret - -;АДРЕС: #1B18 читаем дату в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 выводить месяц словом и перед годом добавлять "19" -; 6,d,=1 ставить символ 0 перед числом -; 7,d,=1 выводить день недели -x1B18 call x1AEC ;установка переменных для печати даты и времени - ret c ;CMOS отсутствует - call x1C67 ;чтение из CMOS времени и даты - jr x1B24 - -;АДРЕС: #1B21 читаем дату в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 выводить месяц словом и перед годом добавлять "19" -; 6,d,=1 ставить символ 0 перед числом -; 7,d,=1 выводить день недели -; hl - адрес буфера -; -x1B21 call x1AF5 -x1B24 call x1B05 ;чтение даты из буфера и расчет номера дня недели - push af - push bc - bit 7,d - jr z,x1B39 ;день недели не выводим - ld a,l ;день недели в строку - ld e,l - ld hl,rom2_x3F0A ;Названия дней недели - rst #30 - dw rom2_x15D0 - db %00000010 - call x1AD7 ;вывод разделителя в строку -x1B39 pop hl - ld c,l ;день - push hl - ld b,#00 - ld a,#01 - bit 6,d - jr z,x1B45 ;ведущий 0 не ставить - inc a -x1B45 ld (iy+7),a ;минимум разрядов в числе - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - call x1AD7 ;вывод разделителя в строку - pop af ;месяц - bit 5,d - jr z,x1B60 ;выводим цифрой - dec a ;выводим словом - ld hl,rom2_x3EE6 ;названия месяцев - rst #30 - dw rom2_x15D0 - db %00000010 - jr x1B6D -x1B60 ld c,a - ld b,0 - ld (iy+7),#02 - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de -x1B6D call x1AD7 ;вывод разделителя в строку - pop af - ld c,a - bit 5,d - jr z,x1B82 ;год выводим двумя цифрами - cp 80 - jr nc,x1B7F - rst #20 - dc "20" - jr x1B82 -x1B7F rst #20 - dc "19" -x1B82 ld b,#00 - ld (iy+7),#02 - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - res 6,(iy+9) - ret - -;АДРЕС: #1B93 таблица для вычисления кода месяца -x1B93 db 2 ;март - db 5 ;апрель - db 7 ;май - db 10 ;июнь - db 12 ;июль - db 15 ;август - db 18 ;сентябрь - db 20 ;октябрь - db 23 ;ноябрь - db 25 ;декабрь - db 28 ;январь - db 31 ;февраль -x1B9F db 33 ; -;количество дней в месяцах - db 31 ;январь - db 28 ;февраль - db 31 ;март - db 30 ;апрель - db 31 ;май - db 30 ;июнь - db 31 ;июль - db 31 ;август - db 30 ;сентябрь - db 31 ;октябрь - db 30 ;ноябрь - db 31 ;декабрь - -;АДРЕС: #1BAC расчет номера дня недели -;вх: c день -; b месяц -; e год -;вых: l номер дня недели (0 - Вс, 1 - Пн и т.д.) -; -x1BAC exx - push hl - push de - push bc - exx - ld a,e ;a,de - год - ld d,#00 - ld hl,1900 - add hl,de - cp 80 - jr nc,x1BC0 ;год >=80 - ld de,100 - add hl,de ;hl текущий год в формате yyyy -x1BC0 ld a,b ;определение кода месяца - sub 3 - jr nc,x1BC8 - add a,12 - dec hl -x1BC8 ld de,x1B93 - add a,e - ld e,a - jr nc,x1BD0 - inc d -x1BD0 ld a,(de) ;a код месяца - add a,c ;+день - push hl ;год - add a,l - ld l,a - jr nc,x1BD8 - inc h -x1BD8 ex (sp),hl - push hl - srl h - rr l - srl h - rr l - ex (sp),hl - push hl - ld de,100 - rst #30 - dw rom2_x0E73 ;bc=hl/de - db %00000010 - pop hl ;bc=год/100 - push bc - ld de,400 - rst #30 - dw rom2_x0E73 ;bc=hl/de - db %00000010 - pop de ;bc=год/400 - pop hl - add hl,bc - or a - sbc hl,de ;hl год/4 + год/400 - год/100 - pop bc ;bc день + (31 * месяц)/12 + год - add hl,bc - ld de,#0000 - exx - ld bc,#0007 - rst #30 - dw rom7_x0F5D ;l остаток от деления - db %00000111 - exx - pop bc - pop de - pop hl - exx - ret - -;АДРЕС: #1C0D работа с микросхемой CMOS (rst 8: db #89) -;вх: d - код операции: 7,=1/0 записать/считать -; 6,=1/0 читать в буфер/только в регистры -; 5,=0 =0 читать в строку ASCII -; 0,=1/0 дата/время -; e - при чтении в ASCII формат перевода -; 0-4,e байт разделитель +#20 -; 5,e,=1 выводить месяц словом и перед годом добавлять "19" -; 6,e,=1 ставить символ 0 перед числом -; 7,e,=1 выводить день недели -; 5,e,=1 можно выводить секунды -; 6,e,=1 можно выводить минуты -; 7,e,=1 можно выводить часы -; hl - адрес буфера (если бит 6,d =1) -; c - секунды/число -; b - минуты/месяц -; e - часы/год -;вых: cy=1 - если микросхемы CMOS нет или задан неверный формат запроса -; hl - строка текста ASCIZ (если бит 6,d =1) -; c - секунды/число -; b - минуты/месяц -; e - часы/год -; l - день недели -; -x1C0D bit 6,(iy+#1A) - scf - ret z ;CMOS отсутствует - bit 7,d - jr nz,x1C4A ;запись времени или даты в CMOS - bit 6,d - jr z,x1C34 ;чтение в регистры из CMOS времени/даты - bit 5,d - jr nz,x1C2E ;чтение в буфер времени и даты - bit 0,d ;читаем в формате ASCII - ld d,e - jr nz,x1C29 ;читаем дату в строку в формате ASCII - call x1AAF ;читаем время в строку в формате ASCII - or a - ret -x1C29 call x1B21 - or a - ret -;чтение времени и даты из CMOS в буфер -x1C2E rst #30 - dw rom7_x1F93 - db %00000111 - or a - ret -;чтение из CMOS вренени и даты -x1C34 call x1C67 - bit 0,d - jr z,x1C40 ;время - call x1B05 ;дата - or a - ret -x1C40 ld hl,xDFF6 - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld e,(hl) - or a - ret -;запись времени или даты в CMOS -x1C4A call x1C67 ;чтение из CMOS вренени и даты - bit 0,d - jr nz,x1C62 ;это дата - ld hl,xDFF6 ;адрес времени -x1C54 ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),e - ld hl,xDFF6 ;запись времени и даты в CMOS - rst #30 - dw rom7_x1FB2 - db %00000111 - or a - ret -x1C62 ld hl,xDFF9 ;адрес даты - jr x1C54 -;чтение из CMOS времени и даты -x1C67 ld hl,xDFF6 - push bc - push de - rst #30 - dw rom7_x1F93 - db %00000111 - pop de - pop bc - ret - -;АДРЕС: #1C73 ввод текстовой строки в нижней строке экрана -;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 6-0,a - номер сообщения из блока 0 -; a =#00 продолжение ввода -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1C73 rst #30 - dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - db #02 - rlc a - jr z,x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - call x1C84 ;инициализация окна ввода - call x1CB8 ;ввод строки (вых: hl адрес введенной строки) - ret c ;отмена ввода - ld a,#0C ;сообщение _Working ... - -;АДРЕС: #1C84 инициализация окна ввода -;вх: 0,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 7-1,a - номер сообщения из блока 0 -; cy=1 с очисткой буфера ввода -x1C84 push af - ld hl,xDE17 ;буфер для ввода строки - ld (xDE15),hl - call c,x1DD6 ;очистка буфера вводимой строки - rst #30 - dw rom2_x2A5E ;очистка текущего окна - db #02 - pop af - push af - srl a - ld hl,#5AC0 ;атрибуты информационной строки на экране - ld e,l - ld d,h - ld (hl),#29 ;bright 0, paper 5, ink 1 - cp #0A - jr c,x1CA3 - ld (hl),#2A ;bright 0, paper 5, ink 2 -x1CA3 inc de - ld bc,#001F - ldir - inc (ix+1) - ld b,a - rst #08 - inc (ix+0) - pop af - ret - -;АДРЕС: #1CB3 продолжение ввода строки (вых: hl адрес введенной строки) -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1CB3 call x1DEC ;удаление кода возврата каретки из строки - jr x1CC7 - -;АДРЕС: #1CB8 ввод строки (вых: hl адрес введенной строки) -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1CB8 call x1DEC ;удаление кода возврата каретки из строки ввода - ld hl,xDE17 - ld (xDE15),hl - call x1D70 ;позиционирование курсора в конец строки -x1CC4 call x1D98 ;печать вводимой строки на экране -x1CC7 ld hl,x1CC4 ;тут зациклим - push hl - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 -x1CD3 call x1033 ;вызов п/п обработки нажатия клавиши - db #85 ;cs+5 - dw x1D5A ;перемещение курсора в водимой строке влево - db #83 ;cs+8 - dw x1D64 ;перемещение курсора в водимой строке вправо - db #7F ;cs+0 - dw x1D40 ;удаление символа перед курсором (delete) - db #0D ;enter / cs+1+m - dw x1D0D ; - db #86 ;cs+6 вниз - dw x1E5B ;копирование в буфер ввода предпоследней введенной строки - db #84 ;cs+7 вверх - dw x1EC0 ;копирование в буфер ввода следующей введенной строки - db #1F ;ss+i - dw x1DC2 ;смена режима вставки/замены при вводе строки - db #FF - cp #20 ;a - код нажатой клавиши - jr c,x1CF4 ;a=[#00..#1F] - cp #80 - jr c,x1D10 ;a=[#20..#7F] -x1CF4 scf ;a - непечатный символ -x1CF5 push af ;cy =1/0 отмена/ввод - push de - push af - call nc,x1E2D ;сохранение введенной строки в буфере последних введенных строк - call x1D98 ;печать введенной строки на экране - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 - pop af - call nc,x1D10 ;добавление символа в вводимую строку - pop de - pop af - pop hl - ld hl,xDE17 ;адрес введенной строки - ret -x1D0D or a - jr x1CF5 - -;АДРЕС: #1D10 добавление символа в вводимую строку -;вх: a - код нажатой клавиши -x1D10 ld e,a - call x1DB7 ;получение адреса под курсором в буфере строки - ld d,(ix+#0B) - dec d - ld c,(ix+1) - ld a,d - cp c - jr z,x1D38 ;курсор в последней позиции. предупреждаем звонком - bit 1,(ix+#0D) - jr nz,x1D36 ;режим замены символов -x1D25 sub c ;раздвигаем строку - ld c,a - ld b,#00 - push hl - add hl,bc - ld a,(hl) - push de - ld e,l - ld d,h - dec hl - lddr - pop de - pop hl - jr x1D38 -x1D36 ld a," " -x1D38 ld (hl),e ;ставим символ - cp " " - call nz,x1EEE ;звонок с установкой бордюра - jr x1D64 ;перемещение курсора в введенной строке вправо - -;АДРЕС: #1D40 удаление символа перед курсором (delete) -x1D40 call x1D5A ;перемещение курсора в вводимой строке влево - ret z - call x1DB7 ;получение адреса под курсором в буфере строки - ld a,(ix+#0B) - dec a - sub (ix+1) - ld c,a - ld e,l - ld d,h - inc hl - ld b,#00 - ldir ;удаление символа под курсором - ld a," " ;в конец строки допишем пробел - ld (de),a - ret - -;АДРЕС: #1D5A перемещение курсора в водимой строке влево -;вых: z - курсор в крайнем положении -x1D5A ld a,(ix+1) - or a - ret z - dec (ix+1) - inc a - ret - -;АДРЕС: #1D64 перемещение курсора в вводимой строке вправо -x1D64 ld a,(ix+1) - inc a - cp (ix+#0B) - ret nc - inc (ix+1) - ret - -;АДРЕС: #1D70 позиционирование курсора в конец строки -x1D70 ld hl,(xDE15) ;адрес буфера вводимой строки - ld a,(ix+#0B) ;размер окна в символах - ld c,a - dec a ;крайняя правая координата - add a,l - ld l,a - jr nc,x1D7D - inc h ;hl адрес конца строки -x1D7D ld b,#00 ;bc длина сроки - ld a," " -x1D81 cpd ;ищем символ не пробел - jp po,x1D94 ;bc=0 конец поиска - jr z,x1D81 -x1D88 ld a,(ix+#0B) ;такой символ найден - dec a - cp c - jr z,x1D90 - inc c ;ставим курсор после этого символа -x1D90 ld (ix+1),c - ret -x1D94 jr z,x1D90 ;если все-таки найден пробел - jr x1D88 - -;АДРЕС: #1D98 печать вводимой строки на экране -x1D98 rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 - ld a,(ix+1) ;сохраним координату X курсора - push af - ld hl,(xDE15) ;начало вводимой строки - ld b,(ix+#0B) ;длина строки - ld (ix+1),#00 - rst #30 - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 - pop af - ld (ix+1),a ;восстановим координату X курсора - rst #30 - dw rom2_x28E8 ;печать курсора в окне - db #02 - ret - -;АДРЕС: #1DB7 получение адреса под курсором в буфере строки -;вых: hl - адрес в буфере -x1DB7 ld a,(ix+1) - ld hl,(xDE15) - add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #1DC2 смена режима вставки/замены при вводе строки -; -x1DC2 ld a,(ix+#0D) - xor %00000010 - ld (ix+#0D),a - bit 1,a - ld a,#DB - jr z,x1DD2 - ld a,#DC -x1DD2 ld (ix+#0C),a - ret - -;АДРЕС: #1DD6 очистка буфера вводимой строки -x1DD6 ld hl,(xDE15) - ld c,(ix+#0B) - ld (hl)," " - dec c - ret z - ld b,#00 - ld e,l - ld d,h - inc de - ldir - ld (ix+1),#00 - ret - -;АДРЕС: #1DEC удаление кода возврата каретки из строки -x1DEC ld a,#0A - ld (xDE14),a - ld a,(ix+1) ;сохраним координату X - push af - call x1D70 ;позиционирование курсора в конец строки - ld a,(ix+1) - inc a - cp (ix+#0B) - jr z,x1E04 ;курсор на последнем символе строки - call x1D5A ;перемещение курсора в водимой строке влево -x1E04 call x1DB7 ;получение адреса под курсором в буфере строки - ld a,(hl) ;enter заменим на пробел - cp #0D - jr nz,x1E0E - ld (hl)," " -x1E0E pop af - ld (ix+1),a ;восстановим координату курсора - ret - -;АДРЕС: #1E13 помещение символа в строку и приращение адреса в буфере строк -;вх: hl - адрес в буфере -; de - адрес конца буфера -;вых: hl - очередной адрес в буфере -x1E13 ld (ix+0),a - inc ix - -;АДРЕС: #1E18 циклическое приращение адреса в буфере введенных строк -;вх: hl - адрес в буфере -; de - адрес конца буфера -;вых: hl - очередной адрес в буфере -x1E18 inc hl - or a - sbc hl,de - add hl,de - ret nz - ld hl,xDE42 - ret - -;АДРЕС: #1E22 получем адрес конца последней введенной строки -;вх: hl - адрес конца последней введенной строки -; de - адрес начала буфера -;вых: hl - адрес последнего символа последней введенной строки -x1E22 or a - sbc hl,de - add hl,de - jr nz,x1E2B - ld hl,xDFD2 -x1E2B dec hl - ret - -;АДРЕС: #1E2D сохранение введенной строки в буфере последних введенных строк -x1E2D call x1D70 ;позиционирование курсора в конец строки - ld b,(ix+1) ;длина введенной строки - ld a,b - or a - ret z ;пустая строка - push ix - ld ix,(xDE15) ;адрес начала введенной строки - ld hl,(xE035) - ld de,xDFD2 ;конец буфера последних введенных строк -x1E42 ld a,(ix+0) ;сохранение строки в буфере последних введенных строк - inc ix - ld (hl),a - call x1E18 ;циклическое приращение адреса в буфере введенных строк - djnz x1E42 - pop ix - ld (hl),#00 ;маркер конца введенной строки - call x1E18 ;циклическое приращение адреса в буфере введенных строк - ld (xE035),hl - ld (xE037),hl - ret - -;АДРЕС: #1E5B копирование в буфер ввода предпоследней введенной строки -;вх: a - код нажатой клавиши #86 -; -x1E5B ld bc,(xDE14) ; - cp c ; - ld b,#02 ; - jr nz,x1E65 ; - dec b ; -x1E65 ld (xDE14),a ; -x1E68 ld hl,(xE037) - ld de,xDE42 - call x1E22 ;получем адрес конца последней введенной строки -x1E71 call x1E22 ;ищем начало строки - ld a,(hl) - or a - jr nz,x1E71 - ld de,xDFD2 - call x1E18 ;циклическое приращение адреса в буфере введенных строк - call x1EE1 ;проверка списка на наличие введенных строк - ld a,(hl) - or a - jp z,x1DD6 ;эта строка пустая - ld (xE037),hl ;начало последней введенной строки - push bc - call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки - pop bc - djnz x1E68 - ret - -;АДРЕС: #1E91 копирование строки из буфера введенных строк в буфер ввода строки -x1E91 call x1DD6 ;очистка буфера вводимой строки - ld b,(ix+#0B) - ld hl,(xE037) ;начало последней введенной строки - ld de,xDFD2 ;конец буфера - push ix - ld ix,(xDE15) ;адрес буфера для ввода строки -x1EA3 ld a,(hl) ;копирование строки в буфер ввода - or a - jr z,x1EB5 ;конец строки - call x1E13 ;помещение символа в строку и приращение адреса в буфере строк - djnz x1EA3 -x1EAC ld a,(hl) ;если строка была длиннее буфера ввода, ищем ее конец - or a - jr z,x1EB5 - call x1E18 ;циклическое приращение адреса в буфере введенных строк - jr x1EAC -x1EB5 call x1E18 ;hl - адрес следующей строки в буфере введенных строк - pop ix - push hl - call x1D70 ;позиционирование курсора в конец строки - pop hl - ret - -;АДРЕС: #1EC0 копирование в буфер ввода следующей введенной строки -;вх: a - код нажатой клавиши #84 -; -x1EC0 ld hl,(xE037) - ld bc,(xDE14) - cp c - ld b,#02 - jr nz,x1ECD - dec b -x1ECD ld (xDE14),a -x1ED0 call x1EE1 ;проверка списка на наличие введенных строк - ld a,(hl) - or a - ret z ;строка пустая - push bc - call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки - ld (xE037),hl - pop bc - djnz x1ED0 - ret - -;АДРЕС: #1EE1 проверка списка на наличие введенных строк -;вх: hl - начало последней введенной строки -x1EE1 ld de,(xE035) ;первый свободный адрес в буфере последних введенных строк(команд) - or a - sbc hl,de - add hl,de - ret nz - pop hl ;список пустой - jp x1DD6 ;очистка буфера вводимой строки - -;АДРЕС: #1EEE звонок с установкой бордюра -x1EEE rst #20 - db #87 - ret - -;АДРЕС: #1EF1 печать каталога и выбор позиции в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -; -x1EF1 call x2028 ;определение номера последней записи в каталоге - db #02 - ld (xDD89),hl ;номер последней записи - call x203C ;расчет размеров и печать окна под каталог - ld hl,#0000 ;номер записи каталога, с которой начинаем печать - ld (xE9E3),hl - call x1F7F ;печать каталога в окне -x1F04 ld hl,x1F04 ;сюда вернемся - push hl - call x1FF4 ;печать выделенной позиции в каталоге - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - push af ;a - код нажатой клавиши - call x1FBA ;снимаем выделение строки каталога - pop af - call x0385 ;обработка реакции на нажатия клавиш - call nc,x1FDC ;покажем выбранную позицию - call x1033 - db #84 ;cs+7 вверх - dw x1F4C ;нажата клавиша вверх, двигаем выделение вверх - db #86 ;cs+6 вниз - dw x1F94 ;нажата клавиша вниз, двигаем выделение вниз - db #0D ;enter - dw x1F44 ;выбор позиции в каталоге - db #80 ;fire KempJoy в окне - dw x1F4B ;!!!ОШИБКА должно быть x1F44 - db #FF - cp #3A - ccf - jr c,x1F45 ;не цифра - cp #30 - jr c,x1F45 ;не цифра - sub #30 - jr nz,x1F39 - ld a,#0A ;"0" =10 -x1F39 dec a - cp (ix+4) - ret nc ;нет позиции с таким номером - ld (ix+0),a - call x1FDC ;покажем выбранную позицию -;выбор позиции в каталоге -x1F44 or a -x1F45 pop hl - push af - call x201D ;(xE9E3) +crd Y курсора - pop af -x1F4B ret -;нажата клавиша вверх, двигаем выделение вверх -x1F4C call x201D ;(xE9E3) +crd Y курсора - ld a,l - or h - jr z,x1F64 ;достигнут предел - call x2012 ;уменьшаем координату Y - ret nz ;умеyьшили успешно - rst #30 - dw rom2_x2A1B ;скроллинг окна ввниз - db #02 - ld hl,(xE9E3) - dec hl - ld (xE9E3),hl - jr x1FBA ;печать одной строки каталога ROM-disk -x1F64 ld hl,(xDD89) ;переход на нижнюю строчку - ld c,(ix+4) - dec c - ld (ix+0),c - xor a - ld b,a - sbc hl,bc - jr nc,x1F7C - ld a,l - add a,c - ld (ix+0),a - ld hl,#0000 -x1F7C ld (xE9E3),hl -;печать каталога ROM-disk в окне -x1F7F ld a,(ix+0) - push af ;сохраним crd Y курсора - xor a - ld (ix+0),a ;crd Y =0 -x1F87 call x1FBA ;;печать одной строки каталога ROM-disk - call x2006 ;приращение координаты Y курсора - jr nz,x1F87 ;печатаем следующую строку - pop af - ld (ix+0),a ;восстановим crd Y курсора - ret -;нажата клавиша вниз, двигаем выделение вниз -x1F94 ld hl,(xDD89) - push hl - call x201D ;(xE9E3) +crd Y курсора - pop de - xor a - sbc hl,de - jr c,x1FAB - ld h,a ;достигнут нижний предел. переходим на верхнюю строку - ld l,a - ld (xE9E3),hl - ld (ix+0),a - jr x1F7F ;печать каталога ROM-disk в окне -x1FAB call x2006 ;приращение координаты Y курсора - ret nz ;успешно - rst #30 - dw rom2_x298E ;скроллинг окна вверх - db #02 - ld hl,(xE9E3) - inc hl - ld (xE9E3),hl -;печать одной строки каталога ROM-disk -x1FBA ld (ix+1),#00 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - call x201D ;(xE9E3) +crd Y курсора - ex de,hl - ld hl,(xDD89) - or a - sbc hl,de ;номер последней записи в каталоге ROM-disk - jr c,x1FD3 - ex de,hl - call x2028 ;печать одного имени из каталога ROM-disk - db #00 ;вх: hl - номер записи -x1FD3 rst #30 - dw rom2_x2FED ;печать пробелов до правого края окна - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ret -;покажем выбранную позицию -x1FDC push af - call x1FF4 ;печать выделенной позиции в каталоге ROM-disk - call x1FE8 ;пауза примерно 646k тактов - call x1FBA ;снимаем выделение позиции - pop af - ret -;пауза примерно 646k тактов -x1FE8 ld a,#C0 -x1FEA push bc -x1FEB ld b,#00 - djnz $ - pop bc - dec a - jr nz,x1FEA - ret -;печать выделенной позиции в каталоге ROM-disk -x1FF4 ld a,(ix+6) - push af ;сохраним атрибуты - ld a,(ix+#0E) - ld (ix+6),a - call x1FBA ;печать одной строки каталога ROM-disk - pop af - ld (ix+6),a - ret -;приращение координаты Y курсора -;вых: z - не было приращения -x2006 ld a,(ix+4) - dec a - cp (ix+0) - ret z - inc (ix+0) - ret -;уменьшаем координату Y -x2012 ld a,(ix+0) - or a - ret z - dec (ix+0) - xor a - inc a - ret -;(xE9E3) +crd Y курсора -x201D ld hl,(xE9E3) - ld a,(ix+0) - -;АДРЕС: #2023 сложение hl=hl+a -x2023 add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #2028 вызов процедуры по таблице, адрес которой в (xE9E1) -;вх: db ? номер процедуры -; =#04 заголовок -x2028 ex (sp),hl - ld a,(hl) - inc hl - ex (sp),hl - -;АДРЕС: #202C вызов процедуры по таблице, адрес которой в (xE9E1) -;вх: a - номер процедуры -; =#04 заголовок -x202C push hl - ld hl,(xE9E1) - call x2023 ;сложение hl=hl+a - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - ex (sp),hl - ld a,(xDDA7) - ret - -;АДРЕС: #203C расчет размеров и печать окна под каталог ROM-disk -x203C call x205A ;установка текущим окна: вывод каталога - ld bc,(xDD89) ;номер последней записи каталога ROM-disk - ld hl,#000F ;высота окна не более 16 - or a - sbc hl,bc - jr nc,x204D - ld c,#10 -x204D inc c - ld (ix+4),c ;высота окна - ld hl,#0531 ;атрибуты заголовка и выравнивание - -;АДРЕС: #2054 печать рамки вокруг окна -x2054 call x207A ;печать рамки вокруг окна - rst #20 - db #8C ;очистка окна - ret - -;АДРЕС: #205A установка текущим окна: вывод каталога -x205A ld hl,xE0F3 - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 - ret - -;печатные коды рамок -x2062 db #BB,#CD,#C9,#BA,#BA,#BC,#CD,#C8 - db #B9,#CD,#CC,#BA,#BA,#BC,#CD,#C8 - db #B6,#C4,#C7,#BA,#BA,#BC,#CD,#C8 - -;АДРЕС: #207A печать рамки вокруг окна -;вх: l - атрибуты заголовка -; h - выравнивание загловка (=0 нет выравнивания) -; hl=#0000 нет заголовка -; -x207A bit 7,(ix+8) - ret z ;нет рамки - push hl - ld de,xE338 ;сохраним дескриптор окна - push ix - pop hl - push hl - ld bc,#000E - ldir - pop hl - ld (hl),#00 ;координаты курсора =0 - inc hl - ld (hl),#00 - inc hl - dec (hl) ;увеличим размерыокна на 2 - inc hl - dec (hl) - inc hl - inc (hl) ;высота +2 - inc (hl) - inc hl - inc (hl) ;ширина +2 - inc (hl) - ld (ix+7),#03 ;системные атрибуты окна - ld a,(ix+9) - ld (ix+6),a ;атрибуты рамки - ld a,(ix+8) - and %00111000 - ld l,a - ld h,#00 ;номер рамки *8 - ld de,x2062 - add hl,de ;адрес рамки - ld (ix+#0A),#08 ;размер символов в пикселях - ld a,(ix+#0B) - push af ;сохраним ширину окна - ld (ix+#0B),#20 ;ширина окна 32 - call x2120 ;печать верхней линии рамки - ld b,(ix+4) - dec b - dec b ;высота - jr z,x20E0 ;средних линий нет - ld c,(ix+5) - dec c ;правая координата X - ld e,(hl) - inc hl - ld d,(hl) - inc hl ;de печатные коды рамки -x20D0 inc (ix+0) ;печать средных линий рамки - ld (ix+1),#00 - ld a,e - rst #10 - ld (ix+1),c - ld a,d - rst #10 - djnz x20D0 -x20E0 inc (ix+0) - ld (ix+1),#00 - call x2120 ;печать нижней линии рамки - pop af - inc a - inc a - inc a - ld (ix+#0B),a - ld (ix+#0A),#06 - pop hl - ld a,l - or h - jr z,x2114 ;нет загаловка - ld (ix+0),#00 - ld (ix+1),#01 - ld (ix+6),l - ld a,h - or a - push af - jr z,x210C ;нет выравнивания - rst #20 - db #84 ;вывод с выравниванием -x210C call x2028 - db #04 ;печать заголовка окна - pop af - jr z,x2114 - rst #10 ;выровняли заголовок -x2114 ld hl,xE338 ;восстановим дескриптор окна - push ix - pop de - ld bc,#000E - ldir - ret -;печать линии рамки -x2120 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - inc hl - rst #10 - ld b,(ix+5) ;ширина окна - dec b - dec b -x212C ld a,d - rst #10 - djnz x212C - ld a,e - rst #10 - ret - -;АДРЕС: #2133 коррекция координат и размеров окна -;вх: hl - координаты окна -; e - ширина окна в знакоместах -; d - ширина окна в символах -x2133 ld (xE0F3+#02),hl - ld a,e - ld (xE0F3++#05),a - ld a,d - ld (xE0F3++#0B),a - ret - -;АДРЕС: #213F координаты Y и X полей для окна редактирования дампа -x213F db #00,#02,#05 - db #08,#09,#0B,#0C,#0E,#0F,#11,#12 - db #14,#15,#17,#18,#1A,#1B,#1D,#1E - db #21,#28 - db #FC - db #08,#09,#0B,#0C,#0E,#0F,#11,#12 - db #14,#15,#17,#18,#1A,#1B,#1D,#1E - db #21,#28 - db #FF - -;АДРЕС: #2168 таблица со списком процедур для окна редактирования дампа -x2168 dw x2447 ;#00 печать одной строки дампа памяти (8 байт) - dw x2365 ;#02 обновление окна дампа памяти - dw x21A7 ;#04 заглушка ret - dw x2286 ;#06 скроллинг дампа - dw x2286 ;#08 скроллинг дампа - dw x243D ;#0A чтение байта из памяти пользователя - dw x2442 ;#0C запись байта в память пользователя - dw x2409 ;#0E редактирование слово в bc - dw x244C ;#10 обновление окна с дизасмом памяти начиная с текущей ячейки - -;АДРЕС: #217A поиск чего-то (такое впечатление, что тут ошибка, по логике -; должно быть сравнение с координатой X) -;вых: при текущем раскладе на выходе всегда z -; hl=x213F+#15 -x217A ld hl,(xE9DF) -x217D ld a,(hl) - cp #FD - ret nc - cp #FC - ret z - and #7F - cp (ix+#00) - ret z -x218A inc hl - bit 7,(hl) - jr nz,x217D - jr x218A - -;АДРЕС: #2191 проверка попадания курсора по X на редактируемый байт в дампе -;вых: z - crdX на каком-то байте поля дампа -x2191 ld a,(hl) - cp #FD - ret nc -x2195 inc hl - ld a,(hl) - bit 7,a - ret nz - cp (ix+#01) - ret nc - inc hl - ld a,(hl) - cp (ix+#01) - ret z - jr c,x2195 - xor a -x21A7 ret - -;АДРЕС: #21A8 коррекция координаты X, при движении курсора влево -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21A8 push hl - call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе - pop hl - ret z ;crdX на каком-то байте поля дампа - call x2253 ;декремент координаты X - jr nz,x21A8 ;координата X уменьшена - jr x2208 ;декремента не было - -;АДРЕС: #21B5 коррекция координаты X, при движении курсора -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21B5 ld c,(ix+#01) ;crd X - call x21FD ;коррекция координаты X, при движении курсора вправо - ret z ;курсор на байте дампа - ld (ix+#01),c ;восстановим координату X - call x21A8 ;коррекция координаты X, при движении курсора влево - ret z ;курсор на байте дампа - ld (ix+#01),c ;восстановим координату X - ret - -;АДРЕС: #21C7 инкремент координаты X, и изменение адреса текущей ячейки дампа -;вых: z - курсор на байте дампа -x21C7 call x2247 ;инкремент координаты X в рамках окна - jr z,x21D3 ;инкремента небыло - call x217A - call x21FD ;коррекция координаты X, при движении курсора вправо - ret z ;курсор на байте дампа -; crd X =#00 -x21D3 ld (ix+#01),#00 - -;АДРЕС: #21D7 перемещение курсора на 8 байт вниз (нажатие cs+6/ss+S курсор вниз) -x21D7 ld e,#08 - jr x21DD -;перемещение курсора на один байт вниз -x21DB ld e,#01 -;перемещение курсора на E байт вниз -x21DD call x2006 ;приращение координаты Y курсора - ld a,#08 ;скроллинг дампа - jp z,x202C ;Y не изменилась. вызов процедуры по таблице, адрес которой в (xE9E1) - -;АДРЕС: #21E5 коррекция координаты X, при движении курсора -;вых: z - курсор на байте дампа -; nz - -x21E5 call x21ED - ret z - ld (ix+#00),#00 ;crd Y =0 -x21ED call x217A ;при текущем раскладе на выходе всегда z - jr nz,x21F6 - call x21B5 ;коррекция координаты X, при движении курсора - ret z ;курсор на байте дампа -x21F6 call x2006 ;приращение координаты Y курсора - jr nz,x21ED ;координата Y изменилась - jr x2208 ;установка nz и выход - -;АДРЕС: #21FD коррекция координаты X, при движении курсора вправо -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21FD push hl - call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе - pop hl - ret z ;crdX на каком-то байте поля дампа - call x2247 ;инкремент координаты X в рамках окна - jr nz,x21FD ;инкремент был -;установка флага nz -x2208 xor a - inc a - ret - -;АДРЕС: #220B декремент координаты X в рамках текущего поля со скроллингом -x220B call x2253 ;декремент координаты X - jr z,x2217 ;декремента не было - call x217A - call x21A8 ;коррекция координаты X, при движении курсора влево - ret z ;курсор на байте дампа -; ставим курсор на крайнюю правую позицию -x2217 ld a,(ix+#0B) ;размер окна в символах - dec a - ld (ix+#01),a ;новая координата X (крайняя правая позиция) - -;АДРЕС: #221E перемещение курсора на 8 байт вверх (нажатие cs+7/ss+W курсор вверх) -x221E ld e,#F8 - jr x2224 -;скроллинг на строку вверх -x2222 ld e,#FF -x2224 call x2012 ;уменьшаем координату Y - ld a,#06 ;скроллинг дампа - jp z,x202C ;координата Y не была уменьшена (вызов процедуры скроллинга) - call x2237 ;коррекция координаты Y, при движении курсора - ret z ;курсор на байте дампа -; установка координаты Y в нижний край окна - ld a,(ix+#04) - dec a - ld (ix+#01),a - -;АДРЕС: #2237 коррекция координаты Y, при движении курсора -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x2237 call x217A - jr nz,x2240 ;на выходе всегда z - call x21B5 ;коррекция координаты X, при движении курсора - ret z ;курсор на байте дампа -; невозможно откорректировать координату X -x2240 call x2012 ;уменьшаем координату Y - jr nz,x2237 ;координата уменьшена - jr x2208 ;установка nz - -;АДРЕС: #2247 инкремент координаты X в рамках окна -;вых: z - инкремента не было -x2247 ld a,(ix+#0B) ;ширина окна в символах - dec a - cp (ix+#01) - ret z - inc (ix+#01) - ret - -;АДРЕС: #2253 декремент координаты X в рамках окна -;вых: z - декремента не было -x2253 ld a,(ix+#01) - or a - ret z - dec (ix+#01) - jr x2208 - -;АДРЕС: #225D нажатие cs+5/ss+Q курсор влево -;вх: c - crd X курсора -x225D ld a,c - cp #21 - jr c,x226B -; в поле редактирования символов - jr nz,x220B ;не крайняя левая позиция - ld a,#28 -x2266 ld (ix+#01),a ;крайняя правая позиция - jr x2222 ;скроллинг на строку вверх -; в поле редактирования hex дампа или адреса -x226B cp #02 - ret z ;крайняя позиция в адресе - cp #08 - jr z,x2274 ;крайняя позиция в hex дампе - jr x220B ;декремент координаты X в рамках текущего поля со скроллингом -x2274 ld a,#1E ;новая координата X в hex дампе - jr x2266 - -;АДРЕС: #2278 редактирование дампа памяти в окне монитора -x2278 ld hl,x2168 - ld (xE9E1),hl ;адрес таблицы со списком процедур для п/п x2028 - ld hl,x213F - ld (xE9DF),hl - jr x2298 - -;АДРЕС: #2286 скроллинг дампа -;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) -x2286 call x23A9 ;расчет приращения для скроллинга дампа - ld hl,(xDD87) ;адрес начала дампа памяти - add hl,bc ;новый адрес - ld (xDD87),hl - ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти - add hl,de - ld (xDD69),hl - pop hl - -;обновление окна дампа -x2298 call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #02 ;обновление окна дампа памяти - call x21E5 ;коррекция координаты X, при движении курсора - -;основной цикл редактирования дампа памяти -x229F ld hl,x229F ;адрес возврата - push hl - call x23C0 ;определение поля в окне редактирования дампа - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #10 ;обновление окна с дизасмом памяти начиная с текущей ячейки - res 0,(ix+#07) ;выводить символ курсора -;ожидание нажатия клавиши - rst #30 - dw rom2_x28E8 ;печать/удаление курсора в окне - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 ;a - код нажатой клавиши - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 -;реакция на нажатую клавишу - set 0,(ix+#07) ;не выводить символ курсора - ld d,a ;d - код нажатой клавиши - call x23C0 ;определение поля в окне редактирования дампа - jr c,x22E9 ;курсор в поле редактирования адреса дампа - jr nz,x230D ;курсор в поле редактирования символов дампа -; изменение hex значения под курсором в дампе - call x2400 ;чтение байта из памяти пользователя в bc - call x2412 ;редактирование байта в bc - jr nz,x2328 ;байт не изменился. проверка нажатия управляющей клавиши - ld (xDDA7),bc ;новое значение байта - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0C ;запись байта в память пользователя - call x2393 ;печать одной(текущей) строки дампа -; проверка координаты X -x22D9 ld de,#1E08 ;граничные координаты -x22DC ld a,(ix+#01) ;crd X - cp d - jp c,x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа - ld (ix+#01),e - jp x21DB ;перемещение курсора на один байт вниз -; изменение адреса дампа памяти -x22E9 ld bc,(xDD87) ;адрес начала дампа памяти - ld (xDDA7),a ;номер байта в строке дампа - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0E ;редактирование слова в bc - jr nz,x2328 ;слово не изменилось. проверка нажатия управляющей клавиши - ld (xDD69),bc ;новый адрес текущей ячейки в дампе памяти - ld (xDD87),bc ;адрес начала дампа памяти - ld a,(ix+#01) - push af - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #02 ;обновление окна дампа памяти - pop af - ld (ix+#01),a - jp x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа -; изменение символа в символьном поле дампа -x230D call x2400 ;чтение байта из памяти пользователя в bc - ld a,d - cp #20 - jr c,x2328 ;это не символ, проверка нажатия управляющей клавиши - cp #7F - jr nc,x2328 ;это не символ, проверка нажатия управляющей клавиши - ld (xDDA7),a - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0C ;запись байта в память пользователя - call x2393 ;печать одной(текущей) строки дампа -x2323 ld de,#2821 ;граничные координаты поля редактирования сомволов дампа - jr x22DC ;проверка координат -;проверка и обработка нажатия управляющей клавиши -;вх: d - код нажатой клавиши -x2328 ld a,d - ld c,(ix+#01) ;crd X - call x1033 ;вызов п/п обработки нажатой клавиши - db #85 ;cs+5 - dw x225D ;курсор влево - db #1C ;ss+Q - dw x225D ;курсор влево - db #83 ;cs+8 - dw x235D ;курсор вправо - db #1E ;ss+E - dw x235D ;курсор вправо - db #84 ;cs+7 - dw x221E ;курсор вверх - db #1D ;ss+W - dw x221E ;курсор вверх - db #86 ;cs+6 - dw x21D7 ;курсор вниз - db #8B ;ss+S - dw x21D7 ;курсор вниз - db #89 ;cs+9 - dw x237A ;смена поля редактирования hex <-> символы - db #01 ;cs+1+A - dw x2352 ;установка курсора на редактирование адреса дампа - db #03 ;break/cancel - dw x235B ;выход - db #FF - ret - -;АДРЕС: #2352 установка курсора на редактирование адреса дампа -x2352 ld (ix+#00),#00 ;crd Y =#00 - ld (ix+#01),#02 ;crd X =#02 - ret - -;АДРЕС: #235B выход из режима редактирования дампа -x235B pop hl - ret - -;АДРЕС: #235D нажатие cs+8/ss+E курсор вправо -x235D ld a,c ;crd X - cp #20 - jr nc,x2323 ;в поле редактирования символов - jp x22D9 ;поле редактирования адреса или hex дампа - -;АДРЕС: #2365 обновление окна дампа памяти -x2365 rst #30 - dw rom2_x2E3D ;печать дампа памяти в окне - db #02 - rst #30 - dw rom2_x2E76 ;удаление курсора на предыдущей ячейке дампа - db #02 - ld a,(ix+#01) ;координата X курсора в окне - sub #03 - ld (ix+#01),a - bit 7,(iy+#0E) - ret z ;редактируем hex дамп - -;АДРЕС: #237A смена поля редактирования hex <-> символы -x237A call x23C0 ;определение поля в окне редактирования дампа - ret c ;редактируем адрес дампа - ld hl,xE022 - jr nz,x238B -; установка координат для редактирования символьного представления дампа - set 7,(hl) - add a,#21 -x2387 ld (ix+#01),a - ret -; установка координат для редактирования hex дампа -x238B res 7,(hl) - add a,a - add a,c - add a,#08 - jr x2387 - -;АДРЕС: #2393 печать одной(текущей) строки дампа -x2393 ld c,#00 - call x23F3 ;hl - адрес текущей ячейки в дампе памяти - ld a,(ix+#01) ;crd X - push af - ld (ix+#01),#00 ;crd X =#00 - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #00 ;печать одной строки дампа памяти (8 байт) - pop af - ld (ix+#01),a ;восстановим координату X - ret - -;АДРЕС: #23A9 расчет приращения для скроллинга дампа -;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) -;вых: bc - приращение для скроллинга дампа -; d =#00/#FF - скроллим вперед/назад -; cy =1 скроллим назад -x23A9 xor a - ld b,(ix+#04) ;высота окна в знакоместах -x23AD add a,#08 - djnz x23AD - ld c,a ;bc - приращение для скроллинга дампа - ld d,#00 - ld a,e - or a - ret p ;e<#80 - dec d ;d=#FF - ld hl,#0000 - sbc hl,bc - ld c,l - ld b,h - ret - -;АДРЕС: #23C0 определение поля в окне редактирования дампа -;вых: cy =1 курсор в поле редактирования адреса дампа -; cy =0, z - курсор в поле редактирования hex дампа -; cy =0, nz - курсор в поле редактирования симвлов дампа -; c,a - номер байта в строке дампа -; hl - адрес текущей ячейки в дампе памяти -x23C0 ld a,(ix+#01) ;crd X - cp #06 - jr nc,x23CB ;это не адресное поле -; это адресное поле - sub #02 - scf - ret -x23CB cp #20 - jr nc,x23E5 -; это hex дамп - sub #08 ;(CrdX-8)/3 - push de - ld c,a - xor a - ld de,#0003 - rst #30 - dw rom2_x16AA ;деление bc=ac/de - db #02 ;l остаток от деления - pop de ;с - номер ячейки в строке дампа памяти - ld a,#01 - sub l ;a - смещение от начала строки до редактируемого разряда - call x23E8 - xor a - ld a,c - ret -;это символьное представление дампа -;вх: a - координата курсора -;вых: nz -x23E5 sub #21 - ld c,a -;установка адреса текущей редактируемой ячейки памяти -;вх: с - номер ячейки в строке дампа памяти -; a - смещение от начала строки до редактируемого разряда -x23E8 ld e,a - call x23F3 - ld (xDD69),hl ;адрес текущей редактируемой ячейки памяти - xor a - inc a - ld a,e - ret - -;АДРЕС: #23F3 расчет адреса текущей редактируемой ячейки памяти -;вх: с - номер ячейки в строке дампа памяти -;вых: hl - адрес текущей ячейки в дампе памяти -x23F3 ld a,(ix+#00) ;координата Y курсора в окне - rlca - rlca - rlca - add a,c - ld hl,(xDD87) ;адрес начала дампа памяти - jp x2023 ;сложение hl=hl+a - -;АДРЕС: #2400 чтение байта из памяти пользователя в bc -;вх: hl - адрес памяти пользователя -;вых: bc,a - прочитанный байт -x2400 ld a,#0A ;номер процедуры *2 (чтение байта из памяти пользователя) - call x202C ;вызов процедуры по таблице, адрес которой в (xE9E1) - ld c,a - ld b,#00 - ret - -;АДРЕС: #2409 редактирование числа в bc -;вх: bc - слово для редактирования -; a - смещение от начала строки до редактируемого разряда -; d - код нажатой клавиши -;вых: bc - отредактированный байт/слово -; nz - число не изменилось -x2409 sub #03 - neg - ld e,a - ld a,#04 ;кол-во разрядов в числе - jr x2414 - -;АДРЕС: #2412 редактирование байта в bc -;вх: bc - байт для редактирования -; e - смещение от конца строки до редактируемого разряда -; d - код нажатой клавиши -;вых: bc - отредактированный байт/слово -; nz - число не изменилось -x2412 ld a,#02 ;кол-во разрядов в числе -x2414 push hl - push de - ld hl,xE1A6 ;буфер для вывода строки - push de - ld de,#2310 ;шестнадцатиразрядное - call x0CDA ;печать числа bc в буфер hl - ld hl,(xE3BC) - ld (hl),#FF - dec hl ;адрес последнего символа - pop de - ld a,d - ld d,#00 - or a - sbc hl,de ;адрес разряда числа - ld (hl),a ;новое значение разряда - ld hl,xE1A6 - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - ld c,e ;результат преобразования - ld b,d - jr nz,x243A ;это не число - inc (hl) ;маркер конца строки -x243A pop de - pop hl - ret - -;АДРЕС: #243D чтение байта из памяти пользователя -;вх: hl - адрес в памяти -;вых: a - прочитанный байт -x243D rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - ret - -;АДРЕС: #2442 запись байта в память пользователя -;вх: hl - адрес в памяти -; a - байт для записи -x2442 rst #30 - dw rom2_x0000 ;запись байта в память пользователя (rst #00) - db #02 - ret - -;АДРЕС: #2447 печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начало дампа) -;вых: hl - следующий адрес памяти (начало дампа) -x2447 rst #30 - dw rom2_x2EBA ;печать одной строки дампа памяти (8 байт) - db #02 - ret - -;АДРЕС: #244C обновление окна с дизасмом памяти начиная с текущей ячейки -x244C bit 5,(iy+#0A) - ret nz ;не обновлять дизассемблер памяти по содержимому ячейки памяти - ld de,(xDD69) ;адрес текущей ячейки в дампе памяти - rst #30 - dw rom2_x2F74 ;вывод дисасма памяти по адресу в de - db #02 - rst #30 - dw rom2_x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - db #02 - ret - -;АДРЕС: #245E переименование подраздела -x245E ld a,#32 ;сообщение заголовка: rename partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем - ;hl - номер позиции в каталоге -x2463 ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr nz,x2471 ;подраздел существует -x246C call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2463 -x2471 ld a,(hl) - ld (xDFFE),a ;тип подраздела - call x2D2F ;ввод имени подраздела - jr c,x246C ;отмена ввода. продолжим выбор - jp x2D50 ;сортировка каталога и выход в меню - -;Не используется АДРЕС: #247D ret -x247D ret - -;АДРЕС: #247E печать нового пути после выбора пунктов меню mount/dismount DRIVE -;вх: a - номер дисковода -x247E and #03 -;печеть сообщения - push af - bit 7,(iy+#0B) - jr nz,x248D ;меню dismount - ld bc,#2B02 ;сообщение: mount on - rst #08 - jr x2491 -x248D ld bc,#2F02 ;сообщение: dismount - rst #08 -x2491 pop af - call x249C ;печать буквы дисковода или пути, если это образ - ld a,#26 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - ret - -;АДРЕС: #249C печать буквы дисковода или пути, если это образ -;вх: a - номер дисковода -x249C push af -;печать буквы дисковода - add a,"A" - rst #10 - pop af - rst #30 - dw rom7_x1B04 ;расчет адреса блока описателя заданного дисковода - db #07 - ld c,a ;код подраздела (для образа =#01) -;печать двоеточия - push af - ld a,":" - rst #10 - pop af - jr z,x24CD ;это реальная дискета -;это образ. печать пути - ld de,#0009 - add hl,de - ld de,xE7C7 ;строка пути к образу диска - push de - call x24DE ;копирование имени из (hl) в (de) - ld a,c - cp #01 - jr nz,x24C4 ;это не образ tr-dos - ld a,#5C ;"\" - ld (de),a - inc de - call x24DE -x24C4 ex de,hl - dec hl - set 7,(hl) - pop hl - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 -x24CD ret - -;АДРЕС: #24CE обработка пункта меню: Z. dismount.../Z. mount... -x24CE bit 7,(iy+#0B) - jr nz,x24D9 ;меню dismount - ld bc,#2D02 ;сообщение: dismount ... - rst #08 - ret -x24D9 ld bc,#3002 ;сообщение: mount ... ___ - rst #08 - ret - -;копирование имени из (hl) в (de) -;вх: b - смещение в имени подраздела -; hl - начало имени подраздела в блоке описателя дисковода -x24DE ld a,l - add a,b - ld l,a - jr nc,x24E4 - inc h -x24E4 ld b,#06 -x24E6 ld a,(hl) - cp #21 - ret c ;непечатный символ. выход - ld (de),a - inc hl - inc de - djnz x24E6 - ret - -;АДРЕС: #24F0 монтирование образа к дисководу -;вх: a - номер дисковода -x24F0 call x2536 ;монтирование/отключение подраздела/образа диска - ret c ;отмена выбора - ld c,#11 ;чтение кода спецификации дисковода - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 ;hl - адрес кода, определяющего тип текущего дисковода - bit 4,(hl) - jr nz,x2503 - ld hl,xFFDC - res 6,(hl) - -;АДРЕС: #2503 монтирование всех образов с винчестера -x2503 ld a,(xFFCA) - and #03 - ld e,a ;номер текущего дисковода - ld d,#03 -; для всех кроме текущего дисковода -x250B push de - ld a,d - cp e - call nz,x251A - pop de - ld a,d - or a - jr z,x2519 - dec d - jr x250B -x2519 ld a,e -; в конце и для текущего -;монтирование образа с обработкой неудачной попытки -x251A push af - or #80 - rst #30 - dw rom7_x18C0 ;R8DOS #28(40) автоподключение, т. е. подключить то, что задано в секторе автонастроек - db #07 - pop bc - ret nc ;прошло без ошибок -; были ошибки при монтировании образа - push af - ld a,b ;номер дисковода - push bc - or #40 - rst #30 - dw rom7_x18C0 ;R8DOS #28(40) отключить подраздел от драйвера - db #07 - pop bc - pop af - cp #67 - ret z ;нет примонтированнго подраздела/образа - ld a,b - set 7,(iy+#0B) - -;АДРЕС: #2536 монтирование/отключение подраздела/образа диска -;вх: a - номер дисковода -; 7,(iy+#0B) =0/1 mount/dismount -; -x2536 rst #30 - dw rom7_x1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 - db #07 - push hl ;адрес начала записи для заданного дисковода в буфере xE5A9 - ld b,#00 - bit 7,(iy+#0B) ;=0/1 mount/dismount - call z,x259D ;если да, печать списка разделов и выбор подраздела/образа - pop bc - ret c ;отмена выбора -; подраздел/образ выбран - push hl ;hl - адрес записи в каталоге - push bc - rst #30 - dw rom7_x1E3D ;чтение сектора 3(сектор с настройками) в буфер xE5A9 и проверка контрольной суммы - db #07 - jr nc,x2552 ;успешно - cp #63 ;ошибка контрольной суммы. настройки обнулены - jr nz,x2599 ;ошибки чтения -x2552 pop hl ;hl адрес строки с примонтированным образом в буфере (для заданного дисковода) - bit 7,(iy+#0B) ;=0/1 mount/dismount - res 7,(iy+#0B) - ld (hl),#00 - pop de ;de - адрес записи в каталоге - jr nz,x2592 ;dismount -;формирование записи о примонтированном подразделе/образе - ld a,(de) - push de - ld (hl),a ;+#00 тип раздела/образа - inc hl - ex de,hl - ld bc,#0001 - add hl,bc - ld bc,#0004 - ldir ;+#01 смещение первого сектора от начала винчестера (LBA адрес) - ld (de),a ;+#05 тип раздела/образа - and #DF ;сброс бита защиты от записи - inc de - pop hl ;hl - адрес записи в каталоге - push hl - ld bc,#0006 - add hl,bc - ld bc,#0004 - ldir ;+#06 размер подраздела/образа - cp #01 - jr z,x2588 ;это образ диска - pop hl ;hl - адрес записи в каталоге - push hl - call x25E1 ;+#0A имя подраздела - jr x258E -; это образ диска -x2588 ld hl,xE81B+#0A - call x25E5 ;+#0A имя подраздела, которому принадлежит образ -x258E pop hl ;hl - адрес записи в каталоге - call x25E1 ;+#0A имя подраздела/образа -x2592 rst #30 - dw rom7_x1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер - db #07 - ret nc ;ошибок нет - jr x25D1 ;ошибка записи -;ошибка чтения/записи винчестера -x2599 pop bc - pop hl - jr x25D1 - -;печать списка разделов и выбор подраздела/образа -;вых: cy =1 отмена выбора -; =0 образ/раздел выбран -; hl - адрес записи в каталоге -; (xE81B) заголовок выбранного подраздела/образа -x259D call x2620 ;формирование в буфере xEBF5 списка подразделов MFS - ld bc,(xDD89) ;количество подразделов - ld a,c - or b - jp z,x0EB5 ;подразделов нет. печать текущего меню монитора - ld a,#1E - call x29D7 ;печать окна с подразделами и выбор подраздела в нем -x25AE ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,(hl) - and #DF - cp #01 - jr z,x25C4 ;подраздел TR-DOS - cp #02 - ret z ;MicroDOS - cp #03 - ret z ;IS-DOS - call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x25AE -;выбран подраздел TR-DOS -x25C4 ld de,xE81B ;копируем запись подраздела - ld bc,#0010 - ldir - call x25EB ;формирование в буфере xEBF5 списка образов коллекции - jr nc,x25D6 ;сформировано без ошибок -; ошибки винчестера -x25D1 rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -x25D6 ld a,#1F ;сообщение: select disk - call x29D0 ;печать окна с образами дисков и выбор образа в нем - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - or a - ret -;копирование 6 байт из (hl+#0A) в (de) -x25E1 ld bc,#000A - add hl,bc -;копирование 6 байт из (hl) в (de) -x25E5 ld bc,#0006 - ldir - ret - -;АДРЕС: #25EB формирование в буфере xEBF5 списка образов коллекции -; (xE81B) заголовок выбранного подраздела -x25EB call x2707 ;dehl - смещение(LBA адрес) первого сектора подраздела - rst #30 - dw rom7_x17BB ;чтение в буфер xEBF5 каталог выбранного подраздела - db #07 - ret c ;ошибка -;проверка наличия сигнатуры - ld hl,(xEBF5+#3FC) ;сигнатура подраздела - ld de,#5254 - sbc hl,de - jr z,x2601 ;сигнатура совпадает - ld a,#63 - scf - ret -x2601 push ix - call x2671 ;сортировка записей в буфере по порядку местоположения - ;ix=xEBF5 - call x2707 ;dehl - смещение первого сектора выбранного подраздела - call x2683 ;проверка разрывов между образами и создание пустых записей в буфере - call x2707 ;dehl - смещение первого сектора выбранного подраздела - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ;de=xE9E7 - ld bc,#0006 - jr x2661 ;формирование последней unused записи в буфере - -;АДРЕС: #261A удаление всех подразделов -x261A set 6,(iy+#1C) ;признак изменения каталога - jr x2647 - -;АДРЕС: #2620 формирование в буфере xEBF5 списка подразделов MFS -x2620 res 6,(iy+#1C) - rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x262F ;раздел найден -x262A rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -x262F push hl ;dehl - смещение первого сектора раздела - push de ;bc - адрес дескриптора раздела MFS в буфере - ld l,c - ld h,b - ld de,xE81B - ld bc,#0010 - ldir - pop de - pop hl - rst #30 - dw rom7_x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS - db #07 - jr nc,x264A ;нет ошибок - cp #63 ;раздел не инициализирован - jr nz,x262A ;ошибка чтения -x2647 call x2E71 ;очистка буфера xEBF5 и установка сигнатуры раздела MFS -x264A push ix - call x2671 ;сортировка подразделов в буфере xEBF5 по порядку местоположения - ;ix=xEBF5, bc - количество подразделов в буфере - call x270D ;загрузка числа в dehl из памяти xE81B+8 - call x2683 ;проверка разрывов между подразделами/образами и создание пустых записей в буфере - call x270D ;загрузка числа в dehl из памяти xE81B+8 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ;de=xE9E7 - ld bc,#000C -; формирование последней unused записи в буфере -x2661 ld hl,xE81B - add hl,bc ;адрес количества секторов раздела MFS - ex de,hl - push hl - call x3052 ;(xE9E7) - адрес первого свободного сектора после раздела MFS - pop hl - call x26AC ;проверка конца раздела MFS на наличие пустого места - pop ix - ret - -;АДРЕС: #2671 сортировка записей в буфере xEBF5 по порядку местоположения -;вых: ix,xEBF5 -; bc - количество записей в буфере -x2671 call x271A ;подсчет количества записей - ld hl,x28B9 ;по порядку местоположения - call x2960 ;сортировка дескрипторов записей - ld ix,xEBF5 - ld bc,(xDD89) ;количество записей в буфере - ret - -;АДРЕС: #2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере -;вх: ix=xEBF5 - адрес буфера с каталогом подразделов/образов -; bc - количество подразделов/образов -; dehl - смещение первого сектора MFS раздела (LBA адрес) -x2683 ld (xE9EB),hl - ld (xE9EB+#02),de - push bc - ld hl,xE9EB - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl - pop bc -x2695 ld a,c - or b - ret z ;нет записей - dec bc ;номер последней записи - push bc - push ix - pop hl ;адрес смещения первой записи в буфере - ld bc,#0001 - add hl,bc ;адрес с LBA адресом первой записи в буфере - call x26AC ;проверка разрыва между подразделами/образами и создание пустой записи в буфере - ld bc,#0010 - add ix,bc ;адрес следующей записи в буфере - pop bc - jr x2695 ;повторим - -;АДРЕС: #26AC проверка разрыва между подразделами/образами и создание пустой записи в буфере -;вх: ix=xEBF5 - адрес записи в буфере с каталогом подразделов/образов -; hl - адрес с LBA адресом подраздела/образа (LBA адрес) -; (xE9EB) - расчетный адрес начала этого подраздела/образа (LBA адрес) -;вых: (xE9EB) - расчетный адрес начала следующего подраздела/образа (LBA адрес) -; -x26AC push hl - ld de,xE9EB ;смещение первого сектора MFS раздела (LBA адрес) +2 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl - jr z,x26F8 ;они равны -;есть пустое место. формируем запись unused в буфере - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - ld de,xE9EB - push hl - call x3035 ;вычитание (hl)=(hl)-(de) - pop hl ;(xE9E7) размер пустого пространства - ld de,rom7_x0F59 ;=#00000200 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - jp c,x26F8 ;менее 256Kb - call x2990 ;вставляем новую запись в список записей - push ix - pop hl -; устанавливаем смещение первого сектора новой записи - push hl - ld bc,#0001 - add hl,bc ;адрес смещения первого сектора новой записи - ld de,xE9EB - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - pop hl -; устанавливаем размер новой записи - ld bc,#0006 - add hl,bc ;адрес размера новой записи - ld de,xE9E7 - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - ld (ix+0),#FF ;помечаем как unused - call x26F8 ;расчет адреса начала следующего подраздела/образа (LBA адрес) - ld bc,#0010 - add ix,bc ;двигаем указатель на сдвинутую запись -;расчет адреса начала следующего подраздела/образа (LBA адрес) -x26F8 push ix - pop hl - ld bc,#0006 - add hl,bc ;адрес с размером подраздела/образа - ex de,hl - ld hl,xE9EB - call x3052 ;сложение двух 4х байтных чисел - ret - -;АДРЕС: #2707 загрузка числа в регистры из памяти xE81B+1 -x2707 push bc - ld bc,#0001 - jr x2711 - -;АДРЕС: #270D загрузка числа в регистры из памяти xE81B+8 -x270D push bc - ld bc,#0008 -x2711 ld hl,xE81B - add hl,bc - call x300E ;загрузка числа в регистры из памяти - pop bc - ret - -;АДРЕС: #271A подсчет количества подразделов в MFS -;вых: (xDD89),bc - количество подразделов в разделе MFS -x271A ld hl,xEBF5 - ld e,#10 - xor a - ld d,a - ld b,a - ld c,a -x2723 ld a,(hl) - cp b - jr z,x272E - inc c - add hl,de - ld a,c - cp #3F - jr c,x2723 -x272E ld (xDD89),bc - ret - -;АДРЕС: #2733 удаление всех разделов MBR -x2733 set 6,(iy+#1C) - jr x275F - -;АДРЕС: #2739 формирование в буфере xEBF5 списка разделов MBR -x2739 res 6,(iy+#1C) - set 7,(iy+#1C) - rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x2762 ;раздел найден - res 7,(iy+#1C) - cp #63 - jr z,x2754 ;раздел не найден - rst #30 ;ошибка чтения диска - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -;раздел MFS не найден. проверяем наличие MBR -x2754 ld hl,(xE5A9+#1FE) ;сигнатура сектора MBR - ld de,#AA55 - or a - sbc hl,de - jr z,x2762 ;сигнатура есть -x275F call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 -;ищем записи в MBR и копируем их в буфер xEBF5 -x2762 ld de,xEBF5 ;сюда сложим существующие записи в MBR - push ix - ld bc,#0400 - ld ix,xE5A9+#1BE ;начало записей в MBR -x276E push bc - xor a - or (ix+4) ;код типа раздела - ld a,c - ld bc,#0010 - jr z,x2781 ;пустая запись - inc a ;+1 найденная запись - push ix - pop hl - push bc - ldir ;копируем в буфер xEBF5 - pop bc -x2781 add ix,bc ;адрес следующей записи в MBR - pop bc - ld c,a ;количество найденных записей - djnz x276E - ld (xDD89),bc ;количество найденных записей - pop ix -;проверка разрывов между разделами и создание пустых записей в буфере -x278D ld hl,x2895 - call x2960 ;сортировка записей MBR по адресу расположения - push ix - ld ix,xEBF5 ;буфер с записями MBR - ld bc,(xDD89) ;количество записей - call x2FCF ;обнуление переменной xE9EB - ld a,(xDFF5) ;значение sector HDD - ld (xE9EB),a ;раздел может начинаться только с начала дорожки - ld a,c - or b - jr z,x27C2 ;нет записей в MBR -x27AA ld a,c - or b - jr z,x27C2 ;больше нет записей MBR для обработки - dec bc - push bc - push ix - pop hl ;адрес начала записи MBR в буфере xEBF5 - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора записи MBR - call x27E1 ;проверка разрывов между разделами и создание - ;пустой записи в буфере - ld bc,#0010 - add ix,bc - pop bc - jr x27AA ;проврека следующей записи MBR -;буфер с записями построен -x27C2 ld hl,(xE5A5) - ld de,#0000 ;head * sector активного HDD - exx - ld bc,(xDFF2) ;значение Cylinders HDD - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ex de,hl ;hl=xE9E7 (адрес последнего сектора в CHS) - call x302A ;декремент (hl)=(hl)-1 - call x27E1 - pop ix - ret - -;проверка разрывов между разделами и создание пустой записи в буфере -;вх: ix адрес начала записи MBR в буфере xEBF5 -; hl - адрес смещения первого сектора записи MBR -; (xE9EB) первый свободный сектор -;вых: (xE9EB) новый первый свободный сектор -; ix - адрес следующей записи -x27E1 push hl - ld de,xE9EB - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl - jr z,x282C ;нет пропущенных секторов -; вычисляем количество незанятых секторов - ld de,xE9E7 ;переменная - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - ld de,xE9EB - push hl - call x3035 ;вычитание (hl)=(hl)-(de) - pop hl ;(xE9E7) - количество незанятых секторов - ld de,rom7_x0F55 ;это адрес в rom 7 содержит dd #800 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - jp c,x282C ;меньше мегабайта. неучитываем -; создаем новую запись с количеством незанятых секторов - call x2990 ;вставляем новую запись в список записей - push ix - pop hl - push hl ;адрес новой записи - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора новой записи - ld de,xE9EB - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - pop hl ;адрес новой записи - ld bc,#000C - add hl,bc ;адрес количества секторов раздела - ld de,xE9E7 ;количество незанятых секторов - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - call x283B ;установка остальных параметров в новой записи - call x282C ;(xE9EB) новый первый свободный сектор - ld bc,#0010 - add ix,bc ;следующая запись -;расчет нового первого свободного сектора -x282C push ix - pop hl - ld bc,#000C - add hl,bc ;адрес количества секторов раздела - ex de,hl - ld hl,xE9EB - call x3052 ;сложение двух 4х байтных чисел - ret -;установка остальных параметров в новой записи -;вх: ix - адрес новой записи -x283B ld (ix+#00),#FF ;тип unused - ld (ix+#04),#53 ;код типа раздела (MFS) - push ix - pop hl - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора новой записи - push hl - push ix - pop bc - inc bc ;адрес структуры описания раздела MBR +1 - call x2874 ;расчет и установка в структуре записи MBR параметров CHS - pop hl ;адрес смещения первого сектора новой записи -; расчет количества секторов новой записи - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - push hl - inc de - inc de - inc de - inc de ;адрес количества секторов новой записи - call x3052 ;сложение двух 4х байтных чисел - pop hl - push hl - call x302A ;декремент (hl)=(hl)-1 -; установка конца раздела в CHS - push ix - pop hl - ld bc,#0005 - add hl,bc ;конец раздела - головка - ld c,l - ld b,h - pop hl - ld hl,xE9E7 -;расчет и установка в структуре записи MBR параметров CHS -;вх: bc - адрес структуры описания раздела MBR +1 -; hl - адрес смещения первого сектора новой записи -x2874 push bc - call x300E ;загрузка числа в регистры из памяти - ;dehl - смещение первого сектора новой записи - rst #30 - dw rom7_x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - db #07 - pop hl ;начало раздела - головка - ld a,(iy+#35) - and #0F - ld (hl),a ;головка - inc hl - ld a,(iy+#34) - and #03 - rlca - rlca ;цилиндр (биты 6, 7) - or (iy+#32) ;сектор (биты 0-5) - ld (hl),a - inc hl - ld a,(iy+#33) - ld (hl),a ;цилиндр (старшие биты 8, 9 хранятся в байте номера сектора) - ret - -;АДРЕС: #2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) -;вх: bc - номер подраздела -x2895 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5+#08 ;буфер с секторами раздела +8 - add hl,bc - ex de,hl - ld hl,xEBF5+#18 ;#EC0D - -;сортировка двух дескрипторов по возрастанию заданного поля -;вх: hl - адрес ячейки второго подраздела с полем для сортировки -; bc - смещение до дескриптора подраздела в буфере -; de - адрес ячейки подраздела с полем для сортировки -;вых: cy=0 обмена не было -; cy=1 дескрипторы поменяны местами -x28A0 add hl,bc ;адрес ячейки со смещением до начала последнего подраздела - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - ret nc ;расположены по возрастанию - ld hl,xEBF5 ;обмен местами дескриторов - add hl,bc - ex de,hl - ld hl,xEBF5+#10 - add hl,bc - ld b,#10 -x28B0 ld a,(de) - ld c,(hl) - ld (hl),a - ld a,c - ld (de),a - djnz x28B0 - scf - ret - -;АДРЕС: #28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения -;вх: bc - номер подраздела -x28B9 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5+#01 ;буфер с секторами раздела +1 - add hl,bc ;адрес ячейки со смещением до начала подраздела - ex de,hl ; - ld hl,xEBF5+#11 ;адрес ячейки со смещением до начала второго подраздела - jr x28A0 ;сортировка по возрастанию местоположения двух дескрипторов - -;АДРЕС: #28C6 уплотнение каталога MBR (удаление в буфере записей unused) -;вх: hl=x2D5D п/п сравнения (hl) с #FF, cy=1 если равны -; -x28C6 ld (xE51C+1),hl - ld bc,(xDD89) ;количество записей в буфере каталога - call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 ;буфер - push hl - push hl - add hl,bc ;конец каталога - ld (xE9E7),hl ;адрес конца каталога - pop hl - ld bc,#0000 -x28DD ex de,hl - ld hl,(xDD89) ;количество записей в буфере каталога - scf ;тут счетчик записей в каталоге - sbc hl,bc ; - inc bc ; - ex de,hl ;hl адрес обрабатываемой записи в каталоге - jr c,x2914 ;нет больше записей - call xE51C ;сравним с #FF - jr nc,x290E ;не равны, следующая запись - push hl ;адрес текущей записи - ex de,hl - ld hl,(xE9E7) - or a - sbc hl,de ;размер необработанного каталога - jr z,x290D ;просмотрели весь каталог - push bc - push hl - ld bc,#0010 ;убираем из каталога запись unused - or a ;и уплотняем каталог - sbc hl,bc - add hl,de - ld (xE9E7),hl ;новый адрес конца каталога, после уплотнения - ld l,e - ld h,d - add hl,bc ;адрес следующей записи - pop bc - ldir ;уплотняем - pop bc - pop hl - jr x28DD ;следущая запись -;конец каталога -x290D pop hl ;адрес конца каталога -;следущая запись -x290E ld de,#0010 - add hl,de - jr x28DD -;завершили уплотнение -;hl адрес конца каталога -x2914 pop de ;de адрес первой записи в каталоге - xor a - sbc hl,de - push hl - ld b,#04 -x291B srl h - rr l - djnz x291B ;hl=hl/#10 - ld (xDD89),hl ;количество записей - pop hl - add hl,de - ld (hl),a - ret - -;АДРЕС: #2928 подсчет количества разделов/подразделов в каталоге -;вых: de - фактическое количество разделов/подразделов в каталоге -x2928 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны - call x2939 ;de - количество пустых записей в каталоге разделов/подразделов - ld hl,(xDD89) ;количество разделов/подразделов в каталоге - or a - sbc hl,de - ex de,hl - ret - -;АДРЕС: #2936 подсчет пустых записей в каталоге разделов/подразделов -;вых: de - количество пустых записей в каталоге разделов/подразделов -x2936 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны -x2939 ld (xE51C+#01),hl - ld hl,xEBF5 ;каталог разделов/подразделов - ld de,(xDD89) ;количество разделов/подразделов - ld a,e - or d - ret z ;a=#00 нет разделов/подразделов - push bc - ld c,e - ld b,d ;bc количество разделов/подразделов в каталоге - ld de,#0000 ;количество пустых записей в каталоге -x294C dec bc - call xE51C - jr c,x2953 ;запись о разделе/подразделе не пустая - inc de -x2953 ld a,c - or b - jr z,x295E - ld a,#10 ;следующая запись - call x2023 ;сложение hl=hl+a - jr x294C -x295E pop bc - ret - -;АДРЕС: #2960 сортировка дескрипторов подразделов -;вх: hl=x28B9 - по порядку местоположения на винчестере -; hl=x2895 - по адресу расположения (для записей MBR) -x2960 ld (xE51C+1),hl - ld bc,(xDD89) ;количество подразделов - ld a,c - or b - ret z ;подразделы отсутствуют - ld hl,#0001 - sbc hl,bc - ret z ;подраздел только 1 -x2970 xor a - ld r,a - ld bc,(xDD89) ;количество подразделов - dec bc -x2978 push bc - dec bc - call xE51C ;п/п сортировки - jr nc,x2983 ;обмена не было - ld a,#FF - ld r,a ;7,r =1 был зотя бы один обмен -x2983 pop bc - dec bc - ld a,c - or b - jr nz,x2978 ;следующая пара дескрипторов - ld a,r - bit 7,a - jr nz,x2970 ;будем повторять, пока сортировка не закончится - ret - -;АДРЕС: #2990 вставляем новую запись в список записей -;вх: ix адрес начала записи в буфере =xEBF5, с которой надо раздвинуть список -; (xDD89) - количестов записей -x2990 ld bc,(xDD89) ;количество записей (оно же номер первой свободной) - call x2FEF ;умножение bc=bc*#10 - call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 - ld hl,xEBF5 ;буфер с записями - add hl,bc ;адрес новой записи в конце списка - push ix - pop de ;адрес текущей записи - or a - sbc hl,de - ret c ;ошибка - push hl ;на сколько байт сдвинуть - push ix - pop hl ;адрес текущей записи - ld bc,#0010 - ld e,l - ld d,h ;адрес текущей записи - add hl,bc ;куда сдвигаем - ex de,hl - pop bc ;на сколько байт сдвинуть - ld a,c - or b - ret z - push hl - sbc hl,de ;направление переноса - pop hl - jr c,x29BD - ldir - ret -x29BD dec bc - add hl,bc - ex de,hl - add hl,bc - ex de,hl - inc bc - lddr - ret - -;АДРЕС: #29C6 расчет адреса в каталоге -;вх: hl - номер записи в каталоге -;вых: hl - адрес записи в каталоге -x29C6 ld c,l - ld b,h - call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 - add hl,bc - ret - -;АДРЕС: #29D0 печать окна с образами дисков и выбор образа в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D0 ld hl,x2A0A - jr x29E1 - -;АДРЕС: #29D5 печать окна local partition information и выбор записи в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D5 ld a,#16 ;сообщение заголовка: partition information - -;АДРЕС: #29D7 печать окна с подразделами и выбор подраздела в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D7 ld hl,x2A04 ;таблица со списком процедур для печати окна выбора раздела - jr x29E1 - -;АДРЕС: #29DC печать окна global partition information и выбор записи в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29DC ld a,#16 ;сообщение заголовка: partition information -x29DE ld hl,x29FE ;таблица со списком процедур для печати окна partition information -x29E1 ld (iy-#08),a ;номер сообщения текущей опции - call x2BB8 ;подготовка к печати окна выбора раздела - ld (xE9E1),hl ;адрес списка процедур - call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 - call x1EF1 ;печать каталога и выбор позиции в нем - call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 - ret - -;АДРЕС: #29F4 выбран некорректный раздел. продолжаем выбор -x29F4 call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 - call x1F04 ;продолжаем выбор - call x2FDB ;инкремнт слова (xDD89)=(xDD89)+1 - ret - -;таблица со списком процедур для печати окна global partition information -x29FE dw x2A77 ;печать одного имени из каталога разделов MBR - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: partition information - -;таблица со списком процедур для печати окна выбора раздела -x2A04 dw x2A33 ;печать одного имени из каталога подразделов - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: _select local partition_ - -;#2A0A таблица со списком процедур для печати окна выбора образа диска -x2A0A dw x2A1D ;печать одного имени из каталога образов дисков - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: select disk - -;заголовок: _select local partition _ -x2A10 rst #20 - dc " " - ld b,(iy-#08) ;номер сообщения в блоке - ld c,#02 ;номер блока сообщений - rst #08 ;select local partition - ret -;получение номера последней записи в каталоге разделов/подразделов/образов -x2A19 ld hl,(xDD89) - ret - -;печать одного имени из каталога образов дисков -x2A1D call x2B05 ;проверка первого байта записи каталога на #FF - jr nz,x2A27 ;печать имени - call x2B12 ;печать сообщения: Unused - jr x2A6C ;печать размера -x2A27 rst #20 - dc "Disk Name" - jr x2A59 ;продолжение печати имени диска - -;печать одного имени из каталога подразделов -x2A33 call x2B05 ;проверка первого байта записи каталога подраздела на #FF - jr nz,x2A3D ;<>#FF -x2A38 call x2B12 ;печать сообщения: Unused - jr x2A6C -x2A3D bit 7,(hl) - ld a," " - jr z,x2A45 - ld a,"*" -x2A45 rst #10 ;печать символа из A - - push hl ;печать типа подраздела - ld a,(hl) - and #07 - ld hl,x2B71 ;список сообщений - call x2B8C ;поиск и печать сообщения из HL по типу в A - jr nc,x2A6B ;тип раздела не опознан - ld a,#0A - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - pop hl -x2A59 ld a,":" ;разделитель - rst #10 - - push hl ;печать имени подраздела - ld bc,#000A - add hl,bc - xor a - cp (hl) - jr z,x2A6B ;нет имени - ld b,#06 - rst #30 ;печать имени подраздела - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 -x2A6B pop hl -x2A6C ld a,#13 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - call x3005 ;dehl = размер подраздела - jr x2A97 ;печать размера подраздела - -;печать одного имени из каталога разделов MBR -x2A77 call x2B03 ;проверка первого байта записи каталога подраздела на #FF - jr nz,x2A81 ;есть запись - call x2B12 ;печать сообщения: Unused - jr x2A8E ; -; печать типа раздела MBR -x2A81 push hl ;номер записи - ld bc,#0004 - add hl,bc - ld a,(hl) ;код типа раздела - ld hl,x2B1A ;таблица с сообщениями типов разделов - call x2B8C ;поиск и печать сообщения из HL по типу в A - pop hl -; печать размера раздела -x2A8E ld a,#13 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - call x300A ;dehl - чоличество секторов раздела MBR - -;печать размера в мегабайтах -;dehl - размер подраздела -x2A97 ld a,e - or d - jr nz,x2AA4 ;мегабайты - ld bc,#0800 - push hl - sbc hl,bc - pop hl - jr c,x2AB2 ;килобайты - -;АДРЕС: #2AA4 преобразование количества секторов в мегабайты -x2AA4 call x2AC0 ;преобразование количества секторов в мегабайты - ld a,#04 - rst #30 - dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - db #02 - rst #20 - dc " MB" - ret -x2AB2 call x2ACC ;преобразование количества секторов в килобайты - ld a,#04 - rst #30 - dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - db #02 - rst #20 - dc " KB" - ret - -;АДРЕС: #2AC0 преобразование количества секторов в мегабайты -;вх: dehl - размер в секторах -;вых: bc - размер в мегабайтах -x2AC0 exx - ld bc,#800 - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx -x2AC9 ld c,l - ld b,h - ret - -;АДРЕС: #2ACC преобразование количества секторов в килобайты -;вх: dehl - размер в секторах -;вых: bc - размер в килобайтах -x2ACC exx - ld bc,#0002 - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx - ld a,e - or d - jr nz,x2AE2 ;более 16 bit - push hl - ld bc,#8000 - sbc hl,bc - pop hl - jr c,x2AC9 ;менее #8000 -x2AE2 ld hl,#7FFF ;результат более #7FFF - jr x2AC9 - -;АДРЕС: #2AE7 умножение dehl=de*#800 -;вх: de - число -;вых: dehl - результат -x2AE7 ld l,e - ld h,d - ld de,#0000 - exx - ld bc,#0800 - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ret - -;АДРЕС: #2AF5 умножение dehl=de*2 -;вх: de - число -;вых: dehl - значение -x2AF5 ld l,e - ld h,d - ld de,#0000 - exx -x2AFB ld bc,#0002 - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ret - -;АДРЕС: #2B03 проверка первого байта записи каталога подраздела на #FF -;вх: hl - номер записи в каталоге -;вых: z - первый байт =#FF -x2B03 rst #20 - dc " " - -;АДРЕС: #2B05 проверка первого байта записи каталога подраздела на #FF -;вх: hl - номер записи в каталоге -;вых: z - первый байт =#FF -x2B05 push hl - pop bc -x2B07 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 - add hl,bc - ld a,(hl) - cp #FF - ret - -;АДРЕС: #2B12 печать сообщения: Unused -x2B12 rst #20 - dc "Unused" - ret - -;таблица с названиями разделов MBR -x2B1A db #00 - dc "Unknown DOS" - db #01 - dc "MS-DOS 12FAT" - db #04 - dc "MS-DOS 16FAT" - db #05 - dc "MS-DOS Ext" - db #06 - dc "MS-DOS 3.31+" - db #07 - dc "OS/2 HPFS" - db #0A - dc "OS/2 Boot" - dc "SMFS" - db #FF - -;таблица с названиями разделов MFS -x2B71 db #01 - dc "TR-DOS" - db #02 - dc "MicroDOS" - db #03 - dc "IsDOS" - db #04 - dc "BAD" - db #FF - -;АДРЕС: x2B8C поиск и печать сообщения из HL по типу в A -;вх: hl - список сообщений -; a - тип сообщения -;вых: cy=1 напечатано -; cy=0 сообщение не найдено -x2B8C call x2B9A ;поиск и печать сообщения из HL по типу в A - ret c ;напечатано - rst #20 ;печать сообщения "Unknown" - dc "Unknown" - or a - ret -;поиск и печать сообщения из HL по типу в A -;cy=1 напечатано -;cy=0 сообщение не найдено -x2B9A ld c,a -x2B9B ld a,(hl) - cp #FF - ret z ;конец списка - ld a,c - cp (hl) - inc hl - jr z,x2BAC ;сообщние найдено -x2BA4 ld a,(hl) ;ищем конец сообщения - and #80 - inc hl - jr z,x2BA4 - jr x2B9B -;печать сообщения из hl -;cy=1 напечатано -x2BAC ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x2BAC ;еще не конец сообщения - scf - ret - -;АДРЕС: #2BB8 подготовка к печати окна выбора раздела -x2BB8 push hl - call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) - ld hl,#0506 ;координаты окна - ld de,#1C15 ;ширина окна в знакоместах и символах - call x2133 ;коррекция координат и размеров окна - call x0D02 ;очистка нижней строки окна меню - pop hl - ret - -;АДРЕС: #2BCA создание раздела MFS -x2BCA ld a,#19 ;заголовок окна: create partition ... - call x29DE ;печать окна global partition information и выбор записи в нем - ;hl - номер записи в каталоге -x2BCF ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr z,x2BDD ;выбрано незанятое место -x2BD8 call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2BCF -;назанятая область выбрана. создаем раздел MFS (все незанятые области в буфере -; уже помечены признаком раздела MFS) -x2BDD ld a,#07 -x2BDF push hl - push af - call x300A ;загрузка числа в регистры из памяти +12 байт к адресу hl - call x2AC0 ;преобразование количества секторов в мегабайты - pop af ;bc - размер в мегабайтах - ld hl,#0813 - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl - jr c,x2BD8 ;отмена ввода числа - ld a,e - or d - jr z,x2BD8 ;введен ноль - push hl - call x2AE7 ;умножение dehl=de*#800 - ld bc,xE9E7 ;dehl размер создаваемого раздела в секторах - call x301C ;загрузка числа из регистров в память - pop hl - push hl - ld bc,#000C - add hl,bc ;размер раздела MBR в записи в каталоге - call x2FCA ;сравнение со сободным местом - pop hl - ld a,#0C - jr c,x2BDF ;слишком большой раздел хотим создать - ld (hl),#00 ;признак наличия раздела +0 в записи - ld bc,#000C ;заносим в запись в каталоге размера раздела - add hl,bc - ld de,xE9E7 ;размер создаваемого раздела - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - jr x2C2A ;проверка разрывов между разделами и создание пустых записей в буфере - -;АДРЕС: #2C1F удаление раздела MBR -x2C1F ld a,#18 ;сообщение заголовка: delete partition ... - call x29DE ;печать окна global partition information и выбор записи в нем - ;hl - номер записи в каталоге - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ;hl - адрес записи в каталоге - ld (hl),#FF ;помечаем как пустую запись -;проверка разрывов между разделами и создание пустых записей в буфере -x2C2A set 6,(iy+#1C) - ld hl,x2D5D ;!!!это лишняя команда - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - jp x278D ;проверка разрывов между разделами и создание пустых записей в буфере - -;АДРЕС: #2C37 создание подраздела -x2C37 ld a,#19 ;сообщение заголовка: create partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем -x2C3C ret c ;ошибка - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr z,x2C4A ;эта запись пустая -x2C45 call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2C3C -;создаем подраздел -x2C4A push hl ;адрес начала записи в каталоге - ld hl,#0A01 - ld de,#2B71 - call x2F10 ;выбор типа подраздела - call x205A ;установка текущим окна: вывод каталога - pop hl ;адрес начала записи в каталоге - jr c,x2C45 ;отмена выбора типа подраздела. продолжаем выбор - ld (xDFFE),a ;код типа подраздела - call x2D2F ;ввод имени подраздела - jr c,x2C45 ;отмена ввода - ld a,#07 -x2C64 ld c,a - ld a,(xDFFE) ;код типа подраздела - cp #01 - ld a,c - jr z,x2CEB ;ввод размера подраздела TR-DOS в образах -;ввод числа. размер подраздела в килобайтах - push hl - push af - call x3005 ;dehl - размер подраздела в секторах - call x2ACC ;преобразование количества секторов в килобайты - pop af ;bc - размер в килобайтах - ld hl,#0812 ;параметры окна ввода - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl ;адрес начала записи в каталоге - jr c,x2C45 ;отмена ввода числа - ld a,e ;de - введенное число - or d - ld a,#0C - jr z,x2C64 ;ввели ноль. повторим ввод -;проверка числа - push hl - call x2AF5 ;умножение dehl=de*2 -x2C8C push de - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - pop bc ;de=xE9E7 - ld a,c - or b - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr nz,x2C64 ;нельзя создать подраздел более 32Mb. повторим ввод -;проверка свободного места под заданный размер - push hl - ld bc,#0006 - add hl,bc ;адрес начала записи в каталоге+6 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr c,x2C64 ;нет места под такой раздел. повторим ввод -;проверка минимально допустимого размера подраздела - push hl - ld hl,xE9E7 ;введенное число - ld de,rom7_x0F59 ;=#00000200 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr c,x2C64 ;слишком маленький. продолжим ввод - ld a,(xDFFE) ;код типа подраздела - ld (hl),a - push hl - ld bc,#0006 - add hl,bc - ld de,xE9E7 ;введенное число - ex de,hl - call x3000 ;запишем в дескриптор подраздела размер - pop hl ;адрес начала записи в каталоге - ld a,(hl) - cp #01 - jr nz,x2CE8 ;это не TR-DOS подраздел -;создаем коллекцию образов - push hl ;адрес начала записи в каталоге - ld de,xE8A9 - ld bc,#0010 - ldir ;скопируем дескриптор подраздела - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - pop hl ;адрес начала записи в каталоге - jp nz,x2CE6 ;отказ от сохранения - call x2FB1 ;запись каталога MFS - call x2D63 ;формирование коллекции образов в подразделе TR-DOS - jp x09E5 ;чтение каталога подразделов - -x2CE6 ld (hl),#FF ;помечаем подраздел как удаленный -x2CE8 jp x2D50 ;сортировка каталога и выход в меню -;ввод размера подраздела TR-DOS в образах -;hl - адрес дескриптора подраздела -x2CEB push hl - push af - call x2E30 ;расчет максимального количества образов исходя из размеров подраздела - ld a,c - or a - jr z,x2D2A ;нет образов. продолжаем выбор - pop af - ld hl,#0812 - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl - jp c,x2C45 ;отмена ввода. продолжаем выбор - ld a,e - or d - ld a,#0C - jp z,x2C64 ;ноль образов нель создать. продолжаем ввод -; расчет размера подраздела исходя из кол-ва образов - push hl ;адрес дескриптора подраздела - ld l,e - ld h,d - ld de,#0000 - exx - ld bc,#0501 ;размер образа в секторах - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память (de=xE9E7) - ex de,hl - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl +2 сектора на каталог - call x300E ;загрузка числа в регистры из памяти - ;dehl - размер подраздела в секторах - jp x2C8C ;формирование подраздела -x2D2A pop af - pop hl - jp x2C45 ;нет образов. продолжаем выбор - -;АДРЕС: #2D2F ввод имени подраздела -;вх: hl - адрес начала записи в каталоге -;вых: cy=1 отмкна ввода -x2D2F ld a,#09 -x2D31 push hl - ld hl,#070B - call x2E85 ;ввод имени подраздела - call x205A ;установка текущим окна: вывод каталога - pop hl - ret c ;отмена ввода - call x2EA7 ;проверка введенного имени - ld a,#65 - jr c,x2D31 ;имя некорректно, повторим ввод - ret - -;АДРЕС: #2D45 удаление подраздела -x2D45 ld a,#18 ;сообщение заголовка:delete partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем - ;hl - номер позиции в каталоге - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld (hl),#FF - -x2D50 set 6,(iy+#1C) ;признак изменения каталога подразделов - ld hl,x2D5D - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - jp x264A ;сортировка каталога и выход в меню - -;АДРЕС: #2D5D сравнение (hl) с #FF, cy=1 если равны -x2D5D ld a,#FF - cp (hl) - ret nz - scf - ret - -;АДРЕС: #2D63 формирование коллекции образов в подразделе TR-DOS -;вх: (xE8A9) - дескриптор подраздела -x2D63 ld hl,xE8A9 ;дескриптор подраздела - call x2E30 ;расчет количества образов исходя из размеров подраздела - ld a,c - or b - ret z ;ни одного образа не поместится - ld b,c - ld c,#01 - push bc - ld de,#0001 - add hl,de - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl ;hl=xE9E7 - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl - pop bc ;(xE9E7) LBA адрес начала образа - ld hl,xEBF5 ;начало каталога -;формирование каталога образов и очистка служебного сектора у каждого образа -x2D85 push bc - ld (hl),#01 ;признак образа TR-DOS - inc hl - ld de,xE9E7 - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - ;установка LBA адреса начала образа - ex de,hl ;hl=xE9E7 - call x2DF0 ;создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода - ld bc,#0004 - add hl,bc ;адрес дескриптора образа +5 - ld (hl),#00 -; размер образа - inc hl ;адрес дескриптора образа +6 - ld de,x2DE8 - ex de,hl - ld bc,#0004 - ldir ;размер образа (всегда #0501) -; имя образа - ld bc,#0004 - ld hl,x2DEC - ldir ;постоянное имя образа - ex de,hl - pop bc - push bc ;c - номер образа - ld b,#00 - ld a,#02 - ld e,#0A - push hl - call x0CDC ;печать числа bc в буфер hl - pop hl -; установка адреса следующего образа - inc hl - inc hl ;адрес следующего дескриптора образа - push hl - ld hl,xE9E7 ;сложение двух 4х байтных чисел - ld de,x2DE8 - call x3052 ;(xE9E7) LBA адрес следующего образа - pop hl ;адрес следующего дескриптора образа - pop bc ;номер следующего образа - inc c - djnz x2D85 -;установка сигнатур каталога - ld (hl),#00 - ld hl,#AA54 ;сигнатура каталога образов - ld (xEBF5+#3FE),hl - ld hl,#5254 ;дополнитьельная сигнатура каталога образов - ld (xEBF5+#3FC),hl - - - ld hl,xE8A9 ;дескриптор подраздела - ld de,#0001 - add hl,de ;дескриптор подраздела+1 - call x300E ;загрузка числа в регистры из памяти - ;dehl - LBA адрес начала подраздела - rst #30 - dw rom7_x17EF ;запись каталога образао из буфера xEBF5 - db #07 - ret - -x2DE8 db #01,#05,#00,#00 ;размер образа в секторах -x2DEC db "Disk" ;постоянная часть имени - -;АДРЕС: #2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода -;вх: hl - адрес дескриптора образа +1 -; de - LBA адрес начала данных образа -x2DF0 push hl - ld hl,xE5A9 ;очистка буфера 512b - ld de,xE5A9+1 - ld (hl),#00 - ld bc,#01FF - ldir - pop hl ;адрес дескриптора образа +1 -;создание первого (служебного) сектора образа - push hl - call x300E ;загрузка числа в регистры из памяти (hl) - ;dehl - LBA адрес начала образа - rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - pop hl -;формирование данных в описателе текущего дисковода (а нахрена???) -; LBA адрес начала образа - push hl ;адрес дескриптора образа +1 - ld de,xE590+1 ;LBA адрес начала образа - call x3000 ;копирование из (hl) в (de) 4х байт -; признак образа - ld a,#01 - ld (xE590),a ;признак образа - ld a,#E0 - ld (xFFCE),a ;для дисковода C - pop hl -; размер образа - push hl ;адрес дескриптора образа +1 - ld de,xE590+5 - call x3000 ;копирование из (hl) в (de) 4х байт - ld hl,x2DE8 ;адрес размера образа - ex de,hl - call x3052 ;сложение двух 4х байтных чисел - ld hl,xE590+5 - call x302A ;декремент (hl)=(hl)-1 - pop hl - ret - -;АДРЕС: #2E30 расчет количества образов исходя из размеров подраздела -;вх: hl - адрес дескриптора подраздела -;вых: bc - количество образов -x2E30 push hl - call x3005 ;загрузка числа в регистры из памяти +6 байт к адресу hl - ld bc,xE9E7 ;dehl - размер подраздела - call x301C ;загрузка числа из регистров в память - ex de,hl ;hl=xE9E7 - call x302A ;декремент (hl)=(hl)-1 - call x302A ;декремент (hl)=(hl)-1 -2 сектора - call x300E ;загрузка числа в регистры из памяти (hl) - exx - ld bc,#0501 ;размер образа в секторах - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx - ld bc,#0033 ;определение количества образов в подразделе - ld a,e - or d - or h - jr nz,x2E5B - ld a,l - cp #34 - jr nc,x2E5B - ld c,a -x2E5B pop hl - ret - -;АДРЕС: #2E5D сформируем пустой сектор MBR в буфере xE5A9 -x2E5D ld hl,xE5A9+#1BE ;начало списка разделов - ld bc,#0041 - ld de,xE5A9+#1BF - ld (hl),#00 - ldir - ld hl,#AA55 - ld (xE5A9+#1FE),hl ;запишем сигнатуру - ret - -;АДРЕС: #2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS -x2E71 ld hl,xEBF5 - ld bc,#03FF - ld de,xEBF5+#01 - ld (hl),#00 - ldir - ld hl,#AA54 - ld (xEBF5+#3FE),hl ;xEFF3 - ret - -;АДРЕС: #2E85 ввод имени подраздела -;вх: hl - настройки окна ввода строки -;вых: cy=1 отмена ввода строки -; de - адрес введенной строки -x2E85 ld (xE9EF),hl - set 5,(iy+#0E) - call x0CCA ;очистка буфера для ввода строки - rst #30 ;можно и напрямую вызвать - dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора - db #05 - rst #30 ;можно и напрямую вызвать - dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) - db #05 -x2E97 ld de,xDE17 ;буфер для ввода строки - ret nc ;строка введена -;отмена ввода - cp #03 - jr nz,x2EA1 - scf ;break/cancel - ret -x2EA1 rst #30 ;можно и напрямую вызвать - dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - db #05 - jr x2E97 - -;АДРЕС: #2EA7 проверка введенного имени -;вх: hl - адрес начала записи в каталоге -; de - адрес введенной строки -;вых: cy=1 ошибка при проверке -; cy=0 имя корректно -x2EA7 push hl - ld bc,#000A - add hl,bc ;начало имени подраздела в дескрипторе - ld a,(xDFFE) ;код типа подраздела - ld c,a - ld b,#06 -x2EB2 ld a,(de) - cp #21 - jr nc,x2EC9 ;это допустимый символ - ld a,b - cp #06 - jr z,x2EC1 ;пустое имя - ld a,(de) - cp " " - jr c,x2EC6 ;недопустимый символ. конец имени -x2EC1 ld a,c - cp #04 - jr nz,x2F0D ;пустое имя только для BAD можно -x2EC6 ld a," " - dec de -x2EC9 inc de ;заполняем остаток пробелами - ld (hl),a - inc hl - djnz x2EB2 - pop hl ;адрес начала записи в каталоге - ld a,c - cp #04 - ret z ;если BAD подраздел -;проверка совпадения имени - push hl - ld a,(xDD89) ;количество записей в каталоге - ld b,a - ld hl,xEBF5 ;начало каталога -x2EDB ld a,(hl) - cp #FF - jr z,x2F04 ;пустая запись - pop de - push de - or a - push hl - sbc hl,de - pop hl - jr z,x2F04 ;запись, на месте которй создаем подраздел - push bc - ex de,hl - ld bc,#000A - add hl,bc - ex de,hl - push hl - add hl,bc - ld bc,#0600 ;проверка совпадения имени -x2EF5 ld a,(de) - cp (hl) - jr z,x2EFA - inc c -x2EFA inc hl - inc de - djnz x2EF5 - pop hl - ld a,c - pop bc - or a - jr z,x2F0D ;есть совпадение по имени. нельзя два одинаковых -x2F04 ld de,#0010 - add hl,de - djnz x2EDB - pop hl - or a - ret -;ошибка при проверке имени -x2F0D pop hl - scf - ret - -;АДРЕС: #2F10 выбор типа подраздела -;вх: hl - настройки окна ввода строки -; de - адрес таблицы с названиями разделов MFS -;вых: cy=1 отмена выбора -; cy=0 тип подраздела выбран -; hl - адрес сообщения с типом и названием подраздела -; a - код типа подраздела -x2F10 ld (xE9EF),hl ;настройки окна ввода строки - set 5,(iy+#0E) - push de - ld a,#64 ;сообщение: select - rst #30 ;можно и напрямую вызвать - dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора - db #05 - pop hl ;адрес таблицы с названиями разделов MFS -;выбор типа подраздела -x2F1F push hl -x2F20 xor a ;!!!нет нуля в этой таблице - cp (hl) - jr z,x2F49 -;печать типа подраздела (tr-dos/is-dos/microdos/bad) - push hl - inc hl - ld (ix+1),#01 ;координата X - set 0,(ix+7) ; - call x2BAC ;печать сообщения из hl - rst #30 - dw rom2_x2FED ;печать пробелов до правого края окна - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - res 0,(ix+7) - pop hl - cp #0D - jr z,x2F58 ;enter - cp #03 - jr nz,x2F49 ;что-то нажато - scf ;отмена создания - pop hl - ret -;обработка нажатия любой клавиши -x2F49 inc hl -x2F4A ld a,(hl) ;ищем конец сообщения - and #80 - inc hl - jr z,x2F4A - ld a,(hl) - cp #FF - jr nz,x2F20 ;если не конец блока - pop hl ;если конец блока, переход на начало блока - jr x2F1F -;выбрали тип подраздела в (hl) - тип -x2F58 ld a,(hl) - ex (sp),hl - pop hl - or a - ret - -;АДРЕС: #2F5D запрос на сохранение сектора MBR, если были изменения -x2F5D bit 6,(iy+#1C) - ret z - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - ret nz - -;АДРЕС: #2F66 формирование и запись сектора MBR -x2F66 set 5,(iy+#1C) - ld hl,x2D5D - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 - ld de,xE5A9+#1BE ;начала дескрипторов разделов в секторе MBR - ld hl,xEBF5 ;буфер с каталогом - ld a,(xDD89) ;записей в каталоге - cp #04 - jr c,x2F82 ;допустимое значение - ld a,#04 ;можно не больше 4х -x2F82 or a - jr z,x2F8D ;разделов нет - dec a - ld bc,#0010 - ldir ;копируем дескриптор раздела - jr x2F82 ;повторим -x2F8D ld hl,#0000 ;LBA адрес (нулевой сектор) - ld e,l - ld d,h - jr x2F9E ;запись сектора из буфера xE5A9 - -;АДРЕС: #2F94 !!!не используется!!! чтение сектора в буфер xE5A9 -x2F94 rst #30 - dw rom7_x1D73 ;чтение сектора с винчестера в буфер xE5A9 - db #07 - ret nc ;нет ошибок - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;запись сектора из буфера xE5A9 -x2F9E rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - ret nc ;нет ошибок - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;АДРЕС: #2FA8 запрос на сохранение каталога MFS, если были изменения -x2FA8 bit 6,(iy+#1C) - ret z ;список разделов в буфере без изменений - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - ret nz ;отказ от сохранения - -;АДРЕС: #2FB1 запись каталога MFS/подраздела -x2FB1 set 5,(iy+#1C) - ld hl,x2D5D - call x28C6 ;уплотнение каталога (удаление в буфере записей unused) - call x270D ;загрузка числа в регистры из памяти xE81B+8 - ;dehl - LBA адрес начала раздела MFS - rst #30 ;запись каталога MFS - dw rom7_x17EF ;запись 2х секторов из буфера xEBF5 - db #07 - jp nc,x2503 ;ошибок не было - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;АДРЕС: #2FCA сравнение двух чисел в памяти по адресам в de и hl -x2FCA rst #30 - dw rom7_x1035 ;сравнение двух чисел в памяти по адресам в de и hl - db #07 - ret - -;АДРЕС: #2FCF обнуление переменной xE9EB -x2FCF push hl - ld hl,#0000 - ld (xE9EB),hl - ld (xE9EB+#02),hl - pop hl - ret - -;АДРЕС: #2FDB инкремнт слова (xDD89)=(xDD89)+1 -x2FDB push hl - ld hl,(xDD89) - inc hl - ld (xDD89),hl - pop hl - ret - -;АДРЕС: #2FE5 декремент слова (xDD89)=(xDD89)-1 -x2FE5 push hl - ld hl,(xDD89) - dec hl - ld (xDD89),hl - pop hl - ret - -;АДРЕС: #2FEF умножение bc=bc*#10 -x2FEF sla c - rl b - sla c - rl b - sla c - rl b - sla c - rl b - ret - -;АДРЕС: #3000 копирование из (hl) в (de) 4х байт -x3000 rst #30 - dw rom7_x1003 ;копирование из (hl) в (de) 4х байт - db #07 - ret - -;АДРЕС: #3005 загрузка числа в регистры из памяти +6 байт к адресу hl -x3005 ld bc,#0006 - jr x300D - -;АДРЕС: #300A загрузка числа в регистры из памяти +12 байт к адресу hl -x300A ld bc,#000C -x300D add hl,bc - -;АДРЕС: #300E загрузка числа в регистры из памяти -;вх: hl - адрес откуда грузим -;вых: dehl - число -x300E push hl - pop bc - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a - inc bc - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - ret - -;АДРЕС: #301C загрузка числа из регистров в память -;вх: dehl - число -; bc - адрес куда грузим -;вых: de - адрес куда загрузили -x301C push bc - ld a,l - ld (bc),a - inc bc - ld a,h - ld (bc),a - inc bc - ld a,e - ld (bc),a - inc bc - ld a,d - ld (bc),a - pop de - ret - -;АДРЕС: #302A декремент (hl)=(hl)-1 -x302A push hl - push de -x302C ld de,x3043 - call x3035 - pop de - pop hl - ret - -;АДРЕС: #3035 вычитание (hl)=(hl)-(de) -x3035 ex de,hl - push bc - xor a - ld b,#04 -x303A ld a,(de) - sbc a,(hl) - ld (de),a - inc hl - inc de - djnz x303A - pop bc - ret - -;для инкремента -x3043 db #01,#00,#00,#00 ;dd #01 - -;АДРЕС: #3047 инкремент числа по адресу hl -x3047 push hl - push de - ld de,x3043 - call x3052 ;сложение двух 4х байтных чисел - pop de - pop hl - ret - -;АДРЕС: #3052 сложение двух 4х байтных чисел -;вх: hl - адрес первого числа -; de - адрес второго числа -;вых: hl - сумма чисел -x3052 ex de,hl - push bc - xor a - ld b,#04 -x3057 ld a,(de) - adc a,(hl) - ld (de),a - inc hl - inc de - djnz x3057 - pop bc - ret - -;АДРЕС: #3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши -;вых: z - нажата Y -x3060 ld hl,xE0D7 ;дескриптор окна: запрос на запись MBR - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 -x3067 ld (ix+4),#18 ;высота окна - ld (ix+6),#17 ;атрибуты окна - rst #20 - db #0C ;очистка окна - db #1B,#09,#0F ;координаты печати - db "Warning!" - db #1B,#0B,#08 ;координаты печати - db "Partition will be changed." - db #1B,#0D,#0E ;координаты печати - dc "Write (Y/N)?" - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - ld (ix+6),#31 - ld (ix+4),#16 - and #DF - cp "Y" - ret - -;АДРЕС: #30B9 идентификация жесткого диска -x30B9 push ix - ld ix,xE5A9 - rst #30 - dw rom7_x1E74 ;R8DOS #22(34) идентификация жесткого диска - db #07 - pop ix - ret - -;АДРЕС: #30C6 печать окна для тестирования HDD -x30C6 call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана -x30C9 ld (ix+#01),#00 ;crd X =0 - rst #20 - dc "Press BREAK to exit. ONLY!" - rst #30 - dw rom6_x064D ;установка дескриптора окна: запрос на запись MBR - db #06 - rst #20 - db #8C ;очистка окна - ld (ix+#00),#15 ;crd Y =#15 - ret - -;АДРЕС: #30F3 печать кода ошибки -;вх: a - код ошибки (номер сообщения из блока 0) -x30F3 push af - call x310F ;печать текущих номера головки и сектора - pop bc - ld c,#00 - rst #08 - rst #20 - db #8D ;перевод строки - jr x315E - -;печать текущего номера цилиндра HDD -x30FF ld (ix+#01),#00 ;crd X =0 - rst #20 - dc "C:" - ld bc,(xE047) ;номер цилиндра - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - ret - -;печать текущих номера головки и сектора -x310F call x30FF ;печать текущего номера цилиндра HDD -x3112 rst #20 - dc " H:" - ld a,(xE049) ;номер головки - and #0F - ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #20 - dc " S:" - ld a,(xE046) ;номер сектора - ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ret - -;АДРЕС: #3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -;вх: hl - номер байта в секторе -; c - контрольное значение байта -; b - считанное значение байта -x3135 push bc - push hl - call x310F ;печать текущих номера головки и сектора - rst #20 - dc "data bad " - pop hl - rst #30 - dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - pop bc - push bc - ld a,c - rst #30 - dw rom2_x16E3 ;печать числа a=[#00..#FF] - db #02 - rst #20 - dc ":" - pop bc - ld a,b - rst #30 - dw rom2_x16E3 ;печать числа a=[#00..#FF] - db #02 - rst #20 - db #8D ;перевод строки - -;управление выводимым листингом (опрос клавиш space, s, cs+1) -x315E rst #30 - dw rom2_x37B9 - db #02 - ret - -;АДРЕС: #3163 печать текущего номера цилиндра -x3163 call x30FF ;печать текущего номера цилиндра HDD - call x0110 ;опрос Break. cy=1 не нажата - jr c,x3183 - call x3112 ;нажата Break - rst #20 - dc "Break" -x3174 ld b,#06 ;пауза примерно 245k тактов -x3176 rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - djnz x3176 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 -x3180 jp x0EB5 ;печать текущего меню монитора -x3183 rst #20 - dc " of" - ld bc,(xDFF2) ;значение Cylinders HDD - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ld a,(iy+#01) - inc (iy+#01) - and #03 - ld hl,x31A6 - add a,l - ld l,a - jr nc,x31A3 - inc hl ;!!!ОШИБКА!!! должно быть inc h -x31A3 ld a,(hl) - rst #10 - ret -x31A6 db #2D,#5C,#7C,#2F ;"-\|/" индикация работы - -;АДРЕС: #31AA удаление всех разделов MBR -x31AA call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x3180 ;нажата не Y. печать текущего меню монитора - ld hl,xE5A9 ;очитска буфера - ld de,xE5A9+1 - ld (hl),#00 - ld bc,#01FF - ldir - xor a - ld l,a - ld h,a - ld e,a - ld d,a - rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - jr nc,x3180 ;ошибок не было. печать текущего меню монитора - ld (ix+#00),#17 ;crd Y - ld (ix+#01),#00 ;crd X - call x30F3 ;печать кода ошибки - jr x3174 ;ждем нажатие клавиши и печать текущего меню монитора - -;АДРЕС: #31D4 неиспользуемая область -x31D4 ds #2C,#00 - -;АДРЕС: #3200 каталог ROM-disk -x3200 dc "ZxUnZip" : ds 7 :db #0E,#04 - dc "ZxZip" : ds 9 :db #39,#05 - dc "TASM_4.0" : ds 6 :db #2F,#07 - dc "SM_2.01" : ds 7 :db #36,#08 - dc "HD_Copy_1.7" : ds 3 :db #02,#0A - dc "TESTFDD" : ds 7 :db #3D,#0A - DUP 10 - ds #10 - EDUP - -;АДРЕС: #3300 ROM-disk -x3300 INCBIN "prof_roms/rom5_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM5.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom5.bat b/ProfRom_Disasm/rom5.bat deleted file mode 100755 index 897a2b9..0000000 --- a/ProfRom_Disasm/rom5.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom5.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom6.a80 b/ProfRom_Disasm/rom6.a80 deleted file mode 100755 index d01ca46..0000000 --- a/ProfRom_Disasm/rom6.a80 +++ /dev/null @@ -1,2902 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #1200 - -;#0000 *NOT USED* (#08 байт) -;#0008 rst #08 печать сообщения по номеру в BC -;#000D *NOT USED* (#03 байта) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#03 байт) -;#0018 вызов процедуры из rom7 (rst #18: dw addr) -;#001B *NOT USED* (ld a,#01) -;#001E *NOT USED* (#02 байта) -;#0020 rst #20 печать строки -;#0025 *NOT USED* (#0B байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#003B *NOT USED* (#2B байт) -;#0066 обработка NMI (зависание с желто-черным бордюром) -;#006F *NOT USED* (#01 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (#55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -;#0110 Таблица переходов ПрофПЗУ -;#0114 обработчик прерываний im 1/2 -;#0149 печать строки (rst #20) -;#0156 печать информации о ловушке -;#01E4 установка новой ловушки в отладчике -;#0249 вывод каталога текущего дисковода (на экран/принтер) -;#03A1 печать числа в десятичной системе счисления -;#03A9 форматирование/проверка текущей дискеты -;#04E5 быстрое форматирование текущей дискеты (очистка каталога) -;#064D установка дескриптора окна: запрос на запись MBR -;#0655 hl=hl+5: hl=de (z равны) -;#0667 вызоф функции R8DOS -;#066C установка код дисковой ошибки в переменной для печати числа -;#0675 зануление #100 байт буфера xE5A9 -;#0678 зануление #100 байт памяти с hl -;#067F сохранение экрана пользователя на диск -;#06A6 печать сообщения об ошибке и продолжение работы монитора -;#06AD ввод текстовой строки внизу экрана -;#06С1 печать текущего меню монитора (без возврата) -;не используется #06C5 вывод в порт #FE содержимое ячейки (#7530) -;#06CB таблица соответствий нажатой клавиши печатному символу -;#06F2 таблица кодов клавиш cs+1+клавиша -;#0719 таблица кодов клавиш ss+клавиша -;#0740 таблица кодов клавиш cs+цифра -;#074A ожидание действий пользователя (опрос управления, вывод часов) -;#0773 проверка наличия нажатых клавиш в буфере клавиатуры -;#0777 проверка наличия нажатых клавиш в буфере клавиатуры -;#0780 проверка переполнения буфера клавиатуры -;#078B сброс буфера клавиатуры -;#0792 опрос клавиатуры и установка кода нажатой клавиши в буфере -;#07B2 опрос клавиатуры и установка кода нажатой клавиши -;#0845 опрос клавиатуры -;#086A определение кода нажатой клавиши/комбинации клавиш -;#093F RST #08:db #8B загрузка zs-snap с диска -;#096D копирование активного экрана пользователя в #4000 -;#0972 печать текущего меню монитора (без возврата) -;#0976 загрузка zs-snap (S. load ... snap) -;#097E сохранение zs-snap (S. save ... snap) -;#0B71 расчет начала битовой карты параграфов заданной страницы -;#0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) -;#0D59 включение режима 48k only -;#0D60 установка п/п jp #addr по адресу xE338 -;#0D6D установка/восстановление параметров заголовка zs-snap -;#0E3B загрузка из ROM-disk -;#0EE0 загрузка блока из ROM-disk -;#0EE6 загрузка блока из ROM-disk -;#0F08 загрузка страницы из ROM-disk в память #8000 -;не используется #0F4D заполнение области памяти [#4000..#7FFF] пользователя -;#0F60 запаковка блока -;#1103 сложение hl=hl+a -;#1108 распаковка блока -;#11AF NOT USED -;#1200 ROM-disk -;#4000 - - - -;АДРЕС: #0000 *NOT USED* (#08 байт) -x0000 ds #08 - -;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC -x0008 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #000D *NOT USED* (#03 байта) -x000D ds #03 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#03 байт) -x0015 ds #03 - -;АДРЕС: #0018 вызов процедуры из rom7 (rst #18: dw addr) -x0018 jp xE41B - -;АДРЕС: #001B *NOT USED* (ld a,#01) -x001B ld a,#01 - ret - -;АДРЕС: #001E *NOT USED* (#02 байта) -x001E ds #02 - -;АДРЕС: #0020 rst #20 печать строки -x0020 ex (sp),hl - push af - jp x0149 - -;АДРЕС: #0025 *NOT USED* (#0B байт) -x0025 ds #0B - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 jp x0114 - -;АДРЕС: #003B *NOT USED* (#2B байт) -x003B ds #2B - -;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) -x0066 ld a,#06 - out (#FE),a - xor a - out (#FE),a - jr x0066 - -;АДРЕС: #006F *NOT USED* (#01 байт) -x006F ds #01 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) - db #40-ROMdisk/#100;количество свободных секторов в странице - db #00 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0114 - -;АДРЕС: #0101 номер текущего rom -x0101 db #06 - -;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -x0102 ds #0E - -;АДРЕС: #0110 Таблица переходов ПрофПЗУ -x0110 db #0C,#00,#08,#04 - -;АДРЕС: #0114 обработчик прерываний im 1/2 -x0114 push af - push hl - push de - push bc - ld ix,(xE3B7) ;адрес дескриптора текущего окна - call x0792 ;опрос клавиатуры и установка кода нажатой клавиши в буфере - rst #30 - dw rom5_x0176 ;восстановление экрана под курсором мыши - db #05 - rst #30 - dw rom2_x28F6 ;мигание текстового курсора в строке ввода - db #02 - push ix ;адрес дескриптора текущего окна - rst #30 - dw rom5_x011C ;опрос манипуляторов и печать курсора - db #05 - call c,x07A0 ;помещение кода нажатой кнопки джойстика/мыши в буфер клавиатуры - bit 6,(iy+#1A) ;чтение времени из CMOS, если возможно - jr z,x0140 ;CMOS отсутствует - bit 3,(iy+#27) - jr z,x0140 ;индикация времени выключена - rst #30 - dw rom7_x1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS - db #07 -x0140 pop ix - pop bc - pop de - pop hl - pop af - ei - reti - -;АДРЕС: #0149 печать строки (rst #20) -x0149 ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x0149 - pop af - ex (sp),hl - ret - -;АДРЕС: #0156 печать информации о ловушке -;вх: hl - адрес ловушки -; d - количество ловушек+1 -; e - номер текущей ловушки -;вых: hl - адрес следующей ловушки -x0156 ld c,e - ld b,#00 - push de -;печать номера ловушки - ld (iy+#08)," " - ld (iy+#07),#02 ;минимум разрядов в числе при переводе в ASCII - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - pop de - rst #20 - dc " " - push hl - bit 6,(hl) - jr nz,x0174 -;ловушка не задана - ld bc,#2900 ;сообщение: *** undefined - rst #08 ;печать сообщения - jr x01D7 ;следующая ловушка -;ловушка задана -x0174 push de - ld b,#02 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 -; печать адреса ловушки - rst #20 - dc "#" - push hl - inc hl - ld e,(hl) - push de - inc hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - rst #30 - dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] - db #02 - pop de - pop hl -; печать номера страницы ловушки - ld b,#04 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - ld a,e - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 -; печать типа ловушки - ld b,#04 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - ld a,(hl) - and #03 - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 -; состояние ловушка (активна/неактивна) - ld b,#03 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - bit 7,(hl) - rst #30 - dw rom2_x3201 ;печать ON/OFF от флага nz-ON/z-OFF - db #02 -; начальное значение счетчика проходов по ловушке - ld de,#0005 - add hl,de - ld c,(hl) - inc hl - ld b,(hl) - inc hl - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 -; текущее значение счетчика проходов - ld c,(hl) - inc hl - ld b,(hl) - inc hl - rst #30 - dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом - db #02 -; наличие (+) или отсутствие (-) программы для анализатора - ld b,#02 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - pop de - ld a,e - rst #30 - dw rom2_x3210 ;определение адреса ловушки - db #02 - ld a,"-" - jr z,x01D6 - ld a,"+" -x01D6 rst #10 -;адрес следующей ловушки -x01D7 pop hl - ld de,#000B - add hl,de - or a - ret - -;выход в отладчик -x01DE ld a,#0A ;сообщение: too few operands -x01E0 rst #30 - dw rom2_x0B06 ;ввод и обработка команды отладчика - db #02 ;без возврата - -;АДРЕС: #01E4 установка новой ловушки в отладчике -;вх: ix - адрес ловушки -; hl - тип ловушки -; bc - адрес установки ловушки -; a - количество операндов [0..5] -; z - ловушка не задана -x01E4 push ix - ld de,xE585+#01 - ex de,hl -;проверка валидности типа ловушки - push af - ld a,e - and #FC - or d - ld a,#24 ;сообщение: invalid type breackpoint - jr nz,x01E0 ;возврат в отладчик - pop af -;проверка количества параметров - cp #04 - jr z,x0213 ;в текущую страницу - jr c,x01DE ;мало параметров. выход в отладчик - cp #06 - ld a,#0B ;сообщение: too many operands - jr nc,x01E0 ;много параметров. выход в отладчик -;ставим страницу - push hl - ld hl,(xDD99+#08) ;номер страницы - ld a,l - and #F0 - or h - ld a,#18 ;сообщение: invalid bank RAM - jr nz,x01E0 ;неверный номер страницы. выход в отладчик - ld a,l - pop hl - ld (hl),a - set 5,e - jr x0218 -x0213 rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - ld (hl),a -;установка адреса ловушки -x0218 bit 0,e ;e - тип ловушки ???ВОЗМОЖНО ОШИБКА??? - inc hl - jr nz,x0224 ;активная после выполнения - ld a,b - and #C0 - ld a,#25 ;сообщение: bad address breackpoint - jr z,x01E0 ;в ПЗУ ставить нельзя. выход в отладчик -x0224 ld (hl),c - inc hl - ld (hl),b - inc hl - inc hl -;установка количества проходов - ld bc,(xDD99+#06) ;количество проходов по ловушке до ее активизации - ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),c - inc hl - ld (hl),b - inc hl - xor a - ld (hl),a - inc hl - ld (hl),a -;установка типа ловушки - ld hl,xE585 - ld a,e - or #C0 - ld (hl),a -;копирование ловушки из временного буфера и выход в отладчик - pop de - ld bc,#000B - ldir - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #0249 вывод каталога текущего дисковода (на экран/принтер) -x0249 rst #30 - dw rom2_x3A95 ;подготовка переменных к выводу на экран/принтер - db #02 - ld (iy+#08),#20 - ld hl,(xFFD0) - push hl - rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - jp c,x0382 ;ошибка чтения/записи - push bc - ld bc,#4B00 ;сообщение: disk - rst #08 - ld a,(xFFCA) - add a,"A" - rst #10 ;печать буквы дисковода - rst #20 - dc ':"' -; печать имени диска - ld hl,xE5A9+#F5 - ld b,#08 - rst #30 - dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? - db #02 - rst #20 - dc '", ' -; печать времени и даты - ld d,#DA ;%11011010 - rst #30 - dw rom5_x1AA6 ;читаем время в строку в формате ASCII - db #05 - rst #20 - dc " " - ld d,#20 - rst #30 - dw rom5_x1B18 ;читаем дату в строку в формате ASCII - db #05 - rst #20 - db #8D - pop af ;a - код, определяющий тип дискеты в дисководе - push af -; печать количества дорожек - bit 5,a - ld b,#39 - jr z,x0290 ;40 дорожек на дискете - inc b -x0290 ld c,#01 ;сообщение: 40/80 - rst #08 - ld bc,#3801 ;сообщение: track - rst #08 -; печать количества сторон - pop af - rlca - ld b,#3C - jr nc,x029E - inc b ;сообщение: one/double -x029E ld c,#01 - rst #08 - ld bc,#3B01 ;сообщение: side - rst #08 -; печать идентификационного кода и типа дискеты - rst #20 - dc "(" - ld a,(xE5A9+#E7) ;Идентификационный код TR-DOS (#10) - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#E3) ;Тип дискеты - call x0396 ;печать числа в шестнадцатиричной системе счисления -; печать кол-ва файлов, свободного места - rst #20 - db ")",#0D - dc "File" - ld a,(xE5A9+#E4) ;Количество файлов на дискете - call x03A1 ;печать числа в десятичной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#F4) ;Количество удаленных файлов - call x03A1 ;печать числа в десятичной системе счисления - rst #20 - dc ", free" - ld bc,(xE5A9+#E5) ;Количество свободных секторов - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #20 - dc " (" - ld a,(xE5A9+#E1) ;Номер первого незанятого сектора на дискете - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#E2) ;Номер дорожки первого незанятого сектора - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - db ")",#0D,#8D -;печать списка файлов на диске (одна страница не более 16 имён) -x02EE ld b,#10 -x02F0 push bc - rst #30 - dw rom7_x1166 ;загрузка очередного дескриптора файла в буфер - db #07 - pop bc - jp c,x0382 ;ошибка чтения - ld a,(hl) - or a - jp z,x037B ;больше нет файлов - push bc - dec a - jr nz,x0312 ;это не удаленнй файл -; печать первого сивола удаленного файла - inc hl - bit 4,(iy+#09) - ld a,#82 - jr z,x030D ;печать на экран - ld a,"?" -x030D rst #10 - ld b,#07 - jr x0314 -; печать имени файла -x0312 ld b,#08 -x0314 rst #30 - dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? - db #02 -; печать типа файла - rst #20 - dc " <" - ld a,(hl) - inc hl - rst #10 - rst #20 - dc ">" -; печать стартового адреса и длины файла - ld b,#02 -x0322 push bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - push hl - rst #30 - dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом - db #02 - pop hl - pop bc - djnz x0322 - rst #20 - dc " " -; печать размера в секторах - ld a,(hl) - inc hl - push hl - call x03A1 ;печать числа в десятичной системе счисления - pop hl - ld a,#1E - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -; печать номера первого сектора и дорожки - ld b,#02 -x0341 push bc - rst #20 - dc " " - ld a,(hl) - inc hl - push hl - call x0396 ;печать числа в шестнадцатиричной системе счисления - pop hl - pop bc - djnz x0341 - rst #20 - db #8D - pop bc - djnz x02F0 - rst #30 - dw rom2_x35D3 ;сравнение ix=xE075 - db #02 -x0357 jr nz,x02EE ;продолжение вывода на принтер -; одидание нажатия клавиши для продолжения печати - rst #20 - dc "More..." - ld b,(ix+#00) - push bc - rst #30 - dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них - db #05 - pop bc - ld (ix+#00),b ;crd Y - ld (ix+#01),#00 ;crd X - cp #03 - jr nz,x0357 ;продолжаем вывод - ld a,#0A ;прерываем. break/cancel - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -;больше нет файлов -x037B rst #20 - db #0D - dc "END" - jr x0387 -;ошибка чтения/записи -x0382 ld b,a - call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа - rst #08 -x0387 res 4,(iy+#09) - pop hl - ld (xFFD0),hl -x038F rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - jp x074A ;ожидание действий пользователя (опрос управления, вывод часов) - -;печать числа в шестнадцатиричной системе счисления -;вх: a - число -x0396 ld b,#00 - ld c,a - ld de,#1023 ;de - делитель для выделения разряда числа/код префикса - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - ret - -;АДРЕС: #03A1 печать числа в десятичной системе счисления -;вх: a - число -x03A1 ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - ret - -;АДРЕС: #03A9 форматирование/проверка текущей дискеты -x03A9 call x060E ;предложение начать работу с диском (Insert disk, press Y key) - ld d,#27 ;39 - bit 5,a - jr z,x03B4 ;дискета на 40 дорожек - ld d,#4F ;79 -x03B4 ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld e,#01 - rlca - jr c,x03C1 ;двусторонняя -x03BF ld e,#00 -x03C1 push de - ld (ix+#01),#00 ;crd X - rst #30 - dw rom2_x2A85 ;очистка знакоместной строки по координатам курсора - db #02 - pop bc - push bc - ld (iy+#07),#01 ;минимум разрядов в числе при переводе в ASCII - ld c,b - ld b,#00 ;номер дорожки - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - rst #20 - dc "/" - pop bc - push bc - ld b,#00 ;номер стороны - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - call x05CE ;определение количества секторов на дорожке -;печать графического отображения текущей дорожки - ld b,a ;количество секторов на дорожке - ld (ix+#01),#05 ;crd X - ld (ix+#0A),#08 ;размер символов в пикселях -x03ED push bc - ld a,#10 - rst #30 - dw rom2_x2800 ;печать символа в окне - db #02 - pop bc - djnz x03ED - ld (ix+#0A),#06 ;размер символов в пикселях - rst #20 - db #8D - bit 7,(iy+#13) - jr z,x0411 ;проверка дискеты -;форматирование дискеты - rst #20 - dc "Formating." - call x05A2 ;печать количества отфрматированных/сбойных секторов -x0411 pop de - push de - ld a,e - ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D - call x0667 ;вызов функции R8DOS - jr c,x047B ;ошибка чтения/записи - call x05CE ;определение количества секторов на дорожке - pop de -;формирование таблицы секторов с учётом interleaving - ld c,#00 - ld hl,xE5A9 - push hl -x0425 ld (hl),#00 - inc hl - ld (hl),d - inc hl - ld (hl),e - inc hl - inc c - ld (hl),#00 - inc hl - ld (hl),b - inc hl - cp c - jr nz,x0425 - ld (hl),#FE - ex de,hl - push hl - ld c,#01 -x043B ld hl,xE5A9+#03 - ld b,#00 -x0440 ld a,(hl) - or a - jr nz,x0449 - ld (hl),c - inc c - inc b - jr x0450 -x0449 call x0655 ;hl=hl+5: hl=de (z равны) - jr nc,x045D ;hl>=de - jr x0440 -x0450 ld a,(iy+#18) ;значение interleaving 1..26 -x0453 call x0655 ;hl=hl+5: hl=de (z равны) - jr nc,x045D - dec a - jr nz,x0453 - jr x0440 -x045D ld a,b - or a - jr nz,x043B - pop de - pop hl -;форматирование дорожки - push de - push hl - ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - pop hl - ld b,a - ld de,#5A85 - push de - ld c,#0B ;форматирование дорожки - or a - bit 7,(iy+#13) - call nz,x0667 ;вызов функции R8DOS -;проверка дорожки -x047B jp c,x058D ;ошибка чтения/записи - ld (ix+#01),#00 ;crd X - rst #20 - dc "Checking. " - call x05A2 ;печать количества проверенных/сбойных секторов - ld de,#0000 - ld hl,xE5A9 - push hl - ld c,#0C ;чтение дорожки - call x0667 ;вызов функции R8DOS - call c,x0587 ;ошибка чтения дорожки - call x05CE ;определение количества секторов на дорожке - pop hl - exx - pop hl - exx - ld de,(xDFFE) - ld bc,(xE000) -x04AE ld a,(hl) - cp #FE - jr z,x04C7 ;конец таблицы секторов - inc de - or a - ld a,#34 ;paper 6, ink 4 - jr z,x04BC ;сектор без ошибок - ld a,#32 ;paper 6, ink 2 - inc bc -x04BC exx - ld (hl),a - inc hl - exx - inc hl - inc hl - inc hl - inc hl - inc hl - jr x04AE -;следующая сторона/дорожка -x04C7 ld (xDFFE),de - ld (xE000),bc - ld (ix+#01),#0A ;crd X - call x05AA ;печать количества отформатированных/сбойных секторов - pop de - ld a,e - or a - jp nz,x03BF ;следующая сторона - dec d - ld a,d - cp #FF - jp nz,x03B4 ;следующая дорожка - jr x051B ;завершение форматирования/проверки дискеты - -;АДРЕС: #04E5 быстрое форматирование текущей дискеты (очистка каталога) -x04E5 call x060E ;предложение начать работу с диском (Insert disk, press Y key) - ld hl,#0A00 - bit 7,a - jr nz,x04F3 ;двухсторонняя дискета - srl h - rr l -x04F3 bit 5,a - jr nz,x04FB ;80 дорожек - srl h - rr l -x04FB ld (xDFFE),hl ;кол-во секторов - ld hl,#0000 - ld (xE000),hl - and #43 - cp #01 - jr nz,x0573 ;диск не tr-dos -; очищаем нулевую дорожку - call x0675 ;зануление #100 байт буфера xE5A9 - ld e,a -x050E push de - call x065F ;запись сектора из буфера xE5A9 - jp c,x058D ;ошибка чтения/записи - pop de - inc e - bit 4,e - jr z,x050E - -;завершение форматирования/проверки дискеты -x051B ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld e,a - and #43 ;%01000011 - cp #01 - jr nz,x0573 ;формат не tr-dos -; стандартная дискета tr-dos (формирование служебного сектора) - bit 7,(iy+#13) - jr z,x0573 ;провера дискеты - call x0675 ;зануление #100 байт буфера xE5A9 - ld a,#16 - bit 7,e - jr nz,x0539 ;двустронняя дискета - ld a,#18 -x0539 bit 5,e - jr nz,x053F ;80 дорожек на диске - or #01 -x053F ld (xE5A9+#E3),a ;Тип дискеты - ld hl,(xDFFE) - ld de,-#0010 - add hl,de - ld (xE5A9+#DF),hl - ld (xE5A9+#E5),hl ;Количество свободных секторов - ld hl,(xE000) - ld (xE5A9+#DD),hl - ld a,#10 - ld (xE5A9+#E7),a ;Идентификационный код TR-DOS (#10) - ld a,#01 - ld (xE5A9+#E2),a ;Номер дорожки первого незанятого сектора -; ввод имени дискеты - ld hl,xE5A9+#F5 - call x05E8 ;ввод имени диска - ld c,#07 ;идентификация диска - call x0667 ;вызов функции R8DOS - jr c,x058D ;ошибки чтения/записи - ld e,#08 - call x065F ;запись сектора из буфера xE5A9 - jr c,x058D ;ошибки чтения/записи -x0573 call x064D ;установка дескриптора окна - res 4,(iy+#09) ;вывод на экран - rst #20 - db #0D - dc "Complete" - jp x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) - -;ошибка чтения дорожки -x0587 ld a,(xFFDD) ;код ошибки дискового интерпретатора - cp #14 ;были ошибки при чтении/записи дорожки (функции 12, 13) - ret z - -;ошибка чтения/записи -x058D ld b,#46 ;сообщение: stop format _число_ - call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа - rst #08 - call x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;без возврата - -;перевод строки и установка кода дисковой ошибки в переменной для печати числа -x059A rst #20 - db #8D - ld c,#01 - call x066C ;установка кода дисковой ошибки в переменной для печати числа - ret - -;печать количества отфрматированных/сбойных секторов -x05A2 ld de,(xDFFE) - ld bc,(xE000) -x05AA push hl - push bc - push de - rst #20 - dc " Total " - pop bc - pop de - push bc - push de - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - rst #20 - dc "/ Bad " - pop bc - push bc - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - pop bc - pop de - pop hl - ret - -;определение количества секторов на дорожке -;вых: a - количество секторов на дорожке -; b - код размера сектора -x05CE ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld b,a - and #03 ;размер сектора в байтах 128/256/512/1024 - push af - bit 6,b - jr nz,x05DE ;метод записи MFM - add a,#04 -x05DE ld d,#00 - ld e,a - pop bc - ld hl,(xFFC8) ;адрес таблицы с количеством секторов на дорожке - add hl,de - ld a,(hl) - ret - -;ввод имени диска -;вых: cy=1 ввод отменен -x05E8 push hl - ld b,#08 -x05EB ld (hl)," " - inc hl - djnz x05EB - ld a,#89 - call x06AD ;ввод текстовой строки внизу экрана - jr c,x060B ;ввод отменен - jr z,x060B ;пустая строка - pop de - push de - ld bc,#0008 -x05FE ld a,(hl) - cp " " - jr c,x0608 - ldi - jp pe,x05FE -x0608 or a - pop hl - ret -x060B scf - pop hl - ret - -;предложение начать работу с диском (Insert disk, press Y key) -x060E call x064D ;установка дескриптора окна - rst #20 - db #8C ;очистка окна - rst #20 - db #1B,#00,#0A ;установка координат - dc "Insert disk, press Y key" - rst #30 - dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них - db #05 - pop hl - jr c,x063A - cp #0D - jr z,x063F ;выбор курсором. начинаем работу -x063A and #5F - cp "Y" - ret nz ;нажата другая клавиша -x063F push hl - rst #30 - dw rom7_x1065 ;инициализация дисковода - db #07 - ld (ix+#00),#15 ;crd Y - ld bc,#0010 ;чтение спецификации дискеты - jr x0667 ;вызов функции R8DOS - -;АДРЕС: #064D установка дескриптора окна: запрос на запись MBR -;вых: ix - адрес дескриптора окна запрос на запись MBR -x064D ld hl,xE0D7 - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 - ret - -;АДРЕС: #0655 hl=hl+5: hl=de (z равны) -x0655 inc hl - inc hl - inc hl - inc hl - inc hl - or a - sbc hl,de - add hl,de - ret - -;запись сектора из буфера xE5A9 -x065F ld hl,xE5A9 - ld d,#00 - ld bc,#0106 - -;АДРЕС: #0667 вызоф функции R8DOS -x0667 rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - ret - -;АДРЕС: #066C установка кода дисковой ошибки в переменной для печати числа -x066C ld hl,(xFFDD) ;l - код ошибки дискового интерпретатора - ld h,#00 - ld (xDDA7),hl ;установим код ошибки в переменной для печати числа - ret - -;АДРЕС: #0675 зануление #100 байт буфера xE5A9 -x0675 ld hl,xE5A9 - -;АДРЕС: #0678 зануление #100 байт памяти с hl -;вх: hl - адрес начала памяти -x0678 xor a - ld b,a -x067A ld (hl),a - inc hl - djnz x067A - ret - -;АДРЕС: #067F сохранение экрана пользователя на диск -x067F ld a,#89 ;сообщение: enter name - call x06AD ;ввод текстовой строки внизу экрана - jr c,x06C1 ;ввод отменен - jr z,x06C1 ;пустая строка - ld b,#02 ;файл для записи - rst #30 - dw rom7_x11D4 ;открытие файла для внутренних нужд - db #07 - jr c,x06A6 ;ошибка открытия файла - rst #30 - dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 - db #02 - ld hl,#4000 - ld bc,#1B00 - rst #30 - dw rom2_x3107 ;запись области памяти в файл - db #02 - jr c,x06A6 ;ошибки записи - rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 - jr nc,x06C1 ;ошибокнет. выход - -;АДРЕС: #06A6 печать сообщения об ошибке и продолжение работы монитора -;вх: a - номер сообщения из блока 0 -x06A6 call x066C ;установка кода дисковой ошибки в переменной для печати числа -x06A9 rst #30 - dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора - db #02 ;(без возврата) - -;АДРЕС: #06AD ввод текстовой строки внизу экрана -;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 6-0,a - номер сообщения из блока 0 -;вых: cy=1 ввод отменен -; cy=0 строка введена -; z - введена пустая строка -x06AD rst #30 - dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана - db #05 - jr nc,x06BA ;строка введена - cp #03 ;break/cancel ? - scf - ret z ;отмена ввода - xor a - jr x06AD ;продолжение ввода строки -x06BA rst #30 - dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа - db #02 - scf - ccf - ret - -;АДРЕС: #06С1 печать текущего меню монитора (без возврата) -x06C1 rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;переход без возврата - -;АДРЕС: #06C5 вывод в порт #FE содержимое ячейки (#7530) -x06C5 ld a,(#7530) - out (#FE),a - ret - -;АДРЕС: #06CB таблица соответствий нажатой клавиши печатному символу -x06CB db "ZXCV" - db "ASDFG" - db "QWERT" - db "12345" - db "09876" - db "POIUY" - db #0D,"LKJH" - db " ",#80,"MNB" - -;АДРЕС: #06F2 таблица кодов клавиш cs+1+клавиша -x06F2 db #1A,#18,#03,#16 - db #01,#13,#04,#06,#07 - db #11,#17,#05,#12,#14 - db #FF,#FF,#FF,#FF,#FF - db #FF,#FF,#FF,#FF,#FF - db #10,#0F,#09,#15,#19 - db #FF,#0C,#0B,#0A,#08 - db #00,#FF,#0D,#0E,#02 - -;АДРЕС: #0719 таблица кодов клавиш ss+клавиша (ss+cs =#03) -x0719 db ":`?/" - db #8A,#8B,#8E,#8C,#8D - db #1C,#1D,#1E,"<>" - db "!@#$%" - db "_)('&" - db #22,";",#1F,"][" - db #FF,"=+-^" - db #82," .,*" - -;АДРЕС: #0740 таблица кодов клавиш cs+цифра -x0740 db #FF ;cs+1 - db #81 ;cs+2 - db #87 ;cs+3 - db #88 ;cs+4 - db #85 ;cs+5 - db #7F ;cs+0 - db #89 ;cs+9 - db #83 ;cs+8 - db #84 ;cs+7 - db #86 ;cs+6 - -;АДРЕС: #074A ожидание действий пользователя (опрос управления, вывод часов) -;вых: a - код нажатой клавиши -; -x074A call x078B ;сброс буфера клавиатуры -x074D ld hl,xE02E ;печать времени и даты - bit 0,(hl) - jr z,x075B - di - res 0,(hl) - rst #30 - dw rom5_x1A4C ;печать даты и времени в окне монитора - db #05 -x075B ei - call x0773 ;проверка наличия нажатых клавиш в буфере клавиатуры - jr z,x074D ;буфер пустой - di - ex de,hl - ld a,(de) ;читаем код клавиши из буфера - inc de - call x0780 ;проверка достижения конца буфера клавиатуры - ld (xE118),de - push af ;код клавиши - rst #30 - dw rom5_x0176 ;восстановление экрана под курсором мыши - db #05 - pop af - ret - -;АДРЕС: #0773 проверка наличия нажатых клавиш в буфере клавиатуры -;вых: z - буфер пустой -; de - очередной адрес в буфере -; hl - адрес начала буфера -; -x0773 ld de,(xE116) - -;АДРЕС: #0777 проверка наличия нажатых клавиш в буфере клавиатуры -;вх: de - адрес в буфере клавиатуры -;вых: z - буфер пустой -; hl - адрес начала буфера -; -x0777 ld hl,(xE118) - or a - push hl - sbc hl,de - pop hl - ret - -;АДРЕС: #0780 проверка переполнения буфера клавиатуры -;вх: de - очередной адрес в буфере клавиатуры -;вых: cy =0 адрес в пределах буфера -; =1 буфер переполнен. сброс буфера -; de - адрес начала буфера -; -x0780 ld hl,xE38F+#0A ;xE399 - or a - sbc hl,de - ret nc - ld de,xE38F - ret - -;АДРЕС: #078B сброс буфера клавиатуры -; -x078B ld hl,(xE118) - ld (xE116),hl - ret - -;АДРЕС: #0792 опрос клавиатуры и установка кода нажатой клавиши в буфере -; -x0792 call x07B2 ;опрос клавиатуры и установка кода нажатой клавиши - ld hl,xE005 - bit 2,(hl) - ret z ;ничего не нажато - ld a,(xE006) ;код клавиши - res 2,(hl) -x07A0 ld de,(xE116) ;помещение кода клавиши в буфер клавиатуры - ld (de),a - inc de ;нажатую клавишу в буфер клавиатуры - call x0780 ;проверка переполнения буфера клавиатуры - call x0777 ;проверка не был ли сброшен буфер - ret z ;буфер пустой - ld (xE116),de ;очередной адрес в буфере - ret - -;АДРЕС: #07B2 опрос клавиатуры и установка кода нажатой клавиши -;вых: a - код нажатой клавиши, если нажата -; -x07B2 call x0845 ;опрос клавиатуры - jr z,x07BA ;ничего не нажато - call x086A ;определение кода нажатой клавиши/комбинации клавиш -x07BA ld hl,xE005 - jr nz,x07C4 ;что-то нажато -x07BF res 0,(hl) ;автоповтор не активен -x07C1 res 1,(hl) ; - ret -x07C4 bit 0,(hl) - jr nz,x07D5 ;не первое нажатие, проверим возможность автоповтора - set 0,(hl) ;первое нажатие - ld (xE007),a - ld hl,(xE051) ;период автоповтора - ld h,l - ld (xE051),hl - ret -x07D5 ld e,a ;код клавиши - ld a,(xE007) - cp e - jr nz,x07BF ;другая клавиша, сброс счетчика автоповтора - bit 1,(hl) - jr nz,x0834 ;работает автоповтор - ld de,(xE051) ;счетчик периода автоповтора - dec d - ld (xE051),de - ret nz - set 1,(hl) ;активируем автоповтор - ld e,a ;код клавиши - ld a,(xE04E) ;антидребезговая задержка - ld (xE050),a - ld a,e -;обработка нажатой клавиши -x07F4 cp #80 - jr nz,x0804 - ld a,%01000000 ;cs+ss -x07FA xor (hl) - ld (hl),a - ld a,(xE04E) - ld (xE052),a - jr x07C1 -x0804 cp #81 - jr nz,x080C - ld a,#80 ;cs+2 - jr x07FA -x080C cp #82 - jr nz,x0817 - call x0916 ;ss+space - ld a,#00 - jr x07FA -;установка кода нажатой клавиши в переменную -x0817 bit 2,(hl) - ret nz - bit 5,(hl) - jr z,x082E ;???? возможно для ввода кириллицы - cp #40 - jr c,x082E ;a=[#00..#3F] - cp #80 - jr nc,x082E ;a=[#80..#FF] - cp #60 - jr nc,x082C ;a=[#60..#7F]+#60 - add a,#40 ;a=[#40..#5F]+#40+#60 -x082C add a,#60 -x082E ld (xE006),a ;код клавиши - set 2,(hl) - ret -x0834 ld de,(xE04F) ;счетчик автоповтора - dec d - ld (xE04F),de - ret nz ;до срабатывания автоповтора еще рано - ld d,e - ld (xE04F),de - jr x07F4 - -;АДРЕС: #0845 опрос клавиатуры -;вых: z - нажато много клавиш/не нажато ни одной -; nz - что-то нажато -; hl - адрес в буфере последней нажатой клавиши -; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4, -;соответсвие клавиш скан-кодам -;12345 67890 -;QWERT YUIOP -;ASDFG HJKLe -;cZXCV BNMss -; -;0F 10 11 12 13 18 17 16 15 14 -;0A 0B 0C 0D 0E 1D 1C 1B 1A 19 -;05 06 07 08 09 22 21 20 1F 1E -;00 01 02 03 04 27 26 25 24 23 -; -x0845 ld bc,#FEFE - ld hl,xDFEA-1 - ld de,#05FF -x084E in a,(c) - push bc - ld b,#05 -x0853 inc e - rrca - jr c,x085F ;не нажата - dec d - inc sp - inc sp - ret z - dec sp - dec sp - inc hl - ld (hl),e -x085F djnz x0853 - pop bc - sli b - jr c,x084E - ld a,d - sub #05 - ret - -;АДРЕС: #086A определение кода нажатой клавиши/комбинации клавиш -;вх: hl - адрес в буфере последней нажатой клавиши -; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4 -;вых: z - клавиша/комбинация клавиш не функциональна -; nz - на клавише/комбинации клавиш есть функция -; a - код нажатой клавиши/комбинации клавиш -; -x086A ld e,(hl) - ld a,d - sub #02 - jr z,x08AE ;нажато 3 клавиши - jr c,x088E ;нажато 4 клавиши - rra - jr c,x08C6 ;нажато 2 клавиши -;нажата 1 клавиша - ld a,e - or a - ret z ;нажата CapsShift - cp #24 - ret z ;нажата SymbolShift - ld d,#00 - ld hl,x06CB-1 ;таблица соответствий нажатой клавиши печатному символу - add hl,de - ld a,(hl) - cp #3A - ret c ;это не буква - ld hl,xE005 - bit 7,(hl) - ret nz - add a,#20 ;переводим в нижний регистр - ret -;нажато 4 клавиши -x088E ld hl,xDFEA - ld a,(hl) - or a - jr nz,x08C4 ;cs не нажата - inc hl - ld d,(hl) - inc hl - ld a,(hl) - cp #0F - jr nz,x08C4 ;cs+1 не нажата - ld a,e - sub #0F - cp d - jr nz,x08C4 -;cs+1+клавиша -x08A3 ld e,a - ld d,#00 - ld hl,x06F2-1 -x08A9 add hl,de - ld a,(hl) -;cs+цифра/ss -x08AB cp #FF ;это cs+1? - ret -;нажато 3 клавиши -x08AE ld hl,xDFEA ;буфер нажатых клавиш - ld a,(hl) - or a - jr nz,x08C4 ;cs не нажата - inc hl - ld a,(hl) - cp #0F - jr nz,x08BF ;1 не нажата - inc hl -x08BC ld a,(hl) - jr x08A3 ;cs+1+клавиша -x08BF ld a,e - cp #0F - jr z,x08BC ;cs+1+клавиша -x08C4 xor a ;неизвестная комбинация - ret -;нажато 2 клавиши -x08C6 dec hl - ld a,(hl) ;код первой клавиши - or a - jr z,x08DC ;это CapsShift - cp #24 - jr z,x08D5 ;это SymbolShift - ld a,e - ld e,(hl) - cp #24 - jr nz,x08C4 ;вторая клавиша не SymbolShift -x08D5 ld d,#00 ;ss+клавиша - ld hl,x0719-1 - jr x08A9 -; комбинация с CapsShift -x08DC ld hl,x06CB-1 - ld a,e - cp #23 - jr z,x090F ;cs+space - cp #0F - jr c,x08F2 ;cs+буква - cp #19 - jr nc,x08F2 ;cs+буква/ss/enter - ld hl,x0740 ;cs+цифра - sub #0F - ld e,a -x08F2 ld d,#00 - add hl,de - ld a,(hl) - cp #3F - ret c ;если cs+enter - cp #7F - jr z,x0909 ;cs+0 - jr nc,x08AB ;cs+цифра/ss - ld hl,xE005 ;cs+буква - bit 7,(hl) - jr z,x0909 - add a,#20 ;CapsLock включен, переводим в нижний регистр - ret -x0909 cp #80 ;cs+ss - ret nz - cp #81 ;cs+2 - ret -;нажата cs+space -x090F call x078B - ld a,#03 - jr x0909 -;нажата ss+space (???режим рисования рамок) -;hl=xE005 -x0916 bit 5,(hl) - ld a,#05 - jr z,x091E - ld a,#07 -x091E ld (xE053),a ;цвет бордюра при подаче звукового сигнала - ret - -;продолжение RST #08:db #8B загрузка zs-snap с диска -x0922 db "bootm",#00 -;вх: a - номер дисковода 0..3 -x0928 ld a,(xDD7F+#01) ;xDD80 регистр A пользователя - add a,"A" - ld (de),a - inc de - ld a,":" - ld (de),a - inc de - push hl - ld hl,x0922 - ld bc,#0006 - ldir - pop hl - jr x095B - -;АДРЕС: #093F RST #08:db #8B загрузка zs-snap с диска -;вх: +1 =#00 используем имя bootm -; a - номер дисковода -;вх: +1 ="filename",#00 - имя файла -x093F ld b,#00 - ld hl,(xDD6B) ;pc программы пользователя - ld de,xEBF5 - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - inc hl - or a - jr z,x0928 ;имя файла по умолчанию - -;читаем имя файла из памяти пользователя -x094F ld (de),a - inc de - or a - jr z,x095B - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - inc hl - djnz x094F -x095B ld (xDD6B),hl ;новый pc программы пользователя - ld hl,xEBF5 ;адрес строки с именем файла - res 6,(iy+#13) ;чтение - res 5,(iy+#0B) ;функции вызываются из монитора - ld b,#01 - jr x098D ;чтение snap - -;АДРЕС: #096D копирование активного экрана пользователя в #4000 -x096D rst #30 - dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 - db #02 - ret - -;АДРЕС: #0972 печать текущего меню монитора (без возврата) -x0972 rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;переход без возврата - -;АДРЕС: #0976 загрузка zs-snap (S. load ... snap) -x0976 res 6,(iy+#13) - ld b,#01 - jr x0984 - -;АДРЕС: #097E сохранение zs-snap (S. save ... snap) -x097E set 6,(iy+#13) - ld b,#02 -x0984 push bc - ld a,#89 - call x06AD ;ввод текстовой строки внизу экрана - pop bc - jr c,x0972 ;ввод отменен -x098D rst #18 - dw rom7_x11D4 ;открытие файла для внутренних нужд R8DOS #14 - jr c,x09B4 ;ошибка открытия файла - ld l,(ix+#0E) ;ix - адрес буфера fcb - ld h,(ix+#0F) ;l - номер первого сектора файла - ld (xE7C5),hl ;h - номер первой дорожки файла - bit 6,(iy+#13) - push af - call nz,x096D ;если запись файла, копирование активного экрана пользователя в #4000 - pop af - push af - jr nz,x09AE ;запись файла - -;чтение файла - rst #18 - dw rom7_x1365 ;последовательное чтение очередного сектора из файла R8DOS #1C - jr c,x09B4 ;ошибка открытия файла - jr x09BD - -;запись файла -x09AE ld bc,#0100 ;новый указатель - rst #18 - dw rom7_x1405 ;новое значение указателя в файле R8DOS #20 -x09B4 jp c,x06A6 ;ошибка чтения/записи - ld hl,xE8A9 ;заголовок файла - call x0678 ;занулим это заголовок (#100 байт) -x09BD pop af - ld hl,xE8A9 ;заголовок файла - call x0D6D ;установка/восстановление параметров заголовка zs-snap - rst #30 - dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld a,#02 - bit 6,(iy+#13) - jr z,x09F6 ;чтение файла -;запись файла -; RAM 2 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без -; RAM 5 - ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - rst #30 - dw rom2_x0606 ;копирование страницы 5 в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 -; RAM активная страница при входе в монитор - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - rst #30 - dw rom2_x0606 ;копирование страницы пользователя в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - jr x0A2D - -;чтение файла -x09F6 set 3,(iy+#13) - call x0B71 ;расчет начала битовой карты параграфов заданной страницы - call x0D01 ;определение адреса загрузки страницы в памяти - ld a,h - sub #80 - jr z,x0A0F ;пустая страница. не загружаем - inc a - ld b,a - ld c,#00 - rst #30 ;!!! можно через rst #18 вызвать - dw rom7_x1405 ;новое значение указателя в файле R8DOS #22 - db #07 - jr c,x0A86 ;ошибка чтения -; RAM 5 -x0A0F ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 -; RAM активная при входе в монитор - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - -;проверка режима памяти 48k/128-256k -x0A2D rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - jr c,x0A86 ;ошибки чтения/записи - bit 5,(iy-#02) - call nz,x0D59 ;включение режима 48k only - jp nz,x0A9D ;режим 48k only. завершение загрузки/сохранения zs-snap -;загрузка остальных страниц - ld (ix+#07),#2F - xor a - push af - call x0B41 ;откроем следующий файл zs-snap - pop af -x0A46 push af - cp #02 - jr z,x0A8B ;ram 2 уже сохранена - cp #05 - jr z,x0A8B ;ram 5 уже сохранена - cp #08 - jr z,x0A8B ;ram 8 не сохраняем - cp #09 - jr z,x0A8B ;ram 9 не сохраняем - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld l,a - rst #30 - dw rom2_x3707 ;сравнение страницы пользователя с заданной - db #02 - jr z,x0A8B ;страница пользователя уже загружена/сохранена -; загрузка/сохранение очередной страницы - ld a,l - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - bit 6,(iy+#13) - jr z,x0A75 ;загрузка страницы - rst #30 - dw rom2_x0606 ;копирование страницы пользователя в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - jr x0A7C -x0A75 call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 -x0A7C ld a,(xE7A9+#14) ;указатель в файле (старший байт) - cp #BE - jr c,x0A8B - rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 -x0A86 jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - call x0B41 ;откроем следующий файл zs-snap -;следующая страница -x0A8B pop af - inc a - cp #10 - jr c,x0A46 ;еще не все загружено - ld hl,(xE7A9+#13) ;указатель в файле (младший байт) - ld a,h - or e - jr z,x0A9D - rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - -;завершение загрузки/сохранения zs-snap -x0A9D bit 6,(iy+#13) - jr z,x0AB2 ;чтение файла -; запись заголовка zs-snap - ld hl,xE8A9 ;адрес заголовка - ld de,(xE7C5) ;номер первого сектора/дорожки файла - ld bc,#0106 - rst #18 - dw rom7_x0229 ;вызов функции R8DOS -x0AB0 jr c,x0B2E ;ошибки записи -; чтение файла -x0AB2 call x0AC8 ;загрузка RAM 2 из файла zs-snap - bit 6,(iy+#13) - ret nz ;запись zs-snap -x0ABA bit 2,(iy+#14) - ret nz ; - rst #30 - dw rom2_x013A ;выход из монитора - db #02 ;без возврата - -;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x0AC3 rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ret - -;загрузка RAM 2 из файла zs-snap -x0AC8 ld hl,(xE7C5) ;номер первого сектора/дорожки файла zs-snap - inc l ;следующий сектор - bit 4,l - res 4,l - jr z,x0AD3 - inc h ;следующая дорожка -x0AD3 ld (xE7C5),hl - ld a,#02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0D01 ;определение адреса загрузки страницы в память/кол-ва секторов - bit 7,(iy+#13) - jr z,x0B10 ;без компрессии -; с компрессией - ld a,(de) - ld (xE33B),a ;размер в секторах запакованной страницы - ld a,h - sub #80 - jr nz,x0AF2 ;надо что-то загрузить - call x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 - jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход -; загружаем запакованную страницу -x0AF2 ld hl,x0C50 ;процедура загрузки секторов страницы в буфер xE5A9 - call x0D60 ;установка п/п jp x0C50 по адресу xE338 - ld hl,xE5A9 ;адрес буфера откуда распаковывать - ld de,xE5A9+#200 ;первая свободная ячейка в буфере (de-hl длина запакованного блока) - exx - ld hl,#8000 ;адрес куда распаковывать - call x1108 ;загрузка и распаковка блока длиной #100 - ld hl,#4000 - or a - sbc hl,bc - jr z,x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход - jp x0BEF ;ошибка. размер распакованного блока не равен размеру страницы -; без компрессии -x0B10 push hl - ld a,h - sub #80 - jr z,x0B28 ;пустая страница -; загружаем страницу - push de - ld b,a ;количество секторов - ld hl,#8000 - ld de,(xE7C5) ;номер первого сектора/дорожки странцы zs-snap - ld c,#05 - rst #18 - dw rom7_x0229 ;вызов функции R8DOS. загрузка секторов - jp c,x0B3B ;ошибки чтения - pop de -x0B28 pop hl - call x0C0C ;распределение загруженной страницы по памяти с учетом пустых параграфов - jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход - -;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход -x0B2E push af - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - cp #02 - jr z,x0B3A ;2я страница уже сохранена - call x0AC8 ;загрузка RAM 2 из файла zs-snap -x0B3A pop af -x0B3B call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - jp x06A6 ;печать сообщения об ошибке и продолжение работы монитора - -;формирование следующего имени файла для zs-snap -x0B41 push de - push hl - ld hl,xE7A9 ;буфер fcb - ld b,#07 -x0B48 ld a,(hl) ;замена пробелов в имени файла подчерками - cp " " - jr nz,x0B4F - ld (hl),"_" -x0B4F inc hl - djnz x0B48 - inc (ix+#07) ;последний символ имени файла +1 - ld hl,#0000 - ld (xE7A9+#13),hl ;стартовый адрес - ld (xE7A9+#0C),hl ;адрес буфера dma - rst #18 - dw rom7_x11DF ;открыть файл для последующих операций с ним - ld hl,xE027 - set 3,(hl) - jr nc,x0B6E ;не было ошибок - bit 6,(hl) - jr nz,x0B2E ;ошибки при записи. восстановление RAM 2, печать сообщения и выход - res 3,(hl) -x0B6E pop hl - pop de - ret - -;АДРЕС: #0B71 расчет начала битовой карты параграфов заданной страницы -;вх: a - номер страницы -;вых: de - адрес начала битовой карты параграфов заданной страницы -x0B71 push hl - jr x0B9F - -;АДРЕС: #0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) -;вх: a - номер страницы -;вых: de - адрес начала битовой карты параграфов заданной страницы -x0B74 push hl - push ix - ld l,a - ld h,#00 - push af - rst #30 - dw rom2_x3732 ;установка страницы пользователя равной номеру страницы в L - db #02 - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 -x0B83 bit 6,(iy+#13) - ld hl,rom5_x1095 ;сообщение: Saved RAM bank_ - jr nz,x0B8F ;запись - ld hl,rom5_x10AB ;сообщение: Loaded RAM bank_ -x0B8F rst #30 - dw rom5_x1061 ;печать закодированного сообщения из hl - db #05 - pop af - push af - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - rst #20 - db " " - db #82 ;восстановление атрибутов - pop af - pop ix -;a - номер страницы -x0B9F add a,a - add a,a - add a,a - ld hl,xE8A9+#40 ;xE8E9 - call x1103 ;сложение hl=hl+a - ex de,hl - pop hl - ret - -;ошибка: undefined file -x0BAB call x0AC8 ;загрузка RAM 2 из файла zs-snap - call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,#54 ;ошибка undefined file - jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора - -;загрузка страницы zs-snap с адреса #8000 -x0BB6 call x0D01 ;определение адреса загрузки страницы в память - bit 7,(iy+#13) - jr z,x0BF4 ;без компрессии -; с компрессией - ld a,(de) - ld (xE33B),a ;количество секторов для загрузки - ld a,h - sub #80 - jr nz,x0BD5 ;есть что загружать -;заполнение памяти [#8000..#BFFF] байтом в A -;вх: a - байт для заполнения -x0BC8 ld hl,#8000 - ld (hl),a - ld de,#8001 - ld bc,#3FFF - ldir - ret -;загрузка и распаковка страницы с компрессией -x0BD5 ld hl,x0C41 ;процедура загрузки секторов в буфер hl - call x0D60 ;установка п/п jp x0C41 по адресу xE338 - ld hl,xE5A9 - ld de,xE5A9+#200 - exx - ld hl,#8000 - call x1108 ;загрузка и распаковка блока длиной #100 - ld hl,#4000 - or a - sbc hl,bc - ret z ;загружена вся страница -;ошибка чтения/записи -x0BEF ld a,#55 - jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора -;загрузка страницы без компрессии -x0BF4 push hl - ld a,h - sub #80 - jr z,x0C0B ;пустая страница -; загрузка страницы - push de - bit 3,(iy+#13) - jr z,x0BAB ;ошибка: undefined file - call x0CE3 ;установка размера буфера dma - rst #18 - dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов -x0C07 jp c,x0B2E ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - pop de -x0C0B pop hl - -;распределение загруженной страницы по памяти с учетом пустых параграфов -;вх: hl - адрес загрузки -; de - адрес битовой карты следующей страницы (для незапакованного файла) -x0C0C push hl - ex de,hl - ld c,#01 - exx - pop hl - dec hl - ld de,#BFFF -x0C16 exx - dec c - jr nz,x0C1E - ld c,#08 - dec hl - ld b,(hl) -x0C1E rlc b - exx - jr c,x0C35 ;копируем параграф на свое место -; параграф пустой. зануляем его - push hl - ld h,d - ld l,e - dec de - ld bc,#00FF - ld (hl),#00 - lddr - pop hl - ld a,d - cp #7F - ret z ;конец страницы - jr x0C16 ;следующий параграф -; копируем параграф на свое место -x0C35 xor a - sbc hl,de - add hl,de - ret z ;конец страницы - ld bc,#0100 - lddr - jr x0C16 ;следующий параграф - -;загрузка секторов в буфер hl -;вх: (xE7C5) - дорожка/сектор откуда грузить -; hl - адрес загрузки -; b - размер блока в секторах -;вых: (xE7C5) - следующие дорожка/сектор -x0C41 ld (ix+#15),l - ld (ix+#16),h - call x0C7D ;вычисление размера блока для загрузки - rst #18 - dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов - jr c,x0C07 ;ошибка чтения - ret - -;загрузка секторов в буфер hl -;вх: (xE7C5) - дорожка/сектор откуда грузить -; hl - адрес загрузки -; b - размер блока в секторах -;вых: (xE7C5) - следующие дорожка/сектор -x0C50 push hl - call x0C7D ;вычисление размера блока для загрузки - ld de,(xE7C5) ;дорожка/сектор - push de - ld a,b - and #F0 - rrca - rrca - rrca - rrca - add a,d - ld d,a - ld a,b - and #0F - add a,e - bit 4,a - jr z,x0C6B - inc d -x0C6B and #0F - ld e,a - ld (xE7C5),de ;следующие дорожка/сектор - pop de - ld c,#05 - pop hl - rst #18 - dw rom7_x0229 ;вызов функции R8DOS. загрузка блока секторов - jp c,x0B3B ;ошибка загрузки - ret - -;вычисление размера блока для загрузки -;вх: (xE33B) размер блока в секторах -; b - размер блока в секторах -;вых: (xE33B) оставшийся размер блока в секторах -; b - размер блока в секторах для загрузки -x0C7D ld hl,xE33B - ld a,(hl) - or a - jp z,x0BEF ;ошибка. нечего загружать - sub b - jr nc,x0C8A - ld b,(hl) - xor a -x0C8A ld (hl),a - ret - -;запись страницы с адреса #8000 на диск, с компрессией/без -;вх: de - адрес начала битовой карты параграфов -x0C8C bit 5,(iy+#13) - jr z,x0CD5 ;компрессия отключена -;запись с компрессией - inc de - ex de,hl - ld (xE33B),hl - xor a - ld (hl),a - ld hl,#8000 - ld bc,#4000 -x0C9F cpi - jr nz,x0CA7 ;в странице есть ненулевые байты - jp pe,x0C9F ;еще не конец - ret -; в странице есть ненулевые байты -x0CA7 ld hl,x0CED ;адрес процедуры - call x0D60 ;установка п/п jp x0CED по адресу xE338 - ld hl,xE5A9 - ld de,xE5A9+#100 - exx - ld hl,#8000 - ld e,(iy+#26) ;размер окна сжатия для снапа - ld d,l - ld b,#03 -x0CBD sla e - rl d - djnz x0CBD - ld bc,#4000 - call x0F60 ;запаковка блока -;hl - адрес запакованного блока -;bc - размер запакованного блока - ret z ;пустая страница - ld a,c - or a - jr z,x0CCF - inc b -x0CCF call x0CED ;запись запакованой страницы - dec hl - ld (hl),c ;количество байт в последнем секторе =#00 - 256 байт - ret -;компрессия отключена -;вх: de - адрес начала битовой карты параграфов -x0CD5 call x0D20 ;уплотнение памяти, за счет пустых параграфов - ret z ;страница пустая - call x0CE3 - rst #18 - dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов -x0CDF jp c,x0B2E ;ошибка - ret -;установка размера области -;вх: a - кол-во параграфов с учетом уплотнения -x0CE3 ld b,a - ld (ix+#15),#00 - ld (ix+#16),#80 - ret -;запись запакованой страницы -;вх: ix - адрес буфера fcb -; b - число записываемых секторов -; hl - адрес запакованного блока -x0CED ld (ix+#15),l - ld (ix+#16),h - push bc - rst #18 - dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов - jr c,x0CDF ;ошибка записи - pop bc - ld hl,(xE33B) ;адрес начала битовой карты параграфов - ld a,b - add a,(hl) - ld (hl),a ;количество секторов в запакованной странице - ret - -;определение адреса загрузки страницы в памяти -;вх: de - адрес битовой карты параграфов для текущей страницы -;вых: h =#80+кол-во секторов страницы (для запакованного файла) -; hl - адрес начала загрузки (для незапакованного файла) -; de - адрес битовой карты следующей страницы (для незапакованного файла) -; de - адрес ячейки с размером страницы в секторах (для запакованного файла) -x0D01 ld bc,#4001 - ld hl,#8000 - bit 7,(iy+#13) - jr z,x0D12 ;без компрессии - inc de - ld a,(de) ;количество секторов - add a,h - ld h,a - ret -x0D12 dec c - jr nz,x0D19 - ld c,#08 - ld a,(de) - inc de -x0D19 rrca - jr nc,x0D1D - inc h -x0D1D djnz x0D12 - ret - -;уплотнение памяти [#8000..#BFFF], за счет пустых параграфов -;построение битовой карты параграфов в области [#8000..#BFFF] -;вх: de - адрес начала битовой карты параграфов -;вых: a - кол-во параграфов с учетом уплотнения -; z - вся область пустая -x0D20 ld c,#08 - ex de,hl - exx - ld hl,#8000 - ld d,h - ld e,l -x0D29 xor a ;проверка параграфа на ноль - ld b,a -x0D2B cp (hl) - jr nz,x0D46 ;не пустой - inc hl - djnz x0D2B -x0D31 exx ;все #100 байт =#00 - rra ;установка бита для карты параграфов - rr b - dec c - jr nz,x0D3C - ld c,#08 ;запись байта карты параграфов - ld (hl),b - inc hl -x0D3C exx - ld a,h - cp #C0 - jr nz,x0D29 - ld a,d - sub #80 - ret -x0D46 xor a ;уплотнение памяти, за счет пустых параграфов - ld l,a - ld c,a - ld b,a - sbc hl,de - add hl,de - jr z,x0D55 - inc b - ldir -x0D52 cpl - jr x0D31 -x0D55 inc h - inc d - jr x0D52 - -;АДРЕС: #0D59 включение режима 48k only -x0D59 push af - rst #30 - dw rom2_x0665 ;включение режима 48k only - db #02 - pop af - ret - -;АДРЕС: #0D60 установка п/п jp #addr по адресу xE338 -;вх: hl - адрес п/п -x0D60 push de - ex de,hl - ld hl,xE338 - ld (hl),#C3 - inc hl - ld (hl),e - inc hl - ld (hl),d - pop de - ret - -;АДРЕС: #0D6D установка/восстановление параметров заголовка zs-snap -;вх: z - чтение файла -; nz - запись файла -; hl,xE8A9 - буфер заголовка файла -x0D6D push af - jr nz,x0D93 ;запись файла -;чтение файла - ex de,hl - ld a,(de) - inc de - ld hl,xE027 - res 7,(hl) - cp #4D - jr z,x0D85 ;без компрессии - set 7,(hl) - cp #41 -x0D80 ld a,#55 - jp nz,x06A9 ;печать сообщения об ошибке и продолжение работы монитора -x0D85 ex de,hl - ld a,(hl) - and #FD - cp #31 - jr nz,x0D80 ;ошибка - ld a,(hl) - ld (iy-#12),a - jr x0DA8 -;запись файла -x0D93 ex de,hl - ld hl,xE027 - ld a,#4D ;=#4D - без компрессии - res 7,(hl) - bit 5,(hl) - jr z,x0DA3 ;compression off - ld a,#41 ;=#41 - с компрессией - set 7,(hl) -x0DA3 ex de,hl - ld (hl),a - inc hl - ld (hl),#33 -x0DA8 inc hl - pop af - ld de,xDD69 - ld bc,#001E - jr z,x0DB3 ;чтение файла - ex de,hl -x0DB3 ldir - jr nz,x0DB8 ;запись файла - ex de,hl -x0DB8 jr nz,x0DD9 ;запись файла - ld a,(de) - inc de - ld hl,xE02D - bit 7,(hl) - jr z,x0DCB ;турбо-режим не доступен - res 6,(hl) ;выключим турбо - bit 6,a - jr z,x0DCB ;в снапе турбо выключено - set 6,(hl) ;включим турбо -x0DCB ld a,(de) - im 1 ;установим режим прерываний - dec a - jr z,x0DD3 - im 2 -x0DD3 inc de - ld a,(de) - out (#FE),a ;установим бордюр - jr x0DF3 -;запись файла -x0DD9 ld a,(xE02D) - ld (de),a - inc de - push de - rst #30 - dw rom2_x3B75 ;определение типа прерываний im 1/2 - db #02 - pop de - ld (de),a - inc de - ld hl,#5800 - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - rrca - rrca - rrca - and #07 - ld (de),a -x0DF3 inc de - bit 6,(iy+#13) - ld hl,x0E35 - ld b,#03 -x0DFD push bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - jr nz,x0E08 ;запись файла - ld a,(de) ;восстановление переменных - ld (bc),a - jr x0E0A -x0E08 ld a,(bc) ;сохранение переменных - ld (de),a -x0E0A inc de - pop bc - djnz x0DFD - bit 1,(iy-#12) - ret z -;чтение/сохранение регистров AY - ld b,#FF - dec de -x0E16 inc de - ld a,b -x0E18 inc a - cp #0E - ret nc - cp #07 - jr z,x0E18 - ld b,a - bit 6,(iy+#13) - jr nz,x0E2E ;запись файла - ld a,(de) - rst #30 - dw rom2_x03A7 ;Запись регистра AY - db #02 - jr x0E16 -x0E2E rst #30 - dw rom2_x03B6 ;чтение регистра AY - db #02 - ld (de),a - jr x0E16 -;адреса переменных -x0E35 dw xE004 ;адрес содержимого регистра 7 AY - dw xE012 ;адрес состояния порта #7FFD - dw xE013 ;адрес состояния порта #1FFD - -;АДРЕС: #0E3B загрузка из ROM-disk -;вх: h - номер страницы с файлом -; l - смещение в параграфах от начала ROM-disk в этой странице -x0E3B res 6,(iy+#13) - ld (xE000),hl ;сохраним координаты файла - ld hl,xE8A9 ;куда грузим (буфер dma в записи fcb) - ld (xE7BE),hl - ld b,#01 ;1 параграф. заголовок файла - push hl - call x0EE6 ;загрузка блока из ROM-disk - ld (xE7C5),hl ;hl - координаты следующего блока файла (RAM 2) - pop hl - bit 6,(iy+#13) - call x0D6D ;восстановление параметров из заголовка zs-snap - ld hl,xE012 - ld a,(hl) - ld (xE00C),a ;копия порта #7FFD - res 5,(hl) ;режим 128k - rst #30 - dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld a,#02 ;номер страницы - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - bit 5,(iy-#08) - jp nz,x0EC1 ;режим 48k. конец загрузки - xor a -x0E94 push af - cp #02 - jr z,x0EBB ;RAM 2 пропускаем - cp #05 - jr z,x0EBB ;RAM 5 пропускаем - cp #08 - jr z,x0EBB ;RAM 8 пропускаем - cp #09 - jr z,x0EBB ;RAM 9 пропускаем - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld l,a - rst #30 - dw rom2_x3707 ;сравнение страницы пользователя с заданной - db #02 - jr z,x0EBB ;RAM пользователя пропускаем - ld a,l - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 -x0EBB pop af - inc a - cp #10 - jr c,x0E94 -;загрузка страниц законцена. грузим RAM 2 -x0EC1 ld hl,(xE7C5) ;координаты страницы RAM 2 - ld (xE000),hl - ld a,#02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,(xE00C) - ld (xE012),a - bit 5,a - call nz,x0D59 ;включение режима 48k only - jp x0ABA ;выход из монитора - -;АДРЕС: #0EE0 загрузка блока из ROM-disk -;вх: hl - адрес загрузки -; b - размер блока в секторах -;вых: hl - координаты следующего блока файла -; b - осталось незагруженных параграфов -x0EE0 ld (xE7A9+#15),hl ;xE7BE куда грузим - call x0C7D ;коррекция размера блока для загрузки - -;АДРЕС: #0EE6 загрузка блока из ROM-disk -;вх: b - кол-во параграфов для загрузки -;вых: hl - координаты следующего блока файла -x0EE6 xor a - ld hl,xDD99 ;формируем процедуру вызова п/п из страницы с ROM-disk - ld (hl),#F7 ;rst #30 - inc hl - ld (hl),#73 ;dw #0073 = romROMx0073 - inc hl - ld (hl),a - inc hl - ld (hl),a ;db #00 - inc hl - ld (hl),#C9 ;ret - ld hl,(xE000) ;координаты файла -x0EF9 ld a,h - ld (xDD9B+#01),a ;xDD9C плоскость и страница в которой выбранная прогармма - call xDD99 ;загрузка блока из ROM-Disk - inc b - dec b - jr nz,x0EF9 ;загрузка из следующей страницы - ld (xE000),hl ;координаты следующего блока файла - ret - -;АДРЕС: #0F08 загрузка страницы из ROM-disk в память #8000 -;вх: de - адрес битовой карты параграфов -x0F08 call x0D01 ;определение адреса загрузки страницы в памяти - bit 7,(iy+#13) - jr z,x0F38 ;без компрессии -; загрузка снапа с компрессией - ld a,(de) - ld (xE33B),a ;размер страницы в секторах - ld a,h - sub #80 - jp z,x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 - ld hl,x0EE0 ;процедура для загрузки блока из ROM-disk - call x0D60 ;установка п/п jp x0EE0 по адресу xE338 - ld hl,xE5A9 ;буфер для распаковки - ld de,xE5A9+#200 - exx - ld hl,#8000 - call x1108 ;распаковка блока - ld hl,#4000 - or a - sbc hl,bc - ret z - jp x0BEF ;ошибка чтения/записи -; загрузка снапа без компрессии -x0F38 push hl - ld a,h - sub #80 - jr z,x0F4A ;нечего грузить - push de - ld b,a ;кол-во параграфов для загрузки - ld hl,#8000 - ld (xE7A9+#15),hl ;адрес загрузки - call x0EE6 ;загрузка блока в память - pop de -x0F4A jp x0C0B ;распределение загруженной страницы по памяти с учетом пустых параграфов - -;АДРЕС: #0F4D заполнение области памяти [#4000..#7FFF] пользователя -x0F4D ld hl,#4000 - xor a -x0F51 ld b,#00 -x0F53 rst #30 - dw rom2_x0000 ;запись байта в память пользователя (rst #00) - db #02 - inc hl - djnz x0F53 - inc a - cp #40 - ret z - jr x0F51 - -;АДРЕС: #0F60 запаковка блока -;вх: hl - адрес окуда запаковывать -; de - размер окна сжатия *8 -; bc - размер области запакорвки -; hl',de' - адреса буферов -x0F60 ld (xDD89),hl - exx - ld (xE9DF),hl - ld (xE9E1),de - call x10D0 ;bc'=hl; hl'=hl+1; de'=#0000 - ld a,c - or b - jp z,x1083 ;конец области сохранения - ld a,#01 - call x10B9 - ld a,(hl) - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - ld (iy-#15),#FF - res 0,(iy+#0E) - jr x0F89 -x0F86 pop hl -x0F87 pop bc - pop de -x0F89 inc hl - dec bc - ld (iy-#16),#00 - ld a,b - or a - jr nz,x0F9B ;не последний параграф - ld (iy-#15),c - ld a,c - or a - jp z,x1083 ;данных больше нет -x0F9B push de - push bc - push hl - ld b,d - ld c,e - bit 0,(iy+#0E) - jr nz,x0FB9 - ld de,(xDD89) - sbc hl,de - ld d,h - ld e,l - or a - sbc hl,bc - jr c,x0FB7 - set 0,(iy+#0E) -x0FB7 ld b,d - ld c,e -x0FB9 ld a,b - or c - jr z,x0FF2 - pop hl - ld a,(hl) - push hl - sbc hl,bc - cpir - jr nz,x0FF2 - pop de - push de - inc de - push bc - ld b,(iy-#15) - ld c,b - dec b - jr z,x0FDC -x0FD1 ld a,(de) - cp (hl) - inc hl - inc de - jr nz,x0FDC - djnz x0FD1 - jr x0FDC -x0FDB dec b -x0FDC ld a,c - sub b - cp (iy-#16) - pop bc - jr z,x0FB9 - jr c,x0FB9 - ld (iy-#16),a - ld (xDDA7),bc - cp (iy-#15) - jr nz,x0FB9 -x0FF2 ld bc,(xDDA7) - inc bc - ld a,(iy-#16) - cp #02 - jr c,x1076 - jr z,x1002 - jr x1009 -x1002 ld hl,#00FF - sbc hl,bc - jr c,x1076 -x1009 dec a - ld e,a - pop hl - call x1103 ;сложение hl=hl+a - ex (sp),hl - xor a - ld d,a - sbc hl,de - ex (sp),hl - push hl - xor a - call x10B9 - or a - ld hl,#00FF - sbc hl,bc - ld a,(iy-#16) - ld e,a - jr c,x1042 - cp #06 - jr nc,x1042 - dec e - dec e - xor a - call x10B9 - ld a,e - rrca - call x10B9 - ld a,e - call x10B9 - ld a,c - neg - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x1042 push af - xor a - ld h,a - ld l,a - sbc hl,bc - inc a - call x10B9 - ld a,l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - ld b,#05 -x1052 sra h - rr l - djnz x1052 - ld a,l - and #F8 - ld l,a - pop af - cp #0A - jr nc,x106A - dec a - dec a - or l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x106A push af - ld a,l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - pop af - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x1076 ld a,#01 - call x10B9 - pop hl - ld a,(hl) - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F87 -;конец области сохранения -x1083 xor a - push af - call x10B9 - pop af - inc a - push af - call x10B9 - pop af - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - xor a - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - xor a - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - exx - ld a,#08 - sub d - jr z,x10A7 - push bc - ld b,a -x10A2 srl e - djnz x10A2 - pop bc -x10A7 ld a,e - ld (bc),a - ld de,(xE9DF) - or a - sbc hl,de - ex de,hl - ld c,e - ld b,d - ret -;запись байта в буфер ld (hl'),a; inc hl' -x10B4 exx - ld (hl),a - inc hl - exx - ret -x10B9 exx - rra - rr e - inc d - bit 3,d - exx - ret z - exx - ld a,e - ld (bc),a - ld de,(xE9E1) - or a - push hl - sbc hl,de - pop hl - jr nc,x10D8 -;установка регистров -;вх: hl - адрес буфера -;вых: bc'=hl -; hl'=hl+1 -; de'=#0000 -x10D0 ld c,l - ld b,h - inc hl - ld de,#0000 - exx - ret -x10D8 exx - push hl - push de - push bc - exx - ld de,(xE9DF) - push de - push de - sbc hl,de - push hl - ld l,#00 - push hl - ex de,hl - ld c,e - ld b,d - call xE338 - pop de - pop bc - pop hl - add hl,de - pop de - xor a - ld b,a - or c - jr z,x10FB - ldir -x10FB ex de,hl - exx - pop bc - pop de - pop hl - exx - jr x10D0 - -;АДРЕС: #1103 сложение hl=hl+a -x1103 add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #1108 распаковка блока -;вх: hl - адрес куда распаковывать -; hl' - адрес буфера откуда распаковывать -; de' - первая свободная ячейка в буфере (de-hl длина запакованного блока) -;вых: bc - размер распакованного блока -x1108 ld (xDD89),hl ;куда распаковывать - exx - ld (xE9DF),hl ;откуда распаковывать - ex de,hl - or a - sbc hl,de - ld (xE9E1),hl ;размер запакованного блока - call x1194 - exx - call x117A - ex de,hl -x111E call x1174 - jr nc,x112A - call x1185 - ld (de),a - inc de - jr x111E -x112A call x1174 - jr c,x114A - ld c,#00 - call x1174 - rl c - call x1174 - rl c - inc c - inc c - call x1185 - ld l,a - ld h,#FF -x1143 ld b,#00 - add hl,de - ldir - jr x111E -x114A call x1185 - ld l,a - call x1185 - ld c,a - or #07 - rrca - rrca - rrca - ld h,a - ld a,#07 - and c - inc a - inc a - ld c,a - cp #02 - jr nz,x1143 - call x1185 - ld c,a - or a - jr nz,x1143 - - ld hl,(xDD89) - push de - ex de,hl - sbc hl,de - ld c,l - ld b,h - pop de - ret -x1174 exx - srl e - dec d - exx - ret nz -x117A push af - call x1185 - exx - ld e,a - pop af - ld d,#08 - exx - ret -x1185 exx - ld a,b - or c - jr z,x118F -x118A ld a,(hl) - inc hl - dec bc - exx - ret -x118F call x1194 - jr x118A -x1194 exx - push hl - push de - push bc - exx - push de - ld hl,(xE9DF) - push hl - ld bc,(xE9E1) - push bc - call xE338 - pop bc - pop hl - pop de - exx - pop bc - pop de - pop hl - exx - ret - -;неиспользуемая область -x11AF ds #51,0 - -;АДРЕС: #1200 ROM-disk -x1200 INCBIN "prof_roms/rom6_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM6.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom6.bat b/ProfRom_Disasm/rom6.bat deleted file mode 100755 index 3991554..0000000 --- a/ProfRom_Disasm/rom6.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom6.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom7.a80 b/ProfRom_Disasm/rom7.a80 deleted file mode 100755 index 2f4fe78..0000000 --- a/ProfRom_Disasm/rom7.a80 +++ /dev/null @@ -1,5903 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #2500 - -;#0000 *NOT USED* (#30 байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#0041 *NOT USED* (#25 байт) -;#0066 обработка NMI (зависание с желто-черным бордюром) -;#006F *NOT USED* (#01 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;не используется #00BF вероятно что-то для контроллера прерываний -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#010E вызов процедуры из другого rom -;не используется #0127 вызов процедуры из rom 2 call x0127: dw addr -;не используется #0146 работа с контроллером прерываний -;не используется #015F работа с контроллером прерываний -;не используется #0180 работа с контроллером прерываний -;не используется #018B работа с контроллером прерываний -;не используется #0193 работа с контроллером прерываний -;#01AF автостарт с дискеты -;#0229 вызов функции R8DOS -;#029C R8DOS #00(0) сброс контроллера -;#02BE код time-out -;без вызовов пока #02C8 уменьшение time-out на 1 для всех дисководов -;#02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода -;#02F6 проверка наличия диска в дисководе -;#0322 опрос Break и прерывание, если нажата -;#032B R8DOS #10(16) чтение/установка спецификации дискеты -;#0335 R8DOS #11(17) чтение кода спецификации дисковода -;#033A в hl адрес кода time-out для текущего дисковода -;#033F в hl адрес кода, определяющего номер дорожки в текущем дисководе -;#0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе -;#0349 в hl адрес кода, определяющего тип текущего дисковода -;#0356 подготовка байта для выбора заданного дисковода -;#0366 проверка наличия образа в текущем дисководе -;#0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -;#03A2 установка номера дорожки для позиционирования -;#03C5 R8DOS #01(1) выбор текущего дисковода -;#03E4 инициализация текущего дисковода при необходимости -;#042C позиционирование на заданную дорожку -;#0430 поиск дорожки -;#0434 поиск дорожки с проверкой -;#0438 выдача команды в порт #1F ВГ93 -;#0441 ожидание готовности ВГ93 -;#0457 R8DOS #02(2) позиционирование на заданный логический трек -;#04D1 ошибка. прерывание функции -;#0502 R8DOS #0E(14) физическое позиционирование на трек -;#0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке -;#054A ошибка. неверный номер сектора -;#054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) -;#0553 R8DOS #05(5) чтение группы секторов -;#0557 R8DOS #06(6) запись группы секторов -;#05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) -;#0610 чтение сектора -;#063B чтение данных с дискеты в память -;#066B чтение сектора образа HDD в память -;#0694 чтение сектора с винчестера в буфер xEFF5 -;#06B4 запись сектора -;#0708 запись сектора на образ HDD -;#074C расчет смещения от начала образа в секторах (512b) -;#0768 чтение заголовка сектора с позиционированием на заданную дорожку -;#076D чтение заголовка сектора -;#077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера -;#0824 позиционирование на заданную дорожку c тайим-аутом -;#084F R8DOS #07(7) идентификация диска -;#08D4 R8DOS #08(8) идентификация диска для tr-dos -;#0922 R8DOS #09(9) установка рабочего буфера для функции 8 -;#092F вычисление размера таблицы секторов -;#0948 R8DOS #0B(11) форматирование дорожки -;#0B52 преобразование кода размера сектора в байтах в число -;#0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов -;#0B94 R8DOS #0C(12) чтение дорожки -;#0B98 R8DOS #0D(13) запись дорожки -;#0C83 опрос Break. cy=1 не нажата -;#0C98 остановка контроллера ВГ93 -;#0CAD таблица адресоф функций R8DOS -;#0CFF установка переменных дисковой BIOS -;#0D51 определение наличия SMUC -;#0D62 определение наличия NVRAM -;#0DA5 cy=1, a=#01 !!!Not Used!!! -;#0DA9 cy=1, a=#02 !!!Not Used!!! -;#0DAD чтение всей памяти NVRAM в память #7530 -;#0DB6 чтение данных из NVRAM -;#0DC7 запись всей памяти NVRAM из памяти #7530 -;#0DD0 запись данных в NVRAM -;#0E72 что-то пишет в NVRAM -;#0F55 для сравнения чисел -;#0F59 для сравнения чисел -;#0F5D деление hl=dehl'/bc -;#0FB7 умножение dehl=de'hl' * bc -;#0FF3 инкремент dehl -;#1003 копирование из (hl) в (de) 4х байт -;#100F загрузка числа в регистры из памяти -;#101D сложение 4х байтного числа с двухбатным -;#1035 сравнение двух чисел в памяти по адресам в de и hl -;#1065 инициализация дисковода -;#107B инициализация дисковода и настройка на дискету -;#10A4 распознавание имени файла и занесение его в fcb -;#111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска -;#1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb. !!!ОШИБКА!!! маски, после первого поиска больше нету -;#114E загрузка дескриптора файла в буфер -;#1166 загрузка очередного дескриптора файла в буфер -;#11A7 получение адреса байта в буфере dma -;#11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -;#11D4 открыть файл(для нужд монитора) для последующих операций с ним -;#11DB R8DOS #14(20) открыть файл для последующих операций с ним -;#11DF открыть файл для последующих операций с ним -;#1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -;#128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -;#12FF установка в fcb указателя в файле из bc -;#1307 R8DOS #15(21) закрыть файл, открытый функцией 20 -;#1360 R8DOS #1E(30) последовательное считывание заданного количества секторов -;#1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла -;#1390 R8DOS #1F(31) последовательная запись заданного количества секторов -;#1395 R8DOS #1D(29) последовательная запись одного сектора из памяти -;#13D5 создание записи в каталоге диска (на основе fcb) -;#1405 установка нового значения указателя в файле -;#1407 R8DOS #20(32) установка нового значения указателя в файле -;#1472 чтение сектора в буфер dma -;#1484 сохранение буфера dma в файл -;#148D чтение секторов в буфер dma -;#1498 запись секторов из буфера dma -;#14A0 расчет адреса в файле на диске (дорожка и сектор) -;#14A6 расчет нового номера дорожки и сектора -;#14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -;#153D копирование дескриптора дисковода в буфер -;#1545 R8DOS #21(33) чтение из fcb в bc указателя файла -;#154C чтение из fcb в hl длины файла -;#1553 чтение из fcb в hl адреса буфера dma -;#155A чтение заголовка первого попавшегося сектора дисковода A -;#1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) -;#1572 определение наличия interrupt controller -;#15C7 определение наличия последовательного порта/модема -;#16B9 работа с контроллером прерываний -;не используется #1738 работа с контроллером прерываний -;#1768 поиск раздела MFS -;#17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -;#17EF запись 2х секторов из буфера xEBF5 -;#1813 чтение сектора с винчестера -;#1829 запись сектора на винчестер -;#1848 расчет номера сектора на винчестере -;#187F R8DOS #23(35) подключение раздела к драйверу HDD -;#188A установка кода, определяющий тип дисковода без образа по номеру в С -;#189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -;#18C0 R8DOS #28(40) подключение раздела к драйверу HDD -;#1A0E расчет адреса кода, определяющие тип дисковода по номеру в С -;#1A19 завершение процедуры x18C0 R8DOS #28(40) -;#1A6A проверка совпадения имени -;#1A82 выделение из строки имени подраздела/образа (6 символов имя) -;#1A9F копирование имени подраздела/образа по адресу в de -;#1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 -;#1ACC формирование текстовой строки - пути к примонтированному подразделу/образу -;#1B04 расчет адреса блока описателя заданного дисковода -;#1B18 установка признака подмонтированных дисков A/B в порту #7FBA -;#1B45 определение необходимости копирования памяти пользователя -;#1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) -;#1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска -;#1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска -;#1BFA ошибка #56. нет раздела MFS -;#1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела -;#1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) -;#1C70 бесконечное чтение порта bc -;#1C74 бесконечная запись в порт bc -;#1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства -;#1C86 чтение 512b данных в буфер адресуемый hl -;#1C98 запись 512b данных из буфер адресуемого hl -;#1CAC посылаем команду винчестеру -;#1CCA ожидание готовности HDD к передаче данных -;#1CE5 ожидание готовности HDD к принятию команды -;#1D04 ожидание готовности HDD -;#1D1B чтение сектора идентификации в буфер по адресу в ix -;#1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -;#1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;#1D4A запись сектора из буфера ix на винчестер -;#1D4F запись сектора из буфера xE5A9 на винчестер -;#1D73 чтение сектора с винчестера в буфер xE5A9 -;#1D78 чтение сектора с винчестера в буфер ix -;#1D7D чтение сектора с винчестера в буфер xE5A9 -;#1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -;#1E2A установка в переменных сектора номер 3 для винчестера -;#1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы -;#1E74 R8DOS #22(34) идентификация жесткого диска -;#1F08 проверка геометрии винчестера -;#1F2D расчет произведения головок и секторов -;#1F59 чтение ячейки CMOS -;#1F76 чтение из CMOS времени и даты, в случае готовности CMOS -;#1F8B проверка готовности CMOS -;#1F93 чтение из CMOS времени и даты -;#1FB2 запись в CMOS времени и даты -;#1FDD запись данных в ячейку CMOS -;#2010 запись в порт -;#2016 чтение порта -;#201C пауза 293t -;#2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -;#2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) -;#2047 определение наличия CMOS -;не используется #20EC работа с контроллером прерываний ??? -;#20F1 тестирование HDD (2. test) (тест на чтение/запись) -;#2105 тестирование HDD (1. test) (тест только на чтение) -;#21E5 подсчет контрольной суммы области памяти CRC16 -;#220F суммирование байта с контрольной суммой CMOS CRC8 -;#2222 данные для подсчета контрольной суммы -;#2223 данные для подсчета контрольной суммы -;#2422 определение наличия SMUC -;#2452 *** Not Used *** -;#2500 ROM-disk -;#3D00 -;#4000 - - -;АДРЕС: #0000 *NOT USED* (#30 байт) -x0000 ds #30 - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp x010E - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 push af - ld a,#06 - ld (#7530),a - pop af - ei - ret - -;АДРЕС: #0041 *NOT USED* (#25 байт) -x0041 ds #25 - -;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) -x0066 ld a,#06 - out (#FE),a - xor a - out (#FE),a - jr x0066 - -;АДРЕС: #006F *NOT USED* (#01 байт) -x006F ds #01 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db #25 ;смещение начала ром диска (в блоках по 256 байт) - db #18 ;количество свободных секторов в странице - db #00 ;=#00 каталог отсутсвует - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#15 байт) -x00AA ds #15 - -;АДРЕС: #00BF вероятно что-то для контроллера прерываний -x00BF db #93,#01 - ds #04 - db #8B,#01,#00,#CA,#00: jp x015F - db #80,#01,#00,#D2,#00: jp x015F - db #FB,#C9,#00,#DA,#00: jp x015F - db #00,#00,#00,#E2,#00: jp x015F - db #00,#00,#00,#EA,#00: jp x015F - db #00,#00,#00,#F2,#00: jp x015F - db #00,#00,#00,#FA,#00: jp x015F - db #00,#00 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #07 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 push hl - ld a,#06 - ld hl,x9C40 - call x175D ;установка бордюра - pop hl - ei - ret - -;АДРЕС: #010E вызов процедуры из другого rom -x010E push hl - ld hl,(x0101) - ex (sp),hl - push hl - ld hl,#0006 - push af - add hl,sp - push de - push bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld a,(hl) - jp xE3E9 - -;АДРЕС: #0127 вызов процедуры из rom 2 call x0127: dw addr -x0127 ld (xDE10),hl - pop hl - push de - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ex (sp),hl - push hl - ld hl,x0143 ;сюда вернемся - ex (sp),hl - push hl - ld hl,xE42C ;п/п включения страницы для возврата - ex (sp),hl - ex de,hl - push hl - ld hl,(xDE10) - jp xE478 ;включаем rom 2 -x0143 inc sp -x0144 inc sp - ret - -;АДРЕС: #0146 работа с контроллером прерываний -x0146 ei - nop - push af - push bc - ld b,#0C - call x1F59 ;чтение ячейки CMOS - ld a,#02 - ld (x7530),a - ld bc,#7EBE - ld a,#20 - out (c),a - pop bc - pop af - ei - ret - -;АДРЕС: #015F работа с контроллером прерываний -x015F push af - push bc - ld b,#0C - call x1F59 ;чтение ячейки CMOS - ld a,#02 - ld (#7530),a - push hl - ld a,#02 - ld hl,#9C40 - call x175D ;вызов процедуры из основной памяти - pop hl - ld bc,#7EBE - ld a,#20 - out (c),a - pop bc - pop af - ei - ret - -;АДРЕС: #0180 работа с контроллером прерываний -x0180 di - halt - push af - ld a,#04 - ld (#7530),a - pop af - ei - ret - -;АДРЕС: #018B работа с контроллером прерываний -x018B push af - ld a,#05 - ld (#7530),a - pop af - ret - -;АДРЕС: #0193 работа с контроллером прерываний -x0193 push af - push bc - ld bc,#7EBE - ld a,#0C - out (c),a - nop - nop - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - pop bc - pop af - ei - ret - -;АДРЕС: #01AF автостарт с дискеты -;вх: 2-3,a =#11 -> вых: нажатие Enter и переход на rom 0: #259F -; =#10 -> вых: bc - длина бейсик-строки для автостарта -; =#0? -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 -x01AF ld a,(xDD7F+#01) ;регистр A пользователя - and #0C - cp #0C - jr z,x01EC - cp #08 - jr z,x01E4 ;длина бейсик строки для дисковода автостарта - ld hl,rom0_x1B11 ;п/п загрузки с диска - ld (xDD6B),hl ;новый pc программы пользователя - ld de,(xDD75) ;регистр de пользователя - call x0207 ;bc - длина бейсик строки для автостарта - ld hl,x0213 - ldir - ret z ;автостарт с дисковода A - push af - call x1B04 ;расчет адреса блока описателя заданного дисковода - pop bc ;b - номер дисковода - jr nz,x01D8 ;в дисководе образ диска - res 1,b ;реальные диски только в дисководах A/B -x01D8 ld a,"A" - add a,b - ld hl,(xDD75) ;регистр de пользователя - ld de,#000F - add hl,de - ld (hl),a ;установим букву дисковода - ret -;длина бейсик строки для дисковода автостарта -x01E4 call x0207 ;bc - длина бейсик строки для автостарта - ld (xDD77),bc ;регистр bc пользователя - ret -;запуск с винчестера -x01EC ld hl,rom0_x259F - ld (xDD6B),hl ;новый pc программы пользователя - bit 7,(iy+#1B) - ret z ;проверка геометрии винчестера не пройдена - bit 0,(iy+#1C) - ret z ;autostart off - ld a,#0D - ld (#5C08),a ;код последней нажатой клавиши: enter - ld hl,#5C3B - set 5,(hl) ;устанавливается при нажатии на любую символьную клавишу - ret -;вых: bc - длина бейсик строки для автостарта -; z - автостарт с дисковода A -x0207 ld a,(iy-#23) ;номер диска автостарта - or a - ld bc,#000E ;для дисковода A - ret z - ld bc,#0016 ;для дисководов B/C/D - ret -x0213 db #F9 ;randomize - db #C0 ;usr - db #B0 ;val - db '"15619"' ;"15619" - db ":",#EA,":",#F7 ;:rem:run - db '"A:boot"' - -;АДРЕС: #0229 вызов функции R8DOS -;вх: c - номер функции -x0229 push ix - ld (xFFEF),a - ld a,r - push af ;сохраним флаг прерываний - di - ld a,c - cp #14 - jr nc,x0293 - ld a,(xFFEF) ;для функций #00..#13 - ld (xFFDE),sp - push hl - ld hl,xFFDC - res 0,(hl) - res 4,(iy+#0B) - inc hl - ld (hl),#FF ;код ошибки #FF - ld hl,x0264 ;сюда вернемся -x024E ex (sp),hl - push hl - push de - ld l,c - ld h,#00 - add hl,hl - ld de,x0CAD ;функции R8DOS - add hl,de - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl ;адрес п/п обработки заданной функции - pop de - ex (sp),hl - ld ix,(xFFF0) ;!!!ОШИБКА, должно быть ld ix,(xDD6F) - ret -;выход из функции по ошибке -;возврат из функций #00..#13 -x0264 ld sp,(xFFDE) ;восстановим стэк - ld (xFFEF),a ;временно сохраним регистр A - push hl - ld hl,xFFDC - res 4,(hl) - inc hl - ld a,(hl) ;код ошибки - cp #FF - pop hl - ex (sp),hl - res 0,l ;сбросим флаг CY - jr z,x027D ;нет ошибки -x027B set 0,l ;установим флаг CY -x027D ex (sp),hl - pop af - ld a,(xFFEF) ;восстановим A - jp po,x0286 ;восстановим режим прерываний ei/di - ei -x0286 pop ix - ret -;возврат из функций #14..#nn -x0289 ld (xFFEF),a - ex (sp),hl - res 0,l ;сбросим флаг CY - jr nc,x027D ;нет ошибки - jr x027B ;была ошибка -x0293 ld a,(xFFEF) ;для функций #14..#nn - push hl - ld hl,x0289 ;сюда вернемся - jr x024E - -;АДРЕС: #029C R8DOS #00(0) сброс контроллера -x029C xor a - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),a ;номер дорожки =#00 - call x0394 ;bit 7,(xFFDC) - ret nz ;к текущему дисководу подключен образ - call x0C98 ;остановка контроллера ВГ93 - out (#FF),a ;загрузка головки, сторона верхняя, метод записи - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - and #03 ;скорость перемещения головки - or #0C ;головку опустить, проверить номер дорожки - out (#1F),a ;команда восстановления - call x0441 ;ожидание готовности ВГ93 - call x02F6 ;проверка наличия диска в дисководе - in a,(#1F) ;читаем регистр состояния - set 4,(hl) ;hl=xFFDC - -;АДРЕС: #02BE код time-out -;вых: z код time-out текущего дисковода =#FF/#00 -x02BE call x033A ;hl адрес кода time-out для текущего дисковода - ld a,(hl) - inc a - ret z - dec a - ld (hl),#0A - ret - -;АДРЕС: #02C8 уменьшение time-out на 1 для всех дисководов -;вых: hl - адрес процедуры time-out -x02C8 ld b,#00 - -;АДРЕС: #02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода -;вх: b - байт установки time-out -; 3-0,b =0000 уменьшение time-out на 1 для всех дисководов -;вых: hl - адрес процедуры time-out -x02CA ld hl,xFFD8 ;коды time-out для дисководов - ld a,b - and #0F - jr nz,x02E3 - ld b,#04 ;для всех дисководов -x02D4 ld a,(hl) - inc a - jr z,x02DC ;(hl)=#FF - dec a - jr z,x02DC ;(hl)=#00 - dec (hl) ;(hl)=(hl)-1 -x02DC inc hl - djnz x02D4 -x02DF ld hl,x02C8 - ret -x02E3 ld a,b - ld b,#04 -x02E6 rra - jr nc,x02F1 ;следующий дисковод - ld c,#00 - bit 3,a - jr nz,x02F0 - dec c -x02F0 ld (hl),c ;#00/#FF -x02F1 inc hl - djnz x02E6 - jr x02DF - -;АДРЕС: #02F6 проверка наличия диска в дисководе -x02F6 call x0322 ;опрос Break и прерывание, если нажата - ld hl,xFFDC - ld de,#0000 - in a,(#1F) ;берем индексный сигнал для образца - and #02 - ld b,a - call x0316 ;ждем изменения индексного сигнала - ret nz ;индексный сигнал изменился - call x0316 ;повторим еще раз - ret nz ;индексный сигнал изменился -x030C bit 0,(hl) - ret nz - call x0C98 ;остановка контроллера ВГ93 - ld a,#01 - jr x0328 ;ошибка. прерывание функции -;ждем изменения индексного сигнала -x0316 in a,(#1F) - and #02 - cp b - ret nz - inc de - ld a,e - or d - jr nz,x0316 - ret - -;АДРЕС: #0322 опрос Break и прерывание, если нажата -x0322 call x0C83 ;опрос Break. cy=1 не нажата - ret c - ld a,#03 -x0328 jp x04D1 ;ошибка. прерывание функции - -;АДРЕС: #032B R8DOS #10(16) чтение/установка спецификации дискеты -;вх: a - спецификация диска -; b - режим: 0FFh - установка, другое - чтение. -; -x032B call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе - inc b - jr nz,x0333 ;чтение - ld (hl),a ;запись - ret -x0333 ld a,(hl) - ret - -;АДРЕС: #0335 R8DOS #11(17) чтение кода спецификации дисковода -;вых: a - код спецификации дисковода -x0335 call x0349 ;адрес кода, определяющего тип текущего дисковода - ld a,(hl) - ret - -;АДРЕС: #033A в hl адрес кода time-out для текущего дисковода -x033A ld hl,xFFD8 - jr x034C - -;АДРЕС: #033F в hl адрес кода, определяющего номер дорожки в текущем дисководе -x033F ld hl,xFFD4 - jr x034C - -;АДРЕС: #0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе -x0344 ld hl,xFFD0 ;коды, определяющие тип дискеты в дисководах - jr x034C - -;АДРЕС: #0349 в hl адрес кода, определяющего тип текущего дисковода -x0349 ld hl,xFFCC ;коды, определяющие тип дисковода -;расчет адреса для текущего дисковода -x034C push de - ld de,(xFFCA) ;номер текущего дисковода - ld d,#00 - add hl,de - pop de - ret - -;АДРЕС: #0356 подготовка байта для выбора заданного дисковода -;вых: a - байт -x0356 ld a,(xFFCA) ;номер текущего дисковода - call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе - and #03 ;номер текущего дисковода - or %00011100 ;загрузка головки, сторона верхняя - ld c,a - ld a,(hl) ;метод записи 0/1=FM/MFM - and %01000000 - or c - ret - -;АДРЕС: #0366 проверка наличия образа в текущем дисководе -;вых: nz - к текущему дисководу образ подключен -; z - к текущему дисководу образ не подключен -x0366 call x0349 ;в hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - cp #FF - jr z,x038C ;еще не инициалищирован - bit 5,a - jr z,x038C ;образ не подключен -;проверка наличия образа TR-DOS в текущем дисководе -x0372 ld a,(xE590) - and %11011111 - cp #01 - jr nz,x03DF ;нет подключенного образа TR-DOS. ошибка: нет диска в дисководе - ld hl,xFFDC - set 7,(hl) ;признак подключенного образа TR-DOS - xor a ;cy=0 - inc a ;nz - ret -;установка дескриптора образа для текущего дисковода -x0383 ld a,(xFFCA) ;номер текущего дисковода - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, - db #02 ;если к нему примонтирован образ - jr x0372 ;проверка наличия образа TR-DOS в текущем дисководе -;для дисководов C/D возможна работа только с образами -x038C ld a,(xFFCA) ;номер текущего дисковода - bit 1,a - ret z ;дисковод A/B - jr x03DF ;ошибка: нет диска в дисководе - -;АДРЕС: #0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -x0394 push hl - ld hl,xFFDC - bit 7,(hl) - pop hl - ret - -;текущий дисковод инициализирован -x039C ld hl,xFFDC - set 6,(hl) - ret - -;АДРЕС: #03A2 установка номера дорожки для позиционирования -x03A2 ld a,(xFFDC) - bit 6,a - ret nz ;дисковод инициализирован - push hl - push de - push bc - call x0366 ;проверка наличия образа в текущем дисководе - jr nz,x03BE ;к текущему дисководу образ подключен - ld b,#10 - call x0356 ;подготовка байта для выбора заданного дисковода - xor b - out (#FF),a - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a ;установим номер дорожки -x03BE call x039C ;текущий дисковод инициализирован - pop bc - pop de - pop hl - ret - -;АДРЕС: #03C5 R8DOS #01(1) выбор текущего дисковода -;вх: a - номер дисковода [0..3] -x03C5 and #03 - ld (xFFCA),a ;номер текущего дисковода - ld hl,xFFDC - res 6,(hl) - res 7,(hl) - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 5,(hl) ;образ на текущем дисководе? - jr nz,x0383 ;к дисководу подключен образ. установка дескриптора образа для текущего дисковода - bit 1,a - ret z ;дисковод A/B - xor a - ld (xE590),a ;текущий дисковод без образа -x03DF ld a,#01 ;дисководы C/D только с образами могуть быть - jp x04D1 ;ошибка #01 нет диска в дисководе. прерывание функции - -;АДРЕС: #03E4 инициализация текущего дисковода при необходимости -x03E4 ld hl,xFFDC - bit 6,(hl) - ret nz ;дисковод уже инициализирован - ld hl,x039C ;адрес возврата - push hl - ld hl,xFFDC ;!!!ЛИШНЕЕ - call x0366 ;проверка наличия образа в текущем дисководе - ret nz ;к текущему дисководу подключен образ - call x0356 ;подготовка байта для выбора заданного дисковода - out (#FF),a ;выбор дисковода - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - inc a - ret nz ;уже инициализирован - push hl - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - ld ix,xFFDC - set 0,(ix+0) - xor a ;дорожка 0 - call x042C ;позиционирование на заданную дорожку - ld a,#32 ;дорожка #32(50) - call x042C ;позиционирование на заданную дорожку - ld a,#02 ;дорожка #02 - call x042C ;позиционирование на заданную дорожку - res 0,(ix+0) - pop hl - bit 2,a ;регистр состояния. потеря данных - res 6,(hl) - jr nz,x0427 ;потеря данных - set 6,(hl) ;80 дорожек на дисководе -x0427 ld a,(hl) - and %11000011 - ld (hl),a - xor a ;уходим на нулевую дорожку - -;АДРЕС: #042C позиционирование на заданную дорожку -;вх: a - номер дорожки -;вых: a - регистр состояния -x042C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),a ;номер дорожки - -;АДРЕС: #0430 поиск дорожки -;вх: a - номер дорожки -;вых: a - регистр состояния -x0430 ld b,#18 ;команда поиска - jr x0436 - -;АДРЕС: #0434 поиск дорожки с проверкой -;вх: a - номер дорожки -;вых: a - регистр состояния -x0434 ld b,#1C ;команда поиска -x0436 out (#7F),a ;запись в регистр данных - -;АДРЕС: #0438 выдача команды в порт #1F ВГ93 -;вх: b - команда для ВГ93 -;вых: a - регистр состояния -x0438 call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - and #03 ;время перемещения на шаг - or b - out (#1F),a ;выдаем команду в порт - -;АДРЕС: #0441 ожидание готовности ВГ93 -;вых: a - регистр состояния -x0441 ld de,26300 ;количество попыток -x0444 in a,(#FF) ;ожидание сигнала INTRQ - rlca - jr nc,x044C - in a,(#1F) ;чтение регистра состояния - ret -x044C call x0322 ;опрос Break и прерывание, если нажата - dec de - ld a,e - or d - jr nz,x0444 ;повторим - jp x030C ;превышено кол-во попыток - -;АДРЕС: #0457 R8DOS #02(2) позиционирование на заданный логический трек -;вх: d - номер дорожки -x0457 push de - call x03E4 ;инициализация текущего дисковода при необходимости - pop de - call x0394 ;проверка bit 7,(xFFDC) - jr z,x046D ;реальная дискета -;подключен образ диска -x0461 call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),d - ld a,d - cp #A0 ;не больше 160 - ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) - ret c - jr x04D1 ;ошибка. прерывание функции -;реальная дискета -x046D call x0356 ;подготовка байта для выбора заданного дисковода - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld e,(hl) - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 5,e - jr z,x0483 ;диск 40 дорожек - bit 6,(hl) - jr nz,x0492 ;дисковод на 80 дорожек -x047F ld a,#08 ;код ошибки: ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) - jr x04D1 -x0483 bit 6,(hl) - jr z,x0492 ;дисковод на 40 дорожек -;дисковод на 80 дорожек - sla d ;определение стороны диска и номера физической дорожки - bit 7,e - jr z,x0492 ;односторонняя дискета - bit 1,d - jr z,x0492 ;верхняя сторона - dec d -x0492 bit 7,e - jr z,x04A0 ;односторонняя дискета - bit 7,(hl) - jr z,x047F ;ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) - srl d - jr nc,x04A0 - res 4,a ;нижняя головка -x04A0 out (#FF),a - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) - jp c,x04D1 - ld a,(ix+0) ;номер дорожки в заголовке - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - cp (hl) ;сравнение с заданным - push hl - push de - call nz,x029C ;R8DOS #00(0) сброс контроллера - pop de - pop hl - ld a,(hl) ;номер дорожки - bit 2,e - jr z,x04BF - sla a ;диск 40 работает на дисководе 80 -x04BF cp d - ret z - out (#3F),a ;установим номер дорожки - ld a,d - bit 2,e - jr nz,x04EC ;диск 40 работает на дисководе 80 - ld (hl),a - call x0434 ;поиск дорожки с проверкой - bit 4,a ;ошибка позиционирования? - ret z ;нет ошибки -x04CF ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) - -;АДРЕС: #04D1 ошибка. прерывание функции -;вх: a - код ошибки -x04D1 ld (xFFDD),a ;код ошибки дискового интерпретатора - ld a,#D0 - out (#1F),a ;команда прерывания - call x04DE - jp x0264 -;проверка кода time-out для текущего дисковода -x04DE push hl - push af - call x033A ;в hl адрес кода time-out для текущего дисковода - ld a,(hl) - inc a - jr z,x04E9 - ld (hl),#00 -x04E9 pop af - pop hl - ret -;диск 40 работает на дисководе 80 -x04EC srl d - ld (hl),d - push de - call x0430 ;поиск дорожки - pop de - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) - jr c,x04D1 - ld a,(ix+0) ;номер дорожки - cp d - ret z - jr x04CF ;ошибка позицирования (не соответствует номер дорожки) - -;АДРЕС: #0502 R8DOS #0E(14) физическое позиционирование на трек -;вх: d - номер физической дорожки [0...х] -; a - номер стороны: 0/1 - нижняя/верхняя -x0502 and #01 - ld e,a ;номер стороны - push de - call x03A2 ;установка номера дорожки для позиционирования - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x0517 ;образ не подключен - pop de - ld a,d - sla a - add a,e - ld d,a ;логический номер дорожки - jp x0461 ;проверка номера дорожки образа -x0517 call x0824 ;позиционирование на заданную дорожку c тайим-аутом - call x0356 ;подготовка байта для выбора заданного дисковода - pop de - rrc e - ld hl,xFFDC - set 4,(hl) - jr nc,x052B ;нижняя сторона - res 4,a - res 4,(hl) -x052B out (#FF),a - ld a,d - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - bit 2,(hl) - jp z,x042C ;позиционирование на заданную дорожку -;диск 40 работает на дисководе 80 - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - sla a - out (#3F),a - ld (hl),d - ld a,d - sla a - jp x0430 ;поиск дорожки - ret ;!!!ЛИШНЕЕ!!! - -;АДРЕС: #0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке -x0546 ld hl,(xFFC8) - ret - -;АДРЕС: #054A ошибка. неверный номер сектора -x054A ld a,#07 - jr x04D1 - -;АДРЕС: #054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) -x054E call x0824 ;позиционирование на заданную дорожку c тайим-аутом - jr x05A8 - -;АДРЕС: #0553 R8DOS #05(5) чтение группы секторов -;вх: hl - адрес буфера -; d[0...x] - номер логического трека (первого обрабатываемого сектора) -; e[0...х] - номер первого обрабатываемого сектора -; b - количество секторов в операции -; -x0553 ld a,#80 ;признак чтения - jr x0559 - -;АДРЕС: #0557 R8DOS #06(6) запись группы секторов -;вх: hl - адрес буфера -; d[0...x] - номер логического трека (первого обрабатываемого сектора) -; e[0...х] - номер первого обрабатываемого сектора -; b - количество секторов в операции -; -x0557 ld a,#A0 ;признак записи -x0559 ld (xFFE1),a - push bc - push de - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and #03 ;код размера сектора в байтах - push af - ld c,a - call x0B52 ;преобразование кода размера сектора в байтах в число - ld (xFFED),bc ;размер сектора в байтах - pop af - bit 6,(hl) - jr nz,x0575 ;метод записи MFM - add a,#04 -x0575 ld b,#00 - ld c,a - ld hl,(xFFC8) ;адрес таблицы количеством секторов на дорожке - add hl,bc - ld a,(hl) - ld (xFFE0),a ;количество секторов на дорожке - dec a - cp e - jr c,x054A ;ошибка. неверный номер сектора - call x03E4 ;инициализация текущего дисковода при необходимости - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - pop hl - pop de - pop bc -x058D ld (xFFE2),hl - ld (xFFE4),de - ld a,b - ld (xFFE6),a - call x0457 ;позиционирование на заданную дорожку - jr x05A8 -x059D ld a,b - ld (xFFE6),a - ld (xFFE2),hl - ld (xFFE4),de -;головка спозицонирована на заданную дорожку -x05A8 ld a,(xFFCB) - ld b,a ;число попыток считывания при ошибке -x05AC ld de,(xFFE4) ;дорожка и сектор - call x0322 ;опрос Break и прерывание, если нажата - ld hl,(xFFE2) ;адрес для чтения - push bc - ld bc,(xFFED) ;размер сектора в байтах - push de - ld a,(xFFE1) ;=#80/#A0 чтение/запись группы секторов - bit 5,a - push af - call nz,x06B4 ;запись сектора - pop af - call z,x0610 ;чтение сектора - pop de - ld c,a - and #1F - ld a,c - pop bc - jr z,x05EB ;прочиталось без ошибки - djnz x05AC ;ошибка. повторим чтение - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 -x05D5 jp x04D1 ;прервем функцию - -;АДРЕС: #05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) -x05D8 call x0824 ;позиционирование на заданную дорожку c тайим-аутом - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and #03 - ld c,a ;код размера сектора - call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) - add hl,bc ;пропускаем сектор - jr x05F1 -;проверка защиты от записи -x05EB bit 6,a ;защита записи? - ld a,#02 ;код ошибки: попытка записи на защищенную дискету - jr nz,x05D5 ;ошибка. если была запись. при чтении не устанавливается -;расчет номера следующего сектора -x05F1 ld de,(xFFE4) ;дорожка и сектор для чтения/записи - inc e - ld a,e - push hl ;следующий адрес в памяти - ld hl,(xFFE0) ;количество секторов на дорожке - cp l - pop hl - jr c,x0609 ;дорожка еще не кончилась - ld e,#00 ;нулевой сектор, следующая дорожка - inc d - ld a,(xFFE6) ;количество секторов для чтения/записи - ld b,a - djnz x058D ;следующий сектор - ret ;завершили чтение/запись -;дорожка еще не кончилась -x0609 ld a,(xFFE6) - ld b,a - djnz x059D - ret ;завершили чтение/запись - -;АДРЕС: #0610 чтение сектора -;вх: de - дорожка и сектор -; hl - адрес для чтения -; bc - размер сектора в байтах -; a - команда =#80/#A0 чтение/запись группы секторов -;вых: nz - ошибка чтения -; a - регистр состояния -; hl - следующий адрес в памяти -x0610 ld d,a - bit 5,(iy+#0B) - jr z,x0635 ;вызов функции из монитора - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0635 ;копировать не надо - push hl - ld hl,xEBF5 ;читаем в буфер в ram 8 - push bc - call x0635 ;читаем сектор - ld b,a ;регистр состояния - and #1F - ld a,b - pop bc - pop hl - ret nz ;была ошибка чтения - ld de,xEBF5 ;буфер в память пользователя - ex de,hl - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - xor a - ret -x0635 ld a,(xFFDC) - rlca - jr c,x066B ;это образ на HDD - -;АДРЕС: #063B чтение данных с дискеты в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: a - регистр состояния -; hl - следующий адрес в памяти -x063B call x0648 ;чтение данных в память - ld a,b - or a - ld a,#01 ;код ошибки: нет диска в дисководе - jp z,x04D1 ;нет готовности - in a,(#1F) - ret -;чтение данных в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: b=#00 нет готовности -; hl - следующий адрес в памяти -x0648 ld a,e - inc a - out (#5F),a ;регистр сектора - ld a,d - out (#1F),a ;регистр команд - ld bc,#047F -x0652 in a,(#FF) ;чтение системного регистра - and #C0 - jr nz,x0667 ;есть готовность - inc de - ld a,d - or e - jr nz,x0652 ;ожидаем готовность - djnz x0652 - ret -;чтение сектора -x0660 in a,(#FF) - and #C0 - jr z,x0660 ;ждем готовности - ret m ;сигнал окончания выполнения команды -x0667 ini ;читаем байт с дискеты - jr x0660 - -;АДРЕС: #066B чтение сектора образа HDD в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: hl - следующий адрес в памяти -; bc=#0100 -x066B push hl - call x074C ;расчет смещения от начала образа в секторах (512b) - push bc - inc hl ;+1 сервисный сектор - bit 4,(iy+#0B) - jr z,x0682 ;сектор с HDD еще не прочитан - push hl ;расчет смещения от начала образа в секторах (512b) - ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) - or a - sbc hl,bc - pop hl - jr z,x0685 ;сектор уже в памяти, не читаем -x0682 call x0694 ;чтение сектора с винчестера в буфер xEFF5 -x0685 pop bc ;#0000/#0100 смещение в секторе - pop de ;адрес в памяти куда читать - ld hl,xEFF5 - add hl,bc ;какую половину копировать - ld bc,#0100 - ldir ;копируем из буфера в память - ex de,hl - inc b - xor a - ret - -;АДРЕС: #0694 чтение сектора с винчестера в буфер xEFF5 -;вх: hl - смещение от начала образа в секторах (512b) -x0694 ld a,(xE590) - and #DF - cp #01 - ld a,#21 ;код ошибки: - jp nz,x04D1 - ld (xE5A7),hl ;смещение от начала образа в секторах (512b) - ld de,xEFF5 ;адрес буфера для чтения - ex de,hl - call x1813 ;чтение сектора с винчестера - ld a,#04 - jp c,x04D1 ;ошибка. прерываем функцию - set 4,(iy+#0B) ;сектор прочитан - ret - -;АДРЕС: #06B4 запись сектора -;вх: de - дорожка и сектор -; hl - адрес для чтения -; bc - размер сектора в байтах -; a - команда =#80/#A0 чтение/запись группы секторов -;вых: nz - ошибка записи -; a - регистр состояния -; hl - следующий адрес в памяти -x06B4 ld d,a - bit 5,(iy+#0B) - jr z,x06D2 ;вызов функции из монитора - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x06D2 ;копировать не надо - push de - ld de,xEBF5 ;буфер в ram 8 - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop de - push hl - ld hl,xEBF5 ;буфер с данными пользователя - call x06D2 - pop hl - ret -x06D2 ld a,(xFFDC) - rlca - jr c,x0708 ;это образ на HDD. запись сектора на образ HDD - call x06E5 ;запись сектора - ld a,b - or a - ld a,#01 ;код ошибки: нет диска в дисководе - jp z,x04D1 ;прерывание функции - in a,(#1F) ;регистр состояния - ret -;запись сектора -;вх: hl - адрес для чтения -; e - номер сектора -; d - команда =#80/#A0 чтение/запись группы секторов -;вых: b=#00 нет готовности -x06E5 ld a,e - inc a - out (#5F),a ;регистр сектора - ld a,d - out (#1F),a ;регистр команд (команда запись сектора) - ld bc,#047F -x06EF in a,(#FF) ;чтение системного регистра - and #C0 - jr nz,x0704 ;есть готовность к приему данных - inc de - ld a,d - or e - jr nz,x06EF ;ожидаем готовность - djnz x06EF - ret -;передача данных сектора -x06FD in a,(#FF) - and #C0 - jr z,x06FD ;ждем готовности - ret m ;сигнал окончания выполнения команды -x0704 outi ;запись байта на дискету - jr x06FD - -;АДРЕС: #0708 запись сектора на образ HDD -;вх: hl - адрес в памяти -; e - номер сектора -;вых: hl - следующий адрес в памяти -; bc=#0100 -x0708 ld a,(xE590) - cp #01 - ld a,#21 - jp nz,x04D1 ;образ не подключен/защита от записи - push hl - call x074C ;расчет смещения от начала образа в секторах (512b) - push bc - inc hl ;+1 сервисный сектор - bit 4,(iy+#0B) ;сектор еще не записан - jr z,x0729 ;читаем сектор с HDD. нужно чтобы записать сектор 256b - push hl ;расчет смещения от начала образа в секторах (512b) - ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) - or a - sbc hl,bc - pop hl - jr z,x072E ;этот сектор уже прочитан -x0729 push hl ;смещение от начала образа в секторах (512b) - call x0694 ;чтение сектора с винчестера в буфер xEFF5 - pop hl -x072E pop bc ;#0000/#0100 смещение в секторе - ex (sp),hl ;адрес в памяти - ld de,xEFF5 ;буфер куда прочитали сектор - ex de,hl - add hl,bc ;смещение в секторе - ex de,hl - ld bc,#0100 - ldir ;коприруем данные в буфер - pop de ;смещение от начала образа в секторах (512b) - push hl ;следующий адрес в памяти - ld hl,xEFF5 - call x1829 ;запись сектора на винчестер - pop hl - ld a,#00 - ret nc ;нет ошибок - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 - jp x04D1 - -;АДРЕС: #074C расчет смещения от начала образа в секторах (512b) -;вх: e - номер сектора -;вых: hl - смещение от начала образа в секторах (512b) -; bc - #0000/#0100 смещение в секторе -x074C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld l,(hl) ;номер дорожки - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - add hl,hl ;номер дорожки *16 - ld a,l - add a,e - ld l,a - jr nc,x075C - inc h -x075C srl h - rr l ;(trk * 16 + sec)/2 - ld bc,#0000 ;первая половина сектора HDD - ret nc - ld bc,#0100 ;вторая половина сектора HDD - ret - -;АДРЕС: #0768 чтение заголовка сектора с позиционированием на заданную дорожку -;вх: e - номер сектора -;вых: cy=1 была ошибка при чтении -; ix - адрес буфера с прочитанныи загловком -x0768 push de - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - pop de - -;АДРЕС: #076D чтение заголовка сектора -;вых: cy=1 была ошибка при чтении -; ix - адрес буфера с прочитанныи загловком -x076D push de - ld hl,xFFE9 ;куда читаем - ld d,#C0 ;чтение адреса - push hl - call x063B ;чтение данных в память - pop ix - pop de - and #1F - ret z ;ошибок нет - scf - ret - -;АДРЕС: #077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера -;вх: hl - адрес таблицы -;вых: таблица заголовков секторов, находящихся на дорожке -x077F call x03A2 ;установка номера дорожки для позиционирования - bit 5,(iy+#0B) - jr z,x07AB ;функция вызвана из монитора - ld bc,#012C - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x07AB ;копировать не надо - push hl - ld hl,xEBF5 - push hl - call x07AB - inc hl - pop bc - or a - sbc hl,bc - ld a,h - or l - ld c,l - ld b,h ;длина таблицы - pop de - ret z ;таблица пустая - ld hl,xEBF5 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret -;формирование таблицы секторов -x07AB call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x07CF ;реальная дискета -; для образа диска - push hl - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld e,(hl) - srl e - pop hl - ld a,#01 -x07BA ld (hl),#00 ;информация о секторе достоверна - inc hl - ld (hl),e ;Физический номер дорожки (0..х) - inc hl - ld (hl),#00 ;сторона 0 - inc hl - ld (hl),a ;Номер сектора (1..х) - inc hl - ld (hl),#01 ;Код длины сектора =#01 - 256b - inc hl - inc a - cp #11 - jr c,x07BA - ld (hl),#FE - ret -; для реальной дискеты -x07CF ld (xFFE2),hl - ld (hl),#FE - inc hl - inc hl - inc hl - ld (xFFE4),hl - ld (hl),#00 ;номер сектора 0 - ld a,#3C ;максимальное количество секторов - ld (xFFE6),a - call x0824 ;позиционирование на заданную дорожку c тайм-аутом -x07E4 call x0322 ;опрос Break и прерывание, если нажата - in a,(#1F) - bit 1,a - jr z,x07E4 ;ожидание индексного импульса -x07ED call x076D ;чтение заголовка сектора - ;ix - адрес буфера с прочитанныи загловком - ld hl,(xFFE2) - ld (hl),#00 - jr nc,x07F9 ;ошибок не было - ld (hl),#FF ;сбой чтения -x07F9 inc hl - ld de,(xFFE4) - ld a,(de) - cp (ix+#02) ;номер сектора - jr z,x0820 ;конец дорожки - push ix ;копируем в таблицу - pop de - ex de,hl - ld bc,#0004 - ldir - ex de,hl - ld (hl),#FE - ld (xFFE2),hl - ld a,(xFFE6) - dec a - ret z - ld (xFFE6),a - call x0322 ;опрос Break и прерывание, если нажата - jr x07ED -x0820 dec hl - ld (hl),#FE - ret - -;АДРЕС: #0824 позиционирование на заданную дорожку c тайим-аутом -x0824 push hl - ld hl,xFFDC - bit 4,(hl) - jr nz,x084D ;выход - bit 7,(hl) - jr nz,x084D ;выход - set 4,(hl) - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a ;номер дорожки - nop - out (#7F),a ;номер дорожки - ld b,#18 ;позиционирование на заданную дорожку - call x0438 ;выдача команды в порт #1F ВГ93 - call x02BE ;проверка байта time-out - jr nz,x084D ;задержка не нужна - ld hl,15010 ;задержка 390277t -x0848 dec hl - ld a,h - or l - jr nz,x0848 -x084D pop hl - ret - -;АДРЕС: #084F R8DOS #07(7) идентификация диска -x084F call x03E4 ;инициализация текущего дисковода при необходимости - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - or #C0 - ld (hl),a - call x0394 ;bit 7,(xFFDC) - jr z,x0868 ;образ не подключен - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),#A1 ;%10100001 - ld d,#02 - jp x0457 ;R8DOS #02(2) позиционирование на заданный логический трек -;реальный дисковод -x0868 call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),#A0 - push hl - call x029C ;R8DOS #00(0) сброс контроллера - ld a,#02 - call x042C ;позиционирование на заданную дорожку - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ;ix - адрес буфера с прочитанныи загловком - pop hl - jr nc,x088D ;ошибки не было - set 6,(hl) ;метод записи MFM - push hl - call x0356 ;подготовка байта для выбора заданного дисковода - out (#FF),a ;выбор дисковода - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - pop hl - ld a,#09 ;код ошибки: неформатированная дискета - jp c,x04D1 ;ошибка. прерывание функции -; установка длины сектора в переменной -x088D ld a,(ix+3) ;код длины сектора - and #03 - ld c,a ;код длины сектора - ld a,(hl) - and #FC - or c - ld (hl),a ;установим код длины сектора в переменной -; коррекция номера дорожки для 40 дорожечного дисковода - ld d,(ix+#00) ;номер дорожки - push hl - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 6,(hl) - ld e,(hl) - jr nz,x08A6 ;80 дорожек в дисководе - srl d -x08A6 pop hl - res 2,(hl) ;hl адрес кода, определяющего тип дискеты в текущем дисководе - srl d - jr nc,x08BB - res 5,(hl) ;40 дорожек на дискете - bit 6,e ;код, определяющий тип текущего дисковода - jr z,x08BB ;дисковод на 40 дорожек - set 2,(hl) ;диск 40 работает на дисководе 80 - push hl - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - dec (hl) - pop hl - -x08BB call x0356 ;подготовка байта для выбора заданного дисковода - res 4,a ;сторона 0 - out (#FF),a - push hl - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - pop hl - jr nc,x08CC ;ошибок не было - res 7,(hl) ;односторонняя дискета - ret -x08CC ld a,(ix+#01) ;номер стороны - or a - ret nz - res 7,(hl) ;односторонняя дискета - ret - -;АДРЕС: #08D4 R8DOS #08(8) идентификация диска для tr-dos, аналогична функции #18 -; интерпретатора системных функций. Перед вызовом необходимо -; установить рабочий буфер, размером не менее 256 байт, используя функцию 9 -x08D4 call x084F ;R8DOS #07(7) идентификация диска - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and %01000011 - dec a - ld a,#10 - jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos - ld de,#0008 - ld b,#01 - ld hl,(xFFE7) ;адрес рабочего буфера для функции - ld a,h - or l - ld a,#12 - jp z,x04D1 ;ошибка #12. не открыт рабочий буфер - call x0553 ;R8DOS #05(5) чтение служебного сектора - ld ix,(xFFE7) ;адрес рабочего буфера для функции - ld de,#00E1 - add ix,de ;начало служебной информации - ld a,#10 - cp (ix+#06) ;идентификационный код TR-DOS (#10) - jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld e,(hl) - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - inc a - res 7,(hl) ;односторонняя дискета - bit 2,(ix+#02) ;тип дискеты - jr z,x0918 ;односторонняя - set 7,(hl) ;двухсторонняя -x0918 res 5,(hl) ;40 дорожек на диске - bit 0,(ix+#02) ;кол-во дорожек - ret nz ;40 дорожек - set 5,(hl) ;80 дорожек - ret - -;АДРЕС: #0922 R8DOS #09(9) установка рабочего буфера для функции 8 -;вх: hl - адрес рабочего буфера -;вых: d - версия компиляции монитора -; c - число компиляций монитора -; b - месяц компиляции монитора -; e - год компиляции монитора -x0922 ld (xFFE7),hl - ld (xFFF0),hl - ld de,#6161 - ld bc,#0705 - ret - -;АДРЕС: #092F вычисление размера таблицы секторов -;вх: hl - адрес таблицы секторов -;вых: bc - размер таблицы сеторов -x092F push hl - push hl -x0931 ld a,(hl) - cp #FE - jr z,x093F ;конец таблицы секторов - ld a,#05 ;следующий сектор - add a,l - ld l,a - jr nc,x0931 - inc hl ;!!!ОШИБКА??? должно быть inc h - jr x0931 -x093F inc hl - pop bc - or a - sbc hl,bc - ld c,l - ld b,h ;размер таблицы секторов - pop hl - ret - -;АДРЕС: #0948 R8DOS #0B(11) форматирование дорожки, на которой находится -; магнитная головка дисковода. Форматирование производится согласно -; таблице секторов. Данные из таблицы напрямую переносятся на -; дискету, никаких проверок на их корректность не производится, -; заканчивает таблицу идентификационный байт, больший 128. Размер -; сектора выбирается согласно байту +4, заполняется сектор -; константой #00/#FF. После записи очередного сектора в байт по -; адресу, содержащемуся в регистре DE, записывается число 2Ch, а -; значение DE увеличивается на единицу. -;вх: b =#00/#40 - режим FM/MFM -; hl - таблица расположения секторов -; de - адрес рабочего буфера (6 - 7 килобайт) -x0948 call x03A2 ;установка номера дорожки для позиционирования - ld (xDDA7),de ;сохраним de - ld e,b - bit 5,(iy+#0B) - jr z,x0969 ;функции вызываются из монитора - call x092F ;вычисление размера таблицы секторов - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0969 ;память копировать не надо - push de - ld de,xEBF5 - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - pop de -;форматирование дорожки -x0969 ld b,e - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x09B2 ;реальная дискета -; образ диска tr-dos - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),b - ld hl,xE6A9 ;очистка буфера - ld (hl),#00 - ld de,xE6A9+1 - ld bc,#00FF - ldir - pop hl - ld de,(xDDA7) -x0986 ld a,(hl) - cp #FE - ret z ;конец таблицы секторов - or a - jr nz,x09A1 ;сектор не прочитан - inc hl - inc hl - inc hl - push de - ld e,(hl) - dec e ;логический номер сектора - push hl - ld hl,xE6A9 - call x0708 ;запись сектора на образ HDD - pop hl - pop de - dec hl - dec hl - dec hl - jr nc,x09A5 ;ошибок не было -x09A1 ld a,#2B ;ошибка - jr x09A7 -x09A5 ld a,#2C ;ошибок не было -x09A7 ld (de),a - inc de - ld a,#05 - add a,l - ld l,a - jr nc,x0986 - inc h - jr x0986 -; реальная дискета -x09B2 ld de,(xDDA7) - push de - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),b - push bc - call x0824 ;позиционирование на заданную дорожку - call x0322 ;опрос Break и прерывание, если нажата - pop bc - pop hl - exx - ex (sp),hl ;hl' - адрес рабочего буфера - exx - ld c,#7F - ld e,#C0 - ld a,#F0 ;команда: запись дорожки - bit 6,b - jp nz,x0AAC ;режим MFM - -;запись дорожки в режиме FM -;вх: c=#7F -; e=#C0 -; a=#F0 - out (#1F),a ;команда запись дорожки -; индексное поле - ld d,#4E - ld b,#50 - call x0A98 ;запись #50 байт #4E (послеиндексный промежуток) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F6 - ld b,#03 - call x0A98 ;запись #03 байт #F6 (запись C2 - синхронизирующий AM) - ld d,#FC - call x0AA3 ;запись байта #FC (индексная метка) -; секторы -x09EF ld d,#4E - ld b,#32 - call x0A98 ;запись #32 байт #4E (первый пробел) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F5 - ld b,#03 - call x0A98 ;запись A1 - синхроимпульс - ld d,#FE - call x0AA3 ;запись байта #FE (адресная метка идентификатора) - inc hl - ld d,(hl) - call x0AA3 ;запись номера дорожки - inc hl - ld d,(hl) - call x0AA3 ;запись номера головки (сторона) - inc hl - ld d,(hl) - call x0AA3 ;запись номера сектора - inc hl - ld d,(hl) - call x0AA3 ;запись кода длины сектора - ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#4E - ld b,#16 - call x0A98 ;запись #16 байт #4E (второй пробел) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F5 - ld b,#03 - call x0A98 ;запись A1 - синхроимпульс - ld d,#FB - call x0AA3 ;запись байта #FB (адресная метка данных) - ld d,#00 - ld b,c - call x0A98 ;запись #7F байт #00 (данные сектора) - call x0AA3 ;запись байта #00 (данные сектора) - ld a,(hl) - or a - jr z,x0A61 ;длина сектора 128 байт - ld b,c - call x0A98 ;запись #7F байт #00 (данные сектора) - call x0AA3 ;запись байта #00 (данные сектора) - ld a,(hl) - dec a - jr z,x0A61 ;длина сектора 256 байт - call x0A98 ;запись #100 байт #00 (данные сектора) - ld a,(hl) - rrca - jr nc,x0A61 ;длина сектора 512 байт - call x0A98 ;запись #100 байт #00 (данные сектора) - call x0A98 ;запись #100 байт #00 (данные сектора) -x0A61 ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#4E - ld b,#09 - call x0A98 ;запись #09 байт #4E (третий пробел) - inc hl - call x0AA3 ;запись байта #4E - exx - ld (hl),#2C ;признак записи сектора - inc hl - exx - call x0AA3 ;запись байта #4E - ld a,(hl) - rlca - jp nc,x09EF ;повторим, если не конец - call x0A8E ;запись байта #4E до конца дорожки - in a,(#1F) - exx - pop hl - exx - bit 6,a - ret z ;выход без ошибок - ld a,#02 - jp x04D1 ;ошибка: защита от записи - -;запись чисел D в порт C до конца дорожки -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -x0A8E in a,(#FF) - and e - jr z,x0A8E - ret m - out (c),d - jr x0A8E - -;запись B чисел D в порт C -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -; b - количество байт для записи -x0A98 in a,(#FF) - and e - jr z,x0A98 - ret m - out (c),d - djnz x0A98 - ret - -;запись числа D в порт C -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -x0AA3 in a,(#FF) - and e - jr z,x0AA3 - ret m - out (c),d - ret - -;запись дорожки в режиме MFM -;вх: c=#7F -; e=#C0 -; a=#F0 -x0AAC out (#1F),a ;команда запись дорожки -; индексное поле - ld d,#FF - ld b,#28 - call x0A98 ;запись #28 байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 - ld d,#FC - call x0AA3 ;запись байта #FC -; секторы -x0AC1 ld d,#FF - ld b,#0C - call x0A98 ;запись #0C байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 (пробел) - ld d,#FE - call x0AA3 ;запись байта #FE (адресная метка индексных данных) - inc hl - ld d,(hl) - call x0AA3 ;запись номера дорожки - inc hl - ld d,(hl) - call x0AA3 ;запись номера головки (сторона) - inc hl - ld d,(hl) - call x0AA3 ;запись номера сектора - inc hl - ld d,(hl) - call x0AA3 ;запись кода длины сектора - ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#FF - ld b,#0B - call x0A98 ;запись #0B байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 (второй пробел) - ld d,#FB - call x0AA3 ;запись байта #FB (адресная метка данных) - ld d,#FF - ld b,c - call x0A98 ;запись #7F байт #FF (данные сектора) - call x0AA3 ;запись байта #FF (данные сектора) - ld a,(hl) - or a - jr z,x0B25 ;длина сектора 128 байт - ld b,c - call x0A98 ;запись #7F байт #FF (данные сектора) - call x0AA3 ;запись байта #FF (данные сектора) - ld a,(hl) - dec a - jr z,x0B25 ;длина сектора 256 байт - call x0A98 ;запись #100 байт #FF (данные сектора) - ld a,(hl) - rrca - jr nc,x0B25 ;длина сектора 512 байт - call x0A98 ;запись #100 байт #FF (данные сектора) - call x0A98 ;запись #100 байт #FF (данные сектора) -x0B25 ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#FF - ld b,#05 - call x0A98 ;запись #05 байт #FF (третий пробел) - inc hl - call x0AA3 ;запись байта #FF - exx - ld (hl),#2C ;признак записи сектора - inc hl - exx - call x0AA3 ;запись байта #FF - ld a,(hl) - rlca - jp nc,x0AC1 ;повторим, если не конец - call x0A8E ;запись байта #FF до конца дорожки - in a,(#1F) - exx - pop hl - exx - bit 6,a - ret z ;выход без ошибок - ld a,#02 - jp x04D1 ;ошибка: защита от записи - -;АДРЕС: #0B52 преобразование кода размера сектора в байтах в число -;вх: c[0..3] - код размера сектора в байтах -;вых: bc - размер сектора в байтах -x0B52 ld a,c - and #03 - ld b,a - inc b - ld c,#01 -x0B59 sla c - djnz x0B59 - ld b,c - srl b - ld c,#00 - srl b - rr c - ret - -;АДРЕС: #0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов -;вх: hl - адрес таблицы секторов -; e - заменяемый идентификатор -; d - устанавливаемый идентификатор -; -x0B67 bit 5,(iy+#0B) - jr z,x0B8F ;замена идентификаторов в таблице секторов - call x092F ;bc - размер таблицы секторов - call x1B45 - jr nc,x0B8F ;вся таблица в пределах [#4000..#BFFF] - push hl ;замена с переносом в буфер - push bc - push de - ld de,xE5A9 ;буфер - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - pop de - call x0B8F ;замена идентификаторов в таблице секторов - pop bc - pop de - ld hl,xE5A9 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret -x0B8F push hl - pop ix - jr x0BF5 ;замена идентификаторов в таблице секторов - -;АДРЕС: #0B94 R8DOS #0C(12) чтение дорожки. Порядок считывания определяется -; содержимым таблицы расположения секторов. Считанные сектора -; помещаются в буфер дорожки, никаких разделителей между ними не -; ставится. Сектора со значением идентификационного байта #FF или -; #FC не считываются, но в буфере для них пропускается -; соответствующее длине (байт +4) место. Если сектор не может быть -; считан, то соответствующий идентификатор в таблице заменяется на -; #FD. Идентификатор успешно считанного сектора заменяется на #FC, -; а по окончании операции все идентификаторы #FC автоматически -; переводятся в #00 -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0B94 ld a,#80 - jr x0B9A - -;АДРЕС: #0B98 R8DOS #0D(13) последовательная запись. Порядок записи определяется -; содержимым таблицы расположения секторов. Сектора, для которых значение -; идентификационного байта #FF или #FC не записываются, а в буфере -; пропускается соответствующее длине такого сектора (байт + 4) место. -; Если сектор не может быть записан, то соответствующий идентификатор в -; таблице заменяется на #FD. По окончании записи все идентификаторы #FC -; автоматически переводятся в #00. -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0B98 ld a,#A0 -x0B9A ld (xFFE1),a - ld (xFFE2),de - ld (xFFE4),de - call x03A2 ;установка номера дорожки для позиционирования - bit 5,(iy+#0B) - jr z,x0C08 ;вызов из монитора - call x092F ;вычисление размера таблицы секторов - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0C08 ;копировать не надо - push hl - ld de,xE5A9 - push bc - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - call x0C08 ;чтение/запись дорожки - pop bc - pop de - ld hl,xE5A9 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret - -;завершение. дорожка прочитана -x0BCE pop ix - pop bc - ld hl,xFFDD - ld a,(hl) ;код ошибки - inc a - jr z,x0BEC ;ошибок не было - ld (hl),#FF - ld de,(xFFE4) ;начало буфера дорожки - ld (xFFE2),de - ld a,(xFFDC) - rlca - jr c,x0BEA ;подключен образ, повторять нет смысла - djnz x0C12 ;повторим попытку -x0BEA ld (hl),#14 -x0BEC call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a - ld de,#00FC - -;замена идентификаторов в таблице секторов -;вх: ix - адрес таблицы секторов -; e - заменяемый идентификатор -; d - устанавливаемый идентификатор -x0BF5 ld bc,#0005 -x0BF8 ld a,(ix+0) - cp #FE - ret z ;конец таблицы - cp e - jr nz,x0C04 ;слезующий сектор - ld (ix+0),d ;заменяем идентификатор -x0C04 add ix,bc - jr x0BF8 - -;чтение/запись дорожки -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0C08 push hl - call x0824 ;позиционирование на заданную дорожку c тайм-аутом - pop ix ;адрес таблицы секторов - ld a,(xFFCB) ;количество попыток считывания при ошибке - ld b,a -x0C12 push bc - push ix -x0C15 ld a,(ix+0) - inc ix - cp #FC - jr z,x0C6F ;сектор не читаем. пропускаем место для него - cp #FF - jr z,x0C6F ;сектор не читаем. пропускаем место для него - cp #FE - jr z,x0BCE ;конец таблицы - call x0322 ;опрос Break и прерывание, если нажата - ld a,(ix+0) - out (#3F),a ;номер дорожки - ld c,(ix+3) ;код длины сектора - ld a,(xFFDC) - rlca - jr nc,x0C3E ;реальная дискета - ld a,c - cp #01 - ld a,#FD - jr nz,x0C67 ;на образе сектор может быть только 256 байт -x0C3E call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) ;адрес в буфере дорожки - ld a,(ix+2) ;номер сектора - dec a - ld e,a - push de - ld a,(xFFE1) - bit 5,a - push af - call nz,x06B4 ;запись сектора - pop af - call z,x0610 ;чтение сектора - pop de - bit 6,a ;защита от записи - push af ;!!!ОШИБКА!!! при записи состояние регистра - ld a,#02 ;состояния не сохраняется - jp nz,x04D1 ;ошибка. прерывание функции - pop af - and #1F - ld a,#FC ;признак успешной операции - jr z,x0C6C ;!!!ОШИБКА!!! при операции записи будет всегда z -x0C67 ld (xFFDD),a ;код ошибки - ld a,#FD -x0C6C ld (ix-1),a -x0C6F ld c,(ix+3) ;код размера сектора - call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) ;адрес в буфере дорожки - add hl,bc - ld (xFFE2),hl - ld bc,#0004 ;следующая запись в таблице секторов - add ix,bc - jr x0C15 - -;АДРЕС: #0C83 опрос Break. cy=1 не нажата -x0C83 push hl - ld hl,x0C96 ;адрес возврата - push hl - ld hl,rom3_x3D30 ;включение rom 7 - push hl - ld hl,rom5_x0110 ;опрос Break. cy=1 не нажата x0110 - push hl - ld hl,xFFEF - ld (hl),#C9 ;ret - jp (hl) -x0C96 pop hl - ret - -;АДРЕС: #0C98 остановка контроллера ВГ93 -;вых: a - значение выведенное в порт #FF -x0C98 call x0356 ;подготовка байта для выбора заданного дисковода - and %11111011 - out (#FF),a ;сброс ВГ93 - nop - nop - nop - or #04 - out (#FF),a ;загрузка головки, сторона верхняя, метод записи - push af - ld a,#D0 - out (#1F),a ;команда прерывания - pop af - ret - -;АДРЕС: #0CAD таблица адресоф функций R8DOS -x0CAD dw x029C ;#00(0) сброс контроллера - dw x03C5 ;#01(1) выбор текущего дисковода - dw x0457 ;#02(2) позиционирование на заданный логический трек - dw x05D8 ;#03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) - dw x054E ;#04(4) повторить в случае ошибки функцию 5 (или 6) - dw x0553 ;#05(5) чтение группы секторов - dw x0557 ;#06(6) запись группы секторов - dw x084F ;#07(7) идентификация диска - dw x08D4 ;#08(8) идентификация диска для tr-dos - dw x0922 ;#09(9) установка рабочего буфера для функции 8 - dw x077F ;#0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера - dw x0948 ;#0B(11) форматирование дорожки - dw x0B94 ;#0C(12) чтение дорожки - dw x0B98 ;#0D(13) запись дорожки - dw x0502 ;#0E(14) физическое позиционирование на трек - dw x0B67 ;#0F(15) замена идентификатора в таблице расположения секторов - dw x032B ;#10(16) чтение/установка спецификации дискеты - dw x0335 ;#11(17) чтение кода спецификации дисковода - dw x0546 ;#12(18) в hl адрес таблицы с количеством секторов на дорожке - dw x02CA ;#13(19) установка режима time-out для счетчика включения двигателя дисковода - dw x11DB ;#14(20) открыть файл для последующих операций с ним - dw x1307 ;#15(21) закрыть файл, открытый функцией 20 - dw x1240 ;#16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - dw x128C ;#17(23) запись байта в файл. Файл должен быть открыт как "логический" - dw x14C0 ;#18(24) удаление файла, адрес спецификации которого задан в регистрах hl - dw x111E ;#19(25) физический поиск файла, указанного в fcb, в каталоге диска - dw x1125 ;#1A(26) !!!ОШИБКА!!! маски, после первого поиска больше нету - dw x11B0 ;#1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - dw x1365 ;#1C(28) последовательное чтение очередного сектора из файла - dw x1395 ;#1D(29) последовательная запись одного сектора из памяти - dw x1360 ;#1E(30) последовательное считывание заданного количества секторов - dw x1390 ;#1F(31) последовательная запись заданного количества секторов - dw x1407 ;#20(32) установка нового значения указателя в файле - dw x1545 ;#21(33) чтение из fcb в bc указателя файла - dw x1E74 ;#22(34) идентификация жесткого диска - dw x187F ;#23(35) подключение раздела к драйверу HDD - dw x1B7E ;#24(36) прямое чтение секторов из подраздела жесткого диска - dw x1BC0 ;#25(37) прямая запись секторов в подраздел жесткого диска - dw x1BFE ;#26(38) Вернуть таблицу (каталог) подраздела - dw x1C2D ;#27(39) чтение/запись сектора (???ОШИБКА???) - dw x18C0 ;#28(40) подключение раздела к драйверу HDD - -;АДРЕС: #0CFF установка переменных дисковой BIOS -x0CFF ld bc,#FFBA - ld a,%11110111 ;запрет прерываний от PIC - ld (xDFF0),a - out (c),a ;регистр данных - ld bc,#7FBA ;регистр виртуальных дисководов - ld a,#FF - ld (xDFEE),a - out (c),a - ld hl,x0D1F - ld de,xFFC0 - ld bc,#0032 - ldir - ret -;переменные дисковой BIOS -x0D1F db #1A,#0F,#08,#04 ;MFM максимальное число секторов на дорожке для сектора 128/256/512/1024 - db #16,#10,#09,#05 ;FM максимальное число секторов на дорожке для сектора 128/256/512/1024 - dw #FFC0 ;адрес таблицы с количеством секторов на дорожке - db #00 ;номер текущего дисковода: 0 - дисковода А, 1 - В - db #03 ;число попыток считывания при ошибке, начальное значение 3 - db #C0,#C0,#C0,#C0 ;коды, определяющие тип дисковода (спецификацию) A/B/C/D - db #A1,#A1,#A1,#A1 ;коды, определяющие тип дискеты в дисководе А/B/C/D - db #00,#00,#00,#00 ;текущий номер дорожки для дисковода A/B/C/D - db #FF,#FF,#FF,#FF ;код time-out для дисковода А/B/C/D - db #00 ;флаги R8DOS - db #FF ;код ошибки дискового интерпретатора - ds #11,0 ;прочие переменные - db #C9 ;ret для вызова п/п опроса Break из rom 5 - dw #0000 ;адрес рабочего буфера для функции 8 - -;АДРЕС: #0D51 определение наличия SMUC -;вых: cy=1 SMUC не найден -x0D51 ld bc,#00FE - call x0E01 - jr c,x0DA1 ;SMUC не найден - ld l,a - inc bc - call x0E01 - jr c,x0DA1 - ld h,a - ret - -;АДРЕС: #0D62 определение наличия NVRAM -x0D62 call x0D51 ;определение наличия SMUC - ret c ;если SMUC отсутствует. то и NVRAM тоже - call x0DE8 - jr c,x0DA1 ;NVRAM не найден - sbc hl,de - jr z,x0D8E -x0D6F rst #30 - dw rom4_x0378 ;запись переменных в NVRAM - db #04 - ld bc,#0000 - ld a,#61 - call x0E4B ;запись числа в A в ячейку NVRAM в BC - jr c,x0DA1 - call x0DE8 - jr c,x0DA1 - call x0E72 - jr c,x0DA1 - call x0D9A - ld a,#33 ;сообщение: NVRAM checksum error - scf - ret -x0D8E ld bc,#0000 - call x0E01 - jr c,x0DA1 ;NVRAM не найден - cp #61 - jr nz,x0D6F ;контрольное значение не совпадает. перезаписываем переменные -x0D9A set 5,(iy+#1A) - ld a,#27 ;сообщение: NVRAM found - ret -x0DA1 ld a,#26 ;сообщение: NVRAM not found - scf - ret - -;АДРЕС: #0DA5 cy=1, a=#01 !!!Not Used!!! -x0DA5 ld a,#01 - scf - ret - -;АДРЕС: #0DA9 cy=1, a=#02 !!!Not Used!!! -x0DA9 ld a,#02 - scf - ret - -;АДРЕС: #0DAD чтение всей памяти NVRAM в память #7530 -x0DAD ld hl,#7530 - ld de,#0800 - ld bc,#0000 - -;АДРЕС: #0DB6 чтение данных из NVRAM -;вх: hl - адрес куда читать -; de - сколько читать -; bc - адрес в NVRAM для чтения -x0DB6 call x0E01 - jr c,x0DC4 - ld (hl),a - inc hl - inc bc - dec de - ld a,e - or d - jr nz,x0DB6 - ret -;ошибки чтения NVRAM -x0DC4 ld a,#69 ;сообщение: NVRAM R/W error - ret - -;АДРЕС: #0DC7 запись всей памяти NVRAM из памяти #7530 -x0DC7 ld hl,#7530 - ld de,#0800 - ld bc,#0000 - -;АДРЕС: #0DD0 запись данных в NVRAM -;вх: hl - адрес откуда записывать -; de - сколько читать -; bc - адрес в NVRAM для записи -x0DD0 ld a,(hl) - call x0E4B ;запись одной ячейки NVRAM - jr c,x0DC4 - inc hl - inc bc - dec de - ld a,e - or d - jr nz,x0DD0 - call x0DE8 - jr c,x0DC4 - call x0E72 - jr c,x0DC4 - ret - -x0DE8 ld de,#FFFF - ld bc,#0000 -x0DEE call x0E01 - ret c - call x220F ;суммирование байта с контрольной суммой CRC8 - inc bc - ld a,#FE - cp c - jr nz,x0DEE - ld a,#00 - cp b - jr nz,x0DEE - ret - -x0E01 push bc - exx - ex (sp),hl - exx - push hl - push de - push af - call x0F42 - call x0E91 - jr nz,x0E41 - call x0EB1 - call x0EF7 - call x0EDE - jr nz,x0E41 - call x0F2C - call x0EA5 - set 0,d - call x0EF7 - call x0EDE - jr nz,x0E41 - call x0EB8 - call x0EDE -x0E31 call x0F1C - call x0F3E - pop af - ld a,d - or a -x0E3A pop de - pop hl - exx - ex (sp),hl - exx - pop bc - ret -x0E41 call x0F1C - call x0F3E - pop af - scf - jr x0E3A - -;запись числа в A в ячейку NVRAM в BC -x0E4B push bc - exx - ex (sp),hl ;адрес в NVRAM - exx - push hl - push de - push af - ld e,a - call x0F42 - call x0E91 - jr nz,x0E41 - call x0EB1 - call x0EF7 - call x0EDE - jr nz,x0E41 - ld d,e - call x0EF7 - call x0EDE - jr nz,x0E41 - ld d,e - jr x0E31 - -;АДРЕС: #0E72 что-то пишет в NVRAM -x0E72 ld bc,#00FE - ld a,e - call x0E4B ;запись числа в A в ячейку NVRAM в BC - ret c - inc bc - ld a,d - call x0E4B ;запись числа в A в ячейку NVRAM в BC - ret c - push bc - exx - ex (sp),hl - exx - push hl - push de - push af - call x0F42 - call x0E91 - jr nz,x0E41 - jr x0E31 - -x0E91 ld l,#C8 -x0E93 call x0F2C - call x0EA5 - call x0EF7 - call x0EDE - ret z - dec l - jr nz,x0E93 - scf - ret - -x0EA5 push af - exx - ld a,h - exx - and #07 - rlca - or %10100000 - ld d,a - pop af - ret - -x0EB1 push af - exx - ld a,l - exx - ld d,a - pop af - ret - -x0EB8 push hl - ld l,#08 - and %10111111 - or %00010000 - out (c),a -x0EC1 call x0F52 - or %01000000 - out (c),a - nop - nop - in h,(c) - sla h - sla h - rl d - call x0F52 - and %10111111 - out (c),a - dec l - jr nz,x0EC1 - pop hl - ret - -x0EDE or %00010000 - out (c),a - call x0F52 - or %01000000 - out (c),a - push hl - in l,(c) - call x0F52 - and %10111111 - out (c),a - bit 6,l - pop hl - ret - -x0EF7 push hl - ld l,#08 - and %10111111 - out (c),a -x0EFE push bc - pop bc - and %11101111 - rl d - jr nc,x0F08 - or %00010000 -x0F08 out (c),a - push bc - pop bc - or %01000000 - out (c),a - call x0F52 - and %10111111 - out (c),a - dec l - jr nz,x0EFE - pop hl - ret - -x0F1C and %11101111 - out (c),a - call x0F52 - or %01000000 - out (c),a - call x0F52 - jr x0F4A -x0F2C or %01010000 - out (c),a - call x0F52 - and %11101111 - out (c),a - call x0F52 - and %10111111 - jr x0F4C -x0F3E or %00100000 - jr x0F4A -x0F42 ld bc,#FFBA - ld a,(xDFF0) - and #DF ;%11011111 -x0F4A or #50 ;%01010000 -x0F4C ld (xDFF0),a - out (c),a - ret - -x0F52 push bc - pop bc - ret - -x0F55 db #00,#08,#00,#00 ;для сравнения чисел -x0F59 db #00,#02,#00,#00 ;для сравнения чисел - -;АДРЕС: #0F5D деление de'hl'=de'hl'/bc -;вх: de'hl' - делимое -; bc - делитель -;вых: de'hl' - значение -; hl остаток от деления -; -x0F5D ld hl,#0000 - push hl - ld e,l - ld d,h - exx - ld b,#20 -x0F66 xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - rla - or a - sbc hl,bc - ex (sp),hl - ex de,hl - sbc hl,de - ex de,hl - ex (sp),hl - exx - sbc a,#00 - jr nz,x0FAD -x0F87 inc l - djnz x0F66 - inc sp - inc sp - exx - ret -x0F8E xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - rla - add hl,bc - ex (sp),hl - ex de,hl - adc hl,de - ex de,hl - ex (sp),hl - exx - sbc a,#00 - jr z,x0F87 -x0FAD djnz x0F8E - exx - add hl,bc - jr nc,x0FB4 - inc de -x0FB4 inc sp - inc sp - ret - -;АДРЕС: #0FB7 умножение dehl=de'hl' * bc -;вх: de'hl' - первый множитель -; bc - второй множитель -;вых: dehl - значение -; -x0FB7 ld hl,#0000 - push hl - ld e,l - ld d,h - exx - ld b,#20 -x0FC0 exx - xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - jr nc,x0FED - exx - add hl,bc - ld a,e - adc a,#00 - ld e,a - ld a,d - adc a,#00 - ld d,a - exx - jr nc,x0FED - ld l,a - adc a,#00 - ld l,a - ld h,a - adc a,#00 - ld h,a - jr nc,x0FED - inc de -x0FED djnz x0FC0 - exx - inc sp - inc sp - ret - -;АДРЕС: #0FF3 инкремент dehl -;вх: dehl - число -;вых: dehl=dehl + 1 -; -x0FF3 ld c,#00 - ld a,l - add a,#01 - ld l,a - ld a,h - adc a,c - ld h,a - ld a,e - adc a,c - ld e,a - ld a,d - adc a,c - ld d,a - ret - -;АДРЕС: #1003 копирование из (hl) в (de) 4х байт -x1003 push bc - push hl - push de - ld bc,#0004 - ldir - pop de - pop hl - pop bc - ret - -;АДРЕС: #100F загрузка числа в регистры из памяти -;вх: hl - адрес откуда грузим -;вых: dehl - число -x100F push hl - pop bc - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a - inc bc - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - ret - -;АДРЕС: #101D сложение 4х байтного числа с двухбайтным -;вх: de - адрес 2х байтного числа -; hl - адрес 4х байтного числа -;вых: по адресу hl сумма этих чисел -x101D ex de,hl - push bc - xor a - ld b,#02 -x1022 ld a,(de) - adc a,(hl) - ld (de),a - inc hl - inc de - djnz x1022 - ld a,(de) - adc a,#00 - ld (de),a - inc hl - inc de - ld a,(de) - adc a,#00 - ld (de),a - pop bc - ret - -;АДРЕС: #1035 сравнение двух чисел в памяти по адресам в de и hl -;вх: de - адрес 4х байтного числа e9e7 -; hl - адрес 4х байтного числа e9eb -;вых: nz,c,m - (hl)<(de) -; nz,nc,p - (hl)>(de) -; z,nc,p - (hl)=(de) -; -x1035 push bc - ex de,hl - inc hl - inc hl - inc hl - inc de - inc de - inc de - ld a,(de) - or a - jp m,x1048 ;(de) отрицательное - xor (hl) - jp m,x1060 ;(hl) отрицательное - jr x104C -x1048 xor (hl) - jp m,x105B ;(de) отрицательное, (hl) положительное -;сравнение чисел с одинаковым знаком -x104C ld b,#04 -x104E ld a,(de) - cp (hl) - jr c,x105B ;(de)<(hl) - jr nz,x1060 - dec hl - dec de - djnz x104E - xor a - pop bc - ret -;nz,c,m - (de вх)>(hl вх) -x105B xor a - sub #01 - pop bc - ret -;nz,nc,p - (de вх)<(hl вх) -x1060 xor a - add a,#01 - pop bc - ret - -;АДРЕС: #1065 инициализация дисковода -x1065 ld hl,#0000 - ld (xDFFE),hl - ld (xE000),hl - ld a,(xFFCA) ;номер текущего дисковода -x1071 ld c,#01 - call x0229 ;R8DOS #01(1) - xor a - ld c,a - jp x0229 ;R8DOS #00(0) - -;АДРЕС: #107B инициализация дисковода и настройка на дискету -;вых: b - код, определяющий тип дискеты в дисководе -; a - код ошибки -x107B call x1065 ;инициализация дисковода - jr c,x1097 ;ошибка - ld hl,xE5A9 - ld (xFFE7),hl ;;адрес рабочего буфера для функции 8 - ld c,#08 ;идентификация диска - call x0229 ;R8DOS #08(8) - push af - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld b,(hl) - ld hl,#0000 - ld (xFFE7),hl ;адрес рабочего буфера для функции 8 - pop af -x1097 ret nc - ld a,(xFFDD) ;код ошибки дискового интерпретатора - cp #10 - scf - ld a,#3F ;дискета не соответствует формату TR-DOS - ret z - ld a,#50 ;HDD не вышел в готовность - ret - -;АДРЕС: #10A4 распознавание имени файла и занесение его в fcb -;вх: ix - адрес буфера для fcb -; hl - адрес строки, содержащей имя и тип файла в asciz -;вых: nz - успешно -; z - ошибка -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; -x10A4 ld a,(xFFCA) - ld (ix+#18),a ;номер текущего дисковода -;выделение дисковода из строки - ld c,(hl) - inc hl - ld a,":" - cp (hl) - jr nz,x10CB ;дисковод не указан - ld a,c - cp "A"-1 - jr c,x10BA ;не буква - and #5F - sub #11 -x10BA sub #30 - jr nc,x10C2 -x10BE ld a,#44 ;несуществующий дисковод - or a - ret -x10C2 cp #04 - jr nc,x10BE ;несуществующий дисковод - ld (ix+#18),a ;номер дисковода - inc hl - inc hl -x10CB ld (ix+#08),"C" ;тип файла по умолчанию - dec hl -;распознаем имя и расширение файла - push ix - pop de - ld bc,#0009 -x10D6 rst #30 - dw rom2_x0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D - db #02 - jr z,x1102 ;символ конца имент - cp #2E ;. - jr nz,x10E7 ;допустимый в имени символ - inc hl - call x110F ;проверка символа расширения файла - jr z,x10F7 ;допустимый символ расширения - dec hl ;иначе распознаем точку как символ имени файла -x10E7 ldi - jp pe,x10D6 -x10EC rst #30 ;имя и расширение заполнено - dw rom2_x0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D - db #02 - scf - ccf - ret z ;конец строки -x10F3 ld a,#45 ;ошибка в имени файла - or a - ret -x10F7 ld (ix+#08),a - call x1102 ;заполнение остатка имени пробелами - jr nz,x10F3 ;пустое имя. ошибка в имени файла - inc hl - jr x10EC ;проверка остатка строки -x1102 ld a,#09 - cp c - jr z,x10F3 ;пустое имя. ошибка в имени файла -x1107 dec c ;заполнение остатки мени пробелами - ret z - ld a," " - ld (de),a - inc de - jr x1107 -;проверка символа расширения файла -x110F ld a,(hl) - cp #23 ;# - ret z - and %11011111 - cp #43 ;C - ret z - cp #42 ;B - ret z - cp #44 ;D - ret - -;АДРЕС: #111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска -;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z -; a=#50(80) - ошибка диска -; cy=0, z - файл не найден -; cy=0, nz - файл найден и скопирован в fcb -; -x111E call x153D ;копирование дескриптора дисковода в буфер - call x107B ;инициализация дисковода - ret c ;ошибка - -;АДРЕС: #1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb !!!ОШИБКА!!! маски, после первого поиска больше нету -;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z -; a=#50(80) - ошибка диска -; cy=0, z - файл не найден -; cy=0, nz - файл найден и скопирован в fcb -; -x1125 push hl -x1126 pop hl - call x1166 ;загрузка очередного дескриптора файла в буфер - ld (ix+#19),c - ret c ;ошибка загрузки: a=#50 - ret z ;конец каталога. файл не найден -;сравнение имени файла с маской поиска - push hl - push ix - pop de - ld b,#09 -x1135 ld a,(de) - cp "?" - jr z,x113D - cp (hl) - jr nz,x1126 ;не совпало, следующее имя файла -x113D inc hl - inc de - djnz x1135 - pop hl -;файл найден. копируем дескриптор в fcb -x1142 push hl - ld bc,#0010 - push ix - pop de - ldir - pop hl - inc b ;флаг nz - ret - -;АДРЕС: #114E загрузка дескриптора файла в буфер -;вх: c - номер файла на диске -;вых: cy=1 -> a=#50 ошибка чтения диска -; hl - адрес дескриптора файла в буфере -; c - номер этого файла на диске [#00..#7F] -x114E ld hl,xDFFE - ld a,c - and %01110000 - rrca - rrca - rrca - rrca - ld (hl),a ;номер сектора - inc hl - inc a - ld (hl),a ;номер следующего сектора - inc hl - ld a,c - and #0F - dec a - ld (hl),a ;номер записи в секторе - dec hl - ld a,(hl) - jr x1177 - -;АДРЕС: #1166 загрузка очередного дескриптора файла в буфер -;вых: cy=1 -> a=#50 ошибка чтения диска -; cy=0, z - конец каталога. файл не найден -; cy=0, nz - дескриптор найден -; hl - адрес дескриптора файла в буфере -; c - номер этого файла на диске [#00..#7F] -x1166 ld hl,xDFFE - ld a,(hl) - inc a - inc hl - cp (hl) - inc hl - jr z,x1182 ;сектор уже загружен - ld (hl),#FF ;сброс номера дескриптора файла - cp #09 - ret nc ;выход. конец каталога - dec hl - ld (hl),a ;номер следующего сектора -x1177 inc hl - push hl - ld e,a - dec e ;e - номер сектора - call x1567 ;чтение одного сектора нулевой дорожки в буфер - pop hl - ld a,#50 - ret c ;ошибка -x1182 ld a,(hl) - inc a - cp #10 - jr c,x118D ;следующий номер дескриптора файла в загруженном секторе - dec hl ;нет больше записей в загруженном секторе - dec hl - inc (hl) - jr x1166 ;грузим следующий сектор -x118D ld (hl),a ;номер дескриптора файла в загруженном секторе [#0..#F] - rlca - rlca - rlca - rlca - ld hl,xE5A9 ;буфер загруженного сектора - call x11AB ;hl=hl+a*#10 (адрес дескриптора файла) - ld a,(xDFFE) ;номер загруженного сектора [#01..#10] - rlca - rlca - rlca - rlca - ld c,a - ld a,(xE000) ;номер дескриптора файла в загруженном секторе [#0..#F] - or c - ld c,a ;номер дескрптора файла на диске [#00..#7F] - inc a ;установка флага nz - ret - -;АДРЕС: #11A7 получение адреса байта в буфере dma -;вх: c - смещенеи в буфере -x11A7 call x1553 ;чтение из fcb в hl адреса буфера dma - ld a,c -x11AB add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -;вх: hl - адрес строки имени файла в asciz -; ix - адрес буфера создаваемого fcb -; de - адрес буфера dma -; b - способ открытия -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: -; a=#4A(74) - неверный тип файла -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; ix - адрес буфера fcb -; -x11B0 push bc ;очищаем блок fcb - push ix - ex (sp),hl - ld b,#1C - xor a -x11B7 ld (hl),a - inc hl - djnz x11B7 - pop hl - pop bc - ld (ix+#15),e ;адрес буфера - ld (ix+#16),d - ld (ix+#17),b ;способ открытия - ld a,#03 ;проверка типа открытия файла - and b - ld a,#4A - ccf - ret z - call x10A4 ;распознавание имени файла и занесение его в fcb - scf - ret nz ;ошибка распознавания - or a - ret - -;АДРЕС: #11D4 открыть файл(для нужд монитора) для последующих операций с ним -x11D4 ld de,xE8A9 ;адрес буфера dma - ld ix,xE7A9 ;адрес буфера для fcb - -;АДРЕС: #11DB R8DOS #14(20) открыть файл для последующих операций с ним -;вх: ix - адрес буфера для fcb -; hl - адрес строки, содержащей имя и тип файла в asciz -; de - адрес буфера dma -; b - способ открытия -; 2,b =1 обмен целыми секторами "физический" файл -; (если сброшен - обмен будет вестись байтами "логический" файл) -; 1,b =1 файл для записи -; 0,b =1 файл для чтения -; 0-1,b=11 файл для модификации -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: -; a=#47(71) - нельзя открыть существующий файл только для записи -; a=#48(72) - нельзя создать файл только для чтения -; a=#49(73) - нет места на диске -; a=#4A(74) - неверный тип файла -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; cy=0 - успешно -; bc - длина файла в байтах -; -x11DB call x11B0 ;разбор спецификации файла - ret c ;ошибка - -;АДРЕС: #11DF открыть файл для последующих операций с ним -x11DF call x111E ;поиск файла на диске по имени в fcb - ret c ;ошибка чтения диска - jr z,x1200 ;файл не найден - bit 0,(ix+#17) ;файл найден - ld a,#47 - scf - ret z ;нельзя открыть существующий файл только для записи - xor a - bit 2,(ix+#17) - jr nz,x11FB ;обмен секторами - ld c,(ix+#0B) - ld b,(ix+#0C) ;bc - длина файла - ret -x11FB ld c,a - ld b,(ix+#0D) ;bc - длина файла (кратна сектору) - ret -x1200 bit 1,(ix+#17) ;файл не найден - ld a,#48 - scf - ret z ;нельзя создать файл только для чтения - call x107B - ret c ;ошибка чтения/записи - ld a,(xE5A9+#E4) ;xE68D количество файлов на дискете - ld (ix+#19),a ;номер файла на дискете - cp #80 - ld a,#49 - ccf - ret c ;нет места на диске - ld bc,(xE5A9+#E5) ;xE68E кол-во свободных секторов - ld a,c - or b - ld a,#49 - ccf - ret z ;нет места на диске - ld a,b - or a - jr z,x1228 - ld c,#FF -x1228 ld (ix+#1B),c ;максимальный объем файла в секторах - ld hl,(xE5A9+#E1) ;xE68A номер первой свободной дорожки и сектора - ld (ix+#0E),l ;сектор - ld (ix+#0F),h ;дорожка - ld a,b - or a - jr nz,x123C - ld b,c - ld c,#00 ;максимальный размер файла в байтах - ret -x123C ld bc,#FFFF ;!!!ОШИБКА!!! должно быть ld bc,#FF00 - ret - -;АДРЕС: #1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -;вх: ix - адрес буфера fcb -;вых: cy=1 были ошибки -; a - код ошибки возвращается в аккумуляторе -; a - очередной считанный байт (при cy=0) -x1240 ld c,(ix+#17) - bit 0,c - ld a,#4A - scf - ret z ;ошибка. файл открыт на запись - bit 2,c - call x1545 ;чтение из fcb в bc указателя файла - jr nz,x125E ;файл открыт как физический (чтение целых секторов) - call x154C ;чтение из fcb в hl длины файла - or a - sbc hl,bc - jr z,x125A - jr nc,x125E -x125A scf ;ошибка. конец файла - ld a,#46 - ret -x125E ld a,c - or a - jr nz,x126C ;указатель не в начале сектора - ld a,b - cp (ix+#0D) - jr nc,x125A ;ошибка. конец файла - call x1472 ;чтение сектора в буфер dma - ret c ;ошибка чтения -x126C call x11A7 ;получение адреса байта в буфере dma - ld a,(hl) - ld (ix+#1A),a - ld a,#FF - cp c - jr nz,x1287 ;еще не конец сектора - ld a,(ix+#17) - bit 1,a - jr z,x1287 ;файл открыт для чтения - bit 7,a - jr z,x1287 ;файл не был изменен - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи -x1287 ld a,(ix+#1A) - jr x12FE ;установка в fcb нового указателя в файле из bc - -;АДРЕС: #128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -;вх: ix - адрес буфера fcb -; a - байт для записи -;вых: cy=1 были ошибки -; a - код ошибки возвращается в аккумуляторе -x128C ld (ix+#1A),a - call x1545 ;чтение из fcb в bc указателя файла - ld e,(ix+#17) - bit 1,e - ld a,#4A ;!!!ОШИБКА!!! не устанавливается cy - ret z ;ошибка. файл открыт на чтение - bit 0,e - jr z,x12B8 ;файл открыт только на запись - bit 2,e ;обмен целыми секторами "физический" файл - jr nz,x12B8 ;запись байта в файл - call x154C ;чтение из fcb в hl длины файла - or a - sbc hl,bc - jr z,x12AC ;ошибка #46. конец файла - jr nc,x12B8 ;запись байта в файл -x12AC bit 7,e - jr z,x12B4 ;изменение в файле не было - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи - -;код ошибки #46. конец файла -x12B4 ld a,#46 - scf - ret - -;запись байта в файл -x12B8 ld a,c - or a - jr nz,x12EA ;указатель не в начале сектора - bit 0,e - jr nz,x12DB ;файл открыт для модификации - ld a,b - cp (ix+#1B) - jr nc,x12D3 ;попытка записи после конца файла - ld a,(ix+#0D) - cp #FF - jr nz,x12E7 ;увеличение размена файла на один сектор - call x1329 ;создание записи в каталоге диска - ret c ;ошибка записи - jr x12B4 ;ошибка #46. конец файла - -;ошибка #49. попытка записи после конца файла -x12D3 call x1329 ;создание записи в каталоге диска - ret c - ld a,#49 ;ошибка #49. попытка записи после конца файла - scf - ret -x12DB ld a,b - cp (ix+#0D) - jr nc,x12B4 ;ошибка #46. конец файла - call x1472 ;чтение сектора в буфер dma - ret c ;ошибка чтения - jr x12EA - -x12E7 inc (ix+#0D) ;увеличим размер файла в секторах -x12EA call x11A7 ;получение адреса байта в буфере dma - ld a,(ix+#1A) - ld (hl),a ;запись файла в буфер - set 7,(ix+#17) ;файл был изменен, но не сохранен - ld a,c - cp #FF - jr nz,x12FE ;установка в fcb нового указателя в файле из bc - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи -x12FE inc bc - -;АДРЕС: #12FF установка в fcb указателя в файле из bc -x12FF ld (ix+#13),c - ld (ix+#14),b - or a - ret - -;АДРЕС: #1307 R8DOS #15(21) закрыть файл, открытый функцией 20. При закрытии -; файла происходит дозапись (при необходимости) информации из -; открытых буферов -;вх: ix - адрес буфера fcb -;вых: cy=1 - были ошибки -; a - код ошибки -x1307 call x1545 ;чтение из fcb в bc указателя файла - ld a,c - or b - jr z,x130F ;файл пустой - dec bc -x130F call x12FF ;установка в fcb указателя в файле из bc - ld a,(ix+#17) - bit 1,a - ret z ;файл только для чтения - bit 7,a - jr z,x1320 ;не сохраненных изменений нет - call x1484 ;сохранение буфера dma в файл - ret c ;была ошибка -x1320 bit 0,(ix+#17) - ret nz ;файл для модификации - call x1545 ;чтение из fcb в bc указателя файла - inc bc - -;создание записи в каталоге диска -;вх: bc - длина файла в байтах -x1329 call x1440 ;сохранение из bc в fcb длины файла в байтах и секторах - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c - call x107B ;чтение в буфер служебного сектора - ret c - ld a,(xE5A9+#E4) ;xE68D - inc a - ld (xE5A9+#E4),a ;xE68D количество файлов +1 - ld hl,(xE5A9+#E5) ;xE68E - ld c,(ix+#0D) - ld b,#00 - or a - sbc hl,bc - ld (xE5A9+#E5),hl ;xE68E оставшееся свободное место в секторах - ld b,c - call x14A6 ;расчет нового номера дорожки и сектора - ld (xE5A9+#E1),de ;xE68A первая свободная дорожка и сектор - ld de,#0008 ;запишем служебный сектор -;запись буфера на диск (d - дорожка, e - сектор) -x1354 ld hl,xE5A9 -x1357 ld bc,#0106 - call x0229 - ld a,#50 - ret - -;АДРЕС: #1360 R8DOS #1E(30) последовательное считывание заданного количества -; целых секторов. Функция 30 (R_MS) подобна многократному -; выполнению функции #1C(28), с той лишь разницей, что значение, -; указанное в поле dma не изменяется. В случае ошибки полагается, -; что все сектора не считались -;вх: ix - адрес буфера fcb -; b - число считываемых секторов -;вых: cy=1 если были ошибки -; a - код ошибки - -x1360 ld (ix+#1A),b - jr x1369 - -;АДРЕС: #1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла, -; содержимое сектора размещается в памяти с адреса, указанного полем -; dma в блоке управления файлом (fcb). Для обеспечения максимальной -; скорости выполнения операции Файл должен быть открыт как -; "физический". Если файл был в режиме "логический" и если -; предварительно был считан байт (т. е. счетчик указывает не на -; границу целого сектора) подфункцией будет "пересчитан" текущий -; сектор. Максимальный номер сектора - 254. -;вх: ix - адрес буфера fcb -;вых: cy=1 если были ошибки -; a - код ошибки -x1365 ld (ix+#1A),#01 -x1369 bit 0,(ix+#17) - ld a,#4A - scf - ret z ;ошибка. файл открыт на запись - call x1545 ;чтение из fcb в bc указателя файла - ld c,#00 - ld a,b - add a,(ix+#1A) - jp c,x12B4 ;ошибка #46. конец файла - dec a - cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла - call x148D ;чтение секторов в буфер dma - ret c ;ошибка чтения -x1388 ld a,b - add a,(ix+#1A) - ld b,a - jp x12FF ;установка в fcb нового указателя в файле из bc - -;АДРЕС: #1390 R8DOS #1F(31) последовательная запись заданного количества -; секторов. Подфункция 31 (W_MS) подобна многократному выполнению -; подфункции #1D(29), с той лишь разницей, что значение, указанное -; в поле dma не изменяется. В случае ошибки полагается, что все -; сектора, принимавшие участие в операции получили случайные -; значения. -;вх: ix - адрес буфера fcb -; b - число записываемых секторов -;вых: cy=1 если были ошибки -; a - код ошибки -x1390 ld (ix+#1A),b - jr x1399 - -;АДРЕС: #1395 R8DOS #1D(29) последовательная запись одного сектора из памяти с -; адреса, указанного полем dma в блоке управления файлом (fcb), в -; файл -;вх: ix - адрес буфера fcb -;вых: cy=1 если были ошибки -; a - код ошибки -x1395 ld (ix+#1A),#01 -x1399 ld e,(ix+#17) - bit 1,e - ld a,#4A - ret z ;!!!ОШИБКА!!! cy не установлен - call x1545 ;чтение из fcb в bc указателя файла - ld c,#00 - ld a,b - add a,(ix+#1A) - jp c,x12B4 ;ошибка #46 конец файла - dec a - bit 0,e - jr nz,x13BA ;файл открыт на модификацию - cp (ix+#1B) - jp nc,x12D3 ;ошибка #49. попытка записи после конца файла - jr x13C0 -x13BA cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла -x13C0 call x1498 ;запись секторов из буфера dma - ret c ;ошибка записи - bit 0,(ix+#17) - jr nz,x1388 ;файл для модификации - ld a,(ix+#0D) - add a,(ix+#1A) - ld (ix+#0D),a ;новый размер файла - jr x1388 - -;АДРЕС: #13D5 создание записи в каталоге диска (на основе fcb) -x13D5 call x153D ;копирование дескриптора дисковода в буфер - ld b,#04 - ld d,#00 - ld e,(ix+#19) ;номер файла на диске -x13DF sla e - rl d - djnz x13DF ;de - адрес дескриптора в каталоге диска - push de - ld e,d - call x1567 ;чтение одного сектора нулевой дорожки в буфер (e - номер сектора) - pop de - ld a,#50 - ret c ;ошибка чтения - push de - ld d,#00 - ld hl,xE5A9 - add hl,de ;адрес дескриптора в буфере - ex de,hl - ld bc,#0010 - push ix - pop hl - ldir ;копируем дескриптор файла из fcb в буфер - pop de - ld e,d - ld d,#00 - jp x1354 ;запись буфера на диск (дорожка 0, e - сектор) - -;АДРЕС: #1405 установка нового значения указателя в файле -;вх: ix - адрес буфера fcb -; bc - новое значение указателя -;вых: cy=1 - если были ошибки -; a - код ошибки -x1405 ld e,c - ld d,b - -;АДРЕС: #1407 R8DOS #20(32) установка нового значения указателя в файле -;вх: ix - адрес буфера fcb -; de - новое значение указателя -;вых: cy=1 - если были ошибки -; a - код ошибки -x1407 call x1545 ;чтение из fcb в bc указателя файла - ld a,(ix+#17) - bit 0,a - jr nz,x1419 ;файл для чтения - ex de,hl - add hl,bc - ex de,hl - jr nc,x1419 ;нет переполнения - ld a,#46 ;ошибка #46 конец файла - ret -x1419 bit 1,a - jr z,x144F ;файл только для чтения - ld a,d - cp b - jr z,x142D ;новый указатель в пределах текущего сектора - bit 7,(ix+#17) - jr z,x142D ;не сохраненных изменений в файле нет - push de - call x1484 ;сохранение буфера dma в файл - pop de - ret c ;ошибка записи -x142D bit 0,(ix+#17) - jr nz,x144F ;файл открыт на модификацию - ld a,d - cp (ix+#1B) ;максимальный объем файла в секторах - jp nc,x12B4 ;ошибка #46 конец файла - ld b,d - ld c,e - call x12FF ;установка в fcb указателя в файле из bc - inc bc - -;сохранение из bc в fcb длины файла в байтах и секторах -x1440 ld (ix+#0B),c - ld (ix+#0C),b ;длина файла в байтах - ld a,c - or a - jr z,x144B - inc b -x144B ld (ix+#0D),b ;длина файла в секторах - ret - -;файл только для чтения -x144F bit 2,(ix+#17) - jr z,x145E ;обмен байтами "логический" файл - ld a,d - cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла - jr x146A -x145E call x154C ;чтение из fcb в hl длины файла - push de - ex de,hl - or a - sbc hl,de - pop de - jp nc,x12B4 ;ошибка #46. конец файла -x146A ld c,e - ld b,d ;новый указатель - call x12FF ;установка в fcb указателя в файле из bc - ld a,c - or a - ret z - -;АДРЕС: #1472 чтение сектора в буфер dma -x1472 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld bc,#0105 - -;запись/чтение сектора -x1479 call x0229 - pop bc - ld a,#50 - res 7,(ix+#17) - ret - -;АДРЕС: #1484 сохранение буфера dma в файл -;вх: bc - указатель из fcb -x1484 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld bc,#0106 - jr x1479 ;запись сектора - -;АДРЕС: #148D чтение секторов в буфер dma -;вх: bc - указатель в файле -x148D push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld c,#05 -x1493 ld b,(ix+#1A) - jr x1479 ;чтение секторов - -;АДРЕС: #1498 запись секторов из буфера dma -x1498 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld c,#06 - jr x1493 - -;АДРЕС: #14A0 расчет адреса в файле на диске (дорожка и сектор) -;вх: bc - указатель в файле -;вых: d - дорожка -; e - сектор -x14A0 call x153D ;копирование дескриптора дисковода в буфер - call x1553 ;чтение из fcb в hl адреса буфера dma - -;АДРЕС: #14A6 расчет нового номера дорожки и сектора -;вх: b - кол-во секторов -;вых: d - новый номер дорожки -; e - новый номер сектора -x14A6 ld a,b - and #F0 - rrca - rrca - rrca - rrca - add a,(ix+#0F) ;+номер начальной дорожки файла - ld d,a ;новый номер дорожки - ld a,b - and #0F - add a,(ix+#0E) ;+номер первого сектора файла - bit 4,a - jr z,x14BC - inc d -x14BC and #0F - ld e,a ;новый номер сектора - ret - -;АДРЕС: #14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -;вх: ix - адрес буфера для fcb -; hl - имя и тип в asciz -;вых: cy=1 - были ошибки -; a - код ошибки -x14C0 ld b,#01 - call x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - ret c ;были ошибки - call x111E ;R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска - ret c ;были ошибки - ld a,#48 ;ошибка #48 файл не найден - scf - ret z - push hl - ld hl,xE6A9 - ld bc,#0105 - ld de,#0008 - call x0229 ;чтение служебного сектора - pop hl - ld a,#50 - ret c ;ошибка #50. диск не вышел в готовность - ld a,(xE6A9+#E4) - dec a - cp (ix+#19) - jr z,x14FD ;этот файл последный на диске - ld hl,xE6A9+#F4 - inc (hl) ;количество удаленных файлов +1 - ld (ix+#00),#01 ;признак удаленного файла - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c ;ошибка записи -x14F4 ld hl,xE6A9 - ld de,#0008 - jp x1357 ;запись служебного сектора на диск -;удаляемый файл последний в каталоге -x14FD ld hl,xE6A9+#E4 - dec (hl) ;количество файлов -1 - ld e,(ix+#0D) - ld d,#00 ;объем удаляемого файла в секторах - ld hl,(xE6A9+#E5) ;количество свободных секторов - add hl,de - ld (xE6A9+#E5),hl ;новое количество свободных секторов - ld l,(ix+#0E) - ld h,(ix+#0F) - ld (xE6A9+#E1),hl ;номер первой свободной дорожки и сектора - ld (ix+#00),#00 ;признак удаленного файла - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c ;ошибка записи - ld c,(ix+#19) - ld a,c - or a - jr z,x14F4 ;файл первый на диске - dec c - ld (ix+#19),c - call x114E ;загрузка дескриптора файла в буфер - ret c ;ошибка чтения - call x1142 ;копируем дескриптор в fcb - ld a,(ix+#00) - cp #02 - jr nc,x14F4 ;файл существует. запись служебного сектора на диск - ld hl,xE6A9+#F4 ;файл удален - dec (hl) - jr x14FD - -;АДРЕС: #153D копирование дескриптора дисковода в буфер -x153D ld a,(ix+#18) ;номер дисковода - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, - db #02 ;если к нему примонтирован образ - ret - -;АДРЕС: #1545 R8DOS #21(33) чтение из fcb в bc указателя файла -;вх: ix - адрес буфера fcb -;вых: bc - текущее значение указателя -x1545 ld c,(ix+#13) - ld b,(ix+#14) - ret - -;АДРЕС: #154C чтение из fcb в hl длины файла -x154C ld l,(ix+#0B) - ld h,(ix+#0C) - ret - -;АДРЕС: #1553 чтение из fcb в hl адреса буфера dma -x1553 ld l,(ix+#15) - ld h,(ix+#16) - ret - -;АДРЕС: #155A чтение заголовка первого попавшегося сектора дисковода A -x155A xor a - call x1071 ;инициализация дисковода A - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - ret nz ;к дисководу A подключен образ - ld a,#C4 - out (#1F),a ;чтение заголовка сектора - ret - -;АДРЕС: #1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) -x1567 ld d,#00 ;дорожка 0 - ld hl,xE5A9 ;буфер - ld bc,#0105 - jp x0229 ;R8DOS #05(5) - -;АДРЕС: #1572 определение наличия interrupt controller -x1572 ld bc,#FFBA - ld a,(xDFF0) ;состояние порта #FFBA - and #F7 - out (c),a - ld (xDFF0),a - ld bc,#7EBE - ld a,#F3 - out (c),a - nop - ld b,#7F - ld a,#C5 - out (c),a - nop - ld a,#01 - out (c),a - nop - nop - in a,(c) - or a - jr z,x15A1 - cp #01 - jr z,x15A5 -x159D ld a,#24 ;сообщение: interrupt controller not found - scf - ret -x15A1 set 4,(iy+#1B) -x15A5 ld b,#7E - ld a,#F2 - out (c),a - nop - ld b,#7F - ld a,#C5 - out (c),a - nop - ld a,#FF - out (c),a - nop - nop - in a,(c) - cp #FF - jr nz,x159D - set 4,(iy+#1A) - xor a - ld a,#25 ;сообщение: interrupt controller found - ret - -;АДРЕС: #15C7 определение наличия последовательного порта/модема -;#28 modem not found -;#29 modem found -;#2A serial port not found -x15C7 ld bc,#FFBA - ld a,(xDFF0) ;состояние порта #FFBA - or %00000110 - and %01111110 - out (c),a - push bc - ld b,#0F - djnz $ - pop bc - or %00000001 - ld (xDFF0),a ;состояние порта #FFBA - out (c),a - ld b,#6B - djnz $ - ld hl,xEA9D - xor a - or (hl) - jr nz,x15F6 - ld de,x169A ;сброс модема - push hl - ex de,hl - ld bc,#0007 - ldir - pop hl -x15F6 call x1601 - ret c - set 5,(iy+#1A) - ld a,#29 ;сообщение: modem found - ret -; передача команды модему -x1601 ld bc,#7AFE ;hl=xEA9D - in a,(c) - cp #FF - jr nz,x160E -x160A ld a,#2A ;сообщение: serial port not found - scf - ret -x160E ld a,(hl) - bit 6,a - jr z,x1647 - and #1F - or #80 - ld b,#7B - out (c),a - nop - in e,(c) - cp e - jr nz,x160A ;нет порта - inc hl - ld a,(hl) - dec hl - and #0F - cp #0C - jr c,x162C - ld a,#05 -x162C add a,a - ld e,a - ld d,#00 - push hl - ld hl,x16A1 - add hl,de - ld b,#78 - ld a,(hl) - out (c),a - inc hl - ld a,(hl) - inc b - out (c),a - pop hl - ld a,(hl) - and #1F - ld b,#7B - out (c),a -x1647 bit 5,(hl) - jr z,x1658 - inc hl - ld a,(hl) - dec hl - and #F0 - rlca - rlca - rlca - rlca - ld b,#79 - out (c),a -x1658 or a - bit 7,(hl) - ret z - inc hl -x165D inc hl - ld a,(hl) - or a - ret z - cp #7C - jr nz,x166D - ld a,#0D - call x1673 ;передача команды модему (в com порт) - ret c - ld a,#0A -x166D call x1673 ;передача команды модему (в com порт) - ret c - jr x165D -; передача команды модему (в com порт) -x1673 push hl - push af - ld hl,#0814 ;счетчик попыток - ld bc,#00FE -x167B push bc - ld b,#05 - in a,(c) - pop bc - bit 5,a - jr nz,x1692 - djnz x167B - dec hl - ld a,h - or l - jr nz,x167B - pop af - pop hl - ld a,#28 ;modem not found - scf - ret -x1692 pop af - ld b,#78 - out (c),a - or a - pop hl - ret -x169A db %11100011,#05,"ATZ",#7C,#00 ;команда сброса модема -x16A1 db #10,#04 ;#00 - db #00,#03 ;#01 - db #80,#01 ;#02 - db #C0,#00 ;#03 - db #60,#00 ;#04 - db #30,#00 ;#05 - db #18,#00 ;#06 - db #0C,#00 ;#07 - db #06,#00 ;#08 - db #03,#00 ;#09 - db #02,#00 ;#0A - db #01,#00 ;#0B - -;АДРЕС: #16B9 работа с контроллером прерываний -x16B9 ld hl,x1764 - ld de,#9C40 - ld bc,#0003 - ldir - di - ld a,#01 - ld hl,#9C40 - call x175D ;вызов процедуры из основной памяти - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - ld bc,#7EBE - ld a,#1A - out (c),a - nop - ld b,#7F - ld a,#F8 - out (c),a - nop - ld a,#FE - out (c),a - nop - ld b,#0A - ld a,#26 ;%00100110 - call x1FDD ;запись данных в ячейку CMOS - ld b,#0B - ld a,#D6 ;%11010110 - call x1FDD ;запись данных в ячейку CMOS - ld b,#0B - ld a,#56 ;%01010110 - call x1FDD ;запись данных в ячейку CMOS - xor a - ld i,a - im 2 - xor a - ld (#7530),a - ld bc,#FFBA - ld a,(xDFF0) - or #08 - out (c),a - ld (xDFF0),a - ei -x171A halt - ld a,(#7530) - or a - jr z,x171A - di - ld a,#05 - ld hl,x9C40 - call x175D ;вызов процедуры из основной памяти - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - ret - -;АДРЕС: #1738 работа с контроллером прерываний -x1738 di - ld bc,#7FBE - ld a,#00 - out (c),a - ld bc,#FFBA - ld a,(xDFF0) - or #08 - out (c),a - ld (xDFF0),a - xor a - ld i,a - im 2 -x1752 ei - ld a,(xDFF0) - bit 3,a - jr nz,x1752 - ret - jr $ - -;вызов процедуры из основной памяти -;вх: hl - адрес процедуры -x175D push hl - ld hl,rom3_x3D30 - ex (sp),hl - push hl - ret - -;установка бордюра -x1764 out (#FE),a - ret - db #00 - -;АДРЕС: #1768 поиск раздела MFS -;вых: cy=1 раздел не найден -; dehl=#00000000 -; cy=0 раздел найден -; bc - адрес дескриптора раздела MFS в буфере -; dehl - смещение первого сектора раздела -x1768 push ix - call x1791 ;hl=de=#0000 (нулевой сектор) - ld (iy+#31),#01 ;число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) - call x1D73 ;чтение нулевого сектора с винчестера в буфер xE5A9 - jp c,x178E ;ошибка чтения - call x1797 ;поиск раздела MFS в MBR - jr c,x178E ;раздел не найден - ld l,(ix+#08) - ld h,(ix+#09) - ld e,(ix+#0A) - ld d,(ix+#0B) ;dehl - смещение первого сектора радела - push ix - pop bc - pop ix - ret -x178E pop ix - scf -;hl=de=#0000 -x1791 ld hl,#0000 - ld e,l - ld d,l - ret -;поиск раздела MFS в MBR -; cy=1 раздел MFS не найден -x1797 ld hl,(xE5A9+#1FE) ;xE7A7 - ld de,#AA55 ;сигнатура (55h AAh) - or a - sbc hl,de - jr nz,x17B7 ;сигнатура отсутствует: MBR отсутствует -x17A2 ld b,#04 - ld ix,xE5A9+#1BE ;xE767 начало дескрипторов разделов HDD -x17A8 ld a,#53 ;код типа раздела MFS - cp (ix+#04) - jr nz,x17B0 - ret -x17B0 ld de,#0010 - add ix,de ;дескриптор следующего раздела - djnz x17A8 -x17B7 ld a,#63 - scf - ret - -;АДРЕС: #17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: cy=1 была ошибка -x17BB push ix - push de - push hl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5 ;грузим первый сектор раздела MFS - call x1D78 ;чтение сектора с винчестера в буфер ix - pop hl - pop de - jr c,x17EB ;ошибка загрузки - call x0FF3 ;инкремент dehl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5+#200 ;грузим втоорой сектор раздела MFS - call x1D78 ;чтение сектора с винчестера в буфер ix - jr c,x17EB ;ошибка загрузки - ld hl,(xEBF5+#3FE) ;xEFF3 сравнение ситгнатуры - ld de,#AA54 - sbc hl,de - ld a,#63 - jr nz,x17EB ;сигнатуры нет - pop ix - ret -x17EB scf ;ошибка - pop ix - ret - -;АДРЕС: #17EF запись 2х секторов из буфера xEBF5 -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x17EF push ix - push de - push hl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5 ;буфер - call x1D4A ;запись сектора из буфера ix на винчестер - pop hl - pop de - jr c,x17EB ;ошибка - call x0FF3 ;инкремент dehl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5+#200 ;вторй сектор - call x1D4A ;запись сектора из буфера ix на винчестер - jr c,x17EB ;ошибка - pop ix - ret - -;АДРЕС: #1813 чтение сектора с винчестера -;вх: hl - адрес буфера для чтения -; de - смещение от начала образа в секторах (512b) +1 -;вых: hl - адрес буфера для чтения -; cy=1 были ошибки. код ошибки в A -x1813 push hl - call x1848 ;расчет номера сектора на винчестере - ;dehl - смещение в секторах (512b) от начала винчестера до нужного сектора - jr c,x1827 ;ошибка: адрес за пределами образа диска - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ex (sp),ix - call x1D78 ;чтение сектора с винчестера в буфер ix - pop ix - ret nc ;ошибок не было - ld a,#04 - ret -x1827 pop hl ;ошибка: адрес за пределами образа диска - ret - -;АДРЕС: #1829 запись сектора на винчестер -;вх: hl - адрес буфера для записи -; de - смещение от начала образа в секторах (512b) -;вых: hl - адрес буфера для записи -; cy=1 были ошибки. код ошибки в A -x1829 ld a,(xE590) - and %00100000 - jr nz,x1844 ;защита от записи - push hl ;адрес буфера для записи - call x1848 ;расчет номера сектора на винчестере - jr c,x1827 ;ошибка: адрес за пределами образа диска - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ex (sp),ix ;адрес буфера для записи - call x1D4A ;запись сектора из буфера ix на винчестер - pop ix - ret nc ;нет ошибок записи - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 - ret -x1844 ld a,#02 ;код ошибки: попытка записи на защищенную дискету - scf - ret - -;АДРЕС: #1848 расчет номера сектора на винчестере -;вх: de - смещение от начала образа до нужного сектора в секторах (512b) -;вых: cy=1 ошибка: адрес за пределами образа диска -; =0 dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x1848 ld (xE9E7),de ;смещение до нужного сектора - ld de,xE9EB ;адрес числа - push de - ld hl,xE590+#01 ;смещение образа от начала HDD - call x1003 ;копирование из (hl) в (de) 4х байт - pop hl - ld de,xE9E7 - call x101D ;(hl)=(hl)+(de) сложение 4х байтного числа с двухбайтным - ld de,xE9E7 - ld hl,xE590+#05 ;смещение от начала HDD до последнего(служебного) сектора образа - push hl - call x1003 ;копирование из (hl) в (de) 4х байт - pop de - ld hl,xE9EB ;смещение в секторах (512b) от начала винчестера до нужного сектора - call x1035 ;сравнение двух чисел - jr z,x1873 ;(hl)=(de) - jp p,x187B ;(hl)>(de) ошибка -x1873 ld hl,xE9EB ;(hl)<(de) - call x100F ;загрузка числа в регистры из памяти - or a - ret -x187B ld a,#22 ;код ошибки: адрес за пределами образа диска - scf - ret - -;АДРЕС: #187F R8DOS #23(35) подключение раздела к драйверу HDD -;вх: 1-0,a - номер дисковода -; 2,a =0 -; 6,a =1 отключить подраздел от драйвера -; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек -; 3,a =1 подключение по имени, адрес имени в памяти в DE -; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела -;вых: cy=1 ошибка -; cy=0 ошибок не было -; 4,(hl) =1 -x187F call x18C0 ;вых: при 4,a=1 -> hl=xE5A5 - ;вых: при 4,a=0 -> hl=как при входе - ret c ;были ошибки - push af - ld c,#11 - set 4,(hl) ;!!!ОШИБКА!!! портится память - pop af - ret - -;АДРЕС: #188A установка кода, определяющий тип дисковода без образа по номеру в С -x188A xor a - ld (xE590),a ;реальный дисковод - ld e,#C0 - bit 1,c - jr z,x1895 ;это дисковод A/B - ld e,a -x1895 call x1A0E ;hl адрес кода, определяющий тип дисковода по номеру в С - ld (hl),e - ret - -;АДРЕС: #189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -;вх: de - адрес дескриптора дисковода -x189A bit 5,(iy+#1C) - jp nz,x1B00 ;ошибка #67. нет винчестера - ld hl,xE590 ;описатель текущего дисковода - push hl - push bc - ex de,hl - ld bc,#0015 - bit 5,(iy+#0B) - jr z,x18B6 ;функция вызывается из монитора -;вызов пользователем - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - jr x18B8 -;функция вызывается из монитора -x18B6 ldir -x18B8 pop bc - pop hl - ld a,(hl) - or a - ret nz ;выход без ошибок - jp x1983 ;ошибка #66. путь не найден - -;АДРЕС: #18C0 R8DOS #28(40) подключение раздела к драйверу HDD -;вх: 1-0,a - номер дисковода -; 2,a =0 -; 6,a =1 отключить подраздел от драйвера -; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек -; 3,a =1 подключение по имени, адрес имени в памяти в DE -; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела -;вых: cy=1 ошибка -x18C0 bit 7,(iy+#1B) - jp z,x1BFA ;ошибка #56 нет раздела MFS - push hl - push af - push hl - ld hl,x1A19 - ex (sp),hl ;адрес возврата - ld c,a - bit 6,c - jr nz,x188A ;отключить подраздел от драйвера - bit 5,c - jr nz,x189A ;подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) - bit 7,c - jr nz,x1901 ;автоподключение, т. е. подключить то, что задано в секторе автонастроек - bit 3,c - ret z ;переход на x1A19 - -;подключение по имени, адрес имени в памяти в de - ld a,e - or d - jr z,x18FD ;;ошибка #45. неверный путь - push bc - ex de,hl - ld de,xE7C7 - ld bc,#0014 - bit 5,(iy+#0B) - jr z,x18F6 ;;функция вызывается из монитора - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - jr x18F8 -x18F6 ldir -x18F8 xor a - ld (de),a - pop bc - jr x190E ;анализ имени и подключение -;ошибка #45. неверный путь -x18FD ld a,#45 - scf - ret - -;автоподключение, т е. подключить то, что задано в секторе автонастроек -;вх: 1-0,c - номер дисковода -x1901 push bc - call x1E3D ;чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы - pop bc - ret c ;ошибка чтения - ld de,xE7C7 - call x1ACC ;формирование текстовой строки - пути к примонтированному подразделу/образу - ret c ;ошибка чтения -x190E ld hl,xE7C7+#01 - ld a,":" - cp (hl) - jr nz,x192C ;это подраздел -; это образ диска - dec hl - ld a,(hl) - and #5F - sub #41 - jr c,x18FD ;не буква диска. ошибка #45. неверный путь - cp #04 - jr nc,x18FD ;не буква диска. ошибка #45. неверный путь - ld b,a - ld a,c - and #F0 - or b - ld c,a ;новый дисковод - inc hl - inc hl - jr x192F ;hl начало имени подраздела -; это подраздел -x192C ld hl,xE7C7 -x192F ld a,(hl) - cp #5C ;"\" - jr nz,x1935 - inc hl -; формирование строки с именами для поиска в каталоге -x1935 ld de,xE7DB ;буфер для имени подраздела и образа - push bc - call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) - call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) - pop bc -; поиск имени подраздела в каталоге - ld de,xEBF5 ;буфер с каталогом -x1943 push bc - push de - rst #30 - dw rom5_x2620 ;формирование в буфере xEBF5 списка подразделов MFS/образов - db #05 - pop de - pop bc - ret c ;ошибка чтения - res 7,c ;7,=0 поиск имени -x194E push bc - ld bc,xEBF5 ;определение номера текущей записи - ld l,e - ld h,d - sbc hl,bc - ld b,#04 -x1958 srl h ;hl=hl/#10 - rr l - djnz x1958 ;l - номер записи в каталоге - pop bc - ld a,(xDD89) ;всего записей - cp l - jr z,x1983 ;конец каталога. ошибка #66. путь не найден - jr c,x1983 ;конец каталога. ошибка #66. путь не найден - ld hl,xE7DB ;тут имя подраздела и образа - call x1A6A ;проверка совпадения имени - jr nz,x19C1 ;не совпало -; имя совпало - ld a,(de) - and #DF - cp #01 - jr nz,x19D8 ;это не TR-DOS. формирование описателя текущего дисковода - ld a,(xE7DB+#06) - cp " " - jr nz,x1987 ;есть имя образа - ld a,(de) - or #10 - ld (de),a - jr x19D8 ;формирование описателя текущего дисковода -;ошибка #66. путь не найден -x1983 ld a,#66 - scf - ret -; поиск имени образа в каталоге -x1987 push de - push bc - ld bc,#0010 - ex de,hl - ld de,xE81B - ldir ;сохраним запись подраздела в буфере - rst #30 - dw rom5_x25EB ;формирование в буфере xEBF5 списка образов коллекции - db #05 - pop bc - pop de - ret c ;ошибка чтения - set 7,c ;в буфере каталог коолекции образов - push bc - push de - ld de,xEBF5 ;адрес каталога коллекции - ld c,#01 -x19A2 ld a,(xDD89) ;количество образов в каталоге - cp c - jr c,x19BF ;каталог закончился - ld a,(de) - and #01 - cp #01 - jr nz,x19B7 ;это не образ диска. следующая запись - ld hl,xE7DB+#06 ;имя образа - call x1A6A ;проверка совпадения имени - jr z,x19CF ;есть совпадение -x19B7 inc c - ld hl,#0010 - add hl,de - ex de,hl - jr x19A2 ;продолжим поиск -x19BF pop de ;конец каталога образов - pop bc -x19C1 ld a,e - add a,#10 - ld e,a - jr nc,x19C8 - inc d ;de=de+#10 -x19C8 bit 7,c - jr z,x194E ; - jp x1943 ;7,c =1 в буфере каталог коолекции образов, читать MBR не надо -;имя образа найдено -x19CF pop hl - pop bc - ld a,(de) - and #20 ;сохраним признак защиты от записи - or #01 - jr x19D9 -;формирование описателя текущего дисковода -x19D8 ld a,(de) -x19D9 ld (xE590),a ;код подраздела в описателе текущего дисковода - ex de,hl - ld de,xE590+#01 - inc hl - call x1003 ;копирование из (hl) в (de) 4х байт - ld de,xE590+#05 - call x1003 ;копирование из (hl) в (de) 4х байт - push de - ld de,#0005 - add hl,de - pop de - ex de,hl - push bc - rst #30 - dw rom5_x3052 ;сложение двух 4х байтных чисел - db #05 - ld hl,xE590+#05 - rst #30 - dw rom5_x302A ;декремент (hl)=(hl)-1 - db #05 - pop bc - ld a,(xE590) ;!!!ОШИБКА!!! перед сравнением надо сделать and #DF - cp #01 ;иначе диски с защитой от записи не будут видны - jr z,x1A07 ;это TR-DOS образ, без защиты от записи - or a - ret -x1A07 call x1A0E ;hl адрес кода, определяющий тип дисковода - ld (hl),#E0 ;%11100000 - or a - ret - -;АДРЕС: #1A0E расчет адреса кода, определяющие тип дисковода по номеру в С -x1A0E ld a,c - and #03 - ld c,a - ld b,#00 - ld hl,xFFCC - add hl,bc - ret - -;завершение процедуры x18C0 R8DOS #28(40) -;cy=1 была ошибка -x1A19 push af - jr nc,x1A20 ;нет ошибки - xor a - ld (xE590),a ;была ошибка. образ не подключен -x1A20 ld a,c - and #03 - ld (xFFCA),a ;текущий дисковод - bit 4,(iy+#1C) - call z,x1B54 ;1/0 TRDOS mirror on/off - call x1B04 ;расчет адреса блока описателя заданного дисковода -;сохранение описателя текущего дисковода в блоке xE9F5 - ld de,xE590 ;описатель текущего дисковода - ex de,hl - ld bc,#0009 - ldir - push hl - ld hl,xE7DB ;имена подраздела/образа - push hl - ld bc,#000C - push bc - ldir ;копирование имен подраздела/образа в описатель текущего дисковода - pop bc - pop hl - pop de - ldir ;копирование в блок описаний дисководов - call x1B18 ;установка признака подмонтированных дисков A/B в порту #7FBA - pop af - pop de - pop hl - ret c ;была ошибка -;вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела - bit 4,d - ret z - ld de,xE590 - ex de,hl - ld bc,#0015 - bit 5,(iy+#0B) - jr z,x1A66 ;функция вызывается из монитора - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - jr x1A68 -x1A66 ldir -x1A68 or a - ret - - -;АДРЕС: #1A6A проверка совпадения имени -;вх: de - адрес в каталоге -; hl - адрес имени для поиска -;вых: z - имя совпало -x1A6A push bc - push de - ld bc,#000A ;приращение в записи до имени - ex de,hl - add hl,bc - ld bc,#0600 -x1A74 ld a,(de) - cp (hl) - jr z,x1A79 - inc c -x1A79 inc hl - inc de - djnz x1A74 - ld a,c ;c=0 сть совпадение - or a - pop de - pop bc - ret - -;АДРЕС: #1A82 выделение из строки имени подраздела/образа (6 символов имя) -;вх: de - буфер приемник -; hl - адрес строки -x1A82 ld b,#06 -x1A84 ld a,(hl) - cp #5C ;"\" - jr z,x1A97 ;конец имени - or a - jr z,x1A98 ;конец строки - ld (de),a - inc hl - inc de - djnz x1A84 - ld a,(hl) - cp #5C ;"\" - ret nz ;не маркер конца имени - inc hl ;следующий символ - ret -x1A97 inc hl -x1A98 ld a," " - ld (de),a - inc de - djnz x1A98 - ret - -;АДРЕС: #1A9F копирование имени подраздела/образа по адресу в de -;вх: de - адрес буфера -; hl - адрес пути примонтированного подраздела/образа -; b - смещение в пути до имени -x1A9F ld a,l - add a,b - ld l,a - jr nc,x1AA5 - inc h -x1AA5 ld b,#06 -x1AA7 ld a,(hl) - cp #21 - ret c - ld (de),a - inc hl - inc de - djnz x1AA7 - ret - -;АДРЕС: #1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 -;вх: a - номер дисковода для монтирования образа -;вых: hl - адрес буфера -; a - первый байт буфера со сброшенным битом защиты от записи -x1AB1 push de - and #03 - ld hl,x1AC8 - add a,l - ld l,a - jr nc,x1ABC - inc h -x1ABC ld l,(hl) - ld h,#00 - ld de,xE5A9 - add hl,de - ld a,(hl) - and #DF - pop de - ret -x1AC8 db #00,#16,#2C,#42 - -;АДРЕС: #1ACC формирование текстовой строки - пути к примонтированному -; подразделу/образу. вида X:part\disk,#00 либо part,#00 -;вх: de - адрес буфера для текcтовой строки -; 0-1,c - номер дисковода -x1ACC ld a,c - call x1AB1 ;hl адрес начала пути к примонтированному образу - ld (de),a ;a - первый байт пути со сброшенным битом защиты от записи - and #DF - jp z,x1B00 ;ошибка #67. к дисководу образ не примонтирован - cp #01 - jr z,x1AE1 ;это образ диска -;для подраздела - ld b,#0A - call x1A9F ;копирование имени подраздела по адресу в de - jr x1AFC -;для образа диска -x1AE1 ld a,c - and #03 - add a,#41 - ld (de),a ;буква дисковода - inc de - ld a,":" - ld (de),a - inc de - ld b,#0A - push hl - call x1A9F ;копирование имени подраздела по адресу в de - pop hl - ld a,#5C ;"\" - ld (de),a - inc de - ld b,#10 - call x1A9F ;копирование имени образа по адресу в de -x1AFC ex de,hl - xor a - ld (hl),a - ret -;ошибка #67. к дисководу образ не примонтирован -x1B00 ld a,#67 - scf - ret - -;АДРЕС: #1B04 расчет адреса блока описателя заданного дисковода -;вх: a - номер дисковода -;вых: hl - адрес блока описателя текущего дисковода -; a - первый байт описателя -; nz - это образ диска -x1B04 ld l,a - rlca - rlca - ld h,a - rlca - rlca - add a,h - add a,l ;a=a*#15 - ld hl,(xE9F3) - add a,l - ld l,a - jr nc,x1B14 - inc h -x1B14 ld a,(hl) ;hl адрес блока описателя заданного дисковода - and #DF - ret - -;АДРЕС: #1B18 установка признака подмонтированных дисков A/B в порту #7FBA -x1B18 ld a,(xFFCA) ;номер текущего дисковода - bit 1,a - ret nz ;это дисковод C/D - ld c,a - ld e,a - call x1A0E ;расчет адреса кода, определяющие тип дисковода по номеру в С - ld bc,#7FBA - bit 0,e - ld d,(iy-#26) - jr z,x1B37 ;дисковод A - set 6,d ;для дисковода B - bit 5,(hl) - jr z,x1B3F ;образ не подключен - res 6,d ;образ подключен - jr x1B3F -x1B37 set 7,d ;для дисковода A - bit 5,(hl) ;образ не подключен - jr z,x1B3F - res 7,d ;образ подключен -x1B3F ld (iy-#26),d - out (c),d - ret - -;АДРЕС: #1B45 определение необходимости копирования памяти пользователя -;вх: hl - адрес начала блока памяти -; bc - размер блока памяти -;вых: cy=1 блок памяти попадает на системные области -; =0 блок памяти в пределах [#4000..#BFFF] -x1B45 ld a,h - cp #40 - ret c - push hl - dec bc - add hl,bc ;адрес конца таблицы - inc bc - ld a,h - pop hl - ret c - cp #C0 - ccf - ret - -;АДРЕС: #1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) -x1B54 bit 5,(iy+#0B) - ret z ;функции вызываются из монитора - push af - ld hl,(xE9F3) ;адрес блока описателей дисковода - push hl - ld hl,xE9F5 - ld (xE9F3),hl ;начало блока - call x1B04 ;расчет адреса блока описателя заданного дисковода - ld de,xE590 ;описатель текущего дисковода - ex de,hl - ld bc,#0009 - ldir ;тип и адрес подраздела/образа в секторах - ld hl,xE7DB - ld bc,#000C ;имена подраздела/образа - ldir - pop hl - ld (xE9F3),hl - pop af - ret - -;АДРЕС: #1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска -;вх: hl - адрес в памяти, куда считывать -; de - начальный номер сектора (считая с 1!) -; b - число секторов (размер сектора 512 байт!) -;вых: cy=1 - ошибки -x1B7E bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld a,(xE590) ;код типа примонтированного подраздела/образа - or a - jr z,x1BBC ;ошибка. образ не примонтирован - ld a,b - or a - ret z ;0 секторов. нечего читать -;читаем сектора -x1B8D push hl - push de - push bc - call x1B9D ;чтение одного сектора - pop bc - pop de - pop hl - ret c ;были ошибки - inc h - inc h - inc de - djnz x1B8D - ret -;чтение одного сектора -x1B9D ld bc,#0200 - call x1B45 ;определение необходимости копирования памяти пользователя - jp nc,x1813 ;чтение сектора с винчестера - push hl - ld hl,xEBF5 ;читаем в буфер в ram 8 - call x1813 ;чтение сектора с винчестера - pop hl - ret c ;ошибки - ld de,xEBF5 - ex de,hl - ld bc,#0200 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - xor a - ret -;ошибка #67. к дисководу образ не примонтирован -x1BBC scf - ld a,#67 - ret - -;АДРЕС: #1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска -;вх: hl - адрес в памяти, откуда записывать -; de - начальный номер сектора (считая с 1!) -; b - число секторов (размер сектора 512 байт!) -;вых: cy=1 - ошибки - -x1BC0 bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld a,(xE590) ;код типа примонтированного подраздела/образа - or a - jr z,x1BBC ;ошибка. образ не примонтирован - ld a,b - or a - ret z ;0 секторов. нечего записывать -;записываем сектора -x1BCF push hl - push de - push bc - call x1BDF ;запись одного сектора - pop bc - pop de - pop hl - ret c ;были ошибки - inc h - inc h - inc de - djnz x1BCF - ret -;запись одного сектора -x1BDF ld bc,#0200 - call x1B45 ;определение необходимости копирования памяти пользователя - jp nc,x1829 ;запись сектора на винчестер - push de - ld de,xEBF5 ;буфер для записи - ld bc,#0200 - rst #30 - dw rom2_x0753 ;копируем область пользователя в буфер для записи - db #02 - pop de - ld hl,xEBF5 - jp x1829 ;запись сектора на винчестер - -;АДРЕС: #1BFA ошибка #56. нет раздела MFS -x1BFA ld a,#56 - scf - ret - -;АДРЕС: #1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела -;вх: hl - адрес буфера для таблицы (1024) -;вых: cy=1 - ошибки -;вых: de - количество подразделов -; -x1BFE bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - push hl - call x1C21 ;чтение в буфер xEBF5 катлога раздела MFS - pop hl - ret c ;ошибка - push hl - ld de,xEBF5 ;буфер с каталогом - ex de,hl - ld bc,#0400 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - rst #30 - dw rom5_x271A ;подсчет количества подразделов в MFS - db #05 - ld de,(xDD89) ;количество подразделов - pop hl - xor a - ret -;чтение в буфер xEBF5 катлога раздела MFS -x1C21 res 6,(iy+#1C) - call x1768 ;поиск раздела MFS - ret c ;ошибка - call x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела - ret - -;АДРЕС: #1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) -;вх: a =#90/#94 запись сектора -; =#50/#54 чтение сектора -; hl - адрес начала данных 512b -;вых: cy=1 - ошибки -; -x1C2D bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld c,a - and #FB ;%11111011 - cp #90 - jr z,x1C42 - cp #50 - jr z,x1C56 - ld a,#56 ;ошибка. нет раздела MFS - scf - ret -;запись сектора -x1C42 ld de,xE5A9 - ld bc,#0200 - rst #30 - dw rom2_x0753 ;копируем область пользователя в буфер для записи - db #02 - ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - jp x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;чтение сектора -x1C56 push hl - ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - pop hl - ret c ;ошибки - ld de,xE5A9 - ex de,hl - ld bc,#0200 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - xor a - ret - -;АДРЕС: #1C70 бесконечное чтение порта bc -x1C70 in a,(c) - jr x1C70 - -;АДРЕС: #1C74 бесконечная запись в порт bc -x1C74 out (c),a - jr x1C74 - -;АДРЕС: #1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства -;вх: hl - адрес откуда грузим в регистры 6 байт -x1C78 ld bc,#F8BE -x1C7B ld a,(hl) - inc hl - inc b - out (c),a - ld a,b - cp #FE - ret z - jr x1C7B - -;АДРЕС: #1C86 чтение 512b данных в буфер адресуемый hl -;вх: hl - адрес буфера для чтения данных -x1C86 push hl - ld c,#BE - ld de,#D8F8 - xor a -x1C8D ld b,e ;порт #F8BE регистр данных (младшая часть) - ini - ld b,d ;порт #D8BE регистр данных (старшая часть) - ini - dec a - jr nz,x1C8D - pop hl - ret - -;АДРЕС: #1C98 запись 512b данных из буфер адресуемого hl -;вх: hl - адрес буфера для записи данных - -x1C98 push hl - ld c,#BE - ld de,#D9F9 ;команда outd вначале делает dec b - xor a -x1C9F ld b,d ;порт #D8BE регистр данных (старшая часть) - inc hl - outd - ld b,e ;порт #F8BE регистр данных (младшая часть) - outi - inc hl - dec a - jr nz,x1C9F - pop hl - ret - -;АДРЕС: #1CAC посылаем команду винчестеру -;вх: a - команда винчестеру -;вых: cy=1 HDD не вышел в готовность -; =0 команда загружена в регистр -; d - регистр состояния -x1CAC ld e,a - ld c,#BE - call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - ld b,#FE - ld a,(xE049) ;тип адресации LBA/CHS и выбор винчестера master/slave - out (c),a - ld hl,xE044 - call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства - call x1CE5 ;ожидание готовности HDD к принятию команды - ret c ;ошибка: hdd не вышел в готовность - ld bc,#FFBE - out (c),e - ret - -;АДРЕС: #1CCA ожидание готовности HDD к передаче данных -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов к передаче данных -; d - регистр состояния -x1CCA call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - bit 3,d - ret nz ;винчестер готов к передаче данных -;ждем готовности к передаче данных - ld hl,#C350 -x1CD4 ld bc,#FFBE - in d,(c) - bit 3,d - ret nz ;винчестер готов к передаче данных - dec hl - ld a,h - or l - jr nz,x1CD4 - ld a,#62 - scf - ret - -;АДРЕС: #1CE5 ожидание готовности HDD к принятию команды -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов к принятию команды -; d - регистр состояния -x1CE5 call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - bit 6,d - ret nz ;выход. винчестер готов принять команду -;ждем готовности принять команду - ld hl,#14E6 - or a -x1CF0 ld bc,#FFBE - in d,(c) - bit 6,d - ret nz ;выход. винчестер готов принять команду - dec a - jr nz,x1CF0 - dec hl - ld a,h - or l - jr nz,x1CF0 - ld a,#61 - scf - ret - -;АДРЕС: #1D04 ожидание готовности HDD -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов -; d - регистр состояния -x1D04 ld hl,#4FD3 ;количество попыток -x1D07 xor a - ld b,#FF -x1D0A in d,(c) ;читаем регистр состояния - bit 7,d - ret z ;HDD готов - dec a ;HDD занят - jr nz,x1D0A ;повторяем попытки - dec hl - ld a,h - or l - jr nz,x1D07 - ld a,#60 ;HDD не вышел в готовность - scf - ret - -;АДРЕС: #1D1B чтение сектора идентификации в буфер по адресу в ix -;вх: ix - адрес буфера для чтения сектора идентификации -x1D1B ld hl,xE04A - ld b,(hl) ;сохраним код команды винчестера: чтение сектора - push bc - ld (hl),#EC ;команда идентификации - push hl - call x1D78 ;чтение сектора идентификации в ix - pop hl - pop bc - ld (hl),b - ret - -;АДРЕС: #1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -x1D2A call x1E2A ;установка в переменных - сектора номер 3 для винчестера - ld hl,#4155 ;сигнатура сектора с примонтированными образами - ld (xE5A9+#1FE),hl - ld de,xE5A9 ;адрес начала памяти - ld bc,#01FC ;размер области памяти - call x21E5 ;подсчет контрольной суммы области памяти CRC16 - ld (xE5A9+#1FC),hl ;контрольная сумма - ld (iy+#31),#01 ;количество секторов - jr x1D4F ;запись сектора из буфера xE5A9 на винчестер - -;АДРЕС: #1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: cy=1 ошибки -x1D45 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - jr x1D4F ;запись сектора из буфера xE5A9 на винчестер - -;АДРЕС: #1D4A запись сектора из буфера ix на винчестер -;вх: ix - адрес буфера для записи сектора -x1D4A push ix - pop hl - jr x1D52 - -;АДРЕС: #1D4F запись сектора из буфера xE5A9 на винчестер -x1D4F ld hl,xE5A9 -x1D52 ld b,(iy+#39) ;количество дополнительных попыток записи сектора -x1D55 push bc - ld a,(xE04B) ;код команды винчестера - call x1D60 ;запись сектора на винчестер - pop bc - ret nc ;нет ошибок - djnz x1D55 ;еще раз попытаемся записать -;запись сектора на винчестер -;вх: a - команда винчестеру -; hl - адрес буфера для записи данных -;вых: cy=1 были ошибки -; hl - не изменяется -x1D60 push hl - call x1CAC ;посылаем команду винчестеру - pop hl - jr c,x1DB3 ;ошибка - push hl - call x1CCA ;ожидание готовности HDD к передаче данных - pop hl - jr c,x1DB3 ;ошибка - call x1C98 ;запись 512b данных из буфер адресуемого hl - jr x1D9F ;проверка на ошибки и выход - -;АДРЕС: #1D73 чтение сектора с винчестера в буфер xE5A9 -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x1D73 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - jr x1D7D - -;АДРЕС: #1D78 чтение сектора с винчестера в буфер ix -;вх: ix - адрес буфера для чтения сектора -x1D78 push ix - pop hl - jr x1D80 - -;АДРЕС: #1D7D чтение сектора с винчестера в буфер xE5A9 -x1D7D ld hl,xE5A9 -x1D80 ld b,(iy+#39) ;количество дополнительных попыток чтения сектора -x1D83 push bc - ld a,(xE04A) ;код команды винчестера - call x1D8E ;чтение сектора с винчестера - pop bc - ret nc - djnz x1D83 -;чтение сектора с винчестера -;вх: a - команда винчестеру -;вх: hl - адрес буфера для чтения данных -;вых: cy=1 были ошибки -; hl - не изменяется -x1D8E push hl - call x1CAC ;посылаем команду винчестеру - pop hl - jr c,x1DB3 ;ошибка - push hl - call x1CCA ;ожидание готовности HDD к передаче данных - pop hl - jr c,x1DB3 ;ошибка - call x1C86 ;чтение 512b данных в буфер адресуемый hl -;проверка на ошибки и выход -x1D9F ld bc,#FFBE - in a,(c) - ld d,a ;регистр состояния - and %01110001 - xor %01010000 - ret z ;выход при готовности винчестера и отсутствии ошибок - ld b,#F9 ;#F9BE - in a,(c) ;читаем код ошибки - ld (xFFDD),a ;сохраняем - ld a,#57 ;код ошибки драйвера -x1DB3 call x1DB8 ;програмный сброс винчестера - scf - ret -;програмный сброс винчестера -x1DB8 push af - push bc - ld bc,#FFBA - ld a,(xDFF0) - push af - or #80 - out (c),a ;активация регистра Device Control - push bc - ld bc,#FEBE - ld a,%00001100 - out (c),a ;програмный сброс винчестера - call x201C ;пауза 293t - xor a - out (c),a ;завершаем програмный сброс винчестера - pop bc - pop af - and #7F - out (c),a ;активация регистра головки - ld (xDFF0),a - pop bc - pop af - ret - -;АДРЕС: #1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: (xE046) параметры LBA/CHS в зависимости от настроек -x1DDF exx - ld hl,xE030 - bit 4,(iy+#35) - jr z,x1DEA ;master HDD - inc hl ;slave HDD -x1DEA bit 2,(hl) - jr nz,x1E10 ;LBA on -;LBA off. преобразование адреса LBA в C/H/S - ld bc,(xE5A5) ;head*sector (секторов на цилиндре) - call x0F5D ;деление de'hl'=de'hl'/bc - exx - ld (xE047),hl ;номер цилиндра - ld c,(iy-#1F) ;значение sector HDD - ld b,#00 - call x0F5D ;деление de'hl'=de'hl'/bc - inc l - ld (iy+#32),l - exx - ld a,(iy+#35) - and #B0 ;%10110000 - or l - ld (iy+#35),a ;головка - ret -;LBA on -x1E10 exx - ld (iy+#32),l - ld (iy+#33),h - ld (iy+#34),e - ld a,d - and #0F - ld d,a ;старший полубайт - ld a,(iy+#35) - and #B0 ;%10110000 - or d - or #40 - ld (iy+#35),a - ret - -;АДРЕС: #1E2A установка в переменных сектора номер 3 для винчестера -x1E2A ld hl,#0000 - ld (xE047),hl - ld (iy+#32),#03 - ld a,(iy+#35) - and #F0 - ld (iy+#35),a - ret - -;АДРЕС: #1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы -;вых: cy=1 были ошибки -x1E3D call x1E2A ;установка в переменных сектора номер 3 для инчестера - ld (iy+#31),#01 ;кол-во секторов =1 - call x1D7D ;чтение сектора с винчестера в буфер xE5A9 - ret c ;ошибка - ld hl,(xE5A9+#1FE) - ld de,#4155 ;сигнатура - sbc hl,de - ld a,#63 - scf - ret nz ;сигнатура отсутствует - ld de,xE5A9 ;начало области памяти - push de - ld bc,#01FC ;размер области памяти - call x21E5 ;подсчет контрольной суммы области памяти CRC16 - ld bc,(xE5A9+#1FC) - xor a - sbc hl,bc - pop hl - ret z ;контрольная сумма совпала - ld b,a ;контрольная сумма не совпадает -x1E68 ld (hl),a ;очищаем буфер - inc hl - djnz x1E68 -x1E6C ld (hl),a - inc hl - djnz x1E6C - ld a,#63 - scf - ret - -;АДРЕС: #1E74 R8DOS #22(34) идентификация жесткого диска -;вх: ix - адрес буфера для загрузки сектора идентификации -; 0,e =1 принудительно инициализировать переменные геометрии винчестра -;вых: cy=1 ошибки -x1E74 xor a - ld (xFFDD),a ;код ошибки дискового интерпретатора - ld bc,#FFBA - ld hl,xDFF0 - ld a,(hl) - or #81 - ld (hl),a - out (c),a ;device control/alt status - push bc - ld bc,#FEBE - xor a - out (c),a ;сброс - pop bc - ld a,(hl) - and #7F - or #01 - ld (hl),a - out (c),a ;вернем регистр команд - djnz $ ;задержка - ld bc,#FFBE - in a,(c) ;регистр состояния - xor #FF - jr z,x1ECC ;прочитано #FF. нет винчестера - set 7,(iy+#1A) ;признак наличия HDD - bit 0,e - jr nz,x1EAD - bit 1,(iy+#1C) ;автоопределение HDD при старте включено - jr nz,x1EFA ;читать сектор идентификации не надо -;чтение сектора идентификации и установка переменных геометрии винчестера -x1EAD ld hl,#4FD3 - call x1D07 ;ожидание готовности HDD - ld b,#FC ;bc=#FCBE регистр цилиндра - xor a -x1EB6 out (c),a - nop - in d,(c) - cp d - jr nz,x1ECC ;значения не совпадают. винчестера нет - dec a - jr nz,x1EB6 ;повторим 256 раз - ld hl,xE044 ;адрес переменной откуда грузим - call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства - call x1D04 ;ожидание готовности HDD - jr nc,x1ED4 ;в готовность вышел -;винчестер не найден -x1ECC res 7,(iy+#1A) - ld a,#56 - scf - ret -x1ED4 call x1D1B ;чтение сектора идентификации в буфер по адресу в ix - ld a,#57 - ret c ;ошибка #57. не прочитался сектор идентификации - push ix - pop hl - xor a - or (hl) - inc hl - or (hl) - inc hl - jr z,x1F04 ;ошибка в секторе идентификации - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (xDFF2),bc ;количество цилиндров - inc hl - inc hl - ld a,(hl) - ld (iy-#20),a ;количество головок - ld de,#0006 - add hl,de - ld a,(hl) - ld (iy-#1F),a ;количество секторов -x1EFA call x1F2D ;расчет произыедения головок и секторов - call x1F08 ;проверка геометрии винчестера - jr z,x1F04 ;проверка геометрии винчестера не пройдена - or a - ret -;ошибка #58. ошибка в секторе идентификации -x1F04 ld a,#58 - scf - ret - -;АДРЕС: #1F08 проверка геометрии винчестера -x1F08 res 7,(iy+#1B) - ld a,(xDFF2) ;ицлиндров (младший байт) - or (iy-#21) - ret z ;ноль цилинлров - xor a - or (iy-#20) - ret z ;ноль головок - xor a - or (iy-#1F) - ret z ;ноль секторов - ld hl,(xE5A5) - ld a,l - or h - ret z ;нулевое произведение головок и секторов - bit 7,(iy+#1A) - ret z ;винчест не найден - set 7,(iy+#1B) - ret - -;АДРЕС: #1F2D расчет произведения головок и секторов -x1F2D xor a - ld c,(iy-#20) ;головок - ld b,a - exx - ld l,(iy-#1F) ;секторов - ld h,a - ld e,a - ld d,a - exx - call x0FB7 ;умножение dehl=de'hl' * bc - ld (xE5A5),hl ;произведение head * sectors - ret - -;АДРЕС: #1F41 ошибка HDD. вывод сообщения об ошибке в нижней строке монитора -;вх: a - код ошибки, если =#00 -> d - параметр ошибки чтения/записи -x1F41 bit 5,(iy+#0B) - jr z,x1F49 ;функции вызываются из монитора - scf - ret -x1F49 push af - ld a,(xFFDD) - ld (xDDA7),a ;сохраним код ошибки дискового интерпретатора - ld a,d - ld (xDDA7+#01),a ; - pop af - rst #30 - dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора - db #02 - -;АДРЕС: #1F59 чтение ячейки CMOS -;вх: b - адрес в CMOS -;вых: a - значение -; -x1F59 push bc - push bc -x1F5B ld bc,#FFBA - ld a,(xDFF0) - and #7F ;7,=0 регистр адреса CMOS - ld (xDFF0),a - call x2010 ;запись в порт - pop af - ld b,#DF - call x2010 ;запись в порт - ld b,#DF - call x2016 ;чтение порта - pop bc - ret - -;АДРЕС: #1F76 чтение из CMOS времени и даты, в случае готовности CMOS -; -x1F76 ld hl,xDFF6 - ld b,#0C - call x1F59 ;читаем регистр C cmos - bit 4,a - ret z ;еще не обновился - call x1F8B ;bit 7 регистра A cmos - ret nz ;cmos обновляется - set 0,(iy+#1A) - jr x1F98 ;;читаем секунды/минуты/часы - - -;АДРЕС: #1F8B проверка готовности CMOS -;вых: nz - cmos обновляется -; -x1F8B ld b,#0A - call x1F59 ;читаем регистр A cmos - bit 7,a - ret - -;АДРЕС: #1F93 чтение из CMOS времени и даты -;вх: hl - адрес куда читать (6 байт) -; -x1F93 call x1F8B ;проверка готовности cmos - jr nz,x1F93 ;cmos обновляется, ждём -;читаем секунды/минуты/часы -x1F98 ld bc,#0003 -x1F9B call x1F59 - ld (hl),a - inc hl - inc b - inc b - dec c - jr nz,x1F9B -;читаем число/месяц/год - inc b - ld c,#03 -x1FA8 call x1F59 - ld (hl),a - inc hl - inc b - dec c - jr nz,x1FA8 - ret - -;АДРЕС: #1FB2 запись в CMOS времени и даты -;вх: hl - адрес откуда писать (6 байт) -; -x1FB2 ld b,#0B ;регистр B - ld a,#9E ;%10011110 - call x1FDD ;запрет обновления cmos - ld bc,#0003 -x1FBC ld a,(hl) ;запись секунд/минут/часов - inc hl - call x1FDD - inc b - call x1FDD - inc b - dec c - jr nz,x1FBC - inc b - ld c,#03 -x1FCC ld a,(hl) ;запись число/месяц/год - inc hl - call x1FDD - inc b - dec c - jr nz,x1FCC - ld a,%00101010 ;регистр A cmos - call x1FDD - inc b - ld a,%01011110 ;разрешенеи обновления cmos - -;АДРЕС: #1FDD запись данных в ячейку CMOS -;вх: b - адрес в CMOS -; a - новое значение ячейки -; -x1FDD push bc - push af - push bc - ld bc,#FFBA - ld a,(xDFF0) - and #7F - call x2010 ;запись в порт - pop af - ld b,#DF - call x2010 ;выбираем адрес - ld b,#FF ;режим записи данных - ld a,(xDFF0) - or #80 - call x2010 ;запись в порт - pop af ;запись данных в ячейку - ld b,#DF - call x2010 ;запись в порт - ld b,#FF - ld a,(xDFF0) - and #7F - ld (xDFF0),a - call x2010 ;режим чтения cmos - pop bc - ret - -;АДРЕС: #2010 запись в порт -;вх: bc - адрес порта -; a - значение -; -x2010 call x201C ;пауза 293t - out (c),a - ret - -;АДРЕС: #2016 чтение порта -;вх: bc - адрес порта -;вых: a - значение -; -x2016 call x201C ;пауза 293t - in a,(c) - ret - -;АДРЕС: #201C пауза 293t -; -x201C push bc - ld b,#14 - djnz $ - pop bc - ret - -;АДРЕС: #2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -;вх: a - значение ячейки -; b - номер ячейкм -x2023 call x1FDD ;запись данных в ячейку CMOS - push bc - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - call x1FDD ;запись контрольной суммы - pop bc - ret - -;АДРЕС: #2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) -;вых: e - контрольная сумма -; b=#3F -x2030 push de - ld de,#FFFF - ld b,#10 -x2036 call x1F59 ;чтение ячейки CMOS - call x220F ;суммирование байта с контрольной суммой CMOS CRC8 - inc b - ld a,#3F - cp b - jr nz,x2036 - ld a,e - add a,d - pop de - ld e,a - ret - -;АДРЕС: #2047 определение наличия CMOS -;вых: cy=1 были ошибки -; a=#5A - checksum error -; a - номер сообщения для вывода -x2047 ld b,#3F ;номер ячейки - call x1F59 ;чтение ячейки CMOS - ld d,a - ld a,#55 - call x1FDD ;запись данных в ячейку CMOS - call x1F59 ;чтение ячейки CMOS - cp #55 - jr nz,x2065 ;CMOS отсутствует - ld a,#AA - call x1FDD ;запись данных в ячейку CMOS - call x1F59 ;чтение ячейки CMOS - cp #AA - jr z,x2069 ;CMOS найден -x2065 ld a,#5B ;сообщение: CMOS not found - scf - ret -;CMOS найден. определяем размер CMOS -x2069 ld b,#7F - call x1F59 ;чтение ячейки CMOS - ld e,a - ld a,#55 - call x1FDD ;запись данных в ячейку CMOS - ld b,#3F - call x1F59 ;чтение ячейки CMOS - cp #AA - jr nz,x2087 ;64 байт - ld b,#7F - ld a,e - call x1FDD ;запись данных в ячейку CMOS - set 6,(iy+#1B) ;CMOS 128 байт -x2087 ld b,#3F - ld a,d - call x1FDD ;запись данных в ячейку CMOS - set 6,(iy+#1A) ;CMOS обнаружен -;подсчет контрольной суммы CMOS [#10..#3E] (#3F - контрольная сумма) - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - cp d - jr z,x20C2 ;контрольная сумма совпала -; контрольная сумма не совпала. перезапись CMOS -x2098 ld hl,#0705 ;день и месяц: 5 июля - ld (xDFF9),hl - ld (iy-#19),#61 ;год: 1997 - ld (iy-#1C),#0C ;час: 12 - ld hl,xDFF6 - call x1FB2 ;запись в CMOS времени и даты - rst #30 - dw rom4_x0398 ;запись переменных в CMOS - db #04 - ld b,#0E - ld a,#61 ;признак записи в CMOS переменных - call x1FDD ;запись данных в ячейку CMOS - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - call x1FDD ;запись данных в ячейку CMOS - ld a,#5A ;сообщение: CMOS checksum error - scf - ret -; контрольная сумма совпала -x20C2 ld b,#0D ;регистр #D - call x1F59 ;чтение ячейки CMOS - bit 7,a - jr z,x2098 ;пропадало питание. перезапись CMOS - inc b - call x1F59 ;чтение ячейки CMOS - cp #61 - jr nz,x2098 ;переменные не были сохранены. перезапись CMOS - ld hl,xDFF6 - call x1F93 ;чтение из CMOS времени и даты - ld hl,#0040 - bit 6,(iy+#1B) - jr z,x20E5 ;CMOS 64 байта - ld hl,#0080 -x20E5 ld (xDDA7),hl ;для печати размера CMOS - xor a - ld a,#5C ;сообщение: _число_ bytes CMOS found - ret - -;АДРЕС: #20EC работа с контроллером прерываний ???? -x20EC di - ld a,#0F - scf - ret - -;АДРЕС: #20F1 тестирование HDD (2. test) (тест на чтение/запись) -x20F1 ld hl,xEBF5+#200 ;заполним буфер значениями - xor a - ld b,a -x20F6 ld (hl),a - inc a - inc hl - djnz x20F6 -x20FB ld (hl),a - inc a - inc hl - djnz x20FB - ld hl,x217B ;адрес п/п тестирования сектора на чтение/запись - jr x2108 - -;АДРЕС: #2105 тестирование HDD (1. test) (тест только на чтение) -x2105 ld hl,x2172 ;адрес п/п тестирования сектора на чтение -x2108 ld (xE338),hl - ld (iy+#01),#00 - rst #30 - dw rom5_x30C6 ;печать окна для тестирования HDD - db #05 - ld hl,(xDFF2) ;значение Cylinders HDD - ld de,#0000 - exx - ld bc,(xE5A5) ;head * sector активного HDD - call x0FB7 ;умножение dehl=de'hl' * bc (кол-во секторов на HDD) - push de - push hl - xor a - ld l,a - ld h,a - ld e,a - ld d,a - push de - push hl -x212A ld hl,#0000 - add hl,sp - ex de,hl ;de адрес стэка - ld hl,#0004 - add hl,sp - call x1035 ;сравнение двух чисел в памяти по адресам в de и hl - jp p,x214C ;еще не конец винчестера - call x2169 ;печать текущего номера цилиндра - pop hl - pop hl - pop hl - pop hl - rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) - db #05 -x214C pop hl - pop de - push de - push hl - ld bc,x215A ;адрес п/п перехода к следующему сектору - push bc - ld bc,(xE338) ;адрес п/п тестирования сектора - push bc - ret -;переход к следующему сектору -x215A pop hl - pop de - ld a,l - and #3F - call z,x2169 ;печать текущего номера цилиндра - call x0FF3 ;инкремент dehl - push de - push hl - jr x212A -;печать текущего номера цилиндра -x2169 push de - push hl - rst #30 - dw rom5_x3163 ;печать текущего номера цилиндра - db #05 - pop hl - pop de - ret -;тестирование одного сектора на чтение -x2172 call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - ret nc ;нет ошибок -x2176 rst #30 - dw rom5_x30F3 ;печать кода ошибки винчестера - db #05 - ret -;тестирование одного сектора на чтение/запись -x217B call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - jr c,x2176 ;ошибка чтения. печать кода ошибки винчестера - ld hl,xE5A9 ;сохраним прочитанный сектор - ld de,xEBF5 - ld bc,#0200 - ldir - push ix - ld ix,xEBF5+#200 - call x1D4A ;запись сектора из буфера ix на винчестер - jr c,x21C6 ;ошибка записи - ld ix,xE5A9 - call x1D78 ;чтение сектора с винчестера в буфер ix - jr c,x21C6 ;ошибка чтения - call x21BF ;запись изначальных данных сектора - pop ix - jr c,x2176 ;ошибка записи. печать кода ошибки винчестера - ld hl,xE5A9 - ld bc,#0000 -x21AC ld a,c - cp (hl) - call nz,x21CF ; - inc c - inc hl - djnz x21AC -x21B5 ld a,c - cp (hl) - call nz,x21CF ; - inc c - inc hl - djnz x21B5 - ret -;запись сектора из буфера xEBF5 на винчестер -x21BF ld ix,xEBF5 - jp x1D4A ;запись сектора из буфера ix на винчестер -;ошибка чтения/записи -x21C6 push af - call x21BF ;запись сектора из буфера xEBF5 на винчестер - pop af - pop ix - jr x2176 ;печать кода ошибки винчестера - -x21CF pop de - pop ix - push ix - push de - push hl - push bc - ld b,(hl) - ld de,xE5A9 - or a - sbc hl,de - rst #30 - dw rom5_x3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD - db #05 - pop bc - pop hl - ret - -;АДРЕС: #21E5 подсчет контрольной суммы области памяти CRC16 -;вх: bc - размер области памяти -; de - адрес начала памяти -;вых: hl - контрольная сумма -x21E5 ld hl,#FFFF - ld a,c - or b - ret z - push ix - push de - pop ix - ex de,hl -x21F1 ld hl,x2222 - ld a,(ix+0) - inc ix - xor e - add a,l - ld l,a - jr nc,x21FF - inc h -x21FF ld a,d - xor (hl) - ld e,a - inc hl - xor a - xor (hl) - ld d,a - dec bc - ld a,c - or b - jr nz,x21F1 - pop ix - ex de,hl - ret - -;АДРЕС: #220F суммирование байта с контрольной суммой CMOS CRC8 -;вх: a - значение -; de - контрольная сумма -;вых: de - контрольная сумма (новое значение) -x220F push hl - ld hl,x2222 - xor e - add a,l - ld l,a - jr nc,x2219 - inc h -x2219 ld a,d - xor (hl) - ld e,a - inc hl - xor a - xor (hl) - ld d,a - pop hl - ret - -;АДРЕС: #2222 данные для подсчета контрольной суммы -;АДРЕС: #2223 данные для подсчета контрольной суммы -x2222 INCBIN "prof_roms/rom7_data4CRC.bin" - -;АДРЕС: #2422 определение наличия SMUC -;вых: cy=1 SMUC не найден -; =0 SMUC обнаружен -; d - номер версии -; e - номер ревизии -x2422 ld de,#FFFF - call x0D51 ;определение наличия SMUC - jr c,x2441 ;не найден - ld bc,#5FBA - in a,(c) - inc a - jr z,x2441 ;версии нет. не найден - dec a - call x2443 ;преобразование версии/ревизии в число - ld d,a - ld bc,#5FBE - in a,(c) - call x2443 ;преобразование версии/ревизии в число - ld e,a - ret -x2441 scf - ret -;преобразование версии/ревизии в число -x2443 ld b,a - rrca - rrca - rrca - and #01 - ld c,a - ld a,b - rlca - rlca - rlca - or c - and #07 - ret - -;неиспользуемая область -x2452 ds #AE,0 ;not used - -;АДРЕС: #2500 ROM-disk -x2500 INCBIN "prof_roms/rom7_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM7.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom7.bat b/ProfRom_Disasm/rom7.bat deleted file mode 100755 index bb8713f..0000000 --- a/ProfRom_Disasm/rom7.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom7.a80 >> !log\error.txt diff --git a/SP_128.ASM b/SP_128.ASM index 0480f7b..2fb3e18 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -10558,7 +10558,7 @@ L27EB: M_COM: BYTE 6,0 WORD TRDOS BYTE 1 - WORD HARDWARE ;ISDOS + WORD HARDWARE BYTE 2 WORD L286C BYTE 3 diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 670fff2..7a33370 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,11 +1,12 @@ INIT_RMD: - LD C,BIOS.FullInit + LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET + CALL EXP_FNS + ; [ ] 23/02/2024 грохаем перехват ресета + LD A,ACEX.RET_PORT + LD BC,BIOS.SET_PORTS + JP EXP_FNS ; diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index c89774e..356e45d 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -503,65 +503,102 @@ READ_WRITE_RAMD: DEC B RET Z ; - PUSH HL PUSH BC + PUSH HL + ; сохраняем кол-во секторов для чтения + LD C,B + ; накручиваем счётчик r/w секторов + LD HL,(ZX_VARS.CONT_SEC) + LD D,H + LD E,L + ;!TODO переделать эту тупость на математику + LD A,16 +.loop: INC L + CP L + JR NZ,.skip + INC H + LD L,0 +.skip: DJNZ .loop + ; + ; сохраняем накрученный счётчик + LD (ZX_VARS.CONT_SEC),HL + ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ + LD A,D + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + ; восстанавливаем кол-во секторов для чтения + LD B,C ;Get RAM Block ID LD A,(ZX_VARS.OPER_DISK) AND 3 - LD C,BIOS.GET_DRV_ST + LD C,BIOS.GET_DRV_ST ; не убивает DE и B CALL EXP_FNS JP C,.ERROR SUB 4 - LD C,BIOS.GET_RAMD_ST + LD C,BIOS.GET_RAMD_ST ; не убивает DE и B CALL EXP_FNS JP C,.ERROR - ; A = RAM Block ID + ; A = RAM Block ID EX AF,AF' ; - POP BC - LD C,B - ; !TEST накручиваем счётчик r/w секторов - LD HL,(ZX_VARS.CONT_SEC) - LD A,16 - INC C -.loop: DEC C - JR Z,.next - INC L - CP L - JR NZ,.loop - INC H - LD L,0 - JR .loop -.next: ; - ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ - LD DE,(ZX_VARS.CONT_SEC) - LD A,D - RRCA - RRCA - RRCA - RRCA - LD D,A - AND #F0 - OR E - LD E,A - LD A,D - AND #0F - LD D,A - ; - EX (SP),HL + ;POP DE + ; POP BC + ; PUSH BC +; ; !TEST накручиваем счётчик r/w секторов +; LD HL,(ZX_VARS.CONT_SEC) +; LD D,H +; LD E,L +; ;!TODO переделать эту тупость на математику +; LD A,16 +; .loop: INC L +; CP L +; JR NZ,.skip +; INC H +; LD L,0 +; .skip: DJNZ .loop +; ; сохраняем накрученный счётчик +; LD (ZX_VARS.CONT_SEC),HL +; ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ +; LD A,D +; RRCA +; RRCA +; RRCA +; RRCA +; LD D,A +; AND #F0 +; OR E +; LD E,A +; LD A,D +; AND #0F +; LD D,A +; ; + ; POP BC + ; PUSH BC + + + POP HL ; Get command r/w LD A,(ZX_VARS.RD_WR_COM) EX AF,AF' LD C,BIOS.BLK_RD_WR CALL EXP_FNS - POP HL + ; HL = адрес буфера для следующего сектора + POP BC JP C,AUTO_3EE7 - ; сохраняем накрученный счётчик - LD (ZX_VARS.CONT_SEC),HL + LD B,0 RET -.ERROR: POP BC - POP HL +.ERROR: POP HL + POP BC JP AUTO_3EE7 ;Disk error ; ╔════════════════════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ From b3b3c86c44ad35bc725763302294664ead0dde71 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Feb 2024 04:11:26 +1000 Subject: [PATCH 054/114] --- --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 215d0f3..5a5dcf0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 215d0f3c90865dd2c4c0d92d17e64513a0b0407e +Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 From 3b9221b2d9275987d62b70f8a51d3e327896f8cb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 05:13:08 +1000 Subject: [PATCH 055/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5a5dcf0..68681fb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 +Subproject commit 68681fbc50da463f1debae860e6db64603886d39 From 0abc73e563090af80851383540aeebaa9858ece9 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 05:14:37 +1000 Subject: [PATCH 056/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 68681fb..18c132c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68681fbc50da463f1debae860e6db64603886d39 +Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 From 0e71fa18a0c205965d02cc0e05939f8f1bbd7b37 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 19 Jun 2024 01:02:42 +1000 Subject: [PATCH 057/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 18c132c..399bf41 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 +Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 From 89bafc33fad264418bad2d4f61d5c5cbebc074f9 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:10:34 +1000 Subject: [PATCH 058/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 399bf41..d294e37 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 +Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 From 0ef0fc565f6666a4e39070eeb847cee3d7ea2bd2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:32:43 +1000 Subject: [PATCH 059/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index d294e37..bfc070c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 +Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 From 90e3c53cd455ef043bfa72b57cd8c9269d95208d Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:33:20 +1000 Subject: [PATCH 060/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index bfc070c..990f10e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 +Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f From 698a864b04c384b849fceac818233f36b5e74532 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 8 Jul 2024 00:46:47 +1000 Subject: [PATCH 061/114] trdos: skip LFN and #E5 records in /cat. An error is thrown in the "/HDD xx" command when selecting an unsupported partition --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 4 +-- TRDOS/TR_MSD_2.ASZ | 67 +++++++++++++++++++++++++++++----------------- TRDOS/TR_MSD_3.ASZ | 2 +- TRDOS/TR_MSD_S.ASZ | 12 ++++----- 5 files changed, 52 insertions(+), 35 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 990f10e..04aaef8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f +Subproject commit 04aaef8ac955971d913babd95921a62937b597ae diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index d601814..2e0beec 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -13,10 +13,10 @@ CHOOSE_HDD: ; .loop: LD A,(DE) INC DE - CP ' ' + CP " " JR Z,.loop LD A,(DE) - CP #0D + CP "\r" JR Z,.error .cont: ; номер раздела ;INC DE diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 6800937..1ed49f1 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -33,24 +33,37 @@ MSDOS_TEST_FL: LD A,SYS_PAGE OUT (SLOT3),A LD A,E + ; [x] 07/07/2024 пропуск LFN + PUSH HL + LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT + ADD HL,DE + LD D,(HL) + POP HL + ; LD E,(HL) OUT (SLOT3),A EI - LD A,E + ; [x] 07/07/2024 пропуск LFN + LD A,D + CP #0F ; FAT_ATTR.LFS_Entry + JR NZ,.nxt + POP DE + JR MSDOS_NEXT_FL + ; +.nxt: LD A,E POP DE AND A SCF RET Z ; КОНЕЦ КАТАЛОГА CP #E5 - SCF - CCF -; DEC A ; СТЕРТЫЙ ФАЙЛ -; AND A + JR Z,MSDOS_NEXT_FL + AND A RET -;********************************** + +;********************** MSDOS_NEXT_FL: PUSH DE - LD DE," " + LD DE,32 ; FAT_DIRECTORY_RECORD size ADD HL,DE DI IN A,(SLOT3) @@ -99,18 +112,18 @@ MSDOS_CAT: PUSH DE CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD A,13 + LD A,"\r" RST #10 POP DE ; СТРОКА ПОСЛЕ CAT CAT_SPACES: LD A,(DE) - CP #20 + CP " " JR NZ,CAT_NO_SPACE INC DE JR CAT_SPACES CAT_NO_SPACE: - CP 13 + CP "\r" JR NZ,CAT_ALL LD DE,CAT_FILES CAT_ALL: @@ -142,26 +155,29 @@ PRINT_MSD_NAME: PUSH DE LD HL,ZX_VARS.FL_NAME LD A,' ' - RST 10H + RST #10 LD A,' ' - RST 10H + RST #10 + ; LD B,8 -PRINT_MSD_L1: - LD A,(HL) - RST 10H +.L1: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 INC HL - DJNZ PRINT_MSD_L1 + DJNZ .L1 + ; LD A,' ' - RST 10H + RST #10 + ; LD B,3 -PRINT_MSD_L2: - LD A,(HL) - RST 10H +.L2: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 INC HL - DJNZ PRINT_MSD_L2 + DJNZ .L2 + ; LD A,6 - RST 10H - + RST #10 POP DE POP HL RET @@ -369,8 +385,9 @@ RMD_BLKS_L2: RET ; B - ЧИСЛО БЛОКОВ RAM_DISK ;**************************************** -MSDOS_KOMP_FL: ; DE - ИМЯ ФАЙЛА СО *,? - ; HL - ИМЯ В КАТАЛОГЕ +; DE - ИМЯ ФАЙЛА СО *,? +; HL - ИМЯ В КАТАЛОГЕ +MSDOS_KOMP_FL: CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS LD A,(ZX_VARS.FL_NAME) AND A diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 7a33370..3a73f6c 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -619,7 +619,7 @@ HDD_SET:;!TEST INC DE CP ' ' JR Z,.loop - CP #0D + CP "\r" JR Z,.init ; DEC DE diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index cd4e27e..f2373b4 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -562,7 +562,7 @@ READ_BPB: LD C,B LD B,0 ; BC - число файловых записей в секторе LD A,C - LD (SYS_PAGE.F_P_S),A + LD (SYS_PAGE.FilesPerSector),A LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей @@ -579,7 +579,7 @@ READ_BPB: LD E,A ; A - число секторов в DIR LD D,0 LD BC,0 - LD (SYS_PAGE.S_P_C),A + LD (SYS_PAGE.SectorsPerCluster),A ADD IX,DE ; Начало DATA area ADC HL,BC @@ -646,11 +646,11 @@ READ_1ST_DIR: EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD IX,(SYS_PAGE.MSD_CAT_SEC2) ; - LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА + LD IX,(SYS_PAGE.MSD_CAT_SEC2) + LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА LD (SYS_PAGE.MSD_CONT_SEC),DE LD (SYS_PAGE.MSD_CONT_SEC2),IX - LD A,(SYS_PAGE.S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ + LD A,(SYS_PAGE.SectorsPerCluster) ; СЕКТОРОВ В КАТАЛОГЕ LD (SYS_PAGE.COUNT_SEC),A READ_NEXT2: EX AF,AF' @@ -677,7 +677,7 @@ READ_NEXT2: INC IX LD (SYS_PAGE.MSD_CONT_SEC2),IX READ_NEXT3: - LD A,(SYS_PAGE.F_P_S) ; ФАЙЛОВ В СЕКТОРЕ + LD A,(SYS_PAGE.FilesPerSector) ; ФАЙЛОВ В СЕКТОРЕ LD (SYS_PAGE.COUNT_FL),A EX AF,AF' From 6d36e21c3c2547950c9365b617d6d316453da038 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:22:56 +1000 Subject: [PATCH 062/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 04aaef8..4f546cb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 04aaef8ac955971d913babd95921a62937b597ae +Subproject commit 4f546cb1d2cd8eeb1aec0de2c3e9902d1bb52fee diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 1ed49f1..ac3de9f 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -415,9 +415,9 @@ KOMP_CONT2: MSDOS_KOMP_ALL: LD A,(DE) INC DE - CP 20H + CP " " JR Z,MSDOS_KOMP_ALL - CP 13 + CP "\r" JR Z,KOMP_ERROR_NAME ; НЕВЕРНОЕ ИМЯ DEC DE @@ -426,11 +426,11 @@ MSDOS_KOMP_ALL: RET NZ LD A,(DE) - CP '.' + CP "." JR Z,KOMP_POINT - CP 13 + CP "\r" JR Z,KOMP_SPACING3 - CP 20H + CP " " JR Z,KOMP_SPACING3 KOMP_ERROR_NAME: ; НЕВЕРНОЕ ИМЯ LD A,1 @@ -453,21 +453,21 @@ KOMP_POINT: ;**************************************************** KOMP_TX: LD A,(DE) - CP 13 + CP "\r" JR Z,KOMP_SPACING - CP 20H + CP " " JR Z,KOMP_SPACING - CP '.' + CP "." JR Z,KOMP_SPACING - CP '?' + CP "?" JR Z,KOMP_EX_OK - CP '*' + CP "*" JR Z,KOMP_EX_OK2 - CP 'a' + CP "a" JR C,KOMP_EXEC - CP 'z'+1 + CP "z"+1 JR NC,KOMP_EXEC - AND 223 + AND %1101'1111 KOMP_EXEC: CP (HL) RET NZ ; нет совпадения From 0cb769a71f92ef47c6e47d0e7853c1e24ed4dd80 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 18 Jul 2024 05:36:06 +1000 Subject: [PATCH 063/114] in progress: current dir for TR-DOS HDD --- SP_TRDOS.ASM | 171 ++++++------- SP__48.ASM | 4 +- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 255 ++++++++++++++++--- TRDOS/TR_MSD_2.ASZ | 35 ++- TRDOS/TR_MSD_3.ASZ | 95 +------ TRDOS/TR_MSD_S.ASZ | 84 +++--- TRDOS/TR_RMD_S.ASZ | 55 +--- TRDOS/boot_trd.asm | 618 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 1021 insertions(+), 298 deletions(-) create mode 100644 TRDOS/boot_trd.asm diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 68810b3..a46e3f2 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -49,24 +49,16 @@ AUTO_411E EQU #411E AUTO_4130 EQU #4130 AUTO_4140 EQU #4140 AUTO_41FF EQU #41FF -AUTO_5220 EQU #5220 -AUTO_58E8 EQU #58E8 AUTO_5E34 EQU #5E34 AUTO_5F00 EQU #5F00 AUTO_5F10 EQU #5F10 AUTO_5F12 EQU #5F12 -AUTO_6000 EQU #6000 PORT_128 EQU #7FFD AUTO_A1DB EQU #A1DB AUTO_B0ED EQU #B0ED -AUTO_B8ED EQU #B8ED AUTO_C000 EQU #C000 AUTO_C130 EQU #C130 -AUTO_C308 EQU #C308 -AUTO_C916 EQU #C916 -AUTO_FE15 EQU #FE15 -AUTO_FF00 EQU #FF00 ;**************************************** START: DI @@ -526,7 +518,7 @@ AUTO_031A: AUTO_0320: INC C LD D,A - LD A,22 ; 21 !!! Add new comand !! + LD A,TRDOS_CMD.LIST.Size CP C JP C,AUTO_01D3 ; ЕСЛИ НЕ НАЙДЕНО-ВЫЙТИ LD A,D @@ -561,10 +553,15 @@ AUTO_0359: SET 7,(HL) POP HL JP (HL) -NAME_TRD: - DB 127," 1986 Technology Research. " - DB "version 5.05 by Makarchenco Ivan. " - DB " ",0,0 + +;----------------------------------------------------------------------- + _mInfoBLOCK #03AC-$,#FF +; NAME_TRD: +; DB 127," 1986 Technology Research. " +; DB "version 5.05 by Makarchenco Ivan. " +; DB " ",0,0 +;----------------------------------------------------------------------- + AUTO_03AC: CALL AUTO_03FD CALL PRINT_CR @@ -1153,9 +1150,9 @@ WG93_EXE_: INCLUDE 'trdos/tr_msd_3.asz' - _mInfoBLOCK #0B00-$,255 +; _mInfoBLOCK #0B00-$,255 ;!TODO russian charset -ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? +;ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** INCLUDE 'trdos/tr_msd_2.asz' @@ -1265,11 +1262,11 @@ AUTO_1059: POP DE POP BC POP HL - AND 223 + AND %1101'1111 EI RET AUTO_106E: - LD HL,AUTO_58E8 + LD HL,#58E8 ;адрес линии атрибутов LD B,10 AUTO_1073: LD (HL),7 @@ -1277,15 +1274,13 @@ AUTO_1073: DJNZ AUTO_1073 LD (HL),2 INC HL - LD (HL),22 + LD (HL),#16 INC HL - DB 54 -AUTO_107F: - INC (HL) + LD (HL),#34 INC HL - LD (HL),'%' + LD (HL),#25 INC HL - LD (HL),'(' + LD (HL),#28 INC HL LD (HL),7 LD HL,AUTO_40F1 @@ -1448,12 +1443,12 @@ AUTO_1205: PUSH AF CALL Z,AUTO_1D97 POP AF - CP 17 + CP 16 + 1 JP NC,CMD_ERROR CALL AUTO_1D84 - LD A,255 + LD A,#FF LD (ZX_VARS.DISK_1_FLG),A - CALL AUTO_1151 + CALL AUTO_1151 ; !FIXIT выделяет память, но не освобождает LD HL,ZX_VARS.CLEAR_SEC LD DE,(ZX_VARS.VAR_1) LD BC,RST20 @@ -4276,7 +4271,7 @@ AUTO_25EF: INC HL LD D,(HL) OR A - LD HL,AUTO_107F + LD HL,ROUTINE.ed_error ;48 basic routine SBC HL,DE JR NZ,AUTO_2626 LD SP,(ZX_VARS.ERR_SP) @@ -5588,66 +5583,64 @@ AUTO_2FDE: RET //////////////////////////////////////////// -TRDOS_CMD: - ; Таблица команд TR-DOS. -.LIST: DB ZX_Token.cat - DB '*' - DB ZX_Token.format - DB ZX_Token.move - ; - DB ZX_Token.new - DB ZX_Token.erase - DB ZX_Token.load - DB ZX_Token.save - ; - DB ZX_Token.return - DB ZX_Token.peek - DB ZX_Token.poke - DB ZX_Token.merge - ; - DB ZX_Token.run - DB ZX_Token.open_channel - DB ZX_Token.close_channel - DB ZX_Token.copy - ; - DB '4' - DB ZX_Token.go_to - DB '8' - DB ZX_Token.list - ; - DB ZX_Token.verify - DB '/' - ;; - ;; -.Size EQU $ - TRDOS_CMD.LIST - ; Таблица адресов подпрограмм, выполняющих команды TR-DOS. -.TABLE: DW CMD_CAT - DW CMD_STAR - DW CMD_FORMAT - DW CMD_MOVE - ; - DW CMD_NEW - DW CMD_ERASE - DW CMD_LOAD - DW CMD_SAVE - ; - DW CMD_RETURN - DW CMD_PEEK - DW CMD_POKE - DW CMD_MERGE - ; - DW CMD_RUN - DW CMD_OPEN - DW CMD_CLOSE - DW CMD_COPY - ; - DW CMD_40 - DW CMD_GOTO - DW CMD_80 - DW CMD_LIST - ; - DW CMD_VERIFY - DW CMD_MSDOS +TRDOS_CMD: ; Таблица команд TR-DOS. +.LIST: DB ZX_Token.cat + DB '*' + DB ZX_Token.format + DB ZX_Token.move + ; + DB ZX_Token.new + DB ZX_Token.erase + DB ZX_Token.load + DB ZX_Token.save + ; + DB ZX_Token.return + DB ZX_Token.peek + DB ZX_Token.poke + DB ZX_Token.merge + ; + DB ZX_Token.run + DB ZX_Token.open_channel + DB ZX_Token.close_channel + DB ZX_Token.copy + ; + DB '4' + DB ZX_Token.go_to + DB '8' + DB ZX_Token.list + ; + DB ZX_Token.verify + DB '/' + ; +.LIST.Size EQU $ - TRDOS_CMD.LIST + ; Таблица адресов подпрограмм, выполняющих команды TR-DOS. +.TABLE: DW CMD_CAT + DW CMD_STAR + DW CMD_FORMAT + DW CMD_MOVE + ; + DW CMD_NEW + DW CMD_ERASE + DW CMD_LOAD + DW CMD_SAVE + ; + DW CMD_RETURN + DW CMD_PEEK + DW CMD_POKE + DW CMD_MERGE + ; + DW CMD_RUN + DW CMD_OPEN + DW CMD_CLOSE + DW CMD_COPY + ; + DW CMD_40 + DW CMD_GOTO + DW CMD_80 + DW CMD_LIST + ; + DW CMD_VERIFY + DW CMD_MSDOS //////////////////////////////////////////// ; ; @@ -6434,8 +6427,8 @@ READR_X: ;***************************** NEW_NAME: - DB 22,1,3, "* Sprinter TR-DOS v.7.02 *" - DB 22,3,6, "(c) 2023 Sprinter Team" + DB 22,1,3, "* Sprinter TR-DOS v.7.03 *" + DB 22,3,6, "(c) 2024 Sprinter Team" DB 22,5,14, "*R.F.*" DB 22,7,9, "BETA 4Mb",0 diff --git a/SP__48.ASM b/SP__48.ASM index cda53cf..a983d9a 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -20358,6 +20358,4 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00111100 - END - - +; END \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4f546cb..77a5168 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4f546cb1d2cd8eeb1aec0de2c3e9902d1bb52fee +Subproject commit 77a51684d4d63ad2fdccf416793951df00276b17 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 2e0beec..8dc2742 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -1,16 +1,110 @@ +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +HDD_PROG: + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + LD HL,SYS_PAGE.HD_IDF_ADR.ModelNum + LD B,32 +HDD_PROG_L: + DI + IN A,(SLOT3) + LD D,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,L + XOR 1 + LD L,A + LD C,(HL) + LD A,L + XOR 1 + LD L,A + INC HL + LD A,D + OUT (SLOT3),A +; RET_PAGE3 + EI + LD A,C + PUSH BC + RST #10 + POP BC + DJNZ HDD_PROG_L + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_RECAL and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_RECAL + CALL EXP_FNS + ; + JP NC,AUTO_03E1 + +HDD_ERROR: + CALL PRINT_HEX_A + LD HL,HD_TX + JP AUTO_03E4 + +; JP AUTO_03E1 + +HDD_PROG_E: + LD HL,HD_TX2 + JP AUTO_03E4 + +; +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP " " + JR Z,.loop + CP "\r" + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ;CALL CHOOSE_HDD + ;CALL READ_BPB + ;RET + ; +; [x] new tr-hdd +.init: ;CALL CORRECT_CUR_DIR + DI + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_DIR_HDD) + CP #FF + JR Z,.skip + LD (SYS_PAGE.CURRENT_HDD),A + ; +.skip: ;LD A,(SYS_PAGE.CURRENT_HDD) + OR #40 + PUSH AF + LD A,C + OUT (SLOT3),A + ; + LD C,BIOS.HDD_INIT + CALL EXP_FNS + POP AF + JP C,HDD_PROG_E + ; + ; LD BC,(ZX_VARS.OPER_DISK - 1) + ; LD A,(ZX_VARS.OPER_DISK) + ; LD B,A + ; XOR A + LD E,A + LD C,BIOS.SET_DISK_REDIR + JP EXP_FNS ;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: - PUSH DE - LD A,(ZX_VARS.OPER_DISK) - LD C,BIOS.GET_DRV_ST - CALL EXP_FNS - POP DE - JR C,.error - AND #40 ;!HARDCODE HDD - CALL Z,.setUp_HDD - ; .loop: LD A,(DE) INC DE CP " " @@ -18,8 +112,7 @@ CHOOSE_HDD: LD A,(DE) CP "\r" JR Z,.error -.cont: ; номер раздела - ;INC DE + ; номер раздела LD A,(DE) CP "4" JR NC,.error @@ -29,17 +122,6 @@ CHOOSE_HDD: RLA RLA LD C,A - ; ; master/slave - ; DEC DE - ; LD A,(DE) - ; CP "2" - ; JR NC,.error - ; CP "0" - ; JR C,.error - ; SUB "0" - ; RLA - ; OR C - ; LD C,A ; Primary/Secondary, master/slave DEC DE LD A,(DE) @@ -50,20 +132,129 @@ CHOOSE_HDD: SUB "0" OR C ; + PUSH AF LD C,BIOS.HDD_PART CALL EXP_FNS - RET NC + POP BC + JR C,.error ; -.error: LD HL,MSG_3 + SCF + ;CALL CORRECT_CUR_DIR + CALL RESTORE_CURRENT_DIR + ; + XOR A + LD C,A ; обнулить C + LD A,B + ;OR #40 + LD B,A + ; + ; PUSH AF + ; LD A,(ZX_VARS.OPER_DISK) + ; LD C,BIOS.GET_DRV_ST + ; CALL EXP_FNS + ; POP BC + ; JR C,.error + ; ; + ; AND #40 ;!HARDCODE HDD + ; LD C,A ; обнулить C + ; LD A,B + ; RET NZ + ; + PUSH BC + LD BC,(ZX_VARS.OPER_DISK - 1) + ; LD B,A + ; XOR A + LD C,BIOS.HDD_TO_DRV + CALL EXP_FNS + POP AF + RET + ; +.error: ;AND %1101'1111 + ;CP "*" + ;JR Z,.set_from_sys_page + LD HL,MSG_3 JP ERR_EXIT ; -.setUp_HDD: - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - PUSH DE +; .setUp_HDD: +; PUSH BC +; LD A,(ZX_VARS.OPER_DISK) +; LD B,A +; XOR A +; LD C,BIOS.HDD_TO_DRV +; CALL EXP_FNS +; POP BC +; RET + ; +;.set_from_sys_page: +; !!! + + +; CF=1: skip resest CURRENT_HDD +; CF=0: resest CURRENT_HDD + + +; [x] new tr-hdd +RESTORE_CURRENT_DIR: + PUSH AF + ; + LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - POP DE + CP #40 + JR C,.exit_Res_Dir + AND #0F + LD H,A + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_DIR_HDD) + CP H + JR NZ,.exit_Res_Dir + + LD HL,(SYS_PAGE.CURRENT_DIR_SEC_L) + LD DE,(SYS_PAGE.CURRENT_DIR_SEC_H) + LD A,H + OR L + OR D + OR E + JR Z,.exit_Res_Dir + ; + LD (SYS_PAGE.MSD_CAT_SEC),HL + LD (SYS_PAGE.MSD_CAT_SEC2),DE +.exit_Res_Dir: + EX AF,AF' + OUT (SLOT3),A + POP AF RET -; \ No newline at end of file + ; + + +; [x] new tr-hdd +; TO INIT by SPECTRUM.EXE: +; .CURRENT_DIR_SEC_L EQU #C196 ; word +; .CURRENT_DIR_SEC_H EQU #C198 ; word +; .CURRENT_DIR_HDD EQU #C19A +; .CURRENT_HDD EQU #C12D + +; CORRECT_CUR_DIR: +; DI +; IN A,(SLOT3) +; LD C,A +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,#FF +; JR C,.skip +; LD (SYS_PAGE.CURRENT_HDD),A +; .skip: INC A +; LD H,A +; LD L,A +; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +; LD A,C +; OUT (SLOT3),A +; RET +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index ac3de9f..119dcea 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -1,7 +1,9 @@ -; -; for INCLUDE +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +;********************************** ; MS-DOS system -; ;********************************** MSDOS_FIND_FILE: @@ -19,10 +21,28 @@ MSDOS_FIND_NEXT: ;*********************************************** ; +; CHECK_BPB: +; IN A,(SLOT3) +; LD E,A +; LD A,SYS_PAGE +; DI +; OUT (SLOT3),A +; ; +; LD A,(SYS_PAGE.BPB_PARSED) +; ADD A,1 +; ; +; LD A,E +; OUT (SLOT3),A +; EI +; RET ;*********************************************** MSDOS_1ST_FL: PUSH DE - CALL READ_BPB + ; 15/07/2024 + ;CALL CHECK_BPB + CALL READ_BPB + ;CALL C,READ_BPB + ; CALL READ_1ST_DIR POP DE MSDOS_TEST_FL: @@ -341,7 +361,7 @@ LOAD_RMD_XX: POP AF CALL GET_RMD_A ; установить RAM-Disk A размером B - LD HL,0C000H + LD HL,#C000 CALL MSDOS_READ_FILE JP AUTO_03E1 @@ -570,7 +590,7 @@ WORDS: DB 5,'CLEAR' ; DW TB_ONOFF DB 5,'TBOFF' ; выключить турбо DW TB_ONOFF - DB 4,'INIT' ; инизиализация + DB 4,'INIT' ; реинизиализация DW INIT_RMD DB 8,"SPRINTER" DW SPR_1 @@ -625,3 +645,6 @@ SP_1: LD A,(DE) ; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ ; 2 - КОНЕЦ КАТАЛОГА ; +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_2.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 3a73f6c..f4a9407 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,4 +1,6 @@ - +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ INIT_RMD: LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то @@ -559,90 +561,7 @@ GET_FL_L2: RET Z INC BC RET -;*************************************************************************** - -HDD_PROG: - ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - LD HL,SYS_PAGE.HD_IDF_ADR+54 - LD B,32 -HDD_PROG_L: - DI - IN A,(SLOT3) - LD D,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,L - XOR 1 - LD L,A - LD C,(HL) - LD A,L - XOR 1 - LD L,A - INC HL - LD A,D - OUT (SLOT3),A -; RET_PAGE3 - EI - LD A,C - PUSH BC - RST 10H - POP BC - DJNZ HDD_PROG_L - ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_RECAL and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_RECAL - CALL EXP_FNS - ; - JP NC,AUTO_03E1 - -HDD_ERROR: - CALL PRINT_HEX_A - LD HL,HD_TX - JP AUTO_03E4 - -; JP AUTO_03E1 - -HDD_PROG_E: - LD HL,HD_TX2 - JP AUTO_03E4 - -; -HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - CP "\r" - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ; - -.init: ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; -;*************************************************************************** \ No newline at end of file +;*********************************************************************** +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_3.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index f2373b4..663be83 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -1,7 +1,9 @@ -; -; for INCLUDE +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +;******************************************** ; MS-DOS system -; ;******************************************** ; MS-DOS utilites ;******************************************** @@ -427,20 +429,23 @@ SET_1440: READ_BPB: CALL DISK_REDIR + ; LD C,BIOS.GET_DISK_REDIR + ; CALL EXP_FNS CP #40 - JR NC,.HDD_REDIR2 + JR NC,.HDD CP 4 JP NC,.ERROR_MSDOS - + ; CALL SET_DISK - + ; CALL .MAIN RET NC JP .ERROR_MSDOS -.HDD_REDIR2: - CALL .MAIN + ; +.HDD: CALL .MAIN + CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC -.SPACIAL: + ; old hdd LD IX,0 LD DE,63 ;!HARDCODE LD A,SYS_PAGE @@ -450,17 +455,18 @@ READ_BPB: CALL MSD_R_W_UT ; CALL .PARAMS + CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC JP .ERROR_MSDOS + ; .MAIN: LD A,SYS_PAGE LD HL,SYS_PAGE.MS_BPB LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT - ;CALL BPB_PARAMS ;RET - + ; ; LD C,18H ; LD A,(ZX_VARS.OPER_DISK) ; CALL HD_CMD @@ -493,8 +499,8 @@ READ_BPB: CP #F0 JP C,.ERROR_BPB - LD HL,SYS_PAGE.MS_BPB+FAT_ID - LD DE,.FAT1_MSG + LD DE,SYS_PAGE.MS_BPB+FAT_ID + LD HL,.FAT1_MSG LD B,4 .L1: LD A,(DE) CP ' ' @@ -507,7 +513,7 @@ READ_BPB: INC HL INC DE DJNZ .L1 - LD A,(HL) + LD A,(DE) CP '6' LD HL,#81FF ; FAT16 флаг JR Z,.FAT @@ -521,15 +527,16 @@ READ_BPB: LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек LD (SYS_PAGE.MSD_SECS),A - BIT 7,H + ; BIT 7,H - LD IX,0 - LD HL,0 ; вычислить начальный сектор FAT + ; LD IX,0 + ; LD HL,0 ; вычислить начальный сектор FAT + ; JR Z,.NO_LD_SPECIAL - JR Z,.NO_LD_SPECIAL LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) -.NO_LD_SPECIAL: + +;.NO_LD_SPECIAL: LD BC,0 LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) @@ -539,10 +546,10 @@ READ_BPB: LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT - LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT - LD BC,0 + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT + ;LD BC,0 - LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs .NEXT_ADD: ADD IX,DE ADC HL,BC @@ -552,16 +559,18 @@ READ_BPB: LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR + ; A=0 + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + LD A,B RL C - RL B + RLA RL C - RL B + RLA RL C - RL B - LD C,B + RLA + LD C,A LD B,0 ; BC - число файловых записей в секторе - LD A,C LD (SYS_PAGE.FilesPerSector),A LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей @@ -577,8 +586,8 @@ READ_BPB: EX DE,HL LD E,A ; A - число секторов в DIR - LD D,0 LD BC,0 + LD D,B LD (SYS_PAGE.SectorsPerCluster),A ADD IX,DE ; Начало DATA area @@ -588,10 +597,12 @@ READ_BPB: LD (SYS_PAGE.MSD_DAT_SEC2),HL LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора - LD HL,0 + ; D = 0 + LD H,D + LD L,D LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A - LD A,L + XOR A .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,0 @@ -599,11 +610,14 @@ READ_BPB: JR NZ,.NEXT_ADD3 LD (SYS_PAGE.CLASTER_LEN),HL - LD B,0 + ; D = 0 + LD B,D LD C,A LD (SYS_PAGE.CLASTER_LEN2),BC - LD HL,0 + ; D = 0 + LD H,D + LD L,D LD BC,(SYS_PAGE.MS_BPB+S_P_T) LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР @@ -627,6 +641,7 @@ READ_BPB: .ERROR_MSDOS: LD HL,MSG_3 JP AUTO_03E4 + ; .FAT1_MSG: DB 'FAT1' ;******************************************** @@ -759,7 +774,8 @@ NO_ADD: POP DE POP HL RET - ;******************************************* - +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_S.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 356e45d..73ea1d2 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,19 +1,16 @@ -; +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + DEFINE NEW_RAMDRV_READ 1 - DISK_REDIR: - PUSH HL + ;PUSH HL PUSH BC - LD A,(ZX_VARS.OPER_DISK) - AND 3 - LD C,BIOS.GET_DRV_ST + LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; POP BC - POP HL + ;POP HL RET R_W_REDIR: @@ -550,41 +547,6 @@ READ_WRITE_RAMD: ; A = RAM Block ID EX AF,AF' ; - ;POP DE - ; POP BC - ; PUSH BC -; ; !TEST накручиваем счётчик r/w секторов -; LD HL,(ZX_VARS.CONT_SEC) -; LD D,H -; LD E,L -; ;!TODO переделать эту тупость на математику -; LD A,16 -; .loop: INC L -; CP L -; JR NZ,.skip -; INC H -; LD L,0 -; .skip: DJNZ .loop -; ; сохраняем накрученный счётчик -; LD (ZX_VARS.CONT_SEC),HL -; ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ -; LD A,D -; RRCA -; RRCA -; RRCA -; RRCA -; LD D,A -; AND #F0 -; OR E -; LD E,A -; LD A,D -; AND #0F -; LD D,A -; ; - ; POP BC - ; PUSH BC - - POP HL ; Get command r/w LD A,(ZX_VARS.RD_WR_COM) @@ -630,3 +592,6 @@ READ_WRITE_RAMD: ENDIF ;*********************************************************************** +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_RMD_S.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/boot_trd.asm b/TRDOS/boot_trd.asm new file mode 100644 index 0000000..c4b5a5d --- /dev/null +++ b/TRDOS/boot_trd.asm @@ -0,0 +1,618 @@ +/* +BOOTER +;выполнялка ком."8" +;вместо #29AE + LD BC,#F4FF + RST #20 + DW #1EAF ;CLEAR_RUN + ; + LD A,1 + RST #20 + DW #229B ;border и 23624 + ; + DI + LD HL,bootkus1 ;#E00 + LD DE,#F500 + LD BC,bootln1 ;#1F5 + PUSH DE + LDIR + LD HL,bootkus2 ;#344D + LD BC,bootln2+1 ;#334 + LDIR + SET 3,(IY+#01) + RET +*/ + + + + + org 0 + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/sp2000.inc' + INCLUDE 'inc/rom_routines.inc' + + +bootkus1: DISP #F500 + DI ;его и #344D копирует #3AE7 + PUSH AF + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH HL + LD HL,(ZX_VARS.ERR_SP) + LD (.ERR_SP),HL + LD A,(ZX_VARS.CONT_DISK) + LD (ZX_VARS.OPER_DISK),A + ADD A,#3C + LD (ZX_VARS.PDOS_COPY),A + LD HL,#3C00 + LD DE,#8000 + PUSH DE + LD (ZX_VARS.ZG),DE + LD BC,#0400 + LDIR + LD (IY+#47),#00 + POP HL + LD BC,#0080 +.big_loop: PUSH BC + INC HL + INC HL + INC HL + LD B,#03 +.loop1: LD D,(HL) + LD A,D + RLA + OR D + LD (HL),A + INC HL + DJNZ .loop1 + POP BC + DEC BC + INC HL + INC HL + LD A,B + OR C + JR NZ,.big_loop + XOR A + OUT (BorderColor),A + LD A,#44 + LD (ZX_VARS.BORDER),A + DEC A + DEC A + LD (ZX_VARS.ATTR_P),A + CALL ROUTINE.cls +.loop2: DI + XOR A + LD (VAR_1),A +.var_3+1: LD HL,LL3761 + PUSH HL + LD (ZX_VARS.ERR_SP),SP + LD (IY+#00),#FF + LD A,(ZX_VARS.CONT_DISK) + LD C,#01 + CALL #3D13 + LD HL,#9000 + LD DE,#0000 + LD BC,#0805 + CALL #3D13 + LD A,(IY+#00) + CP #FF + JR NZ,.loop2 + LD HL,.loop2 + LD (.var_3),HL + EXX + LD DE,#A000 + EXX + LD HL,#9000 + LD DE,#0008 + LD A,(HL) + OR A + JP Z,LF887 +.loop3: LD DE,#0008 + ADD HL,DE + LD A,(HL) + CP #42 + CALL Z,LF836 + ADD HL,DE + LD A,(HL) + OR A + JR NZ,.loop3 + LD A,(VAR_1) + OR A + JP Z,LF887 + LD B,#3F + SBC A,B + JP NC,LF8A6 + LD A,(VAR_1) + DEC A + LD (#F86F),A + CALL #F9BB + LD (#F653),A + CALL #0D6B + DI + CALL #F870 + LD A,#02 + CALL #F8CB + LD A,#02 + CALL #1601 + LD (IY+#47),#00 + LD DE,#A000 + LD HL,#0008 +.loop4: LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#06 + RST #10 + JR .loop4 + ; +.ERR_SP: WORD 0 + NOP +LL0f35 LD HL,#5802 + CALL #F816 + LD DE,#000A + LD IX,#F634 + LD (IX+#00),#00 +LL0f46 EI + RES 5,(IY+#01) + HALT + PUSH HL + PUSH IX + CALL #F9BB + CP #40 + JP NZ,#F792 + CALL #F989 + POP IX + POP HL + BIT 5,(IY+#01) + JR Z,LL0f46 + LD A,(#5C08) + CP 8 + JP Z,#F6ED + CP "o" + JR Z,LL0fed + CP "6" + JR Z,LL0fed + CP 9 + JP Z,#F70C + CP "p" + JP Z,#F70C + CP "7" + JP Z,#F70C + CP 11 + JP Z,#F72E + CP "q" + JP Z,#F72E + CP "9" + JP Z,#F72E + CP 10 + JP Z,#F764 + CP "a" + JP Z,#F764 + CP "8" + JP Z,#F764 + CP "d" + JP Z,#FA1B + CP "1" + JR Z,LL0fd0 + CP "2" + JR Z,LL0fd0 + CP "3" + JR Z,LL0fd0 + CP "4" + JR Z,LL0fd0 + PUSH AF + LD A,#FE + IN A,(#FE) + RRA + JR NC,LL0f46 + POP AF + CP 13 + JP Z,#F79D + CP "0" + JP Z,#F79D + CP 32 + JP Z,#F79D + JP #F646 +LL0fd0 PUSH AF + CALL #0D6B + LD A,#03 + CALL #F8CB + POP AF + SUB #31 + LD C,#01 + LD (#5CF8),A + LD (#5CF9),A + LD (ZX_VARS.CONT_DISK),A + CALL #3D13 + JP #F556 +LL0fed CALL #F870 + CALL #F826 + DEC (IX) + +bootst2 +bootln1 = $-bootkus1 + + LD A,(IX+#00) + CP #FF + JR NZ,LL345b + LD A,(#F86F) + LD (IX+#00),A +LL345b CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + INC (IX+#00) + LD A,(#F86F) + INC A + CP (IX+#00) + LD A,(IX+#00) + JR NZ,LL347d + XOR A + LD (IX+#00),A +LL347d CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + DEC (IX+#00) + DEC (IX+#00) + DEC (IX+#00) + BIT 7,(IX+#00) + LD A,(IX+#00) + JR Z,LL34b3 +LL349e LD B,#03 + ADD A,B + LD B,A + PUSH BC + LD A,(#F86F) + SUB B + JR C,LL34ac + POP AF + JR LL349e +LL34ac POP AF + DEC A + DEC A + DEC A + LD (IX+#00),A +LL34b3 CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + INC (IX+#00) + INC (IX+#00) + INC (IX+#00) + LD A,(#F86F) + SBC A,(IX+#00) + LD A,(IX+#00) + JR NC,LL34e1 + LD B,#03 +LL34d8 SUB B + JR NC,LL34d8 + INC A + INC A + INC A + LD (IX+#00),A +LL34e1 CALL #F7FA + CALL #F816 + JP #F646 + CALL #0D6B + LD A,#03 + CALL #F8CB + JP #F556 + LD BC,#FFFD + LD A,#07 + OUT (C),A + LD B,#BF + LD A,#FF + OUT (C),A ;глушит AY + CALL #F870 + LD A,#07 + LD (#5C48),A + LD (#5C8D),A + CPL + LD (#5D3B),A + LD HL,#3C00 + LD (#5C36),HL + LD L,(IX+#00) + LD H,#00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD DE,#A000 + ADD HL,DE + LD DE,#F7F0 + LD BC,#0008 + LDIR + LD HL,(#F632) + LD (ZX_VARS.ERR_SP),HL + LD HL,#F7EC + LD (#5C5D),HL + CALL #0D6B + DI + POP HL + EXX + POP BC + POP DE + POP HL + POP AF + CALL #3D03 + JP PE,#F73A + LD (#6F62),HL + LD L,A + LD (HL),H + JR NZ,LL356e + JR NZ,LL3570 + LD (#D50D),HL + INC A + LD HL,#5802 + LD DE,#000A +LL355a DEC A + JR Z,LL356c + ADD HL,DE + DEC A + JR Z,LL356c + ADD HL,DE + DEC A + JR Z,LL356c + INC DE + INC DE + ADD HL,DE + DEC DE + DEC DE + JR LL355a +LL356c POP DE + RET +LL356e PUSH HL + EXX +LL3570 POP HL + LD A,#70 + PUSH HL + POP DE + INC DE + LD BC,#0007 + LD (HL),A + LDIR + EXX + RET + PUSH HL + EXX + POP HL + LD A,#42 + PUSH HL + POP DE + INC DE + LD BC,#0007 + LD (HL),A + LDIR + EXX + RET + ; +LF836: PUSH HL + PUSH DE + SBC HL,DE + LD A,(HL) + LD B,#20 + SBC A,B + JR C,LL35c3 + LD IX,#F981 + PUSH HL + LD BC,#0800 +LL35a0 LD A,(HL) + CP (IX+#00) + JR NZ,LL35a7 + INC C +LL35a7 INC HL + INC IX + DJNZ LL35a0 + LD A,C + CP #08 + JR NZ,LL35b4 + POP HL + JR LL35c3 +LL35b4 EXX + POP HL + LD BC,#0008 + LDIR + EXX + LD A,(VAR_1) + INC A + LD (VAR_1),A +LL35c3 POP DE + POP HL + RET + + +VAR_1: DB 0 +VAR_2: DB 0 + + + PUSH AF + PUSH BC + LD B,#D2 +LL35cc PUSH BC + XOR A + OUT (#FE),A + RR B +LL35d2 DJNZ LL35d2 + SET 4,A + OUT (#FE),A + POP BC + DEC B + DJNZ LL35cc + POP BC + POP AF + RET + ; +LF887: XOR A + CP (IY+#47) + JP NZ,#F556 + CALL #0D6E + LD A,#02 + CALL #1601 + XOR A + CALL #F8CB + LD A,#01 + CALL #1601 + LD (IY+#47),#FE + JP #F795 + ; +LF8A6: XOR A + CP (IY+#47) + JP NZ,#F556 + CALL #0D6E + LD A,#02 + CALL #1601 + LD A,#01 + CALL #F8CB + LD A,#3F + LD (VAR_1),A + LD BC,#FFFF +LL361a NOP + DJNZ LL361a + DEC C + JR NZ,LL361a + JP #F5B4 + LD DE,#F8D1 + JP #0C0A + + DB #80 + DB #16,#0A,#05 + DB "!!! NO PROGRAMS !!!" + DB (" "+#80) + + DB #16,#0A,#03,#10,#04 + DB "MORE THAN 63 BASIC FILES" ;than!!! + + DB (" "+#80) + + DB #11,#00,#10,#04,#13,#01 + DB " -=New ROM boot v1.06=-" + DB #06 + DB "Remix by CompoWellcome 05.02.99" + DB ("."+#80) + + DB #10,#02,#13,#01 + DB " INSERT NEW DISK" + DB #06 + DB " FOR READING CATALOGUE." ;catalogue! + + DB (" "+#80) + + DB "boot " + + LD HL,#5AE1 + PUSH HL + POP DE + DEC DE + LD BC,#001F + LDIR + LD HL,#5AFF + LD A,(#F9BA) + OR A + JR Z,LL3703 + LD A,(HL) + AND #07 + INC A + CP #08 + JR NZ,LL3710 + XOR A + LD (#F9BA),A + LD A,#07 +LL3703 LD A,(HL) + AND #07 + DEC A + OR A + JR NZ,LL3710 + CPL + LD (#F9BA),A + LD A,#01 +LL3710 LD (HL),A + RET +LL3712 NOP + LD A,#C3 + LD (#5CC2),A + LD HL,#F9E6 + LD (#5CC3),HL + LD IX,#2FC1 + CALL #FA20 + LD A,#08 + LD C,#1F + LD IX,#2A53 + CALL #FA20 + LD (#F9E7),SP + LD DE,#0000 + LD IX,#2740 + CALL #FA20 + LD SP,#0000 + LD IX,#1FF3 + CALL #FA20 + LD IX,#1FEB + CALL #FA20 + LD IX,#2FC1 + CALL #FA20 + LD A,#C9 + LD (#5CC2),A + LD A,(#5CCD) + AND #40 + RET +LL3761 LD A,#30 + INC A + CP #33 + LD (#FA0A),A + JP NZ,#F6D0 + LD A,#30 + LD (#FA0A),A + JR LL3761 + DI + LD IX,#0000 + PUSH IX + JP #3D2F + + BLOCK 3,#FF + + ENT From b757fbf8ec42602053f702f0f81364fbf408e5bd Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 19 Jul 2024 04:42:50 +1000 Subject: [PATCH 064/114] support for current dir from spectrum.exe --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 76 +++++++++++++++++++--------------------------- TRDOS/TR_MSD_2.ASZ | 7 +++-- TRDOS/TR_MSD_3.ASZ | 1 - TRDOS/TR_MSD_S.ASZ | 31 ++++++++----------- 5 files changed, 50 insertions(+), 67 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 77a5168..7e812bc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 77a51684d4d63ad2fdccf416793951df00276b17 +Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 8dc2742..e953485 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -78,27 +78,32 @@ HDD_SET:;!TEST LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,(SYS_PAGE.CURRENT_DIR_HDD) + LD E,DRIVE_CODES.TRDOS.HDD + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE_COPY) CP #FF JR Z,.skip + ; + CP E + JR C,.skip + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + ; + AND #0F LD (SYS_PAGE.CURRENT_HDD),A ; -.skip: ;LD A,(SYS_PAGE.CURRENT_HDD) - OR #40 - PUSH AF - LD A,C +.skip: LD A,C OUT (SLOT3),A ; + PUSH DE LD C,BIOS.HDD_INIT CALL EXP_FNS - POP AF + POP DE JP C,HDD_PROG_E ; ; LD BC,(ZX_VARS.OPER_DISK - 1) ; LD A,(ZX_VARS.OPER_DISK) ; LD B,A ; XOR A - LD E,A + ;LD E,A LD C,BIOS.SET_DISK_REDIR JP EXP_FNS @@ -138,9 +143,22 @@ CHOOSE_HDD: POP BC JR C,.error ; - SCF - ;CALL CORRECT_CUR_DIR - CALL RESTORE_CURRENT_DIR + ; + ;CALL RESTORE_CURRENT_DIR + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE) + CP #FF + JR Z,.skip + LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A + XOR A + DEC A + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A +.skip: EX AF,AF' + OUT (SLOT3),A + ; ; XOR A LD C,A ; обнулить C @@ -189,19 +207,15 @@ CHOOSE_HDD: ; !!! -; CF=1: skip resest CURRENT_HDD -; CF=0: resest CURRENT_HDD - - ; [x] new tr-hdd RESTORE_CURRENT_DIR: PUSH AF ; LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - CP #40 - JR C,.exit_Res_Dir - AND #0F + ;CP #40 + ;JR C,.exit_Res_Dir + ;AND #0F LD H,A ; IN A,(SLOT3) @@ -209,7 +223,7 @@ RESTORE_CURRENT_DIR: LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,(SYS_PAGE.CURRENT_DIR_HDD) + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE) CP H JR NZ,.exit_Res_Dir @@ -229,32 +243,6 @@ RESTORE_CURRENT_DIR: POP AF RET ; - - -; [x] new tr-hdd -; TO INIT by SPECTRUM.EXE: -; .CURRENT_DIR_SEC_L EQU #C196 ; word -; .CURRENT_DIR_SEC_H EQU #C198 ; word -; .CURRENT_DIR_HDD EQU #C19A -; .CURRENT_HDD EQU #C12D - -; CORRECT_CUR_DIR: -; DI -; IN A,(SLOT3) -; LD C,A -; LD A,SYS_PAGE -; OUT (SLOT3),A -; LD A,#FF -; JR C,.skip -; LD (SYS_PAGE.CURRENT_HDD),A -; .skip: INC A -; LD H,A -; LD L,A -; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL -; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL -; LD A,C -; OUT (SLOT3),A -; RET ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 119dcea..2798900 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -530,9 +530,10 @@ CALC_CLAST: ; HL - EX DE,HL LD BC,0 - - LD HL,0 - LD IX,0 + LD H,B + LD L,B + LD HX,B + LD LX,B CALC_CL_LP: ADD IX,DE diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index f4a9407..bb2e306 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -319,7 +319,6 @@ CLAST_TO_SEC_L2: LD B,L LD A,H POP HL - RET diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 663be83..c51e05b 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -247,7 +247,7 @@ MSD_3F15: OUT (SLOT3),A AND A JR Z,NO_OFF_SCR - LD A,0C0H + LD A,#C0 OUT (RGADR),A NO_OFF_SCR: LD IX,MSD_RET_ADR @@ -443,7 +443,6 @@ READ_BPB: JP .ERROR_MSDOS ; .HDD: CALL .MAIN - CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC ; old hdd LD IX,0 @@ -455,14 +454,13 @@ READ_BPB: CALL MSD_R_W_UT ; CALL .PARAMS - CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC JP .ERROR_MSDOS ; -.MAIN: LD A,SYS_PAGE - LD HL,SYS_PAGE.MS_BPB - LD C,TRDOS_ROM_CMD.READ_BPB - CALL MSD_R_W_UT +.MAIN: LD A,SYS_PAGE + LD HL,SYS_PAGE.MS_BPB + LD C,TRDOS_ROM_CMD.READ_BPB + CALL MSD_R_W_UT ;CALL BPB_PARAMS ;RET @@ -528,7 +526,6 @@ READ_BPB: LD (SYS_PAGE.MSD_SECS),A ; BIT 7,H - ; LD IX,0 ; LD HL,0 ; вычислить начальный сектор FAT ; JR Z,.NO_LD_SPECIAL @@ -559,8 +556,6 @@ READ_BPB: LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR - ; A=0 - LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора LD A,B RL C @@ -600,24 +595,23 @@ READ_BPB: ; D = 0 LD H,D LD L,D + LD E,D LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A XOR A .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера - ADC A,0 + ADC A,E DEC D JR NZ,.NEXT_ADD3 LD (SYS_PAGE.CLASTER_LEN),HL - ; D = 0 - LD B,D + LD B,E LD C,A LD (SYS_PAGE.CLASTER_LEN2),BC - - ; D = 0 - LD H,D - LD L,D + ; + ; DE=0 + EX DE,HL ;LD HL,0 LD BC,(SYS_PAGE.MS_BPB+S_P_T) LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР @@ -628,8 +622,9 @@ READ_BPB: ; EX AF,AF' OUT (SLOT3),A - EI + CALL RESTORE_CURRENT_DIR ; [x] new tr-hdd AND A + EI RET .ERROR_BPB: EX AF,AF' From 433f4b32a9e3b9fbb62c4f50a06b44b84b5c2287 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 21 Jul 2024 01:15:33 +1000 Subject: [PATCH 065/114] ... --- SP_TRDOS.ASM | 25 ++++++++++--------------- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 6 +++--- TRDOS/TR_MSD_2.ASZ | 18 +++++++++++++++--- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index a46e3f2..d18c351 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -7063,27 +7063,22 @@ AUTO_3FEC: ;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- _mInfoBLOCK #3FF0-$, #FF -HD_CMD: PUSH AF - DI - LD A,SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A - POP AF - RET +HD_CMD: PUSH AF + DI + LD A,SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + POP AF + RET ;--------------------------------------- ; ;----[ From TR-DOS to API #80..#FF]----- _mInfoBLOCK #3FF8-$, #FF -EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;PUSH AF - ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать - ;XOR A ; SYS_PORT.BIOS - JP EXP_FNS_PREPARE +EXP_FNS: JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: - ; - OUT (SYS_PORT.ROM),A - POP AF - RET + OUT (SYS_PORT.ROM),A + POP AF + RET ;--------------------------------------- ; diff --git a/Shared_Includes b/Shared_Includes index 7e812bc..1799727 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 +Subproject commit 17997278e4aea455a68532547beb561fd216ad19 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index e953485..8624673 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -160,11 +160,11 @@ CHOOSE_HDD: OUT (SLOT3),A ; ; - XOR A - LD C,A ; обнулить C + ;XOR A + LD C,0 ; обнулить C LD A,B ;OR #40 - LD B,A + ;LD B,A ; ; PUSH AF ; LD A,(ZX_VARS.OPER_DISK) diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 2798900..9f5dbc3 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -323,11 +323,23 @@ END_TAB: LD (ZX_VARS.CONT_DISK),A LD B,A LD A,(ZX_VARS.PDOS_COPY) - AND 7CH + AND #7C OR B LD (ZX_VARS.PDOS_COPY),A OUT (FDC_93.DrvCTRL),A - JP AUTO_03E1 + ; [ ] 19/07/2024 на каждый диск трдос свой раздел hdd можно замапить + LD C,BIOS.GET_DISK_REDIR + CALL EXP_FNS + CP #40 + JR C,.exit + ; + AND #0F + LD C,BIOS.HDD_PART + CALL EXP_FNS + ;LD HL,MSG_3 + ;CALL C,AUTO_03C3 + ; +.exit: JP AUTO_03E1 END_TAB2: SUB 4 @@ -626,7 +638,7 @@ SPR_1: LD A,(DE) RET NZ LD C,BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) - CP #21 + CP " "+1 CCF RET C CALL EXP_FNS From 12e4d658c155553699885dcb6e25c87d65c1d8c2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 21 Jul 2024 01:18:02 +1000 Subject: [PATCH 066/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 1799727..93ab939 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 17997278e4aea455a68532547beb561fd216ad19 +Subproject commit 93ab93917db326a86a0ffecc02a62f6f6ef7a938 From 7c6a680d636bf03f86b3ecbaacdc258e15b8cccd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 6 Jan 2024 02:57:48 +1000 Subject: [PATCH 067/114] =?UTF-8?q?=D0=A1=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D0=B2=D0=BE=D1=81=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=B2?= =?UTF-8?q?=20EXP=5FFNS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 40 ++++++++++++++++++++++++++++++++++--- TRDOS/TR_MSD_2.ASZ | 8 ++++++-- TRDOS/TR_MSD_3.ASZ | 14 +++++++------ TRDOS/TR_MSD_S.ASZ | 2 +- TRDOS/TR_RMD_S.ASZ | 50 ++++++++++++++++++++++++++++++++-------------- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b3a35f6..a8903e1 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6447,6 +6447,36 @@ PRINT_RED: POP BC POP HL RET +;******************************* + + +;******************************* +;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то +EXP_FNS_PREPARE: + PUSH HL + PUSH AF + LD A,R + DI + PUSH AF + POP HL + POP AF + EX (SP),HL + CALL EXP_FNS_PREPARE_EXIT + EX (SP),HL + PUSH AF + LD A,L + AND 4 + JR Z,.no_EI + EI +.no_EI: POP AF + POP HL + RET +EXP_FNS_PREPARE_EXIT: + PUSH AF + XOR A + JP EXP_FNS_PREPARE_RET +;******************************* + ;******************************* BLOCK #3CC0 - $,255 @@ -7016,9 +7046,13 @@ HD_CMD: PUSH AF ;----[ From API #80..#FF to TR-DOS ]----- BLOCK #3FF8-$, #FF EXP_FNS: - PUSH AF - DI - XOR A ; D_ROM16OFF + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;PUSH AF + ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать + ;XOR A ; D_ROM16OFF + JP EXP_FNS_PREPARE +EXP_FNS_PREPARE_RET: + ; OUT (SYS_PORT_ON),A POP AF RET diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 88e5175..141ddec 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -570,7 +570,9 @@ AY8910: LD A,#EA LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; CALL AUTO_1D97 AND A RET @@ -592,7 +594,9 @@ SP_1: LD A,(DE) CCF RET C CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; CALL AUTO_1D97 AND A RET diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 57179c7..c524135 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,9 +1,13 @@ INIT_RMD: LD C,#9F ;!HARDCODE BIOS.FullInit - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; + ; DI ; LD C,PAGE3 @@ -220,9 +224,7 @@ CONT_XX1: ADD A,A INC A - LOOP_128: - PUSH AF PUSH DE PUSH IX @@ -271,7 +273,7 @@ MADE_next_blk: CALL EXP_FNS POP BC INC L ; SET ZF, if END BLK !!! - LD HL,0C000H + LD HL,#C000 RET ;***************************************** diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 5dc90dd..2ee025a 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -431,7 +431,7 @@ READ_BPB: RET NC .SPACIAL: LD IX,0 - LD DE,63 + LD DE,63 ;!HARDCODE LD A,SYS_PAGE LD HL,MS_BPB LD C,BIOS.HDD_READ and #BF diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index e213620..d34babd 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,3 +1,4 @@ +; DISK_REDIR: PUSH HL PUSH BC @@ -5,7 +6,9 @@ DISK_REDIR: AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP BC POP HL RET @@ -42,7 +45,9 @@ TEST_RAMD: PUSH HL LD C,#CE ;!HARDCODE BIOS.GET_RAMD_ST CALL EXP_FNS - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP HL RET @@ -273,11 +278,13 @@ PAGE_CALC2: AND #0F LD D,A PUSH HL - LD C,#98 ;!HARDCODE BIOS.RAMD_CALC_PAGE + LD C,BIOS.RAMD_CALC_PAGE CALL DISK_REDIR SUB 4 CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; LD B,A LD C,H POP HL @@ -394,7 +401,9 @@ CLEAR_RMD_A: PUSH BC LD C,#93 ;!HARDCODE BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; POP BC POP DE POP HL @@ -405,7 +414,9 @@ GET_RMD_A: GET_RAM_BLK: ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk LD C,#92 ;!HARDCODE BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока - EI + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; RET NC NO_MEM: LD HL,NO_MEMORY @@ -420,9 +431,12 @@ FDD_SET: LD A,(OPER_DISK) LD B,A LD C,#CC ;!HARDCODE BIOS.FDD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; HDD_SET: LD C,BIOS.HDD_INIT and #BF @@ -433,9 +447,12 @@ HDD_SET: LD B,A LD A,0 LD C,#CD ;!HARDCODE BIOS.HDD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; RAMD_SET: CALL RAMD_SYM @@ -446,9 +463,12 @@ RAMD_SET1: LD B,A POP AF LD C,#CB ;!HARDCODE BIOS.RAMD_TO_DRV - CALL EXP_FNS - EI - RET + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; RAMD_SYM: LD A,(DE) From d9d14974c03bb18b19d78b43e584700f228556e7 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 26 Jan 2024 00:54:43 +1000 Subject: [PATCH 068/114] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?HD=5FCMD=20=D0=BD=D0=B0=20EXP=5FFNS=20=D0=B2=20TRDOS.=20=D0=9C?= =?UTF-8?q?=D0=B5=D0=BB=D0=BA=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 336 ++++++++++++++++++++++++++------------------- SP__48.ASM | 5 +- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 90 ++++++------ TRDOS/TR_MSD_3.ASZ | 75 +++++----- TRDOS/TR_MSD_S.ASZ | 76 +++++----- TRDOS/TR_RMD_S.ASZ | 80 +++++++++-- 7 files changed, 396 insertions(+), 268 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index a8903e1..e81b60c 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -12,74 +12,87 @@ INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' -;*************************************** -;CNF_PORT EQU #74 -AUTO_4000 EQU 04000H -AUTO_4010 EQU 04010H -AUTO_4011 EQU 04011H -AUTO_4020 EQU 04020H -AUTO_4080 EQU 04080H -AUTO_40E1 EQU 040E1H -AUTO_40E3 EQU 040E3H -AUTO_40E4 EQU 040E4H -AUTO_40E5 EQU 040E5H -AUTO_40F0 EQU 040F0H -AUTO_40F1 EQU 040F1H -AUTO_40FF EQU 040FFH -AUTO_4100 EQU 04100H -AUTO_4101 EQU 04101H -AUTO_4102 EQU 04102H -AUTO_4103 EQU 04103H -AUTO_4110 EQU 04110H -AUTO_4111 EQU 04111H -AUTO_4118 EQU 04118H -AUTO_4119 EQU 04119H -AUTO_411B EQU 0411BH -AUTO_411D EQU 0411DH -AUTO_411E EQU 0411EH -AUTO_4130 EQU 04130H -AUTO_4140 EQU 04140H -AUTO_41FF EQU 041FFH -AUTO_5220 EQU 05220H -AUTO_58E8 EQU 058E8H -AUTO_5E34 EQU 05E34H -AUTO_5F00 EQU 05F00H -AUTO_5F10 EQU 05F10H -AUTO_5F12 EQU 05F12H -AUTO_6000 EQU 06000H -PORT_128 EQU 07FFDH -AUTO_A1DB EQU 0A1DBH -AUTO_B0ED EQU 0B0EDH -AUTO_B8ED EQU 0B8EDH -AUTO_C000 EQU 0C000H -AUTO_C130 EQU 0C130H -AUTO_C308 EQU 0C308H -AUTO_C916 EQU 0C916H -AUTO_FE15 EQU 0FE15H -AUTO_FF00 EQU 0FF00H -AUTO_FFFF EQU 0FFFFH +TRDOS_ROM_CMD: +.READ_BPB EQU BIOS.HDD_READ_BPB and #BF +.READ EQU BIOS.HDD_READ and #BF +.WRITE EQU BIOS.HDD_WRITE and #BF +;*************************************** + + +;CNF_PORT EQU #74 +AUTO_4000 EQU #4000 +AUTO_4010 EQU #4010 +AUTO_4011 EQU #4011 +AUTO_4020 EQU #4020 +AUTO_4080 EQU #4080 +AUTO_40E1 EQU #40E1 +AUTO_40E3 EQU #40E3 +AUTO_40E4 EQU #40E4 +AUTO_40E5 EQU #40E5 +AUTO_40F0 EQU #40F0 +AUTO_40F1 EQU #40F1 +AUTO_40FF EQU #40FF +AUTO_4100 EQU #4100 +AUTO_4101 EQU #4101 +AUTO_4102 EQU #4102 +AUTO_4103 EQU #4103 +AUTO_4110 EQU #4110 +AUTO_4111 EQU #4111 +AUTO_4118 EQU #4118 +AUTO_4119 EQU #4119 +AUTO_411B EQU #411B +AUTO_411D EQU #411D +AUTO_411E EQU #411E +AUTO_4130 EQU #4130 +AUTO_4140 EQU #4140 +AUTO_41FF EQU #41FF +AUTO_5220 EQU #5220 +AUTO_58E8 EQU #58E8 + +AUTO_5E34 EQU #5E34 +AUTO_5F00 EQU #5F00 +AUTO_5F10 EQU #5F10 +AUTO_5F12 EQU #5F12 +AUTO_6000 EQU #6000 +PORT_128 EQU #7FFD +AUTO_A1DB EQU #A1DB +AUTO_B0ED EQU #B0ED +AUTO_B8ED EQU #B8ED +AUTO_C000 EQU #C000 +AUTO_C130 EQU #C130 +AUTO_C308 EQU #C308 +AUTO_C916 EQU #C916 +AUTO_FE15 EQU #FE15 +AUTO_FF00 EQU #FF00 +AUTO_FFFF EQU #FFFF ;**************************************** DISPLAY "Start." -START: - DI - LD DE,0FFFFh +START: DI + LD DE,#FFFF LD A,7 JR CONT_1 RST08: NOP CONT_1: - OUT (0FEH),A + OUT (#FE),A LD A,'?' JR CONT_2 - NOP + +//////////////////////////////////////////////////////////////////////// + BLOCK #10-$,0 RST10: JP PRINT_SYM +//////////////////////////////////////////////////////////////////////// + CONT_2: LD I,A JP CONT_3 + +//////////////////////////////////////////////////////////////////////// + BLOCK #18-$,0 PRINT_LN: JP PRINT_L CONT_3: @@ -88,32 +101,39 @@ CONT_3: NOP AUTO_001E: JR CONT_4 + +//////////////////////////////////////////////////////////////////////// + BLOCK #20-$,0 RST20: JP RST20_EXE RET +//////////////////////////////////////////////////////////////////////// + CONT_4: LD H,D LD L,E JR CONT_5 + +//////////////////////////////////////////////////////////////////////// + BLOCK #28-$,0 RST28: JP RST28_EXE +//////////////////////////////////////////////////////////////////////// + CONT_5: LD (HL),2 DEC HL CP H JR NZ,CONT_5 JR CONT_6 + +//////////////////////////////////////////////////////////////////////// REDIR_RST38: + BLOCK #38-$,#FF ; JP RST38X ; EI ; RET - RST 38H - RST 38H - RST 38H - RST 38H - RST 38H -R38: - EI +R38: EI RET CONT_6: OR A @@ -128,25 +148,33 @@ CONT_6: CONT_7: DEC HL LD (P_RAMTOP),HL - LD DE,3EAFh - LD BC,00A8h + LD DE,#3EAF + LD BC,#00A8 LD A,E EX DE,HL - LD SP,6000h + LD SP,#6000 LD (AUTO_5F00),HL LD HL,RET_1 PUSH HL - LD HL,3D2Fh + LD HL,#3D2F PUSH HL - LD HL,0B8EDh + LD HL,#B8ED + +//////////////////////////////////////////////////////////////////////// + BLOCK #64-$,0 AUTO_0064: JR CONT_8 +//////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////// + BLOCK #66-$,0 ;********** MAGIC *********** ; JP MAGIC_1 ;AUTO_2A56 RETN NOP -;********************************* +//////////////////////////////////////////////////////////////////////// + CONT_8: LD (AUTO_5F10),HL PUSH AF @@ -567,6 +595,7 @@ AUTO_03CD: LD A,(MSG_FLAG) OR A CALL Z,PRINT_L +;!FIXIT Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. RET AUTO_03D9: LD HL,AUTO_2A28 @@ -597,9 +626,16 @@ RD_HEAD_DSK: LD A,(CODE_10H) CP 16 JR Z,AUTO_0415 - LD HL,DISK_ERROR_MSG - RST PRINT_LN - JR AUTO_03C0 + ;!TEST + ; Неправильно обрабатывалась ошибка. Программа не получала код + ; ошибки, а внизу экрана совершенно не к месту появлялся DISK ERROR. + ;LD HL,DISK_ERROR_MSG + ;RST PRINT_LN + ;JR AUTO_03C0 + LD HL,DISK_ERROR_MSG + JP RD_HEAD_DSK.FIXED + ; + AUTO_0415: CALL get_disk_type RES 0,(HL) @@ -659,8 +695,11 @@ AUTO_0479: PUSH AF CALL Z,AUTO_1D97 POP AF - CP 17 - JP NC,CMD_ERROR + ;!TEST + ;CP 17 + CP #10 + ; + JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 LD (DISK_1_FLG),A @@ -846,8 +885,10 @@ AUTO_05BD: AUTO_05CB: LD A,(FL_NAME) CP '*' - JP NZ,AUTO_03D9 - CALL BAS_2BF1 + ;JP NZ,AUTO_03D9 + JR Z,.next + RET +.next: CALL BAS_2BF1 EX DE,HL CALL SET_DRIVE LD A,(HL) @@ -876,7 +917,7 @@ AUTO_05F4: JR Z,AUTO_05F4 LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(DISK_2_FLG) CALL SET_DISK @@ -897,7 +938,7 @@ AUTO_063C: JP Z,AUTO_1C45 LD HL,VAR_2 LD DE,FL_START - LD BC,START+7 + LD BC,7 LDIR LD DE,(FL_SIZE) LD D,0 @@ -945,11 +986,15 @@ CMD_COPY: CALL AUTO_1CB0 LD A,(OPER_DISK) LD (DISK_1_FLG),A - JP NZ,AUTO_05CB + ;!TEST Ошибка!!! COPY "*","*" надо проверять всегда, иначе при + ; наличии на диске файла с именем "*" скопируется только этот файл + ;JP NZ,AUTO_05CB + CALL CMD_COPY.FIXED + ; CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR CALL AUTO_1CB0 PUSH AF @@ -987,7 +1032,7 @@ AUTO_0716: CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(DISK_2_FLG) CALL SET_DISK @@ -1378,7 +1423,7 @@ AUTO_11B0: ; CMD_LIST: CALL TEST_CR - LD BC,START+2 + LD BC,2 LD (MED_LEN),BC JR Z,AUTO_1205 CP '#' @@ -1438,7 +1483,7 @@ AUTO_123E: CALL PRINT_SYM CALL PRINT_CR LD HL,(VAR_1) - LD BC,START+3 + LD BC,3 ADD HL,BC LD A,(HL) LD HL,(VAR_1) @@ -1450,7 +1495,7 @@ AUTO_123E: LD HL,AUTO_10AA RST PRINT_LN LD HL,(VAR_1) - LD BC,START+2 + LD BC,2 ADD HL,BC LD A,(HL) LD HL,AUTO_10CE @@ -1474,7 +1519,7 @@ AUTO_1292: LD HL,AUTO_111E RST PRINT_LN LD HL,(VAR_1) - LD BC,START+4 + LD BC,4 ADD HL,BC LD C,(HL) INC HL @@ -1551,7 +1596,7 @@ AUTO_1303: CALL PRINT_CR JP AUTO_123E AUTO_131B: - LD BC,START+5 + LD BC,5 ADD HL,BC LD B,(HL) INC HL @@ -1638,7 +1683,7 @@ AUTO_13B7: CALL AUTO_165D LD HL,FL_START LD DE,VAR_2 - LD BC,START+7 + LD BC,7 LDIR LD A,(VAR_2_0) LD (ERR_3D00),A @@ -1679,7 +1724,7 @@ AUTO_1403: JP Z,AUTO_2723 LD HL,VAR_2 LD DE,FL_START - LD BC,START+7 + LD BC,7 LDIR CALL AUTO_03FD LD A,(ERR_3D00) @@ -1839,7 +1884,7 @@ AUTO_1575: SBC HL,BC LD (FL_TYPE),HL LD (FL_N_2),HL - LD HL,START + LD HL,0 LD (FL_N_4),HL LD (FL_N_6),HL CALL AUTO_15B8 @@ -1890,7 +1935,7 @@ AUTO_15DB: POP BC JP NC,AUTO_1644 LD BC,(FL_TYPE) - LD HL,START + LD HL,0 LD (FL_TYPE),HL AUTO_15F8: PUSH BC @@ -1976,6 +2021,7 @@ AUTO_168F: LD B,A LD C,0 RET + ; LD (MED_START),HL LD (MED_LEN),HL LD DE,(FL_SIZE) @@ -2001,7 +2047,7 @@ CMD_MOVE: SUB 9 LD (L_5D23),A LD HL,(FL_N_4) - LD DE,START + LD DE,0 LD B,9 CALL READ_DISK LD HL,(FL_N_4) @@ -2085,7 +2131,7 @@ CMD_MOVE: ADD HL,DE LD (HL),0 LD HL,(FL_N_4) - LD DE,START + LD DE,0 LD B,9 CALL WRITE_DISK LD A,(L_5D23) @@ -2469,11 +2515,11 @@ AUTO_1A01: LD DE,(FL_START) PUSH DE PUSH HL - LD HL,START + LD HL,0 LD A,(DISK_2_FLG) CP 255 JR Z,AUTO_1A20 - LD HL,START+5 + LD HL,5 AUTO_1A20: ADD HL,DE LD (MED_LEN),HL @@ -2586,7 +2632,7 @@ AUTO_1AC4: ; CMD_SAVE: CALL AUTO_1852 - LD HL,START + LD HL,0 LD (AUTO_5CD1),HL CALL INPUT_TXT CALL AUTO_1D8C @@ -2734,7 +2780,7 @@ AUTO_1BDE: AUTO_1BFC: CALL AUTO_1C1B RET NC - LD HL,START + LD HL,0 LD (DOS_CH_ADR),HL LD A,(DISK_2_FLG) CP 255 @@ -3121,8 +3167,8 @@ AUTO_1E67: LD (CONT_SEC),DE JP R_W_REDIR - LD (HL),30 ; НЕ исп. !!! - + ;LD (HL),30 ; НЕ исп. !!! + BLOCK #1E70-$,0 AUTO_1E70: POP HL POP BC @@ -3182,7 +3228,7 @@ AUTO_1EBC: ; ; CMD_FORMAT: - LD HL,START + LD HL,0 LD (MED_START),HL LD (DOS_CH_ADR),HL LD (AUTO_5CD1),HL @@ -3711,7 +3757,7 @@ AUTO_229A: LD (DOS_CH_ADR),HL CALL AUTO_1AC4 CALL AUTO_1B59 - LD HL,START + LD HL,0 LD (FL_LEN),HL CALL AUTO_166B JP AUTO_1E43 @@ -4127,7 +4173,7 @@ AUTO_2504: RST RST28 LD B,(HL) XOR A - LD HL,START + LD HL,0 LD (MED_LEN),HL AUTO_2538: ADD HL,DE @@ -4455,8 +4501,8 @@ AUTO_276B: AUTO_2779: DB "BACKUP DISK",141 AUTO_2785: - DB "Insert Destination disk",13,"then " - DB "press Y",0 + DB "Insert Destination disk",13 + DB "then press Y",0 AUTO_27AA: DB "Insert Source disk then press Y",0 AUTO_27CA: @@ -4469,13 +4515,16 @@ AUTO_27ED: DB "Directory full",141 AUTO_27FC: DB "No disk",141 - DISPLAY "10k" + + DISPLAY "10k" + AUTO_2804: DB "Stream opened",141 AUTO_2812: DB "Not disk file",141 AUTO_2820: - DB "File exists",13,"Over write?(Y/N",169 + DB "File exists",13 + DC "Over write?(Y/N)" AUTO_283C: PUSH AF PUSH BC @@ -4489,7 +4538,7 @@ AUTO_283C: POP AF LD HL,AUTO_0201 LD (ADR_RET),HL - LD HL,START + LD HL,0 ADD HL,SP LD (DOS_SP),HL DEC HL @@ -4711,34 +4760,20 @@ CMD_80: LD A,#80 ; ; ; ;Адрес #29B2. Тексты сообщений TR-DOS. -AUTO_29B2: - DB 13,"*ERROR*",141 -AUTO_29BB: - DB 13,"No space",141 -AUTO_29C5: - DB 13,"File exists",141 -AUTO_29D2: - DB " Free",141 -READ_ONLY_MSG: - DB 13,"Read Onl",249 -DISK_ERROR_MSG: - DB 13,"Disc Erro",242 -AUTO_29ED: - DB 13,"Rec. O/",198 -AUTO_29F7: - DB "Title:",160 -AUTO_29FE: - DB 13,"Retry,Abort,Ignore?",0 -AUTO_2A13: - DB 13,"Trk",160 -AUTO_2A18: - DB " sec",160 -AUTO_2A1D: - DB " Del. File",141 -AUTO_2A28: - DB 13,"No" -AUTO_2A2B: - DB " File(s)",141,0 +AUTO_29B2: DB 13, "*ERROR*", 141 +AUTO_29BB: DB 13, "No space", 141 +AUTO_29C5: DB 13, "File exists", 141 +AUTO_29D2: DB " Free", 141 +READ_ONLY_MSG: DC 13, "Read Only" +DISK_ERROR_MSG: DC 13, "Disk Error" +AUTO_29ED: DC 13, "Rec. O/F" +AUTO_29F7: DC "Title: " +AUTO_29FE: DZ 13, "Retry,Abort,Ignore?" +AUTO_2A13: DC 13, "Trk " +AUTO_2A18: DC " sec " +AUTO_2A1D: DB " Del. File", 141 +AUTO_2A28: DB 13, "No" +AUTO_2A2B: DZ " File(s)", 141 AUTO_2A35: LD HL,AUTO_2A41 LD DE,AUTO_4080 @@ -4778,7 +4813,7 @@ AUTO_2A56: PUSH AF LD A,R PUSH AF - LD HL,START + LD HL,0 ADD HL,SP PUSH HL LD A,3Ch @@ -4872,13 +4907,13 @@ AUTO_2B09: INC HL LD (HL),D LD HL,AUTO_4000 - LD DE,START + LD DE,0 IN A,(WG_SEC) DEC A LD E,A LD B,1 CALL AUTO_2D73 - LD HL,START + LD HL,0 ADD HL,SP LD (AUTO_4140),HL LD SP,AUTO_41FF @@ -4955,7 +4990,7 @@ AUTO_2B95: INC A LD (AUTO_40E4),A LD HL,(AUTO_40E5) - LD DE,START+1 + LD DE,1 SBC HL,DE LD (AUTO_40E5),HL RET C @@ -6473,11 +6508,22 @@ EXP_FNS_PREPARE: RET EXP_FNS_PREPARE_EXIT: PUSH AF - XOR A + XOR A ; SYS_PORT.BIOS JP EXP_FNS_PREPARE_RET ;******************************* +RD_HEAD_DSK.FIXED: + LD A,7 + JP AUTO_1C4A +CMD_COPY.FIXED: + PUSH AF + CALL AUTO_05CB + POP AF + RET Z + INC SP + INC SP + JP AUTO_03D9 ;******************************* BLOCK #3CC0 - $,255 MAGIC_1: @@ -6521,9 +6567,11 @@ REDIR_3D13: JP NZ,EXP_FNS ;#3FF8 EXP BIT 6,C JP Z,AUTO_283C - RES 6,C - JP HD_CMD ;#3FF0 ROM. DI - + ;!TEST 06/01/2024 убираем лишние телодвижения + ;RES 6,C + ;JP HD_CMD ;#3FF0 ROM. DI + JP EXP_FNS + ; ;***************************** BLOCK #3CFA - $,255 AUTO_3CFA: @@ -6662,7 +6710,7 @@ AUTO_3DA5: RESET_WG: LD A,8 CALL WG93_EXE - LD DE,START + LD DE,0 IN A,(WG_COM) AND 2 LD B,A @@ -7031,25 +7079,25 @@ AUTO_3FEC: ;****************************************** -;!FIXIT Можно поправить номера функций при вызовах API и прыгать сразу в BIOS через #3FF8 +;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- BLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI - LD A,D_ROM16ON + ;LD A,SYS_PORT.EXTENSION + LD A,1 OUT (SYS_PORT_ON),A POP AF RET ;--------------------------------------- ; -;----[ From API #80..#FF to TR-DOS ]----- +;----[ From TR-DOS to API #80..#FF]----- BLOCK #3FF8-$, #FF -EXP_FNS: - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то +EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;PUSH AF ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать - ;XOR A ; D_ROM16OFF + ;XOR A ; SYS_PORT.BIOS JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: ; diff --git a/SP__48.ASM b/SP__48.ASM index f576190..2762a51 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19260,13 +19260,12 @@ L3C8F: DEFB $13, $00 ; Bright, off DEFB $31, $39 ; '1', '9' DEFB $13, $01 ; Bright, on DEFB $38, $36 ; '8', '6' - +L3C97: ; ------ ; UNUSED ; ------ -L3C97: - BLOCK #3CF0-$,0 ;15600 + BLOCK #3CF0-$,0 ;15600 ;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >; ; ╔═══════════════════════════╗ ; ║ дополнения для SP48 !! ║ diff --git a/Shared_Includes b/Shared_Includes index 24e0629..e7e58e7 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 24e062942e2c89a1bcd5817cc82316b52186f86c +Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 141ddec..87dbeac 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -100,12 +100,12 @@ MSDOS_CAT: CALL AUTO_1D97 ; CLS CALL OPEN_CH2 LD A,13 - RST 10H + RST #10 POP DE ; СТРОКА ПОСЛЕ CAT CAT_SPACES: LD A,(DE) - CP 20H + CP #20 JR NZ,CAT_NO_SPACE INC DE JR CAT_SPACES @@ -523,44 +523,47 @@ CALC_CL_LP: POP BC RET -HD_TX: DB ' ERR_HD',0A0H -HD_TX2: DB 'HDD not found',0A0H -MSG_3: DB 'ERROR...',0A0H -MSDOS_MSG: DB 'File not found...',0A0H -NO_MEMORY: DB 'No RAM-Disk MEM',0A0H +HD_TX: DC ' ERR_HD ' +HD_TX2: DC 'HDD not found ' +MSG_3: DC 'ERROR... ' +MSDOS_MSG: DC 'File not found... ' +NO_MEMORY: DC 'No RAM-Disk MEM ' -WORDS: - DB 5,'CLEAR' ; очистить RAM-Disk - DW CLEAR_RAMD_X - DB 3,'CAT' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'DIR' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'HDD' ; подключить HDD - DW HDD_SET - DB 3,'FDD' ; подключить FDD - DW FDD_SET - DB 3,'RMD' ; подключить RMD - DW RAMD_SET - DB 3,'HDT' ; тест HDD - DW HDD_PROG - DB 2,'RD' ; тест RAM-Disk space - DW RAMD_FAT_PROG - DB 4,'SAVE' ; сохранить RAM-Disk - DW SAVE_RMD - DB 4,'LOAD' ; загрузить RAM-Disk - DW LOAD_RMD - DB 4,'TBON' ; включить турбо - DW TB_ONOFF - DB 5,'TBOFF' ; выключить турбо - DW TB_ONOFF - DB 4,'INIT' ; инизиализация - DW INIT_RMD - DB 8,"SPRINTER" - DW SPR_1 - DB 2,"AY" - DW AY8910 - DB 0 +WORDS: DB 5,'CLEAR' ; очистить RAM-Disk + DW CLEAR_RAMD_X + DB 3,'CAT' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'DIR' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'HDD' ; подключить HDD + DW HDD_SET + DB 3,'FDD' ; подключить FDD + DW FDD_SET + DB 3,'RMD' ; подключить RMD + DW RAMD_SET + DB 3,'HDT' ; тест HDD + DW HDD_PROG + DB 2,'RD' ; тест RAM-Disk space + DW RAMD_FAT_PROG + DB 4,'SAVE' ; сохранить RAM-Disk + DW SAVE_RMD + DB 4,'LOAD' ; загрузить RAM-Disk + DW LOAD_RMD + DB 4,'TBON' ; включить турбо + DW TB_ONOFF + DB 5,'TBOFF' ; выключить турбо + DW TB_ONOFF + DB 4,'INIT' ; инизиализация + DW INIT_RMD + DB 8,"SPRINTER" + DW SPR_1 + DB 2,"AY" + DW AY8910 + ;[ ] 07/01/2024 + DB 6,'SETHDD' ; /SETHDD XYZ, где X - chanel, Y - master/slave, Z - 0..3 - номер раздела + DW CHOOSE_HDD + ; + DB 0 ;SAVE_AUTOEXEC: ; LD C,0FEH @@ -577,18 +580,17 @@ AY8910: AND A RET -SPR_1: - LD A,(DE) +SPR_1: LD A,(DE) INC DE - CP #20 + CP " " JR Z,SPR_1 CP "1" - LD C,#F0 ;!HARDCODE BIOS.RST_CONF.SP97_1 + LD C,BIOS.RST_CONF.SP97_1 JR Z,SP_1 CP "2" SCF RET NZ - LD C,#F1 ;!HARDCODE BIOS.RST_CONF.SP97_2 + LD C,BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) CP #21 CCF diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index c524135..d9ec5d5 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,6 +1,6 @@ INIT_RMD: - LD C,#9F ;!HARDCODE BIOS.FullInit + LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -30,8 +30,8 @@ INIT_RMD: RAMD_FAT_PROG: CALL AUTO_1D97 ; CLS - CALL OPEN_CH2 - LD HL,RAMD_FAT + CALL OPEN_CH2 + LD HL,RAMD_FAT RAMD_F_L1: DI IN A,(PAGE3) @@ -41,7 +41,6 @@ RAMD_F_L1: LD A,C LD C,(HL) OUT (PAGE3),A -; RET_PAGE3 EI PUSH HL LD A,C @@ -52,22 +51,28 @@ RAMD_F_L1: CALL OPEN_CH0 JP AUTO_03E1 ;*************************************************************************** +;[x] исправлен баг с неработающими командами TBON/TBOFF TB_ONOFF: - DEC DE - DEC DE - LD A,(DE) - CP 'F' - JR Z,TB_OFF_EXE - CP 'f' - JR Z,TB_OFF_EXE -TB_ON_EXE: - LD C,#8F ;!HARDCODE BIOS.FN_TURBO - LD A,4 - JP EXP_FNS -TB_OFF_EXE: - LD C,#8F ;!HARDCODE BIOS.FN_TURBO - LD A,3 - JP EXP_FNS + DEC DE + DEC DE + LD A,(DE) + OR %0010'0000 + CP 'f' + LD C,BIOS.FN_TURBO + LD A,BIOS.FN_TURBO.OFF + JR Z,.set + ; + LD A,BIOS.FN_TURBO.ON +.set: JP EXP_FNS + +; TB_ON_EXE: +; LD C,BIOS.FN_TURBO +; LD A,4 +; JP EXP_FNS +; TB_OFF_EXE: +; LD C,BIOS.FN_TURBO +; LD A,3 +; JP EXP_FNS ; ;*************************************************************************** ; @@ -82,19 +87,19 @@ TB_OFF_EXE: MSDOS_WRITE_FILE: LD (CONT_BUF_ADR),HL ; адрес загрузки LD (MED_START),A ; страница загрузки - LD A,6 + LD A,TRDOS_ROM_CMD.WRITE JR MSDOS_R_W_FILE ; MSDOS_READ_FILE: LD (CONT_BUF_ADR),HL ; адрес загрузки LD (MED_START),A ; страница загрузки - LD A,5 + LD A,TRDOS_ROM_CMD.READ MSDOS_R_W_FILE: LD (MED_LEN),A -; beg=start_claster ; Получить начальный кластер + ; beg=start_claster. Получить начальный кластер LD IX,(START_CLASTER) ; стартовый кластер -; next=beg -; max=file_len ; длина в кластерах + ; next=beg + ; max=file_len. длина в кластерах CALL GET_FILE_CLASTERS_BC ; LD A,B ; CALL PRINT_HEX_A @@ -215,10 +220,11 @@ READ_num_clasters_from_beg: PUSH AF LD A,(MED_LEN) LD C,A - SUB 5 + SUB TRDOS_ROM_CMD.READ JR Z,CONT_XX1 DEC A JR NZ,SKEEP_XX1 + ;TRDOS_ROM_CMD.WRITE CONT_XX1: POP AF @@ -497,8 +503,7 @@ READ_FAT_SEC: LD HL,MS_FAT LD A,SYS_PAGE - LD B,2 - LD C,5 + LD BC,256*2 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT POP HL @@ -550,8 +555,12 @@ GET_FL_L2: ;*************************************************************************** HDD_PROG: - LD C,BIOS.HDD_INIT and #BF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; JP C,HDD_PROG_E LD HL,HD_IDF_ADR+54 LD B,32 @@ -578,8 +587,12 @@ HDD_PROG_L: RST 10H POP BC DJNZ HDD_PROG_L - LD C,BIOS.HDD_RECAL and #BF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_RECAL and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_RECAL + CALL EXP_FNS + ; JP NC,AUTO_03E1 HDD_ERROR: diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 2ee025a..e6fc1d0 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -5,7 +5,6 @@ ;******************************************** ; MS-DOS utilites ;******************************************** - MSD_R_W_UT: PUSH AF CALL DISK_REDIR @@ -20,7 +19,11 @@ MSD_R_W_UT: ;* 5. Страница ОЗУ - A * ;************************************************ .HDD: POP AF - CALL HD_CMD + ;!TEST 06/01/2024 убираем лишние телодвижения + ;CALL HD_CMD + SET 6,C + CALL EXP_FNS + ; RET NC JP HDD_ERROR ;************************************************ @@ -162,50 +165,50 @@ MSD_R_W_LOOP: POP AF CALL NZ,MSD_3F0A DI - IN A,(PAGE2) - LD C,A + IN A,(PAGE2) + LD C,A LD A,SYS_PAGE OUT (PAGE2),A - LD DE,(MS_BPB+SEC_SIZE-4000h) - LD A,C - OUT (PAGE2),A + LD DE,(MS_BPB+SEC_SIZE-#4000) + LD A,C + OUT (PAGE2),A EI POP HL ADD HL,DE - LD A,H - OR L - JR NZ,MSD_NO_PAGE + LD A,H + OR L + JR NZ,MSD_NO_PAGE DI - IN A,(PAGE2) - LD C,A - LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(MED_START) - LD HL,RAMD_FAT-4000H - LD L,A - LD L,(HL) - LD A,C - OUT (PAGE2),A + IN A,(PAGE2) + LD C,A + LD A,SYS_PAGE + OUT (PAGE2),A + LD A,(MED_START) + LD HL,RAMD_FAT-#4000 + LD L,A + LD L,(HL) + LD A,C + OUT (PAGE2),A EI - LD A,L - LD HL,0C000H - LD (MED_START),A + LD A,L + LD HL,#C000 + LD (MED_START),A MSD_NO_PAGE: LD (CONT_BUF_ADR),HL PUSH HL DI - IN A,(PAGE2) - LD C,A + IN A,(PAGE2) + LD C,A LD A,SYS_PAGE OUT (PAGE2),A - LD A,(DS_1440-4000H) - RES 0,A - LD (DS_1440-4000H),A - LD A,(MSD_SECS-4000h) + LD A,(DS_1440-#4000) + AND %1111'1110 + LD (DS_1440-#4000),A + LD A,(MSD_SECS-#4000) LD L,A - LD A,C - OUT (PAGE2),A + LD A,C + OUT (PAGE2),A EI LD A,L LD HL,CONT_SEC @@ -434,16 +437,18 @@ READ_BPB: LD DE,63 ;!HARDCODE LD A,SYS_PAGE LD HL,MS_BPB - LD C,BIOS.HDD_READ and #BF - LD B,1 + ; + LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT CALL READ_BPB.PARAMS RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE LD HL,MS_BPB - LD C,BIOS.HDD_READ_BPB and #BF + LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT + + ;CALL BPB_PARAMS ;RET @@ -644,8 +649,7 @@ READ_NEXT2: EI LD HL,MS_DIR LD A,SYS_PAGE - LD B,1 - LD C,5 + LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT DI IN A,(PAGE3) diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index d34babd..1cf7929 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -288,7 +288,7 @@ PAGE_CALC2: LD B,A LD C,H POP HL - EI + ;EI RET NC JP ERROR_DISK @@ -399,7 +399,7 @@ CLEAR_RMD_A: PUSH HL PUSH DE PUSH BC - LD C,#93 ;!HARDCODE BIOS.FreeMemRMD + LD C,BIOS.FreeMemRMD CALL EXP_FNS ; вызвать функцию ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -410,9 +410,10 @@ CLEAR_RMD_A: RET ;********************************************************* +; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk GET_RMD_A: -GET_RAM_BLK: ; B - ЧИСЛО ТРЕБУЕМЫХ БЛОКОВ, A - КЛЮЧ RAM-Disk - LD C,#92 ;!HARDCODE BIOS.GetMemRMD +GET_RAM_BLK: + LD C,BIOS.GetMemRMD CALL EXP_FNS ; A,L - КЛЮЧ RAM-Disk - номер первого блока ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -438,15 +439,18 @@ FDD_SET: ;RET ; -HDD_SET: - LD C,BIOS.HDD_INIT and #BF - CALL HD_CMD +HDD_SET:;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; JP C,HDD_PROG_E LD A,(OPER_DISK) LD B,A - LD A,0 - LD C,#CD ;!HARDCODE BIOS.HDD_TO_DRV + XOR A + LD C,BIOS.HDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -498,3 +502,61 @@ RAMD_SYM_OK: RET +;[ ] 07/01/2024 +CHOOSE_HDD: + PUSH DE + LD A,(OPER_DISK) + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + POP DE + JR C,.error + AND #40 ;!HARDCODE HDD + JR Z,.error + ; +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + LD A,(DE) + CP #0D + JR Z,.error + ; номер раздела + INC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + RLA + LD C,A + ; master/slave + DEC DE + LD A,(DE) + CP "2" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + OR C + LD C,A + ; Primary/Secondary + DEC DE + LD A,(DE) + CP "2" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + OR C + ; + LD C,BIOS.HDD_PART + CALL EXP_FNS + RET NC + ; +.error: LD HL,MSG_3 + JP ERR_EXIT + +;bit0: Primary/Secondary, bit1 - master/slave, bit2..3: использующийся раздел в MBR \ No newline at end of file From 22e0a4dffaaf741deacd4912cb5220b27a6a01d3 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 27 Jan 2024 03:42:21 +1000 Subject: [PATCH 069/114] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20/SETHDD=20=D0=B2=20TR-DO?= =?UTF-8?q?S?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 3 ++- TRDOS/TR_RMD_S.ASZ | 32 ++++++++++++++++---------------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index e7e58e7..5cb5d02 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e7e58e7b816a25137a0a253321164e863bbe782e +Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673 diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index e6fc1d0..4bccc88 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -440,7 +440,8 @@ READ_BPB: ; LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT - CALL READ_BPB.PARAMS + ; + CALL .PARAMS RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 1cf7929..8597159 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -431,7 +431,7 @@ READ_ONLY: FDD_SET: LD A,(OPER_DISK) LD B,A - LD C,#CC ;!HARDCODE BIOS.FDD_TO_DRV + LD C,BIOS.FDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -466,7 +466,7 @@ RAMD_SET1: LD A,(OPER_DISK) LD B,A POP AF - LD C,#CB ;!HARDCODE BIOS.RAMD_TO_DRV + LD C,BIOS.RAMD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то JP EXP_FNS ;CALL EXP_FNS @@ -521,7 +521,7 @@ CHOOSE_HDD: CP #0D JR Z,.error ; номер раздела - INC DE + ;INC DE LD A,(DE) CP "4" JR NC,.error @@ -531,21 +531,21 @@ CHOOSE_HDD: RLA RLA LD C,A - ; master/slave + ; ; master/slave + ; DEC DE + ; LD A,(DE) + ; CP "2" + ; JR NC,.error + ; CP "0" + ; JR C,.error + ; SUB "0" + ; RLA + ; OR C + ; LD C,A + ; Primary/Secondary, master/slave DEC DE LD A,(DE) - CP "2" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - RLA - OR C - LD C,A - ; Primary/Secondary - DEC DE - LD A,(DE) - CP "2" + CP "4" JR NC,.error CP "0" JR C,.error From 5ea974f0028a38795ab607c503d61bf0420a635e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 27 Jan 2024 04:13:40 +1000 Subject: [PATCH 070/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5cb5d02..d3cdfc6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5cb5d02cf145ff2d6d14fca5a5f9a5fb2ec6a673 +Subproject commit d3cdfc6e7644fab96ebe2c6e87959359cda6319c From 44ea99c6ba21eb78733545cb37e54fea2d968dad Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 28 Jan 2024 01:52:52 +1000 Subject: [PATCH 071/114] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=BA=20=D0=BD=D0=B0=20Sp2000.inc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 1878 ++++++++++++++++++++++---------------------- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 82 +- TRDOS/TR_MSD_3.ASZ | 104 +-- TRDOS/TR_MSD_S.ASZ | 270 +++---- TRDOS/TR_RMD_S.ASZ | 60 +- 6 files changed, 1197 insertions(+), 1199 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index e81b60c..2989ddf 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -8,7 +8,7 @@ ORG 0 ;*************************************** - INCLUDE 'INC/SPRINT00.INC' + INCLUDE 'Shared_Includes/constants/sp2000.inc' INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' @@ -147,7 +147,7 @@ CONT_6: JR Z,CONT_6 CONT_7: DEC HL - LD (P_RAMTOP),HL + LD (ZX_VARS.P_RAMTOP),HL LD DE,#3EAF LD BC,#00A8 LD A,E @@ -186,72 +186,72 @@ CONT_8: RET_1: EX DE,HL INC HL - LD (UDG),HL + LD (ZX_VARS.UDG),HL DEC HL LD BC,AUTO_0540 - LD (ERR_BEEP),BC - LD (TOP_CLEAR),HL + LD (ZX_VARS.ERR_BEEP),BC + LD (ZX_VARS.TOP_CLEAR),HL LD HL,03C00h - LD (ZG),HL - LD HL,(TOP_CLEAR) + LD (ZX_VARS.ZG),HL + LD HL,(ZX_VARS.TOP_CLEAR) LD (HL),'>' DEC HL LD SP,HL DEC HL DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL LD DE,01303h PUSH DE IM 1 - LD IY,ERR_NR - LD HL,BEG_ADRESS + LD IY,ZX_VARS.ERR_NR + LD HL,ZX_VARS.BEG_ADRESS AUTO_00A8: - LD (CHANS),HL + LD (ZX_VARS.CHANS),HL LD DE,AUTO_15AF LD BC,15h EX DE,HL CALL AUTO_0117 EX DE,HL DEC HL - LD (DATA_ADR),HL + LD (ZX_VARS.DATA_ADR),HL INC HL - LD (BAS_PROG),HL - LD (BAS_VARS),HL + LD (ZX_VARS.BAS_PROG),HL + LD (ZX_VARS.BAS_VARS),HL LD (HL),128 INC HL - LD (E_LINE),HL + LD (ZX_VARS.E_LINE),HL DB 54 AUTO_00C8: DEC C INC HL LD (HL),128 INC HL - LD (WORK_SP),HL - LD (STK_BOT),HL - LD (STK_END),HL + LD (ZX_VARS.WORK_SPACE),HL + LD (ZX_VARS.STK_BOT),HL + LD (ZX_VARS.STK_END),HL LD A,'8' - LD (ATTR_P),A - LD (ATTR_T),A - LD (BORDER),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.ATTR_T),A + LD (ZX_VARS.BORDER),A LD HL,0223h - LD (KEY_TIME),HL + LD (ZX_VARS.KEY_TIME),HL DEC (IY-58) DEC (IY-54) LD HL,015C6h - LD DE,REP_K_TYME + LD DE,ZX_VARS.REP_K_TYME LD BC,14 CALL AUTO_0117 SET 1,(IY+1) - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS AUTO_0100: LD (HL),201 RST_ROM ROUTINE.clear_prb - LD HL,L_SCR_SIZE + LD HL,ZX_VARS.L_SCR_SIZE LD (HL),2 LD HL,AUTO_128B PUSH HL LD A,170 - LD (PR_BUFER),A + LD (ZX_VARS.PRINTER_BUFFER),A EI JP AUTO_3D31 AUTO_0117: @@ -266,7 +266,7 @@ AUTO_0124: AUTO_012A: CALL AUTO_20E5 CALL AUTO_1D97 - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) INC HL LD E,(HL) INC HL @@ -276,49 +276,49 @@ AUTO_012A: EX DE,HL JR Z,AUTO_0140 XOR A - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A AUTO_0140: PUSH HL CALL AUTO_0232 POP HL - LD (NEW_PPC),HL + LD (ZX_VARS.NEW_PPC),HL XOR A - LD (NEW_S_PPC),A + LD (ZX_VARS.NEW_S_PPC),A RST_ROM ROUTINE.set_min - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) DEC HL - LD (DATA_ADR),HL - LD SP,(ERR_SP) - LD A,(ERR_3D00) + LD (ZX_VARS.DATA_ADR),HL + LD SP,(ZX_VARS.ERR_SP) + LD A,(ZX_VARS.ERR_3D00) OR A LD HL,AUTO_1B76 JR Z,AUTO_0166 RST_ROM ROUTINE.report_0 AUTO_0166: PUSH HL - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL RET AUTO_016C: ; вход через 3D03 CALL xchg_intf1 CALL BUFER_ON LD A,255 - LD (MSG_FLAG),A + LD (ZX_VARS.MSG_FLAG),A XOR A - LD (DOS_FLAG),A + LD (ZX_VARS.DOS_FLAG),A LD A,170 - LD (FLAG_BOOT),A + LD (ZX_VARS.FLAG_BOOT),A LD HL,AUTO_0201 - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL LD HL,0 ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL CALL AUTO_021D - LD HL,(TOP_CLEAR) - LD DE,(CH_ADR) + LD HL,(ZX_VARS.TOP_CLEAR) + LD DE,(ZX_VARS.CH_ADR) SBC HL,DE EX DE,HL JR NC,AUTO_01A5 @@ -326,7 +326,7 @@ AUTO_016C: ; LD DE,101h SBC HL,DE AUTO_01A5: - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL AUTO_01A8: CALL AUTO_01C7 AUTO_01AB: @@ -340,7 +340,7 @@ AUTO_01AB: JP NZ,AUTO_01D3 INC HL CALL AUTO_3048 ; convert words - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) JP AUTO_030A AUTO_01C7: LD A,(HL) @@ -353,12 +353,12 @@ AUTO_01C7: CALL AUTO_1E43 AUTO_01D3: LD HL,0 - LD (DISK_1_FLG),HL + LD (ZX_VARS.DISK_1_FLG),HL CALL AUTO_20E5 CALL AUTO_1D63 - LD HL,FLAG_BOOT + LD HL,ZX_VARS.FLAG_BOOT LD (HL),170 - LD HL,FL_NUMBER+1 + LD HL,ZX_VARS.FL_NUMBER+1 LD A,(HL) OR A LD (HL),0 @@ -366,9 +366,9 @@ AUTO_01D3: CALL AUTO_1E1C CALL AUTO_0212 AUTO_01F3: - LD SP,(DOS_SP) - LD HL,(ADR_RET) - LD BC,(DOS_ERR_2) + LD SP,(ZX_VARS.DOS_SP) + LD HL,(ZX_VARS.ADR_RET) + LD BC,(ZX_VARS.DOS_ERR_2) LD B,0 AUTO_0200: JP (HL) @@ -376,8 +376,8 @@ AUTO_0201: CALL AUTO_0232 BIT 7,(IY+0) RET NZ - LD DE,RET_INS - LD SP,(ERR_SP) + LD DE,ZX_VARS.RET_INS + LD SP,(ZX_VARS.ERR_SP) PUSH DE RET AUTO_0212: @@ -387,35 +387,35 @@ AUTO_0212: CALL BASIC_RST20 JR AUTO_0212 AUTO_021D: - LD HL,(ERR_SP) - LD (ERR_SP_COPY),HL - LD HL,(DOS_SP) + LD HL,(ZX_VARS.ERR_SP) + LD (ZX_VARS.ERR_SP_COPY),HL + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL LD DE,AUTO_3D16 LD (HL),E INC HL LD (HL),D RET AUTO_0232: - LD HL,(ERR_SP_COPY) - LD (ERR_SP),HL + LD HL,(ZX_VARS.ERR_SP_COPY) + LD (ZX_VARS.ERR_SP),HL RET AUTO_0239: ; вход через 3D00 LD HL,0 - LD (DOS_FLAG),HL + LD (ZX_VARS.DOS_FLAG),HL ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL CALL LOAD_CR - LD HL,FLAG_BOOT + LD HL,ZX_VARS.FLAG_BOOT LD A,(HL) CP 170 LD A,0 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP Z,AUTO_02CB LD (HL),170 CALL AUTO_1D97 @@ -423,22 +423,22 @@ AUTO_0239: ; LD HL,NEW_NAME RST PRINT_LN CALL INIT_2X80 - LD A,(BEG_ADRESS) + LD A,(ZX_VARS.BEG_ADRESS) CP 244 JR Z,AUTO_0271 LD HL,AUTO_1000 AUTO_0270: RST PRINT_LN AUTO_0271: - LD A,(PR_BUFER) + LD A,(ZX_VARS.PRINTER_BUFFER) CP 170 JR NZ,AUTO_02CB CALL xchg_intf1 AUTO_027B: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD A,254 AUTO_0280: - LD (BAS_DOS_FLG),A + LD (ZX_VARS.BAS_DOS_FLG),A LD (HL),247 INC HL LD (HL),'"' @@ -454,14 +454,14 @@ AUTO_0280: LD (HL),'"' INC HL CMD_NEW_EXEC: - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL LD (HL),13 INC HL LD (HL),128 INC HL - LD (WORK_SP),HL - LD (STK_BOT),HL - LD (STK_END),HL + LD (ZX_VARS.WORK_SPACE),HL + LD (ZX_VARS.STK_BOT),HL + LD (ZX_VARS.STK_END),HL SET 3,(IY+1) JR AUTO_02EF AUTO_02B0: @@ -478,7 +478,7 @@ AUTO_02B9: AUTO_02BB: PUSH BC XOR 8 - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A PUSH AF LD A,5 CALL pause_1ms @@ -487,33 +487,33 @@ AUTO_02BB: DJNZ AUTO_02BB RET AUTO_02CB: - LD HL,(DOS_SP) + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL LD SP,HL CALL xchg_intf1 CALL OPEN_CH0 - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) OR 3 CALL AUTO_02B9 - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) CALL AUTO_02B9 XOR A - LD (MSG_FLAG),A + LD (ZX_VARS.MSG_FLAG),A CALL INPUT_LINE CALL AUTO_3032 ; ПРЕОБРАЗОВАНИЕ СТРОКИ AUTO_02EF: CALL AUTO_1D9F ; ФУНКЦИЯ BASIC ??? ( CLS LOW SCR ) LD HL,AUTO_02CB - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL XOR A - LD (DOS_ERR_2),A - LD HL,(E_LINE) + LD (ZX_VARS.DOS_ERR_2),A + LD HL,(ZX_VARS.E_LINE) PUSH HL - LD DE,COM_LN_COPY + LD DE,ZX_VARS.COM_LN_COPY CALL AUTO_02B0 POP HL - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL AUTO_030A: LD A,(HL) LD B,A @@ -523,7 +523,7 @@ AUTO_030A: CP 254 ; RETURN JR Z,AUTO_031A PUSH AF - CALL AUTO_3DC8 ; SET CONT_DISK + CALL AUTO_3DC8 ; SET ZX_VARS.CONT_DISK POP AF AUTO_031A: LD HL,TRDOS_CMD.LIST ; СПИСОК КОМАНД @@ -542,12 +542,12 @@ AUTO_0320: CP 254 CALL NZ,BUFER_ON ; Включить буфер, если не RETURN LD A,9 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A XOR A - LD (DOS_ERR_2),A - LD (DOS_ERROR),A - LD (ERR_3D00),A - LD HL,FLAGS + LD (ZX_VARS.DOS_ERR_2),A + LD (ZX_VARS.DOS_ERROR),A + LD (ZX_VARS.ERR_3D00),A + LD HL,ZX_VARS.FLAGS RES 7,(HL) LD B,0 LD HL,TRDOS_CMD.TABLE @@ -563,7 +563,7 @@ AUTO_0320: PUSH DE JP (HL) AUTO_0359: - LD HL,FLAGS + LD HL,ZX_VARS.FLAGS SET 7,(HL) POP HL JP (HL) @@ -576,7 +576,7 @@ AUTO_03AC: CALL PRINT_CR CALL PRINT_CR AUTO_03B5: - LD BC,(FREE_SEC) + LD BC,(ZX_VARS.FREE_SEC) CALL AUTO_1DA9 LD HL,AUTO_29D2 RST PRINT_LN @@ -584,15 +584,15 @@ AUTO_03C0: JP AUTO_01D3 AUTO_03C3: PUSH AF - LD A,(BAS_DOS_FLG) + LD A,(ZX_VARS.BAS_DOS_FLG) CP 254 JR NZ,AUTO_03CD POP AF RET AUTO_03CD: POP AF - LD (DOS_ERR_2),A - LD A,(MSG_FLAG) + LD (ZX_VARS.DOS_ERR_2),A + LD A,(ZX_VARS.MSG_FLAG) OR A CALL Z,PRINT_L ;!FIXIT Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. @@ -608,13 +608,13 @@ AUTO_03E4: JP AUTO_1C4A AUTO_03E8: XOR A - LD (CAT_SEC),A + LD (ZX_VARS.CAT_SEC),A AUTO_03EC: - LD DE,(CAT_SEC) + LD DE,(ZX_VARS.CAT_SEC) LD D,0 AUTO_03F2: CALL BUFER_ON - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD B,1 JP READ_DISK AUTO_03FD: @@ -623,7 +623,7 @@ AUTO_03FD: JR AUTO_03F2 RD_HEAD_DSK: CALL AUTO_03FD - LD A,(CODE_10H) + LD A,(ZX_VARS.CODE_10H) CP 16 JR Z,AUTO_0415 ;!TEST @@ -640,7 +640,7 @@ AUTO_0415: CALL get_disk_type RES 0,(HL) RES 1,(HL) - LD A,(TYPE_DISK) + LD A,(ZX_VARS.TYPE_DISK) BIT 0,A JR NZ,AUTO_0425 SET 0,(HL) @@ -650,7 +650,7 @@ AUTO_0425: SET 1,(HL) RET TEST_CR: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) INC HL LD A,(HL) CP 13 @@ -661,12 +661,12 @@ TEST_CR: CMD_CAT: CALL TEST_CR LD BC,2 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC JR Z,AUTO_046A CP '#' JR NZ,AUTO_045D - LD (CH_ADR),HL ; КАНАЛ ДЛЯ CAT + LD (ZX_VARS.CH_ADR),HL ; КАНАЛ ДЛЯ CAT CALL AUTO_1E0B CALL AUTO_1D8C CP 13 @@ -686,10 +686,10 @@ AUTO_0460: CALL SET_DRIVE AUTO_046A: CALL SINTAX_RET - LD A,(OPER_DISK) - LD (DISK_2_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A CALL RD_HEAD_DSK - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) AUTO_0479: CP 2 PUSH AF @@ -702,14 +702,14 @@ AUTO_0479: JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 - LD (DISK_1_FLG),A + LD (ZX_VARS.DISK_1_FLG),A LD HL,AUTO_29F7 RST PRINT_LN - LD HL,DISK_NAME + LD HL,ZX_VARS.DISK_NAME RST PRINT_LN CALL PRINT_CR - LD A,(N_FILES) - LD HL,N_DEL_FL + LD A,(ZX_VARS.N_FILES) + LD HL,ZX_VARS.N_DEL_FL SUB (HL) PUSH HL CALL AUTO_1DA3 @@ -721,11 +721,11 @@ AUTO_0479: LD HL,AUTO_2A1D RST PRINT_LN CALL AUTO_03E8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER AUTO_04B6: CALL AUTO_04F6 CALL PRINT_CR - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' RST RST10 LD B,2 @@ -766,8 +766,8 @@ AUTO_04E8: AUTO_04F6: PUSH HL PUSH BC - LD A,(DISK_2_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_2_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) CALL NZ,SET_DISK POP BC @@ -787,12 +787,12 @@ AUTO_050C: POP HL RET AUTO_0517: - LD HL,CAT_SEC + LD HL,ZX_VARS.CAT_SEC INC (HL) CALL AUTO_03EC POP BC POP HL - LD HL,BUFER + LD HL,ZX_VARS.BUFFER RET GET_DISK: AND 223 @@ -816,15 +816,15 @@ CMD_NEW: AUTO_0540: CALL AUTO_102E CALL AUTO_1CB0 - LD A,(OPER_DISK) - LD (DISK_1_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_1_FLG),A JP NZ,AUTO_03D9 PUSH BC CALL AUTO_165D CALL AUTO_1CB0 PUSH AF - LD A,(DISK_1_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_1_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) JP NZ,CMD_ERROR CALL RD_HEAD_DSK @@ -836,23 +836,23 @@ AUTO_0569: CALL AUTO_1E43 JP AUTO_03E1 AUTO_0572: - LD A,(ERR_3D00) + LD A,(ZX_VARS.ERR_3D00) OR A RET AUTO_0577: - LD A,(N_DEL_FLS) + LD A,(ZX_VARS.N_DEL_FLS) OR A JP Z,AUTO_03D9 JP AUTO_03E1 AUTO_0581: PUSH BC CALL AUTO_1D97 - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' CALL PRINT_SYM LD A,':' CALL PRINT_SYM - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME CALL AUTO_2938 LD HL,AUTO_2820 CALL PRINT_L @@ -870,20 +870,20 @@ AUTO_0581: XOR A RET AUTO_05B4: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JR Z,AUTO_05BD XOR A RET AUTO_05BD: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_1CB3 LD A,9 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A RET AUTO_05CB: - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '*' ;JP NZ,AUTO_03D9 JR Z,.next @@ -894,32 +894,32 @@ AUTO_05CB: LD A,(HL) CP '*' JP NZ,CMD_ERROR - LD A,(OPER_DISK) - LD (DISK_2_FLG),A - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK LD A,255 - LD (BUF_FLAG+1),A + LD (ZX_VARS.BUF_FLAG+1),A AUTO_05F4: - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL RD_HEAD_DSK - LD A,(BUF_FLAG+1) + LD A,(ZX_VARS.BUF_FLAG+1) INC A - LD (BUF_FLAG+1),A + LD (ZX_VARS.BUF_FLAG+1),A LD C,A CALL AUTO_165D - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP 0 JP Z,AUTO_03E1 CP 1 JR Z,AUTO_05F4 - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL AUTO_1CB3 JR NZ,AUTO_0634 @@ -933,36 +933,36 @@ AUTO_0634: JR AUTO_05F4 AUTO_063C: CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_1C45 - LD HL,VAR_2 - LD DE,FL_START + LD HL,ZX_VARS.VAR_2 + LD DE,ZX_VARS.FL_START LD BC,7 LDIR - LD DE,(FL_SIZE) + LD DE,(ZX_VARS.FL_SIZE) LD D,0 OR A - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FREE_SEC) SBC HL,DE JP C,AUTO_1C45 - LD (FREE_SEC),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL + LD (ZX_VARS.FREE_SEC),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL PUSH HL CALL AUTO_072F POP HL - LD (FL_PLACE),HL - LD HL,(CONT_SEC) - LD (CLEAR_SEC),HL - LD HL,N_FILES + LD (ZX_VARS.FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.CLEAR_SEC),HL + LD HL,ZX_VARS.N_FILES INC (HL) LD C,(HL) DEC C LD B,0 PUSH BC LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 POP BC CALL AUTO_166B @@ -971,7 +971,7 @@ AUTO_063C: ; ; CMD_COPY: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) INC HL LD A,(HL) AND 223 @@ -984,27 +984,27 @@ CMD_COPY: CALL AUTO_166F CALL AUTO_102E CALL AUTO_1CB0 - LD A,(OPER_DISK) - LD (DISK_1_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_1_FLG),A ;!TEST Ошибка!!! COPY "*","*" надо проверять всегда, иначе при ; наличии на диске файла с именем "*" скопируется только этот файл ;JP NZ,AUTO_05CB CALL CMD_COPY.FIXED ; CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR CALL AUTO_1CB0 PUSH AF PUSH BC - LD A,(OPER_DISK) - LD (DISK_2_FLG),A - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL RD_HEAD_DSK - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK POP BC @@ -1017,72 +1017,72 @@ CMD_COPY: AUTO_06F3: CALL AUTO_063C CALL AUTO_1E43 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JP NZ,AUTO_03E1 LD A,10 - LD (S_NAME_NUM),A - LD HL,FL_START + LD (ZX_VARS.S_NAME_NUM),A + LD HL,ZX_VARS.FL_START INC (HL) - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK CALL AUTO_05B4 JP NZ,AUTO_03E1 AUTO_0716: CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK CALL RD_HEAD_DSK JR AUTO_06F3 AUTO_072F: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_0775 - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) LD B,A XOR A - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A AUTO_0744: PUSH BC - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CALL SET_DISK POP BC PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(VAR_2_1) + LD DE,(ZX_VARS.VAR_2_1) CALL READ_DISK - LD HL,(CONT_SEC) - LD (VAR_2_1),HL - LD A,(DISK_2_FLG) + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.VAR_2_1),HL + LD A,(ZX_VARS.DISK_2_FLG) CALL SET_DISK POP HL POP BC - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_PLACE),HL JR AUTO_072F AUTO_0775: - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A JR AUTO_0744 AUTO_0781: XOR A - LD (N_DEL_FLS),A + LD (ZX_VARS.N_DEL_FLS),A JR AUTO_07A0 ; ; @@ -1092,31 +1092,31 @@ CMD_ERASE: CALL SINTAX_RET CALL AUTO_102E XOR A - LD (N_DEL_FLS),A + LD (ZX_VARS.N_DEL_FLS),A CALL AUTO_292F CALL AUTO_07A0 JP NZ,AUTO_0577 JP AUTO_03E1 AUTO_07A0: - LD A,(FL_NAME) - LD (FST_SYM_NAME),A + LD A,(ZX_VARS.FL_NAME) + LD (ZX_VARS.FST_SYM_NAME),A RET NZ - LD HL,N_DEL_FLS + LD HL,ZX_VARS.N_DEL_FLS INC (HL) PUSH BC CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) POP BC INC C CP C JR NZ,AUTO_07BC DEC A - LD (N_FILES),A + LD (ZX_VARS.N_FILES),A XOR A AUTO_07BC: PUSH AF JR Z,AUTO_07C3 - LD HL,N_DEL_FL + LD HL,ZX_VARS.N_DEL_FL INC (HL) AUTO_07C3: PUSH BC @@ -1128,11 +1128,11 @@ AUTO_07C3: JP Z,AUTO_07D2 LD A,1 AUTO_07D2: - LD (FL_NAME),A + LD (ZX_VARS.FL_NAME),A PUSH AF CALL AUTO_1E40 - LD A,(FST_SYM_NAME) - LD (FL_NAME),A + LD A,(ZX_VARS.FST_SYM_NAME) + LD (ZX_VARS.FL_NAME),A POP AF JR Z,AUTO_07E7 CALL AUTO_1CB3 @@ -1142,13 +1142,13 @@ AUTO_07D2: AUTO_07E7: BLOCK #07E7-$,255 CALL AUTO_03FD - LD HL,(FL_PLACE) - LD (CLEAR_SEC),HL - LD DE,(FL_SIZE) - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FL_PLACE) + LD (ZX_VARS.CLEAR_SEC),HL + LD DE,(ZX_VARS.FL_SIZE) + LD HL,(ZX_VARS.FREE_SEC) LD D,0 ADD HL,DE - LD (FREE_SEC),HL + LD (ZX_VARS.FREE_SEC),HL JP AUTO_1E43 WG93_EXE_: AND 252 @@ -1231,12 +1231,12 @@ CMD_STAR: CALL AUTO_0531 LD A,(DE) CALL GET_DISK - LD (CONT_DISK),A + LD (ZX_VARS.CONT_DISK),A CALL SET_DISK JP AUTO_03E1 AUTO_102E: LD B,'C' - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A JR NZ,AUTO_104D CALL AUTO_1D8C @@ -1251,7 +1251,7 @@ AUTO_102E: JR Z,AUTO_104D LD B,'B' AUTO_104D: - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE LD (HL),B RET AUTO_1052: @@ -1341,8 +1341,8 @@ AUTO_112E: DB 13,13," File Name Start Length " DB "Line",0 AUTO_1151: - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL LD BC,AUTO_021D+5 JP AUTO_1E23 AUTO_115D: @@ -1404,8 +1404,8 @@ AUTO_11A8: AUTO_11B0: PUSH HL PUSH BC - LD A,(DISK_2_FLG) - LD HL,OPER_DISK + LD A,(ZX_VARS.DISK_2_FLG) + LD HL,ZX_VARS.OPER_DISK CP (HL) CALL NZ,SET_DISK POP BC @@ -1424,11 +1424,11 @@ AUTO_11B0: CMD_LIST: CALL TEST_CR LD BC,2 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC JR Z,AUTO_1205 CP '#' JR NZ,AUTO_11F8 - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL AUTO_1D8C CP 13 @@ -1447,10 +1447,10 @@ AUTO_11FB: CALL SET_DRIVE AUTO_1205: CALL SINTAX_RET - LD A,(OPER_DISK) - LD (DISK_2_FLG),A + LD A,(ZX_VARS.OPER_DISK) + LD (ZX_VARS.DISK_2_FLG),A CALL RD_HEAD_DSK - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) CP 2 PUSH AF CALL Z,AUTO_1D97 @@ -1459,34 +1459,34 @@ AUTO_1205: JP NC,CMD_ERROR CALL AUTO_1D84 LD A,255 - LD (DISK_1_FLG),A + LD (ZX_VARS.DISK_1_FLG),A CALL AUTO_1151 - LD HL,CLEAR_SEC - LD DE,(VAR_1) + LD HL,ZX_VARS.CLEAR_SEC + LD DE,(ZX_VARS.VAR_1) LD BC,RST20 LDIR CALL AUTO_03E8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER PUSH HL AUTO_123E: LD HL,AUTO_10B3 PUSH BC RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,CONT_2+1 ADD HL,BC RST PRINT_LN LD HL,AUTO_10BA RST PRINT_LN - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' CALL PRINT_SYM CALL PRINT_CR - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,3 ADD HL,BC LD A,(HL) - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,CONT_2 ADD HL,BC SUB (HL) @@ -1494,7 +1494,7 @@ AUTO_123E: CALL AUTO_1DA3 LD HL,AUTO_10AA RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,2 ADD HL,BC LD A,(HL) @@ -1518,7 +1518,7 @@ AUTO_1292: RST PRINT_LN LD HL,AUTO_111E RST PRINT_LN - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,4 ADD HL,BC LD C,(HL) @@ -1617,7 +1617,7 @@ AUTO_132C: AUTO_1333: DJNZ AUTO_132C AUTO_1335: - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) LD BC,RST20+1 ADD HL,BC LD B,2 @@ -1660,13 +1660,13 @@ AUTO_1375: CALL AUTO_1CB0 JP NZ,AUTO_03D9 CALL AUTO_13B7 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP '#' JP NZ,AUTO_03E1 AUTO_1393: LD A,10 - LD (S_NAME_NUM),A - LD HL,FL_START + LD (ZX_VARS.S_NAME_NUM),A + LD HL,ZX_VARS.FL_START INC (HL) CALL AUTO_1D97 LD HL,AUTO_27AA @@ -1681,30 +1681,30 @@ AUTO_13A5: JR AUTO_1393 AUTO_13B7: CALL AUTO_165D - LD HL,FL_START - LD DE,VAR_2 + LD HL,ZX_VARS.FL_START + LD DE,ZX_VARS.VAR_2 LD BC,7 LDIR - LD A,(VAR_2_0) - LD (ERR_3D00),A + LD A,(ZX_VARS.VAR_2_0) + LD (ZX_VARS.ERR_3D00),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR),A + LD (ZX_VARS.DOS_CH_ADR),A LD A,255 - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL AUTO_1451 - LD HL,(FL_NUMBER+1) - LD (FL_PLACE),HL - LD HL,(CONT_SEC) - LD (CLEAR_SEC),HL - LD HL,N_FILES + LD HL,(ZX_VARS.FL_NUMBER+1) + LD (ZX_VARS.FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.CLEAR_SEC),HL + LD HL,ZX_VARS.N_FILES INC (HL) LD C,(HL) DEC C LD B,0 PUSH BC LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 POP BC CALL AUTO_166B @@ -1712,39 +1712,39 @@ AUTO_13B7: RET AUTO_1403: XOR A - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A CALL AUTO_1CB3 JP Z,AUTO_1C50 CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_2723 - LD HL,VAR_2 - LD DE,FL_START + LD HL,ZX_VARS.VAR_2 + LD DE,ZX_VARS.FL_START LD BC,7 LDIR CALL AUTO_03FD - LD A,(ERR_3D00) - LD (FL_SIZE),A - LD DE,(FL_SIZE) + LD A,(ZX_VARS.ERR_3D00) + LD (ZX_VARS.FL_SIZE),A + LD DE,(ZX_VARS.FL_SIZE) LD D,0 OR A - LD HL,(FREE_SEC) + LD HL,(ZX_VARS.FREE_SEC) SBC HL,DE JP C,AUTO_1C45 - LD (FREE_SEC),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL - LD (FL_NUMBER+1),HL + LD (ZX_VARS.FREE_SEC),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL + LD (ZX_VARS.FL_NUMBER+1),HL RET AUTO_1451: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A JR NZ,AUTO_146F CALL AUTO_1D97 @@ -1756,28 +1756,28 @@ AUTO_1465: JR NZ,AUTO_1465 CALL AUTO_1D9F AUTO_146F: - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_14CB - LD A,(VAR_2_0) + LD A,(ZX_VARS.VAR_2_0) LD B,A XOR A - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A AUTO_1484: PUSH BC - LD (RD_WR_COM),A - LD HL,(VAR_1) + LD (ZX_VARS.RD_WR_COM),A + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(VAR_2_1) + LD DE,(ZX_VARS.VAR_2_1) CALL AUTO_14D8 CALL READ_DISK - LD HL,(CONT_SEC) - LD (VAR_2_1),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.VAR_2_1),HL CALL AUTO_1D97 LD HL,AUTO_2785 CALL PRINT_L @@ -1786,21 +1786,21 @@ AUTO_14A5: CP 'Y' JR NZ,AUTO_14A5 CALL AUTO_1D9F - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A CALL NZ,AUTO_1403 POP HL POP BC - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL AUTO_14E4 CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_PLACE),HL JP AUTO_1451 AUTO_14CB: - LD (VAR_2_0),A + LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A @@ -1809,7 +1809,7 @@ AUTO_14D8: PUSH HL PUSH DE CALL get_disk_type - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A POP DE POP HL @@ -1818,19 +1818,19 @@ AUTO_14E4: PUSH HL PUSH DE CALL get_disk_type - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) LD (HL),A POP DE POP HL RET AUTO_14F0: XOR A - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR+1),A - LD A,(TYPE_DISK) - LD (FL_START+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A + LD A,(ZX_VARS.TYPE_DISK) + LD (ZX_VARS.FL_START+1),A LD HL,AUTO_0280 CP 25 JR Z,AUTO_151F @@ -1844,8 +1844,8 @@ AUTO_14F0: JR Z,AUTO_151F JP CMD_ERROR AUTO_151F: - LD (FL_NAME),HL - LD BC,(FL_N_2) + LD (ZX_VARS.FL_NAME),HL + LD BC,(ZX_VARS.FL_N_2) SBC HL,BC JP C,AUTO_1C45 RET @@ -1862,11 +1862,11 @@ AUTO_153E: JR NZ,AUTO_153E CALL AUTO_1D9F LD A,255 - LD (COM_LN_COPY+1),A + LD (ZX_VARS.COM_LN_COPY+1),A CALL RD_HEAD_DSK CALL get_disk_type - LD (DOS_CH_ADR),A - LD A,(TYPE_DISK) + LD (ZX_VARS.DOS_CH_ADR),A + LD A,(ZX_VARS.TYPE_DISK) CP 25 LD HL,AUTO_0280 JR Z,AUTO_1575 @@ -1880,36 +1880,36 @@ AUTO_153E: JR Z,AUTO_1575 JP CMD_ERROR AUTO_1575: - LD BC,(FREE_SEC) + LD BC,(ZX_VARS.FREE_SEC) SBC HL,BC - LD (FL_TYPE),HL - LD (FL_N_2),HL + LD (ZX_VARS.FL_TYPE),HL + LD (ZX_VARS.FL_N_2),HL LD HL,0 - LD (FL_N_4),HL - LD (FL_N_6),HL + LD (ZX_VARS.FL_N_4),HL + LD (ZX_VARS.FL_N_6),HL CALL AUTO_15B8 CALL RD_HEAD_DSK - LD A,(FL_START+1) - LD (TYPE_DISK),A - LD HL,(FL_NAME) - LD BC,(FL_N_2) + LD A,(ZX_VARS.FL_START+1) + LD (ZX_VARS.TYPE_DISK),A + LD HL,(ZX_VARS.FL_NAME) + LD BC,(ZX_VARS.FL_N_2) SBC HL,BC - LD (FREE_SEC),HL + LD (ZX_VARS.FREE_SEC),HL CALL AUTO_14E4 LD DE,CONT_1 - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 AUTO_15AF: JP AUTO_03E1 AUTO_15B2: - LD HL,(FL_TYPE) + LD HL,(ZX_VARS.FL_TYPE) LD A,H OR L RET AUTO_15B8: CALL AUTO_15B2 RET Z - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) OR A JR NZ,AUTO_15DB CALL AUTO_1D97 @@ -1927,26 +1927,26 @@ AUTO_15DB: RET Z PUSH BC PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD C,(HL) LD B,0 POP HL SBC HL,BC POP BC JP NC,AUTO_1644 - LD BC,(FL_TYPE) + LD BC,(ZX_VARS.FL_TYPE) LD HL,0 - LD (FL_TYPE),HL + LD (ZX_VARS.FL_TYPE),HL AUTO_15F8: PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL CALL AUTO_14D8 - LD DE,(FL_N_4) + LD DE,(ZX_VARS.FL_N_4) LD B,C CALL READ_DISK - LD HL,(CONT_SEC) - LD (FL_N_4),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_N_4),HL CALL AUTO_1D97 LD HL,AUTO_2779 CALL PRINT_L @@ -1957,30 +1957,30 @@ AUTO_161D: CP 'Y' JR NZ,AUTO_161D CALL AUTO_1D9F - LD A,(COM_LN_COPY+1) + LD A,(ZX_VARS.COM_LN_COPY+1) AUTO_162A: OR A CALL NZ,AUTO_14F0 POP HL POP BC - LD DE,(FL_N_6) + LD DE,(ZX_VARS.FL_N_6) LD B,C CALL AUTO_14E4 CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (FL_N_6),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.FL_N_6),HL JP AUTO_15B8 AUTO_1644: - LD (FL_TYPE),HL + LD (ZX_VARS.FL_TYPE),HL PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD C,(HL) LD B,0 POP HL XOR A JP AUTO_15F8 CALL AUTO_165D - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP 1 RET AUTO_165C: @@ -2002,10 +2002,10 @@ AUTO_166B: JR AUTO_165E AUTO_166F: LD A,255 - LD (BAS_DOS_FLG),A + LD (ZX_VARS.BAS_DOS_FLG),A CALL AUTO_1680 - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL JP AUTO_1E23 AUTO_1680: RST_ROM ROUTINE.free_mem @@ -2017,18 +2017,18 @@ AUTO_1680: LD A,17 AUTO_168F: DEC A - LD (L_5D23),A + LD (ZX_VARS.L_5D23),A LD B,A LD C,0 RET ; - LD (MED_START),HL - LD (MED_LEN),HL - LD DE,(FL_SIZE) - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.MED_LEN),HL + LD DE,(ZX_VARS.FL_SIZE) + LD HL,(ZX_VARS.DOS_CH_ADR) LD D,0 ADD HL,DE - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL RET ; ; @@ -2038,29 +2038,29 @@ CMD_MOVE: JP NZ,AUTO_1775 CALL SINTAX_RET CALL AUTO_166F - LD HL,(VAR_1) - LD (FL_N_4),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.FL_N_4),HL LD DE,0900h ADD HL,DE - LD (VAR_1),HL - LD A,(L_5D23) + LD (ZX_VARS.VAR_1),HL + LD A,(ZX_VARS.L_5D23) SUB 9 - LD (L_5D23),A - LD HL,(FL_N_4) + LD (ZX_VARS.L_5D23),A + LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 CALL READ_DISK - LD HL,(FL_N_4) - LD (FL_N_2),HL + LD HL,(ZX_VARS.FL_N_4) + LD (ZX_VARS.FL_N_2),HL LD HL,AUTO_0100 - LD (MED_START),HL - LD (FL_NAME),HL + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.FL_NAME),HL XOR A - LD (FL_N_6),HL - LD (FL_N_7),A + LD (ZX_VARS.FL_N_6),HL + LD (ZX_VARS.FL_N_7),A CALL MOVE_X00 - LD DE,(FL_N_4) - LD HL,(FL_N_2) + LD DE,(ZX_VARS.FL_N_4) + LD HL,(ZX_VARS.FL_N_2) EX DE,HL LD BC,WG93_EXE_ ADD HL,BC @@ -2075,13 +2075,13 @@ CMD_MOVE: INC DE LD (HL),0 LDIR - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) LD DE,08E1h ADD HL,DE LD E,(HL) INC HL LD D,(HL) - LD BC,(MED_START) + LD BC,(ZX_VARS.MED_START) LD (HL),B DEC HL LD (HL),C @@ -2104,8 +2104,8 @@ CMD_MOVE: ADD A,L LD L,A ADD HL,BC - LD BC,(MED_START) - LD (MED_START),HL + LD BC,(ZX_VARS.MED_START) + LD (ZX_VARS.MED_START),HL LD L,B LD H,0 ADD HL,HL @@ -2117,7 +2117,7 @@ CMD_MOVE: ADD A,L LD C,A LD B,H - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) AND A SBC HL,BC EX DE,HL @@ -2125,20 +2125,20 @@ CMD_MOVE: DEC HL LD (HL),E DEC HL - LD A,(FL_N_6) + LD A,(ZX_VARS.FL_N_6) LD (HL),A LD DE,RST10 ADD HL,DE LD (HL),0 - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 CALL WRITE_DISK - LD A,(L_5D23) + LD A,(ZX_VARS.L_5D23) ADD A,9 LD B,A LD C,0 - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) CALL AUTO_1E2E JP AUTO_03E1 AUTO_1775: @@ -2146,8 +2146,8 @@ AUTO_1775: CALL SINTAX_RET CALL AUTO_1C57 CALL AUTO_03FD - LD HL,FL_NAME - LD DE,DISK_NAME + LD HL,ZX_VARS.FL_NAME + LD DE,ZX_VARS.DISK_NAME LD BC,RST08 LDIR CALL AUTO_1E43 @@ -2172,44 +2172,44 @@ AUTO_1775: RST R38 RST R38 AUTO_17A5: - LD A,(AUTO_5CD3) + LD A,(ZX_VARS.AUTO_5CD3) OR A RET Z PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 SUB (HL) POP HL JR NC,AUTO_17DD - LD A,(AUTO_5CD3) + LD A,(ZX_VARS.AUTO_5CD3) LD B,A XOR A - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A AUTO_17BA: PUSH BC - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) PUSH HL - LD DE,(AUTO_5CD5) + LD DE,(ZX_VARS.AUTO_5CD5) CALL READ_DISK - LD HL,(CONT_SEC) - LD (AUTO_5CD5),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.AUTO_5CD5),HL POP HL POP BC - LD DE,(MED_START) + LD DE,(ZX_VARS.MED_START) CALL WRITE_DISK - LD HL,(CONT_SEC) - LD (MED_START),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.MED_START),HL JR AUTO_17A5 AUTO_17DD: - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A PUSH HL - LD HL,L_5D23 + LD HL,ZX_VARS.L_5D23 LD B,(HL) POP HL XOR A JR AUTO_17BA AUTO_17E9: PUSH AF - LD HL,CAT_SEC + LD HL,ZX_VARS.CAT_SEC LD (HL),0 LD A,C AUTO_17F0: @@ -2225,7 +2225,7 @@ AUTO_17F7: POP BC POP AF CALL AUTO_1CA4 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 OR A JR Z,AUTO_180D @@ -2239,7 +2239,7 @@ AUTO_180D: ; CMD_VERIFY: LD A,255 - LD (DISK_2_FLG),A + LD (ZX_VARS.DISK_2_FLG),A ; ; ; @@ -2249,11 +2249,11 @@ AUTO_1818: CALL AUTO_1836 CALL SINTAX_RET LD A,255 - LD (ERR_3D00),A - LD A,(DISK_2_FLG) + LD (ZX_VARS.ERR_3D00),A + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP Z,AUTO_03E1 - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP Z,AUTO_012A JP AUTO_03E1 @@ -2263,34 +2263,34 @@ AUTO_1836: CALL AUTO_18AB JP AUTO_1921 AUTO_1842: - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) INC HL LD A,(HL) CP 13 RET Z LD A,1 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A CALL AUTO_1DEB AUTO_1852: XOR A - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A RET AUTO_1857: CALL AUTO_102E LD A,'B' CP B JR NZ,AUTO_1866 - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) DEC HL - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL AUTO_1866: CALL AUTO_1DEB - LD HL,(DOS_CH_ADR) - LD (MED_START),HL - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_187A: CALL TEST_CR @@ -2316,21 +2316,21 @@ AUTO_18A4: AUTO_18AB: CALL TYPE_FL_X00 OR A - LD HL,(FL_START) + LD HL,(ZX_VARS.FL_START) JR Z,AUTO_18B7 - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) AUTO_18B7: - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CP 3 - LD A,(FL_SIZE) + LD A,(ZX_VARS.FL_SIZE) PUSH DE - LD DE,(FL_LEN) + LD DE,(ZX_VARS.FL_LEN) JR NZ,AUTO_18CB - LD DE,(MED_LEN) + LD DE,(ZX_VARS.MED_LEN) AUTO_18CB: LD B,A - LD (MED_LEN),DE - LD A,(FL_TYPE) + LD (ZX_VARS.MED_LEN),DE + LD A,(ZX_VARS.FL_TYPE) CP 'C' LD A,B JR NZ,AUTO_18FD @@ -2341,15 +2341,15 @@ AUTO_18CB: CP D LD A,B JR Z,AUTO_18F6 - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) CP 3 LD A,B JR Z,AUTO_18F6 XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A LD D,B LD E,0 - LD (MED_LEN),DE + LD (ZX_VARS.MED_LEN),DE JR AUTO_18F9 AUTO_18F6: CALL AUTO_191B @@ -2358,7 +2358,7 @@ AUTO_18F9: CALL AUTO_1EAC AUTO_18FD: LD B,A - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'C' POP DE RET Z @@ -2370,13 +2370,13 @@ AUTO_18FD: CP 'D' CALL Z,AUTO_1A4C CALL AUTO_191B - LD A,(MED_LEN+1) + LD A,(ZX_VARS.MED_LEN+1) LD B,A POP DE RET AUTO_191B: LD A,3 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_1921: CALL AUTO_0572 @@ -2392,47 +2392,47 @@ AUTO_192D: JR Z,AUTO_1937 JP WRITE_DISK AUTO_1937: - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) CP 3 CALL Z,AUTO_1946 - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) DEC HL LD (HL),128 RET AUTO_1946: - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP NZ,AUTO_2FDE - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) OR A RET Z LD C,A LD B,1 - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) JR AUTO_196A AUTO_195C: - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JP NZ,READ_DISK - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE LD C,0 AUTO_196A: LD A,B OR A RET Z - LD (MED_START),HL - LD (DOS_CH_ADR),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),DE AUTO_1974: PUSH BC LD B,1 - LD DE,(DOS_CH_ADR) - LD HL,BUFER + LD DE,(ZX_VARS.DOS_CH_ADR) + LD HL,ZX_VARS.BUFFER CALL READ_DISK - LD HL,(CONT_SEC) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.DOS_CH_ADR),HL POP BC - LD HL,(MED_START) - LD DE,BUFER + LD HL,(ZX_VARS.MED_START) + LD DE,ZX_VARS.BUFFER AUTO_198E: LD A,(DE) CP (HL) @@ -2441,7 +2441,7 @@ AUTO_198E: INC DE DEC C JR NZ,AUTO_198E - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL DJNZ AUTO_1974 RET AUTO_199D: @@ -2460,21 +2460,21 @@ CMD_PEEK: CMD_POKE: LD A,238 AUTO_19AB: - LD (ERR_3D00),A + LD (ZX_VARS.ERR_3D00),A JP AUTO_1818 ; ; ; CMD_MERGE: LD A,255 - LD (FL_NUMBER+1),A + LD (ZX_VARS.FL_NUMBER+1),A CALL AUTO_187A CALL SINTAX_RET - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP NZ,CMD_ERROR - LD BC,(FL_START) - LD (MED_LEN),BC + LD BC,(ZX_VARS.FL_START) + LD (ZX_VARS.MED_LEN),BC PUSH BC INC BC RST_ROM ROUTINE.bc_spaces @@ -2483,14 +2483,14 @@ AUTO_19D1: EX DE,HL POP DE PUSH HL - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) CALL AUTO_191B - LD A,(MED_LEN+1) + LD A,(ZX_VARS.MED_LEN+1) LD B,A CALL AUTO_1852 CALL AUTO_1921 POP HL - LD DE,(BAS_PROG) + LD DE,(ZX_VARS.BAS_PROG) RST_ROM ROUTINE.me_new_lp JP AUTO_03E1 AUTO_19F2: @@ -2506,25 +2506,25 @@ AUTO_19FD: RST_ROM ROUTINE.test_room RET AUTO_1A01: - LD DE,(BAS_PROG) - LD HL,(E_LINE) + LD DE,(ZX_VARS.BAS_PROG) + LD HL,(ZX_VARS.E_LINE) DEC HL PUSH HL PUSH DE SBC HL,DE - LD DE,(FL_START) + LD DE,(ZX_VARS.FL_START) PUSH DE PUSH HL LD HL,0 - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JR Z,AUTO_1A20 LD HL,5 AUTO_1A20: ADD HL,DE - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL - LD A,(DISK_2_FLG) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 JR NZ,AUTO_1A31 POP DE @@ -2541,46 +2541,46 @@ AUTO_1A31: POP BC CALL AUTO_1E32 INC HL - LD BC,(FL_LEN) + LD BC,(ZX_VARS.FL_LEN) ADD HL,BC - LD (BAS_VARS),HL + LD (ZX_VARS.BAS_VARS),HL AUTO_1A48: - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) RET AUTO_1A4C: - LD DE,(FL_LEN) - LD (MED_LEN),DE - LD HL,(MED_START) - LD A,(DISK_2_FLG) + LD DE,(ZX_VARS.FL_LEN) + LD (ZX_VARS.MED_LEN),DE + LD HL,(ZX_VARS.MED_START) + LD A,(ZX_VARS.DISK_2_FLG) CP 255 RET Z - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) PUSH HL CALL AUTO_19F2 POP HL LD A,H OR L JR Z,AUTO_1A79 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) DEC HL DEC HL DEC HL - LD BC,(DOS_CH_ADR) + LD BC,(ZX_VARS.DOS_CH_ADR) INC BC INC BC INC BC CALL AUTO_1E2E AUTO_1A79: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) DEC HL - LD BC,(FL_LEN) + LD BC,(ZX_VARS.FL_LEN) PUSH BC INC BC INC BC INC BC CALL AUTO_1E32 INC HL - LD A,(AUTO_5CD2) + LD A,(ZX_VARS.AUTO_5CD2) LD (HL),A INC HL POP DE @@ -2590,7 +2590,7 @@ AUTO_1A79: INC HL RET AUTO_1A94: - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD C,B LD B,A LD A,C @@ -2612,7 +2612,7 @@ AUTO_1AAE: DJNZ AUTO_1AA7 AUTO_1AB0: LD B,1 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) RET AUTO_1AB6: LD HL,AUTO_29ED @@ -2623,7 +2623,7 @@ AUTO_1ABE: CALL Z,SET_7_TYPE AUTO_1AC4: CALL AUTO_03FD - LD A,(N_FILES) + LD A,(ZX_VARS.N_FILES) CP 128 JP Z,AUTO_2723 RET @@ -2633,7 +2633,7 @@ AUTO_1AC4: CMD_SAVE: CALL AUTO_1852 LD HL,0 - LD (AUTO_5CD1),HL + LD (ZX_VARS.AUTO_5CD1),HL CALL INPUT_TXT CALL AUTO_1D8C CP 175 @@ -2642,9 +2642,9 @@ CMD_SAVE: JR NZ,AUTO_1AF8 CALL AUTO_1E0B CALL SINTAX_RET - LD HL,(MED_LEN) - LD (AUTO_5CD1),HL - LD HL,FL_TYPE + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.AUTO_5CD1),HL + LD HL,ZX_VARS.FL_TYPE JR AUTO_1B1F AUTO_1AF8: CP 170 @@ -2655,13 +2655,13 @@ AUTO_1B00: RST RST10 LD E,H LD HL,AUTO_1B00 - LD (DOS_CH_ADR),HL - LD (MED_LEN),HL + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.MED_LEN),HL JR AUTO_1B48 AUTO_1B0D: CALL SINTAX_RET CALL AUTO_1D8C - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE CP 228 JR Z,AUTO_1B2C CP 13 @@ -2681,23 +2681,23 @@ AUTO_1B2C: JP C,CMD_ERROR AUTO_1B39: CALL AUTO_1DE5 - LD HL,(DOS_CH_ADR) - LD (MED_START),HL - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL AUTO_1B48: CALL SINTAX_RET LD A,'C' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A CALL AUTO_1ABE AUTO_1B53: CALL OWERWR_X01 JP AUTO_0569 AUTO_1B59: - LD HL,(MED_START) - LD (FL_START),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_START),HL EX DE,HL - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,L OR H JP Z,CMD_ERROR @@ -2707,7 +2707,7 @@ AUTO_1B59: INC H AUTO_1B6D: LD A,H - LD (FL_SIZE),A + LD (ZX_VARS.FL_SIZE),A LD E,A LD D,0 DB 42,10 @@ -2716,32 +2716,32 @@ AUTO_1B76: SBC HL,DE JP C,AUTO_1C45 PUSH HL - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),170 INC HL - LD DE,(AUTO_5CD1) + LD DE,(ZX_VARS.AUTO_5CD1) LD (HL),E INC HL LD (HL),D - LD HL,(MED_LEN) - LD (FL_LEN),HL - LD HL,(CLEAR_SEC) - LD (FL_PLACE),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.FL_LEN),HL + LD HL,(ZX_VARS.CLEAR_SEC) + LD (ZX_VARS.FL_PLACE),HL EX DE,HL - LD HL,(FL_START) - LD A,(FL_SIZE) + LD HL,(ZX_VARS.FL_START) + LD A,(ZX_VARS.FL_SIZE) LD B,A CALL WRITE_DISK - LD HL,(CONT_SEC) + LD HL,(ZX_VARS.CONT_SEC) PUSH HL CALL AUTO_03FD POP HL - LD (CLEAR_SEC),HL + LD (ZX_VARS.CLEAR_SEC),HL POP HL - LD (FREE_SEC),HL - LD HL,N_FILES + LD (ZX_VARS.FREE_SEC),HL + LD HL,ZX_VARS.N_FILES LD A,(HL) - LD (FL_NUMBER),A + LD (ZX_VARS.FL_NUMBER),A INC (HL) PUSH HL CALL AUTO_1E43 @@ -2749,40 +2749,40 @@ AUTO_1B76: LD C,(HL) DEC C AUTO_1BBF: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' CALL Z,AUTO_1BC8 RET AUTO_1BC8: - LD HL,(E_LINE) - LD DE,(BAS_PROG) + LD HL,(ZX_VARS.E_LINE) + LD DE,(ZX_VARS.BAS_PROG) SCF SBC HL,DE - LD (FL_START),HL - LD HL,(BAS_VARS) + LD (ZX_VARS.FL_START),HL + LD HL,(ZX_VARS.BAS_VARS) SBC HL,DE - LD (FL_LEN),HL + LD (ZX_VARS.FL_LEN),HL RET AUTO_1BDE: - LD HL,(BAS_VARS) - LD DE,(BAS_PROG) + LD HL,(ZX_VARS.BAS_VARS) + LD DE,(ZX_VARS.BAS_PROG) SBC HL,DE - LD (MED_LEN),HL - LD HL,(BAS_PROG) - LD (MED_START),HL - LD HL,(E_LINE) + LD (ZX_VARS.MED_LEN),HL + LD HL,(ZX_VARS.BAS_PROG) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.E_LINE) INC HL INC HL INC HL SBC HL,DE - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL RET AUTO_1BFC: CALL AUTO_1C1B RET NC LD HL,0 - LD (DOS_CH_ADR),HL - LD A,(DISK_2_FLG) + LD (ZX_VARS.DOS_CH_ADR),HL + LD A,(ZX_VARS.DISK_2_FLG) CP 255 RET NZ JP AUTO_1C13 @@ -2798,7 +2798,7 @@ AUTO_1C1B: CALL AUTO_1D9B SET 7,C LD A,C - LD (AUTO_5CD2),A + LD (ZX_VARS.AUTO_5CD2),A JR NC,AUTO_1C2B AUTO_1C29: SCF @@ -2810,9 +2810,9 @@ AUTO_1C2B: INC HL LD D,(HL) INC HL - LD (MED_START),HL - LD (MED_LEN),DE - LD (DOS_CH_ADR),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.MED_LEN),DE + LD (ZX_VARS.DOS_CH_ADR),DE CALL BASIC_RST20 CP ')' JR NZ,AUTO_1C2B @@ -2828,7 +2828,7 @@ AUTO_1C50: LD A,2 JR AUTO_1C4A AUTO_1C57: - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD B,8 AUTO_1C5C: LD (HL),' ' @@ -2847,7 +2847,7 @@ AUTO_1C73: LD A,(HL) CP ' ' JP C,CMD_ERROR - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME PUSH BC LDIR POP BC @@ -2874,7 +2874,7 @@ SET_DRIVE: RET AUTO_1C98: DEC HL - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) PUSH BC PUSH HL @@ -2889,7 +2889,7 @@ AUTO_1CA4: ADD HL,HL ADD HL,HL ADD HL,HL - LD BC,BUFER + LD BC,ZX_VARS.BUFFER ADD HL,BC RET AUTO_1CB0: @@ -2911,8 +2911,8 @@ AUTO_1CBA: LD C,0 JR AUTO_1CBA AUTO_1CCD: - LD DE,FL_NAME - LD A,(S_NAME_NUM) + LD DE,ZX_VARS.FL_NAME + LD A,(ZX_VARS.S_NAME_NUM) LD B,A XOR A CP (HL) @@ -2932,12 +2932,12 @@ AUTO_1CE7: LD A,128 SUB B LD C,A - LD (FL_NUMBER),A + LD (ZX_VARS.FL_NUMBER),A XOR A RET Z AUTO_1CF0: CALL AUTO_1CB3 - LD HL,DOS_ERR_2 + LD HL,ZX_VARS.DOS_ERR_2 LD (HL),C RET Z LD (HL),255 @@ -2950,21 +2950,21 @@ CMD_RETURN: CALL AUTO_20E5 RES 3,(IY+1) CALL AUTO_0232 - LD SP,(DOS_SP) - LD HL,(ERR_SP) + LD SP,(ZX_VARS.DOS_SP) + LD HL,(ZX_VARS.ERR_SP) DEC HL LD A,18 CP (HL) JR NZ,AUTO_1D19 DEC HL - LD (ERR_SP),HL + LD (ZX_VARS.ERR_SP),HL AUTO_1D19: RET CMD_ERROR: BIT 7,(IY+0) JR Z,AUTO_1D25 LD A,11 - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A AUTO_1D25: INC A LD HL,AUTO_29B2 @@ -2972,7 +2972,7 @@ ERR_EXIT: CALL AUTO_03C3 JP AUTO_01D3 AUTO_1D2F: - LD A,(ERR_NR) + LD A,(ZX_VARS.ERR_NR) LD HL,AUTO_27CA CP 20 JR Z,ERR_EXIT @@ -2992,14 +2992,14 @@ CMD_RUN: CALL AUTO_1852 CALL AUTO_1836 CALL SINTAX_RET - LD HL,(FL_START) - LD A,(FL_TYPE) + LD HL,(ZX_VARS.FL_START) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JP Z,AUTO_012A PUSH HL RET AUTO_1D63: - LD HL,BAS_DOS_FLG + LD HL,ZX_VARS.BAS_DOS_FLG LD A,(HL) CP #FF LD (HL),0 @@ -3069,10 +3069,10 @@ AUTO_1DC1: RST_ROM ROUTINE.expt_1num RET AUTO_1DC5: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) AUTO_1DC8: INC HL - LD (CH_ADR),HL + LD (ZX_VARS.CH_ADR),HL RET AUTO_1DCD: CALL INPUT_TXT @@ -3094,8 +3094,8 @@ AUTO_1DEB: CALL AUTO_1D7B JR Z,AUTO_1DFB CALL AUTO_1DB9 - LD (DOS_CH_ADR),BC - LD (MED_LEN),BC + LD (ZX_VARS.DOS_CH_ADR),BC + LD (ZX_VARS.MED_LEN),BC AUTO_1DFB: CALL AUTO_1D8C CP ',' @@ -3108,16 +3108,16 @@ AUTO_1E0B: CALL AUTO_1D7B RET Z CALL AUTO_1DB9 - LD (MED_LEN),BC + LD (ZX_VARS.MED_LEN),BC LD A,3 - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A RET AUTO_1E1C: - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) RST_ROM ROUTINE.remove_fp RET AUTO_1E23: - LD HL,(WORK_SP) + LD HL,(ZX_VARS.WORK_SPACE) RST_ROM ROUTINE.bc_spaces AUTO_1E29: RET @@ -3134,7 +3134,7 @@ AUTO_1E32: READ_TRK_NUM: CALL READ_ADR_LABL LD A,H - OUT (WG_TRK),A + OUT (FDC_93.Track),A RET READ_DISK: XOR A @@ -3142,10 +3142,10 @@ READ_DISK: AUTO_1E40: CALL AUTO_166B AUTO_1E43: - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) DEC DE LD B,1 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER WRITE_DISK: PUSH HL PUSH DE @@ -3162,9 +3162,9 @@ AUTO_1E60: AUTO_1E62: LD A,255 AUTO_1E64: - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A AUTO_1E67: - LD (CONT_SEC),DE + LD (ZX_VARS.CONT_SEC),DE JP R_W_REDIR ;LD (HL),30 ; НЕ исп. !!! @@ -3179,11 +3179,11 @@ AUTO_1E75: PUSH BC PUSH HL CALL save_bufer - LD A,(CONT_SEC) + LD A,(ZX_VARS.CONT_SEC) CALL save_sector - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) OR A PUSH AF CALL Z,AUTO_3F0E @@ -3194,12 +3194,12 @@ AUTO_1E75: ADD HL,DE PUSH HL LD A,16 - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC INC (HL) CP (HL) JR NZ,AUTO_1EA7 LD (HL),0 - LD HL,CONT_TRK + LD HL,ZX_VARS.CONT_TRK INC (HL) AUTO_1EA7: POP HL @@ -3221,7 +3221,7 @@ AUTO_1EAC: RET AUTO_1EBC: XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A SCF RET ; @@ -3229,9 +3229,9 @@ AUTO_1EBC: ; CMD_FORMAT: LD HL,0 - LD (MED_START),HL - LD (DOS_CH_ADR),HL - LD (AUTO_5CD1),HL + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.AUTO_5CD1),HL CALL TEST_CR JP Z,CMD_ERROR ; FORMATER ; !!!!! ( CMD_ERROR ) CALL FORM_STATE ; 1/2/3 INPUT_TXT @@ -3244,7 +3244,7 @@ AUTO_1EE0: JR Z,AUTO_1EE8 LD A,'P' AUTO_1EE8: - LD (MED_START),A + LD (ZX_VARS.MED_START),A CALL AUTO_3D98 CALL set_side_1 CALL pause_750ms @@ -3253,7 +3253,7 @@ AUTO_1EE8: CALL set_side_0 LD E,0 CALL AUTO_1FFD - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '$' JR Z,AUTO_1F1B CALL set_side_1 @@ -3263,16 +3263,16 @@ AUTO_1EE8: CP 1 JR NZ,AUTO_1F1B LD A,128 - LD (DOS_CH_ADR+1),A + LD (ZX_VARS.DOS_CH_ADR+1),A AUTO_1F1B: CALL FORM_X02 ; форматирование !!! - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD (HL),0 - LD DE,BUFER+1 + LD DE,ZX_VARS.BUFFER+1 LD BC,0FFh LDIR - LD BC,MED_START - LD DE,DOS_CH_ADR+1 + LD BC,ZX_VARS.MED_START + LD DE,ZX_VARS.DOS_CH_ADR+1 LD A,(BC) CP 'P' JR Z,AUTO_1F49 @@ -3295,37 +3295,37 @@ AUTO_1F49: LD A,22 LD HL,09F0h AUTO_1F55: - LD (TYPE_DISK),A - LD (FREE_SEC),HL + LD (ZX_VARS.TYPE_DISK),A + LD (ZX_VARS.FREE_SEC),HL LD A,1 - LD (CLEAR_TRK),A + LD (ZX_VARS.CLEAR_TRK),A LD A,16 - LD (CODE_10H),A - LD HL,DISK_MRK_1 - LD DE,DISK_ALT_NM + LD (ZX_VARS.CODE_10H),A + LD HL,ZX_VARS.DISK_MRK_1 + LD DE,ZX_VARS.DISK_ALT_NM LD BC,RST08 LD (HL),' ' LDIR - LD HL,FL_NAME - LD DE,DISK_NAME + LD HL,ZX_VARS.FL_NAME + LD DE,ZX_VARS.DISK_NAME LD BC,RST08 LDIR CALL set_side_0 LD B,1 LD DE,8 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER CALL AUTO_1E62 - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) PUSH AF XOR A - LD (FL_TYPE),A - LD HL,(FREE_SEC) - LD (MED_START),HL - LD HL,FL_NAME + LD (ZX_VARS.FL_TYPE),A + LD HL,(ZX_VARS.FREE_SEC) + LD (ZX_VARS.MED_START),HL + LD HL,ZX_VARS.FL_NAME RST PRINT_LN LD A,13 RST RST10 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) POP AF PUSH HL LD D,0 @@ -3350,31 +3350,31 @@ test_d_traks: LD A,2 CALL Goto_trk CALL pause_50ms - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 LD A,'P' JR Z,AUTO_1FE7 LD A,'(' AUTO_1FE7: - LD (MED_START),A + LD (ZX_VARS.MED_START),A RET set_side_0: - LD A,(PDOS_COPY) - OR '<' ; 3C - сторона 0 3C..3F + LD A,(ZX_VARS.PDOS_COPY) + OR #3C ; сторона 0 3C..3F AUTO_1FF0: - LD (PDOS_COPY),A - OUT (P_DOS_FF),A + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A RET set_side_1: - LD A,(PDOS_COPY) - AND 'o' ; 06Fh - сторона 1 2C..2F + LD A,(ZX_VARS.PDOS_COPY) + AND #6F ; сторона 1 2C..2F JR AUTO_1FF0 ; ld a,(pdos_copy) AUTO_1FFD: ; add a,0C0h DI ; ld d,0 LD A,244 ; rl d AUTO_2000: ; - OUT (WG_COM),A ; - LD HL,(FL_START) ; + OUT (FDC_93.Command),A ; + LD HL,(ZX_VARS.FL_START) ; LD C,127 @@ -3426,13 +3426,13 @@ FORM_TR_LOOP: INC HL CP 16 ; проверка на посл. сектор JR NZ,FORM_TR_LOOP ; если нет, то продолжать - IN A,(WG_COM) + IN A,(FDC_93.Command) AND '@' JP NZ,AUTO_3F39 LD A,216 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A ;////////////////////////////////////// @@ -3440,30 +3440,30 @@ FORM_TR_LOOP: NOP NOP AUTO_207D: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) OR A RET NZ LD C,127 LD A,E - OUT (WG_TRK),A + OUT (FDC_93.Track),A CALL SUB_HL_14 AUTO_208A: LD B,3 LD A,(HL) - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL AUTO_2090: DI LD A,128 - OUT (WG_COM),A + OUT (FDC_93.Command),A PUSH BC CALL AUTO_3FE5 - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 POP BC JR Z,AUTO_20A6 DJNZ AUTO_2090 - LD HL,DOS_ERROR + LD HL,ZX_VARS.DOS_ERROR INC (HL) AUTO_20A6: POP HL @@ -3476,7 +3476,7 @@ AUTO_20A6: AUTO_20AF: LD B,1 AUTO_20B1: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_20B1 RET M @@ -3485,7 +3485,7 @@ AUTO_20B1: RET FORMAT_ALL: - LD HL,MED_START + LD HL,ZX_VARS.MED_START LD B,(HL) CALL FORM_F01 LD E,255 @@ -3497,7 +3497,7 @@ AUTO_20C6: CALL PRINT_TRK CALL set_side_0 ; SET SIDE 0 CALL PRINT_SIDE0 ; FORMATING ! - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) CP 128 JR NZ,AUTO_20E1 CALL set_side_1 ; SET SIDE 1 @@ -3509,25 +3509,25 @@ AUTO_20E1: AUTO_20E5: PUSH AF - LD A,(DISK_1_FLG) + LD A,(ZX_VARS.DISK_1_FLG) CP 255 JR Z,AUTO_211C POP AF CALL BUFER_OFF xchg_intf1: PUSH AF - LD A,(BEG_ADRESS) + LD A,(ZX_VARS.BEG_ADRESS) CP 244 JR Z,AUTO_211C XOR A - LD HL,INT_1_VAR + LD HL,ZX_VARS.INT_1_VAR OR (HL) LD (HL),255 JR Z,AUTO_211C - LD A,(BUF_FLAG) + LD A,(ZX_VARS.BUF_FLAG) OR A - LD HL,AUTO_5CC3 - LD DE,AUTO_5D33 + LD HL,ZX_VARS.AUTO_5CC3 + LD DE,ZX_VARS.AUTO_5D33 JR NZ,AUTO_2111 LD DE,AUTO_5E34 AUTO_2111: @@ -3547,29 +3547,29 @@ AUTO_211C: RET AUTO_211E: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),13 - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL INC HL LD (HL),128 RET AUTO_212A: - LD DE,(E_LINE) - LD HL,COM_LN_COPY + LD DE,(ZX_VARS.E_LINE) + LD HL,ZX_VARS.COM_LN_COPY CALL AUTO_02B0 RET INPUT_LINE: - LD A,(DOS_ERR_2) + LD A,(ZX_VARS.DOS_ERR_2) OR A PUSH AF CALL NZ,AUTO_212A POP AF CALL Z,AUTO_211E - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) CALL PRINT_CR - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) ADD A,'A' RST RST10 LD A,'>' @@ -3582,25 +3582,25 @@ AUTO_2158: CALL AUTO_1D8C CP ',' JP NZ,CMD_ERROR - LD HL,(MED_LEN) - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_1E0B CALL SINTAX_RET - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) LD A,H OR A JP NZ,CMD_ERROR INC HL - LD (MED_START),HL - LD HL,(DOS_CH_ADR) - LD (MED_LEN),HL + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) + LD (ZX_VARS.MED_LEN),HL RET ; ; ; CMD_OPEN: - LD HL,(ADR_DOS_COM) - LD (CH_ADR),HL + LD HL,(ZX_VARS.ADR_DOS_COM) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL AUTO_1DD0 AUTO_218E: @@ -3621,12 +3621,12 @@ AUTO_219A: CP 'W' JP NZ,CMD_ERROR AUTO_21AE: - LD (VAR_3),A + LD (ZX_VARS.VAR_3),A CALL SINTAX_RET LD A,'#' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A LD A,0 - LD (FL_START),A + LD (ZX_VARS.FL_START),A CALL AUTO_21DB PUSH AF CALL AUTO_220F @@ -3635,28 +3635,28 @@ AUTO_21AE: CALL NZ,AUTO_2288 POP AF CALL AUTO_2242 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0124 ADD HL,BC - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL JP AUTO_01D3 AUTO_21DB: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_1CB0 PUSH AF CALL RD_HEAD_DSK POP AF JR NZ,AUTO_2206 - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' JR Z,AUTO_2201 AUTO_21F1: - LD HL,FL_START + LD HL,ZX_VARS.FL_START INC (HL) CALL AUTO_1CB3 JR Z,AUTO_21F1 - LD HL,FL_START + LD HL,ZX_VARS.FL_START DEC (HL) CALL AUTO_1CB3 AUTO_2201: @@ -3664,12 +3664,12 @@ AUTO_2201: XOR A RET AUTO_2206: - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' RET NZ JP AUTO_03D9 AUTO_220F: - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) RST_ROM ROUTINE.str_data1 LD A,B OR C @@ -3677,7 +3677,7 @@ AUTO_220F: RET AUTO_221B: LD A,25 - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A LD HL,AUTO_2804 LD A,10 AUTO_2225: @@ -3690,7 +3690,7 @@ AUTO_222F: PUSH HL LD C,' ' RST RST28 - LD A,(MED_START) + LD A,(ZX_VARS.MED_START) LD (HL),A INC HL XOR A @@ -3706,19 +3706,19 @@ AUTO_2242: PUSH AF CALL AUTO_220F EX DE,HL - LD HL,(BAS_PROG) - LD BC,(CHANS) + LD HL,(ZX_VARS.BAS_PROG) + LD BC,(ZX_VARS.CHANS) SBC HL,BC EX DE,HL LD (HL),E INC HL LD (HL),D CALL AUTO_22B2 - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 165 CALL Z,AUTO_222F JR Z,AUTO_226B - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' LD A,255 JR NZ,AUTO_226B @@ -3744,27 +3744,27 @@ AUTO_2270: CALL Z,READ_DISK RET AUTO_2288: - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) PUSH HL LD HL,AUTO_2000 - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL CALL AUTO_229A POP HL - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL RET AUTO_229A: LD HL,AUTO_1000 - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_1AC4 CALL AUTO_1B59 LD HL,0 - LD (FL_LEN),HL + LD (ZX_VARS.FL_LEN),HL CALL AUTO_166B JP AUTO_1E43 AUTO_22B2: - LD HL,(BAS_PROG) + LD HL,(ZX_VARS.BAS_PROG) DEC HL - LD (CUR_CHL),HL + LD (ZX_VARS.CUR_CHL),HL PUSH HL LD BC,AUTO_0124 CALL AUTO_1E32 @@ -3796,23 +3796,23 @@ AUTO_22C4: INC HL LD (HL),1 INC HL - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD (HL),A INC HL - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A INC HL - LD A,(VAR_3) + LD A,(ZX_VARS.VAR_3) CP 'R' LD (HL),0 JR Z,AUTO_22FC - LD A,(FL_LEN) + LD A,(ZX_VARS.FL_LEN) LD (HL),A AUTO_22FC: INC HL LD (HL),B JR Z,AUTO_2304 - LD A,(FL_LEN+1) + LD A,(ZX_VARS.FL_LEN+1) LD (HL),A AUTO_2304: INC HL @@ -3822,7 +3822,7 @@ AUTO_2304: LD DE,RST10 ADD HL,DE EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR POP HL @@ -3839,7 +3839,7 @@ AUTO_2321: LD C,'$' RST28_EXE: LD B,0 - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) ADD HL,BC RET AUTO_232A: @@ -3866,7 +3866,7 @@ AUTO_232A: CP 127 POP HL JR Z,AUTO_2358 - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) CALL AUTO_26E1 LD C,14 RST RST28 @@ -3889,24 +3889,24 @@ AUTO_2367: RET AUTO_2370: CALL AUTO_2367 - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE JR AUTO_2381 AUTO_2379: CALL AUTO_2367 INC E - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE AUTO_2381: CALL AUTO_229A CALL BUFER_OFF LD C,16 RST RST28 EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR LD C,12 RST RST28 - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A RET AUTO_239B: @@ -3951,7 +3951,7 @@ AUTO_23CF: INC (HL) LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_1CB3 @@ -3961,12 +3961,12 @@ AUTO_23E4: LD C,16 RST RST28 EX DE,HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,RST10 LDIR LD C,12 RST RST28 - LD A,(FL_NUMBER) + LD A,(ZX_VARS.FL_NUMBER) LD (HL),A XOR A RET @@ -3994,7 +3994,7 @@ AUTO_2418: LD B,1 JP READ_DISK AUTO_2423: - LD HL,(CUR_CHL) + LD HL,(ZX_VARS.CUR_CHL) LD BC,AUTO_001E ADD HL,BC LD E,(HL) @@ -4025,14 +4025,14 @@ AUTO_2443: LD A,(HL) JP SET_DISK AUTO_244A: - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL LD HL,xchg_intf1 PUSH HL PUSH AF CALL xchg_intf1 LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A POP AF CALL AUTO_24A2 PUSH AF @@ -4057,7 +4057,7 @@ AUTO_246E: ADD HL,BC CP (HL) RET NZ - LD HL,BEG_ADRESS + LD HL,ZX_VARS.BEG_ADRESS LD A,(HL) CP 244 JR Z,AUTO_2492 @@ -4069,7 +4069,7 @@ AUTO_246E: AUTO_2492: LD A,7 AUTO_2494: - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A CALL AUTO_20E5 RST_ROM ROUTINE.error_4 RET @@ -4105,7 +4105,7 @@ AUTO_24C2: LD C,(HL) LD A,D EX DE,HL - LD HL,(VAR_1) + LD HL,(ZX_VARS.VAR_1) ADD HL,BC CP 6 LD (HL),A @@ -4148,23 +4148,23 @@ AUTO_24F2: LD A,D RET AUTO_24F8: - LD HL,(WORK_SP) - LD (VAR_1),HL + LD HL,(ZX_VARS.WORK_SPACE) + LD (ZX_VARS.VAR_1),HL LD BC,RST10 JP AUTO_1E23 AUTO_2504: LD (HL),13 - LD HL,(CH_ADR) - LD (MED_START),HL - LD HL,(VAR_1) - LD (CH_ADR),HL - LD HL,FLAGS + LD HL,(ZX_VARS.CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.CH_ADR),HL + LD HL,ZX_VARS.FLAGS RES 7,(HL) CALL AUTO_1DC1 - LD HL,FLAGS + LD HL,ZX_VARS.FLAGS SET 7,(HL) - LD HL,(VAR_1) - LD (CH_ADR),HL + LD HL,(ZX_VARS.VAR_1) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1DC1 CALL AUTO_1DB9 PUSH BC @@ -4174,25 +4174,25 @@ AUTO_2504: LD B,(HL) XOR A LD HL,0 - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL AUTO_2538: ADD HL,DE JR NC,AUTO_2544 PUSH HL - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) INC HL - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL AUTO_2544: DJNZ AUTO_2538 - LD (DOS_CH_ADR),HL - LD A,(MED_LEN) - LD HL,DOS_CH_ADR+1 + LD (ZX_VARS.DOS_CH_ADR),HL + LD A,(ZX_VARS.MED_LEN) + LD HL,ZX_VARS.DOS_CH_ADR+1 RRD AND 15 - LD (MED_LEN),A - LD HL,(MED_START) - LD (CH_ADR),HL + LD (ZX_VARS.MED_LEN),A + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_2568 LD C,'!' RST RST28 @@ -4204,30 +4204,30 @@ AUTO_2544: AUTO_2568: LD C,25 RST RST28 - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) CP (HL) JP NZ,AUTO_2584 LD C,14 RST RST28 - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) CP (HL) JP NZ,AUTO_25A7 AUTO_257C: LD C,13 RST RST28 - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A RET AUTO_2584: CALL AUTO_25CA CALL NZ,AUTO_25C3 - LD A,(DOS_CH_ADR+1) + LD A,(ZX_VARS.DOS_CH_ADR+1) LD C,25 RST RST28 LD (HL),A LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_1CB3 @@ -4238,7 +4238,7 @@ AUTO_25A7: CALL AUTO_25CA CALL NZ,AUTO_25C3 AUTO_25AD: - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) LD C,14 RST RST28 LD (HL),A @@ -4247,7 +4247,7 @@ AUTO_25AD: CALL AUTO_2418 POP HL DEC HL - LD A,(DOS_CH_ADR) + LD A,(ZX_VARS.DOS_CH_ADR) LD (HL),A JR AUTO_257C AUTO_25C3: @@ -4262,24 +4262,24 @@ AUTO_25CA: LD (HL),0 RET AUTO_25D2: - LD HL,(DOS_CH_ADR+1) + LD HL,(ZX_VARS.DOS_CH_ADR+1) LD H,' ' - LD (MED_START),HL - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) PUSH HL - LD HL,(MED_LEN) + LD HL,(ZX_VARS.MED_LEN) PUSH HL CALL AUTO_2381 POP HL - LD (MED_LEN),HL + LD (ZX_VARS.MED_LEN),HL POP HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL JR AUTO_25AD AUTO_25EF: CALL xchg_intf1 - LD HL,TV_FLAG + LD HL,ZX_VARS.TV_FLAG RES 3,(HL) - LD HL,(ERR_SP) + LD HL,(ZX_VARS.ERR_SP) LD E,(HL) INC HL LD D,(HL) @@ -4287,15 +4287,15 @@ AUTO_25EF: LD HL,AUTO_107F SBC HL,DE JR NZ,AUTO_2626 - LD SP,(ERR_SP) + LD SP,(ZX_VARS.ERR_SP) POP DE POP DE - LD (ERR_SP),DE + LD (ZX_VARS.ERR_SP),DE AUTO_260F: CALL AUTO_262B JR C,AUTO_261D AUTO_2614: - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL LD HL,AUTO_20E5 PUSH HL @@ -4310,7 +4310,7 @@ AUTO_2626: JR AUTO_2614 AUTO_262B: LD A,10 - LD (S_NAME_NUM),A + LD (ZX_VARS.S_NAME_NUM),A CALL AUTO_2650 JR Z,AUTO_2642 CP 127 @@ -4339,17 +4339,17 @@ AUTO_2650: ; ; CMD_CLOSE: - LD HL,(ADR_DOS_COM) - LD (CH_ADR),HL + LD HL,(ZX_VARS.ADR_DOS_COM) + LD (ZX_VARS.CH_ADR),HL CALL AUTO_1E0B CALL SINTAX_RET - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) RST_ROM ROUTINE.str_data1 LD A,B OR C JP Z,AUTO_01D3 PUSH HL - LD HL,(CHANS) + LD HL,(ZX_VARS.CHANS) ADD HL,BC LD A,(HL) LD HL,AUTO_3D0E @@ -4359,20 +4359,20 @@ CMD_CLOSE: LD (HL),0 INC HL LD (HL),0 - LD (DOS_CH_ADR),BC - LD HL,(CHANS) + LD (ZX_VARS.DOS_CH_ADR),BC + LD HL,(ZX_VARS.CHANS) ADD HL,BC DEC HL - LD (MED_START),HL + LD (ZX_VARS.MED_START),HL CALL AUTO_26CE - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) LD BC,AUTO_0124 CALL AUTO_1E2E - LD HL,REP_K_TYME + LD HL,ZX_VARS.REP_K_TYME LD B,16 AUTO_269D: PUSH BC - LD BC,(DOS_CH_ADR) + LD BC,(ZX_VARS.DOS_CH_ADR) LD E,(HL) INC HL LD D,(HL) @@ -4398,10 +4398,10 @@ AUTO_26BC: INC HL POP BC DJNZ AUTO_269D - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0124 SBC HL,BC - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL JP AUTO_01D3 AUTO_26CE: LD BC,CONT_1+6 @@ -4409,8 +4409,8 @@ AUTO_26CE: LD A,(HL) OR A RET Z - LD HL,(MED_START) - LD (CUR_CHL),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.CUR_CHL),HL CALL AUTO_26E1 JP AUTO_23FC AUTO_26E1: @@ -4426,7 +4426,7 @@ AUTO_26E1: LD (HL),D LD C,16 RST RST28 - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 LDIR CALL AUTO_2443 @@ -4467,32 +4467,32 @@ set_error_26: JR AUTO_2731 LD A,18 AUTO_2731: - LD (ERR_NR),A + LD (ZX_VARS.ERR_NR),A RET LD A,3 JR AUTO_2731 AUTO_2739: XOR A - LD (MED_START+1),A - LD (DOS_ERROR),A - IN A,(WG_COM) - LD (DRV_READY),A + LD (ZX_VARS.MED_START+1),A + LD (ZX_VARS.DOS_ERROR),A + IN A,(FDC_93.Command) + LD (ZX_VARS.DRV_READY),A LD E,D PUSH DE LD A,E - OUT (WG_DATA),A + OUT (FDC_93.Data),A LD A,24 CALL WG93_EXE - LD A,(DRV_READY) + LD A,(ZX_VARS.DRV_READY) AND 128 CALL NZ,pause_750ms POP DE CALL AUTO_207D - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A RET Z LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A RET AUTO_2766: DB "O.K.",0 @@ -4528,19 +4528,19 @@ AUTO_2820: AUTO_283C: PUSH AF PUSH BC - LD (WORK_4),DE - LD (WORK_2),HL + LD (ZX_VARS.WORK_4),DE + LD (ZX_VARS.WORK_2),HL CALL xchg_intf1 LD A,255 - LD (MSG_FLAG),A - LD (FL_NUMBER+1),A + LD (ZX_VARS.MSG_FLAG),A + LD (ZX_VARS.FL_NUMBER+1),A POP BC POP AF LD HL,AUTO_0201 - LD (ADR_RET),HL + LD (ZX_VARS.ADR_RET),HL LD HL,0 ADD HL,SP - LD (DOS_SP),HL + LD (ZX_VARS.DOS_SP),HL DEC HL DEC HL LD SP,HL @@ -4559,8 +4559,8 @@ AUTO_2869: LD HL,AUTO_01D3 PUSH HL PUSH DE - LD HL,(WORK_2) - LD DE,(WORK_4) + LD HL,(ZX_VARS.WORK_2) + LD DE,(ZX_VARS.WORK_4) RET AUTO_287F: CP 255 @@ -4635,7 +4635,7 @@ AUTO_28E0: AUTO_28E3: LD A,255 AUTO_28E5: - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,RST10 OR A JR Z,AUTO_28EF @@ -4648,18 +4648,18 @@ AUTO_28F2: CALL AUTO_1AC4 JP AUTO_1B27 AUTO_28FB: - LD (MED_START),HL - LD (DOS_CH_ADR),DE - LD (MED_LEN),DE + LD (ZX_VARS.MED_START),HL + LD (ZX_VARS.DOS_CH_ADR),DE + LD (ZX_VARS.MED_LEN),DE JP TYPE_FL_X02 CALL AUTO_1AC4 ; ??? JP FORM_X04 ; ??? AUTO_290F: OR A - LD (DOS_ERROR),A - LD (DOS_CH_ADR),HL - LD (MED_LEN),DE + LD (ZX_VARS.DOS_ERROR),A + LD (ZX_VARS.DOS_CH_ADR),HL + LD (ZX_VARS.MED_LEN),DE CALL AUTO_1CB3 CALL AUTO_18A4 CALL AUTO_18AB @@ -4693,7 +4693,7 @@ BUFER_ON: PUSH DE PUSH BC PUSH AF - LD HL,BUF_FLAG + LD HL,ZX_VARS.BUF_FLAG LD A,(HL) OR A JR Z,AUTO_2992 @@ -4704,9 +4704,9 @@ BUFER_ON: POP BC POP HL LD (HL),0 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER CALL AUTO_1E32 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) LD BC,AUTO_0100+1 ADD HL,BC JR AUTO_298F @@ -4715,20 +4715,20 @@ BUFER_OFF: PUSH DE PUSH BC PUSH AF - LD HL,BUF_FLAG + LD HL,ZX_VARS.BUF_FLAG LD A,(HL) OR A JR NZ,AUTO_2992 LD (HL),255 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD BC,AUTO_0100+1 CALL AUTO_1E2E OR A LD BC,AUTO_0100+1 - LD HL,(ADR_DOS_COM) + LD HL,(ZX_VARS.ADR_DOS_COM) SBC HL,BC AUTO_298F: - LD (ADR_DOS_COM),HL + LD (ZX_VARS.ADR_DOS_COM),HL AUTO_2992: POP AF POP BC @@ -4743,12 +4743,12 @@ CMD_40: XOR A ; ;Ошибка!!! Во-первых, почему дисковод односторонний? ; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. AUTO_2998: - LD (MED_START),A ;сохранение типа дисковода + LD (ZX_VARS.MED_START),A ;сохранение типа дисковода CALL SINTAX_RET ;если идет проверка на синтакси CALL TEST_CR ;проверка второго символа строк JP Z,CMD_ERROR ;если это ENTER, то *ERROR* CALL get_disk_type ;берем адрес ячейки с типом дис - LD A,(MED_START) ;установка типа дисковода + LD A,(ZX_VARS.MED_START) ;установка типа дисковода LD (HL),A JP AUTO_03E1 ;сообщение O.K. ; Выполнение команды "80". Установите #5D11 и #5C3B. @@ -4790,7 +4790,7 @@ AUTO_2A41: JR Z,AUTO_2A4B XOR A AUTO_2A4B: - LD (K_STATE+1),A + LD (ZX_VARS.K_STATE+1),A LD BC,PORT_128 LD A,16 OUT (C),A @@ -4817,15 +4817,15 @@ AUTO_2A56: ADD HL,SP PUSH HL LD A,3Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A LD A,'?' LD I,A - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 128 RRCA RRCA RRCA - LD (K_STATE+1),A + LD (ZX_VARS.K_STATE+1),A CALL AUTO_2F65 CALL pause_750ms CALL pause_750ms @@ -4842,7 +4842,7 @@ AUTO_2A56: CALL AUTO_2F1B LD HL,AUTO_40E3 LD A,(HL) - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A INC HL LD A,(HL) INC (HL) @@ -4867,7 +4867,7 @@ AUTO_2A56: CALL AUTO_2D4C PUSH DE LD A,3Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A CALL AUTO_2F65 LD HL,AUTO_4000 LD DE,RST08 @@ -4908,7 +4908,7 @@ AUTO_2B09: LD (HL),D LD HL,AUTO_4000 LD DE,0 - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD B,1 @@ -4943,7 +4943,7 @@ AUTO_2B58: LD A,170 LD (AUTO_4130),A LD D,5 - LD A,(K_STATE+1) + LD A,(ZX_VARS.K_STATE+1) OR D LD D,A OUT (C),D @@ -5022,7 +5022,7 @@ AUTO_2B95: LD BC,RST10 EX DE,HL LDIR - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD D,0 @@ -5127,7 +5127,7 @@ AUTO_2C7E: LD BC,RST10 EX DE,HL LDIR - IN A,(WG_SEC) + IN A,(FDC_93.Sector) DEC A LD E,A LD D,0 @@ -5224,7 +5224,7 @@ AUTO_2D6F: AUTO_2D73: LD A,E INC A - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL LD D,20 PUSH DE @@ -5232,11 +5232,11 @@ AUTO_2D7B: DI LD C,127 LD A,160 - OUT (WG_COM),A + OUT (FDC_93.Command),A CALL AUTO_3FCA POP DE POP HL - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 RET Z DEC D @@ -5245,9 +5245,9 @@ AUTO_2D7B: JR NZ,AUTO_2D7B HALT AUTO_2D92: - LD HL,(FL_START) - LD DE,(FL_PLACE) - LD A,(FL_SIZE) + LD HL,(ZX_VARS.FL_START) + LD DE,(ZX_VARS.FL_PLACE) + LD A,(ZX_VARS.FL_SIZE) LD B,A CALL READ_DISK RET @@ -5266,7 +5266,7 @@ CMD_GOTO: CALL RD_HEAD_DSK CALL AUTO_1CB3 JP NZ,AUTO_03D9 - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),'8' @@ -5293,7 +5293,7 @@ AUTO_2DE3: OUT (C),A POP AF ADD A,'0' - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),A @@ -5305,7 +5305,7 @@ AUTO_2E05: POP BC DJNZ AUTO_2DE3 LD A,' ' - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD BC,(AUTO_4020) ADD HL,BC LD (HL),A @@ -5327,7 +5327,7 @@ AUTO_2E33: JP NZ,AUTO_03D9 CALL AUTO_165D AUTO_2E39: - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) CP '$' DI JR NZ,AUTO_2E43 @@ -5336,11 +5336,11 @@ AUTO_2E43: LD SP,AUTO_40F0 CALL get_disk_type LD (AUTO_4010),A - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) LD (AUTO_4011),A - LD HL,(FL_START) + LD HL,(ZX_VARS.FL_START) PUSH HL - LD DE,(FL_PLACE) + LD DE,(ZX_VARS.FL_PLACE) PUSH DE INC E LD A,E @@ -5407,7 +5407,7 @@ AUTO_2EBC: JP PO,AUTO_2ECC LD A,0 AUTO_2ECC: - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A POP AF POP HL POP DE @@ -5419,35 +5419,35 @@ AUTO_2ECC: POP HL POP DE POP BC - LD A,(BORDER) + LD A,(ZX_VARS.BORDER) AND '8' RRCA RRCA RRCA OUT (0FEH),A - LD A,(AUTO_5B08) + LD A,(ZX_VARS.AUTO_5B08) CP 238 JR NZ,AUTO_2EF7 PUSH BC LD BC,PORT_128 - LD A,(AUTO_5B5C) + LD A,(ZX_VARS.AUTO_5B5C) OUT (C),A POP BC AUTO_2EF7: - LD A,(K_STATE) + LD A,(ZX_VARS.K_STATE) OR A LD A,201 - LD (K_STATE),A + LD (ZX_VARS.K_STATE),A JR NZ,AUTO_2F03 EI AUTO_2F03: POP AF - JP K_STATE + JP ZX_VARS.K_STATE AUTO_2F07: LD A,(AUTO_4011) OR 3Ch AUTO_2F0C: - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A RET AUTO_2F0F: LD A,C @@ -5461,7 +5461,7 @@ AUTO_2F0F: AUTO_2F1B: LD A,E INC A - OUT (WG_SEC),A + OUT (FDC_93.Sector),A PUSH HL LD D,20 PUSH DE @@ -5469,11 +5469,11 @@ AUTO_2F23: DI LD C,127 LD A,128 - OUT (WG_COM),A + OUT (FDC_93.Command),A CALL AUTO_3FE5 POP DE POP HL - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 127 RET Z DEC D @@ -5483,8 +5483,8 @@ AUTO_2F23: HALT AUTO_2F3A: LD A,3Ch - OUT (P_DOS_FF),A - LD A,(K_STATE) + OUT (FDC_93.DrvCTRL),A + LD A,(ZX_VARS.K_STATE) AND 8 JR NZ,AUTO_2F4F LD A,C @@ -5493,17 +5493,17 @@ AUTO_2F3A: LD C,A JR NC,AUTO_2F4F LD A,2Ch - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A AUTO_2F4F: LD A,C AUTO_2F50: - OUT (WG_DATA),A + OUT (FDC_93.Data),A CALL pause_50ms LD A,24 AUTO_2F57: - OUT (WG_COM),A + OUT (FDC_93.Command),A AUTO_2F59: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 128 JR Z,AUTO_2F59 PUSH BC @@ -5514,7 +5514,7 @@ AUTO_2F65: LD A,8 JR AUTO_2F57 AUTO_2F69: - LD HL,(DOS_SP) + LD HL,(ZX_VARS.DOS_SP) DEC HL DEC HL LD SP,HL @@ -5523,8 +5523,8 @@ AUTO_2F69: ; RST20 procedure ; RST20_EXE: - LD (WORK_2),HL - LD (WORK_4),DE + LD (ZX_VARS.WORK_2),HL + LD (ZX_VARS.WORK_4),DE POP HL LD E,(HL) INC HL @@ -5534,36 +5534,36 @@ RST20_EXE: LD HL,AUTO_3D2F PUSH HL PUSH DE - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS PUSH HL - LD HL,(WORK_2) - LD DE,(WORK_4) + LD HL,(ZX_VARS.WORK_2) + LD DE,(ZX_VARS.WORK_4) RET ; ; INIT DOS VARS ; AUTO_2F90: ; INIT DATA DOS LD HL,0FFFFh - LD (TIME_A),HL - LD (TIME_C),HL - LD (DISK_C),HL + LD (ZX_VARS.TIME_A),HL + LD (ZX_VARS.TIME_C),HL + LD (ZX_VARS.DISK_C),HL CALL INIT_2X80_1 ; *** !!! *** -; LD (DISK_A),HL +; LD (ZX_VARS.DISK_A),HL XOR A - LD (FLAG_BOOT),A - LD (CONT_DISK),A - LD (INT_1_VAR),A - LD (DOS_ERR_2),A - LD (FL_NUMBER+1),A + LD (ZX_VARS.FLAG_BOOT),A + LD (ZX_VARS.CONT_DISK),A + LD (ZX_VARS.INT_1_VAR),A + LD (ZX_VARS.DOS_ERR_2),A + LD (ZX_VARS.FL_NUMBER+1),A LD A,255 - OUT (P_DOS_FF),A - LD (ERR_NR),A - LD (PDOS_COPY),A - LD (BUF_FLAG),A + OUT (FDC_93.DrvCTRL),A + LD (ZX_VARS.ERR_NR),A + LD (ZX_VARS.PDOS_COPY),A + LD (ZX_VARS.BUF_FLAG),A LD A,201 - LD (RET_INS),A + LD (ZX_VARS.RET_INS),A LD A,0D0h - OUT (WG_COM),A + OUT (FDC_93.Command),A RET ; ; @@ -5582,18 +5582,18 @@ AUTO_2FC6: ; AUTO_2FD6: LD B,1 - LD HL,BUFER + LD HL,ZX_VARS.BUFFER JP AUTO_1E67 AUTO_2FDE: PUSH HL - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) CALL AUTO_2FD6 - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) POP DE OR A RET Z LD C,A - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LDIR RET @@ -5663,27 +5663,27 @@ TRDOS_CMD: ; ; AUTO_3032: - LD HL,(E_LINE) - LD (ADR_DOS_COM),HL - LD (DOS_CH_ADR),HL + LD HL,(ZX_VARS.E_LINE) + LD (ZX_VARS.ADR_DOS_COM),HL + LD (ZX_VARS.DOS_CH_ADR),HL LD A,255 - LD (DOS_ERROR),A - LD HL,MED_LEN + LD (ZX_VARS.DOS_ERROR),A + LD HL,ZX_VARS.MED_LEN JR AUTO_3054 -; LD (MED_START),HL ; 3 байта заняты списком команд +; LD (ZX_VARS.MED_START),HL ; 3 байта заняты списком команд ; nop ; nop ; nop AUTO_3048: - LD (ADR_DOS_COM),HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.ADR_DOS_COM),HL + LD (ZX_VARS.DOS_CH_ADR),HL CALL AUTO_30E1 RET NZ INC HL INC HL AUTO_3054: JP REDIR_LINE_CODING -; LD (MED_START),HL +; LD (ZX_VARS.MED_START),HL AUTO_3057: ; преобразование командной строки !!! CALL AUTO_30A9 ; поиск слова JR NZ,AUTO_3087 ; если нет, выход @@ -5693,7 +5693,7 @@ AUTO_3057: ; LD HL,AUTO_31C8 ADD HL,BC LD A,(HL) - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD (HL),A INC HL EX DE,HL @@ -5701,10 +5701,10 @@ AUTO_3057: ; PUSH BC RST_ROM ROUTINE.reclaim_2 POP BC - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) OR A JR NZ,AUTO_3087 - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) LD E,(HL) INC HL LD D,(HL) @@ -5716,12 +5716,12 @@ AUTO_3057: ; DEC HL LD (HL),E AUTO_3087: - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,(HL) CP 13 RET Z INC HL ; следующее слово - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL LD A,(HL) CP 13 RET Z @@ -5735,10 +5735,10 @@ AUTO_309A: CP '"' JR NZ,AUTO_309A INC HL - LD (DOS_CH_ADR),HL + LD (ZX_VARS.DOS_CH_ADR),HL JR AUTO_3057 AUTO_30A9: - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) LD DE,AUTO_30FD LD C,0 AUTO_30B1: @@ -5766,7 +5766,7 @@ AUTO_30C8: RET Z AUTO_30CD: INC C - LD HL,(DOS_CH_ADR) + LD HL,(ZX_VARS.DOS_CH_ADR) INC DE LD A,(DE) CP 255 @@ -5780,22 +5780,22 @@ AUTO_30D9: JR Z,AUTO_30D9 JR AUTO_30CD AUTO_30E1: - LD HL,(PPC) + LD HL,(ZX_VARS.PPC) INC HL INC HL LD A,H OR L JR Z,AUTO_30F4 XOR A - LD (DOS_ERROR),A + LD (ZX_VARS.DOS_ERROR),A DEC HL DEC HL RST_ROM ROUTINE.line_addr RET AUTO_30F4: LD A,255 - LD (DOS_ERROR),A - LD HL,(E_LINE) + LD (ZX_VARS.DOS_ERROR),A + LD HL,(ZX_VARS.E_LINE) RET ; ; @@ -5860,37 +5860,34 @@ AUTO_31C8: ; ; ; -AUTO_31F3: BLOCK #31F3 - $,255 - LD HL,(CHANS) +AUTO_31F3: + LD HL,(ZX_VARS.CHANS) OR A - LD BC,BUFER + LD BC,ZX_VARS.BUFFER SBC HL,BC RET - RST R38 - RST R38 - RST R38 -; -; -; + + + BLOCK #3200-$,#FF INIT_2X80: JP AUTO_106E INIT_2X80_1: XOR A - LD (OPER_DISK),A - LD A,3Ch - LD (PDOS_COPY),A - OUT (P_DOS_FF),A - LD HL,8383h - LD (DISK_A),HL - LD (DISK_B),HL - LD (DISK_C),HL - LD (DISK_D),HL - LD HL,303H - LD (TIME_A),HL - LD (TIME_B),HL - LD (TIME_C),HL - LD (TIME_D),HL + LD (ZX_VARS.OPER_DISK),A + LD A,#3C + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A + LD HL,#8383 + LD (ZX_VARS.DISK_A),HL + LD (ZX_VARS.DISK_B),HL + LD (ZX_VARS.DISK_C),HL + LD (ZX_VARS.DISK_D),HL + LD HL,#0303 + LD (ZX_VARS.TIME_A),HL + LD (ZX_VARS.TIME_B),HL + LD (ZX_VARS.TIME_C),HL + LD (ZX_VARS.TIME_D),HL ; CALL INIT_SYS_PAGE RET ; @@ -5898,7 +5895,7 @@ INIT_2X80_1: ; LOAD_CR: LD A,13 - LD (COM_LN_COPY),A + LD (ZX_VARS.COM_LN_COPY),A JP AUTO_021D ; ; @@ -5909,9 +5906,9 @@ PRINT_TRK: PUSH AF PUSH DE LD A,207 - LD (SCR_PL_L),A + LD (ZX_VARS.SCR_PL_L),A LD A,15 - LD (SCR_POS_L),A + LD (ZX_VARS.SCR_POS_L),A LD A,E JR CONV1 ; @@ -5969,7 +5966,7 @@ MSG_AT00: FORM_STATE: CALL INPUT_TXT CALL SINTAX_RET - LD HL,(CH_ADR) + LD HL,(ZX_VARS.CH_ADR) LD A,(HL) CP '"' JR NZ,FORM_NO_NEXT @@ -5984,13 +5981,13 @@ FORM_NO_NEXT: CP ' ' JP C,CMD_ERROR AND #DF - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A RET ; ; FORM_F01: INC HL - LD A,(FL_LEN) + LD A,(ZX_VARS.FL_LEN) LD (HL),A XOR A RET @@ -6006,9 +6003,9 @@ PRINT_SIDE0: PR_SIDE_X: PUSH AF LD A,219 - LD (SCR_PL_L),A + LD (ZX_VARS.SCR_PL_L),A LD A,27 - LD (SCR_POS_L),A + LD (ZX_VARS.SCR_POS_L),A POP AF RST RST10 POP AF @@ -6035,12 +6032,12 @@ PAUSE_X01: PRINT_NAME: - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) ADD A,'A' RST RST10 LD A,':' RST RST10 - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME JP AUTO_2938 @@ -6057,7 +6054,7 @@ REWR_CONT1: SET_7_TYPE: CALL AUTO_165D - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE SET 7,(HL) RET @@ -6072,7 +6069,7 @@ FORM_X02: RET FORM_X03: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CP 15H CALL AUTO_1C57 CALL AUTO_1D97 @@ -6083,7 +6080,7 @@ FORM_X03: FORM_X04: CALL AUTO_106E - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) AND A JR NZ,FORM_NO_Q CALL DISK_REDIR @@ -6098,7 +6095,7 @@ FORM_X05: AND A JP Z,AUTO_01D3 FORM_NO_Q: - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A SUB 11H JR Z,F_ORIGINAL JR C,FORM_X05 @@ -6115,8 +6112,8 @@ F_ORIGINAL: ; Original FORMAT FORM_X07: XOR A FORM_X08: - LD (FL_LEN),A - LD (FL_START),HL + LD (ZX_VARS.FL_LEN),A + LD (ZX_VARS.FL_START),HL CALL LOW_CLS_AT00 RET @@ -6147,7 +6144,7 @@ LOW_CLS_AT00: JP PRINT_LINE TYPE_FL_X00: - LD A,(FL_TYPE) + LD A,(ZX_VARS.FL_TYPE) CP 'B' JR Z,TYPE_FL_X01 CP 'D' @@ -6155,9 +6152,9 @@ TYPE_FL_X00: CP '#' JR Z,TYPE_FL_X01 LD A,'C' - LD (FL_TYPE),A + LD (ZX_VARS.FL_TYPE),A TYPE_FL_X01: - LD A,(DOS_ERROR) + LD A,(ZX_VARS.DOS_ERROR) RET @@ -6170,7 +6167,7 @@ TYPE_FL_X03: JP AUTO_1B53 OWERWR_X01: - LD HL,FL_TYPE + LD HL,ZX_VARS.FL_TYPE BIT 7,(HL) JR NZ,OWERWR_X02 JP AUTO_1B59 @@ -6178,34 +6175,34 @@ OWERWR_X02: RES 7,(HL) CALL OWERWR_1 JP NZ,AUTO_01D3 - LD DE,(DOS_CH_ADR) + LD DE,(ZX_VARS.DOS_CH_ADR) LD A,E OR A JR Z,OWERWR_X03 INC D OWERWR_X03: - LD A,(FL_SIZE) + LD A,(ZX_VARS.FL_SIZE) CP D JR NC,OWERWR_X04 CALL AUTO_2926 JR TYPE_FL_X03 OWERWR_X04: LD B,D - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),170 INC HL - LD DE,(AUTO_5CD1) + LD DE,(ZX_VARS.AUTO_5CD1) LD (HL),E INC HL LD (HL),D LD C,6 - LD HL,(MED_LEN) - LD (FL_LEN),HL - LD HL,(MED_START) - LD (FL_START),HL - LD DE,(FL_PLACE) + LD HL,(ZX_VARS.MED_LEN) + LD (ZX_VARS.FL_LEN),HL + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_START),HL + LD DE,(ZX_VARS.FL_PLACE) CALL WRITE_DISK - LD BC,(FL_NUMBER) + LD BC,(ZX_VARS.FL_NUMBER) CALL AUTO_1BBF CALL AUTO_1665 RET @@ -6218,12 +6215,12 @@ LABEL_X00: ;/////////////////////////////////// SIDE_FORMAT: ; Для форматирования с номером стороны !!! - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) BIT 5,A JR Z,SIDE_OUTS INC D SIDE_OUTS: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,SIDE_OUTS RET M @@ -6239,7 +6236,7 @@ SIDE_OUTS: ;************************************** MOVE_X00: - LD HL,(FL_N_4) + LD HL,(ZX_VARS.FL_N_4) MOVE_X01: LD A,(HL) CP 0 @@ -6260,31 +6257,31 @@ MOVE_X03: LD E,(HL) INC HL LD D,(HL) - LD HL,(MED_START) + LD HL,(ZX_VARS.MED_START) AND A SBC HL,DE ADD HL,DE JR Z,MOVE_X05 - LD (AUTO_5CD5),DE + LD (ZX_VARS.AUTO_5CD5),DE LD A,C - LD (AUTO_5CD3),A + LD (ZX_VARS.AUTO_5CD3),A CALL AUTO_17A5 MOVE_X04: POP HL PUSH HL - LD DE,(FL_N_2) + LD DE,(ZX_VARS.FL_N_2) LD BC,RST10 LDIR - LD (FL_N_2),DE + LD (ZX_VARS.FL_N_2),DE EX DE,HL - LD DE,(FL_NAME) + LD DE,(ZX_VARS.FL_NAME) DEC HL LD (HL),D DEC HL LD (HL),E - LD HL,(MED_START) - LD (FL_NAME),HL - LD HL,FL_N_6 + LD HL,(ZX_VARS.MED_START) + LD (ZX_VARS.FL_NAME),HL + LD HL,ZX_VARS.FL_N_6 INC (HL) POP HL RET @@ -6306,12 +6303,12 @@ MOVE_X06: AND 15 ADD A,D LD D,A - LD (MED_START),DE + LD (ZX_VARS.MED_START),DE JR MOVE_X04 ;************************************* EDIT_RET: - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD (HL),254 INC HL LD (HL),13 @@ -6329,12 +6326,12 @@ EDIT_X00: JR NZ,EDIT_X02 CALL BEEP_1 CALL AUTO_212A ; восстановление ком. строки - LD HL,(E_LINE) + LD HL,(ZX_VARS.E_LINE) LD A,13 LD BC,0 CPIR DEC HL - LD (K_CUR),HL + LD (ZX_VARS.K_CUR),HL INC HL INC HL LD (HL),128 @@ -6391,8 +6388,8 @@ RUS_PRINT: LD BC,RST08 LDIR LD A,201 - LD (AUTO_5C9A),A - JP AUTO_5C9A + LD (ZX_VARS.AUTO_5C9A),A + JP ZX_VARS.AUTO_5C9A ;************************************** @@ -6422,43 +6419,43 @@ AUTO_3C09: ;!FIXIT not used BLOCK #3C10 - $,255 ;KBD_EXP: - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A RET ; ;************************************ ;!FIXIT not used BLOCK #3C18 - $,255 ;KBD_OFF: - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A RET ;************************************ ;!FIXIT not used BLOCK #3C20 - $,255 READR_X: - CALL get_disk_time: + CALL get_disk_time LD B,A JP set_side_0 ;************************************ ;!FIXIT not used BLOCK #3C30 - $,255 - IN A,(WG_COM) + IN A,(FDC_93.Command) RET ;***************************** NEW_NAME: - DB 22,1,3,"* Sprinter TR-DOS v.7.01 *" - DB 22,3,6, "(c) 2001 PETERS PLUS" - DB 22,5,12, "* R.F.*" + DB 22,1,3, "* Sprinter TR-DOS v.7.02 *" + DB 22,3,6, "(c) 2023 Sprinter Team" + DB 22,5,14, "*R.F.*" DB 22,7,9, "BETA 4Mb",0 ;***************************** ;FORMATER: -; LD DE,(E_LINE) +; LD DE,(ZX_VARS.E_LINE) ; LD HL,TX_FORMAT ; LD BC,LEN_TX_F ; LDIR @@ -6499,8 +6496,9 @@ EXP_FNS_PREPARE: CALL EXP_FNS_PREPARE_EXIT EX (SP),HL PUSH AF - LD A,L - AND 4 + BIT 2,L + ; LD A,L + ; AND 4 JR Z,.no_EI EI .no_EI: POP AF @@ -6528,16 +6526,16 @@ CMD_COPY.FIXED: BLOCK #3CC0 - $,255 MAGIC_1: PUSH AF - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A POP AF JP MAGIC_2 ;******************************* BLOCK #3CC9 - $,255 MAGIC_3: PUSH AF - LD A,D_ROM16OFF - OUT (CNF_PORT),A + LD A,CNF_PORT.ZX_BIOS + OUT (CNF_PORT.ON),A POP AF RETN @@ -6617,7 +6615,7 @@ AUTO_3D21: NOP NOP CALL C,AUTO_3D4C ; если нет, то вызвать программу иниц. - LD HL,RET_INS + LD HL,ZX_VARS.RET_INS RET NOP NOP @@ -6641,22 +6639,22 @@ AUTO_3D44: RST RST08 DB 49 ;!HARDCODE LD A,1 - LD (INTERF_I),A + LD (ZX_VARS.INTERF_I),A RET .Size EQU $-AUTO_3D44 AUTO_3D4C: XOR A - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A IN A,(#F6) LD HL,AUTO_3D38 - LD DE,MEM_BOT + LD DE,ZX_VARS.MEM_BOT LD BC,AUTO_3D38.Size + AUTO_3D44.Size LDIR LD HL,AUTO_3D67 PUSH HL LD HL,AUTO_3D2F PUSH HL - JP MEM_BOT + JP ZX_VARS.MEM_BOT AUTO_3D67: ; получить память для DOS LD HL,AUTO_2F90 ; и вернуться в программу иниц. VARS @@ -6665,10 +6663,10 @@ AUTO_3D67: ; PUSH HL LD HL,1655h ;!HARDCODE PUSH HL - LD HL,AUTO_5BFF + LD HL,ZX_VARS.AUTO_5BFF PUSH HL LD (HL),#C9 ; RET code - LD HL,P_RAMTOP+1 + LD HL,ZX_VARS.P_RAMTOP+1 LD BC,CONT_8+7 RET PRINT_CR: @@ -6694,7 +6692,7 @@ AUTO_3D94: AUTO_3D98: LD A,8 WG93_EXE: - OUT (WG_COM),A + OUT (FDC_93.Command),A AUTO_3D9C: PUSH HL RST_ROM ROUTINE.break_key @@ -6703,7 +6701,7 @@ AUTO_3D9C: RST_ROM ROUTINE.report_l AUTO_3DA5: POP HL - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 128 JR Z,AUTO_3D9C RET @@ -6711,11 +6709,11 @@ RESET_WG: LD A,8 CALL WG93_EXE LD DE,0 - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 2 LD B,A AUTO_3DBA: - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 2 CP B RET NZ @@ -6725,15 +6723,15 @@ AUTO_3DBA: JR NZ,AUTO_3DBA JP AUTO_3EE7 AUTO_3DC8: - LD A,(CONT_DISK) + LD A,(ZX_VARS.CONT_DISK) SET_DISK: JP RAMD_X12 AUTO_3DCE: - LD HL,PDOS_COPY + LD HL,ZX_VARS.PDOS_COPY LD C,A LD A,3Ch OR C - OUT (P_DOS_FF),A + OUT (FDC_93.DrvCTRL),A LD (HL),A CALL get_disk_time AND 128 @@ -6765,14 +6763,14 @@ AUTO_3E01: JR NZ,pause_1ms RET get_disk_time: - LD DE,TIME_A + LD DE,ZX_VARS.TIME_A AUTO_3E0B: - LD HL,(OPER_DISK) + LD HL,(ZX_VARS.OPER_DISK) ADD HL,DE LD A,(HL) RET get_disk_type: - LD DE,DISK_A + LD DE,ZX_VARS.DISK_A JR AUTO_3E0B test_disk: CALL get_disk_time @@ -6788,12 +6786,12 @@ AUTO_3E1D: LD B,(HL) LD A,1 CALL Goto_trk - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 JR NZ,AUTO_3E3F XOR A CALL Goto_trk - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 4 RET NZ AUTO_3E3F: @@ -6802,15 +6800,15 @@ AUTO_3E3F: RET Z JR AUTO_3E1D Goto_trk: - OUT (WG_DATA),A + OUT (FDC_93.Data),A LD A,B OR 24 JP WG93_EXE_ Goto_trkx: - OUT (WG_DATA),A + OUT (FDC_93.Data),A PUSH BC LD B,A - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP B POP BC PUSH AF @@ -6834,11 +6832,11 @@ Global_trk: JR Z,AUTO_3E83 BIT 0,(HL) JR NZ,AUTO_3E83 - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP C JR Z,AUTO_3E82 RLCA - OUT (WG_TRK),A + OUT (FDC_93.Track),A LD A,C RLCA AUTO_3E82: @@ -6846,7 +6844,7 @@ AUTO_3E82: AUTO_3E83: CALL get_disk_time LD B,A - IN A,(WG_TRK) + IN A,(FDC_93.Track) CP C PUSH BC CALL NZ,pause_50ms @@ -6855,12 +6853,12 @@ AUTO_3E83: CALL Goto_trkx POP BC LD A,C - OUT (WG_TRK),A - LD A,(DRV_READY) + OUT (FDC_93.Track),A + LD A,(ZX_VARS.DRV_READY) OR A RET Z XOR A - LD (DRV_READY),A + LD (ZX_VARS.DRV_READY),A pause_750ms: LD B,3 AUTO_3EA2: @@ -6878,10 +6876,10 @@ made_trk_side2: READ_ADR_LABL: CALL set_side_0 ; SET SIDE 0 READ_ADR_LABL2: - IN A,(WG_COM) + IN A,(FDC_93.Command) AND 128 - LD (DRV_READY),A - IN A,(WG_TRK) + LD (ZX_VARS.DRV_READY),A + IN A,(FDC_93.Track) LD H,A ; на текущую дорожку CALL Goto_trk ; позиционирование ; CALL READR_X @@ -6889,11 +6887,11 @@ READ_ADR_LABL2: LD D,1 DI LD A,0C0h ; чтение адресной метки - OUT (WG_COM),A + OUT (FDC_93.Command),A PUSH BC LD B,6 AUTO_3ECE: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3EF2 INC DE @@ -6904,32 +6902,32 @@ AUTO_3ECE: POP BC EI LD A,208 ; прервать выполнение - OUT (WG_COM),A - LD A,(AUTO_5CD1) + OUT (FDC_93.Command),A + LD A,(ZX_VARS.AUTO_5CD1) CP 255 RET Z AUTO_3EE7: CALL set_error_26 LD A,255 - LD (FLAG_BOOT),A + LD (ZX_VARS.FLAG_BOOT),A JP exit_No_disk AUTO_3EF2: POP BC IN H,(C) AUTO_3EF5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3EF5 EI RET M DI - IN A,(WG_DATA) + IN A,(FDC_93.Data) JR AUTO_3EF5 save_sector: - LD (SEC_NUM),A + LD (ZX_VARS.SEC_NUM),A RET save_bufer: - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.CONT_BUF_ADR),HL RET AUTO_3F0A: LD A,160 @@ -6937,19 +6935,19 @@ AUTO_3F0A: AUTO_3F0E: LD A,128 AUTO_3F10: - LD (COMAND_WG),A + LD (ZX_VARS.COMAND_WG),A AUTO_3F13: LD D,10 AUTO_3F15: PUSH DE DI - LD A,(SEC_NUM) + LD A,(ZX_VARS.SEC_NUM) INC A - OUT (WG_SEC),A - LD HL,(CONT_BUF_ADR) + OUT (FDC_93.Sector),A + LD HL,(ZX_VARS.CONT_BUF_ADR) LD C,127 - LD A,(COMAND_WG) - OUT (WG_COM),A + LD A,(ZX_VARS.COMAND_WG) + OUT (FDC_93.Command),A CP 160 PUSH AF CALL Z,AUTO_3FBA @@ -6957,7 +6955,7 @@ AUTO_3F15: CALL NZ,AUTO_3FD5 POP DE EI - IN A,(WG_COM) + IN A,(FDC_93.Command) LD B,A AND 127 RET Z @@ -6974,14 +6972,14 @@ AUTO_3F48: LD HL,DISK_ERROR_MSG AUTO_3F4B: LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,B AND 1 JP NZ,AUTO_3EE7 - IN A,(WG_TRK) + IN A,(FDC_93.Track) OR A JR NZ,AUTO_3F5F - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CP 10 RET Z AUTO_3F5F: @@ -6991,11 +6989,11 @@ AUTO_3F5F: RST PRINT_LN LD HL,AUTO_2A13 RST PRINT_LN - IN A,(WG_TRK) + IN A,(FDC_93.Track) CALL AUTO_1DA3 LD HL,AUTO_2A18 RST PRINT_LN - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CALL AUTO_1DA3 LD HL,AUTO_29FE RST PRINT_LN @@ -7009,10 +7007,10 @@ AUTO_3F7B: JR NZ,AUTO_3F7B CALL set_error_26 LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP AUTO_01D3 AUTO_3F94: - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk CALL pause_750ms JP AUTO_3F13 @@ -7026,7 +7024,7 @@ AUTO_3FA0: INC (HL) AUTO_3FAD: CALL AUTO_3D98 - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk POP DE JP AUTO_3F15 @@ -7036,7 +7034,7 @@ AUTO_3FAD: AUTO_3FBA: LD B,4 AUTO_3FBC: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3FD1 INC DE @@ -7046,7 +7044,7 @@ AUTO_3FBC: DJNZ AUTO_3FBC RET AUTO_3FCA: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3FCA RET M @@ -7059,7 +7057,7 @@ AUTO_3FD1: AUTO_3FD5: LD B,4 AUTO_3FD7: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,AUTO_3FEC INC DE @@ -7069,7 +7067,7 @@ AUTO_3FD7: DJNZ AUTO_3FD7 RET AUTO_3FE5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,AUTO_3FE5 RET M @@ -7086,7 +7084,7 @@ HD_CMD: PUSH AF DI ;LD A,SYS_PORT.EXTENSION LD A,1 - OUT (SYS_PORT_ON),A + OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- @@ -7101,7 +7099,7 @@ EXP_FNS:;!TEST 06/01/2024 JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: ; - OUT (SYS_PORT_ON),A + OUT (SYS_PORT.ROM),A POP AF RET ;--------------------------------------- diff --git a/Shared_Includes b/Shared_Includes index d3cdfc6..84d47b2 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d3cdfc6e7644fab96ebe2c6e87959359cda6319c +Subproject commit 84d47b2818758fdceda21ecf2953324c1f339858 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 87dbeac..f68ecc2 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -28,13 +28,13 @@ MSDOS_1ST_FL: MSDOS_TEST_FL: PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD E,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,E LD E,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EI LD A,E POP DE @@ -53,16 +53,16 @@ MSDOS_NEXT_FL: LD DE,20H ADD HL,DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(COUNT_FL) + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_FL) DEC A - LD (COUNT_FL),A + LD (SYS_PAGE.COUNT_FL),A LD E,A LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,E @@ -71,16 +71,16 @@ MSDOS_NEXT_FL: JR NZ,MSDOS_TEST_FL PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(COUNT_SEC) + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_SEC) DEC A - LD (COUNT_SEC),A + LD (SYS_PAGE.COUNT_SEC),A LD E,A LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,E @@ -91,7 +91,7 @@ MSDOS_NEXT_FL: PUSH DE CALL READ_NEXT_DIR POP DE - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR JR MSDOS_TEST_FL ;********************************** @@ -140,7 +140,7 @@ CAT_END: PRINT_MSD_NAME: PUSH HL PUSH DE - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME LD A,' ' RST 10H LD A,' ' @@ -169,7 +169,7 @@ PRINT_MSD_L2: PRINT_MSD_DATS: PUSH HL PUSH DE - LD HL,FL_PLACE+1 + LD HL,ZX_VARS.FL_PLACE+1 LD A,(HL) DEC HL CALL PRINT_HEX_A @@ -199,12 +199,12 @@ COPY_NAME_MSD: PUSH HL PUSH DE DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD DE,FL_NAME + LD DE,ZX_VARS.FL_NAME LD BC,11 LDIR @@ -214,7 +214,7 @@ COPY_NAME_MSD: LDIR LD L,(HL) - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,L @@ -230,7 +230,7 @@ CMD_MSDOS: ; MS-DOS CALL SINTAX_RET LD HL,WORDS LOOP_FIND2: - LD DE,(ADR_DOS_COM) + LD DE,(ZX_VARS.ADR_DOS_COM) INC DE ; Пропустить / LD A,(HL) @@ -283,19 +283,19 @@ END_TAB: JR C,END_TAB3 CP 4 JR NC,END_TAB2 - LD (OPER_DISK),A - LD (CONT_DISK),A + LD (ZX_VARS.OPER_DISK),A + LD (ZX_VARS.CONT_DISK),A LD B,A - LD A,(PDOS_COPY) + LD A,(ZX_VARS.PDOS_COPY) AND 7CH OR B - LD (PDOS_COPY),A - OUT (P_DOS_FF),A + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A JP AUTO_03E1 END_TAB2: SUB 4 - CP RAMD_KEY_NUM + CP SYS_PAGE.RAMD_KEYS.NUM JR NC,END_TAB3 CALL RAMD_SET1 JP AUTO_03E1 @@ -314,12 +314,12 @@ LOAD_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR LOAD_RMD_XX: - LD (MED_START+1),A ; сохранить + LD (ZX_VARS.MED_START+1),A ; сохранить CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL ; B - число блоков , DE - абсолютный сектор - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) PUSH AF CALL CLEAR_RMD_A ; освободить RAM-Disk A POP AF @@ -332,13 +332,13 @@ LOAD_RMD_XX: SAVE_RMD: CALL RAMD_SYM ; получить номер RAM-Disk из (DE) JP C,MSD_ERR - LD (MED_START+1),A + LD (ZX_VARS.MED_START+1),A CALL MSDOS_FIND_FILE JP C,MSD_ERR CALL RMD_BLKS_FL - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CALL TEST_RAMD ; проверить наличие RAM-Disk A размером B JP C,MSD_ERR ; A - номер первого блока JP Z,MSD_ERR @@ -348,9 +348,9 @@ SAVE_RMD: JP AUTO_03E1 RMD_BLKS_FL: - LD A,(FL_SIZE+2) + LD A,(ZX_VARS.FL_SIZE+2) PUSH HL - LD HL,(FL_SIZE) + LD HL,(ZX_VARS.FL_SIZE) LD B,A AND A RL L @@ -372,7 +372,7 @@ RMD_BLKS_L2: MSDOS_KOMP_FL: ; DE - ИМЯ ФАЙЛА СО *,? ; HL - ИМЯ В КАТАЛОГЕ CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS - LD A,(FL_NAME) + LD A,(ZX_VARS.FL_NAME) AND A JR NZ,KOMP_CONT1 LD A,2 ; КОНЕЦ КАТАЛОГА @@ -389,7 +389,7 @@ KOMP_CONT1: KOMP_CONT2: PUSH DE PUSH HL - LD HL,FL_NAME + LD HL,ZX_VARS.FL_NAME CALL MSDOS_KOMP_ALL POP HL POP DE @@ -485,11 +485,11 @@ CALC_CLAST: ; HL - DEC HL DEC HL DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(MS_BPB+CLAST_SIZE) + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) EX DE,HL LD BC,0 @@ -504,14 +504,14 @@ CALC_CL_LP: DEC A JR NZ,CALC_CL_LP - LD DE,(MSD_DAT_SEC) - LD BC,(MSD_DAT_SEC2) + LD DE,(SYS_PAGE.MSD_DAT_SEC) + LD BC,(SYS_PAGE.MSD_DAT_SEC2) ADD IX,DE ADC HL,BC ; HL,IX - СМЕЩЕНИЕ КЛАСТЕРА ОТ НАЧАЛА ДАННЫХ EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A PUSH IX EX (SP),HL diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index d9ec5d5..6f8675a 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -31,16 +31,16 @@ INIT_RMD: RAMD_FAT_PROG: CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD HL,RAMD_FAT + LD HL,SYS_PAGE.RAMD_FAT RAMD_F_L1: DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C LD C,(HL) - OUT (PAGE3),A + OUT (SLOT3),A EI PUSH HL LD A,C @@ -85,19 +85,19 @@ TB_ONOFF: ; загрузки ;*************************************************************************** MSDOS_WRITE_FILE: - LD (CONT_BUF_ADR),HL ; адрес загрузки - LD (MED_START),A ; страница загрузки + LD (ZX_VARS.CONT_BUF_ADR),HL ; адрес загрузки + LD (ZX_VARS.MED_START),A ; страница загрузки LD A,TRDOS_ROM_CMD.WRITE JR MSDOS_R_W_FILE ; MSDOS_READ_FILE: - LD (CONT_BUF_ADR),HL ; адрес загрузки - LD (MED_START),A ; страница загрузки + LD (ZX_VARS.CONT_BUF_ADR),HL ; адрес загрузки + LD (ZX_VARS.MED_START),A ; страница загрузки LD A,TRDOS_ROM_CMD.READ MSDOS_R_W_FILE: - LD (MED_LEN),A + LD (ZX_VARS.MED_LEN),A ; beg=start_claster. Получить начальный кластер - LD IX,(START_CLASTER) ; стартовый кластер + LD IX,(ZX_VARS.START_CLUSTER) ; стартовый кластер ; next=beg ; max=file_len. длина в кластерах CALL GET_FILE_CLASTERS_BC @@ -109,14 +109,14 @@ msd_rf_cont2: ; max2=blk_len ; длина блока в кластерах ; DI ; GET_BLK_CLASTERS_L -; IN A,(PAGE3) +; IN A,(SLOT3) ; EX AF,AF' ; LD A,SYS_PAGE -; OUT (PAGE3),A +; OUT (SLOT3),A ; LD A,(C_P_B) ; LD L,A ; EX AF,AF' -; OUT (PAGE3),A +; OUT (SLOT3),A ; EI LD L,128 @@ -218,7 +218,7 @@ READ_num_clasters_from_beg: CALL CLAST_TO_SEC PUSH AF - LD A,(MED_LEN) + LD A,(ZX_VARS.MED_LEN) LD C,A SUB TRDOS_ROM_CMD.READ JR Z,CONT_XX1 @@ -236,13 +236,13 @@ LOOP_128: PUSH IX PUSH BC - LD HL,(CONT_BUF_ADR) - LD A,(MED_START) + LD HL,(ZX_VARS.CONT_BUF_ADR) + LD A,(ZX_VARS.MED_START) CALL MSD_R_W_UT - LD (CONT_BUF_ADR),HL - LD (MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A POP BC POP IX @@ -289,14 +289,14 @@ CLAST_TO_SEC: CALL CALC_CLAST DI - IN A,(PAGE3) + IN A,(SLOT3) LD B,A LD A,SYS_PAGE - OUT (PAGE3),A - LD A,(MS_BPB+CLAST_SIZE) + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD C,A LD A,B - OUT (PAGE3),A + OUT (SLOT3),A EI POP AF @@ -332,14 +332,14 @@ FAT_DE_to_HL: PUSH BC PUSH IX DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD HL,(FAT_FLAG) - LD BC,(MS_BPB+SEC_SIZE) ; размер сектора - OUT (PAGE3),A + LD HL,(SYS_PAGE.FAT_FLAG) + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; размер сектора + OUT (SLOT3),A EI PUSH HL @@ -394,20 +394,20 @@ CALL_ALL: AND B LD H,A - LD BC,MS_FAT + LD BC,SYS_PAGE.MS_FAT ADD HL,BC DI - IN A,(PAGE3) + IN A,(SLOT3) LD C,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,C - LD (FAT_FLAG),DE + LD (SYS_PAGE.FAT_FLAG),DE LD C,(HL) ; считать кластер INC HL LD B,(HL) INC HL - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI POP AF @@ -477,14 +477,14 @@ READ_FAT_SEC: LD D,0 DI - IN A,(PAGE3) + IN A,(SLOT3) LD L,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L - LD IX,(MSD_FAT_SEC) - LD HL,(MSD_FAT_SEC2) - OUT (PAGE3),A + LD IX,(SYS_PAGE.MSD_FAT_SEC) + LD HL,(SYS_PAGE.MSD_FAT_SEC2) + OUT (SLOT3),A EI LD BC,0 @@ -496,20 +496,20 @@ READ_FAT_SEC: PUSH HL POP IX - LD HL,(CONT_BUF_ADR) - LD A,(MED_START) + LD HL,(ZX_VARS.CONT_BUF_ADR) + LD A,(ZX_VARS.MED_START) PUSH AF PUSH HL - LD HL,MS_FAT + LD HL,SYS_PAGE.MS_FAT LD A,SYS_PAGE LD BC,256*2 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT POP HL POP AF - LD (CONT_BUF_ADR),HL - LD (MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A POP DE POP BC @@ -524,17 +524,17 @@ READ_FAT_SEC: GET_FILE_CLASTERS_BC: DI - IN A,(PAGE3) + IN A,(SLOT3) LD L,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L - LD HL,(CLASTER_LEN) - OUT (PAGE3),A + LD HL,(SYS_PAGE.CLASTER_LEN) + OUT (SLOT3),A ; RET_PAGE3 EI - LD BC,(FL_SIZE) - LD A,(FL_SIZE+2) + LD BC,(ZX_VARS.FL_SIZE) + LD A,(ZX_VARS.FL_SIZE+2) LD DE,0 SCF GET_FL_CL_2: ; вычисление количества кластеров в файле @@ -562,14 +562,14 @@ HDD_PROG: CALL EXP_FNS ; JP C,HDD_PROG_E - LD HL,HD_IDF_ADR+54 + LD HL,SYS_PAGE.HD_IDF_ADR+54 LD B,32 HDD_PROG_L: DI - IN A,(PAGE3) + IN A,(SLOT3) LD D,A LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A LD A,L XOR 1 LD L,A @@ -579,7 +579,7 @@ HDD_PROG_L: LD L,A INC HL LD A,D - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI LD A,C diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 4bccc88..6819648 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -53,7 +53,7 @@ MSD_R_W_UT: ; EX (SP),HL ; POP IX ; LD C,12H -; LD A,(OPER_DISK) +; LD A,(ZX_VARS.OPER_DISK) ; DI ; PUSH IY ; CALL HD_CMD @@ -74,7 +74,7 @@ MSD_R_W_UT: ; EX (SP),HL ; POP IX ; LD C,13H -; LD A,(OPER_DISK) +; LD A,(ZX_VARS.OPER_DISK) ; DI ; PUSH IY ; CALL HD_CMD @@ -102,37 +102,37 @@ MSD_cmd4: LD DE,0 MSD_cmd5: LD A,0 - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 MSD_cmd6: LD A,255 - LD (RD_WR_COM),A + LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 PREPARE1: - LD (MED_START),A - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.MED_START),A + LD (ZX_VARS.CONT_BUF_ADR),HL DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A + OUT (SLOT2),A - LD A,(DS_1440-4000H) + LD A,(SYS_PAGE.DS_1440-4000H) AND BIT_MASK_1440 SET 0,A - LD (DS_1440-4000H),A + LD (SYS_PAGE.DS_1440-4000H),A LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI CALL Z,RES_1440 CALL NZ,SET_1440 CALL CALC_SECTOR - LD (CONT_SEC),DE - LD A,(RD_WR_COM) + LD (ZX_VARS.CONT_SEC),DE + LD A,(ZX_VARS.RD_WR_COM) RET MSD_RWU1: @@ -144,34 +144,34 @@ MSD_RWU1: MSD_R_W_LOOP: POP HL POP BC - LD A,(MED_START) + LD A,(ZX_VARS.MED_START) INC B DEC B - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) RET Z DEC B PUSH BC PUSH HL - LD (CONT_BUF_ADR),HL - LD A,(CONT_SEC) - LD (SEC_NUM),A - LD A,(CONT_TRK) + LD (ZX_VARS.CONT_BUF_ADR),HL + LD A,(ZX_VARS.CONT_SEC) + LD (ZX_VARS.SEC_NUM),A + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) OR A PUSH AF CALL Z,MSD_3F0E POP AF CALL NZ,MSD_3F0A DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD DE,(MS_BPB+SEC_SIZE-#4000) + OUT (SLOT2),A + LD DE,(SYS_PAGE.MS_BPB+SEC_SIZE-#4000) LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI POP HL ADD HL,DE @@ -179,44 +179,44 @@ MSD_R_W_LOOP: OR L JR NZ,MSD_NO_PAGE DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(MED_START) - LD HL,RAMD_FAT-#4000 + OUT (SLOT2),A + LD A,(ZX_VARS.MED_START) + LD HL,SYS_PAGE.RAMD_FAT-#4000 LD L,A LD L,(HL) LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI LD A,L LD HL,#C000 - LD (MED_START),A + LD (ZX_VARS.MED_START),A MSD_NO_PAGE: - LD (CONT_BUF_ADR),HL + LD (ZX_VARS.CONT_BUF_ADR),HL PUSH HL DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(DS_1440-#4000) + OUT (SLOT2),A + LD A,(SYS_PAGE.DS_1440-#4000) AND %1111'1110 - LD (DS_1440-#4000),A - LD A,(MSD_SECS-#4000) + LD (SYS_PAGE.DS_1440-#4000),A + LD A,(SYS_PAGE.MSD_SECS-#4000) LD L,A LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI LD A,L - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC INC (HL) CP (HL) JP NZ,MSD_R_W_LOOP LD (HL),0 - LD HL,CONT_TRK + LD HL,ZX_VARS.CONT_TRK INC (HL) JP MSD_R_W_LOOP ;***************************************** @@ -228,30 +228,30 @@ MSD_3F0A: MSD_3F0E: LD A,128 MSD_3F10: - LD (COMAND_WG),A + LD (ZX_VARS.COMAND_WG),A MSD_3F13: LD D,5 ; ЧИСЛО ПОВТОРЕНИЙ MSD_3F15: PUSH DE PUSH IX DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' - LD A,(MED_START) - OUT (PAGE3),A + LD A,(ZX_VARS.MED_START) + OUT (SLOT3),A AND A JR Z,NO_OFF_SCR LD A,0C0H OUT (RGADR),A NO_OFF_SCR: LD IX,MSD_RET_ADR - LD A,(SEC_NUM) + LD A,(ZX_VARS.SEC_NUM) INC A - OUT (WG_SEC),A - LD HL,(CONT_BUF_ADR) + OUT (FDC_93.Sector),A + LD HL,(ZX_VARS.CONT_BUF_ADR) LD C,127 - LD A,(COMAND_WG) - OUT (WG_COM),A + LD A,(ZX_VARS.COMAND_WG) + OUT (FDC_93.Command),A CP 160 JP Z,MSD_3FBA ; ЗАПИСЬ СЕКТОРА JP MSD_3FD5 ; ЧТЕНИЕ СЕКТОРА @@ -259,11 +259,11 @@ MSD_RET_ADR: LD A,0 OUT (RGADR),A EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A POP IX POP DE EI - IN A,(WG_COM) + IN A,(FDC_93.Command) LD B,A AND 127 RET Z @@ -283,7 +283,7 @@ MSD_3F48: LD HL,DISK_ERROR_MSG MSD_3F4B: LD A,208 - OUT (WG_COM),A + OUT (FDC_93.Command),A LD A,B AND 1 JP NZ,AUTO_3EE7 @@ -294,11 +294,11 @@ MSD_3F4B: RST PRINT_LN LD HL,AUTO_2A13 RST PRINT_LN - IN A,(WG_TRK) + IN A,(FDC_93.Track) CALL AUTO_1DA3 LD HL,AUTO_2A18 RST PRINT_LN - IN A,(WG_SEC) + IN A,(FDC_93.Sector) CALL AUTO_1DA3 LD HL,AUTO_29FE RST PRINT_LN @@ -312,10 +312,10 @@ MSD_3F7B: JR NZ,MSD_3F7B CALL exit_No_disk LD A,7 - LD (DOS_ERR_2),A + LD (ZX_VARS.DOS_ERR_2),A JP AUTO_01D3 MSD_3F94: - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk CALL pause_750ms JP MSD_3F13 @@ -325,7 +325,7 @@ MSD_3FA0: CALL SWITCH_DT PUSH DE CALL AUTO_3D98 ; RESET_WG - LD A,(CONT_TRK) + LD A,(ZX_VARS.CONT_TRK) CALL Global_trk ; ПОЗИЦИОНИРОВАНИЕ POP DE JP MSD_3F15 @@ -333,25 +333,25 @@ MSD_3FA0: SWITCH_DT: DI - IN A,(PAGE2) + IN A,(SLOT2) LD C,A LD A,SYS_PAGE - OUT (PAGE2),A - LD A,(DS_1440-4000H) + OUT (SLOT2),A + LD A,(SYS_PAGE.DS_1440-4000H) BIT 0,A JR Z,NO_SW_DT XOR BIT_MASK_1440 - LD (DS_1440-4000H),A + LD (SYS_PAGE.DS_1440-4000H),A AND BIT_MASK_1440 LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI CALL Z,RES_1440 CALL NZ,SET_1440 RET NO_SW_DT: LD A,C - OUT (PAGE2),A + OUT (SLOT2),A EI RET @@ -361,7 +361,7 @@ NO_SW_DT: MSD_3FBA: LD B,4 MSD_3FBC: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,MSD_3FD1 INC DE @@ -372,7 +372,7 @@ MSD_3FBC: MSD_RET_IX: JP (IX) MSD_3FCA: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,MSD_3FCA JP M,MSD_RET_IX @@ -385,7 +385,7 @@ MSD_3FD1: MSD_3FD5: LD B,4 MSD_3FD7: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR NZ,MSD_3FEC INC DE @@ -396,7 +396,7 @@ MSD_3FD7: MSD_RET_IX2: JP (IX) MSD_3FE5: - IN A,(P_DOS_FF) + IN A,(FDC_93.DrvCTRL) AND 192 JR Z,MSD_3FE5 JP M,MSD_RET_IX2 @@ -436,7 +436,7 @@ READ_BPB: LD IX,0 LD DE,63 ;!HARDCODE LD A,SYS_PAGE - LD HL,MS_BPB + LD HL,SYS_PAGE.MS_BPB ; LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT @@ -445,7 +445,7 @@ READ_BPB: RET NC JP .ERROR_MSDOS .MAIN: LD A,SYS_PAGE - LD HL,MS_BPB + LD HL,SYS_PAGE.MS_BPB LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT @@ -454,38 +454,38 @@ READ_BPB: ;RET ; LD C,18H - ; LD A,(OPER_DISK) + ; LD A,(ZX_VARS.OPER_DISK) ; CALL HD_CMD ; ; ; DI - ; IN A,(PAGE3) + ; IN A,(SLOT3) ; EX AF,AF' ; LD A,SYS_PAGE - ; OUT (PAGE3),A + ; OUT (SLOT3),A ; ; - ; LD A,(MS_BPB+S_P_T) ; Количество секторов на трек + ; LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек ; LD L,A ; ; ; EX AF,AF' - ; OUT (PAGE3),A + ; OUT (SLOT3),A ; EI ; ; - ; LD A,(OPER_DISK) + ; LD A,(ZX_VARS.OPER_DISK) ; LD C,19H ; CALL HD_CMD .PARAMS: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A - LD A,(MS_BPB+FORM_CODE) + LD A,(SYS_PAGE.MS_BPB+FORM_CODE) CP #F0 JP C,.ERROR_BPB - LD HL,MS_BPB+FAT_ID + LD HL,SYS_PAGE.MS_BPB+FAT_ID LD DE,.FAT1_MSG LD B,4 .L1: LD A,(DE) @@ -508,10 +508,10 @@ READ_BPB: .PC_DOS: LD HL,#01FF ; FAT12 флаг -.FAT: LD (FAT_FLAG),HL +.FAT: LD (SYS_PAGE.FAT_FLAG),HL - LD A,(MS_BPB+S_P_T) ; Количество секторов на трек - LD (MSD_SECS),A + LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек + LD (SYS_PAGE.MSD_SECS),A BIT 7,H @@ -519,32 +519,32 @@ READ_BPB: LD HL,0 ; вычислить начальный сектор FAT JR Z,.NO_LD_SPECIAL - LD IX,(MS_BPB+SPECIAL_SECS) - LD HL,(MS_BPB+SPECIAL_SECS+2) + LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) + LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) .NO_LD_SPECIAL: LD BC,0 - LD DE,(MS_BPB+RESERV_SECS) + LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) ADD IX,DE ADC HL,BC - LD (MSD_FAT_SEC),IX ; начальный сектор FAT - LD (MSD_FAT_SEC2),HL ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT + LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT - LD DE,(MS_BPB+S_P_F) ; число секторов в FAT + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT LD BC,0 - LD A,(MS_BPB+FATS_NUM) ; количество FATs + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs .NEXT_ADD: ADD IX,DE ADC HL,BC DEC A JR NZ,.NEXT_ADD - LD (MSD_CAT_SEC),IX ; начальный сектор DIR - LD (MSD_CAT_SEC2),HL ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR + LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR - LD BC,(MS_BPB+SEC_SIZE) ; Размер сектора + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора RL C RL B RL C @@ -554,9 +554,9 @@ READ_BPB: LD C,B LD B,0 ; BC - число файловых записей в секторе LD A,C - LD (F_P_S),A + LD (SYS_PAGE.F_P_S),A - LD DE,(MS_BPB+FLS_NUM) ; Число файловых записей + LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей EX DE,HL DEC HL @@ -571,17 +571,17 @@ READ_BPB: LD E,A ; A - число секторов в DIR LD D,0 LD BC,0 - LD (S_P_C),A + LD (SYS_PAGE.S_P_C),A ADD IX,DE ; Начало DATA area ADC HL,BC - LD (MSD_DAT_SEC),IX - LD (MSD_DAT_SEC2),HL + LD (SYS_PAGE.MSD_DAT_SEC),IX + LD (SYS_PAGE.MSD_DAT_SEC2),HL - LD BC,(MS_BPB+SEC_SIZE) ; Размер сектора + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора LD HL,0 - LD A,(MS_BPB+CLAST_SIZE) + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A LD A,0 .NEXT_ADD3: @@ -590,28 +590,28 @@ READ_BPB: DEC D JR NZ,.NEXT_ADD3 - LD (CLASTER_LEN),HL + LD (SYS_PAGE.CLASTER_LEN),HL LD B,0 LD C,A - LD (CLASTER_LEN2),BC + LD (SYS_PAGE.CLASTER_LEN2),BC LD HL,0 - LD BC,(MS_BPB+S_P_T) - LD A,(MS_BPB+H_P_S) + LD BC,(SYS_PAGE.MS_BPB+S_P_T) + LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР ADD HL,BC DEC A JR NZ,.BPB_L1 - LD (S_X_H),HL + LD (SYS_PAGE.S_X_H),HL ; EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EI AND A RET .ERROR_BPB: EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A SCF EI RET @@ -623,59 +623,59 @@ READ_BPB: ;******************************************** READ_NEXT_DIR: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD DE,(MSD_CONT_SEC) - LD IX,(MSD_CONT_SEC2) + OUT (SLOT3),A + LD DE,(SYS_PAGE.MSD_CONT_SEC) + LD IX,(SYS_PAGE.MSD_CONT_SEC2) JR READ_NEXT2 ;******************************************** READ_1ST_DIR: DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD IX,(MSD_CAT_SEC2) ; - LD DE,(MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА - LD (MSD_CONT_SEC),DE - LD (MSD_CONT_SEC2),IX - LD A,(S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ - LD (COUNT_SEC),A + OUT (SLOT3),A + LD IX,(SYS_PAGE.MSD_CAT_SEC2) ; + LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА + LD (SYS_PAGE.MSD_CONT_SEC),DE + LD (SYS_PAGE.MSD_CONT_SEC2),IX + LD A,(SYS_PAGE.S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ + LD (SYS_PAGE.COUNT_SEC),A READ_NEXT2: EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR LD A,SYS_PAGE LD BC,256*1 + TRDOS_ROM_CMD.READ CALL MSD_R_W_UT DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A + OUT (SLOT3),A - LD DE,(MSD_CONT_SEC) + LD DE,(SYS_PAGE.MSD_CONT_SEC) INC DE - LD (MSD_CONT_SEC),DE + LD (SYS_PAGE.MSD_CONT_SEC),DE LD A,D OR E JR NZ,READ_NEXT3 - LD IX,(MSD_CONT_SEC2) + LD IX,(SYS_PAGE.MSD_CONT_SEC2) INC IX - LD (MSD_CONT_SEC2),IX + LD (SYS_PAGE.MSD_CONT_SEC2),IX READ_NEXT3: - LD A,(F_P_S) ; ФАЙЛОВ В СЕКТОРЕ - LD (COUNT_FL),A + LD A,(SYS_PAGE.F_P_S) ; ФАЙЛОВ В СЕКТОРЕ + LD (SYS_PAGE.COUNT_FL),A EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A ; RET_PAGE3 EI - LD HL,MS_DIR + LD HL,SYS_PAGE.MS_DIR AND A RET @@ -692,11 +692,11 @@ CALC_SECT_L1: PUSH BC EX DE,HL DI - IN A,(PAGE3) + IN A,(SLOT3) EX AF,AF' LD A,SYS_PAGE - OUT (PAGE3),A - LD BC,(MS_BPB+S_P_T) + OUT (SLOT3),A + LD BC,(SYS_PAGE.MS_BPB+S_P_T) XOR A LOOP_TRK: SBC HL,BC @@ -711,7 +711,7 @@ SEC_ENDER: LD H,A ; ТРЕК ; LD L,L ; СЕКТОР EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EI EX DE,HL POP BC @@ -720,8 +720,8 @@ SEC_ENDER: ;************************************************ REDIR_LINE_CODING: - LD (MED_START),HL - LD HL,(DOS_CH_ADR) + LD (ZX_VARS.MED_START),HL + LD HL,(ZX_VARS.DOS_CH_ADR) LD A,(HL) CP '/' RET Z diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 8597159..469e611 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -2,7 +2,7 @@ DISK_REDIR: PUSH HL PUSH BC - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) AND 3 LD C,BIOS.GET_DRV_ST CALL EXP_FNS @@ -24,7 +24,7 @@ ERROR_DISK: RECALL_1E70: CALL RES_1440 - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) PUSH BC PUSH HL CALL READ_TRK_NUM @@ -52,8 +52,8 @@ TEST_RAMD: RET ; ╔═══════════════════════════════════╗ -; ║ RD/WR SECTOR HL - BUFER ║\ -; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD/WR SECTOR HL - ZX_VARS.BUFFER ║\ +; ║ ZX_VARS.CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ COM_RD_WR - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ @@ -73,14 +73,14 @@ READ_WRITE_RAMD: ; LD HL,RAMD_KEYS ; ADD A,L ; LD L,A -; IN A,(PAGE3) +; IN A,(SLOT3) ; LD C,A ; LD A,SYS_PAGE ; DI -; OUT (PAGE3),A +; OUT (SLOT3),A ; LD L,(HL) ; LD A,C -; OUT (PAGE3),A +; OUT (SLOT3),A ; EI ; LD A,L ; 1-st block ; POP HL @@ -97,7 +97,7 @@ READ_WRITE_RAMD: ; PUSH DE ; PUSH BC ; -; LD DE,(CONT_SEC) +; LD DE,(ZX_VARS.CONT_SEC) ; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! ; RRCA ; RRCA @@ -111,7 +111,7 @@ READ_WRITE_RAMD: ; AND 0FH ; LD D,A ; -; LD A,(RD_WR_COM) +; LD A,(ZX_VARS.RD_WR_COM) ; AND A ; JR Z,RAMD_READ ; PUSH AF @@ -132,7 +132,7 @@ READ_WRITE_RAMD: ; POP HL ; POP AF ; OUT (RGADR),A -; LD DE,(CONT_SEC) +; LD DE,(ZX_VARS.CONT_SEC) ; ; LD A,B ; @@ -158,7 +158,7 @@ READ_WRITE_RAMD: ; ; LD B,0 ; -; LD (CONT_SEC),DE +; LD (ZX_VARS.CONT_SEC),DE ; AND A ; RET ; @@ -180,7 +180,7 @@ WD_WR_RAMD_LOOP: RAMD_NEXT_SEC: PUSH HL - LD HL,CONT_SEC + LD HL,ZX_VARS.CONT_SEC LD A,16 INC (HL) CP (HL) @@ -195,15 +195,15 @@ RAMD_NEXT_1: RET RD_WR_1SEC: - LD DE,(CONT_SEC) + LD DE,(ZX_VARS.CONT_SEC) CALL PAGE_CALC2 DI - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) AND 0C0H OUT (RGADR),A LD A,H CP 0A0H - LD A,(RD_WR_COM) + LD A,(ZX_VARS.RD_WR_COM) LD E,0 LD D,C SET 6,D @@ -211,7 +211,7 @@ RD_WR_1SEC: RD_WR_4000: RES 7,D ; DE - адрес данных RAMD - LD C,PAGE1 + LD C,SLOT1 EX AF,AF' IN A,(C) EX AF,AF' @@ -229,7 +229,7 @@ MOVE_NOT_EX3: MOVE_NOT_EX4: ;******************************* EX AF,AF' - OUT (PAGE1),A + OUT (SLOT1),A EX AF,AF' ; RET_PAGE1 MOVE_RET: @@ -240,7 +240,7 @@ MOVE_RET: RD_WR_C000: SET 7,D - LD C,PAGE3 + LD C,SLOT3 EX AF,AF' IN A,(C) EX AF,AF' @@ -258,7 +258,7 @@ MOVE_NOT_EX1: MOVE_NOT_EX2: ;******************************* EX AF,AF' - OUT (PAGE3),A + OUT (SLOT3),A EX AF,AF' ; RET_PAGE3 JR MOVE_RET @@ -296,7 +296,7 @@ PAGE_CALC2: ;********************************************* RAMD_X12: ; проверка диска - LD (OPER_DISK),A + LD (ZX_VARS.OPER_DISK),A CALL DISK_REDIR CP 4 JR C,X_AUTO_3DCE @@ -308,7 +308,7 @@ NO_DISK2: X_AUTO_3DCE: CALL RES_1440 - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) JP AUTO_3DCE ;************************************* @@ -325,7 +325,7 @@ RAMD_X14: ; FORMATING JP READ_ONLY DISK_FORM: - LD A,(MED_START+1) + LD A,(ZX_VARS.MED_START+1) CP 14H JR Z,QVICK_FORMAT POP HL @@ -356,15 +356,15 @@ RAMD_FORMAT: CALL GET_RAM_BLK ; ВЫДЕЛЕНИЕ ПАМЯТИ ; LD C,A ; КЛЮЧ RAM-Disk Q_FORM_1: - LD HL,BUFER ; CLEAR DISK BUFER - LD DE,BUFER+1 + LD HL,ZX_VARS.BUFFER ; CLEAR DISK ZX_VARS.BUFFER + LD DE,ZX_VARS.BUFFER+1 LD BC,0FFh LD (HL),0 LDIR LD DE,0 RAMD_F_LOOP: - LD HL,BUFER + LD HL,ZX_VARS.BUFFER LD B,1 PUSH DE CALL WRITE_DISK @@ -391,7 +391,7 @@ CLEAR_RAMD: CLEAR_NEXT: SUB 4 RET C - CP RAMD_KEY_NUM + CP SYS_PAGE.RAMD_KEYS.NUM CCF RET C @@ -429,7 +429,7 @@ READ_ONLY: JP ERR_EXIT FDD_SET: - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A LD C,BIOS.FDD_TO_DRV ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то @@ -447,7 +447,7 @@ HDD_SET:;!TEST 06/01/2024 убирае ; JP C,HDD_PROG_E - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A XOR A LD C,BIOS.HDD_TO_DRV @@ -463,7 +463,7 @@ RAMD_SET: RET C RAMD_SET1: PUSH AF - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD B,A POP AF LD C,BIOS.RAMD_TO_DRV @@ -505,7 +505,7 @@ RAMD_SYM_OK: ;[ ] 07/01/2024 CHOOSE_HDD: PUSH DE - LD A,(OPER_DISK) + LD A,(ZX_VARS.OPER_DISK) LD C,BIOS.GET_DRV_ST CALL EXP_FNS POP DE From 66d3e3bb6b481125507478e63eef1765cde741f2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Jan 2024 00:19:10 +1000 Subject: [PATCH 072/114] SetHDD --> HDD --- SP_TRDOS.ASM | 2 + TRDOS/TR_MSD_2.ASZ | 2 +- TRDOS/TR_MSD_3.ASZ | 11 ++++- TRDOS/TR_MSD_4.ASZ | 101 +++++++++++++++++++++++++++++++++++++++++++++ TRDOS/TR_RMD_S.ASZ | 80 +---------------------------------- 5 files changed, 114 insertions(+), 82 deletions(-) create mode 100644 TRDOS/TR_MSD_4.ASZ diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 2989ddf..b1a6fa4 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -1155,6 +1155,7 @@ WG93_EXE_: JP WG93_EXE ;************************************** DISPLAY "2k" + ;INCLUDE 'trdos/tr_msd_4.asz' BLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' @@ -1215,6 +1216,7 @@ ZG_RUS: ; ;************************************** ;************************************** + INCLUDE 'trdos/tr_msd_4.asz' BLOCK #1000 - $,255 ;************************************** diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index f68ecc2..95974eb 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -249,7 +249,7 @@ LOOP_FIND: LD A,(DE) CP 13 JR Z,CMD_EXE1 - CP 20H + CP ' ' JR Z,CMD_EXE JR NEXT_WORD2 CMD_EXE: diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 6f8675a..be188e1 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -275,7 +275,7 @@ SKEEP_XX1: ;***************************************** MADE_next_blk: PUSH BC - LD C,#95 ;!HARDCODE BIOS.GetMemPageNext (#C7) + LD C,BIOS.GetMemPageNext CALL EXP_FNS POP BC INC L ; SET ZF, if END BLK !!! @@ -441,9 +441,15 @@ FAT_ALL: POP AF SCF RET +;----------------------------------------------------------------------- + ;INCLUDE 'trdos/tr_msd_4.asz' + +;----------------------------------------------------------------------- BLOCK #09FF-$, #FF - BLOCK #0A01-$, #FF + ;родионовский вектор прерывания + DW #FFFF +;----------------------------------------------------------------------- NO_END_CLAST: ; PUSH AF @@ -605,6 +611,7 @@ HDD_ERROR: HDD_PROG_E: LD HL,HD_TX2 JP AUTO_03E4 + ; ;*************************************************************************** diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_MSD_4.ASZ new file mode 100644 index 0000000..9900652 --- /dev/null +++ b/TRDOS/TR_MSD_4.ASZ @@ -0,0 +1,101 @@ + +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + CP #0D + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ; + +.init: ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; + +;[ ] 07/01/2024 +;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR +CHOOSE_HDD: + PUSH DE + LD A,(ZX_VARS.OPER_DISK) + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + POP DE + JR C,.error + AND #40 ;!HARDCODE HDD + CALL Z,.setUp_HDD + ; +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + LD A,(DE) + CP #0D + JR Z,.error +.cont: ; номер раздела + ;INC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + RLA + RLA + LD C,A + ; ; master/slave + ; DEC DE + ; LD A,(DE) + ; CP "2" + ; JR NC,.error + ; CP "0" + ; JR C,.error + ; SUB "0" + ; RLA + ; OR C + ; LD C,A + ; Primary/Secondary, master/slave + DEC DE + LD A,(DE) + CP "4" + JR NC,.error + CP "0" + JR C,.error + SUB "0" + OR C + ; + LD C,BIOS.HDD_PART + CALL EXP_FNS + RET NC + ; +.error: LD HL,MSG_3 + JP ERR_EXIT + ; +.setUp_HDD: + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + PUSH DE + CALL EXP_FNS + POP DE + RET +; \ No newline at end of file diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 469e611..c78a596 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -439,25 +439,6 @@ FDD_SET: ;RET ; -HDD_SET:;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; - RAMD_SET: CALL RAMD_SYM RET C @@ -500,63 +481,4 @@ RAMD_SYM: RAMD_SYM_OK: POP AF RET - - -;[ ] 07/01/2024 -CHOOSE_HDD: - PUSH DE - LD A,(ZX_VARS.OPER_DISK) - LD C,BIOS.GET_DRV_ST - CALL EXP_FNS - POP DE - JR C,.error - AND #40 ;!HARDCODE HDD - JR Z,.error - ; -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - LD A,(DE) - CP #0D - JR Z,.error - ; номер раздела - ;INC DE - LD A,(DE) - CP "4" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - RLA - RLA - LD C,A - ; ; master/slave - ; DEC DE - ; LD A,(DE) - ; CP "2" - ; JR NC,.error - ; CP "0" - ; JR C,.error - ; SUB "0" - ; RLA - ; OR C - ; LD C,A - ; Primary/Secondary, master/slave - DEC DE - LD A,(DE) - CP "4" - JR NC,.error - CP "0" - JR C,.error - SUB "0" - OR C - ; - LD C,BIOS.HDD_PART - CALL EXP_FNS - RET NC - ; -.error: LD HL,MSG_3 - JP ERR_EXIT - -;bit0: Primary/Secondary, bit1 - master/slave, bit2..3: использующийся раздел в MBR \ No newline at end of file +; From 31c19d6b26b96fee961b4300b76b58615120bb80 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Mon, 29 Jan 2024 00:21:15 +1000 Subject: [PATCH 073/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 4 ---- TRDOS/TR_MSD_4.ASZ | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 84d47b2..713bcf1 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 84d47b2818758fdceda21ecf2953324c1f339858 +Subproject commit 713bcf1538ff822231da15aed4d8fb7611ebe205 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 95974eb..b6278be 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -559,10 +559,6 @@ WORDS: DB 5,'CLEAR' ; DW SPR_1 DB 2,"AY" DW AY8910 - ;[ ] 07/01/2024 - DB 6,'SETHDD' ; /SETHDD XYZ, где X - chanel, Y - master/slave, Z - 0..3 - номер раздела - DW CHOOSE_HDD - ; DB 0 ;SAVE_AUTOEXEC: diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_MSD_4.ASZ index 9900652..41ac92f 100644 --- a/TRDOS/TR_MSD_4.ASZ +++ b/TRDOS/TR_MSD_4.ASZ @@ -31,7 +31,7 @@ HDD_SET:;!TEST ;RET ; -;[ ] 07/01/2024 +;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: PUSH DE From 8930150cf8f945bf312e55c9b40ef1ed9f2eb71a Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 31 Jan 2024 23:11:19 +1000 Subject: [PATCH 074/114] ... --- ProfRom_Disasm/rom3_trdos.a80 | 3 +- SP_TRDOS.ASM | 315 +++++++------- SP__48.ASM | 7 +- Shared_Includes | 2 +- TRDOS/{TR_MSD_4.ASZ => TR_HDD_4.ASZ} | 32 -- TRDOS/TR_MSD_3.ASZ | 33 +- TRDOS/TR_RMD_S.ASZ | 603 ++++++++++++++++----------- 7 files changed, 548 insertions(+), 447 deletions(-) rename TRDOS/{TR_MSD_4.ASZ => TR_HDD_4.ASZ} (66%) diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 index 7c1223e..ab49106 100755 --- a/ProfRom_Disasm/rom3_trdos.a80 +++ b/ProfRom_Disasm/rom3_trdos.a80 @@ -2079,7 +2079,8 @@ x1403 XOR A ; RET ;возвpат -;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. +;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, +; #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. x1451 LD A,(#5CF1) ;все скопировали? OR A diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b1a6fa4..735d468 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -12,6 +12,8 @@ INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/macroses/macros.z80' TRDOS_ROM_CMD: .READ_BPB EQU BIOS.HDD_READ_BPB and #BF @@ -68,8 +70,6 @@ AUTO_FF00 EQU #FF00 AUTO_FFFF EQU #FFFF ;**************************************** - - DISPLAY "Start." START: DI LD DE,#FFFF LD A,7 @@ -82,7 +82,7 @@ CONT_1: JR CONT_2 //////////////////////////////////////////////////////////////////////// - BLOCK #10-$,0 + _mInfoBLOCK #10-$,0 RST10: JP PRINT_SYM //////////////////////////////////////////////////////////////////////// @@ -92,7 +92,7 @@ CONT_2: JP CONT_3 //////////////////////////////////////////////////////////////////////// - BLOCK #18-$,0 + _mInfoBLOCK #18-$,0 PRINT_LN: JP PRINT_L CONT_3: @@ -103,7 +103,7 @@ AUTO_001E: JR CONT_4 //////////////////////////////////////////////////////////////////////// - BLOCK #20-$,0 + _mInfoBLOCK #20-$,0 RST20: JP RST20_EXE RET @@ -115,7 +115,7 @@ CONT_4: JR CONT_5 //////////////////////////////////////////////////////////////////////// - BLOCK #28-$,0 + _mInfoBLOCK #28-$,0 RST28: JP RST28_EXE //////////////////////////////////////////////////////////////////////// @@ -129,7 +129,7 @@ CONT_5: //////////////////////////////////////////////////////////////////////// REDIR_RST38: - BLOCK #38-$,#FF + _mInfoBLOCK #38-$,#FF ; JP RST38X ; EI ; RET @@ -161,14 +161,14 @@ CONT_7: LD HL,#B8ED //////////////////////////////////////////////////////////////////////// - BLOCK #64-$,0 + _mInfoBLOCK #64-$,0 AUTO_0064: JR CONT_8 //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// - BLOCK #66-$,0 + _mInfoBLOCK #66-$,0 ;********** MAGIC *********** ; JP MAGIC_1 ;AUTO_2A56 RETN @@ -191,7 +191,7 @@ RET_1: LD BC,AUTO_0540 LD (ZX_VARS.ERR_BEEP),BC LD (ZX_VARS.TOP_CLEAR),HL - LD HL,03C00h + LD HL,#3C00 LD (ZX_VARS.ZG),HL LD HL,(ZX_VARS.TOP_CLEAR) LD (HL),'>' @@ -246,7 +246,7 @@ AUTO_00C8: AUTO_0100: LD (HL),201 RST_ROM ROUTINE.clear_prb - LD HL,ZX_VARS.L_SCR_SIZE + LD HL,ZX_VARS.SCR_SIZE LD (HL),2 LD HL,AUTO_128B PUSH HL @@ -935,7 +935,7 @@ AUTO_063C: CALL AUTO_03FD LD A,(ZX_VARS.N_FILES) CP 128 - JP Z,AUTO_1C45 + JP Z,AUTO_2723 LD HL,ZX_VARS.VAR_2 LD DE,ZX_VARS.FL_START LD BC,7 @@ -1043,7 +1043,7 @@ AUTO_072F: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_0775 @@ -1075,7 +1075,7 @@ AUTO_0744: AUTO_0775: LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -1140,7 +1140,7 @@ AUTO_07D2: ; AUTO_07E7: - BLOCK #07E7-$,255 + _mInfoBLOCK #07E7-$,255 CALL AUTO_03FD LD HL,(ZX_VARS.FL_PLACE) LD (ZX_VARS.CLEAR_SEC),HL @@ -1154,74 +1154,71 @@ WG93_EXE_: AND 252 JP WG93_EXE ;************************************** - DISPLAY "2k" - ;INCLUDE 'trdos/tr_msd_4.asz' - BLOCK #0840-$,255 + ;INCLUDE 'trdos/tr_HDD_4.asz' + _mInfoBLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' - BLOCK #0B00-$,255 -ZG_RUS: - DB 3 ; идентификатор версии TR-DOS ??? + _mInfoBLOCK #0B00-$,255 +;!TODO russian charset +ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** INCLUDE 'trdos/tr_msd_2.asz' ; DSS 0E00h,255 ;************************************** -; +;!TODO russian charset ; Русский знакогенератор - 40h..7Fh символы. ; ; DSS 0E00h,255 -; DB 0,0,76,82,114,82,76,0,0,0,56,4,60,68 -; DB 60,0,0,0,120,64,120,68,120,0,0,0,72 -; DB 72,72,72,124,4,0,0,24,40,40,40,124,68 -; DB 0,0,56,68,120,64,60,0,0,16,56,84,84 -; DB 56,16,0,0,0,124,64,64,64,64,0,0,0,68 -; DB 40,16,40,68,0,0,0,68,76,84,100,68,0 -; DB 0,16,68,76,84,100,68,0,0,0,72,80,112 -; DB 72,68,0,0,0,28,36,36,36,68,0,0,0,68 -; DB 108,84,84,68,0,0,0,68,68,124,68,68,0 -; DB 0,0,56,68,68,68,56,0,0,0,124,68,68,68 -; DB 68,0,0,0,60,68,60,36,68,0,0,0,120,68 -; DB 68,120,64,64,0,0,56,64,64,64,56,0,0 -; DB 0,124,16,16,16,16,0,0,0,68,68,60,4,56 -; DB 0,0,0,84,84,56,84,84,0,0,0,120,68,120 -; DB 68,120,0,0,0,64,64,120,68,120,0,0,0 -; DB 68,68,116,76,116,0,0,0,56,68,24,68,56 -; DB 0,0,0,84,84,84,84,124,0,0,0,56,4,28 -; DB 4,56,0,0,0,84,84,84,84,126,2,0,0,68 -; DB 68,60,4,4,0,0,0,96,32,56,36,56,0,0,76 -; DB 82,114,82,82,76,0,0,60,66,66,126,66 -; DB 66,0,0,124,64,124,66,66,124,0,0,68,68 -; DB 68,68,68,126,2,0,24,36,36,36,36,126 -; DB 66,0,126,64,124,64,64,126,0,0,56,84 -; DB 84,56,16,16,0,0,126,64,64,64,64,64,0 -; DB 0,66,36,24,24,36,66,0,0,66,70,74,82 -; DB 98,66,0,0,90,70,74,82,98,66,0,0,68,72 -; DB 112,72,68,66,0,0,30,34,34,34,34,66,0 -; DB 0,66,102,90,66,66,66,0,0,66,66,126,66 -; DB 66,66,0,0,60,66,66,66,66,60,0,0,126 -; DB 66,66,66,66,66,0,0,62,66,66,62,34,66 -; DB 0,0,124,66,66,124,64,64,0,0,60,66,64 -; DB 64,66,60,0,0,254,16,16,16,16,16,0,0 -; DB 66,66,62,2,66,60,0,0,84,84,56,84,84 -; DB 84,0,0,124,66,124,66,66,124,0,0,64,64 -; DB 124,66,66,124,0,0,66,66,114,74,74,114 -; DB 0,0,60,66,12,2,66,60,0,0,84,84,84,84 -; DB 84,124,0,0,60,66,14,2,66,60,0,0,84,84 -; DB 84,84,84,126,2,0,66,66,66,126,2,2,0 -; DB 60,66,153,161,161,153,66,60 + ; DB 0,0,76,82,114,82,76,0,0,0,56,4,60,68 + ; DB 60,0,0,0,120,64,120,68,120,0,0,0,72 + ; DB 72,72,72,124,4,0,0,24,40,40,40,124,68 + ; DB 0,0,56,68,120,64,60,0,0,16,56,84,84 + ; DB 56,16,0,0,0,124,64,64,64,64,0,0,0,68 + ; DB 40,16,40,68,0,0,0,68,76,84,100,68,0 + ; DB 0,16,68,76,84,100,68,0,0,0,72,80,112 + ; DB 72,68,0,0,0,28,36,36,36,68,0,0,0,68 + ; DB 108,84,84,68,0,0,0,68,68,124,68,68,0 + ; DB 0,0,56,68,68,68,56,0,0,0,124,68,68,68 + ; DB 68,0,0,0,60,68,60,36,68,0,0,0,120,68 + ; DB 68,120,64,64,0,0,56,64,64,64,56,0,0 + ; DB 0,124,16,16,16,16,0,0,0,68,68,60,4,56 + ; DB 0,0,0,84,84,56,84,84,0,0,0,120,68,120 + ; DB 68,120,0,0,0,64,64,120,68,120,0,0,0 + ; DB 68,68,116,76,116,0,0,0,56,68,24,68,56 + ; DB 0,0,0,84,84,84,84,124,0,0,0,56,4,28 + ; DB 4,56,0,0,0,84,84,84,84,126,2,0,0,68 + ; DB 68,60,4,4,0,0,0,96,32,56,36,56,0,0,76 + ; DB 82,114,82,82,76,0,0,60,66,66,126,66 + ; DB 66,0,0,124,64,124,66,66,124,0,0,68,68 + ; DB 68,68,68,126,2,0,24,36,36,36,36,126 + ; DB 66,0,126,64,124,64,64,126,0,0,56,84 + ; DB 84,56,16,16,0,0,126,64,64,64,64,64,0 + ; DB 0,66,36,24,24,36,66,0,0,66,70,74,82 + ; DB 98,66,0,0,90,70,74,82,98,66,0,0,68,72 + ; DB 112,72,68,66,0,0,30,34,34,34,34,66,0 + ; DB 0,66,102,90,66,66,66,0,0,66,66,126,66 + ; DB 66,66,0,0,60,66,66,66,66,60,0,0,126 + ; DB 66,66,66,66,66,0,0,62,66,66,62,34,66 + ; DB 0,0,124,66,66,124,64,64,0,0,60,66,64 + ; DB 64,66,60,0,0,254,16,16,16,16,16,0,0 + ; DB 66,66,62,2,66,60,0,0,84,84,56,84,84 + ; DB 84,0,0,124,66,124,66,66,124,0,0,64,64 + ; DB 124,66,66,124,0,0,66,66,114,74,74,114 + ; DB 0,0,60,66,12,2,66,60,0,0,84,84,84,84 + ; DB 84,124,0,0,60,66,14,2,66,60,0,0,84,84 + ; DB 84,84,84,126,2,0,66,66,66,126,2,2,0 + ; DB 60,66,153,161,161,153,66,60 ; ;************************************** ;************************************** - INCLUDE 'trdos/tr_msd_4.asz' - BLOCK #1000 - $,255 + INCLUDE 'trdos/tr_HDD_4.asz' + _mInfoBLOCK #1000 - $,255 ;************************************** - DISPLAY "4k" - AUTO_1000: DB 22,9,5,"Interface one fitted",0 ; @@ -1762,7 +1759,7 @@ AUTO_146F: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_14CB @@ -1802,7 +1799,7 @@ AUTO_14A5: AUTO_14CB: LD (ZX_VARS.VAR_2_0),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -1929,7 +1926,7 @@ AUTO_15DB: RET Z PUSH BC PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD C,(HL) LD B,0 POP HL @@ -1975,7 +1972,7 @@ AUTO_162A: AUTO_1644: LD (ZX_VARS.FL_TYPE),HL PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD C,(HL) LD B,0 POP HL @@ -2019,7 +2016,7 @@ AUTO_1680: LD A,17 AUTO_168F: DEC A - LD (ZX_VARS.L_5D23),A + LD (ZX_VARS.WORK_SPACE.Size),A LD B,A LD C,0 RET @@ -2045,9 +2042,9 @@ CMD_MOVE: LD DE,0900h ADD HL,DE LD (ZX_VARS.VAR_1),HL - LD A,(ZX_VARS.L_5D23) + LD A,(ZX_VARS.WORK_SPACE.Size) SUB 9 - LD (ZX_VARS.L_5D23),A + LD (ZX_VARS.WORK_SPACE.Size),A LD HL,(ZX_VARS.FL_N_4) LD DE,0 LD B,9 @@ -2136,7 +2133,7 @@ CMD_MOVE: LD DE,0 LD B,9 CALL WRITE_DISK - LD A,(ZX_VARS.L_5D23) + LD A,(ZX_VARS.WORK_SPACE.Size) ADD A,9 LD B,A LD C,0 @@ -2178,7 +2175,7 @@ AUTO_17A5: OR A RET Z PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size SUB (HL) POP HL JR NC,AUTO_17DD @@ -2204,7 +2201,7 @@ AUTO_17BA: AUTO_17DD: LD (ZX_VARS.AUTO_5CD3),A PUSH HL - LD HL,ZX_VARS.L_5D23 + LD HL,ZX_VARS.WORK_SPACE.Size LD B,(HL) POP HL XOR A @@ -2235,7 +2232,6 @@ AUTO_17F7: AUTO_180D: LDIR RET - DISPLAY "6k" ; ; ; @@ -3170,7 +3166,7 @@ AUTO_1E67: JP R_W_REDIR ;LD (HL),30 ; НЕ исп. !!! - BLOCK #1E70-$,0 + _mInfoBLOCK #1E70-$,0 AUTO_1E70: POP HL POP BC @@ -3342,21 +3338,24 @@ AUTO_1F55: CALL AUTO_1DA9 JP AUTO_01D3 AUTO_1FB9: - DB 1,9,2,10,3,11,4,12,5,13,6,14,7,15,8,16,1 +;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. + DB 1 + DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 + test_d_traks: CALL get_disk_time OR 17 LD B,A - LD A,'2' + LD A,#32 CALL Goto_trk LD A,2 CALL Goto_trk CALL pause_50ms IN A,(FDC_93.Command) AND 4 - LD A,'P' + LD A,#50 JR Z,AUTO_1FE7 - LD A,'(' + LD A,#28 AUTO_1FE7: LD (ZX_VARS.MED_START),A RET @@ -3519,7 +3518,7 @@ AUTO_20E5: xchg_intf1: PUSH AF LD A,(ZX_VARS.BEG_ADRESS) - CP 244 + CP #F4 JR Z,AUTO_211C XOR A LD HL,ZX_VARS.INT_1_VAR @@ -3533,7 +3532,7 @@ xchg_intf1: JR NZ,AUTO_2111 LD DE,AUTO_5E34 AUTO_2111: - LD B,'-' + LD B,#2D AUTO_2113: LD C,(HL) LD A,(DE) @@ -4517,9 +4516,6 @@ AUTO_27ED: DB "Directory full",141 AUTO_27FC: DB "No disk",141 - - DISPLAY "10k" - AUTO_2804: DB "Stream opened",141 AUTO_2812: @@ -5426,19 +5422,20 @@ AUTO_2ECC: RRCA RRCA RRCA - OUT (0FEH),A - LD A,(ZX_VARS.AUTO_5B08) - CP 238 - JR NZ,AUTO_2EF7 + OUT (BorderColor),A + LD A,(ZX_VARS.SWAP_ROM_PRESENCE) ;берем байт из #5B08 + CP #EE ;там #EE? опкод XOR в процедуре переключения банок ROM Basic 48<->128 + ;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. + JR NZ,AUTO_2EF7 ;если нет, то системных переменных 128К нет PUSH BC LD BC,PORT_128 - LD A,(ZX_VARS.AUTO_5B5C) + LD A,(ZX_VARS.COPY_P128) OUT (C),A POP BC AUTO_2EF7: - LD A,(ZX_VARS.K_STATE) + LD A,(ZX_VARS.K_STATE) ;берем флаг прерываний OR A - LD A,201 + LD A,#C9 ;установка переключателя ПЗУ на бейсик LD (ZX_VARS.K_STATE),A JR NZ,AUTO_2F03 EI @@ -5447,7 +5444,7 @@ AUTO_2F03: JP ZX_VARS.K_STATE AUTO_2F07: LD A,(AUTO_4011) - OR 3Ch + OR #3C AUTO_2F0C: OUT (FDC_93.DrvCTRL),A RET @@ -5862,7 +5859,7 @@ AUTO_31C8: ; ; ; - BLOCK #31F3 - $,255 + _mInfoBLOCK #31F3 - $,255 AUTO_31F3: LD HL,(ZX_VARS.CHANS) OR A @@ -5871,7 +5868,7 @@ AUTO_31F3: RET - BLOCK #3200-$,#FF + _mInfoBLOCK #3200-$,#FF INIT_2X80: JP AUTO_106E INIT_2X80_1: @@ -6339,7 +6336,7 @@ EDIT_X00: LD (HL),128 EDIT_X01: RST RST20 ; ввод клавиши - DW 015D4H + DW #15D4 EDIT_X02: CALL BEEP_1 CP 24 @@ -6349,11 +6346,11 @@ EDIT_X02: CP 16 ; от 7 до 16 - ред. строки JR C,EDIT_X04 RST RST20 ; ввод спец символов - DW 00F58H + DW #0F58 JR EDIT_X01 EDIT_X03: RST RST20 ; станд. ввод в буфер редактирования - DW 00F81H + DW #0F81 JR EDIT_X01 EDIT_X04: CP 7 ; на 7 - нет операции @@ -6365,7 +6362,7 @@ EDIT_X04: CP 11 JR Z,EDIT_X01 RST RST20 ; выполнить операцию редактирования - DW 00F92H + DW #0F92 JR EDIT_X01 @@ -6375,32 +6372,29 @@ EDIT_X05: ;****************************************** -RUS_PRINT: - AND '?' - LD L,A - LD H,0 - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,ZG_RUS - ADD HL,BC - DB 17 - SUB D - LD E,H - LD BC,RST08 - LDIR - LD A,201 - LD (ZX_VARS.AUTO_5C9A),A - JP ZX_VARS.AUTO_5C9A +;!TODO russian charset +; RUS_PRINT: +; AND #3F +; LD L,A +; LD H,0 +; ADD HL,HL +; ADD HL,HL +; ADD HL,HL +; LD BC,ZG_RUS +; ADD HL,BC +; LD DE,#5C92 +; LD BC,8 +; LDIR +; LD A,#C9 +; LD (ZX_VARS.AUTO_5C9A),A +; JP ZX_VARS.AUTO_5C9A ;************************************** ; DSS 3900H,'#' ;********************************** - DISPLAY "14k" - - BLOCK #3C00 - $,255 + _mInfoBLOCK #3C00 - $,255 AUTO_3C00: RST R38 JR AUTO_3C06 @@ -6408,18 +6402,18 @@ AUTO_3C00: JR AUTO_3C09 ; ; - BLOCK #3C06 - $,255 + _mInfoBLOCK #3C06 - $,255 AUTO_3C06: JP AUTO_3D00 ; ; - BLOCK #3C09 - $,255 + _mInfoBLOCK #3C09 - $,255 AUTO_3C09: JP AUTO_3D03 ;************************************ ;!FIXIT not used - BLOCK #3C10 - $,255 + _mInfoBLOCK #3C10 - $,255 ;KBD_EXP: LD A,CNF_PORT.ZX_BIOS OUT (CNF_PORT.ON),A @@ -6427,7 +6421,7 @@ AUTO_3C09: ; ;************************************ ;!FIXIT not used - BLOCK #3C18 - $,255 + _mInfoBLOCK #3C18 - $,255 ;KBD_OFF: LD A,CNF_PORT.ZX_BIOS OUT (CNF_PORT.ON),A @@ -6435,14 +6429,14 @@ AUTO_3C09: ;************************************ ;!FIXIT not used - BLOCK #3C20 - $,255 + _mInfoBLOCK #3C20 - $,255 READR_X: CALL get_disk_time LD B,A JP set_side_0 ;************************************ ;!FIXIT not used - BLOCK #3C30 - $,255 + _mInfoBLOCK #3C30 - $,255 IN A,(FDC_93.Command) RET @@ -6525,7 +6519,7 @@ CMD_COPY.FIXED: INC SP JP AUTO_03D9 ;******************************* - BLOCK #3CC0 - $,255 + _mInfoBLOCK #3CC0 - $,255 MAGIC_1: PUSH AF LD A,CNF_PORT.ZX_BIOS @@ -6533,7 +6527,7 @@ MAGIC_1: POP AF JP MAGIC_2 ;******************************* - BLOCK #3CC9 - $,255 + _mInfoBLOCK #3CC9 - $,255 MAGIC_3: PUSH AF LD A,CNF_PORT.ZX_BIOS @@ -6573,17 +6567,17 @@ REDIR_3D13: JP EXP_FNS ; ;***************************** - BLOCK #3CFA - $,255 + _mInfoBLOCK #3CFA - $,255 AUTO_3CFA: JP xchg_intf1 ;****** 3D13 redirection ****** - BLOCK #3CFD - $,255 + _mInfoBLOCK #3CFD - $,255 AUTO_3CFD: JP REDIR_3D13 ; JP AUTO_283C ;***********************************************************************; - BLOCK #3D00-$,#FF + _mInfoBLOCK #3D00-$,#FF AUTO_3D00: NOP @@ -6602,7 +6596,7 @@ AUTO_3D0E: NOP JR AUTO_3CFA ;****** 3D13 point !!! **** - BLOCK #3D13-$,#FF + _mInfoBLOCK #3D13-$,#FF NOP JR AUTO_3CFD AUTO_3D16: @@ -6647,7 +6641,7 @@ AUTO_3D44: AUTO_3D4C: XOR A OUT (FDC_93.DrvCTRL),A - IN A,(#F6) + IN A,(#F6) ; ничего не даёт LD HL,AUTO_3D38 LD DE,ZX_VARS.MEM_BOT LD BC,AUTO_3D38.Size + AUTO_3D44.Size @@ -6663,31 +6657,34 @@ AUTO_3D67: ; PUSH HL LD HL,AUTO_3D2F PUSH HL - LD HL,1655h ;!HARDCODE + LD HL,ZX_VARS.PROG.MAKE_ROOM PUSH HL - LD HL,ZX_VARS.AUTO_5BFF + LD HL,ZX_VARS.TSTACK PUSH HL LD (HL),#C9 ; RET code LD HL,ZX_VARS.P_RAMTOP+1 LD BC,CONT_8+7 RET PRINT_CR: - LD A,13 + LD A,#0D ; enter PRINT_SYM: JP PRINT_RED - RST R38 - RST R38 - NOP - NOP - JP RUS_PRINT - RST R38 - RST R38 - RST R38 - NOP - NOP - RST R38 - RST R38 - RST R38 + + _mInfoBLOCK #3D8F-$,#FF ; ХЕР + DW 0000 ; ЗНАЕТ + _mInfoBLOCK 3,#FF ; ЗАЧЕМ + +;======================================================================= +;!TODO russian charset +; PRINT_CR: +; LD A,#0D ; enter +; PRINT_SYM: +; CP #80 +; JP C,PRINT_RED +; JP RUS_PRINT +;======================================================================= + + AUTO_3D94: RST_ROM ROUTINE.print_a RET @@ -6731,22 +6728,22 @@ SET_DISK: AUTO_3DCE: LD HL,ZX_VARS.PDOS_COPY LD C,A - LD A,3Ch + LD A,#3C OR C OUT (FDC_93.DrvCTRL),A LD (HL),A CALL get_disk_time - AND 128 + AND #80 JR Z,AUTO_3DFA CALL RESET_WG CALL test_disk CALL get_disk_type - CP 255 + CP #FF JR NZ,AUTO_3DFA PUSH HL CALL test_d_traks POP HL - CP 'P' + CP #50 LD A,0 JR NZ,AUTO_3DF9 LD A,128 @@ -6755,7 +6752,7 @@ AUTO_3DF9: AUTO_3DFA: CALL READ_TRK_NUM pause_50ms: - LD A,12 ;'P' + LD A,12 ; #50 pause_1ms: LD C,255 AUTO_3E01: @@ -7081,7 +7078,7 @@ AUTO_3FEC: ;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- - BLOCK #3FF0-$, #FF + _mInfoBLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI ;LD A,SYS_PORT.EXTENSION @@ -7093,7 +7090,7 @@ HD_CMD: PUSH AF ; ;----[ From TR-DOS to API #80..#FF]----- - BLOCK #3FF8-$, #FF + _mInfoBLOCK #3FF8-$, #FF EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;PUSH AF ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать @@ -7108,7 +7105,7 @@ EXP_FNS_PREPARE_RET: ; ; - BLOCK #4000-$, #FF - DISPLAY "16k..ALL!" + _mInfoBLOCK #4000-$, #FF ; - + DISPLAY "\n\rNEW RAMDRV READ = ",/D,NEW_RAMDRV_READ +; \ No newline at end of file diff --git a/SP__48.ASM b/SP__48.ASM index 2762a51..cda53cf 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19096,11 +19096,8 @@ L3BC9: SCF ; Return as if no trailing space JP $0B03 ; PO-FETCH - Return via Position Fetch routine -L3BD2: DEFM "SPECTRU" ; SPECTRUM token - DEFB 'M'+$80 - -L3BDA: DEFM "PLA" ; PLAY token - DEFB 'Y'+$80 +L3BD2: DC "SPECTRUM" ; SPECTRUM token +L3BDA: DC "PLAY" ; PLAY token ;; KP_SCAN2 L3BDE: JP L3C01 ; This is not called from either ROM. It can be used to scan the keypad. diff --git a/Shared_Includes b/Shared_Includes index 713bcf1..4d14c95 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 713bcf1538ff822231da15aed4d8fb7611ebe205 +Subproject commit 4d14c951c21a9e98b8c301bece3f16bd5d5e5cfc diff --git a/TRDOS/TR_MSD_4.ASZ b/TRDOS/TR_HDD_4.ASZ similarity index 66% rename from TRDOS/TR_MSD_4.ASZ rename to TRDOS/TR_HDD_4.ASZ index 41ac92f..d601814 100644 --- a/TRDOS/TR_MSD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -1,36 +1,4 @@ -HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - CP #0D - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ; - -.init: ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; - ;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index be188e1..670fff2 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -446,7 +446,7 @@ FAT_ALL: ;INCLUDE 'trdos/tr_msd_4.asz' ;----------------------------------------------------------------------- - BLOCK #09FF-$, #FF + _mInfoBLOCK #09FF-$, #FF ;родионовский вектор прерывания DW #FFFF ;----------------------------------------------------------------------- @@ -613,6 +613,35 @@ HDD_PROG_E: JP AUTO_03E4 ; -;*************************************************************************** +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP ' ' + JR Z,.loop + CP #0D + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ; +.init: ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + LD A,(ZX_VARS.OPER_DISK) + LD B,A + XOR A + LD C,BIOS.HDD_TO_DRV + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + JP EXP_FNS + ;CALL EXP_FNS + ;EI + ;RET + ; +;*************************************************************************** \ No newline at end of file diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index c78a596..6a90741 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,4 +1,7 @@ ; + DEFINE NEW_RAMDRV_READ 0 + + DISK_REDIR: PUSH HL PUSH BC @@ -43,7 +46,7 @@ RECALL_MSD: TEST_RAMD: PUSH HL - LD C,#CE ;!HARDCODE BIOS.GET_RAMD_ST + LD C,BIOS.GET_RAMD_ST CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то ;EI @@ -51,250 +54,7 @@ TEST_RAMD: POP HL RET -; ╔═══════════════════════════════════╗ -; ║ RD/WR SECTOR HL - ZX_VARS.BUFFER ║\ -; ║ ZX_VARS.CONT_SEC - SEC/TRK FOR READ/WRITE ║\ -; ║ COM_RD_WR - команда чтение/запись ║\ -; ║ 0 - чтение, 255 - запись ║\ -; ╚═══════════════════════════════════╝\ -; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -READ_WRITE_RAMD: - -; -; CALL DISK_REDIR -; SUB 4 -; RET C -; CP 16 -; CCF -; RET C -; -; PUSH HL -; LD HL,RAMD_KEYS -; ADD A,L -; LD L,A -; IN A,(SLOT3) -; LD C,A -; LD A,SYS_PAGE -; DI -; OUT (SLOT3),A -; LD L,(HL) -; LD A,C -; OUT (SLOT3),A -; EI -; LD A,L ; 1-st block -; POP HL -; -; AND A -; SCF -; RET Z -; EX AF,AF' -; -; IN A,(RGADR) -; PUSH AF -; -; PUSH HL -; PUSH DE -; PUSH BC -; -; LD DE,(ZX_VARS.CONT_SEC) -; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! -; RRCA -; RRCA -; RRCA -; RRCA -; LD D,A -; AND 0F0H -; OR E -; LD E,A -; LD A,D -; AND 0FH -; LD D,A -; -; LD A,(ZX_VARS.RD_WR_COM) -; AND A -; JR Z,RAMD_READ -; PUSH AF -; LD A,0C0H -; OUT (RGADR),A -; POP AF -;RAMD_READ: -; -; POP BC -; PUSH BC -; LD C,0C8H -; DI -; EX AF,AF' -; CALL EXP_FNS ; чтение/запись RAM-Disk -; EI -; POP BC -; POP DE -; POP HL -; POP AF -; OUT (RGADR),A -; LD DE,(ZX_VARS.CONT_SEC) -; -; LD A,B -; -;RAMD_TRK_CONT: -; SUB 16 -; JR C,RAMD_NO_TRK -; INC D -; JR RAMD_TRK_CONT -; -;RAMD_NO_TRK: -; ADD A,16 -; ADD A,E -; CP 16 -; JR C,RAMD_NO_TRK1 -; SUB 16 -; INC D -;RAMD_NO_TRK1: -; LD E,A -; -; LD A,H -; ADD A,B -; LD H,A -; -; LD B,0 -; -; LD (ZX_VARS.CONT_SEC),DE -; AND A -; RET -; -; - - - - INC B -WD_WR_RAMD_LOOP: - DEC B - RET Z - PUSH BC - PUSH HL - CALL RD_WR_1SEC - POP HL - CALL RAMD_NEXT_SEC - POP BC - JR WD_WR_RAMD_LOOP - -RAMD_NEXT_SEC: - PUSH HL - LD HL,ZX_VARS.CONT_SEC - LD A,16 - INC (HL) - CP (HL) - JR NZ,RAMD_NEXT_1 - LD (HL),0 - INC HL - INC (HL) -RAMD_NEXT_1: - POP HL - LD BC,0100h - ADD HL,BC - RET - -RD_WR_1SEC: - LD DE,(ZX_VARS.CONT_SEC) - CALL PAGE_CALC2 - DI - LD A,(ZX_VARS.RD_WR_COM) - AND 0C0H - OUT (RGADR),A - LD A,H - CP 0A0H - LD A,(ZX_VARS.RD_WR_COM) - LD E,0 - LD D,C - SET 6,D - JR C,RD_WR_C000 - -RD_WR_4000: - RES 7,D ; DE - адрес данных RAMD - LD C,SLOT1 - EX AF,AF' - IN A,(C) - EX AF,AF' - OUT (C),B -;****** ПЕРЕМЕЩЕНИЕ ДАННЫХ ***** - LD BC,100H - AND A - JR NZ,MOVE_NOT_EX3 - EX DE,HL -MOVE_NOT_EX3: - LDIR ; работать здесь же, в TR-DOS !!! - AND A - JR NZ,MOVE_NOT_EX4 - EX DE,HL -MOVE_NOT_EX4: -;******************************* - EX AF,AF' - OUT (SLOT1),A - EX AF,AF' -; RET_PAGE1 -MOVE_RET: - LD A,0 - OUT (RGADR),A - EI - RET - -RD_WR_C000: - SET 7,D - LD C,SLOT3 - EX AF,AF' - IN A,(C) - EX AF,AF' - OUT (C),B -;****** ПЕРЕМЕЩЕНИЕ ДАННЫХ ***** - LD BC,100H - AND A - JR NZ,MOVE_NOT_EX1 - EX DE,HL -MOVE_NOT_EX1: - LDIR ; работать здесь же, в TR-DOS !!! - AND A - JR NZ,MOVE_NOT_EX2 - EX DE,HL -MOVE_NOT_EX2: -;******************************* - EX AF,AF' - OUT (SLOT3),A - EX AF,AF' -; RET_PAGE3 - JR MOVE_RET - -;********************************************** -PAGE_CALC2: - LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! - RRCA - RRCA - RRCA - RRCA - LD D,A - AND #F0 - OR E - LD E,A - LD A,D - AND #0F - LD D,A - PUSH HL - LD C,BIOS.RAMD_CALC_PAGE - CALL DISK_REDIR - SUB 4 - CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; - LD B,A - LD C,H - POP HL - ;EI - RET NC - JP ERROR_DISK - - - -;********************************************* RAMD_X12: ; проверка диска LD (ZX_VARS.OPER_DISK),A CALL DISK_REDIR @@ -326,7 +86,7 @@ RAMD_X14: ; FORMATING DISK_FORM: LD A,(ZX_VARS.MED_START+1) - CP 14H + CP #14 JR Z,QVICK_FORMAT POP HL POP BC @@ -349,7 +109,7 @@ RAMD_FORMAT: POP HL POP BC POP AF - LD B,28H ; размер 640K + LD B,#28 ; размер 640K CALL DISK_REDIR SUB 4 @@ -358,7 +118,7 @@ RAMD_FORMAT: Q_FORM_1: LD HL,ZX_VARS.BUFFER ; CLEAR DISK ZX_VARS.BUFFER LD DE,ZX_VARS.BUFFER+1 - LD BC,0FFh + LD BC,#FF LD (HL),0 LDIR @@ -481,4 +241,353 @@ RAMD_SYM: RAMD_SYM_OK: POP AF RET + ; +;======================================================================- +; READ_WRITE_RAMD: +; +; CALL DISK_REDIR +; SUB 4 +; RET C +; CP 16 +; CCF +; RET C +; +; PUSH HL +; LD HL,RAMD_KEYS +; ADD A,L +; LD L,A +; IN A,(SLOT3) +; LD C,A +; LD A,SYS_PAGE +; DI +; OUT (SLOT3),A +; LD L,(HL) +; LD A,C +; OUT (SLOT3),A +; EI +; LD A,L ; 1-st block +; POP HL +; +; AND A +; SCF +; RET Z +; EX AF,AF' +; +; IN A,(RGADR) +; PUSH AF +; +; PUSH HL +; PUSH DE +; PUSH BC +; +; LD DE,(ZX_VARS.CONT_SEC) +; LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! +; RRCA +; RRCA +; RRCA +; RRCA +; LD D,A +; AND 0F0H +; OR E +; LD E,A +; LD A,D +; AND 0FH +; LD D,A +; +; LD A,(ZX_VARS.RD_WR_COM) +; AND A +; JR Z,RAMD_READ +; PUSH AF +; LD A,0C0H +; OUT (RGADR),A +; POP AF +;RAMD_READ: +; +; POP BC +; PUSH BC +; LD C,0C8H +; DI +; EX AF,AF' +; CALL EXP_FNS ; чтение/запись RAM-Disk +; EI +; POP BC +; POP DE +; POP HL +; POP AF +; OUT (RGADR),A +; LD DE,(ZX_VARS.CONT_SEC) +; +; LD A,B +; +;RAMD_TRK_CONT: +; SUB 16 +; JR C,RAMD_NO_TRK +; INC D +; JR RAMD_TRK_CONT +; +;RAMD_NO_TRK: +; ADD A,16 +; ADD A,E +; CP 16 +; JR C,RAMD_NO_TRK1 +; SUB 16 +; INC D +;RAMD_NO_TRK1: +; LD E,A +; +; LD A,H +; ADD A,B +; LD H,A +; +; LD B,0 +; +; LD (ZX_VARS.CONT_SEC),DE +; AND A +; RET +;======================================================================- + + + + +;*********************************************************************** +READ_WRITE_RAMD: + + IFN NEW_RAMDRV_READ + + +; ╔═══════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFFER ║\ +; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD_WR_COM - команда чтение/запись ║\ +; ║ 0 - чтение, 255 - запись ║\ +; ╚═══════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + INC B +WD_WR_RAMD_LOOP: + DEC B + RET Z + PUSH BC + PUSH HL + CALL RD_WR_1SEC + POP HL + CALL RAMD_NEXT_SEC + POP BC + JR WD_WR_RAMD_LOOP + +RAMD_NEXT_SEC: + PUSH HL + LD HL,ZX_VARS.CONT_SEC + LD A,16 + INC (HL) + CP (HL) + JR NZ,.RAMD_NEXT_1 + LD (HL),0 + INC HL + INC (HL) +.RAMD_NEXT_1: + POP HL + LD BC,#100 + ADD HL,BC + RET + +RD_WR_1SEC: + LD DE,(ZX_VARS.CONT_SEC) + CALL PAGE_CALC2 + DI + LD A,(ZX_VARS.RD_WR_COM) + AND #C0 + OUT (RGADR),A + LD A,H + CP #A0 + LD A,(ZX_VARS.RD_WR_COM) + LD E,0 + LD D,C + SET 6,D + JR C,.RD_WR_C000 + ;RD_WR_4000: + RES 7,D ; DE - адрес данных RAMD + LD C,SLOT1 + EX AF,AF' + IN A,(C) + EX AF,AF' + OUT (C),B + ; ПЕРЕМЕЩЕНИЕ ДАННЫХ + LD BC,#100 + AND A + JR NZ,.MOVE_NOT_EX3 + EX DE,HL +.MOVE_NOT_EX3: + LDIR ; работать здесь же, в TR-DOS !!! + AND A + JR NZ,.MOVE_NOT_EX4 + EX DE,HL +.MOVE_NOT_EX4: + ;******************* + EX AF,AF' + OUT (SLOT1),A + EX AF,AF' +; RET_PAGE1 +.MOVE_RET: + LD A,0 + OUT (RGADR),A + EI + RET +.RD_WR_C000: + SET 7,D + LD C,SLOT3 + EX AF,AF' + IN A,(C) + EX AF,AF' + OUT (C),B + ; ПЕРЕМЕЩЕНИЕ ДАННЫХ + LD BC,#100 + AND A + JR NZ,.MOVE_NOT_EX1 + EX DE,HL +.MOVE_NOT_EX1: + LDIR ; работать здесь же, в TR-DOS !!! + AND A + JR NZ,.MOVE_NOT_EX2 + EX DE,HL + ;******************** +.MOVE_NOT_EX2: + EX AF,AF' + OUT (SLOT3),A + EX AF,AF' +; RET_PAGE3 + JR .MOVE_RET + +;********************************************** +PAGE_CALC2: + LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + PUSH HL + LD C,BIOS.RAMD_CALC_PAGE + CALL DISK_REDIR + SUB 4 + CALL EXP_FNS ; вычисление адреса и страницы RAM-Disk + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; + LD B,A + LD C,H + POP HL + ;EI + RET NC + JP ERROR_DISK +;******************************************** + + ELSE + +;******************************************** +; ╔═══════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFFER ║\ +; ║ B - Number of sectors ║\ +; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ +; ║ RD_WR_COM - команда чтение/запись ║\ +; ║ 0 - чтение, 255 - запись ║\ +; ╚═══════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + PUSH HL + PUSH BC + ;Get RAM Block ID + LD A,(ZX_VARS.OPER_DISK) + AND 3 + LD C,BIOS.GET_DRV_ST + CALL EXP_FNS + JP C,.ERROR + SUB 4 + LD C,BIOS.GET_RAMD_ST + CALL EXP_FNS + JP C,.ERROR + ; A = RAM Block ID + EX AF,AF' + ; + POP BC + LD C,B + ; !TEST накручиваем счётчик r/w секторов + LD HL,(ZX_VARS.CONT_SEC) + LD A,16 + INC C +.loop: DEC C + JR Z,.next + INC L + CP L + JR NZ,.loop + INC H + LD L,0 + JR .loop +.next: ; + ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ + LD DE,(ZX_VARS.CONT_SEC) + LD A,D + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + ; + EX (SP),HL + ; Get command r/w + LD A,(ZX_VARS.RD_WR_COM) + EX AF,AF' + LD C,BIOS.BLK_RD_WR + CALL EXP_FNS + POP HL + JP C,AUTO_3EE7 + ; сохраняем накрученный счётчик + LD (ZX_VARS.CONT_SEC),HL + RET + +.ERROR: POP BC + POP HL + JP AUTO_3EE7 ;Disk error +; ╔════════════════════════════════════════════════╗ +; ║ RD/WR SECTOR ║\ +; ║ HL - BUFER ║\ +; ║ DE - ABS sector в 256b блоках ║\ +; ║ B - число данных в 256b блоках ║\ +; ║ A - block RAM ║\ +; ║ A' - команда чтение/запись/чтение ROM Disk ║\ +; ║ 0 - read, 255 - write, 70 - read ROM DISK ║\ +; ║ ** NOT USED TR-DOS VARS ** ║\ +; ╚════════════════════════════════════════════════╝\ +; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + +; RAMD_NEXT_SEC: +; PUSH HL +; LD HL,ZX_VARS.CONT_SEC +; LD A,16 +; INC (HL) +; CP (HL) +; JR NZ,.RAMD_NEXT_1 +; LD (HL),0 +; INC HL +; INC (HL) +; .RAMD_NEXT_1: +; POP HL +; LD BC,#100 +; ADD HL,BC +; RET + + ENDIF +;*********************************************************************** From cfa8f0836722037a74ad2192e875b56e1a3d68a8 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Fri, 2 Feb 2024 01:19:53 +1000 Subject: [PATCH 075/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 4d14c95..b5606d6 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4d14c951c21a9e98b8c301bece3f16bd5d5e5cfc +Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 From bb5d7f3253dcc7668a2bc11ccb7b23d61ef97539 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 6 Feb 2024 23:50:14 +1000 Subject: [PATCH 076/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index b5606d6..f74ae7e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit b5606d6db7c0eecf2e3b3da53040af2432a40569 +Subproject commit f74ae7e760de5541ee4966d509442c6421225c3b diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 6819648..c17e924 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -583,7 +583,7 @@ READ_BPB: LD HL,0 LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A - LD A,0 + LD A,L .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,0 @@ -615,6 +615,7 @@ READ_BPB: SCF EI RET + ; .ERROR_MSDOS: LD HL,MSG_3 JP AUTO_03E4 From f6e082dd16a5f1d9b4bdf6f3d655ea573bdf70cd Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 13 Feb 2024 00:18:33 +1000 Subject: [PATCH 077/114] ... --- SP_TRDOS.ASM | 58 +++++++++++++++++++--------------------------- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 4 ++-- TRDOS/TR_MSD_S.ASZ | 27 +++++++++++---------- TRDOS/TR_RMD_S.ASZ | 8 +++++-- ZX_EXP/EXP_HDD.ASM | 3 --- 6 files changed, 48 insertions(+), 54 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 735d468..68810b3 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -67,17 +67,14 @@ AUTO_C308 EQU #C308 AUTO_C916 EQU #C916 AUTO_FE15 EQU #FE15 AUTO_FF00 EQU #FF00 -AUTO_FFFF EQU #FFFF ;**************************************** START: DI LD DE,#FFFF LD A,7 JR CONT_1 -RST08: - NOP -CONT_1: - OUT (#FE),A +RST08: NOP +CONT_1: OUT (#FE),A LD A,'?' JR CONT_2 @@ -158,10 +155,7 @@ CONT_7: PUSH HL LD HL,#3D2F PUSH HL - LD HL,#B8ED - -//////////////////////////////////////////////////////////////////////// - _mInfoBLOCK #64-$,0 + LD HL,#B8ED ;код команды LDDR AUTO_0064: JR CONT_8 //////////////////////////////////////////////////////////////////////// @@ -1579,7 +1573,7 @@ AUTO_12D9: CALL AUTO_115D POP HL PUSH HL - LD BC,RST08 + LD BC,8 ADD HL,BC AUTO_1303: LD A,(HL) @@ -2147,7 +2141,7 @@ AUTO_1775: CALL AUTO_03FD LD HL,ZX_VARS.FL_NAME LD DE,ZX_VARS.DISK_NAME - LD BC,RST08 + LD BC,8 LDIR CALL AUTO_1E43 JP AUTO_03E1 @@ -2645,14 +2639,11 @@ CMD_SAVE: LD HL,ZX_VARS.FL_TYPE JR AUTO_1B1F AUTO_1AF8: - CP 170 + CP ZX_Token.screen_dollar JR NZ,AUTO_1B0D - LD HL,AUTO_4000 - DB 34 -AUTO_1B00: - RST RST10 - LD E,H - LD HL,AUTO_1B00 + LD HL,AUTO_4000 ;начало файла - #4000 + LD (#5CD7),HL + LD HL,#1B00 ;его длина - #1B00 байтов LD (ZX_VARS.DOS_CH_ADR),HL LD (ZX_VARS.MED_LEN),HL JR AUTO_1B48 @@ -3301,12 +3292,12 @@ AUTO_1F55: LD (ZX_VARS.CODE_10H),A LD HL,ZX_VARS.DISK_MRK_1 LD DE,ZX_VARS.DISK_ALT_NM - LD BC,RST08 + LD BC,8 LD (HL),' ' LDIR LD HL,ZX_VARS.FL_NAME LD DE,ZX_VARS.DISK_NAME - LD BC,RST08 + LD BC,8 LDIR CALL set_side_0 LD B,1 @@ -4775,7 +4766,7 @@ AUTO_2A2B: DZ " File(s)", 141 AUTO_2A35: LD HL,AUTO_2A41 LD DE,AUTO_4080 - LD BC,RST20 + LD BC,20 LDIR RET ; @@ -4783,7 +4774,7 @@ AUTO_2A35: ; AUTO_2A41: LD A,(AUTO_03B5) - CP 243 + CP #F3 LD A,16 JR Z,AUTO_2A4B XOR A @@ -4836,7 +4827,7 @@ AUTO_2A56: CALL AUTO_2D73 POP HL PUSH HL - LD DE,RST08 + LD DE,8 CALL AUTO_2F1B LD HL,AUTO_40E3 LD A,(HL) @@ -4854,7 +4845,7 @@ AUTO_2A56: SBC HL,DE LD (AUTO_40E5),HL LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2D73 POP HL LD DE,(AUTO_40E1) @@ -4864,11 +4855,11 @@ AUTO_2A56: POP DE CALL AUTO_2D4C PUSH DE - LD A,3Ch + LD A,#3C OUT (FDC_93.DrvCTRL),A CALL AUTO_2F65 LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 LD B,1 CALL AUTO_2F1B POP DE @@ -4876,7 +4867,7 @@ AUTO_2A56: LD (AUTO_40E1),DE PUSH HL LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 LD B,1 CALL AUTO_2D73 LD A,(AUTO_40E4) @@ -5179,12 +5170,12 @@ AUTO_2D1E: RET AUTO_2D2A: LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2F1B RET AUTO_2D34: LD HL,AUTO_4000 - LD DE,RST08 + LD DE,8 CALL AUTO_2D73 RET AUTO_2D3E: @@ -5192,14 +5183,14 @@ AUTO_2D3E: LD C,D CALL AUTO_2F3A LD HL,AUTO_C000 - LD B,'@' + LD B,#40 JR AUTO_2D58 AUTO_2D4C: CALL AUTO_2F65 LD C,D CALL AUTO_2F3A LD HL,AUTO_4000 - LD B,192 + LD B,#C0 AUTO_2D58: PUSH BC PUSH DE @@ -6451,8 +6442,8 @@ NEW_NAME: ;***************************** ;FORMATER: -; LD DE,(ZX_VARS.E_LINE) ; LD HL,TX_FORMAT +; LD DE,(ZX_VARS.E_LINE) ; LD BC,LEN_TX_F ; LDIR ; EX DE,HL @@ -7081,8 +7072,7 @@ AUTO_3FEC: _mInfoBLOCK #3FF0-$, #FF HD_CMD: PUSH AF DI - ;LD A,SYS_PORT.EXTENSION - LD A,1 + LD A,SYS_PORT.EXTENSION OUT (SYS_PORT.ROM),A POP AF RET diff --git a/Shared_Includes b/Shared_Includes index f74ae7e..68bdeeb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit f74ae7e760de5541ee4966d509442c6421225c3b +Subproject commit 68bdeebdecb62a68058d57f255ab646a4eb50512 diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index b6278be..6800937 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -41,7 +41,7 @@ MSDOS_TEST_FL: AND A SCF RET Z ; КОНЕЦ КАТАЛОГА - CP 0E5H + CP #E5 SCF CCF ; DEC A ; СТЕРТЫЙ ФАЙЛ @@ -50,7 +50,7 @@ MSDOS_TEST_FL: ;********************************** MSDOS_NEXT_FL: PUSH DE - LD DE,20H + LD DE," " ADD HL,DE DI IN A,(SLOT3) diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index c17e924..84e70e4 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -129,7 +129,6 @@ PREPARE1: EI CALL Z,RES_1440 CALL NZ,SET_1440 - CALL CALC_SECTOR LD (ZX_VARS.CONT_SEC),DE LD A,(ZX_VARS.RD_WR_COM) @@ -346,9 +345,13 @@ SWITCH_DT: LD A,C OUT (SLOT2),A EI - CALL Z,RES_1440 - CALL NZ,SET_1440 - RET + ;!TEST + ;CALL Z,RES_1440 + ;CALL NZ,SET_1440 + ;RET + JR Z,RES_1440 + JR SET_1440 + ; NO_SW_DT: LD A,C OUT (SLOT2),A @@ -362,7 +365,7 @@ MSD_3FBA: LD B,4 MSD_3FBC: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR NZ,MSD_3FD1 INC DE LD A,E @@ -373,7 +376,7 @@ MSD_RET_IX: JP (IX) MSD_3FCA: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR Z,MSD_3FCA JP M,MSD_RET_IX MSD_3FD1: @@ -386,7 +389,7 @@ MSD_3FD5: LD B,4 MSD_3FD7: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR NZ,MSD_3FEC INC DE LD A,E @@ -397,7 +400,7 @@ MSD_RET_IX2: JP (IX) MSD_3FE5: IN A,(FDC_93.DrvCTRL) - AND 192 + AND #C0 JR Z,MSD_3FE5 JP M,MSD_RET_IX2 MSD_3FEC: @@ -408,13 +411,13 @@ MSD_3FEC: ;**************************************** RES_1440: - LD A,01h - OUT (0BDh),A + LD A,FDD_Density.SET_720 + OUT (FDD_Density),A RET SET_1440: - LD A,21h - OUT (0BDh),A + LD A,FDD_Density.SET_1440 + OUT (FDD_Density),A RET READ_BPB: diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 6a90741..567e1ab 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -396,8 +396,11 @@ RD_WR_1SEC: LD DE,(ZX_VARS.CONT_SEC) CALL PAGE_CALC2 DI - LD A,(ZX_VARS.RD_WR_COM) - AND #C0 + ;!TEST + ;LD A,(ZX_VARS.RD_WR_COM) + ;AND #C0 + LD A,#C0 + ; OUT (RGADR),A LD A,H CP #A0 @@ -434,6 +437,7 @@ RD_WR_1SEC: OUT (RGADR),A EI RET + ; .RD_WR_C000: SET 7,D LD C,SLOT3 diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index 98d15c0..eb89e41 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -46,7 +46,6 @@ HD_CMD_X: ; C - COMAND ( 5 - RD, 6 - WR ) RET HD_BPB_PREP: - LD D,A IN A,(SLOT3) EX AF,AF' @@ -395,9 +394,7 @@ TEST_HDD_DRV: RET HD_CMD_0: - POP AF - LD BC,IDE.Write.DeviceHead LD A,0A0H OUT (C),A From 078433267999b1a2c2cf106edb3aa689047fa093 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Tue, 20 Feb 2024 19:15:00 +1000 Subject: [PATCH 078/114] ... --- Shared_Includes | 2 +- TRDOS/TR_RMD_S.ASZ | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 68bdeeb..dbf3e86 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68bdeebdecb62a68058d57f255ab646a4eb50512 +Subproject commit dbf3e86b6290d71e5789cabf7af6981a5a42db0e diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 567e1ab..cc63735 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -355,10 +355,10 @@ READ_WRITE_RAMD: IFN NEW_RAMDRV_READ - ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ +; ║ B - Number of sectors ║\ ; ║ CONT_SEC - SEC/TRK FOR READ/WRITE ║\ ; ║ RD_WR_COM - команда чтение/запись ║\ ; ║ 0 - чтение, 255 - запись ║\ From d7c905b9479de8ae64ee232e736f23777bc40b82 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 22 Feb 2024 01:08:38 +1000 Subject: [PATCH 079/114] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B8=20READ=5FWR?= =?UTF-8?q?ITE=5FRAMD=20=D0=BD=D0=B0=20BIOS=20(BLK=5FRD=5FWR)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TRDOS/TR_MSD_S.ASZ | 13 +++++++++---- TRDOS/TR_RMD_S.ASZ | 36 +++++++++++++++++------------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 84e70e4..cd4e27e 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -94,14 +94,19 @@ MSD_R_W_UT: MSD_cmd4: PUSH HL - PUSH AF + ;PUSH AF ;!TEST 21/2/2024 CALL RESET_WG - POP AF + ;POP AF ;!TEST 21/2/2024 POP HL LD B,1 - LD DE,0 + ;!TEST 21/2/2024 + ; LD DE,0 + XOR A + LD D,A + LD E,A MSD_cmd5: - LD A,0 + ; LD A,0 + ; A=0 LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index cc63735..c89774e 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,5 +1,5 @@ ; - DEFINE NEW_RAMDRV_READ 0 + DEFINE NEW_RAMDRV_READ 1 DISK_REDIR: @@ -352,9 +352,7 @@ RAMD_SYM_OK: ;*********************************************************************** READ_WRITE_RAMD: - IFN NEW_RAMDRV_READ - ; ╔═══════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ ; ║ HL - BUFFER ║\ @@ -365,18 +363,18 @@ READ_WRITE_RAMD: ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ INC B -WD_WR_RAMD_LOOP: +.WD_WR_RAMD_LOOP: DEC B RET Z PUSH BC PUSH HL - CALL RD_WR_1SEC + CALL .RD_WR_1SEC POP HL - CALL RAMD_NEXT_SEC + CALL .RAMD_NEXT_SEC POP BC - JR WD_WR_RAMD_LOOP + JR .WD_WR_RAMD_LOOP -RAMD_NEXT_SEC: +.RAMD_NEXT_SEC: PUSH HL LD HL,ZX_VARS.CONT_SEC LD A,16 @@ -392,15 +390,12 @@ RAMD_NEXT_SEC: ADD HL,BC RET -RD_WR_1SEC: +.RD_WR_1SEC: LD DE,(ZX_VARS.CONT_SEC) - CALL PAGE_CALC2 + CALL .PAGE_CALC2 DI - ;!TEST - ;LD A,(ZX_VARS.RD_WR_COM) - ;AND #C0 - LD A,#C0 - ; + LD A,(ZX_VARS.RD_WR_COM) + AND #C0 OUT (RGADR),A LD A,H CP #A0 @@ -460,11 +455,10 @@ RD_WR_1SEC: EX AF,AF' OUT (SLOT3),A EX AF,AF' -; RET_PAGE3 + ; RET_PAGE3 JR .MOVE_RET - -;********************************************** -PAGE_CALC2: + ; +.PAGE_CALC2: LD A,D ; ФИЗИЧЕСКИЕ -> ЛОГИЧЕСКИЕ !!! RRCA RRCA @@ -505,6 +499,10 @@ PAGE_CALC2: ; ║ 0 - чтение, 255 - запись ║\ ; ╚═══════════════════════════════════╝\ ; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + INC B + DEC B + RET Z + ; PUSH HL PUSH BC ;Get RAM Block ID From ca85fb23c1efeee27d827f1a705476ea5878b2b2 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Thu, 22 Feb 2024 01:09:52 +1000 Subject: [PATCH 080/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index dbf3e86..215d0f3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit dbf3e86b6290d71e5789cabf7af6981a5a42db0e +Subproject commit 215d0f3c90865dd2c4c0d92d17e64513a0b0407e From 5c48ddba24d68063294f43a7f1c20caa0c8c6efb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Feb 2024 00:56:27 +1000 Subject: [PATCH 081/114] -bug in READ_WRITE_RAMD --- ProfRom_Disasm/!AllConst.asm | 226 - ProfRom_Disasm/!RomDisk.asm | 50 - ProfRom_Disasm/!ram8.asm | 1248 --- ProfRom_Disasm/!roms.mac | 56 - ProfRom_Disasm/ROM_MAP.TXT | 38 - ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin | Bin 12800 -> 0 bytes ProfRom_Disasm/prof_roms/rom4_fnt.bin | Bin 1211 -> 0 bytes ProfRom_Disasm/prof_roms/rom4_vars.bin | Bin 371 -> 0 bytes ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin | Bin 3328 -> 0 bytes ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin | Bin 11776 -> 0 bytes ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin | Bin 6912 -> 0 bytes ProfRom_Disasm/prof_roms/rom7_data4CRC.bin | Bin 512 -> 0 bytes ProfRom_Disasm/rom0.a80 | 10229 ------------------ ProfRom_Disasm/rom0.bat | 4 - ProfRom_Disasm/rom2.bat | 4 - ProfRom_Disasm/rom2_SrvMon.a80 | 10349 ------------------- ProfRom_Disasm/rom3.bat | 5 - ProfRom_Disasm/rom3_trdos.a80 | 7187 ------------- ProfRom_Disasm/rom4.a80 | 1082 -- ProfRom_Disasm/rom4.bat | 4 - ProfRom_Disasm/rom5.a80 | 7671 -------------- ProfRom_Disasm/rom5.bat | 4 - ProfRom_Disasm/rom6.a80 | 2902 ------ ProfRom_Disasm/rom6.bat | 4 - ProfRom_Disasm/rom7.a80 | 5903 ----------- ProfRom_Disasm/rom7.bat | 4 - SP_128.ASM | 2 +- TRDOS/TR_MSD_3.ASZ | 11 +- TRDOS/TR_RMD_S.ASZ | 117 +- 29 files changed, 84 insertions(+), 47016 deletions(-) delete mode 100755 ProfRom_Disasm/!AllConst.asm delete mode 100755 ProfRom_Disasm/!RomDisk.asm delete mode 100755 ProfRom_Disasm/!ram8.asm delete mode 100755 ProfRom_Disasm/!roms.mac delete mode 100644 ProfRom_Disasm/ROM_MAP.TXT delete mode 100755 ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom4_fnt.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom4_vars.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom5_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom7_ROMdisk.bin delete mode 100755 ProfRom_Disasm/prof_roms/rom7_data4CRC.bin delete mode 100755 ProfRom_Disasm/rom0.a80 delete mode 100755 ProfRom_Disasm/rom0.bat delete mode 100755 ProfRom_Disasm/rom2.bat delete mode 100755 ProfRom_Disasm/rom2_SrvMon.a80 delete mode 100755 ProfRom_Disasm/rom3.bat delete mode 100755 ProfRom_Disasm/rom3_trdos.a80 delete mode 100755 ProfRom_Disasm/rom4.a80 delete mode 100755 ProfRom_Disasm/rom4.bat delete mode 100755 ProfRom_Disasm/rom5.a80 delete mode 100755 ProfRom_Disasm/rom5.bat delete mode 100755 ProfRom_Disasm/rom6.a80 delete mode 100755 ProfRom_Disasm/rom6.bat delete mode 100755 ProfRom_Disasm/rom7.a80 delete mode 100755 ProfRom_Disasm/rom7.bat diff --git a/ProfRom_Disasm/!AllConst.asm b/ProfRom_Disasm/!AllConst.asm deleted file mode 100755 index a865920..0000000 --- a/ProfRom_Disasm/!AllConst.asm +++ /dev/null @@ -1,226 +0,0 @@ - -romROMx0073 equ #0073 ;загрузка блока из ROM-Disk - -rom0_x1B11 equ #1B11 ;автостарт с диска -rom0_x259F equ #259F ; - -rom2_x0000 equ #0000 ;запись байта в память пользователя (rst #00) -rom2_x0028 equ #0028 ;чтение байта из памяти пользователя -rom2_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=0 -rom2_x013A equ #013A ;выход из монитора -rom2_x03A7 equ #03A7 ;Запись регистра AY -rom2_x03B6 equ #03B6 ;чтение регистра AY -rom2_x04CE equ #04CE ;восстановление Турбо-режима -rom2_x04D5 equ #04D5 ;включение Турбо-режима -rom2_x05A1 equ #05A1 ;????????? -rom2_x0603 equ #0603 ;копирование памяти с #8000 в страницу пользователя -rom2_x0606 equ #0606 ;копирование страницы пользователя в #8000 -rom2_x0665 equ #0665 ;включение режима 48k only -rom2_x0749 equ #0749 ;восстановление области памяти из ram 8 -rom2_x0753 equ #0753 ;сохранение области памяти в ram 8 -rom2_x08D7 equ #08D7 ; печать текущего меню монитора -rom2_x0B06 equ #0B06 ;ввод и обработка команды отладчика -rom2_x0D42 equ #0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D -rom2_x0D46 equ #0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D -rom2_x0DF4 equ #0DF4 ;преобразование строки в число -rom2_x0E73 equ #0E73 ;деление bc=hl/de с проверкой de на ноль -rom2_x0E85 equ #0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -rom2_x0EE3 equ #0EE3 ;поиск в буфере ввода строки первого печатного символа -rom2_x15B3 equ #15B3 ;печать сообщения из hl длиной b -rom2_x15B9 equ #15B9 ;печать сообщения из hl с заменой непечатных символов на ? -rom2_x15D0 equ #15D0 ;печать сообщения по номеру (на экран/в буфер) -rom2_x15DB equ #15DB ;печать сообщения из hl -rom2_x15F3 equ #15F3 ;печать нескольких пробелов (в B) -rom2_x1612 equ #1612 ;печать числа в hl (dec/hex) с префиксом -rom2_x1629 equ #1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом -rom2_x162C equ #162C ;печать числа в заданной системе счисления -rom2_x165E equ #165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -rom2_x1661 equ #1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -rom2_x1669 equ #1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами -rom2_x166E equ #166E ;печать десятичного числа bc [0..65535] с ведущими пробелами -rom2_x1673 equ #1673 ;печать числа bc (на экран/в буфер) -rom2_x16AA equ #16AA ;деление bc=ac/de -rom2_x16DE equ #16DE ;печать числа hl=[#0000..#FFFF] -rom2_x16E3 equ #16E3 ;печать числа a=[#00..#FF] -rom2_x16EC equ #16EC ;печать числа a=[#0..#F] -rom2_x2800 equ #2800 ;печать символа в окне -rom2_x28F6 equ #28F6 ;мигание текстового курсора в строке ввода -rom2_x28B8 equ #28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) -rom2_x28E8 equ #28E8 ;печать/удаление курсора в окне -rom2_x2969 equ #2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей -rom2_x298E equ #298E ;скроллинг окна вверх -rom2_x2A1B equ #2A1B ;обработка управляющего кода #1E (скроллинг окна ввниз) -rom2_x2A5E equ #2A5E ;обработка управляющего кода #0C (очистка текущего окна) -rom2_x2A85 equ #2A85 ;очистка знакоместной строки по координатам курсора -rom2_x2B0B equ #2B0B ;печать символа со сбросом 7го бита (rst #10) -rom2_x2B10 equ #2B10 ;печать пробела (rst #10) -rom2_x2B12 equ #2B12 ;печать символа (rst #10) -rom2_x2C4D equ #2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -rom2_x2E3D equ #2E3D ;печать дампа памяти в окне -rom2_x2E76 equ #2E76 ;удаление курсора на предыдущей ячейке дампа -rom2_x2EBA equ #2EBA ;печать одной строки дампа памяти (8 байт) -rom2_x2F74 equ #2F74 ;вывод дисасма памяти по адресу в de -rom2_x2FED equ #2FED ;печать пробелов до правого края окна -rom2_x2FF1 equ #2FF1 ;печать пробелов до заданной координаты X -rom2_x2FFB equ #2FFB ;установка текущим окна: ввод числа -rom2_x3005 equ #3005 ;установка текущим окна: main menu -rom2_x300F equ #300F ;чтение содержимого регистра ix основной программы -rom2_x3014 equ #3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана -rom2_x3019 equ #3019 ;ix = адрес дескриптора окна монитора: дамп памяти -rom2_x301C equ #301C ;ix = адрес дескриптора окна монитора из hl -rom2_x3107 equ #3107 ;запись области памяти в файл -rom2_x3201 equ #3201 ;печать ON/OFF от флага nz-ON/z-OFF -rom2_x3210 equ #3210 ;определение адреса ловушки -rom2_x35D3 equ #35D3 ;сравнение ix=xE075 -rom2_x35E0 equ #35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -rom2_x36C3 equ #36C3 ;запись стандартного Magic-файла -rom2_x36F9 equ #36F9 ;получение номера логической страницы пользователя a=[#0..#F] -rom2_x3707 equ #3707 ;сравнение страницы пользователя с заданной -rom2_x3732 equ #3732 ;установка страницы пользователя равной номеру страницы в L -rom2_x37B9 equ #37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) -rom2_x3807 equ #3807 ;пауза 40416t -rom2_x382E equ #382E ;ожидание отжатия всех клавиш -rom2_x3870 equ #3870 ;печать сообщения и продолжение работы текущего меню монитора -rom2_x3A21 equ #3A21 ;копирование активного экрана пользователя в #4000 -rom2_x3A4E equ #3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -rom2_x3A95 equ #3A95 ;подготовка переменных к выводу на экран/принтер -rom2_x3B75 equ #3B75 ;определение типа прерываний im 1/2 -rom2_x3EE6 equ #3EE6 ;названия месяцев -rom2_x3F0A equ #3F0A ;Названия дней недели - -rom3_x0FF3 equ #0FF3 ;Запись памяти на диск -rom3_x3D30 equ #3D30 ;вызов страницы tr-dos -rom3_x3FF0 equ #3FF0 ;вывод в порт -rom3_x3FF3 equ #3FF3 ;чтение порта - -rom4_x0122 equ #0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -rom4_x02E8 equ #02E8 ;проверка оригинальный/совместимый компьютер -rom4_x0305 equ #0305 ;установка переменных из NVRAM/CMOS128 -rom4_x0312 equ #0312 ;установка переменных по данным в CMOS -rom4_x0315 equ #0315 ;установка переменных по данным в CMOS -rom4_x036C equ #036C ;запись переменных в CMOS и в NVRAM -rom4_x0378 equ #0378 ;запись переменных в NVRAM -rom4_x0398 equ #0398 ;запись переменных в CMOS -rom4_x0512 equ #0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) -rom4_x057F equ #057F ;распаковка шрифта в rom 8 -rom4_x0A5A equ #0A5A ;инициализация системы и печать сооветствующих сообщений - -rom5_x0110 equ #0110 ;опрос Break. cy=1 не нажата -rom5_x011C equ #011C ;опрос манипуляторов и печать курсора -rom5_x0176 equ #0176 ;восстановление экрана под курсором мыши -rom5_x0381 equ #0381 ;ожидание нажатия клавиш и обработка реакции на них -rom5_x043B equ #043B ;ОШИБКА!!!! вызов процедуры по номеру в C -rom5_x08EF equ #08EF ;доступность опции K. kempston joystick -rom5_x0C22 equ #0C22 ;установка параметров окна для ввода строки в меню монитора -rom5_x0EB5 equ #0EB5 ;печать текущего меню монитора -rom5_x1061 equ #1061 ;печать закодированного сообщения из hl -rom5_x1095 equ #1095 ;заксоренное сообщение -rom5_x10AB equ #10AB ;заксоренное сообщение -rom5_x11CD equ #11CD ;печать сообщения по номеру в BC -rom5_x1A4C equ #1A4C ;печать даты и времени в окне монитора -rom5_x1AA6 equ #1AA6 ;читаем время в строку в формате ASCII -rom5_x1B18 equ #1B18 ;читаем дату в строку в формате ASCII -rom5_x1C0D equ #1C0D -rom5_x1C73 equ #1C73 ;ввод текстовой строки в нижней строке экрана -rom5_x1C84 equ #1C84 ;инициализация окна ввода -rom5_x1CB3 equ #1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) -rom5_x1CB8 equ #1CB8 ;ввод строки (вых: hl адрес введенной строки) -rom5_x2054 equ #2054 ;печать рамки вокруг окна -rom5_x2278 equ #2278 ;редактирование дампа памяти в окне монитора -rom5_x2503 equ #2503 ;монтирование всех образов с винчестера -rom5_x25EB equ #25EB ;формирование в буфере xEBF5 списка образов коллекции -rom5_x2620 equ #2620 ;формирование в буфере xEBF5 списка подразделов MFS -rom5_x271A equ #271A ;подсчет количества подразделов в MFS -rom5_x2AA4 equ #2AA4 ;преобразование количества секторов в мегабайты -rom5_x302A equ #302A ;декремент (hl)=(hl)-1 -rom5_x3052 equ #3052 ;сложение двух 4х байтных чисел -rom5_x30B9 equ #30B9 ;идентификация жесткого диска -rom5_x30C6 equ #30C6 ;печать окна для тестирования HDD -rom5_x30F3 equ #30F3 ;печать кода ошибки винчестера -rom5_x3135 equ #3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -rom5_x3163 equ #3163 ;печать текущего номера цилиндра -rom5_x31AA equ #31AA ;удаление всех разделов MBR - - -rom6_x0156 equ #0156 ;печать информации о ловушке -rom6_x01E4 equ #01E4 ;установка новой ловушки в отладчике -rom6_x0249 equ #0249 ;вывод каталога текущего дисковода (на экран/принтер) -rom6_x03A1 equ #03A1 ;печать числа в десятичной системе счисления -rom6_x03A9 equ #03A9 ;форматирование/проверка текущей дискеты -rom6_x04E5 equ #04E5 ;быстрое форматирование текущей дискеты (очистка каталога) -rom6_x064D equ #064D ;установка дескриптора окна: запрос на запись MBR -rom6_x066C equ #066C ;установка код дисковой ошибки в переменной для печати числа -rom6_x067F equ #067F ;сохранение экрана пользователя на диск -rom6_x06A6 equ #06A6 ;печать сообщения об ошибке и продолжение работы монитора -rom6_x06AD equ #06AD ;ввод текстовой строки внизу экрана -rom6_x074A equ #074A ;ожидание действий пользователя (опрос управления, вывод часов) -rom6_x093F equ #093F ;rst 8:db #8B загрузка zs-snap с диска -rom6_x0976 equ #0976 ;загрузка zs-snap (S. load ... snap) -rom6_x097E equ #097E ;сохранение zs-snap (S. save ... snap) -rom6_x0D60 equ #0D60 ;установка п/п jp #addr по адресу xE338 -rom6_x0E3B equ #0E3B ;загрузка из ROM-disk -rom6_x1108 equ #1108 ;распаковка блока - -rom7_x01AF equ #01AF ;автостарт с дискеты -rom7_x0229 equ #0229 ;вызов функции R8DOS -rom7_x0394 equ #0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -rom7_x0CFF equ #0CFF ;усттановка переменных дисковой BIOS -rom7_x0D62 equ #0D62 ;определение наличия NVRAM -rom7_x0DAD equ #0DAD ;чтение всей памяти NVRAM в память #7530 -rom7_x0DB6 equ #0DB6 ;чтение данных из NVRAM -rom7_x0DC7 equ #0DC7 ;запись всей памяти NVRAM из памяти #7530 -rom7_x0DD0 equ #0DD0 ;запись данных в NVRAM -rom7_x0E72 equ #0E72 ;что-то пишет в NVRAM -rom7_x0F55 equ #0F55 ;для сравнения чисел -rom7_x0F59 equ #0F59 ;для сравнения чисел -rom7_x0F5D equ #0F5D ;деление hl=dehl'/bc -rom7_x0FB7 equ #0FB7 ;умножение dehl=de'hl' * bc -rom7_x1003 equ #1003 ;копирование из (hl) в (de) 4х байт -rom7_x1035 equ #1035 ;сравнение двух чисел в памяти по адресам в de и hl -rom7_x1065 equ #1065 ;инициализация дисковода -rom7_x107B equ #107B ;инициализация дисковода и настройка на дискету -rom7_x1166 equ #1166 ;загрузка очередного дескриптора файла в буфер -rom7_x11B0 equ #11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -rom7_x11D4 equ #11D4 ;открытие файла для внутренних нужд -rom7_x11DF equ #11DF ;открыть файл для последующих операций с ним -rom7_x1240 equ #1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -rom7_x128C equ #128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -rom7_x1307 equ #1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 -rom7_x1360 equ #1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов -rom7_x1365 equ #1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла -rom7_x1390 equ #1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов -rom7_x1395 equ #1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти -rom7_x1405 equ #1405 ;новое значение указателя в файле R8DOS #22 -rom7_x14C0 equ #14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -rom7_x155A equ #155A ;чтение заголовка первого попавшегося сектора дисковода A -rom7_x1572 equ #1572 ;определение наличия interrupt controller -rom7_x15C7 equ #15C7 ;определение наличия последовательного порта/модема -rom7_x16B9 equ #16B9 ;работа с контроллером прерываний -rom7_x1768 equ #1768 ;поиск раздела MFS -rom7_x17BB equ #17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -rom7_x17EF equ #17EF ;запись 2х секторов из буфера xEBF5 -rom7_x18C0 equ #18C0 ;R8DOS #28(40) подключение раздела к драйверу HDD -rom7_x1AB1 equ #1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 -rom7_x1B04 equ #1B04 ;расчет адреса блока описателя заданного дисковода -rom7_x1D2A equ #1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -rom7_x1D45 equ #1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl -rom7_x1D73 equ #1D73 ;чтение сектора с винчестера в буфер xE5A9 -rom7_x1DDF equ #1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -rom7_x1E3D equ #1E3D ;чтение сектора 3 в буфер xE5A9 и проверка контрольной суммы -rom7_x1E74 equ #1E74 ;R8DOS #22(34) идентификация жесткого диска -rom7_x1F08 equ #1F08 ;проверка геометрии винчестера -rom7_x1F2D equ #1F2D ;расчет произведения головок и секторов -rom7_x1F41 equ #1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора -rom7_x1F59 equ #1F59 ;чтение ячейки CMOS -rom7_x1F76 equ #1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS -rom7_x1F93 equ #1F93 -rom7_x1FB2 equ #1FB2 ;запись в CMOS времени и даты -rom7_x2023 equ #2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -rom7_x2047 equ #2047 ;определение наличия CMOS -rom7_x20F1 equ #20F1 ;тестирование HDD (2. test) (тест на чтение/запись) -rom7_x2105 equ #2105 ;тестирование HDD (1. test) (тест только на чтение) -rom7_x2422 equ #2422 ;определение наличия SMUC - - -romA_x001B equ #001B ;для провреки размера ПЗУ: выдаст A=2 - diff --git a/ProfRom_Disasm/!RomDisk.asm b/ProfRom_Disasm/!RomDisk.asm deleted file mode 100755 index 7ab59ae..0000000 --- a/ProfRom_Disasm/!RomDisk.asm +++ /dev/null @@ -1,50 +0,0 @@ -;АДРЕС: #0073 загрузка блока из ROM-Disk -;вх: h - номер страницы с файлом -; l - смещение в параграфах от начала ROM-disk в этой странице -; b - размер в параграфах -;вых: b - осталось незагруженных параграфов -; l - номер очередного параграфа -; -x0073 ld c,#00 - ld de,(#0070) ;e - начало ROM-disk в параграфах, d - всего параграфов - ld a,l - or a - jr nz,x007F - ld l,e - ld a,e -x007F sub e - ld e,a - ld a,d - sub e - ld e,a ;e - параграфов от начала блока до конца страницы - ld a,b - sub e - jr nc,x008F ;продолжение блока в следующей странице - xor a ;блок целиком в этой странице - push af - call x0099 ;копирование блока в память - pop bc - ret -x008F inc h ;увеличим номер страницы - push af ;запомним кол-во незагруженных параграфов - ld b,e - call x0099 ;копирование блока в память - pop bc - ld l,#00 - ret -;копирование блока в память -;вх: l - номер первого параграфа -; b - кол-во параграфов -; c=#00 -;вых: a,l - номер очередного параграфа -x0099 push hl - ld h,l - ld l,c - ld de,(xE7BE) - ldir - ld (xE7BE),de - ld a,h - pop hl - ld l,a - ret -;x00AA diff --git a/ProfRom_Disasm/!ram8.asm b/ProfRom_Disasm/!ram8.asm deleted file mode 100755 index 5ac2559..0000000 --- a/ProfRom_Disasm/!ram8.asm +++ /dev/null @@ -1,1248 +0,0 @@ - -x5B88 equ #5B88 ;содержимое порта #7FFD -x7530 equ #7530 ;для контролера прерываний -x9C40 equ #9C40 ;для контролера прерываний - -xC000 -xC001 equ #C001 ;2 для маркера страницы -xC006 equ #C006 ; - -xC063 equ #C063 ;1 <>0 отладчик отключен -xC064 equ #C064 ;2 адрес п/п вызываемой при входе в монитор -xC066 -xC069 equ #C069 ;#1B00 сохраненный экран -xDB69 equ #DB69 ;область для сохранения памяти с адреса #8002 - ;буфер для чтения даты и времени в формате ASCII - ;буфер для загрузки конфигурационного сектора -xDD69 equ #DD69 ;2 адрес текущей ячейки в дампе памяти -xDD6B equ #DD6B ;2 адрес возврата из монитора/ pc программы пользователя -xDD6D equ #DD6D ;2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке -xDD6F equ #DD6F ;2 регистр ix -xDD71 equ #DD71 ;2 регистр iy -xDD73 equ #DD73 ;2 регистр hl -xDD75 equ #DD75 ;2 регистр de -xDD77 equ #DD77 ;2 регистр bc -xDD79 equ #DD79 ;2 регистр hl' -xDD7B equ #DD7B ;2 регистр de' -xDD7D equ #DD7D ;2 регистр bc' -xDD7F equ #DD7F ;2 регистр af -xDD81 equ #DD81 ;2 регистр af' -xDD83 equ #DD83 ;2 вершина стэка для сохранения регистров при входе в монитор - ;2 регистр r и флаг IFFF2 -xDD85 equ #DD85 ;1 i -xDD86 equ #DD86 ;1 номер rom откуда зашли - ; =#01 rom 0 Basic 128k - ; =#02 rom 0 Basic 48k - ; =#04 rom 3 Tr-Dos - ; =#08 rom 2 SrvMon - ; =#80 запрос от принтера -xDD87 equ #DD87 ;2 адрес начала дампа памяти -xDD89 equ #DD89 ;2 адрес текущей ячейки в дампе памяти - ; адрес начала дизасма в дампе памяти - ; номер последней записи в каталоге ROM-disk - ; количество подразделов в разделе MFS -xDD8B equ #DD8B ;2 адрес начала листинга для команды DASM -xDD8D equ #DD8D ;#0A таблица закладок в листинге дизасма -xDD97 -;область для сохранения стэка 11 байт -xDD99 equ #DD99 ;2 (#C001) - ;#0C 6 числовых операндов для команд отладчика -xDD9B equ #DD9B ;2 bc -xDD9D equ #DD9D ;1 номер rom откуда зашли -xDD9E equ #DD9E ;2 af флаг IFFF2 и регистр r -xDDA0 equ #DDA0 ;2 af -xDDA2 equ #DDA2 ;2 адрес возврата из монитора -xDDA4 -xDDA7 equ #DDA7 ;2 для временного сохранения указателя стэка/регистров - ; для печати числа в сообщениях -xDDA9 -xDDAA equ #DDAA ;2 текущий адрес команды ассемблера для дизасма -xDDAC equ #DDAC ;4 буфер для содержимого памяти адресуемой текущим регистром - ;4 буфер команды для дизассемблирования - ;8 буфер вывода строки дампа памяти -xDDB4 equ #DDB4 ;3 команда дизассемблера без префиксов -xDDB7 equ #DDB7 ;9 сообщение для печати команды дизасма - ; +0 =[#7E..#C4] -> -#7E =[#00..#46] из таблицы x1107 - ; +1 код сообщения второго операнда - ;=[#01..#2B] код операнда - ;=[#27..#2B] в операнде есть число в скобках - ;=[#2C..#74] код мнемоники - ;=[#7E..#C4] код команды ассемблера - ;=[#EC] за этим байтом следует адрес сообщения - ;=[#EE] печать db #nn ;BAD - ;=[#F1] прерываем печать команды - ;=[#F7] признак конца команды - ;=[#F8..#FF] за этим байтом следует число - ; ;вх: 0,a =0/1 двухбайтное/однобайтное число - ; ; 1-2,a - система счисления (bin/oct/dec/hex) - ;=[#00,#75..#EB,#ED..#F7] выход без печати hl=hl-1 - -xDDC0 equ #DDC0 ; - -xDDCB equ #DDCB ;2 для сохранения стэка, при формировании команды дизасма -xDDCD equ #DDCD ;1 код команды дизасма -xDDCE equ #DDCE ;2 адрес перехода при дизасме -xDDD0 equ #DDD0 ;2 адрес следующей команды дизасма -xDDD2 equ #DDD2 ;2 адрес на который ссылаются команды работающие с ячейками - ; памяти, такие как LD ( ),reg или SET b,(IX+d). -xDDD4 equ #DDD4 ;2 -xDDD6 equ #DDD6 ;2 -xDDD8 equ #DDD8 ;2 адрес начала текущего блока сообщений -xDDDA equ #DDDA ;2 адрес начала текущего блока слов -xDDDC equ #DDDC ;2 для команд поиска в отладчике: адрес начала поиска -xDDDE equ #DDDE ;2 для команд поиска в отладчике: адрес конца поиска -xDDE0 equ #DDE0 ;1 для команд поиска в отладчике: длина искомой строки -xDDE1 equ #DDE1 ;2 для команд поиска в отладчике: состояние портов #7FFD/#1FFD пользователя -xDDE3 equ #DDE3 ;#14 для команд поиска в оладчике: искомая строка -xDDF7 equ #DDF7 ;2 указатель стэка при входе в монитор, с учетом 11 байт уже сохраненных на стэке -xDDF9 -xDDFF equ #DDFF ;1 номер текущего меню -xDE00 equ #DE00 ;8 номер текущей опции для каждого меню из списка номеров меню -xDE08 equ #DE08 ;8 список номеров меню для возврата в предыдущее -xDE10 equ #DE10 ;2 для сохранения hl -xDE12 equ #DE12 ;2 для сохранения адреса возврата -xDE14 equ #DE14 ;1 код предыдущего нажатия при просмотре списка введенных строк -xDE15 equ #DE15 ;2 адрес буфера ввода строки -xDE17 equ #DE17 ;43 буфер для ввода строки -xDE42 equ #DE42 ;400 список последних введенных строк -xDFD2 equ #DFD2 ;24 буфер для сохранения экрана под курсором мыши -;xDFE9 equ #DFE9 ; -xDFEA equ #DFEA ;4 буфер нажатых клавиш -xDFEE equ #DFEE ;-26 копия порта #7FBA - ; 6,=0/1 образ к дисководу B подключен/не подключен - ; 7,=0/1 образ к дисководу A подключен/не подключен - ; =#FF при инициализации -xDFEF equ #DFEF ;-25 -xDFF0 equ #DFF0 ;-24 1 состояние порта #FFBA - ; 7,=0 активен регистр адреса CMOS - ; =1 активен регистр данных CMOS - ; =#F7 при включении компьютера -xDFF1 equ #DFF1 ;-23 =0..3 с какого диска делать автостарт -xDFF2 equ #DFF2 ;-22 значение Cylinders HDD (2 байта) -xDFF4 equ #DFF4 ;-20 значение head HDD -xDFF5 equ #DFF5 ;-1F значение sector HDD -xDFF6 equ #DFF6 ;-1E значение seconds -xDFF7 equ #DFF7 ;-1D значение minutes -xDFF8 equ #DFF8 ;-1C значение hours -xDFF9 equ #DFF9 ;-1B значение days -xDFFA equ #DFFA ;-1A значение months -xDFFB equ #DFFB ;-19 значение years -xDFFC equ #DFFC ;-18 2 =#FC9D/#FC8B (64669/64651) оригинальный иначе совместимый -xDFFD equ #DFFD ;-17 -xDFFE equ #DFFE ;-16 2 сбойных секторов на диске - ; 1 поиск файла: номер загруженного в буфер сектора [#00..#0F] -xDFFF equ #DFFF ;-15 1 поиск файла: номер загруженного в буфер сектора [#01..#10] -xE000 equ #E000 ;-14 2 всего секторов на диске - ; 1 ROM-disk: смещение в параграфах от начала ROM-disk в этой странице - ; 1 поиск файла: номер текущего файла в считанном секторе [#00..#0F] -xE001 equ #E001 ;-13 1 ROM-disk: номер страницы с файлом ROM-disk -xE002 equ #E002 ;-12 0, - ; 1,=1 загружать/сохранять в zs-snap регистры AY -xE003 equ #E003 ;-11 -xE004 equ #E004 ;-10 1 содержимое регистра 7 AY -xE005 equ #E005 ;-0F 0,=1 эта же клавиша была нажата и в предыдущем цикле - ; 1,=1 работает автоповтор нажатой клавиши - ; 2,=1 клавиша была нажата. код клавиши еще не обработан - ; 3, - ; 4, - ; 5,=1 ????для рисования рамок???? - ; 6,=1 было нажато cs+ss - ; 7,=1 нажат CapsLock (cs+2) -xE006 equ #E006 ;-0E 1 код нажатой клавиши -xE007 equ #E007 ;-0D 1 код нажатой клавиши -xE008 equ #E008 ;-0C координата X курсора мыши в текущем окне (в знакоместах) -xE009 equ #E009 ;-0B координата Y курсора мыши в текущем окне (в знакоместах) -xE00A equ #E00A ;-0A 0-4, - величина задержки для куросра - ; 5,=1 - ; 6,=1 работает счетчик before repeat - ; 7,=1 курсор(стрелка) напечатан на экране -xE00B equ #E00B ;-09 1 координата Y выделенной опции меню -xE00C equ #E00C ;-08 1 номер блока сообщений текущей опции -xE00D equ #E00D ;-07 1 копия байта (#00FB) rom 2 -xE00E equ #E00E ;-6/5 2 копия xE012 -xE010 equ #E010 ;-4/3 2 копия xE012 -xE012 equ #E012 ;-02 1 состояние порта #7FFD при входе в монитор -xE013 equ #E013 ;-01 1 состояние порта #1FFD при входе в монитор - -;d порт #1f 000?0000 -;e порт #7f 001????? / 000????? - - -;значение iy при работе в мониторе (переменные???) -;переменные код 0 -xE014 equ #E014 ;+00 =#84 - [ - ; =#04 - ( - ; =#00 - это не скобка - ; 4,=1 - ; 3,=1/0 - 16/8 бит значение команды - ; 1,=1/0 - чтение из строки команды строкового/числового значения - ; 0,=1/0 - читается из параметра число/строка -xE015 equ #E015 ;+01 0,=0/1 префикс #DD/#FD - ; 1,=1 есть префикс #DD/#FD -> e=#09 - ; 2,=1 есть префикс #ED -> e=#18 если есть #DD/#FD - ; 3,=1 есть префикс #CB -> e=#16 - ; 4,= - ; 5,= - ; 6,=1 байтовое смещение в команде - ; =1 в команде есть ссылка на адрес памяти - ; 7,= -xE016 equ #E016 ;+02 длина команды для дизасма в байтах -xE017 equ #E017 ;+03 тип текущй команды дизасма - ; 0,=1 это команда call/call cc - ; 1,=1 это команда ret/ret cc - ; 2,=1 это команда jr cc - ; 3,=1 это команда jp/jp cc - ; 4,=1 это команда jp (hl)/jp (ix)/jp (iy) - ; 5,=1 при 1,=1 это команда ret cc - ; 6,=1 это неизвестная команда - ; 7,=1 это ex af,af' либо exx -xE018 equ #E018 ;+04 0-1,=00 в дизасме команда не ссылается на память (см xDDD2) - ; 0,=1 если команда считывает из памяти, и Ложь, если считывания не происходит - ; 1,=1 если команда производит запись в память, и Ложь, если запись не выполняется - ; 6,=1 ето команда сдвига с префиксом -xE019 equ #E019 ;+05 0,=1/0 число в десятичной/шестнадцатиричной системе - ; 1,=1 Расширить вывод реассемблера в командах DISS, LDISS и - ; DASM, кроме адреса и мнемоники команды, будут - ; представлены значения байт и их эквиваленты в ASCII - ; 2,=1/0 печатать 1/5 комманд в дизасме монитора - ; 3,=1 Не трассировать (выполнять сразу) подпрограммы, - ; расположенные в ПЗУ - ; 4,=1/0 вводить адрес в команде DASM числом/выражением - ; 5,=1/0 Запретить/разрешить автоматическое выполнение команды SHOW - ; 6,=1 начальный адрес команды SS/D, берется из регистра PC. - ; =0 начальный адрес команды SS/D. Берется из указателя текущей ячейки (mem) - ; 7,=1 печатать в дампе символы из полного набора - ; =0 печатать символы с кодами res 7,[#20..#7F] остальные точками -xE01A equ #E01A ;+06 минимальная длина сообщения с мнемоникой ассемблера -xE01B equ #E01B ;+07 минимум разрядов в числе при переводе в ASCII -xE01C equ #E01C ;+08 для перевода времени в ASCII =#30 -xE01D equ #E01D ;+09 0,=1 экран под курсором сохранен в буфере - ; =0 восстановление экрана под курсором из буфера - ; 1,=1 запрет на установку следующих координа печати в окне - ; 2,=1 печатаем символ - ; 3,=1 курсор напечатан ???? - ; 4,=1 вместо экрана вывод на принтер - ; 5,=1 прочие управляющие коды - ; 6,=1 чтение данных после управляющего кода - ; 7,=1 управляющий код вывод строки #04 -xE01E equ #E01E ;+0A 0,=1 новую информацию записывать поверх старой - ; =0 очищать экран монитора при обновлении информации - ; 1,=1 не обновлять содержимое регистров - ; 2,=1 не обновлять экран монитора - ; =0 обновлять содержимое экрана монитора согласно битам 0, 1, 3:6 - ; 3,=1 не обновлять дамп по содержимому регистров - ; 4,=1 не обновлять дамп памяти - ; 5,=1 не обновлять дизассемблер памяти по содержимому ячейки памяти - ; 6,=1 не выводить дизассемблер в мониторе - ; 7,=1 трассировать все команды - ; =0 не выводить подпрограммы (автоматическое выполнение подрограмм) -xE01F equ #E01F ;+0B 0,=1 отображаются регистры альтернативного набора - ; 1,=1 отображается AF' - ; 4,=0 при вызове функций #00-#13 R8DOS - ; =1 сектор прочитан с HDD - ; 5,=0 функции вызываются из монитора - ; =1 функция rst 8 вызвана пользователем - ; 7,=0 восстанавливать память пользователя под всеми ловушками - ; =1 сохранять память пользователя под всеми ловушками и установка ловушек - ; =0/1 меню mount/dismount -xE020 equ #E020 ;+0C байт управления индикацией регистров =1 не выводится - ; 7 - pc - ; 6 - sp - ; 5 - ix - ; 4 - iy - ; 3 - hl(hl') - ; 2 - de(de') - ; 1 - bc(bc') - ; 0 - af(af') -xE021 equ #E021 ;+0D -xE022 equ #E022 ;+0E 0,=0 используется при компрессии - ; 2,=1 ошибка. деление на ноль - ; 5,=0 ввод параметров в меню - ; =1 ввод строки в окне создания разделов - ; 6,=1 в команде ассемблера нет запятой - ; 7,=0/1 редактирование hex дампа/символьного представления -xE023 equ #E023 ;+0F количество незакрытых скобок в выражении в отладчике -xE024 equ #E024 ;+10/11 делитель для выделения разряда числа -xE025 equ #E025 ;+11 -xE026 equ #E026 ;+12 0,=1 запущен отладчик - ; 1,=1 экран не надо сохранять в ram 8 (экран не сохранен в ram 8) - ; 2,=0/1 print screen positive/negative - ; 3,=1 экран сохранен в ram 8 - ; 4,=1 при вызове команды CALL отладчика - ; 5,=1 выполняется трассировка из отладчика - ; 6,= - ; 7,=1 желто/черный бордюр при входе -xE027 equ #E027 ;+13 0,=1/0 работает команда отладчика search/find - ; 1,=0 запись строки данных в память идет по адресу в MEM - ; 3,=1 продолжаем запись zs-snap после записи 48k - ; =0 ошибка: undefined file - ; 5,=1/0 compression on/off - ; 6,=1/0 запись/чтение - ; 7,=1/0 при сохранении/загрузке zs-snap использовать сжатие - ; =1/0 форматирование/проверка дискеты -xE028 equ #E028 ;+14 0,=1 не трогать регистр 7 AY (sound on/off) - ; 1,=0/1 Autoconfig On/Off - ; 2,=1/0 после загрузки снапа вернуться в монитор/выйти из монитора (запуск снапа) - ; 3,=0 программа анализатора не задана - ; 4,=1 анализатор включен - ; 5,=1 работает команда EVal word - ; 6,=1 "теплый" сброс - ; 7,=0 отладчик отключен / reset RAM on/off -xE029 equ #E029 ;+15 отдельные биты этого байта позволяют управлять выводом на принтер - ; 0,=0/1 interface Centronics/RS232 - ; 1,=0/1 speed 9600/1200 - ; 2,=0/1 data bits 8/7 - ; 3,=0/1 stop bits 2/1 - ; 5,=0/1 режим вывода 1 точка/3 точки - ; 7,=0/1 positive/negative -xE02A equ #E02A ;+16 при отладке, аналог xE01E (параметры команды SLOW) - ; 0,=1 восстанавливать экран - ; 1,= - ; 2,= - ; 3,= - ; 4,= - ; 5,= - ; 6,= - ; 7,=1 выполнение команды в отладчике с быстрым выполнением подпрограмм -xE02B equ #E02B ;+17 текущая система счисления =2/8/10/16 -xE02C equ #E02C ;+18 значение interleaving 1..26 -xE02D equ #E02D ;+19 0,= - ; 3,=1 пауза в водимом листинге - ; 5,=1 чтение порта #7FFD/#1FFD недоступно - ; 6,=1 включено Turbo - ; 7,=1 турбо-режим доступен -xE02E equ #E02E ;+1A 0,=1 было обновление времени и даты в буфере - ; 1, - ; 2, - ; 3, - ; 4,=1 interrupt controller found - ; 5,=1 HDD есть и работоспособен - ; =1 NVRAM найден - ; =1 modem found - ; 6,=1 микросхема CMOS обнаружена - ; 7,=1 HDD физичиски присутствует -xE02F equ #E02F ;+#1B - ; 4,=1 interrupt controller найден. но не совсем???? - ; 6,=1 CMOS 128 байт - ; 7,=1 проверка геометрии винчестера пройдена -xE030 equ #E030 ;+#1C master HDD - ; 0,=1/0 autostart on/off - ; 1,=1/0 автоопределение HDD при старте on/off - ; 2,=1/0 LBA mode on/off - ; 4,=1/0 TRDOS mirror on/off - ; 5,=1/0 HDD обнаружен/отсутствует - ; =1 сектор MBR записан - ; 6,=0 в буфере xEBF5 список разделов без изменений - ; =1 в буфере xEBF5 список разделов изменен - ; 7,=1 на винчестере есть раздел MFS -xE031 equ #E031 ;+#1D slave HDD -xE032 equ #E032 ;+#1E -xE033 equ #E033 ;+#1F/#20 адрес текущего меню в списке номеров меню для возврата в предыдущее -xE035 equ #E035 ;+#21/#22 первый свободный адрес в буфере последних введенных строк(команд) -xE037 equ #E037 ;+#23/#23 адрес начала следующей введенной строки -xE038 equ #E038 ;+#24 - -xE039 equ #E039 ;+#25 значение NMI debouncing -xE03A equ #E03A ;+#26 размер окна сжатия для снапа -xE03B equ #E03B ;+#27 0,=1 нажата fire на джойстике и знакоместные координаты курсора в окне изменились - ; 1,=1 нажата fire на джойстике - ; 2,=1 курсор мыши вне пределов текущего окна - ; 3,=1/0 indicator времени в мониторе on/off - ; 5,=1/0 mouse on/off - ; 6,=1/0 kempston joystick on/off - ; 7,=1/0 manipulators on/off -xE03C equ #E03C ;+#28 crd X графического курсора -xE03D equ #E03D ;+#29 crd Y графического мыши -xE03E equ #E03E ;+#2A значение first debouncing -xE03F equ #E03F ;+#2B значение before repeat -xE040 equ #E040 ;+#2C значение second wait -xE041 equ #E041 ;+#2D значение second debouncing -xE042 equ #E042 ;+#2E значение size of step -xE043 equ #E043 ;+#2F -xE044 equ #E044 ;+#30 содержимое регистра дополнительных возможностей #F9BE (не реализовано) - ; =#00 всегда -xE045 equ #E045 ;+#31 содержимое регистра счетчика секторов (#FABE) - ; число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) -xE046 equ #E046 ;+#32 LBA адрес на HDD(двойное слово) младший байт - ; CHS - номер сектора -xE047 equ #E047 ;+#33 LBA адрес на HDD - ; CHS - номер цилиндра (младший байт) -xE048 equ #E048 ;+#34 LBA адрес на HDD - ; CHS - номер цилиндра (старший байт) -xE049 equ #E049 ;+#35 3-0, - LBA адрес на HDD старший байт - ; CHS номер головки - ; 4,=0/1 текущий винчестер master/slave - ; 5,=1 всегда - ; 6,=0/1 это CHS/LBA адрес - ; 7,=1 всегда -xE04A equ #E04A ;+#36 =#20 код команды винчестера: чтение сектора -xE04B equ #E04B ;+#37 =#30 код команды винчестера: запись сектора -xE04C equ #E04C ;+#38 #90 144 -xE04D equ #E04D ;+#39 количество дополнительных попыток чтения/записи сектора с винчестера - -;переменные код 2 -xE04E equ #E04E ;+00 1 константа антидребезговой задержки монитора -xE04F equ #E04F ;+01 1 константа задержки перед автоповтором -xE050 equ #E050 ;+02 1 счетчик до срабатывания автоповтора (базовое =(xE04F)) -xE051 equ #E051 ;+03 1 период автоповтора -xE052 equ #E052 ;+04 1 счетчик периода автоповтора (базовое =(xE051)) -xE053 equ #E053 ;+05 1 цвет бордюра, устанавливаемый монитором, при подаче звукового сигнала ошибки -xE054 equ #E054 ;+06 1 код символа "возврата каретки" для принтера -xE055 equ #E055 ;+07 1 код символа "перевода строки" для принтера -xE056 equ #E056 ;+08 1 код символа "перевода формата" для принтера -xE057 equ #E057 ;+09 2 код, определяющий скорость передачи для последовательного интерфейса (для 9600 бод - 0bh) -xE059 equ #E059 ;+0B 2 код, определяющий скорость передачи для последовательного интерфейса (для 1200 бод - 6аh) -xE05B equ #E05B ;+0D 11 коды, служащие для перевода принтера в графический режим - ; (непосредственно за ними будет выдано 768 байт - ; графической информации при печати экрана из монитора). - ; Байт +0dh хранит количество управляющих кодов - ; +#06 =#01/#03 режим печати 1 точки/3 точки -xE063 equ #E063 ;+15 4 коды, служащие для перевода принтера в текстовый режим, - ; завершающие печать экрана. Байт +015h хранит количество - ; управляющих кодов -xE067 equ #E067 ;2 =0000 - ;дескриптор окна монитора: вывод каталога диска на принтер - ;дескриптор окна монитора: вывод на принтер -xE06B equ #E06B ;+1D 1 число строк на странице при печати на принтере -xE06C equ #E06C ;+1E 1 число символов в строке при печати на принтере -xE06D - -xE075 equ #E075 ;дескриптор окна монитора: регистры/вывод каталога диска -xE083 equ #E083 ;дескриптор окна монитора: ввод строки низу экрана -xE091 equ #E091 ;дескриптор окна монитора: дизассембер -xE09F equ #E09F ;дескриптор окна монитора: дамп памяти -xE0AD equ #E0AD ;дескриптор окна монитора: информационное окно отладчика -xE0BB -xE0C9 equ #E0C9 ;дескриптор окна: menu -xE0D7 equ #E0D7 ;дескриптор окна: запрос на запись MBR -xE0E5 equ #E0E5 ;дескриптор окна: ввод числа -xE0F3 equ #E0F3 ;дескриптор окна: переименование раздела HDD/каталог ROM-disk -xE101 equ #E101 ;1 атрибуты для выделенной позиции в каталоге ROM-disk -xE102 equ #E102 ;#D дескриптор окна при включении -xE10F -xE110 equ #E110 ;1 атрибуты для печати опции меню -xE111 equ #E111 ;1 атрибуты для печати названия меню, времени -xE112 equ #E112 ;1 атрибуты для печати неактивной опции меню -xE113 equ #E113 ;1 атрибуты для печати выделенной опции меню -xE114 equ #E114 ;1 атрибуты для подсветки ловушки при выводе дизасма -xE115 equ #E115 ;1 атрибуты для печати информационного сообщения внизу экрана -xE116 equ #E116 ;2 очередной(первый пустой) адрес в буфере нажатых клавиш -xE118 equ #E118 ;2 текущий(первый не обработанный) адрес в буфере клавиатуры -xE11A equ #E11A ;2 адрес вершины стэка при входе в монитор - ;2 адрес памяти(8 байт) начала сормированной команды для трассировки -xE11C equ #E11C ;2 адрес первого свободного байта программы анализатора -xE11E equ #E11E ;#0C - ;=x3E2C,x3D01 - ;=x3179,x3161 - ;=x1DDC,x1DD0 -xE12A equ #E12A ;2 адрес изображения текущего графического курсора -xE12C equ #E12C ;последнее состояние порта мыши #FBDF (ось X) -xE12D equ #E12D ;последнее состояние порта мыши #FFDF (ось Y) -xE12E equ #E12E ;#20 изображение графического курсора №1 с маской -xE14E equ #E14E ;#20 изображение графического курсора №2 с маской -xE16E equ #E16E ; -xE17B equ #E17B ; -/* -xE16E db #7F ;знак копирайта - db " 1993" - db #1B,#01,#00 ;координаты - db "-97 " -xE17B db "MOA" - db #1B,#00,#24 ;координаты - db "NCACB" - db #1B,#01,#24 ;координаты - db "05-07" - db #1B,#02,#24 ;координаты - dc "V4.01" -*/ -xE196 - -xE1A6 equ #E1A6 ;#?? буфер для вывода строки с выравниванием -;x -xE336 equ #E336 ;вершина стэка для каких-то задач - ;при работе отладчика -xE338 equ #E338 ;#0E для сохранения дескриптора окна -xE33B equ #E33B ;2 для временного сохранения регистров -xE346 -xE38D equ #E38D ;2 вершина стэка при работе в мониторе -xE38F equ #E38F ;#0B буфер клавиатуры -xE39A equ #E39A ;8 буфер для сохранения памяти пользователя при трассировке - ; команды дизасма -xE3A2 -xE3A4 equ #E3A4 ;#10 буфер для сохранения экрана под символом 6 pix -xE3B4 equ #E3B4 ;1 предыдущие атрибуты окна -;x -xE3B6 equ #E3B6 ;1 счетчик для мигания курсора окна -xE3B7 equ #E3B7 ;2 адрес дескриптора текущего окна -xE3B9 equ #E3B9 ;2 адрес п/п обработки текущего управляющего кода -xE3BB equ #E3BB ;1 новая координата Y курсора -xE3BC equ #E3BC ;2 первый свободный адрес в буфере печати (xE1A6/буфер CMOS) - - ORG #E3BE - -xE3BE rst #30 - dw #0000 - db #00 - ret -xE3C3 dw #E449 ;rom 0, ram 8 текущей плоскости - dw #E44D ;rom 1, ram 8 текущей плоскости - dw #E4C5 ;текущая страница ПЗУ в новой плоскости (rom 2 ???) - dw #E41B ;rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 -xE3CB dw #E499 - dw #E489 - dw #E483 - dw #E484 - -;обработка rst #30 -;переключение плоскости -xE3D3 push hl - ld hl,(#0101) ;номер текущей страницы - ex (sp),hl - push hl - ld hl,#0006 - push af - add hl,sp - push de - push bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld c,(hl) - inc hl - ld b,(hl) ;адрес вызываемой п/п - inc hl - ld a,(hl) ;плоскость и страница вызываемой п/п -xE3E9 call xE478 ;включим страницу ПЗУ с монитором - inc hl - ex de,hl - ld (hl),d ;сохраним новый адрес возврата - dec hl - ld (hl),e - ld (xE408),bc - call xE4AA ;установим плоскость - ld hl,xE3C3 - call xE4B8 ;адрес п/п включения страницы ПЗУ по ее номеру в A - ld (xE405+1),hl - pop bc - pop de - pop af - pop hl -xE405 call #0000 -xE408 db 0 ;адрес вызываемой п/п - db 0 - -;включение предыдущей плоскости - ex (sp),hl - push af - push bc - ld a,l - call xE4AA - ld hl,xE3CB - call xE4B8 - pop bc - pop af - ex (sp),hl - ret - - -;включение rom 3(tr-dos), ram 8 и вызов п/п с возвратом в xE478 -xE41B ex (sp),hl - push de - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld (xE43C+1),de ;de адрес вызываемой п/п - pop de - ex (sp),hl - push hl - ld hl,(xE43C+1) - ex (sp),hl ;(sp) адрес вызываемой п/п -xE42C push af -xE42D ld a,#10 - ld (xE468+1),a - pop af - ex (sp),hl - ld (xE43C+1),hl - ld hl,xE478 - ex (sp),hl - push hl -xE43C ld hl,#0000 - ex (sp),hl - ld (xE43C+1),bc - ld bc,#3D30 - jr xE463 - -;включение rom 0, ram 8 и вызов п/п с возвратом в xE478 -xE449 push af - xor a - jr xE450 -;включение rom 1, ram 8 и вызов п/п с возвратом в xE478 -xE44D push af - ld a,#10 -xE450 ld (xE468+1),a - pop af - ld (xE43C+1),bc ;сохраним BC - ex (sp),hl ;берем адрес п/п - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ex (sp),hl ;bc адрес вызываемой п/п - push hl - ld hl,xE478 - ex (sp),hl ;(sp) возврат в xE478 -xE463 push bc ;(sp) адрес вызываемой п/п - push af - ld bc,#7FFD -xE468 ld a,#00 - out (c),a - ld a,#10 - ld b,#1F - out (c),a - pop af - ld bc,(xE43C+1) - ret - -;возврат после обработки rst #30 -;включаем ПЗУ с монитором -xE478 push bc - push af - ld bc,#1FFD - ld a,#12 - out (c),a - pop af - pop bc -xE483 ret - -xE484 push hl ;rom 1, ram 8 с возвратом в x3D30 - ld hl,#3D30 - ex (sp),hl - -xE489 push bc ;включим rom 1, ram 8 - push af - ld bc,#1FFD - ld a,#10 - out (c),a - ld b,#7F - out (c),a - pop af - pop bc - ret - - -xE499 push bc ;rom 0, ram 8 - push af - ld bc,#1FFD - ld a,#10 - out (c),a - xor a - ld b,#7F - out (c),a - pop af - pop bc - ret - -;установка заданной плоскости -;bit 2-3,a - номер плоскости -xE4AA ld c,a - ld hl,#0110 - rrca - rrca - and #03 - add a,l - ld l,a - ld l,(hl) - ld l,(hl) - ld a,c - ret - -;определение адреса п/п по номеру -;вх: bit 0-1,a - номер п/п -; hl - адрес таблицы с адресами п/п -;вых: hl - адрес п/п -xE4B8 and #03 - rla - add a,l - ld l,a - jr nc,xE4C0 - inc h -xE4C0 ld a,(hl) - inc hl - ld h,(hl) - ld l,a - ret - -;вызов п/п -xE4C5 ex (sp),hl - inc hl - inc hl - ex (sp),hl - push hl - ld hl,(xE408) - ex (sp),hl - ret - -;bc =#7FFD -;de - заданная страница -xE4CF ld a,e - and #10 - out (c),a - ld b,#1F - ld a,d - and #03 - or #10 - out (c),a ;rom пользователя, ram 8 - ex af,af' - jr c,xE4E1 - ld a,(hl) -xE4E1 ld (hl),a - ex af,af' - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - jp rom2_x05A1 ;rom 2 - - - - -;АДРЕС: #E4F0 -;сохранение/восстановление стэка из окна [#0000..#3FFF] -;вх: hl' - адрес вершины стэка -; de' - буфер для сохранения -; bc' - размер для сохранения -; de - страница при входе -; bc=#7ffd -; cy'=0 сохранять -; =1 восстанавливать -;вых: hl - адрес вершины стэка+n -; de - буфер для сохранения+n -; -xE4F0 ld a,e - and #10 - out (c),a ;ram 0/8 - ld b,#1F - ld a,d - and #03 - or #10 - out (c),a ;rom при входе, ram 8 - exx - ex af,af' - jr nc,xE503 ;сохраняем - ex de,hl -xE503 ldir - jr nc,xE508 -xE507 ex de,hl -xE508 ex af,af' - exx - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - exx - ret - -;обработчик прерываний im 2 -xE516 xor a -xE517 ei -xE518 ret - -xE519 ei - inc a -xE51B db #32 - -xE51C call #0000;x0212 - ret - -xE520 ld (xE518),a -xE523 ld a,#FB ;ei - ld (xE517),a - im 1 - jp #0000;xF300;x025E - -xE52D equ #E52D ;8 блоков по 11 байт breackpoints - ;+#00 0-1,=nn номер типа ловушки - ; 6,=1 ловушка задана - ; 7,=1 ловушка активна - ;+#01 номер страницы в которой установлена ловушка - ;+#02 адрес ловушки (2 байта) - ;+#04 - ;+#05 начальное значение счетчика проходов по ловушке (2 байта) - ;+#07 текущее значение счетчика проходов (2 байта) - ;+#09 - ;+#0A -xE538 -xE543 -xE54E -xE559 -xE564 -xE56F -xE57A -xE585 equ #E585 ;буфер для установки ловушки - ;+0 #C0+тип ловушки - ;+1 номер страницы ловушки 5,=1 задана в команде 5,=0 текущая страница - ;+2/3 адрес ловушки - ;+4 - ;+5/6 количество проходов - ;+7/8 количество проходов - ;+9 =#00 - ;+10 =#00 -xE590 equ #E590 ;#15 описатель текущего дисковода -xE5A5 equ #E5A5 ;2 head * sector активного HDD -xE5A7 equ #E5A7 ;2 -xE5A9 equ #E5A9 ;#100 каталог ROM-диска - ; временные буферы - ;#200 буфер для чтения сектора HDD -xE6A9 equ #E6A9 ;#100 буфер -xE7A9 equ #E7A9 ;#1C буфер fcb -xE7B2=xE7A9+#09 ;2 адрес начала области памяти при сохранении экрана на диск -xE7BE=xE7A9+#15 ;2 =xE8A9 адрес памяти для копирования из ROM-disk -xE7C5 equ #E7C5 ;2 координаты следующего блока файла ROM-disk - ; текущий адрес на диске (сектор, дорожка) -xE7C7 equ #E7C7 ;#10? строка пути к образу диска -;x -xE7DB equ #E7DB ;6+6 имя полдарздела + имя раздела -xE7E7 -xE81B equ #E81B ;#10 описатель раздела MFS - ; заголовок подраздела, при выборе образа -;x -xE8A9 equ #E8A9 ;#100 первый параграф файла ROM-disk - ; буфер для дисковых операций - ; дескриптор подраздела -xE8E9 equ #E8E9 ;#70 битовая карта параграфов. по 8 байт на страницу - ; =0 параграф пустой -xE9A9 equ #E9A9 ;#14 буфер программы анализатора - ; для зарезервированных слов анализатора st0-st9 -xE9BD equ #E9BD ;#14 адреса ловушек - ; для зарезервированных слов анализатора br0-br9 -xE9D1 equ #E9D1 ;2 адрес начала параметров-слов в программе анализатора -xE9D3 equ #E9D3 ;2 адрес конца названия слова в программе (указывает на #01) -xE9D5 equ #E9D5 ;2 адрес первой ячейки переопределяемого слова -xE9D7 equ #E9D7 ;2 адрес конца названия переопределенного слова в программе (указывает на #01) -x -xE9D9 equ #E9D9 ;2 адрес начала стэка анализатора -xE9DB equ #E9DB ;2 адрес вершины стэка анализатора (адрес первой свободной ячейки) - ; стэк анализатора растет вверх!!! -xE9DD equ #E9DD ;2 для сохранения SP в анализаторе -xE9DF equ #E9DF ;2 для временного сохранения регистров - ; -xE9E1 equ #E9E1 ;2 адрес таблицы со списком процедур для п/п x2028 -xE9E3 equ #E9E3 ;2 номер записи каталога ROM-disk, с которой начинаем печать -xE9E5 equ #E9E5 ;2 адрес шрифта -xE9E7 equ #E9E7 ;4 смещение от начала образа в секторах (512b) +1 - ; размер создаваемого раздела в секторах -xE9EB equ #E9EB ;4 4 байта из дескриптора xE591 - ; смещение первого сектора выбранного подраздела MFS/образа в подразделе -xE9EF equ #E9EF ;1 смещение ширина поля в символах от края окна для переименования раздела HDD -xE9F0 equ #E9F0 ;1 ширина в символах окна для переименования раздела HDD -xE9F1 equ #E9F1 ;1 номер дисковода -xE9F2 equ #E9F2 ;1 номер дисковода (пользовательский для rst 8: db #81) -xE9F3 equ #E9F3 ;2 адрес блока описателей дисковода -xE9F5 equ #E9F5 ;#15 описатель дисковода A - ; +#00 код подраздела (для образа =#01) - ; 2-0,=??? тип подраздела - ; 4,=1 подключен раздел TR-DOS (не образ) - ; 5,=1 образ защищен от записи - ; =#00 - реальный дисковод - ; +#01 4 адрес первого сектора подраздела/образа - ; +#05 4 адрес последнего сектора подраздела/образа - ; +#09 6 имя подраздела - ; 6 имя диска в подразделе -xEA0A equ #EA0A ;#15 описатель дисковода B -xEA1F equ #EA1F ;#15 описатель дисковода C -xEA34 equ #EA34 ;#15 описатель дисковода D -xEA49 equ #EA49 ;#15 описатель дисковода A (пользовательский для rst 8: db #81) -xEA5E equ #EA5E ;#15 описатель дисковода B (пользовательский для rst 8: db #81) -xEA73 equ #EA73 ;#15 описатель дисковода C (пользовательский для rst 8: db #81) -xEA88 equ #EA88 ;#15 описатель дисковода D (пользовательский для rst 8: db #81) -xEA9D equ #EA9D ;буфер для определения последовательного порта/модема -;переменные код 6 ??? -xEAED equ #EAED ;8 список атрибутов Ink для печати опций меню -xEAF5 equ #EAF5 ;#100 признак целостности страницы (байты от #100 до #00) -xEBF5 equ #EBF5 ;#400 буфер для загрузки/записи - ; буфер для первых двух секторов раздела MFS (каталога подразделов) - ; буфер для таблицы секторов пользователя -xEFF5 equ #EFF5 ;#200 буфер для чтения сектора с винчестера -xF1F5 -xF6C0 equ #F6C0 ;#100 программа анализатора -xF7C0 equ #F7C0 ;шрифт 2048 - -;переменные код 4 -;переменные дисковой BIOS -xFFC0 equ #FFC0 ;+00 1 MFM максимальное число секторов на дорожке для сектора 128 -xFFC1 equ #FFC1 ;+01 1 MFM максимальное число секторов на дорожке для сектора 256 -xFFC2 equ #FFC2 ;+02 1 MFM максимальное число секторов на дорожке для сектора 512 -xFFC3 equ #FFC3 ;+03 1 MFM максимальное число секторов на дорожке для сектора 1024 -xFFC4 equ #FFC4 ;+04 1 FM максимальное число секторов на дорожке для сектора 128 -xFFC5 equ #FFC5 ;+05 1 FM максимальное число секторов на дорожке для сектора 256 -xFFC6 equ #FFC6 ;+06 1 FM максимальное число секторов на дорожке для сектора 512 -xFFC7 equ #FFC7 ;+07 1 FM максимальное число секторов на дорожке для сектора 1024 -xFFC8 equ #FFC8 ; 2 адрес таблицы с количеством секторов на дорожке -xFFCA equ #FFCA ;+0A 1 номер текущего дисковода: 0 - дисковода А, 1 - В -xFFCB equ #FFCB ;+0B 1 количество попыток считывания при ошибке, начальное значение 3 -xFFCC equ #FFCC ;+0C 1 коды, определяющие тип дисковода (спецификацию) А - ; =#FF - еще не инициализирован??? - ; =#E0 - если подключен образ диска (без защиты от записи) - ; =#C0/#00 - для реальных дисководов A-B/C-D - ; 0-1, -время перемещения на шаг - ; 1, - ; 4, - ; 5,-0/1 образ не подключен/подключен - ; 6,=0/1 дисковод на 40/80 дорожек - ; 7,=0/1 односторонний/двустронний дисковод -xFFCD equ #FFCD ;+0D 1 коды, определяющие тип дисковода (спецификацию) B -xFFCE equ #FFCE ;+0E 1 коды, определяющие тип дисковода (спецификацию) C -xFFCF equ #FFCF ;+0F 1 коды, определяющие тип дисковода (спецификацию) D -xFFD0 equ #FFD0 ;+10 1 коды, определяющие тип дискеты в дисководе А - ; 0-1,=00/01/10/11 размер сектора в байтах 128/256/512/1024 - ; 2,=1 диск 40 работает на дисководе 80 - ; 5,=0/1 40/80 дорожек на диске - ; 6,=0/1 метод записи FM/MFM - ; 7,=0/1 односторонняя/двустронняя дискета -xFFD1 equ #FFD1 ;+11 1 код, определяющий тип дискеты в дисководе В -xFFD2 equ #FFD2 ;+12 1 код, определяющий тип дискеты в дисководе C -xFFD3 equ #FFD2 ;+13 1 код, определяющий тип дискеты в дисководе D -xFFD4 equ #FFD4 ;+14 1 текущий номер дорожки для дисковода A -xFFD5 equ #FFD5 ;+15 1 текущий номер дорожки для дисковода B -xFFD6 equ #FFD6 ;+16 1 текущий номер дорожки для дисковода C -xFFD7 equ #FFD7 ;+17 1 текущий номер дорожки для дисковода D -xFFD8 equ #FFD8 ;+18 1 код time-out для дисковода А -xFFD9 equ #FFD9 ;+19 1 код time-out для дисковода В -xFFDA equ #FFDA ;+1A 1 код time-out для дисковода C -xFFDB equ #FFDB ;+1B 1 код time-out для дисковода D -xFFDC equ #FFDC ;+1C 0,=0 при вызове функций #00-#13 R8DOS - ; 4,=0 после завершения функций #00..#13 R8DOS - ; =1 текущий диск инициализирован - ; головка на заданной дорожке - ; =1/0 головка на нижней/верхней стороне диска - ; 5,=1/0 работа с дисководами монитора/пользователя - ; 6,=0 при инициализации - ; 7,=1 к текущему дисководу подключен образ -xFFDD equ #FFDD ;+1D 1 код ошибки дискового интерпретатора - ; =#FF при вызове функций #00-#13 R8DOS - ; =#01 нет диска в дисководе - ; =#02 попытка записи на защищенную дискету - ; =#03 нажата Break - ; =#04 ошибка при чтении или записи сектора функциями 5 или 6 - ; =#05 ошибка позицирования (не соответствует номер дорожки) - ; =#06 ошибка позицирования (не считался адресной маркер дорожки/сектора) - ; =#07 неверный номер сектора - ; =#08 ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) - ; ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) - ; =#09 неформатированная дискета (функции 7, 8) - ; =#10 дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - 10h (функция 8) - ; =#11 несовпадение кода типа дискеты TR - DOS реальному формату - ; =#12 не открыт рабочий буфер (функция 8) - ; =#14 были ошибки при чтении/записи дорожки (функции 12, 13) - ; =#21 ошибка образа диска - ; =#22 сектор за пределами образа диска - ; =#3F дискета не соответствует формату TR - DOS по физическим параметрам: размер сектора, плотность записи либо нет кода идентификатора - ; =#45 неверный путь - ; =#46 конец файла - ; =#48 файл не найден - ; =#49 попытка записи после конца файла - ; =#4A попытка чтения из файла открытого на запись - ; попытка записи в файл открытого на чтение - ; =#50 HDD не вышел в готовность - ; =#55 ошибка заголовка файла zs-snap - ; =#56 нет раздела MFS/винчестер не найден - ; =#57 не прочитался сектор идентификации - ; =#57 ошибки при чтении с HDD - ; =#58 ошибка в секторе идентификации - ; =#61 HDD не вышел в готовность к принятию команды - ; =#62 HDD не вышел в готовность к передаче данных - ; =#63 раздел MFS не найден - ; =#66 путь не найден - ; =#67 к дисководу образ не примонтирован - ; =#FD размер сектора не соответствует (для образа диска) -xFFDE equ #FFDE ;2 адрес стэка при вызове функций #00-#13 R8DOS -xFFE0 equ #FFE0 ;1 количество секторов на дорожке -xFFE1 equ #FFE1 ;1 =#80/#A0 чтение/запись группы секторов -xFFE2 equ #FFE2 ;2 адрес в памяти для чтения/записи группы секторов - ; текущий адрес записи при формировании таблицы секторов на дискете -xFFE4 equ #FFE4 ;2 начальные дорожка и сектор для чтения/записи группы секторов - ; текущий адрес в записи при формировании таблицы секторов на дискете -xFFE6 equ #FFE6 ;1 количество секторов для чтения/записи - ; код при формировании таблицы секторов на дискете -xFFE7 equ #FFE7 ;2 адрес рабочего буфера для функции 8 -xFFE9 equ #FFE9 ;6 буфер для чтения заголовка сектора - ; +0 номер дорожки - ; +1 номер стороны - ; +2 номер сектора - ; +3 длина сектора 0/1/2/3 - ; +4/5 констрольный код -xFFED equ #FFED ;2 размер сектора в байтах -xFFEF equ #FFEF ;1 ret для вызова п/п опроса Break из rom 5 - ;1 код последней команды ВГ93 - ;1 для временного сохранения регистра A при вызове функции R8DOS -xFFF0 equ #FFF0 ;2 адрес рабочего буфера для функции 8 -;x - - -/* -окно пользователя: -+00 координата Y курсора в окне -+01 координата X курсора в окне -+02 координата Y начала окна (в знакоместах) -+03 координата X начала окна (в знакоместах) -+04 высота окна в знакоместах -+05 ширина окна в знакоместах -+06 цифровые атрибуты окна -+07 системные атрибуты окна: - 7-6,??? - 5 Запрет вывода, все выводимые символы игнорируются - 4 Произвольный формат, по достижению правого края окна будут автоматически - выполнены команды перевода строки и возврат каретки - 3 Выполнять автоматический возврат каретки при приходе символа перевода - строки - 2 Выполнять автоматический перевод строки при приходе символа возврат - каретки - 1 Изменять атрибуты при выводе каждого символа (в противном случае атрибуты - устанавливаются только во время очистки окна) - 0 Не выводить символ курсора -+08 - 5-3, номер рамки - 7,=0 нет рамки вокруг окна -+09 атрибуты рамки -+0A размер символов в пикселях 6/8 -+0B размер окна в символах. Для символов в 8 точек этот размер совпадает с - шириной окна. Если размер символа 6 точек, то перед инициализацией - (очисткой) необходимо рассчитать размер окна и поместить в этот байт. -+0C код символа курсора. Код с этим символом будет выводиться вместе, отмечая - положение курсора, если сброшен 0 бит в системных атрибутах окна -+0D 1,=0/1 режим вставки/замены при вводе строки - -*/ - -/* -точки останова (ловушки) -+00 1,=1 ловушка задана но не активна - 7,=0 ловушка не задана -+01 логический номер страницы, где стоит ловушка -+02/03 адрес ловушки -+03 -+04 состояние памяти пользователя по адресу ловушки -+05/06 -+07/08 адрес -+09 -+0A -*/ - - -/*дескриптор файла: fcb - -+#00 8 имя файла -+#08 1 тип файла -+#09 2 при типе C стартовый адрес, при типе B длина бейсик-программы -+#0B 2 длина файла -+#0D 1 объем файла в секторах -+#0E 1 номер первого сектора файла -+#0F 1 номер первой дорожки файла -+#10 -+#13 2 указатель в файле -+#15 2 адрес буфера dma -+#17 1 b - способ открытия - 0-1,=11 файл для модификации - 0,=1 файл для чтения - 1,=1 файл для записи - 2,=1 обмен целыми секторами "физический" файл - (если сброшен - обмен будет вестись байтами "логический" файл) - 7,=1 файл был изменен, но не сохранен -+#18 1 номер текущего дисковода -+#19 1 номер файла на диске -+#1A 1 кол-во секторов для чтения/записи -+#1B 1 максимальный объем файла в секторах - - -*/ - - -/* Формат таблицы расположения секторов. - -+0 Идентификационный байт - #00 - информация о секторе достоверна - #FF - информация о секторе не достоверна (сбойный сектор) - #FE - конец таблицы секторов - #FD и #FC - см. функцию 12 -+1 Физический номер дорожки (0:х) -+2 Номер стороны (0/1) -+3 Номер сектора (1:х) -+4 Код длины сектора - 00 - 128 - 01 - 256 - 02 - 512 - 03 - 1024 -*/ - -/* описатель дисковода (для примонтированных образов) - -+00 =#00 ничего не подмонтировано - =#01 что-то подмонтировано - - -*/ - -/* описатель подраздела раздела MFS - -+00 0-2,=nnn тип подраздела - 7,=1 при печати типа подраздела перед ним печатать "*" -+01 4 смещение первого сектора подраздела -+05 -+06 размер подраздела -+0A 6 имя подраздела - -*/ - -/* описатель подраздела MFS/ - -+00 0-2,=nnn тип подраздела - 7,=1 при печати типа подраздела перед ним печатать "*" -+01 4 смещение первого сектора от начала винчестера (LBA адрес) -+05 для образа =#00 -+06 2 размер подраздела -+08 2 -+0A 6 имя подраздела - -*/ - -/* структура HDD - -сектор 1 - MBR -сектор 3 - данные примонтированных образов - -*/ - - -/* структура раздела MFS - -2 сектора каталог подразделов -n подраздел -n подраздел -n подраздел - - структура подраздела MFS -2 сектора каталог образов дисков -501 секторов на каждый образ (1й сектор пустой) - -*/ - - -/* сектор 3. примонтированне разделы/образы -+#00 1 тип подраздела/образа (для образа =#01) - =#00 ничего не примонтировано -+#01 4 смещение первого сектора от начала винчестера (LBA адрес) -+#05 1 тип подраздела/образа (для образа =#01) -+#06 4 размер подраздела/образа -+#0A 6 имя подраздела -+#10 6 если это подраздел, то имя подраздела - 6 если это образ, то имя образа - -*/ - - - -/* -Формат таблицы расположения секторов. -+0 Идентификационный байт - =#00 - информация о секторе достоверна - =#FF - информация о секторе не достоверна (сбойный сектор) - =#FE - конец таблицы секторов - =#FD/#FC - см. функцию 12 -+1 Физический номер дорожки (0..х) -+2 Номер стороны (0/1) -+3 Номер сектора (1..х) -+4 Код длины сектора - =#00 - 128 - =#01 - 256 - =#02 - 512 - =#03 - 1024 - -*/ - - -/* формат заголовка zs-snap -+#00 =#4D/#41 без компрессии/с компрессией -+#01 =#33 сигнатура с загрузкой регистров AY - =#31 сигнатура без загрузки регистров AY -+#02 (xDD69) 2 адрес текущей ячейки в дампе памяти -+#04 (xDD6B) 2 адрес возврата из монитора/ pc программы пользователя -+#06 (xDD6D) 2 указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке -+#08 (xDD6F) 2 регистр ix -+#0A (xDD71) 2 регистр iy -+#0C (xDD73) 2 регистр hl -+#0E (xDD75) 2 регистр de -+#10 (xDD77) 2 регистр bc -+#12 (xDD79) 2 регистр hl' -+#14 (xDD7B) 2 регистр de' -+#16 (xDD7D) 2 регистр bc' -+#18 (xDD7F) 2 регистр af -+#1A (xDD81) 2 регистр af' -+#1C (xDD83) 2 регистр r и флаг IFFF2 -+#1E (xDD85) 1 регистр i -+#1F (xDD86) 1 номер rom откуда зашли -+#20 (xE02D) 1 переменная =iy+#19 -+#21 =#00/#01 режим прерываний im 2/im 1 -+#22 цвет paper #5800 (для установки бордюра) -+#23 содержимое регистра 7 AY -+#24 состояние порта #7FFD -+#25 состояние порта #1FFD -+#26 регистр #00 ay -+#27 регистр #01 ay -+#28 регистр #02 ay -+#29 регистр #03 ay -+#2A регистр #04 ay -+#2B регистр #05 ay -+#2C регистр #06 ay -+#2D регистр #08 ay -+#2E регистр #09 ay -+#2F регистр #0A ay -+#30 регистр #0B ay -+#31 регистр #0C ay -+#32 регистр #0D ay -+#33..+#3F не используется -при записи без компрессии -+#40 битовая карта параграфов страниц - по 8 байт на страницу - последовательность соответствует порядку записи страниц - если бит =0 параграф пустой (не сохраняется, при загрузке забивается нулями) -при записи с запаковкой страниц -+#40 размер запакованных страниц - по 8 байт на страницу - +0 количество байт в последнем секторе страницы (=#00 - 256 байт) - +1 количество секторов занимаемых страницей - +2..+7 не используется -+#B0..+#FF не используется - -порядок сохранения страниц: для 48k режима -ram #02 -ram #05 -ram страница включенная при входе в монитор - -порядок сохранения страниц: для 128-256k режима -ram #02 -ram #05 -ram страница включенная при входе в монитор -ram #00-#0F (кроме 8й, 9й и уже сохраненных) - - - -*/ - -/* структура программы в анализаторе -2 #mmmm адрес начала следующего слова -n #80+"W"+"ORD" -1 #01 -2 #nnnn адрес конца слова в словаре (указывает на #00) -2 x2340 (xE024) #????(число) -2 #.... -2 #nnnn адрес конца слова в словаре (указывает на #00) -2 x225D п/п прерывания выполнения слова - -#0000 конец слова - -*/ - diff --git a/ProfRom_Disasm/!roms.mac b/ProfRom_Disasm/!roms.mac deleted file mode 100755 index 44d1f70..0000000 --- a/ProfRom_Disasm/!roms.mac +++ /dev/null @@ -1,56 +0,0 @@ - DEVICE ZXSPECTRUM128 - org #4000 - - defarray nKeys #1A,#1B,#1C,#1D,#1E,#1F,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#FF,#00,#01,#02,#03,#04,#05,#06,#07,#08,#09,#0A,#0B,#0C,#0D,#0E,#0F,#10,#11,#12,#13,#14,#15,#16,#17,#18,#19 - -/* -;текст слова анализатора - MACRO Word text -;.nTxt = $ -; db text -;.eTxt = $ -; org .nTxt - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA -; org .eTxt - ENDM -*/ - -;текст слова анализатора - MACRO Word text - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA - ENDM - - -;дескриптор опции -;=0 цифра/буква выбора опции 0-5/A-Z -;=1 номер атрибутов в таблице -;=2 адрес п/п определения доступности опции -;=3 адрес п/п - MACRO dOption Key, nAttr, Proc1, Proc2 -.tKey DEFL Key-#30 - db nAttr*#20+nKeys[.tKey] - db (Proc1-#8DD)/#100*#04+(Proc2-#468)/#100*#10 - db (Proc1-#8DD)%#100 - db (Proc2-#468)%#100 - ENDM - - -; dOption "0",0,#947,#533 - -/* -.nTxt1 equ $ - db "TEXT" -.eTxt1 equ $ - org .nTxt1 - LUA - sj.add_byte(sj.get_byte(sj.current_address) + 128) - ENDLUA - org .eTxt1 -*/ - - Word "NOP1" - diff --git a/ProfRom_Disasm/ROM_MAP.TXT b/ProfRom_Disasm/ROM_MAP.TXT deleted file mode 100644 index 73cb8f4..0000000 --- a/ProfRom_Disasm/ROM_MAP.TXT +++ /dev/null @@ -1,38 +0,0 @@ -ROM MAP -| --- | --------------- | ------- | -| № | File Name | Address | -| --- | --------------- | ------- | -| 0 | rom0.a80 | 0x0000 | -| 1 | | 0x4000 | -| 2 | rom2_SrvMon.a80 | 0x8000 | -| 3 | rom3_trdos.a80 | 0xC000 | -| 4 | rom4.a80 | 1x0000 | -| 5 | rom5.a80 | 1x4000 | -| 6 | rom6.a80 | 1x8000 | -| 7 | rom7.a80 | 1xC000 | -| 8 | | 2x0000 | -| 9 | | 2x4000 | -| A | | 2x8000 | -| B | | 2xC000 | -| C | | 3x0000 | -| D | | 3x4000 | -| E | | 3x8000 | -| F | | 3xC000 | -| 10 | rom0.a80 | 4x0000 | -| 11 | | 4x4000 | -| 12 | rom2_SrvMon.a80 | 4x8000 | -| 13 | rom3_trdos.a80 | 4xC000 | -| 14 | | 5x0000 | -| 15 | | 5x4000 | -| 16 | | 5x8000 | -| 17 | | 5xC000 | -| 18 | | 6x0000 | -| 19 | | 6x4000 | -| 1A | | 6x8000 | -| 1B | | 6xC000 | -| 1C | | 7x0000 | -| 1D | | 7x4000 | -| 1E | | 7x8000 | -| 1F | | 7xC000 | -| 20 | | | -| --- | --------------- | ------- | diff --git a/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom4_ROMdisk.bin deleted file mode 100755 index 00ab98fa3b03d038406c9fd70c264e15b770f41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12800 zcmc(ld0Z3c+V}6t9@d!z!hj0*BuE3egjA8H5(8@0x)8;!E)}X#0+@s>BrIZPlCX(N zwTtcPLTh_US7@z=YOR8nmPpe_PsIa0O-qiAwWT?QS}e8_-kY9&-p~7apXdGi&2Y_4 zW|B!VncUa)`~I%A_X7Z&pa`x1`wd&d8OFdA{@?ffKetT%apV6_`$zw$jsL&5-KId% zU2O7TuUZnS8les{z6WVyzZyWJ%{WjpYVtxzDZ)Owsru>P~u#d9R1lay?sIy0nhpIXV4!|P7e=$mrLHU9~ zeMxz72X&%EdTEEc^^1dF?83g83Kj8w50!93j*lSk3CLE8D}07(>YUS;uUCmHy5vHi zw}g_==q}Yfy}q>fpak%@ZQZnP+bS)TZ%Bs^hiVW2NpW&NMuLMMGEYVva z`qNoVy50KXa;V#*w@$xvli66Q-=o_D_Zra~&|9o#{bRQ2J;fGiDmGi8aW5>~Z8V#v zAH1y)Di>z|=alHp`?nOEbuiy(uvxUlW%Ht=AzZZ=RvB%uq_`4&Dnk{lu<0z*2eUwQ z^xek&`*jAZ1r|SMv{|G7Ji&9|?&9)tXf?uOo3+GfRz>4c|NXq7jiwT#L8pS5i{|EJ zDd#F5cwp}R3$m1G$6oy&w8yG~O4UNe{fhbbXDjDrflolasd2Ee-2?>giS~&>An<4> zCQJ|{Gti_ExJ~U75TxKZ6o4c=r2$M#3=U3A;CYNzi$l*uV|#le!0SoU)Y@8vZ*?`I zXFlx7k>|i7fWPQi=~y{92td0@+o(0Q184W}=y10a;0n{INrA&6yt+rr04-23?Iqpv zMgWSOMd&zSJp(}ZsP;a30=9NTaD;|1#|;$|3iyGmXrc(dL_6UN9-tjWZ@2)zqWMKJ zydG052NU>gT)|9e0UHBPjJAzxM>U|e6>3^r0noH*uC(DKt-Q6adH`^!ae_ftYv&b0&Y%zTDdzMPwcec(qS0!0gZmP6p59hW1o<|PCF?8PM}v{4bw1hIG+P>tdn@wU4)xj*?@KuMHpa! z34F)K!9r{saT>I5_#NAMv5gtU6+f{CFSc`> z3IQzuw_HV9Eyq#c*x1+J-dAyj8OB-9vIae^?YG+7MV&+e)tEJb8M9iM?lv}Ciql0h zQUv1c`5+6EDriV`6BwtR!l>4)3E~mz7QHoZVrfyugjC>a2kkh=1KPFiTAbtR94rBB zrgN|l(!&})6cU?e&*1VE0xij0!C~UZ+BiyqqkrQZMDN1WVCBMb%~l5HESu7iTJruX zcB%$y6Yxati}Y57(Y00MNL$W0Gzx+qRAjNY(}Nm_r;E!ZX*k45+^E25?ebOtH73oc za0@i0y{d5Fdd+uGjz6t=SMv{$E{XhjBKssWG0{8Ro1>j+rI(H_@LIGYn)4Os`voOZ zn&p(f6u(v6m;fL;QDQw^Byvt~OD01>hLm+E$=lzLnNKR^$RekiCj?hSu;@ zlG$myz>e7$=+U$q7u1YO?EE&meKzECWpdufv?&|#FYvFpS_da)o9M=bHm);4y|+p9 zQ~So4ji0k3HV>u?4h~c7wi|4&G^0eI2IIaZB?4t)iEnWUHK!za37nu+AjY+%WK0p? zF7UoaVvBq)8O9qLjAtqj6qKdH`Y$VjF#zB02sLFT7;02i{1szI! zr!sbDu2Qu_FiEL)1gY~SH$s-&9X@gH?LcVhlO-Ud69d3|V_aQ^@}@faoII)H9OSC; zkK}|p;V}V89u^Zmop&Ied0NB|wWVG@$-nF>(m446x|@IL7+48c zYE~Albgpb$*}ZajCD8IRUeXq6o!T~Sx3>48f-0Z06#q@uQzz@{3rEN&!V(x&2Od5w zt5Y5*m65l?(J;OPY;&s)lr9D$Pnd)Q9U$p2`CnlHj8fH>cFB8lK~)QRA&f(g8j^2? z36v^)2K*)CD~d(g8pmK^ZmyR{~;I zDLEuvr^s+GFD3c#e&&HvFrT3|;ykeM@i3G}grnuWo8N>B;ZOT+1WgY;Ip&3{3>F>A zvKFJwyjwS&fXlk)(LkGUXwP)!G!#!~&!U;2x^b-$CEK}kp*HIAxpIYKcKTdUXe!>V zn`_WH!1|`$X2YE222@2T@RoADK{uyxuBA+Gnio-XVQR`B3=Z^$w%3+s)RlIHHjJl% z(sYbhCajZfP6K7>=~#A|@Nc_h>tuDZy~Z)W(Vqs?0J78*$}6S*chdc6>BT^iU)aMF z^!n?-zky$t7X$k5>nHHvRwTXpu1K8pN~dT>Tn|2stvotMt^5cI=Ydo;c@APatkBbQ zHQ*0aO#Wxdn>;zJ1p@vQU{5T;cs)}X7LH|cMh~+2t|>O_UJ8dhJjDf&o(|rh!AGOu z&k&+90%-n-NHk7I6pH9SBL zM0NT4tKD3UK1I@^KnW+ z`B;~Hc$@+lfdk*I^06>We$^ki+7m#}Z1DOvluOv-fcI?A2k>@09Pje_ipqz4M_9gO z_RwI57ZYmWwpY9>)CW;9$8yNC!wPwPSSgg<)Sfx{n90D++{l-d&VNmO4A_K6(0@Pv5S~Sh54u z9C-BL+|1m0a~_m}#kK04^Fh&e)$IfQx&68GZ?X$`09EbfexW*Edw~-b4JTukaN)$i z@h`&53i|g!LG`J=s;4Ge;>pIKzJi4R6`y=^E_nXzi|R}zK8dVWMceR^*lx- zR>Zt4?htvyP6ay*uc()J2mBQ*zllB470Mq%*?R5rAq5u*j*;=ayE``~4uu{b!tbUJ zg-VAY*K@V{6y$*W8ob!lRA|ExSnv{C@vFYbU)$AP8)gqe&Vlf)LFzlUSD@wz21qDS za{=EyU!dloIa94>gE-g2Y8FUxtyg0JKD%`wc|O+tk?`};nK{3O^1mJ}sJSW4uy&c6rTokY2)9&a41gThyQUtH40N8*28BSVNx^s0Dc~9dlW^`+Le*!+uFrlo zkx_)(m*^L>#_xQyG_yrD0g2Y>1E2FH0nKjYh&lEe1BYmBVw?EUOr zqYrHFfg@u+)^=?o5H-Nt0WbBrQNnXo8ppHw?y)}fjlRfa0WSHZSAr#MG3%{5xVP9= zZiPCt*=XjTXDapFfv2?_)nH2L zr0i|U40?$~bgb6@4lvgE-@*1(``=;h@^5Big)Q()>3LJAu*Won^8R8P{Zc%K3_a0N zq9~fjQqX~XUK6*%tDfrm_yIFF;xCZ=LkN%i_L#A6ehWG7+*>Ta<=bk>DHz8SpZj>d zdCX7sSMX-~&jXm{-^=nFu-g7}2+St?Qpc>wldjXph~uNLB8r0 zTke^huYK#y>fiqPO-hcycj`i=FU3qgmy+|lFWyexS^sX$ivF54Rh8?Um3g_=4c}Qd zMp~E6vM!fe3+G!4KC`UlS+}jVYVTR|<87Nhv~4-*w`H5g7dN?ed8V$^@s#5!!BgauP4kVl^Y`%tNpA~E>9+*>!}xg5)v#4t;uT4&7d zqkgN&m8VjLMluE9o~~|Hp%LKP$oeqrN*A>^>c(+uqoHnbn4N=l*f0InL9H{Aqeb(d z@1`hI-F!QFld3k5cc{z*K1XfN5aK`NH7XlMw|s_ZkngV!mB$c+aWzZ~$z9&+^Hi&+ zlxHfH$88j5;t3>4uHUI}+&eDnvNh=}^R<=xtcL>K7|z+>^omU?t_&@eRElz+o~V@G zuu;i2Q*{^Q)`Vknu!S}6!6>l0!MCT9I%~ZYG4bY}O4XUlu8+BuK4)derEjegX~a4s zoW@6c_2oJXkihstT{(g~aGo|kBC{!G1<6%@V~uh2G#oXifpp^9)77y zeldB9pQxbdYaq{!MFU}4DI*tx0$PTpG2|(jHs4KSYm!i=I$^Xu}9r>Qa20h{EAlsc{nbictFkLMfZ*ajY3sF*0UHN^tTXGTF=k8xU1C^^r2-L3_qT zCGW2;D#y+`$}%LV+!kH=JgL(yx1@vo)t*-z(x)8QWJ756H&z}H_N3SM-|PPci^BR3 zz3d3JO)qsZ0@BemvO{{@?x%oLsB{sSDPlhp>XfCrhcPaTeCF`0j0C5oH z*ZYOOl>LFEC+q8E;d~gGQc25t#BP!+lcl(hSI?X!#}=QLvo|LLnco8ZW-Rt79pvw! zF^+|Kl*NyA4futi@QAN_zrT(ZhLGdWW+^yNFn&9TIK-ak&*skdXY)V?c&6FL_ge+3 zR~>#k#|~`=bq$cZ}rzFeSs+7V`bdCb0SE`v@$ zPwWSD2WPG8lHEGvpPVll$|*eCETmqp%9XRJ$E#u^;(l_&Na_?G^$hh>6k@{ zG;8Qd_-ON96E$Ad1=-YHSX}>2m5MTTfm-?&G%Xlp9ypk?n~9I)3LAZnDk>pL^#T+! z9s>|IpO;5;D60)rNj2v}(m#$sF14|m{F%~Jlc7)YVz2P(T#^`Wtei0ybGnv&S|7u$ z)a&f2y|g9q1d!6!Sm%P9kYL38*ex!d&Hy7_CbK?e7cOy?8~3H&0hDKtSzoEca~mRr z#g^TAJuW=-nBD*+m=K={48ot7y?bLnc$_7KmW@^AIu$P5Z``0mC`#-xR_Zp`RS(5K z^0*2DyWUy?i!EiqpsUoGljeGg%k9Ng;Kk!W!i(Oc-@8|5MxYkLWk`;4o11yj&|0E{ zmg4=ujmJUxvp5bqz6eu5Ltq*VkoHg~HpR+b5$g2j-DbGL$d>vJ2K2J9Kr#A~VY> zWMg*O2-&FA)(Cf{|Bw;e7=A>a6<#Nwn-Nd{6cL}^;8Dy-$@v$#&lL~m;g(Hr(jMz9taWv_|1H}QN)HF6$RR>Pk$16{fEb0f-KSE!>fnU2Gg z>$y}@4LK}`cZXSUJ%~zZYS?;!00GRw*%$3RG5(pMdThKPw0)wI%C)O8UtGypw=ePl z?_Vxox}EnGfA3)eNJ53Rr34rrz_K_mxH?3EsDqI$E@W+hbsitArJ5m+d9enMqTAqJ z1~bh(2~r!pC29;IA^b70(?tbqXMR{8dEip6HAp5fc?Y8U>40#BOL@AsqCB#u@p@hk zC(Oy2Ur|n#(#jZBw`f+v$pVuO zSsl}E0pk6pa%5@DgIcrBg0Md_1j=+(^T3STbnJt-XFTRX!czVtev{sW|5Z5KEn!71 zV>h|d#J_GP{Yxsikh1XE1U!F=yi*)aKI=dqa`n-ljJ}%b?ZO4o7|rZiE|MwBG$g|V;!U1hE0VCz z4m4vTfPr-=!{$FZ<8+duM#qDQ@%j6~LnwI&$vghK1iQ>%N8;S46Ya7YsARg8YY$A* z$vRo6@IkY31=KVn18-(u(6`7O(5!oz{0bRy#ApS=27+ljizlQ;E3$X>2B{kr{~>PR z;M;ctJ&2;s4#&V)weW-NUGm{<$jQv!MGkTyx*-3~vCGt~59F-uUHB(R_R~<23m$$U zNKj@3C6Ijhezz&>m#z;b)!Av#%*1iMtjne1M z0RnXMSfS4UNNH7YN5&j8O3(a^40Dg{={a*%^UOQs*vt>*?0I0H)M3h)Z8e1Ds;hh*l05|Pno(%h6om8SobU!XatDqh(mED4^o7lk>$6rMQd%Wvv+jr6 z>#L&Vq8JfIx+uy_B+^3cXgwKJABhoQbKDtUBZ~0NliZ4of9+5Ob|@dUh7bOIR%K}W zJhKEJt^aaXrPN{7sL;&fZTDTUBKU)dLMD>0(jHR>LJUX>s}q!+Cg1$ZFm}1p7G_

U7 z{QZU!TgF0j8t6%P6Te#%#agDsM%-;cX_ZH9vVor&YB|hk@|OH*Q-h1lJ{22x1Gvcm z|E0y5O$JbkCfBke2(sL!a^oJ2!nILn(LU&wBuN%$#d<8pa-CX>(B3}IlX7QzZ=GF>*H5IO0q_!n-nm-1_gmfF$<-`bFx2*~p|Uzm!#ly=IN2e9`C^Pcfq3%f0GR8+fX4SZ zp51cQ@ox86|5=1G^H*~p1F45PylO)EMrDWcmrAgV9s;xMdP;&zHOXY%ilSkt033yFqrZRc}tU0PCcz`R9M;Jpb z=E|dSfjf>X=i+!nLSO~TpAPKVdZ3XmwD-aaa1kGdkGayEJxKmxTmY_mI=rF65Xf#- zifgKr8>&$0u;dR+7*|Y_;>ku3CIkTEV&ZXEAS~rf(j%g~hh@?VJ8`kf_t}2xT-Cyy zzl1uex2ws>TsfEWSCc}@ZIr%QO&zY5o~;sZY@|TIcczL`qS9e^HHd1ME-$FdRjJT} zBy&szceH4hi@I5b&!^*H6i3zAP%Uk$mL94GA4vKoAG%rJosV@i+>L!Ah9 z%3@-Z(?XreWDF1BM<0#yZ;nl;An(bB>Jfr9+~GU3-~VWge{-y=r8=V- z&T_X@OPj$gTBMleu1gAYuosVU3L5AJ8j)yfPqmN`4#)7p-pBiA)XBN(45eV$UpM0> zoBEQQ?V*ONl2f476?{w&Zh8EHo=AdU)|gn;dGWTLTCVsMzC|a)x7-z(*|WjZ;CXcE zG*^dKw^Z})b3LQra?@TU*X-Olgmn4FokQ=RmM`JmMFe^qBG4Vv2>R%dg6G;2S`F1* z?{-$B68{#POc)BSZmQ;iAtV?P!A2Ar42c!vBLq2&Bo&o3T!%CjD_bF}%bq8*XT@WT z%lGE~EKWT^4Ex^Ok7=>LzODvg)}ZQ#9m?-_sBZ1(lHW)Duwy|+Fq|n3hK*@c*-5f& z5WLF6#Mm#5U@ElzmmL^SD&@~?2!yF`!*vVz>sUEZGFx*PL1yCX9atlWoL$VC zZE1PSFEFe2$FFheHW}icrwuv#MAuoZM?;;cTCMAn^L%eq%g8&t4emFp)e&HNtIuqI;7mg@I4EZg(U^3_+UI~q06(d*-SGh^O8dGd@ zvvbK1L=xsjGhU3_=pgtDeM9jweFKV^sT<%VeFMM99C)9X3%&w_iff7hSZAV46tM(< zpAKkFyGJsQOfPH82HCh4BJ>vV+N~HRLt9N{bX(LTwZI7#7 zcYGihsIi%5o93wN+Wlx*Mu7DyEUxiKxzQ(g7m=UzFj{^m(n#qaP z^thbzrL08^`K4HDGO#pYo+8)X<149T|JxH0P$IAz#j3Opc3Kk1)ZW1=3k@E^d*Y zUc(p&iKdzt1C4V_^YFF)hTSl&`1e#?5`)a~`$VmhJA0goSnip_gi@f8Ue>XPSbH>&D{#lVr=_ow9=@uCX4yc{Enr zyCh&l$icBA%tz)pi))PhP84#D_XdTVA6Gk{6t1ZA6(F{aq}!Ocmu=G|)ECrk+&P06 zbE`!(mU}hOL*Byvl`@b*rg2wTTHyrBNSN8F!#*9t}`OA35+gNHt zhlaT1wNsNr)6 z&vz4X;vo*}`R>Gp3oh?A4}~5Xs++Wf$;_e9`k_RmyW`^J^Y9dxnivAb%z}lc*$kGp)kLUH}b#cLJF%MOqOlfkP8M3{sT58=NsB#q5| z2AbzWf@-rYpblCVQtg&S{gO+rin(w**d1+4(7P1a2Ay!j?8?SQ2odw$V(ePh70}^cl~ zM&i)m*cch)#60VhSo{>$?cX~^rVh zWuz+l)j5X}?<6pX_^%q}-C+>yQDlLgOb%a@`<#C->Y6E8R@J|_e^xHMs|GYO_9`uE z@XEd+RxvZ=XBE+2lO5RU9Fv_?L<-DQS&39UDV&Q)IEXV*lz+jte~!dw;Bl9*TWGdSm26Etx|# zDK9DuDni>qcgkO43mG0OVqa_*6S%5e=n8cXiS9Nc*ueWisNk}eF>q;0^Mx^68ZP~@ zBCS>WYeib8G;E{h+oUgB)k~CbT2TW)uUVa^{N0KSoL8-?f(q(E3$eh`g&gm_7Gjr$ z%yCgbfiI;YiZ&FjC?14M>4RuwqsT|W2TPyvNzBv+3$fZVK!C?F4e0g7S$YsUISvGj zuaSMp<0LSrEp~P60_-dLD*K`v_@1(|rOl!3zgBdFHuSAs7OSI2xIR~BpeKqrM1ZF# zs|5pC?*LeRi~vsrdVJR{#1u$-s;n;U;dH^+iLfwjA}2FCN-ouBPZ`xqUOFI;zRoGq z_oO$hN&Ah&uk-Ne<7?9Hk=&Kn1!-Zuvet}Ypr69tIMI*ST2iyYY~eZiuShA*B44Ax z;{<30=Riq41&$Nom?FwUECFf9fz`7r-Jm>g(ztQ;oqa|5Z>oVy$+MKDJzkf#GF>`g z&H#Wn8W!dx&Yc7K<<|wgU&xqXQT9~eItPEDp`7<~ky2;C;vROB4AERLL$`4)F?OE9!lV3l&MBhu~Gxz}i%&wBD+Xf@xOBsOL)!0(pu z@Q!*r>IO`tV~BQPUgo2#XC&o{KEZb>u(&Fb#EFOeRID?!T441HC#e{EQaCBhi-|qF zmc$ZKUz$Jjj6AA<8|zxspCoIFpKP>ZlbMs5_&1_GZhr>XiknH@Az7L;vu=Sgoxth% z!TK1yU)(Pu*{*0fuF3JpCS~|FUdoYxw?pZ$@lgMb?_JxMk^glF6e!PG)!?M^q7{hh n%hG;bH`~DfvK6G~!h33P+9;LSP*0@|%xguylQ?a(tnPmSC~bvB diff --git a/ProfRom_Disasm/prof_roms/rom4_fnt.bin b/ProfRom_Disasm/prof_roms/rom4_fnt.bin deleted file mode 100755 index 918007f0f808cc296627ef8348ed290d71c42846..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcmWO5{cjUx0KoC5bKq@GcY`R!OnL&cMiOZ-#51UzWVqW;9MMVw5v!38vkqwi^rAmbu<_8+Uyf596*U|HAi^uMM1< z&~vTl(m;=Zt*>8>4FN0z<2NI2 zv^I5rCP@Lniy|?IyW^D4O9fP!2(!&KCG7?wolA3h2S62DScTo7zV)DWu(ke$V~9c< zMApGe;2=V-px0RgS&E}tVmp&Zdehd|I7v9c`uCLCT_h$u#~IAL3=YZi?QI^P-%$os}l7c6%R2m4V#MT67*oZp;If~neI9x1LmV`}Z8h{{lv8L+s zlxhEX)9vjVYi{~*k>n+>S=adR7bFNs5bj{KC(S|&D(U}x1l&$m(g%P}20Tey0t{e^ zj_(ic6J4gjWniWB0%%Agr{%y{XELVdo;Fn4yc2WpHYK!1j+8(EUj3LGE4Y4l(zeLG4l{;4ZEFd83|=1Aiq z0qFkYW(JhpmE9N1m{6@kc4f4Tg7#ek$P9CjXW3v;L1<8cx^JGKomfsnsDO~P0|?1n zz)vjpW#jps8UOcLD)YD=Ecu-ZxZ{+-(!Z)kk^JNXrazYSnNEc<{lwge>8?1Hub8qy z7)=XhMO!P@EPsErW=$WcS?_mNf0}wpJ5!Y3Se2=!yoxclvTf3bMg1wgQzr^`ZK_!# z4NEEN6F@OmPwDD@t#RT$?=;!$y1^YSUw`}P`Fw#aZoA>AwG(+yJ19Iav`K9pGSHtj ztdZpP(GdIPB$XBi<24m_c)b+0@1|jU+Ycx0F_9lttRr4`(AxIOH+x1si+j&bc-&S; zyjJDxb7P;|6t&rLZ03Afb!<=6v2WG*TQCtN|9fsaHX|io@1BFXfSnO${QU_j-zvD!Ae<*$vGTFKYQB-pRbAIt308Ak^N!D+lA JF2leD!2f*pt^EK1 diff --git a/ProfRom_Disasm/prof_roms/rom4_vars.bin b/ProfRom_Disasm/prof_roms/rom4_vars.bin deleted file mode 100755 index 2d9e35f8b2ea5f6b510997367b03a207fdab34e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmdTs&l4NFJWMJpz;^AP(W?+*xl=fj@W?+&w zVt@is1_lmB1u#cU!Ge{6flUj<6JuafuwVi4ZiD0m*aX0Gq98e51`eo7kQ|!;tAHg) zr2t3{Xc|}_hXRBrp`ghQGZSd4f*}%*kH*nr&nhWZ2b59B|v|7`sK u;Q!D64Gs+o4FU<~kUjXxk+ z5xn;t+O*PyOWDL9{lgln7SVNa|Jcf;FeQXQ+$bZ!+EQ9?i5N^Bv+5Ag!b;-Zz*Qy&A9hTcxxYZmG4q~< zlZUEHbTtdsamBCRtSvDL0Zm%X(vySAecM50njF_(6RMS8<}Fe!pXooztO!>X4&-e& zM)KcQf7hyeyL0Ymm->V`i7mQPRU`%Xj>h@6P&qd-HWqJttID`4@7|jxycbWtsLLqP z=V!i2{=Qx`ytQihK*;vQ(T@ifkB1nQ88EJWaq-{wWh8R{Q2Ry4;=k_egTm}<8Fy&# zdB*UX@z5+;e`@x7GW{gDwCd0 zGphiew*xG+FSI{z7wuMiHJvpS5$Q>^KXt5uXudJmGmk)A2lZ5!hgY~lkiN9>99Kw< zRQ*$C`l%A_bW!icGLf--)e!$ib7oENNT=@@yU3b5#&h`>)p$IA!|m#GVLCvD@``jt z78Uxup~g=A)d0-;SKWtuhfEE8b{RWgz_@`oJS<>4!u6 z2m>JX80^0eP4M8j$4ng_5DSv+xA=qVuvKB_UZym`-%n?O-oOIv^pp-+hvpAGG4!NB z#N?^1;_3Hxh~Z!C67hX6`BNeUi6D~*XcB%cdq16+Yr;W3ps?`D50bGyktEx@*$iN2 z!9~^b>26DEx7cqv+rXc2756uYkt>I<>|p+wPCE2oC!2N2wlk-TGW=DL?~#XJ za9f#{4@->0aTlMj&?EoG4DByCRKR3ztKYWTh9w&oA>vBE+Zl8(-RyJG1vdvhEuLUI z#kaWq0gty8%a#b1HhL~uxd_XaFMqC-l1jw2p2lXUy9L*HTU~xtv3{KqtoT|1>Jshxr6S;pxZ_N4~K>hBX=`z66^WQ^2k1_=$3LIGDaQ+7&ZcHh z0O{in_}q;iXA8Prp5RR6KEHRr$K`fmla~hI2?YI~ouL_yGk`v)KZxEY+}P;#`(}i< zZA43X#eh!zu1#fF8U~}$SVlpAFZo+nN2%DYzX;!W6xG&@m%oqzGwchC6 zyVu!NDlALNU;qYeM*t>a5=ppTYQrbPDKbLo2uWdSxJ|0Z zQl%aZK1mtDk_!-?gsZq&xr#Ph^T6l;j(~5eAor%OLKuCMSVvw~Cw*WD3zGub(t(ai zhp=6#lA3Knr3x#}f>kGNpasYAR5WEvNf3#k6o~*xQE4PfI7O1=J_#-; z*hk34BT;EoiZWXj2@JLcLaF0|>Ts|JItWTK%;|{4Mj}8|bTGM!kB~5N$jt5zM+Aw$ zg`?3F^K>{Rk0R-C$fFS=C@E5llHx!Ddeuj;p8QzKB=5p5l`0(O`yh+-fJ2o4&K>c^ zVo@2})JTeqs-qEbF!QNlStci-mFmk1-Jtu?ZXgrNbkj-2_55B|(Vpq$yp z{tCL7s3NeRviC_LvkwIgry?+YL;wr>8%5@soJq@%HfIKcVBO diff --git a/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin b/ProfRom_Disasm/prof_roms/rom6_ROMdisk.bin deleted file mode 100755 index 460760d07cbb2d46bfefd4d39eff5aa3b1cc4493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 zcmYkC2~-p3`v2d_GD%pHNdjTQI+Fl~pcqm_%!P=E($*>{E>&==fU;x<*^!wf1O)eL z?W$ew|F*qtv8|TcMWGZ+nvS>j7He#$HMQZ_UOKI`;!gMv{oV6F|MQ-Q_izpgnaMlP z^L;+wXYk=`4}%hp_QjHIC7mTFO9o3umKQfuTdI(I>Y)zxz-TB;b0?(0B09jM`_vu! zvMM$Db0`vv?gyJ(hO(+$AajRMY^)!|?nD0-5@HdCO;rP$kv!1chn^217|)2IZ-k^k z=;olWgk%75%FyS)wx`jTq&F+Io2r61h*52-nxG0Qsqc2;=PQAT2mooHR{>%WJ&=Z1 zp?+)*Ij2geJ`}<*xnJb&XlAaxQ^W0_T`bxVF>8qwNv!oR`n`% zhq}r#Nn7YtU<4S)ct`(M6`e-Ekw&MDKwuj!8iIu*bO-ni(CQ^(;G5%`Y{35w0lN$T8zOcO1NnbNIJ?hA1RIh64Kce* zz_z~vVfWdPvLX9#$k{y#bp935>^>U`He&u8D7!1c$-g3&-De|?jrjjY0=p-I!P#&H zN5=es=ca>VCBoT%;69bO>(ioLA)xGwjSd~DMz-Xi0kZ$smp zCQWuor-=^fHSwV(SBi|GZ$n8ZegjRTzTdrAq}!;wVif0xzplSxsMs}MU$M)`@#4?! z3W-NU*k~wn6b6@d#i9=HRy<#woRT_6llJi6-|EmVE(fjcTlUOL&&!zmHx=n-(wTV|RW-{v9eT_U*)kE$@ytuZ*LA zSs6k95`=_6bUi3CVz40n9L7QJ@d6!`rdpJ z+c>n9J2Ai%_;CPMF7xa7KzJC9hVO1(tMoIE`jNY7ex}Bc@!gkN-oikl%rI;G zAnQf0?soMyx@};vEyTTo@!CT_U%~%}>lGSd;TVbujeH<*%@-PZKO}{?3W*F4rxit$i`5zp|>2j1y2LrIss6D41MD80mof|Yhq6U0tiTa!Z zJ{B3Ffp~ssItfRBpT_6bQ2T3;`wBJpC)dCzy&z@yg)E5f;P^2Cy?{e!LxWrWVz9Bp z&s4*En2mlJB081CZ1=0>k=QR@V`->#)CdMXJy~fi)qhrF1Y&5ow!-jPO{j3x@I}qQ zrz4fdLQLsFgV$A}+5qo(*AyL`4*Gd7x`b0gKm0>iK$TcKDdasw`lor>#3U~lz6oFB zx4VE80Nx30$`qps;p&7 z*VQhkTr@tv2KkoM;2?Rv7V-Cb6*6u`W!3hEy87@vUB;P#PcaiO_E`)yKy?F}DQblY`r#habn8K` z=4WcLIj49EQU3GO9MdF?e^>`A>2mio4j0F;HbFAct{5eb$F#jitC3I8{f7P40nL6xc~uC@@q~0=!F7hsRhQwMKSGhZ zKlDm_u|a7azyyX9*1WShG?k+}a6TzVNWEpFU=#XGQqBhyVn=VSerk8o+q)mDx2GvCrSeD3y938)(?%;Z*JU}av>kGYHC~*@vNnOHK&ne)}nY)fVSHFP|C9dRS znK1$=aj6JOJYO0HB`ynx5(~vp;u-`>TrYzXACp6gtD+%fbu^M#B*!uphUA*uajrhO zX85cFAK%?EzY(3nzoQ9^Mdn>NAT3ZG%errga11)HM2a87jMsBr%b$jvGECU)Ye#SB^dbMw>jcT>^ z5C32>9Jhe^yaEsUxna^Up+X{@n;t1CLH1(NrImG+JL<8Fl4#MxJ>nvi zufJ*$Hw}3XSW-cn^y|l!aF|VvJn+ih?D4!I`#1T$RcbB0h=*`6_aN=vQ#05nH5x>#JtkH--F`52g~FK$a5|;1f4fz^s{o&N+2I zDG@ISu&U)f61~hbx#7qGjK{N(MI#G-d4XB+y|ww2hNlci?+gX$fDzU|ZqskJO^uA< z>uupqm?qTHZx+aHm zksDrUwNpHUq6%VV<_gzo+rS`av%6XUoK4Fy?=6$sm=!0i*+3cn5pf6FO`>g(g&&U( zNS`Gh=W~#B@K0oZNk4wn%~R%~ce$~B17b`%Go#^&#d10Hmiq#{Gh<%#b4~!1h$((6 zk+Q9`8_T0Uv<=ro<1;&s-@X>?VmR4m1_JUJLf9Lob;>9QCXLvI_T0k(m=rq z_kct7yaSr{Fe|QFU?3VwbNL=X5s-J^8Ap&gIlBTLa?|a{odW{ZVqO$>z2SG^}EuyA(1(fHyI@F;8EIhHD zP!GvnC||8k+ z?huCY=xmOTcbcRdL0B(0gU;rs(AhB1f~R{M1a!U7@Vy1?O;rMeyF|Aj;CSvVK4# z!cFygyasY}y*PoNMB?or+9|<3>`xJX2#X`0MdFkRk|C!F!dguUtFYtq_8c1Z0H||n%n$EC;yM3% zWkU@X>8H1Z)9WLYy8nqlfAU|NaH#ESn|ktAXQO%oKW@q5XTT?jK@s06y;U1=dcRO6 zM;^c;{8nxD){!6-D1PAPXzm7vB%yz#gv6M{D0)A8tL9oZ#!JuMieBMkTps!ruTgE} zyszP8Z$&P!>X*PciSTKse(7$}6KTI|qq;*IHJPDRnt9q-;`gxFy~car{*a`LOUn5X zbvUE3Z$+PVUj{i}heWzBg>}S6_CBwwnSUU((W`)>5&r6i>Ux9^Km-!D&rr6p(y_U0 zm1Q$fARy6IWIuf_ zAKC?f?WB_J@I}Gvd$H2W?e-nJs?9rNHt#oJPq4kRy&0>oY^ujVsr=ZXZ<|#=H8BoX z3odS>t~cR}F__%Z3?e*IaBU2aY(y9KoWkF5h(*k)z_tV@KHh}PC!(;3u!s9R&8nVe zRc|x1;!j)DJrC^z%Risn1Uq}LNug_y9%N(8DMj^Ou_Q5-IhBZtVSpUi5<#zzH1srU zJ&cS*c(J5_J+%ro}B`o0?#{{vc2FNvadNZlX!Y@oa?d8YyCo^XYFSH z=`)(e@LfqNv5AfTq&dWa`5N~D{|06SW^}%Ns)bkD_cIrb@iQxWnqlCFM;Xj8yL2>*@}pr7`BR+Lx4}`5!lGQd{I7P6_;S!GB04( zB}mfCrS&ZNsK6fERAR4mI7)Zf8_c!XBPMH|rJ{13xz=oHG%x#lX-njz+;(CO8%rGR zj&^lB5%W+xk;MKk=C*qT#w9wAagC#$T;r7;Q1v7y=9C9LYFZt zI3<3%n_8Qc!=+MM#OnPcU!=59plk@6n4~ymB}yRkV1EX@cy3EnS=YYiDVF%4pSeew zR#yx6dsoZ`dv)~1jFl%V?RJYDtEk*v%_5zWHLEbJY)xgoy?Jxlk|!+o`puGMGCy+g z82)0*0xX95ypjb%{7e8AdPA5oCgODh;=b5zRIs>;@>WPcbQV+s?)&mO@^p*54#30? zXxyz}N;g$u*N9BrweUHvVQ)n+CWl zq{52?$ht@%yo=otx-VHOz|G;OJMT6vwtypE1t+ZVFW{5`6dX}0OQXPlo&{Kiy?S@0 zp=`#GAGj;)yN&G*;Q<*}lPs_UCEY<;EOfjHfn89IH_6Myz-mZo8u zixy?g1AJm3cUN!qj$PX;>#!9Ta|L+U*<881G@%=o#`9n)Hym*Lq`Yt`p9dk_P1V+T zKZ%(I?;SEA5fD^wDS-+s^^kSvIxFD!RctUr0%^QRAmv5??g1$;Ldq9G7}jX9*J3NV z%X0zuePC`E3UW)dd#U6%n7Lb^n&#t9+u`BBy|Ym_z7x(U2P ztP$>ZZLh!_dT!5-?e*L1EISdNb@Mhiv0e#vSsLoC4fRXot#0d^T@V60Dj!Su#JRn$ zE^nMf;B8Mi`3ZCt>c`bUu$KHK%{+d9lqsk zT1Rh%i+ml-NsVYI{Y^2K6=r$ZkNVe4d9uIg14Y+}QL47W7_NsmQ@H5bYkmP-EP$%W%VN-wQxS*MKHI4pp+0 zNBcd}>@)<*L7Nl*%mP$I5Xg^BD1DV0PKHFKH8Z7VtM$>L%&GDboc zU_AI67Zp(Vt<-u;Kb2+1vymDi4{AIx%rW&(&7z(X>twD*B#j}ANLOZfuZnN>ol|d7 zuUB^zc^8~fUj2t{P8DNR=_aNu_t*qQU-Wr^O zhRCcAFuoW4MuX`xbSY^7x(=1Q2XN3i3T=1GnNpP*s&+!`;kxa#c&Ct+kh}{L1LhPC zf?ceB$3LpY1jKnv;GSgF(j0(#j8bTN57R6S<7|JHIr-xuv(NtN*JfWE_D60=hC#WZ z=vhoKg3ak0N*zSM^?mTDR$voxilM{Ztpgf}JH-@0|MV;o!%Ugh435ak58o_TnXQw0 z*rpN8`@?I_kfcCYK%HlnCwYS-;4CuF3BmdK^GNpZ*EyklkpDQg=J-&6ZEC&Rl$!oC zZEPDLm7)}GNtA!e=7lJP&+_50z34yja7+r3Mg_!mQ>SY$1*8j(Y-Ba*&qcP98|vzCnW5A} z3T(2%J`JP}wiUUXbWmyhLZk%g#@Z)~z)qKkU@T4Dx=>8X%_mE28D>rSTPS zOtU%<6H*V`sU3FBooRE-bQL2T35Lj+EqDrEcXbOtku*Qv^6S&U7u@b z%3zz4|C}2a+V(d_|HG43qteu%(&%@{zu7@D@-(p)Jnf|V?7AHH=`)}7+8)|s8;n}j z1py#p*6<&44wqV=h;tRPBt_=t5QnF?h^N;}{^~BhT7%t?Yv)e@C+KOomvT?{Vid{p zwO5^*8VKYOBB`d&Ysj)Qg&MY)FR=4kvdle9S&lvRB-=p4Huth(E&CaMIv_9@>}PdQ z@rYre-I96|EbQ8<=wwc{LhDO%2{`I?*QEgrW{<%FyY6t*txVBqOTWmjT4=|%l9~jtfn*A~dk$-O(OZo?ru3pif5Ac3Ik5ZOeV~mT7`48f|1!z; zZLg5U%aEhIjn;#@gB;t@AdP?Qpqd>48b9eUN~wL0QKKA#XT>@ZlQNH_f8o7)h&2M* z&wg3VIw?;&n1ZR`lIX<{N{ZpakZXZGFjzhkk^)_SuAcwo{xvy5DR>0}5vWqBh=9Wm=J3Xb&@g3sdYf83a3?s#HqB%F0goZG zhG~YAqSx?CT=_~kf_H=H2lC|C2wHIKSYT*GaerisI(F7Y5e?09=t(*lbuQY|H)Nb) z3UYP#L&7Wlpc&3~UtpQWBpTcIbGac{&hiO?cD#H@O|}n26R#E<{!@Nd!_5FYRVlTh zp{-EVU{ekZ$vYo6&gexAP5S7DW_?0KE4p$2&GN+j&=MUNhPECVS-tGJZUw@u9$6~p z<8!$sEI1#U^#+ibLqn0sMK8;5Rp)C}AJwW=n&{`zmyWKhopl*ziOH;+zygjKI-3h3 z2p))V@_}~-{Qv8B;KUQ^V~MaI5A-@x2UTSb%4MQFj;np}#9lycw@`QORGN*I%Q;(u z{y>pmr|6z)Kdq5X1}`BfYx1R%=x;#Nh31a=F9k(M5BRafN&ov(ek{g6Nxf>tvYdDA z{``mC3iNF46S@s`g3h(csY&BjwNPSQz^q{x9 zSSH3Ak2<+$0{suovS9A$v8ek-sYn-Tl#6siW0Xk8HO7dTg0y2#jRe!uRu-m-hC~n; z6iNT6V__ftOQ{z;Kc)S%&M0|h=cIQ^d$$g~IiF)n$xQEj(olIZuM#NH|Vk2>j}b=d%l2y^^>BtX4Wrz*9m)>%{=EUJwb)oP2X z%%a+C>DOo0~y^b z3n!@0OhcEjMAqa1J9Lk+hx}3ZEDfE|$w>4kwq4T_L1Z^(0gsTvTQ}(4VLc<|S(64045Yt(O}>HHJ{#cqeuX z5%lZ{K^o>(r#=J~A9|+_>I6ZiAm_UPw828%u>jaLK`pdOlPTaFnJTiboh_S(41d(U zuMrxdoL`MI=+BcwUg-?6ReDyu3pzoTnxscucUtv-AVFdg4v6c}6{2NzB(|UQ6~vdj zAr0qNCz1f3TJj5c*X7%zi36B3W_*t>hP~dmoJ>Igt_5$B3$3b5A}Ebp)QBhqi!@2brdQ%|hOEF}X$py7zX;saw-BNN-IJ3drnvW^ch zv5dDjNIhhlu%|oJmm*(xeuzl{N<`{VLWH5jC0QE#EvNAE2n2~nE)&;F$}{_Pal}LU zaYUQyJUKMU32@cYhcowj7VGMQ6aB@RuM)D=Ysu0HR+sz-T6cI{yV{~w`zq2kf?61SL7jeDnw9yvJD?LnrP9wyG!nl_Xz;ntJC;fA7Q!o; zOQN^AvF^4rpMPMJKhdpyP^VTssGErUUHz0@?hNR{kw@5Df;{Fb4{FyTW}r)agOKD8 zIXg8=ISWbjs$69?bMirkF3&YYU9oY0b2CfJEF-$(GLH2bj-%i^_H>k4#J{<!a+>-vYy&CUlZZU zKN6*?v)wS4Hgo7IuH0fx;D^gD@1xbMKllS3nD9=G1m!6Bz!@+KB`@!b^hNukm=#+r zV!*bZk0Fwi?C8bqBEvSz8H-`7rL!m`%!#-xENZ7VIO?`Hp*Pz3`-mp~eljowF9s?n z3pc<#kQjEB{IfT`!qcv1`EuxDc z!nP3_$yHMI0haE;YFSs}p%IHga#NDGsa;&_>`;e;^j>CZuS0*y5%GoJ0UjldAiVU2 z@Y;o5*8XKy^g8;Pf<$y>q39w=!0x3TNIL+}AT9AP^zw9fjTP@>5FbxRc}G*{H(d@( z*4@8gu(Yv5JMFV3o?VhPUwI%!rvpMEFpBi^t@x95Nw2v&A=O%5!ahv(p(z!pzOwe~ zF>6wgkfs-R4@#lI254q+c&RgwZ72YlY6Wr^#9N##Io(aYP{*uTYYK95dUFtV9D_=- z;t)V!*L-VM0Eh`K$Z&%}mRlxmWr>1N3N3Vru0C3`#DFgnce{seHI7}9kBC~yzq`O+ zj<{fDufJb^u}m+P}@b^ivUwEGI3({G899<^5wEpTJL5r0tJBy&0aIgvtvV1Ptzf-gz*e~^A+ z42mHyl|o;U8e_z69xN7vCJR{;X0bs84tF>n9BikN9miOcq^)HS=rr&Ff_<^L=;Ha}vqR~V^=q}1pF3h5bi%XsO<0;`_&x*f6?36!|i@d&YnPj8(2vAtv3(a)KT~HDo~{su{q6p9 zI=09Vez1l}k4-21+j_eF&HhGzlV1&*K|YC+`KN)A%qc|-uAG&c70@8wEj{Zzt%0SV zcA?++PWwK>?9!L;^T=k`^>+V+&Wr6LCXn;aR(}9|*VW>09A0j=dJdrHrh{}4*Rf#6 z4naKG_dVLRCTJ!k3Jyt^s$yh&#fykE>=Mx-UfL}Mjmj+>#>Q-yISogoI=k|^QSkQ+ zkh{H>pAbrQ z_efux?AI=%6ysdr$o_?D36lG+{+|3S!I7VJ(}C%Lm)A~W@)(7%n0v!z1eb-p=w388 zIN?+KWO>+K?l(k-HpIQ^E;h`!5*W^l>n<9M@pL*F5lrpU`!D?5GG{4@jhlXp+y)9?#&?>e-~)CLW@L=&F$adE;6uu5!k3w(M$?!Se9Qujl2|hTV-V{KNb}EH zqny&tvmnFOuTQWozbS5a4yp)6QT8T5xtQz-yeZnYAE}z5l!C&91KMzbLxm z-((8LUH!B?D|qYJZ6M<&M`zE;Sya>d*z@KjkxU)MHVu$U9TlCua97VW-{$gV^1>02 zPI4fSur2z{uvP&a2Y(o`f-4e)i^4?$g+K`NVFAp~7ARuE!(d@pI3JGY!7=C>Z&?u+n{-e z4^5{}rz1ZI(%pd8-Z3F|WqqGIwKKgV%aSHV2qiCfpBVAUeKKFXFCh|}%Fl7Dr`5>U z$uj2%48)T?jHQ^_nH!xp3)k-G#^reXIUTVT1-hvIU$OA++`X5-JCzy zrDXkeOzy!`Eeq~_Y!N*hcG{H+G;(gVQ`wQr-_Mmoh0j#gq8y_rO-;31X*GJukYF1a zEiys^WSaAD=X;H6&dnZgux&hFAh;mszbD+|QvGDn@}AVRlfmhQbmZ5w13jeB3X*eN z>L~f`>&B{Vn3z6)PqaZ7t#&ahMExRa#Drggwp1Go;KPdyMcy=faLH5)wnOnJn-^ z_2SRN=j}@gUKX-bu*`~h8;>ur@)Jqq9>>ymhBfi&dWcp}2I?RQk&57CXR%dnRTItO z4kw3J!zh_x6LGoIY+wJk-O}Bn*44X3v3P7fIkT9@(v~jcpq{jPW4+L`&f$1Fet<2H zwgXEJ;Jw}cIA4o@a5&YPnt6sdLZn$!XXh9-?@P}1vU50(w}yneQhyxCIV$&KMZqzq z^k)aH9zN&@jB$h8s$=DzoOgm7OXAYN?Y&U`Sy2Z*{gJXu6}=Y%ABghK1$2ieIcLc9 zAuQui&Sx7-0)DxlR*t0w*-2g@2bb#ksid+)W+Xe$s*FgCGYA#Lf6)`160!4X1?=43 zModi_J}yxclMz3&lP+(&#{7W^vEDi1zZ0iR9Cn{*SeF`+P)u%t!m^Jj=`9>OomSnj zKe0tS#kt%h3?@wHvgC;j!<&N!irvwa)K$nYnO6>KfHTi z0Gj?`T14Hl=uov92*{kfxw6}_2Ksex0P(D1_)Eakh5QSzI)fbZ{7FSy8pa&*IV7+ zI{WPJxA*sbdw*-~Z-09?lPp8=oV^(??y5w7U?CT{RA8qbK<$gSwzztJO6%clR0|EX zYShao5*?<}TsNTsw8WB(Onr;)6=$&jB@TtR@L~D=FS7JLCOt104G^sX0UAOt;LyS~ z`deRQA>XNQoepH32ne`!A}i#0cGJv>EQ66^hX!Z-VZMRrJ|t$E6F$qiNd%y{LB}%Yktf zg86E`qeRP9#O+l#XS$tw`L`P<)gxYBlO+aYtCzQCYm_(0>KFFc`K&OAf`bt!QLt;? zIpm247j0R%OKo$0*;2Bd;*-t`sb;Yo+!qQqp8#dIZ-Oj3X#NFky%-qQ*d5v z^v}qoC7`Li1T;yOfX1dJsC#pH3F>#>@=HJ$`z0u3C`pr55F{gzYT+-**v;8pqT`>U zB_Zq88=4hKykt#xn1rcFQKY1$pi)Iji4<@_nx7gCoyT6_QF4^3kbB=$f0v_>)8y)t z*;&I1IZBC=tH}|C+<_INjvk&IB^B~`E1K<>z>_Nyc>9CjK-+1}Sw_W{7Zmvv%~ovD z=hmpQfgE@uTI_8VfHJ=)K26($y#6XFZZ zuMgzA+65O1*li0~B_jKFKu3KRMxdjdmpJ=tBfSD=yZPNd-Tz$hQy?=?U55F;e<&b; zwbf;k5+5~v4)KbDnXKH7yEo;5?O@TNqHxB`lU z7=ZIXFE%s+z&3#`MFt&XAPFg(0eCeTfMvv$py4N3I%%qFO#mC*YX!d>Gv0m zqxqcsf}i+r<9L6L27f*N|C)p5gO{r$;vo1<6+T?ym@E{4Q3~A||43VDE*NYK5Bhyo z(3e$)NYmi-+!I4FXkv@khl%}_Ru&nF_)zNj{YDqk>|$sJ2pv)lBL0|x5JQSxDe*Sv z`?JH6gnb|T9yff9w^cAM_SSsSa(Q|j|KOu(U*C@;SkRRu*e_rw7q4>!QJ&cOs)|%; z5vu(Y5|ZNEO8}KC{*m#~($@#AJS(|qm4DQhgx9ano#;bv zmv7qgM)cifC7m|6vY*xWF0CuSVRNs#X-8VrM~;vB!-Sn%iO6lmGU*K`EN9lI&@9GmJJIy*%SVbDT!hi{$?*{y-w2KZAE z`|<|}CL5kj_qAXoB3>ymPA&uKD+(cZeVLC5s)oG$7|i<;sIlA%)D#b}`?oD(!U65* zx!ggHeFS@J$j^g)OUcuCjOKrp>vv(!wh-&^?Y56&mOzi)Ka7sBKN+!)m7W@&I|YG@ z@ou}pDA} zZJ9mSL!ey(xOSZQp889N#$+H`CoSI-lJe0&CrMa2gO&fSjNr_0q`khRJdk=7iDaZs z6|kmy;FMrc(=4Wmpol*$D#o4^Lv7);g6^WLa@d~S(Sc!|oe)p@<{MBtX&{Yh_etMC zHxjya9V;c>yU53-{6%;=dd6ZU`C{JhEr#4HlydzH&^BFj4khds>{UVlB4ne<0r*d7 zxu7q$G0&d+3TX>l+2_X@zWC6xTVv7lVO6`)d{AFHKD!#oXD#V_8AW^}w6QtEE5WHD z)sT$?2{^F&##<7~?E*4n%|*-2kl@)LEH{eA1pv$nQ#A*4M5`7qDs2o()d+T5G{KXS zg=E++ON(}ork|YrLTBm6ikqT4?`bX5aLgj&Tg?SwFv*?^FeeW-8vuqgJDg-Qz`O9X zIr7-sV7YKK7Yc=djV#MiDy?&1>JzT+lPM)gZE)I0|II#IUt;2NKUgRR`P=h%?qnZZ z0i=7BH}^;ZSel(}vu7*?x$w@t#2s-vfKw{d$)1(Vl4lVYgkJ-&D$)=7MYdxtwG9!z z833fGPdS|dy=r(n;}2LDok^ejF*7oYM`R^WOvnk-Sd8-RVX?J}9l=Tt|uVsmsXdq;d$e7x^! zuwa3=_mb}ch~69o6K_6&8T+(}iTj>YAlM^|PmS9S_JHiAP!zcux;ZDRR9k#s%jNm` zMQPvMTp_6AE(DJB&=JwuA6vME&P)IzHu6=nJuuaC?GD)*072l!z0n(`j9)-x#M>&A zM^ipgMJS^i))uuYnWJNS68HAnRA5b1@m4Yp;h@x|^^mMvQ{Tq(&H*M7;9^ri7HXkkl(ISQ(Vw z;$PB2*_NPcGDkwIU3uSDQAom;`=C<7G3ReQDDj%r+Voc=_DLX5J5}L-xJ9HA&H;Sd ziU~hxdAGH3J;b;%M?y{njLC z7?w2pT(`gbgz$D;XK z^CU0`=`ppCRf|rF#m(i&%M8|+ql;_{IJS<0fzgzMY!ih8v}Er0_pyR0b_(>;$_{%# z42(#m_@l}>i$B$rB;>DbI&pZyLarpVds=~)Ah?RsRzq=r9g}SIv;3?p{_S-IHRDa9V;g);PO$hhf@i59s#&gCdR}5k2AI#cjA%x#F{-$&BQ4b?L%Id3gw$?fB^!2Ws`fuK? zhRnixtiHbEcd*`lOFiveJspB0jD`lcLk*C9p#dxWV@nbI8M|wi->ShMzgMkW-x)q` zb5j$8_ST0Jc~YlNzqDP~U%UN_Y@^Su8^b+1Xg z;#~Dm25lUlx^F!7*>1DaaiQ{_lz0d6JsbzCjmw|H4K>>Y5DIUlHVgE^n=@Y<1idxo zjfPxc52VacLtmP5!cQ$pi)p~GkoAUcr%i2zd9~9qZEu83Z*Tk8Pset(-HI{2-4w0#W>0QpqICJJ7T-ozhaVjpZy){+8xRm{xpAyzH{^3%KIPI8E4w#^j;RcsxG{hz>BImgQ4#iQ%mw&P zv)HoJBe366RNc#&!L)c1`hZFbbVF6uIH-e+h+;?Dz{E$=Q4weI!B8sH{AXIT4qO%m z6IxU4c=<7%`C!1O@KOnbY2pcx2f%0gpRoD!FNMc3t_I*E-DvHhp}XAoC##F;x(Ew( zE|_0mZOE#x@zrH#WG_WbIk{a>yh(LSiH zcx}tXo5}9TIK=R0HTdFM9PZKJO?BF@>KxJI?ernRy6SKSw^<|}6KVWyNL?@9+c25u z&NP&PhfGUuq(%8iYpt8lTsL?c)&lp>n>x)_>I%!%pDbWC89o@y9wZ~|zXbncUrQPD zi>)7|{JU8>J9HiYx(5G#QuX{(OR_m~0P#SGdr;tzq=r^BXpVzy1cHR=)(V3xz4n#JZH zy&Ny4JvE~9#F;`46x&JIKvY$WM0Wl}%6;L7IQa0xLD8Ivp+hFu!BLSN!~2@+VobnL zM*TUFSck-zdK<{$xiva2eq^)6s;n2&j}hh{r%aD+?9EG_Cd*`^hm0)3e(Ba9;iMzF zrR@61f~{Pr(c5Dun=qVmRMNa^LT{D_SCeD9FR?axuhuWW4kMOp z(@_wzXyj;9+p(iR=()=s5lwZRS)?=iU$qzNzUbnb^YJ2M&66jF8j1J%dd!@kq!aSK zB0jw}acwJx&1nN*JsIEi`B8G?XxCXXvdeeVhh%hDA~_o;=8y?pz9YXO-|TusnzwY_ k`w*L5h3{z~upPJDQvUAy)?dBF{N2*O3jFGUe<%<92T;*R#Q*>R diff --git a/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin b/ProfRom_Disasm/prof_roms/rom7_data4CRC.bin deleted file mode 100755 index f4e2f89a5b33f9fc6c1f9a8a97ec873ca76e7c38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{I003i@UAY(9uK&4Q|VCQfMfhmznp=+^>!L8BG;qUP=5)cA&GEyS7Qj|jX za@JxwlNf`0vs$CQ)11Tq^WNiPBttYH1OXK0WXE)*M1@pprAxIag$b4J<96@niD{V%sVlklTGUFndX{Q&8c+%|Iua`V+uX~)`=0B0n^=oGyBe#eY=?a0OvPLx zECW1X3_%>O?T`KJ&CT5^tqZ+qjY*xCeztDaUi3~AJ~A#*9&iqy|Gw|t-~7)TzdEm3 zpLmamk*R^ovFo7>(JjGF@o(XP5TO9VFykNuP$fV{aA#n-gP4>1quR4Q!yMCp<6iTz z0+15(BGNK7LKISWVpekMwacZbm5GIJ^-tw2)eXhsG{YpI6oCY0bVp<)R0Txar~0>< zhq#wt=YIDc$2`~5Ch|6s2Cx=aW_ETJMl@DT*=@-V`7i0nndym&xvQx}SY=2CcqeGU z7~u$lIHM?i%Us((>mK|0i`bjHtD3uYN>o}mY8HC&3eXy}Dv~-b{SWPI-A&D^y^F2r zoym_%s&wSsTue!h4kNBS#ZZ>{ZPIO+AF0ww+4)7kp CQ~v<~ diff --git a/ProfRom_Disasm/rom0.a80 b/ProfRom_Disasm/rom0.a80 deleted file mode 100755 index 7146488..0000000 --- a/ProfRom_Disasm/rom0.a80 +++ /dev/null @@ -1,10229 +0,0 @@ - DEVICE ZXSPECTRUM128 -; INCLUDE "!AllConst.asm" -; INCLUDE "!ram8.asm" - ORG #0000 - -x5B00 equ #5B00 ; п/п переключения страниц rom0/1 (=x006B) -x5B14 equ #5B14 ; п/п возврата из basic48 (=x007F) -x5B1D equ #5B1D ; п/п on error -x5B2F equ #5B2F ; п/п ввода rs232 -x5B34 equ #5B34 ; п/п вывода rs232 -x5B4A equ #5B4A ; п/п включения предыдущего rom bacic48/128 (=x00B5) - ; rs232 вывод символов -x5B58 equ #5B58 ;2 адрес вызываемой п/п из basic48 -x5B5A equ #5B5A ;2 адрес возврата в basic128 -x5B5C equ #5B5C ;1 содержимое порта #7FFD -x5B5D equ #5B5D ;1 =#CF rst 8 -x5B5E equ #5B5E ;1 код ошибки для rst 8 basic48 -x5B5F equ #5B5F ;2 rs232 битный период -x5B61 equ #5B61 ;2 флаг состояния второго принимаемого символа и данные -x5B63 equ #5B63 ;1 текущая колонка -x5B64 equ #5B64 ;1 ширина печатной страницы -x5B65 equ #5B65 ;1 номер параметра ожидаемого rs232 -x5B66 equ #5B66 ;1 флаги -x5B67 equ #5B67 ;10 имя файла -x5B71 equ #5B71 ;1 тип файла -x5B72 equ #5B72 ;2 длина блока -x5B74 equ #5B74 ;2 начальный адрес блока -x5B76 equ #5B76 ;2 длина программы -x5B78 equ #5B78 ;2 номер строки -x5B7A equ #5B7A ;1 тип файла -x5B7B equ #5B7B ;??? -x5B7E equ #5B7E ;??? 2 длина блока -x5B7F equ #5B7F ;2 длина программы -x5B81 equ #5B81 ;2 старый SP при использовании TSTACK -x5B83 equ #5B83 ;2 поинтер свободногоместа в directory -x5B85 equ #5B85 ;3 количество свободный байт -x5B88 equ #5B88 ;1 -x5B89 equ #5B89 ;1 -x5B8A equ #5B8A ;1 -x5B8B equ #5B8B ;2 возврат адреса для on err 32768 -x5B8D equ #5B8D ;5 последняя длина, выводимая при вычислениях -x5B92 equ #5B92 ;2 номер строки для renumber -x5B94 equ #5B94 ;2 новый номер строки начала при перенумерации -x5B96 equ #5B96 ;2 приращение номера строки для перенумерации -x5B98 equ #5B98 ;8 STRIP1 -x5BA0 equ #5BA0 ;8 STRIP2 -x5BA8 equ #5BA8 ;стэк -x5BFF equ #5BFF ;вершина стэка - -;Ram7. -;#EC0C - 1 номер текущей опции меню basic128 -;#EC0D - 1 флаги -; 1,=1 текущее меню: основное меню basic128 -;#EC0E - 1 ??? -;#EC0F - 2 постоянные атрибуты экрана для 128 TR-DOS -;#EC11 - 2 временные атрибуты экрана для 128 TR-DOS -;#EC13 - 1 параметры вывода на экран для 128 TR-DOS -;#F6EC - 2 адрес списка опций меню - -Rom1.x0010 equ #0010 ;печать символа из A -Rom1.x0013 equ #0013 ;адрес с байтом #FF в rom 1 -Rom1.x0018 equ #0018 ;чтение очередного символа строки программы -Rom1.x0020 equ #0020 ;чтение следующего символа строки программы -Rom1.x0028 equ #0028 ;вызов калькулятора -Rom1.x0030 equ #0030 ;резервирование памяти -Rom1.x0038 equ #0038 ;обработчик прерываний -Rom1.x0095 equ #0095 ;токены бейсика -Rom1.x03B5 equ #03B5 ;beep -Rom1.x0761 equ #0761 ;LOAD/MERGE/VERIFY -Rom1.x08CE equ #08CE ;MERGE -Rom1.x0970 equ #0970 ;SAVE -Rom1.x0B52 equ #0B52 ;печать токена -Rom1.x0C0A equ #0C0A ;печать сообщения -Rom1.x0D4D equ #0D4D ;копиравоние атрибутов -Rom1.x0D6B equ #0D6B ;CLS -Rom1.x0D6E equ #0D6E ;открыть канал -Rom1.x0DAF equ #0DAF ;очистить экран -Rom1.x0E88 equ #0E88 ;расчет адреса в атрибутах по координатам -Rom1.x0E9B equ #0E9B ;расчет адреса на экране по координатам -Rom1.x0F85 equ #0F85 ;добавить код в строку -Rom1.x107F equ #107F -Rom1.x1097 equ #1097 ;очистка памяти -Rom1.x10DB equ #10DB ;обработка кода клавиши -Rom1.x1303 equ #1303 ;основной цикл basic 48 -Rom1.x1391 equ #1391 -Rom1.x1536 equ #1536 -Rom1.x15EF equ #15EF ;печать символа из a -Rom1.x1601 equ #1601 ;открыть канал -Rom1.x1615 equ #1615 ;установка флагов канала (возврат предыдущего канала) -Rom1.x1655 equ #1655 ;резервирование места (длина в bc) -Rom1.x1661 equ #1661 ;lddr, ret -Rom1.x1664 equ #1664 ;обновление системных переменных -Rom1.x1695 equ #1695 ;получить адрес первой строки программы -Rom1.x16B0 equ #16B0 ;очистка различных областей памяти -Rom1.x16BF equ #16BF ;очистка рабочего буфера -Rom1.x16C5 equ #16C5 ;восстановление стэка -Rom1.x1825 equ #1825 ;LIST-5 -Rom1.x18B6 equ #18B6 ;пропуск натурального числа -Rom1.x196E equ #196E ;получить начальный адрес строки программы -Rom1.x198B equ #198B ;поиск команды в строке -Rom1.x19B8 equ #19B8 ;поиск адрес начала следующей строки программы -Rom1.x19E5 equ #19E5 ;удалить переменные -Rom1.x19E8 equ #19E8 ;удалить массив DIM -Rom1.x19FB equ #19FB ;получить номер редактиремой строки -Rom1.x1A1B equ #1A1B ;печать номера строки -Rom1.x1C1F equ #1C1F ;обработка класса #01 -Rom1.x1C56 equ #1C56 ;полкчить значение параметра -Rom1.x1C6C equ #1C6C ;FOR i -Rom1.x1C7A equ #1C7A ;получение двух значений -Rom1.x1C82 equ #1C82 ;получение числового значения -Rom1.x1C8C equ #1C8C ;параметр - строка -Rom1.x1CBE equ #1CBE ;установка необязательных атрибутов для печати -Rom1.x1CDE equ #1CDE ;получение параметра-числа -Rom1.x1CE6 equ #1CE6 ;ноль на стэк калькулятора -Rom1.x1D16 equ #1D16 ; -Rom1.x1D86 equ #1D86 ;поиск оператора -Rom1.x1E39 equ #1E39 ;проверить инструкцию DATA или DEF FN -Rom1.x1E45 equ #1E45 -Rom1.x1E67 equ #1E67 ;команда GO TO -Rom1.x1E99 equ #1E99 ;извлечь операнд -Rom1.x1F05 equ #1F05 ;проверка наличия свободной памяти -Rom1.x1FDF equ #1FDF ;PRINT_2 -Rom1.x2048 equ #2048 ;PR-ST-END -Rom1.x2070 equ #2070 ;нужно ли изменять поток? -Rom1.x20A0 equ #20A0 ;ввод с клавиатуры -Rom1.x20C1 equ #20C1 ;ввод данных по input -Rom1.x21FC equ #21FC ;изменение временных атрибутов -Rom1.x22AA equ #22AA ;рассчитать адрес на экране по координатам -Rom1.x22E9 equ #22E9 ;печать точки -Rom1.x232D equ #232D ;печать окружности -Rom1.x2394 equ #2394 ;печать линии -Rom1.x2477 equ #2477 ;печать линии -Rom1.x24FB equ #24FB ;ищем следующее выражение -Rom1.x2530 equ #2530 ;проверка флага проверка/исполнение программы -Rom1.x28B2 equ #28B2 ;LOOK-VARS -Rom1.x2996 equ #2996 ;проверкае синтаксиса выражения, заключенного в скобки -Rom1.x2BF1 equ #2BF1 ;прочитать значение со стэка калькулятора -Rom1.x2C15 equ #2C15 ;D-RUN -Rom1.x2C8D equ #2C8D ;это буква? -Rom1.x2D1B equ #2D1B ;это цифра? -Rom1.x2D2B equ #2D2B ;bc на стэк калькулятора -Rom1.x2DA2 equ #2DA2 ;извлечь значение со стэка калькулятора -Rom1.x2DE3 equ #2DE3 ;печать числа с плавающей точкой -Rom1.x30A9 equ #30A9 ;hl=hl*de -Rom1.x33B4 equ #33B4 ;поместить число на смэк калькулятора -Rom1.x34E9 equ #34E9 ;проверка значения на ноль -Rom1.x3B01 equ #3B01 ; -Rom1.x3C04 equ #3C04 ;проверка Break и вызов теста экрана - -Rom1.x03F8 equ #03F8 ; BEEP routine in ROM 1. -;Rom1.x0D6B equ #0D6B ; CLS routine in ROM 1 -Rom1.x16E5 equ #16E5 ; CLOSE # routine in ROM 1 -Rom1.x1736 equ #1736 ; OPEN # routine in ROM 1 -Rom1.x1A0D equ #1A0D ; CLEAR routine in ROM 0 -Rom1.x1CEE equ #1CEE ; STOP routine in ROM 1 -Rom1.x1DAB equ #1DAB ; NEXT routine in ROM 1 -Rom1.x1E42 equ #1E42 ; RESTORE routine in ROM 1 -Rom1.x1E4F equ #1E4F ; RANDOMIZE routine in ROM 1 -Rom1.x1E5F equ #1E5F ; CONTINUE routine in ROM 1 -;Rom1.x1E67 equ #1E67 ; GO TO routine in ROM 1 -Rom1.x1E7A equ #1E7A ; OUT routine in ROM 1 -Rom1.x1E80 equ #1E80 ; POKE routine in ROM 1 -Rom1.x1F3A equ #1F3A ; PAUSE routine in ROM 1 -Rom1.x2294 equ #2294 ; BORDER routine in ROM 1 -Rom1.x22DC equ #22DC ; PLOT routine in ROM 1 - - - -;#0000 включение компьютера/"холодный" старт -;#0004 вход в монитор NMI/rst 8 -;#0008 rst #08 вызов функции монитора -;#000D возврат из монитора -;#0010 rst #10 печать символа из A -;#0014 rst #08 вызов функции монитора -;#0018 чтение очередного символа строки программы -;#001C переход в rom2 при ресете -;#0020 получение следующего символа из бейсик программы -;#0024 переход в rom2 при rst #08 -;#0028 вызов процедуры из basic 48k -;#0038 обработчик прерываний -;#004A обработчик ошибок basic 128 -;#005C вызов процедуры (продолжение rst #28) -;#006B п/п переключения страниц rom0/1 копируется (адрес x5B00) -;#007F сюда возврат после отработки п/п по rst #28 (=#5B14) -;#0088 обработчик ошибок basic 128k -;#009A ввод из канала "P" -;#009F вывод в канал "P" -;#00B5 выход из процедуры ввода/вывода в канал "P" (включение предыдущего rom basic48/128) -;#00C3 обработчик ошибок basic 128k -;#00C7 вход из монитора после "холодного старта" -;#00ED вход из монитора после "теплого старта" -;#0100 !!!NOT USED!!! керналь процедур -;#0131 ошбка проверки памяти (битая память) -;#0137 инициализация переменных и печать меню 128k -;#019D команда NEW -;#026B выполненение введенной строки -;#02BA сюда возвращаемся после проверки синтаксиса бейсика -;#0321 обработчик ошибок -;#03EF обработчик ошибок -;#03F7 вставка строки программы -;#046C адреса сообщений об ошибках -;#048C сообщения об ошибках -;#057D печать строки из de -;#0589 информация о каналах -;#059E информация о потоках -;#05AC обработка ошибки -;#05D6 проверка нажатия break и печать сообщения -;#05E6 RS232 ввод и вывод -;#0641 команда FORMAT -;#06D8 процедура ввода из RS232 -;#06E5 чтение байта из RS232 -;#07CA процедура вывода в RS232 -;#0822 перевод строки на принтере -;#082B !!!NOT USED!!! взврат каретки на принтере -;#0830 продолжение x07CA процедура вывода в RS232 -;#08A3 передача байта на принтер -;#08B1 rst #08 вызов функции монитора -;#08D1 включение компьютера/"холодный" старт -;#08E1 !!!NOT USED!!! вход куда-то -;#08EE возврат из x08A3 -;#08F0 команда COPY -;#0915 печать половины строки -;#095F передача на принтер управляющего кода -;#096D проверить пиксель на экране -;#0979 управляющие коды принтера Epson -;#0985 команда PLAY -;!!!not used!!! #0E89 чтение регистра AY -;#0E93 гасим звуки во всех каналах -;#11EB команда SAVE -;#11F2 команда LOAD -;#11F2 команда VERIFY -;#1200 команда MERGE -;#1219 ошибка C Nonsense in BASIC -;#121D работа с RAM диском -;#137E загрузка данных с RAM диска -;#1385 получить выражения из строки бейсика -;#1393 проверка и копирование имени файла -;#13BE работа с лентой/RAM диском -;#152F печать бейсик программы от текущей строки -;#1630 очистка окна редактирования -;#1639 сдвиг всех строк в буфере редактирования верх и обновление экрана -;#1648 сдвиг всех строк в буфере редактирования верх и обновление экрана -;#166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;#1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;#16AC вставка символа в строку буфера редактирования -;#16C1 вставка символа в строку буфера редактирования со сдвигом влево -;#16DC смещения до параметров команды -;#170E синтаксические параметры команд (аналогично basic 48 #1A7A) -;#17AF анализ и выполнение бейсик программы -;#18B5 таблица смещений до процедур обработки класса оператора -;#18C4 процедуры обработки классов -;#1967 процедуры обработки команд бейсика -;#1AF1 пункт меню Tape Loader -;#1B11 анализ и выполненение введенной строки -;#1B14 пункт меню редактора Print (печать на принтер) -;#1B2B команда SPECTRUM -;#1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 -;#1B4A включение basic48, блокировка #7FFD и переход на адрес в hl -;#1B53 установка канала 'P' -;#1B6E данные для команды LOAD "" -;#1B71 команда LIST -;#1B75 команда LIST -;#1BAD команда RAM disk SAVE! -;#1BE5 команда RAM disk CAT! -;#1C0C команда RAM disk EARSE! -;#1C2E загрузка заголовка файла из RAM диска -;#1C4B загрузка из RAM диска -;#1C64 включение логической страницы в A -;#1C87 сравнение имени файла с заданным -;#1C97 создание новой записи в каталоге RAM-диска -;#1CF3 коррекция сводного места на RAM диске -;#1D12 поиск имени файла в каталоге -;#1D35 поиск файла на RAM диске -;#1D56 обновление записи каталога -;#1DAC сохранение данных на RAM диске -;#1E37 загрузка данных с RAM диска -;#1ECF !!!NOT USED!!! запись данных в RAM 7 -;#1F04 !!!NOT USED!!! чтение данных из RAM 7 -;#1F20 установка другого стэка и ram 0 -;#1F3A включение страницы ram -;#1F45 установка другого стэка и ram 7 -;#1F5F удаление файла из RAM диска -;#20D2 печать каталога RAM диска -;#2135 печать одной записи каталога RAM диска -;#2174 команда LPRINT -;#2178 команда PRINT -;#218C команда INPUT -;#21A7 команда COPY -;#21AA команда NEW -;#21AE команда CIRCLE -;#21BE команда DRAW -;#21D5 команда DIM -;#21EF очистка экрана -;#21F8 вычисличть числовое выражение -;#226F обработка нажатой клавиши -;#228E поиск начала бейсик команды -;#2297 проверка это команда LET? (калькулятор basic 128) -;#22AB проверка это оператор? -;#22BD список токенов операторов -;#22CB проверка это токен? -;#22E0 проверка это число или функция -;#230A проверка это цифра или нет -;#2317 команда PLAY -;#2336 !!!NOT USED!!! возврат в редактор -;#2342 !!!NOT USED!!! bc=hl-de -;#234A !!!NOT USED!!! зарезервировать память на 1 байт -;#2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc -;#236F !!!NOT USED!!! hl=a*#20 -;#2371 !!!NOT USED!!! hl=a*#08 -;#2378 !!!NOT USED!!! расчет свободного места -;#2384 !!!NOT USED!!! печать на экране строки из буфера -;#23B8 !!!NOT USED!!! печать в буфере #FF -;#23CB !!!NOT USED!!! копирование буфера на экран -;#23E1 !!!NOT USED!!! печать символов из буфера на экране -;#2456 !!!NOT USED!!! переключение страниц rom 0/1 -;#2464 !!!NOT USED!!! переключение страниц rom 0/1 -;#246F !!!NOT USED!!! копирование п/п в ram 7 -;#2488 !!!NOT USED!!! установка атрибутов из буфера экрана -;#249B !!!NOT USED!!! установка атрибутов из буфера экрана -;#2513 !!!NOT USED!!! поменять местами ink и paper -;#2537 таблица адресов обработки нажатий в режиме редактирования -;#2577 таблица адресов обработки нажатий в основном меню basic 128k -;#2584 подготовка переменных -;#259F печать главного меню basic 128 и выбор опции -;#25CB возврат в редактор/калькулятор/меню после обработки ошибки -;#2653 основной цикл в basic128/калькулятор -;#2669 обработка нажатия клавиши -;#269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху -;#26BB выбор нижнего экрана -;#26CE выбор верхнего экрана -;#26E7 звуковой сигнал -;#26EC звуковой сигнал -;#26FA звуковой сигнал -;#2704 cs+1 вызов меню -;#2717 нажатие cs+1/enter в главном меню -;#272E курсор вверх в главном меню -;#2731 курсор вниз в главном меню -;#2744 адреса процедур обработки опций основного меню basic 128k -;#2754 текст основного меню basic 128k -;#278D !!!NOT USED!!! -;#2790 адреса процедур обработки опций меню в редакторе basic 128 -;#27A0 текст меню в редакторе basic 128 -;#27CB адреса процедур обработки опций меню в калькуляторе -;#27D2 текст меню в калькуляторе -;#27EB !!!NOT USED!!! -;#2811 смена области редактирования низ/верх -;#2816 выбор опции 128 TR-DOS -;#281С выход из редактора/калькулятора в главное меню -;#2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) -;#283E !!!NOT USED!!! -;#2851 перенумерация строк программы -;#2862 печать программы на принтере -;#286C выбор опции 128 BASIC -;#2885 выбор опции калькулятор -;#28BE инициализация курсора для верхнего окна -;#28C7 возврат в главное меню -;#28DF инициализация настроек нижнего окна -;#28E8 инициализация настроек верхнего окна -;#28F1 обработка нажатия символьной клавиши -;#291B ext+ss+K удаление символа справа от курсора -;#292B delete удаление символа слева от курсора -;#2944 enter ввод строки -;#2983 ext+N/Graph+W переход к первой строке бейсик программы -;#29AB ext+T/Graph+V переход к последней строке бейсик программы -;#29D4 ext+I переход к началу текущего слова -;#29E1 ext+shift+J переход к началу следующего слова -;#29EC удаление курсора, восстановление атрибутов -;#29F2 напечатать курсор -;#29F8 напечатать курсор -;#2A07 получение позиции курсора -;#2A11 сохранить позицию курсора -;#2A1A получение текущего символа в буфере редактирования -;#2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования -;#2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования -;#2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования -;#2A87 ext+ss+2/Graph+Y переход к началу строки редактирования -;#2A94 перемещение курсора вверх в поле редактирования -;#2AB5 перемещение курсора вниз в поле редактирования -;#2AD7 перемещение курсора влево в поле редактирования -;#2AE3 перемещение курсора вправо в поле редактирования -;#2AF9 найти в строке ближайшую редактируемую позицию -;#2B02 найти в строке ближайшую редактируемую позицию -;#2B0B вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран -;#2B30 вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран -;#2B5B поиск редактируемой позиции слева от курсора во всем буфере -;#2B78 поиск редактируемой позиции справа от курсора во всем буфере -;#2BD4 поиск редактируемого символа в строке справа от курсора -;#2BDF поиск в строке влево от курсора редактируемого символа -;#2BEA поиск начала слова слева от курсора -;#2C09 поиск начала слова справа от курсора -;#2C31 поиск начала строки редактирования в буфере -;#2C4C поиск конца строки в буфере редактирования -;#2C68 вставить строку бейсик программы, если были изменения -;#2C7C вставить строку в бейсик программу, если были изменения -;#2C8E вставить строку бейсик программы -;#2D54 получить очередной символ из строки бейсик программы -;#2D8F получить символ из текущей позиции курсора в буфере редактирования -;#2E0E получить символ из строки буфера редактирования -;#2E1F сброс верхнего окна редактирования -;#2E2D сброс нижнего окна редактирования -;#2E41 поиск в строке вправо от курсора редактируемого символа -;#2E63 поиск в строке влево от курсора редактируемого символа -;#2E7B чтение символа из буфера редактирования -;#2E81 вставка символа в буфер редактирования -;#2ECE вставка пустой строки в буфер редактирования -;#2ED3 вставка пустой строки в буфер редактирования -;#2F12 удаление символа в строке в буфере редактирования -;#2F80 сдвиг строк вверх в буфере при удалении строки -;#2FBC ext+E удаление символов от курсора до начала текущего слова -;#3017 ext+W удаление символов от курсора до начала следующего слова -;#303E ext+K удаление символов до наала строки -;#3072 ext+J удаление символов до конца строки -;#3084 удаление курсора и запрет на обновление экрана -;#3095 проверка наличия предыдущего символа в буфере -;#30B4 расчет адреса начала строки в буфере редактирования -;#30C6 !!!NOT USED!!! -;#30D0 параметры для установки буфера редактирования строки внизу экрана -;#30D6 установка буфера редактирования внизу экрана -;#30DF сдвиг строк в буфере редактирования вверх -;#311E сдвиг строк в буфере редактирования вниз -;#316E вставка символа в нижний буфер редактирования -;#31C3 расчет адреса начала строки в буфере редактирования -;#31C9 удаление символа в нижнем буфере редактирования -;#321E параметры для установки буфера редактирования строки вверху экрана -;#3222 установка буфера редактирования в верху экрана -;#322B перемещение курсора вверх в верхнем буфере редактирования -;#326A копирование строки бейсик программы в буфер редактирования вверзу экрана -;#32B7 расчет адреса начала строки в буфере редактирования -;#32BD таблица обработки управляющих кодов при редактировании строки -;#32D6 копирование строки программы в буфер редактирования -;#3331 перенос части строки на следующую строку -;#334A поиск адреса строки бейсик программы -;#3352 преобразование номера строки в ASCII и помещение в буфер -;#335A преобразование токена в текст -;#335F копирование процедур в ram -;#3374 копирование токена в буфер токенов (=#FCAE) -;#33C3 копирование токена (=#FCFD) -;#33F4 распознавание токена (=#FD2E) -;#3430 преобразование номера строки в ASCII и помещение в буфер -;#3495 выделение разряда числа и занесение его в буфер -;#34B6 поиск адрес строки программы с заданным номером или следущей строки, если строка с заданным номером не существует -;#34CF расчет адреса следущей строки бейсик программы -;#34D9 проверка на конец бейсик программы -;#34E0 сравнение номера строки с заданным -;#34EA обнуление указателей в бейсик строке -;#34F6 поиск адрес строки бейсик программы в памяти -;#3517 преобразование токена в текст -;#3594 токены basic128 -;#35BC установка параметров отступа -;#35C5 сохранить символ в указанном столбце текущей строки буфера редактирования -;#35CC процедура обработки нажатия 'enter' в строке -;#35DA процедура обработки зануления до конца строки -;#35E6 зануление до конца строки в буфере редактирования -;#35F4 создание отступа в строке в буфере редактирования -;#3604 печать строки редактируемого буфера, при необходимости -;#3618 сдвиг вверх строк в буфере редактирования при необходимости -;#362C сдвиг вниз строк в буфере редактирования при необходимости -;#3640 печать атрибутов курсора -;#364F восстановление атрибутов под курсором -;#365E установка переменных для ввода символа -;#367F ожидание нажатия клавиши -;#36A8 печать меню basic 128k -;#3719 печать одной линии вокруг меню -;#372B установка координат печати из bc -;#3733 печать строки из hl -;#373B сохранение окна экрана 14*12 в буфере -;#373E восстановление окна экрана 14*12 из буфера -;#377E сохранение/восстановление 14 знакомест экана в буфере -;#37A7 клавиша вверх в меню basic128 -;#37B6 клавиша вниз в меню basic128 -;#37CA инвертирование атрибутов опции меню -;#37EC управляющие коды для печати меню -;#37FA управляющие коды для печати меню -;#3802 данные потоков для печати эмблемы -;#3812 управляющие коды для печати косых полос в меню -;#3822 печать эмблемы ZX (косые цветные полосы) в меню -;#3848 печать информационной строки 128 BASIC -;#384D печать информационной строки Calculator -;#3852 печать информационной строки 48 TR-DOS -;#3857 печать информационной строки 128 TR-DOS -;#3881 очистка двух нижних строк экрана -;#3888 перенумерация строк программы -;#390E анализ строки и перенумерование ссылок на номера строк -;#3A05 подсчет количества строк в бейсик программе -;#3A35 пропуск пробелов в строке -;#3A3C номер строки в ASCII -;#3A60 получить один разря числа в ASCII -;#3A7F установка настроек курсора для верхнего окна -;#3A88 установка настроек курсора для нижнего окна -;#3A91 !!!NOT USED!!! -;#3A96 сохранить атрибуты курсора -;#3A9D печать атрибутов курсора -;#3AB2 восстановление атрибутов под курсором -;#3ABF сдвиг вверх строк в буфере редактирования -;#3AC6 сдвиг вниз строк в буфере редактирования -;#3B1E печать строки редактируемого буфера -;#3B5E очистка строк экрана -;#3B94 расчет количества строк и столцов до конца экрана -;#3B98 расчет количества строк от заданной до низа экрана -;#3BA0 расчет адреса атрибутов -;#3BB8 обмен атрибутов basic 128 с основными атрибутами -;#3BE9 запуск команды randomize 15619: rem: load "boot" -;#3C1C !!!NOT USED!!! копирование и выполненение бейсик строки -;#3C20 !!!NOT USED!!! бейсик строка -;#3C35 возврат из монтора -;#3C4A !!!NOT USED!!! вход в монитор (продолжение x08E1) -;#3C56 пауза 25 фреймов -;#3C63 токенизация строки бейсик программы с синтаксической ошибкой -;#3C67 токенизация строки бейсик программы -;#3D9D получить очередной символ из строки бейсик программы и определить его тип -;#3DC6 проверка символа на принадлежность к буквам нижнего регистра -;#3DCD копирование слова из буфера в строку бейсик программы -;#3DE9 вставить символ в буфер редактирования -;#3E16 вставка символа в сроку бейсик программы с обработкой < и > -;#3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек -;#3E9C вставка символа в сроку бейсик программы с игнорированием пробелов -;#3EFB вставка символа в сроку бейсик программы -;#3F66 проверка наличия свободного места в памяти -;#3F7E распознавание токена -;#3FBA копирование строки из hl в de в (hl+0) кол-во байт -;#3FC3 !!!NOT USED!!! преобразование ASCII в цифру -;#3FCE обработка нажатой управляющей клавиши -;#3FEE вызов call (hl) -;#3FEF инициалы программистов -;#4000 - - - - -;АДРЕС: #0000 включение компьютера/"холодный" старт -x0000 di - jp x08D1 - -;АДРЕС: #0004 вход в монитор -x0004 out (c),a - nop - nop - -;АДРЕС: #0008 rst #08 вызов функции монитора -x0008 jp x0014 - nop - nop - -;АДРЕС: #000D возврат из монитора -x000D jp x3C35 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #28 ;вызов п/п из basic 48k - dw Rom1.x0010 - ret - -;АДРЕС: #0014 rst #08 вызов функции монитора -x0014 jp x08B1 - nop - -;АДРЕС: #0018 чтение очередного символа строки программы -x0018 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0018 - ret - -;АДРЕС: #001C переход в rom2 при ресете -x001C out (c),a - nop - nop - -;АДРЕС: #0020 получение следующего символа из бейсик программы -x0020 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0020 - ret - -;АДРЕС: #0024 переход в rom2 при rst #08 -x0024 out (c),a - nop - nop - -;АДРЕС: #0028 вызов процедуры из basic 48k -x0028 ex (sp),hl - push af - ld a,(hl) - inc hl - inc hl - ld (x5B5A),hl - dec hl - ld h,(hl) - ld l,a - pop af - jp x005C - nop ;not use - -;АДРЕС: #0038 обработчик прерываний -x0038 push hl - ld hl,x0048 - push hl - ld hl,x5B00 - push hl - ld hl,Rom1.x0038 - push hl - jp x5B00 -x0048 pop hl - ret - -;АДРЕС: #004A обработчик ошибок basic 128 -x004A ld bc,#7FFD - xor a - di - out (c),a ;rom 0(128k), ram 0, scr 5, 128k - ld (x5B5C),a - ei - dec a - ld (iy+#00),a ;no error - jp x0321 - -;АДРЕС: #005C вызов процедуры (продолжение rst #28) -x005C ld (x5B58),hl - ld hl,x5B14 - ex (sp),hl - push hl - ld hl,(x5B58) - ex (sp),hl - jp x5B00 - -;АДРЕС: #006B п/п переключения страниц rom0/1 копируется в адрес x5B00 -x006B push af - push bc - ld bc,#7FFD - ld a,(x5B5C) - xor #10 - di - ld (x5B5C),a - out (c),a - ei - pop bc - pop af - ret -;АДРЕС: #007F сюда возврат после отработки п/п по rst #28 (=#5B14) -x007F call x5B00 - push hl - ld hl,(x5B5A) ;адрес возврата в процедуру при вызове rst #28 - ex (sp),hl - ret -;АДРЕС: #0088 обработчик ошибок basic 128k -x0088 di - ld a,(x5B5C) - and #EF - ld (x5B5C),a - ld bc,#7FFD - out (c),a - ei - jp x00C3 -;АДРЕС: #009A ввод из канала "P" -x009A ld hl,x06D8 - jr x00A2 -;АДРЕС: #009F вывод в канал "P" -x009F ld hl,x07CA -x00A2 ex af,af' - ld bc,#7FFD - ld a,(x5B5C) - push af - and #EF - di - ld (x5B5C),a - out (c),a - jp x05E6 ;RS232 ввод и вывод -;АДРЕС: #00B5 выход из процедуры ввода/вывода в канал "P" -; (включение предыдущего rom basic48/128) -x00B5 ex af,af' - pop af - ld bc,#7FFD - di - ld (x5B5C),a - out (c),a - ei - ex af,af' - ret - -;АДРЕС: #00C3 обработчик ошибок basic 128k -x00C3 ld hl,(#5B8B) - jp (hl) - -;АДРЕС: #00C7 вход из монитора после "холодного старта" -x00C7 ld b,#08 -x00C9 ld a,b ;проверка и зануление всех страниц[0..7] памяти - exx - dec a - ld bc,#7FFD - out (c),a - ld hl,#C000 - ld de,#C001 - ld bc,#3FFF - ld a,#FF - ld (hl),a - cp (hl) - jr nz,x0131 ;битая память - xor a - ld (hl),a - cp (hl) - jr nz,x0131 ;битая память - ldir - exx - djnz x00C9 - ld (x5B88),a - -;АДРЕС: #00ED вход из монитора после "теплого старта" -x00ED ld c,#FD - ld d,#FF - ld e,#BF - ld b,d - ld a,#0E ;регистр AY #0E - out (c),a ;bc=#FFFD - ld b,e ;bc=#BFFD - ld a,#FF - out (c),a - jr x0137 -x00FF nop ;not used - -;АДРЕС: #0100 !!!NOT USED!!! керналь процедур -x0100 jp x17AF ;парсер бейсик программы - jp x1838 ;выполнение команды из строки редактирования - jp x1ECF ;запись данных в RAM 7 - jp x1F04 ;чтение данных из RAM 7 - jp x004A ;обработчик ошибок basic 128 - jp x03A2 ;обработчик ошибок - jp x182A ;RETURN - jp x18A8 ;NEXT - jp x012D ;опрос клавиатуры - jp x0A05 ;команда PLAY - jp x11A3 ;загрузка байта в порт MIDI - jp x06D8 ;процедура ввода из RS232 - jp x07CA ;процедура вывода в RS232 - jp x08A3 ;передача байта на принтер - jp x08F0 ;команда COPY -x012D rst #28 ;вызов процедуры из basic 48k - dw Rom1.x3B01 ;опрос клавиатуры - ret - -;АДРЕС: #0131 ошбка проверки памяти (битая память) -x0131 exx - ld a,b - out (#FE),a - jr $ - -;АДРЕС: #0137 инициализация переменных и печать меню 128k -; de=#FFBF -; c=#FD -x0137 ld b,d ;установка регистра #07 AY - ld a,#07 - out (c),a - ld b,e - ld a,#FF - out (c),a ;выключим звук в AY - ld de,#5B00 - ld hl,x006B ;п/п переключения страниц памяти - ld bc,#0058 - ldir - ld a,#CF ;обработчик ошибок basic 48 - ld (x5B5D),a - ld sp,#5BFF - ld a,#04 - call x1C64 ;включим ram 7 - ld ix,#EBEC ;адрес начала каталога rom-disk - ld (x5B83),ix - ld (ix+#0A),#00 - ld (ix+#0B),#C0 - ld (ix+#0C),#00 - ld hl,#2BEC ;свободное место на rom-disk - ld a,#01 - ld (x5B85),hl - ld (x5B85+2),a - ld a,#05 ;ram 0 - call x1C64 - ld hl,#FFFF ;адрес последнего байта физического ОЗУ - ld (#5CB4),hl - ld de,#3D00+#01AF ;адрес последнего байта символа "U" в basic 48 - ld bc,#00A8 ;копирование символов шрифта [A..U] - ex de,hl - rst #28 ;вызов п/п из basic 48k - dw Rom1.x1661 ;lddr, ret - ex de,hl - inc hl - ld (#5C7B),hl ;адрес начала определяемых пользователем символов - dec hl - ld bc,#0040 - ld (#5C38),bc - ld (#5CB2),hl ;последний адрес в ОЗУ разрешенный для basic - -;АДРЕС: #019D команда NEW -x019D ld hl,#3D00-#100 ;адрес символьного набора - ld (#5C36),hl - ld hl,(#5CB2) ;Последний адрес в ОЗУ, разрешенный к использованию интерпретатором Бейсика - inc hl - ld sp,hl - im 1 - ld iy,#5C3A - set 4,(iy+#01) ;режим 128k - ei - ld hl,#000B - ld (x5B5F),hl ;скорость принтера 9600 бод - xor a - ld (x5B61),a - ld (x5B63),a - ld (x5B65),a - ld hl,#EC00 ;!!!ОШИБКА!!! должно писаться в rqm 7 - ld (#FF24),hl - ld a,#50 ;ширна печати 80 символов - ld (x5B64),a - ld hl,#000A - ld (x5B94),hl - ld (x5B96),hl - ld hl,#5CB6 ;копируем нформацию о каналах - ld (#5C4F),hl - ld de,x0589 - ld bc,#0015 - ex de,hl - ldir - ex de,hl - dec hl - ld (#5C57),hl ;Адрес начала следующей строки бейсик-программы - inc hl - ld (#5C53),hl ;Адрес начала бейсик-программы - ld (#5C4B),hl ;Адрес начала области переменных бейсик-программы - ld (hl),#80 ;признак конца переменных бейсика - inc hl - ld (#5C59),hl ;Адрес начала редактируемой строки - ld (hl),#0D - inc hl - ld (hl),#80 - inc hl - ld (#5C61),hl ;Адрес начала рабочей области бейсик-программы - ld (#5C63),hl ;Адрес начала стека калькулятора - ld (#5C65),hl ;Адрес вершины стека калькулятора - ld a,#38 - ld (#5C8D),a ;Постоянные атрибуты экрана - ld (#5C8F),a ;Временные атрибуты, используемые при выводе на экран - ld (#5C48),a ;Атрибуты служебного экрана - xor a - ld (#EC13),a ;!!!ОШИБКА!!! должно писаться в rqm 7 - ld a,#07 - out (#FE),a ;бордюр - ld hl,#0523 ;автоповтор и период задержки - ld (#5C09),hl - dec (iy-#3A) ;x5C00 - dec (iy-#36) ;x5C04 - ld hl,x059E - ld de,#5C10 ;Область хранения информации о потоках - ld bc,#000E - ldir - res 1,(iy+#01) - ld (iy+#00),#FF ;no error - ld (iy+#31),#02 ;Количество строк в служебном экране - rst #28 ;вызов п/п x0D6B из basic 48k - dw Rom1.x0D6B ;CLS - rst #28 ;вызов п/п из basic 48k - dw Rom1.x3C04 ;проверка Break и вызов теста экрана - ld de,x0561 ;1992-94 Scorpion ZS 256 - call x057D ;печать строки из de - ld (iy+#31),#02 ;Количество строк в служебном экране - set 5,(iy+#02) - ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#38 - ld (#EC11),a - ld (#EC0F),a - call x2584 ;подготовка переменных 2-3,1=%11 - call x1F20 ;установка другого стэка и ram 0 - rst #08 ;вызов функции монитора - db #8C ;нажатие Enter и переход на rom 0: #259F - nop - -;АДРЕС: #026B выполненение введенной строки -x026B ld hl,x5B66 ;флаги - set 0,(hl) ;режим - ld (iy+#00),#FF ;код ошибки - ld (iy+#31),#02 ;количество строк в служебном экране - ld hl,x5B1D ;сюда вернемся при ошибке - push hl - ld (#5C3D),sp - ld hl,x02BA - ld (x5B8B),hl ;сюда вернемся при ошибке - call x228E ;поиск начала бейсик команды - call x22CB ;проверка токена - jp z,x21F8 ;вычисличть числовое выражение - cp "(" - jp z,x21F8 ;вычисличть числовое выражение - cp "-" - jp z,x21F8 ;вычисличть числовое выражение - cp "+" - jp z,x21F8 ;вычисличть числовое выражение - call x22E0 ;проверка это число или функция - jp z,x21F8 ;вычисличть числовое выражение - call x1F45 ;установка другого стэка и ram 7 - ld a,(#EC0E) - call x1F20 ;установка другого стэка и ram 0 - cp #04 - jp nz,x17AF ;анализ и выполнение программы - call x2297 ;проверка это команда LET? (калькулятор basic 128) - jp z,x17AF ;анализ и выполнение программы - pop hl - ret - -;АДРЕС: #02BA сюда возвращаемся после проверки синтаксиса бейсика -x02BA bit 7,(iy+#00) - jr nz,x02C1 - ret ;ошибок не было -x02C1 ld hl,(#5C59) - ld (#5C5D),hl - rst #28 - dw Rom1.x19FB ;получить номер редактиремой строки - ld a,b - or c - jp nz,x03F7 - rst #18 ;чтение очередного символа строки программы - cp #0D - ret z - call x21EF ;очистка экрана - bit 6,(iy+#02) - jr nz,x02DF - rst #28 - dw Rom1.x0D6E ;открыть канал -x02DF res 6,(iy+#02) - call x1F45 ;установка другого стэка и ram 7 - ld hl,#EC0D - bit 6,(hl) - jr nz,x02F4 - inc hl - ld a,(hl) - cp #00 - call z,x3881 ;очистка двух нижних строк экрана -x02F4 call x1F20 ;установка другого стэка и ram 0 - ld hl,#5C3C - res 3,(hl) - ld a,#19 - sub (iy+#4F) - ld (#5C8C),a - set 7,(iy+#01) - ld (iy+#0A),#01 ;!!!ОШИБКА!!! - ld hl,#3E00 - push hl - ld hl,x5B1D - push hl - ld (#5C3D),sp - ld hl,x0321 - ld (x5B8B),hl - jp x1838 ;выполнение команды из строки редактирования - -;АДРЕС: #0321 обработчик ошибок -x0321 ld sp,(#5CB2) - inc sp - ld hl,x5BFF - ld (x5B81),hl - halt - res 5,(iy+#01) - ld hl,x5B66 - bit 2,(hl) - jr z,x034A - call x1F45 ;установка другого стэка и ram 7 - ld ix,(x5B83) - ld bc,#0014 - add ix,bc - call x1D56 ;обновление записи каталога - call x1F20 ;установка другого стэка и ram 0 -x034A ld a,(#5C3A) - inc a -x034E push af - ld hl,#0000 - ld (iy+#37),h - ld (iy+#26),h - ld (#5C0B),hl - ld hl,#0001 - ld (#5C16),hl - rst #28 - dw Rom1.x16B0 ;очистка различных областей памяти - res 5,(iy+#37) - rst #28 - dw Rom1.x0D6E ;открыть канал - set 5,(iy+#02) - pop af - ld b,a - cp #0A - jr c,x037F - cp #1D - jr c,x037D - add a,#14 - jr x037F -x037D add a,#07 -x037F rst #28 - dw Rom1.x15EF ;печать символа из a - ld a," " - rst #10 - ld a,b - cp #1D - jr c,x039C - sub #1D - ld b,#00 - ld c,a - ld hl,x046C - add hl,bc - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - call x057D ;печать строки из de - jr x03A2 -x039C ld de,Rom1.x1391 - rst #28 - dw Rom1.x0C0A ;печать сообщения -x03A2 xor a - ld de,Rom1.x1536 - rst #28 - dw Rom1.x0C0A ;печать сообщения - ld bc,(#5C45) - rst #28 - dw Rom1.x1A1B ;печать номера строки - ld a,":" - rst #10 - ld c,(iy+#0D) - ld b,#00 - rst #28 - dw Rom1.x1A1B ;печать номера строки - rst #28 - dw Rom1.x1097 ;очистка памяти - ld a,(#5C3A) - inc a - jr z,x03DF - cp #09 - jr z,x03CC - cp #15 - jr nz,x03CF -x03CC inc (iy+#0D) -x03CF ld bc,#0003 - ld de,#5C70 - ld hl,#5C44 - bit 7,(hl) - jr z,x03DD - add hl,bc -x03DD lddr -x03DF ld (iy+#0A),#FF - res 3,(iy+#01) - ld hl,x5B66 - res 0,(hl) - jp x25CB - -;АДРЕС: #03EF обработчик ошибок -x03EF ld a,#10 - ld bc,#0000 - jp x034E - -;АДРЕС: #03F7 вставка строки программы -x03F7 ld (#5C49),bc - call x1F45 ;установка другого стэка и ram 7 - ld a,b - or c - jr z,x040A - ld (#5C49),bc - ld (#EC08),bc -x040A call x1F20 ;установка другого стэка и ram 0 - ld hl,(#5C5D) - ex de,hl - ld hl,x03EF - push hl - ld hl,(#5C61) - scf - sbc hl,de - push hl - ld h,b - ld l,c - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - jr nz,x0429 - rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x0429 pop bc - ld a,c - dec a - or b - jr nz,x0442 - call x1F45 ;установка другого стэка и ram 7 - push hl - ld hl,(#5C49) - call x334A ;поиск адреса строки бейсик программы - ld (#5C49),hl - pop hl - call x1F20 ;установка другого стэка и ram 0 - jr x046A -x0442 push bc - inc bc - inc bc - inc bc - inc bc -x0447 dec hl - ld de,(#5C53) - push de - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - pop hl - ld (#5C53),hl - pop bc - push bc - inc de - ld hl,(#5C61) - dec hl - dec hl - lddr - ld hl,(#5C49) - ex de,hl - pop bc - ld (hl),b - dec hl - ld (hl),c - dec hl - ld (hl),e - dec hl - ld (hl),d -x046A pop af - ret - -;АДРЕС: #046C адреса сообщений об ошибках -x046C dw x048C - dw x0497 - dw x04A6 - dw x04B0 - dw x04C1 - dw x04D4 - dw x04E0 - dw x04E0 - dw x04F3 - dw x0501 - dw x0512 - dw x0523 - dw x0531 - dw x0542 - dw x054E - dw x0561 - -;АДРЕС: #048C сообщения об ошибках -x048C dc "MERGE error" -x0497 dc "Wrong file type" -x04A6 dc "CODE error" -x04B0 dc "Too many brackets" -x04C1 dc "File already exists" -x04D4 dc "Invalid name" -x04E0 dc "File does not exist" -x04F3 dc "Invalid device" -x0501 dc "Invalid baud rate" -x0512 dc "Invalid note name" -x0523 dc "Number too big" -x0531 dc "Note out of range" -x0542 dc "Out of range" -x054E dc "Too many tied notes" -x0561 dc " 1992-94 Scorpion ZS 256 " - -;АДРЕС: #057D печать строки из de -;вх: de - адрес строки для печати -x057D ld a,(de) - and #7F - push de - rst #10 ;печать символа из A - pop de - ld a,(de) - inc de - add a,a - jr nc,x057D - ret - -;АДРЕС: #0589 информация о каналах -x0589 dw #09F4,#10A8: db "K" - dw #09F4,#15C4: db "S" - dw #0F81,#15C4: db "R" - dw x5B34,x5B2F: db "P" - db #80 - -;АДРЕС: #059E информация о потоках -x059E db #01,#00 ; - db #06,#00 - db #0B,#00 - db #01,#00 - db #01,#00 - db #06,#00 - db #10,#00 - -;АДРЕС: #05AC обработка ошибки -x05AC pop hl - ld bc,#7FFD - xor a - di - ld (x5B5C),a - out (c),a ;rom 0, ram 0, scr 5 - ei - ld sp,(#5C3D) - ld a,(hl) ;код ошибки - ld (x5B5E),a ;код сообщения для rst 8 basic48 - inc a - cp #1E ;!!!ОШИБКА!!! должно быть cp #1D - jr nc,x05C8 - rst #28 ;вызов процедуры из basic 48k - dw #5B5D -x05C8 dec a - ld (iy+#00),a ;код ошибки - ld hl,(#5C5D) ;адрес следущего символа в бейсик-программе - ld (#5C5F),hl ;адрес синтаксической ошибки - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16C5 ;восстановление стэка - ret - -;АДРЕС: #05D6 проверка нажатия break и печать сообщения -x05D6 ld a,#7F -x05D8 in a,(#FE) - rra - ret c ;пробел не нажат - ld a,#FE - in a,(#FE) - rra - ret c ;cs не нажата - call x05AC ;без возврата - db #14 ;L BREAK into program, n:m - -;АДРЕС: #05E6 RS232 ввод и вывод -x05E6 ei - ex af,af' - ld de,x5B4A ;п/п включения предыдущего rom bacic48/128 - push de - res 3,(iy+#02) ;проверка режима вывода не экран не требуется - push hl - ld hl,(#5C3D) ;адрес стэка при запуске обработки ошибок - ld e,(hl) - inc hl - ld d,(hl) - and a - ld hl,Rom1.x107F - sbc hl,de - jr nz,x0637 ;обработчик ошибок в basic128 - pop hl - ld sp,(#5C3D) - pop de - pop de - ld (#5C3D),de -x060A push hl - ld de,x0610 - push de - jp (hl) -x0610 jr c,x061B - jr z,x0618 -x0614 call x05AC ;без возврата - db #07 ;8 End of file, n:m -x0618 pop hl - jr x060A -x061B cp #0D - jr z,x062D - ld hl,(x5B5A) ;адрес возврата в basic128 - push hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0F85 ;добавить код в строку - pop hl - ld (x5B5A),hl - pop hl - jr x060A -x062D pop hl - ld a,(x5B5C) - or #10 - push af - jp x5B4A ;включение basic48 -x0637 pop hl - ld de,x063D - push de - jp (hl) -x063D ret c - ret z - jr x0614 - -;АДРЕС: #0641 команда FORMAT -; FORMAT "P";9600 -x0641 rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - jr z,x0661 ;проверка синтаксиса - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - ld a,c - dec a - or b - jr z,x0659 ;длина строки 1 байт - call x05AC ;ошибка - db #24 ;i Invalid device -x0659 ld a,(de) - and #DF - cp "P" - jp nz,x1912 ;ошибка C Nonsense in BASIC -x0661 ld hl,(#5C5D) - ld a,(hl) - cp ";" - jp nz,x1912 ;ошибка C Nonsense in BASIC - rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы -x066D rst #28 - dw Rom1.x1C82 ;получение числового значения - bit 7,(iy+#01) - jr z,x067D ;проверка синтаксиса - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (x5B71),bc -x067D rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp #0D - jr z,x0689 - cp ":" - jp nz,x1912 ;ошибка C Nonsense in BASIC -x0689 call x18A1 - ld bc,(x5B71) - ld a,b - or c - jr nz,x0698 - call x05AC ;ошибка - db #25 ;j invalid baud rate -x0698 ld hl,x06B8 -x069B ld e,(hl) - inc hl - ld d,(hl) - inc hl - ex de,hl - ld a,h - cp #25 - jr nc,x06AF - and a - sbc hl,bc - jr nc,x06AF - ex de,hl - inc hl - inc hl - jr x069B -x06AF ex de,hl - ld e,(hl) - inc hl - ld d,(hl) - ld (x5B5F),de - ret -x06B8 dw #0032,#0AA5 ;Baud=50. - dw #006E,#04D4 ;Baud=110. - dw #012C,#01C3 ;Baud=300. - dw #0258,#00E0 ;Baud=600. - dw #04B0,#006E ;Baud=1200. - dw #0960,#0036 ;Baud=2400. - dw #12C0,#0019 ;Baud=4800. - dw #2580,#000B ;Baud=9600. - -;АДРЕС: #06D8 процедура ввода из RS232 -x06D8 ld hl,x5B61 - ld a,(hl) - and a - jr z,x06E5 - ld (hl),#00 - inc hl - ld a,(hl) - scf - ret - -;АДРЕС: #06E5 чтение байта из RS232 -x06E5 call x05D6 ;проверка нажатия break и печать сообщения - di - exx - ld de,(x5B5F) - ld hl,(x5B5F) - srl h - rr l - or a - ld b,#FA - exx - ld c,#FD - ld d,#FF - ld e,#BF - ld b,d - ld a,#0E - out (c),a ;выбор 14 регистра AY - in a,(c) - or #F0 - and #FB - ld b,e - out (c),a - ld h,a -x070E ld b,d - in a,(c) - and #80 - jr z,x071E ;стартовый бит получен -x0715 exx - dec b - exx - jr nz,x070E - xor a - push af - jr x0757 ;выход по тайиауту -x071E in a,(c) - and #80 - jr nz,x0715 - in a,(c) - and #80 - jr nz,x0715 - exx - ld bc,#FFFD - ld a,#80 - ex af,af' -x0731 add hl,de - nop - nop - nop - nop -x0736 dec hl - ld a,h - or l - jr nz,x0736 - in a,(c) - and #80 - jp z,x074B - ex af,af' - scf - rra - jr c,x0754 - ex af,af' - jp x0731 -x074B ex af,af' - or a - rra - jr c,x0754 - ex af,af' - jp x0731 -x0754 scf - push af - exx -x0757 ld a,h - or #04 - ld b,e - out (c),a - exx - ld h,d - ld l,e - ld bc,#0007 - or a - sbc hl,bc -x0766 dec hl - ld a,h - or l - jr nz,x0766 - ld bc,#FFFD - add hl,de - add hl,de - add hl,de -x0771 in a,(c) - and #80 - jr z,x077F - dec hl - ld a,h - or l - jr nz,x0771 - pop af - ei - ret -x077F in a,(c) - and #80 - jr nz,x0771 - in a,(c) - and #80 - jr nz,x0771 - ld h,d - ld l,e - ld bc,#0002 - srl h - rr l - or a - sbc hl,bc - ld bc,#FFFD - ld a,#80 - ex af,af' -x079D nop - nop - nop - nop - add hl,de -x07A2 dec hl - ld a,h - or l - jr nz,x07A2 - in a,(c) - and #80 - jp z,x07B7 - ex af,af' - scf - rra - jr c,x07C0 - ex af,af' - jp x079D -x07B7 ex af,af' - or a - rra - jr c,x07C0 - ex af,af' - jp x079D -x07C0 ld hl,x5B61 - ld (hl),#01 - inc hl - ld (hl),a - pop af - ei - ret - -;АДРЕС: #07CA процедура вывода в RS232 -x07CA push af - ld a,(x5B65) - or a - jr z,x07E0 - dec a - ld (x5B65),a - jr nz,x07DB - pop af - jp x0872 -x07DB pop af - ld (#5C0F),a - ret -x07E0 pop af - cp #A3 ;SPECTRUM? - jr c,x07F2 ;не токен - ld hl,(x5B5A) - push hl - rst #28 - dw Rom1.x0B52 ;печать токена - pop hl - ld (x5B5A),hl - scf - ret -x07F2 ld hl,#5C3B - res 0,(hl) - cp #20 - jr nz,x07FD - set 0,(hl) -x07FD cp #7F - jr c,x0803 - ld a,"?" -x0803 cp " " - jr c,x081E - push af - ld hl,x5B63 - inc (hl) - ld a,(x5B64) - cp (hl) - jr nc,x081A - call x0822 ;перевод строки - ld a,#01 - ld (x5B63),a -x081A pop af - jp x08A3 ;передача байта на принтер -x081E cp #0D - jr nz,x0830 - -;АДРЕС: #0822 перевод строки на принтере -x0822 xor a - ld (x5B63),a - ld a,#0D - jp x08A3 - -;АДРЕС: #082B !!!NOT USED!!! взврат каретки на принтере -x082B ld a,#0A - jp x08A3 - -;АДРЕС: #0830 продолжение x07CA процедура вывода в RS232 -x0830 cp #06 - jr nz,x0853 - ld bc,(x5B63) - ld e,#00 -x083A inc e - inc c - ld a,c - cp b - jr z,x0848 -x0840 sub #08 - jr z,x0848 - jr nc,x0840 - jr x083A -x0848 push de - ld a," " - call x07CA ;вывод в RS232 - pop de - dec e - ret z - jr x0848 -x0853 cp #16 - jr z,x0860 - cp #17 - jr z,x0860 - cp #10 - ret c - jr x0869 -x0860 ld (#5C0E),a - ld a,#02 - ld (x5B65),a - ret -x0869 ld (#5C0E),a - ld a,#02 - ld (x5B65),a - ret -x0872 ld d,a - ld a,(#5C0E) - cp #16 - jr z,x0882 - cp #17 - ccf - ret nz - ld a,(#5C0F) - ld d,a -x0882 ld a,(x5B64) - cp d - jr z,x088A - jr nc,x0890 -x088A ld b,a - ld a,d - sub b - ld d,a - jr x0882 -x0890 ld a,d - or a - jp z,x0822 -x0895 ld a,(x5B63) - cp d - ret z - push de - ld a," " - call x07CA ;вывод в RS232 - pop de - jr x0895 - -;АДРЕС: #08A3 передача байта на принтер -x08A3 push hl - ld hl,x08EE - ex (sp),hl - push af - ld a,r - di - push af - ld a,#80 - jr x08B8 - -;АДРЕС: #08B1 rst #08 вызов функции монитора -x08B1 push af - ld a,r - di - push af - ld a,#01 -x08B8 push af - inc sp - push bc - ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - ld (#C001),a - cpl - ld (#C002),a - ld a,#12 - jp x0024 ;переход в rom 2 - -;АДРЕС: #08D1 включение компьютера/"холодный" старт -x08D1 ld bc,#692B -x08D4 dec bc ;пауза - ld a,c - or b - jr nz,x08D4 - ld bc,#1FFD - ld a,#12 - jp x001C ;переход в rom2: monitor (инициализация) - -;АДРЕС: #08E1 !!!NOT USED!!! вход куда-то -x08E1 ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - jp x3C4A - -;АДРЕС: #08EE возврат из x08A3 -x08EE ei - ret - -;АДРЕС: #08F0 команда COPY -x08F0 ld hl,x5B72 - ld (hl),#2B -x08F5 ld hl,x0979 - call x095F ;передача на принтер управляющего кода - call x0915 ;печать половины строки - ld hl,x0980 ;!!!not used - call x0822 ;перевод строки - ld hl,x5B72 - xor a - cp (hl) - jr z,x090E - dec (hl) - jr x08F5 -x090E ld hl,x0982 - call x095F ;передача на принтер управляющего кода - ret - -;АДРЕС: #0915 печать половины строки -x0915 ld hl,x5B71 - ld (hl),#FF -x091A call x0926 ;печать столбца пикселей (с двойной высотой) - ld hl,x5B71 - xor a - cp (hl) - ret z - dec (hl) - jr x091A -;печать столбца пикселей (с двойной высотой) -x0926 ld de,#C000 - ld bc,(x5B71) - scf - rl b - scf - rl b - ld a,c - cpl - ld c,a - xor a - push af - push de - push bc -x093A call x096D ;проверить пиксель на экране - pop bc - pop de - ld e,#00 - jr z,x0944 - ld e,d -x0944 pop af - or e - push af - dec b - srl d - srl d - push de - push bc - jr nc,x093A - pop bc - pop de - pop af - ld b,#03 -x0955 push bc - push af - call x08A3 ;передача байта на принтер - pop af - pop bc - djnz x0955 - ret - -;АДРЕС: #095F передача на принтер управляющего кода -x095F ld b,(hl) - inc hl -x0961 ld a,(hl) - push hl - push bc - call x08A3 ;передача байта на принтер - pop bc - pop hl - inc hl - djnz x0961 - ret - -;АДРЕС: #096D проверить пиксель на экране -;вых: a =#00 пикселя нет -x096D rst #28 - dw Rom1.x22AA ;рассчитать адрес на экране по координатам - ld b,a - inc b - xor a - scf -x0974 rra - djnz x0974 - and (hl) - ret - -;АДРЕС: #0979 управляющие коды принтера Epson -x0979 db #06 ;размер в байтах - db #1B,#31 ;ESC '1' - 7/72 дюйма интервал между строками - db #1B,#4C,#00,#03 ;ESC 'L' 0 3 - двойная плотность (768 байт на строку) -x0980 db #01 ;размер в байтах - db #0A ;код перевода строки LF -x0982 db #02 ;размер в байтах - db #1B,#32 ;ESC '2' - 1/6 дюйма интервал между строками - -;АДРЕС: #0985 команда PLAY -x0985 di - push bc - ld de,#0037 - ld hl,#003C -x098D add hl,de ;hl=#003C + (#0037 * b). - djnz x098D - ld c,l - ld b,h - rst #28 - dw Rom1.x0030 ;резервирование памяти - di - push de - pop iy - push hl - pop ix - ld (iy+#10),#FF -x09A0 ld bc,#FFC9 ;-#37 - add ix,bc - ld (ix+#03),#3C - ld (ix+#01),#FF - ld (ix+#04),#0F - ld (ix+#05),#05 - ld (ix+#21),#00 - ld (ix+#0A),#00 - ld (ix+#0B),#00 - ld (ix+#16),#FF - ld (ix+#17),#00 - ld (ix+#18),#00 - rst #28 ;!!!ошибка!!! - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - di - ld (ix+#06),e - ld (ix+#07),d - ld (ix+#0C),e - ld (ix+#0D),d - ex de,hl - add hl,bc - ld (ix+#08),l - ld (ix+#09),h - pop bc - push bc - dec b - ld c,b - ld b,#00 - sla c - push iy - pop hl - add hl,bc - push ix - pop bc -x09F4 ld (hl),c - inc hl - ld (hl),b - or a - rl (iy+#10) - pop bc - dec b - push bc - ld (ix+#02),b - jr nz,x09A0 - pop bc -x0A05 ld (iy+#27),#1A - ld (iy+#28),#0B - push iy - pop hl - ld bc,#002B - add hl,bc - ex de,hl - ld hl,x0A31 - ld bc,#000D - ldir - ld d,#07 - ld e,#F8 - call x0E7C ;вывод значения в регистр AY - ld d,#0B - ld e,#FF - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - jr x0A7D - -;АДРЕС: #0A31 расчет задержки -x0A31 rst #28 - db #A4 ; stk-ten. = x, 10 - db #01 ; exchange. = 10, x - db #05 ; division. = 10/x - db #34 ; stk-data. = 10/x, 7.33e-6 - db #DF ; - exponent $6F (floating point number 7.33e-6). - db #75 ; - mantissa byte 1 - db #F4 ; - mantissa byte 2 - db #38 ; - mantissa byte 3 - db #75 ; - mantissa byte 4 - db #05 ; division. = (10/x)/7.33e-6 - db #38 ; end-calc. - ret - -;АДРЕС: #0A3E опрос клавиши Break -x0A3E ld a,#7F - in a,(#FE) - rra - ret c - ld a,#FE - in a,(#FE) - rra - ret - -;АДРЕС: #0A4A установка указателя на данные для канала AY -x0A4A ld bc,#0011 - jr x0A52 - -;АДРЕС: #0A4F установка указателя на данные для канала AY -x0A4F ld bc,#0000 -x0A52 push iy - pop hl - add hl,bc - ld (iy+#23),l - ld (iy+#24),h - ld a,(iy+#10) - ld (iy+#22),a - ld (iy+#21),#01 - ret - -;АДРЕС: #0A67 установить адрес блока данных канала -x0A67 ld e,(hl) - inc hl - ld d,(hl) - push de - pop ix - ret - -;АДРЕС: #0A6E следующий канал -x0A6E ld l,(iy+#23) - ld h,(iy+#24) - inc hl - inc hl - ld (iy+#23),l - ld (iy+#24),h - ret - -x0A7D call x0A4F ;установка указателя на данные для канала AY -x0A80 rr (iy+#22) - jr c,x0A8C - call x0A67 ;установить адрес блокаданных канала - call x0B5C ;найти следующую ноту -x0A8C sla (iy+#21) - jr c,x0A97 - call x0A6E ;следующий канал - jr x0A80 -x0A97 call x0F91 ;найти наименьшую длительность - push de - call x0F42 ;проиграть ноты во всех каналах - pop de -x0A9F ld a,(iy+#10) - cp #FF - jr nz,x0AAB - call x0E93 ;гасим звуки во всех каналах - ei - ret -x0AAB dec de - call x0F76 ;ожидание - call x0FC1 ;проиграть ноты во всех каналах - call x0F91 ;найти наименьшую длительность - jr x0A9F - -;АДРЕС: #0AB7 список команд -x0AB7 db "HZYXWUVMT)(NO!" - -;АДРЕС: #0AC5 прочитать текущий символ из строки воспроизведения с инкрементом -;вых: cy=1 данных больше нет -x0AC5 call x0EE3 ;прочитать текущий символ из строки воспроизведения - ret c ;нет данных - inc (ix+#06) - ret nz - inc (ix+#07) - ret - -;АДРЕС: #0AD1 получить ноту в полутонах -x0AD1 push hl - ld c,#00 -x0AD4 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jr c,x0AE1 - cp "&" - jr nz,x0AEC - ld a,#80 -x0ADF pop hl - ret -x0AE1 ld a,(iy+#21) - or (iy+#10) - ld (iy+#10),a - jr x0ADF -x0AEC cp "#" - jr nz,x0AF3 - inc c - jr x0AD4 -x0AF3 cp "$" - jr nz,x0AFA - dec c - jr x0AD4 -x0AFA bit 5,a - jr nz,x0B04 - push af - ld a,#0C - add a,c - ld c,a - pop af -x0B04 and #DF - sub "A" - jp c,x0F22 ;k Invalid note name - cp #07 - jp nc,x0F22 ;k Invalid note name - push bc - ld b,#00 - ld c,a - ld hl,x0DF9 - add hl,bc - ld a,(hl) - pop bc - add a,c - pop hl - ret - -;АДРЕС: #0B1D получить числовое значение параметра -x0B1D push hl - push de - ld l,(ix+#06) - ld h,(ix+#07) - ld de,#0000 -x0B28 ld a,(hl) - cp "0" - jr c,x0B45 - cp "9"+1 - jr nc,x0B45 - inc hl - push hl - call x0B50 ;умножение de=de*10 - sub #30 - ld h,#00 - ld l,a - add hl,de - jr c,x0B42 ;переполнение - ex de,hl - pop hl - jr x0B28 -x0B42 jp x0F1A ;l number too big -x0B45 ld (ix+#06),l - ld (ix+#07),h - push de - pop bc - pop de - pop hl - ret - -;АДРЕС: #0B50 умножение de=de*10 -x0B50 ld hl,#0000 - ld b,#0A -x0B55 add hl,de - jr c,x0B42 ;переполнение - djnz x0B55 - ex de,hl - ret - -;АДРЕС: #0B5C найти следующую ноту -x0B5C call x0A3E ;опрос клавиши Break - jr c,x0B69 ;не нажата - call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #14 ;L Break into program -x0B69 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jp c,x0DA2 ;нет данных - call x0DF0 ;идентификация команды - ld b,#00 - sla c - ld hl,x0DCA - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - call x0B84 ;call (hl) - jr x0B5C -x0B83 ret -x0B84 jp (hl) - -;АДРЕС: #0B85 команда ! (коментарий) -x0B85 call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - jp c,x0DA1 ;конец строки - cp "!" - ret z - jr x0B85 - -;АДРЕС: #0B85 команда O (октава) -x0B90 call x0B1D ;получить числовое значение параметра - ld a,c - cp #09 - jp nc,x0F12 ;n Out of range - sla a - sla a - ld b,a - sla a - add a,b - ld (ix+#03),a - ret - -;АДРЕС: #0BA5 команда N (разделитель) -x0BA5 ret - -;АДРЕС: #0BA6 команда ( (начало цикла) -x0BA6 ld a,(ix+#0B) - inc a - cp #05 - jp z,x0F2A ;d Too many brackets - ld (ix+#0B),a - ld de,#000C - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - ld (hl),a - inc hl - ld a,(ix+#07) - ld (hl),a - ret - -;АДРЕС: #0BC2 команда ) (конец цикла) -x0BC2 ld a,(ix+#16) - ld de,#0017 - or a - jp m,x0BF0 - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - cp (hl) - jr nz,x0BF0 - inc hl - ld a,(ix+#07) - cp (hl) - jr nz,x0BF0 - dec (ix+#16) - ld a,(ix+#16) - or a - ret p - bit 0,(ix+#0A) - ret z - ld (ix+#16),#00 - xor a - jr x0C0B -x0BF0 ld a,(ix+#16) - inc a - cp #05 - jp z,x0F2A ;d Too many brackets - ld (ix+#16),a - call x0C27 ;получить адрес указателя - ld a,(ix+#06) - ld (hl),a - inc hl - ld a,(ix+#07) - ld (hl),a - ld a,(ix+#0B) -x0C0B ld de,#000C - call x0C27 ;получить адрес указателя - ld a,(hl) - ld (ix+#06),a - inc hl - ld a,(hl) - ld (ix+#07),a - dec (ix+#0B) - ret p - ld (ix+#0B),#00 - set 0,(ix+#0A) - ret - -;АДРЕС: #0C27 получить адрес указателя -x0C27 push ix - pop hl - add hl,de - ld b,#00 - ld c,a - sla c - add hl,bc - ret - -;АДРЕС: #0C32 команда T (темп) -x0C32 call x0B1D ;получить числовое значение параметра - ld a,b - or a - jp nz,x0F12 ;n Out of range - ld a,c - cp #3C - jp c,x0F12 ;n Out of range - cp #F1 - jp nc,x0F12 ;n Out of range - ld a,(ix+#02) - or a - ret nz - ld b,#00 - push bc - pop hl - add hl,hl - add hl,hl - push hl - pop bc - push iy - rst #28 - dw Rom1.x2D2B ;bc на стэк калькулятора - di - pop iy - push iy - push iy - pop hl - ld bc,#002B - add hl,bc - ld iy,#5C3A - push hl - ld hl,x0C76 - ld (x5B5A),hl - ld hl,x5B14 - ex (sp),hl - push hl - jp x5B00 -x0C76 di - rst #28 - dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора - di - pop iy - ld (iy+#27),c - ld (iy+#28),b - ret - -;АДРЕС: #0C84 команда M (микшер) -x0C84 call x0B1D ;получить числовое значение параметра - ld a,c - cp #40 - jp nc,x0F12 ;n Out of range - cpl - ld e,a - ld d,#07 - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0C95 команда V (громкость) -x0C95 call x0B1D ;получить числовое значение параметра - ld a,c - cp #10 - jp nc,x0F12 ;n Out of range - ld (ix+#04),a ;!!!ОШИБКА!!! - ld e,(ix+#02) - ld a,#08 - add a,e - ld d,a - ld e,c - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0CAD команда U (эффекты) -x0CAD ld e,(ix+#02) - ld a,#08 - add a,e - ld d,a - ld e,#1F - ld (ix+#04),e - ret - -;АДРЕС: #0CBA команда W (эффекты) -x0CBA call x0B1D ;получить числовое значение параметра - ld a,c - cp #08 - jp nc,x0F12 ;n Out of range - ld b,#00 - ld hl,x0DE8 - add hl,bc - ld a,(hl) - ld (iy+#29),a - ret - -;АДРЕС: #0CCE команда X (эффекты) -x0CCE call x0B1D ;получить числовое значение параметра - ld d,#0B - ld e,c - call x0E7C ;вывод значения в регистр AY - inc d - ld e,b - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0CDD команда Y (MIDI канал) -x0CDD call x0B1D ;получить числовое значение параметра - ld a,c - dec a - jp m,x0F12 ;n Out of range - cp #10 - jp nc,x0F12 ;n Out of range - ld (ix+#01),a - ret - -;АДРЕС: #0CEE команда Z (MIDI код) -x0CEE call x0B1D ;получить числовое значение параметра - ld a,c - call x11A3 ;загрузка байта в порт MIDI - ret - -;АДРЕС: #0CF6 команда H (стоп) -x0CF6 ld (iy+#10),#FF - ret - -;АДРЕС: #0CFB команды 'a'..'g', 'A'..'G', '1'.."12", '&', '_' -x0CFB call x0E19 ;это цифра? - jp c,x0D81 ;нет - call x0DAC ;расчет указателя на длительность - call x0DB4 ;установка длительности - xor a - ld (ix+#21),a - call x0EC8 ;получение предыдущего параматра - call x0B1D ;получить числовое значение параметра - ld a,c - or a - jp z,x0F12 ;n Out of range - cp #0D - jp nc,x0F12 ;n Out of range - cp #0A - jr c,x0D32 - call x0E00 ;получить длительность ноты - call x0D74 ;увеличение счетчика нот - ld (hl),e - inc hl - ld (hl),d -x0D28 call x0D74 ;увеличение счетчика нот - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl - jr x0D38 -x0D32 ld (ix+#05),c - call x0E00 ;получить длительность ноты -x0D38 call x0D74 ;увеличение счетчика нот -x0D3B call x0EE3 ;прочитать текущий символ из строки воспроизведения - cp "_" - jr nz,x0D6E - call x0AC5 ;прочитать текущий символ из строки воспроизведения с инкрементом - call x0B1D ;получить числовое значение параметра - ld a,c - cp #0A - jr c,x0D5F - push hl - push de - call x0E00 ;получить длительность ноты - pop hl - add hl,de - ld c,e - ld b,d - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d - ld e,c - ld d,b - jr x0D28 -x0D5F ld (ix+#05),c - push hl - push de - call x0E00 ;получить длительность ноты - pop hl - add hl,de - ex de,hl - pop hl - jp x0D3B -x0D6E ld (hl),e - inc hl - ld (hl),d - jp x0D9C - -;АДРЕС: #0D74 увеличение счетчика нот -x0D74 ld a,(ix+#21) - inc a - cp #0B - jp z,x0F3A ;o Too many tied notes - ld (ix+#21),a - ret - -x0D81 call x0EC8 ;получение предыдущего параматра - ld (ix+#21),#01 - call x0DAC ;расчет указателя на длительность - call x0DB4 ;установка длительности - ld c,(ix+#05) - push hl - call x0E00 ;получить длительность ноты - pop hl - ld (hl),e - inc hl - ld (hl),d - jp x0D9C ;!!!можно убрать -x0D9C pop hl - inc hl - inc hl - push hl - ret - -;АДРЕС: #0DA1 конец строки -x0DA1 pop hl -x0DA2 ld a,(iy+#21) - or (iy+#10) - ld (iy+#10),a - ret - -;АДРЕС: #0DAC расчет указателя на длительность -x0DAC push ix - pop hl - ld bc,#0022 - add hl,bc - ret - -;АДРЕС: #0DB4 установка длительности -x0DB4 push hl - push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - pop de - ld (hl),e - inc hl - ld (hl),d - ex de,hl - ret - -;АДРЕС: #0DCA таблица адресов обработки команд -x0DCA dw x0CFB ;прочие команды - dw x0B85 ; '!' - dw x0B90 ; 'O' - dw x0BA5 ; 'N' - dw x0BA6 ; '(' - dw x0BC2 ; ')' - dw x0C32 ; 'T' - dw x0C84 ; 'M' - dw x0C95 ; 'V' - dw x0CAD ; 'U' - dw x0CBA ; 'W' - dw x0CCE ; 'X' - dw x0CDD ; 'Y' - dw x0CEE ; 'Z' - dw x0CF6 ; 'H' - -;таблица огибающих -x0DE8 db #00 ; W0 - Single decay then off. (Continue off, attack off, alternate off, hold off) - db #04 ; W1 - Single attack then off. (Continue off, attack on, alternate off, hold off) - db #0B ; W2 - Single decay then hold. (Continue on, attack off, alternate on, hold on) - db #0D ; W3 - Single attack then hold. (Continue on, attack on, alternate off, hold on) - db #08 ; W4 - Repeated decay. (Continue on, attack off, alternate off, hold off) - db #0C ; W5 - Repeated attack. (Continue on, attack on, alternate off, hold off) - db #0E ; W6 - Repeated attack-decay. (Continue on, attack on, alternate on, hold off) - db #0A ; W7 - Repeated decay-attack. (Continue on, attack off, alternate on, hold off) - -;АДРЕС: #0DF0 идентификация команды -;вых: z - команда найдена -x0DF0 ld bc,#000F - ld hl,x0AB7 - cpir - ret - -;таблица полутонов -x0DF9 db #09 ; 'A' - db #0B ; 'B' - db #00 ; 'C' - db #02 ; 'D' - db #04 ; 'E' - db #05 ; 'F' - db #07 ; 'G' - -;АДРЕС: #0E00 получить длительность ноты -x0E00 push hl - ld b,#00 - ld hl,x0E0C - add hl,bc - ld d,#00 - ld e,(hl) - pop hl - ret -;длительность нот -x0E0C db #80 ; Rest [Not used since table is always indexed into with a value of 1 or more] - db #06 ; Semi-quaver (sixteenth note). - db #09 ; Dotted semi-quaver (3/32th note). - db #0C ; Quaver (eighth note). - db #12 ; Dotted quaver (3/16th note). - db #18 ; Crotchet (quarter note). - db #24 ; Dotted crotchet (3/8th note). - db #30 ; Minim (half note). - db #48 ; Dotted minim (3/4th note). - db #60 ; Semi-breve (whole note). - db #04 ; Triplet semi-quaver (1/24th note). - db #08 ; Triplet quaver (1/12th note). - db #10 ; Triplet crochet (1/6th note). - -;АДРЕС: #0E19 это цифра? -;вых: cy=0 это цифра -x0E19 cp "0" - ret c - cp "9"+1 - ccf - ret - -;АДРЕС: #0E20 проиграть ноту в канале -x0E20 ld c,a - ld a,(ix+#03) - add a,c - cp #80 - jp nc,x0F32 ;m Note out of range - ld c,a - ld a,(ix+#02) - or a - jr nz,x0E3F - ld a,c - cpl - and #7F - srl a - srl a - ld d,#06 - ld e,a - call x0E7C ;вывод значения в регистр AY -x0E3F ld (ix+#00),c - ld a,(ix+#02) - cp #03 - ret nc - ld hl,x1096 - ld b,#00 - ld a,c - sub #15 - jr nc,x0E57 - ld de,#0FBF - jr x0E5E -x0E57 ld c,a - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) -x0E5E ex de,hl - ld d,(ix+#02) - sla d - ld e,l - call x0E7C ;вывод значения в регистр AY - inc d - ld e,h - call x0E7C ;вывод значения в регистр AY - bit 4,(ix+#04) - ret z - ld d,#0D - ld a,(iy+#29) - ld e,a - call x0E7C ;вывод значения в регистр AY - ret - -;АДРЕС: #0E7C вывод значения в регистр AY -x0E7C push bc - ld bc,#FFFD - out (c),d - ld bc,#BFFD - out (c),e - pop bc - ret - -;АДРЕС: #0E89 чтение регистра AY -x0E89 push bc - ld bc,#FFFD - out (c),a - in a,(c) - pop bc - ret - -;АДРЕС: #0E93 гасим звуки во всех каналах -x0E93 ld d,#07 - ld e,#FF - call x0E7C ;вывод значения в регистр AY - ld d,#08 - ld e,#00 - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - inc d - call x0E7C ;вывод значения в регистр AY - call x0A4F ;установка указателя на данные для канала AY -x0EAC rr (iy+#22) - jr c,x0EB8 - call x0A67 ;установить адрес блока данных канала - call x118D ;гасим звук в канале MIDI -x0EB8 sla (iy+#21) - jr c,x0EC3 - call x0A6E ;следующий канал - jr x0EAC -x0EC3 ld iy,#5C3A - ret - -;АДРЕС: #0EC8 получение предыдущего параматра -x0EC8 push hl - push de - ld l,(ix+#06) - ld h,(ix+#07) -x0ED0 dec hl - ld a,(hl) - cp " " - jr z,x0ED0 - cp #0D - jr z,x0ED0 - ld (ix+#06),l - ld (ix+#07),h - pop de - pop hl - ret - -;АДРЕС: #0EE3 прочитать текущий символ из строки воспроизведения -;вых: cy=1 данных больше нет -x0EE3 push hl - push de - push bc - ld l,(ix+#06) - ld h,(ix+#07) -x0EEC ld a,h - cp (ix+#09) - jr nz,x0EFB - ld a,l - cp (ix+#08) - jr nz,x0EFB - scf - jr x0F05 -x0EFB ld a,(hl) - cp " " - jr z,x0F09 - cp #0D - jr z,x0F09 - or a -x0F05 pop bc - pop de - pop hl - ret -x0F09 inc hl - ld (ix+#06),l - ld (ix+#07),h - jr x0EEC - -;АДРЕС: #0F12 обработка ошибок -x0F12 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #29 ;n Out of range -x0F1A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #27 ;l Number too big -x0F22 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #26 ;k Invalid note name -x0F2A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #1F ;d Too many brackets -x0F32 call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #28 ;m Note out of range -x0F3A call x0E93 ;гасим звуки во всех каналах - ei - call x05AC - db #2A ;o Too many tied notes - -;АДРЕС: #0F42 проиграть ноты во всех каналах -x0F42 call x0A4F ;установка указателя на данные для канала AY -x0F45 rr (iy+#22) - jr c,x0F6C - call x0A67 ;установить адрес блока данных канала - call x0AD1 ;получить ноту в полутонах - cp #80 - jr z,x0F6C - call x0E20 ;проиграть ноту в канале - ld a,(ix+#02) - cp #03 - jr nc,x0F69 - ld d,#08 - add a,d - ld d,a - ld e,(ix+#04) - call x0E7C ;вывод значения в регистр AY -x0F69 call x116E ;проиграть ноту в канале MIDI -x0F6C sla (iy+#21) - ret c - call x0A6E ;следующий канал - jr x0F45 - -;АДРЕС: #0F76 ожидание -x0F76 push hl - ld l,(iy+#27) - ld h,(iy+#28) - ld bc,#0064 - or a - sbc hl,bc - push hl - pop bc - pop hl -x0F86 dec bc - ld a,b - or c - jr nz,x0F86 - dec de - ld a,d - or e - jr nz,x0F76 - ret - -;АДРЕС: #0F91 найти наименьшую длительность -x0F91 ld de,#FFFF - call x0A4A ;установка указателя на данные для канала AY -x0F97 rr (iy+#22) - jr c,x0FAF - push de - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld e,(hl) - inc hl - ld d,(hl) - push de - pop hl - pop bc - or a - sbc hl,bc - jr c,x0FAF - push bc - pop de -x0FAF sla (iy+#21) - jr c,x0FBA - call x0A6E ;следующий канал - jr x0F97 -x0FBA ld (iy+#25),e - ld (iy+#26),d - ret - -;АДРЕС: #0FC1 проиграть ноты во всех каналах -x0FC1 xor a - ld (iy+#2A),a - call x0A4F ;установка указателя на данные для канала AY -x0FC8 rr (iy+#22) - jp c,x105A - call x0A67 ;установить адрес блока данных канала - push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - push hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld e,(iy+#25) - ld d,(iy+#26) - or a - sbc hl,de - ex de,hl - pop hl - jr z,x0FFC - ld (hl),e - inc hl - ld (hl),d - jr x105A -x0FFC ld a,(ix+#02) - cp #03 - jr nc,x100C - ld d,#08 - add a,d - ld d,a - ld e,#00 - call x0E7C ;вывод значения в регистр AY -x100C call x118D ;гасим звук в канале MIDI - push ix - pop hl - ld bc,#0021 - add hl,bc - dec (hl) - jr nz,x1026 - call x0B5C ;найти следующую ноту - ld a,(iy+#21) - and (iy+#10) - jr nz,x105A - jr x103D -x1026 push iy - pop hl - ld bc,#0011 - add hl,bc - ld b,#00 - ld c,(ix+#02) - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - inc de - inc de - ld (hl),d - dec hl - ld (hl),e -x103D call x0AD1 ;получить ноту в полутонах - ld c,a - ld a,(iy+#21) - and (iy+#10) - jr nz,x105A - ld a,c - cp #80 - jr z,x105A - call x0E20 ;проиграть ноту в канале - ld a,(iy+#21) - or (iy+#2A) - ld (iy+#2A),a -x105A sla (iy+#21) - jr c,x1066 - call x0A6E ;следующий канал - jp x0FC8 -x1066 ld de,#0001 - call x0F76 ;ожидание - call x0A4F ;установка указателя на данные для канала AY -x106F rr (iy+#2A) - jr nc,x108C - call x0A67 ;установить адрес блока данных канала - ld a,(ix+#02) - cp #03 - jr nc,x1089 - ld d,#08 - add a,d - ld d,a - ld e,(ix+#04) - call x0E7C ;вывод значения в регистр AY -x1089 call x116E ;проиграть ноту в канале MIDI -x108C sla (iy+#21) - ret c - call x0A6E ;следующий канал - jr x106F - -;таблица нот -x1096 dw #0FBF; Octave 1, Note 21 - A (27.50 Hz, Ideal=27.50 Hz, Error=-0.01%) C0 - dw #0EDC; Octave 1, Note 22 - A# (29.14 Hz, Ideal=29.16 Hz, Error=-0.08%) - dw #0E07; Octave 1, Note 23 - B (30.87 Hz, Ideal=30.87 Hz, Error=-0.00%) - - dw #0D3D; Octave 2, Note 24 - C (32.71 Hz, Ideal=32.70 Hz, Error=+0.01%) C1 - dw #0C7F; Octave 2, Note 25 - C# (34.65 Hz, Ideal=34.65 Hz, Error=-0.00%) - dw #0BCC; Octave 2, Note 26 - D (36.70 Hz, Ideal=36.71 Hz, Error=-0.01%) - dw #0B22; Octave 2, Note 27 - D# (38.89 Hz, Ideal=38.89 Hz, Error=+0.01%) - dw #0A82; Octave 2, Note 28 - E (41.20 Hz, Ideal=41.20 Hz, Error=+0.00%) - dw #09EB; Octave 2, Note 29 - F (43.66 Hz, Ideal=43.65 Hz, Error=+0.00%) - dw #095D; Octave 2, Note 30 - F# (46.24 Hz, Ideal=46.25 Hz, Error=-0.02%) - dw #08D6; Octave 2, Note 31 - G (49.00 Hz, Ideal=49.00 Hz, Error=+0.00%) - dw #0857; Octave 2, Note 32 - G# (51.92 Hz, Ideal=51.91 Hz, Error=+0.01%) - dw #07DF; Octave 2, Note 33 - A (55.01 Hz, Ideal=55.00 Hz, Error=+0.01%) - dw #076E; Octave 2, Note 34 - A# (58.28 Hz, Ideal=58.33 Hz, Error=-0.08%) - dw #0703; Octave 2, Note 35 - B (61.75 Hz, Ideal=61.74 Hz, Error=+0.02%) - - dw #069F; Octave 3, Note 36 - C ( 65.39 Hz, Ideal= 65.41 Hz, Error=-0.02%) C2 - dw #0640; Octave 3, Note 37 - C# ( 69.28 Hz, Ideal= 69.30 Hz, Error=-0.04%) - dw #05E6; Octave 3, Note 38 - D ( 73.40 Hz, Ideal= 73.42 Hz, Error=-0.01%) - dw #0591; Octave 3, Note 39 - D# ( 77.78 Hz, Ideal= 77.78 Hz, Error=+0.01%) - dw #0541; Octave 3, Note 40 - E ( 82.41 Hz, Ideal= 82.41 Hz, Error=+0.00%) - dw #04F6; Octave 3, Note 41 - F ( 87.28 Hz, Ideal= 87.31 Hz, Error=-0.04%) - dw #04AE; Octave 3, Note 42 - F# ( 92.52 Hz, Ideal= 92.50 Hz, Error=+0.02%) - dw #046B; Octave 3, Note 43 - G ( 98.00 Hz, Ideal= 98.00 Hz, Error=+0.00%) - dw #042C; Octave 3, Note 44 - G# (103.78 Hz, Ideal=103.83 Hz, Error=-0.04%) - dw #03F0; Octave 3, Note 45 - A (109.96 Hz, Ideal=110.00 Hz, Error=-0.04%) - dw #03B7; Octave 3, Note 46 - A# (116.55 Hz, Ideal=116.65 Hz, Error=-0.08%) - dw #0382; Octave 3, Note 47 - B (123.43 Hz, Ideal=123.47 Hz, Error=-0.03%) - - dw #034F; Octave 4, Note 48 - C (130.86 Hz, Ideal=130.82 Hz, Error=+0.04%) C3 - dw #0320; Octave 4, Note 49 - C# (138.55 Hz, Ideal=138.60 Hz, Error=-0.04%) - dw #02F3; Octave 4, Note 50 - D (146.81 Hz, Ideal=146.83 Hz, Error=-0.01%) - dw #02C8; Octave 4, Note 51 - D# (155.68 Hz, Ideal=155.55 Hz, Error=+0.08%) - dw #02A1; Octave 4, Note 52 - E (164.70 Hz, Ideal=164.82 Hz, Error=-0.07%) - dw #027B; Octave 4, Note 53 - F (174.55 Hz, Ideal=174.62 Hz, Error=-0.04%) - dw #0257; Octave 4, Note 54 - F# (185.04 Hz, Ideal=185.00 Hz, Error=+0.02%) - dw #0236; Octave 4, Note 55 - G (195.83 Hz, Ideal=196.00 Hz, Error=-0.09%) - dw #0216; Octave 4, Note 56 - G# (207.57 Hz, Ideal=207.65 Hz, Error=-0.04%) - dw #01F8; Octave 4, Note 57 - A (219.92 Hz, Ideal=220.00 Hz, Error=-0.04%) - dw #01DC; Octave 4, Note 58 - A# (232.86 Hz, Ideal=233.30 Hz, Error=-0.19%) - dw #01C1; Octave 4, Note 59 - B (246.86 Hz, Ideal=246.94 Hz, Error=-0.03%) - - dw #01A8; Octave 5, Note 60 - C (261.42 Hz, Ideal=261.63 Hz, Error=-0.08%) C4 Middle C - dw #0190; Octave 5, Note 61 - C# (277.10 Hz, Ideal=277.20 Hz, Error=-0.04%) - dw #0179; Octave 5, Note 62 - D (294.01 Hz, Ideal=293.66 Hz, Error=+0.12%) - dw #0164; Octave 5, Note 63 - D# (311.35 Hz, Ideal=311.10 Hz, Error=+0.08%) - dw #0150; Octave 5, Note 64 - E (329.88 Hz, Ideal=329.63 Hz, Error=+0.08%) - dw #013D; Octave 5, Note 65 - F (349.65 Hz, Ideal=349.23 Hz, Error=+0.12%) - dw #012C; Octave 5, Note 66 - F# (369.47 Hz, Ideal=370.00 Hz, Error=-0.14%) - dw #011B; Octave 5, Note 67 - G (391.66 Hz, Ideal=392.00 Hz, Error=-0.09%) - dw #010B; Octave 5, Note 68 - G# (415.13 Hz, Ideal=415.30 Hz, Error=-0.04%) - dw #00FC; Octave 5, Note 69 - A (439.84 Hz, Ideal=440.00 Hz, Error=-0.04%) - dw #00EE; Octave 5, Note 70 - A# (465.72 Hz, Ideal=466.60 Hz, Error=-0.19%) - dw #00E0; Octave 5, Note 71 - B (494.82 Hz, Ideal=493.88 Hz, Error=+0.19%) - - dw #00D4; Octave 6, Note 72 - C (522.83 Hz, Ideal=523.26 Hz, Error=-0.08%) C5 - dw #00C8; Octave 6, Note 73 - C# (554.20 Hz, Ideal=554.40 Hz, Error=-0.04%) - dw #00BD; Octave 6, Note 74 - D (586.46 Hz, Ideal=587.32 Hz, Error=-0.15%) - dw #00B2; Octave 6, Note 75 - D# (622.70 Hz, Ideal=622.20 Hz, Error=+0.08%) - dw #00A8; Octave 6, Note 76 - E (659.77 Hz, Ideal=659.26 Hz, Error=+0.08%) - dw #009F; Octave 6, Note 77 - F (697.11 Hz, Ideal=698.46 Hz, Error=-0.19%) - dw #0096; Octave 6, Note 78 - F# (738.94 Hz, Ideal=740.00 Hz, Error=-0.14%) - dw #008D; Octave 6, Note 79 - G (786.10 Hz, Ideal=784.00 Hz, Error=+0.27%) - dw #0085; Octave 6, Note 80 - G# (833.39 Hz, Ideal=830.60 Hz, Error=+0.34%) - dw #007E; Octave 6, Note 81 - A (879.69 Hz, Ideal=880.00 Hz, Error=-0.04%) - dw #0077; Octave 6, Note 82 - A# (931.43 Hz, Ideal=933.20 Hz, Error=-0.19%) - dw #0070; Octave 6, Note 83 - B (989.65 Hz, Ideal=987.76 Hz, Error=+0.19%) - - dw #006A; Octave 7, Note 84 - C (1045.67 Hz, Ideal=1046.52 Hz, Error=-0.08%) C6 - dw #0064; Octave 7, Note 85 - C# (1108.41 Hz, Ideal=1108.80 Hz, Error=-0.04%) - dw #005E; Octave 7, Note 86 - D (1179.16 Hz, Ideal=1174.64 Hz, Error=+0.38%) - dw #0059; Octave 7, Note 87 - D# (1245.40 Hz, Ideal=1244.40 Hz, Error=+0.08%) - dw #0054; Octave 7, Note 88 - E (1319.53 Hz, Ideal=1318.52 Hz, Error=+0.08%) - dw #004F; Octave 7, Note 89 - F (1403.05 Hz, Ideal=1396.92 Hz, Error=+0.44%) - dw #004B; Octave 7, Note 90 - F# (1477.88 Hz, Ideal=1480.00 Hz, Error=-0.14%) - dw #0047; Octave 7, Note 91 - G (1561.14 Hz, Ideal=1568.00 Hz, Error=-0.44%) - dw #0043; Octave 7, Note 92 - G# (1654.34 Hz, Ideal=1661.20 Hz, Error=-0.41%) - dw #003F; Octave 7, Note 93 - A (1759.38 Hz, Ideal=1760.00 Hz, Error=-0.04%) - dw #003B; Octave 7, Note 94 - A# (1878.65 Hz, Ideal=1866.40 Hz, Error=+0.66%) - dw #0038; Octave 7, Note 95 - B (1979.30 Hz, Ideal=1975.52 Hz, Error=+0.19%) - - dw #0035; Octave 8, Note 96 - C (2091.33 Hz, Ideal=2093.04 Hz, Error=-0.08%) C7 - dw #0032; Octave 8, Note 97 - C# (2216.81 Hz, Ideal=2217.60 Hz, Error=-0.04%) - dw #002F; Octave 8, Note 98 - D (2358.31 Hz, Ideal=2349.28 Hz, Error=+0.38%) - dw #002D; Octave 8, Note 99 - D# (2463.13 Hz, Ideal=2488.80 Hz, Error=-1.03%) - dw #002A; Octave 8, Note 100 - E (2639.06 Hz, Ideal=2637.04 Hz, Error=+0.08%) - dw #0028; Octave 8, Note 101 - F (2771.02 Hz, Ideal=2793.84 Hz, Error=-0.82%) - dw #0025; Octave 8, Note 102 - F# (2995.69 Hz, Ideal=2960.00 Hz, Error=+1.21%) - dw #0023; Octave 8, Note 103 - G (3166.88 Hz, Ideal=3136.00 Hz, Error=+0.98%) - dw #0021; Octave 8, Note 104 - G# (3358.81 Hz, Ideal=3322.40 Hz, Error=+1.10%) - dw #001F; Octave 8, Note 105 - A (3575.50 Hz, Ideal=3520.00 Hz, Error=+1.58%) - dw #001E; Octave 8, Note 106 - A# (3694.69 Hz, Ideal=3732.80 Hz, Error=-1.02%) - dw #001C; Octave 8, Note 107 - B (3958.59 Hz, Ideal=3951.04 Hz, Error=+0.19%) - - dw #001A; Octave 9, Note 108 - C (4263.10 Hz, Ideal=4186.08 Hz, Error=+1.84%) C8 - dw #0019; Octave 9, Note 109 - C# (4433.63 Hz, Ideal=4435.20 Hz, Error=-0.04%) - dw #0018; Octave 9, Note 110 - D (4618.36 Hz, Ideal=4698.56 Hz, Error=-1.71%) - dw #0016; Octave 9, Note 111 - D# (5038.21 Hz, Ideal=4977.60 Hz, Error=+1.22%) - dw #0015; Octave 9, Note 112 - E (5278.13 Hz, Ideal=5274.08 Hz, Error=+0.08%) - dw #0014; Octave 9, Note 113 - F (5542.03 Hz, Ideal=5587.68 Hz, Error=-0.82%) - dw #0013; Octave 9, Note 114 - F# (5833.72 Hz, Ideal=5920.00 Hz, Error=-1.46%) - dw #0012; Octave 9, Note 115 - G (6157.81 Hz, Ideal=6272.00 Hz, Error=-1.82%) - dw #0011; Octave 9, Note 116 - G# (6520.04 Hz, Ideal=6644.80 Hz, Error=-1.88%) - dw #0010; Octave 9, Note 117 - A (6927.54 Hz, Ideal=7040.00 Hz, Error=-1.60%) - dw #000F; Octave 9, Note 118 - A# (7389.38 Hz, Ideal=7465.60 Hz, Error=-1.02%) - dw #000E; Octave 9, Note 119 - B (7917.19 Hz, Ideal=7902.08 Hz, Error=+0.19%) - - dw #000D; Octave 10, Note 120 - C ( 8526.20 Hz, Ideal= 8372.16 Hz, Error=+1.84%) C9 - dw #000C; Octave 10, Note 121 - C# ( 9236.72 Hz, Ideal= 8870.40 Hz, Error=+4.13%) - dw #000C; Octave 10, Note 122 - D ( 9236.72 Hz, Ideal= 9397.12 Hz, Error=-1.71%) - dw #000B; Octave 10, Note 123 - D# (10076.42 Hz, Ideal= 9955.20 Hz, Error=+1.22%) - dw #000B; Octave 10, Note 124 - E (10076.42 Hz, Ideal=10548.16 Hz, Error=-4.47%) - dw #000A; Octave 10, Note 125 - F (11084.06 Hz, Ideal=11175.36 Hz, Error=-0.82%) - dw #0009; Octave 10, Note 126 - F# (12315.63 Hz, Ideal=11840.00 Hz, Error=+4.02%) - dw #0009; Octave 10, Note 127 - G (12315.63 Hz, Ideal=12544.00 Hz, Error=-1.82%) - dw #0008; Octave 10, Note 128 - G# (13855.08 Hz, Ideal=13289.60 Hz, Error=+4.26%) - -;АДРЕС: #116E проиграть ноту в канале MIDI -x116E ld a,(ix+#01) - or a - ret m - or #90 - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#00) - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#04) - res 4,a - sla a - sla a - sla a - call x11A3 ;загрузка байта в порт MIDI - ret - -;АДРЕС: #118D гасим звук в канале MIDI -x118D ld a,(ix+#01) - or a - ret m - or #80 - call x11A3 ;загрузка байта в порт MIDI - ld a,(ix+#00) - call x11A3 ;загрузка байта в порт MIDI - ld a,#40 - call x11A3 ;загрузка байта в порт MIDI - ret ;!!!можно оптимизировать - -;АДРЕС: #11A3 загрузка байта в порт MIDI -x11A3 ld l,a - ld bc,#FFFD - ld a,#0E - out (c),a - ld bc,#BFFD - ld a,#FA ;Set RS232 'RXD' transmit line to 0 - out (c),a - ld e,#03 ;задержка 113 тактов -x11B4 dec e - jr nz,x11B4 - nop - nop - nop - nop - ld a,l - ld d,#08 -x11BE rra - ld l,a - jp nc,x11C9 - ld a,#FE ;Set RS232 'RXD' transmit line to 1 - out (c),a - jr x11CF -x11C9 ld a,#FA ;Set RS232 'RXD' transmit line to 0 - out (c),a - jr x11CF -x11CF ld e,#02 -x11D1 dec e - jr nz,x11D1 - nop - add a,#00 - ld a,l - dec d - jr nz,x11BE - nop - nop - add a,#00 - nop - nop - ld a,#FE ;Set RS232 'RXD' transmit line to 0 - out (c),a - ld e,#06 -x11E7 dec e - jr nz,x11E7 - ret - -;АДРЕС: #11EB команда SAVE -x11EB ld hl,x5B66 - set 5,(hl) - jr x1205 - -;АДРЕС: #11F2 команда LOAD -x11F2 ld hl,x5B66 - set 4,(hl) - jr x1205 - -;АДРЕС: #11F2 команда VERIFY -x11F9 ld hl,x5B66 - set 7,(hl) - jr x1205 - -;АДРЕС: #1200 команда MERGE -x1200 ld hl,x5B66 - set 6,(hl) -x1205 ld hl,x5B66 ;!!!лишнее - res 3,(hl) - rst #18 ;чтение очередного символа строки программы - cp "!" - jp nz,x13BE ;работа с лентой - ld hl,x5B66 - set 3,(hl) - rst #20 ;получение следующего символа из бейсик программы - jp x13BE ;работа с RAM диском - -;АДРЕС: #1219 ошибка C Nonsense in BASIC -x1219 call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #121D работа с RAM диском -x121D ld (x5B74),hl - ld a,(ix+#00) - ld (x5B71),a - ld l,(ix+#0B) - ld h,(ix+#0C) - ld (x5B72),hl - ld l,(ix+#0D) - ld h,(ix+#0E) - ld (x5B78),hl - ld l,(ix+#0F) - ld h,(ix+#10) - ld (x5B76),hl - or a - jr z,x124E ;BASIC - cp #03 - jr z,x124E ;CODE/SCREEN$ - ld a,(ix+#0E) ;DATA - ld (x5B76),a -x124E push ix - pop hl - inc hl - ld de,x5B67 - ld bc,#000A - ldir - ld hl,x5B66 - bit 5,(hl) - jp nz,x1BAD ;SAVE - ld hl,x5B71 - ld de,x5B7A - ld bc,#0007 - ldir - call x1C2E ;загрузка заголовка файла из RAM диска - ld a,(x5B7A) - ld b,a - ld a,(x5B71) - cp b - jr nz,x1280 ;b Wrong file type - cp #03 - jr z,x1290 - jr c,x1284 -x1280 call x05AC - db #1D ;b Wrong file type -x1284 ld a,(x5B66) - bit 6,a - jr nz,x12C5 - bit 7,a - jp z,x12DB -x1290 ld a,(x5B66) - bit 6,a - jr z,x129B - call x05AC - db #1C ;a MERGE error -x129B ld hl,(x5B7B) - ld de,(x5B72) - ld a,h - or l - jr z,x12AE - sbc hl,de - jr nc,x12AE - call x05AC - db #1E ;c CODE error -x12AE ld hl,(x5B7B+2) - ld a,h - or l - jr nz,x12B8 - ld hl,(x5B74) -x12B8 ld a,(x5B71) - and a - jr nz,x12C1 - ld hl,(#5C53) -x12C1 call x137E ;загрузка данных с RAM диска - ret -x12C5 ld bc,(x5B72) - push bc - inc bc - rst #28 - dw Rom1.x0030 ;резервирование памяти -x12CE ld (hl),#80 - ex de,hl - pop de - push hl - call x137E ;загрузка данных с RAM диска - pop hl - rst #28 - dw Rom1.x08CE ;MERGE - ret -x12DB ld de,(x5B72) - ld hl,(x5B7B+2) - push hl - ld a,h - or l - jr nz,x12ED - inc de - inc de - inc de - ex de,hl - jr x12F6 -x12ED ld hl,(x5B7B) - ex de,hl - scf - sbc hl,de - jr c,x12FF -x12F6 ld de,#0005 - add hl,de - ld b,h - ld c,l - rst #28 - dw Rom1.x1F05 ;проверка наличия свободной памяти -x12FF pop hl - ld a,(x5B71) - and a - jr z,x1335 - ld a,h - or l - jr z,x1315 - dec hl - ld b,(hl) - dec hl - ld c,(hl) - dec hl - inc bc - inc bc - inc bc - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x1315 ld hl,(#5C59) - dec hl - ld bc,(x5B72) - push bc - inc bc - inc bc - inc bc - ld a,(x5B7F) - push af - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - pop af - ld (hl),a - pop de - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl -x1331 call x137E ;загрузка данных с RAM диска - ret -x1335 ld hl,x5B66 - res 1,(hl) - ld de,(#5C53) - ld hl,(#5C59) - dec hl - rst #28 - dw Rom1.x19E5 ;удалить переменные - ld bc,(x5B72) - ld hl,(#5C53) - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - ld bc,(x5B76) - add hl,bc - ld (#5C4B),hl - ld a,(x5B78+1) - ld h,a - and #C0 - jr nz,x1370 - ld a,(x5B78) - ld l,a - ld (#5C42),hl - ld (iy+#0A),#00 - ld hl,x5B66 - set 1,(hl) -x1370 ld hl,(#5C53) - ld de,(x5B72) - dec hl - ld (#5C57),hl - inc hl - jr x1331 ;!!!можно удалить - -;АДРЕС: #137E загрузка данных с RAM диска -x137E ld a,d - or e - ret z - call x1C4B ;загрузка из RAM диска - ret - -;АДРЕС: #1385 получить выражения из строки бейсика -x1385 rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - ret z ;проверка синтаксиса - push af - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - pop af - ret - -;АДРЕС: #1393 проверка и копирование имени файла -x1393 rst #20 - call x1385 ;получить выражения из строки бейсика - ret z ;проверка синтаксиса - push af - ld a,c - or b - jr z,x13BA ;ошибка в имени файла - ld hl,#000A - sbc hl,bc - jr c,x13BA ;ошибка в имени файла - push de - push bc - ld hl,x5B67 - ld b,#0A - ld a," " -x13AD ld (hl),a - inc hl - djnz x13AD - pop bc - pop hl - ld de,x5B67 - ldir - pop af - ret -x13BA call x05AC - db #21 ;f Invalid name - -;АДРЕС: #13BE работа с лентой/RAM диском -x13BE rst #28 - dw Rom1.x1C8C ;параметр - строка - bit 7,(iy+#01) - jr z,x1407 ;проверка синтаксиса - ld bc,#0011 - ld a,(#5C74) - and a - jr z,x13D2 ;SAVE - ld c,#22 ;" -x13D2 rst #28 - dw Rom1.x0030 ;резервирование памяти - push de - pop ix - ld b,#0B - ld a," " -x13DC ld (de),a - inc de - djnz x13DC - ld (ix+#01),#FF - rst #28 - dw Rom1.x2BF1 ;прочитать значение со стэка калькулятора - ld hl,-10 - dec bc - add hl,bc - inc bc - jr nc,x1400 - ld a,(#5C74) - and a - jr nz,x13F9 ;не SAVE - call x05AC ;ошибка - db #0E ;F Invalid file name -x13F9 ld a,b - or c - jr z,x1407 - ld bc,#000A -x1400 push ix - pop hl - inc hl - ex de,hl - ldir -x1407 rst #18 ;чтение очередного символа строки программы - cp #E4 ;это DATA? - jr nz,x145F ;нет - ld a,(#5C74) ; 'xxx' "name" DATA - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x28B2 ;LOOK-VARS - jr nc,x142F - ld hl,#0000 - bit 6,(iy+#01) - jr z,x1425 - set 7,c -x1425 ld a,(#5C74) - dec a - jr z,x1444 - call x05AC ;ошибка запись или проверка пустого массива - db #01 ;2 Variable not found -x142F jp nz,x1219 ;C Nonsense in BASIC - bit 7,(iy+#01) - jr z,x1451 ;проверка синтаксиса - ld c,(hl) - inc hl - ld a,(hl) - ld (ix+#0B),a - inc hl - ld a,(hl) - ld (ix+#0C),a - inc hl -x1444 ld (ix+#0E),c - ld a,#01 ;числовой массив - bit 6,c - jr z,x144E - inc a ;символьный массив -x144E ld (ix+#00),a -x1451 ex de,hl - rst #20 ;чтение следующего символа строки программы - cp ")" - jr nz,x142F - rst #20 ;чтение следующего символа строки программы - call x18A1 - ex de,hl - jp x1519 -x145F cp #AA ;SCREEN$ ? - jr nz,x1482 ;нет - ld a,(#5C74) ; 'xxx' "name" SCREEN$ - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - call x18A1 - ld (ix+#0B),#00 - ld (ix+#0C),#1B - ld hl,#4000 - ld (ix+#0D),l - ld (ix+#0E),h - jr x14CF -x1482 cp #AF ;CODE ? - jr nz,x14D5 ;нет - ld a,(#5C74) ; 'xxx' "name" CODE - cp #03 ;это MERGE? - jp z,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x2048 ;PR-ST-END - jr nz,x14A0 - ld a,(#5C74) - and a - jp z,x1219 ;C Nonsense in BASIC - rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x14AF -x14A0 rst #28 - dw Rom1.x1C82 ;получение числового значения - rst #18 ;чтение очередного символа строки программы - cp "," - jr z,x14B4 - ld a,(#5C74) - and a - jp z,x1219 ;C Nonsense in BASIC -x14AF rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x14B8 -x14B4 rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x1C82 ;получение числового значения -x14B8 call x18A1 - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0B),c - ld (ix+#0C),b - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0D),c - ld (ix+#0E),b - ld h,b - ld l,c -x14CF ld (ix+#00),#03 - jr x1519 -x14D5 cp #CA ;LINE ? - jr z,x14E2 ;да - call x18A1 ;'xxx "name"' / 'SAVE "name" LINE' - ld (ix+#0E),#80 - jr x14F9 -x14E2 ld a,(#5C74) - and a ;SAVE ? - jp nz,x1219 ;C Nonsense in BASIC - rst #20 ;чтение следующего символа строки программы - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x1E99 ;извлечь операнд - ld (ix+#0D),c - ld (ix+#0E),b -x14F9 ld (ix+#00),#00 - ld hl,(#5C59) - ld de,(#5C53) - scf - sbc hl,de - ld (ix+#0B),l - ld (ix+#0C),h - ld hl,(#5C4B) - sbc hl,de - ld (ix+#0F),l - ld (ix+#10),h - ex de,hl -x1519 ld a,(x5B66) - bit 3,a - jp nz,x121D ;операция с RAM диском - ld a,(#5C74) - and a ;это SAVE ? - jr nz,x152B ;нет - rst #28 - dw Rom1.x0970 ;SAVE - ret -x152B rst #28 - dw Rom1.x0761 ;LOAD/MERGE/VERIFY - ret - -;АДРЕС: #152F печать бейсик программы от текущей строки -x152F ld hl,#EEF5 - res 0,(hl) - set 1,(hl) -x1536 ld hl,(#5C49) ;номер строки - ld a,h - or l - jr nz,x1540 - ld (#EC06),hl -x1540 ld a,(#F9DB) - push af - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - ld (#F9D7),hl - call x3222 ;установка буфера редактирования в верху экрана - call x30D6 ;установка буфера редактирования внизу экрана - pop af -x1554 or a - jr z,x1563 - push af - call x30DF ;сдвиг строк в буфере редактирования вверх - ex de,hl - call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана - pop af - dec a - jr x1554 -x1563 ld c,#00 - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,c - ld a,(#EC15) - ld c,a - push bc - push de -x156F call x30DF ;сдвиг строк в буфере редактирования вверх - ld a,(#EEF5) - bit 1,a - jr z,x1596 - push de - push hl - ld de,#0020 - add hl,de - bit 0,(hl) - jr z,x1594 - inc hl - ld d,(hl) - inc hl - ld e,(hl) - or a - ld hl,(#5C49) - sbc hl,de - jr nz,x1594 - ld hl,#EEF5 - set 0,(hl) -x1594 pop hl - pop de -x1596 push bc - push hl - ld bc,#0023 - ldir - pop hl - pop bc - push de - push bc - ex de,hl - ld hl,#EEF5 - bit 0,(hl) - jr z,x15D3 - ld b,#00 -x15AB ld hl,(#EC06) - ld a,h - or l - jr z,x15C0 - push hl ;!!!ОШИБКА!!! - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop hl - jr nc,x15CB - dec hl - inc b - ld (#EC06),hl - jr x15AB -x15C0 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - call nc,x2E63 ;поиск в строке влево от курсора редактируемого символа - ld hl,#EEF5 - ld (hl),#00 -x15CB ld a,b - pop bc - push bc - ld c,b - ld b,a - call x2A11 ;сохранить позицию курсора -x15D3 pop bc - pop de - ld a,c - inc b - cp b - jr nc,x156F - ld a,(#EEF5) - bit 1,a - jr z,x1602 - bit 0,a - jr nz,x1602 - ld hl,(#5C49) - ld a,h - or l - jr z,x15F4 - ld (#FC9A),hl - call x3222 ;установка буфера редактирования в верху экрана - jr x15FD -x15F4 ld (#FC9A),hl - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - ld (#5C49),hl -x15FD pop de - pop bc - jp x1536 -x1602 pop de - pop bc - cp a -x1605 push af - ld a,c - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - ex de,hl -x160C push af - call x3604 ;печать строки редактируемого буфера - pop af - ld de,#0023 - add hl,de - inc c - cp c - jr nc,x160C - pop af - ret z - call x2A07 ;получение позиции курсора -x161E call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - ld hl,(#EC06) - dec hl - ld a,h - or l - ld (#EC06),hl - jr nz,x161E - jp x2A11 ;сохранить позицию курсора - ret ;!!!не используется!!! - -;АДРЕС: #1630 очистка окна редактирования -x1630 ld b,#00 - ld a,(#EC15) - ld d,a - jp x3B5E ;очистка строк экрана - -;АДРЕС: #1639 сдвиг всех строк в буфере редактирования верх и обновление экрана -x1639 ld b,#00 - push hl - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x326A ;копирование строки бейсик программы в буфер редактирования вверзу экрана - pop hl - ret nc - call x30DF ;сдвиг строк в буфере редактирования вверх -x1648 push bc - push hl - ld hl,#0023 - add hl,de - ld a,(#EC15) - ld c,a - cp b - jr z,x1663 - push bc -x1656 push bc - ld bc,#0023 - ldir - pop bc - ld a,c - inc b - cp b - jr nz,x1656 - pop bc -x1663 pop hl - call x3618 ;сдвиг вверх строк в буфере редактирования при необходимости - ld bc,#0023 - ldir - scf - pop bc - ret - -;АДРЕС: #166F сдвиг всех строк в буфер редактирования вниз с обновлением экрана -x166F ld b,#00 - call x322B ;перемещение курсора вверх в верхнем буфере редактирования - ret nc - -;АДРЕС: #1675 сдвиг всех строк в буфер редактирования вниз с обновлением экрана -;вых: cy=0 буфер переполнен -; b - последняя строка -x1675 push bc - push hl -;сдвиг всех строк в буфере вниз - ld a,(#EC15) ;номер строки в буфере редактирования - ld c,a - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x311E ;сдвиг строк в буфере редактирования вниз - jr nc,x16A9 ;буфер переполнен - dec de - ld hl,#0023 - add hl,de - ex de,hl - push bc - ld a,b - cp c - jr z,x169A -x168E push bc - ld bc,#0023 - lddr - pop bc - ld a,b - dec c - cp c - jr c,x168E -;все строки сдвинуты вниз -x169A ex de,hl - inc de - pop bc ;c - номер строки - pop hl ;адрес следуюющей строки - call x362C ;сдвиг вниз строк в буфере редактирования при необходимости - ld bc,#0023 - ldir - scf - pop bc - ret -;буфер переполнен -x16A9 pop hl - pop bc - ret - -;АДРЕС: #16AC вставка символа в строку буфера редактирования -;вх: de - адрес начала строки в буфере -; a - код символа -; b - crd X -;вых: a - код последнего символа строки -; z - сждвигать больше нечего -x16AC push de - ld h,#00 - ld l,b - add hl,de ;адрес символа в буфере - ld d,a - ld a,b -x16B3 ld e,(hl) - ld (hl),d - ld d,e - inc hl - inc a - cp #20 - jr c,x16B3 - ld a,e - cp #00 - pop de - ret - -;АДРЕС: #16C1 вставка символа в строку буфера редактирования со сдвигом влево -x16C1 push de - ld hl,#0020 - add hl,de - push hl - ld d,a - ld a,#1F - jr x16D3 -x16CC ld e,(hl) - ld (hl),d - ld d,e - cp b - jr z,x16D6 - dec a -x16D3 dec hl - jr x16CC -x16D6 ld a,e - cp #00 - pop hl - pop de - ret - -;АДРЕС: #16DC смещения до параметров команды -x16DC db #B1 ; DEF FN -> #178D (ROM 0) - db #C9 ; CAT -> #17A6 (ROM 0) - db #BC ; FORMAT -> #179A (ROM 0) - db #BE ; MOVE -> #179D (ROM 0) - db #C3 ; ERASE -> #17A3 (ROM 0) - db #AF ; OPEN # -> #1790 (ROM 0) - db #B4 ; CLOSE # -> #1796 (ROM 0) - db #93 ; MERGE -> #1776 (ROM 0) - db #91 ; VERIFY -> #1775 (ROM 0) - db #92 ; BEEP -> #1777 (ROM 0) - db #95 ; CIRCLE -> #177B (ROM 0) - db #98 ; INK -> #177F (ROM 0) - db #98 ; PAPER -> #1780 (ROM 0) - db #98 ; FLASH -> #1781 (ROM 0) - db #98 ; BRIGHT -> #1782 (ROM 0) - db #98 ; INVERSE -> #1783 (ROM 0) - db #98 ; OVER -> #1784 (ROM 0) - db #98 ; OUT -> #1785 (ROM 0) - db #7F ; LPRINT -> #176D (ROM 0) - db #81 ; LLIST -> #1770 (ROM 0) - db #2E ; STOP -> #171E (ROM 0) - db #6C ; READ -> #175D (ROM 0) - db #6E ; DATA -> #1760 (ROM 0) - db #70 ; RESTORE -> #1763 (ROM 0) - db #48 ; NEW -> #173C (ROM 0) - db #94 ; BORDER -> #1789 (ROM 0) - db #56 ; CONTINUE -> #174C (ROM 0) - db #3F ; DIM -> #1736 (ROM 0) - db #41 ; REM -> #1739 (ROM 0) - db #2B ; FOR -> #1724 (ROM 0) - db #17 ; GO TO -> #1711 (ROM 0) - db #1F ; GO SUB -> #171A (ROM 0) - db #37 ; INPUT -> #1733 (ROM 0) - db #77 ; LOAD -> #1774 (ROM 0) - db #44 ; LIST -> #1742 (ROM 0) - db #0F ; LET -> #170E (ROM 0) - db #59 ; PAUSE -> #1759 (ROM 0) - db #2B ; NEXT -> #172C (ROM 0) - db #43 ; POKE -> #1745 (ROM 0) - db #2D ; PRINT -> #1730 (ROM 0) - db #51 ; PLOT -> #1755 (ROM 0) - db #3A ; RUN -> #173F (ROM 0) - db #6D ; SAVE -> #1773 (ROM 0) - db #42 ; RANDOMIZE -> #1749 (ROM 0) - db #0D ; IF -> #1715 (ROM 0) - db #49 ; CLS -> #1752 (ROM 0) - db #5C ; DRAW -> #1766 (ROM 0) - db #44 ; CLEAR -> #174F (ROM 0) - db #15 ; RETURN -> #1721 (ROM 0) - db #5D ; COPY -> #176A (ROM 0) - -;АДРЕС: #170E синтаксические параметры команд (аналогично basic 48 #1A7A) -; CLASS-00 - больше нет операндов -; CLASS-01 - используется в LET. требуется переменная -; CLASS-02 - используется в LET. за ним выражение числовое или строковое -; CLASS-03 - за этим следует числовое выражение (=0 при отсутствии) -; CLASS-04 - за этим следует односимвольная переменная -; CLASS-05 - -; CLASS-06 - за этим следует числовое выражение -; CLASS-07 - работа с атрибутами -; CLASS-08 - два числа через запятую -; CLASS-09 - два числа через запятую (могут быть упраляющие цветом коды) -; CLASS-0A - строка -; CLASS-0B - для работы с кассетой/RAM-диском -; CLASS-0C - то же что и CLASS-00, но вызывается из ROM 0 -; CLASS-0D - то же что и CLASS-06, но вызывается из ROM 0 -; CLASS-0E - обрабатывается в ROM 0 -x170E db #01 ; CLASS-01 LET - db "=" ; = - db #02 ; CLASS-02 -x1711 db #06 ; CLASS-06 GO TO - db #00 ; CLASS-00 - dw Rom1.x1E67 ; GO TO routine in ROM 1 -x1715 db #06 ; CLASS-06 IF - db #CB ; 'THEN' - db #0E ; CLASS-0E - dw x1967 ; IF routine in ROM 0 -x171A db #06 ; CLASS-06 GO SUB - db #0C ; CLASS-0C - dw x1A53 ; GO SUB routine in ROM 0 -x171E db #00 ; CLASS-00 STOP - dw Rom1.x1CEE ; STOP routine in ROM 1 -x1721 db #0C ; CLASS-0C RETURN - dw x1A6F ; RETURN routine in ROM 0 -x1724 db #04 ; CLASS-04 FOR - db "=" ; '=' - db #06 ; CLASS-06 - db #CC ; 'TO' - db #06 ; CLASS-06 - db #0E ; CLASS-0E - dw x1981 ; FOR routine in ROM 0 -x172C db #04 ; CLASS-04 NEXT - db #00 ; CLASS-00 - dw Rom1.x1DAB ; NEXT routine in ROM 1 -x1730 db #0E ; CLASS-0E PRINT - dw x2178 ; PRINT routine in ROM 0 -x1733: db #0E ; CLASS-0E INPUT - dw x218C ; INPUT routine in ROM 0 -x1736 db #0E ; CLASS-0E DIM - dw x21D5 ; DIM routine in ROM 0 -x1739 db #0E ; CLASS-0E REM - dw x1862 ; REM routine in ROM 0 -x173C db #0C ; CLASS-0C NEW - dw x21AA ; NEW routine in ROM 0 -x173F db #0D ; CLASS-0D RUN - dw x1A02 ; RUN routine in ROM 0 -x1742 db #0E ; CLASS-0E LIST - dw x1B75 ; LIST routine in ROM 0 -x1745 db #08 ; CLASS-08 POKE - db #00 ; CLASS-00 - dw Rom1.x1E80 ; POKE routine in ROM 1 -x1749 db #03 ; CLASS-03 RANDOMIZE - dw Rom1.x1E4F ; RANDOMIZE routine in ROM 1 -x174C db #00 ; CLASS-00 CONTINUE - dw Rom1.x1E5F ; CONTINUE routine in ROM 1 -x174F db #0D ; CLASS-0D CLEAR - dw Rom1.x1A0D ; CLEAR routine in ROM 0 -x1752 db #00 ; CLASS-00 CLS - dw Rom1.x0D6B ; CLS routine in ROM 1 -x1755 db #09 ; CLASS-09 PLOT - db #00 ; CLASS-00 - dw Rom1.x22DC ; PLOT routine in ROM 1 -x1759 db #06 ; CLASS-06 PAUSE - db #00 ; CLASS-00 - dw Rom1.x1F3A ; PAUSE routine in ROM 1 -x175D db #0E ; CLASS-0E READ - dw x19AB ; READ routine in ROM 0 -x1760 db #0E ; CLASS-0E DATA - dw x19EB ; DATA routine in ROM 0 -x1763 db #03 ; CLASS-03 RESTORE - dw Rom1.x1E42 ; RESTORE routine in ROM 1 -x1766 db #09 ; CLASS-09 DRAW - db #0E ; CLASS-0E - dw x21BE ; DRAW routine in ROM 0 -x176A db #0C ; CLASS-0C COPY - dw x21A7 ; New COPY routine in ROM 0. -x176D db #0E ; CLASS-0E LPRINT - dw x2174 ; LPRINT routine in ROM 0 -x1770 db #0E ; CLASS-0E LLIST - dw x1B71 ; LLIST routine in ROM 0 -x1773 db #0B ; CLASS-0B SAVE -x1774 db #0B ; CLASS-0B LOAD -x1775 db #0B ; CLASS-0B VERIFY -x1776 db #0B ; CLASS-0B MERGE -x1777 db #08 ; CLASS-08 BEEP - db #00 ; CLASS-00 - dw Rom1.x03F8 ; BEEP routine in ROM 1 -x177B db #09 ; CLASS-09 CIRCLE - db #0E ; CLASS-0E - dw x21AE ; CIRCLE routine in ROM 0 -x177F db #07 ; CLASS-07 INK -x1780 db #07 ; CLASS-07 PAPER -x1781 db #07 ; CLASS-07 FLASH -x1782 db #07 ; CLASS-07 BRIGHT -x1783 db #07 ; CLASS-07 INVERSE -x1784 db #07 ; CLASS-07 OVER -x1785 db #08 ; CLASS-08 OUT - db #00 ; CLASS-00 - dw Rom1.x1E7A ; OUT routine in ROM 1 -x1789 db #06 ; CLASS-06 BORDER - db #00 ; CLASS-00 - dw Rom1.x2294 ; BORDER routine in ROM 1 -x178D db #0E ; CLASS-0E DEF FN - dw x1A8C ; DEF FN routine in ROM 0 -x1790 db #06 ; CLASS-06 OPEN # - db "," ; ',' - db #0A ; CLASS-0A - db #00 ; CLASS-00 - dw Rom1.x1736 ; OPEN # routine in ROM 1 -x1796 db #06 ; CLASS-06 CLOSE # - db #00 ; CLASS-00 - dw Rom1.x16E5 ; CLOSE # routine in ROM 1 -x179A db #0E ; CLASS-0E FORMAT - dw x0641 ; FORMAT routine in ROM 0 -x179D db #0A ; CLASS-0A MOVE - db "," ; ',' - db #0A ; CLASS-0A - db #0C ; CLASS-0C - dw x1AF0 ; Just execute a RET -x17A3 db #0E ; CLASS-0E ERASE - dw x1C0C ; ERASE routine in ROM 0 -x17A6 db #0E ; CLASS-0E CAT - dw x1BE5 ; CAT routine in ROM 0 -x17A9 db #0C ; CLASS-0C SPECTRUM - dw x1B2B ; SPECTRUM routine in ROM 0 -x17AC: db #0E ; CLASS-0E PLAY - dw x2317 ; PLAY routine in ROM 0 - -;АДРЕС: #17AF анализ и выполнение бейсик программы -x17AF res 7,(iy+#01) - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x19FB ;получить номер редактиремой строки - xor a - ld (#5C47),a - dec a - ld (#5C3A),a - jr x17C1 -x17C0 rst #20 ;получить следующий символ -x17C1 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16BF ;очистка рабочего буфера - inc (iy+#0D) ;номер оператора в строке - jp m,x1912 ;слишком много операторов. ошибка - rst #18 ;получение кода символа - ld b,#00 - cp #0D - jp z,x1863 ;это enter - конец строки - cp ":" - jr z,x17C0 ;следующая команда - ld hl,x1821 ;сюда вернемся - push hl - ld c,a - rst #20 ;получить следующий символ - ld a,c - sub #CE - jr nc,x17F4 ;это DEF FN и дальше - add a,#CE - ld hl,x17A9 - cp #A3 - jr z,x1800 ;это SPECTRUM - ld hl,x17AC - cp #A4 - jr z,x1800 ;это PLAY - jp x1912 ;ошибка -x17F4 ld c,a - ld hl,x16DC - add hl,bc - ld c,(hl) - add hl,bc - jr x1800 -x17FD ld hl,(#5C74) -;вызов п/п обработки команды -x1800 ld a,(hl) - inc hl - ld (#5C74),hl - ld bc,x17FD ;сюда вернемся - push bc - ld c,a - cp #20 - jr nc,x181A ;это разделитель - ld hl,x18B5 - ld b,#00 - add hl,bc - ld c,(hl) - add hl,bc - push hl ;п/п обработки класса - rst #18 ;читаем код команды - dec b - ret -x181A rst #18 ;читаем код команды - cp c - jp nz,x1912 - rst #20 ;читаем код следующей команды - ret -x1821 call x05D6 ;проверка нажатия break и печать сообщения - jr c,x182A - call x05AC ;обработка ошибки без возврата - db #14 ;L Break into program -x182A bit 7,(iy+#0A) - jp nz,x18A8 - ld hl,(#5C42) ;номер строки бейсик программы - bit 7,h - jr z,x184C ;это строка программы -x1838 ld hl,#FFFE ;выполнение команды из строки редактирования - ld (#5C45),hl - ld hl,(#5C61) - dec hl - ld de,(#5C59) - dec de - ld a,(#5C44) - jr x1882 ;следующая строка программы - -;новая строка программы -x184C rst #28 ;вызов процедуры из basic 48k - dw Rom1.x196E ;получить начальный адрес строки программы - ld a,(#5C44) - jr z,x1870 ;поиск следующей строки - and a - jr nz,x189D ;N Statement lost - ld b,a - ld a,(hl) - and #C0 - ld a,b - jr z,x1870 ;еще не конец программы - call x05AC ;обработка ошибки без возврата - db #FF ;0 OK -;обработка команды: REM -x1862 pop bc -;обработка конца строки программы -x1863 bit 7,(iy+#01) - ret z ;это проверка синтаксиса - ld hl,(#5C55) ;адрес следующей строки программы - ld a,#C0 - and (hl) - ret nz ;следующая строка программы в RAM - xor a -;поиск следующей строки -x1870 cp #01 - adc a,#00 - ld d,(hl) - inc hl - ld e,(hl) ;номер строки программы - ld (#5C45),de - inc hl - ld e,(hl) - inc hl - ld d,(hl) ;длина строки программы - ex de,hl - add hl,de - inc hl -;следующая строка программы -x1882 ld (#5C55),hl ;адрес следующей строки - ex de,hl - ld (#5C5D),hl - ld d,a - ld e,#00 - ld (iy+#0A),#FF ;номер следующего оператора в строке - dec d - ld (iy+#0D),d ;номер выполняемого оператора - jp z,x17C0 ;первая команда в строке - inc d - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x198B ;поиск команды в строке - jr z,x18A8 ;команда найдена -x189D call x05AC - db #16 ;N Statement lost -;следующая строка программы -x18A1 bit 7,(iy+#01) - ret nz ;выполнение программы - pop bc - pop bc -;следующая команда в строке программы -x18A8 rst #18 ;читаем символ из строки - cp #0D - jr z,x1863 ;конец строки - cp ":" - jp z,x17C0 ;следующая команда - jp x1912 ;ошибка: noncens in basic - -;АДРЕС: #18B5 таблица смещений до процедур обработки класса оператора -x18B5 db x18D9-$ ;CLASS-00 -> x18D9 = #24 - db x18F9-$ ;CLASS-01 -> x18F9 = #43 - db x18FD-$ ;CLASS-02 -> x18FD = #46 - db x18D6-$ ;CLASS-03 -> x18D6 = #1E - db x1905-$ ;CLASS-04 -> x1905 = #4C - db x18DA-$ ;CLASS-05 -> x18DA = #20 - db x190E-$ ;CLASS-06 -> x190E = #53 - db x191A-$ ;CLASS-07 -> x191A = #5E - db x190A-$ ;CLASS-08 -> x190A = #4D - db x1944-$ ;CLASS-09 -> x1944 = #86 - db x1916-$ ;CLASS-0A -> x1916 = #57 - db x1948-$ ;CLASS-0B -> x1948 = #88 - db x18C7-$ ;CLASS-0C -> x18C7 = #06 - db x18C4-$ ;CLASS-0D -> x18C4 = #02 - db x18C8-$ ;CLASS-0E -> x18C8 = #05 - -;АДРЕС: #18C4 классы #0C,#0D,#0E -x18C4 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CDE ;получение параметра-числа -x18C7 cp a -x18C8 pop bc - call z,x18A1 ;если проверка синтаксиса, переход к следующей команде - ex de,hl - ld hl,(#5C74) - ld c,(hl) - inc hl - ld b,(hl) - ex de,hl - push bc - ret - -;АДРЕС: #18D6 классы #00,#03,#05 -x18D6 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CDE ;получение параметра-числа -x18D9 cp a -x18DA pop bc - call z,x18A1 ;если проверка синтаксиса, переход к следующей команде - ex de,hl - ld hl,(#5C74) - ld c,(hl) - inc hl - ld b,(hl) - ex de,hl - push hl - ld hl,x18F8 ;сюда вернемся - ld (x5B5A),hl - ld hl,x5B14 - ex (sp),hl - push hl - ld h,b - ld l,c - ex (sp),hl - jp x5B00 -x18F8 ret - -;АДРЕС: #18F9 класс #01 -x18F9 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C1F ;идентификация переменной - ret - -;АДРЕС: #18FD класс #02 -x18FD pop bc - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C56 ;получить значение параметра - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ret - -;АДРЕС: #1905 класс #04 FOR/NEXT -x1905 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C6C ;FOR i - ret - -;АДРЕС: #1909 класс #08 -x1909 rst #20 -x190A rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C7A ;получение двух значений - ret - -;АДРЕС: #190E класс #06 -x190E rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C82 ;получение числового значения - ret - -;АДРЕС: #1912 ошибка C Nonsense in BASIC -x1912 call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #1916 класс #0A -x1916 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1C8C ;параметр - строка - ret - -;АДРЕС: #191A класс #07 -x191A bit 7,(iy+#01) - res 0,(iy+#02) - jr z,x1927 ;проверка синтаксиса - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0D4D ;копирование атрибутов -x1927 pop af - ld a,(#5C74) - sub #28+(low x177F) ;#A7 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x21FC ;изменение временных атрибутов - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ld hl,(#5C8F) ;ATTR_T - ld (#5C8D),hl ;ATTR_P - ld hl,#5C91 ;P_FLAG - ld a,(hl) - rlca - xor (hl) - and #AA - xor (hl) - ld (hl),a - ret - -;АДРЕС: #1944 класс #09 -x1944 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1CBE ;установка необязательных атрибутов для печати - ret - -;АДРЕС: #1948 класс #0B -x1948 pop af - ld a,(x5B66) - and #0F - ld (x5B66),a - ld a,(#5C74) - sub 1+(low x1773) ;#74 - ld (#5C74),a - jp z,x11EB ;SAVE - dec a - jp z,x11F2 ;LOAD - dec a - jp z,x11F9 ;VERIFY - jp x1200 ;MERGE - -;АДРЕС: #1967 команда IF -x1967 pop bc - bit 7,(iy+#01) - jr z,x197E ;проверка синтаксиса - ld hl,(#5C65) - ld de,-5 - add hl,de - ld (#5C65),hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x34E9 ;проверка значения на ноль - jp c,x1863 ;если не ноль переход на следующую строку -x197E jp x17C1 ;перехд на следующую команду (THEN) - -;АДРЕС: #1981 команда FOR -x1981 cp #CD - jr nz,x198E ;ищем оператор STEP - rst #20 - call x190E ;получение числового значения - call x18A1 ;если проверка синтаксиса, переход к следующей команде - jr x19A6 -x198E call x18A1 ;если проверка синтаксиса, переход к следующей команде - ld hl,(#5C65) - ld (hl),#00 ;поместим значение на стэк калькулятора - inc hl - ld (hl),#00 - inc hl - ld (hl),#01 - inc hl - ld (hl),#00 - inc hl - ld (hl),#00 - inc hl - ld (#5C65),hl -x19A6 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1D16 - ret - -;АДРЕС: #19AA команда READ -x19AA rst #20 -x19AB call x18F9 ;идентификация переменной - bit 7,(iy+#01) - jr z,x19E2 ;проверка синтаксиса - rst #18 - ld (#5C5F),hl - ld hl,(#5C57) - ld a,(hl) - cp "," - jr z,x19CB - ld e,#E4 ;поиск оператора DATA - rst #28 - dw Rom1.x1D86 ;поиск оператора - jr nc,x19CB ;оператор найден - call x05AC - db #0D ;E Out of Data -x19CB inc hl - ld (#5C5D),hl - ld a,(hl) - rst #28 - dw Rom1.x1C56 ;извлечь значение - rst #18 - ld (#5C57),hl - ld hl,(#5C5F) - ld (iy+#26),#00 - ld (#5C5D),hl - ld a,(hl) -x19E2 rst #18 - cp "," - jr z,x19AA - call x18A1 ;если проверка синтаксиса, переход к следующей команде - ret - -;АДРЕС: #19EB команда DATA -x19EB bit 7,(iy+#01) - jr nz,x19FC ;исполнение программы -x19F1 rst #28 - dw Rom1.x24FB ;ищем следующее выражение - cp "," - call nz,x18A1 ;если проверка синтаксиса, переход к следующей команде - rst #20 - jr x19F1 -x19FC ld a,#E4 -x19FE rst #28 - dw Rom1.x1E39 ;проверить инструкцию DATA или DEF FN - ret - -;АДРЕС: #1A02 команда RUN -x1A02 rst #28 - dw Rom1.x1E67 ;команда GO TO - ld bc,#0000 - rst #28 - dw Rom1.x1E45 - jr x1A10 - -;АДРЕС: #1A0D команда CLEAR -x1A0D rst #28 - dw Rom1.x1E99 ;извлечь операнд -x1A10 ld a,b - or c - jr nz,x1A18 - ld bc,(#5CB2) -x1A18 push bc - ld de,(#5C4B) - ld hl,(#5C59) - dec hl - rst #28 - dw Rom1.x19E5 ;удалить переменные - rst #28 - dw Rom1.x0D6B ;CLS - ld hl,(#5C65) - ld de,#0032 - add hl,de - pop de - sbc hl,de - jr nc,x1A3B - ld hl,(#5CB4) - and a - sbc hl,de - jr nc,x1A3F -x1A3B call x05AC - db #15 ;M Ramtop no good -x1A3F ld (#5CB2),de - pop de - pop hl - pop bc - ld sp,(#5CB2) - inc sp - push bc - push hl - ld (#5C3D),sp - push de - ret - -;АДРЕС: #1A53 команда GO SUB -x1A53 pop de - ld h,(iy+#0D) - inc h - ex (sp),hl - inc sp - ld bc,(#5C45) - push bc - push hl - ld (#5C3D),sp - push de - rst #28 - dw Rom1.x1E67 ;команда GO TO - ld bc,#0014 - rst #28 - dw Rom1.x1F05 ;проверка наличия свободной памяти - ret - -;АДРЕС: #1A6F команда RETURN -x1A6F pop bc - pop hl - pop de - ld a,d - cp #3E - jr z,x1A86 - dec sp - ex (sp),hl - ex de,hl - ld (#5C3D),sp - push bc - ld (#5C42),hl - ld (iy+#0A),d - ret -x1A86 push de - push hl - call x05AC - db #06 ;7 RETURN without GO SUB - -;АДРЕС: #1A8C команда DEF FN -x1A8C bit 7,(iy+#01) - jr z,x1A97 ;проверка синтаксиса - ld a,#CE - jp x19FE -x1A97 set 6,(iy+#01) - rst #28 - dw Rom1.x2C8D ;это буква? - jr nc,x1AB6 ;нет - rst #20 - cp "$" - jr nz,x1AAA - res 6,(iy+#01) - rst #20 -x1AAA cp "(" - jr nz,x1AEA - rst #20 - cp ")" - jr z,x1AD3 -x1AB3 rst #28 - dw Rom1.x2C8D ;это буква? -x1AB6 jp nc,x1912 ;ошибка - ex de,hl - rst #20 - cp "$" - jr nz,x1AC1 - ex de,hl - rst #20 -x1AC1 ex de,hl - ld bc,#0006 - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - inc hl - inc hl - ld (hl),#0E - cp "," - jr nz,x1AD3 - rst #20 - jr x1AB3 -x1AD3 cp ")" - jr nz,x1AEA - rst #20 - cp "=" - jr nz,x1AEA - rst #20 - ld a,(#5C3B) - push af - rst #28 - dw Rom1.x24FB ;ищем следующее выражение - pop af - xor (iy+#01) - and #40 -x1AEA jp nz,x1912 ;ошибка - call x18A1 - -;АДРЕС: #1AF0 команда MOVE -x1AF0 ret - -;АДРЕС: #1AF1 пункт меню Tape Loader -x1AF1 ld hl,#EC0E - ld (hl),#FF - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) - ld bc,#0003 - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - ld hl,x1B6E - ld de,(#5C59) - ld bc,#0003 -x1B0F ldir - -;АДРЕС: #1B11 анализ и выполненение введенной строки -x1B11 call x026B ;анализ и выполненение введенной строки - -;АДРЕС: #1B14 пункт меню редактора Print (печать на принтер) -x1B14 call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) ;адрес начала редактируемой строки - ld bc,#0001 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1655 ;резервирование места (длина в bc) - ld hl,(#5C59) ;адрес начала редактируемой строки - ld (hl),#E1 ;команда LLIST - call x026B ;исполнение команды (без возврата) - -;АДРЕС: #1B2B команда SPECTRUM -x1B2B call x1B53 ;установка канала 'P' - ld sp,(#5C3D) - pop hl - ld hl,Rom1.x1303 ;основной цикл basic 48 - push hl - ld hl,Rom1.x0013 ;адрес с байтом #FF в rom 1 - push hl - ld hl,x0008 ;обработчик ошибок - push hl ;!!!ОШИБКА!!! - ld a,#20 ;basic48, блокировка #7FFD, ram 0 - ld (x5B5C),a - jp x5B00 - -;АДРЕС: #1B47 пунт меню BASIC 48. включение basic48, блокировка #7FFD и переход на адрес #0000 -x1B47 ld hl,#0000 - -;АДРЕС: #1B4A включение basic48, блокировка #7FFD и переход на адрес в hl -x1B4A push hl - ld a,#20 - ld (x5B5C),a - jp x5B00 - -;АДРЕС: #1B53 установка канала 'P' -x1B53 ld hl,(#5C4F) ;адрес начала области информации о каналах - ld de,#0005 - add hl,de ;канал S - ld de,#000A - ex de,hl - add hl,de - ex de,hl ;канал P - ld bc,#0004 - ldir - res 3,(iy+#30) ;курсор L - res 4,(iy+#01) ;режим zx-48 - ret - -;АДРЕС: #1B6E данные для команды LOAD "" -x1B6E db #EF,#22,#22 ;load "" - -;АДРЕС: #1B71 команда LLIST -x1B71 ld a,#03 - jr x1B77 - -;АДРЕС: #1B75 команда LIST -x1B75 ld a,#02 -x1B77 ld (iy+#02),#00 - rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x1B83 ;проверка - rst #28 - dw Rom1.x1601 ;открыть канал -x1B83 rst #28 ;!!!можно rst #18 - dw Rom1.x0018 ;чтение очередного символа строки программы -x1B86 rst #28 - dw Rom1.x2070 ;нужно ли изменять поток? - jr c,x1BA3 ;не нужно - rst #28 ;!!!можно rst #18 - dw Rom1.x0018 ;чтение очередного символа строки программы -x1B8E cp ";" - jr z,x1B96 - cp "," - jr nz,x1B9E -x1B96 rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы -x1B99 call x190E ;получение числового значения - jr x1BA6 -x1B9E rst #28 - dw Rom1.x1CE6 ;ноль на стэк калькулятора - jr x1BA6 -x1BA3 rst #28 - dw Rom1.x1CDE ;получение параметра-числа -x1BA6 call x18A1 - rst #28 - dw Rom1.x1825 ;LIST-5+3 - ret - -;АДРЕС: #1BAD команда RAM disk SAVE! -x1BAD ld (x5B81),sp - ld sp,x5BFF - call x1C97 ;создание новой записи в каталоге RAM-диска - ld bc,(x5B72) - ld hl,-9 - or #FF - sbc hl,bc - call x1CF3 ;коррекция сводного места на RAM диске - ld bc,#0009 - ld hl,x5B71 - call x1DAC ;сохранение данных на RAM диске - ld hl,(x5B74) - ld bc,(x5B72) - call x1DAC ;сохранение данных на RAM диске - call x1D56 ;обновление записи каталога - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1BE5 команда RAM disk CAT! -x1BE5 rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp "!" - jp nz,x1912 ;ошибка - rst #28 - dw Rom1.x0020 ;чтение следующего символа строки программы - call x18A1 - ld a,#02 ;канал #02 - rst #28 - dw Rom1.x1601 ;открыть канал - ld (x5B81),sp - ld sp,x5BFF - call x20D2 ;печать каталога RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C0C команда RAM disk EARSE! -x1C0C rst #28 - dw Rom1.x0018 ;чтение очередного символа строки программы - cp "!" - jp nz,x1912 ;ошибка - call x1393 ;проверка и копирование имени файла - call x18A1 - ld (x5B81),sp - ld sp,x5BFF - call x1F5F ;удаление файла из RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C2E загрузка заголовка файла из RAM диска -x1C2E ld (x5B81),sp - ld sp,x5BFF - call x1D35 ;поиск файла на RAM диске - ld hl,x5B71 - ld bc,#0009 - call x1E37 ;загрузка данных с RAM диска - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C4B загрузка из RAM диска -x1C4B ld (x5B81),sp - ld sp,x5BFF - ld b,d - ld c,e - call x1E37 ;загрузка данных с RAM диска - call x1D56 ;обновление записи каталога - ld a,#05 ;ram 0 - call x1C64 - ld sp,(x5B81) - ret - -;АДРЕС: #1C64 включение логической страницы в A -x1C64 push hl - push bc - ld hl,x1C81 - ld b,#00 - ld c,a - add hl,bc - ld c,(hl) - di - ld a,(x5B5C) - and #F8 - or c - ld (x5B5C),a - ld bc,#7FFD - out (c),a - ei - pop bc - pop hl - ret -x1C81 db #01,#03,#04,#06,#07,#00 - -;АДРЕС: #1C87 сравнение имени файла с заданным -;вых: z - имена совпадают -x1C87 ld de,x5B67 -x1C8A push ix - pop hl - ld b,#0A -x1C8F ld a,(de) - inc de - cp (hl) - inc hl - ret nz - djnz x1C8F - ret - -;АДРЕС: #1C97 создание новой записи в каталоге RAM-диска -x1C97 call x1D12 ;поиск имени файла в каталоге - jr z,x1CA0 ;имя не найдено - call x05AC - db #20 ;e File already exists -x1CA0 push ix - ld bc,#3FEC ;максимальный размер каталога - add ix,bc - pop ix - jr nc,x1D0E ;нехватает памяти - ld hl,-20 - ld a,#FF - call x1CF3 ;коррекция сводного места на RAM диске - ld hl,x5B66 - set 2,(hl) - push ix ;копируем имя файла - pop de - ld hl,x5B67 - ld bc,#000A - ldir - set 0,(ix+#13) ;запись обновлена - ld a,(ix+#0A) ;адрес начала файла = адрес конца файла - ld (ix+#10),a - ld a,(ix+#0B) - ld (ix+#11),a - ld a,(ix+#0C) - ld (ix+#12),a - xor a - ld (ix+#0D),a ;длина файла =#000000 - ld (ix+#0E),a - ld (ix+#0F),a - ld a,#05 - call x1C64 ;ram 0 - push ix - pop hl - ld bc,-20 - add hl,bc - ld (x5B83),hl - ret - -;АДРЕС: #1CF3 коррекция сводного места на RAM диске -x1CF3 ld de,(x5B85) - ex af,af' - ld a,(x5B85+2) - ld c,a - ex af,af' - bit 7,a - jr nz,x1D0A - add hl,de - adc a,c -x1D03 ld (x5B85),hl - ld (x5B85+2),a - ret -x1D0A add hl,de - adc a,c - jr c,x1D03 -x1D0E call x05AC - db #03 ;4 Out of memory - -;АДРЕС: #1D12 поиск имени файла в каталоге -;вых: z - файл не найден -; nz - файл наден -> ix - адрес дескриптора -x1D12 ld a,#04 ;ram 7 - call x1C64 - ld ix,#EBEC ;адрес первой записи в каталоге -x1D1B ld de,(x5B83) - or a - push ix - pop hl - sbc hl,de - ret z - call x1C87 ;сравнение имени файла с заданным - jr nz,x1D2E ;имя не совпало - or #FF - ret -x1D2E ld bc,-20 - add ix,bc - jr x1D1B - -;АДРЕС: #1D35 поиск файла на RAM диске -x1D35 call x1D12 ;поиск имени файла в каталоге - jr nz,x1D3E ;найден - call x05AC - db #23 ;h File does not exist -x1D3E ld a,(ix+#0A) - ld (ix+#10),a - ld a,(ix+#0B) - ld (ix+#11),a - ld a,(ix+#0C) - ld (ix+#12),a - ld a,#05 ;ram 0 - call x1C64 - ret - -;АДРЕС: #1D56 обновление записи каталога -x1D56 ld a,#04 ;ram 7 - call x1C64 - bit 0,(ix+#13) - ret z ;обновлять не надо - res 0,(ix+#13) - ld hl,x5B66 - res 2,(hl) - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - ld e,(ix+#0A) - ld d,(ix+#0B) - ld b,(ix+#0C) - or a - sbc hl,de - sbc a,b - rl h - rl h - sra a - rr h - sra a - rr h - ld (ix+#0D),l - ld (ix+#0E),h - ld (ix+#0F),a - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - ld bc,-20 - add ix,bc - ld (ix+#0A),l - ld (ix+#0B),h - ld (ix+#0C),a - ret - -;АДРЕС: #1DAC сохранение данных на RAM диске -;вх: hl - откуда -; bc - сколько -x1DAC ld a,b - or c - ret z - push hl - ld de,#C000 - ex de,hl - sbc hl,de - jr z,x1DD5 - jr c,x1DD5 - push hl - sbc hl,bc - jr nc,x1DCC - ld h,b - ld l,c - pop bc - or a - sbc hl,bc - ex (sp),hl - ld de,#C000 - push de - jr x1DF4 -x1DCC pop hl - pop hl - ld de,#0000 - push de - push de - jr x1DF4 -x1DD5 ld h,b - ld l,c - ld de,#0020 - or a - sbc hl,de - jr c,x1DE4 - ex (sp),hl - ld b,d - ld c,e - jr x1DE9 -x1DE4 pop hl - ld de,#0000 - push de -x1DE9 push bc - ld de,x5B98 - ldir - pop bc - push hl - ld hl,x5B98 -x1DF4 ld a,#04 - call x1C64 ;ram 7 - ld e,(ix+#10) - ld d,(ix+#11) - ld a,(ix+#12) - call x1C64 -x1E05 ldi - ld a,d - or e - jr z,x1E24 -x1E0B ld a,b - or c - jp nz,x1E05 - ld a,#04 ;ram 7 - call x1C64 - ld (ix+#10),e - ld (ix+#11),d - ld a,#05 ;ram 0 - call x1C64 - pop hl - pop bc - jr x1DAC -x1E24 ld a,#04 ;ram 7 - call x1C64 - inc (ix+#12) - ld a,(ix+#12) - ld de,#C000 - call x1C64 - jr x1E0B - -;АДРЕС: #1E37 загрузка данных с RAM диска -;вх: hl - куда -; bc - сколько -x1E37 ld a,b - or c - ret z - push hl - ld de,#C000 - ex de,hl - sbc hl,de - jr z,x1E67 - jr c,x1E67 - push hl - sbc hl,bc - jr nc,x1E5C - ld h,b - ld l,c - pop bc - or a - sbc hl,bc - ex (sp),hl - ld de,#0000 - push de - ld de,#C000 - push de - ex de,hl - jr x1E80 -x1E5C pop hl - pop hl - ld de,#0000 - push de - push de - push de - ex de,hl - jr x1E80 -x1E67 ld h,b - ld l,c - ld de,#0020 - or a - sbc hl,de - jr c,x1E76 - ex (sp),hl - ld b,d - ld c,e - jr x1E7B -x1E76 pop hl - ld de,#0000 - push de -x1E7B push bc - push hl - ld de,x5B98 -x1E80 ld a,#04 ;ram 7 - call x1C64 - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - call x1C64 -x1E91 ldi - ld a,h - or l - jr z,x1EBC -x1E97 ld a,b - or c - jp nz,x1E91 - ld a,#04 ;ram 0 - call x1C64 - ld (ix+#10),l - ld (ix+#11),h - ld a,#05 ;ram 7 - call x1C64 - pop de - pop bc - ld hl,x5B98 - ld a,b - or c - jr z,x1EB7 - ldir -x1EB7 ex de,hl - pop bc - jp x1E37 -x1EBC ld a,#04 ;ram 0 - call x1C64 - inc (ix+#12) - ld a,(ix+#12) - ld hl,#C000 - call x1C64 - jr x1E97 - -;АДРЕС: #1ECF !!!NOT USED!!! запись данных в RAM 7 -;вх: hl - откуда -; de - куда -; bc - сколько -x1ECF push af - ld a,(x5B5C) - push af - push hl - push de - push bc - ld ix,x5B67+3 ;x5B6A - ld (ix+#10),e - ld (ix+#11),d - ld (ix+#12),#04 - call x1DAC ;сохранение данных на RAM диске -x1EE8 ld a,#05 ;ram 0 - call x1C64 - pop bc - pop de - pop hl - add hl,bc - ex de,hl - add hl,bc - ex de,hl - pop af - ld bc,#7FFD - di - out (c),a - ld (x5B5C),a - ei - ld bc,#0000 - pop af - ret - -;АДРЕС: #1F04 !!!NOT USED!!! чтение данных из RAM 7 -x1F04 push af - ld a,(x5B5C) - push af - push hl - push de - push bc - ld ix,x5B67+3 ;x5B6A - ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),#04 - ex de,hl - call x1E37 ;загрузка данных с RAM диска - jr x1EE8 - -;АДРЕС: #1F20 установка другого стэка и ram 0 -x1F20 ex af,af' - ld a,#00 - di - call x1F3A ;включение страницы ram 0 - pop af - ld (x5B58),hl - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ei - ld hl,(x5B58) - push af - ex af,af' - ret - -;АДРЕС: #1F3A включение физической страницы ram -;вх: a - номер страницы -x1F3A push bc - ld bc,#7FFD - out (c),a - ld (x5B5C),a - pop bc - ret - -;АДРЕС: #1F45 установка другого стэка и ram 7 -;вх: (x5B81) - адрес другого стэка -x1F45 ex af,af' - di - pop af - ld (x5B58),hl - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld hl,(x5B58) - push af - ld a,#07 - call x1F3A ;включение страницы ram - ei - ex af,af' - ret - -;АДРЕС: #1F5F удаление файла из RAM диска -x1F5F call x1D12 ;поиск имени файла в каталоге - jr nz,x1F68 ;файл найден - call x05AC - db #23 ;h File does not exist -x1F68 ld l,(ix+#0D) - ld h,(ix+#0E) - ld a,(ix+#0F) - call x1CF3 ;коррекция свободного места на RAM диске - push iy - ld iy,(x5B83) - ld bc,-20 - add ix,bc - ld l,(iy+#0A) - ld h,(iy+#0B) - ld a,(iy+#0C) - pop iy - ld e,(ix+#0A) - ld d,(ix+#0B) - ld b,(ix+#0C) - or a - sbc hl,de - sbc a,b - rl h - rl h - sra a - rr h - sra a - rr h - ld bc,#0014 - add ix,bc - ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),a - ld bc,-20 - add ix,bc - ld l,(ix+#0A) - ld h,(ix+#0B) - ld d,(ix+#0C) - ld bc,#0014 - add ix,bc - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld bc,#7FFD - ld a,#07 ;rom 0, ram 7 - di - out (c),a - exx - ld l,(ix+#0A) - ld h,(ix+#0B) - ld d,(ix+#0C) - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld bc,#7FFD - exx -x1FEA ld a,#07 ;rom 0, ram 7 - di - out (c),a - ld a,(ix+#10) - sub #01 - ld (ix+#10),a - jr nc,x200D - ld a,(ix+#11) - sub #01 - ld (ix+#11),a - jr nc,x200D - ld a,(ix+#12) - sub #01 - ld (ix+#12),a - jr c,x203E -x200D out (c),e - ld a,(hl) - inc l - jr nz,x2024 - inc h - jr nz,x2024 - ex af,af' - inc d - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld hl,#C000 - ex af,af' -x2024 exx - di - out (c),e - ld (hl),a - inc l - jr nz,x203B - inc h - jr nz,x203B - inc d - ld a,d - call x1C64 - ld a,(x5B5C) - ld e,a - ld hl,#C000 -x203B exx - jr x1FEA -x203E ld a,#04 - call x1C64 - ld a,#00 - ld hl,#0014 - call x1CF3 ;коррекция свободного места на RAM диске - ld e,(ix+#0D) - ld d,(ix+#0E) - ld c,(ix+#0F) - ld a,d - rlca - rl c - rlca - rl c - ld a,d - and #3F - ld d,a - push ix -x2061 push de - ld de,-20 - add ix,de - pop de - ld l,(ix+#0A) - ld h,(ix+#0B) - ld a,(ix+#0C) - or a - sbc hl,de - sub c - bit 6,h - jr nz,x207C - set 6,h - dec a -x207C ld (ix+#0A),l - ld (ix+#0B),h - ld (ix+#0C),a - ld l,(ix+#10) - ld h,(ix+#11) - ld a,(ix+#12) - or a - sbc hl,de - sub c - bit 6,h - jr nz,x2099 - set 6,h - dec a -x2099 ld (ix+#10),l - ld (ix+#11),h - ld (ix+#12),a - push ix - pop hl - push de - ld de,(x5B83) - or a - sbc hl,de - pop de - jr nz,x2061 - ld de,(x5B83) - pop hl - push hl - or a - sbc hl,de - ld b,h - ld c,l - pop hl - push hl - ld de,#0014 - add hl,de - ex de,hl - pop hl - dec de - dec hl - lddr - ld hl,(x5B83) - ld de,#0014 - add hl,de - ld (x5B83),hl - ret - -;АДРЕС: #20D2 печать каталога RAM диска -x20D2 ld a,#04 ;ram 7 - call x1C64 - ld hl,x2121 -x20DA ld bc,x212B - ld ix,#EBEC -x20E1 call x05D6 ;проверка нажатия break и печать сообщения - push ix - ex (sp),hl - ld de,(x5B83) - or a - sbc hl,de - pop hl - jr z,x2111 - ld d,h - ld e,l - push hl - push bc - call x1C8A ;сравнение имени файла с заданным - pop bc - pop hl - jr nc,x210A - ld d,b - ld e,c - push hl - push bc - call x1C8A ;сравнение имени файла с заданным - pop bc - pop hl - jr c,x210A - push ix - pop bc -x210A ld de,-20 - add ix,de - jr x20E1 -x2111 push hl - ld hl,x212B - or a - sbc hl,bc - pop hl - ret z - ld h,b - ld l,c - call x2135 ;печать одной записи каталога RAM диска - jr x20DA -x2121 ds #0A,#00 -x212B ds #0A,#FF - -;АДРЕС: #2135 печать одной записи каталога RAM диска -x2135 push hl - push bc - pop hl - ld de,x5B67 - ld bc,#000A - ldir - ld a,#05 - call x1C64 ;rom 0 - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld hl,x5B67 - ld b,#0A -x2152 ld a,(hl) - push hl - push bc - rst #28 - dw Rom1.x0010 ;печать символа из A - pop bc - pop hl - inc hl - djnz x2152 - ld a,#0D - rst #28 - dw Rom1.x0010 ;перевод строки - rst #28 - dw Rom1.x0D4D ;копиравоние атрибутов - ld hl,(x5B81) - ld (x5B81),sp - ld sp,hl - ld a,#04 ;ram 7 - call x1C64 - pop hl - ret - -;АДРЕС: #2174 команда LPRINT -x2174 ld a,#03 - jr x217A - -;АДРЕС: #2178 команда PRINT -x2178 ld a,#02 -x217A rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x2182 - rst #28 - dw Rom1.x1601 ;открыть канал -x2182 rst #28 - dw Rom1.x0D4D ;копиравоние атрибутов - rst #28 - dw Rom1.x1FDF ;PRINT_2 - call x18A1 - ret - -;АДРЕС: #218C команда INPUT -x218C rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr z,x2199 - ld a,#01 - rst #28 - dw Rom1.x1601 ;открыть канал - rst #28 ;!!!ОШИБКА!!! - dw Rom1.x0D6E -x2199 ld (iy+#02),#01 - rst #28 - dw Rom1.x20C1 ;ввод данных по input - call x18A1 - rst #28 - dw Rom1.x20A0 ;ввод с клавиатуры - ret - -;АДРЕС: #21A7 команда COPY -x21A7 jp x08F0 - -;АДРЕС: #21AA команда NEW -x21AA di - jp x019D - -;АДРЕС: #21AE команда CIRCLE -x21AE rst #18 - cp "," - jr nz,x21EB ;ошибка - rst #20 - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x232D ;печать окружности - ret - -;АДРЕС: #21BE команда DRAW -x21BE rst #18 - cp "," - jr z,x21CA - call x18A1 - rst #28 - dw Rom1.x2477 ;печать линии - ret -x21CA rst #20 - rst #28 - dw Rom1.x1C82 ;получение числового значения - call x18A1 - rst #28 - dw Rom1.x2394 ;печать линии - ret - -;АДРЕС: #21D5 команда DIM -x21D5 rst #28 - dw Rom1.x28B2 ;LOOK-VARS - jr nz,x21EB - rst #28 - dw Rom1.x2530 ;проверка флага проверка/исполнение программы - jr nz,x21E7 - res 6,c - rst #28 - dw Rom1.x2996 ;проверкае синтаксиса выражения, заключенного в скобки - call x18A1 -x21E7 rst #28 - dw Rom1.x2C15 ;D-RUN - ret - -x21EB call x05AC - db #0B ;C Nonsense in BASIC - -;АДРЕС: #21EF очистка экрана -x21EF bit 0,(iy+#30) - ret z - rst #28 - dw Rom1.x0DAF ;очистить экран - ret - -;АДРЕС: #21F8 вычисличть числовое выражение -x21F8 ld hl,#FFFE - ld (#5C45),hl ;выполнение оператора в непосредственном режиме - res 7,(iy+#01) ;проверка синтаксиса - call x228E ;поиск начала бейсик команды - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x24FB ;анализ строки - bit 6,(iy+#01) - jr z,x223A ;обработка символьного выражения - rst #18 ;получить символ - cp #0D - jr nz,x223A - set 7,(iy+#01) ;выполнение программы - call x228E ;поиск начала бейсик команды - ld hl,x0321 ;адрес возврата при ошибке - ld (x5B8B),hl - rst #28 - dw Rom1.x24FB ;анализ строки - bit 6,(iy+#01) - jr z,x223A ;обработка символьного выражения - ld de,x5B8D ;адрес последней длины, выводимой при вычислениях - ld hl,(#5C65) ;адрес вершины стэка калькулятора - ld bc,#0005 - or a - sbc hl,bc - ldir - jp x223E -x223A call x05AC ;без возврата - db #19 ;Q Parameter error, n:m -x223E ld a,#0D - call x226F ;обработка нажатой клавиши - ld bc,#0001 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0030 ;резервирование места -x2249 ld (#5C5B),hl ;адрес символа редактируемой строки - push hl - ld hl,(#5C51) ;адрес описателя текущего канала - push hl - ld a,#FF ;канал -1 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1601 ;открыть канал - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x2DE3 ;печать числа с плавающей точкой - pop hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1615 ;установка флагов канала (возврат предыдущего канала) - pop de - ld hl,(#5C5B) ;адрес символа редактируемой строки - and a - sbc hl,de -x2264 ld a,(de) - call x226F ;обработка нажатой клавиши - inc de - dec hl - ld a,h - or l - jr nz,x2264 - ret - -;АДРЕС: #226F обработка нажатой клавиши -;вх: a - код клавиши -x226F push hl - push de - call x1F45 ;установка другого стэка и ram 7 - ld hl,#EC0D - res 3,(hl) - push af - ld a,#02 - rst #28 - dw Rom1.x1601 ;открыть канал #02 - pop af - call x2669 ;обработка нажатия клавиши - ld hl,#EC0D - res 3,(hl) - call x1F20 ;установка другого стэка и ram 0 - pop de - pop hl - ret - -;АДРЕС: #228E поиск начала бейсик команды -x228E ld hl,(#5C59) - dec hl - ld (#5C5D),hl - rst #20 ;получение следующего символа в бейсик программе - ret - -;АДРЕС: #2297 проверка это команда LET? (калькулятор basic 128) -;вых: z - это только команда LET -x2297 call x228E ;поиск начала бейсик команды - cp #F1 ;LET ? - ret nz - ld hl,(#5C5D) -x22A0 ld a,(hl) - inc hl - cp #0D - ret z - cp ":" - jr nz,x22A0 - or a - ret - -;АДРЕС: #22AB проверка это оператор? -x22AB ld b,a - ld hl,x22BD -x22AF ld a,(hl) - inc hl - or a - jr z,x22B9 - cp b - jr nz,x22AF - ld a,b - ret -x22B9 or #FF - ld a,b - ret - -;АДРЕС: #22BD список токенов операторов -x22BD db #2B,#2D,#2A ; '+', '-', '*' - db #2F,#5E,#3D ; '/', '^', '=' - db #3E,#3C,#C7 ; '>', '<', '<=' - db #C8,#C9,#C5 ; '>=', '<>', 'OR' - db #C6 ; 'AND' - db #00 ;маркер конца таблицы - -;АДРЕС: #22CB проверка это токен? -;вых: z - это токен -x22CB cp #A5 - jr c,x22DD - cp #C4 - jr nc,x22DD - cp #AC - jr z,x22DD - cp #AD - jr z,x22DD - cp a - ret -x22DD cp #A5 - ret - -;АДРЕС: #22E0 проверка это число или функция? -x22E0 ld b,a - or #20 - cp "a" - jr c,x22ED ;это не буква - cp "z"+1 - jr nc,x22ED ;это не буква - cp a - ret -x22ED ld a,b - cp "." - ret z - call x230A ;проверка это цифра или нет - jr nz,x2307 ;не цифра -x22F6 rst #20 ;читаем следующий симввол - call x230A ;проверка это цифра или нет - jr z,x22F6 ;это цифра - cp "." - ret z - cp "E" - ret z - cp "e" - ret z - jr x22AB ;проверка это оператор? -x2307 or #FF - ret - -;АДРЕС: #230A проверка это цифра или нет -;вых: z - это цифра -x230A cp "0" - jr c,x2314 ;это не цифра - cp "9"+1 - jr nc,x2314 ;это не цифра - cp a - ret -x2314 cp "0" - ret - -;АДРЕС: #2317 команда PLAY -x2317 ld b,#00 - rst #18 -x231A push bc - rst #28 - dw Rom1.x1C8C ;параметр - строка - pop bc - inc b - cp "," - jr nz,x2327 - rst #20 - jr x231A -x2327 ld a,b - cp #09 - jr c,x2330 - call x05AC - db #2B ;!!!ОШИБКА!!! -x2330 call x18A1 - jp x0985 - -;АДРЕС: #2336 !!!NOT USED!!! возврат в редактор -x2336 ld hl,x5BFF - ld (x5B81),hl - call x1F45 - jp x25CB - -;АДРЕС: #2342 !!!NOT USED!!! bc=hl-de -x2342 and a - sbc hl,de - ld b,h - ld c,l - add hl,de - ex de,hl - ret - -;АДРЕС: #234A !!!NOT USED!!! зарезервировать память на 1 байт -x234A ld bc,#0001 - push hl - push de - call x2358 - pop de - pop hl - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - ret - -;АДРЕС: #2358 !!!NOT USED!!! проверка доступности места в памяти размером в bc -x2358 ld hl,(#5C65) - add hl,bc - jr c,x2368 - ex de,hl - ld hl,#0082 - add hl,de - jr c,x2368 - sbc hl,sp - ret c -x2368 ld (iy+#00),#03 ;4 Out of Memory - jp x0321 - -;АДРЕС: #236F !!!NOT USED!!! hl=a*#20 -x236F add a,a - add a,a - -;АДРЕС: #2371 !!!NOT USED!!! hl=a*#08 -x2371 ld l,a - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - ret - -;АДРЕС: #2378 !!!NOT USED!!! расчет свободного места -x2378 ld hl,#0000 - add hl,sp - ld de,(#5C65) - or a - sbc hl,de - ret - -;АДРЕС: #2384 !!!NOT USED!!! печать на экране строки из буфера -x2384 res 0,(iy-#39) - call x236F - push hl - ld de,(#FF24) - add hl,de - ld d,h - ld e,l - ex (sp),hl - push hl - push de - ld de,#5800 - add hl,de - ex de,hl - pop hl - ld bc,#0020 - ld a,(#5C8F) - call x249B - pop hl - ld a,h - ld h,#00 - add a,a - add a,a - add a,a - add a,#40 - ld d,a - ld e,h - add hl,de - ex de,hl - pop hl - ld b,#20 - jp x23E1 - -;АДРЕС: #23B8 !!!NOT USED!!! печать в буфере #FF -x23B8 ld d,#FF - call x236F - ld a,d - ld de,(#FF24) - add hl,de - ld e,l - ld d,h - inc de - ld (hl),a - dec bc - ldir - ret - -;АДРЕС: #23CB !!!NOT USED!!! копирование буфера на экран -x23CB call x2488 - ld de,#4000 - ld hl,(#FF24) - ld b,e - call x23E1 - ld d,#48 - call x23E1 - ld d,#50 - ld b,#C0 - -;АДРЕС: #23E1 !!!NOT USED!!! печать символов из буфера на экране -x23E1 ld a,(hl) - push hl - push de - cp #FE - jr c,x23EC - sub #FE - jr x2422 -x23EC cp #20 - jr nc,x23F7 - ld hl,x2527 - and a - ex af,af' - jr x242B -x23F7 cp #80 - jr nc,x2409 - call x2371 - ld de,(#5C36) - add hl,de - pop de - call #FF28 - jr x2450 -x2409 cp #90 - jr nc,x2411 - sub #7F - jr x2422 -x2411 sub #90 - call x2371 - pop de - call x1F20 - push de - ld de,(#5C7B) - scf - jr x2429 -x2422 ld de,x252F - call x2371 - and a -x2429 ex af,af' - add hl,de -x242B pop de -x242C ld c,d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - inc hl - inc d - ld a,(hl) - ld (de),a - ld d,c - ex af,af' - call c,x1F45 -x2450 pop hl - inc hl - inc de - djnz x23E1 - ret - -;АДРЕС: #2456 !!!NOT USED!!! переключение страниц rom 0/1 -x2456 push bc - di - ld bc,#7FFD - ld a,(x5B5C) - xor #10 - out (c),a - ei - ex af,af' - -;АДРЕС: #2464 !!!NOT USED!!! переключение страниц rom 0/1 -x2464 ex af,af' - di - ld c,#FD - xor #10 - out (c),a - ei - pop bc - ret - -;АДРЕС: #246F !!!NOT USED!!! копирование п/п в ram 7 -x246F ld hl,x2456 - ld de,#FF28 - ld bc,#000E - ldir - push hl - ld hl,x242C - ld c,#20 - ldir - pop hl - ld c,#0B - ldir - ret - -;АДРЕС: #2488 !!!NOT USED!!! установка атрибутов из буфера экрана -x2488 res 0,(iy-#39) - ld de,#5800 - ld bc,#02C0 - ld hl,(#FF24) - ld a,(#5C8D) - ld (#5C8F),a - -;АДРЕС: #249B !!!NOT USED!!! установка атрибутов из буфера экрана -x249B ex af,af' -x249C push bc - ld a,(hl) - cp #FF - jr nz,x24AA - ld a,(#5C8D) - ld (de),a - inc hl - inc de - jr x2507 -x24AA ex af,af' - ld (de),a - inc de - ex af,af' - inc hl - cp #15 - jr nc,x2507 - cp #10 - jr c,x2507 - dec hl - jr nz,x24C2 - inc hl - ld a,(hl) - ld c,a - ex af,af' - and #F8 - jr x2505 -x24C2 cp #11 - jr nz,x24D1 - inc hl - ld a,(hl) - add a,a - add a,a - add a,a - ld c,a - ex af,af' - and #C7 - jr x2505 -x24D1 cp #12 - jr nz,x24DE - inc hl - ld a,(hl) - rrca - ld c,a - ex af,af' - and #7F - jr x2505 -x24DE cp #13 - jr nz,x24EC - inc hl - ld a,(hl) - rrca - rrca - ld c,a - ex af,af' - and #BF - jr x2505 -x24EC cp #14 - inc hl - jr nz,x2507 - ld c,(hl) - ld a,(#5C01) - xor c - rra - jr nc,x2507 - ld a,#01 - xor (iy-#39) - ld (#5C01),a - ex af,af' - call x2513 -x2505 or c - ex af,af' -x2507 pop bc - dec bc - ld a,b - or c - jp nz,x249C - ex af,af' - ld (#5C8F),a - ret - -;АДРЕС: #2513 !!!NOT USED!!! поменять местами ink и paper -x2513 ld b,a - and #C0 - ld c,a - ld a,b - add a,a - add a,a - add a,a - and #38 - or c - ld c,a - ld a,b - rra - rra - rra - and #07 - or c - ret - -x2527 db %00000000 ; - db %00111100 ; XXXX - db %01100010 ; XX X - db %01100000 ; XX - db %01101110 ; XX XXX - db %01100010 ; XX X - db %00111110 ; XXXX - db %00000000 ; - -x252F db %00000000 ; - db %01101100 ; XX XX - db %00010000 ; X - db %01010100 ; X X X - db %10111010 ; X XXX X - db %00111000 ; XXX - db %01010100 ; X X X - db %10000010 ; X X - -;АДРЕС: #2537 таблица адресов обработки нажатий в режиме редактирования -x2537 db #15 ;размер таблицы - db #0B: dw #2A94 ;перемещение курсора вверх в поле редактирования - db #0A: dw #2AB5 ;перемещение курсора вниз в поле редактирования - db #08: dw #2AD7 ;перемещение курсора влево в поле редактирования - db #09: dw #2AE3 ;перемещение курсора вправо в поле редактирования - db #AD: dw #2A4F ;ext+P перемещение курсора вверх на 10 строк в поле редактирования - db #AC: dw #2A25 ;ss+I перемещение курсора вниз на 10 строк в поле редактирования - db #AF: dw #29D4 ;ext+I переход к началу текущего слова - db #AE: dw #29E1 ;ext+shift+J переход к началу следующего слова - db #A6: dw #2983 ;ext+N/Graph+W переход к первой строке бейсик программы - db #A5: dw #29AB ;ext+T/Graph+V переход к последней строке бейсик программы - db #A8: dw #2A87 ;ext+ss+2/Graph+Y переход к началу строки редактирования - db #A7: dw #2A7A ;ext+M/graph+X перемещение курсора в конец строки в поле редактирования - db #AA: dw #291B ;ext+ss+K удаление символа справа от курсора - db #0C: dw #292B ;delete удаление символа слева от курсора - db #B3: dw #3017 ;ext+W удаление символов от курсора до начала следующего слова - db #B4: dw #2FBC ;ext+E удаление символов от курсора до начала текущего слова - db #B0: dw #3072 ;ext+J удаление символов до конца строки - db #B1: dw #303E ;ext+K удаление символов до наала строки - db #0D: dw #2944 ;enter ввод строки - db #A9: dw #269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху - db #07: dw #2704 ;cs+1 вызов меню - -;АДРЕС: #2577 таблица адресов обработки нажатий в основном меню basic 128k -x2577 db #04 ;размер таблицы - db #0B: dw x272E ;вверх - db #0A: dw x2731 ;вниз - db #07: dw x2717 ;cs+1 - db #0D: dw x2717 ;enter - -;АДРЕС: #2584 подготовка переменных -x2584 call x28BE ;инициализация курсора для верхнего окна - ld hl,#0000 - ld (#FC9A),hl - ld a,#82 - ld (#EC0D),a - ld hl,#0000 - ld (#5C49),hl ;Номер строки бейсик-программы, отмеченной курсором - call x35BC ;установка параметров отступа - call x365E ;установка переменных для ввода символа - ret - -;АДРЕС: #259F печать главного меню basic 128 и выбор опции -x259F ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#02 ;канал #02 (основной экран) - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1601 ;открыть канал -x25AD ld hl,x2744 ;п/п обработки главного меню - ld (#F6EA),hl - ld hl,x2754 ;текст основного меню basic 128k - ld (#F6EC),hl - push hl - ld hl,#EC0D - set 1,(hl) ;на отображено меню - res 4,(hl) ;возврат в главное меню - dec hl - ld (hl),#00 ;номер опции меню - pop hl - call x36A8 ;печать главного меню basic 128k - jp x2653 ;основной цикл в basic128/калькулятор - -;АДРЕС: #25CB возврат в редактор/калькулятор/меню после обработки ошибки -x25CB ld ix,#FD6C - ld hl,x5BFF - ld (x5B81),hl - call x1F45 ;установка другого стэка и ram 7 - ld a,#02 - rst #28 - dw Rom1.x1601 ;открыть канал - call x3668 ;установка переменных для ввода символа - ld hl,#5C3B -x25E3 bit 5,(hl) - jr z,x25E3 - ld hl,#EC0D - res 3,(hl) - bit 6,(hl) - jr nz,x2604 - ld a,(#EC0E) - cp #04 - jr z,x2601 ;это калькулятор - cp #00 - jp nz,x28C7 - call x3848 ;печать информационной строки 128 BASIC - jr x2604 -x2601 call x384D ;печать информационной строки Calculator -x2604 call x30D6 ;установка буфера редактирования внизу экрана - call x3222 ;установка буфера редактирования в верху экрана - ld a,(#EC0E) - cp #04 - jr z,x2653 ;калькулятор - ld hl,(#5C49) - ld a,h - or l - jr nz,x262D - ld hl,(#5C53) - ld bc,(#5C4B) - and a - sbc hl,bc - jr nz,x262A - ld hl,#0000 - ld (#EC08),hl -x262A ld hl,(#EC08) -x262D call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld hl,#EC0D - bit 5,(hl) - jr nz,x2653 - ld hl,#0000 - ld (#EC06),hl - call x152F ;печать бейсик программы от текущей строки - call x29F2 ;напечатать курсор - call x2944 ;enter ввод строки - -;АДРЕС: #2653 основной цикл в basic128/калькулятор -x2653 ld sp,#5BFF - call x3668 ;установка переменных для ввода символа - call x367F ;ожидание нажатия клавиши - push af ;код клавиши - ld a,(#5C39) ;звук нажатия на клавишу - call x26EC ;звуковой сигнал - pop af - call x2669 ;обработка нажатия клавиши - jr x2653 ;основной цикл в basic128/калькулятор - -;АДРЕС: #2669 обработка нажатия клавиши -;вх: a - код клавиши -;вых: z - отображено меню -x2669 ld hl,#EC0D - bit 1,(hl) - push af - ld hl,x2577 ;основное меню basic 128k - jr nz,x2677 ;отображено меню - ld hl,x2537 ;клавиши для режима редактирования -x2677 call x3FCE ;обработка нажатой управляющей клавиши в меню - jr nz,x2681 ;не найден обработчик клавиши - call nc,x26E7 ;звуковой сигнал - pop af - ret -;не найден обработчик клавиши -x2681 pop af - jr z,x2689 ;это режим редактирования - xor a ;курсор K,L или C - ld (#5C41),a - ret -x2689 ld hl,#EC0D - bit 0,(hl) - jr z,x2694 ;буфер редактирования не переполнен - call x26E7 ;звуковой сигнал - ret ;!!!тут можно сократить!!! -x2694 cp #A3 - jr nc,x2653 ;!!!ОШИБКА!!! должно быть ret nc - jp x28F1 ;обрабока нажатия символьной клавиши - -;АДРЕС: #269B ext+ss+8/Graph+Z переключение между редактированием внизу и вверху -x269B ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x1630 ;очистка окна редактирования - ld hl,#EC0D - res 3,(hl) - ld a,(hl) - xor #40 - ld (hl),a - and #40 - jr z,x26B6 - call x26BB ;выбор нижнего экрана - jr x26B9 -x26B6 call x26CE ;выбор верхнего экрана -x26B9 scf - ret - -;АДРЕС: #26BB выбор нижнего экрана -x26BB call x3881 ;очистка двух нижних строк экрана - ld hl,#EC0D - set 6,(hl) - call x2E2D ;сброс нижнего окна редактирования - call x3A88 ;установка настроек курсора для нижнего окна - call x28DF ;инициализация настроек нижнего окна - jr x26D9 - -;АДРЕС: #26CE выбор верхнего экрана -x26CE ld hl,#EC0D - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - call x3848 ;печать информационной строки 128 BASIC -x26D9 ld hl,(#FC9A) - ld a,h - or l - call nz,x334A ;поиск адреса строки бейсик программы - call x152F ;печать бейсик программы от текущей строки - jp x29F2 ;напечатать курсор - -;АДРЕС: #26E7 звуковой сигнал -x26E7 ld a,(#5C38) ;заполнение буфера редактора - srl a - -;АДРЕС: #26EC звуковой сигнал -x26EC push ix - ld d,#00 - ld e,a - ld hl,#0C80 -x26F4 rst #28 ;вызов процедуры из basic 48k - dw Rom1.x03B5 ;beep - pop ix - ret - -;АДРЕС: #26FA звуковой сигнал -x26FA push ix - ld de,#0030 - ld hl,#0300 - jr x26F4 - -;АДРЕС: #2704 cs+1 вызов меню -x2704 call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#EC0D - set 1,(hl) - dec hl - ld (hl),#00 - ld hl,(#F6EC) - call x36A8 ;печать меню basic 128k - scf - ret - -;АДРЕС: #2717 нажатие cs+1/enter в главном меню -x2717 ld hl,#EC0D - res 1,(hl) - dec hl - ld a,(hl) - ld hl,(#F6EA) - push hl - push af - call x373E ;восстановление окна экрана 14*12 из буфера - pop af - pop hl - call x3FCE ;обработка нажатой управляющей клавиши в меню - jp x29F2 - -;АДРЕС: #272E курсор вверх в главном меню -x272E scf - jr x2732 - -;АДРЕС: #2731 курсор вниз в главном меню -x2731 and a -x2732 ld hl,#EC0C - ld a,(hl) - push hl - ld hl,(#F6EC) ;адрес списка опций меню - call c,x37A7 ;вверх - call nc,x37B6 ;вниз - pop hl - ld (hl),a -x2742 scf - ret - -;АДРЕС: #2744 адреса процедур обработки опций основного меню basic 128k -x2744 db #05 ;кол-во опций - db #00: dw x2816 ;выбор опции 128 TR-DOS - db #01: dw x286C ;выбор опции 128 BASIC - db #02: dw x2885 ;выбор опции калькулятор - db #03: dw x1B47 ;выбор опции 48 BASIC - db #04: dw x2831 ;выбор опции 48 TR-DOS (вход в Tr-Dos 48k) - -;АДРЕС: #2754 текст основного меню basic 128k -x2754 db #06 ;кол-во строк - db "128 ",#FF -x275E dc "128 TR-DOS" -x2768 dc "128 BASIC" -x2771 dc "Calculator" - dc "48 BASIC" -x2783 dc "48 TR-DOS" - dc " " ;признак окончания - -;АДРЕС: #278D !!!NOT USED!!! -x278D db #20,#80,#A0 - -;АДРЕС: #2790 адреса процедур обработки опций меню в редакторе basic 128 -x2790 db #05 ;кол-во опций - db #00: dw x2742 ;возврат к редактированию - db #01: dw x2851 ;перенумерация строк программы - db #02: dw x2811 ;смена области редактирования низ/верх - db #03: dw x2862 ;печать программы на принтере - db #04: dw x281C ;выход из редактора - -;АДРЕС: #27A0 текст меню в редакторе basic 128 -x27A0 db #06 - db "Options ",#FF - dc "128 BASIC" - dc "Renumber" - dc "Screen" - dc "Print" - dc "Exit" - dc " " ;признак окончания - -;АДРЕС: #27CB адреса процедур обработки опций меню в калькуляторе -x27CB db #02 - db #00: dw x2742 ;возврат к редактированию - db #01: dw x281C ;выход в главное меню - -;АДРЕС: #27D2 текст меню в калькуляторе -x27D2 db #03 - db "Options ",#FF - dc "Calculator" - dc "Exit" - dc " " ;признак окончания - -;АДРЕС: #27EB !!!NOT USED!!! -x27EB db #16,#01,#00 ;AT 1,0 - db #10,#00 ;ink 0 - db #11,#07 ;paper 7 - db #13,#00 ;bright 0 - dc "To cancel - press BREAK twice" - -;АДРЕС: #2811 смена области редактирования низ/верх -x2811 call x269B ;ext+ss+8/Graph+Z переключение между редактированием внизу и вверху - jr x2874 ; - -;АДРЕС: #2816 выбор опции 128 TR-DOS -x2816 call x3857 ;печать информационной строки 128 TR-DOS - call x3BE9 ;запуск команды randomize 15619: rem: load "boot" - -;АДРЕС: #281С выход из редактора/калькулятора в главное меню -x281C ld hl,#EC0D - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - ld b,#00 - ld d,#17 - call x3B5E ;очистка строк экрана - call x1F20 ;установка другого стэка и ram 0 - jp x259F ;печать главного меню basic 128 и выбор опции - -;АДРЕС: #2831 выбор опции 48 TR-DOS (вход в Tr-Dos 48k) -x2831 call x3852 ;печать информационной строки 48 TR-DOS - ld hl,#0000 - push hl - ld hl,#3D30 - jp x1B4A ;включение basic48, блокировка #7FFD и переход на адрес в hl - -;АДРЕС: #283E !!!NOT USED!!! -x283E dec b - res 0,(hl) - set 6,(hl) - ld a,#07 - ld (#EC0E),a - ld bc,#0000 - call x372B - jp x1AF1 - -;АДРЕС: #2851 перенумерация строк программы -x2851 call x3888 ;перенумерация строк программы - call nc,x26E7 ;звуковой сигнал - ld hl,#0000 - ld (#5C49),hl - ld (#EC08),hl - jr x2865 - -;АДРЕС: #2862 печать программы на принтере -x2862 call x1B14 ;пункт меню редактора Print (печать на принтер) -x2865 ld hl,#EC0D - bit 6,(hl) - jr nz,x2874 - -;АДРЕС: #286C выбор опции 128 BASIC -x286C ld hl,#5C3C - res 0,(hl) - call x3848 ;печать информационной строки 128 BASIC -x2874 ld hl,#EC0D - res 5,(hl) - res 4,(hl) - ld a,#00 - ld hl,x2790 - ld de,x27A0 - jr x28B1 - -;АДРЕС: #2885 выбор опции калькулятор -x2885 ld hl,#EC0D - set 5,(hl) - set 4,(hl) - res 6,(hl) - call x28BE ;инициализация курсора для верхнего окна - call x384D ;печать информационной строки Calculator - ld a,#04 - ld (#EC0E),a - ld hl,#0000 - ld (#5C49),hl - call x152F ;печать бейсик программы от текущей строки - ld bc,#0000 - ld a,b - call x29F8 ;напечатать курсор - ld a,#04 - ld hl,x27CB - ld de,x27D2 -x28B1 ld (#EC0E),a - ld (#F6EA),hl - ld (#F6EC),de - jp x2604 - -;АДРЕС: #28BE инициализация курсора для верхнего окна -x28BE call x2E1F ;сброс верхнего окна редактирования - call x3A7F ;установка настроек курсора для верхнего окна - jp x28E8 ;инициализация настроек верхнего окна - -;АДРЕС: #28C7 возврат в главное меню -x28C7 ld b,#00 - ld d,#17 - call x3B5E ;очистка строк экрана - jp x25AD - -;настройки верхнего окна -x28D1 db #06 - db #00,#00,#00,#04,#10,#14 - -;настройки нижнего окна -x28D8 db #06 - db #00,#00,#00,#00,#01,#01 - -;АДРЕС: #28DF инициализация настроек нижнего окна -x28DF ld hl,x28D8 - ld de,#F6EE - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #28E8 инициализация настроек верхнего окна -x28E8 ld hl,x28D1 - ld de,#F6EE - jp x3FBA - -;АДРЕС: #28F1 обработка нажатия символьной клавиши -x28F1 ld hl,#EC0D - or a ;!!!ЛИШНЕЕ!!! - or a ;!!!ЛИШНЕЕ!!! - bit 0,(hl) - jp nz,x29F2 - res 7,(hl) - set 3,(hl) - push hl - push af - call x29EC ;удаление курсора, восстановление атрибутов - pop af - push af - call x2E81 ;вставка символа в буфер редактирования - pop af - ld a,b - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - pop hl - set 7,(hl) - jp nc,x29F2 - ld a,b - jp c,x29F8 - jp x29F2 - -;АДРЕС: #291B ext+ss+K удаление символа справа от курсора -x291B ld hl,#EC0D - set 3,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - call x2F12 ;удаление символа в строке в буфере редактирования - scf - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #292B delete удаление символа слева от курсора -x292B ld hl,#EC0D - res 0,(hl) - set 3,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - ccf - jp c,x29F2 ;напечатать курсор - call x2F12 ;удаление символа в строке в буфере редактирования - scf - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2944 enter ввод строки -x2944 call x29EC ;удаление курсора, восстановление атрибутов - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - push bc - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x295E - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #09 - jr z,x297A -x295E ld a,(#EC0D) - bit 3,a - jr z,x296A - call x2C8E ;вставить строку бейсик программы - jr nc,x297F -x296A call x2C4C ;поиск конца строки в буфере редактирования - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - call x2ECE ;вставка пустой строки в буфер редактирования - ld b,#00 - pop af - scf - jp x29F8 ;напечатать курсор -x297A pop af - scf - jp x29F2 ;напечатать курсор -x297F pop af - jp x29F2 ;напечатать курсор - -;АДРЕС: #2983 ext+N/Graph+W переход к первой строке бейсик программы -x2983 ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#0000 - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld a,#0F - call x3A96 ;сохранить атрибуты курсора - call x152F ;печать бейсик программы от текущей строки - scf - jp x29F2 ;напечатать курсор - -;АДРЕС: #29AB ext+T/Graph+V переход к последней строке бейсик программы -x29AB ld a,(#EC0E) - cp #04 - ret z ;это калькулятор - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#270F ;9999 - call x1F20 ;установка другого стэка и ram 0 - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - ex de,hl - rst #28 - dw Rom1.x1695 ;получить адрес первой строки программы - call x1F45 ;установка другого стэка и ram 7 - ld (#5C49),de - ld a,#0F - call x3A96 ;сохранить атрибуты курсора - call x152F ;печать бейсик программы от текущей строки - scf - jp x29F2 ;напечатать курсор - -;АДРЕС: #29D4 ext+I переход к началу текущего слова -x29D4 call x29EC ;удаление курсора, восстановление атрибутов - call x2BEA ;поиск начала слова слева от курсора - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #29E1 ext+shift+J переход к началу следующего слова -x29E1 call x29EC ;удаление курсора, восстановление атрибутов - call x2C09 ;поиск начала слова справа от курсора - jr nc,x29F2 ;напечатать курсор - ld a,b - jr x29F8 ;напечатать курсор - -;АДРЕС: #29EC удаление курсора, восстановление атрибутов -x29EC call x2A07 ;получение позиции курсора - jp x364F ;восстановление атрибутов под курсором - -;АДРЕС: #29F2 напечатать курсор -x29F2 call x2A07 ;получение позиции курсора - jp x3640 ;печать атрибутов курсора - -;АДРЕС: #29F8 напечатать курсор -x29F8 call x2A11 ;сохранить позицию курсора - push af - push bc - ld a,#0F ;paper 1, ink 7 - call x3A96 ;сохранить атрибуты курсора - pop bc - pop af - jp x3640 ;печать атрибутов курсора - -;АДРЕС: #2A07 получение позиции курсора -;вых: c - номер строки -; b - номер столбца -; a - предпочтительный номер столбца -x2A07 ld hl,#F6EE - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld a,(hl) - inc hl - ret - -;АДРЕС: #2A11 сохранить позицию курсора -x2A11 ld hl,#F6EE - ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),a - ret - -;АДРЕС: #2A1A получение текущего символа в буфере редактирования -x2A1A push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld h,#00 - ld l,b - add hl,de - ld a,(hl) - pop hl - ret - -;АДРЕС: #2A25 ss+I перемещение курсора вниз на 10 строк в поле редактирования -x2A25 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - ld d,#0A -x2A2B push de - call x2B30 ;вставить строку бейсик программы - pop de - jr nc,x29F2 ;напечатать курсор - ld a,e - call x2A11 ;сохранить позицию курсора - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - jr nc,x2A42 - dec d - jr nz,x2A2B - ld a,e - jr c,x29F8 ;напечатать курсор -x2A42 push de - call x2B0B ;вставить строку бейсик программы - pop de - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - ld a,e - or a - jr x29F8 ;напечатать курсор - -;АДРЕС: #2A4F ext+P перемещение курсора вверх на 10 строк в поле редактирования -x2A4F call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - ld d,#0A -x2A55 push de - call x2B0B ;вставить строку бейсик программы - pop de - jr nc,x29F2 ;напечатать курсор - ld a,e - call x2A11 ;сохранить позицию курсора - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - jr nc,x2A6D - dec d - jr nz,x2A55 - ld a,e - jp c,x29F8 ;напечатать курсор -x2A6D push af - call x2B30 ;вставить строку бейсик программы - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A7A ext+M/graph+X перемещение курсора в конец строки в поле редактирования -x2A7A call x29EC ;удаление курсора, восстановление атрибутов - call x2C4C ;поиск конца строки в буфере редактирования - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A87 ext+ss+2/Graph+Y переход к началу строки редактирования -x2A87 call x29EC ;удаление курсора, восстановление атрибутов - call x2C31 ;поиск начала строки редактирования в буфере - jp nc,x29F2 ;напечатать курсор - ld a,b - jp x29F8 ;напечатать курсор - -;АДРЕС: #2A94 перемещение курсора вверх в поле редактирования -x2A94 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - push de - call x2B0B ;вставить строку бейсик программы - pop de - jp nc,x29F2 ;напечатать курсор - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - ld a,e - jp c,x29F8 ;напечатать курсор - push af - call x2B30 ;вставить строку бейсик программы - ld b,#00 - call x2AF9 ;найти в строке ближайшую редактируемую позицию - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AB5 перемещение курсора вниз в поле редактирования -x2AB5 call x29EC ;удаление курсора, восстановление атрибутов - ld e,a - push de - call x2B30 ;вставить строку бейсик программы - pop de - jp nc,x29F2 ;напечатать курсор - ld b,e - call x2B02 ;найти в строке ближайшую редактируемую позицию - ld a,e - jp c,x29F8 ;напечатать курсор - push de - call x2B0B ;вставить строку бейсик программы - pop de - ld b,e - call x2AF9 ;найти в строке ближайшую редактируемую позицию - ld a,e - or a - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AD7 перемещение курсора влево в поле редактирования -x2AD7 call x29EC ;удаление курсора, восстановление атрибутов - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jp c,x29F8 ;напечатать курсор - jp x29F2 ;напечатать курсор - -;АДРЕС: #2AE3 перемещение курсора вправо в поле редактирования -x2AE3 call x29EC ;удаление курсора, восстановление атрибутов - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jp c,x29F8 ;напечатать курсор - push af - call x2B0B ;вставить строку бейсик программы - ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа - pop af - jp x29F8 ;напечатать курсор - -;АДРЕС: #2AF9 найти в строке ближайшую редактируемую позицию -x2AF9 push de - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - call nc,x2BDF ;поиск в строке влево от курсора редактируемого символа - pop de - ret - -;АДРЕС: #2B02 найти в строке ближайшую редактируемую позицию -x2B02 push de - call x2BDF ;поиск в строке влево от курсора редактируемого символа - call nc,x2BD4 ;поиск редактируемого символа в строке справа от курсора - pop de - ret - -;АДРЕС: #2B0B вставить строку бейсик программы, если требуется сдвинуть строки -; в буфере вниз и обновить экран -x2B0B call x2C7C ;вставить строку в бейсик программу, если были изменения - jr nc,x2B2F - push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - call nc,x2F80 ;сдивг строк вверх в буфере при удалении строки - pop bc - ld hl,#F6F1 - ld a,(hl) - cp c - jr c,x2B2D - push bc - call x166F ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана - pop bc - ret c - ld a,c - or a - ret z -x2B2D dec c - scf -x2B2F ret - -;АДРЕС: #2B30 вставить строку бейсик программы, если требуется сдвинуть строки -; в буфере вверх и обновить экран -x2B30 push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x2B3F ;!!!можно оптимизировать - jp x2F80 -x2B3F call x2C68 ;вставить строку бейсик программы, если были изменения - jr nc,x2B5A - ld hl,#F6F1 - inc hl - ld a,c - cp (hl) - jr c,x2B58 - push bc - push hl - call x1639 ;сдвиг всех строк в буфере редактирования верх и обновление экрана - pop hl - pop bc - ret c - inc hl - ld a,(hl) - cp c - ret z -x2B58 inc c - scf -x2B5A ret - -;АДРЕС: #2B5B поиск редактируемой позиции слева от курсора во всем буфере -x2B5B ld d,a - dec b - jp m,x2B66 - ld e,b - call x2BDF ;поиск в строке влево от курсора редактируемого символа - ld a,e - ret c -x2B66 push de - call x2B0B ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вниз и обновить эекран - pop de - ld a,e - ret nc - ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа - ld a,b - ret c - ld a,d - ld b,#00 - ret - -;АДРЕС: #2B78 поиск редактируемой позиции справа от курсора во всем буфере -;вх: b - номер столбца -; c - номер строки -;вых: cy=1 справа есть символ -; b - номер столбца с символом -; a - новый номер столбца -; hl - адрес ноовго редактируемого символа -x2B78 ld d,a - inc b - ld a,#1F - cp b - jr c,x2B85 - ld e,b - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - ld a,e - ret c -;переход к следующей строке -x2B85 dec b - push bc - push hl - ld hl,#EC0D - bit 7,(hl) - jr nz,x2BC0 ;клавиша не нажата -;нажата клавиша. вставим новую строку - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - ld a,(hl) - bit 1,a - jr nz,x2BC0 - set 1,(hl) - res 3,(hl) - ld hl,#0023 - add hl,de - ex de,hl - pop hl - pop bc - push af - call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран - pop af - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0023 - add hl,de - ex de,hl - res 0,a - set 3,a - call x2ED3 ;вставка пустой строки в буфер редактирования - call x35F4 ;создание отступа в строке в буфере редактирования - ld a,b - scf - ret -x2BC0 pop hl - pop bc - push de - call x2B30 ;вставить строку бейсик программы, если требуется сдвинуть строки в буфере вверх и обновить эекран - pop de - ld a,b - ret nc - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - ld a,b - ret c - ld a,e - ld b,#00 - ret - -;АДРЕС: #2BD4 поиск редактируемого символа в строке справа от курсора -;вх: b - номер столбца -; c - номер строки -;вых: cy=1 справа есть символ -; b - номер столбца с символом -x2BD4 push de - push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jp x2C65 - -;АДРЕС: #2BDF поиск в строке влево от курсора редактируемого символа -x2BDF push de - push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E63 ;поиск в строке влево от курсора редактируемого символа - jp x2C65 - -;АДРЕС: #2BEA поиск начала слова слева от курсора -x2BEA push de - push hl -x2BEC call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x2C07 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2BEC -x2BF8 call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x2C07 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr nz,x2BF8 - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере -x2C07 jr x2C65 - -;АДРЕС: #2C09 поиск начала слова справа от курсора -x2C09 push de - push hl -x2C0B call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jr nc,x2C2B - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr nz,x2C0B -x2C17 call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - jr nc,x2C2B - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jr nc,x2C2B - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2C17 - scf - jr x2C65 -x2C2B call nc,x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - or a - jr x2C65 - -;АДРЕС: #2C31 поиск начала строки редактирования в буфере -x2C31 push de - push hl -x2C33 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x2C45 - call x2B0B ;вставить строку бейсик программы - jr c,x2C33 - jr x2C65 -x2C45 ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - jr x2C65 - -;АДРЕС: #2C4C поиск конца строки в буфере редактирования -x2C4C push de - push hl -x2C4E call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 3,(hl) - jr nz,x2C60 - call x2B30 ;вставить строку бейсик программы - jr c,x2C4E - jr x2C65 -x2C60 ld b,#1F - call x2BDF ;поиск в строке влево от курсора редактируемого символа -x2C65 pop hl - pop de - ret - -;АДРЕС: #2C68 вставить строку бейсик программы, если были изменения -;вх: c - номер строки -;вых: cy=0 строка вставлена -x2C68 ld a,(#EC0D) - bit 3,a - scf - ret z ;изменений не было - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 3,(hl) - scf - ret z - jr x2C8E - -;АДРЕС: #2C7C вставить строку в бейсик программу, если были изменения -x2C7C ld a,(#EC0D) - bit 3,a - scf - ret z - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - scf - ret z - -;АДРЕС: #2C8E вставить строку бейсик программы -;вх: c - номер строки -;вых: cy=0 синтаксическая ошибка -; cy=1 строка вставлена -; bc - координаты курсора -; a - номер столбца -x2C8E ld a,#02 -x2C90 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x2CA3 ;это первая строка - dec c - jp p,x2C90 - ld c,#00 - ld a,#01 -x2CA3 ld hl,#EC00 - ld de,#EC03 - or #80 - ld (hl),a - ld (de),a - inc hl - inc de - ld a,#00 ;!!!можно записать xor a - ld (hl),a - ld (de),a - inc hl - inc de - ld a,c - ld (hl),a - ld (de),a - ld hl,#0000 - ld (#EC06),hl - call x335F ;копирование процедур в ram - call x3C67 ;токенизация строки бейсик программы - push ix - call x1F20 ;установка другого стэка и ram 0 - call x026B ;выполненение введенной строки - call x1F45 ;установка другого стэка и ram 7 - pop ix - ld a,(#5C3A) - inc a - jr nz,x2CEF ;есть ошибка - ld hl,#EC0D - res 3,(hl) - call x365E ;установка переменных для ввода символа - ld a,(#EC0E) - cp #04 - call nz,x152F ;печать бейсик программы от текущей строки - call x26FA ;звуковой сигнал - call x2A07 ;получение позиции курсора - scf - ret -x2CEF ld hl,#EC00 - ld de,#EC03 - ld a,(de) - res 7,a - ld (hl),a - inc hl - inc de - ld a,(de) - ld (hl),a - inc hl - inc de - ld a,(de) - ld (hl),a - call x3C63 ;токенизация строки бейсик программы с синтаксической ошибкой - jr c,x2D0A - ld bc,(#EC06) -x2D0A ld hl,(#EC06) - or a - sbc hl,bc - push af - push hl - call x2A07 ;получение позиции курсора - pop hl - pop af - jr c,x2D2A - jr z,x2D45 -x2D1B push hl - ld a,b - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2D45 - dec hl - ld a,h - or l - jr nz,x2D1B - jr x2D45 -x2D2A push hl - ld hl,#EC0D - res 7,(hl) - pop hl - ex de,hl - ld hl,#0000 - or a - sbc hl,de -x2D38 push hl - ld a,b - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере - pop hl - jr nc,x2D45 - dec hl - ld a,h - or l - jr nz,x2D38 -x2D45 ld hl,#EC0D - set 7,(hl) - call x2A11 ;сохранить позицию курсора - ld a,#17 ;paper 2, ink 7 - call x3A96 ;сохранить атрибуты курсора - or a - ret - -;АДРЕС: #2D54 получить очередной символ из строки бейсик программы -;вых: a - код символа -x2D54 ld hl,#EC00 - bit 7,(hl) - jr z,x2D62 - ld hl,(#EC06) ;увеличим количество редактируемых символов в строке - inc hl - ld (#EC06),hl -x2D62 ld hl,#EC00 - ld a,(hl) ;флаги - inc hl - ld b,(hl) ;столбец - inc hl - ld c,(hl) ;строка - push hl - and #0F - ld hl,x2D85 ;таблица адресов процедур - call x3FCE ;обработка управляющего кода - ld e,l - pop hl - jr z,x2D79 - ld a,#0D -x2D79 ld (hl),c - dec hl - ld (hl),b - dec hl - push af - ld a,(hl) - and #F0 - or e - ld (hl),a - pop af - ret -;таблица адресов процедур -x2D85 db #03 ;размер таблицы - db #02: dw x2DAC - db #04: dw x2DE9 - db #01: dw x2D8F - -;АДРЕС: #2D8F получить символ из текущей позиции курсора в буфере редактирования -;вх: c - номер строки -;вых: l=#01 -> a - код символа из верхнего буфера -; =#02 -> a - код символа из буфера -; =#04 -> a - код символа из нижнего буфера -; =#08 -> a - =#0D конец буфера редактирования -x2D8F call x32B7 ;расчет адреса начала строки в буфере редактирования -x2D92 call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2D9E ;вне пределов строки - cp #00 - jr z,x2D92 ;нет символа - ld l,#01 - ret -x2D9E inc c ;следующая строка - ld b,#00 - ld hl,(#F9DB) ;!!!ОШИБКА!!! должно быть ld hl,#F9DB - ld a,c - cp (hl) - jr c,x2D8F - ld b,#00 - ld c,#00 -;на отображаемой строчке строки бейсик программы -x2DAC push hl - ld hl,#F6EE - ld a,(hl) - cp c - jr nz,x2DBE - inc hl - ld a,(hl) - cp b - jr nz,x2DBE - ld hl,#EC00 - res 7,(hl) -x2DBE pop hl -x2DBF call x30B4 ;расчет адреса начала строки в буфере редактирования - call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2DCE ;вне пределов строки - cp #00 - jr z,x2DAC - ld l,#02 - ret -x2DCE ld hl,#0020 - add hl,de - bit 3,(hl) - jr z,x2DDB - ld l,#08 - ld a,#0D - ret -x2DDB ld hl,#F6F3 - inc c - ld a,(hl) - cp c - ld b,#00 - jr nc,x2DBF - ld b,#00 - ld c,#01 -;используется нижний экран -x2DE9 call x31C3 ;расчет адреса начала строки в буфере редактирования -x2DEC call x2E0E ;получить символ из строки буфера редактирования - jr nc,x2DF8 ;вне пределов строки - cp #00 - jr z,x2DEC - ld l,#04 - ret -x2DF8 ld hl,#0020 - add hl,de - bit 3,(hl) - jr nz,x2E09 - inc c - ld b,#00 - ld a,(#F6F5) - cp c - jr nc,x2DE9 -x2E09 ld l,#08 - ld a,#0D - ret - -;АДРЕС: #2E0E получить символ из строки буфера редактирования -;вх: b - номер столбца -; de - адрес начала строки -;вых: cy=1 символ получен -> a - код символа -x2E0E ld a,#1F - cp b - ccf - ret nc - ld l,b - ld h,#00 - add hl,de - ld a,(hl) - inc b - scf - ret - -;настройки верхнего окна редактирования -x2E1B db #01 ;количество байт - db #14 ;количество редактируемых строк - -;настройки нижнего окна редактирования -x2E1D db #01 ;количество байт - db #01 ;количество редактируемых строк - -;АДРЕС: #2E1F сброс верхнего окна редактирования -x2E1F ld hl,#5C3C - res 0,(hl) ;вывод на основной экран - ld hl,x2E1B - ld de,#EC15 - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #2E2D сброс нижнего окна редактирования -x2E2D ld hl,#5C3C - set 0,(hl) - ld bc,#0000 - call x372B ;установка координат печати из bc - ld hl,x2E1D - ld de,#EC15 - jp x3FBA ;копирование строки из hl в de в (hl+0) кол-во байт - -;АДРЕС: #2E41 поиск в строке вправо от курсора редактируемого символа -;вх: b - номер столбца, с которого следует начать поиск -; de - начало строки в буфере редактирования -;вых: cy=1 символ найден -; hl - адрес редактируемой позиции -; b - номер столбца -x2E41 ld h,#00 ;!!!можно сократить!!! call x2E7B - ld l,b - add hl,de - ld a,(hl) - cp #00 - scf - ret nz - ld a,b - or a - jr z,x2E5B - push hl - dec hl - ld a,(hl) - cp #00 - scf - pop hl - ret nz -x2E56 ld a,(hl) - cp #00 - scf - ret nz -x2E5B inc hl - inc b - ld a,b - cp #1F - jr c,x2E56 - ret - -;АДРЕС: #2E63 поиск в строке влево от курсора редактируемого символа -;вх: b - номер столбца, с которого следует начать поиск -; de - начало строки в буфере редактирования -;вых: cy=1 символ найден -; hl - адрес редактируемой позиции -; b - номер столбца -x2E63 ld h,#00 ;!!!можно сократить!!! call x2E7B - ld l,b - add hl,de - ld a,(hl) - cp #00 - scf - ret nz -x2E6C ld a,(hl) - cp #00 - jr nz,x2E78 - ld a,b - or a - ret z - dec hl - dec b - jr x2E6C -x2E78 inc b - scf - ret - -;АДРЕС: #2E7B чтение символа из буфера редактирования -;вх: b - номер столбца -; de - начало строки в буфере редактирования -;вых: a - символ по заданному адресу -x2E7B ld h,#00 - ld l,b - add hl,de - ld a,(hl) - ret - -;АДРЕС: #2E81 вставка символа в буфер редактирования -;вх: a - код символа -; bc - координаты курсора -x2E81 ld hl,#EC0D - or a ;!!!ЛИШНЕЕ!!! - bit 0,(hl) - ret nz ;буфер строки переполнен - push bc - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop af -x2E8E call x16AC ;вставка символа в строку буфера редактирования - push af - ex de,hl - call x3604 ;печать строки редактируемого буфера - ex de,hl - pop af - ccf - jr z,x2ECC ;буфер бельше не надо раздвигать - push af - ld b,#00 - inc c - ld a,(#EC15) - cp c - jr c,x2EC8 - ld a,(hl) - ld e,a - and #D7 - cp (hl) - ld (hl),a - ld a,e - set 1,(hl) - push af - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop af - jr z,x2EC2 - res 0,a - call x2ED3 ;вставка пустой строки в буфер редактирования - jr nc,x2ECC ;буфер переполнен - call x35F4 ;создание отступа в строке в буфере редактирования - pop af - jr x2E8E -x2EC2 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop af - jr x2E8E -x2EC8 pop af - call x316E ;вставка символа в нижний буфер редактирования -x2ECC pop bc - ret - -;АДРЕС: #2ECE вставка пустой строки в буфер редактирования -x2ECE call x30B4 - ld a,#09 - -;АДРЕС: #2ED3 вставка пустой строки в буфер редактирования -;вх: de - адрес строки в бефере редактирования -; a - флаги -; c - номер строки для вставки -x2ED3 push bc - push de - ld b,c - ld hl,x2EEF ;пустая строка - ld c,a - push bc - call x1675 ;сдвиг всех строк в буфер редактирования вниз с обновлением экрана - pop bc - ld a,c - jr nc,x2EEC ;буфер переполнен - ld c,b - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - ld (hl),a - scf -x2EEC pop de - pop bc - ret -x2EEF ds #20,#00 - db #09: dw #0000 - -;АДРЕС: #2F12 удаление символа в строке в буфере редактирования -x2F12 push bc - call x30B4 ;расчет адреса начала строки в буфере редактирования - push bc -x2F17 ld hl,#0020 - add hl,de - bit 1,(hl) - ld a,#00 - jr z,x2F31 - inc c - ld hl,#0023 - add hl,de - ex de,hl - ld a,(#EC15) - cp c - jr nc,x2F17 - dec c - call x31C9 ;удаление символа в нижнем буфере редактирования -x2F31 pop hl -x2F32 push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - pop hl - ld b,a - ld a,c - cp l - ld a,b - push af - jr nz,x2F41 - ld b,h - jr x2F4A -x2F41 push af - push hl - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop hl - pop af -x2F4A push hl - ld hl,#F6F4 - set 0,(hl) - jr z,x2F54 - res 0,(hl) -x2F54 call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево - push af - push bc - push de - ld hl,#F6F4 - bit 0,(hl) - jr nz,x2F6F - ld b,#00 - call x2BD4 ;поиск редактируемого символа в строке справа от курсора - jr c,x2F6F - call x2F80 ;сдивг строк вверх в буфере при удалении строки - pop de - pop bc - jr x2F74 -x2F6F pop hl - pop bc - call x3604 ;печать строки редактируемого буфера, при необходимости -x2F74 pop af - dec c - ld b,a - pop hl - pop af - ld a,b - jp nz,x2F32 - scf - pop bc - ret - -;АДРЕС: #2F80 сдивг строк вверх в буфере при удалении строки -x2F80 ld hl,#0020 - add hl,de - ld a,(hl) - bit 0,(hl) - jr nz,x2FB2 - push af - push bc - ld a,c - or a - jr nz,x2FA4 - push bc - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - ld (#FC9A),hl - ld a,(#F9DB) - ld c,a - dec c - call x32B7 ;расчет адреса начала строки в буфере редактирования - pop bc - jr x2FA8 -x2FA4 dec c - call x30B4 ;расчет адреса начала строки в буфере редактирования -x2FA8 pop bc - pop af - ld hl,#0020 - add hl,de - res 1,(hl) - or (hl) - ld (hl),a -x2FB2 ld b,c - call x30B4 ;расчет адреса начала строки в буфере редактирования - call x30DF ;сдвиг строк в буфере редактирования вверх - jp x1648 ;сдвиг всех строк в буфере редактирования верх и обновление экрана - -;АДРЕС: #2FBC ext+E удаление символов от курсора до начала текущего слова -x2FBC call x3084 ;удаление курсора и запрет на обновление экрана -x2FBF push hl - call x3095 ;проверка наличия предыдущего символа в буфере - jr z,x2FF7 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2FF8 - call x2A1A ;получение текущего символа в буфере редактирования - push af - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - pop af - cp " " - jr z,x2FBF -x2FD9 push hl - call x3095 ;проверка наличия предыдущего символа в буфере - jr z,x2FF7 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - pop hl - jr nc,x2FF8 - call x2A1A ;получение текущего символа в буфере редактирования - cp " " - jr z,x2FF3 - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x2FD9 -x2FF3 push hl - call x2B78 ;поиск редактируемой позиции справа от курсора во всем буфере -x2FF7 pop hl -x2FF8 ld a,b - push af - push hl - ld hl,#EEF5 - res 2,(hl) - ld a,(#EC15) - push bc - ld b,#00 - ld c,a - cp a - call x1605 ;печать буфера редактирования на экране - pop bc - ld hl,#EC0D - set 3,(hl) - pop hl - call x29F8 ;напечатать курсор - pop af - ret - -;АДРЕС: #3017 ext+W удаление символов от курсора до начала следующего слова -x3017 call x3084 ;удаление курсора и запрет на обновление экрана -x301A push hl - call x2A1A ;получение текущего символа в буфере редактирования - pop hl - cp #00 - scf - jr z,x2FF8 - push af - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - pop af - cp " " - jr nz,x301A -x302F call x2A1A ;получение текущего символа в буфере редактирования - cp " " - scf - jr nz,x2FF8 - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x302F - -;АДРЕС: #303E ext+K удаление символов до наала строки -x303E call x3084 ;удаление курсора и запрет на обновление экрана -x3041 push hl - call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr nz,x3059 - call x2B5B ;поиск редактируемой позиции слева от курсора во всем буфере - jr nc,x306D - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x3041 - push hl ;!!!не используется!!! -x3059 ld a,b - cp #00 - jr z,x306D - dec b - call x2A1A ;получение текущего символа в буфере редактирования - inc b - cp #00 - jr z,x306D - dec b - call x2F12 ;удаление символа в строке в буфере редактирования - jr x3059 -x306D pop hl -x306E scf - jp x2FF8 - -;АДРЕС: #3072 ext+J удаление символов до конца строки -x3072 call x3084 ;удаление курсора и запрет на обновление экрана -x3075 call x2A1A ;получение текущего символа в буфере редактирования - cp #00 - scf - jr z,x306E - push hl - call x2F12 ;удаление символа в строке в буфере редактирования - pop hl - jr x3075 - -;АДРЕС: #3084 удаление курсора и запрет на обновление экрана -x3084 ld hl,#EC0D - res 0,(hl) - call x29EC ;удаление курсора, восстановление атрибутов - ld hl,#EEF5 - set 2,(hl) - ld hl,#F6F1 - ret - -;АДРЕС: #3095 проверка наличия предыдущего символа в буфере -x3095 call x30B4 ;расчет адреса начала строки в буфере редактирования - ld hl,#0020 - add hl,de - bit 0,(hl) - jr z,x30AE - ld a,b - cp #00 - jr z,x30B2 - dec b - call x2A1A ;получение текущего символа в буфере редактирования - inc b - cp #00 - jr z,x30B2 -x30AE ld a,#01 - or a - ret -x30B2 xor a - ret - -;АДРЕС: #30B4 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x30B4 ld hl,#EC16 ;буфер редактируемой строки -x30B7 push af - ld a,c - ld de,#0023 -x30BC or a - jr z,x30C3 - add hl,de - dec a - jr x30BC -x30C3 ex de,hl - pop af - ret - -;АДРЕС: #30C6 !!!NOT USED!!! -x30C6 push de - call x30B4 - ld h,#00 - ld l,b - add hl,de - pop de - ret - -;АДРЕС: #30D0 параметры для установки буфера редактирования строки внизу экрана -x30D0 db #05 - db #00 - dw #0000 - dw #F6F8 - -;АДРЕС: #30D6 установка буфера редактирования внизу экрана -x30D6 ld hl,x30D0 - ld de,#F6F5 - jp x3FBA - -;АДРЕС: #30DF сдвиг строк в буфере редактирования вверх -x30DF push bc - push de - ld hl,#F6F5 ;колво строк в буфере редактирования - push hl - ld a,(hl) ;кол-во строк в буфере редактирования - or a - jr nz,x3101 - push hl - call x335F ;копирование процедур в ram - ld hl,(#F9D7) ;номер строки в редактируемой строке программы - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - jr nc,x30F8 ;строка не существует - ld (#F9D7),hl ;сохраним номер строки -x30F8 ld b,h - ld c,l - pop hl - call x32D6 ;копирование строки программы в буфер редактирования - dec a - jr x3116 -x3101 ld hl,#EC0D ;сдвиг всех строк вверх - res 0,(hl) - ld hl,#F6F8 - ld d,h - ld e,l - ld bc,#0023 - add hl,bc - ld bc,#02BC - ldir - dec a - scf -x3116 pop de - ld (de),a - ld hl,#F6F8 - pop de - pop bc - ret - -;АДРЕС: #311E сдвиг строк в буфере редактирования вниз -;вх: de - адрес последней строки в буфере редактирования -;вых: cy=0 буфер переполнен -; a - количество строк в буфере редактирования -; hl - fдрес первой строки в буфере редактирования -x311E push bc - push de - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #11 - jr nz,x313F ;это не первая строка - push hl - push de - inc hl - ld d,(hl) - inc hl - ld e,(hl) ;de номер строки бейсик программы - push de - call x335F ;копирование процедур в ram - pop hl - call x334A ;поиск адреса строки бейсик программы - jr nc,x313D ;строка не существует - ld (#F9D7),hl -x313D pop de - pop hl -x313F bit 0,(hl) - ld hl,#F6F5 - push hl - jr z,x314C ;это не первая строка в буфере - ld a,#00 - scf - jr x3116 -x314C ld a,(hl) - cp #14 - jr z,x3116 ;это конец буфера - ld bc,#0023 - ld hl,#F6F8 - ex de,hl - ldir - ld hl,#F9D6 - ld d,h - ld e,l - ld bc,#0023 - or a - sbc hl,bc - ld bc,#02BC - lddr - inc a - scf - jr x3116 - -;АДРЕС: #316E вставка символа в нижний буфер редактирования -;вх: hl - адрес флага текущей строки -; a - код символа для вставки в буфер -x316E push bc - push de - push af - ld b,#00 - ld c,#01 - push hl - call x31C3 ;расчет адреса начала строки в буфере редактирования - pop hl - bit 3,(hl) - res 3,(hl) - jr nz,x31A0 -x3180 call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop af -x3184 call x16AC ;вставка символа в строку буфера редактирования - jr z,x31BA - push af - ld b,#00 - inc c - ld a,c - cp #15 - jr c,x31A0 - dec hl - ld a,(hl) - inc hl - cp #00 - jr z,x31A0 - push hl - ld hl,#EC0D - set 0,(hl) ;буфер заполнен - pop hl -x31A0 bit 1,(hl) - set 1,(hl) - res 3,(hl) - call x31C3 ;расчет адреса начала строки в буфере редактирования - jr nz,x3180 - push bc - push de - call x35E6 ;зануление до конца строки в буфере редактирования - ld (hl),#08 - pop de - pop bc - call x35F4 ;создание отступа в строке в буфере редактирования - pop af - jr x3184 -x31BA ld a,c - ld (#F6F5),a - set 3,(hl) - pop de - pop bc - ret - -;АДРЕС: #31C3 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x31C3 ld hl,#F6F8 - jp x30B7 - -;АДРЕС: #31C9 удаление символа в нижнем буфере редактирования -x31C9 push bc - push de - ld hl,#EC0D - res 0,(hl) - ld a,(#F6F5) - ld c,a - or a - ld a,#00 - jr z,x321B -x31D9 call x31C3 ;расчет адреса начала строки в буфере редактирования - push af - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - jr nc,x31F2 - pop af - call x16C1 ;вставка символа в строку буфера редактирования со сдвигом влево - push af - push bc - ld b,#00 - call x2E41 ;поиск в строке вправо от курсора редактируемого символа - pop bc - jr c,x3216 -x31F2 inc hl - ld a,(hl) - push af - push bc - ld a,c - cp #01 - jr nz,x3204 - ld a,(#EC15) - ld c,a - call x30B4 ;расчет адреса начала строки в буфере редактирования - jr x3208 -x3204 dec c - call x31C3 ;расчет адреса начала строки в буфере редактирования -x3208 pop bc - pop af - ld hl,#0020 - add hl,de - res 1,(hl) - or (hl) - ld (hl),a - ld hl,#F6F5 - dec (hl) -x3216 pop af - dec c - jr nz,x31D9 - scf -x321B pop de - pop bc - ret - -;АДРЕС: #321E параметры для установки буфера редактирования строки вверху экрана -x321E db #03 - db #00: dw #F9DE - -;АДРЕС: #3222 установка буфера редактирования в верху экрана -x3222 ld hl,x321E - ld de,#F9DB - jp x3FBA - -;АДРЕС: #322B перемещение курсора вверх в верхнем буфере редактирования -x322B push bc - push de - ld hl,#F9DB - push hl - ld a,(hl) - or a - jr nz,x3253 - push hl - call x335F ;копирование процедур в ram - ld hl,(#FC9A) - call x334A ;поиск адреса строки бейсик программы - jr nc,x3244 - ld (#FC9A),hl -x3244 ld b,h - ld c,l - pop hl - inc hl - inc hl - inc hl - jr nc,x325D ;!!!ОШИБКА!!! - call x32D6 ;копирование строки программы в буфер редактирования - dec a - ex de,hl - jr x325D -x3253 ld hl,(#F9DC) - ld bc,#0023 - sbc hl,bc - scf - dec a -x325D ex de,hl - pop hl - jr nc,x3262 - ld (hl),a -x3262 inc hl - ld (hl),e - inc hl - ld (hl),d - ex de,hl - pop de - pop bc - ret - -;АДРЕС: #326A копирование строки бейсик программы в буфер редактирования вверзу экрана -x326A push bc - push de - ld hl,#0020 - add hl,de - ld a,(hl) - cpl - and #11 - jr nz,x3282 - push de - push hl - inc hl - ld d,(hl) - inc hl - ld e,(hl) - ld (#FC9A),de - pop hl - pop de -x3282 bit 3,(hl) - ld hl,#F9DB - push hl - jr z,x32A0 - push hl - call x335F ;копирование процедур в ram - ld hl,(#FC9A) - call x3352 ;преобразование номера строки в ASCII и помещение в буфер - ld (#FC9A),hl - pop hl - inc hl - inc hl - inc hl - ld a,#00 - scf - jr x325D -x32A0 ld a,(hl) - cp #14 - jr z,x32B3 - inc a - ld hl,(#F9DC) - ld bc,#0023 - ex de,hl - ldir - ex de,hl - scf - jr x325D -x32B3 pop hl - pop de - pop bc - ret - -;АДРЕС: #32B7 расчет адреса начала строки в буфере редактирования -;вх: c - номер строки -;вых: de - адрес начала строки -x32B7 ld hl,#F9DE - jp x30B7 - -;АДРЕС: #32DB таблица обработки управляющих кодов при редактировании строки -x32BD db #08 ;всего функций - db #0D: dw x35CC ;enter - db #01: dw x35DA ;null - db #12: dw x335A ;flash - db #13: dw x335A ;bright - db #14: dw x335A ;inverse - db #15: dw x335A ;over - db #10: dw x335A ;ink - db #11: dw x335A ;paper - -;АДРЕС: #32D6 копирование строки программы в буфер редактирования -;вх: hl - адрес флагов предыдущей строки в буфере редактирования -; bc - номер редактируемой строки в буфере редактирования -;вых: a - количество строк в буфере редактирования -; hl - адрес первой строки -; de - адрес последней строки -x32D6 ld d,h - ld e,l - inc de - inc de - inc de ;адрес редактируемой строки в буфере редактирования - push de - ld hl,#0020 - add hl,de ;адрес флагов редактируемой строки - ld (hl),#01 ;первая строка - inc hl - ld (hl),b - inc hl - ld (hl),c ;номер строки - ld c,#01 ;строка 1 - ld b,#00 ;колонка 0 -x32EA push bc - push de - ld a,(#EC0E) - cp #04 ;это режим калькулятора - call nz,x3517 ;нет. преобразование токена в текст - pop de - pop bc - jr c,x3307 ;токен преобразован - ld a,c - cp #01 - ld a,#0D - jr nz,x3307 ;это не 'enter' - ld a,b - or a - ld a,#01 - jr z,x3307 - ld a,#0D -x3307 ld hl,x32BD - call x3FCE ;обработка управляющего кода - jr c,x332C ;код обработан - jr z,x32EA ;следующий символ - push af - ld a,#1F - cp b - jr nc,x3326 - ld a,#12 - call x3331 ;перенос части строки на следующую строку - jr c,x3323 - pop af - ld a,#0D - jr x3307 -x3323 call x35F4 ;создание отступа в строке в буфере редактирования -x3326 pop af - call x35C5 ;сохранить символ в указанном столбце текущей строки буфера редактирования - jr x32EA -x332C pop hl - ld a,c - ret z - scf - ret - -;АДРЕС: #3331 перенос части строки на следующую строку -;вх: de - адрес начала строки в буфере редактирования строки -; b - номер столбца -; c - номер строки -; a - новое значение байта флага -;вых: cy=0 - нижняя строка в буфере -; hl - адрес байта флага для новой строки -x3331 push af - call x35E6 ;зануление до конца строки в буфере редактирования - pop af - xor (hl) - ld (hl),a - ld a,c - cp #14 - ret nc - inc c - ld hl,#0023 - add hl,de - ex de,hl - ld hl,#0020 - add hl,de - ld (hl),#00 - scf - ret - -;АДРЕС: #334A поиск адреса строки бейсик программы -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес первой команды в строке -x334A call x34B6 ;поиск адреса строки программы с заданным номером - ret c - ld hl,#0000 - ret - -;АДРЕС: #3352 преобразование номера строки в ASCII и помещение в буфер -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес начала команд в строке -; hl - номер строки (=#0000 строка не существует) -x3352 call x3430 ;преобразование номера строки в ASCII и помещение в буфер - ret c - ld hl,#0000 - ret - -;АДРЕС: #335A преобразование токена в текст -;вых: cy=0 токен преобразован -x335A call x3517 ;преобразование токена в текст - ccf - ret nc ;!!!ОШИБКА!!! должно быть ret??? - -;АДРЕС: #335F копирование процедур в ram -x335F ld hl,#0000 - ld (#FC9F),hl ;адрес следующего символа в строке бейсик программы - ld (#FCA1),hl ;адрес следующего символа в буфере ключевго слова - ld hl,x3374 - ld de,#FCAE - ld bc,#00BC - ldir - ret - -;АДРЕС: #3374 копирование токена в буфер токенов (=#FCAE) -;вх: a - номер токена -#A5 -; de - адрес в буфере -x3374 di - ld bc,#7FFD - ld d,#17 ;rom 0, ram 7, scr 5 - out (c),d - cp #50 - jr nc,x33B1 ;токен =>#F5 - cp #40 - jr nc,x33AA ;токен =>#E5 - cp #30 - jr nc,x33A3 ;токен =>#D5 - cp #20 - jr nc,x339C ;токен =>#C5 - cp #10 - jr nc,x3395 ;токен =>#B5 - ld hl,Rom1.x0095+#01 - jr x33B6 -x3395 sub #10 - ld hl,Rom1.x0095+#3A - jr x33B6 -x339C sub #20 - ld hl,Rom1.x0095+#6B - jr x33B6 -x33A3 sub #30 - ld hl,Rom1.x0095+#A9 - jr x33B6 -x33AA sub #40 - ld hl,Rom1.x0095+#F6 - jr x33B6 -x33B1 sub #50 - ld hl,Rom1.x0095+#13F -x33B6 ld b,a - or a -x33B8 jr z,x33C3 -x33BA ld a,(hl) - inc hl - and #80 - jr z,x33BA - dec b - jr x33B8 - -;АДРЕС: #33C3 копирование токена (=#FCFD) -;вх: - адрес токена в rom 1 -x33C3 ld de,#FCA3 - ld (#FCA1),de - ld a,(#FC9E) - or a - ld a,#00 - ld (#FC9E),a - jr nz,x33D9 - ld a," " - ld (de),a - inc de -x33D9 ld a,(hl) - ld b,a - inc hl - ld (de),a - inc de - and #80 - jr z,x33D9 - ld a,b - and #7F - dec de - ld (de),a - inc de - ld a," "+#80 - ld (de),a - ld a,#07 ;rom 0, ram 7, scr 5 - ld bc,#7FFD - out (c),a - ei - ret - -;АДРЕС: #33F4 распознавание токена (=#FD2E) -;вых: cy=1 токен найден -> a - код токена -x33F4 di - ld bc,#7FFD - ld d,#17 ;rom 0, ram 7, scr 5 - out (c),d - ld hl,Rom1.x0095+#01 - ld b,#A5 -x3401 ld de,#FD74 ;адрес слова -x3404 ld a,(de) - and #7F - cp #61 - ld a,(de) - jr c,x340E - and #DF ;в верхний регистр -x340E cp (hl) - jr nz,x341A ;не совпадает - inc hl - inc de - and #80 - jr z,x3404 ;совпадает, следующий символ - scf - jr x3426 ;токен найден -x341A inc b - jr z,x3425 -x341D ld a,(hl) ;ищем следующий токен - and #80 - inc hl - jr z,x341D - jr x3401 -x3425 or a -x3426 ld a,b - ld d,#07 ;rom 0, ram 7, scr 5 - ld bc,#7FFD - out (c),d - ei - ret - -;АДРЕС: #3430 преобразование номера строки в ASCII и помещение в буфер -;вх: hl - номер строки -;вых: cy=1 строка существует -; de - адрес начала команд в строке -; hl - номер строки -x3430 call x34EA ;обнуление указателей в бейсик строке - or a ;!!!ОШИБКА!!! должно быть xor a - ld (#FC9E),a - call x1F20 ;установка другого стэка и ram 0 - call x34F6 ;поиск адрес строки бейсик программы в памяти - jr nc,x3491 ;строка не найдена - jr nz,x344D ;строка не найдена, но есть следующая - ld a,b - or c - jr z,x344D ;это первая строки программы - call x34CF ;расчет адреса следущей строки бейсик программы - call x34D9 ;проверка на конец бейсик программы - jr nc,x3491 ;это последняя строка программы -x344D ld d,(hl) - inc hl - ld e,(hl) ;de - номер строки - call x1F45 ;установка другого стэка и ram 7 - push de - push hl - push ix - ld ix,#FCA3 ;буфер токена - ld (#FCA1),ix - ex de,hl - ld b,#00 - ld de,-1000 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-100 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-10 - call x3495 ;выделение разряда числа и занесение его в буфер - ld de,-1 - call x3495 ;выделение разряда числа и занесение его в буфер - dec ix ;!!!можно оптимизировать set 7,(ix-1) - ld a,(ix+#00) ;!!!можно оптимизировать - or #80 ;!!!можно оптимизировать - ld (ix+#00),a ;!!!можно оптимизировать - pop ix - pop hl - pop de - inc hl - inc hl - inc hl - ld (#FC9F),hl - ex de,hl - scf - ret -x3491 call x1F45 ;установка другого стэка и ram 7 - ret - -;АДРЕС: #3495 выделение разряда числа и занесение его в буфер -;вх: de - делитель -; hl - номер строки -; ix - адрес в буфере для записи номера строки в ASCII -; b =#00 старший разряд числа еще не найден -;вых: ix - следующий адрес в буфере -; b =#01 старший разряд числа найден -x3495 xor a -x3496 add hl,de - inc a - jr c,x3496 - sbc hl,de - dec a - add a,#30 - ld (ix+#00),a - cp "0" - jr nz,x34B1 - ld a,b - or a - jr nz,x34B3 - ld a,#00 - ld (ix+#00),a - jr x34B3 -x34B1 ld b,#01 -x34B3 inc ix - ret - -;АДРЕС: #34B6 поиск адрес строки программы с заданным номером или следущей -; строки, если строка с заданным номером не существует -;вх: hl - номер строки -;вых: cy=1 строка найдена -; de - адрес начала команд в строке -; hl - номер строки -x34B6 call x34EA ;обнуление указателей в бейсик строке - or a ;!!!ОШИБКА!!! должно быть xor a - ld (#FC9E),a - call x1F20 ;установка другого стэка и ram 0 - call x34F6 ;поиск адрес строки бейсик программы в памяти - jr nc,x3491 ;строка не существует - ex de,hl - ld a,l - or h - scf - jp nz,x344D - ccf - jr x3491 - -;АДРЕС: #34CF расчет адреса следущей строки бейсик программы -;вх: hl - адрес текущей строки -;вых: de - адрес текущей строки -; hl - адрес следующей строки -x34CF push hl - inc hl - inc hl - ld e,(hl) - inc hl - ld d,(hl) - inc hl - add hl,de - pop de - ret - -;АДРЕС: #34D9 проверка на конец бейсик программы -;вх: hl - адрес в строке -;вых: cy=0 - это конец строки -x34D9 ld a,(hl) - and #C0 - scf - ret z - ccf - ret - -;АДРЕС: #34E0 сравнение номера строки с заданным -;вх: hl - адрес номера строки в бейсик программе -; bc - номер строки -;вых: z, cy=1 - строка найдена -; nz, cy=1 - bc<(hl) -; nz, cy=0 - bc>(hl) -x34E0 ld a,b - cp (hl) - ret nz - ld a,c - inc hl - cp (hl) - dec hl - ret nz - scf - ret - -;АДРЕС: #34EA обнуление указателей в бейсик строке -x34EA push hl - ld hl,#0000 - ld (#FCA1),hl - ld (#FC9F),hl - pop hl - ret - -;АДРЕС: #34F6 поиск адрес строки бейсик программы в памяти -;вх: hl - номер строки (=#0000 первая строка) -;вых: cy=1 - искомая или следующая строка существует -; nz - строка не найдена -; hl - адрес строки программы (=#0000 строка не существует) -; de - адрес предыдущей строки программы (=#0000 строка не существует) -; bc - номер строки (=#0000 первая строка) -x34F6 push hl - pop bc - ld de,#0000 - ld hl,(#5C53) - call x34D9 ;проверка на конец бейсик программы - ret nc ;конец программы - call x34E0 ;сравнение номера строки с заданным - ret c - ld a,b - or c - scf - ret z ;нужна первая строка -x350A call x34CF ;расчет адреса следущей строки бейсик программы - call x34D9 ;проверка на конец бейсик программы - ret nc ;это конец программы - call x34E0 ;сравнение номера строки с заданным - jr nc,x350A ;не та строка, ищем дальше - ret - -;АДРЕС: #3517 преобразование токена в текст -;вых: cy=1 токен преобразован -x3517 ld hl,(#FCA1) ;адрес следующего символа - ld a,l - or h - jr z,x353C ;нет символа - ld a,(hl) - inc hl - cp " "+#80 - ld b,a - ld a,#00 - jr nz,x3529 ;не последний символ - ld a,#FF -x3529 ld (#FC9E),a ;флаг - ld a,b - bit 7,a - jr z,x3534 ;не последний символ -x3531 ld hl,#0000 -x3534 ld (#FCA1),hl - and #7F - jp x358F -x353C ld hl,(#FC9F) - ld a,l - or h - jp z,x3591 ;больше нечего обрабатывать - call x1F20 ;установка другого стэка и ram 0 -x3547 ld a,(hl) - cp #0E - jr nz,x3554 ;это не число с плавающей точкой - inc hl - inc hl - inc hl - inc hl - inc hl - inc hl - jr x3547 -x3554 call x1F45 ;установка другого стэка и ram 7 - inc hl - ld (#FC9F),hl - cp #A5 ;'RND' - jr c,x3567 ;не токен basic48 - sub #A5 ;!!!ОШИБКА - call #FCAE ;x335F копирование токена в буфер - jp x3517 -x3567 cp #A3 ;токены basic128: SPECTRUM или PLAY - jr c,x357B - jr nz,x3572 ;PLAY - ld hl,x3594 - jr x3575 -x3572 ld hl,x359C ;SPECTRUM -x3575 call #FCFD ;x33C3 копирование токена - jp x3517 -x357B push af - ld a,#00 - ld (#FC9E),a - pop af - cp #0D - jr nz,x358F - ld hl,#0000 ;конец строки - ld (#FCA1),hl - ld (#FC9F),hl -x358F scf - ret -x3591 scf - ccf - ret - -;АДРЕС: #3594 токены basic128 -x3594 dc "SPECTRUM" -x359C dc "PLAY" -x35A0 dc "GOTO" -x35A4 dc "GOSUB" -x35A9 dc "DEFFN" -x35AE dc "OPEN#" -x35B3 dc "CLOSE#" - -;АДРЕС: #35BC установка параметров отступа -x35B9 db #02 - db #01,#05 -x35BC ld hl,x35B9 - ld de,#FD6A - jp x3FBA - -;АДРЕС: #35C5 сохранить символ в указанном столбце текущей строки буфера редактирования -;вх: b - номер столбца -; de - начальный адрес строки -; a - код символа -;вых: b - номер следующего столбца -x35C5 ld l,b - ld h,#00 - add hl,de - ld (hl),a - inc b - ret - -;АДРЕС: #35CC процедура обработки нажатия 'enter' в строке -;вых: cy=1 -x35CC call x35E6 ;зануление до конца строки в буфере редактирования - ld a,(hl) - or #18 - ld (hl),a - ld hl,#FD6A - set 0,(hl) - scf - ret - -;АДРЕС: #35DA процедура обработки зануления до конца строки -;вых: cy=1 -x35DA call x35E6 ;зануление до конца строки в буфере редактирования - set 3,(hl) - ld hl,#FD6A ;!!!можно сократить jr x35CC+nn - set 0,(hl) - scf - ret - -;АДРЕС: #35E6 зануление до конца строки в буфере редактирования -;вх: b - номер первого столбца -; de - адрес начала строки редактирования -;вых: hl - адрес байта флага строки -x35E6 ld l,b - ld h,#00 - add hl,de - ld a," " -x35EC cp b - ret z - ld (hl),#00 - inc hl - inc b - jr x35EC - -;АДРЕС: #35F4 создание отступа в строке в буфере редактирования -;вх: de - адрес строки в буфере редактирования -;вых: b - первый используемый номер столбца в строке -x35F4 ld a,(#FD6B) - ld b,#00 -x35F9 ld h,#00 - ld l,b - add hl,de - ld (hl),#00 - inc b - dec a - jr nz,x35F9 - ret - -;АДРЕС: #3604 печать строки редактируемого буфера, при необходимости -x3604 push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x3614 ;обновлять экран не надо - ld b,c - call x3B1E ;печать строки редактируемого буфера -x3614 pop hl - pop de - pop bc - ret - -;АДРЕС: #3618 сдвиг вверх строк в буфере редактирования при необходимости -;вх: hl - адрес первой строки в буфере -; c - количество строк -; b - номер строки от которой будет сдвиг -x3618 push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x3628 - ld e,c - call x3ABF ;сдвиг вверх строк в буфере редактирования -x3628 pop hl - pop de - pop bc - ret - -;АДРЕС: #362C сдвиг вниз строк в буфере редактирования при необходимости -;вх: hl - адрес первой строки в буфере -; c - количество строк -; b - номер строки от которой будет сдвиг -x362C push bc - push de - push hl - push hl - ld hl,#EEF5 - bit 2,(hl) - pop hl - jr nz,x363C - ld e,c - call x3AC6 ;сдвиг вниз строк в буфере редактирования -x363C pop hl - pop de - pop bc - ret - -;АДРЕС: #3640 печать атрибутов курсора -;вх: c - номер строки -; b - номер столбца -x3640 push af - push bc - push de - push hl - ld a,b - ld b,c - ld c,a - call x3A9D ;печать атрибутов курсора - pop hl - pop de - pop bc - pop af - ret - -;АДРЕС: #364F восстановление атрибутов под курсором -;вх: c - crd Y, b - crd X -x364F push af - push bc - push de - push hl - ld a,b - ld b,c - ld c,a - call x3AB2 ;восстановление атрибутов под курсором - pop hl - pop de - pop bc - pop af - ret - -;АДРЕС: #365E установка переменных для ввода символа -x365E ld a,#00 - ld (#5C41),a ;Число, определяющее режим ввода с клавиатуры - ld a,#02 - ld (#5C0A),a ;Период автоповтора -x3668 ld hl,#5C3B - ld a,(hl) - or #0C - ld (hl),a ;ввод символа - ld hl,#EC0D - bit 4,(hl) - ld hl,x5B66 - jr nz,x367C - res 0,(hl) - ret -x367C set 0,(hl) - ret - -;АДРЕС: #367F ожидание нажатия клавиши -;вых: a - код клавиши -x367F push hl -x3680 ld hl,#5C3B -x3683 bit 5,(hl) - jr z,x3683 ;клавиша не нажата - res 5,(hl) - ld a,(#5C08) ;Код нажатой клавиши - ld hl,#5C41 - res 0,(hl) - cp #20 - jr nc,x36A2 ;символьная клавиша - cp #10 - jr nc,x3680 ;нет реакции - cp #06 - jr c,x3680 - call x36A4 - jr nc,x3680 -x36A2 pop hl - ret -x36A4 rst #28 ;вызов п/п из basic 48 - dw Rom1.x10DB ;обработка кода клавиши - ret - -;АДРЕС: #36A8 печать меню basic 128k -;вх: hl - адрес описания меню -x36A8 push hl - call x373B ;сохранение окна экрана 14*12 в буфере - ld hl,#5C3C - res 0,(hl) - pop hl - ld e,(hl) - inc hl - push hl - ld hl,x37EC ;управляющие коды для печати меню - call x3733 ;печать строки из hl - pop hl - call x3733 - push hl - call x3822 ;печать эмблемы ZX (косые цветные полосы) в меню - ld hl,x37FA ;управляющие коды для печати меню - call x3733 ;печать строки из hl - pop hl -;печать строчек меню - push de - ld bc,#0807 - call x372B ;установка координат печати из bc -x36D1 push bc - ld b,#0C - ld a,#20 - rst #10 ;пробел -x36D7 ld a,(hl) ;печать строчки меню - inc hl - cp #80 - jr nc,x36E0 - rst #10 - djnz x36D7 -x36E0 and #7F - rst #10 -x36E3 ld a,#20 ;дополняем пробелами - rst #10 - djnz x36E3 - pop bc - inc b - call x372B ;установка координат печати из bc - dec e - jr nz,x36D1 - ld hl,#6F38 - pop de -;печать рамки вокруг меню - sla e - sla e - sla e - ld d,e - dec d - ld e,#6F - ld bc,#FF00 - ld a,d - call x3719 ;печать одной линии вокруг меню - ld bc,#0001 - ld a,e - call x3719 ;печать одной линии вокруг меню - ld bc,#0100 - ld a,d - inc a - call x3719 ;печать одной линии вокруг меню - xor a - call x37CA ;атрибутов опции меню - ret - -;АДРЕС: #3719 печать одной линии вокруг меню -;вх: hl - координаты -; bc - приращение координат -x3719 push af - push hl - push de - push bc - ld b,h - ld c,l - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x22E9 ;печать точки - pop bc - pop de - pop hl - pop af - add hl,bc - dec a - jr nz,x3719 - ret - -;АДРЕС: #372B установка координат печати из bc -;вх: bc - координаты печати -x372B ld a,#16 - rst #10 - ld a,b - rst #10 - ld a,c - rst #10 - ret - -;АДРЕС: #3733 печать строки из hl -;вх: hl - адрес строки -x3733 ld a,(hl) - inc hl - cp #FF - ret z - rst #10 ;печать символа из A - jr x3733 - -;АДРЕС: #373B сохранение окна экрана 14*12 в буфере -x373B scf - jr x373F - -;АДРЕС: #373E восстановление окна экрана 14*12 из буфера -x373E and a -x373F ld de,#EEF6 - ld hl,#5C3C - jr c,x3748 - ex de,hl -x3748 ldi - jr c,x374D - ex de,hl -x374D ld hl,#5C7D ;Координаты X и Y последней изображенной на экране точки - jr c,x3753 - ex de,hl -x3753 ld bc,#0014 - ldir - jr c,x375B - ex de,hl -x375B ex af,af' - ld bc,#0707 - call x3B94 - ld a,(ix+#01) - add a,b - ld b,a - ld a,#0C -x3769 push bc - push af - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ld bc,#0007 - add hl,bc - pop de - call x377E ;сохранение/восстановление 14 знакомест экана в буфере - pop af - pop bc - dec b - dec a - jr nz,x3769 - ret - -;АДРЕС: #377E сохранение/восстановление 14 знакомест экана в буфере -;вх: cy' =1 сохранение части экрана в буфере -; =0 восстановление части экрана из буфера -; hl - адрес на экране -; de - адрес в буфере -x377E ld bc,#080E -x3781 push bc - ld b,#00 - push hl - ex af,af' - jr c,x3789 - ex de,hl -x3789 ldir - jr c,x378E - ex de,hl -x378E ex af,af' - pop hl - inc h - pop bc - djnz x3781 - push bc - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - pop de - pop bc - ex af,af' - jr c,x37A0 - ex de,hl -x37A0 ldir - jr c,x37A5 - ex de,hl -x37A5 ex af,af' - ret - -;АДРЕС: #37A7 клавиша вверх в меню basic128 -;вх: a - номер опции -; hl - адрес списка опций меню -x37A7 call x37CA ;инвертирование атрибутов опции меню - dec a - jp p,x37B1 - ld a,(hl) - dec a - dec a -x37B1 call x37CA ;инвертирование атрибутов опции меню - scf - ret - -;АДРЕС: #37B6 клавиша вниз в меню basic128 -;вх: a - номер опции -; hl - адрес списка опций меню -x37B6 push de - call x37CA ;инвертирование атрибутов опции меню - inc a - ld d,a - ld a,(hl) - dec a - dec a - cp d - ld a,d - jp p,x37C5 - xor a -x37C5 call x37CA ;инвертирование атрибутов опции меню - pop de - ret - -;АДРЕС: #37CA инвертирование атрибутов опции меню -;вх: a - номер опции -x37CA push af - push hl - push de - ld hl,#5907 - ld de,#0020 - and a - jr z,x37DA -x37D6 add hl,de - dec a - jr nz,x37D6 -x37DA ld a,%01111000 ;bright 1, paper 7, ink 0 - cp (hl) - jr nz,x37E1 - ld a,%01101000 ;bright 1, paper 5, ink 0 -;печать атрибутов опции -x37E1 ld d,#0E -x37E3 ld (hl),a - inc hl - dec d - jr nz,x37E3 - pop de - pop hl - pop af - ret - -;АДРЕС: #37EC управляющие коды для печати меню -x37EC db #16,#07,#07 ;координаты - db #15,#00 ;over 0 - db #14,#00 ;inverse 0 - db #10,#07 ;ink 7 - db #11,#00 ;paper 0 - db #13,#01 ;bright 1 - db #FF - -;АДРЕС: #37FA управляющие коды для печати меню -x37FA db #11,#00,#20 ;paper 0 - db #11,#07 ;paper 7 - db #10,#00 ;ink 0 - db #FF - -;АДРЕС: #3802 данные потоков для печати эмблемы -x3802 db #01,#03,#07,#0F,#1F,#3F,#7F,#FF - db #FE,#FC,#F8,#F0,#E0,#C0,#80,#00 - -;АДРЕС: #3812 управляющие коды для печати косых полос в меню -x3812 db #10,#02,#20 ;ink 2 - db #11,#06,#21 ;paper 6 - db #10,#04,#20 ;ink 4 - db #11,#05,#21 ;paper 5 - db #10,#00,#20 ;ink 0 - db #FF - -;АДРЕС: #3822 печать эмблемы ZX (косые цветные полосы) в меню -x3822 push bc - push de - push hl - ld hl,x3802 - ld de,x5B98 - ld bc,#0010 - ldir - ld hl,(#5C36) - push hl - ld hl,#5A98 - ld (#5C36),hl - ld hl,x3812 ;управляющие коды для печати косых полос в меню - call x3733 ;печать строки из hl - pop hl - ld (#5C36),hl - pop hl - pop de - pop bc - ret - -;АДРЕС: #3848 печать информационной строки 128 BASIC -x3848 ld hl,x2768 - jr x385A - -;АДРЕС: #384D печать информационной строки Calculator -x384D ld hl,x2771 - jr x385A - -;АДРЕС: #3852 печать информационной строки 48 TR-DOS -x3852 ld hl,x2783 - jr x385A - -;АДРЕС: #3857 печать информационной строки 128 TR-DOS -x3857 ld hl,x275E ;сообщение "128 TR-DOS" -x385A push hl - call x3881 ;очистка двух нижних строк экрана - ld hl,#5AA0 ;установка атрибутов в строке - ld b,#20 - ld a,#40 ;bright 1, paper 0, ink 0 -x3865 ld (hl),a - inc hl - djnz x3865 - ld hl,x37EC ;управляющие коды для печати меню - call x3733 ;печать строки из hl - ld bc,#1500 - call x372B ;установка координат печати из bc - pop de - call x057D ;печать строки из de - ld c,#1A - call x372B ;установка координат печати из bc - jp x3822 ;печать эмблемы ZX (косые цветные полосы) в меню - -;АДРЕС: #3881 очистка двух нижних строк экрана -x3881 ld b,#15 - ld d,#17 - jp x3B5E - -;АДРЕС: #3888 перенумерация строк программы -x3888 call x1F20 ;установка другого стэка и ram 0 - call x3A05 ;подсчет количества строк в бейсик программе - ld a,d - or e - jp z,x39C0 - ld hl,(x5B96) - rst #28 ;!!!ОШИБКА!!! - dw Rom1.x30A9 ;hl=hl*de - ex de,hl - ld hl,(x5B94) - add hl,de - ld de,10000 - or a - sbc hl,de - jp nc,x39C0 - ld hl,(#5C53) -x38AA rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - inc hl - inc hl - ld (x5B92),hl - inc hl - inc hl - ld (x5B67+4),de -x38B8 ld a,(hl) - rst #28 - dw Rom1.x18B6 ;пропуск натурального числа - cp #0D - jr z,x38C5 - call x390E ;анализ строки и перенумерование ссылок на номера строк - jr x38B8 -x38C5 ld de,(x5B67+4) - ld hl,(#5C4B) - and a - sbc hl,de - ex de,hl - jr nz,x38AA -x38D2 call x3A05 ;подсчет количества строк в бейсик программе - ld b,d - ld c,e - ld de,#0000 - ld hl,(#5C53) -x38DD push bc - push de - push hl - ld hl,(x5B96) - rst #28 - dw Rom1.x30A9 ;hl=hl*de - ld de,(x5B94) - add hl,de - ex de,hl - pop hl - ld (hl),d - inc hl - ld (hl),e - inc hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - add hl,bc - pop de - inc de - pop bc - dec bc - ld a,b - or c - jr nz,x38DD - call x1F45 ;установка другого стэка и ram 7 - ld (x5B92),bc - scf - ret - -;токены, использующие ссылки на строки -x3907 db #CA ;LINE - db #F0 ;LIST - db #E1 ;LLIST - db #EC ;GO TO - db #ED ;GO SUB - db #E5 ;RESTORE - db #F7 ;RUN - -;АДРЕС: #390E анализ строки и перенумерование ссылок на номера строк -x390E inc hl - ld (x5B78+1),hl - ex de,hl - ld bc,#0007 - ld hl,x3907 -x3919 cpir - ex de,hl - ret nz - ld c,#00 -x391F ld a,(hl) - cp " " - jr z,x393F - rst #28 - dw Rom1.x2D1B ;это цифра? - jr nc,x393F - cp "." - jr z,x393F - cp #0E - jr z,x3943 - or #20 - cp "e" - jr nz,x393B - ld a,b - or c - jr nz,x393F -x393B ld hl,(x5B78+1) - ret -x393F inc bc - inc hl - jr x391F -x3943 ld (x5B71),bc - push hl - rst #28 - dw Rom1.x18B6 ;пропуск натурального числа - call x3A36 ;пропуск пробелов в строке - ld a,(hl) - pop hl - cp ":" - jr z,x3957 - cp #0D - ret nz -x3957 inc hl - rst #28 - dw Rom1.x33B4 ;поместить число на смэк калькулятора - rst #28 - dw Rom1.x2DA2 ;извлечь значение со стэка калькулятора - ld h,b - ld l,c - rst #28 - dw Rom1.x196E ;получить начальный адрес строки программы - jr z,x396F - ld a,(hl) - cp #80 - jr nz,x396F - ld hl,#270F ;9999 - jr x3980 -x396F ld (x5B76+1),hl - call x3A0B ;подсчет количества строк - ld hl,(x5B96) - rst #28 - dw Rom1.x30A9 ;hl=hl*de - ld de,(x5B94) - add hl,de -x3980 ld de,x5B72+1 - push hl - call x3A3C ;номер строки в ASCII - ld e,b - inc e - ld d,#00 - push de - push hl - ld l,e - ld h,#00 - ld bc,(x5B71) - or a - sbc hl,bc - ld (x5B71),hl - jr z,x39CF - jr c,x39C5 - ld b,h - ld c,l - ld hl,(x5B78+1) - push hl - push de - ld hl,(#5C65) - add hl,bc - jr c,x39BE - ex de,hl - ld hl,#0082 - add hl,de - jr c,x39BE - sbc hl,sp - ccf - jr c,x39BE - pop de - pop hl - rst #28 - dw Rom1.x1655 ;резервирование места (длина в bc) - jr x39CF -x39BE pop de - pop hl -x39C0 call x1F45 ;установка другого стэка и ram 7 - and a - ret -x39C5 dec bc - dec e - jr nz,x39C5 - ld hl,(x5B78+1) - rst #28 - dw Rom1.x19E8 ;удалить массив DIM -x39CF ld de,(x5B78+1) - pop hl - pop bc - ldir - ex de,hl - ld (hl),#0E - pop bc - inc hl - push hl - rst #28 - dw Rom1.x2D2B ;bc на стэк калькулятора - pop de - ld bc,#0005 - ldir - ex de,hl - push hl - ld hl,(x5B92) - push hl - ld e,(hl) - inc hl - ld d,(hl) - ld hl,(x5B71) - add hl,de - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d - ld hl,(x5B67+4) - ld de,(x5B71) - add hl,de - ld (x5B67+4),hl - pop hl - ret - -;АДРЕС: #3A05 подсчет количества строк в бейсик программе -x3A05 ld hl,(#5C4B) - ld (x5B76+1),hl -x3A0B ld hl,(#5C53) - ld de,(x5B76+1) - or a - sbc hl,de - jr z,x3A31 - ld hl,(#5C53) - ld bc,#0000 -x3A1D push bc - rst #28 - dw Rom1.x19B8 ;поиск адрес начала следующей строки программы - ld hl,(x5B76+1) - and a - sbc hl,de - jr z,x3A2E - ex de,hl - pop bc - inc bc - jr x3A1D -x3A2E pop de - inc de - ret -x3A31 ld de,#0000 - ret - -;АДРЕС: #3A35 пропуск пробелов в строке -x3A35 inc hl -x3A36 ld a,(hl) - cp " " - jr z,x3A35 - ret - -;АДРЕС: #3A3C номер строки в ASCII -x3A3C push de - ld bc,-1000 - call x3A60 ;получить один разря числа в ASCII - ld bc,-100 - call x3A60 ;получить один разря числа в ASCII - ld c,-10 - call x3A60 ;получить один разря числа в ASCII - ld a,l - add a,"0" - ld (de),a - inc de - ld b,#03 - pop hl -x3A56 ld a,(hl) - cp "0" - ret nz - ld (hl)," " - inc hl - djnz x3A56 - ret - -;АДРЕС: #3A60 получить один разря числа в ASCII -x3A60 xor a -x3A61 add hl,bc - inc a - jr c,x3A61 - sbc hl,bc - dec a - add a,"0" - ld (de),a - inc de - ret - -;настройки курсора -x3A6D db #08 - db #00,#00,#14,#00,#00,#00,#0F,#00 - -;настройки курсора -x3A76 db #08 - db #00,#16,#01,#00,#00,#00,#0F,#00 - -;АДРЕС: #3A7F установка настроек курсора для верхнего окна -x3A7F ld ix,#FD6C - ld hl,x3A6D - jr x3A8B - -;АДРЕС: #3A88 установка настроек курсора для нижнего окна -x3A88 ld hl,x3A76 -x3A8B ld de,#FD6C - jp x3FBA - -;АДРЕС: #3A91 !!!NOT USED!!! -x3A91 rst #10 - ld a,d - rst #10 - scf - ret - -;АДРЕС: #3A96 сохранить атрибуты курсора -x3A96 and #3F - ld (ix+#06),a - scf - ret - -;АДРЕС: #3A9D печать атрибутов курсора -;вх: b - номер строки -; c - номер столбца -; ix - адрес дескриптора курсора -x3A9D ld a,(ix+#01) - add a,b - ld b,a - call x3BA0 ;расчет адреса атрибутов - ld a,(hl) - ld (ix+#07),a ;сохраним атрибуты - cpl - and #C0 - or (ix+#06) - ld (hl),a - scf - ret - -;АДРЕС: #3AB2 восстановление атрибутов под курсором -;вх: b - crd Y -; c - crd X -; ix - адрес описания курсора -x3AB2 ld a,(ix+#01) - add a,b - ld b,a - call x3BA0 ;расчет адреса атрибутов - ld a,(ix+#07) - ld (hl),a - ret - -;АДРЕС: #3ABF сдвиг вверх строк в буфере редактирования -;вх: hl - адрес первой строки в буфере -; e - количество строк -; b - номер строки от которой будет сдвиг -x3ABF push hl - ld h,#00 ;сдвиг вверх - ld a,e - sub b ;a - количество строк для сдвига - jr x3ACD - -;АДРЕС: #3AC6 сдвиг вниз строк в буфере редактирования -;вх: hl - адрес первой строки в буфере -; e - количество строк -; b - номер строки от которой будет сдвиг -x3AC6 push hl - ld a,e - ld e,b - ld b,a - sub e ;a - количество строк для сдвига - ld h,#FF ;сдвиг вниз - -;сдвиг строк -x3ACD ld c,a - ld a,b - cp e - jr z,x3B1D ;сдвигать не надо - push de - call x3B98 ;расчет количества строк от заданной до низа экрана -x3AD6 push bc - ld c,h - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ex de,hl - xor a - or c - jr z,x3AE3 ;вверх - inc b ;вниз - jr x3AE4 -x3AE3 dec b -x3AE4 push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - pop de - ld a,c - ld c,#20 - ld b,#08 -x3AEE push bc ;скролл знакоместной строки - push hl - push de - ld b,#00 - ldir - pop de - pop hl - pop bc - inc h - inc d - djnz x3AEE - push af ;скролл атрибутной строки - push de - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - ex (sp),hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - ex (sp),hl - pop de - ld bc,#0020 - ldir - pop af - pop bc - and a - jr z,x3B16 ;вверх - inc b - jr x3B17 -x3B16 dec b -x3B17 dec c - ld h,a - jr nz,x3AD6 - pop de - ld b,e -x3B1D pop hl - -;АДРЕС: #3B1E печать строки редактируемого буфера -;вх: b - координата печати Y -; hl - адрес начала строки -x3B1E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - ex de,hl - ld a,(#5C3C) ;TVFLAG - push af - ld hl,#EC0D - bit 6,(hl) ;в какой области идет редактирование буфера - res 0,a - jr z,x3B31 - set 0,a -x3B31 ld (#5C3C),a - ld c,#00 - call x372B ;установка координат печати из bc - ex de,hl - ld b,#20 -x3B3C ld a,(hl) - and a - jr nz,x3B42 - ld a,#20 -x3B42 cp #90 - jr nc,x3B55 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0010 ;!!!можно заменить на rst #10!!! -x3B49 inc hl - djnz x3B3C - pop af - ld (#5C3C),a - call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - scf ;!!!ЛИШНЕЕ!!! - ret ;!!!тоже тогда убрать!!! -x3B55 call x1F20 ;установка другого стэка и ram 0 - rst #10 - call x1F45 ;установка другого стэка и ram 7 - jr x3B49 - -;АДРЕС: #3B5E очистка строк экрана -;вх: b - номер первой строки экрана -; d - номер последней строки экрана -x3B5E call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - ld a,d - sub b - inc a - ld c,a ;количество строк - call x3B98 ;b - номер начальной строки экрана -x3B68 push bc ;c - кол-во строк - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E9B ;расчет адреса на экране по координатам - ld c,#08 ;занулим строку занкомест -x3B6E push hl - ld b,#20 ;занулим строку пикселей - xor a -x3B72 ld (hl),a - inc hl - djnz x3B72 - pop hl - inc h - dec c - jr nz,x3B6E - ld b,#20 - push bc - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x0E88 ;расчет адреса в атрибутах по координатам - ex de,hl - pop bc - ld a,(#5C8D) ;установим атрибуты строки -x3B86 ld (hl),a - inc hl - djnz x3B86 - pop bc - dec b - dec c - jr nz,x3B68 - call x3BB8 ;обмен атрибутов basic 128 с основными атрибутами - scf - ret - -;АДРЕС: #3B94 расчет количества строк и столцов до конца экрана -x3B94 ld a,#21 - sub c - ld c,a - -;АДРЕС: #3B98 расчет количества строк от заданной до низа экрана -;вх: b - номер строки -; ix - адрес описателя курсора -;вых: b - количество строк до низа экрана -x3B98 ld a,#18 - sub b - sub (ix+#01) - ld b,a - ret - -;АДРЕС: #3BA0 расчет адреса атрибутов -;вх: b - crd Y -; c - crd X -;вых: hl - адрес атрибутов -x3BA0 push bc - xor a - ld d,b - ld e,a - rr d - rr e - rr d - rr e - rr d - rr e - ld hl,#5800 - ld b,a - add hl,bc - add hl,de - pop bc - ret - -;АДРЕС: #3BB8 обмен атрибутов basic 128 с основными атрибутами -x3BB8 push af - push hl - push de - ld hl,(#5C8D) ;постоянные атрибуты экрана - ld de,(#5C8F) ;временные атрибуты экрана - exx - ld hl,(#EC0F) - ld de,(#EC11) - ld (#5C8D),hl - ld (#5C8F),de - exx - ld (#EC0F),hl - ld (#EC11),de - ld hl,#EC13 - ld a,(#5C91) ;параметры вывода на экран - ld d,(hl) - ld (hl),a - ld a,d - ld (#5C91),a - pop de - pop hl - pop af - ret - -;АДРЕС: #3BE9 запуск команды randomize 15619: rem: load "boot" -x3BE9 call x3C56 ;пауза 25 фреймов - set 6,(iy+#02) - res 0,(iy+#02) ;вывод на основной экран - rst #08 - db #8D - ld (#EC0E),a ;a=#07 - ld bc,#0000 - call x372B ;установка координат печати из bc - ld hl,#EC0E - ld (hl),#FF - call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - ld hl,(#5C59) ;адрес начала строки basic - ld a,#08 - rst #08 - db #8C ;bc - длина бейсик-строки для автостарта - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1655 ;резервирование места (длина в bc) - ld de,(#5C59) ;адрес начала строки basic - ld a,#04 - rst #08 ;копирование строки автостарта по адресу в de - db #8C ; и переход на rom 0: #1B11 - ; анализ и выполненение введенной строки -;АДРЕС: #3C1C !!!NOT USED!!! копирование и выполненение бейсик строки -x3C1C nop - jp x1B0F - -;АДРЕС: #3C20 !!!NOT USED!!! бейсик строка -x3C20 db #F9 ;RANDOMIZE - db #C0 ;USR - db #B0 ;VAL - db '"15619":' - db #EA ;REM - db ":" - db #F7 ;RUN - db "92,3MOA" - -;АДРЕС: #3C35 возврат из монтора -x3C35 out (c),d - ld b,#7F - out (c),e - pop de - pop bc - inc sp - pop af - ld r,a - jp po,x3C47 - pop af - ei - ret -x3C47 pop af - di - ret - -;АДРЕС: #3C4A !!!NOT USED!!! вход куда-то (продолжение x08E1) -x3C4A ld (#C001),a - cpl - ld (#C002),a - ld a,#04 - jp x0004 - -;АДРЕС: #3C56 пауза 25 фреймов -x3C56 ei - ld b,#19 -x3C59 halt - djnz x3C59 - ld hl,#5C3B - res 5,(hl) ;клавиша не нажата - scf - ret - -;АДРЕС: #3C63 токенизация строки бейсик программы с синтаксической ошибкой -x3C63 ld a,#01 - jr x3C69 - -;АДРЕС: #3C67 токенизация строки бейсик программы -x3C67 ld a,#00 ;!!! можно xor a -x3C69 ld (#FD8A),a - ld hl,#0000 - ld (#FD85),hl - ld (#FD87),hl - add hl,sp - ld (#FD8B),hl - call x34EA ;обнуление указателей в бейсик строке - ld a,#00 ;!!! можно xor a - ld (#FD84),a - ld hl,#FD74 - ld (#FD7D),hl - call x1F20 ;установка другого стэка и ram 0 - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x16B0 ;очистка различных областей памяти - call x1F45 ;установка другого стэка и ram 7 - ld a,#00 ;!!! можно xor a - ld (#FD81),a - ld hl,(#5C59) - ld (#FD82),hl - ld hl,#0000 ;!!! можно ld h,a: ld l,a - ld (#FD7F),hl -x3CA1 ld hl,(#FD85) - inc hl - ld (#FD85),hl - call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип - ld c,a - ld a,(#FD81) - cp #00 - jr nz,x3CF4 -x3CB3 ld a,c - and #04 - jr z,x3CED ;это не буква -x3CB8 call x3DE9 ;!!!ОШИБКА - jr nc,x3CC4 ;в буфере нет места - ld a,#01 - ld (#FD81),a - jr x3CA1 -x3CC4 ld hl,(#FD7F) - ld a,l - or h - jp nz,x3D1E ;!!! млжно jr -x3CCC push bc - call x3DCD ;копирование слова из буфера в строку бейсик программы - pop bc - ld a,#00 - ld (#FD81),a -x3CD6 ld a,c - and #01 - jr nz,x3CB3 - ld a,b - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - ret nc - ld hl,(#FD85) - inc hl - ld (#FD85),hl - call x3D9D ;получить очередной символ из строки бейсик программы и определить его тип - ld c,a - jr x3CD6 -x3CED ld a,b - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - ret nc - jr x3CA1 -x3CF4 cp #01 - jr nz,x3CED - ld a,c - and #01 - jr z,x3CB8 - push bc -x3CFE call x3F7E ;распознавание токена - pop bc - jr c,x3D7D ;токен распознан - ld hl,(#FD7F) - ld a,h - or l - jr nz,x3D1E - ld a,c - and #02 - jr z,x3CCC - call x3DE9 ;вставить символ в буфер редактирования - jr nc,x3CC4 ;нет места в памяти - ld hl,(#FD7D) - dec hl - ld (#FD7F),hl - jr x3CA1 -x3D1E push bc - ld hl,#FD74 - ld de,(#FD7F) - ld a,d ;!!!можно оптимизировать - cp h - jr nz,x3D2F - ld a,e - cp l - jr nz,x3D2F - inc de -x3D2F dec de - jr x3D33 -x3D32 inc hl -x3D33 ld a,(hl) - and #7F - push hl - push de - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - pop de - pop hl - ld a,h - cp d - jr nz,x3D32 - ld a,l - cp e - jr nz,x3D32 - ld de,(#FD7F) - ld hl,#FD74 - ld (#FD7F),hl - ld bc,(#FD7D) - dec bc - ld a,d - cp h - jr nz,x3D70 - ld a,e - cp l - jr nz,x3D70 - inc de - push hl - ld hl,#0000 - ld (#FD7F),hl - pop hl - ld a,b - cp h - jr nz,x3D70 - ld a,c - cp l - jr nz,x3D70 - pop bc - jr x3D8F -x3D70 ld a,(de) - ld (hl),a - inc hl - inc de - and #80 - jr z,x3D70 - ld (#FD7D),hl - jr x3CFE -x3D7D push bc - call x3E16 ;вставка символа в сроку бейсик программы с обработкой < и > - pop bc - ld hl,#0000 - ld (#FD7F),hl - ld a,(#FD81) - cp #04 - jr z,x3D94 -x3D8F ld a,#00 - ld (#FD81),a -x3D94 ld hl,#FD74 - ld (#FD7D),hl - jp x3CB3 - -;АДРЕС: #3D9D получить очередной символ из строки бейсик программы и определить его тип -;вых: b - код символа -; a=#01 - прочие символы -; a=#02 - это # или $ -; a=#03 - это пробел -; a=#06 - это буква -x3D9D call x2D54 ;получить очередной символ из строки бейсик программы - ld b,a - cp #3F - jr c,x3DAF - or #20 - call x3DC6 ;проверка символа на принадлежность к буквам нижнего регистра - jr c,x3DC3 ;это буква -x3DAC ld a,#01 ;прочее - ret -x3DAF cp #20 - jr z,x3DC0 ;это пробел - cp "#" - jr z,x3DBD - jr c,x3DAC - cp "$" - jr nz,x3DAC -x3DBD ld a,#02 ;это # или $ - ret -x3DC0 ld a,#03 ;это пробел - ret -x3DC3 ld a,#06 ;это буква - ret - -;АДРЕС: #3DC6 проверка символа на принадлежность к буквам нижнего регистра -;вх: a - клод символа -;вых: cy=1 символ это буква в нижнем регистре -x3DC6 cp #7B - ret nc - cp #61 - ccf - ret - -;АДРЕС: #3DCD копирование слова из буфера в строку бейсик программы -x3DCD ld hl,#FD74 - ld (#FD7D),hl - sub a - ld (#FD7F),a - ld (#FD80),a -x3DDA ld a,(hl) - and #7F - push hl - call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов - pop hl - ld a,(hl) - and #80 - ret nz - inc hl - jr x3DDA - -;АДРЕС: #3DE9 вставить символ в буфер редактирования -;вх: b - код символа -; cy=0 нет места в буфере -x3DE9 ld hl,(#FD7D) - ld de,#FD7D - ld a,d - cp h - jr nz,x3DF8 - ld a,e - cp l - jp z,x3E13 ;!!!можно jr -x3DF8 ld de,#FD74 - ld a,d - cp h - jr nz,x3E03 - ld a,e - cp l - jr z,x3E09 -x3E03 dec hl - ld a,(hl) - and #7F - ld (hl),a - inc hl -x3E09 ld a,b - or #80 - ld (hl),a - inc hl - ld (#FD7D),hl - scf - ret -x3E13 scf - ccf - ret - -;АДРЕС: #3E16 вставка символа в сроку бейсик программы с обработкой < и > -;вх: a - код символа -x3E16 push af ;!!!ОШИБКА!!! - ld a,(#FD89) - or a - jr nz,x3E2F - pop af - cp ">" - jr z,x3E2A - cp "<" - jr z,x3E2A -x3E26 call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - ret ;!!!можно сократить -x3E2A ld (#FD89),a - scf - ret -x3E2F cp "<" - ld a,#00 - ld (#FD89),a - jr nz,x3E52 - pop af - cp ">" - jr nz,x3E41 - ld a,#C9 ;токен <> - jr x3E26 -x3E41 cp "=" - jr nz,x3E49 - ld a,#C7 ;токен <= - jr x3E26 -x3E49 push af - ld a,"<" - call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - pop af - jr x3E26 -x3E52 pop af - cp "=" - jr nz,x3E5B - ld a,#C8 ;токен >= - jr x3E26 -x3E5B push af - ld a,">" - call x3E64 ;вставка символа в сроку бейсик программы с обработко REM и кавычек - pop af - jr x3E26 - -;АДРЕС: #3E64 вставка символа в сроку бейсик программы с обработко REM и кавычек -;вх: a - код символа -x3E64 cp #0D - jr z,x3E88 ;это enter - cp #EA - ld b,a - jr nz,x3E74 ;это не REM - ld a,#04 - ld (#FD81),a - jr x3E82 -x3E74 cp #22 ;" - jr nz,x3E82 ;это не " - ld a,(#FD81) - and #FE - xor #02 - ld (#FD81),a -x3E82 ld a,b - call x3E9C ;вставка символа в сроку бейсик программы с игнорированием пробелов - scf - ret -x3E88 ld a,(#FD8A) - cp #00 - jr z,x3E99 - ld bc,(#FD85) ;!!!ОШИБКА!!! - ld hl,(#FD8B) - ld sp,hl - scf - ret -x3E99 scf - ccf - ret - -;АДРЕС: #3E9C вставка символа в сроку бейсик программы с игнорированием пробелов -;вх: a - код символа -;вых: a - новые флаги строки -x3E9C ld e,a - ld a,(#FD84) - ld d,a - ld a,e - cp " " - jr nz,x3EC6 ;это не пробел - ld a,d - and #01 - jr nz,x3EBF ;предыдущий символ был токеном - ld a,d - and #02 - jr nz,x3EB7 ;предыдущий символ был пробелом - ld a,d - or #02 - ld (#FD84),a - ret -x3EB7 ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ld a,(#FD84) - ret -x3EBF ld a,d - and #FE - ld (#FD84),a - ret -x3EC6 cp #A3 - jr nc,x3EEE ;это токен - ld a,d - and #02 - jr nz,x3EDA ;последний символ был пробелом - ld a,d - and #FE - ld (#FD84),a - ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ret ;!!!можно сократить -x3EDA push de - ld a," " - call x3EFB ;вставка символа в сроку бейсик программы - pop de - ld a,d - and #FE ;!!!можно сократить - and #FD - ld (#FD84),a - ld a,e ;!!!можно сократить jr x3ED2 - call x3EFB ;вставка символа в сроку бейсик программы - ret ;!!!можно сократить -x3EEE ld a,d - and #FD - or #01 - ld (#FD84),a ;!!!можно сократить jr x3ECF - ld a,e - call x3EFB ;вставка символа в сроку бейсик программы - ret - -;АДРЕС: #3EFB вставка символа в сроку бейсик программы -;вх: a - код символа -; de - адрес в строке для вставки -x3EFB ld hl,(#FD87) - inc hl - ld (#FD87),hl - ld hl,(#FD82) ;адрес в строке для следующей вставки - ld b,a - ld a,(#FD8A) - cp #00 ;!!! можно or a - ld a,b - jr z,x3F33 - ld de,(#5C5F) ;адрес символа после маркера ошибки - ld a,h ;!!! можно оптимизировать - cp d - jr nz,x3F30 - ld a,l - cp e - jr nz,x3F30 - ld bc,(#FD85) ;!!!ОШИБКА!!! - ld hl,(#FD87) - and a - sbc hl,bc - jr nc,x3F2A - ld bc,(#FD87) -x3F2A ld hl,(#FD8B) - ld sp,hl - scf - ret -x3F30 scf - jr x3F35 -x3F33 scf - ccf -x3F35 call x1F20 ;установка другого стэка и ram 0 - jr nc,x3F47 - ld a,(hl) ;!!!ОШИБКА!!! inc hl:ld a,(hl):dec hl - ex de,hl - cp #0E - jr nz,x3F5D ;не число - inc de - inc de - inc de - inc de - inc de - jr x3F5D -x3F47 push af - ld bc,#0001 - push hl - push de - call x3F66 ;проверка наличия свободного места в памяти - pop de - pop hl - rst #28 ;вызов процедуры из basic 48k - dw Rom1.x1664 ;обновление системных переменных - ld hl,(#5C65) - ex de,hl - lddr - pop af - ld (de),a -x3F5D inc de - call x1F45 ;установка другого стэка и ram 7 - ld (#FD82),de - ret - -;АДРЕС: #3F66 проверка наличия свободного места в памяти -;вх: bc - количество байт -;вых: если места в памяти нет, переход на обработку ошибки: 4 Out of memory -x3F66 ld hl,(#5C65) - add hl,bc - jr c,x3F76 - ex de,hl - ld hl,#0082 - add hl,de - jr c,x3F76 - sbc hl,sp - ret c -x3F76 ld a,#03 - ld (#5C3A),a - jp x0321 - -;АДРЕС: #3F7E распознавание токена -;вых: cy=1 токен распознан -> a - код токена -x3F7E call #FD2E ;распознавание токена (x33F4) - ret c ;токен не распознан - ld b,#F9 - ld de,#FD74 - ld hl,x3594 ;токены basic 128 - call #FD3B ;распознавание токена (x3401) - ret nc ;токен не распознан - cp #FF ;это CLOSE# ? - jr nz,x3F96 - ld a,#D4 ;CLOSE # - jr x3FB8 -x3F96 cp #FE ;это OPEN# ? - jr nz,x3F9E - ld a,#D3 ;OPEN # - jr x3FB8 -x3F9E cp #FD ;это DEFFN ? - jr nz,x3FA6 - ld a,#CE ;DEF FN - jr x3FB8 -x3FA6 cp #FC ;это GOSUB ? - jr nz,x3FAE - ld a,#ED ;GO SUB - jr x3FB8 -x3FAE cp #FB ;это GOTO ? - jr nz,x3FB6 - ld a,#EC ;GO TO - jr x3FB8 -x3FB6 sub #56 -x3FB8 scf - ret - -;АДРЕС: #3FBA копирование строки из hl в de в (hl+0) кол-во байт -x3FBA ld b,(hl) - inc hl -x3FBC ld a,(hl) - ld (de),a - inc de - inc hl - djnz x3FBC - ret - -;АДРЕС: #3FC3 !!!NOT USED!!! преобразование ASCII в цифру -x3FC3 cp "0" - ccf - ret nc - cp "9"+1 - ret nc - sub #30 - scf - ret - -;АДРЕС: #3FCE обработка нажатой управляющей клавиши -;вых: cy=0, nz - не найден обработчик клавиши -; cy=0, z - клавиша обработана, нужен звуковой сигнал -; cy=1, z - клавиша обработана звуковой сигнал не нужен -x3FCE push bc - push de - ld b,(hl) - inc hl -x3FD2 cp (hl) - inc hl - ld e,(hl) - inc hl - ld d,(hl) - jr z,x3FE1 ;клавиша найдена. в de адрес - inc hl - djnz x3FD2 - scf - ccf - pop de - pop bc - ret -x3FE1 ex de,hl - pop de - pop bc - call x3FEE ;call (hl) - jr c,x3FEB - cp a - ret -x3FEB cp a - scf - ret - -;АДРЕС: #3FEE вызов call (hl) -x3FEE jp (hl) - -;АДРЕС: #3FEF инициалы программистов -x3FEF db #00,"MB" ;Martin Brennan - db #00,"SB" ;Steve Berry - db #00,"AC" ;Andrew Cummins - db #00,"RG" ;Rupert Goodwins - db #00,"KM" ;Kevin Males - db #00,#01 ;end of rom marker - - SAVEBIN "../Build/scorp/NewROM0.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom0.bat b/ProfRom_Disasm/rom0.bat deleted file mode 100755 index 160677f..0000000 --- a/ProfRom_Disasm/rom0.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom0.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2.bat b/ProfRom_Disasm/rom2.bat deleted file mode 100755 index bac81ea..0000000 --- a/ProfRom_Disasm/rom2.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom2_SrvMon.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom2_SrvMon.a80 b/ProfRom_Disasm/rom2_SrvMon.a80 deleted file mode 100755 index 506c561..0000000 --- a/ProfRom_Disasm/rom2_SrvMon.a80 +++ /dev/null @@ -1,10349 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 - -;#0000 rst #00 запись байта в память пользователя -;#0006 переход на обработку входа в монитор по NMI/rst 8 -;#0008 rst #08 печать сообщения по номеру в BC -;#000B переход в другой rom -;#000D обработка NMI при активной rom2 -;#0010 rst #10 печать символа в окне -;*not used* #0013 ds 2 -;#0015 вход по rst #08 из basic 48k -;#0018 rst #18 вызов п/п Tr-Dos -;#001B для проверки размера ПЗУ -;#001E вход при включении/reset -;#0020 rst #20 печать строки -;*not used* #0023 ds 3 -;#0026 вход по rst #08 из basic 128k -;#0028 rst #28 чтение байта из памяти пользователя -;*not used* #002D обработка входа в монитор по NMI/rst 8 -;#0030 rst #30 вызов п/п из другого rom -;*not used* #0033 ds 2 -;*not used* #0035 обработка входа в монитор по NMI/rst 8 -;#0038 rst #38 переход на обработку прерываний im 1 -;#003B вход при включении/reset -;#0092 обработка прерываний im 1 -;#009C обработка NMI при активной странице монитора -;#00B6 вход в монитор по NMI/rst 8 -;#00F1 переменные различного характера -;#0101 номер текущего rom -;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -;#0110 Таблица переходов ПрофПЗУ -;#0114 вход в монитор по rst #08 -;#0116 вызов п/п по адресу в BC с задержкой call (bc) -;#011D вход в монитор по кнопке NMI -;#013A выход из монитора -;#0167 вход в монитор по rst #08 -;#01F5 вызов функции rst #08 -;#0241 пауза 26698t -;#024C установка номера дисковода -;#025E определение наличия Турбои и оригинальности (колво тактов) -;#02A5 печать сообщения по номеру в BC -;#02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) -;#02AE rst 8: db #8D хрень какая-то непонятная -;#02CC rst 8: db #8C автостарт с дискеты -;#02D1 установка двойной скорости (rst 8: db #87) -;#02D7 установка обычной скорости (rst 8: db #88) -;не используется??? #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! -;#02F4 rst 8: db #81 вызов функции R8DOS -;#0310 сохранение регистров для основной программы -;#0321 работа с микросхемой CMOS (rst 8: db #89) -;#032A чтение регистров основной программы -;#0339 установка переменных монитора (rst 8: db #82) -;#035F вывод символа на экран пользователя (rst 8: db #84) -;#0368 отключение монитора - отладчика (rst 8: db #85) -;#0370 возврат в отладчик -;#0373 установка текущим блока дисководов монитора -;#0398 запись в регистр 7 AY числа #FF -;#03A7 Запись регистра AY -;#03B6 чтение регистра AY -;#03C2 восстановление содержимого регистра 7 AY -;#03CE сохранение регистров и стэка в ram 8 -;#04CE восстановление режима Турбо -;#04D5 включение Турбо-режима -;#04D9 выключение Турбо-режима -;#04E2 восстановление регистров пользователя -;#0550 сохранение экрана из страницы 5 -;#0557 вход в монитор после трассировки команды -;#055B сохранение экрана из страницы 5 -;#0581 восстановление экрана в странице 5 -;#0589 установка зеленого бордюра (индикация ошибки) -;#058E чтение/запись байта в память пользователя -;#0603 копирование памяти с #8000 в страницу пользователя -;#0606 копирование страницы пользователя в #8000 -;#0665 включение режима 48k only -;#066D повторная инициализация страниц (если битая) -;#0732 установка координат печати crdY=рег C, crdX=#24 -;#0739 копирование части закодированных процедур в ram 8 с раскодированием -;#0749 восстановление области памяти из ram 8 -;#0753 сохранение области памяти в ram 8 -;#08B7 таблица с адресами обработки функций rst 8 -;#08D3 rst 8: db #86 Копия графического экрана на принтер -;#08D7 печать текущего меню монитора -;#0911 rst 8: db #80 Вывод символа из аккумулятора на принтер -;#0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) -;#0950 вывод символа на принтер -;#0A33 проверка нажатия BREAK -;#0A51 печать экрана на принтер -;#0AD7 Команда: EXit выход из отладчика в меню -;#0AE0 печать/обновление окна отладчика -;#0AEB вызов отладчика M. Monitor -;#0AF2 полное обновление окна отладчика -;#0AFB обновление окна отладчика, без информационного окна -;#0B06 ввод и обработка команды отладчика -;#0C98 чтение числового операнда из строки команды -;#0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) -;#0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D -;#0D46 проверка символа в (hl) #2C/#3B/#00/#0D -;#0D55 чтение из строки команды чилового/байта строкового значения -;#0DEC таблица префиксов и основания систем счислений -;#0DF4 преобразование строки в число -;#0E73 деление bc=hl/de с проверкой de на ноль -;#0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -;#0EBA выделение из строки числовых операндов (не более 6) -;#0EE3 поиск в буфере ввода строки первого печатного символа -;#0EE6 поиск в строке первого печатного символа -;#0EF0 поиск заданной команды в списке -;#0F91 названия регистров для монитора -;#0FA0 названия регистров для монитора -;#1037 инициализация системы и чтение настроек Autoconfig -;#1101 редактирование дампа памяти в окне монитора -;#1107 таблица мнемоник -;#1196 операнды/флаги ассемблера -;#11F7 мнемоники ассемблера -;#12D2 таблица для формирования команд дизасма -;#14B2 таблица для формирования команд дизасма -;#14F6 проверка значения аккумулятора -;#14FD проверка значения аккумулятора -;#1504 проверка значения аккумулятора -;#150B проверка значения аккумулятора -;#1512 печать команды ассемблера -;#1570 печать мнемоники ассемблера с пробелом на конце -;#157F печать операнда/числа команды ассемблера -;#15B3 печать сообщения из hl длиной b -;#15B9 печать сообщения из hl с заменой непечатных символов на ? -;#15C7 печать сообщения из hl -;#15D0 печать сообщения по номеру (на экран/в буфер) -;#15DB печать сообщения из hl -;#15DD печать сообщения не менее заданной длины -;#15F3 печать нескольких пробелов (в B) -;#15FA печать сообщения по номеру в A -;#15FC печать сообщения по номеру в A, не менее заданной длины в С -;#1612 печать числа в hl (dec/hex) с префиксом -;#1614 печать числа в bc (dec/hex) с префиксом -;#1626 печать числа из (hl) (dec/hex) с префиксом -;#1629 печать числа в bc (bin/oct/dec/hex) с префиксом -;#162C печать числа в заданной системе счисления -;#1658 печать числа A с предварительным пробелом -;#165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -;#1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;#1669 печать десятичного числа bc [0..65535] с ведущими пробелами -;#166E печать десятичного числа bc [0..65535] с ведущими пробелами -;#1673 печать числа bc (на экран/в буфер) -;#1677 печать числа bc (на экран/в буфер) -;#16AA деление bc=ac/de -;#16D0 печать строки (rst #20) -;#16DE печать числа hl=[#0000..#FFFF] -;#16E3 печать числа a=[#00..#FF] -;#16EC печать числа a=[#0..#F] -;#16FF исполнение зарезервированных слов анализатора st0-st9 -;#17F0 выполнение одной команды по адресу в PC -;#191E проверка попадания адреса на адреса #3D00-#3DFF -;#197F анализ команды ассемблера -;#1DD0 список команд отладчика -;#1DE5 выполнение слова анализатора -;#1E0F установка кода команды в программу анализатора -;#1E45 Команда: FLOAD track, sector, start, length -;#1E4F Команда: FSAVE track, sector, start, length -;#1E59 открытие файла для чтения/записи программы анализатора -;#1E76 Команда: DEFSave filename -;#1EA5 Команда: DEFLoad filename -;#1F25 Команда: CLear -;#1F42 Команда: ANalyser boolean -;#1F5B поиск введенного слова в словаре/программе пользователя -;#1FB0 Команда: WORD word[:] program -;#2093 Команда: EDit -;#20C8 печать редактируемого слова -;#2104 печать слова анализатора -;#2112 поиск начала и печать слова анализатора -;#2121 чтение ld bc,(hl+1): hl=hl+2 -;#2148 Команда: WORD word[:] program Продолжение (для переопределения уже определенных слов) -;#2214 Команда: PDEFinition вывод на принтер Форт - программы -;#2218 Команда: LDEFinition вывод на экран Форт - программы -;#2297 Команда: EVal word выполнить слово word -;#234D запись элемента на стэк анализатора -;#2364 установка нового значения вершины стэка анализатора -;#236A запись на стэк анализатора байта из ячейки памяти пользователя -;#2374 запись на стэк анализатора слова из ячеек памяти пользователя -;#237F чтение элемента с вершины стэка анализатора -;#2398 чтение двух элементов с вершины стэка анализатора -;#23A3 базовые слова анализатора -;#27DC список управляющих кодов -;#27E7 таблица с адресами обработки управляющих кодов -;#27FD удаление курсора и печать символа в окне -;#2800 печать символа в окне -;#28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) -;#28C5 сохранение экрана под курсором (6 пикселей символ) -;#28E8 печать/удаление курсора в окне -;#28F6 мигание текстового курсора в строке ввода -;#292F расчет экранного адреса курсора в окне для символов 6 пикселей -;#2959 расчет координат курсора на экране для символов шириной 8 пикселей -;#2969 расчет адреса курсора в области атрибутов для символов 8 пикселей -;#297C расчет экранного адреса курсора в окне для символов 8 пикселей -;#298E скроллинг окна вверх -;#29D0 скроллинг строки данных окна -;#29FB скроллинг строки атрибутов окна -;#2A1B обработка управляющего кода #1E (скроллинг окна ввниз) -;#2A5B очистка окна пользователя (rst 8: db #83) -;#2A5E обработка управляющего кода #0C (очистка текущего окна) -;#2A85 очистка знакоместной строки по координатам курсора -;#2AAD обработка управляющего кода #04 (вывод с выравниванием) -;#2ABB расчет для выравнивания строки -;#2ACA печать строки из буфера с выравниваем по центру окна #05 -;#2AED печать строки из буфера с выравниваем по правому краюу окна #06 -;#2AF2 обработка байта после управляющего кода #04 -;#2B07 возврат из п/п печати символа -;#2B0B печать символа со сбросом 7го бита (rst #10) -;#2B10 печать пробела (rst #10) -;#2B12 печать символа (rst #10) -;#2B63 установка адреса п/п обработки управляющего кода -;#2B6E обработка управляющего кода #0D (возврат каретки) -;#2B7D обработка управляющего кода #0A (перевод строки) -;#2B9D установка начальных координат -;#2BA8 короткий звуковой сигнал c установкой бордюра -;#2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) -;#2BF8 обработка управляющего кода #01 (установка атрибутов) -;#2C18 обработка управляющего кода #02 (восстановление атрибутов) -;#2C1F определение турбо-режима -;#2C30 определение турбо-режима вкл/выкл -;#2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -;не используется #2C7A чтение байта по адресу #00FB -;#2C7E поиск и вызов процедуры обработки без возврата(если не найдено возврат) -;#2C92 выполнение одной команды ассемблера с контролем ловушек -;#2CA8 печать/обновление монитора-отладчика -;#2E25 печать байта из L в двоичном виде -;#2E38 печать дампа памяти в окне -;#2E76 удаление курсора на предыдущей ячейке дампа -;#2E3D печать дампа памяти в окне -;#2EBA печать одной строки дампа памяти (8 байт) -;#2EBE печать одной строки дампа памяти (8 байт) -;#2F74 вывод дисасма памяти по адресу в de -;#2F96 анализ команды ассемблера -;#2FAC печать строки дизасма -;#2FED печать пробелов до правого края окна -;#2FF1 печать пробелов до заданной координаты X -;#2FFB установка текущим окна: ввод числа -;#3005 установка текущим окна: main menu -;#300A ix = адрес дескриптора окна монитора: вывод на принтер -;#300F чтение содержимого регистра ix основной программы -;#3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана -;#3019 ix = адрес дескриптора окна монитора: дамп памяти -;#301C ix = адрес дескриптора окна монитора из hl -;#3023 ожидание действий пользователя (опрос управления, вывод часов) -;#302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне -;#303C выполнение команды, на которую указывает PC (cs+3) -;#303F выполнение команды, на которую указывает PC с быстрым выполнением подпрограмм (cs+4) -;#3052 заглушка входа в монитор при несовпадении контрольной суммы -;#305B блокировка работы при ошибке контрольной суммы -;#3065 установка регистров для загрузки/сохранения -;#3074 Команда: ERAse filespec -;#3085 Команда: SAVE filespec start,length -;#3095 Команда: LOAD filespec [start[,length]] -;#30D8 чтение файла в память -;#3107 запись области памяти в файл -;#3135 подсчет контрольной суммы страницы -;#3161 список команд отладчика -;#318C Команда III (работа с контроллером прерываний) -;#3194 Команда OOO (работа с контроллером прерываний) -;#319C Команда CMOS (работа с контроллером прерываний) -;#31A4 Команда RESNVRAM (что-то пишет в NVRAM) -;#31AB Команда: SLOW type автоматическая трассировка -;#31C1 Команда: LISTBreak/LBreak -;#3201 печать ON/OFF от флага nz-ON/z-OFF -;#3210 определение адреса ловушки -;#3222 восстановление памяти пользователя под всеми ловушками -;#3228 сохранение памяти пользователя под всеми ловушками и установка ловушек -;#3281 установка начала списка ловушек -;#328B проверка срабатывания ловушки -;#32AF Команда: DELBreak number -;#32E2 Команда: BRK number, [on|off] -;#3303 Команда: BREak number, type, addr, int_count[,bank] -;#330B установка ловушки #8, по текущему адресу листинга дизасма -;#3326 удаление ловушки #8 -;#3333 Команда: OPTion bit on|off -;#3360 Команда: OUT addr, data -;#336C Команда: OUTD addr, data -;#337A Команда: IND addr -;#3383 Команда: IN addr -;#3389 Команда: ?data -;#33BB установка и очистка информационного окна отладчика -;#33CD печать информационного окна отладчика -;#33D2 Команда: SHow -;#3432 Команда: BASE 0|2|8|10|16 -;#344F Команда: WORKspace addr -;#3461 Команда: SEarch addr_st, addr_end, bank, data -;#346A Команда: FINd addr_st, addr_end, data -;#3517 продолжение поиска в отладчике (для команд FIND/SEARCH) -;#352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] -;#356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] -;#35D3 сравнение ix=xE075 -;#35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -;#35F5 Команда: FILl addr_st, addr_end, byte [,bank] -;#360D Команда: DATA addr, data -;#3614 Команда: .PC data -;#361E Команда: .data -;#3640 pop de со стэка пользователя -;#364D Команда: POP -;#3655 переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти -;#365C Команда: MEMory addr -;#3662 Команда: EXX -;#3666 Команда: EX AF -;#3683 Команда: INTerrupt on|off -;#3699 Команда: CALl [[addr],bank] -;#36B4 Команда: Jump [[addr],bank] -;#36C3 запись стандартного Magic-файла -;#36DB Команда: ROM bank -;#36F9 получение номера логической страницы пользователя a=[#0..#F] -;#3707 сравнение страницы пользователя с заданной -;#370C Команда: RAM -;#3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL -;#371D установка страницы пользователя равной номеру страницы в HL -;#3732 установка страницы пользователя равной номеру страницы в L -;#3778 Команда: SCReen [on|off|5|7] -;#37B9 управление выводиммым листингом (опрос клавиш space, s, cs+1) -;#3807 пауза 40416t -;#382E ожидание отжатия всех клавиш -;#3837 копирование блока памяти в ram 8 с раскодированием -;не используется #385D не используется -;не используется #3860 не используется -;#3870 печать сообщения и продолжение работы текущего меню монитора -;#3884 получить адрес, на который ссылается команда ассемблера -;#38D8 быстрый вход в команду DASM -;#38E2 Команда: DASm вывод листинга дизасма -;#39A8 Печать одной строки листинга дизасма -;#39EB Команда: LCATalogue [num_drive] -;#39EF Команда: CATalogue [num_drive] -;#3A10 Команда: PUSH data -;#3A14 запись de на стэк пользователя -;#3A21 копирование активного экрана пользователя в #4000 -;#3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -;#3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти на принтер. -;#3A60 Команда: DISs [addr_st [,addr_end]] реассемблирование блока памяти с адреса addr_st по addr_end включительно -;#3A68 Команда: LDUmp [addr_st[,addr_end]] -;#3A71 Команда: DUmp [addr_st[,addr_end]] -;#3A93 вызов п/п по адресу в bc - call (bc) -;#3A95 подготовка переменных к выводу на экран/принтер -;#3AC8 Команда: VList -;#3AD0 Команда: Help -;#3AF9 вызов п/п по адресу в de - call (de) -;#3AFB печать команды отладчика -;#3B55 Команда: IM -;#3B75 определение типа прерываний im 1/2 -;#3B7F установка переменных по конкретным адресам -;#3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE -;#3C01 некодированные процедуры переключения страниц -> ram 8 xE42D -;#3D01 список команд отладчика -;#3E25 чтение портов #1FFD/#7FFD -;#3E2C адреса обработки команд отладчика -;#3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED -;#3EDA данные для установки переменных по конкретным адресам -;#3EE6 названия месяцев -;#3F0A Названия дней недели -;#3F1F free #00E1(225) bytes -;#4000 - - - -;АДРЕС: #0000 запись байта в память пользователя (rst #00) -;вх: hl - адрес в памяти -; a - байт для записи -x0000 scf - bit 7,h -x0003 jp x058E -x0006 jr x0069 -x0008 jp x02A5 ;rst #08 печать сообщения по номеру в BC -x000B out (c),a ;переход в другой rom -x000D jp x009C ;обработка NMI при активной rom2 -x0010 jp x2B12 ;rst #10 печать символа в окне -x0013 nop - nop -x0015 jp x00B6 ;вход по rst #08 из basic 48k -x0018 jp xE41B ;rst #18 вызов п/п Tr-Dos -x001B ld a,#00 ;для проверки размера ПЗУ - ret -x001E jr x003B ;вход при включении/reset -x0020 jp x16D0 ;rst #20 печать строки -x0023 nop - nop - nop -x0026 jr x0069 ;вход по rst #08 из basic 128k - -;АДРЕС: #0028 чтение байта из памяти пользователя (rst #28) -;вх: hl - адрес в памяти -x0028 or a - bit 7,h - jr x0003 -x002D jp x00B6 -x0030 jp xE3D3 ;rst #30 вызов п/п из другого rom -x0033 nop - nop -x0035 jp x00B6 ;сюда переходим по NMI из Tr-Dos -x0038 jp x0092 ;переход на обработку прерываний im 1 - -;АДРЕС: #003B вход при включении/reset -;вх: bc=#1FFD -x003B ld b,#7F - xor a - out (c),a ;ram 8 -x0040 ld sp,#5BFF - ld b,#00 - jr x0049 -x0047 out (c),a ;завершение инициализации и переход в basic 128k -x0049 ld hl,#EAF5 ;проверим память 8й страницы -x004C ld a,b - cp (hl) - inc hl - jr nz,x007B ;ram 8 испорчена. полный сброс - djnz x004C - ld hl,(#E028) -x0056 push hl ;hl=#0000 при полной инициализации - call x1037 ;инициализация системы и чтение настроек Autoconfig - pop hl - ld bc,#7FFD - xor a - ld (x5B88),a - out (c),a ;ram 0/8 - jr x006C -x0066 jp x000D ;нажатие Magic при активной rom2 -x0069 jp x00B6 -x006C ld b,#1F - rlc l - ld hl,#00C7 - jr nc,x0078 - ld hl,#00ED -x0078 push hl - jr x0047 ;rom 0 (basic 128k) -;8я страница испорчена. полная иницаиализация -x007B call x0672 - pop bc ;bc=x3135 - call x3A93 ;вызов п/п по адресу в bc (подсчет контрольной суммы страницы) - xor a ;hl=#00F6 - ld l,a ;hl=#0000 - ld i,a - im 0 - ei - halt - im 1 - halt - im 2 - halt - jr x0056 - -;АДРЕС: #0092 обработка прерываний im 1 -;вых: a=0, b=0, d=d+1 -x0092 ld a,#00 - djnz $ - cp b - jr nz,x009A - inc d -x009A ei - ret - -;АДРЕС: #009C обработка NMI при активной странице монитора -x009C push af - ld a,r - push af - ld a,#08 ;вход при активной странице монитора - push af - inc sp - push bc - push hl - ld hl,(xC001) - ex (sp),hl - ld a,#55 - ld (xC001),a - cpl - ld (xC001+1),a - ld bc,#1FFD - -;АДРЕС: #00B6 вход в монитор по NMI/rst 8 -x00B6 di - ld a,#12 - out (c),a ;rom 2 - ld b,#7F - ld a,#10 - out (c),a ;ram 8 - ld (xDD6D),sp - ld (xDDF7),sp ;сохраним адрес стэка - ld sp,xE38D ;новый стэк - ld bc,(xC064) - ld a,c - or b - jr nz,x0116 ;вызов процедуры вместо входа в монитор - call x03CE ;сохранение регистров и стэка в ram 8 - call x0398 ;запись в регистр 7 AY числа #FF - ld a,(xDD86) ;номер rom откуда зашли - cp #80 - jp z,x0922 - call x3222 ;восстановление памяти пользователя под всеми ловушками - ld a,(xDD86) ;номер rom откуда зашли - and #03 - jr nz,x0114 ;вход по rst #08 из basic 128k или basic 48k - call x0373 ;установка текущим блока дисководов монитора - jr x011D ;вход в монитор по кнопке NMI - -x00F1 db #61 ;второй байт сигнатуры программы анализатора -x00F2 db #6F -x00F3 db #08 -x00F4 db #35 ;байт для раскодирования -x00F5 db #CA ;байт для раскодирования блока атрибутов монитора -x00F6 db #80 -x00F7 db #71 -x00F8 db #1A -x00F9 db #6B -x00FA db #D7 -x00FB db #01 -x00FC db #05 ;байт для раскодирования процедур -x00FD db #07 ;байт для раскодирования процедур -x00FE db #61 ;байт для раскодирования процедур -x00FF dw xE516 ;адрес п/п обработки прерываний im 2 - -;АДРЕС: #0101 номер текущего rom -x0101 db #02 - -;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -x0102 ds #0E - -;АДРЕС: #0110 Таблица переходов ПрофПЗУ -x0110 db #00,#0C,#08,#04 - -;АДРЕС: #0114 вход в монитор по rst #08 -x0114 jr x0167 - -;АДРЕС: #0116 вызов п/п по адресу в BC с задержкой call (bc) -x0116 push bc -x0117 dec bc - ld a,b - or c - jr nz,x0117 - ret - -;АДРЕС: #011D вход в монитор по кнопке NMI -x011D ld a,(xE039) ;значение NMI debouncing - ld b,a -x0121 call x0241 ;пауза 26698t - djnz x0121 - call x2C30 ;определение турбо-режима вкл/выкл -x0129 bit 0,(iy+#12) - jr z,x0136 ;отладчик не запущен - ld a,(xC063) - or a - jp z,x0AF2 ;печать окна отладчика -x0136 rst #30 ;отладчик отключен - dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) - db #05 - -;АДРЕС: #013A выход из монитора -x013A call x0370 ;возврат в отладчик -x013D ld sp,xE38D - call x0581 ;восстановление экрана в странице 5 -x0143 call x3228 ;сохранение памяти пользователя под всеми ловушками и установка ловушек -x0146 call x024C ;установка номера дисковода - res 3,(iy+#12) ;сброс признака сохранения экрана в ram 8 - ld a,(xDD86) ;номер rom откуда зашли - and #0C - call nz,xE483 ; - call x03C2 ;восстановление содержимого регистра 7 AY - res 7,(iy+#12) ; - call x04E2 ;восстановление регистров пользователя - xor a - ld sp,(xDD6D) ;указатель вершины стэка программы пользователя, с учетом 11 байт уже сохраненных на стэке - jp x000B ;возврат в rom пользователя - -;АДРЕС: #0167 вход в монитор по rst #08 -x0167 ld hl,(xDD6B) ;pc программы пользователя - dec hl - ld (xDD6B),hl ;назад, на длину команды rst 8 - ld a,(xE026) - bit 5,a - jr z,x018E -;выполняется трассировка команды из отладчика - ex de,hl - ld hl,(xE11A) ;адрес начала буфера для трассировки команды - push hl - scf - sbc hl,de - ex de,hl - pop de ;адрес начала буфера для трассировки команды - jr nc,x018E ;PC не в пределах буфера - ex de,hl - push de - ld de,#0008 - add hl,de - pop de - sbc hl,de - ex de,hl - jp nc,x0557 ;PC пользователя попадает на буфер с командой трассировки -> значит это выход из трассировки -;проверка ловушек -x018E bit 4,a - res 4,(iy+#12) - jr nz,x01F2 ;при вызове команды CALL отладчика - call x328B ;проверка срабатывания ловушки - ld e,#00 ;de=#0000, b - обратный номер ловушки - jr c,x01F5 ;нет сработавших ловушек. вызов функции rst #08 -; проверка проходов по ловушке -x019D ld l,(ix+#07) - ld h,(ix+#08) - ld a,l - or h - jr z,x01B2 ;нужный проход по ловушке - dec hl ;уменьшим счетчик проходов - ld (ix+#07),l - ld (ix+#08),h - ld a,h - or l - jr nz,x01E0 ;счетчик проходов еще не пустой -; сработала ловушка -x01B2 ld l,(ix+#05) - ld (ix+#07),l - ld h,(ix+#06) - ld (ix+#08),h - push ix - pop hl - bit 1,(hl) - jr nz,x01C7 ;ловушка не активна - res 7,(hl) ;ловушка больше не задана -x01C7 ld a,#09 ;b - обратный номер ловушки - sub b ;a - номер ловушки - call x3210 ;определение адреса ловушки -; работа анализатора - push af - call nz,x1DE5 ;выполнение слова анализатора - pop af -; вход в отладчик по сработавшей ловушке -x01D2 ld l,a - ld a,#83 ;сообщение: breackpoint _число_ -x01D5 ld h,#00 - ld (xDDA7),hl ;число для печати - call x0373 ;установка текущим блока дисководов монитора - jp x0B06 ;ввод и обработка команды отладчика -x01E0 bit 7,e - jp nz,x2C9D ;печать отладчика - ld sp,xE336 - res 7,(iy+#16) - call x17F0 ;выполнение одной команды по адресу в PC -x01EF jp x0143 ;выход из монитора -x01F2 xor a - jr x01D2 - -;АДРЕС: #01F5 вызов функции rst #08 -;вх: 7,e =1 - трассировка в отладчике -; =0 - вызов функции rst #08 -; hl - PC пользователя -x01F5 push de - inc hl - rst #28 ;чтение номера функции rst #08 - cp #FF - jr z,x0200 - sla a - jr c,x0225 ;это функция rst #08 - -;обработчик ошибок стандартного Basic -x0200 ex de,hl - call x3A14 ;запись de на стэк пользователя - bit 4,(iy-#02) - jr z,x01F2 ;был включен Basic 128k при вызове rst #08 - ld hl,(#5C5D) - ld (#5C5F),hl - ld hl,#0053 ;новый pc программы пользователя - ld (xDD6B),hl - -;возврат после отработки функции, вызванной пользователем -x0216 res 5,(iy+#0B) ;функции вызываются из монитора - pop de - bit 7,e - jr z,x01EF ;;выход из монитора - ld hl,(xDD6B) ;PC программы пользователя - jp x18C0 ;исполнение зарезервированных слов анализатора st0-st9 - -;определение адреса и вызов функции rst #08 -x0225 cp #1B - jr nc,x0200 ;не существующий номер функции - inc hl - ld (xDD6B),hl ;PC пользщователя - ld hl,x0216 ;сюда вернемся после отработки - push hl - set 5,(iy+#0B) ;функция вызвана пользователем - ld hl,x08B7 ;таблица с адресами обработки функций rst 8 - ld e,a - ld d,#00 - add hl,de - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - jp (hl) - -;АДРЕС: #0241 пауза 26698t -x0241 push bc - ld bc,#0400 -x0245 dec bc - ld a,c - or b - jr nz,x0245 - pop bc - ret - -;АДРЕС: #024C установка номера дисковода -x024C ld a,(xFFDC) - bit 5,a - ld a,(xFFCA) - jr nz,x025A ;блок дисководов монитора - ld (xE9F2),a ;блок дисководов пользователя - ret -x025A ld (xE9F1),a - ret - -;АДРЕС: #025E определение наличия Турбои и оригинальности (колво тактов) -x025E call x04D9 ;выключение Турбо-режима - call x04D5 ;включение Турбо-режима - ld a,#AF ;xor a - ld (xE516),a - call x2C1F ;определение турбо-режима - jr z,x0276 ;турбо выключен - ld a,(xE02D) ;турбо включен и доступен - or %11000000 - ld (xE02D),a -x0276 ld (xE523+#08),hl ;!!! непонятно !!! - ld a,#CD ;call #nnnn - ld (xE51C),a - ld c,#FF ;???определение скорости??? - xor a - ld e,a - ld d,a - inc a - ld b,a - ei - halt - inc a - ld b,a -x0289 call xE483 ;ret - db #ED,#70 ;in (c) - call xE483 - dec de - or a - jr nz,x0289 - di - rst #30 - dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер - db #04 - ld (xDFFC),de - xor a - jp nz,x3052 ;!!!тут перехда не будет никогда!!! - jp x0056 - -;АДРЕС: #02A5 печать сообщения по номеру в BC -x02A5 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #02AA rst 8: db #8B загрузка zs-snap с диска (без возврата) -;вх: +1 =#00 используем имя bootm -; a - номер дисковода -;вх: +1 ="filename",#00 - имя файла -x02AA rst #30 - dw rom6_x093F ;rst 8:db #8B загрузка zs-snap с диска - db #06 - -;АДРЕС: #02AE rst 8: db #8D хрень какая-то непонятная -;вых: a =#07 -x02AE ld a,#07 - ld (xDD7F+#01),a ;регистр A пользователя - rst #30 - dw rom7_x155A ;чтение заголовка первого попавшегося сектора дисковода A - db #07 - rst #30 - dw rom7_x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - db #07 - ret nz ;подключен образ - ld hl,#E005 -x02BF in a,(#1F) - and h - jr z,x02BF - ret m ;7,a =1 ВГ93 готов - ret pe ;7-5,a =011 - res 5,h ;7-5,a =000/010 - inc (hl) - inc hl - ld (hl),l - ret - -;АДРЕС: #02CC rst 8: db #8C автостарт с дискеты -;вх: a =#0C -> вых: нажатие Enter и переход на rom 0: #259F -; =#08 -> вых: bc - длина бейсик-строки для автостарта -; =#nn -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 -x02CC rst #30 - dw rom7_x01AF ;автостарт с дискеты - db #07 - ret - -;АДРЕС: #02D1 установка двойной скорости (rst 8: db #87) -x02D1 call x02DD - set 6,(hl) - ret - -;АДРЕС: #02D7 установка обычной скорости (rst 8: db #88) -x02D7 call x02DD - res 6,(hl) - ret -x02DD xor a - ld hl,xE02D - bit 7,(hl) - jr nz,x02E7 - inc a - pop bc -x02E7 ld (xDD7F),a ;регистр f, флаг c - ret - -;АДРЕС: #02EB rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! -x02EB call x032A ;чтение регистров основной программы - rst #30 - dw rom5_x043B ;ОШИБКА!!!! вызов процедуры по номеру в C - db #05 - jr x0310 ;сохранение регистров для основной программы - -;АДРЕС: #02F4 rst 8: db #81 вызов функции R8DOS -x02F4 ld hl,xEA49 ;блок пользовательский дисководов - ld (xE9F3),hl - ld hl,xFFDC - bit 5,(hl) - jr z,x0309 - res 5,(hl) ;работа с дисководом пользователя - ld a,(xE9F2) - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -x0309 call x032A ;чтение регистров основной программы - rst #30 ;обработка функции rst8dos #81 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - -;АДРЕС: #0310 сохранение регистров для основной программы -x0310 ld (xDD77),bc - ld (xDD75),de - ld (xDD73),hl - push af - pop hl - ld (xDD7F),hl - ret - -;АДРЕС: #0321 работа с микросхемой CMOS (rst 8: db #89) -x0321 call x032A - rst #30 - dw rom5_x1C0D - db %00000101 - jr x0310 - -;АДРЕС: #032A чтение регистров основной программы -x032A ld hl,(xDD73) - ld de,(xDD75) - ld bc,(xDD77) - ld a,(xDD7F+#01) - ret - -;АДРЕС: #0339 установка переменных монитора (rst 8: db #82) -;вх: --- -; -x0339 ld de,x0357 - ld hl,(xDD75) ;регистр de (номер блока переменных) - add hl,de - ld e,(hl) - inc hl - ld d,(hl) ;адрес начала блока переменных - ld hl,(xDD77) ;регистр bc (номер переменной) - add hl,de ;адрес переменной - ld a,(xDD7F) ;регистр f (флаг cy) - rrca - jr c,x0352 ;запись - ld a,(hl) ;чтение - ld (xDD7F+#01),a ;регистр a (результат) - ret -x0352 ld a,(xDD7F+#01) ;запись - ld (hl),a - ret -x0357 dw xE014 ;de =0 - dw xE04E ;de =2 - dw xFFC0 ;de =4 - dw xEAED ;de =6 - -;АДРЕС: #035F вывод символа на экран пользователя (rst 8: db #84) -x035F call x300F ;регистр ix - ld a,(xDD7F+#01) ;регистр a - jp x2B12 ;печать символа - -;АДРЕС: #0368 отключение монитора - отладчика (rst 8: db #85) -;вх: a<>0 -; -x0368 ld (xC063),a - res 7,(iy+#14) - ret - -;АДРЕС: #0370 возврат в отладчик -x0370 push af - jr x0388 - -;АДРЕС: #0373 установка текущим блока дисководов монитора -x0373 push af - ld hl,xE9F5 - ld (xE9F3),hl ;установка блока описателей дисководов - ld hl,xFFDC - set 5,(hl) - ld a,(xE9F1) - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - call x0550 ;сохранение экрана из страницы 5 -x0388 ld a,(x00FB) ;проврека страницы - ld hl,xE00D - cp (hl) - call nz,x2BA8 ;это не страница с монитором. короткий звуковой сигнал c установкой бордюра - pop af - pop hl - ld sp,xE336 - jp (hl) ;возврат (ret) - -;АДРЕС: #0398 Запись в регистр 7 AY числа #FF -x0398 bit 0,(iy+#14) - ret nz - ld b,#07 ;чтение регистра #7 AY - call x03B6 - ld (xE004),a - ld a,#FF - -;АДРЕС: #03A7 Запись регистра AY -x03A7 push bc - push af - ld a,b - ld bc,#FFFD - out (c),a - pop af - ld b,#BF - out (c),a - pop bc - ret - -;АДРЕС: #03B6 чтение регистра AY -;вх: b - номер регистра -;вых: a - значение регистра -; -x03B6 push bc - ld a,b - ld bc,#FFFD - out (c),a - nop - in a,(c) - pop bc - ret - -;АДРЕС: #03C2 Восстановление содержимого регистра 7 AY -x03C2 bit 0,(iy+#14) - ret nz - ld b,#07 - ld a,(xE004) - jr x03A7 - -;АДРЕС: #03CE Сохранение регистров и стэка в ram 8 -x03CE ld bc,#1FFD - ld (xDDA7),sp - ld sp,xDD83 - ex af,af' - push af - ex af,af' - push af - exx - push bc - push de - push hl - exx - push bc - push de - push hl - push iy - push ix - ld iy,xE014 - - ld hl,(xDD6D) ;поиск страницы установленной при входе в монитор - ld de,#0200 ;и определение конфигурации 128k/48k -x03F2 ld bc,#7FFD - out (c),e - ld b,#1F - out (c),d ;rom 2, ram 0 - ld a,(#C001) - cp #55 -x0400 jr z,x0412 -x0402 inc e - bit 3,e - jr z,x03F2 - ld e,#00 - bit 4,d - jp nz,x0589 ;не найдено зеленый бордюр и выход - ld d,#12 - jr x03F2 -x0412 ld a,(#C002) - cp #AA - jr nz,x0402 - ld sp,hl ;страница найдена - pop hl - ld (#C001),hl ;восстановим байты на этой странице - ld b,#1F - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - res 1,d - ld (xE012),de - ld a,#15 ;проверим достуна ди память выше 128k - out (c),a ;ram #D - ld hl,(#C001) - ld (#C001),a - ld a,#10 - out (c),a ;ram 8 - ld (#C001),a - ld a,#15 - out (c),a ;ram #D - ld a,(#C001) - ld (#C001),hl - cp #15 - jr z,x0453 ;память доступна - ld a,e ;режим 48k - or #30 - ld e,a -x0453 ld a,#10 - out (c),a ;ram 8 - ld sp,(xDDA7) - ld a,(#5B5C) ;определяем активный экран по переменной bas128k - and %00001000 - bit 5,e - jr nz,x0466 ;only 48k - or e ;scr 5/7 при входе - ld e,a -x0466 ld a,(xE012) - or e - ld (xE012),a - ld hl,(xDD6D) ;коррекция вершины стэка программы - push hl - ld bc,#000B - add hl,bc - ld (xDD6D),hl - pop hl - ld de,xDD99 ;сохранение стэка в ram 8 - call x0753 - - ld hl,(xDDA2) ;адрес возврата - ld (xDD6B),hl - ld hl,(xDDA0) ;регистр af - ld (xDD7F),hl - ld hl,(xDD9E) ;коррекция регистра r - ld a,h - sub #04 - rlca - sla h - rra - ld h,a - ld (xDD83),hl - ld hl,(xDD9B) ;регистр bc - ld (xDD77),hl - ld a,i ;сохраним регистр i - ld (xDD85),a - xor a - ld i,a - ld a,(xDD9D) ;номер rom откуда зашли - ld (xDD86),a - and %00000110 - ld a,(xE012) - jr z,x04B6 - or #10 -x04B6 ld (xE012),a - - ld hl,xE026 - bit 7,(hl) - set 7,(hl) - jr z,x04CD - ld b,#00 -x04C4 ld a,#06 - out (#FE),a - xor a - out (#FE),a - djnz x04C4 -x04CD ret - -;АДРЕС: #04CE восстановление режима Турбо -; -x04CE ld a,(xE02D) - bit 6,a - jr z,x04D9 ;турбо выключено - -;АДРЕС: #04D5 Включение Турбо-режима -; -x04D5 ld b,#7F - jr x04DB - -;АДРЕС: #04D9 Выключение Турбо-режима -; -x04D9 ld b,#1F -x04DB ld c,#FD - in a,(c) - in a,(c) - ret - -;АДРЕС: #04E2 восстановление регистров пользователя -x04E2 ld hl,(xDD75) ;de пользователя - ld (xDD99),hl - ld hl,(xDD77) ;bc пользователя - ld (xDD9B),hl - ld a,(xDD85) ;i пользователя - ld i,a - ld (xDD9D),a - ld hl,(xDD83) ;r и IFFF2 пользователя - ld a,h ;коррекция регистра r - sub #06 - rlca - sla h - rra - ld h,a - ld (xDD9E),hl - ld hl,(xDD7F) ;af пользователя - ld (xDDA0),hl - ld hl,(xDD6B) ;PC пользователя - ld (xDDA2),hl - ld hl,(xDD6D) ;SP пользователя - ld bc,#FFF5 ;bc = -#0B - add hl,bc - ld (xDD6D),hl - ld de,xDD99 - ex de,hl - ld bc,#000B - call x0749 ;восстановление стэка из ram 8 - ld (xDDA7),sp - ld sp,xDD6F - pop ix - pop iy - pop hl - pop de - pop bc - exx - pop hl - pop de - pop bc - exx - pop af - ex af,af' - pop af - ex af,af' - ld sp,(xDDA7) - call x04CE ;восстановление режима Турбо - ld de,(xE012) ;ПЗУ пользователя - ld a,e - ld b,#7F - and #10 - out (c),a - ld b,#1F - ret - -;АДРЕС: #0550 сохранение экрана из страницы 5 -x0550 bit 3,(iy+#12) - ret nz ;экран уже сохранен в ram 8 - jr x055B - -;АДРЕС: #0557 вход в монитор после трассировки команды -x0557 ld sp,(xE38D) - -;АДРЕС: #055B сохранение экрана из страницы 5 -x055B ld hl,xE026 ;сохраняем экран - bit 1,(hl) - ret nz ;запрет на сохранение экрана - set 3,(hl) - or a -x0564 ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8, scr 5 - ld hl,#4000 - ld de,#C069 - jr nc,x0574 ;cy =1/0 восстанавливаем/сохраняем - ex de,hl -x0574 ld bc,#1B00 - ldir - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8, scr 5 - ret - -;АДРЕС: #0581 восстановление экрана в странице 5 -x0581 bit 1,(iy+#12) ;восстанавливаем экран - ret nz - scf - jr x0564 - -;АДРЕС: #0589 установка зеленого бордюра (индикация ошибки) -; -x0589 ld a,#04 ;зеленый бордюр - out (#FE),a - halt ;ОШИБКА??? должен быть ret после halt - -;АДРЕС: #058E чтение/запись байта в память пользователя -;вх: hl - адрес в памяти -; cy =1/0 запись/чтение -; a - байт для записи -; -x058E jr nz,x05CD ;адрес >=#8000 - ex af,af' - push bc - push de - bit 6,h - jr nz,x05A5 ;адрес [#4000..#7FFF] - ld de,(xE012) ;адрес [#0000..#3FFF] - ld bc,#7FFD - jp xE4CF -;выход -x05A1 pop de - pop bc - ex af,af' - ret -;чтение/запись байта из памяти [#4000..#7FFF] -x05A5 ld de,#5B00 - or a - sbc hl,de - add hl,de - jr nc,x05FB ;адрес [#5B00..#7FFF] - bit 3,(iy+#12) - jr z,x05FB ;экран не сохранен в ram 8 - ld de,#8069 - add hl,de - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8 - ex af,af' - jr c,x05C3 ;запись - ld a,(hl) -x05C3 ld (hl),a - ex af,af' - and #10 - out (c),a - sbc hl,de - jr x05A1 -;чтение/запись байта из памяти [#8000..#FFFF] -x05CD bit 6,h - jr z,x05FE ;адрес [#8000..#BFFF] - ex af,af' ;адрес >=#C000 - push bc - push de - ld de,(xE012) - ld bc,#7FFD - ld a,e - and #17 - out (c),a - ld a,d - and #10 - or #02 - ld b,#1F - out (c),a ;страница пользователя - ex af,af' - jr c,x05ED ;запись - ld a,(hl) -x05ED ld (hl),a - ex af,af' - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - jr x05A1 -x05FB pop de ;адрес [#5B00..#7FFF] - pop bc - ex af,af' -x05FE jr c,x0601 ;запись - ld a,(hl) -x0601 ld (hl),a - ret - -;АДРЕС: #0603 копирование памяти с #8000 в страницу пользователя -x0603 scf - jr x0607 - -;АДРЕС: #0606 копирование страницы пользователя в #8000 -;вх: a - номер страницы -x0606 or a -x0607 ex af,af' - push de - ld l,#05 ;номер логической страницы - call x3707 ;сравнение страницы пользователя с заданной - jr z,x0644 ;страница совпадает -;сохранение/восстановление страницы пользователя -x0610 ld de,(xE012) - ld bc,#7FFD - ld a,e - and #17 - out (c),a - ld a,d - and #10 - or #02 - ld b,#1F - out (c),a ;rom 2, ram пользователя - ld hl,#C000 - ld de,#8000 - ld bc,#4000 - ex af,af' - jr nc,x0632 - ex de,hl -x0632 ex af,af' - ldir - ld bc,#1FFD - ld a,#12 - out (c),a - ld b,#7F - ld a,#10 - out (c),a ;rom 2, ram 8 - pop de - ret -;сохранение/восстановление 5й страницы -x0644 ld hl,#4000 - ld de,#8000 - ld c,l - ld b,h - ex af,af' - jr nc,x0650 - ex de,hl -x0650 ex af,af' - ldir - ld hl,xC069 ;копируем экран - ld de,#8000 - ld bc,#1B00 - ex af,af' - jr nc,x0660 - ex de,hl -x0660 ex af,af' - ldir - pop de - ret - -;АДРЕС: #0665 включение режима 48k only -x0665 ld bc,#7FFD - ld a,#30 - out (c),a - ret - -;АДРЕС: #066D повторная инициализация страниц (если битая) -x066D ld a,#04 - out (#FE),a - halt ;зеленый бордюр - -;АДРЕС: #0672 инициализация ram 8 (вход при холодном сбросе) -x0672 ld iy,xE014 ;блок переменных - call x04D5 ;включим Турбо-режим -;очистка всех страниц памяти - ld bc,#1FFD - ld a,#12 - out (c),a ;rom 2 - ld a,#18 - jr x0691 -x0684 ld hl,#C000 ;очистка страницы - ld (hl),#00 - ld de,#C001 - ld bc,#3FFF - ldir -x0691 dec a ;очистка страниц #0F-#09 - ld bc,#7FFD - out (c),a - cp #10 - jr nz,x0684 - xor a ;очистка части 8й страницы - ld hl,#C069 ;#C000-#C068 не очищаются - push hl - ld (hl),a - ld de,xC069+1 - ld bc,#3F96 - ldir - pop hl -x06AA cp (hl) ;проверка целостности ram 8 страницы - inc hl - jr nz,x066D ;если битая, зеленый бордюр и тест сначала - cp h - jr nz,x06AA -;копирование блока атрибутов меню монитора в ram8 - ld hl,x3ED2 ;закодированный блок атрибутов меню монитора - ld de,xEAED ;блок атрибуты для монитора - call x3837 ;копирование блока памяти ram 8 с раскодированием - db #DD - db #2A - db #08 ;длина - db #F5 ;адрес байта для раскодирования -;копирование процедур переключения страниц в ram 8 - call x0739 ;копирование части закодированных процедур в ram 8 с раскодированием - ld bc,#0100 - ldir - rst #30 - dw rom7_x0CFF ;установка переменных дисковой BIOS - db #07 - rst #30 - dw rom4_x057F ;распаковка шрифта в rom 8 - db #04 - rst #30 - dw rom4_x0122 ;копирование переменных монитора и проверка чтения портов #7FFD/#1FFD - db #04 - call x3B7F ;установка переменных по конкретным адресам - ld (iy+#08),#30 ;для перевода времени в ASCII =#30 -;формирование строки с версией монитора - ld hl,xE17B+#02 - res 7,(hl) - inc hl - ld (xE3BC),hl - set 6,(iy+#09) ;для п/п печати: чтение данных после управляющего кода - ld c,#00 - call x0732 ;установка координат печати crdY=#00, crdX=#24 - rst #20 - dc "N" - ld l,#F4 - ld h,c - ld a,(hl) - db #ED,#6C ;neg - inc hl - ld h,(hl) - ld l,a ;hl=#CACB - call x16DE ;печать числа hl=[#0000..#FFFF] - ld c,#01 - call x0732 ;установка координат печати crdY=#01, crdX=#24 - ld e,#FC - ld d,c - dec d ;de=#00FC - ld a,(de) ;a=#05 - inc de - push de ;de=#00FD - ld b,#02 - call x1658 ;печать числа A с предварительным пробелом - rst #20 - dc "-" - pop de - ld a,(de) ;a=#07 - ld b,#02 - call x1658 ;печать числа A с предварительным пробелом - ld c,#02 - call x0732 ;установка координат печати crdY=#02, crdX=#24 - rst #20 - dc "V" - rst #20 - dc "4." - rst #20 - dc "01" - ld hl,(xE3BC) - dec hl - set 7,(hl) - res 6,(iy+#09) - call x1F25 ;Команда: CLear - ld hl,x3135 - ex (sp),hl - jp (hl) - -;АДРЕС: #0732 установка координат печати crdY=рег C, crdX=#24 -x0732 rst #20 - db #9B ;признак передачи координат печати - ld a,c - rst #10 ;crd Y - rst #20 - db #A4 ;crd X=#24 - ret - -;АДРЕС: #0739 копирование части закодированных процедур в ram 8 с раскодированием -x0739 ld hl,x3B92 - ld de,xE3BE - call x3837 ;копирование блока памяти ram 8 с раскодированием - db #DD - db #E9 - db #6F ;длина - db #F4 ;адрес в ПЗУ - ret - -;возврат из п/п x0749 -x0747 ex de,hl - ret - -;АДРЕС: #0749 восстановление области памяти из ram 8 -;вх: hl - начало области -; de - адрес буфера для сохранения -; bc - размер для сохранения -; cy =1/0 восстановление/сохранение -; -x0749 scf ;cy =1 восстановление - ex de,hl - exx - ld hl,x0747 - push hl - exx - jr x0754 - -;АДРЕС: #0753 сохранение области памяти в ram 8 -;вх: hl - начало области -; de - адрес буфера для сохранения -; bc - размер для сохранения -; -x0753 or a ;cy =0 сохранение -;восстановление стэка из буфера в ram 8 -x0754 ex af,af' - bit 7,h - jr nz,x079D ;вершина стэка >= #8000 - bit 6,h - jr nz,x0775 ;вершина стэка >= #4000 - push hl ;вершина стэка < #4000 - add hl,bc - dec hl - bit 6,h - pop hl - jp z,x07F1 ;весь стэк в пределах [#0000..#3FFF] - push bc - ld bc,#4000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x07F1 ;сохранение стэка из окна [#0000..#3FFF] - pop bc - -;сохранение стэка из окна [#4000..#7FFF] -x0775 push hl - call x07D7 ;проверка попадания стэка на экран - pop hl - jr nc,x07A1 ;стэк не на экране - bit 3,(iy+#12) - jr z,x07A1 ;копируем из памяти - push hl ;копируем из области сохраненного экрана - add hl,bc - dec hl - call x07D7 - pop hl - jp c,x0807 ;весь стэк в пределах [#4000..#5AFF] - push bc - ld bc,#5B00 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x0807 - pop bc - jr x07A1 - -;сохранение стэка из окна [#8000..#FFFF] -x079D bit 6,h - jr nz,x07BC ;вершина стэка >= #C000 -;сохранение стэка из окна [#5B00..#BFFF] -x07A1 push hl - add hl,bc - dec hl - ld a,h - and #C0 - cp #C0 - pop hl - jp nz,x07FC ;весь стэк в пределах [#8000..#BFFF].сохраняем - push bc - ld bc,#C000 ;вычисление размера стэка до #C000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x07FC ;сохраняем часть стэка - pop bc -x07BC push hl ;сохранение стэка из окна [#С000..#FFFF] - add hl,bc ;проверим не выходит ли стэк за пределы окна - dec hl - bit 6,h - pop hl - jp nz,x0821 ;стэк за пределы окна не выходит - push bc ;стэк выходит за пределы #FFFF - ld bc,#0000 - ex de,hl - ex (sp),hl - call x07E0 - ex (sp),hl - ex de,hl - call x0821 - pop bc - jp x07F1 - -;проверка адреса на принадлежность экрану -x07D7 push de - ld de,#5B00 - or a - sbc hl,de - pop de - ret - -;вычисление размеров на границе окон памяти -;вых: hl = hl-(bc-de) -; bc = bc-de -x07E0 ex de,hl - or a - push hl - ld l,c - ld h,b - pop bc - sbc hl,bc - push bc - ld c,l - ld b,h - pop hl - ex de,hl - or a - sbc hl,bc - ret - -;сохранение стэка из окна [#0000..#3FFF] -x07F1 exx - ld de,(xE012) ;страница при входе - ld bc,#7FFD - jp xE4F0 - -;сохранение стэка из памяти -x07FC ex af,af' - jr nc,x0800 - ex de,hl -x0800 ldir - jr nc,x0805 - ex de,hl -x0805 ex af,af' - ret - -;сохранение стэка из копии окна [#4000..#5AFF] -x0807 push bc - ld bc,#8069 ;адрес в копии экрана - add hl,bc - pop bc - push hl - ld hl,x081A ;адрес возврата - ex (sp),hl - push iy - ld iy,#1010 ;rom 1, ram 8, scr 5 - jr x0827 -x081A push bc - ld bc,#7F97 ;-#8069 - add hl,bc - pop bc - ret - -;сохранение стэка из окна [#C000..#FFFF] -x0821 push iy - ld iy,(xE012) ;номер страницы при входе -x0827 push hl - ld hl,(#8000) - ex (sp),hl ;сохраним (#8000/1) - push ix - ld xh,b - ld xl,c - exx - ld bc,#7FFD - ld a,#10 - out (c),a ;ram 8 - ld b,xh - ld c,xl - ld hl,#8002 - ld de,xDB69 - ldir - ld hl,#1210 ;сохраним/восстановим область памяти - ld a,yl - and %00010111 - ld e,a - ld a,yh - and %00010000 - or %00000010 - ld d,a ;de = rom 2, ram при входе - ex af,af' - jr nc,x0859 ;сохраняем - ex de,hl -x0859 ld bc,#7FFD - out (c),e - ld b,#1F - out (c),d - exx - jr nc,x0866 ;сохраняем - ex de,hl -x0866 ld (#8000),de - ld de,#8002 - ldir ;сохраним/восстановим стэк/память - ld de,(#8000) - ld b,xh - ld c,xl - exx - out (c),h - ld b,#7F - out (c),l ;меняем страницу - exx - ld (#8000),hl - ld hl,#8002 - ldir - ld hl,(#8000) - jr nc,x088D ;сохраняем - ex de,hl -x088D ex af,af' - exx - ld a,#10 - out (c),a - ld b,#1F - ld a,#12 - out (c),a ;rom 2, ram 8 - ld hl,xDB69 ;восстанавливаем память - ld de,#8002 - ld b,xh - ld c,xl - ldir - ld bc,#7FFD - ld a,#10 - out (c),a - exx - pop ix - ex (sp),hl - ld (#8000),hl - pop hl - pop iy - ret - -;АДРЕС: #08B7 таблица с адресами обработки функций rst 8 -x08B7 dw x0911 ;rst 8: db #80 Вывод символа из аккумулятора на принтер - dw x02F4 ;rst 8: db #81 Вызов фунций встроенной дисковой BIOS - dw x0339 ;rst 8: db #82 установка переменных монитора - dw x2A5B ;rst 8: db #83 очистка окна пользователя - dw x035F ;rst 8: db #84 Вывод символа на экран пользователя - dw x0368 ;rst 8: db #85 Отключение монитора - отладчика - dw x08D3 ;rst 8: db #86 Копия графического экрана на принтер - dw x02D1 ;rst 8: db #87 Установка двойной скорости - dw x02D7 ;rst 8: db #88 Установка обычной скорости - dw x0321 ;rst 8: db #89 Работа с микросхемой CMOS - dw x02EB ;rst 8: db #8A вызов п/п работы с графическим курсором !!!ОШИБКА!!! - dw x02AA ;rst 8: db #8B загрузка zs-snap с диска (без возврата) - dw x02CC ;rst 8: db #8C автостарт с дискеты - dw x02AE ;rst 8: db #8D хрень какая-то непонятная - -;АДРЕС: #08D3 rst 8: db #86 Копия графического экрана на принтер -x08D3 xor a - scf - jr x08D8 - -;АДРЕС: #08D7 печать текущего меню монитора -x08D7 xor a -x08D8 ld hl,x08F7 ;адрес возврата по Break - ld (xDE12),hl - ld hl,(xE3B7) ;адрес дескриптора текущего окна - push hl - call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер - push af - ld (xDDA7),sp - set 4,(iy+#09) ;вместо экрана вывод на принтер - call nc,x3A21 ;копирование активного экрана пользователя в #4000 - call x0A51 ;печать экрана на принтер - pop af - jr x08FE - -;возврат по Break -x08F7 ld sp,(xDDA7) - pop af - ld a,#01 - -;вх: a =#00/#01 -x08FE ld hl,xE01D - res 4,(hl) ;вывод на экран - res 5,(hl) - pop ix - ld (xE3B7),ix ;восстановим адрес дескриптора окна - ret nc ;печать текущего меню монитора - or a - jr z,x0937 ;успешно напечатали - jr x091E ;выход по Break - -;АДРЕС: #0911 rst 8: db #80 Вывод символа из аккумулятора на принтер -x0911 ld hl,x091A - ld (xDDA7),sp - jr x0929 -;возврат по Break -x091A ld sp,(xDDA7) -x091E ld a,#01 ;новые флаги программы cy=1 - jr x0939 - -;АДРЕС: #0922 вывод символа из аккумулятора на принтер (???по запросу от внешенего устройства???) -x0922 ld hl,#0146 ;выход из монитора - push hl - ld hl,#0941 -x0929 ld (xDE12),hl ;прерывание по Break - call x300A ;ix = адрес дескриптора окна монитора: вывод на принтер - set 4,(iy+9) ;вывод на принтер - ld a,(xDD7F+#01) ;регистр a программы - rst #10 -x0937 ld a,%01000000 ;новые флаги программы Z -x0939 ld (xDD7F),a -x093C res 4,(iy+9) ;вывод на экран - ret -;прерывание по Break -x0941 ld sp,xE336 - call x093C - ld hl,#05E2 - ld (xDD6B),hl - jp x0146 - -;АДРЕС: #0950 вывод символа на принтер -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -x0950 bit 5,(iy+9) - jr nz,x09A9 ;есть управляющие коды - cp #0D - jr nz,x0987 ;это не перевод строки - ld (ix+#01),#00 ;crd X =#00 - call x0A05 ;передача кода "возврата каретки" для принтера - bit 2,(ix+#07) - jr z,x0970 ;выполнять автоматический перевод строки при приходе символа возврат каретки - ld a,(xE055) ;код символа "перевода строки" для принтера - or a - jr z,x0970 - call x09A9 ;перевод строки на принтере -; перевод строки, если вышли за пределы окна -x0970 ld a,(ix+#04) - or a - ret z ;высота окна в знакоместах - inc (ix+#00) - cp (ix+#00) - ret nc - ld (ix+#00),#00 - ld a,(xE056) ;код символа "перевода формата" для принтера - or a - ret z - jr x09A9 - -;печать символа на принтере -;вх: a - код символа/управляющий код -x0987 cp #20 - jr c,x09A9 ;это управляющий код - cp #7F ;коррекция печатного символа - jr nz,x0991 - ld a,#2E ;"." -x0991 ld e,a -; возврат каретки, если вышли за пределы окна - ld a,(ix+#05) ;ширина окна в знакоместах - or a - jr z,x09A8 - inc (ix+#01) ;crd X +1 - cp (ix+#01) - jr nc,x09A8 - push de ;перевод строки - rst #20 - db #8D - pop de - xor a - ld (ix+#01),a ;crd X =#00 -x09A8 ld a,e - -;печать символа на принтере -;вх: a - код символа/управляющий код -x09A9 ld d,(iy+#15) - bit 7,d - jr z,x09B1 ;positive - cpl -x09B1 bit 0,d - jr z,x0A10 ;Centronics -;интерфейс RS232 - push af - xor #FF - rlca - rlca - rlca - push af - call x04D9 ;выключение Турбо-режима - pop bc - ld c,b ;символ для печати -; ожидание готовности??? -x09C1 call x0A33 ;проверка нажатия BREAK - jr nc,x0A2F ;нажат BREAK - ld a,#FF - in a,(#FE) - bit 5,a - jr z,x09C1 ;ожидание готовности??? -; побитовая передача кода символа - ld b,#08 - bit 2,d - jr z,x09D5 ;data bits 8 - dec b -x09D5 push bc - ld bc,#1FFD - ld a,%00011010 - out (c),a - pop bc -x09DE call x0A3F ;задержка при передаче данных на принтер - push bc - ld a,c - ld bc,#1FFD - and %00001000 - or %00010010 - out (c),a - pop bc - rrc c - djnz x09DE -; завершение печати - call x0A3F ;задержка при передаче данных на принтер - ld bc,#1FFD - ld a,%00010010 - out (c),a - call x0A3F ;задержка при передаче данных на принтер - bit 3,d ;stop bits 2/1 - call z,x0A3F ;задержка при передаче данных на принтер - pop af - ret - -;передача кода "возврата каретки" для принтера -x0A05 ld a,(xE054) ;код символа "возврата каретки" для принтера - or a - ret z - push bc - call x09A9 - pop bc - ret - -;интерфейс Centronics -x0A10 ld c,a -x0A11 call x0A33 ;проверка нажатия BREAK - jr nc,x0A2F ;нажат - ld a,#FF - in a,(#FE) - rlca - jr c,x0A11 ;ожидание готовности??? - ld a,c ;вывод символа на принтер - ld bc,#FFDD - out (c),a - ld bc,#1FFD - ld a,%00110010 - out (c),a - ld a,%00010010 - out (c),a - ret - -;прерывание по Break -x0A2F ld hl,(xDE12) - jp (hl) - -;АДРЕС: #0A33 проверка нажатия BREAK -;вых: cy=0 нажат BREAK -; -x0A33 ld a,#7F ;проверка нажатия пробела - in a,(#FE) - rra - ret c ;не нажат - ld a,#FE ;проверка нажатия CapsShift - in a,(#FE) - rra - ret - -;задержка при передаче данных на принтер -x0A3F push af - ld hl,(xE057) - bit 1,d - jr z,x0A4A - ld hl,(xE059) -x0A4A dec hl - ld a,h - or l - jr nz,x0A4A - pop af - ret - -;АДРЕС: #0A51 печать экрана на принтер -x0A51 ld bc,#0000 -x0A54 set 5,(iy+#09) ;прочие управляющие коды - -;режим печати -x0A58 bit 5,(iy+#15) ;режим печати - ld a,#01 - jr z,x0A62 ;одна точка - ld a,#03 -x0A62 ld (xE05B+#06),a -;передача управляющих кодов - push bc - ld hl,xE05B ;список кодов для перевода принтера в графический режим - call x0AD2 ;передача кодов на принтер - pop bc -;печать строчки экрана -x0A6D push bc - bit 5,(iy+#15) - ld d,#08 - jr z,x0A78 - ld d,#04 -;печать одного байта -x0A78 push bc -; расчет экранного адреса из пиксельных координат - ld a,b - and a - rra - scf - rra - and a - rra - xor b - and #F8 - xor b - ld h,a - ld a,c - rlca - rlca - rlca - xor b - and #C7 - xor b - rlca - rlca - ld l,a ;hl - адрес - ld a,c - and #07 -; получение байта для печати - ld b,a - inc b - ld a,(hl) -x0A96 rlca - djnz x0A96 - push af - rl e - pop af - bit 5,(iy+#15) ;режим печати - jr z,x0AA5 ;одна точка - rl e -x0AA5 pop bc - inc b - dec d -x0AA8 jr nz,x0A78 ;e - байт для печати -; установка positive/negative - ld a,e -x0AAB bit 2,(iy+#12) - jr z,x0AB2 ;печать positive/negative - cpl -; печать байта -x0AB2 rst #10 - bit 5,(iy+#15) - jr z,x0ABB ;режим печати одна точка - rst #10 - rst #10 -x0ABB inc c - ld a,c - jr z,x0AC3 - pop bc - ld c,a - jr x0A6D -x0AC3 pop de -;следующая строка -x0AC4 res 5,(iy+#09) - rst #20 - dc #8D - ld a,#BF - cp b - jr nc,x0A54 -;первод в текстовый режим и выход - ld hl,xE063 ;список кодов для перевода принтера в текстовый режим - -;передача кодов на принтер -x0AD2 ld b,(hl) - inc hl - jp x15B3 - -;АДРЕС: #0AD7 Команда: EXit выход из отладчика в меню -x0AD7 res 0,(iy+#12) - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 - ret - -;АДРЕС: #0AE0 печать/обновление окна отладчика -;вх: a - номер сообщения для печати над строкой ввода -x0AE0 ld (iy+#0A),#00 - push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - jr x0B06 - -;АДРЕС: #0AEB вызов отладчика M. Monitor -x0AEB ld sp,xE336 - set 0,(iy+#12) - -;АДРЕС: #0AF2 полное обновление окна отладчика -x0AF2 call x04D5 ;включение Турбо-режима - xor a - ld (xE01E),a ;настройки отладчика - jr x0AFC - -;АДРЕС: #0AFB обновление окна отладчика, без информационного окна -x0AFB scf -x0AFC push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - call nc,x33CD ;печать информационного окна отладчика - ld a,#81 ;сообщение: enter command - -;АДРЕС: #0B06 ввод и обработка команды отладчика -x0B06 ld sp,xE336 - call x0550 ;сохранение экрана из страницы 5 - ld hl,x0B06 ;сюда вернемся - push hl - rst #30 ;ввод команды отладчика - dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана - db #05 - jr nc,x0B40 ;команду ввели - call x2C7E ;поиск и вызов процедуры обработки клавиши без возврата(если не найдено возврата) - db #87 ;cs+3 - dw x303C ;выполнение команды, на которую указывает PC - db #88 ;cs+4 - dw x303F ;выполнение команды с быстрым выполнением подпрограмм - db #89 ;cs+9 - dw x1019 ;пропуск программы, содержание регистра PC увеличивается на длину текущей команды (сама команда не выполняется) - db #8A ;ss+a - dw x0FFF ;на следующую команду (если команда не выполняется) - db #1C ;ss+q - dw x0FF5 ;на один байт влево - db #1E ;ss+e - dw x0FFA ;на один байт вправо - db #1D ;ss+w - dw x0FEB ;на одну строку вверх - db #8B ;ss+s - dw x0FF0 ;на одну строку вниз - db #8C ;ss+f - dw x3517 ;продолжение поиска в отладчике (для команд FIND/SEARCH) - db #8E ;ss+d - dw x38D8 ;быстрый вход в команду DASM - db #8D ;ss+g - dw x3655 ;переход на адрес, содержащийся в команде, расположенный в текущей ячейке памяти - db #04 ;cs+1+d - dw x1101 ;редактирование дампа памяти - db #FF - xor a - ret -;анализ введенной команды -;hl - введенная строка -x0B40 call x0EE3 ;поиск в буфере ввода строки первого печатного символа - ld e,#00 - cp #0D - jp z,x0AF2 ;пустая строка. полное обновление окна отладчика - cp "[" - jr z,x0B56 ; - cp "(" - jr nz,x0B59 - ld e,#04 - jr x0B58 -x0B56 ld e,#84 -x0B58 inc hl -x0B59 ld (iy+#00),e - bit 2,e - jr nz,x0BCC ;команда начинается со скобки - -;определение кода команды (для установки регистров и переменной MEM) - ld de,x0FA5 - ld bc,x0F66 - call x0F2E ;определение кода команды по введенной строке - jp z,x0C0F ;выполнение введенной команды - ex de,hl ;de адрес введенной строки - cp #21 - jr nc,x0B7D ;регистр R или I - cp #0D - jr nc,x0B7E ;8 бит регистр - set 3,(iy+#00) ;16 бит регистр - sla c - jr x0B82 -x0B7D inc bc -x0B7E ld a,c - sub #07 - ld c,a ;bc смещение до регистра пользователя -;присвоение значения, если есть знак = -x0B82 ld a,(de) - cp #3D ;= - jp nz,x0C0F ;выполнение введенной команды - inc de - ex de,hl ;hl адрес введенной строки - push bc - call x0EBA ;выделение из строки числовых операндов (не более 6) - pop bc ;de значение операнда - cp #01 - ld a,#0A ;сообщение: too few operands - ret c ;ошибка. нет операндов - ld a,#0B ;сообщение: too many operands - ret nz ;ошибка. слишком много операндов - bit 2,(iy+#00) - jr nz,x0BF0 ;есть незакрытая скобка - ld hl,xDD69 - add hl,bc ;адрес регистра пользователя - bit 3,(iy+#00) - jr nz,x0BB1 ;16 бит значение команды -; 8 бит значение команды - ld a,d - or a - jr nz,x0BC9 ;ошибка: out of range - call x0EAA ;установка флагов обновления: регистров - ld (hl),e - jr x0BC6 -; 16 бит значение команды -x0BB1 ld a,c - cp #02 - jr nz,x0BBA ;это не регистр PC - res 6,(iy+#0A) ;обновить дизассемблер в мониторе -x0BBA or a - push af ;a=#00 это указатель MEM - call z,x0EB1 ;обновить дамп памяти и обновлять дизассемблер памяти - pop af - call nz,x0EAA ;обновить регистры - ld (hl),e - inc hl - ld (hl),d -x0BC6 jp x0AFB ;обновление монитора-отладчика -;ошибка -x0BC9 ld a,#0C ;сообщение: out of range - ret - -;вычисление значения операнда в скобках -;вх: hl - адрес введенной строки (начало операнда) -x0BCC call x0C98 ;вычисление значения в введенной строке - ret c ;ошибка в строке: operand not found - ex de,hl ;hl - вычисленное значение - ld c,l - ld b,h - ld a,(de) - inc de - ld hl,xE014 - cp #29 ;) - jr z,x0BE9 - cp #5D - jp nz,x0C0F ;выполнение введенной команды -; закрытие скобки ] - bit 7,(hl) - jr z,x0BED ;ошибка: invalid type brackets - set 3,(hl) - jr x0B82 ;присвоение значения, если есть знак = -; закрытие скобки ) -x0BE9 bit 7,(hl) - jr z,x0B82 ;присвоение значения, если есть знак = -; ошибка: invalid type brackets -x0BED ld a,#15 - ret -;есть незакрытая скобка -x0BF0 bit 3,(iy+#00) - ld l,c - ld h,b - jr nz,x0C08 ;16 бит значение команды -; 8 бит значение команды - ld a,d - or a - jr nz,x0BC9 ;ошибка: out of range - ld a,e - rst #00 ;запись байта в память пользователя -; обновить все значения в отладчике -x0BFE ld a,(xE01E) - and #81 - ld (xE01E),a - jr x0BC6 ;обновление монитора-отладчика -; 16 бит значение команды -x0C08 ld a,e - rst #00 ;запись байта в память пользователя - inc hl - ld a,d - rst #00 ;запись байта в память пользователя - jr x0BFE ;обновить все значения в отладчике - -;выполнение введенной команды -x0C0F ld hl,xE11E - ld b,#03 -x0C14 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld (xDDA7),de ;de - адрес таблицы с адресами процедур обработки команды - ld a,e - or d - jr z,x0C32 ;ошибка: command not found - ld e,(hl) - inc hl - ld d,(hl) - inc hl ;de - адрес списка команд - push hl - push bc - call x0EE3 ;поиск в буфере ввода строки первого печатного символа - call x0EF0 ;поиск заданной команды в списке - jr nz,x0C37 ;команда найдена - pop bc - pop hl - djnz x0C14 -; ошибка: command not found -x0C32 ld a,#16 ;сообщение: command not found - jp x0B06 ;полное обновление окна отладчика -;команда найдена. выполнение команды -x0C37 pop de - ex (sp),hl ;(sp) следующий адрес в строке - add a,c - add a,c - ld c,a ;*3 - ld hl,(xDDA7) ;hl - адрес таблицы с адресами процедур обработки команды - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) ;de - процедура обработки команды - inc hl - ld c,(hl) ;c - флаги команды - pop hl ;следующий адрес в строке - push de - bit 7,c - jr nz,x0C67 ;проверка корректности команды. в параметрах команды есть строка - bit 5,c - ret nz ;переход на обработку команды - push bc - call x0EBA ;выделение из строки числовых операндов (не более 6) - pop bc ;de - первый операнд, hl - второй операнд, a - количество операндов [0..5] - bit 6,c - jr nz,x0C62 ;переход на обработку команды - cp c - jr z,x0C62 ;количество прочитанных операндов совпадает - ld a,#0A ;ошибка: too few operands - jr c,x0C5F ;введено меньше операндов чем надо - inc a ;ошибка: too many operands -x0C5F jp x0B06 ;полное обновление окна отладчика -x0C62 ld bc,(xDD9D) ;bc - третий операнд - ret ;переход на обработку команды - -;проверка строки команды (в параметрах команды есть строка) -;вых: b - количествор параметров в строке -x0C67 ld b,#00 - push hl -x0C6A dec c - bit 7,c - jr nz,x0C73 ;это еще числовое значение - set 1,(iy+#00) ;читаем из параметров строку -x0C73 bit 1,(iy+#00) - push bc - jr nz,x0C7F ;читаем из параметров строку - call x0C98 ;читаем из параметров число - jr x0C82 -x0C7F call x0D55 ;читаем из параметров строку -x0C82 pop bc - jr z,x0C8A ;прочитано без ошибок - jp nc,x0B06 ;полное обновление окна отладчика -; конец строки команды - pop hl - ret ;переход на обработку команды -x0C8A inc b - bit 7,c - jr nz,x0C6A ;прочитан числовой операнд - ld a,d - or a - jr z,x0C6A - ld a,#0C ;ошибка: out of range - jp x0B06 ;полное обновление окна отладчика - -;АДРЕС: #0C98 чтение числового операнда из строки команды -;вх: hl - адрес введенной строки -;вых: de - вычисленное значение -; hl - следующий адрес в введенной строке -; nz - были ошибки -; cy=1 - ошибка в строке: operand not found -x0C98 dec hl -x0C99 inc hl - call x0D42 ;проверка символа в (hl) пробел , ; #00 #0D - jr nz,x0CA7 ;cy=1 символ =#00/#0D - jr nc,x0C99 - xor a - inc a - ld a,#12 ;сообщение: operand not found - scf - ret -x0CA7 ld (iy+#0F),#00 ;количество незакрытых скобок -x0CAB ld de,#0000 ;базовое число (к нему будем прибавлять/отнимать) - push de -;проверка знака в строке - ld d,#2B ;"+" - ld a,(hl) - call x0D38 ;проверка A = "+" или "-" - jr nz,x0CB9 - inc hl -x0CB8 ld d,a ;знак +/- -;проверка открыия скобки -x0CB9 push de - ld a,(hl) - cp #28 ;( - jr z,x0CC3 - cp #5B ;[ - jr nz,x0CCC -x0CC3 inc hl - inc (iy+#0F) - pop de - ld e,a ;открытая скобка ( или [ - push de - jr x0CAB ;скобка открыта, читаем следующий символ -;выделение числа из строки по адресу в hl -x0CCC call x0D55 ;z a =#00 успешно -> de - число - jr nz,x0CF8 ;не число. в a - сообщение об ошибке. полное обновление окна отладчика -;вычисление суммы/разности чисел -;de - число -x0CD1 pop af ;знак операции +/- - ex (sp),hl ;второе число - cp #2D ;- - jr z,x0CDA - add hl,de - jr x0CDD -x0CDA or a - sbc hl,de -x0CDD ex (sp),hl -;проверка знака в строке - ld a,(hl) - inc hl - call x0D38 ;проверка A = "+" или "-" - jr z,x0CB8 ;повторим сложение/вычитание - cp #29 ;) - jr z,x0CFB ;закроем скобку ) - cp #5D ;] - jr z,x0D0E ;закроем скобку ] - dec hl - xor a - cp (iy+#0F) - jr nz,x0CF6 ;лишняя скобка - pop de - ret -x0CF6 ld a,#13 ;сообщение: quit operand not found -x0CF8 jp x0B06 -;закроем скобку ) -x0CFB pop de ;полученное число - call x0D22 ;уменьшим количество незакрытых скобок - pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая - push af - ld a,#15 ;сообщение: invalid type brackets - jr c,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика -; чтение байта из памяти пользователя - push hl - ex de,hl - rst #28 ;чтение байта из памяти пользователя - ld e,a - ld d,#00 - pop hl - jr x0CD1 ;продолжим анализ -;закроем скобку ] -x0D0E pop de - call x0D22 ;уменьшим количество незакрытых скобок - pop af ;f=код скобки 1,f(cy) =1/0 квадратная/круглая - push af - ld a,#15 ;сообщение: invalid type brackets - jr nc,x0CF8 ;несоответствие скобок. ошибка. полное обновление окна отладчика -; чтение слова из памяти пользователя - push hl - ex de,hl - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - pop hl - jr x0CD1 ;продолжим анализ -;уменьшим количество незакрытых скобок -x0D22 xor a - cp (iy+#0F) - jr z,x0D2C ;нет открытых скобок - dec (iy+#0F) - ret -x0D2C bit 2,(iy+#00) - ld a,#14 ;сообщение: too many > - jr z,x0CF8 ;ошибка. много скобок - pop bc - dec hl - xor a - ret - -;проверка A = "+" или "-" -x0D38 cp #2B ;+ - ret z - cp #2D ;- - ret - -;АДРЕС: #0D3E проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) -;вых: z - это разделитель -; cy=1 это конец строки -x0D3E ld a,(hl) - cp #3A ;: - ret z - -;АДРЕС: #0D42 проверка символа в (hl) #20/#2C/#3B/#00/#0D -;вых: z - это разделитель -; cy=1 это конец строки -x0D42 ld a,(hl) - cp #20 ;" " - ret z - -;АДРЕС: #0D46 проверка символа в (hl) #2C/#3B/#00/#0D -;вых: z - это разделитель -; cy=1 это конец строки -x0D46 ld a,(hl) - cp #2C ;"," - ret z - cp #3B ;";" - ret z - or a - scf - ret z - cp #0D - ret nz - scf - ret - -;АДРЕС: #0D55 чтение из строки команды чилового/байта строкового значения -;вх: hl - адрес введенной строки (начало параметра команды) -;вых: nz - ошибка. в A - код ошибки -; cy=1 синтаксическая ошибка -; z a =#00 успешно -> de - число -; hl - адрес начала следующего слова в введенной строке -x0D55 bit 0,(iy+#00) - ld a,#10 - ld (xE024),a ;делитель для выделения разряда числа - jr nz,x0D74 ;анализ строки после кавычек -;поиск значимого символа в строке - dec hl -x0D61 inc hl - res 0,(iy+#00) - call x0D42 ;проверка символа в (hl) z -> пробел , ; #00 #0D - jr nz,x0D6F ;cy=1 символ =#00/#0D - jr c,x0DA6 ;ошибка: syntax error - jr x0D61 -x0D6F cp #22 ;" - jr nz,x0DAC ;не кавычки. чтение числа из введенной строки -;анализ строки в кавычках (допустим только один символ чило=код символа) - inc hl -x0D74 ld a,(hl) - cp #0D - jr z,x0DA2 ;конец строки. ошибка: bad string - cp #22 ;" - jr z,x0D9C ;кавычки закрыли - ld e,a - ld d,#00 ;код символа из строки - bit 1,(iy+#00) - jr nz,x0D8E ;параметр =строка - inc hl - ld a,#22 ;" - cp (hl) - jr nz,x0DA2 ;ошибка: bad string - jr x0D92 -; читаем параметр-строку -x0D8E set 0,(iy+#00) -; выход -x0D92 inc hl - xor a - ld (xE024),a - ret -;ошибка: known number - ld a,#0D ;сообщение: known number - or a - ret -;кавычки закрыли -x0D9C bit 1,(iy+#00) - jr nz,x0D61 ;параметр-строка. -;ошибка: bad string -x0DA2 ld a,#0E ;сообщение: bad string - or a - ret -;ошибка: syntax error -x0DA6 xor a - inc a - ld a,#0F ;сообщение: syntax error - scf - ret - -;чтение числа из введенной строки -;вх: hl - адрес строки -;вых: z a =#00 успешно -> de - число -; nz a =#10 не число. сообщение: not number -; nz a =#11 результат более 16 бит. сообщение: number too big -; hl - адрес начала следующего слова в введенной строке -x0DAC ld de,x0FA0 - ld bc,x0F41 - call x0F2E ;определение кода команды по введенной строке - jr nz,x0DBD ;команда(регистр) найдена в списке - call x0DF4 ;преобразование строки в число - ret z - or a - ret -x0DBD ld de,#0001 - ld a,c - or a - ret z ;ON -> de=#0001, a=#00 - dec de - dec a - ret z ;OFF -> de=#0000, a=#00 - push hl - ld hl,xDD83+#01 ;адрес регистра R пользователя - ld a,c - sub #23 - jr nc,x0DE4 ;регитр R или I - ld hl,xDD6F ;начало списка регистров ползьзователя - ld a,c - sub #0F - jr nc,x0DE4 ;регистр 8 bit -; 16 бит регистр - dec bc - dec bc - ld hl,xDD6F-#06 - add hl,bc - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) -x0DE1 pop hl - xor a - ret -; 8 бит регистр -x0DE4 add a,l - ld l,a - jr nc,x0DE9 - inc h -x0DE9 ld e,(hl) - jr x0DE1 - -;АДРЕС: #0DEC таблица префиксов и основания систем счислений -x0DEC db "%",#02 - db "@",#08 - db ".",#0A - db "#",#10 - -;АДРЕС: #0DF4 преобразование строки в число (!!!при base 0 работает неверно!!!) -;вх: hl - адрес строки -;вых: z a =#00 успешно -> de - результат -; nz a =#10 не число. сообщение: not number -; nz a =#11 результат более 16 бит. сообщение: number too big -; -x0DF4 ld a,(xE02B) ;текущая система счисления =2/8/10/16 - ld b,#0A - or a - jr z,x0DFD - ld b,a -x0DFD call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) - jr nc,x0E17 ;это цифра - ld de,x0DEC ;проверим является ли симовол префиксом системы счисления - ld b,#04 -x0E07 ld a,(de) - inc de - cp (hl) - ld a,(de) - inc de - jr z,x0E15 ;да, это префикс. в A основание системы счислений - djnz x0E07 - ld b,(iy+#17) - jr x0E17 -x0E15 inc hl ;строка после префикса - ld b,a ;основание системы счислений -x0E17 ld (iy+#10),b ;делитель для выделения разряда числа - call x0E1F ;преобразование строки в число - or a - ret -;преобразование строки в число (!!!при base 0 работает неверно!!!) -;вх: hl - строка чисел -;вых: a =#00 успешно -> de - результат -; a =#10 не число -; a =#11 результат более 16 бит -x0E1F call x0E59 ;преобразование символа в число, с учетом системы счисления - ld a,#10 - ret c ;выход. не число - ld b,#00 - ld d,b - ld e,c - inc hl -x0E2A call x0E59 ;преобразование символа в число, с учетом системы счисления - jr c,x0E45 ;числа кончились - push hl - ld hl,(xE024) ;делитель для выделения разряда числа - ld h,#00 - ex de,hl - push bc - call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - pop bc - jr nz,x0E4D ;результат более 16 бит - add hl,bc - jr c,x0E4D ;результат более 16 бит - ex de,hl - pop hl - inc hl - jr x0E2A -x0E45 call x0E51 ;проверка в (hl) цифра или нет (cy=1 не цифра) - ld a,#10 - ret nc - xor a - ret -;-результат более 16 бит -x0E4D pop hl - ld a,#11 - ret -;-проверка в (hl) цифра или нет (cy=1 не цифра) -;вх: hl - адрес в строке -x0E51 ld a,(hl) - cp #30 - ret c - cp #3A - ccf - ret -;-преобразование символа в число, с учетом системы счисления -;вх: hl - адрес строки чисел -;вых: c - число -; cy=1 ошибка. это не число -x0E59 ld a,(hl) - cp #61 - jr c,x0E60 - sub #20 ;буква в верхнем регистре -x0E60 sub #30 - ret c ;неизвестный символ - cp #0A - jr c,x0E6C ;это цифра - cp #11 - ret c ;неизвестный символ - sub #07 -x0E6C ld c,a - ld a,(xE024) ;делитель для выделения разряда числа - dec a - cp c - ret - -;АДРЕС: #0E73 деление bc=hl/de с проверкой de на ноль -; -x0E73 res 2,(iy+#0E) - ld a,d - or e - jr z,x0E80 - ld a,h - ld c,l - jp x16AA -x0E80 set 2,(iy+#0E) - ret - -;АДРЕС: #0E85 умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) -;вых: ahl - результат -; 0,(iy+#0E)=1 результат более 16 бит -; -x0E85 res 0,(iy+#0E) - ld c,h - ld a,l - ld b,#10 - ld hl,#0000 -x0E90 add hl,hl - jr nc,x0E97 - set 0,(iy+#0E) -x0E97 rla - rl c - jr nc,x0EA3 - add hl,de - jr nc,x0EA3 - set 0,(iy+#0E) -x0EA3 djnz x0E90 - bit 0,(iy+#0E) - ret - -;установка флагов обновления: содержимого регистров и дамп по содержимому регистров -x0EAA ld a,(xE01E) - and #F5 ;%11110101 - jr x0EB6 -;установка флагов обновления: обновлять дамп памяти и обновлять дизассемблер памяти по содержимому ячейки памяти -x0EB1 ld a,(xE01E) - and #CF ;%11001111 -x0EB6 ld (xE01E),a - ret - -;АДРЕС: #0EBA выделение из строки числовых операндов (не более 6) -;вх: hl - адрес введенной строки -;вых: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x0EBA xor a - ld bc,xDD99 -x0EBE push af - push bc - call x0C98 ;вычисление значения в введенной строке - pop bc ;de вычисленное значение - jr c,x0EDA ;ошибка в строке - jp nz,x0B06 ;ошибка. полное обновление окна отладчика - ld a,e - ld (bc),a - inc bc - ld a,d - ld (bc),a - inc bc - pop af - inc a - cp #06 - jr nz,x0EBE - ld a,#0B ;ошибка: too many operands - jp x0B06 ;полное обновление окна отладчика -x0EDA pop af - ld de,(xDD99) - ld hl,(xDD99+#02) - ret - -;АДРЕС: #0EE3 поиск в буфере ввода строки первого печатного символа -;вых: hl - адрес в буфере -; z - этот символ перевод строки -x0EE3 ld hl,xDE17 ;буфер для ввода строки - -;АДРЕС: #0EE6 поиск в строке первого печатного символа -;вых: hl - адрес в строке -; z - этот символ перевод строки -x0EE6 ld a,(hl) - cp " " - inc hl - jr z,x0EE6 - dec hl - cp #0D - ret - -;АДРЕС: #0EF0 поиск заданной команды в списке -;вх: hl - строка с введенной командой -; de - список команд -;вых: nz - команда найдена в списке -; a,bc - номер найденной команды в списке -x0EF0 ld c,#00 -x0EF2 push hl - ld a,(de) ;пропуск служебных байтов - cp #20 ;space - jr nc,x0EFA - inc de - inc de -x0EFA ld a,(de) - ld b,a - and #7F - cp #61 ;a - jr c,x0F04 ;буква в контрольном слове в верхнем регистре - set 7,c ;если в нижнем, то не является значимой -x0F04 ld a,b - call x0F89 ;перевод символа в верхний регистр - ld b,a - ld a,(hl) - call x0F89 ;перевод символа в верхний регистр - cp b - jr nz,x0F1E ;нет совпадения - ld a,(de) - bit 7,a - inc hl - inc de - jr z,x0EFA ;следующая буква -;слово найдено -x0F17 pop de - res 7,c - ld a,c - ld b,#00 - ret -x0F1E bit 7,c - jr nz,x0F17 ;буква в контрольном слове в нижнем регистре -;сравниваем со следующим словом - pop hl -x0F23 ld a,(de) - rlca - inc de - jr nc,x0F23 - inc c - ld a,(de) - or a - jr nz,x0EF2 - ret - -;определение кода команды по введенной строке -;вх: hl - адрес строки с введенной командой -; de - список команд -; bc - список кодов соответствующих команде -;вых: z - команда не найдена в списке -; nz - команда найдена в списке -; a,bc - код найденной команды в списке -; hl - адрес начала следующего слова в введенной строке -x0F2E push bc - call x0EF0 ;поиск заданной команды в списке - pop de - ret z ;команда не найдена - push de - ex (sp),hl - push af - add a,l - ld l,a - jr nc,x0F3C - inc h -x0F3C pop af - ld a,(hl) - ld c,a - pop hl - ret - -;номера кодов соответсвующих списку x0FA0 (названия регистров для монитора) -x0F41 db #00,#01,#02,#23 ;ON / OFF/ MEM/ R - db #0E,#0D,#22,#20 ;AF'/ AF / A' / A - db #21,#1F,#0F,#10 ;F' / F / IXL/ IXH - db #11,#12,#05,#06 ;IYL/ IYH/ IX / IY - db #03,#04,#0A,#0B ;PC / SP / HL'/ DE' - db #0C,#07,#08,#09 ;BC'/ HL / DE / BC - db #19,#1A,#1B,#1C ;L' / H' / E' / D' - db #1D,#1E,#13,#14 ;C' / B' / L / H - db #15,#16,#17,#18 ;E / D / C / B - db #24 ;I - -;номера кодов соответсвующих списку x0FA5 (названия регистров для монитора) -x0F66 db #00,#21,#0C,#0B ;MEM/ R / AF'/ AF - db #20,#1E,#1F,#1D ;A' / A / F' / F - db #0D,#0E,#0F,#10 ;IXL/ IXH/ IYL/ IYH - db #03,#04,#01,#02 ;IX / IY / PC / SP - db #08,#09,#0A,#05 ;HL'/ DE'/ BC'/ HL" - db #06,#07,#17,#18 ;DE / BC / L' / H' - db #19,#1A,#1B,#1C ;E' / D' / C' / B' - db #11,#12,#13,#14 ;L / H / E / D - db #15,#16,#22 ;C / B / I - -;перевод символа в нижний регистр -x0F89 and #7F - cp #40 - ret c - and #5F - ret - -;АДРЕС: #0F91 названия регистров для монитора -x0F91 dc "PC" - dc "SP" - dc "IX" - dc "IY" - dc "HL" - dc "DE" - dc "BC" - db #00 - -;АДРЕС: #0FA0 названия команд/регистров -x0FA0 dc "ON" -x0FA2 dc "OFF" -x0FA5 dc "MEM" - dc "R" - dc "AF'" - dc "AF" - dc "A'" - dc "A" - dc "F'" - dc "F" - dc "IXL" - dc "IXH" - dc "IYL" - dc "IYH" - dc "IX" - dc "IY" - dc "PC" - dc "SP" - dc "HL'" - dc "DE'" - dc "BC'" - dc "HL" - dc "DE" - dc "BC" - dc "L'" - dc "H'" - dc "E'" - dc "D'" - dc "C'" - dc "B'" - dc "L" - dc "H" - dc "E" - dc "D" - dc "C" - dc "B" - dc "I" - db #00 - -;АДРЕС: #0FEB на одну строку вверх в отладчике -x0FEB ld bc,#FFF8 - jr x1005 - -;АДРЕС: #0FF0 на одну строку вниз в отладчике -x0FF0 ld bc,#0008 - jr x1005 - -;АДРЕС: #0FF5 на один байт влево в отладчике -x0FF5 ld bc,#FFFF - jr x1005 - -;АДРЕС: #0FFA на один байт вправо в отладчике -x0FFA ld bc,#0001 - jr x1005 - -;АДРЕС: #0FFF на следующую команду (если команда не выполняется) -x0FFF ld hl,(xDD69) ;ячейка mem - call x2F96 ;анализ команды ассемблера - -x1005 ld hl,(xDD69) ;ячейка mem - add hl,bc - ld (xDD69),hl - ld a,#01 - bit 0,(iy+#0A) - jr z,x102B ;очищать экран монитора при обновлении информации - call x2E3D ;печать дампа памяти в окне - xor a - ret - -;АДРЕС: #1019 пропуск программы, содержание регистра PC увеличивается на длину -; текущей команды (сама команда не выполняется) -x1019 ld hl,(xDD6B) ;PC - call x2F96 ;анализ команды ассемблера - ld (xDD6B),hl - ld a,(iy+#0A) - and %10110101 - ld (iy+#0A),a - xor a - -x102B push af - call x2CA8 ;печать/обновление монитора-отладчика - pop af - ret - -;нажата стрелка влево. полный сброс -x1031 ld (xEAF5+#18),hl ;портим память в ram 8 - jp x0040 ;инициализация - -;АДРЕС: #1037 инициализация системы и чтение настроек Autoconfig -x1037 call x1048 ;инициализация системы и чтение настроек Autoconfig - set 6,(iy+#14) ;"теплый" сброс - ld b,#00 - ld hl,xEAF5 ;байты - признак целостности страницы -x1043 ld (hl),b - inc hl - djnz x1043 - ret - -;инициализация системы и чтение настроек Autoconfig -x1048 ld iy,xE014 - call x0739 ;копирование процедуры в ram 8 с раскодированием - ld bc,#FEFE ;проверка нажатия CapsShift+5 - in a,(c) - rrca - jr c,x105F ;не нажата - ld b,#F7 ;проверка нажатия 5 - in a,(c) - bit 4,a - jr z,x1031 ;cs+5 нажата -x105F scf - jr x107A ;чтение настроек Autoconfig - - - -x1062 ld de,xC006 - ld a,(de) - sub e - dec de - jr z,x1073 - call x3E25 ;чтение портов #1FFD/#7FFD - scf - jr x107A ;чтение настроек Autoconfig -x1070 ex de,hl - inc (hl) - ex de,hl -x1073 ld a,(de) - sbc a,e - and #07 - jp z,x001E ;сброс - - -;инициализация системы и чтение настроек Autoconfig -;cy=1 чтение настроек Autoconfig в соответствии с параметрами переменной -; =0 безусловное чтение настроек Autoconfig -x107A push af -; подсчет контрольной суммы Basic128 с адреса #500-#5FF - ld hl,#0000 - ld b,h - ld c,#FE - ld (xE012),hl ;rom 0, ram 0 пользователя - ld h,#05 ;hl=#0500 адрес откуда читаем -x1086 rst #28 ;чтение байта из памяти пользователя - add a,b - ld b,a - inc hl - ld a,h - sub #06 - jr nz,x1086 - ld a,(x2BB2) - sub b - jp nz,x001E ;не совпадает. сброс - call x04CE ;восстановление режима Турбо - rst #30 - dw rom4_x0A5A ;инициализация системы и печать сооветствующих сообщений - db #04 - pop af - jr nc,x10B5 ;чтение и установка настроек из конфигурационного сектора - bit 1,(iy+#14) - ret nz ;Autoconfig Off - ld a,(xFFD0) - push af - call x10B5 ;чтение и установка настроек из конфигурационного сектора - rst #30 - dw rom5_x08EF ;установка доступности мыши - db #05 - pop af - ld (xFFD0),a - ret -;чтение и установка настроек из конфигурационного сектора -x10B5 xor a - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - ld bc,#FEFE - in a,(c) - rrca - jr c,x10C8 ;cs не нажата - ld b,#EF - in a,(c) - bit 2,a - ret z ;нажато cs+8 -x10C8 bit 6,(iy+#14) - jr nz,x10D6 ;"теплый" сброс - ld d,#02 - ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 -x10D6 rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - ret c ;ошибка - ld (ix+1),#00 ;crd X - ld bc,#5D00 ;сообщение: "boot record" - rst #08 ;печать сообщения - call x2FED ;печать пробелов до правого края окна -; чтение конфигурационного сектора - ld hl,xDB69 - push hl - ld bc,#0105 - ld de,#000F ;trk 0, sec #0F - rst #30 - dw rom7_x0229 ;R8DOS #05(5) чтение группы секторов - db #07 - pop hl - ret c ;ошибка чтения - ld a,"A" - cpi - ret nz - ld a,"M" - cpi - ret nz - jp (hl) ;установка настроек из конфигурационного сектора - -;АДРЕС: #1101 редактирование дампа памяти в окне монитора -x1101 rst #30 - dw rom5_x2278 ;редактирование дампа памяти в окне монитора - db #05 - xor a - ret - -;АДРЕС: #1107 таблица мнемоник -x1107 db #5C,#01 ;#00 ;#30 LD IXH - db #5C,#02 ;#30 LD IXL - db #5C,#03 ;#30 LD IYH - db #5C,#04 ;#30 LD IYL - db #53,#15 ;#27 JP Z - db #53,#14 ;#27 JP NZ - db #53,#0D ;#27 JP C - db #53,#16 ;#27 JP NC - db #53,#17 ;#08 ;#27 JP M - db #53,#1A ;#27 JP P - db #53,#19 ;#27 JP PE - db #53,#18 ;#27 JP PO - db #53,#22 ;#27 JP (HL) - db #53,#23 ;#27 JP (IX) - db #53,#24 ;#27 JP (IY) - db #54,#15 ;#28 JR Z - db #54,#14 ;#10 ;#28 JR NZ - db #54,#0D ;#28 JR C - db #54,#16 ;#28 JR NC - db #55,#15 ;#29 CALL Z - db #55,#14 ;#29 CALL NZ - db #55,#0D ;#29 CALL C - db #55,#16 ;#29 CALL NC - db #55,#17 ;#29 CALL M - db #55,#1A ;#18 ;#29 CALL P - db #55,#19 ;#29 CALL PE - db #55,#18 ;#29 CALL PO - db #56,#0B ;#2A ADC A - db #56,#07 ;#2A ADC HL - db #57,#0B ;#2B ADD A - db #57,#07 ;#2B ADD HL - db #57,#12 ;#2B ADD IX - db #57,#13 ;#20 ;#2B ADD IY - db #58,#0B ;#2C SBC A - db #58,#07 ;#2C SBC HL - db #59,#0B ;#2D IN A - db #59,#0C ;#2D IN B - db #59,#0D ;#2D IN C - db #59,#0E ;#2D IN D - db #59,#0F ;#2D IN E - db #59,#10 ;#28 ;#2D IN H - db #59,#11 ;#2D IN L - db #5A,#26 ;#2E OUT (C) - db #5A,#2B ;#2E OUT ( - db #5B,#06 ;#2C ;#2F EX DE - db #5B,#0A ;#2F EX AF - db #5B,#25 ;#2F EX (SP) - db #5C,#20 ;#30 LD (BC) - db #5C,#21 ;#30 ;#30 LD (DE) - db #5C,#22 ;#30 LD (HL) - db #5C,#29 ;#30 LD (IY+ - db #5C,#2A ;#30 LD (IY- - db #5C,#27 ;#30 LD (IX+ - db #5C,#28 ;#30 LD (IX- - db #5C,#2B ;#30 LD ( - db #5C,#0B ;#30 LD A - db #5C,#0C ;#38 ;#30 LD B - db #5C,#0D ;#30 LD C - db #5C,#0E ;#30 LD D - db #5C,#0F ;#30 LD E - db #5C,#10 ;#30 LD H - db #5C,#11 ;#30 LD L - db #5C,#05 ;#30 LD BC - db #5C,#06 ;#30 LD DE - db #5C,#07 ;#40 ;#30 LD HL - db #5C,#13 ;#30 LD IY - db #5C,#12 ;#30 LD IX - db #5C,#1B ;#30 LD I - db #5C,#1C ;#30 LD R - db #5C,#08 ;#30 LD SP - db #59,#22 ;#46 ;#2D IN (HL) - db #00 - -;АДРЕС: #1196 операнды/флаги ассемблера -x1196 dc "IXH" ;#00 - dc "IXL" - dc "IYH" - dc "IYL" - dc "BC" - dc "DE" - dc "HL" - dc "SP" - dc "AF'" ;#08 - dc "AF" - dc "A" - dc "B" - dc "C" - dc "D" - dc "E" - dc "H" - dc "L" ;#10 - dc "IX" - dc "IY" - dc "NZ" - dc "Z" - dc "NC" - dc "M" - dc "PO" - dc "PE" ;#18 - dc "P" - dc "I" - dc "R" - dc "F" - db #80 - db #80 - dc "(BC)" - dc "(DE)" ;#20 - dc "(HL)" - dc "(IX)" - dc "(IY)" - dc "(SP)" - dc "(C)" - dc "(IX+" - dc "(IX-" - dc "(IY+" ;#28 - dc "(IY-" - dc "(" ;#2A - db #00 ;#2B - -;АДРЕС: #11F7 мнемоники ассемблера -x11F7 dc "CCF" ;#00 / #2C - dc "CPL" - dc "DAA" - dc "DI" - dc "EI" - dc "EXX" - dc "HALT" - dc "NOP" - dc "RLA" ;#08 / #34 - dc "RLCA" - dc "RRA" - dc "RRCA" - dc "SCF" - dc "LDIR" - dc "LDDR" - dc "CPIR" - dc "CPDR" ;#10 / #3C - dc "INIR" - dc "INDR" - dc "OTIR" - dc "OTDR" - dc "LDI" - dc "LDD" - dc "CPI" - dc "CPD" ;#18 / #44 - dc "INI" - dc "IND" - dc "OUTI" - dc "OUTD" - dc "RLD" - dc "RRD" - dc "RETI" - dc "RETN" ;#20 / #4C - dc "NEG" - db #80 - db #80 - db #80 - dc "DEC" - dc "INC" - dc "JP" - dc "JR" ;#28 / #54 - dc "CALL" - dc "ADC" - dc "ADD" - dc "SBC" - dc "IN" - dc "OUT" - dc "EX" - dc "LD" ;#30 / #5C - dc "ORG" - dc "AND" - dc "OR" - dc "XOR" - dc "SUB" - dc "CP" - dc "PUSH" - dc "POP" ;#38 / #64 - dc "DJNZ" - dc "RET" - dc "BIT" - dc "SET" - dc "RES" - dc "RLC" - dc "RL" - dc "RRC" ;#40 / #6C - dc "RR" - dc "SLA" - dc "SRA" - dc "SRL" - dc "IM" - dc "RST" - dc "DB" - dc "SLI" ;#48 / #74 - db #00 - -;АДРЕС: #12D2 таблица для формирования команд дизасма -x12D2 db %00000111,%00000001 ;#01 - dw x135E - db %00111000,%00000001 ;#02 - dw x135E - db %00111000,%00000001 ;#03 - dw x1366 - db %00110000,%00000001 ;#04 - dw x136E - db %00110000,%00000001 ;#05 - dw x1372 - db %00111000,%00000001 ;#06 - dw x1376 - db %00111000,%00000001 ;#07 - dw x137E - db %00111000,%00000001 ;#08 - dw x1386 - db %11000000,%00000010 ;#09 - dw x138E - db %00111000,%00000001 ;#0A - dw x1396 - db %00111000,%00000001 ;#0B - dw x139E - db %00001111,%00000010 ;#0C - dw x13A6 - db %00111000,%00000010 ;#0D - dw x13C6 - db %00111000,%00000001 ;#0E - dw x13D6 - db %00110000,%00000001 ;#0F - dw x13DE - db %00110000,%00000010 ;#10 - dw x13E2 - db %00110000,%00000010 ;#11 - dw x13EA - db %00001111,%00000010 ;#12 - dw x13F2 - db %00111000,%00000010 ;#13 - dw x1412 - db %00110000,%00000010 ;#14 - dw x1422 - db %00110000,%00000010 ;#15 - dw x142A - db %11000000,%00000010 ;#16 - dw x1432 - db %00111000,%00000001 ;#17 - dw x143A - db %11100000,%00000001 ;#18 - dw x1442 - db %00001111,%00000010 ;#19 - dw x144A - db %00000111,%00000001 ;#1A - dw x146A - db %00111000,%00000001 ;#1B - dw x1472 - db %00111000,%00000001 ;#1C - dw x147A - db %00111000,%00000001 ;#1D - dw x1482 - db %00111000,%00000001 ;#1E - dw x148A - db %00111000,%00000010 ;#1F - dw x1492 - db %00011000,%00000001 ;#20 - dw x14A2 - db %00011000,%00000001 ;#21 - dw x14A6 - db %00011000,%00000001 ;#22 - dw x14AA - db %00011000,%00000001 ;#23 - dw x14AE - -x135E db #0C,#0D,#0E,#0F,#10,#11,#22,#0B -x1366 db #0C,#0D,#0E,#0F,#10,#11,#EA,#0B -x136E db #05,#06,#07,#08 -x1372 db #05,#06,#07,#0A -x1376 db #14,#15,#16,#0D,#18,#19,#1A,#17 -x137E db #83,#82,#85,#84,#89,#88,#87,#86 -x1386 db #92,#91,#94,#93,#98,#97,#96,#95 -x138E db #D2,#00,#D0,#C7,#D1,#C7,#D8,#00 -x1396 db #B6,#B7,#B8,#B9,#BA,#BB,#AF,#B5 -x139E db #9B,#99,#61,#9F,#5E,#60,#5F,#62 -x13A6 db #D3,#00,#D5,#EB,#D6,#00,#52,#CA - db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 - db #D3,#00,#9C,#CA,#D7,#00,#51,#CA - db #52,#C8,#51,#C8,#D0,#EC,#D4,#00 -x13C6 db #33,#00,#AB,#09,#65,#ED,#54,#ED - db #8E,#ED,#8D,#ED,#90,#ED,#8F,#ED -x13D6 db #35,#37,#34,#36,#2E,#2D,#38,#2C -x13DE db #BC,#BD,#BE,#C3 -x13E2 db #AD,#0B,#AE,#0B,#B4,#07,#B4,#0B -x13EA db #B5,#20,#B5,#21,#BE,#2B,#B5,#2B -x13F2 db #66,#CC,#64,#CB,#CD,#EB,#D9,#00 - db #CE,#EB,#63,#CB,#D1,#EC,#72,#00 - db #66,#CC,#DA,#00,#CD,#EB,#D9,#00 - db #CE,#EB,#DB,#00,#D1,#EC,#72,#00 -x1412 db #53,#EB,#EA,#00,#A9,#0B,#A1,#2B - db #AC,#07,#EA,#00,#2F,#00,#30,#00 -x1422 db #66,#00,#31,#00,#8A,#00,#C3,#07 -x142A db #55,#EB,#EA,#00,#EA,#00,#EA,#00 -x1432 db #DD,#C7,#67,#C7,#69,#C7,#68,#C7 -x143A db #6A,#6C,#6B,#6D,#6E,#6F,#74,#70 -x1442 db #EA,#EA,#DF,#DF,#EA,#E0,#EA,#EA -x144A db #E1,#26,#A8,#C8,#A0,#CA,#B4,#CA - db #E2,#00,#E3,#00,#E4,#00,#E5,#00 - db #E1,#26,#A8,#C8,#9A,#CA,#D5,#2B - db #E2,#00,#E3,#00,#E4,#00,#E5,#00 -x146A db #E6,#E7,#E8,#E9,#EA,#EA,#EA,#EA -x1472 db #A2,#A3,#A4,#A5,#A6,#A7,#C4,#A1 -x147A db #4D,#4E,#4E,#4E,#4E,#4E,#4E,#4E -x1482 db #4C,#4B,#4F,#4F,#4F,#4F,#4F,#4F -x148A db #71,#71,#71,#71,#71,#71,#71,#71 -x1492 db #C1,#0B,#C2,#0B,#B5,#1B,#B5,#1C - db #4A,#00,#49,#00,#50,#00,#50,#00 -x14A2 db #41,#42,#39,#3A -x14A6 db #43,#44,#3B,#3C -x14AA db #45,#46,#3D,#3E -x14AE db #47,#48,#3F,#40 - -;АДРЕС: #14B2 таблицы для формирования команд дизасма -x14B2 db #4E,#74,#BB,#BA,#11,#10,#31,#AB - db #18,#19,#1A,#17,#16,#0D,#14,#15 - db #66,#4C,#4B,#07,#BE,#8A,#9C,#22 - db #AF -x14CB db #71,#72,#67,#68,#69,#2B,#B4,#A9 - db #EC,#EB,#ED,#B2,#27,#9D,#8B,#C0 - db #12,#B0,#29,#9E,#8C,#BF,#13 -x14E2 db #49,#4A,#B4,#AE,#AD,#AF,#2B,#21 - db #20,#22 -x14EC db #52,#51,#6A,#6C,#6B,#6D,#6E,#6F - db #70,#74 - -;АДРЕС: #14F6 проверка значения аккумулятора -;вых: cy=1 -> a<#7E или a>#C4 -x14F6 cp #7E - ret c - cp #C5 - ccf - ret - -;АДРЕС: #14FD проверка значения аккумулятора -;вых: cy=1 -> a<#2C или a>#74 -x14FD cp #2C - ret c - cp #75 - ccf - ret - -;АДРЕС: #1504 проверка значения аккумулятора -;вых: cy=1 -> a<#2C или a>#C4 -x1504 cp #2C - ret c - cp #C5 - ccf - ret - -;АДРЕС: #150B проверка значения аккумулятора -;вых: cy=1 -> a<#01 или a>#2B -x150B cp #01 - ret c - cp #2C - ccf - ret - -;АДРЕС: #1512 печать команды ассемблера -;вх: hl - адрес строки дизассемблированной команды -x1512 res 6,(iy+#0E) ;запятая не напечатана - call x2B10 ;печать пробела - ld a,(hl) - call x14F6 ;cy=1 -> a<#7E или a>#C4 - jr c,x1538 -;печать мнемоники из таблицы x1107 - push hl ;a=[#7E..#C4] -> a=a-#7E =[#00..#46] из таблицы x1107 - ld hl,x1107 - sub #7E - add a,a - ld e,a - ld d,#00 - add hl,de - ld a,(hl) ;мнемоника (номер сообщения) - call x1570 ;печать мнемоники ассемблера с пробелом на конце - ld a,(hl) ;начало операнда команды - and #7F - pop hl -;печать первого операнда - inc hl - call x157F ;печать операнда/числа команды ассемблера - jr x1543 -x1538 call x14FD ;cy=1 -> a<#2C или a>#74 - jr c,x1548 ;+0 =[#00..#2C][#74..#7D][#C5..#FF] - call x1570 ;мнемоника без операндов -x1540 call x1599 ;печать операнда/числа -x1543 ld a,(hl) - call x1504 ;cy=1 -> a<#2C или a>#C4 - ret nc ;a=[#2C..#C4] -x1548 cp #F1 - ret z - cp #F7 - ret z - cp #EE - jr nz,x1561 -;печать комментария (для db #nn ;BAD) - call x2B10 ;печать пробела - ld a,";" - rst #10 - inc hl -x1559 ld a,(hl) - inc hl - cp #F0 - ret z - rst #10 - jr x1559 -;печать зяпятой, если еще не напечатана -x1561 bit 6,(iy+#0E) - set 6,(iy+#0E) - jr nz,x1540 - ld a,"," - rst #10 - jr x1540 - -;АДРЕС: #1570 печать мнемоники ассемблера с пробелом на конце -;вх: a - номер сообщения с мнемоникой =[#2C..#74] -;вых: hl=hl+1 -x1570 ld c,(iy+#06) - sub #2C - ld de,x11F7 - call x15FC ;печать сообщения по номеру в A, не менее заданной длины в С - inc hl - jp x2B10 ;печать пробела - -;АДРЕС: #157F печать операнда/числа команды ассемблера -;вх: a - номер операнда/числа команды ассемблера -;вых: a - номер следующего операнда/числа команды ассемблера -x157F call x150B ;cy=1 -> a<#01 или a>#2B - jr c,x159D -;печать операнда a=[#01..#2B] из списка x1196 - push af - sub #01 - ld de,x1196 - call x15FA ;печать сообщения по номеру в A - pop af - cp #27 ;a=[#01..#26] - jr c,x15B1 ;нет смещения для команд (ix/iy+nn), -;печатам число с закрывающей скобкой - call x1599 ;a=[#27..#2B] - ld a,")" - rst #10 - ret -;печать операнда -x1599 ld a,(hl) - inc hl - jr x157F -;печать числа (a<#01 или a>#2B) -x159D cp #F8 - jr c,x15A6 ;a=[#00,#2C..#F7] - call x1626 ;a=[#F8..#FF] печать числа из (hl) (dec/hex) с префиксом - jr x15B1 -;печать сообщения (a=[#00,#2C..#F7]) -x15A6 cp #EC - jr nz,x15AF - call x15DB ;a=#EC печать сообщения из hl - jr x15B1 -;выход -x15AF dec hl - ret -x15B1 ld a,(hl) - ret - -;АДРЕС: #15B3 печать сообщения из hl -;вх: hl - адрес начала сообщения -; b - длина сообщения -; -x15B3 ld a,(hl) - rst #10 - inc hl - djnz x15B3 - ret - -;АДРЕС: #15B9 печать сообщения из hl с заменой непечатных символов на ? -;вх: hl - адрес начала сообщения -; b - длина сообщения -; -x15B9 ld a,(hl) - cp #20 - jr nc,x15C0 - ld a,"?" -x15C0 call x2B0B ;печать символа - inc hl - djnz x15B9 - ret - -;АДРЕС: #15C7 печать сообщения из hl -;вх: hl - адрес начала сообщения -; -x15C7 ld a,(hl) - call x2B0B ;печать символа - inc hl - rlca - ret c - jr x15C7 - -;АДРЕС: #15D0 печать сообщения по номеру (на экран/в буфер) -;вх: a,e - номер сообщения -; hl - адрес начала блока сообщений -; -x15D0 inc a ;поиск сообщения по номеру -x15D1 dec a - jr z,x15DB -x15D4 bit 7,(hl) - inc hl - jr z,x15D4 - jr x15D1 - -;АДРЕС: #15DB печать сообщения из hl -;вх: hl - адрес сообщения -; -x15DB ld b,#01 - -;АДРЕС: #15DD печать сообщения не менее заданной длины -;вх: b - минимальная длина сообщения (дополняется пробелами) -; hl - адрес сообщения -; -x15DD or a -x15DE ld a,(hl) - bit 7,a - call x2B0B ;печать символа со сбросом 7го бита (rst #10) - inc hl - jr z,x15EC - ret c - ld a," " ;напечатаем пробел - jr x15F6 -x15EC djnz x15DE - scf - ld b,#00 - jr x15DE - -;АДРЕС: #15F3 печать нескольких провелов (в B) -;вх: b - количество пробелов -; -x15F3 ld a," " -x15F5 rst #10 -x15F6 djnz x15F5 - or a - ret - -;АДРЕС: #15FA печать сообщения по номеру в A -;вх: de - адрес блока сообщений -; a - номер сообщения -; -x15FA ld c,#01 - -;АДРЕС: #15FC печать сообщения по номеру в A, не менее заданной длины в С -;вх: c - минимальная длина сообщения (дополняется пробелами) -; de - адрес блока сообщений -; a - номер сообщения -; -x15FC ex de,hl - call x1606 ;поиск сообщения по номеру в A - ld b,c - call x15DD - ex de,hl - ret -;поиск сообщения по номеру в A -x1606 or a - ret z - ld b,a -x1609 bit 7,(hl) - inc hl - jp z,x1609 - djnz x1609 - ret - -;АДРЕС: #1612 печать числа в hl (dec/hex) с префиксом -;вх: hl - число -; -x1612 ld c,l - ld b,h - -;АДРЕС: #1614 печать числа в bc (dec/hex) с префиксом -;вх: bc - число -; -x1614 push de - bit 0,(iy+5) - ld de,#0A00 ;десятичное, без префикса - jr nz,x1621 - ld de,#1023 ;шестнадцатиричное, префикс # -x1621 call x162C ;печать числа с префиксом - pop de - ret - -;АДРЕС: #1626 печать числа из (hl) (dec/hex) с префиксом -;вх: 0,a =0/1 двухбайтное/однобайтное число -; 1-2,a - система счисления (bin/oct/dec/hex) -; hl - адрес ячейки с числом -; -x1626 call x1638 ;загрузка числа в bc - -;АДРЕС: #1629 печать числа в bc (bin/oct/dec/hex) с префиксом -;вх: bc - число -; 1-2,a - система счисления -; -x1629 call x1642 ;установка префикса - -;АДРЕС: #162C печать числа в заданной системе счисления -; bc - число -; d - делитель для выделения разряда числа -; e - код префикса -x162C ld a,d - ld (xE024),a - ld a,e - rst #10 ;печать префикса - ld (iy+7),#01 - jr x1673 ;печать числа -;загрузка числа в bc -x1638 ld b,#00 - ld c,(hl) - inc hl - bit 0,a - ret nz - ld b,(hl) - inc hl - ret -;установка префикса для системы счисления -x1642 and %00000110 - ld de,#0225 ;bin - cp #02 - ret c - ld de,#0840 ;oct - ret z - cp #06 - ld de,#0A00 ;dec - ret c - ld de,#1023 ;hex - ret - -;АДРЕС: #1658 печать числа A с предварительным пробелом -;вх: a - число -; b - минимальная длина -; -x1658 ld c,a - ld a,b - ld b,#00 - jr x166B - -;АДРЕС: #165E печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом -;вх: bc - число -; -x165E - scf - jr x1662 - -;АДРЕС: #1661 печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;вх: bc - число -; -x1661 or a -x1662 ld a," " ;cy=1/0 минимальная длина 1/5 - rst #10 ;печать пробела - ld a,#01 - jr c,x166B - -;АДРЕС: #1669 печать десятичного числа bc [0..65535] с ведущими пробелами -;вх: bc - число -; (xE3BC) адрес строки -; -x1669 ld a,#05 -x166B ld (iy+#07),a - -;АДРЕС: #166E печать десятичного числа bc [0..65535] с ведущими пробелами -;вх: bc - число -; (xE3BC) адрес строки -x166E ld de,#000A - jr x1677 - -;АДРЕС: #1673 печать числа bc (на экран/в буфер) -;вх: bc - число -; (xE024) делитель для выделения разрядов -; (xE01B) количестов разрядов -; (xE3BC) адрес строки -; -x1673 ld de,(xE024) ;делитель для выделения разрядов - -;АДРЕС: #1677 печать числа bc (на экран/в буфер) -;вх: bc - число -; de - делитель для выделения разрядов -; (xE01B) количестов разрядов -; (xE3BC) адрес строки -; -x1677 push hl - call x1681 ;преобразование числа в строку - pop hl - ret -x167D ld a,b - or c - jr z,x169E -x1681 dec (iy+7) ;преобразование числа в строку - ld a,b - call x16AA ;деление bc=ac/de - push hl ;hl остаток от деления - call x167D - pop hl - ld a,l - add a,#90 - daa - adc a,#40 - daa - and #7F - cp #20 - jr nc,x169C - ld a," " -x169C rst #10 - ret -x169E dec (iy+7) - ret m - call x167D - ld a,(iy+8) - rst #10 - ret - -;АДРЕС: #16AA деление bc=ac/de -;вых: bc=ac/de -; hl остаток от деления -; -x16AA ld hl,#0000 - ld b,#10 -x16AF rl c - rla - adc hl,hl - sbc hl,de - ccf - jr nc,x16C8 -x16B9 djnz x16AF - rl c - rla - ld b,a - ret -x16C0 rl c - rla - adc hl,hl - add hl,de - jr c,x16B9 -x16C8 djnz x16C0 - rl c - rla - add hl,de - ld b,a - ret - -;АДРЕС: #16D0 печать строки (rst #20) -;вх: ix - адрес дескриптора окна -; -x16D0 ex (sp),hl - push af -x16D2 ld a,(hl) - call x2B0B ;печать символа со сбросом 7го бита (rst #10) - and #80 - inc hl - jr z,x16D2 - pop af - ex (sp),hl - ret - -;АДРЕС: #16DE печать числа hl=[#0000..#FFFF] -;вх: hl - число -; -x16DE ld a,h - call x16E3 - ld a,l - -;АДРЕС: #16E3 печать числа [#00..#FF] -;вх: a - число -; -x16E3 push af - rlca - rlca - rlca - rlca - call x16EC - pop af - -;АДРЕС: #16EC печать числа [#0..#F] -;вх: 0-3,a - число -; -x16EC and #0F - add a,#90 - daa - adc a,#40 - daa - rst #10 - ret - -;коррекция регистра r пользователя -x16F6 ld l,(iy+#02) ;длина команды для дизасма в байтах - jr x1744 - -;коррекция регистра r пользователя -x16FB ld l,#01 - jr x1744 - -;АДРЕС: #16FF исполнение зарезервированных слов анализатора st0-st9 -x16FF bit 4,(iy+#14) - ret z ;анализатор выключен - ld hl,xE9A9 ;таблица адресов слов st0-st9 анализатора - xor a -x1708 push af - ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - ld a,d - or e - call nz,x1DE5 ;выполнение слова анализатора - pop hl - pop af - inc a - cp #0A - jr nz,x1708 - ret - -;АДРЕС: #171B выполнение(трассировка) сформированной команды в отладчике -x171B ld hl,(xDD6B) ;pc программы пользователя - push hl - ld hl,(xE11A) ;адрес начала сормированной команды для трассировки - ld (xDD6B),hl ;новый PC - ld hl,x173A ;адрес возврата - push hl - ld (xE38D),sp ;сохраним стэк - ld hl,xE026 - set 5,(hl) ;выполняется трассировка из отладчика - bit 3,(hl) - call nz,x0581 ;восстановление экрана в странице 5 - jp x0143 ;выход из монитора и выполнение команды -x173A res 5,(iy+#12) - pop hl - ld (xDD6B),hl ;восстановим PC пользователя -;коррекция регистра r пользователя -x1742 ld l,#FF -x1744 ld a,(xDD83+#01) ;коррекция регистра r пользователя - ld h,a - add a,l - rlca - sla h - rra - ld (xDD83+#01),a - ret - -;трассировка команд с условием перехода jr cc -;вых: cy=1 условие выполнено -x1751 ld hl,(xE11A) - inc hl - inc hl - ld (hl),#02 ;jr cc,$+4 - jr x1782 - -;быстрая трассировка команды call -x175A ld hl,(xDDAA) - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - inc hl - ld (xDDAA),hl - ld hl,(xE11A) - inc hl - inc hl - ld (hl),e - inc hl - ld (hl),d - inc hl - ld (hl),#CF ;rst #08 - jr x171B ;выполнение(трассировка) сформированной команды в отладчике - -;трассировка команд с условием перехода jp cc/call cc/ret cc -;вых: cy=1 условие выполнено -x1773 ld hl,(xE11A) - inc hl - inc hl - push hl ;установка команды: jp cc,$+5 - ld de,#0004 - add hl,de - ex de,hl - pop hl - ld (hl),e - inc hl - ld (hl),d -x1782 inc hl - ld (hl),#B7 ;or a - inc hl - ld (hl),#CF ;rst #08 - inc hl - ld (hl),#37 ;scf - inc hl - ld (hl),#CF ;rst #08 - ld a,(xDD7F) ;флаги пользователя - push af - call x171B ;выполнение(трассировка) сформированной команды в отладчике - call x1742 ;коррекция регистра r пользователя - ld a,(xDD7F) ;регистр f - rrca ;флаг CY пользователя - pop hl - ld a,h - ld (xDD7F),a ;восстановим флаги - ret - -;exx регистров пользователя -x17A2 ld hl,xDD73 ;регистр hl - ld de,xDD79 ;регистр hl' - ld b,#06 -x17AA ld a,(de) - ld c,(hl) - ex de,hl - ld (de),a - ld (hl),c - inc de - inc hl - djnz x17AA - ret - -;ex af,af' регистров пользователя -x17B4 ld hl,xDD7F ;регистр af - ld de,xDD81 ;регистр af' - ld b,#02 - jr x17AA - -;трассировка команды rst #08 -x17BE ld de,#0008 - ld hl,(xDDD0) ;адрес следующей команды дизасма - or a - sbc hl,de - jr nz,x1807 ;формируем команду для исполнения - ld hl,(xDD6B) ;pc программы пользователя - ld e,#FF - jp x01F5 ;вызов обработчика ошибок Basic 48k - -;трассировка команды halt -x17D1 ld a,(xDD83) ;флаг IFFF2 - bit 2,a - jr nz,x17EA ;прерываения разрешены - ld a,#AB ;di:halt -> сообщение: finish program - jp x0AE0 ;печать/обновление окна отладчика - -;команды: ex af,af' и exx -x17DD ld a,(xDDB4) ;1й байт команды дизассемблера без префиксов - cp #08 ;команда ex af,af' - push af - call z,x17B4 ;ex af,af' регистров пользователя - pop af - call nz,x17A2 ;exx регистров пользователя -x17EA call x16FB ;коррекция регистра r пользователя - jp x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - -;АДРЕС: #17F0 выполнение одной команды по адресу в PC -x17F0 ld hl,(xDD6B) ;pc программы пользователя - call x191E ;проверка попадания адреса на адреса #3D00-#3DFF - jp nc,x18F1 ;возможна только быстрая трассировка, pc пользователя в пределах #3D00..#3DFF - call x2F96 ;анализ команды ассемблера по адресу в hl - ld a,(xDDB7) - cp #32 ;это halt - jr z,x17D1 - cp #72 ;это rst #08 - jr z,x17BE - -;формируем команду для исполнения -; сохраним память в буфере -x1807 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - push hl - ld de,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма - ld bc,#0008 - ldir - pop de -; установим режим прерываний - ld a,(xDD83) ;флаг IFFF2 - bit 2,a - ld a,#F3 ;di - jr z,x181F - ld a,#FB ;ei -x181F ld (de),a - inc de -; копируем команду в буфер для исполнения - ld hl,(xDD6B) ;pc программы пользователя - ld c,(iy+#02) ;длина команды в байтах - ld b,#00 - call x0753 ;сохранение области памяти в ram 8 -; ставим rst #08 для возврата - ld a,#CF ;rst #08 - ld (de),a - ld a,(iy+#03) - or a - jp z,x18BA ;выполнение команды при трассировке -;для команды exx/ex af,af' - bit 7,a - jr nz,x17DD ;команды: ex af,af' и exx -;для команды ret/ret cc - bit 1,a - jr z,x185A ;это не ret - bit 5,a - jr z,x1851 ;это команда ret -; команда ret cc - ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - inc hl ;поправка на di/ei - ld a,(hl) - and %00111000 - or %11000010 - ld (hl),a - call x1773 ;трассировка команд с условием перехода jp cc/jr cc/call cc/ret cc - jr nc,x1861 ;условие не выполнено -x1851 call nc,x16F6 ;коррекция регистра r пользователя - call x3640 ;pop de со стэка пользователя - ex de,hl - jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;для команд jr cc -x185A bit 2,a - jr z,x1865 - call x1751 ;трассировка команд с условием перехода jr cc -x1861 jr nc,x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - jr x18A7 ;условие выполнено -;для команд call/call cc -x1865 bit 0,a - jr z,x1894 - bit 7,(iy+#16) - jr nz,x18D5 ;выполнение команды в отладчике с быстрым выполнением подпрограмм -; пошаговая трассировка - call x190F - jr c,x18DA ;только быстрая трассировка -x1874 ld hl,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - inc hl - ld a,(hl) - or a - bit 0,a - jr nz,x1888 ;это call - and %00111000 ;это call cc - or %11000010 - ld (hl),a - call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc - jr nc,x18BD ;условие не выполнено -; установка регистров и стэка для вызова команды call -x1888 call nc,x16FB ;коррекция регистра r пользователя - ld de,(xDDAA) ;текущий адрес команды ассемблера для дизасма - call x3A14 ;запись de на стэк пользователя - jr x18A7 -;для команд jp/jp cc -x1894 bit 3,a - jr z,x18AC - call x1773 ;трассировка команд с условием перехода jp cc/call cc/ret cc - jr nc,x18BD ;условие не выполнено - call x190F ;проверка возможности пошаговой трассировки команд call - push af - call c,x1742 ;коррекция регистра r пользователя - pop af - jr c,x18F4 ;только быстрая трассировка -x18A7 ld hl,(xDDD0) ;адрес следующей команды дизасма - jr x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;для пустых команд??? -x18AC bit 4,a - jr z,x18B5 - call x16FB ;коррекция регистра r пользователя - jr x18A7 -;неизвестная команда -x18B5 ld a,#AA - jp x0AE0 ;печать/обновление окна отладчика - -;выполнение команды при трассировке -x18BA call x171B ;выполнение(трассировка) сформированной команды в отладчике -x18BD ld hl,(xDDAA) ;текущий адрес команды ассемблера для дизасма - -;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -;вх: hl - PC пользователя -x18C0 ld (xDD6B),hl ;новый PC пользователя - push hl - ld hl,xE39A ;буфер для сохранения памяти пользователя при трассировке команды дизасма - ld de,(xE11A) ;адрес памяти(8 байт) начала сормированной команды для трассировки - ld bc,#0008 - ldir - call x16FF ;исполнение зарезервированных слов анализатора st0-st9 - pop hl - ret - -;выполнение команды в отладчике с быстрым выполнением подпрограмм -; вызов call -x18D5 call x191B ;проверка попадания адреса команды на адреса #3D00-#3DFF - jr nc,x1874 ;вызов невозможен, это Tr-Dos -x18DA ld hl,(xDDD0) - ld de,#0028 - or a - sbc hl,de - jr nz,x18BA ;выполнение команды при трассировке -; это call #28/rst #28 - bit 4,(iy-#02) - jp nz,x1874 ;это Basic 48k - call x175A ;быстрая трассировка команды call - jr x18BD ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 - -;только быстрая трассировка -;вх: hl - PC программы пользователя -x18F1 ld (xDDD0),hl ;адрес следующей команды дизасма -x18F4 ld hl,(xE11A) - inc hl - ld (hl),#CD ;call #nnnn - inc hl - ld de,(xDDD0) - ld (hl),e - inc hl - ld (hl),d - inc hl - ld (hl),#CF ;rst #08 - call x3640 ;pop de со стэка пользователя - push de - call x171B ;выполнение(трассировка) сформированной команды в отладчике - pop hl - jr x18C0 - -;проверка возможности пошаговой трассировки команд call -;вых: cy=1 возможна только быстрая трассировка -x190F or a - bit 3,(iy+#05) ;Не трассировать (выполнять сразу) подпрограммы, расположенные в ПЗУ - ret z - ld a,(xDDD0+#01) - cp #40 - ret nc ;это не ПЗУ - -;АДРЕС: #191B проверка попадания адреса команды на адреса #3D00-#3DFF -;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos -x191B ld hl,(xDDD0) ;адрес следующей команды дизасма - -;АДРЕС: #191E проверка попадания адреса на адреса #3D00-#3DFF -;вх: hl - pc программы пользователя -;вых: cy=0 pc программы пользователя в памяти #3D00-#3DFF селлектор включения tr-dos -x191E bit 4,(iy-#02) ;4,#7FFD пользователя - scf - ret z ;ПЗУ Basic128 пользователя - ld de,#3D00 - or a - sbc hl,de - add hl,de - ret c - ld de,#3E00 - sbc hl,de - add hl,de - ccf - ret - -;сообщение дизасма для неопознанной команды -x1934 db #73 ;DB - db #FF ;признак числа hex 1 байт - db #00 ;число - db #EE,"BAD",#F0 ;сообщение - -;выход из п/п x197F анализа команды ассемблера -x193C ld (ix+0),#F7 ;признак конца команды - pop ix - ret - -;команда ex de,hl -x1943 ld (ix+0),#AA ;первая часть: ex de - inc ix - ld (ix+0),#07 ;вторая часть: hl -x194D inc ix -x194F ld (iy+2),#01 ;длина команды в байтах - jp x1A78 - -;команда halt -x1956 ld (ix+0),#32 ;номер сообщения мнемоники: halt - ld a,(hl) - or a - jr z,x194D ;если был префикс, команда неизвестна - -;неизвестная команда -x195E ld hl,x1934 ;команда неизвестна - ld de,xDDB7 - ld bc,#0008 - ldir - push de - pop ix - xor a - ld (iy+#01),a ;нет префикса - ld (iy+#04),a - ld (iy+#03),#40 - ld a,(xDDAC) ;код первого байта команды - ld (xDDB7+#02),a ;отобразится в сообщении DB #?? - jr x194F - -;АДРЕС: #197F анализ команды ассемблера -; формирование сообщения для печати дизасма команды -;вых: bc - длина команды ассеблера -x197F push ix -;установка регистров - ld ix,xDDB7 ;буфер сообщения - ld de,(xDDAA) ;адрес команды - ld hl,x193C ;адрес возврата - push hl - ld (xDDCB),sp - bit 4,(iy+#00) - jr z,x199F - call x1DB3 ;поиск чего-то cy=1 найдено - ld b,#F1 - call c,x1D88 - -;обнуление дизасма команды ассемблера -x199F ld e,#09 - ld hl,xE015 ;iy+#01 - xor a - ld d,a ;начальная длина команды =0 - ld (hl),a - ld (xDDCD),a - ld (xE017),a - ld (xE018),a -;проверка наличия префиксов - ld bc,xDDAC ;начало команды - ld a,(bc) - cp #EB - jr z,x1943 ;это ex de,hl - cp #DD ;проверка на префикс #DD - jr nz,x19C2 ;нет префикса - ld (hl),#02 ;префикс #DD - inc bc - inc d ;длина команды - jr x19CA -x19C2 cp #FD ;проверка на префикс #FD - jr nz,x19CA ;нет префикса - ld (hl),#03 ;префикс #FD - inc bc - inc d ;длина команды -x19CA ld a,(bc) - cp #76 ;halt - jr z,x1956 ;это команда halt - cp #CB ;проверка на префикс #CB - jr nz,x19DB ;нет префикса - set 3,(hl) ;префикс #CB - ld e,#16 - inc bc - inc d ;длина команды - jr x19EA -x19DB cp #ED ;проверка на префикс #ED - jr nz,x19EA ;нет префикса - set 2,(hl) ;префикс #ED - bit 1,(hl) - jp nz,x195E ;есть префикс #DD/#FD. неизвестная команда - inc bc - ld e,#18 - inc d ;длина команды -x19EA inc d ;длина команды - ld (iy+#02),d ;длина команды -;копируем команду в буфер без префикса - push de - ld de,xDDB4 ;копируем в буфер команду без префиксов - ld h,b - ld l,c - ld bc,#0003 - ldir - pop de - ld a,(xE015) ;корректировка команды без учета префиксов - and %00001010 - cp %00001010 - jr nz,x1A09 - ld a,(xDDB4+#01) ;два префикса #CB и #DD/#FD - ld (xDDB4),a ;код команды - -;формирование команды дизасма по таблице -x1A09 xor a - push af - push af - ld a,e ;e=#09/#16/#18 -x1A0D add a,a - add a,a - ld b,#00 - ld c,a - ld hl,x12D2-#04 - add hl,bc - ld c,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl - адрес начала таблицы - ld a,(xDDB4) ;код команды без учета префиксов - ld b,#00 - and c -x1A24 inc b - srl c - jr nc,x1A24 - or a -x1A2A dec b - jr z,x1A30 - rrca - jr x1A2A -x1A30 bit 0,d - jr nz,x1A35 - add a,a -x1A35 ld b,#00 - ld c,a - add hl,bc -x1A39 ld a,(hl) - inc hl - dec d - or a - jr z,x1A62 - cp #EA - jp z,x195E ;неизвестная команда - cp #C5 - jr c,x1A94 - cp #EA - jr nc,x1A94 - sub #C6 - cp #17 - jr nz,x1A56 - set 6,(iy+#04) -x1A56 bit 0,d - jr z,x1A0D - push de - push hl - jr x1A0D -x1A5E ld a,d - or a - jr nz,x1A39 -x1A62 pop hl - pop de - ld a,d - or a - jr nz,x1A39 - ld hl,xE015 - bit 1,(hl) - jr z,x1A78 ;нет префикса #DD/#FD - bit 4,(hl) - jr nz,x1A78 - bit 7,(hl) - jp z,x195E ;;неизвестная команда -x1A78 ld bc,(xE016) ;длина команды - ld b,#00 - ld sp,(xDDCB) ;восстановим стэк - ret -x1A83 cp #20 - jr nc,x1AA7 - ld (ix+#00),a - inc ix - set 5,(iy+#01) - ld a,#22 - jr x1AA7 -x1A94 push de - push hl - bit 1,(iy+#01) - jr z,x1AA7 ;нет префикса #DD/#FD - ld hl,xE018 - bit 7,(hl) - jr nz,x1A83 - bit 6,(hl) - jr nz,x1A83 -x1AA7 push af -x1AA8 ld hl,x14B2 - ld bc,#0024 - cpir - ld b,a - jp nz,x1BD1 - ld a,c - cp #1E - jr nc,x1AD5 - cp #1C - jr nc,x1B27 - cp #0B - jp c,x1C5B - cp #14 - ld hl,xE017 - jr nc,x1B2D - cp #11 - jr c,x1B3A - set 1,(hl) - jp x1BD1 -x1AD2 dec b - jr x1B0E -x1AD5 ld hl,xE015 - cp #23 - jr z,x1AD2 - jr c,x1AE9 - cp #2C - jr nc,x1B13 - set 3,(iy+#04) - jp x1BD1 -x1AE9 cp #22 - jr z,x1B0E - bit 1,(hl) - jr z,x1B10 - bit 3,(hl) - jr nz,x1B10 ;есть префикс #СВ - sub #1D - cp #03 - jr nc,x1B23 - bit 7,(hl) - jr nz,x1B10 - bit 5,(iy+#04) - jr nz,x1B10 -x1B05 bit 0,(hl) - jr z,x1B0B ;это префикс #DD - add a,#02 -x1B0B ld b,a - set 4,(hl) -x1B0E set 5,(hl) -x1B10 jp x1BD1 -x1B13 set 5,(hl) - cp #2D - jr nc,x1B1E - ld a,#66 - jp x1AA8 -x1B1E ld b,#33 - jp x1BD1 -x1B23 add a,#7B - jr x1B05 -x1B27 set 7,(iy+#03) ;это ex af,af' либо exx - jr x1B10 -x1B2D bit 1,(hl) - jr z,x1B10 ;нет префикса #DD/#FD - set 5,(hl) - sub #14 - ld (xE032),a - jr x1B10 -x1B3A ld hl,(xDD73) ;регистр hl - ld (xDDCE),hl - cp #0E - jr nz,x1B60 - set 4,(iy+#03) ;это jp (hl) - bit 1,(iy+#01) - jr z,x1B5D ;нет префикса #DD/#FD - ld hl,(xDD6F) ;регистр ix - bit 0,(iy+#01) - jr z,x1B5A - ld hl,(xDD71) ;регистр iy -x1B5A ld (xDDCE),hl -x1B5D ld (xDDD0),hl -x1B60 ld hl,xE015 - ld a,(hl) - bit 1,a - jr z,x1B10 ;нет префикса #DD/#FD - set 7,(hl) - ld e,c - ld hl,x14CB - bit 0,a - ld b,#00 - jr z,x1B78 ;префикс #DD - ld a,c - add a,#06 - ld c,a -x1B78 add hl,bc - ld b,(hl) - ld (ix+#00),b - inc ix - ld a,e - cp #0D - jr nc,x1BD6 - cp #0C - jr nz,x1BA0 - bit 4,(iy+#01) - jr z,x1BA0 - ld a,#01 - and (ix-#02) - add a,#BA - ld (ix-#02),a - res 4,(iy+#01) - res 5,(iy+#01) -x1BA0 inc (iy+#02) - ld a,(xDDAC+#02) - or a - jp p,x1BAF - inc (ix-#01) - neg -x1BAF ld (ix+#00),#FD - inc ix - ld b,a - ld hl,(xDD6F) ;регистр ix - bit 0,(iy+#01) - jr z,x1BC2 ;префикс #DD - ld hl,(xDD71) ;регистр ix -x1BC2 ld de,(xDDAC+#02) - ld d,#00 - bit 7,e - jr z,x1BCD - dec d -x1BCD add hl,de - ld (xDDCE),hl ;адрес перехода при дизасме -x1BD1 ld (ix+#00),b - inc ix -x1BD6 pop af - push af - ld hl,x14E2 - ld bc,#000A - cpir - jr nz,x1C3C - ld a,c - cp #08 - jr nc,x1C45 - and #03 - jr z,x1C00 - dec a - jr z,x1BF6 - dec a - jr z,x1BFB - ld hl,(xDDD0) - jr x1C03 -x1BF6 ld hl,(xDD77) ;регистр bc - jr x1C03 -x1BFB ld hl,(xDD75) ;регистр de - jr x1C03 -x1C00 ld hl,(xDDCE) ;адрес перехода при дизасме -x1C03 ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти - ld a,c - cp #04 - ld b,#02 - jr nc,x1C35 - dec b - cp #03 - jr nz,x1C1B - ld a,(xDDCD) ;код команды дизасма - cp #A1 - jr nz,x1C35 - jr x1C3C -x1C1B or a - jr nz,x1C35 - ld a,(xDDCD) ;код команды дизасма - ld hl,x14EC - ld bc,#000A - cpir - jr z,x1C33 - bit 7,(iy+#04) - ld b,#01 - jr z,x1C35 -x1C33 ld b,#03 -x1C35 ld a,b - or (iy+#04) - ld (iy+#04),a -x1C3C pop af - ld (xDDCD),a ;код команды дизасма - pop hl - pop de - jp x1A5E -x1C45 ld b,#03 - ld hl,(xDD73) ;регистр hl - ld (xDDD2),hl ;адрес на который ссылаются команды работающие с ячейками памяти - jr x1C35 -x1C4F ld (xDDD0),de - ld b,#EC - call x1D88 - jp x1BD6 -x1C5B cp #03 - jr c,x1C64 - ld (ix+#00),b - inc ix -x1C64 ld d,#00 - ld hl,xE017 - cp #01 - jp c,x1D00 - jr z,x1C8E - cp #04 - jr c,x1CC9 - cp #06 - jr c,x1C8E - cp #08 - jr c,x1CE4 - jr z,x1CE8 - cp #0A - jp z,x1D58 - ld a,(xDDB4) ;команда дизассемблера без префиксов - and #38 - set 0,(hl) ;это команда call/call cc - ld e,a - jp x1D44 -x1C8E ld a,(xDDCD) ;код команды дизасма - cp #A1 - jr z,x1CC9 - cp #55 - jr z,x1CBB - cp #53 - jr z,x1CAC - cp #91 - jr nc,x1CB0 - cp #82 - jr c,x1CBD - set 5,(hl) ;это команда ret cc - sub #82 - ld (xE032),a -x1CAC set 3,(hl) ;это команда jp/jp cc - jr x1CBD -x1CB0 cp #99 - jr nc,x1CBD - set 5,(hl) ;это команда ret cc - sub #91 - ld (xE032),a -x1CBB set 0,(hl) ;это команда call/call cc -x1CBD ld de,(xDDB4+#01) - inc (iy+#02) - inc (iy+#02) - jr x1D2C -x1CC9 inc (iy+#02) - ld b,#FF - ld hl,xE015 - bit 1,(hl) - jr z,x1CDE ;нет префикса #DD/#FD - bit 4,(hl) - jr nz,x1CDE - ld a,(xDDB4+#02) - jr x1CE1 -x1CDE ld a,(xDDB4+#01) -x1CE1 ld e,a - jr x1CF7 -x1CE4 set 7,(iy+#04) -x1CE8 ld a,(xDDB4) - set 5,(iy+#04) - and #38 - rrca - rrca - rrca - ld e,a -x1CF5 ld b,#FD -x1CF7 ld (ix+#00),b - inc ix - ld b,e - jp x1BD1 - -;байтовое смещение в команде -x1D00 ld a,(xDDCD) - cp #65 - jr nz,x1D0B - set 2,(iy+#04) -x1D0B sub #8D - jr c,x1D14 - ld (xE032),a - set 5,(hl) -x1D14 inc (iy+#02) - set 2,(hl) - ld a,(xDDB4+#01) ;второй байт команды - ld d,#00 - or a - jp p,x1D23 - dec d -x1D23 ld e,a - ld hl,(xDDAA) ;адрес команды - inc hl - inc hl - add hl,de - ld e,l - ld d,h -x1D2C set 6,(iy+#01) ;байтовое смещение в команде - bit 4,(iy+#00) - jr z,x1D3C - call x1DB3 - jp c,x1C4F -x1D3C ld b,#FC - bit 0,(iy+#05) - jr nz,x1D46 ;число в десятичной -x1D44 ld b,#FE -x1D46 ld (ix+#00),b - inc ix - ld (ix+#00),e - inc ix - ld b,d - ld (xDDD0),de ;адрес следующей команды дизасма - jp x1BD1 - -x1D58 ld e,#00 - ld b,#FC - ld a,(xDDB4) - cp #46 - jr z,x1CF5 - inc e - cp #56 - jr z,x1CF5 - inc e - cp #5E - jr z,x1CF5 - set 5,(iy+#01) - ld e,#00 - cp #4E - jr z,x1D85 - cp #66 - jr z,x1D85 - cp #6E - jr z,x1D85 - inc e - cp #76 - jr z,x1D85 - inc e -x1D85 jp x1CF5 - -x1D88 ld (ix+0),b - ld (ix+1),#4C - inc ix - inc ix - ld c,#04 -x1D95 ld l,#04 - xor a -x1D98 sla e - rl d - rla - dec l - jr nz,x1D98 - add a,#90 - daa - adc a,#40 - daa - ld (ix+0),a - inc ix - dec c - jr nz,x1D95 - set 7,(ix-1) - ret - -;вх: de - данные для поиска (адрес команды для дизасма) -x1DB3 or a - bit 4,(iy+#00) - ret z - ld bc,(xDDD4) ;счетчик - ld hl,(xDDD6) ;адрес чего-то -x1DC0 ld a,b - or c - ret z - ld a,(hl) - inc hl - cp e - jr nz,x1DCC - ld a,(hl) - cp d - scf - ret z -x1DCC inc hl - dec bc - jr x1DC0 - -;АДРЕС: #1DD0 список команд отладчика -x1DD0 dc "$" - dc "FLOAD" - dc "FSAVE" - db #00 -x1DDC dw x1FB0: db %00100000 ;$ (аналог WORD) - dw x1E45: db %00000100 ;FLOAD - dw x1E4F: db %00000100 ;FSAVE - -;АДРЕС: #1DE5 выполнение слова анализатора -;вх: de - адрес слова анализатора -x1DE5 ld hl,(xE11C) ;адрес первого свободного байта программы анализатора -x1DE8 inc hl - ld (xE9D9),hl ;адрес начала стэка анализатора - inc hl - ld (xE9DB),hl ;адрес вершины стэка анализатора (адрес первой свободной ячейки) -;исполнение команды анализатора - ld hl,#0000 - push hl - push de - ex de,hl -x1DF6 ld a,(hl) - or a - inc hl - jr z,x1E04 -x1DFB ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - push de - ex de,hl - jr x1DF6 -;исполнение слова из команды анализатора -x1E04 ld (xE9DD),sp - call x1E0E ;call (hl) - jp x2261 -x1E0E jp (hl) - -;АДРЕС: #1E0F установка кода команды в программу анализатора -;вх: de - адрес программы анализатора -; a - байт программы -;вых: de - адрес программы анализатора +1 (если успешно) -x1E0F push hl - or a - ld hl,xF6C0+#FF - sbc hl,de - jr z,x1E1C - ld (de),a - inc de - pop hl - ret -x1E1C ld a,#2D ;ошибка: insufficient program space - jp x0B06 ;ввод и обработка команды отладчика - -;установка параметров буфера fcb -;вх: a - способ открытия файла -; hl - номер сектора -; de - номер дорожки -;вых: hl=bc вх -; bc - четвертый параметр -x1E21 call x306F ;ix=буфер fcb - ld (ix+#17),a - ld h,e - ld (xE7A9+#0E),hl ;номер первого сектора и дорожки файла - push bc - ld hl,#0000 - ld (xE7A9+#13),hl ;указатель в файле - dec l - ld (ix+#0D),l ;объем файла в секторах =#FF - ld (ix+#1B),l ;максимальный объем файла в секторах =#FF - ld hl,xE8A9 - ld (xE7A9+#15),hl ;адрес буфера dma - pop hl - ld bc,(xDD99+#06) ;размер загружаемого файла (4й параметр) - ret - -;АДРЕС: #1E45 Команда: FLOAD track, sector, start, length -; прямое чтение с диска -;вх: de - номер дорожки -; hl - номер сектора -; bc - адрес загрузки -; a - количество операндов [0..5] -x1E45 ld a,#05 - call x1E21 ;установка параметров буфера fcb - call x30D8 ;чтение файла в память - jr x1E9B ;обработка ошибок и выход в отладчик - -;АДРЕС: #1E4F Команда: FSAVE track, sector, start, length -; прямая запись на диск -;вх: de - номер дорожки -; hl - номер сектора -; bc - адрес загрузки -; a - количество операндов [0..5] -x1E4F ld a,#07 - call x1E21 ;установка параметров буфера fcb - call x3107 ;запись области памяти на диск - jr x1E9B ;обработка ошибок и выход в отладчик - -;АДРЕС: #1E59 открытие файла для чтения/записи программы анализатора -;вх: hl - адрес строки имени файла -; b - способ открытия -;вых: hl - стартовый адрес файла -; bc - длина файла в байтах -x1E59 call x3065 ;установка регистров для загрузки/сохранения - ;hl - адрес строки имени файла - ;ix - адрес буфера создаваемого fcb - ;de - адрес буфера dma =xE8A9 - rst #30 - dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - db #07 - jr c,x1E9E ;ошибка чтения/записи - call x0EBA ;выделение из строки числовых операндов (не более 6) - or a - jr z,x1E6C ;больше нет операндов - ld a,#0B ;ошибка: too many operands - jr x1EA2 ;полное обновление окна отладчика -;открываем файл -x1E6C rst #30 - dw rom7_x11DF ;открыть файл для последующих операций с ним - db #07 - jr c,x1E9E ;ошибка чтения/записи - ld hl,(xE7A9+#09) ;стартовый адрес файла - ret - -;АДРЕС: #1E76 Команда: DEFSave filename -x1E76 bit 3,(iy+#14) - ld a,#2E ;ошибка: program undefined - ret z ;ошибка: программы нет - ld b,#02 ;откроем файлна запись - call x1E59 ;открытие файла для записи программы анализатора - ld hl,(xE11C) ;конец программы - ld bc,xF6C0 ;начало программы - push bc - sbc hl,bc - ld a,#2E ;ошибка: program undefined - jr z,x1EA2 ;нулевая длина - ld b,h - ld c,l - pop hl - call x1ED6 ;запись программы анализатора в файл -x1E95 jr c,x1E9E ;ошибка чтения/записи -;закрываем файл. продолжение работы отладчика -x1E97 rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 -x1E9B jp nc,x0AFB -x1E9E rst #30 - dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа - db #06 -x1EA2 jp x0B06 ;полное обновление окна отладчика - -;АДРЕС: #1EA5 Команда: DEFLoad filename -x1EA5 ld b,#01 ;для чтения - call x1E59 ;открытие файла для чтения - ld de,xF6C0 ;расположение программы анализатора - push de - sbc hl,de - pop hl - ld a,#2E ;сообщение: program undefined - jr nz,x1EA2 ;ошибка: несовпадение адреса загрузки - dec bc - dec bc ;bc - длина файла в байтах -2 - ld a,b - cp #04 - ld a,#2D ;сообщение: insufficient program space - jr nc,x1EA2 ;ошибка: слишком длинная программа - push bc - push bc - push hl - call x1F25 ;Команда: CLear (очистим область программы) - pop hl - pop bc - call x1EFB ;чтение программы анализатора из файла - jr c,x1E95 ;ошибка чтения - pop de ;длина программы - ld hl,xF6C0 - add hl,de - ex de,hl ;de - адрес первого свободного байта в буфере программы - call x1F28 ;установка первого свободного байта адреса начала программы анализатора - jr x1E97 ;закрываем файл. продолжение работы отладчика - -;запись программы анализатора в файл -;вх: hl - адрес буфера программы анализатора -; bc - размер для записи -;вых: cy=1 ошибка записи -x1ED6 ld (xE7A9+#09),hl ;стартовый адрес файла - ld a,#41 ;первый байт сигнатуры - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи - ld a,(x00F1) ;второй байт сигнатуры - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи -x1EE6 ld a,(hl) - call x1EF2 ;запись очередного байта в файл - ret c ;ошибка записи - inc hl - dec bc - ld a,b - or c - jr nz,x1EE6 - ret -;запись очередного байта в файл -x1EF2 push hl - push bc - rst #30 - dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" - db #07 - pop bc - pop hl - ret - -;чтение программы анализатора из файла -;вх: hl - адрес буфера программы анализатора -; bc - размер для загрузки -;вых: cy=1 ошибка чтения -x1EFB call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - cp #41 -x1F01 ld a,#55 ;ошибка: illegal fromat file - jr nz,x1EA2 ;ошибка сигнатуры файла - call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - ld e,a - ld a,(x00F1) - cp e - jr nz,x1F01 -x1F10 call x1F1C ;чтение очередного байта из файла - ret c ;ошибка чтения - ld (hl),a - inc hl - dec bc - ld a,b - or c - jr nz,x1F10 - ret -;чтение очередного байта из файла -x1F1C push hl - push bc - rst #30 - dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - db #07 - pop bc - pop hl - ret - -;АДРЕС: #1F25 Команда: CLear -x1F25 ld de,xF6C0 -x1F28 call x205F ;установка первого свободного байта адреса начала программы анализатора - xor a - call x1E0F ;установка кода команды в программу анализатора - call x1E0F ;установка кода команды в программу анализатора - ld hl,xE9A9 - ld b,#28 ;очистка буфера программы -x1F37 ld (hl),a - inc hl - djnz x1F37 -x1F3B set 3,(iy+#14) ;есть пустая программа - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #1F42 Команда: ANalyser boolean -x1F42 ld hl,xE028 - bit 3,(hl) - ld a,#2E ;сообщение: program undefined - ret z ;программа не задана - ld a,e - and #FE - or d - ld a,#0C ;сообщение: out of range - ret nz - ld a,#81 ;сообщение: enter command - res 4,(hl) ;выключим анализатор - bit 0,e - ret z - set 4,(hl) ;включим анализатор - ret - -;АДРЕС: #1F5B поиск введенного слова в словаре/программе пользователя -;вх: hl - адрес строки с началом слова -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -x1F5B call x0EE6 ;поиск в строке первого печатного символа - push hl -x1F5F call x1F9B ;проверка является ли символ буквой или цифрой - ld a,#2F ;ошибка: illegal word name - jp c,#0B06 ;ввод и обработка команды отладчика - inc hl - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x1F5F ;это не разделитель - pop hl - -;АДРЕС: #1F6E поиск слова по словарю -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -; a - код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) -x1F6E ld de,x23A3 ;начало базовых слов анализатора - call x1F78 ;поиск слова в словаре - ret nz ;слово найдено в словаре -;поиск слова в программе пользователя - ld de,xF6C0 ;программа анализатора - -;поиск слова по словарю -;вых: z - слово в словаре не найдено -; hl - адрес начала введенной строки -; de - не определен -; bc =#0000 -; a=#00 -; nz - слово в словаре найдено -; hl - адрес начала параметра в введенной строке -; de - адрес конца слова в словаре (указывает на #00) -; bc - адрес начала введенной строки -; определение адреса следующего слова -x1F78 ld a,(de) - inc de - ld c,a - ld a,(de) - inc de - ld b,a - or c ;bc - адрес следующего слова - ret z ;конец списка -; сравнение введенного слова сос словом из словаря - push hl ;адрес введенной строки -x1F81 ld a,(de) - and #7F - cp #20 - jr c,x1F92 ;конец названия слова в словаре (слово найдено) - cp (hl) - inc de - inc hl - jr z,x1F81 -x1F8D pop hl -; слово не соответствует введенному, будем проверять следующее слово в словаре - ld e,c - ld d,b - jr x1F78 -; проверяем наличие разделителя после введенного слова -x1F92 call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x1F8D ;это не разделитель, сравниваем со следующим словом в словаре - inc hl - pop bc - or a - ret - -;проверка является ли символ буквой или цифрой -;вх: a - код символа -;вых: cy=1 - этоне буква/цифра -x1F9B cp #30 ;"0" - ret c - cp #3A ;":" - ccf - ret nc - cp #41 ;"A" - ret c - cp #5B ;"Z"+1 - ccf - ret nc - cp #61 ;"a" - ret c - cp #7B ;"z"+1 - ccf - ret - -;АДРЕС: #1FB0 Команда: WORD word[:] program -;вх: hl - адрес начала строки с параметрами команды -x1FB0 call x1F5B ;поиск введенного слова в словаре/программе пользователя - jp nz,x2148 ;слово найдено - -;проверка на совпадение с зарезервированными словами -x1FB6 ld de,(xE11C) ;адрес первого свободного байта программы анализатора - inc de - inc de - push hl - ld bc,xE9A9 ;буфер программы анализатора - ld a,#73 ;"s" - cp (hl) - jr nz,x1FCD - ld a,#74 ;"t" -x1FC7 inc hl - cp (hl) - jr nz,x2001 - jr x1FD9 ;это зарезервированное слово: st?/br? -x1FCD ld bc,xE9BD - ld a,#62 ;"b" - cp (hl) - jr nz,x2001 - ld a,#72 ;"r" - jr x1FC7 -; есть ли цифра после букв -x1FD9 inc hl - ld a,(hl) - sub #30 - jr c,x2001 - cp #0A - jr nc,x2001 - inc hl - push bc ;адрес буфера адресов зарезервированных слов - ld c,a ;номер слова - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x2000 ;таки не принадлежит зарезервированным словам -; задаваемое слово - из зарезервированных слов - sla c - ld b,#00 - pop hl ;адрес буфера адресов зарезервированных слов - add hl,bc - ex (sp),hl - call x2002 ;запись нового слова в программу-анализатор - pop hl ;адрес буфера адресов зарезервированных слов - ld de,(xE9D1) ;адрес начала параметров-слов в программе анализатора - ld (hl),e - inc hl - ld (hl),d - jp x1F3B - -;запись нового слова в программу-анализатор -;вх: de - адрес начала программы анализатора -x2000 pop hl -x2001 pop hl -;установка названия слова-программы анализатора -x2002 ld a,(hl) - or #80 ;первый символ слова - call x1E0F ;установка кода команды в программу анализатора -x2008 inc hl - ld a,(hl) ;очередной символ слова - call x1E0F ;установка кода команды в программу анализатора - call x0D3E ;проверка символа в (hl) #3A/#20/#2C/#3B/#00/#0D (: space , ;) - jr nz,x2008 ;это еще не разделитель - cp #0D -x2014 ld a,#30 ;сообщение: no definition - jp z,x0B06 ;конец строки. есть имя, но нет содержания -x2019 ld a,#01 - dec de - ld (de),a ;признак конца названия слова - ld (xE9D1),de - inc de -;установка слов-параметров программы - inc hl - call x0EE6 ;поиск в строке первого печатного символа - jr z,x2014 ;нет параметров в пограмме. выход -x2028 push de ;адрес в программе анализатора - call x1F6E ;поиск слова по словарю - ld b,a ;код разделителя в строке #3A/#20/#2C/#3B/#00/#0D (: space , ;) - ld a,e - ld c,d ;ca - адрес конца слова в словаре (указывает на #00) - pop de ;адрес программы анализатора - jr z,x2064 ;слова в словаре нет -; установка адреса конца слова в словаре - call x1E0F ;установка кода команды в программу анализатора - ld a,c - call x1E0F ;установка кода команды в программу анализатора -; проверка конца строки - ld a,b - cp #0D - jr z,x2043 ;больше нет слов в параметрах -x203E call x0EE6 ;поиск в строке первого печатного символа - jr nz,x2028 ;слово найдено -; слова-параметры закончились -x2043 ld hl,x225D ;п/п прерывания выполнения слова - ld a,l - call x1E0F ;установка кода команды в программу анализатора - ld a,h - call x1E0F ;установка кода команды в программу анализатора - xor a - call x1E0F ;установка кода команды в программу анализатора - call x1E0F ;установка кода команды в программу анализатора - dec de - dec de ;указывает на маркер конца определяемого слова -;установка свободного адреса в программе анализаторе - ld hl,(xE11C) - ld (hl),e - inc hl - ld (hl),d - ld a,#81 ;сообщение: enter command - -;АДРЕС: #205F установка адреса начала программы анализатора -;вх: de - адрес программы анализатора -x205F ld (xE11C),de - ret - -;если число, записываем п/п обработки числа, если отсутствующее слово, то выход -;вх: de - первый свободный адрес в программе анализатора -; hl - адрес слова-параметра в введенной строке -; bc =#0000 -x2064 push de - call x0DF4 ;преобразование строки в число (!!!при base 0 работает неверно!!!) - ld c,e - ld b,d ;bc - число - pop de - jr z,x2076 ;это число - cp #0D ;!!!ОШИБКА!!! A не может быть =#0D - jr nz,x2073 - ld a,#31 ;сообщение: word not known -x2073 jp x0B06 -; установка в программу п/п обработки числа -x2076 push hl - ld hl,x2340 ;п/п обработки числа в программе анализатора - ld a,l - call x1E0F - ld a,h - call x1E0F - ld a,(xE024) ;делитель для выделения разряда числа - call x1E0F - ld a,c - call x1E0F - ld a,b - call x1E0F - pop hl - jr x203E - -;АДРЕС: #2093 Команда: EDit -;вх: hl - адрес начала строки с параметрами команды -x2093 call x1F5B ;поиск введенного слова в словаре/программе пользователя - ld a,#31 ;ошибка: word not known - ret z ;слово не найдено - dec hl ;следующий адрес в введенной строке (после найденного слова) - call x0EE6 ;поиск в строке первого печатного символа - ld a,#0B ;ошибка: too many operands - ret nz ;выход - ex de,hl - ld a,(hl) - or a - jr z,x20BD ;слово в базовом словаре есть !!!ОШИБКА(убрать???)!!! приводит к зависанию - ld a,#32 ;ошибка: forbidden type word - ret z ;!!!ОШИБКА!!! тут выхода не будет никогда - call x20AE - ld a,#06 ;_Working ... - ret - -;печать слова из словаря пользователя -;вх: hl - адрес конца команды/слова анализатора -x20AE ld de,x20FF ;адрес выхода из п/п - push de - ld de,xDE17 ;буфер для печати - ld (xE3BC),de - ld a,#20 ;" " - ld b,#2B ;"+" - -;слово есть в базовом словаре -x20BD ld (de),a - inc de - djnz x20BD - set 6,(iy+#09) ;чтение данных после управляющего кода - ld a,#24 ;"$" - rst #10 ;печать символа - -;АДРЕС: #20C8 печать редактируемого слова -;вх: hl - адрес конца команды/слова анализатора -;печать названия программы(слова) -x20C8 call x2112 ;поиск начала и печать слова анализатора - ld a,":" - rst #10 -;печать слов программы -x20CE ld a," " - rst #10 - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - push hl - ld hl,x225D ;п/п зхавершения выполнения слова - or a - sbc hl,bc - jr z,x20ED ;это конец программы - ld hl,x2340 ;п/п обработки числа - or a - sbc hl,bc - jr z,x20EF ;это число, а не слово - ld l,c - ld h,b - call x2112 ;поиск начала и печать слова анализатора -x20EA pop hl - jr x20CE ;следующее слово программы -;конец программы -x20ED pop hl - ret -;это число, а не слово -x20EF pop hl - inc hl - ld e,(hl) ;система счисления - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - ld a,e - or a - push hl - jr z,x2126 ;печать однобайтного числа в кавычках -x20FA call x2130 ;печать числа в заданной системе счисления - jr x20EA - -;выход из п/п -x20FF res 6,(iy+#09) - ret - -;АДРЕС: #2104 печать слова анализатора -;вх: hl - адрес слова анализатора -;вых: hl - адрес начала следующего слова -; cy=1 слово напечатано -; cy=0 нет больше слов для печати -x2104 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,e - or d - ret z - rst #20 - db #8D ;перевод строки - call x2117 ;печать сообщения из hl. конец сообщения [#00..#1F] - ex de,hl - ret - -;АДРЕС: #2112 поиск начала и печать команды отладчика/слова анализатора -;вх: hl - адрес конца команды/слова анализатора -;вх: hl - не изменяется -x2112 dec hl - bit 7,(hl) - jr z,x2112 -;печать сообщения из hl. конец сообщения [#00..#1F] -x2117 ld a,(hl) - and #7F - cp #20 - ret c - rst #10 - inc hl - jr x2117 - -;АДРЕС: #2121 чтение ld bc,(hl+1): hl=hl+2 -x2121 inc hl - ld c,(hl) - inc hl - ld b,(hl) - ret - -;печать однобайтного числа в кавычках -x2126 ld a,#22 ;'"' - push af - rst #10 - ld a,c - rst #10 - pop af - rst #10 - jr x20EA - -;печать числа в заданной системе счисления -;вх: bc - число -; a - основание системы счисления -x2130 ld hl,x162C ;п/п печати числа в заданной системе счисления - push hl - ld d,a - ld e,"%" - cp #02 - ret z ;двоичная - ld e,"@" - cp #08 - ret z ;восьмеричная - ld e,#2E ;"." - cp #0A - ret z ;десятичная - ld de,#1023 - ret ;шестнадцатиричная - -;АДРЕС: #2148 Команда: WORD word[:] program -; Продолжение (для переопределения уже определенных слов) -;Вх: de - адрес конца слова в программе (указывает на #01) -; bc - адрес начала введенной строки -x2148 ld (xE9D3),de ;адрес конца названия слова в программе (указывает на #01) - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - push hl - ex de,hl -;ищем начало слова -x2151 bit 7,(hl) - dec hl - jr z,x2151 - dec hl - ld (xE9D5),hl ;адрес первой ячейки переопределяемого слова -;записываем новое слов в программу - ld h,b - ld l,c ;адрес начала введенной строки - call x1FB6 ;установка слова праграммы -;удаление переопределяемого слова - ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова - ld e,(hl) - inc hl - ld d,(hl) - dec hl - ex de,hl - push de ;de - адрес начала переопределяемого слова - push hl ;hl - адрес начала следующего слова, после переопределяемого - push hl - ld b,h - ld c,l ;bc - адрес начала следующего слова, после переопределяемого - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - or a - sbc hl,bc - ld b,h - ld c,l ;bc - длина перемещаемого блока программы - inc bc - inc bc - pop hl - ldir - dec de - dec de - ld (xE11C),de - pop de ;de - адрес начала следующего слова, после переопределяемого - pop hl ;hl - адрес начала переопределяемого слова - or a - sbc hl,de - ld b,h - ld c,l - pop hl - add hl,bc - inc hl -x2189 inc hl - ld a,(hl) - cp #20 - jr nc,x2189 - ld (xE9D7),hl ;адрес конца названия переопределенного слова в программе (указывает на #01) -;коррекция адресов слов в программе - ld hl,xF6C0 ;начало программы -x2195 ld e,(hl) - inc hl - ld d,(hl) - ld a,d - or e ;адрес следующего слова - jr z,x21D7 ;конец программы - push hl ;адрес ячейки с указанием на следующее слово - ld hl,(xE9D5) ;адрес первой ячейки переопределяемого слова - or a - sbc hl,de - jr nc,x21AE - ld h,b - ld l,c ;на сколько сократилась программа - add hl,de - ex de,hl - pop hl - push hl - ld (hl),d - dec hl - ld (hl),e -x21AE pop hl - inc hl -; ищем конец слова -x21B0 ld a,(hl) - inc hl - cp #20 - jr nc,x21B0 -x21B6 ld e,(hl) - inc hl - ld d,(hl) ;de - адрес слова программы - inc hl - push hl - ld hl,x2340 - or a - sbc hl,de - jr nz,x21C9 ;это не число - pop hl ;для числа оставляем как есть - inc hl - inc hl - inc hl - jr x21B6 -x21C9 ld hl,x225D ;прерывание выполнения слова - or a - sbc hl,de - pop hl - jr z,x2195 ;это конец слова-программы - call x21F3 ;коррекция адреса конца пользовательского слова в программе - jr x21B6 - -;завершение. коррекция адресов зарезервированных слов в программе -x21D7 ld hl,xE9A9 ;адреса зарезервированных слов анализатора st0-st9 - call x21E0 - ld hl,xE9BD ;адреса зарезервированных слов анализатора br0-br9 -x21E0 ld a,#0A -x21E2 push af - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,d - or e - call nz,x21F3 - pop af - dec a - jr nz,x21E2 - ld a,#88 ;сообщение: word redefined - ret - -;коррекция адреса конца пользовательского слова в программе -x21F3 push hl - ld hl,(xE9D3) - or a - sbc hl,de - jr z,x220E - jr nc,x220C - ld a,(de) - or a - jr z,x220C - ld h,b - ld l,c - add hl,de - ex de,hl -x2206 pop hl - push hl - dec hl - ld (hl),d - dec hl - ld (hl),e -x220C pop hl - ret -x220E ld de,(xE9D7) - jr x2206 - -;АДРЕС: #2214 Команда: PDEFinition вывод на принтер Форт - программы -x2214 set 4,(iy+#09) - -;АДРЕС: #2218 Команда: LDEFinition вывод на экран Форт - программы -x2218 call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3300 ;сообщение: analyser definitions: - rst #08 - rst #20 - db #0D,#8D -;печать размера свободной области - ld hl,xF6C0+#FF ;адрес конца стэка анализатора - ld de,(xE11C) ;адрес первого свободного байта стэка анализатора - scf - sbc hl,de - ld (xDDA7),hl - ld bc,#3400 ;сообщение: space left for stack _число_ - rst #08 - ld a," " - rst #10 - ld bc,#3500 ;сообщение: bytes - rst #08 - rst #20 - db #0D,#8D -;печать списка заданных слов - ld hl,xF6C0 -x2240 ld c,(hl) - inc hl - ld b,(hl) - ld a,b - or c - jr z,x2256 ;конец программы - push bc ;адрес следующего слова - inc hl - inc hl - call x20C8 ;печать редактируемого слова - ld a,#0D - rst #10 ;перевод строки - call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - pop hl - jr x2240 -;завершение печати -x2256 res 4,(iy+#09) ;печать в экран - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #225D прерывание выполнения слова/завершение работы форт программы -x225D nop - pop hl - pop hl - pop hl - -;АДРЕС: #2261 переход к обработке следующего слова в программе анализатора -; или выход, если слов больше нет -x2261 pop de - pop hl - ld a,l - or h - jp nz,x1DFB -;слов в программе больше нет - bit 5,(iy+#14) - ret nz ;вызов был из команды EVal - push hl - push de - ld (xE9DD),sp - ld hl,(xE9DB) - ld de,(xE11C) - inc de - inc de - inc de - inc de - or a - sbc hl,de - ld a,#36 ;сообщение: stack not empty - jp nz,x2307 ;обработка ошибок при работе программы анализатора - call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - pop hl - pop hl - ret z - pop hl - pop hl - pop af - ld l,a ;число для сообщения - ld a,#85 ;сообщение: stop number _число_ - jp x01D5 - -;АДРЕС: #2297 Команда: EVal word выполнить слово word -;вх: hl - адрес строки с параметрами -x2297 bit 3,(iy+#14) - ld a,#2E ;сообщение: program undefined - ret z ;программа анализатора не задана -;анализ команды ассемблера по адресу PC - push hl - ld hl,(xDD6B) ;pc программы пользователя - call x2F96 ;анализ команды ассемблера по адресу в hl - pop hl -;установка слов команды в программу анализатора - ld de,(xE11C) ;адрес первого свободного байта программы анализатора - push de - push hl - inc de - inc de ;поправка на адрес - ld hl,x2301 - ld b,#07 -x22B3 ld a,(hl) - call x1E0F ;установка кода команды в программу анализатора - inc hl - djnz x22B3 - pop hl ;hl - адрес строки с параметрами команды (список слов на выполнение) - dec hl ;de - адрес первого свободного байта программы анализатора - push de - call x2019 ;установка слов в программу - pop de - dec de -;выполнение введенных слов - ld hl,(xE11C) ;адрес первого свободного байта программы анализатора - ex (sp),hl - ld (xE11C),hl - xor a - ld (hl),a - inc hl - ld (hl),a ;нет больше слов, только эти - set 5,(iy+#14) ;работает команда EVal word - pop hl - call x1DE8 ;выполнение слова анализатора - res 5,(iy+#14) -;печать содержимого стэка анализатора - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3700 ;сообщение: state of stack - rst #08 ;печать сообщения - ld a,#0D - rst #10 ;перевод строки - ld de,(xE9D9) ;адрес начала стэка анализатора - inc de -x22E8 ld hl,(xE9DB) ;адрес вершины стэка анализатора - or a - sbc hl,de - ld a,#81 ;сообщение: enter command - ret z ;стэк пустой - push de - ld a,#0D - rst #10 ;перевод строки - call x237F ;чтение элемента с вершины стэка анализатора - call x1614 ;печать числа в bc (dec/hex) с префиксом - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - pop de - jr x22E8 -x2301 db #80+"*","eval*" - -;обработка ошибок при работе программы анализатора -;вх: a - номер сообщения об ошибке -x2307 ld (xDDA7),a - ld sp,(xE9DD) - call x0550 ;сохранение экрана из страницы 5 - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#3800 ;сообщение: workspace insufficient - rst #08 ;печать сообщения по номеру в BC - rst #20 - db #0D,#8D ;два перевода строки -x231B pop hl - push hl - ld de,x2340 - or a - sbc hl,de - pop hl - jr z,x2332 - push hl - rst #20 - dc "in " - pop hl - call x2112 ;поиск начала и печать слова анализатора - ld a,#0D - rst #10 ;перевод строки -x2332 call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - pop hl - ld a,h - or l - jr nz,x231B - ld a,(xDDA7) - jp x0B06 - -; обработки числа в программе анализатора -x2340 nop - pop ix - pop de - pop hl - call x2121 ;чтение ld bc,(hl+1): hl=hl+2 - inc hl - push hl - push de - push ix - -;АДРЕС: #234D запись элемента на стэк анализатора -;вх: bc - значение для помещения на стэк анализатора -x234D push hl - push de - ld hl,(xE9DB) ;адрес вершины стэка анализатора - push hl - inc hl - inc hl - ld de,xF6C0+#FF ;xF7BF адрес конца стэка анализатора - or a - sbc hl,de - ld a,#39 ;сообщение: out of stack space - jr nc,x2307 ;нет места на стэке - pop hl - ld (hl),c ;пишем значение на стэк - inc hl - ld (hl),b - inc hl - -;АДРЕС: #2364 установка нового значения вершины стэка анализатора -;вх: hl - адрес новой вершины стэка -x2364 ld (xE9DB),hl - pop de - pop hl - ret - -;АДРЕС: #236A запись на стэк анализатора байта из ячейки памяти пользователя -;вх: bc - адрес памяти -x236A push hl - ld l,c - ld h,b ;адрес в памяти пользователя - rst #28 ;чтение байта из памяти пользователя - pop hl - ld c,a - ld b,#00 - jr x234D ;запись элемента на стэк анализатора - -;АДРЕС: #2374 запись на стэк анализатора слова из ячеек памяти пользователя -;вх: bc - адрес памяти -x2374 push hl - ld l,c - ld h,b - rst #28 ;чтение байта из памяти пользователя - ld c,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld b,a - pop hl - jr x234D ;запись элемента на стэк анализатора - -;АДРЕС: #237F чтение элемента с вершины стэка анализатора -;вых: bc - считанное значение -x237F push hl - push de - ld hl,(xE9DB) ;адрес вершины стэка анализатора - dec hl - push hl - or a - ld de,(xE9D9) ;адрес начала стэка анализатора - sbc hl,de - ld a,#3A ;сообщение: stack empty - jp z,x2307 ;выход по ошибке - pop hl - ld b,(hl) - dec hl - ld c,(hl) ;bc - содержимое вершины стэка анализатора - jr x2364 - -;АДРЕС: #2398 чтение двух элементов с вершины стэка анализатора -;вых: hl,de - первое значение -; bc - второе значение -x2398 call x237F ;чтение элемента с вершины стэка анализатора - push bc - call x237F ;чтение элемента с вершины стэка анализатора - pop de - ld l,e - ld h,d - ret - -;АДРЕС: #23A3 базовые слова анализатора -;слово: NOP нет операции -; +0 2 адрес следующего слова (=#0000 это конец списка) -; +2 n слово анализатора (в первом байте 7,=1), #00 признак конча слова -; +2+n процедура обработки слова -x23A3 dw x23AA - db #80+"N","OP",#00 -; процедура обработки - ret - -;слово: DUP Дублировать содержимое вершины стека. На стеке создается копия -; верхнего элемента -x23AA dw x23B8 - db #80+"D","UP",#00 -; процедура обработки -x23B0 call x237F ;чтение элемента с вершины стэка анализатора - call x234D ;запись элемента на стэк анализатора - jr x234D ;запись элемента на стэк анализатора - -;слово: SWAP перестановка двух элементов на вершине стека -x23B8 dw x23CC - db #80+"S","WAP",#00 -; процедура обработки -x23BF call x2398 ;чтение двух элементов с вершины стэка анализатора - push bc - ld c,l - ld b,h - call x234D ;запись элемента на стэк анализатора - pop bc -x23C9 jp x234D ;запись элемента на стэк анализатора - -;слово: OVER копирование второго от вершины элемента стека. Копия помещается -; на вершину стека -x23CC dw x23E0 - db #80+"O","VER",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - push bc - call x23B0 ;слово: DUP - pop bc - call x234D ;запись элемента на стэк анализатора - jr x23BF ;слово: SWAP - -;слово: ROT циклический сдвиг трех верхних элементов стека. Третий от вершины -; стека элемент помещается на вершину стека. -x23E0 dw x23FE - db #80+"R","OT",#00 -; процедура обработки -x23E6 call x2398 ;чтение двух элементов с вершины стэка анализатора - push hl - push bc - call x237F ;чтение элемента с вершины стэка анализатора - pop hl - push bc - ld c,l - ld b,h - call x234D ;запись элемента на стэк анализатора - pop de - pop bc - push de - call x234D ;запись элемента на стэк анализатора - pop bc - jr x23C9 ;запись значения на стэк анализатора - -;слово: DROP удаление верхнего элемента стека -x23FE dw x2408 - db #80+"D","ROP",#00 -; процедура обработки - jp x237F ;чтение элемента с вершины стэка анализатора - -;слово: + получить значение суммы двух верхних элементов стека -x2408 dw x2414 - db #80+"+",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - add hl,bc -x2410 ld c,l - ld b,h - jr x23C9 ;запись значения на стэк анализатора - -;слово: - получить значение разности двух верхних элементов стека -x2414 dw x2422 - db #80+"-",#00 -; процедура обработки -x2418 call x2398 ;чтение двух элементов с вершины стэка анализатора - ld h,b - ld l,c - or a - sbc hl,de - jr x2410 ;запись значения на стэк анализатора - -;слово: / получить значение частного от целочисленного деления двух верхних -; элементов стека -x2422 dw x2439 - db #80+"/",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - call x0E73 ;деление bc=hl/de с проверкой de на ноль - bit 2,(iy+#0E) ;=1 ошибка. деление на ноль - jr z,x2456 ;запись элемента на стэк анализатора - ld a,#40 ;сообщение: devision by zero - jp x2307 - -;слово: * получить значение произведения двух верхних элементов стека -x2439 dw x2447 - db #80+"*",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - call x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - jr x2410 ;запись значения на стэк анализатора - -;слово: AND получить значение операции поразрядного логического "И" над двумя -; верхними элементами стека -x2447 dw x2459 - db #80+"A","ND",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - and l - ld c,a - ld a,b - and h - ld b,a -x2456 jp x234D ;запись элемента на стэк анализатора - -;слово: OR получить значение операции поразрядного логического "ИЛИ" над двумя -; верхними элементами стека -x2459 dw x2469 - db #80+"O","R",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - or l - ld c,a - ld a,b - or h - ld b,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: XOR получить значение операции поразрядного логического "Исключающее -; ИЛИ" над двумя верхними элементами стека -x2469 dw x247A - db #80+"X","OR",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - xor l - ld c,a - ld a,b - xor h - ld b,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: NOT инвертировать значение находящееся на вершине стека -x247A dw x248B - db #80+"N","OT",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,b - cpl - ld b,a - ld a,c - cpl - ld c,a - jr x2456 ;запись элемента на стэк анализатора - -;слово: = истина при равенстве двух элементов, в противном случае Ложь -x248B dw x2494 - db #80+"=",#00 -; процедура обработки - call x2418 ;слово: - - jr x24CB ;слово: 0= - -;слово: 0> истина, если элемент положителен (больше нуля), в противном случае -; Ложь -x2494 dw x24A7 - db #80+"0",">",#00 -; процедура обработки -x2499 call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b -x249E ld bc,#0000 - jr z,x24A4 -x24A3 inc bc -x24A4 jp x234D ;запись элемента на стэк анализатора - -;слово: < истина, если n1 меньше чем n2, в противном случае Ложь -x24A7 dw x24BA - db #80+"<",#00 -; процедура обработки -x24AB call x2398 ;чтение двух элементов с вершины стэка анализатора - ld l,c - ld h,b - or a - sbc hl,de -x24B3 ld bc,#0000 - jr c,x24A3 ;запись =1 на стэк анализатора - jr x24A4 ;запись =0 на стэк анализатора - -;слово: > истина, если n1 больше чем n2, в противном случае Ложь -x24BA dw x24C6 - db #80+">",#00 -; процедура обработки -x24BE call x2398 ;чтение двух элементов с вершины стэка анализатора - or a - sbc hl,bc - jr x24B3 - -;слово: 0= истина, если элемент равен нулю, в противном случае Ложь -x24C6 dw x24D8 - db #80+"0","=",#00 -; процедура обработки -x24CB call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - inc bc - jr z,x24D6 - ld bc,#0000 -x24D6 jr x24A4 ;запись элемента на стэк анализатора - -;слово: <= истина, если n1 меньше или равно n2, в противном случае Ложь -x24D8 dw x24E2 - db #80+"<","=",#00 -; процедура обработки -x24DD call x24BE ;слово: > - jr x24CB ;слово: 0= - -;слово: >= истина, если n1 больше или равно n2, в противном случае Лож -x24E2 dw x24EC - db #80+">","=",#00 -; процедура обработки - call x24AB ;слово: < - jr x24CB ;слово: 0= - -;слово: <> истина, если n1 не равно n2, в противном случае Ложь -x24EC dw x24F6 - db #80+"<",">",#00 -; процедура обработки - call x2418 ;слово: - - jr x2499 ;слово: 0> - -;слово: & поместить на вершину стека значение операции логическое "И" над двумя -; верхними элементами стека, сами элементы при этом удаляются. В -; отличие от слова AND, слово & работает с логическими величинами -; (Истина и Ложь) -x24F6 dw x2505 - db #80+"&",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,b - or c - jr z,x249E - ld a,l - or h - jr x249E - -;слово: C@ разместить на вершине стека байт, считанный по адресу n1 -x2505 dw x2510 - db #80+"C","@",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - jp x236A ;запись на стэк анализатора байта из ячейки памяти пользователя - -;слово: C@ разместить на вершине стека байт, считанный по адресу n1 -x2510 dw x251A - db #80+"@",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - jp x2374 ;запись на стэк анализатора слова из ячеек памяти пользователя - -;слово: BIT разместить на вершине стека значение бита с номером n1 в элементе n2 -x251A dw x253D - db #80+"B","IT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld h,#00 - ld a,l - and #0F - ld de,#0001 - jr x2531 -x252D sla e - rl d -x2531 dec a - jp p,x252D - ld a,e - and c - ld c,a - ld a,d - and b - or c - jr x255E ;запись значения на стэк анализатора - -;слово: ADDR разместить на вершине стека значение адреса на который ссылаются -; команды работающие с ячейками памяти, такие как LD ( ),reg или -; SET b,(IX+d). Для других команд на стек помещается значение 0 -x253D dw x2555 - db #80+"A","DDR",#00 -; процедура обработки - ld a,(iy+#04) - ld bc,#0000 - and %00000011 - jr z,x2552 - ld bc,(xDDD2) -x2552 jp x234D ;запись значения на стэк анализатора - -;слово: RD истина, если команда считывает из памяти, и Ложь, если считывания -; не происходит -x2555 dw x2561 - db #80+"R","D",#00 -; процедура обработки - bit 0,(iy+#04) -x255E jp x249E ;запись значения на стэк анализатора - -;слово: WR истина, если команда производит запись в память, и Ложь, если запись -; не выполняется -x2561 dw x256C - db #80+"W","R",#00 -; процедура обработки - bit 1,(iy+#04) - jr x255E - -;слово: ACF помещает на вершину стека значение Истина, если команда использует -; доступ к ячейке памяти, для других команд - помещается значение Ложь -x256C dw x2579 - db #80+"A","CF",#00 -; процедура обработки - ld a,(xE018) - and %00000011 - jr x255E - -;слово: CF значение флага переноса -x2579 dw x2586 - db #80+"C","F",#00 -; процедура обработки - ld a,#01 -x2580 ld hl,xDD7F - and (hl) - jr x255E - -;слово: NF значение флага команды вычитания -x2586 dw x258F - db #80+"N","F",#00 -; процедура обработки - ld a,#02 - jr x2580 - -;слово: PVF значение флага четности/переполнения -x258F dw x2599 - db #80+"P","VF",#00 -; процедура обработки - ld a,#04 - jr x2580 - -;слово: HF значения флага двоично - десятичного переноса -x2599 dw x25A2 - db #80+"H","F",#00 -; процедура обработки - ld a,#10 - jr x2580 - -;слово: ZF значение флага нулевого результата -x25A2 dw x25AB - db #80+"Z","F",#00 -; процедура обработки - ld a,#40 - jr x2580 - -;слово: SF значение флага отрицательного результата -x25AB dw x25B4 - db #80+"S","F",#00 -; процедура обработки - ld a,#80 - jr x2580 - -;слово: REG размещает на вершине стека значение регистровой пары, соответствующей коду n1 -x25B4 dw x25CC - db #80+"R","EG",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - -;запись регистровой пары на стэк анализатора -;вх: c - код регистровой пары/ячейки MEM -x25BD ld hl,xDD69 ;адрес текущей ячейки в мониторе - ld b,#00 - add hl,bc - ld c,(hl) - inc hl - ld b,(hl) ;bc - значение регистровой пары/ячейки MEM - jr x2552 ;запись элемента на стэк анализатора - -;чтение кода и запись регистровой пары на стэк анализатора -x25C8 pop hl - ld c,(hl) - jr x25BD ;запись регистровой пары на стэк анализатора - -;слово: CREG размещает на вершине стека значение регистра, выбираемого кодом n1 -x25CC dw x25E6 - db #80+"C","REG",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора -x25D6 ld hl,xDD69 - ld b,#00 - add hl,bc - ld c,(hl) - ld b,#00 - jp x234D ;запись элемента на стэк анализатора -x25E2 pop hl - ld c,(hl) - jr x25D6 - -;слово: SP размещает на вершине стека значение регистра SP -x25E6 dw x25EF - db #80+"S","P",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #04 - -;слово: PC размещает на вершине стека значение регистра PC -x25EF dw x25F8 - db #80+"P","C",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #02 - -;слово: IX размещает на вершине стека значение регистра IX -x25F8 dw x2601 - db #80+"I","X",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #06 - -;слово: IY размещает на вершине стека значение регистра IY -x2601 dw x260A - db #80+"I","Y",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #08 - -;слово: BC размещает на вершине стека значение регистра BC -x260A dw x2613 - db #80+"B","C",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0E - -;слово: DE размещает на вершине стека значение регистра DE -x2613 dw x261C - db #80+"D","E",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0C - -;слово: HL размещает на вершине стека значение регистра HL -x261C dw x2625 - db #80+"H","L",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #0A - -;слово: AF размещает на вершине стека значение регистра AF -x2625 dw x262E - db #80+"A","F",#00 -; процедура обработки - call x25C8 ;чтение кода и запись регистровой пары на стэк анализатора - db #16 - -;слово: C размещает на вершине стека значение регистра C -x262E dw x2636 - db #80+"C",#00 -; процедура обработки - call x25E2 - db #0E - -;слово: B размещает на вершине стека значение регистра B -x2636 dw x263E - db #80+"B",#00 -; процедура обработки - call x25E2 - db #0F - -;слово: E размещает на вершине стека значение регистра E -x263E dw x2646 - db #80+"E",#00 -; процедура обработки - call x25E2 - db #0C - -;слово: D размещает на вершине стека значение регистра D -x2646 dw x264E - db #80+"D",#00 -; процедура обработки - call x25E2 - db #0D - -;слово: L размещает на вершине стека значение регистра L -x264E dw x2656 - db #80+"L",#00 -; процедура обработки - call x25E2 - db #0A - -;слово: H размещает на вершине стека значение регистра H -x2656 dw x265E - db #80+"H",#00 -; процедура обработки - call x25E2 - db #0B - -;слово: F размещает на вершине стека значение регистра F -x265E dw x2666 - db #80+"F",#00 -; процедура обработки - call x25E2 - db #16 - -;слово: A размещает на вершине стека значение регистра A -x2666 dw x266E - db #80+"A",#00 -; процедура обработки - call x25E2 - db #17 - -;слово: MEM поместить на вершину стека значение текущей ячейки монитора -x266E dw x2678 - db #80+"M","EM",#00 -; процедура обработки - call x25C8 ;чтение кода и запись номера ячейки на стэк анализатора - db #00 ;код ячейки MEM - -;слово: CALL выполнить подпрограмму, расположенную по адресу n1 -x2678 dw x269A - db #80+"C","ALL",#00 -; процедура обработки - push iy - push ix - call x268B - pop ix - pop iy - ret -x268B call x237F ;чтение элемента с вершины стэка анализатора - push bc - ld ix,xDD69 - ld de,x234D ;п/п записи элемента на стэк анализатора - ld hl,x237F ;п/п чтения элемента с вершины стэка анализатора - ret - -;слово: ! слово (два смежных байта) n1 поместить в память по адресу n2 -x269A dw x26A7 - db #80+"!",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - rst #00 ;запись байта в память пользователя - inc hl - ld a,b -x26A5 rst #00 ;запись байта в память пользователя - ret - -;слово: C! байт n1 поместить в ячейку памяти, адресуемую n2 -x26A7 dw x26B2 - db #80+"C","!",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,c - jr x26A5 - -;слово: IF если верхний элемент стека имеет значение Ложь (равен нулю), то -; выполнение слова, содержащего IF, прекращается. Управление передается -; вызвавшему слову (либо происходит окончание выполнения -; Форт - программы, если слово является первым). В противном случае -; (верхний элемент - Истина) продолжается выполнение текущего слова -x26B2 dw x26C0 - db #80+"I","F",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,b - or c - ret nz ;продолжаем выполнять - jp x225D ;прерывание выполнения слова - -;слово: MEM! установить адрес текущей ячейкой монитора n1 -x26C0 dw x26CF - db #80+"M","EM!",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (xDD69),bc - ret - -;слово: ?PAUSE ожидание нажатия на любую клавишу, если верхний элемент стека -; имеет значение Истина (не равен нулю). После нажатия на клавишу -; выполнение программы продолжается. Если вовремя ожидания ввести -; комбинацию EDIT/C, то выполнение Форт - программы будет прервано, -; а управление передано монитору -x26CF dw x26EA - db #80+"?","PAUSE",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - ret z - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - cp #03 ;cs+1+c - ret nz - ld a,#9A ;сообщение: command abandoned - jp x2307 - -;слово: KEY ожидание нажатия на какую-либо клавишу, код клавиш будет помещен на -; вершину стека -x26EA dw x26FA - db #80+"K","EY",#00 -; процедура обработки - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 -x26F4 ld c,a - ld b,#00 -x26F7 jp x234D ;запись элемента на стэк анализатора - - -;слово: ?MEM обновить (перевывести) вывести дамп памяти на экран (используется -; экран дампа памяти теневого монитора), если n1 истина -; (не равно нулю) -x26FA dw x270C - db #80+"?","MEM",#00 -; процедура обработки - call x2736 - and #CF ;обновлять дамп памяти, обновлять дизассемблер памяти по содержимому ячейки памяти -x2706 ld (xE01E),a - jp x2CA8 ;печать/обновление монитора-отладчика - -;слово: ?REG обновить (перевывести) информацию о содержимом регистров на экране -; монитора, если n1 истина (не равно нулю) -x270C dw x271A - db #80+"?","REG",#00 -; процедура обработки - call x2736 - and #F5 - jr x2706 - -;слово: ?DIS вывести реассемблер трассируемых команд (в правый верхний угол -; экрана). Реассемблер выводится по содержимому регистра PC, если -; n1 истина (не равно нулю) -x271A dw x2728 - db #80+"?","DIS",#00 -; процедура обработки - call x2736 - and #BF - jr x2706 - -;слово: ?SCR полностью перевывести экран теневого монитора, если n1 истина -; (не равно нулю) -x2728 dw x2742 - db #80+"?","SCR",#00 -; процедура обработки - call x2736 - and #80 - jr x2706 -;чтение переменной (xE01E) -x2736 call x237F ;чтение элемента с вершины стэка анализатора - ld a,c - or b - pop hl - ret z - push hl - ld a,(xE01E) - ret - -;слово: SYS1 на вершину стека помещается значение системного регистра #7FFD -x2742 dw x2750 - db #80+"S","YS1",#00 -; процедура обработки - ld c,(iy-#02) -x274C ld b,#00 - jr x26F7 ;запись элемента на стэк анализатора - -;слово: SYS2 на вершину стека помещается значение системного регистра #1FFD -x2750 dw x275C - db #80+"S","YS2",#00 -; процедура обработки - ld c,(iy-#01) - jr x274C - -;слово: !SYS1 значение верхнего элемента стека устанавливается в системном -; регистре #7FFD -x275C dw x276B - db #80+"!","SYS1",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (iy-#02),c - ret - -;слово: !SYS2 значение верхнего элемента стека устанавливается в системном -; регистре #1FFD -x276B dw x277A - db #80+"!","SYS2",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld (iy-#01),c - ret - -;слово: IFF на вершину стека помещается состояние флага разрешения прерываний -; в отлаживаемой программе -x277A dw x278A - db #80+"I","FF",#00 -; процедура обработки - ld a,(xDD83) - and #04 - rrca - rrca - jp x26F4 ;запись элемента на стэк анализатора - -;слово: RAM поместить на вершину стека номер установленного банка -x278A dw x2796 - db #80+"R","AM",#00 -; процедура обработки - call x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - jp x26F4 ;запись элемента на стэк анализатора - -;слово: !RAM изменить номер установленного банка на банк, указываемый верхним -; элементом стека -x2796 dw x27A4 - db #80+"!","RAM",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - ld l,c - jp x3732 ;установка страницы пользователя равной номеру страницы в L - -;слово: IN поместить на вершину стека данные, считанные из порта ввода, -; адресуемого значением верхнего элемента стека -x27A4 dw x27B0 - db #80+"I","N",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - in c,(c) - jr x274C - -;слово: OUT вывести в порт вывода с адресом n2 данные n1 -x27B0 dw x27BC - db #80+"O","UT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - out (c),l - ret - -;слово: DIN поместить на вершину стека данные, считанные из порта ввода Tr-Dos, -; адресуемого значением верхнего элемента стека -x27BC dw x27CB - db #80+"D","IN",#00 -; процедура обработки - call x237F ;чтение элемента с вершины стэка анализатора - rst #18 ;вызов п/п Tr-Dos - dw rom3_x3FF3 ;чтение порта - ld c,a - jr x274C ;запись элемента на стэк анализатора - -;слово: DOUT вывести в порт вывода Tr-Dos с адресом n2 данные n1 -x27CB dw x27DA - db #80+"D","OUT",#00 -; процедура обработки - call x2398 ;чтение двух элементов с вершины стэка анализатора - ld a,l - rst #18 ;вызов п/п Tr-Dos - dw rom3_x3FF0 ;запись в порт - ret - -;конец списка слов -x27DA dw #0000 - -;список управляющих кодов -x27DC db #01 ;установка атрибутов для последующих символов - db #02 ;восстановление запомненных атрибутов - db #04 ;вывод с выравниванием - db #05 ;вывод строки по центру окна - db #06 ;вывод строки выровненной по правому краю окна - db #07 ;звонок - db #0A ;перевод строки - db #0C ;очистка окна - db #0D ;перевод каретки - db #1B ;позиционирование курсора внутри окна -x27E6 db #1E ;"обратный свиток" - -;таблица с адресами обработки управляющих кодов -x27E7 dw x2BF8 ;#01 - dw x2C18 ;#02 - dw x2AAD ;#04 - dw x2ACA ;#05 - dw x2AED ;#06 - dw x2BA8 ;#07 - dw x2B7D ;#0A - dw x2A5E ;#0C - dw x2B6E ;#0D - dw x2BCA ;#1B - dw x2A1B ;#1E - -;АДРЕС: #27FD удаление курсора и печать символа в окне -;вх: ix - адрес дескриптора окна -; a - код символа -;вых: nz - следующие координаты печати не установлены -; -x27FD call x28B8 ;признак печати и восстановление экрана - -;АДРЕС: #2800 печать символа в окне -;вх: ix - адрес дескриптора окна -; a - код символа -;вых: nz - следующие координаты печати не установлены -; -x2800 ld l,a - ld c,a ;!!! лишняя команда - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - ld de,(xE9E5) - add hl,de ;адрес данных символа - ld a,(ix+#0A) - cp #08 - jr nz,x2847 ;символ 6 пикселей - push hl - call x297C ;расчет экранного адреса курсора - pop de - ld b,#08 ;печать символа 8pix -x281A ld a,(de) - ld (hl),a - inc de - inc h - djnz x281A -x2820 bit 1,(ix+7) ;печать атрибутов, если нужно - jr z,x2834 ;атрибуты не печатаем - dec h - ld a,h - rrca - rrca - rrca - and #03 - xor #58 - ld h,a ;адрес в области атрибутов - ld a,(ix+6) - ld (hl),a -x2834 bit 1,(iy+9) ;установим следующие координаты печати - ret nz - inc (ix+1) ;crd X+1 - ld a,(ix+#0B) ;ширина окна в символах - cp (ix+1) - ret nc ;еще не вышли за пределы окна - dec (ix+1) - ret -;печать символа шириной 6 пикселей -x2847 push hl ;адрес данных символа - call x292F ;расчет экранного адреса курсора - pop de - ld a,b ;печать символа - ld b,#08 - or a - jr z,x28A8 ;нет сдвига символа - cp #04 - jr c,x2896 ;сдвиг 2 пикселя - jr z,x2876 ;сдвиг 4 пикселя -; координата в знакоместе 6 -x2858 ld a,(de) - rlca - rlca - push af ;левая часть - and %00000011 - ld c,a - ld a,(hl) - and %11111100 - or c - ld (hl),a - inc hl - pop af - and %11110000 ;правая часть - ld c,a - ld a,(hl) - and %00001111 - or c - ld (hl),a - dec hl - inc h - inc de - djnz x2858 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 4 -x2876 ld a,(de) - rlca - rlca - rlca - rlca - push af ;левая часть - and %00001111 - ld c,a - ld a,(hl) - and %11110000 - or c - ld (hl),a - inc hl - pop af ;правая часть - and %11000000 - ld c,a - ld a,(hl) - and %00111111 - or c - ld (hl),a - dec hl - inc h - inc de - djnz x2876 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 2 -x2896 ld a,(hl) - and %11000000 - ld c,a - ld a,(de) - rrca - rrca - and %00111111 - or c - ld (hl),a - inc h - inc de - djnz x2896 - jp x2820 ;печать атрибутов и выход -; координата в знакоместе 0 -x28A8 ld a,(hl) - and %00000011 - ld c,a - ld a,(de) - and %11111100 - or c - ld (hl),a - inc h - inc de - djnz x28A8 - jp x2820 ;печать атрибутов и выход - -;АДРЕС: #28B8 восстановление экрана под курсором, если нужно (6 пикселей символ) -;вх: ix - адрес дескриптора окна -; -x28B8 set 2,(iy+9) - bit 0,(iy+9) - ret z - res 0,(iy+9) - -;АДРЕС: #28C5 сохранение экрана под курсором (6 пикселей символ) -;вх: ix - адрес дескриптора окна -; -x28C5 push af - call x292F ;расчет экранного адреса курсора в окне для символов 6 пикселей - ld de,xE3A4 ;начало буфера - ld b,#08 -x28CE ld c,#02 -x28D0 bit 0,(iy+9) - jr z,x28DA - ld a,(hl) - ld (de),a - jr x28DC -x28DA ld a,(de) - ld (hl),a -x28DC inc l - inc de - dec c - jr nz,x28D0 - dec l - dec l - inc h - djnz x28CE - pop af - ret - -;АДРЕС: #28E8 печать/удаление курсора в окне -; -x28E8 ld a,#01 - res 2,(iy+9) - bit 0,(iy+9) - ret nz - ld (xE3B6),a - -;АДРЕС: #28F6 мигание текстового курсора в строке ввода -; -x28F6 ld ix,(xE3B7) - bit 0,(ix+7) - ret nz ;символ курсора не выводим - ld hl,xE01D - bit 2,(hl) - res 2,(hl) - ld hl,xE3B6 - jr nz,x292C ;что-то печатается - dec (hl) - ret nz ;счетчик - ld (hl),#0C - ld hl,xE01D - bit 0,(hl) - res 0,(hl) - jr nz,x28C5 ;восстановление экрана под курсором (6 пикселей символ) -;печать курсора - set 0,(hl) - push hl - call x28C5 ;сохранение экрана под курсором (6 пикселей символ) - pop hl - ld a,(ix+#0C) ;код курсора - set 1,(hl) ;запрет изменения координат печати - push hl - call x2800 ;печать символа в окне - pop hl - res 1,(hl) - ret -x292C ld (hl),#0A - ret - -;АДРЕС: #292F Расчет экранного адреса курсора в окне для символов 6 пикселей -;вх: ix - адрес дескриптора окна -;вых: b - смещение в знакоместе -; hl - адрес на экране -; -x292F ld a,(ix+2) ;координата Y - add a,(ix+0) - ld h,a - rrca - rrca - rrca - and #E0 - ld l,a - ld c,(ix+1) ;координата X - ld a,c - add a,c - add a,c - add a,a - ld c,a ;c=X*6 - and #07 - ld b,a ;смещение в знакоместе - ld a,c - rrca - rrca - rrca - add a,(ix+3) - and #1F - or l - ld l,a - ld a,h - and #18 - or #40 - ld h,a - ret - -;АДРЕС: #2959 Расчет координат курсора на экране для символов шириной 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: bc - координаты курсора -; -x2959 ld l,(ix+0) - ld h,(ix+1) - ld c,(ix+2) - ld b,(ix+3) - add hl,bc - ld c,l - ld b,h - ret - -;АДРЕС: #2969 Расчет адреса курсора в области атрибутов для символов 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: hl - адрес в области атрибутов -; -x2969 call x2959 ;координаты курсора на экране - ld a,c - rrca - rrca - rrca - ld c,a - and #E0 - xor b - ld l,a - ld a,c - and #03 - xor #58 - ld h,a - ret - -;АДРЕС: #297C Расчет экранного адреса курсора в окне для символов 8 пикселей -;вх: ix - адрес дескриптора окна -;вых: bc - координаты курсора на экране -; hl - адрес на экране -; -x297C call x2959 ;координаты курсора на экране - ld a,c - rrca - rrca - rrca - and #E0 - xor b - ld l,a - ld a,c - and #18 - xor #40 - ld h,a - ret - -;АДРЕС: #298E скроллинг окна вверх -;вх: ix - адрес дескриптора окна -; -x298E ld c,(ix+0) - ld b,(ix+1) - push bc ;сохраним координаты курсора - ld (ix+0),#01 ;crdY=1 - ld (ix+1),#00 ;crdX=0 - ld b,(ix+4) ;высота окна -x29A0 dec b - jr z,x29BE -;скроллинг вверх - push bc - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - or a - call x29D0 ;скроллинг строки данных окна вверх - bit 1,(ix+7) - jr z,x29B8 ;атрибуты не меняются - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - or a - call x29FB ;скроллинг строки атрибутов окна вверх -x29B8 inc (ix+0) - pop bc - jr x29A0 -;очистка нижней знакоместной строки -x29BE ld a,(ix+4) ;высота окна - dec a - ld (ix+0),a ;координата Y в самом низу - call x2A81 ;очистка знакоместной строки по координатам курсора - pop bc - ld (ix+0),c ;восстановление координат - ld (ix+1),b - ret - -;АДРЕС: #29D0 скроллинг строки данных окна -;вх: ix - адрес дескриптора окна -; hl - экранный адрес начала строки -; cy=1 скроллинг вниз -; =0 скроллинг вверх -; -x29D0 push hl - ld a,(ix+0) ;координата Y курсора - push af - jr c,x29DA - dec a - jr x29DB -x29DA inc a -x29DB ld (ix+0),a - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - pop af - ld (ix+0),a - ld e,l - ld d,h - pop hl - ld a,#08 ;копирование строки -x29EA ld b,#00 - ld c,(ix+5) ;ширина окна в знакоместах - push hl - push de - ldir - pop de - pop hl - inc h - inc d - dec a - jr nz,x29EA - ret - -;АДРЕС: #29FB скроллинг строки атрибутов окна -;вх: ix - адрес дескриптора окна -; hl - адрес атрибутов начала строки -; cy=1 скроллинг вниз -; =0 скроллинг вверх -; -x29FB push hl - ld a,(ix+0) - push af - jr c,x2A05 - dec a - jr x2A06 -x2A05 inc a -x2A06 ld (ix+0),a - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - pop af - ld (ix+0),a - ld e,l ;копирование строки атрибутов - ld d,h - pop hl - ld b,#00 - ld c,(ix+5) - ldir - ret - -;АДРЕС: #2A1B обработка управляющего кода #1E (скроллинг окна ввниз) -;вх: ix - адрес дескриптора окна -; -x2A1B ld c,(ix+0) - ld b,(ix+1) - push bc ;сохраним координаты курсора - ld (ix+1),#00 ;координата X=0 - ld b,(ix+4) ;высота окна - dec b - jr z,x2A4C ;высота =1 просто очищаем строку - dec b - ld (ix+0),b - inc b -;скроллим окно вниз -x2A31 push bc - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - scf - call x29D0 - bit 1,(ix+7) - jr z,x2A46 ;атрибуты не скроллим - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - scf - call x29FB ;скроллинг строки атрибутов окна -x2A46 dec (ix+0) - pop bc - djnz x2A31 -;очищаем верхнюю строку -x2A4C ld (ix+0),#00 ;crdY=0 - call x2A81 ;очистка строки по координатам курсора - pop bc ;восстановим координаты - ld (ix+0),c - ld (ix+1),b - ret - -;АДРЕС: #2A5B очистка окна пользователя (rst 8: db #83) -; -x2A5B call x300F ;читаем ix - -;АДРЕС: #2A5E обработка управляющего кода #0C (очистка текущего окна) -;вх: ix - адрес дескриптора окна -; -x2A5E xor a ;координаты курсора =0 - ld (ix+0),a - ld (ix+1),a - ld b,(ix+4) ;высота окна -x2A68 push bc ;очистка окна - call x2A85 ;очистка знакоместной строки по координатам курсора - pop bc - inc (ix+0) - djnz x2A68 - ld (ix+0),#00 ;crd X =0 - call x28E8 ;печать курсора - ret - -;очистка верхней знакоместной строки окна -x2A7A call x28B8 ;признак печати и восстановление экрана - ld (ix+1),0 ;crd Y =0 - -;очистка знакоместной строки по координатам курсора -x2A81 res 3,(iy+9) - -;АДРЕС: #2A85 очистка знакоместной строки по координатам курсора -x2A85 call x28B8 ;признак печати и восстановление экрана - call x297C ;расчет экранного адреса курсора в окне для символов 8 пикселей - ld a,(ix+5) ;ширина окна - sub (ix+1) - ld c,#08 ;очистка знакоместной строки - ld d,a ;ширина очищаемой части окна - ld e,l -x2A95 ld b,d - ld l,e -x2A97 ld (hl),#00 ;очистка пиксельной строки - inc l - djnz x2A97 - inc h - dec c - jr nz,x2A95 - push de - call x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - pop bc - ld d,(ix+6) ;атрибуты -x2AA8 ld (hl),d ;очистка атрибутной строки - inc hl - djnz x2AA8 - ret - -;АДРЕС: #2AAD обработка управляющего кода #04 (вывод с выравниванием) -;вх: ix - адрес дескриптора окна -; -x2AAD ld hl,xE01D - set 6,(hl) - set 7,(hl) - ld hl,xE1A6 - ld (xE3BC),hl - ret - -;АДРЕС: #2ABB расчет для выравнивания строки -;вх: ix - адрес дескриптора окна -; -x2ABB ld de,xE1A6 ;начало буфера - ld hl,(xE3BC) ;конец буфера - or a - sbc hl,de - ld b,l ;длина строки - ld a,(ix+#0B) ;размер окна в символах - sub l - ret - -;АДРЕС: #2ACA печать строки из буфера с выравниваем по центру окна #05 -;вх: ix - адрес дескриптора окна -; -x2ACA call x2ABB - srl a ;координата X печати в окне -;печать с выравниванием -x2ACF ld (ix+1),a ;a=crdX, b=длина строки - push bc - call x28B8 ;признак печати и восстановление экрана - pop bc - ld hl,xE1A6 ;печать строки -x2ADA ld a,(hl) - push hl - push bc - call x2800 ;печать символа в окне - pop bc - pop hl - inc hl - djnz x2ADA - ld hl,xE01D ;завершение управляющего кода #05 и #04 - res 6,(hl) - res 7,(hl) - ret - -;АДРЕС: #2AED печать строки из буфера с выравниваем по правому краюу окна #06 -;вх: ix - адрес дескриптора окна -; -x2AED call x2ABB - jr x2ACF - -;АДРЕС: #2AF2 обработка байта после управляющего кода #04 -;вх: ix - адрес дескриптора окна -; -x2AF2 bit 5,(hl) - jr nz,x2B57 ;обработка значения байта управляющего кода - bit 7,(hl) - jr z,x2AFE - cp #20 ;байт после кода #04 - jr c,x2B42 ;управляющий код -x2AFE ld hl,(xE3BC) ;печатный символ в буфер - ld (hl),a - inc hl - ld (xE3BC),hl - ret - -;АДРЕС: #2B07 возврат из п/п печати символа -x2B07 pop bc - pop de - pop hl - ret - -;АДРЕС: #2B0B печать символа со сбросом 7го бита (rst #10) -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -; -x2B0B push af - and #7F - jr x2B13 - -;АДРЕС: #2B10 печать пробела (rst #10) -;вх: ix - адрес дескриптора окна -; -x2B10 ld a,#20 - -;АДРЕС: #2B12 печать символа (rst #10) -;вх: ix - адрес дескриптора окна -; a - код символа/управляющий код -; -x2B12 push af -x2B13 call x2B18 - pop af - ret -;печать символа в окне. ix - адрес дескриптора окна, a - код символа/управляющий код -x2B18 push hl - push de - push bc - ld hl,x2B07 ;адрес возврата - push hl - ld hl,xE01D - bit 6,(hl) - jr nz,x2AF2 ;байт(ы) после управляющего кода - bit 5,(ix+7) - ret nz ;запрет вывода в окно - bit 4,(hl) - jp nz,x0950 ;вывод на принтер - cp #20 - jr c,x2B42 ;это управляющий код - call x27FD ;удаление курсора и печать символа в окне - ret nz ;следующие координаты печати не установлены - bit 4,(ix+7) - ret z - call x2B75 ;возрат каретки - jr x2B84 ;перевод строки со скроллингом вверх -;переход на п/п обработки управляющего кода -x2B42 ld hl,x27DC+#0A - ld bc,#000B - ld e,l - ld d,h - cpdr - ret nz ;код не найден - inc de - ex de,hl - sla c - add hl,bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - jp (hl) -;обработка значения байта управляющего кода -x2B57 bit 7,(hl) - jr nz,x2B5D ;если в рамках кода #04 - res 6,(hl) ;сброс признака управляющего кода -x2B5D res 5,(hl) - ld hl,(xE3B9) ;обработка значения байта управляющего кода - jp (hl) - -;АДРЕС: #2B63 установка адреса п/п обработки управляющего кода -; -x2B63 ld (xE3B9),hl - ld hl,xE01D - set 5,(hl) - set 6,(hl) - ret - -;АДРЕС: #2B6E обработка управляющего кода #0D (возврат каретки) -;вх: ix - адрес дескриптора окна -; -x2B6E bit 2,(ix+7) - call nz,x2B84 ;перевод строки со скроллингом вверх -;возрат каретки -x2B75 call x28B8 ;признак печати и восстановление экрана - xor a - ld (ix+1),a ;crdX =0 - ret - -;АДРЕС: #2B7D обработка управляющего кода #0A (перевод строки) -;вх: ix - адрес дескриптора окна -; -x2B7D bit 3,(ix+7) - call nz,x2B75 ;возрат каретки -;перевод строки со скроллингом вверх -x2B84 call x2B8E ;перевод строки - ret nz ;перевод строки выполнен - call x28B8 ;признак печати и восстановление экрана - jp x298E ;скроллинг окна вверх -;перевод строки -x2B8E ld a,(ix+4) ;высота окна - dec a - cp (ix+0) - ret z ;в последней строке нет перевода строки - call x28B8 ;признак печати и восстановление экрана - inc (ix+0) ;координата Y+1 - ret - -;АДРЕС: #2B9D установка начальных координат -;вх: ix - адрес дескриптора окна -; -x2B9D call x28B8 ;признак печати и восстановление экрана - xor a - ld (ix+1),a - ld (ix+0),a - ret - -;АДРЕС: #2BA8 короткий звуковой сигнал c установкой бордюра -; -x2BA8 push de - ld de,#7060 - push bc - push af - ld a,(xE053) - push af -x2BB2 out (#FE),a - xor #10 - push af - ld a,r - and #01 - add a,e - ld b,a - djnz $ - pop af - dec d - jr nz,x2BB2 - pop af - out (#FE),a - pop af - pop bc - pop de - ret - -;АДРЕС: #2BCA обработка управляющего кода #1B (позиционирование курсора внутри окна) -;вх: ix - адрес дескриптора окна -; -x2BCA ld hl,x2BD0 - jp x2B63 -;установка координаты Y курсора -x2BD0 ld c,(ix+0) - cp (ix+4) - jr nc,x2BD9 ;за пределами она - ld c,a -x2BD9 ld a,c - ld (xE3BB),a - ld hl,x2BE3 - jp x2B63 -;установка координаты X курсора -x2BE3 call x28B8 ;признак печати и восстановление экрана - ld c,(ix+#0B) ;ширина окна в символах - dec c - cp c - jr nc,x2BEE ;за пределами она - ld c,a -x2BEE ld (ix+1),c - ld a,(xE3BB) - ld (ix+0),a - ret - -;АДРЕС: #2BF8 обработка управляющего кода #01 (установка атрибутов) -;вх: ix - адрес дескриптора окна -; -x2BF8 ld a,(ix+6) ;сохраним текущие атрибуты - ld (xE3B4),a - ld hl,x2C04 - jp x2B63 -x2C04 or (ix+6) ;маска устанавливаемых атрибутов - ld (ix+6),a - ld hl,x2C10 - jp x2B63 -x2C10 cpl ;маска сбрасываемых атрибутов - and (ix+6) - ld (ix+6),a - ret - -;АДРЕС: #2C18 обработка управляющего кода #02 (восстановление атрибутов) -;вх: ix - адрес дескриптора окна -; -x2C18 ld a,(xE3B4) - ld (ix+6),a - ret - -;АДРЕС: #2C1F определение турбо-режима -;вых: nz - турбо включен -; z - выключен -; -x2C1F xor a - ld h,a - ld e,#0E - inc a -x2C24 or a - jr z,x2C2E - dec h - jr nz,x2C24 - dec e - jr nz,x2C24 - inc e -x2C2E di - ret - -;АДРЕС: #2C30 определение турбо-режима вкл/выкл -; -x2C30 bit 7,(iy+#19) - ret z ;турбо-режим недоступен - call x3B75 ;определение типа прерываний im 1/2 - push af - im 1 - ei - call x2C1F ;определение турбо-режима - ld hl,xE02D - res 6,(hl) - jr z,x2C48 ;турбо выключено - set 6,(hl) -x2C48 pop af - ret nz - im 2 - ret - -;АДРЕС: #2C4D копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -;вх: a - номер дисковода -; -x2C4D and #03 - ld (xFFCA),a ;номер текущего дисковода - push hl - ld l,a - rlca - rlca - ld h,a - rlca - rlca - add a,h - add a,l ;a=a*#15 - ld hl,(xE9F3) ;адрес блока описателей дисковода - add a,l - ld l,a - jr nc,x2C63 - inc h ;hl адрес блока описателя текущего дисковода -x2C63 ld a,(hl) - or a - jr z,x2C75 ;нет примонтированного образа - push de ;копируем дескриптор дисковода в рабочий буфер - ld de,xE590 - push bc - ld bc,#0015 - ldir - pop bc - pop de - pop hl - ret -x2C75 ld (xE590),a - pop hl - ret - -;АДРЕС: #2C7A чтение байта по адресу #00FB -x2C7A ld a,(x00FB) - ret - -;АДРЕС: #2C7E поиск и вызов процедуры обработки без возврата(если не найдено -; возврат) -x2C7E pop hl - jr x2C83 -x2C81 inc hl - inc hl -x2C83 ld e,(hl) - inc e - jr z,x2C90 ;конец списка. выход - cp (hl) - inc hl - jr nz,x2C81 ;не сответствует коду клавиши - ld e,(hl) - inc hl - ld d,(hl) - dec de - ex de,hl -x2C90 inc hl - jp (hl) - -;АДРЕС: #2C92 выполнение одной команды ассемблера с контролем ловушек -x2C92 call x17F0 ;выполнение одной команды по адресу в PC - call x328B ;проверка срабатывания ловушки - ld e,#FF - jp nc,x019D ;ловушка сработала -x2C9D ld a,(xE02A) - and #7F - bit 2,a - ret nz ;не обновлять экран монитора - ld (xE01E),a - -;АДРЕС: #2CA8 печать/обновление монитора-отладчика -x2CA8 call x0550 ;сохранение экрана из страницы 5 - -;обновление окна регистров - call x3000 - bit 0,(iy+#0A) - jr nz,x2CE9 ;ОШИБКА!!! должно быть x2CEC - call x2A5E ;очистка текущего окна - rst #20 - db "IR" - db #1B,#08,#0A ;crd Y,X - db "SZ-H-PNC" - db #0D,#0D - db "INT RAM ROM SCR" - db #1B,#00,#0B ;crd Y,X - dc "ZX " - bit 5,(iy-#02) - jr z,x2CE6 ;128K - rst #20 ;only 48k - dc "4" - jr x2CE9 -x2CE6 rst #20 - dc "12" -x2CE9 rst #20 - dc "8k" -x2CEC ld (ix+0),#00 ;crd Y =0 - ld (ix+1),#04 ;crd X =4 - ld hl,(xDD83+#01) ;регистры i,r пользователя - call x16DE ;печать числа - inc (ix+0) ;crd Y +1 - ld (ix+1),#00 ;crd X =0 - call x2D70 ;печать названия регистра, его значения и области памяти адресуемой этим регистром - ld (ix+0),#09 ;crd Y =9 - call x2DF6 ;;печать названия регистра af, его значения флагов в двоичном виде - - ld hl,xE01E ;iy+#0A - set 1,(hl) ;не обновлять содержимое регистров - set 2,(hl) ;не обновлять экран монитора - - ld (ix+0),#0B ;печать режима прерываний разрешены/запрещены - ld hl,x0FA0 ;on - ld a,(xDD83) - and #04 - jr nz,x2D23 -x2D20 ld hl,x0FA2 ;off -x2D23 call x15C7 ;печать сообщения из hl -x2D26 call x2B10 ;печать пробела - ld (ix+1),#05 ;печать номера страницы ОЗУ - ld a,(xE012) - and #07 - ld c,a - ld a,(xE012+1) - rrca - and #08 - or c - call x16EC ;печать числа a=[#0..#F] - ld (ix+1),#09 ;печать номера страницы ПЗУ - ld a,(xE012) - rrca - rrca - rrca - rrca - and #01 - call x16EC ;печать числа a=[#0..#F] - ld (ix+1),#0D ;печать номера экрана - ld c,#35 - ld a,(xE012) - and #08 - jr z,x2D5C - ld c,#37 -x2D5C ld a,c - rst #10 - - ld (iy+6),4 - call x2E38 ;обновление окна дампа памяти - call x2F30 ;обновление окна дизассемблера - - ld hl,xE01E ;iy+#0A - ld a,(hl) ;установка флагов - or %01010001 - ld (hl),a - ret - -;печать названия регистра, его значения и области памяти адресуемой этим регистром -x2D70 bit 1,(iy+#0A) - ret nz - ld hl,x0F91 - ld c,(iy+#0C) - ld b,#07 - ld de,xDD6B - jr x2D85 -x2D82 inc (ix+0) -x2D85 ld a,#03 - cp b - jr nz,x2D93 - bit 0,(iy+#0B) - jr z,x2D93 - ld de,xDD79 ;отображаются регистры альтернативного набора -x2D93 sla c - jr nc,x2D9B - inc hl ;этот регистр не выводим - inc hl - jr x2DDF -x2D9B bit 2,(iy+#0A) - jr nz,x2DAE ;название регистра не печатать - call x15C7 ;печать названия регистра - ld a,#03 - cp b - jr c,x2DB0 - call x2DE8 ;печать признака альтернативного набора регистров - jr x2DB0 -x2DAE inc hl - inc hl -x2DB0 ld (ix+1),4 ;crd X =4 - push hl - push de -;печать значения регистра - ex de,hl - ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl-значение регистра - call x16DE ;печать числа -;печать содержимого памяти адресуемой текущим регистром - bit 3,(iy+#0A) - jr nz,x2DDD ;содержимое памяти адресуемой текущим регистром не печатать - push bc - ld bc,#0004 - ld de,xDDAC - push de - call x0753 ;сохранение области памяти в ram 8 - pop hl - ld b,#04 -x2DD2 inc (ix+1) - ld a,(hl) - call x16E3 ;печать числа a=[#00..#FF] - inc hl - djnz x2DD2 - pop bc -x2DDD pop de - pop hl -;следующий регистр -x2DDF inc de - inc de - ld (ix+1),#00 - djnz x2D82 - ret -;печать признака альтернативного набора регистров -x2DE8 bit 0,(iy+#0B) -x2DEC ld a," " - jp z,x2B12 ;печать символа - ld a,#27 ;' - jp x2B12 ;печать символа - -;печать названия регистра af, его значения флагов в двоичном виде -x2DF6 ld b,(iy+#0A) - bit 1,b - ret nz ;все регистры в мониторе не выводятся - bit 0,(iy+#0C) - ret nz ;регистр af не выводится - bit 2,b - ld b,(iy+#0B) - jr nz,x2E10 ;название регистра не печатать - rst #20 ;печать названия регистра - dc "AF" - bit 1,b - call x2DEC -x2E10 ld (ix+1),#04 ;crd X =4 - bit 1,b ;;печать значения af/af' - ld hl,(xDD7F) - jr z,x2E1E - ld hl,(xDD81) -x2E1E call x16DE ;печать числа hl=[#0000..#FFFF] - ld (ix+1),#0A ;crd X =10 - -;АДРЕС: #2E25 печать байта в двоичном виде -;вх: l - байт -; -x2E25 ld b,#08 ;печать значения f/f' в двоичном виде -x2E27 ld a,#30 - sla l - jr nc,x2E2E - inc a -x2E2E call x2B12 ;печать символа - djnz x2E27 - ld (ix+1),#00 ;crd X =0 - ret - -;АДРЕС: #2E38 печать дампа памяти в окне -; -x2E38 bit 4,(iy+#0A) - ret nz - -;АДРЕС: #2E3D печать дампа памяти в окне -; -x2E3D call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - call x2E9D ;;определение нового адреса начала дампа от смещения курсора - bit 5,(iy+#0A) - call z,x2F74 ;обновим дизасм под курсором в дампе - call x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - call x2B9D ;установка начальных координат Y=0,X=0 -;печать дампа памяти - ld hl,(xDD87) - ld b,#08 -x2E55 push bc - call x2EBA ;печать одной строки дампа памяти в окне - inc (ix+0) - pop bc - djnz x2E55 -;печать курсора на текущей ячейке дампа - ld bc,#3E3C ;>< (коды двух символов курсора) - ld hl,(xDD69) -x2E65 call x2E7E ;расчет координат печати курсора в окне дампа памяти - ld a,b ;печать курсора - call x2B12 ;печать символа - inc (ix+1) - inc (ix+1) - ld a,c - jp x2B12 ;печать символа - -;АДРЕС: #2E76 удаление курсора на предыдущей ячейке дампа -x2E76 ld bc,#2020 - ld hl,(xDD89) - jr x2E65 - -;расчет координат печати курсора в окне дампа памяти -;вх: hl адрес текущей ячейки в дампе памяти -x2E7E ld (xDD89),hl - ld de,(xDD87) - or a - sbc hl,de ;смещение в дампе от начала отображения - ld a,l - and #07 - ld h,a - add a,a - add a,h - add a,#07 - ld (ix+1),a ;crd X - ld a,l - and #38 - rra - rra - rra - ld (ix+0),a ;crd Y - ret - -;определение нового адреса начала дампа от смещения курсора -x2E9D call x2E76 ;удаление курсора на предыдущей ячейке дампа - ld hl,(xDD87) ;адрес начала дампа памяти - ld de,(xDD69) ;адрес текущей ячейки в дампе памяти - ld bc,#003F - or a - sbc hl,de - ret z ;позиция курсора в дампе не изменилась - jr nc,x2EB2 ;нужен скроллинг - add hl,bc - ret c ;скроллинг не нужен -x2EB2 ld hl,#FFE8 - add hl,de - ld (xDD87),hl ;новый адрес начала дампа - ret - -;АДРЕС: #2EBA печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начала дампа) -;вых: hl - следующий адрес памяти (начала дампа) -; -x2EBA ld (ix+1),#02 ;crd X =2 - -;АДРЕС: #2EBE печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начала дампа) -;вых: hl - следующий адрес памяти (начала дампа) -; -x2EBE call x16DE ;печать адреса начала дампа памяти hl=[#0000..#FFFF] - call x2F22 ;если вывод на принтер, печатаем пробел - call x2F22 ;если вывод на принтер, печатаем пробел - ld de,xDDAC - ld bc,#0008 - push de - call x0753 ;сохранение области памяти в ram 8 - pop de - push de ;печать строки дампа - ld b,#08 - call x2EE6 - pop de - call x2F22 ;если вывод на принтер, печатаем пробел - ld b,#08 - call x2EF1 ;печать строки символов дампа памяти - ld (ix+1),#00 - ret -;печать строки дампа -x2EE6 ld a,(de) - inc de - call x16E3 ;печать числа a=[#00..#FF] - call x2F22 ;если вывод на принтер, печатаем пробел - djnz x2EE6 - ret -;печать строки символов дампа памяти -x2EF1 ld c,(iy+#05) -x2EF4 ld a,(de) - inc de - bit 7,c - jr nz,x2F02 - and #7F - cp #20 - jr nc,x2F02 - ld a,#2E ;. -x2F02 bit 4,(iy+#09) - jr nz,x2F14 ;вывод на принтер - push bc - push de - push hl - call x27FD ;удаление курсора и печать символа в окне - pop hl - pop de - pop bc - djnz x2EF4 - ret -x2F14 and #7F ;вывод на принтер - cp #20 - jr nc,x2F1C - ld a,#2E ;. -x2F1C call x2B12 ;печать символа - djnz x2EF4 - ret -;если вывод на принтер, печатаем пробел -x2F22 inc (ix+1) - bit 4,(iy+#09) - ret z - dec (ix+1) - jp x2B10 ;печать пробела - -;обновление окна дизассемблера -x2F30 ld b,(iy+#0A) - bit 6,b - ret nz ;не надо обновлять - bit 0,b - jr nz,x2F47 - ld hl,#5830 ;подсветка текущей строки дизассемблера - ld (hl),%00110000 - ld bc,#000F - ld de,#5831 - ldir -x2F47 ld hl,xE091 - call x301C ;ix = дескриптор окна монитора: дизассембер - bit 0,(iy+#0A) - call nz,x298E ;скроллинг окна вверх - ld (ix+0),#01 ;crd Y =1 - ld (ix+1),#00 ;crd X =0 -; печать дизассемблированных команд - ld hl,(xDD6B) ;значение pc программы пользователя - ld b,#05 - bit 2,(iy+#05) - jr z,x2F69 - ld b,#01 -x2F69 push bc - call x2F80 ;печать одной строки дизасма - inc (ix+0) - pop bc - djnz x2F69 - ret - -;АДРЕС: #2F74 вывод дисасма памяти по адресу в de -;вх: de - адрес памяти -x2F74 call x3000 ;ix = адрес дескриптора окна монитора: регистры - ld (ix+0),#0B - ld (ix+1),#15 - ex de,hl - -;печать одной строки дизасма -;вх: hl - адрес памяти -x2F80 call x16DE ;печать адреса памяти hl=[#0000..#FFFF] - call x2F96 ;анализ команды ассемблера по адресу в hl - push hl - ld hl,xDDB7 ;текстовая строка с командой дизасма - call x1512 ;печать команды ассемблера - call x2FED ;печать пробелов до правого края окна - pop hl - ld (ix+1),#00 - ret - -;АДРЕС: #2F96 анализ команды ассемблера -;вх: hl - адрес команды ассемблера для дизасма -x2F96 ld (xDDAA),hl - push hl - ld de,xDDAC - ld bc,#0004 - call x0753 ;сохранение области памяти в ram 8 - call x197F ;анализ команды ассемблера - pop hl - add hl,bc - ld (xDDAA),hl ;адрес следующей команды - ret - -;АДРЕС: #2FAC печать строки дизасма -;вх: a - -x2FAC bit 0,(iy+#05) -;печать адреса команды - push af - call z,x16DE ;печать числа hl=[#0000..#FFFF] - pop af - ld c,l - ld b,h - ld (iy+#08),#20 - call nz,x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами -;печать команды ассемблера - call x2F96 ;анализ команды и преобразование в строку для печати - push hl - push bc - ld hl,xDDB7 - call x1512 ;печать команды ассемблера - pop bc -;вывод дополнительной информации - bit 1,(iy+#05) - jr z,x2FEB - ld a,#17 - call x2FF1 ;печать пробелов до заданной координаты X - ld a,";" - rst #10 - ld b,c - push bc - ld de,xDDAC - push de - call x2EE6 ;печать строки дампа - ld a,#25 - call x2FF1 ;печать пробелов до заданной координаты X - pop de - pop bc - call x2EF1 ;печать пробелов до заданной координаты X -x2FEB pop hl - ret - -;АДРЕС: #2FED печать пробелов до правого края окна -;вх: a - crd X -x2FED ld a,(ix+#0B) - dec a - -;АДРЕС: #2FF1 печать пробелов до заданной координаты X -;вх: a - crd X -x2FF1 ld b,(ix+1) ;crd X - sub b - ret z - ret c - ld b,a - jp x15F3 ;печать нескольких провелов (в B) - -;АДРЕС: #2FFB ix = адрес дескриптора окна монитора: дескриптор окна: ввод числа -x2FFB ld hl,xE0E5 - jr x301C - -;АДРЕС: #3000 ix = адрес дескриптора окна монитора: регистры -x3000 ld hl,xE075 - jr x301C - -;АДРЕС: #3005 установка текущим окна: main menu -x3005 ld hl,xE0C9 - jr x301C - -;АДРЕС: #300A ix = адрес дескриптора окна монитора: вывод на принтер -x300A ld hl,xE067 - jr x301C - -;АДРЕС: #300F чтение содержимого регистра ix основной программы -x300F ld hl,(xDD6F) - jr x301C - -;АДРЕС: #3014 ix = адрес дескриптора окна монитора: ввод строки низу экрана -x3014 ld hl,xE083 - jr x301C - -;АДРЕС: #3019 ix = адрес дескриптора окна монитора: дамп памяти -x3019 ld hl,xE09F - -;АДРЕС: #301C ix = адрес дескриптора окна монитора из hl -x301C ld (xE3B7),hl - push hl - pop ix - ret - -;АДРЕС: #3023 ожидание действий пользователя (опрос управления, вывод часов) -x3023 push hl - push de - push bc - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop bc - pop de - pop hl - ret - -;АДРЕС: #302E ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне -x302E ld e,(ix+7) - set 0,(ix+7) ;не выводить символ курсора - call x3023 - ld (ix+7),e - ret - -;АДРЕС: #303C выполнение команды, на которую указывает PC (cs+3) -x303C xor a - jr x3041 - -;АДРЕС: #303F выполнение команды, на которую указывает PC с быстрым выполнением -; подпрограмм (cs+4) -x303F ld a,#80 -x3041 bit 1,(iy+#12) - jr z,x3049 ;экран не сохранен в ram 8 - or #01 -x3049 ld (xE02A),a - call x2C92 ;выполнение одной команды ассемблера с контролем ловушек - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3052 заглушка входа в монитор при несовпадении контрольной суммы -x3052 di - call x305B - ld hl,x0040 - push hl - ret - -;АДРЕС: #305B блокировка работы при ошибке контрольной суммы -x305B ld hl,x3052 - ld (xC064),hl ;блокируем вызов NMI - pop de ;адрес откуда пришли - ld sp,hl ;стэк в ПЗУ ???? - ex de,hl - jp (hl) ;вернемся - -;АДРЕС: #3065 установка регистров для загрузки/сохранения -;вх: hl - адрес строки -;вых: de - буфер для дисковых операций -; ix - буфер fcb -x3065 call x0EE6 ;поиск в строке первого печатного символа - ld (iy+#0A),#00 ;обновить на экране весь отладчик - ld de,xE8A9 ;буфер для дисковых операций -x306F ld ix,xE7A9 ;буфер fcb - ret - -;АДРЕС: #3074 Команда: ERAse filespec -; удаление заданного файла с диска -x3074 call x3065 ;установка регистров для работы с диском - rst #30 - dw rom7_x14C0 ;R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl - db #07 -x307B jp nc,x0AFB ;ошибок нет. обновление отладчика -x307E rst #30 - dw rom6_x066C ;установка код дисковой ошибки в переменной для печати числа - db #06 -x3082 jp x0B06 ;обновление отладчика - -;АДРЕС: #3085 Команда: SAVE filespec start,length -; запись на диск заданной последовательности байт -x3085 ld b,#02 - call x309F ;определение адреса загрузки/сохранения и размера данных - call x3107 ;запись области памяти в файл -x308D jr c,x307E ;ошибка диска. выход - rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 - jr x307B ;выход в отладчик - -;АДРЕС: #3095 Команда: LOAD filespec [start[,length]] -; загрузка с диска заданной последовательности байт -x3095 ld b,#01 - call x309F ;определение адреса загрузки/сохранения и размера данных - call x30D8 ;чтение файла в память - jr x308D ;выход в отладчик - -;определение адреса загрузки/сохранения и размера данных -;вх: b - способ открытия файла -;вых: hl - адрес загрузки -; bc - размер загружаемого файла -x309F call x3065 ;установка регистров для работы с диском - rst #30 - dw rom7_x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - db #07 - jr c,x307E ;ошибка диска - call x0EBA ;выделение из строки числовых операндов (не более 6) - cp #02 - jr z,x30BB ;два параметра - jr nc,x30D4 ;слиишком много параметров. выход - bit 0,(ix+#17) - jr nz,x30BB ;файл для чтения - ld a,#0A ;сообщение: too few operands - jr x3082 ;выход. мало параметров для записи -x30BB push hl - push de - push af - rst #30 - dw rom7_x11DF ;открыть файл для последующих операций с ним - db #07 - jr c,x307E ;ошибка диска - ld e,c - ld d,b ;длина файла в байтах - pop af - pop hl - pop bc - cp #01 - jr z,x30D1 ;только один параметр: адрес загрузки - ret nc ;два параметра. запись файла - ld hl,(xE7A9+#09) ;адрес загрузки из заголовка файла -x30D1 ld b,d - ld c,e ;длина файла в байтах - ret -x30D4 ld a,#0B ;сообщение: too many operands - jr x3082 - -;АДРЕС: #30D8 чтение файла в память -;вх: ix - адрес буфера fcb -; hl - адрес загрузки -; bc - размер загружаемого файла -;вых: cy=1 ошибки записи -; a - код ошибки -x30D8 ld a,b - or a - jr z,x30F4 ;менее сектора -;чтение целых секторов -x30DC push bc - push hl - rst #30 - dw rom7_x1365 ;R8DOS #1C(28) последовательное чтение очередного сектора из файла - db #07 - pop hl - pop bc - ret c ;ошибка диска - push bc - ld de,xE8A9 ;буфер для загрузки - ex de,hl - ld bc,#0100 - call x0749 ;копирование сектора в память пользователя - ex de,hl - pop bc - djnz x30DC - -x30F4 ld a,c - or a - ret z ;закончилась загрузка -;чтение неполного сектора -x30F7 push hl - push bc - rst #30 - dw rom7_x1240 ;R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - db #07 - pop bc - pop hl - ret c ;ошибка диска - rst #00 ;запись байта в память пользователя - inc hl - dec c - jr nz,x30F7 - or a - ret - -;АДРЕС: #3107 запись области памяти в файл -;вх: ix - адрес буфера fcb -; hl - адрес начала области памяти -; bc - длина области памяти -;вых: cy=1 ошибки записи -; a - код ошибки -x3107 ld (xE7B2),hl ;стартовый адрес - ld a,b - or a - jr z,x3122 ;1 сектор -; запись целых секторов области памяти -x310E push bc - ld de,xE8A9 ;буфер для сохранения - ld bc,#0100 - call x0753 ;сохранение области памяти в ram 8 - push hl - rst #30 - dw rom7_x1395 ;R8DOS #1D(29) последовательная запись одного сектора из памяти - db #07 - pop hl - pop bc - ret c ;ошибка записи - djnz x310E -x3122 ld a,c - or a - ret z ;область памяти кратна размеру сектора -x3125 push hl - push bc - rst #28 ;чтение байта из памяти пользователя - rst #30 - dw rom7_x128C ;R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" - db #07 - pop bc - pop hl - ret c ;ошибка записи - inc hl - dec c - jr nz,x3125 - or a - ret - -;АДРЕС: #3135 подсчет контрольной суммы страницы -;вых: hl=#00F6 -x3135 xor a - ld l,a - ld h,a ;hl=#0000 - ld bc,#00F6 - push bc - call x315A - inc hl ;hl=#00F7, a=#6D - ld bc,#000D - call x315A ;hl=#0104, a=#A5 - ld de,#000C - add hl,de ;hl=#0110 - ld bc,#3EF0 - call x315A ;a=#80 - pop hl ;hl=#00F6 - cp (hl) - jp z,x04D9 ;контрольная сумма совпала.выключим турбои возврат - call x305B ;блокировка работы при ошибке контрольной суммы - jr x3135 ;вечный цикл -x315A add a,(hl) - cpi - jp pe,x315A ;пока bc<>0 - ret - -;АДРЕС: #3161 список команд отладчика -x3161 dc "Help" - dc "?" - dc "III" - dc "OOO" - dc "CMOS" - dc "RESNVRAM" - db #00 -x3179 dw x3AD0: db %00000000 ;Help - dw x3389: db %00000001 ;? - dw x318C: db %00000000 ;III - dw x3194: db %00000000 ;OOO - dw x319C: db %00000000 ;CMOS - dw x31A4: db %00000000 ;RESNVRAM - db #00 - -;АДРЕС: #318C Команда III (работа с контроллером прерываний) -x318C rst #30 - dw rom7_x16B9 ;работа с контроллером прерываний - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3194 Команда OOO (работа с контроллером прерываний) -x3194 rst #30 - dw rom7_x0DC7 ;запись всей памяти NVRAM из памяти #7530 - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #319C Команда CMOS (работа с контроллером прерываний) -x319C rst #30 - dw rom7_x0DAD ;чтение всей памяти NVRAM в память #7530 - db #07 - ret c ;ошибка - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #31A4 Команда RESNVRAM (что-то пишет в NVRAM) -x31A4 rst #30 - dw rom7_x0E72 ;что-то пишет в NVRAM - db #07 - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #31AB Команда: SLOW type автоматическая трассировка -;вх: de - параметры команды -x31AB ld a,d - or a - ld a,#2C ;сообщение: bad operand - ret nz - ld (iy+#16),e - ld hl,(xDD6B) ;pc программы пользователя - call x18C0 ;восстановление памяти пользователя и исполнение слов анализатора st0-st9 -x31B9 call x2C92 ;выполнение одной команды ассемблера с контролем ловушек - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - jr x31B9 - -;АДРЕС: #31C1 Команда: LISTBreak/LBreak -; вывод на экран информации о ловушках -x31C1 ld hl,xE52D - ld de,#2827 - ld bc,x31FC - ld a,#09 - push bc - push af - push hl - push de - call x3A95 ;подготовка переменных к выводу на экран/принтер - ld b,e - ld c,#00 ;сообщение: curent breackpoint selections: - rst #08 - rst #20 - db #0D,#8D - pop bc - ld c,#00 ;сообщение: no address bank type state init count word - rst #08 - rst #20 - db #0D,#8D - pop hl - pop de - ld e,#01 - pop bc -;hl - адрес ловушки -;d - количество ловушек+1 -;e =#01 номер текщей ловушки -;bc адрес п/п -x31E6 push de - push bc - call x3A93 ;вызов п/п по адресу в bc - call (bc) - jr c,x31F9 ;закончена печать - call x37B9 ;управление выводиммым листингом (опрос клавиш space, s, cs+1) - rst #20 - db #8D - pop bc - pop de - inc e - ld a,d - cp e - jr nz,x31E6 -x31F9 ld a,#81 ;сообщение: enter command - ret -;печать информации об одной ловушке -x31FC rst #30 - dw rom6_x0156 ;печать информации о ловушке - db #06 - ret - -;АДРЕС #3201 печать ON/OFF от флага nz-ON/z-OFF -x3201 push hl - jr nz,x320A - rst #20 - dc "OFF" - pop hl - ret -x320A rst #20 - dc "ON " - pop hl - ret - -;АДРЕС: #3210 определение адреса ловушки -;вх: a - номер ловушки -;вых: de - адрес ловушки -; hl - адрес ячейки с адресом ловушки -; z - нет ловушки -x3210 ld de,xE9BD - ld l,a - ld h,#00 - add hl,hl ;a*2 - add hl,de ;hl=xE9BD + a*2 - ld e,(hl) - push hl - inc hl - ld d,(hl) - ld l,a - ld a,d - or e - ld a,l - pop hl - ret - -;АДРЕС: #3222 восстановление памяти пользователя под всеми ловушками -x3222 res 7,(iy+#0B) - jr x322C - -;АДРЕС: #3228 сохранение памяти пользователя под всеми ловушками и установка ловушек -x3228 set 7,(iy+#0B) -x322C call x3281 ;установка начала списка breackpoint`ов -x322F call x326C ;проверка наличия текущей ловушки - jr nc,x3267 ;нет ловушки с этим номером - call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - exx - ld a,h - exx - and #C0 - jr z,x3250 ;адрес ловушки [#0000..#3FFF] - bit 5,(iy-#02) - jr z,x324B ;zx128k - call x3707 ;zx48k сравнение страницы пользователя с заданной - exx - jr nz,x3264 - exx -x324B push bc - call x3732 ;установка страницы пользователя равной номеру страницы в L - pop bc -x3250 exx - bit 7,(iy+#0B) - jr z,x3260 - rst #28 ;чтение байта из памяти пользователя - ld (ix+4),a ;сохраним байт в описании ловушки - ld a,#CF ;rst 8 - rst #00 ;запись байта в память пользователя - jr x3264 ;установка байта ловушки -x3260 ld a,(ix+4) ;восстановление памяти пользователя под ловушкой - rst #00 ;запись байта в память пользователя -x3264 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x3267 add ix,de ;следующая ловушка - djnz x322F - ret - -;проверка наличия текущей ловушки -;вых: cy=0 нет ловушки -; =1 есть ловушка -; hl' - адрес ловушки -; l - логический номер страницы с ловушкой -; -x326C ld a,(ix+0) - rlca - ret nc - ccf - bit 1,a - ret nz - ld l,(ix+2) - ld h,(ix+3) - exx - ld l,(ix+1) - ccf - ret - -;АДРЕС: #3281 установка начала списка ловушек -x3281 ld ix,xE52D - ld b,#08 ;количество блоков - ld de,#000B ;длина одного блока - ret - -;АДРЕС: #328B проверка срабатывания ловушки -;вх: hl - адрес PC пользователя -;вых: cy=1 нет сработавших ловушек -; =0 ловушка сработала -> ix адрес ловушки -; de=#000B -; b - обратный номер ловушки -x328B call x3281 ;установка начала списка ловушек -x328E ld a,(ix+#00) - rlca - jr nc,x32A9 ;ловушки нет - exx - ld l,(ix+#01) - call x3707 ;сравнение страницы пользователя с заданной в l - exx - jr nz,x32A9 ;не та страница - ld a,(ix+#02) - cp l - jr nz,x32A9 ;не тот адрес - ld a,(ix+#03) - cp h - ret z ;ловушка сработала -x32A9 add ix,de - djnz x328E - scf - ret - -;АДРЕС: #32AF Команда: DELBreak number -; удаление информации о ловушке с номером number -x32AF call x32C2 ;проверка номера и определение адреса описания ловушки - ld (ix+#00),#00 - ld a,(xDD99) ;номер ловушки - call x3210 - xor a - ld (hl),a - inc hl - ld (hl),a - jr x32FB ;возврат в отладчик - -;проверка номера и определение адреса описания ловушки -;вх: de - номер ловушки [1..8] -;вых: ix - адрес ловушки -; z - ловушка не задана -x32C2 push af - dec e - ld a,e - and #F8 - or d - ld a,#22 ;сообщение: invalid number breackpoint - jr nz,x3300 ;выход в отладчик - push hl - ld l,e - ld h,d - add hl,hl - add hl,hl - add hl,de - add hl,hl - add hl,de ;hl=hl*11 - ld de,xE52D - add hl,de ;адрес ловушки - push hl - pop ix - pop hl - pop af - bit 6,(ix+#00) - ret - -;АДРЕС: #32E2 Команда: BRK number, [on|off] -; включение (on)/выключение (off) ловушки -x32E2 call x32C2 ;проверка номера и определение адреса описания ловушки - ld a,#26 ;сообщение: breackpoint undefined - jr z,x3300 ;ловушка не определена. выход в отладчик - ld a,l - and #FE - or h - ld a,#23 ;сообщение: invalid state breackpoint - jr nz,x3300 ;неверный параметр. выход в отладчик -x32F1 sla (ix+#00) - srl l - rr (ix+#00) -x32FB ld a,#81 ;сообщение: enter command - ret - -;ошибка мало параметров. выход в отладчик -x32FE ld a,#0A ;сообщение: too few operands -x3300 jp x0B06 ;обновление отладчика - -;АДРЕС: #3303 Команда: BREak number, type, addr, int_count[,bank] -; установка ловушки на адрес addr -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x3303 call x32C2 ;проверка номера и определение адреса описания ловушки - rst #30 - dw rom6_x01E4 ;установка новой ловушки в отладчике - db #06 - ret - -;АДРЕС: #330B установка ловушки #8, по текущему адресу листинга дизасма -x330B ld de,#0008 ;номер ловушки - ld bc,(xDD8B) ;адрес памяти - ld a,b - and #C0 - ld hl,#0001 ;тип ловушки - ld (xDD99+#06),hl ;4й параметр, счетчик - jr z,x331E ;адрес в ПЗУ - dec hl -x331E ld a,#04 ;кол-во параметров - call x3303 ;Команда: BREak number, type, addr, int_count[,bank] -x3323 jp x3960 - -;АДРЕС: #3326 удаление ловушки #8 -x3326 ld de,#0008 - call x32C2 ;проверка номера и определение адреса описания ловушки - ld l,#00 - call x32F1 ;удаление ловушки - jr x3323 - -;АДРЕС: #3333 Команда: OPTion bit on|off -; задание некоторых режимов монитора (переменная xE019) -x3333 ld a,e - and #F8 - or d - ld a,#0D ;сообщение: known number - ret nz ;неверный номер бита. выход в отладчик - ld a,l - and #FE - or h - ld a,#17 ;сообщение: illegal value operand - ret nz ;неверное значение бита. выход в отладчик -;определение маски по номеру бита - inc h - ld a,e -x3343 or a - jr z,x334B - dec a - sla h - jr x3343 -;установка/сброс бита -x334B ld a,h - bit 0,l - jr nz,x335B - xor #FF - and (iy+#05) -x3355 ld (iy+#05),a - ld a,#81 ;сообщение: enter command - ret -x335B or (iy+#05) - jr x3355 - -;АДРЕС: #3360 Команда: OUT addr, data -; запись байта данных data в порт ввода/вывода -x3360 ld a,h - or a - ld a,#11 ;сообщение: number too big - ret nz ;в порт можно вывести только байт - ld c,e - ld b,d - out (c),l -x3369 ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #336C Команда: OUTD addr, data -; запись байта данных data в порт ввода/вывода в адресном пространстве trdos -x336C ld a,h - or a - ld a,#11 ;сообщение: number too big - ret nz ;в порт можно вывести только байт - ld c,e - ld b,d - ld a,l - rst #30 - dw rom3_x3FF0 ;вывод в порт - db #03 - jr x3369 - -;АДРЕС: #337A Команда: IND addr -; чтение байта из порта ввода/вывода в адресном пространстве trdos -x337A ld c,e - ld b,d - rst #30 - dw rom3_x3FF3 ;чтение порта - db #03 - ld e,a - jr x3387 - -;АДРЕС: #3383 Команда: IN addr -; чтение байта из порта ввода/вывода -x3383 ld c,e - ld b,d - in e,(c) -x3387 ld d,#00 - -;АДРЕС: #3389 Команда: ?data -; вывод параметра data в различных системах счисления -;вх: de - параметр data -x3389 call x33BB ;установка и очистка информационного окна отладчика - ld c,e - ld b,d -;вывод печатного символа заданного значения, если возможно - ld a,b - or a - jr nz,x33A3 ;16 бит - ld a,c - rlca - jr c,x33A3 - rrca - cp #20 - jr c,x33A3 - push af - rst #20 - db #0D - db #80+'"' - pop af - rst #10 - rst #20 - db #80+'"' -;вывод значения в разных системах счисления -x33A3 ld hl,x33B6 -x33A6 ld a,(hl) - cp #81 - ret z ;выход - push bc - push af - rst #20 - db #8D - pop af - call x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - pop bc - inc hl - jr x33A6 -x33B6 db #00,#02,#04,#06,#81 - -;АДРЕС: #33BB установка и очистка информационного окна отладчика -x33BB push de - push bc - push hl - ld hl,xE0AD - call x301C ;ix = дескриптор окна - call x2A5E ;очистка окна - rst #20 - db #8D ;перевод строки в окне - pop hl - pop bc - pop de - ret - -;АДРЕС: #33CD печать информационного окна отладчика -x33CD bit 5,(iy+5) - ret nz ;запрет автоматического выполнения команды SHOW - -;АДРЕС: #33D2 Команда: SHow -; вывод информации о состоянии монитора -x33D2 call x33BB ;установка и очистка окна - rst #20 ;печать сообщения - dc "Analyser " - bit 4,(iy+#14) - call x3201 ;печать ON/OFF от флага nz-ON/z-OFF -;печать текущей системы счисления - rst #20 - db #0D - dc "base " - ld de,#000A - ld c,(iy+#17) - ld b,d - call x1677 ;печать десятичного числа bc - rst #20 - db #8D ;перевод строки -;печать workspace nnnnn - ld bc,#3C00 ;сообщение: workspace - rst #08 ;печать сообщения по номеру в BC - ld bc,(xE11A) - call x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом -;печать состояния настроек отладчика - rst #20 - db #0D - dc "option " - ld l,(iy+5) - call x2E25 ;печать байта из L в двоичном виде -;печать режима прерываний - rst #20 - db #0D - dc "Int mode " - call x3B75 ;определение типа прерываний im 1/2 - ld a,"2" - sub d - rst #10 - bit 6,(iy+#19) - jr z,x3447 ;турбо режим выключен/отсутсвует - rst #20 - dc "(t)" - jr x3447 - -;АДРЕС: #3432 Команда: BASE 0|2|8|10|16 (установка основания системы счисления) -x3432 ld a,d - or a - jr nz,x3441 ;ошибка - ld a,e - ld bc,#0005 - ld hl,x344A - cpir - jr z,x3444 ;система счисления найдена в списке -x3441 ld a,#0D ;сообщение: known number - ret -x3444 ld (iy+#17),e ;установка системы счисления -x3447 ld a,#81 ;сообщение: enter command - ret -x344A db #00,#02,#08,#0A,#10 - -;АДРЕС: #344F Команда: WORKspace addr (задание адреса начала свободного буфера -; для команд трассировки. объем буфера 8 байт) -x344F ld a,d - cp #5B - ld a,#3B ;сообщение: workspace insufficient - ret c - ld a,d - cp #C0 - ld a,#3B ;сообщение: workspace insufficient - ret nc - ld (xE11A),de ;установка адреса - jr x3447 ;выход - -;АДРЕС: #3461 Команда: SEarch addr_st, addr_end, bank, data -; поиск списка байтовых значений data в памяти -;вх: b - количество параметров в строке -x3461 ld de,#0318 - set 0,(iy+#13) - jr x3471 - -;АДРЕС: #346A Команда: FINd addr_st, addr_end, data -; поиск списка байтовых значений data в памяти -;вх: b - количество параметров в строке -x346A ld de,#0217 - res 0,(iy+#13) -x3471 ld a,b - cp d - ld a,#0A ;сообщение: too few operands - ret c ;нехватает параметров в команде - ret z ;нехватает параметров в команде - ld a,b - cp e - ld a,#1F ;сообщение: string too long - ret nc ;слишком длинная строка - ld a,b - sub d ;a - длина искомой строки - push af - xor a - ld (xDDE0),a ;начальная длина искомой строки -;проверка начального и конечного адреса поиска - call x0C98 ;чтение в de адреса начала поиска - push de - call x0C98 ;чтение в de адреса конца поиска - ex (sp),hl - ex de,hl - call x375C ;сравнение hl>=de, в противном случае отмена команды - ld (xDDDC),de ;адрес начала поиска - ld (xDDDE),hl ;адрес конца поиска - ld hl,(xE012) ;сохраним порты пользователя - ld (xDDE1),hl - ld (xE010),hl - pop hl - bit 0,(iy+#13) - jr z,x34B7 ;ищем только в текущей странице -;установка страницы для поиска - call x0C98 ;чтение номера страницы поиска - ex de,hl - call x37EB ;установка страницы для поиска - call x35EC ;установка страницы для команд поиска в отладчике - ld hl,(xE012) - ld (xDDE1),hl - ex de,hl -;чтение в буфер искомой строки -x34B7 ld bc,xDDE3 - pop af - ld (xDDE0),a ;длина искомой строки -x34BE push bc - call x0D55 ;чтение из строки команды чилового/байта строкового значения - pop bc - jr c,x34CA ;конец искомой строки - ld a,e - ld (bc),a - inc bc - jr x34BE -;сравнение строки с памятью -x34CA ld hl,(xDDDC) ;адрес в памяти -x34CD ld bc,(xDDE0-#01) ;b - длина искомой строки - push hl - ld de,xDDE3 ;адрес строки для поиска -x34D5 rst #28 ;чтение байта из памяти пользователя - ld c,a - ld a,(de) - cp c - jr nz,x3502 ;нет совпадения - inc hl - inc de - djnz x34D5 - ld (xDDDC),hl - pop hl - bit 0,(iy+#13) - jr nz,x34EC ;без установки указателя MEM - ld (xDD69),hl ;установим указатель -x34EC ld (xDDA7),hl - ld a,#84 ;сообщение: found at _число_ -; обновление экрана отладчика -x34F1 push af - call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,(iy+#0A) - and #CF - ld (iy+#0A),a ;обновить дамп и дизассемблер - call x2CA8 ;обновление монитора-отладчика - pop af - ret -; следующий адрес для поиска -x3502 pop hl - push hl - or a - ld de,(xDDDE) ;адрес последней ячейки для поиска - sbc hl,de - pop hl - inc hl - jr c,x34CD ;еще не конец области памяти - xor a - ld (xDDE0),a - ld a,#A0 ;сообщение: string not found - jr x34F1 - -;АДРЕС: #3517 продолжение поиска в отладчике (для команд FIND/SEARCH) -x3517 ld a,(xDDE0) ;длина искомой строки - or a - ld a,#A1 ;сообщение: no search string - ret z - ld a,#0C ;атрибуты - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - ld hl,(xDDE1) - ld (xE012),hl - jr x34CA - -;АДРЕС: #352F Команда: MOVe addr_st1, addr_fin1, addr_st2 [,bank] -; копирование области памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x352F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - inc hl - or a - sbc hl,de ;длина переносимого блока - push bc - push hl - pop bc - pop hl - ex de,hl ;de - адрес, куда копируем; hl - откуда - ld a,c - or b - ld a,#42 ;сообщение: too few blocks - ret z ;нулевая длина - push hl - sbc hl,de - pop hl - jr c,x3551 -;копирование области памяти с инкрементом -x3546 call x3563 ;копирование одного байта с переключением страницы - inc hl - inc de - ld a,c - or b - jr nz,x3546 - jr x3560 -;копирование области памяти с декрементом -x3551 dec bc - add hl,bc - ex de,hl - add hl,bc - ex de,hl - inc bc -x3557 call x3563 ;копирование одного байта с переключением страницы - dec hl - dec de - ld a,b - or c - jr nz,x3557 -x3560 jp x3679 ;восстановление страницы пользователя и обновление отладчика -;копирование одного байта с переключением страницы -x3563 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - rst #28 ;чтение байта из памяти пользователя - call x35EC ;установка страницы для команды в отладчике - ex de,hl - rst #00 ;запись байта в память пользователя - ex de,hl - dec bc - ret - -;АДРЕС: #356F Команда: CHeck addr_st1, addr_fin1, addr_st2 [,bank] -; сравнение двух областей памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x356F call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - push bc - push hl - pop bc ;addr_fin1 - pop hl ; - ex de,hl ;de=addr_st2; hl=addr_st1 -x3577 ex de,hl - call x35EC ;установка страницы - rst #28 ;чтение байта из памяти пользователя - ex de,hl - call x3A4E ;восстановление страницы - push bc - ld c,a - rst #28 ;чтение байта из памяти пользователя - cp c - jr nz,x3598 ;не равны -;следующие адреса -x3586 pop bc - push hl - or a - sbc hl,bc - pop hl - inc de - inc hl - jr nz,x3577 -;искомая строка найдена - call x35D3 ;сравнение ix=xE075 - ld a,#82 ;сообщение: block identical - ret nz - dec a ;сообщение: enter command - ret -;вывод сообщение о несовпадении -x3598 ld b,a - push hl - push de - push bc - call x35D3 ;сравнение ix=xE075 - call nz,x3A95 ;подготовка переменных к выводу на экран/принтер - ld bc,#4100 ;сообщение: failed at _число_ - rst #08 - pop bc - pop de - pop hl - push hl - push de - push bc - call x1612 ;печать числа в hl (dec/hex) с префиксом - rst #20 - dc " #" - pop af - push af - call x16E3 ;печать числа a=[#00..#FF] - rst #20 - dc " : " - pop bc - pop hl - push hl - push bc - call x1612 ;печать числа в hl (dec/hex) с префиксом - rst #20 - dc " #" - pop hl - ld a,l - call x16E3 ;печать числа a=[#00..#FF] - rst #20 - db #8D - call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - pop de - pop hl - jr x3586 - -;АДРЕС: #35D3 сравнение ix=xE075 -;вых: z - ix=xE075 -x35D3 push de - push ix - ex (sp),hl - ld de,xE075 - or a - sbc hl,de - pop hl - pop de - ret - -;АДРЕС: #35E0 сохранение переменной с состоянием портов #1FFD/#7FFD пользователя -x35E0 push hl - ld hl,(xE012) - ld (xE010),hl - ld (xE00E),hl - pop hl - ret - -;установка страницы для команд поиска в отладчике -x35EC push hl - ld hl,(xE00E) - ld (xE012),hl - pop hl - ret - -;АДРЕС: #35F5 Команда: FILl addr_st, addr_end, byte [,bank] -; заполнение области памяти -;вх: de - первый операнд -; hl - второй операнд -; bc - третий операнд -; a - количество операндов [0..5] -x35F5 call x3766 ;установка заданной страницы и сравнение hl>=de, с отменой команды - ld a,b - or a - ld a,#0C ;сообщение: out of range - ret nz ;слишком большое значение для заполнения - call x35EC ;;установка страницы - ex de,hl -;заполнение области памяти -x3601 ld a,c - rst #00 ;запись байта в память пользователя - push hl - or a - sbc hl,de - pop hl - inc hl - jr nz,x3601 - jr x3679 ;восстановление страницы и обновление отладчика - -;АДРЕС: #360D Команда: DATA addr, data -; запись списка data, начиная с адреса addr -x360D call x0C98 ;чтение адреса начала области - ld c,e - ld b,d - jr x3618 - -;АДРЕС: #3614 Команда: .PC data -; запись списка data, начиная с адреса в регистре PC -x3614 ld bc,(xDD6B) ;pc программы пользователя -x3618 set 1,(iy+#13) - jr x3626 - -;АДРЕС: #361E Команда: .data -; запись списка data, начиная начиная с текущей ячейки памяти MEM -x361E ld bc,(xDD69) ;адрес текущей ячейки MEM - res 1,(iy+#13) - -;запись строки данных по заданному адресу -x3626 push bc ;адрес куда пишем - call x0D55 ;очередного байта data - pop bc - jr c,x367C ;нет больше байтов для чтения. обновление отладчика - push hl - ld l,c - ld h,b - ld a,e - rst #00 ;запись байта в память пользователя - inc bc - bit 1,(iy+#13) - jr nz,x363D - ld (xDD69),bc ;новый адрес MEM -x363D pop hl ;следующий байт - jr x3626 - -;АДРЕС: #3640 pop de со стэка пользователя -x3640 ld hl,(xDD6D) ;указатель вершины стэка программы пользователя - rst #28 ;чтение байта из памяти пользователя - ld e,a - inc hl - rst #28 ;чтение байта из памяти пользователя - ld d,a - inc hl - ld (xDD6D),hl ;новый указатель вершины стэка программы пользователя - ret - -;АДРЕС: #364D Команда: POP -; извлечение значения из стека пользователя -x364D call x3640 ;pop de со стэка пользователя - call x3389 ;вывод числа в de в различных системах счисления - jr x366E ;обновление отладчика - -;АДРЕС: #3655 переход на адрес, содержащийся в команде, расположенный в текущей -; ячейке памяти -x3655 ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти - call x3884 ;получить адрес, на который ссылается команда ассемблера - ex de,hl - -;АДРЕС: #365C Команда: MEMory addr -; установка адреса текущей ячейки памяти mem -x365C ld (xDD69),de - jr x367C ;выход и обновленеи отладчика - -;АДРЕС: #3662 Команда: EXX -; смена индикации регистров ВС, DE и HL на альтернативные -x3662 ld a,#01 - jr x3668 ;выход и обновленеи отладчика - -;АДРЕС: #3666 Команда: EX AF -; смена индикации регистров AF на альтернативные. Команды -x3666 ld a,#02 -x3668 xor (iy+#0B) - ld (iy+#0B),a -x366E ld a,(iy+#0A) -x3671 and #F1 - ld (iy+#0A),a -x3676 jp x0AFB -x3679 call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x367C ld a,(iy+#0A) - and #8F - jr x3671 - -;АДРЕС: #3683 Команда: INTerrupt on|off -; управление прерываниями -x3683 ld a,e - and #FE - or d - ld a,#17 ;сообщение: illegal value operand - ret nz ;недопустимый параметр - ld hl,xDD83 - ld a,e - or e - jr z,x3695 - set 2,(hl) ;прерывания разрешены - jr x3676 ;выход и обновление отладчика -x3695 res 2,(hl) ;прерывания запрещены - jr x3676 ;выход и обновление отладчика - -;АДРЕС: #3699 Команда: CALl [[addr],bank] -; вызов подпрограммы -x3699 call x3713 ;установка страницы, если задана в команде - set 4,(iy+#12) - push af - push de - ld de,(xDD6B) ;pc программы пользователя - inc de - call x3A14 ;запись de на стэк пользователя - ld de,#0008 ;возврат по адресу #08 - call x3A14 ;запись de на стэк пользователя - pop de - pop af - jr x36B7 - -;АДРЕС: #36B4 Команда: Jump [[addr],bank] -; передача управления программе -x36B4 call x3713 ;установка страницы, если задана в команде -x36B7 jr c,x36BD ;нет параметров, вызов по адресу PC - ld (xDD6B),de -x36BD call x382E ;ожидание отжатия всех клавиш - jp x013D ;выход из монитора - -;АДРЕС: #36C3 запись стандартного Magic-файла -x36C3 ei - halt - di - ld de,(xDD6B) ;pc программы пользователя - call x3A14 ;запись de на стэк пользователя - ld de,rom3_x0FF3 ;п/п Tr-Dos Запись памяти на диск - call x3A14 ;запись de на стэк пользователя - ld hl,rom3_x3D30 ;вызов страницы tr-dos - ld (xDD6B),hl ;новый PC - jr x36BD ;выход из монитора - -;АДРЕС: #36DB Команда: ROM bank -; изменение текущего банка ПЗУ -x36DB ld a,e - and #FE - or d - ld a,#19 ;сообщение: invalid bank ROM - ret nz ;недопустимый номер ROM - ld a,#1B ;сообщение: forbidden bank ROM - bit 5,(iy-#02) - ret nz ;only 48k - ld hl,x367C ;сюда вернемся - ex (sp),hl - res 4,(iy-#02) ;rom 0 - bit 0,e - ret z - set 4,(iy-#02) - ret - -;АДРЕС: #36F9 получение номера логической страницы пользователя a=[#0..#F] -x36F9 push hl - ld hl,(xE012) ;страница пользователя - ld a,%00000111 - and l - bit 4,h - pop hl - ret z ;включена была страница [0..7] - or %00001000 - ret - -;АДРЕС: #3707 сравнение страницы пользователя с заданной -;вых: a - логическая страница пользователя -; z страница совпадает -; nz не совпадает -; -x3707 call x36F9 ;a - логическая страница пользователя - cp l - ret - -;АДРЕС: #370C Команда: RAM -x370C ld bc,x367C ;обновление отладчика - push bc ;сюда вернемся - ex de,hl - jr x371D ;установка страницы пользователя равной номеру страницы в HL - -;АДРЕС: #3713 если параметр задан, установка страницы пользователя равной номеру страницы в HL -;вх: a - количество параметров -x3713 cp #01 - ret c ;нет параметров - ret z ;1 параметр - cp #02 -x3719 ld a,#0B ;сообщение: too many operands - jr nz,x3763 ;слишком много параметров - -;АДРЕС: #371D установка страницы пользователя равной номеру страницы в HL -x371D ld a,l - and #F0 - or h - ld a,#18 - jr nz,x3763 ;сообщение: invalid bank RAM - ld a,l - and #07 - jr z,x3732 - ld a,#1C ;сообщение: forbidden bank RAM - bit 5,(iy-#02) - jr nz,x3763 ;only 48k - -;АДРЕС: #3732 установка страницы пользователя равной номеру страницы в L -x3732 ld bc,(xE012) - res 4,b - bit 3,l - jr z,x373E ;RAM 0-7 - set 4,b -x373E res 3,l - ld a,c - and %11111000 - or l - ld c,a - ld (xE012),bc - xor a - ret - -;проверка допустимости заданных адресов -;вх: de - адрес начала блока памяти -; hl - адрес конца блока памяти -; a - количество операндов [0..5] -x374B cp #02 - jr z,x375C ;если два параметра - jr nc,x3719 ;большк двух параметров. выход в отладчик - ld hl,#FFFF - cp #01 - jr z,x375C - ld de,(xDD69) ;указатель MEM - -;сравнение hl>=de, в противном случае отмена команды -x375C or a - sbc hl,de - add hl,de - ret nc - ld a,#1D ;сообщение: start > _число_ -x3763 jp x0B06 ;полное обновление монитора - -;установка заданной страницы и сравнение hl>=de, с отменой команды -;a - количество операндов [0..5] -x3766 call x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - cp #04 - call z,x37F0 ;установка страницы по прочтенному четвертому операнду - jr z,x375C ;сравнение hl>=de, в противном случае отмена команды - cp #03 - jr z,x375C ;сравнение hl>=de, в противном случае отмена команды - ld a,#0A ;сообщение: too few operands -x3776 jr x3763 ;полное обновление монитора - -;АДРЕС: #3778 Команда: SCReen [on|off|5|7] -; установка/отображение экрана пользователя -x3778 cp #01 - jr z,x3787 ;есть параметр - jr nc,x3719 ;много параметров. выход в отладчик - call x3A21 ;копирование активного экрана пользователя в #4000 - call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне - jp x0AF2 ;возврат в монитор с обновлением экрана -x3787 ld a,e - and #FE - or d - jr nz,x379A - ld a,#81 ;сообщение: enter command - ld hl,xE026 - set 1,(hl) - bit 0,e - ret z - res 1,(hl) - ret -x379A ld a,d - or a - ld a,#17 ;сообщение: illegal value operand - ret nz ;ошибка. выход в отладчик - ld hl,xE012 - ld a,e - cp #05 - jr z,x37AE ;установка экрана из страницы 5 - cp #07 - jr z,x37B5 ;установка экрана из страницы 7 - ld a,#17 ;сообщение: illegal value operand - ret -x37AE res 3,(hl) -x37B0 ld a,#81 ;сообщение: enter command - jp x0AFB -x37B5 set 3,(hl) - jr x37B0 - -;АДРЕС: #37B9 управление выводимым листингом (опрос клавиш space, s, cs+1) -x37B9 push hl - ld hl,xE02D - bit 3,(hl) - res 3,(hl) - push af - call nz,x381C ;проверка нажатия клавиш space и s - pop af - call z,x3813 - pop hl - ld a,#FE - in a,(#FE) - rrca - ret c ;cs не нажата - ld a,#F7 - in a,(#FE) - rrca - ret c ;1 не нажата - res 3,(iy+#19) ;нажата cs+1 - call x382E ;ожидание отжатия всех клавиш -x37DD call x093C ;вывод на экран - ld a,#9A - bit 0,(iy+#12) - jr nz,x3776 ;ввод и обработка команды отладчика - jp x0AD7 ;печать меню - -;установка страницы по номеру hl -x37EB push af - push hl - push bc - jr x37F6 - -;установка страницы по прочтенному четвертому операнду -x37F0 push af - push hl - push bc - ld hl,(xDD99+#06) ;третий операнд в команде (bank) -x37F6 call x371D ;установка страницы пользователя равной номеру страницы в HL - ld hl,(xE012) - ld (xE00E),hl - call x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - pop bc - pop hl - pop af - scf - ret - -;АДРЕС: #3807 пауза 40416t -x3807 ld a,#C0 -x3809 push bc - ld b,#00 - djnz $ - pop bc - dec a - jr nz,x3809 - ret - -;проверка нажатия клавиш space и s -x3813 ld a,#7F - in a,(#FE) - rrca - ret c ;Space не нажат - call x382E ;ожидание отжатия всех клавиш - -;проверка нажатия клавиш space и s -x381C call x3807 ;пауза 40416t - call x3023 ;ожидание действий пользователя (опрос управления, вывод часов) - cp #20 - jr z,x382B ;нажат пробел - and #5F - cp "S" - ret nz -x382B set 3,(hl) - ret - -;АДРЕС: #382E ожидание отжатия всех клавиш -x382E xor a - in a,(#FE) - cpl - and #1F - ret z - jr x382E - -;АДРЕС: #3837 копирование блока памяти в ram 8 с раскодированием -;вх: hl - адрес закодированной процедуры/данных -; de - адрес этой процедуры/данных для размещения в ram 8 -; db ?,?,n,? - длина -; db ?,?,?,n - адрес байта для раскодирования -x3837 ex (sp),hl - inc hl - inc hl - ld b,(hl) - inc hl - push de - ld e,(hl) - inc hl - ld d,#00 - ld a,(de) ;байт по заданному адресу - pop de - ex (sp),hl - ld c,a ;байт по заданному адресу - ld a,(x00FE) - xor c - ld c,a - ld a,(x00FD) - xor c - ld c,a - ld a,(x00FC) - xor c - ld c,a -x3854 ld a,c - xor b - xor (hl) - ld (de),a - inc hl - inc de - djnz x3854 - ret - - - - -;АДРЕС: #385D не используется -x385D scf - jr x3861 -;АДРЕС: #3860 не используется -x3860 or a -x3861 pop hl - ld e,(hl) - inc hl - ld d,(hl) - inc hl - push hl - ex de,hl - jr c,x3880 - ld a,(hl) - or a - jr nz,x3883 - ld a,#3D ;сообщение: Professional program not found - -;АДРЕС: #3870 печать сообщения и продолжение работы текущего меню монитора -;вх: a - номер сообщения из блока 0 -x3870 sla a - call x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - scf ;cy=1 с очисткой буфера ввода - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - call x302E ;ожидание действий пользователя (опрос управления, вывод часов) без вывода курсора в окне - jp x0129 ;печать текущего меню монитора - - -x3880 ld a,(hl) - or a - ret z -x3883 jp (hl) - - - - -;АДРЕС: #3884 получить адрес, на который ссылается команда ассемблера -;вх: hl - адрес команды ассемблера -;вх: z - команда не ссылается на память -; nz -> hl - адрес на который ссылается команда -x3884 push hl - call x2F96 ;анализ команды ассемблера - pop hl - bit 6,(iy+#01) - ret z ;в команде нет ссылки на адрес памяти - ld hl,(xDDD0) - ret - -;переход на адрес, на который ссылается команда ассемблера -x3892 xor a - call x38C6 ;запись в таблицу текущего адреса дизасма - ex de,hl - call x3884 ;получить адрес, на который ссылается команда ассемблера - jr x38C3 ;переход на новый адрес - -;расчет адреса в таблице с записями адресов дизасма -;вх: a - номер ячейки в таблице -;вых: hl - адрес в таблице -x389C ld l,a - ld h,#00 - ld de,xDD8D - add hl,hl - add hl,de - ret - -;ввод нового адреса листинга -x38A5 ld a,#C3 -x38A7 rst #30 - dw rom6_x06AD ;ввод текстовой строки внизу экрана - db #06 - jr c,x38D1 ;нажата Break. Выход из режима - bit 4,(iy+#05) - push af - call z,x0D55 ;вводить адрес выражением - pop af - call nz,x0DF4 ;вводить адрес числом - jr nz,x38A7 ;не верный адрес - push de - ld a,#0C ;сообщение: _Working ... - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - pop hl -x38C3 jp x394F - -;запись в таблицу текущего адреса дизасма -;вх: a - номер ячейки в таблице -x38C6 call x389C ;расчет адреса в таблице - ld de,(xDD8B) - ld (hl),e - inc hl - ld (hl),d - ret - -;выход из режима дизасма -x38D1 res 1,(ix+#07) - jp x37DD - -;АДРЕС: #38D8 быстрый вход в команду DASM (ss+D) -x38D8 xor a - ld hl,(xDD6B) ;pc программы пользователя - bit 6,(iy+#05) - jr nz,x38E5 ;адрес команды SS/D, берется из регистра PC - -;АДРЕС: #38E2 Команда: DASm [addr] вывод листинга дизасма -x38E2 ld hl,(xDD69) ;адрес команды SS/D. берется из ячейки (mem) -x38E5 or a - jr z,x38EE ;нет параметров, с текущего адреса - cp #02 - ld a,#0B ;сообщение: too many operands - ret nc ;много параметров - ex de,hl -x38EE ld (xDD8B),hl ;адрес начала для команды DASM - ld a,#0C ;сообщение: _Working ... - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 -x38F7 call x3A95 ;подготовка переменных к выводу на экран/принтер - ld (ix+#00),#00 ;crd Y - set 1,(ix+#07) ;Изменять атрибуты при выводе каждого символа - ld hl,(xDD8B) ;адрес начала для команды DASM - ld b,#16 ;кол-во строк для вывода - jr x390C - -;печать листинга дизасма -x3909 inc (ix+#00) -x390C push bc - call x39A8 ;печать одной строки листинга дизасма - pop bc - djnz x3909 - -;опрос клавиатуры и реакция на клавиши -x3913 ld hl,x3913 ;сюда вернемся - push hl - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - call x2C7E ;поиск и вызов процедуры обработки без возврата(если не найдено возврат) - db #8E ;ss+D - dw x38D1 ;выход из режима дизасма - db #03 ;Break - dw x38D1 ;выход из режима дизасма - db #85 ;cs+5 - dw x3951 ;переход на один байт назад - db #83 ;cs+8 - dw x3956 ;переход на один байт вперед - db #86 ;cs+6 - dw x398F ;переход на одну команду вперед - db #84 ;cs+7 - dw x3963 ;переход на одну команду назад - db #0D ;Enter - dw x38A5 ;ввод нового адреса - db #8D ;ss+G - dw x3892 ;переход на адрес, на который ссылается команда ассемблера - db #62 ;b - dw x330B ;установка ловушки #8, по текущему адресу листинга дизасма - db #6E ;n - dw x3326 ;удаление ловушки #8 - db #FF - sub #30 - ret c - ld c,#05 - cp c - jr c,x38C6 ;нажато 0..4 - запись текущего адреса дизасма - sub c - cp c - ret nc ;не цифра - call x389C ;нажато 5..9 - восстановление адреса дизасма - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl -x394F jr x395D - -;переход на один байт назад -x3951 ld bc,#FFFF - jr x3959 - -;переход на один байт вперед -x3956 ld bc,#0001 -x3959 ld hl,(xDD8B) - add hl,bc -x395D ld (xDD8B),hl ;адрес начала листинга -x3960 pop hl - jr x38F7 ;обновление окна с листингом - -;переход на одну команду назад -x3963 call x2A1B ;скроллинг окна вниз - ld (ix+#00),#00 ;crd Y - ld bc,#FFFB ;-5 -x396D inc bc - ld hl,(xDD8B) - add hl,bc - push bc - call x2F96 ;анализ команды ассемблера - pop bc - ld de,(xDD8B) - or a - sbc hl,de - jr z,x3982 ;команда найдена - jr nc,x398B -x3982 add hl,de - jr nz,x396D -;команда найдена - add hl,bc - ld (xDD8B),hl ;адрес начала листинга - jr x39A8 -;ищем дальше -x398B add hl,de - add hl,bc - jr x395D - -;переход на одну команду вперед -x398F call x298E ;скроллинг окна вверх - ld (ix+#00),#15 ;crd Y - ld hl,(xDD8B) - call x2F96 ;анализ команды ассемблера - ld (xDD8B),hl ;адрес начала листинга -;ищем команду для печати в нижней строке - ld b,#15 -x39A1 push bc - call x2F96 ;анализ команды ассемблера - pop bc - djnz x39A1 - -;АДРЕС: #39A8 Печать одной строки листинга дизасма -x39A8 ld a,(ix+#06) ;цифровые атрибуты окна - push af - ld (ix+#01),#00 ;crd X =#00 - push ix - call x3281 ;установка начала списка ловушек -;обработка ловушек, для подсветки строки -x39B5 bit 7,(ix+#00) - jr z,x39DD ;ловушка не активна -; ловушка активна - push hl - ld l,(ix+#01) ;номер страницы в которой установлена ловушка - call x3707 ;сравнение страницы пользователя с заданной - pop hl - jr nz,x39DD ;в другой странице - push de - ld e,(ix+#02) - ld d,(ix+#03) ;адрес ловушки - or a - sbc hl,de - add hl,de - pop de - jr nz,x39DD ;не по текущему адресу - ld a,(xE114) ;атрибуты для подсветки ловушки при выводе дизасма - ex (sp),ix - ld (ix+#06),a - ex (sp),ix -x39DD add ix,de - djnz x39B5 - pop ix - call x2FAC ;печать строки дизасма - pop af - ld (ix+#06),a - ret - -;АДРЕС: #39EB Команда: LCATalogue [num_drive] -; вывод каталога дискеты на принтер -;вх: de - первый операнд -; a - количество операндов [0..5] -x39EB set 4,(iy+#09) ;вывод на принтер - -;АДРЕС: #39EF Команда: CATalogue [num_drive] -; вывод каталога дискеты -;вх: de - первый операнд -; a - количество операндов [0..5] -x39EF or a - jr z,x3A04 ;используем текущий дисковод - cp #04 ;!!!ОШИБКА параметр всего один - ld a,#0B ;сообщение: too many operands - jr nc,x3A08 ;много параметров. выход в отладчик - ld a,e - and #FC - or d - ld a,#3E ;сообщение: known disk - jr nz,x3A08 ;неврный номер дисковода. выход в отладчик - ld a,e - call x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ -x3A04 rst #30 - dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) - db #06 -x3A08 call x093C ;вывод на экран - ld a,#81 ;сообщение: enter command - jp x0AE0 ;выход в отладчик - -;АДРЕС: #3A10 Команда: PUSH data -; занесение в стек программы значения data -x3A10 ld hl,x367C ;сюда вернемся - ex (sp),hl - -;АДРЕС: #3A14 запись de на стэк пользователя -;вх: de - число -; -x3A14 ld hl,(xDD6D) ;адрес вершины стэка пользователя - dec hl - ld a,d - rst #00 - dec hl - ld a,e - rst #00 - ld (xDD6D),hl - ret - -;АДРЕС: #3A21 копирование активного экрана пользователя в #4000 -; -x3A21 bit 3,(iy-2) - jp z,x0581 ;был scr 5 при входе - ld bc,#1FFD ;был scr 7 при входе - ld a,#02 - out (c),a - ld b,#7F - ld a,#17 - out (c),a ;rom 2, ram 7 - ld hl,#C000 - ld de,#4000 - ld bc,#1B00 - ldir ;копируем экран из ram 7 - ld bc,#7FFD - ld a,#10 - out (c),a - ld b,#1F - ld a,#12 - out (c),a ;rom 2, ram 8 - ret - -;АДРЕС: #3A4E восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x3A4E push hl - ld hl,(xE010) - ld (xE012),hl - pop hl - ret - -;АДРЕС: #3A57 Команда: LDISs [addr_st[,addr_end]] реассемблирование блока памяти -; на принтер. -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A57 call x374B ;;проверка допустимости заданных адресов - set 4,(iy+#09) ;вывод на принтер - jr x3A63 - -;АДРЕС: #3A60 Команда: DISs [addr_st [,addr_end]] -; реассемблирование блока памяти с адреса addr_st по addr_end -; включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A60 call x374B ;проверка допустимости заданных адресов -x3A63 ld bc,x2FAC ;п/п печать строки дизасма - jr x3A77 - -;АДРЕС: #3A68 Команда: LDUmp [addr_st[,addr_end]] -; выдача дампа памяти на принтер с адреса addr_st по addr_end включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A68 call x374B ;проверка допустимости заданных адресов - set 4,(iy+#09) ;вывод на принтер - jr x3A74 - -;АДРЕС: #3A71 Команда: DUmp [addr_st[,addr_end]] -; выдача дампа памяти с адреса addr_st по addr_end включительно -;вх: de - первый операнд -; hl - второй операнд -; a - количество операндов [0..5] -x3A71 call x374B ;проверка допустимости заданных адресов -x3A74 ld bc,x2EBE ;п/п печати одной строки дампа памяти (8 байт) -x3A77 ex de,hl - call x3A95 ;подготовка переменных к выводу на экран/принтер -x3A7B call x37B9 ;управление выводимым листингом (опрос клавиш space, s, cs+1) - rst #20 - db #8D - push de - push bc - call x3A93 ;вызов п/п по адресу в bc - call (bc) - pop bc - pop de - or a - sbc hl,de - add hl,de - jr c,x3A7B ;еще не конец - call x093C ;вывод на экран - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #3A93 вызов п/п по адресу в bc - call (bc) -x3A93 push bc - ret - -;АДРЕС: #3A95 подготовка переменных к выводу на экран/принтер -x3A95 push hl - push de - push bc - bit 4,(iy+#09) - ld hl,xE075 - jr z,x3AA4 ;вывод на экран - ld hl,xE067 ;вывод на принтер -x3AA4 call x301C ;ix = адрес дескриптора окна из hl - push af - call z,x2A5E ;обработка управляющего кода #0C (очистка текущего окна) - ld (iy+#0A),#00 - pop af - jr nz,x3AB6 ;вывод на принтер - ld (ix+#00),#15 ;crd Y -x3AB6 ld hl,x3AC0 - ld (xDE12),hl - pop bc - pop de - pop hl - ret -x3AC0 call x093C - ld a,#9E - jp x0B06 - -;АДРЕС: #3AC8 Команда: VList -x3AC8 ld hl,x23A3 - ld de,x2104 ;п/п печати слова анализатора - jr x3AD8 - -;АДРЕС: #3AD0 Команда: Help -x3AD0 ld hl,x3D01 - ld c,#00 - ld de,x3AFB -;печать команд отладчика/слов анализатора -x3AD8 call x33BB ;установка и очистка информационного окна отладчика -x3ADB ld b,(ix+#04) ;высота окна в знакоместах -x3ADE push de - call x3AF9 ;вызов п/п по адресу в de - call (de) - pop de - ld a,#81 ;сообщение: enter command - ret nc ;завершили печать - djnz x3ADE -; ожидание нажатия клавиши - push hl - push bc - push de - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop de - pop bc - pop hl - cp #03 - jr nz,x3ADB ;если не Break печатаем следующую страницу - ld a,#9A ;сообщение: command abandoned - ret - -;АДРЕС: #3AF9 вызов п/п по адресу в de - call (de) -x3AF9 push de - ret - -;АДРЕС: #3AFB печать команды отладчика -;вх: hl - адрес команды отладчика -; c - номер команды в списке -;вых: hl - адрес начала следующей команды -; c - номер следующей команды в списке -; cy=1 слово напечатано -; cy=0 нет больше слов для печати -x3AFB ld a,(hl) - or a - ret z ;выход если конец списка - cp #20 - jr nc,x3B12 ;печать команды -;печать названия группы команд - push bc - ld c,a - dec c ;номер блока соообщений - rst #20 - db #0D - dc "- " - inc hl - ld b,(hl) ;номер сообщения - inc hl - push hl - rst #08 - pop hl - pop bc - jr x3B53 ;выход -;печать команды -x3B12 push bc - rst #20 - db #8D - ld b,#0A - call x15DD ;печать сообщения из hl не менее заданной длины - pop bc - push bc - push hl - ld hl,x3E2C - ld a,c - add a,a - add a,c - ld c,a - inc c - inc c - ld b,#00 - add hl,bc - ld a,(hl) ;флаг описателя команды - bit 7,a - jr z,x3B30 ;в параметрах нет строки - jr x3B34 ;в параметрах команды есть строка -x3B30 bit 5,a - jr z,x3B3C -; в параметрах команды есть строка: печать comp. -x3B34 rst #20 - dc "comp." - jr x3B50 -; печать количества параметров команды -x3B3C bit 6,a - push af - jr nz,x3B46 ;в команде есть необязательные параметры - rst #20 - dc " " - jr x3B49 -x3B46 rst #20 - dc "<=" -x3B49 pop af - and #1F - rst #30 - dw rom6_x03A1 ;печать числа в десятичной системе счисления - db #06 -x3B50 pop hl - pop bc - inc c -;выход -x3B53 scf - ret - -;АДРЕС: #3B55 Команда: IM -x3B55 ld a,e - and #FC - or d - ld a,#17 ;сообщение: illegal value operand - ret nz - ld a,#81 ;сообщение: enter command - ld hl,#0000 - add hl,de - add hl,de - add hl,de - ld de,x3B69 - add hl,de - jp (hl) -;процедуры для установки режима прерываний -x3B69 im 0 - ret - im 1 - ret - im 2 - ret - ld a,#17 ;сообщение: illegal value operand - ret - -;АДРЕС: #3B75 определение типа прерываний im 1/2 -;вых: z режим im 2 -; nz режим im 1 -; a=0 - im 2 -; a=1 - im 1 -x3B75 xor a - ld d,a - ld b,#01 - ei - halt ;если im 2, то d=0 - di ;если im 1, то d=1 - ld a,d - or a - ret - -;АДРЕС: #3B7F установка переменных по конкретным адресам -x3B7F ld hl,x3EDA - ld b,#03 -x3B84 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - ld (de),a - inc hl - inc de - ld a,(hl) - ld (de),a - inc hl - djnz x3B84 - ret - -;АДРЕС: #3B92 закодированные процедуры переключения страниц -> ram 8 xE3BE -x3B92 db #CE,#38,#3B,#3A,#F4,#75,#DB,#73 - db #D5,#F5,#D7,#29,#D1,#AD,#D3,#BF - db #ED,#8B,#EF,#8E,#E9,#E9,#25,#0F - db #00,#E3,#E6,#23,#03,#04,#F2,#3F - db #CC,#DD,#45,#39,#4B,#F7,#51,#3D - db #57,#33,#6D,#DF,#6D,#F0,#34,#FD - db #1B,#43,#18,#87,#2E,#64,#8B,#A3 - db #CB,#84,#42,#A1,#86,#A9,#DF,#82 - db #5B,#7E,#9F,#BB,#AC,#8D,#9E,#B3 - db #71,#70,#73,#72,#96,#81,#B2,#0B - db #84,#E2,#AF,#6B,#86,#AF,#82,#F6 - db #A5,#81,#B2,#A1,#8C,#A7,#92,#18 - db #7A,#0E,#78,#B7,#0E,#61,#BB,#8F - db #B2,#B5,#79,#6F,#B1,#B7,#A2 - -;АДРЕС: #3C01 некодированные процедуры переключения страниц -> ram 8 xE42D -x3C01 db #3E,#10,#32,#69,#E4,#F1,#E3,#22 - db #3D,#E4,#21,#78,#E4,#E3,#E5,#21 - db #01,#32,#E3,#ED,#43,#3D,#E4,#01 - db #30,#3D,#18,#1A,#F5,#AF,#18,#03 - db #F5,#3E,#10,#32,#69,#E4,#F1,#ED - db #43,#3D,#E4,#E3,#4E,#23,#46,#23 - db #E3,#E5,#21,#78,#E4,#E3,#C5,#F5 - db #01,#FD,#7F,#3E,#00,#ED,#79,#3E - db #10,#06,#1F,#ED,#79,#F1,#ED,#4B - db #3D,#E4,#C9,#C5,#F5,#01,#FD,#1F - db #3E,#12,#ED,#79,#F1,#C1,#C9,#E5 - db #21,#30,#3D,#E3,#C5,#F5,#01,#FD - db #1F,#3E,#10,#ED,#79,#06,#7F,#ED - db #79,#F1,#C1,#C9,#C5,#F5,#01,#FD - db #1F,#3E,#10,#ED,#79,#AF,#06,#7F - db #ED,#79,#F1,#C1,#C9,#4F,#21,#10 - db #01,#0F,#0F,#E6,#03,#85,#6F,#6E - db #6E,#79,#C9,#E6,#03,#17,#85,#6F - db #30,#01,#24,#7E,#23,#66,#6F,#C9 - db #E3,#23,#23,#E3,#E5,#2A,#08,#E4 - db #E3,#C9,#7B,#E6,#10,#ED,#79,#06 - db #1F,#7A,#E6,#03,#F6,#10,#ED,#79 - db #08,#38,#01,#7E,#77,#08,#3E,#12 - db #ED,#79,#06,#7F,#3E,#10,#ED,#79 - db #C3,#A1,#05,#7B,#E6,#10,#ED,#79 - db #06,#1F,#7A,#E6,#03,#F6,#10,#ED - db #79,#D9,#08,#30,#01,#EB,#ED,#B0 - db #30,#01,#EB,#08,#D9,#3E,#12,#ED - db #79,#06,#7F,#3E,#10,#ED,#79,#D9 - db #C9,#00,#33,#33,#FB,#3C,#32,#0D - db #E0,#3E,#C9,#32,#18,#E5,#3E,#FB - db #32,#17,#E5,#ED,#56,#C3,#5E,#02 - -;АДРЕС: #3D01 список команд отладчика -x3D01 db #01,"L" ;номер блока сообщений+1, номер сообщения в блоке - dc "ANalyser" - dc "CLear" - dc "DEFLoad" - dc "DEFSave" - dc "EDit" - dc "EVal" - dc "LDEFinition" - dc "PDEFinition" - dc "VList" - dc "WORD" - db #01,"M" - dc "BREak" - dc "BRK" - dc "DELBreak" - dc "LBreak" - dc "LISTBreak" - db #01,"N" - dc "Jump" - dc "CALl" - dc "SLOW" - dc "WORKspace" - db #01,"O" - dc "BASE" - dc "EXX" - dc "EX AF" - dc "EXit" - dc "OPTion" - dc "SHow" - db #01,"Q" - dc ".PC" - dc "." - dc "CHeck" - dc "DASm" - dc "DATA" - dc "DISs" - dc "DUmp" - dc "FILl" - dc "FINd" - dc "LDISs" - dc "LDUmp" - dc "MEMory" - dc "MOVe" - dc "PUSH" - dc "POP" - dc "RAM" - dc "ROM" - dc "SEarch" - db #01,"R" - dc "CATalogue" - dc "ERAse" - dc "LCATalogue" - dc "LOAD" - dc "SAVE" - db #01,"S" - dc "IM" - dc "INTerrupt" - dc "IND" - dc "OUTD" - dc "IN" - dc "OUT" - dc "SCReen" - db #00 - -;АДРЕС: #3E25 чтение портов #1FFD/#7FFD -;вых: cy=1 -x3E25 ld b,#0E - call x03B6 ;чтение регистра AY - rlca - ret - -;АДРЕС: #3E2C адреса обработки команд отладчика -; 7,=1 в параметрах есть строка -> 0-2,=nnn количество числовых параметров перед строкой -; 6,=1 операнды передаются в регистрах de,hl,bc. кол-во операндлов в A -; 5,=1 обрабатывать команду без проверки синтаксиса -; 7-5,=000 -> 0-4,=nnnnn количество операндов -x3E2C dw x1F42: db %00000001 ;ANalyser - dw x1F25: db %00000000 ;CLear - dw x1EA5: db %00100000 ;DEFLoad - dw x1E76: db %00100000 ;DEFSave - dw x2093: db %00100000 ;EDit - dw x2297: db %00100000 ;EVal - dw x2218: db %00000000 ;LDEFinition - dw x2214: db %00000000 ;PDEFinition - dw x3AC8: db %00000000 ;VList - dw x1FB0: db %00100000 ;WORD - dw x3303: db %01000101 ;BREak - dw x32E2: db %00000010 ;BRK - dw x32AF: db %00000001 ;DELBreak - dw x31C1: db %00000000 ;LBreak - dw x31C1: db %00000000 ;LISTBreak - dw x36B4: db %01000010 ;Jump - dw x3699: db %01000010 ;CALl - dw x31AB: db %00000001 ;SLOW - dw x344F: db %00000001 ;WORKspace - dw x3432: db %00000001 ;BASE - dw x3662: db %00000000 ;EXX - dw x3666: db %00000000 ;EX AF - dw x0AD7: db %00000000 ;EXit - dw x3333: db %00000010 ;OPTion - dw x33D2: db %00000000 ;SHow - dw x3614: db %10000000 ;.PC - dw x361E: db %10000000 ;. - dw x356F: db %01000100 ;CHeck - dw x38E2: db %01000001 ;DASm - dw x360D: db %10000001 ;DATA - dw x3A60: db %01000010 ;DISs - dw x3A71: db %01000010 ;DUmp - dw x35F5: db %01000100 ;FILl - dw x346A: db %10000010 ;FINd - dw x3A57: db %01000010 ;LDISs - dw x3A68: db %01000010 ;LDUmp - dw x365C: db %00000001 ;MEMory - dw x352F: db %01000100 ;MOVe - dw x3A10: db %00000001 ;PUSH - dw x364D: db %00000000 ;POP - dw x370C: db %00000001 ;RAM - dw x36DB: db %00000001 ;ROM - dw x3461: db %10000011 ;SEarch - dw x39EF: db %01000001 ;CATalogue - dw x3074: db %00100000 ;ERAse - dw x39EB: db %01000001 ;LCATalogue - dw x3095: db %00100000 ;LOAD - dw x3085: db %00100000 ;SAVE - dw x3B55: db %00000001 ;IM - dw x3683: db %00000001 ;INTerrupt - dw x337A: db %00000001 ;IND - dw x336C: db %00000010 ;OUTD - dw x3383: db %00000001 ;IN - dw x3360: db %00000010 ;OUT - dw x3778: db %01000001 ;SCReen - db #00 - -;АДРЕС: #3ED2 закодированный блок атрибутов меню монитора -> ram 8 xEAED -x3ED2 db #A1,#AF,#AD,#AF,#A9,#AF,#AD,#AF - -;АДРЕС: #3EDA данные для установки переменных по конкретным адресам -x3EDA dw xC063 ;адрес - dw #0000 ;включение отладчика - dw xC064 ;адрес - dw #0000 ;отключение мерехвата NMI - dw xE9E5 ;адрес - dw xF7C0 ;установка адреса шрифта - -;АДРЕС: #3FE6 названия месяцев -x3EE6 dc "Jan" - dc "Feb" - dc "Mar" - dc "Apr" - dc "May" - dc "Jun" - dc "Jul" - dc "Aug" - dc "Sep" - dc "Oct" - dc "Nov" - dc "Dec" - -;АДРЕС: #3F0A названия дней недели -x3F0A dc "Sun" - dc "Mon" - dc "Tue" - dc "Wed" - dc "Thu" - dc "Fri" - dc "Sat" - -x3F1F DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" - ds #4000-$,#00 - - - SAVEBIN "../Build/scorp/NewROM2.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom3.bat b/ProfRom_Disasm/rom3.bat deleted file mode 100755 index 3eb1896..0000000 --- a/ProfRom_Disasm/rom3.bat +++ /dev/null @@ -1,5 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom3_trdos.a80 >> !log\error.txt - diff --git a/ProfRom_Disasm/rom3_trdos.a80 b/ProfRom_Disasm/rom3_trdos.a80 deleted file mode 100755 index ab49106..0000000 --- a/ProfRom_Disasm/rom3_trdos.a80 +++ /dev/null @@ -1,7187 +0,0 @@ -;АДРЕС: #3FF0 вывод в порт -;АДРЕС: #3FF3 чтение порта - - -;ИСХОДНЫЙ ТЕКСТ TR-DOS 5.03 для SjASMPlus - -;Основано на книге "ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04T (5.03) ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ." -;Автор книги: Федин Павел Юрьевич, 04.04.1996. -;Перевод всех чисел в шестнадцатеричный формат, переформатирование: Spectre, 19.10.2005 -;Исправление, переформатирование: Keeper, 21.06.2009 -;Кодировка: CP-1251 -;Правка под версию Tr-Dos 5.03: PLM, 2022.04.03 - - DEVICE ZXSPECTRUM48 - -;Адрес 0. Полная инициализация системы. - - ORG 0 - -x0000 DI - JP x0844 ;new - LD A,7 - JR x0009 - -;Адрес 8. Инициализация системы. В DE поместите адрес вершины памяти, в A - 7 и запретите прерывания. Используется также с адреса 9. - -x0008 NOP -x0009 NOP - NOP -x000B LD A,#3F -x000D JR x0013 -x000F NOP - -;Адрес #10. Переход к подпрограмме печати символа из регистра A. - -x0010 JP x3D82 - -;Адрес #13. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x0013 LD I,A - JP x001B - -;Адрес #18. Переход к подпрограмме печати строки. - -x0018 JP x2707 - -;Адрес #1B. То же, что и #24. - -x001B ld h,d - ld l,e - inc de - JR x0024 - -;Адрес #20. Переход к подпрограмме вызова подпрограмм из ПЗУ бейсика. Адрес вызываемой подпрограммы поместите в двух байтах после команды RST #20. Например: - -x0020 JP x2F72 -x0023 RET - -;Адрес #24. Инициализация системы. В DE поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x0024 ld (hl),#00 - JR x002B ;инициализация системы - -;Адрес #28. Выборка адреса текущего канала с учетом сдвига, заданного в регистре C. - -x0028 JP x2323 - -;Адрес #2B. Инициализация системы. В DE и HL поместите адрес вершины памяти, установите белый бордюр, поместите в A старший байт низшего адреса памяти и запретите прерывания. - -x002B ld bc,#BFFF - jr x003A -x0030 nop - nop - nop -x0033 out (c),a - nop - halt - rst #38 - -;Адрес #38. Обработка маскируемого прерывания. - -x0038 ei - ret - -;Адрес #3A. Инициализация системы. В DE поместите адрес вершины памяти в HL - адрес дна, установите белый бордюр, заполните обозначенную область памяти байтом 2 и запретите прерывания. - -x003A ldir - jr x0048 - nop - nop - nop - nop - nop - nop - nop - nop - nop - nop - -x0048 LD (#5CB4),HL ;установка P_RAMT - LD DE,#3EAF ;адрес символов для UDG - LD BC,#A8 ;длина UDG - #A8 байтов - LD A,E - EX DE,HL ;переброска адреса символов для UDG в HL - LD SP,#6000 ;установка временного стека - LD (#5F00),HL ;сохранение адреса символов для UDG - LD HL,#79 ;возвращаться в #79 - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#B8ED ;код команды LDDR - JR x0069 ;установка UDG - -;Адрес #66. Подпрограмма обработки немаскируемого прерывания. - -x0066 JP x2A56 - -;Адрес #69. Выполнение любой команды процессора. Поместите в HL коды команды, установите регистры (#5F00 вместо HL) и поместите в HL коды команды. - -x0069 LD (#5F10),HL ;помещение кодов команды в память - PUSH AF ;сохранение AF - LD A,#C9 ;код команды RET - LD (#5F12),A ;помещение его в память - POP AF ;восстановление AF - LD HL,(#5F00) ;берем адрес символов для UDG - JP #5F10 ;выполнение команды и возврат - -;Адрес #79. Инициализация системы. Установите P_RAMT, знакогенератор пользователя, белый бордюр, поместите в DE адрес начала знакогенератора минус 1 и запретите прерывания. - -x0079 EX DE,HL ;загрузка адреса UDG в HL - INC HL - LD (#5C7B),HL ;установка переменной UDG - DEC HL ;следующий адрес - LD BC,#1E40 ;установка RASP и PIP - LD (#5C38),BC - LD (#5CB2),HL ;установка RAMTOP - LD HL,#3C00 ;установка CHARS - LD (#5C36),HL - LD HL,(#5CB2) ;берем адрес RAMTOP - LD (HL),#3E ;признак конца стека GO SUB - DEC HL ;следующий адрес - LD SP,HL ;установка постоянного стека - DEC HL ;установка ERR_SP - DEC HL - LD (#5C3D),HL - LD DE,#1303 ;адрес подпрограммы обработки ошибок - PUSH DE ;установка его - IM 1 ;установка первого режима прерываний - LD IY,#5C3A ;установка регистра IY - LD HL,#5CB6 ;установка CHANS - LD (#5C4F),HL - LD DE,#15AF ;адрес области описателей каналов в ПЗУ бейсика - LD BC,#15 ;ее длина - #15 байт - EX DE,HL - CALL x0117 ;перенос области описателей каналов в ОЗУ - EX DE,HL - DEC HL ;установка DATADD - LD (#5C57),HL - INC HL ;следующий адрес - LD (#5C53),HL ;установка PROG - LD (#5C4B),HL ;установка VARS - LD (HL),#80 ;конец области - INC HL ;следующий адрес - LD (#5C59),HL ;установка E_LINE - LD (HL),#D ;конец строки - INC HL ;следующий адрес - LD (HL),#80 ;конец области - INC HL ;следующий адрес - LD (#5C61),HL ;установка WORKSP - LD (#5C63),HL ;установка STKBOT - LD (#5C65),HL ;установка STKEND - LD A,#38 ;атрибуты экрана - LD (#5C8D),A ;установка ATTR_P - LD (#5C8F),A ;установка ATTR_T - LD (#5C48),A ;установка BORDER - LD HL,#523 ;установка REPDEL и REPPER - LD (#5C09),HL - DEC (IY-#3A) ;клавиши не нажаты - DEC (IY-#36) - LD HL,#15C6 ;адрес таблицы STRMS в ПЗУ бейсика - LD DE,#5C10 ;адрес переменной STRMS - LD BC,#0E ;длина таблицы - #18 байта - CALL x0117 ;перенос таблицы в ОЗУ - SET 1,(IY+1) ;открыт поток 3 - LD HL,#5CC2 ;помещение команды RET в ОЗУ - LD (HL),#C9 - -;Внимание!!! Системных переменных TR-DOS пока еще нет, и это портит память. - - RST #20 ;инициализация буфера принтера и экрана - DW #0EDF - LD HL,#5C6B ;буфер принтера использовался - LD (HL),2 - LD HL,#128B ;возвращаться в #128B - PUSH HL - LD A,#AA ;выполнять команду RUN "boot" - LD (#5B00),A - EI ;разрешение прерываний - JP x3D31 ;вход в TR-DOS - -;Адрес #117. Выполнение команды LDIR. Установите HL, DE и BC и поместите байт #C9 по адресу #5F12. - -x0117 LD (#5F00),HL ;сохранение HL - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#B0ED ;коды команды LDIR - LD (#5F10),HL ;помещение команды в ОЗУ - LD HL,(#5F00) ;восстановление HL - JP #5F10 ;выполнение команды и возврат - -;Адрес #12A. Обработка номера строки автостарта программы на бейсике. Установите #5D10 и загрузите программу. - -x012A CALL x20E5 ;изменение памяти и удаление буфера - CALL x1D97 ;очистка экрана - LD HL,(#5C59) ;берем адрес, по которому находится номер - INC HL ;строки автозапуска программы - LD E,(HL) ;берем этот номер - INC HL - LD D,(HL) - LD A,D ;это 0? - OR E - EX DE,HL ;переброска его в HL - JR Z,x0140 ;если это не 0, то программу запускать - XOR A - LD (#5D10),A -x0140 PUSH HL ;сохранение номера строки автостарта - CALL x0232 ;восстановление старого адреса подпрограммы обработки ошибок - POP HL ;восстановление номера строки автостарта - LD (#5C42),HL ;установка его - XOR A ;строку запускать с первого оператора - LD (#5C44),A - RST #20 ;очистка рабочей области памяти, стека калькулятора и буфера редактора - DW #16B0 - LD HL,(#5C53) ;выполнение RESTORE - DEC HL - LD (#5C57),HL - LD SP,(#5C3D) ;очистка стека - LD A,(#5D10) ;программу запускать? - OR A - LD HL,#1B76 ;адрес подпрограммы выполнения программы на бейсике - JR Z,x0166 ;если можно, то запуск программы - RST #20 ;сообщение O.K. - DW #1BB0 -x0166 PUSH HL ;помещение на стек адреса подпрограммы выполнения программы на бейсике - LD HL,#5CC2 ;помещение на стек адреса переключателя ПЗУ на бейсик - PUSH HL - RET ;переход к подпрограмме выполнения программы на бейсике - -;Адрес #16C. То же, что и #3D1A, но не создает системные переменные. - -x016C CALL x20F1 ;изменение памяти - CALL x294A ;создание буфера - LD A,#FF ;сообщения не печатать - LD (#5D15),A - XOR A ;обнуление #5CF7 - LD (#5CF7),A - LD A,#AA ;заставку не выводить - LD (#5D17),A - LD HL,#201 ;возвращаться в бейсик - LD (#5D1A),HL - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#5D1C),HL - DEC HL ;выделение места для адреса подпрограммы - DEC HL ;обработки ошибок - LD SP,HL - CALL x021D ;установка адреса подпрограммы обработки ошибок - LD HL,(#5CB2) ;командная строка находится выше RAMTOP? - LD DE,(#5C5D) - SBC HL,DE - EX DE,HL - JR NC,x01A5 ;если да, то при выделении буфера она не - OR A ;перемещалась - LD DE,#101 - SBC HL,DE -x01A5 LD (#5C5D),HL -x01A8 CALL x01C7 ;следующий символ строки ENTER? -x01AB JP Z,x01D3 ;если да, то завершение - CP #EA ;это REM? - INC HL ;следующий символ - JR NZ,x01A8 ;если нет, то следующий символ - CALL x01C7 ;следующий символ строки ENTER? - JR Z,x01AB ;если да, то завершение - CP ":" ;это двоеточие? - JP NZ,x01D3 ;если нет, то возврат - INC HL ;следующий символ - CALL x3048 ;сжатие строки - LD HL,(#5D11) - JP x030A ;выполнение команды - -;Адрес #1C7. берет символ по адресу из HL и возвращает его в аккумуляторе плюс флаг Z если это 0, #D или #80, иначе NZ. - -x01C7 LD A,(HL) ;берем байт по нужному адресу - CP #D ;это #D? - RET Z ;если да, то возврат - CP #80 ;это #80? - RET Z ;если да, то возврат - OR A ;сравнение его с нулем - RET ;возврат - -x01D0 CALL x1E43 - -;Адрес #1D3. Подпрограмма завершения. Вход: установить #5CB6, #5D0C, #5D0F, #5D11, #5D18, #5D1A, #5D1C и #5D1F. Выход: в SP адрес из #5D1C, а в BC код ошибки. - -x01D3 LD HL,0 ;буфер убирать, память изменять - LD (#5CF8),HL - CALL x20E5 ;если есть буфер, то уберем его - CALL x1D63 ;если надо, то очистка рабочей области памяти - LD HL,#5D17 ;заставку не выводить - LD (HL),#AA - LD HL,#5D1F ;команда поступила из машинного кода? - LD A,(HL) - OR A - LD (HL),0 ;следующая команда будет не из машинного кода - JR NZ,x01F3 ;если команда была не из машинного кода, то - CALL x1E1C ;удаление из строки 5-байтовых чисел - CALL x0212 ;и прогон символов до конца строки -x01F3 LD SP,(#5D1C) ;помещаем в SP адрес из #5D1C - LD HL,(#5D1A) ;берем адрес выхода из этой подпрограммы - LD BC,(#5D0F) ;помещаем в BC код ошибки - LD B,0 - JP (HL) ;переход по назначенному адресу - -;Адрес #201. Проверка на ошибку. Вход: установите #5C3A и #5D13. - -x0201 CALL x0232 ;помещение в #5C3D адреса из #5D13 - BIT 7,(IY+0) ;была ошибка? - RET NZ ;если нет, то возврат - LD DE,#5CC2 ;адрес команды RET в ОЗУ - LD SP,(#5C3D) ;установка SP на дно стека - PUSH DE ;переход на обработку ошибок - RET - -;Адрес #212. Прогон символов до конца строки. Установите в #5C5D адрес одного из символов строки. На выходе там будет адрес конца строки. - -x0212 CALL x1D8C ;берем текущий символ строки - CP #D ;это ENTER? - RET Z ;если да, то возврат - CALL x1E2A ;берем следующий символ строки - JR x0212 ;повтор - -;Адрес #21D. Установка адреса обработки ошибок. Вход: в #5D1C должен быть адрес на 2 больше того, по которому размещаете адрес подпрограммы обработки ошибок. Выход: старое содержимое #5C3D копируется в #5D13, а в #5C3D помещается адрес, по которому находится размещенный адрес. - -x021D LD HL,(#5C3D) ;сохранение старого содержимого #5C3D - LD (#5D13),HL - LD HL,(#5D1C) ;берем адрес из #5D12 - DEC HL ;берем нужный нам адрес - DEC HL - LD (#5C3D),HL ;установка #5C3D - LD DE,x3D16 ;адрес подпрограммы обработки ошибок - LD (HL),E ;запись его в наши ячейки - INC HL - LD (HL),D - RET ;возврат - -;Адрес #232. Помещение в #5C3D адреса из #5D13. Установите #5D13. - -x0232 LD HL,(#5D13) - LD (#5C3D),HL - RET - -;Адрес #239. Вход в командный процессор. Используется также с адреса #27B (запуск файла "boot"). - -x0239 LD HL,0 ;обнуление #5CF7 и #5CF8 - LD (#5CF7),HL - ADD HL,SP ;сохранение SP - LD (#5D1C),HL - DEC HL ;выделение места для адреса подпрограммы - DEC HL ;обработки ошибок - LD SP,HL - CALL x021D ;установка адреса подпрограммы обработки ошибок - LD HL,#5D17 ;заставку выводить? - LD A,(HL) - CP #AA - LD A,0 ;ошибок нет - LD (#5D0F),A - JP Z,x02CB ;если заставка не нужна, то переход к командному процессору - LD (HL),#AA ;в следующий раз заставку не выводить - CALL x1D97 ;очистка экрана - CALL x1D88 ;открытие потока 2 - LD HL,x0360 ;вывод текста заставки - RST #18 - CALL x106E ;вывод цветных полос - LD A,(#5CB6) ;интерфейс-1 есть? - CP #F4 - JR Z,x0271 ;если да, то - LD HL,x1000 ;вывод "Interface one fitted" - RST #18 -x0271 LD A,(#5B00) ;файл "boot" запускать? - CP #AA - JR NZ,x02CB ;если нет, то вход в командный процессор - CALL x20F1 ;изменение памяти -x027B LD HL,(#5C59) ;берем адрес буфера команд - LD A,#FE ;был запущен файл "boot" - LD (#5D0E),A - LD (HL),#F7 ;ввод команды RUN "boot" - INC HL - LD (HL),#22 - INC HL - LD (HL),"b" - INC HL - LD (HL),"o" - INC HL - LD (HL),"o" - INC HL - LD (HL),"t" - INC HL - LD (HL),#22 - INC HL - LD (#5C5B),HL ;установка адреса курсора - LD (HL),#D ;ENTER - INC HL - LD (HL),#80 ;конец области - INC HL - LD (#5C61),HL ;установка переменной WORKSP - LD (#5C63),HL ;установка и очистка стека калькулятора - LD (#5C65),HL - SET 3,(IY+1) ;установка режима L - JR x02EF ;выполнение команды - -;Адрес #2B0. Перенос трех байтов из адреса HL по адресу DE. - -x02B0 LD B,3 ;количество байтов -x02B2 LD A,(HL) ;перенос байта - LD (DE),A - INC HL ;адреса следующих байтов - INC DE - DJNZ x02B2 ;повтор до конца - RET ;возврат - -;Адрес #2B9. Остановка дисковода. В A поместите значение системного регистра. - -x02B9 LD B,#20 ;#20 повтора -x02BB PUSH BC ;сохранение количества повторов - XOR 8 ;переключение бита 3 - OUT (#FF),A ;загрузка системного регистра - PUSH AF ;сохранение значения системного регистра - LD A,5 ;задержка в #462A такта - CALL x3DFF - POP AF ;восстановление значения системного регистра - POP BC ;и количества повторов - DJNZ x02BB ;повтор до конца - RET ;возврат - -;Адрес #2CB. Командный процессор. Используется также с адресов: -;#2EF - исполнение команды. Сжатую команду поместите в буфер командной строки; -;#30A - исполнение команды. Установите все для #1D3, #5D11 и загрузите из #5D11 HL. - -x02CB LD HL,(#5D1C) ;очистка стека - DEC HL - DEC HL - LD SP,HL - CALL x20F1 ;изменение памяти - CALL x1D83 ;открытие потока 0 - LD A,(#5D16) ;выбор дисковода D: - OR 3 - CALL x02B9 ;остановка его - LD A,(#5D16) ;остановка текущего дисковода - CALL x02B9 - XOR A ;сообщения об ошибках печатать - LD (#5D15),A - CALL x2135 ;принятие команды - CALL x3032 ;сжатие командной строки -x02EF CALL x1D9F ;очистка низа экрана - LD HL,x02CB ;возвращаться в командный процессор - LD (#5D1A),HL - XOR A ;ошибок не было - LD (#5D0F),A - LD HL,(#5C59) ;берем адрес командной строки - PUSH HL ;сохраняем его - LD DE,#5D20 ;адрес буфера - CALL x02B0 ;сохранение трех первых символов строки - POP HL ;восстановление адреса строки - LD (#5D11),HL ;установка адреса командной строки -x030A LD A,(HL) ;берем первый символ строки - LD B,A ;сохраняем его - AND #80 ;его код меньше #80? - LD A,B ;восстановление символа - JR Z,x031A ;если его код меньше #80, то дисковод не устанавливать - CP #FE ;это RETURN? - JR Z,x031A ;если да, то дисковод не устанавливать - PUSH AF ;сохранение символа - CALL x3DC8 ;активизация дисковода по умолчанию - POP AF ;восстановление символа -x031A LD HL,x2FF3 ;адрес таблицы команд - DEC HL - LD C,0 ;проверка первой команды -x0320 INC C - LD D,A ;сохранение символа - LD A,#15 ;пройдена вся таблица? - CP C - JP C,x01D3 ;если да, то завершение - -;Лучше было бы поставить здесь JP C,#1D1A для выдачи сообщения "*ERROR*". - - LD A,D ;восстановление символа - INC HL ;адрес следующей команды в таблице - CP (HL) ;символы совпали? - JR NZ,x0320 ;если нет, то повтор - CP #FE ;введена команда RETURN? - CALL NZ,x294A ;если нет, то создание буфера - LD A,9 ;поиск файла вести по 9 байтам - LD (#5D06),A - XOR A ;ошибок не было - LD (#5D0F),A - LD (#5CD6),A ;расширение файла принимать - LD (#5D10),A ;на случай загрузки или верификации файла - LD HL,#5C3B ;проверка строки на синтаксис - RES 7,(HL) - LD B,0 ;перевод номера команды в двухбайтную форму - LD HL,x3008 ;адрес таблицы адресов подпрограмм - DEC C ;команды считать с нуля - SLA C ;умножение номера подпрограммы на 2 - ADD HL,BC ;определение адреса в таблице - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - EX DE,HL ;переносим его в HL - PUSH HL ;сохраняем его - LD DE,x0359 ;возврат будет в #359 - PUSH DE - JP (HL) ;вызов подпрограммы -x0359 LD HL,#5C3B ;выполнение команды - SET 7,(HL) - POP HL ;восстановление адреса подпрограммы - JP (HL) ;вызов подпрограммы - -;Адрес #360. Текст заставки TR-DOS. - -x0360 DB #16,1,#5 - DB "* TR-DOS Ver 5.03 *" - DB #D,#D,#7F - DB " 1986 Technology Research Ltd." - DB #16,5,#B - DB "(U.K.)" - DB #16,7,5 - DB "BETA 128" - DB 0 - -;Адрес #3AC. Завершение выдачи каталога. - -x03AC CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - CALL x3D80 ;перевод строки - CALL x3D80 ;еще раз - LD BC,(#5E0A) ;берем количество свободных секторов на диске - CALL x1DA9 ;печать его - LD HL,x29D2 ;печать FREE - RST #18 - -;Адрес #3C0. Переход к подпрограмме завершения. - -x03C0 JP x01D3 - -;Адрес #3C3. Печать сообщения об ошибке. В HL установите адрес сообщения, в A - код ошибки. - -x03C3 PUSH AF ;сохранение кода ошибки - LD A,(#5D0E) ;ошибка произошла при автозагрузке? - CP #FE - JR NZ,x03CD ;если нет, то установка кода ошибки - POP AF ;снятие со стека кода ошибки - RET ;возврат -x03CD POP AF ;восстановление кода ошибки - LD (#5D0F),A ;установка кода ошибки - LD A,(#5D15) ;печать сообщений разрешена? - OR A - CALL Z,x2707 ;если да, то печать сообщения - -;Ошибка!!! Перед печатью надо открыть поток 0 и очистить низ экрана. - - RET ;возврат - -x03D9 LD HL,x2A28 - LD A,1 - JP x1C4A - -;Адрес #3E1. Вывод сообщения O.K. - -x03E1 LD HL,x2766 ;адрес сообщения O.K. - XOR A ;код ошибки - 0 - JP x1C4A ;выдача сообщения и завершение - -;Адрес #3E8. Загрузка сектора 0 дорожки 0 в буфер. Обнуляет #5CCC. Используется также с адресов: -;#3EC - загрузка сектора дорожки 0 в буфер. Установите #5CCC. -;#3F2 - загрузка сектора в буфер, номер сектора в E, дорожки ? в D). - -x03E8 XOR A ;текущий сектор 0 - LD (#5CCC),A -x03EC LD DE,(#5CCC) ;берем номер сектора - LD D,0 ;дорожка 0 -x03F2 CALL x294A ;создание буфера - LD HL,#5D25 ;загружать в буфер - LD B,1 ;1 сектор - JP x1E3D ;загрузка сектора - -;Адрес #3FD. Загрузка в буфер сектора 8 дорожки 0. Установите #5D0C. - -x03FD CALL x294A ;создание буфера, если его нет - LD DE,8 ;дорожка 0, сектор 8 - JR x03F2 ;загрузка сектора в буфер - -;Адрес #405. Настройка на диск. Меняет переменную с типом дисковода. - -x0405 CALL x03FD ;чтение в буфер сектора 8 дорожки 0 - LD A,(#5E0C) ;диск от TR-DOS? - CP #10 - JR Z,x0415 ;если да, то установка типа дисковода - LD HL,x29E2 ;адрес сообщения DISC ERROR - RST #18 ;печать сообщения - JR x03C0 ;завершение - -;Внимание, ошибка!!! Неправильно обрабатывается ошибка. Здесь программа должна быть такой: -; LD HL,#29E2 -; LD A,7 -; JP #1C4A -;А в этом случае ваша программа не получит код ошибки, а внизу экрана совершенно не к месту появится DISC ERROR. - -x0415 CALL x3E11 ;берем тип дисковода - RES 0,(HL) ;установка типа дисковода под тип диска - RES 1,(HL) ;и возврат - LD A,(#5E08) - BIT 0,A - JR NZ,x0425 - SET 0,(HL) -x0425 BIT 3,A - RET NZ - SET 1,(HL) - RET - -;Ошибка!!! Перед установкой типа надо бы проверить совместимость диска и дисковода. - -;Адрес #42B. Проверка второго символа командной строки. Вход: установите #5D11. На выходе будет установлен флаг Z, если это ENTER и сброшен, если нет. - -x042B LD HL,(#5D11) ;берем адрес начала строки команды - INC HL ;берем адрес ее второго символа - LD A,(HL) ;берем этот символ - CP #D ;сравнение его с ENTER - RET ;возврат - -;Адрес #433. Выполнение команды CAT. Установите #5D11 и #5C3B. Используется также с адреса: -;#479 (вывод каталога диска; в A - номер потока, в буфере - сектор 8 дорожки 0). - -x0433 CALL x042B ;второй символ строки команды ENTER? - LD BC,2 ;каталог выводить в поток 2 - LD (#5CDB),BC - JR Z,x046A ;если второй символ строки ENTER, то вывод каталога - CP "#" ;второй символ строки "#"? - JR NZ,x045D ;если нет, то установка дисковода и вывод каталога - LD (#5C5D),HL ;установка CH_ADD на второй символ строки - CALL x1E0B ;установка номера потока - CALL x1D8C ;берем текущий символ - CP #D ;это ENTER? - JR Z,x046A ;если да, то вывод каталога - CP "," ;это запятая? - JP NZ,x1D1A ;если нет, то синтаксическая ошибка - CALL x1E2A ;берем следующий символ - CALL x1DBD ;помещение имени дисковода на стек калькулятора - JR x0460 ;установка дисковода и вывод каталога -x045D CALL x1DDF ;установка CH_ADD и помещение имени дисковода на стек калькулятора -x0460 CALL x1D75 ;если строка проверяется на синтаксис, то возврат - CALL x1DB5 ;снятие имени дисковода со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода -x046A CALL x1D75 ;если проверка на синтаксис, то возврат - LD A,(#5CF6) ;помещение номера дисковода в #5CF9 - LD (#5CF9),A - CALL x0405 ;настройка на диск - LD A,(#5CDB) ;берем номер потока -x0479 CP 2 ;выводим в поток 2? - PUSH AF ;сохранение номера потока - CALL Z,x1D97 ;если назначен поток 2, то очистка экрана - POP AF ;восстановление номера потока - CP #11 ;он больше #10? - -;Ошибка!!! Всего потоков #F, а не #10. - - JP NC,x1D1A ;если да, то ошибка - CALL x1D84 ;открытие потока - -;Ошибка!!! Надо бы проверить, подключен ли куда-нибудь этот поток. - - LD A,#FF ;установка #5CF8 в #FF - LD (#5CF8),A - LD HL,x29F7 ;печать TITLE: - RST #18 - LD HL,#5E1A ;печать имени диска - RST #18 - CALL x3D80 ;перевод строки - LD A,(#5E09) ;вычисление количества нестертых файлов на диске - LD HL,#5E19 - SUB (HL) - PUSH HL - CALL x1DA3 ;печать его - LD HL,x2A2B ;печать FILES - RST #18 - POP HL - LD C,(HL) ;берем количество стертых файлов - CALL x1DA4 ;печать его - LD HL,x2A1D ;печать DEL.FILES - RST #18 - CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 - LD HL,#5D25 ;берем начало буфера -x04B6 CALL x04F6 ;проверка достижения конца каталога - CALL x3D80 ;перевод строки - LD A,(#5CF6) ;печать имени дисковода - ADD A,"A" - RST #10 - LD B,2 ;печатаем по 2 имени в строке -x04C4 CALL x04F6 ;если файл стерт, то пропуск его - PUSH BC ;сохранение количества имен файлов в строке - LD A,":" ;печать двоеточия - RST #10 - PUSH HL ;сохранение адреса текущего описателя файла в буфере - CALL x2938 ;печать имени и расширения файла - LD BC,#D ;вычисление адреса, по которому находится - POP HL ;размер файла в секторах - PUSH HL - ADD HL,BC - LD C,(HL) ;берем размер файла - PUSH BC ;сохраним его - LD A,C ;перегрузим его в A - LD B,2 ;вычисление количества пробелов перед числом - CP #A - JR C,x04DF - DEC B -x04DF CP #64 - JR NC,x04E8 -x04E3 LD A," " ;печать пробелов - RST #10 - DJNZ x04E3 -x04E8 POP BC ;восстановление размера файла - CALL x1DA9 ;печать его - POP HL ;восстановление адреса текущего описателя файла - POP BC ;восстановление количества имен файлов в строке - LD DE,#10 ;следующий описатель - ADD HL,DE - DJNZ x04C4 ;если напечатали только 1 файл, то печать второго - JR x04B6 ;следующая строка - -;Адрес #4F6. Проверка переменной #5CF9 и проверка достижения конца каталога при его печати. - -x04F6 PUSH HL ;сохранение HL и BC - PUSH BC - LD A,(#5CF9) ;берем номер дисковода для выдачи каталога - LD HL,#5CF6 ;назначен этот дисковод? - CP (HL) - CALL NZ,x3DCB ;если нет, то о последствиях читайте в конце - -;Ошибка в программе!!! Об этом особо в конце текста. - - POP BC ;восстановление HL и BC - POP HL - JP x2FC6 ;проверка достижения конца каталога и возврат - -;Обратите особое внимание на команду CALL NZ,#3DCB. В аналогичной подпpогpамме для LIST стоит CALL NZ,#3DCB. В нашем же случае упpавление будет передано в подпрограмму печати символа (ее адрес #3D80) на адрес, где находятся 2 байта адреса от команды CALL #3D94. Программа с этого адреса будет такой: -;SUB H -;DEC A -;CALL #20F1 -;POP DE -;POP BC -;POP HL -;RET -;Таким образом, произойдет изменение памяти, если оно разрешено, затем со стека будут сняты 3 адреса и помещены в регистры и затем произойдет возврат. Последствия всего этого определяются программой, вызвавшей #4F6. - -;Адрес #507. Прибавление #10 к HL. - -x0507 LD DE,#10 - ADD HL,DE - RET - -;Адрес #50C. Проверка и обработка достижения конца буфера при работе с каталогом. Установите #5CCC и поместите в HL текущее место буфера. Если достигнут его конец, то в HL будет начало буфера и в него будет загружен следующий сектор каталога. - -x050C PUSH HL ;сохранение HL и BC - PUSH BC - LD BC,#A1DB ;достигнут конец буфера? - ADD HL,BC - JR C,x0517 ;если да, то загрузка следующего сектора - POP BC ;восстановление HL и BC - POP HL - RET ;возврат -x0517 LD HL,#5CCC ;следующий сектор - INC (HL) - CALL x03EC ;загрузка его в буфер - POP BC ;восстановление BC и HL - POP HL - LD HL,#5D25 ;помещение в HL адреса начала буфера - RET ;возврат - -;Адрес #524. Вычисление номера дисковода по его имени. Имя поместите в А, на выходе там будет номер. - -x0524 AND #DF ;буква заглавная - SBC A,#41 ;вычисление номера дисковода - JP C,x1D1A ;если именем был символ меньше "A", то ошибка - CP 4 ;номер получился больше 3? - JP NC,x1D1A ;если да, то ошибка - RET ;возврат - -x0531 CALL x1DB5 - LD A,C - CP B - JP Z,x1D1A - RET - -;Адрес #53A. Выполнение команды NEW. Установите #5D11 и #5C3B. Используется также с адреса #569 (запись информации о файле; номер файла задайте в регистре C). - -x053A CALL x1DCD ;прием имен файлов на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка старого имени файла - LD A,(#5CF6) ;берем номер дисковода - LD (#5CF8),A ;сохраняем его - JP NZ,x03D9 ;если файл не найден, то ошибка - PUSH BC ;сохранение номера файла - CALL x165D ;загрузка описателя файла - CALL x1CB0 ;установка нового имени файла - PUSH AF ;сохранение результата проверки имени файла - LD A,(#5CF8) ;в новом имени файла назначен другой дисковод - LD HL,#5CF6 - CP (HL) - JP NZ,x1D1A ;если да, то ошибка - CALL x0405 ;настройка на диск - POP AF ;восстановление результата проверки имени файла - JP Z,x1C50 ;если такой файл уже есть, то ошибка - POP BC ;восстановление номера файла -x0569 CALL x166B ;загрузка сектора с описателем файла и замена описателя - CALL x1E43 ;перезапись сектора - JP x03E1 ;сообщение O.K. - -;Адрес #572. Проверка переменной #5D10. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. - -x0572 LD A,(#5D10) - OR A - RET - -;Адрес #577. Проверка количества стертых файлов. Установите #5D11. Если там 0, то будет сообщение NO FILE, иначе O.K. - -x0577 LD A,(#5D07) ;берем количество стертых файлов - OR A ;оно равно 0? - JP Z,x03D9 ;если да, то NO FILE - JP x03E1 ;иначе O.K. - -;Адрес #581. Запрос на стирание файла. Установите #5CDD и #5CF6, а в регистр C поместите номер файла. При ответе Y файл будет стерт и включится флаг Z, иначе он будет выключен. - -x0581 PUSH BC ;сохранение номера файла - CALL x1D97 ;очистка экрана и открытие потока 0. - LD A,(#5CF6) ;берем номер дисковода - ADD A,"A" ;вычисляем имя дисковода - CALL x3D82 ;печать его - LD A,":" ;печать двоеточия - CALL x3D82 - LD HL,#5CDD ;адрес переменной с именем и расширением файла - CALL x2938 ;печать имени и расширения файла - LD HL,x2820 ;печать FILE EXISTS. OVERWRITE? - CALL x2707 - CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - PUSH AF ;сохранение результата проверки - CALL x1D97 ;очистка экрана - POP AF ;восстановление AF и номера файла - POP BC - RET NZ ;если был ответ N, то возврат - PUSH BC ;сохранение номера файла - CALL x1D97 ;очистка экрана - POP BC ;восстановление номера файла - CALL x0781 ;стирание файла - XOR A ;включение флага Z - RET ;возврат - -;Адрес #5B4. Проверка на существование блока файла с расширением #. Установите #5CDD, #5CE5 и #5CE6. Если блок найден или у файла другое расширение, то включается флаг Z, иначе он будет выключен. - -x05B4 LD A,(#5CE5) ;берем расширение файла - CP "#" ;это "#"? - JR Z,x05BD ;если нет, то - XOR A ;включение флага Z - RET ;и возврат -x05BD LD A,#A ;файл ищем по #A байтам - LD (#5D06),A - CALL x1CB3 ;поиск файла - LD A,9 ;файл ищем по 9 байтам - LD (#5D06),A - RET ;возврат - -;Адрес #5CB. Выполнение команды COPY "*","*". Первую звездочку поместите в #5CDD, вторую - на стек калькулятора и установите #5CF8, #5D23 и #5CCF. - -x05CB LD A,(#5CDD) ;берем первый символ имени файла - CP "*" ;это "*"? - JP NZ,x03D9 ;если нет, то NO FILE - CALL x1DB5 ;снятие строки со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода-приемника - LD A,(HL) ;берем следующий символ строки - CP "*" ;это "*"? - JP NZ,x1D1A ;если нет, то ошибка - LD A,(#5CF6) ;сохранение номера дисковода-приемника - LD (#5CF9),A - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,#FF ;начнем с файла 0 - LD (#5D0D),A -x05F4 LD A,(#5CF8) ;выбор дисковода-источника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,(#5D0D) ;следующий файл - INC A - LD (#5D0D),A - LD C,A - CALL x165D ;чтение его описателя - LD A,(#5CDD) ;берем первый символ его имени - CP 0 ;это конец каталога? - JP Z,x03E1 ;если да, то O.K. - CP 1 ;файл стерт? - JR Z,x05F4 ;если да, то следующий файл - LD HL,#5CE6 ;сохранение части описателя файла - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - CALL x1CB3 ;поиск файла - JR NZ,x0634 ;если не нашли, то копирование файла - CALL x05B4 ;проверка файла с расширением "#" - JR NZ,x0634 ;если копируется другой блок, то копируем его - CALL x0581 ;запрос OVERWRITE? - JR NZ,x05F4 ;если был ответ N, то следующий файл -x0634 CALL x063C ;копирование файла - CALL x1E43 ;перезапись сектора с описателем файла - JR x05F4 ;повтор до конца каталога - -;Адрес #63C. Копирование файла при двух дисководах. Поместите описатель файла в #5CDD и его часть в #5CED. - -x063C CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - CP #80 ;уже есть #80 файлов? - JP Z,x1C45 ;если да, то NO SPACE - -;Ошибка!!! Надо выводить DIRECTORY FULL. - - LD HL,#5CED ;восстановление описателя файла - LD DE,#5CE6 - LD BC,7 - LDIR - LD DE,(#5CEA) ;берем длину файла в секторах - LD D,0 - OR A - LD HL,(#5E0A) ;берем количество свободных секторов на диске - SBC HL,DE ;уменьшаем свободное место - JP C,x1C45 ;если места не хватило, то NO SPACE - LD (#5E0A),HL ;установка нового количества свободных секторов - LD HL,(#5E06) ;берем адрес свободного пространства на диске - LD (#5CEB),HL ;установка адреса файла на диске - PUSH HL ;сохранение его - CALL x072F ;копирование файла - POP HL ;восстановление адреса файла на диске - LD (#5CEB),HL ;установка его - LD HL,(#5CF4) ;берем новый адрес свободного места на диске - LD (#5E06),HL ;установка его - LD HL,#5E09 ;записали 1 файл - INC (HL) - LD C,(HL) ;берем номер записываемого файла - DEC C - LD B,0 - PUSH BC ;сохраняем его - LD DE,9 ;записывать сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - POP BC ;восстановление номера файла - CALL x166B ;установка описателя файла - RET ;возврат - -;Адрес #690. Выполнение команды COPY. Установите #5D11 и #5C3B. - -x0690 LD HL,(#5D11) ;берем адрес второго символа командной строки - INC HL - LD A,(HL) ;берем этот символ - AND #DF ;буква заглавная - CP "S" ;это "S"? - JP Z,x1360 ;если да, то копируем 1 файл на одном дисководе - CP "B" ;это "B"? - JP Z,x152C ;если да, то копирование всего диска на одном дисководе - CALL x1DCD ;прием имен файлов - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;выделение места в памяти - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка старого имени файла - LD A,(#5CF6) ;сохранение номера дисковода - источника - LD (#5CF8),A - JP NZ,x05CB ;если файл не найден, то проверка COPY "*","*" - -;Ошибка!!! COPY "*","*" надо проверять всегда, иначе при наличии на диске файла с именем "*" скопируется только этот файл, а в целом тут должно быть так: -;LD (#5CF8),A -;PUSH AF -;CALL #5CB -;POP AF -;JP NZ,#3D9 -;А в подпрограмме #5CB вместо JP NZ,#3D9 должно быть RET NZ. - - CALL x165D ;чтение описателя файла - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - CALL x1CB0 ;установка нового имени файла - PUSH AF ;сохранение результата проверки - PUSH BC ;и номера файла - LD A,(#5CF6) ;сохранение номера дисковода - приемника - LD (#5CF9),A - LD A,(#5CF8) ;выбор дисковода - источника - CALL x3DCB - CALL x0405 ;настройка на диск - LD A,(#5CF9) ;выбор дисковода - приемника - CALL x3DCB - CALL x0405 ;настройка на диск - POP BC ;восстановление номера файла - POP AF ;и результата проверки нового имени файла - JR NZ,x06F3 ;если файл не найден, то копирование файла - CALL x05B4 ;проверка файла с расширением "#" - JR NZ,x06F3 ;если копируется другой блок, то копируем его - CALL x0581 ;запрос OVERWRITE? - JP NZ,x03E1 ;если был ответ N, то O.K. -x06F3 CALL x063C ;копирование файла - CALL x1E43 ;перезапись сектора с описателем файла - LD A,(#5CE5) ;берем расширение файла - CP "#" ;это "#"? - JP NZ,x03E1 ;если нет, то O.K. - LD A,#A ;файл искать по #A байтам - LD (#5D06),A - LD HL,#5CE6 ;следующий блок - INC (HL) - LD A,(#5CF8) ;выбор дисковода - источника - CALL x3DCB - CALL x05B4 ;поиск блока - JP NZ,x03E1 ;если не нашли, то O.K. - CALL x165D ;чтение его описателя - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF9) ;выбор дисковода - приемника - CALL x3DCB - CALL x0405 ;настройка на диск - JR x06F3 ;повтор - -;Адрес #72F. Копирование файла при двух дисководах. Установите -;#5CF1, #5D23, #5CF8, #5CF9, #5CF2, #5CCF и #5CEB. - -x072F LD A,(#5CF1) ;берем количество секторов - OR A ;все скопировали? - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;адрес переменной с длиной рабочей области памяти - SUB (HL) ;области хватит? - POP HL ;восстановление HL - JR NC,x0775 ;если рабочей области не хватит, то копируем часть файла - LD A,(#5CF1) ;копируем весь остаток - LD B,A - XOR A ;скопировали все - LD (#5CF1),A -x0744 PUSH BC ;сохранение количества копируемых сектоpов - LD A,(#5CF8) ;выбор дисковода-источника - CALL x3DCB - POP BC ;восстановление количества копируемых секторов - PUSH BC ;и снова сохранение его - LD HL,(#5CCF) ;берем адрес рабочей области памяти - PUSH HL ;сохраняем его - LD DE,(#5CF2) ;берем адрес части файла на диске-источнике - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CF2),HL ;на диске-источнике - LD A,(#5CF9) ;выбор дисковода-приемника - CALL x3DCB - POP HL ;восстановление адреса рабочей области памяти - POP BC ;и количества копируемых секторов - LD DE,(#5CEB) ;берем адрес части файла на диске-приемнике - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CEB),HL ;на диске-приемнике - JR x072F ;повтор -x0775 LD (#5CF1),A ;установка оставшегося количества секторов - PUSH HL ;сохранение HL - LD HL,#5D23 ;копируем столько секторов, сколько - LD B,(HL) ;поместится в рабочую область - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JR x0744 ;копирование секторов - -;Адрес #781. Стирание файлов. Вход: установите #5CDD, #5CE5, и произведите поиск файла. Программа устанавливает #5D08 и #5D07. - -x0781 XOR A ;обнуление количества стертых файлов - LD (#5D07),A - JR x07A0 ;стирание файлов - -;Адрес #787. Выполнение команды ERASE. Установите #5D11 и #5C3B. - -x0787 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - XOR A ;пока ничего не стерто - LD (#5D07),A - CALL x292F ;установка и проверка имени стираемого файла - CALL x07A0 ;стирание файла - JP NZ,x0577 ;если стерли файл не в конце каталога, то проверка, сколько файлов стерли - JP x03E1 ;сообщение O.K. - -;Адрес #7A0. Стирание файлов. Вход: установите #5CDD, #5CE5, обнулите #5D07 и произведите поиск файла. Программа устанавливает #5D08 и #5D07. - -x07A0 LD A,(#5CDD) ;сохранение первого символа имени файла - LD (#5D08),A - RET NZ ;если файл не был найден, то возврат - LD HL,#5D07 ;стерт еще один файл - INC (HL) - PUSH BC ;сохранение номера файла - CALL x03FD ;чтение в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - POP BC ;восстановление номера файла - INC C ;этот файл последний? - CP C - JR NZ,x07BC ;если нет, то стирание обычным порядком - DEC A ;на диске теперь на 1 файл меньше - LD (#5E09),A - XOR A ;стираемый файл в конце каталога -x07BC PUSH AF ;сохранение признака метода стирания - JR Z,x07C3 ;если файл не в конце каталога, - LD HL,#5E19 ;то увеличение на 1 количества стертых файлов - INC (HL) -x07C3 PUSH BC ;сохранение номера стираемого файла - CALL x1E43 ;перезапись сектора 8 дорожки 0 - POP BC ;восстановление номера стираемого файла - DEC C - CALL x165D ;загрузка описателя файла - POP AF ;восстановление флага метода стирания - JP Z,x07D2 ;если файл в конце каталога, то первый символ имени будет CHR$ 0 - LD A,1 ;иначе он будет CHR$ 1 -x07D2 LD (#5CDD),A ;установка первого символа имени - PUSH AF ;сохранение метода стирания - CALL x1E40 ;запись описателя файла - LD A,(#5D08) ;восстановление первого символа имени файла - LD (#5CDD),A - POP AF ;восстановление метода стирания - JR Z,x07E7 ;если стерт файл в конце каталога, то реорганизация описателя диска - CALL x1CB3 ;поиск следующего файла с таким именем - JR x07A0 ;стирание его, если он есть -x07E7 CALL x03FD ;чтение сектора 8 дорожки 0 - LD HL,(#5CEB) ;установка нового начала свободного места - LD (#5E06),HL - LD DE,(#5CEA) ;установка нового количества свободных секторов - LD HL,(#5E0A) - LD D,0 - ADD HL,DE - LD (#5E0A),HL - JP x1E43 ;перезапись сектора 8 дорожки 0 и возврат - -;Адрес #800. Позиционирование с быстрой скоростью перемещения головки. Поместите физический номер дорожки в регистр данных, а команду позиционирования - в аккумулятор. - -x0800 and #FC ;позиционировать с быстрой скоростью - jp x3D9A ;выдача команды и ожидание INTRQ - -x0805 db #FF,#FF - -;new Адpес #807. нажатие magic - -x0807 push af - ld a,r - push af - ld a,#04 - push af - inc sp - push bc - ld bc,#1FFD - push hl - ld hl,(#C001) - ex (sp),hl - ld a,#55 - ld (#C001),a - cpl - ld (#C002),a - ld a,#12 - jp x0033 - -;new Адрес #826. Вызов функции rst 8 -; a - номер дисковода - -x0826 ex (sp),hl - push af - ld a,#CF ;rst 8 - ld (#5CBF),a - ld a,(hl) - inc hl - ld (#5CC0),a - ld a,#C9 - ld (#5CC1),a - pop af - ex (sp),hl - push hl - ld hl,x3D2F - ex (sp), hl - push hl - ld hl,#5CBF - ex (sp),hl - ret - -;new Адрес #844. - -x0844 ld de,#4000 - ld a,#07 - jp x000B - -;new Адрес #84C. - -x084C rst #20 - dw #1F54 - ret c - rst #20 - dw #1B7B - -;new Адрес #853. - -x0853 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp #01 - jr z,x0867 - jr nc,x086B - bit 7,c - jr nz,x08A3 - jr x086F -x0867 bit 6,c - jr nz,x08A3 -x086B cp #04 - jr nc,x08A3 -x086F ld de,(#5CF4) - ld hl,(#5D00) - ld bc,#0105 - ld a,(#5CFE) - cp #A0 - jr nz,x0881 - inc c -x0881 call x0826 - db #81 - jr c,x088B - pop hl - pop de - ei - ret -x088B call x0A64 - ld b,#40 - cp #02 - jr z,x089C - ld b,#01 - cp #01 - jr z,x089C - ld b,#04 -x089C ld a,b - pop hl - pop de - ei - jp x3F39 -x08A3 ld hl,(#5D00) - ret - -;new Адрес #8A7. - -x08A7 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp #01 - jr z,x08BB - jr nc,x08BF - bit 7,c - jr nz,x08C7 - jr x08C3 -x08BB bit 6,c - jr nz,x08C7 -x08BF cp #04 - jr nc,x08C7 -x08C3 xor a - jp x3E63 -x08C7 jp x3D98 - -;new Адрес #8CA. - -x08CA ld (#5CCA),hl ;для дисководов C и D =#00 - ld a,#FF - ld (#5CD1),a ; - ld hl,#8282 - ret - -x08D6 DISPLAY "Free space at ",$,": ",/D,#901-$," byte(s)" - ds #08FF-$,#00 - ds #0901-$,#FF - -;new Адрес #901. -; a - номер дисковода - -x0901 ld (#5CF6),a ;номер дисковода - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0914 ;если да, то переход - jr nc,x0917 ;если дисковод C или D - bit 7,c ;дисковод A - ret nz ;если реальный дисковод, выход - jr x091A -x0914 bit 6,c - ret nz ;если реальный дисковод, выход -x0917 cp #04 - ret nc ;выход, если дисковод >3 -x091A or #80 - ld c,#28 ;подфункция #28 - call x0826 ;вызов rst 8 - db #81 - ld a,(#5CF6) ;номер дисковода - jr nc,x092D ;нет ошибки - cp #02 - ret c ;ошибка -x092A jp x3EE7 ;ошибка no disk -x092D ld hl,#5D16 - ld c,a - ld a,%00111100 - or c - ld (hl),a - ld a,(#5CF6) ;номер дисковода - ld c,#01 ;подфункция #01 (выбор текущего дисковода) - call x0826 ;вызов rst 8 - db #81 - jr c,x092A ;ошибка no disk - call x3E08 ;выборка времени перемещения головки текущего дисковода - ld (hl),#00 - call x3E11 ;выборка типа дисковода - ld (hl),#83 - ld a,#80 - ld (#5CCD),a ;гтовность дисковода - pop hl - ret - -x0951 DISPLAY "Free space at ",$,": ",/D,#A01-$," byte(s)" - ds #09FF-$,#00 - ds #0A01-$,#FF - -;new Адрес #A01. - -x0A01 ld a,(#5CF6) - push bc - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A16 ;если да, то переход - jr nc,x0A1A ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A2D - jr x0A1E -x0A16 bit 6,c - jr nz,x0A2D ;если реальный дисковод -x0A1A cp #04 - jr nc,x0A2D ;если дисковод >3 -x0A1E pop bc - ld d,c - push bc - ld c,#02 - call x0826 - db #81 - pop bc - jp c,x3EE7 - pop hl - ret -x0A2D pop bc - jp x1FEB - -;new Адрес #A31. - -x0A31 ld a,(#5CF6) - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A45 ;если да, то переход - jr nc,x0A49 ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A4F - jr x0A4D -x0A45 bit 6,c - jr nz,x0A4F -x0A49 cp #04 - jr nc,x0A4F -x0A4D pop hl - ret -x0A4F jp x3EB2 - -;new Адрес #A52. Чтение переменной монитора - -x0A52 push de - push bc - push hl - ld bc,#000D - ld de,#0004 - or a - call x0826 - db #82 - bit 5,a - jr x0A72 - -;new Адрес #A64. Чтение переменной монитора - -x0A64 push de - push bc - push hl - ld bc,#001D - ld de,#0004 - or a - call x0826 - db #82 -x0A72 pop hl - pop bc - pop de - ret - -;new Адрес #A76. - -x0A76 ld a,(#5CF6) - push bc - ld bc,#7FBA - in c,(c) - cp 1 ;дисковод B? - jr z,x0A8B ;если да, то переход - jr nc,x0A8F ;если дисковод C или D - bit 7,c ;дисковод A - jr nz,x0A97 - jr x0A93 -x0A8B bit 6,c - jr nz,x0A97 -x0A8F cp #04 - jr nc,x0A97 -x0A93 pop bc - xor a - inc a - ret -x0A97 pop bc - xor a - ret - -x0A9A DISPLAY "Free space at ",$,": ",/D,#B01-$," byte(s)" - ds #0AFF-$,#00 - ds #0B01-$,#FF - -;new Адрес #B01. - -x0B01 call x0A76 - jp z,x1FF6 - pop hl - jp x1F16 - -;new Адрес #B0B. - -x0B0B call x0A76 - ld hl,#5CD7 - ret z - inc hl - ld (hl),#00 - pop hl - ld hl,#5D25 - ld (hl),#00 - ld de,#5D26 - ld bc,#00FF - ldir - ld d,#00 -x0B25 ld e,#00 -x0B27 call x084C - ld hl,#5D25 - ld bc,#0106 - push de - call x0826 - db #81 - jr nc,x0B44 - call x0A64 - ld c,a - ld b,#00 - call x1DA9 - ld hl,#5CD6 - inc (hl) -x0B44 pop de - inc e - bit 4,e - jr z,x0B27 - ld a,#2B - rst #10 -xxx inc d - ld a,d - cp #A0 - jr nz,x0B25 - ret - -;new Адрес #B54. - -x0B54 call x0A76 - jp z,x1FEB - ret - -x0B5B DISPLAY "Free space at ",$,": ",/D,#C01-$," byte(s)" - ds #0BFF-$,#00 - ds #0C01-$,#FF - -;new Адрес #C01. - -x0C01 ld bc,#7FBA - in a,(c) - and %00000100 - jr z,x0C1C - ld bc,#047F -x0C0D in a,(#FF) - and #C0 - jp nz,x3FD1 - inc de - ld a,e - or d - jr nz,x0C0D - djnz x0C0D - ret -x0C1C ret - -;new Адрес #C1D. - -x0C1D ld bc,#7FBA - in a,(c) - and %00000100 - jr z,x0C38 - ld bc,#047F -x0C29 in a,(#FF) - and #C0 - jp nz,x3FEC - inc de - ld a,e - or d - jr nz,x0C29 - djnz x0C29 - ret -x0C38 ret - -x0C39 DISPLAY "Free space at ",$,": ",/D,#FF3-$," byte(s)" - ds #0CFF-$,#00 - ds #0D01-$,#FF - ds #0DFF-$,#00 - ds #0E01-$,#FF - ds #0EFF-$,#00 - ds #0F01-$,#FF - ds #0FF3-$,#00 - -x0FF3 push af - push bc - push de - jp x2A59 - -x0FF9 DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" - ds #FFF-$,#00 - ds #1000-$,#FF - - - DISPLAY "Free space at ",$,": ",/D,#1000-$," byte(s)" - DS #1000-$,#FF - -;Адрес #1000. Текст "Interface one fitted" - -x1000 DB #16,9,5 - DB "Interface one fitted" - DB 0 - -;Адрес #1018. Выполнение команды "*". Установите #5D11 и #5C3B. - -x1018 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x0531 ;снятие имени дисковода со стека калькулятора - LD A,(DE) ;берем первый символ имени - CALL x0524 ;вычисление номера дисковода - LD (#5D19),A ;установка дисковода по умолчанию - CALL x3DCB ;выбор дисковода - JP x03E1 ;сообщение O.K. - -;Адрес #102E. Прием расширения файла. Установите #5C5D и #5CD6. - -x102E LD B,"C" ;расширение C - LD A,(#5CD6) ;расширение принимать? - OR A - JR NZ,x104D ;если нет, то установка расширения файла - CALL x1D8C ;берем текущий символ - CP #AF ;это CODE? - LD B,"C" ;расширение C - JR Z,x104D ;если да, то установка расширения файла - CP #E4 ;это DATA? - LD B,"D" ;расширение D - JR Z,x104D ;если да, то установка расширения файла - CP "#" ;это #? - LD B,"#" ;расширение # - JR Z,x104D ;если да, то установка расширения файла - LD B,"B" ;расширение B -x104D LD HL,#5CE5 ;адрес переменной с расширением файла - LD (HL),B ;установка расширения - RET ;возврат - -;Адрес #1052. Ввод клавиши с ожиданием. - -x1052 DI ;запрет прерываний - PUSH HL ;сохранение регистров - PUSH BC - PUSH DE -x1056 RST #20 ;определение номера нажатой клавиши - DW #028E - LD C,0 ;режим клавиатуры - C или L - JR NZ,x1056 ;если нажата бессмысленная комбинация клавиш, то повтор - RST #20 ;определение кода нажатой клавиши - DW #031E - JR NC,x1056 ;если ничего не нажато, то повтор - DEC D ;режим клавиатуры - C или L - LD E,A ;помещение кода клавиши в регистр E - RST #20 ;обработка клавиш CAPS SHIFT и SYMBOL SHIFT - DW #0333 - POP DE ;восстановление регистров - POP BC - POP HL - AND #DF ;буква будет заглавная - EI ;разрешение прерываний - RET ;возврат - -;Адрес #106E. Вывод цветных полос для заставки. - -x106E LD HL,#58E5 ;адрес линии атрибутов - LD B,#A ;установка атрибутов -x1073 LD (HL),7 - INC HL - DJNZ x1073 - LD (HL),2 - INC HL - LD (HL),#16 - INC HL - LD (HL),#34 - INC HL - LD (HL),#25 - INC HL - LD (HL),#28 - INC HL - LD (HL),7 - LD HL,#40EE ;адрес верхней линии пикселей - LD B,8 ;8 линий пикселей в знакоместе - XOR A ;обнуление аккумулятора -x108F PUSH BC ;сохранение количества линий - SCF ;сдвиг пикселей - RLA - PUSH HL ;сохранение адреса линии пикселей - PUSH AF ;и байта для заполнения - LD B,5 ;в линии 5 байтов -x1096 INC HL ;заполнение линии - LD (HL),A - DJNZ x1096 - POP AF ;восстановление байта для заполнения линии, - POP HL ;адреса линии - POP BC ;и количества линий - LD DE,#100 ;берем адрес следующей линии - ADD HL,DE - DJNZ x108F ;повтор до конца - RET ;возврат - -x10A4 RET - -;Адрес #10A5. Сообщения команды LIST. - -x10A5 DB " Del." -x10AA DB " File(s)" - DB 0 -x10B3 DB "Title:" - DB #A0 -x10BA DB #17,#11 - DB " Disk Drive: " - DB 0 -x10CA DB #17,#10," ",0 -x10CE DB #17,#10," 40 Track S. Side" - DB 0 -x10E2 DB #17,#10," 80 Track S. Side" - DB 0 -x10F6 DB #17,#10," 40 Track D. Side" - DB 0 -x110A DB #17,#10," 80 Track D. Side" - DB 0 -x111E DB #17,#10 - DB " Free Sector " - DB 0 -x112E DB #D,#D - DB " File Name Start Length Line" - DB 0 - -;Адрес #1151. Выделение #222 байтов в рабочей области. Устанавливает #5CCF. - -x1151 LD HL,(#5C61) ;берем адрес рабочей области - LD (#5CCF),HL ;установка адреса пространства - LD BC,#222 ;выделять #222 байтов - JP x1E23 ;выделение области и возврат - -;Адрес #115D. Печать числа из HL с нулями. - -x115D XOR A ;в числе 0 десятков тысяч - LD DE,#2710 -x1161 SBC HL,DE ;вычитание из числа 10000 - JR C,x1168 ;если получилось число меньше 10000, то следующий разряд - INC A ;следующий десяток тысяч - JR x1161 ;повтор -x1168 ADD A,"0" ;печать десятков тысяч - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 тысяч -x116F LD DE,#3E8 -x1172 SBC HL,DE ;вычитание из числа 1000 - JR C,x1179 ;если получилось число меньше 1000, то следующий разряд - INC A ;следующая тысяча - JR x1172 ;повтор -x1179 ADD A,"0" ;печать тысяч - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 сотен - LD DE,#64 -x1183 SBC HL,DE ;вычитание из числа 100 - JR C,x118A ;если получилось число меньше 100, то следующий разряд - INC A ;следующая сотня - JR x1183 ;повтор -x118A ADD A,"0" ;печать сотен - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - XOR A ;в числе 0 десятков - LD DE,#A -x1194 SBC HL,DE ;вычитание из числа 10 - JR C,x119B ;если получилось число меньше 10, то следующий разряд - INC A ;следующий десяток - JR x1194 ;повтор -x119B ADD A,"0" ;печать десятков - CALL x11A8 - ADD HL,DE ;восстановление остатка числа - LD A,L ;печать единиц - ADD A,"0" - CALL x11A8 - RET ;возврат - -;Адрес #11A8. То же, что и #3D82. - -x11A8 PUSH HL ;сохранение HL и DE - PUSH DE - CALL x3D82 ;печать символа - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #11B0. Проверка достижения конца буфера при работе с каталогом. Установите #5CF9 и #5CCC, а в HL поместите текущий адрес буфера. Если конец буфера достигнут, то в буфер загрузится следующий сектор каталога, а в HL будет #5D25. - -x11B0 PUSH HL ;сохранение HL и BC - PUSH BC - LD A,(#5CF9) ;берем номер дисковода из #5CF9 - LD HL,#5CF6 ;берем номер текущего дисковода - CP (HL) ;назначен другой дисковод? - CALL NZ,x3DCB ;если да, то выбор назначенного дисковода - POP BC ;восстановление HL и BC - POP HL - CALL x050C ;проверка достижения конца буфера - LD A,(HL) ;берем первый символ имени файла - OR A ;конец каталога? - JP Z,x01D3 ;если да, то завершение - CP 1 ;файл стерт? - CALL Z,x0507 ;если да, то пропуск файла - RET NZ ;иначе возврат - JR x11B0 ;если файл был пропущен, то повтор - -;Адрес #11CE. Выполнение команды LIST. Установите #5D11 и #5C3B. - -x11CE CALL x042B ;проверка второго символа строки - LD BC,2 ;по умолчанию печатать в поток 2 - LD (#5CDB),BC - JR Z,x1205 ;если второй символ строки ENTER, то вывод каталога - CP "#" ;если второй символ строки "#"? - JR NZ,x11F8 ;если нет, то установка дисковода - LD (#5C5D),HL ;установка CH_ADD - CALL x1E0B ;прием номера потока - CALL x1D8C ;берем текущий символ - CP #D ;это ENTER? - JR Z,x1205 ;если да, то вывод каталога - CP "," ;это ","? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1E2A ;следующий символ - CALL x1DBD ;прием имени дисковода на стек калькулятора - JR x11FB ;установка дисковода -x11F8 CALL x1DDF ;установка CH_ADD и прием имени дисковода на стек калькулятора -x11FB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x1DB5 ;снятие имени дисковода со стека калькулятора - EX DE,HL ;переброска его адреса в HL - CALL x1C81 ;установка дисковода -x1205 CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CF6) ;загрузка имени дисковода в #5CF9 - LD (#5CF9),A - CALL x0405 ;настройка на диск - LD A,(#5CDB) ;берем номер потока - CP 2 ;это 2? - PUSH AF ;сохраняем его - CALL Z,x1D97 ;если да, то очистка экрана - POP AF ;восстановление номера потока - CP #11 ;он больше #10? - JP NC,x1D1A ;если да, то ошибка - CALL x1D84 ;открытие потока - LD A,#FF ;буфер не убирать, память не изменять - LD (#5CF8),A - CALL x1151 ;выделение памяти в рабочей области - LD HL,#5E06 ;начало описателя диска в буфере - LD DE,(#5CCF) ;берем адрес WORKSP - LD BC,#20 ;длина описателя диска - LDIR ;сохранение описателя диска - CALL x03E8 ;загрузка в буфер сектора 0 дорожки 0 - LD HL,#5D25 ;адрес буфера - PUSH HL ;сохранение его -x123E LD HL,x10B3 ;адрес сообщения TITLE: - PUSH BC ;сохранение BC - RST #18 ;печать TITLE: - LD HL,(#5CCF) ;берем адрес WORKSP - LD BC,#14 ;#14-й байт - ADD HL,BC - RST #18 ;печать имени диска - LD HL,x10BA ;печать DISC DRIVE: - RST #18 - LD A,(#5CF6) ;берем номер дисковода - ADD A,"A" ;вычисление имени дисковода - CALL x3D82 ;печать его - CALL x3D80 ;перевод строки - LD HL,(#5CCF) ;3-й байт описателя диска - LD BC,3 - ADD HL,BC - LD A,(HL) ;берем количество файлов на диске - LD HL,(#5CCF) ;#13-й байт - LD BC,#13 - ADD HL,BC - SUB (HL) ;вычисление количества нестертых файлов - PUSH HL ;сохранение адреса #13-го байта описателя диска - CALL x1DA3 ;печать количества нестертых файлов - LD HL,x10AA ;печать FILE(S) - RST #18 - LD HL,(#5CCF) ;2-й байт описателя диска - LD BC,2 - ADD HL,BC - LD A,(HL) ;берем тип диска - LD HL,x10CE ;адрес сообщения 40 TRACKS, S.SIDE - CP #19 ;это #19? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x10E2 ;адрес сообщения 80 TRACKS, S.SIDE - CP #18 ;это #18? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x10F6 ;адрес сообщения 40 TRACKS, D.SIDE - CP #17 ;это #17? - JR Z,x1292 ;если да, то печать сообщения - LD HL,x110A ;адpес сообщения 80 TRACKS, D.SIDE -x1292 RST #18 ;печать сообщения - POP HL ;восстановление адреса #13-го байта описателя диска - LD C,(HL) ;берем количество стертых файлов - CALL x1DA4 ;печать его - LD HL,x10A5 ;печать DEL.FILES - RST #18 - LD HL,x111E ;печать FREE SECTORS: - RST #18 - LD HL,(#5CCF) ;4-й байт - LD BC,4 - ADD HL,BC - LD C,(HL) ;берем количество свободных секторов - INC HL - LD B,(HL) - CALL x1DA9 ;печать его - LD HL,x112E ;печать FILE NAME, START, LENGTH, LINE - RST #18 - POP BC ;восстановление BC и текущего адреса в буфеpе - POP HL - LD B,#10 ;печатать информацию о #10 файлах -x12B5 CALL x11B0 ;проверка достижения конца буфера - CALL x3D80 ;перевод строки - PUSH BC ;сохранение количества оставшихся файлов - PUSH HL ;и текущего адреса в буфеpе - CALL x2938 ;печать имени и расширения файла - LD BC,#D ;#D-й байт описателя файла - POP HL ;восстановление текущего адреса в буфере - PUSH HL - ADD HL,BC - LD C,(HL) ;берем размер файла в секторах - PUSH BC ;сохраняем его - LD A,C ;загружаем его в C - LD B,2 ;печатать 2 пробела перед числом - CP #A ;длина файла меньше 10 секторов? - JR C,x12D0 ;если да, то печать пробелов - DEC B ;печатать один пробел -x12D0 CP #64 ;длина файла меньше 100 сектоpов? - JR NC,x12D9 ;если нет, то пробелы не печатать -x12D4 LD A," " ;печать пробелов - RST #10 - DJNZ x12D4 -x12D9 POP BC ;восстановление длины файла в секторах - CALL x1DA9 ;печать ее - LD HL,x10CA ;#10 пробелов - RST #18 - POP HL ;восстановление адреса описателя файла в буфере - PUSH HL ;и снова сохранение его - LD BC,9 ;9-й байт описателя - ADD HL,BC - LD E,(HL) ;берем адрес загрузки файла - INC HL - LD D,(HL) - PUSH HL ;сохранение текущего адреса в описателе файла - EX DE,HL ;переброска адреса загрузки файла в HL - CALL x115D ;печать его - LD A," " ;пробел - CALL x3D82 - POP HL ;восстановление текущего адреса в описателе файла - INC HL ;следующий адрес - LD E,(HL) ;берем длину файла - INC HL - LD D,(HL) - EX DE,HL ;перенос ее в HL - CALL x115D ;печать ее - POP HL ;восстановление адреса описателя файла - PUSH HL ;и снова сохранение его - LD BC,8 ;8-й байт - ADD HL,BC - LD A,(HL) ;берем расширение файла - CP "B" ;это "B"? - CALL Z,x131B ;если да, то печать строки автозапуска - POP HL ;восстановление адреса описателя файла - POP BC ;и счетчика файлов - LD DE,#10 ;адрес следующего описателя файла - ADD HL,DE - DJNZ x12B5 ;повтор до конца - PUSH HL ;сохранение адреса описателя файла - CALL x3D80 ;2 раза перевод строки - CALL x3D80 - JP x123E ;повтор с самого начала - -;Адрес #131B. Печать строки автостарта прогpаммы на бейсике. В HL поместите адрес описателя файла плюс 8 и установите #5CCF. - -x131B LD BC,5 ;берем адрес длины файла в секторах - ADD HL,BC - LD B,(HL) ;берем эту длину - INC HL ;следующий адрес в описателе - LD E,(HL) ;берем адрес файла на диске - INC HL - LD D,(HL) - DEC B ;загружать будем 2 сектоpа - JR Z,x1335 - DEC B - JR Z,x1335 ;если длина файла не больше 2-х секторов, то загрузка секторов - LD A,#10 ;на дорожке #10 секторов -x132C INC E ;следующий сектор - CP E ;конец дорожки? - JR NZ,x1333 ;если да, то - LD E,0 ;следующий сектор 0 - INC D ;и берем следующую дорожку -x1333 DJNZ x132C ;повтор до конца -x1335 LD HL,(#5CCF) ;берем адрес рабочей области - LD BC,#21 ;#21 байт уже занято - ADD HL,BC - LD B,2 ;загружать 2 сектора - PUSH HL ;сохранение адреса загрузки секторов - CALL x1E3D ;загрузка секторов - LD A,#80 ;будем искать конец программы - POP HL ;восстановление адреса секторов в памяти - LD BC,#200 ;длина области - #200 байтов - CPIR ;поиск конца программы - LD A,(HL) ;берем следующий байт - CP #AA ;это #AA? - RET NZ ;если нет, то возврат - INC HL ;берем номер строки автостарта - LD C,(HL) - INC HL - LD B,(HL) - LD A,B ;это 0? - OR C - RET Z ;если да, то возврат - PUSH BC ;сохранение номера строки автостарта - LD A," " ;печать пробела - CALL x3D82 - POP BC ;восстановление номера строки автостарта - CALL x1DA9 ;печать его - RET ;возврат - -;Адрес #1360. Выполнение команды COPY S. Установите #5D11 и #5C3B. - -x1360 CALL x1DC5 ;установка CH_ADD - CALL x1E2A ;следующий символ - CALL x1DBD ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x1375 CALL x1052 ;ввод символа с клавиатуры - CP "Y" ;это "Y"? - JR NZ,x1375 ;если нет, то повтор - CALL x1D9F ;очистка низа экрана - CALL x102E ;прием расширения файла - CALL x1CB0 ;установка имени файла - JP NZ,x03D9 ;если такого файла нет, то ошибка - CALL x13B7 ;копирование файла - LD A,(#5CE5) ;расширение файла #? - CP "#" - JP NZ,x03E1 ;если нет, то O.K. -x1393 LD A,#A ;файл искать по #A символам - LD (#5D06),A - LD HL,#5CE6 ;следующий блок - INC (HL) - CALL x1D97 ;очистка экрана - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x13A5 CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - JR NZ,x13A5 ;если да, то повтор - CALL x1CB3 ;поиск блока - JP NZ,x03E1 ;если не нашли, то O.K. - CALL x13B7 ;копирование блока - JR x1393 ;повтор - -;Адрес #13B7. Копирование файла при одном дисководе. Номер файла поместите в регистр C. - -x13B7 CALL x165D ;чтение описателя файла - LD HL,#5CE6 ;сохранение его части - LD DE,#5CED - LD BC,7 - LDIR - LD A,(#5CF1) ;установка объема файла в секторах - LD (#5D10),A - CALL x0405 ;настройка на диск - CALL x3E11 ;сохранение режима дисковода - LD (#5CD9),A - LD A,#FF ;первый проход - LD (#5D21),A - -;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. - - CALL x1451 ;копирование файла - LD HL,(#5D1F) ;берем адрес файла на диске - приемнике - LD (#5CEB),HL ;устанавливаем его - LD HL,(#5CF4) ;берем новый адрес свободного места на диске - LD (#5E06),HL ;устанавливаем его - LD HL,#5E09 ;записали 1 файл - INC (HL) - LD C,(HL) ;берем номер файла - DEC C - LD B,0 ;переводим его в двухбайтную форму - PUSH BC ;сохраняем его - LD DE,9 ;записывать сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - POP BC ;восстановление номера файла - CALL x166B ;чтение и замена описателя файла - CALL x1E43 ;запись сектора с описателем - RET ;возврат - -;Адрес #1403. Проверка наличия свободного места на диске-приемнике для команды COPY S. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5D10. В дисководе должен быть диск-приемник. Подпрограмма устанавливает #5CEA, #5CEB и #5D1F. - -x1403 XOR A ;не первый проход - LD (#5D21),A - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CDA),A ;сохраняем его - CALL x1CB3 ;поиск файла - JP Z,x1C50 ;если нашли, то FILE EXISTS - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;берем количество файлов на диске - CP #80 ;их 128? - JP Z,x2723 ;если да, то DIRECTORY FULL - LD HL,#5CED ;восстановление описателя файла - LD DE,#5CE6 - LD BC,7 - LDIR - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5D10) ;восстановление длины файла в секторах - LD (#5CEA),A - LD DE,(#5CEA) ;перевод ее в двухбайтную форму - LD D,0 - OR A ;сброс флага C - LD HL,(#5E0A) ;уменьшаем свободное место на диске - SBC HL,DE - JP C,x1C45 ;если его не хватило, то NO SPACE - LD (#5E0A),HL ;установка нового количества свободного места на диске - LD HL,(#5E06) ;берем адрес свободного места на диске - LD (#5CEB),HL ;установка адреса файла на диске-приемнике - LD (#5D1F),HL ;сохранение его - -;Боже мой!!! Ну что это такое! Ведь эта переменная - флаг способа вызова TR-DOS. И на этом DOS все работают. Ужас какой-то. - - RET ;возвpат - -;Адрес #1451. Копирование файла на одном дисководе. Поместите описатель файла в #5CDD и его часть в #5CED и установите #5CF1, -; #5D21, #5D23 и #5CCF. Подпрограмма устанавливает #5CBB, #5CD9, #5CDA и #5C92. - -x1451 LD A,(#5CF1) ;все скопировали? - OR A - RET Z ;если да, то возврат - LD A,(#5D21) ;первый проход? - OR A - JR NZ,x146F ;если да, то диск - источник уже в дисководе - CALL x1D97 ;очистка экрана - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x1465 CALL x1052 ;ожидание клавиши "Y" - CP "Y" - JR NZ,x1465 - CALL x1D9F ;очистка низа экрана -x146F LD A,(#5CF1) ;все скопировали? - OR A - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;копируется часть файла - SUB (HL) - POP HL ;восстановление HL - JR NC,x14CB ;если еще не конец, то копируется часть файла - LD A,(#5CF1) ;копируем остаток - LD B,A - XOR A ;скопировали все - LD (#5CF1),A -x1484 PUSH BC ;сохранение количества копируемых секторов - LD (#5CCE),A ;обнуление #5CCE - LD HL,(#5CCF) ;берем адрес рабочего пространства - PUSH HL ;сохраняем его - LD DE,(#5CF2) ;берем адрес копируемого участка диска - CALL x14D8 ;настройка дисковода под диск-источник - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса на диске следующего сектора - LD (#5CF2),HL - CALL x1D97 ;очистка экрана - LD HL,x2785 ;печать INSERT DESTINATION DISC - CALL x2707 -x14A5 CALL x1052 ;ожидание клавиши "Y" - CP "Y" - JR NZ,x14A5 - CALL x1D9F ;очистка низа экрана - LD A,(#5D21) ;первый проход? - OR A - CALL NZ,x1403 ;если да, то проверка наличия места на диске - POP HL ;восстановление адреса рабочего пространства - POP BC ;и количества копируемых секторов - LD DE,(#5CEB) ;берем адрес текущего участка диска - CALL x14E4 ;настройка дисковода под диск-приемник - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса на диске следующего сектора - LD (#5CEB),HL - JP x1451 ;повтор -x14CB LD (#5CF1),A ;установка длины оставшейся части файла - PUSH HL ;сохранение HL - LD HL,#5D23 ;берем длину рабочей области - LD B,(HL) - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JP x1484 ;копирование - -;Адрес #14D8. Помещение значения #5CD9 в переменную режима дисковода. Установите #5CD9. - -x14D8 PUSH HL ;сохранение DE и HL - PUSH DE - CALL x3E11 ;берем адрес переменной с типом дисковода - LD A,(#5CD9) ;берем тип дисковода из #5CD9 - LD (HL),A ;установка типа дисковода - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #14E4. Помещение значения #5CDA в переменную режима дисковода. Установите #5CDA. - -x14E4 PUSH HL ;сохранение DE и HL - PUSH DE - CALL x3E11 ;берем адрес переменной с типом дисковода - LD A,(#5CDA) ;берем тип дисковода из #5CD9 - LD (HL),A ;установка типа дисковода - POP DE ;восстановление DE и HL - POP HL - RET ;возврат - -;Адрес #14F0. Проверка наличия места на диске-приемнике для команды COPY B. Установите #5CDF и поместите в дисковод диск-приемник. Устанавливает #5CDA, #5CE7, #5CDD и обнуляет #5D21. - -x14F0 XOR A ;обнуление #5D21 - LD (#5D21),A - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CDA),A ;сохраняем его - LD A,(#5E08) ;сохраняем тип диска - LD (#5CE7),A - LD HL,#280 ;вычисление количества секторов на - CP #19 ;диске-приемнике - JR Z,x151F - LD HL,#500 - CP #18 - JR Z,x151F - CP #17 - JR Z,x151F - LD HL,#A00 - CP #16 - JR Z,x151F - JP x1D1A ;если в качестве типа диска стоит неопределенное значение, то *ERROR* - -;Лучше DISC ERROR. - -x151F LD (#5CDD),HL ;сохранение количества секторов на диске-приемнике - LD BC,(#5CDF) ;берем количество копируемых секторов - SBC HL,BC ;места хватит? - JP C,x1C45 ;если нет, то NO SPACE - RET ;возврат - -;Адрес #152C. Выполнение команды COPY B. Установите #5C3B. - -x152C CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x153E CALL x1052 ;ввод клавиши - CP "Y" ;это "Y"? - JR NZ,x153E ;если да, то повтор - CALL x1D9F ;очистка низа экрана - LD A,#FF ;первый проход - LD (#5D21),A - -;Внимание!!! Эта переменная уже занята. В ней хранятся первые 3 символа командной строки. - - CALL x0405 ;настройка на диск - CALL x3E11 ;берем режим дисковода - LD (#5CD9),A ;сохраняем его - LD A,(#5E08) ;берем тип диска - CP #19 ;диск 40-дорожечный односторонний? - LD HL,#280 ;всего на диске #280 секторов - JR Z,x1575 ;если да, то копирование - LD HL,#500 ;всего на диске #500 секторов - CP #18 ;диск 80-дорожечный односторонний? - JR Z,x1575 ;если да, то копирование - CP #17 ;диск 40-дорожечный двухсторонний? - JR Z,x1575 ;если да, то копирование - LD HL,#A00 ;всего на диске #A00 секторов - CP #16 ;диск 80-дорожечный двухсторонний? - JR Z,x1575 ;если да, то копирование - JP x1D1A ;иначе *ERROR* - -;Внимание!!! Лучше выдавать сообщение DISC ERROR. - -x1575 LD BC,(#5E0A) ;берем количество свободных секторов - SBC HL,BC ;вычисляем количество занятых секторов - LD (#5CE5),HL ;установка количества секторов - LD (#5CDF),HL - LD HL,0 ;скопировано 0 секторов - LD (#5CE1),HL - LD (#5CE3),HL - CALL x15B8 ;копирование секторов - CALL x0405 ;настройка на диск - LD A,(#5CE7) ;установка нового типа диска-приемника - LD (#5E08),A - LD HL,(#5CDD) ;берем общее число секторов на диске-приемнике - LD BC,(#5CDF) ;берем число скопированных секторов - SBC HL,BC ;вычисление числа свободных секторов на диске - приемнике - LD (#5E0A),HL ;установка его - CALL x14E4 ;настройка дисковода под диск-приемник - LD DE,9 ;записывали сектор 8 дорожки 0 - LD (#5CF4),DE - CALL x1E43 ;запись сектора - JP x03E1 ;O.K. - -;Адрес #15B2. Проверка переменной #5CE5. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в HL. - -x15B2 LD HL,(#5CE5) ;берем содержимое переменной #5CE5 - LD A,H ;проверка его на 0 - OR L - RET ;возврат - -;Адрес #15B8. Копирование секторов. Установите #5CD9, #5CCF, #5CE5, #5D21, #5D23 и #5CDB - -x15B8 CALL x15B2 ;все скопировали? - RET Z ;если да, то возврат - LD A,(#5D21) ;первый проход? - OR A - JR NZ,x15DB ;если да, то диск-источник уже в дисководе - CALL x1D97 - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x27AA ;печать INSERT SOURCE DISC - CALL x2707 -x15D1 CALL x1052 ;ожидание нажатия "Y" - CP "Y" - JR NZ,x15D1 - CALL x1D9F ;очистка низа экрана - -x15DB CALL x15B2 ;все скопировали? - RET Z ;если да, то возврат - PUSH BC ;сохранение BC и количества секторов - PUSH HL - LD HL,#5D23 ;берем длину рабочей области в секторах - LD C,(HL) - LD B,0 - POP HL ;восстановление количества секторов - SBC HL,BC ;уменьшение количества секторов - POP BC ;восстановление BC - JP NC,x1644 ;если рабочего пространства мало, то это еще не конец - LD BC,(#5CE5) ;берем оставшееся количество секторов - LD HL,0 ;все скопировали - LD (#5CE5),HL -x15F8 PUSH BC ;сохранение количества секторов - LD HL,(#5CCF) ;берем адрес рабочей области - PUSH HL ;сохраняем его - CALL x14D8 ;настройка дисковода под диск-источник - LD DE,(#5CE1) ;берем адрес группы секторов на диске-источнике - LD B,C - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CE1),HL ;на диске-источнике - CALL x1D97 ;очистка экрана - LD HL,x2779 ;печать BACKUP DISC - CALL x2707 - LD HL,x2785 ;печать INSERT DESTINATION DISC - CALL x2707 -x161D CALL x1052 ;ожидание нажатия "Y" - CP "Y" - JR NZ,x161D - CALL x1D9F ;очистка низа экрана - LD A,(#5D21) ;первый проход? - OR A - CALL NZ,x14F0 ;если да, то проверка наличия места на диске - POP HL ;восстановление адреса рабочей области - POP BC ;и количества копируемых секторов - LD DE,(#5CE3) ;берем адрес группы секторов на диске-приемнике - LD B,C - CALL x14E4 ;настройка дисковода под диск-приемник - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей группы секторов - LD (#5CE3),HL ;на диске-приемнике - JP x15B8 ;повтор -x1644 LD (#5CE5),HL ;установка оставшегося количества секторов - PUSH HL ;сохранение его - LD HL,#5D23 ;берем длину рабочей области - LD C,(HL) ;столько секторов будем копировать - LD B,0 - POP HL ;восстановление оставшегося количества секторов - XOR A ;обнуление аккумулятора - JP x15F8 ;копирование - -;Адрес #1653. Проверка состояния файла. Номер файла задайте в регистре A. Возвращает Z, если файл стерт и NZ, если нет, а в A будет первый символ имени файла. - -x1653 CALL x165D ;чтение описателя файла - LD A,(#5CDD) ;берем первый символ имени файла - CP 1 ;проверка состояния файла - RET ;возврат - -;Адрес #165C. Чтение описателя файла. На входе в регистр A поместите номер файла. Описатель будет загружен по адресу #5CE5. Используется также с адресов: -;#165D - то же, что и #165C, но номер файла в регистре C. -;#165E - то же, что и #17E9, но сохраняет номер файла. - -x165C LD C,A ;перенос номера файла в рег. C -x165D XOR A ;переносим описатель из буфера в память -x165E PUSH BC ;сохранение номера файла - CALL x17E9 ;чтение сектора с описателем и перенос описателя - POP BC ;восстановление номера файла - RET ;возврат - -;Адрес #1664. запись информации о файле. Вход: описатель расположить по адресу #5CDD, а в аккумулятор поместить номер файла. - -x1664 LD C,A ;перенос в C номера файла - CALL x166B ;чтение сектора и замена описателя файла в нем - JP x1E43 ;перезапись сектора - -;Адрес #166B. Чтение в буфер сектора с описателем файла и замена описателя. Поместите описатель по адресу #5CDD. - -x166B LD A,#FF ;описатель перемещать из переменных в буфер - JR x165E ;то же, что и #17E9, но с сохранением BC - -;Адрес #166F. Резервирование места в памяти. Устанавливает #5CCF и #5D23. - -x166F LD A,#FF ;WORKSP использовалась - LD (#5D0E),A - CALL x1680 ;вычисление размера доступной памяти - LD HL,(#5C61) ;установка адреса рабочей области - LD (#5CCF),HL - JP x1E23 ;выделение места в памяти и возврат - -;Адрес #1680. Вычисление количества свободной памяти в секторах. Размер свободной памяти в байтах будет в BC, а в секторах ? в #5D23. - -x1680 RST #20 ;берем количество свободной памяти в байтах - DW #1F1A - LD HL,#FFFF - SBC HL,BC - LD A,H ;свободно меньше 16 секторов? - CP #10 - JR NC,x168F ;если да, то - LD A,#11 ;будем выделять 16 секторов -x168F DEC A ;1 сектор на всякий случай - LD (#5D23),A ;установка размера свободной памяти в секторах - LD B,A ;установка размера свободной памяти в байтах - LD C,0 - RET ;возврат - -;Адрес #1697. Помещает HL в #5CD7 и #5CDB и прибавляет #5CEA (1 байт) к #5CD9 (2 байта). - -x1697 LD (#5CD7),HL ;установка #5CD7 и #5CD9 - LD (#5CDB),HL - LD DE,(#5CEA) ;сложение #5CEA и #5CD9 - LD HL,(#5CD9) - LD D,0 - ADD HL,DE - LD (#5CD9),HL - RET ;возврат - -;Адрес #16AB. Выполнение команды MOVE. Установите #5C3B. - -x16AB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x166F ;резервирование места в памяти - CALL x0405 ;настройка на диск - LD A,(#5E19) ;стертые файлы на диске есть? - OR A - JP Z,x03E1 ;если нет, то сообщение O.K. - LD HL,0 ;пока освободилось 0 секторов - LD (#5CD9),HL - LD C,#FF ;начнем с файла номер 0 -x16C3 INC C ;следующий файл - CALL x1653 ;он стерт? - JR NZ,x16C3 ;если нет, то следующий файл - LD A,C ;сохранение номера стираемого файла - LD (#5CD4),A - LD HL,(#5CEB) ;берем адрес стираемого файла на диске - LD (#5CD5),HL ;сохраняем его - CALL x1697 ;приращение счетчика освободившихся секторов -x16D6 INC C ;следующий файл - CALL x1653 ;он стерт? - JR Z,x16D6 ;если да, то следующий файл - CP 0 ;это конец каталога? - JP NZ,x1710 ;если нет, то меняем файлы местами - LD A,(#5CD4) ;берем номер стираемого файла - LD C,A -x16E5 INC C ;следующий файл - CALL x1653 ;это конец каталога? - CP 0 - JR Z,x176C ;если да, то реорганизация описателя диска - XOR A ;конец каталога - LD (#5CDD),A - CALL x1E40 ;запись описателя файла - CALL x1697 ;приращение счетчика освободившихся секторов - JR x16E5 ;повтор - -x16F9 call x1701 - ret nz - jr x170D - -x16FF db #FF,#FF - -x1701 in a,(#1F) - and #02 - cp b - ret nz - inc de - ld a,e - or d - jr nz,x1701 - ret - -x170D jp x3EE7 - - -x1710 LD A,(#5CEA) ;берем размер перемещаемого файла в секторах - LD (#5CD3),A ;сохраняем его - LD (#5CD1),A - LD HL,(#5CEB) ;берем адрес перемещаемого файла на диске - LD (#5CD5),HL ;сохраняем его - PUSH BC ;сохранение номера перемещаемого файла - CALL x17A5 ;перемещение файла - POP BC ;восстановление номера перемещаемого файла - LD HL,(#5CF4) ;перемещение продолжится с этого места - LD (#5CD5),HL - LD (#5CEB),HL - XOR A ;размер стертого файла - 0 секторов - LD (#5CEA),A - LD A,(#5CDD) ;сохранение первого символа имени файла - PUSH AF - LD A,1 ;файл стерт - LD (#5CDD),A - CALL x1E40 ;запись описателя стертого файла - POP AF ;восстановление первого символа имени файла - LD (#5CDD),A - LD A,(#5CD4) ;берем номер стертого файла - LD C,A - LD HL,(#5CDB) ;установка нового адреса перемещенного файла - LD (#5CEB),HL ;на диске - LD A,(#5CD1) ;восстановление размера перемещенного файла - LD (#5CEA),A ;на диске - CALL x1E40 ;запись описателя перемещенного файла - LD A,(#5CD4) ;берем номер файла после перемещенного - INC A - LD C,A - CALL x165D ;чтение его описателя - LD HL,(#5CD5) ;установка его нового адреса на диске - LD (#5CEB),HL - CALL x1E40 ;запись его описателя - LD A,(#5CD4) ;берем номер перемещенного файла - LD C,A - JP x16C3 ;повтор - -;Адpес #176C. Реорганизация описателя диска. Установите #5CCF, #5CD9 и #5CD5. - -x176C LD HL,(#5CCF) ;берем адрес рабочего пространства - LD BC,#1000 ;сокращаем его на #1000 байтов - CALL x1E2E - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD HL,(#5E0A) ;увеличение количества свободного места на - LD DE,(#5CD9) ;диске - ADD HL,DE - LD (#5E0A),HL - LD A,(#5E09) ;уменьшение количества файлов на диске на - LD HL,#5E19 ;число стертых - SUB (HL) - LD (#5E09),A - LD (HL),0 ;на диске больше нет стертых файлов - LD HL,(#5CD5) ;установка нового адреса свободного места на - LD (#5E06),HL ;диске - PUSH AF ;сохранение количества файлов на диске - CALL x1E43 ;запись сектора 8 дорожки 0 - POP AF ;восстановление количества файлов на диске - LD C,A - CALL x165D ;чтение описателя файла за последним - XOR A ;это конец каталога - LD (#5CDD),A - JP x0569 ;запись описателя файла и завершение - -;Адрес #17A5. Перемещение файла. Установите #5CD3, #5D23, #5CCF, #5CD5 и #5CD7. - -x17A5 LD A,(#5CD3) ;перемещен весь файл? - OR A - RET Z ;если да, то возврат - PUSH HL ;сохранение HL - LD HL,#5D23 ;буфера хватит на остаток? - SUB (HL) - POP HL ;восстановление HL - JR NC,x17DD ;если буфера не хватит, то перемещаем часть файла - LD A,(#5CD3) ;берем количество оставшихся секторов - LD B,A - XOR A ;переместили все - LD (#5CD3),A -x17BA PUSH BC ;сохранение количества перемещаемых секторов - LD HL,(#5CCF) ;берем адрес рабочей области - PUSH HL ;сохранение его - LD DE,(#5CD5) ;берем адрес части перемещаемого файла на старом месте - CALL x1E3D ;загрузка секторов - LD HL,(#5CF4) ;установка адреса следующей части файла - LD (#5CD5),HL - POP HL ;восстановление адреса рабочей области - POP BC ;и количества перемещаемых секторов - LD DE,(#5CD7) ;берем адрес части перемещаемого файла на новом месте - CALL x1E4D ;запись секторов - LD HL,(#5CF4) ;установка адреса следующей части файла - LD (#5CD7),HL - JR x17A5 ;повтор -x17DD LD (#5CD3),A ;установка количества оставшихся секторов - PUSH HL ;сохранение HL - LD HL,#5D23 ;берем длину рабочей области в секторах - LD B,(HL) - POP HL ;восстановление HL - XOR A ;обнуление аккумулятора - JR x17BA ;перемещение секторов - -;Адрес #17E9. Загрузка в буфер сектора с описателем файла и перенос описателя. В регистре C - номер файла, в A - направление перемещения (0 - в переменные, иначе - в прочитанный сектор). - -x17E9 PUSH AF ;сохранение направления перемещения - LD HL,#5CCC ;первый сектор каталога - 0 - LD (HL),0 - LD A,C ;определение номера сектора с описателем файла -x17F0 SUB #10 - JR C,x17F7 - INC (HL) - JR x17F0 -x17F7 ADD A,#10 ;берем номер описателя в секторе - LD C,A - PUSH BC ;сохраним его - CALL x03EC ;загрузка в буфер сектора с описателем - POP BC ;восстановление номера описателя в секторе - POP AF ;и направление перемещения - CALL x1CA4 ;определение адреса описателя файла в буфере - LD DE,#5CDD ;берем второй адрес для LDIR - LD BC,#10 ;берем длину описателя - OR A ;установка направления перемещения - JR Z,x180D - EX DE,HL -x180D LDIR ;перенос описателя файла - RET ;возврат - -;Адрес #1810. Выполнение команды VERIFY. Установите #5D11 и #5C3B. Используется также с адресов: -;#1815 - выполнение команды LOAD. Установите #5D11 и #5C3B; -;#1818 - выполнение команды LOAD, PEEK или POKE; Установите #5D11, #5C3B и #5D10. - -x1810 LD A,#FF ;верификация файла - LD (#5CF9),A -x1815 CALL x1852 ;обнуление #5D10 -x1818 CALL x1836 ;обработка параметров и загрузка файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,#FF ;выполняется команда LOAD - LD (#5D10),A - LD A,(#5CF9) ;выполняется VERIFY? - CP #FF - JP Z,x03E1 ;если да, то O.K. - LD A,(#5CE5) ;расширение файла B? - CP "B" - -;Внимание!!! Если была операция с одним сектором файла, то надо выходить независимо от расширения. - - JP Z,x012A ;если да, то обработка строки автостарта - JP x03E1 ;иначе O.K. - -;Адрес #1836. Обработка параметров для команды LOAD и загрузка файла. Установите #5D11, #5C3B, #5CF9 и #5D10. - -x1836 CALL x187A ;принятие параметров - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x18AB ;проверка параметров - JP x1921 ;загрузка файла и возврат - -;Адрес #1842. Обработка параметров для команды LOAD...CODE. Установите #5C5D на расширение файла. На выходе устанавливает #5CD6, #5CD9 и #5CDB. - -x1842 LD HL,(#5C5D) ;следующий символ строки ENTER? - INC HL - LD A,(HL) - CP #D - RET Z ;если да, то возврат - LD A,1 ;задан адрес загрузки - LD (#5CD6),A - CALL x1DEB ;прием одного или двух чисел -x1852 XOR A ;обнуление #5D10 - LD (#5D10),A - RET ;возврат - -x1857 CALL x102E ;прием расширения файла - LD A,"B" ;это "B"? - CP B - JR NZ,x1866 ;если да, то декремент CH_ADD, так как для - LD HL,(#5C5D) ;программы на бейсике расширение не - DEC HL ;указывается - LD (#5C5D),HL -x1866 CALL x1DEB ;прием чисел - LD HL,(#5CD9) ;установка адреса загрузки/записи сектора - LD (#5CD7),HL - LD HL,(#5CDB) ;установка номера сектора - LD (#5CD9),HL - XOR A ;обнуление #5CD6 - LD (#5CD6),A - RET ;возврат - -;Адрес #187A. Принятие параметров для команды LOAD. Вход: установите #5D11 и #5C3B. Выход: устанавливает #5CD2, #5CD7, #5CD9, #5CE5 и #5CD6 и читает описатель файла. - -x187A CALL x042B ;второй символ командной строки ENTER? - JP Z,x027B ;если да, то вход в командный процессор с вводом команды RUN "boot" - -;Ошибка!!! это некорректно, так как при ошибке вы попадете в командный процессор TR-DOS, а не вернетесь в бейсик. - - CALL x1DDF ;помещение имени файла на стек калькулятора - CALL x0572 ;операция со всем файлом? - CALL NZ,x1857 ;если нет, то прием расширения и двух чисел - CALL x1D8C ;берем текущий символ строки - CP #AF ;это CODE? - CALL Z,x1842 ;если да, то прием чисел, если они есть - CP #E4 ;это DATA? - PUSH AF ;сохранение результата проверки - CALL x0572 ;операция со всем файлом? - CALL Z,x102E ;если да, то прием расширения - POP AF ;восстановление результата проверки - CALL Z,x1BFC ;если символ DATA, то прием имени массива - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x292F ;установка имени файла и поиск файла - -;Адрес #18A4. Чтение описателя файла, если он был найден. Установите #5CDD, #5CE5 и флаг Z: при Z=1 происходит чтение описателя, иначе ошибка NO FILE. - -x18A4 JP NZ,x03D9 ;если файл не найден, то NO FILE - CALL x165D ;чтение описателя файла - RET ;возврат - -;Адрес #18AB. Обработка параметров для подпрограммы загрузки файла. На входе установите #5CD6, #5CD9 и #5CDB ; считайте описатель нужного вам файла. На выходе в #5CDB будет длина файла для загрузки, в #5CD6 0, если длина менялась, иначе 3. В HL будет адрес загрузки файла, в DE - его адрес на диске, в B - количество секторов для загрузки. При загрузке массива или программы на бейсике будет произведена подготовка памяти к загрузке. - -x18AB LD A,(#5CD6) ;берем флаг загрузки - OR A ;начало и длину брать из каталога? - LD HL,(#5CE6) ;берем начало файла из описателя - JR Z,x18B7 ;если параметры берем не из каталога, то - LD HL,(#5CD9) ;берем начальный адрес, назначенный нами -x18B7 LD DE,(#5CEB) ;берем адрес файла на диске - CP 3 ;все параметры назначены пользователем? - LD A,(#5CEA) ;берем размер файла в секторах - PUSH DE ;сохранение адреса файла на диске - LD DE,(#5CE8) ;берем длину файла из описателя - JR NZ,x18CB ;если нужно брать ее не оттуда, то берем - LD DE,(#5CDB) ;длину загрузки, назначенную нами -x18CB LD B,A ;сохранение размера файла в секторах - LD (#5CDB),DE ;установка длины файла для загрузки - LD A,(#5CE5) ;расширение файла C? - CP "C" - LD A,B ;восстановление длины файла в секторах - JR NZ,x18FD ;если расширение не C, то длину не менять - LD A,B ;если длина файла в байтах соответствует его - CP D ;размеру в секторах, то длина загрузки не меняется - JR Z,x18F6 - DEC A - CP D - LD A,B - JR Z,x18F6 - LD A,(#5CD6) ;длина назначена пользователем? - CP 3 - LD A,B ;восстановление размера файла в секторах - JR Z,x18F6 ;если мы сами назначили длину загрузки, то она не меняется - XOR A ;грузить только полностью заполненные сектора - LD (#5CD6),A - LD D,B ;вычисление длины файла в байтах из его длины - LD E,0 ;в секторах - LD (#5CDB),DE ;установка новой длины - JR x18F9 -x18F6 CALL x191B ;файл загружать весь -x18F9 LD A,B ;восстановление размера файла в секторах - CALL x1EAC ;вычисление количества секторов для загрузки -x18FD LD B,A ;сохранение его - LD A,(#5CE5) ;расширение файла C? - CP "C" - POP DE ;восстановление адреса файла на диске - RET Z ;если расширение файла C, то возврат - -;Ошибка!!! Если выполняется чтение или запись сектора файла, то здесь должен быть возврат. Из-за этой ошибки нельзя прочитать или записать сектор файла с расширением B или D. - - PUSH DE ;сохранение адреса файла на диске - CP "B" ;расширение B? - PUSH AF ;сохранение расширения файла - CALL Z,x1A01 ;если расширение B, то подготовка к загрузке программы на бейсике - POP AF ;восстановление расширения - CP "D" ;расширение D? - CALL Z,x1A4C ;если да, то подготовка к загрузке массива - CALL x191B ;длина загрузки не менялась - LD A,(#5CDC) ;берем количество секторов для загрузки - LD B,A - POP DE ;восстановление адреса файла на диске - RET ;возврат - -;Адрес #191B. Помещает число 3 по адресу #5CD6. - -x191B LD A,3 - LD (#5CD6),A - RET - -;Адрес #1921. Загрузка/верификация файла, а также загрузка/запись сектора файла. Вход: установите #5CF9, #5D10, #5CD7, #5CDB, в HL - адрес загрузки, в DE - адрес файла на диске, в B - количество секторов для загрузки. - -x1921 CALL x0572 ;выполняется загрузка или верификация? - JR Z,x192D ;если да, то выполнение операций со всем файлом - PUSH AF ;сохранение флага операции - CALL x1A94 ;вычисление адреса сектора на диске - POP AF ;восстановление флага операции - CP #FF ;чтение сектора файла? -x192D PUSH AF - CALL Z,x195C ;если да, то чтение сектора или операция с файлом - POP AF - JR Z,x1937 ;и завершение загрузки или верификации - JP x1E4D ;иначе запись сектора и возврат -x1937 LD A,(#5CD6) ;загружать весь файл? - CP 3 - -;Не нужно этого делать!!! Лучше так: -;LD A,(#5D10) -;OR A -;и PEEK будет работать правильно. Не будет грузится мусор после загруженного сектора. ведь если в #5CD6 находится 0, то младший байт длины всегда равен 0 и #1946 не будет работать. - - CALL Z,x1946 ;если да, то загрузка или верификация конца файла - LD HL,(#5C59) ;отметка конца программы на бейсике - DEC HL - LD (HL),#80 - RET ;возврат - -;Адрес #1946. Загрузка или верификация конца файла. Установите #5CF4, #5CDB и #5CF9. - -x1946 LD A,(#5CF9) ;верификация? - CP #FF - JP NZ,x2FDE ;если нет, то загрузка конца файла - LD A,(#5CDB) ;файл занимает сектора без остатка? - OR A - RET Z ;если да, то возврат - LD C,A ;берем длину остатка - LD B,1 ;1 сектор - LD DE,(#5CF4) ;текущее место диска - JR x196A ;верификация конца файла и возврат - -;Адрес #195C. Загрузка/верификация файла, а также загрузка сектора файла. Установите #5CF9 ,в DE поместите адрес файла на диске, в HL - адрес файла в памяти, в B - длину файла в секторах. Используется также с адреса #196A для верификации заданного количества байтов (все для #195C, кроме #5CF9 плюс в B ? количество байтов). - -x195C LD A,(#5CF9) ;верификация? - CP #FF - JP NZ,x1E3D ;если нет, то загрузка секторов и возврат - LD (#5CF4),DE ;запомним адрес файла на диске - LD C,0 ;в секторе #100 байтов -x196A LD A,B ;верифицируем 0 секторов? - OR A - RET Z ;если да, то возврат - LD (#5CD7),HL ;сохранение адреса файла в памяти - LD (#5CD9),DE ;сохранение адреса файла на диске -x1974 PUSH BC ;сохранение количества секторов - LD B,1 ;загружать 1 сектор - LD DE,(#5CD9) ;с текущего места диска - LD HL,#5D25 ;в буфер - CALL x1E3D ;загрузка сектора - LD HL,(#5CF4) ;адрес следующего сектора на диске - LD (#5CD9),HL - POP BC ;восстановление количества секторов - LD HL,(#5CD7) ;берем адрес файла в памяти - LD DE,#5D25 ;адрес сектора в буфере -x198E LD A,(DE) ;сравнение их - CP (HL) - JR NZ,x199D ;если несовпадение, то VERIFY ERROR - INC HL ;следующие байты - INC DE - DEC C - JR NZ,x198E ;повтор до конца - LD (#5CD7),HL ;установка следующего адреса - DJNZ x1974 ;повтор до конца - RET ;возврат -x199D LD HL,x276B ;адрес сообщения VERIFY ERROR - LD A,#D ;код ошибки - #D - JP x1C4A ;обработка ошибок - -;Адрес #19A5. Выполнение команды PEEK. Установите #5D11 и #5C3B. - -x19A5 LD A,#FF ;код функции PEEK - JR x19AB ;выполнение команды - -;Адрес #19A9. Выполнение команды POKE. Установите #5D11 и #5C3B. Используется также с адреса #19AB (выполнение команды LOAD, PEEK или POKE; Установите #5D11 и #5C3B, а в аккумулятор поместите код функции). - -x19A9 LD A,#EE ;код функции POKE -x19AB LD (#5D10),A ;установка кода функции - JP x1818 ;выполнение команды - -;Адрес #19B1. Выполнение команды MERGE. Установите #5D11 и #5C3B. - -x19B1 LD A,#FF ;использовалась рабочая область - LD (#5D1F),A - -;Ошибка!!! Флаг состояния рабочей области находится по адресу #5D15. - - CALL x187A ;обработка параметров - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CE5) ;расширение файла B? - CP "B" - JP NZ,x1D1A ;если нет, то ошибка - LD BC,(#5CE6) ;установка длины файла для загрузки - LD (#5CDB),BC - PUSH BC ;сохранение ее - INC BC ;оставим место для байта #80 - RST #20 ;выделение места в рабочей области - DW #0030 - LD (HL),#80 ;маркер конца программы - EX DE,HL ;переброска адреса загрузки в HL - POP DE ;снятие со стека длины файла - PUSH HL ;сохранение адреса загрузки - LD DE,(#5CEB) ;берем адрес файла на диске - CALL x191B ;загружать весь файл - LD A,(#5CDC) ;берем длину файла в блоках - LD B,A - CALL x1852 ;операция со всем файлом - CALL x1921 ;загрузка файла - POP HL ;восстанавливаем адрес загрузки - LD DE,(#5C53) ;берем адрес программы на бейсике - RST #20 ;объединение программ - DW #08D2 - JP x03E1 ;сообщение O.K. - -;Адрес #19F2. Проверка места в памяти для резервирования нового пространства вместо старого. В HL - старая длина, в DE - новая. Используется также с адреса: -;#19FD (проверка наличия пространства в памяти; длина пространства должна быть в DE). - -x19F2 EX DE,HL - SCF ;вычисление разности длин - SBC HL,DE - RET C ;если новая длина меньше старой, то возврат - LD DE,#A ;должно остаться еще #A байтов - ADD HL,DE - LD B,H ;переброска разности длин в BC - LD C,L -x19FD RST #20 ;проверка наличия пространства в памяти - DW #1F05 - RET ;возврат - -;Адрес #1A01. Подготовка к загрузке программы на бейсике. - -x1A01 LD DE,(#5C53) ;берем адрес начала программы на бейсике - LD HL,(#5C59) ;берем адрес конца программы на бейсике - DEC HL - PUSH HL ;сохранение начала и конца программы - PUSH DE - SBC HL,DE ;вычисление длины программы на бейсике - LD DE,(#5CE6) ;берем длину программы с переменными - PUSH DE ;сохраняем ее - PUSH HL ;сохранение длины старой программы - LD HL,0 ;идет верификация? - LD A,(#5CF9) - CP #FF - JR Z,x1A20 ;если да, то длину не меняем - LD HL,5 ;иначе увеличим ее на 5 байтов -x1A20 ADD HL,DE - LD (#5CDB),HL ;установка длины загрузки - POP HL ;восстановление длины старой программы - LD A,(#5CF9) ;верификация? - CP #FF - JR NZ,x1A31 ;если нет, то подготовка памяти - POP DE ;снятие регистров со стека - POP DE - POP HL - JR x1A48 ;возврат -x1A31 CALL x19F2 ;проверка наличия места для программы - POP BC ;восстановление длины программы с переменными - POP DE ;восстановление начала программы - POP HL ;восстановление конца программы - PUSH BC ;сохранение длины программы - RST #20 ;стирание старой программы - DW #19E5 - POP BC ;восстановление длины программы - CALL x1E32 ;резервирование места для новой программы - INC HL ;установка переменной VARS - LD BC,(#5CE8) - ADD HL,BC - LD (#5C4B),HL -x1A48 LD HL,(#5C53) ;берем адрес загрузки программы - RET ;возврат - -;Адрес #1A4C. Подготовка памяти к загрузке массива. Установите #5CE8, #5CD7, #5CD9 и #5CF9. - -x1A4C LD DE,(#5CE8) ;загружать весь файл - LD (#5CDB),DE - LD HL,(#5CD7) ;берем адрес массива в памяти - LD A,(#5CF9) ;верификация? - CP #FF - RET Z ;если да, то возврат - LD HL,(#5CD9) ;берем адрес загрузки файла - PUSH HL ;сохраняем его -x1A61 CALL x19F2 ;проверка наличия места для массива - POP HL ;восстановление адреса загрузки файла - LD A,H ;он равен 0? - OR L - JR Z,x1A79 ;если да, то старый массив не убираем - LD HL,(#5CD7) ;берем начало старого массива - DEC HL - DEC HL - DEC HL - LD BC,(#5CD9) ;берем его длину - INC BC - INC BC - INC BC - CALL x1E2E ;стирание старого массива -x1A79 LD HL,(#5C59) ;берем начало области переменных - DEC HL - LD BC,(#5CE8) ;берем длину файла - PUSH BC ;сохраняем ее - INC BC - INC BC - INC BC - CALL x1E32 ;резервирование места для нового массива - INC HL ;установка имени массива - LD A,(#5CD2) - LD (HL),A - INC HL ;восстановление и установка длины массива - POP DE - LD (HL),E - INC HL - LD (HL),D - INC HL ;берем адрес тела массива - RET ;возврат - -;Адрес #1A94. Вычисление адреса сектора файла на диске по его номеру в файле. Вход: установите #5CD7 и #5CD9 и поместите в регистр B длину файла в секторах, а в DE - адрес файла на диске. Выход: в DE будет адрес сектора на диске, а в B помещается 1. - -x1A94 LD A,(#5CD9) ;берем номер сектора в файле - LD C,B - LD B,A - LD A,C - CP B ;он меньше, чем количество секторов в файле? - JR C,x1AB6 ;если нет, то ошибка - -;Внимание, ошибка!!! Вы не сможете загрузить последний сектор файла, т.к. его номер равен количеству секторов в файле. - - LD A,B ;он равен 0? - OR A - JP Z,x1D1A ;если да, то синтаксическая ошибка - DEC B ;он был равен 1? - JR Z,x1AB0 ;если да, то его адресом будет адрес файла - LD A,#10 ;на дорожке 16 секторов -x1AA7 INC E ;вычисление адреса сектора на диске - CP E - JR NZ,x1AAE - LD E,0 - INC D -x1AAE DJNZ x1AA7 -x1AB0 LD B,1 ;загружать надо 1 сектор - LD HL,(#5CD7) ;берем адрес загрузки сектора - RET ;возврат -x1AB6 LD HL,x29ED ;адрес сообщения REC.O/F - LD A,5 ;код ошибки - 5 - JP x1C4A ;обработка ошибки - -;Адрес #1ABE. Проверка наличия файла и свободного места в каталоге. Имя файла поместите на стек калькулятора. Используется также с адреса #1AC4 (проверка наличия свободного места в каталоге диска). - -x1ABE CALL x292F ;установка имени и поиск файла - JP Z,x1C50 ;если нашли, то FILE EXISTS -x1AC4 CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - LD A,(#5E09) ;на диске 128 файлов? - CP #80 - JP Z,x2723 ;если да, то сообщение DIRECTORY FULL - RET ;иначе возврат - -;Адрес #1AD0. Выполнение команды SAVE. Установите #5C3B и #5D11. Используется также с адресов: -;#1B27 - запись программы на бейсике. Установите #5CDD и #5CE5. -;#1B53 - запись файла. Установите #5CDD, #5CE5, #5CD7, #5CD9 и #5CDB. - -x1AD0 CALL x1852 ;обнуление #5D10 - LD HL,0 ;автостарт бейсика не производить - LD (#5CD1),HL - CALL x1DDF ;помещение имени файла на стек калькулятора - CALL x1D8C ;берем текущий символ - CP #AF ;это CODE? - JR Z,x1B39 ;если да, то прием начала и длины - CP #CA ;это LINE? - JR NZ,x1AF8 ;если нет, то проверка остальных расширений - CALL x1E0B ;прием строки автостарта бейсика - CALL x1D75 ;если проверка на синтаксис, то возврат - LD HL,(#5CDB) ;установка строки автостарта бейсика - LD (#5CD1),HL - LD HL,#5CE5 - JR x1B1F ;переход на запись бейсика -x1AF8 CP #AA ;текущий символ SCREEN$? - JR NZ,x1B0D ;если нет, то проверка расширения DATA - LD HL,#4000 ;начало файла - #4000 - LD (#5CD7),HL - LD HL,#1B00 ;его длина - #1B00 байтов - LD (#5CD9),HL - LD (#5CDB),HL - JR x1B48 ;запись файла с расширением C -x1B0D CALL x1D75 ;если проверка на синтаксис, то возврат - CALL x1D8C ;берем текущий символ - LD HL,#5CE5 - CP #E4 ;это DATA? - JR Z,x1B2C ;если да, то запись массива - CP #D ;это ENTER? - JP NZ,x1D1A ;если нет, то ошибка -x1B1F LD (HL),"B" ;расширение B - CALL x1ABE ;проверка наличия такого файла и свободного места в каталоге - CALL x1E1C ;удаление из командной строки пятибайтных чисел -x1B27 CALL x1BDE ;установка начала и длины файла - JR x1B53 ;запись файла -x1B2C LD (HL),"D" ;расширение D - CALL x1ABE ;проверка наличия файла и места в каталоге - CALL x1C0F ;установка начала и длины файла - JR NC,x1B53 ;если все в порядке, то запись файла - JP C,x1D1A ;иначе ошибка -x1B39 CALL x1DE5 ;принятие начала и длины файла - LD HL,(#5CD9) ;установка начала файла - LD (#5CD7),HL - LD HL,(#5CDB) ;установка длины файла - LD (#5CD9),HL -x1B48 CALL x1D75 ;если проверка на синтаксис, то возврат - LD A,"C" ;расширение C - LD (#5CE5),A - CALL x1ABE ;проверка наличия файла и места в каталоге -x1B53 CALL x1B59 ;запись файла - JP x0569 ;запись информации о нем - -;Адрес #1B59. Запись файла. Установите #5CD1, #5CD7, #5CD9 и #5CDB, а в буфер загрузите сектор 8 дорожки 0. - -x1B59 LD HL,(#5CD7) ;установка начала файла - LD (#5CE6),HL - EX DE,HL ;переброска его в DE - LD HL,(#5CD9) ;берем длину файла - LD A,L ;она равна 0? - OR H - JP Z,x1D1A ;если да, то ошибка - LD A,L ;вычисление длины файла в секторах - OR A - JR Z,x1B6D - INC H -x1B6D LD A,H ;установка длины файла в секторах - LD (#5CEA),A - LD E,A ;вычисление нового количества свободных секторов - LD D,0 - LD HL,(#5E0A) - SBC HL,DE - JP C,x1C45 ;если на диске нет места, то ошибка -x1B7B PUSH HL ;сохранение нового количества свободных секторов - LD HL,(#5C59) ;добавление к программе на бейсике байта #AA - LD (HL),#AA - INC HL - LD DE,(#5CD1) ;и номера строки автостарта - LD (HL),E - INC HL - LD (HL),D - LD HL,(#5CDB) ;установка длины файла - LD (#5CE8),HL - LD HL,(#5E06) ;установка адреса файла на диске - LD (#5CEB),HL - EX DE,HL ;переброска его в DE - LD HL,(#5CE6) ;берем начало файла - LD A,(#5CEA) ;берем его длину в секторах - LD B,A - CALL x1E4D ;запись файла - LD HL,(#5CF4) ;берем адрес свободного пространства диска - PUSH HL ;сохраняем его - CALL x03FD ;загрузка в буфер сектора 8 дорожки 0 - POP HL ;восстановление адреса свободного места на диске - LD (#5E06),HL ;установка его - POP HL ;восстановление количества свободных секторов - LD (#5E0A),HL ;установка его - LD HL,#5E09 ;берем номер файла - LD A,(HL) - LD (#5D1E),A ;установка его - INC (HL) ;записали еще 1 файл - PUSH HL ;сохранение адреса с кол-вом файлов на диске - CALL x1E43 ;перезапись сектора 8 дорожки 0 - POP HL ;восстановление адреса с кол-вом файлов - LD C,(HL) ;берем номер записанного файла - DEC C - LD A,(#5CE5) ;расширение файла B? - CP "B" - CALL Z,x1BC8 ;если да, то установка длины программы без переменных - RET ;возврат - -;Адрес #1BC8. Установка длины программы на бейсике без переменных. Длину с переменными программа помещает в #5CE6, длину без переменных - в #5CE8. - -x1BC8 LD HL,(#5C59) ;вычисление длины программы с переменными - LD DE,(#5C53) - SCF - SBC HL,DE - LD (#5CE6),HL ;установка ее - LD HL,(#5C4B) ;вычисление длины только программы - SBC HL,DE - LD (#5CE8),HL ;установка ее - RET ;возврат - -;Адрес #1BDE. Установка начала и длины файла для записи программы на бейсике. - -x1BDE LD HL,(#5C4B) ;вычисление длины программы с переменными - LD DE,(#5C53) - SBC HL,DE - LD (#5CDB),HL ;установка длины файла для каталога - LD HL,(#5C53) ;установка начала файла - LD (#5CD7),HL - LD HL,(#5C59) ;вычисление длины файла с параметрами автозапуска - INC HL - INC HL - INC HL - SBC HL,DE - LD (#5CD9),HL ;установка действительной длины файла - RET ;возврат - -;Адрес #1BFC. Прием имени массива для команды LOAD...DATA. Вход: установите #5C5D на расширение файла и установите #5CF9. Выход: устанавливает #5CD2, #5CD7, #5CD9 и #5CDB. Используется также с адреса #1C0F (то же, что и #1C1B, но с обработкой ошибок). - -x1BFC CALL x1C1B ;поиск массива - RET NC ;если массив найден, то возврат - LD HL,0 ;старого массива нет - LD (#5CD9),HL - LD A,(#5CF9) ;идет загрузка? - CP #FF - RET NZ ;если да, то возврат - JP x1C13 ;ошибка -x1C0F CALL x1C1B ;поиск массива - RET NC ;если массив найден, то возврат -x1C13 LD A,#E ;код ошибки - #E - LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND - JP x1C4A ;обработка ошибок - -;Адрес #1C1B. Поиск массива без обработки ошибок. Будут установлены #5CD2, #5CD7, #5CD9 и #5CDB. При ошибке флаг C будет установлен, иначе сброшен. - -x1C1B CALL x1E2A ;берем следующий символ - CALL x1D9B ;поиск массива - SET 7,C ;установка бита 7 в его имени - LD A,C ;установка его имени - LD (#5CD2),A - JR NC,x1C2B ;если массив найден, то установка его параметров -x1C29 SCF ;была ошибка - RET ;возврат -x1C2B JR NZ,x1C29 ;если флаг Z сброшен, то ошибка - INC HL ;берем длину массива - LD E,(HL) ;установка длины массива - INC HL - LD D,(HL) - INC HL - LD (#5CD7),HL ;установка адреса тела массива - LD (#5CDB),DE ;установка длины массива - LD (#5CD9),DE - CALL x1E2A ;следующий символ - CP ")" ;это ")"? - JR NZ,x1C2B ;если нет, то ошибка - RET ;возврат - -;Адрес #1C45. Обработка ошибки NO SPACE. Используется также с адреса #1C4A (обработка ошибок; в A - код ошибки, в HL - адрес сообщения). - -x1C45 LD HL,x29BB ;адрес сообщения NO SPACE - LD A,3 ;код ошибки - 3 -x1C4A CALL x03C3 ;если надо, то печать сообщения - JP x01D3 ;завершение - -;Адрес #1C50. Обработка ошибки FILE EXISTS. - -x1C50 LD HL,x29C5 ;адрес сообщения FILE EXISTS - LD A,2 ;код ошибки - 2 - JR x1C4A ;обработка ошибок - -;Адрес #1C57. Установка имени файла. Установите #5C5D на имя файла. Будет выбран дисковод и установлена переменная #5CDD. - -x1C57 LD HL,#5CDD ;адрес переменной с именем файла - LD B,8 ;ее длина - 8 байтов -x1C5C LD (HL)," " ;очистка ее - INC HL - DJNZ x1C5C - CALL x0531 ;снятие строки со стека калькулятора - EX DE,HL - CALL x1C81 ;установка дисковода - LD A,C ;имя файла - пустая строка? - OR A - -;Ошибка в программе!!! Здесь должно быть OR B. - - JP Z,x1D1A ;если да, то ошибка - CP 9 ;в имени файла больше 8 символов - JR C,x1C73 ;если да, то обрезаем его - LD C,8 - -;Внимание!!! Это будет работать неправильно при длине имени файла больше #FF символов. - -x1C73 LD A,(HL) ;берем первый символ имени файла - CP " " ;его код меньше #20? - JP C,x1D1A ;если да, то ошибка - LD DE,#5CDD ;адрес переменной с именем файла - PUSH BC ;сохранение длины имени - LDIR ;установка имени - POP BC ;восстановление длины имени - RET ;возврат - -;Адрес #1C81. Установка дисковода для операции с файлом. В HL поместите начало имени файла в ASCII представлении, а в BC ? его длину. HL установится на начало имени без дисковода, а в BC будет его длина. - -x1C81 INC HL ;берем адрес следующего символа имени - LD A,(HL) ;берем этот символ - CP ":" ;это двоеточие? - JR NZ,x1C98 ;если нет, то активизация дисковода по умолчанию - DEC HL ;берем адрес имени дисковода - LD A,(HL) ;берем имя дисковода - CALL x0524 ;преобразование имени дисковода в его номер - PUSH BC ;сохранение длины имени файла - PUSH HL ;и адреса имени дисковода - CALL x3DCB ;выбор дисковода - POP HL ;восстановление адреса имени дисковода - POP BC ;и длины имени файла - DEC BC ;отсекли 2 символа - DEC BC - INC HL ;берем адрес имени файла без дисковода - INC HL - RET ;возврат -x1C98 DEC HL ;берем адрес имени файла - LD A,(#5D19) ;берем дисковод по умолчанию - PUSH BC ;сохранение длины и адреса имени файла - PUSH HL - CALL x3DCB ;выбор дисковода - POP HL ;восстановление длины и адреса имени файла - POP BC - RET ;возврат - -;Адрес #1CA4. Определение адреса описателя файла в буфере по его номеру в секторе. В C должен быть номер описателя в секторе. На выходе в HL будет его адрес. - -x1CA4 LD L,C ;перевод номера описателя файла в двухбайтную - LD H,0 ;форму - ADD HL,HL ;умножение его на #10 - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD BC,#5D25 ;адресуемся от начала буфера - ADD HL,BC - RET ;возврат - -;Адрес #1CB0. Установка и проверка имени файла. Имя файла должно быть помещено на стек калькулятора. Выход: если файл с таким именем есть, то будет установлен флаг Z, а в рег. C и в #5D1E будет его номер, а если такого файла нет, то флаг Z сбросится. Используется также с адреса: -;#1CB3 (поиск файла, установите #5CDD и #5CE5, выход как и из #1CB0). - -x1CB0 CALL x1C57 ;установка имени файла -x1CB3 CALL x03E8 ;начнем с сектора 0 - LD B,#80 ;всего 128 файлов - LD C,0 ;начнем с нулевого описателя в секторе -x1CBA PUSH BC ;сохраним номер файла и счетчик - CALL x1CA4 ;определим начало описателя в буфере - CALL x050C ;проверка и обработка достижения конца буфера - POP BC ;восстановление номера описателя в секторе и - PUSH BC ;счетчика файлов без изменения стека - LD A,C ;просмотрен весь сектор? - CP #10 - JR NZ,x1CCD ;если да, то - POP BC ;снятие номера описателя и счетчика со стека - LD C,0 ;нулевой описатель в секторе - JR x1CBA ;повтор проверки -x1CCD LD DE,#5CDD ;берем адрес части описателя для проверки - LD A,(#5D06) ;берем длину этой части - LD B,A - XOR A ;конец каталога? - CP (HL) - JR NZ,x1CDB ;если нет, то переход на проверку описателя - POP BC ;снятие номера описателя и счетчика со стека - JR x1CE4 ;выход с флагом NZ -x1CDB CALL x2713 ;сравнение частей описателей - POP BC ;восстановление номера описателя и счетчика - JR Z,x1CE7 ;если части описателей совпали, то на выход - INC C ;следующий описатель - DJNZ x1CBA ;повтор до конца -x1CE4 OR #FF ;выключение флага Z - RET ;возврат -x1CE7 LD A,#80 ;определение номера файла - SUB B - LD C,A - LD (#5D1E),A ;помещение его в #5D1E - XOR A ;сброс флага Z - RET Z ;возврат - -;Адрес #1CF0. Поиск файла. Часть описателя, подлежащую проверке, установите по адресу #5CDD и установите #5D06. Если файл не найден, то будет сброшен флаг Z и в #5D0F будет #FF, а если найден, то включится флаг Z, а номер файла будет в рег. C и по адресам #5D0F и #5D1E. - -x1CF0 CALL x1CB3 ;поиск файла - LD HL,#5D0F - LD (HL),C ;загрузка регистра C в #5D0F - RET Z ;если файл найден, то возврат - LD (HL),#FF ;помещаем в #5D0F #FF - RET ;возврат - -;Адpес #1CFB. Выполнение команды RETURN. Установите #5C3B, #5D1C и #5D13. - -x1CFB CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x20E5 ;изменение памяти - RES 3,(IY+1) ;установка режима ввода "K" - CALL x0232 ;восстановление старого ERR_SP - LD SP,(#5D1C) ;восстановление стека - LD HL,(#5C3D) ;берем адрес перед адресом из ERR_SP - DEC HL - LD A,#12 ;там находится #12? - CP (HL) - JR NZ,x1D19 ;если нет, то возврат - DEC HL ;установка ERR_SP на адрес ниже - LD (#5C3D),HL -x1D19 RET ;возврат - -;Адрес #1D1A. Обработка синтаксической ошибки. Установите #5C3A, #5D0E, #5D15, и все для подпрограммы #1D3. Используется также с адреса: -;#1D29 (обработка ошибок; в A - код ошибки, в HL ? адрес сообщения). - -x1D1A BIT 7,(IY+0) ;код ошибки бейсика уже назначен? - JR Z,x1D25 ;если нет, то установка ошибки - LD A,#B ;NONSENCE IN BASIC - LD (#5C3A),A -x1D25 INC A ;получение кода ошибки DOS - LD HL,x29B2 ;адрес сообщения ERROR -x1D29 CALL x03C3 ;печать сообщения, если можно - JP x01D3 ;завершение - -;Адрес #1D2F. Обработка ошибки, поступившей из пзу бейсика без очистки стека. Установите #5C3A. - -x1D2F LD A,(#5C3A) ;берем код ошибки бейсика - LD HL,x27CA ;адрес сообщения *BREAK* - CP #14 ;BREAK INTO PROGRAM? - JR Z,x1D29 ;если да, то печать сообщения - CP #C ;BREAK - CONT REPEATS? - JR Z,x1D29 ;если да, то печать сообщения - LD HL,x27D2 ;адрес сообщения OUT OF RAM - CP 3 ;OUT OF MEMORY? - JR Z,x1D29 ;если да, то печать сообщения - LD HL,x27DD ;адрес сообщения ARRAY NOT FOUND - CP 1 ;VARIABLE NOT FOUND? - JR Z,x1D29 ;если да, то печать сообщения - JR x1D1A ;иначе сообщение *ERROR* - -;Адрес #1D4D. Выполнение команды RUN. Установите #5D11 и #5C3B. - -x1D4D CALL x1852 ;выполнять загрузку файла - CALL x1836 ;обработка параметров и загрузка файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD HL,(#5CE6) ;берем адрес загрузки файла по умолчанию - -;Ошибка!!! Ведь файл могли загрузить и по другому адресу. В подпрограмме #18AB надо сохранять в #5D20 действительный адрес загрузки файла, а здесь восстанавливать его. - - LD A,(#5CE5) ;расширение файла B? - CP "B" - JP Z,x012A ;если да, то запуск программы на бейсике - PUSH HL ;запуск программы в кодах - RET - -;Боже!!! Ну кто так делает!!! Во-первых, адрес программы при запуске должен быть в BC; во-вторых, надо совсем выйти из TR-DOS, иначе программа спятит при вызове #3D13; в третьих, куда программа будет возвращаться?; в четвертых... В общем, надо так (после CALL #1D75): -; LD A,(#5CE5) -; CP "D" -; JP Z,#1D1A -; CP "B" -; JP Z,#12A -; LD HL,START -; LD (#5D1A),HL -; JP #1D3 -; -;START CALL #232 -; LD BC,(#5D20) -; PUSH BC -; RET - -;Адрес #1D63. Очистка рабочей области памяти. - -x1D63 LD HL,#5D0E ;рабочую область очищать? - LD A,(HL) - CP #FF - LD (HL),0 ;рабочая область очищена - RET NZ ;если рабочая область очищена, то возврат - RST #20 ;очистка рабочей области - DW #16BF - RET ;возврат - -;Адрес #1D70. Проверка, идет ли проверка строки на синтаксис или выполнение команды. Если идет выполнение, то флаг Z будет сброшен, иначе установлен. - -x1D70 BIT 7,(IY+1) - RET - -;Адрес #1D75. Если идет проверка на синтаксис, то возврат из программы, вызвавшей эту подпрограмму. Установите #5C3B. - -x1D75 CALL x1D70 ;проверка, что делается - RET NZ ;если идет выполнение, то возврат - POP HL ;снятие адреса возврата в вашу программу - RET ;возврат по следующему адресу - -;Адрес #1D7B. Помещение числа на стек калькулятора. Установите #5C5D на символ перед числом. Если строка проверяется на синтаксис, то будет установлен флаг Z, а при выполнении он сброшен. - -x1D7B CALL x1E2A ;берем следующий символ строки - CALL x1DC1 ;помещение числа на стек калькулятора - JR x1D70 ;проверка, идет выполнение или проверка и возврат - -;Адрес #1D83. Открытие потока 0. Используется также с адреса #1D84 (открытие потока; номер в регистре A). - -x1D83 XOR A ;номер потока - 0 -x1D84 RST #20 ;открытие потока - DW #1601 - RET ;возврат - -;Адрес #1D88. Открытие потока 2. - -x1D88 LD A,2 ;номер потока - 2 - JR x1D84 ;открытие потока - -;Адрес #1D8C. Выборка текущего символа строки. Поместите его адрес в #5C5D. - -x1D8C RST #20 - DW #0018 - RET - -;Адрес #1D90. Ввод команды. - -x1D90 CALL x1D83 ;открытие потока 0 - RST #20 ;редактирование командной строки - DW #0F2C - RET ;возврат - -;Адрес #1D97. Очистка экрана и открытие потока 0. - -x1D97 RST #20 - DW #0D6B - RET - -;Адрес #1D9B. Поиск массива. Установите #5C5D на имя массива. Если массив найден, то в HL будет его адрес. - -x1D9B RST #20 - DW #28B2 - RET - -;Адpес #1D9F. Очистка низа экрана. - -x1D9F RST #20 - DW #0D6E - RET - -;Адрес #1DA3. Печать числа из регистра A. Используется также с адресов: -;#1DA4 (печать числа из регистра C), -;#1DA9 (печать числа из регистра BC). - -x1DA3 LD C,A ;переброска числа в C -x1DA4 LD B,0 ;перевод числа в двухбайтную форму - JP x1DA9 ;странная команда! -x1DA9 PUSH BC ;сохранение числа - CALL x20F1 ;изменение памяти - POP BC ;восстановление числа - RST #20 ;печать числа - DW #1A1B - CALL x20F1 ;восстановление памяти - RET ;возврат - -;Адрес #1DB5. Снятие строки со стека калькулятора. В DE будет адрес строки, в BC - ее длина. - -x1DB5 RST #20 - DW #2BF1 - RET - -x1DB9 RST #20 - DW #1E99 - RET - -;Адрес #1DBD. Помещение строки на стек калькулятора. Установите #5C5D на начало строки. - -x1DBD RST #20 - DW #1C8C - RET - -;Адрес #1DC1. Помещение числа из BC на стек калькулятора. - -x1DC1 RST #20 - DW #1C82 - RET - -;Адрес #1DC5. Установка CH_ADD на второй символ строки. Установите #5D11. - -x1DC5 LD HL,(#5D11) ;берем адрес строки команды - INC HL ;берем адрес ее второго символа - LD (#5C5D),HL ;помещаем его в CH_ADD - RET ;возврат - -;Адрес #1DCD. Принятие 2-х строк на стек калькулятора. Поместите в #5D11 адрес первой строки. - -x1DCD CALL x1DDF ;прием первой строки на стек калькулятора -x1DD0 CALL x1D8C ;берем текущий символ - CP "," ;это запятая? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1E2A ;следующий символ - CALL x1DBD ;прием второй строки на стек калькулятора - RET ;возврат - -;Адрес #1DDF. Установка CH_ADD и помещение строки на стек калькулятора. Установите #5D11. - -x1DDF CALL x1DC5 ;установка CH_ADD - JP x1DBD ;помещение строки на стек калькулятора - -;Адрес #1DE5. Принятие одного или двух чисел после символа CODE. Первое число будет в #5CD9, второе - в #5CDB. Если было одно число, то оно будет в обеих ячейках. Если принято 2 числа, то в #5CD6 будет 3. На входе установите #5C5D и #5C3B. Используется также с адреса: -;#1E0B (принятие числа; установите #5C5D и #5C3B; число будет в #5CDB, а в #5CD6 будет 3). - -x1DE5 CALL x1D8C ;берем текущий символ строки - CP #AF ;это CODE? - RET NZ ;если нет, то возврат -x1DEB CALL x1D7B ;принятие числа на стек калькулятора - JR Z,x1DFB ;если идет проверка на синтаксис, то дальнейшая проверка - CALL x1DB9 ;снятие числа со стека калькулятора - LD (#5CD9),BC ;установка первого числа - LD (#5CDB),BC -x1DFB CALL x1D8C ;берем текущий символ - CP "," ;это запятая? - JR Z,x1E0B ;если да, то принятие второго числа - CP #D ;это ENTER? - JP NZ,x1D1A ;если нет, то ошибка - CALL x1D75 ;если строка проверяется на синтаксис, то возврат - RET ;возврат -x1E0B CALL x1D7B ;прием второго числа на стек калькулятора - RET Z ;если проверка на синтаксис, то возврат - CALL x1DB9 ;снятие числа со стека калькулятора - LD (#5CDB),BC ;помещение его в #5CDB - LD A,3 ;приняли 2 числа - LD (#5CD6),A - RET ;возврат - -;Адрес #1E1C. Удаление из командной стpоки пятибайтных чисел - -x1E1C LD HL,(#5D11) ;берем адрес строки команды - RST #20 ;удаление из нее пятибайтных чисел - DW #11A7 - RET ;возврат - -;Адрес #1E23. Выделение пространства в рабочей области. В BC поместите длину требуемого пространства. - -x1E23 LD HL,(#5C61) ;загрузка HL из #5C61 - RST #20 ;выделение пространства - DW #0030 - RET ;возврат - -;Адрес #1E2A. Выборка следующего символа строки. Установите #5C5D. - -x1E2A RST #20 - DW #0020 - RET - -;Адрес #1E2E. Удаление области памяти. В HL поместите начало области, в BC - длину. - -x1E2E RST #20 - DW #19E8 - RET - -x1E32 RST #20 - DW #1655 - RET - -;Адрес #1E36. Загрузка регистра дорожки. Установите #5CD1. При выходе по ошибке в #5D17 помещается #FF. Можно использовать с адреса: -;#1E3A для прямого вывода в порт #3F. - -x1E36 CALL x0A31 ;new определение номера дорожки, на которой стоит головка - LD A,H ;установка регистра дорожки -x1E3A OUT (#3F),A - RET ;возврат - -;Адрес #1E3D. Загрузка секторов. Вход: в HL - адрес загрузки, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. - -x1E3D XOR A ;признак загрузки - JR x1E64 ;переход к подпрограмме загрузки/записи секторов - -;Адрес #1E40. Запись информации о файле. На входе в C должен быть номер файла. Используется также с адресов: -;#1E43 - запись сектора из буфера. Вход: в #5CF4 установите номер сектора+1, а в #5CF5 - номер дорожки. -;#1E4D - запись секторов. В HL - адрес, в D - номер дорожки, в E - номер сектора, в B - кол-во секторов. -;#1E64 - загрузка/запись секторов. Предварительные установки как и для предыдущей подпрограммы плюс в A установите 0 для загрузки или что-нибудь другое для записи. - -x1E40 CALL x166B ;чтение сектора с описателем файла и замена описателя -x1E43 LD DE,(#5CF4) ;берем номер сектора для записи - DEC DE - LD B,1 ;записывать 1 сектор - LD HL,#5D25 ;записывать будем из буфера -x1E4D PUSH HL ;сохраним адрес секторов на диске и в памяти - PUSH DE - CALL x3E11 ;берем тип дисковода - BIT 7,(HL) ;он 40-дорожечный? - JR Z,x1E60 ;если да, то записывать можно - BIT 0,(HL) ;используем 40 дорожек на 80-дорожечном? - JR NZ,x1E60 ;если нет, то записывать можно - LD HL,x29D8 ;адрес сообщения READ ONLY - JP x1D29 ;переход на обработку ошибок - -;Внимание, ошибка!!! В аккумуляторе забыли установить код ошибки. - -x1E60 POP DE ;восстановление адресов секторов - POP HL -x1E62 LD A,#FF ;признак записи -x1E64 LD (#5CCE),A ;установка признака операции -x1E67 LD (#5CF4),DE ;установка адреса секторов на диске - PUSH BC ;сохранение количества секторов - PUSH HL ;и адреса загрузки / записи - CALL x1E36 ;чтение индексной области дорожки - POP HL ;восстановление адреса загрузки / записи - POP BC ;и количества секторов - XOR A ;количество секторов равно 0? - OR B - RET Z ;если да, то возврат -x1E75 PUSH BC ;сохраняем адрес и кол-во секторов - PUSH HL - CALL x3F06 ;установка адреса загрузки / записи секторов - LD A,(#5CF4) ;установка номера сектора - CALL x3F02 - LD A,(#5CF5) ;позиционирование головки на дорожку - CALL x3E63 - LD A,(#5CCE) ;берем флаг операции - OR A ;загрузка? - PUSH AF - CALL Z,x3F0E ;если да, то загрузка сектора - POP AF - CALL NZ,x3F0A ;иначе запись сектора - POP HL ;берем адрес следующего сектора - LD DE,#100 - ADD HL,DE - PUSH HL ;сохраняем его - LD A,#10 ;на дорожке 16 секторов - LD HL,#5CF4 - INC (HL) ;следующий сектор - CP (HL) ;конец дорожки? - JR NZ,x1EA7 ;если да, то номер следующего сектора 0 - LD (HL),0 - LD HL,#5CF5 ;и берем следующую дорожку - INC (HL) -x1EA7 POP HL ;восстановление адреса следующего сектора - POP BC ;и количества секторов - DJNZ x1E75 ;если не все, то повтор - RET ;возврат - -;Адрес #1EAC. Вычисление количества полных секторов файла из его длины в байтах. В A должно быть количество секторов файла, а в DE - длина загружаемой части файла. - -x1EAC PUSH HL ;сохранение HL - LD H,A ;берем полную длину файла - LD L,0 - PUSH HL ;сохраняем ее - SBC HL,DE ;она меньше длины загрузки? - CALL C,x1EBC ;если да, то загружать весь файл - POP HL ;восстановление полной длины файла - LD A,H ;вычисление количества полных секторов из полной длины файла - POP HL ;восстановление HL - RET C ;если полная длина файла больше длины загрузки, - LD A,D ;то количество полных секторов берем из длины загрузки - RET ;возврат - -;Адрес #1EBC. Обнуление #5CD6 и установка флага C. - -x1EBC XOR A - LD (#5CD6),A - SCF - RET - -;Адрес #1EC2. Выполнение команды FORMAT. Установите #5D11 и #5C3B. Используется также с адреса #1EDD (повторение форматирования; установите #5CDD). - -x1EC2 LD HL,#FFFF - LD (#5CD7),HL ;дорожки не проверять - LD (#5CD9),HL ;форматировать одну сторону диска - LD (#5CD1),HL ;ошибку при чтении адресного маркера игнорировать - CALL x042B ;следующий символ ENTER? - JP Z,x1D1A ;если да, то ошибка - CALL x1DDF ;прием имени диска на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x1C57 ;установка имени диска -x1EDD CALL x3E11 ;берем тип дисковода - AND #80 ;дисковод 40-дорожечный? - LD A,#28 ;форматировать 40 дорожек - JR Z,x1EE8 ;если дисковод 80-дорожечный, - LD A,#50 ;то форматировать 80 дорожек -x1EE8 LD (#5CD7),A ;установка количества дорожек - CALL x08A7 ;new восстановление - CALL x0B01 ;new выбор нижней стороны диска - CALL x3EA0 ;задержка в 3135098 тактов - LD E,1 ;форматирование дорожки с номером 1 - CALL x1FFD - CALL x1FEB ;выбор верхней стороны диска - LD E,0 ;форматирование дорожки с номером 0 - CALL x1FFD - LD A,(#5CDD) ;форматировать только одну сторону диска - CP "$" - JR Z,x1F1B ;если да, то форматирование диска - CALL x1FF6 ;выбор нижней стороны диска - CALL x3EA0 ;задержка в 3135098 тактов - CALL x3EB5 ;чтение адресного маркера - LD A,H ;номер дорожки - 1? - CP 1 - JR NZ,x1F1B ;если нет, то форматирование диска -x1F16 LD A,#80 ;форматировать обе стороны диска - LD (#5CDA),A -x1F1B CALL x20BD ;форматирование диска - LD HL,#5D25 ;адрес начала буфера - LD (HL),0 ;очистка первого байта - LD DE,#5D26 ;адрес второго байта буфера - LD BC,#FF ;осталось очистить #FF байтов - LDIR ;очистка буфера - LD BC,#5CD7 ;адрес переменной с количеством дорожек - LD DE,#5CDA ;адрес переменной с количеством сторон - LD A,(BC) ;форматировали 80 дорожек? - CP #50 - JR Z,x1F49 ;если да, то диск 80-дорожечный - LD A,(DE) ;форматировали 2 стоpоны? - CP #80 - JR Z,x1F42 ;если да, то диск 40-дорожечный двухстоpонний - LD A,#19 ;диск 40-дорожечный односторонний - LD HL,#270 ;свободно #270 сектора - JR x1F55 ;создание описателя диска -x1F42 LD A,#17 ;диск 40-дорожечный двухсторонний -x1F44 LD HL,#4F0 ;свободно #4F0 сектора - JR x1F55 ;создание описателя диска -x1F49 LD A,(DE) ;форматировали 2 стороны? - CP #80 - LD A,#18 ;если нет, то диск 80-дорожечный односторонний - JR NZ,x1F44 - LD A,#16 ;иначе диск 80-дорожечный двухсторонний - LD HL,#9F0 ;свободно #9F0 сектора -x1F55 LD (#5E08),A ;установка типа диска - LD (#5E0A),HL ;установка количества свободных секторов - LD A,1 ;первая свободная дорожка - 1 - LD (#5E07),A - LD A,#10 ;признак принадлежности диска к TR-DOS - LD (#5E0C),A - LD HL,#5E0F ;9 байтов #20 с адреса #5E0F - LD DE,#5E10 - LD BC,8 - LD (HL),#20 - LDIR - LD HL,#5CDD ;установка имени диска - LD DE,#5E1A - LD BC,8 - LDIR - CALL x0B54 ;new выбор верхней стороны диска - LD B,1 ;записать 1 сектор - LD DE,8 ;сектор 8 дорожки 0 - LD HL,#5D25 ;из буфера - CALL x1E62 ;запись сектора - LD A,(#5CD6) ;берем количество дефектных секторов - PUSH AF ;сохраняем его - XOR A ;расширение - CHR$ 0 - LD (#5CE5),A ;установка расширения - LD HL,(#5E0A) ;берем количество свободных секторов - LD (#5CD7),HL ;сохраняем его - LD HL,#5CDD ;печать имени диска - RST #18 - LD A,#D ;перевод строки - RST #10 - LD HL,(#5CD7) ;восстановление количества свободных секторов - POP AF ;восстановление количества дефектных секторов - PUSH HL ;сохранение количества свободных секторов - LD D,0 ;перевод количества дефектных секторов в - LD E,A ;двухбайтную форму - SBC HL,DE ;вычисление количества хороших секторов - LD B,H ;переброска его в BC - LD C,L - CALL x1DA9 ;печать его - LD A,"/" ;печать "/" - RST #10 - POP BC ;восстановление количества свободных секторов - CALL x1DA9 ;печать его - JP x01D3 - -;Адрес #1FB9. Таблица секторов для форматирования обычного диска. Используется также с адреса #1FBA для проверки дорожки. - -x1FB9 DB 1 -x1FBA DB 9,2,#A,3,#B,4,#C,5,#D,6,#E,7,#F,8,#10,1 - -;Адрес #1FCA. Определение количества дорожек дисковода. Вход: установите время перемещения головки дисковода. Выход: в #5CD7 и регистре A будет количество дорожек дисковода. - -x1FCA CALL x3E08 ;берем время перемещения головки - OR #11 ;позиционирование на дорожку #32 - LD B,A - LD A,#32 - CALL x3E44 - LD A,2 ;затем на дорожку 2 - CALL x3E44 - CALL x3DFD ;задержка в 725779 тактов - IN A,(#1F) ;головка в исходном положении? - AND 4 - LD A,#50 ;если нет, то у дисковода 80 дорожек - JR Z,x1FE7 - LD A,#28 ;иначе 40 -x1FE7 LD (#5CD7),A ;установка количества дорожек - RET ;возврат - -;Адрес #1FEB. Выбор верхней стороны диска. Установите #5D16. Используется также с адреса #1FF0 (загрузка системного регистра, код - в аккумуляторе). Вы можете также использовать с адреса: -;#1FF3 для прямого вывода в порт #FF. - -x1FEB LD A,(#5D16) ;берем копию системного регистра - OR #3C ;формат MFM, верхняя сторона, выключение сброса и готовности -x1FF0 LD (#5D16),A ;запоминаем копию системного регистра -x1FF3 OUT (#FF),A ;установка системного регистра - RET ;возврат - -;Адрес #1FF6. Выбор нижней стороны диска. Установите #5D16. - -x1FF6 LD A,(#5D16) ;берем копию системного регистра - AND #6F ;формат MFM, нижняя сторона, выключение сброса и готовности - JR x1FF0 ;установка системного регистра - -;Адрес #1FFD. Форматирование дорожки. В регистр Е поместите ее номер и спозиционируйте головку дисковода. Из переменных установите #5CD8, #5CE6, #5CE8 и обнулите #5CD6. Используется также с адреса #1FC9 (проверка дорожки; установите #5CD8, #5CE8 и обнулите #5CD6 и спозиционируйте головку). - -x1FFD DI ;запрет прерываний - LD A,#F4 ;запись дорожки - OUT (#1F),A - LD HL,#1FB9 ;берем адрес таблицы секторов для форматирования - LD C,#7F ;адрес регистра данных -x2007 LD B,#A ;#A раз #4E (первый пробел) - LD D,#4E - CALL x20B1 ;запись байта заданное число раз - LD B,#C ;синхропромежуток - LD D,0 - CALL x20B1 - LD B,3 ;синхроимпульс - LD D,#F5 - CALL x20B1 - LD D,#FE ;1 раз #FE (адресная метка идентификатора) - CALL x20AF ;запись байта 1 раз - LD D,E ;номер дорожки - CALL x20AF - LD D,0 ;номер стороны (в TR-DOS всегда 0) - CALL x20AF - LD D,(HL) ;номер сектора из таблицы - CALL x20AF - LD D,1 ;длина сектора - #100 байтов - CALL x20AF - LD D,#F7 ;запись контрольной суммы - CALL x20AF - LD B,#16 ;второй пробел - LD D,#4E - CALL x20B1 - LD B,#C ;синхропромежуток - LD D,0 - CALL x20B1 - LD B,3 ;синхроимпульс - LD D,#F5 - CALL x20B1 - LD D,#FB ;адресная метка данных - CALL x20AF - LD B,0 ;данные (#100 нулей) - LD D,0 - CALL x20B1 - LD D,#F7 ;запись контрольной суммы - CALL x20AF - LD B,#32 ;третий пробел - LD D,#4E - CALL x20B1 - LD A,(HL) ;берем адрес номера следующего сектора - INC HL - CP #10 ;конец таблицы? - JR NZ,x2007 ;если нет, то форматирование следующего сектора - LD B,0 ;пробел до конца дорожки - CALL x20B1 - JP M,x2076 - CALL x20B1 -x2076 IN A,(#1F) ;берем состояние контроллера - AND #40 ;запись запрещена? - JP NZ,x3F39 ;если да, то сообщение READ ONLY -x207D LD A,(#5CD8) ;дорожку проверять? - OR A - RET NZ ;если нет, то возврат - -;Внимание!!! Перед возвратом или выходом по ошибке надо разрешать прерывания. - - LD C,#7F ;адрес регистра данных - LD A,E ;установка номера дорожки - OUT (#3F),A - LD HL,#1FBA ;берем адрес таблицы секторов для проверки -x208A LD B,3 ;3 попытки - LD A,(HL) ;берем номер сектора из таблицы - OUT (#5F),A ;установка сектора - PUSH HL ;сохранение адреса таблицы секторов -x2090 DI ;запрет прерываний - LD A,#80 ;чтение сектора - OUT (#1F),A - PUSH BC ;сохранение количества попыток - CALL x3FE5 ;чтение данных по адресу из HL (в пзу, не страшно) - IN A,(#1F) ;все в порядке? - AND #7F - POP BC ;восстановление счетчика попыток - JR Z,x20A6 ;если все в порядке, то следующий сектор - DJNZ x2090 ;следующая попытка - LD HL,#5CD6 ;есть 1 битый сектор - INC (HL) -x20A6 POP HL ;восстановление адреса таблицы секторов - LD A,(HL) ;берем номер текущего сектора - INC HL ;берем адрес номера следующего сектора - CP 1 ;конец таблицы? - JR NZ,x208A ;если нет, то повтор - EI ;разрешение прерываний - RET ;возврат - -;Адрес #20AF. Запись байта 1 pаз. В регистр D поместите байт, в C - #7F и выдайте команду записи на вг-#5D. Используется также с адреса #20B1 (запись байта несколько раз; все для #20AF плюс в B количество выдач). - -x20AF LD B,1 ;запись 1 раз -x20B1 IN A,(#FF) ;ожидание DRQ или INTRQ - AND #C0 - JR Z,x20B1 - RET M ;если поступил INTRQ, то возврат - OUT (C),D ;выдача байта - DJNZ x20B1 ;повтор до конца - RET ;возврат - -;Адрес #20BD. Форматирование диска. Установите #5CDA, #5CD7, #5CE6 и #5CE8. - -x20BD call x0B0B ;берем число форматируемых дорожек - LD B,(HL) - XOR A ;дорожки проверять - INC HL - LD (HL),A - LD E,#FF ;начнем с дорожки 0 -x20C6 PUSH BC ;сохранение количества дорожек - INC E ;следующая дорожка - LD A,E - LD B,#1B ;позиционирование - CALL x3E44 - CALL x1FEB ;выбор верхней стороны диска - CALL x1FFD ;форматирование дорожки и возврат - LD A,(#5CDA) ;берем флаг количества сторон - CP #80 ;форматировать 2 стороны? - JR NZ,x20E1 ;если да, то - CALL x1FF6 ;выбор нижней стороны диска - CALL x1FFD ;форматирование дорожки и возврат -x20E1 POP BC ;восстановление количества дорожек - DJNZ x20C6 ;если еще не все, то повтор - RET ;возврат - -;Адрес #20E5. Удаление буфера с изменением памяти. На входе установите переменные #5CB6, #5CF8, #5D0C и #5D18. Выход: в #5D18 записывается #FF, а если в #5D0C выл 0, то туда также засылается #FF. Используется также с адреса: -;#20F1 (изменение памяти, работает только с #5CB6 и #5D18). - -x20E5 PUSH AF ;сохранение AF - LD A,(#5CF8) ;ничего не делать? - CP #FF - JR Z,x211C ;если да, то возврат - POP AF ;восстановление AF - CALL x2970 ;удаление буфера -x20F1 PUSH AF ;сохранение AF - LD A,(#5CB6) ;изменение разрешено? - CP #F4 - JR Z,x211C ;если нет, то возврат - XOR A - LD HL,#5D18 ;подтверждение есть? - OR (HL) - LD (HL),#FF ;в следующий раз подтверждение будет - JR Z,x211C ;если его не было, то возврат - LD A,(#5D0C) ;буфер есть? - OR A - LD HL,#5CC3 ;начало первого блока - LD DE,#5D33 ;начало второго блока - JR NZ,x2111 ;если есть буфер, то второй блок смещен на #101 - LD DE,#5E34 ;байтов -x2111 LD B,#2D ;длина блоков - #2D байтов -x2113 LD C,(HL) ;меняем блоки местами - LD A,(DE) - LD (HL),A - LD A,C - LD (DE),A - INC HL - INC DE - DJNZ x2113 -x211C POP AF ;восстановление AF - RET ;возврат - -;Адрес #211E. Очистка буфера редактора. - -x211E LD HL,(#5C59) ;берем адрес буфера редактора - LD (HL),#D ;ENTER - LD (#5C5B),HL ;установка курсора - INC HL ;конец области - LD (HL),#80 - RET ;возврат - -;Адрес #212A. Восстановление командной строки. Установите #5D20. - -x212A LD DE,(#5C59) ;символы переносить в буфер редактора - LD HL,#5D20 ;из #5D20 - CALL x02B0 ;перенос символов - RET ;возврат - -;Адрес #2135. Принятие команды. Установите #5D0F и если там не 0, то и #5D20. - -x2135 LD A,(#5D0F) ;ошибка была? - OR A - PUSH AF ;сохранение результата проверки - CALL NZ,x212A ;если да, то восстановление первых трех символов - -;Не надо этого делать!!! COPY портит буфер по адресу #5D20, а буфер редактора всегда остается цел. - - POP AF ;восстановление результата проверки - CALL Z,x211E ;если ошибки не было, то стирание старой строки - LD HL,(#5C59) ;эта команда тоже не нужна - CALL x3D80 ;перевод строки - LD A,(#5D19) ;берем номер дисковода по умолчанию - ADD A,"A" ;печать его имени - RST #10 - LD A,">" ;печать ">" - RST #10 - LD HL,#5C3A ;для нормального выхода из редактора - LD (HL),#FF - JP x1D90 ;ввод команды и возврат - -;Адрес #2158. Прием числа. CH_ADD установите на символ перед числом. Число, увеличенное на 1, будет помещено в #5CD7, а содержимое #5CDB будет скопировано в #5CD9. Число не должно равняться 0. - -x2158 CALL x1E2A ;следующий символ - CALL x1D8C - CP "," ;это запятая? - JP NZ,x1D1A ;если да, то ошибка - LD HL,(#5CDB) ;сохранение #5CDB - LD (#5CD9),HL - CALL x1E0B ;помещение числа на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD HL,(#5CDB) ;число pавно 0? - LD A,H - OR A - JP NZ,x1D1A ;если да, то ошибка - INC HL ;еще будет байт ENTER - LD (#5CD7),HL ;установка числа - LD HL,(#5CD9) ;восстановление #5CDB - LD (#5CDB),HL - RET ;возврат - -;Адрес #2182. Выполнение команды OPEN#. Установите #5D11 и #5C3B. - -x2182 LD HL,(#5D11) ;установка CH_ADD - LD (#5C5D),HL - CALL x1E0B ;принятие номера потока - CALL x1DD0 ;принятие имени файла на стек калькулятора -x218E CALL x1D8C ;берем текущий символ - CP "A" ;он меньше "A"? - JR NC,x219A ;если нет, то проверка режима файла - CALL x1E2A ;следующий символ - JR x218E ;повтор -x219A CP #A5 ;это RND? - PUSH AF ;сохранение символа и результата проверки - CALL Z,x2158 ;если это RND, то обработка длины записи - POP AF ;восстановление символа и результата проверки - JR Z,x21AE ;если это RND, то открытие потока - AND #DF ;буква заглавная - CP "R" ;это "R"? - JR Z,x21AE ;если да, то открытие потока - CP "W" ;это "W"? - JP NZ,x1D1A ;если нет, то ошибка -x21AE LD (#5D09),A ;сохранение буквы режима файла - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,"#" ;расширение файла - "#" - LD (#5CE5),A - LD A,0 ;поиск начинать с блока 0 - LD (#5CE6),A - CALL x21DB ;поиск последнего блока файла - PUSH AF ;сохранение флага результата поиска - CALL x220F ;проверка потока - POP AF ;восстановление флага результата поиска - PUSH AF ;сохранение флага результата поиска - CALL NZ,x2288 ;если файл не был найден, то создание блока 0 - POP AF ;восстановление флага результата поиска - CALL x2242 ;открытие потока - LD HL,(#5D11) ;коррекция переменной с адресом командной строки - LD BC,#124 - ADD HL,BC - LD (#5D11),HL - JP x01D3 ;завершение - -;Адрес #21DB. Поиск блока файла данных. Вход: поместите имя файла на стек калькулятора, установите #5CDD и #5D09 и поместите в #5CE6 номер первого блока файла. Выход: если файл найден, то будет считан описатель последнего или первого блока в зависимости от #5D09 и обнулен аккумулятор и установлен флаг Z; иначе флаг Z будет сброшен, а в аккумуляторе будет байт из #5D09. - -x21DB LD A,#A ;поиск файла ведем по #A байтам - LD (#5D06),A - CALL x1CB0 ;установка имени файла и поиск файла - PUSH AF ;сохранение результата поиска - CALL x0405 ;настройка на диск - POP AF ;восстановление результата поиска - JR NZ,x2206 ;если файл не найден, то проверка режима файла - LD A,(#5D09) ;открываем файл для чтения? - CP "R" - JR Z,x2201 ;если да, то выход -x21F1 LD HL,#5CE6 ;следующий блок - INC (HL) - CALL x1CB3 ;поиск блока - JR Z,x21F1 ;если блок найден, то следующий блок - LD HL,#5CE6 - DEC (HL) ;последний существующий блок - CALL x1CB3 ;определение его номера в каталоге -x2201 CALL x165D ;чтение его описателя - XOR A ;обнуление аккумулятора и установка флага Z - RET ;возврат -x2206 LD A,(#5D09) ;открываем файл для чтения? - CP "R" - RET NZ ;если да, то возврат - JP x03D9 ;сообщение NO FILE - -;Адрес #220F. Проверка занятости потока. Вход: установите #5CDB. Выход: в HL будет адрес элемента таблицы STRMS, отвечающего за данный поток. Используется также с адреса #2225 (то же, что и #1C4A). - -x220F LD A,(#5CDB) ;берем номер потока - RST #20 ;берем относительный адрес описателя потока, к - DW #1727 ;которому подключен канал - LD A,B ;поток занят? - OR C - JP NZ,x221B ;если да, то ошибка - RET ;возврат -x221B LD A,#19 ;код ошибки бейсика PARAMETER ERROR - -;Внимание!!! Лучше выдавать сообщение INVALID STREAM. - - LD (#5C3A),A - LD HL,x2804 ;адрес сообщения STREAM OPENED - LD A,#A ;код ошибки TR-DOS - #A -x2225 JP x1C4A ;обработка ошибки - -;Адрес #2228. Обработка ошибки NOT DISC FILE. - -x2228 LD A,#B ;код ошибки - #B - LD HL,x2812 ;адрес сообщения NOT DISC FILE - JR x2225 ;обработка ошибки - -;Адрес #222F. Инициализация признаков файла произвольного доступа. Установите #5CD7 и откройте канал файла данных. Подпрограмма помещает в A #7F. - -x222F PUSH HL ;сохранение HL - LD C,#20 ;берем адрес #20-го байта описателя канала - RST #28 - LD A,(#5CD7) ;установка длины записи - LD (HL),A - INC HL - XOR A - LD (HL),A ;адресация от начала записи - 0 - INC HL - LD (HL),A ;будет приниматься номер записи - INC HL - LD (HL),A ;сектор переписывать - LD A,#7F ;загрузка аккумулятора - POP HL ;восстановление HL - RET ;возврат - -;Адрес #2242. Создание описателя канала для файла данных и подключение к нему потока. Установите #5CDB. - -x2242 PUSH AF ;сохранение результата поиска файла - CALL x220F ;берем адрес элемента таблицы STRMS, отвечающего за поток - EX DE,HL ;сохранение его - LD HL,(#5C53) ;вычисление относительного адреса нового - LD BC,(#5C4F) ;описателя канала - SBC HL,BC - EX DE,HL ;восстановление адреса элемента таблицы STRMS - LD (HL),E ;установка относительного адреса описателя - INC HL ;канала - LD (HL),D - CALL x22B2 ;создание описателя канала - LD A,(#5D09) ;берем способ открытия файла - CP #A5 ;это RND? - CALL Z,x222F ;если да, то инициализация признаков файла произвольного доступа - JR Z,x226B ;и установка признака способа открытия файла - LD A,(#5D09) ;берем способ открытия файла - CP "R" ;это R? - LD A,#FF ;если да, то признак способа открытия файла - - JR NZ,x226B ;#FF - XOR A ;иначе это 0 -x226B LD (HL),A ;установка признака способа открытия файла - POP AF - JP x2270 -x2270 PUSH AF - LD BC,#14 ;берем адрес фрагмента текста в описателе - ADD HL,BC ;канала минус 1 - PUSH HL ;сохраняем его - CALL x2423 ;вычисление адреса текущего сектора файла на диске - POP HL ;восстановление адреса фрагмента текста минус 1 - INC HL - LD B,1 ;загружать 1 сектоp - POP AF ;восстановление результата поиска файла - OR A ;был создан новый файл? - PUSH AF ;сохранение результата проверки - CALL NZ,x1E4D ;если был создан новый файл, то запись сектора - POP AF ;сохранение результата проверки - CALL Z,x1E3D ;если файл существовал, то загрузка файла - RET ;возврат - -;Адрес #2288. Создание нулевого блока файла данных. - -x2288 LD HL,(#5CD7) ;сохранение #5CD7 - PUSH HL - LD HL,#2000 ;блок 0 - LD (#5CD7),HL - CALL x229A ;создание блока - POP HL ;восстановление #5CD7 - LD (#5CD7),HL - RET ;возврат - -;Адрес #229A. Создание блока файла данных. Установите #5CD7 и #5CDB, #5CDD и #5CE5. - -x229A LD HL,#1000 ;длина блока - #1000 байтов - LD (#5CD9),HL - CALL x1AC4 ;проверка наличия свободного места на диске - CALL x1B59 ;запись файла - LD HL,0 ;заполнено 0 байтов - LD (#5CE8),HL - CALL x166B ;замена описателя блока - JP x1E43 ;перезапись сектора с описателем и возврат - -;Внимание!!! После записи сектора надо снова открыть канал файла данных, так как при ошибке открывается поток 0. - -;Адрес #22B2. Создание описателя канала и открытие потока. - -x22B2 LD HL,(#5C53) ;открытие потока - DEC HL - LD (#5C51),HL - PUSH HL ;сохранение адреса описателя канала - LD BC,#124 ;его длина - #124 байта - CALL x1E32 ;создание области для описателя канала - LD A,0 ;заполнять область нулями - LD B,0 ;длина области - #100 байтов -x22C4 LD (DE),A ;очистка байта - DEC DE ;следующий адрес - DJNZ x22C4 ;повтор до конца - POP HL ;восстановление адреса описателя канала - PUSH HL ;и снова сохранение - LD DE,x3D0E ;адрес подпрогpаммы вывода в канал - LD (HL),E - INC HL - LD (HL),D - INC HL - LD DE,x3D06 ;адрес подпрограммы ввода из канала - LD (HL),E - INC HL - LD (HL),D - INC HL - LD (HL),"D" ;имя канала - "D" - INC HL ;пропуск четырех байтов - INC HL - INC HL - INC HL - INC HL - LD (HL),#24 ;байт #24 - INC HL - LD (HL),1 ;байт 1 - INC HL - LD A,(#5CF6) ;номер дисковода - LD (HL),A - INC HL - LD A,(#5D1E) ;номер последнего блока файла - LD (HL),A - INC HL - LD A,(#5D09) ;файл открывается для чтения? - CP "R" - LD (HL),0 ;если да, то пройдено 0 байтов - JR Z,x22FC ;иначе количество пройденных байтов берем из - LD A,(#5CE8) ;поля длины записанной части файла - LD (HL),A -x22FC INC HL - LD (HL),B - JR Z,x2304 - LD A,(#5CE9) - LD (HL),A -x2304 INC HL - EX DE,HL ;сохранение адреса #F-го байта описателя канала - POP HL ;восстановление адреса описателя канала - PUSH DE - LD DE,#10 ;адрес #10-го байта описателя канала - ADD HL,DE - EX DE,HL - LD HL,#5CDD ;установка описателя файла - LD BC,#10 - LDIR - POP HL ;восстановление адреса #F-го байта описателя канала - RET ;возврат - -;Адpес #2317. Вычисление адреса текущего символа файла данных в описателе канала. Откройте поток, связанный с файлом данных. На выходе адрес символа будет в HL. - -x2317 LD C,#D ;адрес #D-го байта описателя канала - RST #28 - LD C,(HL) ;берем номер текущего символа в текущем секторе файла - RST #28 ;вычисление смещения до символа - LD BC,#24 ;текст начинается с #24-го байта описателя канала - ADD HL,BC ;вычисление адреса символа - RET ;возврат - -;Адрес #2321. Вычисление адреса фрагмента текста в описателе канала. Откройте поток, связанный с файлом данных. Используется также с адреса #2323 (вычисление адреса байта в описателе текущего канала; откройте канал и поместите номер байта в C; на выходе в HL будет адрес байта). - -x2321 LD C,#24 ;текст начинается с #24-го байта -x2323 LD B,0 ;перевод номера байта в 2-х байтный формат - LD HL,(#5C51) ;берем адрес описателя текущего канала - ADD HL,BC ;вычисление адреса байта - RET ;возврат - -;Адрес #232A. Проверка достижения конца сектора в описателе канала. Откройте поток, связанный с файлом данных. При достижении конца сектора будет загружен следующий. Если достигнут конец блока, а следующий отсутствует, то он будет создан. - -x232A LD C,#D ;адрес #D-го байта описателя канала - RST #28 - INC (HL) ;следующий байт - RET NZ ;если не конец сектора, то возврат - PUSH HL ;сохранение адреса #D-го байта описателя канала - CALL x2443 ;установка дисковода - CALL x23FC ;запись текущего сектора - POP HL ;восстановление адреса #D-го байта описателя канала - INC HL ;#E-ый байт - INC (HL) ;следующий сектор - PUSH HL ;сохранение адреса #E-го байта описателя канала - CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #E-го байта описателя канала - LD A,#10 ;в блоке 16 секторов - CP (HL) ;конец блока? - RET NZ ;если нет, то возврат - PUSH HL ;сохранение адреса #E-го байта описателя канала - LD C,#F ;#F-ый байт - RST #28 - LD A,(HL) ;файл прямого доступа? - CP #7F - POP HL ;восстановление адреса #E-го байта описателя канала - JR Z,x2358 ;если файл прямого доступа, то проверка наличия следующего блока - LD HL,(#5C51) ;берем адрес описателя канала - CALL x26E1 ;запись описателя блока - LD C,#E ;#E-ый байт - RST #28 - JP x2379 ;создание следующего блока файла -x2358 CALL x23CF ;поиск следующего блока файла - PUSH AF ;сохранение результата поиска - CALL Z,x2418 ;если блок найден, то загрузка сектора из блока - LD C,#E ;#E-ый байт - RST #28 - POP AF ;восстановление результата поиска блока - CALL NZ,x2370 ;если блок не был найден, то создание его - RET ;возврат - -;Адрес #2367. Помещение в D числа #20, в E - содержимого #19-го байта описателя канала и обнуление байта по адресу, помещенному в HL. Откройте нужный канал. - -x2367 LD (HL),0 ;обнуление байта - LD C,#19 ;берем адрес #19-го байта описателя канала - RST #28 - LD D,#20 ;помещение в регистр D числа #20 - LD E,(HL) ;помещение в E числа из #20-го байта описателя канала - RET ;возврат - -;Адрес #2370. Создание блока файла данных. Откройте поток, связанный с файлом данных. - -x2370 CALL x2367 ;берем номер создаваемого блока - LD (#5CD7),DE ;установка его - JR x2381 ;создание и возврат - -;Адрес #2379. Cоздание блока файла данных. Откройте поток, связанный с файлом данных, используется, также, с адреса #2381 (создание блока файла данных; установите #5CD7 и #5CDB, #5CDD и #5CE5). - -x2379 CALL x2367 ;берем номер текущего блока - INC E ;следующий блок - LD (#5CD7),DE ;установка номера блока -x2381 CALL x229A ;создание блока - CALL x2970 ;удаление буфера - -;Внимание!!! Если выполняется команда CAT# или LIST#, то буфеp удалять нельзя. - - LD C,#10 ;берем адрес #10-го байта описателя канала - RST #28 - EX DE,HL ;перенос его в DE - LD HL,#5CDD ;перенос описателя блока в описатель канала - LD BC,#10 - LDIR - LD C,#C ;#C-ый байт - RST #28 - LD A,(#5D1E) ;установка номера блока в каталоге - LD (HL),A - RET ;возврат - -;Адрес #239B. Проверка достижения конца сектора при чтении файла данных. Откройте поток, связанный с файлом данных. - -x239B LD C,#D ;адрес #10-го байта описателя канала - RST #28 - INC (HL) ;следующий байт сектора - RET NZ ;если не конец сектора, то возврат - INC HL ;#11-ый байт - INC (HL) ;следующий сектор - PUSH HL ;сохранение адреса #11-го байта описателя канала - CALL x2443 ;установка дисковода - LD C,#23 ;#23-ый байт - RST #28 - LD A,(HL) ;это 0? - OR A - JR Z,x23B6 ;если да, то сектор не переписывать - POP HL ;восстановление адреса #11-го байта описателя канала - PUSH HL ;и снова сохранение его - DEC (HL) ;восстановление номера текущего сектора - CALL x23FC ;запись сектора - POP HL ;восстановление адреса #11-го байта описателя канала - PUSH HL ;и снова сохранение его - INC (HL) ;следующий сектор -x23B6 CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #11-го байта описателя канала - LD A,#10 ;в блоке 16 секторов - CP (HL) ;конец блока? - CALL Z,x23C1 ;если да, то открытие следующего - RET ;возврат - -;Адрес #23C1. Открытие следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адрес #E-го байта описателя канала и установите #5D06. - -x23C1 CALL x23CF ;поиск следующего блока файла данных - PUSH AF ;сохранение результата поиска - CALL x2970 ;удаление буфера - -;Внимание!!! Hадо проверять #5D16, так как если выполняется команда CAT#, или LIST#, то буфер удалять нельзя. - - POP AF ;восстановление результата поиска блока - JP NZ,x2492 ;если блок не найден, то END OF FILE - JP x2418 ;загрузка сектора из блока - -;Адрес #23CF. Поиск следующего блока файла данных. Откройте поток, связанный с файлом данных, поместите в HL адpес #E-го байта описателя канала и установите #5D06. Если блок найден, то флаг Z будет включен, иначе выключен. - -x23CF LD (HL),0 ;номер текущего сектора - 0 - LD C,#19 ;#19-ый байт описателя потока - RST #28 - INC (HL) ;следующий блок - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x1CB3 ;поиск блока - -;Внимание!!! После поиска блока надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. - - RET NZ ;если блок не найден, то возврат - -;Адрес #23E4. Открытие блока. Номер блока в каталоге поместите в A. - -x23E4 CALL x165D ;чтение описателя блока - -;Внимание!!! После чтения описателя надо снова открывать поток, связанный с файлом данных, так как при дисковых ошибках открывается поток 0. - - LD C,#10 ;берем адрес #10-го байта описателя канала - RST #28 - EX DE,HL ;переброска его в DE - LD HL,#5CDD ;перенос описателя блока в описатель канала - LD BC,#10 - LDIR - LD C,#C ;#C-ый байт - RST #28 - LD A,(#5D1E) ;установка номера блока в каталоге - LD (HL),A - XOR A ;обнуление аккумулятора - RET ;возврат - -;Адрес #23FC. Запись текущего сектора файла данных. Откройте поток, связанный с файлом. - -x23FC CALL x2423 ;вычисление адреса текущего сектора файла на диске - CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала - LD B,1 ;записывать 1 сектор - CALL x1E4D ;запись сектора - -;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. - - LD C,#F ;#F-ый байт описателя канала - RST #28 - LD A,(HL) ;файл прямого доступа? - CP #7F - RET Z ;если да, то возврат - CALL x2321 ;вычисление адреса текущего фрагмента текста в описателе канала - XOR A ;сектор заполнять нулями - LD B,A ;длина его - #100 байтов -x2413 LD (HL),A ;очистка байта - INC HL ;следующий байт - DJNZ x2413 ;повтор до конца - RET ;возврат - -;Адрес #2418. Загрузка текущего сектора в описатель канала. Откройте поток, связанный с файлом данных. - -x2418 CALL x2423 ;вычисление адреса текущего сектора на диске - CALL x2321 ;вычисление адреса сектора в описателе канала - LD B,1 ;загружать 1 сектор - JP x1E3D ;загрузка сектора и возврат - -;Внимание!!! После загрузки сектора надо снова открывать канал, связанный с файлом данных, так как при ошибках открывается поток 0. - -;Адрес #2423. Вычисление адреса текущего сектора файла на диске. Откройте поток, связанный с файлом данных. На выходе в DE будет адрес сектора на диске. - -x2423 LD HL,(#5C51) ;берем адрес #1E-го байта описателя канала - LD BC,#1E - ADD HL,BC - LD E,(HL) ;берем адрес файла на диске - INC HL - LD D,(HL) - LD C,#E ;#E-ый байт - RST #28 - LD B,(HL) ;берем номер текущего сектора файла - DEC B ;он равен 0? - INC B - PUSH AF ;сохранение AF - LD A,#10 ;на дорожке #10 секторов - JR Z,x2441 ;если номер текущего сектора файла pавен 0, то выход -x2438 INC E ;следующий сектор - CP E ;конец дорожки? - JR NZ,x243F ;если да, то - LD E,0 ;сектор 0 - INC D ;и следующая дорожка -x243F DJNZ x2438 ;повтор до конца -x2441 POP AF ;восстановление AF - RET ;возврат - -;Адрес #2443. Установка дисковода для операций с файлом данных. Откройте поток, связанный с файлом. - -x2443 LD C,#B ;берем адрес #B-го байта описателя канала - RST #28 - LD A,(HL) ;берем номер дисковода, на котором находится файл - JP x3DCB ;выбор дисковода - -;Адрес #244A. Вывод символа в файл данных. Символ поместите в аккумулятор и откройте поток, связанный с файлом. - -x244A LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD HL,x20F1 ;адрес подпрограммы изменения памяти - PUSH HL ;помещение его на стек - PUSH AF ;сохранение символа - CALL x20F1 ;изменение памяти - LD A,#A ;файл искать по #A байтам описателя - LD (#5D06),A - POP AF ;восстановление символа - CALL x24A2 ;работа с файлом прямого доступа - PUSH AF ;сохранение символа - CALL x2650 ;файл открывался для чтения? - JP Z,x249E ;если да, то ошибка - POP AF ;восстановление символа - CALL x2317 ;вычисление адреса текущего символа в текущем секторе - LD (HL),A ;запись символа - JP x232A ;проверка достижения конца сектора в описателе канала - -;Адрес #246E. Проверка достижения конца блока. Используется также с адресов: -;#2492 - обработка ошибки END OF FILE через ПЗУ бейсика. -;#2494 - обработка ошибок через ПЗУ бейсика. Код ошибки поместите в аккумулятор. - -x246E LD C,#D ;берем адрес #D-го байта описателя канала - RST #28 - LD A,(HL) ;берем младший байт длины пройденной части файла - LD BC,#E ;#1B-й байт - ADD HL,BC - CP (HL) ;сравнение младших байтов длин пройденной и записанной частей блока - RET NZ ;если они не равны, то возврат - LD C,#E ;аналогично со старшими байтами - RST #28 - LD A,(HL) - LD BC,#E - ADD HL,BC - CP (HL) - RET NZ - LD HL,#5CB6 ;адрес переменной разpешения изменения памяти - LD A,(HL) ;берем ее значение - CP #F4 ;интерфейс-1 есть? - JR Z,x2492 ;если нет, то ошибка - BIT 4,(HL) ;выполняется команда LOAD интерфейса-1? - JR Z,x2492 ;если да, то ошибка - OR 1 ;сброс флага C - POP HL ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x2492 LD A,7 ;код ошибки END OF FILE -x2494 LD (#5C3A),A ;установка кода ошибки - CALL x20E5 ;изменение памяти - RST #20 ;обработка ошибки - DW #0058 - -;Адрес #249D. Команда RET. - -x249D RET - -;Адрес #249E. Обработка ошибки INVALID I/O DEVICE через ПЗУ бейсика. - -x249E LD A,#17 ;код ошибки - #17 - JR x2494 ;обработка ошибки чеpез ПЗУ бейсика - -;Адрес #24A2. Работа с файлом произвольного доступа. Очередной символ поместите в A и откройте поток, связанный с файлом данных. Если окончен прием записи или файл последовательного доступа, то происходит простой возврат, иначе происходит возврат из программы, вызвавшей эту подпрограмму. - -x24A2 LD D,A ;сохранение символа - LD C,#F ;берем адрес #D-го байта описателя канала - RST #28 - LD A,(HL) ;файл произвольного доступа? - CP #7F - LD A,D ;восстановление символа - RET NZ ;если файл произвольного доступа, то возврат - LD BC,#13 ;#22-ый байт - ADD HL,BC - LD A,(HL) ;принимаем номер записи? - OR A - LD A,D ;восстановление символа - JR NZ,x24D5 ;если номер записи принят, то запись символа - DEC HL ;#21-ий байт - LD A,(HL) ;это 0? - OR A - JR NZ,x24C2 ;если нет, то рабочая область уже есть - PUSH BC ;сохранение числа #13, - PUSH HL ;адреса #21-го байта описателя канала и - PUSH DE ;символа - CALL x24F8 ;выделение #10 байтов в рабочей области - POP DE ;восстановление символа, - POP HL ;адреса #21-го байта описателя канала и - POP BC ;числа #13 -x24C2 LD C,(HL) ;берем относительный адрес символа - LD A,D ;восстановление символа - EX DE,HL - LD HL,(#5CCF) ;берем адрес рабочей области - ADD HL,BC ;вычисление адреса для символа - CP 6 ;символ CHR$ 6? - LD (HL),A ;помещение символа в рабочую область - CALL Z,x2504 ;если символ CHR$ 6, то номер записи принят - LD C,#21 ;#21-ий байт - RST #28 - INC (HL) ;записали 1 символ - POP HL ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x24D5 DEC HL ;#21-ий байт - LD A,(HL) ;берем относительный адрес символа - DEC HL ;#20-й байт - INC A ;место для символа ENTER - CP (HL) ;конец записи? - INC HL ;#21-ий байт - INC (HL) ;записали 1 символ - PUSH HL ;сохранение адреса #21-го байта описателя - PUSH AF ;канала и результата проверки наличия места для символа - LD C,#23 ;#23-ый байт - RST #28 - LD (HL),#FF ;сектор переписывать - POP AF ;восстановление результата проверки наличия места - POP HL ;для символа и адреса #21-го байта описателя канала - JR C,x24EE ;если места для символа нет, то следующая запись - LD A,D ;восстановление символа - CP #D ;это ENTER? - JR Z,x24F2 ;если да, то следующая запись - POP BC ;снятие со стека адреса возврата - RET ;возврат по следующему адресу -x24EE LD A,D ;восстановление символа - CP #D ;это ENTER? - RET NZ ;если нет, то возврат -x24F2 XOR A ;относительный адрес символа - 0 - LD (HL),A - INC HL ;#22-ый байт - LD (HL),A ;будем принимать номер записи - LD A,D ;восстановление символа - RET ;возврат - -;Адрес #24F8. Выделение #10 байтов в рабочей области памяти. Устанавливает #5CCF. - -x24F8 LD HL,(#5C61) ;берем адрес рабочей области памяти - LD (#5CCF),HL ;установка его - LD BC,#10 ;выделять #10 байтов - JP x1E23 ;выделение области и возврат - -;Адpес #2504. Обработка номера записи. Поместите в память номер записи в виде текста и поместите его адрес в #5CCF, а в HL поместите адрес последнего символа номера записи плюс 1. - -x2504 LD (HL),#D ;конец строки - LD HL,(#5C5D) ;сохранение CH_ADD - LD (#5CD7),HL - LD HL,(#5CCF) ;установка CH_ADD на номер записи - LD (#5C5D),HL - LD HL,#5C3B ;проверка на синтаксис - RES 7,(HL) - CALL x1DC1 ;перевод числа в 5-байтную форму - LD HL,#5C3B ;выполнение - SET 7,(HL) - LD HL,(#5CCF) ;установка CH_ADD на номер записи - LD (#5C5D),HL - CALL x1DC1 ;прием числа на стек калькулятора - CALL x1DB9 ;снятие его оттуда - PUSH BC ;перенос его в DE - POP DE - LD C,#20 ;берем адрес #D-го байта описателя канала - RST #28 - LD B,(HL) ;берем длину записи - XOR A - LD HL,0 ;вычисление относительного адреса записи в - LD (#5CDB),HL ;секторе, номера сектора и номера блока -x2538 ADD HL,DE ;извините, не понял, как это pаботает - JR NC,x2544 - PUSH HL - LD HL,(#5CDB) - INC HL - LD (#5CDB),HL - POP HL -x2544 DJNZ x2538 - LD (#5CD9),HL - LD A,(#5CDB) ;в блоке всего 16 секторов - LD HL,#5CDA - RRD - AND #F - LD (#5CDB),A - LD HL,(#5CD7) ;восстановление CH_ADD - LD (#5C5D),HL - CALL x2568 ;открытие записи - LD C,#21 ;#21-ий байт - RST #28 - LD A,#FF ;относительный адрес текущего символа будет 0 - LD (HL),A - INC HL ;#22-ый байт - LD (HL),A ;номер записи принят - RET ;возврат - -;Адрес #2568. Открытие записи. Установите #5CD7, #5CD9 и #5CDB. - -x2568 LD C,#19 ;берем адрес #19-го байта описателя канала - RST #28 - LD A,(#5CDA) ;берем номер открываемого блока - CP (HL) ;блок уже открыт? - JP NZ,x2584 ;если нет, то открытие блока - LD C,#E ;#E-ый байт - RST #28 - LD A,(#5CDB) ;берем номер сектора в открываемом блоке - CP (HL) ;сектор уже считан? - JP NZ,x25A7 ;если нет, то загрузка сектора -x257C LD C,#D ;#D-ый байт - RST #28 - LD A,(#5CD9) ;берем относительный адрес открываемой записи - LD (HL),A ;установка его - RET ;возврат -x2584 CALL x25CA ;проверка и обнуление #23-го байта - CALL NZ,x25C3 ;если надо, то запись сектора - LD A,(#5CDA) ;берем номер открываемого блока - LD C,#19 ;#19-ый байт - RST #28 - LD (HL),A ;установка номера блока - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x1CB3 ;поиск блока - -;Ошибка!!! После поиска файла надо снова открывать канал файла данных, так как при ошибке будет открыт поток 0. - - JP NZ,x25D2 ;если блок не найден, то создание блока - CALL x23E4 ;открытие блока - JR x25AD ;загрузка сектора из блока -x25A7 CALL x25CA ;проверка и обнуление #23-го байта - CALL NZ,x25C3 ;если надо, то запись сектора -x25AD LD A,(#5CDB) ;берем номер считываемого сектора - LD C,#E ;#E-ый байт - RST #28 - LD (HL),A ;установка номера сектора - PUSH HL ;сохранение адреса #E-го байта - CALL x2443 ;установка дисковода - CALL x2418 ;загрузка сектора - POP HL ;восстановление адреса #E-го байта - DEC HL ;#D-ый байт - LD A,(#5CD9) ;установка относительного адреса открываемой - LD (HL),A ;записи - JR x257C ;выход - -;Адрес #25C3. Запись текущего сектора. Откройте канал файла данных. - -x25C3 CALL x2443 ;установка дисковода - CALL x23FC ;запись сектора - RET ;возврат - -;Адрес #25CA. Проверка и обнуление #23-го байта описателя канала. Соответственно содержимому будет установлен флаг Z, а само содержимое будет в аккумуляторе. Откройте нужный канал. - -x25CA LD C,#23 ;берем адрес #23-го байта описателя канала - RST #28 - LD A,(HL) ;берем его содержимое - OR A ;проверка его - LD (HL),0 ;обнуление байта - RET ;возврат - -;Адрес #25D2. Создание блока файла данных. Установите #5CD7, #5CD9 и #5CDB. - -x25D2 LD HL,(#5CDA) ;берем номер блока - LD H,#20 - LD (#5CD7),HL ;установка его - LD HL,(#5CD9) ;сохранение относительного адреса открываемой - PUSH HL ;записи - LD HL,(#5CDB) ;и номера сектора - PUSH HL - CALL x2381 ;создание блока - POP HL ;восстановление номера сектора - LD (#5CDB),HL - POP HL ;и относительного адреса открываемой записи - LD (#5CD9),HL - JR x25AD ;загрузка сектора из блока - -;Адрес #25EF. Ввод из файла данных. Откройте поток, связанный с файлом данных. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает символ из файла в A. - -x25EF CALL x20F1 ;изменение памяти - LD HL,#5C3C ;pежим не менялся - RES 3,(HL) - LD HL,(#5C3D) ;берем адрес подпрограммы обработки ошибок - LD E,(HL) - INC HL - LD D,(HL) - OR A ;он pавен #107F? - LD HL,#107F - SBC HL,DE - JR NZ,x2626 ;если нет, то подпрограмма вызвана не из редактора - LD SP,(#5C3D) ;очистка стека редактора - POP DE ;снятие адреса подпрограммы обработки ошибок - POP DE ;восстановление адреса дна стека - LD (#5C3D),DE ;установка его -x260F CALL x262B ;ввод символа из файла - JR C,x261D ;если был введен символ, то посылка его в буфер редактора -x2614 LD HL,#5CC2 ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD HL,x20E5 ;адрес подпрограммы удаления буфера и изменения памяти - PUSH HL ;помещение его на стек - RET ;изменение памяти и возврат -x261D CP #D ;символ ENTER? - JR Z,x2614 ;если да, то выход - RST #20 ;ввод символа в буфер редактора - DW #0F85 - JR x260F ;повтор -x2626 CALL x262B ;ввод символа из файла - JR x2614 ;возврат - -;Адрес #262B. Ввод байта из файла данных. На выходе байт будет в аккумуляторе. Откройте поток, связанный с файлом данных. - -x262B LD A,#A ;файл искать по 10 байтам описателя - LD (#5D06),A - CALL x2650 ;файл открыт для чтения? - JR Z,x2642 ;если да, то - CP #7F ;файл произвольного доступа? - JP NZ,x249E ;если нет, то ошибка - LD BC,#13 ;берем адрес #22-го байта описателя канала - ADD HL,BC - LD (HL),0 ;подпрограмма вывода будет принимать номер записи - JR x2645 -x2642 CALL x246E -x2645 CALL x2317 ;вычисление адреса текущего символа - LD A,(HL) ;берем этот символ - PUSH AF ;сохраняем его - CALL x239B ;проверка достижения конца сектора - POP AF ;восстановление символа - SCF ;был введен символ - RET ;возврат - -;Адрес #2650. Проверка #F-го байта описателя текущего канала. Соответственно его содержимому установится флаг Z, а само содержимое будет в регистре A. - -x2650 LD C,#F ;берем адрес #F-го байта описателя канала - RST #28 - LD A,(HL) ;берем этот байт - OR A ;проверка его на 0 - RET ;возврат - -;Адрес #2656. Выполнение команды CLOSE#. Установите #5D11 и #5C3B. - -x2656 LD HL,(#5D11) ;установка CH_ADD - LD (#5C5D),HL - CALL x1E0B ;прием номера потока - CALL x1D75 ;если идет проверка на синтаксис, то возврат - LD A,(#5CDB) ;берем номер потока - RST #20 ;берем относительный адрес описателя канала - DW #1727 - LD A,B ;поток закрыт? - OR C - JP Z,x01D3 ;если да, то завершение - PUSH HL ;сохранение адреса элемента STRMS - LD HL,(#5C4F) ;берем адрес области описателей каналов - ADD HL,BC ;вычисляем адрес первого байта описателя канала - LD A,(HL) ;берем старший байт адреса подпрограммы вывода - LD HL,x3D0E ;он равен #3D? - CP H - POP HL ;восстановление адреса элемента STRMS - JP NZ,x2228 ;если старший байт адреса подпрограммы вывода не равен #3D, то сообщение NOT DISC FILE Дурацкая проверка!!! Мало ли что может изменить пользователь! - LD (HL),0 ;закрытие потока - INC HL - LD (HL),0 - LD (#5CD9),BC ;сохранение относительного адреса описателя канала - LD HL,(#5C4F) ;вычисление адреса описателя канала - ADD HL,BC - DEC HL - LD (#5CD7),HL ;сохранение его - CALL x26CE ;запись остатка файла, если нужно - LD HL,(#5CD7) ;восстановление адреса описателя канала - LD BC,#124 ;его длина - #124 байта - CALL x1E2E ;уничтожение области описателя канала - LD HL,#5C10 ;берем начало таблицы STRMS - LD B,#10 ;всего 16 потоков -x269D PUSH BC ;сохранение количества потоков - LD BC,(#5CD9) ;берем относительный адрес описателя канала - LD E,(HL) ;берем адрес из таблицы - INC HL - LD D,(HL) - EX DE,HL ;переносим его в HL - SBC HL,BC ;он меньше нашего адреса? - EX DE,HL ;переброска его в DE - JR C,x26BC ;если он меньше нашего адреса, то следующий элемент - LD D,(HL) ;снова берем адрес из таблицы - DEC HL - LD E,(HL) - INC HL - PUSH HL ;сохранение адреса текущего элемента таблицы - EX DE,HL ;переброска адреса из таблицы в HL - LD BC,#124 ;коррекция адреса - SBC HL,BC - EX DE,HL ;перенос его в DE - POP HL ;восстановление адреса текущего элемента таблицы - LD (HL),D ;установка нового адреса - DEC HL - LD (HL),E - INC HL -x26BC INC HL ;следующий элемент - POP BC ;восстановление количества элементов - DJNZ x269D ;повтор до конца - LD HL,(#5D11) ;коррекция адреса командной строки - LD BC,#124 - SBC HL,BC - LD (#5D11),HL - JP x01D3 ;завершение - -;Адрес #26CE. Запись текущего сектора файла данных. При записи открывает поток, связанный с файлом. Поместите в HL и #5CD7 адрес описателя канала. - -x26CE LD BC,#F ;берем адрес #F-го байта описателя канала - ADD HL,BC - LD A,(HL) ;файл открывался для чтения? - OR A - RET Z ;если да, то возврат - LD HL,(#5CD7) ;открытие потока - LD (#5C51),HL - CALL x26E1 ;запись описателя блока - JP x23FC ;запись текущего сектора и возврат - -;Адpес #26E1. Запись описателя текущего блока файла данных. Откройте поток, связанный с файлом данных и поместите в HL адрес описателя канала. - -x26E1 LD BC,#D ;берем адрес #D-го байта описателя канала - ADD HL,BC - LD E,(HL) ;берем длину пройденной части блока - INC HL - LD D,(HL) - LD BC,#D ;берем адрес #1A-го байта описателя канала - ADD HL,BC - LD (HL),E ;установка длины записанной части блока - INC HL - LD (HL),D - LD C,#10 ;#10-ый байт - RST #28 - LD DE,#5CDD ;установка описателя блока - LD BC,#10 - LDIR - CALL x2443 ;установка дисковода - LD C,#C ;#C-ый байт - RST #28 - LD C,(HL) ;берем номер блока в каталоге - CALL x166B ;замена описателя блока - JP x1E43 ;запись сектора с описателем и возврат - -;Внимание!!! После записи сектора надо снова открывать поток, связанный с файлом данных, так как при дисковой ошибке открывается поток 0. - -;Адрес #2707. Печать строки. В HL поместите ее начало. Последний символ должен быть либо CHR$ 0, либо с поднятым седьмым битом. - -x2707 LD A,(HL) ;берем символ из строки - OR A ;это CHR$ 0? - RET Z ;если да, то возврат - AND #7F ;сброс бита 7 - RST #10 ;печать символа - BIT 7,(HL) ;бит 7 установлен? - RET NZ ;если да, то возврат - INC HL ;берем адрес следующего символа - JR x2707 ;повтор - -;Адрес #2713. Сравнение областей памяти. В HL и DE поместите начала сравниваемых областей, а в B - их длину. При несовпадении флаг Z сброшен, иначе включен. - -x2713 LD A,(DE) ;сравнение байтов из областей - CP (HL) - RET NZ ;если они не совпали, то возврат - INC DE ;следующие байты - INC HL - DJNZ x2713 ;повтор до конца - RET ;возврат - -;Адрес #271B. Обработка ошибки NO DISC без установки TAPE LOADING ERROR. - -x271B LD HL,x27FC ;адрес сообщения NO DISC - LD A,6 ;код ошибки - 6 - JP x1C4A ;обработка ошибки - -;Адрес #2723. Обработка ошибки DIRECTORY FULL. - -x2723 LD HL,x27ED ;адрес сообщения DIRECTORY FULL - LD A,4 ;код ошибки - 4 - JP x1C4A ;обработка ошибки - -;Адрес #272B. Установка кода ошибки TAPE LOADING ERROR для ПЗУ бейсика. - -x272B LD A,#1A ;код ошибки TAPE LOADING ERROR - JR x2731 ;установка кода ошибки - -;Адрес #272F. Установка кода ошибки INVALID I/O DEVICE для ПЗУ бейсика. Используется также с адреса: -;#2731 (установка кода ошибки для пзу бейсика; код ошибки поместите в A). - -x272F LD A,#12 ;код ошибки INVALID I/O DEVICE -x2731 LD (#5C3A),A ;установка кода ошибки - RET ;возврат - -;Адрес #2735. Установка кода ошибки OUT OF MEMORY для ПЗУ бейсика. - -x2735 LD A,3 ;код ошибки OUT IF RAM - JR x2731 ;установка кода ошибки - -;Адрес #2739. Проверка дорожки. В регистре D задайте физический номер дорожки. По окончании в #5CD6 получите число битых секторов на дорожке. - -x2739 XOR A ;дорожку проверять - LD (#5CD8),A - LD (#5CD6),A ;дефектных секторов пока не нашли - IN A,(#1F) ;сохраним состояние контроллера дисководов - LD (#5CCD),A - LD E,D ;перегрузка номера дорожки в E - PUSH DE ;сохранение номера дорожки - LD A,E ;помещение номера дорожки в регистр данных - OUT (#7F),A - LD A,#18 ;позиционирование - CALL x3D9A - LD A,(#5CCD) ;берем состояние контроллера до операции - AND #80 ;дисковод был готов? - CALL NZ,x3EA0 ;если нет, то задержка в 3135098 тактов - POP DE ;восстановление номера дорожки - CALL x207D ;проверка дорожки - LD A,(#5CD6) ;битых секторов нет? - OR A - RET Z ;если да, то возврат - LD A,7 ;дисковая ошибка - LD (#5D0F),A - RET ;возврат - -;Адрес #2766. Сообщения TR-DOS. - -x2766 DB "O.K." - DB 0 -x276B DB "Verify Error." - DB #8D -x2779 DB "BACKUP DISK" - DB #8D -x2785 DB "Insert Destination disk" - DB #D - DB "then press Y" - DB 0 -x27AA DB "Insert Source disk then press Y" - DB 0 -x27CA DB "*BREAK*" - DB #8D -x27D2 DB "Out of RAM" - DB #8D -x27DD DB "Array not found" - DB #8D -x27ED DB "Directory full" - DB #8D -x27FC DB "No disk" - DB #8D -x2804 DB "Stream opened" - DB #8D -x2812 DB "Not disk file" - DB #8D -x2820 DB "File exists" - DB #D - DB "Over write?(Y/N" - -x283B XOR C - -;Адрес #283C. Вызов подпрограмм TR-DOS из машинного кода. Вход: в регистре C код команды, остальное согласно описанию. На выходе в регистре BC код ошибки. - -x283C PUSH AF ;сохранение регистров - PUSH BC - LD (#5D04),DE - LD (#5D02),HL - CALL x20F1 ;если нужно, то изменение памяти - LD A,#FF - LD (#5D15),A ;сообщения не печатать - LD (#5D1F),A ;команда поступила из машинного кода - POP BC ;восстановление BC и AF - POP AF - LD HL,#201 ;по возврату пойдем в подпрограмму возврата в - LD (#5D1A),HL ;бейсик - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#5D1C),HL - DEC HL ;резервирование места для адреса возврата по - DEC HL ;ошибке из подпрограмм бейсика - LD SP,HL - PUSH AF ;сохранение AF - CALL x021D ;установка адреса возврата по ошибке из бейсика - LD HL,x288C ;берем адрес начала таблицы команд -x2869 LD A,(HL) ;берем код команды - CP C ;он совпал с требуемым? - JR NZ,x287F ;если нет, то берем код следующей команды - POP AF ;восстановление AF - INC HL ;берем адрес, по которому находится адрес подпрограммы - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - LD HL,x01D3 ;берем адрес подпрограммы завершения - PUSH HL ;кладем его на стек - PUSH DE ;кладем на стек адрес подпрограммы - LD HL,(#5D02) ;восстановление HL и DE - LD DE,(#5D04) - RET ;переход к подпрограмме -x287F CP #FF ;достигнут конец таблицы? - JR NZ,x2887 ;если нет, то берем адрес номера следующей подпрограммы - POP AF ;снятие AF со стека (этого можно было не делать) - JP x01D3 ;переход на подпрограмму завершения -x2887 INC HL ;пропуск двух байтов адреса подпрограммы - INC HL - INC HL - JR x2869 ;повтор - -x288C DB 0 ;таблица номеров и адресов подпрограмм - DW x08A7 ;new было x3D98 - DB 1 - DW x3DCB - DB 2 - DW x3E63 - DB 3 - DW x3F02 - DB 4 - DW x3F06 - DB 5 - DW x1E3D - DB 6 - DW x1E4D - DB 7 - DW x28D8 - DB 8 - DW x165C - DB 9 - DW x1664 - DB #A - DW x1CF0 - DB #B - DW x28FB - DB #C - DW x28F2 - DB #D - DW x01D3 - DB #E - DW x290F - DB #F - DW x01D3 - DB #10 - DW x01D3 - DB #11 - DW x01D3 - DB #12 - DW x2926 - DB #13 - DW x28E0 - DB #14 - DW x28E3 - DB #15 - DW x2739 - DB #16 - DW x1FEB - DB #17 - DW x1FF6 - DB #18 - DW x0405 - DB #FF ;признак конца таблицы - -;Адрес #28D8. Выдача каталога диска с настройкой. На входе в A задайте номер потока, в который будете выводить каталог. - -x28D8 PUSH AF ;сохранение номера потока - CALL x0405 ;настройка на диск - POP AF ;восстановление номера потока - JP x0479 ;вывод каталога - -;Адрес #28E0. Перемещение описателя файла из памяти в #5CDD. В HL задайте адрес описателя файла в памяти. - -x28E0 XOR A ;перемещаем из (HL) в #5CDD - JR x28E5 ;перемещение описателя - -;Адрес #28E3. Перемещение описателя файла из #5CDD в память по адресу, установленному в HL. Используется также с адреса #28E5 (перемещение описателя файла, в HL - адрес описателя в памяти, в A - направление перемещения: 0 - из памяти, иначе - в память). - -x28E3 LD A,#FF ;перемещаем в память -x28E5 LD DE,#5CDD ;установка второго адреса для LDIR - LD BC,#10 ;установка длины описателя - OR A ;установка направления перемещения - JR Z,x28EF - EX DE,HL -x28EF LDIR ;перемещение описателя файла - RET ;возврат - -;Адрес #28F2. Запись программы на бейсике. Установите #5CD1, #5CDD и #5CE5. - -x28F2 CALL x0405 ;настройка на диск - CALL x1AC4 ;проверка свободного места в каталоге - JP x1B27 ;запись программы - -;Адрес #28FB. Запись файла. Имя с расширением поместите в #5CDD, длину в DE, начало в HL. - -x28FB LD (#5CD7),HL ;установка начала - LD (#5CD9),DE ;установка действительной длины файла - LD (#5CDB),DE ;установка длины файла для каталога - CALL x0405 ;настройка на диск - CALL x1AC4 ;проверка наличия свободного места в каталоге - JP x1B53 ;запись файла - -;Адрес #290F. Загрузка/верификация файла а также чтение/запись сектора файла. Установите #5CDD, #5CE5, #5CD7 (только для чтения/записи сектора) и #5CF9; в A поместите флаг загрузки согласно описанию команды #E в HL и DE - старт и длину (в зависимости от аккумулятора). - -x290F OR A - LD (#5CD6),A ;установка флага загрузки - LD (#5CD9),HL ;установка адреса загрузки - LD (#5CDB),DE ;установка длины загрузки - CALL x1CB3 ;поиск файла - CALL x18A4 ;если файл найден, то чтение его описателя - CALL x18AB ;обработка параметров загрузки - JP x1921 ;загрузка файла - -;Адрес #2926. Стирание файла. Установите #5CDD и #5CE5. На выходе будут установлены #5D07 и #5D08. - -x2926 CALL x0405 ;настройка на диск - CALL x1CB3 ;поиск файла - JP x07A0 ;стирание его - -;Адрес #292F. Проверка наличия файла. Имя поместите на стек калькулятора и установите #5D06. Если файл найден, то в рег. C и в #5D1E и будет включен флаг Z, иначе флаг Z будет сброшен, а в C будет #FF. - -x292F CALL x1C57 ;установка имени файла - CALL x0405 ;настройка на диск - JP x1CB3 ;поиск файла и возврат - -;Адрес #2938. Печать имени файла с расширением. В HL установите адрес имени с расширением. - -x2938 PUSH BC ;сохранение BC - LD B,8 ;в имени файла 8 символов -x293B LD A,(HL) ;берем символ из имени файла - RST #10 ;печать его - INC HL ;адрес следующего символа - DJNZ x293B ;повтор до конца - LD A,"<" ;печать "<" - RST #10 - LD A,(HL) ;печать расширения - RST #10 - LD A,">" ;печать ">" - RST #10 - POP BC ;восстановление BC - RET ;возврат - -;Адрес #294A. Создание буфера, если его нет. Установите #5D0C. - -x294A PUSH HL ;сохранение регистров - PUSH DE - PUSH BC - PUSH AF - LD HL,#5D0C ;буфер есть? - LD A,(HL) - OR A - JR Z,x2992 ;если да, то восстановление регистров и возврат - PUSH HL ;сохранение адреса флага наличия буфера - LD BC,#101 ;длина буфера - PUSH BC ;сохранение ее - CALL x19FD ;проверка возможности выделения буфера - POP BC ;восстановление длины буфера - POP HL ;восстановление адреса его флага - LD (HL),0 ;буфер есть - LD HL,#5D25 ;начало буфера - CALL x1E32 ;выделение буфера - LD HL,(#5D11) ;командная строка переместилась на #101 байтов - LD BC,#101 - ADD HL,BC - JR x298F ;установка нового адреса командной строки и возврат - -;Адрес #2970. Удаление буфера, если он есть. Установите #5D0C. Используется также с адресов #298F и #2992 подпрограммой #294A. - -x2970 PUSH HL ;сохранение регистров - PUSH DE - PUSH BC - PUSH AF - LD HL,#5D0C ;буфера нет? - LD A,(HL) - OR A - JR NZ,x2992 ;если да, то возврат - LD (HL),#FF ;буфера нет - LD HL,#5D25 ;начало буфера - LD BC,#101 ;его длина - CALL x1E2E ;удаление области памяти - OR A ;командная строка переместилась на #101 байтов - LD BC,#101 ;надо поменять ее адрес - LD HL,(#5D11) - SBC HL,BC -x298F LD (#5D11),HL -x2992 POP AF ;восстановление регистров - POP BC - POP DE - POP HL - RET ;возврат - -;Адрес #2997. Выполнение команды "40". Установите #5D11 и #5C3B. Используется также с адреса: -;#2998 (выполнение команды установки типа дисковода; установите все для #2997 плюс в A тип дисковода). - -x2997 XOR A ;дисковод 40-дорожечный односторонний - -;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. - -x2998 LD (#5CD7),A ;сохранение типа дисковода - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x042B ;проверка второго символа строки - JP Z,x1D1A ;если это ENTER, то *ERROR* - CALL x3E11 ;берем адрес ячейки с типом дисковода - LD A,(#5CD7) ;установка типа дисковода - LD (HL),A - JP x03E1 ;сообщение O.K. - -;Адрес #29AE. Выполнение команды "80". Установите #5D11 и #5C3B. - -x29AE LD A,#80 ;дисковод 80-дорожечный односторонний - -;Ошибка!!! Во-первых, почему дисковод односторонний?; во-вторых, надо проверять возможность использования дисковода в требуемом режиме. - - JR x2998 ;выполнение команды - -;Адрес #29B2. Тексты сообщений TR-DOS. - -x29B2 DB #D - DB "*ERROR*" - DB #8D -x29BB DB #D - DB "No space" - DB #8D -x29C5 DB #D - DB "File exists" - DB #8D -x29D2 DB " Free" - DB #8D -x29D8 DB #D - DB "Read Onl" - DB #F9 -x29E2 DB #D - DB "Disc Erro" - DB #F2 -x29ED DB #D - DB "Rec. O/" - DB #C6 -x29F7 DB "Title:" - DB #A0 -x29FE DB #D - DB "Retry,Abort,Ignore?" - DB 0 -x2A13 DB #D - DB "Trk" - DB #A0 -x2A18 DB " sec" - DB #A0 -x2A1D DB " Del. File" - DB #8D -x2A28 DB #D - DB "No" -x2A2B DB " File(s)" - DB #8D,#00 - -;Адрес #2A35. Перенос подпрограммы определение текущего ПЗУ по адресу #4080. - -x2A35 LD HL,x2A41 ;адрес подпрограммы определение текущего ПЗУ - LD DE,#4080 ;ее адрес в ОЗУ - LD BC,#20 ;ее длина - #20 байта - LDIR ;перенос подпрограммы - RET ;возврат - -;Адрес #2A41. Подпрограмма определения текущего ПЗУ. Устанавливает #5C01 и подключает ПЗУ 48-го бейсика. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. Можно использовать также с адреса: -;#2A53 для прямого вывода в любой порт. - -x2A41 LD A,(#3B5) ;берем байт из ПЗУ - CP #F3 ;это #F3? - LD A,#10 ;если да, то это ПЗУ 48-го бейсика - JR Z,x2A4B - XOR A ;иначе это ПЗУ 128-го бейсика -x2A4B LD (#5C01),A ;установка номера ПЗУ - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,#10 ;ПЗУ 48-го бейсика -x2A53 OUT (C),A ;установка ПЗУ - RET ;возврат - -;Адрес #2A56. Запись памяти на диск. - -x2A56 jp x0807 ;new -; PUSH AF ;сохранение регистров -; PUSH BC -; PUSH DE -x2A59 PUSH HL - PUSH IX - PUSH IY - EXX - PUSH BC - PUSH DE - PUSH HL - EX AF,AF' - PUSH AF - LD A,I - PUSH AF - LD A,R - PUSH AF - LD HL,0 - ADD HL,SP ;сохранение SP - PUSH HL - LD A,#3C ;выбор дисковода A и верхней стороны диска - OUT (#FF),A - LD A,#3F ;установка регистра I - LD I,A - IN A,(#1F) ;берем состояние контроллера - AND #80 - RRCA - RRCA - RRCA - LD (#5C01),A ;сохранение его - -;Ошибка!!! Нельзя портить память. - - CALL x2F65 ;восстановление - CALL x3EA0 ;задержка в 3135098 тактов - CALL x3EA0 ;еще раз - LD DE,#A ;сектор #A - LD HL,#4000 ;записывать с адреса #4000 - PUSH HL ;сохранение числа #4000 - CALL x2D73 ;запись сектора - LD HL,#4100 ;записывать с адреса #4100 - LD DE,#B ;сектор #B - CALL x2D73 ;запись сектора - POP HL ;восстановление числа #4000 - PUSH HL ;и снова сохранение - LD DE,8 ;сектор 8 - CALL x2F1B ;загрузка сектора - LD HL,#40E3 ;берем тип диска - LD A,(HL) - LD (#5C00),A ;сохраняем его - -;Ошибка!!! Опять порча памяти. - - INC HL ;берем количество файлов на диске - LD A,(HL) - INC (HL) ;записали еще 1 файл - -;Внимание!!! Не проверяется наличие свободного места в каталоге диска. - - INC HL ;берем количество свободного места на диске - LD E,(HL) - INC HL - LD D,(HL) - OR A ;сброс флага C - EX DE,HL - LD DE,#C0 ;уменьшим количество места на диске на #C0 - SBC HL,DE ;сектора - LD (#40E5),HL ;установка нового количества свободного места на диске - LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - CALL x2D73 ;запись сектора - POP HL ;восстановление адреса #4000 - LD DE,(#40E1) ;берем адрес свободного места на диске - PUSH DE ;сохраняем его - LD DE,#A ;сектор #A - CALL x2F1B ;загрузка сектора - POP DE ;восстановление адреса свободного места на диске - CALL x2D4C ;запись секторов - PUSH DE ;сохранение нового адреса свободного места на диске - LD A,#3C ;выбор дисковода A и верхней стороны диска - OUT (#FF),A - CALL x2F65 ;восстановление - LD HL,#4000 ;грузить с адреса #4000 - LD DE,8 ;сектор 8 - LD B,1 - CALL x2F1B ;загрузка сектора - POP DE ;восстановление нового адреса свободного места на диске - LD HL,(#40E1) ;берем старый адрес свободного места на диске - LD (#40E1),DE ;установка нового адреса - PUSH HL ;сохранение старого адреса - LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - LD B,1 - CALL x2D73 ;запись сектора - LD A,(#40E4) ;берем номер записанного файла - DEC A - CALL x2CE5 ;загрузка сектора с его описателем - LD (HL),"@" ;имя файла - "@" - INC HL - LD B,7 ;7 пробелов -x2B09 LD (HL)," " - INC HL - DJNZ x2B09 - LD (HL),"C" ;расширение файла - "C" - POP DE ;восстановление старого адреса свободного места на диске - POP BC ;и значения SP после сохранения регистров - INC HL ;установка значения SP после сохранения - LD (HL),C ;в поле адреса загрузки файла - INC HL - LD (HL),B - INC HL ;поле длины файла пропускаем - INC HL - INC HL - LD (HL),#C0 ;длина файла - #C0 сектора - INC HL - LD (HL),E ;установка адреса файла на диске - INC HL - LD (HL),D - LD HL,#4000 ;записывать с адреса #4000 - LD DE,0 - IN A,(#5F) ;берем номер сектора, в котором находится - DEC A ;описатель файла - LD E,A - LD B,1 - CALL x2D73 ;запись сектора - LD HL,0 ;сохранение SP - ADD HL,SP - LD (#4140),HL - LD SP,#41FF ;перенос стека в экран - CALL x2A35 ;перенос в экран подпрограммы определения текущего ПЗУ - LD HL,#C000 ;адрес страниц ОЗУ - XOR A ;начало вычисления контрольной суммы страницы -x2B3F ADD A,(HL) ;прибавление к сумме очередного байта - INC HL ;адрес следующего байта - LD B,A ;сохранение контрольной суммы - LD A,H ;берем старший байт текущего адреса в странице - OR A ;это 0? - LD A,B ;восстановление контрольной суммы - JR NZ,x2B3F ;если нет, то повтор - LD HL,#4100 ;сохранение контрольной суммы текущей - LD (HL),A ;страницы - PUSH HL ;сохранение ее адреса - LD HL,x2B58 ;адрес возврата - #2B58 - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - DI ;запрет прерываний - JP #4080 ;определение текущего ПЗУ -x2B58 POP HL ;восстановление адреса контрольной суммы текущей страницы - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,#AA ;контрольный байт - LD (#4130),A ;помещение его в экран - LD D,5 ;банк ОЗУ 5 - LD A,(#5C01) ;выбор ПЗУ - OR D - LD D,A - OUT (C),D ;выбор банка памяти - LD A,(#C130) ;берем адрес контрольного байта - CP #AA ;это #AA? - JP NZ,x2C1B ;если нет, то выход - LD A,D ;ОЗУ 0 - AND #F8 - LD D,A - INC HL ;адрес переменной с кодом текущего банка памяти - LD B,8 ;всего 8 страниц -x2B79 LD (HL),D ;установка банка - OUT (C),D ;выбор банка - XOR A ;начало вычисления контрольной суммы страницы - LD HL,#C000 ;адрес страниц ОЗУ -x2B80 ADD A,(HL) ;прибавление к сумме очередного байта - INC HL ;адрес следующего байта - LD E,A ;сохранение контрольной суммы - LD A,H ;берем старший байт текущего адреса в странице - OR A ;это 0? - LD A,E ;восстановление контрольной суммы - JR NZ,x2B80 ;если нет, то повтор - LD HL,#4100 ;адрес переменной с контрольной суммой текущей страницы - CP (HL) ;суммы совпадают? - INC HL ;адрес переменной с кодом текущего банка памяти - JR Z,x2B93 ;если да, то все - INC D ;следующая страница ОЗУ - DJNZ x2B79 ;повтор до конца - DEC D ;берем код текущего банка памяти -x2B93 LD B,8 ;всего 8 страниц -x2B95 PUSH BC ;сохранение числа страниц - CALL x2C37 ;запись страницы - POP BC ;восстановление числа страниц - DJNZ x2B95 ;повтор до конца - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D2A ;загрузка сектора 8 по адресу #4000 - LD A,(#40E4) ;берем количество файлов на диске - LD (#4102),A ;сохраняем его - INC A ;записали еще 1 файл - LD (#40E4),A ;установка нового количества файлов - LD HL,(#40E5) ;берем количество свободного места на диске - LD DE,1 ;уменьшаем его на 1 сектор - SBC HL,DE - LD (#40E5),HL ;установка нового количества свободного места на диске - RET C ;если места на диске нет, то возврат - -;Внимание!!! Куда возврат? Ведь на вершине стека находится сохраненные регистры R и F. - - LD HL,(#40E1) ;берем адрес свободного места на диске - LD (#411E),HL ;сохраняем его - CALL x2D1E ;установка имени файла - LD A,"8" ;восьмой файл - LD (#4111),A - LD A,1 ;его длина - 1 сектор - LD (#411D),A - LD HL,#4100 ;адрес загрузки - #4100 - LD (#4119),HL - LD HL,#100 ;длина - #100 байтов - LD (#411B),HL - LD DE,(#40E1) ;берем адрес свободного места на диске - CALL x2F65 ;восстановление - LD C,D ;берем номер дорожки - CALL x2F3A ;позиционирование - LD HL,#4100 ;записывать с адреса #4100 - LD B,1 ;1 сектор - CALL x2D58 ;запись сектора - LD (#40E1),DE ;установка нового адреса свободного места на диске - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D34 ;запись сектора 8 с адреса #4000 - LD A,(#4102) ;берем номер записанного файла - CALL x2CE5 ;загрузка сектора с его описателем - LD DE,#4110 ;замена описателя файла - LD BC,#10 - EX DE,HL - LDIR - IN A,(#5F) ;берем номер загруженного сектора - DEC A - LD E,A - LD D,0 - LD HL,#4000 ;записывать с адреса #4000 - CALL x2D73 ;запись сектора - LD BC,#7FFD ;адрес порта конфигурации системы - LD A,(#4101) ;берем код текущего банка памяти - OUT (C),A ;установка его -x2C1B LD HL,(#4140) ;восстановление SP - LD SP,HL - LD HL,#4000 ;загружать с адреса #4000 - LD DE,#A ;сектор #A - CALL x2F1B ;загрузка сектора - LD HL,#4100 ;загружать с адреса #4100 - LD DE,#B ;сектор #B - CALL x2F1B ;загрузка сектора - LD A,#3C ;помещение на стек числа #3C - PUSH AF - JP x2EBC ;восстановление регистров и возврат - -;Адрес #2C37. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы плюс 1 и установите #5C00 и #4101. - -x2C37 LD A,B ;берем номер страницы - DEC A - LD (#4103),A ;установка его - LD B,A ;сохранение его - LD A,(#4101) ;берем номер текущей страницы - AND 7 - CP B ;записываем ее? - RET Z ;если да, то возврат - LD A,2 ;записываем страницу 2? - CP B - RET Z ;если да, то возврат - LD A,(#4101) ;берем код текущего банка памяти - AND 8 ;текущий экран 0? - JR Z,x2C55 ;если да, то не записываем страницу 5 - LD A,B ;записываем страницу 7? - CP 7 - RET Z ;если да, то возврат - JR x2C59 ;запись страницы -x2C55 LD A,B ;записываем страницу 5? - CP 5 - RET Z ;если да, то возврат -x2C59 CALL x2C5D ;запись страницы - RET ;возврат - -;Адрес #2C5D. Запись страницы ОЗУ, если она не пустая. Поместите в B номер страницы и установите #5C00 и #4101. - -x2C5D LD HL,#4101 ;берем код текущего банка памяти - LD A,(HL) - AND #F8 ;оставляем экран и ПЗУ - LD C,A - LD A,B ;вычисление байта для порта конфигурации - OR C ;системы - PUSH BC ;сохранение кода текущего банка памяти - LD BC,#7FFD ;адрес порта конфигурации - OUT (C),A ;установка банка памяти - POP BC ;восстановление кода текущего банка - LD HL,#C000 ;адрес страницы -x2C70 LD A,(HL) ;берем байт из страницы - OR A ;это 0? - JR NZ,x2C7A ;если нет, то запись страницы - INC HL ;следующий байт - LD A,H ;конец страницы? - OR A - JR NZ,x2C70 ;если нет, то повтор - RET ;возврат -x2C7A CALL x2C7E ;запись страницы - RET ;возврат - -;Адрес #2C7E. Запись страницы ОЗУ. Установите #4103 и #5C00. - -x2C7E LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D2A ;загрузка сектора 8 по адресу #4000 - LD A,(#40E4) ;берем количество файлов на диске - LD (#4102),A ;сохраняем его - INC A ;записали 1 файл - LD (#40E4),A - LD HL,(#40E5) ;берем количество свободного места на диске - LD DE,#40 ;уменьшаем его на #40 секторов - SBC HL,DE - LD (#40E5),HL ;установка нового количества свободного места - RET C ;если места нет, то возврат - LD HL,(#40E1) ;берем адрес свободного места на диске - LD (#411E),HL ;установка адреса файла на диске - CALL x2D1E ;установка имени файла - LD A,#40 ;размер файла - #40 секторов - LD (#411D),A - LD HL,#C000 ;адрес загрузки - #C000 - LD (#4119),HL - LD HL,#4000 ;длина - #4000 байта - LD (#411B),HL - LD DE,(#40E1) ;берем адрес свободного места на диске - CALL x2D3E ;запись файла - LD (#40E1),DE ;установка нового адреса свободного места - LD C,0 ;дорожка 0 - CALL x2F3A ;позиционирование - CALL x2D34 ;запись сектора 8 с адреса #4000 - LD A,(#4102) ;восстановление номера файла - CALL x2CE5 ;загрузка сектора с описателем файла - LD DE,#4110 ;замена описателя файла - LD BC,#10 - EX DE,HL - LDIR - IN A,(#5F) ;берем номер загруженного сектора - DEC A - LD E,A - LD D,0 - LD HL,#4000 ;записывать с адреса #4000 - CALL x2D73 ;запись сектора - RET ;возврат - -;Адрес #2CE5. Загрузка по адресу #4000 Номер файла поместите в A. На выходе в HL будет адрес описателя файла. - -x2CE5 LD C,A ;сохранение номера файла - AND #F0 ;вычисление номера сектора с описателем файла - RRCA - RRCA - RRCA - RRCA - LD B,A - PUSH BC - LD E,B - LD D,0 - LD HL,#4000 ;загружать с адреса #4000 - PUSH DE ;сохранение номера сектора - CALL x2F1B ;загрузка сектора - POP DE ;восстановление номера сектора - POP BC ;и номера файла - LD B,0 - LD A,C ;вычисление относительного адреса описателя - AND #F ;файла в секторе - RLCA - RLCA - RLCA - RLCA - LD HL,#4000 ;вычисление абсолютного адреса - ADD A,L - LD L,A - RET ;возврат - -;Адрес #2D09. Помещение имени и расширения файла "@"CODE по адресу #4110. - -x2D09 LD HL,#4110 ;адрес имени файла - LD B,9 ;длина области - 9 байтов -x2D0E LD (HL)," " ;очистка области - INC HL - DJNZ x2D0E - LD A,"@" ;имя файла - "@" - LD (#4110),A - LD A,"C" ;расширение файла - "C" - LD (#4118),A - RET ;возврат - -;Адрес #2D1E. Установка имени файла страницы. Установите #4103. Имя файла будет находиться по адресу #4110. - -x2D1E CALL x2D09 ;установка имени главного файла - LD A,(#4103) ;берем номер страницы - ADD A,"0" ;преобразование его в символ - LD (#4111),A ;установка номера страницы - RET ;возврат - -;Адрес #2D2A. Загрузка сектора 8 по адресу #4000. Спозиционируйте головку. - -x2D2A LD HL,#4000 ;грузить по адресу #4000 - LD DE,8 ;сектор 8 - CALL x2F1B ;загрузка сектора - RET ;возврат - -;Адрес #2D34. Запись сектора 8 с адреса #4000. Спозиционируйте головку. - -x2D34 LD HL,#4000 ;записывать с адреса #4000 - LD DE,8 ;сектор 8 - CALL x2D73 ;запись сектора - RET ;возврат - -;Адрес #2D3E. Запись #40-х секторов с адреса #C000. Установите все для #2D4C. - -x2D3E CALL x2F65 ;восстановление - LD C,D ;берем номер первой дорожки - CALL x2F3A ;позиционирование - LD HL,#C000 ;записывать с адреса #C000 - LD B,#40 ;#40 секторов - JR x2D58 ;запись секторов и возврат - -;Адрес #2D4C. Запись #C0 секторов с адреса #4000 для подпрограммы MAGIC. В DE поместите адрес на диске и установите #5C00. Используется также с адреса: -;#2D58 (запись секторов; в HL поместите адрес в памяти, в DE - адрес на диске, в B ? количество секторов, установите #5C00 и спозиционируйте головку на первую дорожку). - -x2D4C CALL x2F65 ;восстановление - LD C,D ;берем номер первой дорожки - CALL x2F3A ;позиционирование - LD HL,#4000 ;записывать с адреса #4000 - LD B,#C0 ;#C0 секторов -x2D58 PUSH BC ;сохранение количества секторов - PUSH DE ;и адреса на диске - CALL x2D73 ;запись сектора - LD DE,#100 ;адрес следующего сектора в памяти - ADD HL,DE - POP DE ;восстановление адреса на диске - INC E ;следующий сектор - LD A,E ;конец дорожки? - CP #10 - JR NZ,x2D6F ;если да, то - LD E,0 ;текущий сектор 0, - INC D ;следующая дорожка, - LD C,D - CALL x2F3A ;позиционирование -x2D6F POP BC ;восстановление количества секторов - DJNZ x2D58 ;повтор до конца - RET ;возврат - -;Адрес #2D73. Запись сектора для команды GO TO. В HL поместите адрес записи, в E - номер сектора. - -x2D73 LD A,E ;установка номера сектора - INC A - OUT (#5F),A - PUSH HL ;сохранение адреса записи - LD D,#14 ;20 попыток - PUSH DE ;сохранение числа попыток -x2D7B DI ;запрет прерываний - LD C,#7F ;адрес регистра данных контроллера - LD A,#A0 ;команда записи сектора - OUT (#1F),A - CALL x3FCA ;запись байтов - POP DE ;восстановление количества попыток - POP HL ;и адреса записи сектора - IN A,(#1F) ;берем состояние контроллера - AND #7F ;все в порядке? - RET Z ;если да, то возврат - DEC D ;следующая попытка - PUSH HL ;сохранение адреса записи сектора - PUSH DE ;и количества попыток - JR NZ,x2D7B ;если попытки не кончились, то повтор - -;Внимание!!! Самая большая ошибка!!! Диск с заклеенной прорезью защиты от записи будет, скорее всего, испорчен. Подробное объяснение вы найдете в ZX-PЕВЮ #5F/4 на странице #23. - - HALT ;остановка процессора - -;Адрес #2D92. Загрузка секторов. Установите #5CE6, #5CEB и #5CEA. - -x2D92 LD HL,(#5CE6) ;берем адрес загрузки - LD DE,(#5CEB) ;берем адрес секторов на диске - LD A,(#5CEA) ;берем количество секторов - LD B,A - CALL x1E3D ;загрузка секторов - RET ;возврат - -;Адрес #2DA1. Выполнение команды GO TO. Установите #5D11 и #5C3B. Можно использовать также с адреса #2E27 (GO TO для 48К; параметры, как и для #2DA1). Используется также с адреса #2EBC для возврата из подпрограммы обработки немаскируемого прерывания. - -x2DA1 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - -;Зачем это нужно? Ведь MAGIC записывает файлы только с расширением C. - - CALL x1C57 ;установка имени файла - LD (#4020),BC ;сохранение длины имени файла - LD A,C ;она равна 8 символам? - CP 8 - JR NC,x2DD2 ;если да, то работа с 48К - CALL x0405 ;настройка на диск - CALL x1CB3 ;поиск файла - JP NZ,x03D9 ;если не нашли, то NO FILE - LD HL,#5CDD ;берем адрес имени файла - LD BC,(#4020) ;и его длину - -;Зачем портить экран без надобности? Ведь длину имени файла можно сохранять и в другом месте. - - ADD HL,BC ;вычисляем адрес конца имени файла - LD (HL),"8" ;прибавление "8" к имени файла - PUSH HL ;сохранение адреса этого символа - CALL x1CB3 ;поиск файла - POP HL ;восстановление последнего символа имени файла - JR Z,x2DD8 ;если файл нашелся, то загрузка страниц - LD (HL)," " ;восстановление имени главного файла -x2DD2 CALL x1CB3 ;поиск файла - JP x2E33 ;загрузка файла -x2DD8 CALL x165D ;чтение описателя файла - CALL x2D92 ;загрузка файла - LD SP,#40FF ;перенос стека - LD B,8 ;всего 8 страниц -x2DE3 PUSH BC ;сохранение номера файла страницы - LD A,B - LD BC,#7FFD ;адрес порта конфигурации системы - DEC A ;страницы считаем с 0 - PUSH AF ;сохранение номера страницы - OR #10 ;экран 0, ПЗУ 1 - OUT (C),A ;установка страницы - POP AF ;восстановление номера страницы - ADD A,"0" ;вычисление последнего символа имени файла страницы - LD HL,#5CDD ;вычисление адреса для этого символа - LD BC,(#4020) - ADD HL,BC - LD (HL),A ;установка последнего символа имени файла страницы - CALL x1CB3 ;поиск файла - JR NZ,x2E05 ;если не нашли, то загрузка следующей страницы - CALL x165D ;чтение описателя файла - CALL x2D92 ;загрузка файла - -;Внимание!!! При ответе A на вопpос "DISC ERROR. RETRY,ABORT,IGNORE?", может произойти что угодно, если значение ERR_SP больше #C000, так как старый стек будет затираться загружаемым файлом или находиться в другой странице. - -x2E05 POP BC ;восстановление номера файла страницы - DJNZ x2DE3 ;повтор до конца - LD A," " ;восстановление имени главного файла - LD HL,#5CDD - LD BC,(#4020) - ADD HL,BC - LD (HL),A - CALL x1CB3 ;поиск файла - CALL x165D ;чтение описателя файла - PUSH BC ;сохранение номера файла - PUSH AF ;и AF - LD BC,#7FFD ;адрес порта конфигурации - LD A,(#4101) ;берем его значение в момент записи файла (из восьмого файла) - OUT (C),A ;установка рабочего состояния порта - POP AF ;востановление номера файла и AF - POP BC - JR x2E39 ;загрузка главного файла -x2E27 CALL x1DDF ;прием имени файла на стек калькулятора - CALL x1D75 ;если идет проверка на синтаксис, то возврат - CALL x102E ;прием расширения файла - CALL x292F ;поиск файла -x2E33 JP NZ,x03D9 ;если он не найден, то NO FILE - CALL x165D ;чтение его описателя -x2E39 LD A,(#5CDD) ;берем первый символ имени файла - CP "$" ;это "$"? - DI ;запрет прерываний - JR NZ,x2E43 ;если да, то - IM 2 ;установка второго режима прерываний -x2E43 LD SP,#40F0 ;перенос стека - CALL x3E11 ;берем тип дисковода - LD (#4010),A ;сохраняем его - LD A,(#5D16) ;сохранение копии системного регистра, - LD (#4011),A - LD HL,(#5CE6) ;адреса стека для программы, - PUSH HL - LD DE,(#5CEB) ;и адреса файла на диске - PUSH DE - INC E ;первый сектор файла пока не загружаем - LD A,E - CP #10 - JR NZ,x2E64 - LD E,0 - INC D -x2E64 LD C,D ;берем логический номер дорожки - CALL x2F07 ;выбор верхней стороны диска - LD A,(#4010) ;берем режим дисковода - AND 2 ;дисковод двухсторонний? - CALL NZ,x2F0F ;если да, то выбор стороны диска - LD A,C ;берем физический номер дорожки - CALL x2F50 ;позиционирование - LD HL,#4100 ;загружать с адреса #4100 - LD B,#BF ;#BF секторов -x2E79 PUSH BC ;сохранение количества секторов - PUSH DE ;и адреса текушего сектора на диске - CALL x2F1B ;загрузка сектора - LD DE,#100 ;вычисление адреса загрузки следующего сектора - ADD HL,DE - POP DE ;восстановление адреса текушего сектора на диске - INC E ;следующий сектор - LD A,E ;конец дорожки? - CP #10 - JR NZ,x2E9C ;если нет, то продолжение загрузки - LD E,0 ;сектор 0 - INC D ;следующая дорожка - LD C,D - CALL x2F07 ;позиционирование (смотрите выше) - LD A,(#4010) - AND 2 - CALL NZ,x2F0F - LD A,C - CALL x2F50 -x2E9C POP BC ;восстановление количества секторов - DJNZ x2E79 ;повтор до конца - POP DE ;восстановление адреса файла на диске - POP HL ;и адреса стека - LD SP,HL ;установка стека - LD A,(#4011) ;берем копию системного регистра - PUSH AF ;сохраняем ее - LD C,D ;позиционирование (смотрите выше) - CALL x2F07 - LD A,(#4010) - AND 2 - CALL NZ,x2F0F - LD A,C - CALL x2F50 - LD HL,#4000 ;адрес загрузки первого сектора файла - CALL x2F1B ;загрузка сектора -x2EBC POP AF ;востановление копии системного регистра - EX AF,AF' ;и снова сохранение - POP AF ;восстановление регистров R и I - LD R,A - POP AF - LD I,A - DI ;запрет прерываний - LD A,#FF ;установка флага прерываний - JP PO,x2ECC - LD A,0 -x2ECC LD (#5C00),A - POP AF ;восстановление регистров - POP HL - POP DE - POP BC - EXX - EX AF,AF' - POP IY - POP IX - POP HL - POP DE - POP BC - LD A,(#5C48) ;установка цвета бордюра - AND #38 - RRCA - RRCA - RRCA - nop ;new - nop ;new -; OUT (#FE),A - LD A,(#5B08) ;берем байт из #5B08 - CP #EE ;там #EE? - JR NZ,x2EF7 ;если нет, то системных переменных 128К нет - -;Ошибка!!! Число #EE по адресу #5B08 еще ни о чем не говоpит. - - PUSH BC ;сохранение BC - LD BC,#7FFD ;адрес порта конфигурации - LD A,(#5B5C) ;берем значение переменной BANK_M - OUT (C),A ;установка рабочей страницы - POP BC ;восстановление BC -x2EF7 LD A,(#5C00) ;берем флаг прерываний - OR A ;прерывания разрешать? - LD A,#C9 ;установка переключателя ПЗУ на бейсик - LD (#5C00),A - JR NZ,x2F03 ;если в #5C00 был 0, то - EI ;разрешение прерываний -x2F03 POP AF ;восстановление AF - JP #5C00 ;запуск программы - -;Адрес #2F07. Выбор верхней стороны диска для команды GO TO. Установите #4011. Можно использовать также с адреса: -;#2F0C для прямого вывода в порт #FF. - -x2F07 LD A,(#4011) ;берем копию системного регистра - OR #3C ;сторона - верхняя -x2F0C OUT (#FF),A ;загрузка системного регистра - RET ;возврат - -;Адрес #2F0F. Выбор верхней стороны диска для команды GO TO. Вход: установите #4011, поместите в C логический номер дорожки и выберите верхнюю сторону диска. Выход: в C будет физический номер дорожки и выбрана сторона диска. - -x2F0F LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - RET NC ;если дорожка четная, то возврат - LD A,(#4011) ;берем копию системного регистра - AND #6F ;сторона - нижняя - JR x2F0C ;загрузка системного регистра и возврат - -;Адpес #2F1B. Чтение сектора для команды GO TO. В HL поместите адрес загрузки, в E - номер сектора. - -x2F1B LD A,E ;установка номера сектора - INC A - OUT (#5F),A - PUSH HL ;сохранение адреса загрузки - LD D,#14 ;20 попыток - PUSH DE ;сохранение числа попыток -x2F23 DI ;запрет прерываний - LD C,#7F ;адрес регистра данных контроллера - LD A,#80 ;команда чтения сектора - OUT (#1F),A - CALL x3FE5 ;чтение байтов - POP DE ;восстановление количества попыток - POP HL ;и адреса загрузки сектора - IN A,(#1F) ;берем состояние контроллера - AND #7F ;все в порядке? - RET Z ;если да, то возврат - DEC D ;следующая попытка - PUSH HL ;сохранение адреса загрузки сектора - PUSH DE ;и количества попыток - JR NZ,x2F23 ;если попытки не кончились, то повтор - HALT ;остановка процессора - -;Адрес #2F3A. Позиционирование для подпрограммы MAGIC. Логический номер дорожки поместите в C и установите #5C00. Используется также с адресов: -;#2F50 - позиционирование для команды GO TO. Поместите в A физический номер дорожки. -;#2F57 - выдача команды и ожидание INTRQ. Команду поместите в A. - -x2F3A LD A,#3C ;выбор верхней стороны диска - OUT (#FF),A - LD A,(#5C00) ;берем тип дисковода - AND 8 ;он двухсторонний? - JR NZ,x2F4F ;если нет, то позиционирование - LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - JR NC,x2F4F ;если дорожка четная, то позиционирование - LD A,#2C ;выбор нижней стороны диска - OUT (#FF),A -x2F4F LD A,C -x2F50 OUT (#7F),A ;загрузка номера дорожки в регистр данных - CALL x3DFD ;задержка в 725779 тактов - LD A,#18 ;new команда позиционирования -x2F57 OUT (#1F),A -x2F59 IN A,(#FF) ;ожидание сигнала INTRQ - AND #80 - JR Z,x2F59 - PUSH BC ;сохранение BC - CALL x3DFD ;задержка в 725779 тактов - POP BC ;восстановление BC - RET ;возврат - -;Адрес #2F65. Восстановление для подпрограммы MAGIC. - -x2F65 LD A,#08 ;new команда восстановления - JR x2F57 ;выдача команды, ожидание INTRQ и возврат - -;Адрес #2F69. Подпрограмма обработки ошибок, поступающих из ПЗУ бейсика. Установите #5C3A и все для подпрограммы #1D3. - -x2F69 LD HL,(#5D1C) ;очистка стека - DEC HL - DEC HL - LD SP,HL - JP x1D2F ;выдача сообщения и завершение - -;Адрес #2F72. Вызов подпрограмм из ПЗУ бейсика. Адрес задайте в двух байтах после CALL #2F72: -;CALL #2F72 -;DW #0D6B - -x2F72 LD (#5D02),HL ;сохранение HL и DE - LD (#5D04),DE - POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы - LD E,(HL) ;берем адрес подпрограммы - INC HL - LD D,(HL) - INC HL - PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую #2F72 - LD HL,x3D2F ;помещение на стек адреса переключателя ПЗУ на TR-DOS - PUSH HL - PUSH DE ;помещение на стек адреса вызываемой подпрограммы - LD HL,#5CC2 ;помещение на стек адреса команды RET в ОЗУ - PUSH HL - LD HL,(#5D02) ;восстановление HL и DE - LD DE,(#5D04) - RET ;переход к команде RET в ОЗУ - -;Адрес #2F90. Установка начальных значений системных пеpеменных TR-DOS. В переменные помещает: -;в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16, #5D0C - #FF; #5D17 - #5D19, #5D1F - 0; #5CC2 - #C9; в системный регистр помещается #FF и выполняется команда прерывания. Подпрограмма может использоваться также с адреса: -;#2FC3 для прямого вывода в порт #1F. - -x2F90 LD HL,#0000 ;new было #FFFF - LD (#5CFA),HL ;типы дисководов неизвестны - LD (#5CFC),HL - call x08CA ;new - LD (#5CC8),HL ;время перемещения головок дисководов -; LD (#5CCA),HL ;неизвестно - XOR A - LD (#5D17),A ;заставку выводить - LD (#5D19),A ;дисковод по умолчанию - A: - LD (#5D18),A ;память не изменять - LD (#5D0F),A ;pаботает командный процессор TR-DOS - LD (#5D1F),A - LD A,#FF ;загрузка системного регистра - OUT (#FF),A - LD (#5C3A),A ;ошибки нет - LD (#5D16),A ;сохранение значения системного регистра - LD (#5D0C),A ;буфера нет - LD A,#C9 ;помещение в ОЗУ команды RET - LD (#5CC2),A - LD A,#D0 ;команда прерывания -x2FC3 OUT (#1F),A ;выдача команды - RET ;возврат - -;Адрес #2FC6. Проверка достижения конца каталога при его печати. - -x2FC6 CALL x050C ;проверка и обработка достижения конца буфера - LD A,(HL) ;берем первый символ имени файла - OR A ;конец каталога? - JP Z,x03AC ;если да, то окончание выдачи - CP 1 ;файл стерт? - CALL Z,x0507 ;если да, то пропуск его - RET NZ ;иначе возврат - JR x2FC6 ;повтор - -;Адрес #2FD6. Загрузка сектора в буфер. В DE поместите адрес сектора на диске. - -x2FD6 LD B,1 ;загружать 1 сектор - LD HL,#5D25 ;загружать в буфер - JP x1E67 ;загрузка сектора - -;Адрес #2FDE. Загрузка конца файла. В HL - адрес загрузки, в #5CDC - длина, в #5CF4 - откуда грузить. - -x2FDE PUSH HL ;сохранение адреса загрузки - LD DE,(#5CF4) ;берем адрес сектора на диске - CALL x2FD6 ;загрузка его в буфер - LD A,(#5CDB) ;берем количество байтов для загрузки - POP DE ;восстановление адреса загрузки - OR A ;загружаем 0 байтов? - RET Z ;если да, то возврат - LD C,A ;перевод длины загружаемой части в двухбайтную форму - LD HL,#5D25 ;перемещаем байты из буфера - LDIR - RET ;возврат - -;Адрес #2FF3. Таблица команд TR-DOS. - -x2FF3 DB #CF,"*",#D0,#D1,#E6,#D2,#EF,#F8,#FE,#BE,#F4,#D5,#F7 - DB #D3,#D4,#FF,"4",#EC,"8",#F0,#D6 - -;Адрес #3008. Таблица адресов подпрограмм, выполняющих команды TR-DOS. - -x3008 DW x0433,x1018,x1EC2,x16AB,x053A,x0787,x1815,x1AD0,x1CFB,x19A5 - DW x19A9,x19B1,x1D4D,x2182,x2656,x0690,x2997,x2DA1,x29AE,x11CE - DW x1810 - -;Адрес #3032. Сжатие командной строки. Строку поместите в буфер редактора. Помещает в #5CD6 #FF и устанавливает #5D11. - -x3032 LD HL,(#5C59) ;берем адрес буфера редактора - LD (#5D11),HL ;установка адреса командной строки - LD (#5CD9),HL ;установка адреса текущего символа - LD A,#FF ;подана прямая команда - LD (#5CD6),A - LD HL,#5CDB ;любой адрес - LD (#5CD7),HL - JR x3057 ;сжатие строки и возврат - -;Адрес #3048. Сжатие командной строки. В HL поместите адрес строки. Устанавливает #5CD6 и #5D11. Используется также с адреса: -;#3057 (сжатие строки; установите #5CD6, #5CD7 и #5CD9). - -x3048 LD (#5D11),HL ;установка адреса строки - LD (#5CD9),HL ;и адреса текущего ключевого слова - CALL x30E1 ;проверка, где находится строка - RET NZ ;если строка не найдена, то возврат - INC HL ;вычисление адреса поля длины строки - INC HL - LD (#5CD7),HL ;установка адреса поля длины строки -x3057 CALL x30A9 ;определение номера ключевого слова - JR NZ,x3087 ;если это не ключевое слово, то следующий символ - EX DE,HL ;переброска адреса последнего символа ключевого слова в DE - INC DE ;вычисление адреса символа после ключевого слова - LD B,0 ;перевод номера ключевого слова в 2-х байтную форму - LD HL,x31C8 ;адрес таблицы кодов ключевых слов - ADD HL,BC ;вычисление адреса кода ключевого слова - LD A,(HL) ;берем этот код - LD HL,(#5CD9) ;берем адрес ключевого слова - LD (HL),A ;замена его одним символом - INC HL ;вычисление адреса второго символа ключевого слова - EX DE,HL ;переброска его в DE - RST #20 ;вычисление количества стираемых символов - DW #19DD - PUSH BC ;сохранение его - RST #20 ;уничтожение ненужных символов - DW #19E8 - POP BC ;восстановление количества стертых символов - LD A,(#5CD6) ;строка находится в программе на бейсике? - OR A - JR NZ,x3087 ;если нет, то ее длина нигде не обозначена - LD HL,(#5CD7) ;берем адрес поля длины строки - LD E,(HL) ;берем длину строки - INC HL - LD D,(HL) - EX DE,HL ;перебросим ее в HL - OR A - SBC HL,BC ;скорректируем ее - EX DE,HL ;перебросим в DE - LD (HL),D ;и загрузим обратно - DEC HL - LD (HL),E -x3087 LD HL,(#5CD9) ;берем адрес текущего символа - LD A,(HL) ;берем этот символ - CP #D ;это ENTER? - RET Z ;если да, то возврат - INC HL ;следующий символ - LD (#5CD9),HL - LD A,(HL) ;берем его - CP #D ;это ENTER? - RET Z ;если да, то возврат - CP #22 ;это кавычки? - JR NZ,x3057 ;если нет, то повтор -x309A INC HL ;следующий символ - LD A,(HL) ;берем его - CP #D ;это ENTER? - RET Z ;если да, то возврат - CP #22 ;это кавычки? - JR NZ,x309A ;если нет, то следующий символ - INC HL ;следующий символ - LD (#5CD9),HL - JR x3057 ;повтор - -;Адрес #30A9. Определение номера ключевого слова. Установите #5CD9. После возврата если флаг Z установлен, то в C будет номер ключевого слова, а в HL - адрес последнего символа ключевого слова; иначе ключевое слово не было опознано, а в HL будет адрес из #5CD9. - -x30A9 LD HL,(#5CD9) ;берем адрес ключевого слова в строке - LD DE,x30FD ;адрес таблицы ключевых слов - LD C,0 ;начнем со слова 0 -x30B1 LD A,(HL) ;берем символ слова из нашей строки - AND #DF ;буква заглавная - LD B,A ;загрузка символа в B - OR A ;это CHR$ 0? - JR NZ,x30BB ;если да, то - INC HL ;следующий символ - JR x30B1 ;и повтор -x30BB LD A,(DE) ;берем символ из таблицы - AND #80 ;его бит 7 включен? - JR NZ,x30C8 ;если да, то этот символ последний - LD A,(DE) ;снова берем символ из таблицы - CP B ;сравнение символов - JR NZ,x30D9 ;если они не совпадают, то проверка следующего слова - INC HL ;адреса следующих символов - INC DE - JR x30B1 ;повтор -x30C8 LD A,(DE) ;берем символ из таблицы - AND #7F ;сбрасываем бит 7 - CP B ;сравниваем символы - RET Z ;если они совпали, то возврат -x30CD INC C ;номер следующего слова - LD HL,(#5CD9) ;берем адрес ключевого слова в строке - INC DE ;следующий символ из таблицы - LD A,(DE) - CP #FF ;конец таблицы? - JR NZ,x30B1 ;если нет, то повтор - OR A ;сброс флага Z - RET ;возврат -x30D9 INC DE ;следующий символ из таблицы - LD A,(DE) - AND #80 ;его бит 7 включен? - JR Z,x30D9 ;если да, то следующий символ - JR x30CD ;проверка достижения конца таблицы - -;Адрес #30E1. Проверка местонахождения строки. Устанавливает #5CD6, а в HL помещает адрес поля длины строки минус 2. - -x30E1 LD HL,(#5C45) ;берем номер выполняющейся строки - INC HL ;подана прямая команда? - INC HL - LD A,H - OR L - JR Z,x30F4 ;если да, то установка флага - XOR A ;команда находится в строке программы на бейсике - LD (#5CD6),A - DEC HL ;восстановление номера строки - DEC HL - RST #20 ;определение адреса строки - DW #196E - RET ;возврат -x30F4 LD A,#FF ;подана прямая команда - LD (#5CD6),A - LD HL,(#5C59) ;любой адрес - RET ;возврат - -;Адрес #30FD. Таблица ключевых слов TR-DOS. - -x30FD DB "SAVE" - DB #80 - DB "SAV" - DB #C5 - DB "LOAD" - DB #80 - DB "LOA" - DB #C4 - DB "RUN" - DB #80 - DB "RU" - DB #CE - DB "CAT" - DB #80 - DB "CA" - DB #D4 - DB "ERASE" - DB #80 - DB "ERAS" - DB #C5 - DB "NEW" - DB #80 - DB "NE" - DB #D7 - DB "MOVE" - DB #80 - DB "MOV" - DB #C5 - DB "MERGE" - DB #80 - DB "MERG" - DB #C5 - DB "PEEK" - DB #80 - DB "PEE" - DB #CB - DB "POKE" - DB #80 - DB "POK" - DB #C5 - DB "OPEN" - DB #83 - DB "CLOSE" - DB #83 - DB "CODE" - DB #80 - DB "COD" - DB #C5 - DB "RND" - DB #80 - DB "RN" - DB #C4 - DB "DATA" - DB #80 - DB "DAT" - DB #C1 - DB "SCREEN" - DB 4,#84 - DB "SCREEN" - DB #84 - DB "COPY" - DB #80 - DB "COP" - DB #D9 - DB "FORMAT" - DB #80 - DB "FORMA" - DB #D4 - DB "GOTO" - DB #80 - DB "GOT" - DB #CF - DB "LIST" - DB #80 - DB "LIS" - DB #D4 - DB "LINE" - DB #80 - DB "LIN" - DB #C5 - DB "VERIFY" - DB #80 - DB "VERIF" - DB #D9 - DB #FF,#FF - -;Адрес #31C8. Таблица кодов ключевых слов TR-DOS. - -x31C8 DB #F8,#F8,#EF,#EF,#F7,#F7,#CF,#CF,#D2,#D2,#E6,#E6,#D1 - DB #D1,#D5,#D5,#BE,#BE,#F4,#F4,#D3,#D4,#AF,#AF,#A5,#A5 - DB #E4,#E4,#AA,#AA,#FF,#FF,#D0,#D0,#EC,#EC,#F0,#F0,#CA - DB #CA,#D6,#D6,0 - -;Адрес #31F3. Проверка наличия системных переменных TR-DOS. Если они есть, то флаг C будет сброшен, иначе установлен. - -x31F3 LD HL,(#5C4F) ;берем адрес области описателей каналов - OR A ;для правильного вычитания - LD BC,#5D25 ;адрес области описателей каналов при наличии системных переменных TR-DOS. - SBC HL,BC ;установка флага C - RET ;возврат - -x31FD DISPLAY "Free space at ",$,": ",/D,#3201-$," byte(s)" - DS #3201-$,#FF - -x3201 ld hl,x3219 - ld de,#FCA0 - ld bc,#0318 - ld a,#FF - jr x3210 -x320E inc hl - inc hl -x3210 cp l - jr z,x320E - ldi - jp pe,x3210 - ret - -;шрифт -x3219 db #00,#00,#00,#00,#00,#00,#00,#00 - db #00,#20,#20,#20,#20,#20,#00,#20 - db #00,#50,#50,#00,#00,#00,#00,#00 - db #00,#00,#50,#F8,#50,#F8,#50,#00 - db #00,#20,#70,#A0,#70,#28,#70,#20 - db #00,#40,#48,#10,#20,#48,#08,#00 - db #00,#20,#50,#50,#60,#A8,#90,#68 - db #00,#20,#40,#00,#00,#00,#00,#00 - db #00,#08,#10,#10,#10,#10,#10,#08 - db #00,#40,#20,#20,#20,#20,#20,#40 - db #00,#00,#50,#20,#F8,#20,#50,#00 - db #00,#00,#20,#20,#F8,#20,#20,#00 - db #00,#00,#00,#00,#00,#60,#20,#40 - db #00,#00,#00,#00,#F8,#00,#00,#00 - db #00,#00,#00,#00,#00,#00,#60,#60 - db #00,#00,#08,#10,#20,#40,#80,#00 - db #00,#70,#88,#98,#A8,#C8,#88,#70 - db #00,#20,#60,#A0,#20,#20,#20,#F8 - db #00,#70,#88,#08,#30,#40,#80,#F8 - db #00,#70,#88,#08,#30,#08,#88,#70 - db #00,#18,#28,#48,#88,#F8,#08,#08 - db #00,#F8,#80,#F0,#08,#08,#08,#F0 - db #00,#70,#80,#F0,#88,#88,#88,#70 - db #00,#F8,#08,#10,#20,#40,#80,#80 - db #00,#70,#88,#88,#70,#88,#88,#70 - db #00,#70,#88,#88,#88,#78,#08,#70 - db #00,#00,#60,#60,#00,#00,#60,#60 - db #00,#00,#60,#60,#00,#60,#20,#40 -x32F9 db #00,#00,#10,#20,#40,#20 -x32FF dw #FFFF -x3301 db #10,#00 -x3203 db #00,#00,#00,#F8,#00,#F8,#00,#00 - db #00,#00,#40,#20,#10,#20,#40,#00 - db #00,#70,#88,#08,#10,#20,#00,#20 - db #00,#70,#88,#B8,#A8,#B8,#80,#78 - db #00,#70,#88,#88,#88,#F8,#88,#88 - db #00,#F0,#88,#88,#F0,#88,#88,#F0 - db #00,#70,#88,#80,#80,#80,#88,#70 - db #00,#E0,#90,#88,#88,#88,#90,#E0 - db #00,#F8,#80,#80,#F0,#80,#80,#F8 - db #00,#F8,#80,#80,#F0,#80,#80,#80 - db #00,#70,#88,#80,#B8,#88,#88,#70 - db #00,#88,#88,#88,#F8,#88,#88,#88 - db #00,#F8,#20,#20,#20,#20,#20,#F8 - db #00,#38,#10,#10,#10,#90,#90,#60 - db #00,#88,#90,#A0,#C0,#A0,#90,#88 - db #00,#80,#80,#80,#80,#80,#80,#F8 - db #00,#88,#D8,#A8,#88,#88,#88,#88 - db #00,#88,#88,#C8,#A8,#98,#88,#88 - db #00,#70,#88,#88,#88,#88,#88,#70 - db #00,#F0,#88,#88,#88,#F0,#80,#80 - db #00,#70,#88,#88,#88,#A8,#90,#68 - db #00,#F0,#88,#88,#88,#F0,#90,#88 - db #00,#70,#88,#80,#70,#08,#88,#70 - db #00,#F8,#20,#20,#20,#20,#20,#20 - db #00,#88,#88,#88,#88,#88,#88,#70 - db #00,#88,#88,#88,#88,#88,#50,#20 - db #00,#88,#88,#88,#88,#88,#A8,#50 - db #00,#88,#88,#50,#20,#50,#88,#88 - db #00,#88,#88,#50,#20,#20,#20,#20 - db #00,#F8,#08,#10,#20,#40,#80,#F8 - db #00,#38,#20,#20,#20,#20,#20,#38 -x33FB db #00,#00,#80,#40 -x33FF dw #FFFF -x3401 db #20,#10,#08,#00 -x3405 db #00,#E0,#20,#20,#20,#20,#20,#E0 - db #00,#20,#70,#A8,#20,#20,#20,#20 - db #00,#00,#00,#00,#00,#00,#00,#FC - db #00,#40,#20,#00,#00,#00,#00,#00 - db #00,#00,#60,#10,#70,#90,#90,#68 - db #00,#80,#80,#80,#E0,#90,#90,#E0 - db #00,#00,#60,#90,#80,#80,#90,#60 - db #00,#10,#10,#10,#70,#90,#90,#70 - db #00,#00,#60,#90,#90,#E0,#80,#70 - db #00,#18,#20,#20,#70,#20,#20,#20 - db #00,#00,#70,#90,#90,#70,#10,#60 - db #00,#80,#80,#80,#E0,#90,#90,#90 - db #00,#40,#00,#40,#40,#40,#40,#30 - db #00,#20,#00,#20,#20,#20,#20,#C0 - db #00,#80,#90,#A0,#C0,#A0,#90,#88 - db #00,#40,#40,#40,#40,#40,#40,#30 - db #00,#00,#D0,#A8,#A8,#A8,#A8,#A8 - db #00,#00,#E0,#90,#90,#90,#90,#90 - db #00,#00,#60,#90,#90,#90,#90,#60 - db #00,#00,#E0,#90,#90,#E0,#80,#80 - db #00,#00,#70,#90,#90,#70,#18,#10 - db #00,#00,#90,#A8,#C0,#80,#80,#80 - db #00,#00,#60,#80,#60,#10,#10,#E0 - db #00,#40,#40,#E0,#40,#40,#40,#30 - db #00,#00,#90,#90,#90,#90,#90,#60 - db #00,#00,#88,#88,#88,#50,#50,#20 - db #00,#00,#88,#88,#A8,#A8,#A8,#50 - db #00,#00,#00,#88,#50,#20,#50,#88 - db #00,#00,#90,#90,#90,#70,#10,#E0 - db #00,#00,#F0,#10,#20,#40,#80,#F0 - db #00,#20,#40,#40,#80,#40,#40,#20 -x34FD db #00,#20 -x34FF dw #FFFF -x3501 db #20,#20,#20,#20,#20,#20 -x3507 db #00,#20,#10,#10,#08,#10,#10,#20 - db #00,#00,#A8,#50,#00,#00,#00,#00 - db #00,#78,#84,#B4,#A4,#B4,#84,#78 - db #00,#FC,#FC,#FC,#FC,#FC,#FC,#FC - db #00,#00,#00,#00,#FC,#FC,#FC,#FC - db #00,#60,#F0,#78,#3C,#78,#F0,#60 - -x3537 DISPLAY "Free space at ",$,": ",/D,#35FF-$," byte(s)" - ds #35FF-$,#00 - dw #FFFF -x3601 DISPLAY "Free space at ",$,": ",/D,#36FF-$," byte(s)" - ds #36FF-$,#00 - dw #FFFF -x3701 DISPLAY "Free space at ",$,": ",/D,#37FF-$," byte(s)" - ds #37FF-$,#00 - dw #FFFF -x3801 DISPLAY "Free space at ",$,": ",/D,#38FF-$," byte(s)" - ds #38FF-$,#00 - dw #FFFF -x3901 DISPLAY "Free space at ",$,": ",/D,#39FF-$," byte(s)" - ds #39FF-$,#00 - dw #FFFF -x3A01 DISPLAY "Free space at ",$,": ",/D,#3AFF-$," byte(s)" - ds #3AFF-$,#00 - dw #FFFF -x3B01 DISPLAY "Free space at ",$,": ",/D,#3BFF-$," byte(s)" - ds #3BFF-$,#00 - dw #FFFF - -;Адрес #3C01. То же, что и #3D31. - -x3C01 JR x3C06 - -x3C03 DB #FF - -;Адрес #3C04. То же, что и #3D1A - -x3C04 JR x3C09 - -;Адрес #3C06. То же, что и #3D31. - -x3C06 JP x3D00 - -;Адрес #3C09. То же, что и #3D1A. - -x3C09 JP x3D03 - -x3C0C ret - -x3C0D push af - push hl - push de - call x3E08 - ld b,a - pop de - pop hl - pop af - jp x3E44 - -x3C1A DISPLAY "Free space at ",$,": ",/D,#3C30-$," byte(s)" - ds #3C30-$,#00 - -x3C30 in a,(#1F) - ret - -x3C33 DISPLAY "Free space at ",$,": ",/D,#3CFA-$," byte(s)" - ds #3CFA-$,#00 - -;Адрес #3CFA. То же, что и #20F1. - -x3CFA JP x20F1 - -;Адрес #3CFD. То же, что и #3D13, но не переключает ПЗУ. - -x3CFD JP x283C - -;Адрес #3D00. Вход в TR-DOS. Переключает ПЗУ. - -x3D00 NOP - JR x3D31 - -;Адрес #3D03. Выполнение команд TR-DOS из бейсика. Установите CH_ADD на префикс :REM: перед командой. Возвращает в BC код ошибки. Переключает ПЗУ. - -x3D03 NOP - JR x3D1A - -;Адрес #3D06. Подпрограмма ввода из файла данных. Переключает ПЗУ. При вызове из редактора вводит всю строку и производит выход из редактора, иначе возвращает в A символ из файла. - -x3D06 NOP - JP x25EF - -;Адрес #3D0A. То же, что и #3D0D, но не переключает ПЗУ. - -x3D0A JP x244A - -;Адрес #3D0D. Подпрограмма вывода в файл данных. Символ поместите в аккумулятор. Используется также с адреса #3D0E. Обе точки входа переключают ПЗУ. - -x3D0D NOP -x3D0E JR x3D0A - -;Адрес #3D10. То же, что и #20F1. Переключает ПЗУ. - -x3D10 NOP - JR x3CFA - -;Адрес #3D13. Переход на подпрограмму вызова подпрограмм TR-DOS из машинного кода. Адрес является переключателем. - -x3D13 NOP - JR x3CFD - -;Адрес #3D16. Переход на подпрограмму обработки ошибок. Адрес является переключателем. - -x3D16 NOP - JP x2F69 - -;Адрес #3D1A. То же, что и #3D03, но не переключает ПЗУ. - -x3D1A CALL x3D21 ;создание системных переменных TR-DOS - PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик - JP x016C ;выполнение команды - -;Адрес #3D21. Создание области системных переменных TR-DOS, если ее нет. В HL помещается #5CC2. - -x3D21 CALL x31F3 ;проверка наличия области системных переменных - NOP - NOP - CALL C,x3D4C ;если ее нет, то создание ее - LD HL,#5CC2 ;загрузка в HL адреса переключателя ПЗУ на бейсик - RET ;возврат - - NOP - NOP - -;Адрес #3D2F. Переключение пзу на TR-DOS и переход на любой адрес. Адрес поместите на стек. - -x3D2F NOP - RET - -;Адрес #3D31. Вход в TR-DOS. - -x3D31 CALL x3D21 ;создание области системных переменных - PUSH HL ;помещение на стек адреса переключателя ПЗУ на бейсик - JP x0239 ;вход в TR-DOS - -;Адрес #3D38. Проверка наличия интерфейса-1. В случае его обнаружения происходит создание его системных переменных и в #5CF1 помещается 1. Для работы подпрограмма должна быть перемещена в любое место ОЗУ. - -x3D38 XOR A ;интерфейс-1 есть? - OUT (#F7),A - IN A,(#F7) - CP #1E - JR Z,x3D44 ;если да, то создание его системных переменных - CP #1F - RET NZ ;если нет, то возврат -x3D44 RST 8 ;создание системных переменных интерфейса-1 - DB #31 - LD A,1 ;по команде SAVE записывать 1 копию - LD (#5CEF),A - RET ;возврат - -;Адрес #3D4C. Создание системных переменных TR-DOS. При наличии интерфейса-1 перед созданием переменных TR-DOS создаются его переменные и в #5CEF помещается 1. В переменные TR-DOS помещаются: в #5CFA - #5CFC, #5CC8 - #5CCA, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. Подпрограмма портит ячейки памяти калькулятора. - -x3D4C XOR A ;выбор дисковода A: и сброс ВГ93 - OUT (#FF),A - IN A,(#F6) ;это ничего не дает - LD HL,x3D38 ;адрес подпрограммы проверки наличия интерфейса-1 - LD DE,#5C92 ;любой свободный адрес, ОЗУ - LD BC,#14 ;длина подпрограммы - LDIR ;перенос подпрограммы в ОЗУ - LD HL,x3D67 ;адрес возврата из подпрограммы - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - JP #5CA5 ;new запуск подпрограммы (переход на ret) - -;Адрес #3D67. Создание системных переменных TR-DOS. В переменные помещаются: в #5CFA - #5CFD, #5CC8 - #5CCB, #5C3A, #5D16 и #5D0C - #FF; в #5D17, #5D19, #5D18, #5D0F и #5D1F - 0; в #5CC2 - #C9. Также в системный регистр помещается #FF, а на ВГ93 выдается команда прерывания. - -x3D67 LD HL,x2F90 ;адрес возврата из пзу бейсика - PUSH HL ;помещение его на стек - LD HL,x3D2F ;адрес переключателя ПЗУ на TR-DOS - PUSH HL ;помещение его на стек - LD HL,#1655 ;адрес подпрограммы MAKE_ROOM из ПЗУ бейсика - PUSH HL ;помещение его на стек - LD HL,#5BFF ;адрес переключателя ПЗУ на бейсик - PUSH HL ;помещение его на стек - LD (HL),#C9 ;помещение в озу команды RET - LD HL,#5CB5 ;начальный адрес области системных переменных - LD BC,#70 ;длина ее - RET ;запуск подпрограммы MAKE_ROOM - -;Адрес #3D80. Перевод строки. Используется также с адреса #3D82 (печать символа из аккумулятора). Также эта подпрограмма ошибочно используется с адреса #3D8B подпрограммой #4F6. - -x3D80 LD A,#D ;символ ENTER -x3D82 PUSH HL ;сохранение регистров - PUSH BC - PUSH DE - PUSH AF ;сохранение символа - CALL x20F1 ;изменение памяти - POP AF ;восстановление символа -x3D8A CALL x3D94 ;печать символа - CALL x20F1 ;восстановление памяти - POP DE ;восстановление регистров - POP BC - POP HL - RET ;возврат - -;Адрес #3D94. Печать символа без изменения памяти. Символ поместите в аккумулятор. - -x3D94 RST #20 - DW #0010 - RET - -;Адрес #3D98. Восстановление с ожиданием INTRQ. Используется также с адреса #3D9A (отдача команды из рег.A с ожиданием INTRQ). - -x3D98 LD A,#08 ;new восстановление -x3D9A OUT (#1F),A -x3D9C PUSH HL ;сохранение HL - RST #20 ;проверка нажатия BREAK - DW #1F54 - JR C,x3DA5 ;если нажато, то сообщение *BREAK* - RST #20 - DW #1B7B -x3DA5 POP HL ;восстановление HL - IN A,(#FF) ;INTRQ поступил? - AND #80 - JR Z,x3D9C ;если нет, то повтор - RET ;возврат - -;Адрес #3DAD. Проверка наличия диска в дисководе. Никаких установок не требуется. - -x3DAD LD A,#08 ;new команда восстановления - CALL x3D9A ;выдача команды и ожидание INTRQ - LD DE,0 ;за #10000 проходов индексный сигнал должен измениться - IN A,(#1F) ;берем индексный сигнал для образца - AND 2 - LD B,A ;запоминаем его -x3DBA IN A,(#1F) ;берем его снова - AND 2 - CP B ;он изменился? - RET NZ ;если да, то возврат - INC DE ;следующая попытка - LD A,E ;попытки кончились - OR D - JR NZ,x3DBA ;если нет, то повтор - JP x16F9 ;обработка ошибки NO DISC - -;Адрес #3DC8. Выбор дисковода, определенного по умолчанию. Вход: можно установить время перемещения головки и режим дисковода согласно описанию команды #01. Выход: эти переменные могут быть изменены согласно этому описанию. Используется также с адресов: -;#3DCB - выбор дисковода. Номер задайте в рег.A, остальное как и для предыдущей подпрограммы. -;#3DFD - задержка в 725779 тактов. -;#3DFF - задержка любой нужной длительности. В рег.A установите число, определяющее длительность задержки. - -x3DC8 LD A,(#5D19) ;берем номер дисковода по умолчанию -x3DCB call x0901 -; LD (#5CF6),A ;установка номера выбранного дисковода - LD HL,#5D16 ;выбор дисковода - LD C,A - LD A,#3C - OR C - OUT (#FF),A - LD (HL),A - CALL x3E08 ;берем время перемещения головки дисковода - AND #80 ;бит 7 выключен? - JR Z,x3DFA ;если да, то инициализацию не проводим - CALL x3DAD ;проверка наличия диска в дисководе - CALL x3E16 ;определение времени перемещения головки дисковода - CALL x3E11 ;берем тип дисковода - CP #82 ;new в этой переменной #FF? - JR Z,x3DFA ;new если да, то не определяем его - PUSH HL ;сохраняем адрес переменной с типом дисковода - CALL x1FCA ;определение количества дорожек дисковода - POP HL ;восстановление адреса переменной типа - CP #50 ;установка этой переменной - LD A,0 - JR NZ,x3DF9 - LD A,#80 -x3DF9 LD (HL),A - -;Внимание, ошибка!!! Не проверяется количество сторон дисковода и предполагается, что он односторонний. - -x3DFA CALL x1E36 ;проверка индексной области диска -x3DFD LD A,#50 ;задержка в 327842 тактов -x3DFF LD C,#FF -x3E01 DEC C - JR NZ,x3E01 - DEC A - JR NZ,x3DFF - RET ;возврат - -;Адрес #3E08. Выборка времени перемещения головки текущего дисковода. Установите #5CF6. На выходе в A будет время перемещения головки дисковода, а в HL - адрес, по которому оно находится. Используется также с адреса #3E0B (выборка параметра дисковода; в DE поместите адрес таблицы параметров и установите #5CF6; На выходе в A будет параметр, в HL - адрес его ячейки). - -x3E08 LD DE,#5CFA ;берем адрес таблицы скоростей перемещения головок -x3E0B LD HL,(#5CF6) ;смещение равно номеру дисковода - ADD HL,DE ;вычисление адреса ячейки с параметром - LD A,(HL) ;берем оттуда параметр - RET ;возврат - -;Адрес #3E11. Выборка типа дисковода. Вход: установите #5CF6. Выход: в A тип дисковода, в HL - адрес его ячейки. - -x3E11 LD DE,#5CC8 ;берем адрес таблицы типов дисководов - JR x3E0B ;выборка параметра и возврат - -;Адрес #3E16. Определение времени перемещения головки дисковода. - -x3E16 CALL x3E08 ;берем адрес ячейки со временем перемещения головки - LD B,8 ;начнем с наименьшего - LD C,4 ;4 попытки -x3E1D LD (HL),B ;установка времени перемещения головки - LD A,#08 ;new восстановление - CALL x3D9A - LD A,#20 ;позиционирование на дорожку #20 - LD B,#B - CALL x3E44 - LD B,(HL) ;берем время перемещения головки - LD A,1 ;позиционирование на дорожку 1 с заданным временем - CALL x3E44 - IN A,(#1F) ;головка на дорожке 0? - AND 4 - JR NZ,x3E3F ;если да, то ошибка - XOR A ;позиционирование на дорожку 0 - CALL x3E44 - IN A,(#1F) ;головка на дорожке 0? - AND 4 - RET NZ ;если да, то возврат -x3E3F INC B ;увеличение времени перемещения головки на 1 - DEC C ;следующая попытка - RET Z ;если попытки кончились, то возврат - JR x3E1D ;повтор - -;Адрес #3E44. Позиционирование. В A поместите физический номер дорожки, в B - время перемещения головки и выберите сторону. - -x3E44 OUT (#7F),A ;помещение номера дорожки в регистр данных - LD A,B ;получение команды позиционирования - OR #18 - JP x0800 ;отдача команды из рег.A с ожиданием INTRQ - -;Внимание!!! Здесь нужно JP #3D9A, т.к. #800 гасит биты скорости перемещения головки дисковода, следовательно позиционирование работает только с быстрой скоростью. - -;Адрес #3E4C. Позиционирование. На входе в A должен быть физический номер дорожки, а в B - время перемещения головки дисковода. - -x3E4C OUT (#7F),A ;загрузка номера дорожки в регистр данных - PUSH BC ;сохранение времени перемещения головки дисковода - LD B,A ;головка уже спозиционирована? - IN A,(#3F) - CP B - POP BC ;восстановление времени перемещения головки - PUSH AF ;сохранение результата проверки - LD A,B ;получение команды позиционирования - OR #18 - CALL x0800 ;отдача команды из рег.A с ожиданием INTRQ - -;Внимание!!! Позиционирование осуществляется только с быстрой скоростью перемещения головки, т.к. в #800 используется AND #FC. Для исправления ситуации здесь нужно поставить JP #3D9A. - - POP AF ;восстановление результата проверки положения головки - RET Z ;если головка была спозиционирована, то возврат - PUSH BC ;сохранение времени перемещения головки? - CALL x3DFD ;задержка в 725779 тактов - POP BC ;восстановление времени перемещения головки - RET ;возврат - -;Адрес #3E63. Позиционирование головки дисковода. Вход: в рег.A установите логический номер требуемой дорожки и установите #5CCD. На выходе #5CCD обнуляется. Используется также с адреса: -;#3EA0 (задержка в 3135098 тактов). - -x3E63 LD C,A ;загрузка номера дорожки в регистр C - CALL x0A01 ;выбор верхней стороны диска - CALL x3E11 ;берем тип дисковода - AND 2 ;дисковод двухсторонний? - CALL NZ,x3EAA ;если да, то выбор стороны - PUSH BC ;сохраним номер дорожки - BIT 7,(HL) ;дисковод 40-дорожечный? - JR Z,x3E83 ;если да, то номера дорожек не меняем - BIT 0,(HL) ;используем только 40 дорожек? - JR NZ,x3E83 ;если нет, то номера дорожек не меняем - IN A,(#3F) ;берем номер текущей дорожки - CP C ;головка уже спозиционирована? - JR Z,x3E82 ;если да, то номера дорожек не меняем - RLCA ;делим номер текущей дорожки на 2 - OUT (#3F),A - LD A,C ;делим номер требуемой дорожки на 2 - RLCA -x3E82 LD C,A -x3E83 CALL x3E08 ;берем время перемещения головки дисковода - LD B,A - IN A,(#3F) ;головка уже спозиционирована? - CP C - PUSH BC ;сохраним номер требуемой дорожки - CALL NZ,x3DFD ;если головка не спозиционирована, то задержка в 725779 тактов - POP BC ;восстановление номера требуемой дорожки - LD A,C - CALL x3E4C ;позиционирование - POP BC ;восстановление номера требуемой дорожки - LD A,C ;установка регистра дорожки - OUT (#3F),A - LD A,(#5CCD) ;нужна задержка после операции? - OR A - RET Z ;если нет, то возврат - XOR A ;в следующий раз задержка не понадобится - LD (#5CCD),A -x3EA0 LD B,3 ;задержка в 3135098 тактов -x3EA2 LD A,#FF - CALL x3DFF - DJNZ x3EA2 - RET ;возврат - -;Адрес #3EAA. Выбор стороны при позиционировании. Вход: в C поместите логический номер дорожки и выберите верхнюю сторону диска. Выход: будет выбрана сторона, а в C будет физический номер дорожки. - -x3EAA LD A,C ;деление номера дорожки на 2 - OR A - RRA - LD C,A - RET NC ;если номер дорожки был четный, то возврат - JP x1FF6 ;иначе выбор нижней стороны диска - -;Адрес #3EB2. Проверка индексной области дорожки. Установите #5CD1 и поместите в B время перемещения головки дисковода. Выбирается верхняя сторона и при ошибке в #5D17 помещается #FF. В регистр H помещается номер текущей дорожки. Используется также с адреса: -;#3EE7 (обработка ошибки NO DISC). - -x3EB2 CALL x1FEB ;выбор верхней стороны диска -x3EB5 IN A,(#1F) ;берем состояние контроллера - AND #80 ;сохранение флага готовности - LD (#5CCD),A - IN A,(#3F) ;берем номер текущей дорожки - LD H,A ;на случай возврата - CALL x3C0D ;преобразование и выполнение команды из рег.B - -;Внимание!!! Перед CALL #3E44 в регистр B надо поместить время перемещения головки дисковода, иначе команда, которая выполнится перед проверкой зависит от содержимого регистра B на входе в подпрограмму и последствия могут быть весьма плачевными. - - LD C,#7F ;адрес регистра данных - LD D,1 ;число, определяющее количество попыток - DI ;запрет прерываний - LD A,#C0 ;чтение индексной области - OUT (#1F),A - PUSH BC ;сохранение адреса регистра данных - LD B,3 ;определяем количество попыток -x3ECE IN A,(#FF) ;берем состояние сигналов DRQ и INTRQ - AND #C0 - JR NZ,x3EF2 ;если какой-нибудь сигнал поступил, то начало чтения - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3ECE - DJNZ x3ECE ;повтор до конца попыток - POP BC ;восстановление адреса регистра данных - EI ;разрешение прерываний - LD A,#D0 ;остановка контроллера - OUT (#1F),A - LD A,(#5CD1) ;ошибку игнорировать? - -;Ошибка!!! Надо LD A,(#5D17). - - CP #FF - RET Z ;если да, то возврат -x3EE7 CALL x272B ;установка TAPE LOADING ERROR - LD A,#FF ;в следующий раз ошибку игнорировать - LD (#5D17),A - JP x271B ;обработка ошибки NO DISC -x3EF2 POP BC ;восстановление адреса регистра данных - IN H,(C) ;чтение первого байта -x3EF5 IN A,(#FF) ;ожидание какого-нибудь сигнала - AND #C0 - JR Z,x3EF5 - EI ;на случай возврата - -;Ошибка!!! Так можно потерять байт при чтении. - - RET M ;если поступил INTRQ, то возврат - DI ;запрет прерываний - IN A,(#7F) ;чтение байта - JR x3EF5 ;повтор - -;Адрес #3F02. В комментариях не нуждается. - -x3F02 LD (#5CFF),A - RET - -;Адрес #3F06. Похоже на предыдущее. - -x3F06 LD (#5D00),HL - RET - -;Адрес #3F0A. Запись сектора. Спозиционируйте головку и установите #5CFF и #5D00. - -x3F0A LD A,#A0 ;команда записи сектора - JR x3F10 ;переход к подпрограмме чтения / записи сектора - -;Адрес #3F0E. Загрузка сектора. Установите #5CFF и #5D00 и спозиционируйте головку. Используется также с адреса: -;#3F10 (загрузка/запись сектора; установите все для #3F0E плюс в A поместите команду чтения или записи сектора). - -x3F0E LD A,#80 ;команда чтения сектора -x3F10 LD (#5CFE),A ;установка команды -x3F13 LD D,#A ;10 попыток -x3F15 PUSH DE ;сохранение счетчика попыток - DI ;запрет прерываний - LD A,(#5CFF) ;установка сектора - INC A - OUT (#5F),A - call x0853 -; LD HL,(#5D00) ;берем адрес чтения/записи - LD C,#7F ;берем адрес регистра данных - LD A,(#5CFE) ;отдаем команду - OUT (#1F),A - CP #A0 ;была команда записи сектора? - PUSH AF - CALL Z,x3FBA ;если да, то запись данных - POP AF - CALL NZ,x3FD5 ;иначе чтение данных - POP DE ;восстановление счетчика попыток - EI ;разрешение прерываний - IN A,(#1F) ;берем состояние контроллера - LD B,A ;сохраняем его - AND #7F ;все в порядке? - RET Z ;если да, то возврат -x3F39 LD HL,x29D8 ;адрес сообщения READ ONLY - AND #40 ;запрещена запись? - JR NZ,x3F4B ;если да, то переход на обработку ошибки - LD A,B ;восстановление состояния контроллера - AND 4 ;была потеря данных? - JR Z,x3FA0 ;если нет, то обработка дисковых ошибок - DEC D ;следующая попытка - JR NZ,x3F15 ;если попытки не кончились, то повтор -x3F48 LD HL,x29E2 ;адрес сообщения DISC ERROR -x3F4B LD A,#D0 ;команда прерывания - OUT (#1F),A - LD A,B ;восстановление состояния контроллера - AND 1 ;контроллер был занят? - JP NZ,x3EE7 ;если да, то обработка ситуации NO DISC - IN A,(#3F) ;если ошибка произошла в секторе #A дорожки - OR A ;0, то возврат (игнорирование) - JR NZ,x3F5F - IN A,(#5F) - CP #A - RET Z -x3F5F PUSH HL ;сохранение адреса сообщения - CALL x1D97 ;очистка экрана - POP HL ;восстановление адреса сообщения - RST #18 ;печать сообщения - LD HL,x2A13 ;печать TRK: - RST #18 - IN A,(#3F) ;печать номера дорожки - CALL x1DA3 - LD HL,x2A18 ;печать SEC: - RST #18 - IN A,(#5F) ;печать номера сектора - CALL x1DA3 - LD HL,x29FE ;печать RETRY,ABORT,IGNORE? - RST #18 -x3F7B CALL x1052 ;ввод клавиши - CP "I" ;нажато I? - RET Z ;если да, то возврат - CP "R" ;нажато R? - JR Z,x3F94 ;если да, то перепозиционирование и повтор - CP "A" ;нажато A? - JR NZ,x3F7B ;если нет, то повтор ввода клавиши - CALL x272B ;установка TAPE LOADING ERROR - LD A,7 ;дисковая ошибка - LD (#5D0F),A - JP x01D3 ;завершение -x3F94 LD A,(#5CF5) ;перепозиционирование - CALL x3E63 - CALL x3EA0 ;задержка в 3135098 тактов - JP x3F13 ;повтор - -;Ошибка!!! Надо JP #3F13 для того, чтобы обновить число попыток. - -x3FA0 DEC D ;следующая попытка - JP Z,x3F48 ;если попытки кончились, то обработка DISC ERROR - PUSH DE ;сохранение счетчика попыток - CALL x3E08 ;берем время перемещения головки дисковода - AND 2 ;оно равно #A? - JR NZ,x3FAD - INC (HL) ;если нет, то увеличение его на 1 -x3FAD CALL x08A7 ;восстановление - LD A,(#5CF5) ;перепозиционирование - CALL x3E63 - POP DE ;восстановление счетчика попыток - JP x3F15 ;повтор - -;Адрес #3FBA. Запись данных на диск. Установите в HL адрес блока данных, в DE - число, определяющее количество циклов, за которое должна начаться запись, в C - адрес регистра данных контроллера и отдайте команду записи. Используется также с адреса #3FCA (то же, что и #3FBA, но без обработки NO DISC). - -x3FBA LD B,4 ;установка количества попыток -x3FBC IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR NZ,x3FD1 ;если да, то начинаем запись - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3FBC - DJNZ x3FBC - RET ;если попытки кончились, то возврат -x3FCA IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR Z,x3FCA ;если нет, то ожидание его - RET M ;если поступил INTRQ, то возврат -x3FD1 OUTI ;вывод байта из вашей области в регистр данных - JR x3FCA ;повтор - -;Адрес #3FD5. Чтение данных с диска. Все установки аналогично подпрограмме #3FBA, но отдать нужно команду чтения. Используется также с адpеса #3FE5 (то же, что и #3FD5, но без обработки NO DISC). - -x3FD5 LD B,4 ;установка количества попыток -x3FD7 IN A,(#FF) ;поступило что-нибудь? - AND #C0 - JR NZ,x3FEC ;если да, то начинаем читать - INC DE ;следующая попытка - LD A,E - OR D - JR NZ,x3FD7 - DJNZ x3FD7 - RET ;если попытки кончились, то возврат -x3FE5 IN A,(#FF) ;поступил какой-нибудь сигнал? - AND #C0 - JR Z,x3FE5 ;если нет, то ждем его - RET M ;если это INTRQ, то возврат -x3FEC INI ;чтение байта - JR x3FE5 ;повтор - -;АДРЕС: #3FF0 вывод в порт -x3FF0 out (c),a - ret - -;АДРЕС: #3FF3 чтение порта -x3FF3 in a,(c) - ret - -x3FF6 DISPLAY "Free space at ",$,": ",/D,#4000-$," byte(s)" - ds #4000-$,#FF - - SAVEBIN "../Build/scorp/NewROM3_Tr-Dos.bin",#0000,#4000 - - - - diff --git a/ProfRom_Disasm/rom4.a80 b/ProfRom_Disasm/rom4.a80 deleted file mode 100755 index 87acfab..0000000 --- a/ProfRom_Disasm/rom4.a80 +++ /dev/null @@ -1,1082 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #0E00 - -;#0000 reset computer -;#0004 *NOT USED* (#04 байта) -;#0008 rst #08 печать сообщения по номеру в BC -;#000D *NOT USED* (#03 байта) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#0B байт) -;#0020 rst #20 печать строки -;#0022 *NOT USED* (#0E байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#003B печать строки (rst #20) -;#004A *NOT USED* (#26 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#0103 reset computer -;#0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -;#0175 переменные монитора -;#02E8 проверка оригинальный/совместимый компьютер -;#02F4 установка переменных из NVRAM -;#0305 установка переменных из NVRAM/CMOS128 -;#0312 установка переменных по данным в CMOS -;#0315 установка переменных по данным в CMOS -;#036C запись переменных в CMOS и в NVRAM -;#0378 запись переменных в NVRAM -;#0398 запись переменных в CMOS -;#046E таблица для записи переменных в CMOS -;#04FF таблица для записи переменных в NVRAM -;#0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) -;#057F распаковка шрифта в rom 8 -;#059F запакованный шрифт -;#0A5A инициализация системы и печать сооветствующих сообщений -;#0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него -;#0CFA дескрипторы окон -;#0D32 копирайты -;#0E00 ROM-disk -;#4000 - - -;АДРЕС: #0000 reset computer -x0000 di - jp x0103 - -;АДРЕС: #0004 *NOT USED* (#04 байта) -x0004 ds #04 - -;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC -x0008 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #000D *NOT USED* (#03 байта) -x000D ds #03 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#0B байт) -x0015 ds #0B - -;АДРЕС: #0020 rst #20 печать строки -x0020 jr x003B - -;АДРЕС: #0022 *NOT USED* (#0E байт) -x0022 ds #0E - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 ei - reti - -;АДРЕС: #003B печать строки (rst #20) -x003B ex (sp),hl - push af -x003D ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x003D - pop af - ex (sp),hl - ret - -;АДРЕС: #004A *NOT USED* (#26 байт) -x004A ds #26 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) - db #40-ROMdisk/#100;количество свободных секторов в странице - db #00 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #04 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 ret - -;АДРЕС: #0103 reset computer -x0103 ld de,#5BEE - ld hl,x0111 - ld bc,#0011 - ldir - jp #5BEE -x0111 ld bc,#1FFD - ld a,#02 - out (c),a - ld hl,#010C ;включим плоскость 0 - ld l,(hl) - xor a - out (c),a ;rom 0/1 - jp x0000 ;reset - -;АДРЕС: #0122 копирование переменных монитора и проверка чтения портов #7FFD/#1FFD -x0122 ld hl,x0175 ;базовые переменные монитора - ld de,xE033 - ld bc,#0173 - ldir - ld hl,xE9F5 - ld (xE9F3),hl ;адрес блока описателей дисковода - ld hl,xE02C - ld (hl),#01 ;значение interleaving - ld de,#7F1F - ld c,#FD - ld a,#0E - ld b,#FF - out (c),a ;регистр #E AY - nop - in a,(c) ;читаем значение портов #7FFD и #1FFD - and #3F - cp #3F - ret z ;rom 1, ram #F, scr 5 (прочитано #FF ???) - cp #10 - ret nz ;rom 0, ram 8, scr 7 (то, что включено) - ld b,d ;bc=#7FFD - ld a,#0F ;rom 0, ram 7/F, scr 5 - out (c),a - ld b,e ;bc=#1FFD - ld a,#00 - out (c),a ;rom 0, ram 7, scr 5 - ld a,#0E - ld b,#FF - out (c),a ;регистр #E AY - nop - in a,(c) ;читаем значение портов #7FFD и #1FFD - and #3F - cp #0F - ld b,e ;bc=#1FFD - ld a,#10 - out (c),a ;rom 0, ram #F, scr 5 - ld b,d ;bc=#7FFD - ld a,#00 - out (c),a ;rom 0, ram 8, scr 7 - ret nz ; - set 5,(iy+#19) - ret - -;АДРЕС: #0175 переменные монитора -x0175: INCBIN "prof_roms/rom4_vars.bin" - -;АДРЕС: #02E8 проверка оригинальный/совместимый компьютер -;вых: nz - совместимый -; z - оригинал -x02E8 ld a,d - sub #FC - ret nz ;совместимый - ld a,e - sub #9D - ret z ;оригинал - ld a,e - sub #8B - ret ;nz - совместимый - -;АДРЕС: #02F4 установка переменных из NVRAM -x02F4 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 - call x0312 ;установка переменных по данным в NVRAM - ld hl,xDB69+#2E ;xDB97 - ld (xDDA7),hl - ld hl,x04FF - jr x0315 - -;АДРЕС: #0305 установка переменных из NVRAM/CMOS128 -x0305 ld hl,xE02E - bit 5,(hl) -x030A jr nz,x02F4 ;NVRAM найден - bit 6,(hl) - ret z ;CMOS отсутствует - call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) - -;АДРЕС: #0312 установка переменных по данным в CMOS -;вх: b - номер ячейки CMOS -; 7,c=1 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 2,c=0 -; 1,c=1 запись нескольких битов переменной по маске в (hl) -; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке -x0312 ld hl,x046E - -;АДРЕС: #0315 установка переменных по данным в CMOS -x0315 inc b ;b=#40 -x0316 ld c,(hl) - inc hl - bit 7,c - jr z,x0347 ;установка значения бита переменной - bit 2,c - jr nz,x0343 ;установка номера ячейки CMOS - bit 1,c - jr nz,x0325 ;установка значения битов переменной - ret - -;установка значения бита переменной -x0325 call x0419 ;определение адреса переменной (de - адрес) - bit 0,c - jr z,x033D ;запись переменной в память - ld c,(hl) - inc hl - ld a,(de) - cpl - or c - cpl ;сброс битов в переменной - ld (de),a - call x0459 ;чтение значения из буфера CMOS по адресу в B - and c ;выделение битов - ld c,a - ld a,(de) - or c - ld (de),a ;установка переменной - jr x0316 - -;запись переменной в ячейку CMOS -x033D call x0459 ;чтение значения из буфера CMOS по адресу в B - ld (de),a - jr x0315 - -;установка номера ячейки CMOS -x0343 ld b,(hl) - inc hl - jr x0316 - -;установка значения бита переменной -x0347 call x0419 ;определение адреса переменной (de - адрес) - push hl - ld a,c - and #07 - call x0410 ;получение маски для переменной (l - маска) - call x0459 ;чтение значения из буфера CMOS по адресу в B - and l - push af - ld a,c - and %00111000 - rrca - rrca - rrca - call x0410 ;получение маски для переменной (l - маска) - pop af - ld a,(de) - jr z,x0366 ;сброс бита в переменной - or l ;установка бита в переменной - jr x0368 -x0366 or l - xor l -x0368 ld (de),a ;запись переменной - pop hl - jr x0316 - -;АДРЕС: #036C запись переменных в CMOS и в NVRAM -x036C bit 6,(iy+#1A) - call nz,x0398 ;запись переменных в CMOS - bit 5,(iy+#1A) - ret z - -;АДРЕС: #0378 запись переменных в NVRAM -x0378 call x0445 ;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 - call x03B0 ;установка переменных в буфере для записи в NVRAM - ld hl,xDB69+#2E - ld (xDDA7),hl - ld hl,x04FF - call x03B3 ;установка переменных в буфере для записи в NVRAM - ld hl,xDB69 - ld de,#00FD - ld bc,#0001 - rst #30 - dw rom7_x0DD0 ;запись данных в NVRAM - db #07 - ret - -;АДРЕС: #0398 запись переменных в CMOS -x0398 call x0430 ;чтение CMOS[#10..#3E] в буфер xDB69 (вых: b=#3F) - call x03B0 ;установка переменных в буфере для записи в CMOS - ld hl,xDB69 ;запись буфера в CMOS - ld b,#10 -x03A3 ld a,(hl) - inc hl - rst #30 - dw rom7_x2023 ;запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F - db #07 - inc b - ld a,b - cp #3F - jr nz,x03A3 - ret - -;установка переменных в буфере для записи в CMOS -x03B0 ld hl,x046E -x03B3 inc b -x03B4 ld c,(hl) - inc hl - bit 7,c - jr z,x03E7 ;установка значения бита ячейки CMOS - bit 2,c - jr nz,x03E3 ;установка номера ячейки CMOS - bit 1,c - jr nz,x03C3 ;установка значения бита ячейки CMOS в буфере - ret - -;установка значения бита ячейки CMOS в буфере -;вх: b - номер ячейки CMOS -; 7,c=1 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 2,c=0 -; 1,c=1 запись нескольких битов переменной по маске в (hl) -; 0,c=0 запись переменной в ячейку CMOS, и переход к следующей ячейке -x03C3 call x0419 ;определение адреса переменной (de - адрес) - bit 0,c - jr z,x03DD ;запись переменной в ячейку CMOS - ld c,(hl) - inc hl - push hl - call x0459 ;чтение значения из буфера CMOS по адресу в B - cpl - or c - cpl ;сброс битов ячейки - ld l,a - ld a,(de) - and c ;выделение битов переменной - or l - pop hl - call x0456 ;запись значения в буфер CMOS по адресу в B - jr x03B4 -x03DD ld a,(de) - call x0456 ;запись значения в буфер CMOS по адресу в B - jr x03B3 - -;установка номера ячейки CMOS -;вх: 7,c=1 -; 2,c=1 -; b - номер ячейки CMOS -x03E3 ld b,(hl) - inc hl - jr x03B4 - -;установка значения бита ячейки CMOS -;вх: b - номер ячейки CMOS -; 7,c=0 -; 6,c=1 в (hl) слово-адрес -; =0 в (hl) байт-смещение от xE014 -; 5-3, номер бита в переменной -; 2-1, номер бита в ячейке CMOS -; -x03E7 call x0419 ;определение адреса переменной (de - адрес) - push hl - ld a,c - and %00111000 - rrca - rrca - rrca - call x0410 ;получение маски для переменной (l - маска) - ld a,(de) - and l ;выделение бита в переменной - push af - ld a,c - and #07 - call x0410 ;получение маски для переменной (l - маска) - call x0459 ;чтение значения из буфера CMOS по адресу в B - ld h,a ;значение ячейки CMOS - pop af - ld a,h - jr z,x0408 ;сброс бита в CMOS - or l ;установка бита в CMOS - jr x040A -x0408 or l - xor l -x040A call x0456 ;запись значения в буфер CMOS по адресу в B - pop hl - jr x03B4 - -;получение маски для переменной (l - маска) -;вх: a - номер бита -x0410 ld l,#01 - ret z -x0413 sla l - dec a - jr nz,x0413 - ret - -;определение адреса переменной -;вых: de - адрес -x0419 bit 6,c - ld e,(hl) - inc hl - jr z,x0422 - ld d,(hl) - inc hl - ret -; это байт-смещение от xE014 -x0422 bit 7,e - ld d,#00 - jr z,x0429 - dec d -x0429 push iy - ex (sp),hl - add hl,de - ex de,hl - pop hl - ret - -;чтение CMOS[#10..#3E] в буфер xDB69 -;вых: b=#3F -x0430 ld hl,xDB69 - ld (xDDA7),hl - ld b,#10 -x0438 rst #30 - dw rom7_x1F59 ;чтение ячейки CMOS - db #07 - ld (hl),a - inc hl - inc b - ld a,b - cp #3F - jr nz,x0438 - ret - -;чтение #FD байт NVRAM с адреса #0001 в буфер xDB69 -x0445 ld hl,xDB69 - ld (xDDA7),hl - ld de,#00FD - ld bc,#0001 - rst #30 - dw rom7_x0DB6 ;чтение данных из NVRAM - db #07 - ret - -;запись значения в буфер CMOS по адресу в B -x0456 scf - jr x045A -;чтение значения из буфера CMOS по адресу в B -x0459 or a -x045A push hl ;cy=1/0 - запись/чтение - ld hl,(xDDA7) ;адрес буфера CMOS - push bc - ld c,b - ld b,#00 - push af - add hl,bc - pop af - jr nc,x046A - ld (hl),a - jr x046B -x046A ld a,(hl) -x046B pop bc - pop hl - ret - -;АДРЕС: #046E таблица для записи переменных в CMOS и NVRAM -x046E db %10000100 - db #00 ;ячейка: +#00 - db %11000010 - dw xFFCC ;переменная: xFFCC, ячейка: +#01 - db %11000010 - dw xFFCD ;переменная: xFFCD, ячейка: +#02 - db %11000010 - dw xFFCE ;переменная: xFFCE, ячейка: +#03 - db %11000010 - dw xFFCF ;переменная: xFFCF, ячейка: +#04 - db %11000010 - dw xFFD0 ;переменная: xFFD0, ячейка: +#05 - db %11000010 - dw xFFD1 ;переменная: xFFD1, ячейка: +#06 - db %11000011 - dw xFFCB ;переменная: xFFCB - db %00000111 ;маска переменной - db %00000011 - db #39 ;переменная: xE014+#39 - db %00001100 - db #39 ;переменная: xE014+#39 - db %00010101 - db #39 ;переменная: xE014+#39 - db %00000110 - db #1C ;переменная: xE014+#1C - db %00001111 - db #1C ;переменная: xE014+#1C - db %10000100 - db #07 ;ячейка: +#07 - db %10000011 - db #18 ;переменная: xE014+#18 - db %00011111 - db %00010101 - db #1C ;переменная: xE014+#1C - db %00100110 - db #1C ;переменная: xE014+#1C - db %10000100 - db #08 ;ячейка: +#08 - db %10000010 - db #DE ;переменная: xE014-#22, ячейка: +#09 - db %10000010 - db #DF ;переменная: xE014-#21, ячейка: +#0A - db %10000100 - db #0A ;ячейка: +#0A - db %10000011 - db #E0 ;переменная: xE014-#20 - db %00111111 - db %10000100 - db #0B ;ячейка: +#0B - db %10000011 - db #E1 ;переменная: xE014-#1F - db %00111111 - db %10000100 - db #0C ;ячейка: +#0C - db %10000010 - db #05 ;переменная: xE014-#05, ячейка: +#0D - db %10000100 - db #0D ;ячейка: +#0D - db %10000010 - db #0A ;переменная: xE014-#0A, ячейка: +#0E - db %10000010 - db #0C ;переменная: xE014-#0C, ячейка: +#0F - db %10000011 - db #14 ;переменная: xE014+#14 - db %10011111 - db %00100101 - db #00 ;переменная: xE014+#00 - db %00110110 - db #19 ;переменная: xE014+#19 - db %10000100 - db #10 ;ячейка: +#10 - db %10000011 - db #12 ;переменная: xE014+#12 - db %00000111 - db %00101011 - db #13 ;переменная: xE014+#13 - db %10000100 - db #11 ;ячейка: +#11 - db %10000011 - db #15 ;переменная: xE014+#15 - db %10101111 - db %10000100 - db #12 ;ячейка: +#12 - db %10000011 - db #40 ;переменная: xE014+#40 - db %00011111 - db %10000100 - db #13 ;ячейка: +#13 - db %10000011 - db #41 ;переменная: xE014+#41 - db %00011111 - db %10000100 - db #14 ;ячейка: +#14 - db %10000011 - db #42 ;переменная: xE014+#42 - db %00011111 - db %10000100 - db #15 ;ячейка: +#15 - db %10000011 - db #25 ;переменная: xE014+#25 - db %01111111 - db %10000100 - db #16 ;ячейка: +#16 - db %10000011 - db #27 ;переменная: xE014+#27 - db %11101000 - db %10000100 - db #17 ;ячейка: +#17 - db %10000011 - db #2E ;переменная: xE014+#2E - db %00000111 - db %00000011 - db #2F ;переменная: xE014+#2F - db %00001100 - db #2F ;переменная: xE014+#2F - db %00010101 - db #2F ;переменная: xE014+#2F - db %10000100 - db #18 ;ячейка: +#18 - db %11000010 - dw xE11A ;переменная: xE11A, ячейка: +#19 - db %11000010 - dw xE11A+#01 ;переменная: xE11B, ячейка: +#1A - db %10000010 - db #58 ;переменная: xE014-#58, ячейка: +#1B - db %10000011 - db #57 ;переменная: xE014+#57 - db %01111111 - db %10000100 - db #1C ;ячейка: +#1C - db %10000011 - db #DD ;переменная: xE014-#23 - db %00000011 - db %10000100 - db #1D ;ячейка: +#1D - db #80 ;конец - -;АДРЕС: #04FF таблица для записи переменных в NVRAM -x04FF db %10000100 - db #00 ;ячейка: +#00 - db %10000010 - db #2A ;переменная: xE014+#2A, ячейка: +#01 - db %10000010 - db #2B ;переменная: xE014+#2B, ячейка: +#02 - db %10000010 - db #2C ;переменная: xE014+#2C, ячейка: +#03 - db %10000010 - db #2D ;переменная: xE014+#2D, ячейка: +#04 - db %10000010 - db #3A ;переменная: xE014+#3A, ячейка: +#05 - db %10000010 - db #3B ;переменная: xE014+#3B, ячейка: +#06 - db %10000010 - db #3D ;переменная: xE014+#3D, ячейка: +#07 - db %10000010 - db #26 ;переменная: xE014+#26, ячейка: +#08 - db #80 ;конец - -;АДРЕС: #0512 запись на диск сектора с конфигурацией (C. save Set Up to disk) -x0512 ld de,xDB69 - push de -;копируем подпрограмму в буфер - ld hl,x0549 - ld bc,#0100 - ldir -;установка переменных в буфере для записи на диск - ld hl,xDB69+#36 ;xDB9F - ld (xDDA7),hl - call x03B0 ;установка переменных в буфере для записи на диск - ld hl,xDB69+#64 ;xDBCD - ld (xDDA7),hl - ld hl,x04FF - call x03B3 ;установка переменных в буфере для записи на диск -;запись сектора с настройками на дискету - rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - pop hl - jr c,x0545 ;ошибка инициализации диска - ld bc,#0106 - ld de,#000F ;trk 0, sec #0F - rst #30 - dw rom7_x0229 ;R8DOS #06(6) запись группы секторов - db #07 - ret nc ;ошибок не было -x0545 rst #30 ;печать сообщения об ошибке - dw rom6_x06A6 ;печать сообщения об ошибке и продолжение работы монитора - db #06 ;(без возврата) -;процедура установки настроек из сектора диска (сохраняется на диск вместе переменными) -x0549 db "AM" ;сигнатура начала данных - ld a,(#00F1) ;rom 2 - cp #61 - jr z,x0557 ;проверка текущей страницы ПЗУ - ld a,#03 - out (#FE),a - ret -x0557 ld hl,xDB69+#36 ;xDB9F - ld (xDDA7),hl - rst #30 - dw rom4_x0312 ;установка переменных по данным в CMOS - db #04 - ld hl,xDB69+#64 ;xDBCD - ld (xDDA7),hl - ld hl,x04FF - rst #30 - dw rom4_x0315 ;установка переменных по данным в CMOS - db #04 - rst #20 - db #0D - db "AutoConfig Ok" - db #8D - ret - -;АДРЕС: #057F распаковка шрифта в rom 8 -x057F ld hl,xE483 ;адрес ret - rst #30 - dw rom6_x0D60 ;установка п/п jp xE483 по адресу xE338 - db #06 - ld hl,x059F ;адрес сжатого шрифта - ld de,xEBF5 ;буфер - push de - ld bc,#04BB ;размер - ldir ;кипируем в буфер - pop hl - ld de,xEBF5+#04BB ;xF0B0 - exx - ld hl,xF7C0 - rst #30 - dw rom6_x1108 ;распаковка блока - db #06 - ret - -;АДРЕС: #059F запакованный шрифт -x059F INCBIN "prof_roms/rom4_fnt.bin" - -;АДРЕС: #0A5A инициализация системы и печать сооветствующих сообщений -x0A5A bit 6,(iy+#14) - jr nz,x0A67 ;"теплый" сброс - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld a,#0C - rst #10 ;очистка окна -x0A67 ld hl,x0D24 - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db " ",#7F," " ;знак копирайта - dc "1993-1997 MOA Shadow Service Monitor" - bit 6,(iy+#14) - jr nz,x0B07 ;теплый сброс - ld hl,x0D08 - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db #1B,#00,#07 ;координаты печати - dc "* fast test of computer *" - ld hl,x0CFA - call x0CDF ;копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него - rst #20 - db " Computer :",#0D - db " RAM :",#0D - db " ROM :" - db #1B,#00,#8C ;координаты - call x0C8A ;вывод сообщения с названием компьютера - ld (ix+0),#01 ;crdY=1 - ld (ix+1),#0C ;crdX=12 - call x0C74 ;сообщение: 256 K - ld (ix+0),#02 ;crdY=2 - ld (ix+1),#0C ;crdX=12 - call x0C7B ;вывод сообщения с размером ПЗУ - call x0B3B ;инициализация SMUC -;обнуление bit4 спецификации дисководов -x0B07 ld a,(xFFCA) - push af - xor a -x0B0C ld (xFFCA),a - ld c,#11 ;R8DOS #11(17) чтение кода спецификации дисковода - push af - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - res 4,(hl) - pop af - inc a - cp #04 - jr c,x0B0C - pop af - ld (xFFCA),a -;установка координаты Y курсора в окне, при необходимости - ld de,xE0C9 - or a - push ix - pop hl - sbc hl,de - ret z - ld a,(ix+2) - add a,(ix+4) - inc a ;координата Y нижней строки окна - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld (ix+0),a ;координата Y курсора в окне - ret -;инициализация SMUC -x0B3B ld bc,#FEFE - in a,(c) - rrca - jr c,x0B58 ;cs не нажата - ld b,#EF - in a,(c) - bit 2,a - jr nz,x0B58 ;8 не нажата -; SMUC не проверяем - ld hl,xE02E ;cs+8 нажата - ld a,(hl) - and #07 - ld (hl),a - inc hl - ld a,(hl) - and #37 - ld (hl),a - ret -x0B58 bit 6,(iy+#14) - ret nz ;"теплый" сброс -;определение наличия SMUC, и вывод сообщения с версией - rst #30 - dw rom7_x2422 ;определение наличия SMUC - db #07 - ret c ;SMUC не найден - push de - ld hl,x0D16 - call x0CDF - rst #20 - dc " SMUC : " - pop de - call x0CC2 ;печать версии и ревизии SMUC -;определение наличия CMOS, и вывод сообщения - ld a,(ix+2) - add a,(ix+4) - inc a - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 - ld (ix+0),a - rst #30 ;определение наличия CMOS - dw rom7_x2047 ;a=#5A CMOS checksum error - db #07 ;a=#5B CMOS not found - ;a=#5C _число_ bytes CMOS found - call x0C5C ;печать сообщения - db #00 -;определение наличия NVRAM, и вывод сообщения - rst #30 ;определение наличия NVRAM - dw rom7_x0D62 ;a=#26 NVRAM not found - db #07 ;a=#27 NVRAM found - ;a=#33 NVRAM checksum error - call x0C5C ;печать сообщения - db #02 -;определение наличия interrupt controller, и вывод сообщения - call x0305 ;установка переменных из NVRAM/CMOS128 - rst #30 ;определение наличия interrupt controller - dw rom7_x1572 ;a=#24 interrupt controller not found - db #07 ;a=#25 interrupt controller found - call x0C5C ;печать сообщения - db #02 -;определение наличия последовательного порта/модема, и вывод сообщения - rst #30 - dw rom7_x15C7 ;определение наличия последовательного порта/модема - db #07 ;a=#28 modem not found - call x0C5C ;a=#29 modem found - db #02 ;a=#2A serial port not found -;индентификация HDD и печать информиции о винчестере - ld e,#00 - rst #30 - dw rom5_x30B9 ;идентификация жесткого диска - db #05 - jr nc,x0BB9 ;нет ошибок - call x0C5C ;печать сообщения с ошибкой - db #00 - jr x0C27 -x0BB9 ld a,%00101011 ;paper 5, ink 3 - ld (ix+6),a - rst #20 - dc " IDE/AT " -; печать размера винчестера - ld hl,(xE5A5) - ld de,#0000 - exx - ld bc,(xDFF2) - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - rst #30 - dw rom5_x2AA4 ;преобразование количества секторов в мегабайты - db #05 - ld a,#59 - or a - call x0C5C ;печать размера винчестера - db #00 -; печать названия(модели) винчестера - ld a,%00101000 ;paper 5, ink 0 - ld (ix+6),a - ld hl,xE5A9+#036 ;xE5DF - ld b,#14 - call x0C4D -; печать серийного номера винчестера - rst #20 - db #0D - dc "Serial Number: " - ld hl,xE5A9+#014 ;xE5BD - ld b,#0A - call x0C4D -; печать версии прошивки винчестера - rst #20 - db #0D - dc "Firmware rev.: " - ld hl,xE5A9+#02E ;xE5D7 - ld b,#04 - call x0C4D - ld a,%00101001 ;paper 5, ink 1 - ld (ix+6),a - rst #20 - db #8D -;монтирование подключенных образов -x0C27 bit 7,(iy+#1B) - jr z,x0C39 ;HDD не найден - set 5,(iy+#0B) - rst #30 - dw rom5_x2503 ;монтирование всех образов с винчестера - db #05 - res 5,(iy+#0B) -;проверка нажатия клавиши -x0C39 ld hl,xE028 - bit 6,(hl) - ret nz ;"теплый" сброс -x0C3F xor a - in a,(#FE) - and #1F - xor #1F - ret nz - dec hl - ld a,l - or h - ret z - jr x0C3F - -;печать сообщения из (hl), длиной не более b*2 -x0C4D ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,d - or a - ret z - rst #10 - ld a,e - or a - ret z - rst #10 - djnz x0C4D - ret - -;печать сообщения -;вх: a - номер сообщения -; db ? номер блока сообщений -x0C5C ld b,a - ex (sp),hl - ld c,(hl) - inc hl - ex (sp),hl - set 0,(iy+#05) ;десятичная система - ld a,%00101001 ;paper 5, ink 1 - jr c,x0C6B - ld a,%00101011 ;paper 5, ink 3 -x0C6B ld (ix+6),a ;атрибуты печати - rst #20 - dc " " - rst #08 - rst #20 - db #8D - ret - -;сообщение: 256 K -x0C74 rst #20 - dc "256 K" - ret - -;вывод сообщения с размером ПЗУ -x0C7B rst #30 ;для провреки размера ПЗУ: при 128k включится rom 2 и a=#00 - dw romA_x001B ;при 256k включится rom #A и a=#02 - db #0A - cp #02 - jr z,x0C74 ;256k ПЗУ - rst #20 - dc "128 K" - ret - -;вывод сообщения с названием компьютера -x0C8A ld de,(xDFFC) - rst #30 ;ЗАЧЕМ!!! можно напрямую - dw rom4_x02E8 ;проверка оригинальный/совместимый компьютер - db #04 - jr nz,x0CA9 - rst #20 - dc "Scorpion ZS 256 (R)" - ret -x0CA9 rst #20 - dc "Scorpion (R) compatible" - ret - -;печать версии и ревизии SMUC -;вх: d - номер версии -; e - номер ревизии -x0CC2 push de - rst #20 - dc "Ver. " - pop de - ld a,d - push de - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - rst #20 - dc ", rev. " - pop de - ld a,e - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - ret - -;АДРЕС: #0CDF копирование дескриптора окна в рабочуюю область и рисование рамки вокруг него -;вх: hl - дескриптор окна -x0CDF call x0CEA - ld hl,#0000 - rst #30 - dw rom5_x2054 ;печать рамки вокруг окна - db #05 - ret -;копирование дескриптора окна в рабочуюю область -x0CEA ld de,xE102 - push de - ld bc,#000D - ldir - pop ix - ld (xE3B7),ix - ret - -;АДРЕС #0CFA дескрипторы окон: -;окно высотой 3 знакоместа на всю ширину экрана -x0CFA db #00,#00 - db #05,#01 - db #03,#1E - db %00101001 - db #07,#90,%00101000 - db #06,#28,#20,#00 -;окно высотой 1 знакоместо на всю ширину экрана -x0D08 db #00,#00 - db #03,#01 - db #01,#1E - db %00101001 - db #03,#88,%00101000 - db #06,#28,#20,#00 -;окно высотой 9 знакомест на всю ширину экрана -x0D16 db #00,#00 - db #09,#01 - db #01,#1E - db %00101001 - db #03,#88,%00101000 - db #06,#28,#20,#00 -;окно высотой 1 знакоместо на всю ширину экрана -x0D24 db #00,#00 - db #01,#01 - db #01,#1E - db %00101001 - db #03,#80,%00101000 - db #06,#28,#20,#00 - -;АДРЕС #0D32 копирайты -x0D32 db "Copyright(c) 1993, 1997 by Andrew MOA",#00 - db "FidoNet 2:5030/25.1",#00 - db "E-mail: moa@deeds.spb.ru",#00 - db "Compiled: Jul 13 1997 14:24:13 (IBM PC, MA80 crossassembler)",#00 -x0DC2 ds ROMdisk-$,#00 - -;АДРЕС: #0E00 ROM-disk -x0E00 INCBIN "prof_roms/rom4_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM4.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom4.bat b/ProfRom_Disasm/rom4.bat deleted file mode 100755 index 9ba0cb7..0000000 --- a/ProfRom_Disasm/rom4.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom4.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom5.a80 b/ProfRom_Disasm/rom5.a80 deleted file mode 100755 index 864300d..0000000 --- a/ProfRom_Disasm/rom5.a80 +++ /dev/null @@ -1,7671 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #3300 - -;#0000 *NOT USED* (#08 байт) -;#0008 rst #08 печать сообщения по номеру в BC -;#000B *NOT USED* (#05 байт) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#0B байт) -;#0020 rst #20 печать строки -;#0025 *NOT USED* (#0B байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#3D байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (#55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#0103 печать строки (rst #20) -;#0110 опрос Break. cy=1 не нажата -;#011C опрос манипуляторов и печать курсора -;#0169 печать курсора мыши -;#0176 восстановление экрана под курсором мыши -;#021B опрос мыши -;#0260 опрос kempston joystick -;#02A1 обработка задержек для графического курсора -;#0344 определение попадания курсора мыши в границы текущего окна -;#0381 ожидание нажатия клавиш и обработка реакции на них -;#0385 обработка реакции на нажатия клавиш -;не используется #03C9 таблица адресов процедур графического курсора -;не используется #03DF загрузка в RAM8 графического изображения курсора №2 из hl -;не используется #03E4 загрузка в RAM8 графического изображения курсора №1 из hl -;не используется #03EF загрузка из RAM8 в память hl графического изображения курсора №2 -;не используется #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 -;не используется #03FF определение попадания курсора мыши в границы текущего окна -;не используется #040D опрос управления с заданными параматрами опроса манипуляторов -;не используется #041D опрос управления без опроса манипуляторов -;не используется #042C чтение координат курсора -;не используется #0431 проверка выхода курсора за нижнюю границу экрана -;#043B ОШИБКА!!!! вызов процедуры по номеру в C -;#044A таблица адресов дескрипторов меню -;#0468 сообщения для печати опций меню -;#0660 дескрипторы меню -;#08DD блок п/п определяющих доступность опций -;#08EF доступность опции K. kempston joystick -;не используется #098A проверка наличия раздела MFS на винчетере -;#09A0 процедуры обработки пунктов меню -;#0B4B ввод и сохранение значений времени/даты -;#0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) -;#0B9B ввод параметра текущей опции (число 0..255) -;#0BD0 ввод числа. в BC начальное значение -;#0BD9 ввод числа. в BC начальное значение -;#0BF3 ввод строки символов -;#0CAA печать числа bc в буфере ввода строки -;#0CB0 печать числа A в буфере ввода строки -;#0CB9 печать числа bc в буфере ввода строки -;#0CCA очистка буфера для ввода строки -;#0CDA печать числа bc в буфер hl -;#0CF6 установка и инициализация окна для ввода строки внизу экрана -;#0D02 очистка нижней строки окна меню -;#0D1A определение типа нажатой клавиши -;#0D2F определение адреса дескриптора текущего меню -;#0D42 приведение номера горячей клавиши опции к печатному символу -;#0D45 приведение номера горячей клавиши опции к печатному символу -;#0D52 определение адреса дескриптора опции -;#0D60 определение адреса с номером текущей опции текущего меню -;#0D6B печать текущего меню -;#0E6F выделение атрибутами заданной опции меню (по курсору) -;#0E8C снятие выделения атрибутами заданной опции меню (по курсору) -;#0E98 печать атрибутов заданной опции меню (по курсору) -;#0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? -;#0EB2 очистка текущего окна -;#0EB5 печать текущего меню монитора -;#0F51 вызов п/п обработки доступности опции -;#0F65 выделение старшего байта смещения -;#0F6D опредение адреса описания опции -;#0F95 перемещение курсора на следующую опцию (вниз) -;#0FA6 перемещение курсора на предыдущую опцию (вверх) -;#0FB6 определение опции под курсором мыши и переход на ее обработку -;#0FE3 получение адреса переменной и адреса маски для заданной опции -;#0FE9 получение адреса переменной и адреса маски для заданной опции -;#102E проверка диапазона числа -;#1033 процедура обработки нажатий клавиш -;#1047 печать количества цилиндров HDD -;#105B печать шапки меню монитора -;#1061 печать закодированного сообщения из hl -;#10C2 установка текущим окна: menu -;#10C7 Копирование каталога ROM-диска в ram 8 -;#10DB обработка пункта меню: R. ROM disk -;#1150 вывод окна выбора дисковода -;не используется #1181 ret -;#11A4 поиск сообщения по номеру в B[#01..#??] -;#11AF установка блока слов/сообщений по номеру в A -;#11CD печать сообщения по номеру в BC -;#122D блок слов 2 (#35 слов) -;#1353 блок слов 1 (#6A слов) -;#1554 блок слов 0 (#5E слов) -;#176D Блок сообщений 2 -;#181A Блок сообщений 1 -;#1906 Блок сообщений 0 -;не используется #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора -;#1A4C печать даты и времени в окне монитора -;#1AA6 читаем время в строку в формате ASCII -;#1AAF читаем время в строку в формате ASCII -;#1B05 чтение даты из буфера и расчет номера дня недели -;#1B18 читаем дату в строку в формате ASCII -;#1B21 читаем дату в строку в формате ASCII -;#1B93 таблица для вычисления кода месяца -;#1BAC расчет номера дня недели -;#1C0D работа с микросхемой CMOS (rst 8: db #89) -;#1C73 ввод текстовой строки в нижней строке экрана -;#1C84 инициализация окна ввода -;#1CB3 продолжение ввода строки (вых: hl адрес введенной строки) -;#1CB8 ввод строки (вых: hl адрес введенной строки) -;#1D10 добавление символа в вводимую строку -;#1D40 удаление символа перед курсором (delete) -;#1D5A перемещение курсора в водимой строке влево -;#1D64 перемещение курсора в вводимой строке вправо -;#1D70 позиционирование курсора в конец строки -;#1D98 печать вводимой строки на экране -;#1DB7 получение адреса под курсором в буфере строки -;#1DC2 смена режима вставки/замены при вводе строки -;#1DD6 очистка буфера вводимой строки -;#1DEC удаление кода возврата каретки из строки -;#1E13 помещение символа в строку и приращение адреса в буфере строк -;#1E18 циклическое приращение адреса в буфере введенных строк -;#1E22 получем адрес конца последней введенной строки -;#1E2D сохранение введенной строки в буфере последних введенных строк -;#1E5B копирование в буфер ввода предпоследней введенной строки -;#1E91 копирование строки из буфера введенных строк в буфер ввода строки -;#1EC0 копирование в буфер ввода следующей введенной строки -;#1EE1 проверка списка на наличие введенных строк -;#1EEE звонок с установкой бордюра -;#1EF1 печать каталога и выбор позиции в нем -;#2023 сложение hl=hl+a -;#2028 вызов процедуры по таблице, адрес которой в (xE9E1) -;#202C вызов процедуры по таблице, адрес которой в (xE9E1) -;#203C расчет размеров и печать окна под каталог ROM-disk -;#2054 печать рамки вокруг окна -;#205A установка текущим окна: вывод каталога -;#207A печать рамки вокруг окна -;#2133 коррекция координат и размеров окна -;#213F координаты Y и X полей для окна редактирования дампа -;#2168 таблица со списком процедур для окна редактирования дампа -;#2278 редактирование дампа памяти в окне монитора -;#245E переименование подраздела -;Не используется #247D ret -;#247E печать нового пути после выбора пунктов меню mount/dismount DRIVE -;#249C печать буквы дисковода или пути, если это образ -;#24CE обработка пункта меню: Z. dismount.../Z. mount... -;#24F0 монтирование образа к дисководу -;#2503 монтирование всех образов с винчестера -;#2536 монтирование/отключение подраздела/образа диска -;#25EB формирование в буфере xEBF5 списка образов коллекции -;#261A удаление всех подразделов -;#2620 формирование в буфере xEBF5 списка подразделов MFS -;#2671 сортировка записей в буфере xEBF5 по порядку местоположения -;#2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере -;#26AC проверка разрывов между подразделами/образами и создание пустой записи в буфере -;#2707 загрузка числа в регистры из памяти xE81B+1 -;#270D загрузка числа в регистры из памяти xE81B+8 -;#271A подсчет количества подразделов в MFS -;#2733 удаление всех разделов MBR -;#2739 формирование в буфере xEBF5 списка разделов MBR -;#2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) -;#28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения -;#28C6 уплотнение каталога MBR (удаление в буфере записей unused) -;не используется #2928 подсчет количества разделов/подразделов в каталоге -;#2936 подсчет пустых записей в каталоге разделов/подразделов -;#2960 сортировка дескрипторов подразделов -;#2990 вставляем новую запись в список записей -;#29C6 расчет адреса в каталоге -;#29D0 печать окна с образами дисков и выбор образа в нем -;#29D5 печать окна local partition information и выбор записи в нем -;#29D7 печать окна с подразделами и выбор подраздела в нем -;#29DC печать окна global partition information и выбор записи в нем -;#29F4 выбран некорректный раздел. продолжаем выбор -;#29FE блок процедур для печати окон со списком разделов/подразделов/образов -;#2AA4 преобразование количества секторов в мегабайты -;#2AC0 преобразование количества секторов в мегабайты -;#2ACC преобразование количества секторов в килобайты -;#2AE7 умножение dehl=de*#800 -;#2AF5 умножение dehl=de*2 -;#2B03 проверка первого байта записи каталога подраздела на #FF -;#2B05 проверка первого байта записи каталога подраздела на #FF -;#2B12 печать сообщения: Unused -;#2B8C поиск и печать сообщения из HL по типу в A -;#2BB8 подготовка к печати окна выбора раздела -;#2BCA создание раздела MFS -;#2C1F удаление раздела MBR -;#2C37 создание подраздела -;#2D2F ввод имени подраздела -;#2D45 удаление подраздела -;#2D5D сравнение (hl) с #FF, cy=1 если равны -;#2D63 формирование коллекции образов в подразделе TR-DOS -;#2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода -;#2E30 расчет количества образов исходя из размеров подраздела -;#2E5D сформируем пустой сектор MBR в буфере xE5A9 -;#2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS -;#2E85 ввод имени подраздела -;#2EA7 проверка введенного имени -;#2F10 выбор типа подраздела -;#2F5D запрос на сохранение сектора MBR, если были изменения -;#2F66 формирование и запись сектора MBR -;не используется #2F94 чтение сектора в буфер xE5A9 -;#2FA8 запрос на сохранение каталога MFS, если были изменения -;#2FB1 запись каталога MFS/подраздела -;#2FCA сравнение двух чисел в памяти по адресам в de и hl -;#2FCF обнуление переменной xE9EB -;#2FDB инкременит слова (xDD89)=(xDD89)+1 -;#2FE5 декремент слова (xDD89)=(xDD89)-1 -;#2FEF умножение bc=bc*#10 -;#3000 копирование из (hl) в (de) 4х байт -;#3005 загрузка числа в регистры из памяти +6 байт к адресу hl -;#300A загрузка числа в регистры из памяти +12 байт к адресу hl -;#300E загрузка числа в регистры из памяти -;#301C загрузка числа из регистров в память -;#302A декремент (hl)=(hl)-1 -;#3035 вычитание (hl)=(hl)-(de) -;#3047 инкремент числа по адресу hl -;#3052 сложение двух 4х байтных чисел -;#3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши -;#30B9 идентификация жесткого диска -;#30C6 печать окна для тестирования HDD -;#30F3 печать кода ошибки винчестера -;#3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -;#3163 печать текущего номера цилиндра -;#31AA удаление всех разделов MBR -;#31D4 неиспользуемая область -;#3200 каталог ROM-disk -;#3300 ROM-disk - - -;АДРЕС: #0000 *NOT USED* (#08 байт) -x0000 ds #08 - -;АДРЕС: #0008 печать сообщения по номеру в BC -x0008 jp x11CD - -;АДРЕС: #000B *NOT USED* (#05 байт) -x000B ds #05 - -;АДРЕС: #0010 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#0B байт) -x0015 ds #0B - -;АДРЕС: #0020 печать строки -x0020 ex (sp),hl - push af - jp x0103 - -;АДРЕС: #0025 *NOT USED* (#0B байт) -x0025 ds #0B - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#3D байт) -x0033 ds #3D - -;АДРЕС: #0070 переменные ROM-disk -x0070 db #33 ;смещение начала ром диска (в блоках по 256 байт) -x0071 db #0D ;количество свободных секторов в странице - db #32 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #05 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 ret - -;АДРЕС: #0103 печать строки (rst #20) -x0103 ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x0103 - pop af - ex (sp),hl - ret - -;АДРЕС: #0110 опрос Break. cy=1 не нажата -x0110 ld a,#FE - in a,(#FE) - rrca - ret c ;cs не нажата - ld a,#7F - in a,(#FE) - rrca - ret - -;АДРЕС: #011C опрос манипуляторов и печать курсора -;вых: cy=1 нажата fire на джойстике/кнопка мыши -; a=#80 - курсор изменил положение -; a=#81 - курсор в пределах текущего окна -; a=#82 - курсор мыши вне пределов текущего окна -; cy=1 нажата кнопка мыши -; a=#91 - нажата левая кнопка мыши -; a=#92 - нажата правая кнопка мыши -; a=#93 - нажата средняя кнопка мыши -; a>=#94 - курсор вне пределов текущего окна -; cy=0 fire на джойстике/кнопки мыши не нажаты -x011C or a - ld hl,xE03B - bit 7,(hl) - ret z ;мышь и джойстик отключены - ld c,#00 - bit 6,(hl) - call nz,x0260 ;опрос kempston joystick - bit 4,c - jr nz,x0149 ;нажата Fire - bit 5,(hl) - jr z,x0149 ;мышь отключена - call x021B ;опрос мыши - jr z,x015E ;кнопки не нажаты, печать курсора - push hl - call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (xE008),hl ;координаты курсора в окне - pop hl - ld a,c ;состояние кнопок мыши - or %10010000 - scf - bit 2,(hl) - ret z - set 3,a - ret -;нажата Fire kempstone joy/не нажата Fire kempstone joy при отключенной мыши -;hl=xE03B -;c - состояние кнопок джойстика -x0149 push hl - call x02A1 ;обработка задержек дял графического курсора - pop hl - scf - ld a,#80 - bit 0,(hl) - res 0,(hl) - jr nz,x0163 - inc a - bit 1,(hl) - res 1,(hl) - jr nz,x0163 -x015E call x0169 ;печать курсора мыши - or a - ret -x0163 bit 2,(hl) - ret z ;курсор в пределах текущего окна - ld a,#82 - ret - -;АДРЕС: #0169 печать курсора мыши -;вых: a - смещение курсора в знакоместе -; -x0169 set 7,(iy-#0A) ;курсор напечатан - ld ix,(xE12A) ;адрес данных курсора - ld hl,x01C3 ;п/п печати курсора мыши - jr x0186 - -;АДРЕС: #0176 восстановление экрана под курсором мыши -;вых: a - смещение курсора в знакоместе -; -x0176 bit 7,(iy+#27) - ret z ;мышь и джойстик отключены - ld hl,xE00A - bit 7,(hl) - ret z ;курсор не напечатан - res 7,(hl) - ld hl,x0212 ;п/п восстановления 3х байт экрана -x0186 ld (xE51C+1),hl - ld de,xDFD2 ;адрес буфера - ld hl,(xE03C) ;координаты курсора мыши - ld b,h - ld a,#C0 - sub b - ret z ;crd Y за пределами экрана - ret c ;crd Y за пределами экрана - cp #08 - jr c,x019B - ld a,#08 -x019B ld b,a ;высота для сохранения/восстановления экрана -;сохранение/восстановление экрана под курсором мыши -x019C push bc - ld c,l - ld b,h ;координаты - push bc - ld a,b - or a - rra - scf - rra - or a - rra - xor b - and #F8 - xor b - ld h,a - ld a,c - rlca - rlca - rlca - xor b - and #C7 - xor b - rlca - rlca - ld l,a ;адрес на экране - ld a,c - and #07 ;смещение в знакоместе - call xE51C ;сохраним/восстановим 3 байта - pop hl - inc h ;crd Y +1 - pop bc - djnz x019C - ret - -;печать одной линии курсора на экране с сохранением экрана в буфере -x01C3 push hl ;сохраним в буфере - ldi - ldi - ldi - pop hl - push de - push hl - ld b,(ix+0) - ld e,(ix+1) - ld h,#00 ;линия данных - ld c,(ix+#10) - ld d,(ix+#11) - ld l,#FF ;линия маски - or a - jr z,x01F0 ;курсор печатаем с начала знакоместа -x01E0 srl b ;ротация данных и маски - rr e - rr h - scf - rr c - rr d - rr l - dec a - jr nz,0x1E0 -x01F0 ex (sp),hl ;hl адрес на экране - ld a,c - and (hl) - or b - ld (hl),a ;1й байт - inc hl - ld a,l - and #1F - jr z,x020B ;край экрана - ld a,d - and (hl) - or e - ld (hl),a ;2й байт - inc hl - ld a,l - and #1F - jr z,x020B ;край экрана - pop de - push de - ld a,e - and (hl) - or d - ld (hl),a ;3й байт -x020B pop de - inc ix - inc ix - pop de - ret - -;восстановление одной линии экрана под курсором -x0212 ex de,hl - ldi - ldi - ldi - ex de,hl - ret - -;АДРЕС: #021B опрос мыши -;вых: c - состояние кнопок мыши -; z - нет нажатых кнопок -; -x021B push hl - ld bc,#FBDF ;по оси X - in a,(c) - ld b,#FF ;крайняя координата X - ld hl,xE12C ;предыдущее состояние портов мыши - ld de,xE03C ;координаты курсора мыши - call x0244 ;коррекция crd X курсора - ld b,#FF - in a,(c) - neg - ld b,#BF ;крайняя координата Y - ex de,hl - inc hl - inc de - call x0244 ;коррекция crd Y курсора - ld b,#FA - in a,(c) - cpl - and #07 - ld c,a ;нажатые кнопки - pop hl - ret -;коррекция crd X/Y курсора -x0244 push bc - ld b,(hl) - ld (hl),a - sub b ;a - +/- дельта crd - ex de,hl - pop bc - ret z ;не было перемещения - jp m,x0256 ;движение влево/вверх - add a,(hl) ;движение вправо/вниз - jr c,x0254 - cp b ;правый/нижний предел экрана - ld (hl),a - ret c -x0254 ld (hl),b ;достигли предела экрана - ret -x0256 neg ;движение влево/вверх - ld b,a ;ABS(delta Crd) - ld a,(hl) - sub b - ld (hl),a - ret nc - ld (hl),#00 ;достигли предела экрана - ret - -;АДРЕС: #0260 опрос kempston joystick -;вых: c - состояние кнопок джойстика -; -x0260 ld bc,#FF1F - in c,(c) - ld d,(iy+#2E) ;шаг перемещения - push hl - ld hl,(xE03C) ;crd Y/X - bit 1,c ;нажатие влево - jr z,x0276 - ld a,l - sub d - jr nc,x0275 - xor a -x0275 ld l,a -x0276 bit 0,c ;нажатие вправо - jr z,x0285 - ld a,l - add a,d - jr c,x0282 - cp #FC - jr c,x0284 -x0282 ld a,#FC ;крайняя координата X -x0284 ld l,a -x0285 bit 3,c ;нажатие вверх - jr z,x028F - ld a,h - sub d - jr nc,x028E - xor a -x028E ld h,a -x028F bit 2,c ;нажатие вниз - jr z,x029C - ld a,h - add a,d - cp #BE - jr c,x029B - ld a,#BE ;крайняя координата Y -x029B ld h,a -x029C ld (xE03C),hl - pop hl - ret - -;АДРЕС: #02A1 обработка задержек дял графического курсора -;вх: c - состояние кнопок джойстика -x02A1 ld hl,xE00A - bit 4,c - jr nz,x02D8 ;нажата fire на джойстике - bit 6,(hl) - jr nz,x02C0 ;установка задержки second wait при необходимости - bit 5,(hl) - jr z,x02B5 ;сброс задержек и установка курсора №1 - ld a,(hl) - and #1F - jr nz,x0322 ;уменьшение счетчика задержки -;сброс задержек и установка курсора №1 -x02B5 ld a,(hl) - and #80 - ld (hl),a -;установка курсора №1 -x02B9 ld hl,xE12E - ld (xE12A),hl - ret -;установка задержки second wait при необходимости -x02C0 bit 5,(hl) - jr nz,x02B5 ;сброс задержек и установка курсора №1 - ld a,(hl) - and #1F - jr z,x02B5 ;сброс задержек и установка курсора №1 - res 6,(hl) - set 5,(hl) - ld a,(iy+#2C) ;значение second wait -;установка величины задержки -x02D0 push af - ld a,#E0 - and (hl) - pop de - or d - ld (hl),a - ret -;если нажата fire на джойстике -x02D8 bit 5,(hl) - jr nz,x0312 ;установка и обработка задержки second debouncing - bit 6,(hl) - jr nz,x02FF - ld a,(hl) - and #1F - jr nz,x02EA - ld a,(iy+#2A) ;значение first debouncing - jr x02D0 ;установка величины задержки -x02EA dec (hl) - ld a,(hl) - and #1F - ret nz - set 6,(hl) - ld a,(iy+#2B) ;значение before repeat - call x02D0 ;установка величины задержки - ld hl,xE14E - ld (xE12A),hl - jr x0307 -x02FF ld a,(hl) - and #1F - jr nz,x0322 ;уменьшение счетчика задержки - call x02B9 ;установка курсора №1 -x0307 call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (xE008),hl ;координаты курсора мыши в текущем окне (в знакоместах) -x030D set 0,(iy+#27) - ret -;установка и обработка задержки second debouncing -x0312 bit 6,(hl) - jr nz,x031D - set 6,(hl) - ld a,(iy+#2D) ;значение second debouncing - jr x02D0 ;установка величины задержки -x031D ld a,(hl) - and #1F - jr z,x0324 -x0322 dec (hl) ;уменьшение счетчика задержки - ret -x0324 push hl - call x02B5 ;сброс задержек и установка курсора №1 - pop hl - ld a,#1F - call x02D0 ;установка величины задержки - call x0344 ;определение попадания курсора в границы текущего окна - or a - ld de,(xE008) ;предыдущие координаты курсора в текущем окне (в знакоместах) - ld (xE008),hl ;новые координаты курсора в текущем окне (в знакоместах) - sbc hl,de - ld a,h - or l - jr nz,x030D ;координаты изменились - set 1,(iy+#27) - ret - -;АДРЕС: #0344 определение попадания курсора мыши в границы текущего окна -;вых: во флагах состояние режима прерываний -; hl - координаты курсора мыши в окне в знакоместах окна -; -x0344 ld a,r - push af ;сохраним режим прерываний - di - res 2,(iy+#27) - ld hl,(xE03C) ;координаты курсора мыши - srl h - srl h - srl h - ld a,h - sub (ix+2) - jr c,x037B ;выше текущего окна - ld h,a ;координата Y в окне - cp (ix+4) - jr nc,x037B ;ниже текущего окна - ld a,(ix+3) - rlca - rlca - rlca - ld b,a - ld a,l - sub b - jr c,x037B ;левее окна - ld b,(ix+#0A) - ld l,#FF -x0371 inc l - sub b - jr nc,x0371 - ld a,l - cp (ix+#0B) - jr c,x037F ;в пределах окна -x037B set 2,(iy+#27) -x037F pop af - ret - -;АДРЕС: #0381 ожидание нажатия клавиш и обработка реакции на них -;вых: cy=0 a=#0D опция выбрана -; cy=1, a=#03 отмена с закрытием окна -; cy=1, a=a неиспользуемые комбинации. нет реакции -x0381 rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - -;АДРЕС: #0385 обработка реакции на нажатия клавиш -;вх: a - код нажатой клавиши -;вых: cy=0 a=#0D опция выбрана -; cy=1, a=#03 отмена с закрытием окна -; cy=1, a=a неиспользуемые комбинации. нет реакции -x0385 cp #82 - jr c,x03B0 ;a=[#00..#81] - jr z,x03AC ;a=#82 KempJoy fire вне окна - cp #91 - ret c ;a=[#83..#90] - cp #A0 - ccf - ret c ;a=[#A0..#FF] ???задел для кириллицы??? - bit 3,a ;a=[#91..#9F] mouse - jr nz,x03AC ;кнопка мыши вне окна - and #03 - jr z,x03A8 ;не нажата ни левая, ни правая кнопка мыши - cp #03 - jr z,x03A8 ;fire+cancel - rrca - jr nc,x03AC ;cancel на окне - call x03BD ;устанавливаем координаты в окне по курсору мыши - ccf - ld a,#0D - ret -x03A8 or #94 - scf - ret -x03AC ld a,#03 - scf - ret -x03B0 cp #80 - ret c ;a=[#00..#7F] - call x03BD ;устанавливаем координаты в окне по курсору KempJoy - cp #81 - ret c ;!!! ОШИБКА fire joy =#80 а не #81 - ld a,#0D - or a - ret -;устанавливаем координаты в окне по курсору мыши -x03BD push af - call x0344 ;определение попадания курсора мыши в границы текущего окна - ld (ix+0),h - ld (ix+1),l - pop af - ret - -;АДРЕС: #03C9 таблица адресов процедур графического курсора -x03C9 dw x041D ;опрос управления без опроса манипуляторов - dw x040D ;опрос управления с заданными параматрами опроса манипуляторов - dw x0385 ;обработка реакции на нажатия клавиш - dw x042C ;чтение координат курсора - dw x0431 ;проверка выхода курсора за нижнюю границу экрана - dw x03FF ;определение попадания курсора мыши в границы текущего окна - dw x03F4 ;загрузка из RAM8 в память hl графического изображения курсора №1 - dw x03E4 ;загрузка в RAM8 графического изображения курсора №1 из hl - dw x03EF ;загрузка из RAM8 в память hl графического изображения курсора №2 - dw x03DF ;загрузка в RAM8 графического изображения курсора №2 из hl - dw x08FB ;проверка наличия мыши - -;АДРЕС: #03DF загрузка в RAM8 графического изображения курсора №2 из hl -;вх: hl - адрес данных курсора -x03DF ld de,xE14E - jr x03E7 - -;АДРЕС: #03E4 загрузка в RAM8 графического изображения курсора №1 из hl -;вх: hl - адрес данных курсора -x03E4 ld de,xE12E -x03E7 ld bc,#0020 - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - ret - -;АДРЕС: #03EF загрузка из RAM8 в память hl графического изображения курсора №2 -;вх: hl - адрес в памяти -x03EF ld hl,xE14E - jr x03F7 - -;АДРЕС: #03F4 загрузка из RAM8 в память hl графического изображения курсора №1 -;вх: hl - адрес в памяти -x03F4 ld hl,xE12E -x03F7 ld bc,#0020 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret - -;АДРЕС: #03FF определение попадания курсора мыши в границы текущего окна -;вых: de - координаты курсора на экране -; cy =0 курсор мыши в пределах текущего окна -; cy =1 курсор мыши вне пределов текущего окна -x03FF call x0344 ;определение попадания курсора мыши в границы текущего окна - call x042C ;de - координаты курсора на экране - or a - bit 2,(iy+#27) - ret z ;курсор мыши в пределах текущего окна - scf - ret - -;АДРЕС: #040D опрос управления с заданными параматрами опроса манипуляторов -;вх: 7-5,b - новые значения установок графических манипуляторов -;вых: de - координаты курсора -x040D ld hl,xE03B - push hl - ld a,b - and #E0 - ld b,a - ld a,(hl) - push af - and #1F - or b - ld (hl),a - jr x0425 - -;АДРЕС: #041D опрос управления без опроса манипуляторов -;вых: de - координаты курсора -x041D ld hl,xE03B - push hl - ld a,(hl) - res 7,(hl) ;оключение манипуляторов - push af -x0425 rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - pop bc - pop hl - ld (hl),b - -;АДРЕС: #042C чтение координат курсора -;вых: de - координаты курсора -x042C ld de,(xE03C) - ret - -;АДРЕС: #0431 проверка выхода курсора за нижнюю границу экрана -;вх: hl - координаты графического курсора -;вых: (xE03C),hl - новые координаты курсора -x0431 ld a,#BF - cp h - jr nc,x0437 - ld h,a -x0437 ld (xE03C),hl - ret - -;АДРЕС: #043B ОШИБКА!!!! вызов процедуры по номеру в C -;вх: c - номер процедуры -x043B push hl - rst #30 - dw rom2_x300F ;чтение содержимого регистра ix основной программы - db #02 - ld hl,x03C9 - ld b,#00 ;ОШИБКА!!!! в B может передаваться параметр - sla c - add hl,bc - ex (sp),hl ;ОШИБКА!!!! - ret - -;АДРЕС: #044A таблица адресов дескрипторов меню -x044A dw x0660 ;окно 0 (main menu) - dw x06B6 - dw x06CD - dw x068B - dw x0882 - dw x06F8 - dw 0 - dw x0737 - dw x0797 - dw x0762 - dw x08B2 - dw x07C2 - dw x07F2 - dw x081D - dw x084D - -;АДРЕС: #0468 сообщения для печати опций меню -;+0 7-6, дополнительное смещение координаты Y -; 5,=1 в байтах +1/2 адрес отдельно п/п печати опции меню -; 4,=1 в байте +3 номер плоскости/страницы, если п/п в другой странице -; 5,=0 в байтах +1/2 номер группы сообщений и номер сообщения в ней -; 4,=1 (+3/4) адрес переменной с номером строки [0..3] -; +5 список строк в формате: +0 длина строки без учета данного байта -; +n строка в формате +0 флаги, +1/2 смещение -; 4,=0 (+3/4) смещение до переменной/блока переменных -; 2,=0 -> смещение в следующей ячейке однобайтное -; 2,=1 -> смещение в следующих ячейках двухбайтное -; 3,=1 -> это блок переменных и в следущих ячейках адрес до ячейки со смещением до нужной переменной -; 1-0,=01 два состояния опции, номера сообщений после маски -; =10 состояние опции это число по адресу переменной опции -; =11 1-4 состояния опции, по номеру в de -;+1 номер блока сообщений -;+2 номер сообщения в этом блоке -; -x0468 db %01000000 ;C. catalogue disk - db #01,#51 -x046B db %01000000 ;format НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #01,#4B -x046E db %01000000 ;D. Disk utility - db #01,#4D -x0471 db %01000000 ;F. format disk - db #01,#45 -x0474 db %01000000 ;Q. quick format - db #01,#68 -x0477 db %01000000 ;T. test disk - db #01,#4E -x047A db %01000110 ;Y. retry constant - db #01,#4C - dw #1FB7 ;#E014+#1FB7=#FFCB - db #01,#08 -x0481 db %00001101 ;I. side - db #01,#3B - dw #1FBC ;=#FFD0 - dw #FFCA - db #80 - db #3C,#3D -x048B db %00001101 ;R. track - db #01,#38 - dw #1FBC ;=#FFD0 - dw #FFCA - db #20 - db #39,#3A -x0495 db %01000010 ;L. interleaving - db #01,#52 - db #18 - db #01,#1B ;минимум и максимум -x049B db %00001101 ;S. side - db #01,#3B - dw #1FB8 ;=#FFCC - dw #FFCA - db #80 - db #3C,#3D -x04A5 db %01001101 ;T. track - db #01,#38 - dw #1FB8 ;=#FFCC - dw #FFCA - db #40 - db #39,#3A -x04AF db %01000111 ;D. disk drive - db #01,#33 - dw #1FB6 ;=#FFCA - db #34,#35,#36,#37 -x04B8 db %00001111 ;E. sector - db #01,#40 - dw #1FBC ;=#FFD0 - dw #FFCA - db #41,#42,#43,#44 -x04C3 db %00001111 ;P. speed - db #01,#1A - dw #1FB8 ;=#FFCC - dw #FFCA - db #47,#48,#49,#4A -x04CE db %01000001 ;S. sound - db #01,#31 - db #14,#01 - db #25,#26 -x04D5 db %00000001 ;A. autoconfig - db #02,#0C - db #14,#02 - db #05,#04 -x04DC db %01000001 ;R. reset RAM - db #01,#30 - db #14,#80 - db #25,#26 -x04E3 db %01000000 ;M. monitor - db #01,#0A -x04E6 db %01000000 ;R. reset - db #01,#29 -x04E9 db %00000010 ;L. string width - db #01,#27 - db #58 - db #00,#EA ;0..233 -x04EF db %00000010 ;W. page length - db #01,#28 - db #57 - db #00,#79 -x04F5 db %00000010 ;F. line feed - db #01,#2A - db #41 - db #00,#21 -x04FB db %01000010 ;C. carriage return - db #01,#2B -x04FE db %01000000 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #00,#21 -x0501 db %00000010 ;V. form feed - db #01,#2E -x0504 db %01000010 ;no search string НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #00,#21 -x0507 db %00000001 ;D. data - db #01,#23 - db #15,#80 - db #0E,#0F -x050E db %01000001 ;S. speed - db #01,#1A - db #15,#02 - db #1B,#1C -x0515 db %00000001 ;A. data bits - db #01,#1D - db #15,#04 - db #1E,#1F -x051C db %00000001 ;P. stop bits - db #01,#20 - db #15,#08 - db #21,#22 -x0523 db %01000001 ;I. interface - db #01,#17 - db #15,#01 - db #18,#19 -x052A db %01000000 ;P. printer - db #01,#0B -x052D db %01000000 ;computer НЕ ИСПОЛЬЗУЕТСЯ!!!! - db #01,#2C -x0530 db %10000000 ;0. previous menu - db #01,#07 -x0533 db %10000000 ;0. Continue program - db #01,#08 -x0536 db %01000000 ;G. magic button - db #01,#09 -x0539 db %01000000 ;B. Save & load - db #01,#2D -x053C db %01000000 ;M. Monitor - db #01,#0A -x053F db %01000001 ;S. print screen - db #01,#03 - db #12,#04 - db #0E,#0F -x0546 db %01000000 ;P. Print Screen - db #01,#03 -x0549 db %01000000 ;P. printer * 2 - db #01,#55 -x054C db %01000000 ;S. printer * 1 - db #01,#54 -x054F db %01000000 ;D. disk ... - db #01,#0C -x0552 db %01000000 ;S. Set Up - db #01,#04 -x0555 db %01000000 ;R. reset monitor - db #01,#53 -x0558 db %01000000 ;S. save ... - db #01,#5A -x055B db %01000000 ;L. load ... - db #01,#5B -x055E db %10000000 ;R. ROM disk - db #00,#5E -x0561 db %01000001 ;A. autostart - db #01,#69 - db #14,#04 - db #25,#26 -x0568 db %00000001 ;Z. compression - db #02,#0D - db #13,#20 - db #04,#05 -x056F db %00000010 ;?. degree - db #02,#0E - db #26,#01 - db #FF -x0575 db %01000001 ;V. Computer Speed - db #01,#58 - db #19,#40 - db #56,#57 -x057C db %01000010 ;N. NMI debouncing - db #01,#5D - db #25 - db #01,#80 ;1..127 -x0582 db %01000000 ;G. graphics manipulators - db #01,#5E -x0585 db %01000001 ;G. manipulators - db #01,#60 - db #27,#80 - db #26,#25 -x058C db %01000001 ;M. mouse - db #01,#61 - db #27,#20 - db #26,#25 -x0593 db %00000001 ;K. kempston joystick - db #01,#62 - db #27,#40 - db #26,#25 -x059A db %01000010 ;1. first debouncing - db #01,#63 - db #2A - db #01,#C8 -x05A0 db %00000010 ;2. before repeat - db #01,#64 - db #2B - db #01,#C8 -x05A6 db %00000010 ;3. second wait - db #01,#65 - db #2C - db #01,#C8 -x05AC db %00000010 ;4. second debouncing - db #01,#66 - db #2D - db #01,#C8 -x05B2 db %00000010 ;S. size of step - db #01,#67 - db #2E - db #01,#08 -x05B8 db %01000000 ;T. time & date - db #02,#01 -x05BB db %01000001 ;I. indicator - db #02,#03 - db #27,#08 - db #04,#05 -x05C2 db %01000010 ;H. hours - db #02,#06 - db #E4 ;=#1C - db #00,#18 -x05C8 db %00000010 ;M. minutes - db #02,#07 - db #E3 ;-#1D - db #00,#3C -x05CE db %00000010 ;S. seconds - db #02,#08 - db #E2 ;-#1E - db #00,#3C -x05D4 db %00000010 ;Y. years - db #02,#09 - db #E7 ;-#19 - db #00,#64 -x05DA db %00000010 ;O. months - db #02,#0A - db #E6 ;-#1A - db #01,#0D -x05E0 db %01000010 ;D. days - db #02,#0B - db #E5 ;-#1B - db #01,#20 -x05E6 db %01000000 ;P. save CMOS - db #01,#6A -x05E9 db %00000000 ;G. load CMOS - db #01,#6B -x05EC db %01000000 ;C. save Set Up to disk - db #01,#6C -x05EF db %01000000 ;H. Hard disk utility - db #02,#0F -x05F2 db %01100000 ;C. cylinders - dw x1047 ;печать количества цилиндров HDD -x05F5 db %00000010 ;H. head - db #02,#11 - db #E0 ;-#20 - db #01,#40 -x05FB db %00000010 ;S. sector - db #01,#40 - db #E1 ;-#1F - db #01,#40 -x0601 db %00000001 ;L. LBA mode - db #02,#35 - db #1C,#04 - db #04,#05 -x0608 db %01000001 ;M. TRDOS mirror - db #02,#36 - db #1C,#10 - db #05,#04 -x060F db %01000000 ;P. partition manager - db #02,#12 -x0612 db %01000000 ;A. delete all part - db #02,#14 -x0615 db %01000000 ;G. global part. table - db #02,#13 -x0618 db %01000000 ;V. partition information - db #02,#16 -x061B db %01000000 ;L. local part. table - db #02,#15 -x061E db %01000000 ;D. delete partition - db #02,#18 -x0621 db %01000000 ;C. create partition - db #02,#19 -x0624 db %00000000 ;N. rename partition - db #02,#32 -x0627 db %00000000 ;W. write to disk - db #02,#1A -x062A db %10000000 ;R. restore from disk - db #02,#1B -x062D db %01000000 ;A. auto detection hdd - db #02,#1C -x0630 db %00100011 ;D. mount on D: - dw x247E ;печать нового пути -x0633 db %00100010 ;C. mount on C: - dw x247E ;печать нового пути -x0636 db %00100001 ;B. mount on B: - dw x247E ;печать нового пути -x0639 db %01100000 ;A. mount on A: - dw x247E ;печать нового пути -x063C db %01000001 ;A. autostart - db #01,#69 - db #1C,#01 - db #26,#25 -x0643 db %00000011 ;V. from drive - db #01,#70 - db #DD ;-#23 - db #34,#35,#36,#37 -x064B db %00100000 ;Z. dismount... - dw x24CE ;печать нового названия пункта - db #0B,#80 -x0650 db %00000001 ;O. on start - db #02,#31 - db #1C,#02 - db #05,#04 -x0657 db %01000000 ;1. test - db #01,#06 -x065A db %00000000 ;2. test - db #01,#06 -x065D db %01000000 ;D. delete all part - db #02,#14 - -;АДРЕС: #0660 дескрипторы меню -;дескриптор опций -;+0,4-0 цифра/буква выбора опции 0-5/A-Z -; ,7-5 номер атрибутов печати из таблицы xEAED -;+1,3-2 старший байт смещения от x08DD до п/п определения доступности опции -; 5-4 старший байт смещения от x0468 параметры опции -; 7-6 старший байт смещения от x08DD до п/п обработки опции -;+2 младший байт смещения от x08DD до п/п определения доступности опции -;+3 младший байт смещения от x0468 параметры опции -;+4 младший байт смещения от x08DD до п/п обработки опции -x0660 db #07 ;количество опций в меню -1 - db #01,#02 ;меню: main menu - db 0*#20+#1A,%01000000,#6A,#CB,#E4 ;0. Continue program x0947/x0533/ x0AC1 - db 1*#20+#01,%01000000,#6A,#D1,#C1 ;B. Save & load x0947/x0539/x0A9E - db 2*#20+#0C,%01000000,#6F,#D4,#B2 ;M. Monitor x094C/x053C/ x0A8F - db 1*#20+#0F,%01000000,#64,#DE,#C3 ;P. Print Screen x0941/x0546/x0AA0 - db 1*#20+#03,%01000000,#6A,#06,#BC ;D. Disk utility x0947/x046E/x0A99 - db 1*#20+#07,%01010000,#5E,#87,#7A ;H. Hard disk utility x093B/x05EF/x0A57 - db 1*#20+#12,%01000000,#6A,#EA,#C2 ;S. Set Up x0947/x0552/x0A9F - db 1*#20+#15,%10010000,#3C,#0D,#9D ;V. Computer Speed x0919/x0575/x0B7A - -x068B db #07 ;количество опций в меню -1 - db #01,#5C ;меню: save & load of program - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#06,%01000000,#2F,#CE,#EC ;G. magic button x090C/x0536/ x0AC9 - db 1*#20+#12,%00000000,#6F,#F0,#D8 ;S. save ... x094C/x0558/x09B5 - db 1*#20+#19,%10010000,#6F,#00,#9D ;Z. compression x094C/x0568/x0B7A - db 1*#20+#16,%10010000,#48,#07,#A4 ;W. degree x0925/x056F/x0B81 - db 1*#20+#0B,%00000000,#6F,#F3,#DE ;L. load ... x094C/x055B/x09BB - db 1*#20+#00,%10000000,#6F,#F9,#9D ;A. autostart x094C/x0561/x0B7A - db 1*#20+#11,%00000000,#7B,#F6,#C3 ;R. ROM disk x0958/x055E/x09A0 - -x06B6 db #03 - db #01,#03 ;меню: print screen - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#12,%01000000,#6A,#E4,#A2 ;S. printer * 1 x0947/x054C/ x0A7F - db 1*#20+#0F,%01000000,#6A,#E1,#A3 ;P. printer * 2 x0947/x0549/ x0A80 - db 1*#20+#03,%00000000,#6A,#E7,#E4 ;D. disk ... x0947/x054F/x09C1 - -x06CD db #07 - db #01,#04 ;меню: Set Up - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#12,%10000000,#64,#D7,#9D ;S. print screen x0941/x053F/x0B7A - db 1*#20+#0F,%01000000,#6A,#C2,#BF ;P. printer x0947/x052A/x0A9C - db 1*#20+#0C,%01000000,#6A,#7B,#BD ;M. monitor x0947/x04E3/x0A9A - db 1*#20+#03,%01000000,#6A,#06,#BB ;D. Disk utility x0947/x046E/x0A98 - db 1*#20+#06,%01010000,#6A,#1A,#C0 ;G. graphics manipulat. x0947/x0582/x0A9D - db 1*#20+#13,%01010000,#57,#50,#BA ;T. time & date x0934/x05B8/x0A97 - db 2*#20+#11,%01000000,#6A,#ED,#73 ;R. reset monitor x0947/x0555/x0A50 - -x06F8 db #0B - db #01,#16 ;меню: Set Up printer - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#08,%10000000,#6A,#BB,#9D ;I. interface x0947/x0523/x0B7A - db 1*#20+#12,%10000000,#75,#A6,#9D ;S. speed x0952/x050E/x0B7A - db 1*#20+#00,%10000000,#75,#AD,#9D ;A. data bits x0952/x0515/x0B7A - db 1*#20+#0F,%10000000,#75,#B4,#9D ;P. stop bits x0952/x051C/x0B7A - db 1*#20+#03,%10000000,#6A,#9F,#9D ;D. data x0947/x0507/x0B7A - db 1*#20+#02,%10000000,#6A,#93,#A4 ;C. carriage return x0947/x04FB/x0B81 - db 1*#20+#05,%10000000,#6A,#8D,#A4 ;F. line feed x0947/x04F5/x0B81 - db 1*#20+#15,%10000000,#6A,#99,#A4 ;V. form feed x0947/x0501/x0B81 - db 1*#20+#0B,%10000000,#6A,#81,#A4 ;L. string width x0947/x04E9/x0B81 - db 1*#20+#16,%10000000,#6A,#87,#A4 ;W. page length x0947/x04EF/x0B81 - db 1*#20+#11,%01000000,#6A,#7E,#9B ;R. reset x0947/x04E6/x0A78 - -x0737 db #07 - db #01,#2F ;меню: Set Up monitor - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#0D,%10010000,#6A,#14,#A4 ;N. NMI debouncing x0947/x057C/x0B81 - db 1*#20+#11,%10000000,#6F,#74,#9D ;R. reset RAM x094C/x04DC/x0B7A - db 1*#20+#12,%10000000,#6A,#66,#98 ;S. sound x0947/x04CE/x0B75 - db 1*#20+#0F,%00010000,#4E,#7E,#C6 ;P. save CMOS x092B/x05E6/x09A3 - db 1*#20+#06,%00010000,#4E,#81,#CC ;G. load CMOS x092B/x05E9/x09A9 - db 1*#20+#02,%00010000,#6B,#84,#D2 ;C. save Set Up to disk x0948/x05EC/x09AF - db 1*#20+#00,%10000000,#6A,#6D,#9D ;A. autoconfig x0947/x04D5/x0B7A - -x0762 db #09 - db #01,#32 ;меню: Set Up disk utility - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 - db 1*#20+#13,%10000000,#6A,#3D,#9D ;T. track x0947/x04A5/x0B7A - db 1*#20+#12,%10000000,#6A,#33,#9D ;S. side x0947/x049B/x0B7A - db 1*#20+#0F,%10000000,#6A,#5B,#06 ;P. speed x0947/x04C3/x0AE3 - db 1*#20+#0B,%10000000,#6A,#2D,#A4 ;L. interleaving x0947/x0495/x0B81 - db 1*#20+#11,%10000000,#6A,#23,#9D ;R. track x0947/x048B/x0B7A - db 1*#20+#08,%10000000,#6A,#19,#9D ;I. side x0947/x0481/x0B7A - db 1*#20+#04,%10000000,#6A,#50,#0B ;E. sector x0947/x04B8/x0AE8 - db 1*#20+#18,%10000000,#6A,#12,#A4 ;Y. retry constant x0947/x047A/x0B81 - -x0797 db #07 - db #01,#4D ;меню: disk utility - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#03,%01000000,#6A,#47,#F8 ;D. disk drive x0947/x04AF/x0AD5 - db 1*#20+#02,%10000000,#6A,#00,#48 ;C. catalogue disk x0947/x0468/x0B25 - db 1*#20+#05,%10000000,#6A,#09,#33 ;F. format disk x0947/x0471/x0B10 - db 1*#20+#10,%10000000,#6A,#0C,#26 ;Q. quick format x0947/x0474/x0B03 - db 1*#20+#13,%10000000,#6A,#0F,#3A ;T. test disk x0947/x0477/x0B17 - db 1*#20+#00,%10010000,#6A,#D4,#9D ;A. autostart x0947/x063C/x0B7A - db 1*#20+#15,%01010000,#6A,#DB,#F0 ;V. from drive x0947/x0643/x0ACD - -x07C2 db #08 - db #02,#0F ;меню: hard disk utility - db 0*#20+#1A,%01000000,#AD,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#00,%00010000,#80,#D1,#F5 ;A. mount on A: x095D/x0639/x09D2 - db 1*#20+#01,%00010000,#80,#CE,#F1 ;B. mount on B: x095D/x0636/x09CE - db 1*#20+#02,%00010000,#80,#CB,#ED ;C. mount on C: x095D/x0633/x09CA - db 1*#20+#03,%00010000,#80,#C8,#E9 ;D. mount on D: x095D/x0630/x09C6 - db 1*#20+#19,%10010000,#80,#E3,#9D ;Z. dismount... x095D/x064B/x0B7A - db 1*#20+#0C,%10010000,#80,#A0,#9D ;M. TRDOS mirror x095D/x0608/x0B7A - db 1*#20+#0F,%01010000,#06,#A7,#0B ;P. partition manager x08E3/x060F/x09E8 - db 1*#20+#12,%01000000,#6A,#EA,#B6 ;S. Set Up x0947/x0552/x0A93 - -x07F2 db #07 - db #02,#13 ;меню: global partition table - db 0*#20+#1A,%01000000,#6A,#C8,#DC ;0. previous menu x0947/x0530/x0AB9 - db 1*#20+#0B,%01010000,#80,#B3,#05 ;L. local part. table x095D/x061B/x09E2 - db 1*#20+#15,%01010000,#6A,#B0,#00 ;V. partition info. x0947/x0618/x09DD - db 1*#20+#02,%01010000,#86,#B9,#3F ;C. create partition x0963/x0621/x0A1C - db 2*#20+#03,%01010000,#9A,#B6,#35 ;D. delete partition x0977/x061E/x0A12 - db 2*#20+#00,%01010000,#6A,#AA,#4E ;A. delete all part x0947/x0612/x0A2B - db 1*#20+#11,%01010000,#6A,#C2,#30 ;R. restore from disk x0947/x062A/x0A0D - db 3*#20+#16,%01010000,#A1,#BF,#58 ;W. write to disk x097E/x0627/x0A35 - - -x081D db #08 - db #02,#15 ;меню: local partition table - db 0*#20+#1A,%01000000,#6A,#C8,#D7 ;0. previous menu x0947/x0530/x0AB4 - db 1*#20+#06,%01010000,#A7,#AD,#30 ;G. global part. table x0984/x0615/x0A0D - db 1*#20+#15,%00010000,#6A,#B0,#FB ;V. partition info. x0947/x0618/x09D8 - db 1*#20+#02,%01010000,#90,#B9,#44 ;C. create partition x096D/x0621/x0A21 - db 1*#20+#0D,%01010000,#9A,#BC,#49 ;N. rename partition x0977/x0624/x0A26 - db 2*#20+#03,%01010000,#9A,#B6,#3A ;D. delete partition x0977/x061E/x0A17 - db 2*#20+#00,%01010000,#6A,#AA,#53 ;A. delete all part x0947/x0612/x0A30 - db 1*#20+#11,%01010000,#6A,#C2,#08 ;R. restore from disk x0947/x062A/x09E5 - db 3*#20+#16,%01010000,#A1,#BF,#62 ;W. write to disk x097E/x0627/x0A3F - -x084D db #09 - db #01,#6D ;меню: Set Up hard disk - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#00,%01010000,#6A,#C5,#6C ;A. auto detection hdd x0947/x062D/x0A49 - db 1*#20+#0E,%10010000,#6A,#E8,#9D ;O. on start x0947/x0650/x0B7A - db 1*#20+#02,%10010000,#6A,#8A,#51 ;C. cylinders x0947/x05F2/x0B2E - db 1*#20+#07,%10010000,#6A,#8D,#89 ;H. head x0947/x05F5/x0B66 - db 1*#20+#12,%10010000,#6A,#93,#89 ;S. sector x0947/x05FB/x0B66 - db 1*#20+#0B,%10010000,#6A,#99,#9D ;L. LBA mode x0947/x0601/x0B7A - db 1*#20+#1B,%01010000,#00,#EF,#8F ;1. test x08DD/x0657/x0A6C - db 1*#20+#1C,%01010000,#00,#F2,#93 ;2. test x08DD/x065A/x0A70 - db 2*#20+#03,%01010000,#00,#F5,#97 ;D. delete all part x08DD/x065D/x0A74 - -x0882 db #08 - db #01,#5F ;меню: Set Up graphics manipulators - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#06,%10010000,#6A,#1D,#9D ;G. manipulators x0947/x0585/x0B7A - db 1*#20+#0C,%10010000,#1E,#24,#9D ;M. mouse x08FB/x058C/x0B7A - db 1*#20+#0A,%10010000,#12,#2B,#9D ;K. kempston joystick x08EF/x0593/x0B7A - db 1*#20+#12,%10010000,#0C,#4A,#A4 ;S. size of step x08E9/x05B2/x0B81 - db 1*#20+#1B,%10010000,#0C,#32,#A4 ;1. first debouncing x08E9/x059A/x0B81 - db 1*#20+#1C,%10010000,#0C,#38,#A4 ;2. before repeat x08E9/x05A0/x0B81 - db 1*#20+#1D,%10010000,#0C,#3E,#A4 ;3. second wait x08E9/x05A6/x0B81 - db 1*#20+#1E,%10010000,#0C,#44,#A4 ;4. second debouncing x08E9/x05AC/x0B81 - -x08B2 db #07 - db #02,#02 ;меню: Set Up time & date - db 0*#20+#1A,%01000000,#6A,#C8,#DF ;0. previous menu x0947/x0530/x0ABC - db 1*#20+#07,%10010000,#57,#5A,#6E ;H. hours x0934/x05C2/x0B4B - db 1*#20+#0C,%10010000,#57,#60,#6E ;M. minutes x0934/x05C8/x0B4B - db 1*#20+#12,%10010000,#57,#66,#6E ;S. seconds x0934/x05CE/x0B4B - db 1*#20+#03,%10010000,#57,#78,#6E ;D. days x0934/x05E0/x0B4B - db 1*#20+#0E,%10010000,#57,#72,#6E ;O. months x0934/x05DA/x0B4B - db 1*#20+#18,%10010000,#57,#6C,#6E ;Y. years x0934/x05D4/x0B4B - db 1*#20+#08,%10010000,#57,#53,#84 ;I. indicator x0934/x05BB/x0B61 - -;АДРЕС: #08DD блок п/п определяющих доступность опций -;вых: cy =1 опция недоступна -; -;АДРЕС: #08DD блок п/п обработки опций -;вых: -; -x08DD bit 7,(iy+#1A) ;доступность опции 1. test - jr x0938 - -x08E3 bit 7,(iy+#1B) ;доступность опции P. partition manager - jr x0938 - -x08E9 bit 7,(iy+#27) ;доступность опции S. size of step - jr x0938 - -;АДРЕС: #08EF доступность опции K. kempston joystick -x08EF call x08FB ;доступность опции K. kempston joystick - or a - ret - -x08F4 ccf ;НЕ ИСПОЛЬЗУЕТСЯ!!!! - ret nc - res 6,(iy+#27) - ret - -x08FB push bc ;доступность опции M. mouse - ld bc,#FADF - in a,(c) - pop bc - and #38 - cp #38 - ret nc - res 5,(iy+#27) - ret - -x090C scf ;доступность опции G. magic button - bit 4,(iy-#02) - ret z ;48k - ld a,(iy-#01) - and #13 - jr x0945 - -x0919 ld a,(xE02D) ;определение доступности турбо-режима - rlca - ccf - ret - -x091F bit 5,(iy-#02) ;48k? - jr x0945 - -x0925 bit 5,(iy+#13) ;доступность опции W. degree - jr x0938 - -x092B call x091F ;доступность опции P. save CMOS - ret c - bit 5,(iy+#1A) - ret nz - -x0934 bit 6,(iy+#1A) ;доступность опции T. time & date -x0938 ret nz - scf - ret - -x093B bit 5,(iy+#1A) ;доступность опции Hard disk utility - jr x0938 - -x0941 bit 1,(iy+#12) ;доступность опции Print Screen -x0945 ret z - scf -x0947 ret - -x0948 call x091F ;доступность опции C. save Set Up to disk - ret c - -x094C ld a,(xC063) ;доступность опции Monitor - or a - jr x0945 - -x0952 bit 0,(iy+#15) ;доступность опции параметров принтера - jr x0938 - -x0958 call x10C7 ;доступность опции R. ROM disk - jr x0938 - -x095D bit 7,(iy+#1C) ;доступность монтирования образов - jr x0938 - -x0963 call x2936 ;доступность опции C. create partition - ld hl,#0003 - or a - sbc hl,de - ret - -x096D call x2936 ;доступность опции C. create partition - ld hl,#003F - or a - sbc hl,de - ret - -x0977 call x2936 ;доступность опции D. delete partition - ld a,e - or d - jr x0938 - -x097E bit 6,(iy+#1C) ;доступность опции W. write to disk - jr x0938 - -x0984 bit 6,(iy+#1C) ;доступность опции G. global part. table - jr x0945 - -;АДРЕС: #098A проверка наличия раздела MFS на винчетере -;вых: z - нет раздела MFS/либо нет винчестера -; nz - есть раздел MFS -x098A xor a - bit 7,(iy+#1B) - ret z ;проверка геометрии винчестера не пройдена - bit 7,(iy+#1C) - ret nz ;на винчестере есть раздел MFS - res 7,(iy+#0B) ;меню mount - push bc - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - pop bc - xor a - ret - -;пункт меню: R. ROM disk -x09A0 jp x10DB ;обработка пункта меню: R. ROM disk - -;пункт меню: P. save CMOS -x09A3 rst #30 - dw rom4_x036C ;запись переменных в CMOS и в NVRAM - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: G. load CMOS -x09A9 rst #30 - dw rom4_x0305 ;установка переменных из NVRAM/CMOS128 - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: C. save Set Up to disk -x09AF rst #30 - dw rom4_x0512 ;запись на диск сектора с конфигурацией (C. save Set Up to disk) - db #04 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: S. save ... -x09B5 rst #30 - dw rom6_x097E ;сохранение zs-snap (S. save ... snap) - db #06 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: L. load ... -x09BB rst #30 - dw rom6_x0976 ;загрузка zs-snap (S. load ... snap) - db #06 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: D. disk ... (сохранение экрана на диск) -x09C1 rst #30 - dw rom6_x067F ;сохранение экрана пользователя на диск - db #06 - ret - -;пункт меню: D. mount on D: -x09C6 ld a,#03 - jr x09D3 -;пункт меню: C. mount on C: -x09CA ld a,#02 - jr x09D3 -;пункт меню: B. mount on B: -x09CE ld a,#01 - jr x09D3 -;пункт меню: A. mount on A: -x09D2 xor a -x09D3 call x24F0 ;монтирование образа к дисководу - jr x09E0 ;печать текущего меню монитора - -;пункт меню: V. local partition infomation -x09D8 call x29D5 - jr x09E0 ;печать текущего меню монитора - -;пункт меню: V. global partition infomation -x09DD call x29DC ;печать окна global partition information и выбор записи в нем -x09E0 jr x0A54 ;печать текущего меню монитора - -;пункт меню: L. local part. table -x09E2 call x2F5D ;запрос на сохранение сектора MBR, если были изменения - -;пункт меню: R. restore from disk чтение каталога подразделов -x09E5 call x0B86 - -;пункт меню: P. partition manager (local) -x09E8 rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x09F6 ;найден - cp #63 - jr z,x0A01 ;нет подраздела MFS - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 -x09F6 res 6,(iy+#1C) ;сброс признака изменения раздела - call x2620 ;формирование в буфере xEBF5 списка подразделов MFS - ld a,#0D - jr x0A0A -x0A01 res 6,(iy+#1C) ;сброс признака изменения раздела - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - ld a,#0C -x0A0A jp x0AA1 - -;пункт меню: G. global partition table/R. restore from disk чтение каталога разделов -x0A0D call x0B86 - jr x0A01 - -;пункт меню: D. delete global partition -x0A12 call x2C1F - jr x0A54 ;печать текущего меню монитора - -;пункт меню: D. delete local partition -x0A17 call x2D45 ;удаление подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: C. create global partition -x0A1C call x2BCA - jr x0A54 ;печать текущего меню монитора - -;пункт меню: C. create local partition -x0A21 call x2C37 ;создание подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: N. rename local partition -x0A26 call x245E ;переименование подраздела - jr x0A54 ;печать текущего меню монитора - -;пункт меню: A. delete all global partition -x0A2B call x2733 - jr x0A54 ;печать текущего меню монитора - -;пункт меню: A. delete all local partition -x0A30 call x261A ;удаление всех подразделов - jr x0A54 ;печать текущего меню монитора - -;пункт меню: W. write to disk (запись MBR на винчестер) -x0A35 call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x0A54 ;отмена записи - call x2F66 ;формирование и запись сектора MBR - jr x0A0D ;перечитаем его и в меню - -;пункт меню: W. write to disk (запись каталога MFS на винчестер) -x0A3F call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x0A54 ;оказ от записи. возврат в меню - call x2FB1 ;запись каталога MFS - jr x09E5 ;чтение каталога подразделов - -;пункт меню: A. auto detection hdd (запуск идентификации HDD) -x0A49 ld e,#01 - call x30B9 ;идентификация жесткого диска - jr x0A54 ;печать текущего меню монитора - -;пункт меню: R. reset monitor -x0A50 xor a - ld (xEAF5+#0A),a ;xEAFF испортим память -;печать текущего меню монитора -x0A54 jp x0EB5 - -;пункт меню: H. Hard disk utility -x0A57 xor a - res 7,(iy+#0B) ;меню mount - res 7,(iy+#1C) - bit 7,(iy+#1B) - jr z,x0A96 - call x2739 ;формирование в буфере xEBF5 списка разделов MBR - xor a - jr x0A96 - -;пункт меню: 1. test (тест только на чтение) -x0A6C rst #30 - dw rom7_x2105 ;тестирование HDD (1. test) (тест только на чтение) - db #07 ;возврат в текущее меню монтора - -;пункт меню: 2. test (тест на чтение/запись) -x0A70 rst #30 - dw rom7_x20F1 ;тестирование HDD (2. test) (тест на чтение/запись) - db #07 ;возврат в текущее меню монтора - -;пункт меню: D. delete all part (удаление всех разделов MBR) -x0A74 rst #30 ;!!! можно вызвать нарямую !!! - dw rom5_x31AA ;удаление всех разделов MBR - db #05 - -;пункт меню: R. reset printer -x0A78 ld hl,#0000 - ld (xE067),hl - ret - -;пункт меню: S. printer * 1 -x0A7F scf -;пункт меню: S. printer * 2 -x0A80 ld hl,xE029 - set 5,(hl) - jr nc,x0A89 - res 5,(hl) -x0A89 rst #30 - dw rom2_x08D7 - db #02 - jr x0A54 ;печать текущего меню монитора - - -;пункт меню: M. Monitor -x0A8F rst #30 - dw 0AEBh - db #02 - -x0A93 inc a ;(a=#0E) S. Set Up hard disk -x0A94 inc a -x0A95 inc a -x0A96 inc a ;(a=#0B) H. Hard disk utility -x0A97 inc a ;(a=#09) T. time & date -x0A98 inc a ;(a=#09) D. Disk utility -x0A99 inc a ;(a=#08) D. Disk utility -x0A9A inc a ;(a=#07) M. monitor -x0A9B inc a -x0A9C inc a ;(a=#05) P. printer -x0A9D inc a ;(a=#04) G. graphics manipulator -x0A9E inc a ;(a=#03) B. Save & load -x0A9F inc a ;(a=#02) S. Set Up -x0AA0 inc a ;(a=#01) P. Print Screen -x0AA1 push af - ld hl,(xE033) ;a - номер нового меню - ld a,(xDDFF) ;номер текущего меню - ld (hl),a - inc hl - ld (xE033),hl - pop af - ld (xDDFF),a -x0AB1 jp x0EB5 ;печать текущего меню монитора - -;выход из меню: L. local partition table -x0AB4 call x2FA8 ;запрос на сохранение каталога MFS, если были изменения - jr x0ABC - -;выход из меню: G. global partition table -x0AB9 call x2F5D ;запрос на сохранение сектора MBR, если были изменения - -;вызов предыдущего меню: 0. previous menu -x0ABC call x0B86 - jr x0AB1 ;печать текущего меню монитора - -;выход из монитора: 0. Continue program -x0AC1 rst #30 ;обработка 0. Continue program - dw rom2_x382E ;ожидание отжатия всех клавиш - db #02 - rst #30 - dw rom2_x013A ;выход из монитора - db #02 - -;пункт меню: G. magic button -x0AC9 rst #30 - dw rom2_x36C3 ;запись стандартного Magic-файла - db #02 - -;пункт меню: V. from drive (изменение диска автозапуска) -x0ACD ld hl,xDFF1 ;с какого диска делать автостарт - ld bc,#0004 ;мин/макс - jr x0AF8 ;циклическое изменение многовариантных параметров монитора - -;пункт меню: D. disk drive (смена текущего дисковода) -x0AD5 ld hl,xFFCA - ld bc,#0004 - call x0AF8 ;циклическое изменение многовариантных параметров монитора - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, если к нему примонтирован образ - db #02 - ret - -;пункт меню: P. speed (изменение скорости работы текущего дисковода) -x0AE3 ld hl,xFFCC - jr x0AEB - -;пункт меню: E. sector (изменение размера сектора текущего дисковода) -x0AE8 ld hl,xFFD0 -x0AEB ld bc,(xFFCA) - ld b,#00 ;номер текущего дисковода - add hl,bc - ld a,(hl) - and #E0 - ld b,a - ld c,#04 - -;циклическое изменение многовариантных параметров монитора -;вх: hl - адрес пееременной -; c - максимальное значение+1 -; b - минимальное значение -; -x0AF8 ld a,(hl) - and #03 - inc a - cp c - jr c,x0B00 - xor a -x0B00 or b - ld (hl),a - ret - -;пункт меню: Q. quick format (быстрое форматирование текущего диска) -x0B03 set 7,(iy+#13) - call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана - rst #30 - dw rom6_x04E5 ;быстрое форматирование текущей дискеты (очистка каталога) - db #06 - jr x0B2B ;;печать текущего меню монитора - -;пункт меню: F. format disk (форматирование текущего диска) -x0B10 ld hl,xE027 - set 7,(hl) - jr x0B1C - -;пункт меню: T. test disk (проверка текущего диска) -x0B17 ld hl,xE027 - res 7,(hl) -x0B1C call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана - rst #30 - dw rom6_x03A9 ;форматирование/проверка текущей дискеты - db #06 - jr x0B2B ;;печать текущего меню монитора - -;пункт меню: C. catalogue disk (вывод каталога текущего диска) -x0B25 rst #20 - db #8C - rst #30 - dw rom6_x0249 ;вывод каталога текущего дисковода (на экран/принтер) - db #06 -x0B2B jp x0EB5 ;печать текущего меню монитора - -;пункт меню: C. cylinders (установка цилиндров) -x0B2E ld hl,x0EB5 ;печать текущего меню монитора - push hl - ld bc,(xDFF2) ;значение Cylinders HDD (2 байта) - ld a,#07 -x0B38 call x0BD9 ;ввод числа. в BC начальное значение - ret c ;омена ввода - ld a,e - or d - ld a,#0C - jr z,x0B38 ;ввели ноль. повтор ввода - ld (xDFF2),de ;новое значение Cylinders HDD (2 байта) - rst #30 - dw rom7_x1F08 ;проверка геометрии винчестера - db #07 - ret - -;АДРЕС: #0B4B ввод и сохранение значений времени/даты -x0B4B res 3,(iy+#27) ;гасим индикатор времени - call x0B9B ;ввод параметра текущей опции (число 0..255) - set 3,(iy+#27) - jr c,x0B2B ;завершение по break/cancel - ld hl,xDFF6 ;бефер занчений времени/даты - rst #30 - dw rom7_x1FB2 ;запись в CMOS времени и даты - db #07 - jr x0B2B ;завершение ввода - -;АДРЕС: #0B61 смена параметра опции на противоположное с обновлением меню (ON/OFF, normal/trubo и т.п.) -;вх: bc - адрес описания опции (x0468) -; -x0B61 call x0B7A - jr x0B2B ;печать текущего меню монитора - -;пункт меню: H. head; S. sector -x0B66 call x0B9B ;ввод параметра текущей опции (число 0..255) - jr c,x0B2B ;отмена ввода. печать текущего меню монитора - rst #30 - dw rom7_x1F2D ;расчет произведения головок и секторов - db #07 - rst #30 - dw rom7_x1F08 ;проверка геометрии винчестера - db #07 - jr x0B2B ;печать текущего меню монитора - -;пункт меню: S. sound -x0B75 ld a,#FF - ld (xE004),a ;глушим звук - -;АДРЕС: #0B7A смена параметра опции на противоположное (ON/OFF, normal/trubo и т.п.) -;вх: bc - адрес описания опции (xNNNN) -x0B7A call x0FE3 - ld a,(de) - xor (hl) - ld (de),a - ret - -;АДРЕС: #0B81 ввод и сохранение значений опций -;вх: bc - адрес описания опции (xNNNN) -x0B81 call x0B9B ;ввод параметра текущей опции (число 0..255) - jr x0B2B ;печать текущего меню монитора - -;АДРЕС: #0B86 -x0B86 ld de,xDE08 - ld hl,(xE033) - xor a - sbc hl,de - add hl,de - jr z,x0B97 - dec hl - ld (xE033),hl - ld a,(hl) -x0B97 ld (xDDFF),a - ret - -;АДРЕС: #0B9B ввод параметра текущей опции (число 0..255) -;вх: bc - адрес описания опции (x0468) -;вых: cy=1 завершение по break/cancel -; -x0B9B res 5,(iy+#0E) ;ввод строки параметров - call x0FE3 ;получение адреса переменной опции - ld c,(hl) ;минимальное значение - inc hl - ld b,(hl) ;максимальное значение - ld a,(de) ;текущее значение - call x0CB0 ;печать числа A в буфере ввода строки - push de - push bc - ld a,#07 ;сообщение: enter number -x0BAD call x0BF3 ;ввод строки символов - jr c,x0BCD ;завершение ввода по break/cancel - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - jr nz,x0BAD ;неудачное преобразование. продолжаем ввод - ld a,d - or a - ld a,#0C ;сообщение: out of range - jr nz,x0BAD ;слишком большое число. продолжаем ввод - pop bc - push bc - ld a,e - call x102E ;проверка диапазона числа - ld a,#0C ;сообщение: out of range - jr c,x0BAD ;слишком большое число. продолжаем ввод - pop bc - ld a,e - pop de - ld (de),a ;меняем переменную - ret -;завершение ввода по break/cancel -x0BCD pop bc - pop de - ret - -;АДРЕС: #0BD0 ввод числа. в BC начальное значение -;вх: bc - начальное число -; hl - параметры окна ввода -;вых: cy=1 отмена ввода -; cy=0 число введено -; de - введенное число -x0BD0 ld (xE9EF),hl ;параметры окна ввода - set 5,(iy+#0E) - jr x0BDD - -;АДРЕС: #0BD9 ввод числа. в BC начальное значение -;вх: bc - начальное число -;вых: cy=1 отмена ввода -; cy=0 число введено -; de - введенное число -x0BD9 res 5,(iy+#0E) -x0BDD push af - call x0CAA ;печать числа bc в буфере ввода строки - pop af - push de - push bc -x0BE4 call x0BF3 ;ввод строки символов - jr c,x0BCD ;отмена ввода - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - jr nz,x0BE4 ;неудачное преобразование (не число/слишком большое) - pop bc - pop af - or a - ret - -;АДРЕС: #0BF3 ввод строки символов -;вх: a-номер сообщения в группе 0 (для нижней строки) -;вых: cy=1 завершение ввода по break/cancel -; cy-0 завершение ввода по enter/fire cursor -; hl - адрес первого введенного символа в буфере -; z - этот символ перевод строки -; -x0BF3 call x0C0B ;ввод строки - jr nc,x0C04 ;завершение ввода по enter - call x0D1A - jr nc,x0C04 ;завершение ввода по fire cursor - cp #03 - scf - ret z ;завершение ввода по break/cancel - xor a - jr x0BF3 ;продолжение ввода строки -x0C04 rst #30 - dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа - db #02 - scf - ccf - ret -;ввод строки -;вх: a-номер сообщения в группе 0 (для нижней строки) -;вых: cy=0 завершение ввода по enter -; cy=1 -> a=3 break/cancel -; cy=1 -> a=a нет эффекта от нажатия -x0C0B rst #30 - dw rom2_x2FFB ;установка текущим окна: ввод числа - db #02 - or a - jr z,x0C69 ;продолжим ввод строки - call x0C22 ;установка параметров окна для ввода строки в меню монитора - rst #30 ;!!! ОШИБКА. можно вызвать напрямую - dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) - db #05 - jr nc,x0C1F ;cy=0 выход по enter - call x0D1A ;определение типа нажатой клавиши - ret c ;отмена/нет эффекта -;завершение ввода по enter/fire cursor -x0C1F or a - ld a,#06 ;сообщение: _Working ... -;установка параметров окна для ввода строки в меню монитора -;вх: a - номер сообщения в группе 0 (для нижней строки) -x0C22 push af - ld b,a ;номер сообщения в группе 0 - call x10C2 ;установка текущим окна: menu - ld a,(ix+6) - push af ;сохраним атрибуты - ld a,(xE115) - ld (ix+6),a ;атрибуты печати сообщения - ld (ix+0),#17 ;координаты печати - ld (ix+1),#00 - rst #20 - dc " " ;пробел - ld c,#00 - rst #08 ;печать сообщения - ld a,#2B - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - pop af - ld (ix+6),a ;восстановим атрибуты - rst #30 - dw rom2_x2FFB ;установка текущим окна: ввод числа - db #02 - bit 5,(iy+#0E) - jr nz,x0C6E ;ввод имени раздела HDD - ld (ix+3),#16 ;crd X окна - ld (ix+6),#4E ;атрибуты %01001110 - ld l,#08 ;ширина в символах - call x0CA0 ;установка ширины окна в знакоместах и символах - ld a,(iy-#09) ;crd Y опции меню -x0C62 ld (ix+2),a ;crd Y окна - rst #20 - db #8C ;очистка окна - pop af - ret -;продолжение ввода строки -x0C69 rst #30 - dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - db #05 - ret -;ввод имени раздела HDD -x0C6E ld (ix+6),#71 ;атрибуты %01110001 - ld hl,(xE9EF) - push hl - call x0C8F ;l=l*6/8 - ld a,(xE0F3+#03) ;xE0F6 координата X окна со списком разделов HDD - add a,l - ld (ix+3),a ;crd X окна - pop hl - ld l,h - call x0CA0 ;установка ширины окна в знакоместах и символах - ld a,(xE0F3) ;координата Y курсора в окне - ld l,a - ld a,(xE0F3+#02) ;xE0F5 координата Y окна - add a,l - jr x0C62 -;вычисление l=l*6/8 -x0C8F push de - ld de,#0006 - ld h,d - rst #30 - dw rom2_x0E85 ;умножение ahl=hl*de (0,(iy+#0E)=1 результат более 16 бит) - db #02 - ld b,#03 -x0C9A srl l - djnz x0C9A - pop de - ret -;установка ширины окна в знакоместах и символах -;вх: l - ширина окна в символах -x0CA0 ld (ix+#0B),l - call x0C8F - ld (ix+5),l - ret - -;АДРЕС: #0CAA печать числа bc в буфере ввода строки -;вх: bc - число -x0CAA push bc - call x0CB9 - pop bc - ret - -;АДРЕС: #0CB0 печать числа A в буфере ввода строки -;вх: bc - число -x0CB0 push bc - ld c,a - ld b,#00 - call x0CB9 - pop bc - ret - -;АДРЕС: #0CB9 печать числа bc в буфере ввода строки -;вх: bc - число -x0CB9 push de - push bc - call x0CCA ;очистка буфера для ввода строки - inc hl - ld de,#2E0A - ld a,#03 - pop bc - call x0CDA ;печать числа bc в буйфер hl - pop de - ret - -;АДРЕС: #0CCA очистка буфера для ввода строки -;вых: hl - адрес буфера для ввода строки -x0CCA ld b,#2B - ld hl,xDE17 - push hl - ld (xDE15),hl -x0CD3 ld (hl)," " - inc hl - djnz x0CD3 - pop hl - ret - -;АДРЕС: #0CDA печать числа bc в буйфер hl -;вх: hl - адрес буфера для печати числа -; bc - число -; d - символ перед числом -; e - делитель для выделения разряда числа -; a - кол-во разрядов в числе -x0CDA ld (hl),d - inc hl -x0CDC ld (xE3BC),hl ;адрес в буфере печати - set 6,(iy+#09) ;печать в буфер - ld (iy+#07),a ;минимум разрядов в числе при переводе в ASCII - ld (iy+#08),"0" - ld (iy+#10),e ;делитель для выделения разряда числа - rst #30 - dw rom2_x1673 ;печать числа bc /в буфер - db #02 - res 6,(iy+#09) - ret - -;АДРЕС: #0CF6 установка и инициализация окна для ввода строки внизу экрана -;вых: ix - адрес дескриптора окна монитора: ввод строки внизу экрана -x0CF6 rst #30 - dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - db #02 - ld a,#0C - or a - rst #30 - dw rom5_x1C84 ;инициализация окна ввода - db #05 - ret - -;АДРЕС: #0D02 очистка нижней строки окна меню -x0D02 call x10C2 ;установка текущим окна: menu - ld a,(xE110) - ld (ix+6),a ;атрибуты для печати опции меню - ld (ix+0),#17 ;crd Y курсора - ld (ix+1),#00 ;crd X курсора - ld a,#2B - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - ret - -;АДРЕС: #0D1A определение типа нажатой клавиши -;вх: a - код нажатой клавиши -;вых: cy=0 - это подтверждение ввода (entre/fire cursor) -; =1 -> a=3 break/cancel -; =1 -> a=a нет эффекта от нажатия -x0D1A ld c,a - cp #82 - jr z,x0D29 ;ss+space - cp #80 - ret z ;ss - cp #91 - ret z ;mouse fire - res 3,a ;исключаем прочие комбинации - cp #92 ;mouse cancel -x0D29 ld a,c - scf - ret nz - ld a,#03 - ret - -;АДРЕС: #0D2F определение адреса дескриптора текущего меню -;вых: hl - адрес дескриптора меню +1 -; a = (+0) количество опций в меню -1 (номер последней опции) -x0D2F ld hl,x044A - ld a,(xDDFF) - add a,a - add a,l - ld l,a - jr nc,x0D3B - inc h ;hl адрес в таблице -x0D3B ld a,(hl) - inc hl - ld h,(hl) - ld l,a ;hl адрес описателя окна - ld a,(hl) - inc hl - ret - -;АДРЕС: #0D42 приведение номера горячей клавиши опции к печатному символу -;вх: hl - адрес начала опций в дескрипторе меню -; c - номер опции -;вых: a - печатный символ -; hl - адрес дескриптора заданной опции +2 -; e =(+1) опции -; -x0D42 call x0D52 - -;АДРЕС: #0D45 приведение номера горячей клавиши опции к печатному символу -;вх: a =[#00..#19] -> номер буквы A..Z -; =[#1A..#1F] -> цифра 1..5 -;вых: a - печатный символ -x0D45 and #1F - cp #1A - jr nc,x0D4F - inc a - or #40 - ret -x0D4F add a,#16 - ret - -;АДРЕС: #0D52 определение адреса дескриптора опции -;вх: hl - адрес начала опций в дескрипторе меню -; c - номер опции -;вых: hl - адрес дескриптора заданной опции +2 -; a =(+0) опции -; e =(+1) опции -; -x0D52 ld a,c - add a,a - add a,a - add a,c - add a,l - ld l,a - jr nc,x0D5B - inc h -x0D5B ld a,(hl) - inc hl - ld e,(hl) - inc hl - ret - -;АДРЕС: #0D60 определение адреса с номером текущей опции текущего меню -;вых: hl - адрес ячейки с номером опции -; -x0D60 ld hl,xDE00 - ld a,(xDDFF) - add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #0D6B печать текущего меню -x0D6B call x10C2 ;установка текущим окна: menu -;печать названия меню - ld a,(xE111) ;печать названия окна - ld (ix+6),a ;атрибуты печати - ld (ix+0),#03 ;crd Y =3 - rst #20 ;вывод с выравниванием - db #84 - call x0D2F - ld c,(hl) - inc hl - ld b,(hl) ;bc номер блока сообщений и сообщения в нем - rst #08 ;печать сообщения по номеру в BC (название меню) - rst #20 - db #85 ;выровнять по центру - inc (ix+0) ;crd Y +1 -;печать опций меню - ld c,#00 ;номер опции - ld a,(xE110) ;атрибуты печати опций меню - ld (ix+6),a -x0D8E call x0D2F ;;c=номер текущей опции [0..n] - inc a - cp c - ret z ;все опции напечатаны - inc hl - inc hl ;hl адрес начала опций в дескрипторе меню - call x0D52 ;hl - адрес начала заданной опции +2 - ld b,a -; установка атрибутов печати опции - call x0F51 ;вызов п/п определения доступности опции. cy=1 недоступна - push hl - ld a,(xE112) ;атрибуты неактивной опции - jr c,x0DBB - ld a,b ;выделение Ink печати активной опции - rlca - rlca - rlca - and #07 ;номер Ink в таблице - ld hl,xEAED - add a,l - ld l,a - jr nc,x0DB1 ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы - inc h ;ЛИШНЕЕ!!! с учетом текущего размещения таблицы -x0DB1 ld a,(hl) - and #07 - ld l,a ;Ink печати опции - ld a,(xE110) - and %11111000 - or l -x0DBB ld (ix+6),a ;атрибуты печати опции - pop hl -; установка crdY, выделение опции, печать горячей клавиши вызова - call x0F6D - ld a,(hl) - inc hl - push af - push hl - rlca - rlca - and #03 - add a,(ix+0) - ld (ix+0),a - ld a,b - call x0D45 ;приведение номера горячей клавиши опции к печатному символу - ld b,a ;цифра/буква выбора опции - call x0D60 ;определение адреса с номером текущей опции текущего меню - ld a,(hl) - cp c - call z,x0E6F ;выделение текущей опции меню - pop hl - ld (ix+1),#09 ;печать номера опции - rst #20 - dc " " - ld a,b ;печать цифры/буквы выбора опции - rst #10 - rst #20 - dc ". " - pop af -; печать названия опции - push af - bit 5,a - jr nz,x0E03 ;печать названия отдельной п/п - push bc - ld c,(hl) ;номер блока сообщений - ld (iy-#08),c ;xE00C - inc hl - ld b,(hl) ;номер сообщения в блоке - inc hl - push hl - rst #08 ;печать названия опции - rst #20 - dc " " - ld (ix+1),#1F ;crd X =31 - pop hl - pop bc - jr x0E25 -x0E03 push bc ;печать названия опции отдельной процедурой - ld bc,x0E1F ;сюда вернемся - push bc - ld c,(hl) - inc hl - ld b,(hl) ;bc - адрес п/п печать опции - bit 4,a - jr nz,x0E11 ;она в другой странице - push bc - ret -x0E11 ld (xE3BE+#01),bc ;вызов п/п из другой страницы ROM - inc hl - ld c,a - ld a,(hl) - ld (xE3BE+#03),a - ld a,c - jp xE3BE -x0E1F pop bc - pop af - and #E0 - jr x0E26 ;печать следующей опции -x0E25 pop af -x0E26 and #1F - jr z,x0E68 ;печать следующей опции -; печать текущего параметра опции - push bc - call x0FE9 ;de - адрес переменной/hl - адрес маски для переменной - and #03 - cp #01 - jr nz,x0E45 - ld a,(de) ;два состояния опции, определяем по маске в (hl) - and (hl) - inc hl - ld b,(hl) - inc hl - jr z,x0E3C -x0E3B ld b,(hl) -x0E3C ld c,(iy-#08) ;номер блока сообщений - rst #08 - rst #20 - dc " " - pop bc - jr x0E62 -x0E45 cp #02 - jr nz,x0E57 - ld a,(de) ;это число по адресу переменной - ld c,a - ld b,#00 - ld de,#0A00 - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - pop bc - jr x0E68 ;печать следующей опции -x0E57 ld a,(de) ;1-4 состояния опции, по номеру в de - and #03 - jr z,x0E3B - ld b,a -x0E5D inc hl - djnz x0E5D - jr x0E3B -x0E62 ld a,#29 ;печать пробелов до правого края экрана - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -x0E68 inc c ;печать следующей опции - inc (ix+0) - jp x0D8E - -;АДРЕС: #0E6F выделение атрибутами заданной опции меню (по курсору) -x0E6F push hl - push bc - ld a,(xE113) - and %00111000 - ld c,a ;выделяем paper - ld a,(ix+6) - and %11000111 - or c - ld (ix+6),a ;устанавливаем атрибуты - call x0E98 ;выделение атрибутами заданной опции меню (по курсору) - ld a,(ix+0) - ld (iy-#09),a - pop bc - pop hl - ret - -;АДРЕС: #0E8C снятие выделения атрибутами заданной опции меню (по курсору) -x0E8C ld a,(iy-#09) ;координата Y выделенной опции - ld (ix+0),a ;crd Y - ld a,(xE110) - and %00111000 - ld c,a ;атрибуты печати - -;АДРЕС: #0E98 печать атрибутов заданной опции меню (по курсору) -;вх: c - атрибуты, только Paper -; -x0E98 push bc - ld (ix+1),#00 ;crd X =0 - rst #30 - dw rom2_x2969 ;расчет адреса курсора в области атрибутов для символов 8 пикселей - db #02 - pop bc - inc hl - ld b,#1E -x0EA5 ld a,(hl) - and %11000111 - or c - ld (hl),a - inc hl - djnz x0EA5 - ret - -;АДРЕС: #0EAE !!!ОШИБКА!!! тут зависание. должен быть холодный сброс???? -x0EAE rst #30 - dw #000B - db #02 - -;АДРЕС: #0EB2 очистка текущего окна -x0EB2 rst #20 ;очистка текущего окна - db #8C - ret - -;АДРЕС: #0EB5 печать текущего меню монитора -x0EB5 ld sp,xE336 - rst #30 - dw rom2_x04D5 ;включение Турбо-режима - db #02 ;bc =#7FFD - ld h,#E1 ;проверка в ram 8 признака MOA - ld l,#7B - ld a,"M" - cpi - jr nz,x0EAE ;нет буквы M. портится регистр bc -> зависание - ld a,"O" - cpi - jr nz,x0EAE ;нет буквы O. портится регистр bc -> зависание - call x10C2 ;установка текущим окна: menu - ld a,(xE110) - ld (ix+6),a ;атрибуты окна - call x0EB2 ;очистка окна - ld hl,xE16E - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 - call x105B ;сообщение Profesional Extention - ld a,(xE111) - ld (ix+6),a - ld bc,#0101 ;сообщение Shadow service monitor - rst 8 -;основной цикл меню монитора -x0EEC ld hl,x0EEC ;сюда вернемся после обработки выбранной опции - push hl - call x0D6B ;печать текущего меню - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - push af ;код нажатой клавиши - ld a,(xE110) ;атрибуты печати опции меню - ld (ix+6),a - call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) - pop af - call x1033 ;вызов п/п обработки нажатия клавиши - db #86 ;cs+6 вниз - dw x0F95 ;перемещение курсора на следующую опцию (вниз) - db #84 ;cs+7 вверх - dw x0FA6 ;перемещение курсора на предыдущую опцию (вверх) - db #0D ;enter / cs+1+m - dw x0F87 ;выбор выделенной опции - db #11 ;cs+1+q - dw x0F78 ;переход в главное меню - db #04 ;cs+1+d - dw x1150 ;вызов окна выбора диска - db #80 ;kempston joy - dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку - db #91 ;mouse - dw x0FB6 ;определение опции под курсором мыши и переход на ее обработку - db #92 ;mouse - dw x0F78 ;переход в главное меню - db #FF - cp #7B - jr nc,x0F28 ;a=[#7B..#FF] - cp #40 - jr c,x0F28 ;a=[#00..#3F] - and %01011111 ;букву в верхний регистр -x0F28 ld b,a ;код нажатой клавиши - ld c,#FF -x0F2B inc c - call x0D2F ;определение адреса дескриптора текущего меню - inc a - cp c - ret z ;закончились опции в меню. ничего не делаем - inc hl - inc hl - call x0D42 ;приведение номера горячей клавиши опции к печатному символу - cp b - jr nz,x0F2B ;клавиша не соответствует гарячей клавиши опции -;переход на п/п обработки выбранной опции - push hl - push de - call x0D60 - ld (hl),c ;сохраним номер текущей опции в меню - call x0D6B ;печать текущего меню - pop de - pop hl - call x0F51 ;проверка доступности опции - ret c ;опция недоступна - push hl - call x0F6D ;опредение адреса описания опции - ld c,l - ld b,h ;адрес описания опции (xNNNN) - pop hl - inc hl -;bc - адрес описания опции (xNNNN) -;вызов п/п обработки опции - -;АДРЕС: #0F51 вызов п/п обработки доступности опции/обработки опции -;вх: hl - адрес в дескрипторе опции (+2/4 от начала) -; 3-2,e биты старшего байта -;вых: hl - адрес в дескрипторе опции (+3 от начала) -; d - старший байт смещения -; e=e>>2 -; -x0F51 call x0F65 ;выделение старшего байта смещения - push de - ld e,(hl) ;младший байт - inc hl - push hl - ld hl,x08DD - add hl,de - ld de,x0F62 - push de - xor a - jp (hl) -x0F62 pop hl - pop de - ret - -;АДРЕС: #0F65 выделение старшего байта смещения -;вх: 3-2,e биты старшего байта -;вых: d - старший байт смещения -; e=e>>2 -; -x0F65 ld a,e - rrca - rrca - ld e,a - and #03 - ld d,a - ret - -;АДРЕС: #0F6D опредение адреса описания опции -;вх: hl - адрес в дескрипторе опции (+3 от начала) -; 3-2,e биты старшего байта -;вых: hl - адрес описания опции -; d - старший байт смещения -; e=e>>2 -; -x0F6D call x0F65 - push de - ld e,(hl) - ld hl,x0468 - add hl,de - pop de - ret -;переход в главное меню -x0F78 ld hl,x0EB5 - ex (sp),hl - xor a - ld (xDDFF),a - ld hl,xDE08 - ld (xE033),hl - ret -;enter / cs+1+m -x0F87 call x0D60 ;определение адреса с номером текущей опции текущего меню - ld c,(hl) ;номер текущей опции текущего меню - call x0D2F ;определение адреса дескриптора текущего меню - inc hl - inc hl - call x0D42 ;приведение номера горячей клавиши опции к печатному символу -x0F93 jr x0F28 ;a - горячая клавиша выбранной опции - -;АДРЕС: #0F95 перемещение курсора на следующую опцию (вниз) -x0F95 call x0D60 ;определение адреса с номером текущей опции текущего меню - push hl - ld c,(hl) - inc c ;c - номер опции - call x0D2F ;определение адреса дескриптора текущего меню - cp c ;a - номер последней опции - jr nc,x0FA3 - ld c,#00 -x0FA3 pop hl - ld (hl),c - ret - -;АДРЕС: #0FA6 перемещение курсора на предыдущую опцию (вверх) -x0FA6 call x0D60 ;определение адреса с номером текущей опции текущего меню - ld a,(hl) - or a - jr z,x0FAF - dec (hl) - ret -x0FAF push hl - call x0D2F ;определение адреса дескриптора текущего меню - pop hl - ld (hl),a - ret - -;АДРЕС: #0FB6 определение опции под курсором мыши и переход на ее обработку -; -x0FB6 ld c,#FF - ld d,#03 ;начальная crd Y -x0FBA inc d - inc c ;номер опции - call x0D2F ;определение адреса дескриптора текущего меню - inc a ;кол-во опций в меню - cp c - ret z ;опция не найдена - inc hl - inc hl - push de - call x0D52 ;определение адреса дескриптора опции - ld b,a - call x0F65 ;выделение старшего байта смещения - inc hl - call x0F6D ;опредение адреса описания опции - pop de - ld a,(hl) - rlca - rlca - and #03 - add a,d - ld d,a ;координата Y опции - cp (iy-#0B) - jr nz,x0FBA ;курсор не на этой опции - ld a,b - call x0D45 ;приведение номера горячей клавиши опции к печатному символу - jr x0F93 ;a - горячая клавиша выбранной опции - -;АДРЕС: #0FE3 получение адреса переменной и адреса маски для заданной опции -;вх: bc - адрес описания опции (x0468) -;вых: hl - адрес маски для переменной -; de - адрес переменной -; -x0FE3 ld l,c - ld h,b - ld a,(bc) - inc hl - inc hl - inc hl - -;АДРЕС: #0FE9 получение адреса переменной и адреса маски для заданной опции -;вх: a - флаги описания опции -; hl - адрес в описании опции -;вых: hl - адрес маски для переменной -; de - адрес переменной -; -x0FE9 bit 4,a - jr z,x1001 -;получение подстроки с описанием опции - ld e,(hl) - inc hl - ld d,(hl) ;адрес переменной с номером строки - inc hl ;hl=адрес+5 - ld a,(de) - and #03 ;номер строки [0..3] - inc a ;поиск строки -x0FF5 dec a - ld b,(hl) - inc hl - jr z,x0FFF -x0FFA inc hl - djnz x0FFA - jr x0FF5 -x0FFF ld a,(hl) ;a - флаги - inc hl -;получение адреса переменной опции -x1001 ld e,(hl) ;получение смещения от iy(xE014) - inc hl - bit 2,a - jr z,x100B - ld d,(hl) - inc hl - jr x1012 -x100B bit 7,e - ld d,#00 - jr z,x1012 - dec d ;de - смещение от iy(xE014) -x1012 push iy - ex (sp),hl - add hl,de - ex de,hl - pop hl ;de - адрес переменной опции -;если это блок переменных, определяем нужную переменную в блоке - bit 3,a - ret z - push af - ld b,(hl) - inc hl - ld a,(hl) - inc hl ;ab - адрес переменной со смещением в блоке - push hl - ld l,b - ld h,a - ld a,(hl) - and #03 - ld l,a ;hl - смещение в блоке - ld h,#00 - add hl,de - ex de,hl - pop hl - pop af - ret - -;АДРЕС: #102E проверка диапазона числа -;вх: a - число -; c - минимальное значение -; b - максимальное значение+1 -;вых: cy=1 вне пределов заданных значений -; -x102E cp c - ret c - cp b - ccf - ret - -;АДРЕС: #1033 процедура обработки нажатий клавиш -;вх: параметры передаются через db ?:dw ?? -x1033 pop hl - jr x1038 -x1036 inc hl - inc hl -x1038 ld e,(hl) - inc e - jr z,x1045 ;e=#FF -> возврат - cp (hl) - inc hl - jr nz,x1036 - ld e,(hl) - inc hl - ld d,(hl) - dec de - ex de,hl -x1045 inc hl - jp (hl) - -;АДРЕС: #1047 печать количества цилиндров HDD -x1047 ld bc,#1002 ;Cylinders - rst #08 - ld (ix+1),#1F - ld bc,(xDFF2) ;колво цилиндров - ld de,#0A00 ;десятичная система счисления - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - ret - -;АДРЕС: #105B печать шапки меню монитора -x105B call x10C2 ;установка текущим окна: menu - ld hl,x106B - -;АДРЕС: #1061 печать закодированного сообщения из hl -x1061 ld a,(hl) - xor #6A - cp #FF - ret z - rst #10 ;печать символа из A - inc hl - jr x1061 - -;заксоренное сообщение -x106B db #6B,#40,#BF - db #71,#6A,#63 - db #3A,#18,#05,#0C,#0F,#19,#03,#05 - db #04,#0B,#06,#4A,#4A,#2F,#12,#1E - db #0F,#04,#1E,#03,#05,#04,#4A - db #71,#68,#6A - db #2B,#04,#0B,#06,#13,#19,#0F,#18 - db #68 - db #95 -/*оно же, но раскодированное - db #01,%00101010,%11010101 ;атрибуты - db #1B,#00,#09 ;координаты - db "Profesional Extention " - db #1B,#02,#00 ;координаты - db "Analyser" - db #02 ;восстановим атрибуты - db #FF ;конец -*/ - -;заксоренное сообщение -x1095 db #6B,#1B,#E4 - db #71,#61,#60 - db #39,#0B,#1C,#0F,#0E,#4A,#38,#2B - db #27,#4A,#08,#0B,#04,#01,#4A - db #95 -/*оно же, но раскодированное -x1095 db #01,%01110001,%10001110 ;атрибуты - db #1B,#0B,#0A ;координаты - db "Saved RAM bank " - db #FF ;конец -*/ - -;заксоренное сообщение -x10AB db #6B,#1B,#0E4 - db #71,#61,#60 - db #26,#05,#0B,#0E,#0F,#0E,#4A,#38 - db #2B,#27,#4A,#08,#0B,#04,#01,#4A - db #95 -/*оно же, но раскодированное - db #01,%01110001,%10001110 ;атрибуты - db #1B,#0B,#0A ;координаты - db "Loaded RAM bank " - db #FF ;конец -*/ - -;АДРЕС: #10C2 установка текущим окна: menu -x10C2 rst #30 - dw rom2_x3005 ;установка текущим окна: menu - db %00000010 - ret - -;АДРЕС: #10C7 Копирование каталога ROM-диска в ram 8 -;вых: a =0 нет ROM-диска -x10C7 push bc - ld hl,(x0071) - ld l,#00 - ld bc,#0100 - ld de,xE5A9 - push de - ldir - pop de - ld a,(de) - or a - pop bc - ret - -;АДРЕС: #10DB обработка пункта меню: R. ROM disk -x10DB call x0D02 ;очистка нижней строки окна меню - call x10C7 ;Копирование каталога ROM-диска в ram 8 - ld hl,#1006 ;координаты окна - ld de,#100C ;ширина окна в символах и знакоместах - call x2133 ;коррекция координат и размеров окна - ld hl,x1111 - ld (xE9E1),hl -x10F0 call x1EF1 ;печать каталога и выбор позиции в нем - jr nc,x10FF ;выбор произведен успешно - cp #03 - jr z,x110E ;break/cancel закрываем окно - cp #11 - jr nz,x10F0 ;повторим выбор - jr x110E ;отмена с закрытием окна -;выбор произведен успешно -;hl - номер позиции в каталоге -x10FF call x1130 ;определение начала записи в каталоге ROM-disk по номеру в hl - ld de,#000E - add hl,de - ld a,(hl) ;смещение от начала страницы - inc hl - ld h,(hl) ;номер страницы - ld l,a ;смещение от начала страницым - rst #30 - dw rom6_x0E3B ;загрузка из ROM-disk - db #06 -;break/cancel закрываем окно -x110E jp x0EB5 ;печать текущего меню монитора - -;АДРЕС: #1111 таблица со списком процедур -x1111 dw x1128 ;печать одного имени из каталога ROM-disk - dw x113D ;определение номера последней записи в каталоге ROM-disk - dw x1117 ;звголовок: печать сообщения: _Select a file_ -;печать сообщения: _Select a file_ -x1117 rst #20 - dc " Select a file " - ret -;печать одного имени из каталога ROM-disk -;вх: hl - номер записи в каталоге -x1128 call x1130 - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 - ret -;определение начала записи в каталоге ROM-disk по номеру в hl -x1130 ld de,xE5A9 ;каталог ROM-disk - ld b,#04 -x1135 sla l ;hl=hl*16 - rl h - djnz x1135 - add hl,de - ret -;определение номера последней записи в каталоге ROM-disk -;вых: hl - номер последней записи в каталоге ROM-disk -x113D ld hl,xE5A9 ;каталог ROM-disk - ld de,#0010 - ld c,d -x1144 ld a,(hl) - or a - jr nz,x114C - dec c - ld l,c - ld h,d - ret -x114C add hl,de - inc c - jr x1144 - -;АДРЕС: #1150 вывод окна выбора дисковода -x1150 call x0D02 ;очистка нижней строки окна меню - ld hl,#1006 ;координаты окна - ld de,#140F ;размеры окна - call x2133 ;коррекция координат и размеров окна - ld hl,x1182 ;адрес таблицы со списком процедур для п/п x2028 - ld (xE9E1),hl -x1162 call x1EF1 ;печать каталога и выбор позиции в нем - jr nc,x117A ;что-то выбрали - cp #03 - jr z,x110E ;отмена break/cancel - cp #11 - jr z,x110E ;cs+1+q - and #5F ;проверка букв A..D - cp #45 - jr nc,x1162 ;продолжим - sub #41 - jr c,x1162 ;продолжим - ld l,a ;номер дисковода -x117A ld a,l - ld (xFFCA),a ;выбранный дисковод - jp x0B25 ;вывод каталога текущего диска - -;АДРЕС: #1181 ret -x1181 ret - -;таблица со списком процедур для печати окна выбора дисковода -x1182 dw x119D ;печать одного имени дисковода - dw x1188 ;определение номера последней записи =3 - dw x118C ;заголовок: печать сообщения: _Select a disk_ - -;определение номера последней записи =3 -x1188 ld hl,#0003 - ret - -;заголовок: печать сообщения: _Select a disk_ -x118C rst #20 - dc " Select a Disk " - ret - -;печать буквы дисковода или пути, если это образ -x119D ld a,l - and #03 - call x249C ;печать буквы дисковода или пути, если это образ - ret - -;АДРЕС: #11A4 поиск сообщения по номеру в B[#01..#??] -;вх: hl - адрес блока сообщений -;вых: de - адрес начала сообщения -; -x11A4 ex de,hl -x11A5 dec b - ret z -x11A7 ld a,(de) - inc de - and #80 - jr nz,x11A5 - jr x11A7 - -;АДРЕС: #11AF установка блока слов/сообщений по номеру в A -;вх: a=[#00..#02] - номер блока сообщений/слов -;вых: (xDDDA) - адрес блока слов -; hl - адрес в таблице блоков слов/сообщений -; -x11AF ld hl,x11C1 ;список блоков сообщений - rlca - rlca - add a,l - ld l,a - jr nc,x11B9 - inc h -x11B9 ld e,(hl) - inc hl - ld d,(hl) - ld (xDDDA),de - ret -x11C1 dw x1554,x1906 - dw x1353,x181A - dw x122D,x176D - -;АДРЕС: #11CD печать сообщения по номеру в BC -;вх: c=[0..2] номер блока сообщений -; b - номер сообщения в этом блоке -; -x11CD ld a,c - call x11AF ;установка блока слов/сообщений по номеру в A - inc hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld (xDDD8),hl ;адрес блока сообщений - ld c,#80 ;первая буква заглавная - call x11A4 ;поиск сообщения по номеру в B[#01..#??] - ex de,hl ;hl - адрес начала сообщения -x11DF ld a,(hl) ;печать сообщения - cp #7F - jr nz,x11ED - inc hl ;смена блока слов - ld a,(hl) - push hl - call x11AF ;установка блока слов/сообщений по номеру в A - pop hl - jr x1216 -x11ED and #7F - jr z,x121C ;печать указателя стэка - ld b,a - push hl - ld hl,(xDDDA) - call x11A4 ;поиск слова по номеру в B[#01..#??] - pop hl -x11FA ld a,(de) ;печать слова - sla c - jr nc,x120C - push af ;первый символ слова заглавный - and #7F - cp #40 - jr c,x120B - pop af - and %11011111 - jr x120C -x120B pop af -x120C rst #30 ;печать символа - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db %00000010 - rla - inc de - jr nc,x11FA - rst #20 ;печать пробела в конце слова - dc " " -x1216 bit 7,(hl) - inc hl - jr z,x11DF ;следующее слово - ret - -;печать числа из (xDDA7) -x121C push hl - sla c - push bc - ld hl,(xDDA7) - rst #30 - dw rom2_x1612 ;печать числа в hl (dec/hex) с префиксом - db %00000010 - rst #20 ;печать пробела - dc " " - pop bc - pop hl - jr x1216 - -;АДРЕС: #122D блок слов 2 (#35 слов) -x122D dc "time" ;#01 - dc "date" - dc "&" - dc "Set Up" - dc "indicator" - dc "ON" - dc "OFF" - dc "hours" - dc "minutes" ;#09 - dc "seconds" - dc "years" - dc "months" - dc "days" - dc "autoconfig" - dc "from" - dc "degree" - dc "compression" ;#11 - dc "Cylinders" - dc "head" - dc "partition" - dc "manager" - dc "global" - dc "-" - dc "delete" - dc "part" ;#19 - dc "all" - dc "local" - dc "table" - dc "information" - dc "select" - dc "..." - dc "create" - dc "write" ;#21 - dc "restore" - dc "auto" - dc "detection" - dc "mount" - dc "dismount" - dc "on" - dc "input" - dc "output" ;#29 - dc "interrupt" - dc "controller" - dc "NVRAM" - dc "modem" - dc "port" - dc "serial" - dc " " - dc "rename" ;#31 - dc "SMUC" - dc "mode" - dc "LBA" - dc "mirror" ;#35 - -;АДРЕС: #1353 блок слов 1 (#6A слов) -x1353 dc "main" ;#01 - dc "menu" - dc "previous" - dc "continue" - dc "magic" - dc "button" - dc "monitor" - dc "print" - dc "screen" ;#09 - dc "test" - dc "printer" - dc "disk" - dc "Set Up" - dc "about" - dc "positive" - dc "negative" - dc "Shadow" ;#11 - dc "service" - db #1B,#01,#88 - db #1B,#03,#8D - dc "keyboard" - dc "constant" - dc "debouncing" - dc "delay" - dc "repeat" ;#19 - dc "before" - dc "interface" - dc "speed" - dc "data" - dc "bits" - dc "stop" - dc "to" - dc "limiter" ;#21 - dc "+LF" - dc "length" - dc "page" - dc "width" - dc "centronics" - dc "RS232" - dc "9600" - dc "1200" ;#29 - dc "8" - dc "7" - dc "1" - dc "2" - dc "OFF" - dc "ON" - dc "reset" - dc "line" ;#31 - dc "feed" - dc "carriage" - dc "return" - dc "computer" - dc "form" - dc "sound" - dc "format" - dc "drive" ;#39 - dc "track" - dc "side" - dc "sector" - dc "A" - dc "B" - dc "C" - dc "D" - dc "40" ;#41 - dc "80" - dc "FM" - dc "MFM" - dc "128" - dc "256" - dc "512" - dc "1024" - dc "one" ;#49 - dc "double" - dc "half" - dc "LOW" - dc "HIGH" - dc "retry" - dc "utility" - dc "analys" - dc "catalogue" ;#51 - dc "interleaving" - dc "*" - dc "normal" - dc "fast" - db #0C,#1B,#00,#87 - db #1B,#0C,#8D - dc "save" - dc "load" ;#59 - dc "..." - dc "&" - dc "NMI" - dc "graphics" - dc "manipulators" - dc "mouse" - dc "kempston" - dc "joystick" ;#61 - dc "wait" - dc "second" - dc "first" - dc "of" - dc "step" - dc "size" - dc "quick" - dc "autostart" ;#69 - dc "I/O" ;#6A - -;АДРЕС: #1554 блок слов 0 (#5E слов) -x1554 dc "at" ;#01 - dc "abandoned" - dc "already" - dc "bad" - dc "big" - dc "blocks" - dc "breakpoint" - dc "by" - dc "command" ;#09 - dc "enter" - dc "empty" - dc "definition" - dc "devision" - dc "failed" - dc "file" - dc "finish" - dc "found" ;#11 - dc "few" - dc "identical" - dc "insufficient" - dc "known" - dc "long" - dc "many" - dc "no" - dc "not" ;#19 - dc "number" - dc "name" - dc "of" - dc "operands" - dc "opcode" - dc "open" - dc "out" - dc "present" ;#21 - dc "program" - dc "range" - dc "redefined" - dc "stack" - dc "space" - dc "syntax" - dc "string" - dc "small" ;#29 - dc "start" - dc "search" - dc "too" - dc "undefined" - dc "workspace" - dc "word" - dc "zero" - dc ">" ;#31 - dc "error" - dc "quit" - dc "operand" - dc ")" - dc "brackets" - dc "invalid" - dc "type" - dc "illegal" ;#39 - dc "value" - dc "bank" - dc "RAM" - dc "ROM" - dc "forbidden" - dc " Working ..." - dc "address" - dc "state" ;#41 - dc "selections:" - dc "init" - dc "count" - dc "***" - dc "curent" - dc "analyser" - dc "definitions:" - dc "left" ;#49 - dc "for" - dc "bytes" - dc "Professional" - dc "TRDOS" - dc "exist" - dc "R/W" - dc "disk" - dc "other" ;#51 - dc "execution" - dc "configuration" - dc "memory" - dc "control" - dc "hard" - dc "checksum" - dc "CMOS" - dc "boot" ;#59 - dc "record" - dc "busy" - dc "ready" - dc "duplicate" - dc "CRC" ;#5E - -;АДРЕС: #176D Блок сообщений 2 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов -x176D db #01,#03,#82 ;#01 time & date - db #04,#01,#03,#82 ;#02 Set Up time & date - db #85 ;#03 indicator - db #87 ;#04 OFF - db #86 ;#05 ON - db #88 ;#06 hours - db #89 ;#07 minutes - db #8A ;#08 seconds - db #8B ;#09 years - db #8C ;#0A months - db #8D ;#0B days - db #8E ;#0C autoconfig - db #91 ;#0D compression - db #90 ;#0E degree - db #7F,#00,#56 ;#0F hard disk utility - db #7F,#01,#0C,#CF - db #92 ;#10 Cylinders - db #93 ;#11 head - db #14,#95 ;#12 partition manager - db #16,#14,#9C ;#13 global partition table - db #18,#1A,#99 ;#14 delete all part - db #1B,#14,#9C ;#15 local partition table - db #14,#9D ;#16 partition information - db #18,#94 ;#17 delete partition - db #18,#14,#9F ;#18 delete partition ... - db #20,#14,#9F ;#19 create partition ... - db #21,#7F,#01,#20,#8C ;#1A write to disk - db #22,#0F,#7F,#01,#8C ;#1B restore from disk - db #23,#24,#7F,#00,#56 ;#1C auto detection hard disk - db #D0 - db #25,#27,#7F,#01,#39 ;#1D mount on drive C - db #BF - db #1E,#1B,#94 ;#1E select local partition - db #1E,#7F,#01,#8C ;#1F select disk - db #25,#27,#7F,#01,#39 ;#20 mount on drive D - db #C0 - db #25,#27,#7F,#01,#39 ;#21 mount on drive B - db #BE - db #A8 ;#22 input - db #A9 ;#23 output - db #2A,#2B,#7F,#00,#19 ;#24 interrupt controller not found - db #91 - db #2A,#2B,#7F,#00,#91 ;#25 interrupt controller found - db #2C,#7F,#00,#19,#91 ;#26 NVRAM not found - db #2C,#7F,#00,#91 ;#27 NVRAM found - db #2D,#7F,#00,#19,#91 ;#28 modem not found - db #2D,#7F,#00,#91 ;#29 modem found - db #2F,#2E,#7F,#00,#19 ;#2A serial port not found - db #91 - db #25,#A7 ;#2B mount on - db #30,#0F,#7F,#01,#B9 ;#2C __from drive - db #26,#7F,#01,#DA ;#2D dismount ... - db #B0 ;#2E __ - db #A6 ;#2F dismount - db #25,#7F,#01,#5A ;#30 mount ... ___ - db #7F,#02,#B0 - db #30,#27,#7F,#00,#AA ;#31 __ on start - db #31,#14,#9F ;#32 rename partition ... - db #2C,#7F,#00,#57,#B2 ;#33 NVRAM checksum error - db #2B,#32,#7F,#00,#91 ;#34 controller SMUC found - db #34,#B3 ;#35 LBA mode - db #7F,#00,#4D,#7F,#02 ;#36 TRDOS mirror - db #B5 - -;АДРЕС: #181A Блок сообщений 1 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов -x181A db #13,#11,#12,#87 ;#01 crd Y=1, crd X=8 Shadow service monitor - db #01,#82 ;#02 main menu - db #08,#89 ;#03 print screen - db #8D ;#04 Set Up - db #0D,#95 ;#05 Set Up keyboard - db #8A ;#06 test - db #03,#82 ;#07 previous menu - db #04,#7F,#00,#A2 ;#08 continue program - db #05,#86 ;#09 magic button - db #87 ;#0A monitor - db #8B ;#0B printer - db #0C,#DA ;#0C disk ... - db #0E,#87 ;#0D about monitor - db #8F ;#0E positive - db #90 ;#0F negative - db #89 ;#10 screen - db #7F,#00,#BC ;#11 RAM - db #16,#97 ;#12 constant debouncing - db #18,#99 ;#13 delay repeat - db #95 ;#14 keyboard - db #18,#1A,#99 ;#15 delay before repeat - db #0D,#8B ;#16 Set Up printer - db #9B ;#17 interface - db #A6 ;#18 centronics - db #A7 ;#19 RS232 - db #9C ;#1A speed - db #A8 ;#1B 9600 - db #A9 ;#1C 1200 - db #1D,#9E ;#1D data bits - db #AA ;#1E 8 - db #AB ;#1F 7 - db #1F,#9E ;#20 stop - db #AD ;#21 2 - db #AC ;#22 1 - db #9D ;#23 data - db #7F,#00,#28,#7F,#01 ;#24 string limiter +LF - db #21,#A2 - db #AF ;#25 ON - db #AE ;#26 OFF - db #7F,#00,#28,#7F,#01 ;#27 string width - db #A5 - db #24,#A3 ;#28 page lenth - db #B0 ;#29 reset - db #31,#B2 ;#2A line feed - db #33,#B4 ;#2B carriage return - db #B5 ;#2C computer - db #58,#5B,#D9 ;#2D save & load - db #36,#B2 ;#2E form feed - db #0D,#87 ;#2F Set Up monitor - db #30,#7F,#00,#BC ;#30 reset RAM - db #B7 ;#31 sound - db #0D,#0C,#CF ;#32 Set Up disk utility - db #0C,#B9 ;#33 disk drive - db #BD ;#34 A - db #BE ;#35 B - db #BF ;#36 C - db #C0 ;#37 D - db #BA ;#38 track - db #C1 ;#39 40 - db #C2 ;#3A 80 - db #BB ;#3B side - db #C9 ;#3C one - db #CA ;#3D double - db #C4 ;#3E MFM - db #C3 ;#3F FM - db #BC ;#40 sector - db #C5 ;#41 128 - db #C6 ;#42 256 - db #C7 ;#43 512 - db #C8 ;#44 1024 - db #38,#8C ;#45 format disk - db #1F,#38,#80 ;#47 stop format _число_ - db #CD ;#47 HIGH - db #4B,#CD ;#48 half HIGH - db #4B,#CC ;#49 half LOW - db #CC ;#4A LOW - db #B8 ;#4B format - db #4E,#96 ;#4C retry constant - db #0C,#CF ;#4D disk utility - db #0A,#8C ;#4E test disk - db #50,#8C ;#4F analys disk - db #7F,#00,#04,#7F,#01 ;#50 bad disk _число_ - db #0C,#80 ; - db #51,#8C ;#51 catalogue disk - db #D2 ;#52 interleaving - db #30,#87 ;#53 reset monitor - db #0B,#53,#AC ;#54 printer * 1 - db #0B,#53,#AD ;#55 printer * 2 - db #D4 ;#56 normal - db #D5 ;#57 fast - db #35,#9C ;#58 computer speed - db #56,#53,#55,#0A ;#59 очистить окно, crd Y=0, crd X=7 - db #7F,#00,#1C,#7F,#01 ; * fast test of computer * - db #35,#53,#D7 ; crd Y=12, crd X=13 - db #58,#DA ;#5A save ... - db #59,#DA ;#5B load ... - db #58,#5B,#59,#7F,#00 ;#5C save & load of program - db #1C,#A2 ; - db #5C,#97 ;#5D NMY debouncing - db #5D,#DE ;#5E graphics manipulators - db #0D,#5D,#DE ;#5F Set Up graphics manipulators - db #DE ;#60 manipulators - db #DF ;#61 mouse - db #60,#E1 ;#62 kempston joystick - db #64,#97 ;#63 first debouncing - db #1A,#99 ;#64 before repeat - db #63,#E2 ;#65 second wait - db #63,#97 ;#66 second debouncing - db #67,#65,#E6 ;#67 size of step - db #68,#38,#8C ;#68 quick format disk - db #E9 ;#69 autostart - db #58,#7F,#00,#D8 ;#6A save CMOS - db #59,#7F,#00,#D8 ;#6B load CMOS - db #58,#0D,#20,#8C ;#6C save Set Up to disk - db #0D,#7F,#00,#56,#D0 ;#6D Set Up hard disk - db #7F,#00,#38,#7F,#01 ;#6E type I/O - db #EA ; - db #91 ;#6F Shadow - db #7F,#02,#30,#0F ;#70 __ from drive - db #7F,#01,#B9 - -;АДРЕС: #1906 Блок сообщений 0 -; #00 печать числа из ячейки (xDDA7) -; #7F,[0..2] - смена блока слов - -x1906 db #0A,#89 ;#01 enter command - db #06,#93 ;#02 block identical - db #07,#80 ;#03 breackpoint _число_ - db #11,#01,#80 ;#04 found at _число_ - db #7F,#01,#1F,#7F,#00 ;#05 stop number _число_ - db #1A,#80 - db #BF ;#06 _Working ... - db #0A,#9A ;#07 enter number - db #2F,#A4 ;#08 word redefined - db #0A,#9B ;#09 enter name - db #2C,#12,#9D ;#0A too few operands - db #2C,#17,#9D ;#0B too many operands - db #20,#1C,#A3 ;#0C out of range - db #15,#9A ;#0D known number - db #04,#A8 ;#0E bad string - db #27,#B2 ;#0F syntax error - db #19,#9A ;#10 not number - db #1A,#2C,#85 ;#11 number too big - db #34,#19,#91 ;#12 operand not found - db #33,#34,#19,#91 ;#13 quit operand not found - db #2C,#17,#B5 ;#14 too many > - db #37,#38,#B6 ;#15 invalid type brackets - db #09,#19,#91 ;#16 command not found - db #39,#3A,#B4 ;#17 illegal value operand - db #37,#3B,#BC ;#18 invalid bank RAM - db #37,#3B,#BD ;#19 invalid bank ROM - db #09,#82 ;#1A command abandoned - db #3E,#3B,#BD ;#1B forbidden bank ROM - db #3E,#3B,#BC ;#1C forbidden bank RAM - db #2A,#31,#90 ;#1D start > _число_ - db #7F,#01,#08 ;#1E print abandoned - db #7F,#00,#82 - db #28,#2C,#96 ;#1F string too long - db #28,#19,#91 ;#20 string not found - db #18,#2B,#A8 ;#21 no search string - db #37,#1A,#87 ;#22 invalid number breackpoint - db #37,#41,#87 ;#23 invalid state breackpoint - db #37,#38,#87 ;#24 invalid type breackpoint - db #04,#40,#87 ;#25 bad address breackpoint - db #07,#AD ;#26 breackpoint undefined - db #46,#07,#C2 ;#27 curent breackpoint selections: - db #18,#40,#3B,#38,#41 ;#28 no address bank type state init count word - db #43,#44,#AF - db #45,#AD ;#29 *** undefined - db #04,#9E ;#2A bad opcode - db #10,#A2 ;#2B finish program - db #04,#B4 ;#2C bad operand - db #14,#22,#A6 ;#2D insufficient program space - db #22,#AD ;#2E program undefined - db #39,#2F,#9B ;#2F illegal word name - db #18,#8C ;#30 no definition - db #2F,#19,#95 ;#31 word not known - db #3E,#38,#AF ;#32 forbidden type word - db #47,#C8 ;#33 analyser definitions: - db #26,#49,#4A,#25,#80 ;#34 space left for stack _число_ - db #CB ;#35 bytes - db #25,#19,#8B ;#36 stack not empty - db #41,#1C,#A5 ;#37 state of stack - db #47,#B2 ;#38 analyser error - db #20,#1C,#25,#A6 ;#39 out of stack space - db #25,#8B ;#3A stack empty - db #2E,#94 ;#3B workspace insufficient - db #AE ;#3C workspace - db #4C,#22,#19,#91 ;#3D Professional program not found - db #15,#D0 ;#3E known disk - db #50,#19,#CD ;#3F disk not TRDOS - db #0D,#08,#B0 ;#40 devision by zero - db #0E,#01,#80 ;#41 failed at _число_ - db #2C,#12,#86 ;#42 too few blocks - db #0A,#C0 ;#43 enter address - db #0E,#D0 ;#44 failed disk - db #37,#0F,#9B ;#45 invalid file name - db #04,#44,#1C,#8F ;#46 bad count of file - db #0F,#03,#CE ;#47 file not exist - db #0F,#19,#91 ;#48 file not found - db #50,#18,#A6 ;#49 disk no space - db #39,#0F,#B8 ;#4A illegal file type - db #D0 ;#4B disk - db #C7 ;#4C analyser - db #87 ;#4D breackpoint - db #D2 ;#4E execution - db #D3 ;#4F configuration - db #4F,#32,#80 ;#50 R/W error _число_ - db #54,#D5 ;#51 memory control - db #D0 ;#52 disk - db #D1 ;#53 other - db #2D,#8F ;#54 undefined file - db #39,#7F,#01,#38 ;#55 illegal fromat file - db #7F,#00,#8F - db #56,#50,#19,#91 ;#56 hard disk not found - db #56,#50,#4F,#32,#80 ;#57 hard disk R/W error _число_ - db #56,#50,#AD ;#58 hard disk undefined - db #56,#50,#91 ;#59 hard disk found - db #58,#57,#B2 ;#5A CMOS checksum error - db #58,#19,#91 ;#5B CMOS not found - db #00,#4B,#58,#91 ;#5C _число_ bytes CMOS found - db #59,#DA ;#5D boot record - db #3D,#D0 ;#5E ROM disk - db #C2 ;#5F selections: - db #5B,#19,#91 ;#60 busy not found - db #56,#50,#19,#DC ;#61 hard disk not ready - db #56,#50,#7F,#01,#1D ;#62 hard disk data not ready - db #7F,#00,#19,#DC - db #37,#7F,#02,#14,#95 ;#63 invalid partition manager - db #7F,#02,#9E ;#64 select - db #5D,#9B ;#65 duplicate name - db #7F,#02,#14,#7F,#00 ;#66 partition not found - db #19,#91 - db #7F,#02,#14,#7F,#00 ;#67 partition undefined - db #AD - db #7F,#01,#1D,#7F,#00 ;#68 data CRC error - db #5E,#B2 - db #7F,#02,#2C,#7F,#00 ;#69 NVRAM R/W error - db #4F,#B2 - db #C5 ;#6A *** - -;АДРЕС: #1A40 пауза с индикацией на бордюре и печать даты и времени в окне монитора -x1A40 ld bc,#0000 -x1A43 ld a,c - out (#FE),a - dec bc - ld a,c - or b - jr nz,x1A43 - pop bc - -;АДРЕС: #1A4C печать даты и времени в окне монитора -; -x1A4C bit 3,(iy+#27) - ret z ;индикация времени отлючена - ld hl,(xE3B7) ;адрес дескриптора текущего окна - ld de,xE0C9 - or a - sbc hl,de - ret nz ;отображено окно в котором нельзя выводить время - ld hl,xDB69 ;буфер для чтения даты и времени в формате ASCII - push hl - ld d,%11111010 - call x1AAF ;читаем время в строку в формате ASCII - ld hl,(xE3BC) ;первый свободный адрес в буфере печати - ld (hl)," " - inc hl - ld d,%10100000 - call x1B21 ;читаем дату в строку в формате ASCII - ld hl,(xE3BC) ;первый свободный адрес в буфере печати - pop bc - or a - sbc hl,bc - ld b,l ;длина строки - ld hl,(xE0C9) - push hl ;запомним координаты курсора в окне - ld a,(xE0C9+#06) ;xE0CF - push af ;запомним атрибуты окна - ld hl,#0017 - ld (xE0C9),hl ;координаты печати времени - ld a,(xE111) ;атрибуты печати - dec e ;если воскресенье, выводим красным цветом - inc e - jr nz,x1A8E - ld a,%00101010 -x1A8E ld (xE0C9+#06),a ;атрибуты печати - rst #20 - db #84 ;вывод с выравниванием - ld hl,xDB69 ;адрес строки - rst #30 - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 - rst #20 - db " " - db #86 ;выровняем по правому краю - pop af - ld (xE0C9+#06),a ;восстановим атрибуты - pop hl - ld (xE0C9),hl ;восстановим координаты курсора - ret - -;АДРЕС: #1AA6 читаем время в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 можно выводить секунды -; 6,d,=1 можно выводить минуты -; 7,d,=1 можно выводить часы -x1AA6 call x1AEC ;установка переменных для печати даты и времени - ret c ;CMOS отсутствует - call x1C67 ;чтение из CMOS времени и даты - jr x1AB2 - -;АДРЕС: #1AAF читаем время в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 можно выводить секунды -; 6,d,=1 можно выводить минуты -; 7,d,=1 можно выводить часы -; hl - адрес буфера -; -x1AAF call x1AF5 -x1AB2 ld hl,xDFF6+2 - bit 7,d - jr z,x1ABF ;часы не выводим - call x1ADE ;час в строку - call x1AD7 ;вывод разделителя в строку -x1ABF dec hl - bit 6,d - jr z,x1AC7 ;минуты не выводим - call x1ADE ;минуты в строку -x1AC7 dec hl - bit 5,d - jr z,x1AD2 ;секунды не выводим - call x1AD7 ;вывод разделителя в строку - call x1ADE ;секунды в строку -x1AD2 res 6,(iy+9) - ret -;вывод разделителя в строку -x1AD7 ld a,d - and #1F - or #20 - rst #10 - ret -;преобразование часа/минуты/секунды в строку -x1ADE push de - ld c,(hl) - ld b,#00 ;час - ld (iy+7),#02 - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - ret -;установка переменных для печати даты и времени -;вых: cy=1 CMOS отсутствует -x1AEC bit 6,(iy+#1A) - scf - ret z ;CMOS отсутствует - ccf - jr x1AFC -x1AF5 ld (xE3BC),hl - set 6,(iy+9) ;печать в буфер -x1AFC ld (iy+#08),#30 ;код ведущего ноля - ld (iy+#10),#0A ;делитель для выделения разрядов числа - ret - -;АДРЕС: #1B05 чтение даты из буфера и расчет номера дня недели -;вых: c день -; b месяц -; a,e год -; l номер дня недели (0 - Вс, 1 - Пн и т.д.) -; -x1B05 ld bc,(xDFF9) - ld a,(xDFFB) - push de - push af - push bc - ld e,a - call x1BAC - pop bc - pop af - pop de - ld e,a - ret - -;АДРЕС: #1B18 читаем дату в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 выводить месяц словом и перед годом добавлять "19" -; 6,d,=1 ставить символ 0 перед числом -; 7,d,=1 выводить день недели -x1B18 call x1AEC ;установка переменных для печати даты и времени - ret c ;CMOS отсутствует - call x1C67 ;чтение из CMOS времени и даты - jr x1B24 - -;АДРЕС: #1B21 читаем дату в строку в формате ASCII -;вх: 0-4,d байт разделитель +#20 -; 5,d,=1 выводить месяц словом и перед годом добавлять "19" -; 6,d,=1 ставить символ 0 перед числом -; 7,d,=1 выводить день недели -; hl - адрес буфера -; -x1B21 call x1AF5 -x1B24 call x1B05 ;чтение даты из буфера и расчет номера дня недели - push af - push bc - bit 7,d - jr z,x1B39 ;день недели не выводим - ld a,l ;день недели в строку - ld e,l - ld hl,rom2_x3F0A ;Названия дней недели - rst #30 - dw rom2_x15D0 - db %00000010 - call x1AD7 ;вывод разделителя в строку -x1B39 pop hl - ld c,l ;день - push hl - ld b,#00 - ld a,#01 - bit 6,d - jr z,x1B45 ;ведущий 0 не ставить - inc a -x1B45 ld (iy+7),a ;минимум разрядов в числе - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - call x1AD7 ;вывод разделителя в строку - pop af ;месяц - bit 5,d - jr z,x1B60 ;выводим цифрой - dec a ;выводим словом - ld hl,rom2_x3EE6 ;названия месяцев - rst #30 - dw rom2_x15D0 - db %00000010 - jr x1B6D -x1B60 ld c,a - ld b,0 - ld (iy+7),#02 - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de -x1B6D call x1AD7 ;вывод разделителя в строку - pop af - ld c,a - bit 5,d - jr z,x1B82 ;год выводим двумя цифрами - cp 80 - jr nc,x1B7F - rst #20 - dc "20" - jr x1B82 -x1B7F rst #20 - dc "19" -x1B82 ld b,#00 - ld (iy+7),#02 - push de - rst #30 - dw rom2_x1673 ;преобразование числа в строку - db %00000010 - pop de - res 6,(iy+9) - ret - -;АДРЕС: #1B93 таблица для вычисления кода месяца -x1B93 db 2 ;март - db 5 ;апрель - db 7 ;май - db 10 ;июнь - db 12 ;июль - db 15 ;август - db 18 ;сентябрь - db 20 ;октябрь - db 23 ;ноябрь - db 25 ;декабрь - db 28 ;январь - db 31 ;февраль -x1B9F db 33 ; -;количество дней в месяцах - db 31 ;январь - db 28 ;февраль - db 31 ;март - db 30 ;апрель - db 31 ;май - db 30 ;июнь - db 31 ;июль - db 31 ;август - db 30 ;сентябрь - db 31 ;октябрь - db 30 ;ноябрь - db 31 ;декабрь - -;АДРЕС: #1BAC расчет номера дня недели -;вх: c день -; b месяц -; e год -;вых: l номер дня недели (0 - Вс, 1 - Пн и т.д.) -; -x1BAC exx - push hl - push de - push bc - exx - ld a,e ;a,de - год - ld d,#00 - ld hl,1900 - add hl,de - cp 80 - jr nc,x1BC0 ;год >=80 - ld de,100 - add hl,de ;hl текущий год в формате yyyy -x1BC0 ld a,b ;определение кода месяца - sub 3 - jr nc,x1BC8 - add a,12 - dec hl -x1BC8 ld de,x1B93 - add a,e - ld e,a - jr nc,x1BD0 - inc d -x1BD0 ld a,(de) ;a код месяца - add a,c ;+день - push hl ;год - add a,l - ld l,a - jr nc,x1BD8 - inc h -x1BD8 ex (sp),hl - push hl - srl h - rr l - srl h - rr l - ex (sp),hl - push hl - ld de,100 - rst #30 - dw rom2_x0E73 ;bc=hl/de - db %00000010 - pop hl ;bc=год/100 - push bc - ld de,400 - rst #30 - dw rom2_x0E73 ;bc=hl/de - db %00000010 - pop de ;bc=год/400 - pop hl - add hl,bc - or a - sbc hl,de ;hl год/4 + год/400 - год/100 - pop bc ;bc день + (31 * месяц)/12 + год - add hl,bc - ld de,#0000 - exx - ld bc,#0007 - rst #30 - dw rom7_x0F5D ;l остаток от деления - db %00000111 - exx - pop bc - pop de - pop hl - exx - ret - -;АДРЕС: #1C0D работа с микросхемой CMOS (rst 8: db #89) -;вх: d - код операции: 7,=1/0 записать/считать -; 6,=1/0 читать в буфер/только в регистры -; 5,=0 =0 читать в строку ASCII -; 0,=1/0 дата/время -; e - при чтении в ASCII формат перевода -; 0-4,e байт разделитель +#20 -; 5,e,=1 выводить месяц словом и перед годом добавлять "19" -; 6,e,=1 ставить символ 0 перед числом -; 7,e,=1 выводить день недели -; 5,e,=1 можно выводить секунды -; 6,e,=1 можно выводить минуты -; 7,e,=1 можно выводить часы -; hl - адрес буфера (если бит 6,d =1) -; c - секунды/число -; b - минуты/месяц -; e - часы/год -;вых: cy=1 - если микросхемы CMOS нет или задан неверный формат запроса -; hl - строка текста ASCIZ (если бит 6,d =1) -; c - секунды/число -; b - минуты/месяц -; e - часы/год -; l - день недели -; -x1C0D bit 6,(iy+#1A) - scf - ret z ;CMOS отсутствует - bit 7,d - jr nz,x1C4A ;запись времени или даты в CMOS - bit 6,d - jr z,x1C34 ;чтение в регистры из CMOS времени/даты - bit 5,d - jr nz,x1C2E ;чтение в буфер времени и даты - bit 0,d ;читаем в формате ASCII - ld d,e - jr nz,x1C29 ;читаем дату в строку в формате ASCII - call x1AAF ;читаем время в строку в формате ASCII - or a - ret -x1C29 call x1B21 - or a - ret -;чтение времени и даты из CMOS в буфер -x1C2E rst #30 - dw rom7_x1F93 - db %00000111 - or a - ret -;чтение из CMOS вренени и даты -x1C34 call x1C67 - bit 0,d - jr z,x1C40 ;время - call x1B05 ;дата - or a - ret -x1C40 ld hl,xDFF6 - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld e,(hl) - or a - ret -;запись времени или даты в CMOS -x1C4A call x1C67 ;чтение из CMOS вренени и даты - bit 0,d - jr nz,x1C62 ;это дата - ld hl,xDFF6 ;адрес времени -x1C54 ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),e - ld hl,xDFF6 ;запись времени и даты в CMOS - rst #30 - dw rom7_x1FB2 - db %00000111 - or a - ret -x1C62 ld hl,xDFF9 ;адрес даты - jr x1C54 -;чтение из CMOS времени и даты -x1C67 ld hl,xDFF6 - push bc - push de - rst #30 - dw rom7_x1F93 - db %00000111 - pop de - pop bc - ret - -;АДРЕС: #1C73 ввод текстовой строки в нижней строке экрана -;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 6-0,a - номер сообщения из блока 0 -; a =#00 продолжение ввода -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1C73 rst #30 - dw rom2_x3014 ;ix = адрес дескриптора окна монитора: ввод строки внизу экрана - db #02 - rlc a - jr z,x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - call x1C84 ;инициализация окна ввода - call x1CB8 ;ввод строки (вых: hl адрес введенной строки) - ret c ;отмена ввода - ld a,#0C ;сообщение _Working ... - -;АДРЕС: #1C84 инициализация окна ввода -;вх: 0,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 7-1,a - номер сообщения из блока 0 -; cy=1 с очисткой буфера ввода -x1C84 push af - ld hl,xDE17 ;буфер для ввода строки - ld (xDE15),hl - call c,x1DD6 ;очистка буфера вводимой строки - rst #30 - dw rom2_x2A5E ;очистка текущего окна - db #02 - pop af - push af - srl a - ld hl,#5AC0 ;атрибуты информационной строки на экране - ld e,l - ld d,h - ld (hl),#29 ;bright 0, paper 5, ink 1 - cp #0A - jr c,x1CA3 - ld (hl),#2A ;bright 0, paper 5, ink 2 -x1CA3 inc de - ld bc,#001F - ldir - inc (ix+1) - ld b,a - rst #08 - inc (ix+0) - pop af - ret - -;АДРЕС: #1CB3 продолжение ввода строки (вых: hl адрес введенной строки) -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1CB3 call x1DEC ;удаление кода возврата каретки из строки - jr x1CC7 - -;АДРЕС: #1CB8 ввод строки (вых: hl адрес введенной строки) -;вых: hl = xDE17 адрес введенной строки -; a - код нажатой клавиши -; cy=0 выход по enter -; =1 выход по другой комбинации -; -x1CB8 call x1DEC ;удаление кода возврата каретки из строки ввода - ld hl,xDE17 - ld (xDE15),hl - call x1D70 ;позиционирование курсора в конец строки -x1CC4 call x1D98 ;печать вводимой строки на экране -x1CC7 ld hl,x1CC4 ;тут зациклим - push hl - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 -x1CD3 call x1033 ;вызов п/п обработки нажатия клавиши - db #85 ;cs+5 - dw x1D5A ;перемещение курсора в водимой строке влево - db #83 ;cs+8 - dw x1D64 ;перемещение курсора в водимой строке вправо - db #7F ;cs+0 - dw x1D40 ;удаление символа перед курсором (delete) - db #0D ;enter / cs+1+m - dw x1D0D ; - db #86 ;cs+6 вниз - dw x1E5B ;копирование в буфер ввода предпоследней введенной строки - db #84 ;cs+7 вверх - dw x1EC0 ;копирование в буфер ввода следующей введенной строки - db #1F ;ss+i - dw x1DC2 ;смена режима вставки/замены при вводе строки - db #FF - cp #20 ;a - код нажатой клавиши - jr c,x1CF4 ;a=[#00..#1F] - cp #80 - jr c,x1D10 ;a=[#20..#7F] -x1CF4 scf ;a - непечатный символ -x1CF5 push af ;cy =1/0 отмена/ввод - push de - push af - call nc,x1E2D ;сохранение введенной строки в буфере последних введенных строк - call x1D98 ;печать введенной строки на экране - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 - pop af - call nc,x1D10 ;добавление символа в вводимую строку - pop de - pop af - pop hl - ld hl,xDE17 ;адрес введенной строки - ret -x1D0D or a - jr x1CF5 - -;АДРЕС: #1D10 добавление символа в вводимую строку -;вх: a - код нажатой клавиши -x1D10 ld e,a - call x1DB7 ;получение адреса под курсором в буфере строки - ld d,(ix+#0B) - dec d - ld c,(ix+1) - ld a,d - cp c - jr z,x1D38 ;курсор в последней позиции. предупреждаем звонком - bit 1,(ix+#0D) - jr nz,x1D36 ;режим замены символов -x1D25 sub c ;раздвигаем строку - ld c,a - ld b,#00 - push hl - add hl,bc - ld a,(hl) - push de - ld e,l - ld d,h - dec hl - lddr - pop de - pop hl - jr x1D38 -x1D36 ld a," " -x1D38 ld (hl),e ;ставим символ - cp " " - call nz,x1EEE ;звонок с установкой бордюра - jr x1D64 ;перемещение курсора в введенной строке вправо - -;АДРЕС: #1D40 удаление символа перед курсором (delete) -x1D40 call x1D5A ;перемещение курсора в вводимой строке влево - ret z - call x1DB7 ;получение адреса под курсором в буфере строки - ld a,(ix+#0B) - dec a - sub (ix+1) - ld c,a - ld e,l - ld d,h - inc hl - ld b,#00 - ldir ;удаление символа под курсором - ld a," " ;в конец строки допишем пробел - ld (de),a - ret - -;АДРЕС: #1D5A перемещение курсора в водимой строке влево -;вых: z - курсор в крайнем положении -x1D5A ld a,(ix+1) - or a - ret z - dec (ix+1) - inc a - ret - -;АДРЕС: #1D64 перемещение курсора в вводимой строке вправо -x1D64 ld a,(ix+1) - inc a - cp (ix+#0B) - ret nc - inc (ix+1) - ret - -;АДРЕС: #1D70 позиционирование курсора в конец строки -x1D70 ld hl,(xDE15) ;адрес буфера вводимой строки - ld a,(ix+#0B) ;размер окна в символах - ld c,a - dec a ;крайняя правая координата - add a,l - ld l,a - jr nc,x1D7D - inc h ;hl адрес конца строки -x1D7D ld b,#00 ;bc длина сроки - ld a," " -x1D81 cpd ;ищем символ не пробел - jp po,x1D94 ;bc=0 конец поиска - jr z,x1D81 -x1D88 ld a,(ix+#0B) ;такой символ найден - dec a - cp c - jr z,x1D90 - inc c ;ставим курсор после этого символа -x1D90 ld (ix+1),c - ret -x1D94 jr z,x1D90 ;если все-таки найден пробел - jr x1D88 - -;АДРЕС: #1D98 печать вводимой строки на экране -x1D98 rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 - ld a,(ix+1) ;сохраним координату X курсора - push af - ld hl,(xDE15) ;начало вводимой строки - ld b,(ix+#0B) ;длина строки - ld (ix+1),#00 - rst #30 - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 - pop af - ld (ix+1),a ;восстановим координату X курсора - rst #30 - dw rom2_x28E8 ;печать курсора в окне - db #02 - ret - -;АДРЕС: #1DB7 получение адреса под курсором в буфере строки -;вых: hl - адрес в буфере -x1DB7 ld a,(ix+1) - ld hl,(xDE15) - add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #1DC2 смена режима вставки/замены при вводе строки -; -x1DC2 ld a,(ix+#0D) - xor %00000010 - ld (ix+#0D),a - bit 1,a - ld a,#DB - jr z,x1DD2 - ld a,#DC -x1DD2 ld (ix+#0C),a - ret - -;АДРЕС: #1DD6 очистка буфера вводимой строки -x1DD6 ld hl,(xDE15) - ld c,(ix+#0B) - ld (hl)," " - dec c - ret z - ld b,#00 - ld e,l - ld d,h - inc de - ldir - ld (ix+1),#00 - ret - -;АДРЕС: #1DEC удаление кода возврата каретки из строки -x1DEC ld a,#0A - ld (xDE14),a - ld a,(ix+1) ;сохраним координату X - push af - call x1D70 ;позиционирование курсора в конец строки - ld a,(ix+1) - inc a - cp (ix+#0B) - jr z,x1E04 ;курсор на последнем символе строки - call x1D5A ;перемещение курсора в водимой строке влево -x1E04 call x1DB7 ;получение адреса под курсором в буфере строки - ld a,(hl) ;enter заменим на пробел - cp #0D - jr nz,x1E0E - ld (hl)," " -x1E0E pop af - ld (ix+1),a ;восстановим координату курсора - ret - -;АДРЕС: #1E13 помещение символа в строку и приращение адреса в буфере строк -;вх: hl - адрес в буфере -; de - адрес конца буфера -;вых: hl - очередной адрес в буфере -x1E13 ld (ix+0),a - inc ix - -;АДРЕС: #1E18 циклическое приращение адреса в буфере введенных строк -;вх: hl - адрес в буфере -; de - адрес конца буфера -;вых: hl - очередной адрес в буфере -x1E18 inc hl - or a - sbc hl,de - add hl,de - ret nz - ld hl,xDE42 - ret - -;АДРЕС: #1E22 получем адрес конца последней введенной строки -;вх: hl - адрес конца последней введенной строки -; de - адрес начала буфера -;вых: hl - адрес последнего символа последней введенной строки -x1E22 or a - sbc hl,de - add hl,de - jr nz,x1E2B - ld hl,xDFD2 -x1E2B dec hl - ret - -;АДРЕС: #1E2D сохранение введенной строки в буфере последних введенных строк -x1E2D call x1D70 ;позиционирование курсора в конец строки - ld b,(ix+1) ;длина введенной строки - ld a,b - or a - ret z ;пустая строка - push ix - ld ix,(xDE15) ;адрес начала введенной строки - ld hl,(xE035) - ld de,xDFD2 ;конец буфера последних введенных строк -x1E42 ld a,(ix+0) ;сохранение строки в буфере последних введенных строк - inc ix - ld (hl),a - call x1E18 ;циклическое приращение адреса в буфере введенных строк - djnz x1E42 - pop ix - ld (hl),#00 ;маркер конца введенной строки - call x1E18 ;циклическое приращение адреса в буфере введенных строк - ld (xE035),hl - ld (xE037),hl - ret - -;АДРЕС: #1E5B копирование в буфер ввода предпоследней введенной строки -;вх: a - код нажатой клавиши #86 -; -x1E5B ld bc,(xDE14) ; - cp c ; - ld b,#02 ; - jr nz,x1E65 ; - dec b ; -x1E65 ld (xDE14),a ; -x1E68 ld hl,(xE037) - ld de,xDE42 - call x1E22 ;получем адрес конца последней введенной строки -x1E71 call x1E22 ;ищем начало строки - ld a,(hl) - or a - jr nz,x1E71 - ld de,xDFD2 - call x1E18 ;циклическое приращение адреса в буфере введенных строк - call x1EE1 ;проверка списка на наличие введенных строк - ld a,(hl) - or a - jp z,x1DD6 ;эта строка пустая - ld (xE037),hl ;начало последней введенной строки - push bc - call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки - pop bc - djnz x1E68 - ret - -;АДРЕС: #1E91 копирование строки из буфера введенных строк в буфер ввода строки -x1E91 call x1DD6 ;очистка буфера вводимой строки - ld b,(ix+#0B) - ld hl,(xE037) ;начало последней введенной строки - ld de,xDFD2 ;конец буфера - push ix - ld ix,(xDE15) ;адрес буфера для ввода строки -x1EA3 ld a,(hl) ;копирование строки в буфер ввода - or a - jr z,x1EB5 ;конец строки - call x1E13 ;помещение символа в строку и приращение адреса в буфере строк - djnz x1EA3 -x1EAC ld a,(hl) ;если строка была длиннее буфера ввода, ищем ее конец - or a - jr z,x1EB5 - call x1E18 ;циклическое приращение адреса в буфере введенных строк - jr x1EAC -x1EB5 call x1E18 ;hl - адрес следующей строки в буфере введенных строк - pop ix - push hl - call x1D70 ;позиционирование курсора в конец строки - pop hl - ret - -;АДРЕС: #1EC0 копирование в буфер ввода следующей введенной строки -;вх: a - код нажатой клавиши #84 -; -x1EC0 ld hl,(xE037) - ld bc,(xDE14) - cp c - ld b,#02 - jr nz,x1ECD - dec b -x1ECD ld (xDE14),a -x1ED0 call x1EE1 ;проверка списка на наличие введенных строк - ld a,(hl) - or a - ret z ;строка пустая - push bc - call x1E91 ;копирование строки из буфера введенных строк в буфер ввода строки - ld (xE037),hl - pop bc - djnz x1ED0 - ret - -;АДРЕС: #1EE1 проверка списка на наличие введенных строк -;вх: hl - начало последней введенной строки -x1EE1 ld de,(xE035) ;первый свободный адрес в буфере последних введенных строк(команд) - or a - sbc hl,de - add hl,de - ret nz - pop hl ;список пустой - jp x1DD6 ;очистка буфера вводимой строки - -;АДРЕС: #1EEE звонок с установкой бордюра -x1EEE rst #20 - db #87 - ret - -;АДРЕС: #1EF1 печать каталога и выбор позиции в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -; -x1EF1 call x2028 ;определение номера последней записи в каталоге - db #02 - ld (xDD89),hl ;номер последней записи - call x203C ;расчет размеров и печать окна под каталог - ld hl,#0000 ;номер записи каталога, с которой начинаем печать - ld (xE9E3),hl - call x1F7F ;печать каталога в окне -x1F04 ld hl,x1F04 ;сюда вернемся - push hl - call x1FF4 ;печать выделенной позиции в каталоге - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - push af ;a - код нажатой клавиши - call x1FBA ;снимаем выделение строки каталога - pop af - call x0385 ;обработка реакции на нажатия клавиш - call nc,x1FDC ;покажем выбранную позицию - call x1033 - db #84 ;cs+7 вверх - dw x1F4C ;нажата клавиша вверх, двигаем выделение вверх - db #86 ;cs+6 вниз - dw x1F94 ;нажата клавиша вниз, двигаем выделение вниз - db #0D ;enter - dw x1F44 ;выбор позиции в каталоге - db #80 ;fire KempJoy в окне - dw x1F4B ;!!!ОШИБКА должно быть x1F44 - db #FF - cp #3A - ccf - jr c,x1F45 ;не цифра - cp #30 - jr c,x1F45 ;не цифра - sub #30 - jr nz,x1F39 - ld a,#0A ;"0" =10 -x1F39 dec a - cp (ix+4) - ret nc ;нет позиции с таким номером - ld (ix+0),a - call x1FDC ;покажем выбранную позицию -;выбор позиции в каталоге -x1F44 or a -x1F45 pop hl - push af - call x201D ;(xE9E3) +crd Y курсора - pop af -x1F4B ret -;нажата клавиша вверх, двигаем выделение вверх -x1F4C call x201D ;(xE9E3) +crd Y курсора - ld a,l - or h - jr z,x1F64 ;достигнут предел - call x2012 ;уменьшаем координату Y - ret nz ;умеyьшили успешно - rst #30 - dw rom2_x2A1B ;скроллинг окна ввниз - db #02 - ld hl,(xE9E3) - dec hl - ld (xE9E3),hl - jr x1FBA ;печать одной строки каталога ROM-disk -x1F64 ld hl,(xDD89) ;переход на нижнюю строчку - ld c,(ix+4) - dec c - ld (ix+0),c - xor a - ld b,a - sbc hl,bc - jr nc,x1F7C - ld a,l - add a,c - ld (ix+0),a - ld hl,#0000 -x1F7C ld (xE9E3),hl -;печать каталога ROM-disk в окне -x1F7F ld a,(ix+0) - push af ;сохраним crd Y курсора - xor a - ld (ix+0),a ;crd Y =0 -x1F87 call x1FBA ;;печать одной строки каталога ROM-disk - call x2006 ;приращение координаты Y курсора - jr nz,x1F87 ;печатаем следующую строку - pop af - ld (ix+0),a ;восстановим crd Y курсора - ret -;нажата клавиша вниз, двигаем выделение вниз -x1F94 ld hl,(xDD89) - push hl - call x201D ;(xE9E3) +crd Y курсора - pop de - xor a - sbc hl,de - jr c,x1FAB - ld h,a ;достигнут нижний предел. переходим на верхнюю строку - ld l,a - ld (xE9E3),hl - ld (ix+0),a - jr x1F7F ;печать каталога ROM-disk в окне -x1FAB call x2006 ;приращение координаты Y курсора - ret nz ;успешно - rst #30 - dw rom2_x298E ;скроллинг окна вверх - db #02 - ld hl,(xE9E3) - inc hl - ld (xE9E3),hl -;печать одной строки каталога ROM-disk -x1FBA ld (ix+1),#00 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - call x201D ;(xE9E3) +crd Y курсора - ex de,hl - ld hl,(xDD89) - or a - sbc hl,de ;номер последней записи в каталоге ROM-disk - jr c,x1FD3 - ex de,hl - call x2028 ;печать одного имени из каталога ROM-disk - db #00 ;вх: hl - номер записи -x1FD3 rst #30 - dw rom2_x2FED ;печать пробелов до правого края окна - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ret -;покажем выбранную позицию -x1FDC push af - call x1FF4 ;печать выделенной позиции в каталоге ROM-disk - call x1FE8 ;пауза примерно 646k тактов - call x1FBA ;снимаем выделение позиции - pop af - ret -;пауза примерно 646k тактов -x1FE8 ld a,#C0 -x1FEA push bc -x1FEB ld b,#00 - djnz $ - pop bc - dec a - jr nz,x1FEA - ret -;печать выделенной позиции в каталоге ROM-disk -x1FF4 ld a,(ix+6) - push af ;сохраним атрибуты - ld a,(ix+#0E) - ld (ix+6),a - call x1FBA ;печать одной строки каталога ROM-disk - pop af - ld (ix+6),a - ret -;приращение координаты Y курсора -;вых: z - не было приращения -x2006 ld a,(ix+4) - dec a - cp (ix+0) - ret z - inc (ix+0) - ret -;уменьшаем координату Y -x2012 ld a,(ix+0) - or a - ret z - dec (ix+0) - xor a - inc a - ret -;(xE9E3) +crd Y курсора -x201D ld hl,(xE9E3) - ld a,(ix+0) - -;АДРЕС: #2023 сложение hl=hl+a -x2023 add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #2028 вызов процедуры по таблице, адрес которой в (xE9E1) -;вх: db ? номер процедуры -; =#04 заголовок -x2028 ex (sp),hl - ld a,(hl) - inc hl - ex (sp),hl - -;АДРЕС: #202C вызов процедуры по таблице, адрес которой в (xE9E1) -;вх: a - номер процедуры -; =#04 заголовок -x202C push hl - ld hl,(xE9E1) - call x2023 ;сложение hl=hl+a - ld a,(hl) - inc hl - ld h,(hl) - ld l,a - ex (sp),hl - ld a,(xDDA7) - ret - -;АДРЕС: #203C расчет размеров и печать окна под каталог ROM-disk -x203C call x205A ;установка текущим окна: вывод каталога - ld bc,(xDD89) ;номер последней записи каталога ROM-disk - ld hl,#000F ;высота окна не более 16 - or a - sbc hl,bc - jr nc,x204D - ld c,#10 -x204D inc c - ld (ix+4),c ;высота окна - ld hl,#0531 ;атрибуты заголовка и выравнивание - -;АДРЕС: #2054 печать рамки вокруг окна -x2054 call x207A ;печать рамки вокруг окна - rst #20 - db #8C ;очистка окна - ret - -;АДРЕС: #205A установка текущим окна: вывод каталога -x205A ld hl,xE0F3 - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 - ret - -;печатные коды рамок -x2062 db #BB,#CD,#C9,#BA,#BA,#BC,#CD,#C8 - db #B9,#CD,#CC,#BA,#BA,#BC,#CD,#C8 - db #B6,#C4,#C7,#BA,#BA,#BC,#CD,#C8 - -;АДРЕС: #207A печать рамки вокруг окна -;вх: l - атрибуты заголовка -; h - выравнивание загловка (=0 нет выравнивания) -; hl=#0000 нет заголовка -; -x207A bit 7,(ix+8) - ret z ;нет рамки - push hl - ld de,xE338 ;сохраним дескриптор окна - push ix - pop hl - push hl - ld bc,#000E - ldir - pop hl - ld (hl),#00 ;координаты курсора =0 - inc hl - ld (hl),#00 - inc hl - dec (hl) ;увеличим размерыокна на 2 - inc hl - dec (hl) - inc hl - inc (hl) ;высота +2 - inc (hl) - inc hl - inc (hl) ;ширина +2 - inc (hl) - ld (ix+7),#03 ;системные атрибуты окна - ld a,(ix+9) - ld (ix+6),a ;атрибуты рамки - ld a,(ix+8) - and %00111000 - ld l,a - ld h,#00 ;номер рамки *8 - ld de,x2062 - add hl,de ;адрес рамки - ld (ix+#0A),#08 ;размер символов в пикселях - ld a,(ix+#0B) - push af ;сохраним ширину окна - ld (ix+#0B),#20 ;ширина окна 32 - call x2120 ;печать верхней линии рамки - ld b,(ix+4) - dec b - dec b ;высота - jr z,x20E0 ;средних линий нет - ld c,(ix+5) - dec c ;правая координата X - ld e,(hl) - inc hl - ld d,(hl) - inc hl ;de печатные коды рамки -x20D0 inc (ix+0) ;печать средных линий рамки - ld (ix+1),#00 - ld a,e - rst #10 - ld (ix+1),c - ld a,d - rst #10 - djnz x20D0 -x20E0 inc (ix+0) - ld (ix+1),#00 - call x2120 ;печать нижней линии рамки - pop af - inc a - inc a - inc a - ld (ix+#0B),a - ld (ix+#0A),#06 - pop hl - ld a,l - or h - jr z,x2114 ;нет загаловка - ld (ix+0),#00 - ld (ix+1),#01 - ld (ix+6),l - ld a,h - or a - push af - jr z,x210C ;нет выравнивания - rst #20 - db #84 ;вывод с выравниванием -x210C call x2028 - db #04 ;печать заголовка окна - pop af - jr z,x2114 - rst #10 ;выровняли заголовок -x2114 ld hl,xE338 ;восстановим дескриптор окна - push ix - pop de - ld bc,#000E - ldir - ret -;печать линии рамки -x2120 ld e,(hl) - inc hl - ld d,(hl) - inc hl - ld a,(hl) - inc hl - rst #10 - ld b,(ix+5) ;ширина окна - dec b - dec b -x212C ld a,d - rst #10 - djnz x212C - ld a,e - rst #10 - ret - -;АДРЕС: #2133 коррекция координат и размеров окна -;вх: hl - координаты окна -; e - ширина окна в знакоместах -; d - ширина окна в символах -x2133 ld (xE0F3+#02),hl - ld a,e - ld (xE0F3++#05),a - ld a,d - ld (xE0F3++#0B),a - ret - -;АДРЕС: #213F координаты Y и X полей для окна редактирования дампа -x213F db #00,#02,#05 - db #08,#09,#0B,#0C,#0E,#0F,#11,#12 - db #14,#15,#17,#18,#1A,#1B,#1D,#1E - db #21,#28 - db #FC - db #08,#09,#0B,#0C,#0E,#0F,#11,#12 - db #14,#15,#17,#18,#1A,#1B,#1D,#1E - db #21,#28 - db #FF - -;АДРЕС: #2168 таблица со списком процедур для окна редактирования дампа -x2168 dw x2447 ;#00 печать одной строки дампа памяти (8 байт) - dw x2365 ;#02 обновление окна дампа памяти - dw x21A7 ;#04 заглушка ret - dw x2286 ;#06 скроллинг дампа - dw x2286 ;#08 скроллинг дампа - dw x243D ;#0A чтение байта из памяти пользователя - dw x2442 ;#0C запись байта в память пользователя - dw x2409 ;#0E редактирование слово в bc - dw x244C ;#10 обновление окна с дизасмом памяти начиная с текущей ячейки - -;АДРЕС: #217A поиск чего-то (такое впечатление, что тут ошибка, по логике -; должно быть сравнение с координатой X) -;вых: при текущем раскладе на выходе всегда z -; hl=x213F+#15 -x217A ld hl,(xE9DF) -x217D ld a,(hl) - cp #FD - ret nc - cp #FC - ret z - and #7F - cp (ix+#00) - ret z -x218A inc hl - bit 7,(hl) - jr nz,x217D - jr x218A - -;АДРЕС: #2191 проверка попадания курсора по X на редактируемый байт в дампе -;вых: z - crdX на каком-то байте поля дампа -x2191 ld a,(hl) - cp #FD - ret nc -x2195 inc hl - ld a,(hl) - bit 7,a - ret nz - cp (ix+#01) - ret nc - inc hl - ld a,(hl) - cp (ix+#01) - ret z - jr c,x2195 - xor a -x21A7 ret - -;АДРЕС: #21A8 коррекция координаты X, при движении курсора влево -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21A8 push hl - call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе - pop hl - ret z ;crdX на каком-то байте поля дампа - call x2253 ;декремент координаты X - jr nz,x21A8 ;координата X уменьшена - jr x2208 ;декремента не было - -;АДРЕС: #21B5 коррекция координаты X, при движении курсора -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21B5 ld c,(ix+#01) ;crd X - call x21FD ;коррекция координаты X, при движении курсора вправо - ret z ;курсор на байте дампа - ld (ix+#01),c ;восстановим координату X - call x21A8 ;коррекция координаты X, при движении курсора влево - ret z ;курсор на байте дампа - ld (ix+#01),c ;восстановим координату X - ret - -;АДРЕС: #21C7 инкремент координаты X, и изменение адреса текущей ячейки дампа -;вых: z - курсор на байте дампа -x21C7 call x2247 ;инкремент координаты X в рамках окна - jr z,x21D3 ;инкремента небыло - call x217A - call x21FD ;коррекция координаты X, при движении курсора вправо - ret z ;курсор на байте дампа -; crd X =#00 -x21D3 ld (ix+#01),#00 - -;АДРЕС: #21D7 перемещение курсора на 8 байт вниз (нажатие cs+6/ss+S курсор вниз) -x21D7 ld e,#08 - jr x21DD -;перемещение курсора на один байт вниз -x21DB ld e,#01 -;перемещение курсора на E байт вниз -x21DD call x2006 ;приращение координаты Y курсора - ld a,#08 ;скроллинг дампа - jp z,x202C ;Y не изменилась. вызов процедуры по таблице, адрес которой в (xE9E1) - -;АДРЕС: #21E5 коррекция координаты X, при движении курсора -;вых: z - курсор на байте дампа -; nz - -x21E5 call x21ED - ret z - ld (ix+#00),#00 ;crd Y =0 -x21ED call x217A ;при текущем раскладе на выходе всегда z - jr nz,x21F6 - call x21B5 ;коррекция координаты X, при движении курсора - ret z ;курсор на байте дампа -x21F6 call x2006 ;приращение координаты Y курсора - jr nz,x21ED ;координата Y изменилась - jr x2208 ;установка nz и выход - -;АДРЕС: #21FD коррекция координаты X, при движении курсора вправо -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x21FD push hl - call x2191 ;проверка попадания курсора по X на редактируемый байт в дампе - pop hl - ret z ;crdX на каком-то байте поля дампа - call x2247 ;инкремент координаты X в рамках окна - jr nz,x21FD ;инкремент был -;установка флага nz -x2208 xor a - inc a - ret - -;АДРЕС: #220B декремент координаты X в рамках текущего поля со скроллингом -x220B call x2253 ;декремент координаты X - jr z,x2217 ;декремента не было - call x217A - call x21A8 ;коррекция координаты X, при движении курсора влево - ret z ;курсор на байте дампа -; ставим курсор на крайнюю правую позицию -x2217 ld a,(ix+#0B) ;размер окна в символах - dec a - ld (ix+#01),a ;новая координата X (крайняя правая позиция) - -;АДРЕС: #221E перемещение курсора на 8 байт вверх (нажатие cs+7/ss+W курсор вверх) -x221E ld e,#F8 - jr x2224 -;скроллинг на строку вверх -x2222 ld e,#FF -x2224 call x2012 ;уменьшаем координату Y - ld a,#06 ;скроллинг дампа - jp z,x202C ;координата Y не была уменьшена (вызов процедуры скроллинга) - call x2237 ;коррекция координаты Y, при движении курсора - ret z ;курсор на байте дампа -; установка координаты Y в нижний край окна - ld a,(ix+#04) - dec a - ld (ix+#01),a - -;АДРЕС: #2237 коррекция координаты Y, при движении курсора -;вых: z - курсор на байте дампа -; nz - невозможно откорректировать координату -x2237 call x217A - jr nz,x2240 ;на выходе всегда z - call x21B5 ;коррекция координаты X, при движении курсора - ret z ;курсор на байте дампа -; невозможно откорректировать координату X -x2240 call x2012 ;уменьшаем координату Y - jr nz,x2237 ;координата уменьшена - jr x2208 ;установка nz - -;АДРЕС: #2247 инкремент координаты X в рамках окна -;вых: z - инкремента не было -x2247 ld a,(ix+#0B) ;ширина окна в символах - dec a - cp (ix+#01) - ret z - inc (ix+#01) - ret - -;АДРЕС: #2253 декремент координаты X в рамках окна -;вых: z - декремента не было -x2253 ld a,(ix+#01) - or a - ret z - dec (ix+#01) - jr x2208 - -;АДРЕС: #225D нажатие cs+5/ss+Q курсор влево -;вх: c - crd X курсора -x225D ld a,c - cp #21 - jr c,x226B -; в поле редактирования символов - jr nz,x220B ;не крайняя левая позиция - ld a,#28 -x2266 ld (ix+#01),a ;крайняя правая позиция - jr x2222 ;скроллинг на строку вверх -; в поле редактирования hex дампа или адреса -x226B cp #02 - ret z ;крайняя позиция в адресе - cp #08 - jr z,x2274 ;крайняя позиция в hex дампе - jr x220B ;декремент координаты X в рамках текущего поля со скроллингом -x2274 ld a,#1E ;новая координата X в hex дампе - jr x2266 - -;АДРЕС: #2278 редактирование дампа памяти в окне монитора -x2278 ld hl,x2168 - ld (xE9E1),hl ;адрес таблицы со списком процедур для п/п x2028 - ld hl,x213F - ld (xE9DF),hl - jr x2298 - -;АДРЕС: #2286 скроллинг дампа -;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) -x2286 call x23A9 ;расчет приращения для скроллинга дампа - ld hl,(xDD87) ;адрес начала дампа памяти - add hl,bc ;новый адрес - ld (xDD87),hl - ld hl,(xDD69) ;адрес текущей ячейки в дампе памяти - add hl,de - ld (xDD69),hl - pop hl - -;обновление окна дампа -x2298 call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #02 ;обновление окна дампа памяти - call x21E5 ;коррекция координаты X, при движении курсора - -;основной цикл редактирования дампа памяти -x229F ld hl,x229F ;адрес возврата - push hl - call x23C0 ;определение поля в окне редактирования дампа - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #10 ;обновление окна с дизасмом памяти начиная с текущей ячейки - res 0,(ix+#07) ;выводить символ курсора -;ожидание нажатия клавиши - rst #30 - dw rom2_x28E8 ;печать/удаление курсора в окне - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 ;a - код нажатой клавиши - rst #30 - dw rom2_x28B8 ;восстановление экрана под курсором, если нужно (6 пикселей символ) - db #02 -;реакция на нажатую клавишу - set 0,(ix+#07) ;не выводить символ курсора - ld d,a ;d - код нажатой клавиши - call x23C0 ;определение поля в окне редактирования дампа - jr c,x22E9 ;курсор в поле редактирования адреса дампа - jr nz,x230D ;курсор в поле редактирования символов дампа -; изменение hex значения под курсором в дампе - call x2400 ;чтение байта из памяти пользователя в bc - call x2412 ;редактирование байта в bc - jr nz,x2328 ;байт не изменился. проверка нажатия управляющей клавиши - ld (xDDA7),bc ;новое значение байта - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0C ;запись байта в память пользователя - call x2393 ;печать одной(текущей) строки дампа -; проверка координаты X -x22D9 ld de,#1E08 ;граничные координаты -x22DC ld a,(ix+#01) ;crd X - cp d - jp c,x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа - ld (ix+#01),e - jp x21DB ;перемещение курсора на один байт вниз -; изменение адреса дампа памяти -x22E9 ld bc,(xDD87) ;адрес начала дампа памяти - ld (xDDA7),a ;номер байта в строке дампа - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0E ;редактирование слова в bc - jr nz,x2328 ;слово не изменилось. проверка нажатия управляющей клавиши - ld (xDD69),bc ;новый адрес текущей ячейки в дампе памяти - ld (xDD87),bc ;адрес начала дампа памяти - ld a,(ix+#01) - push af - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #02 ;обновление окна дампа памяти - pop af - ld (ix+#01),a - jp x21C7 ;инкремент координаты X, и изменение адреса текущей ячейки дампа -; изменение символа в символьном поле дампа -x230D call x2400 ;чтение байта из памяти пользователя в bc - ld a,d - cp #20 - jr c,x2328 ;это не символ, проверка нажатия управляющей клавиши - cp #7F - jr nc,x2328 ;это не символ, проверка нажатия управляющей клавиши - ld (xDDA7),a - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #0C ;запись байта в память пользователя - call x2393 ;печать одной(текущей) строки дампа -x2323 ld de,#2821 ;граничные координаты поля редактирования сомволов дампа - jr x22DC ;проверка координат -;проверка и обработка нажатия управляющей клавиши -;вх: d - код нажатой клавиши -x2328 ld a,d - ld c,(ix+#01) ;crd X - call x1033 ;вызов п/п обработки нажатой клавиши - db #85 ;cs+5 - dw x225D ;курсор влево - db #1C ;ss+Q - dw x225D ;курсор влево - db #83 ;cs+8 - dw x235D ;курсор вправо - db #1E ;ss+E - dw x235D ;курсор вправо - db #84 ;cs+7 - dw x221E ;курсор вверх - db #1D ;ss+W - dw x221E ;курсор вверх - db #86 ;cs+6 - dw x21D7 ;курсор вниз - db #8B ;ss+S - dw x21D7 ;курсор вниз - db #89 ;cs+9 - dw x237A ;смена поля редактирования hex <-> символы - db #01 ;cs+1+A - dw x2352 ;установка курсора на редактирование адреса дампа - db #03 ;break/cancel - dw x235B ;выход - db #FF - ret - -;АДРЕС: #2352 установка курсора на редактирование адреса дампа -x2352 ld (ix+#00),#00 ;crd Y =#00 - ld (ix+#01),#02 ;crd X =#02 - ret - -;АДРЕС: #235B выход из режима редактирования дампа -x235B pop hl - ret - -;АДРЕС: #235D нажатие cs+8/ss+E курсор вправо -x235D ld a,c ;crd X - cp #20 - jr nc,x2323 ;в поле редактирования символов - jp x22D9 ;поле редактирования адреса или hex дампа - -;АДРЕС: #2365 обновление окна дампа памяти -x2365 rst #30 - dw rom2_x2E3D ;печать дампа памяти в окне - db #02 - rst #30 - dw rom2_x2E76 ;удаление курсора на предыдущей ячейке дампа - db #02 - ld a,(ix+#01) ;координата X курсора в окне - sub #03 - ld (ix+#01),a - bit 7,(iy+#0E) - ret z ;редактируем hex дамп - -;АДРЕС: #237A смена поля редактирования hex <-> символы -x237A call x23C0 ;определение поля в окне редактирования дампа - ret c ;редактируем адрес дампа - ld hl,xE022 - jr nz,x238B -; установка координат для редактирования символьного представления дампа - set 7,(hl) - add a,#21 -x2387 ld (ix+#01),a - ret -; установка координат для редактирования hex дампа -x238B res 7,(hl) - add a,a - add a,c - add a,#08 - jr x2387 - -;АДРЕС: #2393 печать одной(текущей) строки дампа -x2393 ld c,#00 - call x23F3 ;hl - адрес текущей ячейки в дампе памяти - ld a,(ix+#01) ;crd X - push af - ld (ix+#01),#00 ;crd X =#00 - call x2028 ;вызов процедуры по таблице, адрес которой в (xE9E1) - db #00 ;печать одной строки дампа памяти (8 байт) - pop af - ld (ix+#01),a ;восстановим координату X - ret - -;АДРЕС: #23A9 расчет приращения для скроллинга дампа -;вх: e - количество строк для скролла дампа (e=#01/#08/#FF/#F8) -;вых: bc - приращение для скроллинга дампа -; d =#00/#FF - скроллим вперед/назад -; cy =1 скроллим назад -x23A9 xor a - ld b,(ix+#04) ;высота окна в знакоместах -x23AD add a,#08 - djnz x23AD - ld c,a ;bc - приращение для скроллинга дампа - ld d,#00 - ld a,e - or a - ret p ;e<#80 - dec d ;d=#FF - ld hl,#0000 - sbc hl,bc - ld c,l - ld b,h - ret - -;АДРЕС: #23C0 определение поля в окне редактирования дампа -;вых: cy =1 курсор в поле редактирования адреса дампа -; cy =0, z - курсор в поле редактирования hex дампа -; cy =0, nz - курсор в поле редактирования симвлов дампа -; c,a - номер байта в строке дампа -; hl - адрес текущей ячейки в дампе памяти -x23C0 ld a,(ix+#01) ;crd X - cp #06 - jr nc,x23CB ;это не адресное поле -; это адресное поле - sub #02 - scf - ret -x23CB cp #20 - jr nc,x23E5 -; это hex дамп - sub #08 ;(CrdX-8)/3 - push de - ld c,a - xor a - ld de,#0003 - rst #30 - dw rom2_x16AA ;деление bc=ac/de - db #02 ;l остаток от деления - pop de ;с - номер ячейки в строке дампа памяти - ld a,#01 - sub l ;a - смещение от начала строки до редактируемого разряда - call x23E8 - xor a - ld a,c - ret -;это символьное представление дампа -;вх: a - координата курсора -;вых: nz -x23E5 sub #21 - ld c,a -;установка адреса текущей редактируемой ячейки памяти -;вх: с - номер ячейки в строке дампа памяти -; a - смещение от начала строки до редактируемого разряда -x23E8 ld e,a - call x23F3 - ld (xDD69),hl ;адрес текущей редактируемой ячейки памяти - xor a - inc a - ld a,e - ret - -;АДРЕС: #23F3 расчет адреса текущей редактируемой ячейки памяти -;вх: с - номер ячейки в строке дампа памяти -;вых: hl - адрес текущей ячейки в дампе памяти -x23F3 ld a,(ix+#00) ;координата Y курсора в окне - rlca - rlca - rlca - add a,c - ld hl,(xDD87) ;адрес начала дампа памяти - jp x2023 ;сложение hl=hl+a - -;АДРЕС: #2400 чтение байта из памяти пользователя в bc -;вх: hl - адрес памяти пользователя -;вых: bc,a - прочитанный байт -x2400 ld a,#0A ;номер процедуры *2 (чтение байта из памяти пользователя) - call x202C ;вызов процедуры по таблице, адрес которой в (xE9E1) - ld c,a - ld b,#00 - ret - -;АДРЕС: #2409 редактирование числа в bc -;вх: bc - слово для редактирования -; a - смещение от начала строки до редактируемого разряда -; d - код нажатой клавиши -;вых: bc - отредактированный байт/слово -; nz - число не изменилось -x2409 sub #03 - neg - ld e,a - ld a,#04 ;кол-во разрядов в числе - jr x2414 - -;АДРЕС: #2412 редактирование байта в bc -;вх: bc - байт для редактирования -; e - смещение от конца строки до редактируемого разряда -; d - код нажатой клавиши -;вых: bc - отредактированный байт/слово -; nz - число не изменилось -x2412 ld a,#02 ;кол-во разрядов в числе -x2414 push hl - push de - ld hl,xE1A6 ;буфер для вывода строки - push de - ld de,#2310 ;шестнадцатиразрядное - call x0CDA ;печать числа bc в буфер hl - ld hl,(xE3BC) - ld (hl),#FF - dec hl ;адрес последнего символа - pop de - ld a,d - ld d,#00 - or a - sbc hl,de ;адрес разряда числа - ld (hl),a ;новое значение разряда - ld hl,xE1A6 - rst #30 - dw rom2_x0DF4 ;преобразование строки в число - db #02 - ld c,e ;результат преобразования - ld b,d - jr nz,x243A ;это не число - inc (hl) ;маркер конца строки -x243A pop de - pop hl - ret - -;АДРЕС: #243D чтение байта из памяти пользователя -;вх: hl - адрес в памяти -;вых: a - прочитанный байт -x243D rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - ret - -;АДРЕС: #2442 запись байта в память пользователя -;вх: hl - адрес в памяти -; a - байт для записи -x2442 rst #30 - dw rom2_x0000 ;запись байта в память пользователя (rst #00) - db #02 - ret - -;АДРЕС: #2447 печать одной строки дампа памяти (8 байт) -;вх: hl - адрес памяти (начало дампа) -;вых: hl - следующий адрес памяти (начало дампа) -x2447 rst #30 - dw rom2_x2EBA ;печать одной строки дампа памяти (8 байт) - db #02 - ret - -;АДРЕС: #244C обновление окна с дизасмом памяти начиная с текущей ячейки -x244C bit 5,(iy+#0A) - ret nz ;не обновлять дизассемблер памяти по содержимому ячейки памяти - ld de,(xDD69) ;адрес текущей ячейки в дампе памяти - rst #30 - dw rom2_x2F74 ;вывод дисасма памяти по адресу в de - db #02 - rst #30 - dw rom2_x3019 ;ix = адрес дескриптора окна монитора: дамп памяти - db #02 - ret - -;АДРЕС: #245E переименование подраздела -x245E ld a,#32 ;сообщение заголовка: rename partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем - ;hl - номер позиции в каталоге -x2463 ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr nz,x2471 ;подраздел существует -x246C call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2463 -x2471 ld a,(hl) - ld (xDFFE),a ;тип подраздела - call x2D2F ;ввод имени подраздела - jr c,x246C ;отмена ввода. продолжим выбор - jp x2D50 ;сортировка каталога и выход в меню - -;Не используется АДРЕС: #247D ret -x247D ret - -;АДРЕС: #247E печать нового пути после выбора пунктов меню mount/dismount DRIVE -;вх: a - номер дисковода -x247E and #03 -;печеть сообщения - push af - bit 7,(iy+#0B) - jr nz,x248D ;меню dismount - ld bc,#2B02 ;сообщение: mount on - rst #08 - jr x2491 -x248D ld bc,#2F02 ;сообщение: dismount - rst #08 -x2491 pop af - call x249C ;печать буквы дисковода или пути, если это образ - ld a,#26 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - ret - -;АДРЕС: #249C печать буквы дисковода или пути, если это образ -;вх: a - номер дисковода -x249C push af -;печать буквы дисковода - add a,"A" - rst #10 - pop af - rst #30 - dw rom7_x1B04 ;расчет адреса блока описателя заданного дисковода - db #07 - ld c,a ;код подраздела (для образа =#01) -;печать двоеточия - push af - ld a,":" - rst #10 - pop af - jr z,x24CD ;это реальная дискета -;это образ. печать пути - ld de,#0009 - add hl,de - ld de,xE7C7 ;строка пути к образу диска - push de - call x24DE ;копирование имени из (hl) в (de) - ld a,c - cp #01 - jr nz,x24C4 ;это не образ tr-dos - ld a,#5C ;"\" - ld (de),a - inc de - call x24DE -x24C4 ex de,hl - dec hl - set 7,(hl) - pop hl - rst #30 - dw rom2_x15DB ;печать сообщения из hl - db #02 -x24CD ret - -;АДРЕС: #24CE обработка пункта меню: Z. dismount.../Z. mount... -x24CE bit 7,(iy+#0B) - jr nz,x24D9 ;меню dismount - ld bc,#2D02 ;сообщение: dismount ... - rst #08 - ret -x24D9 ld bc,#3002 ;сообщение: mount ... ___ - rst #08 - ret - -;копирование имени из (hl) в (de) -;вх: b - смещение в имени подраздела -; hl - начало имени подраздела в блоке описателя дисковода -x24DE ld a,l - add a,b - ld l,a - jr nc,x24E4 - inc h -x24E4 ld b,#06 -x24E6 ld a,(hl) - cp #21 - ret c ;непечатный символ. выход - ld (de),a - inc hl - inc de - djnz x24E6 - ret - -;АДРЕС: #24F0 монтирование образа к дисководу -;вх: a - номер дисковода -x24F0 call x2536 ;монтирование/отключение подраздела/образа диска - ret c ;отмена выбора - ld c,#11 ;чтение кода спецификации дисковода - rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 ;hl - адрес кода, определяющего тип текущего дисковода - bit 4,(hl) - jr nz,x2503 - ld hl,xFFDC - res 6,(hl) - -;АДРЕС: #2503 монтирование всех образов с винчестера -x2503 ld a,(xFFCA) - and #03 - ld e,a ;номер текущего дисковода - ld d,#03 -; для всех кроме текущего дисковода -x250B push de - ld a,d - cp e - call nz,x251A - pop de - ld a,d - or a - jr z,x2519 - dec d - jr x250B -x2519 ld a,e -; в конце и для текущего -;монтирование образа с обработкой неудачной попытки -x251A push af - or #80 - rst #30 - dw rom7_x18C0 ;R8DOS #28(40) автоподключение, т. е. подключить то, что задано в секторе автонастроек - db #07 - pop bc - ret nc ;прошло без ошибок -; были ошибки при монтировании образа - push af - ld a,b ;номер дисковода - push bc - or #40 - rst #30 - dw rom7_x18C0 ;R8DOS #28(40) отключить подраздел от драйвера - db #07 - pop bc - pop af - cp #67 - ret z ;нет примонтированнго подраздела/образа - ld a,b - set 7,(iy+#0B) - -;АДРЕС: #2536 монтирование/отключение подраздела/образа диска -;вх: a - номер дисковода -; 7,(iy+#0B) =0/1 mount/dismount -; -x2536 rst #30 - dw rom7_x1AB1 ;определение адреса начала записи для заданного дисковода в буфере xE5A9 - db #07 - push hl ;адрес начала записи для заданного дисковода в буфере xE5A9 - ld b,#00 - bit 7,(iy+#0B) ;=0/1 mount/dismount - call z,x259D ;если да, печать списка разделов и выбор подраздела/образа - pop bc - ret c ;отмена выбора -; подраздел/образ выбран - push hl ;hl - адрес записи в каталоге - push bc - rst #30 - dw rom7_x1E3D ;чтение сектора 3(сектор с настройками) в буфер xE5A9 и проверка контрольной суммы - db #07 - jr nc,x2552 ;успешно - cp #63 ;ошибка контрольной суммы. настройки обнулены - jr nz,x2599 ;ошибки чтения -x2552 pop hl ;hl адрес строки с примонтированным образом в буфере (для заданного дисковода) - bit 7,(iy+#0B) ;=0/1 mount/dismount - res 7,(iy+#0B) - ld (hl),#00 - pop de ;de - адрес записи в каталоге - jr nz,x2592 ;dismount -;формирование записи о примонтированном подразделе/образе - ld a,(de) - push de - ld (hl),a ;+#00 тип раздела/образа - inc hl - ex de,hl - ld bc,#0001 - add hl,bc - ld bc,#0004 - ldir ;+#01 смещение первого сектора от начала винчестера (LBA адрес) - ld (de),a ;+#05 тип раздела/образа - and #DF ;сброс бита защиты от записи - inc de - pop hl ;hl - адрес записи в каталоге - push hl - ld bc,#0006 - add hl,bc - ld bc,#0004 - ldir ;+#06 размер подраздела/образа - cp #01 - jr z,x2588 ;это образ диска - pop hl ;hl - адрес записи в каталоге - push hl - call x25E1 ;+#0A имя подраздела - jr x258E -; это образ диска -x2588 ld hl,xE81B+#0A - call x25E5 ;+#0A имя подраздела, которому принадлежит образ -x258E pop hl ;hl - адрес записи в каталоге - call x25E1 ;+#0A имя подраздела/образа -x2592 rst #30 - dw rom7_x1D2A ;подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер - db #07 - ret nc ;ошибок нет - jr x25D1 ;ошибка записи -;ошибка чтения/записи винчестера -x2599 pop bc - pop hl - jr x25D1 - -;печать списка разделов и выбор подраздела/образа -;вых: cy =1 отмена выбора -; =0 образ/раздел выбран -; hl - адрес записи в каталоге -; (xE81B) заголовок выбранного подраздела/образа -x259D call x2620 ;формирование в буфере xEBF5 списка подразделов MFS - ld bc,(xDD89) ;количество подразделов - ld a,c - or b - jp z,x0EB5 ;подразделов нет. печать текущего меню монитора - ld a,#1E - call x29D7 ;печать окна с подразделами и выбор подраздела в нем -x25AE ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,(hl) - and #DF - cp #01 - jr z,x25C4 ;подраздел TR-DOS - cp #02 - ret z ;MicroDOS - cp #03 - ret z ;IS-DOS - call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x25AE -;выбран подраздел TR-DOS -x25C4 ld de,xE81B ;копируем запись подраздела - ld bc,#0010 - ldir - call x25EB ;формирование в буфере xEBF5 списка образов коллекции - jr nc,x25D6 ;сформировано без ошибок -; ошибки винчестера -x25D1 rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -x25D6 ld a,#1F ;сообщение: select disk - call x29D0 ;печать окна с образами дисков и выбор образа в нем - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - or a - ret -;копирование 6 байт из (hl+#0A) в (de) -x25E1 ld bc,#000A - add hl,bc -;копирование 6 байт из (hl) в (de) -x25E5 ld bc,#0006 - ldir - ret - -;АДРЕС: #25EB формирование в буфере xEBF5 списка образов коллекции -; (xE81B) заголовок выбранного подраздела -x25EB call x2707 ;dehl - смещение(LBA адрес) первого сектора подраздела - rst #30 - dw rom7_x17BB ;чтение в буфер xEBF5 каталог выбранного подраздела - db #07 - ret c ;ошибка -;проверка наличия сигнатуры - ld hl,(xEBF5+#3FC) ;сигнатура подраздела - ld de,#5254 - sbc hl,de - jr z,x2601 ;сигнатура совпадает - ld a,#63 - scf - ret -x2601 push ix - call x2671 ;сортировка записей в буфере по порядку местоположения - ;ix=xEBF5 - call x2707 ;dehl - смещение первого сектора выбранного подраздела - call x2683 ;проверка разрывов между образами и создание пустых записей в буфере - call x2707 ;dehl - смещение первого сектора выбранного подраздела - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ;de=xE9E7 - ld bc,#0006 - jr x2661 ;формирование последней unused записи в буфере - -;АДРЕС: #261A удаление всех подразделов -x261A set 6,(iy+#1C) ;признак изменения каталога - jr x2647 - -;АДРЕС: #2620 формирование в буфере xEBF5 списка подразделов MFS -x2620 res 6,(iy+#1C) - rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x262F ;раздел найден -x262A rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -x262F push hl ;dehl - смещение первого сектора раздела - push de ;bc - адрес дескриптора раздела MFS в буфере - ld l,c - ld h,b - ld de,xE81B - ld bc,#0010 - ldir - pop de - pop hl - rst #30 - dw rom7_x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS - db #07 - jr nc,x264A ;нет ошибок - cp #63 ;раздел не инициализирован - jr nz,x262A ;ошибка чтения -x2647 call x2E71 ;очистка буфера xEBF5 и установка сигнатуры раздела MFS -x264A push ix - call x2671 ;сортировка подразделов в буфере xEBF5 по порядку местоположения - ;ix=xEBF5, bc - количество подразделов в буфере - call x270D ;загрузка числа в dehl из памяти xE81B+8 - call x2683 ;проверка разрывов между подразделами/образами и создание пустых записей в буфере - call x270D ;загрузка числа в dehl из памяти xE81B+8 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ;de=xE9E7 - ld bc,#000C -; формирование последней unused записи в буфере -x2661 ld hl,xE81B - add hl,bc ;адрес количества секторов раздела MFS - ex de,hl - push hl - call x3052 ;(xE9E7) - адрес первого свободного сектора после раздела MFS - pop hl - call x26AC ;проверка конца раздела MFS на наличие пустого места - pop ix - ret - -;АДРЕС: #2671 сортировка записей в буфере xEBF5 по порядку местоположения -;вых: ix,xEBF5 -; bc - количество записей в буфере -x2671 call x271A ;подсчет количества записей - ld hl,x28B9 ;по порядку местоположения - call x2960 ;сортировка дескрипторов записей - ld ix,xEBF5 - ld bc,(xDD89) ;количество записей в буфере - ret - -;АДРЕС: #2683 проверка разрывов между подразделами/образами и создание пустых записей в буфере -;вх: ix=xEBF5 - адрес буфера с каталогом подразделов/образов -; bc - количество подразделов/образов -; dehl - смещение первого сектора MFS раздела (LBA адрес) -x2683 ld (xE9EB),hl - ld (xE9EB+#02),de - push bc - ld hl,xE9EB - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl - pop bc -x2695 ld a,c - or b - ret z ;нет записей - dec bc ;номер последней записи - push bc - push ix - pop hl ;адрес смещения первой записи в буфере - ld bc,#0001 - add hl,bc ;адрес с LBA адресом первой записи в буфере - call x26AC ;проверка разрыва между подразделами/образами и создание пустой записи в буфере - ld bc,#0010 - add ix,bc ;адрес следующей записи в буфере - pop bc - jr x2695 ;повторим - -;АДРЕС: #26AC проверка разрыва между подразделами/образами и создание пустой записи в буфере -;вх: ix=xEBF5 - адрес записи в буфере с каталогом подразделов/образов -; hl - адрес с LBA адресом подраздела/образа (LBA адрес) -; (xE9EB) - расчетный адрес начала этого подраздела/образа (LBA адрес) -;вых: (xE9EB) - расчетный адрес начала следующего подраздела/образа (LBA адрес) -; -x26AC push hl - ld de,xE9EB ;смещение первого сектора MFS раздела (LBA адрес) +2 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl - jr z,x26F8 ;они равны -;есть пустое место. формируем запись unused в буфере - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - ld de,xE9EB - push hl - call x3035 ;вычитание (hl)=(hl)-(de) - pop hl ;(xE9E7) размер пустого пространства - ld de,rom7_x0F59 ;=#00000200 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - jp c,x26F8 ;менее 256Kb - call x2990 ;вставляем новую запись в список записей - push ix - pop hl -; устанавливаем смещение первого сектора новой записи - push hl - ld bc,#0001 - add hl,bc ;адрес смещения первого сектора новой записи - ld de,xE9EB - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - pop hl -; устанавливаем размер новой записи - ld bc,#0006 - add hl,bc ;адрес размера новой записи - ld de,xE9E7 - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - ld (ix+0),#FF ;помечаем как unused - call x26F8 ;расчет адреса начала следующего подраздела/образа (LBA адрес) - ld bc,#0010 - add ix,bc ;двигаем указатель на сдвинутую запись -;расчет адреса начала следующего подраздела/образа (LBA адрес) -x26F8 push ix - pop hl - ld bc,#0006 - add hl,bc ;адрес с размером подраздела/образа - ex de,hl - ld hl,xE9EB - call x3052 ;сложение двух 4х байтных чисел - ret - -;АДРЕС: #2707 загрузка числа в регистры из памяти xE81B+1 -x2707 push bc - ld bc,#0001 - jr x2711 - -;АДРЕС: #270D загрузка числа в регистры из памяти xE81B+8 -x270D push bc - ld bc,#0008 -x2711 ld hl,xE81B - add hl,bc - call x300E ;загрузка числа в регистры из памяти - pop bc - ret - -;АДРЕС: #271A подсчет количества подразделов в MFS -;вых: (xDD89),bc - количество подразделов в разделе MFS -x271A ld hl,xEBF5 - ld e,#10 - xor a - ld d,a - ld b,a - ld c,a -x2723 ld a,(hl) - cp b - jr z,x272E - inc c - add hl,de - ld a,c - cp #3F - jr c,x2723 -x272E ld (xDD89),bc - ret - -;АДРЕС: #2733 удаление всех разделов MBR -x2733 set 6,(iy+#1C) - jr x275F - -;АДРЕС: #2739 формирование в буфере xEBF5 списка разделов MBR -x2739 res 6,(iy+#1C) - set 7,(iy+#1C) - rst #30 - dw rom7_x1768 ;поиск раздела MFS - db #07 - jr nc,x2762 ;раздел найден - res 7,(iy+#1C) - cp #63 - jr z,x2754 ;раздел не найден - rst #30 ;ошибка чтения диска - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret -;раздел MFS не найден. проверяем наличие MBR -x2754 ld hl,(xE5A9+#1FE) ;сигнатура сектора MBR - ld de,#AA55 - or a - sbc hl,de - jr z,x2762 ;сигнатура есть -x275F call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 -;ищем записи в MBR и копируем их в буфер xEBF5 -x2762 ld de,xEBF5 ;сюда сложим существующие записи в MBR - push ix - ld bc,#0400 - ld ix,xE5A9+#1BE ;начало записей в MBR -x276E push bc - xor a - or (ix+4) ;код типа раздела - ld a,c - ld bc,#0010 - jr z,x2781 ;пустая запись - inc a ;+1 найденная запись - push ix - pop hl - push bc - ldir ;копируем в буфер xEBF5 - pop bc -x2781 add ix,bc ;адрес следующей записи в MBR - pop bc - ld c,a ;количество найденных записей - djnz x276E - ld (xDD89),bc ;количество найденных записей - pop ix -;проверка разрывов между разделами и создание пустых записей в буфере -x278D ld hl,x2895 - call x2960 ;сортировка записей MBR по адресу расположения - push ix - ld ix,xEBF5 ;буфер с записями MBR - ld bc,(xDD89) ;количество записей - call x2FCF ;обнуление переменной xE9EB - ld a,(xDFF5) ;значение sector HDD - ld (xE9EB),a ;раздел может начинаться только с начала дорожки - ld a,c - or b - jr z,x27C2 ;нет записей в MBR -x27AA ld a,c - or b - jr z,x27C2 ;больше нет записей MBR для обработки - dec bc - push bc - push ix - pop hl ;адрес начала записи MBR в буфере xEBF5 - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора записи MBR - call x27E1 ;проверка разрывов между разделами и создание - ;пустой записи в буфере - ld bc,#0010 - add ix,bc - pop bc - jr x27AA ;проврека следующей записи MBR -;буфер с записями построен -x27C2 ld hl,(xE5A5) - ld de,#0000 ;head * sector активного HDD - exx - ld bc,(xDFF2) ;значение Cylinders HDD - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - ex de,hl ;hl=xE9E7 (адрес последнего сектора в CHS) - call x302A ;декремент (hl)=(hl)-1 - call x27E1 - pop ix - ret - -;проверка разрывов между разделами и создание пустой записи в буфере -;вх: ix адрес начала записи MBR в буфере xEBF5 -; hl - адрес смещения первого сектора записи MBR -; (xE9EB) первый свободный сектор -;вых: (xE9EB) новый первый свободный сектор -; ix - адрес следующей записи -x27E1 push hl - ld de,xE9EB - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl - jr z,x282C ;нет пропущенных секторов -; вычисляем количество незанятых секторов - ld de,xE9E7 ;переменная - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - ld de,xE9EB - push hl - call x3035 ;вычитание (hl)=(hl)-(de) - pop hl ;(xE9E7) - количество незанятых секторов - ld de,rom7_x0F55 ;это адрес в rom 7 содержит dd #800 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - jp c,x282C ;меньше мегабайта. неучитываем -; создаем новую запись с количеством незанятых секторов - call x2990 ;вставляем новую запись в список записей - push ix - pop hl - push hl ;адрес новой записи - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора новой записи - ld de,xE9EB - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - pop hl ;адрес новой записи - ld bc,#000C - add hl,bc ;адрес количества секторов раздела - ld de,xE9E7 ;количество незанятых секторов - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - call x283B ;установка остальных параметров в новой записи - call x282C ;(xE9EB) новый первый свободный сектор - ld bc,#0010 - add ix,bc ;следующая запись -;расчет нового первого свободного сектора -x282C push ix - pop hl - ld bc,#000C - add hl,bc ;адрес количества секторов раздела - ex de,hl - ld hl,xE9EB - call x3052 ;сложение двух 4х байтных чисел - ret -;установка остальных параметров в новой записи -;вх: ix - адрес новой записи -x283B ld (ix+#00),#FF ;тип unused - ld (ix+#04),#53 ;код типа раздела (MFS) - push ix - pop hl - ld bc,#0008 - add hl,bc ;адрес смещения первого сектора новой записи - push hl - push ix - pop bc - inc bc ;адрес структуры описания раздела MBR +1 - call x2874 ;расчет и установка в структуре записи MBR параметров CHS - pop hl ;адрес смещения первого сектора новой записи -; расчет количества секторов новой записи - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl - push hl - inc de - inc de - inc de - inc de ;адрес количества секторов новой записи - call x3052 ;сложение двух 4х байтных чисел - pop hl - push hl - call x302A ;декремент (hl)=(hl)-1 -; установка конца раздела в CHS - push ix - pop hl - ld bc,#0005 - add hl,bc ;конец раздела - головка - ld c,l - ld b,h - pop hl - ld hl,xE9E7 -;расчет и установка в структуре записи MBR параметров CHS -;вх: bc - адрес структуры описания раздела MBR +1 -; hl - адрес смещения первого сектора новой записи -x2874 push bc - call x300E ;загрузка числа в регистры из памяти - ;dehl - смещение первого сектора новой записи - rst #30 - dw rom7_x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - db #07 - pop hl ;начало раздела - головка - ld a,(iy+#35) - and #0F - ld (hl),a ;головка - inc hl - ld a,(iy+#34) - and #03 - rlca - rlca ;цилиндр (биты 6, 7) - or (iy+#32) ;сектор (биты 0-5) - ld (hl),a - inc hl - ld a,(iy+#33) - ld (hl),a ;цилиндр (старшие биты 8, 9 хранятся в байте номера сектора) - ret - -;АДРЕС: #2895 сортировка двух дескрипторов bc и bc+1 по адресу расположения (для записей MBR) -;вх: bc - номер подраздела -x2895 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5+#08 ;буфер с секторами раздела +8 - add hl,bc - ex de,hl - ld hl,xEBF5+#18 ;#EC0D - -;сортировка двух дескрипторов по возрастанию заданного поля -;вх: hl - адрес ячейки второго подраздела с полем для сортировки -; bc - смещение до дескриптора подраздела в буфере -; de - адрес ячейки подраздела с полем для сортировки -;вых: cy=0 обмена не было -; cy=1 дескрипторы поменяны местами -x28A0 add hl,bc ;адрес ячейки со смещением до начала последнего подраздела - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - ret nc ;расположены по возрастанию - ld hl,xEBF5 ;обмен местами дескриторов - add hl,bc - ex de,hl - ld hl,xEBF5+#10 - add hl,bc - ld b,#10 -x28B0 ld a,(de) - ld c,(hl) - ld (hl),a - ld a,c - ld (de),a - djnz x28B0 - scf - ret - -;АДРЕС: #28B9 сортировка двух дескрипторов bc и bc+1 по порядку местоположения -;вх: bc - номер подраздела -x28B9 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5+#01 ;буфер с секторами раздела +1 - add hl,bc ;адрес ячейки со смещением до начала подраздела - ex de,hl ; - ld hl,xEBF5+#11 ;адрес ячейки со смещением до начала второго подраздела - jr x28A0 ;сортировка по возрастанию местоположения двух дескрипторов - -;АДРЕС: #28C6 уплотнение каталога MBR (удаление в буфере записей unused) -;вх: hl=x2D5D п/п сравнения (hl) с #FF, cy=1 если равны -; -x28C6 ld (xE51C+1),hl - ld bc,(xDD89) ;количество записей в буфере каталога - call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 ;буфер - push hl - push hl - add hl,bc ;конец каталога - ld (xE9E7),hl ;адрес конца каталога - pop hl - ld bc,#0000 -x28DD ex de,hl - ld hl,(xDD89) ;количество записей в буфере каталога - scf ;тут счетчик записей в каталоге - sbc hl,bc ; - inc bc ; - ex de,hl ;hl адрес обрабатываемой записи в каталоге - jr c,x2914 ;нет больше записей - call xE51C ;сравним с #FF - jr nc,x290E ;не равны, следующая запись - push hl ;адрес текущей записи - ex de,hl - ld hl,(xE9E7) - or a - sbc hl,de ;размер необработанного каталога - jr z,x290D ;просмотрели весь каталог - push bc - push hl - ld bc,#0010 ;убираем из каталога запись unused - or a ;и уплотняем каталог - sbc hl,bc - add hl,de - ld (xE9E7),hl ;новый адрес конца каталога, после уплотнения - ld l,e - ld h,d - add hl,bc ;адрес следующей записи - pop bc - ldir ;уплотняем - pop bc - pop hl - jr x28DD ;следущая запись -;конец каталога -x290D pop hl ;адрес конца каталога -;следущая запись -x290E ld de,#0010 - add hl,de - jr x28DD -;завершили уплотнение -;hl адрес конца каталога -x2914 pop de ;de адрес первой записи в каталоге - xor a - sbc hl,de - push hl - ld b,#04 -x291B srl h - rr l - djnz x291B ;hl=hl/#10 - ld (xDD89),hl ;количество записей - pop hl - add hl,de - ld (hl),a - ret - -;АДРЕС: #2928 подсчет количества разделов/подразделов в каталоге -;вых: de - фактическое количество разделов/подразделов в каталоге -x2928 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны - call x2939 ;de - количество пустых записей в каталоге разделов/подразделов - ld hl,(xDD89) ;количество разделов/подразделов в каталоге - or a - sbc hl,de - ex de,hl - ret - -;АДРЕС: #2936 подсчет пустых записей в каталоге разделов/подразделов -;вых: de - количество пустых записей в каталоге разделов/подразделов -x2936 ld hl,x2D5D ;п/п сравнения (hl) с #FF, cy=1 если равны -x2939 ld (xE51C+#01),hl - ld hl,xEBF5 ;каталог разделов/подразделов - ld de,(xDD89) ;количество разделов/подразделов - ld a,e - or d - ret z ;a=#00 нет разделов/подразделов - push bc - ld c,e - ld b,d ;bc количество разделов/подразделов в каталоге - ld de,#0000 ;количество пустых записей в каталоге -x294C dec bc - call xE51C - jr c,x2953 ;запись о разделе/подразделе не пустая - inc de -x2953 ld a,c - or b - jr z,x295E - ld a,#10 ;следующая запись - call x2023 ;сложение hl=hl+a - jr x294C -x295E pop bc - ret - -;АДРЕС: #2960 сортировка дескрипторов подразделов -;вх: hl=x28B9 - по порядку местоположения на винчестере -; hl=x2895 - по адресу расположения (для записей MBR) -x2960 ld (xE51C+1),hl - ld bc,(xDD89) ;количество подразделов - ld a,c - or b - ret z ;подразделы отсутствуют - ld hl,#0001 - sbc hl,bc - ret z ;подраздел только 1 -x2970 xor a - ld r,a - ld bc,(xDD89) ;количество подразделов - dec bc -x2978 push bc - dec bc - call xE51C ;п/п сортировки - jr nc,x2983 ;обмена не было - ld a,#FF - ld r,a ;7,r =1 был зотя бы один обмен -x2983 pop bc - dec bc - ld a,c - or b - jr nz,x2978 ;следующая пара дескрипторов - ld a,r - bit 7,a - jr nz,x2970 ;будем повторять, пока сортировка не закончится - ret - -;АДРЕС: #2990 вставляем новую запись в список записей -;вх: ix адрес начала записи в буфере =xEBF5, с которой надо раздвинуть список -; (xDD89) - количестов записей -x2990 ld bc,(xDD89) ;количество записей (оно же номер первой свободной) - call x2FEF ;умножение bc=bc*#10 - call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 - ld hl,xEBF5 ;буфер с записями - add hl,bc ;адрес новой записи в конце списка - push ix - pop de ;адрес текущей записи - or a - sbc hl,de - ret c ;ошибка - push hl ;на сколько байт сдвинуть - push ix - pop hl ;адрес текущей записи - ld bc,#0010 - ld e,l - ld d,h ;адрес текущей записи - add hl,bc ;куда сдвигаем - ex de,hl - pop bc ;на сколько байт сдвинуть - ld a,c - or b - ret z - push hl - sbc hl,de ;направление переноса - pop hl - jr c,x29BD - ldir - ret -x29BD dec bc - add hl,bc - ex de,hl - add hl,bc - ex de,hl - inc bc - lddr - ret - -;АДРЕС: #29C6 расчет адреса в каталоге -;вх: hl - номер записи в каталоге -;вых: hl - адрес записи в каталоге -x29C6 ld c,l - ld b,h - call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 - add hl,bc - ret - -;АДРЕС: #29D0 печать окна с образами дисков и выбор образа в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D0 ld hl,x2A0A - jr x29E1 - -;АДРЕС: #29D5 печать окна local partition information и выбор записи в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D5 ld a,#16 ;сообщение заголовка: partition information - -;АДРЕС: #29D7 печать окна с подразделами и выбор подраздела в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29D7 ld hl,x2A04 ;таблица со списком процедур для печати окна выбора раздела - jr x29E1 - -;АДРЕС: #29DC печать окна global partition information и выбор записи в нем -;вых: cy=0 выбор произведен успешно -; hl - номер позиции в каталоге -; cy=1 ошибка выбора -x29DC ld a,#16 ;сообщение заголовка: partition information -x29DE ld hl,x29FE ;таблица со списком процедур для печати окна partition information -x29E1 ld (iy-#08),a ;номер сообщения текущей опции - call x2BB8 ;подготовка к печати окна выбора раздела - ld (xE9E1),hl ;адрес списка процедур - call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 - call x1EF1 ;печать каталога и выбор позиции в нем - call x2FDB ;инкремент слова (xDD89)=(xDD89)+1 - ret - -;АДРЕС: #29F4 выбран некорректный раздел. продолжаем выбор -x29F4 call x2FE5 ;декремент слова (xDD89)=(xDD89)-1 - call x1F04 ;продолжаем выбор - call x2FDB ;инкремнт слова (xDD89)=(xDD89)+1 - ret - -;таблица со списком процедур для печати окна global partition information -x29FE dw x2A77 ;печать одного имени из каталога разделов MBR - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: partition information - -;таблица со списком процедур для печати окна выбора раздела -x2A04 dw x2A33 ;печать одного имени из каталога подразделов - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: _select local partition_ - -;#2A0A таблица со списком процедур для печати окна выбора образа диска -x2A0A dw x2A1D ;печать одного имени из каталога образов дисков - dw x2A19 ;получение номера последней записи в каталоге подразделов - dw x2A10 ;заголовок: select disk - -;заголовок: _select local partition _ -x2A10 rst #20 - dc " " - ld b,(iy-#08) ;номер сообщения в блоке - ld c,#02 ;номер блока сообщений - rst #08 ;select local partition - ret -;получение номера последней записи в каталоге разделов/подразделов/образов -x2A19 ld hl,(xDD89) - ret - -;печать одного имени из каталога образов дисков -x2A1D call x2B05 ;проверка первого байта записи каталога на #FF - jr nz,x2A27 ;печать имени - call x2B12 ;печать сообщения: Unused - jr x2A6C ;печать размера -x2A27 rst #20 - dc "Disk Name" - jr x2A59 ;продолжение печати имени диска - -;печать одного имени из каталога подразделов -x2A33 call x2B05 ;проверка первого байта записи каталога подраздела на #FF - jr nz,x2A3D ;<>#FF -x2A38 call x2B12 ;печать сообщения: Unused - jr x2A6C -x2A3D bit 7,(hl) - ld a," " - jr z,x2A45 - ld a,"*" -x2A45 rst #10 ;печать символа из A - - push hl ;печать типа подраздела - ld a,(hl) - and #07 - ld hl,x2B71 ;список сообщений - call x2B8C ;поиск и печать сообщения из HL по типу в A - jr nc,x2A6B ;тип раздела не опознан - ld a,#0A - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - pop hl -x2A59 ld a,":" ;разделитель - rst #10 - - push hl ;печать имени подраздела - ld bc,#000A - add hl,bc - xor a - cp (hl) - jr z,x2A6B ;нет имени - ld b,#06 - rst #30 ;печать имени подраздела - dw rom2_x15B3 ;печать сообщения из hl длиной b - db #02 -x2A6B pop hl -x2A6C ld a,#13 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - call x3005 ;dehl = размер подраздела - jr x2A97 ;печать размера подраздела - -;печать одного имени из каталога разделов MBR -x2A77 call x2B03 ;проверка первого байта записи каталога подраздела на #FF - jr nz,x2A81 ;есть запись - call x2B12 ;печать сообщения: Unused - jr x2A8E ; -; печать типа раздела MBR -x2A81 push hl ;номер записи - ld bc,#0004 - add hl,bc - ld a,(hl) ;код типа раздела - ld hl,x2B1A ;таблица с сообщениями типов разделов - call x2B8C ;поиск и печать сообщения из HL по типу в A - pop hl -; печать размера раздела -x2A8E ld a,#13 - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 - call x300A ;dehl - чоличество секторов раздела MBR - -;печать размера в мегабайтах -;dehl - размер подраздела -x2A97 ld a,e - or d - jr nz,x2AA4 ;мегабайты - ld bc,#0800 - push hl - sbc hl,bc - pop hl - jr c,x2AB2 ;килобайты - -;АДРЕС: #2AA4 преобразование количества секторов в мегабайты -x2AA4 call x2AC0 ;преобразование количества секторов в мегабайты - ld a,#04 - rst #30 - dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - db #02 - rst #20 - dc " MB" - ret -x2AB2 call x2ACC ;преобразование количества секторов в килобайты - ld a,#04 - rst #30 - dw rom2_x1629 ;печать числа в bc (bin/oct/dec/hex) с префиксом - db #02 - rst #20 - dc " KB" - ret - -;АДРЕС: #2AC0 преобразование количества секторов в мегабайты -;вх: dehl - размер в секторах -;вых: bc - размер в мегабайтах -x2AC0 exx - ld bc,#800 - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx -x2AC9 ld c,l - ld b,h - ret - -;АДРЕС: #2ACC преобразование количества секторов в килобайты -;вх: dehl - размер в секторах -;вых: bc - размер в килобайтах -x2ACC exx - ld bc,#0002 - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx - ld a,e - or d - jr nz,x2AE2 ;более 16 bit - push hl - ld bc,#8000 - sbc hl,bc - pop hl - jr c,x2AC9 ;менее #8000 -x2AE2 ld hl,#7FFF ;результат более #7FFF - jr x2AC9 - -;АДРЕС: #2AE7 умножение dehl=de*#800 -;вх: de - число -;вых: dehl - результат -x2AE7 ld l,e - ld h,d - ld de,#0000 - exx - ld bc,#0800 - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ret - -;АДРЕС: #2AF5 умножение dehl=de*2 -;вх: de - число -;вых: dehl - значение -x2AF5 ld l,e - ld h,d - ld de,#0000 - exx -x2AFB ld bc,#0002 - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ret - -;АДРЕС: #2B03 проверка первого байта записи каталога подраздела на #FF -;вх: hl - номер записи в каталоге -;вых: z - первый байт =#FF -x2B03 rst #20 - dc " " - -;АДРЕС: #2B05 проверка первого байта записи каталога подраздела на #FF -;вх: hl - номер записи в каталоге -;вых: z - первый байт =#FF -x2B05 push hl - pop bc -x2B07 call x2FEF ;умножение bc=bc*#10 - ld hl,xEBF5 - add hl,bc - ld a,(hl) - cp #FF - ret - -;АДРЕС: #2B12 печать сообщения: Unused -x2B12 rst #20 - dc "Unused" - ret - -;таблица с названиями разделов MBR -x2B1A db #00 - dc "Unknown DOS" - db #01 - dc "MS-DOS 12FAT" - db #04 - dc "MS-DOS 16FAT" - db #05 - dc "MS-DOS Ext" - db #06 - dc "MS-DOS 3.31+" - db #07 - dc "OS/2 HPFS" - db #0A - dc "OS/2 Boot" - dc "SMFS" - db #FF - -;таблица с названиями разделов MFS -x2B71 db #01 - dc "TR-DOS" - db #02 - dc "MicroDOS" - db #03 - dc "IsDOS" - db #04 - dc "BAD" - db #FF - -;АДРЕС: x2B8C поиск и печать сообщения из HL по типу в A -;вх: hl - список сообщений -; a - тип сообщения -;вых: cy=1 напечатано -; cy=0 сообщение не найдено -x2B8C call x2B9A ;поиск и печать сообщения из HL по типу в A - ret c ;напечатано - rst #20 ;печать сообщения "Unknown" - dc "Unknown" - or a - ret -;поиск и печать сообщения из HL по типу в A -;cy=1 напечатано -;cy=0 сообщение не найдено -x2B9A ld c,a -x2B9B ld a,(hl) - cp #FF - ret z ;конец списка - ld a,c - cp (hl) - inc hl - jr z,x2BAC ;сообщние найдено -x2BA4 ld a,(hl) ;ищем конец сообщения - and #80 - inc hl - jr z,x2BA4 - jr x2B9B -;печать сообщения из hl -;cy=1 напечатано -x2BAC ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x2BAC ;еще не конец сообщения - scf - ret - -;АДРЕС: #2BB8 подготовка к печати окна выбора раздела -x2BB8 push hl - call x0E8C ;снятие выделения атрибутами заданной опции меню (по курсору) - ld hl,#0506 ;координаты окна - ld de,#1C15 ;ширина окна в знакоместах и символах - call x2133 ;коррекция координат и размеров окна - call x0D02 ;очистка нижней строки окна меню - pop hl - ret - -;АДРЕС: #2BCA создание раздела MFS -x2BCA ld a,#19 ;заголовок окна: create partition ... - call x29DE ;печать окна global partition information и выбор записи в нем - ;hl - номер записи в каталоге -x2BCF ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr z,x2BDD ;выбрано незанятое место -x2BD8 call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2BCF -;назанятая область выбрана. создаем раздел MFS (все незанятые области в буфере -; уже помечены признаком раздела MFS) -x2BDD ld a,#07 -x2BDF push hl - push af - call x300A ;загрузка числа в регистры из памяти +12 байт к адресу hl - call x2AC0 ;преобразование количества секторов в мегабайты - pop af ;bc - размер в мегабайтах - ld hl,#0813 - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl - jr c,x2BD8 ;отмена ввода числа - ld a,e - or d - jr z,x2BD8 ;введен ноль - push hl - call x2AE7 ;умножение dehl=de*#800 - ld bc,xE9E7 ;dehl размер создаваемого раздела в секторах - call x301C ;загрузка числа из регистров в память - pop hl - push hl - ld bc,#000C - add hl,bc ;размер раздела MBR в записи в каталоге - call x2FCA ;сравнение со сободным местом - pop hl - ld a,#0C - jr c,x2BDF ;слишком большой раздел хотим создать - ld (hl),#00 ;признак наличия раздела +0 в записи - ld bc,#000C ;заносим в запись в каталоге размера раздела - add hl,bc - ld de,xE9E7 ;размер создаваемого раздела - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - jr x2C2A ;проверка разрывов между разделами и создание пустых записей в буфере - -;АДРЕС: #2C1F удаление раздела MBR -x2C1F ld a,#18 ;сообщение заголовка: delete partition ... - call x29DE ;печать окна global partition information и выбор записи в нем - ;hl - номер записи в каталоге - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ;hl - адрес записи в каталоге - ld (hl),#FF ;помечаем как пустую запись -;проверка разрывов между разделами и создание пустых записей в буфере -x2C2A set 6,(iy+#1C) - ld hl,x2D5D ;!!!это лишняя команда - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - jp x278D ;проверка разрывов между разделами и создание пустых записей в буфере - -;АДРЕС: #2C37 создание подраздела -x2C37 ld a,#19 ;сообщение заголовка: create partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем -x2C3C ret c ;ошибка - call x29C6 ;расчет адреса в каталоге - ld a,#FF - cp (hl) - jr z,x2C4A ;эта запись пустая -x2C45 call x29F4 ;выбран некорректный раздел. продолжаем выбор - jr x2C3C -;создаем подраздел -x2C4A push hl ;адрес начала записи в каталоге - ld hl,#0A01 - ld de,#2B71 - call x2F10 ;выбор типа подраздела - call x205A ;установка текущим окна: вывод каталога - pop hl ;адрес начала записи в каталоге - jr c,x2C45 ;отмена выбора типа подраздела. продолжаем выбор - ld (xDFFE),a ;код типа подраздела - call x2D2F ;ввод имени подраздела - jr c,x2C45 ;отмена ввода - ld a,#07 -x2C64 ld c,a - ld a,(xDFFE) ;код типа подраздела - cp #01 - ld a,c - jr z,x2CEB ;ввод размера подраздела TR-DOS в образах -;ввод числа. размер подраздела в килобайтах - push hl - push af - call x3005 ;dehl - размер подраздела в секторах - call x2ACC ;преобразование количества секторов в килобайты - pop af ;bc - размер в килобайтах - ld hl,#0812 ;параметры окна ввода - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl ;адрес начала записи в каталоге - jr c,x2C45 ;отмена ввода числа - ld a,e ;de - введенное число - or d - ld a,#0C - jr z,x2C64 ;ввели ноль. повторим ввод -;проверка числа - push hl - call x2AF5 ;умножение dehl=de*2 -x2C8C push de - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память - pop bc ;de=xE9E7 - ld a,c - or b - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr nz,x2C64 ;нельзя создать подраздел более 32Mb. повторим ввод -;проверка свободного места под заданный размер - push hl - ld bc,#0006 - add hl,bc ;адрес начала записи в каталоге+6 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr c,x2C64 ;нет места под такой раздел. повторим ввод -;проверка минимально допустимого размера подраздела - push hl - ld hl,xE9E7 ;введенное число - ld de,rom7_x0F59 ;=#00000200 - call x2FCA ;сравнение двух чисел в памяти по адресам в de и hl - pop hl ;адрес начала записи в каталоге - ld a,#0C - jr c,x2C64 ;слишком маленький. продолжим ввод - ld a,(xDFFE) ;код типа подраздела - ld (hl),a - push hl - ld bc,#0006 - add hl,bc - ld de,xE9E7 ;введенное число - ex de,hl - call x3000 ;запишем в дескриптор подраздела размер - pop hl ;адрес начала записи в каталоге - ld a,(hl) - cp #01 - jr nz,x2CE8 ;это не TR-DOS подраздел -;создаем коллекцию образов - push hl ;адрес начала записи в каталоге - ld de,xE8A9 - ld bc,#0010 - ldir ;скопируем дескриптор подраздела - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - pop hl ;адрес начала записи в каталоге - jp nz,x2CE6 ;отказ от сохранения - call x2FB1 ;запись каталога MFS - call x2D63 ;формирование коллекции образов в подразделе TR-DOS - jp x09E5 ;чтение каталога подразделов - -x2CE6 ld (hl),#FF ;помечаем подраздел как удаленный -x2CE8 jp x2D50 ;сортировка каталога и выход в меню -;ввод размера подраздела TR-DOS в образах -;hl - адрес дескриптора подраздела -x2CEB push hl - push af - call x2E30 ;расчет максимального количества образов исходя из размеров подраздела - ld a,c - or a - jr z,x2D2A ;нет образов. продолжаем выбор - pop af - ld hl,#0812 - call x0BD0 ;ввод числа. в BC начальное значение - call x205A ;установка текущим окна: вывод каталога - pop hl - jp c,x2C45 ;отмена ввода. продолжаем выбор - ld a,e - or d - ld a,#0C - jp z,x2C64 ;ноль образов нель создать. продолжаем ввод -; расчет размера подраздела исходя из кол-ва образов - push hl ;адрес дескриптора подраздела - ld l,e - ld h,d - ld de,#0000 - exx - ld bc,#0501 ;размер образа в секторах - rst #30 - dw rom7_x0FB7 ;умножение dehl=de'hl' * bc - db #07 - ld bc,xE9E7 - call x301C ;загрузка числа из регистров в память (de=xE9E7) - ex de,hl - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl +2 сектора на каталог - call x300E ;загрузка числа в регистры из памяти - ;dehl - размер подраздела в секторах - jp x2C8C ;формирование подраздела -x2D2A pop af - pop hl - jp x2C45 ;нет образов. продолжаем выбор - -;АДРЕС: #2D2F ввод имени подраздела -;вх: hl - адрес начала записи в каталоге -;вых: cy=1 отмкна ввода -x2D2F ld a,#09 -x2D31 push hl - ld hl,#070B - call x2E85 ;ввод имени подраздела - call x205A ;установка текущим окна: вывод каталога - pop hl - ret c ;отмена ввода - call x2EA7 ;проверка введенного имени - ld a,#65 - jr c,x2D31 ;имя некорректно, повторим ввод - ret - -;АДРЕС: #2D45 удаление подраздела -x2D45 ld a,#18 ;сообщение заголовка:delete partition ... - call x29D7 ;печать окна с подразделами и выбор подраздела в нем - ;hl - номер позиции в каталоге - ret c ;отмена выбора - call x29C6 ;расчет адреса в каталоге - ld (hl),#FF - -x2D50 set 6,(iy+#1C) ;признак изменения каталога подразделов - ld hl,x2D5D - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - jp x264A ;сортировка каталога и выход в меню - -;АДРЕС: #2D5D сравнение (hl) с #FF, cy=1 если равны -x2D5D ld a,#FF - cp (hl) - ret nz - scf - ret - -;АДРЕС: #2D63 формирование коллекции образов в подразделе TR-DOS -;вх: (xE8A9) - дескриптор подраздела -x2D63 ld hl,xE8A9 ;дескриптор подраздела - call x2E30 ;расчет количества образов исходя из размеров подраздела - ld a,c - or b - ret z ;ни одного образа не поместится - ld b,c - ld c,#01 - push bc - ld de,#0001 - add hl,de - ld de,xE9E7 - call x3000 ;копирование из (hl) в (de) 4х байт - ex de,hl ;hl=xE9E7 - call x3047 ;инкремент числа по адресу hl - call x3047 ;инкремент числа по адресу hl - pop bc ;(xE9E7) LBA адрес начала образа - ld hl,xEBF5 ;начало каталога -;формирование каталога образов и очистка служебного сектора у каждого образа -x2D85 push bc - ld (hl),#01 ;признак образа TR-DOS - inc hl - ld de,xE9E7 - ex de,hl - call x3000 ;копирование из (hl) в (de) 4х байт - ;установка LBA адреса начала образа - ex de,hl ;hl=xE9E7 - call x2DF0 ;создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода - ld bc,#0004 - add hl,bc ;адрес дескриптора образа +5 - ld (hl),#00 -; размер образа - inc hl ;адрес дескриптора образа +6 - ld de,x2DE8 - ex de,hl - ld bc,#0004 - ldir ;размер образа (всегда #0501) -; имя образа - ld bc,#0004 - ld hl,x2DEC - ldir ;постоянное имя образа - ex de,hl - pop bc - push bc ;c - номер образа - ld b,#00 - ld a,#02 - ld e,#0A - push hl - call x0CDC ;печать числа bc в буфер hl - pop hl -; установка адреса следующего образа - inc hl - inc hl ;адрес следующего дескриптора образа - push hl - ld hl,xE9E7 ;сложение двух 4х байтных чисел - ld de,x2DE8 - call x3052 ;(xE9E7) LBA адрес следующего образа - pop hl ;адрес следующего дескриптора образа - pop bc ;номер следующего образа - inc c - djnz x2D85 -;установка сигнатур каталога - ld (hl),#00 - ld hl,#AA54 ;сигнатура каталога образов - ld (xEBF5+#3FE),hl - ld hl,#5254 ;дополнитьельная сигнатура каталога образов - ld (xEBF5+#3FC),hl - - - ld hl,xE8A9 ;дескриптор подраздела - ld de,#0001 - add hl,de ;дескриптор подраздела+1 - call x300E ;загрузка числа в регистры из памяти - ;dehl - LBA адрес начала подраздела - rst #30 - dw rom7_x17EF ;запись каталога образао из буфера xEBF5 - db #07 - ret - -x2DE8 db #01,#05,#00,#00 ;размер образа в секторах -x2DEC db "Disk" ;постоянная часть имени - -;АДРЕС: #2DF0 создание первого (служебного) сектора образа и формирование данных в описателе текущего дисковода -;вх: hl - адрес дескриптора образа +1 -; de - LBA адрес начала данных образа -x2DF0 push hl - ld hl,xE5A9 ;очистка буфера 512b - ld de,xE5A9+1 - ld (hl),#00 - ld bc,#01FF - ldir - pop hl ;адрес дескриптора образа +1 -;создание первого (служебного) сектора образа - push hl - call x300E ;загрузка числа в регистры из памяти (hl) - ;dehl - LBA адрес начала образа - rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - pop hl -;формирование данных в описателе текущего дисковода (а нахрена???) -; LBA адрес начала образа - push hl ;адрес дескриптора образа +1 - ld de,xE590+1 ;LBA адрес начала образа - call x3000 ;копирование из (hl) в (de) 4х байт -; признак образа - ld a,#01 - ld (xE590),a ;признак образа - ld a,#E0 - ld (xFFCE),a ;для дисковода C - pop hl -; размер образа - push hl ;адрес дескриптора образа +1 - ld de,xE590+5 - call x3000 ;копирование из (hl) в (de) 4х байт - ld hl,x2DE8 ;адрес размера образа - ex de,hl - call x3052 ;сложение двух 4х байтных чисел - ld hl,xE590+5 - call x302A ;декремент (hl)=(hl)-1 - pop hl - ret - -;АДРЕС: #2E30 расчет количества образов исходя из размеров подраздела -;вх: hl - адрес дескриптора подраздела -;вых: bc - количество образов -x2E30 push hl - call x3005 ;загрузка числа в регистры из памяти +6 байт к адресу hl - ld bc,xE9E7 ;dehl - размер подраздела - call x301C ;загрузка числа из регистров в память - ex de,hl ;hl=xE9E7 - call x302A ;декремент (hl)=(hl)-1 - call x302A ;декремент (hl)=(hl)-1 -2 сектора - call x300E ;загрузка числа в регистры из памяти (hl) - exx - ld bc,#0501 ;размер образа в секторах - rst #30 - dw rom7_x0F5D ;деление de'hl'=de'hl'/bc - db #07 - exx - ld bc,#0033 ;определение количества образов в подразделе - ld a,e - or d - or h - jr nz,x2E5B - ld a,l - cp #34 - jr nc,x2E5B - ld c,a -x2E5B pop hl - ret - -;АДРЕС: #2E5D сформируем пустой сектор MBR в буфере xE5A9 -x2E5D ld hl,xE5A9+#1BE ;начало списка разделов - ld bc,#0041 - ld de,xE5A9+#1BF - ld (hl),#00 - ldir - ld hl,#AA55 - ld (xE5A9+#1FE),hl ;запишем сигнатуру - ret - -;АДРЕС: #2E71 очистка буфера xEBF5 и установка сигнатуры раздела MFS -x2E71 ld hl,xEBF5 - ld bc,#03FF - ld de,xEBF5+#01 - ld (hl),#00 - ldir - ld hl,#AA54 - ld (xEBF5+#3FE),hl ;xEFF3 - ret - -;АДРЕС: #2E85 ввод имени подраздела -;вх: hl - настройки окна ввода строки -;вых: cy=1 отмена ввода строки -; de - адрес введенной строки -x2E85 ld (xE9EF),hl - set 5,(iy+#0E) - call x0CCA ;очистка буфера для ввода строки - rst #30 ;можно и напрямую вызвать - dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора - db #05 - rst #30 ;можно и напрямую вызвать - dw rom5_x1CB8 ;ввод строки (вых: hl адрес введенной строки) - db #05 -x2E97 ld de,xDE17 ;буфер для ввода строки - ret nc ;строка введена -;отмена ввода - cp #03 - jr nz,x2EA1 - scf ;break/cancel - ret -x2EA1 rst #30 ;можно и напрямую вызвать - dw rom5_x1CB3 ;продолжение ввода строки (вых: hl адрес введенной строки) - db #05 - jr x2E97 - -;АДРЕС: #2EA7 проверка введенного имени -;вх: hl - адрес начала записи в каталоге -; de - адрес введенной строки -;вых: cy=1 ошибка при проверке -; cy=0 имя корректно -x2EA7 push hl - ld bc,#000A - add hl,bc ;начало имени подраздела в дескрипторе - ld a,(xDFFE) ;код типа подраздела - ld c,a - ld b,#06 -x2EB2 ld a,(de) - cp #21 - jr nc,x2EC9 ;это допустимый символ - ld a,b - cp #06 - jr z,x2EC1 ;пустое имя - ld a,(de) - cp " " - jr c,x2EC6 ;недопустимый символ. конец имени -x2EC1 ld a,c - cp #04 - jr nz,x2F0D ;пустое имя только для BAD можно -x2EC6 ld a," " - dec de -x2EC9 inc de ;заполняем остаток пробелами - ld (hl),a - inc hl - djnz x2EB2 - pop hl ;адрес начала записи в каталоге - ld a,c - cp #04 - ret z ;если BAD подраздел -;проверка совпадения имени - push hl - ld a,(xDD89) ;количество записей в каталоге - ld b,a - ld hl,xEBF5 ;начало каталога -x2EDB ld a,(hl) - cp #FF - jr z,x2F04 ;пустая запись - pop de - push de - or a - push hl - sbc hl,de - pop hl - jr z,x2F04 ;запись, на месте которй создаем подраздел - push bc - ex de,hl - ld bc,#000A - add hl,bc - ex de,hl - push hl - add hl,bc - ld bc,#0600 ;проверка совпадения имени -x2EF5 ld a,(de) - cp (hl) - jr z,x2EFA - inc c -x2EFA inc hl - inc de - djnz x2EF5 - pop hl - ld a,c - pop bc - or a - jr z,x2F0D ;есть совпадение по имени. нельзя два одинаковых -x2F04 ld de,#0010 - add hl,de - djnz x2EDB - pop hl - or a - ret -;ошибка при проверке имени -x2F0D pop hl - scf - ret - -;АДРЕС: #2F10 выбор типа подраздела -;вх: hl - настройки окна ввода строки -; de - адрес таблицы с названиями разделов MFS -;вых: cy=1 отмена выбора -; cy=0 тип подраздела выбран -; hl - адрес сообщения с типом и названием подраздела -; a - код типа подраздела -x2F10 ld (xE9EF),hl ;настройки окна ввода строки - set 5,(iy+#0E) - push de - ld a,#64 ;сообщение: select - rst #30 ;можно и напрямую вызвать - dw rom5_x0C22 ;установка параметров окна для ввода строки в меню монитора - db #05 - pop hl ;адрес таблицы с названиями разделов MFS -;выбор типа подраздела -x2F1F push hl -x2F20 xor a ;!!!нет нуля в этой таблице - cp (hl) - jr z,x2F49 -;печать типа подраздела (tr-dos/is-dos/microdos/bad) - push hl - inc hl - ld (ix+1),#01 ;координата X - set 0,(ix+7) ; - call x2BAC ;печать сообщения из hl - rst #30 - dw rom2_x2FED ;печать пробелов до правого края окна - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - res 0,(ix+7) - pop hl - cp #0D - jr z,x2F58 ;enter - cp #03 - jr nz,x2F49 ;что-то нажато - scf ;отмена создания - pop hl - ret -;обработка нажатия любой клавиши -x2F49 inc hl -x2F4A ld a,(hl) ;ищем конец сообщения - and #80 - inc hl - jr z,x2F4A - ld a,(hl) - cp #FF - jr nz,x2F20 ;если не конец блока - pop hl ;если конец блока, переход на начало блока - jr x2F1F -;выбрали тип подраздела в (hl) - тип -x2F58 ld a,(hl) - ex (sp),hl - pop hl - or a - ret - -;АДРЕС: #2F5D запрос на сохранение сектора MBR, если были изменения -x2F5D bit 6,(iy+#1C) - ret z - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - ret nz - -;АДРЕС: #2F66 формирование и запись сектора MBR -x2F66 set 5,(iy+#1C) - ld hl,x2D5D - call x28C6 ;уплотнение каталога MBR (удаление в буфере записей unused) - call x2E5D ;сформируем пустой сектор MBR в буфере xE5A9 - ld de,xE5A9+#1BE ;начала дескрипторов разделов в секторе MBR - ld hl,xEBF5 ;буфер с каталогом - ld a,(xDD89) ;записей в каталоге - cp #04 - jr c,x2F82 ;допустимое значение - ld a,#04 ;можно не больше 4х -x2F82 or a - jr z,x2F8D ;разделов нет - dec a - ld bc,#0010 - ldir ;копируем дескриптор раздела - jr x2F82 ;повторим -x2F8D ld hl,#0000 ;LBA адрес (нулевой сектор) - ld e,l - ld d,h - jr x2F9E ;запись сектора из буфера xE5A9 - -;АДРЕС: #2F94 !!!не используется!!! чтение сектора в буфер xE5A9 -x2F94 rst #30 - dw rom7_x1D73 ;чтение сектора с винчестера в буфер xE5A9 - db #07 - ret nc ;нет ошибок - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;запись сектора из буфера xE5A9 -x2F9E rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - ret nc ;нет ошибок - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;АДРЕС: #2FA8 запрос на сохранение каталога MFS, если были изменения -x2FA8 bit 6,(iy+#1C) - ret z ;список разделов в буфере без изменений - call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - ret nz ;отказ от сохранения - -;АДРЕС: #2FB1 запись каталога MFS/подраздела -x2FB1 set 5,(iy+#1C) - ld hl,x2D5D - call x28C6 ;уплотнение каталога (удаление в буфере записей unused) - call x270D ;загрузка числа в регистры из памяти xE81B+8 - ;dehl - LBA адрес начала раздела MFS - rst #30 ;запись каталога MFS - dw rom7_x17EF ;запись 2х секторов из буфера xEBF5 - db #07 - jp nc,x2503 ;ошибок не было - rst #30 - dw rom7_x1F41 ;ошибка HDD. вывод сообщения об ошибке в нижней строке монитора - db #07 - ret - -;АДРЕС: #2FCA сравнение двух чисел в памяти по адресам в de и hl -x2FCA rst #30 - dw rom7_x1035 ;сравнение двух чисел в памяти по адресам в de и hl - db #07 - ret - -;АДРЕС: #2FCF обнуление переменной xE9EB -x2FCF push hl - ld hl,#0000 - ld (xE9EB),hl - ld (xE9EB+#02),hl - pop hl - ret - -;АДРЕС: #2FDB инкремнт слова (xDD89)=(xDD89)+1 -x2FDB push hl - ld hl,(xDD89) - inc hl - ld (xDD89),hl - pop hl - ret - -;АДРЕС: #2FE5 декремент слова (xDD89)=(xDD89)-1 -x2FE5 push hl - ld hl,(xDD89) - dec hl - ld (xDD89),hl - pop hl - ret - -;АДРЕС: #2FEF умножение bc=bc*#10 -x2FEF sla c - rl b - sla c - rl b - sla c - rl b - sla c - rl b - ret - -;АДРЕС: #3000 копирование из (hl) в (de) 4х байт -x3000 rst #30 - dw rom7_x1003 ;копирование из (hl) в (de) 4х байт - db #07 - ret - -;АДРЕС: #3005 загрузка числа в регистры из памяти +6 байт к адресу hl -x3005 ld bc,#0006 - jr x300D - -;АДРЕС: #300A загрузка числа в регистры из памяти +12 байт к адресу hl -x300A ld bc,#000C -x300D add hl,bc - -;АДРЕС: #300E загрузка числа в регистры из памяти -;вх: hl - адрес откуда грузим -;вых: dehl - число -x300E push hl - pop bc - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a - inc bc - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - ret - -;АДРЕС: #301C загрузка числа из регистров в память -;вх: dehl - число -; bc - адрес куда грузим -;вых: de - адрес куда загрузили -x301C push bc - ld a,l - ld (bc),a - inc bc - ld a,h - ld (bc),a - inc bc - ld a,e - ld (bc),a - inc bc - ld a,d - ld (bc),a - pop de - ret - -;АДРЕС: #302A декремент (hl)=(hl)-1 -x302A push hl - push de -x302C ld de,x3043 - call x3035 - pop de - pop hl - ret - -;АДРЕС: #3035 вычитание (hl)=(hl)-(de) -x3035 ex de,hl - push bc - xor a - ld b,#04 -x303A ld a,(de) - sbc a,(hl) - ld (de),a - inc hl - inc de - djnz x303A - pop bc - ret - -;для инкремента -x3043 db #01,#00,#00,#00 ;dd #01 - -;АДРЕС: #3047 инкремент числа по адресу hl -x3047 push hl - push de - ld de,x3043 - call x3052 ;сложение двух 4х байтных чисел - pop de - pop hl - ret - -;АДРЕС: #3052 сложение двух 4х байтных чисел -;вх: hl - адрес первого числа -; de - адрес второго числа -;вых: hl - сумма чисел -x3052 ex de,hl - push bc - xor a - ld b,#04 -x3057 ld a,(de) - adc a,(hl) - ld (de),a - inc hl - inc de - djnz x3057 - pop bc - ret - -;АДРЕС: #3060 вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши -;вых: z - нажата Y -x3060 ld hl,xE0D7 ;дескриптор окна: запрос на запись MBR - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 -x3067 ld (ix+4),#18 ;высота окна - ld (ix+6),#17 ;атрибуты окна - rst #20 - db #0C ;очистка окна - db #1B,#09,#0F ;координаты печати - db "Warning!" - db #1B,#0B,#08 ;координаты печати - db "Partition will be changed." - db #1B,#0D,#0E ;координаты печати - dc "Write (Y/N)?" - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - ld (ix+6),#31 - ld (ix+4),#16 - and #DF - cp "Y" - ret - -;АДРЕС: #30B9 идентификация жесткого диска -x30B9 push ix - ld ix,xE5A9 - rst #30 - dw rom7_x1E74 ;R8DOS #22(34) идентификация жесткого диска - db #07 - pop ix - ret - -;АДРЕС: #30C6 печать окна для тестирования HDD -x30C6 call x0CF6 ;установка и инициализация окна для ввода строки внизу экрана -x30C9 ld (ix+#01),#00 ;crd X =0 - rst #20 - dc "Press BREAK to exit. ONLY!" - rst #30 - dw rom6_x064D ;установка дескриптора окна: запрос на запись MBR - db #06 - rst #20 - db #8C ;очистка окна - ld (ix+#00),#15 ;crd Y =#15 - ret - -;АДРЕС: #30F3 печать кода ошибки -;вх: a - код ошибки (номер сообщения из блока 0) -x30F3 push af - call x310F ;печать текущих номера головки и сектора - pop bc - ld c,#00 - rst #08 - rst #20 - db #8D ;перевод строки - jr x315E - -;печать текущего номера цилиндра HDD -x30FF ld (ix+#01),#00 ;crd X =0 - rst #20 - dc "C:" - ld bc,(xE047) ;номер цилиндра - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - ret - -;печать текущих номера головки и сектора -x310F call x30FF ;печать текущего номера цилиндра HDD -x3112 rst #20 - dc " H:" - ld a,(xE049) ;номер головки - and #0F - ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #20 - dc " S:" - ld a,(xE046) ;номер сектора - ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ret - -;АДРЕС: #3135 печать сообщения об ошибке несовпадения данных при чтении/записи на HDD -;вх: hl - номер байта в секторе -; c - контрольное значение байта -; b - считанное значение байта -x3135 push bc - push hl - call x310F ;печать текущих номера головки и сектора - rst #20 - dc "data bad " - pop hl - rst #30 - dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - pop bc - push bc - ld a,c - rst #30 - dw rom2_x16E3 ;печать числа a=[#00..#FF] - db #02 - rst #20 - dc ":" - pop bc - ld a,b - rst #30 - dw rom2_x16E3 ;печать числа a=[#00..#FF] - db #02 - rst #20 - db #8D ;перевод строки - -;управление выводимым листингом (опрос клавиш space, s, cs+1) -x315E rst #30 - dw rom2_x37B9 - db #02 - ret - -;АДРЕС: #3163 печать текущего номера цилиндра -x3163 call x30FF ;печать текущего номера цилиндра HDD - call x0110 ;опрос Break. cy=1 не нажата - jr c,x3183 - call x3112 ;нажата Break - rst #20 - dc "Break" -x3174 ld b,#06 ;пауза примерно 245k тактов -x3176 rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - djnz x3176 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 -x3180 jp x0EB5 ;печать текущего меню монитора -x3183 rst #20 - dc " of" - ld bc,(xDFF2) ;значение Cylinders HDD - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #30 - dw rom2_x2B10 ;печать пробела (rst #10) - db #02 - ld a,(iy+#01) - inc (iy+#01) - and #03 - ld hl,x31A6 - add a,l - ld l,a - jr nc,x31A3 - inc hl ;!!!ОШИБКА!!! должно быть inc h -x31A3 ld a,(hl) - rst #10 - ret -x31A6 db #2D,#5C,#7C,#2F ;"-\|/" индикация работы - -;АДРЕС: #31AA удаление всех разделов MBR -x31AA call x3060 ;вывод сообщения с предложением сохранить изменения MBR и ожидание нажатия клавиши - jr nz,x3180 ;нажата не Y. печать текущего меню монитора - ld hl,xE5A9 ;очитска буфера - ld de,xE5A9+1 - ld (hl),#00 - ld bc,#01FF - ldir - xor a - ld l,a - ld h,a - ld e,a - ld d,a - rst #30 - dw rom7_x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl - db #07 - jr nc,x3180 ;ошибок не было. печать текущего меню монитора - ld (ix+#00),#17 ;crd Y - ld (ix+#01),#00 ;crd X - call x30F3 ;печать кода ошибки - jr x3174 ;ждем нажатие клавиши и печать текущего меню монитора - -;АДРЕС: #31D4 неиспользуемая область -x31D4 ds #2C,#00 - -;АДРЕС: #3200 каталог ROM-disk -x3200 dc "ZxUnZip" : ds 7 :db #0E,#04 - dc "ZxZip" : ds 9 :db #39,#05 - dc "TASM_4.0" : ds 6 :db #2F,#07 - dc "SM_2.01" : ds 7 :db #36,#08 - dc "HD_Copy_1.7" : ds 3 :db #02,#0A - dc "TESTFDD" : ds 7 :db #3D,#0A - DUP 10 - ds #10 - EDUP - -;АДРЕС: #3300 ROM-disk -x3300 INCBIN "prof_roms/rom5_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM5.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom5.bat b/ProfRom_Disasm/rom5.bat deleted file mode 100755 index 897a2b9..0000000 --- a/ProfRom_Disasm/rom5.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom5.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom6.a80 b/ProfRom_Disasm/rom6.a80 deleted file mode 100755 index d01ca46..0000000 --- a/ProfRom_Disasm/rom6.a80 +++ /dev/null @@ -1,2902 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #1200 - -;#0000 *NOT USED* (#08 байт) -;#0008 rst #08 печать сообщения по номеру в BC -;#000D *NOT USED* (#03 байта) -;#0010 rst #10 печать символа из A -;#0015 *NOT USED* (#03 байт) -;#0018 вызов процедуры из rom7 (rst #18: dw addr) -;#001B *NOT USED* (ld a,#01) -;#001E *NOT USED* (#02 байта) -;#0020 rst #20 печать строки -;#0025 *NOT USED* (#0B байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#003B *NOT USED* (#2B байт) -;#0066 обработка NMI (зависание с желто-черным бордюром) -;#006F *NOT USED* (#01 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;#00AA *NOT USED* (#55 байт) -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -;#0110 Таблица переходов ПрофПЗУ -;#0114 обработчик прерываний im 1/2 -;#0149 печать строки (rst #20) -;#0156 печать информации о ловушке -;#01E4 установка новой ловушки в отладчике -;#0249 вывод каталога текущего дисковода (на экран/принтер) -;#03A1 печать числа в десятичной системе счисления -;#03A9 форматирование/проверка текущей дискеты -;#04E5 быстрое форматирование текущей дискеты (очистка каталога) -;#064D установка дескриптора окна: запрос на запись MBR -;#0655 hl=hl+5: hl=de (z равны) -;#0667 вызоф функции R8DOS -;#066C установка код дисковой ошибки в переменной для печати числа -;#0675 зануление #100 байт буфера xE5A9 -;#0678 зануление #100 байт памяти с hl -;#067F сохранение экрана пользователя на диск -;#06A6 печать сообщения об ошибке и продолжение работы монитора -;#06AD ввод текстовой строки внизу экрана -;#06С1 печать текущего меню монитора (без возврата) -;не используется #06C5 вывод в порт #FE содержимое ячейки (#7530) -;#06CB таблица соответствий нажатой клавиши печатному символу -;#06F2 таблица кодов клавиш cs+1+клавиша -;#0719 таблица кодов клавиш ss+клавиша -;#0740 таблица кодов клавиш cs+цифра -;#074A ожидание действий пользователя (опрос управления, вывод часов) -;#0773 проверка наличия нажатых клавиш в буфере клавиатуры -;#0777 проверка наличия нажатых клавиш в буфере клавиатуры -;#0780 проверка переполнения буфера клавиатуры -;#078B сброс буфера клавиатуры -;#0792 опрос клавиатуры и установка кода нажатой клавиши в буфере -;#07B2 опрос клавиатуры и установка кода нажатой клавиши -;#0845 опрос клавиатуры -;#086A определение кода нажатой клавиши/комбинации клавиш -;#093F RST #08:db #8B загрузка zs-snap с диска -;#096D копирование активного экрана пользователя в #4000 -;#0972 печать текущего меню монитора (без возврата) -;#0976 загрузка zs-snap (S. load ... snap) -;#097E сохранение zs-snap (S. save ... snap) -;#0B71 расчет начала битовой карты параграфов заданной страницы -;#0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) -;#0D59 включение режима 48k only -;#0D60 установка п/п jp #addr по адресу xE338 -;#0D6D установка/восстановление параметров заголовка zs-snap -;#0E3B загрузка из ROM-disk -;#0EE0 загрузка блока из ROM-disk -;#0EE6 загрузка блока из ROM-disk -;#0F08 загрузка страницы из ROM-disk в память #8000 -;не используется #0F4D заполнение области памяти [#4000..#7FFF] пользователя -;#0F60 запаковка блока -;#1103 сложение hl=hl+a -;#1108 распаковка блока -;#11AF NOT USED -;#1200 ROM-disk -;#4000 - - - -;АДРЕС: #0000 *NOT USED* (#08 байт) -x0000 ds #08 - -;АДРЕС: #0008 rst #08 печать сообщения по номеру в BC -x0008 rst #30 - dw rom5_x11CD ;печать сообщения по номеру в BC - db #05 - ret - -;АДРЕС: #000D *NOT USED* (#03 байта) -x000D ds #03 - -;АДРЕС: #0010 rst #10 печать символа из A -x0010 rst #30 - dw rom2_x2B12 ;печать символа (rst #10) - db #02 - ret - -;АДРЕС: #0015 *NOT USED* (#03 байт) -x0015 ds #03 - -;АДРЕС: #0018 вызов процедуры из rom7 (rst #18: dw addr) -x0018 jp xE41B - -;АДРЕС: #001B *NOT USED* (ld a,#01) -x001B ld a,#01 - ret - -;АДРЕС: #001E *NOT USED* (#02 байта) -x001E ds #02 - -;АДРЕС: #0020 rst #20 печать строки -x0020 ex (sp),hl - push af - jp x0149 - -;АДРЕС: #0025 *NOT USED* (#0B байт) -x0025 ds #0B - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp xE3D3 - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 jp x0114 - -;АДРЕС: #003B *NOT USED* (#2B байт) -x003B ds #2B - -;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) -x0066 ld a,#06 - out (#FE),a - xor a - out (#FE),a - jr x0066 - -;АДРЕС: #006F *NOT USED* (#01 байт) -x006F ds #01 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db ROMdisk/#100 ;смещение начала ром диска (в блоках по 256 байт) - db #40-ROMdisk/#100;количество свободных секторов в странице - db #00 ;смещение до начала каталога - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#55 байт) -x00AA ds #55 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0114 - -;АДРЕС: #0101 номер текущего rom -x0101 db #06 - -;АДРЕС: #0102 Таблица переключений арбитра страниц ПрофПЗУ (#0E байт) -x0102 ds #0E - -;АДРЕС: #0110 Таблица переходов ПрофПЗУ -x0110 db #0C,#00,#08,#04 - -;АДРЕС: #0114 обработчик прерываний im 1/2 -x0114 push af - push hl - push de - push bc - ld ix,(xE3B7) ;адрес дескриптора текущего окна - call x0792 ;опрос клавиатуры и установка кода нажатой клавиши в буфере - rst #30 - dw rom5_x0176 ;восстановление экрана под курсором мыши - db #05 - rst #30 - dw rom2_x28F6 ;мигание текстового курсора в строке ввода - db #02 - push ix ;адрес дескриптора текущего окна - rst #30 - dw rom5_x011C ;опрос манипуляторов и печать курсора - db #05 - call c,x07A0 ;помещение кода нажатой кнопки джойстика/мыши в буфер клавиатуры - bit 6,(iy+#1A) ;чтение времени из CMOS, если возможно - jr z,x0140 ;CMOS отсутствует - bit 3,(iy+#27) - jr z,x0140 ;индикация времени выключена - rst #30 - dw rom7_x1F76 ;чтение из CMOS времени и даты, в случае готовности CMOS - db #07 -x0140 pop ix - pop bc - pop de - pop hl - pop af - ei - reti - -;АДРЕС: #0149 печать строки (rst #20) -x0149 ld a,(hl) - rst #30 - dw rom2_x2B0B ;печать символа со сбросом 7го бита (rst #10) - db #02 - and #80 - inc hl - jr z,x0149 - pop af - ex (sp),hl - ret - -;АДРЕС: #0156 печать информации о ловушке -;вх: hl - адрес ловушки -; d - количество ловушек+1 -; e - номер текущей ловушки -;вых: hl - адрес следующей ловушки -x0156 ld c,e - ld b,#00 - push de -;печать номера ловушки - ld (iy+#08)," " - ld (iy+#07),#02 ;минимум разрядов в числе при переводе в ASCII - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - pop de - rst #20 - dc " " - push hl - bit 6,(hl) - jr nz,x0174 -;ловушка не задана - ld bc,#2900 ;сообщение: *** undefined - rst #08 ;печать сообщения - jr x01D7 ;следующая ловушка -;ловушка задана -x0174 push de - ld b,#02 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 -; печать адреса ловушки - rst #20 - dc "#" - push hl - inc hl - ld e,(hl) - push de - inc hl - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - rst #30 - dw rom2_x16DE ;печать числа hl=[#0000..#FFFF] - db #02 - pop de - pop hl -; печать номера страницы ловушки - ld b,#04 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - ld a,e - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 -; печать типа ловушки - ld b,#04 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - ld a,(hl) - and #03 - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 -; состояние ловушка (активна/неактивна) - ld b,#03 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - bit 7,(hl) - rst #30 - dw rom2_x3201 ;печать ON/OFF от флага nz-ON/z-OFF - db #02 -; начальное значение счетчика проходов по ловушке - ld de,#0005 - add hl,de - ld c,(hl) - inc hl - ld b,(hl) - inc hl - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 -; текущее значение счетчика проходов - ld c,(hl) - inc hl - ld b,(hl) - inc hl - rst #30 - dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом - db #02 -; наличие (+) или отсутствие (-) программы для анализатора - ld b,#02 - rst #30 - dw rom2_x15F3 ;печать нескольких пробелов (в B) - db #02 - pop de - ld a,e - rst #30 - dw rom2_x3210 ;определение адреса ловушки - db #02 - ld a,"-" - jr z,x01D6 - ld a,"+" -x01D6 rst #10 -;адрес следующей ловушки -x01D7 pop hl - ld de,#000B - add hl,de - or a - ret - -;выход в отладчик -x01DE ld a,#0A ;сообщение: too few operands -x01E0 rst #30 - dw rom2_x0B06 ;ввод и обработка команды отладчика - db #02 ;без возврата - -;АДРЕС: #01E4 установка новой ловушки в отладчике -;вх: ix - адрес ловушки -; hl - тип ловушки -; bc - адрес установки ловушки -; a - количество операндов [0..5] -; z - ловушка не задана -x01E4 push ix - ld de,xE585+#01 - ex de,hl -;проверка валидности типа ловушки - push af - ld a,e - and #FC - or d - ld a,#24 ;сообщение: invalid type breackpoint - jr nz,x01E0 ;возврат в отладчик - pop af -;проверка количества параметров - cp #04 - jr z,x0213 ;в текущую страницу - jr c,x01DE ;мало параметров. выход в отладчик - cp #06 - ld a,#0B ;сообщение: too many operands - jr nc,x01E0 ;много параметров. выход в отладчик -;ставим страницу - push hl - ld hl,(xDD99+#08) ;номер страницы - ld a,l - and #F0 - or h - ld a,#18 ;сообщение: invalid bank RAM - jr nz,x01E0 ;неверный номер страницы. выход в отладчик - ld a,l - pop hl - ld (hl),a - set 5,e - jr x0218 -x0213 rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - ld (hl),a -;установка адреса ловушки -x0218 bit 0,e ;e - тип ловушки ???ВОЗМОЖНО ОШИБКА??? - inc hl - jr nz,x0224 ;активная после выполнения - ld a,b - and #C0 - ld a,#25 ;сообщение: bad address breackpoint - jr z,x01E0 ;в ПЗУ ставить нельзя. выход в отладчик -x0224 ld (hl),c - inc hl - ld (hl),b - inc hl - inc hl -;установка количества проходов - ld bc,(xDD99+#06) ;количество проходов по ловушке до ее активизации - ld (hl),c - inc hl - ld (hl),b - inc hl - ld (hl),c - inc hl - ld (hl),b - inc hl - xor a - ld (hl),a - inc hl - ld (hl),a -;установка типа ловушки - ld hl,xE585 - ld a,e - or #C0 - ld (hl),a -;копирование ловушки из временного буфера и выход в отладчик - pop de - ld bc,#000B - ldir - ld a,#81 ;сообщение: enter command - ret - -;АДРЕС: #0249 вывод каталога текущего дисковода (на экран/принтер) -x0249 rst #30 - dw rom2_x3A95 ;подготовка переменных к выводу на экран/принтер - db #02 - ld (iy+#08),#20 - ld hl,(xFFD0) - push hl - rst #30 - dw rom7_x107B ;инициализация дисковода и настройка на дискету - db #07 - jp c,x0382 ;ошибка чтения/записи - push bc - ld bc,#4B00 ;сообщение: disk - rst #08 - ld a,(xFFCA) - add a,"A" - rst #10 ;печать буквы дисковода - rst #20 - dc ':"' -; печать имени диска - ld hl,xE5A9+#F5 - ld b,#08 - rst #30 - dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? - db #02 - rst #20 - dc '", ' -; печать времени и даты - ld d,#DA ;%11011010 - rst #30 - dw rom5_x1AA6 ;читаем время в строку в формате ASCII - db #05 - rst #20 - dc " " - ld d,#20 - rst #30 - dw rom5_x1B18 ;читаем дату в строку в формате ASCII - db #05 - rst #20 - db #8D - pop af ;a - код, определяющий тип дискеты в дисководе - push af -; печать количества дорожек - bit 5,a - ld b,#39 - jr z,x0290 ;40 дорожек на дискете - inc b -x0290 ld c,#01 ;сообщение: 40/80 - rst #08 - ld bc,#3801 ;сообщение: track - rst #08 -; печать количества сторон - pop af - rlca - ld b,#3C - jr nc,x029E - inc b ;сообщение: one/double -x029E ld c,#01 - rst #08 - ld bc,#3B01 ;сообщение: side - rst #08 -; печать идентификационного кода и типа дискеты - rst #20 - dc "(" - ld a,(xE5A9+#E7) ;Идентификационный код TR-DOS (#10) - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#E3) ;Тип дискеты - call x0396 ;печать числа в шестнадцатиричной системе счисления -; печать кол-ва файлов, свободного места - rst #20 - db ")",#0D - dc "File" - ld a,(xE5A9+#E4) ;Количество файлов на дискете - call x03A1 ;печать числа в десятичной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#F4) ;Количество удаленных файлов - call x03A1 ;печать числа в десятичной системе счисления - rst #20 - dc ", free" - ld bc,(xE5A9+#E5) ;Количество свободных секторов - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - rst #20 - dc " (" - ld a,(xE5A9+#E1) ;Номер первого незанятого сектора на дискете - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - dc "/" - ld a,(xE5A9+#E2) ;Номер дорожки первого незанятого сектора - call x0396 ;печать числа в шестнадцатиричной системе счисления - rst #20 - db ")",#0D,#8D -;печать списка файлов на диске (одна страница не более 16 имён) -x02EE ld b,#10 -x02F0 push bc - rst #30 - dw rom7_x1166 ;загрузка очередного дескриптора файла в буфер - db #07 - pop bc - jp c,x0382 ;ошибка чтения - ld a,(hl) - or a - jp z,x037B ;больше нет файлов - push bc - dec a - jr nz,x0312 ;это не удаленнй файл -; печать первого сивола удаленного файла - inc hl - bit 4,(iy+#09) - ld a,#82 - jr z,x030D ;печать на экран - ld a,"?" -x030D rst #10 - ld b,#07 - jr x0314 -; печать имени файла -x0312 ld b,#08 -x0314 rst #30 - dw rom2_x15B9 ;печать сообщения из hl с заменой непечатных символов на ? - db #02 -; печать типа файла - rst #20 - dc " <" - ld a,(hl) - inc hl - rst #10 - rst #20 - dc ">" -; печать стартового адреса и длины файла - ld b,#02 -x0322 push bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - push hl - rst #30 - dw rom2_x1661 ;печать десятичного числа bc [0..65535] с ведущими пробелами, с предварительным пробелом - db #02 - pop hl - pop bc - djnz x0322 - rst #20 - dc " " -; печать размера в секторах - ld a,(hl) - inc hl - push hl - call x03A1 ;печать числа в десятичной системе счисления - pop hl - ld a,#1E - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -; печать номера первого сектора и дорожки - ld b,#02 -x0341 push bc - rst #20 - dc " " - ld a,(hl) - inc hl - push hl - call x0396 ;печать числа в шестнадцатиричной системе счисления - pop hl - pop bc - djnz x0341 - rst #20 - db #8D - pop bc - djnz x02F0 - rst #30 - dw rom2_x35D3 ;сравнение ix=xE075 - db #02 -x0357 jr nz,x02EE ;продолжение вывода на принтер -; одидание нажатия клавиши для продолжения печати - rst #20 - dc "More..." - ld b,(ix+#00) - push bc - rst #30 - dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них - db #05 - pop bc - ld (ix+#00),b ;crd Y - ld (ix+#01),#00 ;crd X - cp #03 - jr nz,x0357 ;продолжаем вывод - ld a,#0A ;прерываем. break/cancel - rst #30 - dw rom2_x2FF1 ;печать пробелов до заданной координаты X - db #02 -;больше нет файлов -x037B rst #20 - db #0D - dc "END" - jr x0387 -;ошибка чтения/записи -x0382 ld b,a - call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа - rst #08 -x0387 res 4,(iy+#09) - pop hl - ld (xFFD0),hl -x038F rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - jp x074A ;ожидание действий пользователя (опрос управления, вывод часов) - -;печать числа в шестнадцатиричной системе счисления -;вх: a - число -x0396 ld b,#00 - ld c,a - ld de,#1023 ;de - делитель для выделения разряда числа/код префикса - rst #30 - dw rom2_x162C ;печать числа в заданной системе счисления - db #02 - ret - -;АДРЕС: #03A1 печать числа в десятичной системе счисления -;вх: a - число -x03A1 ld c,a - ld b,#00 - rst #30 - dw rom2_x165E ;печать десятичного числа bc [0..65535] без ведущих пробелов, с предварительным пробелом - db #02 - ret - -;АДРЕС: #03A9 форматирование/проверка текущей дискеты -x03A9 call x060E ;предложение начать работу с диском (Insert disk, press Y key) - ld d,#27 ;39 - bit 5,a - jr z,x03B4 ;дискета на 40 дорожек - ld d,#4F ;79 -x03B4 ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld e,#01 - rlca - jr c,x03C1 ;двусторонняя -x03BF ld e,#00 -x03C1 push de - ld (ix+#01),#00 ;crd X - rst #30 - dw rom2_x2A85 ;очистка знакоместной строки по координатам курсора - db #02 - pop bc - push bc - ld (iy+#07),#01 ;минимум разрядов в числе при переводе в ASCII - ld c,b - ld b,#00 ;номер дорожки - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - rst #20 - dc "/" - pop bc - push bc - ld b,#00 ;номер стороны - rst #30 - dw rom2_x166E ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - call x05CE ;определение количества секторов на дорожке -;печать графического отображения текущей дорожки - ld b,a ;количество секторов на дорожке - ld (ix+#01),#05 ;crd X - ld (ix+#0A),#08 ;размер символов в пикселях -x03ED push bc - ld a,#10 - rst #30 - dw rom2_x2800 ;печать символа в окне - db #02 - pop bc - djnz x03ED - ld (ix+#0A),#06 ;размер символов в пикселях - rst #20 - db #8D - bit 7,(iy+#13) - jr z,x0411 ;проверка дискеты -;форматирование дискеты - rst #20 - dc "Formating." - call x05A2 ;печать количества отфрматированных/сбойных секторов -x0411 pop de - push de - ld a,e - ld c,#0E ;физическое позиционирование на трек, номер которого задан в регистре D - call x0667 ;вызов функции R8DOS - jr c,x047B ;ошибка чтения/записи - call x05CE ;определение количества секторов на дорожке - pop de -;формирование таблицы секторов с учётом interleaving - ld c,#00 - ld hl,xE5A9 - push hl -x0425 ld (hl),#00 - inc hl - ld (hl),d - inc hl - ld (hl),e - inc hl - inc c - ld (hl),#00 - inc hl - ld (hl),b - inc hl - cp c - jr nz,x0425 - ld (hl),#FE - ex de,hl - push hl - ld c,#01 -x043B ld hl,xE5A9+#03 - ld b,#00 -x0440 ld a,(hl) - or a - jr nz,x0449 - ld (hl),c - inc c - inc b - jr x0450 -x0449 call x0655 ;hl=hl+5: hl=de (z равны) - jr nc,x045D ;hl>=de - jr x0440 -x0450 ld a,(iy+#18) ;значение interleaving 1..26 -x0453 call x0655 ;hl=hl+5: hl=de (z равны) - jr nc,x045D - dec a - jr nz,x0453 - jr x0440 -x045D ld a,b - or a - jr nz,x043B - pop de - pop hl -;форматирование дорожки - push de - push hl - ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - pop hl - ld b,a - ld de,#5A85 - push de - ld c,#0B ;форматирование дорожки - or a - bit 7,(iy+#13) - call nz,x0667 ;вызов функции R8DOS -;проверка дорожки -x047B jp c,x058D ;ошибка чтения/записи - ld (ix+#01),#00 ;crd X - rst #20 - dc "Checking. " - call x05A2 ;печать количества проверенных/сбойных секторов - ld de,#0000 - ld hl,xE5A9 - push hl - ld c,#0C ;чтение дорожки - call x0667 ;вызов функции R8DOS - call c,x0587 ;ошибка чтения дорожки - call x05CE ;определение количества секторов на дорожке - pop hl - exx - pop hl - exx - ld de,(xDFFE) - ld bc,(xE000) -x04AE ld a,(hl) - cp #FE - jr z,x04C7 ;конец таблицы секторов - inc de - or a - ld a,#34 ;paper 6, ink 4 - jr z,x04BC ;сектор без ошибок - ld a,#32 ;paper 6, ink 2 - inc bc -x04BC exx - ld (hl),a - inc hl - exx - inc hl - inc hl - inc hl - inc hl - inc hl - jr x04AE -;следующая сторона/дорожка -x04C7 ld (xDFFE),de - ld (xE000),bc - ld (ix+#01),#0A ;crd X - call x05AA ;печать количества отформатированных/сбойных секторов - pop de - ld a,e - or a - jp nz,x03BF ;следующая сторона - dec d - ld a,d - cp #FF - jp nz,x03B4 ;следующая дорожка - jr x051B ;завершение форматирования/проверки дискеты - -;АДРЕС: #04E5 быстрое форматирование текущей дискеты (очистка каталога) -x04E5 call x060E ;предложение начать работу с диском (Insert disk, press Y key) - ld hl,#0A00 - bit 7,a - jr nz,x04F3 ;двухсторонняя дискета - srl h - rr l -x04F3 bit 5,a - jr nz,x04FB ;80 дорожек - srl h - rr l -x04FB ld (xDFFE),hl ;кол-во секторов - ld hl,#0000 - ld (xE000),hl - and #43 - cp #01 - jr nz,x0573 ;диск не tr-dos -; очищаем нулевую дорожку - call x0675 ;зануление #100 байт буфера xE5A9 - ld e,a -x050E push de - call x065F ;запись сектора из буфера xE5A9 - jp c,x058D ;ошибка чтения/записи - pop de - inc e - bit 4,e - jr z,x050E - -;завершение форматирования/проверки дискеты -x051B ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld e,a - and #43 ;%01000011 - cp #01 - jr nz,x0573 ;формат не tr-dos -; стандартная дискета tr-dos (формирование служебного сектора) - bit 7,(iy+#13) - jr z,x0573 ;провера дискеты - call x0675 ;зануление #100 байт буфера xE5A9 - ld a,#16 - bit 7,e - jr nz,x0539 ;двустронняя дискета - ld a,#18 -x0539 bit 5,e - jr nz,x053F ;80 дорожек на диске - or #01 -x053F ld (xE5A9+#E3),a ;Тип дискеты - ld hl,(xDFFE) - ld de,-#0010 - add hl,de - ld (xE5A9+#DF),hl - ld (xE5A9+#E5),hl ;Количество свободных секторов - ld hl,(xE000) - ld (xE5A9+#DD),hl - ld a,#10 - ld (xE5A9+#E7),a ;Идентификационный код TR-DOS (#10) - ld a,#01 - ld (xE5A9+#E2),a ;Номер дорожки первого незанятого сектора -; ввод имени дискеты - ld hl,xE5A9+#F5 - call x05E8 ;ввод имени диска - ld c,#07 ;идентификация диска - call x0667 ;вызов функции R8DOS - jr c,x058D ;ошибки чтения/записи - ld e,#08 - call x065F ;запись сектора из буфера xE5A9 - jr c,x058D ;ошибки чтения/записи -x0573 call x064D ;установка дескриптора окна - res 4,(iy+#09) ;вывод на экран - rst #20 - db #0D - dc "Complete" - jp x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) - -;ошибка чтения дорожки -x0587 ld a,(xFFDD) ;код ошибки дискового интерпретатора - cp #14 ;были ошибки при чтении/записи дорожки (функции 12, 13) - ret z - -;ошибка чтения/записи -x058D ld b,#46 ;сообщение: stop format _число_ - call x059A ;перевод строки и установка кода дисковой ошибки в переменной для печати числа - rst #08 - call x038F ;пауза 40416t и ожидание действий пользователя (опрос управления, вывод часов) - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;без возврата - -;перевод строки и установка кода дисковой ошибки в переменной для печати числа -x059A rst #20 - db #8D - ld c,#01 - call x066C ;установка кода дисковой ошибки в переменной для печати числа - ret - -;печать количества отфрматированных/сбойных секторов -x05A2 ld de,(xDFFE) - ld bc,(xE000) -x05AA push hl - push bc - push de - rst #20 - dc " Total " - pop bc - pop de - push bc - push de - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - rst #20 - dc "/ Bad " - pop bc - push bc - rst #30 - dw rom2_x1669 ;печать десятичного числа bc [0..65535] с ведущими пробелами - db #02 - pop bc - pop de - pop hl - ret - -;определение количества секторов на дорожке -;вых: a - количество секторов на дорожке -; b - код размера сектора -x05CE ld bc,#0010 ;чтение спецификации дискеты - call x0667 ;вызов функции R8DOS - ld b,a - and #03 ;размер сектора в байтах 128/256/512/1024 - push af - bit 6,b - jr nz,x05DE ;метод записи MFM - add a,#04 -x05DE ld d,#00 - ld e,a - pop bc - ld hl,(xFFC8) ;адрес таблицы с количеством секторов на дорожке - add hl,de - ld a,(hl) - ret - -;ввод имени диска -;вых: cy=1 ввод отменен -x05E8 push hl - ld b,#08 -x05EB ld (hl)," " - inc hl - djnz x05EB - ld a,#89 - call x06AD ;ввод текстовой строки внизу экрана - jr c,x060B ;ввод отменен - jr z,x060B ;пустая строка - pop de - push de - ld bc,#0008 -x05FE ld a,(hl) - cp " " - jr c,x0608 - ldi - jp pe,x05FE -x0608 or a - pop hl - ret -x060B scf - pop hl - ret - -;предложение начать работу с диском (Insert disk, press Y key) -x060E call x064D ;установка дескриптора окна - rst #20 - db #8C ;очистка окна - rst #20 - db #1B,#00,#0A ;установка координат - dc "Insert disk, press Y key" - rst #30 - dw rom5_x0381 ;ожидание нажатия клавиш и обработка реакции на них - db #05 - pop hl - jr c,x063A - cp #0D - jr z,x063F ;выбор курсором. начинаем работу -x063A and #5F - cp "Y" - ret nz ;нажата другая клавиша -x063F push hl - rst #30 - dw rom7_x1065 ;инициализация дисковода - db #07 - ld (ix+#00),#15 ;crd Y - ld bc,#0010 ;чтение спецификации дискеты - jr x0667 ;вызов функции R8DOS - -;АДРЕС: #064D установка дескриптора окна: запрос на запись MBR -;вых: ix - адрес дескриптора окна запрос на запись MBR -x064D ld hl,xE0D7 - rst #30 - dw rom2_x301C ;ix = адрес дескриптора окна монитора из hl - db #02 - ret - -;АДРЕС: #0655 hl=hl+5: hl=de (z равны) -x0655 inc hl - inc hl - inc hl - inc hl - inc hl - or a - sbc hl,de - add hl,de - ret - -;запись сектора из буфера xE5A9 -x065F ld hl,xE5A9 - ld d,#00 - ld bc,#0106 - -;АДРЕС: #0667 вызоф функции R8DOS -x0667 rst #30 - dw rom7_x0229 ;вызов функции R8DOS - db #07 - ret - -;АДРЕС: #066C установка кода дисковой ошибки в переменной для печати числа -x066C ld hl,(xFFDD) ;l - код ошибки дискового интерпретатора - ld h,#00 - ld (xDDA7),hl ;установим код ошибки в переменной для печати числа - ret - -;АДРЕС: #0675 зануление #100 байт буфера xE5A9 -x0675 ld hl,xE5A9 - -;АДРЕС: #0678 зануление #100 байт памяти с hl -;вх: hl - адрес начала памяти -x0678 xor a - ld b,a -x067A ld (hl),a - inc hl - djnz x067A - ret - -;АДРЕС: #067F сохранение экрана пользователя на диск -x067F ld a,#89 ;сообщение: enter name - call x06AD ;ввод текстовой строки внизу экрана - jr c,x06C1 ;ввод отменен - jr z,x06C1 ;пустая строка - ld b,#02 ;файл для записи - rst #30 - dw rom7_x11D4 ;открытие файла для внутренних нужд - db #07 - jr c,x06A6 ;ошибка открытия файла - rst #30 - dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 - db #02 - ld hl,#4000 - ld bc,#1B00 - rst #30 - dw rom2_x3107 ;запись области памяти в файл - db #02 - jr c,x06A6 ;ошибки записи - rst #30 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - db #07 - jr nc,x06C1 ;ошибокнет. выход - -;АДРЕС: #06A6 печать сообщения об ошибке и продолжение работы монитора -;вх: a - номер сообщения из блока 0 -x06A6 call x066C ;установка кода дисковой ошибки в переменной для печати числа -x06A9 rst #30 - dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора - db #02 ;(без возврата) - -;АДРЕС: #06AD ввод текстовой строки внизу экрана -;вх: 7,a =1/0 атрибуты bright 1, paper 3, ink 4/bright 0, paper 5, ink 2 -; 6-0,a - номер сообщения из блока 0 -;вых: cy=1 ввод отменен -; cy=0 строка введена -; z - введена пустая строка -x06AD rst #30 - dw rom5_x1C73 ;ввод текстовой строки в нижней строке экрана - db #05 - jr nc,x06BA ;строка введена - cp #03 ;break/cancel ? - scf - ret z ;отмена ввода - xor a - jr x06AD ;продолжение ввода строки -x06BA rst #30 - dw rom2_x0EE3 ;поиск в буфере ввода строки первого печатного символа - db #02 - scf - ccf - ret - -;АДРЕС: #06С1 печать текущего меню монитора (без возврата) -x06C1 rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;переход без возврата - -;АДРЕС: #06C5 вывод в порт #FE содержимое ячейки (#7530) -x06C5 ld a,(#7530) - out (#FE),a - ret - -;АДРЕС: #06CB таблица соответствий нажатой клавиши печатному символу -x06CB db "ZXCV" - db "ASDFG" - db "QWERT" - db "12345" - db "09876" - db "POIUY" - db #0D,"LKJH" - db " ",#80,"MNB" - -;АДРЕС: #06F2 таблица кодов клавиш cs+1+клавиша -x06F2 db #1A,#18,#03,#16 - db #01,#13,#04,#06,#07 - db #11,#17,#05,#12,#14 - db #FF,#FF,#FF,#FF,#FF - db #FF,#FF,#FF,#FF,#FF - db #10,#0F,#09,#15,#19 - db #FF,#0C,#0B,#0A,#08 - db #00,#FF,#0D,#0E,#02 - -;АДРЕС: #0719 таблица кодов клавиш ss+клавиша (ss+cs =#03) -x0719 db ":`?/" - db #8A,#8B,#8E,#8C,#8D - db #1C,#1D,#1E,"<>" - db "!@#$%" - db "_)('&" - db #22,";",#1F,"][" - db #FF,"=+-^" - db #82," .,*" - -;АДРЕС: #0740 таблица кодов клавиш cs+цифра -x0740 db #FF ;cs+1 - db #81 ;cs+2 - db #87 ;cs+3 - db #88 ;cs+4 - db #85 ;cs+5 - db #7F ;cs+0 - db #89 ;cs+9 - db #83 ;cs+8 - db #84 ;cs+7 - db #86 ;cs+6 - -;АДРЕС: #074A ожидание действий пользователя (опрос управления, вывод часов) -;вых: a - код нажатой клавиши -; -x074A call x078B ;сброс буфера клавиатуры -x074D ld hl,xE02E ;печать времени и даты - bit 0,(hl) - jr z,x075B - di - res 0,(hl) - rst #30 - dw rom5_x1A4C ;печать даты и времени в окне монитора - db #05 -x075B ei - call x0773 ;проверка наличия нажатых клавиш в буфере клавиатуры - jr z,x074D ;буфер пустой - di - ex de,hl - ld a,(de) ;читаем код клавиши из буфера - inc de - call x0780 ;проверка достижения конца буфера клавиатуры - ld (xE118),de - push af ;код клавиши - rst #30 - dw rom5_x0176 ;восстановление экрана под курсором мыши - db #05 - pop af - ret - -;АДРЕС: #0773 проверка наличия нажатых клавиш в буфере клавиатуры -;вых: z - буфер пустой -; de - очередной адрес в буфере -; hl - адрес начала буфера -; -x0773 ld de,(xE116) - -;АДРЕС: #0777 проверка наличия нажатых клавиш в буфере клавиатуры -;вх: de - адрес в буфере клавиатуры -;вых: z - буфер пустой -; hl - адрес начала буфера -; -x0777 ld hl,(xE118) - or a - push hl - sbc hl,de - pop hl - ret - -;АДРЕС: #0780 проверка переполнения буфера клавиатуры -;вх: de - очередной адрес в буфере клавиатуры -;вых: cy =0 адрес в пределах буфера -; =1 буфер переполнен. сброс буфера -; de - адрес начала буфера -; -x0780 ld hl,xE38F+#0A ;xE399 - or a - sbc hl,de - ret nc - ld de,xE38F - ret - -;АДРЕС: #078B сброс буфера клавиатуры -; -x078B ld hl,(xE118) - ld (xE116),hl - ret - -;АДРЕС: #0792 опрос клавиатуры и установка кода нажатой клавиши в буфере -; -x0792 call x07B2 ;опрос клавиатуры и установка кода нажатой клавиши - ld hl,xE005 - bit 2,(hl) - ret z ;ничего не нажато - ld a,(xE006) ;код клавиши - res 2,(hl) -x07A0 ld de,(xE116) ;помещение кода клавиши в буфер клавиатуры - ld (de),a - inc de ;нажатую клавишу в буфер клавиатуры - call x0780 ;проверка переполнения буфера клавиатуры - call x0777 ;проверка не был ли сброшен буфер - ret z ;буфер пустой - ld (xE116),de ;очередной адрес в буфере - ret - -;АДРЕС: #07B2 опрос клавиатуры и установка кода нажатой клавиши -;вых: a - код нажатой клавиши, если нажата -; -x07B2 call x0845 ;опрос клавиатуры - jr z,x07BA ;ничего не нажато - call x086A ;определение кода нажатой клавиши/комбинации клавиш -x07BA ld hl,xE005 - jr nz,x07C4 ;что-то нажато -x07BF res 0,(hl) ;автоповтор не активен -x07C1 res 1,(hl) ; - ret -x07C4 bit 0,(hl) - jr nz,x07D5 ;не первое нажатие, проверим возможность автоповтора - set 0,(hl) ;первое нажатие - ld (xE007),a - ld hl,(xE051) ;период автоповтора - ld h,l - ld (xE051),hl - ret -x07D5 ld e,a ;код клавиши - ld a,(xE007) - cp e - jr nz,x07BF ;другая клавиша, сброс счетчика автоповтора - bit 1,(hl) - jr nz,x0834 ;работает автоповтор - ld de,(xE051) ;счетчик периода автоповтора - dec d - ld (xE051),de - ret nz - set 1,(hl) ;активируем автоповтор - ld e,a ;код клавиши - ld a,(xE04E) ;антидребезговая задержка - ld (xE050),a - ld a,e -;обработка нажатой клавиши -x07F4 cp #80 - jr nz,x0804 - ld a,%01000000 ;cs+ss -x07FA xor (hl) - ld (hl),a - ld a,(xE04E) - ld (xE052),a - jr x07C1 -x0804 cp #81 - jr nz,x080C - ld a,#80 ;cs+2 - jr x07FA -x080C cp #82 - jr nz,x0817 - call x0916 ;ss+space - ld a,#00 - jr x07FA -;установка кода нажатой клавиши в переменную -x0817 bit 2,(hl) - ret nz - bit 5,(hl) - jr z,x082E ;???? возможно для ввода кириллицы - cp #40 - jr c,x082E ;a=[#00..#3F] - cp #80 - jr nc,x082E ;a=[#80..#FF] - cp #60 - jr nc,x082C ;a=[#60..#7F]+#60 - add a,#40 ;a=[#40..#5F]+#40+#60 -x082C add a,#60 -x082E ld (xE006),a ;код клавиши - set 2,(hl) - ret -x0834 ld de,(xE04F) ;счетчик автоповтора - dec d - ld (xE04F),de - ret nz ;до срабатывания автоповтора еще рано - ld d,e - ld (xE04F),de - jr x07F4 - -;АДРЕС: #0845 опрос клавиатуры -;вых: z - нажато много клавиш/не нажато ни одной -; nz - что-то нажато -; hl - адрес в буфере последней нажатой клавиши -; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4, -;соответсвие клавиш скан-кодам -;12345 67890 -;QWERT YUIOP -;ASDFG HJKLe -;cZXCV BNMss -; -;0F 10 11 12 13 18 17 16 15 14 -;0A 0B 0C 0D 0E 1D 1C 1B 1A 19 -;05 06 07 08 09 22 21 20 1F 1E -;00 01 02 03 04 27 26 25 24 23 -; -x0845 ld bc,#FEFE - ld hl,xDFEA-1 - ld de,#05FF -x084E in a,(c) - push bc - ld b,#05 -x0853 inc e - rrca - jr c,x085F ;не нажата - dec d - inc sp - inc sp - ret z - dec sp - dec sp - inc hl - ld (hl),e -x085F djnz x0853 - pop bc - sli b - jr c,x084E - ld a,d - sub #05 - ret - -;АДРЕС: #086A определение кода нажатой клавиши/комбинации клавиш -;вх: hl - адрес в буфере последней нажатой клавиши -; d - кол-во нажатых клавиш: =4 -> 1, =3 -> 2, =2 -> 3, =1 -> 4 -;вых: z - клавиша/комбинация клавиш не функциональна -; nz - на клавише/комбинации клавиш есть функция -; a - код нажатой клавиши/комбинации клавиш -; -x086A ld e,(hl) - ld a,d - sub #02 - jr z,x08AE ;нажато 3 клавиши - jr c,x088E ;нажато 4 клавиши - rra - jr c,x08C6 ;нажато 2 клавиши -;нажата 1 клавиша - ld a,e - or a - ret z ;нажата CapsShift - cp #24 - ret z ;нажата SymbolShift - ld d,#00 - ld hl,x06CB-1 ;таблица соответствий нажатой клавиши печатному символу - add hl,de - ld a,(hl) - cp #3A - ret c ;это не буква - ld hl,xE005 - bit 7,(hl) - ret nz - add a,#20 ;переводим в нижний регистр - ret -;нажато 4 клавиши -x088E ld hl,xDFEA - ld a,(hl) - or a - jr nz,x08C4 ;cs не нажата - inc hl - ld d,(hl) - inc hl - ld a,(hl) - cp #0F - jr nz,x08C4 ;cs+1 не нажата - ld a,e - sub #0F - cp d - jr nz,x08C4 -;cs+1+клавиша -x08A3 ld e,a - ld d,#00 - ld hl,x06F2-1 -x08A9 add hl,de - ld a,(hl) -;cs+цифра/ss -x08AB cp #FF ;это cs+1? - ret -;нажато 3 клавиши -x08AE ld hl,xDFEA ;буфер нажатых клавиш - ld a,(hl) - or a - jr nz,x08C4 ;cs не нажата - inc hl - ld a,(hl) - cp #0F - jr nz,x08BF ;1 не нажата - inc hl -x08BC ld a,(hl) - jr x08A3 ;cs+1+клавиша -x08BF ld a,e - cp #0F - jr z,x08BC ;cs+1+клавиша -x08C4 xor a ;неизвестная комбинация - ret -;нажато 2 клавиши -x08C6 dec hl - ld a,(hl) ;код первой клавиши - or a - jr z,x08DC ;это CapsShift - cp #24 - jr z,x08D5 ;это SymbolShift - ld a,e - ld e,(hl) - cp #24 - jr nz,x08C4 ;вторая клавиша не SymbolShift -x08D5 ld d,#00 ;ss+клавиша - ld hl,x0719-1 - jr x08A9 -; комбинация с CapsShift -x08DC ld hl,x06CB-1 - ld a,e - cp #23 - jr z,x090F ;cs+space - cp #0F - jr c,x08F2 ;cs+буква - cp #19 - jr nc,x08F2 ;cs+буква/ss/enter - ld hl,x0740 ;cs+цифра - sub #0F - ld e,a -x08F2 ld d,#00 - add hl,de - ld a,(hl) - cp #3F - ret c ;если cs+enter - cp #7F - jr z,x0909 ;cs+0 - jr nc,x08AB ;cs+цифра/ss - ld hl,xE005 ;cs+буква - bit 7,(hl) - jr z,x0909 - add a,#20 ;CapsLock включен, переводим в нижний регистр - ret -x0909 cp #80 ;cs+ss - ret nz - cp #81 ;cs+2 - ret -;нажата cs+space -x090F call x078B - ld a,#03 - jr x0909 -;нажата ss+space (???режим рисования рамок) -;hl=xE005 -x0916 bit 5,(hl) - ld a,#05 - jr z,x091E - ld a,#07 -x091E ld (xE053),a ;цвет бордюра при подаче звукового сигнала - ret - -;продолжение RST #08:db #8B загрузка zs-snap с диска -x0922 db "bootm",#00 -;вх: a - номер дисковода 0..3 -x0928 ld a,(xDD7F+#01) ;xDD80 регистр A пользователя - add a,"A" - ld (de),a - inc de - ld a,":" - ld (de),a - inc de - push hl - ld hl,x0922 - ld bc,#0006 - ldir - pop hl - jr x095B - -;АДРЕС: #093F RST #08:db #8B загрузка zs-snap с диска -;вх: +1 =#00 используем имя bootm -; a - номер дисковода -;вх: +1 ="filename",#00 - имя файла -x093F ld b,#00 - ld hl,(xDD6B) ;pc программы пользователя - ld de,xEBF5 - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - inc hl - or a - jr z,x0928 ;имя файла по умолчанию - -;читаем имя файла из памяти пользователя -x094F ld (de),a - inc de - or a - jr z,x095B - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - inc hl - djnz x094F -x095B ld (xDD6B),hl ;новый pc программы пользователя - ld hl,xEBF5 ;адрес строки с именем файла - res 6,(iy+#13) ;чтение - res 5,(iy+#0B) ;функции вызываются из монитора - ld b,#01 - jr x098D ;чтение snap - -;АДРЕС: #096D копирование активного экрана пользователя в #4000 -x096D rst #30 - dw rom2_x3A21 ;копирование активного экрана пользователя в #4000 - db #02 - ret - -;АДРЕС: #0972 печать текущего меню монитора (без возврата) -x0972 rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора - db #05 ;переход без возврата - -;АДРЕС: #0976 загрузка zs-snap (S. load ... snap) -x0976 res 6,(iy+#13) - ld b,#01 - jr x0984 - -;АДРЕС: #097E сохранение zs-snap (S. save ... snap) -x097E set 6,(iy+#13) - ld b,#02 -x0984 push bc - ld a,#89 - call x06AD ;ввод текстовой строки внизу экрана - pop bc - jr c,x0972 ;ввод отменен -x098D rst #18 - dw rom7_x11D4 ;открытие файла для внутренних нужд R8DOS #14 - jr c,x09B4 ;ошибка открытия файла - ld l,(ix+#0E) ;ix - адрес буфера fcb - ld h,(ix+#0F) ;l - номер первого сектора файла - ld (xE7C5),hl ;h - номер первой дорожки файла - bit 6,(iy+#13) - push af - call nz,x096D ;если запись файла, копирование активного экрана пользователя в #4000 - pop af - push af - jr nz,x09AE ;запись файла - -;чтение файла - rst #18 - dw rom7_x1365 ;последовательное чтение очередного сектора из файла R8DOS #1C - jr c,x09B4 ;ошибка открытия файла - jr x09BD - -;запись файла -x09AE ld bc,#0100 ;новый указатель - rst #18 - dw rom7_x1405 ;новое значение указателя в файле R8DOS #20 -x09B4 jp c,x06A6 ;ошибка чтения/записи - ld hl,xE8A9 ;заголовок файла - call x0678 ;занулим это заголовок (#100 байт) -x09BD pop af - ld hl,xE8A9 ;заголовок файла - call x0D6D ;установка/восстановление параметров заголовка zs-snap - rst #30 - dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld a,#02 - bit 6,(iy+#13) - jr z,x09F6 ;чтение файла -;запись файла -; RAM 2 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без -; RAM 5 - ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - rst #30 - dw rom2_x0606 ;копирование страницы 5 в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 -; RAM активная страница при входе в монитор - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - rst #30 - dw rom2_x0606 ;копирование страницы пользователя в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - jr x0A2D - -;чтение файла -x09F6 set 3,(iy+#13) - call x0B71 ;расчет начала битовой карты параграфов заданной страницы - call x0D01 ;определение адреса загрузки страницы в памяти - ld a,h - sub #80 - jr z,x0A0F ;пустая страница. не загружаем - inc a - ld b,a - ld c,#00 - rst #30 ;!!! можно через rst #18 вызвать - dw rom7_x1405 ;новое значение указателя в файле R8DOS #22 - db #07 - jr c,x0A86 ;ошибка чтения -; RAM 5 -x0A0F ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 -; RAM активная при входе в монитор - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - -;проверка режима памяти 48k/128-256k -x0A2D rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - jr c,x0A86 ;ошибки чтения/записи - bit 5,(iy-#02) - call nz,x0D59 ;включение режима 48k only - jp nz,x0A9D ;режим 48k only. завершение загрузки/сохранения zs-snap -;загрузка остальных страниц - ld (ix+#07),#2F - xor a - push af - call x0B41 ;откроем следующий файл zs-snap - pop af -x0A46 push af - cp #02 - jr z,x0A8B ;ram 2 уже сохранена - cp #05 - jr z,x0A8B ;ram 5 уже сохранена - cp #08 - jr z,x0A8B ;ram 8 не сохраняем - cp #09 - jr z,x0A8B ;ram 9 не сохраняем - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld l,a - rst #30 - dw rom2_x3707 ;сравнение страницы пользователя с заданной - db #02 - jr z,x0A8B ;страница пользователя уже загружена/сохранена -; загрузка/сохранение очередной страницы - ld a,l - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - bit 6,(iy+#13) - jr z,x0A75 ;загрузка страницы - rst #30 - dw rom2_x0606 ;копирование страницы пользователя в #8000 - db #02 - call x0C8C ;запись страницы с адреса #8000 на диск, с компрессией/без - jr x0A7C -x0A75 call x0BB6 ;загрузка страницы zs-snap с адреса #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 -x0A7C ld a,(xE7A9+#14) ;указатель в файле (старший байт) - cp #BE - jr c,x0A8B - rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 -x0A86 jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - call x0B41 ;откроем следующий файл zs-snap -;следующая страница -x0A8B pop af - inc a - cp #10 - jr c,x0A46 ;еще не все загружено - ld hl,(xE7A9+#13) ;указатель в файле (младший байт) - ld a,h - or e - jr z,x0A9D - rst #18 - dw rom7_x1307 ;R8DOS #15(21) закрыть файл, открытый функцией 20 - jr c,x0AB0 ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - -;завершение загрузки/сохранения zs-snap -x0A9D bit 6,(iy+#13) - jr z,x0AB2 ;чтение файла -; запись заголовка zs-snap - ld hl,xE8A9 ;адрес заголовка - ld de,(xE7C5) ;номер первого сектора/дорожки файла - ld bc,#0106 - rst #18 - dw rom7_x0229 ;вызов функции R8DOS -x0AB0 jr c,x0B2E ;ошибки записи -; чтение файла -x0AB2 call x0AC8 ;загрузка RAM 2 из файла zs-snap - bit 6,(iy+#13) - ret nz ;запись zs-snap -x0ABA bit 2,(iy+#14) - ret nz ; - rst #30 - dw rom2_x013A ;выход из монитора - db #02 ;без возврата - -;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя -x0AC3 rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ret - -;загрузка RAM 2 из файла zs-snap -x0AC8 ld hl,(xE7C5) ;номер первого сектора/дорожки файла zs-snap - inc l ;следующий сектор - bit 4,l - res 4,l - jr z,x0AD3 - inc h ;следующая дорожка -x0AD3 ld (xE7C5),hl - ld a,#02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0D01 ;определение адреса загрузки страницы в память/кол-ва секторов - bit 7,(iy+#13) - jr z,x0B10 ;без компрессии -; с компрессией - ld a,(de) - ld (xE33B),a ;размер в секторах запакованной страницы - ld a,h - sub #80 - jr nz,x0AF2 ;надо что-то загрузить - call x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 - jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход -; загружаем запакованную страницу -x0AF2 ld hl,x0C50 ;процедура загрузки секторов страницы в буфер xE5A9 - call x0D60 ;установка п/п jp x0C50 по адресу xE338 - ld hl,xE5A9 ;адрес буфера откуда распаковывать - ld de,xE5A9+#200 ;первая свободная ячейка в буфере (de-hl длина запакованного блока) - exx - ld hl,#8000 ;адрес куда распаковывать - call x1108 ;загрузка и распаковка блока длиной #100 - ld hl,#4000 - or a - sbc hl,bc - jr z,x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход - jp x0BEF ;ошибка. размер распакованного блока не равен размеру страницы -; без компрессии -x0B10 push hl - ld a,h - sub #80 - jr z,x0B28 ;пустая страница -; загружаем страницу - push de - ld b,a ;количество секторов - ld hl,#8000 - ld de,(xE7C5) ;номер первого сектора/дорожки странцы zs-snap - ld c,#05 - rst #18 - dw rom7_x0229 ;вызов функции R8DOS. загрузка секторов - jp c,x0B3B ;ошибки чтения - pop de -x0B28 pop hl - call x0C0C ;распределение загруженной страницы по памяти с учетом пустых параграфов - jr x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя и выход - -;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход -x0B2E push af - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - cp #02 - jr z,x0B3A ;2я страница уже сохранена - call x0AC8 ;загрузка RAM 2 из файла zs-snap -x0B3A pop af -x0B3B call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - jp x06A6 ;печать сообщения об ошибке и продолжение работы монитора - -;формирование следующего имени файла для zs-snap -x0B41 push de - push hl - ld hl,xE7A9 ;буфер fcb - ld b,#07 -x0B48 ld a,(hl) ;замена пробелов в имени файла подчерками - cp " " - jr nz,x0B4F - ld (hl),"_" -x0B4F inc hl - djnz x0B48 - inc (ix+#07) ;последний символ имени файла +1 - ld hl,#0000 - ld (xE7A9+#13),hl ;стартовый адрес - ld (xE7A9+#0C),hl ;адрес буфера dma - rst #18 - dw rom7_x11DF ;открыть файл для последующих операций с ним - ld hl,xE027 - set 3,(hl) - jr nc,x0B6E ;не было ошибок - bit 6,(hl) - jr nz,x0B2E ;ошибки при записи. восстановление RAM 2, печать сообщения и выход - res 3,(hl) -x0B6E pop hl - pop de - ret - -;АДРЕС: #0B71 расчет начала битовой карты параграфов заданной страницы -;вх: a - номер страницы -;вых: de - адрес начала битовой карты параграфов заданной страницы -x0B71 push hl - jr x0B9F - -;АДРЕС: #0B74 печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) -;вх: a - номер страницы -;вых: de - адрес начала битовой карты параграфов заданной страницы -x0B74 push hl - push ix - ld l,a - ld h,#00 - push af - rst #30 - dw rom2_x3732 ;установка страницы пользователя равной номеру страницы в L - db #02 - rst #30 - dw rom2_x3005 ;установка текущим окна: main menu - db #02 -x0B83 bit 6,(iy+#13) - ld hl,rom5_x1095 ;сообщение: Saved RAM bank_ - jr nz,x0B8F ;запись - ld hl,rom5_x10AB ;сообщение: Loaded RAM bank_ -x0B8F rst #30 - dw rom5_x1061 ;печать закодированного сообщения из hl - db #05 - pop af - push af - rst #30 - dw rom2_x16EC ;печать числа a=[#0..#F] - db #02 - rst #20 - db " " - db #82 ;восстановление атрибутов - pop af - pop ix -;a - номер страницы -x0B9F add a,a - add a,a - add a,a - ld hl,xE8A9+#40 ;xE8E9 - call x1103 ;сложение hl=hl+a - ex de,hl - pop hl - ret - -;ошибка: undefined file -x0BAB call x0AC8 ;загрузка RAM 2 из файла zs-snap - call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,#54 ;ошибка undefined file - jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора - -;загрузка страницы zs-snap с адреса #8000 -x0BB6 call x0D01 ;определение адреса загрузки страницы в память - bit 7,(iy+#13) - jr z,x0BF4 ;без компрессии -; с компрессией - ld a,(de) - ld (xE33B),a ;количество секторов для загрузки - ld a,h - sub #80 - jr nz,x0BD5 ;есть что загружать -;заполнение памяти [#8000..#BFFF] байтом в A -;вх: a - байт для заполнения -x0BC8 ld hl,#8000 - ld (hl),a - ld de,#8001 - ld bc,#3FFF - ldir - ret -;загрузка и распаковка страницы с компрессией -x0BD5 ld hl,x0C41 ;процедура загрузки секторов в буфер hl - call x0D60 ;установка п/п jp x0C41 по адресу xE338 - ld hl,xE5A9 - ld de,xE5A9+#200 - exx - ld hl,#8000 - call x1108 ;загрузка и распаковка блока длиной #100 - ld hl,#4000 - or a - sbc hl,bc - ret z ;загружена вся страница -;ошибка чтения/записи -x0BEF ld a,#55 - jp x06A9 ;печать сообщения об ошибке и продолжение работы монитора -;загрузка страницы без компрессии -x0BF4 push hl - ld a,h - sub #80 - jr z,x0C0B ;пустая страница -; загрузка страницы - push de - bit 3,(iy+#13) - jr z,x0BAB ;ошибка: undefined file - call x0CE3 ;установка размера буфера dma - rst #18 - dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов -x0C07 jp c,x0B2E ;ошибки чтения/записи. восстановление RAM 2, печать сообщения и выход - pop de -x0C0B pop hl - -;распределение загруженной страницы по памяти с учетом пустых параграфов -;вх: hl - адрес загрузки -; de - адрес битовой карты следующей страницы (для незапакованного файла) -x0C0C push hl - ex de,hl - ld c,#01 - exx - pop hl - dec hl - ld de,#BFFF -x0C16 exx - dec c - jr nz,x0C1E - ld c,#08 - dec hl - ld b,(hl) -x0C1E rlc b - exx - jr c,x0C35 ;копируем параграф на свое место -; параграф пустой. зануляем его - push hl - ld h,d - ld l,e - dec de - ld bc,#00FF - ld (hl),#00 - lddr - pop hl - ld a,d - cp #7F - ret z ;конец страницы - jr x0C16 ;следующий параграф -; копируем параграф на свое место -x0C35 xor a - sbc hl,de - add hl,de - ret z ;конец страницы - ld bc,#0100 - lddr - jr x0C16 ;следующий параграф - -;загрузка секторов в буфер hl -;вх: (xE7C5) - дорожка/сектор откуда грузить -; hl - адрес загрузки -; b - размер блока в секторах -;вых: (xE7C5) - следующие дорожка/сектор -x0C41 ld (ix+#15),l - ld (ix+#16),h - call x0C7D ;вычисление размера блока для загрузки - rst #18 - dw rom7_x1360 ;R8DOS #1E(30) последовательное считывание заданного количества секторов - jr c,x0C07 ;ошибка чтения - ret - -;загрузка секторов в буфер hl -;вх: (xE7C5) - дорожка/сектор откуда грузить -; hl - адрес загрузки -; b - размер блока в секторах -;вых: (xE7C5) - следующие дорожка/сектор -x0C50 push hl - call x0C7D ;вычисление размера блока для загрузки - ld de,(xE7C5) ;дорожка/сектор - push de - ld a,b - and #F0 - rrca - rrca - rrca - rrca - add a,d - ld d,a - ld a,b - and #0F - add a,e - bit 4,a - jr z,x0C6B - inc d -x0C6B and #0F - ld e,a - ld (xE7C5),de ;следующие дорожка/сектор - pop de - ld c,#05 - pop hl - rst #18 - dw rom7_x0229 ;вызов функции R8DOS. загрузка блока секторов - jp c,x0B3B ;ошибка загрузки - ret - -;вычисление размера блока для загрузки -;вх: (xE33B) размер блока в секторах -; b - размер блока в секторах -;вых: (xE33B) оставшийся размер блока в секторах -; b - размер блока в секторах для загрузки -x0C7D ld hl,xE33B - ld a,(hl) - or a - jp z,x0BEF ;ошибка. нечего загружать - sub b - jr nc,x0C8A - ld b,(hl) - xor a -x0C8A ld (hl),a - ret - -;запись страницы с адреса #8000 на диск, с компрессией/без -;вх: de - адрес начала битовой карты параграфов -x0C8C bit 5,(iy+#13) - jr z,x0CD5 ;компрессия отключена -;запись с компрессией - inc de - ex de,hl - ld (xE33B),hl - xor a - ld (hl),a - ld hl,#8000 - ld bc,#4000 -x0C9F cpi - jr nz,x0CA7 ;в странице есть ненулевые байты - jp pe,x0C9F ;еще не конец - ret -; в странице есть ненулевые байты -x0CA7 ld hl,x0CED ;адрес процедуры - call x0D60 ;установка п/п jp x0CED по адресу xE338 - ld hl,xE5A9 - ld de,xE5A9+#100 - exx - ld hl,#8000 - ld e,(iy+#26) ;размер окна сжатия для снапа - ld d,l - ld b,#03 -x0CBD sla e - rl d - djnz x0CBD - ld bc,#4000 - call x0F60 ;запаковка блока -;hl - адрес запакованного блока -;bc - размер запакованного блока - ret z ;пустая страница - ld a,c - or a - jr z,x0CCF - inc b -x0CCF call x0CED ;запись запакованой страницы - dec hl - ld (hl),c ;количество байт в последнем секторе =#00 - 256 байт - ret -;компрессия отключена -;вх: de - адрес начала битовой карты параграфов -x0CD5 call x0D20 ;уплотнение памяти, за счет пустых параграфов - ret z ;страница пустая - call x0CE3 - rst #18 - dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов -x0CDF jp c,x0B2E ;ошибка - ret -;установка размера области -;вх: a - кол-во параграфов с учетом уплотнения -x0CE3 ld b,a - ld (ix+#15),#00 - ld (ix+#16),#80 - ret -;запись запакованой страницы -;вх: ix - адрес буфера fcb -; b - число записываемых секторов -; hl - адрес запакованного блока -x0CED ld (ix+#15),l - ld (ix+#16),h - push bc - rst #18 - dw rom7_x1390 ;R8DOS #1F(31) последовательная запись заданного количества секторов - jr c,x0CDF ;ошибка записи - pop bc - ld hl,(xE33B) ;адрес начала битовой карты параграфов - ld a,b - add a,(hl) - ld (hl),a ;количество секторов в запакованной странице - ret - -;определение адреса загрузки страницы в памяти -;вх: de - адрес битовой карты параграфов для текущей страницы -;вых: h =#80+кол-во секторов страницы (для запакованного файла) -; hl - адрес начала загрузки (для незапакованного файла) -; de - адрес битовой карты следующей страницы (для незапакованного файла) -; de - адрес ячейки с размером страницы в секторах (для запакованного файла) -x0D01 ld bc,#4001 - ld hl,#8000 - bit 7,(iy+#13) - jr z,x0D12 ;без компрессии - inc de - ld a,(de) ;количество секторов - add a,h - ld h,a - ret -x0D12 dec c - jr nz,x0D19 - ld c,#08 - ld a,(de) - inc de -x0D19 rrca - jr nc,x0D1D - inc h -x0D1D djnz x0D12 - ret - -;уплотнение памяти [#8000..#BFFF], за счет пустых параграфов -;построение битовой карты параграфов в области [#8000..#BFFF] -;вх: de - адрес начала битовой карты параграфов -;вых: a - кол-во параграфов с учетом уплотнения -; z - вся область пустая -x0D20 ld c,#08 - ex de,hl - exx - ld hl,#8000 - ld d,h - ld e,l -x0D29 xor a ;проверка параграфа на ноль - ld b,a -x0D2B cp (hl) - jr nz,x0D46 ;не пустой - inc hl - djnz x0D2B -x0D31 exx ;все #100 байт =#00 - rra ;установка бита для карты параграфов - rr b - dec c - jr nz,x0D3C - ld c,#08 ;запись байта карты параграфов - ld (hl),b - inc hl -x0D3C exx - ld a,h - cp #C0 - jr nz,x0D29 - ld a,d - sub #80 - ret -x0D46 xor a ;уплотнение памяти, за счет пустых параграфов - ld l,a - ld c,a - ld b,a - sbc hl,de - add hl,de - jr z,x0D55 - inc b - ldir -x0D52 cpl - jr x0D31 -x0D55 inc h - inc d - jr x0D52 - -;АДРЕС: #0D59 включение режима 48k only -x0D59 push af - rst #30 - dw rom2_x0665 ;включение режима 48k only - db #02 - pop af - ret - -;АДРЕС: #0D60 установка п/п jp #addr по адресу xE338 -;вх: hl - адрес п/п -x0D60 push de - ex de,hl - ld hl,xE338 - ld (hl),#C3 - inc hl - ld (hl),e - inc hl - ld (hl),d - pop de - ret - -;АДРЕС: #0D6D установка/восстановление параметров заголовка zs-snap -;вх: z - чтение файла -; nz - запись файла -; hl,xE8A9 - буфер заголовка файла -x0D6D push af - jr nz,x0D93 ;запись файла -;чтение файла - ex de,hl - ld a,(de) - inc de - ld hl,xE027 - res 7,(hl) - cp #4D - jr z,x0D85 ;без компрессии - set 7,(hl) - cp #41 -x0D80 ld a,#55 - jp nz,x06A9 ;печать сообщения об ошибке и продолжение работы монитора -x0D85 ex de,hl - ld a,(hl) - and #FD - cp #31 - jr nz,x0D80 ;ошибка - ld a,(hl) - ld (iy-#12),a - jr x0DA8 -;запись файла -x0D93 ex de,hl - ld hl,xE027 - ld a,#4D ;=#4D - без компрессии - res 7,(hl) - bit 5,(hl) - jr z,x0DA3 ;compression off - ld a,#41 ;=#41 - с компрессией - set 7,(hl) -x0DA3 ex de,hl - ld (hl),a - inc hl - ld (hl),#33 -x0DA8 inc hl - pop af - ld de,xDD69 - ld bc,#001E - jr z,x0DB3 ;чтение файла - ex de,hl -x0DB3 ldir - jr nz,x0DB8 ;запись файла - ex de,hl -x0DB8 jr nz,x0DD9 ;запись файла - ld a,(de) - inc de - ld hl,xE02D - bit 7,(hl) - jr z,x0DCB ;турбо-режим не доступен - res 6,(hl) ;выключим турбо - bit 6,a - jr z,x0DCB ;в снапе турбо выключено - set 6,(hl) ;включим турбо -x0DCB ld a,(de) - im 1 ;установим режим прерываний - dec a - jr z,x0DD3 - im 2 -x0DD3 inc de - ld a,(de) - out (#FE),a ;установим бордюр - jr x0DF3 -;запись файла -x0DD9 ld a,(xE02D) - ld (de),a - inc de - push de - rst #30 - dw rom2_x3B75 ;определение типа прерываний im 1/2 - db #02 - pop de - ld (de),a - inc de - ld hl,#5800 - rst #30 - dw rom2_x0028 ;чтение байта из памяти пользователя - db #02 - rrca - rrca - rrca - and #07 - ld (de),a -x0DF3 inc de - bit 6,(iy+#13) - ld hl,x0E35 - ld b,#03 -x0DFD push bc - ld c,(hl) - inc hl - ld b,(hl) - inc hl - jr nz,x0E08 ;запись файла - ld a,(de) ;восстановление переменных - ld (bc),a - jr x0E0A -x0E08 ld a,(bc) ;сохранение переменных - ld (de),a -x0E0A inc de - pop bc - djnz x0DFD - bit 1,(iy-#12) - ret z -;чтение/сохранение регистров AY - ld b,#FF - dec de -x0E16 inc de - ld a,b -x0E18 inc a - cp #0E - ret nc - cp #07 - jr z,x0E18 - ld b,a - bit 6,(iy+#13) - jr nz,x0E2E ;запись файла - ld a,(de) - rst #30 - dw rom2_x03A7 ;Запись регистра AY - db #02 - jr x0E16 -x0E2E rst #30 - dw rom2_x03B6 ;чтение регистра AY - db #02 - ld (de),a - jr x0E16 -;адреса переменных -x0E35 dw xE004 ;адрес содержимого регистра 7 AY - dw xE012 ;адрес состояния порта #7FFD - dw xE013 ;адрес состояния порта #1FFD - -;АДРЕС: #0E3B загрузка из ROM-disk -;вх: h - номер страницы с файлом -; l - смещение в параграфах от начала ROM-disk в этой странице -x0E3B res 6,(iy+#13) - ld (xE000),hl ;сохраним координаты файла - ld hl,xE8A9 ;куда грузим (буфер dma в записи fcb) - ld (xE7BE),hl - ld b,#01 ;1 параграф. заголовок файла - push hl - call x0EE6 ;загрузка блока из ROM-disk - ld (xE7C5),hl ;hl - координаты следующего блока файла (RAM 2) - pop hl - bit 6,(iy+#13) - call x0D6D ;восстановление параметров из заголовка zs-snap - ld hl,xE012 - ld a,(hl) - ld (xE00C),a ;копия порта #7FFD - res 5,(hl) ;режим 128k - rst #30 - dw rom2_x35E0 ;сохранение переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld a,#02 ;номер страницы - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - ld a,#05 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - rst #30 - dw rom2_x36F9 ;получение номера логической страницы пользователя a=[#0..#F] - db #02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 - bit 5,(iy-#08) - jp nz,x0EC1 ;режим 48k. конец загрузки - xor a -x0E94 push af - cp #02 - jr z,x0EBB ;RAM 2 пропускаем - cp #05 - jr z,x0EBB ;RAM 5 пропускаем - cp #08 - jr z,x0EBB ;RAM 8 пропускаем - cp #09 - jr z,x0EBB ;RAM 9 пропускаем - rst #30 - dw rom2_x3A4E ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - db #02 - ld l,a - rst #30 - dw rom2_x3707 ;сравнение страницы пользователя с заданной - db #02 - jr z,x0EBB ;RAM пользователя пропускаем - ld a,l - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - rst #30 - dw rom2_x0603 ;копирование памяти с #8000 в страницу пользователя - db #02 -x0EBB pop af - inc a - cp #10 - jr c,x0E94 -;загрузка страниц законцена. грузим RAM 2 -x0EC1 ld hl,(xE7C5) ;координаты страницы RAM 2 - ld (xE000),hl - ld a,#02 - call x0B74 ;печать Saved/Loaded RAM bank n (de - адрес битовой карты параграфов) - call x0F08 ;загрузка страницы из ROM-disk в память #8000 - call x0AC3 ;восстановление переменной с состоянием портов #1FFD/#7FFD пользователя - ld a,(xE00C) - ld (xE012),a - bit 5,a - call nz,x0D59 ;включение режима 48k only - jp x0ABA ;выход из монитора - -;АДРЕС: #0EE0 загрузка блока из ROM-disk -;вх: hl - адрес загрузки -; b - размер блока в секторах -;вых: hl - координаты следующего блока файла -; b - осталось незагруженных параграфов -x0EE0 ld (xE7A9+#15),hl ;xE7BE куда грузим - call x0C7D ;коррекция размера блока для загрузки - -;АДРЕС: #0EE6 загрузка блока из ROM-disk -;вх: b - кол-во параграфов для загрузки -;вых: hl - координаты следующего блока файла -x0EE6 xor a - ld hl,xDD99 ;формируем процедуру вызова п/п из страницы с ROM-disk - ld (hl),#F7 ;rst #30 - inc hl - ld (hl),#73 ;dw #0073 = romROMx0073 - inc hl - ld (hl),a - inc hl - ld (hl),a ;db #00 - inc hl - ld (hl),#C9 ;ret - ld hl,(xE000) ;координаты файла -x0EF9 ld a,h - ld (xDD9B+#01),a ;xDD9C плоскость и страница в которой выбранная прогармма - call xDD99 ;загрузка блока из ROM-Disk - inc b - dec b - jr nz,x0EF9 ;загрузка из следующей страницы - ld (xE000),hl ;координаты следующего блока файла - ret - -;АДРЕС: #0F08 загрузка страницы из ROM-disk в память #8000 -;вх: de - адрес битовой карты параграфов -x0F08 call x0D01 ;определение адреса загрузки страницы в памяти - bit 7,(iy+#13) - jr z,x0F38 ;без компрессии -; загрузка снапа с компрессией - ld a,(de) - ld (xE33B),a ;размер страницы в секторах - ld a,h - sub #80 - jp z,x0BC8 ;страница пустая. заполнение памяти [#8000..#BFFF] байтом #00 - ld hl,x0EE0 ;процедура для загрузки блока из ROM-disk - call x0D60 ;установка п/п jp x0EE0 по адресу xE338 - ld hl,xE5A9 ;буфер для распаковки - ld de,xE5A9+#200 - exx - ld hl,#8000 - call x1108 ;распаковка блока - ld hl,#4000 - or a - sbc hl,bc - ret z - jp x0BEF ;ошибка чтения/записи -; загрузка снапа без компрессии -x0F38 push hl - ld a,h - sub #80 - jr z,x0F4A ;нечего грузить - push de - ld b,a ;кол-во параграфов для загрузки - ld hl,#8000 - ld (xE7A9+#15),hl ;адрес загрузки - call x0EE6 ;загрузка блока в память - pop de -x0F4A jp x0C0B ;распределение загруженной страницы по памяти с учетом пустых параграфов - -;АДРЕС: #0F4D заполнение области памяти [#4000..#7FFF] пользователя -x0F4D ld hl,#4000 - xor a -x0F51 ld b,#00 -x0F53 rst #30 - dw rom2_x0000 ;запись байта в память пользователя (rst #00) - db #02 - inc hl - djnz x0F53 - inc a - cp #40 - ret z - jr x0F51 - -;АДРЕС: #0F60 запаковка блока -;вх: hl - адрес окуда запаковывать -; de - размер окна сжатия *8 -; bc - размер области запакорвки -; hl',de' - адреса буферов -x0F60 ld (xDD89),hl - exx - ld (xE9DF),hl - ld (xE9E1),de - call x10D0 ;bc'=hl; hl'=hl+1; de'=#0000 - ld a,c - or b - jp z,x1083 ;конец области сохранения - ld a,#01 - call x10B9 - ld a,(hl) - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - ld (iy-#15),#FF - res 0,(iy+#0E) - jr x0F89 -x0F86 pop hl -x0F87 pop bc - pop de -x0F89 inc hl - dec bc - ld (iy-#16),#00 - ld a,b - or a - jr nz,x0F9B ;не последний параграф - ld (iy-#15),c - ld a,c - or a - jp z,x1083 ;данных больше нет -x0F9B push de - push bc - push hl - ld b,d - ld c,e - bit 0,(iy+#0E) - jr nz,x0FB9 - ld de,(xDD89) - sbc hl,de - ld d,h - ld e,l - or a - sbc hl,bc - jr c,x0FB7 - set 0,(iy+#0E) -x0FB7 ld b,d - ld c,e -x0FB9 ld a,b - or c - jr z,x0FF2 - pop hl - ld a,(hl) - push hl - sbc hl,bc - cpir - jr nz,x0FF2 - pop de - push de - inc de - push bc - ld b,(iy-#15) - ld c,b - dec b - jr z,x0FDC -x0FD1 ld a,(de) - cp (hl) - inc hl - inc de - jr nz,x0FDC - djnz x0FD1 - jr x0FDC -x0FDB dec b -x0FDC ld a,c - sub b - cp (iy-#16) - pop bc - jr z,x0FB9 - jr c,x0FB9 - ld (iy-#16),a - ld (xDDA7),bc - cp (iy-#15) - jr nz,x0FB9 -x0FF2 ld bc,(xDDA7) - inc bc - ld a,(iy-#16) - cp #02 - jr c,x1076 - jr z,x1002 - jr x1009 -x1002 ld hl,#00FF - sbc hl,bc - jr c,x1076 -x1009 dec a - ld e,a - pop hl - call x1103 ;сложение hl=hl+a - ex (sp),hl - xor a - ld d,a - sbc hl,de - ex (sp),hl - push hl - xor a - call x10B9 - or a - ld hl,#00FF - sbc hl,bc - ld a,(iy-#16) - ld e,a - jr c,x1042 - cp #06 - jr nc,x1042 - dec e - dec e - xor a - call x10B9 - ld a,e - rrca - call x10B9 - ld a,e - call x10B9 - ld a,c - neg - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x1042 push af - xor a - ld h,a - ld l,a - sbc hl,bc - inc a - call x10B9 - ld a,l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - ld b,#05 -x1052 sra h - rr l - djnz x1052 - ld a,l - and #F8 - ld l,a - pop af - cp #0A - jr nc,x106A - dec a - dec a - or l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x106A push af - ld a,l - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - pop af - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F86 -x1076 ld a,#01 - call x10B9 - pop hl - ld a,(hl) - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - jp x0F87 -;конец области сохранения -x1083 xor a - push af - call x10B9 - pop af - inc a - push af - call x10B9 - pop af - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - xor a - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - xor a - call x10B4 ;запись байта в буфер ld (hl'),a; inc hl' - exx - ld a,#08 - sub d - jr z,x10A7 - push bc - ld b,a -x10A2 srl e - djnz x10A2 - pop bc -x10A7 ld a,e - ld (bc),a - ld de,(xE9DF) - or a - sbc hl,de - ex de,hl - ld c,e - ld b,d - ret -;запись байта в буфер ld (hl'),a; inc hl' -x10B4 exx - ld (hl),a - inc hl - exx - ret -x10B9 exx - rra - rr e - inc d - bit 3,d - exx - ret z - exx - ld a,e - ld (bc),a - ld de,(xE9E1) - or a - push hl - sbc hl,de - pop hl - jr nc,x10D8 -;установка регистров -;вх: hl - адрес буфера -;вых: bc'=hl -; hl'=hl+1 -; de'=#0000 -x10D0 ld c,l - ld b,h - inc hl - ld de,#0000 - exx - ret -x10D8 exx - push hl - push de - push bc - exx - ld de,(xE9DF) - push de - push de - sbc hl,de - push hl - ld l,#00 - push hl - ex de,hl - ld c,e - ld b,d - call xE338 - pop de - pop bc - pop hl - add hl,de - pop de - xor a - ld b,a - or c - jr z,x10FB - ldir -x10FB ex de,hl - exx - pop bc - pop de - pop hl - exx - jr x10D0 - -;АДРЕС: #1103 сложение hl=hl+a -x1103 add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #1108 распаковка блока -;вх: hl - адрес куда распаковывать -; hl' - адрес буфера откуда распаковывать -; de' - первая свободная ячейка в буфере (de-hl длина запакованного блока) -;вых: bc - размер распакованного блока -x1108 ld (xDD89),hl ;куда распаковывать - exx - ld (xE9DF),hl ;откуда распаковывать - ex de,hl - or a - sbc hl,de - ld (xE9E1),hl ;размер запакованного блока - call x1194 - exx - call x117A - ex de,hl -x111E call x1174 - jr nc,x112A - call x1185 - ld (de),a - inc de - jr x111E -x112A call x1174 - jr c,x114A - ld c,#00 - call x1174 - rl c - call x1174 - rl c - inc c - inc c - call x1185 - ld l,a - ld h,#FF -x1143 ld b,#00 - add hl,de - ldir - jr x111E -x114A call x1185 - ld l,a - call x1185 - ld c,a - or #07 - rrca - rrca - rrca - ld h,a - ld a,#07 - and c - inc a - inc a - ld c,a - cp #02 - jr nz,x1143 - call x1185 - ld c,a - or a - jr nz,x1143 - - ld hl,(xDD89) - push de - ex de,hl - sbc hl,de - ld c,l - ld b,h - pop de - ret -x1174 exx - srl e - dec d - exx - ret nz -x117A push af - call x1185 - exx - ld e,a - pop af - ld d,#08 - exx - ret -x1185 exx - ld a,b - or c - jr z,x118F -x118A ld a,(hl) - inc hl - dec bc - exx - ret -x118F call x1194 - jr x118A -x1194 exx - push hl - push de - push bc - exx - push de - ld hl,(xE9DF) - push hl - ld bc,(xE9E1) - push bc - call xE338 - pop bc - pop hl - pop de - exx - pop bc - pop de - pop hl - exx - ret - -;неиспользуемая область -x11AF ds #51,0 - -;АДРЕС: #1200 ROM-disk -x1200 INCBIN "prof_roms/rom6_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM6.bin",#0000,#4000 diff --git a/ProfRom_Disasm/rom6.bat b/ProfRom_Disasm/rom6.bat deleted file mode 100755 index 3991554..0000000 --- a/ProfRom_Disasm/rom6.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom6.a80 >> !log\error.txt diff --git a/ProfRom_Disasm/rom7.a80 b/ProfRom_Disasm/rom7.a80 deleted file mode 100755 index 2f4fe78..0000000 --- a/ProfRom_Disasm/rom7.a80 +++ /dev/null @@ -1,5903 +0,0 @@ - DEVICE ZXSPECTRUM128 - INCLUDE "!AllConst.asm" - INCLUDE "!ram8.asm" - ORG #0000 -ROMdisk equ #2500 - -;#0000 *NOT USED* (#30 байт) -;#0030 rst #30 вызов процедуры из другого rom -;#0033 *NOT USED* (#05 байт) -;#0038 обработчик прерываний im 0/1 -;#0041 *NOT USED* (#25 байт) -;#0066 обработка NMI (зависание с желто-черным бордюром) -;#006F *NOT USED* (#01 байт) -;#0070 переменные ROM-disk -;#0073 загрузка блока из ROM-Disk -;не используется #00BF вероятно что-то для контроллера прерываний -;#00FF адрес п/п обработки прерываний im 2 -;#0101 номер текущего rom -;#0102 процедура обработки прерываний im 2 -;#010E вызов процедуры из другого rom -;не используется #0127 вызов процедуры из rom 2 call x0127: dw addr -;не используется #0146 работа с контроллером прерываний -;не используется #015F работа с контроллером прерываний -;не используется #0180 работа с контроллером прерываний -;не используется #018B работа с контроллером прерываний -;не используется #0193 работа с контроллером прерываний -;#01AF автостарт с дискеты -;#0229 вызов функции R8DOS -;#029C R8DOS #00(0) сброс контроллера -;#02BE код time-out -;без вызовов пока #02C8 уменьшение time-out на 1 для всех дисководов -;#02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода -;#02F6 проверка наличия диска в дисководе -;#0322 опрос Break и прерывание, если нажата -;#032B R8DOS #10(16) чтение/установка спецификации дискеты -;#0335 R8DOS #11(17) чтение кода спецификации дисковода -;#033A в hl адрес кода time-out для текущего дисковода -;#033F в hl адрес кода, определяющего номер дорожки в текущем дисководе -;#0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе -;#0349 в hl адрес кода, определяющего тип текущего дисковода -;#0356 подготовка байта для выбора заданного дисковода -;#0366 проверка наличия образа в текущем дисководе -;#0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -;#03A2 установка номера дорожки для позиционирования -;#03C5 R8DOS #01(1) выбор текущего дисковода -;#03E4 инициализация текущего дисковода при необходимости -;#042C позиционирование на заданную дорожку -;#0430 поиск дорожки -;#0434 поиск дорожки с проверкой -;#0438 выдача команды в порт #1F ВГ93 -;#0441 ожидание готовности ВГ93 -;#0457 R8DOS #02(2) позиционирование на заданный логический трек -;#04D1 ошибка. прерывание функции -;#0502 R8DOS #0E(14) физическое позиционирование на трек -;#0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке -;#054A ошибка. неверный номер сектора -;#054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) -;#0553 R8DOS #05(5) чтение группы секторов -;#0557 R8DOS #06(6) запись группы секторов -;#05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) -;#0610 чтение сектора -;#063B чтение данных с дискеты в память -;#066B чтение сектора образа HDD в память -;#0694 чтение сектора с винчестера в буфер xEFF5 -;#06B4 запись сектора -;#0708 запись сектора на образ HDD -;#074C расчет смещения от начала образа в секторах (512b) -;#0768 чтение заголовка сектора с позиционированием на заданную дорожку -;#076D чтение заголовка сектора -;#077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера -;#0824 позиционирование на заданную дорожку c тайим-аутом -;#084F R8DOS #07(7) идентификация диска -;#08D4 R8DOS #08(8) идентификация диска для tr-dos -;#0922 R8DOS #09(9) установка рабочего буфера для функции 8 -;#092F вычисление размера таблицы секторов -;#0948 R8DOS #0B(11) форматирование дорожки -;#0B52 преобразование кода размера сектора в байтах в число -;#0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов -;#0B94 R8DOS #0C(12) чтение дорожки -;#0B98 R8DOS #0D(13) запись дорожки -;#0C83 опрос Break. cy=1 не нажата -;#0C98 остановка контроллера ВГ93 -;#0CAD таблица адресоф функций R8DOS -;#0CFF установка переменных дисковой BIOS -;#0D51 определение наличия SMUC -;#0D62 определение наличия NVRAM -;#0DA5 cy=1, a=#01 !!!Not Used!!! -;#0DA9 cy=1, a=#02 !!!Not Used!!! -;#0DAD чтение всей памяти NVRAM в память #7530 -;#0DB6 чтение данных из NVRAM -;#0DC7 запись всей памяти NVRAM из памяти #7530 -;#0DD0 запись данных в NVRAM -;#0E72 что-то пишет в NVRAM -;#0F55 для сравнения чисел -;#0F59 для сравнения чисел -;#0F5D деление hl=dehl'/bc -;#0FB7 умножение dehl=de'hl' * bc -;#0FF3 инкремент dehl -;#1003 копирование из (hl) в (de) 4х байт -;#100F загрузка числа в регистры из памяти -;#101D сложение 4х байтного числа с двухбатным -;#1035 сравнение двух чисел в памяти по адресам в de и hl -;#1065 инициализация дисковода -;#107B инициализация дисковода и настройка на дискету -;#10A4 распознавание имени файла и занесение его в fcb -;#111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска -;#1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb. !!!ОШИБКА!!! маски, после первого поиска больше нету -;#114E загрузка дескриптора файла в буфер -;#1166 загрузка очередного дескриптора файла в буфер -;#11A7 получение адреса байта в буфере dma -;#11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -;#11D4 открыть файл(для нужд монитора) для последующих операций с ним -;#11DB R8DOS #14(20) открыть файл для последующих операций с ним -;#11DF открыть файл для последующих операций с ним -;#1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -;#128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -;#12FF установка в fcb указателя в файле из bc -;#1307 R8DOS #15(21) закрыть файл, открытый функцией 20 -;#1360 R8DOS #1E(30) последовательное считывание заданного количества секторов -;#1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла -;#1390 R8DOS #1F(31) последовательная запись заданного количества секторов -;#1395 R8DOS #1D(29) последовательная запись одного сектора из памяти -;#13D5 создание записи в каталоге диска (на основе fcb) -;#1405 установка нового значения указателя в файле -;#1407 R8DOS #20(32) установка нового значения указателя в файле -;#1472 чтение сектора в буфер dma -;#1484 сохранение буфера dma в файл -;#148D чтение секторов в буфер dma -;#1498 запись секторов из буфера dma -;#14A0 расчет адреса в файле на диске (дорожка и сектор) -;#14A6 расчет нового номера дорожки и сектора -;#14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -;#153D копирование дескриптора дисковода в буфер -;#1545 R8DOS #21(33) чтение из fcb в bc указателя файла -;#154C чтение из fcb в hl длины файла -;#1553 чтение из fcb в hl адреса буфера dma -;#155A чтение заголовка первого попавшегося сектора дисковода A -;#1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) -;#1572 определение наличия interrupt controller -;#15C7 определение наличия последовательного порта/модема -;#16B9 работа с контроллером прерываний -;не используется #1738 работа с контроллером прерываний -;#1768 поиск раздела MFS -;#17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -;#17EF запись 2х секторов из буфера xEBF5 -;#1813 чтение сектора с винчестера -;#1829 запись сектора на винчестер -;#1848 расчет номера сектора на винчестере -;#187F R8DOS #23(35) подключение раздела к драйверу HDD -;#188A установка кода, определяющий тип дисковода без образа по номеру в С -;#189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -;#18C0 R8DOS #28(40) подключение раздела к драйверу HDD -;#1A0E расчет адреса кода, определяющие тип дисковода по номеру в С -;#1A19 завершение процедуры x18C0 R8DOS #28(40) -;#1A6A проверка совпадения имени -;#1A82 выделение из строки имени подраздела/образа (6 символов имя) -;#1A9F копирование имени подраздела/образа по адресу в de -;#1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 -;#1ACC формирование текстовой строки - пути к примонтированному подразделу/образу -;#1B04 расчет адреса блока описателя заданного дисковода -;#1B18 установка признака подмонтированных дисков A/B в порту #7FBA -;#1B45 определение необходимости копирования памяти пользователя -;#1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) -;#1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска -;#1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска -;#1BFA ошибка #56. нет раздела MFS -;#1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела -;#1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) -;#1C70 бесконечное чтение порта bc -;#1C74 бесконечная запись в порт bc -;#1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства -;#1C86 чтение 512b данных в буфер адресуемый hl -;#1C98 запись 512b данных из буфер адресуемого hl -;#1CAC посылаем команду винчестеру -;#1CCA ожидание готовности HDD к передаче данных -;#1CE5 ожидание готовности HDD к принятию команды -;#1D04 ожидание готовности HDD -;#1D1B чтение сектора идентификации в буфер по адресу в ix -;#1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -;#1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;#1D4A запись сектора из буфера ix на винчестер -;#1D4F запись сектора из буфера xE5A9 на винчестер -;#1D73 чтение сектора с винчестера в буфер xE5A9 -;#1D78 чтение сектора с винчестера в буфер ix -;#1D7D чтение сектора с винчестера в буфер xE5A9 -;#1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -;#1E2A установка в переменных сектора номер 3 для винчестера -;#1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы -;#1E74 R8DOS #22(34) идентификация жесткого диска -;#1F08 проверка геометрии винчестера -;#1F2D расчет произведения головок и секторов -;#1F59 чтение ячейки CMOS -;#1F76 чтение из CMOS времени и даты, в случае готовности CMOS -;#1F8B проверка готовности CMOS -;#1F93 чтение из CMOS времени и даты -;#1FB2 запись в CMOS времени и даты -;#1FDD запись данных в ячейку CMOS -;#2010 запись в порт -;#2016 чтение порта -;#201C пауза 293t -;#2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -;#2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) -;#2047 определение наличия CMOS -;не используется #20EC работа с контроллером прерываний ??? -;#20F1 тестирование HDD (2. test) (тест на чтение/запись) -;#2105 тестирование HDD (1. test) (тест только на чтение) -;#21E5 подсчет контрольной суммы области памяти CRC16 -;#220F суммирование байта с контрольной суммой CMOS CRC8 -;#2222 данные для подсчета контрольной суммы -;#2223 данные для подсчета контрольной суммы -;#2422 определение наличия SMUC -;#2452 *** Not Used *** -;#2500 ROM-disk -;#3D00 -;#4000 - - -;АДРЕС: #0000 *NOT USED* (#30 байт) -x0000 ds #30 - -;АДРЕС: #0030 rst #30 вызов процедуры из другого rom -x0030 jp x010E - -;АДРЕС: #0033 *NOT USED* (#05 байт) -x0033 ds #05 - -;АДРЕС: #0038 обработчик прерываний im 0/1 -x0038 push af - ld a,#06 - ld (#7530),a - pop af - ei - ret - -;АДРЕС: #0041 *NOT USED* (#25 байт) -x0041 ds #25 - -;АДРЕС: #0066 обработка NMI (зависание с желто-черным бордюром) -x0066 ld a,#06 - out (#FE),a - xor a - out (#FE),a - jr x0066 - -;АДРЕС: #006F *NOT USED* (#01 байт) -x006F ds #01 - -;АДРЕС: #0070 переменные ROM-disk -x0070 db #25 ;смещение начала ром диска (в блоках по 256 байт) - db #18 ;количество свободных секторов в странице - db #00 ;=#00 каталог отсутсвует - -;АДРЕС: #0073 загрузка блока из ROM-Disk - INCLUDE "!RomDisk.asm" - -;АДРЕС: #00AA *NOT USED* (#15 байт) -x00AA ds #15 - -;АДРЕС: #00BF вероятно что-то для контроллера прерываний -x00BF db #93,#01 - ds #04 - db #8B,#01,#00,#CA,#00: jp x015F - db #80,#01,#00,#D2,#00: jp x015F - db #FB,#C9,#00,#DA,#00: jp x015F - db #00,#00,#00,#E2,#00: jp x015F - db #00,#00,#00,#EA,#00: jp x015F - db #00,#00,#00,#F2,#00: jp x015F - db #00,#00,#00,#FA,#00: jp x015F - db #00,#00 - -;АДРЕС: #00FF адрес п/п обработки прерываний im 2 -x00FF dw x0102 - -;АДРЕС: #0101 номер текущего rom -x0101 db #07 - -;АДРЕС: #0102 процедура обработки прерываний im 2 -x0102 push hl - ld a,#06 - ld hl,x9C40 - call x175D ;установка бордюра - pop hl - ei - ret - -;АДРЕС: #010E вызов процедуры из другого rom -x010E push hl - ld hl,(x0101) - ex (sp),hl - push hl - ld hl,#0006 - push af - add hl,sp - push de - push bc - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld a,(hl) - jp xE3E9 - -;АДРЕС: #0127 вызов процедуры из rom 2 call x0127: dw addr -x0127 ld (xDE10),hl - pop hl - push de - ld e,(hl) - inc hl - ld d,(hl) - inc hl - ex (sp),hl - push hl - ld hl,x0143 ;сюда вернемся - ex (sp),hl - push hl - ld hl,xE42C ;п/п включения страницы для возврата - ex (sp),hl - ex de,hl - push hl - ld hl,(xDE10) - jp xE478 ;включаем rom 2 -x0143 inc sp -x0144 inc sp - ret - -;АДРЕС: #0146 работа с контроллером прерываний -x0146 ei - nop - push af - push bc - ld b,#0C - call x1F59 ;чтение ячейки CMOS - ld a,#02 - ld (x7530),a - ld bc,#7EBE - ld a,#20 - out (c),a - pop bc - pop af - ei - ret - -;АДРЕС: #015F работа с контроллером прерываний -x015F push af - push bc - ld b,#0C - call x1F59 ;чтение ячейки CMOS - ld a,#02 - ld (#7530),a - push hl - ld a,#02 - ld hl,#9C40 - call x175D ;вызов процедуры из основной памяти - pop hl - ld bc,#7EBE - ld a,#20 - out (c),a - pop bc - pop af - ei - ret - -;АДРЕС: #0180 работа с контроллером прерываний -x0180 di - halt - push af - ld a,#04 - ld (#7530),a - pop af - ei - ret - -;АДРЕС: #018B работа с контроллером прерываний -x018B push af - ld a,#05 - ld (#7530),a - pop af - ret - -;АДРЕС: #0193 работа с контроллером прерываний -x0193 push af - push bc - ld bc,#7EBE - ld a,#0C - out (c),a - nop - nop - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - pop bc - pop af - ei - ret - -;АДРЕС: #01AF автостарт с дискеты -;вх: 2-3,a =#11 -> вых: нажатие Enter и переход на rom 0: #259F -; =#10 -> вых: bc - длина бейсик-строки для автостарта -; =#0? -> вых: копирование строки автостарта по адресу в de и переход на rom 0: #1B11 -x01AF ld a,(xDD7F+#01) ;регистр A пользователя - and #0C - cp #0C - jr z,x01EC - cp #08 - jr z,x01E4 ;длина бейсик строки для дисковода автостарта - ld hl,rom0_x1B11 ;п/п загрузки с диска - ld (xDD6B),hl ;новый pc программы пользователя - ld de,(xDD75) ;регистр de пользователя - call x0207 ;bc - длина бейсик строки для автостарта - ld hl,x0213 - ldir - ret z ;автостарт с дисковода A - push af - call x1B04 ;расчет адреса блока описателя заданного дисковода - pop bc ;b - номер дисковода - jr nz,x01D8 ;в дисководе образ диска - res 1,b ;реальные диски только в дисководах A/B -x01D8 ld a,"A" - add a,b - ld hl,(xDD75) ;регистр de пользователя - ld de,#000F - add hl,de - ld (hl),a ;установим букву дисковода - ret -;длина бейсик строки для дисковода автостарта -x01E4 call x0207 ;bc - длина бейсик строки для автостарта - ld (xDD77),bc ;регистр bc пользователя - ret -;запуск с винчестера -x01EC ld hl,rom0_x259F - ld (xDD6B),hl ;новый pc программы пользователя - bit 7,(iy+#1B) - ret z ;проверка геометрии винчестера не пройдена - bit 0,(iy+#1C) - ret z ;autostart off - ld a,#0D - ld (#5C08),a ;код последней нажатой клавиши: enter - ld hl,#5C3B - set 5,(hl) ;устанавливается при нажатии на любую символьную клавишу - ret -;вых: bc - длина бейсик строки для автостарта -; z - автостарт с дисковода A -x0207 ld a,(iy-#23) ;номер диска автостарта - or a - ld bc,#000E ;для дисковода A - ret z - ld bc,#0016 ;для дисководов B/C/D - ret -x0213 db #F9 ;randomize - db #C0 ;usr - db #B0 ;val - db '"15619"' ;"15619" - db ":",#EA,":",#F7 ;:rem:run - db '"A:boot"' - -;АДРЕС: #0229 вызов функции R8DOS -;вх: c - номер функции -x0229 push ix - ld (xFFEF),a - ld a,r - push af ;сохраним флаг прерываний - di - ld a,c - cp #14 - jr nc,x0293 - ld a,(xFFEF) ;для функций #00..#13 - ld (xFFDE),sp - push hl - ld hl,xFFDC - res 0,(hl) - res 4,(iy+#0B) - inc hl - ld (hl),#FF ;код ошибки #FF - ld hl,x0264 ;сюда вернемся -x024E ex (sp),hl - push hl - push de - ld l,c - ld h,#00 - add hl,hl - ld de,x0CAD ;функции R8DOS - add hl,de - ld e,(hl) - inc hl - ld d,(hl) - ex de,hl ;адрес п/п обработки заданной функции - pop de - ex (sp),hl - ld ix,(xFFF0) ;!!!ОШИБКА, должно быть ld ix,(xDD6F) - ret -;выход из функции по ошибке -;возврат из функций #00..#13 -x0264 ld sp,(xFFDE) ;восстановим стэк - ld (xFFEF),a ;временно сохраним регистр A - push hl - ld hl,xFFDC - res 4,(hl) - inc hl - ld a,(hl) ;код ошибки - cp #FF - pop hl - ex (sp),hl - res 0,l ;сбросим флаг CY - jr z,x027D ;нет ошибки -x027B set 0,l ;установим флаг CY -x027D ex (sp),hl - pop af - ld a,(xFFEF) ;восстановим A - jp po,x0286 ;восстановим режим прерываний ei/di - ei -x0286 pop ix - ret -;возврат из функций #14..#nn -x0289 ld (xFFEF),a - ex (sp),hl - res 0,l ;сбросим флаг CY - jr nc,x027D ;нет ошибки - jr x027B ;была ошибка -x0293 ld a,(xFFEF) ;для функций #14..#nn - push hl - ld hl,x0289 ;сюда вернемся - jr x024E - -;АДРЕС: #029C R8DOS #00(0) сброс контроллера -x029C xor a - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),a ;номер дорожки =#00 - call x0394 ;bit 7,(xFFDC) - ret nz ;к текущему дисководу подключен образ - call x0C98 ;остановка контроллера ВГ93 - out (#FF),a ;загрузка головки, сторона верхняя, метод записи - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - and #03 ;скорость перемещения головки - or #0C ;головку опустить, проверить номер дорожки - out (#1F),a ;команда восстановления - call x0441 ;ожидание готовности ВГ93 - call x02F6 ;проверка наличия диска в дисководе - in a,(#1F) ;читаем регистр состояния - set 4,(hl) ;hl=xFFDC - -;АДРЕС: #02BE код time-out -;вых: z код time-out текущего дисковода =#FF/#00 -x02BE call x033A ;hl адрес кода time-out для текущего дисковода - ld a,(hl) - inc a - ret z - dec a - ld (hl),#0A - ret - -;АДРЕС: #02C8 уменьшение time-out на 1 для всех дисководов -;вых: hl - адрес процедуры time-out -x02C8 ld b,#00 - -;АДРЕС: #02CA R8DOS #13(19) установка режима time-out для счетчика включения двигателя дисковода -;вх: b - байт установки time-out -; 3-0,b =0000 уменьшение time-out на 1 для всех дисководов -;вых: hl - адрес процедуры time-out -x02CA ld hl,xFFD8 ;коды time-out для дисководов - ld a,b - and #0F - jr nz,x02E3 - ld b,#04 ;для всех дисководов -x02D4 ld a,(hl) - inc a - jr z,x02DC ;(hl)=#FF - dec a - jr z,x02DC ;(hl)=#00 - dec (hl) ;(hl)=(hl)-1 -x02DC inc hl - djnz x02D4 -x02DF ld hl,x02C8 - ret -x02E3 ld a,b - ld b,#04 -x02E6 rra - jr nc,x02F1 ;следующий дисковод - ld c,#00 - bit 3,a - jr nz,x02F0 - dec c -x02F0 ld (hl),c ;#00/#FF -x02F1 inc hl - djnz x02E6 - jr x02DF - -;АДРЕС: #02F6 проверка наличия диска в дисководе -x02F6 call x0322 ;опрос Break и прерывание, если нажата - ld hl,xFFDC - ld de,#0000 - in a,(#1F) ;берем индексный сигнал для образца - and #02 - ld b,a - call x0316 ;ждем изменения индексного сигнала - ret nz ;индексный сигнал изменился - call x0316 ;повторим еще раз - ret nz ;индексный сигнал изменился -x030C bit 0,(hl) - ret nz - call x0C98 ;остановка контроллера ВГ93 - ld a,#01 - jr x0328 ;ошибка. прерывание функции -;ждем изменения индексного сигнала -x0316 in a,(#1F) - and #02 - cp b - ret nz - inc de - ld a,e - or d - jr nz,x0316 - ret - -;АДРЕС: #0322 опрос Break и прерывание, если нажата -x0322 call x0C83 ;опрос Break. cy=1 не нажата - ret c - ld a,#03 -x0328 jp x04D1 ;ошибка. прерывание функции - -;АДРЕС: #032B R8DOS #10(16) чтение/установка спецификации дискеты -;вх: a - спецификация диска -; b - режим: 0FFh - установка, другое - чтение. -; -x032B call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе - inc b - jr nz,x0333 ;чтение - ld (hl),a ;запись - ret -x0333 ld a,(hl) - ret - -;АДРЕС: #0335 R8DOS #11(17) чтение кода спецификации дисковода -;вых: a - код спецификации дисковода -x0335 call x0349 ;адрес кода, определяющего тип текущего дисковода - ld a,(hl) - ret - -;АДРЕС: #033A в hl адрес кода time-out для текущего дисковода -x033A ld hl,xFFD8 - jr x034C - -;АДРЕС: #033F в hl адрес кода, определяющего номер дорожки в текущем дисководе -x033F ld hl,xFFD4 - jr x034C - -;АДРЕС: #0344 в hl адрес кода, определяющего тип дискеты в текущем дисководе -x0344 ld hl,xFFD0 ;коды, определяющие тип дискеты в дисководах - jr x034C - -;АДРЕС: #0349 в hl адрес кода, определяющего тип текущего дисковода -x0349 ld hl,xFFCC ;коды, определяющие тип дисковода -;расчет адреса для текущего дисковода -x034C push de - ld de,(xFFCA) ;номер текущего дисковода - ld d,#00 - add hl,de - pop de - ret - -;АДРЕС: #0356 подготовка байта для выбора заданного дисковода -;вых: a - байт -x0356 ld a,(xFFCA) ;номер текущего дисковода - call x0344 ;адрес кода, определяющего тип дискеты в текущем дисководе - and #03 ;номер текущего дисковода - or %00011100 ;загрузка головки, сторона верхняя - ld c,a - ld a,(hl) ;метод записи 0/1=FM/MFM - and %01000000 - or c - ret - -;АДРЕС: #0366 проверка наличия образа в текущем дисководе -;вых: nz - к текущему дисководу образ подключен -; z - к текущему дисководу образ не подключен -x0366 call x0349 ;в hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - cp #FF - jr z,x038C ;еще не инициалищирован - bit 5,a - jr z,x038C ;образ не подключен -;проверка наличия образа TR-DOS в текущем дисководе -x0372 ld a,(xE590) - and %11011111 - cp #01 - jr nz,x03DF ;нет подключенного образа TR-DOS. ошибка: нет диска в дисководе - ld hl,xFFDC - set 7,(hl) ;признак подключенного образа TR-DOS - xor a ;cy=0 - inc a ;nz - ret -;установка дескриптора образа для текущего дисковода -x0383 ld a,(xFFCA) ;номер текущего дисковода - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, - db #02 ;если к нему примонтирован образ - jr x0372 ;проверка наличия образа TR-DOS в текущем дисководе -;для дисководов C/D возможна работа только с образами -x038C ld a,(xFFCA) ;номер текущего дисковода - bit 1,a - ret z ;дисковод A/B - jr x03DF ;ошибка: нет диска в дисководе - -;АДРЕС: #0394 проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу -x0394 push hl - ld hl,xFFDC - bit 7,(hl) - pop hl - ret - -;текущий дисковод инициализирован -x039C ld hl,xFFDC - set 6,(hl) - ret - -;АДРЕС: #03A2 установка номера дорожки для позиционирования -x03A2 ld a,(xFFDC) - bit 6,a - ret nz ;дисковод инициализирован - push hl - push de - push bc - call x0366 ;проверка наличия образа в текущем дисководе - jr nz,x03BE ;к текущему дисководу образ подключен - ld b,#10 - call x0356 ;подготовка байта для выбора заданного дисковода - xor b - out (#FF),a - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a ;установим номер дорожки -x03BE call x039C ;текущий дисковод инициализирован - pop bc - pop de - pop hl - ret - -;АДРЕС: #03C5 R8DOS #01(1) выбор текущего дисковода -;вх: a - номер дисковода [0..3] -x03C5 and #03 - ld (xFFCA),a ;номер текущего дисковода - ld hl,xFFDC - res 6,(hl) - res 7,(hl) - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 5,(hl) ;образ на текущем дисководе? - jr nz,x0383 ;к дисководу подключен образ. установка дескриптора образа для текущего дисковода - bit 1,a - ret z ;дисковод A/B - xor a - ld (xE590),a ;текущий дисковод без образа -x03DF ld a,#01 ;дисководы C/D только с образами могуть быть - jp x04D1 ;ошибка #01 нет диска в дисководе. прерывание функции - -;АДРЕС: #03E4 инициализация текущего дисковода при необходимости -x03E4 ld hl,xFFDC - bit 6,(hl) - ret nz ;дисковод уже инициализирован - ld hl,x039C ;адрес возврата - push hl - ld hl,xFFDC ;!!!ЛИШНЕЕ - call x0366 ;проверка наличия образа в текущем дисководе - ret nz ;к текущему дисководу подключен образ - call x0356 ;подготовка байта для выбора заданного дисковода - out (#FF),a ;выбор дисковода - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - inc a - ret nz ;уже инициализирован - push hl - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - ld ix,xFFDC - set 0,(ix+0) - xor a ;дорожка 0 - call x042C ;позиционирование на заданную дорожку - ld a,#32 ;дорожка #32(50) - call x042C ;позиционирование на заданную дорожку - ld a,#02 ;дорожка #02 - call x042C ;позиционирование на заданную дорожку - res 0,(ix+0) - pop hl - bit 2,a ;регистр состояния. потеря данных - res 6,(hl) - jr nz,x0427 ;потеря данных - set 6,(hl) ;80 дорожек на дисководе -x0427 ld a,(hl) - and %11000011 - ld (hl),a - xor a ;уходим на нулевую дорожку - -;АДРЕС: #042C позиционирование на заданную дорожку -;вх: a - номер дорожки -;вых: a - регистр состояния -x042C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),a ;номер дорожки - -;АДРЕС: #0430 поиск дорожки -;вх: a - номер дорожки -;вых: a - регистр состояния -x0430 ld b,#18 ;команда поиска - jr x0436 - -;АДРЕС: #0434 поиск дорожки с проверкой -;вх: a - номер дорожки -;вых: a - регистр состояния -x0434 ld b,#1C ;команда поиска -x0436 out (#7F),a ;запись в регистр данных - -;АДРЕС: #0438 выдача команды в порт #1F ВГ93 -;вх: b - команда для ВГ93 -;вых: a - регистр состояния -x0438 call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - and #03 ;время перемещения на шаг - or b - out (#1F),a ;выдаем команду в порт - -;АДРЕС: #0441 ожидание готовности ВГ93 -;вых: a - регистр состояния -x0441 ld de,26300 ;количество попыток -x0444 in a,(#FF) ;ожидание сигнала INTRQ - rlca - jr nc,x044C - in a,(#1F) ;чтение регистра состояния - ret -x044C call x0322 ;опрос Break и прерывание, если нажата - dec de - ld a,e - or d - jr nz,x0444 ;повторим - jp x030C ;превышено кол-во попыток - -;АДРЕС: #0457 R8DOS #02(2) позиционирование на заданный логический трек -;вх: d - номер дорожки -x0457 push de - call x03E4 ;инициализация текущего дисковода при необходимости - pop de - call x0394 ;проверка bit 7,(xFFDC) - jr z,x046D ;реальная дискета -;подключен образ диска -x0461 call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld (hl),d - ld a,d - cp #A0 ;не больше 160 - ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) - ret c - jr x04D1 ;ошибка. прерывание функции -;реальная дискета -x046D call x0356 ;подготовка байта для выбора заданного дисковода - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld e,(hl) - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 5,e - jr z,x0483 ;диск 40 дорожек - bit 6,(hl) - jr nz,x0492 ;дисковод на 80 дорожек -x047F ld a,#08 ;код ошибки: ошибка позицирования, не соответствие типов (попытка использовать 80 дорожечный диск на 40 дорожечном дисководе) - jr x04D1 -x0483 bit 6,(hl) - jr z,x0492 ;дисковод на 40 дорожек -;дисковод на 80 дорожек - sla d ;определение стороны диска и номера физической дорожки - bit 7,e - jr z,x0492 ;односторонняя дискета - bit 1,d - jr z,x0492 ;верхняя сторона - dec d -x0492 bit 7,e - jr z,x04A0 ;односторонняя дискета - bit 7,(hl) - jr z,x047F ;ошибка позицирования, не соответствие типов (попытка использовать двустронний диск на одностороннем дисководе) - srl d - jr nc,x04A0 - res 4,a ;нижняя головка -x04A0 out (#FF),a - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) - jp c,x04D1 - ld a,(ix+0) ;номер дорожки в заголовке - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - cp (hl) ;сравнение с заданным - push hl - push de - call nz,x029C ;R8DOS #00(0) сброс контроллера - pop de - pop hl - ld a,(hl) ;номер дорожки - bit 2,e - jr z,x04BF - sla a ;диск 40 работает на дисководе 80 -x04BF cp d - ret z - out (#3F),a ;установим номер дорожки - ld a,d - bit 2,e - jr nz,x04EC ;диск 40 работает на дисководе 80 - ld (hl),a - call x0434 ;поиск дорожки с проверкой - bit 4,a ;ошибка позиционирования? - ret z ;нет ошибки -x04CF ld a,#05 ;код ошибки: ошибка позицирования (не соответствует номер дорожки) - -;АДРЕС: #04D1 ошибка. прерывание функции -;вх: a - код ошибки -x04D1 ld (xFFDD),a ;код ошибки дискового интерпретатора - ld a,#D0 - out (#1F),a ;команда прерывания - call x04DE - jp x0264 -;проверка кода time-out для текущего дисковода -x04DE push hl - push af - call x033A ;в hl адрес кода time-out для текущего дисковода - ld a,(hl) - inc a - jr z,x04E9 - ld (hl),#00 -x04E9 pop af - pop hl - ret -;диск 40 работает на дисководе 80 -x04EC srl d - ld (hl),d - push de - call x0430 ;поиск дорожки - pop de - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ld a,#06 ;код ошибки: ошибка позицирования (не считался адресной маркер дорожки/сектора) - jr c,x04D1 - ld a,(ix+0) ;номер дорожки - cp d - ret z - jr x04CF ;ошибка позицирования (не соответствует номер дорожки) - -;АДРЕС: #0502 R8DOS #0E(14) физическое позиционирование на трек -;вх: d - номер физической дорожки [0...х] -; a - номер стороны: 0/1 - нижняя/верхняя -x0502 and #01 - ld e,a ;номер стороны - push de - call x03A2 ;установка номера дорожки для позиционирования - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x0517 ;образ не подключен - pop de - ld a,d - sla a - add a,e - ld d,a ;логический номер дорожки - jp x0461 ;проверка номера дорожки образа -x0517 call x0824 ;позиционирование на заданную дорожку c тайим-аутом - call x0356 ;подготовка байта для выбора заданного дисковода - pop de - rrc e - ld hl,xFFDC - set 4,(hl) - jr nc,x052B ;нижняя сторона - res 4,a - res 4,(hl) -x052B out (#FF),a - ld a,d - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - bit 2,(hl) - jp z,x042C ;позиционирование на заданную дорожку -;диск 40 работает на дисководе 80 - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - sla a - out (#3F),a - ld (hl),d - ld a,d - sla a - jp x0430 ;поиск дорожки - ret ;!!!ЛИШНЕЕ!!! - -;АДРЕС: #0546 R8DOS #12(18) в hl адрес таблицы с количеством секторов на дорожке -x0546 ld hl,(xFFC8) - ret - -;АДРЕС: #054A ошибка. неверный номер сектора -x054A ld a,#07 - jr x04D1 - -;АДРЕС: #054E R8DOS #04(4) повторить в случае ошибки функцию 5 (или 6) -x054E call x0824 ;позиционирование на заданную дорожку c тайим-аутом - jr x05A8 - -;АДРЕС: #0553 R8DOS #05(5) чтение группы секторов -;вх: hl - адрес буфера -; d[0...x] - номер логического трека (первого обрабатываемого сектора) -; e[0...х] - номер первого обрабатываемого сектора -; b - количество секторов в операции -; -x0553 ld a,#80 ;признак чтения - jr x0559 - -;АДРЕС: #0557 R8DOS #06(6) запись группы секторов -;вх: hl - адрес буфера -; d[0...x] - номер логического трека (первого обрабатываемого сектора) -; e[0...х] - номер первого обрабатываемого сектора -; b - количество секторов в операции -; -x0557 ld a,#A0 ;признак записи -x0559 ld (xFFE1),a - push bc - push de - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and #03 ;код размера сектора в байтах - push af - ld c,a - call x0B52 ;преобразование кода размера сектора в байтах в число - ld (xFFED),bc ;размер сектора в байтах - pop af - bit 6,(hl) - jr nz,x0575 ;метод записи MFM - add a,#04 -x0575 ld b,#00 - ld c,a - ld hl,(xFFC8) ;адрес таблицы количеством секторов на дорожке - add hl,bc - ld a,(hl) - ld (xFFE0),a ;количество секторов на дорожке - dec a - cp e - jr c,x054A ;ошибка. неверный номер сектора - call x03E4 ;инициализация текущего дисковода при необходимости - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - pop hl - pop de - pop bc -x058D ld (xFFE2),hl - ld (xFFE4),de - ld a,b - ld (xFFE6),a - call x0457 ;позиционирование на заданную дорожку - jr x05A8 -x059D ld a,b - ld (xFFE6),a - ld (xFFE2),hl - ld (xFFE4),de -;головка спозицонирована на заданную дорожку -x05A8 ld a,(xFFCB) - ld b,a ;число попыток считывания при ошибке -x05AC ld de,(xFFE4) ;дорожка и сектор - call x0322 ;опрос Break и прерывание, если нажата - ld hl,(xFFE2) ;адрес для чтения - push bc - ld bc,(xFFED) ;размер сектора в байтах - push de - ld a,(xFFE1) ;=#80/#A0 чтение/запись группы секторов - bit 5,a - push af - call nz,x06B4 ;запись сектора - pop af - call z,x0610 ;чтение сектора - pop de - ld c,a - and #1F - ld a,c - pop bc - jr z,x05EB ;прочиталось без ошибки - djnz x05AC ;ошибка. повторим чтение - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 -x05D5 jp x04D1 ;прервем функцию - -;АДРЕС: #05D8 R8DOS #03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) -x05D8 call x0824 ;позиционирование на заданную дорожку c тайим-аутом - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and #03 - ld c,a ;код размера сектора - call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) - add hl,bc ;пропускаем сектор - jr x05F1 -;проверка защиты от записи -x05EB bit 6,a ;защита записи? - ld a,#02 ;код ошибки: попытка записи на защищенную дискету - jr nz,x05D5 ;ошибка. если была запись. при чтении не устанавливается -;расчет номера следующего сектора -x05F1 ld de,(xFFE4) ;дорожка и сектор для чтения/записи - inc e - ld a,e - push hl ;следующий адрес в памяти - ld hl,(xFFE0) ;количество секторов на дорожке - cp l - pop hl - jr c,x0609 ;дорожка еще не кончилась - ld e,#00 ;нулевой сектор, следующая дорожка - inc d - ld a,(xFFE6) ;количество секторов для чтения/записи - ld b,a - djnz x058D ;следующий сектор - ret ;завершили чтение/запись -;дорожка еще не кончилась -x0609 ld a,(xFFE6) - ld b,a - djnz x059D - ret ;завершили чтение/запись - -;АДРЕС: #0610 чтение сектора -;вх: de - дорожка и сектор -; hl - адрес для чтения -; bc - размер сектора в байтах -; a - команда =#80/#A0 чтение/запись группы секторов -;вых: nz - ошибка чтения -; a - регистр состояния -; hl - следующий адрес в памяти -x0610 ld d,a - bit 5,(iy+#0B) - jr z,x0635 ;вызов функции из монитора - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0635 ;копировать не надо - push hl - ld hl,xEBF5 ;читаем в буфер в ram 8 - push bc - call x0635 ;читаем сектор - ld b,a ;регистр состояния - and #1F - ld a,b - pop bc - pop hl - ret nz ;была ошибка чтения - ld de,xEBF5 ;буфер в память пользователя - ex de,hl - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - xor a - ret -x0635 ld a,(xFFDC) - rlca - jr c,x066B ;это образ на HDD - -;АДРЕС: #063B чтение данных с дискеты в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: a - регистр состояния -; hl - следующий адрес в памяти -x063B call x0648 ;чтение данных в память - ld a,b - or a - ld a,#01 ;код ошибки: нет диска в дисководе - jp z,x04D1 ;нет готовности - in a,(#1F) - ret -;чтение данных в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: b=#00 нет готовности -; hl - следующий адрес в памяти -x0648 ld a,e - inc a - out (#5F),a ;регистр сектора - ld a,d - out (#1F),a ;регистр команд - ld bc,#047F -x0652 in a,(#FF) ;чтение системного регистра - and #C0 - jr nz,x0667 ;есть готовность - inc de - ld a,d - or e - jr nz,x0652 ;ожидаем готовность - djnz x0652 - ret -;чтение сектора -x0660 in a,(#FF) - and #C0 - jr z,x0660 ;ждем готовности - ret m ;сигнал окончания выполнения команды -x0667 ini ;читаем байт с дискеты - jr x0660 - -;АДРЕС: #066B чтение сектора образа HDD в память -;вх: hl - адрес в памяти -; d - команда -; e - номер сектора -;вых: hl - следующий адрес в памяти -; bc=#0100 -x066B push hl - call x074C ;расчет смещения от начала образа в секторах (512b) - push bc - inc hl ;+1 сервисный сектор - bit 4,(iy+#0B) - jr z,x0682 ;сектор с HDD еще не прочитан - push hl ;расчет смещения от начала образа в секторах (512b) - ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) - or a - sbc hl,bc - pop hl - jr z,x0685 ;сектор уже в памяти, не читаем -x0682 call x0694 ;чтение сектора с винчестера в буфер xEFF5 -x0685 pop bc ;#0000/#0100 смещение в секторе - pop de ;адрес в памяти куда читать - ld hl,xEFF5 - add hl,bc ;какую половину копировать - ld bc,#0100 - ldir ;копируем из буфера в память - ex de,hl - inc b - xor a - ret - -;АДРЕС: #0694 чтение сектора с винчестера в буфер xEFF5 -;вх: hl - смещение от начала образа в секторах (512b) -x0694 ld a,(xE590) - and #DF - cp #01 - ld a,#21 ;код ошибки: - jp nz,x04D1 - ld (xE5A7),hl ;смещение от начала образа в секторах (512b) - ld de,xEFF5 ;адрес буфера для чтения - ex de,hl - call x1813 ;чтение сектора с винчестера - ld a,#04 - jp c,x04D1 ;ошибка. прерываем функцию - set 4,(iy+#0B) ;сектор прочитан - ret - -;АДРЕС: #06B4 запись сектора -;вх: de - дорожка и сектор -; hl - адрес для чтения -; bc - размер сектора в байтах -; a - команда =#80/#A0 чтение/запись группы секторов -;вых: nz - ошибка записи -; a - регистр состояния -; hl - следующий адрес в памяти -x06B4 ld d,a - bit 5,(iy+#0B) - jr z,x06D2 ;вызов функции из монитора - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x06D2 ;копировать не надо - push de - ld de,xEBF5 ;буфер в ram 8 - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop de - push hl - ld hl,xEBF5 ;буфер с данными пользователя - call x06D2 - pop hl - ret -x06D2 ld a,(xFFDC) - rlca - jr c,x0708 ;это образ на HDD. запись сектора на образ HDD - call x06E5 ;запись сектора - ld a,b - or a - ld a,#01 ;код ошибки: нет диска в дисководе - jp z,x04D1 ;прерывание функции - in a,(#1F) ;регистр состояния - ret -;запись сектора -;вх: hl - адрес для чтения -; e - номер сектора -; d - команда =#80/#A0 чтение/запись группы секторов -;вых: b=#00 нет готовности -x06E5 ld a,e - inc a - out (#5F),a ;регистр сектора - ld a,d - out (#1F),a ;регистр команд (команда запись сектора) - ld bc,#047F -x06EF in a,(#FF) ;чтение системного регистра - and #C0 - jr nz,x0704 ;есть готовность к приему данных - inc de - ld a,d - or e - jr nz,x06EF ;ожидаем готовность - djnz x06EF - ret -;передача данных сектора -x06FD in a,(#FF) - and #C0 - jr z,x06FD ;ждем готовности - ret m ;сигнал окончания выполнения команды -x0704 outi ;запись байта на дискету - jr x06FD - -;АДРЕС: #0708 запись сектора на образ HDD -;вх: hl - адрес в памяти -; e - номер сектора -;вых: hl - следующий адрес в памяти -; bc=#0100 -x0708 ld a,(xE590) - cp #01 - ld a,#21 - jp nz,x04D1 ;образ не подключен/защита от записи - push hl - call x074C ;расчет смещения от начала образа в секторах (512b) - push bc - inc hl ;+1 сервисный сектор - bit 4,(iy+#0B) ;сектор еще не записан - jr z,x0729 ;читаем сектор с HDD. нужно чтобы записать сектор 256b - push hl ;расчет смещения от начала образа в секторах (512b) - ld bc,(xE5A7) ;смещение предыдущего сектора от начала образа в секторах (512b) - or a - sbc hl,bc - pop hl - jr z,x072E ;этот сектор уже прочитан -x0729 push hl ;смещение от начала образа в секторах (512b) - call x0694 ;чтение сектора с винчестера в буфер xEFF5 - pop hl -x072E pop bc ;#0000/#0100 смещение в секторе - ex (sp),hl ;адрес в памяти - ld de,xEFF5 ;буфер куда прочитали сектор - ex de,hl - add hl,bc ;смещение в секторе - ex de,hl - ld bc,#0100 - ldir ;коприруем данные в буфер - pop de ;смещение от начала образа в секторах (512b) - push hl ;следующий адрес в памяти - ld hl,xEFF5 - call x1829 ;запись сектора на винчестер - pop hl - ld a,#00 - ret nc ;нет ошибок - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 - jp x04D1 - -;АДРЕС: #074C расчет смещения от начала образа в секторах (512b) -;вх: e - номер сектора -;вых: hl - смещение от начала образа в секторах (512b) -; bc - #0000/#0100 смещение в секторе -x074C call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld l,(hl) ;номер дорожки - ld h,#00 - add hl,hl - add hl,hl - add hl,hl - add hl,hl ;номер дорожки *16 - ld a,l - add a,e - ld l,a - jr nc,x075C - inc h -x075C srl h - rr l ;(trk * 16 + sec)/2 - ld bc,#0000 ;первая половина сектора HDD - ret nc - ld bc,#0100 ;вторая половина сектора HDD - ret - -;АДРЕС: #0768 чтение заголовка сектора с позиционированием на заданную дорожку -;вх: e - номер сектора -;вых: cy=1 была ошибка при чтении -; ix - адрес буфера с прочитанныи загловком -x0768 push de - call x0824 ;позиционирование на заданную дорожку c тайим-аутом - pop de - -;АДРЕС: #076D чтение заголовка сектора -;вых: cy=1 была ошибка при чтении -; ix - адрес буфера с прочитанныи загловком -x076D push de - ld hl,xFFE9 ;куда читаем - ld d,#C0 ;чтение адреса - push hl - call x063B ;чтение данных в память - pop ix - pop de - and #1F - ret z ;ошибок нет - scf - ret - -;АДРЕС: #077F R8DOS #0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера -;вх: hl - адрес таблицы -;вых: таблица заголовков секторов, находящихся на дорожке -x077F call x03A2 ;установка номера дорожки для позиционирования - bit 5,(iy+#0B) - jr z,x07AB ;функция вызвана из монитора - ld bc,#012C - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x07AB ;копировать не надо - push hl - ld hl,xEBF5 - push hl - call x07AB - inc hl - pop bc - or a - sbc hl,bc - ld a,h - or l - ld c,l - ld b,h ;длина таблицы - pop de - ret z ;таблица пустая - ld hl,xEBF5 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret -;формирование таблицы секторов -x07AB call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x07CF ;реальная дискета -; для образа диска - push hl - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld e,(hl) - srl e - pop hl - ld a,#01 -x07BA ld (hl),#00 ;информация о секторе достоверна - inc hl - ld (hl),e ;Физический номер дорожки (0..х) - inc hl - ld (hl),#00 ;сторона 0 - inc hl - ld (hl),a ;Номер сектора (1..х) - inc hl - ld (hl),#01 ;Код длины сектора =#01 - 256b - inc hl - inc a - cp #11 - jr c,x07BA - ld (hl),#FE - ret -; для реальной дискеты -x07CF ld (xFFE2),hl - ld (hl),#FE - inc hl - inc hl - inc hl - ld (xFFE4),hl - ld (hl),#00 ;номер сектора 0 - ld a,#3C ;максимальное количество секторов - ld (xFFE6),a - call x0824 ;позиционирование на заданную дорожку c тайм-аутом -x07E4 call x0322 ;опрос Break и прерывание, если нажата - in a,(#1F) - bit 1,a - jr z,x07E4 ;ожидание индексного импульса -x07ED call x076D ;чтение заголовка сектора - ;ix - адрес буфера с прочитанныи загловком - ld hl,(xFFE2) - ld (hl),#00 - jr nc,x07F9 ;ошибок не было - ld (hl),#FF ;сбой чтения -x07F9 inc hl - ld de,(xFFE4) - ld a,(de) - cp (ix+#02) ;номер сектора - jr z,x0820 ;конец дорожки - push ix ;копируем в таблицу - pop de - ex de,hl - ld bc,#0004 - ldir - ex de,hl - ld (hl),#FE - ld (xFFE2),hl - ld a,(xFFE6) - dec a - ret z - ld (xFFE6),a - call x0322 ;опрос Break и прерывание, если нажата - jr x07ED -x0820 dec hl - ld (hl),#FE - ret - -;АДРЕС: #0824 позиционирование на заданную дорожку c тайим-аутом -x0824 push hl - ld hl,xFFDC - bit 4,(hl) - jr nz,x084D ;выход - bit 7,(hl) - jr nz,x084D ;выход - set 4,(hl) - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a ;номер дорожки - nop - out (#7F),a ;номер дорожки - ld b,#18 ;позиционирование на заданную дорожку - call x0438 ;выдача команды в порт #1F ВГ93 - call x02BE ;проверка байта time-out - jr nz,x084D ;задержка не нужна - ld hl,15010 ;задержка 390277t -x0848 dec hl - ld a,h - or l - jr nz,x0848 -x084D pop hl - ret - -;АДРЕС: #084F R8DOS #07(7) идентификация диска -x084F call x03E4 ;инициализация текущего дисковода при необходимости - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld a,(hl) - or #C0 - ld (hl),a - call x0394 ;bit 7,(xFFDC) - jr z,x0868 ;образ не подключен - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),#A1 ;%10100001 - ld d,#02 - jp x0457 ;R8DOS #02(2) позиционирование на заданный логический трек -;реальный дисковод -x0868 call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),#A0 - push hl - call x029C ;R8DOS #00(0) сброс контроллера - ld a,#02 - call x042C ;позиционирование на заданную дорожку - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - ;ix - адрес буфера с прочитанныи загловком - pop hl - jr nc,x088D ;ошибки не было - set 6,(hl) ;метод записи MFM - push hl - call x0356 ;подготовка байта для выбора заданного дисковода - out (#FF),a ;выбор дисковода - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - pop hl - ld a,#09 ;код ошибки: неформатированная дискета - jp c,x04D1 ;ошибка. прерывание функции -; установка длины сектора в переменной -x088D ld a,(ix+3) ;код длины сектора - and #03 - ld c,a ;код длины сектора - ld a,(hl) - and #FC - or c - ld (hl),a ;установим код длины сектора в переменной -; коррекция номера дорожки для 40 дорожечного дисковода - ld d,(ix+#00) ;номер дорожки - push hl - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - bit 6,(hl) - ld e,(hl) - jr nz,x08A6 ;80 дорожек в дисководе - srl d -x08A6 pop hl - res 2,(hl) ;hl адрес кода, определяющего тип дискеты в текущем дисководе - srl d - jr nc,x08BB - res 5,(hl) ;40 дорожек на дискете - bit 6,e ;код, определяющий тип текущего дисковода - jr z,x08BB ;дисковод на 40 дорожек - set 2,(hl) ;диск 40 работает на дисководе 80 - push hl - call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - dec (hl) - pop hl - -x08BB call x0356 ;подготовка байта для выбора заданного дисковода - res 4,a ;сторона 0 - out (#FF),a - push hl - call x0768 ;чтение заголовка сектора с позиционированием на заданную дорожку - pop hl - jr nc,x08CC ;ошибок не было - res 7,(hl) ;односторонняя дискета - ret -x08CC ld a,(ix+#01) ;номер стороны - or a - ret nz - res 7,(hl) ;односторонняя дискета - ret - -;АДРЕС: #08D4 R8DOS #08(8) идентификация диска для tr-dos, аналогична функции #18 -; интерпретатора системных функций. Перед вызовом необходимо -; установить рабочий буфер, размером не менее 256 байт, используя функцию 9 -x08D4 call x084F ;R8DOS #07(7) идентификация диска - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld a,(hl) - and %01000011 - dec a - ld a,#10 - jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos - ld de,#0008 - ld b,#01 - ld hl,(xFFE7) ;адрес рабочего буфера для функции - ld a,h - or l - ld a,#12 - jp z,x04D1 ;ошибка #12. не открыт рабочий буфер - call x0553 ;R8DOS #05(5) чтение служебного сектора - ld ix,(xFFE7) ;адрес рабочего буфера для функции - ld de,#00E1 - add ix,de ;начало служебной информации - ld a,#10 - cp (ix+#06) ;идентификационный код TR-DOS (#10) - jp nz,x04D1 ;ошибка #10. дискета не соответствует формату tr-dos - call x0349 ;hl адрес кода, определяющего тип текущего дисковода - ld e,(hl) - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - inc a - res 7,(hl) ;односторонняя дискета - bit 2,(ix+#02) ;тип дискеты - jr z,x0918 ;односторонняя - set 7,(hl) ;двухсторонняя -x0918 res 5,(hl) ;40 дорожек на диске - bit 0,(ix+#02) ;кол-во дорожек - ret nz ;40 дорожек - set 5,(hl) ;80 дорожек - ret - -;АДРЕС: #0922 R8DOS #09(9) установка рабочего буфера для функции 8 -;вх: hl - адрес рабочего буфера -;вых: d - версия компиляции монитора -; c - число компиляций монитора -; b - месяц компиляции монитора -; e - год компиляции монитора -x0922 ld (xFFE7),hl - ld (xFFF0),hl - ld de,#6161 - ld bc,#0705 - ret - -;АДРЕС: #092F вычисление размера таблицы секторов -;вх: hl - адрес таблицы секторов -;вых: bc - размер таблицы сеторов -x092F push hl - push hl -x0931 ld a,(hl) - cp #FE - jr z,x093F ;конец таблицы секторов - ld a,#05 ;следующий сектор - add a,l - ld l,a - jr nc,x0931 - inc hl ;!!!ОШИБКА??? должно быть inc h - jr x0931 -x093F inc hl - pop bc - or a - sbc hl,bc - ld c,l - ld b,h ;размер таблицы секторов - pop hl - ret - -;АДРЕС: #0948 R8DOS #0B(11) форматирование дорожки, на которой находится -; магнитная головка дисковода. Форматирование производится согласно -; таблице секторов. Данные из таблицы напрямую переносятся на -; дискету, никаких проверок на их корректность не производится, -; заканчивает таблицу идентификационный байт, больший 128. Размер -; сектора выбирается согласно байту +4, заполняется сектор -; константой #00/#FF. После записи очередного сектора в байт по -; адресу, содержащемуся в регистре DE, записывается число 2Ch, а -; значение DE увеличивается на единицу. -;вх: b =#00/#40 - режим FM/MFM -; hl - таблица расположения секторов -; de - адрес рабочего буфера (6 - 7 килобайт) -x0948 call x03A2 ;установка номера дорожки для позиционирования - ld (xDDA7),de ;сохраним de - ld e,b - bit 5,(iy+#0B) - jr z,x0969 ;функции вызываются из монитора - call x092F ;вычисление размера таблицы секторов - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0969 ;память копировать не надо - push de - ld de,xEBF5 - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - pop de -;форматирование дорожки -x0969 ld b,e - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - jr z,x09B2 ;реальная дискета -; образ диска tr-dos - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),b - ld hl,xE6A9 ;очистка буфера - ld (hl),#00 - ld de,xE6A9+1 - ld bc,#00FF - ldir - pop hl - ld de,(xDDA7) -x0986 ld a,(hl) - cp #FE - ret z ;конец таблицы секторов - or a - jr nz,x09A1 ;сектор не прочитан - inc hl - inc hl - inc hl - push de - ld e,(hl) - dec e ;логический номер сектора - push hl - ld hl,xE6A9 - call x0708 ;запись сектора на образ HDD - pop hl - pop de - dec hl - dec hl - dec hl - jr nc,x09A5 ;ошибок не было -x09A1 ld a,#2B ;ошибка - jr x09A7 -x09A5 ld a,#2C ;ошибок не было -x09A7 ld (de),a - inc de - ld a,#05 - add a,l - ld l,a - jr nc,x0986 - inc h - jr x0986 -; реальная дискета -x09B2 ld de,(xDDA7) - push de - push hl - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld (hl),b - push bc - call x0824 ;позиционирование на заданную дорожку - call x0322 ;опрос Break и прерывание, если нажата - pop bc - pop hl - exx - ex (sp),hl ;hl' - адрес рабочего буфера - exx - ld c,#7F - ld e,#C0 - ld a,#F0 ;команда: запись дорожки - bit 6,b - jp nz,x0AAC ;режим MFM - -;запись дорожки в режиме FM -;вх: c=#7F -; e=#C0 -; a=#F0 - out (#1F),a ;команда запись дорожки -; индексное поле - ld d,#4E - ld b,#50 - call x0A98 ;запись #50 байт #4E (послеиндексный промежуток) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F6 - ld b,#03 - call x0A98 ;запись #03 байт #F6 (запись C2 - синхронизирующий AM) - ld d,#FC - call x0AA3 ;запись байта #FC (индексная метка) -; секторы -x09EF ld d,#4E - ld b,#32 - call x0A98 ;запись #32 байт #4E (первый пробел) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F5 - ld b,#03 - call x0A98 ;запись A1 - синхроимпульс - ld d,#FE - call x0AA3 ;запись байта #FE (адресная метка идентификатора) - inc hl - ld d,(hl) - call x0AA3 ;запись номера дорожки - inc hl - ld d,(hl) - call x0AA3 ;запись номера головки (сторона) - inc hl - ld d,(hl) - call x0AA3 ;запись номера сектора - inc hl - ld d,(hl) - call x0AA3 ;запись кода длины сектора - ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#4E - ld b,#16 - call x0A98 ;запись #16 байт #4E (второй пробел) - ld d,#00 - ld b,#0C - call x0A98 ;запись #0C байт #00 (синхропромежуток) - ld d,#F5 - ld b,#03 - call x0A98 ;запись A1 - синхроимпульс - ld d,#FB - call x0AA3 ;запись байта #FB (адресная метка данных) - ld d,#00 - ld b,c - call x0A98 ;запись #7F байт #00 (данные сектора) - call x0AA3 ;запись байта #00 (данные сектора) - ld a,(hl) - or a - jr z,x0A61 ;длина сектора 128 байт - ld b,c - call x0A98 ;запись #7F байт #00 (данные сектора) - call x0AA3 ;запись байта #00 (данные сектора) - ld a,(hl) - dec a - jr z,x0A61 ;длина сектора 256 байт - call x0A98 ;запись #100 байт #00 (данные сектора) - ld a,(hl) - rrca - jr nc,x0A61 ;длина сектора 512 байт - call x0A98 ;запись #100 байт #00 (данные сектора) - call x0A98 ;запись #100 байт #00 (данные сектора) -x0A61 ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#4E - ld b,#09 - call x0A98 ;запись #09 байт #4E (третий пробел) - inc hl - call x0AA3 ;запись байта #4E - exx - ld (hl),#2C ;признак записи сектора - inc hl - exx - call x0AA3 ;запись байта #4E - ld a,(hl) - rlca - jp nc,x09EF ;повторим, если не конец - call x0A8E ;запись байта #4E до конца дорожки - in a,(#1F) - exx - pop hl - exx - bit 6,a - ret z ;выход без ошибок - ld a,#02 - jp x04D1 ;ошибка: защита от записи - -;запись чисел D в порт C до конца дорожки -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -x0A8E in a,(#FF) - and e - jr z,x0A8E - ret m - out (c),d - jr x0A8E - -;запись B чисел D в порт C -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -; b - количество байт для записи -x0A98 in a,(#FF) - and e - jr z,x0A98 - ret m - out (c),d - djnz x0A98 - ret - -;запись числа D в порт C -;вх: e - маска для регистра состояния -; d - байт для записи -; c - порт -x0AA3 in a,(#FF) - and e - jr z,x0AA3 - ret m - out (c),d - ret - -;запись дорожки в режиме MFM -;вх: c=#7F -; e=#C0 -; a=#F0 -x0AAC out (#1F),a ;команда запись дорожки -; индексное поле - ld d,#FF - ld b,#28 - call x0A98 ;запись #28 байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 - ld d,#FC - call x0AA3 ;запись байта #FC -; секторы -x0AC1 ld d,#FF - ld b,#0C - call x0A98 ;запись #0C байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 (пробел) - ld d,#FE - call x0AA3 ;запись байта #FE (адресная метка индексных данных) - inc hl - ld d,(hl) - call x0AA3 ;запись номера дорожки - inc hl - ld d,(hl) - call x0AA3 ;запись номера головки (сторона) - inc hl - ld d,(hl) - call x0AA3 ;запись номера сектора - inc hl - ld d,(hl) - call x0AA3 ;запись кода длины сектора - ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#FF - ld b,#0B - call x0A98 ;запись #0B байт #FF - ld d,#00 - ld b,#06 - call x0A98 ;запись #06 байт #00 (второй пробел) - ld d,#FB - call x0AA3 ;запись байта #FB (адресная метка данных) - ld d,#FF - ld b,c - call x0A98 ;запись #7F байт #FF (данные сектора) - call x0AA3 ;запись байта #FF (данные сектора) - ld a,(hl) - or a - jr z,x0B25 ;длина сектора 128 байт - ld b,c - call x0A98 ;запись #7F байт #FF (данные сектора) - call x0AA3 ;запись байта #FF (данные сектора) - ld a,(hl) - dec a - jr z,x0B25 ;длина сектора 256 байт - call x0A98 ;запись #100 байт #FF (данные сектора) - ld a,(hl) - rrca - jr nc,x0B25 ;длина сектора 512 байт - call x0A98 ;запись #100 байт #FF (данные сектора) - call x0A98 ;запись #100 байт #FF (данные сектора) -x0B25 ld d,#F7 - call x0AA3 ;запись байта #F7 (2 байта контрольной суммы) - ld d,#FF - ld b,#05 - call x0A98 ;запись #05 байт #FF (третий пробел) - inc hl - call x0AA3 ;запись байта #FF - exx - ld (hl),#2C ;признак записи сектора - inc hl - exx - call x0AA3 ;запись байта #FF - ld a,(hl) - rlca - jp nc,x0AC1 ;повторим, если не конец - call x0A8E ;запись байта #FF до конца дорожки - in a,(#1F) - exx - pop hl - exx - bit 6,a - ret z ;выход без ошибок - ld a,#02 - jp x04D1 ;ошибка: защита от записи - -;АДРЕС: #0B52 преобразование кода размера сектора в байтах в число -;вх: c[0..3] - код размера сектора в байтах -;вых: bc - размер сектора в байтах -x0B52 ld a,c - and #03 - ld b,a - inc b - ld c,#01 -x0B59 sla c - djnz x0B59 - ld b,c - srl b - ld c,#00 - srl b - rr c - ret - -;АДРЕС: #0B67 R8DOS #0F(15) замена идентификатора в таблице расположения секторов -;вх: hl - адрес таблицы секторов -; e - заменяемый идентификатор -; d - устанавливаемый идентификатор -; -x0B67 bit 5,(iy+#0B) - jr z,x0B8F ;замена идентификаторов в таблице секторов - call x092F ;bc - размер таблицы секторов - call x1B45 - jr nc,x0B8F ;вся таблица в пределах [#4000..#BFFF] - push hl ;замена с переносом в буфер - push bc - push de - ld de,xE5A9 ;буфер - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - pop de - call x0B8F ;замена идентификаторов в таблице секторов - pop bc - pop de - ld hl,xE5A9 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret -x0B8F push hl - pop ix - jr x0BF5 ;замена идентификаторов в таблице секторов - -;АДРЕС: #0B94 R8DOS #0C(12) чтение дорожки. Порядок считывания определяется -; содержимым таблицы расположения секторов. Считанные сектора -; помещаются в буфер дорожки, никаких разделителей между ними не -; ставится. Сектора со значением идентификационного байта #FF или -; #FC не считываются, но в буфере для них пропускается -; соответствующее длине (байт +4) место. Если сектор не может быть -; считан, то соответствующий идентификатор в таблице заменяется на -; #FD. Идентификатор успешно считанного сектора заменяется на #FC, -; а по окончании операции все идентификаторы #FC автоматически -; переводятся в #00 -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0B94 ld a,#80 - jr x0B9A - -;АДРЕС: #0B98 R8DOS #0D(13) последовательная запись. Порядок записи определяется -; содержимым таблицы расположения секторов. Сектора, для которых значение -; идентификационного байта #FF или #FC не записываются, а в буфере -; пропускается соответствующее длине такого сектора (байт + 4) место. -; Если сектор не может быть записан, то соответствующий идентификатор в -; таблице заменяется на #FD. По окончании записи все идентификаторы #FC -; автоматически переводятся в #00. -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0B98 ld a,#A0 -x0B9A ld (xFFE1),a - ld (xFFE2),de - ld (xFFE4),de - call x03A2 ;установка номера дорожки для позиционирования - bit 5,(iy+#0B) - jr z,x0C08 ;вызов из монитора - call x092F ;вычисление размера таблицы секторов - call x1B45 ;определение необходимости копирования памяти пользователя - jr nc,x0C08 ;копировать не надо - push hl - ld de,xE5A9 - push bc - push de - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - pop hl - call x0C08 ;чтение/запись дорожки - pop bc - pop de - ld hl,xE5A9 - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - ret - -;завершение. дорожка прочитана -x0BCE pop ix - pop bc - ld hl,xFFDD - ld a,(hl) ;код ошибки - inc a - jr z,x0BEC ;ошибок не было - ld (hl),#FF - ld de,(xFFE4) ;начало буфера дорожки - ld (xFFE2),de - ld a,(xFFDC) - rlca - jr c,x0BEA ;подключен образ, повторять нет смысла - djnz x0C12 ;повторим попытку -x0BEA ld (hl),#14 -x0BEC call x033F ;hl адрес кода, определяющего номер дорожки в текущем дисководе - ld a,(hl) - out (#3F),a - ld de,#00FC - -;замена идентификаторов в таблице секторов -;вх: ix - адрес таблицы секторов -; e - заменяемый идентификатор -; d - устанавливаемый идентификатор -x0BF5 ld bc,#0005 -x0BF8 ld a,(ix+0) - cp #FE - ret z ;конец таблицы - cp e - jr nz,x0C04 ;слезующий сектор - ld (ix+0),d ;заменяем идентификатор -x0C04 add ix,bc - jr x0BF8 - -;чтение/запись дорожки -;вх: hl - адрес таблицы секторов -; de - адрес буфера дорожки -x0C08 push hl - call x0824 ;позиционирование на заданную дорожку c тайм-аутом - pop ix ;адрес таблицы секторов - ld a,(xFFCB) ;количество попыток считывания при ошибке - ld b,a -x0C12 push bc - push ix -x0C15 ld a,(ix+0) - inc ix - cp #FC - jr z,x0C6F ;сектор не читаем. пропускаем место для него - cp #FF - jr z,x0C6F ;сектор не читаем. пропускаем место для него - cp #FE - jr z,x0BCE ;конец таблицы - call x0322 ;опрос Break и прерывание, если нажата - ld a,(ix+0) - out (#3F),a ;номер дорожки - ld c,(ix+3) ;код длины сектора - ld a,(xFFDC) - rlca - jr nc,x0C3E ;реальная дискета - ld a,c - cp #01 - ld a,#FD - jr nz,x0C67 ;на образе сектор может быть только 256 байт -x0C3E call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) ;адрес в буфере дорожки - ld a,(ix+2) ;номер сектора - dec a - ld e,a - push de - ld a,(xFFE1) - bit 5,a - push af - call nz,x06B4 ;запись сектора - pop af - call z,x0610 ;чтение сектора - pop de - bit 6,a ;защита от записи - push af ;!!!ОШИБКА!!! при записи состояние регистра - ld a,#02 ;состояния не сохраняется - jp nz,x04D1 ;ошибка. прерывание функции - pop af - and #1F - ld a,#FC ;признак успешной операции - jr z,x0C6C ;!!!ОШИБКА!!! при операции записи будет всегда z -x0C67 ld (xFFDD),a ;код ошибки - ld a,#FD -x0C6C ld (ix-1),a -x0C6F ld c,(ix+3) ;код размера сектора - call x0B52 ;преобразование кода размера сектора в байтах в число - ld hl,(xFFE2) ;адрес в буфере дорожки - add hl,bc - ld (xFFE2),hl - ld bc,#0004 ;следующая запись в таблице секторов - add ix,bc - jr x0C15 - -;АДРЕС: #0C83 опрос Break. cy=1 не нажата -x0C83 push hl - ld hl,x0C96 ;адрес возврата - push hl - ld hl,rom3_x3D30 ;включение rom 7 - push hl - ld hl,rom5_x0110 ;опрос Break. cy=1 не нажата x0110 - push hl - ld hl,xFFEF - ld (hl),#C9 ;ret - jp (hl) -x0C96 pop hl - ret - -;АДРЕС: #0C98 остановка контроллера ВГ93 -;вых: a - значение выведенное в порт #FF -x0C98 call x0356 ;подготовка байта для выбора заданного дисковода - and %11111011 - out (#FF),a ;сброс ВГ93 - nop - nop - nop - or #04 - out (#FF),a ;загрузка головки, сторона верхняя, метод записи - push af - ld a,#D0 - out (#1F),a ;команда прерывания - pop af - ret - -;АДРЕС: #0CAD таблица адресоф функций R8DOS -x0CAD dw x029C ;#00(0) сброс контроллера - dw x03C5 ;#01(1) выбор текущего дисковода - dw x0457 ;#02(2) позиционирование на заданный логический трек - dw x05D8 ;#03(3) игнорирование ошибки и продолжение выполнения функции 5 (или 6) - dw x054E ;#04(4) повторить в случае ошибки функцию 5 (или 6) - dw x0553 ;#05(5) чтение группы секторов - dw x0557 ;#06(6) запись группы секторов - dw x084F ;#07(7) идентификация диска - dw x08D4 ;#08(8) идентификация диска для tr-dos - dw x0922 ;#09(9) установка рабочего буфера для функции 8 - dw x077F ;#0A(10) построение таблицы расположения секторов на дорожке, начиная от индексного маркера - dw x0948 ;#0B(11) форматирование дорожки - dw x0B94 ;#0C(12) чтение дорожки - dw x0B98 ;#0D(13) запись дорожки - dw x0502 ;#0E(14) физическое позиционирование на трек - dw x0B67 ;#0F(15) замена идентификатора в таблице расположения секторов - dw x032B ;#10(16) чтение/установка спецификации дискеты - dw x0335 ;#11(17) чтение кода спецификации дисковода - dw x0546 ;#12(18) в hl адрес таблицы с количеством секторов на дорожке - dw x02CA ;#13(19) установка режима time-out для счетчика включения двигателя дисковода - dw x11DB ;#14(20) открыть файл для последующих операций с ним - dw x1307 ;#15(21) закрыть файл, открытый функцией 20 - dw x1240 ;#16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". - dw x128C ;#17(23) запись байта в файл. Файл должен быть открыт как "логический" - dw x14C0 ;#18(24) удаление файла, адрес спецификации которого задан в регистрах hl - dw x111E ;#19(25) физический поиск файла, указанного в fcb, в каталоге диска - dw x1125 ;#1A(26) !!!ОШИБКА!!! маски, после первого поиска больше нету - dw x11B0 ;#1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - dw x1365 ;#1C(28) последовательное чтение очередного сектора из файла - dw x1395 ;#1D(29) последовательная запись одного сектора из памяти - dw x1360 ;#1E(30) последовательное считывание заданного количества секторов - dw x1390 ;#1F(31) последовательная запись заданного количества секторов - dw x1407 ;#20(32) установка нового значения указателя в файле - dw x1545 ;#21(33) чтение из fcb в bc указателя файла - dw x1E74 ;#22(34) идентификация жесткого диска - dw x187F ;#23(35) подключение раздела к драйверу HDD - dw x1B7E ;#24(36) прямое чтение секторов из подраздела жесткого диска - dw x1BC0 ;#25(37) прямая запись секторов в подраздел жесткого диска - dw x1BFE ;#26(38) Вернуть таблицу (каталог) подраздела - dw x1C2D ;#27(39) чтение/запись сектора (???ОШИБКА???) - dw x18C0 ;#28(40) подключение раздела к драйверу HDD - -;АДРЕС: #0CFF установка переменных дисковой BIOS -x0CFF ld bc,#FFBA - ld a,%11110111 ;запрет прерываний от PIC - ld (xDFF0),a - out (c),a ;регистр данных - ld bc,#7FBA ;регистр виртуальных дисководов - ld a,#FF - ld (xDFEE),a - out (c),a - ld hl,x0D1F - ld de,xFFC0 - ld bc,#0032 - ldir - ret -;переменные дисковой BIOS -x0D1F db #1A,#0F,#08,#04 ;MFM максимальное число секторов на дорожке для сектора 128/256/512/1024 - db #16,#10,#09,#05 ;FM максимальное число секторов на дорожке для сектора 128/256/512/1024 - dw #FFC0 ;адрес таблицы с количеством секторов на дорожке - db #00 ;номер текущего дисковода: 0 - дисковода А, 1 - В - db #03 ;число попыток считывания при ошибке, начальное значение 3 - db #C0,#C0,#C0,#C0 ;коды, определяющие тип дисковода (спецификацию) A/B/C/D - db #A1,#A1,#A1,#A1 ;коды, определяющие тип дискеты в дисководе А/B/C/D - db #00,#00,#00,#00 ;текущий номер дорожки для дисковода A/B/C/D - db #FF,#FF,#FF,#FF ;код time-out для дисковода А/B/C/D - db #00 ;флаги R8DOS - db #FF ;код ошибки дискового интерпретатора - ds #11,0 ;прочие переменные - db #C9 ;ret для вызова п/п опроса Break из rom 5 - dw #0000 ;адрес рабочего буфера для функции 8 - -;АДРЕС: #0D51 определение наличия SMUC -;вых: cy=1 SMUC не найден -x0D51 ld bc,#00FE - call x0E01 - jr c,x0DA1 ;SMUC не найден - ld l,a - inc bc - call x0E01 - jr c,x0DA1 - ld h,a - ret - -;АДРЕС: #0D62 определение наличия NVRAM -x0D62 call x0D51 ;определение наличия SMUC - ret c ;если SMUC отсутствует. то и NVRAM тоже - call x0DE8 - jr c,x0DA1 ;NVRAM не найден - sbc hl,de - jr z,x0D8E -x0D6F rst #30 - dw rom4_x0378 ;запись переменных в NVRAM - db #04 - ld bc,#0000 - ld a,#61 - call x0E4B ;запись числа в A в ячейку NVRAM в BC - jr c,x0DA1 - call x0DE8 - jr c,x0DA1 - call x0E72 - jr c,x0DA1 - call x0D9A - ld a,#33 ;сообщение: NVRAM checksum error - scf - ret -x0D8E ld bc,#0000 - call x0E01 - jr c,x0DA1 ;NVRAM не найден - cp #61 - jr nz,x0D6F ;контрольное значение не совпадает. перезаписываем переменные -x0D9A set 5,(iy+#1A) - ld a,#27 ;сообщение: NVRAM found - ret -x0DA1 ld a,#26 ;сообщение: NVRAM not found - scf - ret - -;АДРЕС: #0DA5 cy=1, a=#01 !!!Not Used!!! -x0DA5 ld a,#01 - scf - ret - -;АДРЕС: #0DA9 cy=1, a=#02 !!!Not Used!!! -x0DA9 ld a,#02 - scf - ret - -;АДРЕС: #0DAD чтение всей памяти NVRAM в память #7530 -x0DAD ld hl,#7530 - ld de,#0800 - ld bc,#0000 - -;АДРЕС: #0DB6 чтение данных из NVRAM -;вх: hl - адрес куда читать -; de - сколько читать -; bc - адрес в NVRAM для чтения -x0DB6 call x0E01 - jr c,x0DC4 - ld (hl),a - inc hl - inc bc - dec de - ld a,e - or d - jr nz,x0DB6 - ret -;ошибки чтения NVRAM -x0DC4 ld a,#69 ;сообщение: NVRAM R/W error - ret - -;АДРЕС: #0DC7 запись всей памяти NVRAM из памяти #7530 -x0DC7 ld hl,#7530 - ld de,#0800 - ld bc,#0000 - -;АДРЕС: #0DD0 запись данных в NVRAM -;вх: hl - адрес откуда записывать -; de - сколько читать -; bc - адрес в NVRAM для записи -x0DD0 ld a,(hl) - call x0E4B ;запись одной ячейки NVRAM - jr c,x0DC4 - inc hl - inc bc - dec de - ld a,e - or d - jr nz,x0DD0 - call x0DE8 - jr c,x0DC4 - call x0E72 - jr c,x0DC4 - ret - -x0DE8 ld de,#FFFF - ld bc,#0000 -x0DEE call x0E01 - ret c - call x220F ;суммирование байта с контрольной суммой CRC8 - inc bc - ld a,#FE - cp c - jr nz,x0DEE - ld a,#00 - cp b - jr nz,x0DEE - ret - -x0E01 push bc - exx - ex (sp),hl - exx - push hl - push de - push af - call x0F42 - call x0E91 - jr nz,x0E41 - call x0EB1 - call x0EF7 - call x0EDE - jr nz,x0E41 - call x0F2C - call x0EA5 - set 0,d - call x0EF7 - call x0EDE - jr nz,x0E41 - call x0EB8 - call x0EDE -x0E31 call x0F1C - call x0F3E - pop af - ld a,d - or a -x0E3A pop de - pop hl - exx - ex (sp),hl - exx - pop bc - ret -x0E41 call x0F1C - call x0F3E - pop af - scf - jr x0E3A - -;запись числа в A в ячейку NVRAM в BC -x0E4B push bc - exx - ex (sp),hl ;адрес в NVRAM - exx - push hl - push de - push af - ld e,a - call x0F42 - call x0E91 - jr nz,x0E41 - call x0EB1 - call x0EF7 - call x0EDE - jr nz,x0E41 - ld d,e - call x0EF7 - call x0EDE - jr nz,x0E41 - ld d,e - jr x0E31 - -;АДРЕС: #0E72 что-то пишет в NVRAM -x0E72 ld bc,#00FE - ld a,e - call x0E4B ;запись числа в A в ячейку NVRAM в BC - ret c - inc bc - ld a,d - call x0E4B ;запись числа в A в ячейку NVRAM в BC - ret c - push bc - exx - ex (sp),hl - exx - push hl - push de - push af - call x0F42 - call x0E91 - jr nz,x0E41 - jr x0E31 - -x0E91 ld l,#C8 -x0E93 call x0F2C - call x0EA5 - call x0EF7 - call x0EDE - ret z - dec l - jr nz,x0E93 - scf - ret - -x0EA5 push af - exx - ld a,h - exx - and #07 - rlca - or %10100000 - ld d,a - pop af - ret - -x0EB1 push af - exx - ld a,l - exx - ld d,a - pop af - ret - -x0EB8 push hl - ld l,#08 - and %10111111 - or %00010000 - out (c),a -x0EC1 call x0F52 - or %01000000 - out (c),a - nop - nop - in h,(c) - sla h - sla h - rl d - call x0F52 - and %10111111 - out (c),a - dec l - jr nz,x0EC1 - pop hl - ret - -x0EDE or %00010000 - out (c),a - call x0F52 - or %01000000 - out (c),a - push hl - in l,(c) - call x0F52 - and %10111111 - out (c),a - bit 6,l - pop hl - ret - -x0EF7 push hl - ld l,#08 - and %10111111 - out (c),a -x0EFE push bc - pop bc - and %11101111 - rl d - jr nc,x0F08 - or %00010000 -x0F08 out (c),a - push bc - pop bc - or %01000000 - out (c),a - call x0F52 - and %10111111 - out (c),a - dec l - jr nz,x0EFE - pop hl - ret - -x0F1C and %11101111 - out (c),a - call x0F52 - or %01000000 - out (c),a - call x0F52 - jr x0F4A -x0F2C or %01010000 - out (c),a - call x0F52 - and %11101111 - out (c),a - call x0F52 - and %10111111 - jr x0F4C -x0F3E or %00100000 - jr x0F4A -x0F42 ld bc,#FFBA - ld a,(xDFF0) - and #DF ;%11011111 -x0F4A or #50 ;%01010000 -x0F4C ld (xDFF0),a - out (c),a - ret - -x0F52 push bc - pop bc - ret - -x0F55 db #00,#08,#00,#00 ;для сравнения чисел -x0F59 db #00,#02,#00,#00 ;для сравнения чисел - -;АДРЕС: #0F5D деление de'hl'=de'hl'/bc -;вх: de'hl' - делимое -; bc - делитель -;вых: de'hl' - значение -; hl остаток от деления -; -x0F5D ld hl,#0000 - push hl - ld e,l - ld d,h - exx - ld b,#20 -x0F66 xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - rla - or a - sbc hl,bc - ex (sp),hl - ex de,hl - sbc hl,de - ex de,hl - ex (sp),hl - exx - sbc a,#00 - jr nz,x0FAD -x0F87 inc l - djnz x0F66 - inc sp - inc sp - exx - ret -x0F8E xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - rla - add hl,bc - ex (sp),hl - ex de,hl - adc hl,de - ex de,hl - ex (sp),hl - exx - sbc a,#00 - jr z,x0F87 -x0FAD djnz x0F8E - exx - add hl,bc - jr nc,x0FB4 - inc de -x0FB4 inc sp - inc sp - ret - -;АДРЕС: #0FB7 умножение dehl=de'hl' * bc -;вх: de'hl' - первый множитель -; bc - второй множитель -;вых: dehl - значение -; -x0FB7 ld hl,#0000 - push hl - ld e,l - ld d,h - exx - ld b,#20 -x0FC0 exx - xor a - rl l - rl h - rl e - rl d - exx - rl l - rl h - rl e - rl d - jr nc,x0FED - exx - add hl,bc - ld a,e - adc a,#00 - ld e,a - ld a,d - adc a,#00 - ld d,a - exx - jr nc,x0FED - ld l,a - adc a,#00 - ld l,a - ld h,a - adc a,#00 - ld h,a - jr nc,x0FED - inc de -x0FED djnz x0FC0 - exx - inc sp - inc sp - ret - -;АДРЕС: #0FF3 инкремент dehl -;вх: dehl - число -;вых: dehl=dehl + 1 -; -x0FF3 ld c,#00 - ld a,l - add a,#01 - ld l,a - ld a,h - adc a,c - ld h,a - ld a,e - adc a,c - ld e,a - ld a,d - adc a,c - ld d,a - ret - -;АДРЕС: #1003 копирование из (hl) в (de) 4х байт -x1003 push bc - push hl - push de - ld bc,#0004 - ldir - pop de - pop hl - pop bc - ret - -;АДРЕС: #100F загрузка числа в регистры из памяти -;вх: hl - адрес откуда грузим -;вых: dehl - число -x100F push hl - pop bc - ld a,(bc) - ld l,a - inc bc - ld a,(bc) - ld h,a - inc bc - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - ret - -;АДРЕС: #101D сложение 4х байтного числа с двухбайтным -;вх: de - адрес 2х байтного числа -; hl - адрес 4х байтного числа -;вых: по адресу hl сумма этих чисел -x101D ex de,hl - push bc - xor a - ld b,#02 -x1022 ld a,(de) - adc a,(hl) - ld (de),a - inc hl - inc de - djnz x1022 - ld a,(de) - adc a,#00 - ld (de),a - inc hl - inc de - ld a,(de) - adc a,#00 - ld (de),a - pop bc - ret - -;АДРЕС: #1035 сравнение двух чисел в памяти по адресам в de и hl -;вх: de - адрес 4х байтного числа e9e7 -; hl - адрес 4х байтного числа e9eb -;вых: nz,c,m - (hl)<(de) -; nz,nc,p - (hl)>(de) -; z,nc,p - (hl)=(de) -; -x1035 push bc - ex de,hl - inc hl - inc hl - inc hl - inc de - inc de - inc de - ld a,(de) - or a - jp m,x1048 ;(de) отрицательное - xor (hl) - jp m,x1060 ;(hl) отрицательное - jr x104C -x1048 xor (hl) - jp m,x105B ;(de) отрицательное, (hl) положительное -;сравнение чисел с одинаковым знаком -x104C ld b,#04 -x104E ld a,(de) - cp (hl) - jr c,x105B ;(de)<(hl) - jr nz,x1060 - dec hl - dec de - djnz x104E - xor a - pop bc - ret -;nz,c,m - (de вх)>(hl вх) -x105B xor a - sub #01 - pop bc - ret -;nz,nc,p - (de вх)<(hl вх) -x1060 xor a - add a,#01 - pop bc - ret - -;АДРЕС: #1065 инициализация дисковода -x1065 ld hl,#0000 - ld (xDFFE),hl - ld (xE000),hl - ld a,(xFFCA) ;номер текущего дисковода -x1071 ld c,#01 - call x0229 ;R8DOS #01(1) - xor a - ld c,a - jp x0229 ;R8DOS #00(0) - -;АДРЕС: #107B инициализация дисковода и настройка на дискету -;вых: b - код, определяющий тип дискеты в дисководе -; a - код ошибки -x107B call x1065 ;инициализация дисковода - jr c,x1097 ;ошибка - ld hl,xE5A9 - ld (xFFE7),hl ;;адрес рабочего буфера для функции 8 - ld c,#08 ;идентификация диска - call x0229 ;R8DOS #08(8) - push af - call x0344 ;hl адрес кода, определяющего тип дискеты в текущем дисководе - ld b,(hl) - ld hl,#0000 - ld (xFFE7),hl ;адрес рабочего буфера для функции 8 - pop af -x1097 ret nc - ld a,(xFFDD) ;код ошибки дискового интерпретатора - cp #10 - scf - ld a,#3F ;дискета не соответствует формату TR-DOS - ret z - ld a,#50 ;HDD не вышел в готовность - ret - -;АДРЕС: #10A4 распознавание имени файла и занесение его в fcb -;вх: ix - адрес буфера для fcb -; hl - адрес строки, содержащей имя и тип файла в asciz -;вых: nz - успешно -; z - ошибка -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; -x10A4 ld a,(xFFCA) - ld (ix+#18),a ;номер текущего дисковода -;выделение дисковода из строки - ld c,(hl) - inc hl - ld a,":" - cp (hl) - jr nz,x10CB ;дисковод не указан - ld a,c - cp "A"-1 - jr c,x10BA ;не буква - and #5F - sub #11 -x10BA sub #30 - jr nc,x10C2 -x10BE ld a,#44 ;несуществующий дисковод - or a - ret -x10C2 cp #04 - jr nc,x10BE ;несуществующий дисковод - ld (ix+#18),a ;номер дисковода - inc hl - inc hl -x10CB ld (ix+#08),"C" ;тип файла по умолчанию - dec hl -;распознаем имя и расширение файла - push ix - pop de - ld bc,#0009 -x10D6 rst #30 - dw rom2_x0D46 ;проверка символа в (hl) #2C/#3B/#00/#0D - db #02 - jr z,x1102 ;символ конца имент - cp #2E ;. - jr nz,x10E7 ;допустимый в имени символ - inc hl - call x110F ;проверка символа расширения файла - jr z,x10F7 ;допустимый символ расширения - dec hl ;иначе распознаем точку как символ имени файла -x10E7 ldi - jp pe,x10D6 -x10EC rst #30 ;имя и расширение заполнено - dw rom2_x0D42 ;проверка символа в (hl) #20/#2C/#3B/#00/#0D - db #02 - scf - ccf - ret z ;конец строки -x10F3 ld a,#45 ;ошибка в имени файла - or a - ret -x10F7 ld (ix+#08),a - call x1102 ;заполнение остатка имени пробелами - jr nz,x10F3 ;пустое имя. ошибка в имени файла - inc hl - jr x10EC ;проверка остатка строки -x1102 ld a,#09 - cp c - jr z,x10F3 ;пустое имя. ошибка в имени файла -x1107 dec c ;заполнение остатки мени пробелами - ret z - ld a," " - ld (de),a - inc de - jr x1107 -;проверка символа расширения файла -x110F ld a,(hl) - cp #23 ;# - ret z - and %11011111 - cp #43 ;C - ret z - cp #42 ;B - ret z - cp #44 ;D - ret - -;АДРЕС: #111E R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска -;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z -; a=#50(80) - ошибка диска -; cy=0, z - файл не найден -; cy=0, nz - файл найден и скопирован в fcb -; -x111E call x153D ;копирование дескриптора дисковода в буфер - call x107B ;инициализация дисковода - ret c ;ошибка - -;АДРЕС: #1125 R8DOS #1A(26) продолжает поиск файла, указанного в fcb !!!ОШИБКА!!! маски, после первого поиска больше нету -;вх: ix - адрес буфера fcb (в имени файла допустимы заменители '?') -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе или флаге Z -; a=#50(80) - ошибка диска -; cy=0, z - файл не найден -; cy=0, nz - файл найден и скопирован в fcb -; -x1125 push hl -x1126 pop hl - call x1166 ;загрузка очередного дескриптора файла в буфер - ld (ix+#19),c - ret c ;ошибка загрузки: a=#50 - ret z ;конец каталога. файл не найден -;сравнение имени файла с маской поиска - push hl - push ix - pop de - ld b,#09 -x1135 ld a,(de) - cp "?" - jr z,x113D - cp (hl) - jr nz,x1126 ;не совпало, следующее имя файла -x113D inc hl - inc de - djnz x1135 - pop hl -;файл найден. копируем дескриптор в fcb -x1142 push hl - ld bc,#0010 - push ix - pop de - ldir - pop hl - inc b ;флаг nz - ret - -;АДРЕС: #114E загрузка дескриптора файла в буфер -;вх: c - номер файла на диске -;вых: cy=1 -> a=#50 ошибка чтения диска -; hl - адрес дескриптора файла в буфере -; c - номер этого файла на диске [#00..#7F] -x114E ld hl,xDFFE - ld a,c - and %01110000 - rrca - rrca - rrca - rrca - ld (hl),a ;номер сектора - inc hl - inc a - ld (hl),a ;номер следующего сектора - inc hl - ld a,c - and #0F - dec a - ld (hl),a ;номер записи в секторе - dec hl - ld a,(hl) - jr x1177 - -;АДРЕС: #1166 загрузка очередного дескриптора файла в буфер -;вых: cy=1 -> a=#50 ошибка чтения диска -; cy=0, z - конец каталога. файл не найден -; cy=0, nz - дескриптор найден -; hl - адрес дескриптора файла в буфере -; c - номер этого файла на диске [#00..#7F] -x1166 ld hl,xDFFE - ld a,(hl) - inc a - inc hl - cp (hl) - inc hl - jr z,x1182 ;сектор уже загружен - ld (hl),#FF ;сброс номера дескриптора файла - cp #09 - ret nc ;выход. конец каталога - dec hl - ld (hl),a ;номер следующего сектора -x1177 inc hl - push hl - ld e,a - dec e ;e - номер сектора - call x1567 ;чтение одного сектора нулевой дорожки в буфер - pop hl - ld a,#50 - ret c ;ошибка -x1182 ld a,(hl) - inc a - cp #10 - jr c,x118D ;следующий номер дескриптора файла в загруженном секторе - dec hl ;нет больше записей в загруженном секторе - dec hl - inc (hl) - jr x1166 ;грузим следующий сектор -x118D ld (hl),a ;номер дескриптора файла в загруженном секторе [#0..#F] - rlca - rlca - rlca - rlca - ld hl,xE5A9 ;буфер загруженного сектора - call x11AB ;hl=hl+a*#10 (адрес дескриптора файла) - ld a,(xDFFE) ;номер загруженного сектора [#01..#10] - rlca - rlca - rlca - rlca - ld c,a - ld a,(xE000) ;номер дескриптора файла в загруженном секторе [#0..#F] - or c - ld c,a ;номер дескрптора файла на диске [#00..#7F] - inc a ;установка флага nz - ret - -;АДРЕС: #11A7 получение адреса байта в буфере dma -;вх: c - смещенеи в буфере -x11A7 call x1553 ;чтение из fcb в hl адреса буфера dma - ld a,c -x11AB add a,l - ld l,a - ret nc - inc h - ret - -;АДРЕС: #11B0 R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) -;вх: hl - адрес строки имени файла в asciz -; ix - адрес буфера создаваемого fcb -; de - адрес буфера dma -; b - способ открытия -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: -; a=#4A(74) - неверный тип файла -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; ix - адрес буфера fcb -; -x11B0 push bc ;очищаем блок fcb - push ix - ex (sp),hl - ld b,#1C - xor a -x11B7 ld (hl),a - inc hl - djnz x11B7 - pop hl - pop bc - ld (ix+#15),e ;адрес буфера - ld (ix+#16),d - ld (ix+#17),b ;способ открытия - ld a,#03 ;проверка типа открытия файла - and b - ld a,#4A - ccf - ret z - call x10A4 ;распознавание имени файла и занесение его в fcb - scf - ret nz ;ошибка распознавания - or a - ret - -;АДРЕС: #11D4 открыть файл(для нужд монитора) для последующих операций с ним -x11D4 ld de,xE8A9 ;адрес буфера dma - ld ix,xE7A9 ;адрес буфера для fcb - -;АДРЕС: #11DB R8DOS #14(20) открыть файл для последующих операций с ним -;вх: ix - адрес буфера для fcb -; hl - адрес строки, содержащей имя и тип файла в asciz -; de - адрес буфера dma -; b - способ открытия -; 2,b =1 обмен целыми секторами "физический" файл -; (если сброшен - обмен будет вестись байтами "логический" файл) -; 1,b =1 файл для записи -; 0,b =1 файл для чтения -; 0-1,b=11 файл для модификации -;вых: cy=1, если были ошибки, код ошибки возвращается в аккумуляторе: -; a=#47(71) - нельзя открыть существующий файл только для записи -; a=#48(72) - нельзя создать файл только для чтения -; a=#49(73) - нет места на диске -; a=#4A(74) - неверный тип файла -; a=#44(68) - несуществующий номер устройства -; a=#45(69) - ошибка в имени файла -; cy=0 - успешно -; bc - длина файла в байтах -; -x11DB call x11B0 ;разбор спецификации файла - ret c ;ошибка - -;АДРЕС: #11DF открыть файл для последующих операций с ним -x11DF call x111E ;поиск файла на диске по имени в fcb - ret c ;ошибка чтения диска - jr z,x1200 ;файл не найден - bit 0,(ix+#17) ;файл найден - ld a,#47 - scf - ret z ;нельзя открыть существующий файл только для записи - xor a - bit 2,(ix+#17) - jr nz,x11FB ;обмен секторами - ld c,(ix+#0B) - ld b,(ix+#0C) ;bc - длина файла - ret -x11FB ld c,a - ld b,(ix+#0D) ;bc - длина файла (кратна сектору) - ret -x1200 bit 1,(ix+#17) ;файл не найден - ld a,#48 - scf - ret z ;нельзя создать файл только для чтения - call x107B - ret c ;ошибка чтения/записи - ld a,(xE5A9+#E4) ;xE68D количество файлов на дискете - ld (ix+#19),a ;номер файла на дискете - cp #80 - ld a,#49 - ccf - ret c ;нет места на диске - ld bc,(xE5A9+#E5) ;xE68E кол-во свободных секторов - ld a,c - or b - ld a,#49 - ccf - ret z ;нет места на диске - ld a,b - or a - jr z,x1228 - ld c,#FF -x1228 ld (ix+#1B),c ;максимальный объем файла в секторах - ld hl,(xE5A9+#E1) ;xE68A номер первой свободной дорожки и сектора - ld (ix+#0E),l ;сектор - ld (ix+#0F),h ;дорожка - ld a,b - or a - jr nz,x123C - ld b,c - ld c,#00 ;максимальный размер файла в байтах - ret -x123C ld bc,#FFFF ;!!!ОШИБКА!!! должно быть ld bc,#FF00 - ret - -;АДРЕС: #1240 R8DOS #16(22) чтение очередного байта из файла. файл должен быть открыт как "логический". -;вх: ix - адрес буфера fcb -;вых: cy=1 были ошибки -; a - код ошибки возвращается в аккумуляторе -; a - очередной считанный байт (при cy=0) -x1240 ld c,(ix+#17) - bit 0,c - ld a,#4A - scf - ret z ;ошибка. файл открыт на запись - bit 2,c - call x1545 ;чтение из fcb в bc указателя файла - jr nz,x125E ;файл открыт как физический (чтение целых секторов) - call x154C ;чтение из fcb в hl длины файла - or a - sbc hl,bc - jr z,x125A - jr nc,x125E -x125A scf ;ошибка. конец файла - ld a,#46 - ret -x125E ld a,c - or a - jr nz,x126C ;указатель не в начале сектора - ld a,b - cp (ix+#0D) - jr nc,x125A ;ошибка. конец файла - call x1472 ;чтение сектора в буфер dma - ret c ;ошибка чтения -x126C call x11A7 ;получение адреса байта в буфере dma - ld a,(hl) - ld (ix+#1A),a - ld a,#FF - cp c - jr nz,x1287 ;еще не конец сектора - ld a,(ix+#17) - bit 1,a - jr z,x1287 ;файл открыт для чтения - bit 7,a - jr z,x1287 ;файл не был изменен - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи -x1287 ld a,(ix+#1A) - jr x12FE ;установка в fcb нового указателя в файле из bc - -;АДРЕС: #128C R8DOS #17(23) запись байта в файл. Файл должен быть открыт как "логический" -;вх: ix - адрес буфера fcb -; a - байт для записи -;вых: cy=1 были ошибки -; a - код ошибки возвращается в аккумуляторе -x128C ld (ix+#1A),a - call x1545 ;чтение из fcb в bc указателя файла - ld e,(ix+#17) - bit 1,e - ld a,#4A ;!!!ОШИБКА!!! не устанавливается cy - ret z ;ошибка. файл открыт на чтение - bit 0,e - jr z,x12B8 ;файл открыт только на запись - bit 2,e ;обмен целыми секторами "физический" файл - jr nz,x12B8 ;запись байта в файл - call x154C ;чтение из fcb в hl длины файла - or a - sbc hl,bc - jr z,x12AC ;ошибка #46. конец файла - jr nc,x12B8 ;запись байта в файл -x12AC bit 7,e - jr z,x12B4 ;изменение в файле не было - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи - -;код ошибки #46. конец файла -x12B4 ld a,#46 - scf - ret - -;запись байта в файл -x12B8 ld a,c - or a - jr nz,x12EA ;указатель не в начале сектора - bit 0,e - jr nz,x12DB ;файл открыт для модификации - ld a,b - cp (ix+#1B) - jr nc,x12D3 ;попытка записи после конца файла - ld a,(ix+#0D) - cp #FF - jr nz,x12E7 ;увеличение размена файла на один сектор - call x1329 ;создание записи в каталоге диска - ret c ;ошибка записи - jr x12B4 ;ошибка #46. конец файла - -;ошибка #49. попытка записи после конца файла -x12D3 call x1329 ;создание записи в каталоге диска - ret c - ld a,#49 ;ошибка #49. попытка записи после конца файла - scf - ret -x12DB ld a,b - cp (ix+#0D) - jr nc,x12B4 ;ошибка #46. конец файла - call x1472 ;чтение сектора в буфер dma - ret c ;ошибка чтения - jr x12EA - -x12E7 inc (ix+#0D) ;увеличим размер файла в секторах -x12EA call x11A7 ;получение адреса байта в буфере dma - ld a,(ix+#1A) - ld (hl),a ;запись файла в буфер - set 7,(ix+#17) ;файл был изменен, но не сохранен - ld a,c - cp #FF - jr nz,x12FE ;установка в fcb нового указателя в файле из bc - call x1484 ;сохранение буфера dma в файл - ret c ;ошибка записи -x12FE inc bc - -;АДРЕС: #12FF установка в fcb указателя в файле из bc -x12FF ld (ix+#13),c - ld (ix+#14),b - or a - ret - -;АДРЕС: #1307 R8DOS #15(21) закрыть файл, открытый функцией 20. При закрытии -; файла происходит дозапись (при необходимости) информации из -; открытых буферов -;вх: ix - адрес буфера fcb -;вых: cy=1 - были ошибки -; a - код ошибки -x1307 call x1545 ;чтение из fcb в bc указателя файла - ld a,c - or b - jr z,x130F ;файл пустой - dec bc -x130F call x12FF ;установка в fcb указателя в файле из bc - ld a,(ix+#17) - bit 1,a - ret z ;файл только для чтения - bit 7,a - jr z,x1320 ;не сохраненных изменений нет - call x1484 ;сохранение буфера dma в файл - ret c ;была ошибка -x1320 bit 0,(ix+#17) - ret nz ;файл для модификации - call x1545 ;чтение из fcb в bc указателя файла - inc bc - -;создание записи в каталоге диска -;вх: bc - длина файла в байтах -x1329 call x1440 ;сохранение из bc в fcb длины файла в байтах и секторах - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c - call x107B ;чтение в буфер служебного сектора - ret c - ld a,(xE5A9+#E4) ;xE68D - inc a - ld (xE5A9+#E4),a ;xE68D количество файлов +1 - ld hl,(xE5A9+#E5) ;xE68E - ld c,(ix+#0D) - ld b,#00 - or a - sbc hl,bc - ld (xE5A9+#E5),hl ;xE68E оставшееся свободное место в секторах - ld b,c - call x14A6 ;расчет нового номера дорожки и сектора - ld (xE5A9+#E1),de ;xE68A первая свободная дорожка и сектор - ld de,#0008 ;запишем служебный сектор -;запись буфера на диск (d - дорожка, e - сектор) -x1354 ld hl,xE5A9 -x1357 ld bc,#0106 - call x0229 - ld a,#50 - ret - -;АДРЕС: #1360 R8DOS #1E(30) последовательное считывание заданного количества -; целых секторов. Функция 30 (R_MS) подобна многократному -; выполнению функции #1C(28), с той лишь разницей, что значение, -; указанное в поле dma не изменяется. В случае ошибки полагается, -; что все сектора не считались -;вх: ix - адрес буфера fcb -; b - число считываемых секторов -;вых: cy=1 если были ошибки -; a - код ошибки - -x1360 ld (ix+#1A),b - jr x1369 - -;АДРЕС: #1365 R8DOS #1C(28) последовательное чтение очередного сектора из файла, -; содержимое сектора размещается в памяти с адреса, указанного полем -; dma в блоке управления файлом (fcb). Для обеспечения максимальной -; скорости выполнения операции Файл должен быть открыт как -; "физический". Если файл был в режиме "логический" и если -; предварительно был считан байт (т. е. счетчик указывает не на -; границу целого сектора) подфункцией будет "пересчитан" текущий -; сектор. Максимальный номер сектора - 254. -;вх: ix - адрес буфера fcb -;вых: cy=1 если были ошибки -; a - код ошибки -x1365 ld (ix+#1A),#01 -x1369 bit 0,(ix+#17) - ld a,#4A - scf - ret z ;ошибка. файл открыт на запись - call x1545 ;чтение из fcb в bc указателя файла - ld c,#00 - ld a,b - add a,(ix+#1A) - jp c,x12B4 ;ошибка #46. конец файла - dec a - cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла - call x148D ;чтение секторов в буфер dma - ret c ;ошибка чтения -x1388 ld a,b - add a,(ix+#1A) - ld b,a - jp x12FF ;установка в fcb нового указателя в файле из bc - -;АДРЕС: #1390 R8DOS #1F(31) последовательная запись заданного количества -; секторов. Подфункция 31 (W_MS) подобна многократному выполнению -; подфункции #1D(29), с той лишь разницей, что значение, указанное -; в поле dma не изменяется. В случае ошибки полагается, что все -; сектора, принимавшие участие в операции получили случайные -; значения. -;вх: ix - адрес буфера fcb -; b - число записываемых секторов -;вых: cy=1 если были ошибки -; a - код ошибки -x1390 ld (ix+#1A),b - jr x1399 - -;АДРЕС: #1395 R8DOS #1D(29) последовательная запись одного сектора из памяти с -; адреса, указанного полем dma в блоке управления файлом (fcb), в -; файл -;вх: ix - адрес буфера fcb -;вых: cy=1 если были ошибки -; a - код ошибки -x1395 ld (ix+#1A),#01 -x1399 ld e,(ix+#17) - bit 1,e - ld a,#4A - ret z ;!!!ОШИБКА!!! cy не установлен - call x1545 ;чтение из fcb в bc указателя файла - ld c,#00 - ld a,b - add a,(ix+#1A) - jp c,x12B4 ;ошибка #46 конец файла - dec a - bit 0,e - jr nz,x13BA ;файл открыт на модификацию - cp (ix+#1B) - jp nc,x12D3 ;ошибка #49. попытка записи после конца файла - jr x13C0 -x13BA cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла -x13C0 call x1498 ;запись секторов из буфера dma - ret c ;ошибка записи - bit 0,(ix+#17) - jr nz,x1388 ;файл для модификации - ld a,(ix+#0D) - add a,(ix+#1A) - ld (ix+#0D),a ;новый размер файла - jr x1388 - -;АДРЕС: #13D5 создание записи в каталоге диска (на основе fcb) -x13D5 call x153D ;копирование дескриптора дисковода в буфер - ld b,#04 - ld d,#00 - ld e,(ix+#19) ;номер файла на диске -x13DF sla e - rl d - djnz x13DF ;de - адрес дескриптора в каталоге диска - push de - ld e,d - call x1567 ;чтение одного сектора нулевой дорожки в буфер (e - номер сектора) - pop de - ld a,#50 - ret c ;ошибка чтения - push de - ld d,#00 - ld hl,xE5A9 - add hl,de ;адрес дескриптора в буфере - ex de,hl - ld bc,#0010 - push ix - pop hl - ldir ;копируем дескриптор файла из fcb в буфер - pop de - ld e,d - ld d,#00 - jp x1354 ;запись буфера на диск (дорожка 0, e - сектор) - -;АДРЕС: #1405 установка нового значения указателя в файле -;вх: ix - адрес буфера fcb -; bc - новое значение указателя -;вых: cy=1 - если были ошибки -; a - код ошибки -x1405 ld e,c - ld d,b - -;АДРЕС: #1407 R8DOS #20(32) установка нового значения указателя в файле -;вх: ix - адрес буфера fcb -; de - новое значение указателя -;вых: cy=1 - если были ошибки -; a - код ошибки -x1407 call x1545 ;чтение из fcb в bc указателя файла - ld a,(ix+#17) - bit 0,a - jr nz,x1419 ;файл для чтения - ex de,hl - add hl,bc - ex de,hl - jr nc,x1419 ;нет переполнения - ld a,#46 ;ошибка #46 конец файла - ret -x1419 bit 1,a - jr z,x144F ;файл только для чтения - ld a,d - cp b - jr z,x142D ;новый указатель в пределах текущего сектора - bit 7,(ix+#17) - jr z,x142D ;не сохраненных изменений в файле нет - push de - call x1484 ;сохранение буфера dma в файл - pop de - ret c ;ошибка записи -x142D bit 0,(ix+#17) - jr nz,x144F ;файл открыт на модификацию - ld a,d - cp (ix+#1B) ;максимальный объем файла в секторах - jp nc,x12B4 ;ошибка #46 конец файла - ld b,d - ld c,e - call x12FF ;установка в fcb указателя в файле из bc - inc bc - -;сохранение из bc в fcb длины файла в байтах и секторах -x1440 ld (ix+#0B),c - ld (ix+#0C),b ;длина файла в байтах - ld a,c - or a - jr z,x144B - inc b -x144B ld (ix+#0D),b ;длина файла в секторах - ret - -;файл только для чтения -x144F bit 2,(ix+#17) - jr z,x145E ;обмен байтами "логический" файл - ld a,d - cp (ix+#0D) - jp nc,x12B4 ;ошибка #46. конец файла - jr x146A -x145E call x154C ;чтение из fcb в hl длины файла - push de - ex de,hl - or a - sbc hl,de - pop de - jp nc,x12B4 ;ошибка #46. конец файла -x146A ld c,e - ld b,d ;новый указатель - call x12FF ;установка в fcb указателя в файле из bc - ld a,c - or a - ret z - -;АДРЕС: #1472 чтение сектора в буфер dma -x1472 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld bc,#0105 - -;запись/чтение сектора -x1479 call x0229 - pop bc - ld a,#50 - res 7,(ix+#17) - ret - -;АДРЕС: #1484 сохранение буфера dma в файл -;вх: bc - указатель из fcb -x1484 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld bc,#0106 - jr x1479 ;запись сектора - -;АДРЕС: #148D чтение секторов в буфер dma -;вх: bc - указатель в файле -x148D push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld c,#05 -x1493 ld b,(ix+#1A) - jr x1479 ;чтение секторов - -;АДРЕС: #1498 запись секторов из буфера dma -x1498 push bc - call x14A0 ;расчет адреса в файле на диске (дорожка и сектор) - ld c,#06 - jr x1493 - -;АДРЕС: #14A0 расчет адреса в файле на диске (дорожка и сектор) -;вх: bc - указатель в файле -;вых: d - дорожка -; e - сектор -x14A0 call x153D ;копирование дескриптора дисковода в буфер - call x1553 ;чтение из fcb в hl адреса буфера dma - -;АДРЕС: #14A6 расчет нового номера дорожки и сектора -;вх: b - кол-во секторов -;вых: d - новый номер дорожки -; e - новый номер сектора -x14A6 ld a,b - and #F0 - rrca - rrca - rrca - rrca - add a,(ix+#0F) ;+номер начальной дорожки файла - ld d,a ;новый номер дорожки - ld a,b - and #0F - add a,(ix+#0E) ;+номер первого сектора файла - bit 4,a - jr z,x14BC - inc d -x14BC and #0F - ld e,a ;новый номер сектора - ret - -;АДРЕС: #14C0 R8DOS #18(24) удаление файла, адрес спецификации которого задан в регистрах hl -;вх: ix - адрес буфера для fcb -; hl - имя и тип в asciz -;вых: cy=1 - были ошибки -; a - код ошибки -x14C0 ld b,#01 - call x11B0 ;R8DOS #1B(27) разбор спецификации файла и построение на ее основе блока управления (fcb) - ret c ;были ошибки - call x111E ;R8DOS #19(25) физический поиск файла, указанного в fcb, в каталоге диска - ret c ;были ошибки - ld a,#48 ;ошибка #48 файл не найден - scf - ret z - push hl - ld hl,xE6A9 - ld bc,#0105 - ld de,#0008 - call x0229 ;чтение служебного сектора - pop hl - ld a,#50 - ret c ;ошибка #50. диск не вышел в готовность - ld a,(xE6A9+#E4) - dec a - cp (ix+#19) - jr z,x14FD ;этот файл последный на диске - ld hl,xE6A9+#F4 - inc (hl) ;количество удаленных файлов +1 - ld (ix+#00),#01 ;признак удаленного файла - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c ;ошибка записи -x14F4 ld hl,xE6A9 - ld de,#0008 - jp x1357 ;запись служебного сектора на диск -;удаляемый файл последний в каталоге -x14FD ld hl,xE6A9+#E4 - dec (hl) ;количество файлов -1 - ld e,(ix+#0D) - ld d,#00 ;объем удаляемого файла в секторах - ld hl,(xE6A9+#E5) ;количество свободных секторов - add hl,de - ld (xE6A9+#E5),hl ;новое количество свободных секторов - ld l,(ix+#0E) - ld h,(ix+#0F) - ld (xE6A9+#E1),hl ;номер первой свободной дорожки и сектора - ld (ix+#00),#00 ;признак удаленного файла - call x13D5 ;создание записи в каталоге диска (на основе fcb) - ret c ;ошибка записи - ld c,(ix+#19) - ld a,c - or a - jr z,x14F4 ;файл первый на диске - dec c - ld (ix+#19),c - call x114E ;загрузка дескриптора файла в буфер - ret c ;ошибка чтения - call x1142 ;копируем дескриптор в fcb - ld a,(ix+#00) - cp #02 - jr nc,x14F4 ;файл существует. запись служебного сектора на диск - ld hl,xE6A9+#F4 ;файл удален - dec (hl) - jr x14FD - -;АДРЕС: #153D копирование дескриптора дисковода в буфер -x153D ld a,(ix+#18) ;номер дисковода - rst #30 - dw rom2_x2C4D ;копирование дескриптора дисковода в буфер xE590, - db #02 ;если к нему примонтирован образ - ret - -;АДРЕС: #1545 R8DOS #21(33) чтение из fcb в bc указателя файла -;вх: ix - адрес буфера fcb -;вых: bc - текущее значение указателя -x1545 ld c,(ix+#13) - ld b,(ix+#14) - ret - -;АДРЕС: #154C чтение из fcb в hl длины файла -x154C ld l,(ix+#0B) - ld h,(ix+#0C) - ret - -;АДРЕС: #1553 чтение из fcb в hl адреса буфера dma -x1553 ld l,(ix+#15) - ld h,(ix+#16) - ret - -;АДРЕС: #155A чтение заголовка первого попавшегося сектора дисковода A -x155A xor a - call x1071 ;инициализация дисковода A - call x0394 ;проверка bit 7,(xFFDC) наличие подключенного образа к текущему дисководу - ret nz ;к дисководу A подключен образ - ld a,#C4 - out (#1F),a ;чтение заголовка сектора - ret - -;АДРЕС: #1567 чтение одного сектора нулевой дорожки в буфер (e - номер сектора) -x1567 ld d,#00 ;дорожка 0 - ld hl,xE5A9 ;буфер - ld bc,#0105 - jp x0229 ;R8DOS #05(5) - -;АДРЕС: #1572 определение наличия interrupt controller -x1572 ld bc,#FFBA - ld a,(xDFF0) ;состояние порта #FFBA - and #F7 - out (c),a - ld (xDFF0),a - ld bc,#7EBE - ld a,#F3 - out (c),a - nop - ld b,#7F - ld a,#C5 - out (c),a - nop - ld a,#01 - out (c),a - nop - nop - in a,(c) - or a - jr z,x15A1 - cp #01 - jr z,x15A5 -x159D ld a,#24 ;сообщение: interrupt controller not found - scf - ret -x15A1 set 4,(iy+#1B) -x15A5 ld b,#7E - ld a,#F2 - out (c),a - nop - ld b,#7F - ld a,#C5 - out (c),a - nop - ld a,#FF - out (c),a - nop - nop - in a,(c) - cp #FF - jr nz,x159D - set 4,(iy+#1A) - xor a - ld a,#25 ;сообщение: interrupt controller found - ret - -;АДРЕС: #15C7 определение наличия последовательного порта/модема -;#28 modem not found -;#29 modem found -;#2A serial port not found -x15C7 ld bc,#FFBA - ld a,(xDFF0) ;состояние порта #FFBA - or %00000110 - and %01111110 - out (c),a - push bc - ld b,#0F - djnz $ - pop bc - or %00000001 - ld (xDFF0),a ;состояние порта #FFBA - out (c),a - ld b,#6B - djnz $ - ld hl,xEA9D - xor a - or (hl) - jr nz,x15F6 - ld de,x169A ;сброс модема - push hl - ex de,hl - ld bc,#0007 - ldir - pop hl -x15F6 call x1601 - ret c - set 5,(iy+#1A) - ld a,#29 ;сообщение: modem found - ret -; передача команды модему -x1601 ld bc,#7AFE ;hl=xEA9D - in a,(c) - cp #FF - jr nz,x160E -x160A ld a,#2A ;сообщение: serial port not found - scf - ret -x160E ld a,(hl) - bit 6,a - jr z,x1647 - and #1F - or #80 - ld b,#7B - out (c),a - nop - in e,(c) - cp e - jr nz,x160A ;нет порта - inc hl - ld a,(hl) - dec hl - and #0F - cp #0C - jr c,x162C - ld a,#05 -x162C add a,a - ld e,a - ld d,#00 - push hl - ld hl,x16A1 - add hl,de - ld b,#78 - ld a,(hl) - out (c),a - inc hl - ld a,(hl) - inc b - out (c),a - pop hl - ld a,(hl) - and #1F - ld b,#7B - out (c),a -x1647 bit 5,(hl) - jr z,x1658 - inc hl - ld a,(hl) - dec hl - and #F0 - rlca - rlca - rlca - rlca - ld b,#79 - out (c),a -x1658 or a - bit 7,(hl) - ret z - inc hl -x165D inc hl - ld a,(hl) - or a - ret z - cp #7C - jr nz,x166D - ld a,#0D - call x1673 ;передача команды модему (в com порт) - ret c - ld a,#0A -x166D call x1673 ;передача команды модему (в com порт) - ret c - jr x165D -; передача команды модему (в com порт) -x1673 push hl - push af - ld hl,#0814 ;счетчик попыток - ld bc,#00FE -x167B push bc - ld b,#05 - in a,(c) - pop bc - bit 5,a - jr nz,x1692 - djnz x167B - dec hl - ld a,h - or l - jr nz,x167B - pop af - pop hl - ld a,#28 ;modem not found - scf - ret -x1692 pop af - ld b,#78 - out (c),a - or a - pop hl - ret -x169A db %11100011,#05,"ATZ",#7C,#00 ;команда сброса модема -x16A1 db #10,#04 ;#00 - db #00,#03 ;#01 - db #80,#01 ;#02 - db #C0,#00 ;#03 - db #60,#00 ;#04 - db #30,#00 ;#05 - db #18,#00 ;#06 - db #0C,#00 ;#07 - db #06,#00 ;#08 - db #03,#00 ;#09 - db #02,#00 ;#0A - db #01,#00 ;#0B - -;АДРЕС: #16B9 работа с контроллером прерываний -x16B9 ld hl,x1764 - ld de,#9C40 - ld bc,#0003 - ldir - di - ld a,#01 - ld hl,#9C40 - call x175D ;вызов процедуры из основной памяти - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - ld bc,#7EBE - ld a,#1A - out (c),a - nop - ld b,#7F - ld a,#F8 - out (c),a - nop - ld a,#FE - out (c),a - nop - ld b,#0A - ld a,#26 ;%00100110 - call x1FDD ;запись данных в ячейку CMOS - ld b,#0B - ld a,#D6 ;%11010110 - call x1FDD ;запись данных в ячейку CMOS - ld b,#0B - ld a,#56 ;%01010110 - call x1FDD ;запись данных в ячейку CMOS - xor a - ld i,a - im 2 - xor a - ld (#7530),a - ld bc,#FFBA - ld a,(xDFF0) - or #08 - out (c),a - ld (xDFF0),a - ei -x171A halt - ld a,(#7530) - or a - jr z,x171A - di - ld a,#05 - ld hl,x9C40 - call x175D ;вызов процедуры из основной памяти - ld bc,#FFBA - ld a,(xDFF0) - and #F7 - out (c),a - ld (xDFF0),a - ret - -;АДРЕС: #1738 работа с контроллером прерываний -x1738 di - ld bc,#7FBE - ld a,#00 - out (c),a - ld bc,#FFBA - ld a,(xDFF0) - or #08 - out (c),a - ld (xDFF0),a - xor a - ld i,a - im 2 -x1752 ei - ld a,(xDFF0) - bit 3,a - jr nz,x1752 - ret - jr $ - -;вызов процедуры из основной памяти -;вх: hl - адрес процедуры -x175D push hl - ld hl,rom3_x3D30 - ex (sp),hl - push hl - ret - -;установка бордюра -x1764 out (#FE),a - ret - db #00 - -;АДРЕС: #1768 поиск раздела MFS -;вых: cy=1 раздел не найден -; dehl=#00000000 -; cy=0 раздел найден -; bc - адрес дескриптора раздела MFS в буфере -; dehl - смещение первого сектора раздела -x1768 push ix - call x1791 ;hl=de=#0000 (нулевой сектор) - ld (iy+#31),#01 ;число передаваемых секторов данных при операциях чтения/записи (=#00->=#100) - call x1D73 ;чтение нулевого сектора с винчестера в буфер xE5A9 - jp c,x178E ;ошибка чтения - call x1797 ;поиск раздела MFS в MBR - jr c,x178E ;раздел не найден - ld l,(ix+#08) - ld h,(ix+#09) - ld e,(ix+#0A) - ld d,(ix+#0B) ;dehl - смещение первого сектора радела - push ix - pop bc - pop ix - ret -x178E pop ix - scf -;hl=de=#0000 -x1791 ld hl,#0000 - ld e,l - ld d,l - ret -;поиск раздела MFS в MBR -; cy=1 раздел MFS не найден -x1797 ld hl,(xE5A9+#1FE) ;xE7A7 - ld de,#AA55 ;сигнатура (55h AAh) - or a - sbc hl,de - jr nz,x17B7 ;сигнатура отсутствует: MBR отсутствует -x17A2 ld b,#04 - ld ix,xE5A9+#1BE ;xE767 начало дескрипторов разделов HDD -x17A8 ld a,#53 ;код типа раздела MFS - cp (ix+#04) - jr nz,x17B0 - ret -x17B0 ld de,#0010 - add ix,de ;дескриптор следующего раздела - djnz x17A8 -x17B7 ld a,#63 - scf - ret - -;АДРЕС: #17BB чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: cy=1 была ошибка -x17BB push ix - push de - push hl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5 ;грузим первый сектор раздела MFS - call x1D78 ;чтение сектора с винчестера в буфер ix - pop hl - pop de - jr c,x17EB ;ошибка загрузки - call x0FF3 ;инкремент dehl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5+#200 ;грузим втоорой сектор раздела MFS - call x1D78 ;чтение сектора с винчестера в буфер ix - jr c,x17EB ;ошибка загрузки - ld hl,(xEBF5+#3FE) ;xEFF3 сравнение ситгнатуры - ld de,#AA54 - sbc hl,de - ld a,#63 - jr nz,x17EB ;сигнатуры нет - pop ix - ret -x17EB scf ;ошибка - pop ix - ret - -;АДРЕС: #17EF запись 2х секторов из буфера xEBF5 -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x17EF push ix - push de - push hl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5 ;буфер - call x1D4A ;запись сектора из буфера ix на винчестер - pop hl - pop de - jr c,x17EB ;ошибка - call x0FF3 ;инкремент dehl - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ld ix,xEBF5+#200 ;вторй сектор - call x1D4A ;запись сектора из буфера ix на винчестер - jr c,x17EB ;ошибка - pop ix - ret - -;АДРЕС: #1813 чтение сектора с винчестера -;вх: hl - адрес буфера для чтения -; de - смещение от начала образа в секторах (512b) +1 -;вых: hl - адрес буфера для чтения -; cy=1 были ошибки. код ошибки в A -x1813 push hl - call x1848 ;расчет номера сектора на винчестере - ;dehl - смещение в секторах (512b) от начала винчестера до нужного сектора - jr c,x1827 ;ошибка: адрес за пределами образа диска - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ex (sp),ix - call x1D78 ;чтение сектора с винчестера в буфер ix - pop ix - ret nc ;ошибок не было - ld a,#04 - ret -x1827 pop hl ;ошибка: адрес за пределами образа диска - ret - -;АДРЕС: #1829 запись сектора на винчестер -;вх: hl - адрес буфера для записи -; de - смещение от начала образа в секторах (512b) -;вых: hl - адрес буфера для записи -; cy=1 были ошибки. код ошибки в A -x1829 ld a,(xE590) - and %00100000 - jr nz,x1844 ;защита от записи - push hl ;адрес буфера для записи - call x1848 ;расчет номера сектора на винчестере - jr c,x1827 ;ошибка: адрес за пределами образа диска - call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - ex (sp),ix ;адрес буфера для записи - call x1D4A ;запись сектора из буфера ix на винчестер - pop ix - ret nc ;нет ошибок записи - ld a,#04 ;код ошибки: ошибка при чтении или записи сектора функциями 5 или 6 - ret -x1844 ld a,#02 ;код ошибки: попытка записи на защищенную дискету - scf - ret - -;АДРЕС: #1848 расчет номера сектора на винчестере -;вх: de - смещение от начала образа до нужного сектора в секторах (512b) -;вых: cy=1 ошибка: адрес за пределами образа диска -; =0 dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x1848 ld (xE9E7),de ;смещение до нужного сектора - ld de,xE9EB ;адрес числа - push de - ld hl,xE590+#01 ;смещение образа от начала HDD - call x1003 ;копирование из (hl) в (de) 4х байт - pop hl - ld de,xE9E7 - call x101D ;(hl)=(hl)+(de) сложение 4х байтного числа с двухбайтным - ld de,xE9E7 - ld hl,xE590+#05 ;смещение от начала HDD до последнего(служебного) сектора образа - push hl - call x1003 ;копирование из (hl) в (de) 4х байт - pop de - ld hl,xE9EB ;смещение в секторах (512b) от начала винчестера до нужного сектора - call x1035 ;сравнение двух чисел - jr z,x1873 ;(hl)=(de) - jp p,x187B ;(hl)>(de) ошибка -x1873 ld hl,xE9EB ;(hl)<(de) - call x100F ;загрузка числа в регистры из памяти - or a - ret -x187B ld a,#22 ;код ошибки: адрес за пределами образа диска - scf - ret - -;АДРЕС: #187F R8DOS #23(35) подключение раздела к драйверу HDD -;вх: 1-0,a - номер дисковода -; 2,a =0 -; 6,a =1 отключить подраздел от драйвера -; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек -; 3,a =1 подключение по имени, адрес имени в памяти в DE -; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела -;вых: cy=1 ошибка -; cy=0 ошибок не было -; 4,(hl) =1 -x187F call x18C0 ;вых: при 4,a=1 -> hl=xE5A5 - ;вых: при 4,a=0 -> hl=как при входе - ret c ;были ошибки - push af - ld c,#11 - set 4,(hl) ;!!!ОШИБКА!!! портится память - pop af - ret - -;АДРЕС: #188A установка кода, определяющий тип дисковода без образа по номеру в С -x188A xor a - ld (xE590),a ;реальный дисковод - ld e,#C0 - bit 1,c - jr z,x1895 ;это дисковод A/B - ld e,a -x1895 call x1A0E ;hl адрес кода, определяющий тип дисковода по номеру в С - ld (hl),e - ret - -;АДРЕС: #189A подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -;вх: de - адрес дескриптора дисковода -x189A bit 5,(iy+#1C) - jp nz,x1B00 ;ошибка #67. нет винчестера - ld hl,xE590 ;описатель текущего дисковода - push hl - push bc - ex de,hl - ld bc,#0015 - bit 5,(iy+#0B) - jr z,x18B6 ;функция вызывается из монитора -;вызов пользователем - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - jr x18B8 -;функция вызывается из монитора -x18B6 ldir -x18B8 pop bc - pop hl - ld a,(hl) - or a - ret nz ;выход без ошибок - jp x1983 ;ошибка #66. путь не найден - -;АДРЕС: #18C0 R8DOS #28(40) подключение раздела к драйверу HDD -;вх: 1-0,a - номер дисковода -; 2,a =0 -; 6,a =1 отключить подраздел от драйвера -; 5,a =1 подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) -; 7,a =1 автоподключение, т. е. подключить то, что задано в секторе автонастроек -; 3,a =1 подключение по имени, адрес имени в памяти в DE -; 4,a =1 вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела -;вых: cy=1 ошибка -x18C0 bit 7,(iy+#1B) - jp z,x1BFA ;ошибка #56 нет раздела MFS - push hl - push af - push hl - ld hl,x1A19 - ex (sp),hl ;адрес возврата - ld c,a - bit 6,c - jr nz,x188A ;отключить подраздел от драйвера - bit 5,c - jr nz,x189A ;подключить подраздел к драйверу (копирование дескриптора в рабочуюю область) - bit 7,c - jr nz,x1901 ;автоподключение, т. е. подключить то, что задано в секторе автонастроек - bit 3,c - ret z ;переход на x1A19 - -;подключение по имени, адрес имени в памяти в de - ld a,e - or d - jr z,x18FD ;;ошибка #45. неверный путь - push bc - ex de,hl - ld de,xE7C7 - ld bc,#0014 - bit 5,(iy+#0B) - jr z,x18F6 ;;функция вызывается из монитора - rst #30 - dw rom2_x0753 ;сохранение области памяти в ram 8 - db #02 - jr x18F8 -x18F6 ldir -x18F8 xor a - ld (de),a - pop bc - jr x190E ;анализ имени и подключение -;ошибка #45. неверный путь -x18FD ld a,#45 - scf - ret - -;автоподключение, т е. подключить то, что задано в секторе автонастроек -;вх: 1-0,c - номер дисковода -x1901 push bc - call x1E3D ;чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы - pop bc - ret c ;ошибка чтения - ld de,xE7C7 - call x1ACC ;формирование текстовой строки - пути к примонтированному подразделу/образу - ret c ;ошибка чтения -x190E ld hl,xE7C7+#01 - ld a,":" - cp (hl) - jr nz,x192C ;это подраздел -; это образ диска - dec hl - ld a,(hl) - and #5F - sub #41 - jr c,x18FD ;не буква диска. ошибка #45. неверный путь - cp #04 - jr nc,x18FD ;не буква диска. ошибка #45. неверный путь - ld b,a - ld a,c - and #F0 - or b - ld c,a ;новый дисковод - inc hl - inc hl - jr x192F ;hl начало имени подраздела -; это подраздел -x192C ld hl,xE7C7 -x192F ld a,(hl) - cp #5C ;"\" - jr nz,x1935 - inc hl -; формирование строки с именами для поиска в каталоге -x1935 ld de,xE7DB ;буфер для имени подраздела и образа - push bc - call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) - call x1A82 ;выделение из строки имени подраздела/образа (6 символов имя) - pop bc -; поиск имени подраздела в каталоге - ld de,xEBF5 ;буфер с каталогом -x1943 push bc - push de - rst #30 - dw rom5_x2620 ;формирование в буфере xEBF5 списка подразделов MFS/образов - db #05 - pop de - pop bc - ret c ;ошибка чтения - res 7,c ;7,=0 поиск имени -x194E push bc - ld bc,xEBF5 ;определение номера текущей записи - ld l,e - ld h,d - sbc hl,bc - ld b,#04 -x1958 srl h ;hl=hl/#10 - rr l - djnz x1958 ;l - номер записи в каталоге - pop bc - ld a,(xDD89) ;всего записей - cp l - jr z,x1983 ;конец каталога. ошибка #66. путь не найден - jr c,x1983 ;конец каталога. ошибка #66. путь не найден - ld hl,xE7DB ;тут имя подраздела и образа - call x1A6A ;проверка совпадения имени - jr nz,x19C1 ;не совпало -; имя совпало - ld a,(de) - and #DF - cp #01 - jr nz,x19D8 ;это не TR-DOS. формирование описателя текущего дисковода - ld a,(xE7DB+#06) - cp " " - jr nz,x1987 ;есть имя образа - ld a,(de) - or #10 - ld (de),a - jr x19D8 ;формирование описателя текущего дисковода -;ошибка #66. путь не найден -x1983 ld a,#66 - scf - ret -; поиск имени образа в каталоге -x1987 push de - push bc - ld bc,#0010 - ex de,hl - ld de,xE81B - ldir ;сохраним запись подраздела в буфере - rst #30 - dw rom5_x25EB ;формирование в буфере xEBF5 списка образов коллекции - db #05 - pop bc - pop de - ret c ;ошибка чтения - set 7,c ;в буфере каталог коолекции образов - push bc - push de - ld de,xEBF5 ;адрес каталога коллекции - ld c,#01 -x19A2 ld a,(xDD89) ;количество образов в каталоге - cp c - jr c,x19BF ;каталог закончился - ld a,(de) - and #01 - cp #01 - jr nz,x19B7 ;это не образ диска. следующая запись - ld hl,xE7DB+#06 ;имя образа - call x1A6A ;проверка совпадения имени - jr z,x19CF ;есть совпадение -x19B7 inc c - ld hl,#0010 - add hl,de - ex de,hl - jr x19A2 ;продолжим поиск -x19BF pop de ;конец каталога образов - pop bc -x19C1 ld a,e - add a,#10 - ld e,a - jr nc,x19C8 - inc d ;de=de+#10 -x19C8 bit 7,c - jr z,x194E ; - jp x1943 ;7,c =1 в буфере каталог коолекции образов, читать MBR не надо -;имя образа найдено -x19CF pop hl - pop bc - ld a,(de) - and #20 ;сохраним признак защиты от записи - or #01 - jr x19D9 -;формирование описателя текущего дисковода -x19D8 ld a,(de) -x19D9 ld (xE590),a ;код подраздела в описателе текущего дисковода - ex de,hl - ld de,xE590+#01 - inc hl - call x1003 ;копирование из (hl) в (de) 4х байт - ld de,xE590+#05 - call x1003 ;копирование из (hl) в (de) 4х байт - push de - ld de,#0005 - add hl,de - pop de - ex de,hl - push bc - rst #30 - dw rom5_x3052 ;сложение двух 4х байтных чисел - db #05 - ld hl,xE590+#05 - rst #30 - dw rom5_x302A ;декремент (hl)=(hl)-1 - db #05 - pop bc - ld a,(xE590) ;!!!ОШИБКА!!! перед сравнением надо сделать and #DF - cp #01 ;иначе диски с защитой от записи не будут видны - jr z,x1A07 ;это TR-DOS образ, без защиты от записи - or a - ret -x1A07 call x1A0E ;hl адрес кода, определяющий тип дисковода - ld (hl),#E0 ;%11100000 - or a - ret - -;АДРЕС: #1A0E расчет адреса кода, определяющие тип дисковода по номеру в С -x1A0E ld a,c - and #03 - ld c,a - ld b,#00 - ld hl,xFFCC - add hl,bc - ret - -;завершение процедуры x18C0 R8DOS #28(40) -;cy=1 была ошибка -x1A19 push af - jr nc,x1A20 ;нет ошибки - xor a - ld (xE590),a ;была ошибка. образ не подключен -x1A20 ld a,c - and #03 - ld (xFFCA),a ;текущий дисковод - bit 4,(iy+#1C) - call z,x1B54 ;1/0 TRDOS mirror on/off - call x1B04 ;расчет адреса блока описателя заданного дисковода -;сохранение описателя текущего дисковода в блоке xE9F5 - ld de,xE590 ;описатель текущего дисковода - ex de,hl - ld bc,#0009 - ldir - push hl - ld hl,xE7DB ;имена подраздела/образа - push hl - ld bc,#000C - push bc - ldir ;копирование имен подраздела/образа в описатель текущего дисковода - pop bc - pop hl - pop de - ldir ;копирование в блок описаний дисководов - call x1B18 ;установка признака подмонтированных дисков A/B в порту #7FBA - pop af - pop de - pop hl - ret c ;была ошибка -;вернуть в память (по HL) дескриптор текущего подключенного к драйверу раздела - bit 4,d - ret z - ld de,xE590 - ex de,hl - ld bc,#0015 - bit 5,(iy+#0B) - jr z,x1A66 ;функция вызывается из монитора - rst #30 - dw rom2_x0749 ;восстановление области памяти из ram 8 - db #02 - jr x1A68 -x1A66 ldir -x1A68 or a - ret - - -;АДРЕС: #1A6A проверка совпадения имени -;вх: de - адрес в каталоге -; hl - адрес имени для поиска -;вых: z - имя совпало -x1A6A push bc - push de - ld bc,#000A ;приращение в записи до имени - ex de,hl - add hl,bc - ld bc,#0600 -x1A74 ld a,(de) - cp (hl) - jr z,x1A79 - inc c -x1A79 inc hl - inc de - djnz x1A74 - ld a,c ;c=0 сть совпадение - or a - pop de - pop bc - ret - -;АДРЕС: #1A82 выделение из строки имени подраздела/образа (6 символов имя) -;вх: de - буфер приемник -; hl - адрес строки -x1A82 ld b,#06 -x1A84 ld a,(hl) - cp #5C ;"\" - jr z,x1A97 ;конец имени - or a - jr z,x1A98 ;конец строки - ld (de),a - inc hl - inc de - djnz x1A84 - ld a,(hl) - cp #5C ;"\" - ret nz ;не маркер конца имени - inc hl ;следующий символ - ret -x1A97 inc hl -x1A98 ld a," " - ld (de),a - inc de - djnz x1A98 - ret - -;АДРЕС: #1A9F копирование имени подраздела/образа по адресу в de -;вх: de - адрес буфера -; hl - адрес пути примонтированного подраздела/образа -; b - смещение в пути до имени -x1A9F ld a,l - add a,b - ld l,a - jr nc,x1AA5 - inc h -x1AA5 ld b,#06 -x1AA7 ld a,(hl) - cp #21 - ret c - ld (de),a - inc hl - inc de - djnz x1AA7 - ret - -;АДРЕС: #1AB1 определение адреса начала записи для заданного дисковода в буфере xE5A9 -;вх: a - номер дисковода для монтирования образа -;вых: hl - адрес буфера -; a - первый байт буфера со сброшенным битом защиты от записи -x1AB1 push de - and #03 - ld hl,x1AC8 - add a,l - ld l,a - jr nc,x1ABC - inc h -x1ABC ld l,(hl) - ld h,#00 - ld de,xE5A9 - add hl,de - ld a,(hl) - and #DF - pop de - ret -x1AC8 db #00,#16,#2C,#42 - -;АДРЕС: #1ACC формирование текстовой строки - пути к примонтированному -; подразделу/образу. вида X:part\disk,#00 либо part,#00 -;вх: de - адрес буфера для текcтовой строки -; 0-1,c - номер дисковода -x1ACC ld a,c - call x1AB1 ;hl адрес начала пути к примонтированному образу - ld (de),a ;a - первый байт пути со сброшенным битом защиты от записи - and #DF - jp z,x1B00 ;ошибка #67. к дисководу образ не примонтирован - cp #01 - jr z,x1AE1 ;это образ диска -;для подраздела - ld b,#0A - call x1A9F ;копирование имени подраздела по адресу в de - jr x1AFC -;для образа диска -x1AE1 ld a,c - and #03 - add a,#41 - ld (de),a ;буква дисковода - inc de - ld a,":" - ld (de),a - inc de - ld b,#0A - push hl - call x1A9F ;копирование имени подраздела по адресу в de - pop hl - ld a,#5C ;"\" - ld (de),a - inc de - ld b,#10 - call x1A9F ;копирование имени образа по адресу в de -x1AFC ex de,hl - xor a - ld (hl),a - ret -;ошибка #67. к дисководу образ не примонтирован -x1B00 ld a,#67 - scf - ret - -;АДРЕС: #1B04 расчет адреса блока описателя заданного дисковода -;вх: a - номер дисковода -;вых: hl - адрес блока описателя текущего дисковода -; a - первый байт описателя -; nz - это образ диска -x1B04 ld l,a - rlca - rlca - ld h,a - rlca - rlca - add a,h - add a,l ;a=a*#15 - ld hl,(xE9F3) - add a,l - ld l,a - jr nc,x1B14 - inc h -x1B14 ld a,(hl) ;hl адрес блока описателя заданного дисковода - and #DF - ret - -;АДРЕС: #1B18 установка признака подмонтированных дисков A/B в порту #7FBA -x1B18 ld a,(xFFCA) ;номер текущего дисковода - bit 1,a - ret nz ;это дисковод C/D - ld c,a - ld e,a - call x1A0E ;расчет адреса кода, определяющие тип дисковода по номеру в С - ld bc,#7FBA - bit 0,e - ld d,(iy-#26) - jr z,x1B37 ;дисковод A - set 6,d ;для дисковода B - bit 5,(hl) - jr z,x1B3F ;образ не подключен - res 6,d ;образ подключен - jr x1B3F -x1B37 set 7,d ;для дисковода A - bit 5,(hl) ;образ не подключен - jr z,x1B3F - res 7,d ;образ подключен -x1B3F ld (iy-#26),d - out (c),d - ret - -;АДРЕС: #1B45 определение необходимости копирования памяти пользователя -;вх: hl - адрес начала блока памяти -; bc - размер блока памяти -;вых: cy=1 блок памяти попадает на системные области -; =0 блок памяти в пределах [#4000..#BFFF] -x1B45 ld a,h - cp #40 - ret c - push hl - dec bc - add hl,bc ;адрес конца таблицы - inc bc - ld a,h - pop hl - ret c - cp #C0 - ccf - ret - -;АДРЕС: #1B54 сохранение описателя текущего дисковода в блоке xE9F5 (функция TR-DOS mirror) -x1B54 bit 5,(iy+#0B) - ret z ;функции вызываются из монитора - push af - ld hl,(xE9F3) ;адрес блока описателей дисковода - push hl - ld hl,xE9F5 - ld (xE9F3),hl ;начало блока - call x1B04 ;расчет адреса блока описателя заданного дисковода - ld de,xE590 ;описатель текущего дисковода - ex de,hl - ld bc,#0009 - ldir ;тип и адрес подраздела/образа в секторах - ld hl,xE7DB - ld bc,#000C ;имена подраздела/образа - ldir - pop hl - ld (xE9F3),hl - pop af - ret - -;АДРЕС: #1B7E R8DOS #24(36) прямое чтение секторов из подраздела жесткого диска -;вх: hl - адрес в памяти, куда считывать -; de - начальный номер сектора (считая с 1!) -; b - число секторов (размер сектора 512 байт!) -;вых: cy=1 - ошибки -x1B7E bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld a,(xE590) ;код типа примонтированного подраздела/образа - or a - jr z,x1BBC ;ошибка. образ не примонтирован - ld a,b - or a - ret z ;0 секторов. нечего читать -;читаем сектора -x1B8D push hl - push de - push bc - call x1B9D ;чтение одного сектора - pop bc - pop de - pop hl - ret c ;были ошибки - inc h - inc h - inc de - djnz x1B8D - ret -;чтение одного сектора -x1B9D ld bc,#0200 - call x1B45 ;определение необходимости копирования памяти пользователя - jp nc,x1813 ;чтение сектора с винчестера - push hl - ld hl,xEBF5 ;читаем в буфер в ram 8 - call x1813 ;чтение сектора с винчестера - pop hl - ret c ;ошибки - ld de,xEBF5 - ex de,hl - ld bc,#0200 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - xor a - ret -;ошибка #67. к дисководу образ не примонтирован -x1BBC scf - ld a,#67 - ret - -;АДРЕС: #1BC0 R8DOS #25(37) прямая запись секторов в подраздел жесткого диска -;вх: hl - адрес в памяти, откуда записывать -; de - начальный номер сектора (считая с 1!) -; b - число секторов (размер сектора 512 байт!) -;вых: cy=1 - ошибки - -x1BC0 bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld a,(xE590) ;код типа примонтированного подраздела/образа - or a - jr z,x1BBC ;ошибка. образ не примонтирован - ld a,b - or a - ret z ;0 секторов. нечего записывать -;записываем сектора -x1BCF push hl - push de - push bc - call x1BDF ;запись одного сектора - pop bc - pop de - pop hl - ret c ;были ошибки - inc h - inc h - inc de - djnz x1BCF - ret -;запись одного сектора -x1BDF ld bc,#0200 - call x1B45 ;определение необходимости копирования памяти пользователя - jp nc,x1829 ;запись сектора на винчестер - push de - ld de,xEBF5 ;буфер для записи - ld bc,#0200 - rst #30 - dw rom2_x0753 ;копируем область пользователя в буфер для записи - db #02 - pop de - ld hl,xEBF5 - jp x1829 ;запись сектора на винчестер - -;АДРЕС: #1BFA ошибка #56. нет раздела MFS -x1BFA ld a,#56 - scf - ret - -;АДРЕС: #1BFE R8DOS #26(38) Вернуть таблицу (каталог) подраздела -;вх: hl - адрес буфера для таблицы (1024) -;вых: cy=1 - ошибки -;вых: de - количество подразделов -; -x1BFE bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - push hl - call x1C21 ;чтение в буфер xEBF5 катлога раздела MFS - pop hl - ret c ;ошибка - push hl - ld de,xEBF5 ;буфер с каталогом - ex de,hl - ld bc,#0400 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - rst #30 - dw rom5_x271A ;подсчет количества подразделов в MFS - db #05 - ld de,(xDD89) ;количество подразделов - pop hl - xor a - ret -;чтение в буфер xEBF5 катлога раздела MFS -x1C21 res 6,(iy+#1C) - call x1768 ;поиск раздела MFS - ret c ;ошибка - call x17BB ;чтение в буфер xEBF5 двух первых секторов раздела MFS/подраздела - ret - -;АДРЕС: #1C2D R8DOS #27(39) чтение/запись сектора (???ОШИБКА???) -;вх: a =#90/#94 запись сектора -; =#50/#54 чтение сектора -; hl - адрес начала данных 512b -;вых: cy=1 - ошибки -; -x1C2D bit 7,(iy+#1B) - jr z,x1BFA ;ошибка. нет раздела MFS - ld c,a - and #FB ;%11111011 - cp #90 - jr z,x1C42 - cp #50 - jr z,x1C56 - ld a,#56 ;ошибка. нет раздела MFS - scf - ret -;запись сектора -x1C42 ld de,xE5A9 - ld bc,#0200 - rst #30 - dw rom2_x0753 ;копируем область пользователя в буфер для записи - db #02 - ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - jp x1D45 ;запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;чтение сектора -x1C56 push hl - ld de,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - ld hl,(xDD7B) ;регистр de' пользователя ???ОШИБКА??? - call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - pop hl - ret c ;ошибки - ld de,xE5A9 - ex de,hl - ld bc,#0200 - rst #30 - dw rom2_x0749 ;копируем в память пользователя - db #02 - xor a - ret - -;АДРЕС: #1C70 бесконечное чтение порта bc -x1C70 in a,(c) - jr x1C70 - -;АДРЕС: #1C74 бесконечная запись в порт bc -x1C74 out (c),a - jr x1C74 - -;АДРЕС: #1C78 загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства -;вх: hl - адрес откуда грузим в регистры 6 байт -x1C78 ld bc,#F8BE -x1C7B ld a,(hl) - inc hl - inc b - out (c),a - ld a,b - cp #FE - ret z - jr x1C7B - -;АДРЕС: #1C86 чтение 512b данных в буфер адресуемый hl -;вх: hl - адрес буфера для чтения данных -x1C86 push hl - ld c,#BE - ld de,#D8F8 - xor a -x1C8D ld b,e ;порт #F8BE регистр данных (младшая часть) - ini - ld b,d ;порт #D8BE регистр данных (старшая часть) - ini - dec a - jr nz,x1C8D - pop hl - ret - -;АДРЕС: #1C98 запись 512b данных из буфер адресуемого hl -;вх: hl - адрес буфера для записи данных - -x1C98 push hl - ld c,#BE - ld de,#D9F9 ;команда outd вначале делает dec b - xor a -x1C9F ld b,d ;порт #D8BE регистр данных (старшая часть) - inc hl - outd - ld b,e ;порт #F8BE регистр данных (младшая часть) - outi - inc hl - dec a - jr nz,x1C9F - pop hl - ret - -;АДРЕС: #1CAC посылаем команду винчестеру -;вх: a - команда винчестеру -;вых: cy=1 HDD не вышел в готовность -; =0 команда загружена в регистр -; d - регистр состояния -x1CAC ld e,a - ld c,#BE - call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - ld b,#FE - ld a,(xE049) ;тип адресации LBA/CHS и выбор винчестера master/slave - out (c),a - ld hl,xE044 - call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства - call x1CE5 ;ожидание готовности HDD к принятию команды - ret c ;ошибка: hdd не вышел в готовность - ld bc,#FFBE - out (c),e - ret - -;АДРЕС: #1CCA ожидание готовности HDD к передаче данных -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов к передаче данных -; d - регистр состояния -x1CCA call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - bit 3,d - ret nz ;винчестер готов к передаче данных -;ждем готовности к передаче данных - ld hl,#C350 -x1CD4 ld bc,#FFBE - in d,(c) - bit 3,d - ret nz ;винчестер готов к передаче данных - dec hl - ld a,h - or l - jr nz,x1CD4 - ld a,#62 - scf - ret - -;АДРЕС: #1CE5 ожидание готовности HDD к принятию команды -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов к принятию команды -; d - регистр состояния -x1CE5 call x1D04 ;ожидание готовности HDD - ret c ;ошибка: hdd не вышел в готовность - bit 6,d - ret nz ;выход. винчестер готов принять команду -;ждем готовности принять команду - ld hl,#14E6 - or a -x1CF0 ld bc,#FFBE - in d,(c) - bit 6,d - ret nz ;выход. винчестер готов принять команду - dec a - jr nz,x1CF0 - dec hl - ld a,h - or l - jr nz,x1CF0 - ld a,#61 - scf - ret - -;АДРЕС: #1D04 ожидание готовности HDD -;вх: c - младший байт порта -;вых: cy=1 HDD не вышел в готовность -; =0 HDD готов -; d - регистр состояния -x1D04 ld hl,#4FD3 ;количество попыток -x1D07 xor a - ld b,#FF -x1D0A in d,(c) ;читаем регистр состояния - bit 7,d - ret z ;HDD готов - dec a ;HDD занят - jr nz,x1D0A ;повторяем попытки - dec hl - ld a,h - or l - jr nz,x1D07 - ld a,#60 ;HDD не вышел в готовность - scf - ret - -;АДРЕС: #1D1B чтение сектора идентификации в буфер по адресу в ix -;вх: ix - адрес буфера для чтения сектора идентификации -x1D1B ld hl,xE04A - ld b,(hl) ;сохраним код команды винчестера: чтение сектора - push bc - ld (hl),#EC ;команда идентификации - push hl - call x1D78 ;чтение сектора идентификации в ix - pop hl - pop bc - ld (hl),b - ret - -;АДРЕС: #1D2A подсчет контрольной суммы и запись сектора из буфера xE5A9 на винчестер -x1D2A call x1E2A ;установка в переменных - сектора номер 3 для винчестера - ld hl,#4155 ;сигнатура сектора с примонтированными образами - ld (xE5A9+#1FE),hl - ld de,xE5A9 ;адрес начала памяти - ld bc,#01FC ;размер области памяти - call x21E5 ;подсчет контрольной суммы области памяти CRC16 - ld (xE5A9+#1FC),hl ;контрольная сумма - ld (iy+#31),#01 ;количество секторов - jr x1D4F ;запись сектора из буфера xE5A9 на винчестер - -;АДРЕС: #1D45 запись сектора из буфера xE5A9 на винчестер по адресу в dehl -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: cy=1 ошибки -x1D45 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - jr x1D4F ;запись сектора из буфера xE5A9 на винчестер - -;АДРЕС: #1D4A запись сектора из буфера ix на винчестер -;вх: ix - адрес буфера для записи сектора -x1D4A push ix - pop hl - jr x1D52 - -;АДРЕС: #1D4F запись сектора из буфера xE5A9 на винчестер -x1D4F ld hl,xE5A9 -x1D52 ld b,(iy+#39) ;количество дополнительных попыток записи сектора -x1D55 push bc - ld a,(xE04B) ;код команды винчестера - call x1D60 ;запись сектора на винчестер - pop bc - ret nc ;нет ошибок - djnz x1D55 ;еще раз попытаемся записать -;запись сектора на винчестер -;вх: a - команда винчестеру -; hl - адрес буфера для записи данных -;вых: cy=1 были ошибки -; hl - не изменяется -x1D60 push hl - call x1CAC ;посылаем команду винчестеру - pop hl - jr c,x1DB3 ;ошибка - push hl - call x1CCA ;ожидание готовности HDD к передаче данных - pop hl - jr c,x1DB3 ;ошибка - call x1C98 ;запись 512b данных из буфер адресуемого hl - jr x1D9F ;проверка на ошибки и выход - -;АДРЕС: #1D73 чтение сектора с винчестера в буфер xE5A9 -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -x1D73 call x1DDF ;расчет и установка в переменных адреса LBA/CHS в зависимости от настроек - jr x1D7D - -;АДРЕС: #1D78 чтение сектора с винчестера в буфер ix -;вх: ix - адрес буфера для чтения сектора -x1D78 push ix - pop hl - jr x1D80 - -;АДРЕС: #1D7D чтение сектора с винчестера в буфер xE5A9 -x1D7D ld hl,xE5A9 -x1D80 ld b,(iy+#39) ;количество дополнительных попыток чтения сектора -x1D83 push bc - ld a,(xE04A) ;код команды винчестера - call x1D8E ;чтение сектора с винчестера - pop bc - ret nc - djnz x1D83 -;чтение сектора с винчестера -;вх: a - команда винчестеру -;вх: hl - адрес буфера для чтения данных -;вых: cy=1 были ошибки -; hl - не изменяется -x1D8E push hl - call x1CAC ;посылаем команду винчестеру - pop hl - jr c,x1DB3 ;ошибка - push hl - call x1CCA ;ожидание готовности HDD к передаче данных - pop hl - jr c,x1DB3 ;ошибка - call x1C86 ;чтение 512b данных в буфер адресуемый hl -;проверка на ошибки и выход -x1D9F ld bc,#FFBE - in a,(c) - ld d,a ;регистр состояния - and %01110001 - xor %01010000 - ret z ;выход при готовности винчестера и отсутствии ошибок - ld b,#F9 ;#F9BE - in a,(c) ;читаем код ошибки - ld (xFFDD),a ;сохраняем - ld a,#57 ;код ошибки драйвера -x1DB3 call x1DB8 ;програмный сброс винчестера - scf - ret -;програмный сброс винчестера -x1DB8 push af - push bc - ld bc,#FFBA - ld a,(xDFF0) - push af - or #80 - out (c),a ;активация регистра Device Control - push bc - ld bc,#FEBE - ld a,%00001100 - out (c),a ;програмный сброс винчестера - call x201C ;пауза 293t - xor a - out (c),a ;завершаем програмный сброс винчестера - pop bc - pop af - and #7F - out (c),a ;активация регистра головки - ld (xDFF0),a - pop bc - pop af - ret - -;АДРЕС: #1DDF расчет и установка в переменных адреса LBA/CHS в зависимости от настроек -;вх: dehl - смещение в секторах (512b) от начала винчестера до нужного сектора -;вых: (xE046) параметры LBA/CHS в зависимости от настроек -x1DDF exx - ld hl,xE030 - bit 4,(iy+#35) - jr z,x1DEA ;master HDD - inc hl ;slave HDD -x1DEA bit 2,(hl) - jr nz,x1E10 ;LBA on -;LBA off. преобразование адреса LBA в C/H/S - ld bc,(xE5A5) ;head*sector (секторов на цилиндре) - call x0F5D ;деление de'hl'=de'hl'/bc - exx - ld (xE047),hl ;номер цилиндра - ld c,(iy-#1F) ;значение sector HDD - ld b,#00 - call x0F5D ;деление de'hl'=de'hl'/bc - inc l - ld (iy+#32),l - exx - ld a,(iy+#35) - and #B0 ;%10110000 - or l - ld (iy+#35),a ;головка - ret -;LBA on -x1E10 exx - ld (iy+#32),l - ld (iy+#33),h - ld (iy+#34),e - ld a,d - and #0F - ld d,a ;старший полубайт - ld a,(iy+#35) - and #B0 ;%10110000 - or d - or #40 - ld (iy+#35),a - ret - -;АДРЕС: #1E2A установка в переменных сектора номер 3 для винчестера -x1E2A ld hl,#0000 - ld (xE047),hl - ld (iy+#32),#03 - ld a,(iy+#35) - and #F0 - ld (iy+#35),a - ret - -;АДРЕС: #1E3D чтение сектора 3(сектор настроек) в буфер xE5A9 и проверка контрольной суммы -;вых: cy=1 были ошибки -x1E3D call x1E2A ;установка в переменных сектора номер 3 для инчестера - ld (iy+#31),#01 ;кол-во секторов =1 - call x1D7D ;чтение сектора с винчестера в буфер xE5A9 - ret c ;ошибка - ld hl,(xE5A9+#1FE) - ld de,#4155 ;сигнатура - sbc hl,de - ld a,#63 - scf - ret nz ;сигнатура отсутствует - ld de,xE5A9 ;начало области памяти - push de - ld bc,#01FC ;размер области памяти - call x21E5 ;подсчет контрольной суммы области памяти CRC16 - ld bc,(xE5A9+#1FC) - xor a - sbc hl,bc - pop hl - ret z ;контрольная сумма совпала - ld b,a ;контрольная сумма не совпадает -x1E68 ld (hl),a ;очищаем буфер - inc hl - djnz x1E68 -x1E6C ld (hl),a - inc hl - djnz x1E6C - ld a,#63 - scf - ret - -;АДРЕС: #1E74 R8DOS #22(34) идентификация жесткого диска -;вх: ix - адрес буфера для загрузки сектора идентификации -; 0,e =1 принудительно инициализировать переменные геометрии винчестра -;вых: cy=1 ошибки -x1E74 xor a - ld (xFFDD),a ;код ошибки дискового интерпретатора - ld bc,#FFBA - ld hl,xDFF0 - ld a,(hl) - or #81 - ld (hl),a - out (c),a ;device control/alt status - push bc - ld bc,#FEBE - xor a - out (c),a ;сброс - pop bc - ld a,(hl) - and #7F - or #01 - ld (hl),a - out (c),a ;вернем регистр команд - djnz $ ;задержка - ld bc,#FFBE - in a,(c) ;регистр состояния - xor #FF - jr z,x1ECC ;прочитано #FF. нет винчестера - set 7,(iy+#1A) ;признак наличия HDD - bit 0,e - jr nz,x1EAD - bit 1,(iy+#1C) ;автоопределение HDD при старте включено - jr nz,x1EFA ;читать сектор идентификации не надо -;чтение сектора идентификации и установка переменных геометрии винчестера -x1EAD ld hl,#4FD3 - call x1D07 ;ожидание готовности HDD - ld b,#FC ;bc=#FCBE регистр цилиндра - xor a -x1EB6 out (c),a - nop - in d,(c) - cp d - jr nz,x1ECC ;значения не совпадают. винчестера нет - dec a - jr nz,x1EB6 ;повторим 256 раз - ld hl,xE044 ;адрес переменной откуда грузим - call x1C78 ;загрузка в регистры кол-ва секторов, адреса LBA/CHS, типа устройства - call x1D04 ;ожидание готовности HDD - jr nc,x1ED4 ;в готовность вышел -;винчестер не найден -x1ECC res 7,(iy+#1A) - ld a,#56 - scf - ret -x1ED4 call x1D1B ;чтение сектора идентификации в буфер по адресу в ix - ld a,#57 - ret c ;ошибка #57. не прочитался сектор идентификации - push ix - pop hl - xor a - or (hl) - inc hl - or (hl) - inc hl - jr z,x1F04 ;ошибка в секторе идентификации - ld c,(hl) - inc hl - ld b,(hl) - inc hl - ld (xDFF2),bc ;количество цилиндров - inc hl - inc hl - ld a,(hl) - ld (iy-#20),a ;количество головок - ld de,#0006 - add hl,de - ld a,(hl) - ld (iy-#1F),a ;количество секторов -x1EFA call x1F2D ;расчет произыедения головок и секторов - call x1F08 ;проверка геометрии винчестера - jr z,x1F04 ;проверка геометрии винчестера не пройдена - or a - ret -;ошибка #58. ошибка в секторе идентификации -x1F04 ld a,#58 - scf - ret - -;АДРЕС: #1F08 проверка геометрии винчестера -x1F08 res 7,(iy+#1B) - ld a,(xDFF2) ;ицлиндров (младший байт) - or (iy-#21) - ret z ;ноль цилинлров - xor a - or (iy-#20) - ret z ;ноль головок - xor a - or (iy-#1F) - ret z ;ноль секторов - ld hl,(xE5A5) - ld a,l - or h - ret z ;нулевое произведение головок и секторов - bit 7,(iy+#1A) - ret z ;винчест не найден - set 7,(iy+#1B) - ret - -;АДРЕС: #1F2D расчет произведения головок и секторов -x1F2D xor a - ld c,(iy-#20) ;головок - ld b,a - exx - ld l,(iy-#1F) ;секторов - ld h,a - ld e,a - ld d,a - exx - call x0FB7 ;умножение dehl=de'hl' * bc - ld (xE5A5),hl ;произведение head * sectors - ret - -;АДРЕС: #1F41 ошибка HDD. вывод сообщения об ошибке в нижней строке монитора -;вх: a - код ошибки, если =#00 -> d - параметр ошибки чтения/записи -x1F41 bit 5,(iy+#0B) - jr z,x1F49 ;функции вызываются из монитора - scf - ret -x1F49 push af - ld a,(xFFDD) - ld (xDDA7),a ;сохраним код ошибки дискового интерпретатора - ld a,d - ld (xDDA7+#01),a ; - pop af - rst #30 - dw rom2_x3870 ;печать сообщения и продолжение работы текущего меню монитора - db #02 - -;АДРЕС: #1F59 чтение ячейки CMOS -;вх: b - адрес в CMOS -;вых: a - значение -; -x1F59 push bc - push bc -x1F5B ld bc,#FFBA - ld a,(xDFF0) - and #7F ;7,=0 регистр адреса CMOS - ld (xDFF0),a - call x2010 ;запись в порт - pop af - ld b,#DF - call x2010 ;запись в порт - ld b,#DF - call x2016 ;чтение порта - pop bc - ret - -;АДРЕС: #1F76 чтение из CMOS времени и даты, в случае готовности CMOS -; -x1F76 ld hl,xDFF6 - ld b,#0C - call x1F59 ;читаем регистр C cmos - bit 4,a - ret z ;еще не обновился - call x1F8B ;bit 7 регистра A cmos - ret nz ;cmos обновляется - set 0,(iy+#1A) - jr x1F98 ;;читаем секунды/минуты/часы - - -;АДРЕС: #1F8B проверка готовности CMOS -;вых: nz - cmos обновляется -; -x1F8B ld b,#0A - call x1F59 ;читаем регистр A cmos - bit 7,a - ret - -;АДРЕС: #1F93 чтение из CMOS времени и даты -;вх: hl - адрес куда читать (6 байт) -; -x1F93 call x1F8B ;проверка готовности cmos - jr nz,x1F93 ;cmos обновляется, ждём -;читаем секунды/минуты/часы -x1F98 ld bc,#0003 -x1F9B call x1F59 - ld (hl),a - inc hl - inc b - inc b - dec c - jr nz,x1F9B -;читаем число/месяц/год - inc b - ld c,#03 -x1FA8 call x1F59 - ld (hl),a - inc hl - inc b - dec c - jr nz,x1FA8 - ret - -;АДРЕС: #1FB2 запись в CMOS времени и даты -;вх: hl - адрес откуда писать (6 байт) -; -x1FB2 ld b,#0B ;регистр B - ld a,#9E ;%10011110 - call x1FDD ;запрет обновления cmos - ld bc,#0003 -x1FBC ld a,(hl) ;запись секунд/минут/часов - inc hl - call x1FDD - inc b - call x1FDD - inc b - dec c - jr nz,x1FBC - inc b - ld c,#03 -x1FCC ld a,(hl) ;запись число/месяц/год - inc hl - call x1FDD - inc b - dec c - jr nz,x1FCC - ld a,%00101010 ;регистр A cmos - call x1FDD - inc b - ld a,%01011110 ;разрешенеи обновления cmos - -;АДРЕС: #1FDD запись данных в ячейку CMOS -;вх: b - адрес в CMOS -; a - новое значение ячейки -; -x1FDD push bc - push af - push bc - ld bc,#FFBA - ld a,(xDFF0) - and #7F - call x2010 ;запись в порт - pop af - ld b,#DF - call x2010 ;выбираем адрес - ld b,#FF ;режим записи данных - ld a,(xDFF0) - or #80 - call x2010 ;запись в порт - pop af ;запись данных в ячейку - ld b,#DF - call x2010 ;запись в порт - ld b,#FF - ld a,(xDFF0) - and #7F - ld (xDFF0),a - call x2010 ;режим чтения cmos - pop bc - ret - -;АДРЕС: #2010 запись в порт -;вх: bc - адрес порта -; a - значение -; -x2010 call x201C ;пауза 293t - out (c),a - ret - -;АДРЕС: #2016 чтение порта -;вх: bc - адрес порта -;вых: a - значение -; -x2016 call x201C ;пауза 293t - in a,(c) - ret - -;АДРЕС: #201C пауза 293t -; -x201C push bc - ld b,#14 - djnz $ - pop bc - ret - -;АДРЕС: #2023 запись данных в ячейку CMOS. и запись контрольной суммы в ячейку #3F -;вх: a - значение ячейки -; b - номер ячейкм -x2023 call x1FDD ;запись данных в ячейку CMOS - push bc - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - call x1FDD ;запись контрольной суммы - pop bc - ret - -;АДРЕС: #2030 подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) -;вых: e - контрольная сумма -; b=#3F -x2030 push de - ld de,#FFFF - ld b,#10 -x2036 call x1F59 ;чтение ячейки CMOS - call x220F ;суммирование байта с контрольной суммой CMOS CRC8 - inc b - ld a,#3F - cp b - jr nz,x2036 - ld a,e - add a,d - pop de - ld e,a - ret - -;АДРЕС: #2047 определение наличия CMOS -;вых: cy=1 были ошибки -; a=#5A - checksum error -; a - номер сообщения для вывода -x2047 ld b,#3F ;номер ячейки - call x1F59 ;чтение ячейки CMOS - ld d,a - ld a,#55 - call x1FDD ;запись данных в ячейку CMOS - call x1F59 ;чтение ячейки CMOS - cp #55 - jr nz,x2065 ;CMOS отсутствует - ld a,#AA - call x1FDD ;запись данных в ячейку CMOS - call x1F59 ;чтение ячейки CMOS - cp #AA - jr z,x2069 ;CMOS найден -x2065 ld a,#5B ;сообщение: CMOS not found - scf - ret -;CMOS найден. определяем размер CMOS -x2069 ld b,#7F - call x1F59 ;чтение ячейки CMOS - ld e,a - ld a,#55 - call x1FDD ;запись данных в ячейку CMOS - ld b,#3F - call x1F59 ;чтение ячейки CMOS - cp #AA - jr nz,x2087 ;64 байт - ld b,#7F - ld a,e - call x1FDD ;запись данных в ячейку CMOS - set 6,(iy+#1B) ;CMOS 128 байт -x2087 ld b,#3F - ld a,d - call x1FDD ;запись данных в ячейку CMOS - set 6,(iy+#1A) ;CMOS обнаружен -;подсчет контрольной суммы CMOS [#10..#3E] (#3F - контрольная сумма) - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - cp d - jr z,x20C2 ;контрольная сумма совпала -; контрольная сумма не совпала. перезапись CMOS -x2098 ld hl,#0705 ;день и месяц: 5 июля - ld (xDFF9),hl - ld (iy-#19),#61 ;год: 1997 - ld (iy-#1C),#0C ;час: 12 - ld hl,xDFF6 - call x1FB2 ;запись в CMOS времени и даты - rst #30 - dw rom4_x0398 ;запись переменных в CMOS - db #04 - ld b,#0E - ld a,#61 ;признак записи в CMOS переменных - call x1FDD ;запись данных в ячейку CMOS - call x2030 ;подсчет контрольной суммы CRC8 CMOS [#10..#3E] (#3F - контрольная сумма) - ld a,e - call x1FDD ;запись данных в ячейку CMOS - ld a,#5A ;сообщение: CMOS checksum error - scf - ret -; контрольная сумма совпала -x20C2 ld b,#0D ;регистр #D - call x1F59 ;чтение ячейки CMOS - bit 7,a - jr z,x2098 ;пропадало питание. перезапись CMOS - inc b - call x1F59 ;чтение ячейки CMOS - cp #61 - jr nz,x2098 ;переменные не были сохранены. перезапись CMOS - ld hl,xDFF6 - call x1F93 ;чтение из CMOS времени и даты - ld hl,#0040 - bit 6,(iy+#1B) - jr z,x20E5 ;CMOS 64 байта - ld hl,#0080 -x20E5 ld (xDDA7),hl ;для печати размера CMOS - xor a - ld a,#5C ;сообщение: _число_ bytes CMOS found - ret - -;АДРЕС: #20EC работа с контроллером прерываний ???? -x20EC di - ld a,#0F - scf - ret - -;АДРЕС: #20F1 тестирование HDD (2. test) (тест на чтение/запись) -x20F1 ld hl,xEBF5+#200 ;заполним буфер значениями - xor a - ld b,a -x20F6 ld (hl),a - inc a - inc hl - djnz x20F6 -x20FB ld (hl),a - inc a - inc hl - djnz x20FB - ld hl,x217B ;адрес п/п тестирования сектора на чтение/запись - jr x2108 - -;АДРЕС: #2105 тестирование HDD (1. test) (тест только на чтение) -x2105 ld hl,x2172 ;адрес п/п тестирования сектора на чтение -x2108 ld (xE338),hl - ld (iy+#01),#00 - rst #30 - dw rom5_x30C6 ;печать окна для тестирования HDD - db #05 - ld hl,(xDFF2) ;значение Cylinders HDD - ld de,#0000 - exx - ld bc,(xE5A5) ;head * sector активного HDD - call x0FB7 ;умножение dehl=de'hl' * bc (кол-во секторов на HDD) - push de - push hl - xor a - ld l,a - ld h,a - ld e,a - ld d,a - push de - push hl -x212A ld hl,#0000 - add hl,sp - ex de,hl ;de адрес стэка - ld hl,#0004 - add hl,sp - call x1035 ;сравнение двух чисел в памяти по адресам в de и hl - jp p,x214C ;еще не конец винчестера - call x2169 ;печать текущего номера цилиндра - pop hl - pop hl - pop hl - pop hl - rst #30 - dw rom2_x3807 ;пауза 40416t - db #02 - rst #30 - dw rom6_x074A ;ожидание действий пользователя (опрос управления, вывод часов) - db #06 - rst #30 - dw rom5_x0EB5 ;печать текущего меню монитора (без возврата) - db #05 -x214C pop hl - pop de - push de - push hl - ld bc,x215A ;адрес п/п перехода к следующему сектору - push bc - ld bc,(xE338) ;адрес п/п тестирования сектора - push bc - ret -;переход к следующему сектору -x215A pop hl - pop de - ld a,l - and #3F - call z,x2169 ;печать текущего номера цилиндра - call x0FF3 ;инкремент dehl - push de - push hl - jr x212A -;печать текущего номера цилиндра -x2169 push de - push hl - rst #30 - dw rom5_x3163 ;печать текущего номера цилиндра - db #05 - pop hl - pop de - ret -;тестирование одного сектора на чтение -x2172 call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - ret nc ;нет ошибок -x2176 rst #30 - dw rom5_x30F3 ;печать кода ошибки винчестера - db #05 - ret -;тестирование одного сектора на чтение/запись -x217B call x1D73 ;чтение сектора с винчестера в буфер xE5A9 - jr c,x2176 ;ошибка чтения. печать кода ошибки винчестера - ld hl,xE5A9 ;сохраним прочитанный сектор - ld de,xEBF5 - ld bc,#0200 - ldir - push ix - ld ix,xEBF5+#200 - call x1D4A ;запись сектора из буфера ix на винчестер - jr c,x21C6 ;ошибка записи - ld ix,xE5A9 - call x1D78 ;чтение сектора с винчестера в буфер ix - jr c,x21C6 ;ошибка чтения - call x21BF ;запись изначальных данных сектора - pop ix - jr c,x2176 ;ошибка записи. печать кода ошибки винчестера - ld hl,xE5A9 - ld bc,#0000 -x21AC ld a,c - cp (hl) - call nz,x21CF ; - inc c - inc hl - djnz x21AC -x21B5 ld a,c - cp (hl) - call nz,x21CF ; - inc c - inc hl - djnz x21B5 - ret -;запись сектора из буфера xEBF5 на винчестер -x21BF ld ix,xEBF5 - jp x1D4A ;запись сектора из буфера ix на винчестер -;ошибка чтения/записи -x21C6 push af - call x21BF ;запись сектора из буфера xEBF5 на винчестер - pop af - pop ix - jr x2176 ;печать кода ошибки винчестера - -x21CF pop de - pop ix - push ix - push de - push hl - push bc - ld b,(hl) - ld de,xE5A9 - or a - sbc hl,de - rst #30 - dw rom5_x3135 ;печать сообщения об ошибке несовпадения данных при чтении/записи на HDD - db #05 - pop bc - pop hl - ret - -;АДРЕС: #21E5 подсчет контрольной суммы области памяти CRC16 -;вх: bc - размер области памяти -; de - адрес начала памяти -;вых: hl - контрольная сумма -x21E5 ld hl,#FFFF - ld a,c - or b - ret z - push ix - push de - pop ix - ex de,hl -x21F1 ld hl,x2222 - ld a,(ix+0) - inc ix - xor e - add a,l - ld l,a - jr nc,x21FF - inc h -x21FF ld a,d - xor (hl) - ld e,a - inc hl - xor a - xor (hl) - ld d,a - dec bc - ld a,c - or b - jr nz,x21F1 - pop ix - ex de,hl - ret - -;АДРЕС: #220F суммирование байта с контрольной суммой CMOS CRC8 -;вх: a - значение -; de - контрольная сумма -;вых: de - контрольная сумма (новое значение) -x220F push hl - ld hl,x2222 - xor e - add a,l - ld l,a - jr nc,x2219 - inc h -x2219 ld a,d - xor (hl) - ld e,a - inc hl - xor a - xor (hl) - ld d,a - pop hl - ret - -;АДРЕС: #2222 данные для подсчета контрольной суммы -;АДРЕС: #2223 данные для подсчета контрольной суммы -x2222 INCBIN "prof_roms/rom7_data4CRC.bin" - -;АДРЕС: #2422 определение наличия SMUC -;вых: cy=1 SMUC не найден -; =0 SMUC обнаружен -; d - номер версии -; e - номер ревизии -x2422 ld de,#FFFF - call x0D51 ;определение наличия SMUC - jr c,x2441 ;не найден - ld bc,#5FBA - in a,(c) - inc a - jr z,x2441 ;версии нет. не найден - dec a - call x2443 ;преобразование версии/ревизии в число - ld d,a - ld bc,#5FBE - in a,(c) - call x2443 ;преобразование версии/ревизии в число - ld e,a - ret -x2441 scf - ret -;преобразование версии/ревизии в число -x2443 ld b,a - rrca - rrca - rrca - and #01 - ld c,a - ld a,b - rlca - rlca - rlca - or c - and #07 - ret - -;неиспользуемая область -x2452 ds #AE,0 ;not used - -;АДРЕС: #2500 ROM-disk -x2500 INCBIN "prof_roms/rom7_ROMdisk.bin" - - SAVEBIN "../Build/scorp/NewROM7.bin",#0000,#4000 - diff --git a/ProfRom_Disasm/rom7.bat b/ProfRom_Disasm/rom7.bat deleted file mode 100755 index bb8713f..0000000 --- a/ProfRom_Disasm/rom7.bat +++ /dev/null @@ -1,4 +0,0 @@ -MkDir !bin -MkDir !log -DEL /Q !log\*.* -..\sjasmplus\sjasmplus.exe --lst=!log\log.txt !rom7.a80 >> !log\error.txt diff --git a/SP_128.ASM b/SP_128.ASM index 0480f7b..2fb3e18 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -10558,7 +10558,7 @@ L27EB: M_COM: BYTE 6,0 WORD TRDOS BYTE 1 - WORD HARDWARE ;ISDOS + WORD HARDWARE BYTE 2 WORD L286C BYTE 3 diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 670fff2..7a33370 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,11 +1,12 @@ INIT_RMD: - LD C,BIOS.FullInit + LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET + CALL EXP_FNS + ; [ ] 23/02/2024 грохаем перехват ресета + LD A,ACEX.RET_PORT + LD BC,BIOS.SET_PORTS + JP EXP_FNS ; diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index c89774e..356e45d 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -503,65 +503,102 @@ READ_WRITE_RAMD: DEC B RET Z ; - PUSH HL PUSH BC + PUSH HL + ; сохраняем кол-во секторов для чтения + LD C,B + ; накручиваем счётчик r/w секторов + LD HL,(ZX_VARS.CONT_SEC) + LD D,H + LD E,L + ;!TODO переделать эту тупость на математику + LD A,16 +.loop: INC L + CP L + JR NZ,.skip + INC H + LD L,0 +.skip: DJNZ .loop + ; + ; сохраняем накрученный счётчик + LD (ZX_VARS.CONT_SEC),HL + ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ + LD A,D + RRCA + RRCA + RRCA + RRCA + LD D,A + AND #F0 + OR E + LD E,A + LD A,D + AND #0F + LD D,A + ; восстанавливаем кол-во секторов для чтения + LD B,C ;Get RAM Block ID LD A,(ZX_VARS.OPER_DISK) AND 3 - LD C,BIOS.GET_DRV_ST + LD C,BIOS.GET_DRV_ST ; не убивает DE и B CALL EXP_FNS JP C,.ERROR SUB 4 - LD C,BIOS.GET_RAMD_ST + LD C,BIOS.GET_RAMD_ST ; не убивает DE и B CALL EXP_FNS JP C,.ERROR - ; A = RAM Block ID + ; A = RAM Block ID EX AF,AF' ; - POP BC - LD C,B - ; !TEST накручиваем счётчик r/w секторов - LD HL,(ZX_VARS.CONT_SEC) - LD A,16 - INC C -.loop: DEC C - JR Z,.next - INC L - CP L - JR NZ,.loop - INC H - LD L,0 - JR .loop -.next: ; - ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ - LD DE,(ZX_VARS.CONT_SEC) - LD A,D - RRCA - RRCA - RRCA - RRCA - LD D,A - AND #F0 - OR E - LD E,A - LD A,D - AND #0F - LD D,A - ; - EX (SP),HL + ;POP DE + ; POP BC + ; PUSH BC +; ; !TEST накручиваем счётчик r/w секторов +; LD HL,(ZX_VARS.CONT_SEC) +; LD D,H +; LD E,L +; ;!TODO переделать эту тупость на математику +; LD A,16 +; .loop: INC L +; CP L +; JR NZ,.skip +; INC H +; LD L,0 +; .skip: DJNZ .loop +; ; сохраняем накрученный счётчик +; LD (ZX_VARS.CONT_SEC),HL +; ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ +; LD A,D +; RRCA +; RRCA +; RRCA +; RRCA +; LD D,A +; AND #F0 +; OR E +; LD E,A +; LD A,D +; AND #0F +; LD D,A +; ; + ; POP BC + ; PUSH BC + + + POP HL ; Get command r/w LD A,(ZX_VARS.RD_WR_COM) EX AF,AF' LD C,BIOS.BLK_RD_WR CALL EXP_FNS - POP HL + ; HL = адрес буфера для следующего сектора + POP BC JP C,AUTO_3EE7 - ; сохраняем накрученный счётчик - LD (ZX_VARS.CONT_SEC),HL + LD B,0 RET -.ERROR: POP BC - POP HL +.ERROR: POP HL + POP BC JP AUTO_3EE7 ;Disk error ; ╔════════════════════════════════════════════════╗ ; ║ RD/WR SECTOR ║\ From afd499ef9fb6946580fc9224bfc51a36fd0feb33 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 24 Feb 2024 04:11:26 +1000 Subject: [PATCH 082/114] --- --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 215d0f3..5a5dcf0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 215d0f3c90865dd2c4c0d92d17e64513a0b0407e +Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 From 4678bc17a54e62ecc71ccf6fa3427a9c7df06b85 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 05:13:08 +1000 Subject: [PATCH 083/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 5a5dcf0..68681fb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 5a5dcf0bd035d2adaaa27d28bb8ed1bd86260d59 +Subproject commit 68681fbc50da463f1debae860e6db64603886d39 From 49f2c6fe411a85390af1d5b947bdb9cb1bf273eb Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sun, 31 Mar 2024 05:14:37 +1000 Subject: [PATCH 084/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 68681fb..18c132c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68681fbc50da463f1debae860e6db64603886d39 +Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 From ff12bd3620e1f00feb80f81f4259c0d5fd85241e Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Wed, 19 Jun 2024 01:02:42 +1000 Subject: [PATCH 085/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 18c132c..399bf41 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 18c132c6e9b507cb92d2144f5497278f021a0292 +Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 From 405726d9ae56fea83c9d5a8036d4e66053676c86 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:10:34 +1000 Subject: [PATCH 086/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 399bf41..d294e37 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 399bf41c5cbd12d2866204ee3ff1cc357a3d3a99 +Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 From 3433dc0c4f6ca70c9a4a4a81cb580a411a4d55f2 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:32:43 +1000 Subject: [PATCH 087/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index d294e37..bfc070c 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit d294e375826854d80b838ea40ca4afcf3730a141 +Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 From 96eb67e591de8183ceae1b9d421c249dc9e4703f Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 6 Jul 2024 04:33:20 +1000 Subject: [PATCH 088/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index bfc070c..990f10e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit bfc070c1eeb661e952fe887862754b940b43aff5 +Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f From 09d50ef6e6a94c857435367c98abe402a5967d47 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 8 Jul 2024 00:46:47 +1000 Subject: [PATCH 089/114] trdos: skip LFN and #E5 records in /cat. An error is thrown in the "/HDD xx" command when selecting an unsupported partition --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 4 +-- TRDOS/TR_MSD_2.ASZ | 67 +++++++++++++++++++++++++++++----------------- TRDOS/TR_MSD_3.ASZ | 2 +- TRDOS/TR_MSD_S.ASZ | 12 ++++----- 5 files changed, 52 insertions(+), 35 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 990f10e..04aaef8 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 990f10e80278825f071f5795a5ba459dec0f991f +Subproject commit 04aaef8ac955971d913babd95921a62937b597ae diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index d601814..2e0beec 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -13,10 +13,10 @@ CHOOSE_HDD: ; .loop: LD A,(DE) INC DE - CP ' ' + CP " " JR Z,.loop LD A,(DE) - CP #0D + CP "\r" JR Z,.error .cont: ; номер раздела ;INC DE diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 6800937..1ed49f1 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -33,24 +33,37 @@ MSDOS_TEST_FL: LD A,SYS_PAGE OUT (SLOT3),A LD A,E + ; [x] 07/07/2024 пропуск LFN + PUSH HL + LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT + ADD HL,DE + LD D,(HL) + POP HL + ; LD E,(HL) OUT (SLOT3),A EI - LD A,E + ; [x] 07/07/2024 пропуск LFN + LD A,D + CP #0F ; FAT_ATTR.LFS_Entry + JR NZ,.nxt + POP DE + JR MSDOS_NEXT_FL + ; +.nxt: LD A,E POP DE AND A SCF RET Z ; КОНЕЦ КАТАЛОГА CP #E5 - SCF - CCF -; DEC A ; СТЕРТЫЙ ФАЙЛ -; AND A + JR Z,MSDOS_NEXT_FL + AND A RET -;********************************** + +;********************** MSDOS_NEXT_FL: PUSH DE - LD DE," " + LD DE,32 ; FAT_DIRECTORY_RECORD size ADD HL,DE DI IN A,(SLOT3) @@ -99,18 +112,18 @@ MSDOS_CAT: PUSH DE CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD A,13 + LD A,"\r" RST #10 POP DE ; СТРОКА ПОСЛЕ CAT CAT_SPACES: LD A,(DE) - CP #20 + CP " " JR NZ,CAT_NO_SPACE INC DE JR CAT_SPACES CAT_NO_SPACE: - CP 13 + CP "\r" JR NZ,CAT_ALL LD DE,CAT_FILES CAT_ALL: @@ -142,26 +155,29 @@ PRINT_MSD_NAME: PUSH DE LD HL,ZX_VARS.FL_NAME LD A,' ' - RST 10H + RST #10 LD A,' ' - RST 10H + RST #10 + ; LD B,8 -PRINT_MSD_L1: - LD A,(HL) - RST 10H +.L1: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 INC HL - DJNZ PRINT_MSD_L1 + DJNZ .L1 + ; LD A,' ' - RST 10H + RST #10 + ; LD B,3 -PRINT_MSD_L2: - LD A,(HL) - RST 10H +.L2: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 INC HL - DJNZ PRINT_MSD_L2 + DJNZ .L2 + ; LD A,6 - RST 10H - + RST #10 POP DE POP HL RET @@ -369,8 +385,9 @@ RMD_BLKS_L2: RET ; B - ЧИСЛО БЛОКОВ RAM_DISK ;**************************************** -MSDOS_KOMP_FL: ; DE - ИМЯ ФАЙЛА СО *,? - ; HL - ИМЯ В КАТАЛОГЕ +; DE - ИМЯ ФАЙЛА СО *,? +; HL - ИМЯ В КАТАЛОГЕ +MSDOS_KOMP_FL: CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS LD A,(ZX_VARS.FL_NAME) AND A diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 7a33370..3a73f6c 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -619,7 +619,7 @@ HDD_SET:;!TEST INC DE CP ' ' JR Z,.loop - CP #0D + CP "\r" JR Z,.init ; DEC DE diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index cd4e27e..f2373b4 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -562,7 +562,7 @@ READ_BPB: LD C,B LD B,0 ; BC - число файловых записей в секторе LD A,C - LD (SYS_PAGE.F_P_S),A + LD (SYS_PAGE.FilesPerSector),A LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей @@ -579,7 +579,7 @@ READ_BPB: LD E,A ; A - число секторов в DIR LD D,0 LD BC,0 - LD (SYS_PAGE.S_P_C),A + LD (SYS_PAGE.SectorsPerCluster),A ADD IX,DE ; Начало DATA area ADC HL,BC @@ -646,11 +646,11 @@ READ_1ST_DIR: EX AF,AF' LD A,SYS_PAGE OUT (SLOT3),A - LD IX,(SYS_PAGE.MSD_CAT_SEC2) ; - LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА + LD IX,(SYS_PAGE.MSD_CAT_SEC2) + LD DE,(SYS_PAGE.MSD_CAT_SEC) ; НАЧАЛЬНЫЙ СЕКТОР КАТАЛОГА LD (SYS_PAGE.MSD_CONT_SEC),DE LD (SYS_PAGE.MSD_CONT_SEC2),IX - LD A,(SYS_PAGE.S_P_C) ; СЕКТОРОВ В КАТАЛОГЕ + LD A,(SYS_PAGE.SectorsPerCluster) ; СЕКТОРОВ В КАТАЛОГЕ LD (SYS_PAGE.COUNT_SEC),A READ_NEXT2: EX AF,AF' @@ -677,7 +677,7 @@ READ_NEXT2: INC IX LD (SYS_PAGE.MSD_CONT_SEC2),IX READ_NEXT3: - LD A,(SYS_PAGE.F_P_S) ; ФАЙЛОВ В СЕКТОРЕ + LD A,(SYS_PAGE.FilesPerSector) ; ФАЙЛОВ В СЕКТОРЕ LD (SYS_PAGE.COUNT_FL),A EX AF,AF' From 03cdbeca7dd4f11985496624f258a569c2106018 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:22:56 +1000 Subject: [PATCH 090/114] ... --- Shared_Includes | 2 +- TRDOS/TR_MSD_2.ASZ | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 04aaef8..4f546cb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 04aaef8ac955971d913babd95921a62937b597ae +Subproject commit 4f546cb1d2cd8eeb1aec0de2c3e9902d1bb52fee diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 1ed49f1..ac3de9f 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -415,9 +415,9 @@ KOMP_CONT2: MSDOS_KOMP_ALL: LD A,(DE) INC DE - CP 20H + CP " " JR Z,MSDOS_KOMP_ALL - CP 13 + CP "\r" JR Z,KOMP_ERROR_NAME ; НЕВЕРНОЕ ИМЯ DEC DE @@ -426,11 +426,11 @@ MSDOS_KOMP_ALL: RET NZ LD A,(DE) - CP '.' + CP "." JR Z,KOMP_POINT - CP 13 + CP "\r" JR Z,KOMP_SPACING3 - CP 20H + CP " " JR Z,KOMP_SPACING3 KOMP_ERROR_NAME: ; НЕВЕРНОЕ ИМЯ LD A,1 @@ -453,21 +453,21 @@ KOMP_POINT: ;**************************************************** KOMP_TX: LD A,(DE) - CP 13 + CP "\r" JR Z,KOMP_SPACING - CP 20H + CP " " JR Z,KOMP_SPACING - CP '.' + CP "." JR Z,KOMP_SPACING - CP '?' + CP "?" JR Z,KOMP_EX_OK - CP '*' + CP "*" JR Z,KOMP_EX_OK2 - CP 'a' + CP "a" JR C,KOMP_EXEC - CP 'z'+1 + CP "z"+1 JR NC,KOMP_EXEC - AND 223 + AND %1101'1111 KOMP_EXEC: CP (HL) RET NZ ; нет совпадения From 685e3825823a84120325555438c76f7f3d81853e Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 18 Jul 2024 05:36:06 +1000 Subject: [PATCH 091/114] in progress: current dir for TR-DOS HDD --- SP_TRDOS.ASM | 171 ++++++------- SP__48.ASM | 4 +- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 255 ++++++++++++++++--- TRDOS/TR_MSD_2.ASZ | 35 ++- TRDOS/TR_MSD_3.ASZ | 95 +------ TRDOS/TR_MSD_S.ASZ | 84 +++--- TRDOS/TR_RMD_S.ASZ | 55 +--- TRDOS/boot_trd.asm | 618 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 1021 insertions(+), 298 deletions(-) create mode 100644 TRDOS/boot_trd.asm diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 68810b3..a46e3f2 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -49,24 +49,16 @@ AUTO_411E EQU #411E AUTO_4130 EQU #4130 AUTO_4140 EQU #4140 AUTO_41FF EQU #41FF -AUTO_5220 EQU #5220 -AUTO_58E8 EQU #58E8 AUTO_5E34 EQU #5E34 AUTO_5F00 EQU #5F00 AUTO_5F10 EQU #5F10 AUTO_5F12 EQU #5F12 -AUTO_6000 EQU #6000 PORT_128 EQU #7FFD AUTO_A1DB EQU #A1DB AUTO_B0ED EQU #B0ED -AUTO_B8ED EQU #B8ED AUTO_C000 EQU #C000 AUTO_C130 EQU #C130 -AUTO_C308 EQU #C308 -AUTO_C916 EQU #C916 -AUTO_FE15 EQU #FE15 -AUTO_FF00 EQU #FF00 ;**************************************** START: DI @@ -526,7 +518,7 @@ AUTO_031A: AUTO_0320: INC C LD D,A - LD A,22 ; 21 !!! Add new comand !! + LD A,TRDOS_CMD.LIST.Size CP C JP C,AUTO_01D3 ; ЕСЛИ НЕ НАЙДЕНО-ВЫЙТИ LD A,D @@ -561,10 +553,15 @@ AUTO_0359: SET 7,(HL) POP HL JP (HL) -NAME_TRD: - DB 127," 1986 Technology Research. " - DB "version 5.05 by Makarchenco Ivan. " - DB " ",0,0 + +;----------------------------------------------------------------------- + _mInfoBLOCK #03AC-$,#FF +; NAME_TRD: +; DB 127," 1986 Technology Research. " +; DB "version 5.05 by Makarchenco Ivan. " +; DB " ",0,0 +;----------------------------------------------------------------------- + AUTO_03AC: CALL AUTO_03FD CALL PRINT_CR @@ -1153,9 +1150,9 @@ WG93_EXE_: INCLUDE 'trdos/tr_msd_3.asz' - _mInfoBLOCK #0B00-$,255 +; _mInfoBLOCK #0B00-$,255 ;!TODO russian charset -ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? +;ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** INCLUDE 'trdos/tr_msd_2.asz' @@ -1265,11 +1262,11 @@ AUTO_1059: POP DE POP BC POP HL - AND 223 + AND %1101'1111 EI RET AUTO_106E: - LD HL,AUTO_58E8 + LD HL,#58E8 ;адрес линии атрибутов LD B,10 AUTO_1073: LD (HL),7 @@ -1277,15 +1274,13 @@ AUTO_1073: DJNZ AUTO_1073 LD (HL),2 INC HL - LD (HL),22 + LD (HL),#16 INC HL - DB 54 -AUTO_107F: - INC (HL) + LD (HL),#34 INC HL - LD (HL),'%' + LD (HL),#25 INC HL - LD (HL),'(' + LD (HL),#28 INC HL LD (HL),7 LD HL,AUTO_40F1 @@ -1448,12 +1443,12 @@ AUTO_1205: PUSH AF CALL Z,AUTO_1D97 POP AF - CP 17 + CP 16 + 1 JP NC,CMD_ERROR CALL AUTO_1D84 - LD A,255 + LD A,#FF LD (ZX_VARS.DISK_1_FLG),A - CALL AUTO_1151 + CALL AUTO_1151 ; !FIXIT выделяет память, но не освобождает LD HL,ZX_VARS.CLEAR_SEC LD DE,(ZX_VARS.VAR_1) LD BC,RST20 @@ -4276,7 +4271,7 @@ AUTO_25EF: INC HL LD D,(HL) OR A - LD HL,AUTO_107F + LD HL,ROUTINE.ed_error ;48 basic routine SBC HL,DE JR NZ,AUTO_2626 LD SP,(ZX_VARS.ERR_SP) @@ -5588,66 +5583,64 @@ AUTO_2FDE: RET //////////////////////////////////////////// -TRDOS_CMD: - ; Таблица команд TR-DOS. -.LIST: DB ZX_Token.cat - DB '*' - DB ZX_Token.format - DB ZX_Token.move - ; - DB ZX_Token.new - DB ZX_Token.erase - DB ZX_Token.load - DB ZX_Token.save - ; - DB ZX_Token.return - DB ZX_Token.peek - DB ZX_Token.poke - DB ZX_Token.merge - ; - DB ZX_Token.run - DB ZX_Token.open_channel - DB ZX_Token.close_channel - DB ZX_Token.copy - ; - DB '4' - DB ZX_Token.go_to - DB '8' - DB ZX_Token.list - ; - DB ZX_Token.verify - DB '/' - ;; - ;; -.Size EQU $ - TRDOS_CMD.LIST - ; Таблица адресов подпрограмм, выполняющих команды TR-DOS. -.TABLE: DW CMD_CAT - DW CMD_STAR - DW CMD_FORMAT - DW CMD_MOVE - ; - DW CMD_NEW - DW CMD_ERASE - DW CMD_LOAD - DW CMD_SAVE - ; - DW CMD_RETURN - DW CMD_PEEK - DW CMD_POKE - DW CMD_MERGE - ; - DW CMD_RUN - DW CMD_OPEN - DW CMD_CLOSE - DW CMD_COPY - ; - DW CMD_40 - DW CMD_GOTO - DW CMD_80 - DW CMD_LIST - ; - DW CMD_VERIFY - DW CMD_MSDOS +TRDOS_CMD: ; Таблица команд TR-DOS. +.LIST: DB ZX_Token.cat + DB '*' + DB ZX_Token.format + DB ZX_Token.move + ; + DB ZX_Token.new + DB ZX_Token.erase + DB ZX_Token.load + DB ZX_Token.save + ; + DB ZX_Token.return + DB ZX_Token.peek + DB ZX_Token.poke + DB ZX_Token.merge + ; + DB ZX_Token.run + DB ZX_Token.open_channel + DB ZX_Token.close_channel + DB ZX_Token.copy + ; + DB '4' + DB ZX_Token.go_to + DB '8' + DB ZX_Token.list + ; + DB ZX_Token.verify + DB '/' + ; +.LIST.Size EQU $ - TRDOS_CMD.LIST + ; Таблица адресов подпрограмм, выполняющих команды TR-DOS. +.TABLE: DW CMD_CAT + DW CMD_STAR + DW CMD_FORMAT + DW CMD_MOVE + ; + DW CMD_NEW + DW CMD_ERASE + DW CMD_LOAD + DW CMD_SAVE + ; + DW CMD_RETURN + DW CMD_PEEK + DW CMD_POKE + DW CMD_MERGE + ; + DW CMD_RUN + DW CMD_OPEN + DW CMD_CLOSE + DW CMD_COPY + ; + DW CMD_40 + DW CMD_GOTO + DW CMD_80 + DW CMD_LIST + ; + DW CMD_VERIFY + DW CMD_MSDOS //////////////////////////////////////////// ; ; @@ -6434,8 +6427,8 @@ READR_X: ;***************************** NEW_NAME: - DB 22,1,3, "* Sprinter TR-DOS v.7.02 *" - DB 22,3,6, "(c) 2023 Sprinter Team" + DB 22,1,3, "* Sprinter TR-DOS v.7.03 *" + DB 22,3,6, "(c) 2024 Sprinter Team" DB 22,5,14, "*R.F.*" DB 22,7,9, "BETA 4Mb",0 diff --git a/SP__48.ASM b/SP__48.ASM index cda53cf..a983d9a 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -20358,6 +20358,4 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00111100 - END - - +; END \ No newline at end of file diff --git a/Shared_Includes b/Shared_Includes index 4f546cb..77a5168 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4f546cb1d2cd8eeb1aec0de2c3e9902d1bb52fee +Subproject commit 77a51684d4d63ad2fdccf416793951df00276b17 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 2e0beec..8dc2742 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -1,16 +1,110 @@ +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +HDD_PROG: + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_INIT and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_INIT + CALL EXP_FNS + ; + JP C,HDD_PROG_E + LD HL,SYS_PAGE.HD_IDF_ADR.ModelNum + LD B,32 +HDD_PROG_L: + DI + IN A,(SLOT3) + LD D,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,L + XOR 1 + LD L,A + LD C,(HL) + LD A,L + XOR 1 + LD L,A + INC HL + LD A,D + OUT (SLOT3),A +; RET_PAGE3 + EI + LD A,C + PUSH BC + RST #10 + POP BC + DJNZ HDD_PROG_L + ;!TEST 06/01/2024 убираем лишние телодвижения + ;LD C,BIOS.HDD_RECAL and #BF + ;CALL HD_CMD + LD C,BIOS.HDD_RECAL + CALL EXP_FNS + ; + JP NC,AUTO_03E1 + +HDD_ERROR: + CALL PRINT_HEX_A + LD HL,HD_TX + JP AUTO_03E4 + +; JP AUTO_03E1 + +HDD_PROG_E: + LD HL,HD_TX2 + JP AUTO_03E4 + +; +HDD_SET:;!TEST +.loop: LD A,(DE) + INC DE + CP " " + JR Z,.loop + CP "\r" + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ;CALL CHOOSE_HDD + ;CALL READ_BPB + ;RET + ; +; [x] new tr-hdd +.init: ;CALL CORRECT_CUR_DIR + DI + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_DIR_HDD) + CP #FF + JR Z,.skip + LD (SYS_PAGE.CURRENT_HDD),A + ; +.skip: ;LD A,(SYS_PAGE.CURRENT_HDD) + OR #40 + PUSH AF + LD A,C + OUT (SLOT3),A + ; + LD C,BIOS.HDD_INIT + CALL EXP_FNS + POP AF + JP C,HDD_PROG_E + ; + ; LD BC,(ZX_VARS.OPER_DISK - 1) + ; LD A,(ZX_VARS.OPER_DISK) + ; LD B,A + ; XOR A + LD E,A + LD C,BIOS.SET_DISK_REDIR + JP EXP_FNS ;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR CHOOSE_HDD: - PUSH DE - LD A,(ZX_VARS.OPER_DISK) - LD C,BIOS.GET_DRV_ST - CALL EXP_FNS - POP DE - JR C,.error - AND #40 ;!HARDCODE HDD - CALL Z,.setUp_HDD - ; .loop: LD A,(DE) INC DE CP " " @@ -18,8 +112,7 @@ CHOOSE_HDD: LD A,(DE) CP "\r" JR Z,.error -.cont: ; номер раздела - ;INC DE + ; номер раздела LD A,(DE) CP "4" JR NC,.error @@ -29,17 +122,6 @@ CHOOSE_HDD: RLA RLA LD C,A - ; ; master/slave - ; DEC DE - ; LD A,(DE) - ; CP "2" - ; JR NC,.error - ; CP "0" - ; JR C,.error - ; SUB "0" - ; RLA - ; OR C - ; LD C,A ; Primary/Secondary, master/slave DEC DE LD A,(DE) @@ -50,20 +132,129 @@ CHOOSE_HDD: SUB "0" OR C ; + PUSH AF LD C,BIOS.HDD_PART CALL EXP_FNS - RET NC + POP BC + JR C,.error ; -.error: LD HL,MSG_3 + SCF + ;CALL CORRECT_CUR_DIR + CALL RESTORE_CURRENT_DIR + ; + XOR A + LD C,A ; обнулить C + LD A,B + ;OR #40 + LD B,A + ; + ; PUSH AF + ; LD A,(ZX_VARS.OPER_DISK) + ; LD C,BIOS.GET_DRV_ST + ; CALL EXP_FNS + ; POP BC + ; JR C,.error + ; ; + ; AND #40 ;!HARDCODE HDD + ; LD C,A ; обнулить C + ; LD A,B + ; RET NZ + ; + PUSH BC + LD BC,(ZX_VARS.OPER_DISK - 1) + ; LD B,A + ; XOR A + LD C,BIOS.HDD_TO_DRV + CALL EXP_FNS + POP AF + RET + ; +.error: ;AND %1101'1111 + ;CP "*" + ;JR Z,.set_from_sys_page + LD HL,MSG_3 JP ERR_EXIT ; -.setUp_HDD: - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - PUSH DE +; .setUp_HDD: +; PUSH BC +; LD A,(ZX_VARS.OPER_DISK) +; LD B,A +; XOR A +; LD C,BIOS.HDD_TO_DRV +; CALL EXP_FNS +; POP BC +; RET + ; +;.set_from_sys_page: +; !!! + + +; CF=1: skip resest CURRENT_HDD +; CF=0: resest CURRENT_HDD + + +; [x] new tr-hdd +RESTORE_CURRENT_DIR: + PUSH AF + ; + LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - POP DE + CP #40 + JR C,.exit_Res_Dir + AND #0F + LD H,A + ; + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD A,(SYS_PAGE.CURRENT_DIR_HDD) + CP H + JR NZ,.exit_Res_Dir + + LD HL,(SYS_PAGE.CURRENT_DIR_SEC_L) + LD DE,(SYS_PAGE.CURRENT_DIR_SEC_H) + LD A,H + OR L + OR D + OR E + JR Z,.exit_Res_Dir + ; + LD (SYS_PAGE.MSD_CAT_SEC),HL + LD (SYS_PAGE.MSD_CAT_SEC2),DE +.exit_Res_Dir: + EX AF,AF' + OUT (SLOT3),A + POP AF RET -; \ No newline at end of file + ; + + +; [x] new tr-hdd +; TO INIT by SPECTRUM.EXE: +; .CURRENT_DIR_SEC_L EQU #C196 ; word +; .CURRENT_DIR_SEC_H EQU #C198 ; word +; .CURRENT_DIR_HDD EQU #C19A +; .CURRENT_HDD EQU #C12D + +; CORRECT_CUR_DIR: +; DI +; IN A,(SLOT3) +; LD C,A +; LD A,SYS_PAGE +; OUT (SLOT3),A +; LD A,#FF +; JR C,.skip +; LD (SYS_PAGE.CURRENT_HDD),A +; .skip: INC A +; LD H,A +; LD L,A +; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL +; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL +; LD A,C +; OUT (SLOT3),A +; RET +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index ac3de9f..119dcea 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -1,7 +1,9 @@ -; -; for INCLUDE +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +;********************************** ; MS-DOS system -; ;********************************** MSDOS_FIND_FILE: @@ -19,10 +21,28 @@ MSDOS_FIND_NEXT: ;*********************************************** ; +; CHECK_BPB: +; IN A,(SLOT3) +; LD E,A +; LD A,SYS_PAGE +; DI +; OUT (SLOT3),A +; ; +; LD A,(SYS_PAGE.BPB_PARSED) +; ADD A,1 +; ; +; LD A,E +; OUT (SLOT3),A +; EI +; RET ;*********************************************** MSDOS_1ST_FL: PUSH DE - CALL READ_BPB + ; 15/07/2024 + ;CALL CHECK_BPB + CALL READ_BPB + ;CALL C,READ_BPB + ; CALL READ_1ST_DIR POP DE MSDOS_TEST_FL: @@ -341,7 +361,7 @@ LOAD_RMD_XX: POP AF CALL GET_RMD_A ; установить RAM-Disk A размером B - LD HL,0C000H + LD HL,#C000 CALL MSDOS_READ_FILE JP AUTO_03E1 @@ -570,7 +590,7 @@ WORDS: DB 5,'CLEAR' ; DW TB_ONOFF DB 5,'TBOFF' ; выключить турбо DW TB_ONOFF - DB 4,'INIT' ; инизиализация + DB 4,'INIT' ; реинизиализация DW INIT_RMD DB 8,"SPRINTER" DW SPR_1 @@ -625,3 +645,6 @@ SP_1: LD A,(DE) ; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ ; 2 - КОНЕЦ КАТАЛОГА ; +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_2.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 3a73f6c..f4a9407 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -1,4 +1,6 @@ - +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ INIT_RMD: LD C,BIOS.FullInit ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то @@ -559,90 +561,7 @@ GET_FL_L2: RET Z INC BC RET -;*************************************************************************** - -HDD_PROG: - ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - LD HL,SYS_PAGE.HD_IDF_ADR+54 - LD B,32 -HDD_PROG_L: - DI - IN A,(SLOT3) - LD D,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,L - XOR 1 - LD L,A - LD C,(HL) - LD A,L - XOR 1 - LD L,A - INC HL - LD A,D - OUT (SLOT3),A -; RET_PAGE3 - EI - LD A,C - PUSH BC - RST 10H - POP BC - DJNZ HDD_PROG_L - ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_RECAL and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_RECAL - CALL EXP_FNS - ; - JP NC,AUTO_03E1 - -HDD_ERROR: - CALL PRINT_HEX_A - LD HL,HD_TX - JP AUTO_03E4 - -; JP AUTO_03E1 - -HDD_PROG_E: - LD HL,HD_TX2 - JP AUTO_03E4 - -; -HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP ' ' - JR Z,.loop - CP "\r" - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ; - -.init: ;!TEST 06/01/2024 убираем лишние телодвижения - ;LD C,BIOS.HDD_INIT and #BF - ;CALL HD_CMD - LD C,BIOS.HDD_INIT - CALL EXP_FNS - ; - JP C,HDD_PROG_E - - LD A,(ZX_VARS.OPER_DISK) - LD B,A - XOR A - LD C,BIOS.HDD_TO_DRV - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - JP EXP_FNS - ;CALL EXP_FNS - ;EI - ;RET - ; -;*************************************************************************** \ No newline at end of file +;*********************************************************************** +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_3.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index f2373b4..663be83 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -1,7 +1,9 @@ -; -; for INCLUDE +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + +;******************************************** ; MS-DOS system -; ;******************************************** ; MS-DOS utilites ;******************************************** @@ -427,20 +429,23 @@ SET_1440: READ_BPB: CALL DISK_REDIR + ; LD C,BIOS.GET_DISK_REDIR + ; CALL EXP_FNS CP #40 - JR NC,.HDD_REDIR2 + JR NC,.HDD CP 4 JP NC,.ERROR_MSDOS - + ; CALL SET_DISK - + ; CALL .MAIN RET NC JP .ERROR_MSDOS -.HDD_REDIR2: - CALL .MAIN + ; +.HDD: CALL .MAIN + CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC -.SPACIAL: + ; old hdd LD IX,0 LD DE,63 ;!HARDCODE LD A,SYS_PAGE @@ -450,17 +455,18 @@ READ_BPB: CALL MSD_R_W_UT ; CALL .PARAMS + CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC JP .ERROR_MSDOS + ; .MAIN: LD A,SYS_PAGE LD HL,SYS_PAGE.MS_BPB LD C,TRDOS_ROM_CMD.READ_BPB CALL MSD_R_W_UT - ;CALL BPB_PARAMS ;RET - + ; ; LD C,18H ; LD A,(ZX_VARS.OPER_DISK) ; CALL HD_CMD @@ -493,8 +499,8 @@ READ_BPB: CP #F0 JP C,.ERROR_BPB - LD HL,SYS_PAGE.MS_BPB+FAT_ID - LD DE,.FAT1_MSG + LD DE,SYS_PAGE.MS_BPB+FAT_ID + LD HL,.FAT1_MSG LD B,4 .L1: LD A,(DE) CP ' ' @@ -507,7 +513,7 @@ READ_BPB: INC HL INC DE DJNZ .L1 - LD A,(HL) + LD A,(DE) CP '6' LD HL,#81FF ; FAT16 флаг JR Z,.FAT @@ -521,15 +527,16 @@ READ_BPB: LD A,(SYS_PAGE.MS_BPB+S_P_T) ; Количество секторов на трек LD (SYS_PAGE.MSD_SECS),A - BIT 7,H + ; BIT 7,H - LD IX,0 - LD HL,0 ; вычислить начальный сектор FAT + ; LD IX,0 + ; LD HL,0 ; вычислить начальный сектор FAT + ; JR Z,.NO_LD_SPECIAL - JR Z,.NO_LD_SPECIAL LD IX,(SYS_PAGE.MS_BPB+SPECIAL_SECS) LD HL,(SYS_PAGE.MS_BPB+SPECIAL_SECS+2) -.NO_LD_SPECIAL: + +;.NO_LD_SPECIAL: LD BC,0 LD DE,(SYS_PAGE.MS_BPB+RESERV_SECS) @@ -539,10 +546,10 @@ READ_BPB: LD (SYS_PAGE.MSD_FAT_SEC),IX ; начальный сектор FAT LD (SYS_PAGE.MSD_FAT_SEC2),HL ; начальный сектор FAT - LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT - LD BC,0 + LD DE,(SYS_PAGE.MS_BPB+S_P_F) ; число секторов в FAT + ;LD BC,0 - LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs + LD A,(SYS_PAGE.MS_BPB+FATS_NUM) ; количество FATs .NEXT_ADD: ADD IX,DE ADC HL,BC @@ -552,16 +559,18 @@ READ_BPB: LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR + ; A=0 + LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора + LD A,B RL C - RL B + RLA RL C - RL B + RLA RL C - RL B - LD C,B + RLA + LD C,A LD B,0 ; BC - число файловых записей в секторе - LD A,C LD (SYS_PAGE.FilesPerSector),A LD DE,(SYS_PAGE.MS_BPB+FLS_NUM) ; Число файловых записей @@ -577,8 +586,8 @@ READ_BPB: EX DE,HL LD E,A ; A - число секторов в DIR - LD D,0 LD BC,0 + LD D,B LD (SYS_PAGE.SectorsPerCluster),A ADD IX,DE ; Начало DATA area @@ -588,10 +597,12 @@ READ_BPB: LD (SYS_PAGE.MSD_DAT_SEC2),HL LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора - LD HL,0 + ; D = 0 + LD H,D + LD L,D LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A - LD A,L + XOR A .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера ADC A,0 @@ -599,11 +610,14 @@ READ_BPB: JR NZ,.NEXT_ADD3 LD (SYS_PAGE.CLASTER_LEN),HL - LD B,0 + ; D = 0 + LD B,D LD C,A LD (SYS_PAGE.CLASTER_LEN2),BC - LD HL,0 + ; D = 0 + LD H,D + LD L,D LD BC,(SYS_PAGE.MS_BPB+S_P_T) LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР @@ -627,6 +641,7 @@ READ_BPB: .ERROR_MSDOS: LD HL,MSG_3 JP AUTO_03E4 + ; .FAT1_MSG: DB 'FAT1' ;******************************************** @@ -759,7 +774,8 @@ NO_ADD: POP DE POP HL RET - ;******************************************* - +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_MSD_S.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 356e45d..73ea1d2 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -1,19 +1,16 @@ -; +File_Start DEFL $ + DISPLAY "====================================================" +;███████████████████████████████████████████████████████████████████████ + DEFINE NEW_RAMDRV_READ 1 - DISK_REDIR: - PUSH HL + ;PUSH HL PUSH BC - LD A,(ZX_VARS.OPER_DISK) - AND 3 - LD C,BIOS.GET_DRV_ST + LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; POP BC - POP HL + ;POP HL RET R_W_REDIR: @@ -550,41 +547,6 @@ READ_WRITE_RAMD: ; A = RAM Block ID EX AF,AF' ; - ;POP DE - ; POP BC - ; PUSH BC -; ; !TEST накручиваем счётчик r/w секторов -; LD HL,(ZX_VARS.CONT_SEC) -; LD D,H -; LD E,L -; ;!TODO переделать эту тупость на математику -; LD A,16 -; .loop: INC L -; CP L -; JR NZ,.skip -; INC H -; LD L,0 -; .skip: DJNZ .loop -; ; сохраняем накрученный счётчик -; LD (ZX_VARS.CONT_SEC),HL -; ; ФИЗИЧЕСКИЙ СЕКТОР -> ЛОГИЧЕСКИЙ -; LD A,D -; RRCA -; RRCA -; RRCA -; RRCA -; LD D,A -; AND #F0 -; OR E -; LD E,A -; LD A,D -; AND #0F -; LD D,A -; ; - ; POP BC - ; PUSH BC - - POP HL ; Get command r/w LD A,(ZX_VARS.RD_WR_COM) @@ -630,3 +592,6 @@ READ_WRITE_RAMD: ENDIF ;*********************************************************************** +;███████████████████████████████████████████████████████████████████████ + DISPLAY "TR_RMD_S.ASZ size: ",/A,$-File_Start + DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/boot_trd.asm b/TRDOS/boot_trd.asm new file mode 100644 index 0000000..c4b5a5d --- /dev/null +++ b/TRDOS/boot_trd.asm @@ -0,0 +1,618 @@ +/* +BOOTER +;выполнялка ком."8" +;вместо #29AE + LD BC,#F4FF + RST #20 + DW #1EAF ;CLEAR_RUN + ; + LD A,1 + RST #20 + DW #229B ;border и 23624 + ; + DI + LD HL,bootkus1 ;#E00 + LD DE,#F500 + LD BC,bootln1 ;#1F5 + PUSH DE + LDIR + LD HL,bootkus2 ;#344D + LD BC,bootln2+1 ;#334 + LDIR + SET 3,(IY+#01) + RET +*/ + + + + + org 0 + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/sp2000.inc' + INCLUDE 'inc/rom_routines.inc' + + +bootkus1: DISP #F500 + DI ;его и #344D копирует #3AE7 + PUSH AF + PUSH HL + PUSH DE + PUSH BC + EXX + PUSH HL + LD HL,(ZX_VARS.ERR_SP) + LD (.ERR_SP),HL + LD A,(ZX_VARS.CONT_DISK) + LD (ZX_VARS.OPER_DISK),A + ADD A,#3C + LD (ZX_VARS.PDOS_COPY),A + LD HL,#3C00 + LD DE,#8000 + PUSH DE + LD (ZX_VARS.ZG),DE + LD BC,#0400 + LDIR + LD (IY+#47),#00 + POP HL + LD BC,#0080 +.big_loop: PUSH BC + INC HL + INC HL + INC HL + LD B,#03 +.loop1: LD D,(HL) + LD A,D + RLA + OR D + LD (HL),A + INC HL + DJNZ .loop1 + POP BC + DEC BC + INC HL + INC HL + LD A,B + OR C + JR NZ,.big_loop + XOR A + OUT (BorderColor),A + LD A,#44 + LD (ZX_VARS.BORDER),A + DEC A + DEC A + LD (ZX_VARS.ATTR_P),A + CALL ROUTINE.cls +.loop2: DI + XOR A + LD (VAR_1),A +.var_3+1: LD HL,LL3761 + PUSH HL + LD (ZX_VARS.ERR_SP),SP + LD (IY+#00),#FF + LD A,(ZX_VARS.CONT_DISK) + LD C,#01 + CALL #3D13 + LD HL,#9000 + LD DE,#0000 + LD BC,#0805 + CALL #3D13 + LD A,(IY+#00) + CP #FF + JR NZ,.loop2 + LD HL,.loop2 + LD (.var_3),HL + EXX + LD DE,#A000 + EXX + LD HL,#9000 + LD DE,#0008 + LD A,(HL) + OR A + JP Z,LF887 +.loop3: LD DE,#0008 + ADD HL,DE + LD A,(HL) + CP #42 + CALL Z,LF836 + ADD HL,DE + LD A,(HL) + OR A + JR NZ,.loop3 + LD A,(VAR_1) + OR A + JP Z,LF887 + LD B,#3F + SBC A,B + JP NC,LF8A6 + LD A,(VAR_1) + DEC A + LD (#F86F),A + CALL #F9BB + LD (#F653),A + CALL #0D6B + DI + CALL #F870 + LD A,#02 + CALL #F8CB + LD A,#02 + CALL #1601 + LD (IY+#47),#00 + LD DE,#A000 + LD HL,#0008 +.loop4: LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#20 + RST #10 + LD A,#20 + RST #10 + LD BC,#0008 + PUSH DE + CALL #203C + POP DE + EXD + ADC HL,DE + EXD + LD A,(VAR_1) + DEC A + LD (VAR_1),A + JR Z,LL0f35 + LD A,#06 + RST #10 + JR .loop4 + ; +.ERR_SP: WORD 0 + NOP +LL0f35 LD HL,#5802 + CALL #F816 + LD DE,#000A + LD IX,#F634 + LD (IX+#00),#00 +LL0f46 EI + RES 5,(IY+#01) + HALT + PUSH HL + PUSH IX + CALL #F9BB + CP #40 + JP NZ,#F792 + CALL #F989 + POP IX + POP HL + BIT 5,(IY+#01) + JR Z,LL0f46 + LD A,(#5C08) + CP 8 + JP Z,#F6ED + CP "o" + JR Z,LL0fed + CP "6" + JR Z,LL0fed + CP 9 + JP Z,#F70C + CP "p" + JP Z,#F70C + CP "7" + JP Z,#F70C + CP 11 + JP Z,#F72E + CP "q" + JP Z,#F72E + CP "9" + JP Z,#F72E + CP 10 + JP Z,#F764 + CP "a" + JP Z,#F764 + CP "8" + JP Z,#F764 + CP "d" + JP Z,#FA1B + CP "1" + JR Z,LL0fd0 + CP "2" + JR Z,LL0fd0 + CP "3" + JR Z,LL0fd0 + CP "4" + JR Z,LL0fd0 + PUSH AF + LD A,#FE + IN A,(#FE) + RRA + JR NC,LL0f46 + POP AF + CP 13 + JP Z,#F79D + CP "0" + JP Z,#F79D + CP 32 + JP Z,#F79D + JP #F646 +LL0fd0 PUSH AF + CALL #0D6B + LD A,#03 + CALL #F8CB + POP AF + SUB #31 + LD C,#01 + LD (#5CF8),A + LD (#5CF9),A + LD (ZX_VARS.CONT_DISK),A + CALL #3D13 + JP #F556 +LL0fed CALL #F870 + CALL #F826 + DEC (IX) + +bootst2 +bootln1 = $-bootkus1 + + LD A,(IX+#00) + CP #FF + JR NZ,LL345b + LD A,(#F86F) + LD (IX+#00),A +LL345b CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + INC (IX+#00) + LD A,(#F86F) + INC A + CP (IX+#00) + LD A,(IX+#00) + JR NZ,LL347d + XOR A + LD (IX+#00),A +LL347d CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + DEC (IX+#00) + DEC (IX+#00) + DEC (IX+#00) + BIT 7,(IX+#00) + LD A,(IX+#00) + JR Z,LL34b3 +LL349e LD B,#03 + ADD A,B + LD B,A + PUSH BC + LD A,(#F86F) + SUB B + JR C,LL34ac + POP AF + JR LL349e +LL34ac POP AF + DEC A + DEC A + DEC A + LD (IX+#00),A +LL34b3 CALL #F7FA + CALL #F816 + JP #F646 + CALL #F870 + CALL #F826 + INC (IX+#00) + INC (IX+#00) + INC (IX+#00) + LD A,(#F86F) + SBC A,(IX+#00) + LD A,(IX+#00) + JR NC,LL34e1 + LD B,#03 +LL34d8 SUB B + JR NC,LL34d8 + INC A + INC A + INC A + LD (IX+#00),A +LL34e1 CALL #F7FA + CALL #F816 + JP #F646 + CALL #0D6B + LD A,#03 + CALL #F8CB + JP #F556 + LD BC,#FFFD + LD A,#07 + OUT (C),A + LD B,#BF + LD A,#FF + OUT (C),A ;глушит AY + CALL #F870 + LD A,#07 + LD (#5C48),A + LD (#5C8D),A + CPL + LD (#5D3B),A + LD HL,#3C00 + LD (#5C36),HL + LD L,(IX+#00) + LD H,#00 + ADD HL,HL + ADD HL,HL + ADD HL,HL + LD DE,#A000 + ADD HL,DE + LD DE,#F7F0 + LD BC,#0008 + LDIR + LD HL,(#F632) + LD (ZX_VARS.ERR_SP),HL + LD HL,#F7EC + LD (#5C5D),HL + CALL #0D6B + DI + POP HL + EXX + POP BC + POP DE + POP HL + POP AF + CALL #3D03 + JP PE,#F73A + LD (#6F62),HL + LD L,A + LD (HL),H + JR NZ,LL356e + JR NZ,LL3570 + LD (#D50D),HL + INC A + LD HL,#5802 + LD DE,#000A +LL355a DEC A + JR Z,LL356c + ADD HL,DE + DEC A + JR Z,LL356c + ADD HL,DE + DEC A + JR Z,LL356c + INC DE + INC DE + ADD HL,DE + DEC DE + DEC DE + JR LL355a +LL356c POP DE + RET +LL356e PUSH HL + EXX +LL3570 POP HL + LD A,#70 + PUSH HL + POP DE + INC DE + LD BC,#0007 + LD (HL),A + LDIR + EXX + RET + PUSH HL + EXX + POP HL + LD A,#42 + PUSH HL + POP DE + INC DE + LD BC,#0007 + LD (HL),A + LDIR + EXX + RET + ; +LF836: PUSH HL + PUSH DE + SBC HL,DE + LD A,(HL) + LD B,#20 + SBC A,B + JR C,LL35c3 + LD IX,#F981 + PUSH HL + LD BC,#0800 +LL35a0 LD A,(HL) + CP (IX+#00) + JR NZ,LL35a7 + INC C +LL35a7 INC HL + INC IX + DJNZ LL35a0 + LD A,C + CP #08 + JR NZ,LL35b4 + POP HL + JR LL35c3 +LL35b4 EXX + POP HL + LD BC,#0008 + LDIR + EXX + LD A,(VAR_1) + INC A + LD (VAR_1),A +LL35c3 POP DE + POP HL + RET + + +VAR_1: DB 0 +VAR_2: DB 0 + + + PUSH AF + PUSH BC + LD B,#D2 +LL35cc PUSH BC + XOR A + OUT (#FE),A + RR B +LL35d2 DJNZ LL35d2 + SET 4,A + OUT (#FE),A + POP BC + DEC B + DJNZ LL35cc + POP BC + POP AF + RET + ; +LF887: XOR A + CP (IY+#47) + JP NZ,#F556 + CALL #0D6E + LD A,#02 + CALL #1601 + XOR A + CALL #F8CB + LD A,#01 + CALL #1601 + LD (IY+#47),#FE + JP #F795 + ; +LF8A6: XOR A + CP (IY+#47) + JP NZ,#F556 + CALL #0D6E + LD A,#02 + CALL #1601 + LD A,#01 + CALL #F8CB + LD A,#3F + LD (VAR_1),A + LD BC,#FFFF +LL361a NOP + DJNZ LL361a + DEC C + JR NZ,LL361a + JP #F5B4 + LD DE,#F8D1 + JP #0C0A + + DB #80 + DB #16,#0A,#05 + DB "!!! NO PROGRAMS !!!" + DB (" "+#80) + + DB #16,#0A,#03,#10,#04 + DB "MORE THAN 63 BASIC FILES" ;than!!! + + DB (" "+#80) + + DB #11,#00,#10,#04,#13,#01 + DB " -=New ROM boot v1.06=-" + DB #06 + DB "Remix by CompoWellcome 05.02.99" + DB ("."+#80) + + DB #10,#02,#13,#01 + DB " INSERT NEW DISK" + DB #06 + DB " FOR READING CATALOGUE." ;catalogue! + + DB (" "+#80) + + DB "boot " + + LD HL,#5AE1 + PUSH HL + POP DE + DEC DE + LD BC,#001F + LDIR + LD HL,#5AFF + LD A,(#F9BA) + OR A + JR Z,LL3703 + LD A,(HL) + AND #07 + INC A + CP #08 + JR NZ,LL3710 + XOR A + LD (#F9BA),A + LD A,#07 +LL3703 LD A,(HL) + AND #07 + DEC A + OR A + JR NZ,LL3710 + CPL + LD (#F9BA),A + LD A,#01 +LL3710 LD (HL),A + RET +LL3712 NOP + LD A,#C3 + LD (#5CC2),A + LD HL,#F9E6 + LD (#5CC3),HL + LD IX,#2FC1 + CALL #FA20 + LD A,#08 + LD C,#1F + LD IX,#2A53 + CALL #FA20 + LD (#F9E7),SP + LD DE,#0000 + LD IX,#2740 + CALL #FA20 + LD SP,#0000 + LD IX,#1FF3 + CALL #FA20 + LD IX,#1FEB + CALL #FA20 + LD IX,#2FC1 + CALL #FA20 + LD A,#C9 + LD (#5CC2),A + LD A,(#5CCD) + AND #40 + RET +LL3761 LD A,#30 + INC A + CP #33 + LD (#FA0A),A + JP NZ,#F6D0 + LD A,#30 + LD (#FA0A),A + JR LL3761 + DI + LD IX,#0000 + PUSH IX + JP #3D2F + + BLOCK 3,#FF + + ENT From b1aa31381b366ad9ba66a260f2fdd9b48a4f4eff Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 19 Jul 2024 04:42:50 +1000 Subject: [PATCH 092/114] support for current dir from spectrum.exe --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 76 +++++++++++++++++++--------------------------- TRDOS/TR_MSD_2.ASZ | 7 +++-- TRDOS/TR_MSD_3.ASZ | 1 - TRDOS/TR_MSD_S.ASZ | 31 ++++++++----------- 5 files changed, 50 insertions(+), 67 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 77a5168..7e812bc 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 77a51684d4d63ad2fdccf416793951df00276b17 +Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 8dc2742..e953485 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -78,27 +78,32 @@ HDD_SET:;!TEST LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,(SYS_PAGE.CURRENT_DIR_HDD) + LD E,DRIVE_CODES.TRDOS.HDD + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE_COPY) CP #FF JR Z,.skip + ; + CP E + JR C,.skip + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + ; + AND #0F LD (SYS_PAGE.CURRENT_HDD),A ; -.skip: ;LD A,(SYS_PAGE.CURRENT_HDD) - OR #40 - PUSH AF - LD A,C +.skip: LD A,C OUT (SLOT3),A ; + PUSH DE LD C,BIOS.HDD_INIT CALL EXP_FNS - POP AF + POP DE JP C,HDD_PROG_E ; ; LD BC,(ZX_VARS.OPER_DISK - 1) ; LD A,(ZX_VARS.OPER_DISK) ; LD B,A ; XOR A - LD E,A + ;LD E,A LD C,BIOS.SET_DISK_REDIR JP EXP_FNS @@ -138,9 +143,22 @@ CHOOSE_HDD: POP BC JR C,.error ; - SCF - ;CALL CORRECT_CUR_DIR - CALL RESTORE_CURRENT_DIR + ; + ;CALL RESTORE_CURRENT_DIR + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE) + CP #FF + JR Z,.skip + LD (SYS_PAGE.CURRENT_DIR_DRIVE_COPY),A + XOR A + DEC A + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A +.skip: EX AF,AF' + OUT (SLOT3),A + ; ; XOR A LD C,A ; обнулить C @@ -189,19 +207,15 @@ CHOOSE_HDD: ; !!! -; CF=1: skip resest CURRENT_HDD -; CF=0: resest CURRENT_HDD - - ; [x] new tr-hdd RESTORE_CURRENT_DIR: PUSH AF ; LD C,BIOS.GET_DISK_REDIR CALL EXP_FNS - CP #40 - JR C,.exit_Res_Dir - AND #0F + ;CP #40 + ;JR C,.exit_Res_Dir + ;AND #0F LD H,A ; IN A,(SLOT3) @@ -209,7 +223,7 @@ RESTORE_CURRENT_DIR: LD A,SYS_PAGE OUT (SLOT3),A ; - LD A,(SYS_PAGE.CURRENT_DIR_HDD) + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE) CP H JR NZ,.exit_Res_Dir @@ -229,32 +243,6 @@ RESTORE_CURRENT_DIR: POP AF RET ; - - -; [x] new tr-hdd -; TO INIT by SPECTRUM.EXE: -; .CURRENT_DIR_SEC_L EQU #C196 ; word -; .CURRENT_DIR_SEC_H EQU #C198 ; word -; .CURRENT_DIR_HDD EQU #C19A -; .CURRENT_HDD EQU #C12D - -; CORRECT_CUR_DIR: -; DI -; IN A,(SLOT3) -; LD C,A -; LD A,SYS_PAGE -; OUT (SLOT3),A -; LD A,#FF -; JR C,.skip -; LD (SYS_PAGE.CURRENT_HDD),A -; .skip: INC A -; LD H,A -; LD L,A -; LD (SYS_PAGE.CURRENT_DIR_SEC_L),HL -; LD (SYS_PAGE.CURRENT_DIR_SEC_H),HL -; LD A,C -; OUT (SLOT3),A -; RET ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 119dcea..2798900 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -530,9 +530,10 @@ CALC_CLAST: ; HL - EX DE,HL LD BC,0 - - LD HL,0 - LD IX,0 + LD H,B + LD L,B + LD HX,B + LD LX,B CALC_CL_LP: ADD IX,DE diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index f4a9407..bb2e306 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -319,7 +319,6 @@ CLAST_TO_SEC_L2: LD B,L LD A,H POP HL - RET diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 663be83..c51e05b 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -247,7 +247,7 @@ MSD_3F15: OUT (SLOT3),A AND A JR Z,NO_OFF_SCR - LD A,0C0H + LD A,#C0 OUT (RGADR),A NO_OFF_SCR: LD IX,MSD_RET_ADR @@ -443,7 +443,6 @@ READ_BPB: JP .ERROR_MSDOS ; .HDD: CALL .MAIN - CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC ; old hdd LD IX,0 @@ -455,14 +454,13 @@ READ_BPB: CALL MSD_R_W_UT ; CALL .PARAMS - CALL NC,RESTORE_CURRENT_DIR ; [x] new tr-hdd RET NC JP .ERROR_MSDOS ; -.MAIN: LD A,SYS_PAGE - LD HL,SYS_PAGE.MS_BPB - LD C,TRDOS_ROM_CMD.READ_BPB - CALL MSD_R_W_UT +.MAIN: LD A,SYS_PAGE + LD HL,SYS_PAGE.MS_BPB + LD C,TRDOS_ROM_CMD.READ_BPB + CALL MSD_R_W_UT ;CALL BPB_PARAMS ;RET @@ -528,7 +526,6 @@ READ_BPB: LD (SYS_PAGE.MSD_SECS),A ; BIT 7,H - ; LD IX,0 ; LD HL,0 ; вычислить начальный сектор FAT ; JR Z,.NO_LD_SPECIAL @@ -559,8 +556,6 @@ READ_BPB: LD (SYS_PAGE.MSD_CAT_SEC),IX ; начальный сектор DIR LD (SYS_PAGE.MSD_CAT_SEC2),HL ; начальный сектор DIR - ; A=0 - LD BC,(SYS_PAGE.MS_BPB+SEC_SIZE) ; Размер сектора LD A,B RL C @@ -600,24 +595,23 @@ READ_BPB: ; D = 0 LD H,D LD L,D + LD E,D LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) LD D,A XOR A .NEXT_ADD3: ADD HL,BC ; Вычисление длины кластера - ADC A,0 + ADC A,E DEC D JR NZ,.NEXT_ADD3 LD (SYS_PAGE.CLASTER_LEN),HL - ; D = 0 - LD B,D + LD B,E LD C,A LD (SYS_PAGE.CLASTER_LEN2),BC - - ; D = 0 - LD H,D - LD L,D + ; + ; DE=0 + EX DE,HL ;LD HL,0 LD BC,(SYS_PAGE.MS_BPB+S_P_T) LD A,(SYS_PAGE.MS_BPB+H_P_S) .BPB_L1:; ВЫЧИСЛИТЬ КОЛИЧЕСТВО СЕКТОРОВ НА ЦИЛИНДР @@ -628,8 +622,9 @@ READ_BPB: ; EX AF,AF' OUT (SLOT3),A - EI + CALL RESTORE_CURRENT_DIR ; [x] new tr-hdd AND A + EI RET .ERROR_BPB: EX AF,AF' From f425c0db58cc6efdac6cdcd5b0ce70fc3018e473 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 21 Jul 2024 01:15:33 +1000 Subject: [PATCH 093/114] ... --- SP_TRDOS.ASM | 25 ++++++++++--------------- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 6 +++--- TRDOS/TR_MSD_2.ASZ | 18 +++++++++++++++--- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index a46e3f2..d18c351 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -7063,27 +7063,22 @@ AUTO_3FEC: ;[x]] поправлены номера функций при вызовах API и прыгает сразу в BIOS через #3FF8 ;-------[ From TR-DOS to API 4x ]------- _mInfoBLOCK #3FF0-$, #FF -HD_CMD: PUSH AF - DI - LD A,SYS_PORT.EXTENSION - OUT (SYS_PORT.ROM),A - POP AF - RET +HD_CMD: PUSH AF + DI + LD A,SYS_PORT.EXTENSION + OUT (SYS_PORT.ROM),A + POP AF + RET ;--------------------------------------- ; ;----[ From TR-DOS to API #80..#FF]----- _mInfoBLOCK #3FF8-$, #FF -EXP_FNS:;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;PUSH AF - ;DI ;!TODO подумать, как сохранять состояние прерываний и ничего не сломать - ;XOR A ; SYS_PORT.BIOS - JP EXP_FNS_PREPARE +EXP_FNS: JP EXP_FNS_PREPARE EXP_FNS_PREPARE_RET: - ; - OUT (SYS_PORT.ROM),A - POP AF - RET + OUT (SYS_PORT.ROM),A + POP AF + RET ;--------------------------------------- ; diff --git a/Shared_Includes b/Shared_Includes index 7e812bc..1799727 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 7e812bc0267db168c5a5b17780e567a7a01cd927 +Subproject commit 17997278e4aea455a68532547beb561fd216ad19 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index e953485..8624673 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -160,11 +160,11 @@ CHOOSE_HDD: OUT (SLOT3),A ; ; - XOR A - LD C,A ; обнулить C + ;XOR A + LD C,0 ; обнулить C LD A,B ;OR #40 - LD B,A + ;LD B,A ; ; PUSH AF ; LD A,(ZX_VARS.OPER_DISK) diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 2798900..9f5dbc3 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -323,11 +323,23 @@ END_TAB: LD (ZX_VARS.CONT_DISK),A LD B,A LD A,(ZX_VARS.PDOS_COPY) - AND 7CH + AND #7C OR B LD (ZX_VARS.PDOS_COPY),A OUT (FDC_93.DrvCTRL),A - JP AUTO_03E1 + ; [ ] 19/07/2024 на каждый диск трдос свой раздел hdd можно замапить + LD C,BIOS.GET_DISK_REDIR + CALL EXP_FNS + CP #40 + JR C,.exit + ; + AND #0F + LD C,BIOS.HDD_PART + CALL EXP_FNS + ;LD HL,MSG_3 + ;CALL C,AUTO_03C3 + ; +.exit: JP AUTO_03E1 END_TAB2: SUB 4 @@ -626,7 +638,7 @@ SPR_1: LD A,(DE) RET NZ LD C,BIOS.RST_CONF.SP97_2 SP_1: LD A,(DE) - CP #21 + CP " "+1 CCF RET C CALL EXP_FNS From af768168498350fce29f1e5adea5d3ddb62280c5 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 21 Jul 2024 01:18:02 +1000 Subject: [PATCH 094/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 1799727..93ab939 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 17997278e4aea455a68532547beb561fd216ad19 +Subproject commit 93ab93917db326a86a0ffecc02a62f6f6ef7a938 From 940920ff5fe7f2765000c737a65630f7db54b75c Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 21 Jul 2024 04:46:30 +1000 Subject: [PATCH 095/114] fixed bug with EI in TR_RMD_S.asm fixed bug with no error message for "/rmd" in RAMD_SET --- SP_TRDOS.ASM | 50 +++++++++++++++++++++++----------------------- TRDOS/TR_MSD_2.ASZ | 21 ++++++++++--------- TRDOS/TR_MSD_3.ASZ | 24 ++++++++++++---------- TRDOS/TR_MSD_S.ASZ | 19 +++++++++--------- TRDOS/TR_RMD_S.ASZ | 17 ++++++++-------- 5 files changed, 68 insertions(+), 63 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index d18c351..8f2b97c 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -174,7 +174,7 @@ RET_1: INC HL LD (ZX_VARS.UDG),HL DEC HL - LD BC,AUTO_0540 + LD BC,AUTO_0540 ;!FIXIT check disasm LD (ZX_VARS.ERR_BEEP),BC LD (ZX_VARS.TOP_CLEAR),HL LD HL,#3C00 @@ -193,8 +193,8 @@ RET_1: LD HL,ZX_VARS.BEG_ADRESS AUTO_00A8: LD (ZX_VARS.CHANS),HL - LD DE,AUTO_15AF - LD BC,15h + LD DE,#15AF ;!HARDCODE адрес области описателей каналов в ПЗУ бейсика + LD BC,#15 EX DE,HL CALL AUTO_0117 EX DE,HL @@ -206,9 +206,7 @@ AUTO_00A8: LD (HL),128 INC HL LD (ZX_VARS.E_LINE),HL - DB 54 -AUTO_00C8: - DEC C + LD (HL),"\r" INC HL LD (HL),128 INC HL @@ -223,7 +221,7 @@ AUTO_00C8: LD (ZX_VARS.KEY_TIME),HL DEC (IY-58) DEC (IY-54) - LD HL,015C6h + LD HL,#15C6 LD DE,ZX_VARS.REP_K_TYME LD BC,14 CALL AUTO_0117 @@ -413,7 +411,7 @@ AUTO_0239: ; CP 244 JR Z,AUTO_0271 LD HL,AUTO_1000 -AUTO_0270: +;AUTO_0270: RST PRINT_LN AUTO_0271: LD A,(ZX_VARS.PRINTER_BUFFER) @@ -439,7 +437,7 @@ AUTO_0280: INC HL LD (HL),'"' INC HL -CMD_NEW_EXEC: +CMD_NEW_EXEC:;!TODO LD (ZX_VARS.K_CUR),HL LD (HL),13 INC HL @@ -562,6 +560,8 @@ AUTO_0359: ; DB " ",0,0 ;----------------------------------------------------------------------- + + AUTO_03AC: CALL AUTO_03FD CALL PRINT_CR @@ -571,7 +571,7 @@ AUTO_03B5: CALL AUTO_1DA9 LD HL,AUTO_29D2 RST PRINT_LN -AUTO_03C0: +;AUTO_03C0: JP AUTO_01D3 AUTO_03C3: PUSH AF @@ -768,6 +768,7 @@ AUTO_0507: LD DE,RST10 ADD HL,DE RET + AUTO_050C: PUSH HL PUSH BC @@ -777,6 +778,7 @@ AUTO_050C: POP BC POP HL RET + AUTO_0517: LD HL,ZX_VARS.CAT_SEC INC (HL) @@ -1019,7 +1021,7 @@ AUTO_06F3: CALL SET_DISK CALL AUTO_05B4 JP NZ,AUTO_03E1 -AUTO_0716: +;AUTO_0716: CALL AUTO_165D LD HL,ZX_VARS.FL_START LD DE,ZX_VARS.VAR_2 @@ -1251,7 +1253,7 @@ AUTO_1052: PUSH DE AUTO_1056: RST_ROM ROUTINE.key_scan -AUTO_1059: +;AUTO_1059: LD C,0 JR NZ,AUTO_1056 RST_ROM ROUTINE.key_test @@ -1570,7 +1572,7 @@ AUTO_12D9: PUSH HL LD BC,8 ADD HL,BC -AUTO_1303: +;AUTO_1303: LD A,(HL) CP 'B' CALL Z,AUTO_131B @@ -1887,7 +1889,6 @@ AUTO_1575: LD DE,CONT_1 LD (ZX_VARS.CONT_SEC),DE CALL AUTO_1E43 -AUTO_15AF: JP AUTO_03E1 AUTO_15B2: LD HL,(ZX_VARS.FL_TYPE) @@ -2465,7 +2466,7 @@ CMD_MERGE: PUSH BC INC BC RST_ROM ROUTINE.bc_spaces -AUTO_19D1: +;AUTO_19D1: LD (HL),128 EX DE,HL POP DE @@ -2955,6 +2956,7 @@ AUTO_1D25: ERR_EXIT: CALL AUTO_03C3 JP AUTO_01D3 + AUTO_1D2F: LD A,(ZX_VARS.ERR_NR) LD HL,AUTO_27CA @@ -3014,8 +3016,10 @@ OPEN_CH2: JR AUTO_1D84 AUTO_1D8C: RST_ROM ROUTINE.get_char -AUTO_1D8F: +;AUTO_1D8F: RET + +GET_CMD: CALL OPEN_CH0 RST_ROM ROUTINE.editor RET @@ -3363,11 +3367,7 @@ AUTO_2000: ; OUT (FDC_93.Command),A ; LD HL,(ZX_VARS.FL_START) ; LD C,127 - - -;//////////////////////////////////// - -AUTO_2007: +;AUTO_2007: LD B,3Eh ; первый пробел LD D,'N' CALL AUTO_20B1 @@ -3523,7 +3523,7 @@ AUTO_2113: LD C,(HL) LD A,(DE) LD (HL),A -AUTO_2116: +;AUTO_2116: LD A,C LD (DE),A INC HL @@ -3563,7 +3563,7 @@ INPUT_LINE: RST RST10 LD (IY+0),255 EI - JP EDIT_X00 + JP EDIT_X00 ;!FIXIT зачем вместо #1D90 EDIT_X00??? AUTO_2158: CALL BASIC_RST20 CALL AUTO_1D8C @@ -4780,7 +4780,7 @@ AUTO_2A4B: OUT (C),A RET MAGIC_2: -AUTO_2A56: +;AUTO_2A56: PUSH AF PUSH BC PUSH DE @@ -6299,7 +6299,7 @@ EDIT_RET: LD (HL),80H RET -EDIT_X00: +EDIT_X00: ;!FIXIT зачем вместо #1D90 EDIT_X00??? RES 5,(IY+1) RST RST20 ; ввод клавиши DW 15D4h diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 9f5dbc3..c7474c8 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -14,7 +14,7 @@ MSDOS_FIND_FILE: FIND_LOOP_ALL: CALL MSDOS_KOMP_FL RET Z ; ВОЗВРАТ - ФАЙЛ НАЙДЕН !! -MSDOS_FIND_NEXT: +;MSDOS_FIND_NEXT: CALL MSDOS_NEXT_FL JR NC,FIND_LOOP_ALL RET @@ -283,7 +283,7 @@ LOOP_FIND: INC HL DJNZ LOOP_FIND LD A,(DE) - CP 13 + CP "\r" JR Z,CMD_EXE1 CP ' ' JR Z,CMD_EXE @@ -353,7 +353,7 @@ END_TAB3: JP LOAD_RMD_XX MSD_ERR: - LD HL,MSDOS_MSG + LD HL,MSDOS_MSG ; File not found... JP AUTO_03E4 ;************************************ @@ -391,7 +391,7 @@ SAVE_RMD: JP C,MSD_ERR ; A - номер первого блока JP Z,MSD_ERR - LD HL,0C000H + LD HL,#C000 CALL MSDOS_WRITE_FILE JP AUTO_03E1 @@ -573,11 +573,14 @@ CALC_CL_LP: POP BC RET -HD_TX: DC ' ERR_HD ' -HD_TX2: DC 'HDD not found ' -MSG_3: DC 'ERROR... ' -MSDOS_MSG: DC 'File not found... ' -NO_MEMORY: DC 'No RAM-Disk MEM ' + +HD_TX: DC ' - HDD error' +;HD_TX: DC 'HDD error #' +HD_TX2: DC 'HDD not found' +MSG_3: DC '*ERROR*' +MSDOS_MSG: DC 'File not found' +NO_MEMORY: DC 'Out of memory' +;NO_MEMORY: DC 'No RAM-Disk MEM' WORDS: DB 5,'CLEAR' ; очистить RAM-Disk DW CLEAR_RAMD_X diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index bb2e306..4e676f6 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -276,14 +276,15 @@ SKEEP_XX1: POP IX RET ;***************************************** -MADE_next_blk: - PUSH BC - LD C,BIOS.GetMemPageNext - CALL EXP_FNS - POP BC - INC L ; SET ZF, if END BLK !!! - LD HL,#C000 - RET +;!TODO посмотреть +; MADE_next_blk: +; PUSH BC +; LD C,BIOS.GetMemPageNext +; CALL EXP_FNS +; POP BC +; INC L ; SET ZF, if END BLK !!! +; LD HL,#C000 +; RET ;***************************************** CLAST_TO_SEC: @@ -431,7 +432,7 @@ FAT_HALF: FAT_16_L2: CP B JR NZ,NO_END_CLAST -FAT_ALL: +;FAT_ALL: LD A,C CP #F0 JR C,NO_END_CLAST @@ -469,8 +470,9 @@ NO_END_CLAST: AND A RET -ERROR_FAT: - LD HL,MSG_3 ; ERROR +ERROR_MSG: + LD HL,MSG_3 ; ERROR msg + ;LD HL,AUTO_29B2 ; ERROR msg JP AUTO_03E4 ;********************************************** diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index c51e05b..5901d72 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -273,8 +273,7 @@ MSD_RET_ADR: LD B,A AND 127 RET Z - -MSD_3F39: +;MSD_3F39: LD HL,READ_ONLY_MSG AND '@' JR NZ,MSD_3F4B @@ -434,13 +433,13 @@ READ_BPB: CP #40 JR NC,.HDD CP 4 - JP NC,.ERROR_MSDOS + JP NC,ERROR_MSG ; CALL SET_DISK ; CALL .MAIN RET NC - JP .ERROR_MSDOS + JP ERROR_MSG ; .HDD: CALL .MAIN RET NC @@ -455,7 +454,7 @@ READ_BPB: ; CALL .PARAMS RET NC - JP .ERROR_MSDOS + JP ERROR_MSG ; .MAIN: LD A,SYS_PAGE LD HL,SYS_PAGE.MS_BPB @@ -633,9 +632,9 @@ READ_BPB: EI RET ; -.ERROR_MSDOS: - LD HL,MSG_3 - JP AUTO_03E4 +; .ERROR_MSDOS: +; LD HL,MSG_3 +; JP AUTO_03E4 ; .FAT1_MSG: DB 'FAT1' @@ -758,13 +757,13 @@ PRINT_HEX_SYM: PUSH HL PUSH DE PUSH BC - AND 0FH + AND #0F ADD A,'0' CP '9'+1 JR C,NO_ADD ADD A,7 NO_ADD: - RST 10H + RST #10 POP BC POP DE POP HL diff --git a/TRDOS/TR_RMD_S.ASZ b/TRDOS/TR_RMD_S.ASZ index 73ea1d2..9f39e1f 100644 --- a/TRDOS/TR_RMD_S.ASZ +++ b/TRDOS/TR_RMD_S.ASZ @@ -38,15 +38,15 @@ RECALL_RAMD: JR Z,ERROR_DISK JP READ_WRITE_RAMD -RECALL_MSD: - JR ERROR_DISK ; переход на ошибку диска +; RECALL_MSD: +; JR ERROR_DISK ; переход на ошибку диска TEST_RAMD: PUSH HL LD C,BIOS.GET_RAMD_ST CALL EXP_FNS ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI + EI ; POP HL RET @@ -60,7 +60,7 @@ RAMD_X12: ; CP 20 RET C ; JR C,RAMD_TEST -NO_DISK2: +;NO_DISK2: JP AUTO_3EE7 ; NO_DISK X_AUTO_3DCE: @@ -145,7 +145,7 @@ CLEAR_RAMD_X: RET NZ CLEAR_RAMD: CALL DISK_REDIR -CLEAR_NEXT: +;CLEAR_NEXT: SUB 4 RET C CP SYS_PAGE.RAMD_KEYS.NUM @@ -176,7 +176,7 @@ GET_RAM_BLK: ;EI ; RET NC -NO_MEM: +;NO_MEM: LD HL,NO_MEMORY JP ERR_EXIT @@ -198,7 +198,8 @@ FDD_SET: RAMD_SET: CALL RAMD_SYM - RET C + ;RET C + JP C,ERROR_MSG RAMD_SET1: PUSH AF LD A,(ZX_VARS.OPER_DISK) @@ -221,7 +222,7 @@ RAMD_SYM: CP 'E' RET C SUB 'E' - CP 16 + CP SYS_PAGE.RAMD_KEYS.NUM CCF RET C PUSH AF From 4f3a666ccd76f4abe4c5dd2523457d47b2e99809 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 29 Jul 2024 03:52:15 +1000 Subject: [PATCH 096/114] ... --- TRDOS/TR_HDD_4.ASZ | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 8624673..0149b0d 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -181,8 +181,8 @@ CHOOSE_HDD: PUSH BC LD BC,(ZX_VARS.OPER_DISK - 1) ; LD B,A - ; XOR A - LD C,BIOS.HDD_TO_DRV + ; XOR A + LD C,BIOS.HDD_TO_DRV CALL EXP_FNS POP AF RET From 2296db6969715cee7e09d081d6609c5772be7296 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 29 Jul 2024 03:52:30 +1000 Subject: [PATCH 097/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 93ab939..4662474 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 93ab93917db326a86a0ffecc02a62f6f6ef7a938 +Subproject commit 4662474034c70f4b2627ff8eca10ccdf4a7d3525 From 6c1a9a6d66d97d19d2bb72a48b2e9f2b95c965a8 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 19 Aug 2024 05:14:10 +1000 Subject: [PATCH 098/114] ... --- Shared_Includes | 2 +- ZX_EXP/EXP_FN2.ASM | 2 +- ZX_EXP/EXP_HDD.ASM | 4 +- ZX_EXP/EXP_SCR.ASM | 249 ++++++++++++++++++++++----------------------- 4 files changed, 127 insertions(+), 130 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 4662474..aca9ce3 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 4662474034c70f4b2627ff8eca10ccdf4a7d3525 +Subproject commit aca9ce3f859bf53c76b0d710e108543226697f91 diff --git a/ZX_EXP/EXP_FN2.ASM b/ZX_EXP/EXP_FN2.ASM index ea1afb7..601d219 100644 --- a/ZX_EXP/EXP_FN2.ASM +++ b/ZX_EXP/EXP_FN2.ASM @@ -715,7 +715,7 @@ INIT_SYS_ALL: LD DE,CNF_0 LD (CONFIG_DE-4000h),DE - LD HL,TASK_DATA-4000h ; убить все задачи + LD HL,TASK_DATA-4000h ; убить все задачи ;SYS_PAGE.CURRENT_TASK LD DE,TASK_DATA+1-4000h LD BC,0FFH LD (HL),0 diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index eb89e41..f7903e6 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -220,7 +220,7 @@ HD_RD_CONT2: LD A,(HL) OUT (SLOT3),A EX AF,AF' - LD HL,0C000H + LD HL,#C000 JR HD_RD_L2 ;*********************************************** @@ -321,7 +321,7 @@ HD_WR_LOOP: OUT (SLOT3),A EX AF,AF' - LD HL,0C000H + LD HL,#C000 JR HD_WR_L2 ;******************************************************** diff --git a/ZX_EXP/EXP_SCR.ASM b/ZX_EXP/EXP_SCR.ASM index 7bbe1f7..76cb825 100644 --- a/ZX_EXP/EXP_SCR.ASM +++ b/ZX_EXP/EXP_SCR.ASM @@ -33,16 +33,15 @@ PIC_S MACRO pg,cnt,adr ALIGN 8 LP_SCR_MNU: ; -; LP_S 040h,14,040E7H -; -; LP_S 040h,14,04807H -; LP_S 040h,14,04827H -; LP_S 040h,14,04847H -; LP_S 040h,14,04867H -; LP_S 040h,14,04887H -; LP_S 040h,14,048A7H -; LP_S 040h,14,048C7H -; LP_S 040h,14,048E7H +; LP_S %0100'0000,14,#40E7 +; LP_S %0100'0000,14,#4807 +; LP_S %0100'0000,14,#4827 +; LP_S %0100'0000,14,#4847 +; LP_S %0100'0000,14,#4867 +; LP_S %0100'0000,14,#4887 +; LP_S %0100'0000,14,#48A7 +; LP_S %0100'0000,14,#48C7 +; LP_S %0100'0000,14,#48E7 ; ; DEFB 0FFh,0,0,0 @@ -50,43 +49,43 @@ LP_SCR_80: DB 40,32,0,0,1BH,0,0,0 DB 0,0,0,0,0,0,0,0 -; LP_S 01100010B,40,4000H -; LP_S 01100010B,40,4028H -; LP_S 01100010B,40,4050H -; LP_S 01100010B,40,4078H -; LP_S 01100010B,40,40A0H -; LP_S 01100010B,40,40C8H +; LP_S %0110'0010,40,4000H +; LP_S %0110'0010,40,4028H +; LP_S %0110'0010,40,4050H +; LP_S %0110'0010,40,4078H +; LP_S %0110'0010,40,40A0H +; LP_S %0110'0010,40,40C8H ; -; LP_S 01100010B,40,4800H -; LP_S 01100010B,40,4828H -; LP_S 01100010B,40,4850H -; LP_S 01100010B,40,4878H -; LP_S 01100010B,40,48A0H -; LP_S 01100010B,40,48C8H +; LP_S %0110'0010,40,4800H +; LP_S %0110'0010,40,4828H +; LP_S %0110'0010,40,4850H +; LP_S %0110'0010,40,4878H +; LP_S %0110'0010,40,48A0H +; LP_S %0110'0010,40,48C8H ; -; LP_S 01100010B,40,5000H -; LP_S 01100010B,40,5028H -; LP_S 01100010B,40,5050H -; LP_S 01100010B,40,5078H -; LP_S 01100010B,40,50A0H -; LP_S 01100010B,40,50C8H +; LP_S %0110'0010,40,5000H +; LP_S %0110'0010,40,5028H +; LP_S %0110'0010,40,5050H +; LP_S %0110'0010,40,5078H +; LP_S %0110'0010,40,50A0H +; LP_S %0110'0010,40,50C8H ; -; LP_S 01100100B,40,4000H -; LP_S 01100100B,40,4028H -; LP_S 01100100B,40,4050H -; LP_S 01100100B,40,4078H -; LP_S 01100100B,40,40A0H -; LP_S 01100100B,40,40C8H +; LP_S %0110'0100,40,4000H +; LP_S %0110'0100,40,4028H +; LP_S %0110'0100,40,4050H +; LP_S %0110'0100,40,4078H +; LP_S %0110'0100,40,40A0H +; LP_S %0110'0100,40,40C8H ; -; LP_S 01100100B,40,4800H -; LP_S 01100100B,40,4828H -; LP_S 01100100B,40,4850H -; LP_S 01100100B,40,4878H -; LP_S 01100100B,40,48A0H -; LP_S 01100100B,40,48C8H +; LP_S %0110'0100,40,4800H +; LP_S %0110'0100,40,4828H +; LP_S %0110'0100,40,4850H +; LP_S %0110'0100,40,4878H +; LP_S %0110'0100,40,48A0H +; LP_S %0110'0100,40,48C8H ; -; LP_S 01100100B,40,5000H -; LP_S 01100100B,40,5028H +; LP_S %0110'0100,40,5000H +; LP_S %0110'0100,40,5028H ; ; DEFB 0FFh,0,0,0 ; @@ -94,43 +93,43 @@ LP_SCR_40: DB 40,32,0,0,7BH,0,0,0 DB 0,0,0,0,0,0,0,0 ; -; LP_S 01000100B,40,5050H -; LP_S 01000100B,40,5078H -; LP_S 01000100B,40,50A0H -; LP_S 01000100B,40,50C8H +; LP_S %0100'0100,40,5050H +; LP_S %0100'0100,40,5078H +; LP_S %0100'0100,40,50A0H +; LP_S %0100'0100,40,50C8H ; -; LP_S 01000110B,40,4000H -; LP_S 01000110B,40,4028H -; LP_S 01000110B,40,4050H -; LP_S 01000110B,40,4078H -; LP_S 01000110B,40,40A0H -; LP_S 01000110B,40,40C8H +; LP_S %0100'0110,40,4000H +; LP_S %0100'0110,40,4028H +; LP_S %0100'0110,40,4050H +; LP_S %0100'0110,40,4078H +; LP_S %0100'0110,40,40A0H +; LP_S %0100'0110,40,40C8H ; -; LP_S 01000110B,40,4800H -; LP_S 01000110B,40,4828H -; LP_S 01000110B,40,4850H -; LP_S 01000110B,40,4878H -; LP_S 01000110B,40,48A0H -; LP_S 01000110B,40,48C8H +; LP_S %0100'0110,40,4800H +; LP_S %0100'0110,40,4828H +; LP_S %0100'0110,40,4850H +; LP_S %0100'0110,40,4878H +; LP_S %0100'0110,40,48A0H +; LP_S %0100'0110,40,48C8H ; -; LP_S 01000110B,40,5000H -; LP_S 01000110B,40,5028H -; LP_S 01000110B,40,5050H -; LP_S 01000110B,40,5078H -; LP_S 01000110B,40,50A0H -; LP_S 01000110B,40,50C8H +; LP_S %0100'0110,40,5000H +; LP_S %0100'0110,40,5028H +; LP_S %0100'0110,40,5050H +; LP_S %0100'0110,40,5078H +; LP_S %0100'0110,40,50A0H +; LP_S %0100'0110,40,50C8H ; -; LP_S 01001000B,40,4000H -; LP_S 01001000B,40,4028H -; LP_S 01001000B,40,4050H -; LP_S 01001000B,40,4078H -; LP_S 01001000B,40,40A0H -; LP_S 01001000B,40,40C8H +; LP_S %0100'1000,40,4000H +; LP_S %0100'1000,40,4028H +; LP_S %0100'1000,40,4050H +; LP_S %0100'1000,40,4078H +; LP_S %0100'1000,40,40A0H +; LP_S %0100'1000,40,40C8H ; -; LP_S 01001000B,40,4800H -; LP_S 01001000B,40,4828H -; LP_S 01001000B,40,4850H -; LP_S 01001000B,40,4878H +; LP_S %0100'1000,40,4800H +; LP_S %0100'1000,40,4828H +; LP_S %0100'1000,40,4850H +; LP_S %0100'1000,40,4878H ; ; DEFB 0FFh,0,0,0 ; @@ -138,68 +137,66 @@ LP_SCR_32: DB 32,24,4,4,30H,1,0,0 DB 0,0,0,0,0,0,0,0 ; -; LP_S 040h,32,04000H -; LP_S 040h,32,04020H -; LP_S 040h,32,04040H -; LP_S 040h,32,04060H -; LP_S 040h,32,04080H -; LP_S 040h,32,040A0H -; LP_S 040h,32,040C0H -; LP_S 040h,32,040E0H +; LP_S %040h',32,4000H +; LP_S %040h',32,4020H +; LP_S %040h',32,4040H +; LP_S %040h',32,4060H +; LP_S %040h',32,4080H +; LP_S %040h',32,40A0H +; LP_S %040h',32,40C0H +; LP_S %040h',32,40E0H ; -; LP_S 040h,32,04800H -; LP_S 040h,32,04820H -; LP_S 040h,32,04840H -; LP_S 040h,32,04860H -; LP_S 040h,32,04880H -; LP_S 040h,32,048A0H -; LP_S 040h,32,048C0H -; LP_S 040h,32,048E0H +; LP_S %040h',32,4800H +; LP_S %040h',32,4820H +; LP_S %040h',32,4840H +; LP_S %040h',32,4860H +; LP_S %040h',32,4880H +; LP_S %040h',32,48A0H +; LP_S %040h',32,48C0H +; LP_S %040h',32,48E0H ; -; LP_S 040h,32,05000H -; LP_S 040h,32,05020H -; LP_S 040h,32,05040H -; LP_S 040h,32,05060H -; LP_S 040h,32,05080H -; LP_S 040h,32,050A0H -; LP_S 040h,32,050C0H -; LP_S 040h,32,050E0H -; -; LP_S 0FFh,0,0 +; LP_S %040h',32,5000H +; LP_S %040h',32,5020H +; LP_S %040h',32,5040H +; LP_S %040h',32,5060H +; LP_S %040h',32,5080H +; LP_S %040h',32,50A0H +; LP_S %040h',32,50C0H +; LP_S %040h',32,50E0H ; +; LP_S %0FFh',0,0; LP_SCR_64: DB 32,24,4,4,9BH,0,0,0 DB 0,0,0,0,0,0,0,0 ; -; LP_S 06Ah,32,04000H -; LP_S 06Ah,32,04020H -; LP_S 06Ah,32,04040H -; LP_S 06Ah,32,04060H -; LP_S 06Ah,32,04080H -; LP_S 06Ah,32,040A0H -; LP_S 06Ah,32,040C0H -; LP_S 06Ah,32,040E0H +; LP_S %06Ah',32,4000H +; LP_S %06Ah',32,4020H +; LP_S %06Ah',32,4040H +; LP_S %06Ah',32,4060H +; LP_S %06Ah',32,4080H +; LP_S %06Ah',32,40A0H +; LP_S %06Ah',32,40C0H +; LP_S %06Ah',32,40E0H ; -; LP_S 06Ah,32,04800H -; LP_S 06Ah,32,04820H -; LP_S 06Ah,32,04840H -; LP_S 06Ah,32,04860H -; LP_S 06Ah,32,04880H -; LP_S 06Ah,32,048A0H -; LP_S 06Ah,32,048C0H -; LP_S 06Ah,32,048E0H +; LP_S %06Ah',32,4800H +; LP_S %06Ah',32,4820H +; LP_S %06Ah',32,4840H +; LP_S %06Ah',32,4860H +; LP_S %06Ah',32,4880H +; LP_S %06Ah',32,48A0H +; LP_S %06Ah',32,48C0H +; LP_S %06Ah',32,48E0H ; -; LP_S 06Ah,32,05000H -; LP_S 06Ah,32,05020H -; LP_S 06Ah,32,05040H -; LP_S 06Ah,32,05060H -; LP_S 06Ah,32,05080H -; LP_S 06Ah,32,050A0H -; LP_S 06Ah,32,050C0H -; LP_S 06Ah,32,050E0H +; LP_S %06Ah',32,5000H +; LP_S %06Ah',32,5020H +; LP_S %06Ah',32,5040H +; LP_S %06Ah',32,5060H +; LP_S %06Ah',32,5080H +; LP_S %06Ah',32,50A0H +; LP_S %06Ah',32,50C0H +; LP_S %06Ah',32,50E0H ; -; LP_S 0FFh,0,0 - +; LP_S %0FFh',0,0 PIC_320X256_1: DB 40,32,0,0,20H,0,8,0 DB 0,0,0,0,0,0,0,0 From a170bf4abc3ae87edd18eac8f3464453dd848430 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 24 Aug 2024 04:20:18 +1000 Subject: [PATCH 099/114] fix cmd /hdd --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 117 ++++++++++++++++++++++++++------------------- TRDOS/TR_MSD_2.ASZ | 29 ++++++----- TRDOS/TR_MSD_3.ASZ | 2 +- TRDOS/TR_MSD_S.ASZ | 2 +- ZX_EXP/EXP_FN2.ASM | 2 +- ZX_EXP/EXP_HDD.ASM | 4 +- 7 files changed, 87 insertions(+), 71 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index aca9ce3..e9d481a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit aca9ce3f859bf53c76b0d710e108543226697f91 +Subproject commit e9d481a5565338505710b08e50d22a8579c400be diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 0149b0d..f6ce3d4 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -56,56 +56,73 @@ HDD_PROG_E: ; HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP " " - JR Z,.loop - CP "\r" - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ;CALL CHOOSE_HDD - ;CALL READ_BPB - ;RET - ; +.loop: LD A,(DE) + INC DE + CP " " + JR Z,.loop + CP "\r" + JR Z,.init + ; + DEC DE + DEC DE + JP CHOOSE_HDD + ;CALL CHOOSE_HDD + ;CALL READ_BPB + ;RET + ; ; [x] new tr-hdd -.init: ;CALL CORRECT_CUR_DIR - DI - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - ; - LD E,DRIVE_CODES.TRDOS.HDD - LD A,(SYS_PAGE.CURRENT_DIR_DRIVE_COPY) - CP #FF - JR Z,.skip - ; - CP E - JR C,.skip - LD (SYS_PAGE.CURRENT_DIR_DRIVE),A - ; - AND #0F - LD (SYS_PAGE.CURRENT_HDD),A - ; -.skip: LD A,C - OUT (SLOT3),A - ; - PUSH DE - LD C,BIOS.HDD_INIT - CALL EXP_FNS - POP DE - JP C,HDD_PROG_E - ; - ; LD BC,(ZX_VARS.OPER_DISK - 1) - ; LD A,(ZX_VARS.OPER_DISK) - ; LD B,A - ; XOR A - ;LD E,A - LD C,BIOS.SET_DISK_REDIR - JP EXP_FNS +.init: ;CALL CORRECT_CUR_DIR + DI + LD BC,SLOT3 + IN B,(C) + ;LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + ; + LD E,DRIVE_CODES.TRDOS.HDD + LD A,(SYS_PAGE.CURRENT_DIR_DRIVE_COPY) + CP #FF + SCF + JR Z,.skip + ; + CP E + JR C,.skip + LD (SYS_PAGE.CURRENT_DIR_DRIVE),A + ; + AND #0F + ; !TEST + OUT (C),B + ; + PUSH DE + LD C,BIOS.HDD_PART + CALL EXP_FNS + POP DE + JR C,CHOOSE_HDD.error + ; + LD C,BIOS.SET_DISK_REDIR + JP EXP_FNS + ; + ;LD (SYS_PAGE.CURRENT_HDD),A + ; + ; +;.skip: LD A,C +; OUT (SLOT3),A +.skip: OUT (C),B + ; + PUSH DE + LD C,BIOS.HDD_INIT + CALL EXP_FNS + POP DE + JP C,HDD_PROG_E + ; + ; LD BC,(ZX_VARS.OPER_DISK - 1) + ; LD A,(ZX_VARS.OPER_DISK) + ; LD B,A + ; XOR A + ;LD E,A + LD C,BIOS.SET_DISK_REDIR + JP EXP_FNS + ;[x] 29/01/2024 ;выход: A: bit1 - Primary/Secondary, bit0 - master/slave, bit2..3: использующийся раздел в MBR @@ -137,7 +154,7 @@ CHOOSE_HDD: SUB "0" OR C ; - PUSH AF +.part: PUSH AF LD C,BIOS.HDD_PART CALL EXP_FNS POP BC diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index c7474c8..4c74a04 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -129,23 +129,22 @@ MSDOS_NEXT_FL: ;********************************** MSDOS_CAT: - PUSH DE + PUSH DE CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD A,"\r" - RST #10 - POP DE ; СТРОКА ПОСЛЕ CAT - -CAT_SPACES: - LD A,(DE) - CP " " - JR NZ,CAT_NO_SPACE - INC DE - JR CAT_SPACES -CAT_NO_SPACE: - CP "\r" - JR NZ,CAT_ALL - LD DE,CAT_FILES + LD A,"\r" + RST #10 + POP DE ; СТРОКА ПОСЛЕ CAT +.loop: LD A,(DE) + CP " " + ;JR NZ,CAT_NO_SPACE + INC DE + JR Z,.loop + DEC DE + ;CAT_NO_SPACE: + CP "\r" + JR NZ,CAT_ALL + LD DE,CAT_FILES CAT_ALL: ; CALL MSDOS_FIND_FILE CALL MSDOS_1ST_FL diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 4e676f6..6da06c7 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -34,7 +34,7 @@ INIT_RMD: RAMD_FAT_PROG: CALL AUTO_1D97 ; CLS CALL OPEN_CH2 - LD HL,SYS_PAGE.RAMD_FAT + LD HL,SYS_PAGE.RAM_TABLE RAMD_F_L1: DI IN A,(SLOT3) diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index 5901d72..f746db5 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -190,7 +190,7 @@ MSD_R_W_LOOP: LD A,SYS_PAGE OUT (SLOT2),A LD A,(ZX_VARS.MED_START) - LD HL,SYS_PAGE.RAMD_FAT-#4000 + LD HL,SYS_PAGE.RAM_TABLE-#4000 LD L,A LD L,(HL) LD A,C diff --git a/ZX_EXP/EXP_FN2.ASM b/ZX_EXP/EXP_FN2.ASM index 601d219..75178f0 100644 --- a/ZX_EXP/EXP_FN2.ASM +++ b/ZX_EXP/EXP_FN2.ASM @@ -715,7 +715,7 @@ INIT_SYS_ALL: LD DE,CNF_0 LD (CONFIG_DE-4000h),DE - LD HL,TASK_DATA-4000h ; убить все задачи ;SYS_PAGE.CURRENT_TASK + LD HL,TASK_DATA-4000h ; убить все задачи ;SYS_PAGE.CURRENT_TASK.ID LD DE,TASK_DATA+1-4000h LD BC,0FFH LD (HL),0 diff --git a/ZX_EXP/EXP_HDD.ASM b/ZX_EXP/EXP_HDD.ASM index f7903e6..04b1b9d 100644 --- a/ZX_EXP/EXP_HDD.ASM +++ b/ZX_EXP/EXP_HDD.ASM @@ -215,7 +215,7 @@ HD_RD_CONT2: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' - LD HL,SYS_PAGE.RAMD_FAT + LD HL,SYS_PAGE.RAM_TABLE LD L,A LD A,(HL) OUT (SLOT3),A @@ -315,7 +315,7 @@ HD_WR_LOOP: LD A,SYS_PAGE OUT (SLOT3),A EX AF,AF' - LD HL,SYS_PAGE.RAMD_FAT + LD HL,SYS_PAGE.RAM_TABLE LD L,A LD A,(HL) OUT (SLOT3),A From 3ad07bbd302f6ff4bdd1b12aec01f648204ab839 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sun, 25 Aug 2024 01:28:09 +1000 Subject: [PATCH 100/114] ... --- TRDOS/TR_HDD_4.ASZ | 70 ++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 46 deletions(-) diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index f6ce3d4..303a132 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -55,72 +55,50 @@ HDD_PROG_E: JP AUTO_03E4 ; -HDD_SET:;!TEST -.loop: LD A,(DE) - INC DE - CP " " - JR Z,.loop - CP "\r" - JR Z,.init - ; - DEC DE - DEC DE - JP CHOOSE_HDD - ;CALL CHOOSE_HDD - ;CALL READ_BPB - ;RET +HDD_SET: +.loop: LD A,(DE) + INC DE + CP " " + JR Z,.loop + CP "\r" + JR Z,.check + ; + DEC DE + DEC DE + JP CHOOSE_HDD ; ; [x] new tr-hdd -.init: ;CALL CORRECT_CUR_DIR - DI +.check: DI LD BC,SLOT3 IN B,(C) - ;LD C,A LD A,SYS_PAGE OUT (SLOT3),A ; LD E,DRIVE_CODES.TRDOS.HDD LD A,(SYS_PAGE.CURRENT_DIR_DRIVE_COPY) CP #FF - SCF - JR Z,.skip - ; + JR Z,.init CP E - JR C,.skip + JR C,.init + ; LD (SYS_PAGE.CURRENT_DIR_DRIVE),A - ; + OUT (C),B + PUSH DE AND #0F - ; !TEST - OUT (C),B - ; - PUSH DE - LD C,BIOS.HDD_PART - CALL EXP_FNS - POP DE - JR C,CHOOSE_HDD.error - ; - LD C,BIOS.SET_DISK_REDIR - JP EXP_FNS - ; - ;LD (SYS_PAGE.CURRENT_HDD),A - ; - ; -;.skip: LD A,C -; OUT (SLOT3),A -.skip: OUT (C),B + LD C,BIOS.HDD_PART + CALL EXP_FNS + POP DE + JR C,CHOOSE_HDD.error + JR .exit ; +.init: OUT (C),B PUSH DE LD C,BIOS.HDD_INIT CALL EXP_FNS POP DE JP C,HDD_PROG_E ; - ; LD BC,(ZX_VARS.OPER_DISK - 1) - ; LD A,(ZX_VARS.OPER_DISK) - ; LD B,A - ; XOR A - ;LD E,A - LD C,BIOS.SET_DISK_REDIR +.exit: LD C,BIOS.SET_DISK_REDIR JP EXP_FNS From f5520e57b8e87a1da0e1364f95980f5f5f58e173 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 19 Sep 2024 23:52:59 +1000 Subject: [PATCH 101/114] ... --- Shared_Includes | 2 +- ZX_EXP/SERVICE.ASM | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index e9d481a..51a136e 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit e9d481a5565338505710b08e50d22a8579c400be +Subproject commit 51a136edca8c04554de0b189d7680ebbe358c64a diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index c5c5e96..3919a07 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -217,10 +217,10 @@ SPRINTER_2X: JP RESET_1 ; сброс без перезагрузки AY8910: - LD D,#35 - CALL CMOS_RD - OR 1 - CALL CMOS_WR + ;LD D,#35 + ;CALL CMOS_RD + ;OR 1 + ;CALL CMOS_WR LD BC,204Eh ; port all_mode IN A,(C) @@ -231,10 +231,10 @@ AY8910: JR SPRINTER_ALL SPRINTER_1: - LD D,35H - CALL CMOS_RD - AND 0FEh - CALL CMOS_WR + ;LD D,35H + ;CALL CMOS_RD + ;AND 0FEh + ;CALL CMOS_WR LD BC,204Eh IN A,(C) From 92a2c65987c5904d764b62daed9fe4bcc5db3cbc Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 1 Oct 2024 05:00:04 +1000 Subject: [PATCH 102/114] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=20free=20zx=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP__48.ASM | 3 ++- TRDOS/TR_MSD_2.ASZ | 3 --- TRDOS/TR_MSD_3.ASZ | 3 ++- ZX_EXP/SERVICE.ASM | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/SP__48.ASM b/SP__48.ASM index a983d9a..fd074d5 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19273,9 +19273,10 @@ L3C97: ;чтоб можно было компилить vROM как для работы с ПЗУ, так и полностью без него LD HL,#C0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 //LD HL,#3CF0 ; POINT - вход в MENU из BASIC 48. for ZX_MODE.ASM - RET_FROM_BIOS_TO_BASIC48 - ; JR JMP_EX +;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >; +;> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >; BLOCK #3CF8-$,0 JMP_EX: PUSH HL PUSH AF diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 4c74a04..97d955e 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -644,9 +644,6 @@ SP_1: LD A,(DE) CCF RET C CALL EXP_FNS - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; CALL AUTO_1D97 AND A RET diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 6da06c7..34e9097 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -2,7 +2,8 @@ File_Start DEFL $ DISPLAY "====================================================" ;███████████████████████████████████████████████████████████████████████ INIT_RMD: - LD C,BIOS.FullInit + DI + LD BC,BIOS.REINIT.FREE_NO_ZX_MEM ; [ ] free zx pages! ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то CALL EXP_FNS ; [ ] 23/02/2024 грохаем перехват ресета diff --git a/ZX_EXP/SERVICE.ASM b/ZX_EXP/SERVICE.ASM index 3919a07..567fc72 100644 --- a/ZX_EXP/SERVICE.ASM +++ b/ZX_EXP/SERVICE.ASM @@ -626,12 +626,12 @@ SCORPION: PENTAGON: CALL CNF_PN_320 - LD DE,CNF_2+D_TBON + LD DE,CNF_1+D_TBON JR CONFIG_SET1 PENTAGON512: CALL CNF_PN_320 - LD DE,CNF_2+D_TBON+CNF_512 + LD DE,CNF_1+D_TBON+CNF_512 ; JR CONFIG_SET1 CONFIG_SET1: From c402862301cb1a2e578c452a830029a1be75f20b Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 1 Oct 2024 05:00:37 +1000 Subject: [PATCH 103/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 51a136e..817bba0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 51a136edca8c04554de0b189d7680ebbe358c64a +Subproject commit 817bba0c1abebdb890f77ee129578ebe06fb5131 From 203d880cafe64ca57a28af2031ed8a8f7a1a74df Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 11 Oct 2024 04:59:31 +1000 Subject: [PATCH 104/114] ... --- SP_128.ASM | 2 +- SP_TRDOS.ASM | 84 +- Shared_Includes | 2 +- TRDOS/boot_trd.asm | 2 +- inc/rom_routines.inc | 2257 +++++++++++++++++++++--------------------- 5 files changed, 1176 insertions(+), 1171 deletions(-) diff --git a/SP_128.ASM b/SP_128.ASM index 2fb3e18..0ea88f5 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -10030,7 +10030,7 @@ L2584: CALL L28BE ; Reset Cursor Position. ; -------------- ; Show Main Menu ; -------------- - + BLOCK #259F-$,#FF; стандартный адрес L259F: LD HL,TSTACK ; #5BFF. LD (OLDSP),HL ; #5B81. diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 8f2b97c..66cfe14 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -229,7 +229,7 @@ AUTO_00A8: LD HL,ZX_VARS.RET_INS AUTO_0100: LD (HL),201 - RST_ROM ROUTINE.clear_prb + RST_ROM BASIC_FN.x48.clear_prb LD HL,ZX_VARS.SCR_SIZE LD (HL),2 LD HL,AUTO_128B @@ -268,7 +268,7 @@ AUTO_0140: LD (ZX_VARS.NEW_PPC),HL XOR A LD (ZX_VARS.NEW_S_PPC),A - RST_ROM ROUTINE.set_min + RST_ROM BASIC_FN.x48.set_min LD HL,(ZX_VARS.BAS_PROG) DEC HL LD (ZX_VARS.DATA_ADR),HL @@ -277,7 +277,7 @@ AUTO_0140: OR A LD HL,AUTO_1B76 JR Z,AUTO_0166 - RST_ROM ROUTINE.report_0 + RST_ROM BASIC_FN.x48.report_0 AUTO_0166: PUSH HL LD HL,ZX_VARS.RET_INS @@ -1252,15 +1252,15 @@ AUTO_1052: PUSH BC PUSH DE AUTO_1056: - RST_ROM ROUTINE.key_scan + RST_ROM BASIC_FN.x48.key_scan ;AUTO_1059: LD C,0 JR NZ,AUTO_1056 - RST_ROM ROUTINE.key_test + RST_ROM BASIC_FN.x48.key_test JR NC,AUTO_1056 DEC D LD E,A - RST_ROM ROUTINE.key_decode + RST_ROM BASIC_FN.x48.key_decode POP DE POP BC POP HL @@ -1997,7 +1997,7 @@ AUTO_166F: LD (ZX_VARS.VAR_1),HL JP AUTO_1E23 AUTO_1680: - RST_ROM ROUTINE.free_mem + RST_ROM BASIC_FN.x48.free_mem LD HL,#FFFF SBC HL,BC LD A,H @@ -2465,7 +2465,7 @@ CMD_MERGE: LD (ZX_VARS.MED_LEN),BC PUSH BC INC BC - RST_ROM ROUTINE.bc_spaces + RST_ROM BASIC_FN.x48.bc_spaces ;AUTO_19D1: LD (HL),128 EX DE,HL @@ -2479,7 +2479,7 @@ CMD_MERGE: CALL AUTO_1921 POP HL LD DE,(ZX_VARS.BAS_PROG) - RST_ROM ROUTINE.me_new_lp + RST_ROM BASIC_FN.x48.me_new_lp JP AUTO_03E1 AUTO_19F2: EX DE,HL @@ -2491,7 +2491,7 @@ AUTO_19F2: LD B,H LD C,L AUTO_19FD: - RST_ROM ROUTINE.test_room + RST_ROM BASIC_FN.x48.test_room RET AUTO_1A01: LD DE,(ZX_VARS.BAS_PROG) @@ -2525,7 +2525,7 @@ AUTO_1A31: POP DE POP HL PUSH BC - RST_ROM ROUTINE.reclaim_1 + RST_ROM BASIC_FN.x48.reclaim_1 POP BC CALL AUTO_1E32 INC HL @@ -2990,7 +2990,7 @@ AUTO_1D63: CP #FF LD (HL),0 RET NZ - RST_ROM ROUTINE.set_work + RST_ROM BASIC_FN.x48.set_work RET ; Проверка, идет ли проверка строки на синтаксис или выполнение команды. ; Если идет выполнение, то флаг Z будет сброшен, иначе установлен. @@ -3009,28 +3009,28 @@ AUTO_1D7B: OPEN_CH0: XOR A AUTO_1D84: - RST_ROM ROUTINE.chan_open + RST_ROM BASIC_FN.x48.chan_open RET OPEN_CH2: LD A,2 JR AUTO_1D84 AUTO_1D8C: - RST_ROM ROUTINE.get_char + RST_ROM BASIC_FN.x48.get_char ;AUTO_1D8F: RET GET_CMD: CALL OPEN_CH0 - RST_ROM ROUTINE.editor + RST_ROM BASIC_FN.x48.editor RET AUTO_1D97: - RST_ROM ROUTINE.cls + RST_ROM BASIC_FN.x48.cls RET AUTO_1D9B: - RST_ROM ROUTINE.look_vars + RST_ROM BASIC_FN.x48.look_vars RET AUTO_1D9F: - RST_ROM ROUTINE.cls_lower + RST_ROM BASIC_FN.x48.cls_lower RET AUTO_1DA3: LD C,A @@ -3041,20 +3041,20 @@ AUTO_1DA9: PUSH BC CALL xchg_intf1 POP BC - RST_ROM ROUTINE.out_num_1 + RST_ROM BASIC_FN.x48.out_num_1 CALL xchg_intf1 RET BAS_2BF1: - RST_ROM ROUTINE.stack_fetch + RST_ROM BASIC_FN.x48.stack_fetch RET AUTO_1DB9: - RST_ROM ROUTINE.find_int2 + RST_ROM BASIC_FN.x48.find_int2 RET AUTO_1DBD: - RST_ROM ROUTINE.expt_exp + RST_ROM BASIC_FN.x48.expt_exp RET AUTO_1DC1: - RST_ROM ROUTINE.expt_1num + RST_ROM BASIC_FN.x48.expt_1num RET AUTO_1DC5: LD HL,(ZX_VARS.ADR_DOS_COM) @@ -3102,22 +3102,22 @@ AUTO_1E0B: RET AUTO_1E1C: LD HL,(ZX_VARS.ADR_DOS_COM) - RST_ROM ROUTINE.remove_fp + RST_ROM BASIC_FN.x48.remove_fp RET AUTO_1E23: LD HL,(ZX_VARS.WORK_SPACE) - RST_ROM ROUTINE.bc_spaces + RST_ROM BASIC_FN.x48.bc_spaces AUTO_1E29: RET BASIC_RST20: - RST_ROM ROUTINE.next_char + RST_ROM BASIC_FN.x48.next_char AUTO_1E2D: RET AUTO_1E2E: - RST_ROM ROUTINE.reclaim_2 + RST_ROM BASIC_FN.x48.reclaim_2 RET AUTO_1E32: - RST_ROM ROUTINE.make_room + RST_ROM BASIC_FN.x48.make_room RET READ_TRK_NUM: CALL READ_ADR_LABL @@ -3657,7 +3657,7 @@ AUTO_2206: JP AUTO_03D9 AUTO_220F: LD A,(ZX_VARS.MED_LEN) - RST_ROM ROUTINE.str_data1 + RST_ROM BASIC_FN.x48.str_data1 LD A,B OR C JP NZ,AUTO_221B @@ -4058,7 +4058,7 @@ AUTO_2492: AUTO_2494: LD (ZX_VARS.ERR_NR),A CALL AUTO_20E5 - RST_ROM ROUTINE.error_4 + RST_ROM BASIC_FN.x48.error_4 RET AUTO_249E: LD A,23 @@ -4271,7 +4271,7 @@ AUTO_25EF: INC HL LD D,(HL) OR A - LD HL,ROUTINE.ed_error ;48 basic routine + LD HL,BASIC_FN.x48.ed_error ;48 basic routine SBC HL,DE JR NZ,AUTO_2626 LD SP,(ZX_VARS.ERR_SP) @@ -4290,7 +4290,7 @@ AUTO_2614: AUTO_261D: CP 13 JR Z,AUTO_2614 - RST_ROM ROUTINE.add_char_keeping_current_mode + RST_ROM BASIC_FN.x48.add_char_keeping_current_mode JR AUTO_260F AUTO_2626: CALL AUTO_262B @@ -4331,7 +4331,7 @@ CMD_CLOSE: CALL AUTO_1E0B CALL SINTAX_RET LD A,(ZX_VARS.MED_LEN) - RST_ROM ROUTINE.str_data1 + RST_ROM BASIC_FN.x48.str_data1 LD A,B OR C JP Z,AUTO_01D3 @@ -5680,9 +5680,9 @@ AUTO_3057: ; LD (HL),A INC HL EX DE,HL - RST_ROM ROUTINE.differ + RST_ROM BASIC_FN.x48.differ PUSH BC - RST_ROM ROUTINE.reclaim_2 + RST_ROM BASIC_FN.x48.reclaim_2 POP BC LD A,(ZX_VARS.DOS_ERROR) OR A @@ -5773,7 +5773,7 @@ AUTO_30E1: LD (ZX_VARS.DOS_ERROR),A DEC HL DEC HL - RST_ROM ROUTINE.line_addr + RST_ROM BASIC_FN.x48.line_addr RET AUTO_30F4: LD A,255 @@ -6057,7 +6057,7 @@ FORM_X03: CALL AUTO_1C57 CALL AUTO_1D97 LD A,2 - RST_ROM ROUTINE.chan_open + RST_ROM BASIC_FN.x48.chan_open LD HL,NEW_NAME RST PRINT_LN @@ -6122,7 +6122,7 @@ SUB_HL_14: RET LOW_CLS_AT00: - RST_ROM ROUTINE.cls_lower + RST_ROM BASIC_FN.x48.cls_lower LD HL,MSG_AT00 JP PRINT_LINE @@ -6525,7 +6525,7 @@ BEEP_1: LD HL,200 ; BEEP LD D,H LD E,(IY-1) - RST_ROM ROUTINE.beeper + RST_ROM BASIC_FN.x48.beeper POP AF RET @@ -6670,7 +6670,7 @@ PRINT_SYM: AUTO_3D94: - RST_ROM ROUTINE.print_a + RST_ROM BASIC_FN.x48.print_a RET AUTO_3D98: LD A,8 @@ -6678,10 +6678,10 @@ WG93_EXE: OUT (FDC_93.Command),A AUTO_3D9C: PUSH HL - RST_ROM ROUTINE.break_key + RST_ROM BASIC_FN.x48.break_key ;RET_1F54: JR C,AUTO_3DA5 - RST_ROM ROUTINE.report_l + RST_ROM BASIC_FN.x48.report_l AUTO_3DA5: POP HL IN A,(FDC_93.DrvCTRL) diff --git a/Shared_Includes b/Shared_Includes index 817bba0..0df304a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 817bba0c1abebdb890f77ee129578ebe06fb5131 +Subproject commit 0df304a7f0295eb72c7102f153f82c91d90743e0 diff --git a/TRDOS/boot_trd.asm b/TRDOS/boot_trd.asm index c4b5a5d..122d6a5 100644 --- a/TRDOS/boot_trd.asm +++ b/TRDOS/boot_trd.asm @@ -81,7 +81,7 @@ bootkus1: DISP #F500 DEC A DEC A LD (ZX_VARS.ATTR_P),A - CALL ROUTINE.cls + CALL BASIC_FN.x48.x48.cls .loop2: DI XOR A LD (VAR_1),A diff --git a/inc/rom_routines.inc b/inc/rom_routines.inc index 1bec256..a0c1941 100644 --- a/inc/rom_routines.inc +++ b/inc/rom_routines.inc @@ -34,1129 +34,1134 @@ ; ============================================================== -ROUTINE: -.abs EQU 0x346A -.acs EQU 0x3843 -.add_back EQU 0x3004 -.add_ch_1 EQU 0x0F8B -.add_char EQU 0x0F81 -.add_char_keeping_current_mode EQU 0x0F85 -.add_rep_6 EQU 0x309F -.addend_0 EQU 0x2FF9 -.addition EQU 0x3014 -.addn_oflw EQU 0x303C -.all_added EQU 0x300D -.alpha EQU 0x2C8D -.alphanum EQU 0x2C88 -.arc_end EQU 0x245F -.arc_loop EQU 0x2425 -.arc_start EQU 0x2439 -.asn EQU 0x3833 -.atn EQU 0x37E2 -.auto_l_1 EQU 0x17CE -.auto_l_2 EQU 0x17E1 -.auto_l_3 EQU 0x17E4 -.auto_l_4 EQU 0x17ED -.auto_list EQU 0x1795 -.bc_spaces EQU 0x0030 -.be_end EQU 0x03F6 -.be_h_and_l_lp EQU 0x03D6 -.be_ix_plus_0 EQU 0x03D4 -.be_ix_plus_1 EQU 0x03D3 -.be_ix_plus_2 EQU 0x03D2 -.be_ix_plus_3 EQU 0x03D1 -.beep EQU 0x03F8 -.beeper EQU 0x03B5 -.bin_digit EQU 0x2CA2 -.bin_end EQU 0x2CB3 -.bits_zero EQU 0x3283 -.border EQU 0x2294 -.border_1 EQU 0x22A6 -.border_2297 EQU 0x2297 ; secondary entry to rom_border -.border_229b EQU 0x229B ; secondary entry to rom_border -.both_null EQU 0x3572 -.break_key EQU 0x1F54 ; return the carry flag reset if SHIFT and BREAK keys are both being pressed. -.byte_comp EQU 0x3564 -.byte_zero EQU 0x327E -.c_arc_ge1 EQU 0x235A -.c_ent EQU 0x37B7 -.c_r_gre_1 EQU 0x233B -.ca_10_by_a_plus_c EQU 0x2F8B -.calculate EQU 0x335B -.call_jump EQU 0x162C -.call_sub EQU 0x15F7 -.cases EQU 0x37FA -.cat_etc EQU 0x1793 -.cd_prms1 EQU 0x247D -.ch_add_plus_1 EQU 0x0074 -.chan_flag EQU 0x1615 -.chan_k EQU 0x1634 -.chan_op_1 EQU 0x1610 -.chan_open EQU 0x1601 ; open a channel (channel in A) -.chan_p EQU 0x164D -.chan_s EQU 0x1642 ; set flags for upper screen channel -.chan_s_1 EQU 0x1646 -.check_end EQU 0x1BEE -.chn_cd_lu EQU 0x162D -.chrs EQU 0x35C9 -.circle EQU 0x2320 -.cl_09_1 EQU 0x1CD6 -.cl_addr EQU 0x0E9B -.cl_all EQU 0x0DAF ; clear whole (upper) display area -.cl_attr EQU 0x0E88 -.cl_chan EQU 0x0D94 -.cl_chan_a EQU 0x0DA0 -.cl_line EQU 0x0E44 -.cl_line_1 EQU 0x0E4A -.cl_line_2 EQU 0x0E4D -.cl_line_3 EQU 0x0E80 -.cl_sc_all EQU 0x0DFE -.cl_scr_1 EQU 0x0E05 -.cl_scr_2 EQU 0x0E0D -.cl_scr_3 EQU 0x0E19 -.cl_scroll EQU 0x0E00 ; scroll the number of lines in the B register -.cl_set EQU 0x0DD9 -.cl_set_1 EQU 0x0DEE -.cl_set_2 EQU 0x0DF4 -.cl_str_lu EQU 0x1716 -.class_01 EQU 0x1C1F -.class_02 EQU 0x1C4E -.class_03 EQU 0x1C0D -.class_04 EQU 0x1C6C -.class_05 EQU 0x1C11 -.class_07 EQU 0x1C96 -.class_09 EQU 0x1CBE -.class_0b EQU 0x1CDB -.class_tbl EQU 0x1C01 -.clear EQU 0x1EAC -.clear_1 EQU 0x1EB7 -.clear_2 EQU 0x1EDC -.clear_prb EQU 0x0EDF -.clear_run EQU 0x1EAF -.clear_sp EQU 0x1097 -.close EQU 0x16E5 -.close_0_16EB EQU 0x16EB -.close_1 EQU 0x16FC -.close_2 EQU 0x1701 -.close_str EQU 0x171C -.cls EQU 0x0D6B ; CLS -.cls_1 EQU 0x0D87 -.cls_2 EQU 0x0D89 -.cls_3 EQU 0x0D8E -.cls_lower EQU 0x0D6E -.co_change EQU 0x226C -.co_temp_1 EQU 0x21E1 -.co_temp_2 EQU 0x21E2 -.co_temp_3 EQU 0x21F2 -.co_temp_4 EQU 0x21FC -.co_temp_5 EQU 0x2211 -.co_temp_6 EQU 0x2228 -.co_temp_7 EQU 0x2234 -.co_temp_8 EQU 0x223E -.co_temp_9 EQU 0x2246 -.co_temp_a EQU 0x2257 -.co_temp_b EQU 0x2258 -.co_temp_c EQU 0x2273 -.co_temp_d EQU 0x227D -.co_temp_e EQU 0x2287 -.code EQU 0x3669 -.comma_sp EQU 0x1537 -.continue EQU 0x1E5F -.copy EQU 0x0EAC -.copy_1 EQU 0x0EB2 -.copy_2 EQU 0x0EC9 -.copy_3 EQU 0x0ED3 -.copy_buff EQU 0x0ECD -.copy_end EQU 0x0EDA -.copy_l_1 EQU 0x0EFD -.copy_l_2 EQU 0x0F0C -.copy_l_3 EQU 0x0F14 -.copy_l_4 EQU 0x0F18 -.copy_l_5 EQU 0x0F1E -.copy_line EQU 0x0EF4 -.copyright EQU 0x1539 -.cos EQU 0x37AA -.count_one EQU 0x31FA -.cp_lines EQU 0x1980 -.ctlchrtab EQU 0x0A11 -.d_l_diag EQU 0x24D4 -.d_l_hr_vt EQU 0x24DB -.d_l_loop EQU 0x24CE -.d_l_plot EQU 0x24EC -.d_l_range EQU 0x24F7 -.d_l_step EQU 0x24DF -.d_letter EQU 0x2C1F -.d_no_loop EQU 0x2C2E -.d_rport_c EQU 0x2C05 -.d_run EQU 0x2C15 -.d_size EQU 0x2C2D -.data EQU 0x1E27 -.data_1 EQU 0x1E2C -.data_2 EQU 0x1E37 -.de_comma_paren_de_plus_1_parenequ EQU 0x2AEE -.dec_jr_nz EQU 0x367A -.dec_rpt_c EQU 0x2CCF -.dec_sto_1 EQU 0x2CD5 -.dec_to_fp EQU 0x2C9B -.decimal EQU 0x2CCB -.def_fn EQU 0x1F60 -.def_fn_1 EQU 0x1F6A -.def_fn_2 EQU 0x1F7D -.def_fn_3 EQU 0x1F86 -.def_fn_4 EQU 0x1F89 -.def_fn_5 EQU 0x1F94 -.def_fn_6 EQU 0x1FA6 -.def_fn_7 EQU 0x1FBD -.delete EQU 0x33A1 -.differ EQU 0x19DD -.dim EQU 0x2C02 -.dim_clear EQU 0x2C7C -.dim_sizes EQU 0x2C7F -.div_34th EQU 0x31DB -.div_loop EQU 0x31D2 -.div_start EQU 0x31E2 -.division EQU 0x31AF -.divn_expt EQU 0x313D -.dl_larger EQU 0x24CB -.dl_x_ge_y EQU 0x24C4 -.double_a EQU 0x338C -.dr_3_prms EQU 0x238D -.dr_prms EQU 0x23C1 -.dr_sin_nz EQU 0x23A3 -.draw EQU 0x2382 -.draw_line EQU 0x24B7 -.draw_line_24BA EQU 0x24BA ; entry point of the draw_line routine -.draw_save EQU 0x2497 -.drw_steps EQU 0x2420 -.e_divsn EQU 0x2D6D -.e_end EQU 0x2D7B -.e_fetch EQU 0x2D6E -.e_format EQU 0x2CEB -.e_fp_jump EQU 0x2D18 -.e_l_1 EQU 0x1A15 -.e_line_no EQU 0x19FB -.e_loop EQU 0x2D60 -.e_save EQU 0x2D55 -.e_to_fp EQU 0x2D4F -.e_tst_end EQU 0x2D71 -.each_s_1 EQU 0x1990 -.each_s_2 EQU 0x1998 -.each_s_3 EQU 0x199A -.each_s_4 EQU 0x19A5 -.each_s_5 EQU 0x19AD -.each_s_6 EQU 0x19B1 -.each_stmt EQU 0x198B -.ed_again EQU 0x0F30 -.ed_blank EQU 0x1150 -.ed_c_done EQU 0x117C -.ed_c_end EQU 0x117E -.ed_contr EQU 0x0F6C -.ed_copy EQU 0x111D -.ed_cur EQU 0x1011 -.ed_delete EQU 0x1015 -.ed_down EQU 0x0FF3 -.ed_edge EQU 0x1031 -.ed_edge_1 EQU 0x103E -.ed_edge_2 EQU 0x1051 -.ed_edit EQU 0x0FA9 -.ed_end EQU 0x1026 -.ed_enter EQU 0x1024 -.ed_error EQU 0x107F -.ed_full EQU 0x1167 -.ed_graph EQU 0x107C -.ed_ignore EQU 0x101E -.ed_keys EQU 0x0F92 -.ed_keys_t EQU 0x0FA0 -.ed_left EQU 0x1007 -.ed_list EQU 0x106E -.ed_loop EQU 0x0F38 -.ed_right EQU 0x100C -.ed_spaces EQU 0x115E -.ed_stop EQU 0x1001 -.ed_symbol EQU 0x1076 -.ed_up EQU 0x1059 -.editor EQU 0x0F2C -.end_calc EQU 0x369B -.end_compl EQU 0x30A3 -.end_tests EQU 0x358C -.ent_table EQU 0x338E -.error_1 EQU 0x0008 -.error_2 EQU 0x0053 -.error_3 EQU 0x0055 -.error_4 EQU 0x0058 -.ex_or_not EQU 0x3543 -.exchange EQU 0x343C -.exit EQU 0x36C2 -.exp EQU 0x36C4 -.expt_1num EQU 0x1C82 -.expt_2num EQU 0x1C7A -.expt_exp EQU 0x1C8C -.f_found EQU 0x1D7C -.f_l_s EQU 0x1D34 -.f_loop EQU 0x1D64 -.f_reorder EQU 0x1D16 -.f_use_1 EQU 0x1D10 -.fetch_num EQU 0x1CDE -.fetch_two EQU 0x2FBA -.find_i_1 EQU 0x1E9C -.find_int1 EQU 0x1E94 -.find_int2 EQU 0x1E99 -.first_3d EQU 0x3380 -.fn_skpovr EQU 0x28AB -.for EQU 0x1D03 -.form_exp EQU 0x33DE -.fp_0_or_1 EQU 0x350B -.fp_a_end EQU 0x2DE1 -.fp_calc EQU 0x0028 -.fp_calc_2 EQU 0x33A2 -.fp_delete EQU 0x2DAD -.fp_to_a EQU 0x2DD5 -.fp_to_bc EQU 0x2DA2 -.free_mem EQU 0x1F1A -.frst_less EQU 0x3585 -.full_addn EQU 0x303E -.g_loop EQU 0x3453 -.gen_ent_1 EQU 0x335E -.gen_ent_2 EQU 0x3362 -.get_argt EQU 0x3783 -.get_char EQU 0x0018 -.get_hl_by_de EQU 0x2AF4 -.get_mem_xx EQU 0x340F -.get_param EQU 0x1B55 -.go_nc_mlt EQU 0x30A5 -.go_sub EQU 0x1EED -.go_to EQU 0x1E67 -.go_to_2 EQU 0x1E73 -.go_to_bc EQU 0x1E6A ; 'GO TO' line in BC register -.go_to_hl EQU 0x1E6C ; 'GO TO' line in HL register XXX not tested -.gre.8 EQU 0x373D -.greater_0 EQU 0x34F9 -.hl_again EQU 0x30BC -.hl_by_de_to_hl EQU 0x30A9 ; HL=HL*DE -.hl_end EQU 0x30BE -.hl_hl_by_de EQU 0x30A9 -.hl_loop EQU 0x30B1 -.hlxde EQU 0x30A9 ; HL=HL*DE -.i_carry EQU 0x2AE8 -.i_restore EQU 0x2AEB -.if EQU 0x1CF0 -.if_1 EQU 0x1D00 -.in EQU 0x34A5 -.in_assign EQU 0x21B9 -.in_chan_k EQU 0x21D6 -.in_item_1 EQU 0x20C1 -.in_item_2 EQU 0x20D8 -.in_item_3 EQU 0x20ED -.in_next_1 EQU 0x21AF -.in_next_2 EQU 0x21B2 -.in_pk_stk EQU 0x34B0 -.in_pr_1 EQU 0x211A -.in_pr_2 EQU 0x211C -.in_pr_3 EQU 0x2129 -.in_prompt EQU 0x20FA -.in_stop EQU 0x21D0 -.in_var_1 EQU 0x213A -.in_var_2 EQU 0x2148 -.in_var_3 EQU 0x215E -.in_var_4 EQU 0x2161 -.in_var_5 EQU 0x2174 -.in_var_6 EQU 0x219B -.indexer EQU 0x16DC -.indexer_1 EQU 0x16DB -.init_chan EQU 0x15AF -.init_strm EQU 0x15C6 -.input EQU 0x2089 -.input_1 EQU 0x2096 -.input_2 EQU 0x20AD -.input_ad EQU 0x15E6 -.int EQU 0x36AF -.int_case EQU 0x3483 -.int_exp1 EQU 0x2ACC -.int_exp2 EQU 0x2ACD -.int_fetch EQU 0x2D7F -.int_store EQU 0x2D8E -.int_to_fp EQU 0x2D3B -.ix_end EQU 0x3290 -.jump EQU 0x3686 -.jump_2 EQU 0x3687 -.jump_true EQU 0x368F -.k_8_and_9 EQU 0x0382 -.k_@_char EQU 0x03B2 -.k_ch_set EQU 0x02D1 -.k_digit EQU 0x0367 -.k_e_let EQU 0x0341 -.k_end EQU 0x0308 -.k_gra_dgt EQU 0x0389 -.k_klc_dgt EQU 0x039D -.k_klc_let EQU 0x034F -.k_look_up EQU 0x034A -.k_main EQU 0x032C -.k_new EQU 0x02F1 -.k_repeat EQU 0x0310 -.k_st_loop EQU 0x02C6 -.k_tokens EQU 0x0364 -.key_3keys EQU 0x029F -.key_bits EQU 0x02A1 -.key_chan EQU 0x1113 -.key_contr EQU 0x10FA -.key_data EQU 0x1105 -.key_decode EQU 0x0333 -.key_done2 EQU 0x111B -.key_done EQU 0x02AB -.key_flag EQU 0x10F4 -.key_input EQU 0x10A8 -.key_int EQU 0x0048 -.key_line EQU 0x0296 -.key_m_cl EQU 0x10DB -.key_mode EQU 0x10E6 -.key_next EQU 0x110D -.key_scan EQU 0x028E -.key_test EQU 0x031E -.keyboard EQU 0x02BF -.l_add_string EQU 0x2BAF -.l_char EQU 0x2B3E -.l_delete_string EQU 0x2B72 -.l_each_ch EQU 0x2B0B -.l_enter EQU 0x2BA6 -.l_exists EQU 0x2B66 -.l_first EQU 0x2BEA -.l_in_w_or_s EQU 0x2BA3 -.l_length EQU 0x2B9B -.l_new_string EQU 0x2BC0 -.l_no_sp EQU 0x2B0C -.l_numeric EQU 0x2B59 -.l_single EQU 0x2B4F -.l_spaces EQU 0x2B29 -.l_string EQU 0x2BC6 -.l_test_ch EQU 0x2B1F -.last EQU 0x386C -.ld_8_bits EQU 0x05CA -.ld_block EQU 0x0802 -.ld_break EQU 0x056B -.ld_bytes EQU 0x0556 -.ld_ch_pr EQU 0x07AD -.ld_cont_1 EQU 0x0819 -.ld_cont_2 EQU 0x0825 -.ld_contrl EQU 0x0808 -.ld_data EQU 0x082E -.ld_data_1 EQU 0x084C -.ld_dec EQU 0x05C4 -.ld_delay EQU 0x05E9 -.ld_edge_1 EQU 0x05E7 -.ld_edge_2 EQU 0x05E3 -.ld_flag EQU 0x05B3 -.ld_leader EQU 0x0580 -.ld_look_h EQU 0x0767 -.ld_loop EQU 0x05A9 -.ld_marker EQU 0x05C8 -.ld_name EQU 0x07A6 -.ld_next EQU 0x05C2 -.ld_prog EQU 0x0873 -.ld_prog_1 EQU 0x08AD -.ld_sample EQU 0x05ED -.ld_start EQU 0x056C -.ld_sync EQU 0x058F -.ld_type EQU 0x078A -.ld_verify EQU 0x05BD -.ld_wait EQU 0x0574 -.len EQU 0x3674 -.less_0 EQU 0x3506 -.less_mask EQU 0x328A -.let EQU 0x2AFF -.line_ad_1 EQU 0x1974 -.line_addr EQU 0x196E -.line_draw EQU 0x2477 -.line_end EQU 0x1BB3 -.line_new EQU 0x1B9E -.line_no EQU 0x1695 -.line_no_a EQU 0x1691 -.line_run EQU 0x1B8A -.line_scan EQU 0x1B17 -.line_use EQU 0x1BBF -.line_zero EQU 0x168F -.list EQU 0x17F9 -.list_1 EQU 0x17FB -.list_2 EQU 0x1814 -.list_3 EQU 0x181A -.list_4 EQU 0x181F -.list_5 EQU 0x1822 -.list_all EQU 0x1833 -.list_all_2 EQU 0x1835 -.llist EQU 0x17F5 -.ln EQU 0x3713 -.ln_fetch EQU 0x190F -.ln_store EQU 0x191C -.loc_mem EQU 0x3406 -.log_paren_2_power_a_paren EQU 0x2DC1 -.look_p_1 EQU 0x1D8B -.look_p_2 EQU 0x1DA3 -.look_prog EQU 0x1D86 -.look_vars EQU 0x28B2 -.lprint EQU 0x1FC9 -.main_1 EQU 0x12A9 -.main_2 EQU 0x12AC -.main_3 EQU 0x12CF -.main_4 EQU 0x1303 -.main_5 EQU 0x133C -.main_5_1349 EQU 0x1349 -.main_6 EQU 0x1373 -.main_7 EQU 0x1376 -.main_8 EQU 0x1384 -.main_9 EQU 0x1386 -.main_add1 EQU 0x157D -.main_add2 EQU 0x15AB -.main_add EQU 0x155D -.main_exec EQU 0x12A2 -.main_g EQU 0x1313 ; runtime error (error in A) -.main_keys EQU 0x0205 -.make_expt EQU 0x313B -.make_room EQU 0x1655 -.mask_int EQU 0x0038 -.me_contrl EQU 0x08B6 -.me_ent_1 EQU 0x093E -.me_ent_2 EQU 0x0955 -.me_ent_3 EQU 0x0958 -.me_enter EQU 0x092C -.me_new_l2 EQU 0x08EB -.me_new_lp EQU 0x08D2 -.me_old_l1 EQU 0x08DF -.me_old_lp EQU 0x08D7 -.me_old_v1 EQU 0x0901 -.me_old_v2 EQU 0x0909 -.me_old_v3 EQU 0x0912 -.me_old_v4 EQU 0x091E -.me_old_vp EQU 0x08F9 -.me_var_l1 EQU 0x0921 -.me_var_l2 EQU 0x0923 -.me_var_lp EQU 0x08F0 -.mlt_loop EQU 0x3114 -.move_fp EQU 0x33C0 -.mult_long EQU 0x30F0 -.mult_oflw EQU 0x30EF -.mult_rslt EQU 0x30EA -.multiply EQU 0x30CA -.n_mod_m EQU 0x36A0 -.n_negtv EQU 0x3705 -.near_zero EQU 0x3159 -.neg_byte EQU 0x2FAF -.neg_test EQU 0x3474 -.negate EQU 0x346E -.new EQU 0x11B7 -.next EQU 0x1DAB -.next_1 EQU 0x1DE2 -.next_2 EQU 0x1DE9 -.next_2num EQU 0x1C79 -.next_char EQU 0x0020 -.next_line EQU 0x1BD1 -.next_loop EQU 0x1DDA -.next_o_1 EQU 0x19C7 -.next_o_2 EQU 0x19CE -.next_o_3 EQU 0x19D5 -.next_o_4 EQU 0x19D6 -.next_o_5 EQU 0x19DB -.next_one EQU 0x19B8 -.nil_bytes EQU 0x3272 -.nmi_vect EQU 0x121C -.no_add EQU 0x311B -.no_and_no EQU 0x3524 -.no_l_eql_etc EQU 0x353B -.no_reset EQU 0x0070 -.no_rstore EQU 0x31F9 -.normalise EQU 0x316C -.norml_now EQU 0x3186 -.not EQU 0x3501 -.not_bin EQU 0x2CB8 -.not_used EQU 0x1988 -.nu_or_str EQU 0x354E -.number EQU 0x18B6 -.numeric EQU 0x2D1B -.nxt_dgt_1 EQU 0x2CDA -.nxt_dgt_2 EQU 0x2D40 -.offst_tbl EQU 0x1A48 -.oflow_clr EQU 0x3195 -.oflw1_clr EQU 0x3146 -.oflw2_clr EQU 0x3151 -.one EQU 0x386A -.one_shift EQU 0x2FE5 -.one_space EQU 0x1652 -.op_str_lu EQU 0x177A -.open EQU 0x1736 -.open_1 EQU 0x1756 -.open_2 EQU 0x175D -.open_3 EQU 0x1767 -.open_end EQU 0x178B -.open_k EQU 0x1781 -.open_p EQU 0x1789 -.open_s EQU 0x1785 -.or EQU 0x351B -.other_str EQU 0x35B7 -.out EQU 0x1E7A -.out_c_1 EQU 0x18F3 -.out_c_2 EQU 0x1909 -.out_ch_1 EQU 0x195A -.out_ch_2 EQU 0x1968 -.out_ch_3 EQU 0x196C -.out_char EQU 0x1937 -.out_code EQU 0x15EF -.out_curs EQU 0x18E1 -.out_flash EQU 0x18C1 -.out_line1 EQU 0x1865 -.out_line2 EQU 0x187D -.out_line3 EQU 0x1881 -.out_line4 EQU 0x1894 -.out_line5 EQU 0x18A1 -.out_line6 EQU 0x18B4 -.out_line EQU 0x1855 -.out_num_1 EQU 0x1A1B -.out_num_2 EQU 0x1A28 -.out_num_3 EQU 0x1A30 -.out_num_4 EQU 0x1A42 -.out_sp_1 EQU 0x192B -.out_sp_2 EQU 0x1925 -.out_sp_no EQU 0x192A -.p_beep EQU 0x1AE3 -.p_border EQU 0x1AF5 -.p_bright EQU 0x1AEE -.p_cat EQU 0x1B14 -.p_circle EQU 0x1AE7 -.p_clear EQU 0x1ABB -.p_close EQU 0x1B02 -.p_cls EQU 0x1ABE -.p_cont EQU 0x1AB8 -.p_copy EQU 0x1AD6 -.p_data EQU 0x1ACC -.p_def_fn EQU 0x1AF9 -.p_dim EQU 0x1AA2 -.p_draw EQU 0x1AD2 -.p_erase EQU 0x1B10 -.p_flash EQU 0x1AED -.p_for EQU 0x1A90 -.p_format EQU 0x1B06 -.p_go_sub EQU 0x1A86 -.p_go_to EQU 0x1A7D -.p_if EQU 0x1A81 -.p_ink EQU 0x1AEB -.p_input EQU 0x1A9F -.p_int_sto EQU 0x2D8C -.p_inverse EQU 0x1AEF -.p_let EQU 0x1A7A -.p_list EQU 0x1AAE -.p_llist EQU 0x1ADC -.p_load EQU 0x1AE0 -.p_lprint EQU 0x1AD9 -.p_merge EQU 0x1AE2 -.p_move EQU 0x1B0A -.p_new EQU 0x1AA8 -.p_next EQU 0x1A98 -.p_open EQU 0x1AFC -.p_out EQU 0x1AF1 -.p_over EQU 0x1AF0 -.p_paper EQU 0x1AEC -.p_pause EQU 0x1AC5 -.p_plot EQU 0x1AC1 -.p_poke EQU 0x1AB1 -.p_print EQU 0x1A9C -.p_random EQU 0x1AB5 -.p_read EQU 0x1AC9 -.p_rem EQU 0x1AA5 -.p_restore EQU 0x1ACF -.p_return EQU 0x1A8D -.p_run EQU 0x1AAB -.p_save EQU 0x1ADF -.p_stop EQU 0x1A8A -.p_verify EQU 0x1AE1 -.pass_by EQU 0x1E39 -.pause EQU 0x1F3A -.pause_1 EQU 0x1F3D -.pause_2 EQU 0x1F49 -.pause_end EQU 0x1F4F -.peek EQU 0x34AC -.perm EQU 0x1C96 -.pf_all_9 EQU 0x2EB8 -.pf_bits EQU 0x2E7B -.pf_bytes EQU 0x2E8A -.pf_count EQU 0x2F2D -.pf_dc_out EQU 0x2F5E -.pf_dec_0s EQU 0x2F64 -.pf_digits EQU 0x2EA1 -.pf_e_frmt EQU 0x2F6C -.pf_e_pos EQU 0x2F83 -.pf_e_sbrn EQU 0x2F4A -.pf_e_sign EQU 0x2F85 -.pf_fr_dgt EQU 0x2EEC -.pf_fr_exx EQU 0x2EEF -.pf_fractn EQU 0x2ECF -.pf_frn_lp EQU 0x2EDF -.pf_insert EQU 0x2EA9 -.pf_large EQU 0x2E56 -.pf_loop EQU 0x2E01 -.pf_medium EQU 0x2E6F -.pf_more EQU 0x2ECB -.pf_negtve EQU 0x2DF2 -.pf_not_e EQU 0x2F46 -.pf_out_dt EQU 0x2F59 -.pf_out_lp EQU 0x2F52 -.pf_postve EQU 0x2DF8 -.pf_r_back EQU 0x2F25 -.pf_rnd_lp EQU 0x2F18 -.pf_round EQU 0x2F0C -.pf_save EQU 0x2E1E -.pf_small EQU 0x2E24 -.pf_test_2 EQU 0x2EB3 -.pixel_add EQU 0x22AA -.pl_tst_in EQU 0x22FD -.plot EQU 0x22DC -.plot_22df EQU 0x22DF ; secondary entry to PLOT -.plot_end EQU 0x2303 -.plot_loop EQU 0x22F0 -.plot_sub EQU 0x22E5 ; the plot subroutine (coords in BC) -.po_1_oper EQU 0x0A7A -.po_2_oper EQU 0x0A75 -.po_able EQU 0x0AD9 -.po_any EQU 0x0B24 -.po_at_err EQU 0x0AAC -.po_at_set EQU 0x0ABF -.po_attr EQU 0x0BDB -.po_attr_1 EQU 0x0BFA -.po_attr_2 EQU 0x0C08 -.po_back_1 EQU 0x0A23 -.po_back_2 EQU 0x0A38 -.po_back_3 EQU 0x0A3A -.po_change EQU 0x0A80 -.po_char EQU 0x0B65 -.po_char_2 EQU 0x0B6A -.po_char_3 EQU 0x0B76 -.po_comma EQU 0x0A5F -.po_cont EQU 0x0A87 -.po_each EQU 0x0C22 -.po_enter EQU 0x0A4F -.po_f_pr EQU 0x0B1D -.po_fetch EQU 0x0B03 -.po_fill EQU 0x0AC3 -.po_gr_1 EQU 0x0B38 -.po_gr_2 EQU 0x0B3E -.po_gr_3 EQU 0x0B4C -.po_msg EQU 0x0C0A -.po_quest EQU 0x0A69 -.po_right EQU 0x0A3D -.po_save EQU 0x0C3B -.po_scr EQU 0x0C55 -.po_scr_2 EQU 0x0C88 -.po_scr_3 EQU 0x0CD2 -.po_scr_3a EQU 0x0CF0 -.po_scr_4 EQU 0x0D02 -.po_scr_4a EQU 0x0D1C -.po_scr_4b EQU 0x0D2D -.po_search EQU 0x0C41 -.po_space EQU 0x0AD0 -.po_st_e EQU 0x0AF0 -.po_st_pr EQU 0x0AFC -.po_step EQU 0x0C44 -.po_store EQU 0x0ADC -.po_t EQU 0x0B5F -.po_t_and_udg EQU 0x0B52 -.po_t_udg EQU 0x0B52 -.po_tab EQU 0x0AC2 -.po_table EQU 0x0C14 -.po_tokens EQU 0x0C10 -.po_tr_sp EQU 0x0C35 -.po_tv_1 EQU 0x0A7D -.po_tv_2 EQU 0x0A6D -.point_lp EQU 0x22D4 -.point_sub EQU 0x22CB -.point_sub_22ce EQU 0x22CE ; secondary entry to POINT-SUB -.pointers EQU 0x1664 -.poke EQU 0x1E80 -.pr_all EQU 0x0B7F ; "print all characters" -.pr_all_1 EQU 0x0B93 -.pr_all_2 EQU 0x0BA4 -.pr_all_3 EQU 0x0BB6 -.pr_all_4 EQU 0x0BB7 -.pr_all_5 EQU 0x0BC1 -.pr_all_6 EQU 0x0BD3 -.pr_at_tab EQU 0x201E -.pr_end_z EQU 0x2045 -.pr_item_1 EQU 0x1FFC -.pr_item_2 EQU 0x200E -.pr_item_3 EQU 0x2024 -.pr_posn_1 EQU 0x204E -.pr_posn_2 EQU 0x2061 -.pr_posn_3 EQU 0x2067 -.pr_posn_4 EQU 0x206E -.pr_st_end EQU 0x2048 -.pr_string EQU 0x203C ; print a string (start in DE, count in BC) -.prb_bytes EQU 0x0EE7 -.prep_add EQU 0x2F9B -.prep_m_or_d EQU 0x30C0 -.print EQU 0x1FCD -.print_1 EQU 0x1FCF -.print_2 EQU 0x1FDF -.print_3 EQU 0x1FE5 -.print_4 EQU 0x1FF2 -.print_a EQU 0x0010 -.print_a_2 EQU 0x15F2 -.print_cr EQU 0x1FF5 -.print_fp EQU 0x2DE3 ; print a floating point number -.print_out EQU 0x09F4 -.print_string EQU 0x203C -.ptr_done EQU 0x167F -.ptr_next EQU 0x166B -.r_i_store EQU 0x365F -.ram_check EQU 0x11DA -.ram_done EQU 0x11EF -.ram_fill EQU 0x11DC -.ram_read EQU 0x11E2 -.ram_set EQU 0x1219 -.rand_1 EQU 0x1E5A -.randomize EQU 0x1E4F -.re_entry EQU 0x3365 -.re_st_two EQU 0x3293 -.re_stack EQU 0x3297 -.read EQU 0x1DED -.read_1 EQU 0x1E0A -.read_2 EQU 0x1E1E -.read_3 EQU 0x1DEC -.read_in EQU 0x3645 -.rec_edit EQU 0x16D4 -.reclaim_1 EQU 0x19E5 -.reclaim_2 EQU 0x19E8 -.rem EQU 0x1BB2 -.remove_fp EQU 0x11A7 -.report_0 EQU 0x1BB0 -.report_1 EQU 0x1DD8 -.report_2 EQU 0x1C2E -.report_2a EQU 0x0670 -.report_3 EQU 0x2A20 -.report_4 EQU 0x1F15 -.report_5 EQU 0x0C86 -.report_6 EQU 0x31AD -.report_6b EQU 0x3703 -.report_7 EQU 0x1F36 -.report_8 EQU 0x15E4 -.report_a EQU 0x34E7 -.report_ab EQU 0x371A -.report_b EQU 0x046C -.report_bb EQU 0x1E9F -.report_bc EQU 0x24F9 -.report_bd EQU 0x35DC -.report_c EQU 0x1C8A -.report_cb EQU 0x21CE -.report_d EQU 0x0D00 -.report_da EQU 0x0552 -.report_dc EQU 0x0F0A -.report_e EQU 0x1E08 -.report_fa EQU 0x0642 -.report_fb EQU 0x1765 -.report_h EQU 0x21D4 -.report_i EQU 0x1D84 -.report_j EQU 0x15C4 -.report_k EQU 0x2244 -.report_l EQU 0x1B7B -.report_m EQU 0x1EDA -.report_n EQU 0x1BEC -.report_oa EQU 0x160E -.report_ob EQU 0x1725 -.report_p EQU 0x2812 -.report_q EQU 0x288B -.report_r EQU 0x0806 -.reserve EQU 0x169E -.reset EQU 0x0066 -.rest_run EQU 0x1E45 -.restk_sub EQU 0x3296 -.restore EQU 0x1E42 -.result_ok EQU 0x370C -.return EQU 0x1F23 -.rom_trap EQU 0x1708 -.rpt_mesgs EQU 0x1391 -.rs_nrmlse EQU 0x32B1 -.rs_store EQU 0x32BD -.rslt_zero EQU 0x370E -.rstk_loop EQU 0x32B2 -.run EQU 0x1EA1 -.s_2_coord EQU 0x2522 -.s_alphnum EQU 0x2684 -.s_attr EQU 0x2672 -.s_attr_s EQU 0x2580 -.s_attr_s_2583 EQU 0x2583 ; secondary entry to S-ATTR-S -.s_bracket EQU 0x25E8 -.s_cont_1 EQU 0x26DD -.s_cont_2 EQU 0x2712 -.s_cont_3 EQU 0x2713 -.s_decimal EQU 0x268D -.s_fn EQU 0x25F5 -.s_fn_sbrn EQU 0x27BD -.s_ik_dollar_stk EQU 0x2660 -.s_ink_dollar_en EQU 0x2665 -.s_inkey_dollar EQU 0x2634 -.s_letter EQU 0x26C9 -.s_loop EQU 0x2734 -.s_loop_1 EQU 0x24FF -.s_loopend EQU 0x2770 -.s_negate EQU 0x26DF -.s_next EQU 0x2790 -.s_no_to_string EQU 0x2707 -.s_not_and EQU 0x2788 -.s_numeric EQU 0x26C3 -.s_opertr EQU 0x2723 -.s_pi EQU 0x2627 -.s_pi_end EQU 0x2630 -.s_point EQU 0x267B -.s_push_po EQU 0x270D -.s_q_again EQU 0x25BE -.s_q_copy EQU 0x25CB -.s_q_prms EQU 0x25D9 -.s_quote EQU 0x25B3 -.s_quote_s EQU 0x250F -.s_rnd EQU 0x25F8 -.s_rnd_end EQU 0x2625 -.s_rport_c2 EQU 0x2761 -.s_rport_c EQU 0x252D -.s_runtest EQU 0x2764 -.s_sc_mtch EQU 0x255A -.s_sc_rows EQU 0x255D -.s_scr_nxt EQU 0x2573 -.s_scr_sto EQU 0x257D -.s_screen_dollar EQU 0x2668 -.s_scrn_dollar_s EQU 0x2535 -.s_scrn_lp EQU 0x254F -.s_scrn_s EQU 0x2535 -.s_scrn_s_2538 EQU 0x2538 ; secondary entry to S-SCRN$-S -.s_sd_skip EQU 0x26B6 -.s_stk_dec EQU 0x26B5 -.s_stk_lst EQU 0x274C -.s_string EQU 0x25DB -.s_syntest EQU 0x275B -.s_tighter EQU 0x2773 -.s_u_plus EQU 0x25AF -.sa_1_sec EQU 0x0991 -.sa_8_bits EQU 0x0525 -.sa_all EQU 0x075A ; tape save/load -.sa_bit_1 EQU 0x0514 -.sa_bit_2 EQU 0x0511 -.sa_blank EQU 0x0629 -.sa_bytes EQU 0x04C2 -.sa_code EQU 0x06C3 -.sa_code_1 EQU 0x06E1 -.sa_code_2 EQU 0x06F0 -.sa_code_3 EQU 0x06F5 -.sa_code_4 EQU 0x06F9 -.sa_contrl EQU 0x0970 -.sa_data EQU 0x0652 -.sa_data_1 EQU 0x0692 -.sa_delay EQU 0x053C -.sa_flag EQU 0x04D0 -.sa_leader EQU 0x04D8 -.sa_line EQU 0x0716 -.sa_line_1 EQU 0x0723 -.sa_loop EQU 0x04FE -.sa_loop_p EQU 0x0505 -.sa_name EQU 0x064B -.sa_null EQU 0x0644 -.sa_or_ld_end EQU 0x0554 -.sa_or_ld_ret EQU 0x053F -.sa_out EQU 0x051C -.sa_parity EQU 0x050E -.sa_scr_dollar EQU 0x06A0 -.sa_set EQU 0x051A -.sa_space EQU 0x0621 -.sa_start EQU 0x0507 -.sa_sync_1 EQU 0x04EA -.sa_sync_2 EQU 0x04F2 -.sa_type_0 EQU 0x073A -.sa_type_3 EQU 0x0710 -.sa_v_new EQU 0x0685 -.sa_v_old EQU 0x0672 -.sa_v_type EQU 0x068F -.save_etc EQU 0x0605 -.scan_ent EQU 0x336C -.scan_func EQU 0x2596 -.scan_loop EQU 0x1B52 -.scanning EQU 0x24FB -.scrl_mssg EQU 0x0CF8 -.sec_plus EQU 0x3575 -.secnd_low EQU 0x356B -.separator EQU 0x1B6F -.series_xx EQU 0x3449 -.set_de EQU 0x1195 -.set_hl EQU 0x1190 -.set_min EQU 0x16B0 -.set_permanent_colors_0x1CAD EQU 0x1CAD ; special entry point -.set_permanent_colors_1CAD EQU 0x1CAD ; special entry point -.set_stk EQU 0x16C5 -.set_work EQU 0x16BF -.sf_arg_lp EQU 0x2843 -.sf_arg_vl EQU 0x2852 -.sf_argmt1 EQU 0x2802 -.sf_argmts EQU 0x27D9 -.sf_brkt_1 EQU 0x27D0 -.sf_brkt_2 EQU 0x27E4 -.sf_cp_def EQU 0x2814 -.sf_flag_6 EQU 0x27E9 -.sf_fnd_df EQU 0x2808 -.sf_not_fd EQU 0x2825 -.sf_r_br_2 EQU 0x2885 -.sf_rprt_c EQU 0x27E6 -.sf_run EQU 0x27F7 -.sf_syn_en EQU 0x27F4 -.sf_value EQU 0x288D -.sf_values EQU 0x2831 -.sfa_cp_vr EQU 0x296B -.sfa_end EQU 0x2991 -.sfa_loop EQU 0x295A -.sfa_match EQU 0x2981 -.sgn EQU 0x3492 -.shift_fp EQU 0x2FDD -.shift_len EQU 0x3055 -.shift_one EQU 0x316E -.sign_done EQU 0x2CFE -.sign_flag EQU 0x2CF2 -.sign_to_c EQU 0x3507 -.sin EQU 0x37B5 -.skip_cons EQU 0x33F7 -.skip_next EQU 0x33F8 -.skip_over EQU 0x007D -.skip_zero EQU 0x315E -.skips EQU 0x0090 -.sl_define EQU 0x2A94 -.sl_over EQU 0x2AA8 -.sl_rpt_c EQU 0x2A7A -.sl_second EQU 0x2A81 -.sl_store EQU 0x2AAD -.slicing EQU 0x2A52 -.small EQU 0x37F8 -.spare EQU 0x386E -.sqr EQU 0x384A -.st_e_part EQU 0x2CFF -.st_mem_xx EQU 0x342D -.stack_a EQU 0x2D28 -.stack_bc EQU 0x2D2B ; stack BC register pair -.stack_fetch EQU 0x2BF1 ; get last value from calculator stack -.stack_num EQU 0x33B4 -.start EQU 0x0000 -.start_new EQU 0x11CB -.stk_code EQU 0x3671 -.stk_const EQU 0x33C8 -.stk_const_xx EQU 0x341B -.stk_data EQU 0x33C6 -.stk_digit EQU 0x2D22 -.stk_f_arg EQU 0x2951 -.stk_fetch EQU 0x2BF1 -.stk_pntrs EQU 0x35BF -.stk_st_0 EQU 0x2AB1 -.stk_sto_string EQU 0x2AB2 -.stk_store EQU 0x2AB6 -.stk_to_a EQU 0x2314 -.stk_to_bc EQU 0x2307 -.stk_var EQU 0x2996 -.stk_zeros EQU 0x33F1 -.stmt_l_1 EQU 0x1B29 -.stmt_loop EQU 0x1B28 -.stmt_next EQU 0x1BF4 -.stmt_r_1 EQU 0x1B7D -.stmt_ret EQU 0x1B76 -.stop EQU 0x1CEE -.str_alter EQU 0x2070 -.str_and_no EQU 0x352D -.str_data1 EQU 0x1727 -.str_data EQU 0x171E -.str_dollar EQU 0x361F -.str_test EQU 0x3588 -.strings EQU 0x3559 -.strs_add EQU 0x359C -.strt_mlt EQU 0x3125 -.subn_only EQU 0x31F2 -.subtract EQU 0x300F -.sv_arrays EQU 0x29AE -.sv_ch_add EQU 0x29E0 -.sv_close EQU 0x29D8 -.sv_comma EQU 0x29C3 -.sv_count EQU 0x29E7 -.sv_dim EQU 0x2A48 -.sv_elem_string EQU 0x2A2C -.sv_loop EQU 0x29EA -.sv_mult EQU 0x29FB -.sv_number EQU 0x2A22 -.sv_ptr EQU 0x29C0 -.sv_rpt_c EQU 0x2A12 -.sv_simple_string EQU 0x29A1 -.sv_slice EQU 0x2A45 -.sv_slice? EQU 0x2A49 -.swap_byte EQU 0x343E -.syntax_z EQU 0x2530 -.t_expnent EQU 0x326C -.t_first EQU 0x3233 -.t_gr_zero EQU 0x3221 -.t_numeric EQU 0x3252 -.t_shift EQU 0x3261 -.t_small EQU 0x323F -.t_store EQU 0x3267 -.t_test EQU 0x325E -.tan EQU 0x37DA -.tape_msgs EQU 0x09A1 -.tbl_addrs EQU 0x32D7 -.tbl_of_ops EQU 0x2795 -.tbl_priors EQU 0x27B0 -.temp_ptr1 EQU 0x0077 -.temp_ptr2 EQU 0x0078 -.temps EQU 0x0D4D ; copy the permanent color items to the temporary ones -.temps_1 EQU 0x0D5B -.temps_2 EQU 0x0D65 -.test_5_sp EQU 0x33A9 -.test_char EQU 0x001C -.test_neg EQU 0x307C -.test_norm EQU 0x3155 -.test_room EQU 0x1F05 -.test_zero EQU 0x34E9 -.tkn_table EQU 0x0095 -.to_power EQU 0x3851 -.truncate EQU 0x3214 -.two_p_1 EQU 0x1E8E -.two_param EQU 0x1E85 -.unstack_z EQU 0x1FC3 -.use_252 EQU 0x2495 -.use_zero EQU 0x1CE6 -.usr_no EQU 0x34B3 -.usr_range EQU 0x34D3 -.usr_stack EQU 0x34E4 -.usr_string EQU 0x34BC -.v_80_byte EQU 0x2932 -.v_char EQU 0x28D4 -.v_each EQU 0x2900 -.v_end EQU 0x294B -.v_found_1 EQU 0x293E -.v_found_2 EQU 0x293F -.v_get_ptr EQU 0x2929 -.v_matches EQU 0x2912 -.v_next EQU 0x292A -.v_pass EQU 0x2943 -.v_rport_c EQU 0x360C -.v_run EQU 0x28FD -.v_run_or_syn EQU 0x28EF -.v_spaces EQU 0x2913 -.v_str_var EQU 0x28DE -.v_syntax EQU 0x2934 -.v_test_fn EQU 0x28E3 -.val_dollar EQU 0x35DE -.val_fet_1 EQU 0x1C56 -.val_fet_2 EQU 0x1C59 -.valid EQU 0x371C -.var_a_1 EQU 0x1C22 -.var_a_2 EQU 0x1C30 -.var_a_3 EQU 0x1C46 -.vr_cont_1 EQU 0x07E9 -.vr_cont_2 EQU 0x07F4 -.vr_cont_3 EQU 0x0800 -.vr_contrl EQU 0x07CB -.wait_key1 EQU 0x15DE -.wait_key EQU 0x15D4 -.x_large EQU 0x326D -.x_neg EQU 0x36B7 -.xis0 EQU 0x385D -.yneg EQU 0x37A8 -.zero_rslt EQU 0x315D -.zeros_4_or_5 EQU 0x2FFB -.zplus EQU 0x37A1 -.zx81_name EQU 0x04AA -; ZX Spectrum 128K -.ROM_SWAP EQU 0x5B00 ; 128K paging subroutine in RAM -._128_new EQU 0x0057 + MODULE BASIC_FN: +; BASIC 48 +x48: +.abs EQU #346A +.acs EQU #3843 +.add_back EQU #3004 +.add_ch_1 EQU #0F8B +.add_char EQU #0F81 +.add_char_keeping_current_mode EQU #0F85 +.add_rep_6 EQU #309F +.addend_0 EQU #2FF9 +.addition EQU #3014 +.addn_oflw EQU #303C +.all_added EQU #300D +.alpha EQU #2C8D +.alphanum EQU #2C88 +.arc_end EQU #245F +.arc_loop EQU #2425 +.arc_start EQU #2439 +.asn EQU #3833 +.atn EQU #37E2 +.auto_l_1 EQU #17CE +.auto_l_2 EQU #17E1 +.auto_l_3 EQU #17E4 +.auto_l_4 EQU #17ED +.auto_list EQU #1795 +.bc_spaces EQU #0030 +.be_end EQU #03F6 +.be_h_and_l_lp EQU #03D6 +.be_ix_plus_0 EQU #03D4 +.be_ix_plus_1 EQU #03D3 +.be_ix_plus_2 EQU #03D2 +.be_ix_plus_3 EQU #03D1 +.beep EQU #03F8 +.beeper EQU #03B5 +.bin_digit EQU #2CA2 +.bin_end EQU #2CB3 +.bits_zero EQU #3283 +.border EQU #2294 +.border_1 EQU #22A6 +.border_2297 EQU #2297 ; secondary entry to rom_border +.border_229b EQU #229B ; secondary entry to rom_border +.both_null EQU #3572 +.break_key EQU #1F54 ; return the carry flag reset if SHIFT and BREAK keys are both being pressed. +.byte_comp EQU #3564 +.byte_zero EQU #327E +.c_arc_ge1 EQU #235A +.c_ent EQU #37B7 +.c_r_gre_1 EQU #233B +.ca_10_by_a_plus_c EQU #2F8B +.calculate EQU #335B +.call_jump EQU #162C +.call_sub EQU #15F7 +.cases EQU #37FA +.cat_etc EQU #1793 +.cd_prms1 EQU #247D +.ch_add_plus_1 EQU #0074 +.chan_flag EQU #1615 +.chan_k EQU #1634 +.chan_op_1 EQU #1610 +.chan_open EQU #1601 ; open a channel (channel in A) +.chan_p EQU #164D +.chan_s EQU #1642 ; set flags for upper screen channel +.chan_s_1 EQU #1646 +.check_end EQU #1BEE +.chn_cd_lu EQU #162D +.chrs EQU #35C9 +.circle EQU #2320 +.cl_09_1 EQU #1CD6 +.cl_addr EQU #0E9B +.cl_all EQU #0DAF ; clear whole (upper) display area +.cl_attr EQU #0E88 +.cl_chan EQU #0D94 +.cl_chan_a EQU #0DA0 +.cl_line EQU #0E44 +.cl_line_1 EQU #0E4A +.cl_line_2 EQU #0E4D +.cl_line_3 EQU #0E80 +.cl_sc_all EQU #0DFE +.cl_scr_1 EQU #0E05 +.cl_scr_2 EQU #0E0D +.cl_scr_3 EQU #0E19 +.cl_scroll EQU #0E00 ; scroll the number of lines in the B register +.cl_set EQU #0DD9 +.cl_set_1 EQU #0DEE +.cl_set_2 EQU #0DF4 +.cl_str_lu EQU #1716 +.class_01 EQU #1C1F +.class_02 EQU #1C4E +.class_03 EQU #1C0D +.class_04 EQU #1C6C +.class_05 EQU #1C11 +.class_07 EQU #1C96 +.class_09 EQU #1CBE +.class_0b EQU #1CDB +.class_tbl EQU #1C01 +.clear EQU #1EAC +.clear_1 EQU #1EB7 +.clear_2 EQU #1EDC +.clear_prb EQU #0EDF +.clear_run EQU #1EAF +.clear_sp EQU #1097 +.close EQU #16E5 +.close_0_16EB EQU #16EB +.close_1 EQU #16FC +.close_2 EQU #1701 +.close_str EQU #171C +.cls EQU #0D6B ; CLS +.cls_1 EQU #0D87 +.cls_2 EQU #0D89 +.cls_3 EQU #0D8E +.cls_lower EQU #0D6E +.co_change EQU #226C +.co_temp_1 EQU #21E1 +.co_temp_2 EQU #21E2 +.co_temp_3 EQU #21F2 +.co_temp_4 EQU #21FC +.co_temp_5 EQU #2211 +.co_temp_6 EQU #2228 +.co_temp_7 EQU #2234 +.co_temp_8 EQU #223E +.co_temp_9 EQU #2246 +.co_temp_a EQU #2257 +.co_temp_b EQU #2258 +.co_temp_c EQU #2273 +.co_temp_d EQU #227D +.co_temp_e EQU #2287 +.code EQU #3669 +.comma_sp EQU #1537 +.continue EQU #1E5F +.copy EQU #0EAC +.copy_1 EQU #0EB2 +.copy_2 EQU #0EC9 +.copy_3 EQU #0ED3 +.copy_buff EQU #0ECD +.copy_end EQU #0EDA +.copy_l_1 EQU #0EFD +.copy_l_2 EQU #0F0C +.copy_l_3 EQU #0F14 +.copy_l_4 EQU #0F18 +.copy_l_5 EQU #0F1E +.copy_line EQU #0EF4 +.copyright EQU #1539 +.cos EQU #37AA +.count_one EQU #31FA +.cp_lines EQU #1980 +.ctlchrtab EQU #0A11 +.d_l_diag EQU #24D4 +.d_l_hr_vt EQU #24DB +.d_l_loop EQU #24CE +.d_l_plot EQU #24EC +.d_l_range EQU #24F7 +.d_l_step EQU #24DF +.d_letter EQU #2C1F +.d_no_loop EQU #2C2E +.d_rport_c EQU #2C05 +.d_run EQU #2C15 +.d_size EQU #2C2D +.data EQU #1E27 +.data_1 EQU #1E2C +.data_2 EQU #1E37 +.de_comma_paren_de_plus_1_parenequ EQU #2AEE +.dec_jr_nz EQU #367A +.dec_rpt_c EQU #2CCF +.dec_sto_1 EQU #2CD5 +.dec_to_fp EQU #2C9B +.decimal EQU #2CCB +.def_fn EQU #1F60 +.def_fn_1 EQU #1F6A +.def_fn_2 EQU #1F7D +.def_fn_3 EQU #1F86 +.def_fn_4 EQU #1F89 +.def_fn_5 EQU #1F94 +.def_fn_6 EQU #1FA6 +.def_fn_7 EQU #1FBD +.delete EQU #33A1 +.differ EQU #19DD +.dim EQU #2C02 +.dim_clear EQU #2C7C +.dim_sizes EQU #2C7F +.div_34th EQU #31DB +.div_loop EQU #31D2 +.div_start EQU #31E2 +.division EQU #31AF +.divn_expt EQU #313D +.dl_larger EQU #24CB +.dl_x_ge_y EQU #24C4 +.double_a EQU #338C +.dr_3_prms EQU #238D +.dr_prms EQU #23C1 +.dr_sin_nz EQU #23A3 +.draw EQU #2382 +.draw_line EQU #24B7 +.draw_line_24BA EQU #24BA ; entry point of the draw_line routine +.draw_save EQU #2497 +.drw_steps EQU #2420 +.e_divsn EQU #2D6D +.e_end EQU #2D7B +.e_fetch EQU #2D6E +.e_format EQU #2CEB +.e_fp_jump EQU #2D18 +.e_l_1 EQU #1A15 +.e_line_no EQU #19FB +.e_loop EQU #2D60 +.e_save EQU #2D55 +.e_to_fp EQU #2D4F +.e_tst_end EQU #2D71 +.each_s_1 EQU #1990 +.each_s_2 EQU #1998 +.each_s_3 EQU #199A +.each_s_4 EQU #19A5 +.each_s_5 EQU #19AD +.each_s_6 EQU #19B1 +.each_stmt EQU #198B +.ed_again EQU #0F30 +.ed_blank EQU #1150 +.ed_c_done EQU #117C +.ed_c_end EQU #117E +.ed_contr EQU #0F6C +.ed_copy EQU #111D +.ed_cur EQU #1011 +.ed_delete EQU #1015 +.ed_down EQU #0FF3 +.ed_edge EQU #1031 +.ed_edge_1 EQU #103E +.ed_edge_2 EQU #1051 +.ed_edit EQU #0FA9 +.ed_end EQU #1026 +.ed_enter EQU #1024 +.ed_error EQU #107F +.ed_full EQU #1167 +.ed_graph EQU #107C +.ed_ignore EQU #101E +.ed_keys EQU #0F92 +.ed_keys_t EQU #0FA0 +.ed_left EQU #1007 +.ed_list EQU #106E +.ed_loop EQU #0F38 +.ed_right EQU #100C +.ed_spaces EQU #115E +.ed_stop EQU #1001 +.ed_symbol EQU #1076 +.ed_up EQU #1059 +.editor EQU #0F2C +.end_calc EQU #369B +.end_compl EQU #30A3 +.end_tests EQU #358C +.ent_table EQU #338E +.error_1 EQU #0008 +.error_2 EQU #0053 +.error_3 EQU #0055 +.error_4 EQU #0058 +.ex_or_not EQU #3543 +.exchange EQU #343C +.exit EQU #36C2 +.exp EQU #36C4 +.expt_1num EQU #1C82 +.expt_2num EQU #1C7A +.expt_exp EQU #1C8C +.f_found EQU #1D7C +.f_l_s EQU #1D34 +.f_loop EQU #1D64 +.f_reorder EQU #1D16 +.f_use_1 EQU #1D10 +.fetch_num EQU #1CDE +.fetch_two EQU #2FBA +.find_i_1 EQU #1E9C +.find_int1 EQU #1E94 +.find_int2 EQU #1E99 +.first_3d EQU #3380 +.fn_skpovr EQU #28AB +.for EQU #1D03 +.form_exp EQU #33DE +.fp_0_or_1 EQU #350B +.fp_a_end EQU #2DE1 +.fp_calc EQU #0028 +.fp_calc_2 EQU #33A2 +.fp_delete EQU #2DAD +.fp_to_a EQU #2DD5 +.fp_to_bc EQU #2DA2 +.free_mem EQU #1F1A +.frst_less EQU #3585 +.full_addn EQU #303E +.g_loop EQU #3453 +.gen_ent_1 EQU #335E +.gen_ent_2 EQU #3362 +.get_argt EQU #3783 +.get_char EQU #0018 +.get_hl_by_de EQU #2AF4 +.get_mem_xx EQU #340F +.get_param EQU #1B55 +.go_nc_mlt EQU #30A5 +.go_sub EQU #1EED +.go_to EQU #1E67 +.go_to_2 EQU #1E73 +.go_to_bc EQU #1E6A ; 'GO TO' line in BC register +.go_to_hl EQU #1E6C ; 'GO TO' line in HL register XXX not tested +.gre.8 EQU #373D +.greater_0 EQU #34F9 +.hl_again EQU #30BC +.hl_by_de_to_hl EQU #30A9 ; HL=HL*DE +.hl_end EQU #30BE +.hl_hl_by_de EQU #30A9 +.hl_loop EQU #30B1 +.hlxde EQU #30A9 ; HL=HL*DE +.i_carry EQU #2AE8 +.i_restore EQU #2AEB +.if EQU #1CF0 +.if_1 EQU #1D00 +.in EQU #34A5 +.in_assign EQU #21B9 +.in_chan_k EQU #21D6 +.in_item_1 EQU #20C1 +.in_item_2 EQU #20D8 +.in_item_3 EQU #20ED +.in_next_1 EQU #21AF +.in_next_2 EQU #21B2 +.in_pk_stk EQU #34B0 +.in_pr_1 EQU #211A +.in_pr_2 EQU #211C +.in_pr_3 EQU #2129 +.in_prompt EQU #20FA +.in_stop EQU #21D0 +.in_var_1 EQU #213A +.in_var_2 EQU #2148 +.in_var_3 EQU #215E +.in_var_4 EQU #2161 +.in_var_5 EQU #2174 +.in_var_6 EQU #219B +.indexer EQU #16DC +.indexer_1 EQU #16DB +.init_chan EQU #15AF +.init_strm EQU #15C6 +.input EQU #2089 +.input_1 EQU #2096 +.input_2 EQU #20AD +.input_ad EQU #15E6 +.int EQU #36AF +.int_case EQU #3483 +.int_exp1 EQU #2ACC +.int_exp2 EQU #2ACD +.int_fetch EQU #2D7F +.int_store EQU #2D8E +.int_to_fp EQU #2D3B +.ix_end EQU #3290 +.jump EQU #3686 +.jump_2 EQU #3687 +.jump_true EQU #368F +.k_8_and_9 EQU #0382 +.k_@_char EQU #03B2 +.k_ch_set EQU #02D1 +.k_digit EQU #0367 +.k_e_let EQU #0341 +.k_end EQU #0308 +.k_gra_dgt EQU #0389 +.k_klc_dgt EQU #039D +.k_klc_let EQU #034F +.k_look_up EQU #034A +.k_main EQU #032C +.k_new EQU #02F1 +.k_repeat EQU #0310 +.k_st_loop EQU #02C6 +.k_tokens EQU #0364 +.key_3keys EQU #029F +.key_bits EQU #02A1 +.key_chan EQU #1113 +.key_contr EQU #10FA +.key_data EQU #1105 +.key_decode EQU #0333 +.key_done2 EQU #111B +.key_done EQU #02AB +.key_flag EQU #10F4 +.key_input EQU #10A8 +.key_int EQU #0048 +.key_line EQU #0296 +.key_m_cl EQU #10DB +.key_mode EQU #10E6 +.key_next EQU #110D +.key_scan EQU #028E +.key_test EQU #031E +.keyboard EQU #02BF +.l_add_string EQU #2BAF +.l_char EQU #2B3E +.l_delete_string EQU #2B72 +.l_each_ch EQU #2B0B +.l_enter EQU #2BA6 +.l_exists EQU #2B66 +.l_first EQU #2BEA +.l_in_w_or_s EQU #2BA3 +.l_length EQU #2B9B +.l_new_string EQU #2BC0 +.l_no_sp EQU #2B0C +.l_numeric EQU #2B59 +.l_single EQU #2B4F +.l_spaces EQU #2B29 +.l_string EQU #2BC6 +.l_test_ch EQU #2B1F +.last EQU #386C +.ld_8_bits EQU #05CA +.ld_block EQU #0802 +.ld_break EQU #056B +.ld_bytes EQU #0556 +.ld_ch_pr EQU #07AD +.ld_cont_1 EQU #0819 +.ld_cont_2 EQU #0825 +.ld_contrl EQU #0808 +.ld_data EQU #082E +.ld_data_1 EQU #084C +.ld_dec EQU #05C4 +.ld_delay EQU #05E9 +.ld_edge_1 EQU #05E7 +.ld_edge_2 EQU #05E3 +.ld_flag EQU #05B3 +.ld_leader EQU #0580 +.ld_look_h EQU #0767 +.ld_loop EQU #05A9 +.ld_marker EQU #05C8 +.ld_name EQU #07A6 +.ld_next EQU #05C2 +.ld_prog EQU #0873 +.ld_prog_1 EQU #08AD +.ld_sample EQU #05ED +.ld_start EQU #056C +.ld_sync EQU #058F +.ld_type EQU #078A +.ld_verify EQU #05BD +.ld_wait EQU #0574 +.len EQU #3674 +.less_0 EQU #3506 +.less_mask EQU #328A +.let EQU #2AFF +.line_ad_1 EQU #1974 +.line_addr EQU #196E +.line_draw EQU #2477 +.line_end EQU #1BB3 +.line_new EQU #1B9E +.line_no EQU #1695 +.line_no_a EQU #1691 +.line_run EQU #1B8A +.line_scan EQU #1B17 +.line_use EQU #1BBF +.line_zero EQU #168F +.list EQU #17F9 +.list_1 EQU #17FB +.list_2 EQU #1814 +.list_3 EQU #181A +.list_4 EQU #181F +.list_5 EQU #1822 +.list_all EQU #1833 +.list_all_2 EQU #1835 +.llist EQU #17F5 +.ln EQU #3713 +.ln_fetch EQU #190F +.ln_store EQU #191C +.loc_mem EQU #3406 +.log_paren_2_power_a_paren EQU #2DC1 +.look_p_1 EQU #1D8B +.look_p_2 EQU #1DA3 +.look_prog EQU #1D86 +.look_vars EQU #28B2 +.lprint EQU #1FC9 +.main_1 EQU #12A9 +.main_2 EQU #12AC +.main_3 EQU #12CF +.main_4 EQU #1303 +.main_5 EQU #133C +.main_5_1349 EQU #1349 +.main_6 EQU #1373 +.main_7 EQU #1376 +.main_8 EQU #1384 +.main_9 EQU #1386 +.main_add1 EQU #157D +.main_add2 EQU #15AB +.main_add EQU #155D +.main_exec EQU #12A2 +.main_g EQU #1313 ; runtime error (error in A) +.main_keys EQU #0205 +.make_expt EQU #313B +.make_room EQU #1655 +.mask_int EQU #0038 +.me_contrl EQU #08B6 +.me_ent_1 EQU #093E +.me_ent_2 EQU #0955 +.me_ent_3 EQU #0958 +.me_enter EQU #092C +.me_new_l2 EQU #08EB +.me_new_lp EQU #08D2 +.me_old_l1 EQU #08DF +.me_old_lp EQU #08D7 +.me_old_v1 EQU #0901 +.me_old_v2 EQU #0909 +.me_old_v3 EQU #0912 +.me_old_v4 EQU #091E +.me_old_vp EQU #08F9 +.me_var_l1 EQU #0921 +.me_var_l2 EQU #0923 +.me_var_lp EQU #08F0 +.mlt_loop EQU #3114 +.move_fp EQU #33C0 +.mult_long EQU #30F0 +.mult_oflw EQU #30EF +.mult_rslt EQU #30EA +.multiply EQU #30CA +.n_mod_m EQU #36A0 +.n_negtv EQU #3705 +.near_zero EQU #3159 +.neg_byte EQU #2FAF +.neg_test EQU #3474 +.negate EQU #346E +.new EQU #11B7 +.next EQU #1DAB +.next_1 EQU #1DE2 +.next_2 EQU #1DE9 +.next_2num EQU #1C79 +.next_char EQU #0020 +.next_line EQU #1BD1 +.next_loop EQU #1DDA +.next_o_1 EQU #19C7 +.next_o_2 EQU #19CE +.next_o_3 EQU #19D5 +.next_o_4 EQU #19D6 +.next_o_5 EQU #19DB +.next_one EQU #19B8 +.nil_bytes EQU #3272 +.nmi_vect EQU #121C +.no_add EQU #311B +.no_and_no EQU #3524 +.no_l_eql_etc EQU #353B +.no_reset EQU #0070 +.no_rstore EQU #31F9 +.normalise EQU #316C +.norml_now EQU #3186 +.not EQU #3501 +.not_bin EQU #2CB8 +.not_used EQU #1988 +.nu_or_str EQU #354E +.number EQU #18B6 +.numeric EQU #2D1B +.nxt_dgt_1 EQU #2CDA +.nxt_dgt_2 EQU #2D40 +.offst_tbl EQU #1A48 +.oflow_clr EQU #3195 +.oflw1_clr EQU #3146 +.oflw2_clr EQU #3151 +.one EQU #386A +.one_shift EQU #2FE5 +.one_space EQU #1652 +.op_str_lu EQU #177A +.open EQU #1736 +.open_1 EQU #1756 +.open_2 EQU #175D +.open_3 EQU #1767 +.open_end EQU #178B +.open_k EQU #1781 +.open_p EQU #1789 +.open_s EQU #1785 +.or EQU #351B +.other_str EQU #35B7 +.out EQU #1E7A +.out_c_1 EQU #18F3 +.out_c_2 EQU #1909 +.out_ch_1 EQU #195A +.out_ch_2 EQU #1968 +.out_ch_3 EQU #196C +.out_char EQU #1937 +.out_code EQU #15EF +.out_curs EQU #18E1 +.out_flash EQU #18C1 +.out_line1 EQU #1865 +.out_line2 EQU #187D +.out_line3 EQU #1881 +.out_line4 EQU #1894 +.out_line5 EQU #18A1 +.out_line6 EQU #18B4 +.out_line EQU #1855 +.out_num_1 EQU #1A1B +.out_num_2 EQU #1A28 +.out_num_3 EQU #1A30 +.out_num_4 EQU #1A42 +.out_sp_1 EQU #192B +.out_sp_2 EQU #1925 +.out_sp_no EQU #192A +.p_beep EQU #1AE3 +.p_border EQU #1AF5 +.p_bright EQU #1AEE +.p_cat EQU #1B14 +.p_circle EQU #1AE7 +.p_clear EQU #1ABB +.p_close EQU #1B02 +.p_cls EQU #1ABE +.p_cont EQU #1AB8 +.p_copy EQU #1AD6 +.p_data EQU #1ACC +.p_def_fn EQU #1AF9 +.p_dim EQU #1AA2 +.p_draw EQU #1AD2 +.p_erase EQU #1B10 +.p_flash EQU #1AED +.p_for EQU #1A90 +.p_format EQU #1B06 +.p_go_sub EQU #1A86 +.p_go_to EQU #1A7D +.p_if EQU #1A81 +.p_ink EQU #1AEB +.p_input EQU #1A9F +.p_int_sto EQU #2D8C +.p_inverse EQU #1AEF +.p_let EQU #1A7A +.p_list EQU #1AAE +.p_llist EQU #1ADC +.p_load EQU #1AE0 +.p_lprint EQU #1AD9 +.p_merge EQU #1AE2 +.p_move EQU #1B0A +.p_new EQU #1AA8 +.p_next EQU #1A98 +.p_open EQU #1AFC +.p_out EQU #1AF1 +.p_over EQU #1AF0 +.p_paper EQU #1AEC +.p_pause EQU #1AC5 +.p_plot EQU #1AC1 +.p_poke EQU #1AB1 +.p_print EQU #1A9C +.p_random EQU #1AB5 +.p_read EQU #1AC9 +.p_rem EQU #1AA5 +.p_restore EQU #1ACF +.p_return EQU #1A8D +.p_run EQU #1AAB +.p_save EQU #1ADF +.p_stop EQU #1A8A +.p_verify EQU #1AE1 +.pass_by EQU #1E39 +.pause EQU #1F3A +.pause_1 EQU #1F3D +.pause_2 EQU #1F49 +.pause_end EQU #1F4F +.peek EQU #34AC +.perm EQU #1C96 +.pf_all_9 EQU #2EB8 +.pf_bits EQU #2E7B +.pf_bytes EQU #2E8A +.pf_count EQU #2F2D +.pf_dc_out EQU #2F5E +.pf_dec_0s EQU #2F64 +.pf_digits EQU #2EA1 +.pf_e_frmt EQU #2F6C +.pf_e_pos EQU #2F83 +.pf_e_sbrn EQU #2F4A +.pf_e_sign EQU #2F85 +.pf_fr_dgt EQU #2EEC +.pf_fr_exx EQU #2EEF +.pf_fractn EQU #2ECF +.pf_frn_lp EQU #2EDF +.pf_insert EQU #2EA9 +.pf_large EQU #2E56 +.pf_loop EQU #2E01 +.pf_medium EQU #2E6F +.pf_more EQU #2ECB +.pf_negtve EQU #2DF2 +.pf_not_e EQU #2F46 +.pf_out_dt EQU #2F59 +.pf_out_lp EQU #2F52 +.pf_postve EQU #2DF8 +.pf_r_back EQU #2F25 +.pf_rnd_lp EQU #2F18 +.pf_round EQU #2F0C +.pf_save EQU #2E1E +.pf_small EQU #2E24 +.pf_test_2 EQU #2EB3 +.pixel_add EQU #22AA +.pl_tst_in EQU #22FD +.plot EQU #22DC +.plot_22df EQU #22DF ; secondary entry to PLOT +.plot_end EQU #2303 +.plot_loop EQU #22F0 +.plot_sub EQU #22E5 ; the plot subroutine (coords in BC) +.po_1_oper EQU #0A7A +.po_2_oper EQU #0A75 +.po_able EQU #0AD9 +.po_any EQU #0B24 +.po_at_err EQU #0AAC +.po_at_set EQU #0ABF +.po_attr EQU #0BDB +.po_attr_1 EQU #0BFA +.po_attr_2 EQU #0C08 +.po_back_1 EQU #0A23 +.po_back_2 EQU #0A38 +.po_back_3 EQU #0A3A +.po_change EQU #0A80 +.po_char EQU #0B65 +.po_char_2 EQU #0B6A +.po_char_3 EQU #0B76 +.po_comma EQU #0A5F +.po_cont EQU #0A87 +.po_each EQU #0C22 +.po_enter EQU #0A4F +.po_f_pr EQU #0B1D +.po_fetch EQU #0B03 +.po_fill EQU #0AC3 +.po_gr_1 EQU #0B38 +.po_gr_2 EQU #0B3E +.po_gr_3 EQU #0B4C +.po_msg EQU #0C0A +.po_quest EQU #0A69 +.po_right EQU #0A3D +.po_save EQU #0C3B +.po_scr EQU #0C55 +.po_scr_2 EQU #0C88 +.po_scr_3 EQU #0CD2 +.po_scr_3a EQU #0CF0 +.po_scr_4 EQU #0D02 +.po_scr_4a EQU #0D1C +.po_scr_4b EQU #0D2D +.po_search EQU #0C41 +.po_space EQU #0AD0 +.po_st_e EQU #0AF0 +.po_st_pr EQU #0AFC +.po_step EQU #0C44 +.po_store EQU #0ADC +.po_t EQU #0B5F +.po_t_and_udg EQU #0B52 +.po_t_udg EQU #0B52 +.po_tab EQU #0AC2 +.po_table EQU #0C14 +.po_tokens EQU #0C10 +.po_tr_sp EQU #0C35 +.po_tv_1 EQU #0A7D +.po_tv_2 EQU #0A6D +.point_lp EQU #22D4 +.point_sub EQU #22CB +.point_sub_22ce EQU #22CE ; secondary entry to POINT-SUB +.pointers EQU #1664 +.poke EQU #1E80 +.pr_all EQU #0B7F ; "print all characters" +.pr_all_1 EQU #0B93 +.pr_all_2 EQU #0BA4 +.pr_all_3 EQU #0BB6 +.pr_all_4 EQU #0BB7 +.pr_all_5 EQU #0BC1 +.pr_all_6 EQU #0BD3 +.pr_at_tab EQU #201E +.pr_end_z EQU #2045 +.pr_item_1 EQU #1FFC +.pr_item_2 EQU #200E +.pr_item_3 EQU #2024 +.pr_posn_1 EQU #204E +.pr_posn_2 EQU #2061 +.pr_posn_3 EQU #2067 +.pr_posn_4 EQU #206E +.pr_st_end EQU #2048 +.pr_string EQU #203C ; print a string (start in DE, count in BC) +.prb_bytes EQU #0EE7 +.prep_add EQU #2F9B +.prep_m_or_d EQU #30C0 +.print EQU #1FCD +.print_1 EQU #1FCF +.print_2 EQU #1FDF +.print_3 EQU #1FE5 +.print_4 EQU #1FF2 +.print_a EQU #0010 +.print_a_2 EQU #15F2 +.print_cr EQU #1FF5 +.print_fp EQU #2DE3 ; print a floating point number +.print_out EQU #09F4 +.print_string EQU #203C +.ptr_done EQU #167F +.ptr_next EQU #166B +.r_i_store EQU #365F +.ram_check EQU #11DA +.ram_done EQU #11EF +.ram_fill EQU #11DC +.ram_read EQU #11E2 +.ram_set EQU #1219 +.rand_1 EQU #1E5A +.randomize EQU #1E4F +.re_entry EQU #3365 +.re_st_two EQU #3293 +.re_stack EQU #3297 +.read EQU #1DED +.read_1 EQU #1E0A +.read_2 EQU #1E1E +.read_3 EQU #1DEC +.read_in EQU #3645 +.rec_edit EQU #16D4 +.reclaim_1 EQU #19E5 +.reclaim_2 EQU #19E8 +.rem EQU #1BB2 +.remove_fp EQU #11A7 +.report_0 EQU #1BB0 +.report_1 EQU #1DD8 +.report_2 EQU #1C2E +.report_2a EQU #0670 +.report_3 EQU #2A20 +.report_4 EQU #1F15 +.report_5 EQU #0C86 +.report_6 EQU #31AD +.report_6b EQU #3703 +.report_7 EQU #1F36 +.report_8 EQU #15E4 +.report_a EQU #34E7 +.report_ab EQU #371A +.report_b EQU #046C +.report_bb EQU #1E9F +.report_bc EQU #24F9 +.report_bd EQU #35DC +.report_c EQU #1C8A +.report_cb EQU #21CE +.report_d EQU #0D00 +.report_da EQU #0552 +.report_dc EQU #0F0A +.report_e EQU #1E08 +.report_fa EQU #0642 +.report_fb EQU #1765 +.report_h EQU #21D4 +.report_i EQU #1D84 +.report_j EQU #15C4 +.report_k EQU #2244 +.report_l EQU #1B7B +.report_m EQU #1EDA +.report_n EQU #1BEC +.report_oa EQU #160E +.report_ob EQU #1725 +.report_p EQU #2812 +.report_q EQU #288B +.report_r EQU #0806 +.reserve EQU #169E +.reset EQU #0066 +.rest_run EQU #1E45 +.restk_sub EQU #3296 +.restore EQU #1E42 +.result_ok EQU #370C +.return EQU #1F23 +.rom_trap EQU #1708 +.rpt_mesgs EQU #1391 +.rs_nrmlse EQU #32B1 +.rs_store EQU #32BD +.rslt_zero EQU #370E +.rstk_loop EQU #32B2 +.run EQU #1EA1 +.s_2_coord EQU #2522 +.s_alphnum EQU #2684 +.s_attr EQU #2672 +.s_attr_s EQU #2580 +.s_attr_s_2583 EQU #2583 ; secondary entry to S-ATTR-S +.s_bracket EQU #25E8 +.s_cont_1 EQU #26DD +.s_cont_2 EQU #2712 +.s_cont_3 EQU #2713 +.s_decimal EQU #268D +.s_fn EQU #25F5 +.s_fn_sbrn EQU #27BD +.s_ik_dollar_stk EQU #2660 +.s_ink_dollar_en EQU #2665 +.s_inkey_dollar EQU #2634 +.s_letter EQU #26C9 +.s_loop EQU #2734 +.s_loop_1 EQU #24FF +.s_loopend EQU #2770 +.s_negate EQU #26DF +.s_next EQU #2790 +.s_no_to_string EQU #2707 +.s_not_and EQU #2788 +.s_numeric EQU #26C3 +.s_opertr EQU #2723 +.s_pi EQU #2627 +.s_pi_end EQU #2630 +.s_point EQU #267B +.s_push_po EQU #270D +.s_q_again EQU #25BE +.s_q_copy EQU #25CB +.s_q_prms EQU #25D9 +.s_quote EQU #25B3 +.s_quote_s EQU #250F +.s_rnd EQU #25F8 +.s_rnd_end EQU #2625 +.s_rport_c2 EQU #2761 +.s_rport_c EQU #252D +.s_runtest EQU #2764 +.s_sc_mtch EQU #255A +.s_sc_rows EQU #255D +.s_scr_nxt EQU #2573 +.s_scr_sto EQU #257D +.s_screen_dollar EQU #2668 +.s_scrn_dollar_s EQU #2535 +.s_scrn_lp EQU #254F +.s_scrn_s EQU #2535 +.s_scrn_s_2538 EQU #2538 ; secondary entry to S-SCRN$-S +.s_sd_skip EQU #26B6 +.s_stk_dec EQU #26B5 +.s_stk_lst EQU #274C +.s_string EQU #25DB +.s_syntest EQU #275B +.s_tighter EQU #2773 +.s_u_plus EQU #25AF +.sa_1_sec EQU #0991 +.sa_8_bits EQU #0525 +.sa_all EQU #075A ; tape save/load +.sa_bit_1 EQU #0514 +.sa_bit_2 EQU #0511 +.sa_blank EQU #0629 +.sa_bytes EQU #04C2 +.sa_code EQU #06C3 +.sa_code_1 EQU #06E1 +.sa_code_2 EQU #06F0 +.sa_code_3 EQU #06F5 +.sa_code_4 EQU #06F9 +.sa_contrl EQU #0970 +.sa_data EQU #0652 +.sa_data_1 EQU #0692 +.sa_delay EQU #053C +.sa_flag EQU #04D0 +.sa_leader EQU #04D8 +.sa_line EQU #0716 +.sa_line_1 EQU #0723 +.sa_loop EQU #04FE +.sa_loop_p EQU #0505 +.sa_name EQU #064B +.sa_null EQU #0644 +.sa_or_ld_end EQU #0554 +.sa_or_ld_ret EQU #053F +.sa_out EQU #051C +.sa_parity EQU #050E +.sa_scr_dollar EQU #06A0 +.sa_set EQU #051A +.sa_space EQU #0621 +.sa_start EQU #0507 +.sa_sync_1 EQU #04EA +.sa_sync_2 EQU #04F2 +.sa_type_0 EQU #073A +.sa_type_3 EQU #0710 +.sa_v_new EQU #0685 +.sa_v_old EQU #0672 +.sa_v_type EQU #068F +.save_etc EQU #0605 +.scan_ent EQU #336C +.scan_func EQU #2596 +.scan_loop EQU #1B52 +.scanning EQU #24FB +.scrl_mssg EQU #0CF8 +.sec_plus EQU #3575 +.secnd_low EQU #356B +.separator EQU #1B6F +.series_xx EQU #3449 +.set_de EQU #1195 +.set_hl EQU #1190 +.set_min EQU #16B0 +.set_permanent_colors_0x1CAD EQU #1CAD ; special entry point +.set_permanent_colors_1CAD EQU #1CAD ; special entry point +.set_stk EQU #16C5 +.set_work EQU #16BF +.sf_arg_lp EQU #2843 +.sf_arg_vl EQU #2852 +.sf_argmt1 EQU #2802 +.sf_argmts EQU #27D9 +.sf_brkt_1 EQU #27D0 +.sf_brkt_2 EQU #27E4 +.sf_cp_def EQU #2814 +.sf_flag_6 EQU #27E9 +.sf_fnd_df EQU #2808 +.sf_not_fd EQU #2825 +.sf_r_br_2 EQU #2885 +.sf_rprt_c EQU #27E6 +.sf_run EQU #27F7 +.sf_syn_en EQU #27F4 +.sf_value EQU #288D +.sf_values EQU #2831 +.sfa_cp_vr EQU #296B +.sfa_end EQU #2991 +.sfa_loop EQU #295A +.sfa_match EQU #2981 +.sgn EQU #3492 +.shift_fp EQU #2FDD +.shift_len EQU #3055 +.shift_one EQU #316E +.sign_done EQU #2CFE +.sign_flag EQU #2CF2 +.sign_to_c EQU #3507 +.sin EQU #37B5 +.skip_cons EQU #33F7 +.skip_next EQU #33F8 +.skip_over EQU #007D +.skip_zero EQU #315E +.skips EQU #0090 +.sl_define EQU #2A94 +.sl_over EQU #2AA8 +.sl_rpt_c EQU #2A7A +.sl_second EQU #2A81 +.sl_store EQU #2AAD +.slicing EQU #2A52 +.small EQU #37F8 +.spare EQU #386E +.sqr EQU #384A +.st_e_part EQU #2CFF +.st_mem_xx EQU #342D +.stack_a EQU #2D28 +.stack_bc EQU #2D2B ; stack BC register pair +.stack_fetch EQU #2BF1 ; get last value from calculator stack +.stack_num EQU #33B4 +.start EQU #0000 +.start_new EQU #11CB +.stk_code EQU #3671 +.stk_const EQU #33C8 +.stk_const_xx EQU #341B +.stk_data EQU #33C6 +.stk_digit EQU #2D22 +.stk_f_arg EQU #2951 +.stk_fetch EQU #2BF1 +.stk_pntrs EQU #35BF +.stk_st_0 EQU #2AB1 +.stk_sto_string EQU #2AB2 +.stk_store EQU #2AB6 +.stk_to_a EQU #2314 +.stk_to_bc EQU #2307 +.stk_var EQU #2996 +.stk_zeros EQU #33F1 +.stmt_l_1 EQU #1B29 +.stmt_loop EQU #1B28 +.stmt_next EQU #1BF4 +.stmt_r_1 EQU #1B7D +.stmt_ret EQU #1B76 +.stop EQU #1CEE +.str_alter EQU #2070 +.str_and_no EQU #352D +.str_data1 EQU #1727 +.str_data EQU #171E +.str_dollar EQU #361F +.str_test EQU #3588 +.strings EQU #3559 +.strs_add EQU #359C +.strt_mlt EQU #3125 +.subn_only EQU #31F2 +.subtract EQU #300F +.sv_arrays EQU #29AE +.sv_ch_add EQU #29E0 +.sv_close EQU #29D8 +.sv_comma EQU #29C3 +.sv_count EQU #29E7 +.sv_dim EQU #2A48 +.sv_elem_string EQU #2A2C +.sv_loop EQU #29EA +.sv_mult EQU #29FB +.sv_number EQU #2A22 +.sv_ptr EQU #29C0 +.sv_rpt_c EQU #2A12 +.sv_simple_string EQU #29A1 +.sv_slice EQU #2A45 +.sv_slice? EQU #2A49 +.swap_byte EQU #343E +.syntax_z EQU #2530 +.t_expnent EQU #326C +.t_first EQU #3233 +.t_gr_zero EQU #3221 +.t_numeric EQU #3252 +.t_shift EQU #3261 +.t_small EQU #323F +.t_store EQU #3267 +.t_test EQU #325E +.tan EQU #37DA +.tape_msgs EQU #09A1 +.tbl_addrs EQU #32D7 +.tbl_of_ops EQU #2795 +.tbl_priors EQU #27B0 +.temp_ptr1 EQU #0077 +.temp_ptr2 EQU #0078 +.temps EQU #0D4D ; copy the permanent color items to the temporary ones +.temps_1 EQU #0D5B +.temps_2 EQU #0D65 +.test_5_sp EQU #33A9 +.test_char EQU #001C +.test_neg EQU #307C +.test_norm EQU #3155 +.test_room EQU #1F05 +.test_zero EQU #34E9 +.tkn_table EQU #0095 +.to_power EQU #3851 +.truncate EQU #3214 +.two_p_1 EQU #1E8E +.two_param EQU #1E85 +.unstack_z EQU #1FC3 +.use_252 EQU #2495 +.use_zero EQU #1CE6 +.usr_no EQU #34B3 +.usr_range EQU #34D3 +.usr_stack EQU #34E4 +.usr_string EQU #34BC +.v_80_byte EQU #2932 +.v_char EQU #28D4 +.v_each EQU #2900 +.v_end EQU #294B +.v_found_1 EQU #293E +.v_found_2 EQU #293F +.v_get_ptr EQU #2929 +.v_matches EQU #2912 +.v_next EQU #292A +.v_pass EQU #2943 +.v_rport_c EQU #360C +.v_run EQU #28FD +.v_run_or_syn EQU #28EF +.v_spaces EQU #2913 +.v_str_var EQU #28DE +.v_syntax EQU #2934 +.v_test_fn EQU #28E3 +.val_dollar EQU #35DE +.val_fet_1 EQU #1C56 +.val_fet_2 EQU #1C59 +.valid EQU #371C +.var_a_1 EQU #1C22 +.var_a_2 EQU #1C30 +.var_a_3 EQU #1C46 +.vr_cont_1 EQU #07E9 +.vr_cont_2 EQU #07F4 +.vr_cont_3 EQU #0800 +.vr_contrl EQU #07CB +.wait_key1 EQU #15DE +.wait_key EQU #15D4 +.x_large EQU #326D +.x_neg EQU #36B7 +.xis0 EQU #385D +.yneg EQU #37A8 +.zero_rslt EQU #315D +.zeros_4_or_5 EQU #2FFB +.zplus EQU #37A1 +.zx81_name EQU #04AA +; BASIC 128 +x128: +.show_main_menu EQU #259F +.ROM_SWAP EQU #5B00 ; 128K paging subroutine in RAM +;._128_new EQU #0057 + ENDMODULE \ No newline at end of file From c1f8f54ac8b6db2ac2c1481bd200b7906987b62f Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 3 Jan 2025 19:17:48 +1000 Subject: [PATCH 105/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index 0df304a..be501b0 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 0df304a7f0295eb72c7102f153f82c91d90743e0 +Subproject commit be501b0cc276065a9981e471dd26f9b069af7604 From 97bad313c5194f72646b0c86ece32c0f965c7b54 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 4 Jan 2025 02:20:28 +1000 Subject: [PATCH 106/114] ... --- Shared_Includes | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shared_Includes b/Shared_Includes index be501b0..0fffd67 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit be501b0cc276065a9981e471dd26f9b069af7604 +Subproject commit 0fffd6783d0cbdf3c6fae27d7ccbbabe151f849f From deb944d0129cb89c5e965f3ec810a85460fc7247 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Thu, 16 Jan 2025 21:18:21 +1000 Subject: [PATCH 107/114] -1 byte tr_hdd_4 --- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 0fffd67..05f7d3a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 0fffd6783d0cbdf3c6fae27d7ccbbabe151f849f +Subproject commit 05f7d3a67995d05df130988c89e5c53dcfbd5cf8 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 303a132..fab5e3d 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -69,7 +69,7 @@ HDD_SET: ; ; [x] new tr-hdd .check: DI - LD BC,SLOT3 + LD C,SLOT3 IN B,(C) LD A,SYS_PAGE OUT (SLOT3),A From 5629c4dc1d403442fe9bb3db377f9a80425e3012 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 28 Feb 2025 02:42:45 +1000 Subject: [PATCH 108/114] update shared includes --- Shared_Includes | 2 +- TRDOS/TR_MSD_3.ASZ | 2 +- TRDOS/TR_MSD_S.ASZ | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Shared_Includes b/Shared_Includes index 05f7d3a..9143dcb 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 05f7d3a67995d05df130988c89e5c53dcfbd5cf8 +Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 34e9097..a161a4f 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -540,7 +540,7 @@ GET_FILE_CLASTERS_BC: LD A,SYS_PAGE OUT (SLOT3),A LD A,L - LD HL,(SYS_PAGE.CLASTER_LEN) + LD HL,(SYS_PAGE.CLUSTER_LEN) OUT (SLOT3),A ; RET_PAGE3 EI diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index f746db5..c45bd2e 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -604,10 +604,10 @@ READ_BPB: DEC D JR NZ,.NEXT_ADD3 - LD (SYS_PAGE.CLASTER_LEN),HL + LD (SYS_PAGE.CLUSTER_LEN),HL LD B,E LD C,A - LD (SYS_PAGE.CLASTER_LEN2),BC + LD (SYS_PAGE.CLUSTER_LEN2),BC ; ; DE=0 EX DE,HL ;LD HL,0 From bc1413f28dd632da03e2ca463a659ecfb634cd12 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 29 Apr 2025 03:41:19 +1000 Subject: [PATCH 109/114] =?UTF-8?q?=D0=BC=D0=B5=D0=BB=D0=BE=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SP_TRDOS.ASM | 2 +- Shared_Includes | 2 +- TRDOS/TR_MSD_S.ASZ | 18 ++++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 66cfe14..fe2fd16 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6428,7 +6428,7 @@ READR_X: NEW_NAME: DB 22,1,3, "* Sprinter TR-DOS v.7.03 *" - DB 22,3,6, "(c) 2024 Sprinter Team" + DB 22,3,6, "(c) 2025 Sprinter Team" DB 22,5,14, "*R.F.*" DB 22,7,9, "BETA 4Mb",0 diff --git a/Shared_Includes b/Shared_Includes index 9143dcb..68e156a 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 9143dcb7f8fd9cd3ae0bc179b94fced5efd8667f +Subproject commit 68e156a69e848e7b01656cdf67122022999d75ee diff --git a/TRDOS/TR_MSD_S.ASZ b/TRDOS/TR_MSD_S.ASZ index c45bd2e..a7e7010 100644 --- a/TRDOS/TR_MSD_S.ASZ +++ b/TRDOS/TR_MSD_S.ASZ @@ -113,7 +113,9 @@ MSD_cmd5: EX AF,AF' JR MSD_RWU1 MSD_cmd6: - LD A,255 + ; A=0 + ;LD A,255 + DEC A LD (ZX_VARS.RD_WR_COM),A EX AF,AF' JR MSD_RWU1 @@ -128,7 +130,7 @@ PREPARE1: OUT (SLOT2),A LD A,(SYS_PAGE.DS_1440-4000H) - AND BIT_MASK_1440 + AND SYS_PAGE.DS_1440.IS_SET SET 0,A LD (SYS_PAGE.DS_1440-4000H),A LD A,C @@ -345,18 +347,14 @@ SWITCH_DT: LD A,(SYS_PAGE.DS_1440-4000H) BIT 0,A JR Z,NO_SW_DT - XOR BIT_MASK_1440 + XOR SYS_PAGE.DS_1440.IS_SET LD (SYS_PAGE.DS_1440-4000H),A - AND BIT_MASK_1440 + AND SYS_PAGE.DS_1440.IS_SET LD A,C OUT (SLOT2),A EI - ;!TEST - ;CALL Z,RES_1440 - ;CALL NZ,SET_1440 - ;RET - JR Z,RES_1440 - JR SET_1440 + JR Z,RES_1440 + JR SET_1440 ; NO_SW_DT: LD A,C From d297c9f907653e5fdb199a6e5f00bfefcc458a91 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Fri, 13 Jun 2025 05:23:55 +1000 Subject: [PATCH 110/114] internal boot in tr-dos --- SP_128.ASM | 29 +- SP_TRDOS.ASM | 78 ++++- Shared_Includes | 2 +- TR-DOS_6.11Q_PENTAGON512.ROM | Bin 0 -> 16384 bytes TRDOS/TR_HDD_4.ASZ | 26 ++ TRDOS/TR_MSD_2.ASZ | 5 +- TRDOS/TR_MSD_3.ASZ | 2 + TRDOS/boot/boot.asm | 265 +++++++++++++++ TRDOS/boot/boot.inc | 2 + TRDOS/boot_trd.asm | 618 ----------------------------------- 10 files changed, 394 insertions(+), 633 deletions(-) create mode 100644 TR-DOS_6.11Q_PENTAGON512.ROM create mode 100755 TRDOS/boot/boot.asm create mode 100644 TRDOS/boot/boot.inc delete mode 100644 TRDOS/boot_trd.asm diff --git a/SP_128.ASM b/SP_128.ASM index 0ea88f5..321f47f 100644 --- a/SP_128.ASM +++ b/SP_128.ASM @@ -10638,25 +10638,36 @@ L281C: LD HL,#EC0D ; Editor flags. ; JP L1AF1 ; Run the tape loader. L2831: ED_COM: BYTE 10 ; Number of entries. - BYTE #0B ; Key code: Cursor up. + ; + BYTE #0B ; Key code: Cursor up. DEFW L272E ; MENU-UP handler routine. - BYTE #0A ; Key code: Cursor dow + ; + BYTE #0A ; Key code: Cursor down DEFW L2731 ; MENU-DOWN handler routine. - BYTE #0D ; Key code: Enter. + ; + BYTE #0D ; Key code: Enter. DEFW L2717 ; MENU-SELECT handler routine. + ; BYTE '8' ; на синклер-джойстике вниз DEFW L2731 ; MENU-DOWN handler routine. - BYTE '9' ; на синклер-джойстике вверх + ; + BYTE '9' ; на синклер-джойстике вверх DEFW L272E ; MENU-UP handler routine. - BYTE '0' ; на синклер-джойстике enter + ; + ; + BYTE '0' ; на синклер-джойстике enter DEFW L2717 ; MENU-SELECT handler routine. - BYTE '6' ; на синклер-джойстике влево Page Up + ; + BYTE '6' ; на синклер-джойстике влево Page Up DEFW LEFT_E ; MENU-PageUp - BYTE #08 ; Key code: Cursor left + ; + BYTE #08 ; Key code: Cursor left DEFW LEFT ; MENU-PageUp - BYTE '7' ; [x] было 7 + ; + BYTE '7' ; [x] было 7 DEFW RIGHT_E ; MENU-PageDown - BYTE #09 ; Key code: Cursor right + ; + BYTE #09 ; Key code: Cursor right DEFW RIGHT ; MENU-PageDown ; DB #1A ; просто стереть эту строчку, не нужна diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index fe2fd16..b7dcfec 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -4,6 +4,24 @@ ;║ RE-SOURCE'd by Z80MU PROFESSIONAL version 5.2b ║ ;╚══════════════════════════════════════════════════════════╝ ;!TODO использовать внешние порты #E0 и #E3 для сохранения регистров при перехвате всяких #3D2F + +; [ ] boot loader from TR-DOS vROM + ;SHELLEXEC "sjasmplus --nologo --syntax=f --fullpath --color=on --exp=trdos/boot/boot.inc --lst=Build/boot.lst --raw=Build/boot.bin trdos/boot/boot.asm" + LUA PASS1 + compiling_boot = (os.execute("sjasmplus --nologo --syntax=f --fullpath --color=on --exp=trdos/boot/boot.inc --lst=Build/boot.lst --raw=Build/boot.bin trdos/boot/boot.asm")) + if compiling_boot then + print("--[ BOOT Build OK ]--") + --sj.insert_define("_BOOT_COMPILED_", "1") + else + print("--[ BOOT Build ERROR!!! ]--") + --sj.insert_define("_BOOT_COMPILED_", "0") + os.exit(1) + end + ENDLUA + ; IF _BOOT_COMPILED_ = 0 + ; assert 1, Error whith boot.asm + ; ENDIF + DEVICE ZXSPECTRUM128 ORG 0 @@ -14,6 +32,9 @@ INCLUDE 'Shared_Includes/constants/BIOS_equ.inc' INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' INCLUDE 'Shared_Includes/macroses/macros.z80' + MODULE vROM_Boot + INCLUDE 'trdos/boot/boot.inc' + ENDMODULE TRDOS_ROM_CMD: .READ_BPB EQU BIOS.HDD_READ_BPB and #BF @@ -552,6 +573,53 @@ AUTO_0359: POP HL JP (HL) + + +; [x] 13/06/2025 boot loader from TR-DOS vROM +;███████████████████████████████████████████████████████████████████████ +PREPARE_TO_vROM_BOOT: + LD A,(ZX_VARS.RUN_AUTO_BOOT) + AND A ; признак попытки запуска boot командой RUN без параметров + JP Z,AUTO_03D9 + ; + DI + LD HL,(ZX_VARS.ADR_RET) + LD (ZX_VARS.FL_START),HL ; временно сохраняем ADR_RET + LD HL,vROM_BOOT ; адрес возврата из AUTO_01D3 + LD (ZX_VARS.ADR_RET),HL + JP AUTO_01D3 + ; +vROM_BOOT: LD HL,(ZX_VARS.FL_START) + LD (ZX_VARS.ADR_RET),HL ; восстанавливаем ADR_RET + ; + LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + LD (ZX_VARS.FL_START),HL ; длина программы с переменными. + LD (ZX_VARS.FL_LEN),HL ; длина программы с переменными. + ; + CALL AUTO_1A01 ; Подготовка к загрузке программы на бейсике. + ; + LD HL,.LoadAddr + LD (ZX_VARS.BAS_PROG),HL ; адрес начала программы на бейсике. + ; loading + LD HL,BOOT_PART_1 + LD DE,.LoadAddr + LD BC,BOOT_PART_1.SIZE + LDIR + LD HL,BOOT_PART_2 + LD BC,BOOT_PART_2.SIZE + LDIR + ; + ;LD HL,.StartAddr + BOOT_PART_1.SIZE + BOOT_PART_2.SIZE - 3 + LD HL,vROM_Boot.StartLineNum + LD (ZX_VARS.E_LINE),HL + ; + EI + JP AUTO_012A + ; +.LoadAddr EQU vROM_Boot.org_addr ;#5D3B +.StartAddr EQU vROM_Boot.org_addr ;#5D3B +;███████████████████████████████████████████████████████████████████████ + ;----------------------------------------------------------------------- _mInfoBLOCK #03AC-$,#FF ; NAME_TRD: @@ -2298,7 +2366,10 @@ AUTO_187A: CALL SINTAX_RET CALL AUTO_292F AUTO_18A4: - JP NZ,AUTO_03D9 + ; [x] 13/06/2025 boot loader from TR-DOS vROM + ;JP NZ,AUTO_03D9 + JP NZ,PREPARE_TO_vROM_BOOT + ; CALL AUTO_165D RET AUTO_18AB: @@ -6374,9 +6445,9 @@ EDIT_X05: ; JP ZX_VARS.AUTO_5C9A ;************************************** - ; DSS 3900H,'#' - +BOOT_PART_1: INCBIN 'build/boot.bin', 0, 248 +.SIZE EQU $-BOOT_PART_1 ;********************************** _mInfoBLOCK #3C00 - $,255 AUTO_3C00: @@ -6550,6 +6621,7 @@ REDIR_3D13: ;JP HD_CMD ;#3FF0 ROM. DI JP EXP_FNS ; + ;***************************** _mInfoBLOCK #3CFA - $,255 AUTO_3CFA: diff --git a/Shared_Includes b/Shared_Includes index 68e156a..63faf9f 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 68e156a69e848e7b01656cdf67122022999d75ee +Subproject commit 63faf9f0823649cfb52e9fcaad430170a05b31a7 diff --git a/TR-DOS_6.11Q_PENTAGON512.ROM b/TR-DOS_6.11Q_PENTAGON512.ROM new file mode 100644 index 0000000000000000000000000000000000000000..503d84c0fae184e386ffd0994f2d64dee21eeac4 GIT binary patch literal 16384 zcmeHudw3Mrm1kAA)an+f9|%dMCskcMiWVTzh(_+AOA-ha8(YE><`Gpxh%GyO#)t^n zAizSglkCi_$!0v6B%9gIcxK}DgzToVJsx3Cg4Jr8s3a9e$U?@7qUo5HY|9mBiw0p# z_5Nx9&Oj+;h+Qozqi}L_$nsXlhUsE0`22^qfzv3FT9v zv_%v}F)5*z68Wo7GR6?k2WslBGnPd1&kZ>|^M|8ezOVdK=RZo0fJpxXb!c)q^%W{6J!ePEMePXLcTDomLsBtanX0ZWmz=Lj9JSi%kzB7y z9gJoASK|Ija@Jw|EINytRC4IaV&@i#cQ#1Q4U(sWcW#qB89XWM zl$?)B&L&ALcORA9|4nj#N#b~e(<0qmdHUwcUhZ_3!!FTQ3S->tqt9^Nl1H8xvvN;L z9s~DZ=R`%y{SE0xXt|FNpilld=AE3d5@nSi6uP!a{C0lx!Ph5+lz`jrk1B3M#JNTa zxT~d!+ z{2WEy=Pd9S7hhKj4d8*==$F*`$x>6NgQnGbr(aTjMfVQU+Q&Q_M^Tv4yxoH|uY9T0 zFqm^%BGY}ekjwFVj&bw+?VTQqH7Nx}${d4wsKD>a^Q#+d zeiQW(=6|z~YVUG%>$4t`l@|&znBpp8;x3=$%=Ej+#K?MN`}XlIvMbY%2bp~3nsjT{ z1#Wz)T{{K_+WftJ2G23@O8L`5?kmPI<n z0>6n4`HE0ylzm@s3EEA>RLk!kA`1hxXqr#0Hs`xND2YxV-ISAkk~t&gE|ZepLDULax{~7O7Q! zQpgp$#*`@|X0Onxq|H_7bk(rQfTytN9gZsHi|Gt161CKZ+e`*6y_`A!Uo?gle>R@uUJ!%f2`}s^vEGdZLFLJ8 zY}3#uMxr8QZ<@ce_o5MxVeA>55al_a=*5K_l|Tr`3QF1{rQWV>i=#y>*hLx!l^4jwYCP9r z(xfxh`-xGbg@573C5I}}X_R_=rsL}cY`XGxDx0djkji!`H71b4oFHOj*{*f;@{2fC za*QXtsEr>($~s-?+tvE_*A+O^x4TT+os&{j@uo#^cU_U3rtR1@WwjY5D(tXOYQq%? z0}>V`g=~CGYv}z-rnaVcNtUAMGSr-X7pKpsV$NTfC*gTGDPDJ|yG3*`#?B(MH(~bO zpBR(V*O`bXorf5yY^LAadXu{bzs)`7ls6`I_Cz_}|NThmeR!w|xMNZ{*);?n$O;UvFeQwM4KwL<{9zi{LmjQmndPmbl+C3`8mC7Qo*^g38 zNQHbbZ=$PflJK3Z4wfdH%EiKj))tL_9{Q0l8Xk&6g~pWc`EVP6{DYO6QLu^`!(9D} zF(QWbf)ToAVo%1zcMR-}i6Ue9)zE0sjA8J{+kY+&h^q$^;@Lr)?53qysC${0mejgf zh?3&!j=m#;>HNID1e1d6+i~&Qh-ND-w3V{9(j~U?%Q5o)bPjos>)Yt2u8ZNySYk1C zpSEQ=wKX0d3T<3rSI1O7rSZ>Cr?mdQjh}!C;x?F~>$-!Jy7ZaF@ zM~A`}qQt;)U-jnt-8es1yR%`4t#(iyLu!LZqNx=1_)Sj@6`?z*FwgTQ7R01PgX(iLgQQvh?6rE~D z`DQz%CD?bl&2gs`zu=%=xs5O~cGFcmteatCBtKNT)`*va6#Win;-t?B~x!N28dNR@wdHHRaE)k47S>-6MS9 zHA|YgSG}q=3+axsP1Zdmp=|?If3Sa(S#b|1)j5 zut;+YytYD^rm9|2W$}a^OFl1KH`R>zkk6^B7xS^-%Tw4I9{}nx1NIX`^PW zkkzSqN=Yi&Nqs(;Af~n6^HL|9LoED&X{}(@E}E(Zv&NfXgqqfHQE9I{1rq{>ft6yf z!!#(plC@)Eg%O6t_}C4Zi*7YpJ!!oChR48rvUyJ#?^(cm1m2UzeOhTU2g0jzqH$9y zzu*3O3^qDN=h{D!WwyF$_cC_&To@A?Ac0JSNWvLvy z{=cl0-PE%4(I?r4Wo*N)$C^le`911xx2wKKyD!wOZ)s{`8=4+%ZEj(yj0{$v23x!H zsV3rzHMH(*X=NX5+Ve!~*VqSl?P;Q1z#!g{Xs02>7X=*lMQVMyaW!-ObgA+Wj@*Fb zL*wsNJVyOqMf%+p&+0wp=n(vYfe0KE7?QW$6(uJX#|Cf#x_?e;7xUYHUw_Q;1%FI= z*ufE#5u~wj29my4lzZJC9)qb%&!sG5+*|POi64fU!X+csM#|Do?wOP&>AxMb>&*?Q z=g!!*T*1Np)~+!^I(OBstx^eCAbK1QSa@}ky^Xo{V~vkd;4|Hd45@Ui@cn_lg<2t z`TtGf7oDcM+fI}Fj0Bb@{iXNj-gcQt|8L#RFEa2cf+qno>b`Jxp!Qt&^PB| zzc@ti1!+IoGkW=by?ht3KsDSG64zmXAZBq?Dg@CADNN_6bS)cBPF|sNR8lvLN$MK7 zuky?iwvj2_y)b`6K#SX4ydYs>%fB;GKYz zx7~H?v+&H6i*xTd#?Zm8sC4)ZS$Qq1N9S@b;nF>)M4E(&b6IPmBI=spx$10nLsb7@ zRMH((<-NITV??T&;dn&4GuFNMep%=H2WWqr@gGQ`6ImeS)@K5t>8u$DftKq6VdbNo zpj-!U9{#16U@n18R=?7boz#+0krR3IxI{u-b6B&N8bpWB&HHPtl*?c`=X?L$AcGY z;}{Hkvt^Z9|4{W;pUm_?m!aAbG3R2Vs~d);y~SULtxq=cD zKz1B?+o64+N_8mc|9Q}R2k$@)#drYJFqm9HwQ=Yc#4se0T`_zMTo{&^9<;gzE)2wh zV|l2y^Y(IM8IB`+U6_DcG36%(j!}uWQ=I}msUDZHK)_1s8O6hZ(|EG`ao}hP;6X$` zt?6~qgp`Bit@1M_#O1pD62Ss{05_bMl*vMZip$Vz;+hj|8eSF?P;jyk>j?I_MkFj{ z04>RK_8u}2raYT^Y73*A6#Z)$?P44i{mbmJ{?GHtM@kkG_2|!*l{Z&(y2d5Jh@l9I zq8Ys(OG9eohZ38jHjYR&YQu;`Cb{+iyWqfELZ0uf140%I7R`7-$ROX`SOkD+L;@O_ zpL;<0-$gZg>w%sjZB4wN&WmZ){SW5ho%h#L&44T#^=UqvDx}4g@8NAC-Y@0Gpck;X zWYqrkxqy(1Jsq;nqVC_60L<*{sWZ`P;}waqCTo2~1k|!p2ReJe0JY(Q6ebNWNCdo0 zqC*#?AVkTrz@K-LoyBKnu-DMi{+`S|xk$_aVvC()5Pt{0h8PA*0x(T8dKY#!OFGFpAsiy5j zdG3KupsRNuy(St1$(*`aOa)^g9Q~_SeBrc`K`zm#0}>G|Vxth(S0wsuFzWsCG)tTR~|d zAYdhWmq??lxYiw&NQ==Gq1IGP(>X3pf(6h1BdB;5`)mGToSi$esatqx6g==8v9|cC zYXhQ37)&Mw)ZziFf^Zo&AmUd%j|!qt^9#-rX5qXdTf8fjSwN~pD>u4`Fc;AMUl;aW zZ*!lMN)4-I_H$wk@wyO0H$#xoLR-vE$lO0KhVy-fpn_a@v1nkXpx;bp4+}$IS)EEC z|F+{`f@Uc@!dMG zEzkq|hO_y<-s4H=$9a?mSn*@T!1SP)PbwDYoD8+EA^|QE6%$g$S#GbintN?=k~}Yh zk-dwwxx!^_w(tpeZV{l-DA)z8{5OnpTW^x(o6(k0nX@7?mhezr6K`i@RJvVO_7-+U zWWwKIA)^K+=xiBGo1S1OS$V#2Vu?+jcrrttcukN2vdVQPD)iIBFyPqWM1CG_@RMowy4zKSRGvZiFu7P@ynOd9zSm3;hXoLAJ*d1iXlx zLwset@6lh6NJ-U)D9^+z4jE@P^ol&e;{S)a^28%h#jlBn2P@U3;lEg2Q>{9{l1j0Z4@%|v<@Ln%;okPm`pK;yPU$zMwQ60SHx`YvIQ0# zwki(9wC$qZJ$pN6+wQQF)850X$G>>=PtG&Zfc(fw@KtiA!~;+vP!B{cjY?y{+@VHd z(QImmT3`JT{0XsSn79=orG!p zPZ2kQd;#RkBqmBQ&cOsJjyE$?Q{t6D8)Vgb#FU<0tGvpZW+Nzwn=w0%TehYI5UCBY zs0^^1Nr5JpYq*%Q@73W3c|+-ABwM-lR_#2t=>IU0p+9?u#T65)?7pwU`<~R;-~$}v z|0hpE$n(xdoIWHuR`^+?qinlrX>H#AHWFjLhLAGJEI=q4$ptvwwn>~GEtb7De`oxZ zi;MLaacBZ}5!wpzM^PLmsPB!CaTVFzWPf3AC2gMDC(z+e)DbO8ETR$UXor6$YBRBa2oxh;Nj(D0BFMB2wCWrT|>HfJn;>Q9|9WsMVK z(er5wqS;Wz$&etTVQ?#AY=PI}$2fKp-+~epuA#6J1z1)HBa(Mrp^HWsFcXV%4!qi( z@07({s6H-55YveXGK-rdFju2i_L6rPCv{*ykH6xPh)gChiNi(RPzOJ05+|ARnv)Fp za({_aNY{rJ6D%Fr9}Deu#tBpqRrvW4-bBa1#fOSw{k|d@at_0T1zVIKIU~3s!N879 zt(?kJw&jyk>O&yx#EsBXEFPAkAQX0kNSUZP`S#BvQHPbJC-4rFe)CilE1vhv=RGtJ zRAN8xE%M_+2=!1xiuXfQ?Zy2g+$SSL#CD&=o`WT<9*@Y@j7znb==qdIw$3+Eu7@QQ zGA@;M;nIJ%r*Hz@}af!t^B3-PQen1t|T9i zmd$*-Kgi4ELl_{|{o?!(GhhEs8AeMQ_3$oUFX+M&-(&oMj8#xLECZ~JBn>@y4AdaP z@%im{NDTm4bde6BfSUEGDRI#*SZ-q>G1)rnQhTV+M^aq47#k(wLtXS@%HPe8D;pQ~ z{&;>&$>H~hTs(N#j`SPL$u0~vQ$li2J2s@b?{OjJDjku9FtS0=VnvY5ksx+OWc zgIxqgYVSPAa>WRZSi(4Lrsoetg0%-H;bK`d)BgUH1y=4-Swt>wFJ65ToQs2RoN2g#vEU^+VmAJmfpH-&6SIF)`$Pw2qGtS4|JtMG(_F+2d_UmqZ{ zI3neiTB6w4Jc<$fr^JLBk+}CI^@(wtTepD8p8gt{kC?y*Wh_6`(#h^`E&%0dd$RkL z1>gojC}gE~!Ku&!yhfw_cduRdxdqBao-xfd8IjO?zb=H3zGBiF0bN}rWnD%*l*wuQLBk4*518Rd$Qi>OrTlAHT zvQZgKo0|BRjrj=G%tuLmvT>o1p&jY|@qDrz9tytHp7~ha_PFxbd~B6W7OV3MIt`f~ zGb#lzWzS4fE}prPcd{#!w_lgJ&lia%s6I|zB&HA*mB~ch29Jo0@*|&Dk;Xety(A7O&$0w6?}0Si{Bqs04a+E`|Ll6aja}E$(%iD_=$fjv z8y?xn63qSR{d@K`0Yep3ma2>6Cx|MByoZ$IKt6Exiwy}GfTiM46#(%VWSBnm0x3P~uy?gi3 z+Gc&2qYbSsO*@}roA);DX?hH`t;x|J2i|^^fbMM5fnEDr_hr;Qg9N7iExTHqDuit% zwLguA)rJ(m)8HpNp17s%dH!JR_cPk!NNM9<5Zd2l=fsEu!9fm&Tn4||nBtca2~CON ztb(d$MyVhA=sus}QPF6qNHJBU`ie{s6{Wo=n5AsXW7+AK3ufIAW`8PV>|SNHEw=4l zWp7>OXj?UB;o{7H5$1j%WZkzYdvadR)p?9PC7~aBp>L)Hux5$75Do%$p2`a?%7?@e zCx&>ep))H;UDJwAEGae$se|TJe!?U%4$|lKg3!;>i2Gqr3B6trHksRp;ogX=hug`y z9|X!6j&rk-X(#xiG);$D>#N=I1|u{fGh-?Z~F zwrlu2Kgh<_|sC;x8%hr{go{6ELqP3-MN!3@ITUwXg|HPi=mZl0SV^hnMFR}ZY z9)0Of+(rM`OaSI6#Z|c+9hG_@K=!_2)TVGE&;cY6AZ#z%)iyblmyW3L&FF>jP}Ce( zw;-1w4!wC_RH4%;u|lnZb=P6D+0aF4Dj_EMOClf%IOI`f-%^gMa?GMoz@cuYl>8Fz zgUWU{1(>Of2vFywqYE(-XS5RSNdq(lj9EE^5zu%*d2s0v$!fsJ$p$##Q0h>-5Uaa&f(IuWr-jt?0tDdz3LH_IfUSc_P@z58fF-48+@a@n$5E`77Rm&4q z%1ReUbp^i7*BtIVz)oYz`=i{}Vm;+`D%4RKA*?v&F0IN=MMlMIThxcWr9tgjcm9%t zwIpc2jyzRwiQ*#DbQ`KxyDwI{ zqLmIhN&9=C$5~XR6fH%vtD_3eMqw3Z;mpOAcIH^e#x!UzNPYQ26ve%nc26WDotJCA#jp-vI7N&;QXW^ zZbX(MXdjmkt%jeIJ$GozdPIC_(5CcO3`B^x(~}h)Vn2Qc{uqJpbod8`@r*Nz+`=sd z>RPt4O*5Ag9Rz&@Toe|ox`C~)whzP)3h@x7t3^t$g;?m^_1XaTazCgYrx6FevjL?Sl6A2O`(Kj>`BSj!=o- zF>@@Gp03tRiHYC#FM~rwNwLU4@Phef1X(BpLGPEO@p7#Dpyo9dxW;-f`@U>jbA1KIvWSL{toh88@@(q*rN*xMVQV zHh4rS^@+@&4Ss5e@EJ}4Ur-j!%T%%9IvNvtq6iBC zl;u3Zr3U~^E`mkUHbFIXB>704lj%?9FjQl&r2LoOSm((WR(&r?c#}V ztNgT-EuPFoUUbiLgn(hE@{<#zxnTfEL1GuNR@i9Zz+`7Keu5SxhQMQ3J(bxR;qn`tfrGS^32t|@ebCUcY@90GntR_#*dunnTjjj=5-yogdeP{s_ww$RQ)5h9rcf#SzEQK zV{O&D>*}i-)^(6;xOUx^j@os@57nUuF5!pP)z_eeYk1?jbsIWx>DyShVO<9<;ku3M zYM)>GU|qwy=hxO%uj{}iTwhz=QD1wix@uEZ2QI;ewe{=P)uwzidH?3xx{ce=ZsUdZ zb@dP7>-z28nz~JO9k{&n;QbAoI&gXS!TW31p->y%ysrNK_1il1+l548div6(YuDa+ z=iIsR@qvM%p_3=CTp4^f5P13Jix-a_OC-*o{p6F&mwS89pQm7MchZoAHL_xK6Qg2S z*UoOL%Y8YaAKx>en3&;a{h>lbG#noiRrj|gakl% zLK}=JsiriuC4JWH46DsfKYQNVe0G7J`MpL+*Qx~*$p9BgW{#{}E+Fxcq=nm%Po~)3 zcd~a|zM{GDdl9V)MG|_-pNr$=EhGdlT+9rtAt=}FFoe}K6Nu2`7c<$)>V_h}@^-$` zlr7%~?J9{AyjDn$g=j}FPM<&9r{u#_xEMwM-BB& zyS;4bie;r`%a)gBP|18`3#OoWib8vfhVa{x?uZB^Ac-ueuZ+x(0z4M&fR9t)WD@Xr zLY@-Mrsw1Co6-SypA>-Vp2_%3X1~U60N=YJ9oF71-ykLw_eu=^im(hJIhvw@*c;O?;S!a4|#iNOwhrz|)N$*Z4mms7>;&?EB*6*|Jb z7iWWRt~VlE_GThVKCqVRQrF&01bjZs!bH`P*_-do#EfKGbqyOqbKKrn8=ynJAw^OnNcsQjIW zU~wZd;!%`FGs*+!h^)`z1+Yop?7(OJki}54Gv$_Qb>+M#V*t zT`_|O4__@N5HK)cw2I$p64RK{3@xqPqS?#SC$`#{f0_7(jTzC>gkkb)taRb5HcRNA zc+tlE3JM@}pWy*@oBV*fRkj`py;XtBP{jpq>!J&63i)-FY_~fcbLM1b&Yhc;m7SfF zvvK3Y57*Z>G;G@R$RnFKZ`tzQ@BYPKy!hf@{^j?+_g8=Q{qO(a2WQU?44gYRIQZ_n zLqq4!4-fxm@6Y{3`B=#B!H=9aHtlKM`2;|amCN1P=G6L~PZ2bPC8!9=^<%wk^&eAt z?;W`MW9=U~@E^*75u3a`(J1~3M?3N6wNQ6$S>W4eD8BD7JMCj*;<4hB>|_Zp;~aI? zK{e9U0`>TEYKM4Q`O#`*34Cw07$zl}lun@(Acc@#II&Vaw69Ud*sGWnTnR*ipJUKe zWvQN=^zTYpD8`0X3ly`AV&+nzOAA5|%%_;oC}x8E3oS2GIA1ihn^vZlQ`D~?B;gI2 zq7a}b)sL?V3|=1VS^M=*m3w8XFHyhzLN2x>j=8{yK5>tAmOCu&Lnx+i%Z?t2Ar_g*Y)#p#e^6#kvk*^Sk0q-X z@zoU85|}A4RxJ=jBNCo-* zDucofQqUIbe!%@bh{@WtD)v({LlP^1!JEv903;g9tjOy9QpFHiOan`oA%h|LZXlFZ iVM@`dwari~CyAO?|DK8eYp?!}i36Nf56E`}?*9TugdI%) literal 0 HcmV?d00001 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index fab5e3d..ecd2838 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -238,6 +238,32 @@ RESTORE_CURRENT_DIR: POP AF RET ; +;███████████████████████████████████████████████████████████████████████ +BOOT_PART_2: INCBIN 'build/boot.bin',248 +.SIZE EQU $-BOOT_PART_2 +; +; vROM_BOOT: DI +; LD HL,BOOT_PART_1 +; LD DE,#5D3B +; LD BC,BOOT_PART_1.SIZE +; LDIR +; LD HL,BOOT_PART_2 +; LD BC,BOOT_PART_2.SIZE +; LDIR +; ; +; EI +; ; +; LD HL,#5EC9 +; LD (ZX_VARS.E_LINE),HL +; JP AUTO_012A +; ; +; ; RST RST20 ; станд. ввод в буфер редактирования +; ; DW #5D65 +; ; RET +; ; +; ; LD HL,#5D65 +; ; PUSH HL +; ; JP CMD_RETURN ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ index 97d955e..9d149d9 100644 --- a/TRDOS/TR_MSD_2.ASZ +++ b/TRDOS/TR_MSD_2.ASZ @@ -581,8 +581,7 @@ MSDOS_MSG: DC 'File not found' NO_MEMORY: DC 'Out of memory' ;NO_MEMORY: DC 'No RAM-Disk MEM' -WORDS: DB 5,'CLEAR' ; очистить RAM-Disk - DW CLEAR_RAMD_X +WORDS: DB 3,'CAT' ; каталог MS-DOS DW MSDOS_CAT DB 3,'DIR' ; каталог MS-DOS @@ -607,6 +606,8 @@ WORDS: DB 5,'CLEAR' ; DW TB_ONOFF DB 4,'INIT' ; реинизиализация DW INIT_RMD + DB 5,'CLEAR' ; очистить RAM-Disk + DW CLEAR_RAMD_X DB 8,"SPRINTER" DW SPR_1 DB 2,"AY" diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index a161a4f..1073cc9 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -445,6 +445,8 @@ FAT_16_L2: POP AF SCF RET +;----------------------------------------------------------------------- + ;----------------------------------------------------------------------- ;INCLUDE 'trdos/tr_msd_4.asz' diff --git a/TRDOS/boot/boot.asm b/TRDOS/boot/boot.asm new file mode 100755 index 0000000..be43218 --- /dev/null +++ b/TRDOS/boot/boot.asm @@ -0,0 +1,265 @@ +; device zxspectrum48 + INCLUDE 'inc/rom_routines.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + +;======================================================================= +collor_A EQU 0x03 +collor_B EQU 0x02 +collor_M EQU 0x08 +collor_T EQU 0x07 +org_addr EQU #5d3b + + + ORG org_addr + +bstart: DW #100 ; line number = 1 + DW l1end-l1begin ; line length +l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0 + DB #0e,#00,#00 : DW start : DB #00,#0d ; start address +l1end: DW #200 ; line number = 2 + DW l2end-l2begin ; line length +l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0 + DB #0e,#00,#00 : DW 15619 : DB #00 ; start address + DB #3a,#ea,#3a,#f7,#22 +filename: DB "boot ",#22,#3a ; ':' 'rem' run +;======================================================================= + + ;org #5d65 +start: LD (memSP),SP +NewDisk: XOR A + OUT (0xfe),A +; ld de, 0x5aff +; .l0 +; ld (de), a +; dec de +; cp d +; jr nz, .l0 + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.BORDER),A + CALL BASIC_FN.x48.cls + LD BC,0x0905 + LD DE,0 + LD HL,catBuff + ;.3 nop + CALL 0x3d13 + LD A,"a" + LD (main.markPos),A +main: LD A,collor_T + LD (var_collor),A + LD HL,0x50cc + LD (var_printPos),HL + LD HL,catBuff+0x08f5 +.p1: LD A,(HL) + PUSH HL + CALL printChar + POP HL + INC L + LD A,L + CP low (catBuff+0x08fd) + JR NZ,.p1 + + LD HL,0x4000 + LD (var_printPos),HL + + LD HL,catBuff +.markPos+2: LD BC,"aa" +.l1: LD A,(HL) + DEC A + JR Z,.n1 + JP M,.e1 + ;boot detect +; cp "b"-1 +; jr nz, .s2 +; inc l +; ld a, "o" +; cp (hl) +; jr nz, .s2 +; inc l +; cp (hl) +; jr nz, .s2 +; inc l +; ld a, (hl) +; cp "t" +; jr nz, .s2 +; .l4: inc l +; bit 3, l +; jr z, .n1 +; ld a, " " +; cp (hl) +; jr z, .l4 + ; +.s2: LD A,L + AND 0xf0 + ADD A,0x08 + LD L,A + LD A,(HL) + CP "B" + RES 3,L + JR NZ,.n1 + LD A,C + CP B + LD A,collor_A + JR NZ,.s1 + XOR collor_M + LD DE,filename + PUSH BC + LD BC,0x08 + LDIR + POP BC + RES 3,L +.s1: LD (var_collor),A + LD A,C + PUSH HL + CALL printChar + LD A," " + CALL printChar + POP HL +.l2: LD A,(HL) + INC HL + PUSH HL + CALL printChar + POP HL + LD A,L + AND 0x07 + JR NZ,.l2 + LD A,(var_printPos) + AND 0x1f + JR Z,.s3 + LD A," " + PUSH HL + CALL printChar + POP HL +.s3: INC C +.n1: LD A,L + AND 0xf0 + LD L,A + LD DE,0x0010 + ADD HL,DE + JR .l1 +.e1:; ld a, c +; sub "a" +; ld (var_files), a +keys: RES 5,(iy+1) +.w1: BIT 5,(iy+1) + JR Z,.w1 + LD A,(iy-0x32) + CP B + JR Z,exit + CP 0x0d + JR Z,exit + CP " " + JP Z,NewDisk + CP #08 ; left + JR NZ,.sl + DEC B + JR .c1 +.sl: CP #0B ; up + JR NZ,.sd + DEC B + DEC B + DEC B + JR .c1 +.sd: CP #0A ; down + JR NZ,.su + INC B + INC B + INC B + JR .c1 +.su: CP #09 ; right + JR NZ,.sr + INC B + JR .c1 +.sr: CP "a" + JR C,keys + CP C + JR NC,keys + LD B,A +.c1: LD A,B + CP "a" + JR NC,.sf1 + LD A,"a" +.sf1: CP C + JR C,.sf2 + LD A,C + DEC A +.sf2: LD (main.markPos),A + JP main +; var_files db 0 + +exit: +memSP+1: LD SP,0 + RET + +printChar: LD H,A + ADD A,A + ADD A,A + ADD A,A + LD L,A + LD A,H + RLCA + RLCA + RLCA + AND 0x07 + ADD A,0x3c + LD H,A +var_printPos+1: LD DE,0x4000 + +.l1: LD A,(HL) + RRCA + OR (HL) + INC HL + LD (DE),A + INC D + LD (DE),A + INC D + LD A,D + AND 0x07 + JR NZ,.l1 + LD A,D + SUB 0x08 + LD D,A + LD A,E + ADD A,0x20 + LD E,A + AND 0x20 + JR NZ,.l1 + LD HL,(var_printPos) + LD A,H + RRCA + RRCA + RRCA + ADD A,0x50 + LD H,A +var_collor+1: LD A,0 + LD (HL),A + SET 5,L + XOR collor_A^collor_B + LD (HL),A + LD HL,var_printPos + LD A,(HL) + ADD A,0x21 + AND 0xdf + LD (HL),A + RET NZ + INC HL + LD A,(HL) + ADD A,0x08 + LD (HL),A + RET + ; +StartLineNum: DB 0 + DW 0 + ;DB #80 +l2end: +;bend: + DISPLAY "printChar ",/A,$-printChar + DISPLAY "code ",/A,$-start + ;ds -$&0x0f + ;ALIGN #10 +;filename EQU $ +catBuff EQU $ + (-$&0x0f) + + EXPORT StartLineNum + EXPORT org_addr +; \ No newline at end of file diff --git a/TRDOS/boot/boot.inc b/TRDOS/boot/boot.inc new file mode 100644 index 0000000..34f5b4d --- /dev/null +++ b/TRDOS/boot/boot.inc @@ -0,0 +1,2 @@ +StartLineNum: EQU 0x00005EAA +org_addr: EQU 0x00005D3B diff --git a/TRDOS/boot_trd.asm b/TRDOS/boot_trd.asm deleted file mode 100644 index 122d6a5..0000000 --- a/TRDOS/boot_trd.asm +++ /dev/null @@ -1,618 +0,0 @@ -/* -BOOTER -;выполнялка ком."8" -;вместо #29AE - LD BC,#F4FF - RST #20 - DW #1EAF ;CLEAR_RUN - ; - LD A,1 - RST #20 - DW #229B ;border и 23624 - ; - DI - LD HL,bootkus1 ;#E00 - LD DE,#F500 - LD BC,bootln1 ;#1F5 - PUSH DE - LDIR - LD HL,bootkus2 ;#344D - LD BC,bootln2+1 ;#334 - LDIR - SET 3,(IY+#01) - RET -*/ - - - - - org 0 - INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' - INCLUDE 'Shared_Includes/constants/sp2000.inc' - INCLUDE 'inc/rom_routines.inc' - - -bootkus1: DISP #F500 - DI ;его и #344D копирует #3AE7 - PUSH AF - PUSH HL - PUSH DE - PUSH BC - EXX - PUSH HL - LD HL,(ZX_VARS.ERR_SP) - LD (.ERR_SP),HL - LD A,(ZX_VARS.CONT_DISK) - LD (ZX_VARS.OPER_DISK),A - ADD A,#3C - LD (ZX_VARS.PDOS_COPY),A - LD HL,#3C00 - LD DE,#8000 - PUSH DE - LD (ZX_VARS.ZG),DE - LD BC,#0400 - LDIR - LD (IY+#47),#00 - POP HL - LD BC,#0080 -.big_loop: PUSH BC - INC HL - INC HL - INC HL - LD B,#03 -.loop1: LD D,(HL) - LD A,D - RLA - OR D - LD (HL),A - INC HL - DJNZ .loop1 - POP BC - DEC BC - INC HL - INC HL - LD A,B - OR C - JR NZ,.big_loop - XOR A - OUT (BorderColor),A - LD A,#44 - LD (ZX_VARS.BORDER),A - DEC A - DEC A - LD (ZX_VARS.ATTR_P),A - CALL BASIC_FN.x48.x48.cls -.loop2: DI - XOR A - LD (VAR_1),A -.var_3+1: LD HL,LL3761 - PUSH HL - LD (ZX_VARS.ERR_SP),SP - LD (IY+#00),#FF - LD A,(ZX_VARS.CONT_DISK) - LD C,#01 - CALL #3D13 - LD HL,#9000 - LD DE,#0000 - LD BC,#0805 - CALL #3D13 - LD A,(IY+#00) - CP #FF - JR NZ,.loop2 - LD HL,.loop2 - LD (.var_3),HL - EXX - LD DE,#A000 - EXX - LD HL,#9000 - LD DE,#0008 - LD A,(HL) - OR A - JP Z,LF887 -.loop3: LD DE,#0008 - ADD HL,DE - LD A,(HL) - CP #42 - CALL Z,LF836 - ADD HL,DE - LD A,(HL) - OR A - JR NZ,.loop3 - LD A,(VAR_1) - OR A - JP Z,LF887 - LD B,#3F - SBC A,B - JP NC,LF8A6 - LD A,(VAR_1) - DEC A - LD (#F86F),A - CALL #F9BB - LD (#F653),A - CALL #0D6B - DI - CALL #F870 - LD A,#02 - CALL #F8CB - LD A,#02 - CALL #1601 - LD (IY+#47),#00 - LD DE,#A000 - LD HL,#0008 -.loop4: LD A,#20 - RST #10 - LD A,#20 - RST #10 - LD BC,#0008 - PUSH DE - CALL #203C - POP DE - EXD - ADC HL,DE - EXD - LD A,(VAR_1) - DEC A - LD (VAR_1),A - JR Z,LL0f35 - LD A,#20 - RST #10 - LD A,#20 - RST #10 - LD BC,#0008 - PUSH DE - CALL #203C - POP DE - EXD - ADC HL,DE - EXD - LD A,(VAR_1) - DEC A - LD (VAR_1),A - JR Z,LL0f35 - LD A,#20 - RST #10 - LD A,#20 - RST #10 - LD BC,#0008 - PUSH DE - CALL #203C - POP DE - EXD - ADC HL,DE - EXD - LD A,(VAR_1) - DEC A - LD (VAR_1),A - JR Z,LL0f35 - LD A,#06 - RST #10 - JR .loop4 - ; -.ERR_SP: WORD 0 - NOP -LL0f35 LD HL,#5802 - CALL #F816 - LD DE,#000A - LD IX,#F634 - LD (IX+#00),#00 -LL0f46 EI - RES 5,(IY+#01) - HALT - PUSH HL - PUSH IX - CALL #F9BB - CP #40 - JP NZ,#F792 - CALL #F989 - POP IX - POP HL - BIT 5,(IY+#01) - JR Z,LL0f46 - LD A,(#5C08) - CP 8 - JP Z,#F6ED - CP "o" - JR Z,LL0fed - CP "6" - JR Z,LL0fed - CP 9 - JP Z,#F70C - CP "p" - JP Z,#F70C - CP "7" - JP Z,#F70C - CP 11 - JP Z,#F72E - CP "q" - JP Z,#F72E - CP "9" - JP Z,#F72E - CP 10 - JP Z,#F764 - CP "a" - JP Z,#F764 - CP "8" - JP Z,#F764 - CP "d" - JP Z,#FA1B - CP "1" - JR Z,LL0fd0 - CP "2" - JR Z,LL0fd0 - CP "3" - JR Z,LL0fd0 - CP "4" - JR Z,LL0fd0 - PUSH AF - LD A,#FE - IN A,(#FE) - RRA - JR NC,LL0f46 - POP AF - CP 13 - JP Z,#F79D - CP "0" - JP Z,#F79D - CP 32 - JP Z,#F79D - JP #F646 -LL0fd0 PUSH AF - CALL #0D6B - LD A,#03 - CALL #F8CB - POP AF - SUB #31 - LD C,#01 - LD (#5CF8),A - LD (#5CF9),A - LD (ZX_VARS.CONT_DISK),A - CALL #3D13 - JP #F556 -LL0fed CALL #F870 - CALL #F826 - DEC (IX) - -bootst2 -bootln1 = $-bootkus1 - - LD A,(IX+#00) - CP #FF - JR NZ,LL345b - LD A,(#F86F) - LD (IX+#00),A -LL345b CALL #F7FA - CALL #F816 - JP #F646 - CALL #F870 - CALL #F826 - INC (IX+#00) - LD A,(#F86F) - INC A - CP (IX+#00) - LD A,(IX+#00) - JR NZ,LL347d - XOR A - LD (IX+#00),A -LL347d CALL #F7FA - CALL #F816 - JP #F646 - CALL #F870 - CALL #F826 - DEC (IX+#00) - DEC (IX+#00) - DEC (IX+#00) - BIT 7,(IX+#00) - LD A,(IX+#00) - JR Z,LL34b3 -LL349e LD B,#03 - ADD A,B - LD B,A - PUSH BC - LD A,(#F86F) - SUB B - JR C,LL34ac - POP AF - JR LL349e -LL34ac POP AF - DEC A - DEC A - DEC A - LD (IX+#00),A -LL34b3 CALL #F7FA - CALL #F816 - JP #F646 - CALL #F870 - CALL #F826 - INC (IX+#00) - INC (IX+#00) - INC (IX+#00) - LD A,(#F86F) - SBC A,(IX+#00) - LD A,(IX+#00) - JR NC,LL34e1 - LD B,#03 -LL34d8 SUB B - JR NC,LL34d8 - INC A - INC A - INC A - LD (IX+#00),A -LL34e1 CALL #F7FA - CALL #F816 - JP #F646 - CALL #0D6B - LD A,#03 - CALL #F8CB - JP #F556 - LD BC,#FFFD - LD A,#07 - OUT (C),A - LD B,#BF - LD A,#FF - OUT (C),A ;глушит AY - CALL #F870 - LD A,#07 - LD (#5C48),A - LD (#5C8D),A - CPL - LD (#5D3B),A - LD HL,#3C00 - LD (#5C36),HL - LD L,(IX+#00) - LD H,#00 - ADD HL,HL - ADD HL,HL - ADD HL,HL - LD DE,#A000 - ADD HL,DE - LD DE,#F7F0 - LD BC,#0008 - LDIR - LD HL,(#F632) - LD (ZX_VARS.ERR_SP),HL - LD HL,#F7EC - LD (#5C5D),HL - CALL #0D6B - DI - POP HL - EXX - POP BC - POP DE - POP HL - POP AF - CALL #3D03 - JP PE,#F73A - LD (#6F62),HL - LD L,A - LD (HL),H - JR NZ,LL356e - JR NZ,LL3570 - LD (#D50D),HL - INC A - LD HL,#5802 - LD DE,#000A -LL355a DEC A - JR Z,LL356c - ADD HL,DE - DEC A - JR Z,LL356c - ADD HL,DE - DEC A - JR Z,LL356c - INC DE - INC DE - ADD HL,DE - DEC DE - DEC DE - JR LL355a -LL356c POP DE - RET -LL356e PUSH HL - EXX -LL3570 POP HL - LD A,#70 - PUSH HL - POP DE - INC DE - LD BC,#0007 - LD (HL),A - LDIR - EXX - RET - PUSH HL - EXX - POP HL - LD A,#42 - PUSH HL - POP DE - INC DE - LD BC,#0007 - LD (HL),A - LDIR - EXX - RET - ; -LF836: PUSH HL - PUSH DE - SBC HL,DE - LD A,(HL) - LD B,#20 - SBC A,B - JR C,LL35c3 - LD IX,#F981 - PUSH HL - LD BC,#0800 -LL35a0 LD A,(HL) - CP (IX+#00) - JR NZ,LL35a7 - INC C -LL35a7 INC HL - INC IX - DJNZ LL35a0 - LD A,C - CP #08 - JR NZ,LL35b4 - POP HL - JR LL35c3 -LL35b4 EXX - POP HL - LD BC,#0008 - LDIR - EXX - LD A,(VAR_1) - INC A - LD (VAR_1),A -LL35c3 POP DE - POP HL - RET - - -VAR_1: DB 0 -VAR_2: DB 0 - - - PUSH AF - PUSH BC - LD B,#D2 -LL35cc PUSH BC - XOR A - OUT (#FE),A - RR B -LL35d2 DJNZ LL35d2 - SET 4,A - OUT (#FE),A - POP BC - DEC B - DJNZ LL35cc - POP BC - POP AF - RET - ; -LF887: XOR A - CP (IY+#47) - JP NZ,#F556 - CALL #0D6E - LD A,#02 - CALL #1601 - XOR A - CALL #F8CB - LD A,#01 - CALL #1601 - LD (IY+#47),#FE - JP #F795 - ; -LF8A6: XOR A - CP (IY+#47) - JP NZ,#F556 - CALL #0D6E - LD A,#02 - CALL #1601 - LD A,#01 - CALL #F8CB - LD A,#3F - LD (VAR_1),A - LD BC,#FFFF -LL361a NOP - DJNZ LL361a - DEC C - JR NZ,LL361a - JP #F5B4 - LD DE,#F8D1 - JP #0C0A - - DB #80 - DB #16,#0A,#05 - DB "!!! NO PROGRAMS !!!" - DB (" "+#80) - - DB #16,#0A,#03,#10,#04 - DB "MORE THAN 63 BASIC FILES" ;than!!! - - DB (" "+#80) - - DB #11,#00,#10,#04,#13,#01 - DB " -=New ROM boot v1.06=-" - DB #06 - DB "Remix by CompoWellcome 05.02.99" - DB ("."+#80) - - DB #10,#02,#13,#01 - DB " INSERT NEW DISK" - DB #06 - DB " FOR READING CATALOGUE." ;catalogue! - - DB (" "+#80) - - DB "boot " - - LD HL,#5AE1 - PUSH HL - POP DE - DEC DE - LD BC,#001F - LDIR - LD HL,#5AFF - LD A,(#F9BA) - OR A - JR Z,LL3703 - LD A,(HL) - AND #07 - INC A - CP #08 - JR NZ,LL3710 - XOR A - LD (#F9BA),A - LD A,#07 -LL3703 LD A,(HL) - AND #07 - DEC A - OR A - JR NZ,LL3710 - CPL - LD (#F9BA),A - LD A,#01 -LL3710 LD (HL),A - RET -LL3712 NOP - LD A,#C3 - LD (#5CC2),A - LD HL,#F9E6 - LD (#5CC3),HL - LD IX,#2FC1 - CALL #FA20 - LD A,#08 - LD C,#1F - LD IX,#2A53 - CALL #FA20 - LD (#F9E7),SP - LD DE,#0000 - LD IX,#2740 - CALL #FA20 - LD SP,#0000 - LD IX,#1FF3 - CALL #FA20 - LD IX,#1FEB - CALL #FA20 - LD IX,#2FC1 - CALL #FA20 - LD A,#C9 - LD (#5CC2),A - LD A,(#5CCD) - AND #40 - RET -LL3761 LD A,#30 - INC A - CP #33 - LD (#FA0A),A - JP NZ,#F6D0 - LD A,#30 - LD (#FA0A),A - JR LL3761 - DI - LD IX,#0000 - PUSH IX - JP #3D2F - - BLOCK 3,#FF - - ENT From ff7566be454a640dc82b856bd61654c1dca74ce5 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Mon, 16 Jun 2025 04:41:18 +1000 Subject: [PATCH 111/114] internal boot can flip through pages --- SP_TRDOS.ASM | 62 ++++- SP__48.ASM | 2 +- TRDOS/TR_HDD_4.ASZ | 4 +- TRDOS/TR_MSD_2.ASZ | 663 -------------------------------------------- TRDOS/TR_MSD_3.ASZ | 661 ++++++++++++++++++++++++++++++++++++++++++- TRDOS/boot/boot.asm | 636 +++++++++++++++++++++++++++++++++++------- TRDOS/boot/boot.inc | 2 +- 7 files changed, 1254 insertions(+), 776 deletions(-) delete mode 100644 TRDOS/TR_MSD_2.ASZ diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index b7dcfec..7fc636c 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -577,22 +577,25 @@ AUTO_0359: ; [x] 13/06/2025 boot loader from TR-DOS vROM ;███████████████████████████████████████████████████████████████████████ -PREPARE_TO_vROM_BOOT: - LD A,(ZX_VARS.RUN_AUTO_BOOT) - AND A ; признак попытки запуска boot командой RUN без параметров - JP Z,AUTO_03D9 - ; - DI - LD HL,(ZX_VARS.ADR_RET) +; PREPARE_TO_vROM_BOOT: +; LD A,(ZX_VARS.RUN_AUTO_BOOT) +; AND A ; признак попытки запуска boot командой RUN без параметров +; JP Z,AUTO_03D9 +; ; +; DI +; JP vROM_BOOT + +vROM_BOOT: LD HL,(ZX_VARS.ADR_RET) LD (ZX_VARS.FL_START),HL ; временно сохраняем ADR_RET - LD HL,vROM_BOOT ; адрес возврата из AUTO_01D3 + LD HL,vROM_BOOT.continue ; адрес возврата из AUTO_01D3 LD (ZX_VARS.ADR_RET),HL JP AUTO_01D3 ; -vROM_BOOT: LD HL,(ZX_VARS.FL_START) +;vROM_BOOT: +.continue: LD HL,(ZX_VARS.FL_START) LD (ZX_VARS.ADR_RET),HL ; восстанавливаем ADR_RET ; - LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + BOOT_PART_3.SIZE LD (ZX_VARS.FL_START),HL ; длина программы с переменными. LD (ZX_VARS.FL_LEN),HL ; длина программы с переменными. ; @@ -608,7 +611,10 @@ vROM_BOOT: LD HL,(ZX_VARS.FL_START) LD HL,BOOT_PART_2 LD BC,BOOT_PART_2.SIZE LDIR - ; + LD HL,BOOT_PART_3 + LD BC,BOOT_PART_3.SIZE + LDIR + ;LD HL,.StartAddr + BOOT_PART_1.SIZE + BOOT_PART_2.SIZE - 3 LD HL,vROM_Boot.StartLineNum LD (ZX_VARS.E_LINE),HL @@ -1214,9 +1220,27 @@ AUTO_07E7: WG93_EXE_: AND 252 JP WG93_EXE +;************************************** + + +;************************************** +;███████████████████████████████████████████████████████████████████████ +; [x] 13/06/2025 boot loader from TR-DOS vROM +BOOT_PART_3: INCBIN 'build/boot.bin',429 +.SIZE EQU $-BOOT_PART_3 + ; +; PREPARE_TO_vROM_BOOT: +; LD A,(ZX_VARS.RUN_AUTO_BOOT) +; AND A ; признак попытки запуска boot командой RUN без параметров +; JP Z,AUTO_03D9 +; DI +; JP vROM_BOOT +;************************************** + + ;************************************** ;INCLUDE 'trdos/tr_HDD_4.asz' - _mInfoBLOCK #0840-$,255 +; _mInfoBLOCK #0840-$,255 INCLUDE 'trdos/tr_msd_3.asz' @@ -1224,7 +1248,7 @@ WG93_EXE_: ;!TODO russian charset ;ZG_RUS: DB 3 ; идентификатор версии TR-DOS ??? ;************************************** - INCLUDE 'trdos/tr_msd_2.asz' + ;INCLUDE 'trdos/tr_msd_2.asz' ; DSS 0E00h,255 @@ -6622,6 +6646,16 @@ REDIR_3D13: JP EXP_FNS ; +; [x] 13/06/2025 boot loader from TR-DOS vROM +;███████████████████████████████████████████████████████████████████████ +PREPARE_TO_vROM_BOOT: + LD A,(ZX_VARS.RUN_AUTO_BOOT) + AND A ; признак попытки запуска boot командой RUN без параметров + JP Z,AUTO_03D9 + DI + JP vROM_BOOT +;███████████████████████████████████████████████████████████████████████ + ;***************************** _mInfoBLOCK #3CFA - $,255 AUTO_3CFA: @@ -6725,6 +6759,8 @@ PRINT_CR: LD A,#0D ; enter PRINT_SYM: JP PRINT_RED +;======================================================================= + _mInfoBLOCK #3D8F-$,#FF ; ХЕР DW 0000 ; ЗНАЕТ diff --git a/SP__48.ASM b/SP__48.ASM index fd074d5..3307182 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -19300,7 +19300,7 @@ JMP_EX: PUSH HL ; ------------------------------- ; THE 'ZX SPECTRUM CHARACTER SET' ; ------------------------------- - +;; font ;; char-set ; $20 - Character: ' ' CHR$(32) diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index ecd2838..0a155d6 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -239,7 +239,7 @@ RESTORE_CURRENT_DIR: RET ; ;███████████████████████████████████████████████████████████████████████ -BOOT_PART_2: INCBIN 'build/boot.bin',248 +BOOT_PART_2: INCBIN 'build/boot.bin',248,181 .SIZE EQU $-BOOT_PART_2 ; ; vROM_BOOT: DI @@ -266,4 +266,4 @@ BOOT_PART_2: INCBIN 'build/boot.bin',248 ; ; JP CMD_RETURN ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file + DISPLAY "====================================================" diff --git a/TRDOS/TR_MSD_2.ASZ b/TRDOS/TR_MSD_2.ASZ deleted file mode 100644 index 9d149d9..0000000 --- a/TRDOS/TR_MSD_2.ASZ +++ /dev/null @@ -1,663 +0,0 @@ -File_Start DEFL $ - DISPLAY "====================================================" -;███████████████████████████████████████████████████████████████████████ - -;********************************** -; MS-DOS system -;********************************** - -MSDOS_FIND_FILE: - PUSH DE ; ИМЯ ИСКОМОГО ФАЙЛА - CALL MSDOS_1ST_FL - POP DE - RET C -FIND_LOOP_ALL: - CALL MSDOS_KOMP_FL - RET Z ; ВОЗВРАТ - ФАЙЛ НАЙДЕН !! -;MSDOS_FIND_NEXT: - CALL MSDOS_NEXT_FL - JR NC,FIND_LOOP_ALL - RET - -;*********************************************** -; -; CHECK_BPB: -; IN A,(SLOT3) -; LD E,A -; LD A,SYS_PAGE -; DI -; OUT (SLOT3),A -; ; -; LD A,(SYS_PAGE.BPB_PARSED) -; ADD A,1 -; ; -; LD A,E -; OUT (SLOT3),A -; EI -; RET -;*********************************************** -MSDOS_1ST_FL: - PUSH DE - ; 15/07/2024 - ;CALL CHECK_BPB - CALL READ_BPB - ;CALL C,READ_BPB - ; - CALL READ_1ST_DIR - POP DE -MSDOS_TEST_FL: - PUSH DE - DI - IN A,(SLOT3) - LD E,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,E - ; [x] 07/07/2024 пропуск LFN - PUSH HL - LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT - ADD HL,DE - LD D,(HL) - POP HL - ; - LD E,(HL) - OUT (SLOT3),A - EI - ; [x] 07/07/2024 пропуск LFN - LD A,D - CP #0F ; FAT_ATTR.LFS_Entry - JR NZ,.nxt - POP DE - JR MSDOS_NEXT_FL - ; -.nxt: LD A,E - POP DE - AND A - SCF - RET Z ; КОНЕЦ КАТАЛОГА - CP #E5 - JR Z,MSDOS_NEXT_FL - AND A - RET - -;********************** -MSDOS_NEXT_FL: - PUSH DE - LD DE,32 ; FAT_DIRECTORY_RECORD size - ADD HL,DE - DI - IN A,(SLOT3) - LD D,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.COUNT_FL) - DEC A - LD (SYS_PAGE.COUNT_FL),A - LD E,A - LD A,D - OUT (SLOT3),A -; RET_PAGE3 - EI - LD A,E - POP DE - AND A ; СБРОС CF !! - JR NZ,MSDOS_TEST_FL - PUSH DE - DI - IN A,(SLOT3) - LD D,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.COUNT_SEC) - DEC A - LD (SYS_PAGE.COUNT_SEC),A - LD E,A - LD A,D - OUT (SLOT3),A -; RET_PAGE3 - EI - LD A,E - POP DE - AND A - SCF - RET Z - PUSH DE - CALL READ_NEXT_DIR - POP DE - LD HL,SYS_PAGE.MS_DIR - JR MSDOS_TEST_FL - -;********************************** -MSDOS_CAT: - PUSH DE - CALL AUTO_1D97 ; CLS - CALL OPEN_CH2 - LD A,"\r" - RST #10 - POP DE ; СТРОКА ПОСЛЕ CAT -.loop: LD A,(DE) - CP " " - ;JR NZ,CAT_NO_SPACE - INC DE - JR Z,.loop - DEC DE - ;CAT_NO_SPACE: - CP "\r" - JR NZ,CAT_ALL - LD DE,CAT_FILES -CAT_ALL: -; CALL MSDOS_FIND_FILE - CALL MSDOS_1ST_FL - JR C,CAT_END -CAT_LOOP: - JR Z,CAT_NO_PRINT - CALL MSDOS_KOMP_FL - JR NZ,CAT_NO_PRINT - PUSH HL - PUSH DE - CALL OPEN_CH2 - POP DE - POP HL -; CALL COPY_NAME_MSD - CALL PRINT_MSD_NAME - CALL PRINT_MSD_DATS -; CALL MSDOS_FIND_NEXT -CAT_NO_PRINT: - CALL MSDOS_NEXT_FL - JR NC,CAT_LOOP -CAT_END: - CALL OPEN_CH0 - JP AUTO_03E1 - -PRINT_MSD_NAME: - PUSH HL - PUSH DE - LD HL,ZX_VARS.FL_NAME - LD A,' ' - RST #10 - LD A,' ' - RST #10 - ; - LD B,8 -.L1: LD A,(HL) - ;AND #7F ; баг с именем, если на FAT имена с UTF8 - RST #10 - INC HL - DJNZ .L1 - ; - LD A,' ' - RST #10 - ; - LD B,3 -.L2: LD A,(HL) - ;AND #7F ; баг с именем, если на FAT имена с UTF8 - RST #10 - INC HL - DJNZ .L2 - ; - LD A,6 - RST #10 - POP DE - POP HL - RET - -PRINT_MSD_DATS: - PUSH HL - PUSH DE - LD HL,ZX_VARS.FL_PLACE+1 - LD A,(HL) - DEC HL - CALL PRINT_HEX_A - LD A,(HL) - DEC HL - CALL PRINT_HEX_A - LD A,(HL) - DEC HL - CALL PRINT_HEX_A - LD A,' ' - RST 10H - LD A,(HL) - DEC HL - CALL PRINT_HEX_A - LD A,(HL) - DEC HL - CALL PRINT_HEX_A - LD A,13 - RST 10H - POP DE - POP HL - RET -;********************************************** -CAT_FILES: DB '*.*',13 -;********************************************** -COPY_NAME_MSD: - PUSH HL - PUSH DE - DI - IN A,(SLOT3) - LD C,A - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,C - LD DE,ZX_VARS.FL_NAME - LD BC,11 - LDIR - - LD BC,15 - ADD HL,BC - LD BC,5 - LDIR - - LD L,(HL) - OUT (SLOT3),A -; RET_PAGE3 - EI - LD A,L - POP DE - POP HL - AND A ; A = 0 ДЛЯ ФАЙЛА ДЛИНОЙ < 16 Мб. - RET -;********************************************* - -;****************************************************** -CMD_MSDOS: ; MS-DOS командер !! -;****************************************************** - CALL SINTAX_RET - LD HL,WORDS -LOOP_FIND2: - LD DE,(ZX_VARS.ADR_DOS_COM) - INC DE ; Пропустить / - - LD A,(HL) - AND A - JR Z,END_TAB - LD B,A - INC HL -LOOP_FIND: - LD A,(DE) - AND 223 - CP (HL) - JR NZ,NEXT_WORD - INC DE - INC HL - DJNZ LOOP_FIND - LD A,(DE) - CP "\r" - JR Z,CMD_EXE1 - CP ' ' - JR Z,CMD_EXE - JR NEXT_WORD2 -CMD_EXE: - INC DE -CMD_EXE1: - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - CALL JP_HL - JP AUTO_03E1 -JP_HL: JP (HL) - -NEXT_WORD: - INC HL - DJNZ NEXT_WORD -NEXT_WORD2: - INC HL - INC HL - JR LOOP_FIND2 - -END_TAB: - INC DE - LD A,(DE) - CP ':' - DEC DE - JR NZ,END_TAB3 - LD A,(DE) - AND 223 - SUB 'A' - JR C,END_TAB3 - CP 4 - JR NC,END_TAB2 - LD (ZX_VARS.OPER_DISK),A - LD (ZX_VARS.CONT_DISK),A - LD B,A - LD A,(ZX_VARS.PDOS_COPY) - AND #7C - OR B - LD (ZX_VARS.PDOS_COPY),A - OUT (FDC_93.DrvCTRL),A - ; [ ] 19/07/2024 на каждый диск трдос свой раздел hdd можно замапить - LD C,BIOS.GET_DISK_REDIR - CALL EXP_FNS - CP #40 - JR C,.exit - ; - AND #0F - LD C,BIOS.HDD_PART - CALL EXP_FNS - ;LD HL,MSG_3 - ;CALL C,AUTO_03C3 - ; -.exit: JP AUTO_03E1 - -END_TAB2: - SUB 4 - CP SYS_PAGE.RAMD_KEYS.NUM - JR NC,END_TAB3 - CALL RAMD_SET1 - JP AUTO_03E1 - -END_TAB3: - LD A,0 - JP LOAD_RMD_XX - -MSD_ERR: - LD HL,MSDOS_MSG ; File not found... - JP AUTO_03E4 - -;************************************ - -LOAD_RMD: - CALL RAMD_SYM ; получить номер RAM-Disk из (DE) - JP C,MSD_ERR -LOAD_RMD_XX: - LD (ZX_VARS.MED_START+1),A ; сохранить - CALL MSDOS_FIND_FILE - JP C,MSD_ERR - - CALL RMD_BLKS_FL ; B - число блоков , DE - абсолютный сектор - LD A,(ZX_VARS.MED_START+1) - PUSH AF - CALL CLEAR_RMD_A ; освободить RAM-Disk A - POP AF - CALL GET_RMD_A ; установить RAM-Disk A размером B - - LD HL,#C000 - CALL MSDOS_READ_FILE - JP AUTO_03E1 - -SAVE_RMD: - CALL RAMD_SYM ; получить номер RAM-Disk из (DE) - JP C,MSD_ERR - LD (ZX_VARS.MED_START+1),A - CALL MSDOS_FIND_FILE - JP C,MSD_ERR - - CALL RMD_BLKS_FL - - LD A,(ZX_VARS.MED_START+1) - CALL TEST_RAMD ; проверить наличие RAM-Disk A размером B - JP C,MSD_ERR ; A - номер первого блока - JP Z,MSD_ERR - - LD HL,#C000 - CALL MSDOS_WRITE_FILE - JP AUTO_03E1 - -RMD_BLKS_FL: - LD A,(ZX_VARS.FL_SIZE+2) - PUSH HL - LD HL,(ZX_VARS.FL_SIZE) - LD B,A - AND A - RL L - RL H - RL B - AND A - RL L - RL H - RL B - LD A,H - OR L - JR Z,RMD_BLKS_L2 - INC B -RMD_BLKS_L2: - POP HL - RET ; B - ЧИСЛО БЛОКОВ RAM_DISK - -;**************************************** -; DE - ИМЯ ФАЙЛА СО *,? -; HL - ИМЯ В КАТАЛОГЕ -MSDOS_KOMP_FL: - CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS - LD A,(ZX_VARS.FL_NAME) - AND A - JR NZ,KOMP_CONT1 - LD A,2 ; КОНЕЦ КАТАЛОГА - AND A ; NZ - ИМЯ НЕ СОВПАДАЕТ - RET - -KOMP_CONT1: - CP 0A5h - JR NZ,KOMP_CONT2 - LD A,1 ; СТЕРТЫЙ ФАЙЛ - ИМЯ НЕ СОВПАДАЕТ - AND A - RET - -KOMP_CONT2: - PUSH DE - PUSH HL - LD HL,ZX_VARS.FL_NAME - CALL MSDOS_KOMP_ALL - POP HL - POP DE - RET - -MSDOS_KOMP_ALL: - LD A,(DE) - INC DE - CP " " - JR Z,MSDOS_KOMP_ALL - CP "\r" - JR Z,KOMP_ERROR_NAME ; НЕВЕРНОЕ ИМЯ - DEC DE - - LD B,8 - CALL KOMP_TX - RET NZ - - LD A,(DE) - CP "." - JR Z,KOMP_POINT - CP "\r" - JR Z,KOMP_SPACING3 - CP " " - JR Z,KOMP_SPACING3 -KOMP_ERROR_NAME: ; НЕВЕРНОЕ ИМЯ - LD A,1 - AND A - RET - -KOMP_POINT: - INC DE - - LD B,3 - CALL KOMP_TX - RET NZ - LD A,(DE) - CP 13 - RET Z - CP 20H - RET Z - JR KOMP_ERROR_NAME - -;**************************************************** -KOMP_TX: - LD A,(DE) - CP "\r" - JR Z,KOMP_SPACING - CP " " - JR Z,KOMP_SPACING - CP "." - JR Z,KOMP_SPACING - CP "?" - JR Z,KOMP_EX_OK - CP "*" - JR Z,KOMP_EX_OK2 - CP "a" - JR C,KOMP_EXEC - CP "z"+1 - JR NC,KOMP_EXEC - AND %1101'1111 -KOMP_EXEC: - CP (HL) - RET NZ ; нет совпадения -KOMP_EX_OK: - INC DE -KOMP_EX_OK2: - INC HL - DJNZ KOMP_TX - CP '*' - JR NZ,KOMP_NO_STAR1 - INC DE -KOMP_NO_STAR1: - XOR A - RET - -KOMP_SPACING3: - LD B,3 -KOMP_SPACING: - LD A,20H -KOMP_L2: - CP (HL) - INC HL - RET NZ - DJNZ KOMP_L2 - RET - -;************************************************ - -CALC_CLAST: ; HL - стартовый кластер - PUSH BC - PUSH HL - DEC HL - DEC HL - DI - IN A,(SLOT3) - EX AF,AF' - LD A,SYS_PAGE - OUT (SLOT3),A - LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) - - EX DE,HL - LD BC,0 - LD H,B - LD L,B - LD HX,B - LD LX,B - -CALC_CL_LP: - ADD IX,DE - ADC HL,BC - - DEC A - JR NZ,CALC_CL_LP - - LD DE,(SYS_PAGE.MSD_DAT_SEC) - LD BC,(SYS_PAGE.MSD_DAT_SEC2) - - ADD IX,DE - ADC HL,BC ; HL,IX - СМЕЩЕНИЕ КЛАСТЕРА ОТ НАЧАЛА ДАННЫХ - - EX AF,AF' - OUT (SLOT3),A - - PUSH IX - EX (SP),HL - POP IX - EX DE,HL - - EI - POP HL - POP BC - RET - - -HD_TX: DC ' - HDD error' -;HD_TX: DC 'HDD error #' -HD_TX2: DC 'HDD not found' -MSG_3: DC '*ERROR*' -MSDOS_MSG: DC 'File not found' -NO_MEMORY: DC 'Out of memory' -;NO_MEMORY: DC 'No RAM-Disk MEM' - -WORDS: - DB 3,'CAT' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'DIR' ; каталог MS-DOS - DW MSDOS_CAT - DB 3,'HDD' ; подключить HDD - DW HDD_SET - DB 3,'FDD' ; подключить FDD - DW FDD_SET - DB 3,'RMD' ; подключить RMD - DW RAMD_SET - DB 3,'HDT' ; тест HDD - DW HDD_PROG - DB 2,'RD' ; тест RAM-Disk space - DW RAMD_FAT_PROG - DB 4,'SAVE' ; сохранить RAM-Disk - DW SAVE_RMD - DB 4,'LOAD' ; загрузить RAM-Disk - DW LOAD_RMD - DB 4,'TBON' ; включить турбо - DW TB_ONOFF - DB 5,'TBOFF' ; выключить турбо - DW TB_ONOFF - DB 4,'INIT' ; реинизиализация - DW INIT_RMD - DB 5,'CLEAR' ; очистить RAM-Disk - DW CLEAR_RAMD_X - DB 8,"SPRINTER" - DW SPR_1 - DB 2,"AY" - DW AY8910 - DB 0 - -;SAVE_AUTOEXEC: -; LD C,0FEH -; CALL EXP_FNS -; RET -AY8910: - LD A,#EA - LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL - CALL EXP_FNS - ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то - ;EI - ; - CALL AUTO_1D97 - AND A - RET - -SPR_1: LD A,(DE) - INC DE - CP " " - JR Z,SPR_1 - CP "1" - LD C,BIOS.RST_CONF.SP97_1 - JR Z,SP_1 - CP "2" - SCF - RET NZ - LD C,BIOS.RST_CONF.SP97_2 -SP_1: LD A,(DE) - CP " "+1 - CCF - RET C - CALL EXP_FNS - CALL AUTO_1D97 - AND A - RET - - -;**************************************************** -;***************************************** -; ERRORS -;***************************************** -; 0 - ГЛАВНАЯ ПРОВЕРКА ПРОГРАММЫ -; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ -; 2 - КОНЕЦ КАТАЛОГА -; -;███████████████████████████████████████████████████████████████████████ - DISPLAY "TR_MSD_2.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file diff --git a/TRDOS/TR_MSD_3.ASZ b/TRDOS/TR_MSD_3.ASZ index 1073cc9..3243a8f 100644 --- a/TRDOS/TR_MSD_3.ASZ +++ b/TRDOS/TR_MSD_3.ASZ @@ -565,7 +565,664 @@ GET_FL_L2: RET Z INC BC RET -;*********************************************************************** + +;********************************** +; MS-DOS system +;********************************** + +MSDOS_FIND_FILE: + PUSH DE ; ИМЯ ИСКОМОГО ФАЙЛА + CALL MSDOS_1ST_FL + POP DE + RET C +FIND_LOOP_ALL: + CALL MSDOS_KOMP_FL + RET Z ; ВОЗВРАТ - ФАЙЛ НАЙДЕН !! +;MSDOS_FIND_NEXT: + CALL MSDOS_NEXT_FL + JR NC,FIND_LOOP_ALL + RET + +;*********************************************** +; +; CHECK_BPB: +; IN A,(SLOT3) +; LD E,A +; LD A,SYS_PAGE +; DI +; OUT (SLOT3),A +; ; +; LD A,(SYS_PAGE.BPB_PARSED) +; ADD A,1 +; ; +; LD A,E +; OUT (SLOT3),A +; EI +; RET +;*********************************************** +MSDOS_1ST_FL: + PUSH DE + ; 15/07/2024 + ;CALL CHECK_BPB + CALL READ_BPB + ;CALL C,READ_BPB + ; + CALL READ_1ST_DIR + POP DE +MSDOS_TEST_FL: + PUSH DE + DI + IN A,(SLOT3) + LD E,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,E + ; [x] 07/07/2024 пропуск LFN + PUSH HL + LD DE,#0B ; FAT_DIRECTORY_RECORD.ATTRIBUT + ADD HL,DE + LD D,(HL) + POP HL + ; + LD E,(HL) + OUT (SLOT3),A + EI + ; [x] 07/07/2024 пропуск LFN + LD A,D + CP #0F ; FAT_ATTR.LFS_Entry + JR NZ,.nxt + POP DE + JR MSDOS_NEXT_FL + ; +.nxt: LD A,E + POP DE + AND A + SCF + RET Z ; КОНЕЦ КАТАЛОГА + CP #E5 + JR Z,MSDOS_NEXT_FL + AND A + RET + +;********************** +MSDOS_NEXT_FL: + PUSH DE + LD DE,32 ; FAT_DIRECTORY_RECORD size + ADD HL,DE + DI + IN A,(SLOT3) + LD D,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_FL) + DEC A + LD (SYS_PAGE.COUNT_FL),A + LD E,A + LD A,D + OUT (SLOT3),A +; RET_PAGE3 + EI + LD A,E + POP DE + AND A ; СБРОС CF !! + JR NZ,MSDOS_TEST_FL + PUSH DE + DI + IN A,(SLOT3) + LD D,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.COUNT_SEC) + DEC A + LD (SYS_PAGE.COUNT_SEC),A + LD E,A + LD A,D + OUT (SLOT3),A +; RET_PAGE3 + EI + LD A,E + POP DE + AND A + SCF + RET Z + PUSH DE + CALL READ_NEXT_DIR + POP DE + LD HL,SYS_PAGE.MS_DIR + JR MSDOS_TEST_FL + +;********************************** +MSDOS_CAT: + PUSH DE + CALL AUTO_1D97 ; CLS + CALL OPEN_CH2 + LD A,"\r" + RST #10 + POP DE ; СТРОКА ПОСЛЕ CAT +.loop: LD A,(DE) + CP " " + ;JR NZ,CAT_NO_SPACE + INC DE + JR Z,.loop + DEC DE + ;CAT_NO_SPACE: + CP "\r" + JR NZ,CAT_ALL + LD DE,CAT_FILES +CAT_ALL: +; CALL MSDOS_FIND_FILE + CALL MSDOS_1ST_FL + JR C,CAT_END +CAT_LOOP: + JR Z,CAT_NO_PRINT + CALL MSDOS_KOMP_FL + JR NZ,CAT_NO_PRINT + PUSH HL + PUSH DE + CALL OPEN_CH2 + POP DE + POP HL +; CALL COPY_NAME_MSD + CALL PRINT_MSD_NAME + CALL PRINT_MSD_DATS +; CALL MSDOS_FIND_NEXT +CAT_NO_PRINT: + CALL MSDOS_NEXT_FL + JR NC,CAT_LOOP +CAT_END: + CALL OPEN_CH0 + JP AUTO_03E1 + +PRINT_MSD_NAME: + PUSH HL + PUSH DE + LD HL,ZX_VARS.FL_NAME + LD A,' ' + RST #10 + LD A,' ' + RST #10 + ; + LD B,8 +.L1: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 + INC HL + DJNZ .L1 + ; + LD A,' ' + RST #10 + ; + LD B,3 +.L2: LD A,(HL) + ;AND #7F ; баг с именем, если на FAT имена с UTF8 + RST #10 + INC HL + DJNZ .L2 + ; + LD A,6 + RST #10 + POP DE + POP HL + RET + +PRINT_MSD_DATS: + PUSH HL + PUSH DE + LD HL,ZX_VARS.FL_PLACE+1 + LD A,(HL) + DEC HL + CALL PRINT_HEX_A + LD A,(HL) + DEC HL + CALL PRINT_HEX_A + LD A,(HL) + DEC HL + CALL PRINT_HEX_A + LD A,' ' + RST 10H + LD A,(HL) + DEC HL + CALL PRINT_HEX_A + LD A,(HL) + DEC HL + CALL PRINT_HEX_A + LD A,13 + RST 10H + POP DE + POP HL + RET +;********************************************** +CAT_FILES: DB '*.*',13 +;********************************************** +COPY_NAME_MSD: + PUSH HL + PUSH DE + DI + IN A,(SLOT3) + LD C,A + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,C + LD DE,ZX_VARS.FL_NAME + LD BC,11 + LDIR + + LD BC,15 + ADD HL,BC + LD BC,5 + LDIR + + LD L,(HL) + OUT (SLOT3),A +; RET_PAGE3 + EI + LD A,L + POP DE + POP HL + AND A ; A = 0 ДЛЯ ФАЙЛА ДЛИНОЙ < 16 Мб. + RET +;********************************************* + +;****************************************************** +CMD_MSDOS: ; MS-DOS командер !! +;****************************************************** + CALL SINTAX_RET + LD HL,WORDS +LOOP_FIND2: + LD DE,(ZX_VARS.ADR_DOS_COM) + INC DE ; Пропустить / + + LD A,(HL) + AND A + JR Z,END_TAB + LD B,A + INC HL +LOOP_FIND: + LD A,(DE) + AND 223 + CP (HL) + JR NZ,NEXT_WORD + INC DE + INC HL + DJNZ LOOP_FIND + LD A,(DE) + CP "\r" + JR Z,CMD_EXE1 + CP ' ' + JR Z,CMD_EXE + JR NEXT_WORD2 +CMD_EXE: + INC DE +CMD_EXE1: + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + CALL JP_HL + JP AUTO_03E1 +JP_HL: JP (HL) + +NEXT_WORD: + INC HL + DJNZ NEXT_WORD +NEXT_WORD2: + INC HL + INC HL + JR LOOP_FIND2 + +END_TAB: + INC DE + LD A,(DE) + CP ':' + DEC DE + JR NZ,END_TAB3 + LD A,(DE) + AND 223 + SUB 'A' + JR C,END_TAB3 + CP 4 + JR NC,END_TAB2 + LD (ZX_VARS.OPER_DISK),A + LD (ZX_VARS.CONT_DISK),A + LD B,A + LD A,(ZX_VARS.PDOS_COPY) + AND #7C + OR B + LD (ZX_VARS.PDOS_COPY),A + OUT (FDC_93.DrvCTRL),A + ; [ ] 19/07/2024 на каждый диск трдос свой раздел hdd можно замапить + LD C,BIOS.GET_DISK_REDIR + CALL EXP_FNS + CP #40 + JR C,.exit + ; + AND #0F + LD C,BIOS.HDD_PART + CALL EXP_FNS + ;LD HL,MSG_3 + ;CALL C,AUTO_03C3 + ; +.exit: JP AUTO_03E1 + +END_TAB2: + SUB 4 + CP SYS_PAGE.RAMD_KEYS.NUM + JR NC,END_TAB3 + CALL RAMD_SET1 + JP AUTO_03E1 + +END_TAB3: + LD A,0 + JP LOAD_RMD_XX + +MSD_ERR: + LD HL,MSDOS_MSG ; File not found... + JP AUTO_03E4 + +;************************************ + +LOAD_RMD: + CALL RAMD_SYM ; получить номер RAM-Disk из (DE) + JP C,MSD_ERR +LOAD_RMD_XX: + LD (ZX_VARS.MED_START+1),A ; сохранить + CALL MSDOS_FIND_FILE + JP C,MSD_ERR + + CALL RMD_BLKS_FL ; B - число блоков , DE - абсолютный сектор + LD A,(ZX_VARS.MED_START+1) + PUSH AF + CALL CLEAR_RMD_A ; освободить RAM-Disk A + POP AF + CALL GET_RMD_A ; установить RAM-Disk A размером B + + LD HL,#C000 + CALL MSDOS_READ_FILE + JP AUTO_03E1 + +SAVE_RMD: + CALL RAMD_SYM ; получить номер RAM-Disk из (DE) + JP C,MSD_ERR + LD (ZX_VARS.MED_START+1),A + CALL MSDOS_FIND_FILE + JP C,MSD_ERR + + CALL RMD_BLKS_FL + + LD A,(ZX_VARS.MED_START+1) + CALL TEST_RAMD ; проверить наличие RAM-Disk A размером B + JP C,MSD_ERR ; A - номер первого блока + JP Z,MSD_ERR + + LD HL,#C000 + CALL MSDOS_WRITE_FILE + JP AUTO_03E1 + +RMD_BLKS_FL: + LD A,(ZX_VARS.FL_SIZE+2) + PUSH HL + LD HL,(ZX_VARS.FL_SIZE) + LD B,A + AND A + RL L + RL H + RL B + AND A + RL L + RL H + RL B + LD A,H + OR L + JR Z,RMD_BLKS_L2 + INC B +RMD_BLKS_L2: + POP HL + RET ; B - ЧИСЛО БЛОКОВ RAM_DISK + +;**************************************** +; DE - ИМЯ ФАЙЛА СО *,? +; HL - ИМЯ В КАТАЛОГЕ +MSDOS_KOMP_FL: + CALL COPY_NAME_MSD ; ПЕРЕМЕСТИТЬ ИМЯ В ОБЛАСТЬ TR-DOS + LD A,(ZX_VARS.FL_NAME) + AND A + JR NZ,KOMP_CONT1 + LD A,2 ; КОНЕЦ КАТАЛОГА + AND A ; NZ - ИМЯ НЕ СОВПАДАЕТ + RET + +KOMP_CONT1: + CP 0A5h + JR NZ,KOMP_CONT2 + LD A,1 ; СТЕРТЫЙ ФАЙЛ - ИМЯ НЕ СОВПАДАЕТ + AND A + RET + +KOMP_CONT2: + PUSH DE + PUSH HL + LD HL,ZX_VARS.FL_NAME + CALL MSDOS_KOMP_ALL + POP HL + POP DE + RET + +MSDOS_KOMP_ALL: + LD A,(DE) + INC DE + CP " " + JR Z,MSDOS_KOMP_ALL + CP "\r" + JR Z,KOMP_ERROR_NAME ; НЕВЕРНОЕ ИМЯ + DEC DE + + LD B,8 + CALL KOMP_TX + RET NZ + + LD A,(DE) + CP "." + JR Z,KOMP_POINT + CP "\r" + JR Z,KOMP_SPACING3 + CP " " + JR Z,KOMP_SPACING3 +KOMP_ERROR_NAME: ; НЕВЕРНОЕ ИМЯ + LD A,1 + AND A + RET + +KOMP_POINT: + INC DE + + LD B,3 + CALL KOMP_TX + RET NZ + LD A,(DE) + CP 13 + RET Z + CP 20H + RET Z + JR KOMP_ERROR_NAME + +;**************************************************** +KOMP_TX: + LD A,(DE) + CP "\r" + JR Z,KOMP_SPACING + CP " " + JR Z,KOMP_SPACING + CP "." + JR Z,KOMP_SPACING + CP "?" + JR Z,KOMP_EX_OK + CP "*" + JR Z,KOMP_EX_OK2 + CP "a" + JR C,KOMP_EXEC + CP "z"+1 + JR NC,KOMP_EXEC + AND %1101'1111 +KOMP_EXEC: + CP (HL) + RET NZ ; нет совпадения +KOMP_EX_OK: + INC DE +KOMP_EX_OK2: + INC HL + DJNZ KOMP_TX + CP '*' + JR NZ,KOMP_NO_STAR1 + INC DE +KOMP_NO_STAR1: + XOR A + RET + +KOMP_SPACING3: + LD B,3 +KOMP_SPACING: + LD A,20H +KOMP_L2: + CP (HL) + INC HL + RET NZ + DJNZ KOMP_L2 + RET + +;************************************************ + +CALC_CLAST: ; HL - стартовый кластер + PUSH BC + PUSH HL + DEC HL + DEC HL + DI + IN A,(SLOT3) + EX AF,AF' + LD A,SYS_PAGE + OUT (SLOT3),A + LD A,(SYS_PAGE.MS_BPB+CLAST_SIZE) + + EX DE,HL + LD BC,0 + LD H,B + LD L,B + LD HX,B + LD LX,B + +CALC_CL_LP: + ADD IX,DE + ADC HL,BC + + DEC A + JR NZ,CALC_CL_LP + + LD DE,(SYS_PAGE.MSD_DAT_SEC) + LD BC,(SYS_PAGE.MSD_DAT_SEC2) + + ADD IX,DE + ADC HL,BC ; HL,IX - СМЕЩЕНИЕ КЛАСТЕРА ОТ НАЧАЛА ДАННЫХ + + EX AF,AF' + OUT (SLOT3),A + + PUSH IX + EX (SP),HL + POP IX + EX DE,HL + + EI + POP HL + POP BC + RET + + +HD_TX: DC ' - HDD error' +;HD_TX: DC 'HDD error #' +HD_TX2: DC 'HDD not found' +MSG_3: DC '*ERROR*' +MSDOS_MSG: DC 'File not found' +NO_MEMORY: DC 'Out of memory' +;NO_MEMORY: DC 'No RAM-Disk MEM' + +WORDS: + DB 3,'CAT' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'DIR' ; каталог MS-DOS + DW MSDOS_CAT + DB 3,'HDD' ; подключить HDD + DW HDD_SET + DB 3,'FDD' ; подключить FDD + DW FDD_SET + DB 3,'RMD' ; подключить RMD + DW RAMD_SET + DB 3,'HDT' ; тест HDD + DW HDD_PROG + DB 2,'RD' ; тест RAM-Disk space + DW RAMD_FAT_PROG + DB 4,'SAVE' ; сохранить RAM-Disk + DW SAVE_RMD + DB 4,'LOAD' ; загрузить RAM-Disk + DW LOAD_RMD + DB 4,'TBON' ; включить турбо + DW TB_ONOFF + DB 5,'TBOFF' ; выключить турбо + DW TB_ONOFF + DB 4,'INIT' ; реинизиализация + DW INIT_RMD + DB 5,'CLEAR' ; очистить RAM-Disk + DW CLEAR_RAMD_X + DB 8,"SPRINTER" + DW SPR_1 + DB 2,"AY" + DW AY8910 + DB 0 + +;SAVE_AUTOEXEC: +; LD C,0FEH +; CALL EXP_FNS +; RET +AY8910: + LD A,#EA + LD C,#F3 ;!HARDCODE BIOS.SPRINTER_ALL + CALL EXP_FNS + ;!TEST 06/01/2024 сохраняем состояние прерываний зачем-то + ;EI + ; + CALL AUTO_1D97 + AND A + RET + +SPR_1: LD A,(DE) + INC DE + CP " " + JR Z,SPR_1 + CP "1" + LD C,BIOS.RST_CONF.SP97_1 + JR Z,SP_1 + CP "2" + SCF + RET NZ + LD C,BIOS.RST_CONF.SP97_2 +SP_1: LD A,(DE) + CP " "+1 + CCF + RET C + CALL EXP_FNS + CALL AUTO_1D97 + AND A + RET + + +;**************************************************** +;***************************************** +; ERRORS +;***************************************** +; 0 - ГЛАВНАЯ ПРОВЕРКА ПРОГРАММЫ +; 1 - НЕВЕРНЫЙ ФОРМАТ ИМЕНИ +; 2 - КОНЕЦ КАТАЛОГА ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_MSD_3.ASZ size: ",/A,$-File_Start - DISPLAY "====================================================" \ No newline at end of file + DISPLAY "====================================================" + + diff --git a/TRDOS/boot/boot.asm b/TRDOS/boot/boot.asm index be43218..02ad004 100755 --- a/TRDOS/boot/boot.asm +++ b/TRDOS/boot/boot.asm @@ -6,6 +6,7 @@ ;======================================================================= collor_A EQU 0x03 collor_B EQU 0x02 +collor_N EQU 0x04 collor_M EQU 0x08 collor_T EQU 0x07 org_addr EQU #5d3b @@ -27,154 +28,178 @@ filename: DB "boot ",#22,#3a ; ':' 'rem' run ;org #5d65 start: LD (memSP),SP -NewDisk: XOR A - OUT (0xfe),A -; ld de, 0x5aff -; .l0 -; ld (de), a -; dec de -; cp d -; jr nz, .l0 - LD (ZX_VARS.ATTR_P),A - LD (ZX_VARS.BORDER),A - CALL BASIC_FN.x48.cls - LD BC,0x0905 +NewDisk: ;CALL clear_screen + LD BC,#0905 LD DE,0 LD HL,catBuff - ;.3 nop - CALL 0x3d13 + CALL #3D13 LD A,"a" LD (main.markPos),A -main: LD A,collor_T + LD A,1 + JP keys.setCP + ; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ALIGN #10 +TXT_BUTTONS: +.prev: DB '<<< PgUp' +.next: DB 'PgDn >>>' + ; +main.CurrentPage: + DB 1 +main.PagesCounter: + DB 1 +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; +main: LD A,(.CurrentPage) + LD (.PagesCounter),A +.nextLoop: LD A,collor_T LD (var_collor),A - LD HL,0x50cc + LD HL,#50CC LD (var_printPos),HL - LD HL,catBuff+0x08f5 + LD HL,catBuff + #08F5 + + + LD B,8 .p1: LD A,(HL) PUSH HL CALL printChar POP HL INC L - LD A,L - CP low (catBuff+0x08fd) - JR NZ,.p1 + DJNZ .p1 + ; LD A,L + ; CP low (catBuff + #08FD) + ; JR NZ,.p1 - LD HL,0x4000 + LD HL,#4000 LD (var_printPos),HL - - LD HL,catBuff + ; вычитывание каталога +.buffPointer+1: LD HL,catBuff .markPos+2: LD BC,"aa" .l1: LD A,(HL) DEC A - JR Z,.n1 - JP M,.e1 - ;boot detect -; cp "b"-1 -; jr nz, .s2 -; inc l -; ld a, "o" -; cp (hl) -; jr nz, .s2 -; inc l -; cp (hl) -; jr nz, .s2 -; inc l -; ld a, (hl) -; cp "t" -; jr nz, .s2 -; .l4: inc l -; bit 3, l -; jr z, .n1 -; ld a, " " -; cp (hl) -; jr z, .l4 - ; -.s2: LD A,L - AND 0xf0 - ADD A,0x08 - LD L,A + JR Z,.nextRec + ; + JP M,DirShowDone + ; + SET 3,L LD A,(HL) CP "B" RES 3,L - JR NZ,.n1 + JR NZ,.nextRec + ; две спец кнопки + LD A,C ; C - текущий файл + CP "y" + JR NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" + ; + ; проходной прогон? + LD A,(.PagesCounter) + DEC A + JR NZ,.nextHiddenRec + ; basic file LD A,C - CP B + CP B ; выбранный файл LD A,collor_A - JR NZ,.s1 + JR NZ,.notMarked + ; выделение файла и копирование его в строку запуска XOR collor_M + ; LD DE,filename PUSH BC - LD BC,0x08 + LD BC,8 LDIR POP BC RES 3,L -.s1: LD (var_collor),A - LD A,C - PUSH HL - CALL printChar - LD A," " - CALL printChar - POP HL -.l2: LD A,(HL) - INC HL - PUSH HL - CALL printChar - POP HL - LD A,L - AND 0x07 - JR NZ,.l2 - LD A,(var_printPos) - AND 0x1f - JR Z,.s3 - LD A," " - PUSH HL - CALL printChar - POP HL -.s3: INC C -.n1: LD A,L - AND 0xf0 - LD L,A - LD DE,0x0010 + ; +.notMarked: CALL prn_txt +.nextHiddenRec: INC C +.nextRec: LD DE,#10 ADD HL,DE JR .l1 -.e1:; ld a, c -; sub "a" -; ld (var_files), a + ; + +PRINT_NEXT_BUTTONS: + LD A,(main.PagesCounter) + LD (keys.nxtPage),A + DEC A + JR Z,.noChange + LD (main.PagesCounter),A + LD (main.buffPointer),HL +.noChange: PUSH AF + CALL PRINT_HELP + POP AF + JP Z,keys + JR keys.toMain + +PRINT_HELP: LD HL,#5040 + LD (var_printPos),HL + LD A,collor_N + PUSH BC + LD C," " + LD HL,TXT_BUTTONS.prev + CALL prn_txt + ; + LD A,collor_N + CALL prn_txt + ; + POP BC + RET + + ; +DirShowDone: XOR A + LD (keys.nxtPage),A + CALL PRINT_HELP keys: RES 5,(iy+1) .w1: BIT 5,(iy+1) JR Z,.w1 - LD A,(iy-0x32) + LD A,(iy-#32) + ; CP B JR Z,exit - CP 0x0d + CP #0D ; enter JR Z,exit - CP " " + CP " " ; space JP Z,NewDisk - CP #08 ; left + ; + CP #04 ; pgUp + LD E,-1 + JR Z,.prevPage + ; +.pgdn: CP #05 ; pgDn + LD E,1 + JR Z,.nextPage + ; +.left: CP #08 ; left JR NZ,.sl DEC B JR .c1 + ; .sl: CP #0B ; up JR NZ,.sd DEC B DEC B DEC B JR .c1 + ; .sd: CP #0A ; down JR NZ,.su INC B INC B INC B JR .c1 + ; .su: CP #09 ; right JR NZ,.sr INC B JR .c1 + ; .sr: CP "a" JR C,keys CP C JR NC,keys LD B,A + ; .c1: LD A,B CP "a" JR NC,.sf1 @@ -184,8 +209,30 @@ keys: RES 5,(iy+1) LD A,C DEC A .sf2: LD (main.markPos),A - JP main -; var_files db 0 +.toMain: JP main.nextLoop + +; DE - +24 or -24 +.nextPage: ; +.nxtPage+1: LD A,0 + AND A + JR Z,.skip + XOR A + LD (.nxtPage),A + ; +; DE - +24 or -24 +.prevPage: LD A,(main.CurrentPage) + ADD A,E + JR Z,.skip + ; +.setCP: LD H,A + LD L,A + LD (main.CurrentPage),HL + LD HL,catBuff + LD (main.buffPointer),HL +.skip: CALL clear_screen + JR .toMain + + exit: memSP+1: LD SP,0 @@ -234,8 +281,9 @@ var_printPos+1: LD DE,0x4000 var_collor+1: LD A,0 LD (HL),A SET 5,L - XOR collor_A^collor_B + XOR collor_A ^ collor_B LD (HL),A + ; LD HL,var_printPos LD A,(HL) ADD A,0x21 @@ -247,7 +295,69 @@ var_collor+1: LD A,0 ADD A,0x08 LD (HL),A RET - ; + ; + ; + +clear_screen: XOR A + OUT (0xfe),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.BORDER),A + JP BASIC_FN.x48.cls + +; A - current file +; choose_color: CP B ; выбранный файл. #C7 +; LD A,collor_A +; SCF +; RET NZ +; XOR collor_M +; RET + + +; A - COLOR +; C - char of text button +; HL - Text +prn_txt: LD (var_collor),A + LD A,C + PUSH HL + CALL printChar + LD A," " + CALL printChar + POP HL + ; +.loop: LD A,(HL) + INC HL + PUSH HL + CALL printChar + POP HL + LD A,L + AND 0x07 + JR NZ,.loop + ; + LD A,(var_printPos) + AND 0x1f + RET Z + LD A," " + PUSH HL + CALL printChar + POP HL + RET + ; + ; + +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ALIGN #10 +; TXT_BUTTONS: +; .prev: DB '<< PgDn ' +; .next: DB '>> PgUp ' +; ; +; main.CurrentPage: +; DB 1 +; main.PagesCounter: +; DB 1 +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + StartLineNum: DB 0 DW 0 ;DB #80 @@ -258,8 +368,346 @@ l2end: ;ds -$&0x0f ;ALIGN #10 ;filename EQU $ -catBuff EQU $ + (-$&0x0f) +catBuff EQU #6000 ;$ + (-$&0x0f) + ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" EXPORT StartLineNum EXPORT org_addr -; \ No newline at end of file +; + +/* +; device zxspectrum48 + INCLUDE 'inc/rom_routines.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + +;======================================================================= +collor_A EQU 0x03 +collor_B EQU 0x02 +collor_N EQU 0x04 +collor_M EQU 0x08 +collor_T EQU 0x07 +org_addr EQU #5d3b + + + ORG org_addr + +bstart: DW #100 ; line number = 1 + DW l1end-l1begin ; line length +l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0 + DB #0e,#00,#00 : DW start : DB #00,#0d ; start address +l1end: DW #200 ; line number = 2 + DW l2end-l2begin ; line length +l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0 + DB #0e,#00,#00 : DW 15619 : DB #00 ; start address + DB #3a,#ea,#3a,#f7,#22 +filename: DB "boot ",#22,#3a ; ':' 'rem' run +;======================================================================= + + ;org #5d65 +start: LD (memSP),SP +NewDisk: CALL clear_screen + ; XOR A + ; ;OUT (0xfe),A + ; LD (ZX_VARS.ATTR_P),A + ; LD (ZX_VARS.BORDER),A + ; CALL BASIC_FN.x48.cls + ; + LD BC,0x0905 + LD DE,0 + LD HL,catBuff + ;.3 nop + CALL 0x3d13 + LD A,"a" + LD (main.markPos),A +main: LD A,collor_T + LD (var_collor),A + LD HL,0x50cc + LD (var_printPos),HL + LD HL,catBuff+0x08f5 +.p1: LD A,(HL) + PUSH HL + CALL printChar + POP HL + INC L + LD A,L + CP low (catBuff+0x08fd) + JR NZ,.p1 + + LD HL,0x4000 + LD (var_printPos),HL + ; вычитывание каталога +.buffPointer+1: LD HL,catBuff +.markPos+2: LD BC,"aa" +.l1: LD A,(HL) + DEC A + JR Z,.n1 + ; + JP M,keys + ; + LD A,L + AND #F0 + ADD A,8 + LD L,A + LD A,(HL) + CP "B" + RES 3,L + JR NZ,.n1 + ; две спец кнопки + LD A,C ; C - текущий файл + CP "y" + JP NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" + ; + ; basic file + CP B ; выбранный файл + LD A,collor_A + JR NZ,.s1 + ; выделение файла и копирование его в строку запуска + XOR collor_M + ;CALL choose_color + ;JR C,.s1 + ; + LD DE,filename + PUSH BC + LD BC,8 + LDIR + POP BC + RES 3,L + ; +.s1: CALL prn_txt +.s3: INC C +.n1: LD A,L + AND #F0 + LD L,A + LD DE,#10 + ADD HL,DE + JR .l1 + ; + ; + ; + ALIGN #10 +TXT_BUTTONS: +.prev: DB '<< PgDn ' +.next: DB '>> PgUp ' + ; + ; +keys: RES 5,(iy+1) +.w1: BIT 5,(iy+1) + JR Z,.w1 + LD A,(iy-0x32) + ; + CP B + JR Z,exit + CP 0x0d ; enter + JR Z,exit + CP " " ; space + JP Z,NewDisk + ; + CP #04 ; pgUp + LD DE,-384 + JR Z,.nxtPage + ; +.pgdn: CP #05 ; pgDn + LD DE,384 + JR Z,.nxtPage + ; +.left: CP #08 ; left + JR NZ,.sl + DEC B + JR .c1 + ; +.sl: CP #0B ; up + JR NZ,.sd + DEC B + DEC B + DEC B + JR .c1 + ; +.sd: CP #0A ; down + JR NZ,.su + INC B + INC B + INC B + JR .c1 + ; +.su: CP #09 ; right + JR NZ,.sr + INC B + JR .c1 + ; +.sr: CP "a" + JR C,keys + CP C + JR NC,keys + LD B,A + ; +.c1: LD A,B + CP "a" + JR NC,.sf1 + LD A,"a" +.sf1: CP C + JR C,.sf2 + LD A,C + DEC A +.sf2: LD (main.markPos),A +.toMain: JP main + +; DE - +24 or -24 +.nxtPage: LD HL,(main.buffPointer) + ADD HL,DE + BIT 3,H + JR NZ,keys +.EnablePages+1: AND 0 + JR Z,keys + ; + XOR A + LD (.EnablePages),A ; A=0 - Disable Pages + LD (main.buffPointer),HL + CALL clear_screen + JR .toMain +; var_files db 0 + +exit: +memSP+1: LD SP,0 + RET + + + +PRINT_NEXT_BUTTONS: + LD HL,#5040 + LD (var_printPos),HL + LD A,collor_N + LD (keys.EnablePages),A ; A!=0 - Enable Pages + LD HL,TXT_BUTTONS.prev + CALL prn_txt + ; + LD A,collor_N + INC C + CALL prn_txt + ; + JP keys + + +printChar: LD H,A + ADD A,A + ADD A,A + ADD A,A + LD L,A + LD A,H + RLCA + RLCA + RLCA + AND 0x07 + ADD A,0x3c + LD H,A +var_printPos+1: LD DE,0x4000 + +.l1: LD A,(HL) + RRCA + OR (HL) + INC HL + LD (DE),A + INC D + LD (DE),A + INC D + LD A,D + AND 0x07 + JR NZ,.l1 + LD A,D + SUB 0x08 + LD D,A + LD A,E + ADD A,0x20 + LD E,A + AND 0x20 + JR NZ,.l1 + LD HL,(var_printPos) + LD A,H + RRCA + RRCA + RRCA + ADD A,0x50 + LD H,A +var_collor+1: LD A,0 + LD (HL),A + SET 5,L + XOR collor_A ^ collor_B + LD (HL),A + ; + LD HL,var_printPos + LD A,(HL) + ADD A,0x21 + AND 0xdf + LD (HL),A + RET NZ + INC HL + LD A,(HL) + ADD A,0x08 + LD (HL),A + RET + ; + ; + +clear_screen: XOR A + OUT (0xfe),A + LD (ZX_VARS.ATTR_P),A + LD (ZX_VARS.BORDER),A + JP BASIC_FN.x48.cls + ; + + +; A - current file +; choose_color: CP B ; выбранный файл. #C7 +; LD A,collor_A +; SCF +; RET NZ +; XOR collor_M +; RET + + +; A - COLOR +; C - char of text button +; HL - Text +prn_txt: LD (var_collor),A + LD A,C + PUSH HL + CALL printChar + LD A," " + CALL printChar + POP HL + ; +.loop: LD A,(HL) + INC HL + PUSH HL + CALL printChar + POP HL + LD A,L + AND 0x07 + JR NZ,.loop + ; + LD A,(var_printPos) + AND 0x1f + RET Z + LD A," " + PUSH HL + CALL printChar + POP HL + RET + ; +StartLineNum: DB 0 + DW 0 + ;DB #80 +l2end: +;bend: + DISPLAY "printChar ",/A,$-printChar + DISPLAY "code ",/A,$-start + ;ds -$&0x0f + ;ALIGN #10 +;filename EQU $ +catBuff EQU #6000 ;$ + (-$&0x0f) + + ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" + EXPORT StartLineNum + EXPORT org_addr +; +*/ \ No newline at end of file diff --git a/TRDOS/boot/boot.inc b/TRDOS/boot/boot.inc index 34f5b4d..398b400 100644 --- a/TRDOS/boot/boot.inc +++ b/TRDOS/boot/boot.inc @@ -1,2 +1,2 @@ -StartLineNum: EQU 0x00005EAA +StartLineNum: EQU 0x00005F30 org_addr: EQU 0x00005D3B From 62b5f27378b30ba812fe3b036ef4abf667e1b151 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Tue, 17 Jun 2025 03:03:48 +1000 Subject: [PATCH 112/114] fixed "enter" bug in boot --- TRDOS/boot/boot.asm | 374 +++----------------------------------------- TRDOS/boot/boot.inc | 2 +- 2 files changed, 23 insertions(+), 353 deletions(-) diff --git a/TRDOS/boot/boot.asm b/TRDOS/boot/boot.asm index 02ad004..554013a 100755 --- a/TRDOS/boot/boot.asm +++ b/TRDOS/boot/boot.asm @@ -16,14 +16,17 @@ org_addr EQU #5d3b bstart: DW #100 ; line number = 1 DW l1end-l1begin ; line length -l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0 - DB #0e,#00,#00 : DW start : DB #00,#0d ; start address +l1begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; 'rand' 'usr' 0 + DB ZX_Char.number + DB #00,#00 : DW start : DB #00 ; start address + DB ZX_Char.carriage_return l1end: DW #200 ; line number = 2 DW l2end-l2begin ; line length -l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0 - DB #0e,#00,#00 : DW 15619 : DB #00 ; start address - DB #3a,#ea,#3a,#f7,#22 -filename: DB "boot ",#22,#3a ; ':' 'rem' run +l2begin: DB ZX_Token.randomize,ZX_Token.usr,"0" ; ':' 'rand' 'usr' 0 + DB ZX_Char.number + DB #00,#00 : DW 15619 : DB #00 ; start address + DB ":",ZX_Token.rem,":",ZX_Token.run,'"' +filename: DB "boot ",'"',":" ; ':' 'rem' run ;======================================================================= ;org #5d65 @@ -54,7 +57,8 @@ main.PagesCounter: ; main: LD A,(.CurrentPage) LD (.PagesCounter),A -.nextLoop: LD A,collor_T +.nextLoop: CALL PRINT_HELP + LD A,collor_T LD (var_collor),A LD HL,#50CC LD (var_printPos),HL @@ -123,13 +127,14 @@ PRINT_NEXT_BUTTONS: LD A,(main.PagesCounter) LD (keys.nxtPage),A DEC A - JR Z,.noChange + ;JR Z,.noChange + JR Z,keys LD (main.PagesCounter),A LD (main.buffPointer),HL -.noChange: PUSH AF - CALL PRINT_HELP - POP AF - JP Z,keys +.noChange: ;PUSH AF + ;CALL PRINT_HELP + ;POP AF + ;JP Z,keys JR keys.toMain PRINT_HELP: LD HL,#5040 @@ -149,7 +154,7 @@ PRINT_HELP: LD HL,#5040 ; DirShowDone: XOR A LD (keys.nxtPage),A - CALL PRINT_HELP + ;CALL PRINT_HELP keys: RES 5,(iy+1) .w1: BIT 5,(iy+1) JR Z,.w1 @@ -234,7 +239,9 @@ keys: RES 5,(iy+1) -exit: +exit: LD A,C + CP "a" + JP Z,NewDisk memSP+1: LD SP,0 RET @@ -373,341 +380,4 @@ catBuff EQU #6000 ;$ + (-$&0x0f) ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" EXPORT StartLineNum EXPORT org_addr -; - -/* -; device zxspectrum48 - INCLUDE 'inc/rom_routines.inc' - INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' - INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' - -;======================================================================= -collor_A EQU 0x03 -collor_B EQU 0x02 -collor_N EQU 0x04 -collor_M EQU 0x08 -collor_T EQU 0x07 -org_addr EQU #5d3b - - - ORG org_addr - -bstart: DW #100 ; line number = 1 - DW l1end-l1begin ; line length -l1begin: DB ZX_Token.randomize,ZX_Token.usr,#30 ; 'rand' 'usr' 0 - DB #0e,#00,#00 : DW start : DB #00,#0d ; start address -l1end: DW #200 ; line number = 2 - DW l2end-l2begin ; line length -l2begin: DB #f9,#c0,#30 ; ':' 'rand' 'usr' 0 - DB #0e,#00,#00 : DW 15619 : DB #00 ; start address - DB #3a,#ea,#3a,#f7,#22 -filename: DB "boot ",#22,#3a ; ':' 'rem' run -;======================================================================= - - ;org #5d65 -start: LD (memSP),SP -NewDisk: CALL clear_screen - ; XOR A - ; ;OUT (0xfe),A - ; LD (ZX_VARS.ATTR_P),A - ; LD (ZX_VARS.BORDER),A - ; CALL BASIC_FN.x48.cls - ; - LD BC,0x0905 - LD DE,0 - LD HL,catBuff - ;.3 nop - CALL 0x3d13 - LD A,"a" - LD (main.markPos),A -main: LD A,collor_T - LD (var_collor),A - LD HL,0x50cc - LD (var_printPos),HL - LD HL,catBuff+0x08f5 -.p1: LD A,(HL) - PUSH HL - CALL printChar - POP HL - INC L - LD A,L - CP low (catBuff+0x08fd) - JR NZ,.p1 - - LD HL,0x4000 - LD (var_printPos),HL - ; вычитывание каталога -.buffPointer+1: LD HL,catBuff -.markPos+2: LD BC,"aa" -.l1: LD A,(HL) - DEC A - JR Z,.n1 - ; - JP M,keys - ; - LD A,L - AND #F0 - ADD A,8 - LD L,A - LD A,(HL) - CP "B" - RES 3,L - JR NZ,.n1 - ; две спец кнопки - LD A,C ; C - текущий файл - CP "y" - JP NC,PRINT_NEXT_BUTTONS ; "::PREV::" "::NEXT::" - ; - ; basic file - CP B ; выбранный файл - LD A,collor_A - JR NZ,.s1 - ; выделение файла и копирование его в строку запуска - XOR collor_M - ;CALL choose_color - ;JR C,.s1 - ; - LD DE,filename - PUSH BC - LD BC,8 - LDIR - POP BC - RES 3,L - ; -.s1: CALL prn_txt -.s3: INC C -.n1: LD A,L - AND #F0 - LD L,A - LD DE,#10 - ADD HL,DE - JR .l1 - ; - ; - ; - ALIGN #10 -TXT_BUTTONS: -.prev: DB '<< PgDn ' -.next: DB '>> PgUp ' - ; - ; -keys: RES 5,(iy+1) -.w1: BIT 5,(iy+1) - JR Z,.w1 - LD A,(iy-0x32) - ; - CP B - JR Z,exit - CP 0x0d ; enter - JR Z,exit - CP " " ; space - JP Z,NewDisk - ; - CP #04 ; pgUp - LD DE,-384 - JR Z,.nxtPage - ; -.pgdn: CP #05 ; pgDn - LD DE,384 - JR Z,.nxtPage - ; -.left: CP #08 ; left - JR NZ,.sl - DEC B - JR .c1 - ; -.sl: CP #0B ; up - JR NZ,.sd - DEC B - DEC B - DEC B - JR .c1 - ; -.sd: CP #0A ; down - JR NZ,.su - INC B - INC B - INC B - JR .c1 - ; -.su: CP #09 ; right - JR NZ,.sr - INC B - JR .c1 - ; -.sr: CP "a" - JR C,keys - CP C - JR NC,keys - LD B,A - ; -.c1: LD A,B - CP "a" - JR NC,.sf1 - LD A,"a" -.sf1: CP C - JR C,.sf2 - LD A,C - DEC A -.sf2: LD (main.markPos),A -.toMain: JP main - -; DE - +24 or -24 -.nxtPage: LD HL,(main.buffPointer) - ADD HL,DE - BIT 3,H - JR NZ,keys -.EnablePages+1: AND 0 - JR Z,keys - ; - XOR A - LD (.EnablePages),A ; A=0 - Disable Pages - LD (main.buffPointer),HL - CALL clear_screen - JR .toMain -; var_files db 0 - -exit: -memSP+1: LD SP,0 - RET - - - -PRINT_NEXT_BUTTONS: - LD HL,#5040 - LD (var_printPos),HL - LD A,collor_N - LD (keys.EnablePages),A ; A!=0 - Enable Pages - LD HL,TXT_BUTTONS.prev - CALL prn_txt - ; - LD A,collor_N - INC C - CALL prn_txt - ; - JP keys - - -printChar: LD H,A - ADD A,A - ADD A,A - ADD A,A - LD L,A - LD A,H - RLCA - RLCA - RLCA - AND 0x07 - ADD A,0x3c - LD H,A -var_printPos+1: LD DE,0x4000 - -.l1: LD A,(HL) - RRCA - OR (HL) - INC HL - LD (DE),A - INC D - LD (DE),A - INC D - LD A,D - AND 0x07 - JR NZ,.l1 - LD A,D - SUB 0x08 - LD D,A - LD A,E - ADD A,0x20 - LD E,A - AND 0x20 - JR NZ,.l1 - LD HL,(var_printPos) - LD A,H - RRCA - RRCA - RRCA - ADD A,0x50 - LD H,A -var_collor+1: LD A,0 - LD (HL),A - SET 5,L - XOR collor_A ^ collor_B - LD (HL),A - ; - LD HL,var_printPos - LD A,(HL) - ADD A,0x21 - AND 0xdf - LD (HL),A - RET NZ - INC HL - LD A,(HL) - ADD A,0x08 - LD (HL),A - RET - ; - ; - -clear_screen: XOR A - OUT (0xfe),A - LD (ZX_VARS.ATTR_P),A - LD (ZX_VARS.BORDER),A - JP BASIC_FN.x48.cls - ; - - -; A - current file -; choose_color: CP B ; выбранный файл. #C7 -; LD A,collor_A -; SCF -; RET NZ -; XOR collor_M -; RET - - -; A - COLOR -; C - char of text button -; HL - Text -prn_txt: LD (var_collor),A - LD A,C - PUSH HL - CALL printChar - LD A," " - CALL printChar - POP HL - ; -.loop: LD A,(HL) - INC HL - PUSH HL - CALL printChar - POP HL - LD A,L - AND 0x07 - JR NZ,.loop - ; - LD A,(var_printPos) - AND 0x1f - RET Z - LD A," " - PUSH HL - CALL printChar - POP HL - RET - ; -StartLineNum: DB 0 - DW 0 - ;DB #80 -l2end: -;bend: - DISPLAY "printChar ",/A,$-printChar - DISPLAY "code ",/A,$-start - ;ds -$&0x0f - ;ALIGN #10 -;filename EQU $ -catBuff EQU #6000 ;$ + (-$&0x0f) - - ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" - EXPORT StartLineNum - EXPORT org_addr -; -*/ \ No newline at end of file +; \ No newline at end of file diff --git a/TRDOS/boot/boot.inc b/TRDOS/boot/boot.inc index 398b400..bd197d3 100644 --- a/TRDOS/boot/boot.inc +++ b/TRDOS/boot/boot.inc @@ -1,2 +1,2 @@ -StartLineNum: EQU 0x00005F30 +StartLineNum: EQU 0x00005F2E org_addr: EQU 0x00005D3B From 1d9480f20d2f57000fbff1db501df4d851c75fa8 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Sat, 21 Jun 2025 00:33:02 +1000 Subject: [PATCH 113/114] ... --- SP_TRDOS.ASM | 9 +- SP__48.ASM | 6372 ++++++++++++++++++++++---------------------- Shared_Includes | 2 +- TRDOS/TR_HDD_4.ASZ | 23 - 4 files changed, 3189 insertions(+), 3217 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index 7fc636c..d9eabb9 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -1226,15 +1226,10 @@ WG93_EXE_: ;************************************** ;███████████████████████████████████████████████████████████████████████ ; [x] 13/06/2025 boot loader from TR-DOS vROM + BOOT_PART_3: INCBIN 'build/boot.bin',429 .SIZE EQU $-BOOT_PART_3 - ; -; PREPARE_TO_vROM_BOOT: -; LD A,(ZX_VARS.RUN_AUTO_BOOT) -; AND A ; признак попытки запуска boot командой RUN без параметров -; JP Z,AUTO_03D9 -; DI -; JP vROM_BOOT +;███████████████████████████████████████████████████████████████████████ ;************************************** diff --git a/SP__48.ASM b/SP__48.ASM index 3307182..8d98aa7 100644 --- a/SP__48.ASM +++ b/SP__48.ASM @@ -42,7 +42,7 @@ ; routines in this ROM. Non-standard entry points have a label beginning ; with X. - ORG $0000 + ORG #0000 ;***************************************** ;** Part 1. RESTART ROUTINES AND TABLES ** @@ -58,7 +58,7 @@ ;; START L0000: DI ; disable interrupts. XOR A ; signal coming from START. - LD DE,$FFFF ; top of possible physical RAM. + LD DE,#FFFF ; top of possible physical RAM. JP L11CB ; jump forward to common code at START-NEW. ; ------------------- @@ -67,14 +67,14 @@ L0000: DI ; disable interrupts. ; The error pointer is made to point to the position of the error to enable ; the editor to show the error if it occurred during syntax checking. ; It is used at 37 places in the program. -; An instruction fetch on address $0008 may page in a peripheral ROM +; An instruction fetch on address #0008 may page in a peripheral ROM ; such as the Sinclair Interface 1 or Disciple Disk Interface. ; This was not however an original design concept and not all errors pass ; through here. ;; ERROR-1 -L0008: LD HL,($5C5D) ; fetch the character address from CH_ADD. - LD ($5C5F),HL ; copy it to the error pointer X_PTR. +L0008: LD HL,(#5C5D) ; fetch the character address from CH_ADD. + LD (#5C5F),HL ; copy it to the error pointer X_PTR. JR L0053 ; forward to continue at ERROR-2. ; ----------------------------- @@ -91,11 +91,11 @@ L0010: JP L15F2 ; jump forward to continue at PRINT-A-2. ; --- -X0013: DEFB $FF ; this byte is used by the SPECTRUM command in +X0013: DEFB #FF ; this byte is used by the SPECTRUM command in ; ROM 0 to generate an error report "0 OK". - DEFB $FF, $FF ; four unused locations. - DEFB $FF, $FF ; + DEFB #FF, #FF ; four unused locations. + DEFB #FF, #FF ; ; ------------------------------- ; THE 'COLLECT CHARACTER' RESTART @@ -110,7 +110,7 @@ X0013: DEFB $FF ; this byte is used by the SPECTRUM command in ; 4) in workspace if accepting input but not that from INPUT LINE. ;; GET-CHAR -L0018: LD HL,($5C5D) ; fetch the address from CH_ADD. +L0018: LD HL,(#5C5D) ; fetch the address from CH_ADD. LD A,(HL) ; use it to pick up current character. ;; TEST-CHAR @@ -131,7 +131,7 @@ L0020: CALL L0074 ; routine CH-ADD+1 fetches the next immediate ; --- - DEFB $FF, $FF, $FF ; unused + DEFB #FF, #FF, #FF ; unused ; ----------------------- ; THE 'CALCULATE' RESTART @@ -145,8 +145,8 @@ L0028: JP L335B ; jump forward to the CALCULATE routine. ; --- - DEFB $FF, $FF, $FF ; spare - note that on the ZX81, space being a - DEFB $FF, $FF ; little cramped, these same locations were + DEFB #FF, #FF, #FF ; spare - note that on the ZX81, space being a + DEFB #FF, #FF ; little cramped, these same locations were ; used for the five-byte end-calc literal. ; ------------------------------ @@ -157,7 +157,7 @@ L0028: JP L335B ; jump forward to the CALCULATE routine. ;; BC-SPACES L0030: PUSH BC ; save number of spaces. - LD HL,($5C61) ; fetch WORKSP. + LD HL,(#5C61) ; fetch WORKSP. PUSH HL ; save address of workspace. JP L169E ; jump forward to continuation code RESERVE. @@ -173,14 +173,14 @@ L0030: PUSH BC ; save number of spaces. ;; MASK-INT L0038: PUSH AF ; save the registers. PUSH HL ; but not IY unfortunately. - LD HL,($5C78) ; fetch two bytes at FRAMES1. + LD HL,(#5C78) ; fetch two bytes at FRAMES1. INC HL ; increment lowest two bytes of counter. - LD ($5C78),HL ; place back in FRAMES1. + LD (#5C78),HL ; place back in FRAMES1. LD A,H ; test if the result OR L ; was zero. JR NZ,L0048 ; forward to KEY-INT if not. - INC (IY+$40) ; otherwise increment FRAMES3 the third byte. + INC (IY+#40) ; otherwise increment FRAMES3 the third byte. ; now save the rest of the main registers and read and decode the keyboard. @@ -215,8 +215,8 @@ L0053: POP HL ; drop the return address - the location ; updated. ;; ERROR-3 -L0055: LD (IY+$00),L ; store it in the system variable ERR_NR. - LD SP,($5C3D) ; ERR_SP points to an error handler on the +L0055: LD (IY+#00),L ; store it in the system variable ERR_NR. + LD SP,(#5C3D) ; ERR_SP points to an error handler on the ; machine stack. There may be a hierarchy ; of routines. ; to MAIN-4 initially at base. @@ -232,9 +232,9 @@ L0055: LD (IY+$00),L ; store it in the system variable ERR_NR. ; --- - DEFB $FF, $FF, $FF ; unused locations - DEFB $FF, $FF, $FF ; before the fixed-position - DEFB $FF ; NMI routine. + DEFB #FF, #FF, #FF ; unused locations + DEFB #FF, #FF, #FF ; before the fixed-position + DEFB #FF ; NMI routine. ; ------------------------------------ ; THE 'NON-MASKABLE INTERRUPT' ROUTINE @@ -252,7 +252,7 @@ L0055: LD (IY+$00),L ; store it in the system variable ERR_NR. ;; RESET L0066: PUSH AF ; save the PUSH HL ; registers. - LD HL,($5CB0) ; fetch the system variable NMIADD. + LD HL,(#5CB0) ; fetch the system variable NMIADD. LD A,H ; test address OR L ; for zero. JR NZ,L0070 ; skip to NO-RESET if NOT ZERO @@ -274,13 +274,13 @@ L0070: POP HL ; restore the ; Both TEMP-PTR1 and TEMP-PTR2 are used by the READ command routine. ;; CH-ADD+1 -L0074: LD HL,($5C5D) ; fetch address from CH_ADD. +L0074: LD HL,(#5C5D) ; fetch address from CH_ADD. ;; TEMP-PTR1 L0077: INC HL ; increase the character address by one. ;; TEMP-PTR2 -L0078: LD ($5C5D),HL ; update CH_ADD with character address. +L0078: LD (#5C5D),HL ; update CH_ADD with character address. X007B: LD A,(HL) ; load character to A from HL. RET ; and return. @@ -302,20 +302,20 @@ X007B: LD A,(HL) ; load character to A from HL. ; 'a number 53 bus' appear the same to the parser. ;; SKIP-OVER -L007D: CP $21 ; test if higher than space. +L007D: CP #21 ; test if higher than space. RET NC ; return with carry clear if so. - CP $0D ; carriage return ? + CP #0D ; carriage return ? RET Z ; return also with carry clear if so. ; all other characters have no relevance ; to the parser and must be returned with ; carry set. - CP $10 ; test if 0-15d + CP #10 ; test if 0-15d RET C ; return, if so, with carry set. - CP $18 ; test if 24-32d + CP #18 ; test if 24-32d CCF ; complement carry flag. RET C ; return with carry set if so. @@ -324,7 +324,7 @@ L007D: CP $21 ; test if higher than space. INC HL ; all above have at least one extra character ; to be stepped over. - CP $16 ; controls 22d ('at') and 23d ('tab') have two. + CP #16 ; controls 22d ('at') and 23d ('tab') have two. JR C,L0090 ; forward to SKIPS with ink, paper, flash, ; bright, inverse or over controls. ; Note. the high byte of tab is for RS232 only. @@ -334,7 +334,7 @@ L007D: CP $21 ; test if higher than space. ;; SKIPS L0090: SCF ; set the carry flag - LD ($5C5D),HL ; update the CH_ADD system variable. + LD (#5C5D),HL ; update the CH_ADD system variable. RET ; return with carry set. @@ -451,11 +451,11 @@ L0095: ; to decode the key values. ; The first table contains the maps for the 39 keys of the standard -; 40-key Spectrum keyboard. The remaining key [SHIFT $27] is read directly. +; 40-key Spectrum keyboard. The remaining key [SHIFT #27] is read directly. ; The keys consist of the 26 upper-case alphabetic characters, the 10 digit ; keys and the space, ENTER and symbol shift key. -; Unshifted alphabetic keys have $20 added to the value. -; The keywords for the main alphabetic keys are obtained by adding $A5 to +; Unshifted alphabetic keys have #20 added to the value. +; The keywords for the main alphabetic keys are obtained by adding #A5 to ; the values obtained from this table. ;; MAIN-KEYS @@ -483,7 +483,7 @@ L0205: DEFB "B" DEFB "E" DEFB "D" DEFB "X" - DEFB $0E ; SYMBOL SHIFT + DEFB #0E ; SYMBOL SHIFT DEFB "L" DEFB "O" DEFB "9" @@ -492,7 +492,7 @@ L0205: DEFB "B" DEFB "S" DEFB "Z" DEFB " " - DEFB $0D ; ENTER + DEFB #0D ; ENTER DEFB "P" DEFB "0" DEFB "1" @@ -503,93 +503,93 @@ L0205: DEFB "B" ;; E-UNSHIFT ; The 26 unshifted extended mode keys for the alphabetic characters. ; The green keywords on the original keyboard. -L022C: DEFB $E3 ; READ - DEFB $C4 ; BIN - DEFB $E0 ; LPRINT - DEFB $E4 ; DATA - DEFB $B4 ; TAN - DEFB $BC ; SGN - DEFB $BD ; ABS - DEFB $BB ; SQR - DEFB $AF ; CODE - DEFB $B0 ; VAL - DEFB $B1 ; LEN - DEFB $C0 ; USR - DEFB $A7 ; PI - DEFB $A6 ; INKEY$ - DEFB $BE ; PEEK - DEFB $AD ; TAB - DEFB $B2 ; SIN - DEFB $BA ; INT - DEFB $E5 ; RESTORE - DEFB $A5 ; RND - DEFB $C2 ; CHR$ - DEFB $E1 ; LLIST - DEFB $B3 ; COS - DEFB $B9 ; EXP - DEFB $C1 ; STR$ - DEFB $B8 ; LN +L022C: DEFB #E3 ; READ + DEFB #C4 ; BIN + DEFB #E0 ; LPRINT + DEFB #E4 ; DATA + DEFB #B4 ; TAN + DEFB #BC ; SGN + DEFB #BD ; ABS + DEFB #BB ; SQR + DEFB #AF ; CODE + DEFB #B0 ; VAL + DEFB #B1 ; LEN + DEFB #C0 ; USR + DEFB #A7 ; PI + DEFB #A6 ; INKEY$ + DEFB #BE ; PEEK + DEFB #AD ; TAB + DEFB #B2 ; SIN + DEFB #BA ; INT + DEFB #E5 ; RESTORE + DEFB #A5 ; RND + DEFB #C2 ; CHR$ + DEFB #E1 ; LLIST + DEFB #B3 ; COS + DEFB #B9 ; EXP + DEFB #C1 ; STR$ + DEFB #B8 ; LN ;; EXT-SHIFT ; The 26 shifted extended mode keys for the alphabetic characters. ; The red keywords below keys on the original keyboard. L0246: DEFB '~' - DEFB $DC ; BRIGHT - DEFB $DA ; PAPER + DEFB #DC ; BRIGHT + DEFB #DA ; PAPER DEFB '\' ; - DEFB $B7 ; ATN + DEFB #B7 ; ATN DEFB '{' DEFB '}' - DEFB $D8 ; CIRCLE - DEFB $BF ; IN - DEFB $AE ; VAL$ - DEFB $AA ; SCREEN$ - DEFB $AB ; ATTR - DEFB $DD ; INVERSE - DEFB $DE ; OVER - DEFB $DF ; OUT - DEFB $7F ; (Copyright character) - DEFB $B5 ; ASN - DEFB $D6 ; VERIFY + DEFB #D8 ; CIRCLE + DEFB #BF ; IN + DEFB #AE ; VAL$ + DEFB #AA ; SCREEN$ + DEFB #AB ; ATTR + DEFB #DD ; INVERSE + DEFB #DE ; OVER + DEFB #DF ; OUT + DEFB #7F ; (Copyright character) + DEFB #B5 ; ASN + DEFB #D6 ; VERIFY DEFB '|' - DEFB $D5 ; MERGE + DEFB #D5 ; MERGE DEFB ']' - DEFB $DB ; FLASH - DEFB $B6 ; ACS - DEFB $D9 ; INK + DEFB #DB ; FLASH + DEFB #B6 ; ACS + DEFB #D9 ; INK DEFB '[' - DEFB $D7 ; BEEP + DEFB #D7 ; BEEP ;; CTL-CODES ; The ten control codes assigned to the top line of digits when the shift ; key is pressed. -L0260: DEFB $0C ; DELETE - DEFB $07 ; EDIT - DEFB $06 ; CAPS LOCK - DEFB $04 ; TRUE VIDEO - DEFB $05 ; INVERSE VIDEO - DEFB $08 ; CURSOR LEFT - DEFB $0A ; CURSOR DOWN - DEFB $0B ; CURSOR UP - DEFB $09 ; CURSOR RIGHT - DEFB $0F ; GRAPHICS +L0260: DEFB #0C ; DELETE + DEFB #07 ; EDIT + DEFB #06 ; CAPS LOCK + DEFB #04 ; TRUE VIDEO + DEFB #05 ; INVERSE VIDEO + DEFB #08 ; CURSOR LEFT + DEFB #0A ; CURSOR DOWN + DEFB #0B ; CURSOR UP + DEFB #09 ; CURSOR RIGHT + DEFB #0F ; GRAPHICS ;; SYM-CODES ; The 26 red symbols assigned to the alphabetic characters of the keyboard. ; The ten single-character digit symbols are converted without the aid of ; a table using subtraction and minor manipulation. -L026A: DEFB $E2 ; STOP +L026A: DEFB #E2 ; STOP DEFB '*' DEFB '?' - DEFB $CD ; STEP - DEFB $C8 ; >= - DEFB $CC ; TO - DEFB $CB ; THEN + DEFB #CD ; STEP + DEFB #C8 ; >= + DEFB #CC ; TO + DEFB #CB ; THEN DEFB '^' - DEFB $AC ; AT + DEFB #AC ; AT DEFB '-' DEFB '+' DEFB '=' @@ -597,30 +597,30 @@ L026A: DEFB $E2 ; STOP DEFB ',' DEFB ';' DEFB '"' - DEFB $C7 ; <= + DEFB #C7 ; <= DEFB '<' - DEFB $C3 ; NOT + DEFB #C3 ; NOT DEFB '>' - DEFB $C5 ; OR + DEFB #C5 ; OR DEFB '/' - DEFB $C9 ; <> - DEFB $60 ; pound - DEFB $C6 ; AND + DEFB #C9 ; <> + DEFB #60 ; pound + DEFB #C6 ; AND DEFB ':' ; : ;; E-DIGITS ; The ten keywords assigned to the digits in extended mode. ; The remaining red keywords below the keys. -L0284: DEFB $D0 ; FORMAT - DEFB $CE ; DEF FN - DEFB $A8 ; FN - DEFB $CA ; LINE - DEFB $D3 ; OPEN# - DEFB $D4 ; CLOSE# - DEFB $D1 ; MOVE - DEFB $D2 ; ERASE - DEFB $A9 ; POINT - DEFB $CF ; CAT +L0284: DEFB #D0 ; FORMAT + DEFB #CE ; DEF FN + DEFB #A8 ; FN + DEFB #CA ; LINE + DEFB #D3 ; OPEN# + DEFB #D4 ; CLOSE# + DEFB #D1 ; MOVE + DEFB #D2 ; ERASE + DEFB #A9 ; POINT + DEFB #CF ; CAT ;******************************* @@ -642,7 +642,7 @@ L0284: DEFB $D0 ; FORMAT ; FDFE [ A ] [ S ] [ D ] [ F ] [ G ] | [ H ] [ J ] [ K ] [ L ] [ ENT ] BFFE ; ^ | v ; FEFE [SHI] [ Z ] [ X ] [ C ] [ V ] | [ B ] [ N ] [ M ] [sym] [ SPC ] 7FFE -; ^ $27 $18 v +; ^ #27 #18 v ; Start End ; 00100111 00011000 ; @@ -662,19 +662,19 @@ L0284: DEFB $D0 ; FORMAT ; key values 0-39 else 255 ;; KEY-SCAN -L028E: LD L,$2F ; initial key value +L028E: LD L,#2F ; initial key value ; valid values are obtained by subtracting ; eight five times. - LD DE,$FFFF ; a buffer to receive 2 keys. + LD DE,#FFFF ; a buffer to receive 2 keys. - LD BC,$FEFE ; the commencing port address + LD BC,#FEFE ; the commencing port address ; B holds 11111110 initially and is also ; used to count the 8 half-rows ;; KEY-LINE L0296: IN A,(C) ; read the port to A - bits will be reset ; if a key is pressed else set. CPL ; complement - pressed key-bits are now set - AND $1F ; apply 00011111 mask to pick up the + AND #1F ; apply 00011111 mask to pick up the ; relevant set bits. JR Z,L02AB ; forward to KEY-DONE if zero and therefore @@ -689,8 +689,8 @@ L029F: INC D ; now test the key buffer ; then too many so quit. ;; KEY-BITS -L02A1: SUB $08 ; subtract 8 from the key value - ; cycling through key values (top = $27) +L02A1: SUB #08 ; subtract 8 from the key value + ; cycling through key values (top = #27) ; e.g. 2F> 27>1F>17>0F>07 ; 2E> 26>1E>16>0E>06 SRL H ; shift key bits right into carry. @@ -710,19 +710,19 @@ L02AB: DEC L ; cycles 2F>2E>2D>2C>2B>2A>29>28 for LD A,D ; now test if D is still FF ? INC A ; if it is zero we have at most 1 key - ; range now $01-$28 (1-40d) + ; range now #01-#28 (1-40d) RET Z ; return if one key or no key. - CP $28 ; is it capsshift (was $27) ? + CP #28 ; is it capsshift (was #27) ? RET Z ; return if so. - CP $19 ; is it symbol shift (was $18) ? + CP #19 ; is it symbol shift (was #18) ? RET Z ; return also LD A,E ; now test E LD E,D ; but first switch LD D,A ; the two keys. - CP $18 ; is it symbol shift ? + CP #18 ; is it symbol shift ? RET ; return (with zero set if it was). ; but with symbol shift now in D @@ -742,10 +742,10 @@ L02BF: CALL L028E ; routine KEY-SCAN ; then both sets will be free. - LD HL,$5C00 ; point to KSTATE-0 + LD HL,#5C00 ; point to KSTATE-0 ;; K-ST-LOOP -L02C6: BIT 7,(HL) ; is it free ? ($FF) +L02C6: BIT 7,(HL) ; is it free ? (#FF) JR NZ,L02D1 ; forward to K-CH-SET if so INC HL ; address 5-counter @@ -753,12 +753,12 @@ L02C6: BIT 7,(HL) ; is it free ? ($FF) DEC HL ; step back JR NZ,L02D1 ; forward to K-CH-SET if not at end of count - LD (HL),$FF ; else mark it free. + LD (HL),#FF ; else mark it free. ;; K-CH-SET L02D1: LD A,L ; store low address byte. - LD HL,$5C04 ; point to KSTATE-4 - ; (ld l, $04) + LD HL,#5C04 ; point to KSTATE-4 + ; (ld l, #04) CP L ; have 2 been done ? JR NZ,L02C6 ; back to K-ST-LOOP to consider this 2nd set @@ -767,14 +767,14 @@ L02D1: LD A,L ; store low address byte. CALL L031E ; routine K-TEST to get main key in A RET NC ; return if single shift - LD HL,$5C00 ; point to KSTATE-0 + LD HL,#5C00 ; point to KSTATE-0 CP (HL) ; does it match ? JR Z,L0310 ; forward to K-REPEAT if so ; if not consider the second key map. EX DE,HL ; save kstate-0 in de - LD HL,$5C04 ; point to KSTATE-4 + LD HL,#5C04 ; point to KSTATE-4 CP (HL) ; does it match ? JR Z,L0310 ; forward to K-REPEAT if so @@ -795,25 +795,25 @@ L02D1: LD A,L ; store low address byte. L02F1: LD E,A ; store key in E LD (HL),A ; place in free location INC HL ; advance to interrupt counter - LD (HL),$05 ; and initialize to 5 + LD (HL),#05 ; and initialize to 5 INC HL ; advance to delay - LD A,($5C09) ; pick up system variable REPDEL + LD A,(#5C09) ; pick up system variable REPDEL LD (HL),A ; and insert that for first repeat delay. INC HL ; advance to last location of state map. - LD C,(IY+$07) ; pick up MODE (3 bytes) - LD D,(IY+$01) ; pick up FLAGS (3 bytes) + LD C,(IY+#07) ; pick up MODE (3 bytes) + LD D,(IY+#01) ; pick up FLAGS (3 bytes) PUSH HL ; save state map location ; Note. could now have used. - ; ld l,$41; ld c,(hl); ld l,$3B; ld d,(hl). + ; ld l,#41; ld c,(hl); ld l,#3B; ld d,(hl). ; six and two threes of course. CALL L0333 ; routine K-DECODE POP HL ; restore map pointer LD (HL),A ; put decoded key in last location of map. ;; K-END -L0308: LD ($5C08),A ; update LASTK system variable. - SET 5,(IY+$01) ; update FLAGS - signal new key. +L0308: LD (#5C08),A ; update LASTK system variable. + SET 5,(IY+#01) ; update FLAGS - signal new key. RET ; done ; --------------------------- @@ -824,12 +824,12 @@ L0308: LD ($5C08),A ; update LASTK system variable. ;; K-REPEAT L0310: INC HL ; advance - LD (HL),$05 ; maintain interrupt counter at 5 + LD (HL),#05 ; maintain interrupt counter at 5 INC HL ; advance DEC (HL) ; decrease REPDEL value. RET NZ ; return if not yet zero. - LD A,($5C0A) ; REPPER + LD A,(#5C0A) ; REPPER LD (HL),A ; but for subsequent repeats REPPER will be used. INC HL ; advance ; @@ -845,18 +845,18 @@ L0310: INC HL ; advance ;; K-TEST L031E: LD B,D ; load most significant key to B - ; will be $FF if not shift. - LD D,$00 ; and reset D to index into main table + ; will be #FF if not shift. + LD D,#00 ; and reset D to index into main table LD A,E ; load least significant key from E - CP $27 ; is it higher than 39d i.e. FF + CP #27 ; is it higher than 39d i.e. FF RET NC ; return with just a shift (in B now) - CP $18 ; is it symbol shift ? + CP #18 ; is it symbol shift ? JR NZ,L032C ; forward to K-MAIN if not ; but we could have just symbol shift and no other - BIT 7,B ; is other key $FF (ie not shift) + BIT 7,B ; is other key #FF (ie not shift) RET NZ ; return with solitary symbol shift @@ -874,7 +874,7 @@ L032C: LD HL,L0205 ; address: MAIN-KEYS ;; K-DECODE L0333: LD A,E ; pick up the stored main key - CP $3A ; an arbitrary point between digits and letters + CP #3A ; an arbitrary point between digits and letters JR C,L0367 ; forward to K-DIGIT with digits, space, enter. DEC C ; decrease MODE ( 0='KLC', 1='E', 2='G') @@ -884,13 +884,13 @@ L0333: LD A,E ; pick up the stored main key JR Z,L0341 ; to K-E-LET if was 1 for extended letters. ; proceed with graphic codes. -; Note. should selectively drop return address if code > 'U' ($55). +; Note. should selectively drop return address if code > 'U' (#55). ; i.e. abort the KEYBOARD call. ; e.g. cp 'V'; jr c addit; pop af; ;;addit etc. (5 bytes of instruction). ; (s-inkey$ never gets into graphics mode.) ;; addit - ADD A,$4F ; add offset to augment 'A' to graphics A say. + ADD A,#4F ; add offset to augment 'A' to graphics A say. RET ; return. ; Note. ( but [GRAPH] V gives RND, etc ). @@ -899,15 +899,15 @@ L0333: LD A,E ; pick up the stored main key ; the jump was to here with extended mode with uppercase A-Z. ;; K-E-LET -L0341: LD HL,L022C-$41 ; base address of E-UNSHIFT L022c - ; ( $01EB in standard ROM ) +L0341: LD HL,L022C-#41 ; base address of E-UNSHIFT L022c + ; ( #01EB in standard ROM ) INC B ; test B is it empty i.e. not a shift JR Z,L034A ; forward to K-LOOK-UP if neither shift - LD HL,L0246-$41 ; Address: $0205 L0246-$41 EXT-SHIFT base + LD HL,L0246-#41 ; Address: #0205 L0246-#41 EXT-SHIFT base ;; K-LOOK-UP -L034A: LD D,$00 ; prepare to index +L034A: LD D,#00 ; prepare to index ADD HL,DE ; add the main key value LD A,(HL) ; pick up other mode value RET ; return @@ -917,21 +917,21 @@ L034A: LD D,$00 ; prepare to index ; the jump was here with mode = 0 ;; K-KLC-LET -L034F: LD HL,L026A-$41 ; prepare base of sym-codes - BIT 0,B ; shift=$27 sym-shift=$18 +L034F: LD HL,L026A-#41 ; prepare base of sym-codes + BIT 0,B ; shift=#27 sym-shift=#18 JR Z,L034A ; back to K-LOOK-UP with symbol-shift BIT 3,D ; test FLAGS is it 'K' mode (from OUT-CURS) JR Z,L0364 ; skip to K-TOKENS if so - BIT 3,(IY+$30) ; test FLAGS2 - consider CAPS LOCK ? + BIT 3,(IY+#30) ; test FLAGS2 - consider CAPS LOCK ? RET NZ ; return if so with main code. INC B ; is shift being pressed ? ; result zero if not RET NZ ; return if shift pressed. - ADD A,$20 ; else convert the code to lower case. + ADD A,#20 ; else convert the code to lower case. RET ; return. ; --- @@ -939,7 +939,7 @@ L034F: LD HL,L026A-$41 ; prepare base of sym-codes ; the jump was here for tokens ;; K-TOKENS -L0364: ADD A,$A5 ; add offset to main code so that 'A' +L0364: ADD A,#A5 ; add offset to main code so that 'A' ; becomes 'NEW' etc. RET ; return @@ -948,7 +948,7 @@ L0364: ADD A,$A5 ; add offset to main code so that 'A' ; the jump was here with digits, space, enter and symbol shift (< $xx) ;; K-DIGIT -L0367: CP $30 ; is it '0' or higher ? +L0367: CP #30 ; is it '0' or higher ? RET C ; return with space, enter and symbol-shift DEC C ; test MODE (was 0='KLC', 1='E', 2='G') @@ -958,18 +958,18 @@ L0367: CP $30 ; is it '0' or higher ? ; continue with extended digits 0-9. - LD HL,L0284-$30 ; $0254 - base of E-DIGITS - BIT 5,B ; test - shift=$27 sym-shift=$18 + LD HL,L0284-#30 ; #0254 - base of E-DIGITS + BIT 5,B ; test - shift=#27 sym-shift=#18 JR Z,L034A ; to K-LOOK-UP if sym-shift - CP $38 ; is character '8' ? + CP #38 ; is character '8' ? JR NC,L0382 ; to K-8-&-9 if greater than '7' - SUB $20 ; reduce to ink range $10-$17 + SUB #20 ; reduce to ink range #10-#17 INC B ; shift ? RET Z ; return if not. - ADD A,$08 ; add 8 to give paper range $18 - $1F + ADD A,#08 ; add 8 to give paper range #18 - #1F RET ; return ; --- @@ -977,11 +977,11 @@ L0367: CP $30 ; is it '0' or higher ? ; 89 ;; K-8-&-9 -L0382: SUB $36 ; reduce to 02 and 03 bright codes +L0382: SUB #36 ; reduce to 02 and 03 bright codes INC B ; test if shift pressed. RET Z ; return if not. - ADD A,$FE ; subtract 2 setting carry + ADD A,#FE ; subtract 2 setting carry RET ; to give 0 and 1 flash codes. ; --- @@ -989,23 +989,23 @@ L0382: SUB $36 ; reduce to 02 and 03 bright codes ; graphics mode with digits ;; K-GRA-DGT -L0389: LD HL,L0260-$30 ; $0230 base address of CTL-CODES +L0389: LD HL,L0260-#30 ; #0230 base address of CTL-CODES - CP $39 ; is key '9' ? - JR Z,L034A ; back to K-LOOK-UP - changed to $0F, GRAPHICS. + CP #39 ; is key '9' ? + JR Z,L034A ; back to K-LOOK-UP - changed to #0F, GRAPHICS. - CP $30 ; is key '0' ? - JR Z,L034A ; back to K-LOOK-UP - changed to $0C, delete. + CP #30 ; is key '0' ? + JR Z,L034A ; back to K-LOOK-UP - changed to #0C, delete. ; for keys '0' - '7' we assign a mosaic character depending on shift. - AND $07 ; convert character to number. 0 - 7. - ADD A,$80 ; add offset - they start at $80 + AND #07 ; convert character to number. 0 - 7. + ADD A,#80 ; add offset - they start at #80 INC B ; destructively test for shift RET Z ; and return if not pressed. - XOR $0F ; toggle bits becomes range $88-$8F + XOR #0F ; toggle bits becomes range #88-#8F RET ; return. ; --- @@ -1018,32 +1018,32 @@ L039D: INC B ; return with digit codes if neither BIT 5,B ; test for caps shift. - LD HL,L0260-$30 ; prepare base of table CTL-CODES. + LD HL,L0260-#30 ; prepare base of table CTL-CODES. JR NZ,L034A ; back to K-LOOK-UP if shift pressed. ; must have been symbol shift - SUB $10 ; for ASCII most will now be correct + SUB #10 ; for ASCII most will now be correct ; on a standard typewriter. - CP $22 ; but '@' is not - see below. + CP #22 ; but '@' is not - see below. JR Z,L03B2 ; forward to to K-@-CHAR if so - CP $20 ; '_' is the other one that fails + CP #20 ; '_' is the other one that fails RET NZ ; return if not. - LD A,$5F ; substitute ASCII '_' + LD A,#5F ; substitute ASCII '_' RET ; return. ; --- ;; K-@-CHAR -L03B2: LD A,$40 ; substitute ASCII '@' +L03B2: LD A,#40 ; substitute ASCII '@' RET ; return. ; ------------------------------------------------------------------------ ; The Spectrum Input character keys. One or two are abbreviated. -; From $00 Flash 0 to $FF COPY. The routine above has decoded all these. +; From #00 Flash 0 to #FF COPY. The routine above has decoded all these. ; | 00 Fl0| 01 Fl1| 02 Br0| 03 Br1| 04 In0| 05 In1| 06 CAP| 07 EDT| ; | 08 LFT| 09 RIG| 0A DWN| 0B UP | 0C DEL| 0D ENT| 0E SYM| 0F GRA| @@ -1080,8 +1080,8 @@ L03B2: LD A,$40 ; substitute ASCII '@' ; Note that for simplicity, Sinclair have located all the control codes ; below the space character. -; ASCII DEL, $7F, has been made a copyright symbol. -; Also $60, '`', not used in BASIC but used in other languages, has been +; ASCII DEL, #7F, has been made a copyright symbol. +; Also #60, '`', not used in BASIC but used in other languages, has been ; allocated the local currency symbol for the relevant country - ; ukp in most Spectrums. @@ -1132,19 +1132,19 @@ L03B5: DI ; Disable Interrupts so they don't disturb timin SRL L ; SRL L ; L = medium part of tone period CPL ; - AND $03 ; A = 3 - fine part of tone period + AND #03 ; A = 3 - fine part of tone period LD C,A ; - LD B,$00 ; + LD B,#00 ; LD IX,L03D1 ; Address: BE-IX+3 ADD IX,BC ; IX holds address of entry into the loop ; the loop will contain 0-3 NOPs, implementing ; the fine part of the tone period. - LD A,($5C48) ; BORDCR - AND $38 ; bits 5..3 contain border colour + LD A,(#5C48) ; BORDCR + AND #38 ; bits 5..3 contain border colour RRCA ; border colour bits moved to 2..0 RRCA ; to match border bits on port #FE RRCA ; - OR $08 ; bit 3 set (tape output bit on port #FE) + OR #08 ; bit 3 set (tape output bit on port #FE) ; for loud sound output ;; BE-IX+3 L03D1: NOP ;(4) ; optionally executed NOPs for small @@ -1163,12 +1163,12 @@ L03D4: INC B ;(4) ; L03D6: DEC C ;(4) ; timing loop for duration of JR NZ,L03D6 ;(12/7); high or low pulse of waveform - LD C,$3F ;(7) ; + LD C,#3F ;(7) ; DEC B ;(4) ; JP NZ,L03D6 ;(10) ; to BE-H&L-LP - XOR $10 ;(7) ; toggle output beep bit - OUT ($FE),A ;(11) ; output pulse + XOR #10 ;(7) ; toggle output beep bit + OUT (#FE),A ;(11) ; output pulse LD B,H ;(4) ; B = coarse part of tone period LD C,A ;(4) ; save port #FE output byte BIT 4,A ;(8) ; if new output bit is high, go @@ -1207,19 +1207,19 @@ L03F6: EI ; Enable Interrupts ; ;; beep L03F8: RST 28H ;; FP-CALC - DEFB $31 ;;duplicate ; duplicate pitch - DEFB $27 ;;int ; convert to integer - DEFB $C0 ;;st-mem-0 ; store integer pitch to memory 0 - DEFB $03 ;;subtract ; calculate fractional part of pitch = fp_pitch - int_pitch - DEFB $34 ;;stk-data ; push constant - DEFB $EC ;;Exponent: $7C, Bytes: 4 ; constant = 0.05762265 - DEFB $6C,$98,$1F,$F5 ;;($6C,$98,$1F,$F5) - DEFB $04 ;;multiply ; compute: - DEFB $A1 ;;stk-one ; 1 + 0.05762265 * fraction_part(pitch) - DEFB $0F ;;addition - DEFB $38 ;;end-calc ; leave on calc stack + DEFB #31 ;;duplicate ; duplicate pitch + DEFB #27 ;;int ; convert to integer + DEFB #C0 ;;st-mem-0 ; store integer pitch to memory 0 + DEFB #03 ;;subtract ; calculate fractional part of pitch = fp_pitch - int_pitch + DEFB #34 ;;stk-data ; push constant + DEFB #EC ;;Exponent: #7C, Bytes: 4 ; constant = 0.05762265 + DEFB #6C,#98,#1F,#F5 ;;(#6C,#98,#1F,#F5) + DEFB #04 ;;multiply ; compute: + DEFB #A1 ;;stk-one ; 1 + 0.05762265 * fraction_part(pitch) + DEFB #0F ;;addition + DEFB #38 ;;end-calc ; leave on calc stack - LD HL,$5C92 ; MEM-0: number stored here is in 16 bit integer format (pitch) + LD HL,#5C92 ; MEM-0: number stored here is in 16 bit integer format (pitch) ; 0, 0/FF (pos/neg), LSB, MSB, 0 ; LSB/MSB is stored in two's complement ; In the following, the pitch is checked if it is in the range -128<=p<=127 @@ -1242,7 +1242,7 @@ L03F8: RST 28H ;; FP-CALC JR NZ,L046C ; if no, error REPORT-B ; now we know -128<=p<=127 LD A,B ; A = pitch + 60 - ADD A,$3C ; if -60<=pitch<=67, + ADD A,#3C ; if -60<=pitch<=67, JP P,L0425 ; goto BE-i-OK JP PO,L046C ; if pitch <= 67 goto REPORT-B @@ -1251,42 +1251,42 @@ L03F8: RST 28H ;; FP-CALC ;; BE-I-OK ; here, -60<=pitch<=127 ; and A=pitch+60 -> 0<=A<=187 -L0425: LD B,$FA ; 6 octaves below middle C +L0425: LD B,#FA ; 6 octaves below middle C ;; BE-OCTAVE ; A=# semitones above 5 octaves below middle C L0427: INC B ; increment octave - SUB $0C ; 12 semitones = one octave + SUB #0C ; 12 semitones = one octave JR NC,L0427 ; to BE-OCTAVE - ADD A,$0C ; A = # semitones above C (0-11) + ADD A,#0C ; A = # semitones above C (0-11) PUSH BC ; B = octave displacement from middle C, 2's complement: -5<=B<=10 LD HL,L046E ; Address: semi-tone CALL L3406 ; routine LOC-MEM - ; HL = 5*A + $046E + ; HL = 5*A + #046E CALL L33B4 ; routine STACK-NUM ; read FP value (freq) from semitone table (HL) and push onto calc stack RST 28H ;; FP-CALC - DEFB $04 ;;multiply mult freq by 1 + 0.0576 * fraction_part(pitch) stacked earlier + DEFB #04 ;;multiply mult freq by 1 + 0.0576 * fraction_part(pitch) stacked earlier ;; thus taking into account fractional part of pitch. ;; the number 0.0576*frequency is the distance in Hz to the next ;; note (verify with the frequencies recorded in the semitone ;; table below) so that the fraction_part of the pitch does ;; indeed represent a fractional distance to the next note. - DEFB $38 ;;end-calc HL points to first byte of fp num on stack = middle frequency to generate + DEFB #38 ;;end-calc HL points to first byte of fp num on stack = middle frequency to generate POP AF ; A = octave displacement from middle C, 2's complement: -5<=A<=10 ADD A,(HL) ; increase exponent by A (equivalent to multiplying by 2^A) LD (HL),A ; RST 28H ;; FP-CALC - DEFB $C0 ;;st-mem-0 ; store frequency in memory 0 - DEFB $02 ;;delete ; remove from calc stack - DEFB $31 ;;duplicate ; duplicate duration (seconds) - DEFB $38 ;;end-calc + DEFB #C0 ;;st-mem-0 ; store frequency in memory 0 + DEFB #02 ;;delete ; remove from calc stack + DEFB #31 ;;duplicate ; duplicate duration (seconds) + DEFB #38 ;;end-calc CALL L1E94 ; routine FIND-INT1 ; FP duration to A - CP $0B ; if dur > 10 seconds, + CP #0B ; if dur > 10 seconds, JR NC,L046C ; goto REPORT-B ;;; The following calculation finds the tone period for HL and the cycle count @@ -1299,19 +1299,19 @@ L0427: INC B ; increment octave ;;; below. This is probably an error. RST 28H ;; FP-CALC - DEFB $E0 ;;get-mem-0 ; push frequency - DEFB $04 ;;multiply ; result1: #cycles = duration * frequency - DEFB $E0 ;;get-mem-0 ; push frequency - DEFB $34 ;;stk-data ; push constant - DEFB $80 ;;Exponent $93, Bytes: 3 ; constant = 437500 - DEFB $43,$55,$9F,$80 ;;($55,$9F,$80,$00) - DEFB $01 ;;exchange ; frequency on top - DEFB $05 ;;division ; 437500 / frequency - DEFB $34 ;;stk-data ; push constant - DEFB $35 ;;Exponent: $85, Bytes: 1 ; constant = 30.125 - DEFB $71 ;;($71,$00,$00,$00) - DEFB $03 ;;subtract ; result2: tone_period(HL) = 437500 / freq - 30.125 - DEFB $38 ;;end-calc + DEFB #E0 ;;get-mem-0 ; push frequency + DEFB #04 ;;multiply ; result1: #cycles = duration * frequency + DEFB #E0 ;;get-mem-0 ; push frequency + DEFB #34 ;;stk-data ; push constant + DEFB #80 ;;Exponent #93, Bytes: 3 ; constant = 437500 + DEFB #43,#55,#9F,#80 ;;(#55,#9F,#80,#00) + DEFB #01 ;;exchange ; frequency on top + DEFB #05 ;;division ; 437500 / frequency + DEFB #34 ;;stk-data ; push constant + DEFB #35 ;;Exponent: #85, Bytes: 1 ; constant = 30.125 + DEFB #71 ;;(#71,#00,#00,#00) + DEFB #03 ;;subtract ; result2: tone_period(HL) = 437500 / freq - 30.125 + DEFB #38 ;;end-calc CALL L1E99 ; routine FIND-INT2 PUSH BC ; BC = tone_period(HL) @@ -1331,7 +1331,7 @@ L0427: INC B ; increment octave ;; REPORT-B L046C: RST 08H ; ERROR-1 - DEFB $0A ; Error Report: Integer out of range + DEFB #0A ; Error Report: Integer out of range @@ -1343,18 +1343,18 @@ L046C: RST 08H ; ERROR-1 ; To move n octaves higher or lower, frequencies are multiplied by 2^n. ;; semi-tone five byte fp decimal freq note (middle) -L046E: DEFB $89, $02, $D0, $12, $86; 261.625565290 C - DEFB $89, $0A, $97, $60, $75; 277.182631135 C# - DEFB $89, $12, $D5, $17, $1F; 293.664768100 D - DEFB $89, $1B, $90, $41, $02; 311.126983881 D# - DEFB $89, $24, $D0, $53, $CA; 329.627557039 E - DEFB $89, $2E, $9D, $36, $B1; 349.228231549 F - DEFB $89, $38, $FF, $49, $3E; 369.994422674 F# - DEFB $89, $43, $FF, $6A, $73; 391.995436072 G - DEFB $89, $4F, $A7, $00, $54; 415.304697513 G# - DEFB $89, $5C, $00, $00, $00; 440.000000000 A - DEFB $89, $69, $14, $F6, $24; 466.163761616 A# - DEFB $89, $76, $F1, $10, $05; 493.883301378 B +L046E: DEFB #89, #02, #D0, #12, #86; 261.625565290 C + DEFB #89, #0A, #97, #60, #75; 277.182631135 C# + DEFB #89, #12, #D5, #17, #1F; 293.664768100 D + DEFB #89, #1B, #90, #41, #02; 311.126983881 D# + DEFB #89, #24, #D0, #53, #CA; 329.627557039 E + DEFB #89, #2E, #9D, #36, #B1; 349.228231549 F + DEFB #89, #38, #FF, #49, #3E; 369.994422674 F# + DEFB #89, #43, #FF, #6A, #73; 391.995436072 G + DEFB #89, #4F, #A7, #00, #54; 415.304697513 G# + DEFB #89, #5C, #00, #00, #00; 440.000000000 A + DEFB #89, #69, #14, #F6, #24; 466.163761616 A# + DEFB #89, #76, #F1, #10, #05; 493.883301378 B ;**************************************** @@ -1373,7 +1373,7 @@ L046E: DEFB $89, $02, $D0, $12, $86; 261.625565290 C ;; zx81-name L04AA: CALL L24FB ; routine SCANNING to evaluate expression. - LD A,($5C3B) ; fetch system variable FLAGS. + LD A,(#5C3B) ; fetch system variable FLAGS. ADD A,A ; test bit 7 - syntax, bit 6 - result type. JP M,L1C8A ; to REPORT-C if not string result ; 'Nonsense in BASIC'. @@ -1396,13 +1396,13 @@ L04AA: CALL L24FB ; routine SCANNING to evaluate expression. ; ========================================= ; -; PORT 254 ($FE) +; PORT 254 (#FE) ; ; spk mic { border } ; ___ ___ ___ ___ ___ ___ ___ ___ ; PORT | | | | | | | | | ; 254 | | | | | | | | | -; $FE |___|___|___|___|___|___|___|___| +; #FE |___|___|___|___|___|___|___|___| ; 7 6 5 4 3 2 1 0 ; @@ -1415,7 +1415,7 @@ L04AA: CALL L24FB ; routine SCANNING to evaluate expression. ; On entry - ; HL points to start of data. ; IX points to descriptor. -; The accumulator is set to $00 for a header, $FF for data. +; The accumulator is set to #00 for a header, #FF for data. ;; SA-BYTES L04C2: LD HL,L053F ; address: SA/LD-RET @@ -1423,7 +1423,7 @@ L04C2: LD HL,L053F ; address: SA/LD-RET ; however there is only one non-terminal exit ; point. - LD HL,$1F80 ; a timing constant H=$1F, L=$80 + LD HL,#1F80 ; a timing constant H=#1F, L=#80 ; inner and outer loop counters ; a five second lead-in is used for a header. @@ -1433,7 +1433,7 @@ L04C2: LD HL,L053F ; address: SA/LD-RET ; else is data bytes and a shorter lead-in is used. - LD HL,$0C98 ; another timing value H=$0C, L=$98. + LD HL,#0C98 ; another timing value H=#0C, L=#98. ; a two second lead-in is used for the data. @@ -1444,20 +1444,20 @@ L04D0: EX AF,AF' ; save flag DI ; disable interrupts - LD A,$02 ; select red for border, microphone bit on. + LD A,#02 ; select red for border, microphone bit on. LD B,A ; also does as an initial slight counter value. ;; SA-LEADER L04D8: DJNZ L04D8 ; self loop to SA-LEADER for delay. - ; after initial loop, count is $A4 (or $A3) + ; after initial loop, count is #A4 (or #A3) - OUT ($FE),A ; output byte $02/$0D to tape port. + OUT (#FE),A ; output byte #02/#0D to tape port. - XOR $0F ; switch from RED (mic on) to CYAN (mic off). + XOR #0F ; switch from RED (mic on) to CYAN (mic off). - LD B,$A4 ; hold count. also timed instruction. + LD B,#A4 ; hold count. also timed instruction. - DEC L ; originally $80 or $98. + DEC L ; originally #80 or #98. ; but subsequently cycles 256 times. JR NZ,L04D8 ; back to SA-LEADER until L is zero. @@ -1465,26 +1465,26 @@ L04D8: DJNZ L04D8 ; self loop to SA-LEADER for delay. DEC B ; decrement count DEC H ; originally twelve or thirty-one. - JP P,L04D8 ; back to SA-LEADER until H becomes $FF + JP P,L04D8 ; back to SA-LEADER until H becomes #FF ; now send a synch pulse. At this stage mic is off and A holds value ; for mic on. ; A synch pulse is much shorter than the steady pulses of the lead-in. - LD B,$2F ; another short timed delay. + LD B,#2F ; another short timed delay. ;; SA-SYNC-1 L04EA: DJNZ L04EA ; self loop to SA-SYNC-1 - OUT ($FE),A ; switch to mic on and red. - LD A,$0D ; prepare mic off - cyan - LD B,$37 ; another short timed delay. + OUT (#FE),A ; switch to mic on and red. + LD A,#0D ; prepare mic off - cyan + LD B,#37 ; another short timed delay. ;; SA-SYNC-2 L04F2: DJNZ L04F2 ; self loop to SA-SYNC-2 - OUT ($FE),A ; output mic off, cyan border. - LD BC,$3B0E ; B=$3B time(*), C=$0E, YELLOW, MIC OFF. + OUT (#FE),A ; output mic off, cyan border. + LD BC,#3B0E ; B=#3B time(*), C=#0E, YELLOW, MIC OFF. ; @@ -1492,21 +1492,21 @@ L04F2: DJNZ L04F2 ; self loop to SA-SYNC-2 ; which is 1st byte to be saved. LD L,A ; and transfer to L. - ; the initial parity is A, $FF or $00. + ; the initial parity is A, #FF or #00. JP L0507 ; JUMP forward to SA-START -> ; the mid entry point of loop. ; ------------------------- ; During the save loop a parity byte is maintained in H. ; the save loop begins by testing if reduced length is zero and if so -; the final parity byte is saved reducing count to $FFFF. +; the final parity byte is saved reducing count to #FFFF. ;; SA-LOOP L04FE: LD A,D ; fetch high byte OR E ; test against low byte. JR Z,L050E ; forward to SA-PARITY if zero. - LD L,(IX+$00) ; load currently addressed byte to L. + LD L,(IX+#00) ; load currently addressed byte to L. ;; SA-LOOP-P L0505: LD A,H ; fetch parity byte. @@ -1516,7 +1516,7 @@ L0505: LD A,H ; fetch parity byte. ;; SA-START L0507: LD H,A ; put parity byte in H. - LD A,$01 ; prepare blue, mic=on. + LD A,#01 ; prepare blue, mic=on. SCF ; set carry flag ready to rotate in. JP L0525 ; JUMP forward to SA-8-BITS -8-> @@ -1539,9 +1539,9 @@ L050E: LD L,H ; transfer the running parity byte to L and ;; SA-BIT-2 L0511: LD A,C ; fetch 'mic on and yellow' which is ; held permanently in C. - BIT 7,B ; set the zero flag. B holds $3E. + BIT 7,B ; set the zero flag. B holds #3E. -; entry point to save 1 entire bit. For first bit B holds $3B(*). +; entry point to save 1 entire bit. For first bit B holds #3B(*). ; Carry is set if saved bit is 1. zero is reset NZ on entry. ;; SA-BIT-1 @@ -1551,21 +1551,21 @@ L0514: DJNZ L0514 ; self loop for delay to SA-BIT-1 ; but if bit is 1 then the mic state is held for longer. - LD B,$42 ; set timed delay. (66 decimal) + LD B,#42 ; set timed delay. (66 decimal) ;; SA-SET L051A: DJNZ L051A ; self loop to SA-SET ; (roughly an extra 66*13 clock cycles) ;; SA-OUT -L051C: OUT ($FE),A ; blue and mic on OR yellow and mic off. +L051C: OUT (#FE),A ; blue and mic on OR yellow and mic off. - LD B,$3E ; set up delay + LD B,#3E ; set up delay JR NZ,L0511 ; back to SA-BIT-2 if zero reset NZ (first pass) ; proceed when the blue and yellow bands have been output. - DEC B ; change value $3E to $3D. + DEC B ; change value #3E to #3D. XOR A ; clear carry flag (ready to rotate in). INC A ; reset zero flag ie. NZ. @@ -1581,20 +1581,20 @@ L0525: RL L ; rotate left through carry DEC DE ; decrease length INC IX ; increase byte pointer - LD B,$31 ; set up timing. + LD B,#31 ; set up timing. - LD A,$7F ; test the space key and - IN A,($FE) ; return to common exit (to restore border) + LD A,#7F ; test the space key and + IN A,(#FE) ; return to common exit (to restore border) RRA ; if a space is pressed RET NC ; return to SA/LD-RET. - - > -; now test if byte counter has reached $FFFF. +; now test if byte counter has reached #FFFF. LD A,D ; fetch high byte INC A ; increment. JP NZ,L04FE ; JUMP to SA-LOOP if more bytes. - LD B,$3B ; a final delay. + LD B,#3B ; a final delay. ;; SA-DELAY L053C: DJNZ L053C ; self loop to SA-DELAY @@ -1612,16 +1612,16 @@ L053C: DJNZ L053C ; self loop to SA-DELAY ;; SA/LD-RET L053F: PUSH AF ; preserve accumulator throughout. - LD A,($5C48) ; fetch border colour from BORDCR. - AND $38 ; mask off paper bits. + LD A,(#5C48) ; fetch border colour from BORDCR. + AND #38 ; mask off paper bits. RRCA ; rotate RRCA ; to the RRCA ; range 0-7. - OUT ($FE),A ; change the border colour. + OUT (#FE),A ; change the border colour. - LD A,$7F ; read from port address $7FFE the - IN A,($FE) ; row with the space key at outside. + LD A,#7F ; read from port address #7FFE the + IN A,(#FE) ; row with the space key at outside. RRA ; test for space key pressed. EI ; enable interrupts @@ -1630,7 +1630,7 @@ L053F: PUSH AF ; preserve accumulator throughout. ;; REPORT-Da L0552: RST 08H ; ERROR-1 - DEFB $0C ; Error Report: BREAK - CONT repeats + DEFB #0C ; Error Report: BREAK - CONT repeats ; --- @@ -1641,8 +1641,8 @@ L0554: POP AF ; restore the accumulator. ; ------------------------------------ ; Load header or block of information ; ------------------------------------ -; This routine is used to load bytes and on entry A is set to $00 for a -; header or to $FF for data. IX points to the start of receiving location +; This routine is used to load bytes and on entry A is set to #00 for a +; header or to #FF for data. IX points to the start of receiving location ; and DE holds the length of bytes to be loaded. If, on entry the carry flag ; is set then data is loaded, if reset then it is verified. @@ -1653,8 +1653,8 @@ L0556: INC D ; reset the zero flag without disturbing carry. DI ; disable interrupts - LD A,$0F ; make the border white and mic off. - OUT ($FE),A ; output to port. + LD A,#0F ; make the border white and mic off. + OUT (#FE),A ; output to port. LD HL,L053F ; Address: SA/LD-RET PUSH HL ; is saved on stack as terminating routine. @@ -1662,10 +1662,10 @@ L0556: INC D ; reset the zero flag without disturbing carry. ; the reading of the EAR bit (D6) will always be preceded by a test of the ; space key (D0), so store the initial post-test state. - IN A,($FE) ; read the ear state - bit 6. + IN A,(#FE) ; read the ear state - bit 6. RRA ; rotate to bit 5. - AND $20 ; isolate this bit. - OR $02 ; combine with red border colour. + AND #20 ; isolate this bit. + OR #02 ; combine with red border colour. LD C,A ; and store initial state long-term in C. CP A ; set the zero flag. @@ -1681,7 +1681,7 @@ L056C: CALL L05E7 ; routine LD-EDGE-1 ; but continue when a transition is found on tape. - LD HL,$0415 ; set up 16-bit outer loop counter for + LD HL,#0415 ; set up 16-bit outer loop counter for ; approx 1 second delay. ;; LD-WAIT @@ -1700,11 +1700,11 @@ L0574: DJNZ L0574 ; self loop to LD-WAIT (for 256 times) ; if no edges at all. ;; LD-LEADER -L0580: LD B,$9C ; set timing value. +L0580: LD B,#9C ; set timing value. CALL L05E3 ; routine LD-EDGE-2 JR NC,L056B ; back to LD-BREAK if time-out - LD A,$C6 ; two edges must be spaced apart. + LD A,#C6 ; two edges must be spaced apart. CP B ; compare JR NC,L056C ; back to LD-START if too close together for a ; lead-in. @@ -1716,17 +1716,17 @@ L0580: LD B,$9C ; set timing value. ; Now test every edge looking for the terminal synch signal. ;; LD-SYNC -L058F: LD B,$C9 ; initial timing value in B. +L058F: LD B,#C9 ; initial timing value in B. CALL L05E7 ; routine LD-EDGE-1 JR NC,L056B ; back to LD-BREAK with time-out. LD A,B ; fetch augmented timing value from B. - CP $D4 ; compare + CP #D4 ; compare JR NC,L058F ; back to LD-SYNC if gap too big, that is, ; a normal lead-in edge gap. ; but a short gap will be the synch pulse. -; in which case another edge should appear before B rises to $FF +; in which case another edge should appear before B rises to #FF CALL L05E7 ; routine LD-EDGE-1 RET NC ; return with time-out. @@ -1735,12 +1735,12 @@ L058F: LD B,$C9 ; initial timing value in B. ; We are about to load data so change the border colours. LD A,C ; fetch long-term mask from C - XOR $03 ; and make blue/yellow. + XOR #03 ; and make blue/yellow. LD C,A ; store the new long-term byte. - LD H,$00 ; set up parity byte as zero. - LD B,$B0 ; timing. + LD H,#00 ; set up parity byte as zero. + LD B,#B0 ; timing. JR L05C8 ; forward to LD-MARKER ; the loop mid entry point with the alternate ; zero flag reset to indicate first byte @@ -1756,7 +1756,7 @@ L05A9: EX AF,AF' ; restore entry flags and type in A. JR NC,L05BD ; forward to LD-VERIFY if not to be loaded. - LD (IX+$00),L ; place loaded byte at memory location. + LD (IX+#00),L ; place loaded byte at memory location. JR L05C2 ; forward to LD-NEXT ; --- @@ -1782,7 +1782,7 @@ L05B3: RL C ; preserve carry (verify) flag in long-term ; for verification the byte read from tape is compared with that in memory. ;; LD-VERIFY -L05BD: LD A,(IX+$00) ; fetch byte from memory. +L05BD: LD A,(IX+#00) ; fetch byte from memory. XOR L ; compare with that on tape RET NZ ; return if not zero. @@ -1792,27 +1792,27 @@ L05C2: INC IX ; increment byte pointer. ;; LD-DEC L05C4: DEC DE ; decrement length. EX AF,AF' ; store the flags. - LD B,$B2 ; timing. + LD B,#B2 ; timing. ; when starting to read 8 bits the receiving byte is marked with bit at right. ; when this is rotated out again then 8 bits have been read. ;; LD-MARKER -L05C8: LD L,$01 ; initialize as %00000001 +L05C8: LD L,#01 ; initialize as %00000001 ;; LD-8-BITS L05CA: CALL L05E3 ; routine LD-EDGE-2 increments B relative to ; gap between 2 edges. RET NC ; return with time-out. - LD A,$CB ; the comparison byte. + LD A,#CB ; the comparison byte. CP B ; compare to incremented value of B. ; if B is higher then bit on tape was set. ; if <= then bit on tape is reset. RL L ; rotate the carry bit into L. - LD B,$B0 ; reset the B timer byte. + LD B,#B0 ; reset the B timer byte. JP NC,L05CA ; JUMP back to LD-8-BITS ; when carry set then marker bit has been passed out and byte is complete. @@ -1829,7 +1829,7 @@ L05CA: CALL L05E3 ; routine LD-EDGE-2 increments B relative to ; when all bytes loaded then parity byte should be zero. LD A,H ; fetch parity byte. - CP $01 ; set carry if zero. + CP #01 ; set carry if zero. RET ; return ; in no carry then error as checksum disagrees. @@ -1837,7 +1837,7 @@ L05CA: CALL L05E3 ; routine LD-EDGE-2 increments B relative to ; Check signal being loaded ; ------------------------- ; An edge is a transition from one mic state to another. -; More specifically a change in bit 6 of value input from port $FE. +; More specifically a change in bit 6 of value input from port #FE. ; Graphically it is a change of border colour, say, blue to yellow. ; The first entry point looks for two adjacent edges. The second entry point ; is used to find a single edge. @@ -1859,7 +1859,7 @@ L05E3: CALL L05E7 ; call routine LD-EDGE-1 below. ; when detecting a read-in signal on the tape. ;; LD-EDGE-1 -L05E7: LD A,$16 ; a delay value of twenty two. +L05E7: LD A,#16 ; a delay value of twenty two. ;; LD-DELAY L05E9: DEC A ; decrement counter @@ -1869,15 +1869,15 @@ L05E9: DEC A ; decrement counter ;; LD-SAMPLE L05ED: INC B ; increment the time-out counter. - RET Z ; return with failure when $FF passed. + RET Z ; return with failure when #FF passed. - LD A,$7F ; prepare to read keyboard and EAR port - IN A,($FE) ; row $7FFE. bit 6 is EAR, bit 0 is SPACE key. + LD A,#7F ; prepare to read keyboard and EAR port + IN A,(#FE) ; row #7FFE. bit 6 is EAR, bit 0 is SPACE key. RRA ; test outer key the space. (bit 6 moves to 5) RET NC ; return if space pressed. >>> XOR C ; compare with initial long-term state. - AND $20 ; isolate bit 5 + AND #20 ; isolate bit 5 JR Z,L05ED ; back to LD-SAMPLE if no edge. ; but an edge, a transition of the EAR bit, has been found so switch the @@ -1887,9 +1887,9 @@ L05ED: INC B ; increment the time-out counter. CPL ; switch the bits LD C,A ; and put back in C for long-term. - AND $07 ; isolate new colour bits. - OR $08 ; set bit 3 - MIC off. - OUT ($FE),A ; send to port to effect change of colour. + AND #07 ; isolate new colour bits. + OR #08 ; set bit 3 - MIC off. + OUT (#FE),A ; send to port to effect change of colour. SCF ; set carry flag signaling edge found within ; time allowed. @@ -1901,24 +1901,24 @@ L05ED: INC B ; increment the time-out counter. ; This is the single entry point for the four tape commands. ; The routine first determines in what context it has been called by examining ; the low byte of the Syntax table entry which was stored in T_ADDR. -; Subtracting $EO (the present arrangement) gives a value of -; $00 - SAVE -; $01 - LOAD -; $02 - VERIFY -; $03 - MERGE +; Subtracting #EO (the present arrangement) gives a value of +; #00 - SAVE +; #01 - LOAD +; #02 - VERIFY +; #03 - MERGE ; As with all commands the address STMT-RET is on the stack. ;; SAVE-ETC L0605: POP AF ; discard address STMT-RET. - LD A,($5C74) ; fetch T_ADDR + LD A,(#5C74) ; fetch T_ADDR ; Now reduce the low byte of the Syntax table entry to give command. -; Note. For ZASM use SUB $E0 as next instruction. +; Note. For ZASM use SUB #E0 as next instruction. L0609: SUB low (L1ADF + 1) ; subtract the known offset. - ; ( is SUB $E0 in standard ROM ) + ; ( is SUB #E0 in standard ROM ) - LD ($5C74),A ; and put back in T_ADDR as 0,1,2, or 3 + LD (#5C74),A ; and put back in T_ADDR as 0,1,2, or 3 ; for future reference. CALL L1C8C ; routine EXPT-EXP checks that a string @@ -1928,12 +1928,12 @@ L0609: SUB low (L1ADF + 1) ; subtract the known offset. CALL L2530 ; routine SYNTAX-Z JR Z,L0652 ; forward to SA-DATA if checking syntax. - LD BC,$0011 ; presume seventeen bytes for a header. - LD A,($5C74) ; fetch command from T_ADDR. + LD BC,#0011 ; presume seventeen bytes for a header. + LD A,(#5C74) ; fetch command from T_ADDR. AND A ; test for zero - SAVE. JR Z,L0621 ; forward to SA-SPACE if so. - LD C,$22 ; else double length to thirty four. + LD C,#22 ; else double length to thirty four. ;; SA-SPACE L0621: RST 30H ; BC-SPACES creates 17/34 bytes in workspace. @@ -1944,32 +1944,32 @@ L0621: RST 30H ; BC-SPACES creates 17/34 bytes in workspace. ; ten spaces are required for the default filename but it is simpler to ; overwrite the first file-type indicator byte as well. - LD B,$0B ; set counter to eleven. - LD A,$20 ; prepare a space. + LD B,#0B ; set counter to eleven. + LD A,#20 ; prepare a space. ;; SA-BLANK L0629: LD (DE),A ; set workspace location to space. INC DE ; next location. DJNZ L0629 ; loop back to SA-BLANK till all eleven done. - LD (IX+$01),$FF ; set first byte of ten character filename - ; to $FF as a default to signal null string. + LD (IX+#01),#FF ; set first byte of ten character filename + ; to #FF as a default to signal null string. CALL L2BF1 ; routine STK-FETCH fetches the filename ; parameters from the calculator stack. ; length of string in BC. ; start of string in DE. - LD HL,$FFF6 ; prepare the value minus ten. + LD HL,#FFF6 ; prepare the value minus ten. DEC BC ; decrement length. - ; ten becomes nine, zero becomes $FFFF. + ; ten becomes nine, zero becomes #FFFF. ADD HL,BC ; trial addition. INC BC ; restore true length. JR NC,L064B ; forward to SA-NAME if length is one to ten. ; the filename is more than ten characters in length or the null string. - LD A,($5C74) ; fetch command from T_ADDR. + LD A,(#5C74) ; fetch command from T_ADDR. AND A ; test for zero - SAVE. JR NZ,L0644 ; forward to SA-NULL if not the SAVE command. @@ -1980,7 +1980,7 @@ L0629: LD (DE),A ; set workspace location to space. ;; REPORT-Fa L0642: RST 08H ; ERROR-1 - DEFB $0E ; Error Report: Invalid file name + DEFB #0E ; Error Report: Invalid file name ; continue with LOAD, MERGE, VERIFY and also SAVE within ten character limit. @@ -1990,7 +1990,7 @@ L0644: LD A,B ; test length of filename JR Z,L0652 ; forward to SA-DATA if so using the 255 ; indicator followed by spaces. - LD BC,$000A ; else trim length to ten. + LD BC,#000A ; else trim length to ten. ; other paths rejoin here with BC holding length in range 1 - 10. @@ -2008,14 +2008,14 @@ L064B: PUSH IX ; push start of file descriptor. ;; SA-DATA L0652: RST 18H ; GET-CHAR - CP $E4 ; is character after filename the token 'DATA' ? + CP #E4 ; is character after filename the token 'DATA' ? JR NZ,L06A0 ; forward to SA-SCR$ to consider SCREEN$ if ; not. ; continue to consider DATA. - LD A,($5C74) ; fetch command from T_ADDR - CP $03 ; is it 'VERIFY' ? + LD A,(#5C74) ; fetch command from T_ADDR + CP #03 ; is it 'VERIFY' ? JP Z,L1C8A ; jump forward to REPORT-C if so. ; 'Nonsense in BASIC' ; VERIFY "d" DATA is not allowed. @@ -2031,8 +2031,8 @@ L0652: RST 18H ; GET-CHAR ; comes later. JR NC,L0672 ; forward to SA-V-OLD if variable found. - LD HL,$0000 ; set destination to zero as not fixed. - LD A,($5C74) ; fetch command from T_ADDR + LD HL,#0000 ; set destination to zero as not fixed. + LD A,(#5C74) ; fetch command from T_ADDR DEC A ; test for 1 - LOAD JR Z,L0685 ; forward to SA-V-NEW with LOAD DATA. ; to load a new array. @@ -2041,7 +2041,7 @@ L0652: RST 18H ; GET-CHAR ;; REPORT-2a L0670: RST 08H ; ERROR-1 - DEFB $01 ; Error Report: Variable not found + DEFB #01 ; Error Report: Variable not found ; continue with SAVE/LOAD DATA @@ -2056,28 +2056,28 @@ L0672: JP NZ,L1C8A ; to REPORT-C if not an array variable. INC HL ; step past single character variable name. LD A,(HL) ; fetch low byte of length. - LD (IX+$0B),A ; place in descriptor. + LD (IX+#0B),A ; place in descriptor. INC HL ; point to high byte. LD A,(HL) ; and transfer that - LD (IX+$0C),A ; to descriptor. + LD (IX+#0C),A ; to descriptor. INC HL ; increase pointer within variable. ;; SA-V-NEW -L0685: LD (IX+$0E),C ; place character array name in header. - LD A,$01 ; default to type numeric. +L0685: LD (IX+#0E),C ; place character array name in header. + LD A,#01 ; default to type numeric. BIT 6,C ; test result from look-vars. JR Z,L068F ; forward to SA-V-TYPE if numeric. INC A ; set type to 2 - string array. ;; SA-V-TYPE -L068F: LD (IX+$00),A ; place type 0, 1 or 2 in descriptor. +L068F: LD (IX+#00),A ; place type 0, 1 or 2 in descriptor. ;; SA-DATA-1 L0692: EX DE,HL ; save var pointer in DE RST 20H ; NEXT-CHAR - CP $29 ; is character ')' ? + CP #29 ; is character ')' ? JR NZ,L0672 ; back if not to SA-V-OLD to report ; 'Nonsense in BASIC' @@ -2092,11 +2092,11 @@ L0692: EX DE,HL ; save var pointer in DE ; the branch was here to consider a 'SCREEN$', the display file. ;; SA-SCR$ -L06A0: CP $AA ; is character the token 'SCREEN$' ? +L06A0: CP #AA ; is character the token 'SCREEN$' ? JR NZ,L06C3 ; forward to SA-CODE if not. - LD A,($5C74) ; fetch command from T_ADDR - CP $03 ; is it MERGE ? + LD A,(#5C74) ; fetch command from T_ADDR + CP #03 ; is it MERGE ? JP Z,L1C8A ; jump to REPORT-C if so. ; 'Nonsense in BASIC' @@ -2108,24 +2108,24 @@ L06A0: CP $AA ; is character the token 'SCREEN$' ? ; continue in runtime. - LD (IX+$0B),$00 ; set descriptor length - LD (IX+$0C),$1B ; to $1b00 to include bitmaps and attributes. + LD (IX+#0B),#00 ; set descriptor length + LD (IX+#0C),#1B ; to #1b00 to include bitmaps and attributes. - LD HL,$4000 ; set start to display file start. - LD (IX+$0D),L ; place start in - LD (IX+$0E),H ; the descriptor. + LD HL,#4000 ; set start to display file start. + LD (IX+#0D),L ; place start in + LD (IX+#0E),H ; the descriptor. JR L0710 ; forward to SA-TYPE-3 ; --- ; the branch was here to consider CODE. ;; SA-CODE -L06C3: CP $AF ; is character the token 'CODE' ? +L06C3: CP #AF ; is character the token 'CODE' ? JR NZ,L0716 ; forward if not to SA-LINE to consider an ; auto-started BASIC program. - LD A,($5C74) ; fetch command from T_ADDR - CP $03 ; is it MERGE ? + LD A,(#5C74) ; fetch command from T_ADDR + CP #03 ; is it MERGE ? JP Z,L1C8A ; jump forward to REPORT-C if so. ; 'Nonsense in BASIC' @@ -2135,7 +2135,7 @@ L06C3: CP $AF ; is character the token 'CODE' ? ; return or ':' follows. JR NZ,L06E1 ; forward to SA-CODE-1 if there are parameters. - LD A,($5C74) ; else fetch the command from T_ADDR. + LD A,(#5C74) ; else fetch the command from T_ADDR. AND A ; test for zero - SAVE without a specification. JP Z,L1C8A ; jump to REPORT-C if so. ; 'Nonsense in BASIC' @@ -2153,12 +2153,12 @@ L06E1: CALL L1C82 ; routine EXPT-1NUM checks for numeric ; expression and stacks it in run-time. RST 18H ; GET-CHAR - CP $2C ; does a comma follow ? + CP #2C ; does a comma follow ? JR Z,L06F5 ; forward if so to SA-CODE-3 ; else allow saved code to be loaded to a specified address. - LD A,($5C74) ; fetch command from T_ADDR. + LD A,(#5C74) ; fetch command from T_ADDR. AND A ; is the command SAVE which requires length ? JP Z,L1C8A ; jump to REPORT-C if so. ; 'Nonsense in BASIC' @@ -2186,16 +2186,16 @@ L06F9: CALL L1BEE ; routine CHECK-END errors with extraneous ; in run-time there are two 16-bit parameters on the calculator stack. CALL L1E99 ; routine FIND-INT2 gets length. - LD (IX+$0B),C ; place length - LD (IX+$0C),B ; in descriptor. + LD (IX+#0B),C ; place length + LD (IX+#0C),B ; in descriptor. CALL L1E99 ; routine FIND-INT2 gets start. - LD (IX+$0D),C ; place start - LD (IX+$0E),B ; in descriptor. + LD (IX+#0D),C ; place start + LD (IX+#0E),B ; in descriptor. LD H,B ; transfer the LD L,C ; start to HL also. ;; SA-TYPE-3 -L0710: LD (IX+$00),$03 ; place type 3 - code in descriptor. +L0710: LD (IX+#00),#03 ; place type 3 - code in descriptor. JR L075A ; forward to SA-ALL. ; --- @@ -2203,7 +2203,7 @@ L0710: LD (IX+$00),$03 ; place type 3 - code in descriptor. ; number. ;; SA-LINE -L0716: CP $CA ; is character the token 'LINE' ? +L0716: CP #CA ; is character the token 'LINE' ? JR Z,L0723 ; forward to SA-LINE-1 if so. ; else all possibilities have been considered and nothing must follow. @@ -2212,7 +2212,7 @@ L0716: CP $CA ; is character the token 'LINE' ? ; continue in run-time to save BASIC without auto-start. - LD (IX+$0E),$80 ; place high line number in descriptor to + LD (IX+#0E),#80 ; place high line number in descriptor to ; disable auto-start. JR L073A ; forward to SA-TYPE-0 to save program. @@ -2220,7 +2220,7 @@ L0716: CP $CA ; is character the token 'LINE' ? ; the branch was here to consider auto-start. ;; SA-LINE-1 -L0723: LD A,($5C74) ; fetch command from T_ADDR +L0723: LD A,(#5C74) ; fetch command from T_ADDR AND A ; test for SAVE. JP NZ,L1C8A ; jump forward to REPORT-C with anything else. ; 'Nonsense in BASIC' @@ -2233,8 +2233,8 @@ L0723: LD A,($5C74) ; fetch command from T_ADDR CALL L1BEE ; routine CHECK-END quits if syntax path. CALL L1E99 ; routine FIND-INT2 fetches the numeric ; expression. - LD (IX+$0D),C ; place the auto-start - LD (IX+$0E),B ; line number in the descriptor. + LD (IX+#0D),C ; place the auto-start + LD (IX+#0E),B ; line number in the descriptor. ; Note. this isn't checked, but is subsequently handled by the system. ; If the user typed 40000 instead of 4000 then it won't auto-start @@ -2243,23 +2243,23 @@ L0723: LD A,($5C74) ; fetch command from T_ADDR ; continue to save program and any variables. ;; SA-TYPE-0 -L073A: LD (IX+$00),$00 ; place type zero - program in descriptor. - LD HL,($5C59) ; fetch E_LINE to HL. - LD DE,($5C53) ; fetch PROG to DE. +L073A: LD (IX+#00),#00 ; place type zero - program in descriptor. + LD HL,(#5C59) ; fetch E_LINE to HL. + LD DE,(#5C53) ; fetch PROG to DE. SCF ; set carry flag to calculate from end of ; variables E_LINE -1. SBC HL,DE ; subtract to give total length. - LD (IX+$0B),L ; place total length - LD (IX+$0C),H ; in descriptor. - LD HL,($5C4B) ; load HL from system variable VARS + LD (IX+#0B),L ; place total length + LD (IX+#0C),H ; in descriptor. + LD HL,(#5C4B) ; load HL from system variable VARS SBC HL,DE ; subtract to give program length. - LD (IX+$0F),L ; place length of program - LD (IX+$10),H ; in the descriptor. + LD (IX+#0F),L ; place length of program + LD (IX+#10),H ; in the descriptor. EX DE,HL ; start to HL, length to DE. ;; SA-ALL -L075A: LD A,($5C74) ; fetch command from T_ADDR +L075A: LD A,(#5C74) ; fetch command from T_ADDR AND A ; test for zero - SAVE. JP Z,L0970 ; jump forward to SA-CONTRL with SAVE -> @@ -2267,12 +2267,12 @@ L075A: LD A,($5C74) ; fetch command from T_ADDR ; continue with LOAD, MERGE and VERIFY. PUSH HL ; save start. - LD BC,$0011 ; prepare to add seventeen + LD BC,#0011 ; prepare to add seventeen ADD IX,BC ; to point IX at second descriptor. ;; LD-LOOK-H L0767: PUSH IX ; save IX - LD DE,$0011 ; seventeen bytes + LD DE,#0011 ; seventeen bytes XOR A ; reset zero flag SCF ; set carry flag CALL L0556 ; routine LD-BYTES loads a header from tape @@ -2280,23 +2280,23 @@ L0767: PUSH IX ; save IX POP IX ; restore IX. JR NC,L0767 ; loop back to LD-LOOK-H until header found. - LD A,$FE ; select system channel 'S' + LD A,#FE ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN opens it. - LD (IY+$52),$03 ; set SCR_CT to 3 lines. + LD (IY+#52),#03 ; set SCR_CT to 3 lines. - LD C,$80 ; C has bit 7 set to indicate type mismatch as + LD C,#80 ; C has bit 7 set to indicate type mismatch as ; a default startpoint. - LD A,(IX+$00) ; fetch loaded header type to A - CP (IX-$11) ; compare with expected type. + LD A,(IX+#00) ; fetch loaded header type to A + CP (IX-#11) ; compare with expected type. JR NZ,L078A ; forward to LD-TYPE with mis-match. - LD C,$F6 ; set C to minus ten - will count characters + LD C,#F6 ; set C to minus ten - will count characters ; up to zero. ;; LD-TYPE -L078A: CP $04 ; check if type in acceptable range 0 - 3. +L078A: CP #04 ; check if type in acceptable range 0 - 3. JR NC,L0767 ; back to LD-LOOK-H with 4 and over. ; else A indicates type 0-3. @@ -2309,9 +2309,9 @@ L078A: CP $04 ; check if type in acceptable range 0 - 3. PUSH IX ; transfer IX, POP DE ; the 2nd descriptor, to DE. - LD HL,$FFF0 ; prepare minus seventeen. + LD HL,#FFF0 ; prepare minus seventeen. ADD HL,DE ; add to point HL to 1st descriptor. - LD B,$0A ; the count will be ten characters for the + LD B,#0A ; the count will be ten characters for the ; filename. LD A,(HL) ; fetch first character and test for @@ -2322,8 +2322,8 @@ L078A: CP $04 ; check if type in acceptable range 0 - 3. ; match or -128 for a type mismatch. Although characters have to be counted ; bit 7 of C will not alter from state set here. - LD A,C ; transfer $F6 or $80 to A - ADD A,B ; add $0A + LD A,C ; transfer #F6 or #80 to A + ADD A,B ; add #0A LD C,A ; place result, zero or -118, in C. ; At this point we have either a type mismatch, a wildcard match or ten @@ -2350,25 +2350,25 @@ L07AD: RST 10H ; PRINT-A prints character ; else print a terminal carriage return. - LD A,$0D ; prepare carriage return. + LD A,#0D ; prepare carriage return. RST 10H ; PRINT-A outputs it. ; The various control routines for LOAD, VERIFY and MERGE are executed ; during the one-second gap following the header on tape. POP HL ; restore xx - LD A,(IX+$00) ; fetch incoming type - CP $03 ; compare with CODE + LD A,(IX+#00) ; fetch incoming type + CP #03 ; compare with CODE JR Z,L07CB ; forward to VR-CONTROL if it is CODE. ; type is a program or an array. - LD A,($5C74) ; fetch command from T_ADDR + LD A,(#5C74) ; fetch command from T_ADDR DEC A ; was it LOAD ? JP Z,L0808 ; JUMP forward to LD-CONTRL if so to ; load BASIC or variables. - CP $02 ; was command MERGE ? + CP #02 ; was command MERGE ? JP Z,L08B6 ; jump forward to ME-CONTRL if so. ; else continue into VERIFY control routine to verify. @@ -2382,10 +2382,10 @@ L07AD: RST 10H ; PRINT-A prints character ;; VR-CONTROL L07CB: PUSH HL ; save pointer to data. - LD L,(IX-$06) ; fetch length of old data - LD H,(IX-$05) ; to HL. - LD E,(IX+$0B) ; fetch length of new data - LD D,(IX+$0C) ; to DE. + LD L,(IX-#06) ; fetch length of old data + LD H,(IX-#05) ; to HL. + LD E,(IX+#0B) ; fetch length of new data + LD D,(IX+#0C) ; to DE. LD A,H ; check length of old OR L ; for zero. JR Z,L07E9 ; forward to VR-CONT-1 if length unspecified @@ -2402,8 +2402,8 @@ L07CB: PUSH HL ; save pointer to data. ; a length on tape shorter than expected is not allowed for CODE - LD A,(IX+$00) ; else fetch type from tape. - CP $03 ; is it CODE ? + LD A,(IX+#00) ; else fetch type from tape. + CP #03 ; is it CODE ? JR NZ,L0806 ; forward to REPORT-R if so ; 'Tape loading error' @@ -2413,14 +2413,14 @@ L07E9: POP HL ; pop pointer to data OR L ; e.g. LOAD 'x' CODE JR NZ,L07F4 ; forward to VR-CONT-2 if destination specified. - LD L,(IX+$0D) ; else use the destination in the header - LD H,(IX+$0E) ; and load code at address saved from. + LD L,(IX+#0D) ; else use the destination in the header + LD H,(IX+#0E) ; and load code at address saved from. ;; VR-CONT-2 L07F4: PUSH HL ; push pointer to start of data block. POP IX ; transfer to IX. - LD A,($5C74) ; fetch reduced command from T_ADDR - CP $02 ; is it VERIFY ? + LD A,(#5C74) ; fetch reduced command from T_ADDR + CP #02 ; is it VERIFY ? SCF ; prepare a set carry flag JR NZ,L0800 ; skip to VR-CONT-3 if not @@ -2428,13 +2428,13 @@ L07F4: PUSH HL ; push pointer to start of data block. ; data is not loaded. ;; VR-CONT-3 -L0800: LD A,$FF ; signal data block to be loaded +L0800: LD A,#FF ; signal data block to be loaded ; ----------------- ; Load a data block ; ----------------- ; This routine is called from 3 places other than above to load a data block. -; In all cases the accumulator is first set to $FF so the routine could be +; In all cases the accumulator is first set to #FF so the routine could be ; called at the previous instruction. ;; LD-BLOCK @@ -2444,7 +2444,7 @@ L0802: CALL L0556 ; routine LD-BYTES ;; REPORT-R L0806: RST 08H ; ERROR-1 - DEFB $1A ; Error Report: Tape loading error + DEFB #1A ; Error Report: Tape loading error ; ------------------- ; Handle LOAD control @@ -2452,8 +2452,8 @@ L0806: RST 08H ; ERROR-1 ; This branch is taken when the command is LOAD with type 0, 1 or 2. ;; LD-CONTRL -L0808: LD E,(IX+$0B) ; fetch length of found data block - LD D,(IX+$0C) ; from 2nd descriptor. +L0808: LD E,(IX+#0B) ; fetch length of found data block + LD D,(IX+#0C) ; from 2nd descriptor. PUSH HL ; save destination LD A,H ; test for zero OR L ; @@ -2468,15 +2468,15 @@ L0808: LD E,(IX+$0B) ; fetch length of found data block ; --- ;; LD-CONT-1 -L0819: LD L,(IX-$06) ; fetch length from - LD H,(IX-$05) ; the first header. +L0819: LD L,(IX-#06) ; fetch length from + LD H,(IX-#05) ; the first header. EX DE,HL ; SCF ; set carry flag SBC HL,DE ; JR C,L082E ; to LD-DATA ;; LD-CONT-2 -L0825: LD DE,$0005 ; allow overhead of five bytes. +L0825: LD DE,#0005 ; allow overhead of five bytes. ADD HL,DE ; add in the difference in data lengths. LD B,H ; transfer to LD C,L ; the BC register pair @@ -2484,7 +2484,7 @@ L0825: LD DE,$0005 ; allow overhead of five bytes. ;; LD-DATA L082E: POP HL ; pop destination - LD A,(IX+$00) ; fetch type 0, 1 or 2. + LD A,(IX+#00) ; fetch type 0, 1 or 2. AND A ; test for program and variables. JR Z,L0873 ; forward if so to LD-PROG @@ -2504,23 +2504,23 @@ L082E: POP HL ; pop destination INC BC ; adjust length to INC BC ; include these INC BC ; three bytes also. - LD ($5C5F),IX ; save header pointer in X_PTR. + LD (#5C5F),IX ; save header pointer in X_PTR. CALL L19E8 ; routine RECLAIM-2 reclaims the old variable ; sliding workspace including the two headers ; downwards. - LD IX,($5C5F) ; reload IX from X_PTR which will have been + LD IX,(#5C5F) ; reload IX from X_PTR which will have been ; adjusted down by POINTERS routine. ;; LD-DATA-1 -L084C: LD HL,($5C59) ; address E_LINE - DEC HL ; now point to the $80 variables end-marker. - LD C,(IX+$0B) ; fetch new data length - LD B,(IX+$0C) ; from 2nd header. +L084C: LD HL,(#5C59) ; address E_LINE + DEC HL ; now point to the #80 variables end-marker. + LD C,(IX+#0B) ; fetch new data length + LD B,(IX+#0C) ; from 2nd header. PUSH BC ; * save it. INC BC ; adjust the INC BC ; length to include INC BC ; letter name and total length. - LD A,(IX-$03) ; fetch letter name from old header. + LD A,(IX-#03) ; fetch letter name from old header. PUSH AF ; preserve accumulator though not corrupted. CALL L1655 ; routine MAKE-ROOM creates space for variable @@ -2539,7 +2539,7 @@ L084C: LD HL,($5C59) ; address E_LINE PUSH HL ; transfer address POP IX ; to IX register pair. SCF ; set carry flag indicating load not verify. - LD A,$FF ; signal data not header. + LD A,#FF ; signal data not header. JP L0802 ; JUMP back to LD-BLOCK ; ----------------- @@ -2547,11 +2547,11 @@ L084C: LD HL,($5C59) ; address E_LINE ;; LD-PROG L0873: EX DE,HL ; transfer dest to DE. - LD HL,($5C59) ; address E_LINE + LD HL,(#5C59) ; address E_LINE DEC HL ; now variables end-marker. - LD ($5C5F),IX ; place the IX header pointer in X_PTR - LD C,(IX+$0B) ; get new length - LD B,(IX+$0C) ; from 2nd header + LD (#5C5F),IX ; place the IX header pointer in X_PTR + LD C,(IX+#0B) ; get new length + LD B,(IX+#0C) ; from 2nd header PUSH BC ; and save it. CALL L19E5 ; routine RECLAIM-1 reclaims program and vars. @@ -2563,27 +2563,27 @@ L0873: EX DE,HL ; transfer dest to DE. CALL L1655 ; routine MAKE-ROOM creates the space. - LD IX,($5C5F) ; reload IX from adjusted X_PTR + LD IX,(#5C5F) ; reload IX from adjusted X_PTR INC HL ; point to start of new area. - LD C,(IX+$0F) ; fetch length of BASIC on tape - LD B,(IX+$10) ; from 2nd descriptor + LD C,(IX+#0F) ; fetch length of BASIC on tape + LD B,(IX+#10) ; from 2nd descriptor ADD HL,BC ; add to address the start of variables. - LD ($5C4B),HL ; set system variable VARS + LD (#5C4B),HL ; set system variable VARS - LD H,(IX+$0E) ; fetch high byte of autostart line number. + LD H,(IX+#0E) ; fetch high byte of autostart line number. LD A,H ; transfer to A - AND $C0 ; test if greater than $3F. + AND #C0 ; test if greater than #3F. JR NZ,L08AD ; forward to LD-PROG-1 if so with no autostart. - LD L,(IX+$0D) ; else fetch the low byte. - LD ($5C42),HL ; set sytem variable to line number NEWPPC - LD (IY+$0A),$00 ; set statement NSPPC to zero. + LD L,(IX+#0D) ; else fetch the low byte. + LD (#5C42),HL ; set sytem variable to line number NEWPPC + LD (IY+#0A),#00 ; set statement NSPPC to zero. ;; LD-PROG-1 L08AD: POP DE ; ** pop the length POP IX ; * and start. SCF ; set carry flag - LD A,$FF ; signal data as opposed to a header. + LD A,#FF ; signal data as opposed to a header. JP L0802 ; jump back to LD-BLOCK ; -------------------- @@ -2593,14 +2593,14 @@ L08AD: POP DE ; ** pop the length ; ;; ME-CONTRL -L08B6: LD C,(IX+$0B) ; fetch length - LD B,(IX+$0C) ; of data block on tape. +L08B6: LD C,(IX+#0B) ; fetch length + LD B,(IX+#0C) ; of data block on tape. PUSH BC ; save it. INC BC ; one for the pot. RST 30H ; BC-SPACES creates room in workspace. ; HL addresses last new location. - LD (HL),$80 ; place end-marker at end. + LD (HL),#80 ; place end-marker at end. EX DE,HL ; transfer first location to HL. POP DE ; restore length to DE. PUSH HL ; save start. @@ -2608,17 +2608,17 @@ L08B6: LD C,(IX+$0B) ; fetch length PUSH HL ; and transfer it POP IX ; to IX register. SCF ; set carry flag to load data on tape. - LD A,$FF ; signal data not a header. + LD A,#FF ; signal data not a header. CALL L0802 ; routine LD-BLOCK loads to workspace. POP HL ; restore first location in workspace to HL. -X08CE LD DE,($5C53) ; set DE from system variable PROG. +X08CE LD DE,(#5C53) ; set DE from system variable PROG. ; now enter a loop to merge the data block in workspace with the program and ; variables. ;; ME-NEW-LP L08D2: LD A,(HL) ; fetch next byte from workspace. - AND $C0 ; compare with $3F. + AND #C0 ; compare with #3F. JR NZ,L08F0 ; forward to ME-VAR-LP if a variable or ; end-marker. @@ -2661,15 +2661,15 @@ L08EB: CALL L092C ; routine ME-ENTER enters the line ;; ME-VAR-LP L08F0: LD A,(HL) ; fetch first byte of workspace variable. LD C,A ; copy to C also. - CP $80 ; is it the end-marker ? + CP #80 ; is it the end-marker ? RET Z ; return if so as complete. >>>>> PUSH HL ; save workspace area pointer. - LD HL,($5C4B) ; load HL with VARS - start of variables area. + LD HL,(#5C4B) ; load HL with VARS - start of variables area. ;; ME-OLD-VP L08F9: LD A,(HL) ; fetch first byte. - CP $80 ; is it the end-marker ? + CP #80 ; is it the end-marker ? JR Z,L0923 ; forward if so to ME-VAR-L2 to add ; variable at end of variables area. @@ -2690,8 +2690,8 @@ L0901: PUSH BC ; save character in C. ; the branch was here when first characters of name matched. ;; ME-OLD-V2 -L0909: AND $E0 ; keep bits 11100000 - CP $A0 ; compare 10100000 - a long-named variable. +L0909: AND #E0 ; keep bits 11100000 + CP #A0 ; compare 10100000 - a long-named variable. JR NZ,L0921 ; forward to ME-VAR-L1 if just one-character. @@ -2727,9 +2727,9 @@ L091E: POP HL ; restore the prog/vars pointer. ; branch here when variable is to replace an existing one ;; ME-VAR-L1 -L0921: LD A,$FF ; indicate a replacement. +L0921: LD A,#FF ; indicate a replacement. -; this entry point is when A holds $80 indicating a new variable. +; this entry point is when A holds #80 indicating a new variable. ;; ME-VAR-L2 L0923: POP DE ; pop workspace pointer. @@ -2752,13 +2752,13 @@ L092C: JR NZ,L093E ; forward to ME-ENT-1 for insertion only. ; but the program line or variable matches so old one is reclaimed. EX AF,AF' ; save flag?? - LD ($5C5F),HL ; preserve workspace pointer in dynamic X_PTR + LD (#5C5F),HL ; preserve workspace pointer in dynamic X_PTR EX DE,HL ; transfer program dest pointer to HL. CALL L19B8 ; routine NEXT-ONE finds following location ; in program or variables area. CALL L19E8 ; routine RECLAIM-2 reclaims the space between. EX DE,HL ; transfer program dest pointer back to DE. - LD HL,($5C5F) ; fetch adjusted workspace pointer from X_PTR + LD HL,(#5C5F) ; fetch adjusted workspace pointer from X_PTR EX AF,AF' ; restore flags. ; now the new line or variable is entered. @@ -2769,8 +2769,8 @@ L093E: EX AF,AF' ; save or re-save flags. CALL L19B8 ; routine NEXT-ONE finds next in workspace. ; gets next in DE, difference in BC. ; prev addr in HL - LD ($5C5F),HL ; store pointer in X_PTR - LD HL,($5C53) ; load HL from system variable PROG + LD (#5C5F),HL ; store pointer in X_PTR + LD HL,(#5C53) ; load HL from system variable PROG EX (SP),HL ; swap with prog/vars pointer on stack. PUSH BC ; ** save length of new program line/variable. EX AF,AF' ; fetch flags back. @@ -2792,8 +2792,8 @@ L0958: INC HL ; address next? POP BC ; ** pop length POP DE ; * pop value for PROG which may have been ; altered by POINTERS if first line. - LD ($5C53),DE ; set PROG to original value. - LD DE,($5C5F) ; fetch adjusted workspace pointer from X_PTR + LD (#5C53),DE ; set PROG to original value. + LD DE,(#5C5F) ; fetch adjusted workspace pointer from X_PTR PUSH BC ; save length PUSH DE ; and workspace pointer EX DE,HL ; make workspace pointer source, prog/vars @@ -2821,7 +2821,7 @@ L0958: INC HL ; address next? ;; SA-CONTRL L0970: PUSH HL ; save start of data - LD A,$FD ; select system channel 'S' + LD A,#FD ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN XOR A ; clear to address table directly @@ -2829,27 +2829,27 @@ L0970: PUSH HL ; save start of data CALL L0C0A ; routine PO-MSG - ; 'Start tape then press any key.' - SET 5,(IY+$02) ; TV_FLAG - Signal lower screen requires + SET 5,(IY+#02) ; TV_FLAG - Signal lower screen requires ; clearing CALL L15D4 ; routine WAIT-KEY PUSH IX ; save pointer to descriptor. - LD DE,$0011 ; there are seventeen bytes. + LD DE,#0011 ; there are seventeen bytes. XOR A ; signal a header. CALL L04C2 ; routine SA-BYTES POP IX ; restore descriptor pointer. - LD B,$32 ; wait for a second - 50 interrupts. + LD B,#32 ; wait for a second - 50 interrupts. ;; SA-1-SEC L0991: HALT ; wait for interrupt DJNZ L0991 ; back to SA-1-SEC until pause complete. - LD E,(IX+$0B) ; fetch length of bytes from the - LD D,(IX+$0C) ; descriptor. + LD E,(IX+#0B) ; fetch length of bytes from the + LD D,(IX+#0C) ; descriptor. - LD A,$FF ; signal data bytes. + LD A,#FF ; signal data bytes. POP IX ; retrieve pointer to start JP L04C2 ; jump back to SA-BYTES @@ -2862,23 +2862,23 @@ L0991: HALT ; wait for interrupt ; OLD NEW PROG DATA DATA CODE ; HEADER HEADER num chr NOTES. ; ------ ------ ---- ---- ---- ---- ----------------------------- -; IX-$11 IX+$00 0 1 2 3 Type. -; IX-$10 IX+$01 x x x x F ($FF if filename is null). -; IX-$0F IX+$02 x x x x i -; IX-$0E IX+$03 x x x x l -; IX-$0D IX+$04 x x x x e -; IX-$0C IX+$05 x x x x n -; IX-$0B IX+$06 x x x x a -; IX-$0A IX+$07 x x x x m -; IX-$09 IX+$08 x x x x e -; IX-$08 IX+$09 x x x x . -; IX-$07 IX+$0A x x x x (terminal spaces). -; IX-$06 IX+$0B lo lo lo lo Total -; IX-$05 IX+$0C hi hi hi hi Length of datablock. -; IX-$04 IX+$0D Auto - - Start Various -; IX-$03 IX+$0E Start a-z a-z addr ($80 if no autostart). -; IX-$02 IX+$0F lo - - - Length of Program -; IX-$01 IX+$10 hi - - - only i.e. without variables. +; IX-#11 IX+#00 0 1 2 3 Type. +; IX-#10 IX+#01 x x x x F (#FF if filename is null). +; IX-#0F IX+#02 x x x x i +; IX-#0E IX+#03 x x x x l +; IX-#0D IX+#04 x x x x e +; IX-#0C IX+#05 x x x x n +; IX-#0B IX+#06 x x x x a +; IX-#0A IX+#07 x x x x m +; IX-#09 IX+#08 x x x x e +; IX-#08 IX+#09 x x x x . +; IX-#07 IX+#0A x x x x (terminal spaces). +; IX-#06 IX+#0B lo lo lo lo Total +; IX-#05 IX+#0C hi hi hi hi Length of datablock. +; IX-#04 IX+#0D Auto - - Start Various +; IX-#03 IX+#0E Start a-z a-z addr (#80 if no autostart). +; IX-#02 IX+#0F lo - - - Length of Program +; IX-#01 IX+#10 hi - - - only i.e. without variables. ; @@ -2889,21 +2889,21 @@ L0991: HALT ; wait for interrupt ; Starts with normal initial step-over byte. ;; tape-msgs -L09A1: DEFB $80 +L09A1: DEFB #80 DEFM "Start tape, then press any key" -L09C0: DEFB '.'+$80 - DEFB $0D +L09C0: DEFB '.'+#80 + DEFB #0D DEFM "Program:" - DEFB ' '+$80 - DEFB $0D + DEFB ' '+#80 + DEFB #0D DEFM "Number array:" - DEFB ' '+$80 - DEFB $0D + DEFB ' '+#80 + DEFB #0D DEFM "Character array:" - DEFB ' '+$80 - DEFB $0D + DEFB ' '+#80 + DEFB #0D DEFM "Bytes:" - DEFB ' '+$80 + DEFB ' '+#80 ;************************************************** @@ -2920,19 +2920,19 @@ L09C0: DEFB '.'+$80 ;; PRINT-OUT L09F4: CALL L0B03 ; routine PO-FETCH fetches print position ; to HL register pair. - CP $20 ; is character a space or higher ? + CP #20 ; is character a space or higher ? JP NC,L0AD9 ; jump forward to PO-ABLE if so. - CP $06 ; is character in range 00-05 ? + CP #06 ; is character in range 00-05 ? JR C,L0A69 ; to PO-QUEST to print '?' if so. - CP $18 ; is character in range 24d - 31d ? + CP #18 ; is character in range 24d - 31d ? JR NC,L0A69 ; to PO-QUEST to also print '?' if so. LD HL,L0A11 - 6 ; address 0A0B - the base address of control ; character table - where zero would be. LD E,A ; control character 06 - 23d - LD D,$00 ; is transferred to DE. + LD D,#00 ; is transferred to DE. ADD HL,DE ; index into table. @@ -2951,24 +2951,24 @@ L09F4: CALL L0B03 ; routine PO-FETCH fetches print position ; follows the table. ;; ctlchrtab -L0A11: DEFB L0A5F - $ ; 06d offset $4E to Address: PO-COMMA - DEFB L0A69 - $ ; 07d offset $57 to Address: PO-QUEST - DEFB L0A23 - $ ; 08d offset $10 to Address: PO-BACK-1 - DEFB L0A3D - $ ; 09d offset $29 to Address: PO-RIGHT - DEFB L0A69 - $ ; 10d offset $54 to Address: PO-QUEST - DEFB L0A69 - $ ; 11d offset $53 to Address: PO-QUEST - DEFB L0A69 - $ ; 12d offset $52 to Address: PO-QUEST - DEFB L0A4F - $ ; 13d offset $37 to Address: PO-ENTER - DEFB L0A69 - $ ; 14d offset $50 to Address: PO-QUEST - DEFB L0A69 - $ ; 15d offset $4F to Address: PO-QUEST - DEFB L0A7A - $ ; 16d offset $5F to Address: PO-1-OPER - DEFB L0A7A - $ ; 17d offset $5E to Address: PO-1-OPER - DEFB L0A7A - $ ; 18d offset $5D to Address: PO-1-OPER - DEFB L0A7A - $ ; 19d offset $5C to Address: PO-1-OPER - DEFB L0A7A - $ ; 20d offset $5B to Address: PO-1-OPER - DEFB L0A7A - $ ; 21d offset $5A to Address: PO-1-OPER - DEFB L0A75 - $ ; 22d offset $54 to Address: PO-2-OPER - DEFB L0A75 - $ ; 23d offset $53 to Address: PO-2-OPER +L0A11: DEFB L0A5F - $ ; 06d offset #4E to Address: PO-COMMA + DEFB L0A69 - $ ; 07d offset #57 to Address: PO-QUEST + DEFB L0A23 - $ ; 08d offset #10 to Address: PO-BACK-1 + DEFB L0A3D - $ ; 09d offset #29 to Address: PO-RIGHT + DEFB L0A69 - $ ; 10d offset #54 to Address: PO-QUEST + DEFB L0A69 - $ ; 11d offset #53 to Address: PO-QUEST + DEFB L0A69 - $ ; 12d offset #52 to Address: PO-QUEST + DEFB L0A4F - $ ; 13d offset #37 to Address: PO-ENTER + DEFB L0A69 - $ ; 14d offset #50 to Address: PO-QUEST + DEFB L0A69 - $ ; 15d offset #4F to Address: PO-QUEST + DEFB L0A7A - $ ; 16d offset #5F to Address: PO-1-OPER + DEFB L0A7A - $ ; 17d offset #5E to Address: PO-1-OPER + DEFB L0A7A - $ ; 18d offset #5D to Address: PO-1-OPER + DEFB L0A7A - $ ; 19d offset #5C to Address: PO-1-OPER + DEFB L0A7A - $ ; 20d offset #5B to Address: PO-1-OPER + DEFB L0A7A - $ ; 21d offset #5A to Address: PO-1-OPER + DEFB L0A75 - $ ; 22d offset #54 to Address: PO-2-OPER + DEFB L0A75 - $ ; 23d offset #53 to Address: PO-2-OPER ; ------------------- @@ -2979,27 +2979,27 @@ L0A11: DEFB L0A5F - $ ; 06d offset $4E to Address: PO-COMMA ;; PO-BACK-1 L0A23: INC C ; move left one column. - LD A,$22 ; value $21 is leftmost column. + LD A,#22 ; value #21 is leftmost column. CP C ; have we passed ? JR NZ,L0A3A ; to PO-BACK-3 if not and store new position. - BIT 1,(IY+$01) ; test FLAGS - is printer in use ? + BIT 1,(IY+#01) ; test FLAGS - is printer in use ? JR NZ,L0A38 ; to PO-BACK-2 if so, as we are unable to ; backspace from the leftmost position. INC B ; move up one screen line - LD C,$02 ; the rightmost column position. - LD A,$18 ; Note. This should be $19 + LD C,#02 ; the rightmost column position. + LD A,#18 ; Note. This should be #19 ; credit. Dr. Frank O'Hara, 1982 CP B ; has position moved past top of screen ? JR NZ,L0A3A ; to PO-BACK-3 if not and store new position. - DEC B ; else back to $18. + DEC B ; else back to #18. ;; PO-BACK-2 -L0A38: LD C,$21 ; the leftmost column position. +L0A38: LD C,#21 ; the leftmost column position. ;; PO-BACK-3 L0A3A: JP L0DD9 ; to CL-SET and PO-STORE to save new @@ -3018,17 +3018,17 @@ L0A3A: JP L0DD9 ; to CL-SET and PO-STORE to save new ; - Dr. Ian Logan, Understanding Your Spectrum, 1982. ;; PO-RIGHT -L0A3D: LD A,($5C91) ; fetch P_FLAG value +L0A3D: LD A,(#5C91) ; fetch P_FLAG value PUSH AF ; and save it on stack. - LD (IY+$57),$01 ; temporarily set P_FLAG 'OVER 1'. - LD A,$20 ; prepare a space. + LD (IY+#57),#01 ; temporarily set P_FLAG 'OVER 1'. + LD A,#20 ; prepare a space. CALL L0B65 ; routine PO-CHAR to print it. ; Note. could be PO-ABLE which would update ; the column position. POP AF ; restore the permanent flag. - LD ($5C91),A ; and restore system variable P_FLAG + LD (#5C91),A ; and restore system variable P_FLAG RET ; return without updating column position @@ -3038,11 +3038,11 @@ L0A3D: LD A,($5C91) ; fetch P_FLAG value ; A carriage return is 'printed' to screen or printer buffer. ;; PO-ENTER -L0A4F: BIT 1,(IY+$01) ; test FLAGS - is printer in use ? +L0A4F: BIT 1,(IY+#01) ; test FLAGS - is printer in use ? JP NZ,L0ECD ; to COPY-BUFF if so, to flush buffer and reset ; the print position. - LD C,$21 ; the leftmost column position. + LD C,#21 ; the leftmost column position. CALL L0C55 ; routine PO-SCR handles any scrolling required. DEC B ; to next screen line. JP L0DD9 ; jump forward to CL-SET to store new position. @@ -3056,10 +3056,10 @@ L0A4F: BIT 1,(IY+$01) ; test FLAGS - is printer in use ? ;; PO-COMMA L0A5F: CALL L0B03 ; routine PO-FETCH - seems unnecessary. - LD A,C ; the column position. $21-$01 - DEC A ; move right. $20-$00 - DEC A ; and again $1F-$00 or $FF if trailing - AND $10 ; will be $00 or $10. + LD A,C ; the column position. #21-#01 + DEC A ; move right. #20-#00 + DEC A ; and again #1F-#00 or #FF if trailing + AND #10 ; will be #00 or #10. JR L0AC3 ; forward to PO-FILL ; ------------------- @@ -3070,7 +3070,7 @@ L0A5F: CALL L0B03 ; routine PO-FETCH - seems unnecessary. ; there are a surprising number yet to be assigned. ;; PO-QUEST -L0A69: LD A,$3F ; prepare the character '?'. +L0A69: LD A,#3F ; prepare the character '?'. JR L0AD9 ; forward to PO-ABLE. ; -------------------------------- @@ -3079,12 +3079,12 @@ L0A69: LD A,$3F ; prepare the character '?'. ; Certain control characters are followed by 1 or 2 operands. ; The entry points from control character table are PO-2-OPER and PO-1-OPER. ; The routines alter the output address of the current channel so that -; subsequent RST $10 instructions take the appropriate action +; subsequent RST #10 instructions take the appropriate action ; before finally resetting the output address back to PRINT-OUT. ;; PO-TV-2 L0A6D: LD DE,L0A87 ; address: PO-CONT will be next output routine - LD ($5C0F),A ; store first operand in TVDATA-hi + LD (#5C0F),A ; store first operand in TVDATA-hi JR L0A80 ; forward to PO-CHANGE >> ; --- @@ -3103,10 +3103,10 @@ L0A75: LD DE,L0A6D ; address: PO-TV-2 will be next output routine L0A7A: LD DE,L0A87 ; address: PO-CONT will be next output routine ;; PO-TV-1 -L0A7D: LD ($5C0E),A ; store control code in TVDATA-lo +L0A7D: LD (#5C0E),A ; store control code in TVDATA-lo ;; PO-CHANGE -L0A80: LD HL,($5C51) ; use CURCHL to find current output channel. +L0A80: LD HL,(#5C51) ; use CURCHL to find current output channel. LD (HL),E ; make it INC HL ; the supplied LD (HL),D ; address from DE. @@ -3117,11 +3117,11 @@ L0A80: LD HL,($5C51) ; use CURCHL to find current output channel. ;; PO-CONT L0A87: LD DE,L09F4 ; Address: PRINT-OUT CALL L0A80 ; routine PO-CHANGE to restore normal channel. - LD HL,($5C0E) ; TVDATA gives control code and possible + LD HL,(#5C0E) ; TVDATA gives control code and possible ; subsequent character LD D,A ; save current character LD A,L ; the stored control code - CP $16 ; was it INK to OVER (1 operand) ? + CP #16 ; was it INK to OVER (1 operand) ? JP C,L2211 ; to CO-TEMP-5 JR NZ,L0AC2 ; to PO-TAB if not 22d i.e. 23d TAB. @@ -3129,17 +3129,17 @@ L0A87: LD DE,L09F4 ; Address: PRINT-OUT ; else must have been 22d AT. LD B,H ; line to H (0-23d) LD C,D ; column to C (0-31d) - LD A,$1F ; the value 31d + LD A,#1F ; the value 31d SUB C ; reverse the column number. JR C,L0AAC ; to PO-AT-ERR if C was greater than 31d. - ADD A,$02 ; transform to system range $02-$21 + ADD A,#02 ; transform to system range #02-#21 LD C,A ; and place in column register. - BIT 1,(IY+$01) ; test FLAGS - is printer in use ? + BIT 1,(IY+#01) ; test FLAGS - is printer in use ? JR NZ,L0ABF ; to PO-AT-SET as line can be ignored. - LD A,$16 ; 22 decimal + LD A,#16 ; 22 decimal SUB B ; subtract line number to reverse ; 0 - 22 becomes 22 - 0. @@ -3147,13 +3147,13 @@ L0A87: LD DE,L09F4 ; Address: PRINT-OUT L0AAC: JP C,L1E9F ; to REPORT-B if higher than 22 decimal ; Integer out of range. - INC A ; adjust for system range $01-$17 + INC A ; adjust for system range #01-#17 LD B,A ; place in line register - INC B ; adjust to system range $02-$18 - BIT 0,(IY+$02) ; TV_FLAG - Lower screen in use ? + INC B ; adjust to system range #02-#18 + BIT 0,(IY+#02) ; TV_FLAG - Lower screen in use ? JP NZ,L0C55 ; exit to PO-SCR to test for scrolling - CP (IY+$31) ; Compare against DF_SZ + CP (IY+#31) ; Compare against DF_SZ JP C,L0C86 ; to REPORT-5 if too low ; Out of screen. @@ -3172,17 +3172,17 @@ L0AC2: LD A,H ; transfer parameter to A ;; PO-FILL L0AC3: CALL L0B03 ; routine PO-FETCH, HL-addr, BC=line/column. - ; column 1 (right), $21 (left) + ; column 1 (right), #21 (left) ADD A,C ; add operand to current column DEC A ; range 0 - 31+ - AND $1F ; make range 0 - 31d + AND #1F ; make range 0 - 31d RET Z ; return if result zero LD D,A ; Counter to D - SET 0,(IY+$01) ; update FLAGS - signal suppress leading space. + SET 0,(IY+#01) ; update FLAGS - signal suppress leading space. ;; PO-SPACE -L0AD0: LD A,$20 ; space character. +L0AD0: LD A,#20 ; space character. CALL L0C3B ; routine PO-SAVE prints the character ; using alternate set (normal output routine) DEC D ; decrement counter. @@ -3207,29 +3207,29 @@ L0AD9: CALL L0B24 ; routine PO-ANY ; The main screen, lower screen/input buffer or ZX printer. ;; PO-STORE -L0ADC: BIT 1,(IY+$01) ; test FLAGS - Is printer in use ? +L0ADC: BIT 1,(IY+#01) ; test FLAGS - Is printer in use ? JR NZ,L0AFC ; to PO-ST-PR if so - BIT 0,(IY+$02) ; TV_FLAG - Lower screen in use ? + BIT 0,(IY+#02) ; TV_FLAG - Lower screen in use ? JR NZ,L0AF0 ; to PO-ST-E if so - LD ($5C88),BC ; S_POSN line/column upper screen - LD ($5C84),HL ; DF_CC display file address + LD (#5C88),BC ; S_POSN line/column upper screen + LD (#5C84),HL ; DF_CC display file address RET ; ; --- ;; PO-ST-E -L0AF0: LD ($5C8A),BC ; SPOSNL line/column lower screen - LD ($5C82),BC ; ECHO_E line/column input buffer - LD ($5C86),HL ; DFCCL lower screen memory address +L0AF0: LD (#5C8A),BC ; SPOSNL line/column lower screen + LD (#5C82),BC ; ECHO_E line/column input buffer + LD (#5C86),HL ; DFCCL lower screen memory address RET ; ; --- ;; PO-ST-PR -L0AFC: LD (IY+$45),C ; P_POSN column position printer - LD ($5C80),HL ; PR_CC full printer buffer memory address +L0AFC: LD (IY+#45),C ; P_POSN column position printer + LD (#5C80),HL ; PR_CC full printer buffer memory address RET ; ; ------------------------- @@ -3244,25 +3244,25 @@ L0AFC: LD (IY+$45),C ; P_POSN column position printer ; to the printer buffer could corrupt a 256-byte section of memory. ;; PO-FETCH -L0B03: BIT 1,(IY+$01) ; test FLAGS - Is printer in use +L0B03: BIT 1,(IY+#01) ; test FLAGS - Is printer in use JR NZ,L0B1D ; to PO-F-PR if so ; assume upper screen - LD BC,($5C88) ; S_POSN - LD HL,($5C84) ; DF_CC display file address - BIT 0,(IY+$02) ; TV_FLAG - Lower screen in use ? + LD BC,(#5C88) ; S_POSN + LD HL,(#5C84) ; DF_CC display file address + BIT 0,(IY+#02) ; TV_FLAG - Lower screen in use ? RET Z ; return if upper screen ; ah well, was lower screen - LD BC,($5C8A) ; SPOSNL - LD HL,($5C86) ; DFCCL + LD BC,(#5C8A) ; SPOSNL + LD HL,(#5C86) ; DFCCL RET ; return ; --- ;; PO-F-PR -L0B1D: LD C,(IY+$45) ; P_POSN column only - LD HL,($5C80) ; PR_CC printer buffer address +L0B1D: LD C,(IY+#45) ; P_POSN column only + LD HL,(#5C80) ; PR_CC printer buffer address RET ; return ; ------------------- @@ -3272,10 +3272,10 @@ L0B1D: LD C,(IY+$45) ; P_POSN column only ; It is only called from PO-ABLE which continues into PO-STORE ;; PO-ANY -L0B24: CP $80 ; ASCII ? +L0B24: CP #80 ; ASCII ? JR C,L0B65 ; to PO-CHAR is so. - CP $90 ; test if a block graphic character. + CP #90 ; test if a block graphic character. JR NC,L0B52 ; to PO-T&UDG to print tokens and udg's ; The 16 2*2 mosaic characters 128-143 decimal are formed from @@ -3285,13 +3285,13 @@ L0B24: CP $80 ; ASCII ? CALL L0B38 ; routine PO-GR-1 to construct top half ; then bottom half. CALL L0B03 ; routine PO-FETCH fetches print position. - LD DE,$5C92 ; MEM-0 is location of 8 bytes of character + LD DE,#5C92 ; MEM-0 is location of 8 bytes of character JR L0B7F ; to PR-ALL to print to screen or printer ; --- ;; PO-GR-1 -L0B38: LD HL,$5C92 ; address MEM-0 - a temporary buffer in +L0B38: LD HL,#5C92 ; address MEM-0 - a temporary buffer in ; systems variables which is normally used ; by the calculator. CALL L0B3E ; routine PO-GR-2 to construct top half @@ -3300,14 +3300,14 @@ L0B38: LD HL,$5C92 ; address MEM-0 - a temporary buffer in ;; PO-GR-2 L0B3E: RR B ; rotate bit 0/2 to carry - SBC A,A ; result $00 or $FF - AND $0F ; mask off right hand side + SBC A,A ; result #00 or #FF + AND #0F ; mask off right hand side LD C,A ; store part in C RR B ; rotate bit 1/3 of original chr to carry - SBC A,A ; result $00 or $FF - AND $F0 ; mask off left hand side + SBC A,A ; result #00 or #FF + AND #F0 ; mask off left hand side OR C ; combine with stored pattern - LD C,$04 ; four bytes for top/bottom half + LD C,#04 ; four bytes for top/bottom half ;; PO-GR-3 L0B4C: LD (HL),A ; store bit patterns in temporary buffer @@ -3325,9 +3325,9 @@ L0B4C: LD (HL),A ; store bit patterns in temporary buffer L0B52: JP L3B9F ;Spectrum 128 patch NOP -L0B56: ADD A,$15 ; add 21d to restore to 0 - 20 +L0B56: ADD A,#15 ; add 21d to restore to 0 - 20 PUSH BC ; save current print position - LD BC,($5C7B) ; fetch UDG to address bit patterns + LD BC,(#5C7B) ; fetch UDG to address bit patterns JR L0B6A ; to PO-CHAR-2 - common code to lay down ; a bit patterned character @@ -3343,21 +3343,21 @@ L0B5F: CALL L0C10 ; routine PO-TOKENS prints tokens ;; PO-CHAR L0B65: PUSH BC ; save print position - LD BC,($5C36) ; address CHARS + LD BC,(#5C36) ; address CHARS ; This common code is used to transfer the character bytes to memory. ;; PO-CHAR-2 L0B6A: EX DE,HL ; transfer destination address to DE - LD HL,$5C3B ; point to FLAGS + LD HL,#5C3B ; point to FLAGS RES 0,(HL) ; allow for leading space - CP $20 ; is it a space ? + CP #20 ; is it a space ? JR NZ,L0B76 ; to PO-CHAR-3 if not SET 0,(HL) ; signal no leading space to FLAGS ;; PO-CHAR-3 -L0B76: LD H,$00 ; set high byte to 0 +L0B76: LD H,#00 ; set high byte to 0 LD L,A ; character to A ; 0-21 UDG or 32-127 ASCII. ADD HL,HL ; multiply @@ -3379,18 +3379,18 @@ L0B76: LD H,$00 ; set high byte to 0 ;; PR-ALL L0B7F: LD A,C ; column to A DEC A ; move right - LD A,$21 ; pre-load with leftmost position + LD A,#21 ; pre-load with leftmost position JR NZ,L0B93 ; but if not zero to PR-ALL-1 DEC B ; down one line - LD C,A ; load C with $21 - BIT 1,(IY+$01) ; test FLAGS - Is printer in use + LD C,A ; load C with #21 + BIT 1,(IY+#01) ; test FLAGS - Is printer in use JR Z,L0B93 ; to PR-ALL-1 if not PUSH DE ; save source address CALL L0ECD ; routine COPY-BUFF outputs line to printer POP DE ; restore character source address - LD A,C ; the new column number ($21) to C + LD A,C ; the new column number (#21) to C ;; PR-ALL-1 L0B93: CP C ; this test is really for screen - new line ? @@ -3401,8 +3401,8 @@ L0B93: CP C ; this test is really for screen - new line ? POP DE ; restore source PUSH BC ; save line/column PUSH HL ; and destination - LD A,($5C91) ; fetch P_FLAG to accumulator - LD B,$FF ; prepare OVER mask in B. + LD A,(#5C91) ; fetch P_FLAG to accumulator + LD B,#FF ; prepare OVER mask in B. RRA ; bit 0 set if OVER 1 JR C,L0BA4 ; to PR-ALL-2 @@ -3413,12 +3413,12 @@ L0BA4: RRA ; skip bit 1 of P_FLAG RRA ; bit 2 is INVERSE SBC A,A ; will be FF for INVERSE 1 else zero LD C,A ; transfer INVERSE mask to C - LD A,$08 ; prepare to count 8 bytes + LD A,#08 ; prepare to count 8 bytes AND A ; clear carry to signal screen - BIT 1,(IY+$01) ; test FLAGS - is printer in use ? + BIT 1,(IY+#01) ; test FLAGS - is printer in use ? JR Z,L0BB6 ; to PR-ALL-3 if screen - SET 1,(IY+$30) ; update FLAGS2 - signal printer buffer has + SET 1,(IY+#30) ; update FLAGS2 - signal printer buffer has ; been used. SCF ; set carry flag to signal printer. @@ -3444,7 +3444,7 @@ L0BC1: INC HL ; address next character byte EX DE,HL ; destination to HL DEC H ; bring back to last updated screen position - BIT 1,(IY+$01) ; test FLAGS - is printer in use ? + BIT 1,(IY+#01) ; test FLAGS - is printer in use ? CALL Z,L0BDB ; if not, call routine PO-ATTR to update ; corresponding colour attribute. POP HL ; restore original screen/printer position @@ -3461,7 +3461,7 @@ L0BC1: INC HL ; address next character byte ;; PR-ALL-6 L0BD3: EX AF,AF' ; save the flag - LD A,$20 ; load A with 32 decimal + LD A,#20 ; load A with 32 decimal ADD A,E ; add this to E LD E,A ; and store result in E EX AF,AF' ; fetch the flag @@ -3477,36 +3477,36 @@ L0BD3: EX AF,AF' ; save the flag ; to manipulate H to form the correct colour attribute address. ;; PO-ATTR -L0BDB: LD A,H ; fetch high byte $40 - $57 +L0BDB: LD A,H ; fetch high byte #40 - #57 RRCA ; shift RRCA ; bits 3 and 4 RRCA ; to right. - AND $03 ; range is now 0 - 2 - OR $58 ; form correct high byte for third of screen + AND #03 ; range is now 0 - 2 + OR #58 ; form correct high byte for third of screen LD H,A ; HL is now correct - LD DE,($5C8F) ; make D hold ATTR_T, E hold MASK-T + LD DE,(#5C8F) ; make D hold ATTR_T, E hold MASK-T LD A,(HL) ; fetch existing attribute XOR E ; apply masks AND D ; XOR E ; - BIT 6,(IY+$57) ; test P_FLAG - is this PAPER 9 ?? + BIT 6,(IY+#57) ; test P_FLAG - is this PAPER 9 ?? JR Z,L0BFA ; skip to PO-ATTR-1 if not. - AND $C7 ; set paper + AND #C7 ; set paper BIT 2,A ; to contrast with ink JR NZ,L0BFA ; skip to PO-ATTR-1 - XOR $38 ; + XOR #38 ; ;; PO-ATTR-1 -L0BFA: BIT 4,(IY+$57) ; test P_FLAG - Is this INK 9 ?? +L0BFA: BIT 4,(IY+#57) ; test P_FLAG - Is this INK 9 ?? JR Z,L0C08 ; skip to PO-ATTR-2 if not - AND $F8 ; make ink + AND #F8 ; make ink BIT 5,A ; contrast with paper. JR NZ,L0C08 ; to PO-ATTR-2 - XOR $07 ; + XOR #07 ; ;; PO-ATTR-2 L0C08: LD (HL),A ; save the new attribute. @@ -3523,7 +3523,7 @@ L0C08: LD (HL),A ; save the new attribute. ;; PO-MSG L0C0A: PUSH HL ; put hi-byte zero on stack to suppress - LD H,$00 ; trailing spaces + LD H,#00 ; trailing spaces EX (SP),HL ; ld h,0; push hl would have done ?. JR L0C14 ; forward to PO-TABLE. @@ -3542,14 +3542,14 @@ L0C14: CALL L0C41 ; routine PO-SEARCH will set carry for L0C17: JR C,L0C22 ; forward to PO-EACH if not a command, ; '<>' etc. - LD A,$20 ; prepare leading space - BIT 0,(IY+$01) ; test FLAGS - leading space if not set + LD A,#20 ; prepare leading space + BIT 0,(IY+#01) ; test FLAGS - leading space if not set CALL Z,L0C3B ; routine PO-SAVE to print a space ; without disturbing registers ;; PO-EACH L0C22: LD A,(DE) ; fetch character - AND $7F ; remove any inverted bit + AND #7F ; remove any inverted bit CALL L0C3B ; routine PO-SAVE to print using alternate ; set of registers. LD A,(DE) ; re-fetch character. @@ -3559,26 +3559,26 @@ L0C22: LD A,(DE) ; fetch character JR NC,L0C22 ; back to PO-EACH if not POP DE ; * re-fetch trailing space flag to D (was A) - CP $48 ; was last character '$' ($24*2) + CP #48 ; was last character '$' (#24*2) JR Z,L0C35 ; forward to PO-TR-SP to consider trailing ; space if so. - CP $82 ; was it < 'A' i.e. '#','>','=' from tokens + CP #82 ; was it < 'A' i.e. '#','>','=' from tokens ; or ' ','.' (from tape) or '?' from scroll RET C ; no trailing space ;; PO-TR-SP L0C35: LD A,D ; the trailing space flag (zero if an error msg) - CP $03 ; test against RND, INKEY$ and PI + CP #03 ; test against RND, INKEY$ and PI ; which have no parameters and RET C ; therefore no trailing space so return. - LD A,$20 ; else continue and print a trailing space. + LD A,#20 ; else continue and print a trailing space. ; ------------------------- ; Handle recursive printing ; ------------------------- -; This routine which is part of PRINT-OUT allows RST $10 to be +; This routine which is part of PRINT-OUT allows RST #10 to be ; used recursively to print tokens and the spaces associated with them. ;; PO-SAVE @@ -3612,11 +3612,11 @@ L0C44: BIT 7,(HL) ; is character inverted ? EX DE,HL ; transfer address to DE POP AF ; restore message/token number - CP $20 ; return with carry set + CP #20 ; return with carry set RET C ; for all messages and function tokens LD A,(DE) ; test first character of token - SUB $41 ; and return with carry set + SUB #41 ; and return with carry set RET ; if it is less that 'A' ; i.e. '<>', '<=', '>=' @@ -3630,34 +3630,34 @@ L0C44: BIT 7,(HL) ; is character inverted ? ; The B register holds the current line. ;; PO-SCR -L0C55: BIT 1,(IY+$01) ; test FLAGS - is printer in use ? +L0C55: BIT 1,(IY+#01) ; test FLAGS - is printer in use ? RET NZ ; return immediately if so. LD DE,L0DD9 ; set DE to address: CL-SET PUSH DE ; and push for return address. LD A,B ; transfer the line to A. - BIT 0,(IY+$02) ; test TV_FLAG - Lower screen in use ? + BIT 0,(IY+#02) ; test TV_FLAG - Lower screen in use ? JP NZ,L0D02 ; jump forward to PO-SCR-4 if so. - CP (IY+$31) ; greater than DF_SZ display file size ? + CP (IY+#31) ; greater than DF_SZ display file size ? JR C,L0C86 ; forward to REPORT-5 if less. ; 'Out of screen' RET NZ ; return (via CL-SET) if greater - BIT 4,(IY+$02) ; test TV_FLAG - Automatic listing ? + BIT 4,(IY+#02) ; test TV_FLAG - Automatic listing ? JR Z,L0C88 ; forward to PO-SCR-2 if not. - LD E,(IY+$2D) ; fetch BREG - the count of scroll lines to E. + LD E,(IY+#2D) ; fetch BREG - the count of scroll lines to E. DEC E ; decrease and jump JR Z,L0CD2 ; to PO-SCR-3 if zero and scrolling required. - LD A,$00 ; explicit - select channel zero. + LD A,#00 ; explicit - select channel zero. CALL L1601 ; routine CHAN-OPEN opens it. - LD SP,($5C3F) ; set stack pointer to LIST_SP + LD SP,(#5C3F) ; set stack pointer to LIST_SP - RES 4,(IY+$02) ; reset TV_FLAG - signal auto listing finished. + RES 4,(IY+#02) ; reset TV_FLAG - signal auto listing finished. RET ; return ignoring pushed value, CL-SET ; to MAIN or EDITOR without updating ; print position -> @@ -3667,33 +3667,33 @@ L0C55: BIT 1,(IY+$01) ; test FLAGS - is printer in use ? ;; REPORT-5 L0C86: RST 08H ; ERROR-1 - DEFB $04 ; Error Report: Out of screen + DEFB #04 ; Error Report: Out of screen ; continue here if not an automatic listing. ;; PO-SCR-2 -L0C88: DEC (IY+$52) ; decrease SCR_CT +L0C88: DEC (IY+#52) ; decrease SCR_CT JR NZ,L0CD2 ; forward to PO-SCR-3 to scroll display if ; result not zero. ; now produce prompt. - LD A,$18 ; reset + LD A,#18 ; reset SUB B ; the - LD ($5C8C),A ; SCR_CT scroll count - LD HL,($5C8F) ; L=ATTR_T, H=MASK_T + LD (#5C8C),A ; SCR_CT scroll count + LD HL,(#5C8F) ; L=ATTR_T, H=MASK_T PUSH HL ; save on stack - LD A,($5C91) ; P_FLAG + LD A,(#5C91) ; P_FLAG PUSH AF ; save on stack to prevent lower screen ; attributes (BORDCR etc.) being applied. - LD A,$FD ; select system channel 'K' + LD A,#FD ; select system channel 'K' CALL L1601 ; routine CHAN-OPEN opens it XOR A ; clear to address message directly LD DE,L0CF8 ; make DE address: scrl-mssg CALL L0C0A ; routine PO-MSG prints to lower screen - SET 5,(IY+$02) ; set TV_FLAG - signal lower screen requires + SET 5,(IY+#02) ; set TV_FLAG - signal lower screen requires ; clearing - LD HL,$5C3B ; make HL address FLAGS + LD HL,#5C3B ; make HL address FLAGS SET 3,(HL) ; signal 'L' mode. RES 5,(HL) ; signal 'no new key'. EXX ; switch to main set. @@ -3704,30 +3704,30 @@ L0C88: DEC (IY+$52) ; decrease SCR_CT ; choices available, it is however the best. EXX ; switch back to alternate set. - CP $20 ; space is considered as BREAK + CP #20 ; space is considered as BREAK JR Z,L0D00 ; forward to REPORT-D if so ; 'BREAK - CONT repeats' - CP $E2 ; is character 'STOP' ? + CP #E2 ; is character 'STOP' ? JR Z,L0D00 ; forward to REPORT-D if so - OR $20 ; convert to lower-case - CP $6E ; is character 'n' ? + OR #20 ; convert to lower-case + CP #6E ; is character 'n' ? JR Z,L0D00 ; forward to REPORT-D if so else scroll. - LD A,$FE ; select system channel 'S' + LD A,#FE ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN POP AF ; restore original P_FLAG - LD ($5C91),A ; and save in P_FLAG. + LD (#5C91),A ; and save in P_FLAG. POP HL ; restore original ATTR_T, MASK_T - LD ($5C8F),HL ; and reset ATTR_T, MASK-T as 'scroll?' has + LD (#5C8F),HL ; and reset ATTR_T, MASK-T as 'scroll?' has ; been printed. ;; PO-SCR-3 L0CD2: CALL L0DFE ; routine CL-SC-ALL to scroll whole display - LD B,(IY+$31) ; fetch DF_SZ to B + LD B,(IY+#31) ; fetch DF_SZ to B INC B ; increase to address last line of display - LD C,$21 ; set C to $21 (was $21 from above routine) + LD C,#21 ; set C to #21 (was #21 from above routine) PUSH BC ; save the line and column in BC. CALL L0E9B ; routine CL-ADDR finds display address. @@ -3736,14 +3736,14 @@ L0CD2: CALL L0DFE ; routine CL-SC-ALL to scroll whole display RRCA ; (this code sequence is used twice RRCA ; elsewhere and is a candidate for RRCA ; a subroutine.) - AND $03 ; - OR $58 ; + AND #03 ; + OR #58 ; LD H,A ; - LD DE,$5AE0 ; start of last 'line' of attribute area + LD DE,#5AE0 ; start of last 'line' of attribute area LD A,(DE) ; get attribute for last line LD C,(HL) ; transfer to base line of upper part - LD B,$20 ; there are thirty two bytes + LD B,#20 ; there are thirty two bytes EX DE,HL ; swap the pointers. ;; PO-SCR-3A @@ -3762,31 +3762,31 @@ L0CF0: LD (DE),A ; transfer ; The message 'scroll?' appears here with last byte inverted. ;; scrl-mssg -L0CF8: DEFB $80 ; initial step-over byte. +L0CF8: DEFB #80 ; initial step-over byte. DEFM "scroll" - DEFB '?'+$80 + DEFB '?'+#80 ;; REPORT-D L0D00: RST 08H ; ERROR-1 - DEFB $0C ; Error Report: BREAK - CONT repeats + DEFB #0C ; Error Report: BREAK - CONT repeats ; continue here if using lower display - A holds line number. ;; PO-SCR-4 -L0D02: CP $02 ; is line number less than 2 ? +L0D02: CP #02 ; is line number less than 2 ? JR C,L0C86 ; to REPORT-5 if so ; 'Out of Screen'. - ADD A,(IY+$31) ; add DF_SZ - SUB $19 ; + ADD A,(IY+#31) ; add DF_SZ + SUB #19 ; RET NC ; return if scrolling unnecessary NEG ; Negate to give number of scrolls required. PUSH BC ; save line/column LD B,A ; count to B - LD HL,($5C8F) ; fetch current ATTR_T, MASK_T to HL. + LD HL,(#5C8F) ; fetch current ATTR_T, MASK_T to HL. PUSH HL ; and save - LD HL,($5C91) ; fetch P_FLAG + LD HL,(#5C91) ; fetch P_FLAG PUSH HL ; and save. ; to prevent corruption by input AT @@ -3795,18 +3795,18 @@ L0D02: CP $02 ; is line number less than 2 ? ;; PO-SCR-4A L0D1C: PUSH AF ; save scroll number. - LD HL,$5C6B ; address DF_SZ + LD HL,#5C6B ; address DF_SZ LD B,(HL) ; fetch old value LD A,B ; transfer to A INC A ; and increment LD (HL),A ; then put back. - LD HL,$5C89 ; address S_POSN_hi - line + LD HL,#5C89 ; address S_POSN_hi - line CP (HL) ; compare JR C,L0D2D ; forward to PO-SCR-4B if scrolling required INC (HL) ; else increment S_POSN_hi - LD B,$18 ; set count to whole display ?? - ; Note. should be $17 and the top line + LD B,#18 ; set count to whole display ?? + ; Note. should be #17 and the top line ; will be scrolled into the ROM which ; is harmless on the standard set up. @@ -3817,16 +3817,16 @@ L0D2D: CALL L0E00 ; routine CL-SCROLL scrolls B lines JR NZ,L0D1C ; back to to PO-SCR-4A until done POP HL ; restore original P_FLAG. - LD (IY+$57),L ; and overwrite system variable P_FLAG. + LD (IY+#57),L ; and overwrite system variable P_FLAG. POP HL ; restore original ATTR_T/MASK_T. - LD ($5C8F),HL ; and update system variables. + LD (#5C8F),HL ; and update system variables. - LD BC,($5C88) ; fetch S_POSN to BC. - RES 0,(IY+$02) ; signal to TV_FLAG - main screen in use. + LD BC,(#5C88) ; fetch S_POSN to BC. + RES 0,(IY+#02) ; signal to TV_FLAG - main screen in use. CALL L0DD9 ; call routine CL-SET for upper display. - SET 0,(IY+$02) ; signal to TV_FLAG - lower screen in use. + SET 0,(IY+#02) ; signal to TV_FLAG - lower screen in use. POP BC ; restore line/column RET ; return via CL-SET for lower display. @@ -3838,20 +3838,20 @@ L0D2D: CALL L0E00 ; routine CL-SCROLL scrolls B lines ;; TEMPS L0D4D: XOR A ; clear the accumulator - LD HL,($5C8D) ; fetch L=ATTR_P and H=MASK_P - BIT 0,(IY+$02) ; test TV_FLAG - is lower screen in use ? + LD HL,(#5C8D) ; fetch L=ATTR_P and H=MASK_P + BIT 0,(IY+#02) ; test TV_FLAG - is lower screen in use ? JR Z,L0D5B ; skip to TEMPS-1 if not LD H,A ; set H, MASK P, to 00000000. - LD L,(IY+$0E) ; fetch BORDCR to L which is used for lower + LD L,(IY+#0E) ; fetch BORDCR to L which is used for lower ; screen. ;; TEMPS-1 -L0D5B: LD ($5C8F),HL ; transfer values to ATTR_T and MASK_T +L0D5B: LD (#5C8F),HL ; transfer values to ATTR_T and MASK_T ; for the print flag the permanent values are odd bits, temporary even bits. - LD HL,$5C91 ; address P_FLAG. + LD HL,#5C91 ; address P_FLAG. JR NZ,L0D65 ; skip to TEMPS-2 if lower screen using A=0. LD A,(HL) ; else pick up flag bits. @@ -3859,7 +3859,7 @@ L0D5B: LD ($5C8F),HL ; transfer values to ATTR_T and MASK_T ;; TEMPS-2 L0D65: XOR (HL) ; - AND $55 ; BIN 01010101 + AND #55 ; BIN 01010101 XOR (HL) ; permanent now as original LD (HL),A ; apply permanent bits to temporary bits. RET ; and return. @@ -3878,24 +3878,24 @@ L0D6B: CALL L0DAF ; routine CL-ALL clears display and ; this routine called from INPUT, ** ;; CLS-LOWER -L0D6E: LD HL,$5C3C ; address System Variable TV_FLAG. +L0D6E: LD HL,#5C3C ; address System Variable TV_FLAG. RES 5,(HL) ; TV_FLAG - signal do not clear lower screen. SET 0,(HL) ; TV_FLAG - signal lower screen in use. CALL L0D4D ; routine TEMPS picks up temporary colours. - LD B,(IY+$31) ; fetch lower screen DF_SZ + LD B,(IY+#31) ; fetch lower screen DF_SZ CALL L0E44 ; routine CL-LINE clears lower part ; and sets permanent attributes. - LD HL,$5AC0 ; fetch attribute address leftmost cell, + LD HL,#5AC0 ; fetch attribute address leftmost cell, ; second line up. - LD A,($5C8D) ; fetch permanent attribute from ATTR_P. + LD A,(#5C8D) ; fetch permanent attribute from ATTR_P. DEC B ; decrement lower screen display file size JR L0D8E ; forward to CLS-3 -> ; --- ;; CLS-1 -L0D87: LD C,$20 ; set counter to 32 characters per line +L0D87: LD C,#20 ; set counter to 32 characters per line ;; CLS-2 L0D89: DEC HL ; decrease attribute address. @@ -3907,15 +3907,15 @@ L0D89: DEC HL ; decrease attribute address. L0D8E: DJNZ L0D87 ; decrease B counter and back to CLS-1 ; if not zero. - LD (IY+$31),$02 ; set DF_SZ lower screen to 2 + LD (IY+#31),#02 ; set DF_SZ lower screen to 2 ; This entry point is called from CL-ALL below to ; reset the system channel input and output addresses to normal. ;; CL-CHAN -L0D94: LD A,$FD ; select system channel 'K' +L0D94: LD A,#FD ; select system channel 'K' CALL L1601 ; routine CHAN-OPEN opens it. - LD HL,($5C51) ; fetch CURCHL to HL to address current channel + LD HL,(#5C51) ; fetch CURCHL to HL to address current channel LD DE,L09F4 ; set address to PRINT-OUT for first pass. AND A ; clear carry for first pass. @@ -3929,7 +3929,7 @@ L0DA0: LD (HL),E ; insert output address first pass. JR C,L0DA0 ; back to CL-CHAN-A if first pass else done. - LD BC,$1721 ; line 23 for lower screen + LD BC,#1721 ; line 23 for lower screen JR L0DD9 ; exit via CL-SET to set column ; for lower display @@ -3941,29 +3941,29 @@ L0DA0: LD (HL),E ; insert output address first pass. ; and system channels. ;; CL-ALL -L0DAF: LD HL,$0000 ; initialize plot coordinates. - LD ($5C7D),HL ; set COORDS to 0,0. - RES 0,(IY+$30) ; update FLAGS2 - signal main screen is clear. +L0DAF: LD HL,#0000 ; initialize plot coordinates. + LD (#5C7D),HL ; set COORDS to 0,0. + RES 0,(IY+#30) ; update FLAGS2 - signal main screen is clear. CALL L0D94 ; routine CL-CHAN makes channel 'K' 'normal'. - LD A,$FE ; select system channel 'S' + LD A,#FE ; select system channel 'S' CALL L1601 ; routine CHAN-OPEN opens it CALL L0D4D ; routine TEMPS picks up permanent values. - LD B,$18 ; There are 24 lines. + LD B,#18 ; There are 24 lines. CALL L0E44 ; routine CL-LINE clears 24 text lines - ; (and sets BC to $1821) + ; (and sets BC to #1821) - LD HL,($5C51) ; fetch CURCHL make HL address current + LD HL,(#5C51) ; fetch CURCHL make HL address current ; channel 'S' LD DE,L09F4 ; address: PRINT-OUT LD (HL),E ; is made INC HL ; the normal LD (HL),D ; output address. - LD (IY+$52),$01 ; set SCR_CT - scroll count is set to default. - ; Note. BC already contains $1821. - LD BC,$1821 ; reset column and line to 0,0 + LD (IY+#52),#01 ; set SCR_CT - scroll count is set to default. + ; Note. BC already contains #1821. + LD BC,#1821 ; reset column and line to 0,0 ; and continue into CL-SET, below, exiting ; via PO-STORE (for upper screen). @@ -3975,16 +3975,16 @@ L0DAF: LD HL,$0000 ; initialize plot coordinates. ; or the column for printer. ;; CL-SET -L0DD9: LD HL,$5B00 ; the base address of printer buffer - BIT 1,(IY+$01) ; test FLAGS - is printer in use ? +L0DD9: LD HL,#5B00 ; the base address of printer buffer + BIT 1,(IY+#01) ; test FLAGS - is printer in use ? JR NZ,L0DF4 ; forward to CL-SET-2 if so. LD A,B ; transfer line to A. - BIT 0,(IY+$02) ; test TV_FLAG - lower screen in use ? + BIT 0,(IY+#02) ; test TV_FLAG - lower screen in use ? JR Z,L0DEE ; skip to CL-SET-1 if handling upper part - ADD A,(IY+$31) ; add DF_SZ for lower screen - SUB $18 ; and adjust. + ADD A,(IY+#31) ; add DF_SZ for lower screen + SUB #18 ; and adjust. ;; CL-SET-1 L0DEE: PUSH BC ; save the line/column. @@ -3996,10 +3996,10 @@ L0DEE: PUSH BC ; save the line/column. POP BC ; restore the line/column. ;; CL-SET-2 -L0DF4: LD A,$21 ; the column $1-$21 is reversed - SUB C ; to range $00 - $20 +L0DF4: LD A,#21 ; the column #1-#21 is reversed + SUB C ; to range #00 - #20 LD E,A ; now transfer to DE - LD D,$00 ; prepare for addition + LD D,#00 ; prepare for addition ADD HL,DE ; and add to base address JP L0ADC ; exit via PO-STORE to update relevant ; system variables. @@ -4010,51 +4010,51 @@ L0DF4: LD A,$21 ; the column $1-$21 is reversed ; and from the routine CL-SCROLL, once, to scroll part of the display. ;; CL-SC-ALL -L0DFE: LD B,$17 ; scroll 23 lines, after 'scroll?'. +L0DFE: LD B,#17 ; scroll 23 lines, after 'scroll?'. ;; CL-SCROLL L0E00: CALL L0E9B ; routine CL-ADDR gets screen address in HL. - LD C,$08 ; there are 8 pixel lines to scroll. + LD C,#08 ; there are 8 pixel lines to scroll. ;; CL-SCR-1 L0E05: PUSH BC ; save counters. PUSH HL ; and initial address. LD A,B ; get line count. - AND $07 ; will set zero if all third to be scrolled. + AND #07 ; will set zero if all third to be scrolled. LD A,B ; re-fetch the line count. JR NZ,L0E19 ; forward to CL-SCR-3 if partial scroll. ; HL points to top line of third and must be copied to bottom of previous 3rd. -; ( so HL = $4800 or $5000 ) ( but also sometimes $4000 ) +; ( so HL = #4800 or #5000 ) ( but also sometimes #4000 ) ;; CL-SCR-2 L0E0D: EX DE,HL ; copy HL to DE. - LD HL,$F8E0 ; subtract $08 from H and add $E0 to L - + LD HL,#F8E0 ; subtract #08 from H and add #E0 to L - ADD HL,DE ; to make destination bottom line of previous ; third. EX DE,HL ; restore the source and destination. - LD BC,$0020 ; thirty-two bytes are to be copied. + LD BC,#0020 ; thirty-two bytes are to be copied. DEC A ; decrement the line count. LDIR ; copy a pixel line to previous third. ;; CL-SCR-3 L0E19: EX DE,HL ; save source in DE. - LD HL,$FFE0 ; load the value -32. + LD HL,#FFE0 ; load the value -32. ADD HL,DE ; add to form destination in HL. EX DE,HL ; switch source and destination LD B,A ; save the count in B. - AND $07 ; mask to find count applicable to current + AND #07 ; mask to find count applicable to current RRCA ; third and RRCA ; multiply by RRCA ; thirty two (same as 5 RLCAs) - LD C,A ; transfer byte count to C ($E0 at most) + LD C,A ; transfer byte count to C (#E0 at most) LD A,B ; store line count to A - LD B,$00 ; make B zero + LD B,#00 ; make B zero LDIR ; copy bytes (BC=0, H incremented, L=0) - LD B,$07 ; set B to 7, C is zero. + LD B,#07 ; set B to 7, C is zero. ADD HL,BC ; add 7 to H to address next third. - AND $F8 ; has last third been done ? + AND #F8 ; has last third been done ? JR NZ,L0E0D ; back to CL-SCR-2 if not POP HL ; restore topmost address. @@ -4065,11 +4065,11 @@ L0E19: EX DE,HL ; save source in DE. CALL L0E88 ; routine CL-ATTR gets address in attributes ; from current 'ninth line', count in BC. - LD HL,$FFE0 ; set HL to the 16-bit value -32. + LD HL,#FFE0 ; set HL to the 16-bit value -32. ADD HL,DE ; and add to form destination address. EX DE,HL ; swap source and destination addresses. LDIR ; copy bytes scrolling the linear attributes. - LD B,$01 ; continue to clear the bottom line. + LD B,#01 ; continue to clear the bottom line. ; --------------------------- ; Clear text lines of display @@ -4081,7 +4081,7 @@ L0E19: EX DE,HL ; save source in DE. ;; CL-LINE L0E44: PUSH BC ; save line count CALL L0E9B ; routine CL-ADDR gets top address - LD C,$08 ; there are eight screen lines to a text line. + LD C,#08 ; there are eight screen lines to a text line. ;; CL-LINE-1 L0E4A: PUSH BC ; save pixel line count @@ -4089,23 +4089,23 @@ L0E4A: PUSH BC ; save pixel line count LD A,B ; transfer the line to A (1-24). ;; CL-LINE-2 -L0E4D: AND $07 ; mask 0-7 to consider thirds at a time +L0E4D: AND #07 ; mask 0-7 to consider thirds at a time RRCA ; multiply RRCA ; by 32 (same as five RLCA instructions) RRCA ; now 32 - 256(0) LD C,A ; store result in C LD A,B ; save line in A (1-24) - LD B,$00 ; set high byte to 0, prepare for ldir. + LD B,#00 ; set high byte to 0, prepare for ldir. DEC C ; decrement count 31-255. LD D,H ; copy HL LD E,L ; to DE. - LD (HL),$00 ; blank the first byte. + LD (HL),#00 ; blank the first byte. INC DE ; make DE point to next byte. LDIR ; ldir will clear lines. - LD DE,$0701 ; now address next third adjusting + LD DE,#0701 ; now address next third adjusting ADD HL,DE ; register E to address left hand side DEC A ; decrease the line count. - AND $F8 ; will be 16, 8 or 0 (AND $18 will do). + AND #F8 ; will be 16, 8 or 0 (AND #18 will do). LD B,A ; transfer count to B. JR NZ,L0E4D ; back to CL-LINE-2 if 16 or 8 to do ; the next third. @@ -4123,18 +4123,18 @@ L0E4D: AND $07 ; mask 0-7 to consider thirds at a time INC DE ; make DE point to next location. - LD A,($5C8D) ; fetch ATTR_P - permanent attributes - BIT 0,(IY+$02) ; test TV_FLAG - lower screen in use ? + LD A,(#5C8D) ; fetch ATTR_P - permanent attributes + BIT 0,(IY+#02) ; test TV_FLAG - lower screen in use ? JR Z,L0E80 ; skip to CL-LINE-3 if not. - LD A,($5C48) ; else lower screen uses BORDCR as attribute. + LD A,(#5C48) ; else lower screen uses BORDCR as attribute. ;; CL-LINE-3 L0E80: LD (HL),A ; put attribute in first byte. DEC BC ; decrement the counter. LDIR ; copy bytes to set all attributes. - POP BC ; restore the line $01-$24. - LD C,$21 ; make column $21. (No use is made of this) + POP BC ; restore the line #01-#24. + LD C,#21 ; make column #21. (No use is made of this) RET ; return to the calling routine. ; ------------------ @@ -4149,12 +4149,12 @@ L0E80: LD (HL),A ; put attribute in first byte. ; to manipulate H to form the correct colour attribute address. ;; CL-ATTR -L0E88: LD A,H ; fetch H to A - $48, $50, or $58. +L0E88: LD A,H ; fetch H to A - #48, #50, or #58. RRCA ; divide by RRCA ; eight. - RRCA ; $09, $0A or $0B. - DEC A ; $08, $09 or $0A. - OR $50 ; $58, $59 or $5A. + RRCA ; #09, #0A or #0B. + DEC A ; #08, #09 or #0A. + OR #50 ; #58, #59 or #5A. LD H,A ; save high byte of attributes. EX DE,HL ; transfer attribute address to DE @@ -4178,21 +4178,21 @@ L0E88: LD A,H ; fetch H to A - $48, $50, or $58. ; of the start of a screen character line which is supplied in B. ;; CL-ADDR -L0E9B: LD A,$18 ; reverse the line number - SUB B ; to range $00 - $17. +L0E9B: LD A,#18 ; reverse the line number + SUB B ; to range #00 - #17. LD D,A ; save line in D for later. RRCA ; multiply RRCA ; by RRCA ; thirty-two. - AND $E0 ; mask off low bits to make + AND #E0 ; mask off low bits to make LD L,A ; L a multiple of 32. LD A,D ; bring back the line to A. - AND $18 ; now $00, $08 or $10. + AND #18 ; now #00, #08 or #10. - OR $40 ; add the base address of screen. + OR #40 ; add the base address of screen. LD H,A ; HL now has the correct address. RET ; return. @@ -4211,8 +4211,8 @@ L0E9B: LD A,$18 ; reverse the line number L0EAC: DI ; disable interrupts as this is time-critical. - LD B,$B0 ; top 176 lines. -L0EAF: LD HL,$4000 ; address start of the display file. + LD B,#B0 ; top 176 lines. +L0EAF: LD HL,#4000 ; address start of the display file. ; now enter a loop to handle each pixel line. @@ -4226,16 +4226,16 @@ L0EB2: PUSH HL ; save the screen address. POP HL ; and display address. INC H ; next line down screen within 'thirds'. LD A,H ; high byte to A. - AND $07 ; result will be zero if we have left third. + AND #07 ; result will be zero if we have left third. JR NZ,L0EC9 ; forward to COPY-2 if not to continue loop. LD A,L ; consider low byte first. - ADD A,$20 ; increase by 32 - sets carry if back to zero. + ADD A,#20 ; increase by 32 - sets carry if back to zero. LD L,A ; will be next group of 8. CCF ; complement - carry set if more lines in ; the previous third. SBC A,A ; will be FF, if more, else 00. - AND $F8 ; will be F8 (-8) or 00. + AND #F8 ; will be F8 (-8) or 00. ADD A,H ; that is subtract 8, if more to do in third. LD H,A ; and reset address. @@ -4255,8 +4255,8 @@ L0EC9: DJNZ L0EB2 ; back to COPY-1 for all lines. ;; COPY-BUFF L0ECD: DI ; disable interrupts - LD HL,$5B00 ; the base address of the Printer Buffer. - LD B,$08 ; set count to 8 lines of 32 bytes. + LD HL,#5B00 ; the base address of the Printer Buffer. + LD B,#08 ; set count to 8 lines of 32 bytes. ;; COPY-3 L0ED3: PUSH BC ; save counter. @@ -4269,8 +4269,8 @@ L0ED3: PUSH BC ; save counter. ; three instructions. ;; COPY-END -L0EDA: LD A,$04 ; output value 4 to port - OUT ($FB),A ; to stop the slowed printer motor. +L0EDA: LD A,#04 ; output value 4 to port + OUT (#FB),A ; to stop the slowed printer motor. EI ; enable interrupts. ; -------------------- @@ -4290,8 +4290,8 @@ L0EDA: LD A,$04 ; output value 4 to port ; of PR_CC_hi. ;; CLEAR-PRB -L0EDF: LD HL,$5B00 ; the location of the buffer. - LD (IY+$46),L ; update PR_CC_lo - set to zero - superfluous. +L0EDF: LD HL,#5B00 ; the location of the buffer. + LD (IY+#46),L ; update PR_CC_lo - set to zero - superfluous. XOR A ; clear the accumulator. LD B,A ; set count to 256 bytes. @@ -4300,8 +4300,8 @@ L0EE7: LD (HL),A ; set addressed location to zero. INC HL ; address next byte - Note. not INC L. DJNZ L0EE7 ; back to PRB-BYTES. repeat for 256 bytes. - RES 1,(IY+$30) ; set FLAGS2 - signal printer buffer is clear. - LD C,$21 ; set the column position . + RES 1,(IY+#30) ; set FLAGS2 - signal printer buffer is clear. + LD C,#21 ; set the column position . JP L0DD9 ; exit via CL-SET and then PO-STORE. ; ----------------- @@ -4309,7 +4309,7 @@ L0EE7: LD (HL),A ; set addressed location to zero. ; ----------------- ; This routine is called from COPY and COPY-BUFF to output a line of ; 32 bytes to the ZX Printer. -; Output to port $FB - +; Output to port #FB - ; bit 7 set - activate stylus. ; bit 7 low - deactivate stylus. ; bit 2 set - stops printer. @@ -4319,11 +4319,11 @@ L0EE7: LD (HL),A ; set addressed location to zero. ;; COPY-LINE L0EF4: LD A,B ; fetch the counter 1-8 or 1-176 - CP $03 ; is it 01 or 02 ?. - SBC A,A ; result is $FF if so else $00. - AND $02 ; result is 02 now else 00. + CP #03 ; is it 01 or 02 ?. + SBC A,A ; result is #FF if so else #00. + AND #02 ; result is 02 now else 00. ; bit 1 set slows the printer. - OUT ($FB),A ; slow the printer for the + OUT (#FB),A ; slow the printer for the ; last two lines. LD D,A ; save the mask to control the printer later. @@ -4331,18 +4331,18 @@ L0EF4: LD A,B ; fetch the counter 1-8 or 1-176 L0EFD: CALL L1F54 ; call BREAK-KEY to read keyboard immediately. JR C,L0F0C ; forward to COPY-L-2 if 'break' not pressed. - LD A,$04 ; else stop the - OUT ($FB),A ; printer motor. + LD A,#04 ; else stop the + OUT (#FB),A ; printer motor. EI ; enable interrupts. CALL L0EDF ; call routine CLEAR-PRB. ; Note. should not be cleared if COPY in use. ;; REPORT-Dc L0F0A: RST 08H ; ERROR-1 - DEFB $0C ; Error Report: BREAK - CONT repeats + DEFB #0C ; Error Report: BREAK - CONT repeats ;; COPY-L-2 -L0F0C: IN A,($FB) ; test now to see if +L0F0C: IN A,(#FB) ; test now to see if ADD A,A ; a printer is attached. RET M ; return if not - but continue with parent ; command. @@ -4350,12 +4350,12 @@ L0F0C: IN A,($FB) ; test now to see if JR NC,L0EFD ; back to COPY-L-1 if stylus of printer not ; in position. - LD C,$20 ; set count to 32 bytes. + LD C,#20 ; set count to 32 bytes. ;; COPY-L-3 L0F14: LD E,(HL) ; fetch a byte from line. INC HL ; address next location. Note. not INC L. - LD B,$08 ; count the bits. + LD B,#08 ; count the bits. ;; COPY-L-4 L0F18: RL D ; prepare mask to receive bit. @@ -4363,12 +4363,12 @@ L0F18: RL D ; prepare mask to receive bit. RR D ; and back to bit 7 of D restoring bit 1 ;; COPY-L-5 -L0F1E: IN A,($FB) ; read the port. +L0F1E: IN A,(#FB) ; read the port. RRA ; bit 0 to carry. JR NC,L0F1E ; back to COPY-L-5 if stylus not in position. LD A,D ; transfer command bits to A. - OUT ($FB),A ; and output to port. + OUT (#FB),A ; and output to port. DJNZ L0F18 ; loop back to COPY-L-4 for all 8 bits. DEC C ; decrease the byte count. @@ -4388,13 +4388,13 @@ L0F1E: IN A,($FB) ; read the port. ; This is a compact and highly versatile routine. ;; EDITOR -L0F2C: LD HL,($5C3D) ; fetch ERR_SP +L0F2C: LD HL,(#5C3D) ; fetch ERR_SP PUSH HL ; save on stack ;; ED-AGAIN L0F30: LD HL,L107F ; address: ED-ERROR PUSH HL ; save address on stack and - LD ($5C3D),SP ; make ERR_SP point to it. + LD (#5C3D),SP ; make ERR_SP point to it. ; Note. While in editing/input mode should an error occur then RST 08 will ; update X_PTR to the location reached by CH_ADD and jump to ED-ERROR @@ -4407,9 +4407,9 @@ L0F30: LD HL,L107F ; address: ED-ERROR L0F38: CALL L15D4 ; routine WAIT-KEY gets key possibly ; changing the mode. PUSH AF ; save key. - LD D,$00 ; and give a short click based - LD E,(IY-$01) ; on PIP value for duration. - LD HL,$00C8 ; and pitch. + LD D,#00 ; and give a short click based + LD E,(IY-#01) ; on PIP value for duration. + LD HL,#00C8 ; and pitch. CALL L03B5 ; routine BEEPER gives click - effective ; with rubber keyboard. POP AF ; get saved key value. @@ -4420,23 +4420,23 @@ L0F38: CALL L15D4 ; routine WAIT-KEY gets key possibly ; handler and an input stream set up to supply characters. ; The character that has been received can now be processed. - CP $18 ; range 24 to 255 ? + CP #18 ; range 24 to 255 ? JR NC,L0F81 ; forward to ADD-CHAR if so. - CP $07 ; lower than 7 ? + CP #07 ; lower than 7 ? JR C,L0F81 ; forward to ADD-CHAR also. ; Note. This is a 'bug' and chr$ 6, the comma ; control character, should have had an ; entry in the ED-KEYS table. ; Steven Vickers, 1984, Pitman. - CP $10 ; less than 16 ? + CP #10 ; less than 16 ? JR C,L0F92 ; forward to ED-KEYS if editing control ; range 7 to 15 dealt with by a table - LD BC,$0002 ; prepare for ink/paper etc. + LD BC,#0002 ; prepare for ink/paper etc. LD D,A ; save character in D - CP $16 ; is it ink/paper/bright etc. ? + CP #16 ; is it ink/paper/bright etc. ? JR C,L0F6C ; forward to ED-CONTR if so ; leaves 22d AT and 23d TAB @@ -4445,7 +4445,7 @@ L0F38: CALL L15D4 ; routine WAIT-KEY gets key possibly ; when the keyboard is used for input. INC BC ; if it was AT/TAB - 3 locations required - BIT 7,(IY+$37) ; test FLAGX - Is this INPUT LINE ? + BIT 7,(IY+#37) ; test FLAGX - Is this INPUT LINE ? JP Z,L101E ; jump to ED-IGNORE if not, else CALL L15D4 ; routine WAIT-KEY - input address is KEY-NEXT @@ -4457,8 +4457,8 @@ L0F6C: CALL L15D4 ; routine WAIT-KEY for control. ; input address will be key-next. PUSH DE ; saved code/parameters - LD HL,($5C5B) ; fetch address of keyboard cursor from K_CUR - RES 0,(IY+$07) ; set MODE to 'L' + LD HL,(#5C5B) ; fetch address of keyboard cursor from K_CUR + RES 0,(IY+#07) ; set MODE to 'L' CALL L1655 ; routine MAKE-ROOM makes 2/3 spaces at cursor @@ -4478,9 +4478,9 @@ L0F6C: CALL L15D4 ; routine WAIT-KEY for control. ; it is also the OUTPUT service routine for system channel 'R'. ;; ADD-CHAR -L0F81: RES 0,(IY+$07) ; set MODE to 'L' +L0F81: RES 0,(IY+#07) ; set MODE to 'L' -X0F85: LD HL,($5C5B) ; fetch address of keyboard cursor from K_CUR +X0F85: LD HL,(#5C5B) ; fetch address of keyboard cursor from K_CUR CALL L1652 ; routine ONE-SPACE creates one space. ; either a continuation of above or from ED-CONTR with ED-LOOP on stack. @@ -4488,7 +4488,7 @@ X0F85: LD HL,($5C5B) ; fetch address of keyboard cursor from K_CUR ;; ADD-CH-1 L0F8B: LD (DE),A ; load current character to last new location. INC DE ; address next - LD ($5C5B),DE ; and update K_CUR system variable. + LD (#5C5B),DE ; and update K_CUR system variable. RET ; return - either a simple return ; from ADD-CHAR or to ED-LOOP on stack. @@ -4499,33 +4499,33 @@ L0F8B: LD (DE),A ; load current character to last new location. ;; ED-KEYS L0F92: LD E,A ; character to E. - LD D,$00 ; prepare to add. - LD HL,L0FA0 - 7 ; base address of editing keys table. $0F99 + LD D,#00 ; prepare to add. + LD HL,L0FA0 - 7 ; base address of editing keys table. #0F99 ADD HL,DE ; add E LD E,(HL) ; fetch offset to E ADD HL,DE ; add offset for address of handling routine. PUSH HL ; push the address on machine stack. - LD HL,($5C5B) ; load address of cursor from K_CUR. + LD HL,(#5C5B) ; load address of cursor from K_CUR. RET ; an make an indirect jump forward to routine. ; ------------------ ; Editing keys table ; ------------------ -; For each code in the range $07 to $0F this table contains a +; For each code in the range #07 to #0F this table contains a ; single offset byte to the routine that services that code. ; Note. for what was intended there should also have been an ; entry for chr$ 6 with offset to ed-symbol. ;; ed-keys-t -L0FA0: DEFB L0FA9 - $ ; 07d offset $09 to Address: ED-EDIT - DEFB L1007 - $ ; 08d offset $66 to Address: ED-LEFT - DEFB L100C - $ ; 09d offset $6A to Address: ED-RIGHT - DEFB L0FF3 - $ ; 10d offset $50 to Address: ED-DOWN - DEFB L1059 - $ ; 11d offset $B5 to Address: ED-UP - DEFB L1015 - $ ; 12d offset $70 to Address: ED-DELETE - DEFB L1024 - $ ; 13d offset $7E to Address: ED-ENTER - DEFB L1076 - $ ; 14d offset $CF to Address: ED-SYMBOL - DEFB L107C - $ ; 15d offset $D4 to Address: ED-GRAPH +L0FA0: DEFB L0FA9 - $ ; 07d offset #09 to Address: ED-EDIT + DEFB L1007 - $ ; 08d offset #66 to Address: ED-LEFT + DEFB L100C - $ ; 09d offset #6A to Address: ED-RIGHT + DEFB L0FF3 - $ ; 10d offset #50 to Address: ED-DOWN + DEFB L1059 - $ ; 11d offset #B5 to Address: ED-UP + DEFB L1015 - $ ; 12d offset #70 to Address: ED-DELETE + DEFB L1024 - $ ; 13d offset #7E to Address: ED-ENTER + DEFB L1076 - $ ; 14d offset #CF to Address: ED-SYMBOL + DEFB L107C - $ ; 15d offset #D4 to Address: ED-GRAPH ; --------------- ; Handle EDIT key @@ -4535,9 +4535,9 @@ L0FA0: DEFB L0FA9 - $ ; 07d offset $09 to Address: ED-EDIT ; Alternatively ... ;; ED-EDIT -L0FA9: LD HL,($5C49) ; fetch E_PPC the last line number entered. +L0FA9: LD HL,(#5C49) ; fetch E_PPC the last line number entered. ; Note. may not exist and may follow program. - BIT 5,(IY+$37) ; test FLAGX - input mode ? + BIT 5,(IY+#37) ; test FLAGX - input mode ? JP NZ,L1097 ; jump forward to CLEAR-SP if not in editor. CALL L196E ; routine LINE-ADDR to find address of line @@ -4558,22 +4558,22 @@ L0FA9: LD HL,($5C49) ; fetch E_PPC the last line number entered. LD C,(HL) ; transfer to C INC HL ; next to high byte LD B,(HL) ; transfer to B. - LD HL,$000A ; an overhead of ten bytes + LD HL,#000A ; an overhead of ten bytes ADD HL,BC ; is added to length. LD B,H ; transfer adjusted value LD C,L ; to BC register. CALL L1F05 ; routine TEST-ROOM checks free memory. CALL L1097 ; routine CLEAR-SP clears editing area. - LD HL,($5C51) ; address CURCHL + LD HL,(#5C51) ; address CURCHL EX (SP),HL ; swap with line address on stack PUSH HL ; save line address underneath - LD A,$FF ; select system channel 'R' + LD A,#FF ; select system channel 'R' CALL L1601 ; routine CHAN-OPEN opens it POP HL ; drop line address DEC HL ; make it point to first byte of line num. - DEC (IY+$0F) ; decrease E_PPC_lo to suppress line cursor. + DEC (IY+#0F) ; decrease E_PPC_lo to suppress line cursor. ; Note. ineffective when E_PPC is one ; greater than last line of program perhaps ; as a result of a delete. @@ -4581,14 +4581,14 @@ L0FA9: LD HL,($5C49) ; fetch E_PPC the last line number entered. CALL L1855 ; routine OUT-LINE outputs the BASIC line ; to the editing area. - INC (IY+$0F) ; restore E_PPC_lo to the previous value. - LD HL,($5C59) ; address E_LINE in editing area. + INC (IY+#0F) ; restore E_PPC_lo to the previous value. + LD HL,(#5C59) ; address E_LINE in editing area. INC HL ; advance INC HL ; past space INC HL ; and digit characters INC HL ; of line number. - LD ($5C5B),HL ; update K_CUR to address start of BASIC. + LD (#5C5B),HL ; update K_CUR to address start of BASIC. POP HL ; restore the address of CURCHL. CALL L1615 ; routine CHAN-FLAG sets flags for it. RET ; RETURN to ED-LOOP. @@ -4601,10 +4601,10 @@ L0FA9: LD HL,($5C49) ; fetch E_PPC the last line number entered. ; In input mode this key can be used as an alternative to entering STOP. ;; ED-DOWN -L0FF3: BIT 5,(IY+$37) ; test FLAGX - Input Mode ? +L0FF3: BIT 5,(IY+#37) ; test FLAGX - Input Mode ? JR NZ,L1001 ; skip to ED-STOP if so - LD HL,$5C49 ; address E_PPC - 'current line' + LD HL,#5C49 ; address E_PPC - 'current line' CALL L190F ; routine LN-FETCH fetches number of next ; line or same if at end of program. JR L106E ; forward to ED-LIST to produce an @@ -4613,7 +4613,7 @@ L0FF3: BIT 5,(IY+$37) ; test FLAGX - Input Mode ? ; --- ;; ED-STOP -L1001: LD (IY+$00),$10 ; set ERR_NR to 'STOP in INPUT' code +L1001: LD (IY+#00),#10 ; set ERR_NR to 'STOP in INPUT' code JR L1024 ; forward to ED-ENTER to produce error. ; ------------------- @@ -4635,13 +4635,13 @@ L1007: CALL L1031 ; routine ED-EDGE moves left if possible ;; ED-RIGHT L100C: LD A,(HL) ; fetch addressed character. - CP $0D ; is it carriage return ? + CP #0D ; is it carriage return ? RET Z ; return if so to ED-LOOP INC HL ; address next character ;; ED-CUR -L1011: LD ($5C5B),HL ; update K_CUR system variable +L1011: LD (#5C5B),HL ; update K_CUR system variable RET ; return to ED-LOOP ; -------------- @@ -4655,7 +4655,7 @@ L1011: LD ($5C5B),HL ; update K_CUR system variable ;; ED-DELETE L1015: CALL L1031 ; routine ED-EDGE moves cursor to left. - LD BC,$0001 ; of character to be deleted. + LD BC,#0001 ; of character to be deleted. JP L19E8 ; to RECLAIM-2 reclaim the character. ; ------------------------------------------ @@ -4683,8 +4683,8 @@ L1024: POP HL ; discard address ED-LOOP ;; ED-END L1026: POP HL ; the previous value of ERR_SP - LD ($5C3D),HL ; is restored to ERR_SP system variable - BIT 7,(IY+$00) ; is ERR_NR $FF (= 'OK') ? + LD (#5C3D),HL ; is restored to ERR_SP system variable + BIT 7,(IY+#00) ; is ERR_NR #FF (= 'OK') ? RET NZ ; return if so LD SP,HL ; else put error routine on stack @@ -4725,8 +4725,8 @@ L103E: LD H,D ; transfer DE - leftmost pointer INC HL ; address next leftmost character to ; advance position each time. LD A,(DE) ; pick up previous in A - AND $F0 ; lose the low bits - CP $10 ; is it INK to TAB $10-$1F ? + AND #F0 ; lose the low bits + CP #10 ; is it INK to TAB #10-#1F ? ; that is, is it followed by a parameter ? JR NZ,L1051 ; to ED-EDGE-2 if not ; HL has been incremented once @@ -4738,8 +4738,8 @@ L103E: LD H,D ; transfer DE - leftmost pointer ; The test will always fail and the jump to ED-EDGE-2 will be taken. LD A,(DE) ; reload leftmost character - SUB $17 ; decimal 23 ('tab') - ADC A,$00 ; will be 0 for 'tab' and 'at'. + SUB #17 ; decimal 23 ('tab') + ADC A,#00 ; will be 0 for 'tab' and 'at'. JR NZ,L1051 ; forward to ED-EDGE-2 if not ; HL has been incremented twice @@ -4767,14 +4767,14 @@ L1051: AND A ; prepare for true subtraction ; This has no alternative use in input mode. ;; ED-UP -L1059: BIT 5,(IY+$37) ; test FLAGX - input mode ? +L1059: BIT 5,(IY+#37) ; test FLAGX - input mode ? RET NZ ; return if not in editor - to ED-LOOP. - LD HL,($5C49) ; get current line from E_PPC + LD HL,(#5C49) ; get current line from E_PPC CALL L196E ; routine LINE-ADDR gets address EX DE,HL ; and previous in DE CALL L1695 ; routine LINE-NO gets prev line number - LD HL,$5C4A ; set HL to E_PPC_hi as next routine stores + LD HL,#5C4A ; set HL to E_PPC_hi as next routine stores ; top first. CALL L191C ; routine LN-STORE loads DE value to HL ; high byte first - E_PPC_lo takes E @@ -4784,7 +4784,7 @@ L1059: BIT 5,(IY+$37) ; test FLAGX - input mode ? ;; ED-LIST L106E: CALL L1795 ; routine AUTO-LIST lists to upper screen ; including adjusted current line. - LD A,$00 ; select lower screen again + LD A,#00 ; select lower screen again JP L1601 ; exit via CHAN-OPEN to ED-LOOP ; -------------------------------- @@ -4802,11 +4802,11 @@ L106E: CALL L1795 ; routine AUTO-LIST lists to upper screen ; You can get round the missing chr$ 6 handler by sending multiple print ; items separated by a newline '. -; chr$14 would have the same functionality. +; chr#14 would have the same functionality. ; This is chr$ 14. ;; ED-SYMBOL -L1076: BIT 7,(IY+$37) ; test FLAGX - is this INPUT LINE ? +L1076: BIT 7,(IY+#37) ; test FLAGX - is this INPUT LINE ? JR Z,L1024 ; back to ED-ENTER if not to treat as if ; enter had been pressed. ; else continue and add code to buffer. @@ -4824,16 +4824,16 @@ L107C: JP L0F81 ; jump back to ADD-CHAR ; points to the stack location holding address ED_ERROR. ;; ED-ERROR -L107F: BIT 4,(IY+$30) ; test FLAGS2 - is K channel in use ? +L107F: BIT 4,(IY+#30) ; test FLAGS2 - is K channel in use ? JR Z,L1026 ; back to ED-END if not. ; but as long as we're editing lines or inputting from the keyboard, then ; we've run out of memory so give a short rasp. - LD (IY+$00),$FF ; reset ERR_NR to 'OK'. - LD D,$00 ; prepare for beeper. - LD E,(IY-$02) ; use RASP value. - LD HL,$1A90 ; set a duration. + LD (IY+#00),#FF ; reset ERR_NR to 'OK'. + LD D,#00 ; prepare for beeper. + LD E,(IY-#02) ; use RASP value. + LD HL,#1A90 ; set a duration. CALL L03B5 ; routine BEEPER emits a warning rasp. JP L0F30 ; to ED-AGAIN to re-stack address of ; this routine and make ERR_SP point to it. @@ -4855,8 +4855,8 @@ L1097: PUSH HL ; preserve HL ; if in input HL = STKBOT, DE = WORKSP DEC HL ; adjust CALL L19E5 ; routine RECLAIM-1 reclaims space - LD ($5C5B),HL ; set K_CUR to start of empty area - LD (IY+$07),$00 ; set MODE to 'KLC' + LD (#5C5B),HL ; set K_CUR to start of empty area + LD (IY+#07),#00 ; set MODE to 'KLC' POP HL ; restore HL. RET ; return. @@ -4867,41 +4867,41 @@ L1097: PUSH HL ; preserve HL ; channel 'K'. ;; KEY-INPUT -L10A8: BIT 3,(IY+$02) ; test TV_FLAG - has a key been pressed in +L10A8: BIT 3,(IY+#02) ; test TV_FLAG - has a key been pressed in ; editor ? CALL NZ,L111D ; routine ED-COPY if so to reprint the lower ; screen at every keystroke. AND A ; clear carry - required exit condition. - BIT 5,(IY+$01) ; test FLAGS - has a new key been pressed ? + BIT 5,(IY+#01) ; test FLAGS - has a new key been pressed ? RET Z ; return if not. - LD A,($5C08) ; system variable LASTK will hold last key - + LD A,(#5C08) ; system variable LASTK will hold last key - ; from the interrupt routine. - RES 5,(IY+$01) ; update FLAGS - reset the new key flag. + RES 5,(IY+#01) ; update FLAGS - reset the new key flag. PUSH AF ; save the input character. - BIT 5,(IY+$02) ; test TV_FLAG - clear lower screen ? + BIT 5,(IY+#02) ; test TV_FLAG - clear lower screen ? CALL NZ,L0D6E ; routine CLS-LOWER if so. POP AF ; restore the character code. - CP $20 ; if space or higher then + CP #20 ; if space or higher then JR NC,L111B ; forward to KEY-DONE2 and return with carry ; set to signal key-found. - CP $10 ; with 16d INK and higher skip + CP #10 ; with 16d INK and higher skip JR NC,L10FA ; forward to KEY-CONTR. - CP $06 ; for 6 - 15d + CP #06 ; for 6 - 15d JR NC,L10DB ; skip forward to KEY-M-CL to handle Modes ; and CapsLock. ; that only leaves 0-5, the flash bright inverse switches. LD B,A ; save character in B - AND $01 ; isolate the embedded parameter (0/1). + AND #01 ; isolate the embedded parameter (0/1). LD C,A ; and store in C LD A,B ; re-fetch copy (0-5) RRA ; halve it 0, 1 or 2. - ADD A,$12 ; add 18d gives 'flash', 'bright' + ADD A,#12 ; add 18d gives 'flash', 'bright' ; and 'inverse'. JR L1105 ; forward to KEY-DATA with the ; parameter (0/1) in C. @@ -4913,8 +4913,8 @@ L10A8: BIT 3,(IY+$02) ; test TV_FLAG - has a key been pressed in ;; KEY-M-CL L10DB: JR NZ,L10E6 ; forward to KEY-MODE if not 06 (capslock) - LD HL,$5C6A ; point to FLAGS2 - LD A,$08 ; value 00000100 + LD HL,#5C6A ; point to FLAGS2 + LD A,#08 ; value 00000100 XOR (HL) ; toggle BIT 2 of FLAGS2 the capslock bit LD (HL),A ; and store result in FLAGS2 again. JR L10F4 ; forward to KEY-FLAG to signal no-key. @@ -4922,25 +4922,25 @@ L10DB: JR NZ,L10E6 ; forward to KEY-MODE if not 06 (capslock) ; --- ;; KEY-MODE -L10E6: CP $0E ; compare with chr 14d +L10E6: CP #0E ; compare with chr 14d RET C ; return with carry set "key found" for ; codes 7 - 13d leaving 14d and 15d ; which are converted to mode codes. - SUB $0D ; subtract 13d leaving 1 and 2 + SUB #0D ; subtract 13d leaving 1 and 2 ; 1 is 'E' mode, 2 is 'G' mode. - LD HL,$5C41 ; address the MODE system variable. + LD HL,#5C41 ; address the MODE system variable. CP (HL) ; compare with existing value before LD (HL),A ; inserting the new value. JR NZ,L10F4 ; forward to KEY-FLAG if it has changed. - LD (HL),$00 ; else make MODE zero - KLC mode + LD (HL),#00 ; else make MODE zero - KLC mode ; Note. while in Extended/Graphics mode, ; the Extended Mode/Graphics key is pressed ; again to get out. ;; KEY-FLAG -L10F4: SET 3,(IY+$02) ; update TV_FLAG - show key state has changed +L10F4: SET 3,(IY+#02) ; update TV_FLAG - show key state has changed CP A ; clear carry and reset zero flags - ; no actual key returned. RET ; make the return. @@ -4951,9 +4951,9 @@ L10F4: SET 3,(IY+$02) ; update TV_FLAG - show key state has changed ;; KEY-CONTR L10FA: LD B,A ; make a copy of character. - AND $07 ; mask to leave bits 0-7 + AND #07 ; mask to leave bits 0-7 LD C,A ; and store in C. - LD A,$10 ; initialize to 16d - INK. + LD A,#10 ; initialize to 16d - INK. BIT 3,B ; was it paper ? JR NZ,L1105 ; forward to KEY-DATA with INK 16d and ; colour in C. @@ -4961,7 +4961,7 @@ L10FA: LD B,A ; make a copy of character. INC A ; else change from INK to PAPER (17d) if so. ;; KEY-DATA -L1105: LD (IY-$2D),C ; put the colour (0-7)/state(0/1) in KDATA +L1105: LD (IY-#2D),C ; put the colour (0-7)/state(0/1) in KDATA LD DE,L110D ; address: KEY-NEXT will be next input stream JR L1113 ; forward to KEY-CHAN to change it ... @@ -4970,13 +4970,13 @@ L1105: LD (IY-$2D),C ; put the colour (0-7)/state(0/1) in KDATA ; ... so that INPUT_AD directs control to here at next call to WAIT-KEY ;; KEY-NEXT -L110D: LD A,($5C0D) ; pick up the parameter stored in KDATA. +L110D: LD A,(#5C0D) ; pick up the parameter stored in KDATA. LD DE,L10A8 ; address: KEY-INPUT will be next input stream ; continue to restore default channel and ; make a return with the control code. ;; KEY-CHAN -L1113: LD HL,($5C4F) ; address start of CHANNELS area using CHANS +L1113: LD HL,(#5C4F) ; address start of CHANNELS area using CHANS ; system variable. ; Note. One might have expected CURCHL to ; have been used. @@ -5002,19 +5002,19 @@ L111B: SCF ; set carry flag to show a key has been found ;; ED-COPY L111D: CALL L0D4D ; routine TEMPS sets temporary attributes. - RES 3,(IY+$02) ; update TV_FLAG - signal no change in mode - RES 5,(IY+$02) ; update TV_FLAG - signal don't clear lower + RES 3,(IY+#02) ; update TV_FLAG - signal no change in mode + RES 5,(IY+#02) ; update TV_FLAG - signal don't clear lower ; screen. - LD HL,($5C8A) ; fetch SPOSNL + LD HL,(#5C8A) ; fetch SPOSNL PUSH HL ; and save on stack. - LD HL,($5C3D) ; fetch ERR_SP + LD HL,(#5C3D) ; fetch ERR_SP PUSH HL ; and save also LD HL,L1167 ; address: ED-FULL PUSH HL ; is pushed as the error routine - LD ($5C3D),SP ; and ERR_SP made to point to it. + LD (#5C3D),SP ; and ERR_SP made to point to it. - LD HL,($5C82) ; fetch ECHO_E + LD HL,(#5C82) ; fetch ECHO_E PUSH HL ; and push also SCF ; set carry flag to control SET-DE @@ -5030,7 +5030,7 @@ L111D: CALL L0D4D ; routine TEMPS sets temporary attributes. CALL L18E1 ; routine OUT-CURS considers a ; terminating cursor. - LD HL,($5C8A) ; fetch updated SPOSNL + LD HL,(#5C8A) ; fetch updated SPOSNL EX (SP),HL ; exchange with ECHO_E on stack EX DE,HL ; transfer ECHO_E to DE CALL L0D4D ; routine TEMPS to re-set attributes @@ -5040,23 +5040,23 @@ L111D: CALL L0D4D ; routine TEMPS sets temporary attributes. ; text from a previous print may follow this line and requires blanking. ;; ED-BLANK -L1150: LD A,($5C8B) ; fetch SPOSNL_hi is current line +L1150: LD A,(#5C8B) ; fetch SPOSNL_hi is current line SUB D ; compare with old JR C,L117C ; forward to ED-C-DONE if no blanking JR NZ,L115E ; forward to ED-SPACES if line has changed LD A,E ; old column to A - SUB (IY+$50) ; subtract new in SPOSNL_lo + SUB (IY+#50) ; subtract new in SPOSNL_lo JR NC,L117C ; forward to ED-C-DONE if no backfilling. ;; ED-SPACES -L115E: LD A,$20 ; prepare a space. +L115E: LD A,#20 ; prepare a space. PUSH DE ; save old line/column. CALL L09F4 ; routine PRINT-OUT prints a space over ; any text from previous print. ; Note. Since the blanking only occurs when - ; using $09F4 to print to the lower screen, + ; using #09F4 to print to the lower screen, ; there is no need to vector via a RST 10 ; and we can use this alternate set. POP DE ; restore the old line column. @@ -5072,12 +5072,12 @@ L115E: LD A,$20 ; prepare a space. ; that this is perhaps not the best idea you've had that day. ;; ED-FULL -L1167: LD D,$00 ; prepare to moan. - LD E,(IY-$02) ; fetch RASP value. - LD HL,$1A90 ; set duration. +L1167: LD D,#00 ; prepare to moan. + LD E,(IY-#02) ; fetch RASP value. + LD HL,#1A90 ; set duration. CALL L03B5 ; routine BEEPER. - LD (IY+$00),$FF ; clear ERR_NR. - LD DE,($5C8A) ; fetch SPOSNL. + LD (IY+#00),#FF ; clear ERR_NR. + LD DE,(#5C8A) ; fetch SPOSNL. JR L117E ; forward to ED-C-END ; ------- @@ -5092,14 +5092,14 @@ L117C: POP DE ; fetch new line/column. ;; ED-C-END L117E: POP HL ; restore the old value of ERR_SP. - LD ($5C3D),HL ; update the system variable ERR_SP + LD (#5C3D),HL ; update the system variable ERR_SP POP BC ; old value of SPOSN_L PUSH DE ; save new value CALL L0DD9 ; routine CL-SET and PO-STORE ; update ECHO_E and SPOSN_L from BC POP HL ; restore new value - LD ($5C82),HL ; and update ECHO_E - LD (IY+$26),$00 ; make error pointer X_PTR_hi out of bounds + LD (#5C82),HL ; and update ECHO_E + LD (IY+#26),#00 ; make error pointer X_PTR_hi out of bounds RET ; return ; ----------------------------------------------- @@ -5111,7 +5111,7 @@ L117E: POP HL ; restore the old value of ERR_SP. ; this routine is called once ;; SET-HL -L1190: LD HL,($5C61) ; fetch WORKSP to HL. +L1190: LD HL,(#5C61) ; fetch WORKSP to HL. DEC HL ; point to last location of editing area. AND A ; clear carry to limit exit points to first ; or last. @@ -5119,14 +5119,14 @@ L1190: LD HL,($5C61) ; fetch WORKSP to HL. ; this routine is called with carry set and exits at a conditional return. ;; SET-DE -L1195: LD DE,($5C59) ; fetch E_LINE to DE - BIT 5,(IY+$37) ; test FLAGX - Input Mode ? +L1195: LD DE,(#5C59) ; fetch E_LINE to DE + BIT 5,(IY+#37) ; test FLAGX - Input Mode ? RET Z ; return now if in editing mode - LD DE,($5C61) ; fetch WORKSP to DE + LD DE,(#5C61) ; fetch WORKSP to DE RET C ; return if carry set ( entry = set-de) - LD HL,($5C63) ; fetch STKBOT to HL as well + LD HL,(#5C63) ; fetch STKBOT to HL as well RET ; and return (entry = set-hl (in input)) ; ------------------------------- @@ -5141,12 +5141,12 @@ L1195: LD DE,($5C59) ; fetch E_LINE to DE ;; REMOVE-FP L11A7: LD A,(HL) ; fetch character - CP $0E ; is it the number marker ? - LD BC,$0006 ; prepare for six bytes - CALL Z,L19E8 ; routine RECLAIM-2 reclaims space if $0E + CP #0E ; is it the number marker ? + LD BC,#0006 ; prepare for six bytes + CALL Z,L19E8 ; routine RECLAIM-2 reclaims space if #0E LD A,(HL) ; reload next (or same) character INC HL ; and advance address - CP $0D ; end of line or input buffer ? + CP #0D ; end of line or input buffer ? JR NZ,L11A7 ; back to REMOVE-FP until entire line done. RET ; return @@ -5164,11 +5164,11 @@ L11A7: LD A,(HL) ; fetch character ; | ROM | File | File | Buffer | Variables | ; +---------+-----------+------------+--------------+-------------+-- ; ^ ^ ^ ^ ^ ^ -; $0000 $4000 $5800 $5B00 $5C00 $5CB6 = CHANS +; #0000 #4000 #5800 #5B00 #5C00 #5CB6 = CHANS ; ; ; --+----------+---+---------+-----------+---+------------+--+---+-- -; | Channel |$80| BASIC | Variables |$80| Edit Line |NL|$80| +; | Channel |#80| BASIC | Variables |#80| Edit Line |NL|#80| ; | Info | | Program | Area | | or Command | | | ; --+----------+---+---------+-----------+---+------------+--+---+-- ; ^ ^ ^ ^ ^ @@ -5177,7 +5177,7 @@ L11A7: LD A,(HL) ; fetch character ; ; ---5--> <---2--- <--3--- ; --+-------+--+------------+-------+-------+---------+-------+-+---+------+ -; | INPUT |NL| Temporary | Calc. | Spare | Machine | GOSUB |?|$3E| UDGs | +; | INPUT |NL| Temporary | Calc. | Spare | Machine | GOSUB |?|#3E| UDGs | ; | data | | Work Space | Stack | | Stack | Stack | | | | ; --+-------+--+------------+-------+-------+---------+-------+-+---+------+ ; ^ ^ ^ ^ ^ ^ ^ @@ -5198,12 +5198,12 @@ L11A7: LD A,(HL) ; fetch character ;; NEW L11B7: DI ; disable interrupts - machine stack will be ; cleared. - LD A,$FF ; flag coming from NEW. - LD DE,($5CB2) ; fetch RAMTOP as top value. + LD A,#FF ; flag coming from NEW. + LD DE,(#5CB2) ; fetch RAMTOP as top value. EXX ; switch in alternate set. - LD BC,($5CB4) ; fetch P-RAMT differs on 16K/48K machines. - LD DE,($5C38) ; fetch RASP/PIP. - LD HL,($5C7B) ; fetch UDG differs on 16K/48K machines. + LD BC,(#5CB4) ; fetch P-RAMT differs on 16K/48K machines. + LD DE,(#5C38) ; fetch RASP/PIP. + LD HL,(#5C7B) ; fetch UDG differs on 16K/48K machines. EXX ; switch back to main set and continue into... ; --------------------------- @@ -5216,12 +5216,12 @@ L11B7: DI ; disable interrupts - machine stack will be ;; START-NEW L11CB: LD B,A ; save the flag for later branching. - LD A,$07 ; select a white border - OUT ($FE),A ; and set it now. + LD A,#07 ; select a white border + OUT (#FE),A ; and set it now. - LD A,$3F ; load accumulator with last page in ROM. + LD A,#3F ; load accumulator with last page in ROM. LD I,A ; set the I register - this remains constant - ; and can't be in range $40 - $7F as 'snow' + ; and can't be in range #40 - #7F as 'snow' ; appears on the screen. NOP ; these seem unnecessary. NOP ; @@ -5235,7 +5235,7 @@ L11CB: LD B,A ; save the flag for later branching. ; ------------ ; Typically a Spectrum will have 16K or 48K of Ram and this code will ; test it all till it finds an unpopulated location or, less likely, a -; faulty location. Usually it stops when it reaches the top $FFFF or +; faulty location. Usually it stops when it reaches the top #FFFF or ; in the case of NEW the supplied top value. The entire screen turns ; black with sometimes red stripes on black paper visible. @@ -5244,9 +5244,9 @@ L11DA: LD H,D ; transfer the top value to LD L,E ; the HL register pair. ;; RAM-FILL -L11DC: LD (HL),$02 ; load with 2 - red ink on black paper +L11DC: LD (HL),#02 ; load with 2 - red ink on black paper DEC HL ; next lower - CP H ; have we reached ROM - $3F ? + CP H ; have we reached ROM - #3F ? JR NZ,L11DC ; back to RAM-FILL if not. ;; RAM-READ @@ -5267,118 +5267,118 @@ L11E2: AND A ; clear carry - prepare to subtract L11EF: DEC HL ; step back to last valid location. EXX ; regardless of state, set up possibly ; stored system variables in case from NEW. - LD ($5CB4),BC ; insert P-RAMT. - LD ($5C38),DE ; insert RASP/PIP. - LD ($5C7B),HL ; insert UDG. + LD (#5CB4),BC ; insert P-RAMT. + LD (#5C38),DE ; insert RASP/PIP. + LD (#5C7B),HL ; insert UDG. EXX ; switch in main set. INC B ; now test if we arrived here from NEW. JR Z,L1219 ; forward to RAM-SET if we did. ; this section applies to START only. - LD ($5CB4),HL ; set P-RAMT to the highest working RAM + LD (#5CB4),HL ; set P-RAMT to the highest working RAM ; address. - LD DE,$3EAF ; address of last byte of 'U' bitmap in ROM. - LD BC,$00A8 ; there are 21 user defined graphics. + LD DE,#3EAF ; address of last byte of 'U' bitmap in ROM. + LD BC,#00A8 ; there are 21 user defined graphics. EX DE,HL ; switch pointers and make the UDGs a LDDR ; copy of the standard characters A - U. EX DE,HL ; switch the pointer to HL. INC HL ; update to start of 'A' in RAM. - LD ($5C7B),HL ; make UDG system variable address the first + LD (#5C7B),HL ; make UDG system variable address the first ; bitmap. DEC HL ; point at RAMTOP again. - LD BC,$0040 ; set the values of - LD ($5C38),BC ; the PIP and RASP system variables. + LD BC,#0040 ; set the values of + LD (#5C38),BC ; the PIP and RASP system variables. ; the NEW command path rejoins here. ;; RAM-SET -L1219: LD ($5CB2),HL ; set system variable RAMTOP to HL. +L1219: LD (#5CB2),HL ; set system variable RAMTOP to HL. - LD HL,$3C00 ; a strange place to set the pointer to the - LD ($5C36),HL ; character set, CHARS - as no printing yet. + LD HL,#3C00 ; a strange place to set the pointer to the + LD (#5C36),HL ; character set, CHARS - as no printing yet. - LD HL,($5CB2) ; fetch RAMTOP to HL again as we've lost it. + LD HL,(#5CB2) ; fetch RAMTOP to HL again as we've lost it. - LD (HL),$3E ; top of user ram holds GOSUB end marker + LD (HL),#3E ; top of user ram holds GOSUB end marker ; an impossible line number - see RETURN. - ; no significance in the number $3E. It has + ; no significance in the number #3E. It has ; been traditional since the ZX80. DEC HL ; followed by empty byte (not important). LD SP,HL ; set up the machine stack pointer. DEC HL ; DEC HL ; - LD ($5C3D),HL ; ERR_SP is where the error pointer is + LD (#5C3D),HL ; ERR_SP is where the error pointer is ; at moment empty - will take address MAIN-4 ; at the call preceding that address, ; although interrupts and calls will make use ; of this location in meantime. IM 1 ; select interrupt mode 1. - LD IY,$5C3A ; set IY to ERR_NR. IY can reach all standard + LD IY,#5C3A ; set IY to ERR_NR. IY can reach all standard ; system variables but shadow ROM system ; variables will be mostly out of range. EI ; enable interrupts now that we have a stack. - LD HL,$5CB6 ; the address of the channels - initially + LD HL,#5CB6 ; the address of the channels - initially ; following system variables. - LD ($5C4F),HL ; set the CHANS system variable. + LD (#5C4F),HL ; set the CHANS system variable. LD DE,L15AF ; address: init-chan in ROM. - LD BC,$0015 ; there are 21 bytes of initial data in ROM. + LD BC,#0015 ; there are 21 bytes of initial data in ROM. EX DE,HL ; swap the pointers. LDIR ; copy the bytes to RAM. EX DE,HL ; swap pointers. HL points to program area. DEC HL ; decrement address. - LD ($5C57),HL ; set DATADD to location before program area. + LD (#5C57),HL ; set DATADD to location before program area. INC HL ; increment again. - LD ($5C53),HL ; set PROG the location where BASIC starts. - LD ($5C4B),HL ; set VARS to same location with a - LD (HL),$80 ; variables end-marker. + LD (#5C53),HL ; set PROG the location where BASIC starts. + LD (#5C4B),HL ; set VARS to same location with a + LD (HL),#80 ; variables end-marker. INC HL ; advance address. - LD ($5C59),HL ; set E_LINE, where the edit line + LD (#5C59),HL ; set E_LINE, where the edit line ; will be created. ; Note. it is not strictly necessary to ; execute the next fifteen bytes of code ; as this will be done by the call to SET-MIN. ; -- - LD (HL),$0D ; initially just has a carriage return + LD (HL),#0D ; initially just has a carriage return INC HL ; followed by - LD (HL),$80 ; an end-marker. + LD (HL),#80 ; an end-marker. INC HL ; address the next location. - LD ($5C61),HL ; set WORKSP - empty workspace. - LD ($5C63),HL ; set STKBOT - bottom of the empty stack. - LD ($5C65),HL ; set STKEND to the end of the empty stack. + LD (#5C61),HL ; set WORKSP - empty workspace. + LD (#5C63),HL ; set STKBOT - bottom of the empty stack. + LD (#5C65),HL ; set STKEND to the end of the empty stack. ; -- - LD A,$38 ; the colour system is set to white paper, + LD A,#38 ; the colour system is set to white paper, ; black ink, no flash or bright. - LD ($5C8D),A ; set ATTR_P permanent colour attributes. - LD ($5C8F),A ; set ATTR_T temporary colour attributes. - LD ($5C48),A ; set BORDCR the border colour/lower screen + LD (#5C8D),A ; set ATTR_P permanent colour attributes. + LD (#5C8F),A ; set ATTR_T temporary colour attributes. + LD (#5C48),A ; set BORDCR the border colour/lower screen ; attributes. - LD HL,$0523 ; The keyboard repeat and delay values - LD ($5C09),HL ; are loaded to REPDEL and REPPER. + LD HL,#0523 ; The keyboard repeat and delay values + LD (#5C09),HL ; are loaded to REPDEL and REPPER. - DEC (IY-$3A) ; set KSTATE-0 to $FF. - DEC (IY-$36) ; set KSTATE-4 to $FF. + DEC (IY-#3A) ; set KSTATE-0 to #FF. + DEC (IY-#36) ; set KSTATE-4 to #FF. ; thereby marking both available. LD HL,L15C6 ; set source to ROM Address: init-strm - LD DE,$5C10 ; set destination to system variable STRMS-FD - LD BC,$000E ; copy the 14 bytes of initial 7 streams data + LD DE,#5C10 ; set destination to system variable STRMS-FD + LD BC,#000E ; copy the 14 bytes of initial 7 streams data LDIR ; from ROM to RAM. - SET 1,(IY+$01) ; update FLAGS - signal printer in use. + SET 1,(IY+#01) ; update FLAGS - signal printer in use. CALL L0EDF ; call routine CLEAR-PRB to initialize system ; variables associated with printer. - LD (IY+$31),$02 ; set DF_SZ the lower screen display size to + LD (IY+#31),#02 ; set DF_SZ the lower screen display size to ; two lines CALL L0D6B ; call routine CLS to set up system ; variables associated with screen and clear @@ -5388,7 +5388,7 @@ L1219: LD ($5CB2),HL ; set system variable RAMTOP to HL. CALL L0C0A ; routine PO-MSG puts ; '(c) 1982 Sinclair Research Ltd' ; at bottom of display. - SET 5,(IY+$02) ; update TV_FLAG - signal lower screen will + SET 5,(IY+#02) ; update TV_FLAG - signal lower screen will ; require clearing. JR L12A9 ; forward to MAIN-1 @@ -5400,7 +5400,7 @@ L1219: LD ($5CB2),HL ; set system variable RAMTOP to HL. ; ;; MAIN-EXEC -L12A2: LD (IY+$31),$02 ; set DF_SZ lower screen display file +L12A2: LD (IY+#31),#02 ; set DF_SZ lower screen display file ; size to 2 lines. CALL L1795 ; routine AUTO-LIST @@ -5408,7 +5408,7 @@ L12A2: LD (IY+$31),$02 ; set DF_SZ lower screen display file L12A9: CALL L16B0 ; routine SET-MIN clears work areas. ;; MAIN-2 -L12AC: LD A,$00 ; select channel 'K' the keyboard +L12AC: LD A,#00 ; select channel 'K' the keyboard CALL L1601 ; routine CHAN-OPEN opens it CALL L0F2C ; routine EDITOR is called. ; Note the above routine is where the Spectrum @@ -5416,21 +5416,21 @@ L12AC: LD A,$00 ; select channel 'K' the keyboard ; most common input at this stage ; is LOAD "". CALL L1B17 ; routine LINE-SCAN scans the input. - BIT 7,(IY+$00) ; test ERR_NR - will be $FF if syntax + BIT 7,(IY+#00) ; test ERR_NR - will be #FF if syntax ; is correct. JR NZ,L12CF ; forward, if correct, to MAIN-3. ; - BIT 4,(IY+$30) ; test FLAGS2 - K channel in use ? + BIT 4,(IY+#30) ; test FLAGS2 - K channel in use ? JR Z,L1303 ; forward to MAIN-4 if not. ; - LD HL,($5C59) ; an editing error so address E_LINE. + LD HL,(#5C59) ; an editing error so address E_LINE. CALL L11A7 ; routine REMOVE-FP removes the hidden ; floating-point forms. - LD (IY+$00),$FF ; system variable ERR_NR is reset to 'OK'. + LD (IY+#00),#FF ; system variable ERR_NR is reset to 'OK'. JR L12AC ; back to MAIN-2 to allow user to correct. ; --- @@ -5438,8 +5438,8 @@ L12AC: LD A,$00 ; select channel 'K' the keyboard ; the branch was here if syntax has passed test. ;; MAIN-3 -L12CF: LD HL,($5C59) ; fetch the edit line address from E_LINE. - LD ($5C5D),HL ; system variable CH_ADD is set to first +L12CF: LD HL,(#5C59) ; fetch the edit line address from E_LINE. + LD (#5C5D),HL ; system variable CH_ADD is set to first ; character of edit line. ; Note. the above two instructions are a little ; inadequate. @@ -5458,21 +5458,21 @@ L12CF: LD HL,($5C59) ; fetch the edit line address from E_LINE. ; Has the user just pressed the ENTER key ? RST 18H ; GET-CHAR gets character addressed by CH_ADD. - CP $0D ; is it a carriage return ? + CP #0D ; is it a carriage return ? JR Z,L12A2 ; back to MAIN-EXEC if so for an automatic ; listing. ; this must be a direct command. - BIT 0,(IY+$30) ; test FLAGS2 - clear the main screen ? + BIT 0,(IY+#30) ; test FLAGS2 - clear the main screen ? CALL NZ,L0DAF ; routine CL-ALL, if so, e.g. after listing. CALL L0D6E ; routine CLS-LOWER anyway. - LD A,$19 ; compute scroll count to 25 minus - SUB (IY+$4F) ; value of S_POSN_hi. - LD ($5C8C),A ; update SCR_CT system variable. - SET 7,(IY+$01) ; update FLAGS - signal running program. - LD (IY+$00),$FF ; set ERR_NR to 'OK'. - LD (IY+$0A),$01 ; set NSPPC to one for first statement. + LD A,#19 ; compute scroll count to 25 minus + SUB (IY+#4F) ; value of S_POSN_hi. + LD (#5C8C),A ; update SCR_CT system variable. + SET 7,(IY+#01) ; update FLAGS - signal running program. + LD (IY+#00),#FF ; set ERR_NR to 'OK'. + LD (IY+#0A),#01 ; set NSPPC to one for first statement. CALL L1B8A ; call routine LINE-RUN to run the line. ; sysvar ERR_SP therefore addresses MAIN-4 @@ -5485,13 +5485,13 @@ L12CF: LD HL,($5C59) ; fetch the edit line address from E_LINE. ;; MAIN-4 L1303: HALT ; wait for interrupt. - RES 5,(IY+$01) ; update FLAGS - signal no new key. - BIT 1,(IY+$30) ; test FLAGS2 - is printer buffer clear ? + RES 5,(IY+#01) ; update FLAGS - signal no new key. + BIT 1,(IY+#30) ; test FLAGS2 - is printer buffer clear ? CALL NZ,L0ECD ; call routine COPY-BUFF if not. ; Note. the programmer has neglected ; to set bit 1 of FLAGS first. - LD A,($5C3A) ; fetch ERR_NR + LD A,(#5C3A) ; fetch ERR_NR INC A ; increment to give true code. ; Now deal with a runtime error as opposed to an editing error. @@ -5500,34 +5500,34 @@ L1303: HALT ; wait for interrupt. ;; MAIN-G L1313: PUSH AF ; save the error number. - LD HL,$0000 ; prepare to clear some system variables. - LD (IY+$37),H ; clear all the bits of FLAGX. - LD (IY+$26),H ; blank X_PTR_hi to suppress error marker. - LD ($5C0B),HL ; blank DEFADD to signal that no defined + LD HL,#0000 ; prepare to clear some system variables. + LD (IY+#37),H ; clear all the bits of FLAGX. + LD (IY+#26),H ; blank X_PTR_hi to suppress error marker. + LD (#5C0B),HL ; blank DEFADD to signal that no defined ; function is currently being evaluated. - LD HL,$0001 ; explicit - inc hl would do. - LD ($5C16),HL ; ensure STRMS-00 is keyboard. + LD HL,#0001 ; explicit - inc hl would do. + LD (#5C16),HL ; ensure STRMS-00 is keyboard. CALL L16B0 ; routine SET-MIN clears workspace etc. - RES 5,(IY+$37) ; update FLAGX - signal in EDIT not INPUT mode. + RES 5,(IY+#37) ; update FLAGX - signal in EDIT not INPUT mode. ; Note. all the bits were reset earlier. CALL L0D6E ; call routine CLS-LOWER. - SET 5,(IY+$02) ; update TV_FLAG - signal lower screen + SET 5,(IY+#02) ; update TV_FLAG - signal lower screen ; requires clearing. POP AF ; bring back the error number LD B,A ; and make a copy in B. - CP $0A ; is it a print-ready digit ? + CP #0A ; is it a print-ready digit ? JR C,L133C ; forward to MAIN-5 if so. - ADD A,$07 ; add ASCII offset to letters. + ADD A,#07 ; add ASCII offset to letters. ;; MAIN-5 L133C: CALL L15EF ; call routine OUT-CODE to print the code. - LD A,$20 ; followed by a space. + LD A,#20 ; followed by a space. RST 10H ; PRINT-A LD A,B ; fetch stored report code. @@ -5538,40 +5538,40 @@ X1349: CALL L3B3B ; Spectrum 128 patch NOP L134D: CALL L0C0A ; routine PO-MSG prints them although it would - ; be more succinct to use RST $10. + ; be more succinct to use RST #10. - LD BC,($5C45) ; fetch PPC the current line number. + LD BC,(#5C45) ; fetch PPC the current line number. CALL L1A1B ; routine OUT-NUM-1 will print that - LD A,$3A ; then a ':'. + LD A,#3A ; then a ':'. RST 10H ; PRINT-A - LD C,(IY+$0D) ; then SUBPPC for statement - LD B,$00 ; limited to 127 + LD C,(IY+#0D) ; then SUBPPC for statement + LD B,#00 ; limited to 127 CALL L1A1B ; routine OUT-NUM-1 CALL L1097 ; routine CLEAR-SP clears editing area. ; which probably contained 'RUN'. - LD A,($5C3A) ; fetch ERR_NR again - INC A ; test for no error originally $FF. + LD A,(#5C3A) ; fetch ERR_NR again + INC A ; test for no error originally #FF. JR Z,L1386 ; forward to MAIN-9 if no error. - CP $09 ; is code Report 9 STOP ? + CP #09 ; is code Report 9 STOP ? JR Z,L1373 ; forward to MAIN-6 if so - CP $15 ; is code Report L Break ? + CP #15 ; is code Report L Break ? JR NZ,L1376 ; forward to MAIN-7 if not ; Stop or Break was encountered so consider CONTINUE. ;; MAIN-6 -L1373: INC (IY+$0D) ; increment SUBPPC to next statement. +L1373: INC (IY+#0D) ; increment SUBPPC to next statement. ;; MAIN-7 -L1376: LD BC,$0003 ; prepare to copy 3 system variables to - LD DE,$5C70 ; address OSPPC - statement for CONTINUE. +L1376: LD BC,#0003 ; prepare to copy 3 system variables to + LD DE,#5C70 ; address OSPPC - statement for CONTINUE. ; also updating OLDPPC line number below. - LD HL,$5C44 ; set source top to NSPPC next statement. + LD HL,#5C44 ; set source top to NSPPC next statement. BIT 7,(HL) ; did BREAK occur before the jump ? ; e.g. between GO TO and next statement. JR Z,L1384 ; skip forward to MAIN-8, if not, as setup @@ -5585,8 +5585,8 @@ L1384: LDDR ; copy PPC to OLDPPC and SUBPPC to OSPCC ; or NSPPC to OLDPPC and NEWPPC to OSPCC ;; MAIN-9 -L1386: LD (IY+$0A),$FF ; update NSPPC - signal 'no jump'. - RES 3,(IY+$01) ; update FLAGS - signal use 'K' mode for +L1386: LD (IY+#0A),#FF ; update NSPPC - signal 'no jump'. + RES 3,(IY+#01) ; update FLAGS - signal use 'K' mode for ; the first character in the editor and JP L12AC ; jump back to MAIN-2. @@ -5595,7 +5595,7 @@ L1386: LD (IY+$0A),$FF ; update NSPPC - signal 'no jump'. ; Canned report messages ; ---------------------- ; The Error reports with the last byte inverted. The first entry -; is a dummy entry. The last, which begins with $7F, the Spectrum +; is a dummy entry. The last, which begins with #7F, the Spectrum ; character for copyright symbol, is placed here for convenience ; as is the preceding comma and space. ; The report line must accommodate a 4-digit line number and a 3-digit @@ -5604,68 +5604,68 @@ L1386: LD (IY+$0A),$FF ; update NSPPC - signal 'no jump'. ; e.g. "B Integer out of range, 1000:127" ;; rpt-mesgs -L1391: DEFB $80 - DEFB 'O','K'+$80 ; 0 +L1391: DEFB #80 + DEFB 'O','K'+#80 ; 0 DEFM "NEXT without FO" - DEFB 'R'+$80 ; 1 + DEFB 'R'+#80 ; 1 DEFM "Variable not foun" - DEFB 'd'+$80 ; 2 + DEFB 'd'+#80 ; 2 DEFM "Subscript wron" - DEFB 'g'+$80 ; 3 + DEFB 'g'+#80 ; 3 DEFM "Out of memor" - DEFB 'y'+$80 ; 4 + DEFB 'y'+#80 ; 4 DEFM "Out of scree" - DEFB 'n'+$80 ; 5 + DEFB 'n'+#80 ; 5 DEFM "Number too bi" - DEFB 'g'+$80 ; 6 + DEFB 'g'+#80 ; 6 DEFM "RETURN without GOSU" - DEFB 'B'+$80 ; 7 + DEFB 'B'+#80 ; 7 DEFM "End of fil" - DEFB 'e'+$80 ; 8 + DEFB 'e'+#80 ; 8 DEFM "STOP statemen" - DEFB 't'+$80 ; 9 + DEFB 't'+#80 ; 9 DEFM "Invalid argumen" - DEFB 't'+$80 ; A + DEFB 't'+#80 ; A DEFM "Integer out of rang" - DEFB 'e'+$80 ; B + DEFB 'e'+#80 ; B DEFM "Nonsense in BASI" - DEFB 'C'+$80 ; C + DEFB 'C'+#80 ; C DEFM "BREAK - CONT repeat" - DEFB 's'+$80 ; D + DEFB 's'+#80 ; D DEFM "Out of DAT" - DEFB 'A'+$80 ; E + DEFB 'A'+#80 ; E DEFM "Invalid file nam" - DEFB 'e'+$80 ; F + DEFB 'e'+#80 ; F DEFM "No room for lin" - DEFB 'e'+$80 ; G + DEFB 'e'+#80 ; G DEFM "STOP in INPU" - DEFB 'T'+$80 ; H + DEFB 'T'+#80 ; H DEFM "FOR without NEX" - DEFB 'T'+$80 ; I + DEFB 'T'+#80 ; I DEFM "Invalid I/O devic" - DEFB 'e'+$80 ; J + DEFB 'e'+#80 ; J DEFM "Invalid colou" - DEFB 'r'+$80 ; K + DEFB 'r'+#80 ; K DEFM "BREAK into progra" - DEFB 'm'+$80 ; L + DEFB 'm'+#80 ; L DEFM "RAMTOP no goo" - DEFB 'd'+$80 ; M + DEFB 'd'+#80 ; M DEFM "Statement los" - DEFB 't'+$80 ; N + DEFB 't'+#80 ; N DEFM "Invalid strea" - DEFB 'm'+$80 ; O + DEFB 'm'+#80 ; O DEFM "FN without DE" - DEFB 'F'+$80 ; P + DEFB 'F'+#80 ; P DEFM "Parameter erro" - DEFB 'r'+$80 ; Q + DEFB 'r'+#80 ; Q DEFM "Tape loading erro" - DEFB 'r'+$80 ; R + DEFB 'r'+#80 ; R ;; comma-sp -L1537: DEFB ',',' '+$80 ; used in report line. +L1537: DEFB ',',' '+#80 ; used in report line. ;; copyright -L1539: DEFB $7F ; copyright +L1539: DEFB #7F ; copyright DEFM " 1982 Sinclair Research Lt" - DEFB 'd'+$80 + DEFB 'd'+#80 ; ------------- @@ -5677,8 +5677,8 @@ L1539: DEFB $7F ; copyright ;; REPORT-G ; No Room for line -L1555: LD A,$10 ; i.e. 'G' -$30 -$07 - LD BC,$0000 ; this seems unnecessary. +L1555: LD A,#10 ; i.e. 'G' -#30 -#07 + LD BC,#0000 ; this seems unnecessary. JP L1313 ; jump back to MAIN-G ; ----------------------------- @@ -5692,8 +5692,8 @@ L1555: LD A,$10 ; i.e. 'G' -$30 -$07 ; Entering a non-existent line allows the subsequent line to be edited next. ;; MAIN-ADD -L155D: LD ($5C49),BC ; set E_PPC to extracted line number. - LD HL,($5C5D) ; fetch CH_ADD - points to location after the +L155D: LD (#5C49),BC ; set E_PPC to extracted line number. + LD HL,(#5C5D) ; fetch CH_ADD - points to location after the ; initial digits (set in E_LINE_NO). EX DE,HL ; save start of BASIC in DE. @@ -5702,7 +5702,7 @@ L155D: LD ($5C49),BC ; set E_PPC to extracted line number. ; the only error that can occur is ; 'Out of memory'. - LD HL,($5C61) ; fetch WORKSP - end of line. + LD HL,(#5C61) ; fetch WORKSP - end of line. SCF ; prepare for true subtraction. SBC HL,DE ; find length of BASIC and PUSH HL ; save it on stack. @@ -5729,24 +5729,24 @@ L157D: POP BC ; retrieve the length of the new line. INC BC ; (two bytes). DEC HL ; HL points to location before the destination - LD DE,($5C53) ; fetch the address of PROG + LD DE,(#5C53) ; fetch the address of PROG PUSH DE ; and save it on the stack CALL L1655 ; routine MAKE-ROOM creates BC spaces in ; program area and updates pointers. POP HL ; restore old program pointer. - LD ($5C53),HL ; and put back in PROG as it may have been + LD (#5C53),HL ; and put back in PROG as it may have been ; altered by the POINTERS routine. POP BC ; retrieve BASIC length PUSH BC ; and save again. INC DE ; points to end of new area. - LD HL,($5C61) ; set HL to WORKSP - location after edit line. + LD HL,(#5C61) ; set HL to WORKSP - location after edit line. DEC HL ; decrement to address end marker. DEC HL ; decrement to address carriage return. LDDR ; copy the BASIC line back to initial command. - LD HL,($5C49) ; fetch E_PPC - line number. + LD HL,(#5C49) ; fetch E_PPC - line number. EX DE,HL ; swap it to DE, HL points to last of ; four locations. POP BC ; retrieve length of line. @@ -5756,7 +5756,7 @@ L157D: POP BC ; retrieve the length of the new line. DEC HL ; LD (HL),E ; then low byte of line number. DEC HL ; - LD (HL),D ; then high byte range $0 - $27 (1-9999). + LD (HL),D ; then high byte range #0 - #27 (1-9999). ;; MAIN-ADD2 L15AB: POP AF ; drop the address of Report G @@ -5777,28 +5777,28 @@ L15AB: POP AF ; drop the address of Report G ;; init-chan L15AF: DEFW L09F4 ; PRINT-OUT DEFW L10A8 ; KEY-INPUT - DEFB $4B ; 'K' + DEFB #4B ; 'K' DEFW L09F4 ; PRINT-OUT DEFW L15C4 ; REPORT-J - DEFB $53 ; 'S' + DEFB #53 ; 'S' DEFW L0F81 ; ADD-CHAR DEFW L15C4 ; REPORT-J - DEFB $52 ; 'R' + DEFB #52 ; 'R' DEFW L09F4 ; PRINT-OUT DEFW L15C4 ; REPORT-J - DEFB $50 ; 'P' + DEFB #50 ; 'P' - DEFB $80 ; End Marker + DEFB #80 ; End Marker ;; REPORT-J L15C4: RST 08H ; ERROR-1 - DEFB $12 ; Error Report: Invalid I/O device + DEFB #12 ; Error Report: Invalid I/O device ; ------------------- ; Initial stream data ; ------------------- -; This is the initial stream data for the seven streams $FD - $03 that is +; This is the initial stream data for the seven streams #FD - #03 that is ; copied from ROM to the STRMS system variables area during initialization. ; There are reserved locations there for another 12 streams. ; Each location contains an offset to the second byte of a channel. @@ -5806,14 +5806,14 @@ L15C4: RST 08H ; ERROR-1 ; offset of zero for some and zero is used to denote that a stream is closed. ;; init-strm -L15C6: DEFB $01, $00 ; stream $FD offset to channel 'K' - DEFB $06, $00 ; stream $FE offset to channel 'S' - DEFB $0B, $00 ; stream $FF offset to channel 'R' +L15C6: DEFB #01, #00 ; stream #FD offset to channel 'K' + DEFB #06, #00 ; stream #FE offset to channel 'S' + DEFB #0B, #00 ; stream #FF offset to channel 'R' - DEFB $01, $00 ; stream $00 offset to channel 'K' - DEFB $01, $00 ; stream $01 offset to channel 'K' - DEFB $06, $00 ; stream $02 offset to channel 'S' - DEFB $10, $00 ; stream $03 offset to channel 'P' + DEFB #01, #00 ; stream #00 offset to channel 'K' + DEFB #01, #00 ; stream #01 offset to channel 'K' + DEFB #06, #00 ; stream #02 offset to channel 'S' + DEFB #10, #00 ; stream #03 offset to channel 'P' ; ---------------------------- ; Control for input subroutine @@ -5821,10 +5821,10 @@ L15C6: DEFB $01, $00 ; stream $FD offset to channel 'K' ; ;; WAIT-KEY -L15D4: BIT 5,(IY+$02) ; test TV_FLAG - clear lower screen ? +L15D4: BIT 5,(IY+#02) ; test TV_FLAG - clear lower screen ? JR NZ,L15DE ; forward to WAIT-KEY1 if so. - SET 3,(IY+$02) ; update TV_FLAG - signal reprint the edit + SET 3,(IY+#02) ; update TV_FLAG - signal reprint the edit ; line to the lower screen. ;; WAIT-KEY1 @@ -5839,7 +5839,7 @@ L15DE: CALL L15E6 ; routine INPUT-AD is called. ;; REPORT-8 L15E4: RST 08H ; ERROR-1 - DEFB $07 ; Error Report: End of file + DEFB #07 ; Error Report: End of file ; ------------------------------ ; Make HL point to input address @@ -5850,7 +5850,7 @@ L15E4: RST 08H ; ERROR-1 ;; INPUT-AD L15E6: EXX ; switch in alternate set. PUSH HL ; save HL register - LD HL,($5C51) ; fetch address of CURCHL - current channel. + LD HL,(#5C51) ; fetch address of CURCHL - current channel. INC HL ; step over output routine INC HL ; to point to low byte of input routine. JR L15F7 ; forward to CALL-SUB. @@ -5864,16 +5864,16 @@ L15E6: EXX ; switch in alternate set. ; PRINT-A-2 is a continuation of the RST 10 to print any character. ; Both print to the current channel and the printing of control codes ; may alter that channel to divert subsequent RST 10 instructions -; to temporary routines. The normal channel is $09F4. +; to temporary routines. The normal channel is #09F4. ;; OUT-CODE -L15EF: LD E,$30 ; add 48 decimal to give ASCII +L15EF: LD E,#30 ; add 48 decimal to give ASCII ADD A,E ; character '0' to '9'. ;; PRINT-A-2 L15F2: EXX ; switch in alternate set PUSH HL ; save HL register - LD HL,($5C51) ; fetch CURCHL the current channel. + LD HL,(#5C51) ; fetch CURCHL the current channel. ; input-ad rejoins here also. @@ -5896,14 +5896,14 @@ L15F7: LD E,(HL) ; put the low byte in E. ; This is either for its own use or in response to a user's request, for ; example, when '#' is encountered with output - PRINT, LIST etc. ; or with input - INPUT, INKEY$ etc. -; it is entered with a system stream $FD - $FF, or a user stream $00 - $0F +; it is entered with a system stream #FD - #FF, or a user stream #00 - #0F ; in the accumulator. ;; CHAN-OPEN -L1601: ADD A,A ; double the stream ($FF will become $FE etc.) - ADD A,$16 ; add the offset to stream 0 from $5C00 +L1601: ADD A,A ; double the stream (#FF will become #FE etc.) + ADD A,#16 ; add the offset to stream 0 from #5C00 LD L,A ; result to L - LD H,$5C ; now form the address in STRMS area. + LD H,#5C ; now form the address in STRMS area. LD E,(HL) ; fetch low byte of CHANS offset INC HL ; address next LD D,(HL) ; fetch high byte of offset @@ -5913,14 +5913,14 @@ L1601: ADD A,A ; double the stream ($FF will become $FE etc.) ;; REPORT-Oa L160E: RST 08H ; ERROR-1 - DEFB $17 ; Error Report: Invalid stream + DEFB #17 ; Error Report: Invalid stream ; continue here if stream was open. Note that the offset is from CHANS ; to the second byte of the channel. ;; CHAN-OP-1 L1610: DEC DE ; reduce offset so it points to the channel. - LD HL,($5C4F) ; fetch CHANS the location of the base of + LD HL,(#5C4F) ; fetch CHANS the location of the base of ; the channel information area ADD HL,DE ; and add the offset to address the channel. ; and continue to set flags. @@ -5932,9 +5932,9 @@ L1610: DEC DE ; reduce offset so it points to the channel. ; current channel when it has been temporarily altered. ;; CHAN-FLAG -L1615: LD ($5C51),HL ; set CURCHL system variable to the +L1615: LD (#5C51),HL ; set CURCHL system variable to the ; address in HL - RES 4,(IY+$30) ; update FLAGS2 - signal K channel not in use. + RES 4,(IY+#30) ; update FLAGS2 - signal K channel not in use. ; Note. provide a default for channel 'R'. INC HL ; advance past INC HL ; output routine. @@ -5948,7 +5948,7 @@ L1615: LD ($5C51),HL ; set CURCHL system variable to the RET NC ; but if the letter wasn't found in the ; table just return now. - channel 'R'. - LD D,$00 ; prepare to add + LD D,#00 ; prepare to add LD E,(HL) ; offset to E ADD HL,DE ; add offset to location of offset to form ; address of routine @@ -5967,11 +5967,11 @@ L162C: JP (HL) ; jump to the routine ; A zero end-marker is required as channel 'R' is not present. ;; chn-cd-lu -L162D: DEFB 'K', L1634-$-1 ; offset $06 to CHAN-K - DEFB 'S', L1642-$-1 ; offset $12 to CHAN-S - DEFB 'P', L164D-$-1 ; offset $1B to CHAN-P +L162D: DEFB 'K', L1634-$-1 ; offset #06 to CHAN-K + DEFB 'S', L1642-$-1 ; offset #12 to CHAN-S + DEFB 'P', L164D-$-1 ; offset #1B to CHAN-P - DEFB $00 ; end marker. + DEFB #00 ; end marker. ; -------------- ; Channel K flag @@ -5979,9 +5979,9 @@ L162D: DEFB 'K', L1634-$-1 ; offset $06 to CHAN-K ; routine to set flags for lower screen/keyboard channel. ;; CHAN-K -L1634: SET 0,(IY+$02) ; update TV_FLAG - signal lower screen in use - RES 5,(IY+$01) ; update FLAGS - signal no new key - SET 4,(IY+$30) ; update FLAGS2 - signal K channel in use +L1634: SET 0,(IY+#02) ; update TV_FLAG - signal lower screen in use + RES 5,(IY+#01) ; update FLAGS - signal no new key + SET 4,(IY+#30) ; update FLAGS2 - signal K channel in use JR L1646 ; forward to CHAN-S-1 for indirect exit ; -------------- @@ -5990,10 +5990,10 @@ L1634: SET 0,(IY+$02) ; update TV_FLAG - signal lower screen in use ; routine to set flags for upper screen channel. ;; CHAN-S -L1642: RES 0,(IY+$02) ; TV_FLAG - signal main screen in use +L1642: RES 0,(IY+#02) ; TV_FLAG - signal main screen in use ;; CHAN-S-1 -L1646: RES 1,(IY+$01) ; update FLAGS - signal printer not in use +L1646: RES 1,(IY+#01) ; update FLAGS - signal printer not in use JP L0D4D ; jump back to TEMPS and exit via that ; routine after setting temporary attributes. ; -------------- @@ -6004,20 +6004,20 @@ L1646: RES 1,(IY+$01) ; update FLAGS - signal printer not in use ; This status remains in force until reset by the routine above. ;; CHAN-P -L164D: SET 1,(IY+$01) ; update FLAGS - signal printer in use +L164D: SET 1,(IY+#01) ; update FLAGS - signal printer in use RET ; return ; ----------------------- ; Just one space required ; ----------------------- ; This routine is called once only to create a single space -; in workspace by ADD-CHAR. It is slightly quicker than using a RST $30. +; in workspace by ADD-CHAR. It is slightly quicker than using a RST #30. ; There are several instances in the calculator where the sequence -; ld bc, 1; rst $30 could be replaced by a call to this routine but it +; ld bc, 1; rst #30 could be replaced by a call to this routine but it ; only gives a saving of one byte each time. ;; ONE-SPACE -L1652: LD BC,$0001 ; create space for a single character. +L1652: LD BC,#0001 ; create space for a single character. ; --------- ; Make Room @@ -6036,7 +6036,7 @@ L1655: PUSH HL ; save the address pointer. CALL L1664 ; routine POINTERS updates the ; dynamic memory location pointers. ; DE now holds the old value of STKEND. - LD HL,($5C65) ; fetch new STKEND the top destination. + LD HL,(#5C65) ; fetch new STKEND the top destination. EX DE,HL ; HL now addresses the top of the area to ; be moved up - old STKEND. @@ -6059,8 +6059,8 @@ L1655: PUSH HL ; save the address pointer. ;; POINTERS L1664: PUSH AF ; preserve accumulator. PUSH HL ; put pos pointer on stack. - LD HL,$5C4B ; address VARS the first of the - LD A,$0E ; fourteen variables to consider. + LD HL,#5C4B ; address VARS the first of the + LD A,#0E ; fourteen variables to consider. ;; PTR-NEXT L166B: LD E,(HL) ; fetch the low byte of the system variable. @@ -6112,22 +6112,22 @@ L167F: INC HL ; address next system variable. ; been found using LINE-ADDR, and it is entered at LINE-NO. If it encounters ; the program 'end-marker' then the previous line is used and if that ; should also be unacceptable then zero is used as it must be a direct -; command. The program end-marker is the variables end-marker $80, or +; command. The program end-marker is the variables end-marker #80, or ; if variables exist, then the first character of any variable name. ;; LINE-ZERO -L168F: DEFB $00, $00 ; dummy line number used for direct commands +L168F: DEFB #00, #00 ; dummy line number used for direct commands ;; LINE-NO-A L1691: EX DE,HL ; fetch the previous line to HL and set - LD DE,$168F ; DE to LINE-ZERO should HL also fail. + LD DE,#168F ; DE to LINE-ZERO should HL also fail. ; -> The Entry Point. ;; LINE-NO -L1695: LD A,(HL) ; fetch the high byte - max $2F - AND $C0 ; mask off the invalid bits. +L1695: LD A,(HL) ; fetch the high byte - max #2F + AND #C0 ; mask off the invalid bits. JR NZ,L1691 ; to LINE-NO-A if an end-marker. LD D,(HL) ; reload the high byte. @@ -6141,13 +6141,13 @@ L1695: LD A,(HL) ; fetch the high byte - max $2F ; This is a continuation of the restart BC-SPACES ;; RESERVE -L169E: LD HL,($5C63) ; STKBOT first location of calculator stack +L169E: LD HL,(#5C63) ; STKBOT first location of calculator stack DEC HL ; make one less than new location CALL L1655 ; routine MAKE-ROOM creates the room. INC HL ; address the first new location INC HL ; advance to second POP BC ; restore old WORKSP - LD ($5C61),BC ; system variable WORKSP was perhaps + LD (#5C61),BC ; system variable WORKSP was perhaps ; changed by POINTERS routine. POP BC ; restore count for return value. EX DE,HL ; switch. DE = location after first new space @@ -6168,31 +6168,31 @@ L169E: LD HL,($5C63) ; STKBOT first location of calculator stack ; displaying an error. ;; SET-MIN -L16B0: LD HL,($5C59) ; fetch E_LINE - LD (HL),$0D ; insert carriage return - LD ($5C5B),HL ; make K_CUR keyboard cursor point there. +L16B0: LD HL,(#5C59) ; fetch E_LINE + LD (HL),#0D ; insert carriage return + LD (#5C5B),HL ; make K_CUR keyboard cursor point there. INC HL ; next location - LD (HL),$80 ; holds end-marker $80 + LD (HL),#80 ; holds end-marker #80 INC HL ; next location becomes - LD ($5C61),HL ; start of WORKSP + LD (#5C61),HL ; start of WORKSP ; This entry point is used prior to input and prior to the execution, ; or parsing, of each statement. ;; SET-WORK -L16BF: LD HL,($5C61) ; fetch WORKSP value - LD ($5C63),HL ; and place in STKBOT +L16BF: LD HL,(#5C61) ; fetch WORKSP value + LD (#5C63),HL ; and place in STKBOT ; This entry point is used to move the stack back to its normal place ; after temporary relocation during line entry and also from ERROR-3 ;; SET-STK -L16C5: LD HL,($5C63) ; fetch STKBOT value - LD ($5C65),HL ; and place in STKEND. +L16C5: LD HL,(#5C63) ; fetch STKBOT value + LD (#5C65),HL ; and place in STKEND. PUSH HL ; perhaps an obsolete entry point. - LD HL,$5C92 ; normal location of MEM-0 - LD ($5C68),HL ; is restored to system variable MEM. + LD HL,#5C92 ; normal location of MEM-0 + LD (#5C68),HL ; is restored to system variable MEM. POP HL ; saved value not required. RET ; return. @@ -6207,7 +6207,7 @@ L16C5: LD HL,($5C63) ; fetch STKBOT value ; On entry, HL must point to the end of the something to be deleted. ;; REC-EDIT -L16D4: LD DE,($5C59) ; fetch start of edit line from E_LINE. +L16D4: LD DE,(#5C59) ; fetch start of edit line from E_LINE. JP L19E5 ; jump forward to RECLAIM-1. ; -------------------------- @@ -6286,9 +6286,9 @@ L16E5: CALL L171E ; routine STR-DATA fetches parameter ; peculiar to that stream without disturbing ; data pointer to STRMS entry in HL. - LD BC,$0000 ; the stream is to be blanked. - LD DE,$A3E2 ; the number of bytes from stream 4, $5C1E, - ; to $10000 + LD BC,#0000 ; the stream is to be blanked. + LD DE,#A3E2 ; the number of bytes from stream 4, #5C1E, + ; to #10000 EX DE,HL ; transfer offset to HL, STRMS data pointer ; to DE. ADD HL,DE ; add the offset to the data pointer. @@ -6298,7 +6298,7 @@ L16E5: CALL L171E ; routine STR-DATA fetches parameter ; proceed with a negative result. LD BC,L15C6 + 14 ; prepare the address of the byte after - ; the initial stream data in ROM. ($15D4) + ; the initial stream data in ROM. (#15D4) ADD HL,BC ; index into the data table with negative value. LD C,(HL) ; low byte to C INC HL ; address next. @@ -6327,7 +6327,7 @@ L16FC: EX DE,HL ; address of stream to HL. ;; CLOSE-2 L1701: PUSH HL ; * save address of stream data pointer ; in STRMS on the machine stack. - LD HL,($5C4F) ; fetch CHANS address to HL + LD HL,(#5C4F) ; fetch CHANS address to HL ADD HL,BC ; add the offset to address the second ; byte of the output routine hopefully. INC HL ; step past @@ -6335,15 +6335,15 @@ L1701: PUSH HL ; * save address of stream data pointer INC HL ; to address channel's letter LD C,(HL) ; pick it up in C. ; Note. but if stream is already closed we - ; get the value $10 (the byte preceding 'K'). + ; get the value #10 (the byte preceding 'K'). EX DE,HL ; save the pointer to the letter in DE. LD HL,L1716 ; address: cl-str-lu in ROM. CALL L16DC ; routine INDEXER uses the code to get ; the 8-bit offset from the current point to ; the address of the closing routine in ROM. - ; Note. it won't find $10 there! + ; Note. it won't find #10 there! LD C,(HL) ; transfer the offset to C. - LD B,$00 ; prepare to add. + LD B,#00 ; prepare to add. ADD HL,BC ; add offset to point to the address of the ; routine that closes the stream. ; (and presumably removes any buffers that @@ -6387,22 +6387,22 @@ L171C: POP HL ; * now just restore the stream data pointer ;; STR-DATA L171E: CALL L1E94 ; routine FIND-INT1 fetches parameter to A - CP $10 ; is it less than 16d ? + CP #10 ; is it less than 16d ? JR C,L1727 ; skip forward to STR-DATA1 if so. ;; REPORT-Ob L1725: RST 08H ; ERROR-1 - DEFB $17 ; Error Report: Invalid stream + DEFB #17 ; Error Report: Invalid stream ;; STR-DATA1 -L1727: ADD A,$03 ; add the offset for 3 system streams. +L1727: ADD A,#03 ; add the offset for 3 system streams. ; range 00 - 15d becomes 3 - 18d. RLCA ; double as there are two bytes per ; stream - now 06 - 36d - LD HL,$5C10 ; address STRMS - the start of the streams + LD HL,#5C10 ; address STRMS - the start of the streams ; data area in system variables. LD C,A ; transfer the low byte to A. - LD B,$00 ; prepare to add offset. + LD B,#00 ; prepare to add offset. ADD HL,BC ; add to address the data entry in STRMS. ; the data entry itself contains an offset from CHANS to the address of the @@ -6425,8 +6425,8 @@ L1727: ADD A,$03 ; add the offset for 3 system streams. ;; OPEN L1736: RST 28H ;; FP-CALC ;s,c. - DEFB $01 ;;exchange ;c,s. - DEFB $38 ;;end-calc + DEFB #01 ;;exchange ;c,s. + DEFB #38 ;;end-calc CALL L171E ; routine STR-DATA fetches the stream off ; the stack and returns with the CHANS @@ -6439,7 +6439,7 @@ L1736: RST 28H ;; FP-CALC ;s,c. ; if it is a system channel then it can re-attached. EX DE,HL ; save STRMS address in DE. - LD HL,($5C4F) ; fetch CHANS. + LD HL,(#5C4F) ; fetch CHANS. ADD HL,BC ; add the offset to address the second ; byte of the channel. INC HL ; skip over the @@ -6449,13 +6449,13 @@ L1736: RST 28H ;; FP-CALC ;s,c. EX DE,HL ; save letter pointer and bring back ; the STRMS pointer. - CP $4B ; is it 'K' ? + CP #4B ; is it 'K' ? JR Z,L1756 ; forward to OPEN-1 if so - CP $53 ; is it 'S' ? + CP #53 ; is it 'S' ? JR Z,L1756 ; forward to OPEN-1 if so - CP $50 ; is it 'P' ? + CP #50 ; is it 'P' ? JR NZ,L1725 ; back to REPORT-Ob if not. ; to report 'Invalid stream'. @@ -6491,7 +6491,7 @@ L175D: PUSH HL ; * save the STRMS data entry pointer. ;; REPORT-Fb L1765: RST 08H ; ERROR-1 - DEFB $0E ; Error Report: Invalid file name + DEFB #0E ; Error Report: Invalid file name ;; OPEN-3 L1767: PUSH BC ; save the length of the string. @@ -6500,7 +6500,7 @@ L1767: PUSH BC ; save the length of the string. ; distinguish between a binary or text ; channel then it will be simply a matter ; of setting bit 7 of FLAGX. - AND $DF ; make it upper-case. + AND #DF ; make it upper-case. LD C,A ; place it in C. LD HL,L177A ; address: op-str-lu is loaded. CALL L16DC ; routine INDEXER will search for letter. @@ -6508,7 +6508,7 @@ L1767: PUSH BC ; save the length of the string. ; 'Invalid filename' LD C,(HL) ; fetch the displacement to opening routine. - LD B,$00 ; prepare to add. + LD B,#00 ; prepare to add. ADD HL,BC ; now form address of opening routine. POP BC ; restore the length of string. JP (HL) ; now jump forward to the relevant routine. @@ -6523,11 +6523,11 @@ L1767: PUSH BC ; save the length of the string. ; provided by the user and not the operating system. ;; op-str-lu -L177A: DEFB 'K', L1781-$-1 ; $06 offset to OPEN-K - DEFB 'S', L1785-$-1 ; $08 offset to OPEN-S - DEFB 'P', L1789-$-1 ; $0A offset to OPEN-P +L177A: DEFB 'K', L1781-$-1 ; #06 offset to OPEN-K + DEFB 'S', L1785-$-1 ; #08 offset to OPEN-S + DEFB 'P', L1789-$-1 ; #0A offset to OPEN-P - DEFB $00 ; end-marker. + DEFB #00 ; end-marker. ; ---------------------------- ; The Stream Opening Routines. @@ -6551,7 +6551,7 @@ L177A: DEFB 'K', L1781-$-1 ; $06 offset to OPEN-K ; Something of significance is being passed to these ghost routines in the ; second character. Strings 'RB', 'RT' perhaps or a drive/station number. ; The routine would have to deal with that and exit to OPEN_END with BC -; containing $0001 or more likely there would be an exit within the routine. +; containing #0001 or more likely there would be an exit within the routine. ; Anyway doesn't matter, these routines are long gone. ; ----------------- @@ -6560,7 +6560,7 @@ L177A: DEFB 'K', L1781-$-1 ; $06 offset to OPEN-K ; Open Keyboard stream. ;; OPEN-K -L1781: LD E,$01 ; 01 is offset to second byte of channel 'K'. +L1781: LD E,#01 ; 01 is offset to second byte of channel 'K'. JR L178B ; forward to OPEN-END ; ----------------- @@ -6569,7 +6569,7 @@ L1781: LD E,$01 ; 01 is offset to second byte of channel 'K'. ; Open Screen stream. ;; OPEN-S -L1785: LD E,$06 ; 06 is offset to 2nd byte of channel 'S' +L1785: LD E,#06 ; 06 is offset to 2nd byte of channel 'S' JR L178B ; to OPEN-END ; ----------------- @@ -6578,7 +6578,7 @@ L1785: LD E,$06 ; 06 is offset to 2nd byte of channel 'S' ; Open Printer stream. ;; OPEN-P -L1789: LD E,$10 ; 16d is offset to 2nd byte of channel 'P' +L1789: LD E,#10 ; 16d is offset to 2nd byte of channel 'P' ;; OPEN-END L178B: DEC BC ; the stored length of 'K','S','P' or @@ -6600,7 +6600,7 @@ L178B: DEC BC ; the stored length of 'K','S','P' or ; ; Luckily this provides a mechanism for extending these in a shadow ROM ; but without the powerful mechanisms set up in this ROM. -; An instruction fetch on $0008 may page in a peripheral ROM, +; An instruction fetch on #0008 may page in a peripheral ROM, ; e.g. the Sinclair Interface 1 ROM, to handle these commands. ; However that wasn't the plan. ; Development of this ROM continued for another three months until the cost @@ -6616,19 +6616,19 @@ L1793: JR L1725 ; to REPORT-Ob ; This produces an automatic listing in the upper screen. ;; AUTO-LIST -L1795: LD ($5C3F),SP ; save stack pointer in LIST_SP - LD (IY+$02),$10 ; update TV_FLAG set bit 3 +L1795: LD (#5C3F),SP ; save stack pointer in LIST_SP + LD (IY+#02),#10 ; update TV_FLAG set bit 3 CALL L0DAF ; routine CL-ALL. - SET 0,(IY+$02) ; update TV_FLAG - signal lower screen in use + SET 0,(IY+#02) ; update TV_FLAG - signal lower screen in use - LD B,(IY+$31) ; fetch DF_SZ to B. + LD B,(IY+#31) ; fetch DF_SZ to B. CALL L0E44 ; routine CL-LINE clears lower display ; preserving B. - RES 0,(IY+$02) ; update TV_FLAG - signal main screen in use - SET 0,(IY+$30) ; update FLAGS2 - signal unnecessary to + RES 0,(IY+#02) ; update TV_FLAG - signal main screen in use + SET 0,(IY+#30) ; update FLAGS2 - signal unnecessary to ; clear main screen. - LD HL,($5C49) ; fetch E_PPC current edit line to HL. - LD DE,($5C6C) ; fetch S_TOP to DE, the current top line + LD HL,(#5C49) ; fetch E_PPC current edit line to HL. + LD DE,(#5C6C) ; fetch S_TOP to DE, the current top line ; (initially zero) AND A ; prepare for true subtraction. SBC HL,DE ; subtract and @@ -6638,7 +6638,7 @@ L1795: LD ($5C3F),SP ; save stack pointer in LIST_SP PUSH DE ; save the top line number. CALL L196E ; routine LINE-ADDR gets address of E_PPC. - LD DE,$02C0 ; prepare known number of characters in + LD DE,#02C0 ; prepare known number of characters in ; the default upper screen. EX DE,HL ; offset to HL, program address to DE. SBC HL,DE ; subtract high value from low to obtain @@ -6661,7 +6661,7 @@ L17CE: PUSH BC ; save the result. INC HL ; number LD E,(HL) ; in DE. DEC HL ; adjust back to start. - LD ($5C6C),DE ; update S_TOP. + LD (#5C6C),DE ; update S_TOP. JR L17CE ; to AUTO-L-1 until estimate reached. ; --- @@ -6669,13 +6669,13 @@ L17CE: PUSH BC ; save the result. ; the jump was to here if S_TOP was greater than E_PPC ;; AUTO-L-2 -L17E1: LD ($5C6C),HL ; make S_TOP the same as E_PPC. +L17E1: LD (#5C6C),HL ; make S_TOP the same as E_PPC. ; continue here with valid starting point from above or good estimate ; from computation ;; AUTO-L-3 -L17E4: LD HL,($5C6C) ; fetch S_TOP line number to HL. +L17E4: LD HL,(#5C6C) ; fetch S_TOP line number to HL. CALL L196E ; routine LINE-ADDR gets address in HL. ; address of next in DE. JR Z,L17ED ; to AUTO-L-4 if line exists. @@ -6687,7 +6687,7 @@ L17ED: CALL L1833 ; routine LIST-ALL >>> ; The return will be to here if no scrolling occurred - RES 4,(IY+$02) ; update TV_FLAG - signal no auto listing. + RES 4,(IY+#02) ; update TV_FLAG - signal no auto listing. RET ; return. ; ------------ @@ -6696,7 +6696,7 @@ L17ED: CALL L1833 ; routine LIST-ALL >>> ; A short form of LIST #3. The listing goes to stream 3 - default printer. ;; LLIST -L17F5: LD A,$03 ; the usual stream for ZX Printer +L17F5: LD A,#03 ; the usual stream for ZX Printer JR L17FB ; forward to LIST-1 ; ----------- @@ -6708,10 +6708,10 @@ L17F5: LD A,$03 ; the usual stream for ZX Printer ; Just listing a line makes it the current edit line. ;; LIST -L17F9: LD A,$02 ; default is stream 2 - the upper screen. +L17F9: LD A,#02 ; default is stream 2 - the upper screen. ;; LIST-1 -L17FB: LD (IY+$02),$00 ; the TV_FLAG is initialized with bit 0 reset +L17FB: LD (IY+#02),#00 ; the TV_FLAG is initialized with bit 0 reset ; indicating upper screen in use. CALL L2530 ; routine SYNTAX-Z - checking syntax ? CALL NZ,L1601 ; routine CHAN-OPEN if in run-time. @@ -6722,10 +6722,10 @@ L17FB: LD (IY+$02),$00 ; the TV_FLAG is initialized with bit 0 reset RST 18H ; GET-CHAR - CP $3B ; is it ';' ? + CP #3B ; is it ';' ? JR Z,L1814 ; skip to LIST-2 if so. - CP $2C ; is it ',' ? + CP #2C ; is it ',' ? JR NZ,L181A ; forward to LIST-3 if neither separator. ; we have, say, LIST #15, and a number must follow the separator. @@ -6757,7 +6757,7 @@ L1822: CALL L1BEE ; routine CHECK-END quits if syntax OK >>> CALL L1E99 ; routine FIND-INT2 fetches the number ; from the calculator stack in run-time. LD A,B ; fetch high byte of line number and - AND $3F ; make less than $40 so that NEXT-ONE + AND #3F ; make less than #40 so that NEXT-ONE ; (from LINE-ADDR) doesn't lose context. ; Note. this is not satisfactory and the typo ; LIST 20000 will list an entirely different @@ -6767,14 +6767,14 @@ L1822: CALL L1BEE ; routine CHECK-END quits if syntax OK >>> LD H,A ; transfer the modified LD L,C ; line number to HL. - LD ($5C49),HL ; update E_PPC to new line number. + LD (#5C49),HL ; update E_PPC to new line number. CALL L196E ; routine LINE-ADDR gets the address of the ; line. ; This routine is called from AUTO-LIST ;; LIST-ALL -L1833: LD E,$01 ; signal current line not yet printed +L1833: LD E,#01 ; signal current line not yet printed ;; LIST-ALL-2 L1835: CALL L1855 ; routine OUT-LINE outputs a BASIC line @@ -6783,14 +6783,14 @@ L1835: CALL L1855 ; routine OUT-LINE outputs a BASIC line RST 10H ; PRINT-A prints the carriage return (in A) - BIT 4,(IY+$02) ; test TV_FLAG - automatic listing ? + BIT 4,(IY+#02) ; test TV_FLAG - automatic listing ? JR Z,L1835 ; back to LIST-ALL-2 if not ; (loop exit is via OUT-LINE) ; continue here if an automatic listing required. - LD A,($5C6B) ; fetch DF_SZ lower display file size. - SUB (IY+$4F) ; subtract S_POSN_hi ithe current line number. + LD A,(#5C6B) ; fetch DF_SZ lower display file size. + SUB (IY+#4F) ; subtract S_POSN_hi ithe current line number. JR NZ,L1835 ; back to LIST-ALL-2 if upper screen not full. XOR E ; A contains zero, E contains one if the @@ -6804,7 +6804,7 @@ L1835: CALL L1855 ; routine OUT-LINE outputs a BASIC line PUSH HL ; save the pointer address. PUSH DE ; save the E flag. - LD HL,$5C6C ; fetch S_TOP the rough estimate. + LD HL,#5C6C ; fetch S_TOP the rough estimate. CALL L190F ; routine LN-FETCH updates S_TOP with ; the number of the next line. POP DE ; restore the E flag. @@ -6819,20 +6819,20 @@ L1835: CALL L1855 ; routine OUT-LINE outputs a BASIC line ; and from ED-EDIT to 'sprint' the line to the edit buffer. ;; OUT-LINE -L1855: LD BC,($5C49) ; fetch E_PPC the current line which may be +L1855: LD BC,(#5C49) ; fetch E_PPC the current line which may be ; unchecked and not exist. CALL L1980 ; routine CP-LINES finds match or line after. - LD D,$3E ; prepare cursor '>' in D. + LD D,#3E ; prepare cursor '>' in D. JR Z,L1865 ; to OUT-LINE1 if matched or line after. - LD DE,$0000 ; put zero in D, to suppress line cursor. + LD DE,#0000 ; put zero in D, to suppress line cursor. RL E ; pick up carry in E if line before current ; leave E zero if same or after. ;; OUT-LINE1 -L1865: LD (IY+$2D),E ; save flag in BREG which is spare. +L1865: LD (IY+#2D),E ; save flag in BREG which is spare. LD A,(HL) ; get high byte of line number. - CP $40 ; is it too high ($2F is maximum possible) ? + CP #40 ; is it too high (#2F is maximum possible) ? POP BC ; drop the return address and RET NC ; make an early return if so >>> @@ -6842,7 +6842,7 @@ L1865: LD (IY+$2D),E ; save flag in BREG which is spare. INC HL ; skip low number byte. INC HL ; and the two INC HL ; length bytes. - RES 0,(IY+$01) ; update FLAGS - signal leading space required. + RES 0,(IY+#01) ; update FLAGS - signal leading space required. LD A,D ; fetch the cursor. AND A ; test for zero. JR Z,L1881 ; to OUT-LINE3 if zero. @@ -6853,28 +6853,28 @@ L1865: LD (IY+$2D),E ; save flag in BREG which is spare. ; this entry point is called from ED-COPY ;; OUT-LINE2 -L187D: SET 0,(IY+$01) ; update FLAGS - suppress leading space. +L187D: SET 0,(IY+#01) ; update FLAGS - suppress leading space. ;; OUT-LINE3 L1881: PUSH DE ; save flag E for a return value. EX DE,HL ; save HL address in DE. - RES 2,(IY+$30) ; update FLAGS2 - signal NOT in QUOTES. + RES 2,(IY+#30) ; update FLAGS2 - signal NOT in QUOTES. - LD HL,$5C3B ; point to FLAGS. + LD HL,#5C3B ; point to FLAGS. RES 2,(HL) ; signal 'K' mode. (starts before keyword) - BIT 5,(IY+$37) ; test FLAGX - input mode ? + BIT 5,(IY+#37) ; test FLAGX - input mode ? JR Z,L1894 ; forward to OUT-LINE4 if not. SET 2,(HL) ; signal 'L' mode. (used for input) ;; OUT-LINE4 -L1894: LD HL,($5C5F) ; fetch X_PTR - possibly the error pointer +L1894: LD HL,(#5C5F) ; fetch X_PTR - possibly the error pointer ; address. AND A ; clear the carry flag. SBC HL,DE ; test if an error address has been reached. JR NZ,L18A1 ; forward to OUT-LINE5 if not. - LD A,$3F ; load A with '?' the error marker. + LD A,#3F ; load A with '?' the error marker. CALL L18C1 ; routine OUT-FLASH to print flashing marker. ;; OUT-LINE5 @@ -6885,7 +6885,7 @@ L18A1: CALL L18E1 ; routine OUT-CURS will print the cursor if CALL L18B6 ; routine NUMBER skips a hidden floating ; point number if present. INC HL ; now increment the pointer. - CP $0D ; is character end-of-line ? + CP #0D ; is character end-of-line ? JR Z,L18B4 ; to OUT-LINE6, if so, as line is finished. EX DE,HL ; save the pointer in DE. @@ -6898,7 +6898,7 @@ L18A1: CALL L18E1 ; routine OUT-CURS will print the cursor if ;; OUT-LINE6 L18B4: POP DE ; bring back the flag E, zero if current ; line printed else 1 if still to print. - RET ; return with A holding $0D + RET ; return with A holding #0D ; ------------------------- ; Check for a number marker @@ -6913,7 +6913,7 @@ L18B4: POP DE ; bring back the flag E, zero if current ; and may mask old 5-byte string parameters. ;; NUMBER -L18B6: CP $0E ; character fourteen ? +L18B6: CP #0E ; character fourteen ? RET NZ ; return if not. INC HL ; skip the character @@ -6931,31 +6931,31 @@ L18B6: CP $0E ; character fourteen ? ; This subroutine is called from OUT-LINE to print a flashing error ; marker '?' or from the next routine to print a flashing cursor e.g. 'L'. ; However, this only gets called from OUT-LINE when printing the edit line -; or the input buffer to the lower screen so a direct call to $09F4 can +; or the input buffer to the lower screen so a direct call to #09F4 can ; be used, even though out-line outputs to other streams. ; In fact the alternate set is used for the whole routine. ;; OUT-FLASH L18C1: EXX ; switch in alternate set - LD HL,($5C8F) ; fetch L = ATTR_T, H = MASK-T + LD HL,(#5C8F) ; fetch L = ATTR_T, H = MASK-T PUSH HL ; save masks. RES 7,H ; reset flash mask bit so active. SET 7,L ; make attribute FLASH. - LD ($5C8F),HL ; resave ATTR_T and MASK-T + LD (#5C8F),HL ; resave ATTR_T and MASK-T - LD HL,$5C91 ; address P_FLAG + LD HL,#5C91 ; address P_FLAG LD D,(HL) ; fetch to D PUSH DE ; and save. - LD (HL),$00 ; clear inverse, over, ink/paper 9 + LD (HL),#00 ; clear inverse, over, ink/paper 9 CALL L09F4 ; routine PRINT-OUT outputs character ; without the need to vector via RST 10. POP HL ; pop P_FLAG to H. - LD (IY+$57),H ; and restore system variable P_FLAG. + LD (IY+#57),H ; and restore system variable P_FLAG. POP HL ; restore temporary masks - LD ($5C8F),HL ; and restore system variables ATTR_T/MASK_T + LD (#5C8F),HL ; and restore system variables ATTR_T/MASK_T EXX ; switch back to main set RET ; return @@ -6971,7 +6971,7 @@ L18C1: EXX ; switch in alternate set ; performs another very important function also. ;; OUT-CURS -L18E1: LD HL,($5C5B) ; fetch K_CUR the current cursor address +L18E1: LD HL,(#5C5B) ; fetch K_CUR the current cursor address AND A ; prepare for true subtraction. SBC HL,DE ; test against pointer address in DE and RET NZ ; return if not at exact position. @@ -6979,11 +6979,11 @@ L18E1: LD HL,($5C5B) ; fetch K_CUR the current cursor address ; the value of MODE, maintained by KEY-INPUT, is tested and if non-zero ; then this value 'E' or 'G' will take precedence. - LD A,($5C41) ; fetch MODE 0='KLC', 1='E', 2='G'. + LD A,(#5C41) ; fetch MODE 0='KLC', 1='E', 2='G'. RLC A ; double the value and set flags. JR Z,L18F3 ; to OUT-C-1 if still zero ('KLC'). - ADD A,$43 ; add 'C' - will become 'E' if originally 1 + ADD A,#43 ; add 'C' - will become 'E' if originally 1 ; or 'G' if originally 2. JR L1909 ; forward to OUT-C-2 to print. @@ -6996,9 +6996,9 @@ L18E1: LD HL,($5C5B) ; fetch K_CUR the current cursor address ; to let the interrupt routine know how to decode the next key. ;; OUT-C-1 -L18F3: LD HL,$5C3B ; Address FLAGS +L18F3: LD HL,#5C3B ; Address FLAGS RES 3,(HL) ; signal 'K' mode initially. - LD A,$4B ; prepare letter 'K'. + LD A,#4B ; prepare letter 'K'. BIT 2,(HL) ; test FLAGS - was the ; previous main character ':' or 'THEN' ? JR Z,L1909 ; forward to OUT-C-2 if so to print. @@ -7007,11 +7007,11 @@ L18F3: LD HL,$5C3B ; Address FLAGS ; Note. transient bit has been made permanent. INC A ; augment from 'K' to 'L'. - BIT 3,(IY+$30) ; test FLAGS2 - consider caps lock ? + BIT 3,(IY+#30) ; test FLAGS2 - consider caps lock ? ; which is maintained by KEY-INPUT. JR Z,L1909 ; forward to OUT-C-2 if not set to print. - LD A,$43 ; alter 'L' to 'C'. + LD A,#43 ; alter 'L' to 'C'. ;; OUT-C-2 L1909: PUSH DE ; save address pointer but OK as OUT-FLASH @@ -7046,7 +7046,7 @@ L190F: LD E,(HL) ; fetch low byte ; This entry point is from the ED-UP with HL addressing E_PPC_hi ;; LN-STORE -L191C: BIT 5,(IY+$37) ; test FLAGX - input mode ? +L191C: BIT 5,(IY+#37) ; test FLAGX - input mode ? RET NZ ; return if so. ; Note. above already checked by ED-UP/ED-DOWN. @@ -7067,12 +7067,12 @@ L191C: BIT 5,(IY+$37) ; test FLAGX - input mode ? ;; OUT-SP-2 L1925: LD A,E ; will be space if OUT-CODE not yet called. - ; or $FF if spaces are suppressed. - ; else $30 ('0'). + ; or #FF if spaces are suppressed. + ; else #30 ('0'). ; (from the first instruction at OUT-CODE) ; this guy is just too clever. AND A ; test bit 7 of A. - RET M ; return if $FF, as leading spaces not + RET M ; return if #FF, as leading spaces not ; required. This is set when printing line ; number and statement in MAIN-5. @@ -7109,21 +7109,21 @@ L1937: CALL L2D1B ; routine NUMERIC tests if it is a digit ? ; changing mode. Will be 'K' mode if digits ; are at beginning of edit line. - CP $21 ; less than quote character ? + CP #21 ; less than quote character ? JR C,L196C ; to OUT-CH-3 to output controls and space. - RES 2,(IY+$01) ; initialize FLAGS to 'K' mode and leave + RES 2,(IY+#01) ; initialize FLAGS to 'K' mode and leave ; unchanged if this character would precede ; a keyword. - CP $CB ; is character 'THEN' token ? + CP #CB ; is character 'THEN' token ? JR Z,L196C ; to OUT-CH-3 to output if so. - CP $3A ; is it ':' ? + CP #3A ; is it ':' ? JR NZ,L195A ; to OUT-CH-1 if not statement separator ; to change mode back to 'L'. - BIT 5,(IY+$37) ; FLAGX - Input Mode ?? + BIT 5,(IY+#37) ; FLAGX - Input Mode ?? JR NZ,L1968 ; to OUT-CH-2 if in input as no statements. ; Note. this check should seemingly be at ; the start. Commands seem inappropriate in @@ -7131,7 +7131,7 @@ L1937: CALL L2D1B ; routine NUMERIC tests if it is a digit ? ; checker anyway. ; unless INPUT LINE is being used. - BIT 2,(IY+$30) ; test FLAGS2 - is the ':' within quotes ? + BIT 2,(IY+#30) ; test FLAGS2 - is the ':' within quotes ? JR Z,L196C ; to OUT-CH-3 if ':' is outside quoted text. JR L1968 ; to OUT-CH-2 as ':' is within quotes @@ -7139,17 +7139,17 @@ L1937: CALL L2D1B ; routine NUMERIC tests if it is a digit ? ; --- ;; OUT-CH-1 -L195A: CP $22 ; is it quote character '"' ? +L195A: CP #22 ; is it quote character '"' ? JR NZ,L1968 ; to OUT-CH-2 with others to set 'L' mode. PUSH AF ; save character. - LD A,($5C6A) ; fetch FLAGS2. - XOR $04 ; toggle the quotes flag. - LD ($5C6A),A ; update FLAGS2 + LD A,(#5C6A) ; fetch FLAGS2. + XOR #04 ; toggle the quotes flag. + LD (#5C6A),A ; update FLAGS2 POP AF ; and restore character. ;; OUT-CH-2 -L1968: SET 2,(IY+$01) ; update FLAGS - signal L mode if the cursor +L1968: SET 2,(IY+#01) ; update FLAGS - signal L mode if the cursor ; is next. ;; OUT-CH-3 @@ -7166,7 +7166,7 @@ L196C: RST 10H ; PRINT-A vectors the character to ;; LINE-ADDR L196E: PUSH HL ; save line number in HL register - LD HL,($5C53) ; fetch start of program from PROG + LD HL,(#5C53) ; fetch start of program from PROG LD D,H ; transfer address to LD E,L ; the DE register pair. @@ -7219,8 +7219,8 @@ L1988: INC HL ; ; -> entry point. ;; EACH-STMT -L198B: LD ($5C5D),HL ; save HL in CH_ADD - LD C,$00 ; initialize quotes flag +L198B: LD (#5C5D),HL ; save HL in CH_ADD + LD C,#00 ; initialize quotes flag ;; EACH-S-1 L1990: DEC D ; decrease statement count @@ -7242,17 +7242,17 @@ L1998: INC HL ; next address ;; EACH-S-3 L199A: CALL L18B6 ; routine NUMBER skips if number marker - LD ($5C5D),HL ; save in CH_ADD - CP $22 ; is it quotes '"' ? + LD (#5C5D),HL ; save in CH_ADD + CP #22 ; is it quotes '"' ? JR NZ,L19A5 ; to EACH-S-4 if not DEC C ; toggle bit 0 of C ;; EACH-S-4 -L19A5: CP $3A ; is it ':' +L19A5: CP #3A ; is it ':' JR Z,L19AD ; to EACH-S-5 - CP $CB ; 'THEN' + CP #CB ; 'THEN' JR NZ,L19B1 ; to EACH-S-6 ;; EACH-S-5 @@ -7260,7 +7260,7 @@ L19AD: BIT 0,C ; is it in quotes JR Z,L1990 ; to EACH-S-1 if not ;; EACH-S-6 -L19B1: CP $0D ; end of line ? +L19B1: CP #0D ; end of line ? JR NZ,L1998 ; to EACH-S-2 DEC D ; decrease the statement counter @@ -7274,8 +7274,8 @@ L19B1: CP $0D ; end of line ? ; ZX Spectrum BASIC Programming by Steven Vickers 1982. ; It is bits 7-5 of the first character of a variable that allow ; the six types to be distinguished. Bits 4-0 are the reduced letter. -; So any variable name is higher that $3F and can be distinguished -; also from the variables area end-marker $80. +; So any variable name is higher that #3F and can be distinguished +; also from the variables area end-marker #80. ; ; 76543210 meaning brief outline of format. ; -------- ------------------------ ----------------------- @@ -7303,7 +7303,7 @@ L19B1: CP $0D ; end of line ? ;; NEXT-ONE L19B8: PUSH HL ; save the pointer address. LD A,(HL) ; get first byte. - CP $40 ; compare with upper limit for line numbers. + CP #40 ; compare with upper limit for line numbers. JR C,L19D5 ; forward to NEXT-O-3 if within BASIC area. ; the continuation here is for the next variable unless the supplied @@ -7319,11 +7319,11 @@ L19B8: PUSH HL ; save the pointer address. ; it remains set for for-next loop variables. ;; NEXT-O-1 -L19C7: LD BC,$0005 ; set BC to 5 for floating point number +L19C7: LD BC,#0005 ; set BC to 5 for floating point number JR NC,L19CE ; forward to NEXT-O-2 if not a for/next ; variable. - LD C,$12 ; set BC to eighteen locations. + LD C,#12 ; set BC to eighteen locations. ; value, limit, step, line and statement. ; now deal with long-named variables @@ -7427,19 +7427,19 @@ L19E8: PUSH BC ; ; arises whereby the Spectrum becomes locked with no means of reclaiming space. ;; E-LINE-NO -L19FB: LD HL,($5C59) ; load HL from system variable E_LINE. +L19FB: LD HL,(#5C59) ; load HL from system variable E_LINE. DEC HL ; decrease so that NEXT_CHAR can be used ; without skipping the first digit. - LD ($5C5D),HL ; store in the system variable CH_ADD. + LD (#5C5D),HL ; store in the system variable CH_ADD. RST 20H ; NEXT-CHAR skips any noise and white-space ; to point exactly at the first digit. - LD HL,$5C92 ; use MEM-0 as a temporary calculator stack + LD HL,#5C92 ; use MEM-0 as a temporary calculator stack ; an overhead of three locations are needed. - LD ($5C65),HL ; set new STKEND. + LD (#5C65),HL ; set new STKEND. CALL L2D3B ; routine INT-TO-FP will read digits till ; a non-digit found. @@ -7448,14 +7448,14 @@ L19FB: LD HL,($5C59) ; load HL from system variable E_LINE. JR C,L1A15 ; forward to E-L-1 if overflow i.e. > 65535. ; 'Nonsense in BASIC' - LD HL,$D8F0 ; load HL with value -9999 + LD HL,#D8F0 ; load HL with value -9999 ADD HL,BC ; add to line number in BC ;; E-L-1 L1A15: JP C,L1C8A ; to REPORT-C 'Nonsense in BASIC' if over. ; Note. As ERR_SP points to ED_ERROR ; the report is never produced although - ; the RST $08 will update X_PTR leading to + ; the RST #08 will update X_PTR leading to ; the error marker being displayed when ; the ED_LOOP is reiterated. ; in fact, since it is immediately @@ -7489,7 +7489,7 @@ L1A1B: PUSH DE ; save the LD H,B ; transfer the LD L,C ; number to HL. - LD E,$FF ; signal 'no leading zeros'. + LD E,#FF ; signal 'no leading zeros'. JR L1A30 ; forward to continue at OUT-NUM-3 ; --- @@ -7503,14 +7503,14 @@ L1A28: PUSH DE ; save flags LD E,(HL) ; low byte to E PUSH HL ; save pointer EX DE,HL ; transfer number to HL - LD E,$20 ; signal 'output leading spaces' + LD E,#20 ; signal 'output leading spaces' ;; OUT-NUM-3 -L1A30: LD BC,$FC18 ; value -1000 +L1A30: LD BC,#FC18 ; value -1000 CALL L192A ; routine OUT-SP-NO outputs space or number - LD BC,$FF9C ; value -100 + LD BC,#FF9C ; value -100 CALL L192A ; routine OUT-SP-NO - LD C,$F6 ; value -10 ( B is still $FF ) + LD C,#F6 ; value -10 ( B is still #FF ) CALL L192A ; routine OUT-SP-NO LD A,L ; remainder to A. @@ -7530,8 +7530,8 @@ L1A42: CALL L15EF ; routine OUT-CODE for final digit. ; ---------------- ; The offset table ; ---------------- -; The BASIC interpreter has found a command code $CE - $FF -; which is then reduced to range $00 - $31 and added to the base address +; The BASIC interpreter has found a command code #CE - #FF +; which is then reduced to range #00 - #31 and added to the base address ; of this table to give the address of an offset which, when added to ; the offset therein, gives the location in the following parameter table ; where a list of class codes, separators and addresses relevant to the @@ -7609,262 +7609,262 @@ L1A48: DEFB L1AF9 - $ ; B1 offset to Address: P-DEF-FN ; is rather simple e.g. MOVE "M1","M2" ;; P-LET -L1A7A: DEFB $01 ; Class-01 - A variable is required. - DEFB $3D ; Separator: '=' - DEFB $02 ; Class-02 - An expression, numeric or string, +L1A7A: DEFB #01 ; Class-01 - A variable is required. + DEFB #3D ; Separator: '=' + DEFB #02 ; Class-02 - An expression, numeric or string, ; must follow. ;; P-GO-TO -L1A7D: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1E67 ; Address: $1E67; Address: GO-TO +L1A7D: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1E67 ; Address: #1E67; Address: GO-TO ;; P-IF -L1A81: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $CB ; Separator: 'THEN' - DEFB $05 ; Class-05 - Variable syntax checked +L1A81: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #CB ; Separator: 'THEN' + DEFB #05 ; Class-05 - Variable syntax checked ; by routine. - DEFW L1CF0 ; Address: $1CF0; Address: IF + DEFW L1CF0 ; Address: #1CF0; Address: IF ;; P-GO-SUB -L1A86: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1EED ; Address: $1EED; Address: GO-SUB +L1A86: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1EED ; Address: #1EED; Address: GO-SUB ;; P-STOP -L1A8A: DEFB $00 ; Class-00 - No further operands. - DEFW L1CEE ; Address: $1CEE; Address: STOP +L1A8A: DEFB #00 ; Class-00 - No further operands. + DEFW L1CEE ; Address: #1CEE; Address: STOP ;; P-RETURN -L1A8D: DEFB $00 ; Class-00 - No further operands. - DEFW L1F23 ; Address: $1F23; Address: RETURN +L1A8D: DEFB #00 ; Class-00 - No further operands. + DEFW L1F23 ; Address: #1F23; Address: RETURN ;; P-FOR -L1A90: DEFB $04 ; Class-04 - A single character variable must +L1A90: DEFB #04 ; Class-04 - A single character variable must ; follow. - DEFB $3D ; Separator: '=' - DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $CC ; Separator: 'TO' - DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $05 ; Class-05 - Variable syntax checked + DEFB #3D ; Separator: '=' + DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #CC ; Separator: 'TO' + DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #05 ; Class-05 - Variable syntax checked ; by routine. - DEFW L1D03 ; Address: $1D03; Address: FOR + DEFW L1D03 ; Address: #1D03; Address: FOR ;; P-NEXT -L1A98: DEFB $04 ; Class-04 - A single character variable must +L1A98: DEFB #04 ; Class-04 - A single character variable must ; follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1DAB ; Address: $1DAB; Address: NEXT + DEFB #00 ; Class-00 - No further operands. + DEFW L1DAB ; Address: #1DAB; Address: NEXT ;; P-PRINT -L1A9C: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1A9C: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1FCD ; Address: $1FCD; Address: PRINT + DEFW L1FCD ; Address: #1FCD; Address: PRINT ;; P-INPUT -L1A9F: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1A9F: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L2089 ; Address: $2089; Address: INPUT + DEFW L2089 ; Address: #2089; Address: INPUT ;; P-DIM -L1AA2: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AA2: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L2C02 ; Address: $2C02; Address: DIM + DEFW L2C02 ; Address: #2C02; Address: DIM ;; P-REM -L1AA5: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AA5: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1BB2 ; Address: $1BB2; Address: REM + DEFW L1BB2 ; Address: #1BB2; Address: REM ;; P-NEW -L1AA8: DEFB $00 ; Class-00 - No further operands. - DEFW L11B7 ; Address: $11B7; Address: NEW +L1AA8: DEFB #00 ; Class-00 - No further operands. + DEFW L11B7 ; Address: #11B7; Address: NEW ;; P-RUN -L1AAB: DEFB $03 ; Class-03 - A numeric expression may follow +L1AAB: DEFB #03 ; Class-03 - A numeric expression may follow ; else default to zero. - DEFW L1EA1 ; Address: $1EA1; Address: RUN + DEFW L1EA1 ; Address: #1EA1; Address: RUN ;; P-LIST -L1AAE: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AAE: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L17F9 ; Address: $17F9; Address: LIST + DEFW L17F9 ; Address: #17F9; Address: LIST ;; P-POKE -L1AB1: DEFB $08 ; Class-08 - Two comma-separated numeric +L1AB1: DEFB #08 ; Class-08 - Two comma-separated numeric ; expressions required. - DEFB $00 ; Class-00 - No further operands. - DEFW L1E80 ; Address: $1E80; Address: POKE + DEFB #00 ; Class-00 - No further operands. + DEFW L1E80 ; Address: #1E80; Address: POKE ;; P-RANDOM -L1AB5: DEFB $03 ; Class-03 - A numeric expression may follow +L1AB5: DEFB #03 ; Class-03 - A numeric expression may follow ; else default to zero. - DEFW L1E4F ; Address: $1E4F; Address: RANDOMIZE + DEFW L1E4F ; Address: #1E4F; Address: RANDOMIZE ;; P-CONT -L1AB8: DEFB $00 ; Class-00 - No further operands. - DEFW L1E5F ; Address: $1E5F; Address: CONTINUE +L1AB8: DEFB #00 ; Class-00 - No further operands. + DEFW L1E5F ; Address: #1E5F; Address: CONTINUE ;; P-CLEAR -L1ABB: DEFB $03 ; Class-03 - A numeric expression may follow +L1ABB: DEFB #03 ; Class-03 - A numeric expression may follow ; else default to zero. - DEFW L1EAC ; Address: $1EAC; Address: CLEAR + DEFW L1EAC ; Address: #1EAC; Address: CLEAR ;; P-CLS -L1ABE: DEFB $00 ; Class-00 - No further operands. - DEFW L0D6B ; Address: $0D6B; Address: CLS +L1ABE: DEFB #00 ; Class-00 - No further operands. + DEFW L0D6B ; Address: #0D6B; Address: CLS ;; P-PLOT -L1AC1: DEFB $09 ; Class-09 - Two comma-separated numeric +L1AC1: DEFB #09 ; Class-09 - Two comma-separated numeric ; expressions required with optional colour ; items. - DEFB $00 ; Class-00 - No further operands. - DEFW L22DC ; Address: $22DC; Address: PLOT + DEFB #00 ; Class-00 - No further operands. + DEFW L22DC ; Address: #22DC; Address: PLOT ;; P-PAUSE -L1AC5: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1F3A ; Address: $1F3A; Address: PAUSE +L1AC5: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1F3A ; Address: #1F3A; Address: PAUSE ;; P-READ -L1AC9: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AC9: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1DED ; Address: $1DED; Address: READ + DEFW L1DED ; Address: #1DED; Address: READ ;; P-DATA -L1ACC: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1ACC: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1E27 ; Address: $1E27; Address: DATA + DEFW L1E27 ; Address: #1E27; Address: DATA ;; P-RESTORE -L1ACF: DEFB $03 ; Class-03 - A numeric expression may follow +L1ACF: DEFB #03 ; Class-03 - A numeric expression may follow ; else default to zero. - DEFW L1E42 ; Address: $1E42; Address: RESTORE + DEFW L1E42 ; Address: #1E42; Address: RESTORE ;; P-DRAW -L1AD2: DEFB $09 ; Class-09 - Two comma-separated numeric +L1AD2: DEFB #09 ; Class-09 - Two comma-separated numeric ; expressions required with optional colour ; items. - DEFB $05 ; Class-05 - Variable syntax checked + DEFB #05 ; Class-05 - Variable syntax checked ; by routine. - DEFW L2382 ; Address: $2382; Address: DRAW + DEFW L2382 ; Address: #2382; Address: DRAW ;; P-COPY -L1AD6: DEFB $00 ; Class-00 - No further operands. - DEFW L0EAC ; Address: $0EAC; Address: COPY +L1AD6: DEFB #00 ; Class-00 - No further operands. + DEFW L0EAC ; Address: #0EAC; Address: COPY ;; P-LPRINT -L1AD9: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AD9: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1FC9 ; Address: $1FC9; Address: LPRINT + DEFW L1FC9 ; Address: #1FC9; Address: LPRINT ;; P-LLIST -L1ADC: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1ADC: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L17F5 ; Address: $17F5; Address: LLIST + DEFW L17F5 ; Address: #17F5; Address: LLIST ;; P-SAVE -L1ADF: DEFB $0B ; Class-0B - Offset address converted to tape +L1ADF: DEFB #0B ; Class-0B - Offset address converted to tape ; command. ;; P-LOAD -L1AE0: DEFB $0B ; Class-0B - Offset address converted to tape +L1AE0: DEFB #0B ; Class-0B - Offset address converted to tape ; command. ;; P-VERIFY -L1AE1: DEFB $0B ; Class-0B - Offset address converted to tape +L1AE1: DEFB #0B ; Class-0B - Offset address converted to tape ; command. ;; P-MERGE -L1AE2: DEFB $0B ; Class-0B - Offset address converted to tape +L1AE2: DEFB #0B ; Class-0B - Offset address converted to tape ; command. ;; P-BEEP -L1AE3: DEFB $08 ; Class-08 - Two comma-separated numeric +L1AE3: DEFB #08 ; Class-08 - Two comma-separated numeric ; expressions required. - DEFB $00 ; Class-00 - No further operands. - DEFW L03F8 ; Address: $03F8; Address: BEEP + DEFB #00 ; Class-00 - No further operands. + DEFW L03F8 ; Address: #03F8; Address: BEEP ;; P-CIRCLE -L1AE7: DEFB $09 ; Class-09 - Two comma-separated numeric +L1AE7: DEFB #09 ; Class-09 - Two comma-separated numeric ; expressions required with optional colour ; items. - DEFB $05 ; Class-05 - Variable syntax checked + DEFB #05 ; Class-05 - Variable syntax checked ; by routine. - DEFW L2320 ; Address: $2320; Address: CIRCLE + DEFW L2320 ; Address: #2320; Address: CIRCLE ;; P-INK -L1AEB: DEFB $07 ; Class-07 - Offset address is converted to +L1AEB: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-PAPER -L1AEC: DEFB $07 ; Class-07 - Offset address is converted to +L1AEC: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-FLASH -L1AED: DEFB $07 ; Class-07 - Offset address is converted to +L1AED: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-BRIGHT -L1AEE: DEFB $07 ; Class-07 - Offset address is converted to +L1AEE: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-INVERSE -L1AEF: DEFB $07 ; Class-07 - Offset address is converted to +L1AEF: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-OVER -L1AF0: DEFB $07 ; Class-07 - Offset address is converted to +L1AF0: DEFB #07 ; Class-07 - Offset address is converted to ; colour code. ;; P-OUT -L1AF1: DEFB $08 ; Class-08 - Two comma-separated numeric +L1AF1: DEFB #08 ; Class-08 - Two comma-separated numeric ; expressions required. - DEFB $00 ; Class-00 - No further operands. - DEFW L1E7A ; Address: $1E7A; Address: OUT + DEFB #00 ; Class-00 - No further operands. + DEFW L1E7A ; Address: #1E7A; Address: OUT ;; P-BORDER -L1AF5: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L2294 ; Address: $2294; Address: BORDER +L1AF5: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L2294 ; Address: #2294; Address: BORDER ;; P-DEF-FN -L1AF9: DEFB $05 ; Class-05 - Variable syntax checked entirely +L1AF9: DEFB #05 ; Class-05 - Variable syntax checked entirely ; by routine. - DEFW L1F60 ; Address: $1F60; Address: DEF-FN + DEFW L1F60 ; Address: #1F60; Address: DEF-FN ;; P-OPEN -L1AFC: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $2C ; Separator: ',' see Footnote * - DEFB $0A ; Class-0A - A string expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1736 ; Address: $1736; Address: OPEN +L1AFC: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #2C ; Separator: ',' see Footnote * + DEFB #0A ; Class-0A - A string expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1736 ; Address: #1736; Address: OPEN ;; P-CLOSE -L1B02: DEFB $06 ; Class-06 - A numeric expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L16E5 ; Address: $16E5; Address: CLOSE +L1B02: DEFB #06 ; Class-06 - A numeric expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L16E5 ; Address: #16E5; Address: CLOSE ;; P-FORMAT -L1B06: DEFB $0A ; Class-0A - A string expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1793 ; Address: $1793; Address: CAT-ETC +L1B06: DEFB #0A ; Class-0A - A string expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1793 ; Address: #1793; Address: CAT-ETC ;; P-MOVE -L1B0A: DEFB $0A ; Class-0A - A string expression must follow. - DEFB $2C ; Separator: ',' - DEFB $0A ; Class-0A - A string expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1793 ; Address: $1793; Address: CAT-ETC +L1B0A: DEFB #0A ; Class-0A - A string expression must follow. + DEFB #2C ; Separator: ',' + DEFB #0A ; Class-0A - A string expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1793 ; Address: #1793; Address: CAT-ETC ;; P-ERASE -L1B10: DEFB $0A ; Class-0A - A string expression must follow. - DEFB $00 ; Class-00 - No further operands. - DEFW L1793 ; Address: $1793; Address: CAT-ETC +L1B10: DEFB #0A ; Class-0A - A string expression must follow. + DEFB #00 ; Class-00 - No further operands. + DEFW L1793 ; Address: #1793; Address: CAT-ETC ;; P-CAT -L1B14: DEFB $00 ; Class-00 - No further operands. - DEFW L1793 ; Address: $1793; Address: CAT-ETC +L1B14: DEFB #00 ; Class-00 - No further operands. + DEFW L1793 ; Address: #1793; Address: CAT-ETC ; * Note that a comma is required as a separator with the OPEN command ; but the Interface 1 programmers relaxed this allowing ';' as an @@ -7880,14 +7880,14 @@ L1B14: DEFB $00 ; Class-00 - No further operands. ; requires checking. ;; LINE-SCAN -L1B17: RES 7,(IY+$01) ; update FLAGS - signal checking syntax +L1B17: RES 7,(IY+#01) ; update FLAGS - signal checking syntax CALL L19FB ; routine E-LINE-NO >> ; fetches the line number if in range. XOR A ; clear the accumulator. - LD ($5C47),A ; set statement number SUBPPC to zero. - DEC A ; set accumulator to $FF. - LD ($5C3A),A ; set ERR_NR to 'OK' - 1. + LD (#5C47),A ; set statement number SUBPPC to zero. + DEC A ; set accumulator to #FF. + LD (#5C3A),A ; set ERR_NR to 'OK' - 1. JR L1B29 ; forward to continue at STMT-L-1. ; -------------- @@ -7903,20 +7903,20 @@ L1B28: RST 20H ; NEXT-CHAR ;; STMT-L-1 L1B29: CALL L16BF ; routine SET-WORK clears workspace etc. - INC (IY+$0D) ; increment statement number SUBPPC + INC (IY+#0D) ; increment statement number SUBPPC JP M,L1C8A ; to REPORT-C to raise ; 'Nonsense in BASIC' if over 127. RST 18H ; GET-CHAR - LD B,$00 ; set B to zero for later indexing. + LD B,#00 ; set B to zero for later indexing. ; early so any other reason ??? - CP $0D ; is character carriage return ? + CP #0D ; is character carriage return ? ; i.e. an empty statement. JR Z,L1BB3 ; forward to LINE-END if so. - CP $3A ; is it statement end marker ':' ? + CP #3A ; is it statement end marker ':' ? ; i.e. another type of empty statement. JR Z,L1B28 ; back to STMT-LOOP if so. @@ -7928,7 +7928,7 @@ L1B29: CALL L16BF ; routine SET-WORK clears workspace etc. RST 20H ; NEXT-CHAR to advance pointer LD A,C ; restore current character - SUB $CE ; subtract 'DEF FN' - first command + SUB #CE ; subtract 'DEF FN' - first command JP C,L1C8A ; jump to REPORT-C if less than a command ; raising ; 'Nonsense in BASIC' @@ -7948,7 +7948,7 @@ L1B29: CALL L16BF ; routine SET-WORK clears workspace etc. ; ;; SCAN-LOOP -L1B52: LD HL,($5C74) ; fetch temporary address from T_ADDR +L1B52: LD HL,(#5C74) ; fetch temporary address from T_ADDR ; during subsequent loops. ; -> the initial entry point with HL addressing start of syntax table entry. @@ -7956,17 +7956,17 @@ L1B52: LD HL,($5C74) ; fetch temporary address from T_ADDR ;; GET-PARAM L1B55: LD A,(HL) ; pick up the parameter. INC HL ; address next one. - LD ($5C74),HL ; save pointer in system variable T_ADDR + LD (#5C74),HL ; save pointer in system variable T_ADDR LD BC,L1B52 ; address: SCAN-LOOP PUSH BC ; is now pushed on stack as looping address. LD C,A ; store parameter in C. - CP $20 ; is it greater than ' ' ? + CP #20 ; is it greater than ' ' ? JR NC,L1B6F ; forward to SEPARATOR to check that correct ; separator appears in statement if so. LD HL,L1C01 ; address: class-tbl. - LD B,$00 ; prepare to index into the class table. + LD B,#00 ; prepare to index into the class table. ADD HL,BC ; index to find displacement to routine. LD C,(HL) ; displacement to BC ADD HL,BC ; add to address the CLASS routine. @@ -8013,7 +8013,7 @@ L1B76: CALL L1F54 ; routine BREAK-KEY is tested after every ;; REPORT-L L1B7B: RST 08H ; ERROR-1 - DEFB $14 ; Error Report: BREAK into program + DEFB #14 ; Error Report: BREAK into program ;; STMT-R-1 L1B7D: CALL L3B4D ; Spectrum 128 patch @@ -8021,7 +8021,7 @@ L1B7D: CALL L3B4D ; Spectrum 128 patch L1B81: JR NZ,L1BF4 ; forward to STMT-NEXT if a program line. - LD HL,($5C42) ; fetch line number from NEWPPC + LD HL,(#5C42) ; fetch line number from NEWPPC BIT 7,H ; will be set if minus two - direct command(s) JR Z,L1B9E ; forward to LINE-NEW if a jump is to be ; made to a new program line/statement. @@ -8033,13 +8033,13 @@ L1B81: JR NZ,L1BF4 ; forward to STMT-NEXT if a program line. ; the next statement of a direct command is to be considered. ;; LINE-RUN -L1B8A: LD HL,$FFFE ; The dummy value minus two - LD ($5C45),HL ; is set/reset as line number in PPC. - LD HL,($5C61) ; point to end of line + 1 - WORKSP. - DEC HL ; now point to $80 end-marker. - LD DE,($5C59) ; address the start of line E_LINE. +L1B8A: LD HL,#FFFE ; The dummy value minus two + LD (#5C45),HL ; is set/reset as line number in PPC. + LD HL,(#5C61) ; point to end of line + 1 - WORKSP. + DEC HL ; now point to #80 end-marker. + LD DE,(#5C59) ; address the start of line E_LINE. DEC DE ; now location before - for GET-CHAR. - LD A,($5C44) ; load statement to A from NSPPC. + LD A,(#5C44) ; load statement to A from NSPPC. JR L1BD1 ; forward to NEXT-LINE. ; ------------------------------ @@ -8052,7 +8052,7 @@ L1B8A: LD HL,$FFFE ; The dummy value minus two ;; LINE-NEW L1B9E: CALL L196E ; routine LINE-ADDR gets address of line ; returning zero flag set if line found. - LD A,($5C44) ; fetch new statement from NSPPC + LD A,(#5C44) ; fetch new statement from NSPPC JR Z,L1BBF ; forward to LINE-USE if line matched. ; continue as must be a direct command. @@ -8065,8 +8065,8 @@ L1B9E: CALL L196E ; routine LINE-ADDR gets address of line LD B,A ; save statement in B. ? LD A,(HL) ; fetch high byte of line number. - AND $C0 ; test if using direct command - ; a program line is less than $3F + AND #C0 ; test if using direct command + ; a program line is less than #3F LD A,B ; retrieve statement. ; (we can assume it is zero). JR Z,L1BBF ; forward to LINE-USE if was a program line @@ -8075,7 +8075,7 @@ L1B9E: CALL L196E ; routine LINE-ADDR gets address of line ;; REPORT-0 L1BB0: RST 08H ; ERROR-1 - DEFB $FF ; Error Report: OK + DEFB #FF ; Error Report: OK ; ------------------ ; Handle REM command @@ -8097,9 +8097,9 @@ L1BB2: POP BC ; drop return address STMT-RET and L1BB3: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) RET Z ; return if checking syntax. - LD HL,($5C55) ; fetch NXTLIN to HL. - LD A,$C0 ; test against the - AND (HL) ; system limit $3F. + LD HL,(#5C55) ; fetch NXTLIN to HL. + LD A,#C0 ; test against the + AND (HL) ; system limit #3F. RET NZ ; return if more as must be ; end of program. ; (or direct command) @@ -8116,13 +8116,13 @@ L1BB3: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) ; First make statement zero number one leaving others unaffected. ;; LINE-USE -L1BBF: CP $01 ; will set carry if zero. - ADC A,$00 ; add in any carry. +L1BBF: CP #01 ; will set carry if zero. + ADC A,#00 ; add in any carry. LD D,(HL) ; high byte of line number to D. INC HL ; advance pointer. LD E,(HL) ; low byte of line number to E. - LD ($5C45),DE ; set system variable PPC. + LD (#5C45),DE ; set system variable PPC. INC HL ; advance pointer. LD E,(HL) ; low byte of line length to E. @@ -8138,21 +8138,21 @@ L1BBF: CP $01 ; will set carry if zero. ; previous line or edit line. ; ----------------------------- ; The pointer will be the next line if continuing from above or to -; edit line end-marker ($80) if from LINE-RUN. +; edit line end-marker (#80) if from LINE-RUN. ;; NEXT-LINE -L1BD1: LD ($5C55),HL ; store pointer in system variable NXTLIN +L1BD1: LD (#5C55),HL ; store pointer in system variable NXTLIN EX DE,HL ; bring back pointer to previous or edit line - LD ($5C5D),HL ; and update CH_ADD with character address. + LD (#5C5D),HL ; and update CH_ADD with character address. LD D,A ; store statement in D. - LD E,$00 ; set E to zero to suppress token searching + LD E,#00 ; set E to zero to suppress token searching ; if EACH-STMT is to be called. - LD (IY+$0A),$FF ; set statement NSPPC to $FF signalling + LD (IY+#0A),#FF ; set statement NSPPC to #FF signalling ; no jump to be made. DEC D ; decrement and test statement - LD (IY+$0D),D ; set SUBPPC to decremented statement number. + LD (IY+#0D),D ; set SUBPPC to decremented statement number. JP Z,L1B28 ; to STMT-LOOP if result zero as statement is ; at start of line and address is known. @@ -8163,7 +8163,7 @@ L1BD1: LD ($5C55),HL ; store pointer in system variable NXTLIN ;; REPORT-N L1BEC: RST 08H ; ERROR-1 - DEFB $16 ; Error Report: Statement lost + DEFB #16 ; Error Report: Statement lost ; ----------------- ; End of statement? @@ -8191,14 +8191,14 @@ L1BF4: CALL L3B5D ; Spectrum 128 patch L1BF7: JR Z,L1BB3 ; back to LINE-END if so. - CP $3A ; is it ':' ? + CP #3A ; is it ':' ? JP Z,L1B28 ; jump back to STMT-LOOP to consider ; further statements JP L1C8A ; jump to REPORT-C with any other character ; 'Nonsense in BASIC'. -; Note. the two-byte sequence 'rst 08; defb $0b' could replace the above jp. +; Note. the two-byte sequence 'rst 08; defb #0b' could replace the above jp. ; ------------------- ; Command class table @@ -8242,7 +8242,7 @@ L1C11: POP BC ; drop address SCAN-LOOP. ; as should be no further characters. EX DE,HL ; save HL to DE. - LD HL,($5C74) ; fetch T_ADDR + LD HL,(#5C74) ; fetch T_ADDR LD C,(HL) ; fetch low byte of routine INC HL ; address next. LD B,(HL) ; fetch high byte of routine. @@ -8269,35 +8269,35 @@ L1C1F: CALL L28B2 ; routine LOOK-VARS returns carry set if not ; ;; VAR-A-1 -L1C22: LD (IY+$37),$00 ; set FLAGX to zero +L1C22: LD (IY+#37),#00 ; set FLAGX to zero JR NC,L1C30 ; forward to VAR-A-2 if found or checking ; syntax. - SET 1,(IY+$37) ; FLAGX - Signal a new variable + SET 1,(IY+#37) ; FLAGX - Signal a new variable JR NZ,L1C46 ; to VAR-A-3 if not assigning to an array ; e.g. LET a$(3,3) = "X" ;; REPORT-2 L1C2E: RST 08H ; ERROR-1 - DEFB $01 ; Error Report: Variable not found + DEFB #01 ; Error Report: Variable not found ;; VAR-A-2 L1C30: CALL Z,L2996 ; routine STK-VAR considers a subscript/slice - BIT 6,(IY+$01) ; test FLAGS - Numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - Numeric or string result ? JR NZ,L1C46 ; to VAR-A-3 if numeric XOR A ; default to array/slice - to be retained. CALL L2530 ; routine SYNTAX-Z CALL NZ,L2BF1 ; routine STK-FETCH is called in runtime ; may overwrite A with 1. - LD HL,$5C71 ; address system variable FLAGX + LD HL,#5C71 ; address system variable FLAGX OR (HL) ; set bit 0 if simple variable to be reclaimed LD (HL),A ; update FLAGX EX DE,HL ; start of string/subscript to DE ;; VAR-A-3 -L1C46: LD ($5C72),BC ; update STRLEN - LD ($5C4D),HL ; and DEST of assigned string. +L1C46: LD (#5C72),BC ; update STRLEN + LD (#5C4D),HL ; and DEST of assigned string. RET ; return. ; ------------------------------------------------- @@ -8318,15 +8318,15 @@ L1C4E: POP BC ; drop return address SCAN-LOOP ; ;; VAL-FET-1 -L1C56: LD A,($5C3B) ; initial FLAGS to A +L1C56: LD A,(#5C3B) ; initial FLAGS to A ;; VAL-FET-2 L1C59: PUSH AF ; save A briefly CALL L24FB ; routine SCANNING evaluates expression. POP AF ; restore A - LD D,(IY+$01) ; post-SCANNING FLAGS to D + LD D,(IY+#01) ; post-SCANNING FLAGS to D XOR D ; xor the two sets of flags - AND $40 ; pick up bit 6 of xored FLAGS should be zero + AND #40 ; pick up bit 6 of xored FLAGS should be zero JR NZ,L1C8A ; forward to REPORT-C if not zero ; 'Nonsense in BASIC' - results don't agree. @@ -8345,8 +8345,8 @@ L1C59: PUSH AF ; save A briefly L1C6C: CALL L28B2 ; routine LOOK-VARS PUSH AF ; preserve flags. LD A,C ; fetch type - should be 011xxxxx - OR $9F ; combine with 10011111. - INC A ; test if now $FF by incrementing. + OR #9F ; combine with 10011111. + INC A ; test if now #FF by incrementing. JR NZ,L1C8A ; forward to REPORT-C if result not zero. POP AF ; else restore flags. @@ -8369,7 +8369,7 @@ L1C79: RST 20H ; NEXT-CHAR advance past 'AT' or '('. ;; EXPT-2NUM L1C7A: CALL L1C82 ; routine EXPT-1NUM is called for first ; numeric expression - CP $2C ; is character ',' ? + CP #2C ; is character ',' ? JR NZ,L1C8A ; to REPORT-C if not required separator. ; 'Nonsense in BASIC'. @@ -8380,12 +8380,12 @@ L1C7A: CALL L1C82 ; routine EXPT-1NUM is called for first ;; CLASS-06 ;; EXPT-1NUM L1C82: CALL L24FB ; routine SCANNING - BIT 6,(IY+$01) ; test FLAGS - Numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - Numeric or string result ? RET NZ ; return if result is numeric. ;; REPORT-C L1C8A: RST 08H ; ERROR-1 - DEFB $0B ; Error Report: Nonsense in BASIC + DEFB #0B ; Error Report: Nonsense in BASIC ; --------------------------------------------------------------- ; class-0A e.g. ERASE "????" ; a string expression must follow. @@ -8396,7 +8396,7 @@ L1C8A: RST 08H ; ERROR-1 ;; CLASS-0A ;; EXPT-EXP L1C8C: CALL L24FB ; routine SCANNING - BIT 6,(IY+$01) ; test FLAGS - Numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - Numeric or string result ? RET Z ; return if string result. JR L1C8A ; back to REPORT-C if numeric. @@ -8411,20 +8411,20 @@ L1C8C: CALL L24FB ; routine SCANNING ; Note. these commands should ensure that current channel is 'S' ;; CLASS-07 -L1C96: BIT 7,(IY+$01) ; test FLAGS - checking syntax only ? - RES 0,(IY+$02) ; update TV_FLAG - signal main screen in use +L1C96: BIT 7,(IY+#01) ; test FLAGS - checking syntax only ? + RES 0,(IY+#02) ; update TV_FLAG - signal main screen in use CALL NZ,L0D4D ; routine TEMPS is called in runtime. POP AF ; drop return address SCAN-LOOP - LD A,($5C74) ; T_ADDR_lo to accumulator. - ; points to '$07' entry + 1 - ; e.g. for INK points to $EC now + LD A,(#5C74) ; T_ADDR_lo to accumulator. + ; points to '#07' entry + 1 + ; e.g. for INK points to #EC now ; Note if you move alter the syntax table next line may have to be altered. -; Note. For ZASM assembler replace following expression with SUB $13. +; Note. For ZASM assembler replace following expression with SUB #13. -L1CA5: SUB low (L1AEB-$D8) ; convert $EB to $D8 ('INK') etc. - ; ( is SUB $13 in standard ROM ) +L1CA5: SUB low (L1AEB-#D8) ; convert #EB to #D8 ('INK') etc. + ; ( is SUB #13 in standard ROM ) CALL L21FC ; routine CO-TEMP-4 CALL L1BEE ; routine CHECK-END check that nothing else @@ -8432,13 +8432,13 @@ L1CA5: SUB low (L1AEB-$D8) ; convert $EB to $D8 ('INK') etc. ; return here in runtime. - LD HL,($5C8F) ; pick up ATTR_T and MASK_T - LD ($5C8D),HL ; and store in ATTR_P and MASK_P - LD HL,$5C91 ; point to P_FLAG. + LD HL,(#5C8F) ; pick up ATTR_T and MASK_T + LD (#5C8D),HL ; and store in ATTR_P and MASK_P + LD HL,#5C91 ; point to P_FLAG. LD A,(HL) ; pick up in A RLCA ; rotate to left XOR (HL) ; combine with HL - AND $AA ; 10101010 + AND #AA ; 10101010 XOR (HL) ; only permanent bits affected LD (HL),A ; reload into P_FLAG. RET ; return. @@ -8455,13 +8455,13 @@ L1CA5: SUB low (L1AEB-$D8) ; convert $EB to $D8 ('INK') etc. L1CBE: CALL L2530 ; routine SYNTAX-Z JR Z,L1CD6 ; forward to CL-09-1 if checking syntax. - RES 0,(IY+$02) ; update TV_FLAG - signal main screen in use + RES 0,(IY+#02) ; update TV_FLAG - signal main screen in use CALL L0D4D ; routine TEMPS is called. - LD HL,$5C90 ; point to MASK_T + LD HL,#5C90 ; point to MASK_T LD A,(HL) ; fetch mask to accumulator. - OR $F8 ; or with 11111000 paper/bright/flash 8 + OR #F8 ; or with 11111000 paper/bright/flash 8 LD (HL),A ; mask back to MASK_T system variable. - RES 6,(IY+$57) ; reset P_FLAG - signal NOT PAPER 9 ? + RES 6,(IY+#57) ; reset P_FLAG - signal NOT PAPER 9 ? RST 18H ; GET-CHAR @@ -8498,10 +8498,10 @@ L1CDB: JP L0605 ; jump way back to SAVE-ETC ; Also called from LIST-4. ;; FETCH-NUM -L1CDE: CP $0D ; is character a carriage return ? +L1CDE: CP #0D ; is character a carriage return ? JR Z,L1CE6 ; forward to USE-ZERO if so - CP $3A ; is it ':' ? + CP #3A ; is it ':' ? JR NZ,L1C82 ; forward to EXPT-1NUM if not. ; else continue and use zero. @@ -8516,8 +8516,8 @@ L1CE6: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) RET Z ; RST 28H ;; FP-CALC - DEFB $A0 ;;stk-zero ;0. - DEFB $38 ;;end-calc + DEFB #A0 ;;stk-zero ;0. + DEFB #38 ;;end-calc RET ; return. @@ -8530,7 +8530,7 @@ L1CE6: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) ;; REPORT-9 ;; STOP L1CEE: RST 08H ; ERROR-1 - DEFB $08 ; Error Report: STOP statement + DEFB #08 ; Error Report: STOP statement ; ----------------- ; Handle IF command @@ -8549,8 +8549,8 @@ L1CF0: POP BC ; drop return address - STMT-RET RST 28H ;; FP-CALC score>100 (1=TRUE 0=FALSE) - DEFB $02 ;;delete . - DEFB $38 ;;end-calc + DEFB #02 ;;delete . + DEFB #38 ;;end-calc EX DE,HL ; make HL point to deleted value CALL L34E9 ; routine TEST-ZERO @@ -8571,7 +8571,7 @@ L1D00: JP L1B29 ; to STMT-L-1, if true (1) to execute command ; The routine begins by checking for an optional STEP. ;; FOR -L1D03: CP $CD ; is there a 'STEP' ? +L1D03: CP #CD ; is there a 'STEP' ? JR NZ,L1D10 ; to F-USE-1 if not to use 1 as default. RST 20H ; NEXT-CHAR @@ -8585,34 +8585,34 @@ L1D03: CP $CD ; is there a 'STEP' ? L1D10: CALL L1BEE ; routine CHECK-END RST 28H ;; FP-CALC v,l. - DEFB $A1 ;;stk-one v,l,1=s. - DEFB $38 ;;end-calc + DEFB #A1 ;;stk-one v,l,1=s. + DEFB #38 ;;end-calc ;; F-REORDER L1D16: RST 28H ;; FP-CALC v,l,s. - DEFB $C0 ;;st-mem-0 v,l,s. - DEFB $02 ;;delete v,l. - DEFB $01 ;;exchange l,v. - DEFB $E0 ;;get-mem-0 l,v,s. - DEFB $01 ;;exchange l,s,v. - DEFB $38 ;;end-calc + DEFB #C0 ;;st-mem-0 v,l,s. + DEFB #02 ;;delete v,l. + DEFB #01 ;;exchange l,v. + DEFB #E0 ;;get-mem-0 l,v,s. + DEFB #01 ;;exchange l,s,v. + DEFB #38 ;;end-calc CALL L2AFF ; routine LET assigns the initial value v to ; the variable altering type if necessary. - LD ($5C68),HL ; The system variable MEM is made to point to + LD (#5C68),HL ; The system variable MEM is made to point to ; the variable instead of its normal ; location MEMBOT DEC HL ; point to single-character name LD A,(HL) ; fetch name SET 7,(HL) ; set bit 7 at location - LD BC,$0006 ; add six to HL + LD BC,#0006 ; add six to HL ADD HL,BC ; to address where limit should be. RLCA ; test bit 7 of original name. JR C,L1D34 ; forward to F-L-S if already a FOR/NEXT ; variable - LD C,$0D ; otherwise an additional 13 bytes are needed. + LD C,#0D ; otherwise an additional 13 bytes are needed. ; 5 for each value, two for line number and ; 1 byte for looping statement. CALL L1655 ; routine MAKE-ROOM creates them. @@ -8622,21 +8622,21 @@ L1D16: RST 28H ;; FP-CALC v,l,s. L1D34: PUSH HL ; save position. RST 28H ;; FP-CALC l,s. - DEFB $02 ;;delete l. - DEFB $02 ;;delete . - DEFB $38 ;;end-calc + DEFB #02 ;;delete l. + DEFB #02 ;;delete . + DEFB #38 ;;end-calc ; DE points to STKEND, l. POP HL ; restore variable position EX DE,HL ; swap pointers - LD C,$0A ; ten bytes to move + LD C,#0A ; ten bytes to move LDIR ; Copy 'deleted' values to variable. - LD HL,($5C45) ; Load with current line number from PPC + LD HL,(#5C45) ; Load with current line number from PPC EX DE,HL ; exchange pointers. LD (HL),E ; save the looping line INC HL ; in the next LD (HL),D ; two locations. - LD D,(IY+$0D) ; fetch statement from SUBPPC system variable. + LD D,(IY+#0D) ; fetch statement from SUBPPC system variable. INC D ; increment statement. INC HL ; and pointer LD (HL),D ; and store the looping statement. @@ -8647,29 +8647,29 @@ L1D34: PUSH HL ; save position. ; no loop is possible so execution continues after the matching 'NEXT' - LD B,(IY+$38) ; get single-character name from STRLEN_lo - LD HL,($5C45) ; get the current line from PPC - LD ($5C42),HL ; and store it in NEWPPC - LD A,($5C47) ; fetch current statement from SUBPPC + LD B,(IY+#38) ; get single-character name from STRLEN_lo + LD HL,(#5C45) ; get the current line from PPC + LD (#5C42),HL ; and store it in NEWPPC + LD A,(#5C47) ; fetch current statement from SUBPPC NEG ; Negate as counter decrements from zero ; initially and we are in the middle of a ; line. LD D,A ; Store result in D. - LD HL,($5C5D) ; get current address from CH_ADD - LD E,$F3 ; search will be for token 'NEXT' + LD HL,(#5C5D) ; get current address from CH_ADD + LD E,#F3 ; search will be for token 'NEXT' ;; F-LOOP L1D64: PUSH BC ; save variable name. - LD BC,($5C55) ; fetch NXTLIN + LD BC,(#5C55) ; fetch NXTLIN CALL L1D86 ; routine LOOK-PROG searches for 'NEXT' token. - LD ($5C55),BC ; update NXTLIN + LD (#5C55),BC ; update NXTLIN POP BC ; and fetch the letter JR C,L1D84 ; forward to REPORT-I if the end of program ; was reached by LOOK-PROG. ; 'FOR without NEXT' RST 20H ; NEXT-CHAR fetches character after NEXT - OR $20 ; ensure it is upper-case. + OR #20 ; ensure it is upper-case. CP B ; compare with FOR variable name JR Z,L1D7C ; forward to F-FOUND if it matches. @@ -8683,16 +8683,16 @@ L1D64: PUSH BC ; save variable name. ;; F-FOUND L1D7C: RST 20H ; NEXT-CHAR - LD A,$01 ; subtract the negated counter from 1 + LD A,#01 ; subtract the negated counter from 1 SUB D ; to give the statement after the NEXT - LD ($5C44),A ; set system variable NSPPC + LD (#5C44),A ; set system variable NSPPC RET ; return to STMT-RET to branch to new ; line and statement. -> ; --- ;; REPORT-I L1D84: RST 08H ; ERROR-1 - DEFB $11 ; Error Report: FOR without NEXT + DEFB #11 ; Error Report: FOR without NEXT ; --------- ; LOOK-PROG @@ -8704,7 +8704,7 @@ L1D84: RST 08H ; ERROR-1 ;; LOOK-PROG L1D86: LD A,(HL) ; fetch current character - CP $3A ; is it ':' a statement separator ? + CP #3A ; is it ':' a statement separator ? JR Z,L1DA3 ; forward to LOOK-P-2 if so. ; The starting point was PROG - 1 or the end of a line. @@ -8712,7 +8712,7 @@ L1D86: LD A,(HL) ; fetch current character ;; LOOK-P-1 L1D8B: INC HL ; increment pointer to address LD A,(HL) ; the high byte of line number - AND $C0 ; test for program end marker $80 or a + AND #C0 ; test for program end marker #80 or a ; variable SCF ; Set Carry Flag RET NZ ; return with carry set if at end @@ -8721,7 +8721,7 @@ L1D8B: INC HL ; increment pointer to address LD B,(HL) ; high byte of line number to B INC HL ; LD C,(HL) ; low byte to C. - LD ($5C42),BC ; set system variable NEWPPC. + LD (#5C42),BC ; set system variable NEWPPC. INC HL ; LD C,(HL) ; low byte of line length to C. INC HL ; @@ -8731,7 +8731,7 @@ L1D8B: INC HL ; increment pointer to address LD B,H ; and save result LD C,L ; in BC. POP HL ; restore address. - LD D,$00 ; initialize statement counter to zero. + LD D,#00 ; initialize statement counter to zero. ;; LOOK-P-2 L1DA3: PUSH BC ; save address of next line @@ -8748,34 +8748,34 @@ L1DA3: PUSH BC ; save address of next line ; The parameter tables have already evaluated the presence of a variable ;; NEXT -L1DAB: BIT 1,(IY+$37) ; test FLAGX - handling a new variable ? +L1DAB: BIT 1,(IY+#37) ; test FLAGX - handling a new variable ? JP NZ,L1C2E ; jump back to REPORT-2 if so ; 'Variable not found' ; now test if found variable is a simple variable uninitialized by a FOR. - LD HL,($5C4D) ; load address of variable from DEST + LD HL,(#5C4D) ; load address of variable from DEST BIT 7,(HL) ; is it correct type ? JR Z,L1DD8 ; forward to REPORT-1 if not ; 'NEXT without FOR' INC HL ; step past variable name - LD ($5C68),HL ; and set MEM to point to three 5-byte values + LD (#5C68),HL ; and set MEM to point to three 5-byte values ; value, limit, step. RST 28H ;; FP-CALC add step and re-store - DEFB $E0 ;;get-mem-0 v. - DEFB $E2 ;;get-mem-2 v,s. - DEFB $0F ;;addition v+s. - DEFB $C0 ;;st-mem-0 v+s. - DEFB $02 ;;delete . - DEFB $38 ;;end-calc + DEFB #E0 ;;get-mem-0 v. + DEFB #E2 ;;get-mem-2 v,s. + DEFB #0F ;;addition v+s. + DEFB #C0 ;;st-mem-0 v+s. + DEFB #02 ;;delete . + DEFB #38 ;;end-calc CALL L1DDA ; routine NEXT-LOOP tests against limit. RET C ; return if no more iterations possible. - LD HL,($5C68) ; find start of variable contents from MEM. - LD DE,$000F ; add 3*5 to + LD HL,(#5C68) ; find start of variable contents from MEM. + LD DE,#000F ; add 3*5 to ADD HL,DE ; address the looping line number LD E,(HL) ; low byte to E INC HL ; @@ -8789,7 +8789,7 @@ L1DAB: BIT 1,(IY+$37) ; test FLAGX - handling a new variable ? ;; REPORT-1 L1DD8: RST 08H ; ERROR-1 - DEFB $00 ; Error Report: NEXT without FOR + DEFB #00 ; Error Report: NEXT without FOR ; ----------------- @@ -8802,24 +8802,24 @@ L1DD8: RST 08H ; ERROR-1 ;; NEXT-LOOP L1DDA: RST 28H ;; FP-CALC - DEFB $E1 ;;get-mem-1 l. - DEFB $E0 ;;get-mem-0 l,v. - DEFB $E2 ;;get-mem-2 l,v,s. - DEFB $36 ;;less-0 l,v,(1/0) negative step ? - DEFB $00 ;;jump-true l,v.(1/0) + DEFB #E1 ;;get-mem-1 l. + DEFB #E0 ;;get-mem-0 l,v. + DEFB #E2 ;;get-mem-2 l,v,s. + DEFB #36 ;;less-0 l,v,(1/0) negative step ? + DEFB #00 ;;jump-true l,v.(1/0) - DEFB $02 ;;to L1DE2, NEXT-1 if step negative + DEFB #02 ;;to L1DE2, NEXT-1 if step negative - DEFB $01 ;;exchange v,l. + DEFB #01 ;;exchange v,l. ;; NEXT-1 -L1DE2: DEFB $03 ;;subtract l-v OR v-l. - DEFB $37 ;;greater-0 (1/0) - DEFB $00 ;;jump-true . +L1DE2: DEFB #03 ;;subtract l-v OR v-l. + DEFB #37 ;;greater-0 (1/0) + DEFB #00 ;;jump-true . - DEFB $04 ;;to L1DE9, NEXT-2 if no more iterations. + DEFB #04 ;;to L1DE9, NEXT-2 if no more iterations. - DEFB $38 ;;end-calc . + DEFB #38 ;;end-calc . AND A ; clear carry flag signalling another loop. RET ; return @@ -8827,7 +8827,7 @@ L1DE2: DEFB $03 ;;subtract l-v OR v-l. ; --- ;; NEXT-2 -L1DE9: DEFB $38 ;;end-calc . +L1DE9: DEFB #38 ;;end-calc . SCF ; set carry flag signalling looping exhausted. RET ; return @@ -8853,19 +8853,19 @@ L1DED: CALL L1C1F ; routine CLASS-01 checks variable. RST 18H ; GET-CHAR - LD ($5C5F),HL ; save character position in X_PTR. - LD HL,($5C57) ; load HL with Data Address DATADD, which is + LD (#5C5F),HL ; save character position in X_PTR. + LD HL,(#5C57) ; load HL with Data Address DATADD, which is ; the start of the program or the address ; after the last expression that was read or ; the address of the line number of the ; last RESTORE command. LD A,(HL) ; fetch character - CP $2C ; is it a comma ? + CP #2C ; is it a comma ? JR Z,L1E0A ; forward to READ-1 if so. ; else all data in this statement has been read so look for next DATA token - LD E,$E4 ; token 'DATA' + LD E,#E4 ; token 'DATA' CALL L1D86 ; routine LOOK-PROG JR NC,L1E0A ; forward to READ-1 if DATA found @@ -8873,7 +8873,7 @@ L1DED: CALL L1C1F ; routine CLASS-01 checks variable. ;; REPORT-E L1E08: RST 08H ; ERROR-1 - DEFB $0D ; Error Report: Out of DATA + DEFB #0D ; Error Report: Out of DATA ;; READ-1 L1E0A: CALL L0077 ; routine TEMP-PTR1 advances updating CH_ADD @@ -8882,14 +8882,14 @@ L1E0A: CALL L0077 ; routine TEMP-PTR1 advances updating CH_ADD ; checking type match and adjusting CH_ADD. RST 18H ; GET-CHAR fetches adjusted character position - LD ($5C57),HL ; store back in DATADD - LD HL,($5C5F) ; fetch X_PTR the original READ CH_ADD - LD (IY+$26),$00 ; now nullify X_PTR_hi + LD (#5C57),HL ; store back in DATADD + LD HL,(#5C5F) ; fetch X_PTR the original READ CH_ADD + LD (IY+#26),#00 ; now nullify X_PTR_hi CALL L0078 ; routine TEMP-PTR2 restores READ CH_ADD ;; READ-2 L1E1E: RST 18H ; GET-CHAR - CP $2C ; is it ',' indicating more variables to read ? + CP #2C ; is it ',' indicating more variables to read ? JR Z,L1DEC ; back to READ-3 if so CALL L1BEE ; routine CHECK-END @@ -8910,7 +8910,7 @@ L1E27: CALL L2530 ; routine SYNTAX-Z to check status ;; DATA-1 L1E2C: CALL L24FB ; routine SCANNING to check syntax of ; expression - CP $2C ; is it a comma ? + CP #2C ; is it a comma ? CALL NZ,L1BEE ; routine CHECK-END checks that statement ; is complete. Will make an early exit if ; so. >>> @@ -8920,7 +8920,7 @@ L1E2C: CALL L24FB ; routine SCANNING to check syntax of ; --- ;; DATA-2 -L1E37: LD A,$E4 ; set token to 'DATA' and continue into +L1E37: LD A,#E4 ; set token to 'DATA' and continue into ; the the PASS-BY routine. @@ -8936,7 +8936,7 @@ L1E39: LD B,A ; Give BC enough space to find token. ; Work backwards till keyword is found which ; is start of statement before any quotes. ; HL points to location before keyword. - LD DE,$0200 ; count 1+1 statements, dummy value in E to + LD DE,#0200 ; count 1+1 statements, dummy value in E to ; inhibit searching for a token. JP L198B ; to EACH-STMT to find next statement @@ -8974,7 +8974,7 @@ L1E39: LD B,A ; Give BC enough space to find token. ;; RESTORE L1E42: CALL L1E99 ; routine FIND-INT2 puts integer in BC. - ; Note. B should be checked against limit $3F + ; Note. B should be checked against limit #3F ; and an error generated if higher. ; this entry point is used from RUN command with BC holding zero @@ -8984,7 +8984,7 @@ L1E45: LD H,B ; transfer the line LD L,C ; number to the HL register. CALL L196E ; routine LINE-ADDR to fetch the address. DEC HL ; point to the location before the line. - LD ($5C57),HL ; update system variable DATADD. + LD (#5C57),HL ; update system variable DATADD. RET ; return to STMT-RET (or RUN) ; ------------------------ @@ -9000,10 +9000,10 @@ L1E4F: CALL L1E99 ; routine FIND-INT2 puts parameter in BC. OR C ; for zero. JR NZ,L1E5A ; forward to RAND-1 if not zero. - LD BC,($5C78) ; use the lower two bytes at FRAMES1. + LD BC,(#5C78) ; use the lower two bytes at FRAMES1. ;; RAND-1 -L1E5A: LD ($5C76),BC ; place in SEED system variable. +L1E5A: LD (#5C76),BC ; place in SEED system variable. RET ; return to STMT-RET ; ----------------------- @@ -9014,8 +9014,8 @@ L1E5A: LD ($5C76),BC ; place in SEED system variable. ; by using the last part of GO TO and exits indirectly to STMT-RET. ;; CONTINUE -L1E5F: LD HL,($5C6E) ; fetch OLDPPC line number. - LD D,(IY+$36) ; fetch OSPPC statement. +L1E5F: LD HL,(#5C6E) ; fetch OLDPPC line number. + LD D,(IY+#36) ; fetch OSPPC statement. JR L1E73 ; forward to GO-TO-2 ; -------------------- @@ -9026,8 +9026,8 @@ L1E5F: LD HL,($5C6E) ; fetch OLDPPC line number. ; It updates the system variables used to fetch the next line/statement. ; It is at STMT-RET that the actual change in control takes place. ; Unlike some BASICs the line number need not exist. -; Note. the high byte of the line number is incorrectly compared with $F0 -; instead of $3F. This leads to commands with operands greater than 32767 +; Note. the high byte of the line number is incorrectly compared with #F0 +; instead of #3F. This leads to commands with operands greater than 32767 ; being considered as having been run from the editing area and the ; error report 'Statement Lost' is given instead of 'OK'. ; - Steven Vickers, 1984. @@ -9036,16 +9036,16 @@ L1E5F: LD HL,($5C6E) ; fetch OLDPPC line number. L1E67: CALL L1E99 ; routine FIND-INT2 puts operand in BC LD H,B ; transfer line LD L,C ; number to HL. - LD D,$00 ; set statement to 0 - first. + LD D,#00 ; set statement to 0 - first. LD A,H ; compare high byte only - CP $F0 ; to $F0 i.e. 61439 in full. + CP #F0 ; to #F0 i.e. 61439 in full. JR NC,L1E9F ; forward to REPORT-B if above. ; This call entry point is used to update the system variables e.g. by RETURN. ;; GO-TO-2 -L1E73: LD ($5C42),HL ; save line number in NEWPPC - LD (IY+$0A),D ; and statement in NSPPC +L1E73: LD (#5C42),HL ; save line number in NEWPPC + LD (IY+#0A),D ; and statement in NSPPC RET ; to STMT-RET (or GO-SUB command) ; ------------------ @@ -9123,7 +9123,7 @@ L1E9C: JR C,L1E9F ; to REPORT-Bb with overflow. ;; REPORT-Bb L1E9F: RST 08H ; ERROR-1 - DEFB $0A ; Error Report: Integer out of range + DEFB #0A ; Error Report: Integer out of range ; ------------------ ; Handle RUN command @@ -9134,7 +9134,7 @@ L1E9F: RST 08H ; ERROR-1 ;; RUN L1EA1: CALL L1E67 ; routine GO-TO puts line number in ; system variables. - LD BC,$0000 ; prepare to set DATADD to first line. + LD BC,#0000 ; prepare to set DATADD to first line. CALL L1E45 ; routine REST-RUN does the 'restore'. ; Note BC still holds zero. JR L1EAF ; forward to CLEAR-RUN to clear variables @@ -9159,19 +9159,19 @@ L1EAF: LD A,B ; test for OR C ; zero. JR NZ,L1EB7 ; skip to CLEAR-1 if not zero. - LD BC,($5CB2) ; use the existing value of RAMTOP if zero. + LD BC,(#5CB2) ; use the existing value of RAMTOP if zero. ;; CLEAR-1 L1EB7: PUSH BC ; save ramtop value. - LD DE,($5C4B) ; fetch VARS - LD HL,($5C59) ; fetch E_LINE + LD DE,(#5C4B) ; fetch VARS + LD HL,(#5C59) ; fetch E_LINE DEC HL ; adjust to point at variables end-marker. CALL L19E5 ; routine RECLAIM-1 reclaims the space used by ; the variables. CALL L0D6B ; routine CLS to clear screen. - LD HL,($5C65) ; fetch STKEND the start of free memory. - LD DE,$0032 ; allow for another 50 bytes. + LD HL,(#5C65) ; fetch STKEND the start of free memory. + LD DE,#0032 ; allow for another 50 bytes. ADD HL,DE ; add the overhead to HL. POP DE ; restore the ramtop value. @@ -9179,25 +9179,25 @@ L1EB7: PUSH BC ; save ramtop value. JR NC,L1EDA ; forward to REPORT-M ; 'RAMTOP no good' - LD HL,($5CB4) ; now P-RAMT ($7FFF on 16K RAM machine) + LD HL,(#5CB4) ; now P-RAMT (#7FFF on 16K RAM machine) AND A ; exact this time. SBC HL,DE ; new ramtop must be lower or the same. JR NC,L1EDC ; skip to CLEAR-2 if in actual RAM. ;; REPORT-M L1EDA: RST 08H ; ERROR-1 - DEFB $15 ; Error Report: RAMTOP no good + DEFB #15 ; Error Report: RAMTOP no good ;; CLEAR-2 L1EDC: EX DE,HL ; transfer ramtop value to HL. - LD ($5CB2),HL ; update system variable RAMTOP. + LD (#5CB2),HL ; update system variable RAMTOP. POP DE ; pop the return address STMT-RET. POP BC ; pop the Error Address. - LD (HL),$3E ; now put the GO SUB end-marker at RAMTOP. + LD (HL),#3E ; now put the GO SUB end-marker at RAMTOP. DEC HL ; leave a location beneath it. LD SP,HL ; initialize the machine stack pointer. PUSH BC ; push the error address. - LD ($5C3D),SP ; make ERR_SP point to location. + LD (#5C3D),SP ; make ERR_SP point to location. EX DE,HL ; put STMT-RET in HL. JP (HL) ; and go there directly. @@ -9211,22 +9211,22 @@ L1EDC: EX DE,HL ; transfer ramtop value to HL. ;; GO-SUB L1EED: POP DE ; drop the address STMT-RET - LD H,(IY+$0D) ; fetch statement from SUBPPC and + LD H,(IY+#0D) ; fetch statement from SUBPPC and INC H ; increment it EX (SP),HL ; swap - error address to HL, ; H (statement) at top of stack, ; L (unimportant) beneath. INC SP ; adjust to overwrite unimportant byte - LD BC,($5C45) ; fetch the current line number from PPC + LD BC,(#5C45) ; fetch the current line number from PPC PUSH BC ; and PUSH onto GO SUB stack. ; the empty machine-stack can be rebuilt PUSH HL ; push the error address. - LD ($5C3D),SP ; make system variable ERR_SP point to it. + LD (#5C3D),SP ; make system variable ERR_SP point to it. PUSH DE ; push the address STMT-RET. CALL L1E67 ; call routine GO-TO to update the system ; variables NEWPPC and NSPPC. ; then make an indirect exit to STMT-RET via - LD BC,$0014 ; a 20-byte overhead memory check. + LD BC,#0014 ; a 20-byte overhead memory check. ; ---------------------- ; Check available memory @@ -9235,22 +9235,22 @@ L1EED: POP DE ; drop the address STMT-RET ; upwards or the GO SUB stack downwards. ;; TEST-ROOM -L1F05: LD HL,($5C65) ; fetch STKEND +L1F05: LD HL,(#5C65) ; fetch STKEND ADD HL,BC ; add the supplied test value - JR C,L1F15 ; forward to REPORT-4 if over $FFFF + JR C,L1F15 ; forward to REPORT-4 if over #FFFF EX DE,HL ; was less so transfer to DE - LD HL,$0050 ; test against another 80 bytes + LD HL,#0050 ; test against another 80 bytes ADD HL,DE ; anyway - JR C,L1F15 ; forward to REPORT-4 if this passes $FFFF + JR C,L1F15 ; forward to REPORT-4 if this passes #FFFF SBC HL,SP ; if less than the machine stack pointer RET C ; then return - OK. ;; REPORT-4 -L1F15: LD L,$03 ; prepare 'Out of Memory' - JP L0055 ; jump back to ERROR-3 at $0055 - ; Note. this error can't be trapped at $0008 +L1F15: LD L,#03 ; prepare 'Out of Memory' + JP L0055 ; jump back to ERROR-3 at #0055 + ; Note. this error can't be trapped at #0008 ; ------------------------------ ; THE 'FREE MEMORY' USER ROUTINE @@ -9259,7 +9259,7 @@ L1F15: LD L,$03 ; prepare 'Out of Memory' ; approximate free memory with PRINT 65536 - USR 7962. ;; free-mem -L1F1A: LD BC,$0000 ; allow no overhead. +L1F1A: LD BC,#0000 ; allow no overhead. CALL L1F05 ; routine TEST-ROOM. @@ -9279,8 +9279,8 @@ L1F1A: LD BC,$0000 ; allow no overhead. L1F23: POP BC ; drop the address STMT-RET. POP HL ; now the error address. POP DE ; now a possible BASIC return line. - LD A,D ; the high byte $00 - $27 is - CP $3E ; compared with the traditional end-marker $3E. + LD A,D ; the high byte #00 - #27 is + CP #3E ; compared with the traditional end-marker #3E. JR Z,L1F36 ; forward to REPORT-7 with a match. ; 'RETURN without GOSUB' @@ -9292,7 +9292,7 @@ L1F23: POP BC ; drop the address STMT-RET. EX (SP),HL ; statement to H, error address to base of ; new machine stack. EX DE,HL ; statement to D, BASIC line number to HL. - LD ($5C3D),SP ; adjust ERR_SP to point to new stack pointer + LD (#5C3D),SP ; adjust ERR_SP to point to new stack pointer PUSH BC ; now re-stack the address STMT-RET JP L1E73 ; to GO-TO-2 to update statement and line ; system variables and exit indirectly to the @@ -9306,7 +9306,7 @@ L1F36: PUSH DE ; replace the end-marker. ; as will be required in a few clock cycles. RST 08H ; ERROR-1 - DEFB $06 ; Error Report: RETURN without GOSUB + DEFB #06 ; Error Report: RETURN without GOSUB ; -------------------- ; Handle PAUSE command @@ -9327,18 +9327,18 @@ L1F3D: HALT ; wait for interrupt. JR Z,L1F4F ; forward to PAUSE-END if so. LD A,B ; test if - AND C ; now $FFFF + AND C ; now #FFFF INC A ; that is, initially zero. JR NZ,L1F49 ; skip forward to PAUSE-2 if not. INC BC ; restore counter to zero. ;; PAUSE-2 -L1F49: BIT 5,(IY+$01) ; test FLAGS - has a new key been pressed ? +L1F49: BIT 5,(IY+#01) ; test FLAGS - has a new key been pressed ? JR Z,L1F3D ; back to PAUSE-1 if not. ;; PAUSE-END -L1F4F: RES 5,(IY+$01) ; update FLAGS - signal no new key +L1F4F: RES 5,(IY+#01) ; update FLAGS - signal no new key RET ; and return. ; ------------------- @@ -9349,13 +9349,13 @@ L1F4F: RES 5,(IY+$01) ; update FLAGS - signal no new key ; It is also called at STMT-RET after every statement. ;; BREAK-KEY -L1F54: LD A,$7F ; Input address: $7FFE - IN A,($FE) ; read lower right keys +L1F54: LD A,#7F ; Input address: #7FFE + IN A,(#FE) ; read lower right keys RRA ; rotate bit 0 - SPACE RET C ; return if not reset - LD A,$FE ; Input address: $FEFE - IN A,($FE) ; read lower left keys + LD A,#FE ; Input address: #FEFE + IN A,(#FE) ; read lower left keys RRA ; rotate bit 0 - SHIFT RET ; carry will be set if not pressed. ; return with no carry if both keys @@ -9372,7 +9372,7 @@ L1F54: LD A,$7F ; Input address: $7FFE L1F60: CALL L2530 ; routine SYNTAX-Z JR Z,L1F6A ; forward to DEF-FN-1 if parsing - LD A,$CE ; else load A with 'DEF FN' and + LD A,#CE ; else load A with 'DEF FN' and JP L1E39 ; jump back to PASS-BY ; --- @@ -9380,27 +9380,27 @@ L1F60: CALL L2530 ; routine SYNTAX-Z ; continue here if checking syntax. ;; DEF-FN-1 -L1F6A: SET 6,(IY+$01) ; set FLAGS - Assume numeric result +L1F6A: SET 6,(IY+#01) ; set FLAGS - Assume numeric result CALL L2C8D ; call routine ALPHA JR NC,L1F89 ; if not then to DEF-FN-4 to jump to ; 'Nonsense in BASIC' RST 20H ; NEXT-CHAR - CP $24 ; is it '$' ? + CP #24 ; is it '$' ? JR NZ,L1F7D ; to DEF-FN-2 if not as numeric. - RES 6,(IY+$01) ; set FLAGS - Signal string result + RES 6,(IY+#01) ; set FLAGS - Signal string result RST 20H ; get NEXT-CHAR ;; DEF-FN-2 -L1F7D: CP $28 ; is it '(' ? +L1F7D: CP #28 ; is it '(' ? JR NZ,L1FBD ; to DEF-FN-7 'Nonsense in BASIC' RST 20H ; NEXT-CHAR - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JR Z,L1FA6 ; to DEF-FN-6 if null argument ;; DEF-FN-3 @@ -9415,7 +9415,7 @@ L1F89: JP NC,L1C8A ; to REPORT-C if not RST 20H ; NEXT-CHAR re-initializes HL from CH_ADD ; and advances. - CP $24 ; '$' ? is it a string argument. + CP #24 ; '$' ? is it a string argument. JR NZ,L1F94 ; forward to DEF-FN-5 if not. EX DE,HL ; save pointer to '$' in DE @@ -9424,9 +9424,9 @@ L1F89: JP NC,L1C8A ; to REPORT-C if not ;; DEF-FN-5 L1F94: EX DE,HL ; bring back pointer. - LD BC,$0006 ; the function requires six hidden bytes for + LD BC,#0006 ; the function requires six hidden bytes for ; each parameter passed. - ; The first byte will be $0E + ; The first byte will be #0E ; then 5-byte numeric value ; or 5-byte string pointer. @@ -9435,14 +9435,14 @@ L1F94: EX DE,HL ; bring back pointer. INC HL ; adjust HL (set by LDDR) INC HL ; to point to first location. - LD (HL),$0E ; insert the 'hidden' marker. + LD (HL),#0E ; insert the 'hidden' marker. ; Note. these invisible storage locations hold nothing meaningful for the ; moment. They will be used every time the corresponding function is ; evaluated in runtime. ; Now consider the following character fetched earlier. - CP $2C ; is it ',' ? (more than one parameter) + CP #2C ; is it ',' ? (more than one parameter) JR NZ,L1FA6 ; to DEF-FN-6 if not @@ -9452,27 +9452,27 @@ L1F94: EX DE,HL ; bring back pointer. ; --- ;; DEF-FN-6 -L1FA6: CP $29 ; should close with a ')' +L1FA6: CP #29 ; should close with a ')' JR NZ,L1FBD ; to DEF-FN-7 if not ; 'Nonsense in BASIC' RST 20H ; get NEXT-CHAR - CP $3D ; is it '=' ? + CP #3D ; is it '=' ? JR NZ,L1FBD ; to DEF-FN-7 if not 'Nonsense...' RST 20H ; address NEXT-CHAR - LD A,($5C3B) ; get FLAGS which has been set above + LD A,(#5C3B) ; get FLAGS which has been set above PUSH AF ; and preserve CALL L24FB ; routine SCANNING checks syntax of expression ; and also sets flags. POP AF ; restore previous flags - XOR (IY+$01) ; xor with FLAGS - bit 6 should be same + XOR (IY+#01) ; xor with FLAGS - bit 6 should be same ; therefore will be reset. - AND $40 ; isolate bit 6. + AND #40 ; isolate bit 6. ;; DEF-FN-7 L1FBD: JP NZ,L1C8A ; jump back to REPORT-C if the expected result @@ -9511,7 +9511,7 @@ L1FC3: CALL L2530 ; routine SYNTAX-Z sets zero flag if syntax ; An extra UDG might have been better. ;; LPRINT -L1FC9: LD A,$03 ; the printer channel +L1FC9: LD A,#03 ; the printer channel JR L1FCF ; forward to PRINT-1 ; --------------------- @@ -9522,7 +9522,7 @@ L1FC9: LD A,$03 ; the printer channel ; of the computer. However the stream can be altered in range 0 - 15. ;; PRINT -L1FCD: LD A,$02 ; the stream for the upper screen. +L1FCD: LD A,#02 ; the stream for the upper screen. ; The LPRINT command joins here. @@ -9560,7 +9560,7 @@ L1FE5: CALL L204E ; routine PR-POSN-1 returns zero if more JR Z,L1FE5 ; loop back to PRINT-3 if so ;; PRINT-4 -L1FF2: CP $29 ; return now if this is ')' from input-item. +L1FF2: CP #29 ; return now if this is ')' from input-item. ; (see INPUT.) RET Z ; or continue and print carriage return in ; runtime @@ -9574,7 +9574,7 @@ L1FF2: CP $29 ; return now if this is ')' from input-item. ;; PRINT-CR L1FF5: CALL L1FC3 ; routine UNSTACK-Z - LD A,$0D ; prepare a carriage return + LD A,#0D ; prepare a carriage return RST 10H ; PRINT-A RET ; return @@ -9590,7 +9590,7 @@ L1FF5: CALL L1FC3 ; routine UNSTACK-Z ;; PR-ITEM-1 L1FFC: RST 18H ; GET-CHAR - CP $AC ; is character 'AT' ? + CP #AC ; is character 'AT' ? JR NZ,L200E ; forward to PR-ITEM-2 if not. CALL L1C79 ; routine NEXT-2NUM check for two comma @@ -9599,13 +9599,13 @@ L1FFC: RST 18H ; GET-CHAR CALL L1FC3 ; routine UNSTACK-Z quits if checking syntax. CALL L2307 ; routine STK-TO-BC get the numbers in B and C. - LD A,$16 ; prepare the 'at' control. + LD A,#16 ; prepare the 'at' control. JR L201E ; forward to PR-AT-TAB to print the sequence. ; --- ;; PR-ITEM-2 -L200E: CP $AD ; is character 'TAB' ? +L200E: CP #AD ; is character 'TAB' ? JR NZ,L2024 ; to PR-ITEM-3 if not @@ -9614,7 +9614,7 @@ L200E: CP $AD ; is character 'TAB' ? CALL L1FC3 ; routine UNSTACK-Z quits if checking syntax. CALL L1E99 ; routine FIND-INT2 puts integer in BC. - LD A,$17 ; prepare the 'tab' control. + LD A,#17 ; prepare the 'tab' control. ;; PR-AT-TAB L201E: RST 10H ; PRINT-A outputs the control @@ -9641,7 +9641,7 @@ L2024: CALL L21F2 ; routine CO-TEMP-3 will print any colour CALL L24FB ; routine SCANNING now to evaluate expression CALL L1FC3 ; routine UNSTACK-Z if not runtime. - BIT 6,(IY+$01) ; test FLAGS - Numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - Numeric or string result ? CALL Z,L2BF1 ; routine STK-FETCH if string. ; note no flags affected. JP NZ,L2DE3 ; to PRINT-FP to print if numeric >>> @@ -9671,14 +9671,14 @@ L203C: LD A,B ; this tests if the ; the others in print_items. ;; PR-END-Z -L2045: CP $29 ; is character a ')' ? +L2045: CP #29 ; is character a ')' ? RET Z ; return if so - e.g. INPUT (p$); a$ ;; PR-ST-END -L2048: CP $0D ; is it a carriage return ? +L2048: CP #0D ; is it a carriage return ? RET Z ; return also - e.g. PRINT a - CP $3A ; is character a ':' ? + CP #3A ; is character a ':' ? RET ; return - zero flag will be set if so. ; e.g. PRINT a : @@ -9689,19 +9689,19 @@ L2048: CP $0D ; is it a carriage return ? ;; PR-POSN-1 L204E: RST 18H ; GET-CHAR - CP $3B ; is it ';' ? + CP #3B ; is it ';' ? ; i.e. print from last position. JR Z,L2067 ; forward to PR-POSN-3 if so. ; i.e. do nothing. - CP $2C ; is it ',' ? + CP #2C ; is it ',' ? ; i.e. print at next tabstop. JR NZ,L2061 ; forward to PR-POSN-2 if anything else. CALL L2530 ; routine SYNTAX-Z JR Z,L2067 ; forward to PR-POSN-3 if checking syntax. - LD A,$06 ; prepare the 'comma' control character. + LD A,#06 ; prepare the 'comma' control character. RST 10H ; PRINT-A outputs to current channel in ; run-time. @@ -9713,7 +9713,7 @@ L204E: RST 18H ; GET-CHAR ; check for newline. ;; PR-POSN-2 -L2061: CP $27 ; is character a "'" ? (newline) +L2061: CP #27 ; is character a "'" ? (newline) RET NZ ; return if no match >>> CALL L1FF5 ; routine PRINT-CR outputs a carriage return @@ -9737,7 +9737,7 @@ L206E: CP A ; reset the zero flag. ; LIST #15 ;; STR-ALTER -L2070: CP $23 ; is character '#' ? +L2070: CP #23 ; is character '#' ? SCF ; set carry flag. RET NZ ; return if no match. @@ -9747,7 +9747,7 @@ L2070: CP $23 ; is character '#' ? AND A ; prepare to exit early with carry reset CALL L1FC3 ; routine UNSTACK-Z exits early if parsing CALL L1E94 ; routine FIND-INT1 gets number off stack - CP $10 ; must be range 0 - 15 decimal. + CP #10 ; must be range 0 - 15 decimal. JP NC,L160E ; jump back to REPORT-Oa if not ; 'Invalid stream'. @@ -9765,13 +9765,13 @@ L2070: CP $23 ; is character '#' ? L2089: CALL L2530 ; routine SYNTAX-Z to check if in runtime. JR Z,L2096 ; forward to INPUT-1 if checking syntax. - LD A,$01 ; select channel 'K' the keyboard for input. + LD A,#01 ; select channel 'K' the keyboard for input. CALL L1601 ; routine CHAN-OPEN opens it. CALL L0D6E ; routine CLS-LOWER clears the lower screen ; and sets DF_SZ to two. ;; INPUT-1 -L2096: LD (IY+$02),$01 ; update TV_FLAG - signal lower screen in use +L2096: LD (IY+#02),#01 ; update TV_FLAG - signal lower screen in use ; ensuring that the correct set of system ; variables are updated and that the border ; colour is used. @@ -9784,26 +9784,26 @@ L2096: LD (IY+$02),$01 ; update TV_FLAG - signal lower screen in use ; keyboard input has been made and it remains to adjust the upper ; screen in case the lower two lines have been extended upwards. - LD BC,($5C88) ; fetch S_POSN current line/column of + LD BC,(#5C88) ; fetch S_POSN current line/column of ; the upper screen. - LD A,($5C6B) ; fetch DF_SZ the display file size of + LD A,(#5C6B) ; fetch DF_SZ the display file size of ; the lower screen. CP B ; test that lower screen does not overlap JR C,L20AD ; forward to INPUT-2 if not. ; the two screens overlap so adjust upper screen. - LD C,$21 ; set column of upper screen to leftmost. + LD C,#21 ; set column of upper screen to leftmost. LD B,A ; and line to one above lower screen. ; continue forward to update upper screen ; print position. ;; INPUT-2 -L20AD: LD ($5C88),BC ; set S_POSN update upper screen line/column. - LD A,$19 ; subtract from twenty five +L20AD: LD (#5C88),BC ; set S_POSN update upper screen line/column. + LD A,#19 ; subtract from twenty five SUB B ; the new line number. - LD ($5C8C),A ; and place result in SCR_CT - scroll count. - RES 0,(IY+$02) ; update TV_FLAG - signal main screen in use. + LD (#5C8C),A ; and place result in SCR_CT - scroll count. + RES 0,(IY+#02) ; update TV_FLAG - signal main screen in use. CALL L0DD9 ; routine CL-SET sets the print position ; system variables for the upper screen. JP L0D6E ; jump back to CLS-LOWER and make @@ -9823,7 +9823,7 @@ L20C1: CALL L204E ; routine PR-POSN-1 deals with a single JR Z,L20C1 ; back to IN-ITEM-1 until no more in a ; sequence. - CP $28 ; is character '(' ? + CP #28 ; is character '(' ? JR NZ,L20D8 ; forward to IN-ITEM-2 if not. ; any variables within braces will be treated as part, or all, of the prompt @@ -9834,7 +9834,7 @@ L20C1: CALL L204E ; routine PR-POSN-1 deals with a single ; prompt. RST 18H ; GET-CHAR - CP $29 ; is character a matching ')' ? + CP #29 ; is character a matching ')' ? JP NZ,L1C8A ; jump back to REPORT-C if not. ; 'Nonsense in BASIC'. @@ -9844,7 +9844,7 @@ L20C1: CALL L204E ; routine PR-POSN-1 deals with a single ; --- ;; IN-ITEM-2 -L20D8: CP $CA ; is the character the token 'LINE' ? +L20D8: CP #CA ; is the character the token 'LINE' ? JR NZ,L20ED ; forward to IN-ITEM-3 if not. RST 20H ; NEXT-CHAR - variable must come next. @@ -9853,8 +9853,8 @@ L20D8: CP $CA ; is the character the token 'LINE' ? ; or generates an error if no variable ; at this position. - SET 7,(IY+$37) ; update FLAGX - signal handling INPUT LINE - BIT 6,(IY+$01) ; test FLAGS - numeric or string result ? + SET 7,(IY+#37) ; update FLAGX - signal handling INPUT LINE + BIT 6,(IY+#01) ; test FLAGS - numeric or string result ? JP NZ,L1C8A ; jump back to REPORT-C if not string ; 'Nonsense in BASIC'. @@ -9871,29 +9871,29 @@ L20ED: CALL L2C8D ; routine ALPHA checks if character is CALL L1C1F ; routine CLASS-01 returns destination ; address of variable to be assigned. - RES 7,(IY+$37) ; update FLAGX - signal not INPUT LINE. + RES 7,(IY+#37) ; update FLAGX - signal not INPUT LINE. ;; IN-PROMPT L20FA: CALL L2530 ; routine SYNTAX-Z JP Z,L21B2 ; forward to IN-NEXT-2 if checking syntax. CALL L16BF ; routine SET-WORK clears workspace. - LD HL,$5C71 ; point to system variable FLAGX + LD HL,#5C71 ; point to system variable FLAGX RES 6,(HL) ; signal string result. SET 5,(HL) ; signal in Input Mode for editor. - LD BC,$0001 ; initialize space required to one for + LD BC,#0001 ; initialize space required to one for ; the carriage return. BIT 7,(HL) ; test FLAGX - INPUT LINE in use ? JR NZ,L211C ; forward to IN-PR-2 if so as that is ; all the space that is required. - LD A,($5C3B) ; load accumulator from FLAGS - AND $40 ; mask to test BIT 6 of FLAGS and clear + LD A,(#5C3B) ; load accumulator from FLAGS + AND #40 ; mask to test BIT 6 of FLAGS and clear ; the other bits in A. ; numeric result expected ? JR NZ,L211A ; forward to IN-PR-1 if so - LD C,$03 ; increase space to three bytes for the + LD C,#03 ; increase space to three bytes for the ; pair of surrounding quotes. ;; IN-PR-1 @@ -9902,42 +9902,42 @@ L211A: OR (HL) ; if numeric result, set bit 6 of FLAGX. ;; IN-PR-2 L211C: RST 30H ; BC-SPACES opens 1 or 3 bytes in workspace - LD (HL),$0D ; insert carriage return at last new location. + LD (HL),#0D ; insert carriage return at last new location. LD A,C ; fetch the length, one or three. RRCA ; lose bit 0. RRCA ; test if quotes required. JR NC,L2129 ; forward to IN-PR-3 if not. - LD A,$22 ; load the '"' character + LD A,#22 ; load the '"' character LD (DE),A ; place quote in first new location at DE. DEC HL ; decrease HL - from carriage return. LD (HL),A ; and place a quote in second location. ;; IN-PR-3 -L2129: LD ($5C5B),HL ; set keyboard cursor K_CUR to HL - BIT 7,(IY+$37) ; test FLAGX - is this INPUT LINE ?? +L2129: LD (#5C5B),HL ; set keyboard cursor K_CUR to HL + BIT 7,(IY+#37) ; test FLAGX - is this INPUT LINE ?? JR NZ,L215E ; forward to IN-VAR-3 if so as input will ; be accepted without checking its syntax. - LD HL,($5C5D) ; fetch CH_ADD + LD HL,(#5C5D) ; fetch CH_ADD PUSH HL ; and save on stack. - LD HL,($5C3D) ; fetch ERR_SP + LD HL,(#5C3D) ; fetch ERR_SP PUSH HL ; and save on stack ;; IN-VAR-1 L213A: LD HL,L213A ; address: IN-VAR-1 - this address PUSH HL ; is saved on stack to handle errors. - BIT 4,(IY+$30) ; test FLAGS2 - is K channel in use ? + BIT 4,(IY+#30) ; test FLAGS2 - is K channel in use ? JR Z,L2148 ; forward to IN-VAR-2 if not using the ; keyboard for input. (??) - LD ($5C3D),SP ; set ERR_SP to point to IN-VAR-1 on stack. + LD (#5C3D),SP ; set ERR_SP to point to IN-VAR-1 on stack. ;; IN-VAR-2 -L2148: LD HL,($5C61) ; set HL to WORKSP - start of workspace. +L2148: LD HL,(#5C61) ; set HL to WORKSP - start of workspace. CALL L11A7 ; routine REMOVE-FP removes floating point ; forms when looping in error condition. - LD (IY+$00),$FF ; set ERR_NR to 'OK' cancelling the error. + LD (IY+#00),#FF ; set ERR_NR to 'OK' cancelling the error. ; but X_PTR causes flashing error marker ; to be displayed at each call to the editor. CALL L0F2C ; routine EDITOR allows input to be entered @@ -9945,7 +9945,7 @@ L2148: LD HL,($5C61) ; set HL to WORKSP - start of workspace. ; if we pass to next then there are no system errors - RES 7,(IY+$01) ; update FLAGS - signal checking syntax + RES 7,(IY+#01) ; update FLAGS - signal checking syntax CALL L21B9 ; routine IN-ASSIGN checks syntax using ; the VAL-FET-2 and powerful SCANNING routines. ; any syntax error and its back to IN-VAR-1. @@ -9971,7 +9971,7 @@ L215E: CALL L0F2C ; routine EDITOR is called for input ; INPUT and INPUT LINE converge here. ;; IN-VAR-4 -L2161: LD (IY+$22),$00 ; set K_CUR_hi to a low value so that the cursor +L2161: LD (IY+#22),#00 ; set K_CUR_hi to a low value so that the cursor ; no longer appears in the input line. CALL L21D6 ; routine IN-CHAN-K tests if the keyboard @@ -9987,14 +9987,14 @@ L2161: LD (IY+$22),$00 ; set K_CUR_hi to a low value so that the cursor ; if you're inputting more than one item in ; a statement then that becomes apparent. - LD BC,($5C82) ; fetch line and column from ECHO_E + LD BC,(#5C82) ; fetch line and column from ECHO_E CALL L0DD9 ; routine CL-SET sets S-POSNL to those ; values. ; if using another input channel rejoin here. ;; IN-VAR-5 -L2174: LD HL,$5C71 ; point HL to FLAGX +L2174: LD HL,#5C71 ; point HL to FLAGX RES 5,(HL) ; signal not in input mode BIT 7,(HL) ; is this INPUT LINE ? RES 7,(HL) ; cancel the bit anyway. @@ -10003,20 +10003,20 @@ L2174: LD HL,$5C71 ; point HL to FLAGX POP HL ; drop the looping address POP HL ; drop the the address of previous ; error handler. - LD ($5C3D),HL ; set ERR_SP to point to it. + LD (#5C3D),HL ; set ERR_SP to point to it. POP HL ; drop original CH_ADD which points to ; INPUT command in BASIC line. - LD ($5C5F),HL ; save in X_PTR while input is assigned. - SET 7,(IY+$01) ; update FLAGS - Signal running program + LD (#5C5F),HL ; save in X_PTR while input is assigned. + SET 7,(IY+#01) ; update FLAGS - Signal running program CALL L21B9 ; routine IN-ASSIGN is called again ; this time the variable will be assigned ; the input value without error. ; Note. the previous example now ; becomes "hatstand" - LD HL,($5C5F) ; fetch stored CH_ADD value from X_PTR. - LD (IY+$26),$00 ; set X_PTR_hi so that iy is no longer relevant. - LD ($5C5D),HL ; put restored value back in CH_ADD + LD HL,(#5C5F) ; fetch stored CH_ADD value from X_PTR. + LD (IY+#26),#00 ; set X_PTR_hi so that iy is no longer relevant. + LD (#5C5D),HL ; put restored value back in CH_ADD JR L21B2 ; forward to IN-NEXT-2 to see if anything ; more in the INPUT list. @@ -10025,8 +10025,8 @@ L2174: LD HL,$5C71 ; point HL to FLAGX ; the jump was to here with INPUT LINE only ;; IN-VAR-6 -L219B: LD HL,($5C63) ; STKBOT points to the end of the input. - LD DE,($5C61) ; WORKSP points to the beginning. +L219B: LD HL,(#5C63) ; STKBOT points to the end of the input. + LD DE,(#5C61) ; WORKSP points to the beginning. SCF ; prepare for true subtraction. SBC HL,DE ; subtract to get length LD B,H ; transfer it to @@ -10064,20 +10064,20 @@ L21B2: CALL L204E ; routine PR-POSN-1 handles a position item. ; the assignment. ;; IN-ASSIGN -L21B9: LD HL,($5C61) ; fetch WORKSP start of input - LD ($5C5D),HL ; set CH_ADD to first character +L21B9: LD HL,(#5C61) ; fetch WORKSP start of input + LD (#5C5D),HL ; set CH_ADD to first character RST 18H ; GET-CHAR ignoring leading white-space. - CP $E2 ; is it 'STOP' + CP #E2 ; is it 'STOP' JR Z,L21D0 ; forward to IN-STOP if so. - LD A,($5C71) ; load accumulator from FLAGX + LD A,(#5C71) ; load accumulator from FLAGX CALL L1C59 ; routine VAL-FET-2 makes assignment ; or goes through the motions if checking ; syntax. SCANNING is used. RST 18H ; GET-CHAR - CP $0D ; is it carriage return ? + CP #0D ; is it carriage return ? RET Z ; return if so ; either syntax is OK ; or assignment has been made. @@ -10088,7 +10088,7 @@ L21B9: LD HL,($5C61) ; fetch WORKSP start of input ;; REPORT-Cb L21CE: RST 08H ; ERROR-1 - DEFB $0B ; Error Report: Nonsense in BASIC + DEFB #0B ; Error Report: Nonsense in BASIC ;; IN-STOP L21D0: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) @@ -10099,7 +10099,7 @@ L21D0: CALL L2530 ; routine SYNTAX-Z (UNSTACK-Z?) ;; REPORT-H L21D4: RST 08H ; ERROR-1 - DEFB $10 ; Error Report: STOP in INPUT + DEFB #10 ; Error Report: STOP in INPUT ; ------------------ ; Test for channel K @@ -10109,13 +10109,13 @@ L21D4: RST 08H ; ERROR-1 ; use is the one for the keyboard. ;; IN-CHAN-K -L21D6: LD HL,($5C51) ; fetch address of current channel CURCHL +L21D6: LD HL,(#5C51) ; fetch address of current channel CURCHL INC HL ; INC HL ; advance past INC HL ; input and INC HL ; output streams LD A,(HL) ; fetch the channel identifier. - CP $4B ; test for 'K' + CP #4B ; test for 'K' RET ; return with zero set if keyboard is use. ; -------------------- @@ -10156,10 +10156,10 @@ L21E2: CALL L21F2 ; routine CO-TEMP-3 to output colour control. RST 18H ; GET-CHAR - CP $2C ; is it ',' separator ? + CP #2C ; is it ',' separator ? JR Z,L21E1 ; back if so to CO-TEMP-1 - CP $3B ; is it ';' separator ? + CP #3B ; is it ';' separator ? JR Z,L21E1 ; back to CO-TEMP-1 for more. JP L1C8A ; to REPORT-C (REPORT-Cb is within range) @@ -10175,12 +10175,12 @@ L21E2: CALL L21F2 ; routine CO-TEMP-3 to output colour control. ; It is quite permissible to send these to any stream. ;; CO-TEMP-3 -L21F2: CP $D9 ; is it 'INK' ? +L21F2: CP #D9 ; is it 'INK' ? RET C ; return if less. - CP $DF ; compare with 'OUT' + CP #DF ; compare with 'OUT' CCF ; Complement Carry Flag - RET C ; return if greater than 'OVER', $DE. + RET C ; return if greater than 'OVER', #DE. PUSH AF ; save the colour token. @@ -10190,8 +10190,8 @@ L21F2: CP $D9 ; is it 'INK' ? ; -> this entry point used by CLASS-07. e.g. the command PAPER 6. ;; CO-TEMP-4 -L21FC: SUB $C9 ; reduce to control character $10 (INK) - ; thru $15 (OVER). +L21FC: SUB #C9 ; reduce to control character #10 (INK) + ; thru #15 (OVER). PUSH AF ; save control. CALL L1C82 ; routine EXPT-1NUM stacks addressed ; parameter on calculator stack. @@ -10243,37 +10243,37 @@ L21FC: SUB $C9 ; reduce to control character $10 (INK) ; The colour system variable handler. ; ------------------------------------ ; This is an exit branch from PO-1-OPER, PO-2-OPER -; A holds control $10 (INK) to $15 (OVER) +; A holds control #10 (INK) to #15 (OVER) ; D holds parameter 0-9 for ink/paper 0,1 or 8 for bright/flash, ; 0 or 1 for over/inverse. ;; CO-TEMP-5 -L2211: SUB $11 ; reduce range $FF-$04 - ADC A,$00 ; add in carry if INK +L2211: SUB #11 ; reduce range #FF-#04 + ADC A,#00 ; add in carry if INK JR Z,L2234 ; forward to CO-TEMP-7 with INK and PAPER. - SUB $02 ; reduce range $FF-$02 - ADC A,$00 ; add carry if FLASH + SUB #02 ; reduce range #FF-#02 + ADC A,#00 ; add carry if FLASH JR Z,L2273 ; forward to CO-TEMP-C with FLASH and BRIGHT. - CP $01 ; is it 'INVERSE' ? + CP #01 ; is it 'INVERSE' ? LD A,D ; fetch parameter for INVERSE/OVER - LD B,$01 ; prepare OVER mask setting bit 0. + LD B,#01 ; prepare OVER mask setting bit 0. JR NZ,L2228 ; forward to CO-TEMP-6 if OVER RLCA ; shift bit 0 RLCA ; to bit 2 - LD B,$04 ; set bit 2 of mask for inverse. + LD B,#04 ; set bit 2 of mask for inverse. ;; CO-TEMP-6 L2228: LD C,A ; save the A LD A,D ; re-fetch parameter - CP $02 ; is it less than 2 + CP #02 ; is it less than 2 JR NC,L2244 ; to REPORT-K if not 0 or 1. ; 'Invalid colour'. LD A,C ; restore A - LD HL,$5C91 ; address system variable P_FLAG + LD HL,#5C91 ; address system variable P_FLAG JR L226C ; forward to exit via routine CO-CHANGE ; --- @@ -10282,31 +10282,31 @@ L2228: LD C,A ; save the A ;; CO-TEMP-7 L2234: LD A,D ; fetch parameter - LD B,$07 ; set ink mask 00000111 + LD B,#07 ; set ink mask 00000111 JR C,L223E ; forward to CO-TEMP-8 with INK RLCA ; shift bits 0-2 RLCA ; to RLCA ; bits 3-5 - LD B,$38 ; set paper mask 00111000 + LD B,#38 ; set paper mask 00111000 ; both paper and ink rejoin here ;; CO-TEMP-8 L223E: LD C,A ; value to C LD A,D ; fetch parameter - CP $0A ; is it less than 10d ? + CP #0A ; is it less than 10d ? JR C,L2246 ; forward to CO-TEMP-9 if so. ; ink 10 etc. is not allowed. ;; REPORT-K L2244: RST 08H ; ERROR-1 - DEFB $13 ; Error Report: Invalid colour + DEFB #13 ; Error Report: Invalid colour ;; CO-TEMP-9 -L2246: LD HL,$5C8F ; address system variable ATTR_T initially. - CP $08 ; compare with 8 +L2246: LD HL,#5C8F ; address system variable ATTR_T initially. + CP #08 ; compare with 8 JR C,L2258 ; forward to CO-TEMP-B with 0-7. LD A,(HL) ; fetch temporary attribute as no change. @@ -10316,7 +10316,7 @@ L2246: LD HL,$5C8F ; address system variable ATTR_T initially. OR B ; or with mask to make white CPL ; make black and change other to dark - AND $24 ; 00100100 + AND #24 ; 00100100 JR Z,L2257 ; forward to CO-TEMP-A if black and ; originally light. @@ -10329,9 +10329,9 @@ L2257: LD C,A ; save A in C L2258: LD A,C ; load colour to A CALL L226C ; routine CO-CHANGE addressing ATTR-T - LD A,$07 ; put 7 in accumulator + LD A,#07 ; put 7 in accumulator CP D ; compare with parameter - SBC A,A ; $00 if 0-7, $FF if 8 + SBC A,A ; #00 if 0-7, #FF if 8 CALL L226C ; routine CO-CHANGE addressing MASK-T ; mask returned in A. @@ -10339,11 +10339,11 @@ L2258: LD A,C ; load colour to A RLCA ; 01110000 or 00001110 RLCA ; 11100000 or 00011100 - AND $50 ; 01000000 or 00010000 (AND 01010000) + AND #50 ; 01000000 or 00010000 (AND 01010000) LD B,A ; transfer to mask - LD A,$08 ; load A with 8 + LD A,#08 ; load A with 8 CP D ; compare with parameter - SBC A,A ; $FF if was 9, $00 if 0-8 + SBC A,A ; #FF if was 9, #00 if 0-8 ; continue while addressing P-FLAG ; setting bit 4 if ink 9 ; setting bit 6 if paper 9 @@ -10371,25 +10371,25 @@ L226C: XOR (HL) ; impress bits specified L2273: SBC A,A ; set zero flag for bright. LD A,D ; fetch original parameter 0,1 or 8 RRCA ; rotate bit 0 to bit 7 - LD B,$80 ; mask for flash 10000000 + LD B,#80 ; mask for flash 10000000 JR NZ,L227D ; forward to CO-TEMP-D if flash RRCA ; rotate bit 7 to bit 6 - LD B,$40 ; mask for bright 01000000 + LD B,#40 ; mask for bright 01000000 ;; CO-TEMP-D L227D: LD C,A ; store value in C LD A,D ; fetch parameter - CP $08 ; compare with 8 + CP #08 ; compare with 8 JR Z,L2287 ; forward to CO-TEMP-E if 8 - CP $02 ; test if 0 or 1 + CP #02 ; test if 0 or 1 JR NC,L2244 ; back to REPORT-K if not ; 'Invalid colour' ;; CO-TEMP-E L2287: LD A,C ; value to A - LD HL,$5C8F ; address ATTR_T + LD HL,#5C8F ; address ATTR_T CALL L226C ; routine CO-CHANGE addressing ATTR_T LD A,C ; fetch value RRCA ; for flash8/bright8 complete @@ -10407,11 +10407,11 @@ L2287: LD A,C ; value to A ;; BORDER L2294: CALL L1E94 ; routine FIND-INT1 - CP $08 ; must be in range 0 (black) to 7 (white) + CP #08 ; must be in range 0 (black) to 7 (white) JR NC,L2244 ; back to REPORT-K if not ; 'Invalid colour'. - OUT ($FE),A ; outputting to port effects an immediate + OUT (#FE),A ; outputting to port effects an immediate ; change. RLCA ; shift the colour to RLCA ; the paper bits setting the @@ -10420,10 +10420,10 @@ L2294: CALL L1E94 ; routine FIND-INT1 ; i.e. in the range green to white. JR NZ,L22A6 ; skip to BORDER-1 if so - XOR $07 ; make the ink white. + XOR #07 ; make the ink white. ;; BORDER-1 -L22A6: LD ($5C48),A ; update BORDCR with new paper/ink +L22A6: LD (#5C48),A ; update BORDCR with new paper/ink RET ; return. ; ----------------- @@ -10433,7 +10433,7 @@ L22A6: LD ($5C48),A ; update BORDCR with new paper/ink ; ;; PIXEL-ADD -L22AA: LD A,$AF ; load with 175 decimal. +L22AA: LD A,#AF ; load with 175 decimal. SUB B ; subtract the y value. JP C,L24F9 ; jump forward to REPORT-Bc if greater. ; 'Integer out of range' @@ -10454,7 +10454,7 @@ L22AA: LD A,$AF ; load with 175 decimal. RRA ; 010xxxxx XOR B ; - AND $F8 ; keep the top 5 bits 11111000 + AND #F8 ; keep the top 5 bits 11111000 XOR B ; 010xxbbb LD H,A ; transfer high byte to H. @@ -10465,7 +10465,7 @@ L22AA: LD A,$AF ; load with 175 decimal. RLCA ; RLCA ; XOR B ; the y value - AND $C7 ; apply mask 11000111 + AND #C7 ; apply mask 11000111 XOR B ; restore unmasked bits xxyyyxxx RLCA ; rotate to xyyyxxxx RLCA ; required position. yyyxxxxx @@ -10474,7 +10474,7 @@ L22AA: LD A,$AF ; load with 175 decimal. ; finally form the pixel position in A. LD A,C ; x value to A - AND $07 ; mod 8 + AND #07 ; mod 8 RET ; return ; ---------------- @@ -10494,7 +10494,7 @@ L22CB: CALL L2307 ; routine STK-TO-BC L22D4: RLCA ; rotate and loop back DJNZ L22D4 ; to POINT-LP until pixel at right. - AND $01 ; test to give zero or one. + AND #01 ; test to give zero or one. JP L2D28 ; jump forward to STACK-A to save result. ; ------------------- @@ -10520,12 +10520,12 @@ L22DC: CALL L2307 ; routine STK-TO-BC ; back on the screen though the colours may change. ;; PLOT-SUB -L22E5: LD ($5C7D),BC ; store new x/y values in COORDS +L22E5: LD (#5C7D),BC ; store new x/y values in COORDS CALL L22AA ; routine PIXEL-ADD gets address in HL, ; count from left 0-7 in B. LD B,A ; transfer count to B. INC B ; increase 1-8. - LD A,$FE ; 11111110 in A. + LD A,#FE ; 11111110 in A. ;; PLOT-LOOP L22F0: RRCA ; rotate mask. @@ -10534,7 +10534,7 @@ L22F0: RRCA ; rotate mask. LD B,A ; load mask to B LD A,(HL) ; fetch screen byte to A - LD C,(IY+$57) ; P_FLAG to C + LD C,(IY+#57) ; P_FLAG to C BIT 0,C ; is it to be OVER 1 ? JR NZ,L22FD ; forward to PL-TST-IN if so. @@ -10582,10 +10582,10 @@ L2314: CALL L2DD5 ; routine FP-TO-A compresses last value into ; zero flag set if positive. JP C,L24F9 ; jump forward to REPORT-Bc if >= 255.5. - LD C,$01 ; prepare a positive sign byte. + LD C,#01 ; prepare a positive sign byte. RET Z ; return if FP-TO-BC indicated positive. - LD C,$FF ; prepare negative sign byte and + LD C,#FF ; prepare negative sign byte and RET ; return. @@ -10597,7 +10597,7 @@ L2314: CALL L2DD5 ; routine FP-TO-A compresses last value into ;; CIRCLE L2320: RST 18H ; GET-CHAR - CP $2C ; is it required comma ? + CP #2C ; is it required comma ? JP NZ,L1C8A ; jump to REPORT-C if not @@ -10607,19 +10607,19 @@ L2320: RST 18H ; GET-CHAR ; nothing follows command. RST 28H ;; FP-CALC - DEFB $2A ;;abs ; make radius positive - DEFB $3D ;;re-stack ; in full floating point form - DEFB $38 ;;end-calc + DEFB #2A ;;abs ; make radius positive + DEFB #3D ;;re-stack ; in full floating point form + DEFB #38 ;;end-calc LD A,(HL) ; fetch first floating point byte - CP $81 ; compare to one + CP #81 ; compare to one JR NC,L233B ; forward to C-R-GRE-1 if circle radius ; is greater than one. RST 28H ;; FP-CALC - DEFB $02 ;;delete ; delete the radius from stack. - DEFB $38 ;;end-calc + DEFB #02 ;;delete ; delete the radius from stack. + DEFB #38 ;;end-calc JR L22DC ; to PLOT to just plot x,y. @@ -10628,34 +10628,34 @@ L2320: RST 18H ; GET-CHAR ;; C-R-GRE-1 L233B: RST 28H ;; FP-CALC ; x, y, r - DEFB $A3 ;;stk-pi/2 ; x, y, r, pi/2. - DEFB $38 ;;end-calc + DEFB #A3 ;;stk-pi/2 ; x, y, r, pi/2. + DEFB #38 ;;end-calc - LD (HL),$83 ; ; x, y, r, 2*PI + LD (HL),#83 ; ; x, y, r, 2*PI RST 28H ;; FP-CALC - DEFB $C5 ;;st-mem-5 ; store 2*PI in mem-5 - DEFB $02 ;;delete ; x, y, z. - DEFB $38 ;;end-calc + DEFB #C5 ;;st-mem-5 ; store 2*PI in mem-5 + DEFB #02 ;;delete ; x, y, z. + DEFB #38 ;;end-calc CALL L247D ; routine CD-PRMS1 PUSH BC ; RST 28H ;; FP-CALC - DEFB $31 ;;duplicate - DEFB $E1 ;;get-mem-1 - DEFB $04 ;;multiply - DEFB $38 ;;end-calc + DEFB #31 ;;duplicate + DEFB #E1 ;;get-mem-1 + DEFB #04 ;;multiply + DEFB #38 ;;end-calc LD A,(HL) ; - CP $80 ; + CP #80 ; JR NC,L235A ; to C-ARC-GE1 RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #02 ;;delete + DEFB #38 ;;end-calc POP BC ; JP L22DC ; JUMP to PLOT @@ -10665,34 +10665,34 @@ L233B: RST 28H ;; FP-CALC ; x, y, r ;; C-ARC-GE1 L235A: RST 28H ;; FP-CALC - DEFB $C2 ;;st-mem-2 - DEFB $01 ;;exchange - DEFB $C0 ;;st-mem-0 - DEFB $02 ;;delete - DEFB $03 ;;subtract - DEFB $01 ;;exchange - DEFB $E0 ;;get-mem-0 - DEFB $0F ;;addition - DEFB $C0 ;;st-mem-0 - DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $E0 ;;get-mem-0 - DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $E0 ;;get-mem-0 - DEFB $A0 ;;stk-zero - DEFB $C1 ;;st-mem-1 - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #C2 ;;st-mem-2 + DEFB #01 ;;exchange + DEFB #C0 ;;st-mem-0 + DEFB #02 ;;delete + DEFB #03 ;;subtract + DEFB #01 ;;exchange + DEFB #E0 ;;get-mem-0 + DEFB #0F ;;addition + DEFB #C0 ;;st-mem-0 + DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #E0 ;;get-mem-0 + DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #E0 ;;get-mem-0 + DEFB #A0 ;;stk-zero + DEFB #C1 ;;st-mem-1 + DEFB #02 ;;delete + DEFB #38 ;;end-calc - INC (IY+$62) ; MEM-2-1st + INC (IY+#62) ; MEM-2-1st CALL L1E94 ; routine FIND-INT1 LD L,A ; PUSH HL ; CALL L1E94 ; routine FIND-INT1 POP HL ; LD H,A ; - LD ($5C7D),HL ; COORDS + LD (#5C7D),HL ; COORDS POP BC ; JP L2420 ; to DRW-STEPS @@ -10705,7 +10705,7 @@ L235A: RST 28H ;; FP-CALC ;; DRAW L2382: RST 18H ; GET-CHAR - CP $2C ; + CP #2C ; JR Z,L238D ; to DR-3-PRMS CALL L1BEE ; routine CHECK-END @@ -10719,53 +10719,53 @@ L238D: RST 20H ; NEXT-CHAR CALL L1BEE ; routine CHECK-END RST 28H ;; FP-CALC - DEFB $C5 ;;st-mem-5 - DEFB $A2 ;;stk-half - DEFB $04 ;;multiply - DEFB $1F ;;sin - DEFB $31 ;;duplicate - DEFB $30 ;;not - DEFB $30 ;;not - DEFB $00 ;;jump-true + DEFB #C5 ;;st-mem-5 + DEFB #A2 ;;stk-half + DEFB #04 ;;multiply + DEFB #1F ;;sin + DEFB #31 ;;duplicate + DEFB #30 ;;not + DEFB #30 ;;not + DEFB #00 ;;jump-true - DEFB $06 ;;to L23A3, DR-SIN-NZ + DEFB #06 ;;to L23A3, DR-SIN-NZ - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #38 ;;end-calc JP L2477 ; to LINE-DRAW ; --- ;; DR-SIN-NZ -L23A3: DEFB $C0 ;;st-mem-0 - DEFB $02 ;;delete - DEFB $C1 ;;st-mem-1 - DEFB $02 ;;delete - DEFB $31 ;;duplicate - DEFB $2A ;;abs - DEFB $E1 ;;get-mem-1 - DEFB $01 ;;exchange - DEFB $E1 ;;get-mem-1 - DEFB $2A ;;abs - DEFB $0F ;;addition - DEFB $E0 ;;get-mem-0 - DEFB $05 ;;division - DEFB $2A ;;abs - DEFB $E0 ;;get-mem-0 - DEFB $01 ;;exchange - DEFB $3D ;;re-stack - DEFB $38 ;;end-calc +L23A3: DEFB #C0 ;;st-mem-0 + DEFB #02 ;;delete + DEFB #C1 ;;st-mem-1 + DEFB #02 ;;delete + DEFB #31 ;;duplicate + DEFB #2A ;;abs + DEFB #E1 ;;get-mem-1 + DEFB #01 ;;exchange + DEFB #E1 ;;get-mem-1 + DEFB #2A ;;abs + DEFB #0F ;;addition + DEFB #E0 ;;get-mem-0 + DEFB #05 ;;division + DEFB #2A ;;abs + DEFB #E0 ;;get-mem-0 + DEFB #01 ;;exchange + DEFB #3D ;;re-stack + DEFB #38 ;;end-calc LD A,(HL) ; - CP $81 ; + CP #81 ; JR NC,L23C1 ; to DR-PRMS RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #02 ;;delete + DEFB #38 ;;end-calc JP L2477 ; to LINE-DRAW @@ -10776,91 +10776,91 @@ L23C1: CALL L247D ; routine CD-PRMS1 PUSH BC ; RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $E1 ;;get-mem-1 - DEFB $01 ;;exchange - DEFB $05 ;;division - DEFB $C1 ;;st-mem-1 - DEFB $02 ;;delete - DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $E1 ;;get-mem-1 - DEFB $04 ;;multiply - DEFB $C2 ;;st-mem-2 - DEFB $02 ;;delete - DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $E1 ;;get-mem-1 - DEFB $04 ;;multiply - DEFB $E2 ;;get-mem-2 - DEFB $E5 ;;get-mem-5 - DEFB $E0 ;;get-mem-0 - DEFB $03 ;;subtract - DEFB $A2 ;;stk-half - DEFB $04 ;;multiply - DEFB $31 ;;duplicate - DEFB $1F ;;sin - DEFB $C5 ;;st-mem-5 - DEFB $02 ;;delete - DEFB $20 ;;cos - DEFB $C0 ;;st-mem-0 - DEFB $02 ;;delete - DEFB $C2 ;;st-mem-2 - DEFB $02 ;;delete - DEFB $C1 ;;st-mem-1 - DEFB $E5 ;;get-mem-5 - DEFB $04 ;;multiply - DEFB $E0 ;;get-mem-0 - DEFB $E2 ;;get-mem-2 - DEFB $04 ;;multiply - DEFB $0F ;;addition - DEFB $E1 ;;get-mem-1 - DEFB $01 ;;exchange - DEFB $C1 ;;st-mem-1 - DEFB $02 ;;delete - DEFB $E0 ;;get-mem-0 - DEFB $04 ;;multiply - DEFB $E2 ;;get-mem-2 - DEFB $E5 ;;get-mem-5 - DEFB $04 ;;multiply - DEFB $03 ;;subtract - DEFB $C2 ;;st-mem-2 - DEFB $2A ;;abs - DEFB $E1 ;;get-mem-1 - DEFB $2A ;;abs - DEFB $0F ;;addition - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #E1 ;;get-mem-1 + DEFB #01 ;;exchange + DEFB #05 ;;division + DEFB #C1 ;;st-mem-1 + DEFB #02 ;;delete + DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #E1 ;;get-mem-1 + DEFB #04 ;;multiply + DEFB #C2 ;;st-mem-2 + DEFB #02 ;;delete + DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #E1 ;;get-mem-1 + DEFB #04 ;;multiply + DEFB #E2 ;;get-mem-2 + DEFB #E5 ;;get-mem-5 + DEFB #E0 ;;get-mem-0 + DEFB #03 ;;subtract + DEFB #A2 ;;stk-half + DEFB #04 ;;multiply + DEFB #31 ;;duplicate + DEFB #1F ;;sin + DEFB #C5 ;;st-mem-5 + DEFB #02 ;;delete + DEFB #20 ;;cos + DEFB #C0 ;;st-mem-0 + DEFB #02 ;;delete + DEFB #C2 ;;st-mem-2 + DEFB #02 ;;delete + DEFB #C1 ;;st-mem-1 + DEFB #E5 ;;get-mem-5 + DEFB #04 ;;multiply + DEFB #E0 ;;get-mem-0 + DEFB #E2 ;;get-mem-2 + DEFB #04 ;;multiply + DEFB #0F ;;addition + DEFB #E1 ;;get-mem-1 + DEFB #01 ;;exchange + DEFB #C1 ;;st-mem-1 + DEFB #02 ;;delete + DEFB #E0 ;;get-mem-0 + DEFB #04 ;;multiply + DEFB #E2 ;;get-mem-2 + DEFB #E5 ;;get-mem-5 + DEFB #04 ;;multiply + DEFB #03 ;;subtract + DEFB #C2 ;;st-mem-2 + DEFB #2A ;;abs + DEFB #E1 ;;get-mem-1 + DEFB #2A ;;abs + DEFB #0F ;;addition + DEFB #02 ;;delete + DEFB #38 ;;end-calc LD A,(DE) ; - CP $81 ; + CP #81 ; POP BC ; JP C,L2477 ; to LINE-DRAW PUSH BC ; RST 28H ;; FP-CALC - DEFB $01 ;;exchange - DEFB $38 ;;end-calc + DEFB #01 ;;exchange + DEFB #38 ;;end-calc - LD A,($5C7D) ; COORDS-x + LD A,(#5C7D) ; COORDS-x CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $C0 ;;st-mem-0 - DEFB $0F ;;addition - DEFB $01 ;;exchange - DEFB $38 ;;end-calc + DEFB #C0 ;;st-mem-0 + DEFB #0F ;;addition + DEFB #01 ;;exchange + DEFB #38 ;;end-calc - LD A,($5C7E) ; COORDS-y + LD A,(#5C7E) ; COORDS-y CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $C5 ;;st-mem-5 - DEFB $0F ;;addition - DEFB $E0 ;;get-mem-0 - DEFB $E5 ;;get-mem-5 - DEFB $38 ;;end-calc + DEFB #C5 ;;st-mem-5 + DEFB #0F ;;addition + DEFB #E0 ;;get-mem-0 + DEFB #E5 ;;get-mem-5 + DEFB #38 ;;end-calc POP BC ; @@ -10875,56 +10875,56 @@ L2420: DEC B ; ;; ARC-LOOP L2425: RST 28H ;; FP-CALC - DEFB $E1 ;;get-mem-1 - DEFB $31 ;;duplicate - DEFB $E3 ;;get-mem-3 - DEFB $04 ;;multiply - DEFB $E2 ;;get-mem-2 - DEFB $E4 ;;get-mem-4 - DEFB $04 ;;multiply - DEFB $03 ;;subtract - DEFB $C1 ;;st-mem-1 - DEFB $02 ;;delete - DEFB $E4 ;;get-mem-4 - DEFB $04 ;;multiply - DEFB $E2 ;;get-mem-2 - DEFB $E3 ;;get-mem-3 - DEFB $04 ;;multiply - DEFB $0F ;;addition - DEFB $C2 ;;st-mem-2 - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #E1 ;;get-mem-1 + DEFB #31 ;;duplicate + DEFB #E3 ;;get-mem-3 + DEFB #04 ;;multiply + DEFB #E2 ;;get-mem-2 + DEFB #E4 ;;get-mem-4 + DEFB #04 ;;multiply + DEFB #03 ;;subtract + DEFB #C1 ;;st-mem-1 + DEFB #02 ;;delete + DEFB #E4 ;;get-mem-4 + DEFB #04 ;;multiply + DEFB #E2 ;;get-mem-2 + DEFB #E3 ;;get-mem-3 + DEFB #04 ;;multiply + DEFB #0F ;;addition + DEFB #C2 ;;st-mem-2 + DEFB #02 ;;delete + DEFB #38 ;;end-calc ;; ARC-START L2439: PUSH BC ; RST 28H ;; FP-CALC - DEFB $C0 ;;st-mem-0 - DEFB $02 ;;delete - DEFB $E1 ;;get-mem-1 - DEFB $0F ;;addition - DEFB $31 ;;duplicate - DEFB $38 ;;end-calc + DEFB #C0 ;;st-mem-0 + DEFB #02 ;;delete + DEFB #E1 ;;get-mem-1 + DEFB #0F ;;addition + DEFB #31 ;;duplicate + DEFB #38 ;;end-calc - LD A,($5C7D) ; COORDS-x + LD A,(#5C7D) ; COORDS-x CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $03 ;;subtract - DEFB $E0 ;;get-mem-0 - DEFB $E2 ;;get-mem-2 - DEFB $0F ;;addition - DEFB $C0 ;;st-mem-0 - DEFB $01 ;;exchange - DEFB $E0 ;;get-mem-0 - DEFB $38 ;;end-calc + DEFB #03 ;;subtract + DEFB #E0 ;;get-mem-0 + DEFB #E2 ;;get-mem-2 + DEFB #0F ;;addition + DEFB #C0 ;;st-mem-0 + DEFB #01 ;;exchange + DEFB #E0 ;;get-mem-0 + DEFB #38 ;;end-calc - LD A,($5C7E) ; COORDS-y + LD A,(#5C7E) ; COORDS-y CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $03 ;;subtract - DEFB $38 ;;end-calc + DEFB #03 ;;subtract + DEFB #38 ;;end-calc CALL L24B7 ; routine DRAW-LINE POP BC ; @@ -10933,25 +10933,25 @@ L2439: PUSH BC ; ;; ARC-END L245F: RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $02 ;;delete - DEFB $01 ;;exchange - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #02 ;;delete + DEFB #01 ;;exchange + DEFB #38 ;;end-calc - LD A,($5C7D) ; COORDS-x + LD A,(#5C7D) ; COORDS-x CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $03 ;;subtract - DEFB $01 ;;exchange - DEFB $38 ;;end-calc + DEFB #03 ;;subtract + DEFB #01 ;;exchange + DEFB #38 ;;end-calc - LD A,($5C7E) ; COORDS-y + LD A,(#5C7E) ; COORDS-y CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $03 ;;subtract - DEFB $38 ;;end-calc + DEFB #03 ;;subtract + DEFB #38 ;;end-calc ;; LINE-DRAW L2477: CALL L24B7 ; routine DRAW-LINE @@ -10966,59 +10966,59 @@ L2477: CALL L24B7 ; routine DRAW-LINE ;; CD-PRMS1 L247D: RST 28H ;; FP-CALC - DEFB $31 ;;duplicate - DEFB $28 ;;sqr - DEFB $34 ;;stk-data - DEFB $32 ;;Exponent: $82, Bytes: 1 - DEFB $00 ;;(+00,+00,+00) - DEFB $01 ;;exchange - DEFB $05 ;;division - DEFB $E5 ;;get-mem-5 - DEFB $01 ;;exchange - DEFB $05 ;;division - DEFB $2A ;;abs - DEFB $38 ;;end-calc + DEFB #31 ;;duplicate + DEFB #28 ;;sqr + DEFB #34 ;;stk-data + DEFB #32 ;;Exponent: #82, Bytes: 1 + DEFB #00 ;;(+00,+00,+00) + DEFB #01 ;;exchange + DEFB #05 ;;division + DEFB #E5 ;;get-mem-5 + DEFB #01 ;;exchange + DEFB #05 ;;division + DEFB #2A ;;abs + DEFB #38 ;;end-calc CALL L2DD5 ; routine FP-TO-A JR C,L2495 ; to USE-252 - AND $FC ; - ADD A,$04 ; + AND #FC ; + ADD A,#04 ; JR NC,L2497 ; to DRAW-SAVE ;; USE-252 -L2495: LD A,$FC ; +L2495: LD A,#FC ; ;; DRAW-SAVE L2497: PUSH AF ; CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $E5 ;;get-mem-5 - DEFB $01 ;;exchange - DEFB $05 ;;division - DEFB $31 ;;duplicate - DEFB $1F ;;sin - DEFB $C4 ;;st-mem-4 - DEFB $02 ;;delete - DEFB $31 ;;duplicate - DEFB $A2 ;;stk-half - DEFB $04 ;;multiply - DEFB $1F ;;sin - DEFB $C1 ;;st-mem-1 - DEFB $01 ;;exchange - DEFB $C0 ;;st-mem-0 - DEFB $02 ;;delete - DEFB $31 ;;duplicate - DEFB $04 ;;multiply - DEFB $31 ;;duplicate - DEFB $0F ;;addition - DEFB $A1 ;;stk-one - DEFB $03 ;;subtract - DEFB $1B ;;negate - DEFB $C3 ;;st-mem-3 - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #E5 ;;get-mem-5 + DEFB #01 ;;exchange + DEFB #05 ;;division + DEFB #31 ;;duplicate + DEFB #1F ;;sin + DEFB #C4 ;;st-mem-4 + DEFB #02 ;;delete + DEFB #31 ;;duplicate + DEFB #A2 ;;stk-half + DEFB #04 ;;multiply + DEFB #1F ;;sin + DEFB #C1 ;;st-mem-1 + DEFB #01 ;;exchange + DEFB #C0 ;;st-mem-0 + DEFB #02 ;;delete + DEFB #31 ;;duplicate + DEFB #04 ;;multiply + DEFB #31 ;;duplicate + DEFB #0F ;;addition + DEFB #A1 ;;stk-one + DEFB #03 ;;subtract + DEFB #1B ;;negate + DEFB #C3 ;;st-mem-3 + DEFB #02 ;;delete + DEFB #38 ;;end-calc POP BC ; RET ; @@ -11050,7 +11050,7 @@ L24C4: OR C ; LD L,B ; LD B,C ; PUSH DE ; - LD D,$00 ; + LD D,#00 ; ;; DL-LARGER L24CB: LD H,B ; @@ -11081,7 +11081,7 @@ L24DB: LD C,A ; POP BC ; ;; D-L-STEP -L24DF: LD HL,($5C7D) ; COORDS +L24DF: LD HL,(#5C7D) ; COORDS LD A,B ; ADD A,H ; LD B,A ; @@ -11111,7 +11111,7 @@ L24F7: JR Z,L24EC ; to D-L-PLOT ;; REPORT-Bc L24F9: RST 08H ; ERROR-1 - DEFB $0A ; Error Report: Integer out of range + DEFB #0A ; Error Report: Integer out of range @@ -11142,7 +11142,7 @@ L24F9: RST 08H ; ERROR-1 ;; SCANNING L24FB: RST 18H ; GET-CHAR - LD B,$00 ; priority marker zero is pushed on stack + LD B,#00 ; priority marker zero is pushed on stack ; to signify end of expression when it is ; popped off again. PUSH BC ; put in on stack. @@ -11161,7 +11161,7 @@ L24FF: LD C,A ; store the character while a look up is done. ; first instance a digit or a variable and ; then anything else. >>> - LD B,$00 ; but here if it was found in table so + LD B,#00 ; but here if it was found in table so LD C,(HL) ; fetch offset from table and make B zero. ADD HL,BC ; add the offset to position found JP (HL) ; and jump to the routine e.g. S-BIN @@ -11177,16 +11177,16 @@ L24FF: LD C,A ; store the character while a look up is done. L250F: CALL L0074 ; routine CH-ADD+1 points to next character ; and fetches that character. INC BC ; increase length counter. - CP $0D ; is it carriage return ? + CP #0D ; is it carriage return ? ; inside a quote. JP Z,L1C8A ; jump back to REPORT-C if so. ; 'Nonsense in BASIC'. - CP $22 ; is it a quote '"' ? + CP #22 ; is it a quote '"' ? JR NZ,L250F ; back to S-QUOTE-S if not for more. CALL L0074 ; routine CH-ADD+1 - CP $22 ; compare with possible adjacent quote + CP #22 ; compare with possible adjacent quote RET ; return. with zero set if two together. ; --- @@ -11197,7 +11197,7 @@ L250F: CALL L0074 ; routine CH-ADD+1 points to next character ;; S-2-COORD L2522: RST 20H ; NEXT-CHAR - CP $28 ; is it the opening '(' ? + CP #28 ; is it the opening '(' ? JR NZ,L252D ; forward to S-RPORT-C if not ; 'Nonsense in BASIC'. @@ -11208,7 +11208,7 @@ L2522: RST 20H ; NEXT-CHAR ; before rejoining the main juggling act. RST 18H ; GET-CHAR - CP $29 ; is it the closing ')' ? + CP #29 ; is it the closing ')' ? ;; S-RPORT-C L252D: JP NZ,L1C8A ; jump back to REPORT-C if not. @@ -11222,7 +11222,7 @@ L252D: JP NZ,L1C8A ; jump back to REPORT-C if not. ; four bytes of code, but a call instruction only uses 3 bytes of code. ;; SYNTAX-Z -L2530: BIT 7,(IY+$01) ; test FLAGS - checking syntax only ? +L2530: BIT 7,(IY+#01) ; test FLAGS - checking syntax only ? RET ; return. ; ---------------- @@ -11242,22 +11242,22 @@ L2530: BIT 7,(IY+$01) ; test FLAGS - checking syntax only ? ;; S-SCRN$-S L2535: CALL L2307 ; routine STK-TO-BC. - LD HL,($5C36) ; fetch address of CHARS. - LD DE,$0100 ; fetch offset to chr$ 32 + LD HL,(#5C36) ; fetch address of CHARS. + LD DE,#0100 ; fetch offset to chr$ 32 ADD HL,DE ; and find start of bitmaps. ; Note. not inc h. ?? LD A,C ; transfer line to A. RRCA ; multiply RRCA ; by RRCA ; thirty-two. - AND $E0 ; and with 11100000 - XOR B ; combine with column $00 - $1F + AND #E0 ; and with 11100000 + XOR B ; combine with column #00 - #1F LD E,A ; to give the low byte of top line LD A,C ; column to A range 00000000 to 00011111 - AND $18 ; and with 00011000 - XOR $40 ; xor with 01000000 (high byte screen start) + AND #18 ; and with 00011000 + XOR #40 ; xor with 01000000 (high byte screen start) LD D,A ; register DE now holds start address of cell. - LD B,$60 ; there are 96 characters in ASCII set. + LD B,#60 ; there are 96 characters in ASCII set. ;; S-SCRN-LP L254F: PUSH BC ; save count @@ -11266,25 +11266,25 @@ L254F: PUSH BC ; save count LD A,(DE) ; first byte of screen to A XOR (HL) ; xor with corresponding character byte JR Z,L255A ; forward to S-SC-MTCH if they match - ; if inverse result would be $FF + ; if inverse result would be #FF ; if any other then mismatch - INC A ; set to $00 if inverse + INC A ; set to #00 if inverse JR NZ,L2573 ; forward to S-SCR-NXT if a mismatch - DEC A ; restore $FF + DEC A ; restore #FF ; a match has been found so seven more to test. ;; S-SC-MTCH -L255A: LD C,A ; load C with inverse mask $00 or $FF - LD B,$07 ; count seven more bytes +L255A: LD C,A ; load C with inverse mask #00 or #FF + LD B,#07 ; count seven more bytes ;; S-SC-ROWS L255D: INC D ; increment screen address. INC HL ; increment bitmap address. LD A,(DE) ; byte to A - XOR (HL) ; will give $00 or $FF (inverse) + XOR (HL) ; will give #00 or #FF (inverse) XOR C ; xor with inverse mask JR NZ,L2573 ; forward to S-SCR-NXT if no match. @@ -11295,10 +11295,10 @@ L255D: INC D ; increment screen address. POP BC ; discard the POP BC ; saved POP BC ; pointers - LD A,$80 ; the endpoint of character set + LD A,#80 ; the endpoint of character set SUB B ; subtract the counter ; to give the code 32-127 - LD BC,$0001 ; make one space in workspace. + LD BC,#0001 ; make one space in workspace. RST 30H ; BC-SPACES creates the space sliding ; the calculator stack upwards. @@ -11311,7 +11311,7 @@ L255D: INC D ; increment screen address. ;; S-SCR-NXT L2573: POP HL ; restore the last bitmap start - LD DE,$0008 ; and prepare to add 8. + LD DE,#0008 ; and prepare to add 8. ADD HL,DE ; now addresses next character bitmap. POP DE ; restore screen address POP BC ; and character counter in B @@ -11340,20 +11340,20 @@ L257D: JP L2AB2 ; to STK-STO-$ to store the string in ;; S-ATTR-S L2580: CALL L2307 ; routine STK-TO-BC fetches line to C, ; and column to B. - LD A,C ; line to A $00 - $17 (max 00010111) + LD A,C ; line to A #00 - #17 (max 00010111) RRCA ; rotate RRCA ; bits RRCA ; left. LD C,A ; store in C as an intermediate value. - AND $E0 ; pick up bits 11100000 ( was 00011100 ) - XOR B ; combine with column $00 - $1F + AND #E0 ; pick up bits 11100000 ( was 00011100 ) + XOR B ; combine with column #00 - #1F LD L,A ; low byte now correct. LD A,C ; bring back intermediate result from C - AND $03 ; mask to give correct third of - ; screen $00 - $02 - XOR $58 ; combine with base address. + AND #03 ; mask to give correct third of + ; screen #00 - #02 + XOR #58 ; combine with base address. LD H,A ; high byte correct. LD A,(HL) ; pick up the colour attribute. JP L2D28 ; forward to STACK-A to store result @@ -11363,7 +11363,7 @@ L2580: CALL L2307 ; routine STK-TO-BC fetches line to C, ; Scanning function table ; ----------------------- ; This table is used by INDEXER routine to find the offsets to -; four operators and eight functions. e.g. $A8 is the token 'FN'. +; four operators and eight functions. e.g. #A8 is the token 'FN'. ; This table is used in the first instance for the first character of an ; expression or by a recursive call to SCANNING for the first character of ; any sub-expression. It eliminates functions that have no argument or @@ -11386,21 +11386,21 @@ L2580: CALL L2307 ; routine STK-TO-BC fetches line to C, ; An expression that begins with a quote requires special treatment. ;; scan-func -L2596: DEFB $22, L25B3-$-1 ; $1C offset to S-QUOTE - DEFB '(', L25E8-$-1 ; $4F offset to S-BRACKET - DEFB '.', L268D-$-1 ; $F2 offset to S-DECIMAL - DEFB '+', L25AF-$-1 ; $12 offset to S-U-PLUS +L2596: DEFB #22, L25B3-$-1 ; #1C offset to S-QUOTE + DEFB '(', L25E8-$-1 ; #4F offset to S-BRACKET + DEFB '.', L268D-$-1 ; #F2 offset to S-DECIMAL + DEFB '+', L25AF-$-1 ; #12 offset to S-U-PLUS - DEFB $A8, L25F5-$-1 ; $56 offset to S-FN - DEFB $A5, L25F8-$-1 ; $57 offset to S-RND - DEFB $A7, L2627-$-1 ; $84 offset to S-PI - DEFB $A6, L2634-$-1 ; $8F offset to S-INKEY$ - DEFB $C4, L268D-$-1 ; $E6 offset to S-BIN - DEFB $AA, L2668-$-1 ; $BF offset to S-SCREEN$ - DEFB $AB, L2672-$-1 ; $C7 offset to S-ATTR - DEFB $A9, L267B-$-1 ; $CE offset to S-POINT + DEFB #A8, L25F5-$-1 ; #56 offset to S-FN + DEFB #A5, L25F8-$-1 ; #57 offset to S-RND + DEFB #A7, L2627-$-1 ; #84 offset to S-PI + DEFB #A6, L2634-$-1 ; #8F offset to S-INKEY$ + DEFB #C4, L268D-$-1 ; #E6 offset to S-BIN + DEFB #AA, L2668-$-1 ; #BF offset to S-SCREEN$ + DEFB #AB, L2672-$-1 ; #C7 offset to S-ATTR + DEFB #A9, L267B-$-1 ; #CE offset to S-POINT - DEFB $00 ; zero end marker + DEFB #00 ; zero end marker ; -------------------------- ; Scanning function routines @@ -11422,7 +11422,7 @@ L25AF: RST 20H ; NEXT-CHAR just ignore L25B3: RST 18H ; GET-CHAR INC HL ; address next character (first in quotes) PUSH HL ; save start of quoted text. - LD BC,$0000 ; initialize length of string to zero. + LD BC,#0000 ; initialize length of string to zero. CALL L250F ; routine S-QUOTE-S JR NZ,L25D9 ; forward to S-Q-PRMS if @@ -11448,12 +11448,12 @@ L25CB: LD A,(HL) ; fetch a character from source. INC HL ; advance source address. LD (DE),A ; place in destination. INC DE ; advance destination address. - CP $22 ; was it a '"' just copied ? + CP #22 ; was it a '"' just copied ? JR NZ,L25CB ; back to S-Q-COPY to copy more if not LD A,(HL) ; fetch adjacent character from source. INC HL ; advance source address. - CP $22 ; is this '"' ? - i.e. two quotes together ? + CP #22 ; is this '"' ? - i.e. two quotes together ? JR Z,L25CB ; to S-Q-COPY if so including just one of the ; pair of quotes. @@ -11464,7 +11464,7 @@ L25D9: DEC BC ; decrease count by 1. POP DE ; restore start of string in workspace. ;; S-STRING -L25DB: LD HL,$5C3B ; Address FLAGS system variable. +L25DB: LD HL,#5C3B ; Address FLAGS system variable. RES 6,(HL) ; signal string result. BIT 7,(HL) ; is syntax being checked. CALL NZ,L2AB2 ; routine STK-STO-$ is called in runtime. @@ -11476,7 +11476,7 @@ L25DB: LD HL,$5C3B ; Address FLAGS system variable. ;; S-BRACKET L25E8: RST 20H ; NEXT-CHAR CALL L24FB ; routine SCANNING is called recursively. - CP $29 ; is it the closing ')' ? + CP #29 ; is it the closing ')' ? JP NZ,L1C8A ; jump back to REPORT-C if not ; 'Nonsense in BASIC' @@ -11496,35 +11496,35 @@ L25F5: JP L27BD ; jump forward to S-FN-SBRN. L25F8: CALL L2530 ; routine SYNTAX-Z JR Z,L2625 ; forward to S-RND-END if checking syntax. - LD BC,($5C76) ; fetch system variable SEED + LD BC,(#5C76) ; fetch system variable SEED CALL L2D2B ; routine STACK-BC places on calculator stack RST 28H ;; FP-CALC ;s. - DEFB $A1 ;;stk-one ;s,1. - DEFB $0F ;;addition ;s+1. - DEFB $34 ;;stk-data ; - DEFB $37 ;;Exponent: $87, + DEFB #A1 ;;stk-one ;s,1. + DEFB #0F ;;addition ;s+1. + DEFB #34 ;;stk-data ; + DEFB #37 ;;Exponent: #87, ;;Bytes: 1 - DEFB $16 ;;(+00,+00,+00) ;s+1,75. - DEFB $04 ;;multiply ;(s+1)*75 = v - DEFB $34 ;;stk-data ;v. - DEFB $80 ;;Bytes: 3 - DEFB $41 ;;Exponent $91 - DEFB $00,$00,$80 ;;(+00) ;v,65537. - DEFB $32 ;;n-mod-m ;remainder, result. - DEFB $02 ;;delete ;remainder. - DEFB $A1 ;;stk-one ;remainder, 1. - DEFB $03 ;;subtract ;remainder - 1. = rnd - DEFB $31 ;;duplicate ;rnd,rnd. - DEFB $38 ;;end-calc + DEFB #16 ;;(+00,+00,+00) ;s+1,75. + DEFB #04 ;;multiply ;(s+1)*75 = v + DEFB #34 ;;stk-data ;v. + DEFB #80 ;;Bytes: 3 + DEFB #41 ;;Exponent #91 + DEFB #00,#00,#80 ;;(+00) ;v,65537. + DEFB #32 ;;n-mod-m ;remainder, result. + DEFB #02 ;;delete ;remainder. + DEFB #A1 ;;stk-one ;remainder, 1. + DEFB #03 ;;subtract ;remainder - 1. = rnd + DEFB #31 ;;duplicate ;rnd,rnd. + DEFB #38 ;;end-calc CALL L2DA2 ; routine FP-TO-BC - LD ($5C76),BC ; store in SEED for next starting point. + LD (#5C76),BC ; store in SEED for next starting point. LD A,(HL) ; fetch exponent AND A ; is it zero ? JR Z,L2625 ; forward if so to S-RND-END - SUB $10 ; reduce exponent by 2^16 + SUB #10 ; reduce exponent by 2^16 LD (HL),A ; place back ;; S-RND-END @@ -11540,8 +11540,8 @@ L2627: CALL L2530 ; routine SYNTAX-Z JR Z,L2630 ; to S-PI-END if checking syntax. RST 28H ;; FP-CALC - DEFB $A3 ;;stk-pi/2 pi/2. - DEFB $38 ;;end-calc + DEFB #A3 ;;stk-pi/2 pi/2. + DEFB #38 ;;end-calc INC (HL) ; increment the exponent leaving pi ; on the calculator stack. @@ -11554,26 +11554,26 @@ L2630: RST 20H ; NEXT-CHAR ; -> ;; S-INKEY$ -L2634: LD BC,$105A ; priority $10, operation code $1A ('read-in') - ; +$40 for string result, numeric operand. +L2634: LD BC,#105A ; priority #10, operation code #1A ('read-in') + ; +#40 for string result, numeric operand. ; set this up now in case we need to use the ; calculator. RST 20H ; NEXT-CHAR - CP $23 ; '#' ? + CP #23 ; '#' ? JP Z,L270D ; to S-PUSH-PO if so to use the calculator ; single operation ; to read from network/RS232 etc. . ; else read a key from the keyboard. - LD HL,$5C3B ; fetch FLAGS + LD HL,#5C3B ; fetch FLAGS RES 6,(HL) ; signal string result. BIT 7,(HL) ; checking syntax ? JR Z,L2665 ; forward to S-INK$-EN if so JP L3B6C ; Spectrum 128 patch -L2649: LD C,$00 ; the length of an empty string +L2649: LD C,#00 ; the length of an empty string JR NZ,L2660 ; to S-IK$-STK to store empty string if ; no key returned. @@ -11581,21 +11581,21 @@ L2649: LD C,$00 ; the length of an empty string JR NC,L2660 ; to S-IK$-STK to stack null string if ; invalid - DEC D ; D is expected to be FLAGS so set bit 3 $FF + DEC D ; D is expected to be FLAGS so set bit 3 #FF ; 'L' Mode so no keywords. LD E,A ; main key to A ; C is MODE 0 'KLC' from above still. CALL L0333 ; routine K-DECODE L2657: PUSH AF ; save the code - LD BC,$0001 ; make room for one character + LD BC,#0001 ; make room for one character RST 30H ; BC-SPACES POP AF ; bring the code back LD (DE),A ; put the key in workspace - LD C,$01 ; set C length to one + LD C,#01 ; set C length to one ;; S-IK$-STK -L2660: LD B,$00 ; set high byte of length to zero +L2660: LD B,#00 ; set high byte of length to zero CALL L2AB2 ; routine STK-STO-$ ;; S-INK$-EN @@ -11641,7 +11641,7 @@ L2684: CALL L2C88 ; routine ALPHANUM checks if variable or JR NC,L26DF ; forward to S-NEGATE if not to consider ; a '-' character then functions. - CP $41 ; compare 'A' + CP #41 ; compare 'A' JR NC,L26C9 ; forward to S-LETTER if alpha -> ; else must have been numeric so continue ; into that routine. @@ -11663,17 +11663,17 @@ L268D: CALL L2530 ; routine SYNTAX-Z CALL L2C9B ; routine DEC-TO-FP to evaluate number RST 18H ; GET-CHAR to fetch HL - LD BC,$0006 ; six locations required + LD BC,#0006 ; six locations required CALL L1655 ; routine MAKE-ROOM INC HL ; to first new location - LD (HL),$0E ; insert number marker + LD (HL),#0E ; insert number marker INC HL ; address next EX DE,HL ; make DE destination. - LD HL,($5C65) ; STKEND points to end of stack. - LD C,$05 ; result is five locations lower + LD HL,(#5C65) ; STKEND points to end of stack. + LD C,#05 ; result is five locations lower AND A ; prepare for true subtraction SBC HL,BC ; point to start of value. - LD ($5C65),HL ; update STKEND as we are taking number. + LD (#5C65),HL ; update STKEND as we are taking number. LDIR ; Copy five bytes to program location EX DE,HL ; transfer pointer to HL DEC HL ; adjust @@ -11690,16 +11690,16 @@ L26B5: RST 18H ; GET-CHAR positions HL at digit. ;; S-SD-SKIP L26B6: INC HL ; advance pointer LD A,(HL) ; until we find - CP $0E ; chr 14d - the number indicator + CP #0E ; chr 14d - the number indicator JR NZ,L26B6 ; to S-SD-SKIP until a match ; it has to be here. INC HL ; point to first byte of number CALL L33B4 ; routine STACK-NUM stacks it - LD ($5C5D),HL ; update system variable CH_ADD + LD (#5C5D),HL ; update system variable CH_ADD ;; S-NUMERIC -L26C3: SET 6,(IY+$01) ; update FLAGS - Signal numeric result +L26C3: SET 6,(IY+#01) ; update FLAGS - Signal numeric result JR L26DD ; forward to S-CONT-1 ===> ; actually S-CONT-2 is destination but why ; waste a byte on a jump when a JR will do. @@ -11721,8 +11721,8 @@ L26C9: CALL L28B2 ; routine LOOK-VARS ; is being checked. CALL Z,L2996 ; routine STK-VAR considers a subscript/slice - LD A,($5C3B) ; fetch FLAGS value - CP $C0 ; compare 11000000 + LD A,(#5C3B) ; fetch FLAGS value + CP #C0 ; compare 11000000 JR C,L26DD ; step forward to S-CONT-1 if string ===> INC HL ; advance pointer @@ -11738,49 +11738,49 @@ L26DD: JR L2712 ; forward to S-CONT-2 ===> ; the B register and the operation code, calculator literal in the C register. ; the operation code has bit 7 set if result is numeric and bit 6 is ; set if operand is numeric. so -; $C0 = numeric result, numeric operand. e.g. 'sin' -; $80 = numeric result, string operand. e.g. 'code' -; $40 = string result, numeric operand. e.g. 'str$' -; $00 = string result, string operand. e.g. 'val$' +; #C0 = numeric result, numeric operand. e.g. 'sin' +; #80 = numeric result, string operand. e.g. 'code' +; #40 = string result, numeric operand. e.g. 'str$' +; #00 = string result, string operand. e.g. 'val$' ;; S-NEGATE -L26DF: LD BC,$09DB ; prepare priority 09, operation code $C0 + - ; 'negate' ($1B) - bits 6 and 7 set for numeric +L26DF: LD BC,#09DB ; prepare priority 09, operation code #C0 + + ; 'negate' (#1B) - bits 6 and 7 set for numeric ; result and numeric operand. - CP $2D ; is it '-' ? + CP #2D ; is it '-' ? JR Z,L270D ; forward if so to S-PUSH-PO - LD BC,$1018 ; prepare priority $10, operation code 'val$' - + LD BC,#1018 ; prepare priority #10, operation code 'val$' - ; bits 6 and 7 reset for string result and ; string operand. - CP $AE ; is it 'VAL$' ? + CP #AE ; is it 'VAL$' ? JR Z,L270D ; forward if so to S-PUSH-PO - SUB $AF ; subtract token 'CODE' value to reduce + SUB #AF ; subtract token 'CODE' value to reduce ; functions 'CODE' to 'NOT' although the ; upper range is, as yet, unchecked. - ; valid range would be $00 - $14. + ; valid range would be #00 - #14. JP C,L1C8A ; jump back to REPORT-C with anything else ; 'Nonsense in BASIC' - LD BC,$04F0 ; prepare priority $04, operation $C0 + - ; 'not' ($30) + LD BC,#04F0 ; prepare priority #04, operation #C0 + + ; 'not' (#30) - CP $14 ; is it 'NOT' + CP #14 ; is it 'NOT' JR Z,L270D ; forward to S-PUSH-PO if so JP NC,L1C8A ; to REPORT-C if higher ; 'Nonsense in BASIC' - LD B,$10 ; priority $10 for all the rest - ADD A,$DC ; make range $DC - $EF - ; $C0 + 'code'($1C) thru 'chr$' ($2F) + LD B,#10 ; priority #10 for all the rest + ADD A,#DC ; make range #DC - #EF + ; #C0 + 'code'(#1C) thru 'chr$' (#2F) LD C,A ; transfer 'function' to C - CP $DF ; is it 'sin' ? + CP #DF ; is it 'sin' ? JR NC,L2707 ; forward to S-NO-TO-$ with 'sin' through ; 'chr$' as operand is numeric. @@ -11791,7 +11791,7 @@ L26DF: LD BC,$09DB ; prepare priority 09, operation code $C0 + ; 'len'. ;; S-NO-TO-$ -L2707: CP $EE ; compare 'str$' +L2707: CP #EE ; compare 'str$' JR C,L270D ; forward to S-PUSH-PO if lower as result ; is numeric. @@ -11816,10 +11816,10 @@ L270D: PUSH BC ; push the priority and calculator operation L2712: RST 18H ; GET-CHAR ;; S-CONT-3 -L2713: CP $28 ; is it '(' ? +L2713: CP #28 ; is it '(' ? JR NZ,L2723 ; forward to S-OPERTR if not > - BIT 6,(IY+$01) ; test FLAGS - numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - numeric or string result ? JR NZ,L2734 ; forward to S-LOOP if numeric to evaluate > ; if a string preceded '(' then slice it. @@ -11834,16 +11834,16 @@ L2713: CP $28 ; is it '(' ? ; the branch was here when possibility of an operator '(' has been excluded. ;; S-OPERTR -L2723: LD B,$00 ; prepare to add +L2723: LD B,#00 ; prepare to add LD C,A ; possible operator to C - LD HL,L2795 ; Address: $2795 - tbl-of-ops + LD HL,L2795 ; Address: #2795 - tbl-of-ops CALL L16DC ; routine INDEXER JR NC,L2734 ; forward to S-LOOP if not in table ; but if found in table the priority has to be looked up. LD C,(HL) ; operation code to C ( B is still zero ) - LD HL,L27B0 - $C3 ; $26ED is base of table + LD HL,L27B0 - #C3 ; #26ED is base of table ADD HL,BC ; index into table. LD B,(HL) ; priority to B. @@ -11877,9 +11877,9 @@ L2734: POP DE ; fetch last priority and operation ; the 'USR' function is special in that it is overloaded to give two types ; of result. - LD HL,$5C3B ; address FLAGS + LD HL,#5C3B ; address FLAGS LD A,E ; new operation to A register - CP $ED ; is it $C0 + 'usr-no' ($2D) ? + CP #ED ; is it #C0 + 'usr-no' (#2D) ? JR NZ,L274C ; forward to S-STK-LST if not BIT 6,(HL) ; string result expected ? @@ -11888,7 +11888,7 @@ L2734: POP DE ; fetch last priority and operation JR NZ,L274C ; forward to S-STK-LST if numeric ; as operand bits match. - LD E,$99 ; reset bit 6 and substitute $19 'usr-$' + LD E,#99 ; reset bit 6 and substitute #19 'usr-$' ; for string operand. ;; S-STK-LST @@ -11897,7 +11897,7 @@ L274C: PUSH DE ; now stack this priority/operation JR Z,L275B ; forward to S-SYNTEST if checking syntax. LD A,E ; fetch the operation code - AND $3F ; mask off the result/operand bits to leave + AND #3F ; mask off the result/operand bits to leave ; a calculator literal. LD B,A ; transfer to B register @@ -11910,8 +11910,8 @@ L274C: PUSH DE ; now stack this priority/operation ; as the calculator too is calling itself. RST 28H ;; FP-CALC - DEFB $3B ;;fp-calc-2 -L2758: DEFB $38 ;;end-calc + DEFB #3B ;;fp-calc-2 +L2758: DEFB #38 ;;end-calc JR L2764 ; forward to S-RUNTEST @@ -11921,8 +11921,8 @@ L2758: DEFB $38 ;;end-calc ;; S-SYNTEST L275B: LD A,E ; fetch the operation code to accumulator - XOR (IY+$01) ; compare with bits of FLAGS - AND $40 ; bit 6 will be zero now if operand + XOR (IY+#01) ; compare with bits of FLAGS + AND #40 ; bit 6 will be zero now if operand ; matched expected result. ;; S-RPORT-C2 @@ -11934,7 +11934,7 @@ L2761: JP NZ,L1C8A ; to REPORT-C if mismatch ;; S-RUNTEST L2764: POP DE ; fetch the last operation from stack - LD HL,$5C3B ; address FLAGS + LD HL,#5C3B ; address FLAGS SET 6,(HL) ; set default to numeric result in FLAGS BIT 7,E ; test the operational result JR NZ,L2770 ; forward to S-LOOPEND if numeric @@ -11953,15 +11953,15 @@ L2770: POP BC ; fetch the previous priority/operation ;; S-TIGHTER L2773: PUSH DE ; save high priority op on stack again LD A,C ; fetch lower priority operation code - BIT 6,(IY+$01) ; test FLAGS - Numeric or string result ? + BIT 6,(IY+#01) ; test FLAGS - Numeric or string result ? JR NZ,L2790 ; forward to S-NEXT if numeric result ; if this is lower priority yet has string then must be a comparison. ; Since these can only be evaluated in context and were defaulted to ; numeric in operator look up they must be changed to string equivalents. - AND $3F ; mask to give true calculator literal - ADD A,$08 ; augment numeric literals to string + AND #3F ; mask to give true calculator literal + ADD A,#08 ; augment numeric literals to string ; equivalents. ; 'no-&-no' => 'str-&-no' ; 'no-l-eql' => 'str-l-eql' @@ -11972,7 +11972,7 @@ L2773: PUSH DE ; save high priority op on stack again ; 'nos-eql' => 'strs-eql' ; 'addition' => 'strs-add' LD C,A ; put modified comparison operator back - CP $10 ; is it now 'str-&-no' ? + CP #10 ; is it now 'str-&-no' ? JR NZ,L2788 ; forward to S-NOT-AND if not. SET 6,C ; set numeric operand bit @@ -11985,7 +11985,7 @@ L2788: JR C,L2761 ; back to S-RPORT-C2 if less ; 'Nonsense in BASIC'. ; e.g. a$ * b$ - CP $17 ; is it 'strs-add' ? + CP #17 ; is it 'strs-add' ? JR Z,L2790 ; forward to to S-NEXT if so ; (bit 6 and 7 are reset) @@ -12001,51 +12001,51 @@ L2790: PUSH BC ; now save this priority/operation on stack ; Table of operators ; ------------------ ; This table is used to look up the calculator literals associated with -; the operator character. The thirteen calculator operations $03 - $0F +; the operator character. The thirteen calculator operations #03 - #0F ; have bits 6 and 7 set to signify a numeric result. ; Some of these codes and bits may be altered later if the context suggests ; a string comparison or operation. ; that is '+', '=', '>', '<', '<=', '>=' or '<>'. ;; tbl-of-ops -L2795: DEFB '+', $CF ; $C0 + 'addition' - DEFB '-', $C3 ; $C0 + 'subtract' - DEFB '*', $C4 ; $C0 + 'multiply' - DEFB '/', $C5 ; $C0 + 'division' - DEFB '^', $C6 ; $C0 + 'to-power' - DEFB '=', $CE ; $C0 + 'nos-eql' - DEFB '>', $CC ; $C0 + 'no-grtr' - DEFB '<', $CD ; $C0 + 'no-less' +L2795: DEFB '+', #CF ; #C0 + 'addition' + DEFB '-', #C3 ; #C0 + 'subtract' + DEFB '*', #C4 ; #C0 + 'multiply' + DEFB '/', #C5 ; #C0 + 'division' + DEFB '^', #C6 ; #C0 + 'to-power' + DEFB '=', #CE ; #C0 + 'nos-eql' + DEFB '>', #CC ; #C0 + 'no-grtr' + DEFB '<', #CD ; #C0 + 'no-less' - DEFB $C7, $C9 ; '<=' $C0 + 'no-l-eql' - DEFB $C8, $CA ; '>=' $C0 + 'no-gr-eql' - DEFB $C9, $CB ; '<>' $C0 + 'nos-neql' - DEFB $C5, $C7 ; 'OR' $C0 + 'or' - DEFB $C6, $C8 ; 'AND' $C0 + 'no-&-no' + DEFB #C7, #C9 ; '<=' #C0 + 'no-l-eql' + DEFB #C8, #CA ; '>=' #C0 + 'no-gr-eql' + DEFB #C9, #CB ; '<>' #C0 + 'nos-neql' + DEFB #C5, #C7 ; 'OR' #C0 + 'or' + DEFB #C6, #C8 ; 'AND' #C0 + 'no-&-no' - DEFB $00 ; zero end-marker. + DEFB #00 ; zero end-marker. ; ------------------- ; Table of priorities ; ------------------- ; This table is indexed with the operation code obtained from the above -; table $C3 - $CF to obtain the priority for the respective operation. +; table #C3 - #CF to obtain the priority for the respective operation. ;; tbl-priors -L27B0: DEFB $06 ; '-' opcode $C3 - DEFB $08 ; '*' opcode $C4 - DEFB $08 ; '/' opcode $C5 - DEFB $0A ; '^' opcode $C6 - DEFB $02 ; 'OR' opcode $C7 - DEFB $03 ; 'AND' opcode $C8 - DEFB $05 ; '<=' opcode $C9 - DEFB $05 ; '>=' opcode $CA - DEFB $05 ; '<>' opcode $CB - DEFB $05 ; '>' opcode $CC - DEFB $05 ; '<' opcode $CD - DEFB $05 ; '=' opcode $CE - DEFB $06 ; '+' opcode $CF +L27B0: DEFB #06 ; '-' opcode #C3 + DEFB #08 ; '*' opcode #C4 + DEFB #08 ; '/' opcode #C5 + DEFB #0A ; '^' opcode #C6 + DEFB #02 ; 'OR' opcode #C7 + DEFB #03 ; 'AND' opcode #C8 + DEFB #05 ; '<=' opcode #C9 + DEFB #05 ; '>=' opcode #CA + DEFB #05 ; '<>' opcode #CB + DEFB #05 ; '>' opcode #CC + DEFB #05 ; '<' opcode #CD + DEFB #05 ; '=' opcode #CE + DEFB #06 ; '+' opcode #CF ; ---------------------- ; Scanning function (FN) @@ -12091,7 +12091,7 @@ L27BD: CALL L2530 ; routine SYNTAX-Z RST 20H ; NEXT-CHAR - CP $24 ; is it '$' ? + CP #24 ; is it '$' ? PUSH AF ; save character and flags JR NZ,L27D0 ; forward to SF-BRKT-1 with numeric function @@ -12099,13 +12099,13 @@ L27BD: CALL L2530 ; routine SYNTAX-Z RST 20H ; NEXT-CHAR ;; SF-BRKT-1 -L27D0: CP $28 ; is '(' ? +L27D0: CP #28 ; is '(' ? JR NZ,L27E6 ; forward to SF-RPRT-C if not ; 'Nonsense in BASIC' RST 20H ; NEXT-CHAR - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JR Z,L27E9 ; forward to SF-FLAG-6 if no arguments. ;; SF-ARGMTS @@ -12113,7 +12113,7 @@ L27D9: CALL L24FB ; routine SCANNING checks each argument ; which may be an expression. RST 18H ; GET-CHAR - CP $2C ; is it a ',' ? + CP #2C ; is it a ',' ? JR NZ,L27E4 ; forward if not to SF-BRKT-2 to test bracket @@ -12123,7 +12123,7 @@ L27D9: CALL L24FB ; routine SCANNING checks each argument ; --- ;; SF-BRKT-2 -L27E4: CP $29 ; is character the closing ')' ? +L27E4: CP #29 ; is character the closing ')' ? ;; SF-RPRT-C L27E6: JP NZ,L1C8A ; jump to REPORT-C @@ -12133,7 +12133,7 @@ L27E6: JP NZ,L1C8A ; jump to REPORT-C ;; SF-FLAG-6 L27E9: RST 20H ; NEXT-CHAR - LD HL,$5C3B ; address system variable FLAGS + LD HL,#5C3B ; address system variable FLAGS RES 6,(HL) ; signal string result POP AF ; restore test against '$'. JR Z,L27F4 ; forward to SF-SYN-EN if string function. @@ -12149,11 +12149,11 @@ L27F4: JP L2712 ; jump back to S-CONT-2 to continue scanning. ;; SF-RUN L27F7: RST 20H ; NEXT-CHAR fetches name - AND $DF ; AND 11101111 - reset bit 5 - upper-case. + AND #DF ; AND 11101111 - reset bit 5 - upper-case. LD B,A ; save in B RST 20H ; NEXT-CHAR - SUB $24 ; subtract '$' + SUB #24 ; subtract '$' LD C,A ; save result in C JR NZ,L2802 ; forward if not '$' to SF-ARGMT1 @@ -12162,12 +12162,12 @@ L27F7: RST 20H ; NEXT-CHAR fetches name ;; SF-ARGMT1 L2802: RST 20H ; NEXT-CHAR advances to start of argument PUSH HL ; save address - LD HL,($5C53) ; fetch start of program area from PROG + LD HL,(#5C53) ; fetch start of program area from PROG DEC HL ; the search starting point is the previous ; location. ;; SF-FND-DF -L2808: LD DE,$00CE ; search is for token 'DEF FN' in E, +L2808: LD DE,#00CE ; search is for token 'DEF FN' in E, ; statement count in D. PUSH BC ; save C the string test, and B the letter. CALL L1D86 ; routine LOOK-PROG will search for token. @@ -12177,20 +12177,20 @@ L2808: LD DE,$00CE ; search is for token 'DEF FN' in E, ;; REPORT-P L2812: RST 08H ; ERROR-1 - DEFB $18 ; Error Report: FN without DEF + DEFB #18 ; Error Report: FN without DEF ;; SF-CP-DEF L2814: PUSH HL ; save address of DEF FN CALL L28AB ; routine FN-SKPOVR skips over white-space etc. ; without disturbing CH-ADD. - AND $DF ; make fetched character upper-case. + AND #DF ; make fetched character upper-case. CP B ; compare with FN name JR NZ,L2825 ; forward to SF-NOT-FD if no match. ; the letters match so test the type. CALL L28AB ; routine FN-SKPOVR skips white-space - SUB $24 ; subtract '$' from fetched character + SUB #24 ; subtract '$' from fetched character CP C ; compare with saved result of same operation ; on FN name. JR Z,L2831 ; forward to SF-VALUES with a match. @@ -12200,7 +12200,7 @@ L2814: PUSH HL ; save address of DEF FN ;; SF-NOT-FD L2825: POP HL ; restore search point. DEC HL ; make location before - LD DE,$0200 ; the search is to be for the end of the + LD DE,#0200 ; the search is to be for the end of the ; current definition - 2 statements forward. PUSH BC ; save the letter/type CALL L198B ; routine EACH-STMT steps past rejected @@ -12220,25 +12220,25 @@ L2831: AND A ; test A ( will be zero if string '$' - '$' ) POP DE ; discard pointer to 'DEF FN'. POP DE ; restore pointer to first FN argument. - LD ($5C5D),DE ; save in CH_ADD + LD (#5C5D),DE ; save in CH_ADD CALL L28AB ; routine FN-SKPOVR advances HL past '(' PUSH HL ; save start address in DEF FN *** - CP $29 ; is character a ')' ? + CP #29 ; is character a ')' ? JR Z,L2885 ; forward to SF-R-BR-2 if no arguments. ;; SF-ARG-LP L2843: INC HL ; point to next character. LD A,(HL) ; fetch it. - CP $0E ; is it the number marker - LD D,$40 ; signal numeric in D. + CP #0E ; is it the number marker + LD D,#40 ; signal numeric in D. JR Z,L2852 ; forward to SF-ARG-VL if numeric. DEC HL ; back to letter CALL L28AB ; routine FN-SKPOVR skips any white-space INC HL ; advance past the expected '$' to ; the 'hidden' marker. - LD D,$00 ; signal string. + LD D,#00 ; signal string. ;; SF-ARG-VL L2852: INC HL ; now address first of 5-byte location. @@ -12251,24 +12251,24 @@ L2852: INC HL ; now address first of 5-byte location. POP AF ; restore saved result type to A - XOR (IY+$01) ; xor with FLAGS - AND $40 ; and with 01000000 to test bit 6 + XOR (IY+#01) ; xor with FLAGS + AND #40 ; and with 01000000 to test bit 6 JR NZ,L288B ; forward to REPORT-Q if type mismatch. ; 'Parameter error' POP HL ; pop the start address in DEF FN statement EX DE,HL ; transfer to DE ?? pop straight into de ? - LD HL,($5C65) ; set HL to STKEND location after value - LD BC,$0005 ; five bytes to move + LD HL,(#5C65) ; set HL to STKEND location after value + LD BC,#0005 ; five bytes to move SBC HL,BC ; decrease HL by 5 to point to start. - LD ($5C65),HL ; set STKEND 'removing' value from stack. + LD (#5C65),HL ; set STKEND 'removing' value from stack. LDIR ; copy value into DEF FN statement EX DE,HL ; set HL to location after value in DEF FN DEC HL ; step back one CALL L28AB ; routine FN-SKPOVR gets next valid character - CP $29 ; is it ')' end of arguments ? + CP #29 ; is it ')' end of arguments ? JR Z,L2885 ; forward to SF-R-BR-2 if so. ; a comma separator has been encountered in the DEF FN argument list. @@ -12276,7 +12276,7 @@ L2852: INC HL ; now address first of 5-byte location. PUSH HL ; save position in DEF FN statement RST 18H ; GET-CHAR from FN statement - CP $2C ; is it ',' ? + CP #2C ; is it ',' ? JR NZ,L288B ; forward to REPORT-Q if not ; 'Parameter error' @@ -12299,18 +12299,18 @@ L2852: INC HL ; now address first of 5-byte location. L2885: PUSH HL ; save location of ')' in DEF FN RST 18H ; GET-CHAR gets next character in FN - CP $29 ; is it a ')' also ? + CP #29 ; is it a ')' also ? JR Z,L288D ; forward to SF-VALUE if so. ;; REPORT-Q L288B: RST 08H ; ERROR-1 - DEFB $19 ; Error Report: Parameter error + DEFB #19 ; Error Report: Parameter error ;; SF-VALUE L288D: POP DE ; location of ')' in DEF FN to DE. EX DE,HL ; now to HL, FN ')' pointer to DE. - LD ($5C5D),HL ; initialize CH_ADD to this value. + LD (#5C5D),HL ; initialize CH_ADD to this value. ; At this point the start of the DEF FN argument list is on the machine stack. ; We also have to consider that this defined function may form part of the @@ -12319,9 +12319,9 @@ L288D: POP DE ; location of ')' in DEF FN to DE. ; currently being evaluated by recursive calls to SCANNING, then we have to ; preserve the original value of DEFADD and not assume that it is zero. - LD HL,($5C0B) ; get original DEFADD address + LD HL,(#5C0B) ; get original DEFADD address EX (SP),HL ; swap with DEF FN address on stack *** - LD ($5C0B),HL ; set DEFADD to point to this argument list + LD (#5C0B),HL ; set DEFADD to point to this argument list ; during scanning. PUSH DE ; save FN ')' pointer. @@ -12334,9 +12334,9 @@ L288D: POP DE ; location of ')' in DEF FN to DE. ; initially for variables at DEFADD POP HL ; pop the FN ')' pointer - LD ($5C5D),HL ; set CH_ADD to this + LD (#5C5D),HL ; set CH_ADD to this POP HL ; pop the original DEFADD value - LD ($5C0B),HL ; and re-insert into DEFADD system variable. + LD (#5C0B),HL ; and re-insert into DEFADD system variable. RST 20H ; NEXT-CHAR advances to character after ')' JP L2712 ; to S-CONT-2 - to continue current @@ -12357,7 +12357,7 @@ L288D: POP DE ; location of ')' in DEF FN to DE. ;; FN-SKPOVR L28AB: INC HL ; increase pointer LD A,(HL) ; fetch addressed character - CP $21 ; compare with space + 1 + CP #21 ; compare with space + 1 JR C,L28AB ; back to FN-SKPOVR if less RET ; return pointing to a valid character. @@ -12369,7 +12369,7 @@ L28AB: INC HL ; increase pointer ; ;; LOOK-VARS -L28B2: SET 6,(IY+$01) ; update FLAGS - presume numeric result +L28B2: SET 6,(IY+#01) ; update FLAGS - presume numeric result RST 18H ; GET-CHAR CALL L2C8D ; routine ALPHA tests for A-Za-z @@ -12377,16 +12377,16 @@ L28B2: SET 6,(IY+$01) ; update FLAGS - presume numeric result ; 'Nonsense in BASIC' PUSH HL ; save pointer to first letter ^1 - AND $1F ; mask lower bits, 1 - 26 decimal 000xxxxx + AND #1F ; mask lower bits, 1 - 26 decimal 000xxxxx LD C,A ; store in C. RST 20H ; NEXT-CHAR PUSH HL ; save pointer to second character ^2 - CP $28 ; is it '(' - an array ? + CP #28 ; is it '(' - an array ? JR Z,L28EF ; forward to V-RUN/SYN if so. SET 6,C ; set 6 signaling string if solitary 010 - CP $24 ; is character a '$' ? + CP #24 ; is character a '$' ? JR Z,L28DE ; forward to V-STR-VAR SET 5,C ; signal numeric 011 @@ -12413,10 +12413,10 @@ L28D4: CALL L2C88 ; routine ALPHANUM ;; V-STR-VAR L28DE: RST 20H ; NEXT-CHAR advances past '$' - RES 6,(IY+$01) ; update FLAGS - signal string result. + RES 6,(IY+#01) ; update FLAGS - signal string result. ;; V-TEST-FN -L28E3: LD A,($5C0C) ; load A with DEFADD_hi +L28E3: LD A,(#5C0C) ; load A with DEFADD_hi AND A ; and test for zero. JR Z,L28EF ; forward to V-RUN/SYN if a defined function ; is not being evaluated. @@ -12435,7 +12435,7 @@ L28EF: LD B,C ; save flags in B ; if checking syntax the letter is not returned LD A,C ; copy letter/flags to A - AND $E0 ; and with 11100000 to get rid of the letter + AND #E0 ; and with 11100000 to get rid of the letter SET 7,A ; use spare bit to signal checking syntax. LD C,A ; and transfer to C. JR L2934 ; forward to V-SYNTAX @@ -12445,11 +12445,11 @@ L28EF: LD B,C ; save flags in B ; but in runtime search for the variable. ;; V-RUN -L28FD: LD HL,($5C4B) ; set HL to start of variables from VARS +L28FD: LD HL,(#5C4B) ; set HL to start of variables from VARS ;; V-EACH L2900: LD A,(HL) ; get first character - AND $7F ; and with 01111111 + AND #7F ; and with 01111111 ; ignoring bit 7 which distinguishes ; arrays or for/next variables. @@ -12479,15 +12479,15 @@ L2912: INC HL ; address next character in vars area ;; V-SPACES L2913: LD A,(DE) ; pick up letter from prog area INC DE ; and advance address - CP $20 ; is it a space + CP #20 ; is it a space JR Z,L2913 ; back to V-SPACES until non-space - OR $20 ; convert to range 1 - 26. + OR #20 ; convert to range 1 - 26. CP (HL) ; compare with addressed variables character JR Z,L2912 ; loop back to V-MATCHES if a match on an ; intermediate letter. - OR $80 ; now set bit 7 as last character of long + OR #80 ; now set bit 7 as last character of long ; names are inverted. CP (HL) ; compare again JR NZ,L2929 ; forward to V-GET-PTR if no match @@ -12521,7 +12521,7 @@ L2934: POP DE ; discard the pointer to 2nd. character v2 ; in BASIC line/workspace. RST 18H ; GET-CHAR gets character after variable name. - CP $28 ; is it '(' ? + CP #28 ; is it '(' ? JR Z,L2943 ; forward to V-PASS ; Note. could go straight to V-END ? @@ -12575,9 +12575,9 @@ L294B: POP HL ; pop the pointer to first character in ; The variable name to be matched is in C. ;; STK-F-ARG -L2951: LD HL,($5C0B) ; set HL to DEFADD +L2951: LD HL,(#5C0B) ; set HL to DEFADD LD A,(HL) ; load the first character - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JP Z,L28EF ; JUMP back to V-RUN/SYN, if so, as there are ; no arguments. @@ -12585,11 +12585,11 @@ L2951: LD HL,($5C0B) ; set HL to DEFADD ;; SFA-LOOP L295A: LD A,(HL) ; fetch character again. - OR $60 ; or with 01100000 presume a simple variable. + OR #60 ; or with 01100000 presume a simple variable. LD B,A ; save result in B. INC HL ; address next location. LD A,(HL) ; pick up byte. - CP $0E ; is it the number marker ? + CP #0E ; is it the number marker ? JR Z,L296B ; forward to SFA-CP-VR if so. ; it was a string. White-space may be present but syntax has been checked. @@ -12611,7 +12611,7 @@ L296B: LD A,B ; transfer found variable letter to A. INC HL ; bytes. CALL L28AB ; routine FN-SKPOVR skips to next character - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JP Z,L28EF ; jump back if so to V-RUN/SYN to look in ; normal variables area. @@ -12629,10 +12629,10 @@ L2981: BIT 5,C ; test if numeric ; by scanning INC HL ; point to start of string descriptor - LD DE,($5C65) ; set DE to STKEND + LD DE,(#5C65) ; set DE to STKEND CALL L33C0 ; routine MOVE-FP puts parameters on stack. EX DE,HL ; new free location to HL. - LD ($5C65),HL ; use it to set STKEND system variable. + LD (#5C65),HL ; use it to set STKEND system variable. ;; SFA-END L2991: POP DE ; discard @@ -12726,7 +12726,7 @@ L29AE: INC HL ; step past EX DE,HL ; save pointer to dimensions in DE RST 18H ; GET-CHAR looks at the BASIC line - CP $28 ; is character '(' ? + CP #28 ; is character '(' ? JR NZ,L2A20 ; to REPORT-3 if not ; 'Subscript wrong' @@ -12750,7 +12750,7 @@ L29C3: PUSH HL ; save counter RST 18H ; GET-CHAR POP HL ; pop counter - CP $2C ; is character ',' ? + CP #2C ; is character ',' ? JR Z,L29EA ; forward to SV-LOOP if so ; in runtime the variable definition indicates a comma should appear here @@ -12766,7 +12766,7 @@ L29C3: PUSH HL ; save counter ; an array of numbers. - CP $29 ; is character ')' ? + CP #29 ; is character ')' ? JR NZ,L2A12 ; forward to SV-RPT-C if not ; 'Nonsense in BASIC' @@ -12778,10 +12778,10 @@ L29C3: PUSH HL ; save counter ; the branch was here with an array of strings. ;; SV-CLOSE -L29D8: CP $29 ; as above ')' could follow the expression +L29D8: CP #29 ; as above ')' could follow the expression JR Z,L2A48 ; forward to SV-DIM if so - CP $CC ; is it 'TO' ? + CP #CC ; is it 'TO' ? JR NZ,L2A12 ; to SV-RPT-C with anything else ; 'Nonsense in BASIC' @@ -12791,7 +12791,7 @@ L29D8: CP $29 ; as above ')' could follow the expression ;; SV-CH-ADD L29E0: RST 18H ; GET-CHAR DEC HL ; backtrack HL - LD ($5C5D),HL ; to set CH_ADD up for slicing routine + LD (#5C5D),HL ; to set CH_ADD up for slicing routine JR L2A45 ; forward to SV-SLICE and make a return ; when all slicing complete. @@ -12799,7 +12799,7 @@ L29E0: RST 18H ; GET-CHAR ; -> the mid-point entry point of the loop ;; SV-COUNT -L29E7: LD HL,$0000 ; initialize data pointer to zero. +L29E7: LD HL,#0000 ; initialize data pointer to zero. ;; SV-LOOP L29EA: PUSH HL ; save the data pointer. @@ -12809,7 +12809,7 @@ L29EA: PUSH HL ; save the data pointer. POP HL ; restore the data pointer. LD A,C ; transfer name/type to A. - CP $C0 ; is it 11000000 ? + CP #C0 ; is it 11000000 ? ; Note. the letter component is absent if ; syntax checking. JR NZ,L29FB ; forward to SV-MULT if not an array of @@ -12818,10 +12818,10 @@ L29EA: PUSH HL ; save the data pointer. ; proceed to check string arrays during syntax. RST 18H ; GET-CHAR - CP $29 ; ')' end of subscripts ? + CP #29 ; ')' end of subscripts ? JR Z,L2A48 ; forward to SV-DIM to consider further slice - CP $CC ; is it 'TO' ? + CP #CC ; is it 'TO' ? JR Z,L29E0 ; back to SV-CH-ADD to consider a slice. ; (no need to repeat get-char at L29E0) @@ -12875,14 +12875,14 @@ L2A12: JR NZ,L2A7A ; forward to SL-RPT-C if so ; transfer it to BC. RST 18H ; GET-CHAR checks BASIC line - CP $29 ; must be a ')' ? + CP #29 ; must be a ')' ? JR Z,L2A22 ; skip to SV-NUMBER if so ; else more subscripts in BASIC line than the variable definition. ;; REPORT-3 L2A20: RST 08H ; ERROR-1 - DEFB $02 ; Error Report: Subscript wrong + DEFB #02 ; Error Report: Subscript wrong ; continue if subscripts matched the numeric array. @@ -12891,7 +12891,7 @@ L2A22: RST 20H ; NEXT-CHAR moves CH_ADD to next statement ; - finished parsing. POP HL ; pop the data pointer. - LD DE,$0005 ; each numeric element is 5 bytes. + LD DE,#0005 ; each numeric element is 5 bytes. CALL L2AF4 ; routine GET-HL*DE multiplies. ADD HL,BC ; now add to start of data in the variable. @@ -12921,11 +12921,11 @@ L2A2C: CALL L2AEE ; routine DE,(DE+1) gets final dimension ; now check that there were no more subscripts in the BASIC line. RST 18H ; GET-CHAR - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JR Z,L2A48 ; forward to SV-DIM to consider a separate ; subscript or/and a slice. - CP $2C ; a comma is allowed if the final subscript + CP #2C ; a comma is allowed if the final subscript ; is to be sliced e.g a$(2,3,4 TO 6). JR NZ,L2A20 ; to REPORT-3 with anything else ; 'Subscript error' @@ -12939,10 +12939,10 @@ L2A45: CALL L2A52 ; routine SLICING slices the string. L2A48: RST 20H ; NEXT-CHAR ;; SV-SLICE? -L2A49: CP $28 ; is character '(' ? +L2A49: CP #28 ; is character '(' ? JR Z,L2A45 ; loop back if so to SV-SLICE - RES 6,(IY+$01) ; update FLAGS - Signal string result + RES 6,(IY+#01) ; update FLAGS - Signal string result RET ; and return. ; --- @@ -12983,7 +12983,7 @@ L2A52: CALL L2530 ; routine SYNTAX-Z ; in BC. This could be an array subscript. RST 20H ; NEXT-CHAR - CP $29 ; is it ')' ? e.g. a$() + CP #29 ; is it ')' ? e.g. a$() JR Z,L2AAD ; forward to SL-STORE to store entire string. PUSH DE ; else save start address of string @@ -12992,21 +12992,21 @@ L2A52: CALL L2530 ; routine SYNTAX-Z PUSH AF ; and save on stack before any branching. PUSH BC ; save length of string to be sliced. - LD DE,$0001 ; default the start point to position 1. + LD DE,#0001 ; default the start point to position 1. RST 18H ; GET-CHAR POP HL ; pop length to HL as default end point ; and limit. - CP $CC ; is it 'TO' ? e.g. a$( TO 10000) + CP #CC ; is it 'TO' ? e.g. a$( TO 10000) JR Z,L2A81 ; to SL-SECOND to evaluate second parameter. POP AF ; pop the running flag. CALL L2ACD ; routine INT-EXP2 fetches first parameter. - PUSH AF ; save flag (will be $FF if parameter>limit) + PUSH AF ; save flag (will be #FF if parameter>limit) LD D,B ; transfer the start LD E,C ; to DE overwriting 0001. @@ -13014,10 +13014,10 @@ L2A52: CALL L2530 ; routine SYNTAX-Z RST 18H ; GET-CHAR POP HL ; pop the limit length. - CP $CC ; is it 'TO' after a start ? + CP #CC ; is it 'TO' after a start ? JR Z,L2A81 ; to SL-SECOND to evaluate second parameter - CP $29 ; is it ')' ? e.g. a$(365) + CP #29 ; is it ')' ? e.g. a$(365) ;; SL-RPT-C L2A7A: JP NZ,L1C8A ; jump to REPORT-C with anything else @@ -13036,7 +13036,7 @@ L2A81: PUSH HL ; save limit length. POP HL ; pop the length. - CP $29 ; is character ')' ? e.g a$(7 TO ) + CP #29 ; is character ')' ? e.g a$(7 TO ) JR Z,L2A94 ; to SL-DEFINE using length as end point. POP AF ; else restore flag. @@ -13048,7 +13048,7 @@ L2A81: PUSH HL ; save limit length. LD H,B ; transfer second parameter LD L,C ; to HL. e.g. a$(42 to 99) - CP $29 ; is character a ')' ? + CP #29 ; is character a ')' ? JR NZ,L2A7A ; to SL-RPT-C if not ; 'Nonsense in BASIC' @@ -13062,13 +13062,13 @@ L2A94: POP AF ; pop the running flag. EX (SP),HL ; start address to stack, end point to HL (*) AND A ; prepare to subtract. SBC HL,DE ; subtract start point from end point. - LD BC,$0000 ; default the length result to zero. + LD BC,#0000 ; default the length result to zero. JR C,L2AA8 ; forward to SL-OVER if start > end. INC HL ; increment the length for inclusive byte. AND A ; now test the running flag. - JP M,L2A20 ; jump back to REPORT-3 if $FF. + JP M,L2A20 ; jump back to REPORT-3 if #FF. ; 'Subscript out of range' LD B,H ; transfer the length @@ -13076,7 +13076,7 @@ L2A94: POP AF ; pop the running flag. ;; SL-OVER L2AA8: POP DE ; restore start address from machine stack *** - RES 6,(IY+$01) ; update FLAGS - signal string result for + RES 6,(IY+#01) ; update FLAGS - signal string result for ; syntax. ;; SL-STORE @@ -13097,7 +13097,7 @@ L2AB1: XOR A ; clear to signal a sliced string or element. ; -------------------------- ;; STK-STO-$ -L2AB2: RES 6,(IY+$01) ; update FLAGS - signal string result. +L2AB2: RES 6,(IY+#01) ; update FLAGS - signal string result. ; and continue to store parameters of string. ; --------------------------------------- @@ -13110,7 +13110,7 @@ L2AB6: PUSH BC ; save two registers CALL L33A9 ; routine TEST-5-SP checks room and puts 5 ; in BC. POP BC ; fetch the saved registers. - LD HL,($5C65) ; make HL point to first empty location STKEND + LD HL,(#5C65) ; make HL point to first empty location STKEND LD (HL),A ; place the 5 registers. INC HL ; LD (HL),E ; @@ -13121,19 +13121,19 @@ L2AB6: PUSH BC ; save two registers INC HL ; LD (HL),B ; INC HL ; - LD ($5C65),HL ; update system variable STKEND. + LD (#5C65),HL ; update system variable STKEND. RET ; and return. ; ------------------------------------------- ; Return result of evaluating next expression ; ------------------------------------------- ; This clever routine is used to check and evaluate an integer expression -; which is returned in BC, setting A to $FF, if greater than a limit supplied +; which is returned in BC, setting A to #FF, if greater than a limit supplied ; in HL. It is used to check array subscripts, parameters of a string slice ; and the arguments of the DIM command. In the latter case, the limit check -; is not required and H is set to $FF. When checking optional string slice +; is not required and H is set to #FF. When checking optional string slice ; parameters, it is entered at the second entry point so as not to disturb -; the running flag A, which may be $00 or $FF from a previous invocation. +; the running flag A, which may be #00 or #FF from a previous invocation. ;; INT-EXP1 L2ACC: XOR A ; set result flag to zero. @@ -13172,8 +13172,8 @@ L2ACD: PUSH DE ; preserve DE register throughout. SBC HL,BC ; subtract value from limit. ;; I-CARRY -L2AE8: LD A,D ; move flag to accumulator $00 or $FF. - SBC A,$00 ; will set to $FF if carry set. +L2AE8: LD A,D ; move flag to accumulator #00 or #FF. + SBC A,#00 ; will set to #FF if carry set. ;; I-RESTORE L2AEB: POP HL ; restore the limit. @@ -13236,14 +13236,14 @@ L2AF4: CALL L2530 ; routine SYNTAX-Z. ; I digress. ;; LET -L2AFF: LD HL,($5C4D) ; fetch system variable DEST to HL. - BIT 1,(IY+$37) ; test FLAGX - handling a new variable ? +L2AFF: LD HL,(#5C4D) ; fetch system variable DEST to HL. + BIT 1,(IY+#37) ; test FLAGX - handling a new variable ? JR Z,L2B66 ; forward to L-EXISTS if not. ; continue for a new variable. DEST points to start in BASIC line. ; from the CLASS routines. - LD BC,$0005 ; assume numeric and assign an initial 5 bytes + LD BC,#0005 ; assume numeric and assign an initial 5 bytes ;; L-EACH-CH L2B0B: INC BC ; increase byte count for each relevant @@ -13252,18 +13252,18 @@ L2B0B: INC BC ; increase byte count for each relevant ;; L-NO-SP L2B0C: INC HL ; increase pointer. LD A,(HL) ; fetch character. - CP $20 ; is it a space ? + CP #20 ; is it a space ? JR Z,L2B0C ; back to L-NO-SP is so. JR NC,L2B1F ; forward to L-TEST-CH if higher. - CP $10 ; is it $00 - $0F ? + CP #10 ; is it #00 - #0F ? JR C,L2B29 ; forward to L-SPACES if so. - CP $16 ; is it $16 - $1F ? + CP #16 ; is it #16 - #1F ? JR NC,L2B29 ; forward to L-SPACES if so. -; it was $10 - $15 so step over a colour code. +; it was #10 - #15 so step over a colour code. INC HL ; increase pointer. JR L2B0C ; loop back to L-NO-SP. @@ -13276,13 +13276,13 @@ L2B0C: INC HL ; increase pointer. L2B1F: CALL L2C88 ; routine ALPHANUM sets carry if alphanumeric JR C,L2B0B ; loop back to L-EACH-CH for more if so. - CP $24 ; is it '$' ? + CP #24 ; is it '$' ? JP Z,L2BC0 ; jump forward if so, to L-NEW$ ; with a new string. ;; L-SPACES L2B29: LD A,C ; save length lo in A. - LD HL,($5C59) ; fetch E_LINE to HL. + LD HL,(#5C59) ; fetch E_LINE to HL. DEC HL ; point to location before, the variables ; end-marker. CALL L1655 ; routine MAKE-ROOM creates BC spaces @@ -13291,9 +13291,9 @@ L2B29: LD A,C ; save length lo in A. INC HL ; then to second. EX DE,HL ; set DE to second location. PUSH DE ; save this pointer. - LD HL,($5C4D) ; reload HL with DEST. + LD HL,(#5C4D) ; reload HL with DEST. DEC DE ; point to first. - SUB $06 ; subtract six from length_lo. + SUB #06 ; subtract six from length_lo. LD B,A ; save count in B. JR Z,L2B4F ; forward to L-SINGLE if it was just ; one character. @@ -13303,33 +13303,33 @@ L2B29: LD A,C ; save length lo in A. ;; L-CHAR L2B3E: INC HL ; increase pointer. LD A,(HL) ; pick up character. - CP $21 ; is it space or higher ? + CP #21 ; is it space or higher ? JR C,L2B3E ; back to L-CHAR with space and less. - OR $20 ; make variable lower-case. + OR #20 ; make variable lower-case. INC DE ; increase destination pointer. LD (DE),A ; and load to edit line. DJNZ L2B3E ; loop back to L-CHAR until B is zero. - OR $80 ; invert the last character. + OR #80 ; invert the last character. LD (DE),A ; and overwrite that in edit line. ; now consider first character which has bit 6 set - LD A,$C0 ; set A 11000000 is xor mask for a long name. + LD A,#C0 ; set A 11000000 is xor mask for a long name. ; %101 is xor/or result ; single character numerics rejoin here with %00000000 in mask. ; %011 will be xor/or result ;; L-SINGLE -L2B4F: LD HL,($5C4D) ; fetch DEST - HL addresses first character. +L2B4F: LD HL,(#5C4D) ; fetch DEST - HL addresses first character. XOR (HL) ; apply variable type indicator mask (above). - OR $20 ; make lowercase - set bit 5. + OR #20 ; make lowercase - set bit 5. POP HL ; restore pointer to 2nd character. CALL L2BEA ; routine L-FIRST puts A in first character. ; and returns with HL holding - ; new E_LINE-1 the $80 vars end-marker. + ; new E_LINE-1 the #80 vars end-marker. ;; L-NUMERIC L2B59: PUSH HL ; save the pointer. @@ -13337,13 +13337,13 @@ L2B59: PUSH HL ; save the pointer. ; the value of variable is deleted but remains after calculator stack. RST 28H ;; FP-CALC - DEFB $02 ;;delete ; delete variable value - DEFB $38 ;;end-calc + DEFB #02 ;;delete ; delete variable value + DEFB #38 ;;end-calc ; DE (STKEND) points to start of value. POP HL ; restore the pointer. - LD BC,$0005 ; start of number is five bytes before. + LD BC,#0005 ; start of number is five bytes before. AND A ; prepare for true subtraction. SBC HL,BC ; HL points to start of value. JR L2BA6 ; forward to L-ENTER ==> @@ -13354,14 +13354,14 @@ L2B59: PUSH HL ; save the pointer. ; the jump was to here if the variable already existed. ;; L-EXISTS -L2B66: BIT 6,(IY+$01) ; test FLAGS - numeric or string result ? +L2B66: BIT 6,(IY+#01) ; test FLAGS - numeric or string result ? JR Z,L2B72 ; skip forward to L-DELETE$ -*-> ; if string result. ; A numeric variable could be simple or an array element. ; They are treated the same and the old value is overwritten. - LD DE,$0006 ; six bytes forward points to loc past value. + LD DE,#0006 ; six bytes forward points to loc past value. ADD HL,DE ; add to start of number. JR L2B59 ; back to L-NUMERIC to overwrite value. @@ -13370,10 +13370,10 @@ L2B66: BIT 6,(IY+$01) ; test FLAGS - numeric or string result ? ; -*-> the branch was here if a string existed. ;; L-DELETE$ -L2B72: LD HL,($5C4D) ; fetch DEST to HL. +L2B72: LD HL,(#5C4D) ; fetch DEST to HL. ; (still set from first instruction) - LD BC,($5C72) ; fetch STRLEN to BC. - BIT 0,(IY+$37) ; test FLAGX - handling a complete simple + LD BC,(#5C72) ; fetch STRLEN to BC. + BIT 0,(IY+#37) ; test FLAGX - handling a complete simple ; string ? JR NZ,L2BAF ; forward to L-ADD$ if so. @@ -13398,7 +13398,7 @@ L2B72: LD HL,($5C4D) ; fetch DEST to HL. LD D,H ; set DE to point to last location. LD E,L ; INC HL ; set HL to next location. - LD (HL),$20 ; place a space there. + LD (HL),#20 ; place a space there. LDDR ; copy bytes filling with spaces. PUSH HL ; save pointer to start. @@ -13473,9 +13473,9 @@ L2BAF: DEC HL ; point to high byte of length. ; the jump was here with a new string variable. ;; L-NEW$ -L2BC0: LD A,$DF ; indicator mask %11011111 for +L2BC0: LD A,#DF ; indicator mask %11011111 for ; %010xxxxx will be result - LD HL,($5C4D) ; address DEST first character. + LD HL,(#5C4D) ; address DEST first character. AND (HL) ; combine mask with character. ;; L-STRING @@ -13486,16 +13486,16 @@ L2BC6: PUSH AF ; save first character and mask. ADD HL,BC ; add to length. PUSH BC ; save the length. DEC HL ; point to end of string. - LD ($5C4D),HL ; save pointer in DEST. + LD (#5C4D),HL ; save pointer in DEST. ; (updated by POINTERS if in workspace) INC BC ; extra byte for letter. INC BC ; two bytes INC BC ; for the length of string. - LD HL,($5C59) ; address E_LINE. + LD HL,(#5C59) ; address E_LINE. DEC HL ; now end of VARS area. CALL L1655 ; routine MAKE-ROOM makes room for string. ; updating pointers including DEST. - LD HL,($5C4D) ; pick up pointer to end of string from DEST. + LD HL,(#5C4D) ; pick up pointer to end of string from DEST. POP BC ; restore length from stack. PUSH BC ; and save again on stack. INC BC ; add a byte. @@ -13511,7 +13511,7 @@ L2BC6: PUSH AF ; save first character and mask. ;; L-FIRST L2BEA: DEC HL ; address variable name LD (HL),A ; and insert character. - LD HL,($5C59) ; load HL with E_LINE. + LD HL,(#5C59) ; load HL with E_LINE. DEC HL ; now end of VARS area. RET ; return @@ -13522,7 +13522,7 @@ L2BEA: DEC HL ; address variable name ; ;; STK-FETCH -L2BF1: LD HL,($5C65) ; STKEND +L2BF1: LD HL,(#5C65) ; STKEND DEC HL ; LD B,(HL) ; DEC HL ; @@ -13533,7 +13533,7 @@ L2BF1: LD HL,($5C65) ; STKEND LD E,(HL) ; DEC HL ; LD A,(HL) ; - LD ($5C65),HL ; STKEND + LD (#5C65),HL ; STKEND RET ; ; ------------------ @@ -13570,20 +13570,20 @@ L2C15: JR C,L2C1F ; skip to D-LETTER if variable did not exist. PUSH BC ; save type in C. CALL L19B8 ; routine NEXT-ONE find following variable - ; or position of $80 end-marker. + ; or position of #80 end-marker. CALL L19E8 ; routine RECLAIM-2 reclaims the ; space between. POP BC ; pop the type. ;; D-LETTER L2C1F: SET 7,C ; signal array. - LD B,$00 ; initialize dimensions to zero and + LD B,#00 ; initialize dimensions to zero and PUSH BC ; save with the type. - LD HL,$0001 ; make elements one character presuming string + LD HL,#0001 ; make elements one character presuming string BIT 6,C ; is it a string ? JR NZ,L2C2D ; forward to D-SIZE if so. - LD L,$05 ; make elements 5 bytes as is numeric. + LD L,#05 ; make elements 5 bytes as is numeric. ;; D-SIZE L2C2D: EX DE,HL ; save the element size in DE. @@ -13592,7 +13592,7 @@ L2C2D: EX DE,HL ; save the element size in DE. ;; D-NO-LOOP L2C2E: RST 20H ; NEXT-CHAR - LD H,$FF ; disable limit check by setting HL high + LD H,#FF ; disable limit check by setting HL high CALL L2ACC ; routine INT-EXP1 JP C,L2A20 ; to REPORT-3 if > 65280 and then some ; 'Subscript out of range' @@ -13609,13 +13609,13 @@ L2C2E: RST 20H ; NEXT-CHAR EX DE,HL ; save running total in DE RST 18H ; GET-CHAR - CP $2C ; is it ',' ? + CP #2C ; is it ',' ? JR Z,L2C2E ; loop back to D-NO-LOOP until all dimensions ; have been considered ; when loop complete continue. - CP $29 ; is it ')' ? + CP #29 ; is it ')' ? JR NZ,L2C05 ; to D-RPORT-C with anything else ; 'Nonsense in BASIC' @@ -13629,7 +13629,7 @@ L2C2E: RST 20H ; NEXT-CHAR LD L,B ; dimensions to L since these require 16 bits ; then this value will be doubled - LD H,$00 ; set high byte to zero + LD H,#00 ; set high byte to zero ; another four bytes are required for letter(1), total length(2), number of ; dimensions(1) but since we have yet to double allow for two @@ -13649,9 +13649,9 @@ L2C2E: RST 20H ; NEXT-CHAR PUSH HL ; save total space LD B,H ; total space LD C,L ; to BC - LD HL,($5C59) ; address E_LINE - first location after + LD HL,(#5C59) ; address E_LINE - first location after ; variables area - DEC HL ; point to location before - the $80 end-marker + DEC HL ; point to location before - the #80 end-marker CALL L1655 ; routine MAKE-ROOM creates the space if ; memory is available. @@ -13675,11 +13675,11 @@ L2C2E: RST 20H ; NEXT-CHAR LD H,D ; transfer DE space + 1 from make-room LD L,E ; to HL DEC DE ; set DE to next location down. - LD (HL),$00 ; presume numeric and insert a zero + LD (HL),#00 ; presume numeric and insert a zero BIT 6,C ; test bit 6 of C. numeric or string ? JR Z,L2C7C ; skip to DIM-CLEAR if numeric - LD (HL),$20 ; place a space character in HL + LD (HL),#20 ; place a space character in HL ;; DIM-CLEAR L2C7C: POP BC ; pop the data length @@ -13716,18 +13716,18 @@ L2C88: CALL L2D1B ; routine NUMERIC will reset carry if so. ; This routine checks that the character in A is alphabetic ;; ALPHA -L2C8D: CP $41 ; less than 'A' ? +L2C8D: CP #41 ; less than 'A' ? CCF ; Complement Carry Flag RET NC ; return if so - CP $5B ; less than 'Z'+1 ? + CP #5B ; less than 'Z'+1 ? RET C ; is within first range - CP $61 ; less than 'a' ? + CP #61 ; less than 'a' ? CCF ; Complement Carry Flag RET NC ; return if so. - CP $7B ; less than 'z'+1 ? + CP #7B ; less than 'z'+1 ? RET ; carry set if within a-z. ; ------------------------- @@ -13739,15 +13739,15 @@ L2C8D: CP $41 ; less than 'A' ? ; BIN is really just a notational symbol and not a function. ;; DEC-TO-FP -L2C9B: CP $C4 ; 'BIN' token ? +L2C9B: CP #C4 ; 'BIN' token ? JR NZ,L2CB8 ; to NOT-BIN if not - LD DE,$0000 ; initialize 16 bit buffer register. + LD DE,#0000 ; initialize 16 bit buffer register. ;; BIN-DIGIT L2CA2: RST 20H ; NEXT-CHAR - SUB $31 ; '1' - ADC A,$00 ; will be zero if '1' or '0' + SUB #31 ; '1' + ADC A,#00 ; will be zero if '1' or '0' ; carry will be set if was '0' JR NZ,L2CB3 ; forward to BIN-END if result not zero @@ -13774,12 +13774,12 @@ L2CB3: LD B,D ; transfer 16 bit buffer ; continue here with .1, 42, 3.14, 5., 2.3 E -4 ;; NOT-BIN -L2CB8: CP $2E ; '.' - leading decimal point ? +L2CB8: CP #2E ; '.' - leading decimal point ? JR Z,L2CCB ; skip to DECIMAL if so. CALL L2D3B ; routine INT-TO-FP to evaluate all digits ; This number 'x' is placed on stack. - CP $2E ; '.' - mid decimal point ? + CP #2E ; '.' - mid decimal point ? JR NZ,L2CEB ; to E-FORMAT if not to consider that format @@ -13805,8 +13805,8 @@ L2CCF: JP C,L1C8A ; to REPORT-C if just a '.' ; since there is no leading zero put one on the calculator stack. RST 28H ;; FP-CALC - DEFB $A0 ;;stk-zero ; 0. - DEFB $38 ;;end-calc + DEFB #A0 ;;stk-zero ; 0. + DEFB #38 ;;end-calc ; If rejoining from earlier there will be a value 'x' on stack. ; If continuing from above the value zero. @@ -13815,10 +13815,10 @@ L2CCF: JP C,L1C8A ; to REPORT-C if just a '.' ;; DEC-STO-1 L2CD5: RST 28H ;; FP-CALC - DEFB $A1 ;;stk-one ;x or 0,1. - DEFB $C0 ;;st-mem-0 ;x or 0,1. - DEFB $02 ;;delete ;x or 0. - DEFB $38 ;;end-calc + DEFB #A1 ;;stk-one ;x or 0,1. + DEFB #C0 ;;st-mem-0 ;x or 0,1. + DEFB #02 ;;delete ;x or 0. + DEFB #38 ;;end-calc ;; NXT-DGT-1 @@ -13828,13 +13828,13 @@ L2CDA: RST 18H ; GET-CHAR RST 28H ;; FP-CALC ;x or 0,d. first pass. - DEFB $E0 ;;get-mem-0 ;x or 0,d,1. - DEFB $A4 ;;stk-ten ;x or 0,d,1,10. - DEFB $05 ;;division ;x or 0,d,1/10. - DEFB $C0 ;;st-mem-0 ;x or 0,d,1/10. - DEFB $04 ;;multiply ;x or 0,d/10. - DEFB $0F ;;addition ;x or 0 + d/10. - DEFB $38 ;;end-calc last value. + DEFB #E0 ;;get-mem-0 ;x or 0,d,1. + DEFB #A4 ;;stk-ten ;x or 0,d,1,10. + DEFB #05 ;;division ;x or 0,d,1/10. + DEFB #C0 ;;st-mem-0 ;x or 0,d,1/10. + DEFB #04 ;;multiply ;x or 0,d/10. + DEFB #0F ;;addition ;x or 0 + d/10. + DEFB #38 ;;end-calc last value. RST 20H ; NEXT-CHAR moves to next character JR L2CDA ; back to NXT-DGT-1 @@ -13849,20 +13849,20 @@ L2CDA: RST 18H ; GET-CHAR ; Finally see if an exponent has been input. ;; E-FORMAT -L2CEB: CP $45 ; is character 'E' ? +L2CEB: CP #45 ; is character 'E' ? JR Z,L2CF2 ; to SIGN-FLAG if so - CP $65 ; 'e' is acceptable as well. + CP #65 ; 'e' is acceptable as well. RET NZ ; return as no exponent. ;; SIGN-FLAG -L2CF2: LD B,$FF ; initialize temporary sign byte to $FF +L2CF2: LD B,#FF ; initialize temporary sign byte to #FF RST 20H ; NEXT-CHAR - CP $2B ; is character '+' ? + CP #2B ; is character '+' ? JR Z,L2CFE ; to SIGN-DONE - CP $2D ; is character '-' ? + CP #2D ; is character '-' ? JR NZ,L2CFF ; to ST-E-PART as no sign INC B ; set sign to zero @@ -13895,7 +13895,7 @@ L2CFF: CALL L2D1B ; routine NUMERIC ; raised later in E-TO-FP so two different ; error messages depending how high A is. - INC B ; $FF to $00 or $00 to $01 - expendable now. + INC B ; #FF to #00 or #00 to #01 - expendable now. JR Z,L2D18 ; forward to E-FP-JUMP if exponent positive NEG ; Negate the exponent. @@ -13912,10 +13912,10 @@ L2D18: JP L2D4F ; JUMP forward to E-TO-FP to assign to ; returning with carry reset if so. ;; NUMERIC -L2D1B: CP $30 ; '0' +L2D1B: CP #30 ; '0' RET C ; return if less than zero character. - CP $3A ; The upper test is '9' + CP #3A ; The upper test is '9' CCF ; Complement Carry Flag RET ; Return - carry clear if character '0' - '9' @@ -13929,7 +13929,7 @@ L2D1B: CP $30 ; '0' L2D22: CALL L2D1B ; routine NUMERIC RET C ; return if not numeric character - SUB $30 ; convert from ASCII to digit + SUB #30 ; convert from ASCII to digit ; ----------------- ; Stack accumulator @@ -13939,7 +13939,7 @@ L2D22: CALL L2D1B ; routine NUMERIC ;; STACK-A L2D28: LD C,A ; transfer to C - LD B,$00 ; and make B zero + LD B,#00 ; and make B zero ; ---------------------- ; Stack BC register pair @@ -13947,7 +13947,7 @@ L2D28: LD C,A ; transfer to C ; ;; STACK-BC -L2D2B: LD IY,$5C3A ; re-initialize ERR_NR +L2D2B: LD IY,#5C3A ; re-initialize ERR_NR XOR A ; clear to signal small integer LD E,A ; place in E for sign @@ -13957,7 +13957,7 @@ L2D2B: LD IY,$5C3A ; re-initialize ERR_NR CALL L2AB6 ; routine STK-STORE RST 28H ;; FP-CALC - DEFB $38 ;;end-calc make HL = STKEND-5 + DEFB #38 ;;end-calc make HL = STKEND-5 AND A ; clear carry RET ; before returning @@ -13973,8 +13973,8 @@ L2D2B: LD IY,$5C3A ; re-initialize ERR_NR L2D3B: PUSH AF ; save first character RST 28H ;; FP-CALC - DEFB $A0 ;;stk-zero ; v=0. initial value - DEFB $38 ;;end-calc + DEFB #A0 ;;stk-zero ; v=0. initial value + DEFB #38 ;;end-calc POP AF ; fetch first character back. @@ -13983,11 +13983,11 @@ L2D40: CALL L2D22 ; routine STK-DIGIT puts 0-9 on stack RET C ; will return when character is not numeric > RST 28H ;; FP-CALC ; v, d. - DEFB $01 ;;exchange ; d, v. - DEFB $A4 ;;stk-ten ; d, v, 10. - DEFB $04 ;;multiply ; d, v*10. - DEFB $0F ;;addition ; d + v*10 = newvalue - DEFB $38 ;;end-calc ; v. + DEFB #01 ;;exchange ; d, v. + DEFB #A4 ;;stk-ten ; d, v, 10. + DEFB #04 ;;multiply ; d, v*10. + DEFB #0F ;;addition ; d + v*10 = newvalue + DEFB #38 ;;end-calc ; v. CALL L0074 ; routine CH-ADD+1 get next character JR L2D40 ; back to NXT-DGT-2 to process as a digit @@ -14022,15 +14022,15 @@ L2D4F: RLCA ; this will set the x. ;; E-SAVE L2D55: PUSH AF ; save positive exp and sign in carry - LD HL,$5C92 ; address MEM-0 + LD HL,#5C92 ; address MEM-0 CALL L350B ; routine FP-0/1 ; places an integer zero, if no carry, ; else a one in mem-0 as a sign flag RST 28H ;; FP-CALC - DEFB $A4 ;;stk-ten x, 10. - DEFB $38 ;;end-calc + DEFB #A4 ;;stk-ten x, 10. + DEFB #38 ;;end-calc POP AF ; pop the exponent. @@ -14044,23 +14044,23 @@ L2D60: SRL A ; 0>76543210>C PUSH AF ; save shifted exponent. RST 28H ;; FP-CALC - DEFB $C1 ;;st-mem-1 x, 10. - DEFB $E0 ;;get-mem-0 x, 10, (0/1). - DEFB $00 ;;jump-true + DEFB #C1 ;;st-mem-1 x, 10. + DEFB #E0 ;;get-mem-0 x, 10, (0/1). + DEFB #00 ;;jump-true - DEFB $04 ;;to L2D6D, E-DIVSN + DEFB #04 ;;to L2D6D, E-DIVSN - DEFB $04 ;;multiply x*10. - DEFB $33 ;;jump + DEFB #04 ;;multiply x*10. + DEFB #33 ;;jump - DEFB $02 ;;to L2D6E, E-FETCH + DEFB #02 ;;to L2D6E, E-FETCH ;; E-DIVSN -L2D6D: DEFB $05 ;;division x/10. +L2D6D: DEFB #05 ;;division x/10. ;; E-FETCH -L2D6E: DEFB $E1 ;;get-mem-1 x/10 or x*10, 10. - DEFB $38 ;;end-calc new x, 10. +L2D6E: DEFB #E1 ;;get-mem-1 x/10 or x*10, 10. + DEFB #38 ;;end-calc new x, 10. POP AF ; restore shifted exponent @@ -14072,9 +14072,9 @@ L2D71: JR Z,L2D7B ; forward to E-END if A emptied of bits PUSH AF ; re-save shifted exponent RST 28H ;; FP-CALC - DEFB $31 ;;duplicate new x, 10, 10. - DEFB $04 ;;multiply new x, 100. - DEFB $38 ;;end-calc + DEFB #31 ;;duplicate new x, 10, 10. + DEFB #04 ;;multiply new x, 100. + DEFB #38 ;;end-calc POP AF ; restore shifted exponent JR L2D60 ; back to E-LOOP until all bits done. @@ -14087,8 +14087,8 @@ L2D71: JR Z,L2D7B ; forward to E-END if A emptied of bits ;; E-END L2D7B: RST 28H ;; FP-CALC final x, factor. - DEFB $02 ;;delete final x. - DEFB $38 ;;end-calc x. + DEFB #02 ;;delete final x. + DEFB #38 ;;end-calc x. RET ; return @@ -14127,21 +14127,21 @@ L2D7F: INC HL ; skip zero indicator. ; store any integer as positive. ;; p-int-sto -L2D8C: LD C,$00 ; make sign byte positive and continue +L2D8C: LD C,#00 ; make sign byte positive and continue ; ------------- ; Store integer ; ------------- ; this routine stores an integer in DE at address HL. ; It is called from mult, truncate, negate and sgn. -; The sign byte $00 +ve or $FF -ve is in C. +; The sign byte #00 +ve or #FF -ve is in C. ; If negative, the number is stored in 2's complement form so that it is ; ready to be added. ;; INT-STORE L2D8E: PUSH HL ; preserve HL - LD (HL),$00 ; first byte zero shows integer not exponent + LD (HL),#00 ; first byte zero shows integer not exponent INC HL ; LD (HL),C ; then store the sign byte INC HL ; @@ -14159,7 +14159,7 @@ L2D8E: PUSH HL ; preserve HL XOR C ; xor sign 00000000 11111111 LD (HL),A ; store 2's complement. INC HL ; - LD (HL),$00 ; last byte always zero for integers. + LD (HL),#00 ; last byte always zero for integers. ; is not used and need not be looked at when ; testing for zero but comes into play should ; an integer be converted to fp. @@ -14175,7 +14175,7 @@ L2D8E: PUSH HL ; preserve HL ;; FP-TO-BC L2DA2: RST 28H ;; FP-CALC set HL to - DEFB $38 ;;end-calc point to last value. + DEFB #38 ;;end-calc point to last value. LD A,(HL) ; get first of 5 bytes AND A ; and test @@ -14184,17 +14184,17 @@ L2DA2: RST 28H ;; FP-CALC set HL to ; The value is first rounded up and then converted to integer. RST 28H ;; FP-CALC x. - DEFB $A2 ;;stk-half x. 1/2. - DEFB $0F ;;addition x + 1/2. - DEFB $27 ;;int int(x + .5) - DEFB $38 ;;end-calc + DEFB #A2 ;;stk-half x. 1/2. + DEFB #0F ;;addition x + 1/2. + DEFB #27 ;;int int(x + .5) + DEFB #38 ;;end-calc ; now delete but leave HL pointing at integer ;; FP-DELETE L2DAD: RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #38 ;;end-calc PUSH HL ; save pointer. PUSH DE ; and STKEND. @@ -14231,7 +14231,7 @@ L2DAD: RST 28H ;; FP-CALC ;; LOG(2^A) L2DC1: LD D,A ; store a copy of A in D. RLA ; test sign bit of A. - SBC A,A ; now $FF if negative or $00 + SBC A,A ; now #FF if negative or #00 LD E,A ; sign byte to E. LD C,A ; and to C XOR A ; clear A @@ -14245,14 +14245,14 @@ L2DC1: LD D,A ; store a copy of A in D. RST 28H ;; FP-CALC - DEFB $34 ;;stk-data .30103 (log 2) - DEFB $EF ;;Exponent: $7F, Bytes: 4 - DEFB $1A,$20,$9A,$85 ;; - DEFB $04 ;;multiply + DEFB #34 ;;stk-data .30103 (log 2) + DEFB #EF ;;Exponent: #7F, Bytes: 4 + DEFB #1A,#20,#9A,#85 ;; + DEFB #04 ;;multiply - DEFB $27 ;;int + DEFB #27 ;;int - DEFB $38 ;;end-calc + DEFB #38 ;;end-calc ; ------------------- ; Floating point to A @@ -14292,34 +14292,34 @@ L2DE1: POP AF ; restore value and success flag and ;; PRINT-FP L2DE3: RST 28H ;; FP-CALC - DEFB $31 ;;duplicate - DEFB $36 ;;less-0 - DEFB $00 ;;jump-true + DEFB #31 ;;duplicate + DEFB #36 ;;less-0 + DEFB #00 ;;jump-true - DEFB $0B ;;to L2DF2, PF-NEGTVE + DEFB #0B ;;to L2DF2, PF-NEGTVE - DEFB $31 ;;duplicate - DEFB $37 ;;greater-0 - DEFB $00 ;;jump-true + DEFB #31 ;;duplicate + DEFB #37 ;;greater-0 + DEFB #00 ;;jump-true - DEFB $0D ;;to L2DF8, PF-POSTVE + DEFB #0D ;;to L2DF8, PF-POSTVE ; must be zero itself - DEFB $02 ;;delete - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #38 ;;end-calc - LD A,$30 ; prepare the character '0' + LD A,#30 ; prepare the character '0' RST 10H ; PRINT-A RET ; return. -> ; --- ;; PF-NEGTVE -L2DF2: DEFB $2A ;;abs - DEFB $38 ;;end-calc +L2DF2: DEFB #2A ;;abs + DEFB #38 ;;end-calc - LD A,$2D ; the character '-' + LD A,#2D ; the character '-' RST 10H ; PRINT-A @@ -14328,12 +14328,12 @@ L2DF2: DEFB $2A ;;abs RST 28H ;; FP-CALC ;; PF-POSTVE -L2DF8: DEFB $A0 ;;stk-zero x,0. begin by - DEFB $C3 ;;st-mem-3 x,0. clearing a temporary - DEFB $C4 ;;st-mem-4 x,0. output buffer to - DEFB $C5 ;;st-mem-5 x,0. fifteen zeros. - DEFB $02 ;;delete x. - DEFB $38 ;;end-calc x. +L2DF8: DEFB #A0 ;;stk-zero x,0. begin by + DEFB #C3 ;;st-mem-3 x,0. clearing a temporary + DEFB #C4 ;;st-mem-4 x,0. output buffer to + DEFB #C5 ;;st-mem-5 x,0. fifteen zeros. + DEFB #02 ;;delete x. + DEFB #38 ;;end-calc x. EXX ; in case called from 'str$' then save the PUSH HL ; pointer to whatever comes after @@ -14343,15 +14343,15 @@ L2DF8: DEFB $A0 ;;stk-zero x,0. begin by ;; PF-LOOP L2E01: RST 28H ;; FP-CALC - DEFB $31 ;;duplicate x,x. - DEFB $27 ;;int x,int x. - DEFB $C2 ;;st-mem-2 x,int x. - DEFB $03 ;;subtract x-int x. fractional part. - DEFB $E2 ;;get-mem-2 x-int x, int x. - DEFB $01 ;;exchange int x, x-int x. - DEFB $C2 ;;st-mem-2 int x, x-int x. - DEFB $02 ;;delete int x. - DEFB $38 ;;end-calc int x. + DEFB #31 ;;duplicate x,x. + DEFB #27 ;;int x,int x. + DEFB #C2 ;;st-mem-2 x,int x. + DEFB #03 ;;subtract x-int x. fractional part. + DEFB #E2 ;;get-mem-2 x-int x, int x. + DEFB #01 ;;exchange int x, x-int x. + DEFB #C2 ;;st-mem-2 int x, x-int x. + DEFB #02 ;;delete int x. + DEFB #38 ;;end-calc int x. ; ; mem-2 holds the fractional part. @@ -14368,7 +14368,7 @@ L2E01: RST 28H ;; FP-CALC CALL L2D7F ; routine INT-FETCH gets x in DE ; (but x is not deleted) - LD B,$10 ; set B, bit counter, to 16d + LD B,#10 ; set B, bit counter, to 16d LD A,D ; test if AND A ; high byte is zero @@ -14383,7 +14383,7 @@ L2E01: RST 28H ;; FP-CALC ; LD D,E ; transfer E to D - LD B,$08 ; and reduce the bit counter to 8. + LD B,#08 ; and reduce the bit counter to 8. ;; PF-SAVE L2E1E: PUSH DE ; save the part before decimal point. @@ -14405,39 +14405,39 @@ L2E1E: PUSH DE ; save the part before decimal point. ;; PF-SMALL L2E24: RST 28H ;; FP-CALC int x = 0. -L2E25: DEFB $E2 ;;get-mem-2 int x = 0, x-int x. - DEFB $38 ;;end-calc +L2E25: DEFB #E2 ;;get-mem-2 int x = 0, x-int x. + DEFB #38 ;;end-calc LD A,(HL) ; fetch exponent of positive fractional number - SUB $7E ; subtract + SUB #7E ; subtract CALL L2DC1 ; routine LOG(2^A) calculates leading digits. LD D,A ; transfer count to D - LD A,($5CAC) ; fetch total MEM-5-1 + LD A,(#5CAC) ; fetch total MEM-5-1 SUB D ; - LD ($5CAC),A ; MEM-5-1 + LD (#5CAC),A ; MEM-5-1 LD A,D ; CALL L2D4F ; routine E-TO-FP RST 28H ;; FP-CALC - DEFB $31 ;;duplicate - DEFB $27 ;;int - DEFB $C1 ;;st-mem-1 - DEFB $03 ;;subtract - DEFB $E1 ;;get-mem-1 - DEFB $38 ;;end-calc + DEFB #31 ;;duplicate + DEFB #27 ;;int + DEFB #C1 ;;st-mem-1 + DEFB #03 ;;subtract + DEFB #E1 ;;get-mem-1 + DEFB #38 ;;end-calc CALL L2DD5 ; routine FP-TO-A PUSH HL ; save HL - LD ($5CA1),A ; MEM-3-1 + LD (#5CA1),A ; MEM-3-1 DEC A ; RLA ; SBC A,A ; INC A ; - LD HL,$5CAB ; address MEM-5-1 leading digit counter + LD HL,#5CAB ; address MEM-5-1 leading digit counter LD (HL),A ; store counter INC HL ; address MEM-5-2 total digits ADD A,(HL) ; add counter to contents @@ -14457,14 +14457,14 @@ L2E25: DEFB $E2 ;;get-mem-2 int x = 0, x-int x. ; the accumulator holds the exponent. ;; PF-LARGE -L2E56: SUB $80 ; make exponent positive - CP $1C ; compare to 28 +L2E56: SUB #80 ; make exponent positive + CP #1C ; compare to 28 JR C,L2E6F ; to PF-MEDIUM if integer <= 2^27 CALL L2DC1 ; routine LOG(2^A) - SUB $07 ; + SUB #07 ; LD B,A ; - LD HL,$5CAC ; address MEM-5-1 the leading digits counter. + LD HL,#5CAC ; address MEM-5-1 the leading digits counter. ADD A,(HL) ; add A to contents LD (HL),A ; store updated value. LD A,B ; @@ -14481,7 +14481,7 @@ L2E6F: EX DE,HL ; SET 7,D ; LD A,L ; EXX ; - SUB $80 ; + SUB #80 ; LD B,A ; ; the branch was here to handle bits in DE with 8 or 16 in B if small int @@ -14496,8 +14496,8 @@ L2E7B: SLA E ; C> PUSH AF ; save count. PUSH DE ; and normal STKEND - LD DE,$0000 ; dummy value for STKEND at start of ROM + LD DE,#0000 ; dummy value for STKEND at start of ROM ; Note. not a fault but this has to be ; moved elsewhere when running in RAM. ; e.g. with Expandor Systems 'Soft ROM'. @@ -16293,26 +16293,26 @@ L33F8: RET Z ; return if zero. >> ; floating-point numbers in the calculator's memory area. ;; LOC-MEM -L3406: LD C,A ; store the original number $00-$1F. +L3406: LD C,A ; store the original number #00-#1F. RLCA ; double. RLCA ; quadruple. ADD A,C ; now add original to multiply by five. LD C,A ; place the result in C. - LD B,$00 ; set B to 0. + LD B,#00 ; set B to 0. ADD HL,BC ; add to form address of start of number in HL. RET ; return. ; ------------------------------ -; Get from memory area ($E0 etc.) +; Get from memory area (#E0 etc.) ; ------------------------------ -; Literals $E0 to $FF -; A holds $00-$1F offset. +; Literals #E0 to #FF +; A holds #00-#1F offset. ; The calculator stack increases by 5 bytes. ;; get-mem-xx L340F: PUSH DE ; save STKEND - LD HL,($5C68) ; MEM is base address of the memory cells. + LD HL,(#5C68) ; MEM is base address of the memory cells. CALL L3406 ; routine LOC-MEM so that HL = first byte CALL L33C0 ; routine MOVE-FP moves 5 bytes with memory ; check. @@ -16346,23 +16346,23 @@ L341B: LD H,D ; save STKEND - required for result RET ; return. ; -------------------------------- -; Store in a memory area ($C0 etc.) +; Store in a memory area (#C0 etc.) ; -------------------------------- -; Offsets $C0 to $DF +; Offsets #C0 to #DF ; Although 32 memory storage locations can be addressed, only six -; $C0 to $C5 are required by the ROM and only the thirty bytes (6*5) +; #C0 to #C5 are required by the ROM and only the thirty bytes (6*5) ; required for these are allocated. Spectrum programmers who wish to ; use the floating point routines from assembly language may wish to ; alter the system variable MEM to point to 160 bytes of RAM to have ; use the full range available. -; A holds the derived offset $00-$1F. +; A holds the derived offset #00-#1F. ; This is a unary operation, so on entry HL points to the last value and DE ; points to STKEND. ;; st-mem-xx L342D: PUSH HL ; save the result pointer. EX DE,HL ; transfer to DE. - LD HL,($5C68) ; fetch MEM the base of memory area. + LD HL,(#5C68) ; fetch MEM the base of memory area. CALL L3406 ; routine LOC-MEM sets HL to the destination. EX DE,HL ; swap - HL is start, DE is destination. CALL L33C0 ; routine MOVE-FP. @@ -16382,7 +16382,7 @@ L342D: PUSH HL ; save the result pointer. ; On exit, HL=result, DE=stkend. ;; exchange -L343C: LD B,$05 ; there are five bytes to be swapped +L343C: LD B,#05 ; there are five bytes to be swapped ; start of loop. @@ -16415,7 +16415,7 @@ L343E: LD A,(DE) ; each byte of second ; and Dr Frank O'Hara, published 1983 by Melbourne House. ;; series-xx -L3449: LD B,A ; parameter $00 - $1F to B counter +L3449: LD B,A ; parameter #00 - #1F to B counter CALL L335E ; routine GEN-ENT-1 is called. ; A recursive call to a special entry point ; in the calculator that puts the B register @@ -16428,24 +16428,24 @@ L3449: LD B,A ; parameter $00 - $1F to B counter ; The initialization phase. - DEFB $31 ;;duplicate x,x - DEFB $0F ;;addition x+x - DEFB $C0 ;;st-mem-0 x+x - DEFB $02 ;;delete . - DEFB $A0 ;;stk-zero 0 - DEFB $C2 ;;st-mem-2 0 + DEFB #31 ;;duplicate x,x + DEFB #0F ;;addition x+x + DEFB #C0 ;;st-mem-0 x+x + DEFB #02 ;;delete . + DEFB #A0 ;;stk-zero 0 + DEFB #C2 ;;st-mem-2 0 ; a loop is now entered to perform the algebraic calculation for each of ; the numbers in the series ;; G-LOOP -L3453: DEFB $31 ;;duplicate v,v. - DEFB $E0 ;;get-mem-0 v,v,x+2 - DEFB $04 ;;multiply v,v*x+2 - DEFB $E2 ;;get-mem-2 v,v*x+2,v - DEFB $C1 ;;st-mem-1 - DEFB $03 ;;subtract - DEFB $38 ;;end-calc +L3453: DEFB #31 ;;duplicate v,v. + DEFB #E0 ;;get-mem-0 v,v,x+2 + DEFB #04 ;;multiply v,v*x+2 + DEFB #E2 ;;get-mem-2 v,v*x+2,v + DEFB #C1 ;;st-mem-1 + DEFB #03 ;;subtract + DEFB #38 ;;end-calc ; the previous pointer is fetched from the machine stack to H'L' where it ; addresses one of the numbers of the series following the series literal. @@ -16458,20 +16458,20 @@ L3453: DEFB $31 ;;duplicate v,v. ; H'L' value goes on the machine stack and is ; then loaded as usual with the next address. - DEFB $0F ;;addition - DEFB $01 ;;exchange - DEFB $C2 ;;st-mem-2 - DEFB $02 ;;delete + DEFB #0F ;;addition + DEFB #01 ;;exchange + DEFB #C2 ;;st-mem-2 + DEFB #02 ;;delete - DEFB $35 ;;dec-jr-nz - DEFB $EE ;;back to L3453, G-LOOP + DEFB #35 ;;dec-jr-nz + DEFB #EE ;;back to L3453, G-LOOP ; when the counted loop is complete the final subtraction yields the result ; for example SIN X. - DEFB $E1 ;;get-mem-1 - DEFB $03 ;;subtract - DEFB $38 ;;end-calc + DEFB #E1 ;;get-mem-1 + DEFB #03 ;;subtract + DEFB #38 ;;end-calc RET ; return with H'L' pointing to location ; after last number in series. @@ -16483,7 +16483,7 @@ L3453: DEFB $31 ;;duplicate v,v. ; integer or floating point, on calculator stack. ;; abs -L346A: LD B,$FF ; signal abs +L346A: LD B,#FF ; signal abs JR L3474 ; forward to NEG-TEST ; ----------------------- @@ -16496,7 +16496,7 @@ L346A: LD B,$FF ; signal abs L346E: CALL L34E9 ; call routine TEST-ZERO and RET C ; return if so leaving zero unchanged. - LD B,$00 ; signal negate required before joining + LD B,#00 ; signal negate required before joining ; common code. ;; NEG-TEST @@ -16507,8 +16507,8 @@ L3474: LD A,(HL) ; load first byte and ; for floating point numbers a single bit denotes the sign. INC HL ; address the first byte of mantissa. - LD A,B ; action flag $FF=abs, $00=neg. - AND $80 ; now $80 $00 + LD A,B ; action flag #FF=abs, #00=neg. + AND #80 ; now #80 #00 OR (HL) ; sets bit 7 for abs RLA ; sets carry for abs and if number negative CCF ; complement carry flag @@ -16531,9 +16531,9 @@ L3483: PUSH DE ; save STKEND. POP HL ; restore the result pointer. - LD A,B ; $FF=abs, $00=neg - OR C ; $FF for abs, no change neg - CPL ; $00 for abs, switched for neg + LD A,B ; #FF=abs, #00=neg + OR C ; #FF for abs, no change neg + CPL ; #00 for abs, switched for neg LD C,A ; transfer result to sign byte. CALL L2D8E ; routine INT-STORE to re-write the integer. @@ -16554,11 +16554,11 @@ L3492: CALL L34E9 ; call routine TEST-ZERO and PUSH DE ; save pointer to STKEND. - LD DE,$0001 ; the result will be 1. + LD DE,#0001 ; the result will be 1. INC HL ; skip over the exponent. RL (HL) ; rotate the sign bit into the carry flag. DEC HL ; step back to point to the result. - SBC A,A ; byte will be $FF if negative, $00 if positive. + SBC A,A ; byte will be #FF if negative, #00 if positive. LD C,A ; store the sign byte in the C register. CALL L2D8E ; routine INT-STORE to overwrite the last ; value with 0001 and sign. @@ -16640,10 +16640,10 @@ L34BC: CALL L2BF1 ; routine STK-FETCH fetches the string CALL L2C8D ; routine ALPHA sets carry if 'A-Z' or 'a-z'. JR C,L34D3 ; forward to USR-RANGE if ASCII. - SUB $90 ; make udgs range 0-20d + SUB #90 ; make udgs range 0-20d JR C,L34E7 ; to REPORT-A if too low. e.g. usr " ". - CP $15 ; Note. this test is not necessary. + CP #15 ; Note. this test is not necessary. JR NC,L34E7 ; to REPORT-A if higher than 20. INC A ; make range 1-21d to match LSBs of ASCII @@ -16653,11 +16653,11 @@ L34D3: DEC A ; make range of bits 0-4 start at zero ADD A,A ; multiply by eight ADD A,A ; and lose any set bits ADD A,A ; range now 0 - 25*8 - CP $A8 ; compare to 21*8 + CP #A8 ; compare to 21*8 JR NC,L34E7 ; to REPORT-A if originally higher ; than 'U','u' or graphics U. - LD BC,($5C7B) ; fetch the UDG system variable value. + LD BC,(#5C7B) ; fetch the UDG system variable value. ADD A,C ; add the offset to character LD C,A ; and store back in register C. JR NC,L34E4 ; forward to USR-STACK if no overflow. @@ -16671,7 +16671,7 @@ L34E4: JP L2D2B ; jump back and exit via STACK-BC to store ;; REPORT-A L34E7: RST 08H ; ERROR-1 - DEFB $09 ; Error Report: Invalid argument + DEFB #09 ; Error Report: Invalid argument ; ------------- ; Test for zero @@ -16704,7 +16704,7 @@ L34E9: PUSH HL ; preserve HL which is used to address. RET ; return with carry set if zero. ; ----------------------- -; Greater than zero ($37) +; Greater than zero (#37) ; ----------------------- ; Test if the last value on the calculator stack is greater than zero. ; This routine is also called directly from the end-tests of the comparison @@ -16716,7 +16716,7 @@ L34F9: CALL L34E9 ; routine TEST-ZERO RET C ; return if was zero as this ; is also the Boolean 'false' value. - LD A,$FF ; prepare XOR mask for sign bit + LD A,#FF ; prepare XOR mask for sign bit JR L3507 ; forward to SIGN-TO-C ; to put sign in carry ; (carry will become set if sign is positive) @@ -16724,7 +16724,7 @@ L34F9: CALL L34E9 ; routine TEST-ZERO ; as appropriate. ; ------------------------ -; Handle NOT operator ($30) +; Handle NOT operator (#30) ; ------------------------ ; This overwrites the last value with 1 if it was zero else with zero ; if it was any other value. @@ -16768,7 +16768,7 @@ L3507: INC HL ; address 2nd byte. ;; FP-0/1 L350B: PUSH HL ; save pointer to the first byte - LD A,$00 ; load accumulator with zero - without + LD A,#00 ; load accumulator with zero - without ; disturbing flags. LD (HL),A ; zero to first byte INC HL ; address next @@ -16865,7 +16865,7 @@ L352D: EX DE,HL ; make HL point to the number. RET ; return. ; ----------------------------------- -; Perform comparison ($09-$0E, $11-$16) +; Perform comparison (#09-#0E, #11-#16) ; ----------------------------------- ; True binary operations. ; @@ -16921,13 +16921,13 @@ L352D: EX DE,HL ; make HL point to the number. ;; no-l-eql, etc. L353B: LD A,B ; transfer literal to accumulator. - SUB $08 ; subtract eight - which is not useful. + SUB #08 ; subtract eight - which is not useful. BIT 2,A ; isolate '>', '<', '='. JR NZ,L3543 ; skip to EX-OR-NOT with these. - DEC A ; else make $00-$02, $08-$0A to match bits 0-2. + DEC A ; else make #00-#02, #08-#0A to match bits 0-2. ;; EX-OR-NOT L3543: RRCA ; the first RRCA sets carry for a swap. @@ -17055,8 +17055,8 @@ L3585: POP BC ; discard length L3588: PUSH AF ; save A and carry RST 28H ;; FP-CALC - DEFB $A0 ;;stk-zero an initial false value. - DEFB $38 ;;end-calc + DEFB #A0 ;;stk-zero an initial false value. + DEFB #38 ;;end-calc ; both numeric and string paths converge here. @@ -17080,7 +17080,7 @@ L358C: POP AF ; pop carry - will be set if eql/neql RET ; return. ; ------------------------- -; String concatenation ($17) +; String concatenation (#17) ; ------------------------- ; This literal combines two strings into one e.g. LET a$ = b$ + c$ ; The two parameters of the two strings to be combined are on the stack. @@ -17138,8 +17138,8 @@ L35B7: POP BC ; now second length ; the CALCULATE routine. ;; STK-PNTRS -L35BF: LD HL,($5C65) ; fetch STKEND value from system variable. - LD DE,$FFFB ; the value -5 +L35BF: LD HL,(#5C65) ; fetch STKEND value from system variable. + LD DE,#FFFB ; the value -5 PUSH HL ; push STKEND value. ADD HL,DE ; subtract 5 from HL. @@ -17161,7 +17161,7 @@ L35C9: CALL L2DD5 ; routine FP-TO-A puts the number in A. PUSH AF ; save the argument. - LD BC,$0001 ; one space required. + LD BC,#0001 ; one space required. RST 30H ; BC-SPACES makes DE point to start POP AF ; restore the number. @@ -17177,10 +17177,10 @@ L35C9: CALL L2DD5 ; routine FP-TO-A puts the number in A. ;; REPORT-Bd L35DC: RST 08H ; ERROR-1 - DEFB $0A ; Error Report: Integer out of range + DEFB #0A ; Error Report: Integer out of range ; ---------------------------- -; Handle VAL and VAL$ ($1D, $18) +; Handle VAL and VAL$ (#1D, #18) ; ---------------------------- ; VAL treats the characters in a string as a numeric expression. ; e.g. VAL "2.3" = 2.3, VAL "2+4" = 6, VAL ("2" + "4") = 24. @@ -17189,12 +17189,12 @@ L35DC: RST 08H ; ERROR-1 ;; val ;; val$ -L35DE: LD HL,($5C5D) ; fetch value of system variable CH_ADD +L35DE: LD HL,(#5C5D) ; fetch value of system variable CH_ADD PUSH HL ; and save on the machine stack. - LD A,B ; fetch the literal (either $1D or $18). - ADD A,$E3 ; add $E3 to form $00 (setting carry) or $FB. - SBC A,A ; now form $FF bit 6 = numeric result - ; or $00 bit 6 = string result. + LD A,B ; fetch the literal (either #1D or #18). + ADD A,#E3 ; add #E3 to form #00 (setting carry) or #FB. + SBC A,A ; now form #FF bit 6 = numeric result + ; or #00 bit 6 = string result. PUSH AF ; save this mask on the stack CALL L2BF1 ; routine STK-FETCH fetches the string operand @@ -17205,39 +17205,39 @@ L35DE: LD HL,($5C5D) ; fetch value of system variable CH_ADD RST 30H ; BC-SPACES creates the space in workspace. POP HL ; restore start of string to HL. - LD ($5C5D),DE ; load CH_ADD with start DE in workspace. + LD (#5C5D),DE ; load CH_ADD with start DE in workspace. PUSH DE ; save the start in workspace LDIR ; copy string from program or variables or ; workspace to the workspace area. EX DE,HL ; end of string + 1 to HL DEC HL ; decrement HL to point to end of new area. - LD (HL),$0D ; insert a carriage return at end. - RES 7,(IY+$01) ; update FLAGS - signal checking syntax. + LD (HL),#0D ; insert a carriage return at end. + RES 7,(IY+#01) ; update FLAGS - signal checking syntax. CALL L24FB ; routine SCANNING evaluates string ; expression and result. RST 18H ; GET-CHAR fetches next character. - CP $0D ; is it the expected carriage return ? + CP #0D ; is it the expected carriage return ? JR NZ,L360C ; forward to V-RPORT-C if not ; 'Nonsense in BASIC'. POP HL ; restore start of string in workspace. POP AF ; restore expected result flag (bit 6). - XOR (IY+$01) ; xor with FLAGS now updated by SCANNING. - AND $40 ; test bit 6 - should be zero if result types + XOR (IY+#01) ; xor with FLAGS now updated by SCANNING. + AND #40 ; test bit 6 - should be zero if result types ; match. ;; V-RPORT-C L360C: JP NZ,L1C8A ; jump back to REPORT-C with a result mismatch. - LD ($5C5D),HL ; set CH_ADD to the start of the string again. - SET 7,(IY+$01) ; update FLAGS - signal running program. + LD (#5C5D),HL ; set CH_ADD to the start of the string again. + SET 7,(IY+#01) ; update FLAGS - signal running program. CALL L24FB ; routine SCANNING evaluates the string ; in full leaving result on calculator stack. POP HL ; restore saved character address in program. - LD ($5C5D),HL ; and reset the system variable CH_ADD. + LD (#5C5D),HL ; and reset the system variable CH_ADD. JR L35BF ; back to exit via STK-PNTRS. ; resetting the calculator stack pointers @@ -17251,16 +17251,16 @@ L360C: JP NZ,L1C8A ; jump back to REPORT-C with a result mismatch. ; ;; str$ -L361F: LD BC,$0001 ; create an initial byte in workspace +L361F: LD BC,#0001 ; create an initial byte in workspace RST 30H ; using BC-SPACES restart. - LD ($5C5B),HL ; set system variable K_CUR to new location. + LD (#5C5B),HL ; set system variable K_CUR to new location. PUSH HL ; and save start on machine stack also. - LD HL,($5C51) ; fetch value of system variable CURCHL + LD HL,(#5C51) ; fetch value of system variable CURCHL PUSH HL ; and save that too. - LD A,$FF ; select system channel 'R'. + LD A,#FF ; select system channel 'R'. CALL L1601 ; routine CHAN-OPEN opens it. CALL L2DE3 ; routine PRINT-FP outputs the number to ; workspace updating K-CUR. @@ -17269,7 +17269,7 @@ L361F: LD BC,$0001 ; create an initial byte in workspace CALL L1615 ; routine CHAN-FLAG resets flags. POP DE ; fetch saved start of string to DE. - LD HL,($5C5B) ; load HL with end of string from K_CUR. + LD HL,(#5C5B) ; load HL with end of string from K_CUR. AND A ; prepare for true subtraction. SBC HL,DE ; subtract start from end to give length. @@ -17292,19 +17292,19 @@ L361F: LD BC,$0001 ; create an initial byte in workspace ;; read-in L3645: CALL L1E94 ; routine FIND-INT1 fetches stream to A - CP $10 ; compare with 16 decimal. + CP #10 ; compare with 16 decimal. JP NC,L1E9F ; jump to REPORT-Bb if not in range 0 - 15. ; 'Integer out of range' ; (REPORT-Bd is within range) - LD HL,($5C51) ; fetch current channel CURCHL + LD HL,(#5C51) ; fetch current channel CURCHL PUSH HL ; save it CALL L1601 ; routine CHAN-OPEN opens channel CALL L15E6 ; routine INPUT-AD - the channel must have an ; input stream or else error here from stream ; stub. - LD BC,$0000 ; initialize length of string to zero + LD BC,#0000 ; initialize length of string to zero JR NC,L365F ; forward to R-I-STORE if no key detected. INC C ; increase length to one. @@ -17366,7 +17366,7 @@ L3674: CALL L2BF1 ; routine STK-FETCH to fetch and delete the L367A: EXX ; switch in set that addresses code PUSH HL ; save pointer to offset byte - LD HL,$5C67 ; address BREG in system variables + LD HL,#5C67 ; address BREG in system variables DEC (HL) ; decrement it POP HL ; restore pointer @@ -17378,7 +17378,7 @@ L367A: EXX ; switch in set that addresses code ; Note. as a general rule the calculator avoids using the IY register ; otherwise the cumbersome 4 instructions in the middle could be replaced by -; dec (iy+$2d) - three bytes instead of six. +; dec (iy+#2d) - three bytes instead of six. ; --------- @@ -17395,7 +17395,7 @@ L3686: EXX ;switch in pointer set L3687: LD E,(HL) ; the jump byte 0-127 forward, 128-255 back. LD A,E ; transfer to accumulator. RLA ; if backward jump, carry is set. - SBC A,A ; will be $FF if backward or $00 if forward. + SBC A,A ; will be #FF if backward or #00 if forward. LD D,A ; transfer to high byte. ADD HL,DE ; advance calculator pointer forward or back. EXX ; switch back. @@ -17444,25 +17444,25 @@ L369B: POP AF ; drop the calculator return address RE-ENTRY ; ------------------------ ; THE 'MODULUS' SUBROUTINE ; ------------------------ -; (offset: $32 'n-mod-m') +; (offset: #32 'n-mod-m') ; ; ;; n-mod-m L36A0: RST 28H ;; FP-CALC 17, 3. - DEFB $C0 ;;st-mem-0 17, 3. - DEFB $02 ;;delete 17. - DEFB $31 ;;duplicate 17, 17. - DEFB $E0 ;;get-mem-0 17, 17, 3. - DEFB $05 ;;division 17, 17/3. - DEFB $27 ;;int 17, 5. - DEFB $E0 ;;get-mem-0 17, 5, 3. - DEFB $01 ;;exchange 17, 3, 5. - DEFB $C0 ;;st-mem-0 17, 3, 5. - DEFB $04 ;;multiply 17, 15. - DEFB $03 ;;subtract 2. - DEFB $E0 ;;get-mem-0 2, 5. - DEFB $38 ;;end-calc 2, 5. + DEFB #C0 ;;st-mem-0 17, 3. + DEFB #02 ;;delete 17. + DEFB #31 ;;duplicate 17, 17. + DEFB #E0 ;;get-mem-0 17, 17, 3. + DEFB #05 ;;division 17, 17/3. + DEFB #27 ;;int 17, 5. + DEFB #E0 ;;get-mem-0 17, 5, 3. + DEFB #01 ;;exchange 17, 3, 5. + DEFB #C0 ;;st-mem-0 17, 3, 5. + DEFB #04 ;;multiply 17, 15. + DEFB #03 ;;subtract 2. + DEFB #E0 ;;get-mem-0 2, 5. + DEFB #38 ;;end-calc 2, 5. RET ; return. @@ -17470,7 +17470,7 @@ L36A0: RST 28H ;; FP-CALC 17, 3. ; ------------------ ; THE 'INT' FUNCTION ; ------------------ -; (offset $27: 'int' ) +; (offset #27: 'int' ) ; ; This function returns the integer of x, which is just the same as truncate ; for positive numbers. The truncate literal truncates negative numbers @@ -17480,13 +17480,13 @@ L36A0: RST 28H ;; FP-CALC 17, 3. ;; int L36AF: RST 28H ;; FP-CALC x. (= 3.4 or -3.4). - DEFB $31 ;;duplicate x, x. - DEFB $36 ;;less-0 x, (1/0) - DEFB $00 ;;jump-true x, (1/0) - DEFB $04 ;;to L36B7, X-NEG + DEFB #31 ;;duplicate x, x. + DEFB #36 ;;less-0 x, (1/0) + DEFB #00 ;;jump-true x, (1/0) + DEFB #04 ;;to L36B7, X-NEG - DEFB $3A ;;truncate trunc 3.4 = 3. - DEFB $38 ;;end-calc 3. + DEFB #3A ;;truncate trunc 3.4 = 3. + DEFB #38 ;;end-calc 3. RET ; return with + int x on stack. @@ -17494,21 +17494,21 @@ L36AF: RST 28H ;; FP-CALC x. (= 3.4 or -3.4). ;; X-NEG -L36B7: DEFB $31 ;;duplicate -3.4, -3.4. - DEFB $3A ;;truncate -3.4, -3. - DEFB $C0 ;;st-mem-0 -3.4, -3. - DEFB $03 ;;subtract -.4 - DEFB $E0 ;;get-mem-0 -.4, -3. - DEFB $01 ;;exchange -3, -.4. - DEFB $30 ;;not -3, (0). - DEFB $00 ;;jump-true -3. - DEFB $03 ;;to L36C2, EXIT -3. +L36B7: DEFB #31 ;;duplicate -3.4, -3.4. + DEFB #3A ;;truncate -3.4, -3. + DEFB #C0 ;;st-mem-0 -3.4, -3. + DEFB #03 ;;subtract -.4 + DEFB #E0 ;;get-mem-0 -.4, -3. + DEFB #01 ;;exchange -3, -.4. + DEFB #30 ;;not -3, (0). + DEFB #00 ;;jump-true -3. + DEFB #03 ;;to L36C2, EXIT -3. - DEFB $A1 ;;stk-one -3, 1. - DEFB $03 ;;subtract -4. + DEFB #A1 ;;stk-one -3, 1. + DEFB #03 ;;subtract -4. ;; EXIT -L36C2: DEFB $38 ;;end-calc -4. +L36C2: DEFB #38 ;;end-calc -4. RET ; return. @@ -17522,38 +17522,38 @@ L36C2: DEFB $38 ;;end-calc -4. ;; EXP ;; exp L36C4: RST 28H ;; FP-CALC - DEFB $3D ;;re-stack - DEFB $34 ;;stk-data - DEFB $F1 ;;Exponent: $81, Bytes: 4 - DEFB $38,$AA,$3B,$29 ;; - DEFB $04 ;;multiply - DEFB $31 ;;duplicate - DEFB $27 ;;int - DEFB $C3 ;;st-mem-3 - DEFB $03 ;;subtract - DEFB $31 ;;duplicate - DEFB $0F ;;addition - DEFB $A1 ;;stk-one - DEFB $03 ;;subtract - DEFB $88 ;;series-08 - DEFB $13 ;;Exponent: $63, Bytes: 1 - DEFB $36 ;;(+00,+00,+00) - DEFB $58 ;;Exponent: $68, Bytes: 2 - DEFB $65,$66 ;;(+00,+00) - DEFB $9D ;;Exponent: $6D, Bytes: 3 - DEFB $78,$65,$40 ;;(+00) - DEFB $A2 ;;Exponent: $72, Bytes: 3 - DEFB $60,$32,$C9 ;;(+00) - DEFB $E7 ;;Exponent: $77, Bytes: 4 - DEFB $21,$F7,$AF,$24 ;; - DEFB $EB ;;Exponent: $7B, Bytes: 4 - DEFB $2F,$B0,$B0,$14 ;; - DEFB $EE ;;Exponent: $7E, Bytes: 4 - DEFB $7E,$BB,$94,$58 ;; - DEFB $F1 ;;Exponent: $81, Bytes: 4 - DEFB $3A,$7E,$F8,$CF ;; - DEFB $E3 ;;get-mem-3 - DEFB $38 ;;end-calc + DEFB #3D ;;re-stack + DEFB #34 ;;stk-data + DEFB #F1 ;;Exponent: #81, Bytes: 4 + DEFB #38,#AA,#3B,#29 ;; + DEFB #04 ;;multiply + DEFB #31 ;;duplicate + DEFB #27 ;;int + DEFB #C3 ;;st-mem-3 + DEFB #03 ;;subtract + DEFB #31 ;;duplicate + DEFB #0F ;;addition + DEFB #A1 ;;stk-one + DEFB #03 ;;subtract + DEFB #88 ;;series-08 + DEFB #13 ;;Exponent: #63, Bytes: 1 + DEFB #36 ;;(+00,+00,+00) + DEFB #58 ;;Exponent: #68, Bytes: 2 + DEFB #65,#66 ;;(+00,+00) + DEFB #9D ;;Exponent: #6D, Bytes: 3 + DEFB #78,#65,#40 ;;(+00) + DEFB #A2 ;;Exponent: #72, Bytes: 3 + DEFB #60,#32,#C9 ;;(+00) + DEFB #E7 ;;Exponent: #77, Bytes: 4 + DEFB #21,#F7,#AF,#24 ;; + DEFB #EB ;;Exponent: #7B, Bytes: 4 + DEFB #2F,#B0,#B0,#14 ;; + DEFB #EE ;;Exponent: #7E, Bytes: 4 + DEFB #7E,#BB,#94,#58 ;; + DEFB #F1 ;;Exponent: #81, Bytes: 4 + DEFB #3A,#7E,#F8,#CF ;; + DEFB #E3 ;;get-mem-3 + DEFB #38 ;;end-calc CALL L2DD5 ; routine FP-TO-A JR NZ,L3705 ; to N-NEGTV @@ -17566,7 +17566,7 @@ L36C4: RST 28H ;; FP-CALC ;; REPORT-6b L3703: RST 08H ; ERROR-1 - DEFB $05 ; Error Report: Number too big + DEFB #05 ; Error Report: Number too big ;; N-NEGTV L3705: JR C,L370E ; to RSLT-ZERO @@ -17585,9 +17585,9 @@ L370C: LD (HL),A ; ;; RSLT-ZERO L370E: RST 28H ;; FP-CALC - DEFB $02 ;;delete - DEFB $A0 ;;stk-zero - DEFB $38 ;;end-calc + DEFB #02 ;;delete + DEFB #A0 ;;stk-zero + DEFB #38 ;;end-calc RET ; return. @@ -17600,99 +17600,99 @@ L370E: RST 28H ;; FP-CALC ;; ln L3713: RST 28H ;; FP-CALC - DEFB $3D ;;re-stack - DEFB $31 ;;duplicate - DEFB $37 ;;greater-0 - DEFB $00 ;;jump-true - DEFB $04 ;;to L371C, VALID + DEFB #3D ;;re-stack + DEFB #31 ;;duplicate + DEFB #37 ;;greater-0 + DEFB #00 ;;jump-true + DEFB #04 ;;to L371C, VALID - DEFB $38 ;;end-calc + DEFB #38 ;;end-calc ;; REPORT-Ab L371A: RST 08H ; ERROR-1 - DEFB $09 ; Error Report: Invalid argument + DEFB #09 ; Error Report: Invalid argument ;; VALID -L371C: DEFB $A0 ;;stk-zero - DEFB $02 ;;delete - DEFB $38 ;;end-calc +L371C: DEFB #A0 ;;stk-zero + DEFB #02 ;;delete + DEFB #38 ;;end-calc LD A,(HL) ; - LD (HL),$80 ; + LD (HL),#80 ; CALL L2D28 ; routine STACK-A RST 28H ;; FP-CALC - DEFB $34 ;;stk-data - DEFB $38 ;;Exponent: $88, Bytes: 1 - DEFB $00 ;;(+00,+00,+00) - DEFB $03 ;;subtract - DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $34 ;;stk-data - DEFB $F0 ;;Exponent: $80, Bytes: 4 - DEFB $4C,$CC,$CC,$CD ;; - DEFB $03 ;;subtract - DEFB $37 ;;greater-0 - DEFB $00 ;;jump-true - DEFB $08 ;;to L373D, GRE.8 + DEFB #34 ;;stk-data + DEFB #38 ;;Exponent: #88, Bytes: 1 + DEFB #00 ;;(+00,+00,+00) + DEFB #03 ;;subtract + DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #34 ;;stk-data + DEFB #F0 ;;Exponent: #80, Bytes: 4 + DEFB #4C,#CC,#CC,#CD ;; + DEFB #03 ;;subtract + DEFB #37 ;;greater-0 + DEFB #00 ;;jump-true + DEFB #08 ;;to L373D, GRE.8 - DEFB $01 ;;exchange - DEFB $A1 ;;stk-one - DEFB $03 ;;subtract - DEFB $01 ;;exchange - DEFB $38 ;;end-calc + DEFB #01 ;;exchange + DEFB #A1 ;;stk-one + DEFB #03 ;;subtract + DEFB #01 ;;exchange + DEFB #38 ;;end-calc INC (HL) ; RST 28H ;; FP-CALC ;; GRE.8 -L373D: DEFB $01 ;;exchange - DEFB $34 ;;stk-data - DEFB $F0 ;;Exponent: $80, Bytes: 4 - DEFB $31,$72,$17,$F8 ;; - DEFB $04 ;;multiply - DEFB $01 ;;exchange - DEFB $A2 ;;stk-half - DEFB $03 ;;subtract - DEFB $A2 ;;stk-half - DEFB $03 ;;subtract - DEFB $31 ;;duplicate - DEFB $34 ;;stk-data - DEFB $32 ;;Exponent: $82, Bytes: 1 - DEFB $20 ;;(+00,+00,+00) - DEFB $04 ;;multiply - DEFB $A2 ;;stk-half - DEFB $03 ;;subtract - DEFB $8C ;;series-0C - DEFB $11 ;;Exponent: $61, Bytes: 1 - DEFB $AC ;;(+00,+00,+00) - DEFB $14 ;;Exponent: $64, Bytes: 1 - DEFB $09 ;;(+00,+00,+00) - DEFB $56 ;;Exponent: $66, Bytes: 2 - DEFB $DA,$A5 ;;(+00,+00) - DEFB $59 ;;Exponent: $69, Bytes: 2 - DEFB $30,$C5 ;;(+00,+00) - DEFB $5C ;;Exponent: $6C, Bytes: 2 - DEFB $90,$AA ;;(+00,+00) - DEFB $9E ;;Exponent: $6E, Bytes: 3 - DEFB $70,$6F,$61 ;;(+00) - DEFB $A1 ;;Exponent: $71, Bytes: 3 - DEFB $CB,$DA,$96 ;;(+00) - DEFB $A4 ;;Exponent: $74, Bytes: 3 - DEFB $31,$9F,$B4 ;;(+00) - DEFB $E7 ;;Exponent: $77, Bytes: 4 - DEFB $A0,$FE,$5C,$FC ;; - DEFB $EA ;;Exponent: $7A, Bytes: 4 - DEFB $1B,$43,$CA,$36 ;; - DEFB $ED ;;Exponent: $7D, Bytes: 4 - DEFB $A7,$9C,$7E,$5E ;; - DEFB $F0 ;;Exponent: $80, Bytes: 4 - DEFB $6E,$23,$80,$93 ;; - DEFB $04 ;;multiply - DEFB $0F ;;addition - DEFB $38 ;;end-calc +L373D: DEFB #01 ;;exchange + DEFB #34 ;;stk-data + DEFB #F0 ;;Exponent: #80, Bytes: 4 + DEFB #31,#72,#17,#F8 ;; + DEFB #04 ;;multiply + DEFB #01 ;;exchange + DEFB #A2 ;;stk-half + DEFB #03 ;;subtract + DEFB #A2 ;;stk-half + DEFB #03 ;;subtract + DEFB #31 ;;duplicate + DEFB #34 ;;stk-data + DEFB #32 ;;Exponent: #82, Bytes: 1 + DEFB #20 ;;(+00,+00,+00) + DEFB #04 ;;multiply + DEFB #A2 ;;stk-half + DEFB #03 ;;subtract + DEFB #8C ;;series-0C + DEFB #11 ;;Exponent: #61, Bytes: 1 + DEFB #AC ;;(+00,+00,+00) + DEFB #14 ;;Exponent: #64, Bytes: 1 + DEFB #09 ;;(+00,+00,+00) + DEFB #56 ;;Exponent: #66, Bytes: 2 + DEFB #DA,#A5 ;;(+00,+00) + DEFB #59 ;;Exponent: #69, Bytes: 2 + DEFB #30,#C5 ;;(+00,+00) + DEFB #5C ;;Exponent: #6C, Bytes: 2 + DEFB #90,#AA ;;(+00,+00) + DEFB #9E ;;Exponent: #6E, Bytes: 3 + DEFB #70,#6F,#61 ;;(+00) + DEFB #A1 ;;Exponent: #71, Bytes: 3 + DEFB #CB,#DA,#96 ;;(+00) + DEFB #A4 ;;Exponent: #74, Bytes: 3 + DEFB #31,#9F,#B4 ;;(+00) + DEFB #E7 ;;Exponent: #77, Bytes: 4 + DEFB #A0,#FE,#5C,#FC ;; + DEFB #EA ;;Exponent: #7A, Bytes: 4 + DEFB #1B,#43,#CA,#36 ;; + DEFB #ED ;;Exponent: #7D, Bytes: 4 + DEFB #A7,#9C,#7E,#5E ;; + DEFB #F0 ;;Exponent: #80, Bytes: 4 + DEFB #6E,#23,#80,#93 ;; + DEFB #04 ;;multiply + DEFB #0F ;;addition + DEFB #38 ;;end-calc RET ; return. @@ -17720,7 +17720,7 @@ L373D: DEFB $01 ;;exchange ;--------------------------------- ; THE 'REDUCE ARGUMENT' SUBROUTINE ;--------------------------------- -; (offset $39: 'get-argt') +; (offset #39: 'get-argt') ; ; This routine performs two functions on the angle, in radians, that forms ; the argument to the sine and cosine functions. @@ -17755,45 +17755,45 @@ L373D: DEFB $01 ;;exchange ;; get-argt L3783: RST 28H ;; FP-CALC X. - DEFB $3D ;;re-stack - DEFB $34 ;;stk-data - DEFB $EE ;;Exponent: $7E, + DEFB #3D ;;re-stack + DEFB #34 ;;stk-data + DEFB #EE ;;Exponent: #7E, ;;Bytes: 4 - DEFB $22,$F9,$83,$6E ;; X, 1/(2*PI) - DEFB $04 ;;multiply X/(2*PI) = fraction - DEFB $31 ;;duplicate - DEFB $A2 ;;stk-half - DEFB $0F ;;addition - DEFB $27 ;;int + DEFB #22,#F9,#83,#6E ;; X, 1/(2*PI) + DEFB #04 ;;multiply X/(2*PI) = fraction + DEFB #31 ;;duplicate + DEFB #A2 ;;stk-half + DEFB #0F ;;addition + DEFB #27 ;;int - DEFB $03 ;;subtract now range -.5 to .5 + DEFB #03 ;;subtract now range -.5 to .5 - DEFB $31 ;;duplicate - DEFB $0F ;;addition now range -1 to 1. - DEFB $31 ;;duplicate - DEFB $0F ;;addition now range -2 to +2. + DEFB #31 ;;duplicate + DEFB #0F ;;addition now range -1 to 1. + DEFB #31 ;;duplicate + DEFB #0F ;;addition now range -2 to +2. ; quadrant I (0 to +1) and quadrant IV (-1 to 0) are now correct. ; quadrant II ranges +1 to +2. ; quadrant III ranges -2 to -1. - DEFB $31 ;;duplicate Y, Y. - DEFB $2A ;;abs Y, abs(Y). range 1 to 2 - DEFB $A1 ;;stk-one Y, abs(Y), 1. - DEFB $03 ;;subtract Y, abs(Y)-1. range 0 to 1 - DEFB $31 ;;duplicate Y, Z, Z. - DEFB $37 ;;greater-0 Y, Z, (1/0). + DEFB #31 ;;duplicate Y, Y. + DEFB #2A ;;abs Y, abs(Y). range 1 to 2 + DEFB #A1 ;;stk-one Y, abs(Y), 1. + DEFB #03 ;;subtract Y, abs(Y)-1. range 0 to 1 + DEFB #31 ;;duplicate Y, Z, Z. + DEFB #37 ;;greater-0 Y, Z, (1/0). - DEFB $C0 ;;st-mem-0 store as possible sign + DEFB #C0 ;;st-mem-0 store as possible sign ;; for cosine function. - DEFB $00 ;;jump-true - DEFB $04 ;;to L37A1, ZPLUS with quadrants II and III. + DEFB #00 ;;jump-true + DEFB #04 ;;to L37A1, ZPLUS with quadrants II and III. ; else the angle lies in quadrant I or IV and value Y is already correct. - DEFB $02 ;;delete Y. delete the test value. - DEFB $38 ;;end-calc Y. + DEFB #02 ;;delete Y. delete the test value. + DEFB #38 ;;end-calc Y. RET ; return. with Q1 and Q4 >>> @@ -17803,20 +17803,20 @@ L3783: RST 28H ;; FP-CALC X. ; Y will hold -2 to -1 if this is quadrant III. ;; ZPLUS -L37A1: DEFB $A1 ;;stk-one Y, Z, 1. - DEFB $03 ;;subtract Y, Z-1. Q3 = 0 to -1 - DEFB $01 ;;exchange Z-1, Y. - DEFB $36 ;;less-0 Z-1, (1/0). - DEFB $00 ;;jump-true Z-1. - DEFB $02 ;;to L37A8, YNEG +L37A1: DEFB #A1 ;;stk-one Y, Z, 1. + DEFB #03 ;;subtract Y, Z-1. Q3 = 0 to -1 + DEFB #01 ;;exchange Z-1, Y. + DEFB #36 ;;less-0 Z-1, (1/0). + DEFB #00 ;;jump-true Z-1. + DEFB #02 ;;to L37A8, YNEG ;;if angle in quadrant III ; else angle is within quadrant II (-1 to 0) - DEFB $1B ;;negate range +1 to 0. + DEFB #1B ;;negate range +1 to 0. ;; YNEG -L37A8: DEFB $38 ;;end-calc quadrants II and III correct. +L37A8: DEFB #38 ;;end-calc quadrants II and III correct. RET ; return. @@ -17824,7 +17824,7 @@ L37A8: DEFB $38 ;;end-calc quadrants II and III correct. ;---------------------- ; THE 'COSINE' FUNCTION ;---------------------- -; (offset $20: 'cos') +; (offset #20: 'cos') ; Cosines are calculated as the sine of the opposite angle rectifying the ; sign depending on the quadrant rules. ; @@ -17850,27 +17850,27 @@ L37A8: DEFB $38 ;;end-calc quadrants II and III correct. ;; cos L37AA: RST 28H ;; FP-CALC angle in radians. - DEFB $39 ;;get-argt X reduce -1 to +1 + DEFB #39 ;;get-argt X reduce -1 to +1 - DEFB $2A ;;abs ABS X. 0 to 1 - DEFB $A1 ;;stk-one ABS X, 1. - DEFB $03 ;;subtract now opposite angle + DEFB #2A ;;abs ABS X. 0 to 1 + DEFB #A1 ;;stk-one ABS X, 1. + DEFB #03 ;;subtract now opposite angle ;; although sign is -ve. - DEFB $E0 ;;get-mem-0 fetch the sign indicator - DEFB $00 ;;jump-true - DEFB $06 ;;fwd to L37B7, C-ENT + DEFB #E0 ;;get-mem-0 fetch the sign indicator + DEFB #00 ;;jump-true + DEFB #06 ;;fwd to L37B7, C-ENT ;;forward to common code if in QII or QIII. - DEFB $1B ;;negate else make sign +ve. - DEFB $33 ;;jump - DEFB $03 ;;fwd to L37B7, C-ENT + DEFB #1B ;;negate else make sign +ve. + DEFB #33 ;;jump + DEFB #03 ;;fwd to L37B7, C-ENT ;; with quadrants I and IV. ;-------------------- ; THE 'SINE' FUNCTION ;-------------------- -; (offset $1F: 'sin') +; (offset #1F: 'sin') ; This is a fundamental transcendental function from which others such as cos ; and tan are directly, or indirectly, derived. ; It uses the series generator to produce Chebyshev polynomials. @@ -17889,39 +17889,39 @@ L37AA: RST 28H ;; FP-CALC angle in radians. ;; sin L37B5: RST 28H ;; FP-CALC angle in radians - DEFB $39 ;;get-argt reduce - sign now correct. + DEFB #39 ;;get-argt reduce - sign now correct. ;; C-ENT -L37B7: DEFB $31 ;;duplicate - DEFB $31 ;;duplicate - DEFB $04 ;;multiply - DEFB $31 ;;duplicate - DEFB $0F ;;addition - DEFB $A1 ;;stk-one - DEFB $03 ;;subtract +L37B7: DEFB #31 ;;duplicate + DEFB #31 ;;duplicate + DEFB #04 ;;multiply + DEFB #31 ;;duplicate + DEFB #0F ;;addition + DEFB #A1 ;;stk-one + DEFB #03 ;;subtract - DEFB $86 ;;series-06 - DEFB $14 ;;Exponent: $64, Bytes: 1 - DEFB $E6 ;;(+00,+00,+00) - DEFB $5C ;;Exponent: $6C, Bytes: 2 - DEFB $1F,$0B ;;(+00,+00) - DEFB $A3 ;;Exponent: $73, Bytes: 3 - DEFB $8F,$38,$EE ;;(+00) - DEFB $E9 ;;Exponent: $79, Bytes: 4 - DEFB $15,$63,$BB,$23 ;; - DEFB $EE ;;Exponent: $7E, Bytes: 4 - DEFB $92,$0D,$CD,$ED ;; - DEFB $F1 ;;Exponent: $81, Bytes: 4 - DEFB $23,$5D,$1B,$EA ;; - DEFB $04 ;;multiply - DEFB $38 ;;end-calc + DEFB #86 ;;series-06 + DEFB #14 ;;Exponent: #64, Bytes: 1 + DEFB #E6 ;;(+00,+00,+00) + DEFB #5C ;;Exponent: #6C, Bytes: 2 + DEFB #1F,#0B ;;(+00,+00) + DEFB #A3 ;;Exponent: #73, Bytes: 3 + DEFB #8F,#38,#EE ;;(+00) + DEFB #E9 ;;Exponent: #79, Bytes: 4 + DEFB #15,#63,#BB,#23 ;; + DEFB #EE ;;Exponent: #7E, Bytes: 4 + DEFB #92,#0D,#CD,#ED ;; + DEFB #F1 ;;Exponent: #81, Bytes: 4 + DEFB #23,#5D,#1B,#EA ;; + DEFB #04 ;;multiply + DEFB #38 ;;end-calc RET ; return. ;----------------------- ; THE 'TANGENT' FUNCTION ;----------------------- -; (offset $21: 'tan') +; (offset #21: 'tan') ; ; Evaluates tangent x as sin(x) / cos(x). ; @@ -17944,19 +17944,19 @@ L37B7: DEFB $31 ;;duplicate ;; tan L37DA: RST 28H ;; FP-CALC x. - DEFB $31 ;;duplicate x, x. - DEFB $1F ;;sin x, sin x. - DEFB $01 ;;exchange sin x, x. - DEFB $20 ;;cos sin x, cos x. - DEFB $05 ;;division sin x/cos x (= tan x). - DEFB $38 ;;end-calc tan x. + DEFB #31 ;;duplicate x, x. + DEFB #1F ;;sin x, sin x. + DEFB #01 ;;exchange sin x, x. + DEFB #20 ;;cos sin x, cos x. + DEFB #05 ;;division sin x/cos x (= tan x). + DEFB #38 ;;end-calc tan x. RET ; return. ;---------------------- ; THE 'ARCTAN' FUNCTION ;---------------------- -; (Offset $24: 'atn') +; (Offset #24: 'atn') ; the inverse tangent function with the result in radians. ; This is a fundamental transcendental function from which others such as asn ; and acs are directly, or indirectly, derived. @@ -17965,66 +17965,66 @@ L37DA: RST 28H ;; FP-CALC x. ;; atn L37E2: CALL L3297 ; routine re-stack LD A,(HL) ; fetch exponent byte. - CP $81 ; compare to that for 'one' + CP #81 ; compare to that for 'one' JR C,L37F8 ; forward, if less, to SMALL RST 28H ;; FP-CALC - DEFB $A1 ;;stk-one - DEFB $1B ;;negate - DEFB $01 ;;exchange - DEFB $05 ;;division - DEFB $31 ;;duplicate - DEFB $36 ;;less-0 - DEFB $A3 ;;stk-pi/2 - DEFB $01 ;;exchange - DEFB $00 ;;jump-true - DEFB $06 ;;to L37FA, CASES + DEFB #A1 ;;stk-one + DEFB #1B ;;negate + DEFB #01 ;;exchange + DEFB #05 ;;division + DEFB #31 ;;duplicate + DEFB #36 ;;less-0 + DEFB #A3 ;;stk-pi/2 + DEFB #01 ;;exchange + DEFB #00 ;;jump-true + DEFB #06 ;;to L37FA, CASES - DEFB $1B ;;negate - DEFB $33 ;;jump - DEFB $03 ;;to L37FA, CASES + DEFB #1B ;;negate + DEFB #33 ;;jump + DEFB #03 ;;to L37FA, CASES ;; SMALL L37F8: RST 28H ;; FP-CALC - DEFB $A0 ;;stk-zero + DEFB #A0 ;;stk-zero ;; CASES -L37FA: DEFB $01 ;;exchange - DEFB $31 ;;duplicate - DEFB $31 ;;duplicate - DEFB $04 ;;multiply - DEFB $31 ;;duplicate - DEFB $0F ;;addition - DEFB $A1 ;;stk-one - DEFB $03 ;;subtract - DEFB $8C ;;series-0C - DEFB $10 ;;Exponent: $60, Bytes: 1 - DEFB $B2 ;;(+00,+00,+00) - DEFB $13 ;;Exponent: $63, Bytes: 1 - DEFB $0E ;;(+00,+00,+00) - DEFB $55 ;;Exponent: $65, Bytes: 2 - DEFB $E4,$8D ;;(+00,+00) - DEFB $58 ;;Exponent: $68, Bytes: 2 - DEFB $39,$BC ;;(+00,+00) - DEFB $5B ;;Exponent: $6B, Bytes: 2 - DEFB $98,$FD ;;(+00,+00) - DEFB $9E ;;Exponent: $6E, Bytes: 3 - DEFB $00,$36,$75 ;;(+00) - DEFB $A0 ;;Exponent: $70, Bytes: 3 - DEFB $DB,$E8,$B4 ;;(+00) - DEFB $63 ;;Exponent: $73, Bytes: 2 - DEFB $42,$C4 ;;(+00,+00) - DEFB $E6 ;;Exponent: $76, Bytes: 4 - DEFB $B5,$09,$36,$BE ;; - DEFB $E9 ;;Exponent: $79, Bytes: 4 - DEFB $36,$73,$1B,$5D ;; - DEFB $EC ;;Exponent: $7C, Bytes: 4 - DEFB $D8,$DE,$63,$BE ;; - DEFB $F0 ;;Exponent: $80, Bytes: 4 - DEFB $61,$A1,$B3,$0C ;; - DEFB $04 ;;multiply - DEFB $0F ;;addition - DEFB $38 ;;end-calc +L37FA: DEFB #01 ;;exchange + DEFB #31 ;;duplicate + DEFB #31 ;;duplicate + DEFB #04 ;;multiply + DEFB #31 ;;duplicate + DEFB #0F ;;addition + DEFB #A1 ;;stk-one + DEFB #03 ;;subtract + DEFB #8C ;;series-0C + DEFB #10 ;;Exponent: #60, Bytes: 1 + DEFB #B2 ;;(+00,+00,+00) + DEFB #13 ;;Exponent: #63, Bytes: 1 + DEFB #0E ;;(+00,+00,+00) + DEFB #55 ;;Exponent: #65, Bytes: 2 + DEFB #E4,#8D ;;(+00,+00) + DEFB #58 ;;Exponent: #68, Bytes: 2 + DEFB #39,#BC ;;(+00,+00) + DEFB #5B ;;Exponent: #6B, Bytes: 2 + DEFB #98,#FD ;;(+00,+00) + DEFB #9E ;;Exponent: #6E, Bytes: 3 + DEFB #00,#36,#75 ;;(+00) + DEFB #A0 ;;Exponent: #70, Bytes: 3 + DEFB #DB,#E8,#B4 ;;(+00) + DEFB #63 ;;Exponent: #73, Bytes: 2 + DEFB #42,#C4 ;;(+00,+00) + DEFB #E6 ;;Exponent: #76, Bytes: 4 + DEFB #B5,#09,#36,#BE ;; + DEFB #E9 ;;Exponent: #79, Bytes: 4 + DEFB #36,#73,#1B,#5D ;; + DEFB #EC ;;Exponent: #7C, Bytes: 4 + DEFB #D8,#DE,#63,#BE ;; + DEFB #F0 ;;Exponent: #80, Bytes: 4 + DEFB #61,#A1,#B3,#0C ;; + DEFB #04 ;;multiply + DEFB #0F ;;addition + DEFB #38 ;;end-calc RET ; return. @@ -18032,7 +18032,7 @@ L37FA: DEFB $01 ;;exchange ;---------------------- ; THE 'ARCSIN' FUNCTION ;---------------------- -; (Offset $22: 'asn') +; (Offset #22: 'asn') ; the inverse sine function with result in radians. ; derived from arctan function above. ; Error A unless the argument is between -1 and +1 inclusive. @@ -18067,20 +18067,20 @@ L37FA: DEFB $01 ;;exchange ;; asn L3833: RST 28H ;; FP-CALC x. - DEFB $31 ;;duplicate x, x. - DEFB $31 ;;duplicate x, x, x. - DEFB $04 ;;multiply x, x*x. - DEFB $A1 ;;stk-one x, x*x, 1. - DEFB $03 ;;subtract x, x*x-1. - DEFB $1B ;;negate x, 1-x*x. - DEFB $28 ;;sqr x, sqr(1-x*x) = y - DEFB $A1 ;;stk-one x, y, 1. - DEFB $0F ;;addition x, y+1. - DEFB $05 ;;division x/y+1. - DEFB $24 ;;atn a/2 (half the angle) - DEFB $31 ;;duplicate a/2, a/2. - DEFB $0F ;;addition a. - DEFB $38 ;;end-calc a. + DEFB #31 ;;duplicate x, x. + DEFB #31 ;;duplicate x, x, x. + DEFB #04 ;;multiply x, x*x. + DEFB #A1 ;;stk-one x, x*x, 1. + DEFB #03 ;;subtract x, x*x-1. + DEFB #1B ;;negate x, 1-x*x. + DEFB #28 ;;sqr x, sqr(1-x*x) = y + DEFB #A1 ;;stk-one x, y, 1. + DEFB #0F ;;addition x, y+1. + DEFB #05 ;;division x/y+1. + DEFB #24 ;;atn a/2 (half the angle) + DEFB #31 ;;duplicate a/2, a/2. + DEFB #0F ;;addition a. + DEFB #38 ;;end-calc a. RET ; return. @@ -18088,7 +18088,7 @@ L3833: RST 28H ;; FP-CALC x. ;------------------------- ; THE 'ARCCOS' FUNCTION ;------------------------- -; (Offset $23: 'acs') +; (Offset #23: 'acs') ; the inverse cosine function with the result in radians. ; Error A unless the argument is between -1 and +1. ; Result in range 0 to pi. @@ -18115,11 +18115,11 @@ L3833: RST 28H ;; FP-CALC x. ;; acs L3843: RST 28H ;; FP-CALC x. - DEFB $22 ;;asn asn(x). - DEFB $A3 ;;stk-pi/2 asn(x), pi/2. - DEFB $03 ;;subtract asn(x) - pi/2. - DEFB $1B ;;negate pi/2 -asn(x) = acs(x). - DEFB $38 ;;end-calc acs(x). + DEFB #22 ;;asn asn(x). + DEFB #A3 ;;stk-pi/2 asn(x), pi/2. + DEFB #03 ;;subtract asn(x) - pi/2. + DEFB #1B ;;negate pi/2 -asn(x) = acs(x). + DEFB #38 ;;end-calc acs(x). RET ; return. @@ -18127,7 +18127,7 @@ L3843: RST 28H ;; FP-CALC x. ; -------------------------- ; THE 'SQUARE ROOT' FUNCTION ; -------------------------- -; (Offset $28: 'sqr') +; (Offset #28: 'sqr') ; This routine is remarkable only in its brevity - 7 bytes. ; It wasn't written here but in the ZX81 where the programmers had to squeeze ; a bulky operating sytem into an 8K ROM. It simply calculates @@ -18137,19 +18137,19 @@ L3843: RST 28H ;; FP-CALC x. ;; sqr L384A: RST 28H ;; FP-CALC - DEFB $31 ;;duplicate - DEFB $30 ;;not - DEFB $00 ;;jump-true - DEFB $1E ;;to L386C, LAST + DEFB #31 ;;duplicate + DEFB #30 ;;not + DEFB #00 ;;jump-true + DEFB #1E ;;to L386C, LAST - DEFB $A2 ;;stk-half - DEFB $38 ;;end-calc + DEFB #A2 ;;stk-half + DEFB #38 ;;end-calc ; ------------------------------ ; THE 'EXPONENTIATION' OPERATION ; ------------------------------ -; (Offset $06: 'to-power') +; (Offset #06: 'to-power') ; This raises the first number X to the power of the second number Y. ; As with the ZX80, ; 0 ^ 0 = 1. @@ -18159,17 +18159,17 @@ L384A: RST 28H ;; FP-CALC ;; to-power L3851: RST 28H ;; FP-CALC X, Y. - DEFB $01 ;;exchange Y, X. - DEFB $31 ;;duplicate Y, X, X. - DEFB $30 ;;not Y, X, (1/0). - DEFB $00 ;;jump-true - DEFB $07 ;;to L385D, XISO if X is zero. + DEFB #01 ;;exchange Y, X. + DEFB #31 ;;duplicate Y, X, X. + DEFB #30 ;;not Y, X, (1/0). + DEFB #00 ;;jump-true + DEFB #07 ;;to L385D, XISO if X is zero. ; else X is non-zero. Function 'ln' will catch a negative value of X. - DEFB $25 ;;ln Y, LN X. - DEFB $04 ;;multiply Y * LN X. - DEFB $38 ;;end-calc + DEFB #25 ;;ln Y, LN X. + DEFB #04 ;;multiply Y * LN X. + DEFB #38 ;;end-calc JP L36C4 ; jump back to EXP routine -> @@ -18179,35 +18179,35 @@ L3851: RST 28H ;; FP-CALC X, Y. ; begin by deleting the known zero to leave Y the power factor. ;; XISO -L385D: DEFB $02 ;;delete Y. - DEFB $31 ;;duplicate Y, Y. - DEFB $30 ;;not Y, (1/0). - DEFB $00 ;;jump-true - DEFB $09 ;;to L386A, ONE if Y is zero. +L385D: DEFB #02 ;;delete Y. + DEFB #31 ;;duplicate Y, Y. + DEFB #30 ;;not Y, (1/0). + DEFB #00 ;;jump-true + DEFB #09 ;;to L386A, ONE if Y is zero. - DEFB $A0 ;;stk-zero Y, 0. - DEFB $01 ;;exchange 0, Y. - DEFB $37 ;;greater-0 0, (1/0). - DEFB $00 ;;jump-true 0. - DEFB $06 ;;to L386C, LAST if Y was any positive + DEFB #A0 ;;stk-zero Y, 0. + DEFB #01 ;;exchange 0, Y. + DEFB #37 ;;greater-0 0, (1/0). + DEFB #00 ;;jump-true 0. + DEFB #06 ;;to L386C, LAST if Y was any positive ;; number. ; else force division by zero thereby raising an Arithmetic overflow error. ; There are some one and two-byte alternatives but perhaps the most formal ; might have been to use end-calc; rst 08; defb 05. - DEFB $A1 ;;stk-one 0, 1. - DEFB $01 ;;exchange 1, 0. - DEFB $05 ;;division 1/0 ouch! + DEFB #A1 ;;stk-one 0, 1. + DEFB #01 ;;exchange 1, 0. + DEFB #05 ;;division 1/0 ouch! ; --- ;; ONE -L386A: DEFB $02 ;;delete . - DEFB $A1 ;;stk-one 1. +L386A: DEFB #02 ;;delete . + DEFB #A1 ;;stk-one 1. ;; LAST -L386C: DEFB $38 ;;end-calc last value is 1 or 0. +L386C: DEFB #38 ;;end-calc last value is 1 or 0. RET ; return. Whew! @@ -18228,7 +18228,7 @@ L386C: DEFB $38 ;;end-calc last value is 1 or 0. ;; KEYS L386E: PUSH IX - BIT 4,(IY+$01) ; [FLAGS] Test if in 128K mode + BIT 4,(IY+#01) ; [FLAGS] Test if in 128K mode JR Z,L3879 ; Z=in 48K mode CALL L3A42 ; Attempt to scan the keypad @@ -18245,17 +18245,17 @@ L3879: CALL L02BF ; Scan the keyboard ; In this way the state of the other three outputs are maintained when the state of the LSB of L is changed and sent out to register 14 of the AY-3-8912. ;; READ_OUTPUTS -L387F: LD C,$FD ; FFFD = Address of the - LD D,$FF ; command register (register 7) - LD E,$BF ; BFFD = Address of the +L387F: LD C,#FD ; FFFD = Address of the + LD D,#FF ; command register (register 7) + LD E,#BF ; BFFD = Address of the LD B,D ; data register (register 14) - LD A,$07 + LD A,#07 OUT (C),A ; Select command register IN H,(C) ; Read its status - LD A,$0E + LD A,#0E OUT (C),A ; Select data register IN A,(C) ; Read its status - OR $F0 ; Mask off the input lines + OR #F0 ; Mask off the input lines LD L,A ; L=state of output lines at the RET ; keypad socket @@ -18266,7 +18266,7 @@ L387F: LD C,$FD ; FFFD = Address of the ;; SET_REG14 L3896: LD B,D - LD A,$0E + LD A,#0E OUT (C),A ; Select the data register LD B,E OUT (C),L ; Send L out to the data register @@ -18279,7 +18279,7 @@ L3896: LD B,D ;; GET_REG14 L389F: LD B,D - LD A,$0E + LD A,#0E OUT (C),A ; Select the data register IN A,(C) ; Read the input line RET @@ -18290,7 +18290,7 @@ L389F: LD B,D ;; RESET_LINE L38A7: LD A,L - AND $FE ; Reset bit 0 of L + AND #FE ; Reset bit 0 of L LD L,A JR L3896 ; Send out L to the data register @@ -18300,7 +18300,7 @@ L38A7: LD A,L ;; SET_LINE L38AD: LD A,L - OR $01 ; Set bit 0 of L + OR #01 ; Set bit 0 of L LD L,A JR L3896 ; Send out L to the data register @@ -18320,7 +18320,7 @@ L38B3: DJNZ L38B3 ;; DELAY2 L38B6: PUSH BC - LD B,$10 + LD B,#10 CALL L38B3 ; Inner delay of 135 T-States POP BC DJNZ L38B6 @@ -18336,7 +18336,7 @@ L38B6: PUSH BC L38C0: PUSH BC CALL L389F ; Read the state of the input line POP BC - AND $20 ; Test bit 5, the input line + AND #20 ; Test bit 5, the input line JR Z,L38CB ; Exit if input line found low DJNZ L38C0 ; Repeat until timeout expires @@ -18352,7 +18352,7 @@ L38CB: RET L38CC: PUSH BC CALL L389F ; Read the state of the input line POP BC - AND $20 ; Test bit 5, the input line + AND #20 ; Test bit 5, the input line JR NZ,L38D7 ; Exit if input line found low DJNZ L38CC ; Repeat until timeout expires @@ -18366,7 +18366,7 @@ L38D7: RET ;; READ_STATUS L38D8: CALL L387F ; Read the output lines - LD B,$01 ; Read in one bit + LD B,#01 ; Read in one bit JR L38E4 ; ---------------- @@ -18377,13 +18377,13 @@ L38D8: CALL L387F ; Read the output lines ;; READ_NIBBLE L38DF: CALL L387F ; Read the state of the output lines - LD B,$04 ; Read in four bits + LD B,#04 ; Read in four bits ;; READ_BIT L38E4: PUSH BC CALL L389F ; Read the input line from the keypad POP BC - AND $20 ; This line should initially be high + AND #20 ; This line should initially be high JR Z,L392D ; Z=read in a 0, there must be an error XOR A ; The bits read in will be stored in register A @@ -18393,17 +18393,17 @@ L38EE: PUSH BC ; Preserve the loop count and any bits PUSH AF ; read in so far CALL L38AD ; Set the output line high - LD B,$A3 ; Monitor for 17609 T-states for the + LD B,#A3 ; Monitor for 17609 T-states for the CALL L38C0 ; input line to go low JR NZ,L392B ; NZ=the line did not go low CALL L38A7 ; Set the output line low JR L3901 ; Insert a delay of 12 T-states -L38FF: DEFB $FF, $FF +L38FF: DEFB #FF, #FF ;; BL_CONTINUE -L3901: LD B,$2B ; Delay for 564 T-states +L3901: LD B,#2B ; Delay for 564 T-states CALL L38B3 CALL L389F ; Read in the bit value BIT 5,A @@ -18423,12 +18423,12 @@ L3914: RRA ; Shift the carry bit into bit 0 of A PUSH AF ; Save bits read in CALL L38AD ; Set the output line high - LD B,$26 ; Delay for 499 T-states + LD B,#26 ; Delay for 499 T-states CALL L38B3 CALL L38A7 ; Set the output line low - LD B,$23 ; Delay for 460 T-states + LD B,#23 ; Delay for 460 T-states CALL L38B3 POP AF ; Retrieve read in bits @@ -18451,7 +18451,7 @@ L392B: POP AF L392D: CALL L38AD ; Set the output line high XOR A ; Clear FLAGS nibble - LD ($5B88),A ; [FLAGS/ROW3] + LD (#5B88),A ; [FLAGS/ROW3] INC A ; Return zero flag reset SCF @@ -18476,60 +18476,60 @@ L392D: CALL L38AD ; Set the output line high ;; ATTEMPT_POLL L3938: CALL L387F ; Read the output line states - LD A,($5B88) ; [FLAGS/ROW3] Has communications already been - AND $80 ; established with the keypad? + LD A,(#5B88) ; [FLAGS/ROW3] Has communications already been + AND #80 ; established with the keypad? JR NZ,L3999 ; NZ=yes, so skip the poll CALL L389F ; Read the input line - AND $20 ; It should be high initially + AND #20 ; It should be high initially JR Z,L392D ; Z=error, input line found low - LD A,($5B88) ; [FLAGS/ROW3] Test if poll counter already zero thus + LD A,(#5B88) ; [FLAGS/ROW3] Test if poll counter already zero thus AND A ; indicating a previous comms error JR NZ,L395A ; NZ=ready to poll the keypad INC A ; Indicate comms not established - LD ($5B88),A ; [FLAGS/ROW3] - LD A,$4C ; Reset the poll counter - LD ($5B89),A ; [ROW2/ROW1] + LD (#5B88),A ; [FLAGS/ROW3] + LD A,#4C ; Reset the poll counter + LD (#5B89),A ; [ROW2/ROW1] JR L399C ; Exit the routine ;;POLL_KEYPAD -L395A: LD A,($5B89) ; [ROW2/ROW1] Decrement the poll counter +L395A: LD A,(#5B89) ; [ROW2/ROW1] Decrement the poll counter DEC A - LD ($5B89),A ; [ROW2/ROW1] + LD (#5B89),A ; [ROW2/ROW1] JR NZ,L399C ; Exit the routine if it is not yet zero ; The poll counter has reached zero so a poll of the keypad can now occur. XOR A - LD ($5B88),A ; [FLAGS/ROW3] Indicate that a poll can occur - LD ($5B89),A ; [ROW2/ROW1] - LD ($5B8A),A ; [ROW4/ROW5] Clear all the row nibble stores + LD (#5B88),A ; [FLAGS/ROW3] Indicate that a poll can occur + LD (#5B89),A ; [ROW2/ROW1] + LD (#5B8A),A ; [ROW4/ROW5] Clear all the row nibble stores CALL L38A7 ; Set the output line low - LD B,$21 ; Wait up to 3569 T-States for the + LD B,#21 ; Wait up to 3569 T-States for the CALL L38C0 ; input line to go low JR NZ,L392D ; NZ=line did not go low CALL L38AD ; Set the output line high - LD B,$24 ; Wait up to 3893 T-States for the + LD B,#24 ; Wait up to 3893 T-States for the CALL L38CC ; input line to go high JR Z,L392D ; NZ=line did not go high CALL L38A7 ; Set the output line low - LD B,$0F + LD B,#0F CALL L38B6 ; Delay for 4070 T-States CALL L38DF ; Read in a nibble of data JR NZ,L392D ; NZ=error occurred when reading in nibble SET 7,A ; Set bit 7 - AND $F0 ; Keep only the upper four bits + AND #F0 ; Keep only the upper four bits ; (Bit 6 will be set if poll successful) - LD ($5B88),A ; [FLAGS/ROW3] Store the flags nibble + LD (#5B88),A ; [FLAGS/ROW3] Store the flags nibble XOR A SRL A ; Exit: Zero flag set, Carry flag reset RET @@ -18553,15 +18553,15 @@ L399C: XOR A ; Poll counter not zero ;; KEYPAD_SCAN L39A0: CALL L3938 ; Try to poll the keypad - LD A,($5B88) ; [FLAGS/ROW3] Test the flags nibble + LD A,(#5B88) ; [FLAGS/ROW3] Test the flags nibble CPL - AND $C0 ; Bits 6 and 7 must be set in FLAGS + AND #C0 ; Bits 6 and 7 must be set in FLAGS RET NZ ; NZ=poll was not successful ; The poll was successful so now read in data for the five keypad rows. - LD IX,$5B8A ; [ROW4/ROW5] - LD B,$05 ; The five rows + LD IX,#5B8A ; [ROW4/ROW5] + LD B,#05 ; The five rows ;; KS_LOOP L39B0: PUSH BC ; Save counter @@ -18578,7 +18578,7 @@ L39B0: PUSH BC ; Save counter POP BC ; Fetch the nibble loop counter PUSH BC LD C,A ; Move the nibble read in to C - LD A,(IX+$00) ; Fetch the nibble store + LD A,(IX+#00) ; Fetch the nibble store BIT 0,B ; Test if an upper or lower nibble JR Z,L39D6 ; Z=upper nibble @@ -18586,15 +18586,15 @@ L39B0: PUSH BC ; Save counter SRL C SRL C SRL C - AND $F0 ; Mask off the lower nibble of the + AND #F0 ; Mask off the lower nibble of the JR L39D8 ; nibble store ;; KS_UPPER -L39D6: AND $0F ; Mask off the upper nibble of the nibble store +L39D6: AND #0F ; Mask off the upper nibble of the nibble store ;; KS_STORE L39D8: OR C ; Combine the existing and new - LD (IX+$00),A ; nibbles and store them + LD (IX+#00),A ; nibbles and store them ;; KS_NEXT L39DC: POP BC ; Retrieve the row counter @@ -18608,13 +18608,13 @@ L39E3: DJNZ L39B0 ; Repeat for the next keypad row ; All five rows have now been read so compose a unique code for the key pressed. - LD E,$80 ; Signal no key press found yet - LD IX,$5B88 ; [FLAGS/ROW3] - LD HL,$3A3F ; Point to the key mask data - LD B,$03 ; Scan three nibbles + LD E,#80 ; Signal no key press found yet + LD IX,#5B88 ; [FLAGS/ROW3] + LD HL,#3A3F ; Point to the key mask data + LD B,#03 ; Scan three nibbles ;; GEN_LOOP -L39F0: LD A,(IX+$00) ; Fetch a pair of nibbles +L39F0: LD A,(IX+#00) ; Fetch a pair of nibbles AND (HL) ; This will mask off the FLAGS nibble and the SHIFT/0 key JR Z,L3A17 ; Z=no key pressed in these nibbles @@ -18627,14 +18627,14 @@ L39F0: LD A,(IX+$00) ; Fetch a pair of nibbles LD A,B ; Move loop counter to A JR L3A01 ; A delay of 12 T-States -L39FF: DEFB $FF, $FF ; Unused locations +L39FF: DEFB #FF, #FF ; Unused locations ;; GEN_CONT L3A01: DEC A ; These lines of code generate base SLA A ; values of 7, 15 and 23 for the three SLA A ; nibble stores 5B88, 5B89 & 5B8A. SLA A - OR $07 + OR #07 LD B,A ; B=(loop counter-1)*8+7 POP AF ; Fetch the byte of key press data @@ -18661,7 +18661,7 @@ L3A17: INC IX ; Point to the next nibble store JR NZ,L3A27 ; NZ=no keys were pressed LD A,E ; Copy the key code - AND $FC ; Test for the '.' key (E=1) + AND #FC ; Test for the '.' key (E=1) JR Z,L3A27 ; Z='.' key pressed DEC E @@ -18670,22 +18670,22 @@ L3A17: INC IX ; Point to the next nibble store ; The E register now holds a unique key code value between 1 and 17. ;; GEN_POINT -L3A27: LD A,($5B8A) ; [ROW4/ROW5] Test if the SHIFT key was pressed - AND $08 +L3A27: LD A,(#5B8A) ; [ROW4/ROW5] Test if the SHIFT key was pressed + AND #08 JR Z,L3A34 ; Z=the SHIFT key was not pressed ; The SHIFT key was pressed or no key was pressed. LD A,E ; Fetch the key code - AND $7F ; Mask off 'no key pressed' bit - ADD A,$12 ; Add on a shift offset of 12 + AND #7F ; Mask off 'no key pressed' bit + ADD A,#12 ; Add on a shift offset of 12 LD E,A ; Add a base offset of 5A to all key codes. Note that no key press will result in a key code of DA. This is the only code with bit 7 set and so will be detected later. ;; GEN_NOSHIFT L3A34: LD A,E - ADD A,$5A ; Add a base offset of 5A + ADD A,#5A ; Add a base offset of 5A LD E,A ; Return key codes in range 5B - 7D XOR A RET ; Exit: Zero flag set, key found OK @@ -18706,7 +18706,7 @@ L3A3C: XOR A ; Exit: Zero flag reset indicating an ; ---------------- ;; KEY_MASKS -L3A3F: DEFB $0F, $FF, $F2 ; Key mask data +L3A3F: DEFB #0F, #FF, #F2 ; Key mask data ; --------------- ; READ THE KEYPAD @@ -18736,23 +18736,23 @@ L3A3F: DEFB $0F, $FF, $F2 ; Key mask data ; decrement the KSTATE system variable Call Counters. The keypad routine 'knows' of the existence of keyboard key codes but the reverse is not true. ;; KEYPAD -L3A42: LD E,$80 ; Signal no key pressed - LD A,($5C78) ; [FRAMES] - AND $01 ; Scan the keypad every other +L3A42: LD E,#80 ; Signal no key pressed + LD A,(#5C78) ; [FRAMES] + AND #01 ; Scan the keypad every other JR NZ,L3A4F ; interrupt CALL L39A0 RET NZ ; NZ=no valid key pressed ;; KP_CHECK -L3A4F: LD HL,$5C00 ; [KSTATE0] Test the first KSTATE variable +L3A4F: LD HL,#5C00 ; [KSTATE0] Test the first KSTATE variable ;; KP_LOOP L3A52: BIT 7,(HL) ; Is the set free? JR NZ,L3A62 ; NZ=yes LD A,(HL) ; Fetch the un-decoded key value - CP $5B ; Is it a keyboard code? + CP #5B ; Is it a keyboard code? JR C,L3A62 ; C=yes, so do not decrement counter INC HL @@ -18760,11 +18760,11 @@ L3A52: BIT 7,(HL) ; Is the set free? DEC HL JR NZ,L3A62 ; If the counter reaches zero, then ; signal the set is free - LD (HL),$FF + LD (HL),#FF ;; KP_CH_SET L3A62: LD A,L ; Jump back and test the second set if - LD HL,$5C04 ; [KSTATE4] not yet considered + LD HL,#5C04 ; [KSTATE4] not yet considered CP L JR NZ,L3A52 @@ -18772,12 +18772,12 @@ L3A62: LD A,L ; Jump back and test the second set if RET NZ ; return if invalid LD A,E ; Test if the key in the first set is being - LD HL,$5C00 ; [KSTATE0] repeated + LD HL,#5C00 ; [KSTATE0] repeated CP (HL) JR Z,L3A9E ; Jump if being repeated EX DE,HL ; Save the address of KSTATE0 - LD HL,$5C04 ; [KSTATE4] Test if the key in the second set is + LD HL,#5C04 ; [KSTATE4] Test if the key in the second set is CP (HL) ; being repeated JR Z,L3A9E ; Jump if being repeated @@ -18794,10 +18794,10 @@ L3A62: LD A,L ; Jump back and test the second set if L3A83: LD E,A ; Pass the key code to the E register LD (HL),A ; and to KSTATE0/4 INC HL - LD (HL),$0A ; Set the '10 Call Counter' to 10 + LD (HL),#0A ; Set the '10 Call Counter' to 10 INC HL - LD A,($5C09) ; [REPDEL] Fetch the initial repeat delay + LD A,(#5C09) ; [REPDEL] Fetch the initial repeat delay SRL A ; Divide delay by two LD (HL),A ; Store the repeat delay INC HL @@ -18809,8 +18809,8 @@ L3A83: LD E,A ; Pass the key code to the E register ;; KP_END L3A94: LD A,E - LD ($5C08),A ; [LAST_K] Store the key value in LAST_K - LD HL,$5C3B ; FLAGS + LD (#5C08),A ; [LAST_K] Store the key value in LAST_K + LD HL,#5C3B ; FLAGS SET 5,(HL) ; Signal a new key pressed RET @@ -18820,12 +18820,12 @@ L3A94: LD A,E ;; KP_REPEAT L3A9E: INC HL - LD (HL),$0A ; Reset the '10 Call Counter' to 10 + LD (HL),#0A ; Reset the '10 Call Counter' to 10 INC HL DEC (HL) ; Decrement the repeat delay RET NZ ; Return if not zero - LD A,($5C0A) ; [REPPER] The subsequent repeat delay is + LD A,(#5C0A) ; [REPPER] The subsequent repeat delay is SRL A ; divided by two and stored LD (HL),A INC HL @@ -18839,13 +18839,13 @@ L3A9E: INC HL ;; KP_TEST L3AAE: LD A,E - LD HL,$5B66 ; FLAGS3 Test if in BASIC or EDIT mode + LD HL,#5B66 ; FLAGS3 Test if in BASIC or EDIT mode BIT 0,(HL) JR Z,L3ABC ; Z=EDIT mode ; Test key codes when in BASIC/CALCULATOR mode - CP $6D ; Test for shifted keys + CP #6D ; Test for shifted keys JR NC,L3AD4 ; and signal an error if found ;; KPT_OK @@ -18855,18 +18855,18 @@ L3ABA: XOR A ; Signal valid key code ; Test key codes when in EDIT/MENU mode. ;; KPT_EDIT -L3ABC: CP $80 ; Test for no key press +L3ABC: CP #80 ; Test for no key press JR NC,L3AD4 ; NC=no key press - CP $6C ; Test for SHIFT on its own + CP #6C ; Test for SHIFT on its own JR NZ,L3ABA ; NZ=valid key code -L3AC4: DEFB $00, $00, $00 ; Delay for 64 T-States - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00 +L3AC4: DEFB #00, #00, #00 ; Delay for 64 T-States + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00 ;; KPT_INVALID L3AD4: XOR A ; Signal invalid key code @@ -18880,11 +18880,11 @@ L3AD4: XOR A ; Signal invalid key code ;; KP_DECODE L3AD7: PUSH HL ; Save the KSTATE pointer LD A,E - SUB $5B ; Reduce the key code range to - LD D,$00 ; 00 - 22 and transfer to DE + SUB #5B ; Reduce the key code range to + LD D,#00 ; 00 - 22 and transfer to DE LD E,A - LD HL,$5B66 ; FLAGS3 Test if in EDIT or BASIC mode + LD HL,#5B66 ; FLAGS3 Test if in EDIT or BASIC mode BIT 0,(HL) JR Z,L3AEA ; Z=EDIT/MENU mode @@ -18897,7 +18897,7 @@ L3AD7: PUSH HL ; Save the KSTATE pointer ;; KPD_EDIT L3AEA: LD HL,L3B25 ; Use Table 4 for unshifted key - CP $11 ; presses + CP #11 ; presses JR C,L3B0F ; Deal with shifted keys in EDIT/MENU mode. @@ -18906,24 +18906,24 @@ L3AEA: LD HL,L3B25 ; Use Table 4 for unshifted key ; it actually performs no function when editing a BASIC program. LD HL,L3B21 - CP $15 ; Test for SHIFT 1 + CP #15 ; Test for SHIFT 1 JR Z,L3B0F - CP $16 ; Test for SHIFT 2 + CP #16 ; Test for SHIFT 2 JR Z,L3B0F JR L3B01 ; Delay for 12 T-States -L3AFE: DEFB $00, $FF, $FF ; Unused locations +L3AFE: DEFB #00, #FF, #FF ; Unused locations ;; KPD_CONT -L3B01: CP $17 ; Test for SHIFT 3 +L3B01: CP #17 ; Test for SHIFT 3 JR Z,L3B0F ; Use Table 2 with SHIFT 4 (delete to beginning of word) and SHIFT 5 (delete to end of word). LD HL,L3B18 - CP $21 ; Test for SHIFT 4 and above + CP #21 ; Test for SHIFT 4 and above JR NC,L3B0F ;Use Table 1 for all other shifted key presses. @@ -18941,77 +18941,77 @@ L3B0F: ADD HL,DE ; Look up the key value ; -------------------------------- ;; KPD_TABLE1 -L3B13: DEFB $2E, $0D, $33 ; '.', ENTER, 3 - DEFB $32, $31 ; 2, 1 +L3B13: DEFB #2E, #0D, #33 ; '.', ENTER, 3 + DEFB #32, #31 ; 2, 1 ;; KPD_TABLE2 -L3B18: DEFB $29, $28, $2A ; ), (, * - DEFB $2F, $2D, $39 ; /, - , 9 - DEFB $38, $37, $2B ; 8, 7, + +L3B18: DEFB #29, #28, #2A ; ), (, * + DEFB #2F, #2D, #39 ; /, - , 9 + DEFB #38, #37, #2B ; 8, 7, + ;; KPD_TABLE3 -L3B21: DEFB $36, $35, $34 ; 6, 5, 4 - DEFB $30 ; 0 +L3B21: DEFB #36, #35, #34 ; 6, 5, 4 + DEFB #30 ; 0 ;; KPD_TABLE4 -L3B25: DEFB $A5, $0D, $A6 ; Bottom, ENTER, Top - DEFB $A7, $A8, $A9 ; End of line, Start of line, TOGGLE - DEFB $AA, $0B, $0C ; DEL right, Up, DEL - DEFB $07, $09, $0A ; CMND, Right, Down - DEFB $08, $AC, $AD ; Left, Down ten, Up ten - DEFB $AE, $AF ; End word, Beginning of word - DEFB $B0, $B1, $B2 ; DEL to end of line, DEL to start of line, SHIFT TOGGLE - DEFB $B3, $B4 ; DEL to end of word, DEL to beginning of word +L3B25: DEFB #A5, #0D, #A6 ; Bottom, ENTER, Top + DEFB #A7, #A8, #A9 ; End of line, Start of line, TOGGLE + DEFB #AA, #0B, #0C ; DEL right, Up, DEL + DEFB #07, #09, #0A ; CMND, Right, Down + DEFB #08, #AC, #AD ; Left, Down ten, Up ten + DEFB #AE, #AF ; End word, Beginning of word + DEFB #B0, #B1, #B2 ; DEL to end of line, DEL to start of line, SHIFT TOGGLE + DEFB #B3, #B4 ; DEL to end of word, DEL to beginning of word ; ----------------------------- ; PRINT NEW ERROR MESSAGE PATCH ; ----------------------------- -L3B3B: BIT 4,(IY+$01) ; FLAGS 3 - In 128K mode? +L3B3B: BIT 4,(IY+#01) ; FLAGS 3 - In 128K mode? JR NZ,L3B46 ; NZ=128K mode ; In 48K mode XOR A ; Replicate code from standard ROM that the patch over-wrote - LD DE,$1536 + LD DE,#1536 RET ; In 128K mode -L3B46: LD HL,$010F ; Vector table entry in Editor ROM -> JP $03A2 +L3B46: LD HL,#010F ; Vector table entry in Editor ROM -> JP #03A2 ; Return to Editor ROM at address in HL L3B49: EX (SP),HL ; Change the return address - JP $5B00 ; Page Editor ROM and return to the address on the stack + JP #5B00 ; Page Editor ROM and return to the address on the stack ; ------------------------------------- ; STATEMENT INTERPRETATION RETURN PATCH ; ------------------------------------- -L3B4D: BIT 4,(IY+$01) ; In 128K mode? +L3B4D: BIT 4,(IY+#01) ; In 128K mode? JR NZ,L3B58 ; NZ=128K mode ; In 48K mode - BIT 7,(IY+$0A) ; replicate code from standard ROM that the patch over-wrote + BIT 7,(IY+#0A) ; replicate code from standard ROM that the patch over-wrote RET ; In 128K mode -L3B58: LD HL,$0112 ; Handle in Editor ROM by jumping to Vector table entry in Editor ROM -> JP #182A +L3B58: LD HL,#0112 ; Handle in Editor ROM by jumping to Vector table entry in Editor ROM -> JP #182A JR L3B49 ; -------------------------- ; GO TO NEXT STATEMENT PATCH ; -------------------------- -L3B5D: BIT 4,(IY+$01) ; In 128K mode? +L3B5D: BIT 4,(IY+#01) ; In 128K mode? JR NZ,L3B67 ; NZ=128K mode ; In 48K mode RST 18H ; replicate code from standard ROM that the patch over-wrote - CP $0D + CP #0D RET ; In 128K mode -L3B67: LD HL,$0115 ; Handle in Editor ROM by jumping to Vector table entry in Editor ROM -> JP #18A8 +L3B67: LD HL,#0115 ; Handle in Editor ROM by jumping to Vector table entry in Editor ROM -> JP #18A8 JR L3B49 ; -------------------------------------- @@ -19020,7 +19020,7 @@ L3B67: LD HL,$0115 ; Handle in Editor ROM by jumping to Vector tabl ;; KEYSCAN2 L3B6C: CALL L028E ; KEYSCAN Scan the keyboard - LD C,$00 + LD C,#00 JR NZ,L3B80 ; NZ=multiple keys CALL L031E ; K_TEST @@ -19032,7 +19032,7 @@ L3B6C: CALL L028E ; KEYSCAN Scan the keyboard JP L2657 ; S_CONT Get string and continue scanning ;; KPI_SCAN -L3B80: BIT 4,(IY+$01) ; 128K mode? +L3B80: BIT 4,(IY+#01) ; 128K mode? JP Z,L2660 ; S_IK$_STK Z=no, stack keyboard code DI ; Disable interrupts whilst scanning @@ -19048,27 +19048,27 @@ L3B80: BIT 4,(IY+$01) ; 128K mode? JP L2657 ; S_CONT Get string and continue scanning ;; KPI_INVALID -L3B9A: LD C,$00 ; Signal no key, i.e. length=0 +L3B9A: LD C,#00 ; Signal no key, i.e. length=0 JP L2660 ; S_IK$_STK ; --------------------- ; PRINT TOKEN/UDG PATCH ; --------------------- -L3B9F: CP $A3 ; SPECTRUM (T) +L3B9F: CP #A3 ; SPECTRUM (T) JR Z,L3BAF - CP $A4 ; PLAY (U) + CP #A4 ; PLAY (U) JR Z,L3BAF ; In 48K mode here -L3BA7: SUB $A5 ; Check as per original ROM - JP NC,$0B5F +L3BA7: SUB #A5 ; Check as per original ROM + JP NC,#0B5F - JP $0B56 ; Rejoin original ROM routine + JP #0B56 ; Rejoin original ROM routine -L3BAF: BIT 4,(IY+$01) ; FLAGS3 - Bit 4=1 if in 128K mode +L3BAF: BIT 4,(IY+#01) ; FLAGS3 - Bit 4=1 if in 128K mode JR Z,L3BA7 ; Rejoin code for when in 48K mode ; In 128K mode here @@ -19076,14 +19076,14 @@ L3BAF: BIT 4,(IY+$01) ; FLAGS3 - Bit 4=1 if in 128K mode LD DE,L3BC9 PUSH DE ; Stack return address - SUB $A3 ; Check whether the SPECTRUM token + SUB #A3 ; Check whether the SPECTRUM token LD DE,L3BD2 ; SPECTRUM token JR Z,L3BC3 LD DE,L3BDA ; PLAY token -L3BC3: LD A,$04 ; Signal not RND, INKEY$ or PI so that a trailing space is printed +L3BC3: LD A,#04 ; Signal not RND, INKEY$ or PI so that a trailing space is printed PUSH AF JP L0C17 ; Rejoin printing routine PO-TABLE+3 @@ -19091,10 +19091,10 @@ L3BC3: LD A,$04 ; Signal not RND, INKEY$ or PI so that a trailin L3BC9: SCF ; Return as if no trailing space - BIT 1,(IY+$01) ; Test if printer is in use + BIT 1,(IY+#01) ; Test if printer is in use RET NZ ; NZ=printer in use - JP $0B03 ; PO-FETCH - Return via Position Fetch routine + JP #0B03 ; PO-FETCH - Return via Position Fetch routine L3BD2: DC "SPECTRUM" ; SPECTRUM token L3BDA: DC "PLAY" ; PLAY token @@ -19102,17 +19102,17 @@ L3BDA: DC "PLAY" ; PLAY token ;; KP_SCAN2 L3BDE: JP L3C01 ; This is not called from either ROM. It can be used to scan the keypad. -L3BE1: DEFB $00, $00, $00 ; Unused locations - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $00, $00, $00 - DEFB $FF, $FF +L3BE1: DEFB #00, #00, #00 ; Unused locations + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #00, #00, #00 + DEFB #FF, #FF ;; KP_SCAN L3C01: JP L39A0 ; This was to be called via the vector table in the EDITOR ROM but due to a programming error it never gets called. @@ -19135,26 +19135,26 @@ L3C0D: JP L3C10 ; shown the year '1986' in varying ink colours. This leads to a display that shows all possible ink colours on all possible paper colours. ;; TV_TUNER -L3C10: LD A,$7F ; Test for the BREAK key - IN A,($FE) +L3C10: LD A,#7F ; Test for the BREAK key + IN A,(#FE) RRA RET C ; C=SPACE not pressed - LD A,$FE - IN A,($FE) + LD A,#FE + IN A,(#FE) RRA RET C ; C=SPACE not pressed - LD A,$07 - OUT ($FE),A ; Set the border to white + LD A,#07 + OUT (#FE),A ; Set the border to white - LD A,$02 ; Open channel 2 (main screen) - CALL $1601 + LD A,#02 ; Open channel 2 (main screen) + CALL #1601 XOR A - LD ($5C3C),A ; [TV_FLAG] Signal using main screen + LD (#5C3C),A ; [TV_FLAG] Signal using main screen - LD A,$16 ; Print character 'AT' + LD A,#16 ; Print character 'AT' RST 10H XOR A ; Print character '0' @@ -19163,7 +19163,7 @@ L3C10: LD A,$7F ; Test for the BREAK key XOR A ; Print character '0' RST 10H - LD E,$08 ; Number of characters per colour + LD E,#08 ; Number of characters per colour LD B,E ; Paper counter + 1 LD D,B ; Ink counter + 1 @@ -19175,7 +19175,7 @@ L3C34: LD A,B ; Calculate the paper colour RL A ADD A,D ; Add the ink colour DEC A - LD ($5C8F),A ; [ATTR_T] Store as temporary attribute value + LD (#5C8F),A ; [ATTR_T] Store as temporary attribute value LD HL,L3C8F ; TVT_DATA Point to the 'year' data LD C,E ; Get number of characters to print @@ -19193,18 +19193,18 @@ L3C45: LD A,(HL) ; Fetch a character from the data DEC D ; Next ink colour JR NZ,L3C34 ; Produce next row with new ink colour - LD HL,$4800 ; Point to 2nd third of display file + LD HL,#4800 ; Point to 2nd third of display file LD D,H LD E,L INC DE ; Point to the next display cell XOR A LD (HL),A ; Clear first display cell - LD BC,$0FFF + LD BC,#0FFF LDIR ; Clear lower 2 thirds of display file EX DE,HL ; HL points to start of attributes file - LD DE,$5900 ; Point to 2nd third of attributes file - LD BC,$0200 + LD DE,#5900 ; Point to 2nd third of attributes file + LD BC,#0200 LDIR ; Copy screen attributes ; Now that the display has been constructed, produce a continuous cycle of a 440 Hz tone for 1 second followed by a period of silence for 1 second (actually 962ms). @@ -19212,11 +19212,11 @@ L3C45: LD A,(HL) ; Fetch a character from the data DI ; Disable interrupts so that a pure tone can be generated ;; TVT_TONE -L3C68: LD DE,$0370 ; DE=twice the tone frequency in Hz - LD L,$07 ; Border colour of white +L3C68: LD DE,#0370 ; DE=twice the tone frequency in Hz + LD L,#07 ; Border colour of white ;; TVT_DURATION -L3C6D: LD BC,$0099 ; Delay for 950.4us +L3C6D: LD BC,#0099 ; Delay for 950.4us ;; TVT_PERIOD L3C70: DEC BC @@ -19225,9 +19225,9 @@ L3C70: DEC BC JR NZ,L3C70 LD A,L - XOR $10 ; Toggle the speaker output whilst + XOR #10 ; Toggle the speaker output whilst LD L,A ; preserving the border colour - OUT ($FE),A + OUT (#FE),A DEC DE ; Generate the tone for 1 second LD A,D @@ -19236,7 +19236,7 @@ L3C70: DEC BC ; At this point the speaker is turned off, so delay for 1 second. - LD BC,$0000 ; Delay for 480.4us + LD BC,#0000 ; Delay for 480.4us ;; TVT_DELAY1 L3C83: DEC BC @@ -19253,10 +19253,10 @@ L3C88: DEC BC ; Delay for 480.4us JR L3C68 ; Repeat the tone cycle ;; TVT_DATA -L3C8F: DEFB $13, $00 ; Bright, off - DEFB $31, $39 ; '1', '9' - DEFB $13, $01 ; Bright, on - DEFB $38, $36 ; '8', '6' +L3C8F: DEFB #13, #00 ; Bright, off + DEFB #31, #39 ; '1', '9' + DEFB #13, #01 ; Bright, on + DEFB #38, #36 ; '8', '6' L3C97: ; ------ ; UNUSED @@ -19295,7 +19295,7 @@ JMP_EX: PUSH HL RET ; возврат ;< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <; - BLOCK $3D00-$,00 ;15616 + BLOCK #3D00-$,00 ;15616 ; ------------------------------- ; THE 'ZX SPECTRUM CHARACTER SET' @@ -19303,7 +19303,7 @@ JMP_EX: PUSH HL ;; font ;; char-set -; $20 - Character: ' ' CHR$(32) +; #20 - Character: ' ' CHR$(32) L3D00: DEFB %00000000 DEFB %00000000 @@ -19314,7 +19314,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $21 - Character: '!' CHR$(33) +; #21 - Character: '!' CHR$(33) DEFB %00000000 DEFB %00010000 @@ -19325,7 +19325,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $22 - Character: '"' CHR$(34) +; #22 - Character: '"' CHR$(34) DEFB %00000000 DEFB %00100100 @@ -19336,7 +19336,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $23 - Character: '#' CHR$(35) +; #23 - Character: '#' CHR$(35) DEFB %00000000 DEFB %00100100 @@ -19347,7 +19347,7 @@ L3D00: DEFB %00000000 DEFB %00100100 DEFB %00000000 -; $24 - Character: '$' CHR$(36) +; #24 - Character: '$' CHR$(36) DEFB %00000000 DEFB %00001000 @@ -19358,7 +19358,7 @@ L3D00: DEFB %00000000 DEFB %00111110 DEFB %00001000 -; $25 - Character: '%' CHR$(37) +; #25 - Character: '%' CHR$(37) DEFB %00000000 DEFB %01100010 @@ -19369,7 +19369,7 @@ L3D00: DEFB %00000000 DEFB %01000110 DEFB %00000000 -; $26 - Character: '&' CHR$(38) +; #26 - Character: '&' CHR$(38) DEFB %00000000 DEFB %00010000 @@ -19380,7 +19380,7 @@ L3D00: DEFB %00000000 DEFB %00111010 DEFB %00000000 -; $27 - Character: ''' CHR$(39) +; #27 - Character: ''' CHR$(39) DEFB %00000000 DEFB %00001000 @@ -19391,7 +19391,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $28 - Character: '(' CHR$(40) +; #28 - Character: '(' CHR$(40) DEFB %00000000 DEFB %00000100 @@ -19402,7 +19402,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00000000 -; $29 - Character: ')' CHR$(41) +; #29 - Character: ')' CHR$(41) DEFB %00000000 DEFB %00100000 @@ -19413,7 +19413,7 @@ L3D00: DEFB %00000000 DEFB %00100000 DEFB %00000000 -; $2A - Character: '*' CHR$(42) +; #2A - Character: '*' CHR$(42) DEFB %00000000 DEFB %00000000 @@ -19424,7 +19424,7 @@ L3D00: DEFB %00000000 DEFB %00010100 DEFB %00000000 -; $2B - Character: '+' CHR$(43) +; #2B - Character: '+' CHR$(43) DEFB %00000000 DEFB %00000000 @@ -19435,7 +19435,7 @@ L3D00: DEFB %00000000 DEFB %00001000 DEFB %00000000 -; $2C - Character: ',' CHR$(44) +; #2C - Character: ',' CHR$(44) DEFB %00000000 DEFB %00000000 @@ -19446,7 +19446,7 @@ L3D00: DEFB %00000000 DEFB %00001000 DEFB %00010000 -; $2D - Character: '-' CHR$(45) +; #2D - Character: '-' CHR$(45) DEFB %00000000 DEFB %00000000 @@ -19457,7 +19457,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $2E - Character: '.' CHR$(46) +; #2E - Character: '.' CHR$(46) DEFB %00000000 DEFB %00000000 @@ -19468,7 +19468,7 @@ L3D00: DEFB %00000000 DEFB %00011000 DEFB %00000000 -; $2F - Character: '/' CHR$(47) +; #2F - Character: '/' CHR$(47) DEFB %00000000 DEFB %00000000 @@ -19479,7 +19479,7 @@ L3D00: DEFB %00000000 DEFB %00100000 DEFB %00000000 -; $30 - Character: '0' CHR$(48) +; #30 - Character: '0' CHR$(48) DEFB %00000000 DEFB %00111100 @@ -19490,7 +19490,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $31 - Character: '1' CHR$(49) +; #31 - Character: '1' CHR$(49) DEFB %00000000 DEFB %00011000 @@ -19501,7 +19501,7 @@ L3D00: DEFB %00000000 DEFB %00111110 DEFB %00000000 -; $32 - Character: '2' CHR$(50) +; #32 - Character: '2' CHR$(50) DEFB %00000000 DEFB %00111100 @@ -19512,7 +19512,7 @@ L3D00: DEFB %00000000 DEFB %01111110 DEFB %00000000 -; $33 - Character: '3' CHR$(51) +; #33 - Character: '3' CHR$(51) DEFB %00000000 DEFB %00111100 @@ -19523,7 +19523,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $34 - Character: '4' CHR$(52) +; #34 - Character: '4' CHR$(52) DEFB %00000000 DEFB %00001000 @@ -19534,7 +19534,7 @@ L3D00: DEFB %00000000 DEFB %00001000 DEFB %00000000 -; $35 - Character: '5' CHR$(53) +; #35 - Character: '5' CHR$(53) DEFB %00000000 DEFB %01111110 @@ -19545,7 +19545,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $36 - Character: '6' CHR$(54) +; #36 - Character: '6' CHR$(54) DEFB %00000000 DEFB %00111100 @@ -19556,7 +19556,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $37 - Character: '7' CHR$(55) +; #37 - Character: '7' CHR$(55) DEFB %00000000 DEFB %01111110 @@ -19567,7 +19567,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $38 - Character: '8' CHR$(56) +; #38 - Character: '8' CHR$(56) DEFB %00000000 DEFB %00111100 @@ -19578,7 +19578,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $39 - Character: '9' CHR$(57) +; #39 - Character: '9' CHR$(57) DEFB %00000000 DEFB %00111100 @@ -19589,7 +19589,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $3A - Character: ':' CHR$(58) +; #3A - Character: ':' CHR$(58) DEFB %00000000 DEFB %00000000 @@ -19600,7 +19600,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $3B - Character: ';' CHR$(59) +; #3B - Character: ';' CHR$(59) DEFB %00000000 DEFB %00000000 @@ -19611,7 +19611,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00100000 -; $3C - Character: '<' CHR$(60) +; #3C - Character: '<' CHR$(60) DEFB %00000000 DEFB %00000000 @@ -19622,7 +19622,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00000000 -; $3D - Character: '=' CHR$(61) +; #3D - Character: '=' CHR$(61) DEFB %00000000 DEFB %00000000 @@ -19633,7 +19633,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $3E - Character: '>' CHR$(62) +; #3E - Character: '>' CHR$(62) DEFB %00000000 DEFB %00000000 @@ -19644,7 +19644,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $3F - Character: '?' CHR$(63) +; #3F - Character: '?' CHR$(63) DEFB %00000000 DEFB %00111100 @@ -19655,7 +19655,7 @@ L3D00: DEFB %00000000 DEFB %00001000 DEFB %00000000 -; $40 - Character: '@' CHR$(64) +; #40 - Character: '@' CHR$(64) DEFB %00000000 DEFB %00111100 @@ -19666,7 +19666,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $41 - Character: 'A' CHR$(65) +; #41 - Character: 'A' CHR$(65) DEFB %00000000 DEFB %00111100 @@ -19677,7 +19677,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $42 - Character: 'B' CHR$(66) +; #42 - Character: 'B' CHR$(66) DEFB %00000000 DEFB %01111100 @@ -19688,7 +19688,7 @@ L3D00: DEFB %00000000 DEFB %01111100 DEFB %00000000 -; $43 - Character: 'C' CHR$(67) +; #43 - Character: 'C' CHR$(67) DEFB %00000000 DEFB %00111100 @@ -19699,7 +19699,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $44 - Character: 'D' CHR$(68) +; #44 - Character: 'D' CHR$(68) DEFB %00000000 DEFB %01111000 @@ -19710,7 +19710,7 @@ L3D00: DEFB %00000000 DEFB %01111000 DEFB %00000000 -; $45 - Character: 'E' CHR$(69) +; #45 - Character: 'E' CHR$(69) DEFB %00000000 DEFB %01111110 @@ -19721,7 +19721,7 @@ L3D00: DEFB %00000000 DEFB %01111110 DEFB %00000000 -; $46 - Character: 'F' CHR$(70) +; #46 - Character: 'F' CHR$(70) DEFB %00000000 DEFB %01111110 @@ -19732,7 +19732,7 @@ L3D00: DEFB %00000000 DEFB %01000000 DEFB %00000000 -; $47 - Character: 'G' CHR$(71) +; #47 - Character: 'G' CHR$(71) DEFB %00000000 DEFB %00111100 @@ -19743,7 +19743,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $48 - Character: 'H' CHR$(72) +; #48 - Character: 'H' CHR$(72) DEFB %00000000 DEFB %01000010 @@ -19754,7 +19754,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $49 - Character: 'I' CHR$(73) +; #49 - Character: 'I' CHR$(73) DEFB %00000000 DEFB %00111110 @@ -19765,7 +19765,7 @@ L3D00: DEFB %00000000 DEFB %00111110 DEFB %00000000 -; $4A - Character: 'J' CHR$(74) +; #4A - Character: 'J' CHR$(74) DEFB %00000000 DEFB %00000010 @@ -19776,7 +19776,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $4B - Character: 'K' CHR$(75) +; #4B - Character: 'K' CHR$(75) DEFB %00000000 DEFB %01000100 @@ -19787,7 +19787,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $4C - Character: 'L' CHR$(76) +; #4C - Character: 'L' CHR$(76) DEFB %00000000 DEFB %01000000 @@ -19798,7 +19798,7 @@ L3D00: DEFB %00000000 DEFB %01111110 DEFB %00000000 -; $4D - Character: 'M' CHR$(77) +; #4D - Character: 'M' CHR$(77) DEFB %00000000 DEFB %01000010 @@ -19809,7 +19809,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $4E - Character: 'N' CHR$(78) +; #4E - Character: 'N' CHR$(78) DEFB %00000000 DEFB %01000010 @@ -19820,7 +19820,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $4F - Character: 'O' CHR$(79) +; #4F - Character: 'O' CHR$(79) DEFB %00000000 DEFB %00111100 @@ -19831,7 +19831,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $50 - Character: 'P' CHR$(80) +; #50 - Character: 'P' CHR$(80) DEFB %00000000 DEFB %01111100 @@ -19842,7 +19842,7 @@ L3D00: DEFB %00000000 DEFB %01000000 DEFB %00000000 -; $51 - Character: 'Q' CHR$(81) +; #51 - Character: 'Q' CHR$(81) DEFB %00000000 DEFB %00111100 @@ -19853,7 +19853,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $52 - Character: 'R' CHR$(82) +; #52 - Character: 'R' CHR$(82) DEFB %00000000 DEFB %01111100 @@ -19864,7 +19864,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $53 - Character: 'S' CHR$(83) +; #53 - Character: 'S' CHR$(83) DEFB %00000000 DEFB %00111100 @@ -19875,7 +19875,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $54 - Character: 'T' CHR$(84) +; #54 - Character: 'T' CHR$(84) DEFB %00000000 DEFB %11111110 @@ -19886,7 +19886,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $55 - Character: 'U' CHR$(85) +; #55 - Character: 'U' CHR$(85) DEFB %00000000 DEFB %01000010 @@ -19897,7 +19897,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $56 - Character: 'V' CHR$(86) +; #56 - Character: 'V' CHR$(86) DEFB %00000000 DEFB %01000010 @@ -19908,7 +19908,7 @@ L3D00: DEFB %00000000 DEFB %00011000 DEFB %00000000 -; $57 - Character: 'W' CHR$(87) +; #57 - Character: 'W' CHR$(87) DEFB %00000000 DEFB %01000010 @@ -19919,7 +19919,7 @@ L3D00: DEFB %00000000 DEFB %00100100 DEFB %00000000 -; $58 - Character: 'X' CHR$(88) +; #58 - Character: 'X' CHR$(88) DEFB %00000000 DEFB %01000010 @@ -19930,7 +19930,7 @@ L3D00: DEFB %00000000 DEFB %01000010 DEFB %00000000 -; $59 - Character: 'Y' CHR$(89) +; #59 - Character: 'Y' CHR$(89) DEFB %00000000 DEFB %10000010 @@ -19941,7 +19941,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $5A - Character: 'Z' CHR$(90) +; #5A - Character: 'Z' CHR$(90) DEFB %00000000 DEFB %01111110 @@ -19952,7 +19952,7 @@ L3D00: DEFB %00000000 DEFB %01111110 DEFB %00000000 -; $5B - Character: '[' CHR$(91) +; #5B - Character: '[' CHR$(91) DEFB %00000000 DEFB %00001110 @@ -19963,7 +19963,7 @@ L3D00: DEFB %00000000 DEFB %00001110 DEFB %00000000 -; $5C - Character: '\' CHR$(92) +; #5C - Character: '\' CHR$(92) DEFB %00000000 DEFB %00000000 @@ -19974,7 +19974,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00000000 -; $5D - Character: ']' CHR$(93) +; #5D - Character: ']' CHR$(93) DEFB %00000000 DEFB %01110000 @@ -19985,7 +19985,7 @@ L3D00: DEFB %00000000 DEFB %01110000 DEFB %00000000 -; $5E - Character: '^' CHR$(94) +; #5E - Character: '^' CHR$(94) DEFB %00000000 DEFB %00010000 @@ -19996,7 +19996,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $5F - Character: '_' CHR$(95) +; #5F - Character: '_' CHR$(95) DEFB %00000000 DEFB %00000000 @@ -20007,7 +20007,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %11111111 -; $60 - Character: 'ukp' CHR$(96) +; #60 - Character: 'ukp' CHR$(96) DEFB %00000000 DEFB %00011100 @@ -20018,7 +20018,7 @@ L3D00: DEFB %00000000 DEFB %01111110 DEFB %00000000 -; $61 - Character: 'a' CHR$(97) +; #61 - Character: 'a' CHR$(97) DEFB %00000000 DEFB %00000000 @@ -20029,7 +20029,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $62 - Character: 'b' CHR$(98) +; #62 - Character: 'b' CHR$(98) DEFB %00000000 DEFB %00100000 @@ -20040,7 +20040,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $63 - Character: 'c' CHR$(99) +; #63 - Character: 'c' CHR$(99) DEFB %00000000 DEFB %00000000 @@ -20051,7 +20051,7 @@ L3D00: DEFB %00000000 DEFB %00011100 DEFB %00000000 -; $64 - Character: 'd' CHR$(100) +; #64 - Character: 'd' CHR$(100) DEFB %00000000 DEFB %00000100 @@ -20062,7 +20062,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $65 - Character: 'e' CHR$(101) +; #65 - Character: 'e' CHR$(101) DEFB %00000000 DEFB %00000000 @@ -20073,7 +20073,7 @@ L3D00: DEFB %00000000 DEFB %00111100 DEFB %00000000 -; $66 - Character: 'f' CHR$(102) +; #66 - Character: 'f' CHR$(102) DEFB %00000000 DEFB %00001100 @@ -20084,7 +20084,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $67 - Character: 'g' CHR$(103) +; #67 - Character: 'g' CHR$(103) DEFB %00000000 DEFB %00000000 @@ -20095,7 +20095,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00111000 -; $68 - Character: 'h' CHR$(104) +; #68 - Character: 'h' CHR$(104) DEFB %00000000 DEFB %01000000 @@ -20106,7 +20106,7 @@ L3D00: DEFB %00000000 DEFB %01000100 DEFB %00000000 -; $69 - Character: 'i' CHR$(105) +; #69 - Character: 'i' CHR$(105) DEFB %00000000 DEFB %00010000 @@ -20117,7 +20117,7 @@ L3D00: DEFB %00000000 DEFB %00111000 DEFB %00000000 -; $6A - Character: 'j' CHR$(106) +; #6A - Character: 'j' CHR$(106) DEFB %00000000 DEFB %00000100 @@ -20128,7 +20128,7 @@ L3D00: DEFB %00000000 DEFB %00100100 DEFB %00011000 -; $6B - Character: 'k' CHR$(107) +; #6B - Character: 'k' CHR$(107) DEFB %00000000 DEFB %00100000 @@ -20139,7 +20139,7 @@ L3D00: DEFB %00000000 DEFB %00100100 DEFB %00000000 -; $6C - Character: 'l' CHR$(108) +; #6C - Character: 'l' CHR$(108) DEFB %00000000 DEFB %00010000 @@ -20150,7 +20150,7 @@ L3D00: DEFB %00000000 DEFB %00001100 DEFB %00000000 -; $6D - Character: 'm' CHR$(109) +; #6D - Character: 'm' CHR$(109) DEFB %00000000 DEFB %00000000 @@ -20161,7 +20161,7 @@ L3D00: DEFB %00000000 DEFB %01010100 DEFB %00000000 -; $6E - Character: 'n' CHR$(110) +; #6E - Character: 'n' CHR$(110) DEFB %00000000 DEFB %00000000 @@ -20172,7 +20172,7 @@ L3D00: DEFB %00000000 DEFB %01000100 DEFB %00000000 -; $6F - Character: 'o' CHR$(111) +; #6F - Character: 'o' CHR$(111) DEFB %00000000 DEFB %00000000 @@ -20183,7 +20183,7 @@ L3D00: DEFB %00000000 DEFB %00111000 DEFB %00000000 -; $70 - Character: 'p' CHR$(112) +; #70 - Character: 'p' CHR$(112) DEFB %00000000 DEFB %00000000 @@ -20194,7 +20194,7 @@ L3D00: DEFB %00000000 DEFB %01000000 DEFB %01000000 -; $71 - Character: 'q' CHR$(113) +; #71 - Character: 'q' CHR$(113) DEFB %00000000 DEFB %00000000 @@ -20205,7 +20205,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00000110 -; $72 - Character: 'r' CHR$(114) +; #72 - Character: 'r' CHR$(114) DEFB %00000000 DEFB %00000000 @@ -20216,7 +20216,7 @@ L3D00: DEFB %00000000 DEFB %00100000 DEFB %00000000 -; $73 - Character: 's' CHR$(115) +; #73 - Character: 's' CHR$(115) DEFB %00000000 DEFB %00000000 @@ -20227,7 +20227,7 @@ L3D00: DEFB %00000000 DEFB %01111000 DEFB %00000000 -; $74 - Character: 't' CHR$(116) +; #74 - Character: 't' CHR$(116) DEFB %00000000 DEFB %00010000 @@ -20238,7 +20238,7 @@ L3D00: DEFB %00000000 DEFB %00001100 DEFB %00000000 -; $75 - Character: 'u' CHR$(117) +; #75 - Character: 'u' CHR$(117) DEFB %00000000 DEFB %00000000 @@ -20249,7 +20249,7 @@ L3D00: DEFB %00000000 DEFB %00111000 DEFB %00000000 -; $76 - Character: 'v' CHR$(118) +; #76 - Character: 'v' CHR$(118) DEFB %00000000 DEFB %00000000 @@ -20260,7 +20260,7 @@ L3D00: DEFB %00000000 DEFB %00010000 DEFB %00000000 -; $77 - Character: 'w' CHR$(119) +; #77 - Character: 'w' CHR$(119) DEFB %00000000 DEFB %00000000 @@ -20271,7 +20271,7 @@ L3D00: DEFB %00000000 DEFB %00101000 DEFB %00000000 -; $78 - Character: 'x' CHR$(120) +; #78 - Character: 'x' CHR$(120) DEFB %00000000 DEFB %00000000 @@ -20282,7 +20282,7 @@ L3D00: DEFB %00000000 DEFB %01000100 DEFB %00000000 -; $79 - Character: 'y' CHR$(121) +; #79 - Character: 'y' CHR$(121) DEFB %00000000 DEFB %00000000 @@ -20293,7 +20293,7 @@ L3D00: DEFB %00000000 DEFB %00000100 DEFB %00111000 -; $7A - Character: 'z' CHR$(122) +; #7A - Character: 'z' CHR$(122) DEFB %00000000 DEFB %00000000 @@ -20304,7 +20304,7 @@ L3D00: DEFB %00000000 DEFB %01111100 DEFB %00000000 -; $7B - Character: '{' CHR$(123) +; #7B - Character: '{' CHR$(123) DEFB %00000000 DEFB %00001110 @@ -20315,7 +20315,7 @@ L3D00: DEFB %00000000 DEFB %00001110 DEFB %00000000 -; $7C - Character: '|' CHR$(124) +; #7C - Character: '|' CHR$(124) DEFB %00000000 DEFB %00001000 @@ -20326,7 +20326,7 @@ L3D00: DEFB %00000000 DEFB %00001000 DEFB %00000000 -; $7D - Character: '}' CHR$(125) +; #7D - Character: '}' CHR$(125) DEFB %00000000 DEFB %01110000 @@ -20337,7 +20337,7 @@ L3D00: DEFB %00000000 DEFB %01110000 DEFB %00000000 -; $7E - Character: '~' CHR$(126) +; #7E - Character: '~' CHR$(126) DEFB %00000000 DEFB %00010100 @@ -20348,7 +20348,7 @@ L3D00: DEFB %00000000 DEFB %00000000 DEFB %00000000 -; $7F - Character: '(c)' CHR$(127) +; #7F - Character: '(c)' CHR$(127) DEFB %00111100 DEFB %01000010 diff --git a/Shared_Includes b/Shared_Includes index 63faf9f..a0e68ce 160000 --- a/Shared_Includes +++ b/Shared_Includes @@ -1 +1 @@ -Subproject commit 63faf9f0823649cfb52e9fcaad430170a05b31a7 +Subproject commit a0e68ce3a19bd47537585e49bfbf5e45fab197a1 diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 0a155d6..1f777ab 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -241,29 +241,6 @@ RESTORE_CURRENT_DIR: ;███████████████████████████████████████████████████████████████████████ BOOT_PART_2: INCBIN 'build/boot.bin',248,181 .SIZE EQU $-BOOT_PART_2 -; -; vROM_BOOT: DI -; LD HL,BOOT_PART_1 -; LD DE,#5D3B -; LD BC,BOOT_PART_1.SIZE -; LDIR -; LD HL,BOOT_PART_2 -; LD BC,BOOT_PART_2.SIZE -; LDIR -; ; -; EI -; ; -; LD HL,#5EC9 -; LD (ZX_VARS.E_LINE),HL -; JP AUTO_012A -; ; -; ; RST RST20 ; станд. ввод в буфер редактирования -; ; DW #5D65 -; ; RET -; ; -; ; LD HL,#5D65 -; ; PUSH HL -; ; JP CMD_RETURN ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start DISPLAY "====================================================" From d9052b6952acaca79e58f82e5aa9401968917e81 Mon Sep 17 00:00:00 2001 From: Tolik <85737314+Tolik-Trek@users.noreply.github.com> Date: Wed, 25 Jun 2025 23:03:52 +1000 Subject: [PATCH 114/114] release 25/06/2025 --- SP_TRDOS.ASM | 24 +++-- TRDOS/TR_HDD_4.ASZ | 7 +- TRDOS/boot/boot.asm | 224 +++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 241 insertions(+), 14 deletions(-) diff --git a/SP_TRDOS.ASM b/SP_TRDOS.ASM index d9eabb9..bce2e2f 100644 --- a/SP_TRDOS.ASM +++ b/SP_TRDOS.ASM @@ -6,21 +6,19 @@ ;!TODO использовать внешние порты #E0 и #E3 для сохранения регистров при перехвате всяких #3D2F ; [ ] boot loader from TR-DOS vROM - ;SHELLEXEC "sjasmplus --nologo --syntax=f --fullpath --color=on --exp=trdos/boot/boot.inc --lst=Build/boot.lst --raw=Build/boot.bin trdos/boot/boot.asm" + DEFINE DEFtrd_boot_small 0 LUA PASS1 - compiling_boot = (os.execute("sjasmplus --nologo --syntax=f --fullpath --color=on --exp=trdos/boot/boot.inc --lst=Build/boot.lst --raw=Build/boot.bin trdos/boot/boot.asm")) + -- --define + local sjasmplus_run = "sjasmplus --nologo --syntax=f --fullpath --color=on --exp=trdos/boot/boot.inc --lst=Build/boot.lst --raw=Build/boot.bin trdos/boot/boot.asm --define DEFtrd_boot_small=" .. sj.get_define("DEFtrd_boot_small") + compiling_boot = (os.execute(sjasmplus_run)) if compiling_boot then print("--[ BOOT Build OK ]--") - --sj.insert_define("_BOOT_COMPILED_", "1") else print("--[ BOOT Build ERROR!!! ]--") - --sj.insert_define("_BOOT_COMPILED_", "0") os.exit(1) end ENDLUA - ; IF _BOOT_COMPILED_ = 0 - ; assert 1, Error whith boot.asm - ; ENDIF + DEVICE ZXSPECTRUM128 ORG 0 @@ -595,7 +593,11 @@ vROM_BOOT: LD HL,(ZX_VARS.ADR_RET) .continue: LD HL,(ZX_VARS.FL_START) LD (ZX_VARS.ADR_RET),HL ; восстанавливаем ADR_RET ; + IF DEFtrd_boot_small + LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + ELSE LD HL,BOOT_PART_1.SIZE + BOOT_PART_2.SIZE + BOOT_PART_3.SIZE + ENDIF LD (ZX_VARS.FL_START),HL ; длина программы с переменными. LD (ZX_VARS.FL_LEN),HL ; длина программы с переменными. ; @@ -611,11 +613,12 @@ vROM_BOOT: LD HL,(ZX_VARS.ADR_RET) LD HL,BOOT_PART_2 LD BC,BOOT_PART_2.SIZE LDIR + IFN DEFtrd_boot_small LD HL,BOOT_PART_3 LD BC,BOOT_PART_3.SIZE LDIR - - ;LD HL,.StartAddr + BOOT_PART_1.SIZE + BOOT_PART_2.SIZE - 3 + ENDIF + LD HL,vROM_Boot.StartLineNum LD (ZX_VARS.E_LINE),HL ; @@ -1226,9 +1229,10 @@ WG93_EXE_: ;************************************** ;███████████████████████████████████████████████████████████████████████ ; [x] 13/06/2025 boot loader from TR-DOS vROM - + IFN DEFtrd_boot_small BOOT_PART_3: INCBIN 'build/boot.bin',429 .SIZE EQU $-BOOT_PART_3 + ENDIF ;███████████████████████████████████████████████████████████████████████ ;************************************** diff --git a/TRDOS/TR_HDD_4.ASZ b/TRDOS/TR_HDD_4.ASZ index 1f777ab..a08b573 100644 --- a/TRDOS/TR_HDD_4.ASZ +++ b/TRDOS/TR_HDD_4.ASZ @@ -239,7 +239,12 @@ RESTORE_CURRENT_DIR: RET ; ;███████████████████████████████████████████████████████████████████████ -BOOT_PART_2: INCBIN 'build/boot.bin',248,181 +BOOT_PART_2: + IF DEFtrd_boot_small + INCBIN 'build/boot.bin',248 + ELSE + INCBIN 'build/boot.bin',248,181 + ENDIF .SIZE EQU $-BOOT_PART_2 ;███████████████████████████████████████████████████████████████████████ DISPLAY "TR_HDD_4.ASZ size: ",/A,$-File_Start diff --git a/TRDOS/boot/boot.asm b/TRDOS/boot/boot.asm index 554013a..b04578d 100755 --- a/TRDOS/boot/boot.asm +++ b/TRDOS/boot/boot.asm @@ -1,7 +1,214 @@ -; device zxspectrum48 + IF DEFtrd_boot_small + +;======================================================================; INCLUDE 'inc/rom_routines.inc' INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + INCLUDE 'Shared_Includes/constants/standart_colors.inc' +;======================================================================; + + +;======================================================================; +collor_A EQU 0x03 +collor_B EQU 0x02 +collor_N EQU 0x04 +collor_M EQU 0x08 +collor_T EQU 0x07 +org_addr EQU #5d3b +;======================================================================; + + +; Variables +;======================================================================; +ColumnNumber EQU #70E0 +Columns EQU 3 +;======================================================================; + + +;======================================================================; + ORG org_addr +bstart: DW #100 ; line number = 1 + DW l1end - l1begin ; line length +l1begin: DB ZX_Token.border, ZX_Token.not, ZX_Token.pi, ":" + DB ZX_Token.randomize, ZX_Token.usr, ZX_Token.val, '"',"23907",'"' + DB ":", ZX_Token.rem, ":", ZX_Token.run + DB '"' +BootName: DB ZX_Char.tab, 10, 32 + DB "MAXBOOT v9.1" +.size EQU $-BootName + DB '"', ZX_Char.carriage_return +;======================================================================; + +;#70F6 - disk name + +;======================================================================; +START_BOOT: ;Permanent current colours, etc, as set up by colour statements. + LD (iy+#53),COLORS.ZX.CYAN ;5d63 fd 36 53 05 . 6 S . +l5d67h: CALL BASIC_FN.x48.cls ;5d67 cd 6b 0d . k . + ADD HL,BC ;5d6a 09 . + ; HL = 6801 + ; read 9 sectors + LD BC,#0905 ;5d6b 01 05 09 . . . + PUSH HL ;5d6e e5 . + CALL #3D13 ;5d6f cd 13 3d . . = + ;PR-STRING + LD DE,BootName ;5d72 11 52 5d . R ] + LD C,BootName.size ;5d75 0e 0f . . + CALL #203C ;5d77 cd 3c 20 . < + ;CHAN_OPEN + ; Open channel 2 (main screen) + LD A,#02 ;5d7a 3e 02 > . + CALL #1601 ;5d7c cd 01 16 . . . + ; + POP HL ;5d7f e1 . + LD D,H ;5d80 54 T + LD E,L ;5d81 5d ] +loopDir: LD BC,8 ; смещение на тип файла ;5d82 01 08 00 . . . + DEC (HL) ;5d85 35 5 + JR Z,.nextFile ;5d86 28 28 ( ( + INC (HL) ;5d88 34 4 + JR Z,.EXIT ;5d89 28 2a ( * + ; + PUSH HL ;5d8b e5 . + ADD HL,BC ;5d8c 09 . + LD A,(HL) ;5d8d 7e ~ + POP HL ;5d8e e1 . + CP "B" ;5d8f fe 42 . B + JR NZ,.nextFile ;5d91 20 1d . + PUSH HL ;5d93 e5 . + ;PRINT-A + LD A," " ;5d94 3e 20 > + RST #10 ;5d96 d7 . + ; (#5C51) == #5D2B + ; (#5D2B) == #09F4 + ; вывод имени файла +.loopPrint: LD A,(HL) ;5d97 7e ~ + RST #10 ;5d98 d7 . + LDI ;5d99 ed a0 . . + JP PE,.loopPrint ;5d9b ea 97 5d . . ] + ; подсчёт колонок для правильного вывода имён файлов + LD HL,ColumnNumber ;5d9e 21 e0 70 ! . p + INC (HL) ;5da1 34 4 + LD A,(HL) ;5da2 7e ~ +.loopColumn: SUB Columns ;5da3 d6 03 . . + JR Z,.ColumnThree ;5da5 28 05 ( . + JR NC,.loopColumn ;5da7 30 fa 0 . + LD A," " ;5da9 3e 20 > + RST #10 ;5dab d7 . +.ColumnThree: LD A," " ;5dac 3e 20 > + RST #10 ;5dae d7 . + ; + POP HL ;5daf e1 . +.nextFile: LD C,#10 ;5db0 0e 10 . . + ADD HL,BC ;5db2 09 . + JR loopDir ;5db3 18 cd . . +.EXIT: ; +;;;;;;;;;;;;;;;;; + ; B = 0 + ; Рисовалка курсора атрибутами. Перемещение курсора +MAIN_LOOP: LD C,B ;5db5 48 H +l5db6h: LD HL,#57F5 ;5db6 21 f5 57 ! . W + LD DE,#000B ;5db9 11 0b 00 . . . + LD A,D ;5dbc 7a z +l5dbdh: LD B,#03 ;5dbd 06 03 . . +l5dbfh: ADD HL,DE ;5dbf 19 . + CP C ;5dc0 b9 . + JR Z,l5dc9h ;5dc1 28 06 ( . + INC A ;5dc3 3c < + DJNZ l5dbfh ;5dc4 10 f9 . . + DEC HL ;5dc6 2b + + JR l5dbdh ;5dc7 18 f4 . . + ; +l5dc9h: LD B,#0A ;5dc9 06 0a . . + LD DE,(#70DE) ;5dcb ed 5b de 70 . [ . p + LD (#70DE),HL ;5dcf 22 de 70 " . p + LD A,#05 ;5dd2 3e 05 > . +l5dd4h: LD (DE),A ;5dd4 12 . + INC DE ;5dd5 13 . + LD (HL),#1E ;5dd6 36 1e 6 . + INC HL ;5dd8 23 # + DJNZ l5dd4h ;5dd9 10 f9 . . + LD HL,#5C08 ;5ddb 21 08 5c ! . \ + LD (HL),H ;5dde 74 t +l5ddfh: LD A,(HL) ;5ddf 7e ~ + OR #20 ;5de0 f6 20 . + SUB #20 ;5de2 d6 20 . + JR Z,l5d67h ;5de4 28 81 ( . + SUB L ;5de6 95 . + LD B,#02 ;5de7 06 02 . . +l5de9h: JR Z,l5e0fh ;5de9 28 24 ( $ + DEC A ;5deb 3d = + JR Z,l5e13h ;5dec 28 25 ( % + DEC A ;5dee 3d = + JR Z,l5e11h ;5def 28 20 ( + DEC A ;5df1 3d = + JR Z,l5e0dh ;5df2 28 19 ( . + SUB B ;5df4 90 . + JR Z,RUN_BASIC ;5df5 28 2d ( - + SUB #03 ;5df7 d6 03 . . + JR Z,RUN_BASIC ;5df9 28 29 ( ) + SUB #06 ;5dfb d6 06 . . + DJNZ l5de9h ;5dfd 10 ea . . + SUB #1E ;5dff d6 1e . . + JR Z,l5e11h ;5e01 28 0e ( . + SUB #0E ;5e03 d6 0e . . + JR Z,l5e0fh ;5e05 28 08 ( . + DEC A ;5e07 3d = + JR Z,l5e13h ;5e08 28 09 ( . + DEC A ;5e0a 3d = + JR NZ,l5ddfh ;5e0b 20 d2 . +l5e0dh: SUB #02 ;5e0d d6 02 . . +l5e0fh: SUB #04 ;5e0f d6 04 . . +l5e11h: ADD A,#02 ;5e11 c6 02 . . +l5e13h: ADD A,C ;5e13 81 . + LD BC,(ColumnNumber) ;5e14 ed 4b e0 70 . K . p + DEC C ;5e18 0d . + INC A ;5e19 3c < + JP M,l5db6h ;5e1a fa b6 5d . . ] + INC C ;5e1d 0c . + CP C ;5e1e b9 . + LD C,A ;5e1f 4f O + JR C,l5db6h ;5e20 38 94 8 . + JR MAIN_LOOP ;5e22 18 91 . . + ; + ; запуск васика + ; A = 0 +RUN_BASIC: LD B,A ;5e24 47 G + LD A,C ;5e25 79 y + INC A ;5e26 3c < + LD C,L ;5e27 4d M + LD HL,#67F9 ;5e28 21 f9 67 ! . g +.loop: ADD HL,BC ;5e2b 09 . + DEC A ;5e2c 3d = + JR NZ,.loop ;5e2d 20 fc . + ; + LD DE,BootName ;5e2f 11 52 5d . R ] + LDIR ;5e32 ed b0 . . + JP #3D03 ;5e34 c3 03 3d . . = + + + + ;ADD A,B ;5e37 80 . + ;XOR D ;5e38 aa . + ;DEFB 001h,000h ;5e39 01 00 . . + +StartLineNum: DB 0 + DW 0 + ;DB #80 +l1end: + + EXPORT StartLineNum + EXPORT org_addr + + + ELSE + +;======================================================================; + INCLUDE 'inc/rom_routines.inc' + INCLUDE 'Shared_Includes/constants/ZX_VARS.inc' + INCLUDE 'Shared_Includes/constants/zx_char_codes.inc' + INCLUDE 'Shared_Includes/constants/standart_colors.inc' +;======================================================================; ;======================================================================= collor_A EQU 0x03 @@ -11,6 +218,15 @@ collor_M EQU 0x08 collor_T EQU 0x07 org_addr EQU #5d3b +;======================================================================= +DiskName EQU catBuff + #08F5 +.size EQU 8 + +Columns EQU 3 + +vROMbootSize EQU bstart +;======================================================================= + ORG org_addr @@ -62,7 +278,7 @@ main: LD A,(.CurrentPage) LD (var_collor),A LD HL,#50CC LD (var_printPos),HL - LD HL,catBuff + #08F5 + LD HL,DiskName LD B,8 @@ -380,4 +596,6 @@ catBuff EQU #6000 ;$ + (-$&0x0f) ASSERT l2end < catBuff,"ERROR!!! Code leaks to catBuff" EXPORT StartLineNum EXPORT org_addr -; \ No newline at end of file +; + + ENDIF \ No newline at end of file