.Title PutByte into an Alvin Buffer .Psect Alvin,GBL,CON .Ident /LVL51 / .MCALL $ALVIN $Alvin ;+ ;; Last Modified 7-May-84 Separate module & CARRY Clear when OK. ;;********************************************************************** ;; PutByte ;; SUBROUTINE TO MOVE THE LOW-ORDER BYTE IN REG 0 TO A BUFFER. ;; THE BUFFER DESC IS UPDATED AFTER THE BYTE HAS BEEN ENTERED. ;; SHOULD A BUFFER FULL CONDITION BE DETECTED (THE INPUT PTR HAS ;; CAUGHT UP WITH THE OUTPUT PTR) THE BYTE WILL BE STORED, ;; THE INPUT POINTER WILL NOT BE UPDATED, AND THE BUFFER FULL ;; EXIT WILL BE TAKEN. ;; EXPECTS CALLS OF THE FORM: ;; JSR R5,PUTBYTE ;PUT BYTE IN REG 0 INTO AN ALVIN BUFFER ;; .WORD (BUFFER DESCRIPTOR ABSOLUTE ADDRESS) ;; BR (BUFFER FULL HANDLER) ;; NOTE: IF THE BUFFER DESCRIPTOR ABSOLUTE ADDRESS IS ZERO, THEN ;; THIS ADDRESS IS ASSUMED TO ALREADY BE IN REGISTER 4. ;- PUTBYTE:: MOV R4,-(SP) ;SAVE REG 4 ON STACK MOV R3,-(SP) ;SAVE REG 3 ON STACK MOV (R5)+,R3 ;GET BUFFER DESC PARAMETER BEQ PUTBGO ;IF ZERO, THEN BUF DESC ADR IS IN REG 4 MOV R3,R4 ;ELSE, PUT IT IN REG 4 PUTBGO: MOV (R4),R3 ;GET BUFFER INPUT PTR LOCAL MOVB R0,(R3)+ ;STORE THE CHAR CMP Bend(R4),R3 ;NEED TO WRAP AROUND FOR CIRCULAR BUFFER? BHIS PUTBUP ;NO, BRANCH MOV Bstart(R4),R3 ;YES, RESET TO START OF BUFFER PUTBUP: CMP R3,Bout(R4) ;IS BUFFER NOW FULL? INPUT PTR=OUTPUT PTR? BEQ PUTBFULL ;YES, EXIT - DO NOT UPDATE INPUT PTR MOV R3,(R4) ;NO, UPDATE THE BUFFER DESCRIPTOR INPUT PTR TST (R5)+ ;INCREMENT RETURN ADDRESS - no problems. Clc ;Return with carry clear. PUTBFULL: MOV (SP)+,R3 ;RESTORE REG 3 MOV (SP)+,R4 ;RESTORE REG 4 RTS R5 ;AND RETURN ;;********************************************************************** .END