IMD 1.16: 16/08/2007 16:28:48 user group 1-25  M68UGL1 0201061077USER-GROUP-LIBRARY \lxMDOSOV0 SY\DIR CMMDOSOV4 SYUG03S SAUG11S SAMDOS SYUG07S SA8UG15S SA$UG23S SA\MDOSOV6 SYUG19S SAMDOSOV1 SYlUG04S SAUG12S SAUG20S SAMDOSOV3 SYMDOSER SYUG08S SADUG16S SADUG24S SAhUG01S SAUG05S SA(UG13S SALUG21S SA4BACKUP CMUG09S SAPUG17S SApUG25S SAMDOSOV5 SYCOPY CMrUG02S SA UG10S SA`MDOSOV2 SYxUG06S SA0UG14S SAUG22S SADUG18S SA|uu+.HYHYwvz{67xS66~m? ~S@?@0201 CN0 LP0 DK0MDOSER SY 0&'L/&04315X%;$*DzU062T06336;!b~nWno%(4]_fo|  b\lrAD"gggg}*26'}O&*7606 Z&nn#Z&9 &Z&900l&l90l&l9 Z&9A%6290%62%9$l9@%j96hiJ&296dfJ&29$&P+O?'& ?% ?.' 9 '? ?6 ' 29'' 9O'9**  $ && ?$~ 09 I &KE?$~09   9090~_0 h0629_?&?.062 C06 0&9  & 90gf90hi9 440J&0 6290   J&110 ކOi OI670$1'24'.8'*9'& 320$'90? ?0j'&?.Y$u Vx~9?*?/% 629~*' '  f "uS|u~DK9LPFCRSCP`CNmHRzr 1 *Q{e W T Q NS*"' "!$%3l&l && l&l"!$E011n0~Ao'  ''  9? "! '  9&' ++& +|$~) 66?240?311116L6*5i+`32P@$Z73$O_ ?(?!I% ~C~+|_?3?*67)*0l&ll&l&&11~&0 09 |?3?+?$~C?26 HYHY01674 0+??31111  +  l&l 9    }* |S6]3&l f09~~  U Rz )&}* V )H7F $9ц 1 ' G$ 9 9W )}*7 _ 011n~϶?}& W~ K~ e~ ~ ~ & }*] &9 |b}*0 b}*9OZ& 2OZ&     $0 011n&~  V$]&u0  !' m& Y ̋HHH0 0'l >0 !' ]'~ ]&& '~ } &~ ~ $_ HHHH?( &   m&~  &  0 ? 'B_9 & ?'0 && ~ 0 ?'~ D'~  '~ ?0  0?"$ ? ?  ~ !'~ &\0 '   0 @'o o ooo?!]''?'; ? ?_B   ?0* '~  9       DDD  } &? ? 9  _  %*_  Yz &VFFFF# "GY9JO' V$]'~ RJ(&J*x&'0`J@&"?$ &~ c ? ? &~ g & sTxV VWX?)XV $~ kXJ'?(Z %J' Z_?]&J'bJ&8'\ O K5 }a& ZKL76^_76~m\VZ'5 սmVW0\]0&_9 90OP 9    TRS`Q?Tz\9?$V?/$11 X?&?/%9aJ8& ' |a?-9  ?.90`RTuvV9Tv'# XX?Tu'JYY$|X911~ goc' 9J*'9S>7=#I9n p{'j?' &9&l =7 _HY?)=?#3 *57='>&ܽ03'_\'05533 }>&|>Pm'С&~o 3?m''?' |4&|3ih 5 * $! 95;799?;.;9?7;:597979566$|5:&99979:G88$|7 0 7~626 29DDDD09#90 138 "#$ % &  ' ( )*+,-.INVALID MESSAGE \3 AT \8UNIF. I/O ERROR-STATUS=\3 AT \8PROM I/O ERROR-STATUS=\3 AT XXXX ON DRIVE X-PSN XXXX0MDOSOV SYs~/ ~1 ~3 ~5g0_\$uH6@?% 20 ~V S          6666666666 ~  >>>>>  FF {966~966&~A66+~I66-~Q229 N v M'  * /| x?%( x& z? ? z? v9V S  ~~66666666PO'н$~ RR?R  RWP '; YZ9R ]]?_]$~Y?'_g _ gUOT?_'~a&.%,_e[%& % [[  ~$~cab%'P &_~xaaR'$ a&~RS?&$ P&aRPm &m ' ' gc'~c_R[__[ [&OT?P &WƀO?ZWc?1?1U UOT?Wm+ ]cg'KR[_ $[\\?,RcY?)c\Y]] gR&~=] ][ & ]] a_R?&$SaaR?,Rc?(c[aY]~eWYgh&^gXXZe?'_bʀ]OT?P &UVP _9Pghef_` ۽XXe?'eY~F 9     POWP &~ɽtmkWii?P'~P]TTT-#~UVOT?]XXXXW?''~ƀWO?P UOT?Po o mm*~]UOT?]* OT?~R_%S__RZR&]] ?0?0[W]]*~ͽRS_R[\%R?.[\]][&ǽPʀ]]Wt?)]' ]oo OT?Y~{S\\_?(Y_\]]~_`$9 W?( 9TFVFVD6YYYO FZ,29__9[ab$ [aec9b|WW\7b?%39ZXX7b?%3O?*9]WX?-bm?)Y9н$11~UOT?Wm+ \: /11~'9 66~~~W~@~u~o~r90909S0op]''d*&ց.&PƂp]' *&ʍ:& 0?p 0?090 ;' ' 0 l&l9u #'zƀ ?6Bŀ& '@'?$ @?%?0]'Z0T?%0 ?')760' ?0 ?23*& B?$?$*1906?290?ƈp~6'-  ?-?&0 5?&?)   ?/%(?/$! 0m& _2W9 @&- $*?%$ ?%;'?/'; ~ ~~;'=;DK&~=J0 %Z=]' ?(Z ='=oo' 0=>=0  @ ? 09 0 =? $ ?(z?& ~6 @'' ?2oo?3oo  29'~ '~&~|'''~&'| &&o o  's$~?@}&~'~}*~%ml&l &}/%}& |&Ͻ 0}& }'7%"3&' &  ~$~~(~$6~&%}'  '!}, & '  $~%~}&| &P~9}. ~% ~% }.~9E}+ H}'D~$~O}+ ?.]'~ǁ$L}&| '~%B}*~~}'7TTTT3% 90:%9ʀ  ' 73]' 9X~~>>> _B@>@'~/&~1 &a$~<CI@}B&'''~8~}E>D'|D@ - Z.k$~<%_ F$~@}D'Z& 'M&ZJ@C?%k$~<&~C&(%@G@G?/'Gk% L'S& &8@}D'}F& $~<}I'~@}C'~IU@o_96'&|I]*'G zG' ~$~@}B'H' 6' E&|I D' J}B&t@&iE%K&~Q}I'&}B'&zK' %ؽ %}J&̽% &@&'m&jj~; 0] 9 U  }B&   7>@39>@9@@> @9@ %%"$1111~QXXXX% % 90%% *% 9}E+99JJ97 &a39 k% k9@?/9@}E&M&ZJ97%3b@9C39>9   >>~~X~N'~B PQ&P NNo_9P'' N '~N''&?8'~:N@' D &'8&]'/?/')N!"?/%o N ?ߤ]'~:Noo&~, &QN'~FR VDDD-#~JTUS?RXXXXV?'?N S?N ?'?"%~,0] 9   &0o_90?&\TTT-R# L ?0XXXX?'''0 ?'6 ?20?90 9  &~ 0 ' & ?$~ӽ'M    '~&& ?_9 ?%~ '   ?' ?'??  @?%!?&~e 9   ??9HHHH?(VVV9"(ss~yFr&~#@ &~'tr''~Kt&.~+Wo_9t'r?'&~~| t &~/at&~r ?'?$' ? ?r&~~3r' '~Goo oowr yv?y*~7r y:m+Z&~7r~}'~W?6'~m ' ?'wry w?&rwr ?'yw?~r r?' ' ' t@&~/ar&t& r62''& t&~Kt&~r ?'?$&~;&~?&~C ? ?r~C' ''~K}'~rrr ?'?$r?%?'?$rW?7m&~~t&~+``&a~0] 9           r9tr$11~O9$XssF~y~:@m9vTAPE UG25S "/ ) :1 0,LXO=ROMDIAG:1 1 XO=PUTRC:1 ,MAP:1,ABS:1,OVLY:1,FINI:1 sEND CHAINHHHHC'1~w? $0 |  ?' |? %@'C\&|0$ ']'Z 09)~w~||~9*'..'*WJ'tC'fL'_^S&~^T'%2 6~'? 2.&4? ? $~ #6?/  2~Ѷ~ |@L&W& Ҷ~ O 6?&%2M' ~&? ||xw_?9 &4'3~w+4 ?& ?&? ~y~?'||||62&~9 ? ???oo0+( # + . |7xy~Z&3Z&9&p~ !_?o_!Z?!]!0&%!] !3&!_!!a!_?' RI S ? '~ U~ H @'E @' {'3j? , ?%?%E?%?%j?%?%!*? =3O? ? _3!6!:!80CM!C!6?]&*!6!:?'''' ? ~ !S? ƀ?#~  MDOS . !f!WHAT?!f!cN  ( 0BCOMMANDSYNTAXERROR 05NAMEREQUIRED 06\0DOESNOTEXIST 08\0DUPLICATEFILENAME 1BFILENAMENOTFOUND 1ADUPLICATEFILENAME 0DOPTIONCONFLICT 30CHAINABORTED--BREAKKEY 31CHAINABORTED--SYSTEMERRORSTATUSWORD 1CFILEISDELETEPROTECTED 24DEVICENOTREADYAT\8 0EINVALIDTYPEOFOBJECTFILE 0FINVALIDLOADADDRESS 13INVALIDFILETYPE 1ECONFLICTINGFILETYPES 1F\0HASINVALIDFILETYPE 27INVALIDDATATRANSFERTYPEAT\8 22DEVICEALREADYRESERVEDAT\8 23DEVICENOTRESERVEDAT\8 25FILENOTOPENORALREADYOPENAT\8 26ENDOFFILEAT\8 29BUFFEROVERFLOWAT\8 2ACHECKSUMERRORAT\8 15LOGICALSECTORNUMBEROUTOFRANGE 07ILLEGALFILENAME 2BFILEISWRITEPROTECTEDAT\8 20\0ISWRITEPROTECTED 09NOSUCHDEVICE 04ILLEGALDRIVENUMBER 12INVALIDEXECUTIONADDRESS 0AINVALIDDEVICE 11INVALIDRIB 1DTOOMANYSOURCEFILES 16ILLEGALSTART/ENDSPECIFICATIONS 17ILLEGALPAGEFORMAT 14FILEEXHAUSTEDBEFORELINEFOUND 28ENDOFMEDIAAT\8 18ILLEGALLINENUMBERORRANGE 19LINENUMBERENTEREDBEFORESOURCEFILE 02DIRECTORYSPACEFULL 03DISKSPACEFULL 10NOTENOUGHSEGMENTDESCRIPTORSPACE 2CINVALIDDIRECTORYENTRYNO.AT\8 2DCANNOTDE-ALLOCATEALLSPACE-DIRECTORYENTRYEXISTSAT\8 2ERECORDLENGTHTOOLONGAT\8 0CINTERNALSYSTEMERRORAT\8 21INVALIDSCALL 2FCHAINOVERLAYCANNOTBEFOUNDORLOADED 32CHAINABORTED--ILLEGALOPERATOR 33CHAINABORTED--UNDEFINEDLABEL 34CHAINABORTED--PREMATUREENDOFFILE  , h! $0200 _"""g"")1#  "u_""" SYNTAX ERRORSYSTEM SECTOR COPY/VERIFY ERRORDIRECTORY READ/WRITE ERRORSOURCE FILE COPY ERROROBJECT FILE CREATION COPY ERRORCANNOT DELETE DUPLICATE NAMEDRIVE 1 SCRATCH? APPEND TO DRIVE 1?DISK NAME: DATE(MMDDYY): USER NAME: NO FILES TO COPYDELETE FILE NOS.: NEW NAME: STARTING TO COPY FILESINSUFFICIENT MEMORYENTER FILE COPY SELECTION COMMANDS: SAVE (S), DELETE (D), PRINT (P), QUIT (Q), NO MORE (CR)S, D, P, Q, (CR):.  NOT FOUND .SECTOR  OFFSET DR0- DR1-COPYING . - DUPLICATION: IS IT TO BE COPIED? NOT COPIEDCOPYINGMDOS SY OV0OV1OV2OV3OV4OV5OV6ER  O? ' '$;&Y$С' $& :Y 11!+!a&!s. ? Y'?O)L1!.~$~& ? ~/!&J!9!&L !&  9 |%9|#(9|&9|"9|$9'&z'# ~-+'&|' " $z $:A$C$D$I$L$N$R${S$U$V$sY$Z$$&-97/QM??$HYIOPO}!*DVOPDVFNMST_?/"f!+. *,&(*,&(%>MQ|-7&(3%.Z&$'-*O,,-?-$?),Y&(Y&~/~/~/OPTFTF[\Y*,9HZ&;?$Z%$%%?.$$b$9++$Z%%%%?&,*O J'$b% $b%9%%$%%?.$f$H%$&$f9!&? 9z-&<-?49?2% Z' %?5?390 $%DDRIVE : DISK I.D. : . !WDSCN0 *NO SDW'S* NO DIRECTORY ENTRY FOUND TOTAL NUMBER OF SECTORS : /$ TOTAL DIRECTORY ENTRIES SHOWN : /$ NO TERMINATOR FOUND IN FILE'S R.I.B. ]'/l&l&& #0m&jj& Z&&96dfJ&29]&~'l&l'''''''o%'l '670 'Z&32'l&ll&lj ,' m&jj'l&lj&'O9'd $0 Z&9  ANAMCBCDHX INCHNPEQU$FAA0 ALLONEEQU$FAF4 ORG$FAA5 *REV.1.0BYMOTOROLAMICROSYSTEMSMARCH15,1977 * *ALLREFERENCESTOROUTINEVIAEXBUGSHOULD *USEEXBUG'SJUMPVECTORENTRYAT$F006 * *INPUTONEHEXADECIMALCHARCONVERTTOBCD *NEGCONDITIONCODE,RESET=GOODHEX;SET=NOT IN1HBSRINCHNP CBCDHXCMPA#$30(CONVERTBCDTOHEX) BMIIN1HBNOTHEX CMPA#$39 BLEIN1HGGOODHEX CMPA#$41 BMIIN1HBNOTHEX CMPA#$46 BGTIN1HBNOTHEX SUBA#7 IN1HGANDA#$FMASKTOBCD-RESETNEGCODE RTS IN1HBTSTALLONESETNEGCONDITIONCODE RTS END CNAMINCHNP MTTYSIEQU$FCF4 MTTYDIEQU$FCF5 AECHOEQU$FF53 OUTCHEQU$F9DC ORG$FA8B *REV.1.0BYMOTOROLAMICROSYSTEMSMARCH15,1977 * *ALLREFERENCESTOROUTINEVIAEXBUGSHOULD *USEEXBUG'SJUMPVECTORENTRYAT$F015 * *INPUTONECHARINTOA-REGISTER INCHLDAAMTTYSI ASRA BCCINCHRECEIVENOTREADY LDAAMTTYDIINPUTCHAR TSTAECHO BNE*+5NON-ECHO JMPOUTCHECHOCHARACTER CLRAECHORESETNON-ECHOFLAG RTSNON-ECHO *INPUTONECHAR-REMOVEPARITY INCHNPBSRINCH ANDA#$7F RTS END ENAMINCH MTTYSIEQU$FCF4 MTTYDIEQU$FCF5 AECHOEQU$FF53 OUTCHEQU$F9DC ORG$FA8B *REV.1.0BYMOTOROLAMICROSYSTEMSMARCH15,1977 * *ALLREFERENCESTOROUTINEVIAEXBUGSHOULD *USEEXBUG'SJUMPVECTORENTRYATF012 * *INPUTONECHARINTOA-REGISTER INCHLDAAMTTYSI ASRA BCCINCHRECEIVENOTREADY LDAAMTTYDIINPUTCHAR TSTAECHO BNE*+5NON-ECHO JMPOUTCHECHHOCHARACTER CLRAECHORESETNON-ECHOFLAG RTSNON-ECHO *INPUTONECHAR-REMOVEPARITY INCHNPBSRINCH ANDA#$7F RTS END G NAMOUTCH MTTYSOEQU$FCF4 MTTYDOEQU$FCF5 CASSETEQU$FF62 SPEEDEQU$FF02 ORG$F9CF *REV.1.0BYMOTOROLAMICROSYSTEMSMAR  CH15,1977 * *ALLREFERENCESTOROUTINEVIAEXBUGSHOULD *USEEXBUG'SJUMPVECTORENTRYAT$F018 * *OUTPUTCHARACTERFROMACCUMULATOR-A OCHARPSHB OCHAR1LDABMTTYSO BITB#2 BEQOCHAR1 STAA$FCF5 PULB RTS *OUTPUTCHARACTERFROMACCUMULATORA *IF30CPSANDTITERMINALPAD4NULLSAFTERC/R *IF120CPS&TITERN.HHM.PAD23NULLSAFTERC/R *ANDPAD3NULLSAFTEROTHERCHAR * OUTCHPSHBSAVEB-REG OUTC1LDABMTTYSO BITB#%00000010 BEQOUTC1TRANSMITNOTREADY STAAMTTYDOOUTPUTCHAR CMPA#$D BNEOUTCH5NOTC/R TSTCASSET BNEOUTCH3PUNCHING LDAB#23 TSTSPEED BEQOUTCH910CPSPRINTING BMIOUTCH7 OUTCH3LDAB#4 OUTCH7EQU* PSHA LDAA#0NULL BSROCHAROUTPUTCHAR PULA DECB BNEOUTCH7MORENULLS OUTCH9PULB RTS OUTCH5TSTSPEED BPLOUTCH9NOTC/R;10OR30CPS TSTCASSET BNEOUTCH9PUNCHING PAGE LDAB#3120CPSPRINTING;NOTC/R BRAOUTCH7 OUT2HLDAA0,XOUTPUT2HEXCHAR BSRCHEXLFORMLEFTHEXCHAR BSROUTCHOUTPUTCHAR LDAA0,X BSRCHEXRFORMRIGHTHEXCHAR BSROUTCHOUTPUTCHAR INX RTS ORG$F9C0 CHEXLLSRACONVERTLEFTBCDDIGITTO4 LSRA LSRA LSRA CHEXRANDA#$FCONVERTRIGHTDIGITTOHEX ADDA#$30 CMPA#$39 BLSCHEX1IS30-39 ADDA#$7 CHEX1RTS END JNAMPDATA OUTCHEQU$F9DC ORG$FA33 *REV.1.0BYMOTOROLAMICROSYSTEMSMARCH15,1977 * *ALLREFERENCESTOROUTINEVIAEXBUGSHOULD *USEEXBUG'SJUMPVECTORENTRYAT$F024 * *PRINTDATAPOINTEDATBYX-REG PDATABSRPCRLFPRINTC/R,L/F PDATA1LDAAX CMPA#4 BEQPDATA9STOPONEOT BSROUTCHOUTPUTCHAR INX BRAPDATA1 PDATA9RTS PCRLFLDAA#$APRINTL/FC/RNULL BSROUTCH PCRLDAA#$DPRINTC/RNULL BSROUTCH LDAA#0 BSROUTCH RTS END L NAM CVBTD *REVISION 1 *CONVERT BINARY TO DECIMAL & STORE 5 CHAR *CALLING SEQUENCE *(A,B) BINARY VALUE *(X) POINTER TO STORE DECIMAL CHARS *JSR CVBTD CONVERT *TEMPORARY STORAGE SAVEA RMB 1 ACCUMULATOR A SAVEX RMB 2 STORE DATA POINTER SAVEX1 RMB 2 POINTER TO CONSTANTS CVBTD STX SAVEX SAVE DATA POINTER LDX #K10K (X) POINTER TO CONSTANTS CVDEC1 CLR SAVEA INZ DEC CHAR CVDEC2 SUB B 1,X SBC A 0,X BCS CVDEC5 OVERFLOW INC SAVEA INC CHAR BEING BUILT BRA CVDEC2 CVDEC5 ADD B 1,X RESTORE PARTICAL RESULT ADC A 0,X PSH A STX SAVEX1 LDX SAVEX X-STORE CHAR POINTER LDA A SAVEA ADD A #$30 MAKE ASCII CHAR STA A 0,X PUL A RESTORE A INX STX SAVEX LDX SAVEX1 X-POINTER TO CONSTANTS INX INX CPX #K10K+10 BNE CVDEC1 RTS *CONSTANTS FOR CONVERSION K10K FDB 10000 FDB 1000 FDB 100 FDB 10 FDB 1 END  N NAM HISPDMUP * DOUBLE PRECISION UNSIGNED BINARY * MULTIPLICATION * (PH,PL) * (QH,QL) --INTO-- (A,B,QH,QL) * * * * * * * * *****ANYWHERE IN READ/WRITE * * * MEMORY * * * * *****IN MEMORY WITHIN * ADDRESS RANGE 0 TO 255. * * NOT REENTRANT CODE * * SOURCE INSTRUCTINS: 14 * PROGRAM: 28 BYTES * DATA AND SCRATCH: 4 BYTES * RUNNING TIME: * MINIMUM: 467 CYCLES * MAXIMUM: 563 CYCLES * * BOTH OPERANDS INITIALLY IN MEMORY * WITHIN ADDRESS RANGE 0 THRU 255. * * PRODUCT RETAINED IN REGISTES * "A" (MOST SIGNIFICANT BYTE) AND * "B" (2ND MOST SIGNIFICANT BYTE) * AND IN MEMORYLOCATINS INITIALLY * OCCUPIED BY THE MULTIPLIER (QH AND QL). * ORG 0 PH RMB 1 PL RMB 1 QH RMB 1 QL RMB 1 SPC 2 ORG $100 SPC 2 LDX #16 CLRA CLRB ROR QH ROR QL NXT BCC ROTAT ADDB PL ADCA PH ROTAT ROR A RORB ROR QH ROR QL DEX BNE NXT END Q NAM DIV16 * REVISION 1 * 16 BIT UNSIGNED DIVIDE (16 BIT RESULT) * A,B DIVIDED BY (X),(X+1) * RESULT IN A,B (X),(X+1) UNCHANGED DIV16 PSHB DIVIDEND TO STACK PSHA LDAA X LDAB 1,X PSHB DIVISOR TO STACK PSHA DES LEAVE ROOOM FOR COUNT TSX (X) POINTER TO STACKED DATA LDAA #1 TST 1,X BMI DIV153 DIV151 INCA ASL 2,X ROL 1,X BMI DIV153  CMPA #17 BNE DIV151 DIV153 STAA 0,X SAVE COUNT LDAA 3,X LDAB 4,X CLR 3,X CLR 4,X * STACK LOOKS LIKE * +0 COUNT * +1 MS BYTE OF DIVISOR * +2 LS BYTE * +3 MS BYTE OF DIVIDEND * +4 LS BYTE * +5 MS BYTE RETURN ADDRESS * +6 LS BYTE DIV163 SUBB 2,X SBCA 1,X BCC DIV165 DIVISOR STILL OK ADDB 2,X DIVISOR TOO LARGE ADCA 1,X RESTORE CLC BRA DIV167 DIV165 SEC DIV167 ROL 4,X ROL 3,X LSR 1,X ADJUST DIVISOR ROR 2,X DEC 0,X BNE DIV163 * CLEAN UP STACK INS INS INS PULA PULB RTS END  T  NAM RENTMUP * DOUBLE PRECISION UNSIGNED BINARY * MULTIPLICATION * (PH,PL) * (QH,QL) --INTO-- (A,B,QH,QL) * * REEN  TRANT CODE * * SOURCE INSTRUCTIONS: 16 * PROGRAM: 27 BYTES * DATA AND SCRATCH: 5 BYTES * RUNNING TIME: * MINIMUM: 558 CYCLES * MAXIMUM: 718 CYCLES * * BOTH OPEERANDS INITIALLY IN STACK * AND OBTAINED BY INDEXED ADDRESSING * * PRODUCT RETAINED IN REGISTERS * "A" (MOST SIGNIFICANT BYTE) AND * "B" (2ND MOST SIGNIFICANT BYTE) * AND IN THE SSTACK (LEAST * SIGNIFICANT TWO BYTES), * * THIS REENTRANT CODED VERSION ASSUMES * THAT DATA HAS BEEN PLACED IN A STACK * AS INDICATED BELOW: * * SP --- * X1 --- BLANK (NOT USED) * BLANK  (NOT USED) * BLANK (FOR BITS TO GO) * QH (MSB OF MULTIPLIER) * QL (LSB OF MULTIPLIER) * PH (MSB OF MULTIPLICAND) * PL (LSB OF MULTIPLICAND) * * THE TOP TWO BYTES OF THE STACK ARE *  NOT USED BY THIS PROGRAM. THEY ARE * INTENDED FOR A RETURN ADDRESS IF THE * PROGRAM IS TO BE USED AS A * SUBROUTINE.  IN THE LATTER CASE THE * FOLLOWING STATEMENT SHOULD BE ADDED * AT THE END OF THE PROGRAM: * RTS * * THE PROGRAM USES OP-CCODE TSX TO ENTER * AN ADDRESS X1 INTO THE INDEX REGISTER, * AS INDICATED ABOVE. * * THE PRODUCT, COMPRISING FOUR BYTES, * IS SAVED IN REGISTERS "A" AND "B" AND * IN THE STACK AT LOCATINS INDICATED * ABOVE BY "QH" AND "QL". * ORG 0 SPC 2 TSX LDAA #16 STAA 2,X CLRA CLRB ROR 3,X ROR 4,X NNEXT BCC RROTN ADDB 6,X ADCA 5,X RROTN RORA RORB ROR 3,X ROR 4,X DEC 2,X BNE NNEXT END XXW  NAM M68RIO *+ NAM:M68RIO VER:1.2 DAT:07-10-75 CMP:M6800 * * SYS:M68RES * * DES:THIS IS THE M6800 RESIDENT I/O PACKAGE * FOR USE WITH THE RESIDENT EDITOR AND * RESIDENT ASSEMBLER UTILIZING EXBUG 1.1 * * REV:0 *-  SPC 2  OPT OT=M68RIOT  OPT SYMBOLS  PAGE * *************************************** * *************************************** * * THIS IS THE I/O DRIVER REGION * THE FOLLOWING DRIVER ROUTINES ARE REQUIRED: * * CI CONSOLE DEVICE INPUT ROUTINE. RETURNS WITH * INPUT CHARACTER IN A-REGISTER. DOES NOT * ECHO CHARACTER * * CIE CONSOLE DEVICE INPUT ROUTINE. SAME AS CI * BUT ECHOS CHARACTER. * * CO CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER * IN A-REGISTER. * * POC PUNCH DEVICE OUTPUT CHARACTER ROUTINE. * OUTPUTS CHARACTER IN A-REGISTER. TURNS * PUNCH ON. * * POR PUNCH DEVICE OUTPUT RECORD ROUTINE. * OUTPUTS CHARACTER STRING POINTED TO BY * X REGISTER AND TERMINATED BY $04. TURNS * PUNCH ON AND OFF. * * RIC READER DEVICE INPUT CHARACTER ROUTINE.   * READS RECORD INTO BUFFER IF BUFFER EMPTY. * RETURNS WITH NEXT CHARACTER FROM BUFFER IN *  A-REGISTER IF NO TIME OUT OCCURRED, AND * ALSO RESETS CARRY. IF TIME OUT OCCURRED, * CARRY IS SET AND A-REGISTER CONTAINS $1A. * TURNS PUNCH OFF BEFORE READING. CARRIAGE * RETURN ENDS RECORD. * * RIR READER DEVICE INPUT RECORD ROUTINE. READS * RECORD INTO BUFFER. TURNS PUNCH OFF * BEFORE READING. CARRIAGE RETURN ENDS * RECORD. * * ********************************************** * **********************************************  PAGE * EXBUG EQUATES INCHNP EQU $F015 EXBUG CHARACTER INPUT PDATA EQU $F024 PRINT CR LF DATA STRING PDATA1 EQU $F027 PRINT DATA STRING NO CR/LF PCRLF EQU $F021 PRINT CR/LF OUTCH EQU $F018 OUTPUT CHAR - - PAD NULLS * PER SPEED OCHAR EQU $F9CF OUTPUT CHAR - - NO NULLS AECHO EQU $FF53 INCHNP NO ECHO FLAG CASSET EQU $FF62 EXBUG PUNCH FLAG SPEED EQU $FF02 EXBUG SPEED FLAG * 0=10, 1=30, FF=120 CPS MTTYDI EQU $FCF5 MAID TTY DATA IN MTTYDO EQU $FCF5 MAID TTY DATA OUT MTTYSI EQU $FCF4 MAID TTY STATUS IN MTTYSO EQU $FCF4 MAID TTY STATUS OUT SBIT EQU $FCFD STOP BIT CONTROL FOR ACIA EXBUG EQU $F564 EXBUG ENTRY POINT  SPC 5 * ASSEMBLER AND ED TOR ENTRY LOCATIONS  SPC 1 ASTART EQU $8F4 ASSEMBLER ENTRY POINT ESTART EQU $1641 EDITOR ENTRY POINT  SPC 5  ORG $F0 * I/O FLAG AND STORAGE AREA SAVEX RMB 2 X REG STORAGE RCEMT RMB 1 READ BUFFER EMPTY FLAG RCGCPT RMB 2 READ GET CHAR POINTER NTIMEO RMB 1 RIR NO TIME OUT FLAG PNCH RMB 1 PUNCH ON FLAG NECHO RMB 1 CI NO ECHO FLAG  PAGE  ORG $100 * I/O JUMP TABLE ASM JMP ASTART ENTER ASSEMBLER ED JMP ESTART ENTER EDITOR XIOINT JMP INXIO INITIALIZE IO XPOC JMP POC PUNCH OUTPUT - CHAR XPOR JMP POR PUNCH OUTPUT - RECORD XRIC JMP RIC READER INPUT - CHAR XRIR JMP RIR READER INPUT - RECORD XCO JMP CO CONSOLE OUTPUT XCI JMP CI CONSOLE INPUT - NO ECHO XCIE JMP CIE CONSOLE INPUT - ECHO XDATA JMP PDATA PRINT CR LF DATA STRING XDATA1 JMP PDATA1 PRINT DATA STRING XCRLF JMP PCRLF PRINT CR LF XLEAD JMP LEAD PUNCH LEADER-TRAILER XNCHON JMP PNCHON TURN PUNCH ON XNCHOF JMP PNCHOF TURN PUNCH OFF XBUG JMP EXBUG ENTER EXBUG XHEAD JMP XDATA PRINT ASSEMBLY HEADING XLINE JMP XDATA1 PRINT ASSEMBLY LINE JUMP1 JMP * RESERVED JUMP LOCATION JUMP2 JMP * RESERVED JUMP LOCATION  PAGE * SUBROUTINE TO INITIALIZE IO FLAGS INXIO EQU *  CLR RCEMT READ BUFFER EMPTY  CLR PNCH PUNCH IS OFF  CLR NTIMEO TIME OUT  CLR NECHO ECHO  RTS  SPC 5 * SUBROUTINE TO INPUT CHARACTER FROM CONSOLE CI EQU * CONSOLE INPUT  INC NECHO NO ECHO ENTRY  CIE TST NECHO ECHO ENTRY  BEQ CI1  INC AECHO SET NO ECHO FLAG CI1 JSR INCHNP EXBUG CHARACTER INPUT *** STRIP CHARACTERS FROM INPUT ***  LDX #NCHAR CI2 CMP A X BAD CHAR?  BEQ CIE YES - IGNORE CHAR  INX NO-KEEP CHECKING  CPX #ENCHAR DONE?  BNE CI2 NO ***********************************  CLR NECHO YES-RESET NECHO FLAG  RTS  SPC 5 * SUBROUTINE TO OUTPUT CHARACTER TO CONSOLE CO EQU *  CMPA #$09 TAB?  BNE CO1 NOT TAB  LDAA #$20 CHANGE TAB TO SPACE CO1 CMP A #$D C/R?  BNE CO2 NO  BSR XCRLF YES-OUTPUT CR LF CO2 JSR OUTCH OUTPUT CHAR CO4 RTS  PAGE * SUBROUTINE TO PUNCH 5 INCHES OF BLANK TAPE LEAD EQU *  LDAB #50 5 IN=50 CHARS LEAD1 CLRA  BSR XPOC PUNCH NULL  DECB  BNE LEAD1 NOT DONE  BRA XNCHOF TURN PUNCH OFF   SPC 5 * SUBROUTINE TO PUNCH CHARACTER POC EQU *  BSR XNCHON TURN PUNCH ON  CMPA #$D CR?  BNE XCO NO-OUTPUT CHAR  TST SPEED YES-SPEED = 120?  BPL XCO NO-OUTPUT CHAR  STX SAVEX YES-STORE X REG  LDX #$5DC0 DELAY FOR CASSETTE UP DEX  BNE UP  LDX SAVEX RESTORE X REG  JMP XCO OUTPUT CHAR  SPC 5 * SUBROUTNE TO PUNCH DATA STRING POR EQU *  BSR XNCHON TURN PUNCH ON POR1 LDA A X GET CHAR  CMP A #4 CHAR = 4?  BEQ XNCHOF YES-TURN PUNCH OFF  JSR OUTCH NO-OUTPUT CHAR  INX CONTINUE  BRA POR1  SPC 5 * SUBROUTINE TO READ RECORD - CHARACTER ORIENTED RIC EQU *  TST RCEMT BUFFER EMPTY?  BNE RIR19 NO-GET NEXT CHAR  CLR NTIMEO YES-RESET NTIMEO FLAG  BRA RIR3 READ RECORD  SPC 2 * SUBROUTINE TO READ RECORD - RECORD ORIENTED RIR INC NTIMEO SET NTIMEO FLAG RIR3 LDX #RCBUF FILL BUFFER WITH CR'S  LDAA #$D RIR71 STAA X  INX  CPX #RCBUF+72 DONE?  BNE RIR71 NO-KEEP FILLING  TST PNCH YES-PUNCH ON?  BEQ RDR NO-GO TEST SPEED  JSR XNCHOF YES-TURN PUNCH OFF  SPC 1  SPC 1 RDR TST SPEED  BPL RDR08 10 OR 30 CPS RDR06 LDAA #$10 RDC ATTENTION  JSR OCHAR  LDAA #'7 BLOCK FWD  JSR OCHAR  BRA RDR09  SPC 1 RDR08 LDAA SBIT READER RELAY ON  ANDA #$55  STAA MTTYSO  SPC 1  LDAA #$11 DC1 READER ON  JSR OUTCH  SPC 1 RDR09 EQU *  LDX #RCBUF READ RECORD INTO BUFFER RDR11 SEC  JSR INCT INPUT CHAR  SPC 1  STAA X STORE CHAR  BCS RDR31 TIME OUT-STOP READING  CMPA #$D C/R?  BEQ RDR31 YES-STOP READING  SPC 1  CPX #RCBUF+71 BUFFER FULL?  BEQ RDR11 YES-SKIP REST OF RECORD  INX  BRA RDR11 GET NEXT CHAR RDR31 EQU *  SPC 1  CLR NTIMEO RESET NTIMEO FLAG  LDAA SBIT READER RELAY OFF  ANDA #$35  STAA MTTYSO   LDAA #$13 READER OFF  JSR OUTCH  LDAA MTTYDI RESET ACIA INPUT BUFFER(S)  LDAA MTTYDI (BOTH BUFFERS)  SPC 1  INC RCEMT SET BUFFER NOT EMPTY  LDX #RCBUF INZ GET CHAR POINTER  STX RCGCPT  SPC 1 RIR19 LDX RCGCPT GET NEXT CHAR  LDAA X (A) CHAR  INX INC GET CHAR POINTER  STX RCGCPT SAVE GET CHAR POINTER  CMPA #$1A END OF TEXT?  BEQ RIR33 YES  CMPA #$D CR?  BNE RIR31 NOT C/R RIR33 CLR RCEMT SET BUFFER EMPTY RIR31 RTS  SPC 5 * SUBROUTINE TO TURN PUNCH ON PNCHON EQU *  TST PNCH PUNCH ALREADY ON?  BNE P20 YES-RETURN  PSH A NO-SAVE A REG  INC PNCH SET PUNCH ON FLAG  INC CASSET SET CASSETTE FLAG * TURN TI PRINTER OFF AT 30 OR 120 CPS *  TST SPEED  BEQ PH353 10 CPS  LDAA #$10 ATTENTION OF RDC  JSR OCHAR  LDAA #'0 TURN PRINTER OFF  JSR OCHAR PH353 EQU * *** SEND RUBOUT BEFORE PUNCH ON ****************  LDA A #$7F  JSR OCHAR *********************************************  LDAA #$12 TURN TTY PUNCH ON  JSR OCHAR OUTPUT CHAR  PUL A RESTORE A REG P20 RTS  PAGE * SUBROUTINE TO TURN PUNCH OFF PNCHOF EQU *  LDAA #$14 TURN TTY PUNCH OFF  JSR OCHAR OUTPUT CHAR  TST SPEED TURN TI PRINTER ON  BEQ PUN325 10 CPS-SKIP PRINTER ON  LDAA #$10 RDC ATTENTION  JSR OCHAR  LDAA #'9 TI PRINTER ON  JSR OCHAR PUN325 EQU *  CLR PNCH RESET PUNCH ON FLAG  CLR CASSET RESET CASSETTE FLAG  RTS  SPC 5 * SUBROUTINE TO READ CHARACTER - NO PARITY INCT EQU *  STX SAVEX SAVE X REG INCT2 TST NTIMEO WANT TIME OUT TEST?  BEQ INCT3 YES  JSR XCI NO-USE CI ROUTINE  BRA INCT6 GO CHECK CHAR INCT3 LDX #$FF00 SET TIME OUT COUNTER INCT5 DEX  BEQ INCT9 TIME OUT  LDAA MTTYSI  ASRA  BCC INCT5 NOT READY  LDAA MTTYDI INPUT DATA  ANDA #$7F REMOVE PARITY INCT6 LDX #NCHAR IGNORE CHARS CCHK CMP A X  BEQ INCT2 BAD CHAR  INX  CPX #ENCHAR DONE?  BNE CCHK NO  CMP A #$09 TAB?  BNE INCT7 NO  LDA A #$20 YES-CHANGE TO SPACE INCT7 LDX SAVEX RESTORE X REG  CLC CLEAR CARRY-NO TIME OUT  RTS  SPC 1 INCT9 LDAA #$1A TIME OUT  LDX SAVEX RESTORE X REG  SEC SET TIME OUT BIT  RTS  SPC 5 * CHARACTERS STRIPPED FROM INPUT: * NULL, RUBOUT, LINE FEED, DC1, DC2, DC3, DC4 NCHAR FCB 0,$7F,$0A,$11,$12,$13,$14 ENCHAR EQU *  SPC 5 * PUT READER BUFFER JUST BEFORE $300 RCBUF EQU $300-73  SPC 5  END  MON   8o7 NAM MXRIOM *+ NAM:MXRIOM VER:1.2 DAT:07-17-75 CMP:M6800 * * SYS:M68RES * * DES:THIS IS THE M6800 RESIDENT I\O PACKAGE * FOR USE WITH THE RESIDENT EDITOR AND * RESIDENT ASSEMBLER * * MIKBUG REV. 9 UTILIZATION  * * REV:N/A *- OPT OT=M68IOMOT OPT SYMBOLS PAGE * *************************************** * *************************************** * * THIS IS THE I/O DRIVER REGION * THE FOLLOWING DRIVER ROUTINES ARE REQUIRED: * * CI CONSOLE DEVICE INPUT ROUTINE. RETURNS WITH * INPUT CHARACTER IN A-REGISTER. DOES NOT * ECHO CHARACTER * * CIE CONSOLE DEVICE INPUT ROUTINE. SAME AS CI * BUT ECHOS CHARACTER. * * CO CONSOLE OUTPUT ROUTINE. OUTPUTS CHARACTER * IN A-REGISTER. * * POC PUNCH DEVICE OUTPUT CHARACTER ROUTINE. * OUTPUTS CHARACTER IN A-REGISTER. TURNS *  PUNCH ON. * * POR PUNCH DEVICE OUTPUT RECORD ROUTINE. * OUTPUTS CHARACTER STRING POINTED TO BY * X REGISTER AND TERMINATED BY $04. TURNS * PUNCH ON AND OFF. * * RIC READER DEVICE INPUT CHARACTER ROUTINE. * READS RECORD INTO BUFFER IF BUFFER EMPTY. * RETURNS WITH NEXT CHARACTER FROM BUFFER IN * A-REGISTER IF NO TIME OUT OCCURRED, AND * ALSO RESETS CARRY. IF TIME OUT OCCURRED, * CARRY IS SET AND A-REGISTER CONTAINS $1A. * TURNS PUNCH OFF BEFORE READING. CARRIAGE * RETURN ENDS RECORD. * * RIR READER DEVICE INPUT RECORD ROUTINE. READS * RECORD INTO BUFFER. TURNS PUNCH OFF * BEFORE READING. CARRIAGE RETURN ENDS * RECORD. * * ********************************************** * ********************************************** PAGE ORG $F0 INCHNP EQU $E078 EXBUG CHARACTER INPUT PDATA1 EQU $E07E PRINT MESSAGE -- NO CR/LF OCHAR EQU $E075 PIASB EQU $8007 PIADB EQU $8006 B DATA PIAS EQU $8005 PIA STATUS PIAD EQU $8004 PIA DATA MIKBUG EQU $E0D0 SPC 2 ASTART EQU $8F4 ASSEMBLER START ESTART EQU $1641 SPC 2 SAVEX RMB 2 SPC 1 RCEMT RMB 1 READER BUFFER EMPTY RCGCPT RMB 2 READ GET CHAR POINTER NTIMEO RMB 1 NO TIME OUT FLAG  PNCH RMB 1 PUNCH ON FLAG SPC 4 ORG $100 ASM JMP ASTART ED JMP ESTART XIOINT JMP INXIO XPOC JMP POC XPOR JMP POR XRIC JMP RIC XRIR JMP RIR XCO JMP CO XCI JMP CI XCIE JMP CIE XDATA JMP PDATA XDATA1 JMP PDATA0 XCRLF JMP PCRLF XLEAD JMP LEAD XNCHON JMP PNCHON XNCHOF JMP PNCHOF XBUG JMP MIKBUG XHEAD JMP XDATA PAGE HEADING FOR PRINTER XLINE JMP XDATA1 PRINT LINE FOR PRINTER PAGE * SUBROUTINE TO PUNCH 5 INCHES OF BLANK TAPE SPC 2 LEAD EQU * LDAB #50 5 IN=50 CHARS LEAD1 CLRA BSR XPOC PUNCH NULL DECB BNE LEAD1 NOT DONE BRA XNCHOF SPC 2 SPC 5 INXIO EQU * CLR RCEMT READ BUFFER EMPTY CLR PNCH PUNCH IS OFF CLR NTIMEO RTS PAGE CI EQU * CONSOLE INPUT CIE EQU *  CI1 JSR INCHNP EXBUG CHARACTER INPUT *** STRIP CHARACTERS FROM INPUT *** LDX #NCHAR CI2 CMP A X BEQ CIE INX CPX #ENCHAR BNE CI2 *********************************** RTS SPC 5 POC EQU * PUNCH OUTPUT BSR XNCHON BRA XCO SPC 5 CO EQU * CMPA #$09 BNE CO1 NOT TAB LDAA #$20 CHANGE TAB TO SPACE CO1 CMP A #$D C/R? BNE CO2 BRA XCRLF CO2 JSR OUTCH CO4 RTS PAGE POR EQU * BSR XNCHON JSR PDATA1 PUNCH CHAR STRING LDX #FOUR0 JSR PDATA1 POR3 BRA XNCHOF SPC 5 RIC EQU * TST RCEMT BNE RIR19 BUFFER NOT EMPTY CLR NTIMEO BRA RIR3 * BUFFER EMPTY READ RECORD * FILL INPUT BUFFER WITH C/R'S RIR INC NTIMEO RIR3 LDX #RCBUF LDAA #$D RIR71 STAA X INX CPX #RCBUF+72 BNE RIR71 TST PNCH BEQ RDR BSR POR3 SPC 1 SPC 1 RDR EQU * RDR08 LDAA #$11 READER ON JSR OUTCH LDAA #$3C STAA PIASB READER RELAY ON SPC 1 RDR09 EQU * LDX #RCBUF RDR11 SEC JSR INCT INPUT CHAR SPC 1 STAA X BCS RDR31 TIME OUT CMPA #$D C/R BEQ RDR31 SPC 1 CPX #RCBUF+71 BEQ RDR11 INX BRA RDR11 RDR31 EQU * CLR NTIMEO  LDAA #$13 READER OFF JSR OUTCH LDAA #$34 READER RELAY OFF STAA PIASB LDX #FOUR0 JSR PDATA0 SPC 1 INC RCEMT SET BUFFER NOT EMPTY LDX #RCBUF STX RCGCPT INX GET CHAR POINTER SPC 1 RIR19 LDX RCGCPT LDAA X (A) CHAR INX STX RCGCPT CMPA #$1A BEQ RIR33 END OF TEXT CMPA #$D BNE RIR31 NOT C/R RIR33 CLR RCEMT SET BUFFER EMPTY RIR31 RTS SPC 5 PNCHON EQU * PUNCH ON TST PNCH IS PUNCH ON BNE PH354 YES PSH A NO, SAVE A REG VALUE INC PNCH SET PUNCH ON FLAG PH353 EQU * *** SEND RUBOUT BEFORE PUNCH ON **************** LDA A #$7F JSR OCHAR ********************************************* LDAA #$12 TURN TTY PUNCH ON JSR OCHAR OUT CHAR PUL A RESTORE A REG VALUE PH354 EQU * RTS SPC 5 PNCHOF EQU * PUNCH OFF LDAA #$14 TURN TTY PUNCH OFF JSR OCHAR OUTPUT CHAR PUN325 EQU * CLR PNCH RTS  PAGE PDATA JSR PCRLF CR/LF/NULL CHAR STRING PDATA0 LDA A X NEXT CHAR TO OUTPUT CMP A #$04 END OF STRING BNE PDATAA NO RTS YES, RETURN TO CALLER PDATAA BSR OUTCH OUTPUT ONE CHAR INX NEXT CHAR BRA PDATA0 NEXT SPC 5 PCRLF STX SAVEX SAVE IX VALUE LDX #CRLFNU CR/LF/NULL STRING JSR PDATA1 PRINT STRING LDX SAVEX RESTORE IX VALUE RTS RETURN TO CALLER SPC 5 OUTCH PSH A SAVE ACC A VALUE JSR OCHAR OUTPUT REQUESTED CHAR PUL A CMP A #$0D WAS IT A CR BNE OUTCH2 NO RETURN PSH A SAVE A REG VALUE STX SAVEX SAVE IX VALUE LDX #FOUR0 FOUR NULL CHARS JSR PDATA1 OUTPUT THEM LDX SAVEX RESTORE IX VALUE PUL A RESTORE A REGVALUE OUTCH2 RTS RETURN TO CALLER PAGE INCT EQU * INPUT CHAR NO-PARITY * READ CHARACTER STX SAVEX PSH B SAVE B REG INCT2 TST NTIMEO BEQ INCT3 JSR XCI BRA INCT6 INCT3 LDX #$FF00 INCT5 DEX BEQ INCT9 TIME OUT LDA A PIAD LOOK FOR START BIT BMI INCT5 NOT YET CLR PIAD+2 SET COUNTER 4 HALF BIT TIME BSR DE START TIMER BSR DEL DELAY HALF BIT TIME LDA B #4 SET DEL FOR FULL BIT TIME STA B PIAD+2 ASL B SET UP COUNT OF 8 IN3 BSR DEL WAIT 1 CHAR TIME SEC MARK COM LINE ROL PIAD GET BIT INTO CARRY ROR A CARRY TO A REG D EC B REDUCE COUNT BNE IN3 MORE TO GET BSR DEL WAIT FOR STOP BIT AND A #$7F CLEAR PARITY BIT LDA B PIAD+2 TEST FOR STOP BITS ASL B SHIFT BIT TO SIGN BPL INCT6 BRANCH FOR 1 STOP BIT BSR DEL DELAY 4 STOP BITS INCT6 LDX #NCHAR IGNORE CHARS CCHK CMP A X BEQ INCT2 INX CPX #ENCHAR BNE CCHK CMP A #$09 CHANGE TAB TO SPACE BNE INCT7 LDA A #$20 INCT7 CLC CLEAR CARRY BIT INCT8 LDX SAVEX RESTORE IX VALUE PUL B RESTORE B REG RTS SPC 1 INCT9 LDAA #$1A SEC SET TIME OUT BIT BRA INCT8 SPC 5 DEL TST PIAD+2 IS TIME UP BPL DEL NO DE INC PIAD+2 RESET TIMER DEC PIAD+2 RTS RETURN SPC 5 NCHAR FCB 0,$7F,$0A,$11,$12,$13,$14 ENCHAR EQU * CRLFNU FCB $0D,$0A FOUR0 FCB $00,$00,$00,$00,$04 RCBUF EQU $300-73 END MON P~R NAM MXFIT ********************************** * * * MPU INSTRUCTION TSET * *  * ********************************** * * STARTING ADDRESS = $200 * THE PROGRAM WILL EXECUTE THE TEST ONE TIME * AND UPON SUCCESSFUL COMPLETION WILL * PRINT "ALL IS WELL ON FIRST PASS" THEN REQUEST * THAT THE OPERATOR INDICATE HOW OFTEN HE WANTS * AN X PRINTED TO VERIFY THAT THE MPU IS STILL * CYCLING. IF THE MEGGAGE DOES NOT GET PRINTED * THE OPERATOR MUST DEPRESS THE EXORCISER ABORT * AND DETERMINE FROM THE P-REG THE ADDRESS OF THE * FAILURE. * * TO STOP PROGRAM THE EXORCISER ABORT * MUST BE DEPRESSED. * * EXBUG SUBROUTINES USED * PDATA PRINT DATA * INCHNP INPUT CHARACTER WITH NO PARITY *** * OPT NOG OPT SYMBOL PDATA EQU $FA33 INCHNP EQU $FAA0 SPC 1  ORG 0 DTEMP RMB 2 DIRECT TEMP STORAGE K0 RMB 2 ( FDB 0 ) SET BY PGM KD1 RMB 2 ( FDB 1 ) SET BY PGM KD400 RMB 2 ( FDB 400 ) SET BY PGM K1 RMB 1 ( FCB 1 ) SET BY PGM SPC 1 ORG $100 ETEMP RMB 2 EXTENDED TEMP STORAGE RMB 20 STACK RMB 1 START OF STACK EXIT1 TST PASS THIS FIRST PASS BEQ EXT2 YES JMP START1 EXT2 INC PASS BUMP PASS COUNT CLR INTCNT CLR INTCNT+1 CLR INTRV NUMBER OF PASS BEFORE PRNT CLR INTRV+1 LDAA #$FF STAA CNT INTINP LDX #MSG1 INTERVAL 0000-9999 JSR PDATA INPCH JSR INCHNP INPUT CHAR NO PARITY CMPA #'L LONG INTERVAL BEQ LINP YES CMPA #'S SHORT INTERVAL BEQ SINP YES CMPA #'0 NO INTERVAL WANTED BEQ ZERO LDX #MSG3 RETRY MESSAGE JSR PDATA BRA INPCH LINP LDAA #120 # 30 SECS IN 1 HOUR STAA CNT SINP LDX INT30 # CYCLES IN 30 SECS STX INTRV ZERO JMP START1 PAGE ORG $200 START CLR PASS INIT PASS COUNT LDX #EXIT1 STX $FFFA RESET SWI VECTOR START1 LDS #STACK INIT STACK POINTER  SPC 1 * INZ DIRECT (ADDRESSED) CONSTANTS CLRA STAA K0 STAA K0+1 STAA KD1 INCA STAA KD1+1  STAA KD400 STAA K1 LDAA #$90 STAA KD400+1 SPC 1 ADDA #$BF ADDA K1 (A) 50 ADDA EK200 (A) 18  SPC 1 LDX EKX ADDA 8,X (A) 20 CMPA #$20 BNE * CLRA BNE * COMA INCA NEG A BNE * SPC 1 LDAA 11,X TAB ASLA ASLA ASLA ASLA ABA INCA SPC 1 BEQ *+4 WAI FAILURE WAI FAILURE SPC 1 LDAA #0 TAP BCC *+4 BRA * BCS * BEQ * BGE *+4 BRA * BGT *+4 BRA * BHI *+4 BRA * BLE * BLS * BLT * BMI * BNE *+4 BRA * BPL *+4 BRA * BVC *+4 BRA * BVS * SPC 1 LDX #$FFFE INX CPX #$FFFF BNE * SPC 1 LDX KD1 BEQ *  DEX (X) 0000 BNE * SPC 1 LDX EKX LDX 2,X (X) 0203 CPX #$0203 BNE * SPC 1 CLR DTEMP  INC DTEMP = 01 ASL DTEMP = 02 ROL DTEMP = 04 LDAA DTEMP (A) 04 CMPA #4 BNE * SPC 1 ADDA DTEMP (A) 08 CMPA #8 BNE * SUBA K1 (A) 07 SUBA EKB0+8 (A) FF TST B SPC 1 LDAB #$AA PSH B CLR B BNE * PULB BNE * CMPB #$AA BNE * SPC 1 SKIP EQU * LDAA #$80 SPC 1 PSHA CLRA PULA BNE * TSTA BPL * ASLA (A) 00 TPA CMPA #$C7 BNE * LDAB #$55 COMB  ASLB BVC * BCC * CLC ROL B (B) FD EORB #7 (B) AF SUBB K1 (B) AE ANDB #$C3 (B) 82 LSRB (B) 41 ASRB TBA RORB NEGB CMPB #$70 BNE * SPC 2 LSRA RORA SEC ASRA  ASRA SEC ROLA (A) 05 ABA (A) 75 (B) 70 CMPA #$75 BNE * CMPB #$70 BNE * CLRA ORAA #$5A SUBA #$F0 (A) 6A C SBCA #1 (A) 68 CMPA #$68 BNE * SPC 1 CLRB ORA B EKB0 ADDB #$F0  ANDB #$36 (B) 38 BITB #$63 BEQ * SPC 1 CLR DTEMP CLR DTEMP+1 LDX #0 LDS #STACK CPX #0 BNE * STS DTEMP STS ETEMP LDX ETEMP INX TXS STS DTEMP LDX DTEMP CPX #STACK BNE * CPX DTEMP BNE * CPX ETEMP BNE * CLR ETEMP CLR ETEMP+1 STX ETEMP CPX ETEMP BNE * SPC 1  LDX #$F00F STX DTEMP LDAA DTEMP ADDA DTEMP+1 CMPA #$FF BNE * LDX #ETEMP STX ETEMP CPX X BNE * CPX 1,X BEQ * SPC 1 LDAA #$3F TAP CLC TPA CMPA #$FE BNE * TAP CLV TPA CMPA #$FC BNE * TAP CLI TPA CMPA #$EC BNE * SPC 1 CLRA TAP SEC SEI SEV TPA CMPA #$D3 BNE * SPC 1 * DAA LDA A #$0 ADDA #$99 DAA (A) 99 ADC A #$01 DAA (A) 00 ZVC ADCA #$88 DAA (A) 89 ADCA #$09 DAA (A) 98 ADCA #$25 DAA (A) 23 C ADCA #$75 DAA (A) 99  SEC (A) 99 B ADCA #$99 DAA (A) 99 C BCC * CMPA #$99 BNE * SPC 2 LDX #ETEMP STX X LDAA AETEMP LDAB AETEMP+1 SUBB 1,X SUBA X BNE * CBA BNE * SPC 3 * A-B=A 00-03=FD CLRA   LDAB #3 SBA BCC * CMPA #$FD BNE * CMPB #3 BNE * SPC 3 LDX #ETEMP CLR X LDAA X  BNE * INC X ROL X ASL X 04 LDAA #4 CMPA X BNE * DEC X 03 ORAA X (A) 07 CMPA #$07  BNE * COM X ASR X FC ROR X 7F LSR X 3F LDAA #$3F CMPA X BNE * BRA PAST PAGE  FCB $55 * TEST PATTERN FOR PRODUCTION TEST OF MC6830D SPC 1 SUB7 LDAA #3 PSHA IXL 03 INCA PSHA IXH 04  INCA PSH A A 05 INCA PSHA B 06 INCA PSHA CC 07 RTI EKX FDB EKB0 FCB $55,$AA SPC 2 FCB 0,0,0,0,0,0,0,0 FCB 0,0,0,0,0,0 EKB0 FCB 0,1,2,3,4,5,6,7,8,9 SPC 1 EK200 FCB 200 SPC 1 FCB 15,16  PAGE AETEMP FDB ETEMP ADDR OF ETEMP PAST EQU * BSR SUB7 CMPA #5 BNE * CMPB #6 BNE * CPX #$0403 BNE * LDX #EKB0 CLRB ADDB EK200 ADDB 3,X SUBB #203 BNE * ORAB EK200 ORAB 11,X  CMPB #$CF BNE * SUBB EK200 SBCB 7,X (B) 00 BNE * SPC 2 CLR ETEMP DEC ETEMP CLC ROR ETEMP ASR ETEMP LSR ETEMP NEG ETEMP LDAB ETEMP SUBB #$E1 BNE * COM ETEMP LDAB #$1E  CMPB ETEMP BNE * LDAB #$E1 BITB ETEMP BNE * SPC 2 LDX #STACK STX ETEMP+2 LDX #ETEMP LDS 2,X CPX #ETEMP BNE * TSX CPX #STACK+1 BNE * SPC 1 LDX #ETEMP STS X LDX ETEMP CPX #STACK BNE * SPC 2 LDX #EKB0 LDAB #$F0 EORB #$FF CMPB #$0F BNE * TST 1,X BEQ * ADCB 11,X CMPB #$1E BNE * ANDB 7,X CMPB 6,X BNE * CMPB #6 BNE * BITB 2,X BEQ * CMPB #6 BNE * SPC 1 LDAB 11,X CMPB #15 BNE * LDX #ETEMP STAB X CLC SBCB ETEMP BNE *  SEC TST ETEMP BCS * NEG X CLR B ORAB #$F1 EORB X BNE * SEC TST X BCS * BEQ * SPC 2 CLR B EORB EK200 CMPB #200 BNE * STAB ETEMP SEC ADCB ETEMP BVS * CMPB #145  BNE * SPC 2 LDS #STACK LDX #THERE JMP 3,X BRA * WAI THERE WAI WAI WAI BRA *+4 BRA * CLRA BSR SUB3 JSR SUB3 LDX #SUB3 DEX JSR 1,X CMPA #9 BNE * JSR SUB3 CMPA #12 BNE * BRA OVER WAI FAILURE WAI FAILURE SPC 3 SUB3 ADDA #3 RTS SPC 1 SPC 3 OVER NOP  SPC 2 LDX #ETEMP CLRA ORAA EK200 (A) C8 STAA X (ETEMP) C8 BITA X BEQ * CLC ADCA X BCC * ADCA X (A) 59 VC BCC * BVC * ANDA X (A) 48 BCC * BVS * SEC SBCA X (A) 7F CMPA #$7F BNE * LDAA #$C8 (A) C8 EORA X BNE * SPC 1 LDAA K1 (A) 01 EORA K1 (A) 00 BNE * ORAA K1 (A) 01 SEV BITA #1 BEQ * BVS * CMPA K1 BNE * EORA K1 (A) 00 BNE * SPC 1 LDAA #$FF (A) FF SEC SBCA K1 (A) FD CMPA #$FD BNE * ADCA K1 (A) FE CMPA #$FE BNE * STAA DTEMP ANDA #0 BNE * ORAA DTEMP CMPA #$FE BNE * BITA K1 BNE * ANDA K1 BNE * SPC 2 LDAA #$1F  STAA ETEMP SEC ADCA ETEMP EORA #$3F BNE * LDAA #$1F (A) 1F CMPA ETEMP BNE * SEC SBCA ETEMP (A) FF BCC * ANDA ETEMP (A) 1F CMPA #$1F BNE * EORA ETEMP BNE * SPC 2 LDAB K1 (B) 01  CLC ADCB #$44 (B) 45 STAB DTEMP CMPB DTEMP BNE * BCS * ADDB K1 (B) 46 BITB DTEMP BEQ *  ANDB K1 (B) 00 BNE * ORAB DTEMP (B) 45 CMPB #$45 BNE * EORB DTEMP BNE * ADDB DTEMP (B) 45  SEC ADCB DTEMP (B) 8B BVC * CMPB #$8B BNE * SBCB DTEMP (B) 46 CMPB #$46 BNE * SEC ADCB #$B9 BNE * SEC SBCB #0 CMPB #$FF BNE * AND B EK200 (B) C8 CMPB #$C8 BNE * TST PASS THIS FIRST PASS BEQ ENDPAS YES LDX INTRV SHOULD MESSAGE BE PRINTED BEQ ENDPAS NO LDX INTCNT NO. PASSES CPT CPX INTRV TIME TO PRINT BNE INXCT TST CNT BMI PRTX GO PRINT LDX #0 INIT COUNTER DEC CNT BEQ PRTX GO PRINT INXCT EQU *  INX STX INTCNT SAVE UPDATED COUNT BRA ENDPAS PRTX CLR INTCNT CLR INTCNT+1 TST CNT BMI PRTX1 LDAA #120  STAA CNT PRTX1 EQU * LDX #MSG2 PRINT X JSR PDATA ENDPAS RMB 0 SPC 1 * STROBE FOR ADDED HARDWARE STAB $8020 SWI EXIT THIS PGM SPC 1 INTRV FDB 0 INTCNT RMB 2 CNT RMB 1 TEMP RMB 1 PASS FCB 0 MSG1 FCC /ALL IS WELL ON FIRST PASS/ FDB $A,$D FCC /TO CONTINUE ENTER ONE OF THE/ FDB $A,$D FCC /FOLLOWING:/ FDB $A,$D MSG3 FCC /L = VERIFY RUN ONCE AN HOUR/ FDB $A,$D FCC /S = VERIFY RUN EVERY THIRTY SECONDS/ FDB $A,$D FCC /0 = DO NOT VERIFY. CYCLE CONTINUOUSLY/ FDB $0A0D FDB $20,$4 MSG2 FCC /X/ FDB $20,$4 INT30 FDB $3A98 SPC 1 * EXIT BY IRQ (I/O) INTERRUPT EXIT2 BRA * ILEGAL INTERUPT SPC 3 ORG $FFF8 FDB EXIT2 IRQ (I/O) VECTOR FDB EXIT1 SOFTWARE INTERRUPT VECTOR FDB EXIT2 NMI VECTOR FDB START RESTART VECTOR END MON lk NAMMEMTST OPTOT,NOG,UNA,CLIST *REV.1.0BYMOTOROLAMICROSYSTEMSMARCH19,1977 * * *PROGRAM/USERCONVERSATION: * *P.MEMORYTESTX.X(X.X=VERSION) * *P.BEGADDRXXXX * *U.YYYY(YYYY=STARTOFMMEMORYTO *BETESTED.) * *P.ENDADDRAAAA * *U.BBBB(BBBB=ENDOFMEMORYTOBE *TESTED.) * *P.ABCDEFGHIJKLMNOPQRSTUVWXYZ *(EACHLETTERREPRESENTSTHECOMPLETION *OFASPECIFICTEST.) *A/N=WALKINGADDRESS *B/O=BITPATTERN10101010 *C/P=BITPATTERN01010101 *D/Q=GALLOPINGREADTEST *E/R=GALLOPINGWRITETEST *F/S=WALKINGBITPATTERN10000000 *G/T=01000000 *H/U=00100000 *I/V=00010000 *J/W=00001000 *K/X=00000100 *L/Y=00000010 *M/Z=00000001 * * *P.NOWIHAVESAIDMABC'S *UMUSTBEPROUDOFME *ANDI'VERUNEACHTESTTWICE *NOWISN'TTHATREALLYNICE? * * *MEMORYFAILUREMESSAGES: * * *1.MEMORYFAILEDATLOCATIONXXXX * * ************************************************** PAGE MONTYPEQU00=>EXBUG,1=>MINIBUG ORG$100 * *DETERMINEIFUSERISREADYTOSTARTNEXTMEMORY *BOARDTEST * EXTMT1EQU* LDX#MSG0PROD.MEM.TESTX.XMESSAGE JSRPDATATOUSERW/CRLF *GETSTARTANDENDADD RESSES IFNEMONTYP GETADRLDX#BEGA JSRPDATA LDX#ADR2 JSRINADD LDX#ENDA JSRPDATA LDX#ADR3 JSRINADD LDAAADR3MAKESUREBEGA SPC 1 LDAA #$0000 STAA E100 STAA E101 LDAB #$00FF STAB E105 STAA E104 LDAA #$0004 STAA E101  STAA E100 LDAA #$00FF STAA E105 LDAB E104 CMPB #$00FF BNE G105 NOP NOP LDAA #$0000 STAA E105 LDAB E104 CMPB #$0000 BNE G105 NOP LDAA #$00AA STAA E105 LDAB E104 CMPB #$00AA BNE G105 NOP LDAA #$0055 STAA E105 LDAB E104 CMPB #$0055 BNE G105 NOP LDAA #$0032 SPC 2 * COMPLETE TEST 2 SPC 1 JSR G102 NOP SPC 2 * TEST 3 CA2 INTERRUPT LDAB #$000C STAB E100 LDAB #$002C  STAB E101 * WRITE DATA B TO INTERRUPT STAB E105 NOP NOP LDAB D100 CMPB #$0003   BNE G106 NOP LDAB #$001C STAB E100 LDAB #$002C STAB E101 * WRITE DATA B TO INTERRUPT SPC 1 STAB E105 NOP NOP LDAB D100 CMPB #$0004 BEQ G107 NOP G106 SWI G105 SWI G107 LDAA #$0033 SPC 1 * COMPLETE TEST 3 JSR G102 NOP SPC 3 * TEST 4-CA1 INTERRUPT LDAA #$0000 STAA E104 STAA E105 LDAB #$002D STAB E100 LDAB #$0004 STAB E101 * READ DATA A TO INTERRUPT SPC 1 LDAB E104 NOP NOP LDAB D100  CMPB #$0005 BNE G108 NOP LDAB #$002F STAB E100 * READ DATA A TO INTERRUPT SPC 1  LDAB E104 NOP NOP LDAB D100 CMPB #$0006 BEQ G109 SWI G108 SWI  NOP G109 LDAA #$0034 * COMPLETE TEST 4 JSR G102 NOP SPC 3 * TEST 5-CB1 INTERRUPT SPC 1  LDAB #$0004 STAB E100 LDAB #$002D STAB E101 * WRITE DATA B TO INTERRUPT STAB E105 NOP NOP LDAB D100 CMPB #$0007 BNE G110 NOP LDAB #$002F STAB E101 * WRITE DATA B TO INTERRUPT STAB E105 NOP NOP LDAB D100 CMPB #$0008 BEQ G111  SWI G110 SWI NOP G111 LDAA #$0035 * COMPLETE TEST 5 JSR G102 NOP NOP NOP  NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP * INITIALIZE PIA LDAB #$0000  STAB E102 STAB E103 LDAA #$00FF STAA E106 SPC 3 * TEST 6-A>B STAB E107 LDAB #$0004 STAB E102 STAA E106 STAB E103 LDAB E107 CMPB #$00FF BNE G112 NOP NOP LDAA #$0000 STAA E106 LDAB E107 CMPB #$0000 BNE G112 NOP  LDAA #$00AA STAA E106 LDAB E107 CMPB #$00AA BNE G112 NOP LDAA #$0055  STAA E106 LDAB E107 CMPB #$0055 BNE G112 NOP LDAA #$0036 * COMPLETE TEST 6  JSR G102 CLI SPC 3 * TEST 7- CB2 INTERRUPT LDAB #$002C STAB E102 LDAB #$000C STAB E103 * READ DATA A TO INTERRUPT LDAA E106 NOP NOP LDAB D100 CMPB #$0009 BNE G113 NOP LDAB #$002C STAB E102 LDAB #$001C STAB E103 * READ DATA A TO INTERRUPT LDAB E106 NOP NOP LDAB D100 CMPB #$000A BEQ G114 G113 SWI  G112 SWI G114 LDAA #$0037 * COMPLRTE TEST 7 JSR G102 NOP SPC 3 * TEST 8 B>A SPC 1 LDAA #$0000 STAA E102 STAA E103 LDAB #$00FF STAB E107 STAA E106  LDAA #$0004 STAA E103 STAA E102 LDAA #$00FF STAA E107 LDAB E106 CMPB  #$00FF BNE G115 NOP NOP LDAA #$0000 STAA E107 LDAB E106 CMPB #$0000   BNE G115 NOP LDAA #$00AA STAA E107 LDAB E106 CMPB #$00AA BNE G115 NOP  LDAA #$0055 STAA E107 LDAB E106 CMPB #$0055 BNE G115 NOP LDAA #$0038 * COMPLETE TEST 8 JSR G102 NOP SPC 3 * TEST 9 CA2 INTERRUPT LDAB #$000C STAB E102  LDAB #$002C STAB E103 * WRITE DATA B TO INTERRUPT STAB E107 NOP NOP LDAB D100  CMPB #$000B BNE G116 NOP LDAB #$001C STAB E102 LDAB #$002C STAB E103 * WRITE DATA B TO INTERRUPT STAB E107 NOP NOP LDAB D100 CMPB #$000C BEQ G117 NOP G116 SWI G115 SWI G117 LDAA #$0039 * COMPLETE TEST 9 JSR G102 NOP SPC 3 *  TEST A CA1 INTERRUPT LDAA #$0000 STAA E106 STAA E107 LDAB #$002D STAB E102  LDAB #$0004 STAB E103 * READ DATA A TO INTERRUPT LDAB E106 NOP NOP LDAB D100  CMPB #$000D BNE G118 NOP LDAB #$002F STAB E102 * READ DATA A TO INTERRUPT LDAB  E106 NOP NOP LDAB D100 CMPB #$000E BEQ G119 SWI G118 SWI NOP G119 LDAA #$0041 * COMPLETE TEST A JSR G102 NOP SPC 3 * TEST B CB1 INTERRUPT LDA B #4 STA B E102 LDA B #$2D STA B E103 * WRITE DATA B TO INTERRUPT STA B E107 NOP NOP LDA B D100 CMP B #$F BNE G120 NOP LDA B #$2F STA B E103 * WRITE DATA B TO INTERRUPT STA B E107 NOP NOP LDA B D100 CMP B #$10 BEQ G121 SWI G120 SWI NOP G121 LDA A #$42 * COMPLETE TEST B JSR G102 LDX #G124 GET MESSAGE POINTER JSR G123 PRINT END OF TESTS JMP G122 SPC 3 * PRINT SPACES AND TEST NO. SPC 1 G102 STA A D101 LDA A #$20 GET CODE FOR "SPACE" JSR G100 PRINT SPACE JSR G100 ANOTHER LDA A D101 JSR G100 RTS SPC 3 G124 FCC "END OF TESTS"  FCB 4 SPC 3 G125 FCC " I/O MODULE TEST PROGRAM FOR THE EXORCISER" FDB $D0A FCC " TESTS PIA'S FUNCTIONALLY" FDB $D0A,$A0A FCC " ORIGINAL PROGRAM WRITTEN BY GENE CHALET." FDB $D0A FCC "  REVISED 2/6/76 BY W.C.WRAY" FDB $D0A,$A0A FCC " TEST PROCEDURE" FDB $D0A,$A0A FCC / TURN ON ALL "DONT CARE" SWITCHES"/ FDB $D0A FCC / SET ADDRESS SWITCHES FOR PIA1 TO"AAA8"/ FDB $D0A FCC / SET ADDRESS SWITCHES FOR PIA2 TO "5554"/ FDB $D0A FCC " CONNECT JUMPERS BETWEEN PA0-PA7 (PINS 2-9) AND" FDB $D0A FCC " PB0-PB7 (PINS 10-17) ON PIA1 (0 TO 0, 1 TO 1,ETC)" FDB $D0A FCC " INSTALL JUMPERS BETWEEN CA1 (PIN 40),CA2 (PIN 39)," FDB $D0A FCC " CB1 (PIN 18),AND CB2 (PIN 19) OF PIA1. ALL" FDB $D0A FCC " CONNECTED TOGETHER)" FDB $D0A FCC " INSTALL SIMILAR JUMPERS ON PIA2" FDB $D0A FCC " CONNECT IRQA (PIN 38),AND IRQB (PIN 37), OF PIA1 TO" FDB $D0A FCC " THE IRQ WIREWRAP POST ON THE MODULE." FDB $D0A FCC " CONNECT IRQA AND IRQB OF PIA2 TO THE SAME POST." FDB $D0A FCC  " INSTALL THE MODULE IN THE EXORCISER" FDB $D0A FCC " TURN ON THE UNIT AND LOAD THIS TEST TAPE" FDB $D0A FCC "  ENTER PROGRAM AT ADDRESS 0062. (62;G)" FDB $D0A,$A0A FCC " THERE ARE 0 THRU B TESTS AND AS EACH IS COMPLETED, THE" FDB $D0A FCC / NUMBER WILL BE PRINTED. IF ALL OK,"END OF TEST" WILL/ FDB $D0A FCC " BE PRINTED. IF ANY TEST FAILS,THE REGISTERS WILL BE" FDB $D0A FCC " PRINTED AND THE PROGRAM WILL RETURN TO EXBUG." FDB $D0A,$A0A FCC "  THE PROGRAM COUNTER WILL INDICATE THE FAILURE AS FOLLOWS:" FDB $D0A,$A0A FCC " PROGRAM COUNTER FAILURE" FDB $D0A FCC " 00EE PIA1 HAS FAILED THE CB2 INTERRUPT TEST" FDB $D0A FCC " 00EF PIA1 HAS FAILED THE DATA TRANSFER TEST" FDB $D0A FCC " FROM PA0-PA7 TO PB0-PB7 RESPECTIVELY" FDB $D0A,$A0A FCC "  0175 PIA1 HAS FAILED THE CA2 INTERRUPT TEST" FDB $D0A FCC " 0176 PIA1 HAS FAILED THE DATA TRANSFER TEST" FDB $D0A FCC " FROM PB0-PB7 TO PA0-PA7 RESPECTIVELY" FDB $D0A FCC " 01AB PIA1 HAS FAILED THE CA1 "LO TO HI"" FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC " 01AC PIA1 HAS FAILED THE CA1 "HI TO LO"" FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC " 01DA PIA1 HAS FAILED THE CB1 "LO TO HI"" FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC " 01DB PIA1 HAS FAILED THE CB1 "HI TO LO"" FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC " 026D PIA2 HAS FAILED THE CB2 INTERRUPT TEST" FDB $D0A FCC " 026E PIA2 HAS FAILED THE DATA TRANSFER " FDB $D0A FCC "  FROM PA0-PA7 TO PB0-PB7 RESPECTIVELY" FDB $D0A FCC " 02F4 PIA2 HAS FAILED THE CA2 INTERRUPT TEST" FDB $D0A FCC " 02F5 PIA2 HAS FAILED THE DATA TRANSFER TEST" FDB $D0A FCC " FROM PB0-PB7 TO PA0-PA7 RESPECTIVELY" FDB $D0A FCC / 032A PIA2 HAS FAILED THE CA1 "LO TO HI"/ FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC / 032B PIA2 HAS FAILED THE CA1 "HI TO LO"/ FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC / 0359 PIA2 HAS FAILED THE CB1 "LO TO HI"/ FDB $D0A FCC " INTERRUPT TEST" FDB $D0A FCC / 035A PIA2 HAS FAILED THE CB1 "HI TO LO"/ FDB $D0A FCC " INTERRUPT TEST" FDB $D0A,$A0A FCC " WHEN THIS TEST IS DONE, REPEAT IT WITH THE PIA ADDRESSES" FDB $D0A FCC " REVERSED. I.E. PIA1 SWITCHES SET FOR 5554 AND PIA2 SET" FDB $D0A FCC " FOR AAA8. THE FAILURES WILL BE INDICATED AS ABOVE EXCEPT" FDB $D0A FCC " THAT PIA1 AND PIA2 ARE REVERSED IN THE STATEMENTS ABOVE." FDB $D0A,$A0A FCC " TO RUN PROGRAM WITHOUT THIS PRINTOUT,ENTER AT $62.(62;G)" FDB $D0A FCB 4 END ɀ NAM FLTMLT OPT O,L ORG $100 * * 32 BIT FLOATING POINT REENTRANT MULTIPLICATIO * ROUTINE * * CODED: JULY 28, 197 5 BY ROBERT H. HAWORTH * MOTOROLA SPD * * REVISION: 0 * * CODE TYPE: REENTRANT * * SOURCE INSTRUCTIONS: 31 * PROGRAM SIZE: 59 BYTES * DATA AREA REQUIRED: 13 BYTES (PASSED) * * RUNNING TIME: MINIMUM: 1440 CYCLES * MAXIMUM* 2328 CYCLES * * * INPUT PARAMETERS: * * THIS ROUTINE IS EXPECTED TO BE CALLED * JSR, BSR OR EQUIVALENT (S REGISTER IS * ASSUMED TO BE SET UP APPROPRIATELY). * * X REGISTER HOLDS POINTER TO 13 BYTE DA * *13 BYTE DATA AREA: * * BYTES 0-3: FLOATING POINT OPERAND 1 ( * BYTES 4-7: FLOATING POINT OPERAND 2 ( * BYTES 8-11: FLOATING POINT RESULT (RET * (NOTE: MAY NOT BE NORMALIZ * BYTE 12: SCRATCH VARIABLE (LOOP COU * * * 32 BIT FLOATING POINT FORMAT: * * BIT 0: SIGN OF MANTISSA (0-+, 1=-) * BITS 1-7: HEX EXPONENT (2'S COMPLEMENT * BITS 8-31: 14 BIT MANTISSA (MAGNITUDE) * * HEX POINT ASSUMED IMMEDIATELY TO LEFT OF MANT * (NOTE: NORMALIZED NUMBERS MAY HAVE 1 TO 3 TOP * IN A ROW WHICH EQUAL 0 SINCE EXPONENT * * FLOATING NUMBER: (+/-).HHHHHH*16**EE * * * * * INITIALIZE DATA AREA FPML32 LDA A #25 # BITS +1 FOR LOOP COUNTER STA A 12,X SAVE LOOP CTR IN TEMP BYTE * CLR 9,X ZERO UPPER BYTE OF RESULT CLR 10,X ZERO MIDDLE BYTE OF RESULT CLR B ZERO LOWER BYTE OF RESULT * * 3 BYTE MULTIPLICATION LOOP (1 BIT AT A TIME) * 3 BYTES * 3 BYTES -) 3 BYTES * FPML01 ROR 1,X ROTATE MULTIPLIER 1 BIT TO RI ROR 2,X C BIT IS SET/RESET DEPENDING ROR 3,X LOWER BIT * DEC 12,X ALL BITS OF MULTIPLIER PROCES BEQ FPML03 IF SO, GO TO WRAP-UP * BCC FPML02 IF C BIT IS CLEAR, SKIP THE * ADDITION OF PARTIAL PRODUCT AN *  ADD B 7,X ADD LOW BYTE OF MULTIPLICAND * PARTIAL PRODUCT LDA A 10,X ADC A 6,X ADD IN MIDDLE BYTE AND SAVE STA A 10,X * LDA A 9,X ADC A 5,X ADD IN HIGH BYTE AND SAVE STA A 9,X * FPML02 ROR 9,X ROTATE PARTIAL PRODUCT ROR 10,X 1 BIT TO THE RIGHT ROR B * BRA FPML01 PROCESS NEXT BIT * * WRAP-UP PROCESSING * FINISH STORING AWAY RESULT * COMPUTE RESULT'S EXPONENT (OVERFLOW IG * COMPUTE RESULT'S SIGN * FPML03 STA B 11,X STORE AWAY LOW BYTE OF RESULT * LDA A 0,X GET SIGN AND EXPONENT OF OPD TAB PUT INTO B REG ALSO * ADD A 4,X ADD EXPONENTS AND A #$7F GET ADDITION MODULO 2**7 * EOR B 4,X XOR SIGNS TO GET SIGN OF RESU AND B #$80 GET SIGN ONLY * * A HOLDS EXPONENT (TOP BIT CLEARED) * B HOLDS SIGN (LOWER 7 BITS CLEARED) * ABA COMPUTE COMBINED EXPONENT/SIG STA A 8,X TOP BYTE OF RESULT * * RETURN TO CALLER (ASSUMES JSR/BSR TYPE CALL) * RTS * * PROGRAM TO ILLUSRATE THE USE OF THE * 32 BIT FLOATING POINT MULTIPLY ROUTINE  * EVARES EQU $F0F9 ROUTINE TO EVALUATE RESULTS * * LDS #STACK MAKE SURE THERE'S STACK FOR J LDX #DTAREA X POINTS TO DATA AREA JSR FPML32 CALL ON FLOATING MULTIPLY JMP EVARES GO EVALUATE RESULTS * * * DATA AREA * * DTAREA FCB $01 PLUS SIGN, EXPONENT=1 FCB $60 MANTISSA = 600000(HEX) FCB $00 REPRESENTED #=6 (DECIMAL) FCB $00 * FCB $82 MINUS SIGN, EXPONENT=2 FCB $17 MANTISSA = 170000 (HEX) FCB $00 REPRESENTED #=-23 (DECIMAL) FCB $00 * RMB 4 RESULT SHOULD BE: -128 (DECIM * OR 83 08A000 (HEX) * RMB 1 SCRATCH VARIABLE * * * STACK AREA * * RMB 20 STACK RMB 1   END(р* NAM BILOAD  SPC 1 * NAM:BILOAD VER:1.0 DAT:07-07-75 CMP:M6800 * * SYS:M68RES (EXBUG 1.1) * * DES:THIS PROGRAM LOADS A PROPERLY FORMATTED * BINARY TAPE INTO MEMORY. THE PROGRAM *  ACCEPTS THE FOLLOWING TAPE FORMAT: * * ASCII B INDICATES THE START OF A *  BINARY DATA BLOCK * * BYTE COUNT BINARY NUMBER OF BYTES OF * DATA, EXCLUDING BEGINNING * ADDRESS AND CHECKSUM, * MINUS ONE. NOTE THAT A * BLOCK OF ZERO BYTES CANNOT * OCCUR. * *  ADDRESS TWO BINARY FRAMES CONTAINING * THE BEGINNING ADDRESS FOR *  THIS DATA BLOCK * * DATA DATA TO BE STORED INTO *  MEMORY IN BINARY FORMAT * * CHECKSUM ONE'S COMPLEMENT OF THE SUM * OF EACH DATA, ADDRESS, AND * BYTE COUNT BYTE IN BINARY * * OR * * ASCII G INDICATES BLOCK CONTAINING * JUMP ADDRESS USED AT * COMPLETION OF LOADING. THE * G BLOCK IS THE LAST BLOCK *  READ. * * ADDRESS TWO BINARY FRAMES CONTAINING *  THE JUMP ADDRESS * * AFTER LOADING THE PROGRAM IS ENTERED BY * TYPING ;P AFTER ENTERING MAID. * * IF DATA CANNOT BE STORED INTO MEMORY THE * PROGRAM TYPES "NO CHANGE" AND GOES TO EXBUG. * * IF A CHECKSUM ERROR IS DETECTED THE * PROGRAM TYPES "CKSM NNNN " AND WAITS *  FOR A CHARACTER TO BE INPUT. NNNN IS THE * BEGINNING ADDRESS OF THE BLOCK CONTAINING * THE CHECKSUM ERROR. TYPING A C CAUSES * THE PROGRAM TO CONTINUE LOADING. TYPING * AN X CAUSES THE PROGRAM TO GO TO EXBUG. * * AFTER READING THE G BLOCK THE PROGRAM PRINTS * "EXEC" AND WAITS FOR AN INPUT. TYPING AN X * CAUSES THE PROGRAM TO GO EXBUG WHILE TYPING * A Y CAUSES THE PROGRAM TO JUMP TO THE G * ADDRESS. TYPING ANY OTHER CHARACTER CAUSES * THE "EXEC" LOOP TO REPEAT. * * REV:0 * !  SPC 2  OPT O,S  SPC 5 * EXBUG EQUATES  SPC 1 OCHAR EQU $F9CF OUTPUT CHAR INCH EQU $F012 INPUT CHAR AECHO EQU $FF53 INCH NO ECHO FLAG BCKSM EQU $FF8B CHKSUM STORAGE EXBUG EQU $F564 EXBUG ENTRY TEMP EQU $FF5A TEMP STORAGE MCKER EQU $FB65 CKSM MESSAGE PDATA EQU $F024 PRINT CR LF DATA STRING OUT4HS EQU $FA22 OUTPUT 4 HEX CHAR SPACE RDOFF EQU $F908 READER OFF MTTYSO EQU $FCF4 MAID TTY STATUS OUTPUT SBIT EQU $FCFD ACIA STOP BIT CONTROL INXCH EQU $FA4E IN CHAR ABORT IF X NCHNGE EQU $F89B NO CHANGE MESSAGE EXEC EQU $F70B EXEC CONVERSATION STACK EQU $FF8A INZ STACK POINTER VALUE  SPC5 * SET P-REGISTER LOCATION  SPC 1  ORG $FF16  FDB START  PAGE  ORG $10  SPC 1 START LDS #STACK INZ STACK POINTER  SPC 1  LDAA SBIT READER RELAY ON  ANDA #$55  STAA MTTYSO  LDAA #$11 TURN READER ON  JSR OCHAR  SPC 1 BEGIN BSR INPUT  CMPA #'B START OF BINARY?  BEQ RDBLCK YES  CMPA #'G START PROGRAM?  BNE BEGIN NO  BSR GETADD GET ADDRESS  JSR RDOFF TURN READER OFF  JSR EXEC DO IT?  LDX TEMP GET ADDRESS  JMP X GO DO IT  SPC 1 RDBLCK CLR BCKSM INZ CHKSUM  BSR INPUT GET BYTE COUNT  TAB PUT IN B-ACC  INC B ADJUST IT  BSR GETADD GET ADDRESS  SPC 1 STBLCK BSR INPUT GET DATA  STAA X STORE IT  CMPA X STORED?  BNE NOCHNG NO  INX INC ADDR  DECB DEC BYTE COUNT  BNE STBLCK NOT DONE  SPC 1  BSR INPUT VERIFY CHKSUM  INC BCKSM  BEQ BEGIN GOOD  SPC 1  JSR RDOFF BAD-TURN READER OFF PMSG LDX #MCKER PRINT MESSAGE  JSR PDATA  LDX #TEMP PRINT START ADDR  JSR OUT4HS  JSR INXCH INPUT CHAR  CMPA #'C CONTINUE?  BEQ START YES  BRA PMSG INVALID CHAR  SPC 1 NOCHNG JSR RDOFF NOT STORED-READER OFF  JMP NCHNGE TELL IT  PAGE * READ CHARACTER SUBROUTINE INPUT INC AECHO TURN OFF ECHO  JSR INCH INPUT CHAR  PSHA SAVE CHAR  ADDA BCKSM UPDATE CHKSUM  STAA BCKSM STORE CHKSUM  PULA RESTORE CHAR  RTS  SPC 1 * READ ADDRESS SUBROUTINE GETADD BSR INPUT GET START ADDR HI  STAA TEMP  BSR INPUT GET START ADDR LOW  STAA TEMP+1  LDX TEMP ADDR TO X-REG  RTS  SPC 1  END  MON ,܀, NAM BIPNCH SPC 1 * NAM:BIPNCH VER:1.0 DAT:07-14-75 CMP:M6800 * * SYS:M68RES (EXBUG 1.1) * * DES:THIS PROGRAM PUNCHES A BINARY TAPE FROM * MEMORY FOR LOADING WITH THE BILOAD PROGRAM. * AFTER LOADING, THE PROGRAM IS ENTERED BY * TYPING ;P AFTER ENTERING MAID. THE PROGRAM * THEN PRINTS: * BINARY TAPE PUNCH * * "  NEXT THE PROGRAM PRINTS "PUNCH" AND WAITS * FOR AN INPUT CHARACTER. THE FOLLOWING * OPTIONS ARE AVAILABLE: * L PUNCHES 8 INCHES OF * LEADER * E PUTS EXBUG ENTRY ADDRESS * IN G BLOCK * M PUTS MAID ENTRY ADDRESS *  G NNNN PUTS NNNN IN G BLOCK. * FOUR HEX CHARACTERS MUST * BE ENTERED * D PUNCHES DATA BLOCK FROM * MEMORY AFTER REQUESTING *  BEGINNING AND ENDING * ADDRESSES AS EXBUG DOES. * ENTERING X DURING THE * ADDRESS CONVERSATION * CAUSES THE PROGRAM TO *  ABORT TO EXBUG. * X ABORTS TO EXBUG * * BEFORE PUNCHING ON THE E,M,G, OR D * COMMANDS THE PROGRAM PRINTS "EXEC" AND * WAITS FOR AN INPUT. TYPING Y CAUSES * EXECUTION OF THE COMMAND. TYPING N CAUSES * THE SCAN LOOP TO BE REENTERED. TYPING ANY * OTHER CHARACTER CAUSES THE EXEC CONVERSATION * TO REPEAT. * * REV:0 SPC 5 OPT O,NOG PAGE * EQUATES SPC 1 STACK EQU $FF8A EXBUG STACK AREA PDATA EQU $F024 PRINT CR LF DATA STRING PSPACE EQU $F02A PRINT SPACE INCHNP EQU $F015 INPUT CHAR-NO PARITY INXCH EQU $FA4E INPUT CHAR-ABORT IF X EXEC EQU $FB7F /EXEC/ INADD EQU $FA68 GET HEX ADDR-4 CHARS TEMPA EQU $FF08 START ADDR STORAGE TEMP EQU $FF07 START ADDR CHAR COUNT OCHAR EQU $F9CF OUTPUT CHAR EXBUG EQU $F564 EXBUG ENTRY MAID EQU $F0F3 MAID ENTRY PCRLF EQU $F021 PRINT LF CR NULLS BEGEND EQU $F003 INPUT BEG AND END ADDR BEGA EQU $FF0A BEGINNING ADDR ENDA EQU $FF0C ENDING ADDR TW EQU $FF5A TEMP ADDR STORAGE CASSET EQU $FF62 PUNCH ON FLAG MTTYDI EQU $FCF5 MAID TTY DATA IN SPC 5 * SET P-REGISTER LOCATION SPC 1 ORG $FF16 FDB START SPC 2 * START OF BIPNCH SPC 1 ORG $1D70 START LDS #STACK INZ STACK LDX #HDNG PRINT HEADING JSR PDATA SPC 1 SCAN LDX #PUNCH SCAN LOOP-PRINT PUNCH JSR PDATA JSR INXCH INPUT CHAR-ABORT IF X CMPA #'D PUNCH DATA? BEQ PUNDAT YES CMPA #'L PUNCH LEADER? BNE SCAN3 NO JMP PUNLED YES SCAN3 CMPA #'E EXBUG ENTRY? BNE SCAN5 NO LDX #EXBUG YES-SET START ADDR STX TEMPA BRA PSTRT PUNCH IT SCAN5 CMPA #'M MAID ENTRY?  BNE SCAN9 NO LDX #MAID YES-SET START ADDR STX TEMPA BRA PSTRT PUNCH IT SCAN9 CMPA #'G ADDRESS ENTRY? BNE SCAN NO-TRY AGAIN SPC 1 JSR PSPACE PRINT SPACE-GET ADDR LDX #TEMPA INZ X-REG LDAA #1 INZ CHAR COUNT STAA TEMP JSR INADD GET ADDR CMPB #5 4 HEX CHARS? BNE SCAN NO SPC 5 * PSTRT ROUTINE TO PUNCH G BLOCK SPC 1 PSTRT JSR CEXEC PUNCH IT? JSR PCRLF YES-SPACE DOWN JSR PUNON TURN PUNCH ON LDAA #'G PUNCH G JSR OCHAR LDX #TEMPA SET X-REG TO ADDR  JSR PUN PUNCH ADDR HI JSR PUN PUNCH ADDR LOW JSR PCRLF PUNCH LF CR NULLS JSR PUNOFF TURN PUNCH OFF XSCAN BRA SCAN GO SCAN SPC 5 * PUNDAT ROUTINE TO PUNCH DATA BLOCK SPC 1 PUNDAT JSR BEGEND GET BEG AND END ADDR JSR CEXEC DO IT? #  JSR PCRLF YES-SPACE DOWN JSR PUNON TURN PUNCH ON LDX BEGA TEMP BEGINNING ADDR STX TW PUND10 LDAB ENDA+1 FORM END-TEMP BEG SUBB TW+1 LDAA ENDA SBCA TW BEQ PUND25 DIF<255 LDAB #$FF YES-SET BLOCK=256 PUND25 LDAA #'B PUNCH B JSR OCHAR PSHB PUNCH BYTE COUNT CLRB INZ CHKSUM TSX BSR PUN PULA GET BYTE COUNT INCA ADJUST IT STAA TEMP SAVE IT LDX #TW PUNCH ADDR BSR PUN BSR PUN LDX TW PUNCH DATA PUND30 BSR PUN DEC TEMP DONE? BNE PUND30 NO STX TW SAVE ADDR COMB PUNCH CHKSUM PSHB TSX BSR PUN PULB JSR PCRLF PUNCH LF CR NULLS LDX TW DONE? DEX CPX ENDA BNE PUND10 NO BSR PUNOFF YES-TURN PUNCH OFF BRA XSCAN GO SCAN SPC 2 * PUNLED ROUTINE TO PUNCH LEADER SPC 1 PUNLED JSR PUNON TURN PUNCH ON LDAB #70 70=7 INCHES CLRA NULL PUNL10 JSR OCHAR PUNCH IT DEC B DONE? BNE PUNL10 NO BSR PUNOFF YES-TURN PUNCH OFF YSCAN BRA XSCAN GO SCAN SPC 5 * CEXEC EXECUTE CONVERSATION ROUTINE SPC 1 CEXEC LDX #EXEC PRINT EXEC JSR PDATA JSR INCHNP INPUT CHAR CMPA #'N N? BNE CEXE10 NO INS YES-CORRECT S-REG INS  BRA YSCAN ABORT CEXE10 CMPA #'Y Y? BNE CEXEC NO RTS SPC 5 * PUNON PUNCH ON SUBROUTINE SPC 1 PUNON INC CASSET SET PUNCH ON FLAG PON10 LDAA #$7F SEND RUBOUT BEFORE PUNCH ON JSR OCHAR PON20 LDAA #$12 TURN PUNCH ON JSR OCHAR RTS SPC 4 * PUN PUNCH DATA BYTE ROUTINE SPC 1 PUN LDAA X GET DATA JSR OCHAR PUNCH IT ADDB X UPDATE CHKSUM INX UPDATE ADDR CMPA #$14 CHAR=PUNCH OFF? BEQ PON20 YES-TURN PUNCH ON RTS SPC 5 * PUNOFF PUNCH OFF SUBROUTINE SPC 1 PUNOFF LDAA #$14 TURN PUNCH OFF JSR OCHAR POFF10 CLR CASSET RESET PUNCH ON FLAG LDAA MTTYDI RESET ACIA INPUT BUFFERS LDAA MTTYDI RTS SPC 5 * MESSAGES SPC 1 HDNG FCC !BINARY TAPE ! PUNCH FCC !PUNCH ! FCB 4 END MON   0010 NAM LPOUT 0020 * 0030 * LINE PRINTER DRIVER ROUTINES 0050 * 0060 * WRITTEN BY: W.D.PIERCE 0070 *  MOTOROLA MICROSYSTEMS 0080 * PHOENIX,ARIZ. 0090 * 11-8-1976 0100 * POUT---ENTRY TO THE ROUTINE FOR LINE FEED ONLY 0101 * POUT1--ENTRY TO THE ROUTINE FOR NORMAL DATA PRINTOUT 0102 * NOTE: $OC IS USED FOR FORM FEED 0103 * 0110 OPT O,SYM 0120 ACIA1C EQU $E000 PRINTER ACIA STATUS 0130 ACIA1D EQU $E001 PRINTER ACIA DATA 0140 * 0250 ORG $3700 PUT THE DRIVER AT A HIGH MEM 0260 SETUP FCB 0 0270 XSAVE RMB 2 0280 * 0290 POUT BSR LINEF DO A LINE FEED 0300 * 0310 POUT1 LDA A 0,X 0320 CMP A #$04 IS THIS THE END 0330 BEQ PTDN 0340 CMP A #$0D IS IT A CR. 0350 BEQ NXT IF YES, THEN SKIP IT 0360 CMP A #$0C IS IT A FORM FEED 0370 BEQ FOR$ MF 0380 CMP A #$0A IS IT A LINE FEED 0390 BNE NLF 0400 LDA A 1,X 0410 CMP A #$04 IS THE NEXT CHAR AN EOD 0420 BEQ NXT 0430 BSR LINEF NO 0440 BRA NXT 0450 NLF BSR OUTCH OUTPUT THE CHAR 0460 NXT INX SET UP FOR MORE 0470 BRA POUT1 0480 * 0490 FORMF BSR ENDLN END THE BUFFER 0500 LDA A #$0C 0510  BSR OUTCH OUTPUT A FORM FEED 0520 BSR ENDLN END THE BUFFER 0530 BRA NXT 0540 * 0550 LINEF BSR ENDLN DUMP THE BUFFER SO FAR 0560 LDA A #$0A 0570 BSR OUTCH OUTPUT A LINE FEED 0580 * 0590 ENDLN EQU * 0600 PTDN LDA A #$0D 0610 BSR OUTCH END THE BUFFER 0620 STX XSAVE 0630 LDX #0000 WAIT FOR A WHILE 0640 WAIT INX 0650 CPX #$0800 0660 BNE WAIT 0670 LDX XSAVE 0680 DN1 LDA A ACIA1C IS THE PRINTER DONE 0690  AND A #$08 0700 BEQ DN2 YES 0710 BRA DN1 NO,WAIT FOR IT THEN 0720 DN2 RTS 0730 * 0740 OUTCH PSH B SAVE THE B-REG 0750 LDA B SETUP IS THE ACIA SETUP YET 0760 BNE OK1 0770 LDA B #$43 SET IT UP THEN 0780 STA B ACIA1C 0790 LDA B #$0A 0800 STA B ACIA1C 0810 INC SETUP FLAG IT 0820 OK1 LDA B ACIA1C  IS THE PRINTER READY 0830 AND B #$08 0840 BNE OTDN 0850 OUT1 LDA B ACIA1C IS THE ACIA READY 0860 AND B #$02 0870 BEQ OUT1 0880 STA A ACIA1D OUTPUT A CHAR 0890 OTDN PUL B RESET THE B-REG 0900 RTS 0910 * 0920 END 0930 MON% *THISPROGRAMISAVAILABLEONPAPERTAPEONLY,FORAFEEOF$25. hh  NAM TTTGPC V1 073075  OPT NG,MEM  ORG 0 ARAY FCB $0A  FCC * 1 ! 2 ! 3*  FCB $0D,$0A  FCC *---!---!---*  FCB $0D,$0A ARAX FCC * 4 ! 5 ! 6*  FCB $0D,$0A  FCC *---!---!---*  FCB $0D,$0A ARAZ FCC * 7 ! 8 ! 9 *  FCB 4 ARA1 EQU ARAY+2 ARA2 EQU ARAY+6 ARA3 EQU ARAY+10 ARA4 EQU ARAX+1 ARA5 EQU ARAX+5 ARA6 EQU ARAX+9 ARA7 EQU ARAZ+1 ARA8 EQU ARAZ+5 ARA9 EQU ARAZ+9 ARTB FDB ARTB,ARA1,ARA2,ARA3,ARA4,ARA5,ARA6  FDB ARA7,ARA8,ARA9 K FCB 0 M FCB 0 SKIL FCB 10 RN FCB 0,0,0 PROT FCB 0 XWSW FCB 0 OWSW FCB 0 IWM FCC *I TAKE: * IWM1 FCB 0,4 PSKM FCC *SKILL =* SKILC FCB 10,13,10,4 TEMPS FDB 0 TX1 FDB 0 TSTI FCB 0 TRTBL FDB 0,S1,S2,S5,OW,OWF OUTCH EQU $F018 PDATA EQU $F024 PDATA1 EQU $F027 PCRLF EQU $F021 INCHNP EQU $F015 MTTYSI EQU $FCF4  ORG 256  JMP START MSG1 FCC *HELLO! I AM A MOTOROLA M6800 MICROCOMPUTER.*  FCB $0D,$0A  FCC *I AM PROGRAMMED TO PLAY TIC-TAC-TOE.*  FCB $0D,$0A  FCC *YOU ARE "O" AND YOU PLAY FIRST.*  FCB $0D,$0A  FCC *YOU PLAY BY TYPING A NUMBER FROM 1 TO 9 AS FOLLOWS:*  FCB 4 INVM FCC *INVALID REPLY! PLEASE TYPE AGAIN:*  FCB 4 OCCR FCC *THAT LOCATION IS ALREADY TAKEN; PLEASE TRY ANOTHER.*  FCB 4 YPM FCC *YOUR PLAY: *  FCB 4 OWM FCC *YOU WIN!*  FCB 4 XWM FCC *I WIN!*  FCB 4 TIEM FCC *TIE GAME.*  FCB 4 ASKM FCC *WOULD YOU LIKE TO PLAY AGAIN? *  FCB 4 SESKM FCC *TYPE NEW SKILL: 0(LOW) TO 9(HIGH) OR P(PERFECT). *  FCB 4 ENDM FCC *THANK YOU. I HOPE YOU HAVE ENJOYED THE GAME.*  FCB $0D,$0A  FCC *YOU MAY RESTART BY TYPING ANY CHARACTER.*  FCB 10,10,10,10,10,10,10,10,4 YNM FCC *PLEASE TYPE "Y" OR "N".*  FCB 4 * * ROTATE SUBROUTINE * CALL SEQ: JSR ROT * FDB ADDR TO GO IF K NOT 0 * ROT LDAB ARA1 ROTATE CORNERS  LDAA ARA7  STAA & ARA1  LDAA ARA9  STAA ARA7  LDAA ARA3  STAA ARA9  STAB ARA3 *  LDAB ARA2 ROTATE SIDES  LDAA ARA4  STAA ARA2  LDAA ARA8  STAA ARA4  LDAA ARA6  STAA ARA8  STAB ARA6 *  TSX  LDX 0,X X HAS CALL ADDR  INS  INS  DEC K  BNE ROT1  LDAA #4 K WENT TO 0  STAA K MAKE IT 4  JMP 2,X RETURN TO CALL +2 * ROT1 LDX 0,X GET NZ RTN ADDR  JMP 0,X RETURN TO BR ADDR * * * TEST SUBROUTINE * CALL SEQ: JSR TEST * STRING OF TEST CHARS * TEST CHAR: BIT 7: END OF STRING *  BIT 6: 0=OR, 1=AND * BT 54: 00=V, 01=X, 10=O * B 3-0: ARAY LOC OR TRUE BR CODE * TEST TSX  STS TEMPS  LDS 0,X S POINTS TO STRING  DES  CLR TSTI RESET INDICATOR TEST1 PULA GET TEST BYTE  TSTA  BMI TESTE END OF STRING  TAB  ANDB #15 MASK LS 4 BITS  ASLB DOUBLE IT  STAB TX1+1 PUT IN X  LDX TX1  LDX ARTB,X GET ELEMENT ADDR  LDAB 0,X GET ARAY ELEMENT  BITA #$10 TEST FOR X?  BEQ TES2 NO  CMPB #'X YES, ARAY = X?  BEQ TTRUE YES  BRA TFALS NO TES2 BITA #$20 TEST FOR O?  BEQ TES3 NO  CMPB #'O YES, ARAY = O?  BEQ TTRUE YES  BRA TFALS NO TES3 CMPB #$20 ARAY = SPACE?  BEQ TTRUE TFALS BITA #$40 AND FUNCTION?  BNE TFAL1 YES, SKIP  INC TSTI NO, INCR IND TFAL1 LSR TSTI CLEAR IND  ASL TSTI ---BIT 0 (TEMP)  BRA TEST1 CONTINUE TTRUE BITA #$40 AND FUNCTION?  BNE TEST1 YES, CONTINUE  INC TSTI NO, INCR IND  LSR TSTI SET IND LSB  SEC  ROL TSTI  BRA TEST1 CONTINUE *  * TRUE & OR: IF TEMP, SET PERM; SET TEMP * FALS & OR: IF TEMP, SET PERM; RES TEMP * FALS & AND: RESET TEMP * TESTE TSX X HAS FALSE RETURN ADDR  LDS TEMPS RESTORE S  INS  INS  TST TSTI TEST TRUE?  BNE TEST4 YES  JMP 0,X NO, RETURN TEST4 ANDA #15 MASK RETURN CODE  STAA TX1+1  LDX TX1  LDX TRTBL,X  JMP 0,X GO TO TERM ROUTINE * * * * PLAY ROUTINE * BN EQU RN+1 * PLAY LDAA RN  ANDA #15  SUBA #5  STAA BN BN NEG 30% OF THE TIME P1 LDAA M  CMPA #1 M=1?  BNE P2 NO P18 LDAA SKIL  CMPA #6 S>6?  BGT P22 YES P19 CMPA #5 S:5  BGT P21 GR  BLT P4 LESS P20 TST BN  BPL P4 70%  BRA P22 30% P21 TST BN  BMI P4 30% P22 JSR TEST O2,O5 GO S1  FCB $22,$25,$82 P23 JSR TEST O1 GO S5  FCB $21,$86 P24 JSR ROT  FDB P22  JMP * SH NOT BR HERE P2 JSR TEST D1 FUNC GO OW  FCB $21,$62,$63,$21,$65,$69,$22,$65,$68,$88 P3 JSR ROT  FDB P2 ' P4 INC XWSW SET XW SWITCH  JSR TEST D2A FUNC GO S1  FCB $12,$53,$41,$15,$59,$41,$14,$57,$41,$82 P5 JSR TEST D2B FUNC GO S2  FCB $11,$53,$42,$15,$58,$42,$84 P6 JSR TEST D2C FUNC GO S5  FCB $11,$59,$45,$12,$58,$45,$86 P7 JSR ROT  FDB P4  CLR XWSW RES XW SW P8 LDAA SKIL  CMPA #1 SKILL:1  BGT P10 GR  BLT P17 LESS P9 TST BN  BPL P17 70%  BRA P13 30% P10 LDAA SKIL  CMPA #2 SKILL=2?  BEQ P12 YES P11 CMPA #5 SKILL=5?  BNE P13 NO P12 TST BN  BMI P17 30% P13 JSR TEST D3A FUNC GO S1  FCB $22,$63,$41,$25,$69,$41,$24,$67,$41,$82 P14 JSR TEST D3B FUNC GO S2  FCB $21,$63,$42,$25,$68,$42,$84 P15 JSR TEST D3C FUNC GO S5  FCB $21,$69,$45,$22,$68,$45,$86 P16 JSR ROT  FDB P13 P17 LDAA M  CMPA #2 M=2?  BNE P33 NO P25 LDAA SKIL  CMPA #9 SKILL:9  BLT P27 LESS  BGT P29 GS P26 TST BN  BMI P33 30%  BRA P29 70% P27 CMPA #8 SKILL=8?  BNE P33 NO P28 TST BN  BPL P33 70% P29 JSR TEST D4A FUNC GO S1  FCB $01,$62,$55,$67,$01,$66,$68,$49,$01,$63  FCB $65,$01,$42,$53,$67,$01,$63,$57,$68,$82 P30 JSR TEST D4B FUNC GO S2  FCB $02,$64,$55,$02,$55,$66,$02,$61,$69,$02  FCB $63,$67,$02,$64,$67,$02,$66,$69,$84 P31 JSR TEST D4C FUNC GO S5  FCB $05,$62,$64,$51,$05,$62,$67,$51,$05,$63  FCB $64,$51,$05,$61,$66,$68,$59,$86 P32 JSR ROT  FDB P29 P33 LDAB RN RANDOM NO. IN B  LDAA M M IN A  CMPA #2 M:2  BGT P36 GR  BEQ P35 EQ P34 CMPB #$20 RNC>20?  BGT P39 YES P35 CMPB #$30 RNC>30?  BGT P39 YES P36 CMPA #4 M=4?  BEQ P38 YES P37 CMPB #$40 RNC>40?  BGT P39 YES P38 CMPB #$80 RNC>80?  BGT P42 YES P38A JSR TEST 5 VACANT?  FCB $05,$86 YES, GO S5 * BRA P40 P39 CMPB #$80 RNC>80?  BGT P42 YES P40 JSR TEST 1 VACANT?  FCB $01,$82 YES,GO S1 P41 JSR ROT NO  FDB P40 P42 JSR TEST 2 VACANT?  FCB $02,$84 YES, GO S2 P43 JSR ROT NO  FDB P42  BRA P38A KEEP TRYING * * END OF PLAY ROUTINE * * * MAIN PROGRAM LOOP * * INITIALIZE START LDX #ARTB+2  LDAA #'1 INI1 STX ARTB  LDX 0,X  STAA 0,X STORE NO. IN ARAY  CMPA #'9 A=9?  BEQ INI2 YES  LDX ARTB NO, GET NEXT ADDR  INX  INX  INCA INCR A TO NEXT DIGIT  BRA INI1 CONTINUE INI2 LDX #MSG1   JSR PDATA PRINT "HELLO"  LDX #ARAY  JSR PDATA PRINT ARAY INIT LDX #ARTB+2 CLEAN OUT ARAY  LDAA #$20 A=SPACE  LDAB #9 B=COUNT INI3 STX ARTB  LDX 0,X  STAA 0,X  DECB DECR COUNT  BEQ INI4 DONE  LDX ARTB  INX  INX  BRA INI3 INI4 LDAA #4 SET K=( 4  STAA K  LDAA #1 SET M=1  STAA M  CLR XWSW  CLR OWSW  JSR PCRLF  LDAA SKIL SKILL <10?  CMPA #10  BGE TYPL NO  ORAA #'0 MAKE ASCII CHAR  STAA SKILC  LDX #PSKM PRINT "SKILL="  JSR PDATA TYPL LDX #YPM PRINT "YOUR PLAY"  JSR PDATA1 INCRN INC RN INCR RANDOM NOS.  BNE INCR1  INC RN+2 INCR1 LDAA MTTYSI TEST INPUT  ASRA  BCC INCRN NOT READY  JSR INCHNP GET REPLY  CMPA #'S REPLY =S?  BNE TSTRPL NO, CONTINUE  LDAA M M=1?  CMPA #1  BNE INVR NO  LDX #SESKM NEW SKILL MSG  JSR PDATA  JSR INCHNP GET REPLY   CMPA #'0  BLT SKIN1  CMPA #'9  BLE SKIN2 SKIN1 LDAA #10 NOT 0-9, MAKE 10 SKIN2 ANDA #15 MASK LS 4 BITS  STAA SKIL STORE NEW SKILL  JSR PCRLF  BRA TYPL TRY AGAIN TSTRPL CMPA #'1  BLT INVR REPLY <1  CMPA #'9  BGT INVR REPLY >9  ANDA #15 MASK LS 4 BITS  ASLA MULT BY 2  STAA TX1+1  LDX TX1  LDX ARTB,X GET ELEMENT ADDR  LDAA 0,X GET ELEMENT  CMPA #$20 SPACE?  BNE OCCU NO  LDAA #'O YES  STAA 0,X PUT O IN ARAY  LDAA RN+2 GET RN2  ANDA #3 MASK LS 2 BITS  STAA PROT INIT PROT  INCA ADD1  STAA K INIT K PRER JSR ROT PRE-ROTATE  FDB PRER  JMP PLAY INVR LDX #INVM PRINT "INVALID"  JSR PDATA  BRA INCRN OCCU LDX #OCCR PRINT "OCCUPIED"  JSR PDATA  BRA INCRN * * PLAY ROUTINE RETURNS TO ONE OF THE FOLLOWING- * S1 LDAA #'Z PUT Z IN ARRAY  STAA ARA1  BRA CLR * S2 LDAA #'Z  STAA ARA2  BRA CLR * S5 LDAA #'Z  STAA ARA5  BRA CLR * OW INC OWSW SET OW SW CLR LDAA K  ADDA #3  SUBA PROT A= K+3-PROT  STAA K POST JSR ROT POST-ROTATE  FDB POST  TST OWSW OW SW SET?  BNE ENDO YES  LDAB #1  LDX #ARTB+2 FINDZ STX ARTB  LDX 0,X  LDAA 0,X  CMPA #'Z  BEQ FOUNDZ  LDX ARTB  INCB  INX  INX  BRA FINDZ FOUNDZ LDAA #'X REPLACE Z WITH X  STAA 0,X  ORAB #'0 MAKE B ASCII NO.  STAB IWM1 PUT IN MSG  LDX #IWM  JSR PDATA PRINT "I TAKE"  LDX #ARAY  JSR PDATA PRINT ARAY  TST XWSW XW SW SET?  BNE ENDX YES  LDAA M NO, M IN A  INC M INCREMENT M  CMPA #4 WAS M=4?  BEQ FINDS YES, CONTINUE  JMP TYPL NO, NEXT PLAY FINDS LDX #ARTB+2 FINDSP STX ARTB  LDX 0,X  LDAA 0,X  CMPA #$20 SPACE?  BEQ FOUNDS YES  LDX ARTB  INX  INX  BRA FINDSP ENDO LDX #ARAY PRINT ARAY  JSR PDATA ENDO1 LDX #OWM PRINT "YOU WIN"  JSR PDATA1  BRA ASK GO ASK ENDX LDX #XWM PRINT "I WIN" )  JSR PDATA1  BRA ASK GO ASK FOUNDS LDAA #'O  STAA 0,X MAKE IT O  STX ARTB OWT JSR TEST TEST O WIN GO OWF  FCB $21,$62,$63,$21,$65,$69,$22,$65,$68,$8A  JSR ROT  FDB OWT  LDX #TIEM TYPE "TIE"  JSR PDATA1  BRA ASK GO ASK OWF LDX ARTB  LDAA #$20 SPACE IN A  STAA 0,X PUT SPACE IN ARAY  BRA ENDO1 ASK LDX #ASKM ASK1 JSR PDATA PRINT "WOULD YOU"  JSR INCHNP GET REPLY  CMPA #'Y YES?  BNE ASK2 NO, CONTINUE  JMP INIT YES, NEW GAME ASK2 CMPA #'N NO?  BNE YORN NO  LDX #ENDM YES, PRINT "THANK"  JSR PDATA  JSR INCHNP WAIT  JMP START NEW SESSION * YORN LDX #YNM  BRA ASK1 PRINT "PLEASE"  END  MON  !  NAM PUNCH * * * OPT O * * * REENTE EQU $F0F9 XBUG ENTRY POINT BEGEND EQU $F003 START EQU $FF0A START PUNCH ADDR FINISH EQU $FF0C FINISH PUNCH ADDR * ORG 0 * * * INDEX RMB 2 TIMER RMB 2 STACKS RMB 9 STACK RMB 1  ORG $5000 * PIA0 RMB 1 D.D.R./O.R. INPUT SIDE PIA1 RMB 1 C.R. INPUT SIDE PIA2 RMB 1 D.D.R./O.R. OUTPUT SIDE PIA3 RMB 1 C.R. OUTPUT SIDE * ORG $1E00 * * PNCHPR STS STACKS LDS #STACK CLR A STA A PIA1 INPUT C.R. STA A PIA3 OUTPUT C.R. STA A PIA0 INPUT D.D.R. COM A STA A PIA2 OUTPUT D.D.R. LDA A #$2C STA A PIA3 INIT OUTPUT C.R. JSR BEGEND BSR PNULLS PUNCH LEADER * LDA A #$FF STA A PIA2 SEND RUB-OUT CHAR BSR DELAY WAIT FOR PUNCHING LDX START INIT FOR 1ST CHAR * CHAROT LDA A X GET CHAR STA A PIA2 PUNCH CHAR BSR DELAY WAIT 60 MS INX ADV POINTER CPX FINISH FINISHED YET? BNE CHAROT NO, GO BACK * BSR PNULLS PUNCH TRAILER LDS STACKS RESTORE STACK JMP REENTER RETURN TO XBUG!! * * * PNULLS LDA B #$30 SET FOR 48 NULLS CLR A AGAIN STA A PIA2 BSR DELAY DEC B BNE AGAIN RTS * * * DELAY STX INDEX SAVE POINTER LDX #TIMER PSH A LDA A #54 GO FOR 54 MS STA A X DELAY1 LDA A #$5A 1 MS/1MIC CLOCK STA A 1,X USE $2D FOR 2MIC CLOCK DELAY2 DEC 1,X INNER LOOP BNE DELAY2 DEC X OUTER LOOP BNE DELAY1 LDX INDEX RESTORE POINTER PUL A RTS * * * END * NAMBCDTOBINREV0.0,9-19-75 OPTSPRINTSYMBOLS OPTOPUNCHOBJECTTAPE *THISPROGRAMCONVERTSFOURBINARYCODEDDECIMAL *DIGITSTOABINARYEQUIVALENT.THEBCDDIGITS *AREPACKEDTWOPERBYTE.THEBINARYRESULT *OCCUPIESTWOBYTES.THEBCDDIGITSARELOADED *INTOTHEAANDBREG(MSDTOA)ANDTHEBCDBIN *SUBROUTINEISCALLED.THEROUTINEEXITSWITH *THEBINARYRESULTINAANDB. * *EXAMPLE-CONVERTBCDVALUE9876TOBINARY *.LDAA98 *.LDAB76 *.JSRBCDBIN *UPONEXITFROMTHESUBROUTINE *.A=HEX=00100110BIN *.B=94HEX=10010100BIN * *NOTETHERANGEOFBCDVALUESIS0000TO9999 ORG100H BCDBINSTAASAVE1SAVE2MSBCDVALUES CLRBINUPR TBA ANDB#0FHSAVEONLYLSBCDVALUE LSRAMOVETENSBCDVALUETO LSRALOWERFOURBITSOFA LSRA LSRA TENLPBEQDOHUNDGODOHUNWHENTENISZERO ADDB#10ADDTENTOBINARYTOTAL DECADECREMENTTENSDIGITAND BRATENLPREPEATUNTILZERO. DOHUNDCLCRESETCARRY LDAASAVE1GETHUNANDTHOUDIGIT ANDA#0FHSAVEONLYHUNDIGIT HUNLPBEQDOTHOUGODOTHOUIFHUNISZERO ADDB#100ADD100TOBINARYVALUE BCCHUN00 INCBINUPR0DD256TOBINUPPERVALUE HUN00DECADECREMENTHUNDIGIT0ND BRAHUNLPREPEATUNTILZERO DOTHOULDAASAVE1GETTHOUDIGIT LSRAMOVETHOUBCDVALUETO LSRALOWERFOURBITSOFA. LSRA LSRA STAASAVE1SAVETHOUDIGIT BNETHOU00BRANCHIFTHOUDIGITISZERO LDAABINUPRGETBINARYUPPERVALUE BRAXITBIN THOU00LDAABINUPRGETBINARYUPPERVALUE THOULPCLCRESETCARRY ADDB#232ADD232TOBINARYLOWER ADCA#03HADD768TOBINARYUPPER DECSAVE1DECREMENTTHOUDIGIT BNETHOULPREPEATUNTILTHOUDIGITZERO XITBINRTSEXITSUBROUTINE BINUPRFCB0BINARYUPPERTEMPSTORAGE SAVE1FCB0DIGITTEMPORARYSTORAGE *SAMPLEPROGRAMTOTESTTHEBCDBINSUBROUTINE *USINGTHEMOTOROLAEXORCISER. * *1.AFTERLOADINGTHEPROGRAM,ENTERTHEBCDVALUES *TOBECONVERTEDINTOMEMORYLOCATIONS *0000AND0001USINGMAID. *2.SETABREAKPOINTATADDRESS001CUSINGMAID. *3.CONVERTTHEVALUESTOBINARYBYEXECUTINGTHE *PROGRAMAT0010USINGMAID. *4.UPONREACHINGTHEBREAKPOINT,THERESULT *WILLBEPRINTEDASFOLLOWS: *.XHASBCDVALUEJUSTCONVERTED *.AHASBINARYRESULTUPPERVALUE *.BHASBINARYRESULTLOWERVALUE *5.NEWBCDVALUESMAYBELOADEDINTOADDRESSES *0000AND0001ANDTHECONVERSIONWILLREPEAT *WHENCONTINUINGFROMTHEBREAKPOINTUSINGMAID. ORG10H BCDMSEQU0 BCDLSEQU1 TESTLDS#300HINITIALIZESP LDAABCDMSGETTHOUANDHUNDIGITS LDABBCDLSGETTENSANDUNITSDIGITS JSRBCDBINGOCONVERTTHEMTOBINARY LDXBCDMSGETBCDVALUESFORDISPLAY NOPSETBREAKPOINTHERETO NOPPRINTCONVERSIONRESULTS. BRATESTREPEATCONVERSION END   NAM SQROOT * * REV 1.1 * * SQUARE ROOT OF 16 BIT NUMBER, * NUMBER TO BE OPERATED ON IS IN DIV * * +  * RESULT IS IN QUO * * ORG $300 STX SAVEX SQROOT CLR REM CLEAR REMAINDER CLR REM+1 CLR QUO CLEAR RESULT CLR QUO+1 LDAA #8 STAA PASS SET NO. OF PASSES GO CLC ROL DIV+1 SHIFT TWO BITS TO REMAINDER ROL DIV TRY A "1" FOR THE TRIAL DIVISOR ROL REM+1 ROL REM CLC ROL DIV+1 ROL DIV ROL REM+1 ROL REM SEC TRIAL "1" ROL QUO+1 DOUBLE QUO ROL QUO LDAA REM+1 SUBTRACT RESULT FROM SUBA QUO+1 REMAINDER AND SAVE STAA TEMPRE+1 LDAB REM SBCB QUO STAB TEMPRE BCS NEG NEGATIVE RESULT? LDX TEMPRE NO, USE NEW REMAINDER STX REM INSERT "1" IN RESULT INC QUO+1 COUNT DEC PASS BEQ DONE BRA GO NEG DEC QUO+1 BRA COUNT DONE ASR QUO RECOVER RESULT FROM DIVISOR ROR QUO+1 LDX SAVEX RTS * * * REM RMB 2 QUO RMB 2 DIV RMB 2 TEMPRE RMB 2 SAVEX RMB 2 PASS RMB 1 END MON }} NAM UPC * REVISION 1.0 OPT NOG,O ORG $C010 WAND PIA XP2DRA RMB 1 XP2DRB RMB 1 XP2CRA RMB 1 XP2CRB RMB 1 ORG $0000 WSTGBF RMB 12 UPC DIGIT BUFFER WFLAG RMB 1 BAR/SPACE FLAG WSPCFL EQU WFLAG SPACE FLAG WSHFTF EQU WFLAG SHIFT FLAG WFLOPP EQU WFLAG SWAP FLAG WSPCNT RMB 1 SPACE COUNT WBRCNT RMB 1 BAR COUNT WCHRCT EQU WBRCNT CHARACTER COUNT WFLGCT RMB 1 LOOP COUNT W34MOD RMB 1 3/4 MODULE COUNT TIME WSPAVG RMB 2 SPACE COUNT AVERAGE WBRAVG RMB 2 BAR COUNT AVERAGE WENDAD RMB 2 END ADDRESS BUFFER WCTADD RMB 2  CHARACTER BUFFER WSBFAD RMB 2 STORAGE BUFFER ADDRESS WCBFAD RMB 2 CHARACTER BUFFER ADDRESS WDUMBF EQU WCBFAD DUMMY BUFFER WMODTM RMB 1 MODULE TIME WTSAMP RMB 1 SAMPLE TIME XVFLG1 RMB 1 TEMPORARY BUFFERS  XVFLG2 RMB 1 XVFLG3 RMB 1 XVFLG4 RMB 1 XVMSTK RMB 2 XVTEMP RMB 2 XKDVND RMB 2 DIVIDE SUBROUTINE BUFFERS  XKDVSR RMB 1 XKQUOT RMB 2 WVSCNB RMB $76 WAND SCAN BUFFER * DEFINE SCAN CONVERSION TABLES WPCTBL FCB $D,$19,$13,$3D,$23,$31,$2F,$3B,$37 FCB $0B WPCTBR FCB $58,$4C,$64,$5E,$62,$46,$7A,$6E,$76 FCB $68 PAGE ORG $400 *INITIALIZE THE WAND PIA IKINIT LDX #0 STX XP2CRA SELECT DIRECTION REGS LDX #$7FFF STX XP2DRA DRA B7 IS AN INPUT LDX #$C4C4  STX XP2CRA INITIALIZE CONTROL REGS RTS * THIS IS THE DATA GATHERING SECTION. * THE BARS AND SPACES OF THE UPC LABEL * ARE STORED AS 2 BYTE COUNTS * PROPORTIONAL TO THEIR WIDTH XKWAND LDX #14 CLEAR BUFFERS USING CLRUPC CLR X  ADDRESSES 0 THRU 14 DEX BNE CLRUPC CLR X LDX #WVSCNB STX WSBFAD LDAB XP2DRA LINE LOW, SPACE?  BPL WRGOOD YES: CONTINUE RTS NO: NOT SCANNING, RETURN WRGOOD LDX #$FF00 YES: INIT BOARDER COUNT WBDRLP,  LDAB XP2DRA LINE HIGH, BAR? BMI WBLKLP YES: TO TIMING BAR LOOP DEX DECREMENT COUNT BNE WBDRLP NOT ZERO: LOOP RTS TOO LONG ON BOARDER, RETRN WBLKLP LDX #$0000 BLACK BAR TIMING LOOP WBLKL1 LDAB XP2DRA LINE LOW, SPACE? BPL WHS1 YES: END LOOP LDAA WBRCNT NO: CMPA #30 TOO MANY BARS? BEQ WRDBD1 YES: RETRY EXIT CPX #$401 TOO LONG ON BAR? BEQ WTOSLW YES: DISPLAY "TOO SLOW" INX  NO: INCREMENT COUNT BRA WBLKL1 LOOP BACK WHS1 INC WBRCNT INC BAR COUNT INC WFLAG SET "FROM BLACK" FLAG BRA WSTRGE WHITLP LDX #$0000 WHITE BAR TIMING LOOP WHITL1 LDAB XP2DRA LINE HIGH, BAR? BMI WHS2 YES: END LOOP LDAA WSPCNT NO CMPA #29 DONE GATHERING DATA? BEQ WNDADJ YES: TO NEXT SECTION CPX #$401 TOO LONG ON SPACE? BEQ WTOSLW YES: DISPLAY "TOO SLOW" INX NO: INCREMENT COUNT BRA WHITL1 WHS2 INC WSPCNT INC SPACE COUNT CLR WFLAG RESET "FROM BLACK" FLAG BRA WSTRGE THIS MAKES TIMING LOOPS EQU WSTRGE STX WDUMBF LOAD A AND B LDX WSBFAD WITH CONTENTS OF LDAA WDUMBF INDEX REG. (COUNTER) LDAB WDUMBF+1 STAA X STORE COUNT IN STORAGE STAB $1,X BUFFER INX  INCREMENT STORAGE INX BUFFER ADDRESS STX WSBFAD TST WFLAG TEST FLAG BEQ WBLKLP  JUMP TO CORRECT BRA WHITLP TIMING LOOP WTOSLW JMP WDSPTS TOO SLOW ERROR EXIT WRDBD1 JMP WBADRD RETRY ERROR EXIT SPC 2 * THIS SECTION ADDS THE SPACE COUNTS IN THE * GUARD BARS AND CENTER SECTION, THEN * AVERAGES THEM, THE AVG IS IN WSPAVG WNDADJ CLR B CLEAR SUM BUFFERS CLR A LDX #WVSCNB+2 BSR WNDADD LDX #WVSCNB+$36 BSR WNDADD LDX #WVSCNB+$3A BSR WNDADD LDX #WVSCNB+$3E BSR WNDADD LDX #WVSCNB+$72 BSR WNDADD STAA XKDVND STORE SUM IN DIVIDEND STAB XKDVND+1 LDAA #5 LOAD DIVISOR STAA XKDVSR JSR XKDIVD DIVIDE LDX XKQUOT STORE QUOTIENT IN SPACE AVG STX WSPAVG * THIS SECTION ADDS AND AVERAGES THE BARS IN THE * GUARD BARS AND CENTER, THE AVG IS IN WBRAVG CLR B CLEAR SUM BUFFERS CLR A LDX #WVSCNB POINT AT FIRST BAR COUNT BSR WNDADD LDX #WVSCNB+4 BSR WNDADD LDX #WVSCNB+$38 BSR WNDADD LDX #WVSCNB+$3C BSR WNDADD LDX #WVSCNB+$70 BSR WNDADD LDX #WVSCNB+$74 BSR WNDADD STAA XKDVND STORE SUM IN DIVIDEND STAB XKDVND+1 LDAA #6 LOAD DIVISOR INTO ITS STAA XKDVSR JSR XKDIVD DIVIDE  LDX XKQUOT STORE QUOTIENT IN BAR AVG STX WBRAVG SPC 2 * THE NEXT TWO SECTIONS CALCULATE * THE CORRECTION FACTOR TO * COMPENSATE FOR PRINTING TOLERANCE * ERRORS CLR WSPCFL CLEAR SPACE FLAG TST WBRAVG  TEST AVG VALUES TO SEE IF BNE WDTS10 TOO LARGE; IF SO DISPLAY TST WSPAVG "TOO SLOW" BNE WDTS10 LDAB WBRAVG+1 GET AVERAGES INTO ACC'S LDAA WSPAVG+1 CBA TEST TO SEE WHICH IS L- ARGER BGE WNDRTO A>OR=B: OK TO TEST SECTION INC WSPCFL A0 BNE WDADD2 LOOP TO SHIFT AGAIN CMPB WTSAMP IF >OR= (AVG MOD TIM)*5/8 BCC WDADD2 LOOP TO SHIFT AGAIN WDADD7 LDX WSBFAD GET COUNT DATA POINTER CPX WENDAD TEST IF DONE  BEQ WDADD3 YES: BRANCH COM WSHFTF NO: COMPLIMENT SHIFT BYTE INX POINT AT NEXT COUNT INX STX WSBFAD BRA WDADD6 LOOP BACK WDADD3 LDX WENDAD TEST IF CONVERSION DONE CPX #WVSCNB+$6E BEQ WPARTY YES: GO TO NEXT SECTION CPX #WVSCNB+$34 NO: TEST IF DONE BEQ WDADD4  YES: BRANCH COM WSHFTF NO: CMOPLIMENT SHIFT BYTE LDX WSBFAD POINT AT NEXT SCAN DATA INX  INX STX WSBFAD BRA WDADD5 BRANCH TO END WDADD4 LDX #WVSCNB+$40 POINT AT SECOND HALF STX WSBFAD WDADD5 LDX WCBFAD POINT AT NEXT DIGIT INX STX WCBFAD BRA WDADD0 LOOP BACK TO START SPC 2 * THIS SECTION DETERMINES THE PARITY OF * THE FIRST UPC DIGIT, THEN IT SELECTS * THE DECODING TABLE CORRESPONDING TO THE * DIRECTION OF THE SCAN (L TO R IS ODD) WPARTY CLR XVFLG4 CLEAR SWAP FLAG CLR B CLEAR PARITY BUFFER  LDX #WSTGBF POINT AT FIRST UPC DIGIT LDAA X GET FIRST DIGIT WSHIFT LSRA SHIFT LSB INTO CARRY BVC WSHIFT CARRY CLEAR: BRANCH EORB #$80 CARRY SET: EOR MSBIT OF TSTA  PARITY BYTE; TEST IF DONE BNE WSHIFT NO: LOOP BACK TSTB YES: TEST PARITY BNE WLSFRS  ODD BRANCH INC XVFLG4 SET SWAP FLAG LDX #WPCTBR LOAD R TO L SCAN TABLE ADD BRA WPACK1 WLSFRS LDX #WPCTBL LOAD L TO R SCAN TABLE ADD WPACK1 STX WCTADD LDX #WSTGBF POINT AT UPC DIGIT UPC/ NST LDAA #12 INIT WSPCNT WITH # OF STAA WSPCNT CHARACTERS TO BE CONV'D WNXTCH CLR WFLAG CLR PASS 2 FLAG LDAA X GET CURRENT UPC CHAR. STX WSBFAD WPASS2 CLRB INIT BCD CHAR VALUE LDX WCTADD GET START TABLE ADD WCMPRE CMPA X UPC MATCH TABLE? BNE WNXLOC NO, CONTINUE SEARCH LDX WSBFAD YES, REPLACE UPC CODE WITH STAB X BCD EQUIVALENT DEC WSPCNT DEC CONVERTION COUNT BEQ WERCHK IF COMPLETE BRANCH INX POINT AT NEXT CHARACTER BRA WNXTCH  GET NEXT CHARACTER WNXLOC INX INCREMENT TABLE POINTER AND INCB BCD COUNT CMPB #$0A  SEARCHED ENTIRE TABLE? BNE WCMPRE NO, CONTINUE TST WFLAG YES, SEE IF IN SECOND PASS BNE WBADRD YES, BAD READ ERROR EXIT COMA NO, COMPLIMENT DIGIT ANDA #%01111111 AND START SECOND PASS INC WFLAG BRA WPASS2 SPC 2 * THIS IS THE ERROR CODE CHECK OF THE UPC * THE UPC CODE WILL BE FLOPPED IF NECESSARY WERCHK TST XVFLG4 TEST SWAP FLAG BEQ WERCK1 NOT SET: BRANCH SEI IF SET: SWAP UPC STS XVMSTK DIGITS END TO END LDS #WSTGBF+10 POINT AT TOP LDX #WSTGBF POINT AT BOTTOM WSWAP LDAA X GET BOTTOM PULB GRT TOP STAB X SWAP PSHA  DES ADJUST POINTERS INX CPX #WSTGBF+6 TEST IF DONE BNE WSWAP NO: BRANCH BACK LDS XVMSTK YES: RESTORE STACK CLI * THIS SECTION CALCULATES THE CHECK * CODE NUMBER (THE LAST DIGIT OF THE * UPC CODE) AND COMPARES IT WITH WHAT * WAS READ AS A FINAL CHECK WERCK1 LDX #WSTGBF GET ODD ADDRESS POINTER CLRA CLEAR SUM BUFFER WSTEP1 ADDA X ADD ODD NUMBER LOOP INX INX CPX #WSTGBF+12  BNE WSTEP1 WSTEP2 TAB MULTIPLY BY 3 ABA ABA LDX #WSTGBF+1 GET EVEN NUMBER ADDRESS POINTER WSTEP3 ADDA X ADD EVEN NUMBER LOOP INX INX CPX #WSTGBF+11 BNE WSTEP3 WSTEP4 SUBA #10 SUBTRACT 10 UNTIL RESULT BHI WSTEP4 16 DIVIDE ERROR ASL XKDVSR IF S<16 LEFT SHIFT DIVISOR BCC DVDLP0 IF0  C=0 CON'T LOOP ROR XKDVSR SHIFT THE DIVISOR BACK 1 * SHIFT COUNT NOW IN ACCB *  DIVISOR LEFT JUSTIFIED * IN XKDVSR LDAA XKDVND DVDLP1 CMPA XKDVSR IF THE DIVIDEND < DIVISOR BCS DVNSUB DON'T SUBTRACT DVDLP2 SEC IF THE DIVIDEND >OR= DIVISOR ROL XKQUOT+1 SHIFT Q LEFT 1 BIT ROL XKQUOT WITH LSB = 1 SUBA XKDVSR Y(M) = Y(M)-X STAA XKDVND BRA DVSHFT DVNSUB CLC SHIFT Q LEFT WITH ROL XKQUOT+1 LSB =0  ROL XKQUOT DVSHFT DECB S = S-1 BEQ DVDEND IF S = 0 STOP CLC IF S > 0 SHIFT DIVIDEND ROL XKDVND+1 LEFT ONE BIT; LSB=0 ROL XKDVND MSB INTO CARRY LDAA XKDVND BCS DVDLP2 IF C = 1 GO TO LOOP2 BRA DVDLP1 GO TO LOOP 1 DVDERR LDX #$FFFF STX XKQUOT DVDEND RTS END MON !#):(NAMCODEP * *REV410-22-76 * OPTOT,NOG XSTRRMB2 CXSTRRMB2 WSPEEDRMB2WORDSPEED SPEEDRMB2CHAR.SPEED BBOTRMB217 BTOPRMB1 PCRLFEQU$F021 PDATAEQU$F018 GDATAEQU$F015 PMESSEQU$F024 INADDREQU$F00F ORG$4004 PIA1ADRMB1 PIA1ACRMB1 PIA1BDRMB1 PIA1BCRMB1 ****************************************************************** *THISPROGRAMISADEMOPROGRAMFORTHEEXORCISER. *ITTAKESTHEASCIIDATAFROMTHEKEYBOARDANDCONVERTS *ITTOMORSECODE.THECODEISSENTOUTTHECB2LINE *OFPIA1BC.THECONVERTEDCODECHARACTERISDISPLAYED *TOLED'SCONNECTEDTOPIA1AD. ********************************************************************** ORG$2000 *KNBKARSKACK CODEFCB0,$B4,$8B,$54,$16,0,$14,0 *ERRSP FCB1,0,0,0,0,$0D,0,0 FCB0,0,0,0,0,0,0,0 *AS FCB0,0,0,$44,0,0,0,0 *SP''' RTABFCB$21,0,$4A,0,0,0,0,$7A *()."-./ FCB$B6,$B2,0,0,$CE,$86,$56,$94 *01234567 FCB$FC,$7C,$3C,$1C,$0C,4,$84,$C4 *89:;BT(=)? FCB$E4,$F4,$E2,$AA,0,$8C,0,$32 *ABCDEFG FCB0,$60,$88,$A8,$90,$40,$28,$D0 *HIJKLMNO FCB$08,$20,$78,$B0,$48,$E0,$A0,$F0 *PQRSTUVW FCB$68,$D8,$50,$10,$C0,$30,$18,$70 *XYZ FCB$98,$B8,$C8 SPC1 ***RESTARTROUTINE*** STARTCLRABEGININGOFPROG. STAAPIA1ACCLRCONTROLREG'S STAAPIA1BC STAAPIA1ADALLINPUTSON"A"SIDE COMA STAAPIA1BDALLOUTPUTSON"B"SIDE LDAA#$34 STAAPIA1ACCA/B2LINESLOW STAAPIA1BC&PDRACCESS LDS#$00FFSETSTACKPOINTERTOTOPOFRAM LDX#$FFCLRRAM0-FF L1CLR0,X DEX BNEL1 CLR0 LDX#$02AAINZCODESPEED STXWSPEED STXSPEEDINZCHARCODESPEED RSPLDX#BTOPRESETPOINTER STXXSTR LDX#CODE STXCXSTR * **********STARTOFPROGRAM*************** * NLINEJSRPCRLFDOCR/LFSTARTOfPROG. LDAA#'! L2JSRPDATAPRINT"!"PROMPT LDAA#$20SENDSPACETOKYBRD JSRPDATA L3JSRGDATAGETDATAFMKYBRD CMPA#$1BLOOKFORESCCHAR BNECTEST JMPSSEDSETSENDSPEED CTESTCMPA#$5A BLESTM CMPA#$7F BEQRSPDELLINE CMPA#$5F BEQDELCDELLASTCHAR BRAL3 DELCLDXXSTR INX STXXSTR BRAL3 STMTAB CSTMSTABCXSTR+1CONVERTASCIIDATATO- LDXCXSTRMORSECODEFMTABLE LDAB1 0,X BNESTM1KICKOUTBADCHAR'S BRAL3 STM1LDXXSTRGETBUFFERPOINTER CPX#BBOT+1 BEQBUFFULBUFFERFULL STAB0,X CMPB#$0D"CR" BNEL4 JMPSODATA L4DEX STXXSTR BRAL3 BUFFULSTAB0,XSTORELASTCHAR DEX LDAA#$0D STAA0,X DEX STXXSTR JSRPCRLFDOCR/LF LDX#M1 L5JSRPMESSPRINTSTRINGONKB. BRASODATA M1FCC/INPUTBUFFERFULL/ FCB04 SPC5 *SENDOUTDATAFROMBUFFER * SODATALDX#BTOP L7LDAA0,X DEX STXXSTR L6CMPA#$0DTESTFORCRBOTOFBUF BEQCR CMPA#$21TESTFORWORDSP BNESTONOWORDSP BRASPDLY CRCLR1,X"CR"FOUND&CLR'ED LDX#BTOPRESTOREPOINTERTO- STXXSTRTOPOFBUFFER. JMPNLINE **********MORSEOUTPUTCODE***************** STOSTAAPIA1BDSTAATOLED'S L8ASLA LDAB#$3C STABPIA1BCOUTPUTA"1"TOCB2. BCCDITSENDADIT DAHLDAB#30SENDDAH BSRDLY L9LDAB#$34 STABPIA1BCOUTPUTA"0"TOCB2 CMPA#$80TESTFORENDOF- BNEL13OFCHAR. LDXXSTR LDAB0,XGETNEXTCHAR. CMPB#$21TESTFORSPACE BNEL13 DEX STXXSTR SPDLYLDAB#70 BSRWDLYDLYFORSPACE BRAL12GETNEXTCHARFMBUF. L13LDAB#10 BSRDLYDELAYFOR10. BRAL10 DITLDAB#10SENDDIT BSRDLYDELAYFOR10. BRAL9OUTPUTA"0"FOR1. L10CMPA#$80TESTFORCHARFINISHED. BNEL8NOTFINISHED LDAB#20YESFINISHED. BSRDLY L12LDXXSTRGETNEWCHARFMBUFFER. BRAL7 ************************************************* DLYLDXSPEEDDELAYLOOPFORMORSETIMING D1DEX BNED1 DECB BNEDLY RTS * * WDLYLDXWSPEEDDLYFORSPACE W1DEX BNEW1 DECB BNEWDLY RTS * *********SUBROUTINETOCONVERTDEC.TOBIN.*******: * CDTBTAB ANDA#$0F ANDB#$F0 BEQDONE LSRB LSRB LSRB LSRB PSHB TSX CLRB ADDADDB#10 DEC0,X BNEADD ABA INS DONERTS * *******SUBROUTINETODIV$3A98BY(ACCA)*********** * *********STACKLOOKSLIKE******** ***0,XCOUNTER ***1,XDIVISORMSBYTE ***2,XDIVISORLSBYTE00 ***3,XRESULTMSBYTE ***4,XRESULTLSBYTE ***5,XRETURNADDRMSBYTE ***6,XRETURNADDRLSBYTE *********************************** * DIVCLRB PSHB PSHB PSHB PSHA DES TSX LDAA#9 TST1,X BMIDIV1 DIV2INCA ASL2,X ROL1,X BMIDIV1 CMPA#17 BNEDIV2 DIV1STAA0,X LDAA#$3A LDAB#$98 DIV3SUBB2,X SBCA1,X BCCDIV4 ADDB2,X ADCA1,X CLC BRADIV5 DIV4SEC DIV5ROL4,X ROL3,X LSR1,X ROR2,X DEC0,X BNEDIV3 LDX3,XRETURNRESULTINX. INS INS INS INS INS RTS * **********SETUPSPEEDFROMKYBRD***************** * SSEDLDX#M3 JSRPMESSPRINTSTRINGM3 LDX#SPEED JSRINADDRINPUTCHARSPEED TSTB BEQSSEDNOINPUT SWDSLDX#M4 JSRPMESSPRINTSTRINGM4 LDX#WSPEED JSRINADDRINPUTWORDSPEED TSTB BEQSWDSNOINPUTTOWSPEED TSTSPEED BNESSED TSTWSPEED BNESWDS LDAASPEED+1 JSRCDTBCONVERTDEC.TOBIN. BSRDIVCALTIMERCONSTANT STXSPEEDDIV$3A98/$WPM LDAAWSPEED+1 JSRCDTB BSRDIVCALTIMERCONSTANT STXWSPEED GOODJMPNLINEGETNEWLINEOFDATA * M3FCC/INPUTCHAR.SPEEDINDEC.WPM/ FCB4 M4FCC/INPUTWORDSPEEDINDEC.WPM/ FCB4 * MON 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L