fork download
  1. ; uncaps.asm
  2. ; beta 01: BIOS エリアの書き込みではうまくいかない.
  3. ; beta 02: keybord にコマンド送信
  4. ; beta 03: debug 用 VRAM 出力つきで安定したようだ。
  5.  
  6. ; 2011.03.13 beta03
  7.  
  8. ;参考文献
  9. ;http://w...content-available-to-author-only...o.jp/dp/4756101305/
  10. ;http://w...content-available-to-author-only...o.jp/dp/4756101062/
  11. ;
  12.  
  13.  
  14.  
  15. ;for MASM6
  16. ;assembling
  17. ;----------------------------------------------------
  18. ;ASFLAGS = -nologo -Cx -c
  19. ;LD = link
  20. ;LDFLAGS = /NOL /NOI
  21. ;PROGRAM = uncaps.com
  22. ;OBJS = uncaps.obj
  23. ;.asm.obj:
  24. ; @$(AS) $(ASFLAGS) $< > error.txt
  25. ;$(PROGRAM) : $(OBJS)
  26. ; @$(LD) /t $(LDFLAGS) $(OBJS), $(PROGRAM);
  27. ;----------------------------------------------------
  28.  
  29. VRAMOFFSET2 equ 2 * (80 * 24 + 78)
  30. DebugVRAMOut MACRO v
  31. push ax
  32. push ds
  33. push bx
  34.  
  35. mov bh, 0
  36. mov ax, 0A000h
  37. mov ds, ax
  38. mov word ptr ds:[VRAMOFFSET2], v
  39.  
  40. pop bx
  41. pop ds
  42. pop ax
  43. endm
  44.  
  45. ;----------------------------------------------------
  46. dosseg
  47. .model tiny
  48.  
  49. LF equ 0ah
  50. CR equ 0dh
  51. TAB equ 09h
  52. SPACE equ 20h
  53.  
  54. .code
  55. org 002ch
  56. envseg label word
  57.  
  58. org 0081h
  59. cmdtail label byte
  60.  
  61. org 0100h
  62.  
  63. ;---------------------------------------------------------
  64. ; regident-al part
  65. entry: jmp main
  66.  
  67. ID db 'UNCAPS'
  68. ID_len equ $ - ID
  69.  
  70. old09 label dword
  71. old09_off dw ?
  72. old09_seg dw ?
  73.  
  74. old2f label dword
  75. old2f_off dw ?
  76. old2f_seg dw ?
  77.  
  78. in09flag db 0
  79. func_no db ? ; 使用するファンクション番号
  80.  
  81. ;------------------------------------------------------
  82. ; int 09h handler
  83.  
  84.  
  85. KbReceiveData proc near
  86. mov cx,8000H
  87. RdyCheckLoop:
  88. in al,0043H
  89. test al,02H
  90. jnz Ready
  91. loop RdyCheckLoop
  92. stc
  93. ret
  94. Ready:
  95. mov dx,005FH
  96. mov cx,18H
  97. ReceiveLoop:
  98. out dx,al
  99. loop ReceiveLoop
  100. ;
  101. in al,0043H
  102. and al,38H
  103. jnz ReceiveError
  104. mov al,00010110B
  105. out 0043H,al
  106. mov cx,0007H
  107. @@WaitLoop3: out dx,al
  108. loop @@WaitLoop3
  109. in al,0041H
  110. clc
  111. ret
  112. ReceiveError:
  113. mov al,00010100B
  114. out 0043H,al
  115. mov cx,0007H
  116. @@WaitLoop4: out dx,al
  117. loop @@WaitLoop4
  118. in al,0041H
  119. stc
  120. ret
  121. KbReceiveData endp
  122.  
  123. KBSendCommand proc near
  124. ;input register-ah
  125. SendRetry:
  126. mov al,00010111B
  127. out 0043H,al
  128. mov dx, 005FH
  129. mov cx, 0007H
  130. @@WaitLoop1:
  131. out dx, al
  132. loop @@WaitLoop1
  133.  
  134. mov al, ah
  135. out 0041H, al
  136. mov cx, 0007H
  137. @@WaitLoop2:
  138. out dx, al
  139. loop @@WaitLoop2
  140. ;
  141. mov al, 00010110B
  142. out 0043H, al
  143. ;
  144. mov bl, 00H
  145. AckRetry:
  146. call KbReceiveData
  147. jc TimeOut
  148. cmp al, 0faH
  149. jne NotAck
  150. clc
  151. ret
  152. NotAck:
  153. cmp al,0FCH
  154. je SendRetry
  155. inc bl
  156. cmp bl, 04H
  157. jne AckRetry
  158. TimeOut:
  159. stc
  160. ret
  161. KBSendCommand endp
  162.  
  163. CAPSWORK equ 053ah
  164.  
  165. Send8251CapsOff proc near
  166. ;inhibit kb interrupt
  167. ;DebugVRAMOut 'D'
  168. or al, 02h
  169. out 0002h, al
  170. ;send 9d for LED
  171. ;DebugVRAMOut 'E'
  172. mov ah, 9dh
  173. call KBSendCommand
  174. jc @@send_end
  175. ;
  176. ;DebugVRAMOut 'F'
  177. mov ax, 0000h
  178. mov ds, ax
  179. mov ah, ds:[CAPSWORK]
  180. shl ah, 1
  181. and ah, 08h
  182. or ah, 70h
  183. call KBSendCommand
  184. @@send_end:
  185. ;DebugVRAMOut 'G'
  186. mov ah, 03H
  187. int 18H
  188.  
  189. ;DebugVRAMOut 'H'
  190. cli
  191. in al, 0002H
  192. and al, NOT 02H
  193. out 0002H,al
  194. sti
  195. ;DebugVRAMOut 'I'
  196. ;wait 50ms
  197. mov dx, 005fh
  198. mov cx, 1000h
  199. @@waitloop:
  200. out dx, al
  201. loop @@Waitloop
  202. ;DebugVRAMOut 'J'
  203. ret
  204. Send8251CapsOff endp
  205.  
  206. CAPSMASK equ 02h
  207. VRAMOFFSET equ 2 * (80 * 24 + 79)
  208.  
  209. myint09 proc far
  210.  
  211. cmp cs:in09flag, 0
  212. jne @@nop09
  213. inc cs:in09flag
  214.  
  215. pushf
  216. call cs:[old09]
  217.  
  218. push ax
  219. push ds
  220. push dx
  221. push cx
  222. push bx
  223.  
  224. DebugVRAMOut 'A'
  225. mov ax, 0000h
  226. mov ds, ax
  227. mov al, ds:[CAPSWORK]
  228. and al, CAPSMASK
  229. mov ax, 0A000h
  230. mov ds, ax
  231. jnz @@capson
  232. @@capsoff:
  233. jp @@capsnext
  234. @@capson:
  235.  
  236. DebugVRAMOut 'B'
  237. call Send8251CapsOff
  238. DebugVRAMOut 'C'
  239.  
  240. @@capsnext:
  241. ;insted call KB BIOS-reset int 18h-03h in Send8251CapsOff
  242. ; mov ax, 0000h
  243. ; mov ds, ax
  244. ; mov al, ds:[CAPSWORK]
  245. ; and al, not CAPSMASK
  246. ; mov ds:[CAPSWORK], al
  247.  
  248. pop bx
  249. pop cx
  250. pop dx
  251. pop ds
  252. pop ax
  253.  
  254. dec cs:in09flag
  255. @@nop09:
  256. iret
  257. myint09 endp
  258.  
  259. ;-------------------------------------------------------------
  260. myint2F proc far
  261. cmp ah, cs:func_no
  262. jne @@chain
  263.  
  264. cmp al, 00h
  265. je @@f00
  266. cmp al, 01h
  267. je @@f01
  268. jmp @@exit2F
  269. @@f00:
  270. mov ax, cs ;return al=0ffh, es:di=IDstring
  271. mov es, ax
  272. mov di, offset ID
  273. mov al, 0ffh
  274. jmp @@exit2F ;ax != 0000h
  275. @@f01:
  276. mov dx, cs
  277.  
  278. mov ax, 3509h
  279. int 21h
  280. mov ax, es
  281. sub ax, dx
  282. jnz @@exit2F ;ax != 0000h
  283.  
  284. mov ax, 352fh
  285. int 21h
  286. mov ax, es
  287. sub ax, dx
  288. jnz @@exit2F ;ax != 0000h
  289.  
  290. mov es, dx; ;ax == 0000h
  291. @@exit2F:
  292. iret
  293. @@chain:
  294. jmp cs:[old2F]
  295. myint2F endp
  296.  
  297. TSRSIZE equ $ - entry + 256
  298.  
  299. ;======================================================================
  300. ;initialize
  301.  
  302. .data
  303. msg_stay db 'uncap が常駐しました.', CR, LF, '$'
  304. msg_release db 'uncap を解放しました.', CR, LF, '$'
  305. msg_notexist db 'uncap は常駐していません.', CR, LF, '$'
  306. msg_already db 'uncap はすでに常駐しています.', CR, LF, '$'
  307. msg_hooked db 'uncap: INT 09h/2Fh のいずれかがフックされ'
  308. db '解放できません.', CR, LF, '$'
  309. msg_funcfull db 'uncap: INT 2Fh に未使用ファンクションがありません.'
  310. db CR, LF, '$'
  311.  
  312. .code
  313. main proc near
  314.  
  315. mov si, offset cmdtail
  316. cld
  317. @@getarg:
  318. lodsb
  319. cmp al, SPACE
  320. je @@getarg
  321. cmp al, TAB
  322. je @@getarg
  323. mov ah, al ; ah = 引数の最初の文字
  324. lodsb ; al = 引数の次の文字
  325. cmp ax, '-r'
  326. je @@release
  327. @@stay:
  328. call TSRcheck
  329. jc @@skip1
  330. jmp @@already
  331. @@skip1:
  332. call getfunc
  333. jnc @@skip2
  334. jmp @@funcfull
  335. @@skip2:
  336. mov func_no, ah
  337. mov ax, 3509h
  338. int 21h
  339. mov old09_off, bx
  340. mov old09_seg, es
  341.  
  342. mov ax, 352fh
  343. int 21h
  344. mov old2F_off, bx
  345. mov old2F_seg, es
  346.  
  347. mov dx, offset myint09
  348. mov ax, 2509h
  349. int 21h
  350.  
  351. mov dx, offset myint2f
  352. mov ax, 252fh
  353. int 21h
  354.  
  355. mov es, envseg
  356. mov ah, 49h
  357. int 21h
  358.  
  359. mov dx, offset msg_stay
  360. mov ah, 09h
  361. int 21h
  362.  
  363. mov dx, (TSRSIZE + 15) / 16
  364. mov ax, 3100h
  365. int 21h
  366.  
  367. @@release:
  368. call TSRcheck
  369. jc @@notexist
  370.  
  371. mov ah, func_no
  372. mov al, 01h
  373. int 2fh
  374. or ax, ax
  375. jnz @@hooked
  376.  
  377. push ds
  378.  
  379. lds dx, es:[old09] ; ds:dx <= old vec
  380. mov ax, 2509h
  381. int 21h
  382.  
  383. lds dx, es:[old2f] ; ds:dx <= old vec
  384. mov ax, 252fh
  385. int 21h
  386.  
  387. pop ds
  388.  
  389. mov ah, 49h
  390. int 21h
  391.  
  392. mov dx, offset msg_release
  393. mov ah, 09h
  394. int 21h
  395.  
  396. mov ax, 4c00h
  397. int 21h
  398.  
  399. @@already:
  400. mov dx, offset msg_already
  401. jmp @@error
  402. @@funcfull:
  403. mov dx, offset msg_funcfull
  404. jmp @@error
  405. @@notexist:
  406. mov dx, offset msg_notexist
  407. jmp @@error
  408. @@hooked:
  409. mov dx, offset msg_hooked
  410. @@error:
  411. mov ah, 09h
  412. int 21h
  413. mov ax, 4c01h
  414. int 21h
  415.  
  416. main endp
  417.  
  418. ;--------------------------------------------------------
  419. TSRcheck proc near
  420. mov ah, 0c0h
  421. @@tc_loop:
  422. push ax
  423. mov al, 00h
  424. int 2fh
  425. cmp al, 0ffh
  426. pop ax
  427. jne @@tc_nextfunc
  428. ;if residented
  429. ;es:di="uncaps"
  430. mov si, offset ID
  431. mov cx, ID_len
  432. cld
  433. repz cmpsb
  434. jz @@tc_found
  435. @@tc_nextfunc:
  436. inc ah
  437. jnz @@tc_loop
  438. @@tc_notfound:
  439. stc
  440. ret
  441. @@tc_found:
  442. mov func_no, ah
  443. clc
  444. ret
  445. TSRcheck endp
  446.  
  447. ;-----------------------------------------------------
  448. getfunc proc near
  449. mov ah, 0c0h
  450. @@fc_loop:
  451. push ax
  452. mov al, 00h
  453. int 2fh
  454. cmp al, 00h
  455. pop ax
  456. je @@fc_found
  457. inc ah
  458. jnz @@fc_loop
  459. @@fc_notfound:
  460. stc
  461. ret
  462. @@fc_found:
  463. clc
  464. ret
  465. getfunc endp
  466. end entry
  467. ;
  468. ;
  469. ; 2011.03.13 beta03
  470.  
  471.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty