Advertisement
SquirrelInBox

bad_table

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