APU mmio area: hack-ready

git-svn-id: svn://kolibrios.org@3519 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Artem Jerdev (art_zh) 2013-05-17 17:17:20 +00:00
parent a0f9d2e236
commit bcdfe175d7
11 changed files with 77 additions and 287 deletions

View File

@ -62,10 +62,6 @@ cfgmanager:
; mov [es:0x901C], al ; mov [es:0x901C], al
; VRR_M USE
; mov [es:0x9030], byte 2
; BOOT DEVICE ; BOOT DEVICE
xor ax, ax xor ax, ax

View File

@ -145,7 +145,7 @@ rs7xx_pcie_init:
; (eax = phys. address of PCIe conf.space) ; (eax = phys. address of PCIe conf.space)
; ;
map_pcie_pages: map_pcie_pages:
or eax, (PG_NOCACHE + PG_SHARED + PG_LARGE + PG_UW) ; UW is unsafe, fix it! or eax, (PG_NOCACHE + PG_SHARED + PG_LARGE + PG_UW) ; UW is unsafe!
mov ecx, PCIe_CONFIG_SPACE ; linear address mov ecx, PCIe_CONFIG_SPACE ; linear address
mov ebx, ecx mov ebx, ecx
shr ebx, 20 shr ebx, 20
@ -163,13 +163,9 @@ map_pcie_pages:
add eax, 0x400000 ; +4M phys. add eax, 0x400000 ; +4M phys.
add ecx, 0x400000 ; +4M lin. add ecx, 0x400000 ; +4M lin.
cmp dl, byte[mmio_pcie_cfg_pdes-OS_BASE] cmp dl, byte[mmio_pcie_cfg_pdes-OS_BASE]
jae .pcie_cfg_mapped jae pcie_cfg_mapped
inc dl inc dl
jmp .write_pde jmp .write_pde
; mov eax, cr3
; mov cr3, eax ; flush TLB
.pcie_cfg_mapped:
ret ; <<< OK >>>
; ---- stepping 10h CPUs and Fusion APUs: the configspace is stored in MSR_C001_0058 ---- ; ---- stepping 10h CPUs and Fusion APUs: the configspace is stored in MSR_C001_0058 ----
align 4 align 4
@ -196,7 +192,25 @@ fusion_pcie_init:
add edx, eax ; the upper configspace limit add edx, eax ; the upper configspace limit
mov dword[mmio_pcie_cfg_lim-OS_BASE], edx mov dword[mmio_pcie_cfg_lim-OS_BASE], edx
jmp map_pcie_pages pcie_cfg_mapped:
create_mmio_pte:
mov ecx, mmio_pte ; physical address
or ecx, (PG_NOCACHE + PG_SHARED)
mov ebx, FUSION_MMIO ; linear address
shr ebx, 20
add ebx, (sys_pgdir - OS_BASE) ; PgDir entry @
mov dword[ebx], ecx ; Fusion MMIO tables
map_apic_mmio:
mov ecx, 0x01B ; APIC BAR
rdmsr
and eax, 0xFFFFF000 ; physical address
or eax, (PG_NOCACHE + PG_SHARED + PG_UW) ; UW is unsafe!
mov dword[mmio_pte + 0], eax
ret ; <<< OK >>>
; ================================================================================ ; ================================================================================

View File

