Advertisement
SquirrelInBox

Untitled

May 2nd, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. LOCALS
  2.     .model  tiny
  3.     .code
  4.     org 100h
  5.  
  6. main:  
  7.     call argparse
  8.    
  9.     cmp ax, 00h
  10.     je @@next_step
  11.     ret
  12. @@next_step:
  13.    
  14.     ;старый запомнили, поменяли режим на новый
  15.     call get_old_mode
  16.     call get_old_page
  17.     xor ax, ax
  18.     mov al, [our_vm]
  19.     ;call set_mode
  20.     push ax
  21.     mov al, [our_ap]
  22.     ;call set_page
  23.     push ax
  24.     call change_vm
  25.    
  26.     ;узнали, сколько колонок в строке
  27.     mov ah, 0fh
  28.     int 10h
  29.     mov [col_count], ah
  30.     call get_column
  31.    
  32.     call set_base_addr
  33.     call set_offset_addr
  34.    
  35.     ; вывели, какая сейчас страница, какой режим
  36.     call write_header
  37.        
  38.     ; начальный символ
  39.     mov dl, 0
  40.     mov temp_column, 0
  41.    
  42. @start:
  43.     mov al, dl
  44.  
  45.     call choose_color
  46.     jmp @next
  47.  
  48. @temp_start:
  49.     jmp @start
  50.    
  51. @next:
  52.     call write_char
  53.    
  54.     inc offset_addr
  55.     inc offset_addr
  56.  
  57.     inc dl 
  58.     inc temp_column
  59.    
  60.     call write_space
  61.    
  62.     inc offset_addr
  63.     inc offset_addr
  64.    
  65.    
  66.     add color, 11h
  67.     cmp temp_column, 7
  68.     jne @check
  69.     mov color, 10h
  70. @check:
  71.     cmp temp_column, 14
  72.     jne @next_s
  73.     mov color, 10
  74.    
  75. @next_s:
  76.     test dl, 15
  77.     jne @start
  78.    
  79.     inc cur_str
  80.     inc row
  81.  
  82.     mov al, [column]
  83.     xor ah, ah
  84.     mov bl, 4
  85.     mul bl
  86.     add offset_addr, ax
  87.     mov temp_column, 0
  88.    
  89.     test dl, dl
  90.     jne @temp_start
  91.    
  92.     mov ah, 00h
  93.     int 16h
  94.    
  95.     xor ax, ax
  96.     mov al, [old_vm]
  97.     push ax
  98.     mov al, [old_ap]
  99.     push ax
  100.     call change_vm
  101.    
  102. @@error:
  103.     ret
  104.    
  105. write_string proc
  106.     ; в si ссылка на строку, в cx длина строки
  107.     @@write_page:
  108.     lodsb
  109.     mov ah, 07h
  110.     stosw
  111.     loop @@write_page
  112.     ret
  113. write_string endp
  114.  
  115.  
  116. write_number proc
  117.     ; в si ссылка на строку, в cx длина строки
  118.     @@write_page:
  119.     lodsb
  120.     mov ah, 07h
  121.     stosw
  122.     loop @@write_page
  123.     ret
  124. write_number endp
  125.  
  126.    
  127. write_header proc
  128.     push ax
  129.     push es
  130.     push di
  131.     push si
  132.     xor ax, ax
  133.  
  134.     mov ax, [base_addr]
  135.     mov es, ax
  136.     mov ax, 0002h
  137.     mov bl, [col_count]
  138.     mul bl
  139.     add ax, word ptr [column]
  140.     sal ax, 1
  141.     mov di, ax
  142.     mov cx, 6
  143.     mov si, offset page_str
  144.     call write_string
  145.    
  146. ;   mov cx, 2
  147. ;   mov si, offset our_ap
  148. ;   call write_string
  149.    
  150. ;   mov al, 03h
  151. ;   mov bl, [col_count]
  152. ;   mul bl
  153. ;   add ax, word ptr [column]
  154. ;   sal ax, 1
  155. ;   mov di, ax
  156. ;   mov cx, 6
  157. ;   mov si, offset mode_str
  158. ;   call write_string
  159.    
  160. ;   mov si, offset our_vm
  161. ;   mov cx, 2
  162. ;   call write_string
  163.    
  164.     pop si
  165.     pop di
  166.     pop es
  167.     pop ax
  168.    
  169.     ;mov dh, 1
  170.     ;mov dl, column
  171.    
  172.     ;mov ah, 9h
  173.     ;mov dx, offset page_str
  174.     ;int 21h
  175.  
  176.     ;xor ax, ax
  177.     ;mov al, [our_ap]
  178.     ;call get_nums
  179.    
  180.    
  181.     ;mov ah, 9h
  182.     ;mov dx, offset  mode_str
  183.     ;int 21h
  184.    
  185.     ;xor ax, ax
  186.     ;mov al, [our_vm]
  187.     ;call get_nums
  188.     ;ret
  189. write_header endp
  190.    
  191. get_old_mode proc
  192.     push    ax
  193.     push    bx
  194.     push    ds
  195.    
  196.     xor     ax,ax
  197.     mov     ds, ax
  198.     mov     bh, ds:449h
  199.    
  200.     pop     ds
  201.     mov     [old_vm], bh
  202.     pop     bx 
  203.     pop     ax
  204.     ret
  205. get_old_mode endp
  206.  
  207.  
  208. get_old_page proc
  209.     push    ax
  210.     push    bx
  211.     push    ds
  212.    
  213.     xor     ax,ax
  214.     mov     ds, ax
  215.     mov     bh, ds:462h
  216.    
  217.     pop     ds
  218.     mov     [old_ap], bh
  219.     pop     bx
  220.     pop     ax 
  221.     ret
  222. get_old_page endp
  223.  
  224.  
  225. set_base_addr proc
  226.     push ax
  227.     cmp [our_vm], 7
  228.     jne @@addr0b800
  229.     mov ax, 0b000h
  230.     jmp @@next
  231.    
  232. @@addr0b800:
  233.     mov ax, 0b800h
  234.     jmp @@next
  235.    
  236. @@next:
  237.     mov [base_addr], ax
  238.     pop ax
  239.     ret
  240. set_base_addr endp 
  241.    
  242.  
  243. set_offset_addr proc
  244.     push    ax
  245.     push    bx
  246.  
  247.     xor     ax, ax
  248.     xor     bx, bx
  249.    
  250.     mov     al, [our_ap]
  251.     mov     bl, [our_vm]
  252.     cmp     bl, 01h
  253.     jg      @@set_big_offset
  254.    
  255.     mov     bx, 0800h
  256.     mul     bx
  257.     jmp     @@end
  258.  
  259. @@set_big_offset:
  260.     mov     bx, 1000h
  261.     mul     bx
  262.     jmp     @@end
  263.  
  264. @@end:
  265.     push    bx
  266.     push    ax
  267.     mov     al, [row]
  268.     mov     bl, [col_count]
  269.     mul     bl
  270.     add     ax, word ptr [column]
  271.     sal     ax, 1
  272.     mov     bx, ax
  273.     pop     ax
  274.     add     ax, bx
  275.    
  276.     mov     [offset_addr], ax
  277.     pop     bx
  278.    
  279.     pop     bx
  280.     pop     ax
  281.     ret
  282. set_offset_addr endp   
  283.    
  284.    
  285. choose_color proc
  286.     cmp cur_str, 0
  287.     je @firstStr
  288.    
  289.     cmp cur_str, 1
  290.     jne @next_str
  291.     cmp blink, 0
  292.     je @secondStr
  293.     mov bl, sec_color_b
  294.     ret
  295.  
  296. @next_str:
  297.     cmp cur_str, 0eh
  298.     je @lastStr
  299.    
  300.     cmp cur_str, 0fh
  301.     je @lastStr
  302.    
  303.     mov bl, st_color
  304.     ret
  305.  
  306. @firstStr:
  307.     mov bl, color
  308.     ret
  309.  
  310. @secondStr:
  311.     mov bl, sec_color
  312.     ret
  313.  
  314. @lastStr:
  315.     mov bl, last_color
  316.     ret
  317. choose_color endp
  318.    
  319. write_space proc
  320.     mov bl, prelast_sp
  321.     cmp cur_str, 0eh
  322.     je @@lastStr
  323.    
  324.     mov bl, last_sp_col
  325.     cmp cur_str, 0fh
  326.     je @@lastStr
  327.     mov bl, 00h
  328.     jmp @@end
  329.    
  330. @@lastStr:
  331.     cmp temp_column, 14
  332.     jg @@end
  333.    
  334. @@end:
  335.     mov al, 20h
  336.     call write_char
  337.     ret
  338. write_space endp   
  339.  
  340.    
  341. write_char proc
  342.     ; в bl уже лежит цвет, в al уже лежит код символа
  343.     push cx
  344.     push es
  345.     push di
  346.    
  347.     mov cx, [base_addr]
  348.     mov es, cx
  349.     mov cx, [offset_addr]
  350.     mov di, [offset_addr]
  351.    
  352.     mov ah, bl
  353.    
  354.     stosw  
  355.  
  356.     pop di
  357.     pop es
  358.     pop ax
  359.     ret
  360. write_char endp
  361.  
  362. change_vm proc
  363.     push bp
  364.     mov bp, sp
  365.     push ax
  366.     mov ah, 00h
  367.     mov al, [bp+6] ;vm
  368.     int 10h
  369.     mov ah, 05h
  370.     mov al, [bp+4] ;ap
  371.     int 10h
  372.     pop ax
  373.     pop bp
  374.     ret 4
  375. change_vm endp
  376.    
  377. get_column proc
  378.     sar ah, 1
  379.     sub ah, 16
  380.     mov column, ah
  381.     ret
  382. get_column endp
  383.  
  384.  
  385. get_nums proc
  386.     push -1
  387.     mov bx, 10h
  388.     xor cx, cx
  389.     mov cx, 2
  390.     xor dx, dx
  391.     @@loop1:
  392.         div bx
  393.         push dx
  394.         dec cx
  395.         cmp cx, 0
  396.         jne @@loop1
  397.  
  398.     xor cx, cx
  399.     mov cx, 2
  400.     xor dx, dx
  401.     @@loop:
  402.         pop dx
  403.         cmp dx, -1
  404.         je @@end
  405.        
  406.         cmp dl, 0ah
  407.         jge @@more
  408.        
  409.         add dl, 30h
  410.         jmp @@write
  411.     @@more:
  412.         add dl, 37h
  413.        
  414.     @@write:
  415.         mov ah, 02h
  416.         int 21h
  417.     jmp @@loop
  418. @@end:
  419. ret
  420. get_nums endp
  421.  
  422. argparse proc
  423.     mov al, cs:[80h]
  424.     cmp al, 6
  425.     jl @@incorrect_args
  426.  
  427.     mov al, cs:[82h]
  428.     cmp al, 30h
  429.     jne @@error_mode
  430.     mov al, cs:[83h]
  431.     cmp al, 30h
  432.     je @@correct_vm
  433.     cmp al, 31h
  434.     je @@correct_vm
  435.     cmp al, 32h
  436.     je @@correct_vm
  437.     cmp al, 33h
  438.     je @@correct_vm
  439.     cmp al, 37h
  440.     je @@correct_vm
  441.     jmp @@error_mode
  442.    
  443. @@correct_vm:
  444.     sub al, '0'
  445.     mov [our_vm], al
  446.    
  447.     mov al, cs:[85h]
  448.     cmp al, 30h
  449.     jne @@incorrect_args
  450.    
  451.     mov al, cs:[86h]
  452.     mov ah, cs:[83h]
  453.     cmp ah, 37h
  454.     jne @@check_other
  455.     cmp al, 30h
  456.     jne @@incorrect_page
  457.     sub al, '0'
  458.     mov [our_ap], al
  459.     jmp @end
  460.    
  461. @@check_other:
  462.     cmp al, 30h
  463.     jl @@incorrect_page
  464.     cmp al, 37h
  465.     jg @@incorrect_page
  466.     sub al, '0'
  467.     mov [our_ap], al
  468.     jmp @end
  469.    
  470.     @@error_mode:
  471.         mov ah, 9h
  472.         lea dx, incor_mode
  473.         int 21h
  474.         mov ax, 01h
  475.         ret
  476.    
  477.     @@incorrect_args:
  478.         mov ah, 9h
  479.         lea dx, help
  480.         int 21h
  481.         mov ax, 02h
  482.         ret
  483.    
  484.     @@incorrect_page:
  485.         mov ah, 9h
  486.         lea dx, incor_page
  487.         int 21h
  488.         mov ax, 03h
  489.         ret
  490.        
  491.     @end:
  492.         mov al, cs:[80h]
  493.         cmp al, 9
  494.         jne @@withBlink
  495.         mov al, cs:[88h]
  496.         cmp al, 2fh
  497.         jne @@incorrect_args
  498.         mov al, cs:[89h]
  499.         cmp al, 62h
  500.         jne @@incorrect_args
  501.         mov blink, 01h     
  502.         jmp @@finish
  503.     @@withBlink:
  504.         mov blink, 0
  505.     @@finish:
  506.         mov ax, 00h
  507.        
  508.     ret
  509. argparse endp
  510.  
  511.  
  512. our_vm      db  ?
  513. our_ap      db  ?
  514. old_vm      db  ?
  515. old_ap      db  ?
  516. column      db  ?
  517. temp_column db  ?
  518. row         db  4
  519. color       db  10h
  520. st_color    db  07h
  521. sec_color   db  81h
  522. sec_color_b db  01h
  523. last_color  db  4eh
  524. cur_str     db  00h
  525. last_sp_col db  11h
  526. prelast_sp  db  22h
  527. page_str    db  "Page: $"
  528. mode_str    db  "Mode: $"
  529. incor_mode  db  "Incorrect mode", 0dh, 0ah, "You can input 00, 01, 02, 03 or 07 mode", 0dh, 0ah, '$'
  530. incor_args  db  "Incorrect args", 0dh, 0ah, '$'
  531. help        db  "Args: [mode] [page]", 0dh, 0ah, "Mode: 00 | 01 | 02 | 03 | 07", 0dh, 0ah, '$'
  532. 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, "$"
  533. blink       db  ?
  534. base_addr   dw  ?
  535. offset_addr dw  ?
  536. col_count   db  ?
  537.  
  538. end main
  539.  
  540.  
  541. ; для режимов 00h, 01h размер страницы 800h
  542. ; для остальных режимов размер страницы 1000h
  543. ; для режима 07h базовый адрес 0b000h
  544. ; для остальных режимов базовый адрес 0b800h
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement