Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 1
test.asm



      1				     ; =======================================
      2				     ;	kr.asm
      3				     ;
      4				     ;	Сборка:
      5				     ;	> tasm.exe /l kr.asm
      6				     ;	> tlink	/t /x kr.obj
      7				     ; =======================================
      8
      9	0000			     code segment 'code'
     10					 assume	 CS:code, DS:code
     11					 org 100h
     12
     13	0100			     _start:
     14	0100  E9 07B4			 jmp _initTSR				     ; на начало программы
     15
     16	0103  61 62 63 64 65		 ignoredChars		     DB	'abcde'	     ; игнорируемые	символы
     17	0108  05			 ignoredLength		     DB	5	     ; длина строки ignoredChars
     18	0109  00			 ignoreEnabled		     DB	0	     ; флаг	функции			    +
     19				     игнорирования	ввода
     20	010A  51 57 45 52 54 59		 translateFrom		     DB	'QWERTY'     ; заменяемые символы
     21	0110  D0 99 D0 A6 D0 A3	D0+	 translateTo		     DB	'ЙЦУКЕН'	   ; символы, на которые    +
     22	      9A D0 95 D0 9D	     будет	происходить замена
     23	011C  06			 translateLength	     DB	6	     ; длина строки translateFrom
     24	011D  00			 translateEnabled	     DB	0	     ; флаг	функции перевода
     25
     26	011E  00			 signaturePrintingEnabled    DB	0	     ; флаг	вывода подписи
     27	011F  0000			 counter		     DW	0
     28	      =0002			 printDelay		     EQU 2	     ; задержка	перед выводом   +
     29				     "подписи" в секундах
     30
     31	0121  0034			 signatureLineLength	     DW	 52	     ; длина одной строчки	    +
     32				     подписи
     33	0123  B3 D0 98 D0 B2 D0	B0+	 signatureLine1		     DB	 179, 'Иванов Иван Иванович		    +
     34	      D0 BD D0 BE D0 B2	20+  ',	179
     35	      D0 98 D0 B2 D0 B0	D0+
     36	      BD 20 D0 98 D0 B2	D0+
     37	      B0 D0 BD D0 BE D0	B2+
     38	      D0 B8 D1 87 20 20	20+
     39	      20 20 20 20 20 20	20+
     40	      20 20 20 20 20 20	20+
     41	      20 20 20 20 20 20	20+
     42	      20 20 20 20 20 20	B3
     43	0169  B3 D0 98 D0 A3 35	2D+	 signatureLine2		     DB	 179, 'ИУ5-4X						    +
     44	      34 58 20 20 20 20	20+  ',	179
     45	      20 20 20 20 20 20	20+
     46	      20 20 20 20 20 20	20+
     47	      20 20 20 20 20 20	20+
     48	      20 20 20 20 20 20	20+
     49	      20 20 20 20 20 20	20+
     50	      20 20 20 20 B3
     51	019F  B3 D0 92 D0 B0 D1	80+	 signatureLine3		     DB	 179, 'Вариант #0				    +
     52	      D0 B8 D0 B0 D0 BD	D1+  ',	179
     53	      82 20 23 30 20 20	20+
     54	      20 20 20 20 20 20	20+
     55	      20 20 20 20 20 20	20+
     56	      20 20 20 20 20 20	20+
     57	      20 20 20 20 20 20	20+
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 2
test.asm



     58	      20 20 20 20 20 20	20+
     59	      20 20 B3
     60	01DA  E2 94 8C 32*(E2 94  +	 tableTop		     DB	 '┌',	50 dup ('─'),	'┐'
     61	      80) E2 94	90
     62	0276  E2 94 94 32*(E2 94  +	 tableBottom		     DB	 '└',	50 dup ('─'),	'┘'
     63	      80) E2 94	98
     64
     65	0312  3E 20 6B 72 2E 63	6F+	 helpMsg     DB	'> kr.com [/?] [/u]', 10, 13
     66	      6D 20 5B 2F 3F 5D	20+
     67	      5B 2F 75 5D 0A 0D
     68	0326  20 5B 2F 3F 5D 20	2D+		     DB	' [/?] - вывод данной справки', 10, 13
     69	      20 D0 B2 D1 8B D0	B2+
     70	      D0 BE D0 B4 20 D0	B4+
     71	      D0 B0 D0 BD D0 BD	D0+
     72	      BE D0 B9 20 D1 81	D0+
     73	      BF D1 80 D0 B0 D0	B2+
     74	      D0 BA D0 B8 0A 0D
     75	0356  20 5B 2F 75 5D 20	2D+		     DB	' [/u] - выгрузка резидента из памяти', 10, 13
     76	      20 D0 B2 D1 8B D0	B3+
     77	      D1 80 D1 83 D0 B7	D0+
     78	      BA D0 B0 20 D1 80	D0+
     79	      B5 D0 B7 D0 B8 D0	B4+
     80	      D0 B5 D0 BD D1 82	D0+
     81	      B0 20 D0 B8 D0 B7	20+
     82	      D0 BF D0 B0 D0 BC	D1+
     83	      8F D1 82 D0 B8 0A	0D
     84	0395  20 20 46 31 20 20	2D+		     DB	'  F1  - вывод ФИО и группы по	таймеру в	    +
     85	      20 D0 B2 D1 8B D0	B2+  центре экрана', 10, 13
     86	      D0 BE D0 B4 20 D0	A4+
     87	      D0 98 D0 9E 20 D0	B8+
     88	      20 D0 B3 D1 80 D1	83+
     89	      D0 BF D0 BF D1 8B	20+
     90	      D0 BF D0 BE 20 D1	82+
     91	      D0 B0 D0 B9 D0 BC	D0+
     92	      B5 D1 80 D1 83 20	D0+
     93	      B2 20 D1 86 D0 B5	D0+
     94	      BD D1 82 D1 80 D0	B5+
     95	      20 D1 8D D0 BA D1	80+
     96	      D0 B0 D0 BD D0 B0	0A+
     97	      0D
     98	03F1  20 20 46 32 20 20	2D+		     DB	'  F2  - включение/отключения курсивного	    +
     99	      20 D0 B2 D0 BA D0	BB+  вывода русского символа В', 10, 13
    100	      D1 8E D1 87 D0 B5	D0+
    101	      BD D0 B8 D0 B5 2F	D0+
    102	      BE D1 82 D0 BA D0	BB+
    103	      D1 8E D1 87 D0 B5	D0+
    104	      BD D0 B8 D1 8F 20	D0+
    105	      BA D1 83 D1 80 D1	81+
    106	      D0 B8 D0 B2 D0 BD	D0+
    107	      BE D0 B3 D0 BE 20	D0+
    108	      B2 D1 8B D0 B2 D0	BE+
    109	      D0 B4 D0 B0 20 D1	80+
    110	      D1 83 D1 81 D1 81	D0+
    111	      BA D0 BE D0 B3 D0	BE+
    112	      20 D1 81 D0 B8 D0	BC+
    113	      D0 B2 D0 BE D0 BB	D0+
    114	      B0 20 D0 92 0A 0D
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 3
test.asm



    115	0467  20 20 46 33 20 20	2D+		     DB	'  F3  - включение/отключение частичной	    +
    116	      20 D0 B2 D0 BA D0	BB+  русификации клавиатуры: QWERTY -> ЙЦУКЕН', 10, 13
    117	      D1 8E D1 87 D0 B5	D0+
    118	      BD D0 B8 D0 B5 2F	D0+
    119	      BE D1 82 D0 BA D0	BB+
    120	      D1 8E D1 87 D0 B5	D0+
    121	      BD D0 B8 D0 B5 20	D1+
    122	      87 D0 B0 D1 81 D1	82+
    123	      D0 B8 D1 87 D0 BD	D0+
    124	      BE D0 B9 20 D1 80	D1+
    125	      83 D1 81 D0 B8 D1	84+
    126	      D0 B8 D0 BA D0 B0	D1+
    127	      86 D0 B8 D0 B8 20	D0+
    128	      BA D0 BB D0 B0 D0	B2+
    129	      D0 B8 D0 B0 D1 82	D1+
    130	      83 D1 80 D1 8B 3A	20+
    131	      51 57 45 52 54 59	20+
    132	      2D 3E 20 D0 99 D0	A6+
    133	      D0 A3 D0 9A D0 95	D0+
    134	      9D 0A 0D
    135	04EF  20 20 46 34 20 20	2D+		     DB	'  F4  - включение/отключение режима		    +
    136	      20 D0 B2 D0 BA D0	BB+  блокировки ввода букв abcde', 10, 13, 0
    137	      D1 8E D1 87 D0 B5	D0+
    138	      BD D0 B8 D0 B5 2F	D0+
    139	      BE D1 82 D0 BA D0	BB+
    140	      D1 8E D1 87 D0 B5	D0+
    141	      BD D0 B8 D0 B5 20	D1+
    142	      80 D0 B5 D0 B6 D0	B8+
    143	      D0 BC D0 B0 20 D0	B1+
    144	      D0 BB D0 BE D0 BA	D0+
    145	      B8 D1 80 D0 BE D0	B2+
    146	      D0 BA D0 B8 20 D0	B2+
    147	      D0 B2 D0 BE D0 B4	D0+
    148	      B0 20 D0 B1 D1 83	D0+
    149	      BA D0 B2 20 61 62	63+
    150	      64 65 0A 0D 00
    151
    152	      =024B			 helpMsgLength		     EQU $-helpMsg
    153	055D  00			 commandLineResult	     DB	0
    154
    155	055E  00			 cursiveEnabled		     DB	0	     ; флаг	перевода символа	в  +
    156				     курсив
    157	055F  00			 cursiveSymbol		     DB	00000000b    ; символ, составленный из  +
    158				     единиц (его курсивный вариант)
    159	0560  00						     DB	00000000b
    160	0561  00						     DB	00000000b
    161	0562  3E						     DB	00111110b
    162	0563  3F						     DB	00111111b
    163	0564  33						     DB	00110011b
    164	0565  66						     DB	01100110b
    165	0566  66						     DB	01100110b
    166	0567  7C						     DB	01111100b
    167	0568  C6						     DB	11000110b
    168	0569  C6						     DB	11000110b
    169	056A  C6						     DB	11000110b
    170	056B  FC						     DB	11111100b
    171	056C  00						     DB	00000000b
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 4
test.asm



    172	056D  00						     DB	00000000b
    173	056E  00						     DB	00000000b
    174
    175	056F  D0 92			 charToCursiveIndex	     DB	'В'	      ;	символ для замены
    176	0571  10*(FF)			 savedSymbol		     DB	16 dup(0FFh) ; переменная для хранения +
    177				     старого символа
    178
    179	0581  ????			 old_int9hOffset	     DW	 ?	     ; адрес старого		    +
    180				     обработчика int	9h
    181	0583  ????			 old_int9hSegment	     DW	 ?	     ; сегмент старого		    +
    182				     обработчика int	9h
    183	0585  ????			 old_int1ChOffset	     DW	 ?	     ; адрес старого		    +
    184				     обработчика int	1Ch
    185	0587  ????			 old_int1ChSegment	     DW	 ?	     ; сегмент старого		    +
    186				     обработчика int	1Ch
    187	0589  ????			 old_int2FhOffset	     DW	 ?	     ; адрес старого		    +
    188				     обработчика int	2Fh
    189	058B  ????			 old_int2FhSegment	     DW	 ?	     ; сегмент старого		    +
    190				     обработчика int	2Fh
    191
    192	058D  D0 A0 D0 B5 D0 B7	D0+	 installedMsg		     DB	 'Резидент загружен.', 0
    193	      B8 D0 B4 D0 B5 D0	BD+
    194	      D1 82 20 D0 B7 D0	B0+
    195	      D0 B3 D1 80 D1 83	D0+
    196	      B6 D0 B5 D0 BD 2E	00
    197	05B0  D0 A0 D0 B5 D0 B7	D0+	 alreadyInstalledMsg	     DB	 'Резидент уже был загружен.', 0
    198	      B8 D0 B4 D0 B5 D0	BD+
    199	      D1 82 20 D1 83 D0	B6+
    200	      D0 B5 20 D0 B1 D1	8B+
    201	      D0 BB 20 D0 B7 D0	B0+
    202	      D0 B3 D1 80 D1 83	D0+
    203	      B6 D0 B5 D0 BD 2E	00
    204	05E1  D0 A0 D0 B5 D0 B7	D0+	 notInstalledMsg	     DB	 'Резидент не	был загружен.$'
    205	      B8 D0 B4 D0 B5 D0	BD+
    206	      D1 82 20 D0 BD D0	B5+
    207	      20 D0 B1 D1 8B D0	BB+
    208	      20 D0 B7 D0 B0 D0	B3+
    209	      D1 80 D1 83 D0 B6	D0+
    210	      B5 D0 BD 2E 24
    211
    212	0610  D0 A0 D0 B5 D0 B7	D0+	 removedMsg		     DB	 'Резидент выгружен из памяти.'
    213	      B8 D0 B4 D0 B5 D0	BD+
    214	      D1 82 20 D0 B2 D1	8B+
    215	      D0 B3 D1 80 D1 83	D0+
    216	      B6 D0 B5 D0 BD 20	D0+
    217	      B8 D0 B7 20 D0 BF	D0+
    218	      B0 D0 BC D1 8F D1	82+
    219	      D0 B8 2E
    220	      =0034			 removedMsg_length	     EQU $-removedMsg
    221
    222	0644  D0 9D D0 B5 20 D1	83+	 noRemoveMsg		     DB	 'Не удалось выгрузить резидент'
    223	      D0 B4 D0 B0 D0 BB	D0+
    224	      BE D1 81 D1 8C 20	D0+
    225	      B2 D1 8B D0 B3 D1	80+
    226	      D1 83 D0 B7 D0 B8	D1+
    227	      82 D1 8C 20 D1 80	D0+
    228	      B5 D0 B7 D0 B8 D0	B4+
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 5
test.asm



    229	      D0 B5 D0 BD D1 82
    230	      =0037			 noRemoveMsg_length	     EQU $-noRemoveMsg
    231
    232	      =00FF			 true			     EQU 0FFh	     ; нужно для удобства	    +
    233				     использования	not с флагами
    234										     ; 0FFh = 11111111b	= инверсия 00000000b
    235
    236					 ; новый обработчик прерывания	int 9h
    237					 ; (работа с клавиатурой)
    238	067B				 new_int9h proc	far
    239	067B  56 50 53 51 52 06	1E	     push SI AX	BX CX DX ES DS		     ; сохраняем значения всех,+
    240				     изменяемых регистров в	стеке
    241	0682  0E			     push CS				     ; синхронизируем CS и DS
    242	0683  1F			     pop DS
    243
    244	0684  9C			     pushf
    245	0685  2E: FF 1E	0581r		     call dword	ptr CS:[old_int9hOffset]     ; вызываем	стандартный	    +
    246				     обработчик прерывания
    247	068A  B8 0040			     mov AX, 40h			     ; 40h - сегмент, где хранятся+
    248				     флаги	состояния клавиатуры
    249	068D  8E C0			     mov ES, AX
    250	068F  26: 8B 1E	001C		     mov BX, ES:[1Ch]			     ; адрес хвоста
    251	0694  83 EB 02			     sub BX, 2h				     ; сместимся назад к		    +
    252				     последнему введённому символу
    253	0697  83 FB 1E			     cmp BX, 1Eh			     ; не вышли ли мы за пределы+
    254				     буфера?
    255	069A  73 03			     jae _go
    256	069C  BB 003C			     mov BX, 3Ch			     ; хвост вышел за пределы    +
    257				     буфера: значит, последний
    258										     ; введённый символ		    +
    259				     находится	в конце буфера
    260	069F				 _go:
    261	069F  26: 8B 17			     mov DX, ES:[BX]			     ; в DX 0 введённый символ
    262
    263	06A2				 _test_Fx:				     ; проверка	F1-F4
    264	06A2				 _F1:
    265	06A2  80 FE 3B			     cmp DH, 3Bh			     ; F1
    266	06A5  75 0C			     jne _F2
    267	06A7  F6 16 011Er		     not signaturePrintingEnabled
    268	06AB  26: 89 1E	001C		     mov ES:[1Ch], BX			     ; блокировка ввода символа
    269	06B0  EB 7C 90			     jmp _quit
    270	06B3				 _F2:
    271	06B3  80 FE 3C			     cmp DH, 3Ch			     ; F2
    272	06B6  75 0F			     jne _F3
    273	06B8  26: 89 1E	001C		     mov ES:[1Ch], BX			     ; блокировка ввода символа
    274	06BD  F6 16 055Er		     not cursiveEnabled
    275	06C1  E8 0072			     call toggleCursive			     ; перевод символа в	курсив+
    276				     и	обратно
    277										     ; в зависимости от флага    +
    278				     cursiveEnabled
    279	06C4  EB 68 90			     jmp _quit
    280	06C7				 _F3:
    281	06C7  80 FE 3D			     cmp DH, 3Dh			     ; F3
    282	06CA  75 0C			     jne _F4
    283	06CC  F6 16 011Dr		     not translateEnabled
    284	06D0  26: 89 1E	001C		     mov ES:[1Ch], BX			     ; блокировка ввода символа
    285	06D5  EB 57 90			     jmp _quit
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 6
test.asm



    286	06D8				 _F4:
    287	06D8  80 FE 3E			     cmp DH, 3Eh			     ; F4
    288	06DB  75 0C			     jne _translateOrIgnore
    289	06DD  F6 16 0109r		     not ignoreEnabled
    290	06E1  26: 89 1E	001C		     mov ES:[1Ch], BX			     ; блокировка ввода символа
    291	06E6  EB 46 90			     jmp _quit
    292
    293	06E9				 _translateOrIgnore:			     ; просто выводим		    +
    294				     набранный	символ на экран
    295	06E9  80 3E 0109r FF		     cmp ignoreEnabled,	true		     ; включен ли режим		    +
    296				     блокировки ввода?
    297	06EE  75 1B			     jne _checkTranslate
    298
    299	06F0  BE 0000			     mov SI, 0				     ; да, включен
    300	06F3  8A 0E 0108r		     mov CL, ignoredLength		     ; количество игнорируемых+
    301				     символов
    302
    303	06F7				 _checkIgnored:
    304	06F7  3A 94 0103r		     cmp DL, ignoredChars[SI]		     ; проверяем, присутствует +
    305				     ли текущий символ в списке игнорируемых
    306	06FB  74 06			     je	_block
    307	06FD  46			     inc SI
    308	06FE  E2 F7			     loop _checkIgnored			     ; зацикливаем ignoredLength раз
    309	0700  EB 09 90			     jmp _checkTranslate
    310
    311					 ; блокируем
    312	0703				 _block:
    313	0703  26: 89 1E	001C		     mov ES:[1Ch], BX			     ; блокировка ввода символа
    314					     ; если	по варианту нужно не блокировать ввод	    +
    315				     символа,
    316					     ; а заменять одни символы другими, замените	    +
    317				     строку выше строкой
    318					     ;	 mov ES:[BX], AX
    319					     ; на месте AX может быть '*' для замены всех		    +
    320				     символов множества ignoredChars на звёздочки
    321					     ; или, для перевода одних символов в другие -	    +
    322				     завести массив
    323					     ; replaceWith DB '...', где перечислить символы, на		    +
    324				     которые пойдёт замена
    325					     ; и раскомментировать строки ниже:
    326					     ;	 xor AX, AX
    327					     ;	 mov AL, replaceWith[SI]
    328					     ;	 mov ES:[BX], AX		     ; замена символа
    329	0708  EB 24 90			     jmp _quit
    330
    331	070B				 _checkTranslate:
    332	070B  80 3E 011Dr FF		     cmp translateEnabled, true		     ; включен ли режим		    +
    333				     перевода?
    334	0710  75 1C			     jne _quit
    335
    336	0712  BE 0000			     mov SI, 0				     ; да, включен
    337	0715  8A 0E 011Cr		     mov CL, translateLength		     ; кол-во символов для	    +
    338				     перевода
    339
    340	0719				 _checkTranslateLoop:
    341	0719  3A 94 010Ar		     cmp DL, translateFrom[SI]		     ; присутствует	ли текущий +
    342				     символ в списке для перевода?
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 7
test.asm



    343	071D  74 06			     je	_translate
    344	071F  46			     inc SI
    345	0720  E2 F7			     loop _checkTranslateLoop		     ; продолжаем, пока не	    +
    346				     закончим проверять каждый символ
    347	0722  EB 0A 90			     jmp _quit
    348
    349	0725				 _translate:
    350	0725  33 C0			     xor AX, AX				     ; переводим
    351	0727  8A 84 0110r		     mov AL, translateTo[SI]
    352	072B  26: 89 07			     mov ES:[BX], AX			     ; замена символа
    353
    354	072E				 _quit:
    355	072E  1F 07 5A 59 5B 58	5E	     pop DS ES DX CX BX	AX SI		     ; восстанавливаем все	    +
    356				     регистры
    357	0735  CF			     iret
    358	0736				 new_int9h endp
    359
    360					 ; в зависимости от флага cursiveEnabled меняет		    +
    361				     начертание символа на курсив и обратно
    362					 ; сама смена происходит в процедуре changeFont - здесь   +
    363				     же подготавливаются данные
    364	0736				 toggleCursive proc
    365	0736  06 50			     push ES AX				     ; сохраняем регистры
    366	0738  0E			     push CS
    367	0739  07			     pop ES
    368
    369	073A  80 3E 055Er FF		     cmp cursiveEnabled, true		     ; если	флаг равен true,
    370	073F  75 30			     jne _restoreSymbol			     ; выполняем замену		    +
    371				     символа на курсивный вариант,
    372										     ; предварительно сохраняя+
    373				     старый символ в savedSymbol
    374
    375	0741  E8 004E			     call saveFont
    376	0744  8A 0E 056Fr		     mov CL, charToCursiveIndex
    377	0748				 _shiftTable:
    378	0748  83 C5 10			     add BP, 16				     ; получаем	в BP таблицу	    +
    379				     всех символов.	адрес указывает на символ	0
    380										     ; поэтому нужно совершить +
    381				     сдвиг	16*X - где X	- код символа
    382	074B  E2 FB			     loop _shiftTable
    383
    384	074D  1E			     push DS				     ; пpи savefont смещается	    +
    385				     pегистp ES
    386	074E  58			     pop AX				     ; поэтомy пpиходится	    +
    387				     делать такие махинации, чтобы
    388	074F  06			     push ES				     ; записать	полyченный	    +
    389				     элемент в savedSymbol
    390	0750  1F			     pop DS
    391	0751  50			     push AX				     ; DS -> AX, ES -> DS, AX -> ES => ES и DS	    +
    392				     поменялись местами
    393	0752  07			     pop ES				     ; + сохранение старого	    +
    394				     значения DS в AX
    395	0753  50			     push AX
    396
    397	0754  8B F5			     mov SI, BP
    398	0756  BF 0571r			     lea DI, savedSymbol		     ; сохpаняем в пеpеменнyю	    +
    399				     savedSymbol таблицу	нужного символа
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 8
test.asm



    400
    401	0759  B9 0010			     mov CX, 16				     ; movsb из DS:SI	в ES:DI
    402
    403	075C  F3> A4			     rep movsb				     ; исходные	позиции		    +
    404				     сегментов	возвpащены
    405	075E  1F			     pop DS				     ; восстановление DS
    406
    407	075F  B9 0001			     mov CX, 1				     ; заменим написание	    +
    408				     символа на кypсив
    409	0762  B6 00			     mov DH, 0
    410	0764  8A 16 056Fr		     mov DL, charToCursiveIndex
    411	0768  BD 055Fr			     lea BP, cursiveSymbol
    412	076B  E8 0015			     call changeFont
    413	076E  EB 10 90			     jmp _exitToggleCursive
    414
    415	0771				 _restoreSymbol:
    416	0771  B9 0001			     mov CX, 1				     ; если	флаг равен 0,		    +
    417				     заменяем курсивный символ на старый	вариант
    418	0774  B6 00			     mov DH, 0
    419	0776  8A 16 056Fr		     mov DL, charToCursiveIndex
    420	077A  BD 0571r			     lea BP, savedSymbol
    421	077D  E8 0003			     call changeFont
    422
    423	0780				 _exitToggleCursive:
    424	0780  58			     pop AX
    425	0781  07			     pop ES
    426	0782  C3			     ret
    427	0783				 toggleCursive endp
    428
    429					 ; функция смены начертания символа			    +
    430				     (курсив/нормальное)
    431					 ;
    432					 ; входные данные:
    433					 ; 1) DL = номер символа для замены
    434					 ; 2) CX = количество	символов заменяемых изображений+
    435				     символов
    436					 ;    (начиная с символа	указанного в	DX)
    437					 ; 3) ES:BP = адрес таблицы
    438					 ;
    439					 ; описание работы процедуры:
    440					 ; 1) происходит вызов int 10h (видеосервис)
    441					 ;    с функцией AH = 11h (функции знакогенератора)
    442					 ;    параметр AL = 0 сообщает,	что будет заменено	    +
    443				     изображение
    444					 ;    символа для текущего шрифта.
    445					 ;    в случаях, когда AL = 1 или 2, будет	заменено	    +
    446				     изображение
    447					 ;    только для определенного шрифта (8x14	и 8x8		    +
    448				     соответственно)
    449					 ; 2) параметр BH = 0Eh	сообщает, что на определение	    +
    450				     каждого изображения символа
    451					 ;    расходуется по 14 байт (режим 8x14 бит как раз 14	    +
    452				     байт)
    453					 ; 3) параметр BL = 0 -	блок шрифта для загрузки (от 0 до 4)
    454					 ;
    455					 ; результат:
    456					 ; изображение указанного(ых) символа(ов) будет	    +
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 9
test.asm



    457				     заменено
    458					 ; на	предложенное пользователем.
    459					 ; изменению подвергнутся все символы, находящиеся+
    460				     на экране:
    461					 ; таким образом, если изображение заменено,	старый+
    462				     вариант нигде уже не проявится
    463	0783				 changeFont proc
    464	0783  50 53 52			     push AX BX	DX
    465	0786  B8 1100			     mov AX, 1100h
    466	0789  BB 1000			     mov BX, 1000h
    467	078C  CD 10			     int 10h
    468	078E  5A 5B 58			     pop DX BX AX
    469	0791  C3			     ret
    470	0792				 changeFont endp
    471
    472					 ; функция сохранения нормального начертания	    +
    473				     символа
    474					 ;
    475					 ; входные данные:
    476					 ; BH -	тип возвращаемой	символьной таблицы
    477					 ;   = 0     - таблица из int 1fh
    478					 ;   = 1     - таблица из int 44h
    479					 ;   = 2..5  - таблица из 8x14, 8x8, 8x8 (top), 9x14
    480					 ;   = 6     - 8x16
    481					 ;
    482					 ; описание работы процедуры:
    483					 ;   происходит вызов int 10h (видеосервис)
    484					 ;   с	функцией AH = 11h (функции знакогенератора)
    485					 ;   параметр AL = 30 -	подфункция получения	информации+
    486				     о	EGA
    487					 ;
    488					 ; результат:
    489					 ;   1)	в ES:BP находится таблица символов (полная)
    490					 ;   2)	в CX находится байт на символ
    491					 ;   3)	в DL количество экранных строк
    492					 ; важно! происходит сдвиг регистра	ES (ES = C000h)
    493	0792				 saveFont proc
    494	0792  50 53 52			     push AX BX	DX
    495	0795  B8 1130			     mov AX, 1130h
    496	0798  BB 0600			     mov BX, 0600h
    497	079B  CD 10			     int 10h
    498	079D  5B 58 5A			     pop BX AX DX
    499	07A0  C3			     ret
    500	07A1				 saveFont endp
    501
    502					 ; обработчик	прерывания int 2Fh
    503					 ; служит	для:
    504					 ;  1) проверки	факта присутствия TSR в памяти (при	    +
    505				     AH=0FFh, AL=0)
    506					 ;     будет возвращён AH='i' в случае, если TSR уже	    +
    507				     загружен
    508					 ;  2) выгрузки	TSR из памяти (при AH=0FFh, AL=1)
    509	07A1				 new_int2Fh proc
    510	07A1  80 FC FF			     cmp AH, 0FFh			     ; наша	процедура?
    511	07A4  75 0B			     jne _2Fh_default			     ; нет -	на стандартный	    +
    512				     обработчик
    513	07A6  3C 00			     cmp AL, 0				     ; подпроцедура	проверки,   +
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 10
test.asm



    514				     загружен ли резидент в память?
    515	07A8  74 0C			     je	 _alreadyInstalled2Fh
    516	07AA  3C 01			     cmp AL, 1				     ; подпроцедура	выгрузки    +
    517				     из памяти?
    518	07AC  74 0B			     je	 _uninstall
    519	07AE  EB 01 90			     jmp _2Fh_default
    520
    521	07B1				 _2Fh_default:
    522	07B1  2E: FF 2E	0589r		     jmp dword ptr CS:[old_int2FhOffset]     ; вызов стандартного	    +
    523				     обработчика
    524
    525	07B6				 _alreadyInstalled2Fh:
    526	07B6  B4 69			     mov AH, 'i'			     ; пусть AH = 'i', если		    +
    527				     резидент уже загружен в память
    528	07B8  CF			     iret				     ; конечно, вместо 'i'	может  +
    529				     быть любое значение
    530
    531	07B9				 _uninstall:				     ; подпроцедура	выгрузки    +
    532				     из памяти
    533	07B9  1E 06 52 53		     push DS ES	DX BX
    534	07BD  33 DB			     xor BX, BX
    535
    536	07BF  0E			     push CS				     ; CS = ES,	для доступа к	    +
    537				     переменным
    538	07C0  07			     pop ES
    539
    540	07C1  B8 2509			     mov AX, 2509h
    541	07C4  26: 8B 16	0581r		     mov DX, ES:old_int9hOffset		     ; возвращаем вектор	    +
    542				     прерывания 09h на место
    543	07C9  26: 8E 1E	0583r		     mov DS, ES:old_int9hSegment
    544	07CE  CD 21			     int 21h
    545
    546	07D0  B8 251C			     mov AX, 251Ch
    547	07D3  26: 8B 16	0585r		     mov DX, ES:old_int1ChOffset	     ; возвращаем вектор	    +
    548				     прерывания 1Ch на место
    549	07D8  26: 8E 1E	0587r		     mov DS, ES:old_int1ChSegment
    550	07DD  CD 21			     int 21h
    551
    552	07DF  B8 252F			     mov AX, 252Fh
    553	07E2  26: 8B 16	0589r		     mov DX, ES:old_int2FhOffset	     ; возвращаем вектор	    +
    554				     прерывания 2Fh на место
    555	07E7  26: 8E 1E	058Br		     mov DS, ES:old_int2FhSegment
    556	07EC  CD 21			     int 21h
    557
    558	07EE  2E: 8E 06	002C		     mov ES, CS:2Ch			     ; загрузим	в ES адрес	    +
    559				     окружения
    560	07F3  B4 49			     mov AH, 49h			     ; выгрузим	из памяти	    +
    561				     окружение
    562	07F5  CD 21			     int 21h
    563	07F7  72 0B			     jc	_notRemove
    564
    565	07F9  0E			     push CS
    566	07FA  07			     pop ES				     ; в ES - адрес резидентной    +
    567				     программы
    568	07FB  B4 49			     mov AH, 49h			     ; выгрузим	из памяти	    +
    569				     резидент
    570	07FD  CD 21			     int 21h
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 11
test.asm



    571
    572	07FF  72 03			     jc	_notRemove
    573	0801  EB 15 90			     jmp _unloaded
    574
    575	0804				 _notRemove:				     ; не удалось выполнить	    +
    576				     выгрузку => вывод ошибки
    577	0804  B4 03			     mov AH, 03h			     ; получаем	позицию курсора
    578	0806  CD 10			     int 10h
    579	0808  BD 0644r			     lea BP, noRemoveMsg
    580	080B  B9 0037			     mov CX, noRemoveMsg_length
    581	080E  B3 07			     mov BL, 0111b
    582	0810  B8 1301			     mov AX, 1301h
    583	0813  CD 10			     int 10h
    584	0815  EB 12 90			     jmp _2Fh_exit
    585
    586	0818				 _unloaded:				     ; выгрузка	прошла успешно +
    587				     =>	вывод сообщения
    588	0818  B4 03			     mov AH, 03h			     ; получаем	позицию курсора
    589	081A  CD 10			     int 10h
    590	081C  BD 0610r			     lea BP, removedMsg
    591	081F  B9 0034			     mov CX, removedMsg_length
    592	0822  B3 07			     mov BL, 0111b
    593	0824  B8 1301			     mov AX, 1301h
    594	0827  CD 10			     int 10h
    595
    596	0829				 _2Fh_exit:
    597	0829  5B 5A 07 1F		     pop BX DX ES DS
    598	082D  CF			     iret
    599	082E				 new_int2Fh endp
    600
    601					 ; обработчик	прерывания int 1Ch
    602					 ; вызывается	каждые 55	мс
    603	082E				 new_int1Ch proc far
    604	082E  50			     push AX
    605	082F  0E			     push CS
    606	0830  1F			     pop DS
    607
    608	0831  9C			     pushf
    609	0832  2E: FF 1E	0585r		     call dword	ptr CS:[old_int1ChOffset]    ; вызываем	стандартный	    +
    610				     обработчик прерывания
    611
    612	0837  80 3E 011Er FF		     cmp signaturePrintingEnabled, true	     ; если	нажата управляющая +
    613				     клавиша (в	данном случае F1)
    614	083C  75 1B			     jne _notToPrint
    615
    616	083E  83 3E 011Fr 25		     cmp counter, printDelay*1000/55 + 1     ; если	кол-во "тактов"	    +
    617				     равно	printDelay секундам
    618	0843  74 03			     je	_letsPrint
    619
    620	0845  EB 0E 90			     jmp _dontPrint
    621
    622	0848				 _letsPrint:
    623	0848  F6 16 011Er		     not signaturePrintingEnabled
    624	084C  C7 06 011Fr 0000		     mov counter, 0
    625	0852  E8 0016			     call printSignature		     ; выводим подпись на экран
    626
    627	0855				 _dontPrint:
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 12
test.asm



    628	0855  FF 06 011Fr			 inc counter			     ; увеличим	значение	    +
    629				     счетчика на 1
    630
    631	0859				 _notToPrint:
    632	0859  58			     pop AX
    633	085A  CF			     iret
    634	085B				 new_int1Ch endp
    635
    636					 ; выводит одну строку	подписи
    637	085B				 printSignatureLine proc
    638	085B  52			     push DX
    639	085C  8B 0E 0121r		     mov CX, signatureLineLength
    640	0860  B3 07			     mov BL, 0111b			     ; цвет	выводимого текста
    641	0862  B8 1301			     mov AX, 1301h			     ; AH = 13h	- номер ф-ии, AL = 01h -    +
    642				     перемещение курсора
    643	0865  CD 10			     int 10h
    644	0867  5A			     pop DX
    645	0868  FE C6			     inc DH
    646	086A  C3			     ret
    647	086B				 printSignatureLine endp
    648
    649					 ; процедура вывода подписи
    650	086B				 printSignature	proc
    651	086B  50 52 51 53 06 54	55+	     push AX DX	CX BX ES SP BP SI DI
    652	      56 57
    653
    654	0874  33 C0			     xor AX, AX				     ; обнуляем	значения	    +
    655				     регистров
    656	0876  33 DB			     xor BX, BX
    657	0878  33 D2			     xor DX, DX
    658
    659	087A  B4 03			     mov AH, 03h			     ; чтение текущей позиции   +
    660				     курсора
    661	087C  CD 10			     int 10h
    662	087E  52			     push DX				     ; помещаем	информацию о	    +
    663				     положении	курсора в стек
    664
    665	087F  BA 090F			     mov DX, 090Fh			     ; NB! вверху: 000Fh,			    +
    666				     посередине: 090Fh, внизу: 130Fh
    667
    668	0882				 _actualPrint:
    669	0882  B4 0F			     mov AH, 0Fh			     ; чтение текущего		    +
    670				     видеорежима. в	BH - текущая страница
    671	0884  CD 10			     int 10h
    672
    673	0886  0E			     push CS
    674	0887  07			     pop ES				     ; указываем ES на CS
    675
    676	0888  BD 01DAr			     lea BP, tableTop
    677	088B  E8 FFCD			     call printSignatureLine		     ; выводим верх таблицы
    678	088E  BD 0123r			     lea BP, signatureLine1
    679	0891  E8 FFC7			     call printSignatureLine		     ; выводим первую строку
    680	0894  BD 0169r			     lea BP, signatureLine2
    681	0897  E8 FFC1			     call printSignatureLine		     ; выводим вторую строку
    682	089A  BD 019Fr			     lea BP, signatureLine3
    683	089D  E8 FFBB			     call printSignatureLine		     ; выводим третью строку
    684	08A0  BD 0276r			     lea BP, tableBottom
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 13
test.asm



    685	08A3  E8 FFB5			     call printSignatureLine		     ; выводим низ таблицы
    686
    687	08A6  33 DB			     xor BX, BX
    688	08A8  5A			     pop DX				     ; восстанавливаем из	    +
    689				     стека	прежнее положение курсора
    690	08A9  B4 02			     mov AH, 02h			     ; меняем положение		    +
    691				     курсора на первоначальное
    692	08AB  CD 10			     int 10h
    693
    694	08AD  5F 5E 5D 5C 07 5B	59+	     pop DI SI BP SP ES	BX CX DX AX
    695	      5A 58
    696	08B6  C3			     ret
    697	08B7				 printSignature	endp
    698
    699					 ; Основная часть программы
    700					 ; 1) установка видеорежима
    701					 ; 2) проверка,	запущен ли резидент
    702					 ; 3) установка вектора	прерываний
    703	08B7				 _initTSR:
    704	08B7  B4 03			     mov AH, 03h
    705	08B9  CD 10			     int 10h
    706	08BB  52			     push DX
    707	08BC  B4 00			     mov AH, 00h			     ; установка видеорежима
    708	08BE  B0 83			     mov AL, 83h
    709	08C0  CD 10			     int 10h
    710	08C2  5A			     pop DX
    711	08C3  B4 02			     mov AH, 02h
    712	08C5  CD 10			     int 10h
    713
    714	08C7  E8 009F			     call commandParamsParser		     ; читаем аргументы		    +
    715				     командной	строки
    716	08CA  80 3E 055Dr 02		     cmp commandLineResult, 2		     ; если	результат = 2,	значит+
    717				     была выведена справка
    718	08CF  75 03			     jne _shouldContinue		     ; соответственно, никаких +
    719				     других действий делать	не нужно
    720	08D1  E9 0093			     jmp _exit
    721	08D4				 _shouldContinue:
    722	08D4  80 3E 055Dr 01		     cmp commandLineResult, 1		     ; проверяем результат	    +
    723				     работы процедуры
    724	08D9  75 14			     jne _go_on
    725	08DB  B4 FF			     mov AH, 0FFh
    726	08DD  B0 00			     mov AL, 0
    727	08DF  CD 2F			     int 2Fh
    728	08E1  80 FC 69			     cmp AH, 'i'			     ; проверка	того, загружена+
    729				     ли уже программа
    730	08E4  74 64			     je	_remove
    731
    732	08E6  B4 09			     mov AH, 09h
    733	08E8  BA 05E1r			     lea DX, notInstalledMsg		     ; не была загружена
    734	08EB  CD 21			     int 21h
    735	08ED  CD 20			     int 20h
    736	08EF				 _go_on:
    737	08EF  B4 FF			     mov AH, 0FFh			     ; проверка	того, что	    +
    738				     резидент уже запущен
    739	08F1  B0 00			     mov AL, 0
    740	08F3  CD 2F			     int 2Fh
    741	08F5  80 FC 69			     cmp AH, 'i'			     ; если	запущена, то AH = 'i'	    +
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 14
test.asm



    742				     (см. процедуру new_int2Fh)
    743	08F8  74 64			     je	_alreadyInstalled
    744
    745	08FA  B8 3509			     mov AX, 3509h			     ; получить	в ES:BX		    +
    746				     прерывания 09h
    747	08FD  CD 21			     int 21h
    748	08FF  2E: 89 1E	0581r		     mov word ptr CS:old_int9hOffset, BX     ; обработчик прерывания 09h
    749	0904  2E: 8C 06	0583r		     mov word ptr CS:old_int9hSegment, ES
    750	0909  B8 2509			     mov AX, 2509h			     ; установим вектор на	    +
    751				     прерывание 09h
    752	090C  BA 067Br			     mov DX, offset new_int9h
    753	090F  CD 21			     int 21h
    754
    755	0911  B8 351C			     mov AX, 351Ch			     ; получить	в ES:BX		    +
    756				     прерывания 1Ch
    757	0914  CD 21			     int 21h
    758	0916  2E: 89 1E	0585r		     mov word ptr CS:old_int1ChOffset, BX    ; обработчик прерывания 1Ch
    759	091B  2E: 8C 06	0587r		     mov word ptr CS:old_int1ChSegment,	ES
    760	0920  B8 251C			     mov AX, 251Ch			     ; установим вектор на	    +
    761				     прерывание 1Ch
    762	0923  BA 082Er			     mov DX, offset new_int1Ch
    763	0926  CD 21			     int 21h
    764
    765	0928  B8 352F			     mov AX, 352Fh			     ; получить	в ES:BX		    +
    766				     прерывания 2Fh
    767	092B  CD 21			     int 21h
    768	092D  2E: 89 1E	0589r		     mov word ptr CS:old_int2FhOffset, BX    ; обработчик прерывания 2Fh
    769	0932  2E: 8C 06	058Br		     mov word ptr CS:old_int2FhSegment,	ES
    770	0937  B8 252F			     mov AX, 252Fh			     ; установим вектор на	    +
    771				     прерывание 2Fh
    772	093A  BA 07A1r			     mov DX, offset new_int2Fh
    773	093D  CD 21			     int 21h
    774
    775	093F  BB 058Dr			     lea BX, installedMsg		     ; выводим сообщение, что    +
    776				     всё ОК
    777	0942  E8 0061			     call printStr
    778
    779	0945  BA 08B7r			     mov DX, offset _initTSR		     ; остаемся	в памяти	и	    +
    780				     выходим из основной части
    781	0948  CD 27			     int 27h
    782
    783	094A				 _remove:				     ; выгрузка	из памяти
    784	094A  06			     push ES
    785	094B  A1 002C			     mov AX, DS:[2Ch]			     ; PSP
    786	094E  8E C0			     mov ES, AX
    787	0950  B4 49			     mov AH, 49h			     ; хватит памяти чтоб	    +
    788				     остаться резидентом?
    789	0952  CD 21			     int 21h
    790	0954  07			     pop ES
    791
    792	0955  B4 FF			     mov AH, 0FFh
    793	0957  B0 01			     mov AL, 1
    794	0959  CD 2F			     int 2Fh
    795	095B  EB 0A 90			     jmp _exit
    796	095E				 _alreadyInstalled:			     ; резидент	уже запущен
    797	095E  BB 05B0r			     lea BX, alreadyInstalledMsg
    798	0961  E8 0042			     call printStr
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 15
test.asm



    799	0964  EB 01 90			     jmp _exit
    800	0967				 _exit:					     ; выход
    801	0967  CD 20			     int 20h
    802
    803					 ; парсер	аргментов командной строки. выводит	    +
    804				     справку.
    805					 ; устанавливает флаг commandLineResult:
    806					 ; 0 = всё ОК; 1 =	нужна выгрузка; 2 = была выведена	    +
    807				     справка, не нужно загружать	резидент
    808	0969				 commandParamsParser proc
    809	0969  0E			     push CS
    810	096A  07			     pop ES
    811
    812	096B  BE 0080			     mov SI, 80h			     ; SI = смещение командной	    +
    813				     строки
    814	096E  AC			     lodsb				     ; получим кол-во символов
    815	096F  0A C0			     or	AL, AL				     ; если	0 символов введено,
    816	0971  74 2D			     jz	_paramParsingEnd		     ; то все в порядке
    817
    818	0973				 _nextChar:
    819	0973  46			     inc SI				     ; теперь SI указывает на	    +
    820				     первый символ строки
    821
    822	0974  80 3C 00			     cmp [SI], BYTE ptr	0
    823	0977  74 27			     je	_paramParsingEnd
    824
    825	0979  AD			     lodsw				     ; получаем	два символа
    826	097A  3D 3F2F			     cmp AX, '?/'
    827	097D  74 16			     je	_displayHelp
    828	097F  3D 752F			     cmp AX, 'u/'
    829	0982  74 07			     je	_finishTSR
    830	0984  3D 552F			     cmp AX, 'U/'
    831	0987  74 02			     je	_finishTSR
    832	0989  EB E8			     jmp _nextChar
    833
    834	098B				 _finishTSR:
    835	098B  C6 06 055Dr 01		     mov commandLineResult, 1		     ; флаг	того, что		    +
    836				     необходимо выгрузить резидент
    837	0990  EB E1			     jmp _nextChar
    838
    839	0992  EB 0C 90			     jmp _paramParsingEnd
    840	0995				 _displayHelp:
    841	0995  BB 0312r			     lea BX, helpMsg			     ; выводим справку
    842	0998  E8 000B			     call printStr
    843	099B  C6 06 055Dr 02		     mov commandLineResult, 2		     ; флаг	того, что резидент   +
    844				     загружать	не надо
    845
    846	09A0				 _paramParsingEnd:
    847	09A0  C3			     ret
    848	09A1				commandParamsParser endp
    849
    850					 ; отображает	символ из AL
    851	09A1				 printChar proc
    852	09A1  B4 0E			     mov AH, 0EH
    853	09A3  CD 10			     int 010H
    854	09A5  C3			     ret
    855	09A6				 printChar endp
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 16
test.asm



    856
    857					 ; отображает	нуль-терминированную	строку из [BX]
    858	09A6				 printStr proc
    859	09A6  52 50			     push DX AX
    860	09A8  8B 07			     mov AX, [BX]
    861	09AA				 _printStrLoop:
    862	09AA  3C 00			     cmp AL, 0
    863	09AC  74 08			     je	_printStrEnd
    864	09AE  E8 FFF0			     call printChar
    865	09B1  43			     inc BX
    866	09B2  8B 07			     mov AX, [BX]
    867	09B4  EB F4			     jmp _printStrLoop
    868	09B6				 _printStrEnd:
    869	09B6  58 5A			     pop AX DX
    870	09B8  C3			     ret
    871	09B9				 printStr endp
    872
    873	09B9			     code ends
    874				     end _start
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 17
Symbol Table




