home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Set of Apple II Hard Drive Images
/
eric.hdv
/
OBJSRC
/
AUXQUEUE.SRC.txt
next >
Wrap
Text File
|
2020-08-13
|
8KB
|
252 lines
; ********************************************
; * AUXQUEUE.SRC - AUX MEMORY QUEUE MANAGER
; * (C) 1993, ERIC RANGELL
; ********************************************
;
RECEIVER EQU $FA
MSG EQU $FB
MYOBJ EQU $FD
MYADRS EQU $FE ;WILL POINT TO 'BASE' WHEN OBJECT INVOKED
;
USRVECT EQU $0A ;APPLESOFT USR VECTOR
BASL EQU $0B
BASH EQU $0C
;
;
OLDSTRT EQU $3C ;START ADRS FOR MOVE
OLDEND EQU $3E ;END ADRS FOR MOVE
NEWSTRT EQU $42 ;DESTINATION FOR MOVE
;
MOVE EQU $FE2C ;MONITOR MOVE ROUTINE
AUXMOVE EQU $C311
;
;------------OBJECTS REFERENCED
AUXQUEUE EQU 8
;
;------------OBJECT HEADER (19 BYTES)
ORG $6000
;
LDA #$00 ;CALL OBJECT SETUP ROUTINE
STA $FA
JSR $000A
DFB AUXQUEUE ;OBJECT NUMBER
DFB 0,0,0,0,0,0,0 ;SAVE AREA
BASE CLV
BVC CODE
RETCODE DFB $00 ;RETURN CODE
;
;------------INTERNAL DATA MAINTAINED BY OBJECT
;
QINSREG DFB $00
QOUTREG DFB $00 ;OUTPUT DATA REGISTER
;
QBEGIN DFB $00,$08 ;AUX MEM BEGIN OF QUEUE
QEND DFB $00,$C0 ;AUX MEM END OF QUEUE + 1
QSTAT DFB $00 ;QUEUE STATUS: 0=EMPTY, FF=FULL, 1=IN USE
QHEAD DFB $00,$08 ;HEAD POINTER
QTAIL DFB $00,$08 ;TAIL POINTER
;
;==========================================
; METHODS:
; 'E' <BYTE> = ENQUE BYTE
; 'D' <BYTE> = DEQUEUE INTO BYTE
;
;==========================================
CODE LDY #0
LDA (MSG),Y
CMP #'E' ;IS IT AN ENQUE?
BNE CODED1
;
INY ;SAVE THE BYTE TO ENQ
LDA (MSG),Y
LDY #QINSREG-BASE
STA (MYADRS),Y
;
ENQUE LDY #QSTAT-BASE ;CHECK STATUS
LDA (MYADRS),Y
BPL DOENQ
;
LDY #RETCODE-BASE ;QUEUE FULL - RC=FF
LDA #$FF
STA (MYADRS),Y
SEC
RTS
;
DOENQ SEI
LDY #QHEAD-BASE ;ADD 1 TO QHEAD
LDA (MYADRS),Y
CLC
ADC #$01
STA (MYADRS),Y
LDY #QHEAD-BASE+1
LDA (MYADRS),Y
ADC #$00
STA (MYADRS),Y
;
LDY #QEND-BASE+1 ;CHK FOR WRAPAROUND
LDA (MYADRS),Y
LDY #QHEAD-BASE+1
CMP (MYADRS),Y
BNE STORHD
LDY #QEND-BASE
LDA (MYADRS),Y
LDY #QHEAD-BASE
CMP (MYADRS),Y
BNE STORHD
;
LDY #QBEGIN-BASE ;WRAPAROUND
LDA (MYADRS),Y
LDY #QHEAD-BASE
STA (MYADRS),Y
LDY #QBEGIN-BASE+1
LDA (MYADRS),Y
LDY #QHEAD-BASE+1
STA (MYADRS),Y
;
CLV
BVC STORHD
CODED1 CLV
BVC CODED
;
STORHD LDA #QINSREG-BASE ;MOVE 1 BYTE TO AUX
CLC
ADC MYADRS ;ADD OFFSET TO BASE TO GET REAL ADRS
STA OLDSTRT
STA OLDEND
LDA MYADRS+1
ADC #$00
STA OLDSTRT+1
STA OLDEND+1
LDY #QHEAD-BASE
LDA (MYADRS),Y
STA NEWSTRT
LDY #QHEAD-BASE+1
LDA (MYADRS),Y
STA NEWSTRT+1
SEC
JSR AUXMOVE
;
LDA #$01 ;SET QSTAT = 1 (IN USE)
LDY #QSTAT-BASE
STA (MYADRS),Y
;
LDY #QHEAD-BASE+1
LDA (MYADRS),Y
LDY #QTAIL-BASE+1
CMP (MYADRS),Y
BNE QNOTFULL
LDY #QHEAD-BASE
LDA (MYADRS),Y
LDY #QTAIL-BASE
CMP (MYADRS),Y
BNE QNOTFULL
LDA #$FF ;SET QSTAT = FF (FULL)
LDY #QSTAT-BASE
STA (MYADRS),Y
QNOTFULL CLC
CLI
RTS
;
;--------
CODED CMP #'D'
BNE CODEX1
;
;
DEQUE LDY #QSTAT-BASE
LDA (MYADRS),Y
BNE DODEQ
;
LDY #RETCODE-BASE
LDA #$FE
STA (MYADRS),Y
SEC
RTS
;
DODEQ SEI
LDY #QTAIL-BASE
LDA (MYADRS),Y
CLC
ADC #$01
STA (MYADRS),Y
LDY #QTAIL-BASE+1
LDA (MYADRS),Y
ADC #$00
STA (MYADRS),Y
;
LDY #QEND-BASE+1
LDA (MYADRS),Y
LDY #QTAIL-BASE+1
CMP (MYADRS),Y
BNE GETHD
LDY #QEND-BASE
LDA (MYADRS),Y
LDY #QTAIL-BASE
CMP (MYADRS),Y
BNE GETHD
;
LDY #QBEGIN-BASE
LDA (MYADRS),Y
LDY #QTAIL-BASE
STA (MYADRS),Y
LDY #QBEGIN-BASE+1
LDA (MYADRS),Y
LDY #QTAIL-BASE+1
STA (MYADRS),Y
;
CLV
BVC GETHD
CODEX1 CLV
BVC CODEX
;
GETHD LDY #QTAIL-BASE
LDA (MYADRS),Y
STA OLDSTRT
STA OLDEND
LDY #QTAIL-BASE+1
LDA (MYADRS),Y
STA OLDSTRT+1
STA OLDEND+1
;
LDA #QOUTREG-BASE
CLC
ADC MYADRS
STA NEWSTRT
LDA MYADRS+1
ADC #$00
STA NEWSTRT+1
CLC
JSR AUXMOVE
;
LDA #$01 ;SET QSTAT=1
LDY #QSTAT-BASE
STA (MYADRS),Y
;
LDY #QHEAD-BASE+1
LDA (MYADRS),Y
LDY #QTAIL-BASE+1
CMP (MYADRS),Y
BNE QNOTEMTY
LDY #QHEAD-BASE
LDA (MYADRS),Y
LDY #QTAIL-BASE
CMP (MYADRS),Y
BNE QNOTEMTY
;
LDA #$00 ;SET QSTAT = 0 (EMPTY)
LDY #QSTAT-BASE
STA (MYADRS),Y
;
QNOTEMTY LDY #QOUTREG-BASE
LDA (MYADRS),Y
LDY #1
STA (MSG),Y
CLC
CLI
RTS
;
CODEX LDY #RETCODE-BASE
LDA #12
STA (MYADRS),Y
SEC
RTS