 lib environment
 sttl Memory Drivers
 pag
 name memdrvr
 global mdrd,pmrd,mdwr,pmwr

*
* The following routines provide the interface to
* the system memory.
*

*
* mdrd
*
* Read from memory.
*

mdrd tstb check minor device number
 bne mdrd6 sys mem id dev 0
 ldd uipos check hi part of address
 bne mdrd5 if != 0, then eof
 ldx uipos2 get address
mdrd2 ldb 0,x+ get byte
 lbsr passc pass to user
 bmi mdrd5 end of list?
 cmpx #0 overflow?
 bne mdrd2 if not, repeat
 inc uipos+1 set overflow
 rts return
mdrd4 lda #EIO set io error
 sta uerror set error
mdrd5 rts return
mdrd6 cmpb #1 is it phys mem (dev 1)
 bne mdrd4
* read physical memory
pmrd ldd uipos get position
 cmpd #15 out of range?
 bhi mdrd5 if so - eof
 bsr mappm map in phys memory
 ldb 0,x get byte
 jsr passc send to user
 bmi mdrd5
 bra pmrd repeat

*
* mdwr
*
* Write to system memory.
*

mdwr ldx uuida check user id (actual)
 bne mdwr4 must be s.u.
 tstb check minor device
 bne mdwr6 if not 0, not sys mem
 ldd uipos check hi address
 bne mdwr4 past end of mem?
 ldx uipos2 get address
mdwr2 lbsr cpass get byte from user
 bmi mdwr5 no more?
 stb 0,x+ set char in mem
 cmpx #0 overflow?
 bne mdwr2
mdwr4 lda #EIO set error
 sta uerror
mdwr5 rts return
mdwr6 cmpb #1 is it phys mem (dev 1)
 bne mdwr4
* write physical memory
pmwr ldd uipos get position
 cmpd #15 out of range?
 bhi mdwr4 if so - error
 bsr mappm map in phys memory
 jsr cpass get byte from user
 bmi mdwr5 no more?
 stb 0,x set in memory
 bra pmwr repeat

* map in physical memory segment

mappm ldd uipos+1 get address
 jsr mapbf2 map into SBUFFER
 ldd uipos2 get rest of address
 anda #$f mask hi bits
 ora #SBUF<<4 point to sbuffer
 tfr d,x put address in x
 rts return