@ -206,6 +206,8 @@ PUTPIXEL equ (OS_BASE+0x0006820)
GETPIXEL equ (OS_BASE+0x0006824) GETPIXEL equ (OS_BASE+0x0006824)
mouseunder equ (OS_BASE+0x0006900) mouseunder equ (OS_BASE+0x0006900)
IDE_DMA equ 0x0007000
MOUSE_VISIBLE equ (OS_BASE+0x000F204) MOUSE_VISIBLE equ (OS_BASE+0x000F204)
@ -266,19 +268,18 @@ MOUSE_BACKGROUND equ (OS_BASE+0x000FFF4)
DONT_DRAW_MOUSE equ (OS_BASE+0x000FFF5) DONT_DRAW_MOUSE equ (OS_BASE+0x000FFF5)
DONT_SWITCH equ (OS_BASE+0x000FFFF) DONT_SWITCH equ (OS_BASE+0x000FFFF)
TMP_STACK_TOP equ 0x006CC00 FONT_II equ (OS_BASE+0x005DC00)
FONT_I equ (OS_BASE+0x005E600)
FONT_II equ (OS_BASE+0x006DC00) TMP_STACK_TOP equ 0x006C000
FONT_I equ (OS_BASE+0x006E600)
mmio_pte equ 0x006E000
sys_pgdir equ (OS_BASE+0x006F000) sys_pgdir equ (OS_BASE+0x006F000)
DRIVE_DATA equ (OS_BASE+0x0070000) DRIVE_DATA equ (OS_BASE+0x0070000)
SLOT_BASE equ (OS_BASE+0x0080000) SLOT_BASE equ (OS_BASE+0x0080000)
;unused
;TMP_BUFF equ (OS_BASE+0x0090000)
;VGABasePtr equ (OS_BASE+0x00A0000) ;VGABasePtr equ (OS_BASE+0x00A0000)
@ -286,25 +287,18 @@ RAMDISK equ (OS_BASE+0x0100000)
RAMDISK_FAT equ (OS_BASE+0x0280000) RAMDISK_FAT equ (OS_BASE+0x0280000)
CLEAN_ZONE equ 0x280000 CLEAN_ZONE equ 0x280000
IDE_DMA equ 0x284000
BgrAuxTable equ (OS_BASE+0x0298000)
; unused?
SB16Buffer equ (OS_BASE+0x02A0000)
SB16_Status equ (OS_BASE+0x02B0000)
BUTTON_INFO equ (OS_BASE+0x02C0000) BUTTON_INFO equ (OS_BASE+0x02C0000)
RESERVED_PORTS equ (OS_BASE+0x02D0000) RESERVED_PORTS equ (OS_BASE+0x02D0000)
IRQ_SAVE equ (OS_BASE+0x02E0000) IRQ_SAVE equ (OS_BASE+0x02E0000)
;BOOT_VAR equ (OS_BASE+0x02F0000)
stack_data_start equ (OS_BASE+0x0300000) stack_data_start equ (OS_BASE+0x0300000)
eth_data_start equ (OS_BASE+0x0300000) eth_data_start equ (OS_BASE+0x0300000)
stack_data equ (OS_BASE+0x0304000) stack_data equ (OS_BASE+0x0304000)
stack_data_end equ (OS_BASE+0x031ffff) stack_data_end equ (OS_BASE+0x031ffff)
resendQ equ (OS_BASE+0x0320000) resendQ equ (OS_BASE+0x0320000)
;VMODE_BASE equ (OS_BASE+0x0328000) BgrAuxTable equ (OS_BASE+0x0328000)
skin_data equ (OS_BASE+0x0330000) skin_data equ (OS_BASE+0x0330000)
draw_data equ (OS_BASE+0x0338000); draw_data equ (OS_BASE+0x0338000);
@ -327,6 +321,8 @@ HEAP_MIN_SIZE equ 0x02000000
PCIe_CONFIG_SPACE equ 0xF0000000 PCIe_CONFIG_SPACE equ 0xF0000000
USER_DMA_BUFFER equ 0xFD000000 ; linear addr. USER_DMA_BUFFER equ 0xFD000000 ; linear addr.
USER_DMA_SIZE equ 0x00800000 USER_DMA_SIZE equ 0x00800000
FUSION_MMIO equ 0xFD800000
LAPIC_BAR equ 0xFD800000 ; ==
page_tabs equ 0xFDC00000 page_tabs equ 0xFDC00000
app_page_tabs equ 0xFDC00000 app_page_tabs equ 0xFDC00000

View File

