|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 23750 (0x5cc6)
Notes: pts_type(SC)
Names: »DRTP01.SC«
└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
└─⟦this⟧ »TOSSWORK/DRTP01.SC«
IDENT DRTP01 REL 9.2 79-11-16 870105040920 * * ******************************************************* * * PHILIPS TERMINAL SYSTEM PTS * * DRTP01 = DRIVER TELLER TERMINAL PRINTER * * * * * * ******************************************************* * * * THIS DRIVER HANDLES TELLER TERMINAL PRINTERS PTS 6221, * 6222 OR 6223 CONNECTED TO CPU VIA CHLT OR CHRT * * THIS DRIVER CONSISTS OF THE FOLLOWING PARTS: * * A C T P : ACTIVATION PART * * I H T P : INTERRUPT HANDLER * * R C T P : RECOVERY ROUTINE * * * THE DRIVER CONTAINS THE FOLLOWING SUBROUTINES: * * P R B U F : GET CHARACTERS FROM ECB-BUFFER AND SEND THEM * * B C D T B Y : CONVERT FROM BINARY TO DECIMAL * * B U F C H R : SEND THE NUMBER OF CHARACTERS GIVEN IN FIRST * CHARACTER IN OUTPUT BUFFER EJECT * * THE FOLLOWING ORDERS ARE TREATED: * * ORDER 00 : TEST STATUS * ORDER 06 : WRITE JOURNAL * ORDER 07 : WRITE TALLY ROLL * ORDER 08 : WRITE VOUCHER/PASSBOOK * * * NORMAL REGISTER USAGE: * * REGISTER A1: WORK REGISTER * A2: INPUT/OUTPUT * A3: BUFFER POINTER * A4: OUTPUT COUNTER * A5: STACK POINTER * A6: DWT-ADDRESS * A7: ORDER * A8: ECB-ADDRESS * * * SYSTEM ADAPTATION: * * BY MEANS OF CONDITIONAL ASSEMBLY THE FOLLOWING FUNCTIONS CAN * BE EXCLUDED: * * ORDER 07 (PTS 6223) * CUT/PERFORATE JOURNAL TAPE (PTS 6221,6222) * ACCAPTANCE OF SPECIAL CHARACTER /13,/14 * * * THE CHARACTER CODES FOR ROOMLESS POINT DIGITS IS DEFINED * IN A TABLE NAMED ROMTAB.STANDARD IS SHB CHARACTER SET * * EJECT * *********** * ENTRIES * *********** * ENTRY TPAD ADDRESS BLOCK * ************* * EXTERNALS * ************* * EXTRN TDISP DISPATCHING FROM INTERRUPT EXTRN DISIOE DISPATCH I/O ERROR EXTRN DISEND END I/O AND DISPATCH EXTRN TENDIO END I/O EXTRN OUTPUT OUTPUT ONE CHARACTER EXTRN LDREG RESTORE REGISTERS EXTRN STREG STORE REGISTERS AND WAIT FOR INTERRUPT EXTRN SAVE8 SAVE REG. A1-A8 * * DISPLACMENT IN DEVICE WORK TABLE DWT * EXTRN DWTST STATUS EXTRN DWTBC BYTE COUNTER EXTRN DWTECB ECB ADDRESS EXTRN DWTOR ORDER EXTRN DWTSB2 STACK BASE 2 IN DWT EJECT * * ************* * CONSTANTS * ************* * * CCERR EQU /4 RETURN CODE. CODE CHECK ERROR PROUT EQU /20 RETURN CODE. END OF JOURNAL TAPE VOCHIN EQU /200 RETURN CODE. VOUCHER IN THRPUT EQU /2 THROUGHPUT ERROR * * VOIN EQU /8 VOUCHER IN BIT IN DATA-REQUEST EOJT EQU /4 END OF JOURNALTAPE BIT IN DATA-REQ. STX EQU /82 START OF TEXT BLOCK ETB EQU /97 END OF TEXT BLOCK ETX EQU /03 LAST DUMMY * EJECT * * ************************ * CONDITIONAL ASSEMBLY * ************************ * * ORDER 07, PRINT TALLY ROLL, MAY BE EXCLUDED FOR PTS 6223 * BY SETTING X:A=0 * X:A EQU 1 ORD7 EQU X:A * * JOURNAL TAPE MAY BE CUT/PERFORATED FOR PTS 6223 BY * SETTING X:B=1 * X:B EQU 0 CUTPER EQU X:B * * SPECIAL CHARACTER /13, /14 IS ACCEPTED BY SETTING X:C=1 * AND X:D=1 RESPECTIVLY * X:C EQU 0 TRETON EQU X:C * X:D EQU 0 FJOTON EQU X:D * * ORDER 08,PRINT VOUCHER/PASSBOOK,IS COMPLETED IF * PRINT OBJECT IS REMOVED UNDER PRINTING IF X:E = 1 * X:E EQU 0 COMPL EQU X:E * EJECT * * * INDICATION OF RECOVERY EXECUTED ON REQUEST CAN * BE INCLUDED IN THE DRIVER BY SETTING X:F = 1 * X:F EQU 0 RECOVY EQU X:F * * IN SITUATIONS WHERE THE SELECTOR UNIT OR PRINTER HARDWARE * IS INACTIVE, END OF REQUEST WITH RETURN CODE NOT OPERABLE * CAN BE CHOSEN BY SETTING THE CONSTANT RECEND = 1 X:G EQU 0 RECEND EQU X:G * * A PROGRAM VERSION USING TOSS MMU PAGING * IS OBTAINED BY SETTING MMUPAG EQU 1. * MMUPAG EQU 0 * * * A PROGRAM VERSION USING THE EXTENDED INSTRUCTION * SET IS OBTAINED BY SETTING CPU852 EQU 0. * CPU852 EQU 1 * * MMU BUFFER SIZE * X:I EQU 20 DVBLEN EQU X:I * EJECT * * ********************* * DWT-DISPLACEMENTS * ********************* * * DWTDRD EQU /10 START OF DRIVER DEFINED PART * IFT MMUPAG=0 START EQU DWTDRD XIF * IFT MMUPAG=1 START EQU DWTDRD+4 XIF * DWTRLN EQU START+/12 REQUESTED LINE NUMBER DWTALN EQU START+/13 ACTUAL LINE NUMBER * EJECT * *********** * BUFFERS * *********** * * BUF1 DATA /0382,/0D1D CR1, ATTACH PRINT HEAD BUF3 DATA /0382,/091D CR2, ATTACH PRINT HEAD * * BUF4 CONTAINS FOLLOWING ORDERS: * CR2,LIFT TO TOP,GRASP,LIFT TO TOP * * BUF4 DATA /0700,/2009,/0C1A,/830C BUF5 DATA /030C,/1B83 LIFT TO TOP AND RELASE * * * ********** * TABLES * ********** * * DATA DVBLEN MMU BUFFER SIZE DATA 2 DEVICE INDEX TPAD EQU * ADDRESS BLOCK DATA ACTP ACTIVATIONDRIVER DATA 0 ABORT ROUTINE ADDRESS DATA IHTP INTERRUPTHANDLER DATA RCTP RECOVERY ROUTINE EJECT * * TABLE TO GET ROOMLESS POINT * ROMTAB EQU * DATA /2122,/2426,/3B3C,/3E40,/5E5F * * TABLE TO GET ACTUAL LF-CHARACTER * * LFTAB EQU * DATA /1819 LINE FEED JOURNAL/TALLY ROLL * * * TABLE TO GET ACTUAL CR-CHARACTER FOR JOURNAL AND VOUCHER/PASSBOOK * * HPTAB EQU * DATA /0D09 DATA /0009 DATA /0D00 * * IFT CUTPER=1 CPTAB DATA /1F0F CODES FOR PERFORATE/CUT JOURNAL TAPE XIF EJECT * * * A C T P * * THIS IS THE ACTIVATION PART OF THE DRIVER * CHECKS VALIDITY OF ORDERS AND JUMPS TO ORDER PROCESSOR * * * ACTP EQU * ACTIVATION ENTRY * * LDR A7,A7 ORDER /00 ? RF(Z) TPDUMY YES ACTP01 LDR A4,A7 GET ORDER SUK A4,8 CHECK ORDER RF(P) ACT020 ILLEGAL ORDER RF(E) ACT010 ORDER 08 ADK A4,2 ILLEGAL ORDER ? IFT ORD7=1 RF(NN) TP100 NO XIF IFT ORD7=0 RF(Z) TP100 XIF ACT020 ABL DISIOE ILLEGAL ORDER * EJECT * * * ORDER 08 : WRITE VOUCHER/PASSBOOK * GET REQUESTED LINE NUMBER AND SAVE IN DWT * ACT010 LD A1,2,A8 BUFFER ADDRESS LCR A4,A1 GET FIRST CHARACTER LC A1,1,A1 GET SECOND CHARACTER ANK A1,/F LINE UNIT SLL A4,4 ANK A4,/F0 LINE DECADE ORR A1,A4 DECIMAL LINE NUMBER CF A5,BCDTBY CONVERT TO BINARY LDR A3,A1 LD A2,10,A8 GET CONTROL WORD SLL A2,3 LINE NUMBER RELATIVE OR ABSOLUTE ? RF(NN) ACT018 ABSOLUTE LC A3,DWTRLN,A6 GET LINE NUMBER * SLL A2,1 RELATIVE. LIFT UP OR DOWN ? RF(NN) ACT015 LIFT DOWN SUR A3,A1 LIFT UP RF(NN) ACT018 LDK A3,0 RF ACT018 * ACT015 ADR A3,A1 LIFT DOWN * * ACT018 SC A3,DWTRLN,A6 SAVE REQUESTED LINE NUMBER IN DWT EJECT * * TP100 EQU * LDK A2,0 SC A2,DWTBC,A6 RESET BYTE COUNTER CF A5,OUTPUT SEND DUMMY * * * CHECK IF REQUESTED LENGTH IS EQUAL TO TWO FOR * ORDERS 06 AND 07. * TP110 EQU * LD A3,4,A8 GET REQUESTED LENGTH LDR A4,A7 SAVE ORDER IN A4 RF(Z) TPDUMY ORDER /00 LC A1,DWTST,A6 GET LEFT BYTE IN STATUS WORD SUK A4,8 ORDER 08 ? RF(Z) TP600 YES GO TO ORDER PROCESSING ANK A1,/4 RF(NE) TPHP TEXT MESSAGE WRITTEN ? SUK A3,2 REQ. LENGTH =2 ? RF(NP) TPLF10 SEND LINE FEED DIRECT * * IFT ORD7=1 SUK A7,7 ORDER 07 RF(Z) TP400 GO TO ORDER PROCESSING ORDER 07 ELSE ORDER PROCESSING ORDER 06 XIF EJECT * * * * ORDER 06 : PRINT JOURNAL * * * TP200 LDKL A3,BUF1 SEND CR1 AND ATTACH TP210 CF A5,BUFCHR -"- CF A5,PRBUF PRINT ECB-BUFFER EJECT * * * SEND LINE FEED ORDERS 06 AND 07 * TPLF EQU * LDK A2,/1E DETACH PRINT HEAD CF A5,OUTPUT TPLF10 EQU * * * POSITION PRINT HEAD ACCORDING TO HP-PARAMETER * IN CONTROL WORD. * TPHP EQU * LD A1,4,A8 GET REQUESTED LENGTH ST A1,6,A8 SAVE EFFECTIVE LENGTH LD A1,10,A8 GET CONTROL WORD SRL A1,14 HP-PARAMETER IN A1 SUK A7,6 ORDER 06 ? RF(Z) TPHP10 YES ADK A1,3 NO MODIFY INDEX TPHP10 LC A2,HPTAB,A1 LOAD CR-CHARACTER CF A5,OUTPUT AND SEND IT LD A7,DWTOR,A6 GET ORDER ANK A7,/FF SUK A7,8 ORDER 8 ? RF(E) TPDUMY ADK A7,2 LC A2,LFTAB,A7 GET LF CHARACTER CF A5,OUTPUT AND SEND IT TPHP20 EQU * * IFT CUTPER=1 LD A1,10,A8 GET CONTROL WORD ECR A1,A1 ANK A1,3 CUT/PERFORATE ? RF(Z) TPDUMY POSITION PRINT HEAD LC A2,CPTAB-1,A1 GET CUT/PERFORATE CODE CF A5,OUTPUT XIF * * * COMMON END OF PRINT * * * SEND LAST DUMMY CHARACTER * TPDUMY EQU * LDK A2,ETX END OF TEXT MESSAGE CF A5,OUTPUT EJECT * * * CHECK STATUS AFTER LAST DUMMY CHARACTER * TPTST EQU * LDR A7,A7 ORDER 00 ? RF(NZ) TST010 NO TST005 LDR A3,A2 ANK A3,VOIN VOUCHER IN ? RF(Z) TST010 NO ORKL A1,VOCHIN SET RETURN CODE TST010 ANK A2,EOJT END OF JOURNAL TAPE ? RF(NZ) ENDIO NO PERFORM ENDIO ORK A1,PROUT SET RETURN CODE PAPER OUT * * * PERFORM END I/O AND GO TO DISPATCHER * ENDIO EQU * ABL DISEND PERFORM END I/O AND GO TO DISPATCHER * * * * IFT ORD7=1 EJECT * * * * ORDER 07 : PRINT TALLY ROLL * * * TP400 ANK A2,VOIN VOUCHER IN ? RF(Z) TP410 NO TP405 CF A5,RELEAS ERROR. VOUCHER IN * TP410 EQU * LDKL A1,/200 ORS A1,DWTST,A6 INDICATE VOUCHER STATUS CHANGE NOT ALLOWED LDKL A3,BUF3 SEND CR2, ATTACH AND PRINT BUFFER RB TP210 * * * XIF EJECT * * * * ORDER 08 : PRINT VOUCHER PASSBOOK * * * TP600 EQU * ANK A1,/4 RF(NE) TP700 TEXT ALREADY PRINTED LDK A2,/09 CR2 CF A5,OUTPUT SEND CHARACTER LD A1,10,A8 GET CONTROL WORD SLL A1,2 RELEASE ? RF(NN) TP602 NO SUK A3,2 REQUESTED LENGTH = 2 ? RF(Z) TP710 YES RELEASE TP602 EQU * ANK A2,VOIN VOUCHER IN ? RF(Z) TP605 NO SLL A1,1 DISPLACEMENT RF(N) TP610 YES TP605 LDKL A3,BUF4 CF A5,BUFCHR SEND LDK A3,0 RF TP620 EJECT * * SEND ELEVATOR UP/DOWN UNTIL ACTUAL LINE NUMBER IS EQUEAL * TO REQUESTED * TP610 LC A3,DWTALN,A6 GET ACTUAL LINE NUMBER ANK A3,/FF ACTUAL LINE NUMBER TP620 CC A3,DWTRLN,A6 COMPARE LINE NUMBERS RF(E) TP650 EQUEAL RF(G) TP630 SEND ELEVATOR UP * LDK A2,/0B SEND ELEVATOR DOWN ADK A3,1 INCREMENT ACTUAL LINE NUMBER RF TP640 SEND LIFT CHAR. * TP630 LDK A2,/0A SEND LIFT UP SUK A3,1 DECREMENT ACTUAL LUNE NUMBER * * TP640 CF A5,OUTPUT SEND LIFT CHAR. SC A3,DWTALN,A6 SAVE ACTUAL LINE NUMBER ANK A2,VOIN VOUCHER IN ? IFT COMPL=0 ABL(Z) RCTP01 ERROR. RECOVERY RB TP620 CHECK IF LIFT POSITIONED XIF IFT COMPL=1 RB(NZ) TP620 CHECK IF LIFT IS POSITIONED TP645 LDK A1,THRPUT VOUCHER OUT/SHOULD BE IN ORS A1,8,A8 INDICATE IN RETURN CODE RB TPDUMY XIF EJECT * * ORDER 08: ATTACH AND PRINT TP650 EQU * LDK A2,0 SEND DUMMY TO LET THE CF A5,OUTPUT LIFT SETTLE LD A3,4,A8 GET REQUESTED LENGTH SUK A3,2 GET NUMBER OF CHAR. RF(Z) TP700 ALL LDK A2,STX CF A5,OUTPUT START OF MESSAGE LD A3,2,A8 GET BUFFER ADDRESS ADK A3,2 LCR A1,A3 GET FIRST CHARACTER CCK A1,/1111 TABULATION ? RF(E) TP690 LDK A2,/1D ATTACH CF A5,OUTPUT SEND TP690 EQU * IFT CUTPER=1 LDK A2,/20 CF A5,OUTPUT SEND SPACE BEFORE PRINT XIF LDKL A1,/200 ORS A1,DWTST,A6 INDICATE VOUCHER STATUS CHANGE NOT ALLOWED CF A5,PRBUF PRINT ECB-BUFFER EJECT * * ORDER 08: RETURN AFTER PRINT * TP700 EQU * LD A1,10,A8 GET CONTROL WORD SLL A1,2 RELEASE ? RF(NN) TP715 TP710 EQU * CF A5,RELEAS RELEASE TP715 ABL TPLF EJECT * * P R B U F * * SUBROUTINE TO SEND CHARACTERS FROM ECB-BUFFER UNTIL REQUESTED * LENGTH IS REACHED * PRBUF LD A4,4,A8 GET REQUESTED LENGTH SUK A4,2 ADJUST REQUESTED LENGTH LD A3,2,A8 BUFFER ADDRESS ADK A3,2 PRB010 LCR A1,A3 GET CHARACTER CCK A1,/2020 RF(NE) PRB100 NOT BLANK ADK A3,1 BLANK SUK A4,1 RB PRB010 GET NEXT CHARACTER PRB100 SUK A4,1 DECREMENT REQUESTED LENGTH RF(NN) PRB105 PRINT BUFFER LDK A2,ETB CF A5,OUTPUT SEND END OF MESSAGE LDK A2,ETX CF A5,OUTPUT WAIT FOR WHOLE BUFFER TO BE PRINTED LDKL A1,/400 INDICATE MESSAGE PRINTED ORS A1,DWTST,A6 LDKL A1,/FDFF VOUCHER STATUS CHANGE ALLOWED ANS A1,DWTST,A6 PRB102 RTN A5 EJECT * * * * PRINT BUFFER * * PRB105 EQU * ADR A3,A4 ADDRESS TO CHARACTER TO BE PRINTED SUK A7,7 CHECK ORDER RF(L) PRB200 PRINT JOURNAL RF(G) PRB110 PRINT VOUCHER EJECT IFT ORD7=1 * * * * PRINT TALLY ROLL * * * ANK A2,VOIN VOUCHER IN ? RF(Z) PRB200 NO. GO AND PRINT ADK A5,4 RESET STACK POINTER ABL TP400 SEND LIFT TO TOP AND RELEAS * XIF * * * PRINT VOUCHER/PASSBOOK * * PRB110 ANK A2,VOIN VOUCHER IN ? IFT COMPL=0 RF(Z) RCTP01 ERROR .VOUCHER NOT IN XIF IFT COMPL=1 RB(Z) TP645 XIF LDK A1,/11 CCR A1,A3 TABULATION? RF(NE) PRB200 NO * EJECT * * * IF TABULATION CHARACTER: DETACH PRINT HEAD, * SEND CHARACTERS UNTIL TABULATION POSITION IS REACHED * AND ATTACH PRINT HEAD * * PRB115 LDK A2,/1E DETACH PRINT HEAD CF A5,OUTPUT SEND DETACH PRB117 LD A1,10,A8 GET CONTROL WORD ANK A1,/FF CF A5,BCDTBY CONVERT TO BINARY PRB120 IM DWTBC,A6 INCREMENT BYTE COUNTER CC A1,DWTBC,A6 COMPARE WITH ACTUAL TAB. POS. RF(NG) PRB125 PRINT * * * LDK A2,/20 LOAD BLANK CF A5,OUTPUT SEND BLANKS OR DETACH RB PRB117 * * * PRB125 LDK A2,/1D ATTACH RF PRB240 SEND ATTACH EJECT * * * * GET OUTPUT CHARACTER FROM BUFFER. CHECK IF * ILLEGAL CHARACTER OR ROOMLESS POINT * * * PRB200 EQU * PRB205 LCR A7,A3 LOAD OUTPUT CHARACTER CCK A7,/AEAE ROOMLESS POINT ? RF(NE) PRB210 NO SUK A3,1 INCREMENT BUFFER POINTER SUK A4,1 LCR A7,A3 GET OUTPUT CHARACTER ANK A7,/F MASK LC A7,ROMTAB,A7 GET CODE IN TABLE * * * PRB210 CCK A7,/2020 ILLEGAL CHARACTER ? RF(L) PRB220 YES PRB215 CCK A7,/5F5F ILLEGAL CHARACTER ? RF(NG) PRB230 NO * * PRB220 EQU * IFT TRETON=1 CCK A7,/1313 SPECIAL CHARACTER ? RF(E) PRB230 YES XIF IFT FJOTON=1 CCK A7,/1414 SPECIAL CHARACTER ? RF(E) PRB230 YES XIF LDK A1,CCERR CODE CHECK ERROR ORS A1,8,A8 STORE IN RETURN CODE LD A7,DWTOR,A6 GET ORDER ANK A7,/FF SUR A3,A4 RB PRB100 * * * PRB230 IM DWTBC,A6 INCREMENT BYTE COUNTER LDR A2,A7 GET OUTPUT CHARACTER PRB240 CF A5,OUTPUT SEND CHARACTER SUR A3,A4 START OF BUFFER ADDRESS RB PRB100 * * * EJECT * * I H T P * * INTERRUPT HANDLER: PROCESS OF INTERRUPT * * * IHTP EQU * LD A4,DWTST,A6 GET STATUS RF(N) RCTP10 BUSY LDR A7,A7 ORDER 0 ? RF(Z) IHTP20 LDR A1,A1 RETURN CODE FROM CHANNEL UNIT IHTP10 ABL(Z) LDREG NO RETURN CODE RESTORE REGISTERS IFT RECEND=0 RF RCTP10 ELSE GO TO DISPATCHER XIF IFT RECEND=1 RF IHTP30 XIF IHTP20 LDR A1,A1 ERROR ? ABL(Z) TST005 IHTP30 ABL ENDIO * * * EJECT * * R C T P * * RECOVERY ROUTINE: REPRINTS RUNNING REQUEST AT * POWER UP RCTP EQU * IFT CPU852=1 CF A15,SAVE8 SAVE A1-A8 ON STACK XIF * IFT CPU852=0 MSR 8,A15 SAVE A1-A8 ON STACK XIF * LD A2,DWTST,A6 GET STATUS RF(N) RCTP05 NOT BUSY RCTP01 EQU * * * LDKL A5,DWTSB2 STACK BASE ADR A5,A6 LDK A2,/01 RESET PRINT BUFFER REMOTE AND LOCAL DUMMY CF A5,OUTPUT SEND DUMMY RCTP05 EQU * LDK A2,0 SC A2,DWTALN,A6 STORE 0 AS ACTUAL LINE NUMBER LDK A2,/0C LIFT TO TOP CF A5,OUTPUT IFT COMPL=1 * LDR A4,A4 STATUS CHANGE ? ABL(NE) TP645 XIF IFT RECOVY=1 LDK A2,/80 INDICATE POWER OFF ORS A2,8,A8 SET RETURN CODE XIF ABL TP100 SEND FIRST DUMMY CHARACTER RCTP10 ABL TDISP GO TO DISPATCHER EJECT * * B C D T B Y * * SUBROUTINE TO CONVERT TO BINARY FROM DECIMAL * * * BCDTBY LDR A2,A1 PUT DECIMAL NUMBER IJ A2 BCDTB1 SUK A2,/10 RF(N) BCDTB2 END SUK A1,6 DECREMENT BY 6 RB BCDTB1 BCDTB2 RTN A5 RETURN TO CALLER * * * EJECT * * * R E L E A S * * SUBROUTINE TO SEND LIFT TO TOP AND RELEASE * * * RELEAS EQU * LDK A1,0 ST A1,DWTRLN,A6 SET ACTUAL AND REQ. LINE NUMBER TO ZERO LDKL A3,BUF5 LIFT TO TOP AND RELEAS * * B U F C H R * * SUBROUTINE TO OUTPUT A NUMBER OF CHARACTERS GIVEN IN * FIRST CHARACTER IN OUTPUT BUFFER * * BUFCHR LCR A4,A3 GET NUMBER OF OUTPUT CHARACTERS ANK A4,/FF MASK BUFC10 ADK A3,1 INCREMENT BUFFER POINTER LCR A2,A3 GET OUTPUT CHARACTER CF A5,OUTPUT SEND CHARACTER SUK A4,1 DECREMENT COUNTER RB(NZ) BUFC10 NOT LAST CHARACTER RTN A5 RETURN TO CALLER * * * END