Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1898 → Rev 1899

/kernel/branches/Kolibri-A/trunk/kernel.asm
63,9 → 63,6
 
USE_COM_IRQ equ 1 ; make irq 3 and irq 4 available for PCI devices
 
; Enabling the next line will enable serial output console
;debug_com_base equ 0x3f8 ; 0x3f8 is com1, 0x2f8 is com2, 0x3e8 is com3, 0x2e8 is com4, no irq's are used
 
include "proc32.inc"
include "kglobals.inc"
 
344,8 → 341,8
mov [screen_workarea.bottom],eax
movzx eax,word [BOOT_VAR+0x9008] ; screen mode
mov [SCR_MODE],eax
mov eax,[BOOT_VAR+0x9014] ; Vesa 1.2 bnk sw add
mov [BANK_SWITCH],eax
; mov eax,[BOOT_VAR+0x9014] ; Vesa 1.2 bnk sw add == not used any more
; mov [BANK_SWITCH],eax
movzx eax, word[BOOT_VAR+0x9001] ; for other modes
mov [BytesPerScanLine],ax
mov [_display.pitch], eax
375,8 → 372,8
; === EGA, VGA & Vesa 1.2 modes not supported ===
setvesa20:
v20ga32:
mov [PUTPIXEL],dword put_pixel
mov [GETPIXEL],dword get_pixel
; mov [PUTPIXEL],dword put_pixel
; mov [GETPIXEL],dword get_pixel
 
; -------- Fast System Call init ----------
.SEnP:
514,8 → 511,8
mov [BgrDrawMode],eax
mov [BgrDataWidth],eax
mov [BgrDataHeight],eax
mov [mem_BACKGROUND], 4
mov [img_background], static_background_data
; mov [mem_BACKGROUND], 4
; mov [img_background], static_background_data
 
mov [SLOT_BASE + 256 + APPDATA.dir_table], sys_pgdir - OS_BASE
 
603,17 → 600,6
mov esi, boot_memdetect
call boot_log
 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>
mov ebx, img_test_struct
mov ecx, 3*65536 + 4
mov edx, 32*65536 + 512
mov esi, 32
xor edi, edi
mov ebp, edi
call sys_putimage_palette.forced
 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>
 
movzx ecx, word [boot_y]
or ecx, (10+29*6) shl 16 ; "Determining amount of memory"
sub ecx, 10
645,16 → 631,9
 
mov esi,boot_bgr
call boot_log
call init_background
call _init_background ;graph32.inc ?
call calculatebackground
 
; RESERVE SYSTEM IRQ'S JA PORT'S
 
; mov esi,boot_resirqports
; call boot_log
; call reserve_irqs_ports
 
 
; SET UP OS TASK
 
mov esi,boot_setostask
706,6 → 685,138
mov [SLOT_BASE+APPDATA.cursor],eax
mov [SLOT_BASE+APPDATA.cursor+256],eax
 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>
 
; mov esi, img_test_struct_8
; mov edi, 151
 
; mov ebp, edi
; imul edi, [BytesPerScanLine]
; add edi, LFB_BASE + 32*4
; mov [img_lfb_origin], edi
; shr ebp, 1
; imul ebp, [_WinMapWidth]
; add ebp, 32/4
; add ebp, [_WinMapAddress]
; mov ecx, ebp
; add ecx, [_WinMapWidth]
; mov byte[ecx+1], 2
; mov ecx, 6
; mov [img_pix_y], ecx
; mov eax, 1
; mov [img_bytes_per_pix], eax
; mov ebx, 1
; bts ebx, 24
; mov eax, 8-1
; mov [img_pix_x], eax
; inc eax
; shr eax, 2
; mov [img_map_x], eax
; mov [img_draw_core_fn], draw_core_8bpp
; mov [img_draw_edge_fn], draw_edge_8bpp
; mov [img_buf_line_size], 9
; mov [img_palette], img_test_palette
 
