; This is file GRPROT.ASM ; ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954 ; ; This file is distributed under the terms listed in the document ; "copying.dj", available from DJ Delorie at the address above. ; A copy of "copying.dj" should accompany this file; if not, a copy ; should be available from where this file was obtained. This file ; may not be distributed without a verbatim copy of "copying.dj". ; ; This file is distributed WITHOUT ANY WARRANTY; without even the implied ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ; ; History:270,22 title grprot .386p include build.inc include segdefs.inc include tss.inc include gdt.inc include idt.inc ; ; Memory Map (relative to 0xe0000000) : ; 00000000 - 000fffff == read/write area ; 00100000 - 001fffff == read only area ; 00200000 - 002fffff == write only area ; ; If your board can support separate read & write mappings, ; like the TSENG chips, then either one of two cases applies: ; 1. The read and write mappings are the same, and the rw, r, ; and w areas all have one present bank. ; 2. The read and write mappings are different, and only the ; r and w areas have a mapped bank. Accesses to the rw area ; cause a page fault and the board goes back into case #1. ; ; If your board can't support separate read & write mappings, ; always map the rw, r, and w areas to the same page (case #1 above) ; ; It is up to the programmer to ensure that the program doesn't ; read from the write only area, or write to the read only area. ; ; This method is used because you can't use the string move instructions ; across pages. The "movsx" instruction causes *two* memory references, ; potentially to different banks. The first causes one bank to be ; enabled, and the instruction is restarted. The second access causes ; the second bank to be enabled, and the instruction is *RESTARTED*. ; This means it will attempt the *first* access again, causing it to be ; enabled, ad infinitum. ; ; Thus, bcopy() and memcpy() shouldn't *ever* access the rw area! ;------------------------------------------------------------------------ start_data16 extrn _gr_paging_func:dword extrn _graphics_pt:dword public _graphics_pt_lin _graphics_pt_lin dd ? ; filled in by paging.c ; pointer into _graphics_pt_lin ; 0, 64, 128, . . . ; 00h, 40h, 80h, . . . ; addresses 00000h, 10000h, 20000h, . . . cur_rw dd 0 cur_r dd 0 cur_w dd 0 r_bank db 0 w_bank db 0 mode db 0 mode_none equ 0 mode_rw equ 1 mode_r_w equ 2 end_data16 ;------------------------------------------------------------------------ start_code16 handlers label word dw offset handler_rw dw offset handler_r dw offset handler_w extrn _page_fault:near public graphics_fault graphics_fault: cli mov ax,g_core mov gs,ax mov ebx,cr2 and ebx,00f00000h shr ebx,19 jmp cs:handlers[bx] ;------------------------------------------------------------------------ handler_rw: cmp mode,mode_none je h_none_rw cmp mode,mode_r_w je h_r_w_rw mov esi,_graphics_pt_lin add esi,cur_rw mov ecx,16 L0: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L0 jmp h_none_rw h_r_w_rw: mov esi,_graphics_pt_lin add esi,cur_r mov ecx,16 L1: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L1 mov esi,_graphics_pt_lin add esi,cur_w mov ecx,16 L2: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L2 h_none_rw: mov mode,mode_rw mov eax,cr2 shr eax,10 and eax,000003c0h mov cur_rw,eax shr ax,6 ; al is now page number mov ah,al call [_gr_paging_func] mov esi,_graphics_pt_lin add esi,cur_rw mov ecx,16 L3: or byte ptr gs:[esi],01h ; "present" add esi,4 loop L3 mov eax,cr3 mov cr3,eax pop eax iretd ; back to running program jmp _page_fault ;------------------------------------------------------------------------ handler_r: cmp mode,mode_none je h_none_r cmp mode,mode_rw je h_rw_r mov esi,_graphics_pt_lin add esi,cur_r mov ecx,16 L10: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L10 jmp h_none_r h_rw_r: mov esi,_graphics_pt_lin add esi,cur_rw mov ecx,16 L11: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L11 h_none_r: mov mode,mode_r_w mov eax,cr2 shr eax,10 and eax,000003c0h mov cur_r,eax add cur_r,1024 ; 1M shr ax,6 ; al is now page number mov r_bank,al mov ah,al mov al,w_bank call [_gr_paging_func] mov esi,_graphics_pt_lin add esi,cur_r mov ecx,16 L12: or byte ptr gs:[esi],01h ; "present" add esi,4 loop L12 mov eax,cr3 mov cr3,eax pop eax iretd ; back to running program jmp _page_fault ;------------------------------------------------------------------------ handler_w: cmp mode,mode_none je h_none_w cmp mode,mode_rw je h_rw_w mov esi,_graphics_pt_lin add esi,cur_w mov ecx,16 L20: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L20 jmp h_none_w h_rw_w: mov esi,_graphics_pt_lin add esi,cur_rw mov ecx,16 L21: and byte ptr gs:[esi],0feh ; "not present" add esi,4 loop L21 h_none_w: mov mode,mode_r_w mov eax,cr2 shr eax,10 and eax,000003c0h mov cur_w,eax add cur_w,2048 ; 1M shr ax,6 ; al is now page number mov w_bank,al mov ah,r_bank call [_gr_paging_func] mov esi,_graphics_pt_lin add esi,cur_w mov ecx,16 L23: or byte ptr gs:[esi],01h ; "present" add esi,4 loop L23 mov eax,cr3 mov cr3,eax pop eax iretd ; back to running program jmp _page_fault ;------------------------------------------------------------------------ end_code16 ;------------------------------------------------------------------------ end