어셈블리어 그래픽 색상 관련질문입니다. 어셈블리어 잘하시는

gyxor의 이미지

어셈블리어를 이용해서 에디터를 만들려고 하는데요
색상이 전경색은 16가지이고 배경색은 8가지만 선택할 수 있더라구요
mov ah,09h
mov al,'문자'
mov bh,페이지번호
mov bl,색상
int 10h

이런 인터럽트가 있는데요
BL 에 들어가는 1바이트의 범위에서는 ..
아무튼 색깔의 선택범위가 너무 적은거 같아요
예전에 도스용 프로그램을 썼을땐 색상선택이 꽤 많았던걸로 기억하는데요 MDIR 이나.. NORTON 등등..
색상선택을 더 다양하게 할 수있는 방법을 알려주시면 감사하겠습니다.

또한 ---- 등의 선 문자가 깨져서 한글이나 한문으로 나타나는 증상을 없애려면 어떻게 해야하나요?
(도스시절엔 hbios 등을 사용안하면 되는거였는데여..)
지금은 어떻게 하는지 모르겠습니다.

마지막으로 도스모드에서 아스키 문자말고 그래픽 파일을 링크 시키는 방법은 없는지 궁금합니다.

세가지 답변부탁드립니다.

Necromancer의 이미지

텍스트모드이신가요?

일반적인 VGA 텍스트모드일경우 메모리 주소
0xB800:0 - 0xB800:0x7FFF까지가 비디오램 영역입니다.
이 비디오램 영역을 직접 접근해서 처리하시기 바랍니다. int 0x10 쓰면
괜히 속도만 느릴 뿐입니다.
텍스트모드일때의 비디오램은 한 문자당 2바이트씩을 차지하는데,
첫번째 바이트는 ASCII 코드고, 두번째 바이트가 색상정보입니다.

색상 정보는 아래와 같이 되죠. (정확히는 모르겠네요. 기억나는데로 적었습니다)
bit 7 : blink(글자 깜박거리기)
bit 6 : 배경 R
bit 5 : 배경 G
bit 4 : 배경 B
bit 3 : 강조(글자가 굵게보임)
bit 2 : 글자색 R
bit 1 : 글자색 G
bit 0 : 글자색 B

접근하는 방법은 간단합니다. 화면 좌표를 x,y로 한다면 접근해야 할 주소는
(y*80+x)*2가 됩니다. 이 값을 위의 비디오램 시작 주소에 더하면
됩니다.

하지만, 색상 정보는 늘릴 방법이 없습니다. 텍스트모드일경우 위와같이
표시하는게 관행이라서 거의 대부분의 VGA카드가 위 규격만을
따르고있으니까요. MDIR도 알고보면 위 색상과 ASCII 코드중에 특수문자
몇가지를 잘 사용해서 꾸민겁니다.

gyxor wrote:
어셈블리어를 이용해서 에디터를 만들려고 하는데요
색상이 전경색은 16가지이고 배경색은 8가지만 선택할 수 있더라구요
mov ah,09h
mov al,'문자'
mov bh,페이지번호
mov bl,색상
int 10h

이런 인터럽트가 있는데요
BL 에 들어가는 1바이트의 범위에서는 ..
아무튼 색깔의 선택범위가 너무 적은거 같아요
예전에 도스용 프로그램을 썼을땐 색상선택이 꽤 많았던걸로 기억하는데요 MDIR 이나.. NORTON 등등..
색상선택을 더 다양하게 할 수있는 방법을 알려주시면 감사하겠습니다.

또한 ---- 등의 선 문자가 깨져서 한글이나 한문으로 나타나는 증상을 없애려면 어떻게 해야하나요?
(도스시절엔 hbios 등을 사용안하면 되는거였는데여..)
지금은 어떻게 하는지 모르겠습니다.

마지막으로 도스모드에서 아스키 문자말고 그래픽 파일을 링크 시키는 방법은 없는지 궁금합니다.

세가지 답변부탁드립니다.

Written By the Black Knight of Destruction

익명 사용자의 이미지

MDIR은 다음과 같이 VideoRam에다가 직접 데이터를 넣습니다.
참고로 MDIR은 Pascal로 만들었다고 들었습니다.

*(((unsigned short *)0xb8000000L) + (y * 160) + (x << 1)) = 'A' | ( COLOR << 8 );

Linux에서는 ANSI code를 써야 합니다. 터미날이기 때문에...

cdpark의 이미지

minzkn wrote:
Linux에서는 ANSI code를 써야 합니다. 터미날이기 때문에...

ANSI code..라뇨? (잘못된 용어를 Linux world에까지..)

slang이나 ncurses 등의 라이브러리를 이용하면 됩니다. 어떤 터미날이 붙을 지 모르니깐요.

urmajest의 이미지

글자가 깨어진다고 하신건 chcp 437로 코드페이지를 변환하면 됩니다.

다양한 글자색을 이용하실려면 비디오 모드를 전환하세요.

256컬러까지 가능한 걸로 알고 있습니다.

그래픽 파일을 링크한다는건 좀 이상하네요.

jpg같은 포맷의 파일을 보여준다는 것인가요?

그렇게 할려면 그래픽 파일을 읽고 파싱해서 그려주는 모듈을 구하거나

만들어야 겠죠. 선이나 간단한 drawing을 하실려면 그래픽 모드로 전환 후

pixel dot을 찍는 인터럽트를 이용해 위치와 색깔을 지정후 픽셀을

찍어주면 됩니다. 물론 위에서 다른 분이 언급하신 direct write가 더 빠른

방법이지요.

역시 이 모든 내용은 많은 어셈블리 언어 책에서 설명하고 있습니다.

찾아보시길 ^^

익명 사용자의 이미지

예전에 만들어 둔 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_01>
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_01>
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_01>
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_03>
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 <CODE_TEXT>, <OFFSET CODE_TEXT:Putc_00>, <C_Putc>
                   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 <CODE_TEXT>, <OFFSET CODE_TEXT:Puts_00>, <C_Puts>
                   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 <CODE_TEXT>, <OFFSET CODE_TEXT:Putn_00>, <C_Putn>
                   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 <CODE_TEXT>, <OFFSET CODE_TEXT:PutXY_00>, <C_PutXY>
                   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 <CODE_TEXT>, <OFFSET CODE_TEXT:GetXY_00>, <C_GetXY>
                   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 <L_PutLineY_00>
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 <L_PutText_00>
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 <CODE_TEXT>, <OFFSET CODE_TEXT:WhereX_00>, <C_WhereX>
                   RETF
WhereX             ENDP
WhereY             PROC FAR ; unsigned int far pascal WhereY(void)
                   MAC_CallFar <CODE_TEXT>, <OFFSET CODE_TEXT:WhereY_00>, <C_WhereY>
                   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 <CODE_TEXT>, <OFFSET CODE_TEXT:MoveCursor_00>, <C_MoveCursor>
                   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_01>
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 <CODE_TEXT>, <OFFSET CODE_TEXT:Blink_00>, <C_Blink>
                   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

익명 사용자의 이미지

cdpark wrote:
minzkn wrote:
Linux에서는 ANSI code를 써야 합니다. 터미날이기 때문에...

ANSI code..라뇨? (잘못된 용어를 Linux world에까지..)

slang이나 ncurses 등의 라이브러리를 이용하면 됩니다. 어떤 터미날이 붙을 지 모르니깐요.

통상적인 예기를 하고파요.~
ANSI code라는 말이 정말로 잘못된 용어입니까?
Escape code라고 해야 하나요?
전 그것이 같다고 알고 있는데....
대부분 터미날은 같지 않을까요? 통상통상.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.