Symbol Name			  Type	 Value

??DATE				  Text	 "05/22/18"
??FILENAME			  Text	 "test	  "
??TIME				  Text	 "22:48:53"
??VERSION			  Number 030A
@CPU				  Text	 0101H
@CURSEG				  Text	 CODE
@FILENAME			  Text	 TEST
@WORDSIZE			  Text	 2
ALREADYINSTALLEDMSG		  Byte	 CODE:05B0
CHANGEFONT			  Near	 CODE:0783
CHARTOCURSIVEINDEX		  Byte	 CODE:056F
COMMANDLINERESULT		  Byte	 CODE:055D
COMMANDPARAMSPARSER		  Near	 CODE:0969
COUNTER				  Word	 CODE:011F
CURSIVEENABLED			  Byte	 CODE:055E
CURSIVESYMBOL			  Byte	 CODE:055F
HELPMSG				  Byte	 CODE:0312
HELPMSGLENGTH			  Number 024B
IGNOREDCHARS			  Byte	 CODE:0103
IGNOREDLENGTH			  Byte	 CODE:0108
IGNOREENABLED			  Byte	 CODE:0109
INSTALLEDMSG			  Byte	 CODE:058D
NEW_INT1CH			  Far	 CODE:082E
NEW_INT2FH			  Near	 CODE:07A1
NEW_INT9H			  Far	 CODE:067B
NOREMOVEMSG			  Byte	 CODE:0644
NOREMOVEMSG_LENGTH		  Number 0037
NOTINSTALLEDMSG			  Byte	 CODE:05E1
OLD_INT1CHOFFSET		  Word	 CODE:0585
OLD_INT1CHSEGMENT		  Word	 CODE:0587
OLD_INT2FHOFFSET		  Word	 CODE:0589
OLD_INT2FHSEGMENT		  Word	 CODE:058B
OLD_INT9HOFFSET			  Word	 CODE:0581
OLD_INT9HSEGMENT		  Word	 CODE:0583
PRINTCHAR			  Near	 CODE:09A1
PRINTDELAY			  Number 0002
PRINTSIGNATURE			  Near	 CODE:086B
PRINTSIGNATURELINE		  Near	 CODE:085B
PRINTSTR			  Near	 CODE:09A6
REMOVEDMSG			  Byte	 CODE:0610
REMOVEDMSG_LENGTH		  Number 0034
SAVEDSYMBOL			  Byte	 CODE:0571
SAVEFONT			  Near	 CODE:0792
SIGNATURELINE1			  Byte	 CODE:0123
SIGNATURELINE2			  Byte	 CODE:0169
SIGNATURELINE3			  Byte	 CODE:019F
SIGNATURELINELENGTH		  Word	 CODE:0121
SIGNATUREPRINTINGENABLED	  Byte	 CODE:011E
TABLEBOTTOM			  Byte	 CODE:0276
TABLETOP			  Byte	 CODE:01DA
TOGGLECURSIVE			  Near	 CODE:0736
TRANSLATEENABLED		  Byte	 CODE:011D
TRANSLATEFROM			  Byte	 CODE:010A
TRANSLATELENGTH			  Byte	 CODE:011C
Turbo Assembler	 Version 3.1	    05/22/18 22:48:53	    Page 18
Symbol Table