; call draw_aligned_box
; add edi, 48
; mov edx, 8
; call draw_unaligned_edge
; mono
; bts ebx, 25
; add edi, [_WinMapWidth] ; = 1/16 of the screen width
; mov esi, img_test_struct_1
; mov [img_lfb_origin], edi
; mov ecx, 9
; mov [img_map_x], 4
; mov [img_bitoffset], 1
; mov [img_edgeoffset], 16
; mov [img_draw_core_fn], draw_core_1bpp
; mov [img_draw_edge_fn], draw_edge_1bpp
; mov [img_buf_line_size], 2
; mov [img_bytes_per_pix], 0
; call draw_aligned_box
; add edi, 48
; mov edx, 8
; call draw_unaligned_edge
; btr ebx, 25
; 32bpp
; add edi, [_WinMapWidth] ; = 1/16 of the screen width
; mov esi, img_test_struct_32
; mov [img_lfb_origin], edi
; mov ecx, 6
; mov [img_map_x], 2
; mov [img_draw_core_fn], draw_core_32bpp
; mov [img_draw_edge_fn], draw_edge_32bpp
; mov [img_buf_line_size], 32
; mov [img_bytes_per_pix], 4
; call draw_aligned_box
; add edi, 48
; mov edx, 8
; call draw_unaligned_edge
 
; 24bpp
; add edi, [_WinMapWidth] ; = 1/16 of the screen width
; mov esi, img_test_struct_24
; mov [img_lfb_origin], edi
; mov ecx, 7
; mov [img_map_x], 4
; mov [img_draw_core_fn], draw_core_24bpp
; mov [img_draw_edge_fn], draw_edge_24bpp
; mov [img_buf_line_size], 45
; mov [img_bytes_per_pix], 3
; call draw_aligned_box
; add edi, 80
; mov edx, 4
; call draw_unaligned_edge
 
; mov [TASK_BASE-twdw + WDATA.box.left], 0
; mov [TASK_BASE-twdw + WDATA.box.top], 0
; mov eax, [Screen_Max_X]
; mov [TASK_BASE-twdw + WDATA.box.width], eax
; mov eax, [Screen_Max_Y]
; mov [TASK_BASE-twdw + WDATA.box.height], eax
; mov ebx, img_test_struct_24
; mov ecx, 16*65536 + 7
; mov edx, 512*65536 + 400
 
; call _putimage
 
 
;-----------
; mov ebx, img_test_struct_32
; mov ecx, 6*65536 + 6
; mov edx, 32*65536 + 512
; mov esi, 32
; xor edi, edi
; mov ebp, edi
; call sys_putimage_palette.forced
 
; mov [img_palette], img_test_palette
; mov [img_bytes_per_pix], 0
; mov [img_buf_line_size], 0
; mov ebx, img_test_palette
; mov [img_draw_core_fn], draw_core_0bpp
; mov [img_draw_edge_fn], draw_edge_0bpp
; mov ecx, 20*65536 + 9
; mov edx, 513*65536 + 401
; call _putimage
 
; mov eax, 561
; mov ebx, 461
; mov ecx, 555
; mov edx, 333
; mov edi, 0xAA5533
; call _drawbar
 
 
 
; jmp $
 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>
 
 
 
; READ TSC / SECOND
 
mov esi,boot_tsc
744,17 → 855,18
 
call set_variables
 
 
 
; SET MOUSE
 
;call detect_devices
stdcall load_driver, szPS2MDriver
; stdcall load_driver, szCOM_MDriver
 
mov esi,boot_setmouse
call boot_log
call setmouse
; call setmouse
cli
 
 
; STACK AND FDC
 
call stack_init
852,47 → 964,7
;// mike.dld ]
 
 
; Setup serial output console (if enabled)
 
if defined debug_com_base
 
; enable Divisor latch
 
mov dx, debug_com_base+3
mov al, 1 shl 7
out dx, al
 
; Set speed to 115200 baud (max speed)
 
mov dx, debug_com_base
mov al, 0x01
out dx, al
 
mov dx, debug_com_base+1
mov al, 0x00
out dx, al
 
; No parity, 8bits words, one stop bit, dlab bit back to 0
 
mov dx, debug_com_base+3
mov al, 3
out dx, al
 
; disable interrupts
 
mov dx, debug_com_base+1
mov al, 0
out dx, al
 
; clear + enable fifo (64 bits)
 
mov dx, debug_com_base+2
mov al, 0x7 + 1 shl 5
out dx, al
 
 
end if
 
; START MULTITASKING
 
if preboot_blogesc
933,9 → 1005,6
inc edi
call dtext
 
