CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
ORG 100h
START:
mov bx,offset _END ;↓自分のメモリを確保するための計算
mov cl,4
shr bx,cl
inc bx ;↑ここまで
mov sp,offset _END ;SP設定
mov ah,4Ah
int 21h ;自分のメモリ確保
mov ah,9
mov dx,offset MSG1
int 21h ;メッセージ表示
MAIN:
mov ah,19h ;↓プロンプト作成
int 21h ; カレントドライブ
add al,'A'
mov PROMPT,al
mov ah,47h
mov dl,0
mov si,offset PROMPT +3
int 21h ; カレントディレクトリ
mov di,si
mov cx,64
mov al,0
repnz scasb
mov [di-1],byte ptr '>'
mov [di] ,byte ptr '$';↑プロンプト作成
mov ah,9
mov dx,offset PROMPT
int 21h ;プロンプト表示
mov ah,0Ah
mov dx,offset BUF
int 21h ;文字列入力
mov cx,4 ;↓入力文字が'exit'か?
mov si,offset BUF + 2
mov di,offset _EXIT
CHK_EXIT:
lodsb
and al,0DFh ; 大文字に変換
cmp [di],al
jnz CHK_END
inc di
loop CHK_EXIT
lodsb
cmp al,20h
ja CHK_END
jmp short BYEBYE ;↑ここまで
CHK_END:
mov ah,6
mov dl,0Dh
int 21h
mov dl,0Ah
int 21h ;改行
mov _SS,ss
mov _SP,sp
mov si,offset BUF +1
int 2Eh
cli ;割り込み不可
push cs
pop ds
push cs
pop es
mov ss,_SS
mov sp,_SP
sti ;割り込み許可
mov ah,6
mov dl,0Dh
int 21h
mov dl,0Ah
int 21h ;改行
jmp short MAIN
BYEBYE:
mov ah,9
mov dx,offset MSG2
int 21h
mov ax,4C00h
int 21h
INT23: ;新しいCTRL +C の処理
iret
MSG1 db 0Dh,0Ah,'いらっしゃいませ。。。',0Dh,0Ah,24h
MSG2 db 0Dh,0Ah,0Ah,'さようなら。。。',0Dh,0Ah,24h
_EXIT db 'EXIT'
PROMPT db ?,':\',64 dup(?)
BUF db 100,100 dup(?)
_SS dw ?
_SP dw ?
dw 30 dup(?)
_END:
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|