
;test program for ReadJoy

;use WriteString like this:
; WriteString <'The answer is '>
; bsr WriteWord
; bsr WriteLn

WriteString MACRO
 movem.l d2-d3/a6,-(sp)
 move.l DOSBase,a6
 jsr Output(a6)
 move.l d0,d1
 moveq #0,d3
 lea .START\@,a0
 move.b (a0)+,d3
 move.l a0,d2
 jsr Write(a6)
 movem.l (sp)+,d2-d3/a6
 bra.s .OUT\@
.START\@
 dc.b .END\@-.START\@-1
 dc.b \1
.END\@
 EVEN
.OUT\@
 ENDM

ExecBase=4

;Exec equates
CloseLibrary=-414
OpenLibrary=-408

;DOS equates
Output=-60
Write=-48
Delay=-198

;Main
Main
;open DOS
 move.l (ExecBase).l,a6
 lea DOSName,a1
 jsr OpenLibrary(a6)
 move.l d0,DOSBase
 beq Exit2

 moveq #15,d5
.LOOP1
 move.l DOSBase,a6
 move.l #60,d1
 jsr Delay(a6)
 moveq #1,d0
 bsr ReadJoy
 move.w d0,d6
 move.w d1,d7
 WriteString <"Joystick's horizontal value is ">
 move.w d6,d0
 bsr WriteSWord
 bsr WriteLn
 WriteString <"Joystick's vertical value is ">
 move.w d7,d0
 bsr WriteSWord
 bsr WriteLn
 dbra d5,.LOOP1

Exit
 move.l DOSBase,a1
 move.l (ExecBase).l,a6
 jsr CloseLibrary(a6)
Exit2
 moveq #0,d0
 rts


;ReadJoy
; on entry d0.w is port number
; on exit d0.w = x value, d1.w = y value
; port is 0,1
; return values are 1,0,-1
ReadJoy
 move.l #$dff00a,a0
 add.w d0,d0
 move.w (a0,d0.w),d0
 ror.b #2,d0
 lsr.w #5,d0
 and.w #30,d0
 lea Y,a0
 move.w (a0,d0.w),d1
 move.w 22(a0,d0.w),d0
 rts
Y dc.w 0,1,1,0,-1,0,0,-1,-1,0,0
X dc.w 0,0,1,1,0,0,0,1,-1,0,0,0,-1,-1

;Print()
Print
 movem.l d2-d3/a6,-(sp)
 move.l DOSBase,a6
 jsr Output(a6)
 move.l d0,d1
 moveq #0,d3
 lea String,a0
 move.b (a0)+,d3
 move.l a0,d2
 jsr Write(a6)
 movem.l (sp)+,d2-d3/a6
 rts

;WriteLn()
WriteLn
 move.w #266,String
 bra.s Print

;WriteSWord(d0)
WriteSWord
 tst.w d0
 bpl.s WriteWord
 move.b #"-",String+1
 move.b #1,String
 move.w d0,-(sp)
 bsr.s Print
 move.w (sp)+,d0
 neg.w d0
;WriteWord(d0)
WriteWord
 and.l #65535,d0
 bra.s WriteLong

;WriteSLong(d0)
WriteSLong
 tst.l d0
 bpl.s WriteLong
 move.b #"-",String+1
 move.b #1,String
 move.l d0,-(sp)
 bsr Print
 move.l (sp)+,d0
 neg.l d0
;WriteLong(d0)
WriteLong
 tst.l d0
 beq.s .SKIP0
 movem.l d2/d3,-(sp)
 lea .DECI,a0
 lea String+1,a1
 moveq #0,d3      ;flag for zero suppression
.LOOP2
 move.l (a0)+,d1  ;radix value
 moveq #'0',d2    ;counter for each digit
.LOOP1
 cmp.l d0,d1
 bhi.s .SKIP1
 sub.l d1,d0
 addq.w #1,d2
 bra.s .LOOP1
.SKIP1
 cmp.b #'0',d2
 bne.s .SKIP2
 tst.w d3
 beq.s .LOOP2
.SKIP2
 addq.w #1,d3
 move.b d2,(a1)+
 cmp.l #1,d1
 bne.s .LOOP2
 move.b d3,String
 movem.l (sp)+,d2/d3
 bra Print
.SKIP0
 move.w #256+'0',String
 bra Print
.DECI dc.l 1000000000,100000000,10000000,1000000,100000,10000,1000,100,10,1

DOSBase ds.l 1
DOSName dc.b "dos.library",0
String ds.b 40