@ -20,7 +20,6 @@ irq0:
mov es, ax mov es, ax
inc [timer_ticks] inc [timer_ticks]
mov eax, [timer_ticks] mov eax, [timer_ticks]
; call playNote ; <<<--- Speaker driver
sub eax,[next_usage_update] sub eax,[next_usage_update]
cmp eax,100 cmp eax,100
jb .nocounter jb .nocounter

View File

@ -105,7 +105,7 @@ char2 db '/sys/FONTS/CHAR2.MT',0
bootpath db '/KOLIBRI ' bootpath db '/KOLIBRI '
bootpath2 db 0 bootpath2 db 0
vmode db '/sys/drivers/VMODE.MDR',0 vmode db '/sys/drivers/VMODE.MDR',0
vrr_m db 'VRR_M',0 ;vrr_m db 'VRR_M',0
kernel_file db 'KERNEL MNT' kernel_file db 'KERNEL MNT'

View File

@ -1,30 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
;***************************************************
; ïðåäâàðèòåëüíàÿ î÷èñòêà îáëàñòè òàáëèöû
; ïîèñê è çàíåñåíèå â òàáëèöó ïðèâîäîâ FDD
; àâòîð Mario79
;***************************************************
xor eax,eax
mov edi,DRIVE_DATA
mov ecx,16384
cld
rep stosd
mov al,0x10
out 0x70,al
mov cx,0xff
wait_cmos:
dec cx
test cx,cx
jnz wait_cmos
in al,0x71
mov [DRIVE_DATA],al

View File

