2009년 12월 25일 금요일

**인터럽트 명령어 영문으로 모두 있는 곳**

http://webpages.charter.net/danrollins/techhelp/0228.HTM

어셈 명령어

http://simulz.com/254

2009년 12월 24일 목요일

바이러스

안녕하세요.

7번째 시간입니다.

유명 컴퓨터 바이러스의 분석을 하겠습니다.
9회까지 바이러스에 대한 모든것은 끝나고 10회부터
유닉스&인터넷 강좌/해킹으로 들어갑니다.



5-1 기존 바이러스 분석

기존 몇몇 바이러스의 찾기와 분석이다.

5-1-1 크리스 마스 바이러스


증상은 크리스마스에 일정시간뒤 고요한밤 거룩한 밤을 연주한다.


0270 58C3 01 00 00 00 00 20-4D 65 72 72 79 20 43 68 X껦.... Merry Ch
0280 7269 73 74 6D 61 73 20-61 6E 64 20 68 61 70 70 ristmas and happ
0290 7920 6E 65 77 20 79 65-61 72 20 21 20 20 57 72 y new year ! Wr
02A0 6974 74 65 6E 20 66 72-6F 6D 20 54 61 6D 73 75 itten from Tamsu
02B0 6920 4F 78 66 6F 72 64-20 63 6F 6C 6C 65 67 65 i Oxford college
02C0 2E20 20 24 10 03 23 00-70 03 0F 00 10 03 19 00 . $ 606 부터


감염 파일이름이 있다.
단, 파일 길이(경로 포함)가 24자 이상은 감염되지 않는다.



5-1-2 원숭이 바이러스 (Monkey Virus) 분석내용.


1. 부트 섹터에 감염된 모습

0100 EB 1E 90 49 42 4D 20 50-4E 43 49 00 02 01 01 00 ...IBM PNCI.....
0110 02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00 ...@............
0120 FA 2B DB 8E DB 8E D3 BC-00 7C EA 2F 00 C0 07 CD .+.......|./....
0130 12 BE 4C 00 56 2E 80 3E-F2 00 02 74 0E E8 C5 00 ..L.V..>...t....
0140 BF FC 01 B9 02 00 FC F3-A5 EB 03 E8 BE 00 5E C7 ..............^.
0150 04 7D 00 89 44 02 0E 1F-E8 30 01 06 B8 62 00 50 .}..D....0...b.P
0160 FB CB 8E C1 8B DC 51 53-BA 80 00 E8 59 01 E8 AD ......QS....Y...
0170 00 B1 0E BA 00 01 E8 82-00 E8 36 01 CB 1E 56 57 ..........6...VW

0180 50 51 52 E8 41 01 80 FC-02 75 0E 52 2B C0 CD 1A PQR.A....u.R+...
0190 80 FA 40 5A 73 03 E8 85-00 5A 59 58 5F 52 51 50 ..@Zs....ZYX_RQP
01A0 83 F9 03 73 3A 3A 34 75-36 80 FC 02 74 0E 80 FC ...s::4u6...t...
01B0 03 75 2C 80 FA 80 72 27-2A E4 EB 23 E8 3F 00 72 .u,...r'*..#.?.r
01C0 21 E8 DE 00 74 08 E8 E1-00 74 03 F8 EB 14 E8 04 !...t....t......
01D0 01 8A 74 01 58 E8 26 00-E8 D7 00 59 5A EB 06 E8 ..t.X.&....YZ...
01E0 1C 00 1F 1F 1F 5E 1F CA-02 00 00 01 01 00 00 00 .....^..........
01F0 00 80 01 00 05 09 0B 03-05 0E 0E B8 01 02 9C 2E ................

