view level1/modules/scdpp.asm @ 3246:be3446f758ca

Updated dwread.asm and dwwrite.asm so that the 6551 routines could have specially defined flags so that some of the addresses could be overridden by the make files if needed.
author David Ladd <drencor-xeen@users.sourceforge.net>
date Sun, 11 Mar 2018 01:30:30 -0600
parents 25b468210b37
children c505ae3120c4
line wrap: on
line source

* Parallel Printer device for Dragon 32/64/Alpha.
*
* Disassembled from the Alpha OS-9 2005-06-14, P.Harvey-Smith.
*

	nam   scdpp
        ttl   Dragon Parallel Printer Driver 

* Disassembled 1900/00/00 00:08:11 by Disasm v1.5 (C) 1988 by RML

        ifp1
        use   	defsfile
        endc

tylg    set   	Drivr+Objct   
atrv    set   	ReEnt+rev
rev     set   	$01
edition set	3
        mod   	eom,name,tylg,atrv,start,size

u0000   rmb   29
size    equ   .

	fcb	$03 
name    equ   	*
        fcs   	/scdpp/
        fcb   	edition
	
start   equ   	*
        lbra  	Init
        lbra  	Read
        lbra  	Write
        lbra  	GetStat
        lbra  	SetStat
        lbra  	Term

* Init
*
* Entry:
*    Y  = address of device descriptor
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*
Init   	pshs  	cc
        orcc  	#$50		; Disable Inturrupts
        ldx   	#PIA1DA		; Point to PIA1DA
        ldb   	1,x		; Get CRA
        clr   	1,x		; Zero CR and select DDRA
        lda   	#$FE		; Set bit 0 as input (cassette in), all others as input
        sta   	,x
        stb   	1,x		; Restore CRA
        ldx   	#PIA1DB		; Point at PIA1DB
        ldb   	1,x		; Save CRB
        clr   	1,x		; Zero CR and select DDRB
        lda   	,x		; get DDRB
        anda  	#$FE		; Set bit 0 as input (printer busy), all others leave alone
        sta   	,x		
        stb   	1,x		; restore CRB
        puls  	cc
        clrb  			; Flag no error
        rts

* Read
*
* Entry:
*    B  = MSB of the disk's LSN
*    X  = LSB of the disk's LSN
*    Y  = address of path descriptor
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*

Read   	ldb   	#$CB		; Ilegal mode, cannot read from printer !
        orcc  	#$01
        rts   
	
* Write
*
* Entry:
*    B  = MSB of the disk's LSN
*    X  = LSB of the disk's LSN
*    Y  = address of path descriptor
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*

Write   pshs  	a
L0053   ldb   	#$08		; retry count
L0055   lda   	>PIA1DB		; Get printer busy flag
        lsra  			; Get busy bit into carry
        bcc   	WriteNotBusy		; Not busy : continue
        nop   			; wait a little while
        nop   
        decb  			; decrement retry counter
        bne   	L0055		; Non zero : check flag again
	
        pshs  	x		; Still busy: send calling process to sleep
        ldx   	#$0001
        os9   	F$Sleep  
        puls  	x
        bra   	L0053		; When we wake, poll busy again
	
WriteNotBusy   
	puls  	a
        pshs  	cc		
        orcc  	#$50		; disable inturrupts
        sta   	>PIA0DB		; Send character to printer
        lda   	>PIA1DA		; Toggle printer strobe line
        ora   	#$02		; high
        sta   	>PIA1DA		
        anda  	#$FD		; and low again
        sta   	>PIA1DA
        puls  	pc,cc		; restore and return
	
* GetStat
*
* Entry:
*    A  = function code
*    Y  = address of path descriptor
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*
GetStat   
	cmpa  	#$01
        bne   	L008A
L0088   clrb  
        rts 
	
L008A   cmpa  	#$06
        beq   	L0088
*
* SetStat
*
* Entry:
*    A  = function code
*    Y  = address of path descriptor
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*
SetStat   
	comb  
        ldb   	#$D0
        rts
*
* Term
*
* Entry:
*    U  = address of device memory area
*
* Exit:
*    CC = carry set on error
*    B  = error code
*

Term   	rts

        emod
eom     equ   *
        end