@ -21,25 +21,13 @@ FindHDD:
mov [ChannelNumber],1 mov [ChannelNumber],1
mov [DiskNumber],0 mov [DiskNumber],0
call FindHDD_3 call FindHDD_3
; mov ax,[Sector512+176]
; mov [DRIVE_DATA+6],ax
; mov ax,[Sector512+126]
; mov [DRIVE_DATA+8],ax
; mov ax,[Sector512+128]
; mov [DRIVE_DATA+8],ax
mov [DiskNumber],1 mov [DiskNumber],1
call FindHDD_3 call FindHDD_3
; mov al,[Sector512+176]
; mov [DRIVE_DATA+7],al
inc [ChannelNumber] inc [ChannelNumber]
mov [DiskNumber],0 mov [DiskNumber],0
call FindHDD_3 call FindHDD_3
; mov al,[Sector512+176]
; mov [DRIVE_DATA+8],al
mov [DiskNumber],1 mov [DiskNumber],1
call FindHDD_1 call FindHDD_1
; mov al,[Sector512+176]
; mov [DRIVE_DATA+9],al
jmp EndFindHDD jmp EndFindHDD
@ -57,9 +45,9 @@ FindHDD_1:
call DeviceReset call DeviceReset
cmp [DevErrorCode],0 cmp [DevErrorCode],0
jne FindHDD_2_2 jne FindHDD_2_2
call ReadCD_ID ; call ReadCD_ID
cmp [DevErrorCode],0 ; cmp [DevErrorCode],0
jne FindHDD_2_2 ; jne FindHDD_2_2
inc byte [DRIVE_DATA+1] inc byte [DRIVE_DATA+1]
inc byte [DRIVE_DATA+1] inc byte [DRIVE_DATA+1]
FindHDD_2_2: FindHDD_2_2:
@ -111,8 +99,6 @@ ReadHDD_ID:
test AL,08h ;состояние сигнала DRQ test AL,08h ;состояние сигнала DRQ
jz @@WaitCompleet jz @@WaitCompleet
; Принять блок данных от контроллера ; Принять блок данных от контроллера
; mov AX,DS
; mov ES,AX
mov EDI,Sector512 ;offset Sector512 mov EDI,Sector512 ;offset Sector512
mov DX,[ATABasePortAddr] ;регистр данных mov DX,[ATABasePortAddr] ;регистр данных
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
@ -201,17 +187,10 @@ SendCommandToHDD:
; Ожидать, пока диск не будет готов ; Ожидать, пока диск не будет готов
inc DX inc DX
mov ecx,0xfff mov ecx,0xfff
; mov eax,[timer_ticks]
; mov [TickCounter_1],eax
@@WaitHDReady: @@WaitHDReady:
; Проверить время ожидани ; Проверить время ожидани
dec ecx dec ecx
; cmp ecx,0
jz @@Err1 jz @@Err1
; mov eax,[timer_ticks]
; sub eax,[TickCounter_1]
; cmp eax,300 ;îæèäàòü 300 òèêîâ
; ja @@Err1 ;îøèáêà òàéì-àóòà
; Прочитать регистр состояни ; Прочитать регистр состояни
in AL,DX in AL,DX
; Проверить состояние сигнала BSY ; Проверить состояние сигнала BSY
@ -270,6 +249,7 @@ SendCommandToHDD:
; Завершение работы программы ; Завершение работы программы
ret ret
if 0
;************************************************* ;*************************************************
;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI * ;* ЧТЕНИЕ ИДЕНТИФИКАТОРА УСТРОЙСТВА ATAPI *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *
@ -299,7 +279,6 @@ ReadCD_ID:
@@WaitCompleet_1: @@WaitCompleet_1:
; Проверить врем ; Проверить врем
dec ecx dec ecx
; cmp ecx,0
jz @@Error1_1 ;ошибка тайм-аута jz @@Error1_1 ;ошибка тайм-аута
; Проверить готовность ; Проверить готовность
in AL,DX in AL,DX
@ -310,8 +289,6 @@ ReadCD_ID:
test AL,08h ;состояние сигнала DRQ test AL,08h ;состояние сигнала DRQ
jz @@WaitCompleet_1 jz @@WaitCompleet_1
; Принять блок данных от контроллера ; Принять блок данных от контроллера
; mov AX,DS
; mov ES,AX
mov EDI,Sector512 ;offset Sector512 mov EDI,Sector512 ;offset Sector512
mov DX,[ATABasePortAddr] ;порт 1x0h mov DX,[ATABasePortAddr] ;порт 1x0h
mov CX,256 ;число считываемых слов mov CX,256 ;число считываемых слов
@ -326,6 +303,8 @@ ReadCD_ID:
@@End_1: @@End_1:
ret ret
end if
;************************************************* ;*************************************************
;* СБРОС УСТРОЙСТВА * ;* СБРОС УСТРОЙСТВА *
;* Входные параметры передаются через глобальные * ;* Входные параметры передаются через глобальные *

View File

@ -8,7 +8,7 @@
$Revision$ $Revision$
include 'dev_fd.inc' ;include 'dev_fd.inc'
include 'dev_hdcd.inc' include 'dev_hdcd.inc'
include 'getcache.inc' include 'getcache.inc'
include 'sear_par.inc' include 'sear_par.inc'

View File

@ -508,11 +508,11 @@ high_code:
out 0xA1, al out 0xA1, al
; Enable interrupts in IDE controller ; Enable interrupts in IDE controller
mov al, 0 ; mov al, 0
mov dx, 0x3F6 ; mov dx, 0x3F6
out dx, al ; out dx, al
mov dl, 0x76 ; mov dl, 0x76
out dx, al ; out dx, al
;!!!!!!!!!!!!!!!!!!!!!!!!!! ;!!!!!!!!!!!!!!!!!!!!!!!!!!
include 'detect/disks.inc' include 'detect/disks.inc'
@ -721,7 +721,8 @@ include 'detect/disks.inc'
; LOAD FIRST APPLICATION ; LOAD FIRST APPLICATION
cli cli
if 0
<<<
cmp byte [BOOT_VAR+0x9030],1 cmp byte [BOOT_VAR+0x9030],1
jne no_load_vrr_m jne no_load_vrr_m
@ -732,8 +733,8 @@ include 'detect/disks.inc'
sub eax,2 sub eax,2
jz first_app_found jz first_app_found
no_load_vrr_m: no_load_vrr_m: <<<
end if
mov ebp, firstapp mov ebp, firstapp
call fs_execute_from_sysdir call fs_execute_from_sysdir