0200 FF 1E FC 01 C3 48 BF 14-04 4F 89 05 B1 06 D3 E0 .....H...O......
0210 04 20 8E C0 C3 8A 34 B8-01 03 E8 E1 FF C3 2B C9 . ....4.......+.
0220 41 51 8A 34 E8 D4 FF 72-60 E8 76 00 74 5B E8 79 AQ.4...r`.v.t[.y
0230 00 75 21 26 83 BF FA 01-00 74 4E 26 C7 87 FA 01 .u!&.....tN&....
0240 00 00 B1 01 E8 CE FF 72-40 41 8A 74 02 E8 AB FF .......r@A.t....
0250 72 37 58 51 E8 7E 00 E8-58 00 46 E8 B7 FF 4E 72 r7XQ.~..X.F...Nr
0260 28 E8 4E 00 51 E8 23 00-59 52 8A 54 03 26 89 97 (.N.Q.#.YR.T.&..
0270 74 00 5A 26 88 8F 72 00-26 C7 87 FE 01 55 AA 59 t.Z&..r.&....U.Y

0280 51 26 88 8F F2 00 E8 8C-FF 58 C3 56 8B FB BE 20 Q&.......X.V...
0290 00 03 FE B9 DC 01 F3 A4-8B FB 2B F6 B1 03 F3 A4 ..........+.....
02A0 5E C3 26 81 BF FA 01 19-92 C3 26 81 BF 19 01 50 ^.&.......&....P
02B0 61 C3 57 51 50 8B FB B9-00 02 FC 26 8A 05 34 2E a.WQP......&..4.
02C0 AA E2 F8 58 59 5F C3 0E-1F BE EA 00 80 FA 80 72 ...XY_.........r
02D0 03 BE EE 00 C3 57 56 26-8A 47 14 B9 04 00 8B F1 .....WV&.G......
02E0 4E 38 84 F3 00 74 06 E2-F5 B1 03 EB 04 8A 8C F7 N8...t..........
02F0 00 5E 5F C3 5D 7F 7E 7B-75 89 19 92 00 00 55 AA .^_.].~{u.....U.

2. 분석결과.

원숭이 바이러스는 외국산 부트 바이러스로써, int 13h, int 1ah를 사용하며,
이중 int 13h를 가로채어 a01f:01fch 를 가리키게 변경을 하고 원래의 int 13h
의 오프셑번지는 01fdh에 저장을 해 놓는다.

자신의 감염여부를 확인한 후, 최초의 감염이면 맨먼저 자신이 들어갈수 있는
메모리를 1KB 확보를 한 후, 0 head 0 cylinder 1 sector (플로피인경우 부트섹
터, 하드인경우 마스터 부트 섹터) 부분을 0003:7c00번지로 읽어들여 "2E"값과
각각 XOR(eXclusive OR)시켜 0 head 0 cylinder 3 sector (둘다 첫번째 FAT영
역)
에 옮긴후, 자신은 0 head 0 cylinder 1 sector 부분에 복사를 한다. 그 다음
1 head 0 cylinder(랜덤처리 되기 때문에 바뀔수가 있다) 14 sector 부분을
0003:7c00으로 옮겨 놓은 후, 디스크에다 어떤작업을 할 때, 메모리에 이미 존
재 하는 엉뚱한 내용을 읽거나 쓴다.

또한, 원래 0 head 0 cylibder 1 sector 에 있던 내용이 첫번째 FAT영역에 겹
쳐 써지므로 중요한 자료들을 날리게 된다.

(FAT영역은 두개가 있으므로 잘 하면 복구가 가능하기도 하다)

치료방법은 감염에 대한 역순으로 진행을 하면 되는데,,,
이미, 엉뚱한 값들이 디스크에 써지지 않았다고 가정을 하면...
먼저, 0 head 0 cylinder 3 sector 에 있는 암호화된 섹터를 풀어서 원래의
자리고 옮기고, 두번째 FAT영역을 읽어 거기에 해당하는 섹터를 써주면 된다.



5-1-3 4월 24일 (April 24th) 바이러스


4월 24일 바이러스는 한국산 파일 바이러스이다. 1994년 4월달에 발견되었다. 이
바이러스는 예루살렘 바이러스의 변형이다.

COMMAND.COM,SCAN.EXE,CLEAN.EXE,V3.COM,V3RES.EXE,VSHIELD
.COM 을 제외한 모든 COM,EXE 파일에 감염된다.

증상
4월 24일날 파일을 실행하면 그 파일을 실행시키고 끝난후에 사용중인 디스크를
포맷한다. 그리고 하드를 포맷하려고 했는것 같으나 하드는 포맷시키지 못한다.
7월 23일 원래 프로그램을 실행 시킨후 지워버린다.
이날이 아니라도 램 상주 30분 후에 화면의 일부를 올리고 컴퓨터의 속도를 떨어
뜨린다.
실행할때만 감염되며 은폐기법이나 암호화는 사용하지 않는다.
바이러스 내부의 암호화 된 부분을 풀어보면 다음과 같은말을 볼 수 있다.

60A07D 00 00 B9 41 2A 7B-43 4F 4D 4D 41 4E 44 2E ......*{COMMAND.
70434F 4D 53 43 41 4E 2E-45 58 45 43 4C 45 41 4E COMSCAN.EXECLEAN
802E45 58 45 56 33 2E 43-4F 4D 56 33 52 45 53 2E .EXEV3.COMV3RES.
904558 45 56 53 48 49 45-4C 44 2E 43 4F 4D 00 00 EXEVSHIELD.COM..

COM 은 1587 증가하며 EXE 은 16의 배수가 된후 증가한다.
일부의 컴퓨터에서 램상주시 정지할 수 있다.
SCAN 으로 진단이 되는데 예루살렘 변형이라고 나온다.


5-1-4 Brain 바이러스

1986.6월,파키스탄의 Lahore,두 형제(배시트와 암자드 알비)가 개발하였다.
부트 섹터 감염자이다.


1. 특징
가. Original 부트 섹터를 교체
나. Original 부트 섹터를 다른 장소로 이동 (불량 클러스터 앞부분)
다. 바이러스 잔류자를 포함한 7개의 섹터가 변경
라. 바이러스 보호를 위해 변경된 3 클러스터를 사용불가로 표시
(연속된 할당되지 않은 3클러스트)
마. 플로피 디스크의 뵈첼동껦감염
바. 메모리 크기를 7 K 감소
사. 하드 디스크는 감염 시키지 않음
아. 감염된 디스크의 sector 0에 "(c) Brain" 스트링이 있음
자. 시스템이 감염된후 어떤 프로그램이 Boot Sector를 읽으면 감염된
boot sector가 아닌 original boot sector를 읽도록 속임


2. 감염경로
가. 감염된 디스크로 부팅하면 바이러스 프로그램이 메모리에 상주
나. 상주후 INT 13H 번 수행시 감염시킨다.


3. 감염증상
가. 볼륨 레이블이 "(c) Brain"으로 나타남
나. 재부팅 과정에서 속도가 느려짐
다. 단순 작업에도 플로피가 과도하게 작동
라. 일부 DOS 버젼에서 프로그램 파괴
마. 인터럽트 벡터의 변경


4. 감염여부검진


가. Debug 이용


a>또는 c> 에서 debug

-l100 0 0 1
-d FA E9 4A 01 34 12 00 09 ..J.4... .. ....
-- --
-d Welcome to the
Dungeon
(c) 1986 Brain.&


이렇게 해보면 우측 맨위 5번째 HEX값이 34 12 로 나타나면 감염된 것임.
(원래는 MS-DOS로 나타나거나 PCTOOLS등 포멧한 유틸리티명이 나타남)
나. Utility 이용 (PCTOOLS, NORTON, MACE)
View Edit 기능으로 들어가 Boot Sector에서 Debug 에서와 같은 메세지가
나타나면 바이러스에 감염된 것임.
다. 검진 프로그램 이용
- ViruScan, F-Prot, IBM Scan, Pro-Scan
- V2PLUS, V3


5. 복구방법
가. 복구 프로그램 이용
- MDisk, CleanUp, F-Prot, Pro-Scan
- V2plus, V3
나. DOS SYS명령으로 부트 섹터를 재기록
다. 디스크 유틸리티 이용
- 볼륨 라벨 변경
- 불량섹타를 재생성 (3개의 연속된 불량클러스터에 바이러스 그대로 존재)


6. 예방대책
가. 출처 불명의 플로피로 부트하지 말 것
나. 하드 디스크가 있으면 그것으로 부팅
다. 모든 부팅가능 디스크에 write-protect


7. 변종

가. 증상 및 특징
1). 디스크상의 절대위치(Absolute sector # 656-661)에 바이러스가 전염
2). 그곳(전염위치)에 화일이 있거나 없거나 상관없이 전염
3). 볼륨라벨을 (c) Brain으로 바꾸지 않음
4). FAT(File Allocation Table)에 Bad Cluster Marking을 하지 않음
5). Hard Disk FAT의 전 Sector를 16 Sector 씩 Shift 시킴
6). (0 Sector를 16 Sector로, 1 Sectot를 17로)
7). original Brain virus는 플로피 디스크에 만 감염되나 변종은 풩盧디스크
에도 감염되게 변경됨 (Hard Disk로 Booting이 안됨)
8). 9ISKCOPY가 안됨 (DOS 파라메타 변경)
9). DATA DISK의 DATA 가 이유없이 깨짐
10).실제로 Brain 계열에서는 7킬로바이트의 주기억장치를 점유함
11).변형 Brain에 의해서 파괴된 데이터는 복구 되지 않음
- Hard Disk FAT의 전 Sector를 16 Sector 씩 Shift 시킨 변형 Brain일 경우는
디스크 유틸리티를 이용하여 다시 역순으로 16 Sector를 0 Sector로,
17 Sectot를 1로,.... Sector Copy를 하면 됨.
(그러나 끝부분에 있는 16 Sector의 Data는 복구 불가능)
나. 종류
1). Brain-B/Hard Disk Brain/Houston Virus
- 하드 디스크 감염
2). Brain-C
- Brain-B 에서 "(c) Brain" Label 이 삭제됨
3). Clone Virus
- Brain-C에서 original boot copyright label 저장
4). Clone-B
- Clone Virus를 92.5.5 이후에 FAT를 파괴하도록 수정

다. 참고 : Ashar


5-1-5 Dark Avenger 바이러스

1989년 9월, Bulgaria 에서 발견되었다.


1. 특징

가. open 되는 모든 수행 파일(COM, EXE, SYS, OVL 등)을 감염
나. COMMAND.COM 파일도 감염됨
다. 파일 사이즈가 1775 바이트(hex 6efh) 미만은 감염되지 않음
라. 플로피나 하드디스크가 감염가능
마. INT 13h, 40h, 41h를 가로챔
바. 이 바이러스는 Jerusalem 바이러스와 유사성은 없지만 사이즈는 비슷함
사. 감염된 프로그램은 다음 메세지가 포함되어 있음
"The Dark Avenger, copyright 1988, 1989"
"This program was written in the ty of Sofia.
Eddie lives.... Somewhere in Time!"

2. 감염경로

가. 감염된 프로그램이 수행되면 자신을 시스템 메모리 영역에 상주시킴
나. 이후 Open되는 수행 파일을 감염시킴

3. 감염증상

가. 일반적인 증상
= 1775 바이트 이상인 모든 실행 파일의 사이즈가 증가함
= 디스크 입출력 속도가 현저하게 저하
= 사용가능 시스템 메모리 옆₂껦감소
= 감염된 파일은 사이즈는 증가하나 파일의 날짜/시간 및 속성은 변경 안됨
- COM 파일 감염시 앞 3바이트를 바이러스 위치로 분기하도록 JMP 명령으로
대치하고 뒷부분에 1800 바이트 바이러스 코드를 첨가
- EXE 파일 감염시 header를 변경하고 파일을 16의 배수로 만든 다음
뒷부분에 바이러스를 첨가 (파일 사이즈가 1800 ?? 1815 바이트 증가)

나. 활동후 증상
= 디스크의 boot sector에 계수기를 가짐
= 16회 감염시마다 디스크의 boot sector를 random하게 한 sector에 복사함
- 파굘껦sector는 프로그램이건 데이타 파일이건 복구 불가능
- 복사된 Sector는 위의 메세지가 포함되어 있음
= 시스템이 자주 다운 됨
= 하드 디스크로 부팅이 안되는 경우가 있음

4. 감염여부검진

가. 검진 프로그램 이용
- ViruScan V36+, F-Prot, IBM Scan, Pro-Scan
- V3
나. 디스크 유틸리티를 이용하여 위에 있는 메세지를 확인

5. 복구방법

가. 전원을 내리고 write-protected 디스켓으로 부팅
나. 주의해서 복구 프로그램을 이용하여 바이러스를 제거
- M-DAV, CleanUp, Pro-Scan 1.4+, F-Prot
- V3
다. 제거 완료후 다시 검진 프로그램으로 확인

6. 예방대책

가. 출처불명의 소스로 부터의 프로그램은 실행시키지 말 것
나. 실행가능 코드를 내포한 디스크는 교환하지 말 것
다. 메모리의 배치와 프로그램 파일 크기를 감시할 것

5-1-6 Jerusalem 바이러스

파생된 바이러스로는, Jerusalem-B Virus , Jerusalem-C Virus , Jerusalem-D Virus
Jerusalem-E Virus , century virus , century-B virus
13일의 금요일 Virus , black hall , Hebrew Virus ,comvirus


1987.10, Jerusalem의 Hebrew 대학에서 발견되었다.


1. 특징

가. COM 또는 EXE 프로그램을 감염
나. 감염된 프로그램은 1813 바이트(.COM), 1808 바이트(.EXE) 사이즈를 증가시킴
다. 감염된 프로그램은 변형되어 메모리에 상주
라. 플로피나 하드디스크가 감염가능
마. INT 21h 번을 가로챔
바. INT 8h을 가로채서 감염된 프로그램 수행 이후 30 분마다 factor 10에 의해
시스템의 속도가 감소함
사. 메모리 상주하며 warm-reboot(CTL-ALT-DEL)후에도 계속 상주 가능
아. .EXE 파일일 경우는 바이러스 버그로 인해 계속해서 감염이 됨
자. Suriv 3.00 바이러스를 기초로 만들어진 것으로 생각됨

2. 감염경로

가. 감염된 EXE 및 COM 파일 수행시 메모리 상주
나. 이후 수행시키는 파일마다 파일크기를 증가시키면서 감염.

3. 감염증상

가. 일반적인 증상
- 시스템의 일반적인 속도저하
- 사용가능 시스템 메모리 용량이 감소
- COM 파일들은 한번만 감염
: 앞부분에 감염되며 사이즈가 1808 증가
- EXE 파일들은 계속해서 감염
: Header 파일을 변경하고 뒷부분에 감염되며 사이즈가 1813 증가

나. 13일의 금요일 증상
- INT 21h의 파일 삭제 기능을 이용하여 수행되는 프로그램을 삭제
- 일부 버젼은 하드디스크상의 모든 데이터 파괴

4. 감염여부검진

가. 검진 프로그램 이용
- ViruScan, F-Prot, IBM Scan, Pro-Scan, VirexPC 1.1+, AVTK 3.5+
- V2plus, V3
나. Disk Utility 및 Debug 이용
- 파일내 "sUMsDos" 문자열이 3번 이상 나타나면 감염

5. 복구방법

가. 삭제된 파일 복구
- Disk Utility를 이용하여 복구 (파일 UNDELETE 기능 이용)
나. 감염된 파일 복구
- 감염된 실행가능 파일은 감염되지 않은 프로그램으로 교체
- V2PLUS, V3 프로그램으로 복구
- 복구 프로그램 이용
Scan/D/A, M-JRUSLM, Saturday, CleanUp, UnVirus, F-Prot,
VirexPC 1.1+, Pro-Scan 1.4+

6. 예방대책

가. 출처불명의 소스로 부터의 프로그램은 실행시키지 말 것
나. 실행가능 코드를 내포한 디스크는 교환하지 말 것
다. 메모리의 배치와 프로그램 파일 크기를 감시할 것

7. 변종

가. 증상 및 특징
= 어떤 변종은 화면이 스크롤되고 화면의 좌하단에 까만 Black Box가 생김
= Jerusalem-B 경우
- .EXE 파일을 재 감염시키지 않음
- .COM 및 .EXE 파일외에 .SYS 및 .OVL 파일도 감염시킴
- Jerusalem B 바이러스의 모든 변종이 시스템 속도를 느리게 하진 아님

나. 종류
1). A-204
. ID 스트링이 "sUMsDos"에서 "*A-204*"로 변경됨
. 몇 개의 명령문이 검진을 피하기 위해 변경됨
. 30분 동안 메모리 상주후 시스템 속도를 느리게 함
. 화면에 black box가 나타남
. 출처 : Delft, The Netherlands
2). Anarkia
. ID 스트링이 "sUMsDos"에서 "ANARKIA"로 변경됨
. 시스템껦느리게 하는 정도를 더 크게 했지만 정상 동작 않음
. 화면에 black box가 나타나지 않음
. 활동시기를 13일의 화요일로 변경
. 출처 : Spain
3). Anarkia-B
. 활동시기가 10월 12일인 Anarkia 바이러스
4). Jerusalem-C
. 시스템 속도를 느리게 하지 않는 Jerusalem 바이러스
5). Jerusalem-D
. 1990년 이후 13일의 금요일에 FAT를 파괴하는 Jerusalem-C
6). Jerusalem-E
. 1992년에 활동하는 Jerusalem-D
7). Mendoza
. Jerusalem-B 바이러스 근거
. .EXE 파일을 계속해서 감염시키지 않음
. 활동 시기는 매년 7월 ?? 12월 (수행 프로그램의 10%만 삭제)

8). Puerto
. Mendosa 바이러스와 유사
. .EXE 파일을 계속해서 감염시킴
. ID 스트링 "sUMsDos"이 포함됨
9). Spanish JB
. Jerusalem 바이러스와 유사
. .COM 파일은 1808 바이트 사이즈가 증가
. .EXE 파일은 1808 혹은 1813 바이트 사이즈가 증가
(재 감염시 항상 1808 바이트 첨 )
. ID 스트링 "sUMsDos"이 포함되어 있지 않음
. Black Box가 생기지 않음
. 출처 : Spain
10).Jerusalem DC
. Jerusalem B 바이러스와 유사
. ID 스트링 "sUMsDos"이 00h 문자로 대치됨
. 30분 동안 메모리 상주후 시스템 속도를 30% 느리게 함
. Black Box가 화면의 좌측 하단에 나타남
. .EXE 파일을 계속해서 감염시킴
. 활동시기가 없이 감염되면 즉시 수행 파일을 삭제함
. 출처 : Washington, DC, USA

다. 참고 : Payday, Suriv 3.00, Frere Jacques, Westwood


5-1-7 LBC 바이러스

1989년 발견되었다.
대부분 국산 바이러스로 보고있다.

1. 특징
가. 0 섹터의 내용이 11 섹터(트랙:0, 면:1, 섹타:3)에 복사되어 있음.
나. Lbc Virus 자신이 0 섹터(트랙:0, 면:0, 섹타:1)에 들어 있음
다. Map으로 조사해 보면 bad cluster 가 나타나지 않음
라. 메모리 크기를 2 K 감소
마. 원래 플로피 디스크만 감염되게 제작되었으나 저작자의 실수로
하드 디스크의 Master Boot record(Partition Table)를 파괴함

2. 감염경로
가. 감염된 디스크로 부팅하면 바이러스 프로그램이 메모리에 상주
나. 상주후 INT 13h 수행시 플로피 디스크를 감염시킴
(시스템 디스켓이 아니라도 감염됨)

3. 감염증상
가. C: 드라이브로 부팅이 안됨
나. A: 드라이브로 부팅을 해도 C: 드라이브가 동작하지 않음
(Invalid Drive Spec 메세지가 출력껦
다. 플로피 디스크에서 이상한 소리가 좀 나거나 갑자기 read가 안되는
경우가 발생할 수 있음


4. 감염여부검진


가. Debug 이용

a>또는 c> 에서 debug
-l100 0 0 1
-d ....4.Eh3.....
-d
-d .. vires pr
ogram message
Njh to LBC


이렇게 해보면 좌측 텍스트부근에 위와 같이 ...Eh.... 문자가 나타나면
감염된 것임.
(원래는 ms-dos로 나타나거나 pctools등 포멧한 유틸리티명이 나타남)

나. Utility 이용 (PCTOOLS, NORTON, MACE)
View Edit 기능으로 들어가 Boot Sector에서 Debug 에서와 같은 메세지가
나타나면 바이러스에 감염된 것임.

다. 검진 프로그램 이용
- ViruScan V61+ 이후 버젼
- V2PLUS 혹은 V3

5. 복구방법

가. 감염된 Diskette 복구방법
1). 감염되지 않는 디스켓을 a:드라이브에 넣고 boot하거나 C:드라이브
에서 Boot 한다.
2). b:드라이브에 새로운 디스켓을 넣고 format 한다음 a:드라이브에
감염된 디스켓을 넣고 file copy를 하면 복구 됨.
(주의). diskcopy는 절대 사용치 말것.
3). 카피한 다음에는 바로 프로텍트를 붙일것.

나. Hard Disk 복구방법
1). Master Boot Sector 복구
-. A: 드라이브로 부팅 (감염되지 않은 DOS)
-. DOS의 FDISK 명령어 수행
-. DOS 파티션을 부트용으로 하나 만듬
-. A: 드라이브로 재 부팅 (감염되지 않은 DOS)
-. Disk Utility(Norton Utility)를 기동
-. 절대 섹타 카피
(실린드:0, 면:1, 섹타:3 ===> 실린드:0, 면:0, 섹타:1)

2). FAT 복구
= Disk Utility (Norton Utility 등)로 FAT에 바이러스가 복사해둔
프로그램 부분을 ??아 FAT 복사본을 Sector 단위로 그 위치에 복사.
- 즉 논리 Sector 59를 논리 Sector 18에 복사 (20M HDD 경우)
- 단, FAT 복사본도 같이 오염되어 있으면 오염된 2 Sector에 해당
되는 데이타는 복구할 방법이 없음.
- 거의 대부분을 회복시킬수 있으나 일부는 잃어 버릴 수도 있음.

다. 복구 프로그램 이용
V2plus, Killer, MDISK,

6. 예방대책
가. 디스켓에서 바이러스 검사후 미감염 디스켓은 write-protect
나. 외부로부터 온 디스크는 부트디스크로 사용하지 말 것
다. 하드디스크 사용자는 절대 A: 에서 부트하지 말 것
라. 게임 디스크는 거의 감염된 것으로 생각하고 대처할 것

7. 변종
가. 증상 및 특징
1). 기억 장소 3K 감소
2). 디스켓 끝에 한개의 불량 클러스터 만듬
3). 일정 시간껦메세지 출력
4). 메세지가 변경됨
나. 종류
1). LBC II


5-1-8 Stoned Virus |
Stoned-B, Stoned-C, Stoned-D, Stoned II 등으로 변종이 생겼다.
(별칭 : Hawaii, Marijuana, New Zealand, San Diego, Smithsonian)|
1988년 2월, New Zealand 에서 발견되었다.


1. 특징

가. Diskette 일 경우 : 0 섹터의 내용이 tr:0 he:1 Se:3 에 복사되어 있음
나. Hard 일 경우 : 0 섹터의 내용이 tr:0 he:0 Se:7 에 복사되어 있음
다. Stoned Virus 자신이 0 섹터에 들어 있음
라. 메모리 크기를 2 K 감소
마. 원종 Stoned는 360K 5 4/1" 디스켓 만 감염시키고 명백한 피해도 없음

2. 감염경로

가. 감염된 디스크로 부팅하면 바이러스 프로그램이 메모리에 상주
나. 상주후 INT 13H 번 가로채고 Access하는 디스켓을 감염시킴

3. 감염증상

가. 매 8회 시스템 부팅중 한번은 다음 메세지를 화면에 표시
"Your computer is now stoned. Legalize Marijuana"
나. 디스크 입출력 속도가 현저하게 느려짐

다. 디스켓일 경우
- 0 섹터의 내용이 ROOT DIR 부분(tr:0 he:1 Se:3)에 복사되어 있어
치명적인 데이타 손실은 없음
라. 하드 디스크일 경우
- 0 섹터의 내용이 FAT 부분(tr:0 he:0 Se:7)에 복사되어 있어 1 섹타
분의 데이타 손실
- 손실된 부분의 데이타를 읽을때 에러 발생


4. 감염여부검진

가. Debug 이용

a>또는 c> 에서 debug

-l100 0 0 1
-d ................
-d
-d .3........Your P
is now Stoned!
.....LEGALISE MA
RIJUANA



이렇게 해보면 우측 텍스트부근에 위와 같은 문자가 나타나면 감염된 것임.
(원래는 MS-DOS로 나타나거나 PCTOOLS등 포멧한 유틸리티명이 나타남)

나. Utility 이용 (PCTOOLS, NORTON, MACE)
View Edit 기능으로 들어가 Boot Sector에서 Debug 에서와 같은 메세지가
나타나면 바이러스에 감염된 것임.

다. 검진 프로그램 이용
- ViruScan, CleanUp, F-Prot, IBM Scan, Pro-Scan, VirexPC, AVTK 3.5+
- V2plus, V3

5. 복구방법

가. 감염된 Diskette 복구방법
1). 감염되지 않는 디스켓을 a:드라이브에 넣고 boot하거나 C:드라이브에서
Boot 한다.
2). b:드라이브에 새로운 디스켓을 넣고 format 한다음 a:드라이브에 감염된
디스켓을 넣고 file copy를 하면 복구 됨.
(주의). diskcopy는 절대 사용하지말것 dos부분까지 카피되기때문에
3). 카피한 다음에는 바로 프로텍트를 붙일것.

나. Hard Disk 복구방법
1). Master Boot Sector 복구
-.Disk Utility(Norton Utility)를 기동
-.절대 섹타 카피
(실린드:0, 면:0, 섹타:7 ===> 실린드:0, 면:0, 섹타:1)
2). FAT 복구
-.Disk Utility (pctools, Norton 등)로 FAT에 바이러스가 복사해 둔
프로그램 부분을 ??아 FAT 복사본을 Sector 단위로 그 위치에 복사.
- 즉 논리 Sector 46를 논리 Sector 5 에 복사 (20M 하드 디스크 경우)
- 단, FAT 복사본도 같이 오염되어 있으면 오염된 2 Sector에 해당되는
데이타는 복구할 방법이 없음.
- 거의 대부분을 회복시킬수 있으나 일부는 잃어 버릴 수도 있음.

다. 복구 프로그램 이용
- CleanUp, MDisk, F-Prot, Pro-Scan 1.4+, DOS SYS command
- V2plus, V3

6. 예방대책

가. 디스크의 Virus 검사후 미감염 디스크에는 write-protect
나. 외부로터 온 디스크는 부트디스크로 사용하지 말 것
다. 하드디스크 사용자는 절대 A: 에서 부트하지 말 것
라. 게임 디스크는 거의 감염된 것으로 생각하고 대처할 것

7. 변종

가. 증상 및 특징
-.하드 디스크를 감염시키는 2가지 변종이 있음
-.메세지가 변경되거나 삭제됨
-.고밀도 디스켓을 감염시킴

나. 종류
1). Stoned-B
-.Stoned 바이러스와 같으나 다음 내용이 다름
-.partition table을 통해 하드 디스크를 감염시킴
-.RLL controller가 설치된 시스템이 감염되면 자주 시스템 명령
대기 상태가 됨
2). Stoned-C
-.Stoned 바이러스와 같으나 다음 내용이 다름
-.화면에 표시되는 메세지가 삭제됨
3). Stoned-D
-.Stoned 바이러스와 같으나 다음 내용이 다름
-.3.5" 및 5.25" 고밀도 디스켓을 감염시킴

4). Stoned II
-.Stoned 바이러스와 같으나 다음 내용이 다름
-.백신 프로그램에 의한 검진이 쉽게 되지 않도록 수정됨
-.감염된 디스켓의 끝부분에 위치한 메세지가 다음과 같이 변경됨
"Your PC is now Stoned! Version 2"
혹은 "Donald Duck is a lie."
-.변종 중 메세지가 완전히 삭제된 것도 있음
-.메세지의 "Version 2" 부분은 복제시 파괴될 수 있음
-.이 바이러스의 감염 방법껦Stoned 바이러스와 같음
-.바이러스 상주후 재 부팅시 random 하게 메세지 출력
-.하드 디스크의 partition table에 감염됨
-.때때로 partition table 및 데이타가 파괴되는 경우가 있음

선 조합


int 10h , mov bl, 37h ; default attribute. 색상표


int 10 11 12 13 15 16 19 1a 20 21 33h

http://www.emu8086.com/assembly_language_tutorial_assembler_reference/8086_bios_and_dos_interrupts.html

2009년 12월 23일 수요일

int 10h ㅎㅎ

Set Video Mode

Call
AH = 00h
AL = Video Mode
Return
N/A


--------------------------------------------------------------------------------

Set Cursor Size

Call
AH = 01h
CH = Start scan line
CL = End scan line
Return
N/A


--------------------------------------------------------------------------------

Set Cursor Position

Call
AH = 02h
BH = Display Page
DH = Row
DL = Column
Return
N/A


--------------------------------------------------------------------------------

Get Cursor

Call
AH = 03h
BH = Display Page
Return
CH = Start scan line
CL = End scan line
DH = Row
DL = Column


--------------------------------------------------------------------------------

Get Pen Position

Call
AH = 04h
Return
AH = Pen trigger type
00 = Switch off
01 = Coordinate values
BX = Pixel column
CH = Pixel row (may be CX in higher res modes)
DH = Text row
DL = Text column


--------------------------------------------------------------------------------

Select Display Page

Call
AH = 05h
AL = Page number
Return
N/A


--------------------------------------------------------------------------------

Scroll Up

Call
AH = 06h
AL = Lines to scroll (0 = Clear screen)
BH = Blank line attribute
CH = Upper row
CL = Left column
DH = Lower row
DL = Right column
Return
N/A


--------------------------------------------------------------------------------

Scroll Down

Call
AH = 07h
AL = Lines to scroll (0 = Clear screen)
BH = Blank line attribute
CH = Upper row
CL = Left column
DH = Lower row
DL = Right column
Return
N/A


--------------------------------------------------------------------------------

Read Character and Attribute

Call
AH = 08h
BH = Page Number
Return
AH = Attribute
AL = Character


--------------------------------------------------------------------------------

Write Character and Attribute

Call
AH = 09h
AL = Character
BH = Page Number
BL = Attribute
CX = Repetitions
Return
N/A


--------------------------------------------------------------------------------

Write Character only at Cursor

Call
AH = 0Ah
AL = Character
BH = Page Number
CX = Repetitions
Return
N/A


--------------------------------------------------------------------------------

Set Border/Palette

Call
AH = 0Bh
BH = Mode
0 = Set Border Color
1 = Set Palette
BL = Palette/Color
Return
N/A


--------------------------------------------------------------------------------

Set Pixel

Call
AH = 0Ch
AL = Pixel Value
If bit 7 is set, then value is XOR-ed (not in 256 color mode)
BH = Page Number
CX = Pixel Column
DX = Pixel Row
Return
N/A


--------------------------------------------------------------------------------

Get Pixel

Call
AH = 0Dh
BH = Page Number
CX = Pixel Column
DX = Pixel Row
Return
AL = Pixel Value

int 16h 레퍼런스

Int 16/AH=00h - KEYBOARD - GET KEYSTROKE
Int 16/AH=01h - KEYBOARD - CHECK FOR KEYSTROKE
Int 16/AH=02h - KEYBOARD - GET SHIFT FLAGS
Int 16/AH=03h - KEYBOARD - SET TYPEMATIC RATE AND DELAY
Int 16/AH=04h - KEYBOARD - SET KEYCLICK (PCjr only)
Int 16/AH=04h - Tandy 2000 - KEYBOARD - FLUSH KEYBOARD BUFFER
Int 16/AH=04h - K3PLUS v6.22+ - SET KEYCLICK
Int 16/AH=05h - KEYBOARD - STORE KEYSTROKE IN KEYBOARD BUFFER (AT/PS w enh keybd only)
Int 16/AH=05h - KEYBOARD - SELECT KEYBOARD LAYOUT (PCjr only)
Int 16/AH=05h - Tandy 2000 - KEYBOARD - RESET KEYBOARD
Int 16/AX=0600h - AAKEYS - GET NEXT KEYBOARD EVENT
Int 16/AX=0601h - AAKEYS - EMPTY KEY-EVENT BUFFER
Int 16/AX=0602h - AAKEYS - DISABLE AAKEYS
Int 16/AX=0603h - AAKEYS - GET KEY-EVENT BUFFER
Int 16/AX=0604h - AAKEYS - EMPTY BIOS KEYBOARD BUFFER
Int 16/AH=09h - KEYBOARD - GET KEYBOARD FUNCTIONALITY
Int 16/AH=0Ah - KEYBOARD - GET KEYBOARD ID
Int 16/AH=10h - KEYBOARD - GET ENHANCED KEYSTROKE (enhanced kbd support only)
Int 16/AH=11h - KEYBOARD - CHECK FOR ENHANCED KEYSTROKE (enh kbd support only)
Int 16/AH=12h - KEYBOARD - GET EXTENDED SHIFT STATES (enh kbd support only)
Int 16/AH=13h - DOS/V - DOUBLE-BYTE CHARACTER SET SHIFT CONTROL
Int 16/AH=14h - DOS/V - SHIFT STATUS DISPLAY CONTROL
Int 16/AH=20h - KEYBOARD - GET 122-KEY KEYSTROKE (122-key kbd support only)
Int 16/AH=20h - HUNTER 16 - SET TEMPORARY SHIFT
Int 16/AH=20h - K3 v1.5x, K3PLUS v5.xx - GET EXTENDED BUFFER STATE
Int 16/AH=21h - KEYBOARD - CHECK FOR 122-KEY KEYSTROKE (122-key kbd support only)
Int 16/AH=21h - HUNTER 16 - CONTROL SHIFT KEYS
Int 16/AH=22h - KEYBOARD - GET 122-KEY SHIFT STATUS (122-key kbd support only)
Int 16/AH=22h - HUNTER 16 - CONTROL CTRL-ALT-DEL
Int 16/AH=23h - HUNTER 16 - CONTROL EMERGENCY BREAKOUT
Int 16/AH=24h - HUNTER 16 - REDEFINE KEY CODES
Int 16/AH=25h - HUNTER 16 - RESET KEYBOARD
Int 16/AH=25h - K3 v1.5x, K3PLUS v5.xx - COPY INTO EXTENDED BUFFER
Int 16/AH=26h - HUNTER 16 - CONTROL KEYCLICK
Int 16/AH=27h - HUNTER 16 - CONTROL SCREEN DUMP AREA
Int 16/AH=29h - HUNTER 16 - GET KEY REPEAT
Int 16/AH=2Ah - HUNTER 16 - CONTROL KEY REPEAT
Int 16/AH=2Bh - HUNTER 16 - REDEFINE KEY SCAN CODES
Int 16/AH=2Ch - HUNTER 16 - REDEFINE RAW KEY CODES
Int 16/AH=2Dh - HUNTER 16 - CONTROL BREAK KEYS
Int 16/AX=3577h - TextWare TWTSR - API
Int 16/AX=4252h - TEXTCAP 2.0 - INSTALLATION CHECK
Int 16/AX=4253h - TEXTCAP 2.0 - UNINSTALL
Int 16/AX=4254h - TEXTCAP 2.0 - DUMP TEXT SCREEN TO FILE
Int 16/AX=4500h - Shamrock Software EMAIL - GET STATUS
Int 16/AX=4501h - Shamrock Software EMAIL - GET ELAPSED ONLINE TIME AND MAXIMUM TIME
Int 16/AX=4502h - Shamrock Software EMAIL - GET CURRENT COMMUNICATIONS PARAMETERS
Int 16/AX=4503h - Shamrock Software EMAIL - SPECIFY COMMAND-WORD FOR USER FUNCTION
Int 16/AX=4504h - Shamrock Software EMAIL - CHECK FOR USER FUNCTION COMMAND-WORD
Int 16/AX=4505h - Shamrock Software EMAIL - SEND RESULT OF USER FUNCTION
Int 16/AX=4506h - Shamrock Software EMAIL - MONITOR XMODEM DOWNLOAD
Int 16/AH=4Bh - Frank Klemm Keyboard Driver v2.0 - API
Int 16/AX=4D4Fh - M16_KBD.COM v5.6 - INSTALLATION CHECK
Int 16/AX=5000h - KEYBOARD - AX PC - SET KEYBOARD COUNTRY CODE
Int 16/AX=5001h - KEYBOARD - AX PC - GET KEYBOARD COUNTRY CODE
Int 16/AH=51h - KEYBOARD - AX PC - READ SHIFT KEY STATUS
Int 16/AX=5453h/BX=5242h - TSRBONES - INSTALLATION CHECK
Int 16/AX=5472h/BX=4C54h - TrLit - API
Int 16/AX=5500h - Microsoft Word internal - MICROSOFT WORD COOPERATION WITH TSR
Int 16/AX=55FEh - Microsoft QBASIC internal - MICROSOFT COOPERATION WITH TSR
Int 16/AX=55FFh - Microsoft Word - TSR COOPERATION???
Int 16/AX=5758h/BX=4858h - Netroom CACHECLK - INSTALLATION CHECK
Int 16/AX=5758h/BX=5754h - Netroom ??? - ???
Int 16/AX=5758h/BX=5755h - Netroom ??? - ???
Int 16/AX=5758h/BX=5756h - Netroom ??? - INSTALLATION CHECK
Int 16/AX=5758h/BX=5858h - Netroom PRENET - GET OLD INTERRUPT VECTORS
Int 16/AX=5758h/BX=5859h - Netroom POSTNET - GET OLD INTERRUPT VECTORS
Int 16/AH=67h - Doorway v2.x+ - INSTALLATION CHECK / REDIRECTION CONTROLa
Int 16/AX=6969h/BX=6968h - PC Tools v5.1+ BACKTALK - UNHOOK
Int 16/AX=6969h/BX=6969h - PC Tools v5.1+ BACKTALK - INSTALLATION CHECK
Int 16/AX=6A6Bh - FastJuice - DISABLE/UNLOAD???
Int 16/AX=6C63h - TMED v1.6a - INSTALLATION CHECK
Int 16/AX=6D74h - MTRTSR - INSTALLATION CHECK
Int 16/AX=6F00h - HP Vectra EX-BIOS - F16_INQUIRE - Extended BIOS INSTALLATION CHECK
Int 16/AX=6F01h - HP Vectra EX-BIOS - F16_DEF_ATTR - GET DEFAULT TYPEMATIC VALUES
Int 16/AX=6F02h - HP Vectra EX-BIOS - F16_GET_ATTR - GET CURRENT TYPEMATIC VALUES
Int 16/AX=6F03h - HP Vectra EX-BIOS - F16_SET_ATTR - SET TYPEMATIC VALUES
Int 16/AX=6F04h - HP Vectra EX-BIOS - F16_DEF_MAPPING - GET DEFAULT KEY MAPPINGS
Int 16/AX=6F05h - HP Vectra EX-BIOS - F16_GET_MAPPING - GET CURRENT KEY MAPPINGS
Int 16/AX=6F06h - HP Vectra EX-BIOS - F16_SET_MAPPING - SET KEY MAPPINGS
Int 16/AX=6F07h - HP Vectra EX-BIOS - F16_SET_XLATORS - SET CCP AND SOFTKEY PADS
Int 16/AX=6F08h - HP Vectra EX-BIOS - F16_KBD - GET KEYBOARD INFORMATION
Int 16/AX=6F09h - HP Vectra EX-BIOS - F16_KBD_RESET - RESET KEYBOARD TO DEFAULTS
Int 16/AX=6F0Ah - HP Vectra ES/QS/RS EX-BIOS - READ PROCESSOR SPEED
Int 16/AX=6F0Bh - HP Vectra ES/QS/RS EX-BIOS - SET PROCESSOR SPEED TO LOW
Int 16/AX=6F0Ch - HP Vectra ES/QS/RS EX-BIOS - SET PROCESSOR SPEED TO HIGH
Int 16/AX=6F0Dh - HP Vectra ES/QS/RS EX-BIOS - GET HIL Extended BIOS INTERRUPT NUMBER
Int 16/AX=6F0Eh - HP Vectra ES/QS/RS EX-BIOS - SET HIL Extended BIOS INTERRUPT NUMBER
Int 16/AX=6F0Fh - HP Vectras RS/20C and RS/25C - ENABLE MEMORY CACHING
Int 16/AX=6F10h - HP Vectras RS/20C and RS/25C - DISABLE MEMORY CACHING
Int 16/AX=6F11h - HP Vectras RS/20C and RS/25C - GET MEMORY CACHING STATE
Int 16/AX=6F12h - HP Vectras RS/20C and RS/25C - SET PROCESSOR SPEED TO MEDIUM
Int 16/AH=70h - FAKEY.COM - INSTALLATION CHECK
Int 16/AH=71h - FAKEY.COM - PUSH KEYSTROKES
Int 16/AH=72h - FAKEY.COM - CLEAR FAKED KEYSTROKES
Int 16/AH=73h - FAKEY.COM - PLAY TONES
Int 16/AX=7463h - FastJuice - INSTALLATION CHECK
Int 16/AH=75h - PcANYWHERE III - SET TICK COUNT FOR SCANNING
Int 16/AH=76h - PcANYWHERE III - SET ERROR CHECKING TYPE
Int 16/AH=77h - PcANYWHERE III - LOG OFF
Int 16/AX=7761h - WATCH.COM v2.x-v3.0 - INSTALLATION CHECK
Int 16/AX=7788h/BX=7789h - PC Magazine PUSHDIR.COM - INSTALLATION CHECK
Int 16/AH=79h - PcANYWHERE III - CHECK STATUS
Int 16/AH=7Ah - PcANYWHERE III - CANCEL SESSION
Int 16/AX=7B00h - PcANYWHERE III - SUSPEND
Int 16/AX=7B01h - PcANYWHERE III - RESUME
Int 16/AH=7Ch - PcANYWHERE III - GET PORT CONFIGURATION
Int 16/AH=7Dh - PcANYWHERE III - GET/SET TERMINAL PARAMETERS
Int 16/AH=7Eh - PcANYWHERE III - COMMUNICATIONS I/O THROUGH PORT
Int 16/AH=7Fh - PcANYWHERE III - SET KEYBOARD/SCREEN MODE
Int 16/AH=80h - MAKEY.COM - INSTALLATION CHECK
Int 16/AH=87h - DK.COM v1.03 - INSTALLATION CHECK
Int 16/AX=8765h/BX=4321h - AT.COM version 8/26/87 - API
Int 16/AH=92h - KEYB.COM KEYBOARD CAPABILITIES CHECK (not an actual function!)
Int 16/AH=99h - SCOUT v5.4 - GET ???
Int 16/AH=9Eh - SCOUT v5.4 - INSTALLATION CHECK
Int 16/AH=A2h - KEYB.COM KEYBOARD CAPABILITIES CHECK (not an actual function!)
Int 16/AH=AAh - PTxxx.COM - (xxx=CGA,EGA,VGA,HER...) CALL GATE FOR GRAPHICS
Int 16/AX=AABBh/BX=EEFFh - JORJ v4.3 - INSTALLATION CHECK
Int 16/AX=AF20h/BX=4B33h - K3PLUS v6.00+ (API v2.0+) - GET EXTENDED BUFFER STATE
Int 16/AX=AF25h/BX=4B33h - K3PLUS v6.00+ (API v2.0+) - COPY INTO EXTENDED BUFFER
Int 16/AX=AF4Dh/BX=4B33h - K3PLUS v6.00+ (API v2.0+) - GET VERSION INFORMATION
Int 16/AX=AF50h/BX=4B33h - K3PLUS v6.00+ (API v2.0+) - CHECK IF FUNCTION SUPPORTED
Int 16/AX=AF51h/BX=4B33h - K3PLUS v6.00+ (API v2.00+) - SET OPTIONS
Int 16/AX=AF80h/BX=4B33h - K3PLUS v6.00+ (API v2.00+) - GET ORIGINAL INT 09h VECTOR
Int 16/AX=AF81h/BX=4B33h - K3PLUS v6.00+ (API v2.00+) - GET ORIGINAL INT 16h HANDLER
Int 16/AX=AF82h/BX=4B33h - K3PLUS v6.00+ (API v2.00+) - GET ORIGINAL INT 10h HANDLER
Int 16/AX=B0B1h - VGARAM v1.00 - INSTALLATION CHECK
Int 16/AH=CAh/BX=736Bh - CtrlAlt Associates STACKEY.COM v3.00 - API
Int 16/AX=CA00h/BX=6570h - CtrlAlt Associates EGAPAL.COM v1.00 - INSTALLATION CHECK
Int 16/AX=CA00h/BX=7670h - CtrlAlt Associates VGAPAL.COM v1.00 - INSTALLATION CHECK
Int 16/AX=CB00h - PUPClip v1.12+ - INSTALLATION CHECK
Int 16/AX=CB01h - PUPClip v1.12+ - GET CLIPBOARD CURSOR POSITION
Int 16/AX=CB02h - PUPClip v1.12+ - SET CLIPBOARD CURSOR POSITION
Int 16/AX=CB03h - PUPClip v1.12+ - GET CHARACTER FROM CURRENT CLIPBOARD CURSOR POSITION
Int 16/AX=CB04h - PUPClip v1.12+ - WRITE CHARACTER TO CURRENT CLIPBOARD CURSOR POSITION
Int 16/AX=CB05h - PUPClip v1.12+ - CLEAR CLIPBOARD CONTENTS
Int 16/AX=CB06h - PUPClip v1.12+ - SCROLL UP CLIPBOARD CONTENTS
Int 16/AX=CB07h - PUPClip v1.12+ - SCROLL DOWN CLIPBOARD CONTENTS
Int 16/AX=CB08h - PUPClip v1.12+ - POP UP
Int 16/AX=D724h/CX=00CBh - APCAL v3.20 - GET ???
Int 16/AX=D724h/CX=00CCh - APCAL v3.20 - GET ???
Int 16/AX=D724h/CX=00CDh - APCAL v3.20 - GET ???
Int 16/AH=DDh - VIRUS - Frumble - INSTALLATION CHECK
Int 16/AX=DFDFh - Corel PowerSCSI - FDAUDIO.COM - INSTALLATION CHECK
Int 16/AX=E000h - AMI BIOS - BIOS-FLASH Interface - GET VERSION NUMBER
Int 16/AX=E001h - AMI BIOS - BIOS-FLASH Interface - GET CHIPSET SAVE/RESTORE SIZE
Int 16/AX=E002h - AMI BIOS - BIOS-FLASH Interface - SAVE CHIPSET STATUS & PREPARE CHPSET
Int 16/AX=E003h - AMI BIOS - BIOS-FLASH Interface - RESTORE CHIPSET STATUS
Int 16/AX=E004h - AMI BIOS - BIOS-FLASH Interface - LOWER PROGRAMMING VOLTAGE Vpp
Int 16/AX=E005h - AMI BIOS - BIOS-FLASH Interface - RAISE PROGRAMMING VOLTAGE Vpp
Int 16/AX=E006h - AMI BIOS - BIOS-FLASH Interface - FLASH WRITE PROTECT
Int 16/AX=E007h - AMI BIOS - BIOS-FLASH Interface - FLASH WRITE ENABLE
Int 16/AX=E008h - AMI BIOS - BIOS-FLASH Interface - FLASH SELECT
Int 16/AX=E009h - AMI BIOS - BIOS-FLASH Interface - FLASH DE-SELECT
Int 16/AX=E00Ah - AMI BIOS - BIOS-FLASH Interface - VERIFY ALLOCATED MEMORY
Int 16/AX=E00Bh - AMI BIOS - BIOS-FLASH Interface - SAVE INTERNAL CACHE STATUS
Int 16/AX=E00Ch - AMI BIOS - BIOS-FLASH Interface - RESTORE INTERNAL CACHE STATUS
Int 16/AX=E0E0h - TurboPower TSRs - ALTERNATE INSTALLATION CHECK
Int 16/AX=E0FFh - AMI BIOS - BIOS-FLASH Interface - GENERATE CPU RESET
Int 16/AH=EDh/BH=EDh - BORLAND TURBO LIGHTNING - API
Int 16/AH=EFh - CALCULATOR - INSTALLATION CHECK
Int 16/AH=F0h - Compaq 386 and newer - SET CPU SPEED
Int 16/AX=F0F0h - TurboPower TSRs - INSTALLATION CHECK
Int 16/AH=F1h - Compaq 386 and newer - READ CURRENT CPU SPEED
Int 16/AH=F2h - Compaq 386 and newer - DETERMINE ATTACHED KEYBOARD TYPE
Int 16/AH=F3h - Compaq 80286s - SET CPU SPEED LIMIT (OVERRIDE JUMPER)
Int 16/AX=F398h - NORTON GUIDES - INSTALLATION CHECK
Int 16/AX=F400h - Compaq Systempro and higher - CACHE CONTROLLER STATUS
Int 16/AX=F401h - Compaq Systempro and higher - ENABLE CACHE CONTROLLER
Int 16/AX=F402h - Compaq Systempro and higher - DISABLE CACHE CONTROLLER
Int 16/AX=FA00h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - INSTALLATION CHECK
Int 16/AX=FA01h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - UNINSTALL
Int 16/AX=FA02h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - GET/SET OPTIONS
Int 16/AX=FA03h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - GET ???
Int 16/AX=FA04h/DX=5945h - PC Tools v8+ VSAFE - GET HOTKEY DISABLE FLAG
Int 16/AX=FA05h/DX=5945h - PC Tools v8+ VSAFE - SET HOTKEY DISABLE FLAG
Int 16/AX=FA06h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - GET NETWORK DRIVES TEST FLAG
Int 16/AX=FA07h/DX=5945h - PC Tools v8+ VSAFE, VWATCH - SET NETWORK DRIVES TEST FLAG
Int 16/AX=FA08h/DX=5945h - PC Tools v9+ VWATCH v2.1 - ???
Int 16/AX=FE55h - PC Tools v8+ programs - GET ???
Int 16/AX=FEA4h - PC Tools v7+ CPSCHED/DESKTOP - RESET ???
Int 16/AX=FEC6h - PC Tools v7+ CPSCHED - ENABLE/DISABLE CPSCHED API
Int 16/AX=FED3h - PC Tools v7+ CPSCHED/DESKTOP - ???
Int 16/AX=FEDCh - PC Tools v7+ CPSCHED - UNHOOK INTERRUPTS
Int 16/AX=FEEFh/CX=0000h - PC Tools v7+ CPSCHED/DESKTOP - INSTALLATION CHECK
Int 16/AX=FEF1h - PC Tools v7 only CPSCHED/DESKTOP - ALTERNATE INSTALLATION CHECK
Int 16/AH=FFh - KEYBOARD - KBUF extensions - ADD KEY TO TAIL OF KEYBOARD BUFFER
Int 16/AH=FFh - OPTIMA 1024 VGA-Sync,ET-3000 chipset - QUERY ZOOM INTERRUPT
Int 16/AH=FFh/BH=00h - FREEZE.COM - INSTALLATION CHECK
Int 16/AX=FF70h/BX=0000h - PC Tools v8+ DRIVEMAP - INSTALLATION CHECK
Int 16/AX=FF70h/BX=0001h - PC Tools v8+ DRIVEMAP - ???
Int 16/AX=FF70h/BX=0002h - PC Tools v8+ DRIVEMAP - ???
Int 16/AX=FF80h/BX=0000h - PC Tools v8+ CPTASK - INSTALLATION CHECK
Int 16/AX=FF80h/BX=0001h - PC Tools v8+ CPTASK - GET ???
Int 16/AX=FF80h/BX=0002h - PC Tools v8+ CPTASK - GET ???
Int 16/AX=FF80h/BX=0003h - PC Tools v8+ CPTASK - GET ??? FLAGS
Int 16/AX=FF80h/BX=0004h - PC Tools v8+ CPTASK - SET ???
Int 16/AX=FF80h/BX=0005h - PC Tools v8+ CPTASK - GET NUMBER OF ACTIVE TASKS???
Int 16/AX=FF80h/BX=0006h - PC Tools v8+ CPTASK - GET AND CLEAR ??? FLAG
Int 16/AX=FF80h/BX=0007h - PC Tools v8+ CPTASK - ???
Int 16/AX=FF80h/BX=0008h - PC Tools v8+ CPTASK - ???
Int 16/AX=FF80h/BX=0009h - PC Tools v8+ CPTASK - GET ???
Int 16/AX=FF80h/BX=000Ah - PC Tools v9+ CPTASK - SET ???
Int 16/AX=FF80h/BX=000Bh - PC Tools v9+ CPTASK - SET ???
Int 16/AX=FF80h/BX=000Ch - PC Tools v9+ CPTASK - SET IDLE??? DELAY
Int 16/AX=FF80h/BX=4350h - PC Tools v8+ CPTASK - UNINSTALL
Int 16/AX=FF90h - PC Tools v8+ DESKTOP - ???
Int 16/AX=FF91h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FF92h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FF93h - PC Tools v7+ DESKTOP - SET ??? FLAG
Int 16/AX=FF94h - PC Tools v7+ DESKTOP - SET ???
Int 16/AX=FF95h - PC Tools v7+ DESKTOP - SET ???
Int 16/AX=FF96h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FF97h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FF98h - PC Tools v7+ DESKTOP - OPEN \DESK.OVL FILE AND SEEK TO OVERLAY
Int 16/AX=FF99h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FF9Ah - PC Tools v7+ DESKTOP - GET NAME OF COLOR SCHEME
Int 16/AX=FF9Bh - PC Tools v7+ DESKTOP - UNUSED
Int 16/AX=FF9Ch - PC Tools v8+ CPTASK - SET/CLEAR ??? POINTER
Int 16/AX=FF9Dh - PC Tools v8+ CPTASK, VSAFE - ???
Int 16/AX=FF9Eh - PC Tools v7+ DESKTOP - ???
Int 16/AX=FFA1h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FFA2h - PC Tools v7+ DESKTOP - ???
Int 16/AX=FFA3h/BX=0000h - PC Tools v7-8 DATAMON, v9+ DPROTECT - INSTALLATION CHECK
Int 16/AX=FFA3h/BX=0001h - PC Tools v7-8 DATAMON, v9+ DPROTECT - GET ???
Int 16/AX=FFA3h/BX=0002h - PC Tools v7-8 DATAMON, v9+ DPROTECT - GET ???
Int 16/AX=FFA3h/BX=0003h - PC Tools v7-8 DATAMON, v9+ DPROTECT - GET ???
Int 16/AX=FFA3h/BX=0004h - PC Tools v7+ DATAMON - SET ??? FLAG
Int 16/AX=FFA3h/BX=0005h - PC Tools v7+ DATAMON - CLEAR ??? FLAG
Int 16/AX=FFA3h/BX=0006h - PC Tools v7+ DATAMON - SET PSP SEGMENT ???
Int 16/AX=FFA3h/BX=FFA3h - PC Tools v9 DSKLIGHT - INSTALLATION CHECK
Int 16/AX=FFA4h - PC Tools v7-8 DESKTOP - ???
Int 16/AX=FFA5h/CX=1111h - PC-Cache v6+ - INSTALLATION CHECK
Int 16/AX=FFA5h/CX=AAAAh - PC-Cache v6+ - ENABLE DELAYED WRITES
Int 16/AX=FFA5h/CX=CCCCh - PC-Cache v6+ - FLUSH CACHE AND DISABLE DELAYED WRITES
Int 16/AX=FFA5h/CX=DDDDh - PC-Cache v6+ - FLUSH AND DISABLE CACHE
Int 16/AX=FFA5h/CX=EEEEh - PC-Cache v6+ - ENABLE CACHE
Int 16/AX=FFA5h/CX=FFFFh - PC-Cache v6+ - FLUSH CACHE
Int 16/AX=FFA6h - PC Tools v6.0-8.0 DESKTOP - GET ???
Int 16/AX=FFA7h - PC Tools v6.0-8.0 DESKTOP - GET ??? PATH
Int 16/AX=FFA8h - PC Tools v6.0-8.0 DESKTOP - ???
Int 16/AX=FFA9h - PC Tools v6.0-8.0 DESKTOP - GET VERSION STRING
Int 16/AX=FFAAh - PC Tools v6.0-8.0 DESKTOP - ???
Int 16/AX=FFABh - PC Tools v6.0-8.0 DESKTOP - GET EDITOR SETTINGS???
Int 16/AX=FFACh - PC Tools v6.0-8.0 DESKTOP - SET ???
Int 16/AX=FFADh - PC Tools v6.0-8.0 DESKTOP - SET ???
Int 16/AX=FFAEh - PC Tools v6.0-8.0 DESKTOP - GET ???
Int 16/AX=FFAFh - PC Tools v6.0-8.0 DESKTOP - SET ???
Int 16/AX=FFB0h - PC Tools v6.0-8.0 DESKTOP - SET ???
Int 16/AX=FFB1h - PC Tools v6.0-8.0 DESKTOP - ???
Int 16/AX=FFB2h - PC Tools v5.5-8.0 DESKTOP - GET ???
Int 16/AX=FFB3h - PC Tools v5.5-8.0 DESKTOP - ???
Int 16/AX=FFB4h - PC Tools v5.5-8.0 DESKTOP - SET ??? FLAG
Int 16/AX=FFB5h - PC Tools v5.5-8.0 DESKTOP - GET/SET WINDOW PARAMETERS
Int 16/AX=FFB6h - PC Tools v5.5-8.0 DESKTOP - GET ???
Int 16/AX=FFB7h - PC Tools v5.5-8.0 DESKTOP - GET/SET ???
Int 16/AX=FFB8h - PC Tools v5.1-8.0 DESKTOP - GET/SET???
Int 16/AX=FFB9h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFBAh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFBBh - PC Tools v5.1-8.0 DESKTOP - CLEAR ??? FLAG
Int 16/AX=FFBCh - PC Tools v5.1-8.0 DESKTOP - RESTORE ORIGINAL SCREEN???
Int 16/AX=FFBDh - PC Tools v5.1-8.0 DESKTOP - ??? DATABASE INDEXING MESSAGES
Int 16/AX=FFBEh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFBFh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFC0h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFC1h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFC2h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFC3h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFC4h - PC Tools v5.1-8.0 DESKTOP - GET ???
Int 16/AX=FFC5h - PC Tools v5.1-8.0 DESKTOP - CHECK WHETHER DESKTOP LOADED RESIDENT
Int 16/AX=FFC6h - PC Tools v5.1-8.0 DESKTOP - SET ???
Int 16/AX=FFC7h - PC Tools v5.1-8.0 DESKTOP - REMOVE WINDOW
Int 16/AX=FFC8h - PC Tools v5.1-8.0 DESKTOP - GET ???
Int 16/AX=FFC9h - PC Tools v5.1-8.0 DESKTOP - COPY DATA TO CLIPBOARD
Int 16/AX=FFCAh - PC Tools v5.1-8.0 DESKTOP - SET ???
Int 16/AX=FFCBh - PC Tools v5.1-8.0 DESKTOP - SELECT WINDOW PARAMETERS???
Int 16/AX=FFCCh - PC Tools v5.1-8.0 DESKTOP - DISPLAY ASCIZ STRING CENTERED IN WINDOW
Int 16/AX=FFCDh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFCEh - PC Tools v5.1-8.0 DESKTOP - SET ??? DELAYS
Int 16/AX=FFCFh - PC Tools v5.1-8.0 DESKTOP - CLOSE PRINTER/PRINT FILE
Int 16/AX=FFD0h - PC Tools v5.1-8.0 DESKTOP - PREPARE TO PRINT???
Int 16/AX=FFD1h - PC Tools v5.1-8.0 DESKTOP - DISPLAY PRINT OPTIONS MENU
Int 16/AX=FFD2h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFD3h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFD4h/BH=3Ch - PC Tools v5.1-8.0 DESKTOP - CREATE/OPEN/DELETE FILE
Int 16/AX=FFD5h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFD6h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFD7h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFD8h - PC Tools v5.1-8.0 DESKTOP - SAFE CREATE FILE
Int 16/AX=FFD9h - PC Tools v5.1-8.0 DESKTOP - GET ???
Int 16/AX=FFDAh - PC Tools v5.1-8.0 DESKTOP - GET NAME OF LAST FILE OPENED
Int 16/AX=FFDBh - PC Tools v5.1-8.0 DESKTOP - SET ???
Int 16/AX=FFDCh - PC Tools v5.1-8.0 DESKTOP - UNHOOK
Int 16/AX=FFDDh/BX=0000h - PC Tools v5.1+ PCShell API - INSTALLATION CHECK
Int 16/AX=FFDDh/BX=0001h - PC Tools v5.1+ PCShell API - REQUEST POP-UP
Int 16/AX=FFDDh/BX=0002h - PC Tools v5.1-5.5 PCShell API - GET ???
Int 16/AX=FFDDh/BX=0003h - PC Tools v5.1+ PCShell API - REQUEST POP-UP
Int 16/AX=FFDDh/BX=0004h - PC Tools v5.1+ PCShell API - GET ???
Int 16/AX=FFDDh/BX=0005h - PC Tools v5.1+ PCShell API - ???
Int 16/AX=FFDDh/BX=0006h - PC Tools v5.1+ PCShell API - ???
Int 16/AX=FFDDh/BX=0007h - PC Tools v5.1+ PCShell API - SET ??? FLAG
Int 16/AX=FFDDh/BX=0008h - PC Tools v5.1+ PCShell API - CLEAR ??? FLAG
Int 16/AX=FFDDh/BX=0009h - PC Tools v6.0+ PCShell API - GET PCRUN PARAMETERS
Int 16/AX=FFDDh/BX=000Ah - PC Tools v6.0+ PCRUN API - INSTALLATION CHECK
Int 16/AX=FFDDh/BX=000Bh - PC Tools v6.0+ PCRUN API - ???
Int 16/AX=FFDEh - PC Tools v5.1-8.0 DESKTOP - DISPLAY POPUP MENU
Int 16/AX=FFDFh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFE0h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFE1h - PC Tools v5.1-8.0 DESKTOP - BEEP
Int 16/AX=FFE2h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFE3h - PC Tools v5.1-8.0 DESKTOP - PRINT CHARACTER
Int 16/AX=FFE4h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFE5h - PC Tools v5.1-8.0 DESKTOP - POP UP FILE SELECTION MENU
Int 16/AX=FFE6h - PC Tools v5.1-8.0 DESKTOP - CHECK FOR AND GET KEYSTROKE
Int 16/AX=FFE7h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFE8h - PC Tools v5.1-8.0 DESKTOP - DISPLAY NUMBER
Int 16/AX=FFE9h - PC Tools v5.1-8.0 DESKTOP - GET FILE LIST???
Int 16/AX=FFEAh - PC Tools v5.1-8.0 DESKTOP - DISPLAY COUNTED STRING
Int 16/AX=FFEBh - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFECh - PC Tools v5.1-8.0 DESKTOP - GET KEY
Int 16/AX=FFEDh - PC Tools v5.1-8.0 DESKTOP - GET ???
Int 16/AX=FFEEh - PC Tools v5.1-8.0 DESKTOP - DEFINE PULLDOWN MENUS
Int 16/AX=FFEFh/CX=0000h - PC Tools v5.1-8.0 DESKTOP - INSTALLATION CHECK
Int 16/AX=FFF0h - PC Tools v5.1-8.0 DESKTOP - SET ???
Int 16/AX=FFF1h/BX=0000h - PC Tools v5.1-8.0 DESKTOP - ALTERNATE INSTALLATION CHECK
Int 16/AX=FFF2h - PC Tools v5.1-8.0 DESKTOP - DISPLAY HELP LINE
Int 16/AX=FFF3h - PC Tools v5.1-8.0 DESKTOP - PREPARE TO UNLOAD RESIDENT DESKTOP
Int 16/AX=FFF4h - PC Tools v5.1-8.0 DESKTOP - ???
Int 16/AX=FFF5h - PC Tools v5.1-8.0 DESKTOP - GET SCREEN ATTRIBUTE ARRAY
Int 16/AX=FFF6h - PC Tools v5.1-8.0 DESKTOP - INVOKE NOTEPAD EDITOR
Int 16/AX=FFF7h - PC Tools v5.1-8.0 DESKTOP - PROCESS MENU BAR ENTRY???
Int 16/AX=FFF8h - PC Tools v5.1-8.0 DESKTOP - DRAW EMPTY WINDOW
Int 16/AX=FFF9h - PC Tools v5.1-8.0 DESKTOP - DEFINE SCREEN REFRESH ROUTINE
Int 16/AX=FFFAh - PC Tools v5.1-8.0 DESKTOP - DEFINE STANDARD PULLDOWN MENUS
Int 16/AX=FFFBh - PC Tools v5.1-8.0 DESKTOP - PROCESS STANDARD MENU BAR
Int 16/AX=FFFCh - PC Tools v5.1-8.0 DESKTOP - GET HOTKEYS AND KEYBOARD VECTOR
Int 16/AX=FFFDh - PC Tools v5.1-8.0 DESKTOP - COPY ???
Int 16/AX=FFFEh - PC Tools v5.1-8.0 DESKTOP - SHOW MOUSE CURSOR
Int 16/AX=FFFFh - PC Tools v5.1-8.0 DESKTOP - HIDE MOUSE CURSOR

int 10h

http://blog.naver.com/revival2u?Redirect=Log&logNo=70025110174

IA32 processors 어셈블리 명령어모음

1. GENERAL-PURPOSE INSTRUCTIONS ; All IA32 processors

The general-purpose instructions preform basic data movement, arithmetic, logic, program flow, and string operations that programmers commonly use to write application and system software to run on IA32 processors. They operate on data contained in memory, in the general-purpose register(EAX, EBX, ECX, EDX, EDI, ESI, EBP, and ESP) and in the EFLAGS register. They also operate on address information contained in memory, the general-purpose registers, and the segment regiters (CS, DX, SS, ES, FS, and GS). This group of instructions includes the following subgroups: data transfer, binary integer arithmetic, decimal arithmetic, logic operations, shift and rotate, bit and byte operations, program control, string, flag control, segment register operations, and miscellaneous.

1.1 Data Transfer Instructions
The data transfer instructions move data between memory and the general-purpose and segment registers. They also preform specific operations such as conditional moves, stack access, and data conversion.

MOV - Move data between general-purpose registers; move data between memory and general-purpose or segment register; move immediates to general-purpose registers.
CMOVE/CMOVZ - Conditional move if equal/Conditional move if zero
CMOVNE/CMOVNZ - Conditional move if not equal/Conditional move if not zero
CMOVA/CMOVNBE - Conditional move if above/Conditional move if now below or equal
CMOVAE/CMOVNB - Conditional move if above or equal/Conditional move if not below
CMOVB/CMOVNAE - Conditional move if below/Conditional move if not above or equal
CMOVBE/CMOVNA - Conditional move if below or equal/Conditional move if not above
CMOVG/CMOVNLE - Conditional move if greater/Conditional move if not less or equal
CMOVGE/CMOVNL - Conditional move if greater or equal/Conditional move if not less
CMOVL/CMOVNGE - Conditional move if less/Conditional move if not greater or equal
CMOVLE/CMOVNG - Conditional move if less or equal/Conditional move if not greater
CMOVC - Conditional move if carry
CMOVNC - Conditional move if not carry
CMOVO - Conditional move if overflow
CMOVNO - Conditional move if not overflow
CMOVS - Conditional move if sign(negative)
CMOVNS - Conditional move if not sign(non-negative)
CMOVP/CMOVPE - Conditional move if parity/Conditional move if parity even
CMOVNP/CMOVPO - Conditional move if not parity/Conditional move if parity odd
XCHG - Exchange
BSWAP - Byte swap
XADD - Exchange and add
CMPXCHG - Compare and exchange
CMPXCHG8B - Compare and exchange 8 bytes
PUSH - Push onto stack
POP - Pop off of stack
PUSHA/PUSHAD - Push general-purpose registers onto stack
POPA/POPAD - Pop general-pupose registers from stack
CWD/CDQ - Convert word to doubleword/Convert doubleword to quadword
CBW/CWDE - Convert byte to word/Convert word to doubleword in EAX register
MOVSX - Move and sign extend
MOVZX - Move and zero extend

1.2 Binary Arithmetic Instuctions
The binary arithmetic instructions perform basic binary integer computaions on byte, word, and doubleword integers located in memory and/or the general purpose registers.

ADD - Integer add
ADC - Add with carry
SUB - Subtract
SBB - Subtract with borrow
IMUL - Signed multiply
MUL - Unsigned multiply
IDIV - Signed divide
DIV - Unsigned divide
INC - Increment
DEC - Decrement
NEG - Negate
CMP - Compare

1.3 Decimal Arithmetic Instructions
The decimal arithmetic instructions perform decimal arithmetic on binary coded decimal(BCD) data.

DAA - Decimal adjust after addition
DAS - Decimal adjust after subtraction
AAA - ASCII adjust after addition
AAS - ASCII adjust after subtarction
AAM - ASCII adjust after multiplication
AAD - ASCII adjust before division

1.4 Logical Instructions
The logical instructions perform basic AND, OR, XOR, and NOT logical operations on byte, word, and doubleword values.

AND - Perform bitwise logical AND
OR - Perform bitwise logical OR
XOR - Perform bitwise logical exclusive OR
NOT - Perform bitwise logical NOT

1.5 Shift and Rotate Instructions
The shift and rotate instructions shift and rotate the bits in word and doubleword operands.

SAR - Shift arithmetic right
SHR - Shift logical right
SAL/SHL - Shift arithmetic left/Shift logical left
SHRD - Shift right double
SHLD - Shift left double
ROR - Rotate right
ROL - Rotate left
RCR - Rotate through carry right
RCL - Rotate through carry left

1.6 Bit and Byte Instructions
Bit Instructions test and modify individual bits in word and doubleword operands. Byte instructions set the value of a byte operand to indicate the status of flags in the EFLAGS register.

BT - Bit test
BTS - Bit test and set
BTR - BIt test and reset
BTC - Bit test and complement
BSF - Bit scan forward
BSR - Bit scan reverse
SETE/SETZ - Set byte if equal/Set byte if zero
SETNE/SETNZ - Set byte if not equal/Set byte if not zero
SETA/SETNBE - Set byte if above/Set byte if not below or equal
SETAE/SETNB/SETNC - Set byte if above/Set byte if not below or equal/Set byte if now carry
SETB/SETNAE/SETC - Set byte if below/Set byte if not above or equal/Set byte if carry
SETBE/SETNA - Set byte if below or equal/Set byte if not above
SETG/SETNLE - Set byte if greater/Set byte if not less or equal
SETGE/SETNL - Set byte if greater or equal/Set byte if not less
SETL/SETNGE - Set byte if less/Set byte if not greater or equal
SETLE/SETNG - Set byte if less or equal/Set byte if not greater
SETS - Set byte if sign(negative)
SETNS - Set byte if not sign(non-negative)
SETO - Set byte if overflow
SETNO - Set byte if now overflow
SETPE/SETP - Set byte if parity even/Set byte if parity
SETPO/SETNP - Set byte if parity odd/Set byte if now parity
TEST - Logical compare

1.7 Control Transfer Instructions
The control transfer instructions provide jump, conditional jump, loop, and call and return operations to control programs flow.

JMP - Jump
JE/JZ - Jump if equal/Jump if zero
JNE/JNZ - Jump if not equal/Jump if not zero
JA/JNBE - Jump if above/Jump if not below or equal
JAE/JMB - Jump if above or equal/Jump if not below
JB/JNAE - Jump if below/Jump if not above or equal
JBE/JNA - Jump if below or equal/Jump if not above
JG/JNLE - Jump if greater/Jump if not less or equal
JGE/JNL - Jump if greater or equal/Jump if not less
JL/JNGE - Jump if less/Jump if not greater or equal
JLE/JMG - Jump if less or equal/Jump if not greater
JC - Jump if carry
JNC - Jump if not carry
JO - Jump if overflow
JNO - Jump if not overflow
JS - Jump if sign(negative)
JNS - Jump of not sign(non-negative)
JPO/JNP - Jump if parity odd/Jump if not parity
JPE/JP - Jump if parity even/Jump if parity
JCXZ/JECXZ - Jump register CX zero/Jump register ECX zero
LOOP - Loop with ECX counter
LOOPZ/LOOPE - Loop with ECX and zero/Loop with ECX and equal
LOOPNZ/LOOPNE - Loop with ECX and not zero/Loop with ECX and not equal
CALL - Call procedure
RET - Return
IRET - Return from interrupt
INT - Software interrupt
INTO - Interrupt on overflow
BOUND - Detect value out of range
ENTER - High-level procedure entry
LEAVE - High-level procedure exit

1.8 String Instructions
The string instructions operate on strings of buytes, allowing them to be moved to and from memory.

MOVS/MOVSB - Move string/Move byte string
MOVS/MOVSW - Move string/Move word string
MOVS/MOVSD - Move string/Move doubleword string
CMPS/CMPSB - Compare string/Compare byte string
CMPS/CMPSW - Compare string/Compare word string
CMPS/CMPSD - Compare string/Compare doubleword string
SCAS/SCASB - Scan string/Scan byte string
SCAS/SCASW - Scan string/Scan word string
SCAS/SCASD - Scan string/Scan doubleword string
LODS/LODSB - Load string/Load byte string
LODS/LODSW - Load string/Load word string
LODS/LODSD - Load string/Load doubleword string
STOS/STOSB - Store string/Store byte string
STOS/STOSW - Store string/Store word string
STOS/STOSD - Store string/Store doubleword string
REP - Repeat while ECX not zero
REPE/REPZ - Repeat while equal/Repeat while zero
REPNE/REPNZ - Repeat while not equal/Repeat while not zero

1.9 I/O Instructions
These instructions move data between the processor's I/O ports and a register or memory.

IN - Read from a port
OUT - Write to a port
INS/INSB - Input string from port/Input byte string from port
INS/INSW - Input string from port/Input word string from port
INS/INSD - Input string from port/Input doubleword string from port
OUTS/OUTSB - Output string to port/Output byte string to port
OUTS/OUTSW - Output string to port/Output word string to port
OUTS/OUTSD - Output string to port/Output doubleword string to port

1.10 Enter and Leave Instructions
These instructions provide machine-language support for procedure calls in block-structured language.

ENTER - High-level procedure entry
LEAVE - High-level procedure exit

1.11 Flag Control(EFLAG) Instructions
The flag control instructions operate on the flags in the EFLAGS register.

STC - Set carry flag
CLC - Clear the carry flag
CMC - Complement the carry flag
CLD - Clear the direction flag
STD - Set direction flag
LAHF - Load flags into AH register
SAHF - Store AH register info flags
PUSHF/PUSHFD - Push EFLAGS onto stack
POPF/POPFD - Pop EFLAGS from stack
STI - Set interrupt flag
CLI - Clear the interrupt flag

1.12 Segment Register Instructions
The segment register instruction allow far pointers (segment addresses) to be loaded into the segment registers.

LDS - Load far pointer using DS
LES - Load far pointer using ES
LFS - Load far pointer using FS
LGS - Load far pointer using GS
LSS - Load far pointer using SS

1.13 Miscellaneous Instructions
The miscellaneous instructions provide such functions as loading an effective address, executing a "no-operation," and retrieving processor identification information.

LEA - Load effective adress
NOP - No operation
UD2 - Undefined instruction
XLAT/XLATB - Table lookup translation
CPUID - Processor Identification


2. X87 FPU INSTRUCTIONS

The x87 FPU instructions are executed by the processor's x87 FPU. These instructions operate on floating-point, integer, and binary-coded decimal(BCD) operands.
These instructions are divided into the following subgroups: data transfer, load constants, and FPU control instructions. The sections that follow introduce each subgroup.

2.1 x87 FPU Data Transfer Instructions
The data transfer instructions move floating-point, integer and BCD values between memory and the x87 FPU registers. They also perform conditional move operations on floating-point operands.

FLD - Load floating-point value
FST - Store floating-point value
FSTP - Store floating-poing value and pop
FILD - Load integer
FIST - Store integer
FISTP - Store integer and pop (SSE3 provides an instruction FISTTP for integer conversion)
FBLD - Load BCD
FBSTP - Store BCD and pop
FXCH - Exchange registers
FCMOVE - Floating-point conditional move if equal
FCMOVNE - Floating-point conditional move if not equal
FCMOVB - Floating-point conditional move if below
FCMOVBE - Floating-point conditional move if below or equal
FCMOVNB - Floating-point conditional move if not below
FCMOVNBE - Floating-point conditional move if not below or equal
FCMOVU - Floating-point conditional move if unordered
FCMOVNU - Floating-point conditional move if not unordered

2.2 x87 FPU Basic Arithmetic Instuctions
The basic arithmetic instructions perform basic arithmetic operations on floating-point and integer operands.

FADD - Add floating-point
FADDP - Add floating-point and pop
FIADD - Add integer
FSUB - Subtract floating-point
FSUBP - Subtract floating-point and pop
FISUB - Subtract integer
FSUBR - Subtract floating-point reverse
FSUBRP - Subtract floating-point reverse and pop
FISUBR - Subtract integer reverse
FMUL - Multiply floating-point
FMULP - Multiplu floating-point and pop
FDIV - Divide floating-point
FDIVP - Divide floating-point and pop
FIDIV - Divide integer
FDIVR - Divide floating-point reverse
FDIVRP - Divide floating-point reverse and pop
FIDIVR - Divide integer reverse
FPREM - Partial remainder
FPREM1 - IEEE Partial remainder
FABS - Absolute value
FCHS - Change sign
FRNDINT - Round to integer
FSCALE - Scale bu power of two
FSQRT - Square root
FXTRACT - Extract exponent and significand

2.3 x87 FPU Comparision Instructions
The compare instructions examine or compare floating-point or integer oprands.

FCOM - Compare floating-point
FCOMP - Compart floating-point and pop
FCOMPP - Compart floating-point and pop twice
FUCOM - Unordered compare floating-point
FUCOMP - Unordered compare floating-point and pop
FUCOMPP - Unordered compare floating-point and pop twice
FICOM - Compare integer
FICOMP - Compare integer and pop
FCOMI - Compare floating-point and set EFLAGS
FUCOMI - Unordered compare floating-point and set EFLAGS
FCOMIP - Compare floating-point, set EFLAGS, and pop
FUCOMIP - Unordered compare floating-point, set EFLAGS, and pop
FTST - Test floating-point (compare with 0.0)
FXAM - Examine floating-point

2.4 x87 FPU Transcendental Instructions
The transcendental instructions perform basic trigonometric and logarithmic operations on floating-point operands.

FSIN - Sine
FCOS - Cosine
FSINCOS - Sin and cosine
FPTAN - Partial tangent
FPATAN - Partial arctangent
F2XM1 - 2^x - 1
FYL2X - y * log2 x
FYL2XP1 - y * log2 (x + 1)

2.5 x87 FPU Load Constants Instructions
The load constants instructions load common constants, such as pie, into the x87 floating-point registers.

FLD1 - Load +1.0
FLDZ - Load +0.0
FLDPI - Load pie
FLDL2E - Load log2 e
FLDLN2 - Load loge 2
FLDL2T - Load log2 10
FLDLG2 - Load log10 2

2.6 x87 FPU Control Instructions
The x87 FPU control instructions operate on the x87 FPU register stack and sage and restore the x87 FPU state.

FINCSTP - Increment FPU register stack pointer
FDECSTP - Decrement FPU fegister stack pointer
FFREE - Free floating-point register
FINIT - Initialize FPU after checking error conditions
FNINIT - Initialize FPU without checking error conditiions
FCLEX - Clear floating-point exception flags after checking for error conditions
FNCLEX - Clear floating-point exception flags without checking for error conditions
FSTCW - Store FPU control word after checking error conditions
FNSTCW - Store FPU control word without checking error conditions
FLDCW - Load CPU control word
FSTENV - Store FPU environment after checking error conditions
FNSTENV - Store FPU environment without checking error conditions
FLDENV - Load FPU environment
FSAVE - Save FPU state after checking error conditions
FNSAVE - Save FPU state without checking error conditions
FRSTOR - Restore FPU state
FSTSW - Store FPU status word after checking error conditions
FNSTSW - Store FPU status word without checking error conditions
WAIT/FWAIT - Wait for FPU
FNOP - FPU no operation


3. X87 FPU AND SIMD STATE MANAGEMENT INSTRUCTIONS
Two state management instructions were introduced into the IA-32 architecture with the Pentium II processor family:

FXSAVE - Save x87 FPU and SIMD state
FXRTOR - Restore x87 Fpu and SIMD state

Initially, these instruction opreated only on the x87 FPU (and MMX) registers to perform a fast save and restore, respectively, of the x87 FPU and MMX state. With the introduction of SSE extensions in the Pentium III precessor family, these instructions were expanded to also save and restore the state of the XMM and MXCSR registers
[출처] IA32 processors 어셈블리 명령어모음|작성자 량

int 21h

INT 21H - 01H
키보드로부터 문자를 기다린다.
호출
AH = 01H
리턴
AL = 입력된 문자의 ASCII 코드

INT 21H - 02H
현재의 커서 위치에 문자를 출력한다. 속성은 커서 위치의 문자의 속성에 따른다.
호출
AH = 02H
DL = 문자의 ASCII 코드

INT 21H - 07H
키보드로부터 한 문자를 에코없이 입력받는다.
호출
AH = 07H
리턴
AL = 1byte의 ASCII 코드

INT 21H - 09H
문자열을 화면으로 출력한다.
호출
AH = 09H
DS:DX = 문자열의 세그먼트와 오프셋
※ 문자열은 반드시 '$' 알아서 오던데... ㅋㅋ

INT 21H - 0AH
키보드로부터 리턴키가 들어올때 까지 입력받은 문자를 버퍼에 저장한다.
AH = 0AH
DS:DX = 버퍼의 서그먼트와 오프셋

INT 21H - 19H
현재 드라입의 번호를 리턴한다.
호출
AH = 19H
리턴
AL = 드라이브 번호(0=A, 1=B, 2=C, 3=D, ...)

INT 21H - 25H
인터럽트 번호에 해당하는 입터럽트 백터의 내용을 바꾼다.
호출
AH = 25H
AL = 인터럽트 번호
DS:DX = 새로운 인터럽트 백터의 내용(세그먼트와 오프셋)

INT 21H - 2AH
시스템 날짜를 얻는다.
호출
AH = 2AH
리턴
CX = 년(1980~2099)
DH = 월(1~12)
DL = 일(1~31)
AL = 요일을 반환(0=Sun, 1=Mon)

INT 21H - 2BH
시스템의 날자를 설정한다.
호출
AH = 2BH
CX = 년(1980~2099)
DH = 월(1~12)
DL = 일(1~31)
리턴
호출이 성공하면 AL = 00H
호출이 실패하면 AL = FFH

INT 21H - 2CH
시스템의 시간을 얻어온다.
호출
AH = 2CH
리턴
CH = 시(0~23)
CL = 분(0~59)
DH = 초(0~59)
DL = 100분의 1초(0~99)

INT 21H - 2DH
시스템의 시간을 설정한다.
호출
AH = 2DH
CH = 시(0~23)
CL = 분(0~59)
DH = 초(0~59)
DL = 100분의 1초(0~99)
리턴
호출이 성공하면 AL = 00H
호출이 실패하면 AL = FFH

INT 21H - 35H
인터럽트 번호에 해당하는 인터럽트 백터의 값(리턴할 주소)을 얻는다.
호출
AH = 35H
AL = 인터럽트 번호
리턴
ES:BX = 인터럽트 백터의 내용(리턴할 주소의 세그먼트와 오프셋)

INT 21H - 36H
드라이브의 할당 정보를 얻는다.
호출
AH = 36H
DL = 드라이브 번호(0=Default, 1=A)
리턴
호출이 성공하면
AX = 클러스터당 섹터수
BX = 이용가능한 공간의 클러스터 수
CX = 섹터당 바이트수
DX = 드라이브당 클러스터 수

호출이 실패하면 AX = FFFFH

INT 21H - 3BH
현재의 디렉터리를 바꾼다.
호출
AH = 3BH
DS:DX = 디렉터리 이름이 담긴 ASCII 문자열의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 3CH
파일을 만든다.
호출
AH = 3CH
CX = 속성 (00=normal, 01=readonly, 02=hidden, 03=system)
DS:DX = 파일 이름의 ASCII 문자열의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, AX = 파일 핸들
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 3DH
파일 핸들에 따라 파일을 오픈한다.
AH = 3DH
AL = 파일의 엑세스 모드

파일 엑세스 모드
8비트로 구성
7 bit : 파일 핸들의 인계(0=자프로세스로 파일 핸들이 인계, 1=파일 핸들이 현재 프로세스에 존재)
4~6 bit : 분할모드(000=FCB오픈과 호환모드, 001=입출력 불가능, 010=출력 불가능, 011=입력 불가능, 100=모두 불가능)
3 bit : reserved
0~2 bit : (000=입력 엑세스, 001=출력 엑세스, 010=입출력 엑세스)

DS:DX = 파일명의 ASCII 문자열의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, AX = 파일 핸들
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 3EH
파일을 닫는다.
호출
AH = 3EH
DX = 파일 핸들
리턴
호출이 성공하면 carry flag = 0
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 3FH
파일 핸들을 이용하여 파일에서 자료를 읽는다.
호출
AH = 3FH
BX = 파일 핸들
CX = 읽을 바이트수
DS:DX = 읽어들인 자료가 저장될 버퍼의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, AX = 읽어들인 바이트 수
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 40H
파일 핸들을 이용하여 파일에 자료를 쓴다.
호출
AH = 40H
BX = 파일 핸들
CX = 쓸 바이트수
DS:DX = 쓸 자료가 저장되어 있는 버퍼의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, AX = 쓴 바이트 수
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 42H
파일의 현재 포인터를 옮긴다.
호출
AH = 42H
AL = (00H=파일의 시작에서부터, 01H=현재 포인터부터, 02H=화일의 끝에서부터)
BX = 파일 핸들
CX = 파일 포인터를 옮길 거리의 상위 워드
DX = 파일 포인터를 옮길 거리의 하위 워드
리턴
호출이 성공하면 carry flag = 0, DX = 옮겨진 파일 포인터의 상위워드, AX = 옮겨진 파일 포인터의 하위워드
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 43H
화일의 속성을 얻거나 새로운 속성으로 변경한다. 디스크상의 절대 섹터를 읽어들인다.
호출
AH = 43H
AL = (00H=파일의 속성을 얻는다, 01H=파일의 속성을 변경한다)
CX = 만일 AL=01H라면 화일의 새로운 속성

5 bit = archive
2 bit = system
1 bit = hidden
0 bit = readonly
DS:DX = 파일명의 ASCII 문자열의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, CX = 파일의 속성
호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 4BH
다른 프로그램을 실행한다.
호출
AH = 4BH
AL = 부함수(00H=프로그램을 실행, 03H=오버레이 프로그램을 메모리에 올림)
ES:BX = 파라메터 블럭의 세그먼트와 오프셋
DS:DX = 실행 파일 이름의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0
호출이 실패하면 carry flag = 1, AX = 에러번호

AL=00H 일때 파라메터 블럭의 내용
00H~01H = 환경 블럭의 세그먼트
02H~03H = 명령어 꼬리의 오프셋
04H~05H = 명령어 꼬리의 세그먼트
06H~07H = 자프로세서의 PSP에 복사될 첫번째 FCB의 오프셋
08H~09H = 첫번째 FCB의 세그먼트
0AH~0BH = 두번째 FCB의 오프셋
0CH~0DH = 두번째 FCB의 세그먼트

INT 21H - 4EH
ASCII 문자열에 따라 파일을 찾는다.
호출
AH = 4EH
CX = 찾을 파일의 속성
DS:DX = ASCII 문자열의 세그먼트와 오프셋
리턴
호출이 성공하면 carry flag = 0, 현재 DTA의 내용이 다음과 같이 변경된다.

0~20 byte = reserved
21 byte = 찾은 파일의 속성
22~23 byte = 파일이 생성, 변경된 시간(bit : 0BH~0FH=시, 05H~0AH=분, 00H~04H=2초단위 초)
24~25 byte = 파일이 생성, 변경된 날짜(bit : 09H~0FH=년, 05H~08H=월, 00H~04H=일)
26~29 byte = 파일의 크기
30~42 byte = ASCII 문자열의 파일 이름과 확장자

호출이 실패하면 carry flag = 1, AX = 에러번호

INT 21H - 4FH
4EH가 수행되고 난 후 계속해서 파일을 찾을 떄 사용한다. 그러므로 이 인터럽트를 사용하기 위해서는 4EH를 먼저 사용해야 한다.
호출
AH = 4FH
리턴
호출이 성공하면 carry flag = 0

0~20 byte = reserved
21 byte = 찾은 파일의 속성
22~23 byte = 파일이 생성, 변경된 시간(bit : 0BH~0FH=시, 05H~0AH=분, 00H~04H=2초단위 초)
24~25 byte = 파일이 생성, 변경된 날짜(bit : 09H~0FH=년, 05H~08H=월, 00H~04H=일)
26~29 byte = 파일의 크기
30~42 byte = ASCII 문자열의 파일 이름과 확장자

호출이 실패하면 carry flag = 1, AX = 에러번호
[출처] asm-INT 21H|작성자 량

2009년 12월 20일 일요일

int 10h

http://ko.wikipedia.org/wiki/INT_10

DOS용 라이브러리입니다

예전에 만들어 둔 DOS용 라이브러리입니다.
전체는 페이지의 규모상 못올려드리고 조금 편집했서
크기를 대폭 줄인겁니다. 참고만 하세요.

무식하게 올린다고 손가락질 하지 마세요. 저 원래 이렇게 삽니다.

COMMENT #
Code by JaeHyuk Cho
#

PUBLIC Putc_00, Putc_01
PUBLIC Putc, SetPutc
PUBLIC Puts_00
PUBLIC Putn_00
PUBLIC Puts, Putn, SetPuts, SetPutn
PUBLIC PutXY_00
PUBLIC PutXY, SetPutXY
PUBLIC GetXY_00
PUBLIC GetXY, SetGetXY
PUBLIC PutLineX, PutLineY
PUBLIC Box, Rectangle, Window, ClearScreen
PUBLIC SetWindow
PUBLIC GetText, PutText
PUBLIC WhereX_00, WhereY_00
PUBLIC WhereX, WhereY
PUBLIC SetWhereX, SetWhereY
PUBLIC MoveCursor_00
PUBLIC MoveCursor, CursorX, CursorY, CursorXY
PUBLIC SetMoveCursor
PUBLIC Blink_00
PUBLIC Blink, SetBlink
PUBLIC PutsXY, PutnXY, PutmXY
PUBLIC PrintF, _PrintF, PrintK, _PrintK
PUBLIC PutDump

PUBLIC TEXT_VideoMemory
PUBLIC TEXT_Page
PUBLIC TEXT_Color
PUBLIC TEXT_Character
PUBLIC TEXT_Res
PUBLIC TEXT_Window
PUBLIC TEXT_TabLength
PUBLIC TEXT_LineTable

ASSUME CS:CODE_TEXT, DS:DATA_TEXT, ES:NOTHING, SS:STACK_DEFAULT
CODE_TEXT SEGMENT
Putc_00 PROC FAR ; void far pascal Putc_00(unsigned int s_character)
PUSH BP
MOV BP, SP
PUSH DS
PUSHA
MOV AX, DATA_TEXT
MOV DS, AX
MOV AH, 0Eh ; BIOS Call - TTY
MOV AL, BYTE PTR [BP + 06h] ; s_character
MOV BL, BYTE PTR DATA_TEXT:TEXT_Color
MOV BH, BYTE PTR DATA_TEXT:TEXT_Page
INT DEF_INT_Video
POPA
POP DS
POP BP
RETF 2
Putc_00 ENDP
IncCursor PROC NEAR ; void near pascal IncCursor(void)
CALL FAR PTR CODE_TEXT:WhereX
INC AX
CMP AX, WORD PTR DATA_TEXT:TEXT_Window[0004h]
JBE SHORT L_IncCursor_00
CALL NEAR PTR CODE_TEXT:CarrigeReturn
CALL NEAR PTR CODE_TEXT:LineFeed
MAC_JumpShort
L_IncCursor_00 LABEL SHORT
PUSH AX
CALL FAR PTR CODE_TEXT:CursorX
L_IncCursor_01 LABEL SHORT
RETN
IncCursor ENDP
CarrigeReturn PROC NEAR ; void near pascal CarrigeReturn(void)
PUSH WORD PTR DATA_TEXT:TEXT_Window[0000h]
CALL FAR PTR CODE_TEXT:CursorX
RETN
CarrigeReturn ENDP
Scroll PROC NEAR ; void near pascal Scroll(void)
PUSH DS
PUSH ES
PUSH SI
PUSH DI
PUSH CX
PUSH DX
MOV CX, WORD PTR DATA_TEXT:TEXT_Window[0006h]
SUB CX, WORD PTR DATA_TEXT:TEXT_Window[0002h]
MOV DX, WORD PTR DATA_TEXT:TEXT_Window[0004h]
SUB DX, WORD PTR DATA_TEXT:TEXT_Window[0000h]
INC DX
MOV AX, WORD PTR DATA_TEXT:TEXT_Res[DEF_DWord_Low]
SHL AX, 01h
PUSH AX
PUSH AX
PUSH CX
PUSH DX
PUSH WORD PTR DATA_TEXT:TEXT_Window[0000h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0002h]
CALL NEAR PTR CODE_TEXT:GetTextOffset
POP DX
POP CX
POP AX
PUSH DS
POP ES
MOV DI, BX
ADD AX, BX
POP BX
MOV SI, AX
CLD
L_Scroll_00 LABEL SHORT
PUSH CX
PUSH SI
PUSH DI
MOV CX, DX
REPZ MOVSW
POP DI
POP SI
ADD SI, BX
ADD DI, BX
POP CX
LOOP SHORT L_Scroll_00
POP DX
POP CX
POP DI
POP SI
POP ES
POP DS
MOV AH, BYTE PTR DATA_TEXT:TEXT_Color
MOV AL, BYTE PTR DATA_TEXT:TEXT_Character
PUSH AX
PUSH WORD PTR DATA_TEXT:TEXT_Window[0000h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0004h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0006h]
CALL FAR PTR CODE_TEXT:PutLineX
RETN
Scroll ENDP
LineFeed PROC NEAR ; void near pascal LineFeed(void)
CALL FAR PTR CODE_TEXT:WhereY
INC AX
CMP AX, WORD PTR DATA_TEXT:TEXT_Window[0006h]
JBE SHORT L_LineFeed_00
CALL NEAR PTR CODE_TEXT:Scroll
MAC_JumpShort
L_LineFeed_00 LABEL SHORT
PUSH AX
CALL FAR PTR CODE_TEXT:CursorY
L_LineFeed_01 LABEL SHORT
RETN
LineFeed ENDP
BelBeep PROC NEAR ; void near pascal BelBeep(void)
PUSH 1000d
PUSH 80h
CALL FAR PTR CODE_SPEAKER:Beep
RETN
BelBeep ENDP
BackSpace PROC NEAR ; void near pascal BackSpace(void)
CALL FAR PTR CODE_TEXT:WhereX
CMP AX, WORD PTR DATA_TEXT:TEXT_Window[0000h]
JA SHORT L_BackSpace_00
CALL FAR PTR CODE_TEXT:WhereY
CMP AX, WORD PTR DATA_TEXT:TEXT_Window[0002h]
JE SHORT L_BackSpace_01
PUSH WORD PTR DATA_TEXT:TEXT_Window[0004h]
PUSH AX
CALL FAR PTR CODE_TEXT:CursorXY
MAC_JumpShort
L_BackSpace_00 LABEL SHORT
DEC AX
PUSH AX
CALL FAR PTR CODE_TEXT:CursorX
L_BackSpace_01 LABEL SHORT
RETN
BackSpace ENDP
Tab PROC NEAR ; void near pascal Tab(void)
PUSH CX
MOV CX, WORD PTR DATA_TEXT:TEXT_TabLength
L_Tab_00 LABEL SHORT
CALL NEAR PTR CODE_TEXT:IncCursor
LOOP SHORT L_Tab_00
POP CX
RETN
Tab ENDP
T_Putc_01 DB DEF_ASCII_CarrigeReturn
DW OFFSET CODE_TEXT:CarrigeReturn
DB DEF_ASCII_LineFeed
DW OFFSET CODE_TEXT:LineFeed
DB DEF_ASCII_Beep
DW OFFSET CODE_TEXT:BelBeep
DB DEF_ASCII_BackSpace
DW OFFSET CODE_TEXT:BackSpace
DB DEF_ASCII_Tab
DW OFFSET CODE_TEXT:Tab
DB DEF_Null
Putc_01 PROC FAR ; void far pascal Putc_01(unsigned int s_character)
PUSH BP
MOV BP, SP
PUSH DS
PUSH AX
PUSH BX
MOV AX, DATA_TEXT
MOV DS, AX
MOV AH, BYTE PTR DATA_TEXT:TEXT_Color
MOV AL, BYTE PTR [BP + 06h] ; s_character
MOV BX, OFFSET CODE_TEXT:T_Putc_01
L_Putc_01_00 LABEL SHORT
TEST BYTE PTR CODE_TEXT:[BX], 0FFh
JZ SHORT L_Putc_01_02
CMP AL, BYTE PTR CODE_TEXT:[BX]
JNE SHORT L_Putc_01_01
CALL WORD PTR CODE_TEXT:[BX + 0001h]
MAC_JumpShort
L_Putc_01_01 LABEL SHORT
ADD BX, 0001h + 0002h
JMP SHORT L_Putc_01_00
L_Putc_01_02 LABEL SHORT
PUSH AX
CALL FAR PTR CODE_TEXT:WhereX
PUSH AX
CALL FAR PTR CODE_TEXT:WhereY
PUSH AX
CALL FAR PTR CODE_TEXT:PutXY
CALL NEAR PTR CODE_TEXT:IncCursor
L_Putc_01_03 LABEL SHORT
POP BX
POP AX
POP DS
POP BP
RETF 2
Putc_01 ENDP
Putc PROC FAR ; void far pascal Putc(unsigned int s_character)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h]
MAC_CallFar , ,
POP BP
RETF 2
Putc ENDP
SetPutc PROC FAR ; void far pascal SetPutc(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_Putc[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_Putc[DEF_Far_Offset]
POP BP
RETF 4
SetPutc ENDP
Puts_00 PROC FAR ; void far pascal Puts(void far *s_string)
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
PUSH AX
XOR AH, AH
LDS SI, DWORD PTR [BP + 06h] ; s_string
CLD
L_Puts_00_00 LABEL SHORT
LODSB
OR AL, AL
JZ SHORT L_Puts_00_02
CMP AL, '\'
JNE SHORT L_Puts_00_01
LODSB
CMP AL, '\'
JE SHORT L_Puts_00_01
PUSH DS
PUSH DATA_TEXT
POP DS
MOV WORD PTR DATA_TEXT:TEXT_Color, AX
POP DS
JMP SHORT L_Puts_00_00
L_Puts_00_01 LABEL SHORT
PUSH AX
CALL FAR PTR CODE_TEXT:Putc
JMP SHORT L_Puts_00_00
L_Puts_00_02 LABEL SHORT
POP AX
POP SI
POP DS
POP BP
RETF 4
Puts_00 ENDP
Putn_00 PROC FAR ; void far pascal Putn_00(void far *s_string, unsigned int s_length)
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
PUSH AX
PUSH CX
MOV CX, WORD PTR [BP + 06h] ; s_length
JCXZ SHORT L_Putn_00_01
MOV AX, DATA_TEXT
MOV DS, AX
XOR AH, AH
LDS SI, DWORD PTR [BP + 08h] ; s_string
CLD
MOV AL, BYTE PTR CODE_TEXT:T_Putc_01
MOV BYTE PTR CODE_TEXT:T_Putc_01, AH
PUSH AX
L_Putn_00_00 LABEL SHORT
LODSB
PUSH AX
CALL FAR PTR CODE_TEXT:Putc
LOOP SHORT L_Putn_00_00
L_Putn_00_01 LABEL SHORT
POP AX
MOV BYTE PTR CODE_TEXT:T_Putc_01, AL
POP CX
POP AX
POP SI
POP DS
POP BP
RETF 4 + 2
Putn_00 ENDP
Puts PROC FAR ; void far pascal Puts(void far *s_string)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_string high
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_string low
MAC_CallFar , ,
POP BP
RETF 4
Puts ENDP
Putn PROC FAR ; void far pascal Putn(void far *s_string, unsigned int s_length)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 08h + DEF_Far_Segment] ; s_string high
PUSH WORD PTR [BP + 08h + DEF_Far_Offset] ; s_string low
PUSH WORD PTR [BP + 06h] ; s_length
MAC_CallFar , ,
POP BP
RETF 4 + 2
Putn ENDP
SetPuts PROC FAR ; void far pascal SetPuts(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_Puts[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_Puts[DEF_Far_Offset]
POP BP
RETF 4
SetPuts ENDP
SetPutn PROC FAR ; void far pascal SetPutn(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_Putn[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_Putn[DEF_Far_Offset]
POP BP
RETF 4
SetPutn ENDP
GetTextOffset PROC NEAR ; DS:BX near pascal GetTextOffset(unsigned int s_x, unsigned int s_y)
; DS:BX = (s_y MUL (res[0] SHL 01h)) + (s_x SHL 01h)
; Reserved DS, AX, BX, DX
PUSH BP
MOV BP, SP
MOV AX, DATA_TEXT
MOV DS, AX
MOV AX, WORD PTR DATA_TEXT:TEXT_Res[DEF_DWord_Low]
SHL AX, 01h
MUL WORD PTR [BP + 04h] ; s_y
MOV BX, WORD PTR [BP + 06h] ; s_x
SHL BX, 01h
ADD AX, BX
LDS BX, DWORD PTR DATA_TEXT:TEXT_VideoMemory
ADD BX, AX
POP BP
RETN 2 + 2
GetTextOffset ENDP
PutXY_00 PROC FAR ; void far pascal PutXY_00(unsigned int s_attr, unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH DS
PUSH AX
PUSH BX
PUSH DX
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
CALL NEAR PTR CODE_TEXT:GetTextOffset
MOV AX, WORD PTR [BP + 0Ah] ; s_attr
MOV WORD PTR DS:[BX], AX
POP DX
POP BX
POP AX
POP DS
POP BP
RETF 2 + 2 + 2
PutXY_00 ENDP
PutXY PROC FAR ; void far pascal PutXY(unsigned int s_attr, unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 0Ah] ; s_attr
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
MAC_CallFar , ,
POP BP
RETF 2 + 2 + 2
PutXY ENDP
SetPutXY PROC FAR ; void far pascal SetPutXY(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_PutXY[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_PutXY[DEF_Far_Offset]
POP BP
RETF 4
SetPutXY ENDP
GetXY_00 PROC FAR ; unsigned int far pascal GetXY_00(unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH DS
PUSH BX
PUSH DX
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
CALL NEAR PTR CODE_TEXT:GetTextOffset
MOV AX, WORD PTR DS:[BX]
POP DX
POP BX
POP DS
POP BP
RETF 2 + 2
GetXY_00 ENDP
GetXY PROC FAR ; unsigned int far pascal GetXY(unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
MAC_CallFar , ,
POP BP
RETF 2 + 2
GetXY ENDP
SetGetXY PROC FAR ; void far pascal SetGetXY(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_GetXY[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_GetXY[DEF_Far_Offset]
POP BP
RETF 4
SetGetXY ENDP
PutLineX PROC FAR ; void far pascal PutLineX(unsigned int s_attr, unsigned int s_x1, unsigned int s_x2, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH AX
PUSH CX
MOV CX, WORD PTR [BP + 08h] ; s_x2
MOV AX, WORD PTR [BP + 0Ah] ; s_x1
SUB CX, AX
INC CX
L_PutLineX_00 LABEL SHORT
PUSH WORD PTR [BP + 0Ch] ; s_attr
PUSH AX
INC AX
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:PutXY
LOOP SHORT L_PutLineX_00
L_PutLineY_00 LABEL SHORT
POP CX
POP AX
POP BP
RETF 2 + 2 + 2 + 2
PutLineX ENDP
PutLineY PROC FAR ; void far pascal PutLineY(unsigned int s_attr, unsigned int s_x, unsigned int s_y1, unsigned int s_y2)
PUSH BP
MOV BP, SP
PUSH AX
PUSH CX
MOV CX, WORD PTR [BP + 06h] ; s_y2
MOV AX, WORD PTR [BP + 08h] ; s_y1
SUB CX, AX
INC CX
L_PutLineY_01 LABEL SHORT
PUSH WORD PTR [BP + 0Ch] ; s_attr
PUSH WORD PTR [BP + 0Ah] ; s_x
PUSH AX
INC AX
CALL FAR PTR CODE_TEXT:PutXY
LOOP SHORT L_PutLineY_01
MAC_JumpShort
PutLineY ENDP
Box PROC FAR ; void far pascal Box
; unsigned int s_attr : 0Eh
; unsigned int s_x1 : 0Ch
; unsigned int s_y1 : 0Ah
; unsigned int s_x2 : 08h
; unsigned int s_y2 : 06h
PUSH BP
MOV BP, SP
PUSH AX
PUSH CX
MOV CX, WORD PTR [BP + 06h] ; s_y2
MOV AX, WORD PTR [BP + 0Ah] ; s_y1
SUB CX, AX
INC CX
L_Box_00 LABEL SHORT
PUSH WORD PTR [BP + 0Eh] ; s_attr
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH AX
INC AX
CALL FAR PTR CODE_TEXT:PutLineX
LOOP SHORT L_Box_00
POP CX
POP AX
POP BP
RETF 2 + 2 + 2 + 2 + 2
Box ENDP
Rectangle PROC FAR ; void far pascal Rectangle
; unsigned int s_attr & type : 0Eh
; unsigned int s_x1 : 0Ch
; unsigned int s_y1 : 0Ah
; unsigned int s_x2 : 08h
; unsigned int s_y2 : 06h
PUSH BP
MOV BP, SP
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX, DATA_TEXT
MOV DS, AX
MOV CX, WORD PTR [BP + 0Eh] ; s_attr & type
MOV BL, CL
XOR BH, BH
SHL BX, 04h
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 0001h]
MOV AX, WORD PTR [BP + 0Ch] ; s_x1
INC AX
MOV DX, WORD PTR [BP + 08h] ; s_x2
DEC DX
PUSH CX
PUSH AX
PUSH DX
PUSH WORD PTR [BP + 0Ah] ; s_y1
CALL FAR PTR CODE_TEXT:PutLineX
PUSH CX
PUSH AX
PUSH DX
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:PutLineX
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 0000h]
MOV AX, WORD PTR [BP + 0Ah] ; s_y1
INC AX
MOV DX, WORD PTR [BP + 06h] ; s_y2
DEC DX
PUSH CX
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH AX
PUSH DX
CALL FAR PTR CODE_TEXT:PutLineY
PUSH CX
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH AX
PUSH DX
CALL FAR PTR CODE_TEXT:PutLineY
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 0002h]
PUSH CX
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 0Ah] ; s_y1
CALL FAR PTR CODE_TEXT:PutXY
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 0004h]
PUSH CX
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 0Ah] ; s_y1
CALL FAR PTR CODE_TEXT:PutXY
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 0008h]
PUSH CX
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:PutXY
MOV CL, BYTE PTR DATA_TEXT:TEXT_LineTable[BX + 000Ah]
PUSH CX
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:PutXY
POP DX
POP CX
POP BX
POP AX
POP DS
POP BP
RETF 2 + 2 + 2 + 2 + 2
Rectangle ENDP
Window PROC FAR ; void far pascal Window
PUSH BP
MOV BP, SP
; unsigned int s_attr & type : 0Eh
; unsigned int s_x1 : 0Ch
; unsigned int s_y1 : 0Ah
; unsigned int s_x2 : 08h
; unsigned int s_y2 : 06h
PUSH AX
MOV AX, WORD PTR [BP + 0Eh] ; s_attr & type
MOV AL, DEF_ASCII_Space
PUSH AX
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 0Ah] ; s_y1
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:PutLineY
PUSH AX
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 0Ah] ; s_y1
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:PutLineY
PUSH WORD PTR [BP + 0Eh] ; s_attr & type
INC WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 0Ah] ; s_y1
DEC WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:Rectangle
PUSH AX
INC WORD PTR [BP + 0Ch] ; s_x1
PUSH WORD PTR [BP + 0Ch] ; s_x1
INC WORD PTR [BP + 0Ah] ; s_y1
PUSH WORD PTR [BP + 0Ah] ; s_y1
DEC WORD PTR [BP + 08h] ; s_x2
PUSH WORD PTR [BP + 08h] ; s_x2
DEC WORD PTR [BP + 06h] ; s_y2
PUSH WORD PTR [BP + 06h] ; s_y2
CALL FAR PTR CODE_TEXT:Box
POP AX
POP BP
RETF 2 + 2 + 2 + 2 + 2
Window ENDP
ClearScreen PROC FAR ; void far pascal ClearScreen(unsigned int s_attr)
PUSH BP
MOV BP, SP
PUSH DS
PUSH DATA_TEXT
POP DS
PUSH WORD PTR [BP + 06h] ; s_attr
PUSH WORD PTR DATA_TEXT:TEXT_Window[0000h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0002h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0004h]
PUSH WORD PTR DATA_TEXT:TEXT_Window[0006h]
CALL FAR PTR CODE_TEXT:Box
POP DS
POP BP
RETF 2
ClearScreen ENDP
SetWindow PROC FAR ; void far pascal SetWindow(unsigned int s_x1, unsigned int s_y1, unsigned int s_x2, unsigned int s_y2)
PUSH BP
MOV BP, SP
PUSH DS
PUSH DATA_TEXT
POP DS
PUSH WORD PTR [BP + 0Ch] ; s_x1
POP WORD PTR DATA_TEXT:TEXT_Window[0000h]
PUSH WORD PTR [BP + 0Ah] ; s_y1
POP WORD PTR DATA_TEXT:TEXT_Window[0002h]
PUSH WORD PTR [BP + 08h] ; s_x2
POP WORD PTR DATA_TEXT:TEXT_Window[0004h]
PUSH WORD PTR [BP + 06h] ; s_y2
POP WORD PTR DATA_TEXT:TEXT_Window[0006h]
POP DS
POP BP
RETF 2 + 2 + 2 + 2
SetWindow ENDP
GetText PROC FAR ; void far pascal GetText
; void far *s_dest : 0Eh
; unsigned int s_x1 : 0Ch
; unsigned int s_y1 : 0Ah
; unsigned int s_x2 : 08h
; unsigned int s_y2 : 06h
PUSH BP
MOV BP, SP
PUSH ES
PUSHA
LES DI, DWORD PTR [BP + 0Eh] ; s_dest
CLD
MOV CX, WORD PTR [BP + 06h] ; s_y2
MOV DX, WORD PTR [BP + 0Ah] ; s_y1
SUB CX, DX
INC CX
L_GetText_00 LABEL SHORT
PUSH CX
MOV CX, WORD PTR [BP + 08h] ; s_x2
MOV BX, WORD PTR [BP + 0Ch] ; s_x1
SUB CX, BX
INC CX
L_GetText_01 LABEL SHORT
PUSH BX
PUSH DX
CALL FAR PTR CODE_TEXT:GetXY
STOSW
INC BX
LOOP SHORT L_GetText_01
INC DX
POP CX
LOOP SHORT L_GetText_00
L_PutText_00 LABEL SHORT
POPA
POP ES
POP BP
RETF 4 + 2 + 2 + 2 + 2
GetText ENDP
PutText PROC FAR ; void far pascal PutText
; void far *s_src : 0Eh
; unsigned int s_x1 : 0Ch
; unsigned int s_y1 : 0Ah
; unsigned int s_x2 : 08h
; unsigned int s_y2 : 06h
PUSH BP
MOV BP, SP
PUSH ES
PUSHA
LDS SI, DWORD PTR [BP + 0Eh] ; s_src
CLD
MOV CX, WORD PTR [BP + 06h] ; s_y2
MOV DX, WORD PTR [BP + 0Ah] ; s_y1
SUB CX, DX
INC CX
L_PutText_01 LABEL SHORT
PUSH CX
MOV CX, WORD PTR [BP + 08h] ; s_x2
MOV BX, WORD PTR [BP + 0Ch] ; s_x1
SUB CX, BX
INC CX
L_PutText_02 LABEL SHORT
LODSW
PUSH AX
PUSH BX
PUSH DX
CALL FAR PTR CODE_TEXT:PutXY
INC BX
LOOP SHORT L_PutText_02
INC DX
POP CX
LOOP SHORT L_PutText_01
MAC_JumpShort
PutText ENDP
WhereX_00 PROC FAR ; unsigned int far pascal WhereX_00(void)
PUSH DS
XOR AX, AX
MOV DS, AX
MOV AL, BYTE PTR DS:[0450h + DEF_Word_Low]
POP DS
RETF
WhereX_00 ENDP
WhereY_00 PROC FAR ; unsigned int far pascal WhereY_00(void)
PUSH DS
XOR AX, AX
MOV DS, AX
MOV AL, BYTE PTR DS:[0450h + DEF_Word_High]
POP DS
RETF
WhereY_00 ENDP
WhereX PROC FAR ; unsigned int far pascal WhereX(void)
MAC_CallFar , ,
RETF
WhereX ENDP
WhereY PROC FAR ; unsigned int far pascal WhereY(void)
MAC_CallFar , ,
RETF
WhereY ENDP
SetWhereX PROC FAR ; void far pascal SetWhereX(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_WhereX[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_WhereX[DEF_Far_Offset]
POP BP
RETF 4
SetWhereX ENDP
SetWhereY PROC FAR ; void far pascal SetWhereY(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_WhereY[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_WhereY[DEF_Far_Offset]
POP BP
RETF 4
SetWhereY ENDP
MoveCursor_00 PROC FAR ; void far pascal MoveCursor_00(unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
XOR AX, AX
MOV DS, AX
MOV BX, WORD PTR [BP + 08h] ; s_x
MOV AX, WORD PTR [BP + 06h] ; s_y
CMP BX, 0FFFFh
JNE SHORT L_MoveCursor_00_00
MOV BL, BYTE PTR DS:[0450h + DEF_Word_Low]
XOR BH, BH
L_MoveCursor_00_00 LABEL SHORT
CMP AX, 0FFFFh
JNE SHORT L_MoveCursor_00_01
MOV AL, BYTE PTR DS:[0450h + DEF_Word_High]
XOR AH, AH
L_MoveCursor_00_01 LABEL SHORT
MOV BYTE PTR DS:[0450h + DEF_Word_Low], BL
MOV BYTE PTR DS:[0450h + DEF_Word_High], AL
MOV DX, DATA_TEXT
MOV DS, DX
MUL WORD PTR DATA_TEXT:TEXT_Res[DEF_DWord_Low]
ADD BX, AX
MOV DX, 03D4h
MOV AH, BH
MOV AL, 0Eh
OUT DX, AX
MOV AL, 0Fh
MOV AH, BL
OUT DX, AX
POP DX
POP CX
POP BX
POP AX
POP DS
POP BP
RETF 2 + 2
MoveCursor_00 ENDP
MoveCursor PROC FAR ; void far pascal MoveCursor(unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
MAC_CallFar , ,
POP BP
RETF 2 + 2
MoveCursor ENDP
CursorX PROC FAR ; void far pascal CursorX(unsigned int s_x)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h] ; s_x
PUSH 0FFFFh
CALL FAR PTR CODE_TEXT:MoveCursor
POP BP
RETF 2
CursorX ENDP
CursorY PROC FAR ; void far pascal CursorY(unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH 0FFFFh
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:MoveCursor
POP BP
RETF 2
CursorY ENDP
CursorXY PROC FAR ; void far pascal CursorXY(unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:MoveCursor
POP BP
RETF 2
CursorXY ENDP
SetMoveCursor PROC FAR ; void far pascal SetMoveCursor(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_MoveCursor[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_MoveCursor[DEF_Far_Offset]
POP BP
RETF 4
SetMoveCursor ENDP
Blink_00 PROC FAR ; void far pascal Blink_00(unsigned int s_sw)
PUSH BP
MOV BP, SP
PUSH AX
PUSH DX
MOV DX, 03D4h + 0006h
IN AL, DX
MOV DX, 03C0h
MOV AL, 10h
OUT DX, AL
INC DX
IN AL, DX
TEST WORD PTR [BP + 06h], 0FFFFh ; s_sw
JZ SHORT L_Blink_00_00
OR AL, 08h
MAC_JumpShort
L_Blink_00_00 LABEL SHORT
AND AL, 0F7h
L_Blink_00_01 LABEL SHORT
DEC DX
OUT DX, AL
MOV DX, 03D4h + 0006h
IN AL, DX
MOV DX, 03C0h
MOV AL, 20h
OUT DX, AL
POP DX
POP AX
POP BP
RETF 2
Blink_00 ENDP
Blink PROC FAR ; void far pascal Blink(unsigned int s_sw)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h] ; s_sw
MAC_CallFar , ,
POP BP
RETF 2
Blink ENDP
SetBlink PROC FAR ; void far pascal SetBlink(void far *s_function)
PUSH BP
MOV BP, SP
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_function high
POP WORD PTR CODE_TEXT:C_Blink[DEF_Far_Segment]
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_function low
POP WORD PTR CODE_TEXT:C_Blink[DEF_Far_Offset]
POP BP
RETF 4
SetBlink ENDP
PutsXY PROC FAR ; void far pascal PutsXY
; unsigned int s_attr : 0Eh
; void far *s_string : 0Ah
; unsigned int s_x : 08h
; unsigned int s_y : 06h
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
PUSH AX
LDS SI, DWORD PTR [BP + 0Ah] ; s_string
CLD
MOV AH, BYTE PTR [BP + 0Eh] ; s_attr
L_PutsXY_00 LABEL SHORT
LODSB
OR AL, AL
JZ SHORT L_PutsXY_01
PUSH AX
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:PutXY
INC WORD PTR [BP + 08h] ; s_x
JMP SHORT L_PutsXY_00
L_PutsXY_01 LABEL SHORT
POP AX
POP SI
POP DS
POP BP
RETF 2 + 4 + 2 + 2
PutsXY ENDP
PutnXY PROC FAR ; void far pascal PutnXY(unsigned int s_attr, void far *s_string, unsigned int s_length, unsigned int s_x, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
PUSH AX
PUSH CX
MOV CX, WORD PTR [BP + 0Ah] ; s_length
JCXZ SHORT L_PutnXY_00
LDS SI, DWORD PTR [BP + 0Ch] ; s_string
CLD
MOV AH, BYTE PTR [BP + 10h] ; s_attr
L_PutnXY_00 LABEL SHORT
LODSB
PUSH AX
PUSH WORD PTR [BP + 08h] ; s_x
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:PutXY
INC WORD PTR [BP + 08h] ; s_x
LOOP SHORT L_PutnXY_00
L_PutnXY_01 LABEL SHORT
POP CX
POP AX
POP SI
POP DS
POP BP
RETF 2 + 4 + 2 + 2 + 2
PutnXY ENDP
PutmXY PROC FAR ; void far pascal PutmXY(unsigned int s_attr, void far *s_string, unsigned int s_x1, unsigned int s_x2, unsigned int s_y)
PUSH BP
MOV BP, SP
PUSH AX
PUSH DX
PUSH WORD PTR [BP + 0Ch + DEF_Far_Segment] ; s_string high
PUSH WORD PTR [BP + 0Ch + DEF_Far_Offset] ; s_string low
CALL FAR PTR CODE_STRING:StrLen
SHR AX, 01h
PUSH AX
PUSH WORD PTR [BP + 0Ah] ; s_x1
PUSH WORD PTR [BP + 08h] ; s_x2
CALL FAR PTR CODE_CALC:Center
POP DX
SUB AX, DX
PUSH WORD PTR [BP + 10h] ; s_attr
PUSH WORD PTR [BP + 0Ch + DEF_Far_Segment] ; s_string high
PUSH WORD PTR [BP + 0Ch + DEF_Far_Offset] ; s_string low
PUSH AX
PUSH WORD PTR [BP + 06h] ; s_y
CALL FAR PTR CODE_TEXT:PutsXY
POP DX
POP AX
POP BP
RETF 2 + 4 + 2 + 2 + 2
PutmXY ENDP
_PrintF PROC FAR ; void far cdecl _PrintF(void far *s_format, ...)
PrintF PROC FAR ; void far cdecl PrintF(void far *s_format, ...)
PUSH BP
MOV BP, SP
PUSH AX
PUSH DX
PUSH DEF_PrintF_Max
CALL FAR PTR CODE_HEAP:New
PUSH DX
PUSH AX
PUSH DX
PUSH AX
PUSH DX
PUSH AX
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_format high
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_format low
PUSH SS
LEA AX, WORD PTR [BP + 0Ah] ; ...
PUSH AX
CALL FAR PTR CODE_STRING:VSPrintf
CALL FAR PTR CODE_TEXT:Puts
CALL FAR PTR CODE_HEAP:Delete
POP DX
POP AX
POP BP
RETF
PrintF ENDP
_PrintF ENDP
_PrintK PROC FAR ; void far cdecl _PrintK(void far *s_format, ...)
PrintK PROC FAR ; void far cdecl PrintK(void far *s_format, ...)
PUSH BP
MOV BP, SP
PUSH AX
PUSH DX
PUSH DEF_PrintK_Max
CALL FAR PTR CODE_HEAP:New
PUSH DX
PUSH AX
PUSH DX
PUSH AX
PUSH DX
PUSH AX
PUSH WORD PTR [BP + 06h + DEF_Far_Segment] ; s_format high
PUSH WORD PTR [BP + 06h + DEF_Far_Offset] ; s_format low
PUSH SS
LEA AX, WORD PTR [BP + 0Ah] ; ...
PUSH AX
CALL FAR PTR CODE_STRING:VSPrintf
CALL FAR PTR CODE_TEXT:Puts
CALL FAR PTR CODE_HEAP:Delete
POP DX
POP AX
POP BP
RETF
PrintK ENDP
_PrintK ENDP
PutDump PROC FAR ; void far pascal PutDump(void far *s_buffer, unsigned long s_base, unsigned int s_length)
PUSH BP
MOV BP, SP
PUSH DS
PUSH SI
PUSH AX
PUSH CX
LDS SI, DWORD PTR [BP + 0Ch] ; s_buffer
CLD
XOR CX, CX
L_PutDump_00 LABEL SHORT
PUSH CX
MOV CX, DEF_SIZE_Para
PUSH WORD PTR [BP + 08h + DEF_DWord_High]
PUSH WORD PTR [BP + 08h + DEF_DWord_Low]
PUSH DATA_TEXT
PUSH OFFSET DATA_TEXT:TEXT_PutDump_00
CALL FAR PTR CODE_TEXT:PrintF
ADD SP, 0004h + 0004h
PUSH DS
PUSH SI
L_PutDump_01 LABEL SHORT
LODSB
XOR AH, AH
PUSH AX
PUSH DATA_TEXT
PUSH OFFSET DATA_TEXT:TEXT_PutDump_01
CALL FAR PTR CODE_TEXT:PrintF
ADD SP, 0004h + 0002h
CMP CX, 09h
JNE L_PutDump_02
PUSH '-'
CALL FAR PTR CODE_TEXT:Putc
PUSH ' '
CALL FAR PTR CODE_TEXT:Putc
L_PutDump_02 LABEL SHORT
LOOP SHORT L_PutDump_01
PUSH DEF_SIZE_Para
CALL FAR PTR CODE_TEXT:PutN
PUSH DEF_ASCII_CarrigeReturn
CALL FAR PTR CODE_TEXT:Putc
PUSH DEF_ASCII_LineFeed
CALL FAR PTR CODE_TEXT:Putc
POP CX
ADD CX, DEF_SIZE_Para
ADD WORD PTR [BP + 08h + DEF_DWord_Low], DEF_SIZE_Para ; s_base low
ADC WORD PTR [BP + 08h + DEF_DWord_High], DEF_Null ; s_base high
CMP CX, WORD PTR [BP + 06h] ; s_length
JB SHORT L_PutDump_00
POP CX
POP AX
POP SI
POP DS
POP BP
RETF 4 + 4 + 2
PutDump ENDP
CODE_TEXT ENDS

ASSUME CS:CODE_TEXT, DS:DATA_TEXT, ES:NOTHING, SS:STACK_DEFAULT
DATA_TEXT SEGMENT
TEXT_VideoMemory DW 0000h, 0B800h
TEXT_Page DW 0000h
TEXT_Color DW 0007h
TEXT_Character DW DEF_ASCII_Space
TEXT_Res DW 80d, 25d
TEXT_Window DW 0d, 0d, 79d, 24d
TEXT_TabLength DW 0008h
TEXT_LineTable DB 0B3h, 0C4h, 0DAh, 0C2h, 0BFh, 0C3h, 0C5h, 0B4h, 0C0h, 0C1h, 0D9h, "Dump"
DB 0BAh, 0CDh, 0C9h, 0CBh, 0BBh, 0CCh, 0CEh, 0B9h, 0C8h, 0CAh, 0BCh, "Dump"
DB 0B3h, 0CDh, 0D5h, 0D1h, 0B8h, 0C6h, 0D8h, 0B5h, 0D4h, 0CFh, 0BEh, "Dump"
DB 0BAh, 0C4h, 0D6h, 0D2h, 0B7h, 0C7h, 0D7h, 0B6h, 0D3h, 0D0h, 0BDh, "Dump"
TEXT_PutDump_00 DB "[$08LX] ", DEF_ASCII_EndOfString
TEXT_PutDump_01 DB "$02X ", DEF_ASCII_EndOfString
DATA_TEXT ENDS

ASSUME CS:CODE_TEXT, DS:BSS_TEXT, ES:NOTHING, SS:STACK_DEFAULT
BSS_TEXT SEGMENT
BSS_TEXT ENDS
END

; End of source