Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LOCALS
- .model tiny
- .code
- org 100h
- main:
- call argparse
- cmp ax, 00h
- je @@next_step
- ret
- @@next_step:
- ;call set_base_addr
- ;call set_offset_addr
- ;поменяли режим на новый, старый запомнили
- call get_old_mode
- call get_old_page
- ;mov ah, 0fh
- ;int 10h
- ;mov [old_vm], al
- ;mov [old_ap], bh
- xor ax, ax
- mov al, [our_vm]
- push ax
- mov al, [our_ap]
- push ax
- call change_vm
- ;узнали, сколько колонок в строке
- mov ah, 0fh
- int 10h
- call get_column
- ; вывели, какая сейчас страница, какой режим
- mov dh, 1
- mov dl, column
- call set_cursor
- mov ah, 9h
- lea dx, page_str
- int 21h
- xor ax, ax
- mov al, [our_ap]
- call get_nums
- mov dh, 2
- mov dl, column
- call set_cursor
- mov ah, 9h
- lea dx, mode_str
- int 21h
- xor ax, ax
- mov al, [our_vm]
- call get_nums
- mov cl, column
- mov cur_column, cl
- ; начальный символ
- mov dl, 0
- mov temp_column, 0
- @start:
- push dx
- mov dh, row
- mov dl, cur_column
- call set_cursor
- pop dx
- mov al, dl
- call chose_color
- jmp @next
- @temp_start:
- jmp @start
- @next:
- call write_char
- inc dl
- inc cur_column
- call write_space
- inc cur_column
- inc temp_column
- add color, 11h
- cmp temp_column, 7
- jne @check
- mov color, 10h
- @check:
- cmp temp_column, 14
- jne @next_s
- mov color, 10
- @next_s:
- test dl, 15
- jne @start
- inc cur_str
- inc row
- call set_cur_column
- mov temp_column, 0
- test dl, dl
- jne @temp_start
- mov ah, 00h
- int 16h
- xor ax, ax
- mov al, [old_vm]
- push ax
- mov al, [old_ap]
- push ax
- call change_vm
- @@error:
- ret
- get_old_mode proc
- push ax
- xor ax,ax
- mov ds, ax
- mov bh, ds:449h
- mov [old_vm], bh
- pop ax
- ret
- get_old_mode endp
- get_old_page proc
- push ax
- xor ax,ax
- mov ds, ax
- mov bh, ds:462h
- mov [old_ap], bh
- pop ax
- ret
- get_old_page endp
- set_base_addr proc
- push ax
- cmp [old_vm], 07h
- jne @@addr0b800
- mov ax, 0b000h
- jmp @@next
- @@addr0b800:
- mov ax, 0b800h
- jmp @@next
- @@next:
- mov [base_addr], ax
- pop ax
- ret
- set_base_addr endp
- set_offset_addr proc
- push ax
- push bx
- xor ax, ax
- xor bx, bx
- mov al, [our_ap]
- mov bl, [our_vm]
- cmp bl, 01h
- jg @@set_big_offset
- mov bx, 0800h
- mul bx
- jmp @@end
- @@set_big_offset:
- mov bx, 1000h
- mul bx
- jmp @@end
- @@end:
- mov [offset_addr], ax
- pop bx
- pop ax
- ret
- set_offset_addr endp
- chose_color proc
- cmp cur_str, 0
- je @firstStr
- cmp cur_str, 1
- jne @next_str
- cmp blink, 0
- je @secondStr
- mov bl, sec_color_b
- ret
- @next_str:
- cmp cur_str, 0eh
- je @lastStr
- cmp cur_str, 0fh
- je @lastStr
- mov bl, st_color
- ret
- @firstStr:
- mov bl, color
- ret
- @secondStr:
- mov bl, sec_color
- ret
- @lastStr:
- mov bl, last_color
- ret
- chose_color endp
- write_space proc
- mov bl, prelast_sp
- cmp cur_str, 0eh
- je @@lastStr
- mov bl, last_sp_col
- cmp cur_str, 0fh
- je @@lastStr
- ret
- @@lastStr:
- cmp temp_column, 14
- jg @@end
- push dx
- mov dl, cur_column
- mov dh, row
- call set_cursor
- pop dx
- mov al, 20h
- call write_char
- @@end:
- ret
- write_space endp
- set_cur_column proc
- push cx
- mov cl, column
- mov cur_column, cl
- pop cx
- ret
- set_cur_column endp
- write_char proc
- ; в bl уже лежит цвет, в al уже лежит код символа
- mov ah, 09h
- mov bh, [our_ap]
- mov cx, 1
- int 10h
- ret
- write_char endp
- change_vm proc
- push bp
- mov bp, sp
- push ax
- mov ah, 00h
- mov al, [bp+6] ;vm
- int 10h
- mov ah, 05h
- mov al, [bp+4] ;ap
- int 10h
- pop ax
- pop bp
- ret 4
- change_vm endp
- get_column proc
- cmp ah, 40
- je get1vm
- jmp get_other_vm
- get1vm:
- mov column, 4
- jmp pass
- get_other_vm:
- mov column, 24
- pass:
- ret
- get_column endp
- get_nums proc
- push -1
- mov bx, 10h
- xor cx, cx
- mov cx, 2
- xor dx, dx
- @@loop1:
- div bx
- push dx
- dec cx
- cmp cx, 0
- jne @@loop1
- xor cx, cx
- mov cx, 2
- xor dx, dx
- @@loop:
- pop dx
- cmp dx, -1
- je @@end
- cmp dl, 0ah
- jge @@more
- add dl, 30h
- jmp @@write
- @@more:
- add dl, 37h
- @@write:
- mov ah, 02h
- int 21h
- jmp @@loop
- @@end:
- ret
- get_nums endp
- set_cursor proc
- ;в dh - строка, в dl - колонка
- push ax
- push bx
- mov ah, 02h
- mov bh, [old_ap]
- int 10h
- pop bx
- pop ax
- ret
- set_cursor endp
- argparse proc
- mov al, cs:[80h]
- cmp al, 6
- jl @@incorrect_args
- mov al, cs:[82h]
- cmp al, 30h
- jne @@error_mode
- mov al, cs:[83h]
- cmp al, 30h
- je @@correct_vm
- cmp al, 31h
- je @@correct_vm
- cmp al, 32h
- je @@correct_vm
- cmp al, 33h
- je @@correct_vm
- cmp al, 37h
- je @@correct_vm
- jmp @@error_mode
- @@correct_vm:
- sub al, '0'
- mov [our_vm], al
- mov al, cs:[85h]
- cmp al, 30h
- jne @@incorrect_args
- mov al, cs:[86h]
- mov ah, cs:[83h]
- cmp ah, 37h
- jne @@check_other
- cmp al, 30h
- jne @@incorrect_page
- sub al, '0'
- mov [our_ap], al
- jmp @end
- @@check_other:
- cmp al, 30h
- jl @@incorrect_page
- cmp al, 37h
- jg @@incorrect_page
- sub al, '0'
- mov [our_ap], al
- jmp @end
- @@error_mode:
- mov ah, 9h
- lea dx, incor_mode
- int 21h
- mov ax, 01h
- ret
- @@incorrect_args:
- mov ah, 9h
- lea dx, help
- int 21h
- mov ax, 02h
- ret
- @@incorrect_page:
- mov ah, 9h
- lea dx, incor_page
- int 21h
- mov ax, 03h
- ret
- @end:
- mov al, cs:[80h]
- cmp al, 9
- jne @@withBlink
- mov al, cs:[88h]
- cmp al, 2fh
- jne @@incorrect_args
- mov al, cs:[89h]
- cmp al, 62h
- jne @@incorrect_args
- mov blink, 01h
- jmp @@finish
- @@withBlink:
- mov blink, 0
- @@finish:
- mov ax, 00h
- ret
- argparse endp
- our_vm db ?
- our_ap db ?
- old_vm db ?
- old_ap db ?
- column db ?
- cur_column db ?
- temp_column db ?
- row db 4
- symb db 00h
- buffer db ?
- color db 10h
- st_color db 07h
- sec_color db 81h
- sec_color_b db 01h
- last_color db 4eh
- cur_str db 00h
- last_sp_col db 11h
- prelast_sp db 22h
- page_str db "Page: $"
- mode_str db "Mode: $"
- incor_mode db "Incorrect mode", 0dh, 0ah, "You can input 00, 01, 02, 03 or 07 mode", 0dh, 0ah, '$'
- incor_args db "Incorrect args", 0dh, 0ah, '$'
- help db "Args: [mode] [page]", 0dh, 0ah, "Mode: 00 | 01 | 02 | 03 | 07", 0dh, 0ah, '$'
- incor_page db "Incorrect page", 0dh, 0ah, "You can input 00 page for 07 mode or 00-07 page for 00-03 mode", 0dh, 0ah, "$"
- blink db ?
- base_addr dw ?
- offset_addr dw ?
- end main
- ; для режимов 00h, 01h размер страницы 800h
- ; для остальных режимов размер страницы 1000h
- ; для режима 07h базовый адрес 0b000h
- ; для остальных режимов базовый адрес 0b800h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement