CODE SEGMENT
ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE
.186
ORG 100h
START:
mov bx,offset DATA
mov cx,50
call LINEINP
mov ah,2
DISP:
mov dl,[bx]
int 21h ;表示
inc bx
cmp dl,0dh
jnz DISP
mov ax,4c00h
int 21h
DATA db 52 dup(?) ;バッファー
;+------------------------
;|1行入力
;|最後には 0Dh が入る
;+------------------------
;|in bx <= buffer(offset)
;| cx <= 最大文字数
;+------------------------
;|out ax <= 入力文字数
;| (改行なし)
;+------------------------
;|break ; ax
;+------------------------
LINEINP proc
push dx
push di
inc cx
mov di,0
INPUT: mov ah,8
int 21h
cmp al,8 ;BSか?
jz _BS
mov [bx+di],al
cmp al,0dh ;リターンキーか?
jz _RET
cmp di,cx ;文字数制限大丈夫?
jz OVER
inc di
DISPC: mov dl,al
mov ah,2
int 21h ;disp char
jmp short INPUT
OVER:
mov [di+bx-1],al ;入力可能文字数を超えていた場合の処理
push ax
mov ah,2
mov dl,8
int 21h ;disp BS
pop ax
jmp short DISPC
_BS: or di,di
jz INPUT ;何も入力されていなかったらBS無効
mov ah,2
mov dl,8
int 21h ;disp BS
mov ah,2
mov dl,' '
int 21h ;disp SP
mov ah,2
mov dl,8 ;disp BS
int 21h
dec di
jmp short INPUT
_RET:
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h ;改行
mov ax,di
pop di
pop dx
dec cx
ret
endp
ENDS
END START
; 一部のコンパイラでは、
;CODE ENDS
; END START
;と記述しなければいけないようです
|