亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? chgln_2.asm

?? 80386單片機
?? ASM
字號:
comment	*

        Author: Yousuf J. Khan

        Purpose: A TSR which will detect if a diskette has been changed,
        even if that drive's diskette change detection line is out of
        commission. Normally only used by 5.25" HD drives which have
        trouble recognizing a different density diskette.

	*

.model tiny

bds     segment at 40h

        comment {

        The BIOS Data Segment, segment 40h. All diskette related status
        bytes are listed below.

                {

        org     3Eh
disk_recal_stat db      ?       ;diskette recalibrate status
disk_motor_stat db      ?       ;diskette motor status
motor_timeout   db      ?       ;diskette motor turn-off timeout count
last_op         db      ?       ;last operation's error message
statcombytes    db      7 dup(?);status and command bytes
        org     8Bh
media_control   db      ?       ;diskette media control byte
        org     8Fh
ctrlr_info      db      ?       ;diskette controller info
drive0          db      ?       ;diskette 0 (A:) media state
drive1          db      ?       ;diskette 1 (B:) media state
last_drive0     db      ?       ;prior diskette 0 media state
last_drive1     db      ?       ;prior diskette 1 media state
cur_trak0       db      ?       ;current track, drive 0
cur_trak1       db      ?       ;current track, drive 1
        ends

.code

        comment {

        Look in the first byte of the first FCB field of PSP to get
        drive letter. This field takes any command-line argument that
        looks like a drive letter and converts it into an integer (eg.
        1=A:, 2=B:, etc.).

                {

        org     5Ch
FCB     db      ?       ;first FCB field of PSP
        org     100h

.startup
        jmp     tsr_init        ;jump to transient portion

        comment {

        Save data that is required for the resident portion of TSR here.
        Any other data not required to be resident can go into regular
        old '.data' segment.

                {

old_vect        dw      ?,?     ;address of previous level ISR
old_ax          dw      ?
old_bx          dw      ?
old_ds          dw      ?
old_es          dw      ?
old_si          dw      ?

new_int13:

        comment {

        When Int 13h called, can only assume CS:IP is saved therefore
        must manually save all other segments and registers.

                {

        ;
        ;let DS:=CS
        ;
        push    ds              ;save DS to be restored upon exit
        push    ax
        mov     ax, cs
        mov     ds, ax          ;make DS equal to CS
        pop     ax
        ;
        ;See if an access was made to our diskette drive? If not, then
        ;let it pass through.
        ;
        push    dx
        mov     dh, [fcb]
        dec     dh              ;BIOS_drive=FCB_drive-1
        cmp     dl, dh          ;is it drive we're interested in?
        pop     dx
        jne     passthru        ;not drive we're interested in
        ;
        ;See if an access to the read, write, or verify functions were
        ;made (ie. subfuncs 2 to 4)? If it was then intercept. Otherwise
        ;let it pass through.
        ;
        cmp     ah, 4
        ja      passthru        ;greater than subfnct 4
        cmp     ah, 2
        jb      passthru        ;less than subfnct 2
        ;
        ;save AX in case fnct has to be recalled
        ;
        mov     [old_ax], ax    
        ;
        ;call old INT 13h:
        ;simulate an INT by pushing FLAGS before CALLing
        ;
        pushf           
        call    dword ptr [old_vect]
        ;
        ;If no errors were found, then there is no need to redo this
        ;function. Just jump to the end.
        ;
        pushf   ;save the flag for exit from ISR
        jnc     simulated_iret

        comment {

        If an "address mark not found" error (ie. error #2) was
        returned, then modify various diskette parameters in BIOS data
        segment byte and redo function again.

                {

        cmp     ah, 2
        jne     simulated_iret  ;it wasn't an error #2
        popf                    ;pop exit ISR flag & discard
        ;
        ;ES:=BIOS Data Segment
        ;
        int     3               ;debugger breakpoint
        mov     [old_bx], bx
        mov     [old_es], es
        mov     [old_si], si
        mov     bx, BDS
        mov     es, bx
        assume  es:BDS
        ;
        ;SI+BX will be equal to either 90h or 91h, the offset within the
        ;BIOS data segment for either the drive 0 or drive 1 media
        ;state. The FCB number determines whether we want drive 0 or 1.
        ;
        xor     bx, bx  ;make sure BX is zero
        mov     si, offset ctrlr_info
        mov     bl, [fcb]
        ;
        ;To indicate an undetermined drive, set the proper media state
        ;byte to the value 2.
        ;
        mov     byte ptr es:[si][bx], 2
        mov     si, [old_si]
        mov     es, [old_es]
        mov     bx, [old_bx]
        mov     ax, [old_ax]    ;restore AX before recalling function

passthru:
        ;
        ;call old INT 13h:
        ;simulate an INT by pushing FLAGS before CALLing
        ;
        pushf           
        call    dword ptr [old_vect]
        pushf           ;save the flag for exit from ISR
simulated_iret:
;        popf            ;pop the flag for exit from ISR
;        pop     ds      ;restore original DS
;        retf    2       ;pop CS,IP, but discard saved entry flag
;
;  BINGO! this should be an iret, the old flags never get popped
;  from the stack.  On my machine with DOS 5.0 and about 20 or so
;  files on the floppy, it didnt give me any errors after 100 tries.
;  Why?  DOS resets the stack frame for each call, but for another
;  parent it will cause a problem.
;
;  when at  'retf  2'  the stack looks like this:
;    ss:[sp+00] = callers cs
;    ss:[sp+02] = callers ip
;    ss:[sp+04] = callers flags  ( flags get pushed 1st with int instruction )
;
;  What has been happening is that the flags being returned had the correct
;  return codes, and we returned to the correct cs:ip, however the stack
;  frame is off by one word on each call by not popping off the flags,
;  thus screwing with the callers stack frame.  That's why we do a pushf
;  before a far call to the original interrupt vector.  So, changing the
;  flags is okay because for this interrupt it is the return code,  however
;  we must exit in a way to perserve/restore the callers stack frame.
;
;  To do the least amount of changes to your code, try replacing with:
;
;    simulated_iret:
          pop     ds          ; pop saved flags into DS, DS is still stacked
          push    bp          ; save BP, we need it as an index into the stack
          mov     bp,sp       ; bp = stack pointer,  so  [bp+00] = old bp
          mov     [bp+08],ds  ; edit return flags, cs=[sp+04] so flags=[sp+08]
          pop     bp          ; restore original BP
          pop     ds          ; restore original DS, now [sp+00] = cs
          iret                ; int return

; I compiled this as is, and ran it in a continous loop from a batch file
; for about 30 minutes with no errors.  Now I have to go clean my floppy
; drive heads.

tsr_init:

        comment {

        This is the transient portion of the TSR. It initializes the
        resident portion by parsing the command-line, and revectoring
        the interrupts. This entire portion will disappear after
        residency.

                {

        .data
CR_LF   equ     13,10
copyright       db      "CHNGLINE (c) 1993, Yousuf J. Khan",cr_lf,"$"
installed       db      "installed",cr_lf,"$"
        .code
        ;
        ;write copyright message
        ;
        mov     ah, 9
        mov     dx, offset copyright
        int     21h
        ;
        ;get command-line
        ;
        cmp     [fcb], 0        ;any command-line argument at all?
        je      install_error   ; no arguments provided
        cmp     [fcb], 2        ;Drive A: or B:?
        ja      install_error   ; not a floppy drive
        ;
        ;redirect interrupts
        ;
	mov	ax, 3513h
	int	21h			;save old Int 13h vector
	mov	[old_vect], bx		;offset
        mov     [old_vect][2], es       ;segment
	push	ds			;save current DS
	mov	ax, cs
        mov     ds, ax                  ;DS := CS
        mov     dx, offset new_int13    ;DS:DX -> new Int 13h
	mov	ax, 2513h
	int	21h			;set new Int 13h address
        pop     ds                      ;restore DS
        ;
        ;state that TSR has been successfully installed
        ;
        mov     ah, 9
        mov     dx, offset installed
        int     21h
        ;
        ;start making resident
        ;
        mov     dx, offset tsr_init     ;# of bytes to keep res
	mov	cl, 4
	sar	dx, cl			;convert bytes to paragraphs
        inc     dx                      ;add 1
	mov	ax, 3100h
	int	21h			;term &	stay res
install_error:

        comment {

        If any errors were detected during initialization process then
        abort operation.

                {

        .data
errmsg  db      "Syntax:",CR_LF,"CHNGLINE {drive}",10,CR_LF
        db      "Where {drive} can only be either A: or B:",CR_LF,"$"
        .code
        mov     ah, 9
        mov     dx, offset errmsg
        int     21h
        mov     ax, 4C01h       ;errorlevel = 1
        int     21h             ;terminate w/o resident
        ends

        end

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本美女一区二区三区视频| 亚洲国产视频直播| 日韩一区二区视频| 色就色 综合激情| 99精品热视频| 成人av影视在线观看| 成人午夜免费电影| 福利一区二区在线观看| 国产999精品久久| 国产成人在线视频免费播放| 国产激情一区二区三区四区| 国产精品77777| 国产成人av一区二区三区在线 | 亚洲1区2区3区4区| 亚洲另类一区二区| 亚洲国产视频一区| 日产欧产美韩系列久久99| 日韩av一区二区三区四区| 日韩国产在线一| 精品一区二区三区在线观看国产| 伦理电影国产精品| 国产精品99久| 91久久精品一区二区| 欧美日韩国产首页在线观看| 911精品国产一区二区在线| 日韩亚洲欧美中文三级| 精品理论电影在线| 国产精品久久99| 亚洲一区二区影院| 乱中年女人伦av一区二区| 国产精品一区一区| 91色porny蝌蚪| 在线成人免费视频| 久久精品视频一区| 一区二区三区四区不卡在线| 日本美女视频一区二区| 国产高清不卡一区| 欧美三级在线播放| 亚洲人123区| 毛片一区二区三区| 99久久er热在这里只有精品15| 在线观看区一区二| 337p日本欧洲亚洲大胆色噜噜| 成人欧美一区二区三区黑人麻豆| 亚洲成va人在线观看| 国产不卡在线视频| 欧美日本在线一区| 国产精品妹子av| 免费欧美在线视频| 91老司机福利 在线| 精品国产免费一区二区三区四区| 中文字幕五月欧美| 精品一区二区精品| 欧美三级日韩在线| 国产精品福利一区| 国内精品免费在线观看| 欧美性猛交一区二区三区精品| 久久久久久久久久久电影| 亚洲一区二区三区视频在线播放| 国产精品系列在线观看| 欧美电影一区二区| 亚洲最新在线观看| www.日韩在线| 久久久久成人黄色影片| 日本成人超碰在线观看| 在线一区二区三区四区五区| 国产精品视频yy9299一区| 久久先锋影音av鲁色资源| 亚洲欧美另类综合偷拍| 国产一区二区三区美女| 在线观看网站黄不卡| 2020国产精品久久精品美国| 亚洲成人免费看| 成人不卡免费av| 国产精品午夜免费| 国产成人免费高清| 国产亚洲午夜高清国产拍精品| 青娱乐精品视频在线| 欧美日韩日日骚| 亚洲永久精品国产| 欧洲一区二区av| 亚洲韩国一区二区三区| 欧美优质美女网站| 亚洲电影第三页| 欧美色图第一页| 亚洲不卡在线观看| 91精品国产综合久久婷婷香蕉| 亚洲综合视频在线观看| 欧美日韩一区高清| 亚洲国产精品久久人人爱| 欧美性欧美巨大黑白大战| 亚洲成av人片一区二区三区| 91精品国产综合久久福利| 男人的天堂久久精品| 26uuu另类欧美亚洲曰本| 国产剧情一区二区三区| 中文字幕一区二区不卡| 在线精品视频一区二区| 日韩电影免费一区| 久久久国产精华| 91在线一区二区三区| 午夜精品成人在线视频| 精品国产不卡一区二区三区| 91福利在线播放| 亚洲成人av福利| 精品国产免费视频| 91片在线免费观看| 日韩av一区二区在线影视| 亚洲精品在线网站| 91亚洲永久精品| 午夜伦理一区二区| 欧美亚洲综合色| 亚洲另类在线制服丝袜| 91精品国产一区二区三区蜜臀| 日本最新不卡在线| 久久这里只有精品视频网| a亚洲天堂av| 亚洲成人av一区二区三区| 日韩欧美一区二区三区在线| 国产一区二区三区国产| 中文字幕av一区 二区| 国产中文字幕精品| 亚洲综合视频网| 日韩手机在线导航| 成人av在线网站| 亚洲国产精品自拍| 国产午夜精品一区二区三区四区| 99久久久国产精品| 香蕉乱码成人久久天堂爱免费| 精品国产乱码久久久久久夜甘婷婷| 国产成人精品免费视频网站| 有坂深雪av一区二区精品| 日韩西西人体444www| 成人av资源下载| 亚洲综合久久av| 国产精品色呦呦| 欧美一级理论片| 本田岬高潮一区二区三区| 午夜av电影一区| 亚洲免费观看高清完整版在线| 日韩一级黄色大片| av不卡在线观看| 久久99国产精品久久99果冻传媒| 亚洲色图第一区| 久久夜色精品国产欧美乱极品| 成人在线视频首页| 奇米影视一区二区三区| 亚洲女子a中天字幕| 国产网站一区二区| 制服丝袜亚洲网站| 成人午夜大片免费观看| 国产乱妇无码大片在线观看| 丝袜美腿亚洲综合| 亚洲日本在线a| 久久精品视频一区| 中文字幕久久午夜不卡| 欧美一区二区久久| 欧美色视频在线| 91小视频在线免费看| 福利91精品一区二区三区| 韩国精品免费视频| 日韩激情在线观看| 亚洲成a人片在线观看中文| 亚洲国产精品一区二区www在线| 国产精品视频线看| 久久久久99精品国产片| 欧美成人三级电影在线| 欧美日韩的一区二区| 欧美性猛交xxxxxx富婆| 91麻豆免费看片| 9i在线看片成人免费| 日本不卡1234视频| 精品一区二区av| 九九精品视频在线看| 蜜桃视频在线观看一区二区| 亚洲国产精品久久人人爱| 视频一区二区三区中文字幕| 亚洲综合一区在线| 亚洲午夜影视影院在线观看| 亚洲综合久久久久| 蜜臀av性久久久久蜜臀av麻豆 | 最新成人av在线| 国产精品久久久久aaaa| 中文字幕一区二区三区视频| 亚洲电影你懂得| 日本视频一区二区三区| 青青草国产精品亚洲专区无| 国产成人日日夜夜| 99国产精品国产精品久久| 色综合久久久久久久久久久| 91成人在线免费观看| 日韩三级视频在线看| 久久一区二区视频| 国产欧美日韩在线| 国产精品嫩草影院com| 日日骚欧美日韩| 国产老妇另类xxxxx| 2014亚洲片线观看视频免费| 久久久久久一二三区| 亚洲二区在线视频|