+//Assembly functions\r
+boolean alNoIRQ;\r
+\r
+int count_time=0;\r
+int count_fx=0;\r
+int extreme=0;\r
+\r
+void SDL_turnOnPCSpeaker(word timerval)\r
+{\r
+ __asm {\r
+ mov bx,timerval\r
+ mov al,0b6h\r
+ out 43h,al\r
+ mov al,bl\r
+ out 42h,al\r
+ mov al,bh\r
+ out 42h,al\r
+ in al,61h\r
+ or al,3\r
+ out 61h,al\r
+ }\r
+}\r
+\r
+void SDL_turnOffPCSpeaker()\r
+{\r
+ __asm {\r
+ in al,61h\r
+ and al,0fch\r
+ out 61h,al\r
+ }\r
+}\r
+\r
+void SDL_setPCSpeaker(byte val)\r
+{\r
+ __asm {\r
+ mov al,val\r
+ in al,61h\r
+ and al,0fch\r
+ or al,ah\r
+ out 61h,al\r
+ }\r
+}\r
+\r
+void SDL_DoFX()\r
+{\r
+ if(pcSound)\r
+ {\r
+ if(*pcSound!=pcLastSample)\r
+ {\r
+ pcLastSample=*pcSound;\r
+\r
+ if(pcLastSample)\r
+ SDL_turnOnPCSpeaker(pcLastSample*60);\r
+ else\r
+ SDL_turnOffPCSpeaker();\r
+ }\r
+ pcSound++;\r
+ pcLengthLeft--;\r
+ if(!pcLengthLeft)\r
+ {\r
+ pcSound=0;\r
+ SoundNumber=(soundnames)0;\r
+ SoundPriority=0;\r
+ SDL_turnOffPCSpeaker();\r
+ }\r
+ }\r
+\r
+ if(alSound && !alNoIRQ)\r
+ {\r
+ if(*alSound)\r
+ {\r
+ alOut/*InIRQ*/(alFreqL,*alSound);\r
+ alOut/*InIRQ*/(alFreqH,alBlock);\r
+ }\r
+ else alOut/*InIRQ*/(alFreqH,0);\r
+ alSound++;\r
+ alLengthLeft--;\r
+ if(!alLengthLeft)\r
+ {\r
+ alSound=0;\r
+ SoundNumber=(soundnames)0;\r
+ SoundPriority=0;\r
+ alOut/*InIRQ*/(alFreqH,0);\r
+ }\r
+ }\r
+\r
+}\r
+\r
+void SDL_DoFast()\r
+{\r
+ count_fx++;\r
+ if(count_fx>=5)\r
+ {\r
+ count_fx=0;\r
+\r
+ SDL_DoFX();\r
+\r
+ count_time++;\r
+ if(count_time>=2)\r
+ {\r
+ TimeCount++;\r
+ count_time=0;\r
+ }\r
+ }\r
+\r
+ if(sqActive && !alNoIRQ)\r
+ {\r
+ if(sqHackLen)\r
+ {\r
+ do\r
+ {\r
+ if(sqHackTime>alTimeCount) break;\r
+ sqHackTime=alTimeCount+*(sqHackPtr+1);\r
+ alOut/*InIRQ*/(*(byte *)sqHackPtr,*(((byte *)sqHackPtr)+1));\r
+ sqHackPtr+=2;\r
+ sqHackLen-=4;\r
+ }\r
+ while(sqHackLen);\r
+ }\r
+ alTimeCount++;\r
+ if(!sqHackLen)\r
+ {\r
+ sqHackPtr=sqHack;\r
+ sqHackLen=sqHackSeqLen;\r
+ alTimeCount=0;\r
+ sqHackTime=0;\r
+ }\r
+ }\r
+\r
+//SS if(ssSample)\r
+//SS {\r
+//SS if(!(inp(ssStatus)&0x40))\r
+//SS {\r
+//SS outp(ssData,*ssSample++);\r
+//SS outp(ssControl,ssOff);\r
+//SS __asm push ax\r
+//SS __asm pop ax\r
+//SS outp(ssControl,ssOn);\r
+//SS __asm push ax\r
+//SS __asm pop ax\r
+//SS ssLengthLeft--;\r
+//SS if(!ssLengthLeft)\r
+//SS {\r
+//SS ssSample=0;\r
+//SS SDL_DigitizedDoneInIRQ();\r
+//SS }\r
+//SS }\r
+//SS }\r
+\r
+ TimerCount+=TimerDivisor;\r
+ if(*((word *)&TimerCount+1))\r
+ {\r
+ *((word *)&TimerCount+1)=0;\r
+ t0OldService();\r
+ }\r
+ else\r
+ {\r
+ outp(0x20,0x20);\r
+ }\r
+}\r
+\r
+// Timer 0 ISR for 700Hz interrupts\r
+void interrupt SDL_t0FastAsmService(void)\r
+{\r
+ SDL_DoFast();\r
+}\r
+\r
+// Timer 0 ISR for 140Hz interrupts\r
+void interrupt SDL_t0SlowAsmService(void)\r
+{\r
+ count_time++;\r
+ if(count_time>=2)\r
+ {\r
+ TimeCount++;\r
+ count_time=0;\r
+ }\r
+\r
+ SDL_DoFX();\r
+\r
+ TimerCount+=TimerDivisor;\r
+ if(*((word *)&TimerCount+1))\r
+ {\r
+ *((word *)&TimerCount+1)=0;\r
+ t0OldService();\r
+ }\r
+ else\r
+ outp(0x20,0x20);\r
+}\r
+\r
+\r