I once got this sample from someone, it's definitely a good start.
*
* Bind with *SRVPGM QSNAPI
*
D F3 c x'33'
D sa_norm c x'20'
D txt s 128 inz('Press Enter to Roll, F3.')
D txtlen s 9b 0 inz(32)
D err s 8 inz(x'0000000000000000')
D aid s 1
D lines s 9b 0 inz(1)
D wf1 s 1
D wrtn s 9b 0
D ClrScr PR 9b 0 extproc('QsnClrScr')
D mode 1 options(*nopass) const
D cmdbuf 9b 0 options(*nopass) const
D env 9b 0 options(*nopass) const
D error 8 options(*nopass)
D WrtDta PR 9b 0 extproc('QsnWrtDta')
D data 128
D datalen 9b 0
D fldid 9b 0 options(*nopass) const
D row 9b 0 options(*nopass) const
D col 9b 0 options(*nopass) const
D strmatr 1 options(*nopass) const
D endmatr 1 options(*nopass) const
D strcatr 1 options(*nopass) const
D endcatr 1 options(*nopass) const
D cmdbuf 9b 0 options(*nopass) const
D env 9b 0 options(*nopass) const
D error 8 options(*nopass)
D GetAID PR 1 extproc('QsnGetAID')
D aid 1 options(*nopass)
D env 9b 0 options(*nopass) const
D error 8 options(*nopass)
D RollUp PR 9b 0 extproc('QsnRollUp')
D lines 9b 0 const
D top 9b 0 const
D bottom 9b 0 const
D cmdbuf 9b 0 options(*nopass) const
D env 9b 0 options(*nopass) const
D error 8 options(*nopass)
C Eval wrtn = ClrScr('0' : 0 : 0 : err)
C DoW wrtn = 0
C Eval wrtn = WrtDta (txt : txtlen : 0 : 23 : 2 :
C sa_norm : sa_norm : sa_norm : sa_norm :
C 0 : 0 : err)
C Eval wf1 = GetAID (aid : 0 : err)
C If aid = F3
C Leave
C EndIf
C Eval wrtn = RollUp (lines : 1 : 24 : 0 : 0: err)
C EndDo
C SetOn Lr
C Return