home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
508.lha
/
IO_Expansion_Board
/
Test
/
PARtest.asm
< prev
Wrap
Assembly Source File
|
1991-05-06
|
5KB
|
211 lines
*****************************************************************************
* Program: PARtest.asm - Copyright ©1990 by Jeff Lavin
* Function: A test program for the Rockwell 65C22. This program takes a
* filespec as its only argument, and stuffs the file out parallel
* Port 2 (VIA #1, Port A) to a printer. No devices are involved;
* this goes right to the hardware. Also, in this version,
* interrupts are not used handshaking is accomplished by hardware
* polling.
*
* Author: Jeff Lavin
* History: 01/09/91 V0.50 Created
*****************************************************************************
;Set Tabs | | | |
ifnd __m68
fail 'Wrong assembler!'
endc
exeobj
macfile 'Includes:IOexp.i' ;The One & Only include file
objfile 'PARtest'
;This program as written stuffs a file out parallel Port 2 (VIA #1, Port A)
;to a printer. The parallel interface should be arranged as follows:
;
; Name P3 Centronics
; ==== == ==========
; CA2.3 2 1 STROBE*
; PA0.3 3 2 DATA0
; PA1.3 4 3 DATA1
; PA2.3 5 4 DATA2
; PA3.3 6 5 DATA3
; PA4.3 7 6 DATA4
; PA5.3 8 7 DATA5
; PA6.3 9 8 DATA6
; PA7.3 10 9 DATA7
; CA1.3 1 10 ACK*
; GND PAD 16 GND
Error equr d6
MyStack clrfo
DosBase fo.l 1
BufSiz fo.l 1
BufPtr fo.l 1
MS_SIZE foval
*** Begin Mainline
PARtest link.w a5,#MS_SIZE
movem.l d0/a0,-(sp) ;Save cmd line
clr.l (BufSiz,a5)
clr.l (BufPtr,a5)
moveq #RETURN_OK,Error
lea (DosName,pc),a1
movea.l (SysBase).w,a6
SYS OldOpenLibrary ;Open dos.library
movea.l d0,a6
move.l d0,(DosBase,a5)
bne.b .Parse
addq.w #8,sp
rts
.Parse movem.l (sp)+,d0/a0 ;Get cmd line
lea (a0,d0.w),a1
.. cmpi.b #' ',-(a1) ;Eat trailing garbage
dbhi d0,..
blt.w BadArgs ;If no arguments, quit
clr.b (1,a1) ;Null terminate the string
.. move.b (a0)+,d0
beq.w BadArgs ;If no arguments, quit
cmpi.b #' ',d0 ;Skip leading spaces
beq.b ..
cmpi.b #'?',d0 ;User wants help
beq.w Instruct
subq.l #1,a0 ;Adjust ptr
movea.l a0,a2 ;Save cmd line
move.l a2,d1 ;FileName
move.l #MODE_OLDFILE,d2 ;Access mode
SYS Open ;Open file
move.l d0,d4 ;Save filehandle
bne.b .GetSize
bra.w OpenError
.GetSize moveq #OFFSET_END,d3 ;Mode
moveq #0,d2 ;Position
move.l d4,d1 ;FileHandle
SYS Seek
tst.l d0
bmi.b .SeekErr
moveq #OFFSET_BEGINNING,d3 ;Mode
moveq #0,d2 ;Position
move.l d4,d1 ;FileHandle
SYS Seek
move.l d0,d3 ;Length of file
bpl.b .GetBuffer
.SeekErr move.l d4,d1 ;FileHandle
SYS Close ;Close file
bra.w SeekError
.GetBuffer moveq #MEMF_PUBLIC,d1
move.l d3,d0
move.l a6,-(sp)
movea.l (SysBase).w,a6
SYS AllocMem ;Allocate a read buffer
movea.l (sp)+,a6
move.l d0,(BufPtr,a5)
bne.b .GotBuffer
move.l d4,d1 ;FileHandle
SYS Close ;Close file
bra.w MemError
.GotBuffer movea.l d0,a3 ;Buffer
move.l d3,(BufSiz,a5)
move.l a3,d2 ;Buffer
move.l d4,d1 ;FileHandle
SYS Read
cmp.l d3,d0 ;ActualLength
beq.b .CloseFile
move.l d4,d1 ;FileHandle
SYS Close ;Close file
bra.w ReadError
.CloseFile move.l d4,d1 ;FileHandle
SYS Close ;Close file
* Initialize VIA registers
lea (VIA_Base+VIA1),a4 ;Get chip base
move.b #%10000000,(INTER,a4) ;Disable interrupts
move.b #%00001000,(PERCR,a4) ;CA2 = Handshake output
;CA1 = Negative edge input
clr.b (ORA,a4) ;Clear garbage
move.b #%11111111,(DDRA,a4) ;All outputs
* Stuff chars out Port A, as fast as the printer'll take 'em.
.StuffLoop move.b (a3)+,(ORA,a4) ;Send char & data strobe
subq.l #1,d3 ;Decrement count
beq.w Cleanup ;Zero is all done
.WaitLoop btst #1,(INTFR,a4) ;Test CA1 bit for not busy
beq.b .WaitLoop ;Wait 'til char is taken
bra.b .StuffLoop ;Do it again
BadArgs lea (BadArgs.msg,pc),a2
moveq #RETURN_WARN,Error
bra.b ErrorMsg
Instruct lea (Instruct.msg,pc),a2
bra.b ErrorMsg
OpenError lea (OpenError.msg,pc),a2
moveq #RETURN_FAIL,Error
bra.b ErrorMsg
SeekError lea (SeekError.msg,pc),a2
moveq #RETURN_FAIL,Error
bra.b ErrorMsg
MemError lea (MemError.msg,pc),a2
moveq #RETURN_FAIL,Error
bra.b ErrorMsg
ReadError lea (ReadError.msg,pc),a2
moveq #RETURN_FAIL,Error
ErrorMsg movea.l (DosBase,a5),a6
SYS Output
move.l d0,d1 ;FileHandle
beq.b Cleanup
move.l a2,d3
.. tst.b (a2)+
bne.s ..
exg a2,d3
sub.l a2,d3
subq.l #1,d3 ;Length
move.l a2,d2 ;Buffer
SYS Write
Cleanup movea.l (SysBase).w,a6
move.l (BufPtr,a5),d0
beq.b .CloseDos
movea.l d0,a1
move.l (BufSiz,a5),d0
SYS FreeMem
.CloseDos move.l (DosBase,a5),d0
beq.b .Exit
movea.l d0,a1
SYS CloseLibrary
.Exit unlk a5
move.l Error,d0
rts
DosName cstr 'dos.library'
BadArgs.msg db 'Bad arguments:',10
Instruct.msg db 'Usage:',10
cstr '1> PARtest <filespec>',10
OpenError.msg cstr 'Couldn''t open file',10
SeekError.msg cstr 'Seek error on file',10
MemError.msg cstr 'Couldn''t allocate buffer',10
ReadError.msg cstr 'Read error on file',10
end