From ae88e6864e10a7e8df1c42ae75eaf387f9732d60 Mon Sep 17 00:00:00 2001 From: Anatoliy Belyanskiy Date: Sat, 6 Jan 2024 02:57:48 +1000 Subject: [PATCH 01/28] =?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 02/28] =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20HD?= =?UTF-8?q?=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 03/28] =?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 04/28] ... --- 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 05/28] =?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 06/28] 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 07/28] ... --- 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 08/28] ... --- 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 09/28] ... --- 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 10/28] ... --- 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 11/28] ... --- 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 12/28] ... --- 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 13/28] =?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 14/28] ... --- 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 15/28] -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 16/28] --- --- 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 17/28] ... --- 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 18/28] ... --- 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 19/28] ... --- 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 20/28] ... --- 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 21/28] ... --- 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 22/28] ... --- 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 23/28] 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 24/28] ... --- 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 25/28] 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 26/28] 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 27/28] ... --- 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 28/28] ... --- 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