DSP 2 support

This commit is contained in:
pagefault
2004-05-01 03:00:47 +00:00
parent 56fc24dbdf
commit ed231e1176

View File

@@ -15,10 +15,586 @@
;along with this program; if not, write to the Free Software
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; Apr 29, 2004
; DSP2 support code written by kentaro-k.21 <danmasu-lj@infoseek.jp>
; coding hints are based on DSP2 function overview at http://users.tpg.com.au/trauma/dsp/dsp2.html maintained by Overload.
; i have stolen the useful technical info there to implement DSP2 codes without any permission from its author.
; i do NOT know and peep the s9x source codes for either DSP2 or any purpose.
%include "macros.mac"
EXTSYM regaccessbankr8,regaccessbankr16,regaccessbankw8,regaccessbankw16
NEWSYM Dsp2ProcAsmStart
;%define _USE_DEVDSP2
;*******************************************************
; .bss section
;*******************************************************
SECTION .bss
NEWSYM dsp2buffer, resb 256
NEWSYM dsp2enforcerQueue, resb 8*512
NEWSYM dsp2enforcer, resb 8
;*******************************************************
; .data section
;*******************************************************
SECTION .data
NEWSYM dsp2f03KeyLo, db 0 ; Current transparent-color in lower-byte
NEWSYM dsp2f03KeyHi, db 0 ; Current transparent-color in higher-byte
NEWSYM dsp2enforcerReaderCursor, dd 0 ; T/O
NEWSYM dsp2enforcerWriterCursor, dd 1 ; T/O
NEWSYM dsp2state, dd 1 ; Flags: 1=HALT, 2=AUTO_BUFFER_SHIFT
NEWSYM dsp2input, dd 0 ; Saving input 8-bit data
NEWSYM dsp2inputTemp, dd 0 ; Temporary variable
NEWSYM dsp2f0dSizeOrg, dd 0 ; Command 0D, Original BMP width
NEWSYM dsp2f0dSizeNew, dd 0 ; Command 0D, New BMP width
NEWSYM dsp2f01TblByte ; Conversion table for Command 01
db 0, 1,16,17, 0, 1,16,17
db 0, 1,16,17, 0, 1,16,17
db 0, 1,16,17, 0, 1,16,17
db 0, 1,16,17, 0, 1,16,17
db 2, 3,18,19, 2, 3,18,19
db 2, 3,18,19, 2, 3,18,19
db 2, 3,18,19, 2, 3,18,19
db 2, 3,18,19, 2, 3,18,19
db 4, 5,20,21, 4, 5,20,21
db 4, 5,20,21, 4, 5,20,21
db 4, 5,20,21, 4, 5,20,21
db 4, 5,20,21, 4, 5,20,21
db 6, 7,22,23, 6, 7,22,23
db 6, 7,22,23, 6, 7,22,23
db 6, 7,22,23, 6, 7,22,23
db 6, 7,22,23, 6, 7,22,23
db 8, 9,24,25, 8, 9,24,25
db 8, 9,24,25, 8, 9,24,25
db 8, 9,24,25, 8, 9,24,25
db 8, 9,24,25, 8, 9,24,25
db 10,11,26,27,10,11,26,27
db 10,11,26,27,10,11,26,27
db 10,11,26,27,10,11,26,27
db 10,11,26,27,10,11,26,27
db 12,13,28,29,12,13,28,29
db 12,13,28,29,12,13,28,29
db 12,13,28,29,12,13,28,29
db 12,13,28,29,12,13,28,29
db 14,15,30,31,14,15,30,31
db 14,15,30,31,14,15,30,31
db 14,15,30,31,14,15,30,31
db 14,15,30,31,14,15,30,31
NEWSYM dsp2f01TblBitMask ; Conversion table for Command 01
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
db 64, 64, 64, 64,128,128,128,128
db 16, 16, 16, 16, 32, 32, 32, 32
db 4, 4, 4, 4, 8, 8, 8, 8
db 1, 1, 1, 1, 2, 2, 2, 2
;*******************************************************
; .text section
;*******************************************************
SECTION .text
;*******************************************************
;
;*******************************************************
%macro CommandJmp 2
cmp al,%1
je %2
%endmacro
%macro DevWriteX 1
%ifdef _USE_DEV
pushad
mov dword[_DSP2Dev_arg],%1
call _DevWriteX
popad
%endif
%endmacro
%macro EnterInsideCommand 1
DevWriteX %1
%endmacro
%macro QueueInsideCommand 1
DevWriteX %1+0ffff0000h
%endmacro
%macro LeaveInsideCommand 0
%ifdef _USE_DEV
pushad
call _Leave
popad
%endif
%endmacro
;*******************************************************
;
;*******************************************************
NEWSYM InitDSP2
.enter
mov dword[dsp2state],0
mov dword[dsp2enforcerQueue+8*0+0],0
mov dword[dsp2enforcerQueue+8*0+4],8000h
mov dword[dsp2enforcerReaderCursor],0
mov dword[dsp2enforcerWriterCursor],1
.leave
ret
;*******************************************************
;
;*******************************************************
NEWSYM DSP2Read8b
.enter
test byte[dsp2state],1
jnz .halt
test cx,8000h
jz .undef
test cx,7000h
jnz .undef
and ecx,255
mov al,byte[dsp2buffer+ecx]
xor ecx,ecx
test byte[dsp2state],2
jnz .shiftbuffer
jmp .leave
.shiftbuffer
sar dword[dsp2buffer],8
jmp .leave
.halt
.undef
xor eax,eax
.leave
ret
NEWSYM DSP2Read16b
.enter
xor eax,eax
.leave
ret
;*******************************************************
;
;*******************************************************
NEWSYM _DSP2Add2Queue
.enter
push eax
push ebx
; *** Locates the write cursor
mov eax,[dsp2enforcerWriterCursor]
lea ebx,[dsp2enforcerQueue+eax*8]
inc eax
and eax,511
mov [dsp2enforcerWriterCursor],eax
; *** Copies the local inside command into his queue
mov eax,[dsp2enforcer]
mov [ebx],eax
mov eax,[dsp2enforcer+4]
mov [ebx+4],eax
pop ebx
pop eax
.leave
ret
NEWSYM DSP2Write8b
.enter
; Tests halt flag
test byte[dsp2state],1
jnz .halt
and byte[dsp2state],255-2
; *** Locates current predicator store
mov byte[dsp2input],al
mov eax,[dsp2enforcerReaderCursor]
lea ebx,[dsp2enforcerQueue+8*eax]
; *** Copies inside command box into box in order to spare indirection cost
mov eax,[ebx]
mov [dsp2enforcer],eax
mov eax,[ebx+4]
mov [dsp2enforcer+4],eax
xor ebx,ebx
; *** Tests whether cx points expected address
cmp [dsp2enforcer+4],cx
jne .gohalt
; *** Reads next inside command should be proceeded
mov al,[dsp2enforcer]
; *** Branches to inside commands respectively
CommandJmp 00h,.w00
CommandJmp 01h,.w01
CommandJmp 02h,.w02
CommandJmp 03h,.w03
CommandJmp 04h,.w04
CommandJmp 05h,.w05
CommandJmp 06h,.w06
CommandJmp 07h,.w07
CommandJmp 08h,.w08
CommandJmp 09h,.w09
CommandJmp 0Ah,.w0A
CommandJmp 0Bh,.w0B
jmp .gohalt
.w0B ; ---
EnterInsideCommand 0Bh
mov al,[dsp2input]
xor ecx,ecx
mov cl,[dsp2enforcer+1]
mov [dsp2buffer+ecx],al
jmp .done
.w0A ; ---
EnterInsideCommand 0Ah
mov al,[dsp2input]
sar al,1
mov byte[dsp2f0dSizeNew],al
test al,al
jz .gohalt
xor ecx,ecx
xor eax,eax
mov bl,[dsp2f0dSizeNew]
mov bh,[dsp2f0dSizeOrg]
.w0Aploop
mov al,cl
mul bl
div bh
mov dword[dsp2enforcer+0],0Bh
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+1],al
mov [dsp2enforcer+4],cl
call _DSP2Add2Queue
inc cl
cmp cl,[dsp2f0dSizeOrg]
jne .w0Aploop
xor ebx,ebx
jmp .queueincoming
.w09 ; ---
EnterInsideCommand 9
mov al,[dsp2input]
sar al,1
mov byte[dsp2f0dSizeOrg],al
test al,al
jz .gohalt
mov dword[dsp2enforcer+0],0Ah
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .done
.w08 ; ---
EnterInsideCommand 8
xor eax,eax
mov al,[dsp2enforcer+1]
mov cl,[dsp2input]
mov [dsp2buffer+eax],cl
cmp al,3
jne .w08done
mov al,[dsp2buffer]
mul byte[dsp2buffer+2]
mov [dsp2buffer],eax
or byte[dsp2state],2
.w08done
jmp .done
.w07 ; ---
EnterInsideCommand 7
mov cl,[dsp2input]
rol cl,4
xor eax,eax
mov al,[dsp2enforcer+1]
mov byte[dsp2buffer+eax],cl
jmp .done
.w06 ; ---
EnterInsideCommand 6
cmp byte[dsp2input],0
je .gohalt
xor eax,eax
xor ecx,ecx
mov cl,[dsp2input]
.w06ploop
dec cl
mov dword[dsp2enforcer+0],7
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+1],cl
mov [dsp2enforcer+4],al
call _DSP2Add2Queue
inc al
test cl,cl
jnz .w06ploop
jmp .queueincoming
.w05 ; ---
EnterInsideCommand 5
xor eax,eax
mov al,[dsp2enforcer+4]
mov cl,[dsp2buffer+eax]
mov ch,[dsp2input]
and ch,0f0h
cmp ch,[dsp2f03KeyHi]
je .w05pnohi
and cl,0fh
or cl,ch
.w05pnohi
mov ch,[dsp2input]
and ch,0fh
cmp ch,[dsp2f03KeyLo]
je .w05pnolo
and cl,0f0h
or cl,ch
.w05pnolo
mov [dsp2buffer+eax],cl
jmp .done
.w04 ; ---
EnterInsideCommand 4
xor eax,eax
mov al,[dsp2enforcer+4]
mov cl,[dsp2input]
mov [dsp2buffer+eax],cl
xor ecx,ecx
jmp .done
.w03 ; ---
EnterInsideCommand 3
cmp byte[dsp2input],0
je .gohalt
xor eax,eax
.w03aloop
mov dword[dsp2enforcer+0],4
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+4],al
call _DSP2Add2Queue
inc al
cmp al,[dsp2input]
jne .w03aloop
xor eax,eax
.w03bloop
mov dword[dsp2enforcer+0],5
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+4],al
call _DSP2Add2Queue
inc al
cmp al,[dsp2input]
jne .w03bloop
xor ecx,ecx
jmp .queueincoming
.w02 ; ---
EnterInsideCommand 2
mov al,[dsp2input]
and al,0fh
mov [dsp2f03KeyLo],al
sal al,4
mov [dsp2f03KeyHi],al
jmp .done
.w01 ; ---
EnterInsideCommand 1
xor ecx,ecx
mov cl,[dsp2enforcer+4]
sal ecx,3
mov al,[dsp2input]
mov [dsp2inputTemp],al
xor ebx,ebx
.w01ploop
mov bl,[dsp2f01TblByte+ecx]
mov al,[dsp2f01TblBitMask+ecx]
test byte[dsp2inputTemp],1h
jz .w01pclear
or [dsp2buffer+ebx],al
jmp .w01pok
.w01pclear
not al
and [dsp2buffer+ebx],al
.w01pok
sar byte[dsp2inputTemp],1
inc ecx
test cl,7
jnz .w01ploop
xor ebx,ebx
xor ecx,ecx
jmp .done
.w00 ; ---
EnterInsideCommand 0
mov al,[dsp2input]
CommandJmp 01h,.w00p01
CommandJmp 03h,.w00p03
CommandJmp 05h,.w00p05
CommandJmp 06h,.w00p06
CommandJmp 09h,.w00p09
CommandJmp 0Dh,.w00p0D
CommandJmp 0Fh,.w00p0F
jmp .gohalt
.w00p0D ; ----
QueueInsideCommand 0Dh
mov dword[dsp2enforcer+0],9
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .done
.w00p09 ; ----
QueueInsideCommand 09h
xor eax,eax
mov al,4
.w00p09loop
mov dword[dsp2enforcer+0],8
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+1],ah
call _DSP2Add2Queue
inc ah
dec al
jnz .w00p09loop
jmp .queueincoming
.w00p06 ; ----
QueueInsideCommand 06h
mov dword[dsp2enforcer+0],6
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .done
.w00p05 ; ----
QueueInsideCommand 05h
mov dword[dsp2enforcer+0],3
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .done
.w00p03 ; ----
QueueInsideCommand 03h
mov dword[dsp2enforcer+0],2
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .queueincoming
.w00p01 ; ----
QueueInsideCommand 01h
xor eax,eax
.w00p01loop
mov dword[dsp2enforcer+0],1
mov dword[dsp2enforcer+4],8000h
mov [dsp2enforcer+4],al
call _DSP2Add2Queue
inc al
cmp al,32
jne .w00p01loop
xor ecx,ecx
jmp .queueincoming
.w00p0F ; ----
QueueInsideCommand 0Fh
.queueincoming
mov dword[dsp2enforcer+0],0
mov dword[dsp2enforcer+4],8000h
call _DSP2Add2Queue
jmp .done
.done
LeaveInsideCommand
mov eax,[dsp2enforcerReaderCursor]
inc eax
and eax,511
mov [dsp2enforcerReaderCursor],eax
xor eax,eax
jmp .leave
.gohalt
QueueInsideCommand 0ffh
or byte[dsp2state],1
.halt
xor eax,eax
.leave
ret
NEWSYM DSP2Write16b
.enter
xor eax,eax
.leave
ret
NEWSYM Dsp2ProcAsmEnd