Prog_Data SEGMENT Prompt DB 16,"Input string -->" Str DB 80 DUP(32) VideoSeg EQU 0B800H Prog_Data ENDS Prog_Code SEGMENT ASSUME CS:Prog_Code, DS:Prog_Data, SS:Prog_Stack Main_Prog PROC mov AX, Prog_Data mov DS, AX ; load the offset of the Data segment mov DH, 10 ; cursor positioning (Y=10) mov DL, 15 ; cursor positioning (X=15) mov AH, 30 ; character attributes call ClrScr ; clear screen mov SI, offset Prompt ; load offset of Prompt in SI call WriteLn ; output prompt on the screen mov SI, offset Str call ReadLn ; read string from the keyboard mov DH, 20 mov DL, 15 ; new cursor ccordinates mov SI, offset Str ; load offset of input string to SI call WriteLn ; output string mov AX, 4C00H ; return to DOS int 21H Main_Prog ENDP BinOut PROC ; outputs BX on the screen in binary form push BX ; save the registers push CX mov CX, 16 ; word length Nextbit: shl BX, 1 jc one mov AL, '0' ; bit=0 call PutChar ; output it on the screen jmp weiter One: mov AL, '1' ; bit=1 call PutChar ; output it on the screen Weiter: inc DL ; new cursor position loop nextbit ; main loop over all bits pop CX ; restore the registers pop BX ret BinOut ENDP ReadLn PROC ; reads a string from the keyboard --> [SI] push DI ; save registers push BX push CX mov DI, SI mov BX, 0 ; set string length =0 Nextchar: mov CH, AH ; AH is used in GetChar call GetChar ; get a char from the keyboard mov AH, CH ; restore AH (color settings) cmp AL, 13 ; end of string ? je Done ; YES Proceed: call PutChar ; echo char on the screen inc DL ; new cursor position inc SI ; address of the new character mov [SI], AL ; save the string character inc BX ; increase the string length jmp Nextchar Done: mov [DI],BL ; set the string length pop CX ; restore the registers pop BX pop DI ret ReadLn ENDP GetChar PROC ; returns the ASCII code in AL label1: mov AH, 0 ; BIOS read key procedure int 16H cmp AL, 0 ; special key pressed ? je label1 ; yes, wait for another key ret GetChar ENDP WriteLn PROC ; writes a line on the screen starting with the ; currect cursor position (X,Y)=(DL,DH) ; SI points to the string push AX push CX push SI mov CL, [SI] ; CL := Length(Str) inc SI outchar: cmp CL, 0 je outdone MOV AL, [SI] ; AL := next character call PutChar ; output char to the screen inc SI ; offset of the next character inc DL ; new column dec CL jmp outchar outdone: pop SI pop CX pop AX ret WriteLn ENDP PutChar PROC ; writes a character to VRAM. AL=char, AH=attribute ; DH/DL = row/column (0-24, 0-79) push DI ; save the registers push ES push AX mov AX, VideoSeg ; B800H : video buffer segment mov ES, AX xor AX, AX ; clear AX mov AL, DH ; load the row number in AX shl AX, 1 ; multiply AX by 2^7=128 shl AX, 1 shl AX, 1 shl AX, 1 shl AX, 1 shl AX, 1 shl AX, 1 mov DI, AX ; store the result in DI xor AX, AX ; clear AX mov AL, DH ; load the row number in AX shl AX, 1 ; multiply AX by 2^5=32 shl AX, 1 shl AX, 1 shl AX, 1 shl AX, 1 add DI, AX ; DI:=DH*(128+32)=DH*160 xor AX, AX ; clear AX mov AL, DL ; load the column number in AX shl AL, 1 ; multiply the column by 2 add DI, AX ; DI:=offset of the screen byte pop AX ; restore AX mov ES:[DI], AX ; store char/attribute pop ES ; restore the registers pop DI ret ; return to the calling program PutChar endp ; end of the procedure ClrScr PROC ; fill the screen with the BG color push CX push DI push ES mov DI, VideoSeg mov ES, DI mov AL, ' ' mov DI, 0 mov CX, 2000 cld rep stosw pop ES pop DI pop CX ret ClrScr ENDP Prog_Code ENDS Prog_Stack SEGMENT STACK DB 64 DUP(0) Prog_Stack ENDS END |