ASM Snippets

mail@pastecode.io avatar
unknown
assembly_x86
2 months ago
5.9 kB
2
Indexable
Never
.model tiny
.486
.data
filen db "file123.txt", 0
handle dw ? 
write db "sidk", 0ah, "ah4261"
rect macro strow, stcol, endrow, endcol, att, a, b
;starting row number in dx
;logic uses displays graphic row by row
        mov     dx,strow
;starting column in cx
b:      mov     cx,stcol
;display one pixel
a:      mov     al,att
        mov     ah,0ch
        int     10h
;increment pixel column number and check whether end column reached
;if no go to the next column
        inc     cx
        cmp     cx,endrow
        jnz     a
;if all columns in a row display has been completed then 
;increment row number - check if last row is reached
;if reached display completed
;if not go on to stcolumn in the next row and display
        inc     dx
        cmp     dx,endrow
        jnz     b
	endm
.code
.startup
	mov ah, 3ch
	lea dx, filen
	mov cl, 20h
	int 21h
	mov handle, ax
	;create a file with file name in filen
	;handle given in handle
	mov ah, 3dh
	mov al, 2h
	lea dx, filen
	int 21h
	mov handle, ax
	;open existing file 
	mov ah, 40h
	mov bx, handle
	mov cx, 11
	lea dx, write
	int 21h
	;write to a file with handle handle
	;number of bytes to write in cx
	;dx will have the address of what you want to write
	;ax contains bytes written
	mov ah, 42h
	mov al, 0
	mov bx, handle
	mov cx, 0
	mov dx, 0
	int 21h
	;move file pointer
	;al = 0 relative to beginning
	;al = 1 relative to current
	;al = 2 relative to end
	mov ah, 3fh
	mov bx, handle
	mov cx, 7
	lea dx, buf
	int 21h
	;this will read the file to address pointed by dx
	;cx = number of bytes to read
	;ds:dx = memory buffer address
	;this is writing to buf, make sure file pointer is not at the end of the file
	mov ah, 3eh
	mov bx, handle
	int 21h
	;close a file with handle in bx
	
	;this will take input of one character into the al register
	mov ah, 01h ;al = 08h for input without echo
	int 21h
	
	;this will input string
	;data has to be in the following format
	;max1 db xx this will store the max number of chars user can type (max 255)
	;act1 db ? this will be actual number of chars user has typed including enter
	;inp1 db 32 dup (?) reserve 32 locations for input
	lea dx, max1
	mov ah, 0ah
	int 21h
	
	;output a character
	mov dl, 'a'
	mov ah, 02h
	int 21h
	
	;output a string (str1 has to be '$' terminated)
	lea dx, str1
	mov ah, 09h
	int 21h
	
	;get display mode
	mov ah, 0fh
	int 10h
	;output:
	;al = current video mode
	;ah = number of character columns
	;bh = page number
	
	;set display mode
	mov ah, 00h
	mov al, 00h ;put display mode in al
	int 10h
	;make sure to go back to original display mode in the end
	;00h - text mode. 40x25. 16 colours. 8 pages. this is column x row
	;03h - text mode. 80x25. 16 colours. 8 pages. this is column x row
	;12h - graphical mode. 80x25. 256 colours. 720x400 pixels. 1 page.
	;even though it's 8 pages, we can only use the first page
	;use graphics mode to display patterns
	
	;get cursor position and size
	mov ah, 03h
	mov bh, 0 ;this is page number, usually 0
	int 10h
	;output:
	;DH = row.
	;DL = column.
	;CH = cursor start line.
	;CL = cursor bottom line.                       
	
	;set cursor position
	mov ah, 02h
	mov dh, 40 ;row
	mov dl, 12 ;column
	mov bh, 0 ;this is page unmber, usually 0
	int 10h
	
	;set cursor size
	mov ah, 01h
	mov ch, ;cursor start line (bits 0-4) and options (bits 5-7).
	mov cl, ;bottom cursor line (bits 0-4).
	int 10h
	
	;read character at cursor position
	mov ah, 08h
	mov bh, 0 ;page number
	int 10h
	;output:
	;ah = attribute
	;al = character
	;The attribute byte is used to specify the foreground and background of the character displayed on the screen.
	;Bits 2-1-0 represent the foreground colour
	;Bit 3 represents the intensity of foreground colour (0-low , 1- high intensity)
	;Bits 6-5-4 represent the background colour
	;Bit 7 is used for blinking text if set to 1
	;000       -black (gray)
	;001       -blue (bright blue)
	;010       -green (bright green)
	;011       -cyan (bright cyan) 
	;100       -red   (bright red)
	;101       -magenta (bright magenta)
	;110       -brown (yellow)
	;111       -white (bright white)

	;write a character at cursor position
	mov ah, 09h
	mov al, ;character to display, this can be space if you just want to color the display ascii - 20h
	mov bh, ;page number
	mov bl, ;attribute
	mov cx, ;number of times to write the character, moving 13*80 (in disp mode 3) will fill upper 13 rows (0-12)
	int 10h
	;make sure to take user input without echo so to continue with our colors else os goes back to default font
	;mov ah, 07h
	;int 21h
	;data is stored in al
	
	;fill a pixel
	mov ah, 0ch
	mov al, ;color
	mov cx, ;column
	mov dx, ;row
	
	;this will print all the text inside buf
	mov cnt, 765
	lea si, buf
x2:	mov al, [si]
	inc si
	mov ah, 09h
	mov bh, 0;page number
	mov bl, attr;attribute
	mov cx, 1;number of times to write the character, moving 13*80 (in disp mode 3) will fill upper 13 rows (0-12)
	int 10h
	mov ah, 02h
	mov dh, row ;row
	mov dl, col ;column
	mov bh, 0 ;this is page unmber, usually 0
	int 10h
	inc col
	cmp col, 79
	je x3
	dec cnt
	jnz x2
	jmp x4
x3: mov col, 0
	inc row
	cmp row, 24
	je x4
	dec cnt
	jnz x2
x4:
	
	;to hold display, system retains programmed display mode
	;this has to be before .exit
	mov ah, 07h
x1:	int 21h
	cmp al, '%'
	jnz x1
.exit
;this will display the count from a word in memory called cocnt
display proc near
	mov ax,cocnt
	mov cl,64h
	div cl
	mov bh,ah
	add al,30h
	mov dl,al
	mov ah,02
	int 21h
	mov cl,0ah
	mov ax,0
	mov al,bh
	div cl
	add al,30h
	mov dl,al
	mov bh,ah
	mov ah,02
	int 21h
	add bh,30h
	mov dl,bh
	mov ah,02
	int 21h
	ret
display endp
end
Leave a Comment