From 7c0865bb67ccbe2df226c050f702c49396ff337d Mon Sep 17 00:00:00 2001 From: Amber Date: Tue, 19 Nov 2024 14:32:39 -0500 Subject: [PATCH] folder and such for coding --- README.md | 2 +- code/README.md | 5 + code/assemble.sh | 2 + code/assist09.asm | 1737 +++++++++++++++++++++++++++++++++++++++++++++ code/boot.asm | 0 5 files changed, 1745 insertions(+), 1 deletion(-) create mode 100644 code/README.md create mode 100755 code/assemble.sh create mode 100644 code/assist09.asm create mode 100644 code/boot.asm diff --git a/README.md b/README.md index 0826d2f..ff82fc2 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,4 @@ Prototype 1 is currently in progress. It will be a much simpler system. It will ## License -This project is licensed under the MIT license. This applies to both the hardware (schematics, bill of materials, pcb layouts) and documentation. This does *not* apply to the datasheets/ directory. Files in that directory belong to their respective copyright holders. +This project is licensed under the MIT license. This applies to both the hardware (schematics, bill of materials, pcb layouts) and documentation. This does *not* apply to the datasheets/ directory, or code/assist09.asm. Those files belong to their respective copyright holders. diff --git a/code/README.md b/code/README.md new file mode 100644 index 0000000..d3e7fb0 --- /dev/null +++ b/code/README.md @@ -0,0 +1,5 @@ +# Code + +assist09.asm is the original motorola version, and relies on the as9 assembler found [here](http://home.hccnet.nl/a.w.m.van.der.horst/m6809.html). + +assemble.sh will assemble assist09.asm to an s19 file and use gnu binutils objcopy to turn that into a bin file. diff --git a/code/assemble.sh b/code/assemble.sh new file mode 100755 index 0000000..fb603bf --- /dev/null +++ b/code/assemble.sh @@ -0,0 +1,2 @@ +as9 assist09.asm -l s19 +objcopy --input-target=srec --output-target=binary assist09.s19 assist09.bin diff --git a/code/assist09.asm b/code/assist09.asm new file mode 100644 index 0000000..2804fdf --- /dev/null +++ b/code/assist09.asm @@ -0,0 +1,1737 @@ +************************************* +* COPYRIGHT (C) MOTOROLA, INC. 1979 * +************************************* + +************************************* +* THIS IS THE BASE ASSIST09 ROM. +* IT MAY RUN WITH OR WITHOUT THE +* EXTENSION ROM WHICH +* WHEN PRESENT WILL BE AUTOMATICALLY +* INCORPORATED BY THE BLDVTR +* SUBROUTINE. +************************************* + +********************************************* +* GLOBAL MODULE EQUATES +******************************************** +ROMBEG EQU $F800 ; ROM START ASSEMBLY ADDRESS +RAMOFS EQU -$1900 ; ROM OFFSET TO RAM WORK PAGE +ROMSIZ EQU 2048 ; ROM SIZE +ROM2OF EQU ROMBEG-ROMSIZ ; START OF EXTENSION ROM +ACIA EQU $E008 ; DEFAULT ACIA ADDRESS +PTM EQU $E000 ; DEFAULT PTM ADDRESS +DFTCHP EQU 0 ; DEFAULT CHARACTER PAD COUNT +DFTNLP EQU 5 ; DEFAULT NEW LINE PAD COUNT +PROMPT EQU '> ; PROMPT CHARACTER +NUMBKP EQU 8 ; NUMBER OF BREAKPOINTS +********************************************* + +********************************************* +* MISCELANEOUS EQUATES +********************************************* +EOT EQU $04 ; END OF TRANSMISSION +BELL EQU $07 ; BELL CHARACTER +LF EQU $0A ; LINE FEED +CR EQU $0D ; CARRIAGE RETURN +DLE EQU $10 ; DATA LINK ESCAPE +CAN EQU $18 ; CANCEL (CTL-X) + +* PTM ACCESS DEFINITIONS +PTMSTA EQU PTM+1 ; READ STATUS REGISTER +PTMC13 EQU PTM ; CONTROL REGISTERS 1 AND 3 +PTMC2 EQU PTM+1 ; CONTROL REGISTER 2 +PTMTM1 EQU PTM+2 ; LATCH 1 +PTMTM2 EQU PTM+4 ; LATCH 2 +PTMTM3 EQU PTM+6 ; LATCH 3 +SKIP2 EQU $8C ; "CMPX #" OPCODE - SKIPS TWO BYTES + +******************************************* +* ASSIST09 MONITOR SWI FUNCTIONS +* THE FOLLOWING EQUATES DEFINE FUNCTIONS PROVIDED +* BY THE ASSIST09 MONITOR VIA THE SWI INSTRUCTION. +****************************************** +INCHNP EQU 0 ; INPUT CHAR IN A REG - NO PARITY +OUTCH EQU 1 ; OUTPUT CHAR FROM A REG +PDATA1 EQU 2 ; OUTPUT STRING +PDATA EQU 3 ; OUTPUT CR/LF THEN STRING +OUT2HS EQU 4 ; OUTPUT TWO HEX AND SPACE +OUT4HS EQU 5 ; OUTPUT FOUR HEX AND SPACE +PCRLF EQU 6 ; OUTPUT CR/LF +SPACE EQU 7 ; OUTPUT A SPACE +MONITR EQU 8 ; ENTER ASSIST09 MONITOR +VCTRSW EQU 9 ; VECTOR EXAMINE/SWITCH +BRKPT EQU 10 ; USER PROGRAM BREAKPOINT +PAUSE EQU 11 ; TASK PAUSE FUNCTION +NUMFUN EQU 11 ; NUMBER OF AVAILABLE FUNCTIONS + +* NEXT SUB-CODES FOR ACCESSING THE VECTOR TABLE. +* THEY ARE EQUIVALENT TO OFFSETS IN THE TABLE. +* RELATIVE POSITIONING MUST BE MAINTAINED + +.AVTBL EQU 0 ; ADDRESS OF VECTOR TABLE +.CMDL1 EQU 2 ; FIRST COMMAND LIST +.RSVD EQU 4 ; RESERVED HARDWARE VECTOR +.SWI3 EQU 6 ; SWI3 ROUTINE +.SWI2 EQU 8 ; SWI2 ROUTINE +.FIRQ EQU 10 ; FIRQ ROUTINE +.IRQ EQU 12 ; IRQ ROUTINE +.SWI EQU 14 ; SWI ROUTINE +.NMI EQU 16 ; NMI ROUTINE +.RESET EQU 18 ; RESET ROUTINE +.CION EQU 20 ; CONSOLE ON +.CIDTA EQU 22 ; CONSOLE INPUT DATA +.CIOFF EQU 24 ; CONSOLE INPUT OFF +.COON EQU 26 ; CONSOLE OUTPUT ON +.CODTA EQU 28 ; CONSOLE OUTPUT DATA +.COOFF EQU 30 ; CONSOLE OUTPUT OFF +.HSDTA EQU 32 ; HIGH SPEED PRINTDATA +.BSON EQU 34 ; PUNCH/LOAD ON +.BSDTA EQU 36 ; PUNCH/LOAD DATA +.BSOFF EQU 38 ; PUNCH/LOAD OFF +.PAUSE EQU 40 ; TASK PAUSE ROUTINE +.EXPAN EQU 42 ; EXPRESSION ANALYZER +.CMDL2 EQU 44 ; SECOND COMMAND LIST +.ACIA EQU 46 ; ACIA ADDRESS +.PAD EQU 48 ; CHARACTER PAD AND NEW LINE PAD +.ECHO EQU 50 ; ECHO/LOAD AND NULL BKPT FLAG +.PTM EQU 52 ; PTM ADDRESS +NUMVTR EQU 52/2+1 ; NUMBER OF VECTORS +HIVTR EQU 52 ; HIGHEST VECTOR OFFSET + +****************************************** +* WORK AREA +* THIS WORK AREA IS ASSIGNED TO THE PAGE ADDRESSED BY +* -$1800,PCR FROM THE BASE ADDRESS OF THE ASSIST09 +* ROM. THE DIRECT PAGE REGISTER DURING MOST ROUTINE +* OPERATIONS WILL POINT TO THIS WORK AREA. THE STACK +* INITIALLY STARTS UNDER THE RESERVED WORK AREAS AS +* DEFINED HEREIN. +****************************************** +WORKPG EQU ROMBEG+RAMOFS ; SETUP DIRECT PAGE ADDRESS +* SETDP =WORKPG ; NOTIFY ASSEMBLER + ORG WORKPG+256 ; READY PAGE DEFINITIONS + +* THE FOLLOWING THRU BKPTOP MUST RESIDE IN THIS ORDER +* FOR PROPER INITIALIZATION + ORG *-4 +PAUSER EQU * ; PAUSE ROUTINE + ORG *-1 +SWIBFL EQU * ; BYPASS SWI AS BREAKPOINT FLAG + ORG *-1 +BKPTCT EQU * ; BREAKPOINT COUNT + ORG *-2 ; SLEVEL EQU +SLEVEL EQU * ; STACK TRACE LEVEL + ORG -NUMVTR*2+* +VECTAB EQU * ; VECTOR TABLE + ORG -2*NUMBKP+* +BKPTBL EQU * ; BREAKPOINT TABLE + ORG -2*NUMBKP+* +BKPTOP EQU * ; BREAKPOINT OPCODE TABLE + ORG *-2 +WINDOW EQU * ; WINDOW + ORG *-2 +ADDR EQU * ; ADDRESS POINTER VALUE + ORG *-1 +BASEPG EQU * ; BASE PAGE VALUE + ORG *-2 +NUMBER EQU * ; BINARY BUILD AREA + ORG *-2 +LASTOP EQU * ; LAST OPCODE TRACED + ORG *-2 +RSTACK EQU * ; RESET STACK POINTER + ORG *-2 +PSTACK EQU * ; COMMAND RECOVERY STACK + ORG *-2 +PCNTER EQU * ; LAST PROGRAM COUNTER + ORG *-2 +TRACEC EQU * ; TRACE COUNT + ORG *-1 +SWICNT EQU * ; TRACE "SWI" NEST LEVEL COUNT + ORG *-1 ; (MISFLG MUST FOLLOW SWICNT) +MISFLG EQU * ; LOAD CMD/THRU BREAKPOINT FLAG + ORG *-1 +DELIM EQU * ; EXPRESSION DELIMITER/WORK BYTE + ORG *-40 +ROM2WK EQU * ; EXTENSION ROM RESERVED AREA + ORG *-21 +TSTACK EQU * ; TEMPORARY STACK HOLD +STACK EQU * ; START OF INITIAL STACK + +****************************************** +* DEFAULT THE ROM BEGINNING ADDRESS TO 'ROMBEG' +* ASSIST09 IS POSITION ADDRESS INDEPENDENT, HOWEVER +* WE ASSEMBLE ASSUMING CONTROL OF THE HARDWARE VECTORS. +* NOTE THAT THE WORK RAM PAGE MUST BE 'RAMOFS' +* FROM THE ROM BEGINNING ADDRESS. +******************************************** + ORG ROMBEG ; ROM ASSEMBLY/DEFAULT ADDRESS + +***************************************************** +* BLDVTR - BUILD ASSIST09 VECTOR TABLE +* HARDWARE RESET CALLS THIS SUBROUTINE TO BUILD THE +* ASSIST09 VECTOR TABLE. THIS SUBROUTINE RESIDES AT +* THE FIRST BYTE OF THE ASSIST09 ROM, AND CAN BE +* CALLED VIA EXTERNAL CONTROL CODE FOR REMOTE +* ASSIST09 EXECUTION. +* INPUT: S->VALID STACK RAM +* OUTPUT: U->VECTOR TABLE ADDRESS +* DPR->ASSIST09 WORK AREA PAGE +* THE VECTOR TABLE AND DEFAULTS ARE INITIALIZED +* ALL REGISTERS VOLATILE +************************************************* +BLDVTR LEAX VECTAB,PCR ; ADDRESS VECTOR TABLE + TFR X,D ; OBTAIN BASE PAGE ADDRESS + TFR A,DP ; SETUP DPR + STA WORK AREA PAGE +* D,Y,U=UNRELIABLE X=AS CALLED FROM USER +* S=AS FROM SWI INTERRUPT +********************************************* + +************************************************** +* [SWI FUNCTION 8] +* MONITOR ENTRY +* FIREUP THE ASSIST09 MONITOR. +* THE STACK WITH ITS VALUES FOR THE DIRECT PAGE +* REGISTER AND CONDITION CODE FLAGS ARE USED AS IS. +* 1) INITIALIZE CONSOLE I/O +* 2) OPTIONALLY PRINT SIGNON +* 3) INITIALIZE PTM FOR SINGLE STEPPING +* 4) ENTER COMMAND PROCESSOR +* INPUT: A=0 INIT CONSOLE AND PRINT STARTUP MESSAGE +* A#0 OMIT CONSOLE INIT AND STARTUP MESSAGE +************************************************* + +SIGNON FCC /ASSIST09/ ; SIGNON EYE-CATCHER + FCB EOT +ZMONTR STS =0 VALID)/COMPARE CNT +* U-3=CARRIAGE RETURN FLAG (0=CR HAS BEEN DONE) +* U-4=START OF COMMAND STORE +* S+0=END OF COMMAND STORE +*********************************************** + +CMD SWI ; TO NEW LINE + FCB PCRLF ; FUNCTION +* DISARM THE BREAKPOINTS +CMDNEP LBSR CBKLDR ; OBTAIN BREAKPOINT POINTERS + BPL CMDNOL ; BRANCH IF NOT ARMED OR NONE + NEGB ; MAKE POSITIVE + STB ASSIST09 DIRECT PAGE WORK AREA +** Z=1 CARRIAGE RETURN ENTERED +** Z=0 NON CARRIAGE RETURN DELIMITER +** S=NORMAL RETURN ADDRESS +** THE LABEL "CMDBAD" MAY BE ENTERED TO ISSUE AN +** AN ERROR FLAG (*). +************************************************** +* ASSIST09 COMMAND TABLES +* THESE ARE THE DEFAULT COMMAND TABLES. EXTERNAL +* TABLES OF THE SAME FORMAT MAY EXTEND/REPLACE +* THESE BY USING THE VECTOR SWAP FUNCTION. +* +* ENTRY FORMAT: +* +0...TOTAL SIZE OF ENTRY (INCLUDING THIS BYTE) +* +1...COMMAND STRING +* +N...TWO BYTE OFFSET TO COMMAND (ENTRYADDR-*) +* +* THE TABLES TERMINATE WITH A ONE BYTE -1 OR -2. +* THE -1 CONTINUES THE COMMAND SEARCH WITH THE +* SECOND COMMAND TABLE. +* THE -2 TERMINATES COMMAND SEARCHES. +***************************************************** + +* THIS IS THE DEFAULT LIST FOR THE SECOND COMMAND +* LIST ENTRY. + +CMDTB2 FCB -2 ; STOP COMMAND SEARCHES + +* THIS IS THE DEFAULT LIST FOR THE FIRST COMMAND +* LIST ENTRY. + +CMDTBL EQU * ; MONITOR COMMAND TABLE + FCB 4 + FCC /B/ ; 'BREAKPOINT' COMMAND + FDB CBKPT-* + FCB 4 + FCC /C/ ; 'CALL' COMMAND + FDB CCALL-* + FCB 4 + FCC /D/ ; 'DISPLAY' COMMAND + FDB CDISP-* + FCB 4 + FCC /E/ ; 'ENCODE' COMMAND + FDB CENCDE-* + FCB 4 + FCC /G/ ; 'GO' COMMAND + FDB CGO-* + FCB 4 + FCC /L/ ; 'LOAD' COMMAND + FDB CLOAD-* + FCB 4 + FCC /M/ ; 'MEMORY' COMMAND + FDB CMEM-* + FCB 4 + FCC /N/ ; 'NULLS' COMMAND + FDB CNULLS-* + FCB 4 + FCC /O/ ; 'OFFSET' COMMAND + FDB COFFS-* + FCB 4 + FCC /P/ ; 'PUNCH' COMMAND + FDB CPUNCH-* + FCB 4 + FCC /R/ ; 'REGISTERS' COMMAND + FDB CREG-* + FCB 4 + FCC /S/ ; 'STLEVEL' COMMAND + FDB CSTLEV-* + FCB 4 + FCC /T/ ; 'TRACE' COMMAND + FDB CTRACE-* + FCB 4 + FCC /V/ ; 'VERIFY' COMMAND + FDB CVER-* + FCB 4 + FCC /W/ ; 'WINDOW' COMMAND + FDB CWINDO-* + FCB -1 ; END, CONTINUE WITH THE SECOND + +************************************************* +* [SWI FUNCTIONS 4 AND 5] +* 4 - OUT2HS - DECODE BYTE TO HEX AND ADD SPACE +* 5 - OUT4HS - DECODE WORD TO HEX AND ADD SPACE +* INPUT: X->BYTE OR WORD TO DECODE +* OUTPUT: CHARACTERS SENT TO OUTPUT HANDLER +* X->NEXT BYTE OR WORD +************************************************* +ZOUT2H LDA ,X+ ; LOAD NEXT BYTE + PSHS D ; SAVE - DO NOT REREAD + LDB #16 ; SHIFT BY 4 BITS + MUL ; WITH MULTIPLY + BSR ZOUTHX ; SEND OUT AS HEX + PULS D ; RESTORE BYTES + ANDA #$0F ; ISOLATE RIGHT HEX +ZOUTHX ADDA #$90 ; PREPARE A-F ADJUST + DAA ; ADJUST + ADCA #$40 ; PREPARE CHARACTER BITS + DAA ; ADJUST +SEND JMP [VECTAB+.CODTA,PCR] ; SEND TO OUT HANDLER + +ZOT4HS BSR ZOUT2H ; CONVERT FIRST BYTE +ZOT2HS BSR ZOUT2H ; CONVERT BYTE TO HEX + STX 4,S ; UPDATE USERS X REGISTER +* FALL INTO SPACE ROUTINE + +************************************************* +* [SWI FUNCTION 7] +* SPACE - SEND BLANK TO OUTPUT HANDLER +* INPUT: NONE +* OUTPUT: BLANK SEND TO CONSOLE HANDLER +************************************************* +ZSPACE LDA #' ; LOAD BLANK + BRA ZOTCH2 ; SEND AND RETURN + +*********************************************** +* [SWI FUNCTION 9] +* SWAP VECTOR TABLE ENTRY +* INPUT: A=VECTOR TABLE CODE (OFFSET) +* X=0 OR REPLACEMENT VALUE +* OUTPUT: X=PREVIOUS VALUE +*********************************************** +ZVSWTH LDA 1,S ; LOAD REQUESTERS A + CMPA #HIVTR ; ? SUB-CODE TOO HIGH + BHI ZOTCH3 ; IGNORE CALL IF SO + LDY STRING +* OUTPUT: CR/LF AND STRING SENT TO OUTPUT CONSOLE +* HANDLER. +* C=0 NO CTL-X, C=1 CTL-X RECEIVED +* NOTE: LINE FEED MUST FOLLOW CARRIAGE RETURN FOR +* PROPER PUNCH DATA. +************************************************** + +ZPDATA LDA #CR ; LOAD CARRIAGE RETURN + BSR SEND ; SEND IT + LDA #LF ; LOAD LINE FEED +* FALL INTO PDATA1 + +************************************************* +* [SWI FUNCTION 2] +* PDATA1 - OUTPUT STRING TILL EOT ($04) +* THIS ROUTINE PAUSES IF AN INPUT BYTE BECOMES +* AVAILABLE DURING OUTPUT TRANSMISSION UNTIL A +* SECOND IS RECEIVED. +* INPUT: X->STRING +* OUTPUT: STRING SENT TO OUTPUT CONSOLE DRIVER +* C=0 NO CTL-X, C=1 CTL-X RECEIVED +************************************************* + +ZPDTLP BSR SEND ; SEND CHARACTER TO DRIVER +ZPDTA1 LDA ,X+ ; LOAD NEXT CHARACTER + CMPA #EOT ; ? EOT + BNE ZPDTLP ; LOOP IF NOT +* FALL INTO PAUSE CHECK FUNCTION + +******************************************** +* [SWI FUNCTION 12] +* PAUSE - RETURN TO TASK DISPATCHING AND CHECK +* FOR FREEZE CONDITION OR CTL-X BREAK +* THIS FUNCTION ENTERS THE TASK PAUSE HANDLER SO +* OPTIONALLY OTHER 6809 PROCESSES MAY GAIN CONTROL. +* UPON RETURN, CHECK FOR A 'FREEZE' CONDITION +* WITH A RESULTING WAIT LOOP, OR CONDITION CODE +* RETURN IF A CONTROL-X IS ENTERED FROM THE INPUT +* HANDLER. +* OUTPUT: C=1 IF CTL-X HAS ENTERED, C=0 OTHERWISE +****************************************** + +ZPAUSE BSR XQPAUS ; RELEASE CONTROL AT EVERY LINE + BSR CHKABT ; CHECK FOR FREEZE OR ABORT + TFR CC,B ; PREPARE TO REPLACE CC + STB ,S ; OVERLAY OLD ONE ON STACK + BRA ZOTCH3 ; RETURN FROM "SWI" + +* CHKABT - SCAN FOR INPUT PAUSE/ABORT DURING OUTPUT +* OUTPUT: C=0 OK, C=1 ABORT (CTL-X ISSUED) +* VOLATILE: U,X,D +CHKABT BSR XQCIDT ; ATTEMPT INPUT + BCC CHKRTN ; BRANCH NO TO RETURN + CMPA #CAN ; ? CTL-X FOR ABORT + BNE CHKWT ; BRANCH NO TO PAUSE +CHKSEC COMB ; SET CARRY +CHKRTN RTS ; RETURN TO CALLER WITH CC SET +CHKWT BSR XQPAUS ; PAUSE FOR A MOMENT + BSR XQCIDT ; ? KEY FOR START + BCC CHKWT ; LOOP UNTIL RECEIVED + CMPA #CAN ; ? ABORT SIGNALED FROM WAIT + BEQ CHKSEC ; BRANCH YES + CLRA ; SET C=0 FOR NO ABORT + RTS ; AND RETURN + +* SAVE MEMORY WITH JUMPS +XQPAUS JMP [VECTAB+.PAUSE,PCR] ; TO PAUSE ROUTINE +XQCIDT JSR [VECTAB+.CIDTA,PCR] ; TO INPUT ROUTINE + ANDA #$7F ; STRIP PARITY + RTS ; RETURN TO CALLER + +******************************************** +* NMI DEFAULT INTERRUPT HANDLER +* THE NMI HANDLER IS USED FOR TRACING INSTRUCTIONS. +* TRACE PRINTOUTS OCCUR ONLY AS LONG AS THE STACK +* TRACE LEVEL IS NOT BREACHED BY FALLING BELOW IT. +* TRACING CONTINUES UNTIL THE COUNT TURNS ZERO OR +* A CTL-X IS ENTERED FROM THE INPUT CONSOLE DEVICE. +********************************************* + +MSHOWP FCB 'O,'P,'-,EOT ; OPCODE PREP + +NMIR BSR LDDP ; LOAD PAGE AND VERIFY STACK + TST LSAB FIXME + BNE CODTAD ; RELEASE CONTROL IF NOT + STA ,U ; STORE INTO DATA REGISTER + RTS ; RETURN TO CALLER +*E + +* BSON - TURN ON READ/VERIFY/PUNCH MECHANISM +* A IS VOLATILE + +BSON LDA #$11 ; SET READ CODE + TST 6,S ; ? READ OR VERIFY + BNE BSON2 ; BRANCH YES + INCA ; SET TO WRITE +BSON2 SWI ; PERFORM OUTPUT + FCB OUTCH ; FUNCTION + INC REGISTER TO PRINT + TST ,S ; ? CHANGE OPTION + BNE REGCNG ; BRANCH YES + TST -1,Y ; ? ONE OR TWO BYTES + BEQ REGP3 ; BRANCH ZERO MEANS ONE + SWI ; PERFORM WORD HEX + FCB OUT4HS ; FUNCTION + FCB SKIP2 ; SKIP BYTE PRINT +REGP3 SWI ; PERFORM BYTE HEX + FCB OUT2HS ; FUNCTION +REG4 LDD ,Y+ ; TO FRONT OF NEXT ENTRY + TSTB ; ? END OF ENTRIES + BNE REGP1 ; LOOP IF MORE + SWI ; FORCE NEW LINE + FCB PCRLF ; FUNCTION +REGRTN PULS PC,Y,X,A ; RESTORE STACK AND RETURN + +REGCNG BSR BLDNNB ; INPUT BINARY NUMBER + BEQ REGNXC ; IF CHANGE THEN JUMP + CMPA #CR ; ? NO MORE DESIRED + BEQ REGAGN ; BRANCH NOPE + LDB -1,Y ; LOAD SIZE FLAG + DECB ; MINUS ONE + NEGB ; MAKE POSITIVE + ASLB ; TIMES TWO (=2 OR =4) +REGSKP SWI ; PERFORM SPACES + FCB SPACE ; FUNCTION + DECB + BNE REGSKP ; LOOP IF MORE + BRA REG4 ; CONTINUE WITH NEXT REGISTER +REGNXC STA ,S ; SAVE DELIMITER IN OPTION +* ; (ALWAYS > 0) + LDD