home *** CD-ROM | disk | FTP | other *** search
/ BBS 1 / BBS#1.iso / maximus / bbslimit.arj / BBSLIMIT.ASM next >
Assembly Source File  |  1991-05-12  |  6KB  |  259 lines

  1. .model tiny
  2. .code
  3. .startup
  4. .286
  5.  
  6. check_file struc
  7. req_name dw ?            ; pointer on end of requested name
  8. chg_name dw ?            ; pointer on end of name to change
  9. chg_size db ?            ; size of chg_name
  10. day      db ?            ; binary package for checked days
  11.                          ; all,mon,sun,sat,fri,the,wed,tue
  12. time_from dw ?           ; begin changing in BCD
  13. time_to   dw ?           ; end changing   in BCD
  14. ends
  15.  
  16.         jmp install
  17. end_of_code   dw 0       ;end of loaded code with data
  18. ds_dx         dd 0       ;pointer on filename
  19. ;struct_number dw 1       ;number of structures
  20. end_of_name   dw 0
  21. month db 0,31,28,31,30,31,30,31,31,30,31,30   ;month table
  22. full_year = 365
  23. first_day = 1   ;1st January 1980 = Tuesday
  24. get_weekday proc near
  25.         mov ah,4
  26.         int 1aH
  27.     xor ax,ax
  28.     push ax
  29.     popf
  30.         mov ax,1980H
  31.     das
  32.         sub cx,ax
  33.         mov ax,cx
  34.         call bcd2hex
  35.         push ax
  36.         push dx
  37.         mov bx,full_year
  38.         mul bx         ;full days after 1980 w/o visokosnyi years in ax
  39.         xchg bx,ax
  40.         pop dx
  41.         pop ax
  42.     mov byte ptr month+2,28
  43.         test ax,11B    ;is current year is vis?
  44.         jnz not_vis
  45.         mov byte ptr month+2,29
  46. not_vis:
  47.         dec ax         ;exclude current year
  48.         shr ax,2       ;number of vis year
  49.         add bx,ax      ;bx == days w/o month and day
  50.         mov cl,dh      ;mounth counter
  51.         xor ch,ch
  52.         mov si,offset month
  53.         xor ah,ah
  54.         cld
  55. add_month:
  56.         lodsb
  57.         add bx,ax
  58.         loop add_month
  59.         xor ax,ax
  60.         mov al,dl      ;current day
  61.         call bcd2hex   ;al = current day in hex
  62.         add bx,ax      ; bx == full day!!!
  63.         xchg ax,bx
  64.     xor dx,dx
  65.         mov bx,7
  66.         div bx      ; ah = day of week, but...
  67.     mov al,dl
  68. ;        inc al
  69.         ret
  70. endp
  71. bcd2hex proc near
  72.         shl ax,4
  73.         shr al,4
  74.         aad
  75.         xor ah,ah
  76.         ret
  77. endp
  78. check_time proc near
  79. ;input: bx pointer on check_file structure
  80.         mov ah,02H
  81.         int 1aH
  82.     test bx[time_from],8000H
  83.     jnz check_please
  84.         cmp cx,bx[time_from]
  85.         jb dont_check
  86.         cmp cx,bx[time_to]
  87.         ja dont_check
  88. check_please:
  89.         clc
  90.         ret
  91. dont_check:
  92.         stc
  93.         ret
  94. endp
  95. toupper proc near
  96.         cmp al,'A'
  97.         jb do_nothing
  98.         cmp al,'z'
  99.         ja do_nothing
  100.         and al,11011111B
  101. do_nothing:
  102.         ret
  103. endp
  104. cmp_names proc near
  105. ;bx == pointer on structure
  106.         mov si,bx[req_name]
  107.         mov di,end_of_name
  108.         std
  109.         mov cl,bx[chg_size]
  110.         xor ch,ch
  111.         repe cmpsb
  112.         ret
  113. endp
  114. change_name proc near
  115. ;bx == pointer on structure
  116.         mov si,bx[chg_name]
  117.         mov di,end_of_name
  118.         std
  119.         mov cl,bx[chg_size]
  120.         xor ch,ch
  121.         rep movsb
  122.     mov word ptr ds_dx,80H
  123.     mov word ptr ds_dx+2,cs
  124.         ret
  125. endp
  126. move_name proc near
  127.         lds si,dword ptr cs:ds_dx
  128.         mov cx,128
  129.         mov di,80h
  130.         cld
  131. mn1:
  132.         lodsb
  133.         call toupper
  134.         stosb
  135.         or al,al
  136.         je end_reached
  137.         loop mn1
  138.         stc
  139. exit_mn:
  140.         push cs
  141.         pop ds
  142.         ret
  143. end_reached:
  144.         dec di
  145.         dec di
  146.         mov cs:end_of_name,di
  147.         jmp exit_mn
  148. endp
  149. int21:
  150.         cmp ah,3dH
  151.         je check_it
  152.         db 0eaH
  153. old_int21:
  154. i21o    dw 0
  155. i21s    dw 0
  156. check_it:
  157.         pusha
  158.         push es
  159.         push ds
  160.         mov word ptr cs:ds_dx,dx
  161.         mov word ptr cs:ds_dx+2,ds
  162. ;main code of interrupt 21h
  163.         push cs
  164.         pop ds
  165.     push cs
  166.     pop es
  167.         mov bx,offset structures
  168.         call move_name
  169.     mov cx,struct_number
  170. check_loop:
  171.         push cx
  172.         call cmp_names
  173.         jne dont_change
  174.         test bx[day],80H        ;all days?
  175.         jne skip_check_day
  176.     push bx
  177.         call get_weekday
  178.     pop bx
  179.         mov cl,al
  180.         mov al,1
  181.         shl al,cl
  182.         test bx[day],al
  183.         je dont_change
  184. skip_check_day:
  185.  
  186.         call check_time
  187.         jc dont_change
  188.         call change_name
  189.         pop cx
  190.         jmp do_it
  191. dont_change:
  192.         add bx,10       ;add size of structure
  193.         pop cx
  194.         loop check_loop
  195. do_it:
  196.         pop ds
  197.         pop es
  198.         popa
  199.         push ds
  200.         push dx
  201.         mov ds,word ptr cs:ds_dx+2
  202.         mov dx,word ptr cs:ds_dx
  203.     cld
  204.         pushf
  205.         call dword ptr cs:old_int21
  206.         pop dx
  207.         pop ds
  208.         retf 2
  209.  
  210. install:
  211.         mov ah,9
  212.         mov dx,offset copyright
  213.         int 21H
  214.         mov ax,3d00H
  215.         mov dx,offset fname
  216.         int 21H
  217.         mov bx,ax
  218.         jnc i1
  219. error:
  220.         mov ah,9
  221.         mov dx,offset error_read
  222.         int 21H
  223.         int 20H
  224. i1:
  225.         mov dx,offset struct_number
  226.         mov ah,3fH
  227.         mov cx,0ffffH
  228.         int 21H
  229.         jc error
  230.         add ax,offset structures+4
  231.         mov end_of_code,ax
  232.         mov ah,3eH
  233.         int 21H
  234.         mov bx,offset structures
  235.         mov cx,struct_number
  236.         mov dx,offset structures
  237. adjust:
  238.         add bx[req_name],dx
  239.         add bx[chg_name],dx
  240.         add bx,10
  241.         loop adjust
  242.         mov ax,3521H
  243.         int 21H
  244.         mov i21o,bx
  245.         mov i21s,es
  246.         mov dx,offset int21
  247.         mov ax,2521H
  248.         int 21H
  249.         mov dx,end_of_code
  250.         int 27H
  251. fname   db 'limits.use',0
  252. struct_number dw 0
  253. structures:
  254. error_read db 'Read error!',10,13,24H
  255. copyright db "Dynamical BBS's access. Copyright (C) AlexQ 1991",10,13
  256.           db '         Red Rat Club, Moscow,Russia.',10,13
  257.           db '                     Free!',10,13,24H
  258. ass2:
  259. end