TRANSLATETO			  Byte	 CODE:0110
TRUE				  Number 00FF
_2FH_DEFAULT			  Near	 CODE:07B1
_2FH_EXIT			  Near	 CODE:0829
_ACTUALPRINT			  Near	 CODE:0882
_ALREADYINSTALLED		  Near	 CODE:095E
_ALREADYINSTALLED2FH		  Near	 CODE:07B6
_BLOCK				  Near	 CODE:0703
_CHECKIGNORED			  Near	 CODE:06F7
_CHECKTRANSLATE			  Near	 CODE:070B
_CHECKTRANSLATELOOP		  Near	 CODE:0719
_DISPLAYHELP			  Near	 CODE:0995
_DONTPRINT			  Near	 CODE:0855
_EXIT				  Near	 CODE:0967
_EXITTOGGLECURSIVE		  Near	 CODE:0780
_F1				  Near	 CODE:06A2
_F2				  Near	 CODE:06B3
_F3				  Near	 CODE:06C7
_F4				  Near	 CODE:06D8
_FINISHTSR			  Near	 CODE:098B
_GO				  Near	 CODE:069F
_GO_ON				  Near	 CODE:08EF
_INITTSR			  Near	 CODE:08B7
_LETSPRINT			  Near	 CODE:0848
_NEXTCHAR			  Near	 CODE:0973
_NOTREMOVE			  Near	 CODE:0804
_NOTTOPRINT			  Near	 CODE:0859
_PARAMPARSINGEND		  Near	 CODE:09A0
_PRINTSTREND			  Near	 CODE:09B6
_PRINTSTRLOOP			  Near	 CODE:09AA
_QUIT				  Near	 CODE:072E
_REMOVE				  Near	 CODE:094A
_RESTORESYMBOL			  Near	 CODE:0771
_SHIFTTABLE			  Near	 CODE:0748
_SHOULDCONTINUE			  Near	 CODE:08D4
_START				  Near	 CODE:0100
_TEST_FX			  Near	 CODE:06A2
_TRANSLATE			  Near	 CODE:0725
_TRANSLATEORIGNORE		  Near	 CODE:06E9
_UNINSTALL			  Near	 CODE:07B9
_UNLOADED			  Near	 CODE:0818

Groups & Segments		  Bit Size Align  Combine Class

CODE				  16  09B9 Para	  none	  CODE
