.include "labmac.i" .section .text .globl main main: JSR Qinit MOVE.L #1, D0 JSR QInsert MOVE.L #2, D0 JSR QInsert MOVE.L #3, D0 JSR QInsert JSR QDelete MOVE.L D0, D1 JSR outint JSR QDelete MOVE.L D0, D1 JSR outint JSR QDelete MOVE.L D0, D1 JSR outint RTS | --------------------- buflen = 10 buffer: DS.L buflen Qinit: LEA buffer+4, A5 | initialize HEAD (start empty) LEA buffer, A6 | initialize TAIL RTS QInsert: SUB.L #4, A5 | decrement HEAD CMP.L #buffer, A5 | check HEAD underflow BGE InOK ADD.L #(buflen*4), A5 | put HEAD to end of queue InOK: MOVE.L D0, (A5) | write data in queue RTS QDelete: MOVE.L (A6), D0 | return TAIL element in D0 SUB.L #4, A6 | decrement TAIL CMP.L #buffer, A6 | check TAIL underflow BGE DelOK ADD.L #(buflen*4), A6 DelOK: RTS | --------------------- outint: MOVEM.L D1-D2/A0,-(SP) | SAVE REGISTERS MOVE.L #intstr+10, A0 | pointer A0 behind last digit loop: DIVUL.L #10, D2:D1 | D1 := D1/10, D2 := remainder ADD.B #'0', D2 | make D2 digit character MOVE.B D2, -(A0) | write digit TST.L D1 | check quotient BNE loop | while ? 0 repeat with quotient in D1 print: CALLEXEC LCD_PutString | call string print (address in A0) MOVEM.L (SP)+,D1-D2/A0 | RESTORE REGISTERS RTS intstr: .asciz "1234567890 " | number can have up to 10 digits