Advertisement
SquirrelInBox

Untitled

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