View File

@ -70,14 +70,10 @@
; 6000 -> 68FF << free (2k5) ; 6000 -> 68FF << free (2k5)
; 6900 -> 7EFF << saved picture under mouse pointer (1k5) ; 6900 -> 6EFF << saved picture under mouse pointer (1k5)
; ;
; 7F00 -> 7FFF << SB16_Status (256) \\ ; 7000 -> EFFF HDD DMA AREA (32k)
; ;
; 8000 -> 87FF free (2k)
; 0x80008000 -> 9FFF ramdisk fat (8k)
; A000 -> F9FF free (23k)
; FA00 byte no of keys in buffer ; FA00 byte no of keys in buffer
; FA01 byte 'buffer' ; FA01 byte 'buffer'
@ -151,11 +147,13 @@
; -> 3B752 end_of_kernel ; -> 3B752 end_of_kernel
; -> 3C000 not used (>200k) ; -> 3C000 not used (>200k)
; 0x80050000 -> 090000 zero-filled zone after preinit_mem ; 0x80050000 -> 090000 zero-filled zone after preinit_mem
; 0x8006CC00 -> 6DBFF stack at boot time (4Kb) ; 0x8006DC00 -> 5E5FF basic text font II
; 0x8006E600 -> 5Efff basic text font I
; 0x8006C000 -> 6CFFF stack at boot time (4Kb)
; ;
; 0x8006DC00 -> 6E5FF basic text font II ; 0x8006E000 -> 6EFFF MMIO PTE directory (4Kb)
; 0x8006E600 -> 6Efff basic text font I ; 0x8006F000 -> 6FFFF main page directory (4Kb)
; 0x8006F000 -> 6FFFF main page directory
; 0x80070000 -> 7FFFF data of retrieved disks and partitions (Mario79) ; 0x80070000 -> 7FFFF data of retrieved disks and partitions (Mario79)
; 0x80080000 -> 8FFFF additional app info, in 256 byte steps - 256 entries ; 0x80080000 -> 8FFFF additional app info, in 256 byte steps - 256 entries
@ -200,28 +198,16 @@
; BC dword address of debug event memory ; BC dword address of debug event memory
; C0 5 dd thread debug registers: DR0,DR1,DR2,DR3,DR7 ; C0 5 dd thread debug registers: DR0,DR1,DR2,DR3,DR7
; ;
; 0x80090000 -> 9FFFF wav device buffer (64k) ; << SB16Buffer ; 0x80090000 -> 9FFFF free (64k)
; 0x800A0000 -> AFFFF screen access area << VGA legacy buffer ; 0x800A0000 -> AFFFF screen access area << VGA legacy buffer
; 0x800B0000 -> FFFFF bios rest in peace -area (320k), << purpose unknown ; 0x800B0000 -> FFFFF bios rest in peace -area (320k), << purpose unknown
; 0x80100000 -> 283FFF diskette image (1m5) ; 0x80100000 -> 283FFF diskette image (1m5)
; 0x80280000 -> 9FFF ramdisk fat (8k)
; 0x80284000 -> HEAP_BASE zero-filled zone after preinit_mem ; 0x80280000 -> HEAP_BASE zero-filled zone after preinit_mem
; ;
; 0x80284000 -> 28BFFF HDD DMA AREA (32k) ; 0x80280000 -> 2Bffff free (262k)
; 0x8028C000 -> 297FFF free (48k)
;
; 0x80298000 -> 29ffff auxiliary table for background smoothing code (32k)
;
; 0x802A0000 -> 2Bffff free (128k)
; 0x80328000 -> 32FFFF !vrr driver (32k)
; 0x80338000 -> 338FFF draw data - 256 entries (4k)
; 00 dword draw limit - x start
; 04 dword draw limit - y start
; 08 dword draw limit - x end
; 0C dword draw limit - y end
; 0x80339000 -> 3BFFF3 free (12k)
; 0x802C0000 -> 2C3fff button info (8k) ; 0x802C0000 -> 2C3fff button info (8k)
; ;
@ -244,8 +230,20 @@
; dword start port ; dword start port
; dword end port ; dword end port
; dword 0 ; dword 0
; 0x802E0000 -> 2EFFFF irq data area (64k)
; 0x802F0000 -> 327fff free (229k)
; 0x80328000 -> 29ffff auxiliary table for background smoothing code (32k)
;
; 0x80338000 -> 338FFF draw data - 256 entries (4k)
; 00 dword draw limit - x start
; 04 dword draw limit - y start
; 08 dword draw limit - x end
; 0C dword draw limit - y end
; 0x80339000 -> 3BFFF3 free (12k)
; ;
; 0x80370000 -> 37FFFF irq data area (64k)
; 0x80380000 -> 38FFFF low memory save (64k) ; 0x80380000 -> 38FFFF low memory save (64k)
; ;
; 0x80390000 -> 3AFFFF tcp memory (128k) ; 0x80390000 -> 3AFFFF tcp memory (128k)
@ -265,7 +263,10 @@
; 0x80800000 ->827FFFFF kernel heap ; 0x80800000 ->827FFFFF kernel heap
; 0xF0000000 -> 0xF1FFFFFF PCI-express extended config space ; 0xF0000000 -> 0xF1FFFFFF PCI-express extended config space
; 0xFD000000 -> 0xFD3FFFFF static system buffer 4Mb
; 0xFD000000 -> 0xFD7FFFFF static system buffer (8Mb reserved)
; 0xFD800000 -> 0xFBFFFFFF CPU & Southbridge memory-mapped IO (4Mb reserved)
; +0000..0FFF LAPIC BAR (4k)
; 0xFDC00000 -> 0xFDFFFFFF page tables 4Mb ; 0xFDC00000 -> 0xFDFFFFFF page tables 4Mb
; 0xFE000000 -> 0xFFFFFFFF LFB 32Mb ; 0xFE000000 -> 0xFFFFFFFF LFB 32Mb
; 0xFE000000 -> 0xFE7FFFFF application available LFB 8Mb ; 0xFE000000 -> 0xFE7FFFFF application available LFB 8Mb