; mov [novesachecksum],1000
; call checkVga_N13
 
popad
 
ret
951,11 → 1020,9
call window_check_events
call mouse_check_events
call checkmisc
; call checkVga_N13
call stack_handler
call checkidle
call check_fdd_motor_status
; call check_ATAPI_device_event
; call check_fdd_motor_status
jmp osloop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
1764,6 → 1831,7
test eax, eax
jz @F
 
 
stdcall user_free, eax
@@:
 
2150,227 → 2218,29
bgrlock db 0
endg
 
;=============================== SysFn 15 ================================
; no background service supported so far ...
;===========================================
 
sys_background:
 
cmp ebx,1 ; BACKGROUND SIZE
jnz nosb1
test ecx,ecx
; cmp ecx,0
jz sbgrr
test edx,edx
; cmp edx,0
jz sbgrr
@@:
;;Maxis use atomic bts for mutexes 4.4.2009
bts dword [bgrlock], 0
jnc @f
call change_task
jmp @b
@@:
mov [BgrDataWidth],ecx
mov [BgrDataHeight],edx
; mov [bgrchanged],1
 
pushad
; return memory for old background
mov eax, [img_background]
cmp eax, static_background_data
jz @f
stdcall kernel_free, eax
@@:
; calculate RAW size
xor eax,eax
inc eax
cmp [BgrDataWidth],eax
jae @f
mov [BgrDataWidth],eax
@@:
cmp [BgrDataHeight],eax
jae @f
mov [BgrDataHeight],eax
@@:
mov eax,[BgrDataWidth]
imul eax,[BgrDataHeight]
lea eax,[eax*3]
mov [mem_BACKGROUND],eax
; get memory for new background
stdcall kernel_alloc, eax
test eax, eax
jz .memfailed
mov [img_background], eax
jmp .exit
.memfailed:
; revert to static monotone data
mov [img_background], static_background_data
xor eax, eax
inc eax
mov [BgrDataWidth], eax
mov [BgrDataHeight], eax
mov [mem_BACKGROUND], 4
cmp ebx,6 ; subfns 1..5 do not return anything
jb .exit
mov dword [esp+32], 0 ; subfns 6,7 return 0 as error
.exit:
popad
mov [bgrlock], 0
 
sbgrr:
ret
 
nosb1:
;=============================== SysFn 39 ================================
; no background service supported so far ...
;===========================================
align 4
 
cmp ebx,2 ; SET PIXEL
jnz nosb2
 
mov eax, [img_background]
test ecx, ecx
jz @f
cmp eax, static_background_data
 
jz .ret
@@:
mov ebx, [mem_BACKGROUND]
add ebx, 4095
and ebx, -4096
sub ebx, 4
cmp ecx, ebx
ja .ret
 
mov ebx,[eax+ecx]
and ebx,0xFF000000 ;255*256*256*256
and edx,0x00FFFFFF ;255*256*256+255*256+255
add edx,ebx
mov [eax+ecx],edx
.ret:
sys_getbackground:
mov dword [esp+32], 0
ret
nosb2:
 
cmp ebx,3 ; DRAW BACKGROUND
jnz nosb3
draw_background_temp:
; cmp [bgrchanged],1 ;0
; je nosb31
;draw_background_temp:
; mov [bgrchanged],1 ;0
;===========================================
 
mov [background_defined], 1
mov byte[BACKGROUND_CHANGED], 1
call force_redraw_background
nosb31:
ret
nosb3:
 
cmp ebx,4 ; TILED / STRETCHED
jnz nosb4
cmp ecx,[BgrDrawMode]
je nosb41
mov [BgrDrawMode],ecx
; mov [bgrchanged],1
nosb41:
ret
nosb4:
 
cmp ebx,5 ; BLOCK MOVE TO BGR
jnz nosb5
cmp [img_background], static_background_data
jnz @f
test edx, edx
jnz .fin
cmp esi, 4
ja .fin
@@:
; bughere
mov eax, ecx
mov ebx, edx
add ebx, [img_background] ;IMG_BACKGROUND
mov ecx, esi
call memmove
.fin:
ret
nosb5:
 
