.Title GetByte from an Alvin Buffer. .Psect Alvin,GBL,CON .Ident /LVL51 / .MCALL $ALVIN $Alvin ;+ ;; Last Updated 7-May-84 DVJensen Separate module & CARRY Clear when OK. ;;********************************************************************** ;; GetByte - ;; SUBROUTINE TO GET THE NEXT BYTE IN AN ALVIN BUFFER TO REG 0. ;; ONLY THE LOW-ORDER BYTE IN REG 0 IS MODIFIED; HIGH-BYTE SAFE. ;; THE BUFFER DESC IS UPDATED AFTER THE BYTE HAS BEEN REMOVED. ;; SHOULD THE BUFFER BE FOUND TO BE EMPTY ON ENTRY, ;; THE BUFFER EMPTY EXIT WILL BE TAKEN. ;; EXPECTS CALLS OF THE FORM: ;; JSR R5,GETBYTE ;GET BYTE FROM ALVIN BUFFER INTO REG 0 ;; .WORD (BUFFER DESCRIPTOR ABSOLUTE ADDRESS) ;; BR (BUFFER EMPTY HANDLER) ;; NOTE: IF THE BUFFER DESCRIPTOR ABSOLUTE ADDRESS IS ZERO, THEN ;; THIS ADDRESS IS ASSUMED TO ALREADY BE IN REGISTER 4. ;- GETBYTE:: MOV R4,-(SP) ;SAVE THE WORK REGS MOV R2,-(SP) MOV (R5)+,R2 ;GET BUFFER DESC PARAMETER BEQ GETBGO ;IF ZERO, THEN BUF DESC ADR IS IN REG 4 MOV R2,R4 ;ELSE PUT IT IN REG 4 GETBGO: MOV BOUT(R4),R2 ;GET BUFFER OUTPUT POINTER CMP BIN(R4),R2 ;BUFFER EMPTY? INPUT PTR=OUTPUT PTR? BEQ GETBEMPTY ;YES, EXIT (CARRY will be set) MOVB (R2),R0 ;GET NEXT BYTE TO REG 0 Inc R2 ;Increment the output pointer. Cmp BEND(R4),R2 ;Exceeded buffer end - need to wrap? Bhis GetBupdate ;No, branch Mov BSTART(R4),R2 ;Yes, wrap back to the start of buffer. GetBup: Mov R2,BOUT(R4) ;Update the output pointer. TST (R5)+ Clc ;Force CARRY clear for success return. GETBEMPTY: MOV (SP)+,R2 MOV (SP)+,R4 RTS R5 ;Return with the byte in Register Zero. ;;********************************************************************** .END