IDEAL MODEL TPASCAL DATASEG EXTRN ExtraKey : BYTE CODESEG ; These routines are Copyright 1991 by Reuben Sumner. ; This file is the assembly source code to routines found in FakeCrt.Pas ; Unlike the provided Crt unit in Turbo Pascal these routines are fully ; redirectable (except where noted) and in some cases more reliable ; As well there is no wasteful startup code assosociated with this unit PROC Sound FAR Hz : WORD ; Procedure Sound (Hz : Word); ; These procedure are almost identical to those in the Crt unit and are ; only provided for compatibility (I was having fun OK!). These interface ; directly with the hardware and are thus not redirectable FreqDiv = 1193180 PUBLIC Sound mov bx,[Hz] ; Load BX with frequency mov ax,34DCh mov dx,0012h ; Load DX:AX with frequency divisor cmp bx,dx ; Check for a divide overflow jle Done div bx ; Perform division mov bx,ax ; Save result in al,61h ; Read Programmable Peripheral Interface (PPI) test al,11b ; Make sure speaker is enabled jnz SetFrequency ; If it is don't waste our time or al,11b out 61h,al ; Send out new value with speaker enabled mov al,0B6h out 43h,al ; Get timer ready SetFrequency: mov al,bl ; Get saved value from BX out 42h,al mov al,bh out 42h,al ; Write out the high and low order bytes Done: ret ; We're outta here! ENDP Sound PROC NoSound FAR ; Procedure NoSound; PUBLIC NoSound in al,61h ; Read PPI setting and al,(not 0011b) out 61h,al ; Disable speaker ret ENDP NoSound PROC ReadKey FAR ; Function ReadKey : Char; ; This function is identical in usage to the ReadKey in the Crt unit ; however this one can have its input redirected and supports F11 and F12 PUBLIC ReadKey mov ah,07h ; Unfiltered character input without echo int 21h ret ENDP ReadKey PROC KeyPressed PUBLIC KeyPressed mov ah,0Bh ; Check input status int 21h and al,0FEh ; 0FFh if character waiting covert to Boolean ret ENDP KeyPressed PROC Delay FAR ms : WORD ; Procedure Delay (ms : Word); ; This is a very handy machine independant delay function works well PUBLIC Delay mov ax,[ms] ; Load ms count mov cx,1000 mul cx ; Multiply by 1000 mov cx,dx ; Load into correct registers for int 15h mov dx,ax mov ah,86h ; Delay function int 15h ; Do it! ret ENDP Delay PROC RKey FAR ; Function RKey : Word; ; This function requires a bit of explanation. This function is designed ; as a replacement for ReadKey. Unlike ReadKey it reports a word instead of ; a character. If the low byte of the word is 0 then it is a extended key (F1) ; In that case the high byte contains the regular code reported by the second ; call to ReadKey. This should work with F11 and F12 (unlike ReadKey in the Crt ; unit) on almost all computers PUBLIC RKey mov ax,40h mov es,ax xor ah,ah ; Read keyboard test [BYTE PTR es:96h],10000b; 101 keyboard flag at 40:96 jz NormalKeyboard add ah,10h ; Read Enhanced NormalKeyboard: int 16h ; Call int 16h function 10h or 00h cmp al,0E0h ; hidden E0? jne RKeyDone or ah,ah ; ASCII E0? jz RKeyDone xor al,al RKeyDone: ret ENDP RKey PROC SReadKey ; Function SReadKey : Char; ; Totally compatible with Crt's ReadKey but will use F11 and F12 and is ; not redirectable PUBLIC SReadKey cmp [ExtraKey],0 jnz GiveNextCh mov ax,40h mov es,ax xor ah,ah ; Read keyboard test [BYTE PTR es:96h],10000b; 101 keyboard flag at 40:96 jz SNormalKeyboard add ah,10h ; Read Enhanced SNormalKeyboard: int 16h ; Call int 16h function 10h or 00h cmp al,0E0h jne CheckFor0 or ah,ah jnz ExtendedKey2 CheckFor0: or al,al jz ExtendedKey ret ExtendedKey2: xor al,al ExtendedKey: mov [ExtraKey],ah ret GiveNextCh: mov al,[ExtraKey] mov [ExtraKey],0 ret ENDP SReadKey PROC RKeyPressed FAR ; Function RKeyPressed : Boolean PUBLIC RKeyPressed mov ax,40h mov es,ax mov ah,01h ; Keyboard status test [BYTE PTR es:96h],10000b ; 101 keyboard flag jz NormalKeyboard2 add ah,10h ; Read Enhanced NormalKeyboard2: int 16h ; Call int 16h function 11h or 01h jz NoKeyWaiting ; Zero flag set if no key waiting mov al,1 jmp RKeyPressedX NoKeyWaiting: xor al,al RKeyPressedX: ret ENDP RKeyPressed END