cmp ebx, 6
jnz nosb6
;;Maxis use atomic bts for mutex 4.4.2009
@@:
bts dword [bgrlock], 0
jnc @f
call change_task
jmp @b
@@:
mov eax, [CURRENT_TASK]
mov [bgrlockpid], eax
cmp [img_background], static_background_data
jz .nomem
stdcall user_alloc, [mem_BACKGROUND]
mov [esp+32], eax
test eax, eax
jz .nomem
mov ebx, eax
shr ebx, 12
or dword [page_tabs+(ebx-1)*4], DONT_FREE_BLOCK
mov esi, [img_background]
shr esi, 12
mov ecx, [mem_BACKGROUND]
add ecx, 0xFFF
shr ecx, 12
.z:
mov eax, [page_tabs+ebx*4]
test al, 1
jz @f
call free_page
@@:
mov eax, [page_tabs+esi*4]
or al, PG_UW
mov [page_tabs+ebx*4], eax
mov eax, ebx
shl eax, 12
invlpg [eax]
inc ebx
inc esi
loop .z
ret
.nomem:
and [bgrlockpid], 0
mov [bgrlock], 0
nosb6:
cmp ebx, 7
jnz nosb7
cmp [bgrlock], 0
jz .err
mov eax, [CURRENT_TASK]
cmp [bgrlockpid], eax
jnz .err
mov eax, ecx
mov ebx, ecx
shr eax, 12
mov ecx, [page_tabs+(eax-1)*4]
test cl, USED_BLOCK+DONT_FREE_BLOCK
jz .err
jnp .err
push eax
shr ecx, 12
dec ecx
@@:
and dword [page_tabs+eax*4], 0
mov edx, eax
shl edx, 12
push eax
invlpg [edx]
pop eax
inc eax
loop @b
pop eax
and dword [page_tabs+(eax-1)*4], not DONT_FREE_BLOCK
stdcall user_free, ebx
mov [esp+32], eax
and [bgrlockpid], 0
mov [bgrlock], 0
ret
.err:
and dword [esp+32], 0
ret
 
nosb7:
ret
 
force_redraw_background:
and [draw_data+32 + RECT.left], 0
and [draw_data+32 + RECT.top], 0
2382,54 → 2252,9
pop ebx eax
inc byte[REDRAW_BACKGROUND]
ret
;===========================================
 
align 4
 
sys_getbackground:
; cmp eax,1 ; SIZE
dec ebx
jnz nogb1
mov eax,[BgrDataWidth]
shl eax,16
mov ax,[BgrDataHeight]
mov [esp+32],eax
ret
 
nogb1:
; cmp eax,2 ; PIXEL
dec ebx
jnz nogb2
 
mov eax, [img_background]
test ecx, ecx
jz @f
cmp eax, static_background_data
jz .ret
@@:
mov ebx, [mem_BACKGROUND]
add ebx, 4095
and ebx, -4096
sub ebx, 4
cmp ecx, ebx
ja .ret
 
mov eax,[ecx+eax]
 
and eax, 0xFFFFFF
mov [esp+32],eax
.ret:
ret
nogb2:
 
; cmp eax,4 ; TILED / STRETCHED
dec ebx
dec ebx
jnz nogb4
mov eax,[BgrDrawMode]
nogb4:
mov [esp+32],eax
ret
 
align 4
 
sys_getkey:
2846,26 → 2671,6
;---------------------------------------------------------------------------------------------
 
 
; check if pixel is allowed to be drawn
; -- not in use any more ?
 
;checkpixel:
; push eax ebx edx
; shr ebx, 1
; mov edx, [_WinMapWidth] ; <<<<
; imul edx, ebx
; shr eax, 2
; add eax, [_WinMapAddress]
; mov dl, [eax+edx]
;
; xor ecx, ecx
; mov eax, [CURRENT_TASK]
; cmp al, dl
; setne cl
;
; pop edx ebx eax
; ret
 
iglobal
cpustring db 'CPU',0
endg
3291,18 → 3096,10
 
drawbackground:
inc [mouse_pause]
; cmp [BgrDrawMode],dword 1
; jne bgrstr
; call vesa20_drawbackground_tiled
call drawbackground
call draw_background ; graph32.inc
dec [mouse_pause]
call [draw_pointer]
ret
; bgrstr:
; call vesa20_drawbackground_stretch
; dec [mouse_pause]
; call [draw_pointer]
; ret
 
