├── README.md └── sbc ├── 6309 ├── Makefile ├── README.md └── example1.s ├── Makefile ├── README.md ├── assembled.jpg ├── assist09 ├── Makefile ├── README.md ├── assist09-6522.asm ├── assist09-6850.asm ├── assist09-6850.lst ├── assist09-6850.s19 ├── assist09-orig.asm ├── assist09-orig.lst └── assist09-orig.s19 ├── bom.ods ├── cmoc ├── Makefile ├── README.md ├── ex1.c └── ex2.c ├── combined ├── Makefile ├── README.md ├── combined.asm ├── combined.hex ├── combined.lst └── combined.s19 ├── disasm ├── Makefile ├── README.md ├── disasm.asm ├── disasm.lst └── disasm.s19 ├── examples ├── Makefile ├── README.md ├── ex1.asm ├── ex1.lst ├── ex1.s19 ├── ex2.asm ├── ex2.lst ├── ex2.s19 ├── ex3.asm ├── ex3.lst ├── ex3.s19 ├── ex4.asm ├── ex4.bas ├── ex4.lst ├── ex4.s19 ├── ex5.asm ├── ex5.lst ├── ex5.s19 ├── ex6.asm ├── ex6.lst ├── ex6.s19 ├── ex7.asm ├── ex7.lst ├── ex7.s19 ├── ex8.asm ├── ex8.lst ├── ex8.s19 └── horoscope.bas ├── exbasrom ├── ExBasROM.asm ├── ExBasROM.hex ├── ExBasROM.lst ├── ExBasROM.s19 ├── Makefile └── README.md ├── gerber.zip ├── mc6839 ├── Makefile ├── README.md ├── bin │ ├── Float09.bin │ └── float09.s19 ├── docs │ ├── MC6839 Floating-point ROM Datasheet.pdf │ └── MC6839 Floating-point ROM Manual.pdf ├── quad.asm ├── quad.lst ├── quad.run └── src │ ├── CHECK.SA │ ├── COMP.SA │ ├── COMPARE.SA │ ├── CONS.SA │ ├── DISPAT.SA │ ├── END.SA │ ├── ENDIT.SA │ ├── EQMAC.SA │ ├── EQUATES.SA │ ├── FADS.SA │ ├── FLOAT.SA │ ├── FMULDV.SA │ ├── FPLOAD.CRF │ ├── FRMSQT.SA │ ├── FRNBAK.SA │ ├── GETPUT.SA │ ├── HDR.SA │ ├── INS.SA │ ├── INTFLT.SA │ ├── L.SA │ ├── MACROS.SA │ ├── MVABSNEG.SA │ ├── NEWMACR.SA │ ├── NOL.SA │ ├── NOMEX.SA │ ├── NOTRAP.SA │ ├── OLDISPAT.SA │ ├── OUTS.SA │ ├── PROCS.SA │ ├── RNDEXEP.SA │ ├── TBL.SA │ ├── UTIL.SA │ ├── UTILIO.SA │ └── WARTS.SA ├── mondeb ├── Makefile ├── README.md ├── mondeb.asm ├── mondeb.lst └── mondeb.s19 ├── pcb.pdf ├── schematic.pdf ├── tinybasic ├── Makefile ├── README.md ├── tinybasic.asm ├── tinybasic.lst └── tinybasic.s19 ├── trace ├── Makefile ├── README.md ├── trace.asm ├── trace.lst └── trace.s19 ├── tscbasic ├── Makefile ├── README.md ├── TSC_MicroBasic.pdf ├── basic.lst ├── basic.s ├── basic.s19 ├── random.bas ├── switch.bas └── testprog.bas └── wozmon ├── Makefile ├── README.txt ├── wozmon.asm ├── wozmon.lst └── wozmon.s19 /README.md: -------------------------------------------------------------------------------- 1 | # 6809 2 | Files and programs related to the Motorola 6809 microprocessor. 3 | -------------------------------------------------------------------------------- /sbc/6309/Makefile: -------------------------------------------------------------------------------- 1 | default: asm6809 2 | 3 | # Assemble using asm6809 4 | asm6809: example1.s 5 | asm6809 -v -S -3 -o example1.s19 -l example1.lst example1.s 6 | 7 | # Assemble using lwasm 8 | lwasm: example1.s 9 | lwasm --6309 --format=srec --list=example1.lst --output=example1.s19 example1.s 10 | 11 | clean: 12 | $(RM) example1.lst example1.s19 13 | 14 | distclean: clean 15 | -------------------------------------------------------------------------------- /sbc/6309/README.md: -------------------------------------------------------------------------------- 1 | The Hitachi 6309 is a Motorola 6809 compatible microprocessor. It can 2 | run 6809 code in emulation mode, or run in a native mode where it 3 | supports additional registers and instructions. 4 | 5 | These examples were taken from "The 6309 Book: Inside the 6309 6 | Microprocessor", Second Edition, by Chris Burke. 7 | 8 | They will build with either the asm6809 or lwasm cross-assemblers. 9 | -------------------------------------------------------------------------------- /sbc/Makefile: -------------------------------------------------------------------------------- 1 | SUBDIRS = assist09 cmoc combined disasm examples exbasrom mondeb tinybasic tscbasic wozmon 2 | 3 | all: 4 | @for i in $(SUBDIRS); do \ 5 | echo "make all in $$i..."; \ 6 | (cd "$$i"; $(MAKE) $(MFLAGS) all); done 7 | 8 | clean: 9 | @for i in $(SUBDIRS); do \ 10 | echo "Clearing in $$i..."; \ 11 | (cd "$$i"; $(MAKE) $(MFLAGS) clean); done 12 | -------------------------------------------------------------------------------- /sbc/README.md: -------------------------------------------------------------------------------- 1 | These are files and programs related to a 6809-based Single Board 2 | Computer based on the design by Grant Searle found at 3 | http://searle.x10host.com/6809/Simple6809.html 4 | 5 | I built a slightly modified version and designed a PCB layout. 6 | 7 | It can run a version of Microsoft BASIC ported by Grant Searle, a port 8 | of the Motorola ASSIST09 monitor, or a port of the Don Peters MONDEB 9 | monitor, all included here. I recommend using the "combined" firmware 10 | which combines both Microsoft BASIC and the ASSIST09 monitor into one 11 | ROM and also includes my disassembler which adds a new monitor U 12 | command. The files will assemble with the as9 assembler found at 13 | http://home.hccnet.nl/a.w.m.van.der.horst/m6809.html 14 | 15 | The schematic and PCB layout were developed using EasyEDA and can be 16 | found at https://easyeda.com/tranter/6809-Single-Board-Computer 17 | 18 | The PCB layout has been verified as working. If you want to build your 19 | own version you are welcome to use the design files. Here are some 20 | notes on building it: 21 | 22 | PCBs can be manufactured very inexpensively and quickly from JLPCB, 23 | which is partnered with EasyEDA.com. 24 | 25 | You will need an FTDI USB to serial breakout board with 6 pin 26 | connector, like the DFRobot FTDI Basic Breakout or AdaFruit FTDI 27 | friend. Set it for 5V VCC out. 28 | 29 | The board can be powered from USB. Connect a jumper H1 to do this. The 30 | power LED will indicate power on. You can also power it from a 31 | separate 5 Volt supply, in which case the jumper should be removed. 32 | 33 | My design added a power on reset circuit. I also wired the /IRQ line 34 | to the 6850 UART, although the firmware does not currently make use of 35 | this feature. 36 | 37 | I suggest using small nylon standoffs on the corners of the board to 38 | keep it up off the bench. 39 | 40 | All parts should be readily available from sources like Ebay. Some. 41 | like the 68B09, are no longer manufactured but can be obtained as NOS 42 | (New Old Stock). All parts are through-hole. 43 | 44 | You will need a suitable UV eraser and programmer to program the 45 | EPROM. An equivalent EEPROM may work, but has not been tested. 46 | 47 | I recommend using sockets for all ICs. 48 | 49 | The PCB layout is Open Source Hardware, licensed under the The TAPR 50 | Open Hardware License. You are welcome to build the circuit and use my 51 | PCB layout. 52 | See https://web.tapr.org/OHL/TAPR_Open_Hardware_License_v1.0.txt 53 | 54 | Some code here is entirely written by me and others are ports of 55 | existing software. Software written by me is released under the 56 | following license: 57 | 58 | Copyright (C) 2012-2020 by Jeff Tranter 59 | 60 | Licensed under the Apache License, Version 2.0 (the "License"); 61 | you may not use this file except in compliance with the License. 62 | You may obtain a copy of the License at 63 | 64 | http://www.apache.org/licenses/LICENSE-2.0 65 | 66 | Unless required by applicable law or agreed to in writing, software 67 | distributed under the License is distributed on an "AS IS" BASIS, 68 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 69 | See the License for the specific language governing permissions and 70 | limitations under the License. 71 | -------------------------------------------------------------------------------- /sbc/assembled.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/assembled.jpg -------------------------------------------------------------------------------- /sbc/assist09/Makefile: -------------------------------------------------------------------------------- 1 | all: assist09-orig.s19 assist09-6850.s19 2 | 3 | assist09-orig.s19: assist09-orig.asm 4 | as9 assist09-orig.asm -l s19 now 5 | 6 | assist09-6522.s19: assist09-6522.asm 7 | as9 assist09-6522.asm -l s19 now 8 | 9 | assist09-6850.s19: assist09-6850.asm 10 | as9 assist09-6850.asm -l s19 now 11 | 12 | clean: 13 | $(RM) assist09-orig.s19 assist09-orig.lst 14 | $(RM) assist09-6522.s19 assist09-6522.lst 15 | $(RM) assist09-6850.s19 assist09-6850.lst 16 | 17 | distclean: clean 18 | -------------------------------------------------------------------------------- /sbc/assist09/README.md: -------------------------------------------------------------------------------- 1 | This is the source for the Motorola ASSIST09 machine language monitor provided for their development boards. There are several versions here: 2 | 3 | assist09-orig.asm - The original version that used a 6820 PIA for serial i/o and breakpoints and ran on a Motorola development board. 4 | 5 | assist09-6522.asm - A version that was ported by A VD Horst to run on a system using a 6522 VIA. 6 | 7 | assist09-6850.asm - A port that runs on my single board computer that uses a 6850 ACIA. The trace command is not supported. 8 | 9 | The files will assemble with the as9 assembler found at http://home.hccnet.nl/a.w.m.van.der.horst/m6809.html 10 | 11 | ASSIST09 Command List: 12 | 13 | B (reak) - list break points 14 | NNNN - insert break point 15 | -NNNN - delete break point 16 | - - delete all break points 17 | 18 | C (all) - call routine at PC as subroutine 19 | NNNN - call routine at NNNN as subroutine 20 | 21 | D (isplay) NNNN NNNN - display range mod16 22 | NNNN - display 16 bytes [NNNN]mod16 23 | M - display 16 bytes [M]mod16 24 | P - display 16 bytes [PC]mod16 25 | W - display 16 bytes [W]mod16 26 | @ - following NNNN, M, P, or W displays 27 | 16 bytes indirectly 28 | 29 | E (ncode) Encodes a 6809 postbyte based on the 30 | addressing mode syntax as follows: 31 | 32 | R = X, Y, U, or S 33 | 34 | Direct Addressing Modes 35 | ------ ---------- ----- 36 | 37 | ,R A,R 38 | H,R B,R 39 | HH,R D,R 40 | HHHH,R ,-R 41 | HH,PCR ,--R 42 | HHHH,PCR ,R+ 43 | ,R++ 44 | 45 | Indirect Addressing Modes 46 | -------- ---------- ----- 47 | 48 | [,R] [A,R] 49 | [B,R] 50 | [HH,R] [D,R] 51 | [HHHH,R] 52 | [HH,PCR] [,--R] 53 | [HHHH,PCR] 54 | [HHHH] [,R++] 55 | 56 | G (o) - Go to PC 57 | NNNN - Go to NNNN 58 | 59 | L (oad) Load a S1-S9 format data 60 | 61 | M (emory) NNNN - Display memory data at address NNNN 62 | - Terminate memory function 63 | / - Display current byte with address 64 | - Display next byte with address 65 | ^ - Display previous byte with address 66 | , - Skip byte 67 | SPACE - Display next byte 68 | 69 | The / may be used as an immediate command. 70 | 71 | After any of the display commands the memory contents 72 | may be altered by inputting a valid hex number or 73 | ascii 'string' enclosed by single quotes ('). 74 | 75 | O (ffset) NNNN NNNN - Calculate the two and/or three byte offset 76 | 77 | P (unch) NNNN NNNN - Punch a S1-S9 format data 78 | 79 | R (egister) Display 6809 registers and allow changes 80 | 81 | - terminate command 82 | SPACE - terminate value input or 83 | skip to next register 84 | , - terminate value input or 85 | skip to next register 86 | 87 | V (erify) Verify memory against S1-S9 format data 88 | 89 | W (indow) NNNN - Define a display window for the 90 | D and M commands. 91 | 92 | Ctrl-X will abort any command. 93 | -------------------------------------------------------------------------------- /sbc/assist09/assist09-orig.s19: -------------------------------------------------------------------------------- 1 | S123F800308DE7BE1F101F8B979D3384318C35EF81C61634041F20E3A1ED816AE426F6C6E7 2 | S123F8200DA6A0A7805A26F9318DF7D48E20FEACA12602ADA43584328DE7168DC34F1F8B18 3 | S123F8403F0820F9015802920290028E0270028A0045022BFFE3029002840296028A029312 4 | S123F8600290039A02B702D202BFE792047D012DE00800050000E000000000003901940143 5 | S123F880B101CB01C30175017301C001790055017D025601D16A8DE6F7170225EE6A335F05 6 | S123F8A00DFB261117069B505A2B0A11A3A126F8EF6A16021E0FFB3706C10B1022020FEF27 7 | S123F8C06A58338CB8ECC56ECB41535349535430390410DF976D61260DAD9DE6F9AD9DE6DD 8 | S123F8E0FB308CE53F039EF6270D6F026F03CC01A6A701E7846F013F061706462A0C50D780 9 | S123F900FA5A2B06A630A7B120F7AE6A9F93863E3F0133E4DF954F5FDD9BDD8FDD91C60278 10 | S123F9203407170454308D0581812E275A308D04E9812F27528120231434026C5F812F2723 11 | S123F9404F17040B27026A5E17042E20E8800DA75D9EC4E6802A109EEE5C27F710DE9530A0 12 | S123F9608D015A3F0220905AE15F24033A20E4315DA65F8002A75E5AA680A1A226EE6A5EF2 13 | S123F98026F53AEC1E308B6D5D32C4AD1E16FF7A6D5E2BC83088AEDC9B20ECFE0442054DF2 14 | S123F9A0044304170444049D0445059F044703D2044C04DD044D040D044E04FD044F050AA3 15 | S123F9C0045004AF04520284045304F2045404D6045604CF04570468FFA6803406C6103D5B 16 | S123F9E08D043506840F8B90198940196E9DE5EE8DE78DE5AF648620203DA661813422399D 17 | S123FA00109EC2EEA6EF64AF7E272EAFA6202A8D5D8D5F24FA4D27F9817F27F5A7610D8F49 18 | S123FA202617810D2604860A8DC20DF4260BA661308C09810A270F8DB30C903B04308CFC5C 19 | S123FA40860D8DA8860A8DA4A680810426F88D1E8D061FA9E7E420E18D18240581182602EF 20 | S123FA6053398D0A8D0C24FA811827F44F396E9DE578AD9DE562847F394F502D048D420D8B 21 | S123FA808F26340D902B29306C9CF82523308CE93F02098E308DE5013F058D172537068E18 22 | S123FAA025339E91272F301F9F9127298DAA25251603F71701B9390F8F1702EB3B3F0720B8 23 | S123FAC004E68DE4D81F9BA163272510DE97308CEC3F038DDE16FE218DE720F7DEF0A6C413 24 | S123FAE0442402A6413986039EF0A7848651A784393447DEF08D1B81102712D6F2810D26C4 25 | S123FB0002D6F34FE7E48C8D096AE42AFA35C717FF5CE641C50226F7A7C43986116D6626BB 26 | S123FB20014C3F010C8F3986143F014A3F010A8F8E61A8301F26FC39EE626D662754327DD5 27 | S123FB403F00815326FA3F0081392722813126F26FE48D21E7618D1DE7628D19A66231CB7C 28 | S123FB608D13270C6D692B02E7A4E1A027F235924C27CD20F98D12C6103D8D0D3404ABE057 29 | S123FB801F89AB62A7626A63393F001701D427F835F2DEF2AE643456CC0018D7F23F01C60D 30 | S123FBA004DDF2EC68A362108300182502C6175CE7E4CB03E761308C333F035F30618D2754 31 | S123FBC08D258D23AE628D1F6AE426FAAF6253E76130618D14AE68AC6224C8308C113F0398 32 | S123FBE0EC64DDF24F35D6EB8416FDED533104533930333030303046430D0A043F06C6062D 33 | S123FC003F075A26FB5F1F9817FDDB3F073F075CC11025F23F06252F30643F05AE64C610F1 34 | S123FC203F045A26FB3F07AE64C610A6802B0481202402862E3F015A26F1AC622409AF6405 35 | S123FC40A6654826CF20B53F06398D234C8D21395043FF1341000A42000B58FF0D59FF0F1A 36 | S123FC6055FF1153FF01434300094450000C004F30E8103432318CD8ECA04D2F043F0120BB 37 | S123FC80F7862D3F0130E56DE426126D3F27033F058C3F04ECA05D26DF3F0635B28D4027E1 38 | S123FCA010810D271EE63F5A50583F075A26FB20E3A7E4DC9B6D3F2602A682ED84A6E481F8 39 | S123FCC00D26D1308DE28AC6153502A7805A26F910EE88ECC615A68234025A26F920BC4FF2 40 | S123FCE08C8620978E6E9DE30334148D5C2718918E27F89E9E814D27169E93815027109EEC 41 | S123FD00A08157270A35948D4427FC200AAE849F9B0D8E27F08D629E9B812B260E8D233445 42 | S123FD2002DC9B308B9F9B350220EC812D2707814027DA5F20CF8D0A3402DC9B40508200CC 43 | S123FD4020E18D9D273216FC130F9B0F9C8D2A8D112625C6103D860458099C099B4A26F85B 44 | S123FD6020148130251281392F0A8141250A814622068007840F1A04393F00811827C73920 45 | S123FD808D013B3530341026191701B6AE6C5A2B16A630ACA126F7813F260297FB0C8F16C0 46 | S123FDA001061700BBED6C17019800FA5A2BC9A6B4A730863FA7B120F38DC8357FADF13FCE 47 | S123FDC00A20FC17009ADD9E9E9E17FC0C862D3F0117FF0B270A812C260E9F9E300120F1CD 48 | S123FDE0D69C8D47812C27E98127260C8D8B8127270C1F898D3520F4812026069F9E3F0761 49 | S123FE0020C6810A2608860D3F019F9E200A815E260A301E9F9E3F068D0720AC812F27F6F9 50 | S123FE20399E9E341030E43F0535909E9EE780E11F26039F9E393402863F3F0135828D2007 51 | S123FE40DDA0398D1BC4F01F02302F25048D1130AB343010A3622302EDE4AD9DE18435E037 52 | S123FE6017FE7E2609812F2205810EDC9B3916FAEB8DED1F028DE96FE23426AD9DE165ADB2 53 | S123FE809DE1633401AD9DE15F350126E135B28D010133F133D427038DC68C4F5F344E2087 54 | S123FEA0DA8DEFFF8DBADD913262EEF80ADF99DEF6CC0701ED423B8DA7DDF23927058DA091 55 | S123FEC0DDF839306E9FF8398D961F018D9230013430A3E4EDE430611DA1E426023F04EEC7 56 | S123FEE0E4335FEF843F053F063596272317FDF1272C812D263F17FDE827030FFA398D40D7 57 | S123FF005A2B32ACA126F9AEA1AF3C5A2AF90AFA8D2E27E930A13F055A26F93F06398D207B 58 | S123FF20C1082711A684E784E1842609A7845A2B07ACA126F916FA24AFA46F310CFA20D053 59 | S123FF409E9B318DE06CD6FA396FE25F308C3F3F00815B26068610A7E43F00810D270C6DD1 60 | S123FF60842BD2A18126F8EB1F20EE308C491F988460AAE4A7E4C49F6D8427B9E18126F837 61 | S123FF80E61FEAE4E7E430E43F043F06358441044205440648014801480148002C002D090F 62 | S123FFA02D0153705930555058102B072B015080430052005D00FF108411001288138914A8 63 | S123FFC0861585168B1780188119821A83828C838D039F006E9DDFEE6E9DDFEC6E9DDFEAB2 64 | S113FFE06E9DDFE86E9DDFE66E9DDFE46E9DDFE2D1 65 | S113FFF0FFD4FFD8FFDCFFE0FFE4FFE8FFECF837B5 66 | S9030000FC 67 | -------------------------------------------------------------------------------- /sbc/bom.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/bom.ods -------------------------------------------------------------------------------- /sbc/cmoc/Makefile: -------------------------------------------------------------------------------- 1 | all: ex1.srec ex2.srec 2 | 3 | ex1.srec: ex1.c 4 | cmoc -i --coco --srec ex1.c 5 | 6 | ex2.srec: ex2.c 7 | cmoc -i --coco --srec ex2.c 8 | 9 | upload1: ex1.srec 10 | ascii-xfr -s ex1.srec -l 100 -c 10 >/dev/ttyUSB0 11 | 12 | upload2: ex2.srec 13 | ascii-xfr -s ex2.srec -l 100 -c 10 >/dev/ttyUSB0 14 | 15 | clean: 16 | $(RM) ex1.srec ex1.s ex1.o ex1.lst ex1.link ex1.map 17 | $(RM) ex2.srec ex2.s ex2.o ex2.lst ex2.link ex2.map 18 | -------------------------------------------------------------------------------- /sbc/cmoc/README.md: -------------------------------------------------------------------------------- 1 | These are some example programs built using the CMOC C compiler. 2 | See https://perso.b2b2c.ca/~sarrazip/dev/cmoc.html 3 | 4 | ex1: First example without any i/o. Runs fine from ASSIST09 ("C 5 | $2800"). Return value is in D. 6 | 7 | ex2: Second example showing string output and input. Needs to write 8 | custom output and input routines. Does not return from main() - 9 | workaround is just to jump to ASSIST09 RESET at end of main(). All of 10 | the input and output routines seem to work fine, printf() brings in a 11 | lot of code though. Start address is 2800. 12 | -------------------------------------------------------------------------------- /sbc/cmoc/ex1.c: -------------------------------------------------------------------------------- 1 | int main() 2 | { 3 | int x, y, z; 4 | x = 1; 5 | y = 2; 6 | z = x + y; 7 | return z; 8 | } 9 | -------------------------------------------------------------------------------- /sbc/cmoc/ex2.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | // Output function. Prints character in A on console. 4 | // CMOC standard library converts LF to CR, so we need to convert CR to CR/LF. 5 | 6 | void newOutputRoutine() 7 | { 8 | asm 9 | { 10 | pshs x,b // Preserve registers used by this routine 11 | wrwait: ldb $A000 // Read status register 12 | bitb #2 // Look at TDRE bit 13 | beq wrwait // Wait until it is 1 14 | sta $A001 // Write character to data register 15 | cmpa #$0D // Was character CR? 16 | bne done // If not, then done 17 | lda #$0A // Line feed 18 | bra wrwait // Send it 19 | done: puls b,x // Restore registers 20 | } 21 | } 22 | 23 | // Read a character from the console and return it. 24 | char readchar() 25 | { 26 | char c; 27 | 28 | asm 29 | { 30 | loop: lda $A000 // Read ACIA status register 31 | lsra // Shift RDR bit into carry 32 | bcc loop // Branch if not character yet 33 | lda $A001 // Read data register 34 | sta :c // Store in variable c 35 | } 36 | 37 | return c; 38 | } 39 | 40 | static char linebuf[80]; // Buffer for readline 41 | 42 | // Replacement for readline library function. 43 | // Reads a line from standard input and returns it. 44 | char *readline() 45 | { 46 | int i; 47 | 48 | for (i = 0; i < sizeof(linebuf); i++) { 49 | linebuf[i] = readchar(); 50 | if (linebuf[i] == '\r' || linebuf[i] == '\r' || linebuf[i] == '\0') { 51 | break; 52 | } 53 | } 54 | linebuf[i] = 0; 55 | return linebuf; 56 | } 57 | 58 | int main() 59 | { 60 | // Use custom output routine. 61 | setConsoleOutHook(newOutputRoutine); 62 | 63 | // Try output routines 64 | putchar('T'); putchar('E'); putchar('S'); putchar('T'); putchar('\n'); 65 | 66 | const char *s = "Test of putstr...\n"; 67 | putstr(s, strlen(s)); 68 | 69 | putstr("Hello, world!\n", 14); 70 | putstr("And again hello.\n", 17); 71 | 72 | //printf("Hello, world!\n"); 73 | 74 | // Try input routine. 75 | putstr("Enter some text: ", 17); 76 | char *ln = readline(); 77 | putstr("\nInput text was: '", 18); 78 | putstr(ln, strlen(ln)); 79 | putstr("'\n", 2); 80 | 81 | // Go to ASSIST09 monitor 82 | asm 83 | { 84 | jmp $f837 85 | } 86 | 87 | return 0; 88 | } 89 | -------------------------------------------------------------------------------- /sbc/combined/Makefile: -------------------------------------------------------------------------------- 1 | all: combined.s19 combined.hex combined.bin 2 | 3 | combined.s19: combined.asm 4 | as9 combined.asm -l s19 now 5 | 6 | combined.hex: combined.s19 7 | srec_cat combined.s19 -Motorola -crop 0xc000 0x10000 -output combined.hex -Intel 8 | 9 | combined.bin: combined.s19 10 | srec_cat combined.s19 -Motorola --crop 0xc000 0x10000 -offset -0xc000 -output combined.bin -Binary 11 | 12 | clean: 13 | $(RM) combined.s19 combined.hex combined.bin combined.lst 14 | 15 | distclean: clean 16 | -------------------------------------------------------------------------------- /sbc/combined/README.md: -------------------------------------------------------------------------------- 1 | This is a variant of firmware that combines both Microsoft BASIC and 2 | the ASSIST09 monitor into one ROM. It also includes my disassembler 3 | which adds a new monitor U command and trace function which adds a new 4 | monitor T command. 5 | 6 | It comes up in ASSIST09. You can start BASIC by running "G C000". 7 | 8 | Memory map (16K EPROM): 9 | 10 | BASIC $C000 - $E3FF (9K) 11 | DISASSEMBLER $E400 - $EFFF (3K) 12 | TRACE $F000 - $F8FF (2K) 13 | ASSIST09 $F800 - $FFFF (2K) 14 | 15 | RAM usage: 16 | 17 | BASIC $0000 - $0178 18 | DISASSEMBLER $6FD0 - $6FDC 19 | TRACE $6FE0 - $6FFC 20 | ASSIST09 $7000 - $7051 21 | 22 | ------------------------------------------------------------------------ 23 | 24 | ASSIST09 Command List: 25 | 26 | B (reak) - list break points 27 | NNNN - insert break point 28 | -NNNN - delete break point 29 | - - delete all break points 30 | 31 | C (all) - call routine at PC as subroutine 32 | NNNN - call routine at NNNN as subroutine 33 | 34 | D (isplay) NNNN NNNN - display range mod16 35 | NNNN - display 16 bytes [NNNN]mod16 36 | M - display 16 bytes [M]mod16 37 | P - display 16 bytes [PC]mod16 38 | W - display 16 bytes [W]mod16 39 | @ - following NNNN, M, P, or W displays 40 | 16 bytes indirectly 41 | 42 | E (ncode) Encodes a 6809 postbyte based on the 43 | addressing mode syntax as follows: 44 | 45 | R = X, Y, U, or S 46 | 47 | Direct Addressing Modes 48 | ------ ---------- ----- 49 | 50 | ,R A,R 51 | H,R B,R 52 | HH,R D,R 53 | HHHH,R ,-R 54 | HH,PCR ,--R 55 | HHHH,PCR ,R+ 56 | ,R++ 57 | 58 | Indirect Addressing Modes 59 | -------- ---------- ----- 60 | 61 | [,R] [A,R] 62 | [B,R] 63 | [HH,R] [D,R] 64 | [HHHH,R] 65 | [HH,PCR] [,--R] 66 | [HHHH,PCR] 67 | [HHHH] [,R++] 68 | 69 | G (o) - Go to PC 70 | NNNN - Go to NNNN 71 | 72 | L (oad) Load a S1-S9 format data 73 | 74 | M (emory) NNNN - Display memory data at address NNNN 75 | - Terminate memory function 76 | / - Display current byte with address 77 | - Display next byte with address 78 | ^ - Display previous byte with address 79 | , - Skip byte 80 | SPACE - Display next byte 81 | 82 | The / may be used as an immediate command. 83 | 84 | After any of the display commands the memory contents 85 | may be altered by inputting a valid hex number or 86 | ascii 'string' enclosed by single quotes ('). 87 | 88 | O (ffset) NNNN NNNN - Calculate the two and/or three byte offset 89 | 90 | P (unch) NNNN NNNN - Punch a S1-S9 format data 91 | 92 | R (egister) Display 6809 registers and allow changes 93 | 94 | - terminate command 95 | SPACE - terminate value input or 96 | skip to next register 97 | , - terminate value input or 98 | skip to next register 99 | 100 | T (race) NNNN - Trace execution from address NNNN. 101 | 102 | U (nassemble) NNNN - Disassemble memory from address NNNN. 103 | 104 | V (erify) Verify memory against S1-S9 format data 105 | 106 | W (indow) NNNN - Define a display window for the 107 | D and M commands. 108 | 109 | Ctrl-X will abort any command. 110 | -------------------------------------------------------------------------------- /sbc/disasm/Makefile: -------------------------------------------------------------------------------- 1 | all: disasm.s19 2 | 3 | disasm.s19: disasm.asm 4 | as9 disasm.asm -l s19 now 5 | 6 | # Change line above for different assemblers: 7 | # as9 disasm.asm -l s19 now 8 | # asm6809 -v -S -o disasm.s19 -l disasm.lst disasm.asm 9 | # lwasm --6809 --format=srec --list=disasm.lst --output=disasm.s19 disasm.asm 10 | 11 | upload: disasm.s19 12 | ascii-xfr -s disasm.s19 -l 1 -c 1 >/dev/ttyUSB0 13 | 14 | clean: 15 | $(RM) disasm.s19 disasm.lst 16 | 17 | distclean: clean 18 | -------------------------------------------------------------------------------- /sbc/disasm/README.md: -------------------------------------------------------------------------------- 1 | Disassembler program for the 6809. Runs on my Single Board Computer 2 | with the ASSIST09 monitor ROM. 3 | 4 | For a version that is integrated into the ASSIST09 ROM, see the 5 | directory "combined". 6 | -------------------------------------------------------------------------------- /sbc/disasm/disasm.s19: -------------------------------------------------------------------------------- 1 | S1051000200DBD 2 | S123100F8E100FBF10028618340217009735024A26F6308D0B7F1700848D638D11812027E8 3 | S123102FE581512708817127048D7220EC393402860D8D47860A8D43350239340286248D7C 4 | S123104F3A3502393402862C8D313502393402865B8D283502393402865D8D1F3502393F0D 5 | S123106F0739340286208D138D113502393402810027058DEA4A20F73502393F01393F00B0 6 | S123108F393416B71009308DFF703F043516393416BF1009308DFF623F0535163934103F6C 7 | S12310AF023510397F100EAE8DFF48E684C1102707C111275216009D8601B7100EE601F7DD 8 | S12310CF1004308D0A364FE186271F8B036D86270220F48610B710048600B710068600B741 9 | S12310EF10058601B7100816008D8B01E686F710068B01E686F710054F1F01E68918DEF7FB 10 | S123110F10087C100820708601B7100EE601F71004308D0A5A4FE186271E8B036D8627026C 11 | S123112F20F48611B710048600B710068600B710058601B71008203F8B01E686F710068B3C 12 | S123114F01E686F710054F1F01E68918DEF710087C10082022F710044F1F01E689190BF746 13 | S123116F1006F610041F01E6891A0BF710051F01E68918DEF71008B6100581082622AE8D11 14 | S123118FFE717D100E2704A6022002A601B710072A0E841F308D0744A686BB1008B7100817 15 | S12311AFAE8DFE4F17FEE817FEB5F61008AE8DFE42A68017FECB5A26F8308D071BB6100819 16 | S12311CF4AA68617FEA77D100E2709FC1002C30001FD1002F610064F58495849308D04DBE5 17 | S12311EFB7100BA68B17FE93B6100B5CA68B17FE8AB6100B5CA68B17FE81B6100B5CA68BE2 18 | S123120F17FE78B610058100272E81012739810227388103102701AF8104102701C4810557 19 | S123122F102701D08106102701E08107102701F58108102702092000860F17FE30308D09B4 20 | S123124F4A17FE5916045E16045BB61006818127338137272F8166102700AD8167102700B6 21 | S123126FA78164102700A181651027009B17FDF2862317FE0617FDC3AE8DFD77A60117FE33 22 | S123128F0016042117FDDBAE8DFD68A60184F0444444448D0E862C17FDE1A601840F8D033A 23 | S12312AF160402810026048644205081012604865820488102260486592040810326048608 24 | S12312CF5520388104260486532030810526068650C643202A810826048641201E81092633 25 | S12312EF0486422016810A26068643C6432010810B26068644C6502006863F17FD7D3917BC 26 | S123130FFD791F9817FD743917FD578601B7100DAE8DFCDFA6018580270D34068650C643F7 27 | S123132F8DDD7F100D3506854027213402B61006816627128164270E17008186538DBC7FD7 28 | S123134F100D350220068D74865520F18520270D34028D6886598DA37F100D350285102771 29 | S123136F0D34028D5786588D927F100D35028508270F34068D468644C6508D837F100D35D2 30 | S123138F068504270E34028D33864217FF6D7F100D35028502270E34028D21864117FF5B8A 31 | S12313AF7F100D35028501271034068D0F8643C64317FF4B7F100D35061602E97D100D26E9 32 | S12313CF05862C17FCB53917FC98862317FCAC17FC69AE8DFC1DA601E6021F0117FCB016D7 33 | S12313EF02C317FC7D17FC53AE8DFC07A60117FC901602B117FC6B17FC41AE8DFBF5A6012A 34 | S123140FE6021F0117FC8816029B17FC5517FC2BAE8DFBDFE6011DF31002C300021F0117A3 35 | S123142FFC6D16028017FC3A17FC10AE8DFBC4EC01F31002C300031F0117FC53160266175B 36 | S123144FFC20B610072B14841F17FBEF17FC3217FBF2B6100717022D16024A849F818426A1 37 | S123146F0C17FBE0B6100717021B16023881882618AE8DFB7EA60217FBC117FC0417FBC4A7 38 | S123148FB610071701FF16021C8189261AAE8DFB62EC021F0117FBA317FBF417FBA6B610F8 39 | S12314AF071701E11601FE81862611864117FBCB17FB91B610071701CC1601E9818526079B 40 | S12314CF864217FBB620E9818B2607864417FBAB20DE8180261117FB6BB610071701A686DC 41 | S12314EF2B17FB971601BE8181261417FB56B61007170191862B17FB8217FB7F1601A68102 42 | S123150F82261117FB3E862D17FB70B610071701741601918183261417FB29862D17FB5BE0 43 | S123152F17FB58B6100717015C160179818C2615AE8DFABFA60217FB0217FB4517FB0517E0 44 | S123154F015B160160818D2617AE8DFAA6EC021F0117FAE717FB3817FAEA17014016014580 45 | S123156F8194261217FAE617FADAB6100717011517FAE316012F8198261E17FAD0AE8DFA82 46 | S123158F72A60217FAB517FAF817FAB8B610071700F317FAC116010D8199262017FAAEAEEC 47 | S12315AF8DFA50EC021F0117FA9117FAE217FA94B610071700CF17FA9D1600E98196261745 48 | S12315CF17FA8A864117FAB317FA79B610071700B417FA821600CE8195260A17FA6F8642AB 49 | S12315EF17FA9820E3819B260A17FA61864417FA8A20D58191261A17FA5317FA47B6100739 50 | S123160F170082862B17FA7317FA7017FA481600948193261817FA3517FA29862D17FA5B74 51 | S123162F17FA58B610078D5D17FA2B2078819C261917FA19AE8DF9BBA60217F9FE17FA4126 52 | S123164F17FA018D5817FA0E205B819D261B17F9FCAE8DF99EEC021F0117F9DF17FA301754 53 | S123166FF9E28D3917F9EF203C819F261617F9DDAE8DF97FEC021F0117F9C017FA1117F94F 54 | S123168FD520222020340284604444444444308C08A68617F9E535023958595553308D0502 55 | S12316AF1C17F9F93917F9867D100E27037A10084FF61008F31002FD1002393F3F3F204104 56 | S12316CF4258204144434141444342414444414144444241444444414E4441414E4442419E 57 | S12316EF4E444341534C2041534C4141534C42415352204153524141535242424343204240 58 | S123170F435320424551204247452042475420424849204249544142495442424C452042B4 59 | S123172F4C5320424C5420424D4920424E452042504C204252412042524E204253522042AA 60 | S123174F56432042565320434C5220434C5241434C5242434D5041434D5042434D504443C2 61 | S123176F4D5053434D5055434D5058434D5059434F4D41434F4D42434F4D20435741494418 62 | S123178F414120444543204445434144454342454F5241454F524245584720494E432049F7 63 | S12317AF4E4341494E43424A4D50204A5352204C4243434C4243534C4245514C4247454C50 64 | S12317CF4247544C4248494C424C454C424C534C424C544C424D494C424E454C42504C4CC5 65 | S12317EF4252414C42524E4C4253524C4256434C4256534C4441204C4442204C4444204C1F 66 | S123180F4453204C4455204C4458204C4459204C4541534C4541554C4541584C4541594CFB 67 | S123182F5352204C5352414C5352424D554C204E4547204E4547414E4547424E4F50204FD0 68 | S123184F5241204F5242204F524343505348535053485550554C5350554C55524F4C205231 69 | S123186F4F4C41524F4C42524F5220524F5241524F5242525449205254532053424341533A 70 | S123188F42434253455820535441205354422053544420535453205354552053545820539A 71 | S12318AF54592053554241535542425355424453574920535749325357493353594E4354D4 72 | S12318CF4652205453542054535441545354420101020302030203020A0704010000000080 73 | S12318EF000000000102000001020000000000000000000001020000010200025D00002E3C 74 | S123190F59006B0D0A68320038823B23000060800000494B00316300097237811E1F151981 75 | S123192F10111C1221221D1B131A14185758555664666567006F016E305C007D5E00002D0F 76 | S123194F5A006C0E0B693300398300245F00002E5B006D0F0C6A34003A8400255D00002F9C 77 | S123196F59006B0D0A68320038823B235D00002F59006B0D0A68320038823B237A26707C22 78 | S123198F07164E00350261042B2053007A26707C07164E73350261042B3C53787A26707CCB 79 | S12319AF07164E73350261042B3C53787A26707C07164E73350261042B3C53787B27710617 80 | S12319CF08174F0036036205500052007B27710608174F7436036205507552777B27710602 81 | S12319EF08174F7436036205507552777B27710608174F7436036205507552770400000493 82 | S1231A0F040004040404040004040404000001010000070700010200020102020606060659 83 | S1231A2F06060606060606060606060608080808020202020001010102010001010000011A 84 | S1231A4F01000101010101000101000101000001010001010101010001010001080000084F 85 | S1231A6F0800080808080800080808080500000505000505050505000505050502020203BE 86 | S1231A8F0202020002020202030603000404040404040404040404040404040408080808B9 87 | S1231AAF08080808080808080808080805050505050505050505050505050505020202035A 88 | S1231ACF02020200020202020301030004040404040404040404040404040404080808087E 89 | S1231AEF08080808080808080808080805050505050505050505050505050505214A07228F 90 | S1231B0F4207234407243D07253E07264707273F07284C07294D072A48072B46072C4007EC 91 | S1231B2F2D45072E41072F43073F7E018328038C2C038E54039328049C2C049E54049D7987 92 | S1231B4F04A32808AC2C08AE5408AF7908B32805BC2C05BE5405BF7905CE5103DE5104DD2E 93 | S1231B6F7604EE5108EF7608FE5105FF7605003F7F01832A038C2903932A049C2904A32AD8 94 | S1231B8F08AC2908B32A05BC2905003B20494E56414C4944045052455353203C535041430B 95 | S1231BAF453E20544F20434F4E54494E55452C203C513E20544F2051554954200450435201 96 | S1041BCF040D 97 | S9030000FC 98 | -------------------------------------------------------------------------------- /sbc/examples/Makefile: -------------------------------------------------------------------------------- 1 | all: ex1.s19 ex2.s19 ex3.s19 ex4.s19 ex5.s19 ex6.s19 ex7.s19 ex8.s19 2 | 3 | ex1.s19: ex1.asm 4 | as9 ex1.asm -l s19 5 | 6 | ex2.s19: ex2.asm 7 | as9 ex2.asm -l s19 8 | 9 | ex3.s19: ex3.asm 10 | as9 ex3.asm -l s19 11 | 12 | ex4.s19: ex4.asm 13 | as9 ex4.asm -l s19 14 | 15 | ex5.s19: ex5.asm 16 | as9 ex5.asm -l s19 17 | 18 | ex6.s19: ex6.asm 19 | as9 ex6.asm -l s19 now 20 | 21 | ex7.s19: ex7.asm 22 | as9 ex7.asm -l s19 now 23 | 24 | ex8.s19: ex8.asm 25 | as9 ex8.asm -l s19 now 26 | 27 | upload1: ex1.s19 28 | ascii-xfr -s ex1.s19 -l 1 -c 1 >/dev/ttyUSB0 29 | 30 | upload2: ex2.s19 31 | ascii-xfr -s ex2.s19 -l 1 -c 1 >/dev/ttyUSB0 32 | 33 | upload3: ex3.s19 34 | ascii-xfr -s ex3.s19 -l 1 -c 1 >/dev/ttyUSB0 35 | 36 | upload4: ex4.bas 37 | ascii-xfr -s ex4.bas -l 20 -c 2 >/dev/ttyUSB0 38 | 39 | upload5: ex5.s19 40 | ascii-xfr -s ex5.s19 -l 1 -c 1 >/dev/ttyUSB0 41 | 42 | upload6: ex6.s19 43 | ascii-xfr -s ex6.s19 -l 1 -c 1 >/dev/ttyUSB0 44 | 45 | upload7: ex7.s19 46 | ascii-xfr -s ex7.s19 -l 1 -c 1 >/dev/ttyUSB0 47 | 48 | upload8: ex8.s19 49 | ascii-xfr -s ex8.s19 -l 1 -c 1 >/dev/ttyUSB0 50 | 51 | clean: 52 | $(RM) ex1.s19 ex1.lst 53 | $(RM) ex2.s19 ex2.lst 54 | $(RM) ex3.s19 ex3.lst 55 | $(RM) ex4.s19 ex4.lst 56 | $(RM) ex5.s19 ex5.lst 57 | $(RM) ex6.s19 ex6.lst 58 | $(RM) ex7.s19 ex7.lst 59 | $(RM) ex8.s19 ex8.lst 60 | 61 | distclean: clean 62 | -------------------------------------------------------------------------------- /sbc/examples/README.md: -------------------------------------------------------------------------------- 1 | The BASIC programs can be loaded by running from a Linux console a 2 | command such as the following: 3 | 4 | ascii-xfr -s horoscope.bas -l 200 -c 10 >/dev/ttyUSB0 5 | -------------------------------------------------------------------------------- /sbc/examples/ex1.asm: -------------------------------------------------------------------------------- 1 | ; Simple 6809 assembler example. 2 | ; Does not do anything meaningful, but can be used for testing file 3 | ; loading and running from ASSIST09. 4 | 5 | ORG $1000 ; Start address 6 | 7 | START: LDA #$00 8 | TFR A,DP 9 | LDA #$01 10 | LDB #$02 11 | LDX #$0304 12 | LDY #$0506 13 | LDU #$0708 14 | ANDCC #$00 15 | NOP 16 | NOP 17 | RTS 18 | -------------------------------------------------------------------------------- /sbc/examples/ex1.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Simple 6809 assembler example. 2 | 0002 ; Does not do anything meaningful, but can be used for testing file 3 | 0003 ; loading and running from ASSIST09. 4 | 0004 5 | 0005 1000 ORG $1000 ; Start address 6 | 0006 7 | 0007 1000 86 00 START: LDA #$00 8 | 0008 1002 1f 8b TFR A,DP 9 | 0009 1004 86 01 LDA #$01 10 | 0010 1006 c6 02 LDB #$02 11 | 0011 1008 8e 03 04 LDX #$0304 12 | 0012 100b 10 8e 05 06 LDY #$0506 13 | 0013 100f ce 07 08 LDU #$0708 14 | 0014 1012 1c 00 ANDCC #$00 15 | 0015 1014 12 NOP 16 | 0016 1015 12 NOP 17 | 0017 1016 39 RTS 18 | -------------------------------------------------------------------------------- /sbc/examples/ex1.s19: -------------------------------------------------------------------------------- 1 | S11A100086001F8B8601C6028E0304108E0506CE07081C00121239C2 2 | S9030000FC 3 | -------------------------------------------------------------------------------- /sbc/examples/ex2.asm: -------------------------------------------------------------------------------- 1 | ; Simple example of using ASSIST09 monitor service routines to do 2 | ; console input and output. 3 | 4 | ; Character defines 5 | 6 | EOT EQU $04 ; String terminator 7 | LF EQU $0A ; Line feed 8 | CR EQU $0D ; Carriage return 9 | 10 | ; ASSIST09 SWI call numbers 11 | 12 | INCHNP EQU 0 ; INPUT CHAR IN A REG - NO PARITY 13 | OUTCH EQU 1 ; OUTPUT CHAR FROM A REG 14 | PDATA1 EQU 2 ; OUTPUT STRING 15 | PDATA EQU 3 ; OUTPUT CR/LF THEN STRING 16 | OUT2HS EQU 4 ; OUTPUT TWO HEX AND SPACE 17 | OUT4HS EQU 5 ; OUTPUT FOUR HEX AND SPACE 18 | PCRLF EQU 6 ; OUTPUT CR/LF 19 | SPACE EQU 7 ; OUTPUT A SPACE 20 | MONITR EQU 8 ; ENTER ASSIST09 MONITOR 21 | VCTRSW EQU 9 ; VECTOR EXAMINE/SWITCH 22 | BRKPT EQU 10 ; USER PROGRAM BREAKPOINT 23 | PAUSE EQU 11 ; TASK PAUSE FUNCTION 24 | 25 | ORG $7000 ; Start address 26 | 27 | START LEAX MSG1,PCR ; Get address of string to display 28 | SWI ; Call ASSIST09 monitor function 29 | FCB PDATA1 ; Service code byte 30 | 31 | SWI ; Input character, return in A 32 | FCB INCHNP 33 | STA CHAR ; Save the character in memory 34 | 35 | SWI ; Print CR/LF 36 | FCB PCRLF 37 | 38 | LEAX MSG2,PCR ; Get address of string to display 39 | SWI ; Call ASSIST09 monitor function 40 | FCB PDATA1 ; Service code byte 41 | 42 | LEAX CHAR,PCR ; Get pointer to character 43 | SWI ; Output in hex 44 | FCB OUT2HS 45 | 46 | SWI ; Print CR/LF 47 | FCB PCRLF 48 | 49 | LDA CHAR ; Get the character 50 | CMPA #'Q ; Was it Q? 51 | BNE START ; If not, repeat 52 | 53 | RTS ; Otherwise, return to caller 54 | 55 | MSG1 FCC 'Type a key (Q to quit): ' ; String to display 56 | FCB EOT 57 | 58 | MSG2 FCC 'Key code: ' ; String to display 59 | FCB EOT 60 | 61 | CHAR RMB 1 ; Holds entered character 62 | -------------------------------------------------------------------------------- /sbc/examples/ex2.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Simple example of using ASSIST09 monitor service routines to do 2 | 0002 ; console input and output. 3 | 0003 4 | 0004 ; Character defines 5 | 0005 6 | 0006 0004 EOT EQU $04 ; String terminator 7 | 0007 000a LF EQU $0A ; Line feed 8 | 0008 000d CR EQU $0D ; Carriage return 9 | 0009 10 | 0010 ; ASSIST09 SWI call numbers 11 | 0011 12 | 0012 0000 INCHNP EQU 0 ; INPUT CHAR IN A REG - NO PARITY 13 | 0013 0001 OUTCH EQU 1 ; OUTPUT CHAR FROM A REG 14 | 0014 0002 PDATA1 EQU 2 ; OUTPUT STRING 15 | 0015 0003 PDATA EQU 3 ; OUTPUT CR/LF THEN STRING 16 | 0016 0004 OUT2HS EQU 4 ; OUTPUT TWO HEX AND SPACE 17 | 0017 0005 OUT4HS EQU 5 ; OUTPUT FOUR HEX AND SPACE 18 | 0018 0006 PCRLF EQU 6 ; OUTPUT CR/LF 19 | 0019 0007 SPACE EQU 7 ; OUTPUT A SPACE 20 | 0020 0008 MONITR EQU 8 ; ENTER ASSIST09 MONITOR 21 | 0021 0009 VCTRSW EQU 9 ; VECTOR EXAMINE/SWITCH 22 | 0022 000a BRKPT EQU 10 ; USER PROGRAM BREAKPOINT 23 | 0023 000b PAUSE EQU 11 ; TASK PAUSE FUNCTION 24 | 0024 25 | 0025 7000 ORG $7000 ; Start address 26 | 0026 27 | 0027 7000 30 8d 00 1f START LEAX MSG1,PCR ; Get address of string to display 28 | 0028 7004 3f SWI ; Call ASSIST09 monitor function 29 | 0029 7005 02 FCB PDATA1 ; Service code byte 30 | 0030 31 | 0031 7006 3f SWI ; Input character, return in A 32 | 0032 7007 00 FCB INCHNP 33 | 0033 7008 b7 70 47 STA CHAR ; Save the character in memory 34 | 0034 35 | 0035 700b 3f SWI ; Print CR/LF 36 | 0036 700c 06 FCB PCRLF 37 | 0037 38 | 0038 700d 30 8d 00 2b LEAX MSG2,PCR ; Get address of string to display 39 | 0039 7011 3f SWI ; Call ASSIST09 monitor function 40 | 0040 7012 02 FCB PDATA1 ; Service code byte 41 | 0041 42 | 0042 7013 30 8d 00 30 LEAX CHAR,PCR ; Get pointer to character 43 | 0043 7017 3f SWI ; Output in hex 44 | 0044 7018 04 FCB OUT2HS 45 | 0045 46 | 0046 7019 3f SWI ; Print CR/LF 47 | 0047 701a 06 FCB PCRLF 48 | 0048 49 | 0049 701b b6 70 47 LDA CHAR ; Get the character 50 | 0050 701e 81 51 CMPA #'Q ; Was it Q? 51 | 0051 7020 26 de BNE START ; If not, repeat 52 | 0052 53 | 0053 7022 39 RTS ; Otherwise, return to caller 54 | 0054 55 | 0055 7023 54 79 70 65 20 61 MSG1 FCC 'Type a key (Q to quit): ' ; String to display 56 | 20 6b 65 79 20 28 57 | 51 20 74 6f 20 71 58 | 75 69 74 29 3a 20 59 | 0056 703b 04 FCB EOT 60 | 0057 61 | 0058 703c 4b 65 79 20 63 6f MSG2 FCC 'Key code: ' ; String to display 62 | 64 65 3a 20 63 | 0059 7046 04 FCB EOT 64 | 0060 65 | 0061 7047 CHAR RMB 1 ; Holds entered character 66 | -------------------------------------------------------------------------------- /sbc/examples/ex2.s19: -------------------------------------------------------------------------------- 1 | S1237000308D001F3F023F00B770473F06308D002B3F02308D00303F043F06B67047815180 2 | S123702026DE39547970652061206B657920285120746F2071756974293A20044B65792034 3 | S10A7040636F64653A20044C 4 | S9030000FC 5 | -------------------------------------------------------------------------------- /sbc/examples/ex3.asm: -------------------------------------------------------------------------------- 1 | ; Example of adding custom command to ASSIST09 using secondary command 2 | ; list. After calling this code from the monitor, typing the command U 3 | ; will get an address from the user and then display it. 4 | 5 | ; Character defines 6 | 7 | EOT EQU $04 ; String terminator 8 | 9 | ; ASSIST09 SWI call numbers 10 | 11 | PDATA1 EQU 2 ; Output string 12 | OUT4HS EQU 5 ; Output four hex and space 13 | PCRLF EQU 6 ; Output CR/LF 14 | VCTRSW EQU 9 ; Vector swap 15 | .CMDL2 EQU 44 ; Secondary command list 16 | 17 | ; ASSIST09 Routines and data 18 | 19 | CDNUM EQU $FE60 ; Note: Only valid for my ROM version 20 | PCNTER EQU $6093 ; Stores last PC value 21 | 22 | 23 | ORG $1000 ; Start address 24 | 25 | START LEAX MYCMDL,PCR ; Load new handler address 26 | LDA #.CMDL2 ; Load subcode for vector swap 27 | SWI ; Request service 28 | FCB VCTRSW ; Service code byte 29 | RTS ; Return to monitor 30 | 31 | ; Command table. 32 | 33 | MYCMDL: 34 | FCB 4 ; Table entry length 35 | FCC 'U' ; Command name 36 | FDB UCMD-* ; Pointer to command (relative to here) 37 | FCB $FE ; -2 indicates end of table 38 | 39 | ; The actual command. 40 | 41 | UCMD: LBSR CDNUM ; Parse command line, return 16-bit number in D 42 | LEAX MSG1,PCR ; Get address of string to display 43 | SWI ; Call ASSIST09 monitor function 44 | FCB PDATA1 ; Service code byte 45 | TFR D,X ; Put entered address in X 46 | BSR PrintAddress ; Print it 47 | SWI ; Print CR/LF 48 | FCB PCRLF 49 | RTS ; Return to monitor 50 | 51 | TEMP RMB 2 ; Temp variable (used by print routines) 52 | 53 | ; Print a word as four hex digits followed by a space. 54 | ; X contains word to print. 55 | ; Registers changed: none 56 | PrintAddress: 57 | PSHS A,B,X ; Save registers used 58 | STX TEMP ; Needs to be in memory so we can point to it 59 | LEAX TEMP,PCR ; Get pointer to it 60 | SWI ; Call ASSIST09 monitor function 61 | FCB OUT4HS ; Service code byte 62 | PULS X,B,A ; Restore registers used 63 | RTS 64 | 65 | MSG1 FCC 'Entered: ' 66 | FCB EOT 67 | -------------------------------------------------------------------------------- /sbc/examples/ex3.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Example of adding custom command to ASSIST09 using secondary command 2 | 0002 ; list. After calling this code from the monitor, typing the command U 3 | 0003 ; will get an address from the user and then display it. 4 | 0004 5 | 0005 ; Character defines 6 | 0006 7 | 0007 0004 EOT EQU $04 ; String terminator 8 | 0008 9 | 0009 ; ASSIST09 SWI call numbers 10 | 0010 11 | 0011 0002 PDATA1 EQU 2 ; Output string 12 | 0012 0005 OUT4HS EQU 5 ; Output four hex and space 13 | 0013 0006 PCRLF EQU 6 ; Output CR/LF 14 | 0014 0009 VCTRSW EQU 9 ; Vector swap 15 | 0015 002c .CMDL2 EQU 44 ; Secondary command list 16 | 0016 17 | 0017 ; ASSIST09 Routines and data 18 | 0018 19 | 0019 fe60 CDNUM EQU $FE60 ; Note: Only valid for my ROM version 20 | 0020 6093 PCNTER EQU $6093 ; Stores last PC value 21 | 0021 22 | 0022 23 | 0023 1000 ORG $1000 ; Start address 24 | 0024 25 | 0025 1000 30 8d 00 05 START LEAX MYCMDL,PCR ; Load new handler address 26 | 0026 1004 86 2c LDA #.CMDL2 ; Load subcode for vector swap 27 | 0027 1006 3f SWI ; Request service 28 | 0028 1007 09 FCB VCTRSW ; Service code byte 29 | 0029 1008 39 RTS ; Return to monitor 30 | 0030 31 | 0031 ; Command table. 32 | 0032 33 | 0033 MYCMDL: 34 | 0034 1009 04 FCB 4 ; Table entry length 35 | 0035 100a 55 FCC 'U' ; Command name 36 | 0036 100b 00 03 FDB UCMD-* ; Pointer to command (relative to here) 37 | 0037 100d fe FCB $FE ; -2 indicates end of table 38 | 0038 39 | 0039 ; The actual command. 40 | 0040 41 | 0041 100e 17 ee 4f UCMD: LBSR CDNUM ; Parse command line, return 16-bit number in D 42 | 0042 1011 30 8d 00 18 LEAX MSG1,PCR ; Get address of string to display 43 | 0043 1015 3f SWI ; Call ASSIST09 monitor function 44 | 0044 1016 02 FCB PDATA1 ; Service code byte 45 | 0045 1017 1f 01 TFR D,X ; Put entered address in X 46 | 0046 1019 8d 05 BSR PrintAddress ; Print it 47 | 0047 101b 3f SWI ; Print CR/LF 48 | 0048 101c 06 FCB PCRLF 49 | 0049 101d 39 RTS ; Return to monitor 50 | 0050 51 | 0051 101e TEMP RMB 2 ; Temp variable (used by print routines) 52 | 0052 53 | 0053 ; Print a word as four hex digits followed by a space. 54 | 0054 ; X contains word to print. 55 | 0055 ; Registers changed: none 56 | 0056 PrintAddress: 57 | 0057 1020 34 16 PSHS A,B,X ; Save registers used 58 | 0058 1022 bf 10 1e STX TEMP ; Needs to be in memory so we can point to it 59 | 0059 1025 30 8c f6 LEAX TEMP,PCR ; Get pointer to it 60 | 0060 1028 3f SWI ; Call ASSIST09 monitor function 61 | 0061 1029 05 FCB OUT4HS ; Service code byte 62 | 0062 102a 35 16 PULS X,B,A ; Restore registers used 63 | 0063 102c 39 RTS 64 | 0064 65 | 0065 102d 45 6e 74 65 72 65 MSG1 FCC 'Entered: ' 66 | 64 3a 20 67 | 0066 1036 04 FCB EOT 68 | -------------------------------------------------------------------------------- /sbc/examples/ex3.s19: -------------------------------------------------------------------------------- 1 | S1211000308D0005862C3F093904550003FE17EE4F308D00183F021F018D053F0639E5 2 | S11A10203416BF101E308CF63F05351639456E74657265643A2004DF 3 | S9030000FC 4 | -------------------------------------------------------------------------------- /sbc/examples/ex4.asm: -------------------------------------------------------------------------------- 1 | ; Example of calling machine language routine from BASIC. 2 | ; This example takes an integer value passed to it from BASIC, 3 | ; multiplies it by 2, and returns the result. 4 | ; Code is relocatable, but here use origin of $7530 (30000 decimal) 5 | ; as that is what is used in the example. 6 | ; For more background see chapter 34 of "Getting Started With Extended Color Basic". 7 | ; Will run standalone as the BASIC program ex4.bas 8 | 9 | ; Sample program run: 10 | ; 11 | ; VALUE TO PASS? 9 12 | ; RESULT WAS 18 13 | ; VALUE TO PASS? 88 14 | ; RESULT WAS 176 15 | 16 | ; Another simple example, call dissassembler in ROM from BASIC: 17 | ; POKE &H5FF0,&H75 18 | ; POKE &H5FF1,&H30 19 | ; EXEC &HC006 20 | 21 | ; Adjust these values to match where basic is loaded. These are 22 | ; correct for the "combined" ROM. 23 | INTCNV EQU $CB74 ; Gets integer passed in USR() function and returns in D 24 | GIVABF EQU $CC7B ; Takes value in D and returns value to BASIC 25 | 26 | ORG $7530 ; Decimal 30000 27 | 28 | JSR INTCNV ; Get value passed in basic 29 | ASLB ; 16-bit shift of D: Rotate B, MSB into Carry 30 | ROLA ; Rotate A, Carry into LSB 31 | JMP GIVABF ; Return to BASIC 32 | -------------------------------------------------------------------------------- /sbc/examples/ex4.bas: -------------------------------------------------------------------------------- 1 | 10 REM EXAMPLE OF CALLING MACHINE LANGUAGE FROM BASIC 2 | 20 REM SEE EX4.ASM FOR ML ROUTINE SOURCE CODE 3 | 30 REM RESERVE MEMORY 4 | 40 CLEAR 25,30000 5 | 50 REM START ADDRESS OF USR0 ROUTINE 6 | 60 DEF USR0 = 30000 7 | 70 I=0 8 | 80 READ B 9 | 90 IF B=-1 THEN GOTO 130 10 | 100 POKE 30000+I,B 11 | 110 I=I+1 12 | 120 GOTO 80 13 | 130 PRINT "VALUE TO PASS"; 14 | 140 INPUT N 15 | 150 R=USR0(N) 16 | 160 PRINT "RESULT WAS"; R 17 | 170 GOTO 130 18 | 180 REM OBJECT CODE, TERMINATED IN -1 19 | 190 DATA 189, 203, 116, 88, 73, 126, 204, 123 20 | 200 DATA -1 21 | -------------------------------------------------------------------------------- /sbc/examples/ex4.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Example of calling machine language routine from BASIC. 2 | 0002 ; This example takes an integer value passed to it from BASIC, 3 | 0003 ; multiplies it by 2, and returns the result. 4 | 0004 ; Code is relocatable, but here use origin of $7530 (30000 decimal) 5 | 0005 ; as that is what is used in the example. 6 | 0006 ; For more background see chapter 34 of "Getting Started With Extended Color Basic". 7 | 0007 ; Will run standalone as the BASIC program ex4.bas 8 | 0008 9 | 0009 ; Sample program run: 10 | 0010 ; 11 | 0011 ; VALUE TO PASS? 9 12 | 0012 ; RESULT WAS 18 13 | 0013 ; VALUE TO PASS? 88 14 | 0014 ; RESULT WAS 176 15 | 0015 16 | 0016 ; Another simple example, call dissassembler in ROM from BASIC: 17 | 0017 ; POKE &H5FF0,&H75 18 | 0018 ; POKE &H5FF1,&H30 19 | 0019 ; EXEC &HC006 20 | 0020 21 | 0021 ; Adjust these values to match where basic is loaded. These are 22 | 0022 ; correct for the "combined" ROM. 23 | 0023 cb74 INTCNV EQU $CB74 ; Gets integer passed in USR() function and returns in D 24 | 0024 cc7b GIVABF EQU $CC7B ; Takes value in D and returns value to BASIC 25 | 0025 26 | 0026 7530 ORG $7530 ; Decimal 30000 27 | 0027 28 | 0028 7530 bd cb 74 JSR INTCNV ; Get value passed in basic 29 | 0029 7533 58 ASLB ; 16-bit shift of D: Rotate B, MSB into Carry 30 | 0030 7534 49 ROLA ; Rotate A, Carry into LSB 31 | 0031 7535 7e cc 7b JMP GIVABF ; Return to BASIC 32 | -------------------------------------------------------------------------------- /sbc/examples/ex4.s19: -------------------------------------------------------------------------------- 1 | S10B7530BDCB7458497ECC7BED 2 | S9030000FC 3 | -------------------------------------------------------------------------------- /sbc/examples/ex5.asm: -------------------------------------------------------------------------------- 1 | ; Example of embedded string printer. 2 | 3 | ; Defines 4 | 5 | LF equ $0A ; Line feed 6 | CR equ $0D ; Carriage return 7 | 8 | ; ASSIST09 SWI call numbers 9 | 10 | OUTCH equ 1 ; OUTPUT CHAR FROM A REG 11 | 12 | ; Main program 13 | 14 | org $1000 ; Start address 15 | 16 | bsr Imprint ; Call string printer 17 | fcc "Hello, world!" 18 | fcb CR,LF,0 19 | 20 | bsr Imprint ; Call string printer 21 | fcc " GREETINGS " 22 | fcb 0 23 | 24 | bsr Imprint ; Call string printer 25 | fcc "And hello again." 26 | fcb CR,LF,0 27 | 28 | rts 29 | 30 | ; Embedded string printer. Examines the stack to find the embedded 31 | ; string right after the call to this routine. Outputs one character 32 | ; at a time until a 0 marker is found. Then it returns to the calling 33 | ; program just beyond the string. Note: If you forget the terminating 34 | ; zero marker, it will likely crash on return. 35 | ; 36 | ; Registers changed: none 37 | 38 | Imprint pshs a,x ; Save registers used (3 bytes). 39 | ldx 3,s ; Pull return address from stack (points to start of string). 40 | next lda 0,x+ ; Get a character to print, increment pointer. 41 | beq eos ; Branch if terminating null reached. 42 | swi ; Call monitor routine to print character. 43 | fcb OUTCH ; System call. 44 | bra next ; Repeat for next character. 45 | 46 | ; X now points past string to next instruction, where we want to return. 47 | 48 | eos stx 3,s ; Save return address on stack. 49 | puls a,x ; Restore registers used (3 bytes). 50 | rts ; And return. 51 | -------------------------------------------------------------------------------- /sbc/examples/ex5.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Example of embedded string printer. 2 | 0002 3 | 0003 ; Defines 4 | 0004 5 | 0005 000a LF equ $0A ; Line feed 6 | 0006 000d CR equ $0D ; Carriage return 7 | 0007 8 | 0008 ; ASSIST09 SWI call numbers 9 | 0009 10 | 0010 0001 OUTCH equ 1 ; OUTPUT CHAR FROM A REG 11 | 0011 12 | 0012 ; Main program 13 | 0013 14 | 0014 1000 org $1000 ; Start address 15 | 0015 16 | 0016 1000 8d 34 bsr Imprint ; Call string printer 17 | 0017 1002 48 65 6c 6c 6f 2c fcc "Hello, world!" 18 | 20 77 6f 72 6c 64 19 | 21 20 | 0018 100f 0d 0a 00 fcb CR,LF,0 21 | 0019 22 | 0020 1012 8d 22 bsr Imprint ; Call string printer 23 | 0021 1014 20 47 52 45 45 54 fcc " GREETINGS " 24 | 49 4e 47 53 20 25 | 0022 101f 00 fcb 0 26 | 0023 27 | 0024 1020 8d 14 bsr Imprint ; Call string printer 28 | 0025 1022 41 6e 64 20 68 65 fcc "And hello again." 29 | 6c 6c 6f 20 61 67 30 | 61 69 6e 2e 31 | 0026 1032 0d 0a 00 fcb CR,LF,0 32 | 0027 33 | 0028 1035 39 rts 34 | 0029 35 | 0030 ; Embedded string printer. Examines the stack to find the embedded 36 | 0031 ; string right after the call to this routine. Outputs one character 37 | 0032 ; at a time until a 0 marker is found. Then it returns to the calling 38 | 0033 ; program just beyond the string. Note: If you forget the terminating 39 | 0034 ; zero marker, it will likely crash on return. 40 | 0035 ; 41 | 0036 ; Registers changed: none 42 | 0037 43 | 0038 1036 34 12 Imprint pshs a,x ; Save registers used (3 bytes). 44 | 0039 1038 ae 63 ldx 3,s ; Pull return address from stack (points to start of string). 45 | 0040 103a a6 80 next lda 0,x+ ; Get a character to print, increment pointer. 46 | 0041 103c 27 04 beq eos ; Branch if terminating null reached. 47 | 0042 103e 3f swi ; Call monitor routine to print character. 48 | 0043 103f 01 fcb OUTCH ; System call. 49 | 0044 1040 20 f8 bra next ; Repeat for next character. 50 | 0045 51 | 0046 ; X now points past string to next instruction, where we want to return. 52 | 0047 53 | 0048 1042 af 63 eos stx 3,s ; Save return address on stack. 54 | 0049 1044 35 12 puls a,x ; Restore registers used (3 bytes). 55 | 0050 1046 39 rts ; And return. 56 | -------------------------------------------------------------------------------- /sbc/examples/ex5.s19: -------------------------------------------------------------------------------- 1 | S12310008D3448656C6C6F2C20776F726C64210D0A008D22204752454554494E47532000D4 2 | S12310208D14416E642068656C6C6F20616761696E2E0D0A00393412AE63A68027043F013E 3 | S10A104020F8AF63351239FB 4 | S9030000FC 5 | -------------------------------------------------------------------------------- /sbc/examples/ex6.asm: -------------------------------------------------------------------------------- 1 | ; Bubble sort example program from the book "Programming the 6809" by 2 | ; Rodnay Zaks and William Labiak, p.284 3 | ; 4 | ; Note that the table length cannot be greater than 127. 5 | ; Data is sorted as signed bytes, e.g. $80 is interpreted as -1. If 6 | ; you want unsigned comparison, replace "bge noswit" with "bhs noswit". 7 | 8 | org $1000 9 | 10 | bubble ldx #base ; Get table 11 | ldb #length ; Get length 12 | decb 13 | leax b,x ; Point to end 14 | clr exchg ; Clear exchange flag 15 | next lda ,x ; A = current entry 16 | cmpa ,-x ; Compare with next 17 | bge noswit ; Go to noswitch if current >= next (signed) 18 | pshs b ; Save B 19 | ldb ,x ; Get next 20 | stb 1,x ; Store in current 21 | sta ,x ; Store current in next 22 | puls b ; Restore B 23 | inc exchg ; Set exchange flag 24 | noswit decb ; Decrement B 25 | bne next ; Continue until zero 26 | tst exchg ; Exchange = 0? 27 | bne bubble ; Restart of no = 0 28 | rts 29 | 30 | ; Storage 31 | 32 | exchg rmb 1 ; Exchange flag 33 | 34 | ; Data to be sorted (random) 35 | 36 | org $2000 37 | 38 | length equ 100 ; Number of data items 39 | 40 | base fcb 203, 187, 184, 205, 165, 126, 19, 253 41 | fcb 30, 24, 152, 140, 103, 65, 131, 131 42 | fcb 189, 161, 45, 44, 37, 216, 199, 226 43 | fcb 247, 179, 164, 230, 78, 28, 64, 160 44 | fcb 188, 4, 199, 50, 77, 221, 73, 204 45 | fcb 64, 215, 96, 151, 124, 135, 111, 190 46 | fcb 52, 19, 67, 88, 174, 167, 70, 183 47 | fcb 171, 54, 245, 253, 100, 81, 227, 85 48 | fcb 149, 41, 239, 197, 148, 100, 240, 249 49 | fcb 223, 249, 138, 242, 34, 175, 101, 1 50 | fcb 49, 106, 131, 243, 229, 245, 224, 225 51 | fcb 82, 105, 36, 116, 94, 215, 151, 38 52 | fcb 30, 103, 10, 7 53 | -------------------------------------------------------------------------------- /sbc/examples/ex6.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Bubble sort example program from the book "Programming the 6809" by 2 | 0002 ; Rodnay Zaks and William Labiak, p.284 3 | 0003 ; 4 | 0004 ; Note that the table length cannot be greater than 127. 5 | 0005 ; Data is sorted as signed bytes, e.g. $80 is interpreted as -1. If 6 | 0006 ; you want unsigned comparison, replace "bge noswit" with "bhs noswit". 7 | 0007 8 | 0008 1000 org $1000 9 | 0009 10 | 0010 1000 8e 20 00 bubble ldx #base ; Get table 11 | 0011 1003 c6 64 ldb #length ; Get length 12 | 0012 1005 5a decb 13 | 0013 1006 30 85 leax b,x ; Point to end 14 | 0014 1008 7f 10 27 clr exchg ; Clear exchange flag 15 | 0015 100b a6 84 next lda ,x ; A = current entry 16 | 0016 100d a1 82 cmpa ,-x ; Compare with next 17 | 0017 100f 2c 0d bge noswit ; Go to noswitch if current >= next (signed) 18 | 0018 1011 34 04 pshs b ; Save B 19 | 0019 1013 e6 84 ldb ,x ; Get next 20 | 0020 1015 e7 01 stb 1,x ; Store in current 21 | 0021 1017 a7 84 sta ,x ; Store current in next 22 | 0022 1019 35 04 puls b ; Restore B 23 | 0023 101b 7c 10 27 inc exchg ; Set exchange flag 24 | 0024 101e 5a noswit decb ; Decrement B 25 | 0025 101f 26 ea bne next ; Continue until zero 26 | 0026 1021 7d 10 27 tst exchg ; Exchange = 0? 27 | 0027 1024 26 da bne bubble ; Restart of no = 0 28 | 0028 1026 39 rts 29 | 0029 30 | 0030 ; Storage 31 | 0031 32 | 0032 1027 exchg rmb 1 ; Exchange flag 33 | 0033 34 | 0034 ; Data to be sorted (random) 35 | 0035 36 | 0036 2000 org $2000 37 | 0037 38 | 0038 0064 length equ 100 ; Number of data items 39 | 0039 40 | 0040 2000 cb bb b8 cd a5 7e base fcb 203, 187, 184, 205, 165, 126, 19, 253 41 | 13 fd 42 | 0041 2008 1e 18 98 8c 67 41 fcb 30, 24, 152, 140, 103, 65, 131, 131 43 | 83 83 44 | 0042 2010 bd a1 2d 2c 25 d8 fcb 189, 161, 45, 44, 37, 216, 199, 226 45 | c7 e2 46 | 0043 2018 f7 b3 a4 e6 4e 1c fcb 247, 179, 164, 230, 78, 28, 64, 160 47 | 40 a0 48 | 0044 2020 bc 04 c7 32 4d dd fcb 188, 4, 199, 50, 77, 221, 73, 204 49 | 49 cc 50 | 0045 2028 40 d7 60 97 7c 87 fcb 64, 215, 96, 151, 124, 135, 111, 190 51 | 6f be 52 | 0046 2030 34 13 43 58 ae a7 fcb 52, 19, 67, 88, 174, 167, 70, 183 53 | 46 b7 54 | 0047 2038 ab 36 f5 fd 64 51 fcb 171, 54, 245, 253, 100, 81, 227, 85 55 | e3 55 56 | 0048 2040 95 29 ef c5 94 64 fcb 149, 41, 239, 197, 148, 100, 240, 249 57 | f0 f9 58 | 0049 2048 df f9 8a f2 22 af fcb 223, 249, 138, 242, 34, 175, 101, 1 59 | 65 01 60 | 0050 2050 31 6a 83 f3 e5 f5 fcb 49, 106, 131, 243, 229, 245, 224, 225 61 | e0 e1 62 | 0051 2058 52 69 24 74 5e d7 fcb 82, 105, 36, 116, 94, 215, 151, 38 63 | 97 26 64 | 0052 2060 1e 67 0a 07 fcb 30, 103, 10, 7 65 | -------------------------------------------------------------------------------- /sbc/examples/ex6.s19: -------------------------------------------------------------------------------- 1 | S12310008E2000C6645A30857F1027A684A1822C0D3404E684E701A78435047C10275A2688 2 | S10A1020EA7D102726DA39EE 3 | S1232000CBBBB8CDA57E13FD1E18988C67418383BDA12D2C25D8C7E2F7B3A4E64E1C40A09B 4 | S1232020BC04C7324DDD49CC40D760977C876FBE34134358AEA746B7AB36F5FD6451E35572 5 | S12320409529EFC59464F0F9DFF98AF222AF6501316A83F3E5F5E0E1526924745ED79726AD 6 | S10720601E670A07E2 7 | S9030000FC 8 | -------------------------------------------------------------------------------- /sbc/examples/ex7.asm: -------------------------------------------------------------------------------- 1 | ; Interrupt example 1. 2 | ; Example of sending characters in an interrupt-driven fashion. 3 | ; 4 | ; Uses a 6850 ACIA which must have its INT* line connnected to the 5 | ; CPU/IRQ line. 6 | 7 | ; Equates 8 | 9 | intvec equ $7f00 ; Address of IRQ handler in MONDEB. 10 | aciac equ $a000 ; 6850 ACIA status/control register. 11 | aciad equ $a001 ; 6850 ACIA data register. 12 | eos equ $00 ; End of string character (NULL). 13 | cr equ $0d ; Carriage return. 14 | nl equ $0a : Newline. 15 | 16 | ; Main program 17 | 18 | org $1000 19 | 20 | ; Disable interrupts to start. 21 | 22 | start orcc #%00010000 ; SEI (mask interrupts). 23 | 24 | ; Set up ACIA control register to send interrupts when TDRE true. 25 | ; Receive interrupt disabled. Output /RTS=low and enable Tx Interrupt. 26 | ; Data format 8N1. CLK/16 27 | 28 | lda #3 ; Reset ACIA 29 | sta aciac 30 | lda #%00110101 ; Control register setting. 31 | sta aciac ; Initialize ACIA to 8 bits and no parity. 32 | 33 | ; Set IRQ vector to call our handler routine. 34 | 35 | ldx #handler ; This only works with MONDEB monitor. 36 | stx intvec 37 | 38 | ; Buffer contains string to send. 39 | ; Initialize bufptr to point to start of string. 40 | 41 | ldx #buffer 42 | stx bufptr 43 | 44 | ; Run CWAI # to enable interrupts 45 | ; Loop back forever 46 | 47 | ;forever cwai #%11101111 ; Enable IRQ 48 | ; bra forever 49 | 50 | ; Alternative code to above. Enable interrupts and perform SYNC. 51 | 52 | andcc #%11101111 ; CLI (enable IRQ) 53 | forever sync 54 | bra forever 55 | 56 | ; Third option to above. Run code to increment a 16-bit value in a 57 | ; loop. Gets interrupted to output characters to ACIA. 58 | 59 | ; ldx #0 ; Initialize counter to $0000 60 | ; stx counter 61 | ; andcc #%11101111 ; CLI (enable IRQ) 62 | ;forever ldx counter ; Increment 16-bit counter 63 | ; leax 1,x 64 | ; stx counter 65 | ; bra forever 66 | 67 | ; IRQ Handler: 68 | 69 | ; If next character (pointed to by bufptr) is not a null: 70 | ; Write next character (pointed to by bufptr) to ACIA data register 71 | ; Increment bufptr to point to next address. 72 | ; Return from interrupt. 73 | 74 | 75 | handler lda [bufptr] ; Get character. 76 | cmpa #eos ; End of string character? 77 | beq done ; Branch to return if end of string. 78 | sta aciad ; Write to ACIA (also clears interrupt). 79 | ldx bufptr ; Get buffer pointer. 80 | leax 1,x ; Do 16-bit increment. 81 | stx bufptr ; Save it. 82 | done rti ; Return from interrupt. 83 | 84 | ; Data 85 | 86 | org $2000 87 | bufptr rmb 2 ; Pointer to next available point in data buffer 88 | counter rmb 2 ; 16-bit counter 89 | buffer fcc "This is a test of interrupt driven serial output." ; Data buffer 90 | fcb cr,nl 91 | fcb eos ; End of string indicator 92 | -------------------------------------------------------------------------------- /sbc/examples/ex7.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Interrupt example 1. 2 | 0002 ; Example of sending characters in an interrupt-driven fashion. 3 | 0003 ; 4 | 0004 ; Uses a 6850 ACIA which must have its INT* line connnected to the 5 | 0005 ; CPU/IRQ line. 6 | 0006 7 | 0007 ; Equates 8 | 0008 9 | 0009 7f00 intvec equ $7f00 ; Address of IRQ handler in MONDEB. 10 | 0010 a000 aciac equ $a000 ; 6850 ACIA status/control register. 11 | 0011 a001 aciad equ $a001 ; 6850 ACIA data register. 12 | 0012 0000 eos equ $00 ; End of string character (NULL). 13 | 0013 000d cr equ $0d ; Carriage return. 14 | 0014 000a nl equ $0a : Newline. 15 | 0015 16 | 0016 ; Main program 17 | 0017 18 | 0018 1000 org $1000 19 | 0019 20 | 0020 ; Disable interrupts to start. 21 | 0021 22 | 0022 1000 1a 10 start orcc #%00010000 ; SEI (mask interrupts). 23 | 0023 24 | 0024 ; Set up ACIA control register to send interrupts when TDRE true. 25 | 0025 ; Receive interrupt disabled. Output /RTS=low and enable Tx Interrupt. 26 | 0026 ; Data format 8N1. CLK/16 27 | 0027 28 | 0028 1002 86 03 lda #3 ; Reset ACIA 29 | 0029 1004 b7 a0 00 sta aciac 30 | 0030 1007 86 35 lda #%00110101 ; Control register setting. 31 | 0031 1009 b7 a0 00 sta aciac ; Initialize ACIA to 8 bits and no parity. 32 | 0032 33 | 0033 ; Set IRQ vector to call our handler routine. 34 | 0034 35 | 0035 100c 8e 10 1d ldx #handler ; This only works with MONDEB monitor. 36 | 0036 100f bf 7f 00 stx intvec 37 | 0037 38 | 0038 ; Buffer contains string to send. 39 | 0039 ; Initialize bufptr to point to start of string. 40 | 0040 41 | 0041 1012 8e 20 04 ldx #buffer 42 | 0042 1015 bf 20 00 stx bufptr 43 | 0043 44 | 0044 ; Run CWAI # to enable interrupts 45 | 0045 ; Loop back forever 46 | 0046 47 | 0047 ;forever cwai #%11101111 ; Enable IRQ 48 | 0048 ; bra forever 49 | 0049 50 | 0050 ; Alternative code to above. Enable interrupts and perform SYNC. 51 | 0051 52 | 0052 1018 1c ef andcc #%11101111 ; CLI (enable IRQ) 53 | 0053 101a 13 forever sync 54 | 0054 101b 20 fd bra forever 55 | 0055 56 | 0056 ; Third option to above. Run code to increment a 16-bit value in a 57 | 0057 ; loop. Gets interrupted to output characters to ACIA. 58 | 0058 59 | 0059 ; ldx #0 ; Initialize counter to $0000 60 | 0060 ; stx counter 61 | 0061 ; andcc #%11101111 ; CLI (enable IRQ) 62 | 0062 ;forever ldx counter ; Increment 16-bit counter 63 | 0063 ; leax 1,x 64 | 0064 ; stx counter 65 | 0065 ; bra forever 66 | 0066 67 | 0067 ; IRQ Handler: 68 | 0068 69 | 0069 ; If next character (pointed to by bufptr) is not a null: 70 | 0070 ; Write next character (pointed to by bufptr) to ACIA data register 71 | 0071 ; Increment bufptr to point to next address. 72 | 0072 ; Return from interrupt. 73 | 0073 74 | 0074 75 | 0075 101d a6 9f 20 00 handler lda [bufptr] ; Get character. 76 | 0076 1021 81 00 cmpa #eos ; End of string character? 77 | 0077 1023 27 0b beq done ; Branch to return if end of string. 78 | 0078 1025 b7 a0 01 sta aciad ; Write to ACIA (also clears interrupt). 79 | 0079 1028 be 20 00 ldx bufptr ; Get buffer pointer. 80 | 0080 102b 30 01 leax 1,x ; Do 16-bit increment. 81 | 0081 102d bf 20 00 stx bufptr ; Save it. 82 | 0082 1030 3b done rti ; Return from interrupt. 83 | 0083 84 | 0084 ; Data 85 | 0085 86 | 0086 2000 org $2000 87 | 0087 2000 bufptr rmb 2 ; Pointer to next available point in data buffer 88 | 0088 2002 counter rmb 2 ; 16-bit counter 89 | 0089 2004 54 68 69 73 20 69 buffer fcc "This is a test of interrupt driven serial output." ; Data buffer 90 | 73 20 61 20 74 65 91 | 73 74 20 6f 66 20 92 | 69 6e 74 65 72 72 93 | 75 70 74 20 64 72 94 | 69 76 65 6e 20 73 95 | 65 72 69 61 6c 20 96 | 6f 75 74 70 75 74 97 | 2e 98 | 0090 2035 0d 0a fcb cr,nl 99 | 0091 2037 00 fcb eos ; End of string indicator 100 | -------------------------------------------------------------------------------- /sbc/examples/ex7.s19: -------------------------------------------------------------------------------- 1 | S12310001A108603B7A0008635B7A0008E101DBF7F008E2004BF20001CEF1320FDA69F2086 2 | S1141020008100270BB7A001BE20003001BF20003B87 3 | S12320045468697320697320612074657374206F6620696E746572727570742064726976EC 4 | S1172024656E2073657269616C206F75747075742E0D0A001B 5 | S9030000FC 6 | -------------------------------------------------------------------------------- /sbc/examples/ex8.asm: -------------------------------------------------------------------------------- 1 | ; Interrupt example 2. 2 | ; Example of receiving characters in an interrupt-driven fashion. 3 | ; 4 | ; Uses a 6850 ACIA which must have its INT* line connnected to the 5 | ; CPU/IRQ line. 6 | 7 | ; Equates 8 | 9 | intvec equ $7f00 ; Address of IRQ handler in MONDEB. 10 | aciac equ $a000 ; 6850 ACIA status/control register. 11 | aciad equ $a001 ; 6850 ACIA data register. 12 | eos equ $00 ; End of string character (NULL). 13 | cr equ $0d ; Carriage return. 14 | nl equ $0a : Newline. 15 | 16 | ; Main program 17 | 18 | org $1000 19 | 20 | ; Disable interrupts to start. 21 | 22 | start orcc #%00010000 ; SEI (mask interrupts). 23 | 24 | ; Set up ACIA control register to send interrupts when TDRE true. 25 | ; Receive interrupt disabled. Output /RTS=low and enable Tx Interrupt. 26 | ; Data format 8N1. CLK/16 27 | 28 | lda #3 ; Reset ACIA 29 | sta aciac 30 | lda #%10010101 ; Control register setting. 31 | sta aciac ; Initialize ACIA to 8 bits and no parity. 32 | 33 | ; Set IRQ vector to call our handler routine. 34 | 35 | ldx #handler ; This only works with MONDEB monitor. 36 | stx intvec 37 | 38 | ; Buffer contains characters entered. 39 | ; Initialize bufptr to point to start of string. 40 | 41 | ldx #buffer 42 | stx bufptr 43 | 44 | ; Run CWAI # to enable interrupts 45 | ; Loop back forever 46 | 47 | forever cwai #%11101111 ; Enable IRQ 48 | bra forever 49 | 50 | ; IRQ Handler: 51 | 52 | ; Get serial data. Echo it back. 53 | ; Write character to buffer. 54 | ; Increment bufptr to point to next address. 55 | ; If character was Return or Newline, jump to monitor. 56 | ; Otherwise, return from interrupt. 57 | 58 | handler lda aciad ; Get character. 59 | sta aciad ; Echo character back out. 60 | ldx bufptr ; Get buffer pointer 61 | sta ,x+ ; Save in buffer and increment pointer. 62 | stx bufptr ; Save new pointer. 63 | 64 | cmpa #cr ; Carriage return? 65 | beq eol ; If so, branch. 66 | cmpa #nl ; Line feed? 67 | beq eol ; If so, branch. 68 | rti ; Return from interrupt. 69 | 70 | eol jmp [$fffe] ; Go to monitor via reset vector. 71 | 72 | ; Data 73 | 74 | org $2000 75 | bufptr rmb 2 ; Pointer to next available point in data buffer. 76 | buffer rmb 132 ; Data buffer. 77 | -------------------------------------------------------------------------------- /sbc/examples/ex8.lst: -------------------------------------------------------------------------------- 1 | 0001 ; Interrupt example 2. 2 | 0002 ; Example of receiving characters in an interrupt-driven fashion. 3 | 0003 ; 4 | 0004 ; Uses a 6850 ACIA which must have its INT* line connnected to the 5 | 0005 ; CPU/IRQ line. 6 | 0006 7 | 0007 ; Equates 8 | 0008 9 | 0009 7f00 intvec equ $7f00 ; Address of IRQ handler in MONDEB. 10 | 0010 a000 aciac equ $a000 ; 6850 ACIA status/control register. 11 | 0011 a001 aciad equ $a001 ; 6850 ACIA data register. 12 | 0012 0000 eos equ $00 ; End of string character (NULL). 13 | 0013 000d cr equ $0d ; Carriage return. 14 | 0014 000a nl equ $0a : Newline. 15 | 0015 16 | 0016 ; Main program 17 | 0017 18 | 0018 1000 org $1000 19 | 0019 20 | 0020 ; Disable interrupts to start. 21 | 0021 22 | 0022 1000 1a 10 start orcc #%00010000 ; SEI (mask interrupts). 23 | 0023 24 | 0024 ; Set up ACIA control register to send interrupts when TDRE true. 25 | 0025 ; Receive interrupt disabled. Output /RTS=low and enable Tx Interrupt. 26 | 0026 ; Data format 8N1. CLK/16 27 | 0027 28 | 0028 1002 86 03 lda #3 ; Reset ACIA 29 | 0029 1004 b7 a0 00 sta aciac 30 | 0030 1007 86 95 lda #%10010101 ; Control register setting. 31 | 0031 1009 b7 a0 00 sta aciac ; Initialize ACIA to 8 bits and no parity. 32 | 0032 33 | 0033 ; Set IRQ vector to call our handler routine. 34 | 0034 35 | 0035 100c 8e 10 1c ldx #handler ; This only works with MONDEB monitor. 36 | 0036 100f bf 7f 00 stx intvec 37 | 0037 38 | 0038 ; Buffer contains characters entered. 39 | 0039 ; Initialize bufptr to point to start of string. 40 | 0040 41 | 0041 1012 8e 20 02 ldx #buffer 42 | 0042 1015 bf 20 00 stx bufptr 43 | 0043 44 | 0044 ; Run CWAI # to enable interrupts 45 | 0045 ; Loop back forever 46 | 0046 47 | 0047 1018 3c ef forever cwai #%11101111 ; Enable IRQ 48 | 0048 101a 20 fc bra forever 49 | 0049 50 | 0050 ; IRQ Handler: 51 | 0051 52 | 0052 ; Get serial data. Echo it back. 53 | 0053 ; Write character to buffer. 54 | 0054 ; Increment bufptr to point to next address. 55 | 0055 ; If character was Return or Newline, jump to monitor. 56 | 0056 ; Otherwise, return from interrupt. 57 | 0057 58 | 0058 101c b6 a0 01 handler lda aciad ; Get character. 59 | 0059 101f b7 a0 01 sta aciad ; Echo character back out. 60 | 0060 1022 be 20 00 ldx bufptr ; Get buffer pointer 61 | 0061 1025 a7 80 sta ,x+ ; Save in buffer and increment pointer. 62 | 0062 1027 bf 20 00 stx bufptr ; Save new pointer. 63 | 0063 64 | 0064 102a 81 0d cmpa #cr ; Carriage return? 65 | 0065 102c 27 05 beq eol ; If so, branch. 66 | 0066 102e 81 0a cmpa #nl ; Line feed? 67 | 0067 1030 27 01 beq eol ; If so, branch. 68 | 0068 1032 3b rti ; Return from interrupt. 69 | 0069 70 | 0070 1033 6e 9f ff fe eol jmp [$fffe] ; Go to monitor via reset vector. 71 | 0071 72 | 0072 ; Data 73 | 0073 74 | 0074 2000 org $2000 75 | 0075 2000 bufptr rmb 2 ; Pointer to next available point in data buffer. 76 | 0076 2002 buffer rmb 132 ; Data buffer. 77 | -------------------------------------------------------------------------------- /sbc/examples/ex8.s19: -------------------------------------------------------------------------------- 1 | S12310001A108603B7A0008695B7A0008E101CBF7F008E2002BF20003CEF20FCB6A001B774 2 | S11A1020A001BE2000A780BF2000810D2705810A27013B6E9FFFFE7E 3 | S9030000FC 4 | -------------------------------------------------------------------------------- /sbc/examples/horoscope.bas: -------------------------------------------------------------------------------- 1 | 10 REM HOROSCOPE GENERATOR 2 | 20 REM BY JEFF TRANTER 3 | 30 REM 13 MAY 2012 4 | 35 DIM N$(20), C$(20), T$(20), S$(12), A$(3) 5 | 40 GOSUB 10000 : REM CLEAR SCREEN 6 | 50 PRINT " YOUR HOROSCOPE" 7 | 60 PRINT " --------------" 8 | 70 PRINT "" 9 | 80 PRINT "THE PROGRAM GENERATES A PERSONAL" 10 | 90 PRINT "HOROSCOPE. I NEED SOME INFORMATION" 11 | 100 PRINT "ABOUT YOUR DATE AND LOCATION OF BIRTH." 12 | 110 PRINT "I WILL THEN GENERATE AN ANALYSIS BASED" 13 | 120 PRINT "ON YOUR ASTROLOGICAL DATA." 14 | 130 PRINT "" 15 | 140 REM GET INPUT FROM USER 16 | 150 PRINT "WHAT IS YOUR FIRST NAME"; 17 | 155 INPUT N$ 18 | 160 PRINT "YOUR YEAR OF BIRTH (E.G. 1980)"; 19 | 165 INPUT Y 20 | 170 IF Y < 1900 OR Y > 2020 THEN 160 21 | 180 PRINT "YOUR MONTH OF BIRTH (1=JAN)"; 22 | 185 INPUT M 23 | 190 IF M < 1 OR M >12 THEN 180 24 | 200 PRINT "DAY OF THE MONTH (1-31)"; 25 | 205 INPUT D 26 | 210 IF D < 1 OR D > 31 THEN 200 27 | 220 PRINT "COUNTRY OF BIRTH"; 28 | 225 INPUT C$ 29 | 230 PRINT "IN WHAT CITY"; 30 | 235 INPUT T$ 31 | 240 PRINT "CALCULATING HOROSCOPE...PLEASE WAIT." 32 | 250 FOR I = 1 TO 3000 : NEXT I 33 | 260 PRINT 34 | 270 GOSUB 11000 35 | 280 GOSUB 10000 36 | 290 PRINT N$;", YOUR ASTROLOGICAL SIGN IS:" 37 | 300 PRINT S$;"." 38 | 310 PRINT "" 39 | 320 PRINT "HERE IS MY ANALYSIS:" 40 | 330 PRINT "" 41 | 340 L1 = RND(35) 42 | 350 L2 = RND(35) 43 | 360 IF L2 = L1 THEN 350 44 | 370 L3 = RND(35) 45 | 380 IF L3 = L1 THEN 370 46 | 390 IF L3 = L2 THEN 370 47 | 400 ON L1 GOSUB 12010,12020,12030,12040,12050,12060,12070,12080,12090,12100,12110,12120,12130,12140,12150,12160,12170,12180,12190,12200,12210,12220,12230,12240,12250,12260,12270,12280,12290,12300,12310,12320,12330,12340,12350 48 | 410 PRINT 49 | 420 ON L2 GOSUB 12010,12020,12030,12040,12050,12060,12070,12080,12090,12100,12110,12120,12130,12140,12150,12160,12170,12180,12190,12200,12210,12220,12230,12240,12250,12260,12270,12280,12290,12300,12310,12320,12330,12340,12350 50 | 430 PRINT 51 | 440 ON L3 GOSUB 12010,12020,12030,12040,12050,12060,12070,12080,12090,12100,12110,12120,12130,12140,12150,12160,12170,12180,12190,12200,12210,12220,12230,12240,12250,12260,12270,12280,12290,12300,12310,12320,12330,12340,12350 52 | 450 PRINT "" 53 | 460 PRINT "GENERATE ANOTHER HOROSCOPE (Y/N)"; 54 | 465 INPUT A$ 55 | 470 IF A$ = "Y" OR A$ = "y" THEN 40 56 | 480 IF A$ = "N" OR A$ = "n" THEN END 57 | 490 GOTO 460 58 | 10000 REM CLEAR SCREEN 59 | 10010 FOR I = 1 TO 24 60 | 10020 PRINT 61 | 10030 NEXT I 62 | 10040 RETURN 63 | 11000 REM CALCULATE SIGN BASED ON BIRTH DATE 64 | 11010 IF M = 1 AND D <= 19 THEN S$ = "CAPRICORN" 65 | 11020 IF M = 1 AND D >= 20 THEN S$ = "AQUARIUS" 66 | 11030 IF M = 2 AND D <= 18 THEN S$ = "AQUARIUS" 67 | 11040 IF M = 2 AND D >= 19 THEN S$ = "PISCES" 68 | 11050 IF M = 3 AND D <= 20 THEN S$ = "PISCES" 69 | 11060 IF M = 3 AND D >= 21 THEN S$ = "ARIES" 70 | 11070 IF M = 4 AND D <= 19 THEN S$ = "ARIES" 71 | 11080 IF M = 4 AND D >= 20 THEN S$ = "TAURUS" 72 | 11090 IF M = 5 AND D <= 20 THEN S$ = "TAURUS" 73 | 11100 IF M = 5 AND D >= 22 THEN S$ = "GEMINI" 74 | 11110 IF M = 6 AND D <= 20 THEN S$ = "GEMINI" 75 | 11120 IF M = 6 AND D >= 21 THEN S$ = "CANCER" 76 | 11130 IF M = 7 AND D <= 22 THEN S$ = "CANCER" 77 | 11140 IF M = 7 AND D >= 21 THEN S$ = "LEO" 78 | 11150 IF M = 8 AND D <= 22 THEN S$ = "LEO" 79 | 11160 IF M = 8 AND D >= 23 THEN S$ = "VIRGO" 80 | 11170 IF M = 9 AND D <= 22 THEN S$ = "VIRGO" 81 | 11180 IF M = 9 AND D >= 23 THEN S$ = "LIBRA" 82 | 11190 IF M = 10 AND D <= 22 THEN S$ = "LIBRA" 83 | 11200 IF M = 10 AND D >= 23 THEN S$ = "SCORPIO" 84 | 11210 IF M = 11 AND D <= 21 THEN S$ = "SCORPIO" 85 | 11220 IF M = 11 AND D >= 22 THEN S$ = "SAGITTARIUS" 86 | 11230 IF M = 12 AND D <= 21 THEN S$ = "SAGITTARIUS" 87 | 11240 IF M = 12 AND D >= 22 THEN S$ = "CAPRICORN" 88 | 11250 RETURN 89 | 12000 REM PRINT ANALYSIS 90 | 12010 PRINT "AT TIMES YOU ARE EXTROVERTED, AFFABLE," : PRINT "SOCIABLE, WHILE AT OTHER TIMES YOU ARE" 91 | 12015 PRINT "INTROVERTED, WARY, RESERVED." : RETURN 92 | 12020 PRINT "AT TIMES YOU HAVE SERIOUS DOUBTS AS TO" : PRINT "WHETHER YOU HAVE MADE THE RIGHT" 93 | 12025 PRINT "DECISION OR DONE THE RIGHT THING." : RETURN 94 | 12030 PRINT "DISCIPLINED AND SELF-CONTROLLED OUTSIDE" : PRINT "YOU TEND TO BE WORRISOME AND INSECURE" 95 | 12035 PRINT "INSIDE." : RETURN 96 | 12040 PRINT "PEOPLE OFTEN TELL YOU THAT YOU REMIND" : PRINT "THEM OF SOMEONE ELSE." : RETURN 97 | 12050 PRINT "SECURITY IS ONE OF YOUR MAJOR GOALS IN" : PRINT "LIFE." : RETURN 98 | 12060 PRINT "SOME OF YOUR ASPIRATIONS TEND TO BE" : PRINT "PRETTY UNREALISTIC." : RETURN 99 | 12070 PRINT "THE BIRTHDAY OF A FRIEND OR RELATIVE" : PRINT "IS APPROACHING." : RETURN 100 | 12080 PRINT "YOU RECENTLY HAD A PROBLEM WITH YOUR" : PRINT "AUTOMOBILE OR THAT OF A FAMILY MEMBER." : RETURN 101 | 12090 PRINT "WHILE YOU HAVE SOME PERSONALITY" : PRINT "WEAKNESSES, YOU ARE GENERALLY ABLE TO" 102 | 12095 PRINT "COMPENSATE FOR THEM." : RETURN 103 | 12100 PRINT "YOU ARE SOMETIMES INSECURE, ESPECIALLY" : PRINT "WITH PEOPLE YOU DON'T KNOW VERY WELL." : RETURN 104 | 12110 PRINT "YOU ARE SOMETIMES UNCOMFORTABLE IN" : PRINT "FRONT OF LARGE GROUPS OF PEOPLE." : RETURN 105 | 12120 PRINT "YOU DON'T ALWAYS LISTEN TO YOUR" : PRINT "SIGNIFICANT OTHER AS MUCH AS YOU SHOULD." : RETURN 106 | 12130 PRINT "YOU DON'T ALWAYS STOP TO ENJOY THE" : PRINT "SIMPLE THINGS IN LIFE." : RETURN 107 | 12140 PRINT "YOU DON'T ALWAYS TAKE AS MUCH CARE OF" : PRINT "YOURSELF AS YOU SHOULD." : RETURN 108 | 12150 PRINT "YOU DON'T LIKE TIDYING UP." : RETURN 109 | 12160 PRINT "YOU DON'T LOVE YOURSELF ENOUGH." : RETURN 110 | 12170 PRINT "YOU HAD AN ACCIDENT WHEN YOU WERE A" : PRINT "CHILD INVOLVING WATER." : RETURN 111 | 12180 PRINT "YOU HAVE A BOX OF OLD UNSORTED" : PRINT "PHOTOGRAPHS IN YOUR HOUSE." : RETURN 112 | 12190 PRINT "YOU HAVE A GREAT DEAL OF UNUSED" : PRINT "CAPACITY WHICH YOU HAVE NOT TURNED" 113 | 12195 PRINT "TO YOUR ADVANTAGE." : RETURN 114 | 12200 PRINT "YOU HAVE A GREAT NEED FOR OTHER PEOPLE" : PRINT "TO LIKE AND ADMIRE YOU." : RETURN 115 | 12210 PRINT "YOU HAVE A TENDENCY TO BE CRITICAL OF" : PRINT "YOURSELF." : RETURN 116 | 12220 PRINT "YOU HAVE FOUND IT UNWISE TO BE TOO" : PRINT "FRANK IN REVEALING YOURSELF TO OTHERS." : RETURN 117 | 12230 PRINT "YOU ONCE SAID SOMETHING MEAN TO A" : PRINT "PERSON THAT YOU LATER REGRETTED" : PRINT "SAYING." : RETURN 118 | 12240 PRINT "YOU PREFER A CERTAIN AMOUNT OF CHANGE" : PRINT "AND VARIETY AND BECOME DISSATISFIED" 119 | 12245 PRINT "WHEN HEMMED IN BY RESTRICTIONS AND" : PRINT "LIMITATIONS." : RETURN 120 | 12250 PRINT "YOU PRIDE YOURSELF AS AN INDEPENDENT" : PRINT "THINKER AND DO NOT ACCEPT OTHERS'" 121 | 12255 PRINT "STATEMENTS WITHOUT SATISFACTORY PROOF." : RETURN 122 | 12260 PRINT "YOU RECENTLY HAD AN UNEXPECTED EXPENSE" : PRINT "YOU NEEDED TO PAY." : RETURN 123 | 12270 PRINT "YOU SOMETIMES ASK OTHERS FOR ADVICE" : PRINT "WHEN YOU KNOW IN YOUR HEART WHAT THE" 124 | 12275 PRINT "CORRECT COURSE OF ACTION IS." : RETURN 125 | 12280 PRINT "YOU SOMETIMES TEND TO GOSSIP TOO MUCH." : RETURN 126 | 12290 PRINT "YOU WISH THAT YOUR FINANCES WERE MORE" : PRINT "SECURE." : RETURN 127 | 12300 PRINT "YOU WORK HARDER THAN MOST PEOPLE BUT" : PRINT "DON'T OFTEN GET THE RECOGNITION YOU" 128 | 12305 PRINT "FEEL YOU DESERVE." : RETURN 129 | 12310 PRINT "YOU WORRY ABOUT YOUR HEALTH AS YOU GET" : PRINT "OLDER." : RETURN 130 | 12320 PRINT "YOU'RE HAVING PROBLEMS WITH A FRIEND" : PRINT "OR RELATIVE." : RETURN 131 | 12330 PRINT "YOUR SEXUAL ADJUSTMENT HAS PRESENTED" : PRINT "PROBLEMS FOR YOU." : RETURN 132 | 12340 PRINT "YOUR WORK IS SOMETIMES BORING WHILE" : PRINT "AT OTHER TIMES YOU FIND IT VERY" : PRINT "CHALLENGING." : RETURN 133 | 12350 PRINT "YOU ARE CONCERNED ABOUT THE HEALTH OF" : PRINT "AN AGING RELATIVE." : RETURN 134 | 13000 END 135 | RUN 136 | -------------------------------------------------------------------------------- /sbc/exbasrom/Makefile: -------------------------------------------------------------------------------- 1 | all: ExBasROM.s19 ExBasROM.hex 2 | 3 | ExBasROM.s19: ExBasROM.asm 4 | as9 ExBasROM.asm -now l s19 5 | 6 | ExBasROM.hex: ExBasROM.asm 7 | srec_cat ExBasROM.s19 -Motorola -crop 0xc000 0x10000 -output ExBasROM.hex -Intel 8 | 9 | clean: 10 | $(RM) *.lst *.s19 *.hex 11 | -------------------------------------------------------------------------------- /sbc/exbasrom/README.md: -------------------------------------------------------------------------------- 1 | This is a port of Microsoft Extended BASIC, as used in the Tandy 2 | Color Computer 2, modified for the SBC with all I/O via serial. 3 | 4 | See http://searle.x10host.com/6809/Simple6809.html 5 | 6 | It can be cross-assembled using the AS9 assembler found at 7 | http://home.hccnet.nl/a.w.m.van.der.horst/m6809.html 8 | 9 | Here are notes on some quirks of this variant of BASIC where it 10 | differs from some other versions of Microsoft BASIC. This may help in 11 | porting programs such as games: 12 | 13 | General: All keywords and variables must be entered in upper case, 14 | although you can use lower case in strings. 15 | 16 | RND() function: 17 | 18 | RND(0) returns a random floating point number between 0 and 1. RND(n), 19 | where n is greater than 0, returns an integer between 0 and n. Most 20 | BASICs return a value between 0 and 1 for any argument value (1 seems 21 | to be commonly used in many programs). 22 | 23 | FRE() function: 24 | 25 | This is not present, but you can use the pseudo-variable MEM instead 26 | to report the amount of free memory. 27 | 28 | INPUT command: 29 | 30 | The command does not allow you to specify a prompt string to be 31 | displayed, as many other versions of BASIC do. You can work around 32 | this by using a PRINT statement to display the prompt before calling 33 | INPUT. 34 | -------------------------------------------------------------------------------- /sbc/gerber.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/gerber.zip -------------------------------------------------------------------------------- /sbc/mc6839/Makefile: -------------------------------------------------------------------------------- 1 | quad.run: quad.asm 2 | lwasm --6809 --format=srec --list=quad.lst --output=quad.run quad.asm 3 | 4 | clean: 5 | $(RM) quad.lst quad.run 6 | 7 | upload1: bin/float09.s19 8 | ascii-xfr -s bin/float09.s19 -l 1 -c 1 >/dev/ttyUSB0 9 | 10 | upload2: quad.run 11 | ascii-xfr -s quad.run -l 1 -c 1 >/dev/ttyUSB0 12 | 13 | distclean: clean 14 | -------------------------------------------------------------------------------- /sbc/mc6839/README.md: -------------------------------------------------------------------------------- 1 | This is the source, documentation, and example for the Motorola MC6839 2 | Floating Point ROM. 3 | 4 | The source does not quite match the binary (the former has a 1980 5 | copyright date and the latter 1982). I am not able to built it from 6 | source because it requires some Motorola "structured assembler" that I 7 | have not been able to find any references to. It could be ported to an 8 | existing assembler (e.g. asm6809), but since the source is older than 9 | the binaries, I have not attempted to do this. 10 | 11 | See: 12 | http://github.com/brouhaha/fp09 13 | http://www.colorcomputerarchive.com/updates/2017 14 | http://www.classiccmp.org/pipermail/cctalk/2017-March/033678.html 15 | http://www.classiccmp.org/pipermail/cctech/2016-June/019519.html 16 | http://www.colorcomputerarchive.com/coco/Documents/Manuals/Hardware/MC6839%20Floating-point%20ROM%20Manual.pdf 17 | -------------------------------------------------------------------------------- /sbc/mc6839/bin/Float09.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/mc6839/bin/Float09.bin -------------------------------------------------------------------------------- /sbc/mc6839/docs/MC6839 Floating-point ROM Datasheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/mc6839/docs/MC6839 Floating-point ROM Datasheet.pdf -------------------------------------------------------------------------------- /sbc/mc6839/docs/MC6839 Floating-point ROM Manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/mc6839/docs/MC6839 Floating-point ROM Manual.pdf -------------------------------------------------------------------------------- /sbc/mc6839/quad.asm: -------------------------------------------------------------------------------- 1 | * From Appendix A of "Motorola MC6839 Floating Point ROM" manual. 2 | * 3 | * This appendix provides an application example using the MC6839 4 | * Floating Point ROM. The program shown is one that finds the roots to 5 | * quadratic equations of the form ax^2 + bx +c = 0 using the classic 6 | * formula: 7 | * 8 | * -b +/- sqrt(b^2 - 4ac) 9 | * ---------------------- 10 | * 2a 11 | * 12 | * Note that the program uses a standard set of macro instructions to set 13 | * up the parameters in the correct calling seuences. Perhaps the easiest 14 | * way to program the MC6839 Floating Point ROM is through the use of 15 | * these macro instructions. Errors are reduced because, once the macro 16 | * instructions are shown to be correct, their internal details can be 17 | * ignored allowing the programmer to concentrate on only the problem at 18 | * hand. 19 | * 20 | * This code example solves the specific case solving x^2 + 2x - 3 = 0 21 | * In this case, a = 1 b = 2 c = -3 and the roots are x = 1 and x = -3. 22 | * 23 | * In 26 byte BCD representation, a, b, and c are: 24 | * 25 | * a = 1: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 26 | * b = 2: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 27 | * c = -3: 00 00 00 00 00 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 28 | * 29 | * The results should be returned stored in a and b as: 30 | * 31 | * a = +1.0000 (first 0F indicates real root) 32 | * 0F 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 33 | * b = - 3.0000 (first 0F indicates real root) 34 | * 0F 00 00 00 04 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 00 00 35 | * 36 | * Second example: 37 | * 2x^2 + 3x - 4 = 0 a = 2 b = 3 c = -4 38 | * Solutions are 0.85078 and -2.3508 39 | * 0F 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 05 00 07 08 00 40 | * 0F 00 00 00 04 0F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 03 05 00 08 00 41 | * 42 | NAM QUAD 43 | * 44 | ORG $1000 45 | * 46 | * HERE IS A SIMPLE EXAMPLE INVOLVING THE QUADRATIC EQUATION THAT 47 | * SHOULD SERVE TO ILLUSTRATE THE USE OF THE MC6839 IN AN ACTUAL 48 | * APPLICATION. 49 | * 50 | * MC6839 ROM DEFINITIONS - ASSUMES ROM IS AT ADDRESS $2000 51 | * 52 | FPREG EQU $203D 53 | FPSTAK EQU $203F 54 | * 55 | * RMBS FOR THE OPERANDS, BINARY TO DECIMAL CONVERSION BUFFERS, 56 | * AND THE FPCB. 57 | * 58 | *ACOEFF RMB 26 COEFFICIENT A IN AX^2 +BX +C 59 | *BCOEFF RMB 26 COEFFICIENT B 60 | *CCOEFF RMB 26 COEFFICIENT C 61 | 62 | * Example using 1, 2, -3 63 | ACOEFF FCB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$00 BCD 1 64 | BCOEFF FCB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$02,$00 BCD 2 65 | CCOEFF FCB $00,$00,$00,$00,$00,$0F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$00 BCD -3 66 | 67 | * Example using 2, 3, -4 68 | *ACOEFF FCB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$02,$00 BCD 2 69 | *BCOEFF FCB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$00 BCD 3 70 | *CCOEFF FCB $00,$00,$00,$00,$00,$0F,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$04,$00 BCD -4 71 | 72 | * 73 | REG1 RMB 4 REGISTER 1 74 | REG2 RMB 4 REGISTER 2 75 | REG3 RMB 4 REGISTER 3 76 | * 77 | FPCB RMB 4 FLOATING POINT CONTROL BLOCK 78 | * 79 | TWO FCB $40,00,00,00 FLOATING PT. CONSTANT TWO 80 | FOUR FCB $40,$80,00,00 " " " FOUR 81 | 82 | * 83 | * 84 | * HERE ARE THE EQUATES AND MACRO DEFINITIONS TO ACCOMPANY THE 85 | * QUADRATIC EQUATION EXAMPLE OF AN MC6839 APPLICATION. 86 | * 87 | ADD EQU $00 OPCODE VALUES 88 | SUB EQU $02 89 | MUL EQU $04 90 | DIV EQU $06 91 | REM EQU $08 92 | SQRT EQU $12 93 | FINT EQU $14 94 | FIXS EQU $16 95 | FIXD EQU $18 96 | BNDC EQU $1C 97 | ABS EQU $1E 98 | NEG EQU $20 99 | DCBN EQU $22 100 | FLTS EQU $24 101 | FLTD EQU $26 102 | CMP EQU $8A 103 | PCMP EQU $8E 104 | MOV EQU $9A 105 | TCMP EQU $CC 106 | TPCMP EQU $D0 107 | * 108 | * 109 | * MACRO DEFINITIONS 110 | * 111 | * HERE ARE THE CALLING SEQUENCE MACROS 112 | * 113 | MCALL MACRO 114 | * 115 | * MCALL SETS UP A MONADIC REGISTER CALL. 116 | * 117 | * USAGE: MCALL ,, 118 | * 119 | LEAY \1,PCR POINTER TO THE INPUT ARGUMENT 120 | LEAX FPCB,PCR POINTER TO THE FLOATING POINT CONTROL BLOCK 121 | TFR X,D 122 | LEAX \3,PCR POINTER TO THE RESULT 123 | LBSR FPREG CALL TO THE MC6839 124 | FCB \2 OPCODE 125 | * 126 | ENDM 127 | * 128 | * 129 | DCALL MACRO 130 | * 131 | * DCALL SETS UP A DYADIC REGISTER CALL 132 | * 133 | * USAGE: DCALL ,,, 134 | * 135 | LEAU \1,PCR POINTER TO ARGUMENT #1 136 | LEAY \3,PCR POINTER TO ARGUMENT #1 137 | LEAX FPCB,PCR POINTER TO THE FLOATING POINT CONTROL BLOCK 138 | TFR X,D 139 | LEAX \4,PCR POINTER TO THE RESULT 140 | LBSR FPREG CALL TO THE MC6839 141 | FCB \2 OPCODE 142 | * 143 | ENDM 144 | * 145 | * 146 | DECBIN MACRO 147 | * 148 | * DECBIN SETS UP A REGISTER CALL TO THE DECIMAL TO BINARY CONVERSION FUNCTION. 149 | * 150 | * USAGE: DECBIN , 151 | * 152 | LEAU \1,PCR POINTER TO THE BCD INPUT STRING 153 | LEAX FPCB,PCR POINTER TO THE FLOATING POINT CONTROL BLOCK 154 | TFR X,D 155 | LEAX \2,PCR POINTER TO THE RESULT 156 | LBSR FPREG CALL TO THE MC6839 157 | FCB DCBN OPCODE 158 | * 159 | ENDM 160 | * 161 | * 162 | BINDEC MACRO 163 | * 164 | * BINDEC SETS UP A REGISTER CALL TO THE BINARY TO DECIMAL CONVERSION FUNCTION. 165 | * 166 | * USAGE: BINDEC ,,<# OF SIGNIFICANT DIGITS RESULT> 167 | * 168 | LDU \3 # OF SIGNIFICANT DIGITS IN THE RESULT 169 | LEAY \1,PCR POINTER TO THE BINARY INPUT 170 | LEAX FPCB,PCR POINTER TO THE FLOATING POINT CONTROL BLOCK 171 | TFR X,D 172 | LEAX \2,PCR POINTER TO THE BCD RESULT 173 | LBSR FPREG CALL TO THE MC6839 174 | FCB BNDC OPCODE 175 | * 176 | ENDM 177 | * 178 | * 179 | QUAD EQU * 180 | * 181 | LDX #$6F00 INITIALIZE THE STACK POINTER 182 | * 183 | LEAX FPCB,PCR 184 | LDB #4 185 | WHILE1 CMPB #0 186 | BLE ENDWH1 INITIALIZE STACK FRAME TO 187 | DECB SINGLE, ROUND NEAREST. 188 | CLR B,X 189 | BRA WHILE1 190 | ENDWH1 191 | * 192 | * CONVERT THE INPUT OPERANDS FROM BCD STRINGS TO THE INTERNAL 193 | * SINGLE BINARY FORM. 194 | * 195 | DECBIN ACOEFF,ACOEFF 196 | DECBIN BCOEFF,BCOEFF 197 | DECBIN CCOEFF,CCOEFF 198 | * 199 | * NOW START THE ACTUAL CALCULATIONS FOR THE QUADRATIC EQUATION 200 | * 201 | DCALL BCOEFF,MUL,BCOEFF,REG1 CALCULATE B^2 202 | DCALL ACOEFF,MUL,CCOEFF,REG2 CALCULATE AC 203 | DCALL REG2,MUL,FOUR,REG2 CALCULATE 4AC 204 | DCALL REG1,SUB,REG2,REG1 CALCULATE B^2 - 4AC 205 | * 206 | * CHECK RESULT OF B^2 - 4AC TO SEE IF ROOTS ARE REAL OR IMAGINARY 207 | * 208 | LDA REG1,PCR 209 | LBLT ELSE1 SIGN IS POSITIVE; ROOTS REAL 210 | MCALL REG1,SQRT,REG1 CALCULATE SQRT(B^2 - 4AC) 211 | DCALL ACOEFF,MUL,TWO,REG2 CALCULATE 2A 212 | MCALL BCOEFF,NEG,BCOEFF NEGATE B 213 | * 214 | DCALL BCOEFF,ADD,REG1,REG3 CALCULATE -B + SQRT(B^2 - 4AC) 215 | DCALL REG3,DIV,REG2,REG3 CALCULATE (-N + SQRT(B^2 - 4AC))/2A 216 | BINDEC REG3,ACOEFF,#5 CONVERT RESULT TO DECIMAL 217 | * 218 | DCALL BCOEFF,SUB,REG1,REG3 CALCULATE -B - SQRT(B^2 -4AC) 219 | DCALL REG3,DIV,REG2,REG3 CALCULATE (-B + SQRT(B^2 - 4AC))/2A 220 | BINDEC REG3,BCOEFF,#5 CONVERT RESULT TO DECIMAL 221 | * 222 | LDA #$FF SENTINEL SIGNALING THAT ROOTS ARE REAL 223 | STA CCOEFF,PCR 224 | LBRA ENDIF1 225 | * 226 | * SIGN IS NEGATIVE; ROOTS IMAGINARY 227 | ELSE1 MCALL REG1,ABS,REG1 MAKE SIGN POSITIVE 228 | MCALL REG1,SQRT,REG1 CALCULATE SQRT(B^2 - 4AC) 229 | DCALL ACOEFF,MUL,TWO,REG2 CALCULATE 2A 230 | DCALL REG1,DIV,REG2,REG1 CALCULATE (SQRT(B^2 - 4AC))/2A 231 | * 232 | DCALL BCOEFF,DIV,REG2,REG2 CALCULATE -B/2A 233 | MCALL REG2,NEG,REG2 234 | * 235 | BINDEC REG1,BCOEFF,#5 CONVERT -B/2A TO DECIMAL 236 | BINDEC REG2,ACOEFF,#5 CONVERT (SQRT(B^2 - 4AC))/2A 237 | * 238 | CLR CCOEFF,PCR SENTINEL SIGNALLING IMAGINARY ROOTS 239 | * 240 | ENDIF1 241 | NOP CAN SET A BREAKPOINT HERE FOR TESTING 242 | NOP 243 | RTS 244 | -------------------------------------------------------------------------------- /sbc/mc6839/quad.run: -------------------------------------------------------------------------------- 1 | S01A00005B6C77746F6F6C7320342E31365D20717561642E61736DF6 2 | S113100000000000000000000000000000000000DC 3 | S113101000000000000000000100000000000000CB 4 | S113102000000000000000000000000000000000BC 5 | S11310300000020000000000000F0000000000009B 6 | S111104000000000000000000000000003009B 7 | S105105E40004C 8 | S11310600000408000008E6F00308CEEC604C1008A 9 | S11310702F055A6F8520F7338C86308CDD1F103096 10 | S11310808DFF7D170FB722338C90308CCD1F10301D 11 | S11310908C88170FA822338C9B308CBE1F10308C89 12 | S11310A093170F9922338DFF71318DFF6D308CAA08 13 | S11310B01F10308C99170F8504338DFF43318DFF3A 14 | S11310C073308C961F10308C89170F7104338C8207 15 | S11310D0318C8F308C841F10308DFF76170F5E0497 16 | S11310E0338DFF6A318DFF6A308DFF6E1F10308D96 17 | S11310F0FF5C170F4802A68DFF54102D00C5318DDB 18 | S1131100FF4C308DFF541F10308DFF42170F2E12ED 19 | S1131110338DFEEC318DFF46308DFF3E1F10308D38 20 | S1131120FF30170F1804318DFEF0308DFF2C1F1087 21 | S1131130308DFEE6170F0620338DFEDE318DFF0E57 22 | S1131140308DFF161F10308DFF0C170EF000338DFD 23 | S1131150FF04318DFEFC308DFF001F10308DFEF634 24 | S1131160170EDA06CE0005318DFEEB308DFEEB1F37 25 | S113117010308DFE8B170EC51C338DFE9D318DFEF8 26 | S1131180CD308DFED51F10308DFECB170EAF023340 27 | S11311908DFEC3318DFEBB308DFEBF1F10308DFE22 28 | S11311A0B5170E9906CE0005318DFEAA308DFEAA24 29 | S11311B01F10308DFE64170E841C86FFA78DFE74ED 30 | S11311C01600A6318DFE87308DFE8F1F10308DFEE8 31 | S11311D07D170E691E318DFE75308DFE7D1F10301A 32 | S11311E08DFE6B170E5712338DFE15318DFE6F3049 33 | S11311F08DFE671F10308DFE59170E4104338DFE8E 34 | S11312004D318DFE4D308DFE511F10308DFE3F1738 35 | S11312100E2B06338DFE03318DFE37308DFE3B1FC2 36 | S113122010308DFE2D170E1506318DFE25308DFEE6 37 | S1131230291F10308DFE1B170E0320CE0005318DA3 38 | S1131240FE0C308DFE141F10308DFDCE170DEE1CDC 39 | S1131250CE0005318DFDFB308DFDFF1F10308DFD5F 40 | S10F12609F170DD91C6F8DFDCB121239A5 41 | S5030027D5 42 | S9030000FC 43 | -------------------------------------------------------------------------------- /sbc/mc6839/src/CHECK.SA: -------------------------------------------------------------------------------- 1 | * 2 | NAM CHECK 3 | TTL ROUTINES TO CHECK SPECIAL CASES AND INVALID OPS. 4 | * 5 | * LINKING LOADER DEFINTIONS 6 | * 7 | XDEF CKINVD,CHKZER,CHKINF,DIVZER 8 | * 9 | XREF RTAR1,IOPSUB,RTINF,ISDNRM 10 | * 11 | * REVISION HISTORY: 12 | * DATE PROGRAMMER REASON 13 | * 14 | * 23.MAY.80 G. STEVENS ORIGINAL 15 | * 28.MAY.80 G. STEVENS REWRITE CKINVD 16 | * 03.JUNE.80 G. STEVENS MAKE CKINVD HANDLE NAN,ZEROS 17 | * AND INFINITIES CORRECTLY 18 | * 21.AUG.80 G. STEVENS REMOVE IOP 17 FROM DIVZER 19 | * 20 | PAGE 21 | * 22 | * HERE ARE SOME OF THE COMPONENT ROUTINES 23 | * FOR THE FP09. THEY INCLUDE CHKZER, CHECK 24 | * ZERO AGAINST THE ROUNDING MODES; CHECK 25 | * CHECK INFINITY AGAINST A/P MODES OF 26 | * CLOSURE; DIVZER, HANDLES DIVISION BY ZERO; 27 | * RTNAN, BUILD UP A "NAN" WITH PROPER 28 | * NAN ADDRES INSERTED. 29 | * 30 | *************************************************************** 31 | * 32 | * PROCEDURE CHKZER 33 | * 34 | * THIS ROUTINE CHECKS ZERO AGAINST ROUNDING 35 | * MODES IN A FLP ADDITION WHEN BOTH OPERANDS 36 | * ARE ZERO IN ORDER TO RETURN A ZERO RESULT 37 | * OF THE CORRECT SIGN. IF SIGNS ARE THE SAME 38 | * A ZERO OF THAT SIGN IS RETURNED. IF THE 39 | * SIGN ARE OPPOSITE THEN +0 IS RETURNED 40 | * IN ROUDING MODES RN,RZ,RP AND -O IS 41 | * RETURNED IN ROUNDING MODE RM. 42 | * 43 | * RETURN A ZERO TO RESULT 44 | * 45 | CHKZER LBSR RTAR1 46 | * 47 | * NOW CHECK TO SEE IF THE SIGN NEEDS 48 | * MODIFYING. 49 | * 50 | LDA ARG1,U 51 | EORA ARG2,U 52 | * 53 | * IF THE SIGNS ARE NOT EQUAL, CHECK THE ROUNDING 54 | * MODE TO DETERMINE THE PROPER SIGN. 55 | * 56 | IFCC LT 57 | LDA [PFPCB,U] 58 | ANDA #CTLRND GET ROUNDING MODE INFO. 59 | IF A,GE,#BIT1+BIT2 RM MODE 60 | LDA #BIT7 61 | STA RESULT,U RETURN -0 62 | * 63 | ELSE 64 | CLR RESULT,U RETURN +0 65 | ENDIF 66 | ENDIF 67 | * 68 | RTS RETURN 69 | * 70 | PAG 71 | ******************************************************************* 72 | * 73 | * PROCEDURE CHKINF 74 | * 75 | * THIS ROUTINE CHECKS INFINITY AGAINST 76 | * CLOSURE MODES IN A FLP ADDITION WHEN 77 | * BOTH OPERANDS ARE INFINITY TO DETERMINE 78 | * WHETHER TO RETURN INFINITY OR A NAN 79 | * WITH PROPER INVALID OPERATION CODE 80 | * 81 | * 82 | * CHECK FOR A/P MODES 83 | * 84 | CHKINF LDA [PFPCB,U] 85 | ANDA #BIT0 86 | IFCC GT AFFINE MODE 87 | LDA ARG1,U 88 | EORA ARG2,U 89 | * 90 | * IF SIGNS THE SAME RETURN INFINITY 91 | * OF THAT SIGN. 92 | * 93 | IFCC GE 94 | LBSR RTAR1 95 | * 96 | * IF SIGNS DIFFER RETURN "NAN" AND 97 | * SET IOP = 2 98 | * 99 | ELSE 100 | IOP 2 (+INF)+(-INF); AFFINE MODE 101 | ENDIF 102 | * 103 | * ELSE IN THE PROTECTIVE MODE RETURN NAN 104 | * AND SET IOP = 8 105 | * 106 | ELSE 107 | IOP 8 +/- INF; PROTECTIVE MODE 108 | ENDIF 109 | * 110 | RTS RETURN 111 | * 112 | PAG 113 | *************************************************************** 114 | * 115 | * PROCEDURE DIVZER 116 | * 117 | * THIS ROUTINE HANDLES THE CASE OF DIVISION 118 | * BY ZERO. 119 | * 120 | * ON ENTRY: ARG2 CONTAINS A TRUE ZERO 121 | * U - STACK FRAME POINTER 122 | * 123 | * ON EXIT: RESULT CONTAINS AN INFINITY W/ 124 | * SIGN OF THE INPUT ARGUMENT. 125 | * U, S - UNCHANGED 126 | * X,Y,D,CC - DESTROYED 127 | * 128 | * OPERATION: THE DIVISION BY ZERO FLAG IN TSTAT IS SET 129 | * AND AN INFINITY OF THE SIGN OF THE INPUT ARGUMENT IS 130 | * RETURNED IN THE STACK FRAME RESULT. 131 | * 132 | * 133 | * CHECK DIVISION BY ZERO TRAP ENABLE 134 | * 135 | DIVZER EQU * 136 | * 137 | BSETA BIT3,(TSTAT,U) 138 | LBSR RTINF 139 | * 140 | RTS RETURN 141 | * 142 | PAG 143 | ****************************************************************** 144 | * 145 | * PROCEDURE CKINVD 146 | * 147 | * CKINVD CHECKS FOR AN INVALID RESULT OF AN ARITHMETIC 148 | * OPERATION. IF THE RESULTIS UNORMALIZED AND THE DESTINATION 149 | * IS SINGLE OR DOUBLE THEN SIGNAL IOP. = 16 AND RETURN A 150 | * NON TRAPPING NAN. 151 | * 152 | * 153 | CKINVD EQU * 154 | * 155 | * CHECK FOR ZERO OR NAN OR INFINITY 156 | * 157 | LDD EXPR,U 158 | IF D,NE,#INFEX 159 | IF D,NE,#ZEROEX 160 | * 161 | * CHECK THE PRECISION OF THE RESULT 162 | * 163 | LDA RPREC,U 164 | IF A,LE,#DBL SINGLE OR DOUBLE 165 | LBSR ISDNRM CHECK FOR DENORMALZED 166 | IFCC EQ RESULT IS DENORMALIZD 167 | LDD EXPR,U SUBTRACT BIAS FROM EXPONENT 168 | SUBD #01 169 | STD EXPR,U 170 | * 171 | ELSE 172 | LDA FRACTR,U 173 | IFCC GE NOT NORMALIZED 174 | IOP 16 SIGNAL INVALID OPERATION 175 | * 176 | ENDIF NOT NORMALIZED 177 | * 178 | ENDIF IS DENORMALIZED 179 | * 180 | ENDIF SINGLE OR DOUBLE 181 | * 182 | ENDIF NOT A ZERO 183 | * 184 | ENDIF NOT A NAN OR INFINITY 185 | * 186 | * 187 | RTS RETURN 188 | * 189 | * 190 | -------------------------------------------------------------------------------- /sbc/mc6839/src/DISPAT.SA: -------------------------------------------------------------------------------- 1 | NAM DISPCH 2 | TTL DISPATCH OPERATION THROUGH THE FUNCTION TABLES 3 | * 4 | * LINKING LOADER DEFINITONS 5 | * 6 | XDEF DISPAT 7 | * 8 | XREF FMUL 9 | XREF FADD,CHKZER,CHKINF 10 | XREF FDIV,DIVZER 11 | XREF FREM 12 | XREF FSQRT,SQINCK 13 | XREF GETINT 14 | XREF MAGCMP,CMPZER,CMPINF,NANCMP,INFAR1 15 | XREF INFAR2,ARG1UN,ARG2UN,BOTHUN 16 | XREF FFIX,BIGINT,FIXNAN,FIXZER 17 | XREF BDCNVT,OUTNDC 18 | XREF FMOVE,MOVUN 19 | XREF FABS,FNEG 20 | XREF RTAR1,RTAR2,RTNAN,RTINF,RTDNAN 21 | XREF RTZERO,NAN1,NAN4,NAN9,NAN10 22 | XREF ROMSTR 23 | XREF DECBIN,FLOAT 24 | * 25 | * REVISION HISTORY: 26 | * 27 | * DATE PROGRAMMER REASON 28 | * 29 | * 01.JUL.80 G. STEVENS ORIGINAL 30 | * 28.JUL.80 G. STEVENS TRANSPOSE TABLES 31 | * 18.AUG.80 G. STEVENS FIX COMPARE TABLES FOR UN ZERO 32 | * 33 | PAGE 34 | *************************************************** 35 | * 36 | * DISPAT -- 37 | * THIS SUBROUTINE USES THE FUNCTION CODE TO 38 | * SELECTION A FUNCTION TABLE. IT THEN USES THE TYPES 39 | * OF THE ARGUMENTS TO JUMP THROUGH THE ADDRESSES IN 40 | * THE FUNCTION TABLE TO THE PROPER SUBROUTINE TO 41 | * PERFORM THE FUNCTION. 42 | * 43 | * NO REGISTERS ARE PRESERVED; ALL RELEVANT STATE 44 | * IS STORED IN THE STACK FRAME. 45 | * 46 | ************************ 47 | * 48 | * ADRTBL -- 49 | * THIS MACRO CREATES A TABLE OF ADDRESSES RELATIVE TO 50 | * THE START OF THE ROM. IT CAN BE CALLED WITH FROM ONE TO 51 | * FIVE ARGUMENTS, WHICH ARE THE ENTRY POINTS TO TABLES 52 | * OR ROUTINES IN THE ROM. 53 | * 54 | ADRTBL MACR 55 | IFEQ NARG-5 56 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR,\3-ROMSTR,\4-ROMSTR 57 | EXIT 58 | ENDC 59 | IFEQ NARG-4 60 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR,\3-ROMSTR 61 | EXIT 62 | ENDC 63 | IFEQ NARG-3 64 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR 65 | EXIT 66 | ENDC 67 | IFEQ NARG-2 68 | FDB \0-ROMSTR,\1-ROMSTR 69 | EXIT 70 | ENDC 71 | IFEQ NARG-1 72 | FDB \0-ROMSTR 73 | EXIT 74 | ENDC 75 | ENDM 76 | * 77 | * THE FOLLOWING TABLE IS INDEXED BY THE (FUNCTION NUMBER-1) 78 | * AND CONTAINS THE ADDRESSES OF THE FUNCTION TABLES FOR 79 | * EACH FLOATING-POINT OPERATION. 80 | * 81 | FUNTBL EQU * 82 | ADRTBL ADDTBL,SUBTBL,MULTBL,DIVTBL,REMTBL 83 | ADRTBL CMPTBL,CMPTBL,CMPTBL,CMPTBL,SQRTBL 84 | ADRTBL INTTBL,FIXTBL,FIXTBL,MOVTBL,BNDTBL 85 | ADRTBL ABSTBL,NEGTBL 86 | ADRTBL DECBIN,FLOAT,FLOAT 87 | PAGE 88 | * 89 | * 90 | * ENTER HERE ON DISPAT CALL 91 | * 92 | * FIRST GET THE ADDRESS OF THE TABLE FOR A PARTICULAR 93 | * FLOATING-POINT COMMAND. 94 | * 95 | DISPAT EQU * 96 | LDB FUNCT,U GET FUNCTION CODE 97 | ANDB #$3F MASK OUT OPCODE NBR 98 | IF B,EQ,#FCSUB 99 | LDA TYPE2,U CHECK FOR A NAN 100 | IF A,NE,#TYNAN IF ARG2 IS NOT A NAN 101 | LDA ARG2,U 102 | EORA #$80 FOR SUBTRACT, CHANGE SIGN 103 | STA ARG2,U AND ADD 104 | ENDIF ARG2 NOT A NAN 105 | ENDIF 106 | LEAY FUNTBL,PCR 107 | CMPB #FCNOJP UNLESS OPERATOR HAS NO 108 | BGE DSJMP TABLE 109 | LDD B,Y OFFSET OF FUNCTION LOOKUP 110 | LEAY ROMSTR,PCR 111 | LEAY D,Y ADDR IS NOW IN Y 112 | * 113 | * NOW CREATE OFFSET IN OPERATION 114 | * TABLE USING TYPES OF OPERANDS. IT IS 115 | * ASSUMED THAT A NON-EXISTENT ARGUMENT 116 | * HAS A TYPE OF ZERO. 117 | * 118 | LDA TYPE1,U 119 | LDB #5 120 | MUL 121 | ADDB TYPE2,U OFFSET = TYP1*5 + TYP2 122 | * 123 | * NOW GET PROCESSING ROUTINE OUT 124 | * OF OPERATION TABLE AND JSR TO IT. 125 | * 126 | DSJMP LDD B,Y 127 | LEAY ROMSTR,PCR 128 | JSR D,Y JUMP TO PROCESSING SUBROUTINE 129 | * 130 | * HERE IS COMMON RETURN POINT FOR ALL 131 | * PROCESSING ROUTINES. 132 | * 133 | RTS 134 | * 135 | PAGE 136 | * 137 | ******************************************* 138 | * 139 | * OPERATION DEFINITION TABLES 140 | * 141 | * THE FOLLOWING TABLES CONTAIN ADDRESS 142 | * OF THE SUBROUTINES THAT OPERATE ON 143 | * ARGUMENTS OF VARIOUS TYPES. THE TABLES 144 | * ARE ORGANIZED BY COLUMNS, I.E. EACH 145 | * 'ADRTBL' LINE IN A TABLE BELOW CORRESPONDS 146 | * TO A ROW IN THE TABLE IN THE MOTOROLA SPEC. 147 | * 148 | MULTBL EQU * 149 | ADRTBL FMUL,RTZERO,RTINF,RTAR2,FMUL 150 | ADRTBL RTZERO,RTZERO,NAN9,RTAR2,RTZERO 151 | ADRTBL RTINF,NAN9,RTINF,RTAR2,RTINF 152 | ADRTBL RTAR1,RTAR1,RTAR1,RTDNAN,RTAR1 153 | ADRTBL FMUL,RTZERO,RTINF,RTAR2,FMUL 154 | * 155 | * TABLE FOR ADD/SUBTRACT 156 | * 157 | ADDTBL EQU * 158 | SUBTBL EQU * 159 | ADRTBL FADD,FADD,RTAR2,RTAR2,FADD 160 | ADRTBL FADD,CHKZER,RTAR2,RTAR2,RTAR2 161 | ADRTBL RTAR1,RTAR1,CHKINF,RTAR2,RTAR1 162 | ADRTBL RTAR1,RTAR1,RTAR1,RTDNAN,RTAR1 163 | ADRTBL FADD,RTAR1,RTAR2,RTAR2,FADD 164 | * 165 | * TABLE FOR DIVISION 166 | * 167 | DIVTBL EQU * 168 | ADRTBL FDIV,DIVZER,RTZERO,RTAR2,NAN4 169 | ADRTBL RTZERO,NAN4,RTZERO,RTAR2,RTZERO 170 | ADRTBL RTINF,RTINF,NAN4,RTAR2,RTINF 171 | ADRTBL RTAR1,RTAR1,RTAR1,RTDNAN,RTAR1 172 | ADRTBL FDIV,DIVZER,RTZERO,RTAR2,NAN4 173 | * 174 | * TABLE FOR REMAINDER 175 | * 176 | REMTBL EQU * 177 | ADRTBL FREM,NAN10,RTAR1,RTAR2,NAN10 178 | ADRTBL RTAR1,NAN10,RTAR1,RTAR2,NAN10 179 | ADRTBL NAN10,NAN10,NAN10,RTAR2,NAN10 180 | ADRTBL RTAR1,RTAR1,RTAR1,RTDNAN,RTAR1 181 | ADRTBL FREM,NAN10,RTAR1,RTAR2,NAN10 182 | * 183 | * TABLE FOR SQUARE ROOT 184 | * 185 | SQRTBL EQU * 186 | ADRTBL FSQRT,RTAR2,SQINCK,RTAR2,NAN1 187 | * 188 | * TABLE INTEGER PART 189 | * 190 | INTTBL EQU * 191 | ADRTBL GETINT,RTAR2,RTAR2,RTAR2,GETINT 192 | * 193 | * TABLE FOR ALL FOUR COMPARE OPERATIONS 194 | * 195 | CMPTBL EQU * 196 | ADRTBL MAGCMP,MAGCMP,INFAR2,NANCMP,ARG2UN 197 | ADRTBL MAGCMP,CMPZER,INFAR2,NANCMP,ARG2UN 198 | ADRTBL INFAR1,INFAR1,CMPINF,NANCMP,INFAR1 199 | ADRTBL NANCMP,NANCMP,NANCMP,NANCMP,NANCMP 200 | ADRTBL ARG1UN,ARG1UN,INFAR2,NANCMP,BOTHUN 201 | * 202 | * TABLE FOR FP-TO-BINARY INTEGER 203 | * 204 | FIXTBL EQU * 205 | ADRTBL FFIX,FIXZER,BIGINT,FIXNAN,FFIX 206 | * 207 | * TABLE FOR FP TO DECIMAL STRING CONVERSION 208 | * 209 | BNDTBL EQU * 210 | ADRTBL BDCNVT,OUTNDC,OUTNDC,OUTNDC,BDCNVT 211 | * 212 | * TABLE FOR MOVE OPERATION 213 | * 214 | MOVTBL EQU * 215 | ADRTBL FMOVE,RTAR2,RTAR2,RTAR2,MOVUN 216 | * 217 | * TABLE FOR ABSOLUTE VALUE FUNCTION 218 | * 219 | ABSTBL EQU * 220 | ADRTBL FABS,FABS,FABS,RTAR2,FABS 221 | * 222 | * TABLE FOR NEGATE FUNTION FUNCTION 223 | * 224 | NEGTBL EQU * 225 | ADRTBL FNEG,FNEG,FNEG,RTAR2,FNEG 226 | * 227 | -------------------------------------------------------------------------------- /sbc/mc6839/src/END.SA: -------------------------------------------------------------------------------- 1 | END 2 | -------------------------------------------------------------------------------- /sbc/mc6839/src/ENDIT.SA: -------------------------------------------------------------------------------- 1 | NAM ENDIT 2 | TTL 'END MODULE - COPYRIGHT (C) MOTOROLA 1980' 3 | * 4 | ************************************************************ 5 | * 6 | * THIS MODULE IS THE LAST MODULE IN A FP LINK. 7 | * IT INSURES THAT THE '.LO' FILE 8 | * IS LARGER THAN 8K. THIS MAKES IT EASIER TO DO 9 | * A 'PATCH' ON THE .LO TO ADD THE CRC. 10 | * 11 | ************************************************************ 12 | * 13 | * REVISER DATE REASON 14 | * 15 | * JOEL BONEY 8-14-80 ORIGINAL 16 | * JOEL BONEY 12-08-80 REMOVED SECOND COPYRIGHT 17 | * 18 | * 19 | * LINKING LOADER DEFINITIONS. SOME LABELS ARE DEFINED 20 | * HERE SO THAT THE TRUE LENGTH OF THE FP PACKAGE 21 | * CAN BE DETERMINED. 22 | XDEF THEEND,PSTCRC 23 | * 24 | THEEND EQU * 25 | PSTCRC EQU *+3 26 | BSZ $200 MAKE MODULE LONGER BY ADDING A BLOCK OF ZEROES. 27 | END 28 | -------------------------------------------------------------------------------- /sbc/mc6839/src/EQUATES.SA: -------------------------------------------------------------------------------- 1 | TTL '6809 FLOATING POINT PACKAGE - COPYRIGHT (C) MOTOROLA 1980' 2 | OPT LLEN=120,NOG 3 | * TTL **** 6809 FLOATING POINT - COPYRIGHT(C) MOTOROLA 1980 4 | 5 | * 6 | *********************************************************************** 7 | * 8 | * G L O B A L E Q U A T E S 9 | * 10 | * THESE ARE THE GLOBAL EQUATES FOR THE 6809 FP PACKAGE 11 | * 12 | ********************************************************************** 13 | * 14 | * BIT VALUES 15 | * 16 | BIT0 EQU 1 17 | BIT1 EQU 2 18 | BIT2 EQU 4 19 | BIT3 EQU 8 20 | BIT4 EQU 16 21 | BIT5 EQU 32 22 | BIT6 EQU 64 23 | BIT7 EQU 128 24 | BIT8 EQU 256 25 | BIT9 EQU 512 26 | BIT10 EQU 1024 27 | BIT11 EQU 2048 28 | BIT12 EQU 4096 29 | BIT13 EQU 8192 30 | BIT14 EQU 16384 31 | BIT15 EQU 32768 32 | * 33 | * CONDITION CODE BITS 34 | * USED IN ORCC TO SET A CC BIT 35 | * 36 | N EQU BIT3 37 | Z EQU BIT2 38 | V EQU BIT1 39 | C EQU BIT0 40 | * 41 | * CONDITION CODE BIT MASKS 42 | * USED IN ANDCC TO CLEAR SINGLE BITS 43 | * 44 | NN EQU $F7 45 | NZ EQU $FB 46 | NV EQU $FD 47 | NC EQU $FE 48 | PAGE 49 | * 50 | * 51 | * 52 | * STACK FRAME EQUATES 53 | * 54 | * 55 | * INITIALIZED BY: 56 | FUNCT EQU 0 IREG/ISTACK 57 | PTOS EQU FUNCT+1 IREG/ISTACK 58 | PFPCB EQU PTOS+2 IREG/ISTACK 59 | RPREC EQU PFPCB+2 IREG/ISTACK 60 | TSTAT EQU RPREC+1 IREG/ISTACK = 0 61 | TPARAM EQU TSTAT+2 IREG/ISTACK 62 | STIKY EQU TPARAM+2 **************************************** 63 | RESULT EQU STIKY+1 * EVERYTHING FROM STICKY TO TYPE1 IS *** 64 | SIGNR EQU RESULT * ZEROED BY ISTACK/IREG *** 65 | EXPR EQU RESULT+1 66 | FRACTR EQU EXPR+2 67 | TYPER EQU FRACTR+9 68 | ARG2 EQU TYPER+1 SET BY GETARG 69 | SIGN2 EQU ARG2 70 | EXP2 EQU ARG2+1 71 | FRACT2 EQU EXP2+2 72 | TYPE2 EQU FRACT2+9 73 | ARG1 EQU TYPE2+1 SET BY GETARG IF DYADIC 74 | SIGN1 EQU ARG1 75 | EXP1 EQU ARG1+1 76 | FRACT1 EQU EXP1+2 77 | TYPE1 EQU FRACT1+9 IXIT (0); CHANGED BY GETARG IF DYADIC 78 | * ************************************* 79 | ARGSIZ EQU TYPE2-ARG2+1 80 | * 81 | * STACK CALLS 82 | ISTKPC EQU TYPE1+1 USER'S REGISTERS, SAVED BY PSHS 83 | CCREG EQU ISTKPC+2 84 | DREG EQU CCREG+1 85 | XREG EQU DREG+2 86 | YREG EQU XREG+2 87 | UREG EQU YREG+2 88 | CALLPC EQU UREG+2 89 | * 90 | * REGISTER CALLS 91 | IREGPC EQU TYPE1+1 USER'S REGISTERS; SAVED BY PSHS 92 | PFPCB2 EQU IREGPC+3 93 | PRESUL EQU PFPCB2+2 94 | PARG2 EQU PRESUL+2 95 | PARG1 EQU PARG2+2 96 | * 97 | * TOTAL SIZE OF STACK FRAME 98 | STKSIZ EQU CALLPC+2-FUNCT 99 | * 100 | * SIZE OF STACK FRAME FROM IREG OR ISTACK TO BOTTOM 101 | * 102 | FRMSIZ EQU ISTKPC-FUNCT 103 | * 104 | * 105 | * SIZE OF CALLERS REGS (EXCEPT PC) 106 | * 107 | SIZREG EQU CALLPC-CCREG 108 | * 109 | * OFFSETS FOR INDIVIDUAL ARGUMENTS ON STACK FRAME 110 | * 111 | SIGN EQU 0 112 | EXP EQU SIGN+1 113 | FRACT EQU EXP+2 114 | TYPE EQU FRACT+9 115 | * 116 | * ALIASES FOR SOME STACK FRAME ENTRIES 117 | * 118 | P EQU TPARAM+1 EQUATE USED IN DECBIN 119 | K EQU TPARAM+1 EQUATE USED IN BINDEC 120 | PAGE 121 | * 122 | * ARGUMENT TYPES 123 | * 124 | TYNORM EQU 0 125 | TYZERO EQU 2 126 | TYINF EQU 4 127 | TYNAN EQU 6 128 | TYNNRM EQU 8 129 | * 130 | * EXPONENT BIASES 131 | SBIAS EQU 127 SINGLE PRECISION BIAS 132 | DBIAS EQU 1023 DOUBLE PRECISION BIAS 133 | * 134 | * MISCELLANEOUS EQUATES 135 | * 136 | BIGIOP EQU 17 MAXIMUM LEGAL IOP NUMBER 137 | POFF EQU 25 OFFSET TO P IN BCD STRING 138 | PAGE 139 | * 140 | * 141 | * FPCB REGISTER BYTE EQUATES 142 | * 143 | * 144 | * FPCB REGISTER EQUATES 145 | * 146 | CTL EQU 0 CONTROL REG 147 | ENB EQU 1 ENABLE BYTE 148 | ERR EQU 2 ERROR STATUS BYTE 149 | SS EQU 3 SECONDARY STATUS 150 | * OFFSET OF ADDRESS TO JUMP TO FOR TRAP 151 | TRAPV EQU 4 TRAP VECTOR 152 | * 153 | * 154 | * 155 | * CONTROL BYTE 156 | * 157 | CTLAFF EQU BIT0 AFFINE/PROJECTIVE FLAG 158 | CTLRND EQU BIT1+BIT2 ROUNDING MODE 159 | CTLNRM EQU BIT3 NORMALIZE FLAG 160 | CTLSIZ EQU BIT5+BIT6+BIT7 161 | 162 | * 163 | * ERROR STATUS BYTE 164 | * 165 | ERRIOP EQU BIT0 IOP ERROR 166 | ERROVF EQU BIT1 OVERFLOW ERROR 167 | ERRUNF EQU BIT2 UNDERFLOW ERROR 168 | ERRDZ EQU BIT3 DIVIDE BY ZERO ERROR 169 | ERRUN EQU BIT4 UNORDERED COMPARE ERROR 170 | ERRIOV EQU BIT5 INTEGER OVERFLOW ERROR 171 | ERRINX EQU BIT6 INEXACT ERROR 172 | * 173 | * TRAP ENABLE BYTE 174 | * 175 | ENBIOP EQU BIT0 INVALID OPERATION 176 | ENBOVF EQU BIT1 OVERFLOW 177 | ENBUNF EQU BIT2 UNDERFLOW 178 | ENBDZ EQU BIT3 DIVIDE BY ZERO 179 | ENBUN EQU BIT4 UNORDERED 180 | ENBIOV EQU BIT5 INTEGER OVERFLOW 181 | ENBINX EQU BIT6 INEXACT 182 | * 183 | * PRECISION MODES IN CONTROL BYTE 184 | * 185 | PRSIN EQU 00 SINGLE 186 | PRDBL EQU BIT5 DOUBLE 187 | PREXT EQU BIT6 EXTENDED 188 | PREFS EQU BIT5+BIT6 EXTENDED FORCE TO SINGLE 189 | PREFD EQU BIT7 EXTENDED FORCED TO DOUBLE 190 | * 191 | * ROUNDING MODES IN CONTROL BYTE 192 | * 193 | * 194 | RN EQU 00 ROUND TO NEAREST 195 | RZ EQU BIT1 ROUND TO ZERO 196 | RP EQU BIT2 ROUND TO PLUS INFINITY 197 | RM EQU BIT2+BIT1 ROUND TO MINUS INFINITY 198 | * 199 | * CLOSURE MODES IN CONTROL BYTE 200 | * 201 | PROJEC EQU 0 PROJECTIVE CLOSURE 202 | AFFINE EQU BIT0 AFFINE CLOSURE 203 | * 204 | * PRECISION INDEXES IN RPREC 205 | * 206 | SIN EQU 00 207 | DBL EQU 02 208 | EXT EQU 04 209 | EFS EQU 06 210 | EFD EQU 08 211 | CLRFRC EQU 10 (USED BY 'CLRES' FOR ENTIRE FRACTION) 212 | CLRALL EQU 12 (USED BY 'CLRES' FOR ENTIRE ARGUMENT) 213 | * 214 | * SECONDARY STATUS BYTE 215 | * 216 | SSIOP EQU BIT0+BIT1+BIT2+BIT3+BIT4 217 | PAGE 218 | * 219 | * 220 | * FUNCTION CODE EQUATES 221 | * 222 | * BIT 7 = 1 = MIXED SIZE ARGUMENTS (MOV,CMP) 223 | * BIT 6 = 1 = TRAP ON UNORDERED COMPARE 224 | * BIT5-BIT0 = FUNCTION NUMBER 225 | * 226 | * 227 | MIXED EQU BIT7 228 | TONUN EQU BIT6 TRAP ON UNORDERED 229 | * 230 | * 231 | FCADD EQU 0 232 | FCSUB EQU FCADD+2 233 | FCMUL EQU FCSUB+2 234 | FCDIV EQU FCMUL+2 235 | FCREM EQU FCDIV+2 236 | FCCMP EQU FCREM+2+MIXED 237 | FCTCMP EQU FCREM+4+MIXED+TONUN 238 | FCPCMP EQU FCREM+6+MIXED 239 | FCTPCM EQU FCREM+8+MIXED+TONUN 240 | FCSQRT EQU FCREM+10 241 | FCINT EQU FCSQRT+2 242 | FCFIXS EQU FCINT+2 243 | FCFIXD EQU FCFIXS+2 244 | FCMOV EQU FCFIXD+2+MIXED 245 | FCBNDC EQU FCFIXD+4 246 | FCAB EQU FCBNDC+2 247 | FCNEG EQU FCAB+2 248 | * 249 | * THE FOLLOWING OPCODES DO NOT GO THROUGH 250 | * A JUMP-ADDRESS TABLE. 251 | * NOTE: THE 'FCAB' AND 'FCNEG' WILL 252 | * NOT EVEN GO THROUGH THE DISPATCH ROUTINE. 253 | * 254 | FCNOJP EQU FCNEG+2 MARKS OPCODES WITHOUT TABLES 255 | * 256 | FCDCBN EQU FCNOJP 257 | FCFLTS EQU FCDCBN+2 258 | FCFLTD EQU FCFLTS+2 259 | * 260 | * MAX ALLOWABLE OPCODE 261 | * 262 | FCMAX EQU FCFLTD 263 | * 264 | * 265 | * EXPONENT EQUATES 266 | * 267 | * MAXIMUM EXPONENTS 268 | * 269 | SMAXEX EQU $0080 SINGLE 270 | DMAXEX EQU $0400 DOUBLE 271 | EMAXEX EQU $3FFF EXTENDED 272 | * 273 | * MINIMUM EXPONENTS 274 | * 275 | SMINEX EQU $FF81 SINGLE 276 | DMINEX EQU $FC01 DOUBLE 277 | EMINEX EQU $C000 EXTENDED 278 | * 279 | INFEX EQU $7FFF INFINITE EXPONENT 280 | ZEROEX EQU $8000 ZERO EXPONENT INTERNAL FORMAT 281 | * 282 | * 283 | * INS AND OUTS BCD ARRAY EQUATES 284 | * 285 | SE EQU 0 SIGN EXPONENT 286 | SF EQU 5 SIGN FRACTION 287 | EXPDIG EQU 4 NO. OF BCD DIGITS IN EXPONENT 288 | SIGDIG EQU 19 NO. OF BCD DIGITS IN FRACTION 289 | DECEXP EQU 1 START OF BCD EXPONENT 290 | DECSIG EQU 6 START OF BCD FRACTION 291 | * 292 | MAXP EQU 19 MAXIMUM VALUE FOR P ON DECBIN( INS ) 293 | MAXK EQU 17 MAXIMUM VALUE FOR K ON BINDEC( OUTS ) 294 | * 295 | * SIZES OF STACK FRAME ENTITIES 296 | * 297 | FRACSZ EQU 72 NO. OF BITS IN FRACTION 298 | EXPSIZ EQU 16 NO. OF BITS IN EXPONENT 299 | * 300 | * BOOLEAN EQUATES 301 | * 302 | TRUE EQU 00 303 | FALSE EQU $FF 304 | * 305 | * 306 | -------------------------------------------------------------------------------- /sbc/mc6839/src/FADS.SA: -------------------------------------------------------------------------------- 1 | * 2 | NAM FADS 3 | TTL FLOATING-POINT ADD ROUTINE 4 | * 5 | * LINKNG LOADER DEFINITIONS 6 | * 7 | XREF TFRACT,VALID,FRCTAB,BITTBL,DNORM1,NORMQK 8 | XREF FPMOVE,XADDY,CLRES,COMP2,DENORM 9 | * 10 | XDEF FADD,FSUB 11 | * 12 | * 13 | * REVISION HISTORY: 14 | * DATE PROGRAMMER REASON 15 | * 16 | * 23.MAY.80 G.WALKER ORIGINAL 17 | * 16.JUN.80 G. STEVENS FIX FSUB 18 | * 1.JUL.80 G.WALKER CODE COMPACTION 19 | * 13.JUL.80 G.WALKER SPEED & SHRINK 20 | * 17.JUL.80 G.WALKER REWRITE TO CORRECT 21 | * HANDLING OF UN-NORM. 22 | * 22.JUL.80 G.WALKER INCLUDE STICKY IN COMPL. 23 | * 06.AUG.80 G.WALKER OR BITS OF RESULT INTO 24 | * STICKY BYTE 25 | * 13.AUG.80 G.WALKER SAVE BYTES USING "DENORM" 26 | * 18.AUG.80 G. STEVENS SAVE MORE BYTES W/ "DENORM" 27 | * 07.OCT.80 G.WALKER CORRECT LARGER ARG MOVE 28 | * 29 | PAG 30 | ************************************************** 31 | * 32 | * FADD -- 33 | * ADDS TWO ARGUMENTS FROM THE STACK FRAME 34 | * AND LEAVES THE RESULT IN THE STACK FRAME. THE 35 | * EXPONENT OF THE RESULT IS THE LARGEST OF THE 36 | * TWO EXPONENTS. THE ARGUMENT WITH THE SMALLER 37 | * EXPONENT IS DENORMALIZED UNTIL THE TWO EXPONENTS 38 | * ARE EQUAL. BITS SHIFTED OUT TO THE RIGHT ARE OR'ED 39 | * INTO THE STICKY BYTE. 40 | * IF THE DIFFERENCE IN EXPONENTS EXCEEDS ROUNDING 41 | * PRECISION + GUARD BIT, THEN RESULT IS ARGUMENT 42 | * WITH THE LARGEST EXPONENT, ELSE THE ARGUMENT WITH 43 | * THE SMALLEST FRACTION IS COMPLEMENTED AND THE TWO 44 | * FRACTIONS ARE ADDED. THE RESULT IS TESTED FOR ZERO 45 | * DUE TO CANCELLATION AND NORMALIZED IF ONE OF THE 46 | * INPUT ARGUMENTS WAS NORMALIZED. 47 | * 48 | * ALGORITHM IS: 49 | * 50 | * IF EXP1 > EXP2 THEN 51 | * EXPR=EXP1; SMALLER=ARG2; 52 | * ELSE 53 | * EXPR=EXP2; SMALLER=ARG1; 54 | * ENDIF 55 | * GET ABSOLUTE DIFFERENCE IN EXPONENTS; 56 | * IF DIFFERENCE > PRECISION THEN 57 | * RETURN LARGER ARGUMENT; 58 | * ELSE 59 | * DENORMALIZE SMALLER, THROWING BITS TO THE RIGHT 60 | * INTO THE STICKY BUCKET; 61 | * REMEMBER IF ONE ARGUMENT IS NOW NORMALIZED; 62 | * IF SIGN1 <> SIGN2 THEN 63 | * IF FRACT1 < FRACT2 THEN 64 | * 2'S COMPL. FRACT1; SIGNR=SIGN2 65 | * ELSE 66 | * 2'S COMPL. FRACT2; SIGNR=SIGN1 67 | * ENDIF 68 | * ENDIF SIGNS ARE NOT EQUAL 69 | * ADD THE FRACTIONS INTO THE RESULT 70 | * ENDIF 71 | * 72 | * IF THE V-BIT IS SET THEN 73 | * SHIFT RESULT FRACTION RIGHT ONE BIT AND INCREMENT 74 | * RESULT EXPONENT; 75 | * ENDIF 76 | * IF FRACTR = 0 THEN 77 | * IF ONE ARGUMENT WAS NORMALIZED 78 | * RETURN SIGNED NORMAL ZERO 79 | * ELSE 80 | * RETURN SIGNED UN-NORMALIZED ZERO 81 | * ENDIF 82 | * ELSE FRACTR <> 0 83 | * IF ONE ARGUMENT WAS NORMALIZED 84 | * NORMALIZE RESULT 85 | * ENDIF 86 | * ENDIF 87 | * CHECK FOR UNDERFLOW; 88 | * ROUND RESULT TO PROPER PRECISION; 89 | * CHECK FOR OVERFLOW. 90 | * 91 | *** 92 | * 93 | * LOCAL STORAGE USED: (STACK DISPLACEMENT) 94 | * FRCNDX (1) -- LARGEST INDEX OF BYTES IN FRACT. 95 | * FRBITS (2) -- TWO BYTE COUNT OF SIGNIFICANT BITS + 96 | * GUARD BIT IN THE FRACTION 97 | * EXPDIF (2) -- (2 BYTES) DIFFERENCE IN EXPONENTS 98 | * ADUNRM (1) -- MSBIT IS 0 IF BOTH ARGUMENTS WERE 99 | * UNNORMALIZED AFTER DENORMALIZATION 100 | * OF SMALLER ARGUMENT 101 | * TMPX (2) -- TEMP. SAVE FOR X-REGISTER 102 | * DIDCMP (1) -- =0 IF NO COMPLEMENT, =1 IF A COMPLEMENT 103 | * WAS PERFORMED. 104 | * 105 | * 106 | FRCNDX SET 0 107 | FRBITS SET 1 108 | EXPDIF SET 3 109 | ADUNRM SET 5 110 | TMPX SET 6 111 | DIDCMP SET 8 112 | * 113 | * 114 | FADD EQU * 115 | LEAS -9,S RESERVE LOCAL STORAGE 116 | LDA RPREC,U 117 | LSRA 118 | LEAX FRCTAB,PCR 119 | LDB A,X GET # BYTES FOR THIS PRECISION 120 | DECB CHANGE TO LARGEST INDEX 121 | STB FRCNDX,S 122 | LEAX BITTBL,PCR 123 | LDB A,X 124 | SEX EXTEND TO 16 BIT 125 | STD FRBITS,S SAVE # OF FRACTION BITS 126 | CLR DIDCMP,S DEFAULT TO NO COMPL. 127 | * 128 | * FIND WHICH ARGUMENT IS SMALLER 129 | * 130 | LDX EXP1,U 131 | IF X,GT,(EXP2,U) 132 | LEAX ARG1,U X POINTS TO ARG WITH LARGER EXP 133 | LEAY ARG2,U Y POINTS TO ARG WITH SMALLR EXP 134 | ELSE 135 | LEAX ARG2,U X POINTS TO ARG WITH LARGER EXP 136 | LEAY ARG1,U Y POINTS TO ARG WITH SMALLER EXP 137 | ENDIF 138 | * 139 | * CREATE ABSOLUTE DIFFERENCE IN EXPONENTS. 140 | * 141 | LDD EXP,X SUBTRACT SMALLER EXP FROM LARGER 142 | SUBD EXP,Y 143 | STD EXPDIF,S SAVE DIFFERENCE IN EXPS 144 | LEAX FRACT,X POINT TO FRACTION PART 145 | LEAY FRACT,Y 146 | * 147 | * IF THE DIFFERENCE IN EXPONENTS IS LARGER THAN THE 148 | * NUMBER OF SIGNIFICANT BITS IN THIS PRECISION, THEN 149 | * 'OR' THE FRACTION OF THE SMALLER ARGUMENT INTO 150 | * THE STIKY BYTE AND MOVE LARGER FRACTION TO THE RESULT. 151 | * 152 | IF D,GT,(FRBITS,S) UNLESS FRACTIONS OVERLAP 153 | LDA 0,X TEST NORMALIZATION OF LARGER ARG 154 | ANDA #$80 (SMALLER IS DENORMED) 155 | STA ADUNRM,S 156 | LDA FRCNDX,S 157 | CLRB INITIAL STICKY BYTE IS ZERO 158 | WHILE A,GE,#0 159 | ORB A,Y 'OR' SMALLER FRACTION 160 | DECA INTO STICKY BYTE 161 | ENDWH 162 | STB STIKY,U SAVE NEW STIKY BYTE 163 | LEAX -FRACT,X POINT TO ENTIRE FP NUMBER FOR MOVE 164 | * LARGER ARG WILL BE COPIED TO RSLT 165 | ELSE L SMALLER FRACTION OVERLAPS 166 | * 167 | * ELSE DENORMALIZE SMALLER AND SHIFT ONE BITS 168 | * OUT OF THE RIGHT INTO THE STICKY BYTE. 169 | * 170 | PSHS X SAVE XREG 171 | LEAX -FRACT,Y POINT TO SMALLER NUMBER 172 | LBSR DENORM DENORM IT BASE ON COUNT IN 'B' 173 | PULS X RESTORE X-REG 174 | * 175 | * TEST NORMALIZATION OF FRACTIONS: 'ADUNRM' 176 | * IS =1 IF ONE WAS NORMALIZED, =0 IF BOTH UNNORM- 177 | * ALIZED. 178 | * 179 | LDA 0,X 180 | ORA 0,Y STORE WHETHER EITHER FRACTION 181 | ANDA #$80 MASK TO MSBIT 182 | STA ADUNRM,S IS NORMALIZED 183 | * 184 | * IF ARGS DIFFER IN SIGN, THEN COMPLEMENT 185 | * THE SMALLER ARG'S FRACTION 186 | * 187 | LDA ARG1,U 188 | IF A,NE,(ARG2,U) UNLESS SIGNS THE SAM 189 | * 190 | * COMPARE SIZES OF FRACTIONS. 191 | * 192 | LDA #1 193 | STA DIDCMP,S SAVE THAT COMPLEMENT WAS DONE 194 | STX TMPX,S TEMP. SAVE X-REG FOR COMPL. 195 | CLRA BYTE INDEX 196 | LDB A,X 197 | WHILE B,EQ,(A,Y) LOOP TO COMPARE BYTES 198 | CMPA FRCNDX,S IF ALL BYTES ARE COMPARED, 199 | BGE FADSMY THEN FRACTS ARE EQUAL 200 | INCA 201 | LDB A,X 202 | ENDWH 203 | * IF BYTES NOT EQUAL, THEN BRANCH ON CC-REG. 204 | BHI FADSMY Y POINTS TO SMALLER FRACT 205 | * 206 | FADSMX EQU * FRACT,X IS SMALLER 207 | LDA -FRACT,Y GET SIGN OF LARGER FRACT IN A 208 | STA -FRACT,X RESULT SIGN INTO ARG WITH LARGER EXP 209 | * (WILL ULTIMATELY BE MOVED TO RESULT) 210 | BRA DOCMPL COMPLEMENT FRACT POINTED TO BY X-REG 211 | * 212 | * NOW COMPLEMENT THE SMALLER FRACTION. 213 | * 214 | FADSMY EQU * Y-POINTS TO SMALLER FRACTION 215 | LEAX 0,Y POINT X TO SMALLER FRACTION 216 | * 217 | DOCMPL EQU * 218 | LDB FRCNDX,S B CONTAINS LARGEST INDEX INTO FRACTION 219 | IF X,EQ,(TMPX,S) IF FRACTION TO BE COMPLEMENTED 220 | LBSR COMP2 WAS NOT DENORMALIZED--2'S COMPL. 221 | ELSE ELSE STIKY BYTE IS PART OF FRACTION 222 | IFTST (STIKY,U),EQ,#0 IF ZERO STIKY, DO 2'S COMP 223 | LBSR COMP2 224 | ELSE ELSE DO 1'S COMP. 225 | WHILE B,GE,#0 226 | COM B,X 227 | DECB 228 | ENDWH 229 | ENDIF TEST ON STIKY = 0 230 | ENDIF COMPLEMENT DENORMALIZED FRACTION 231 | LDX TMPX,S RESTORE POINTER TO ARG WITH SMLR EXP 232 | ENDIF SIGNS ARE NOT THE SAME 233 | * 234 | * ADD TWO FRACTIONS INTO RESULT 235 | * 236 | LBSR XADDY ADD FRACTIONS 237 | LEAX -FRACT,X POINT TO ENTIRE FP NUMBER 238 | IFCC CS IF WAS CARRY OUT FROM ADD 239 | IFTST (DIDCMP,S),EQ,#0 AND WAS NOT COMPLEMENTED 240 | LBSR DNORM1 ADJUST FOR OVERFLOW 241 | ENDIF 242 | ENDIF 243 | * 244 | ENDIF FRACTIONS OVERLAP 245 | * 246 | LEAY RESULT,U 247 | LBSR FPMOVE MOVE FP NUMBER TO RESULT 248 | LEAX RESULT,U POINT X TO RESULT 249 | LBSR TFRACT 250 | IFCC EQ IF FRACTION IS ZERO 251 | IFTST (ADUNRM,S),LT,#0 IF ONE ARG NORMALIZED 252 | LDD #ZEROEX SET EXPONENT FOR NORMAL ZERO 253 | STD EXPR,U 254 | ENDIF NORMAL RESULT 255 | LDY PFPCB,U 256 | LDA CTL,Y 257 | ANDA #CTLRND CHECK ROUNDING MODE 258 | IF A,EQ,#RM IF ROUND TO -INFINITY 259 | LDA #$80 260 | STA RESULT,U SET RESULT TO -0 261 | ELSE 262 | CLRA IF ROUND TO +INFINITY 263 | STA RESULT,U SET RESULT TO +0 264 | ENDIF 265 | ELSE FRACTION IS NON-ZERO 266 | IFTST (ADUNRM,S),LT,#0 IF ONE ARG NORMALIZED 267 | LBSR NORMQK NORMALIZE RESULT 268 | ENDIF ONE ARGUMENT WAS NORMALIZED 269 | * 270 | * THE LOW ORDER BYTES OF THE RESULT ARE 271 | * OR'ED INTO THE STIKY BYTE. THE 'ROUND' ROUTINE 272 | * WILL 'OR' THE BITS IN THE SAME BYTE AS THE GUARD BIT 273 | * INTO THE STICKY BYTE. 274 | * 275 | LDB #0 276 | LBSR DENORM 277 | * 278 | ENDIF FRACTION WAS ZERO TEST 279 | * 280 | * FINISH PROCESSING WITH CHECKS 281 | * FOR EXCEPTIONAL CONDITIONS 282 | * 283 | LBSR VALID CHECK FOR VALID RESULT 284 | LEAS 9,S REMOVE LOCAL STORAGE 285 | * 286 | RTS 287 | TTL FLOATING-POINT SUBTRACT 288 | PAG 289 | ************************************************************ 290 | * 291 | * FSUB -- 292 | * SUBTRACTS ARG2 FROM ARG1, LEAVING DIFFERENCE IN RESULT, 293 | * BY NEGATING ARG2 AND CALLING 'FADD'. 294 | * 295 | FSUB EQU * 296 | LDA ARG2,U 297 | COMA 298 | ANDA #$80 NEGATE ARG2 299 | STA ARG2,U RESTORE SIGN 300 | LBSR FADD AND ADD 301 | RTS 302 | -------------------------------------------------------------------------------- /sbc/mc6839/src/FLOAT.SA: -------------------------------------------------------------------------------- 1 | NAM FLOAT 2 | ****************************************************** 3 | * 4 | * PROCEDURE FLOAT 5 | * FLOAT CONVERTS A BINARY INTEGER TO A FLOATING 6 | * REPRESENTATION. THE INPUT ARGUMENT CAN EIHTER BE 7 | * A 16 OR 32 BIT SIGNED INTEGER. IF THE ARGUMENT 8 | * IS 32 BIT LONG AND THE DESTINATION IS SINGLE 9 | * THEN THE VALUE IS ROUNDED ONCE. 10 | * 11 | * ON ENTRY: 12 | * U IS A STACK FRAME POINTER 13 | * 14 | * ON EXIT: 15 | * RESULT CONTAINS A FLOATING VALUE REPRESENTING 16 | * THE BINARY INTEGER. 17 | * 18 | FLOAT EQU * 19 | * 20 | LEAX RESULT,U 21 | LDB #ARGSIZ-1 22 | WHILE B,GE,#00 23 | CLR B,X 24 | DECB 25 | * 26 | ENDWH 27 | * 28 | * SET EXPONENT TO PROPER VALUE 29 | * 30 | LDA FUNCT,U CHECK FUNCTION 31 | IF A,EQ,#FCFLTS SINGLE PRECISION FLOAT 32 | LEAY SINTSZ,PCR 33 | * 34 | ELSE 35 | LEAY DINTSZ,PCR DOUBLE PRECISION FLOAT 36 | * 37 | ENDIF 38 | * 39 | * MOVE INTEGER TO RESULT 40 | * 41 | MOVD (0,Y),(EXPR,U) 42 | * 43 | MOVD (FRACT2,U),(FRACTR,U) 44 | LDA FUNCT,U CHECK FUNCTION 45 | IF A,EQ,#FCFLTD DOUBLE PREC. FLOAT 46 | MOVD (FRACT2+2,U),(FRACTR+2,U) 47 | * 48 | ENDIF 49 | * 50 | * CHECK SIGN OF INTEGER AND NEGATE THE INTEGER 51 | * IF NECESSARY. 52 | * 53 | LDA FRACTR,U 54 | IFCC LT SIGN NEGATIVE 55 | LDA #$80 SET SIGN NEGATIVE 56 | STA RESULT,U 57 | * 58 | LEAX FRACTR,U 59 | LDA FUNCT,U CHECK FUNCTION 60 | IF A,EQ,#FCFLTS SINGLE PRECISION 61 | COM 0,X 62 | NEG 1,X 63 | BCS OUT 64 | INC 0,X 65 | * 66 | ELSE 67 | COM 0,X 68 | COM 1,X 69 | COM 2,X 70 | NEG 3,X 71 | BCS OUT 72 | INC 2,X 73 | BNE OUT 74 | INC 1,X 75 | BNE OUT 76 | INC 0,X 77 | * 78 | ENDIF SINGLE PRECISION 79 | * 80 | OUT EQU * 81 | * 82 | ENDIF INTEGER NEGATIVE 83 | * 84 | * NORMALIZE RESULT 85 | * 86 | LEAX RESULT,U 87 | * 88 | LBSR SNORM 89 | * 90 | * IF THE ARGUMENT WAS 32 BITS LONG AND THE PRECISION 91 | * IS SINGLE, THEN ROUND THE RESULT TO YIELD EXACT 92 | * REPRESENTATION 93 | * 94 | LDA FUNCT,U 95 | IF A,EQ,#FCFLTD DOUBLE PRECISION FLOAT 96 | LDA [PFPCB,U] 97 | ANDA #BIT7+BIT6+BIT5 98 | IF A,EQ,#PRSIN SINGLE PRECISION 99 | BRA RND 100 | * 101 | ELSE 102 | IF A,EQ,#PREFS FORCE TO SINGLE 103 | * 104 | RND EQU * 105 | * 106 | LDB #FRACT+3 G-BYTE OFFSET 107 | LDA B,X GET G-BYTE 108 | LSLA GET RID OF MSBIT 109 | * 110 | INCB 111 | WHILE B,LT,#(ARGSIZ-1) 112 | ORA B,X 113 | INCB 114 | * 115 | ENDWH 116 | * 117 | STA STIKY,U SET STIKY BYTE 118 | * 119 | LBSR ROUND ROUND RESULT 120 | * 121 | ENDIF 122 | ENDIF SINGLE PRECISION 123 | * 124 | ENDIF DOUBLE PRECISION FLOAT 125 | * 126 | * 127 | RTS RETURN 128 | * 129 | * 130 | * INTEGER SIZE TABLE 131 | * 132 | SINTSZ FDB 15 133 | DINTSZ FDB 31 134 | * 135 | * 136 | * 137 | -------------------------------------------------------------------------------- /sbc/mc6839/src/FPLOAD.CRF: -------------------------------------------------------------------------------- 1 | RLOAD 2 | IF=TEMP:1 3 | STRP=$2000 4 | LOAD=CHECK:1,NOTRAP:1,RNDEXEP:1,OUTS:1,INTFLT:1,COMP:1 5 | LOAD=COMPARE:1,DISPAT:1 6 | LOAD=FMULDV:2,FRMSQT:2,INS:2,UTILIO:2,FADS:2,UTIL:2 7 | LOAD=GETPUT:3,FRNBAK:3,PROCS:3 8 | MO=#LP 9 | OBJA=%FILE% 10 | MAPF 11 | EXIT 12 |  -------------------------------------------------------------------------------- /sbc/mc6839/src/HDR.SA: -------------------------------------------------------------------------------- 1 | TTL '6809 FLOATING POINT PACKAGE - COPYRIGHT (C) 2 | -------------------------------------------------------------------------------- /sbc/mc6839/src/L.SA: -------------------------------------------------------------------------------- 1 | OPT L 2 | -------------------------------------------------------------------------------- /sbc/mc6839/src/MVABSNEG.SA: -------------------------------------------------------------------------------- 1 | NAM MOVE 2 | TTL FMOVE FUNCTION 3 | * 4 | * LINKING LOADER DEFINITIONS 5 | * 6 | XDEF FMOVE,MOVUN,FABS,FNEG 7 | * 8 | XREF CLRES,FPMOVE,CLTBL,CHKUNF,CHKOVF,ADBIAS,SUBIAS 9 | XREF UNFLNT,OVFLNT,CKINVD,ROUND,IOPSUB,ISDNRM,RTAR2 10 | * 11 | * REVISION HISTORY: 12 | * DATE PROGRAMMER REASON 13 | * 30.MAY.80 G. STEVENS ORIGINAL 14 | * 07.JUL.80 G. STEVENS FIX MOVE FCN. 15 | * 07.AUG.80 G. STEVENS FIX NEG FCN( MAKE IT REALLY NEG) 16 | * 08.AUG.80 G. STEVENS FIX CONTROL FLOW IN MOVUN 17 | * 11.AUG.80 G. STEVENS SET UP RPREC IN FMOVE 18 | * 13.AUG.80 G. STEVENS REMOVE SET RPREC IN MOVE 19 | * 14.AUG.80 G. STEVENS UNMOVE HANDLES DENORMALIZED PROPERLY 20 | * 14.AUG.80 G. STEVENS REMOVE ANY SIZE CHECKS IN FMOVE 21 | * 18.AUG.80 G. STEVENS ABS & NEG INVOKE RTAR2 SOLVING UNFL PROBB.B 22 | * 23 | PAGE 24 | * 25 | * LOCAL EQUATE 26 | * 27 | DSTSIZ EQU BIT0+BIT1+BIT2 28 | * 29 | * 30 | * HERE IS THE TWO ROUTINE THAT MAKE UP THE MOVE 31 | * MOVE FUNCTION. PROCEDURE A HANDLES MOVES WHEN 32 | * THE OPERANDS ARE BOTH NORMALIZED. PROCEDURE B 33 | * HANDLES THE CASE WHERE THE OPERANDS ARE UNORMALIZED 34 | * 35 | ****************************************************************** 36 | * 37 | * PROCEDURE B: 38 | * 39 | * PROCEDURE UNMOVE 40 | * 41 | * UNMOVE CONVERTS AN UNNORMALIZED FLOATING OPERAND 42 | * ON THE STACK FRAME FROM ONE PRECISION TO ANOTHER. THE 43 | * PRECISIONS OF THE SOURCE AND DESTINATION ARE CONTAINED 44 | * IN THE TPARAM LOCATION ON THE STACK FRAME. 45 | * 46 | * ON ENTRY: 47 | * ARG2 CONTAINS THE INPUT ARGUMENT 48 | * 49 | * ON EXIT: 50 | * RESULT CONTAINS THE CONVERTED VALUE 51 | * U - UNCHANGED 52 | * D,X,Y,CC - DESTROYED 53 | * 54 | MOVUN EQU * 55 | * 56 | * COMPARE SIZE OF SOURCE AND SIZE OF DESTINATION 57 | * 58 | LDB TPARAM+1,U SIZE WORD 59 | LDA #16 60 | MUL 61 | LDB TPARAM+1,U 62 | ANDB #07 DESTINATION SIZE IN B 63 | * 64 | * IF THE MOVE IS SINGLE TO DOUBLE THEN SIGNAL INVALID 65 | * OPERATION IOP = 15. 66 | * 67 | IF D,EQ,#(SIN/2*256+DBL/2) 68 | IOP 15 69 | * 70 | * 71 | * ELSE IF THE MOVE IS FROM EXTENDED TO SINGLE OR DOUBLE 72 | * ANS THE ARGUMENT IS NOT DENORMALIZED THEN SIGNAL INVALID 73 | * OPERATION IOP = 16. 74 | * 75 | ELSE 76 | IF A,GE,#(EXT/2) SOURCE = SINGLE 77 | IF B,LT,#(EXT/2) DESTINATION = DOUBLE 78 | LEAX ARG2,U 79 | LSLA DOUBLE SOURCE INDEX 80 | LBSR ISDNRM CHECK FOR DENORMALIZED 81 | IFCC NE NOT DENORMALIZED 82 | IOP 16 83 | * 84 | BRA RET RETURN 85 | * 86 | ENDIF 87 | ENDIF 88 | ENDIF 89 | * 90 | * 91 | * ELSE IF NONE OF THE ABOVE INVOKE THE REGULAR MOVE 92 | * PROCEDURE. 93 | * 94 | BSR FMOVE 95 | * 96 | ENDIF 97 | * 98 | RET EQU * 99 | * 100 | RTS RETURN 101 | * 102 | PAGE 103 | * 104 | * PROCEDURE A: OPERANDS NORMALIZED 105 | * 106 | * PROCEDURE AFMOVE 107 | * 108 | * AFMOVE VONVERTS NORMALIZED FLOATING OPERANDS 109 | * ON THE STACK FRAME FROM ONE PRECISION TO ANOTHER 110 | * THE PRECISIONS OF THE SOURCE AND DESTINATION ARE 111 | * CONTAINED IN THE TPARAM+1 LOCATION ON THE STACK 112 | * FRAME. IF THE PRECISION OF THE SOURCE AND DESTINATION 113 | * ARE THE SAME THEN NO STACK FRAME IS BUILT SINCE NO REAL 114 | * CONVERSION IS NECESSARY. 115 | * 116 | * ON ENTRY: 117 | * ARG2 CONTAINS THE INPUT ARGUMENT 118 | * U - CONTAINS THE POINTER TO THE STACK FRAME 119 | * 120 | * ON EXIT: 121 | * RESULT CONTAINS THE CONVERTED VALUE 122 | * U - UNCHANGED 123 | * A,B,X,Y,CC - DESTROYED 124 | * 125 | FMOVE EQU * 126 | * 127 | * 128 | * MOVE INPUT ARGUMENT( ARG2 ) TO THE STACK FRAME RESULT 129 | * 130 | LEAX ARG2,U INPUT ARGUMENT 131 | LEAY RESULT,U DESTINATION 132 | LBSR FPMOVE 133 | * 134 | * IF THE DESTINATION IS SHORTER THAN THE SOURCE THEN 135 | * ROUNDING AND OVERFLOW/UNDERFLOW CHECKS MUST BE PERFORMED 136 | * 137 | LDA TPARAM+1,U SIZE BYTE 138 | ANDA #DSTSIZ DESTINATION SIZE 139 | * 140 | * OR BYTES BEYOND THE PRECISION OF DEST. INTO THE STICKY 141 | * BYTE 142 | * 143 | LEAY CLTBL,PCR 144 | LDB A,Y POSITON OF G- BYTE 145 | INCB BUMP POINTER PAST G-BYTE 146 | CLRA 147 | WHILE B,LT,(#ARGSIZ-1) 148 | ORA B,X OR THE BYTES 149 | INCB 150 | * 151 | ENDWH 152 | STA STIKY,U SET UP STIKY 153 | * 154 | LBSR CHKUNF CHECK FOR UNDERFLOW 155 | * 156 | * IF UNDERFLOW = TRUE AND THE TRAP IS ENABLED THEN DELIVER 157 | * THE RESULT IN INTERNAL FORMAT ROUNDED TO THE PRECISON 158 | * OF THE DESTINTION TO THE TRAP HANDLER. 159 | * 160 | IFCC EQ UNDERFLOW = TRUE 161 | LDX PFPCB,U POINTER TO FPCB 162 | LDA ENB,X ENABLE BYTE 163 | ANDA #ENBUNF UNDERFLOW TRAP ENABLE 164 | IFCC NE TRAP ENABLED 165 | LEAX RESULT,U 166 | LBSR ADBIAS WRAP AROUND EXPONENT 167 | LBSR ROUND ROUND RESULT 168 | * 169 | * ELSE IF UNDERFLOW = TRUE BUT TRAP IS DISABLED THEN 170 | * UNDERFLOW_NO_TRAP. 171 | * 172 | ELSE TRAP DISABLED 173 | LBSR UNFLNT 174 | * 175 | ENDIF 176 | * 177 | * ELSE IF UNDERFLOW /= TRUE THEN JUST ROUND RESULT 178 | * TO THE PRECISION OF THE DESTINATION 179 | * 180 | ELSE UNDERFLOW /= TRUE 181 | LEAX RESULT,U 182 | LBSR ROUND ROUND RESULT 183 | * 184 | ENDIF UNDERFLOW = TRUE 185 | * 186 | * POST ROUND CHECKS 187 | * 188 | LBSR CKINVD CHECK FOR INVALID OPERATION 189 | * 190 | LBSR CHKOVF 191 | * 192 | * IF OVERFLOW = TRUE AND TRAP IS ENABLED THEN DELIVER THE 193 | * RESULT IN INTERNAL FORMAT ROUNDED TO THE PRECISION OF 194 | * THE DESTINATION. 195 | * 196 | IFCC EQ OVERFLOW = TRUE 197 | LDX PFPCB,U POINTER TO FPCB 198 | LDA ENB,X ENABLE BYTE 199 | ANDA #ENBOVF OVERFLOW TRAP ENABLE 200 | IFCC NE TRAP ENABLED 201 | LBSR SUBIAS 202 | * 203 | * ELSE IF OVERFLOW = TRUE BUT TRAP IS DISABLED THEN 204 | * INVOKE OVERFLOW_NO_TRAP. 205 | * 206 | ELSE TRAP DISABLED 207 | LBSR OVFLNT 208 | * 209 | ENDIF TRAP ENABLED 210 | * 211 | ENDIF OVERFLOW = TRUE 212 | * 213 | * ELSE IF THE DESTINATION IS LARGER THEN THE SOURCE THEN 214 | * THE MOVE IS EXACT. 215 | * 216 | * 217 | * 218 | RTS RETURN 219 | * 220 | * 221 | * 222 | ***************************************************************** 223 | * 224 | * ABSOLUTE VALUE AND NEGATE FUNCTIONS 225 | * 226 | ****************************************************************** 227 | * 228 | * PROCEDURE FABS 229 | * 230 | * FABS RETURNS AS ITS RESULT THE ABSOLUTE VALUE 231 | * OF THE FLOATING PT. VALUE IN ARG2 ON THE STACK FRAME. 232 | * 233 | * ON ENTRY: ARG2 CONTAINS INPUT ARGUMENT 234 | * U - POINTER TO THE STACK FRAME 235 | * 236 | * ON EXIT: RESULT CONTAINS THE ABSOLUTE VALUE OF THE INPUT 237 | * U - UNCHANGED 238 | * X,Y,D,CC - DESTROYED 239 | * 240 | * OPERATION: 241 | * THE INPUT IS COPIED TO THE RESULT AND THE SIGN OF THE 242 | * RESULT IS SET TO $00 OR PLUS. 243 | * 244 | * 245 | FABS EQU * 246 | * 247 | LBSR RTAR2 MOVE ARG2 TO THE RESULT 248 | * 249 | * MAKE SIGN POSITIVE 250 | * 251 | CLR SIGNR,U 252 | * 253 | RTS RETURN 254 | * 255 | * 256 | ***************************************************************** 257 | * 258 | * 259 | * PROCEDURE FNEG 260 | * 261 | * FNEG RETURNS AS ITS RESULT THE NEGATIVE 262 | * OF THE FLOATING PT. VALUE IN ARG2 ON THE STACK FRAME. 263 | * 264 | * ON ENTRY: ARG2 CONTAINS INPUT ARGUMENT 265 | * U - POINTER TO THE STACK FRAME 266 | * 267 | * ON EXIT: RESULT CONTAINS THE ABSOLUTE VALUE OF THE INPUT 268 | * U - UNCHANGED 269 | * X,Y,D,CC - DESTROYED 270 | * 271 | * OPERATION: 272 | * THE INPUT IS COPIED TO THE RESULT AND THE SIGN OF THE 273 | * RESULT IS COMPLEMENTED. 274 | * 275 | * 276 | FNEG EQU * 277 | * 278 | LBSR RTAR2 RETURN ARG2 IN THE RESULT 279 | * 280 | * COMPLEMENT THE SIGN 281 | * 282 | LDA SIGNR,U 283 | EORA #$80 284 | STA SIGNR,U 285 | * 286 | RTS RETURN 287 | * 288 | * 289 | PAGE 290 | -------------------------------------------------------------------------------- /sbc/mc6839/src/NEWMACR.SA: -------------------------------------------------------------------------------- 1 | ************************************************* 2 | * 3 | * XPLUSY -- 4 | * 5 | * THIS MACRO EFFICIENTLY ADDS THE 9-BYTE 6 | * FRACTION POINTED TO BY XREG TO THAT POINTED 7 | * TO BY YREG, LEAVING THE RESULT IN FRACTION 8 | * POINTED TO BY XREG. CARRY OUT OF HIGH-ORDER 9 | * BIT IS IN CARRY FLAG. 10 | * 11 | XPLUSY MACR 12 | LDD 7,X 13 | ADDD 7,Y 14 | STD 7,X 15 | LDD 5,X 16 | ADCD (5,Y) 17 | STD 5,X 18 | LDD 3,X 19 | ADCD (3,Y) 20 | STD 3,X 21 | LDD 1,X 22 | ADCD (1,Y) 23 | STD 1,X 24 | LDB 0,X 25 | ADCB 0,Y 26 | STB 0,X 27 | ENDM 28 | * 29 | ************************************************* 30 | * 31 | * XSBTRY -- 32 | * 33 | * MACRO TO SUBTRACT 9-BYTE FRACTION POINTED 34 | * TO BY Y-REG FROM THAT AT X-REG, RESULT STORED 35 | * X-REG. IT IS EFFICIENT. 36 | * 37 | XSBTRY MACR 38 | LDD 7,X 39 | SUBD 7,Y 40 | STD 7,X 41 | LDD 5,X 42 | SBCD (5,Y) 43 | STD 5,X 44 | LDD 3,X 45 | SBCD (3,Y) 46 | STD 3,X 47 | LDD 1,X 48 | SBCD (1,Y) 49 | STD 1,X 50 | LDB 0,X 51 | SBCB 0,Y 52 | STB 0,X 53 | ENDM 54 | * 55 | ************************************************************ 56 | * 57 | * ADCD 58 | * 59 | * ADCD SIMULATES WHAT WOULD BE THE ACTION OF A 60 | * ADDD W/ CARRY INSTRUCTION IF IT EXISTED, ALAS IT 61 | * DOESN'T SO IT IS DONE USING THE ADCA & ADCB INSTRUCTIONS 62 | * 63 | * TO INVOKE ADCD: ADCD 64 | * NOTE: MUST ONLY USE CONSTANT OFFSETS 65 | * 66 | ADCD MACR 67 | * 68 | ADCB (1+\0) 69 | ADCA \0 70 | * 71 | ENDM 72 | * 73 | ************************************************************ 74 | * 75 | * SBCD 76 | * 77 | * SBCD SIMULATES WHAT WOULD BE THE ACTION OF A 78 | * SUBD W/ CARRY INSTRUCTION IF IT EXISTED, ALAS IT 79 | * DOESN'T SO IT IS DONE USING THE SBCA & SBCB INSTRUCTIONS 80 | * 81 | * TO INVOKE SBCD: SBCD 82 | * NOTE: MUST ONLY USE CONSTANT OFFSETS 83 | * 84 | SBCD MACR 85 | * 86 | SBCB (1+\0) 87 | SBCA \0 88 | * 89 | ENDM 90 | * 91 | * 92 | -------------------------------------------------------------------------------- /sbc/mc6839/src/NOL.SA: -------------------------------------------------------------------------------- 1 | OPT NOL 2 | -------------------------------------------------------------------------------- /sbc/mc6839/src/NOMEX.SA: -------------------------------------------------------------------------------- 1 | OPT NOMEX 2 | -------------------------------------------------------------------------------- /sbc/mc6839/src/NOTRAP.SA: -------------------------------------------------------------------------------- 1 | NAM NOTRAP 2 | TTL OVERFLOW/UNDERFLOW NO TRAP HANDLERS 3 | * 4 | * LINKING LOADER DEFINITIONS 5 | * 6 | XDEF UNFLNT,OVFLNT,MAXTBL,MINTBL 7 | * 8 | XREF ROUND,TFRACT,MOVE,INFIN,NAN,ZERO,LARGE 9 | XREF FILSKY,DENORM,FPMOVE,DNMTBL 10 | * 11 | * REVISION HISTORY: 12 | * DATE PROGRAMMER REASON 13 | * 14 | * 28.MAY.80 G. STEVENS ORIGINAL 15 | * 03.AUG.80 G. STEVENS FIX MIN & MAX TABLES 16 | * 13.AUG.80 G. STEVENS REWRITE UNFLNT W/ UTILITIES 17 | * 21.AUG.80 G. STEVENS REWORK NOTRAP AND FIX TYPO 18 | * 22.AUG.80 G. STEVENS SET INEXACT FLAG IN OVFLNT 19 | * 25.AUG.80 G. STEVENS USE NEW TABLE IN UNFLNT 20 | * 27.AUG.80 J. BONEY FIX TYPOS IN OVFLNT 21 | * 05.SEP.80 G. STEVENS CLEAR ERROVF IN OVFLNT 22 | * 03.OCT.80 G. STEVENS FIX BITCNT TBL. REF. IN UNFLNT 23 | * 08.DEC.80 J. BONEY OVFLNT-CHANGED BRA CLROVF TO BSR CLROVF 24 | * 25 | PAGE 26 | * 27 | * 28 | * HERE IS A BUNCH OF COMMONLY USED TABLES 29 | * 30 | * 31 | * MAX EXPONENT TABLE 32 | * 33 | MAXTBL FDB SMAXEX SINGLE 34 | FDB DMAXEX DOUBLE 35 | FDB EMAXEX EXTENDED 36 | FDB EMAXEX EXT. FORCE TO SINGLE 37 | FDB EMAXEX EXT. FORCE TO DOUBLE 38 | * 39 | * MIN EXPONENT TABLE 40 | * 41 | MINTBL FDB SMINEX SINGLE 42 | FDB DMINEX DOUBLE 43 | FDB EMINEX EXTENDED 44 | FDB EMINEX EXT. FORCE TO SINGLE 45 | FDB EMINEX EXT. FORCE TO DOUBLE 46 | * 47 | * 48 | * 49 | * BIT COUNT TABLE ( TELLS HOW MANY BITS 50 | * OF SIGNIFICANCE THERE GIVEN A CERTAIN 51 | * PRECISION ) 52 | * 53 | BITCNT FDB 25 SINGLE 54 | FDB 54 DOUBLE 55 | FDB 65 EXTENDED 56 | FDB 25 EXT. FORCE TO SINGLE 57 | FDB 54 EXT. FORCE TO DOUBLE 58 | * 59 | * 60 | * HERE ARE THE "NO TRAP" OVERFLOW AND UNDERFLOW 61 | * HANDLERS. 62 | * 63 | ****************************************************************** 64 | * 65 | * SUBROUTINE UNFLNT 66 | * 67 | * UNFLNT HANDLES UNDERFLOW WHEN THE UNDERFLOW 68 | * TRAP IS DISABLED. 69 | * 70 | * ON ENTRY: STCK FRAME RESULT CONTAINS INPUT ARGUMENT. 71 | * U - POINTER TO THE STACK FRAME 72 | * 73 | * ON EXIT: STACK FAME RESULT CONTAINS A DENORMALIZED 74 | * VALUE OR TRUE ZERO. 75 | * U,S - UNCHANGED 76 | * X,Y,D,CC - DESTROYED 77 | * 78 | * OPERATION: 79 | * THE RESULT IS DENORMALIZED ROUNDED AND SET TO 80 | * A TRUE ZERO IF NECCESSARY. IF THE ROUNDING MODE IS 81 | * NOT EITHER ROUND TO - INFINITY OR + INFINITY, THEN 82 | * THE UNDERFLOW FLAG IS SET. 83 | * 84 | * 85 | UNFLNT EQU * 86 | * 87 | * GET PROPER MIN. EXPONENT 88 | * 89 | LEAY BITCNT,PCR 90 | LEAX DNMTBL,PCR EXPONENT TABLE 91 | LDB RPREC,U DETERMONE PRECISION 92 | ABX PTR INTO EXPONENT TABLE 93 | LEAY B,Y PTR INTO BITCNT TABLE 94 | * 95 | * TAKE DIFFERENCE OF MIN. AND ACTUAL 96 | * EXPONENTS 97 | * 98 | LDD 0,X 99 | SUBD EXPR,U 100 | * 101 | * IF THE EXPONENT DIFFERENCE MEANS THAT THE FRACTION 102 | * AND THE GUARD BIT WILL BECOME ZERO UPON DENORMALIZING 103 | * THEN JUST OR THESE BITS INTO THE STIKY AND ZERO THEM OUT. 104 | * 105 | LEAX RESULT,U 106 | IF D,GT,(0,Y) 107 | LBSR FILSKY FILL STIKY 108 | * 109 | * ELSE DENORMALIZE THE FRACTION AS PLANNED 110 | * 111 | ELSE 112 | LBSR DENORM DENORMALIZE THE FRACTION 113 | * 114 | ENDIF 115 | * 116 | LBSR ROUND ROUND RESULT 117 | * 118 | * IF THE FRACTION BECAME ZERO AS A RESULT OF DENORMALIZING 119 | * AND ROUNDING, THEN SET THE RESULT TO A TRUE ZERO. 120 | * 121 | LBSR TFRACT 122 | IFCC EQ FRACTION IS ZERO 123 | LDD #$8000 ZERO EXPONENT 124 | STD EXPR,U 125 | LDA #TYZERO ZERO TYPE 126 | STA TYPER,U 127 | * 128 | * ELSE SET THE PROPER DENORMALIZED EXPONENT 129 | * 130 | ELSE 131 | LEAX MINTBL,PCR MINIMUM EXPONENT TABLE 132 | LDB RPREC,U PRECISION INDEX 133 | LDD B,X DENORMALIZED EXPONENT 134 | STD EXPR,U 135 | * 136 | ENDIF 137 | * 138 | * CHECK ROUNDING MODE; IF NOT RN OR RP THEN CLEAR 139 | * THE UNDERFLOW FLAG. 140 | * 141 | LDA [PFPCB,U] CONTROL BYTE IN FPCB 142 | ANDA #CTLRND ROUND BITS 143 | IF A,NE,#RN NOT RP 144 | IF A,NE,#RZ NOT RM 145 | LDA TSTAT,U 146 | ANDA #$FF-ERRUNF CLEAR UNDERFLOW FLAG 147 | STA TSTAT,U 148 | * 149 | ENDIF 150 | ENDIF 151 | * 152 | * 153 | RTS RETURN 154 | * 155 | * 156 | * 157 | PAG 158 | * 159 | ***************************************************************** 160 | * 161 | * SUBROUTINE OVFLNT 162 | * 163 | * OVFLNT HANDLES THE OVERFLOW WHEN THE OVERFLOW 164 | * TRAP IS DISABLED. 165 | * 166 | * ON ENTRY: STACK FRAME RESULT CONTAINS THE INPUT 167 | * ARGUMENT 168 | * 169 | * ON EXIT: U,S - UNCHANGED 170 | * X,Y,D,CC - DESTROYED 171 | * 172 | * 173 | OVFLNT EQU * 174 | * 175 | LDA TSTAT,U 176 | ORA #ERRINX SET INEXACT RESULT BIT 177 | STA TSTAT,U 178 | * 179 | * CASE( ROUNDING MODE ) TO DETERMINE ACTION 180 | * TO BE TAKEN. 181 | * 182 | LDA [PFPCB,U] CONTROL WORD 183 | ANDA #CTLRND ROUNDING BITS 184 | * 185 | * CASE OF ROUND TO MINUS INFINITY 186 | * 187 | IF A,EQ,#RM 188 | BSR CLROVF CLEAR OVERFLOW FLAG 189 | * 190 | LDA RESULT,U 191 | IFCC GE RESULT POSITIVE 192 | LDA FRACTR,U 193 | * 194 | * IF RESULT IS POSITIVE AND NORMALIZED 195 | * THEN DELIVER LARGEST POSSIBLE NUMBER 196 | * TO DESTINATION. 197 | * 198 | IFCC LT RESULT NORMALIZED 199 | LEAX LARGE,PCR LARGE CONSTANT 200 | BSR MVRES MOVE TO RESULT 201 | * 202 | ENDIF 203 | * 204 | * ELSE IF RESULT POSITIVE AND NOT NORMALIZED 205 | * THEN DELIVER SIGNIFICAND AND LARGEST 206 | * EXPONENT TO DESTINATION. 207 | * 208 | BSR SETEXP SET LARGEST EXPONENT 209 | * 210 | * ELSE IF THE RESULT IS NEGATIVE THEN RETURN 211 | * MINUS INFINITY TO DESTINATION. 212 | * 213 | ELSE RESULT IS NEGATIVE 214 | LEAX INFIN,PCR INFINITY CONSTANT 215 | BSR MVNRES MOVE TO RESULT AND NEGATE 216 | * 217 | ENDIF RESULT IS POSITIVE 218 | * 219 | * CASE OF ROUND TO PLUS INFINITY 220 | * 221 | ELSE 222 | IF A,EQ,#RP 223 | BSR CLROVF 224 | * 225 | LDA RESULT,U 226 | IFCC LT RESULT NEGATIVE 227 | LDA FRACTR,U 228 | * 229 | * IF THE RESULT IS NEGATIVE AND NORMALIZED 230 | * THEN DELIVER LARGEST NEGATIVE NUMBER TO 231 | * DESTINATION. 232 | * 233 | IFCC LT RESULT NORMALIZED 234 | LEAX LARGE,PCR LARGE CONSTANT 235 | BSR MVNRES MOVE TO RESULT AND SET NEGATIVE 236 | * 237 | ENDIF 238 | * 239 | * ELSE IF RESULT IS NEGATIVE AND NOT NORMALIZED 240 | * THEN DELIVER SIGNIFICAND AND LARGEST EXPONENT 241 | * TO DESTINATION. 242 | * 243 | BSR SETEXP SET EXPONENT GIVEN THE PRECISION 244 | * 245 | * ELSE IF THE RESULT IS POSITIVE THEN 246 | * DELIVER PLUS INFINITY TIO DESTINATION 247 | * 248 | ELSE RESULT IS POSITIVE 249 | LEAX INFIN,PCR INFINITY CONSTANT 250 | BSR MVRES MOVE TO RESULT 251 | * 252 | ENDIF RESULT IS NEGATIVE 253 | * 254 | * CASE OF ROUND TO NEAREST OR ZERO 255 | * 256 | ELSE 257 | * 258 | * RETURN INFINITY FO PROPER SIGN 259 | * 260 | LEAX INFIN+1,PCR INFINITY CONSTANT 261 | LEAY EXPR,U DESTINATION 262 | LDB #ARGSIZ-1 263 | LBSR MOVE 264 | * 265 | ENDIF 266 | ENDIF CASE( ROUNDING MODE ) 267 | * 268 | RTS RETURN 269 | * 270 | * 271 | * PROCEDURE CLROVF 272 | * 273 | * CLEARS THE OVERFLOW FLAG IN TSTAT 274 | * 275 | CLROVF EQU * 276 | * 277 | LDA TSTAT,U CLEAR OVERFLOW FLAG 278 | ANDA #$FF-ERROVF 279 | STA TSTAT,U 280 | * 281 | RTS RETURN 282 | * 283 | * 284 | * PROCEDURE SETEXP 285 | * 286 | * INSERTS LARGEST EXPONENT INTO THE EXPONENT FIELD OF THE RESULT 287 | * 288 | SETEXP EQU * 289 | * 290 | LDB RPREC,U DETERMINE PRECISION 291 | LEAX MAXTBL,PCR EXPONENT TABLE 292 | LDD B,X 293 | SUBD #01 294 | STD EXPR,U 295 | * 296 | RTS RETURN 297 | * 298 | * 299 | * PROCEDURE MVRES 300 | * 301 | * MOVES THE STACK FRAME ARGUMENT POINTED AT BY THE X-REG. TO 302 | * THE STACK FRAME RESULT 303 | * 304 | MVRES EQU * 305 | * 306 | LEAY RESULT,U DESTINATION 307 | LBSR FPMOVE 308 | * 309 | RTS RETURN 310 | * 311 | * 312 | * PROCEDURE MVNRES 313 | * 314 | * MOVES THE STACK FRAME ARGUMENT POINTED AT BY THE X-REG. TO 315 | * THE STACK FRAME RESULT AND MAKES THE RESULT NEGATIVE 316 | * 317 | MVNRES EQU * 318 | * 319 | LEAY RESULT,U DESTINATION 320 | LBSR FPMOVE 321 | LDA #$80 322 | STA SIGNR,U 323 | * 324 | RTS RETURN 325 | * 326 | * 327 | PAG 328 | * 329 | -------------------------------------------------------------------------------- /sbc/mc6839/src/OLDISPAT.SA: -------------------------------------------------------------------------------- 1 | NAM DISPCH 2 | TTL DISPATCH OPERATION THROUGH THE FUNCTION TABLES 3 | * 4 | * LINKING LOADER DEFINITONS 5 | * 6 | XDEF DISPAT 7 | * 8 | XREF FMUL 9 | XREF FADD,CHKZER,CHKINF 10 | XREF FDIV,DIVZER 11 | XREF FREM 12 | XREF FSQRT,SQINCK 13 | XREF GETINT 14 | XREF MAGCMP,CMPZER,CMPINF,NANCMP,INFAR1 15 | XREF INFAR2,ARG1UN,ARG2UN,BOTHUN 16 | XREF FFIX,BIGINT 17 | XREF BDCNVT,OUTNDC 18 | XREF FMOVE,MOVUN 19 | XREF FABS,FNEG 20 | XREF RTAR1,RTAR2,RTNAN,RTINF,RTDNAN 21 | XREF RTZERO,NAN1,NAN3,NAN4,NAN9,NAN10 22 | XREF ROMSTR 23 | XREF DECBIN,FLOAT 24 | * 25 | * REVISION HISTORY: 26 | * 27 | * DATE PROGRAMMER REASON 28 | * 29 | * 01.JUL.80 G. STEVENS ORIGINAL 30 | * 31 | PAGE 32 | *************************************************** 33 | * 34 | * DISPAT -- 35 | * THIS SUBROUTINE USES THE FUNCTION CODE TO 36 | * SELECTION A FUNCTION TABLE. IT THEN USES THE TYPES 37 | * OF THE ARGUMENTS TO JUMP THROUGH THE ADDRESSES IN 38 | * THE FUNCTION TABLE TO THE PROPER SUBROUTINE TO 39 | * PERFORM THE FUNCTION. 40 | * 41 | * NO REGISTERS ARE PRESERVED; ALL RELEVANT STATE 42 | * IS STORED IN THE STACK FRAME. 43 | * 44 | ************************ 45 | * 46 | * ADRTBL -- 47 | * THIS MACRO CREATES A TABLE OF ADDRESSES RELATIVE TO 48 | * THE START OF THE ROM. IT CAN BE CALLED WITH FROM ONE TO 49 | * FIVE ARGUMENTS, WHICH ARE THE ENTRY POINTS TO TABLES 50 | * OR ROUTINES IN THE ROM. 51 | * 52 | ADRTBL MACR 53 | IFEQ NARG-5 54 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR,\3-ROMSTR,\4-ROMSTR 55 | EXIT 56 | ENDC 57 | IFEQ NARG-4 58 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR,\3-ROMSTR 59 | EXIT 60 | ENDC 61 | IFEQ NARG-3 62 | FDB \0-ROMSTR,\1-ROMSTR,\2-ROMSTR 63 | EXIT 64 | ENDC 65 | IFEQ NARG-2 66 | FDB \0-ROMSTR,\1-ROMSTR 67 | EXIT 68 | ENDC 69 | IFEQ NARG-1 70 | FDB \0-ROMSTR 71 | EXIT 72 | ENDC 73 | ENDM 74 | * 75 | * THE FOLLOWING TABLE IS INDEXED BY THE (FUNCTION NUMBER-1) 76 | * AND CONTAINS THE ADDRESSES OF THE FUNCTION TABLES FOR 77 | * EACH FLOATING-POINT OPERATION. 78 | * 79 | FUNTBL EQU * 80 | ADRTBL ADDTBL,SUBTBL,MULTBL,DIVTBL,REMTBL 81 | ADRTBL CMPTBL,CMPTBL,CMPTBL,CMPTBL,SQRTBL 82 | ADRTBL INTTBL,FIXTBL,FIXTBL,MOVTBL,BNDTBL 83 | ADRTBL ABSTBL,NEGTBL 84 | ADRTBL DECBIN,FLOAT,FLOAT 85 | PAGE 86 | * 87 | * 88 | * ENTER HERE ON DISPAT CALL 89 | * 90 | * FIRST GET THE ADDRESS OF THE TABLE FOR A PARTICULAR 91 | * FLOATING-POINT COMMAND. 92 | * 93 | DISPAT EQU * 94 | LDB FUNCT,U GET FUNCTION CODE 95 | ANDB #$3F MASK OUT OPCODE NBR 96 | IF B,EQ,#FCSUB 97 | LDA ARG2,U 98 | EORA #$80 FOR SUBTRACT, CHANGE SIGN 99 | STA ARG2,U AND ADD 100 | ENDIF 101 | LEAY FUNTBL,PCR 102 | CMPB #FCNOJP UNLESS OPERATOR HAS NO 103 | BGE DSJMP TABLE 104 | LDD B,Y OFFSET OF FUNCTION LOOKUP 105 | LEAY ROMSTR,PCR 106 | LEAY D,Y ADDR IS NOW IN Y 107 | * 108 | * NOW CREATE OFFSET IN OPERATION 109 | * TABLE USING TYPES OF OPERANDS. IT IS 110 | * ASSUMED THAT A NON-EXISTENT ARGUMENT 111 | * HAS A TYPE OF ZERO. 112 | * 113 | LDA TYPE1,U 114 | LDB #5 115 | MUL 116 | ADDB TYPE2,U OFFSET = TYP1*5 + TYP2 117 | * 118 | * NOW GET PROCESSING ROUTINE OUT 119 | * OF OPERATION TABLE AND JSR TO IT. 120 | * 121 | DSJMP LDD B,Y 122 | LEAY ROMSTR,PCR 123 | JSR D,Y JUMP TO PROCESSING SUBROUTINE 124 | * 125 | * HERE IS COMMON RETURN POINT FOR ALL 126 | * PROCESSING ROUTINES. 127 | * 128 | RTS 129 | * 130 | PAGE 131 | * 132 | ******************************************* 133 | * 134 | * OPERATION DEFINITION TABLES 135 | * 136 | * THE FOLLOWING TABLES CONTAIN ADDRESS 137 | * OF THE SUBROUTINES THAT OPERATE ON 138 | * ARGUMENTS OF VARIOUS TYPES. THE TABLES 139 | * ARE ORGANIZED BY COLUMNS, I.E. EACH 140 | * 'ADRTBL' LINE IN A TABLE BELOW CORRESPONDS 141 | * TO A ROW IN THE TABLE IN THE MOTOROLA SPEC. 142 | * 143 | MULTBL EQU * 144 | ADRTBL FMUL,RTZERO,RTINF,RTAR1,FMUL 145 | ADRTBL RTZERO,RTZERO,NAN9,RTAR1,RTZERO 146 | ADRTBL RTINF,NAN9,RTINF,RTAR1,RTINF 147 | ADRTBL RTAR2,RTAR2,RTAR2,RTDNAN,RTAR2 148 | ADRTBL FMUL,RTZERO,RTINF,RTAR1,FMUL 149 | * 150 | * TABLE FOR ADD/SUBTRACT 151 | * 152 | ADDTBL EQU * 153 | SUBTBL EQU * 154 | ADRTBL FADD,FADD,RTAR1,RTAR1,FADD 155 | ADRTBL FADD,CHKZER,RTAR1,RTAR1,RTAR1 156 | ADRTBL RTAR2,RTAR2,CHKINF,RTAR1,RTAR2 157 | ADRTBL RTAR2,RTAR2,RTAR2,RTDNAN,RTAR2 158 | ADRTBL FADD,RTAR2,RTAR1,RTAR1,FADD 159 | * 160 | * TABLE FOR DIVISION 161 | * 162 | DIVTBL EQU * 163 | ADRTBL FDIV,RTZERO,RTINF,RTAR1,FDIV 164 | ADRTBL DIVZER,NAN4,RTINF,RTAR1,DIVZER 165 | ADRTBL RTZERO,RTZERO,NAN4,RTAR1,RTZERO 166 | ADRTBL RTAR2,RTAR2,RTAR2,RTDNAN,RTAR2 167 | ADRTBL NAN4,RTZERO,RTINF,RTAR1,NAN4 168 | * 169 | * TABLE FOR REMAINDER 170 | * 171 | REMTBL EQU * 172 | ADRTBL FREM,RTAR1,NAN10,RTAR1,FREM 173 | ADRTBL NAN10,NAN10,NAN10,RTAR1,NAN10 174 | ADRTBL RTAR1,RTAR1,NAN10,RTAR1,RTAR1 175 | ADRTBL RTAR2,RTAR2,RTAR2,RTDNAN,RTAR2 176 | ADRTBL NAN10,NAN10,NAN10,RTAR1,NAN10 177 | * 178 | * TABLE FOR SQUARE ROOT 179 | * 180 | SQRTBL EQU * 181 | ADRTBL FSQRT,RTAR2,SQINCK,RTAR2,NAN1 182 | * 183 | * TABLE INTEGER PART 184 | * 185 | INTTBL EQU * 186 | ADRTBL GETINT,RTAR2,RTAR2,RTAR2,GETINT 187 | * 188 | * TABLE FOR ALL FOUR COMPARE OPERATIONS 189 | * 190 | CMPTBL EQU * 191 | ADRTBL MAGCMP,MAGCMP,INFAR1,NANCMP,ARG1UN 192 | ADRTBL MAGCMP,CMPZER,INFAR1,NANCMP,MAGCMP 193 | ADRTBL INFAR2,INFAR2,CMPINF,NANCMP,INFAR2 194 | ADRTBL NANCMP,NANCMP,NANCMP,NANCMP,NANCMP 195 | ADRTBL ARG2UN,MAGCMP,INFAR1,NANCMP,BOTHUN 196 | * 197 | * TABLE FOR FP-TO-BINARY INTEGER 198 | * 199 | FIXTBL EQU * 200 | ADRTBL FFIX,RTZERO,BIGINT,NAN3,FFIX 201 | * 202 | * TABLE FOR FP TO DECIMAL STRING CONVERSION 203 | * 204 | BNDTBL EQU * 205 | ADRTBL BDCNVT,OUTNDC,OUTNDC,OUTNDC,BDCNVT 206 | * 207 | * TABLE FOR MOVE OPERATION 208 | * 209 | MOVTBL EQU * 210 | ADRTBL FMOVE,RTAR2,RTAR2,RTAR2,MOVUN 211 | * 212 | * TABLE FOR ABSOLUTE VALUE FUNCTION 213 | * 214 | ABSTBL EQU * 215 | ADRTBL FABS,FABS,FABS,RTAR2,FABS 216 | * 217 | * TABLE FOR NEGATE FUNTION FUNCTION 218 | * 219 | NEGTBL EQU * 220 | ADRTBL FNEG,FNEG,FNEG,RTAR2,FNEG 221 | * 222 | -------------------------------------------------------------------------------- /sbc/mc6839/src/PROCS.SA: -------------------------------------------------------------------------------- 1 | * 2 | NAM PROCS 3 | * 4 | * LINKING LOADER DEFINITIONS 5 | * 6 | XDEF TFRACT,LNORM,SNORM,PREC,SIZE,SIZTAB,ENORM 7 | * 8 | * REVISION HISTORY: 9 | * 10 | * DATE PROGRAMMER REASON 11 | * 12 | * 28.MAY.80 G. STEVENS ORIGINAL 13 | * 06.JUN.80 G. STEVENS FIX TFRACT 14 | * 10.JUL.80 J. BONEY CHANGE TFRACT,SNORM 15 | * 15.JUL.80 J. BONEY MAKE ENORM,SNORM & LNORM 16 | * USE MUTUAL CODE. 17 | * 19.AUG.80 G. STEVENS LNORM SETS TYPE PROPERLY 18 | * 20.AUG.80 J. BONEY SPEED UP TFRACT 19 | * 08.0CT.80 G. STEVENS CORRECT STACK OFFSET IN ENORM 20 | * 09.OCT.80 G. STEVENS CORRECT ADDR. MODE IN TFRACT 21 | * 22 | PAGE 23 | * 24 | ****************************************************** 25 | * 26 | * G L O B A L P R O C E D U R E S 27 | * 28 | ******************************************************** 29 | * 30 | * 31 | * THESE PROCEDURES ARE USED BY ALL MODULES AND 32 | * HENCE ARE GLOBAL. 33 | * 34 | * IF THESE PROCEDURES NEED SUB-PROCEDURES, THEY ARE 35 | * INCLUDED HERE. IF THE SUB-PROCEDURES ARE 36 | * GENERAL PURPOSE, THEY ARE CONSIDERED PROCEDURES 37 | * IN THEIR OWN RIGHT 38 | * 39 | * IF PROCEDURES ARE ONLY USED LOCALLY BY A MODULE 40 | * THEY ARE NOT INCLUDED HERE. THEY ARE 41 | * IN THE MODULE THAT USES THEM 42 | * 43 | * 44 | * 45 | ****************************************************** 46 | * 47 | * 48 | ************* 49 | * 50 | * TFRACT - TEST FRACTION FOR ZERO 51 | * AND SETS THE Z BIT IF THE RESULT IS ZERO 52 | * 53 | * ENTRY: 54 | * X = POINTER TO ARGUMENT ON STACK FRAME 55 | * 56 | * EXIT: 57 | * D = DESTROYED 58 | * Z = 1 IF ALL FRACTION BITS ARE ZERO 59 | * 60 | *************** 61 | * 62 | TFRACT EQU * 63 | LDD FRACT,X TEST FOR ZERO 2 BYTES AT A TIME 64 | BNE TFOUT 65 | LDD FRACT+2,X 66 | BNE TFOUT EXIT AS SOON AS A NON ZERO WORD OCCURS 67 | LDD FRACT+4,X 68 | BNE TFOUT 69 | LDD FRACT+6,X 70 | BNE TFOUT 71 | LDA FRACT+8,X CHECK LAST BYTE 72 | TFOUT EQU * 73 | RTS EXIT WITH Z 74 | * 75 | PAGE 76 | * 77 | ****************************************************** 78 | * 79 | * LNORM,SNORM - NORMALIZE A NUMBER 80 | * THAT IS IN INTERNAL FORM 81 | * 82 | * ON ENTRY: X POINTS TO THE ARGUMENT ON THE STACK FRAME 83 | * 84 | * ON EXIT: THE NUMBER POINTED TO BY X IS NORMALIZED 85 | * Z IS SET IF FRACTION WAS ZERO. ALSO THE 86 | * NUMBER IS SET TO TRUE ZERO 87 | * V IS SET IF NUMBER BECAME DENORMALIZED 88 | * DURING NORMALIZATION. 89 | * Z AND V ARE CLEARED OTHERWISE 90 | * 91 | * NOTE: MUCH OF THE CODE IS SHARED WITH THE 'ENORM' 92 | * PROCEDURE. IT IS IDENTICAL TO SNORM/LNORM EXCEPT 93 | * FOR ITS LOOP TERMINATION CONDITIONS. THEREFORE 94 | * SNORM/LNORM PUSH A FLAG ON THE STACK THAT IS USED 95 | * BY THE MUTUAL CODE TO DETERMINE WHICH LOOP TERMINATOR 96 | * TO USE. 97 | ******************************************************** 98 | * 99 | SNORM EQU * DOUBLE ENTRY FOR THIS ROUTINE 100 | LNORM EQU * 101 | PSHS D,Y SAVE CALLER'S REGS 102 | CLR TYPE,X SET TYPE TO NORMALIZED 103 | CLR ,-S FLAG = 0 = SNORM,LNORM CALL 104 | * 105 | MUTNRM EQU * ENORM ENTRY PT. 106 | * 107 | BSR TFRACT IF FRACTION = 0 THEN 108 | IFCC EQ 109 | MOVD #$8000,(EXP,X) SET TO ZERO 110 | MOVA #TYZERO,(TYPE,X) CHANGE TYPE TO ZERO 111 | ORCC #Z SET Z BIT (V=0) 112 | BRA SNOUT EXIT 113 | ENDIF 114 | LDY EXP,X PUT EXPONENT IN REG FOR SPEED 115 | LDA FRACT,X PUT MSB OF FRACTION IN REG FOR SPEED 116 | IFTST (,S),EQ,#0 SNORM/LNORM CALL 117 | TSTA EXIT IF ALREADY 118 | BMI SNOUT NORMALIZED. 119 | * 120 | ELSE ENORM CALL 121 | IF Y,LE,(3,S) EXIT IF ALREADY 122 | BRA SNOUT AT ORIGINAL EXPONENT 123 | * 124 | ENDIF 125 | * 126 | ENDIF 127 | * 128 | SNLOOP EQU * 129 | DECY . DEC EXPONENT 130 | IF Y,EQ,#$8000 IF DOWN TO MIN EXPONENT THEN 131 | STA FRACT,X RESTORE FRACCTION AND EXPONENT 132 | STY EXP,X 133 | MOVA #TYNNRM,(TYPE,X) CHANGE TYPE TO NOT NORMALIZED 134 | ORCC #V SET V BIT (Z=0) 135 | BRA SNOUT EXIT 136 | ENDIF 137 | LSL FRACT+8,X SHIFT FRACTION 1 BIT LEFT 138 | ROL FRACT+7,X 139 | ROL FRACT+6,X 140 | ROL FRACT+5,X 141 | ROL FRACT+4,X 142 | ROL FRACT+3,X 143 | ROL FRACT+2,X 144 | ROL FRACT+1,X 145 | ROLA 146 | IFTST (,S),EQ,#0 IF SNORM/LNORM CALL 147 | TSTA BRANCH IF NOT 148 | BPL SNLOOP YET NORMALIZED 149 | * 150 | ELSE ENORM CALL 151 | IF Y,GT,(3,S) BRANCH IF NOT YET 152 | BRA SNLOOP ORIGINAL EXPONENT 153 | * 154 | ENDIF 155 | * 156 | ENDIF 157 | STA FRACT,X RESTORE FRCT AND EXPONENT 158 | STY EXP,X 159 | ANDCC #$F9 CLEAR Z AND V BIT 160 | SNOUT EQU * 161 | LEAS 1,S CLEAN UP STACK 162 | PULS D,Y,PC RESTORE AND RETURN 163 | PAGE 164 | ******************************************************** 165 | * 166 | * ENORM - NORMALIZE AN EXTENDED PRECISION NUMBER 167 | * THAT IS IN INTERNAL FORM TO ITS ORIGINAL 168 | * PRECISION 169 | * 170 | * ON ENTRY: X POINTS TO ARGUMENT ON THE STACK FRAME 171 | * Y CONTAINS ORIGINAL EXPONENT OF THE ARG. 172 | * 173 | * ON EXIT: THE NUMBER POINTED TO BY X IS NORMALIZED 174 | * TO IT'S ORIGINAL PRECISION. 175 | * Z IS SET IF THE FRACTION WAS ZERO. ADDITIONALLY 176 | * THE NUMBER IS SET TO A TRUE ZERO 177 | * V IS SET IF THE NUMBER BECAME DENORMALIZED 178 | * DURING NORMALIZATION. 179 | * 180 | * NOTE: MOST NUMBERS LEAVE THIS ROUTINE UNNORMALIZED. 181 | * SINCE THE INNER PORTION OF THE LOOP OF THIS ALGORITHM 182 | * WAS ALMOST IDENTICAL TO SNORM/LNORM THEY WERE COMBINED. 183 | * A FLAG IS PUSHED ONTO THE STACK BEFORE THE CALL TO 184 | * THE MUTUAL CODE TO DIFFERENTIATE THE UNSIMILAR CODE. 185 | * 186 | *********************************************************** 187 | * 188 | ENORM PSHS D,Y SAVE CALLERS'S REGS 189 | LDB #1 SET FLAG FOR 190 | STB ,-S ENORM CALL 191 | BRA MUTNRM GO JOIN MUTUAL NORM. CODE 192 | * 193 | PAGE 194 | * 195 | ************************************************************ 196 | * 197 | * P R E C 198 | * 199 | * THIS ROUTINE DETERMINES THE PRECISION OF AN ARGUMENT IN 200 | * USER MEMORY. THE VALUE RETURNED IS AN INDEX 201 | * DEFINED AS: 202 | * SINGLE = 0 203 | * DOUBLE = 2 204 | * EXTENDED = 4 205 | * EXTENDED ROUNDED TO SINGLE = 6 206 | * EXTENDED ROUNDED TO DOUBLE = 8 207 | * 208 | * PREC KNOWS ABOUT MOV AND CMP AND WILL RETURN THE 209 | * PROPER PRECISION INDEX. 210 | * 211 | * ENTRY: 212 | * U = POINTER TO STACK FRAME 213 | * FOR CMP B = 0 FOR ARG1; B.NE.0 FOR ARG2 214 | * FOR MOV B = 0 FOR ARG2; B.NE.0 FOR RESULT 215 | * FOR ALL OTHERS B IS A DON'T CARE 216 | * 217 | * EXIT; 218 | * B = PRECISION INDEX 219 | * Z = 1 IFF B = 0 220 | * ALL REGISTERS RESTORED EXCEPT CC BITS 221 | * 222 | * **** MAJOR REVISIONS ***** 223 | * REVISOR DATE REASON 224 | * JOEL BONEY 022980 ORIGINAL 225 | * JOEL BONEY 031980 FASTER 226 | * 227 | * 228 | *********************************************************** 229 | * 230 | PREC EQU * 231 | IFTST (FUNCT,U),GE,#0 IF NOT MIXED ARGUMENTS 232 | LDB [PFPCB,U] GET FPCB CONTROL WORD. BITS 5-7 ARE PRECISION 233 | LSRB POSITION PRECISION IN 4LSB 234 | LSRB 235 | LSRB 236 | LSRB 237 | ANDB #$0E PRECISION NOW 0,2,4,6 OR 8 238 | RTS ADIOS 239 | ELSE COMPARE OR MOVE 240 | PSHS A 241 | LDA TPARAM+1,U GET PRECISION BYTE FROM STACK 242 | IFTST B,EQ,#0 IF UPPER NYBBLE THEN 243 | ANDA #$70 POSITION IT 244 | LSRA 245 | LSRA 246 | LSRA 247 | ELSE LOWER NYBBLE 248 | ANDA #$7 POSITION IT 249 | LSLA 250 | ENDIF 251 | TFR A,B PUT RESULT IN B 252 | PULS A,PC EXIT 253 | ENDIF 254 | * 255 | * 256 | PAGE 257 | ************************************************************ 258 | * 259 | * S I Z E 260 | * 261 | * THIS ROUTINE DETERMINES THE SIZE OF AN ARGUMENT IN 262 | * USER MEMORY. THE VALUE RETURNED IS: 263 | * SINGLE = 4 264 | * DOUBLE = 8 265 | * EXTENDED = 10 266 | * 267 | * SIZE KNOWS ABOUT MOV AND CMP AND WILL RETURN THE 268 | * PROPER SIZE. 269 | * 270 | * ENTRY: 271 | * U = POINTER TO STACK FRAME 272 | * FOR CMP B = 0 FOR ARG1; B.NE.0 FOR ARG2 273 | * FOR MOV B = 0 FOR ARG2; B.NE.0 FOR RESULT 274 | * FOR ALL OTHERS B IS A DON'T CARE 275 | * 276 | * EXIT; 277 | * B = SIZE 278 | * ALL REGISTERS RESTORED EXCEPT CC BITS 279 | * 280 | * 281 | * ***** MAJOR REVISIONS ***** 282 | * REVISOR DATE REASON 283 | * JOEL BONEY 022980 ORIGINAL 284 | * 285 | *********************************************************** 286 | * 287 | SIZE EQU * 288 | PSHS X 289 | LEAX SIZTAB,PCR POINT TO SIZE TABLE 290 | BSR PREC GO GET PRECISION 291 | LSRB DIVIDE INDEX BY 2 292 | LDB B,X CONVERT TO SIZE 293 | PULS X,PC 294 | * 295 | * TABLE TO CONVERT PRECISION INDEX TO SIZE 296 | * 297 | SIZTAB EQU * 298 | FCB 4,8,10,10,10 299 | * 300 | * 301 | -------------------------------------------------------------------------------- /sbc/mc6839/src/TBL.SA: -------------------------------------------------------------------------------- 1 | NAM TABLE 2 | * 3 | * HERE IS A BUNCH OF COMMONLY USED TABLES 4 | * 5 | * 6 | * MAX EXPONENT TABLE 7 | * 8 | MAXTBL FDB SMAXEX SINGLE 9 | FDB DMAXEX DOUBLE 10 | FDB EMAXEX EXTENDED 11 | FDB SMAXEX EXT. FORCE TO SINGLE 12 | FDB DMAXEX EXT. FORCE TO DOUBLE 13 | * 14 | * MIN EXPONENT TABLE 15 | * 16 | MINTBL FDB SMINEX SINGLE 17 | FDB DMINEX DOUBLE 18 | FDB EMINEX EXTENDED 19 | FDB SMINEX EXT. FORCE TO SINGLE 20 | FDB DMINEX EXT. FORCE TO DOUBLE 21 | * 22 | * 23 | -------------------------------------------------------------------------------- /sbc/mc6839/src/UTIL.SA: -------------------------------------------------------------------------------- 1 | * 2 | NAM UTIL 3 | TTL UTILITARIAN ARITHMETIC SUPPORT ROUTINES 4 | * 5 | * DEFINE EXTERNAL REFERENCES 6 | * 7 | XDEF XSUBY,XADDY,NORMQK,NORM1,DNORM1,FPMOVE 8 | XDEF VALID,FRCTAB,BITTBL,SHIFTR,COMP2,FILSKY 9 | XDEF DENORM 10 | * 11 | XREF CKINVD,CHKOVF,CHKUNF,OVFLNT,UNFLNT,ROUND 12 | XREF TFRACT,ADBIAS,SUBIAS,GOSET 13 | * 14 | * 15 | * REVISION HISTORY: 16 | * DATE PROGRAMMER REASON 17 | * 18 | * 23.MAY.80 G.WALKER ORIGINAL 19 | * 1.JULY.80 G.WALKER REDUCE SIZE 20 | * 14.JUL.80 G. STEVENS REDUCE SIZE AND 21 | * ADD COMP2 ROUTINE 22 | * 30.JUL.80 G. WALKER CORRECT 'VALID' SO 'SUBIAS' 23 | * DOES NOT TRIGGER OVF TEST 24 | * 06.AUG.80 G. WALKER 'VALID': POINT X TO RSLT FOR ROUND 25 | * 12.AUG.80 G. STEVENS ADD FILSKY & DENORM UTILITIES 26 | * 06.OCT.80 G. STEVENS FIX ADDR. MODE ERROR IN FILSKY 27 | * 09.OCT.80 G.WALKER FIX G-BYTE OFFSET BACK TO ORIG 28 | * 12.DEC.80 G. STEVENS ADD CALL TO ROUND IN 'VALID' 29 | * 19.DEC.80 G. WALKER CHANGE IFCC CS TO IFCC EQ 30 | * IN DNORM1. 31 | * 32 | * 33 | PAG 34 | ****************************************************** 35 | * 36 | * TABLE OF FRACTION SIZES IN BYTES AND BITS. 37 | * 38 | FRCTAB FCB 4,7,9,4,7 PRECISION IN BYTES 39 | BITTBL FCB 26,55,66,26,55 PRECISION IN BITS + GUARD BIT 40 | * 41 | ************************************************* 42 | * 43 | * XSUBY -- 44 | * SUBTRACTS THE 9-BYTE FRACTION POINTED TO BY 45 | * XREG FROM THE 9-BYTE FRACTION POINTED TO BY 46 | * THE YREG. RESULT IS LEFT IN FRACTION POINTED BY 47 | * THE XREG. 48 | * BASHES D AND CC. 49 | * 50 | XSUBY EQU * 51 | XSBTRY SUBTRACT 9 BYTES AT X FROM BYTES AT Y 52 | RTS 53 | * 54 | ******************************************* 55 | * 56 | * NORMQK -- 57 | * PERFORMS A QUICK, MULTI-BIT NORMALIZE 58 | * ON THE INTERNAL FP NUMBER POINTED TO BY X. 59 | * BASHES D AND CC. 60 | * 61 | NORMQK EQU * 62 | LBSR TFRACT TEST FOR ZERO FRACTION 63 | IFCC NE 64 | NRMQA EQU * 65 | IFTST (FRACT,X),GE,#0 66 | CLRA 67 | LSHIFT FRACT,X,9 SHIFT FRACTION LEFT ONE BIT 68 | LDD EXP,X 69 | SUBD #1 DECREMENT EXPONENT TO COMPENSATE 70 | STD EXP,X FOR LEFT SHIFT OF FRACTION 71 | BRA NRMQA 72 | ENDIF 73 | ENDIF FRACTION IS NOT ZERO 74 | RTS 75 | * 76 | *************************************************** 77 | * 78 | * NORM1 -- 79 | * NORMALIZES THE INTERNAL FP NUMBER POINTED TO 80 | * BY THE X REGISTER ONE BIT TO THE LEFT ONLY. 81 | * BASHES D AND CC. 82 | * 83 | NORM1 EQU * 84 | CLRA CLEAR C BIT 85 | LSHIFT FRACT,X,9 86 | LDD EXP,X 87 | SUBD #1 88 | STD EXP,X 89 | RTS 90 | *************************************************** 91 | * 92 | * DNORM1 -- 93 | * DENORMALIZES THE INTERNAL FP NUMBER POINTED 94 | * TO BY THE X-REGISTER ONE BIT TO THE RIGHT. 95 | * THE CARRY BIT IS SHIFTED INTO THE MSB AND 96 | * THE EXPONENT IS INCREMENTED TO MAINTAIN THE 97 | * NUMBER UNCHANGED IN VALUE. 98 | * 99 | DNORM1 EQU * 100 | RSHIFT FRACT,X,9 101 | INC EXP+1,X 102 | IFCC EQ IF CARRY OUT, 103 | INC EXP,X PROPAGATE IT. 104 | ENDIF 105 | RTS 106 | ************************************************** 107 | * 108 | * XADDY -- 109 | * ADDS MANTISSA (9 BYTES LONG) POINTED TO 110 | * BY X-REGISTER TO MANTISSA POINTED TO BY Y-REGISTER 111 | * AND REPLACES X-MANTISSA WITH RESULT. THE CARRY 112 | * OUT OF THE HIGH-ORDER BYTE OF RESULT IS LEFT 113 | * IN THE CARRY FLAG OF THE CC-REGISTER. 114 | * BASHES: D AND CC. 115 | * 116 | XADDY EQU * 117 | XPLUSY ADD 9 BYTES AT X TO BYTES AT Y 118 | RTS 119 | ***************************************************** 120 | * 121 | * VALID -- 122 | * VALIDATES THE FLOATING-POINT RESULT AND 123 | * CALLS THE APPROPRIATE EXCEPTION-HANDLING 124 | * ROUTINES, IF NECESSARY. 125 | * 126 | VALID EQU * 127 | LBSR CHKUNF 128 | IFCC EQ IF UNDERFLOW 129 | LDX PFPCB,U 130 | LDA ENB,X 131 | ANDA #ENBUNF 132 | IFCC NE IF ENABLED 133 | LBSR ADBIAS 134 | LBSR ROUND DELIVER ROUNDED RESULT TO TRAP HANDLER 135 | ELSE 136 | LBSR UNFLNT 137 | ENDIF 138 | ELSE ROUND AND CHECK FOR OVERFLOW 139 | LEAX RESULT,U POINT X TO RESULT 140 | LBSR ROUND ROUND RESULT 141 | LBSR CKINVD CHECK FOR INVALID 142 | LBSR CHKOVF 143 | IFCC EQ IF OVERFLOW 144 | LDX PFPCB,U 145 | LDA ENB,X 146 | ANDA #ENBOVF 147 | IFCC NE************************** 148 | * 149 | * FPMOVE -- 150 | * MOVES A FLOATING-POINT NUMBER POINTED TO 151 | * BY XREG TO THE MEMORY POINTED TO BY YREG. NO 152 | * LOOP IS USED, SO IT IS VERY FAST. 153 | * 154 | * ON EXIT: NO REGISTERS CHANGED. 155 | * 156 | FPMOVE EQU * 157 | PSHS CC,D 158 | LDD 0,X MOVE OVER 2 BYTES AT A TIME 159 | STD 0,Y 160 | LDD 2,X 161 | STD 2,Y 162 | LDD 4,X 163 | STD 4,Y 164 | LDD 6,X 165 | STD 6,Y 166 | LDD 8,X 167 | STD 8,Y 168 | LDD 10,X 169 | STD 10,Y 170 | LDA 12,X 171 | STA 12,Y 172 | PULS CC,D,PC RESTORE REGS AND RETURN 173 | * 174 | ****************************************************** 175 | * 176 | * SHIFTR -- 177 | * THIS SUBROUTINE TAKES THE PLACE OF THE 9-BYTE 178 | * RIGHT SHIFT MACRO WHERE SPACE IS CRITICAL AND 179 | * TIME IS NOT. 180 | * 181 | SHIFTR EQU * 182 | RSHIFT 0,X,9 183 | RTS 184 | * 185 | ******************************************************** 186 | * 187 | * COMP2 -- 188 | * PREFORMS A TWO'S COMPLEMENT ON THE VALUE 189 | * POINTED AT BY THE X-REG. WHOSE LEAST SIGNIFICANT 190 | * BYTE IS GIVEN BY THE OFFSET IN THE B-REG. 191 | * 192 | COMP2 EQU * 193 | * 194 | TFR B,A SAVE OFFSET FOR FUTURE 195 | WHILE A,GE,#0 196 | COM A,X 197 | DECA 198 | * 199 | ENDWH 200 | * 201 | LDA #01 202 | WHILE B,GE,#0 203 | IFTST A,NE 204 | ADDA B,X 205 | STA B,X 206 | LDA #00 207 | ROLA 208 | * 209 | ELSE 210 | LDB #$FF 211 | * 212 | ENDIF 213 | DECB 214 | ENDWH 215 | * 216 | RTS RETURN 217 | * 218 | * 219 | **************************************************** 220 | * 221 | * PROCEDURE FILSKY 222 | * 223 | * OR'S ALL BITS IN THE FRACTION AND G-BIT INTO 224 | * THE STIKY BYTE. ALSO ZEROS OUT THE FRACTION AND THE 225 | * GUARD BIT. 226 | * 227 | * ON ENTRY: X - POINTS AT THE STACK FRAME ARGUMENT 228 | * 229 | * ON EXIT: X,Y,D,CC,U,S - UNCHANGED 230 | * 231 | FILSKY EQU * 232 | * 233 | PSHS X,Y,D,CC SAVE CALLERS REGISTERS 234 | * 235 | * GET OFFSET TO THE G-BYTE 236 | * 237 | LEAY GOSET,PCR G - OFFSET TABLE 238 | LDB RPREC,U PRECISION INDEX 239 | LSRB HALVE OFFSET 240 | LDA B,Y OFFSET FROM FRACT 241 | ADDA #FRACT OFFSET FROM SIGN 242 | * 243 | * START ORING THE BYTES OF FRACTION AND G-BIT INTO STIKY 244 | * NOTE THAT THE ROUND BITS IN THE SAME BYTE AS THE G BYTE 245 | * GET ORED AND ZEROED OUT AS WELL. 246 | * 247 | CLRB STIKY ACCUMULATOR 248 | WHILE A,GE,#FRACT 249 | ORB A,X 250 | CLR A,X 251 | DECA 252 | * 253 | ENDWH 254 | * 255 | ORB STIKY,U MODIFY STIKY 256 | STB STIKY,U 257 | * 258 | * 259 | PULS X,Y,D,CC,PC RETURN 260 | * 261 | * 262 | ********************************************************* 263 | * 264 | * PROCEDURE DENORM 265 | * 266 | * DENORMALIZES A FLOATING PT. FRACTION AND ORS THE 267 | * BITS THAT FALL OFF THE END AS WELL AS THOSE BEYOND 268 | * THE PROCISION OF FLOATING VALUE INTO THE STIKY BYTE. 269 | * THE SHIFT COUNT FOR DENORMALIZING IS PASSED IN THE 270 | * B - REG. . 271 | * 272 | * ON ENTRY: X - POINTS TO THE STACK FRAME ARGUMENT 273 | * B - CONTAINS THE SHIFT COUNT 274 | * 275 | * ON EXIT: X,Y,D,CC,U,S - UNCHANGED 276 | * 277 | DENORM EQU * 278 | * 279 | PSHS X,Y,D,CC 280 | * 281 | CLRA STIKY ACCUMULATOR 282 | WHILE B,GT,#00 283 | ANDCC #NC CLEAR CARRY 284 | RSHIFT FRACT,X,9 DO THE SHIFT 285 | * 286 | IFCC CS IF CARRY SET 287 | ROLA 288 | ENDIF 289 | * 290 | DECB 291 | * 292 | ENDWH 293 | * 294 | * OR ALL BYTES BEYOND THE GUARD BYTE INTO THE 295 | * STIKY BYTE. 296 | * 297 | LEAY GOSET,PCR G - BYTE OFFSET TABLE 298 | LDB RPREC,U GET PRECISION 299 | LSRB HALVE OFFSET 300 | LDB B,Y G- BYTE OFFSET 301 | ADDB #FRACT+1 ADJUST OFFSET FOR FRACT 302 | * 303 | WHILE B,LT,#(ARGSIZ-1) 304 | ORA B,X 305 | INCB 306 | * 307 | ENDWH 308 | * 309 | ORA STIKY,U 310 | STA STIKY,U 311 | * 312 | * 313 | PULS X,Y,D,CC,PC 314 | * 315 | -------------------------------------------------------------------------------- /sbc/mc6839/src/WARTS.SA: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | * THIS FILE CONTAINS THE KNOWN WARTS TO THE AUG 15TH 6 | * TEST SITE RELEASE. MOST ARE NOT SIGNIFICANT ENOUGH 7 | * TO ISSUE A 'PATCH' TO THE EPROMS AND CAN EASILY BE 8 | * AVOIDED. IF A PATCH IS DEEMED DESIREABLE IT IS 9 | * GIVEN HERE TOO. 10 | * 11 | PROBLEM 1: 12 | THE OUTPUT ROUTINE DOES NOT GENERATE A $0F FOR A 13 | NEGATIVE SIGN FOR AN EXPONENT OR FRACTION. INSTEAD 14 | IT GENERATES AN $FF. 15 | 16 | DATE FIXED: 20.AUG.80 / G. STEVENS 17 | 18 | DESCRIPTION OF FIX: 19 | INSERTED EQUATE IN BINSTR TO SET THE 20 | SIGN PROPERLY. 21 | * 22 | PROBLEM 2: FABS AND FNEG WILL RETURN GARBAGE OUT IF 23 | PASSED THEY ARE PASSED A DENORMALIZED NUMBER 24 | WITH THE 'NORM' BIT SET IN THE FPCB. 25 | 26 | DATE FIXED: 18.AUG.80 / G. STEVENS 27 | 28 | DESCRIPTION OF FIX: 29 | FABS & FNEG NOW INVOKE THE COMPONENT 30 | ROUTINE RTAR2 TO MOVE THE ARGUMENT TO THE RESULT. 31 | THE REQUIRED CHECKS FOR THE APPARENT UNDERFLOW 32 | CONDITION ARE PERFORMED IN RTAR2. 33 | * 34 | PROBLEM 3: COMPARE OF AN UNORMAL ZERO WITH A NORMAL 35 | ZERO DOES NOT COMPARE EQUAL AS IT SHOULD. 36 | 37 | DATE FIXED: 19.AUG.80 / G. STEVENS 38 | 39 | DESRIPTION OF FIX: 40 | TABLE PROCEDURES FOR NOT NORMALIZED 41 | NUMBERS NOW CHECK FOR A TRUE ZERO AS A RESULT OF 42 | NORMALIZING AND INVOKE THE COMPARE ZERO PROCEDURE 43 | IF BOTH ARGUMENTS ARE ZERO. 44 | * 45 | PROBLEM 4: AN OVERFLOW WITH NOTRAP SOMETIMES RETURNS 46 | GARBAGE IN THE RESULT. 47 | 48 | DATE FIXED: 20.AUG.80 / G. STEVENS 49 | 50 | DESCRIPTION OF FIX: 51 | FIXED A TYPO IN UNFLNT THAT WAS CAUSING 52 | AN INCORRECT PARAMETER TO BE PASSED TO THE MOVE 53 | PROCEDURE. 54 | * 55 | PROBLEM 5: ONLY THE ADBIAS AND SUBIAS PROCEDURES SET 56 | THE UNDERFLOW AND OVERFLOW FLAGS THUS A NOTRAP 57 | UNDERFLOW OR OVERFLOW CONDITION IS NOT SIGNALED 58 | IN THE STATUS BYTE. 59 | 60 | DATE FIXED: 21.AUG.80 / G. STEVENS 61 | 62 | DESCRIPTION OF FIX: 63 | THE OVERFLOW AND UNDERFLOW FLAGS ARE 64 | NOW SET IN THE PROCEDURES THAT CHECK FOR OVERFLOW 65 | UNDERFLOW INSTEAD OF THE ONES THAT ADD AND SUBTRACT 66 | THE BIAS. 67 | * 68 | PROBLEM 6: THE TABLE PROCEDURE THAT HANDLES THE CASE 69 | OF DIVIDE BY A NORMAL ZERO SIGNALS AN INVALID OP. 70 | OF 17 AND RETURNS AN NAN IF THE DIV BY ZERO TRAP 71 | IS ENABLED. IT APPEARS THAT THIS IOP( 17 ) IS NOT 72 | NEEDED AND THAT THE RESULT OF A DIVISION BY ZERO 73 | NORMALIZED ZERO SHOULD ALWAYS BE A PROPERLY SIGNED 74 | INFINITY. 75 | 76 | DATE FIXED: G. STEVENS / 21.AUG.80 77 | 78 | DESCRIPTION OF FIX: REMOVED ANY TEST FOR THE DIV 79 | TRAP FROM THE PROCEDURE DIVZER SO THAT IT ONLY 80 | RETURNS PROPERLY SIGNED INFINITIES. 81 | * 82 | PROBLEM 7: OUTS WILL GOES INTO AN INFINITE LOOP 83 | WHEN IT IS PASSED NOT NORMALIZED NUMBERS IN 84 | PARTICULAR AN UNNORMALIZED ZERO. 85 | 86 | DATE FIXED: G. STEVENS / 22.AUG.80 87 | 88 | DESCRIPTION OF FIX: 89 | PUT A TRAP FOR UNNORMAL ZEROS AT THE 90 | START OF THE OUTS PROCEDURE, ALSO INSERTED THE 91 | CORRECT CONSTANTS FOR THE LOG10X OF THE SMALL 92 | NORMALIZED VALUES. 93 | * 94 | PROBLEM 8: ROUND DOES NOT SET THE INEXACT RESULT 95 | FLAG IF THE RESULT ACTUALLY REQUIRES ROUNDING. 96 | 97 | DATE FIXED: 21.AUG.80 / G. STEVENS 98 | 99 | DESRIPTION OF FIX: 100 | ADDED CODE TO ROUND TO SET THE INEXACT 101 | RESULT FLAG IN THE STATUS BYTE IN THE EVENT 102 | THAT ROUNDING IS REQUIRED. 103 | * 104 | PROBLEM 9: UNDERFLOW WILL NOT BE SIGNALED IF THE 105 | EXPONENT OF THE RESULT EQUALS EXACTLY THE 106 | MINIMUM EXPONENT - 1. SIMILARILY, OVERFLOW 107 | IS NOT SIGNALED IF THE RESULT EQUALS EXACTLY 108 | THE MAXIMUM EXPONENT + 1. 109 | 110 | DATE FIXED: 25.AUG.80 / G. STEVENS 111 | 112 | DESCRIPTION OF FIX: 113 | A NEW MINIMUM EXPONENT TABLE IS USED 114 | IN CHECK_UNDERFLOW & THE CONDITIONAL EXPRESSION 115 | IS USED IN CHECK_OVERFLOW. 116 | * 117 | PROBLEM 10: IF THE UNORDERED CONDITION OCCURS 118 | IN A PREDICATE COMPARE WHERE THE INPUT 119 | PREDICATE WAS = OR <> THEN THE UNORDERED 120 | BIT IN THE FPCB IS NOT SET. 121 | 122 | DATE FIXED: 26.AUG.80 / G. STEVENS 123 | 124 | DESCRIPTION OF FIX: 125 | INSERTED THE PROPER LOGIC IN STEP II OF 126 | COMPARE TO SET THE UNORDERED FLAG WHEN UNORDERED 127 | OCCURS. 128 | 129 | * 130 | 131 | PROBLEM 11: SOMETIMES BINDEC SETS THE INEXACT BIT WHEN 132 | THE RESULT WAS EXACT 133 | 134 | DATE FIXED: 26.AUG.80 / G. STEVENS 135 | 136 | DESCRIPTION OF FIX: 137 | DECIDED THAT IN ACCORDANCE WITH THE STANDARD 138 | THE RESULT OF BINDEC SHOULD NEVER BE EXACT AND THAT THE 139 | USER SHOULD BE AWARE OF THIS. GIVEN THIS THE INEXACT BIT 140 | IS NOW ALWAYS CLEARED UPON EXIT FROM BINDEC. 141 | 142 | * 143 | PROBLEM 12: TRAPPING NANS CAUSE ALL SORTS OF FUNNY THINGS 144 | TO HAPPEN. ALSO, THE STATUS BYTES IN THE FPCB ARE NOT 145 | SET AT THE TIME OF A TRAP INVOCATION. 146 | 147 | DATE FIXED: 8-26-80 148 | 149 | DESCRIPTION OF FIX: MOVE THE CODE IN FRNBAK THAT MOVES THE 150 | TEMPORARY STATUS FROM THE STACK FRAME TO THE FPCB FROM 151 | 'CLSTAK' TO 'TRAP'. ALSO CLEAR TSTAT AFTER THE TRAP 152 | IS TAKEN. 153 | 154 | * 155 | PROBLEM 13: IOP 7 (P OR K) OUT OF RANGE DOESN'T WORK PROPERLY 156 | FOR EITHER BINDEC OR DECBIN. 157 | 158 | DATE FIXED: 8 - 27 - 80 159 | 160 | DESCRIPTION OF FIX: CHECK FOR P AND K OUT OF RANGE 161 | IF P IS OUT OF RANGE DO IOP=7 AND SET P=19. 162 | IF K IS OUT OF RANGE DO IOP=7 AND SET K=17 163 | 164 | * 165 | PROBLEM 14: OVERFLOW NOTRAP ENABLED WITH ROUNDING MODE=RP AND 166 | WITH A NEGATIVE NORMALIZED RESULT GIVES THE LARGEST 167 | POSITIVE NUMBER RATHER THAN THE LARGEST NEGATIVE 168 | NUMBER. ALSO RM, NEGATIVE RESULT GIVES PLUS INFINITY 169 | INSTEAD OF MINUS INFINITY 170 | 171 | DATE FIXED: 27 AUG. 1980 172 | 173 | DESCRIPTION OF FIX: FIXED TYPOS IN 'NOTRAP' 174 | 175 | * 176 | PROBLEM 15: THE INEXACT FLAG IS NOT BEING SET PROPERLY 177 | IN DECBIN. 178 | 179 | DATE FIXED: 180 | 181 | DECRIPTION OF FIX: 182 | 183 | * 184 | PROBLEM 16: THIS IS NOT EXACTLY A WART; BUT, RATHER, IS 185 | AN UPDATE TO MAKE THE PACKAGE AGREE WITH DRAFT 6.0. 186 | DENORMALIZED NUMBERS IN ROUNDING MODES RP OR RM WILL 187 | NO LONGER FORCE NORMALIZE MODE. 188 | 189 | DATE FIXED: 29 AUG 1980 190 | 191 | DESCRIPTION OF FIX: CHANGED GETPUT TO IGNORE RP AND 192 | RM IN NORMALIZE MODE TEST. 193 | 194 | * 195 | -------------------------------------------------------------------------------- /sbc/mondeb/Makefile: -------------------------------------------------------------------------------- 1 | all: mondeb.s19 2 | 3 | mondeb.s19: mondeb.asm 4 | as9 mondeb.asm -l s19 now 5 | 6 | upload: mondeb.s19 7 | ascii-xfr -s mondeb.s19 -l 1 -c 1 >/dev/ttyUSB0 8 | 9 | clean: 10 | $(RM) mondeb.s19 mondeb.lst 11 | 12 | distclean: clean 13 | -------------------------------------------------------------------------------- /sbc/mondeb/mondeb.s19: -------------------------------------------------------------------------------- 1 | S123F00010CE7FB910FF7F0EBDFB21BDFBE58EFC08BDFB5E8E7F37BF7F348E7F80BF7F3665 2 | S123F0208603B77F17200FBDFBE57C7F16BE7F12A684813B271A8EFC26BDFB5EBDFA9CC1C9 3 | S123F0400327E4BE7F34BF7F12A601BDF76327D78601BDF69827D02E20BE7F34BC7F142723 4 | S123F06007BDF8CD300120F4865EBDFB8DBDFBE520C4BDF74125B020E01F89483404ABE097 5 | S123F080C6F08B91C900340234041F41AE84350435026E841600511600A11600B01600B5C0 6 | S123F0A01600BA1600E616014316015716018D16018F1601F81602BF1603041603921603A7 7 | S123F0C0E91603EE1603F316041816043E1604D81605791605891600801600751603F31639 8 | S123F0E003F81603DD1603E2BE7F0E7F7FE38D198D178D158D138D198D178D158D138D1936 9 | S123F1008E7F0EBDF8E216FF698D0EBDF8D93001398D06BDF8E2300239BDF8CD7C7FE386AD 10 | S123F12005BDF702BDF8D3398EFC28BDFB5EBE7F0E6D0C26026A0B6A0C20ADBDF8242708DB 11 | S123F140BE7F1BBF7F216E84BE7F216E841A1020381A4020341CEF20301CEF202CBDF7D943 12 | S123F1602F24BDF8242F1FBE7F1DA684BE7F1BA7843001BF7F1BBE7F1DBC7F1F270B300169 13 | S123F180BF7F1D16FFE416FED016FEE6BDF8242B31271FBE7F28A684813F2605B67F2AA73E 14 | S123F1A084BE7F1BBF7F28A684B77F2A863FA7842034BE7F28A684813F262BB67F2AA78411 15 | S123F1C020248604BDF6982F20BE7F28A684813F27088EFC37BDFB5E200C8EFC3FBDFB5E63 16 | S123F1E08E7F28BDF8E216FE8916FE6D8603BDF6982B092E028601B77F1820EAB67F183489 17 | S123F2000220268603BDF6982B1A2E028601B77F198EF21F30014A26FBA684B77F1A20C6E8 18 | S123F220100A0802B67F1934028604BDF69835042FB78603F77FE3BDF70220AA10FE7F0E31 19 | S123F2403BBDF7D92F61BE7F1DBF7FC58606BDF6982B544AB77FE35F5C8E7FC57D7FE32BA5 20 | S123F2602C5A260CBDFBE5BDF8E2BDF8CDF67F1ABE7FC57D7FE32E05BDF8CD201BA6844D45 21 | S123F2802604862E2002862BBDFB8D200EBDF8CDBDF8E2BDF8D3AE84BDF8D9BC7F1F270A5A 22 | S123F2A03001BF7FC520B216FDAF16FDC5BDF7D92B5227F3BE7F1DBC7F1F2713BDF8242F90 23 | S123F2C0E6B67F1CA784BC7F1F27DF300120F5BF7FC5BDF824270E2DCEB67F1CBE7FC5A71C 24 | S123F2E084300120EABE7F12A684810A102600848E7FC5BDF8E2BDF8CDBDFA9CBE7F34BF1F 25 | S123F3007F1220CE8605BDF6982B6627673402BDF82435022F5BBE7F0EF67F1C810126041D 26 | S123F320E78420E081022604E70120D881032604E70220D081042604E70320C88105260716 27 | S123F340B67F1BED0420BD81062607B67F1BED0620B281072607B67F1BED0820A781082652 28 | S123F36007B67F1BED0A209C81092605FD7F0E209316FCE516FCFBBDF7D9271B2BF3BE7F5F 29 | S123F3801DBF7F23BE7F1FBF7F258D22B77F278E7F27BDF8D920DD8D15B17F2726088EFCB0 30 | S123F3A046BDFB5E20CE8EFC49BDFB5E20C64FBE7F23301F3001AB84BC7F2526F74339BD1C 31 | S123F3C0F7D9102F00848E7FCBBF7FC77F7FC9BDF824271B2D747C7FC9B67FC981062E6A55 32 | S123F3E0B67F1CBE7FC7A7843001BF7FC720E07D7FC92756BE7F1D301FBF7F148E7FCABF80 33 | S123F4007FE47F7FCABDF9B2BDF9A43404A1E02707BC7F1F273720F0BF7FC57C7FCAB67F4F 34 | S123F420CAB17FC92719BDF9B2BDF9A43404A1E027E9BE7FC5BC7F1F2713BF7F1420BD8EE7 35 | S123F4407FC5BDF8E2BDF8CD20E816FC0C16FC22BDF7D92FF5BE7F1DBF7FC5A68434026F14 36 | S123F460846D8427058EFC5920206A8486FFA18427058EFC652013BE7FC53502A784BC7F3F 37 | S123F4801F27CA3001BF7FC520D1BF7FC98E7FC5BDF8E2BDF8D3BE7FC5BDF8D9BDF8CDBE6B 38 | S123F4A07FC9BDFB5EBDFBE520CDBDF819BF7F00204CBDF819BF7F042044BDF819BF7F0860 39 | S123F4C0203CBDF819BF7F0A2034BDF819BF7F0C202CBDF819BF7F022024BDF819BF7F069A 40 | S123F4E0201CBDF819BF7F1DBDF819BF7F1BBDF7B38EFC778D0BBDF7C68EFC7F8D0316FB58 41 | S123F50071BDFB5E8E7F1FBDF8E239BDF7D97F7FCD8602BDF6982715102F00808101270293 42 | S123F52020EFBDF819BF7F2F7C7FCD20E47D7FCD27037C7F2E8D688EFC8ABDFB5EB67F2021 43 | S123F540B07F1EF67F1FF27F1D260481102502860F8B04B77FC98003B77FCB8EFC9DBDFBD0 44 | S123F5605E5F8E7FC98D398E7F1D8D348D32BE7F1D8D2D7A7FCB26F9BF7F1D5334041F4147 45 | S123F5808D1E3504BE7F1D301FBC7F1F26AF8EFCA2BDFB5E8D097F7F2E16FAD616FABA39BE 46 | S123F5A0EB84BDF8D93001398607BDF6982BED2709BDF819BF7F2C7C7F2BBDFB6F81532641 47 | S123F5C0F9BDFB6F81392735813126EE7F7FEEBDF6188002B77FED8D318D3D7A7FED270634 48 | S123F5E0A784300120F37C7FEE27CF8EFC49BDFB5E8E7FC5BDF8E27F7F2B16FA75BDFB6F92 49 | S123F600810D27F3810A27EF20F38D0CB77FC58D07B77FC6BE7FC5398D15484848481F89C1 50 | S123F6208D0D3404ABE01F89FB7FEEF77FEE39BDFB6F80302B0F81092F0A81112B0781168D 51 | S123F6402E038007398EFCB1BDFB5E39BDF8198D0316FA1EB67FEB4A26FD301F26F639BDB1 52 | S123F660FBE58EF9BDC604F77FC5C60CA680810D2706BDFB8D5A26F4A684810A27147A7F08 53 | S123F680C52605BDFBE520DD8620BDFB8D5A26F820D8BDFBE516F9DAB77FE2BDF7412402C8 54 | S123F6A04F39BE7F10B67FE2C60A8D7CBF7FE47F7FE37C7FE3BE7F12BF7F147F7FE1BDF96A 55 | S123F6C0A4BDF76E2616BDF9B2810A2719810D27153404A1E0261B7C7FE120E2B67FE3BE79 56 | S123F6E07F14BF7F12397D7FE12707BDF76E26ECA684810A2709810D27B8BDF9B220F34F8F 57 | S123F7004A39BF7FDB34048EF9BCC60A8D1AB67FE3C60D8D133001A684810D2705BDFB8D72 58 | S123F72020F3BE7FDB350439B77FC7F77FC85F5CF17FC7270B3001A684B17FC827F120F549 59 | S123F740391CFE7D7F162E0CBE7F12A6848D1426031A0139E6018D16260139BDF9A4BF7FED 60 | S123F7601220E5810D2706810A2702813B3934041F988DEF35042735B67F1781012606C14F 61 | S123F78020262D202881022606C12C2623201E81032606C120271620F081042615C1302DCB 62 | S123F7A00CC1392F0BC1412D04C15A2F038601394F393FB67F1EBB7F1CB77F20B67F1DB9F4 63 | S123F7C07F1BB77F1F39B67F1EB07F1CB77F20B67F1DB27F1BB77F1F398D492E032D093967 64 | S123F7E0BE7F1BBF7F1D200DBE7F14A684813A260C8D1A2F0EBE7F1BBF7F1F200D8121272E 65 | S123F800034F4A398D072FFB8DA9860139BF7F12BE7F1BBF7F1D8D0C398D092E0316F83978 66 | S123F820BE7F1B39BF7FDF7F7F1B7F7F1CBE7F12BF7F14BDF7412405BE7FDF4F39BDF9A426 67 | S123F840BDF76E2664C0302B6CB67F18810127088102271E81032741C1092F0AC1112B556A 68 | S123F860C1162E51C0078D538D51FA7F1CF77F1C20CBC1092E3F8D48BE7F1BBF7FE98D3B44 69 | S123F8804FFB7FEAB97FE9252CFB7F1CB97F1B2524F77F1CB77F1B20A4C1072E188D1C8D22 70 | S123F8A01FFA7F1CF77F1C2094BE7F14BF7F12BE7FDF860139BE7FDF4F4A398D038D013988 71 | S123F8C0787F1C797F1B250139326220E88620BDFB8D39863DBDFB8D393404C6018D0C35D1 72 | S123F8E004393404C6028D03350439BF7FDD3402AE84BF7FE7B67F198101270C8102271E52 73 | S123F900810327618104277B58BDF997BDF997840F81092F028B078D785A26ED20375A2794 74 | S123F9200B8EF95BB67FE7F67FE820078EF95F4FF67FE77F7FE6E001A28425057C7FE6208F 75 | S123F940F5EB01A9843402B67FE68D45350230028CF96526DE3502BE7FDD39271003E8006F 76 | S123F96064000A0001584FC1022E068D2A8D2220058D298D1C5C8D1F8D2284078D135A262A 77 | S123F980F520D25858588D1484018D055A26F720C48B30BDFB8D398D038D0139787FE87979 78 | S123F9A07FE74939BE7F143001E684BF7F147F7F1639BE7FE43001A684BF7FE4395245471B 79 | S123F9C00D474F544F0D5345490D434C490D434F50590D425245414B0D49424153450D448E 80 | S123F9E0424153450D434F4E54494E55450D444953504C41590D5345540D56455249465978 81 | S123FA000D5345415243480D544553540D494E540D4E4D490D5357490D434F4D50415245D5 82 | S123FA200D44554D500D4C4F41440D44454C41590D48454C500D434C460D5345460D464937 83 | S123FA4052510D52535256440D535749320D535749330D0A544F0D0A4845580D4445430D60 84 | S123FA604F43540D42494E0D0A3F0D0A2E43430D2E410D2E420D2E44500D2E580D2E590D99 85 | S123FA802E550D2E50430D2E530D0A444154410D555345440D0A46524F4D0D0ABE7F345FE2 86 | S123FAA0BC7F3626098EFC2EBDFB5EC60339BDFB6F847F811A2604BDFBE539810D270481D3 87 | S123FAC00A260D3001A7847D7F312603BDFBE539810326081F89865EBDFB8D3981082729C8 88 | S123FAE081602306817A220280203001A784C10827041F8920091F89865CBDFB8D1F987D15 89 | S123FB007F312603BDFB8D2097BC7F342792C10827071F89865CBDFB8DA684301F20E01A8B 90 | S123FB20108601B77F18B77F198610B77F1A8648B77F337F7F2B7F7F2E7F7F318603B7A00C 91 | S123FB4000B7A0008615B7A000B7A0008EF128BF7F088EF9BCBF7F108600B77FEB3934026D 92 | S123FB60A684810427068D25300120F4350239BF7FDB7D7F2B26058EA0012003BE7F2C30E8 93 | S123FB801FA684850127FAA601BE7FDB3934047D7F2E2724BF7FDBBE7F2FC602F17F2E27BA 94 | S123FBA00A301FE58427FCA7012007A7843001BF7F2FBE7FDB350439810A26033504398193 95 | S123FBC00D26058D20350439F67F32F17F332C0BCB0AF17F332D06812026028D087C7F3213 96 | S123FBE08D1735043934023404860D8D0C860A8D087F7F32350435023934028602B5A00040 97 | S123FC0027FB3502B7A001394D4F4E444542203638303920312E30312031302D4D61722D6F 98 | S123FC20323031390D042A040D5357493A04544F4F204C4F4E47044E4F54205345540453DD 99 | S123FC404554204020044F4B04434845434B53554D204552524F52200443414E2754204314 100 | S123FC604C4541520443414E27542053455420544F204F4E45530453554D20495320042CE2 101 | S123FC80204449464620495320040D0A53303036303030303438343435323142040D0A536B 102 | S123FCA031040D0A533930333030303046430D0A0443484152204E4F54204845580D046EEE 103 | S123FCC09F7F006E9F7F026E9F7F046E9F7F0616F32E10FF7F0E6E9F7F0810FF7F0E6E9F42 104 | S123FCE07F0A10FF7F0E6E9F7F0CFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59 105 | S123FD00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 106 | S123FD20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF 107 | S123FD40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF 108 | S123FD60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F 109 | S123FD80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F 110 | S123FDA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F 111 | S123FDC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F 112 | S123FDE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F 113 | S123FE00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE 114 | S123FE20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE 115 | S123FE40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE 116 | S123FE60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E 117 | S123FE80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E 118 | S123FEA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E 119 | S123FEC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E 120 | S123FEE0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E 121 | S123FF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD 122 | S123FF20FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD 123 | S123FF40FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD 124 | S123FF60FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D 125 | S123FF80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D 126 | S114FFA0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D 127 | S123FFB116F6A016F3F716F9EA16F9F516F81916F86116F77B16F7A516F79716F6C916F72D 128 | S123FFD13016F90416F90A16FAC116FB8016FC0416FBA916FC1216FB8516F03A16F010FC72 129 | S112FFF1CBFCE2FCDAFCC3FCBFFCD2FCC7FCCFA8 130 | S9030000FC 131 | -------------------------------------------------------------------------------- /sbc/pcb.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/pcb.pdf -------------------------------------------------------------------------------- /sbc/schematic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/schematic.pdf -------------------------------------------------------------------------------- /sbc/tinybasic/Makefile: -------------------------------------------------------------------------------- 1 | all: tinybasic.s19 2 | 3 | tinybasic.s19: tinybasic.asm 4 | as9 tinybasic.asm -l s19 now 5 | 6 | clean: 7 | $(RM) tinybasic.lst tinybasic.s19 8 | 9 | distclean: clean 10 | 11 | upload: tinybasic.s19 12 | ascii-xfr -s tinybasic.s19 -l 1 -c 1 >/dev/ttyUSB0 13 | -------------------------------------------------------------------------------- /sbc/tinybasic/README.md: -------------------------------------------------------------------------------- 1 | This is a port of Pittman Tiny BASIC for the 6800 to the 6809 to run 2 | on my single board computer. 3 | -------------------------------------------------------------------------------- /sbc/tinybasic/tinybasic.s19: -------------------------------------------------------------------------------- 1 | S1230100BD020D7E022A7E08FB7E08FE7E09170818008020A6845F39A7843902A102A30292 2 | S1230120FA0322034E031B020901E101E5018901AA01AE0177018004C804CD041B042A048F 3 | S1230140EB04B504AA03DE03EB03E904010380043D046302090600056905E305EB065205AA 4 | S1230160D605F4020906850209020906DD02170499022A01BD04C38D3197BCD7BD7E04F59A 5 | S1230180BD051C96BCD6BD20048D1F8D009EC2301FE78420029EC2301FA7849FC2340296F8 6 | S12301A0C191C3350225627E02648D021F98C601DBC3C18022F19EC20CC3E684398D068D93 7 | S12301C0D41F9820D086061F899BC3818022D89EC297C3A6053402301F5A26F71FA83402B5 8 | S12301E03B8D1E20B08D1A34028D161F893502209C9BC397BD0FBC8DB59EBCA684E784205C 9 | S1230200949E2AA68430019F2A4D3907A28E10009F208E2FFF9F229620D621FB011389000C 10 | S12302209724D7259E206F846F0110DE22BD0656BE020B9F2A8E00809FC28E00309FC01089 11 | S1230240DF268DBD8D0720FA8C200420F28E01179FBC81302456810825974897BD9EBCAEC6 12 | S123026088176E84BD0656862197C1BD0109868097C3D62B962AF0020CB2020BBD0566966E 13 | S1230280C0270F8E029C9F2ABD05D69628D629BD05668607BD010910DE2620912041542004 14 | S12302A0800ABC0DBC27BD9EBC9F2A39814024263402BD0201BB020C97BD35021F89840763 15 | S12302C0B9020B97BCC40826DE9E2A972AD6BDD72B9FBC7E04F51F8944444444840E97BDA3 16 | S12302E09EBCAE88174FC160C41F2402CAE02706DB2BD7BD992A97BC6E849E2C9FB88D3B78 17 | S12303008D2E1F89BD02012A02CA803404A1E026044D2AEA399EB89F2C20888D1E810D269B 18 | S1230320F8398D17815A2EF181412DED48BD01959E2CA68430019F2C810D398DF381202774 19 | S1230340FA301F9F2C81301CFE2D02813A398DEB24C78E00009FBC8DD7340296BCD6BD5874 20 | S1230360495849DBBD99BC5849D7BD3504C40FDBBD890097BCD7BD8DC225DC96BC7E018DAB 21 | S12303808D7AA6024749A20297BC97BD1F89EB03E7031F89E902E702A88497BE2A028D4059 22 | S12303A0C611A684AA0126037E026496BDA001340296BCA284340298BC2B0C350297BC355E 23 | S12303C00297BD1A012006350235021CFE6903690209BD09BC5A26D38D1F0DBE2A0A9EC23A 24 | S12303E0600126026A846384398DF38D0FE603EB01A602A984A702E7037E01AEC6047E0193 25 | S1230400B08DF9861097BC4F5F5849680169842404EB03A9020ABC26F020DA8DDCD7BD0F71 26 | S1230420BC9EBCA684E6017E018DC6038DD0E6016F01A684AE01A784E7017E01AA8DFB3437 27 | S123044004C6038DB90CC30CC33504E002A2012E0B2D055D27042004678467846784241B12 28 | S12304607E020196C0271DBD033026FB8D1E27118D33BD010C25059EC49F2A39BE020B9FE7 29 | S12304802A7E026410DE2697BF7E0230BD03309728BD033097299E28399E209F2C8DED27A8 30 | S12304A0E09E2A9FC41FA897C039BD053E27C19EBC9F2820CC8D651F416C016C01BD0549AA 31 | S12304C026ED398D579F2A398E002C20038E002EA60181802408A68426049E2C200A9E2C67 32 | S12304E0962E972C962F972D9F2E391F416C016C019E289FBC327E1F41A602A784A603A754 33 | S12305000196BCA70296BDA7038E002410DFBCA60190BDA68492BC25247E02641F41300355 34 | S12305209C2227F5AE019FBC1F413404C604A603A705301F5A26F7350432629EBC39BD0138 35 | S1230540AAD7BD97BC9ABD27D09E209F2CBD048C2711D6299628D0BD92BC2407BD033026D1 36 | S1230560FB20EA9CBC39BD018D9EC26D842A07BD03DE862D8D4B4F3402C60F861A34023487 37 | S12305800434023404BD01AA1F416C84C010822724F86A01CBE8890324F86C02C0648200BE 38 | S12305A024F86A03CB0A24FA0FBE35024D27048D0420F71F98811026040DBE27160CBE8AC9 39 | S12305C0300CBF2B0C9FBA3404BD010935049EBA390ABF398DEBBD02012AF920E481222798 40 | S12305E0F28DDEBD033026F57E0264D6BF2BE4CAF8502003BD01AA5A2DD986208DC320F7FD 41 | S12306009E2C9FB89E209F2C9E248D2C27028D28962CD62DD0B792B62433BD048C272E96B0 42 | S123062028D629BD056686208D4EBD010C251EBD033026F48D1C20D830019FB69EC28C00BC 43 | S1230640802709BD053E9E2C301E9F2C399EB89F2C3996BF2BF6860D8D1CF6011158270B2C 44 | S123066034048D0B35045A585A26F5860A8D094F7D01112A01430FBF7E05C1B601122001D8 45 | S12306804F97BF200A8E00309F2C9FBCBD018D98809780BD0106847F27F5817F27F1810AA3 46 | S12306A027D9811327DA9EBCB10110270AB1010F260B8C003026149E2C860D0FBF9CC226BD 47 | S12306C00686078DB320C8A7843002301F9FBC810D26BCBD065296BD97C17E01AABD04DE5C 48 | S12306E0BD053E1FA8BD06469FB89EBC9FB65F1F8A260BBD048CC6FE5ABD033026FA8E00DE 49 | S1230700009F28BD04DE860D9E2CA184270DCB035C3001A18426F99EB69F289EB89FBC5DF1 50 | S1230720275B2A28962F3404ABE097B9962E89FF97B89E2EE6849C24273F9C26273B3001BD 51 | S12307409F2E9EB8E78430019FB820E6DB25D72F86009924972ED027922625050A2B7E02DD 52 | S1230760649E2E9FB89E24A684301F9F249E2EA784301F9F2E9CBC26EC9EB89F249E28276D 53 | S12307801B9EBC9628D629A7843001E78430019FBCBD03309EBCA784810D26F110DE267E24 54 | S12307A00230243A912710E159C52A5610112C8B4C45D4A080BD30BCE0131D9447CF8854C2 55 | S12307C0CF30BCE0101116805355C230BCE014169050D283494ED4E57188BBE11D8FA221DA 56 | S12307E0586F83AC225583BA2493E0231D30BC20489149C630BC313430BC84544845CE1CF4 57 | S12308001D380D9A494E5055D4A010E7243F209127E15981AC30BC131182AC4DE01D89522C 58 | S123082045545552CEE0151D85454EC4E02D984C4953D4EC24000000000A801F2493231DA7 59 | S123084030BCE15080AC59855255CE380A86434C4541D22B845245CD1DA080BD381485ADBE 60 | S123086030D3176481AB30D385AB30D3185A85AD30D319542F30E285AA30E21A5A85AF3026 61 | S1230880E21B542F98524EC40A8080120A09291A0A1A851813098012010B313061720B04A8 62 | S12308A0020305031B1A190B09060A00001C172F8F5553D280A830BC312A312A80A92E2FFA 63 | S12308C0A2122FC12F80A830BC80A92F83AC38BC0B2F80A8522F84BD09022F8EBC84BD09C0 64 | S12308E0932F84BE09052F09912F80BE84BD09062F84BC09952F09042F00003F0039847F69 65 | S12309008100271281FF270E8111270A81132706810327023F01393402B6A0008501270B76 66 | S1130920B6A001810326041A0120021CFE350239F7 67 | S9030000FC 68 | -------------------------------------------------------------------------------- /sbc/trace/Makefile: -------------------------------------------------------------------------------- 1 | all: trace.s19 2 | 3 | trace.s19: trace.asm 4 | as9 trace.asm -l s19 now 5 | 6 | # Change line above for different assemblers: 7 | # as9 trace.asm -l s19 now 8 | # asm6809 -v -S -o trace.s19 -l trace.lst trace.asm 9 | # lwasm --6809 --format=srec --list=trace.lst --output=trace.s19 trace.asm 10 | 11 | upload: trace.s19 12 | ascii-xfr -s trace.s19 -l 1 -c 1 >/dev/ttyUSB0 13 | 14 | clean: 15 | $(RM) trace.s19 trace.lst 16 | 17 | distclean: clean 18 | -------------------------------------------------------------------------------- /sbc/trace/README.md: -------------------------------------------------------------------------------- 1 | Trace program for the 6809. Runs on my Single Board Computer with the 2 | ASSIST09 monitor ROM. 3 | 4 | For a version that is integrated into the ASSIST09 ROM, see the 5 | directory "combined". 6 | -------------------------------------------------------------------------------- /sbc/trace/trace.s19: -------------------------------------------------------------------------------- 1 | S123200010CE5000CE60008E2030C60A5A30857F202FA684A1822C0D3404E684E701A7849A 2 | S112202035047C202F5A26EA7D202F26DA20FE55 3 | S10D2030CBBBB8CDA57E13FD1E182E 4 | S12330008E2000BF100EBF100C8D14BD381C17906D815127068171270220EE6E9FFFFE1737 5 | S123302007F08D0A1706C5BE100EBF100C397F1014AE8DDFD9E684C1102707C111275216CC 6 | S1233040009D8601B71014E601F71012308D9AB84FE186271F8B036D86270220F48610B757 7 | S123306010128600B710138600B710178601B7101616008D8B01E686F710138B01E686F75E 8 | S123308010174F1F01E689C8DBF710167C101620708601B71014E601F71012308D9ADC4F51 9 | S12330A0E186271E8B036D86270220F48611B710128600B710138600B710178601B710160A 10 | S12330C0203F8B01E686F710138B01E686F710174F1F01E689C8DBF710167C10162022F7EC 11 | S12330E010124F1F01E689C908F71013F610121F01E689CA08F710171F01E689C8DBF71011 12 | S123310016B6101781082622AE8DDF027D10142704A6022002A601B710152A0E841F308D1A 13 | S123312097C6A686BB1016B71016B610138100102705AEB6101781082613B61015848E81F3 14 | S12331408C260A308D068D178F53178EE1B6101381801027058BB6101381302610BE100EA3 15 | S1233160A6018A80BA1000B71000160574817D264EBE100E3001BF100C10FF101810FE10CB 16 | S12331800AB6100034028A50B71000B610013402B610023402B610033402BE10043410BEB6 17 | S12331A010063410BE10083410BE100C341010FF100A10FE1018BEFFFABF100E16052C81BE 18 | S12331C07E2649BE100E3001BF100C10FF101810FE100AB610003402B610013402B61002F6 19 | S12331E03402B610033402BE10043410BE10063410BE10083410BE100C341010FF100A10F7 20 | S1233200FE1018BEFFF4BF100E1604DF817F2649BE100E3001BF100C10FF101810FE100A47 21 | S1233220B610003402B610013402B610023402B610033402BE10043410BE10063410BE1098 22 | S1233240083410BE100C341010FF100A10FE1018BEFFF2BF100E160492813B10260084B63D 23 | S12332601012817E260EBE100EAE01BF100EBF100C160477810E2611BE100EE601B61003CF 24 | S1233280FD100EFD100C160462BE100E108E101CC6334FE7A64CE686E7A64CB1101626F67B 25 | S12332A0C67EE7A64C8E32C8AFA610FF1018FF101AB61001F61002BE100410BE100610FE1D 26 | S12332C0100AFE10087E101CBF100410BF100610FF100A10FE1018FE101ABF100EBF100C19 27 | S12332E0160408813C10260078B6101281BD26274FF61016F3100E10FF101810FE100A34CB 28 | S12333000610FF100A10FE1018BE100EAE01BF100EBF100C1603D4819D262A4FF61016F348 29 | S1233320100E10FF101810FE100A340610FF100A10FE1018BE100EE601B61003FD100EFDCF 30 | S1233340100C1603A64FF61016F3100E10FF101810FE100A340610FF100A10FE101816FF05 31 | S123336028816F261B10FF101810FE100A351010FF100A10FE1018BF100EBF100C16036BB1 32 | S1233380816E264310FF101810FE100A3510BF100EBF100CB610002A1E3510BF1008351006 33 | S12333A0BF10063510BF10043502B710033502B710023502B710013502B7100010FF100AF5 34 | S12333C010FE10181603248120262F4FF61016F3100E10FF101810FE100A340610FF100A42 35 | S12333E010FE1018BE100E4FE6011DC30002F3100EFD100EFD100C1602F1814B262D4FF6ED 36 | S12334001016F3100E10FF101810FE100A340610FF100A10FE1018BE100EEC01C30003F3F7 37 | S1233420100EFD100EFD100C1602C0B610178106264EBE100E108E101CA684A7A48603A73B 38 | S123344021867EA7228E3471AF23867EA7258E345BAF26B610001F8A7E101CBE100E4FE689 39 | S1233460011DC30002F3100EFD100EFD100C16027AFC100EC30002FD100EFD100C16026BF8 40 | S123348081071026008BB6101281162624BE100E108E101CA684A7A48E0003AF21867EA7FF 41 | S12334A0238E3500AF24867EA7268E34DBAF272022BE100E108E101CAE84AFA48E0003AF5E 42 | S12334C022867EA7248E3500AF25867EA7278E34DBAF28B610001F8A7E101CBE100EB6105F 43 | S12334E0128116260AFC100EC30003E3012008FC100EC30004E302FD100EFD100C1601EB07 44 | S12335004FF610161DF3100EFD100EFD100C1601DAB61012811F10260094BE100EA60184A0 45 | S1233520F08150264410BE100E3122A601840F8100271381012716810227198103271C815E 46 | S123354004271F16019B10BF100116019410BF100416018D10BF100616018610BF100816DA 47 | S1233560017F10BF100A160178A601840F8105102600FEA60184F081002713811027148138 48 | S12335802027158130271681402717160153BE10012012BE1004200DBE10062008BE1008A2 49 | S12335A02003BE100ABF100CBF100E16013DB61012811E2679BE100EA60184F081502606F6 50 | S12335C0A601840F2016A601840F8105102600A1A60184F0040004000400040010BE100EC9 51 | S12335E0312281002713810127198102271D81032721810427251600E8BE10011E12BF10C7 52 | S1233600012020BE10041E12BF1004BE10061E12BF1006BE10081E12BF1008BE100A1E12D2 53 | S1233620BF100A10BF100E10BF100C1600BDB610128135270481372618BE100EA6018480CC 54 | S12336408180262D308D015E178A521789E0160090B610128134270481362615BE100EA6B1 55 | S12336600184808180260A308D0169178A2F1789BDBE100E108E101C4FE686E7A64CB110C1 56 | S12336801626F6C67EE7A64C8E36B7AFA610FF1018FF101AF61002BE100410BE100610FEDB 57 | S12336A0100AFE1008B610031F8BB610003602B6100137017E101C3601B710013702B710BD 58 | S12336C0001FB8B71003F71002BF100410BF100610FF100AFF100810FE1018FE101A4F1F78 59 | S12336E08B4FF61016F3100EFD100E39308D008C1789AABE100C178996308D008317899D4B 60 | S1233700B6100117897B308D0079178990B6100217896E308D006F178983BE100417896F57 61 | S1233720308D0065178976BE1006178962308D005B178969BE100A178955308D00511789DB 62 | S12337405CBE1008178948308D004717894FB6100317892D308D003E1789428E0008F61049 63 | S123376000582504863020028631BDC07B301F26F0308D00251789251788B33950433D04D2 64 | S1233780413D04423D04583D04593D04533D04553D0444503D0443433D04202845464849C3 65 | S12337A04E5A564329045761726E696E673A20696E737472756374696F6E206E6F742073A1 66 | S12337C07570706F727465642C20736B697070696E672E045761726E696E673A20696E7315 67 | S12337E07472756374696F6E206E6F7420737570706F727465642C20657870656374206978 68 | S12338006E636F727265637420726573756C74732E04BE100CBF5FF0BDC0A43934128EFFCB 69 | S10B3820FF86323F093512391D 70 | S9030000FC 71 | -------------------------------------------------------------------------------- /sbc/tscbasic/Makefile: -------------------------------------------------------------------------------- 1 | all: basic.s19 2 | 3 | basic.s19: basic.s 4 | as9 basic.s -l s19 now 5 | 6 | upload: basic.s19 7 | ascii-xfr -s basic.s19 -l 1 -c 1 >/dev/ttyUSB0 8 | 9 | clean: 10 | $(RM) basic.s19 basic.lst 11 | 12 | distclean: clean 13 | -------------------------------------------------------------------------------- /sbc/tscbasic/README.md: -------------------------------------------------------------------------------- 1 | A version of TSC Micro BASIC PLUS ported to my 6809 Single Board Computer. 2 | 3 | The 6809 port was found here: https://www.cs.drexel.edu/~bls96/6809sbc/ 4 | 5 | I found the original 6800 version and info here: http://www.swtpc.com/mholley/TSC_MicroBasic/TSC_MicroBasic.htm 6 | 7 | Notes about this port: 8 | 9 | The MONITOR command jumps to the ASSIST09 Monitor. You cannot return 10 | to BASIC unless you call the warm start entry RESTRT. 11 | 12 | A running program can be interrupted with Control-C. 13 | 14 | I enhanced it to show full error messages rather than just numbers. 15 | 16 | Known issues: 17 | 18 | The program occasionally crashes randomly. This needs to be investigated further. 19 | The language is pretty limited as compared to other BASICs (e.g. integer math only, no string variables). 20 | 21 | ------------------------------------------------------------------------ 22 | 23 | Instruction Summary 24 | 25 | Commands: LIST MONITOR RUN SCRATCH 26 | 27 | Statements: DATA DIM END EXTERNAL FOR GOSUB GOTO IF INPUT LET NEXT ON PRINT READ REM RESTORE RETURN THEN 28 | 29 | Functions: ABS RND SGN SPC TAB 30 | 31 | Math Operators: - + * / ^ 32 | 33 | Relational Operators: = < > <= >= <> 34 | 35 | Other: 36 | 37 | Line Numbers: 0 to 9999 38 | Constants: -99999 to +99999 39 | Variables: single letters, A to Z, may be subscripted 40 | Backspace: Control-H 41 | Line cancel: Control-X 42 | 43 | Error Codes: 44 | 45 | 10 Unrecognizable keyword 46 | 14 Illegal variable 47 | 16 No line number referenced by GOTO or GOSUB 48 | 20 Expression syntax, unbalanced parens, or dimension error 49 | 21 Expression expected but not found 50 | 22 Divided by zero 51 | 23 Arithmetic overflow 52 | 24 Expression too complex 53 | 31 Syntax error in PRINT statement 54 | 32 Missing closing quote in printed string 55 | 40 Bad DIM statement 56 | 45 Syntax error in INPUT statement 57 | 51 Syntax error in READ statement 58 | 62 Syntax error in IF statement 59 | 73 RETURN with no GOSUB 60 | 81 Error with FOR-NEXT 61 | 90 Memory overflow 62 | 99 "BREAK" detected 63 | -------------------------------------------------------------------------------- /sbc/tscbasic/TSC_MicroBasic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jefftranter/6809/1e8c1a68a9b3e50f1f1fc753be1bee963f2b1fd8/sbc/tscbasic/TSC_MicroBasic.pdf -------------------------------------------------------------------------------- /sbc/tscbasic/basic.s19: -------------------------------------------------------------------------------- 1 | S12301007E01B67E01C03F01393F00397E04856EFF50524906AC494E5009E44946200B10C7 2 | S12301204C455409BA464F520BE94E45580C15474F5409C9474F530B944F4E200AD05245BA 3 | S1230140540BC05245410A7A4441540A6B5245530AC644494D089B45585409414D4F4EF87E 4 | S123016037454E4401C052454D094452554E09A84C4953041C53435201B600524E440D58E5 5 | S12301804142530D5453474E0D4B0034128EFFFF86323F09351239BD018B8E01009F0A8E83 6 | S12301A0000C2008BE010F9F0ABE10274FA78430019C0A26F8398DDF8E1029BF10278DE459 7 | S12301C010CE7FFF8E00689F0A8DD48E1027AE849F088E0068BD03158621BD047FBD02EAC6 8 | S12301E027DEA784810D270930018C00B026EE20CF8E0068BD035C9F31BD03A74D261E9E25 9 | S123020004A684810D2608D62827B59712200EBD098D27098610108E04D97E04A0963E9025 10 | S123022026973ED6282606BD03157E0989BE010F9F379E319F04BD02BB9F225D26225CA6B8 11 | S1230240843001810D26F7F7025786FF508D4D9E22BC10272708A684A784300120F39E2200 12 | S123026096122635BE1027D63ECB02F702798D2C9C222708301FA684A78420F4301FBD08BD 13 | S123028092300130019F229E04A68430019F049E223001A784810D26EC7E01C0FB1028B91E 14 | S12302A01027D73A9739BD0F892407F71028B71027398690108E06967E04A09664D6638E19 15 | S12302C01029BC102726025C39E184220A26F8A101220426F25F398D04300120E534028687 16 | S12302E00D3001A18426FA350239BD01098108261A8C0068271E301F8608BD01068620BD3A 17 | S123030001068608BD01060A3E20DF81182705BD01060C3E399F228E032CA68481042707D2 18 | S1230320BD047F300120F39E220F1D390D0A0000000004810D2702813A39BD0DFA4F97623E 19 | S123034097639764398DF6972897279726BD0393812B2706812D260403273001BD0FBEC104 20 | S123036003270596277E0EA330019728840FC6040864096309625A26F79B6497640C26200B 21 | S1230380DB9E04A6848120270A300120F68DB6301F3001A684812027F8399E04BD0FBEC1C6 22 | S12303A00226F0300120F5BD03939F049F228E0111C605A18426149F0A9E223001A6849FF7 23 | S12303C0229E0A30015AC10226E93930015A26FBA68427F69F0A9E049F22A6849E0A20D1F7 24 | S12303E08E0062C6021CFEA6842A18862DBD047F0C1D200FA68485F025022707BD04770C38 25 | S12304001D1A01A684C5FF2706850F25022707BD047B0C1D1A0130015A2AD939BD039A817A 26 | S12304200D2725BD03459F04BD02BB9F22BD039A810D26040C1B200C3001BD0393BD03458E 27 | S12304409664971B9E2220038E1029BC10272724BD0315C6011CFE8D9BA684810D27068DB4 28 | S12304601E300120F43001961B27E08B99192704971B20D77E01C044444444840F8B30BDC1 29 | S1230480010C7E01063402B6A00085012603350239B6A001847F810326F48699108E06A6BA 30 | S12304A0BD03151F21BD031AD61926037E01C08E04CFBD031A9E04301F8C10292708A684A8 31 | S12304C0810D26F33001C6011CFEBD03F420DD204154204C494E45200453594E5441582086 32 | S12304E04552524F5204494C4C4547414C205641524941424C45044E4F204C494E45204EB3 33 | S1230500554D424552205245464552454E43454420425920474F544F204F5220474F535536 34 | S1230520420445585052455353494F4E2053594E5441582C20554E42414C414E4345442021 35 | S1230540504152454E532C204F522044494D454E53494F4E204552524F52044558505245E9 36 | S12305605353494F4E20455850454354454420425554204E4F5420464F554E4404444956DA 37 | S1230580494445204259205A45524F0441524954484D45544943204F564552464C4F5704E4 38 | S12305A045585052455353494F4E20544F4F20434F4D504C45580453594E5441582045523B 39 | S12305C0524F5220494E205052494E542053544154454D454E54044D495353494E4720436A 40 | S12305E04C4F53494E472051554F544520494E205052494E54454420535452494E47044253 41 | S123060041442044494D2053544154454D454E540453594E544158204552524F5220494E36 42 | S123062020494E5055542053544154454D454E540453594E544158204552524F5220494EE5 43 | S123064020524541442053544154454D454E540453594E544158204552524F5220494E2019 44 | S123066049462053544154454D454E540452455455524E20574954484F555420474F53557C 45 | S123068042044552524F52205749544820464F522D4E455854044D454D4F5259204F5645D0 46 | S12306A052464C4F5704425245414B04BD039ABD033326037E07440F12812C2620D61D8673 47 | S12306C020BD047F5CC50726F6C1472204D71D2003BD03150C123001BD039320D2813B27E1 48 | S12306E0F38122260630018D6520470F17815426069717864120068153262D8650A1012623 49 | S123070027BD039CBD0CAFBD083DD6642724961727075AD11D231B2002DB1D8620BD047FF2 50 | S12307200C1DD11D26F5200ABD0CAF9F22BD03E09E22BD0FB95A26037E06AF8631108E052B 51 | S1230740B77E04A00D122603BD03157E0944A6848122270EBD0333270EBD047F0C1D300110 52 | S123076020EC30017E03938632108E05D77E04A09F04BD0FC0C10226340F20A7E248ABE0F9 53 | S1230780801397219E2039A68430010F188DE15FA684810A2706810B2701395CA6013402BC 54 | S12307A0A60234023404BD039A35048128267B5D27153001BD0CB196643402BD0E0BBD0338 55 | S12307C09A812C266520034F34024C97183001BD0CB130019F043502971435029721350219 56 | S12307E097209E20A6849716300130019F20BD033A96149E20301FA184222F9764BD033A6C 57 | S12308009616915E270223228B01199764BD0EB0BD0E82BD08339620D621DB6499639720CC 58 | S1230820D721BD0E0B9E200F18398614108E04E67E04A0BD033A86039764BD0EB09664345D 59 | S123084002966334025FD763D76496628D18350234028D0E35028D0E350234028D043502E3 60 | S12308602021444444448D1BD6634859340434024859485997643502D7638D0935029B63BA 61 | S1230880976339840F9B64976424020C63399662A7849663A7019664A702399E069F37BDEF 62 | S12308A0039ABD0393BD07709F0ABD039A812826243001BD038D812926064F5F3402201EA4 63 | S12308C0812C26119664270D34023001BD038DC601812927098640108E05FF7E04A0966429 64 | S12308E027F334029F049E0A860AE7E2ABE0A7849608A7019609A7029E083502A784300183 65 | S12309003504E78430019F208B011934021F988B01191F89BD033DD764BD033A35029764FC 66 | S1230920BD0EB0BD0813BD0F8723037E02B29F089E043001BD0393BD0333270830017E080F 67 | S1230940A2BD6F004F9712971C9718972C961926037E01C09E04860DC63AA1842708E184A3 68 | S1230960270D300120F43001BC102727E430013001BD010CBD03A74D260F9E048D0F270948 69 | S12309808610108E04D97E04A0AE846E84BD0FBEC10226133001BD0393813D27048128263A 70 | S12309A0068E0123971C5F39BD0197BD01A4BE010F9F068E10290C1920AE9E04961C2603CF 71 | S12309C0BD0381BD0BD77E0944BD039ABD0CAFBD02BB5D27098616108E04F77E04A05CD705 72 | S12309E0197E0968BD039A0F13BD0393812226073001BD074E203EBD07899F338E00689600 73 | S1230A00132607863F9713BD047FBD0109811826040F1320E7A784BD047F3001812C2709B7 74 | S1230A20810D26E69712BD03158E0068BD03459E338D329F04812C26083001961227AA20C7 75 | S1230A40A6BD03332613961227037E0944BD0109810D26F9BD031520F18645108E06117ECB 76 | S1230A6004A0BD0789BD088E7E039A9619274BBD039A971A9F0C9F0E20409619273C961A6D 77 | S1230A80273BBD0381BD0393BD07899F339E049F359E0EBD0CAFA684BD033326049E0C2092 78 | S1230AA00230019F0E9E359F049E338DB8812C2604300120D0BD033326037E094486511000 79 | S1230AC08E06317E04A09F229E0C9F0E9E2220EABD0381BD0CAF9664840F34020F1230017B 80 | S1230AE03001A684815427029712BD03839F2235024A2712E6843001C12C26049F2220F1AE 81 | S1230B00C10D26F09E22D61227037E0B9B7E09CCBD039ABD0CAFA6848D6E26633402A60147 82 | S1230B208D6635022606E601AB01300130013402BD0CAF3502840F80092B444848B70B475D 83 | S1230B40BD0E7CBD0F9420FE2F1820302614202C2C1020282D0C2024270820202E04201CD1 84 | S1230B60201D9E04A6848154260FBD039A9F04BD0FC0C10326037E09CC7E09747E09448649 85 | S1230B8062108E06507E04A0813B2306813E22025F395C39D61927E4BD039A0C1BBD0CAFF1 86 | S1230BA0301FBD02DD3001A6843402A601340210DF378E1E23BD0F8723037E02B27E09CFE2 87 | S1230BC08673108E066D0A1B2A037E04A035023504BD02BF7E09D2BD07879F33BD039A30A5 88 | S1230BE001BD0CAF9E337E088EBD038134028DE79E089F379E063502A7849605301FA78411 89 | S1230C009604301FA784301FBD0F8722037E02B29F067E0944BD03819F1E9E06BC010F26BF 90 | S1230C20059E04160080300130013001A18426EC301F301F301F9F063001AE849F04BD074D 91 | S1230C40899F33BD039ABD0CAFBD0DFA9E33BD0DED9E04A68481532708BD033A4C976420E7 92 | S1230C600ABD039CBD0CAF9662971CBD0E828E0010BD088EBD0E7CBD0F94D61C2B061F8A36 93 | S1230C802C1620041F8A2F109E063001300130019F069E1E9F04200B8E0010BD0DED9E3376 94 | S1230CA0BD088E7E09448681108E06827E04A00F2C962C972D8D044D26F23910DFFEBD0F1A 95 | S1230CC0B99F04C10126088621108E055B205354C1032603BD033A9E04BD0FB99F04C104E2 96 | S1230CE02302C60558F70CE920FE203020202042203620063402300120C41F41D6189CFEFD 97 | S1230D00270935025F8128102700865D270E4FD62C5AD12D26061F419CFE27098620108ECE 98 | S1230D20052210DEFE9E0439BD0DFA9E04BD03452063A601BD0FC0C1022629A6849F228E15 99 | S1230D40017BBD03B14D27C67E0989863F34029E227E0CBE864020F5BD033ABD10049764B4 100 | S1230D609E222031D6FE3404D6FF3404D62D3404D6183404BD07873504D7183504D72D35FF 101 | S1230D8004D7FF3504D7FEBD0DFA9E20BD0DED20069E0430019F041F419CFE273F350234C7 102 | S1230DA00281282737BD0FC0340454962C4AC1042704912D2726810923088624108E05A065 103 | S1230DC02017350235048006488E0DDFAD96BD0F9428C48623108E058C7E0D227E0CD70E9D 104 | S1230DE0820E7C0F540E740EB00ED10F66A6849762A6019763A6029764398E003BE603E7B3 105 | S1230E008430018C006226F50C2C398E0064E684E703301F8C003A26F50A2C391CFE8E0012 106 | S1230E20643401A6843501A903193401A784301F8C006126EE35013404C60285F026015F0F 107 | S1230E40DA30D7301F983504398D041A0120CF8E00678699A084A784301F8C006426F3847A 108 | S1230E600FA701390F3096651F89C40FD765972F9862972ED662C40FD7624D39966288F0CE 109 | S1230E8097628D878DDE2A0A8DBF1F8A2809032F200D17FF87200A17FF71BD033A8DAA0F8F 110 | S1230EA030962F84F0C60FD462D7629B6297623917FF588DAFBD033AC605965F2707BD0EF5 111 | S1230EC01C0A5F26F95A27408D4C9662BD0E3720E917FF378E0065BD0F9726098622108EB5 112 | S1230EE0057D7E0D22BD0E64BD0DFA8D296F026F03C6058D21BD0E4F8D3885F02614BD0E61 113 | S1230F004F1CFE8D2F5A26EB962E8D978E005E7E0E0E0C6420E286048E00641CFE3401355D 114 | S1230F200169843401301F8C005E26F335014A26E7391A018E0061965F840F975F3401A60F 115 | S1230F40843501A906193401A784301F8C005E26EE3501398D3E270BD6628D070C641F98FF 116 | S1230F607E0EA37E033D17FEA25FD730966727EABD0DFA17FE958B991927183402BD0E6604 117 | S1230F80BD0EB5350220EF9F39963991372604D63AD138398E00625F6D02260E6D01260A0C 118 | S1230FA0A684840F2604A784C604A6844684085D27028A049A301F8A39BD03932002A684F6 119 | S1230FC0C601810D27195A340280282B108118230F8132230681362604C60ACB0235023970 120 | S1230FE09F248E0FEBE6869E2420F205040A060107000B0303030303030303030301010115 121 | S123100001010809C6088E0000A603484848A803484869846901690269035A26ECA684815C 122 | S10A10209F22E18B00193946 123 | S1046F003953 124 | S9030000FC 125 | -------------------------------------------------------------------------------- /sbc/tscbasic/random.bas: -------------------------------------------------------------------------------- 1 | 10 REM TEST OF RANDOM NUMBER DISTRIBUTION 2 | 15 DIM X(9) 3 | 20 GOSUB 1000 4 | 30 INPUT "NUMBER OF TIMES ",A 5 | 40 FOR B=0 TO 9: X(B)=0: NEXT B 6 | 50 FOR B=1 TO ABS(A) 7 | 60 C=RND/10: X(C)=X(C)+1 8 | 70 NEXT B 9 | 80 GOSUB 1000 10 | 90 PRINT TAB(10);"NUMBER";TAB(20);"TIMES" 11 | 100 PRINT TAB(10);"-------";TAB(20);"-----":PRI 12 | 110 FOR I=0 TO 9:PRI TAB(12);I;TAB(21);X(I) 13 | 120 NEXT I 14 | 130 GOSUB 1000 15 | 135 R=0 16 | 140 FOR J=0 TO 9 : R=R+(J*X(J)): NEXT J 17 | 150 PRINT "AVERAGE = ";R/A;" ";R-(R/A*A) 18 | 155 Z=2 19 | 160 IF R/A<4 LET Z=1 20 | 170 IF R/A>4 THEN Z=3 21 | 180 GOSUB 1000 22 | 190 ON Z GOSUB 300,400,500 23 | 200 END 24 | 300 PRINT "AVERAGE IS LOW":RETURN 25 | 400 PRI "AVERAGE IS OK!!": RET 26 | 500 PRIN "AVERAGE IS HIGH":RET 27 | 1000 PRI:PRI: RET 28 | -------------------------------------------------------------------------------- /sbc/tscbasic/switch.bas: -------------------------------------------------------------------------------- 1 | 10 REM BASIC PLUS 'SWITCH' 2 | 12 REM THE OBJECT OF SWITCH IS TO REARRANGE A 3 | 14 REM RANDOM SEQUENCE TO NUMERICAL ORDER, LEFT TO RIGHT. 4 | 16 REM THIS IS DONE BY 'SWITCH'ING A PARTIAL 5 | 18 REM SEQUENCE STARTING FROM THE LEFT. FOR EXAMPLE 6 | 20 REM SWITCH 3 WOULD REVERSE THE SEQUENCE OF THE FIRST 7 | 22 REM THREE NUMBERS FROM THE LEFT. 8 | 25 DIM M(9) 9 | 30 FOR I=1 TO 9 : M(I)=10-I : NEXT I 10 | 40 FOR I=1 TO 10 11 | 50 A=RND/12+1 12 | 60 K=M(A) : M(A)=M(1) : M(1)=K 13 | 70 NEXT I 14 | 80 PRINT "THE SEQUENCE IS ":T=0 15 | 90 GOSUB 220 16 | 100 INPUT "SWITCH HOW MANY ",D 17 | 110 IF D>0 IF D<10 GOTO 120 18 | 115 GOTO 100 19 | 120 E=1:T=T+1 20 | 130 IF D<=E GOTO 150 21 | 140 F=M(E):M(E)=M(D):M(D)=F : D=D-1 : E=E+1 : GOTO 130 22 | 150 FOR I=1 TO 9 23 | 160 IF M(I)<>I GOTO 90 24 | 170 NEXT I 25 | 175 GOSUB 220 26 | 180 PRI:PRINT "YOU WIN IN ";T;" MOVES" 27 | 190 PRI:INPUT "WANT TO PLAY AGAIN (YES=1) ",T 28 | 200 IF T=1 GOTO 30 29 | 210 END 30 | 220 FOR I=1 TO 9:PRI M(I);:NEXT I:RET 31 | -------------------------------------------------------------------------------- /sbc/tscbasic/testprog.bas: -------------------------------------------------------------------------------- 1 | 10 REM TEST PROGRAM TO EXERCISE BASIC COMMANDS AND FUNCTIONS 2 | 20 REM BY JEFF TRANTER 3 | 30 DIM M(10) : DIM N(2,3) 4 | 40 M(0) = 1 5 | 50 N(1,2) = 2 6 | 60 B = 1 7 | 70 LET C = 99999 8 | 80 LET Z = -99999 9 | 90 GOSUB 2000 10 | 100 I = 1 11 | 110 ON I GOTO 130,140,150 12 | 120 ON I GOSUB 2000,2000,2000 13 | 130 REM 14 | 140 REM 15 | 150 REM 16 | 160 FOR I = 1 TO 10 17 | 170 PRINT I 18 | 180 NEXT I 19 | 190 FOR J = 1 TO -100 STEP -2 20 | 200 PRINT J,J*J 21 | 210 NEXT J 22 | 220 INPUT I,J 23 | 230 INPUT "ENTER A NUMBER ",I 24 | 240 PRINT "I = ";I 25 | 250 A = ABS(2) 26 | 260 A = ABS(-2) 27 | 270 A = RND 28 | 290 A = SGN(-1) 29 | 300 A = SGN(1) 30 | 310 PRINT SPC(4);"4 SPACES" 31 | 320 PRINT TAB(2);"2 TABS" 32 | 330 I = 1 33 | 340 I = +1 34 | 350 I = -1 35 | 360 I = 1 + 2 - 3 36 | 370 I = 16 / 2 37 | 380 I = 8 * 9 38 | 390 I = 2^3 39 | 400 I = -I 40 | 410 I = +I 41 | 420 I = 1 42 | 430 J = 2 43 | 440 IF I = J THEN PRINT I 44 | 450 IF J < I THEN PRINT J 45 | 460 IF I > J THEN PRINT I 46 | 470 IF J <= I THEN PRINT J 47 | 480 IF I >= J THEN PRINT I 48 | 490 IF I <> I THEN PRINT I 49 | 500 GOTO 3000 50 | 1000 RESTORE 51 | 1010 READ X 52 | 1020 IF X = -1 THEN RETURN 53 | 1030 GOTO 1020 54 | 1040 DATA 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1 55 | 2000 RETURN 56 | 3000 END 57 | -------------------------------------------------------------------------------- /sbc/wozmon/Makefile: -------------------------------------------------------------------------------- 1 | all: wozmon.s19 2 | 3 | wozmon.s19: wozmon.asm 4 | as9 wozmon.asm -l s19 now 5 | 6 | upload: wozmon.s19 7 | ascii-xfr -s wozmon.s19 -l 1 -c 1 >/dev/ttyUSB0 8 | 9 | clean: 10 | $(RM) wozmon.s19 wozmon.lst 11 | 12 | distclean: clean 13 | -------------------------------------------------------------------------------- /sbc/wozmon/README.txt: -------------------------------------------------------------------------------- 1 | This is a port of the 6800 version of Woz Mon to my 6809-based Single 2 | Board Computer. 3 | --------------------------------------------------------------------------------