View File

@ -1,166 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; PLAYNOTE.INC version 1.1 22 November 2003 ;;
;; ;;
;; Player Notes for Speaker PC ;;
;; subfunction #55 from function #55 Menuet OS ;;
;; ;;
;; Copyright 2003 VaStaNi ;;
;; vastani@ukr.net ;;
;; >>>- SIMPLY - QUICKLY - SHORTLY -<<< ;;
;; ;;
;; Note: playnote.txt ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
align 4
sound_interface:
cmp eax,ebx ; this is subfunction #55 ?
jne retFunc55 ; if no then return.
cmp byte [sound_flag],0
jne retFunc55
movzx eax, byte [countDelayNote]
or al, al ; player is busy ?
jnz retFunc55 ; return counter delay Note
mov [memAdrNote],esi;edx
call get_pid
mov [pidProcessNote],eax
xor eax, eax ; Ok! EAX = 0
retFunc55:
mov [esp+32], eax ; return value EAX for application
ret
iglobal
align 4
kontrOctave dw 0x4742, 0x4342, 0x3F7C, 0x3BEC, 0x388F, 0x3562
dw 0x3264, 0x2F8F, 0x2CE4, 0x2A5F, 0x2802, 0x25BF
memAdrNote dd 0
pidProcessNote dd 0
slotProcessNote dd 0
count_timer_Note dd 1
mem8253r42 dw 0
countDelayNote db 0
endg
playNote:
; jmp NotPlayNotes
mov esi, [memAdrNote]
or esi, esi ; ESI = 0 ? - OFF Notes Play ?
jz NotPlayNotes ; if ESI = 0 -> ignore play pocedure
cmp eax, [count_timer_Note]
jb NotPlayNotes
push eax
inc eax
mov [count_timer_Note], eax
mov al, [countDelayNote]
dec al ; decrement counter Delay for Playing Note
jz NewLoadNote@Delay
cmp al, 0xFF ; this is first Note Play ?
jne NextDelayNote
;This is FIRST Note, save counter channel 2 chip 8253
mov al, 0xB6 ; control byte to timer chip 8253
out 0x43, al ; Send it to the control port chip 8253
in al, 0x42 ; Read Lower byte counter channel 2 chip 8253
mov ah, al ; AH = Lower byte counter channel 2
in al, 0x42 ; Read Upper byte counter channel 2 chip 8253
mov [mem8253r42], ax ; Save counter channel 2 timer chip 8253
NewLoadNote@Delay:
cld
; lodsb ; load AL - counter Delay
call ReadNoteByte
or al, al ; THE END ?
jz EndPlayNote
cmp al, 0x81
jnc NoteforOctave
mov [countDelayNote], al
; lodsw ; load AX - counter for Note!
call ReadNoteByte
mov ah,al
call ReadNoteByte
xchg al,ah
jmp pokeNote
EndPlayNote: ; THE END Play Notes!
in al, 0x61 ; Get contents of system port B chip 8255
and al, 0xFC ; Turn OFF timer and speaker
out 0x61, al ; Send out new values to port B chip 8255
mov ax, [mem8253r42] ; memorize counter channel 2 timer chip 8253
xchg al, ah ; reverse byte in word
out 0x42, al ; restore Lower byte counter channel 2
mov al, ah ; AL = Upper byte counter channel 2
out 0x42, al ; restore Upper byte channel 2
xor eax, eax ; EAX = 0
mov [memAdrNote], eax ; clear header control Delay-Note string
NextDelayNote:
mov [countDelayNote], al ; save new counter delay Note
pop eax
NotPlayNotes:
RET
NoteforOctave:
sub al, 0x81 ; correction value for delay Note
mov [countDelayNote], al ; save counter delay this new Note
; lodsb ; load pack control code
call ReadNoteByte
cmp al, 0xFF ; this is PAUSE ?
jne packCode ; no, this is PACK CODE
in al, 0x61 ; Get contents of system port B chip 8255
and al, 0xFC ; Turn OFF timer and speaker
out 0x61, al ; Send out new values to port B chip 8255
jmp saveESI
packCode:
mov cl, al ; save code
and al, 0xF ; clear upper bits
dec al ; correction
add al, al ; transform number to offset constant
movsx eax, al ; EAX - offset
add eax, dword kontrOctave ; EAX - address from constant
mov ax, [eax] ; read constant
shr cl, 4 ; transform for number Octave
shr ax, cl ; calculate from Note this Octave!
pokeNote:
out 0x42, al ; Lower byte Out to channel 2 timer chip 8253
mov al, ah
out 0x42, al ; Upper byte Out to channel 2 timer chip 8253
in al, 0x61 ; Get contents of system port B chip 8255
or al, 3 ; Turn ON timer and speaker
out 0x61, al ; Send out new values to port B chip 8255
saveESI:
; mov [memAdrNote], esi ; save new header control Delay-Note string
pop eax
RET
ReadNoteByte:
;result:
; al - note
push eax
push ecx
push edx
push esi
mov eax,[pidProcessNote]
call pid_to_slot
test eax,eax
jz .failed
lea ecx,[esp+12]
mov edx,1
mov esi,[memAdrNote]
inc [memAdrNote]
call read_process_memory
.failed:
pop esi
pop edx
pop ecx
pop eax
ret
;------------------- END CODE -------------------