; ====================================================================
align 4
3339,7 → 3136,8
inc [mouse_pause]
call _putimage
dec [mouse_pause]
jmp [draw_pointer]
call [draw_pointer]
ret
 
 
align 4
3357,12 → 3155,13
add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
rol edx, 16
.forced:
push eax
push esi
mov [img_palette], edi
mov eax, esi
cmp eax, 32 ;>32bpp (stupid call)
ja .exit
shr al, 3 ; 0=1bpp, other lo-pix modes not supported
push esi
shr al, 3 ; 0=1bpp or solid color
mov [img_bytes_per_pix], eax
mov esi, [eax*4 + img_core_proc_0]
mov [img_draw_core_fn], esi
3370,29 → 3169,34
mov [img_draw_edge_fn], esi
mov esi, ecx
shr esi, 16 ; esi = SizeX
imul esi, eax
or al, al
jz .1bpp
imul esi, eax
jmp .done
jnz .done
mov eax, [esp] ; bits per pixel
or al, al
jz .done
.1bpp:
add esi, 7
shr esi, 3 ; 8 pixels per byte
mov [img_draw_edge_fn], draw_edge_1bpp
mov [img_draw_core_fn], draw_core_1bpp
.done:
add esi, ebp ; + line offset
mov [img_buf_line_size], esi
pop esi
jmp _putimage ;<<< sys_putimage_bpp
pop eax
jmp sys_putimage_bpp
.exit:
ret
 
align 4
img_core_proc_0 dd draw_core_1bpp
img_core_proc_0 dd draw_core_0bpp
img_core_proc_1 dd draw_core_8bpp
img_core_proc_2 dd draw_core_16bpp
img_core_proc_3 dd draw_core_24bpp
img_core_proc_4 dd draw_core_32bpp
 
img_edge_proc_0 dd draw_edge_1bpp
img_edge_proc_0 dd draw_edge_0bpp
img_edge_proc_1 dd draw_edge_8bpp
img_edge_proc_2 dd draw_edge_16bpp
img_edge_proc_3 dd draw_edge_24bpp
3414,7 → 3218,7
.forced:
inc [mouse_pause]
; dbv20:
call vesa20_drawbar
call _drawbar
dec [mouse_pause]
jmp [draw_pointer]
 
3517,27 → 3321,25
ret
 
 
setmouse: ; set mousepicture -pointer
;setmouse: ; set mousepicture -pointer
; ps2 mouse enable
 
mov [MOUSE_PICTURE],dword mousepointer
; mov [MOUSE_PICTURE],dword mousepointer
; cli
; ret
 
cli
;if used _rdtsc
;_rdtsc:
; bt [cpu_caps], CAPS_TSC
; jnc ret_rdtsc
; rdtsc
; ret
; ret_rdtsc:
; mov edx,0xffffffff
; mov eax,0xffffffff
; ret
;end if
 
ret
 
if used _rdtsc
_rdtsc:
bt [cpu_caps], CAPS_TSC
jnc ret_rdtsc
rdtsc
ret
ret_rdtsc:
mov edx,0xffffffff
mov eax,0xffffffff
ret
end if
 
rerouteirqs:
 
cli
3667,24 → 3469,6
cmp eax, 1
jne .smbl1
 
if defined debug_com_base
 
push dx ax
 
@@: ; Wait for empty transmit register (yes, this slows down system..)
mov dx, debug_com_base+5
in al, dx
test al, 1 shl 5
jz @r
 
mov dx, debug_com_base ; Output the byte
mov al, bl
out dx, al
 
pop ax dx
 
end if
 
mov [msg_board_data+ecx],bl
inc ecx
and ecx, 4095
3875,16 → 3659,9
mov eax, ebx
mov ebx, ecx
mov ecx, edx
mov edx, [TASK_BASE]
add eax, [edx-twdw+WDATA.box.left]
add ebx, [edx-twdw+WDATA.box.top]
mov edi, [current_slot]
add eax, [edi+APPDATA.wnd_clientbox.left]
add ebx, [edi+APPDATA.wnd_clientbox.top]
xor edi, edi ; no force
; mov edi, 1
call [_display.disable_mouse]
jmp [putpixel]
; call [_display.disable_mouse]
jmp __sys_putpixel
 
