DOSDATA Segment ; ; first and second DOS patches ; Non-console device read/write (system calls 3Fh and 40h) ; ; Code in disk.asm, 2 locations, one for read, one for write ; DVRDLP: ; DVWRTLP: ; ; ; 036h lds si,SS:[????] ; ThisSFT ; lds si,si+7 ; sf_devptr ; 0E8h call ???? <- "simulate" int28 event ; DSKSTATCHK ; ; DOSP1_ID db 036h,0C5h,036h DOSP1_THISSFT db 036h,005h,0C5h,074h,007h,0E8h DOSP1_ID_LEN equ $-DOSP1_ID db 90h, 90h DOSP12_ID db 036h,0C5h,036h DOSP12_THISSFT db 036h,005h,0C5h,074h,007h,0E8h DOSP12_ID_LEN equ $-DOSP1_ID ; ; Third/Fourth DOS patch - System call 3Fh (Read) from console ; ; Code in disk.asm, 1 location ; GETBUF: ; ; 051h push cx <- begin special int28 mode ; push es ; push di ; mov dx,???? ; offset dosgroup:CONBUF ; call ???? ; $STD_CON_STRING_INPUT ; pop di ; pop es ; 059h pop cx <- end special int28 mode ; DOSP3_ID db 051h,006h,057h,0BAh DOSP3_CONBUF db 029h,002h,0E8h DOSP3_ID_LEN equ $-DOSP3_ID db 09Ah,0E3h,05Fh,007h ; ???? , pop di, pop es DOSP4_ID db 059h ; pop cx DOSP4_ID_OFF equ (DOSP4_ID - DOSP3_ID) ; ; Fifth DOS patch - System call 40h (Write) to console ; ; ; Code in disk.asm, 1 location ; ; push cx ; WRCONLP: lodsb ; cmp al,1Ah ; jz ???? ; call ???? <- "simulate" int28 event ; loop WRCONLP ; CONEOF: pop ax ; DOSP5_ID db 051h ; push cx db 0ACh,03Ch,01Ah,074h,005h db 0E8h ; call DOSP5_ID_LEN equ $-DOSP5_ID ; ; Seventh DOS patch - System call entry, patch USER_ID with VMid for share ; ; Code in disp.asm, 1 location ; ; ; mov [SaveDS],ds ; mov [SaveBX],bx ; mov bx,cs ; mov ds,bx ; inc [indos] ; xor ax,ax ; mov [USER_ID],AX <- Patch to set USER_ID to VMID ; ; DOSP7_ID db 02Eh,08Ch,01Eh DOSP7_SAVEDS db 07Eh,05h ; mov [SaveDS],ds db 02Eh,089h,01Eh DOSP7_SAVEBX db 07Ch,05h ; mov [SaveBX],bx db 08Ch,0CBh ; mov bx,cs db 08Eh,0DBh ; mov ds,bx db 0FEh,006h DOSP7_INDOS db 0CFh,002h ; inc [indos] db 033h,0C0h ; xor ax,ax DOSP7_ID_LEN equ $-DOSP7_ID ; ; Eighth DOS patch - OWNER check in handle calls. For share, need to NOP test ; ; Code in handle.asm, 1 location in routine CheckOwner ; ; ; ; push ax ; mov ax,ss:[USER_ID] <- patch to XOR AX,AX to set zero ; cmp ax,es:[di.sf_UID] <- NOP ; pop ax ; jz ???? ; ; ; DOSP8_ID db 050h ; push ax db 036h,0A1h DOSP8_USER_ID db 0EAh,002h ; mov ax,ss:[USER_ID] db 026h,03Bh,045h ; cmp ax,es:[di+2F] DOSP8_ID_LEN equ $-DOSP8_ID db 02Fh,058h ; pop ax ; ; 10th, 11th, 12th DOS patch - System call 3Fh (Read) in raw mode ; ; Take RAW read to STDIN SFT and turn it into a polling loop doing ; a yeild when a character is not ready to be read. ; ; Code in disk.asm, 3 locations ; ; DVRDRAW: ; PUSH ES ; POP DS ; ReadRawRetry: <- Patch 10 ; MOV BX,DI ; XOR AX,AX <- Reenter #2 ; MOV DX,AX ; call SETREAD ; PUSH DS <- Reenter #1 ; LDS SI,[THISSFT] ; call DEVIOCALL ; MOV DX,DI ; MOV AH,86H ; MOV DI,[DEVCALL.REQSTAT] ; TEST DI,STERR ; JZ CRDROK ; call CHARHARD ; MOV DI,DX ; OR AL,AL ; JZ CRDROK ; CMP AL,3 ; JZ CRDFERR ; POP DS ; JMP ReadRawRetry ; ; CRDFERR: ; POP DI <- Patch 11 ; DEVIOFERR: ; LES DI,[THISSFT] ; jmp SET_ACC_ERR_DS ; ; CRDROK: ; POP DI <- Patch 12 ; MOV DI,DX ; ADD DI,[CALLSCNT] ; JMP SHORT ENDRDDEVJ3 ; ; DOSP10_ID db 006H,01FH DOSP10_LOC_OFFSET equ $-DOSP10_ID DOSP10_LOC db 08BH,0DFH DOSP10_REENT2_OFFSET equ $-DOSP10_LOC db 033H,0C0H,08BH,0D0H,0E8H DOSP10_ID_LEN equ $-DOSP10_ID db 0DFH,00EH DOSP10_REENT1_OFFSET equ $-DOSP10_LOC db 01EH,036H,0C5H,036H,036H,005H,0E8H,0AFH,00EH db 08BH,0D7H,0B4H,086H,036H,08BH,03EH DOSP10_PACKVAL_OFFSET equ $-DOSP10_ID db 009H,003H db 0F7H,0C7H,000H,080H,074H,019H,0E8H,047H,017H db 08BH,0FAH,00AH,0C0H,074H,010H,03CH,003H,074H,003H db 01FH,0EBH,0CFH DOSP11_LOC_OFFSET equ $-DOSP10_ID db 05FH DOSP11_REENT_OFFSET equ $-DOSP10_LOC db 036H,0C4H,03EH,036H,005H,0E9H,0A1H,004H DOSP12_LOC_OFFSET equ $-DOSP10_ID db 05FH,08BH,0FAH ; ; 13th DOS patch - Actually a SYSINIT patch. Patches the stack fault code ; which prints the fatal stack fault error on DOS >= 3.20. ; ; Sets focus to current VM so user can see fatal message. ; ; ; l0: lodsb <- Setfocus here ; cmp al, '$' ; je l1 ; mov bl, 7 ; mov ah, 0Eh ; int 10h ; jmp l0 ; l1: jmp $ ; ; ; DOSP13_ID db 0ACh ; l0: lodsb db 03Ch,024h ; cmp al, '$' db 074h,008h ; je l1 db 0B3h,007h ; mov bl, 7 db 0B4h,00Eh ; mov ah, 0Eh db 0CDh,010h ; int 10h db 0EBh,0F3h ; jmp l0 db 0EBh,0FEh ; l1: jmp $ DOSP13_ID_LEN equ $-DOSP13_ID DOSDATA ends