summaryrefslogtreecommitdiff
path: root/src/hexen/i_ibm_a.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/hexen/i_ibm_a.asm')
-rw-r--r--src/hexen/i_ibm_a.asm135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/hexen/i_ibm_a.asm b/src/hexen/i_ibm_a.asm
new file mode 100644
index 00000000..8b548b5b
--- /dev/null
+++ b/src/hexen/i_ibm_a.asm
@@ -0,0 +1,135 @@
+ .386
+ .MODEL small
+
+.DATA
+
+
+
+.CODE
+
+IF 0
+#define PEL_WRITE_ADR 0x3c8
+#define PEL_READ_ADR 0x3c7
+#define PEL_DATA 0x3c9
+ENDIF
+
+;================
+;
+; I_DivException
+;
+;================
+
+PROC I_DivException_
+PUBLIC I_DivException_
+ mov edx,03c9h
+ mov al,63
+ out dx,al
+
+ mov ebx,0ffffffh
+ mov eax,[ebx]
+ retf
+ENDP
+
+;================
+;
+; I_SetDivException
+;
+;================
+
+PROC I_SetDivException_
+PUBLIC I_SetDivException_
+ pusha
+
+ mov eax,0212h
+ mov ebx,0
+ mov ecx,cs
+ mov edx,OFFSET I_DivException_
+ int 31h
+ jnc good
+
+ popa
+ mov eax,0
+ ret
+
+good:
+ popa
+ mov eax,1
+ ret
+
+ENDP
+
+
+;================
+;
+; I_ReadJoystick
+;
+; Read the absolute joystick values
+; returns false if not connected
+;================
+
+.data
+
+_joystickx dd 0
+_joysticky dd 0
+PUBLIC _joystickx, _joysticky
+
+.code
+
+PROC I_ReadJoystick_
+PUBLIC I_ReadJoystick_
+ pushad
+ pushf ; state of interrupt flag
+ cli
+
+ mov dx,0201h
+ in al,dx
+ out dx,al ; Clear the resistors
+
+ mov ah,1 ; Get masks into registers
+ mov ch,2
+
+ xor esi,esi ; Clear count registers
+ xor edi,edi
+ xor ebx,ebx ; Clear high byte of bx for later
+
+ mov ebp,10000 ; joystick is disconnected if value is this big
+
+jloop:
+ in al,dx ; Get bits indicating whether all are finished
+
+ dec ebp ; Check bounding register
+ jz bad ; We have a silly value - abort
+
+ mov bl,al ; Duplicate the bits
+ and bl,ah ; Mask off useless bits (in [xb])
+ add esi,ebx ; Possibly increment count register
+ mov cl,bl ; Save for testing later
+
+ mov bl,al
+ and bl,ch ; [yb]
+ add edi,ebx
+
+ add cl,bl
+ jnz jloop ; If both bits were 0, drop out
+
+done:
+ mov [_joystickx],esi
+ shr edi,1 ; because 2s were added
+ mov [_joysticky],edi
+
+ popf ; restore interrupt flag
+ popad
+ mov eax,1 ; read was ok
+ ret
+
+bad:
+ popf ; restore interrupt flag
+ popad
+ xor eax, eax ; read was bad
+ ret
+
+ENDP
+
+
+END
+