Advertisement
SquirrelInBox

last_table

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