align 4
 
3966,7 → 3743,7
div ecx
mov ebx, edx
xchg eax, ebx
call dword [GETPIXEL] ; eax - x, ebx - y
call get_pixel ; eax - x, ebx - y
mov [esp + 32], ecx
ret
 
4028,7 → 3805,7
push eax ebx ecx
add eax,ecx
 
call dword [GETPIXEL] ; eax - x, ebx - y
call get_pixel ; eax - x, ebx - y
 
mov [ebp],cx
shr ecx,16
4187,8 → 3964,7
stdcall kernel_free, [_WinMapAddress]
 
mov eax, [_display.width]
shr eax, 1
shr eax, 1
shr eax, 2
mov [_WinMapWidth], eax
mov eax, [_display.height]
shr eax, 1
4528,3 → 4304,28
uglobals_size = $ - endofcode
diff16 "Zero-filled blk",0,endofcode
diff16 "End of kernel ",0,$
 
;Êóðãèíÿí - ìàòåìàòèê, è îñíîâíûå ñâîè âûâîäû äåëàåò íà îñíîâå òåîðèè êàòàñòðîô (åñòü òàêàÿ âïîëíå ñåáå ïðèêëàäíàÿ îáëàñòü ìàòåìàòèêè) ñ ýëåìåíòàìè âàðèàöèîííîãî è ôàêòîðíîãî àíàëèçà.  ïðèíöèïå, îí ìîã áû èçëîæèòü ñóòü â 3-4 ñóõèõ ôîðìóëàõ, íî òîëüêî ïîíÿòü èõ ìîãëè (è çàõîòåëè) áû ÷åëîâåê 200-300...
 
;Âîò è ïðèõîäèòñÿ åìó èçëàãàòü òî æå ñàìîå, íî ãîðàçäî äëèííåå è äîõîä÷èâåå. Ëè÷íî ÿ íå ïîëåíèëñÿ è ïðî÷èòàë öèêë "Êðèçèñ è äðóãèå" â àðõèâå "Çàâòðà" çà 2009 ãîä.
 
 
;Âîò î÷åíü êðàòêàÿ âûæèìêà åãî îñíîâíûõ èäåé (ñ ìîåé êîëîêîëüíè, êîíå÷íî):
 
;1) Ïëàíåòà ïåðåíàñåëåíà, ðåñóðñîâ íà âñåõ íå õâàòèò, ïåðèîä ëèáåðàëüíåíêîé ãëîáàëèçàöèè äîëæåí ñìåíèòüñÿ ýðîé æåñòêîãî ðàöèîíèðîâàíèÿ ïðè òîòàëüíîì êîíòðîëå âñåãî.
 
;2) Ó ãðÿäóùåãî òîòàëèòàðíîãî îáùåñòâà äîëæíà áûòü ãîñïîäñòâóþùàÿ èäåîëîãèÿ, ìîáèëèçóþùàÿ ëþäåé â ñóðîâîé áîðüáå. Êàêîé åé áûòü? äëÿ ýòîãî íàäî îòâåòèòü íà äâà îñíîâíûõ âîïðîñà: à) ìîæíî ëè ñäåëàòü ÷åëîâåêà ëó÷øå, ñèëüíåå, óìíåå? è á) ìîæíî ëè ñäåëàòü îáùåñòâî ëó÷øå, ñïðàâåäëèâåå, ñâîáîäíåå?
 
;3) ñóùåñòâóåò 4 âîçìîæíûõ îòâåòà íà ýòè 2 âîïðîñà: (à+á+) èñòîðè÷åñêèé ìîäåðí, îí æå êîììóíèçì; (à+á-) àíòèèñòîðè÷åñêèé ìîäåðí, èëè ôàøèçì; (à-á+) ðåëèãèîçíûé ôóíäàìåíòàëèçì, èëè Êîíòðìîäåðí; è íàêîíåö (à-á-) öèíè÷íûé àíòèãóìàíèçì, îí æå Ïîñòìîäåðí.
 
