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 |