;4) êðóøåíèå êîììóíèñòè÷åñêîãî ïðîåêòà â XX âåêå áûëî òùàòåëüíî ñïëàíèðîâàííîé êàòàñòðîôîé ñ öåëüþ ïîâîðîòà ÷åëîâå÷åñòâà ñ ìîäåðíèñòñêîãî ïóòè ðàçâèòèÿ íà ïîñòìîäåðíèñòñêèé ïóòü ðàñïàäà. Êóðãèíÿí çäåñü èìååò â âèäó êàòàñòðîôó â ìàòåìàòè÷åñêîì ñìûñëå, ò.å. íå êàêîå-òî ïå÷àëüíîå ñîáûòèå, à ïðîöåññ, ïðèâîäÿùèé ê òàêîìó ñîáûòèþ. ß íå õî÷ó ïåðåñêàçûâàòü çäåñü âñå ïîëîæåíèÿ òåîðèè êàòàñòðîô - âàæíî òîëüêî ïîíèìàòü, ÷òî òàêîé ïðîöåññ âîâñå íå îáÿçàòåëüíî äîëæåí ïðèâîäèòü ê ôàòàëüíîìó èñõîäó - âûõîä èç êàòàñòðîôû âñåãäà ìîæíî íàéòè, âïëîòü äî ñàìîãî ïîñëåäíåãî ìîìåíòà!
 
;5) êàòèòüñÿ ïî ýòîìó êàòàñòðîôè÷åñêîìó ïóòè ëåãêî, íî íàéòè âûõîä èç êàòàñòðîôû ñ êàæäûì øàãîì âñå ñëîæíåå. ×òîáû èçáåæàòü ôàòàëüíîãî êîíöà, îäíîé ýíåðãèè ìàëî - òðåáóåòñÿ èçðÿäíàÿ ñèëà âîëè.
 
;6) çäåñü Êóðãèíÿí ïîäêëþ÷àåò äðóãîé ìàòåìàòè÷åñêèé àïïàðàò - òåîðèþ èãð. È ïîêàçûâàåò, êàê øóëåðà - ìàãèñòðû ñëîæíîé êîàëèöèîííî-àíòàãîíèñòè÷åñêîé èãðû óìåþò öåëåíàïðàâëåííî è ýôôåêòèâíî ëèøàòü ïðîòèâíèêîâ âîëè è ñìûñëîâ äëÿ ïîèñêà âûõîäà èç êàòàñòðîôû.
 
;7) êîíå÷íî, ÷åëîâå÷åñêîå îáùåñòâî - ñëîæíåéøàÿ ñèñòåìà ñ íåïðåäñêàçóåìûì îòêëèêîì íà àêòèíûå äåéñòâèÿ êàæäîãî èç èãðîêîâ. Äàæå îïûòíåéøèé øóëåð ìîæåò çäåñü ñäåëàòü íåâåðíûå õîäû. Íî â ðàñïîðÿæåíèè ìàñòåðîâ èãðû èìååòñÿ åùå îäèí ìîùíûé àïïàðàò - ôàêòîðíûé àíàëèç, ïîçâîëÿþùèé ýôôåêòèâíî êîððåêòèðîâàòü ïðîìàõè è ëó÷øå ïðåäñêàçûâòü ïîâåäåíèå ñëîæíûõ ñèñòåì.
 
;8) è òåì íå ìåíåå, âûõîä åñòü! Äëÿ íà÷àëà, íàäî ðåàëüíî îñîçíàòü ñâîþ ïîçèöèþ â èãðå è íàâÿçàòü ñâîþ, àêòèâíóþ èãðó (êàæäûé íîâûé àêòèâíûé èãðîê óñëîæíÿåò ïàðòíåðàì àíàëèç èãðû). Ýòî ñëîæíî (ïðîùå áûòü áîëâàíîì), è ýòî òðåáóåò Âîëè è âîññîçäàíèÿ Ñìûñëîâ.
 
;9) äàæå ñàìàÿ àêòèâíàÿ èãðà áóäåò ïðîñòûì áàðàõòàíüåì, åñëè íå ñòàâèòñÿ êîíå÷íàÿ öåëü. Òàêàÿ öåëü åñòü. Òî÷íåå - áûëà: ïðîåêò (à+á+). Åñëè åå âîññòàíîâèòü, ìû íå ïðîñòî âåðíåìñÿ ê àêòèâíîé èãðå - ìû ìîæåì ñôîðìèðîâàòü ìîùíóþ êîàëèöèþ àíòèïîñòìîäåðíèñòîâ.