├── .editorconfig ├── .gitattributes ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── code ├── .clang-format ├── .vscode │ └── settings.json ├── CPM22 │ ├── 8080_z80.txt │ ├── BDOS.Z80 │ ├── BIOS.Z80 │ ├── BOOT.Z80 │ ├── CCP.Z80 │ ├── MEMLOCS.Z80 │ ├── Makefile │ ├── VECTORS.Z80 │ └── memorymap.txt ├── LICENSE ├── Makefile ├── conio.c ├── conio.h ├── disks │ ├── A │ │ ├── .gitignore │ │ ├── ASM.COM │ │ ├── CRC.COM │ │ ├── CRC.MAC │ │ ├── DDT.COM │ │ ├── DDTZ.COM │ │ ├── DUMP.COM │ │ ├── ED.COM │ │ ├── FILES.TXT │ │ ├── LOAD.COM │ │ ├── PIP.COM │ │ ├── STAT.COM │ │ ├── SUBMIT.COM │ │ ├── XR.COM │ │ ├── XS.COM │ │ ├── XSUB.COM │ │ ├── free.sub │ │ └── zde.com │ ├── B │ │ ├── .gitignore │ │ ├── 180FIG.COM │ │ ├── 8080.MAC │ │ ├── LINK.COM │ │ ├── MAC.COM │ │ ├── MAKESYM.COM │ │ ├── MAKESYM.DOC │ │ ├── MBASIC.COM │ │ ├── OBASIC.COM │ │ ├── RMAC.COM │ │ ├── SLR180.COM │ │ ├── SLR180.DOC │ │ ├── SYNTAX.HLP │ │ ├── Z80ASM.COM │ │ ├── ZASM.COM │ │ ├── l80.com │ │ └── m80.com │ ├── C │ │ ├── .gitignore │ │ ├── cmdlin.pas │ │ ├── lister.pas │ │ ├── mc-mod00.inc │ │ ├── mc-mod01.inc │ │ ├── mc-mod02.inc │ │ ├── mc-mod03.inc │ │ ├── mc-mod04.inc │ │ ├── mc-mod05.inc │ │ ├── mc.com │ │ ├── mc.hlp │ │ ├── mc.pas │ │ ├── mcdemo.mcs │ │ ├── read.me │ │ ├── tinst.com │ │ ├── tinst.dta │ │ ├── tinst.msg │ │ ├── turbo.com │ │ ├── turbo.msg │ │ └── turbo.ovr │ ├── D │ │ ├── .gitignore │ │ ├── INSTALL.COM │ │ ├── MAILMRGE.OVR │ │ ├── MERGPRIN.OVR │ │ ├── WIMSGS.OVR │ │ ├── WS.COM │ │ ├── WSMSGS.OVR │ │ ├── WSOVLY1.OVR │ │ └── WSU.COM │ ├── E │ │ ├── .gitignore │ │ ├── WINSTALL.COM │ │ ├── WS.COM │ │ ├── WS.INS │ │ ├── WSMSGS.OVR │ │ ├── WSOVLY1.OVR │ │ └── WSU.COM │ ├── F │ │ ├── .gitignore │ │ ├── KIDS │ │ └── STAN │ ├── G │ │ ├── .gitignore │ │ ├── BIO.BAS │ │ ├── CHASE.BAS │ │ ├── STRTRK.BAS │ │ ├── TRADE.BAS │ │ ├── WUMP.BAS │ │ ├── ladconf.com │ │ ├── ladder.com │ │ ├── ladder.dat │ │ └── ladder.scr │ ├── H │ │ ├── .gitignore │ │ ├── 23matches.bas │ │ ├── 3dplot.bas │ │ ├── aceyducey.bas │ │ ├── amazing.bas │ │ ├── animal.bas │ │ ├── awari.bas │ │ ├── bagels.bas │ │ ├── banner.bas │ │ ├── basketball.bas │ │ ├── batnum.bas │ │ ├── battle.bas │ │ ├── blackjack.bas │ │ ├── bombardment.bas │ │ ├── bombsaway.bas │ │ ├── bounce.bas │ │ ├── bowling.bas │ │ ├── boxing.bas │ │ ├── bug.bas │ │ ├── bullfight.bas │ │ ├── bullseye.bas │ │ ├── bunny.bas │ │ ├── buzzword.bas │ │ ├── calendar.bas │ │ ├── change.bas │ │ ├── checkers.bas │ │ ├── chemist.bas │ │ ├── chief.bas │ │ ├── chomp.bas │ │ ├── civilwar.bas │ │ ├── combat.bas │ │ ├── craps.bas │ │ ├── cube.bas │ │ ├── depthcharge.bas │ │ ├── diamond.bas │ │ ├── dice.bas │ │ ├── digits.bas │ │ ├── evenwins.bas │ │ ├── flipflop.bas │ │ ├── football.bas │ │ ├── ftball.bas │ │ ├── furtrader.bas │ │ ├── gameofevenwins.bas │ │ ├── golf.bas │ │ ├── gomoko.bas │ │ ├── guess.bas │ │ ├── gunner.bas │ │ ├── hammurabi.bas │ │ ├── hangman.bas │ │ ├── hello.bas │ │ ├── hexapawn.bas │ │ ├── hi-lo.bas │ │ ├── highiq.bas │ │ ├── hockey.bas │ │ ├── horserace.bas │ │ └── hurkle.bas │ ├── I │ │ ├── .gitignore │ │ ├── kinema.bas │ │ ├── king.bas │ │ ├── lem.bas │ │ ├── letter.bas │ │ ├── life.bas │ │ ├── lifefortwo.bas │ │ ├── litquiz.bas │ │ ├── love.bas │ │ ├── lunar.bas │ │ ├── mastermind.bas │ │ ├── mathdice.bas │ │ ├── mine.bas │ │ ├── mugwump.bas │ │ ├── name.bas │ │ ├── nicomachus.bas │ │ ├── nim.bas │ │ ├── number.bas │ │ ├── onecheck.bas │ │ ├── orbit.bas │ │ ├── pizza.bas │ │ ├── poetry.bas │ │ ├── poker.bas │ │ ├── qubit.bas │ │ ├── queen.bas │ │ ├── reverse.bas │ │ ├── rocket.bas │ │ ├── rockscissors.bas │ │ ├── roulette.bas │ │ ├── russianroulette.bas │ │ ├── salvo.bas │ │ ├── sinewave.bas │ │ ├── slalom.bas │ │ ├── slots.bas │ │ ├── splat.bas │ │ ├── sstartrk.bas │ │ ├── sstins.bas │ │ ├── stars.bas │ │ ├── stockmarket.bas │ │ ├── suite.bas │ │ ├── synonym.bas │ │ ├── target.bas │ │ ├── test.bas │ │ ├── tictact1.bas │ │ ├── tictact2.bas │ │ ├── tower.bas │ │ ├── train.bas │ │ ├── trap.bas │ │ ├── war.bas │ │ ├── weekday.bas │ │ └── word.bas │ ├── J │ │ └── .gitignore │ ├── K │ │ └── .gitignore │ ├── L │ │ └── .gitignore │ ├── M │ │ ├── .gitignore │ │ ├── XMODEM.ASM │ │ ├── XMODEM.CFG │ │ └── XMODEM.COM │ ├── Makefile │ ├── N │ │ ├── .gitignore │ │ ├── 400mc.com │ │ ├── 400mc.z80 │ │ ├── cycles.com │ │ ├── cycles.z80 │ │ ├── exit.com │ │ └── exit.z80 │ ├── O │ │ └── .gitignore │ └── deskew.sh ├── dist │ └── readme.txt ├── espbin │ ├── blank.binary │ └── esp_init_data_default.binary ├── espincludes.h ├── flash.c ├── flash.h ├── gpio16.c ├── gpio16.h ├── include │ ├── c_types.h │ ├── eagle_soc.h │ ├── esp8266_auxrom.h │ ├── esp8266_rom.h │ ├── ets_sys.h │ ├── nosdk8266.h │ ├── pin_mux_register.h │ ├── uart_dev.h │ └── uart_register.h ├── ld │ ├── addresses.ld │ └── linkerscript.ld ├── machine.c ├── machine.h ├── main.c ├── monitor.c ├── monitor.h ├── nosdk │ ├── README.md │ ├── nosdk8266.c │ └── startup.S ├── uart.c ├── uart.h ├── user_config.h ├── utils.c ├── utils.h ├── wifi.c ├── wifi.h └── z80 │ ├── README.md │ ├── instructions.h │ ├── macros.h │ ├── tables.h │ ├── z80config.h │ ├── z80emu.c │ ├── z80emu.h │ └── z80user.h ├── doc ├── .DS_Store ├── 22srcimg │ ├── 22src1.img │ └── 22src2.img ├── 8080.txt ├── CPM on new computer.md ├── CPM-ref.txt ├── DDTZ-DOC.txt ├── How to Bootstrap CPM.doc ├── How to bootstrap CPM.md ├── README_z80emu.txt ├── cpmproref.txt └── testfiles │ ├── zexall.com │ ├── zexall.z80 │ ├── zexdoc.com │ └── zexdoc.z80 ├── notes.txt └── pic ├── boot1.png └── wifi36k.png /.editorconfig: -------------------------------------------------------------------------------- 1 | [Makefile] 2 | indent_style = tab 3 | 4 | [*.Z80] 5 | indent_style = tab 6 | indent_size = 8 7 | end_of_line = crlf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | code/disks/A/* linguist-vendored 2 | code/disks/B/* linguist-vendored 3 | code/disks/C/* linguist-vendored 4 | code/disks/D/* linguist-vendored 5 | code/disks/E/* linguist-vendored 6 | code/disks/F/* linguist-vendored 7 | code/disks/G/* linguist-vendored 8 | code/disks/H/* linguist-vendored 9 | code/disks/I/* linguist-vendored 10 | code/disks/J/* linguist-vendored 11 | code/disks/K/* linguist-vendored 12 | code/disks/L/* linguist-vendored 13 | code/disks/M/* linguist-vendored 14 | code/disks/N/* linguist-vendored 15 | code/disks/O/* linguist-vendored 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Editor backup files 2 | *~ 3 | *.bak 4 | 5 | # 6 | .DS_Store 7 | 8 | # Files generated by compiler/linker 9 | *.o 10 | *.bin 11 | *.map 12 | *.elf 13 | *.lst 14 | *.pre 15 | *.zip 16 | *.cap 17 | *.log 18 | 19 | # We currently don't want the DSK images stored in the repo 20 | *.DSK 21 | 22 | # Some private folders 23 | private/ 24 | tmp/ 25 | sed80/ 26 | xmodem80/ 27 | RunCPM/ 28 | 29 | # Created by the Makefile 30 | Makefile.tmp 31 | SETTINGS.Z80 32 | boot.data 33 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "C_Cpp.clang_format_style": "file", 4 | "C_Cpp.clang_format_fallbackStyle": "none", 5 | "[z80-asm]": { 6 | "editor.quickSuggestions": false, 7 | "editor.wrappingColumn": 0, 8 | "editor.rulers": [80] 9 | } 10 | 11 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Mats Engstom and others - see respecive source folders. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /code/.clang-format: -------------------------------------------------------------------------------- 1 | BasedOnStyle: Google 2 | AllowShortBlocksOnASingleLine: true 3 | AllowShortCaseLabelsOnASingleLine: true 4 | AllowShortFunctionsOnASingleLine: true 5 | AllowShortIfStatementsOnASingleLine: true 6 | AllowShortLoopsOnASingleLine: true 7 | AlignTrailingComments: true 8 | ColumnLimit: 0 9 | MaxEmptyLinesToKeep: 2 10 | SpaceBeforeAssignmentOperators: true 11 | SpacesInParentheses: false -------------------------------------------------------------------------------- /code/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "**/*.bin": true, 5 | "**/*.tmp": true, 6 | "**/*.DSK": true, 7 | "**/*.o": true 8 | } 9 | } -------------------------------------------------------------------------------- /code/CPM22/BOOT.Z80: -------------------------------------------------------------------------------- 1 | ; 2 | ; SECOND STAGE BOOTLOADER FOR CPM8266 3 | ; Copyright (c) 2017 Mats Engstrom, SmallRoomLabs 4 | ; 5 | ; Some parts are from the original skeletal BIOS code 6 | ; Copyright (c) 1980 Digital Research 7 | ; 8 | 9 | include "MEMLOCS.Z80" 10 | include "VECTORS.Z80" 11 | 12 | org 0000h 13 | 14 | ; 15 | ; Command codes that are sent to the emulator via a OUT (xxx),A instruction 16 | ; to handle the BIOS low level console & disk I/O emulation 17 | ; 18 | EMU_EXIT: equ 00h 19 | EMU_CONOUT: equ 01h 20 | EMU_LIST: equ 02h 21 | EMU_PUNCH: equ 03h 22 | EMU_CONIN: equ 04h 23 | EMU_CONST: equ 05h 24 | EMU_SETDMA: equ 06h 25 | EMU_SETTRK: equ 07h 26 | EMU_SETSEC: equ 08h 27 | EMU_HOME: equ 09h 28 | EMU_SETDSK: equ 0Ah 29 | EMU_READ: equ 0Bh 30 | EMU_WRITE: equ 0Ch 31 | 32 | LD BC,2 ; B=TRACK 0, C=SECTOR 2 33 | LD D,51 ; D=# SECTORS TO LOAD 34 | LD HL,START_CCPCODE ; HL=BASE TRANSFER ADDRESS 35 | 36 | LoadSector: 37 | ; INSERT INLINE CODE AT THIS POINT TO READ ONE 128 BYTE SECTOR FROM THE 38 | ; TRACK GIVEN IN REGISTER B, SECTOR GIVEN IN REGISTER C, INTO THE ADDRESS 39 | ; GIVEN BY BRANCH TO LOCATION "COLD" IF A READ ERROR OCCURS 40 | 41 | LD (tmpbc),BC ; Save BC 42 | 43 | OUT (EMU_SETSEC),A ; arg is C, data in C 44 | 45 | LD C,0 46 | OUT (EMU_SETDSK),A ; arg is C, data=0 47 | 48 | LD C,B 49 | OUT (EMU_SETTRK),A ; arg is C, data in B 50 | 51 | LD B,H 52 | LD C,L 53 | OUT (EMU_SETDMA),A ; arg is BC, data in HL 54 | 55 | OUT (EMU_READ),A ; No args 56 | 57 | LD BC,(tmpbc) ; Restore BC 58 | 59 | 60 | ; GO TO NEXT SECTOR IF LOAD IS INCOMPLETE 61 | DEC D ; SECTS=SECTS-1 62 | JP Z,BOOT ; All sectors loaded, start CP/M 63 | 64 | ; MORE SECTORS TO LOAD 65 | LD SP,128 ; 128 BYTES PER SECTOR 66 | ADD HL,SP ; HL=HL+128 67 | INC C ; SECTOR=SECTOR+1 68 | LD A,C 69 | CP 27 ; LAST SECTOR OF TRACK? 70 | JP C,LoadSector ; NO, GO READ ANOTHER 71 | 72 | ;END OF TRACK, INCREMENT TO NEXT TRACK 73 | LD C,1 ; SECTOR=1 74 | INC B ; TRACK=TRACK+1 75 | JP LoadSector ; FOR ANOTHER GROUP 76 | 77 | ; done with the load 78 | 79 | tmpbc: ds 1 ; Holding area for register BC 80 | 81 | END 82 | -------------------------------------------------------------------------------- /code/CPM22/MEMLOCS.Z80: -------------------------------------------------------------------------------- 1 | include "SETTINGS.Z80" 2 | 3 | RAMSIZE: EQU MEM-0800h 4 | RAMSIZEK: EQU RAMSIZE/1024 5 | 6 | START_ROMMON: EQU MEM-0800h 7 | START_BIOSDATA: EQU MEM-0800h-0380h 8 | START_BIOSCODE: EQU MEM-0800h-0380h-0380h 9 | START_BDOSCODE: EQU MEM-0800h-0380h-0380h-0E00h 10 | START_CCPCODE: EQU MEM-0800h-0380h-0380h-0E00h-0800h 11 | 12 | TBASE: EQU 100H ; TPA - Transient Program Area 13 | CBASE: EQU START_CCPCODE ; Used for sanity checks 14 | FBASE: EQU START_BDOSCODE+6 ; Used for sanity checks 15 | 16 | ; 17 | ; Areas in ZERO PAGE MEMORY 18 | ; 19 | IOBYTE: EQU 3 ; i/o definition byte. 20 | TDRIVE: EQU 4 ; current drive name and user number. 21 | ENTRY: EQU 5 ; entry point for the cp/m bdos. 22 | TBUFF: EQU 80H ; i/o buffer and command line storage. 23 | 24 | ; 25 | ; BIOS JUMP VECTORS 26 | ; 27 | ;BOOT: EQU START_BIOSCODE + 00h 28 | ;WBOOT: EQU START_BIOSCODE + 03h 29 | ;CONST: EQU START_BIOSCODE + 06h 30 | ;CONIN: EQU START_BIOSCODE + 09h 31 | ;CONOUT: EQU START_BIOSCODE + 0Ch 32 | ;LIST: EQU START_BIOSCODE + 0Fh 33 | ;PUNCH: EQU START_BIOSCODE + 12h 34 | ;READER: EQU START_BIOSCODE + 15h 35 | ;HOME: EQU START_BIOSCODE + 18h 36 | ;SELDSK: EQU START_BIOSCODE + 1Bh 37 | ;SETTRK: EQU START_BIOSCODE + 1Eh 38 | ;SETSEC: EQU START_BIOSCODE + 21h 39 | ;SETDMA: EQU START_BIOSCODE + 24h 40 | ;READ: EQU START_BIOSCODE + 27h 41 | ;WRITE: EQU START_BIOSCODE + 2Ah 42 | ;LISTST: EQU START_BIOSCODE + 2Dh 43 | ;SECTRN: EQU START_BIOSCODE + 30h 44 | 45 | -------------------------------------------------------------------------------- /code/CPM22/Makefile: -------------------------------------------------------------------------------- 1 | SHELL = /bin/bash 2 | 3 | CPMMEMORY ?= 65536 4 | VERSION ?= 0 5 | 6 | ASM = /usr/bin/z80asm 7 | XXD = /usr/bin/xxd 8 | 9 | 10 | all: BOOT.bin BIOS.bin BDOS.bin CCP.bin 11 | 12 | BOOT.bin: BOOT.Z80 13 | @echo [Z80ASM] $< 14 | @echo "MEM: EQU $(CPMMEMORY)" > SETTINGS.Z80 15 | @echo "VERSION: EQU $(VERSION)" >> SETTINGS.Z80 16 | @$(ASM) --list=BOOT.lst $< -o $@ 17 | 18 | BIOS.bin: BIOS.Z80 19 | @echo [Z80ASM] $< 20 | @echo "MEM: EQU $(CPMMEMORY)" > SETTINGS.Z80 21 | @echo "VERSION: EQU $(VERSION)" >> SETTINGS.Z80 22 | @$(ASM) --list=BIOS.lst $< -o $@ 23 | 24 | BDOS.bin: BDOS.Z80 25 | @echo [Z80ASM] $< 26 | @echo "MEM: EQU $(CPMMEMORY)" > SETTINGS.Z80 27 | @echo "VERSION: EQU $(VERSION)" >> SETTINGS.Z80 28 | @$(ASM) --list=BDOS.lst $< -o $@ 29 | 30 | CCP.bin: CCP.Z80 31 | @echo [Z80ASM] $< 32 | @echo "MEM: EQU $(CPMMEMORY)" > SETTINGS.Z80 33 | @echo "VERSION: EQU $(VERSION)" >> SETTINGS.Z80 34 | @$(ASM) --list=CCP.lst $< -o $@ 35 | 36 | clean : 37 | @rm -rf *~ 38 | @rm -rf *.{bin,lst} 39 | 40 | 41 | -------------------------------------------------------------------------------- /code/CPM22/VECTORS.Z80: -------------------------------------------------------------------------------- 1 | ; 2 | ; BIOS JUMP VECTORS 3 | ; 4 | BOOT: EQU START_BIOSCODE + 00h 5 | WBOOT: EQU START_BIOSCODE + 03h 6 | CONST: EQU START_BIOSCODE + 06h 7 | CONIN: EQU START_BIOSCODE + 09h 8 | CONOUT: EQU START_BIOSCODE + 0Ch 9 | LIST: EQU START_BIOSCODE + 0Fh 10 | PUNCH: EQU START_BIOSCODE + 12h 11 | READER: EQU START_BIOSCODE + 15h 12 | HOME: EQU START_BIOSCODE + 18h 13 | SELDSK: EQU START_BIOSCODE + 1Bh 14 | SETTRK: EQU START_BIOSCODE + 1Eh 15 | SETSEC: EQU START_BIOSCODE + 21h 16 | SETDMA: EQU START_BIOSCODE + 24h 17 | READ: EQU START_BIOSCODE + 27h 18 | WRITE: EQU START_BIOSCODE + 2Ah 19 | LISTST: EQU START_BIOSCODE + 2Dh 20 | SECTRN: EQU START_BIOSCODE + 30h 21 | 22 | -------------------------------------------------------------------------------- /code/CPM22/memorymap.txt: -------------------------------------------------------------------------------- 1 | DISK FILE MEMORY 2 | STRT END STRT END LEN 3 | ---------------------------------------- 4 | BOOT2 0000..007F 0000-007F 128/080 5 | CCP 0080..087F DB00-E2FF 2048/800 6 | BDOS 0880..167F E300-F0FF 3584/E00 7 | BIOS 1680..19FF F100-F47F 896/380 8 | 9 | 10 | CNT TRK SEC PG Ofs Memory 11 | 0 00 00 -- 0/0000 0000 Cold Start Loader 12 | 1 00 02 00 128/0080 DB00 CCP 2K - 2048 (800h) bytes 13 | 2 00 03 00 256/0100 DB80 14 | 3 00 04 01 384/0180 DC00 15 | 4 00 05 01 512/0200 DC80 16 | 5 00 06 02 640/0280 DD00 17 | 6 00 07 02 768/0300 DD80 18 | 7 00 08 03 896/0380 DE00 19 | 8 00 09 03 1024/0400 DE80 20 | 9 00 10 04 1152/0480 DF00 21 | 10 00 11 04 1280/0500 DF80 22 | 11 00 12 05 1408/0580 E000 23 | 12 00 13 05 1536/0600 E080 24 | 13 00 14 06 1664/0680 E100 25 | 14 00 15 06 1792/0700 E180 26 | 15 00 16 07 1920/0780 E200 27 | 16 00 17 07 2048/0800 E280 28 | 17 00 18 08 2176/0880 E300 BDOS 3.5K - 3584 (E00h) bytes 29 | 18 00 19 08 2304/0900 E380 30 | 19 00 20 09 2432/0980 E400 31 | 20 00 21 09 2560/0A00 E480 32 | 21 00 22 10 2688/0A80 E500 33 | 22 00 23 10 2816/0B00 E580 34 | 23 00 24 11 2944/0B80 E600 35 | 24 00 25 11 3072/0C00 E680 36 | 25 00 26 12 3200/0C80 E700 37 | 26 01 01 12 3328/0D00 E780 38 | 27 01 02 13 3456/0D80 E800 39 | 28 01 03 13 3584/0E00 E880 40 | 29 01 04 14 3712/0E80 E900 41 | 30 01 05 14 3840/0F80 E980 42 | 31 01 06 15 3968/0F80 EA00 43 | 32 01 07 15 4096/1000 EA80 44 | 33 01 08 16 4224/1080 EB00 45 | 34 01 09 16 4352/1100 EB80 46 | 35 01 10 17 4480/1180 EC00 47 | 36 01 11 17 4608/1200 EC80 48 | 37 01 12 18 4736/1280 ED00 49 | 38 01 13 18 4864/1300 ED80 50 | 39 01 14 19 4992/1380 EE00 51 | 40 01 15 19 5120/1400 EE80 52 | 41 01 16 20 5248/1480 EF00 53 | 42 01 17 20 5376/1500 EF80 54 | 43 01 18 21 5504/1580 F000 55 | 44 01 19 21 5632/1600 F080 56 | 45 01 20 22 5760/1680 F100 BIOS 896 (380h) bytes 57 | 46 01 21 22 5888/1700 F180 58 | 47 01 22 23 6016/1780 F200 59 | 48 01 23 23 6144/1800 F280 60 | 49 01 24 24 6272/1880 F300 61 | 50 01 25 24 6400/1900 F380 62 | 51 01 26 25 6528/1980 F400 63 | -- -- -- -- ---- F480 BIOS DATA 896 (380h) bytes 64 | -- -- -- -- ---- F500 65 | -- -- -- -- ---- F580 66 | -- -- -- -- ---- F600 67 | -- -- -- -- ---- F680 68 | -- -- -- -- ---- F700 69 | -- -- -- -- ---- F780 70 | -- -- -- -- ---- F800 ROM MONITOR 2K - 2048 (800h) bytes 71 | -- -- -- -- ---- F880 72 | -- -- -- -- ---- F900 73 | -- -- -- -- ---- F980 74 | -- -- -- -- ---- FA00 75 | -- -- -- -- ---- FA80 76 | -- -- -- -- ---- FB00 77 | -- -- -- -- ---- FB80 78 | -- -- -- -- ---- FC00 79 | -- -- -- -- ---- FC80 80 | -- -- -- -- ---- FD00 81 | -- -- -- -- ---- FD80 82 | -- -- -- -- ---- FE00 83 | -- -- -- -- ---- FE80 84 | -- -- -- -- ---- FF00 85 | -- -- -- -- ---- FF80 86 | -- -------------------------------------------------------------------------------- /code/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | * 4 | * Copyright 2017 Mats Engstrom. 5 | * The "nosdk" parts copyright 2016 CNLohr. 6 | * The Z80 emulator parts copyright 2012, 2016 Lin Ke-Fong. 7 | * CP/M Copyright 1980 Digital Research, used with permission from Lineo 2001 8 | * 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | -------------------------------------------------------------------------------- /code/conio.c: -------------------------------------------------------------------------------- 1 | #include "c_types.h" 2 | 3 | #include "eagle_soc.h" 4 | #include "ets_sys.h" 5 | #include "gpio.h" 6 | #include "uart_dev.h" 7 | #ifdef NOSDK 8 | #include "nosdk8266.h" 9 | #include "esp8266_auxrom.h" 10 | #include "esp8266_rom.h" 11 | #endif 12 | 13 | #include "conio.h" 14 | 15 | #define IOBUFSIZE 512 16 | 17 | static volatile uint8_t rxBuf[IOBUFSIZE]; 18 | static volatile uint16_t rxR = 0; 19 | static volatile uint16_t rxW = 0; 20 | 21 | 22 | // 23 | // 24 | // 25 | uint16_t ICACHE_FLASH_ATTR GetRxCnt(void) { 26 | if (rxW == rxR) return 0; 27 | if (rxW > rxR) return rxW - rxR; 28 | return (sizeof(rxBuf) - rxR) + rxW; 29 | } 30 | 31 | 32 | // 33 | // 34 | // 35 | uint8_t ICACHE_FLASH_ATTR GetRxChar(void) { 36 | int i; 37 | // Wait for character to become available 38 | while (!GetRxCnt()) continue; 39 | rxR = (rxR + 1) & (sizeof(rxBuf) - 1); 40 | return rxBuf[rxR]; 41 | } 42 | 43 | // 44 | // Returns the pressed key. This function waits until a key is 45 | // pressed if "wait" is true. If wait is false and no key is available 46 | // then 0x00 is returned 47 | // 48 | char ICACHE_FLASH_ATTR GetKey(bool wait) { 49 | char ch; 50 | if (wait) { 51 | ch=GetRxChar(); 52 | return ch; 53 | } 54 | if (GetRxCnt() == 0) { 55 | return 0x00; 56 | } 57 | ch=GetRxChar(); 58 | return ch; 59 | } 60 | 61 | 62 | // 63 | // 64 | // 65 | void ICACHE_FLASH_ATTR EmptyComBuf(void) { 66 | while (GetRxCnt()) GetRxChar(); 67 | } 68 | 69 | 70 | // 71 | // 72 | // 73 | void StoreInComBuf(uint8_t ch) { 74 | if (GetRxCnt() < sizeof(rxBuf) - 1) { 75 | rxW = (rxW + 1) & (sizeof(rxBuf) - 1); 76 | rxBuf[rxW] = ch; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /code/conio.h: -------------------------------------------------------------------------------- 1 | #ifndef _CONIO_H 2 | #define _CONIO_H 3 | 4 | char ICACHE_FLASH_ATTR GetKey(bool wait); 5 | uint16_t ICACHE_FLASH_ATTR GetRxCnt(void); 6 | uint8_t ICACHE_FLASH_ATTR GetRxChar(void); 7 | void ICACHE_FLASH_ATTR EmptyComBuf(void); 8 | void StoreInComBuf(uint8_t ch); 9 | 10 | #endif -------------------------------------------------------------------------------- /code/disks/A/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/.gitignore -------------------------------------------------------------------------------- /code/disks/A/ASM.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/ASM.COM -------------------------------------------------------------------------------- /code/disks/A/CRC.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/CRC.COM -------------------------------------------------------------------------------- /code/disks/A/DDT.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/DDT.COM -------------------------------------------------------------------------------- /code/disks/A/DDTZ.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/DDTZ.COM -------------------------------------------------------------------------------- /code/disks/A/DUMP.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/DUMP.COM -------------------------------------------------------------------------------- /code/disks/A/ED.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/ED.COM -------------------------------------------------------------------------------- /code/disks/A/FILES.TXT: -------------------------------------------------------------------------------- 1 | A: System utilities 2 | B: Assemblers & BASIC 3 | C: Turbo Pascal 3.0 4 | D: Wordstar 5 | E: 6 | F: 7 | G: Games 8 | H: 9 | I: 10 | J: 11 | K: 12 | L: 13 | M: 14 | N:Misc Assembly sources 15 | O:Empty in NOSDK, Linked as N: in WIFI mode 16 | -------------------------------------------------------------------------------- /code/disks/A/LOAD.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/LOAD.COM -------------------------------------------------------------------------------- /code/disks/A/PIP.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/PIP.COM -------------------------------------------------------------------------------- /code/disks/A/STAT.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/STAT.COM -------------------------------------------------------------------------------- /code/disks/A/SUBMIT.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/SUBMIT.COM -------------------------------------------------------------------------------- /code/disks/A/XR.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/XR.COM -------------------------------------------------------------------------------- /code/disks/A/XS.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/XS.COM -------------------------------------------------------------------------------- /code/disks/A/XSUB.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/XSUB.COM -------------------------------------------------------------------------------- /code/disks/A/free.sub: -------------------------------------------------------------------------------- 1 | B: 2 | C: 3 | D: 4 | E: 5 | F: 6 | G: 7 | H: 8 | I: 9 | J: 10 | L: 11 | M: 12 | N: 13 | O: 14 | A: 15 | STAT 16 |  -------------------------------------------------------------------------------- /code/disks/A/zde.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/A/zde.com -------------------------------------------------------------------------------- /code/disks/B/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/.gitignore -------------------------------------------------------------------------------- /code/disks/B/180FIG.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/180FIG.COM -------------------------------------------------------------------------------- /code/disks/B/LINK.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/LINK.COM -------------------------------------------------------------------------------- /code/disks/B/MAC.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/MAC.COM -------------------------------------------------------------------------------- /code/disks/B/MAKESYM.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/MAKESYM.COM -------------------------------------------------------------------------------- /code/disks/B/MAKESYM.DOC: -------------------------------------------------------------------------------- 1 | The MAKESYM program included on this diskette is used to produce a .SYM 2 | file from the Symbol Table listing provided by Z80ASM or SLRMAC. MAKESYM 3 | reads a .LST file, converts the symbol table to a format readable by 4 | ZSID, DSD80, etc, and writes it to a .SYM file on the same drive. 5 | 6 | Since extra information is included in the .LST file, such as CSEG relative 7 | designations, or COMMON relative, external, etc, MAKESYM allows you to 8 | specify offsets for any or all of the relative types, while stripping out 9 | any external symbols (Only one COMMON is supported since there is no dis- 10 | tinction between different COMMONs in the .LST table). 11 | 12 | This is useful for intense debugging of a particular module where you would 13 | like to have all the internal symbols available at debug time, but don't 14 | want to go in and declare them all global. You just tell MAKESYM where the 15 | PROG and DATA sections were placed at link time, and there you have it. 16 | 17 | This is also useful for generating a useable symbol table when you directly 18 | generate the .COM or .HEX without linking. In that case you just run MAKESYM 19 | and don't need to specify any offsets. 20 | 21 | To use: 22 | 23 | A>MAKESYM FILENAME[.EXT] [/PXXXX] [/DXXXX] [/CXXXX] [/U] 24 | 25 | where the brackets surround optional items and are not actually typed. 26 | 27 | /PXXXX Here XXXX is the HEX offset for PROG relative items. 28 | 29 | /DXXXX Here XXXX is the HEX offset for DATA relative items. 30 | 31 | /CXXXX Here XXXX is the HEX offset for COMMON relative items. 32 | 33 | /U This tells MAKESYM to perform upper-case conversion 34 | (Some debuggers allow lower case symbols but don't let 35 | you access them). 36 | 37 | .EXT This is used to overide the default extension of .LST. 38 | Don't use .SYM (to convert .SYM to .SYM) because 39 | MAKESYM creates a .SYM file immediately, erasing the 40 | file it is trying to convert. 41 | 42 | 43 | Have a productive day! 44 | 45 | Steve 46 |  -------------------------------------------------------------------------------- /code/disks/B/MBASIC.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/MBASIC.COM -------------------------------------------------------------------------------- /code/disks/B/OBASIC.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/OBASIC.COM -------------------------------------------------------------------------------- /code/disks/B/RMAC.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/RMAC.COM -------------------------------------------------------------------------------- /code/disks/B/SLR180.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/SLR180.COM -------------------------------------------------------------------------------- /code/disks/B/SLR180.DOC: -------------------------------------------------------------------------------- 1 | SLR180 1.30 Release Notes 2 | 3 | Bugs Fixed From 1.00: 4 | 5 | Nested macro calls using % operator fixed 6 | IFIDN <>,<> now returns true 7 | JR NUMBER+$ generates correct code 8 | INCLUDE and MACLIB filenames can now contain +, -, etc 9 | Fixed number conversion in non-power-of-two radix 10 | .$$1 files are cleaned up on abort 11 | LD A,TYPE 0 works 12 | ex af,af' works in U/L mode 13 | 14 | 15 | Additions: 16 | 17 | All input and output files are always closed upon termination (unless 18 | terminated by ^C from BUFIN call). 19 | 20 | CONFIG option added to allow TABs in strings. Normally SLR180 complains 21 | about any control characters in quoted strings but generates the correct 22 | code. This option suppress the error if the control character is a TAB. 23 | 24 | CONFIG option added to disable stripping the high bit of each byte read 25 | from the input source. THIS IS DANGEROUS! Should ONLY be used for using 26 | non-ASCII characters in comments. DO NOT USE in macros, since the high 27 | bit is used as a parameter replacement flag. Other indexed tables also 28 | assume the high bit is clear. 29 | 30 | 31 | 32 | SLR180 1.31 Release Notes 33 | 34 | SLR180 will now delete A:$$$.SUB if an error was detected during any assembly 35 | (Configurable with 180FIG). This complements the setting of the ZCPR3 error 36 | flag, and the setting of the CP/M 3.0 Error return code (******* CP/M Plus 37 | users: SUBMIT files may test the error return code with a leading 'colon', 38 | documented obscurely in CP/M 3 Programmers Guide 1.6.3 *******). 39 | 40 | 180fig will now set an alternate user # to be used if a given source file 41 | cannot be found under the default user #. Useful for keeping just one copy 42 | of system equates and macro libraries under a single user #. 43 | 44 | 180fig will let you define a drive to be used for storing intermediate files. 45 | This should be set to your fastest device. 46 | 47 | 180fig will let you select Common selection to start back at address relative 48 | 0 (M80 compat), or continue at the last used address (like any other address 49 | space). 50 | 51 | 180fig will select whether or not to print the 'nesting level' character in 52 | the listing. 53 | 54 | ^C will now abort the assembler, not just the current assembly. 55 | 56 | Colon not required on equated labels not in column one, even when that 57 | requirement is selected. 58 | 59 | Labeled IRP and IRPC's work. 60 | 61 | Forward referenced EQU's work in one-pass mode. 62 |  -------------------------------------------------------------------------------- /code/disks/B/Z80ASM.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/Z80ASM.COM -------------------------------------------------------------------------------- /code/disks/B/ZASM.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/ZASM.COM -------------------------------------------------------------------------------- /code/disks/B/l80.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/l80.com -------------------------------------------------------------------------------- /code/disks/B/m80.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/B/m80.com -------------------------------------------------------------------------------- /code/disks/C/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/.gitignore -------------------------------------------------------------------------------- /code/disks/C/cmdlin.pas: -------------------------------------------------------------------------------- 1 | program CommandLine; 2 | { 3 | COMMANDLINE PARAMETERS DEMONSTRATION PROGRAM Version 1.00A 4 | 5 | This program gets parameters from the command line: 6 | 7 | INSTRUCTIONS 8 | 1. Load the TURBO compiler and compile to a .COM file 9 | 2. Quit the TURBO compiler and execute the program with 10 | parameters. Try: 11 | 12 | cmdlin abc def 13 | cmdlin Greetings from Frank Borland! 14 | cmdlin 15 | 16 | NOTE: For information about these functions, please refer to your 17 | TURBO 3.0 Reference Manual. 18 | } 19 | 20 | 21 | var 22 | i : integer; 23 | 24 | begin 25 | for i := 1 to ParamCount do 26 | writeln(ParamSTR(i)); 27 | end. 28 | 0 Reference Manual. 29 | } 30 | 31 | 32 | var 33 | i : integer; 34 | 35 | begin 36 | for i := 1 to ParamCount do 37 | writeln(ParamSTR(i)); 38 | end. 39 |  -------------------------------------------------------------------------------- /code/disks/C/mc-mod00.inc: -------------------------------------------------------------------------------- 1 | {.PA} 2 | {*******************************************************************} 3 | {* SOURCE CODE MODULE: MC-MOD00 *} 4 | {* PURPOSE: Micellaneous utilities an commands. *} 5 | {*******************************************************************} 6 | 7 | 8 | procedure Msg(S: AnyString); 9 | begin 10 | GotoXY(1,24); 11 | ClrEol; 12 | Write(S); 13 | end; 14 | 15 | procedure Flash(X: integer; S: AnyString; Blink: boolean); 16 | begin 17 | HighVideo; 18 | GotoXY(X,23); 19 | Write(S); 20 | if Blink then 21 | begin 22 | repeat 23 | GotoXY(X,23); 24 | Blink:=not Blink; if Blink then HighVideo else LowVideo; 25 | Write(S); 26 | Delay(175); 27 | until KeyPressed; 28 | end; 29 | LowVideo; 30 | end; 31 | 32 | procedure Auto; 33 | begin 34 | AutoCalc:=not AutoCalc; 35 | if AutoCalc then Flash(65,'AutoCalc: ON ',false) 36 | else Flash(65,'AutoCalc: OFF',false); 37 | end; 38 | 39 | then Flash(65,'AutoCalc: ON ',false) 40 | else Flash(65,'AutoCalc: OFF',false); 41 | end; 42 | 43 |  -------------------------------------------------------------------------------- /code/disks/C/mc-mod01.inc: -------------------------------------------------------------------------------- 1 | {.PA} 2 | 3 | {*******************************************************************} 4 | {* SOURCE CODE MODULE: MC-MOD01 *} 5 | {* PURPOSE: Display grid and initialize all cells *} 6 | {* in the spread sheet. *} 7 | {*******************************************************************} 8 | 9 | 10 | 11 | procedure Grid; 12 | var I: integer; 13 | Count: Char; 14 | begin 15 | HighVideo; 16 | For Count:='A' to FXMax do 17 | begin 18 | GotoXY(XPos[Count],1); 19 | Write(Count); 20 | end; 21 | GotoXY(1,2); 22 | for I:=1 to FYMax do writeln(I:2); 23 | LowVideo; 24 | if AutoCalc then Flash(65,'AutoCalc: ON' ,false) 25 | else Flash(65,'AutoCalc: OFF',false); 26 | Flash(33,' Type / for Commands',false); 27 | end; 28 | 29 | 30 | procedure Init; 31 | var 32 | I: ScreenIndex; 33 | J: Integer; 34 | LastName: string[2]; 35 | begin 36 | for I:='A' to FXMAX do 37 | begin 38 | for J:=1 to FYMAX do 39 | begin 40 | with Screen[I,J] do 41 | begin 42 | CellStatus:=[Txt]; 43 | Contents:=''; 44 | Value:=0; 45 | DEC:=2; { Default number of decimals } 46 | FW:=10; { Default field whith } 47 | end; 48 | end; 49 | end; 50 | AutoCalc:=True; 51 | FX:='A'; FY:=1; { First field in upper left corner } 52 | end; 53 | 54 | procedure Clear; 55 | begin 56 | HighVideo; 57 | GotoXY(1,24); ClrEol; 58 | Write('Clear this worksheet? (Y/N) '); 59 | repeat Read(Kbd,Ch) until Upcase(Ch) in ['Y','N']; 60 | Write(Upcase(Ch)); 61 | if UpCase(Ch)='Y' then 62 | begin 63 | ClrScr; 64 | Init; 65 | Grid; 66 | end; 67 | end; 68 | 69 | 70 | nd; 71 | end; 72 | 73 | 74 |  -------------------------------------------------------------------------------- /code/disks/C/mc.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/mc.com -------------------------------------------------------------------------------- /code/disks/C/mcdemo.mcs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/mcdemo.mcs -------------------------------------------------------------------------------- /code/disks/C/read.me: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/read.me -------------------------------------------------------------------------------- /code/disks/C/tinst.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/tinst.com -------------------------------------------------------------------------------- /code/disks/C/tinst.dta: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/tinst.dta -------------------------------------------------------------------------------- /code/disks/C/turbo.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/turbo.com -------------------------------------------------------------------------------- /code/disks/C/turbo.msg: -------------------------------------------------------------------------------- 1 |  are not allowed 2 |  can not be 3 |  constant 4 |  does not 5 |  expression 6 |  identifier 7 |  file 8 |  here 9 | Integer 10 | File 11 | Illegal 12 |  or 13 | Undefined 14 |  match 15 |  real 16 | String 17 | Textfile 18 |  out of range 19 |  variable 20 |  overflow 21 |  expected 22 |  type 23 | Invalid 24 |  pointer 25 | 01';' 26 | 02':' 27 | 03',' 28 | 04'(' 29 | 05')' 30 | 06'=' 31 | 07':=' 32 | 08'[' 33 | 09']' 34 | 10'.' 35 | 11'..' 36 | 12BEGIN 37 | 13DO 38 | 14END 39 | 15OF 40 | 17THEN 41 | 18TO DOWNTO 42 | 20Boolean 43 | 21  44 | 22  45 | 23  46 | 24  47 | 25  48 | 26  49 | 27  50 | 28Pointer 51 | 29Record 52 | 30Simple 53 | 31Simple 54 | 32 55 | 33 56 | 34 57 | 35 58 | 36Type 59 | 37Untyped 60 | 40 label 61 | 41Unknown syntax error 62 | 42 in preceding definitions 63 | 43Duplicate label 64 | 44Type mismatch 65 | 45 66 | 46 and CASE selector 67 | 47Operand(s) operator 68 | 48 result 69 | 49  length 70 | 50 length 71 | 51 subrange base 72 | 52Lower bound > upper bound 73 | 53Reserved word 74 | 54 assignment 75 | 55 exceeds line 76 | 56Error in integer 77 | 57Error in 78 | 58 character in 79 | 60s 80 | 61 s ands 81 | 62Structureds 82 | 63s 83 | 64s and untypeds 84 | 65Untypeds 85 | 66I/O 86 | 67 s must be parameters 87 | 68 componentss 88 | 69dering of fields 89 | 70Set base 90 | 71 GOTO 91 | 72Label not within current block 92 | 73 FORWARD procedure(s) 93 | 74INLINE error 94 | 75 use of ABSOLUTE 95 | 90 not found 96 | 91Unexpected end of source 97 | 97Too many nested WITH's 98 | 98Memory 99 | 99Compilerd WITH's 100 | 98Memory 101 | 99Compiler -------------------------------------------------------------------------------- /code/disks/C/turbo.ovr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/C/turbo.ovr -------------------------------------------------------------------------------- /code/disks/D/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/.gitignore -------------------------------------------------------------------------------- /code/disks/D/INSTALL.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/INSTALL.COM -------------------------------------------------------------------------------- /code/disks/D/MAILMRGE.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/MAILMRGE.OVR -------------------------------------------------------------------------------- /code/disks/D/MERGPRIN.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/MERGPRIN.OVR -------------------------------------------------------------------------------- /code/disks/D/WIMSGS.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/WIMSGS.OVR -------------------------------------------------------------------------------- /code/disks/D/WS.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/WS.COM -------------------------------------------------------------------------------- /code/disks/D/WSMSGS.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/WSMSGS.OVR -------------------------------------------------------------------------------- /code/disks/D/WSOVLY1.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/WSOVLY1.OVR -------------------------------------------------------------------------------- /code/disks/D/WSU.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/D/WSU.COM -------------------------------------------------------------------------------- /code/disks/E/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/.gitignore -------------------------------------------------------------------------------- /code/disks/E/WINSTALL.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WINSTALL.COM -------------------------------------------------------------------------------- /code/disks/E/WS.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WS.COM -------------------------------------------------------------------------------- /code/disks/E/WS.INS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WS.INS -------------------------------------------------------------------------------- /code/disks/E/WSMSGS.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WSMSGS.OVR -------------------------------------------------------------------------------- /code/disks/E/WSOVLY1.OVR: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WSOVLY1.OVR -------------------------------------------------------------------------------- /code/disks/E/WSU.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/E/WSU.COM -------------------------------------------------------------------------------- /code/disks/F/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/F/.gitignore -------------------------------------------------------------------------------- /code/disks/F/KIDS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/F/KIDS -------------------------------------------------------------------------------- /code/disks/F/STAN: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/F/STAN -------------------------------------------------------------------------------- /code/disks/G/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/G/.gitignore -------------------------------------------------------------------------------- /code/disks/G/ladconf.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/G/ladconf.com -------------------------------------------------------------------------------- /code/disks/G/ladder.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/G/ladder.com -------------------------------------------------------------------------------- /code/disks/G/ladder.dat: -------------------------------------------------------------------------------- 1 | ADM 3A =  YY 2468 -------------------------------------------------------------------------------- /code/disks/G/ladder.scr: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/G/ladder.scr -------------------------------------------------------------------------------- /code/disks/H/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/H/.gitignore -------------------------------------------------------------------------------- /code/disks/H/23matches.bas: -------------------------------------------------------------------------------- 1 | 20 PRINT TAB(31);"23 MATCHES" 2 | 30 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 40 PRINT:PRINT:PRINT 4 | 80 PRINT " THIS IS A GAME CALLED '23 MATCHES'." 5 | 90 PRINT 6 | 100 PRINT "WHEN IT IS YOUR TURN, YOU MAY TAKE ONE, TWO, OR THREE" 7 | 110 PRINT "MATCHES. THE OBJECT OF THE GAME IS NOT TO HAVE TO TAKE" 8 | 120 PRINT "THE LAST MATCH." 9 | 130 PRINT 10 | 140 PRINT "LET'S FLIP A COIN TO SEE WHO GOES FIRST." 11 | 150 PRINT "IF IT COMES UP HEADS, I WILL WIN THE TOSS." 12 | 155 PRINT 13 | 160 REM 14 | 165 N = 23 15 | 170 Q = INT(2*RND(5)) 16 | 180 IF Q = 1 THEN 210 17 | 190 PRINT "TAILS! YOU GO FIRST. " 18 | 195 PRINT 19 | 200 GOTO 300 20 | 210 PRINT "HEADS! I WIN! HA! HA!" 21 | 220 PRINT "PREPARE TO LOSE, MEATBALL-NOSE!!" 22 | 230 PRINT 23 | 250 PRINT "I TAKE 2 MATCHES" 24 | 260 N = N -2 25 | 270 PRINT "THE NUMBER OF MATCHES IS NOW" N 26 | 280 PRINT 27 | 290 PRINT "YOUR TURN -- YOU MAY TAKE 1, 2 OR 3 MATCHES." 28 | 300 PRINT "HOW MANY DO YOU WISH TO REMOVE", 29 | 310 INPUT K 30 | 320 IF K > 3 THEN 430 31 | 330 IF K <= 0 THEN 430 32 | 340 N = N - K 33 | 350 PRINT "THERE ARE NOW";N;"MATCHES REMAINING." 34 | 351 IF N = 4 THEN 381 35 | 352 IF N = 3 THEN 383 36 | 353 IF N = 2 THEN 385 37 | 360 IF N <= 1 THEN 530 38 | 370 Z = 4 - K 39 | 372 GOTO 390 40 | 380 PRINT 41 | 381 Z = 3 42 | 382 GOTO 390 43 | 383 Z = 2 44 | 384 GOTO 390 45 | 385 Z = 1 46 | 390 PRINT "MY TURN ! I REMOVE" Z "MATCHES" 47 | 400 N = N - Z 48 | 410 IF N <= 1 THEN 470 49 | 420 GOTO 270 50 | 430 PRINT "VERY FUNNY! DUMMY!" 51 | 440 PRINT "DO YOU WANT TO PLAY OR GOOF AROUND?" 52 | 450 PRINT "NOW, HOW MANY MATCHES DO YOU WANT", 53 | 460 GOTO 310 54 | 470 PRINT 55 | 480 PRINT"YOU POOR BOOB! YOU TOOK THE LAST MATCH! I GOTCHA!!" 56 | 490 PRINT "HA ! HA ! I BEAT YOU !!!" 57 | 500 PRINT 58 | 510 PRINT "GOOD BYE LOSER!" 59 | 520 GOTO 560 60 | 530 PRINT "YOU WON, FLOPPY EARS !" 61 | 540 PRINT "THINK YOU'RE PRETTY SMART !" 62 | 550 PRINT "LETS PLAY AGAIN AND I'LL BLOW YOUR SHOES OFF !!" 63 | 560 STOP 64 | 570 END 65 | -------------------------------------------------------------------------------- /code/disks/H/3dplot.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(32);"3D PLOT" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 5 DEF FNA(Z)=30*EXP(-Z*Z/100) 5 | 100 PRINT 6 | 110 FOR X=-30 TO 30 STEP 1.5 7 | 120 L=0 8 | 130 Y1=5*INT(SQR(900-X*X)/5) 9 | 140 FOR Y=Y1 TO -Y1 STEP -5 10 | 150 Z=INT(25+FNA(SQR(X*X+Y*Y))-.7*Y) 11 | 160 IF Z<=L THEN 190 12 | 170 L=Z 13 | 180 PRINT TAB(Z);"*"; 14 | 190 NEXT Y 15 | 200 PRINT 16 | 210 NEXT X 17 | 300 END 18 | -------------------------------------------------------------------------------- /code/disks/H/aceyducey.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(26);"ACEY DUCEY CARD GAME" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 21 PRINT 4 | 22 PRINT 5 | 30 PRINT"ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER " 6 | 40 PRINT"THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP" 7 | 50 PRINT"YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING" 8 | 60 PRINT"ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE" 9 | 70 PRINT"A VALUE BETWEEN THE FIRST TWO." 10 | 80 PRINT"IF YOU DO NOT WANT TO BET, INPUT A 0" 11 | 100 N=100 12 | 110 Q=100 13 | 120 PRINT "YOU NOW HAVE";Q;"DOLLARS." 14 | 130 PRINT 15 | 140 GOTO 260 16 | 210 Q=Q+M 17 | 220 GOTO 120 18 | 240 Q=Q-M 19 | 250 GOTO 120 20 | 260 PRINT"HERE ARE YOUR NEXT TWO CARDS: " 21 | 270 A=INT(14*RND(1))+2 22 | 280 IF A<2 THEN 270 23 | 290 IF A>14 THEN 270 24 | 300 B=INT(14*RND(1))+2 25 | 310 IF B<2 THEN 300 26 | 320 IF B>14 THEN 300 27 | 330 IF A>=B THEN 270 28 | 350 IF A<11 THEN 400 29 | 360 IF A=11 THEN 420 30 | 370 IF A=12 THEN 440 31 | 380 IF A=13 THEN 460 32 | 390 IF A=14 THEN 480 33 | 400 PRINT A 34 | 410 GOTO 500 35 | 420 PRINT"JACK" 36 | 430 GOTO 500 37 | 440 PRINT"QUEEN" 38 | 450 GOTO 500 39 | 460 PRINT"KING" 40 | 470 GOTO 500 41 | 480 PRINT"ACE" 42 | 500 IF B<11 THEN 550 43 | 510 IF B=11 THEN 570 44 | 520 IF B=12 THEN 590 45 | 530 IF B=13 THEN 610 46 | 540 IF B=14 THEN 630 47 | 550 PRINT B 48 | 560 GOTO 650 49 | 570 PRINT"JACK" 50 | 580 GOTO 650 51 | 590 PRINT"QUEEN" 52 | 600 GOTO 650 53 | 610 PRINT"KING" 54 | 620 GOTO 650 55 | 630 PRINT"ACE" 56 | 640 PRINT 57 | 650 PRINT 58 | 660 INPUT"WHAT IS YOUR BET";M 59 | 670 IF M<>0 THEN 680 60 | 675 PRINT"CHICKEN!!" 61 | 676 PRINT 62 | 677 GOTO 260 63 | 680 IF M<=Q THEN 730 64 | 690 PRINT"SORRY, MY FRIEND, BUT YOU BET TOO MUCH." 65 | 700 PRINT"YOU HAVE ONLY ";Q;" DOLLARS TO BET." 66 | 710 GOTO 650 67 | 730 C=INT(14*RND(1))+2 68 | 740 IF C<2 THEN 730 69 | 750 IF C>14 THEN 730 70 | 760 IF C<11 THEN 810 71 | 770 IF C=11 THEN 830 72 | 780 IF C=12 THEN 850 73 | 790 IF C=13 THEN 870 74 | 800 IF C=14 THEN 890 75 | 810 PRINT C 76 | 820 GOTO 910 77 | 830 PRINT"JACK" 78 | 840 GOTO 910 79 | 850 PRINT"QUEEN" 80 | 860 GOTO 910 81 | 870 PRINT"KING" 82 | 880 GOTO 910 83 | 890 PRINT "ACE" 84 | 900 PRINT 85 | 910 IF C>A THEN 930 86 | 920 GOTO 970 87 | 930 IF C>=B THEN 970 88 | 950 PRINT"YOU WIN!!!" 89 | 960 GOTO 210 90 | 970 PRINT"SORRY, YOU LOSE" 91 | 980 IF M"Y" THEN 120 17 | 160 K=1 18 | 170 GOSUB 390 19 | 180 IF LEN(A$(K))=0 THEN 999 20 | 190 IF LEFT$(A$(K),2)="\Q" THEN 170 21 | 200 PRINT "IS IT A ";RIGHT$(A$(K),LEN(A$(K))-2); 22 | 210 INPUT A$ 23 | 220 A$=LEFT$(A$,1) 24 | 230 IF LEFT$(A$,1)="Y" THEN PRINT "WHY NOT TRY ANOTHER ANIMAL?": GOTO 120 25 | 240 INPUT "THE ANIMAL YOU WERE THINKING OF WAS A ";V$ 26 | 250 PRINT "PLEASE TYPE IN A QUESTION THAT WOULD DISTINGUISH A" 27 | 260 PRINT V$;" FROM A ";RIGHT$(A$(K),LEN(A$(K))-2) 28 | 270 INPUT X$ 29 | 280 PRINT "FOR A ";V$;" THE ANSWER WOULD BE "; 30 | 290 INPUT A$ 31 | 300 A$=LEFT$(A$,1): IF A$<>"Y" AND A$<>"N" THEN 280 32 | 310 IF A$="Y" THEN B$="N" 33 | 320 IF A$="N" THEN B$="Y" 34 | 330 Z1=VAL(A$(0)) 35 | 340 A$(0)=STR$(Z1+2) 36 | 350 A$(Z1)=A$(K) 37 | 360 A$(Z1+1)="\A"+V$ 38 | 370 A$(K)="\Q"+X$+"\"+A$+STR$(Z1+1)+"\"+B$+STR$(Z1)+"\" 39 | 380 GOTO 120 40 | 390 REM SUBROUTINE TO PRINT QUESTIONS 41 | 400 Q$=A$(K) 42 | 410 FOR Z=3 TO LEN(Q$) 43 | 415 IF MID$(Q$,Z,1)<>"\" THEN PRINT MID$(Q$,Z,1);: NEXT Z 44 | 420 INPUT C$ 45 | 430 C$=LEFT$(C$,1) 46 | 440 IF C$<>"Y" AND C$<>"N" THEN 410 47 | 450 T$="\"+C$ 48 | 455 FOR X=3 TO LEN(Q$)-1 49 | 460 IF MID$(Q$,X,2)=T$ THEN 480 50 | 470 NEXT X 51 | 475 STOP 52 | 480 FOR Y=X+1 TO LEN(Q$) 53 | 490 IF MID$(Q$,Y,1)="\" THEN 510 54 | 500 NEXT Y 55 | 505 STOP 56 | 510 K=VAL(MID$(Q$,X+2,Y-X-2)) 57 | 520 RETURN 58 | 530 DATA "4","\QDOES IT SWIM\Y2\N3\","\AFISH","\ABIRD" 59 | 600 PRINT:PRINT "ANIMALS I ALREADY KNOW ARE:" 60 | 605 X=0 61 | 610 FOR I=1 TO 200 62 | 620 IF LEFT$(A$(I),2)<>"\A" THEN 650 63 | 624 PRINT TAB(15*X); 64 | 630 FOR Z=3 TO LEN(A$(I)) 65 | 640 IF MID$(A$(I),Z,1)<>"\" THEN PRINT MID$(A$(I),Z,1);: NEXT Z 66 | 645 X=X+1: IF X=4 THEN X=0: PRINT 67 | 650 NEXT I 68 | 660 PRINT 69 | 670 PRINT 70 | 680 GOTO 120 71 | 999 END 72 | -------------------------------------------------------------------------------- /code/disks/H/awari.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(34);"AWARI" 2 | 7 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 10 DATA 0 4 | 15 DIM B(13),G(13),F(50):READ N 5 | 20 PRINT:PRINT:E=0 6 | 25 FOR I=0 TO 12:B(I)=3:NEXT I 7 | 30 C=0:F(N)=0:B(13)=0:B(6)=0 8 | 35 GOSUB 500 9 | 40 PRINT "YOUR MOVE";:GOSUB 110 10 | 45 IF E=0 THEN 80 11 | 50 IF M=H THEN GOSUB 100 12 | 55 IF E=0 THEN 80 13 | 60 PRINT "MY MOVE IS ";:GOSUB 800 14 | 65 IF E=0 THEN 80 15 | 70 IF M=H THEN PRINT ",";:GOSUB 800 16 | 75 IF E>0 THEN 35 17 | 80 PRINT:PRINT"GAME OVER" 18 | 85 D=B(6)-B(13):IF D<0 THEN PRINT "I WIN BY";-D;"POINTS":GOTO 20 19 | 90 N=N+1:IF D=0 THEN PRINT "DRAWN GAME":GOTO 20 20 | 95 PRINT "YOU WIN BY";D;"POINTS":GOTO 20 21 | 100 PRINT "AGAIN"; 22 | 110 INPUT M:IF M<7 THEN IF M>0 THEN M=M-1:GOTO 130 23 | 120 PRINT "ILLEGAL MOVE":GOTO 100 24 | 130 IF B(M)=0 THEN 120 25 | 140 H=6:GOSUB 200 26 | 150 GOTO 500 27 | 200 K=M:GOSUB 600 28 | 205 E=0:IF K>6 THEN K=K-7 29 | 210 C=C+1:IF C<9 THEN F(N)=F(N)*6+K 30 | 215 FOR I=0 TO 5:IF B(I)<>0 THEN 230 31 | 220 NEXT I 32 | 225 RETURN 33 | 230 FOR I=7 TO 12:IF B(I)<>0 THEN E=1:RETURN 34 | 235 GOTO 220 35 | 500 PRINT:PRINT" "; 36 | 505 FOR I=12 TO 7 STEP -1:GOSUB 580 37 | 510 NEXT I 38 | 515 PRINT:I=13:GOSUB 580 39 | 520 PRINT " ";:PRINT B(6):PRINT " "; 40 | 525 FOR I=0 TO 5:GOSUB 580 41 | 530 NEXT I 42 | 535 PRINT:PRINT:RETURN 43 | 580 IF B(I)<10 THEN PRINT " "; 44 | 585 PRINT B(I);:RETURN 45 | 600 P=B(M):B(M)=0 46 | 605 FOR P=P TO 1 STEP -1:M=M+1:IF M>13 THEN M=M-14 47 | 610 B(M)=B(M)+1:NEXT P 48 | 615 IF B(M)=1 THEN IF M<>6 THEN IF M<>13 THEN IF B(12-M)<>0 THEN 625 49 | 620 RETURN 50 | 625 B(H)=B(H)+B(12-M)+1:B(M)=0:B(12-M)=0:RETURN 51 | 800 D=-99:H=13 52 | 805 FOR I=0 TO 13:G(I)=B(I):NEXT I 53 | 810 FOR J=7 TO 12:IF B(J)=0 THEN 885 54 | 815 G=0:M=J:GOSUB 600 55 | 820 FOR I=0 TO 5:IF B(I)=0 THEN 845 56 | 825 L=B(I)+I:R=0 57 | 830 IF L>13 THEN L=L-14:R=1:GOTO 830 58 | 835 IF B(L)=0 THEN IF L<>6 THEN IF L<>13 THEN R=B(12-L)+R 59 | 840 IF R>Q THEN Q=R 60 | 845 NEXT I 61 | 850 Q=B(13)-B(6)-Q:IF C>8 THEN 875 62 | 855 K=J:IF K>6 THEN K=K-7 63 | 860 FOR I=0 TO N-1:IF F(N)*6+K=INT(F(I)/6^(7-C)+.1) THEN Q=Q-2 64 | 870 NEXT I 65 | 875 FOR I=0 TO 13:B(I)=G(I):NEXT I 66 | 880 IF Q>=D THEN A=J:D=Q 67 | 885 NEXT J 68 | 890 M=A:PRINT CHR$(42+M);:GOTO 200 69 | 900 FOR I=0 TO N-1:PRINT B(I):NEXT I 70 | 999 END 71 | -------------------------------------------------------------------------------- /code/disks/H/bagels.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(33);"BAGELS" 2 | 10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY":PRINT:PRINT 3 | 15 REM *** BAGLES NUMBER GUESSING GAME 4 | 20 REM *** ORIGINAL SOURCE UNKNOWN BUT SUSPECTED TO BE 5 | 25 REM *** LAWRENCE HALL OF SCIENCE, U.C. BERKELY 6 | 30 DIM A1(6),A(3),B(3) 7 | 40 Y=0:T=255 8 | 50 PRINT:PRINT:PRINT 9 | 70 INPUT "WOULD YOU LIKE THE RULES (YES OR NO)";A$ 10 | 90 IF LEFT$(A$,1)="N" THEN 150 11 | 100 PRINT:PRINT "I AM THINKING OF A THREE-DIGIT NUMBER. TRY TO GUESS" 12 | 110 PRINT "MY NUMBER AND I WILL GIVE YOU CLUES AS FOLLOWS:" 13 | 120 PRINT " PICO - ONE DIGIT CORRECT BUT IN THE WRONG POSITION" 14 | 130 PRINT " FERMI - ONE DIGIT CORRECT AND IN THE RIGHT POSITION" 15 | 140 PRINT " BAGELS - NO DIGITS CORRECT" 16 | 150 FOR I=1 TO 3 17 | 160 A(I)=INT(10*RND(1)) 18 | 165 IF I-1=0 THEN 200 19 | 170 FOR J=1 TO I-1 20 | 180 IF A(I)=A(J) THEN 160 21 | 190 NEXT J 22 | 200 NEXT I 23 | 210 PRINT:PRINT "O.K. I HAVE A NUMBER IN MIND." 24 | 220 FOR I=1 TO 20 25 | 230 PRINT "GUESS #";I, 26 | 240 INPUT A$ 27 | 245 IF LEN(A$)<>3 THEN 630 28 | 250 FOR Z=1 TO 3:A1(Z)=ASC(MID$(A$,Z,1)):NEXT Z 29 | 260 FOR J=1 TO 3 30 | 270 IF A1(J)<48 THEN 300 31 | 280 IF A1(J)>57 THEN 300 32 | 285 B(J)=A1(J)-48 33 | 290 NEXT J 34 | 295 GOTO 320 35 | 300 PRINT "WHAT?" 36 | 310 GOTO 230 37 | 320 IF B(1)=B(2) THEN 650 38 | 330 IF B(2)=B(3) THEN 650 39 | 340 IF B(3)=B(1) THEN 650 40 | 350 C=0:D=0 41 | 360 FOR J=1 TO 2 42 | 370 IF A(J)<>B(J+1) THEN 390 43 | 380 C=C+1 44 | 390 IF A(J+1)<>B(J) THEN 410 45 | 400 C=C+1 46 | 410 NEXT J 47 | 420 IF A(1)<>B(3) THEN 440 48 | 430 C=C+1 49 | 440 IF A(3)<>B(1) THEN 460 50 | 450 C=C+1 51 | 460 FOR J=1 TO 3 52 | 470 IF A(J)<>B(J) THEN 490 53 | 480 D=D+1 54 | 490 NEXT J 55 | 500 IF D=3 THEN 680 56 | 505 IF C=0 THEN 545 57 | 520 FOR J=1 TO C 58 | 530 PRINT "PICO "; 59 | 540 NEXT J 60 | 545 IF D=0 THEN 580 61 | 550 FOR J=1 TO D 62 | 560 PRINT "FERMI "; 63 | 570 NEXT J 64 | 580 IF C+D<>0 THEN 600 65 | 590 PRINT "BAGELS"; 66 | 600 PRINT 67 | 605 NEXT I 68 | 610 PRINT "OH WELL." 69 | 615 PRINT "THAT'S TWNETY GUESSES. MY NUMBER WAS";100*A(1)+10*A(2)+A(3) 70 | 620 GOTO 700 71 | 630 PRINT "TRY GUESSING A THREE-DIGIT NUMBER.":GOTO 230 72 | 650 PRINT "OH, I FORGOT TO TELL YOU THAT THE NUMBER I HAVE IN MIND" 73 | 660 PRINT "HAS NO TWO DIGITS THE SAME.":GOTO 230 74 | 680 PRINT "YOU GOT IT!!!":PRINT 75 | 690 Y=Y+1 76 | 700 INPUT "PLAY AGAIN (YES OR NO)";A$ 77 | 720 IF LEFT$(A$,1)="YES" THEN 150 78 | 730 IF Y=0 THEN 750 79 | 740 PRINT:PRINT "A";Y;"POINT BAGELS BUFF!!" 80 | 750 PRINT "HOPE YOU HAD FUN. BYE." 81 | 999 END 82 | -------------------------------------------------------------------------------- /code/disks/H/banner.bas: -------------------------------------------------------------------------------- 1 | 10 INPUT "HORIZONTAL";X 2 | 20 INPUT "VERTICAL";Y 3 | 21 INPUT "CENTERED";L$ 4 | 22 G1=0:IF L$>"P" THEN G1=1 5 | 23 INPUT "CHARACTER (TYPE 'ALL' IF YOU WANT CHARACTER BEING PRINTED)";M$ 6 | 29 PRINT "STATEMENT"; 7 | 30 INPUT A$ 8 | 35 INPUT "SET PAGE";O$ 9 | 40 A=ASC(LEFT$(A$,1)) 10 | 50 REM 11 | 60 REM 12 | 70 FOR T=1 TO LEN(A$) 13 | 80 P$=MID$(A$,T,1) 14 | 90 FOR O=1 TO 50 15 | 95 READ S$,S(1),S(2),S(3),S(4),S(5),S(6),S(7) 16 | 96 IF P$=" " THEN 812 17 | 100 IF P$=S$ THEN 200 18 | 120 NEXT O 19 | 200 RESTORE 20 | 201 X$=M$ 21 | 202 IF M$="ALL" THEN X$=S$ 22 | 205 FOR U=1 TO 7 23 | 210 FOR K=8 TO 0 STEP -1 24 | 230 IF 2^K=1 THEN 370 20 | 360 GOTO 330 21 | 370 IF N<>INT(N) THEN 220 22 | 380 IF N<1 THEN 220 23 | 390 INPUT "ENTER WIN OPTION - 1 TO TAKE LAST, 2 TO AVOID LAST: ";M 24 | 410 IF M=1 THEN 430 25 | 420 IF M<>2 THEN 390 26 | 430 INPUT "ENTER MIN AND MAX ";A,B 27 | 450 IF A>B THEN 430 28 | 460 IF A<1 THEN 430 29 | 470 IF A<>INT(A) THEN 430 30 | 480 IF B<>INT(B) THEN 430 31 | 490 INPUT "ENTER START OPTION - 1 COMPUTER FIRST, 2 YOU FIRST ";S 32 | 500 PRINT:PRINT 33 | 510 IF S=1 THEN 530 34 | 520 IF S<>2 THEN 490 35 | 530 C=A+B 36 | 540 IF S=2 THEN 570 37 | 550 GOSUB 600 38 | 560 IF W=1 THEN 220 39 | 570 GOSUB 810 40 | 580 IF W=1 THEN 220 41 | 590 GOTO 550 42 | 600 Q=N 43 | 610 IF M=1 THEN 630 44 | 620 Q=Q-1 45 | 630 IF M=1 THEN 680 46 | 640 IF N>A THEN 720 47 | 650 W=1 48 | 660 PRINT "COMPUTER TAKES";N;"AND LOSES." 49 | 670 RETURN 50 | 680 IF N>B THEN 720 51 | 690 W=1 52 | 700 PRINT "COMPUTER TAKES";N;"AND WINS." 53 | 710 RETURN 54 | 720 P=Q-C*INT(Q/C) 55 | 730 IF P>=A THEN 750 56 | 740 P=A 57 | 750 IF P<=B THEN 770 58 | 760 P=B 59 | 770 N=N-P 60 | 780 PRINT "COMPUTER TAKES";P;"AND LEAVES";N 61 | 790 W=0 62 | 800 RETURN 63 | 810 PRINT:PRINT "YOUR MOVE "; 64 | 820 INPUT P 65 | 830 IF P<>0 THEN 870 66 | 840 PRINT "I TOLD YOU NOT TO USE ZERO! COMPUTER WINS BY FORFEIT." 67 | 850 W=1 68 | 860 RETURN 69 | 870 IF P<>INT(P) THEN 920 70 | 880 IF P>=A THEN 910 71 | 890 IF P=N THEN 960 72 | 900 GOTO 920 73 | 910 IF P<=B THEN 940 74 | 920 PRINT "ILLEGAL MOVE, REENTER IT "; 75 | 930 GOTO 820 76 | 940 N=N-P 77 | 950 IF N<>0 THEN 1030 78 | 960 IF M=1 THEN 1000 79 | 970 PRINT "TOUGH LUCK, YOU LOSE." 80 | 980 W=1 81 | 990 RETURN 82 | 1000 PRINT "CONGRATULATIONS, YOU WIN." 83 | 1010 W=1 84 | 1020 RETURN 85 | 1030 IF N>=0 THEN 1060 86 | 1040 N=N+P 87 | 1050 GOTO 920 88 | 1060 W=0 89 | 1070 RETURN 90 | 1080 END 91 | -------------------------------------------------------------------------------- /code/disks/H/bombardment.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"BOMBARDMENT" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 100 PRINT "YOU ARE ON A BATTLEFIELD WITH 4 PLATOONS AND YOU" 5 | 110 PRINT "HAVE 25 OUTPOSTS AVAILABLE WHERE THEY MAY BE PLACED." 6 | 120 PRINT "YOU CAN ONLY PLACE ONE PLATOON AT ANY ONE OUTPOST." 7 | 130 PRINT "THE COMPUTER DOES THE SAME WITH ITS FOUR PLATOONS." 8 | 135 PRINT 9 | 140 PRINT "THE OBJECT OF THE GAME IS TO FIRE MISSLES AT THE" 10 | 150 PRINT "OUTPOSTS OF THE COMPUTER. IT WILL DO THE SAME TO YOU." 11 | 160 PRINT "THE ONE WHO DESTROYS ALL FOUR OF THE ENEMY'S PLATOONS" 12 | 170 PRINT "FIRST IS THE WINNER." 13 | 180 PRINT 14 | 190 PRINT "GOOD LUCK... AND TELL US WHERE YOU WANT THE BODIES SENT!" 15 | 200 PRINT 16 | 210 PRINT "TEAR OFF MATRIX AND USE IT TO CHECK OFF THE NUMBERS." 17 | 220 FOR R=1 TO 5: PRINT: NEXT R 18 | 260 DIM M(100) 19 | 270 FOR R=1 TO 5 20 | 280 I=(R-1)*5+1 21 | 290 PRINT I,I+1,I+2,I+3,I+4 22 | 300 NEXT R 23 | 350 FOR R=1 TO 10: PRINT: NEXT R 24 | 380 C=INT(RND(1)*25)+1 25 | 390 D=INT(RND(1)*25)+1 26 | 400 E=INT(RND(1)*25)+1 27 | 410 F=INT(RND(1)*25)+1 28 | 420 IF C=D THEN 390 29 | 430 IF C=E THEN 400 30 | 440 IF C=F THEN 410 31 | 450 IF D=E THEN 400 32 | 460 IF D=F THEN 410 33 | 470 IF E=F THEN 410 34 | 480 PRINT "WHAT ARE YOUR FOUR POSITIONS"; 35 | 490 INPUT G,H,K,L 36 | 495 PRINT 37 | 500 PRINT "WHERE DO YOU WISH TO FIRE YOUR MISSLE"; 38 | 510 INPUT Y 39 | 520 IF Y=C THEN 710 40 | 530 IF Y=D THEN 710 41 | 540 IF Y=E THEN 710 42 | 550 IF Y=F THEN 710 43 | 560 GOTO 630 44 | 570 M=INT(RND(1)*25)+1 45 | 575 GOTO 1160 46 | 580 IF X=G THEN 920 47 | 590 IF X=H THEN 920 48 | 600 IF X=L THEN 920 49 | 610 IF X=K THEN 920 50 | 620 GOTO 670 51 | 630 PRINT "HA, HA YOU MISSED. MY TURN NOW:" 52 | 640 PRINT: PRINT: GOTO 570 53 | 670 PRINT "I MISSED YOU, YOU DIRTY RAT. I PICKED";M". YOUR TURN:" 54 | 680 PRINT: PRINT: GOTO 500 55 | 710 Q=Q+1 56 | 720 IF Q=4 THEN 890 57 | 730 PRINT "YOU GOT ONE OF MY OUTPOSTS!" 58 | 740 IF Q=1 THEN 770 59 | 750 IF Q=2 THEN 810 60 | 760 IF Q=3 THEN 850 61 | 770 PRINT "ONE DOWN, THREE TO GO." 62 | 780 PRINT: PRINT: GOTO 570 63 | 810 PRINT "TWO DOWN, TWO TO GO." 64 | 820 PRINT: PRINT: GOTO 570 65 | 850 PRINT "THREE DOWN, ONE TO GO." 66 | 860 PRINT: PRINT: GOTO 570 67 | 890 PRINT "YOU GOT ME, I'M GOING FAST. BUT I'LL GET YOU WHEN" 68 | 900 PRINT "MY TRANSISTO&S RECUP%RA*E!" 69 | 910 GOTO 1235 70 | 920 Z=Z+1 71 | 930 IF Z=4 THEN 1110 72 | 940 PRINT "I GOT YOU. IT WON'T BE LONG NOW. POST";X;"WAS HIT." 73 | 950 IF Z=1 THEN 990 74 | 960 IF Z=2 THEN 1030 75 | 970 IF Z=3 THEN 1070 76 | 990 PRINT "YOU HAVE ONLY THREE OUTPOSTS LEFT." 77 | 1000 PRINT: PRINT: GOTO 500 78 | 1030 PRINT "YOU HAVE ONLY TWO OUTPOSTS LEFT." 79 | 1040 PRINT: PRINT: GOTO 500 80 | 1070 PRINT "YOU HAVE ONLY ONE OUTPOST LEFT." 81 | 1080 PRINT: PRINT: GOTO 500 82 | 1110 PRINT "YOU'RE DEAD. YOUR LAST OUTPOST WAS AT";X;". HA, HA, HA." 83 | 1120 PRINT "BETTER LUCK NEXT TIME." 84 | 1150 GOTO 1235 85 | 1160 P=P+1 86 | 1170 N=P-1 87 | 1180 FOR T=1 TO N 88 | 1190 IF M=M(T) THEN 570 89 | 1200 NEXT T 90 | 1210 X=M 91 | 1220 M(P)=M 92 | 1230 GOTO 580 93 | 1235 END 94 | -------------------------------------------------------------------------------- /code/disks/H/bombsaway.bas: -------------------------------------------------------------------------------- 1 | 8 PRINT "YOU ARE A PILOT IN A WORLD WAR II BOMBER." 2 | 10 INPUT "WHAT SIDE -- ITALY(1), ALLIES(2), JAPAN(3), GERMANY(4)";A 3 | 20 IF A>0 AND A<5 THEN 25 4 | 22 PRINT "TRY AGAIN..." : GOTO 10 5 | 25 ON A GOTO 30, 110, 200, 220 6 | 30 INPUT "YOUR TARGET -- ALBANIA(1), GREECE(2), NORTH AFRICA(3)";B 7 | 40 IF B>0 AND B<4 THEN 45 8 | 42 PRINT "TRY AGAIN..." : GOTO 30 9 | 45 PRINT : ON B GOTO 50, 80,90 10 | 50 PRINT "SHOULD BE EASY -- YOU'RE FLYING A NAZI-MADE PLANE." 11 | 60 GOTO 280 12 | 80 PRINT "BE CAREFUL!!!" : GOTO 280 13 | 90 PRINT "YOU'RE GOING FOR THE OIL, EH?" : GOTO 280 14 | 110 INPUT "AIRCRAFT -- LIBERATOR(1), B-29(2), B-17(3), LANCASTER(4)";G 15 | 120 IF G>0 AND G<5 THEN 125 16 | 122 PRINT "TRY AGAIN..." : GOTO 110 17 | 125 PRINT : ON G GOTO 130, 150, 170, 190 18 | 130 PRINT "YOU'VE GOT 2 TONS OF BOMBS FLYING FOR PLOESTI." : GOTO 280 19 | 150 PRINT "YOU'RE DUMPING THE A-BOMB ON HIROSHIMA." : GOTO 280 20 | 170 PRINT "YOU'RE CHASING THE BISMARK IN THE NORTH SEA." : GOTO 280 21 | 190 PRINT "YOU'RE BUSTING A GERMAN HEAVY WATER PLANT IN THE RUHR." 22 | 195 GOTO 280 23 | 200 PRINT "YOU'RE FLYING A KAMIKAZE MISSION OVER THE USS LEXINGTON." 24 | 205 INPUT "YOUR FIRST KAMIKAZE MISSION(Y OR N)";F$ 25 | 207 IF F$="N" THEN S=0 : GOTO 358 26 | 210 PRINT : IF RND(1)>.65 THEN 325 27 | 215 GOTO 380 28 | 220 PRINT "A NAZI, EH? OH WELL. ARE YOU GOING FOR RUSSIA(1)," 29 | 230 INPUT "ENGLAND(2), OR FRANCE(3)";M : IF M>0 AND M<4 THEN 235 30 | 232 PRINT "TRY AGAIN..." : GOTO 220 31 | 235 PRINT : ON M GOTO 250, 260, 270 32 | 250 PRINT "YOU'RE NEARING STALINGRAD." : GOTO 280 33 | 260 PRINT "NEARING LONDON. BE CAREFUL, THEY'VE GOT RADAR." : GOTO 280 34 | 270 PRINT "NEARING VERSAILLES. DUCK SOUP. THEY'RE NEARLY DEFENSELESS." 35 | 280 PRINT 36 | 285 INPUT "HOW MANY MISSIONS HAVE YOU FLOWN";D 37 | 290 IF D<160 THEN 300 38 | 292 PRINT "MISSIONS, NOT MILES..." 39 | 295 PRINT "150 MISSIONS IS HIGH EVEN FOR OLD-TIMERS." 40 | 297 PRINT "NOW THEN, "; : GOTO 285 41 | 300 PRINT:IF D<100 THEN 310 42 | 305 PRINT "THAT'S PUSHING THE ODDS!" : GOTO 320 43 | 310 IF D<25 THEN PRINT "FRESH OUT OF TRAINING, EH?" 44 | 320 PRINT : IF D<160*RND(1) THEN 330 45 | 325 PRINT "DIRECT HIT!!!! "INT(100*RND(1))"KILLED." 46 | 327 PRINT "MISSION SUCCESSFUL." : GOTO 390 47 | 330 PRINT "MISSED TARGET BY"INT(2+30*RND(1))"MILES!" 48 | 335 PRINT "NOW YOU'RE REALLY IN FOR IT !!" : PRINT 49 | 340 INPUT "DOES THE ENEMY HAVE GUNS(1), MISSILES(2), OR BOTH(3)";R 50 | 345 IF R>0 AND R<4 THEN 350 51 | 347 PRINT "TRY AGAIN..." : GOTO 340 52 | 350 PRINT : T=0 : IF R=2 THEN 360 53 | 355 INPUT "WHAT'S THE PERCENT HIT RATE OF ENEMY GUNNERS (10 TO 50)";S 54 | 357 IF S<10 THEN PRINT "YOU LIE, BUT YOU'LL PAY...": GOTO 380 55 | 358 PRINT 56 | 360 PRINT : IF R>1 THEN T=35 57 | 365 IF S+T>100*RND(1) THEN 380 58 | 370 PRINT "YOU MADE IT THROUGH TREMENDOUS FLAK!!" : GOTO 390 59 | 380 PRINT "* * * * BOOM * * * *" 60 | 384 PRINT "YOU HAVE BEEN SHOT DOWN....." 61 | 386 PRINT "DEARLY BELOVED, WE ARE GATHERED HERE TODAY TO PAY OUR" 62 | 387 PRINT "LAST TRIBUTE..." 63 | 390 PRINT:PRINT:PRINT:INPUT "ANOTHER MISSION (Y OR N)";U$ 64 | 395 IF U$="Y" THEN 8 65 | 400 PRINT "CHICKEN !!!" : PRINT : END 66 | -------------------------------------------------------------------------------- /code/disks/H/bounce.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"BOUNCE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 90 DIM T(20) 5 | 100 PRINT "THIS SIMULATION LETS YOU SPECIFY THE INITIAL VELOCITY" 6 | 110 PRINT "OF A BALL THROWN STRAIGHT UP, AND THE COEFFICIENT OF" 7 | 120 PRINT "ELASTICITY OF THE BALL. PLEASE USE A DECIMAL FRACTION" 8 | 130 PRINT "COEFFICIENCY (LESS THAN 1)." 9 | 131 PRINT 10 | 132 PRINT "YOU ALSO SPECIFY THE TIME INCREMENT TO BE USED IN" 11 | 133 PRINT "'STROBING' THE BALL'S FLIGHT (TRY .1 INITIALLY)." 12 | 134 PRINT 13 | 135 INPUT "TIME INCREMENT (SEC)";S2 14 | 140 PRINT 15 | 150 INPUT "VELOCITY (FPS)";V 16 | 160 PRINT 17 | 170 INPUT "COEFFICIENT";C 18 | 180 PRINT 19 | 182 PRINT "FEET" 20 | 184 PRINT 21 | 186 S1=INT(70/(V/(16*S2))) 22 | 190 FOR I=1 TO S1 23 | 200 T(I)=V*C^(I-1)/16 24 | 210 NEXT I 25 | 220 FOR H=INT(-16*(V/32)^2+V^2/32+.5) TO 0 STEP -.5 26 | 221 IF INT(H)<>H THEN 225 27 | 222 PRINT H; 28 | 225 L=0 29 | 230 FOR I=1 TO S1 30 | 240 FOR T=0 TO T(I) STEP S2 31 | 245 L=L+S2 32 | 250 IF ABS(H-(.5*(-32)*T^2+V*C^(I-1)*T))>.25 THEN 270 33 | 260 PRINT TAB(L/S2);"0"; 34 | 270 NEXT T 35 | 275 T=T(I+1)/2 36 | 276 IF -16*T^2+V*C^(I-1)*T 0 THEN 5220 59 | 5130 PRINT "GUTTER!!" 60 | 5220 IF B<>1 OR D<>10 THEN 5490 61 | 5310 PRINT "STRIKE!!!!!" 62 | 5400 Q=3 63 | 5490 IF B<>2 OR D<>10 THEN 5760 64 | 5580 PRINT "SPARE!!!!" 65 | 5670 Q=2 66 | 5760 IF B<>2 OR D>=10 THEN 6030 67 | 5850 PRINT "ERROR!!!" 68 | 5940 Q=1 69 | 6030 IF B<>1 OR D>=10 THEN 6210 70 | 6120 PRINT "ROLL YOUR 2ND BALL" 71 | 6210 REM ARK STORAGE OF THE SCORES 72 | 6300 PRINT 73 | 6390 A(F*P,B)=D 74 | 6480 IF B=2 THEN 7020 75 | 6570 B=2 76 | 6660 M=D 77 | 6750 IF Q=3 THEN 6210 78 | 6840 A(F*P,B)=D-M 79 | 6930 IF Q=0 THEN 2520 80 | 7020 A(F*P,3)=Q 81 | 7110 NEXT P 82 | 7200 F=F+1 83 | 7290 IF F<11 THEN 2070 84 | 7295 PRINT "FRAMES" 85 | 7380 FOR I=1 TO 10 86 | 7470 PRINT I; 87 | 7560 NEXT I 88 | 7650 PRINT 89 | 7740 FOR P=1 TO R 90 | 7830 FOR I=1 TO 3 91 | 7920 FOR J=1 TO 10 92 | 8010 PRINT A(J*P,I); 93 | 8100 NEXT J 94 | 8105 PRINT 95 | 8190 NEXT I 96 | 8280 PRINT 97 | 8370 NEXT P 98 | 8460 PRINT "DO YOU WANT ANOTHER GAME" 99 | 8550 INPUT A$ 100 | 8640 IF LEFT$(A$,1)="Y" THEN 2610 101 | 8730 END 102 | -------------------------------------------------------------------------------- /code/disks/H/bullseye.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(32);"BULLSEYE" 2 | 10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 20 PRINT:PRINT:PRINT 4 | 30 PRINT "IN THIS GAME, UP TO 20 PLAYERS THROW DARTS AT A TARGET" 5 | 40 PRINT "WITH 10, 20, 30, AND 40 POINT ZONES. THE OBJECTIVE IS" 6 | 50 PRINT "TO GET 200 POINTS.": PRINT 7 | 60 PRINT "THROW",TAB(20);"DESCRIPTION";TAB(45);"PROBABLE SCORE" 8 | 70 PRINT" 1";TAB(20);"FAST OVERARM";TAB(45);"BULLSEYE OR COMPLETE MISS" 9 | 80 PRINT" 2";TAB(20);"CONTROLLED OVERARM";TAB(45);"10, 20 OR 30 POINTS" 10 | 90 PRINT" 3";TAB(20);"UNDERARM";TAB(45);"ANYTHING":PRINT 11 | 100 DIM A$(20),S(20),W(10): M=0: R=0: FOR I=1 TO 20: S(I)=0: NEXT I 12 | 110 INPUT "HOW MANY PLAYERS";N: PRINT 13 | 120 FOR I=1 TO N 14 | 130 PRINT "NAME OF PLAYER #";I;:INPUT A$(I) 15 | 140 NEXT I 16 | 150 R=R+1: PRINT: PRINT "ROUND";R:PRINT "---------" 17 | 160 FOR I=1 TO N 18 | 170 PRINT: PRINT A$(I)"'S THROW";: INPUT T 19 | 180 IF T<0 OR T>3 THEN PRINT "INPUT 1, 2, OR 3!": GOTO 170 20 | 190 ON T GOTO 200, 210, 200 21 | 200 P1=.65: P2=.55: P3=.5: P4=.5: GOTO 230 22 | 210 P1=.99: P2=.77: P3=.43: P4=.01: GOTO 230 23 | 220 P1=.95: P2=.75: P3=.45: P4=.05 24 | 230 U=RND(1) 25 | 240 IF U>=P1 THEN PRINT "BULLSEYE!! 40 POINTS!":B=40: GOTO 290 26 | 250 IF U>=P2 THEN PRINT "30-POINT ZONE!":B=30: GOTO 290 27 | 260 IF U>=P3 THEN PRINT "20-POINT ZONE":B=20: GOTO 290 28 | 270 IF U>=P4 THEN PRINT "WHEW! 10 POINTS.":B=10: GOTO 290 29 | 280 PRINT "MISSED THE TARGET! TOO BAD.": B=0 30 | 290 S(I)=S(I)+B: PRINT "TOTAL SCORE =";S(I): NEXT I 31 | 300 FOR I=1 TO N 32 | 310 IF S(I)>=200 THEN M=M+1: W(M)=I 33 | 320 NEXT I 34 | 330 IF M=0 THEN 150 35 | 340 PRINT: PRINT "WE HAVE A WINNER!!": PRINT 36 | 350 FOR I=1 TO M: PRINT A$(W(I));" SCORED";S(W(I));"POINTS.": NEXT I 37 | 360 PRINT: PRINT "THANKS FOR THE GAME.": END 38 | -------------------------------------------------------------------------------- /code/disks/H/bunny.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"BUNNY" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT: PRINT: PRINT 4 | 100 REM "BUNNY" FROM AHL'S 'BASIC COMPUTER GAMES' 5 | 110 REM 6 | 120 FOR I=0 TO 4: READ B(I): NEXT I 7 | 130 GOSUB 260 8 | 140 L=64: REM ASCII LETTER CODE... 9 | 150 REM 10 | 160 PRINT 11 | 170 READ X: IF X<0 THEN 160 12 | 175 IF X>128 THEN 240 13 | 180 PRINT TAB(X);: READ Y 14 | 190 FOR I=X TO Y: J=I-5*INT(I/5) 15 | 200 PRINT CHR$(L+B(J)); 16 | 210 NEXT I 17 | 220 GOTO 170 18 | 230 REM 19 | 240 GOSUB 260: GOTO 450 20 | 250 REM 21 | 260 FOR I=1 TO 6: PRINT CHR$(10);: NEXT I 22 | 270 RETURN 23 | 280 REM 24 | 290 DATA 2,21,14,14,25 25 | 300 DATA 1,2,-1,0,2,45,50,-1,0,5,43,52,-1,0,7,41,52,-1 26 | 310 DATA 1,9,37,50,-1,2,11,36,50,-1,3,13,34,49,-1,4,14,32,48,-1 27 | 320 DATA 5,15,31,47,-1,6,16,30,45,-1,7,17,29,44,-1,8,19,28,43,-1 28 | 330 DATA 9,20,27,41,-1,10,21,26,40,-1,11,22,25,38,-1,12,22,24,36,-1 29 | 340 DATA 13,34,-1,14,33,-1,15,31,-1,17,29,-1,18,27,-1 30 | 350 DATA 19,26,-1,16,28,-1,13,30,-1,11,31,-1,10,32,-1 31 | 360 DATA 8,33,-1,7,34,-1,6,13,16,34,-1,5,12,16,35,-1 32 | 370 DATA 4,12,16,35,-1,3,12,15,35,-1,2,35,-1,1,35,-1 33 | 380 DATA 2,34,-1,3,34,-1,4,33,-1,6,33,-1,10,32,34,34,-1 34 | 390 DATA 14,17,19,25,28,31,35,35,-1,15,19,23,30,36,36,-1 35 | 400 DATA 14,18,21,21,24,30,37,37,-1,13,18,23,29,33,38,-1 36 | 410 DATA 12,29,31,33,-1,11,13,17,17,19,19,22,22,24,31,-1 37 | 420 DATA 10,11,17,18,22,22,24,24,29,29,-1 38 | 430 DATA 22,23,26,29,-1,27,29,-1,28,29,-1,4096 39 | 440 REM 40 | 450 END 41 | -------------------------------------------------------------------------------- /code/disks/H/buzzword.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(26);"BUZZWORD GENERATOR" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 40 PRINT "THIS PROGRAM PRINTS HIGHLY ACCEPTABLE PHRASES IN" 5 | 50 PRINT "'EDUCATOR-SPEAK'THAT YOU CAN WORK INTO REPORTS" 6 | 60 PRINT "AND SPEECHES. WHENEVER A QUESTION MARK IS PRINTED," 7 | 70 PRINT "TYPE A 'Y' FOR ANOTHER PHRASE OR 'N' TO QUIT." 8 | 80 PRINT:PRINT:PRINT "HERE'S THE FIRST PHRASE:" 9 | 90 DIM A$(40) 10 | 100 FOR I=1 TO 39 : READ A$(I) : NEXT I 11 | 110 PRINT A$(INT(13*RND(1)+1));" "; 12 | 120 PRINT A$(INT(13*RND(1)+14));" "; 13 | 130 PRINT A$(INT(13*RND(1)+27)) : PRINT 14 | 150 INPUT Y$ : IF Y$="Y" THEN 110 15 | 160 GOTO 999 16 | 200 DATA "ABILITY","BASAL","BEHAVIORAL","CHILD-CENTERED" 17 | 210 DATA "DIFFERENTIATED","DISCOVERY","FLEXIBLE","HETEROGENEOUS" 18 | 220 DATA "HOMOGENEOUS","MANIPULATIVE","MODULAR","TAVISTOCK" 19 | 230 DATA "INDIVIDUALIZED","LEARNING","EVALUATIVE","OBJECTIVE" 20 | 240 DATA "COGNITIVE","ENRICHMENT","SCHEDULING","HUMANISTIC" 21 | 250 DATA "INTEGRATED","NON-GRADED","TRAINING","VERTICAL AGE" 22 | 260 DATA "MOTIVATIONAL","CREATIVE","GROUPING","MODIFICATION" 23 | 270 DATA "ACCOUNTABILITY","PROCESS","CORE CURRICULUM","ALGORITHM" 24 | 280 DATA "PERFORMANCE","REINFORCEMENT","OPEN CLASSROOM","RESOURCE" 25 | 290 DATA "STRUCTURE","FACILITY","ENVIRONMENT" 26 | 999 PRINT "COME BACK WHEN YOU NEED HELP WITH ANOTHER REPORT!":END 27 | -------------------------------------------------------------------------------- /code/disks/H/calendar.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(32);"CALENDAR" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 100 REM VALUES FOR 1979 - SEE NOTES 5 | 110 DIM M(12) 6 | 120 FOR I=1 TO 6: PRINT CHR$(10);: NEXT I 7 | 130 D=1: REM 1979 STARTS ON MONDAY (0=SUN, -1=MON, -2=TUES...) 8 | 140 S=0 9 | 150 REM READ DAYS OF EACH MONTH 10 | 160 FOR N=0 TO 12: READ M(N): NEXT N 11 | 170 REM 12 | 180 FOR N=1 TO 12 13 | 190 PRINT: PRINT: S=S+M(N-1) 14 | 200 PRINT "**";S;TAB(7); 15 | 210 FOR I=1 TO 18: PRINT "*";: NEXT I 16 | 220 ON N GOTO 230,240,250,260,270,280,290,300,310,320,330,340 17 | 230 PRINT " JANUARY ";: GOTO 350 18 | 240 PRINT " FEBRUARY";: GOTO 350 19 | 250 PRINT " MARCH ";: GOTO 350 20 | 260 PRINT " APRIL ";: GOTO 350 21 | 270 PRINT " MAY ";: GOTO 350 22 | 280 PRINT " JUNE ";: GOTO 350 23 | 290 PRINT " JULY ";: GOTO 350 24 | 300 PRINT " AUGUST ";: GOTO 350 25 | 310 PRINT "SEPTEMBER";: GOTO 350 26 | 320 PRINT " OCTOBER ";: GOTO 350 27 | 330 PRINT " NOVEMBER";: GOTO 350 28 | 340 PRINT " DECEMBER"; 29 | 350 FOR I=1 TO 18: PRINT "*";: NEXT I 30 | 360 PRINT 365-S;"**"; 31 | 370 REM 366-S; ON LEAP YEARS 32 | 380 PRINT CHR$(10): PRINT " S M T W"; 33 | 390 PRINT " T F S" 34 | 400 PRINT 35 | 410 FOR I=1 TO 59: PRINT "*";: NEXT I 36 | 420 REM 37 | 430 FOR W=1 TO 6 38 | 440 PRINT CHR$(10) 39 | 450 PRINT TAB(4) 40 | 460 REM 41 | 470 FOR G=1 TO 7 42 | 480 D=D+1 43 | 490 D2=D-S 44 | 500 IF D2>M(N) THEN 580 45 | 510 IF D2>0 THEN PRINT D2; 46 | 520 PRINT TAB(4+8*G); 47 | 530 NEXT G 48 | 540 REM 49 | 550 IF D2=M(N) THEN 590 50 | 560 NEXT W 51 | 570 REM 52 | 580 D=D-G 53 | 590 NEXT N 54 | 600 REM 55 | 610 FOR I=1 TO 6: PRINT CHR$(10);: NEXT I 56 | 620 DATA 0,31,28,31,30,31,30,31,31,30,31,30,31 57 | 630 REM 0,31,29, ..., ON LEAP YEARS 58 | 640 END 59 | -------------------------------------------------------------------------------- /code/disks/H/change.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"CHANGE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 5 PRINT:PRINT:PRINT 4 | 6 PRINT "I, YOUR FRIENDLY MICROCOMPUTER, WILL DETERMINE" 5 | 8 PRINT "THE CORRECT CHANGE FOR ITEMS COSTING UP TO $100." 6 | 9 PRINT:PRINT 7 | 10 PRINT "COST OF ITEM";:INPUT A:PRINT "AMOUNT OF PAYMENT";:INPUT P 8 | 20 C=P-A:M=C:IF C<>0 THEN 90 9 | 25 PRINT "CORRECT AMOUNT, THANK YOU." 10 | 30 GOTO 400 11 | 90 IF C>0 THEN 120 12 | 95 PRINT "SORRY, YOU HAVE SHORT-CHANGED ME $";A-P 13 | 100 GOTO 10 14 | 120 PRINT "YOUR CHANGE, $";C 15 | 130 D=INT(C/10) 16 | 140 IF D=0 THEN 155 17 | 150 PRINT D;"TEN DOLLAR BILL(S)" 18 | 155 C=M-(D*10) 19 | 160 E=INT(C/5) 20 | 170 IF E=0 THEN 185 21 | 180 PRINT E;"FIVE DOLLARS BILL(S)" 22 | 185 C=M-(D*10+E*5) 23 | 190 F=INT(C) 24 | 200 IF F=0 THEN 215 25 | 210 PRINT F;"ONE DOLLAR BILL(S)" 26 | 215 C=M-(D*10+E*5+F) 27 | 220 C=C*100 28 | 225 N=C 29 | 230 G=INT(C/50) 30 | 240 IF G=0 THEN 255 31 | 250 PRINT G;"ONE HALF DOLLAR(S)" 32 | 255 C=N-(G*50) 33 | 260 H=INT(C/25) 34 | 270 IF H=0 THEN 285 35 | 280 PRINT H;"QUARTER(S)" 36 | 285 C=N-(G*50+H*25) 37 | 290 I=INT(C/10) 38 | 300 IF I=0 THEN 315 39 | 310 PRINT I;"DIME(S)" 40 | 315 C=N-(G*50+H*25+I*10) 41 | 320 J=INT(C/5) 42 | 330 IF J=0 THEN 345 43 | 340 PRINT J;"NICKEL(S)" 44 | 345 C=N-(G*50+H*25+I*10+J*5) 45 | 350 K=INT(C+.5) 46 | 360 IF K=0 THEN 380 47 | 370 PRINT K;"PENNY(S)" 48 | 380 PRINT "THANK YOU, COME AGAIN." 49 | 390 PRINT:PRINT 50 | 400 GOTO 10 51 | 410 END 52 | -------------------------------------------------------------------------------- /code/disks/H/checkers.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(32);"CHECKERS" 2 | 10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 15 PRINT:PRINT:PRINT 4 | 20 PRINT "THIS IS THE GAME OF CHECKERS. THE COMPUTER IS X," 5 | 25 PRINT "AND YOU ARE O. THE COMPUTER WILL MOVE FIRST." 6 | 30 PRINT "SQUARES ARE REFERRED TO BY A COORDINATE SYSTEM." 7 | 35 PRINT "(0,0) IS THE LOWER LEFT CORNER" 8 | 40 PRINT "(0,7) IS THE UPPER LEFT CORNER" 9 | 45 PRINT "(7,0) IS THE LOWER RIGHT CORNER" 10 | 50 PRINT "(7,7) IS THE UPPER RIGHT CORNER" 11 | 55 PRINT "THE COMPUTER WILL TYPE '+TO' WHEN YOU HAVE ANOTHER" 12 | 60 PRINT "JUMP. TYPE TWO NEGATIVE NUMBERS IF YOU CANNOT JUMP." 13 | 65 PRINT:PRINT:PRINT 14 | 80 DIM R(4),S(7,7):G=-1:R(0)=-99 15 | 90 DATA 1,0,1,0,0,0,-1,0,0,1,0,0,0,-1,0,-1,15 16 | 120 FOR X=0 TO 7:FOR Y=0 TO 7:READ J:IF J=15 THEN 180 17 | 160 S(X,Y)=J:GOTO 200 18 | 180 RESTORE:READ S(X,Y) 19 | 200 NEXT Y,X 20 | 230 FOR X=0 TO 7:FOR Y=0 TO 7:IF S(X,Y)>-1 THEN 350 21 | 310 IF S(X,Y)=-1 THEN FOR A=-1 TO 1 STEP 2:B=G:GOSUB 650:NEXT A 22 | 330 IF S(X,Y)=-2 THEN FOR A=-1 TO 1 STEP 2:FOR B=-1 TO 1 STEP 2:GOSUB 650:NEXT B,A 23 | 350 NEXT Y,X:GOTO 1140 24 | 650 U=X+A:V=Y+B:IF U<0 OR U>7 OR V<0 OR V>7 THEN 870 25 | 740 IF S(U,V)=0 THEN GOSUB 910:GOTO 870 26 | 770 IF S(U,V)<0 THEN 870 27 | 790 U=U+A:V=V+B:IF U<0 OR V<0 OR U>7 OR V>7 THEN 870 28 | 850 IF S(U,V)=0 THEN GOSUB 910 29 | 870 RETURN 30 | 910 IF V=0 AND S(X,Y)=-1 THEN Q=Q+2 31 | 920 IF ABS(Y-V)=2 THEN Q=Q+5 32 | 960 IF Y=7 THEN Q=Q-2 33 | 980 IF U=0 OR U=7 THEN Q=Q+1 34 | 1030 FOR C=-1 TO 1 STEP 2:IF U+C<0 OR U+C>7 OR V+G<0 THEN 1080 35 | 1035 IF S(U+C,V+G)<0 THEN Q=Q+1:GOTO 1080 36 | 1040 IF U-C<0 OR U-C>7 OR V-G>7 THEN 1080 37 | 1045 IF S(U+C,V+G)>0 AND(S(U-C,V-G)=0 OR(U-C=X AND V-G=Y))THEN Q=Q-2 38 | 1080 NEXT C:IF Q>R(0)THEN R(0)=Q:R(1)=X:R(2)=Y:R(3)=U:R(4)=V 39 | 1100 Q=0:RETURN 40 | 1140 IF R(0)=-99 THEN 1880 41 | 1230 PRINT CHR$(30)"FROM"R(1);R(2)"TO"R(3);R(4);:R(0)=-99 42 | 1240 IF R(4)=0 THEN S(R(3),R(4))=-2:GOTO 1420 43 | 1250 S(R(3),R(4))=S(R(1),R(2)) 44 | 1310 S(R(1),R(2))=0:IF ABS(R(1)-R(3))<>2 THEN 1420 45 | 1330 S((R(1)+R(3))/2,(R(2)+R(4))/2)=0 46 | 1340 X=R(3):Y=R(4):IF S(X,Y)=-1 THEN B=-2:FOR A=-2 TO 2 STEP 4:GOSUB 1370 47 | 1350 IF S(X,Y)=-2 THEN FOR A=-2 TO 2 STEP 4:FOR B=-2 TO 2 STEP 4:GOSUB 1370:NEXT B 48 | 1360 NEXT A:IF R(0)<>-99 THEN PRINT"TO"R(3);R(4);:R(0)=-99:GOTO 1240 49 | 1365 GOTO 1420 50 | 1370 U=X+A:V=Y+B:IF U<0 OR U>7 OR V<0 OR V>7 THEN 1400 51 | 1380 IF S(U,V)=0 AND S(X+A/2,Y+B/2)>0 THEN GOSUB 910 52 | 1400 RETURN 53 | 1420 PRINT:PRINT:PRINT:FOR Y=7 TO 0 STEP-1:FOR X=0 TO 7:I=5*X:PRINT TAB(I); 54 | 1430 IF S(X,Y)=0 THEN PRINT"."; 55 | 1470 IF S(X,Y)=1 THEN PRINT"O"; 56 | 1490 IF S(X,Y)=-1 THEN PRINT"X"; 57 | 1510 IF S(X,Y)=-2 THEN PRINT"X*"; 58 | 1530 IF S(X,Y)=2 THEN PRINT"O*"; 59 | 1550 NEXT X:PRINT" ":PRINT:NEXT Y:PRINT 60 | 1552 FOR L=0 TO 7 61 | 1554 FOR M=0 TO 7 62 | 1556 IF S(L,M)=1 OR S(L,M)=2 THEN Z=1 63 | 1558 IF S(L,M)=-1 OR S(L,M)=-2 THEN T=1 64 | 1560 NEXT M 65 | 1562 NEXT L 66 | 1564 IF Z<>1 THEN 1885 67 | 1566 IF T<>1 THEN 1880 68 | 1570 Z=0: T=0 69 | 1590 INPUT "FROM";E,H:X=E:Y=H:IF S(X,Y)<=0 THEN 1590 70 | 1670 INPUT "TO";A,B:X=A:Y=B 71 | 1680 IF S(X,Y)=0 AND ABS(A-E)<=2 AND ABS(A-E)=ABS(B-H)THEN 1700 72 | 1690 PRINT CHR$(7)CHR$(11);:GOTO 1670 73 | 1700 I=46 74 | 1750 S(A,B)=S(E,H):S(E,H)=0:IF ABS(E-A)<>2 THEN 1810 75 | 1800 S((E+A)/2,(H+B)/2)=0 76 | 1802 INPUT "+TO";A1,B1:IF A1<0 THEN 1810 77 | 1804 IF S(A1,B1)<>0 OR ABS(A1-A)<>2 OR ABS(B1-B)<>2 THEN 1802 78 | 1806 E=A:H=B:A=A1:B=B1:I=I+15:GOTO 1750 79 | 1810 IF B=7 THEN S(A,B)=2 80 | 1830 GOTO 230 81 | 1880 PRINT: PRINT "YOU WIN.": END 82 | 1885 PRINT: PRINT "I WIN.": END 83 | -------------------------------------------------------------------------------- /code/disks/H/chemist.bas: -------------------------------------------------------------------------------- 1 | 3 PRINT TAB(33);"CHEMIST" 2 | 6 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 8 PRINT:PRINT:PRINT 4 | 10 PRINT "THE FICTITIOUS CHECMICAL KRYPTOCYANIC ACID CAN ONLY BE" 5 | 20 PRINT "DILUTED BY THE RATIO OF 7 PARTS WATER TO 3 PARTS ACID." 6 | 30 PRINT "IF ANY OTHER RATIO IS ATTEMPTED, THE ACID BECOMES UNSTABLE" 7 | 40 PRINT "AND SOON EXPLODES. GIVEN THE AMOUNT OF ACID, YOU MUST" 8 | 50 PRINT "DECIDE WHO MUCH WATER TO ADD FOR DILUTION. IF YOU MISS" 9 | 60 PRINT "YOU FACE THE CONSEQUENCES." 10 | 100 A=INT(RND(1)*50) 11 | 110 W=7*A/3 12 | 120 PRINT A;"LITERS OF KRYPTOCYANIC ACID. HOW MUCH WATER"; 13 | 130 INPUT R 14 | 140 D=ABS(W-R) 15 | 150 IF D>W/20 THEN 200 16 | 160 PRINT " GOOD JOB! YOU MAY BREATHE NOW, BUT DON'T INHALE THE FUMES!" 17 | 170 PRINT 18 | 180 GOTO 100 19 | 200 PRINT " SIZZLE! YOU HAVE JUST BEEN DESALINATED INTO A BLOB" 20 | 210 PRINT " OF QUIVERING PROTOPLASM!" 21 | 220 T=T+1 22 | 230 IF T=9 THEN 260 23 | 240 PRINT " HOWEVER, YOU MAY TRY AGAIN WITH ANOTHER LIFE." 24 | 250 GOTO 100 25 | 260 PRINT " YOUR 9 LIVES ARE USED, BUT YOU WILL BE LONG REMEMBERED FOR" 26 | 270 PRINT " YOUR CONTRIBUTIONS TO THE FIELD OF COMIC BOOK CHEMISTRY." 27 | 280 END 28 | -------------------------------------------------------------------------------- /code/disks/H/chief.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(30) "CHIEF" 2 | 4 PRINT TAB(15) "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT:PRINT:PRINT 4 | 10 PRINT "I AM CHIEF NUMBERS FREEK, THE GREAT INDIAN MATH GOD." 5 | 20 PRINT "ARE YOU READY TO TAKE THE TEST YOU CALLED ME OUT FOR"; 6 | 30 INPUT A$ 7 | 40 IF A$="YES" THEN 60 8 | 50 PRINT "SHUT UP, PALE FACE WITH WISE TONGUE." 9 | 60 PRINT " TAKE A NUMBER AND ADD 3. DIVIDE THIS NUMBER BY 5 AND" 10 | 70 PRINT "MULTIPLY BY 8. DIVIDE BY 5 AND ADD THE SAME. SUBTRACT 1." 11 | 80 PRINT " WHAT DO YOU HAVE"; 12 | 90 INPUT B 13 | 100 LET C = (B+1-5)*5/8*5-3 14 | 110 PRINT "I BET YOUR NUMBER WAS" C". AM I RIGHT"; 15 | 120 INPUT D$ 16 | 130 IF D$="YES" THEN 500 17 | 140 PRINT "WHAT WAS YOUR ORIGINAL NUMBER"; 18 | 150 INPUT K 19 | 155 LET F=K+3 20 | 160 LET G=F/5 21 | 170 LET H=G*8 22 | 180 LET I=H/5+5 23 | 190 LET J=I-1 24 | 200 PRINT "SO YOU THINK YOU'RE SO SMART, EH?" 25 | 210 PRINT "NOW WATCH." 26 | 230 PRINT K"PLUS 3 EQUALS"F". THIS DIVIDED BY 5 EQUALS"G";" 27 | 240 PRINT "THIS TIMES 8 EQUALS"H". IF WE DIVIDE BY 5 AND ADD 5," 28 | 250 PRINT "WE GET"I", WHICH, MINUS 1, EQUALS"J"." 29 | 260 PRINT "NOW DO YOU BELIEVE ME"; 30 | 270 INPUT Z$ 31 | 290 IF Z$="YES" THEN 500 32 | 295 PRINT "YOU HAVE MADE ME MAD!!!" 33 | 300 PRINT "THERE MUST BE A GREAT LIGHTNING BOLT!" 34 | 310 PRINT:PRINT 35 | 330 FOR X=30 TO 22 STEP -1 36 | 340 PRINT TAB(X) "X X" 37 | 350 NEXT X 38 | 360 PRINT TAB(21) "X XXX" 39 | 370 PRINT TAB(20) "X X" 40 | 380 PRINT TAB(19) "XX X" 41 | 390 FOR Y=20 TO 13 STEP -1 42 | 400 PRINT TAB(Y) "X X" 43 | 410 NEXT Y 44 | 420 PRINT TAB(12) "XX" 45 | 430 PRINT TAB(11) "X" 46 | 440 PRINT TAB(10) "*" 47 | 450 PRINT:PRINT"#########################":PRINT 48 | 470 PRINT "I HOPE YOU BELIEVE ME NOW, FOR YOUR SAKE!!" 49 | 480 GOTO 520 50 | 510 PRINT "BYE!!!" 51 | 520 END 52 | -------------------------------------------------------------------------------- /code/disks/H/chomp.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"CHOMP" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 40 DIM A(10,10) 5 | 100 REM *** THE GAME OF CHOMP *** COPYRIGHT PCC 1973 *** 6 | 110 PRINT 7 | 120 PRINT "THIS IS THE GAME OF CHOMP (SCIENTIFIC AMERICAN, JAN 1973)" 8 | 130 PRINT "DO YOU WANT THE RULES (1=YES, 0=NO!)"; 9 | 140 INPUT R 10 | 150 IF R=0 THEN 340 11 | 160 F=1 12 | 170 R=5 13 | 180 C=7 14 | 190 PRINT "CHOMP IS FOR 1 OR MORE PLAYERS (HUMANS ONLY)." 15 | 200 PRINT 16 | 210 PRINT "HERE'S HOW A BOARD LOOKS (THIS ONE IS 5 BY 7):" 17 | 220 GOSUB 540 18 | 230 PRINT 19 | 240 PRINT "THE BOARD IS A BIG COOKIE - R ROWS HIGH AND C COLUMNS" 20 | 250 PRINT "WIDE. YOU INPUT R AND C AT THE START. IN THE UPPER LEFT" 21 | 260 PRINT "CORNER OF THE COOKIE IS A POISON SQUARE (P). THE ONE WHO" 22 | 270 PRINT "CHOMPS THE POISON SQUARE LOSES. TO TAKE A CHOMP, TYPE THE" 23 | 280 PRINT "ROW AND COLUMN OF ONE OF THE SQUARES ON THE COOKIE." 24 | 290 PRINT "ALL OF THE SQUARES BELOW AND TO THE RIGHT OF THAT SQUARE" 25 | 300 PRINT "(INCLUDING THAT SQUARE, TOO) DISAPPEAR -- CHOMP!!" 26 | 310 PRINT "NO FAIR CHOMPING SQUARES THAT HAVE ALREADY BEEN CHOMPED," 27 | 320 PRINT "OR THAT ARE OUTSIDE THE ORIGINAL DIMENSIONS OF THE COOKIE." 28 | 330 PRINT 29 | 340 PRINT "HERE WE GO..." 30 | 350 REM 31 | 360 F=0 32 | 370 FOR I=1 TO 10 33 | 372 FOR J=1 TO 10 34 | 375 A(I,J)=0 35 | 377 NEXT J 36 | 379 NEXT I 37 | 380 PRINT 38 | 390 PRINT "HOW MANY PLAYERS"; 39 | 400 INPUT P 40 | 410 I1=0 41 | 420 PRINT "HOW MANY ROWS"; 42 | 430 INPUT R 43 | 440 IF R <= 9 THEN 470 44 | 450 PRINT "TOO MANY ROWS (9 IS MAXIMUM). NOW, "; 45 | 460 GOTO 420 46 | 470 PRINT "HOW MANY COLUMNS"; 47 | 480 INPUT C 48 | 490 IF C <= 9 THEN 530 49 | 500 PRINT "TOO MANY COLUMNS (9 IS MAXIMUM). NOW, "; 50 | 510 GOTO 470 51 | 530 PRINT 52 | 540 FOR I=1 TO R 53 | 550 FOR J=1 TO C 54 | 560 A(I,J)=1 55 | 570 NEXT J 56 | 580 NEXT I 57 | 590 A(1,1)=-1 58 | 600 REM PRINT THE BOARD 59 | 610 PRINT 60 | 620 PRINT TAB(7);"1 2 3 4 5 6 7 8 9" 61 | 630 FOR I=1 TO R 62 | 640 PRINT I;TAB(7); 63 | 650 FOR J=1 TO C 64 | 660 IF A(I,J)=-1 THEN 700 65 | 670 IF A(I,J)=0 THEN 720 66 | 680 PRINT "* "; 67 | 690 GOTO 710 68 | 700 PRINT "P "; 69 | 710 NEXT J 70 | 720 PRINT 71 | 730 NEXT I 72 | 740 PRINT 73 | 750 IF F=0 THEN 770 74 | 760 RETURN 75 | 770 REM GET CHOMPS FOR EACH PLAYER IN TURN 76 | 780 LET I1=I1+1 77 | 790 LET P1=I1-INT(I1/P)*P 78 | 800 IF P1 <> 0 THEN 820 79 | 810 P1=P 80 | 820 PRINT "PLAYER";P1 81 | 830 PRINT "COORDINATES OF CHOMP (ROW,COLUMN)"; 82 | 840 INPUT R1,C1 83 | 850 IF R1<1 THEN 920 84 | 860 IF R1>R THEN 920 85 | 870 IF C1<1 THEN 920 86 | 880 IF C1>C THEN 920 87 | 890 IF A(R1,C1)=0 THEN 920 88 | 900 IF A(R1,C1)=-1 THEN 1010 89 | 910 GOTO 940 90 | 920 PRINT "NO FAIR. YOU'RE TRYING TO CHOMP ON EMPTY SPACE!" 91 | 930 GOTO 820 92 | 940 FOR I=R1 TO R 93 | 950 FOR J=C1 TO C 94 | 960 A(I,J)=0 95 | 970 NEXT J 96 | 980 NEXT I 97 | 990 GOTO 610 98 | 1000 REM END OF GAME DETECTED IN LINE 900 99 | 1010 PRINT "YOU LOSE, PLAYER";P1 100 | 1020 PRINT 101 | 1030 PRINT "AGAIN (1=YES, 0=NO!)"; 102 | 1040 INPUT R$ 103 | 1050 IF R=1 THEN 340 104 | 1060 END 105 | -------------------------------------------------------------------------------- /code/disks/H/craps.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(33);"CRAPS" 2 | 10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 12 PRINT:PRINT:PRINT 4 | 15 LET R=0 5 | 20 PRINT"2,3,12 ARE LOSERS; 4,5,6,8,9,10 ARE POINTS; 7,11 ARE NATURAL WINNERS." 6 | 21 LET T=1 7 | 22 PRINT "PICK A NUMBER AND INPUT TO ROLL DICE"; 8 | 23 INPUT Z 9 | 24 LET X=(RND(0)) 10 | 25 LET T =T+1 11 | 26 IF T<=Z THEN 24 12 | 27 PRINT"INPUT THE AMOUNT OF YOUR WAGER."; 13 | 28 INPUT F 14 | 30 PRINT "I WILL NOW THROW THE DICE" 15 | 40 LET E=INT(7*RND(1)) 16 | 41 LET S=INT(7*RND(1)) 17 | 42 LET X=E+S 18 | 50 IF X=7 THEN 180 19 | 55 IF X=11 THEN 180 20 | 60 IF X=1 THEN 40 21 | 62 IF X=2 THEN 195 22 | 65 IF X=0 THEN 40 23 | 70 IF X=2 THEN 200 24 | 80 IF X=3 THEN 200 25 | 90 IF X=12 THEN 200 26 | 125 IF X=5 THEN 220 27 | 130 IF X =6 THEN 220 28 | 140 IF X=8 THEN 220 29 | 150 IF X=9 THEN 220 30 | 160 IF X =10 THEN 220 31 | 170 IF X=4 THEN 220 32 | 180 PRINT X "- NATURAL....A WINNER!!!!" 33 | 185 PRINT X"PAYS EVEN MONEY, YOU WIN"F"DOLLARS" 34 | 190 GOTO 210 35 | 195 PRINT X"- SNAKE EYES....YOU LOSE." 36 | 196 PRINT "YOU LOSE"F "DOLLARS." 37 | 197 LET F=0-F 38 | 198 GOTO 210 39 | 200 PRINT X " - CRAPS...YOU LOSE." 40 | 205 PRINT "YOU LOSE"F"DOLLARS." 41 | 206 LET F=0-F 42 | 210 LET R= R+F 43 | 211 GOTO 320 44 | 220 PRINT X "IS THE POINT. I WILL ROLL AGAIN" 45 | 230 LET H=INT(7*RND(1)) 46 | 231 LET Q=INT(7*RND(1)) 47 | 232 LET O=H+Q 48 | 240 IF O=1 THEN 230 49 | 250 IF O=7 THEN 290 50 | 255 IF O=0 THEN 230 51 | 260 IF O=X THEN 310 52 | 270 PRINT O " - NO POINT. I WILL ROLL AGAIN" 53 | 280 GOTO 230 54 | 290 PRINT O "- CRAPS. YOU LOSE." 55 | 291 PRINT "YOU LOSE $"F 56 | 292 F=0-F 57 | 293 GOTO 210 58 | 300 GOTO 320 59 | 310 PRINT X"- A WINNER.........CONGRATS!!!!!!!!" 60 | 311 PRINT X "AT 2 TO 1 ODDS PAYS YOU...LET ME SEE..."2*F"DOLLARS" 61 | 312 LET F=2*F 62 | 313 GOTO 210 63 | 320 PRINT " IF YOU WANT TO PLAY AGAIN PRINT 5 IF NOT PRINT 2"; 64 | 330 INPUT M 65 | 331 IF R<0 THEN 334 66 | 332 IF R>0 THEN 336 67 | 333 IF R=0 THEN 338 68 | 334 PRINT "YOU ARE NOW UNDER $";-R 69 | 335 GOTO 340 70 | 336 PRINT "YOU ARE NOW AHEAD $";R 71 | 337 GOTO 340 72 | 338 PRINT "YOU ARE NOW EVEN AT 0" 73 | 340 IF M=5 THEN 27 74 | 341 IF R<0 THEN 350 75 | 342 IF R>0 THEN 353 76 | 343 IF R=0 THEN 355 77 | 350 PRINT"TOO BAD, YOU ARE IN THE HOLE. COME AGAIN." 78 | 351 GOTO 360 79 | 353 PRINT"CONGRATULATIONS---YOU CAME OUT A WINNER. COME AGAIN!" 80 | 354 GOTO 360 81 | 355 PRINT"CONGRATULATIONS---YOU CAME OUT EVEN, NOT BAD FOR AN AMATEUR" 82 | 360 END 83 | -------------------------------------------------------------------------------- /code/disks/H/depthcharge.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(30);"DEPTH CHARGE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 20 INPUT "DIMENSION OF SEARCH AREA";G: PRINT 5 | 30 N=INT(LOG(G)/LOG(2))+1 6 | 40 PRINT "YOU ARE THE CAPTAIN OF THE DESTROYER USS COMPUTER" 7 | 50 PRINT "AN ENEMY SUB HAS BEEN CAUSING YOU TROUBLE. YOUR" 8 | 60 PRINT "MISSION IS TO DESTROY IT. YOU HAVE";N;"SHOTS." 9 | 70 PRINT "SPECIFY DEPTH CHARGE EXPLOSION POINT WITH A" 10 | 80 PRINT "TRIO OF NUMBERS -- THE FIRST TWO ARE THE" 11 | 90 PRINT "SURFACE COORDINATES; THE THIRD IS THE DEPTH." 12 | 100 PRINT : PRINT "GOOD LUCK !": PRINT 13 | 110 A=INT(G*RND(1)) : B=INT(G*RND(1)) : C=INT(G*RND(1)) 14 | 120 FOR D=1 TO N : PRINT : PRINT "TRIAL #";D; : INPUT X,Y,Z 15 | 130 IF ABS(X-A)+ABS(Y-B)+ABS(Z-C)=0 THEN 300 16 | 140 GOSUB 500 : PRINT : NEXT D 17 | 200 PRINT : PRINT "YOU HAVE BEEN TORPEDOED! ABANDON SHIP!" 18 | 210 PRINT "THE SUBMARINE WAS AT";A;",";B;",";C : GOTO 400 19 | 300 PRINT : PRINT "B O O M ! ! YOU FOUND IT IN";D;"TRIES!" 20 | 400 PRINT : PRINT: INPUT "ANOTHER GAME (Y OR N)";A$ 21 | 410 IF A$="Y" THEN 100 22 | 420 PRINT "OK. HOPE YOU ENJOYED YOURSELF." : GOTO 600 23 | 500 PRINT "SONAR REPORTS SHOT WAS "; 24 | 510 IF Y>B THEN PRINT "NORTH"; 25 | 520 IF YA THEN PRINT "EAST"; 27 | 540 IF XB OR X<>A THEN PRINT " AND"; 29 | 560 IF Z>C THEN PRINT " TOO LOW." 30 | 570 IF ZLEN(A$) THEN PRINT "!";:GOTO 50 15 | 34 PRINT MID$(A$,C,1); 16 | 36 C=C+1 17 | 50 NEXT A 18 | 53 IF M=Q THEN 60 19 | 55 PRINT TAB(R*M+(R-N)/2); 20 | 56 NEXT M 21 | 60 PRINT 22 | 70 NEXT N 23 | 83 IF X<>1 THEN 95 24 | 85 X=R-2:Y=1:Z=-2 25 | 90 GOTO 20 26 | 95 NEXT L 27 | 99 END 28 | -------------------------------------------------------------------------------- /code/disks/H/dice.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(34);"DICE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT:PRINT:PRINT 4 | 10 DIM F(12) 5 | 20 REM DANNY FREIDUS 6 | 30 PRINT "THIS PROGRAM SIMULATES THE ROLLING OF A" 7 | 40 PRINT "PAIR OF DICE." 8 | 50 PRINT "YOU ENTER THE NUMBER OF TIMES YOU WANT THE COMPUTER TO" 9 | 60 PRINT "'ROLL' THE DICE. WATCH OUT, VERY LARGE NUMBERS TAKE" 10 | 70 PRINT "A LONG TIME. IN PARTICULAR, NUMBERS OVER 5000." 11 | 80 FOR Q=1 TO 12 12 | 90 F(Q)=0 13 | 100 NEXT Q 14 | 110 PRINT:PRINT "HOW MANY ROLLS"; 15 | 120 INPUT X 16 | 130 FOR S=1 TO X 17 | 140 A=INT(6*RND(1)+1) 18 | 150 B=INT(6*RND(1)+1) 19 | 160 R=A+B 20 | 170 F(R)=F(R)+1 21 | 180 NEXT S 22 | 185 PRINT 23 | 190 PRINT "TOTAL SPOTS","NUMBER OF TIMES" 24 | 200 FOR V=2 TO 12 25 | 210 PRINT V,F(V) 26 | 220 NEXT V 27 | 221 PRINT 28 | 222 PRINT:PRINT "TRY AGAIN"; 29 | 223 INPUT Z$ 30 | 224 IF Z$="YES" THEN 80 31 | 240 END 32 | -------------------------------------------------------------------------------- /code/disks/H/digits.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"DIGITS" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 210 PRINT "THIS IS A GAME OF GUESSING." 5 | 220 PRINT "FOR INSTRUCTIONS, TYPE '1', ELSE TYPE '0'"; 6 | 230 INPUT E 7 | 240 IF E=0 THEN 360 8 | 250 PRINT 9 | 260 PRINT "PLEASE TAKE A PIECE OF PAPER AND WRITE DOWN" 10 | 270 PRINT "THE DIGITS '0', '1', OR '2' THIRTY TIMES AT RANDOM." 11 | 280 PRINT "ARRANGE THEM IN THREE LINES OF TEN DIGITS EACH." 12 | 290 PRINT "I WILL ASK FOR THEN TEN AT A TIME." 13 | 300 PRINT "I WILL ALWAYS GUESS THEM FIRST AND THEN LOOK AT YOUR" 14 | 310 PRINT "NEXT NUMBER TO SEE IF I WAS RIGHT. BY PURE LUCK," 15 | 320 PRINT "I OUGHT TO BE RIGHT TEN TIMES. BUT I HOPE TO DO BETTER" 16 | 330 PRINT "THAN THAT *****" 17 | 340 PRINT:PRINT 18 | 360 READ A,B,C 19 | 370 DATA 0,1,3 20 | 380 DIM M(26,2),K(2,2),L(8,2) 21 | 400 FOR I=0 TO 26: FOR J=0 TO 2: M(I,J)=1: NEXT J: NEXT I 22 | 410 FOR I=0 TO 2: FOR J=0 TO 2: K(I,J)=9: NEXT J: NEXT I 23 | 420 FOR I=0 TO 8: FOR J=0 TO 2: L(I,J)=3: NEXT J: NEXT I 24 | 450 L(0,0)=2: L(4,1)=2: L(8,2)=2 25 | 480 Z=26: Z1=8: Z2=2 26 | 510 X=0 27 | 520 FOR T=1 TO 3 28 | 530 PRINT 29 | 540 PRINT "TEN NUMBERS, PLEASE"; 30 | 550 INPUT N(1),N(2),N(3),N(4),N(5),N(6),N(7),N(8),N(9),N(10) 31 | 560 FOR I=1 TO 10 32 | 570 W=N(I)-1 33 | 580 IF W=SGN(W) THEN 620 34 | 590 PRINT "ONLY USE THE DIGITS '0', '1', OR '2'." 35 | 600 PRINT "LET'S TRY AGAIN.":GOTO 530 36 | 620 NEXT I 37 | 630 PRINT: PRINT "MY GUESS","YOUR NO.","RESULT","NO. RIGHT":PRINT 38 | 660 FOR U=1 TO 10 39 | 670 N=N(U): S=0 40 | 690 FOR J=0 TO 2 41 | 700 S1=A*K(Z2,J)+B*L(Z1,J)+C*M(Z,J) 42 | 710 IF S>S1 THEN 760 43 | 720 IF S10 THEN 980 64 | 940 IF X<10 THEN 1010 65 | 950 PRINT "I GUESSED EXACTLY 1/3 OF YOUR NUMBERS." 66 | 960 PRINT "IT'S A TIE GAME." 67 | 970 GOTO 1030 68 | 980 PRINT "I GUESSED MORE THAN 1/3 OF YOUR NUMBERS." 69 | 990 PRINT "I WIN.": FOR Q=1 TO 10: PRINT CHR$(7);: NEXT Q 70 | 1000 GOTO 1030 71 | 1010 PRINT "I GUESSED LESS THAN 1/3 OF YOUR NUMBERS." 72 | 1020 PRINT "YOU BEAT ME. CONGRATULATIONS *****" 73 | 1030 PRINT 74 | 1040 PRINT "DO YOU WANT TO TRY AGAIN (1 FOR YES, 0 FOR NO)"; 75 | 1060 INPUT X 76 | 1070 IF X=1 THEN 400 77 | 1080 PRINT:PRINT "THANKS FOR THE GAME." 78 | 1090 END 79 | -------------------------------------------------------------------------------- /code/disks/H/flipflop.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(32);"FLIPFLOP" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT 4 | 10 REM *** CREATED BY MICHAEL CASS 5 | 15 DIM A$(20) 6 | 20 PRINT "THE OBJECT OF THIS PUZZLE IS TO CHANGE THIS:" 7 | 30 PRINT 8 | 40 PRINT "X X X X X X X X X X" 9 | 50 PRINT 10 | 60 PRINT "TO THIS:" 11 | 70 PRINT 12 | 80 PRINT "O O O O O O O O O O" 13 | 90 PRINT 14 | 100 PRINT "BY TYPING THE NUMBER CORRESPONDING TO THE POSITION OF THE" 15 | 110 PRINT "LETTER ON SOME NUMBERS, ONE POSITION WILL CHANGE, ON" 16 | 120 PRINT "OTHERS, TWO WILL CHANGE. TO RESET LINE TO ALL X'S, TYPE 0" 17 | 130 PRINT "(ZERO) AND TO START OVER IN THE MIDDLE OF A GAME, TYPE " 18 | 140 PRINT "11 (ELEVEN)." 19 | 170 PRINT 20 | 180 REM 21 | 190 Q=RND(1) 22 | 200 PRINT "HERE IS THE STARTING LINE OF X'S." 23 | 210 PRINT 24 | 220 C=0 25 | 230 PRINT "1 2 3 4 5 6 7 8 9 10" 26 | 240 PRINT "X X X X X X X X X X" 27 | 250 PRINT 28 | 260 REM 29 | 270 FOR X=1 TO 10 30 | 280 A$(X)="X" 31 | 290 NEXT X 32 | 300 GOTO 320 33 | 310 PRINT "ILLEGAL ENTRY--TRY AGAIN." 34 | 320 PRINT "INPUT THE NUMBER"; 35 | 330 INPUT N 36 | 340 IF N<>INT(N) THEN 310 37 | 350 IF N=11 THEN 180 38 | 360 IF N>11 THEN 310 39 | 370 IF N=0 THEN 230 40 | 380 IF M=N THEN 510 41 | 390 M=N 42 | 400 IF A$(N)="O" THEN 480 43 | 410 A$(N)="O" 44 | 420 R=TAN(Q+N/Q-N)-SIN(Q/N)+336*SIN(8*N) 45 | 430 N=R-INT(R) 46 | 440 N=INT(10*N) 47 | 450 IF A$(N)="O" THEN 480 48 | 460 A$(N)="O" 49 | 470 GOTO 610 50 | 480 A$(N)="X" 51 | 490 IF M=N THEN 420 52 | 500 GOTO 610 53 | 510 IF A$(N)="O" THEN 590 54 | 520 A$(N)="O" 55 | 530 R=.592*(1/TAN(Q/N+Q))/SIN(N*2+Q)-COS(N) 56 | 540 N=R-INT(R) 57 | 550 N=INT(10*N) 58 | 560 IF A$(N)="O" THEN 590 59 | 570 A$(N)="O" 60 | 580 GOTO 610 61 | 590 A$(N)="X" 62 | 600 IF M=N THEN 530 63 | 610 PRINT "1 2 3 4 5 6 7 8 9 10" 64 | 620 FOR Z=1 TO 10: PRINT A$(Z);" ";: NEXT Z 65 | 630 C=C+1 66 | 640 PRINT 67 | 650 FOR Z=1 TO 10 68 | 660 IF A$(Z)<>"O" THEN 320 69 | 670 NEXT Z 70 | 680 IF C>12 THEN 710 71 | 690 PRINT "VERY GOOD. YOU GUESSED IT IN ONLY";C;"GUESSES." 72 | 700 GOTO 720 73 | 710 PRINT "TRY HARDER NEXT TIME. IT TOOK YOU";C;"GUESSES." 74 | 720 PRINT "DO YOU WANT TO TRY ANOTHER PUZZLE"; 75 | 730 INPUT X$ 76 | 740 IF LEFT$(X$,1)="N" THEN 780 77 | 760 PRINT 78 | 770 GOTO 180 79 | 780 END 80 | -------------------------------------------------------------------------------- /code/disks/H/gameofevenwins.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(28);"GAME OF EVEN WINS" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT 4 | 4 INPUT "DO YOU WANT INSTRUCTIONS (YES OR NO)";A$:PRINT 5 | 5 IF A$="NO" THEN 20 6 | 6 PRINT "THE GAME IS PLAYED AS FOLLOWS:":PRINT 7 | 7 PRINT "AT THE BEGINNING OF THE GAME, A RANDOM NUMBER OF CHIPS ARE" 8 | 8 PRINT "PLACED ON THE BOARD. THE NUMBER OF CHIPS ALWAYS STARTS" 9 | 9 PRINT "AS AN ODD NUMBER. ON EACH TURN, A PLAYER MUST TAKE ONE," 10 | 10 PRINT "TWO, THREE, OR FOUR CHIPS. THE WINNER IS THE PLAYER WHO" 11 | 11 PRINT "FINISHES WITH A TOTAL NUMBER OF CHIPS THAT IS EVEN." 12 | 12 PRINT "THE COMPUTER STARTS OUT KNOWING ONLY THE RULES OF THE" 13 | 13 PRINT "GAME. IT GRADUALLY LEARNS TO PLAY WELL. IT SHOULD BE" 14 | 14 PRINT "DIFFICULT TO BEAT THE COMPUTER AFTER TWENTY GAMES IN A ROW." 15 | 15 PRINT "TRY IT!!!!": PRINT 16 | 16 PRINT "TO QUIT AT ANY TIME, TYPE A '0' AS YOUR MOVE.": PRINT 17 | 20 DIM R(1,5) 18 | 25 L=0: B=0 19 | 30 FOR I=0 TO 5 20 | 40 R(1,I)=4 21 | 50 R(0,I)=4 22 | 60 NEXT I 23 | 70 A=0: B=0 24 | 90 P=INT((13*RND(1)+9)/2)*2+1 25 | 100 IF P=1 THEN 530 26 | 110 PRINT "THERE ARE";P;"CHIPS ON THE BOARD." 27 | 120 E1=E 28 | 130 L1=L 29 | 140 E=(A/2-INT(A/2))*2 30 | 150 L=INT((P/6-INT(P/6))*6+.5) 31 | 160 IF R(E,L)>=P THEN 320 32 | 170 M=R(E,L) 33 | 180 IF M<=0 THEN 370 34 | 190 P=P-M 35 | 200 IF M=1 THEN 510 36 | 210 PRINT "COMPUTER TAKES";M;"CHIPS LEAVING";P;"... YOUR MOVE"; 37 | 220 B=B+M 38 | 230 INPUT M 39 | 240 M=INT(M) 40 | 250 IF M<1 THEN 450 41 | 260 IF M>4 THEN 460 42 | 270 IF M>P THEN 460 43 | 280 IF M=P THEN 360 44 | 290 P=P-M 45 | 300 A=A+M 46 | 310 GOTO 100 47 | 320 IF P=1 THEN 550 48 | 330 PRINT "COMPUTER TAKES";P;"CHIPS." 49 | 340 R(E,L)=P 50 | 350 B=B+P 51 | 360 IF B/2=INT(B/2) THEN 420 52 | 370 PRINT "GAME OVER ... YOU WIN!!!": PRINT 53 | 390 IF R(E,L)=1 THEN 480 54 | 400 R(E,L)=R(E,L)-1 55 | 410 GOTO 70 56 | 420 PRINT "GAME OVER ... I WIN!!!": PRINT 57 | 430 GOTO 70 58 | 450 IF M=0 THEN 570 59 | 460 PRINT M;"IS AN ILLEGAL MOVE ... YOUR MOVE"; 60 | 470 GOTO 230 61 | 480 IF R(E1,L1)=1 THEN 70 62 | 490 R(E1,L1)=R(E1,L1)-1 63 | 500 GOTO 70 64 | 510 PRINT "COMPUTER TAKES 1 CHIP LEAVING";P;"... YOUR MOVE"; 65 | 520 GOTO 220 66 | 530 PRINT "THERE IS 1 CHIP ON THE BOARD." 67 | 540 GOTO 120 68 | 550 PRINT "COMPUTER TAKES 1 CHIP." 69 | 560 GOTO 340 70 | 570 END 71 | -------------------------------------------------------------------------------- /code/disks/H/gomoko.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"GOMOKO" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT:PRINT:PRINT 4 | 8 DIM A(19,19) 5 | 10 PRINT "WELCOME TO THE ORIENTAL GAME OF GOMOKO." 6 | 20 PRINT: PRINT "THE GAME IS PLAYED ON AN N BY N GRID OF A SIZE" 7 | 30 PRINT "THAT YOU SPECIFY. DURING YOUR PLAY, YOU MAY COVER ONE GRID" 8 | 40 PRINT "INTERSECTION WITH A MARKER. THE OBJECT OF THE GAME IS TO GET" 9 | 50 PRINT "5 ADJACENT MARKERS IN A ROW -- HORIZONTALLY, VERTICALLY, OR" 10 | 60 PRINT "DIAGONALLY. ON THE BOARD DIAGRAM, YOUR MOVES ARE MARKED" 11 | 70 PRINT "WITH A '1' AND THE COMPUTER MOVES WITH A '2'." 12 | 80 PRINT: PRINT "THE COMPUTER DOES NOT KEEP TRACK OF WHO HAS WON." 13 | 90 PRINT "TO END THE GAME, TYPE -1,-1 FOR YOUR MOVE.": PRINT 14 | 110 PRINT "WHAT IS YOUR BOARD SIZE (MIN 7/ MAX 19)";: INPUT N 15 | 115 IF N>6 THEN 117 16 | 116 GOTO 120 17 | 117 IF N<20 THEN 210 18 | 120 PRINT "I SAID, THE MINIMUM IS 7, THE MAXIMUM IS 19.": GOTO 110 19 | 210 FOR I=1 TO N:FOR J=1 TO N: A(I,J)=0: NEXT J: NEXT I 20 | 300 PRINT: PRINT "WE ALTERNATE MOVES. YOU GO FIRST...": PRINT 21 | 310 PRINT "YOUR PLAY (I,J)";: INPUT I,J 22 | 315 PRINT 23 | 320 IF I=-1 THEN 980 24 | 330 X=I: Y=J: GOSUB 910: IF L=1 THEN 410 25 | 340 PRINT "ILLEGAL MOVE. TRY AGAIN...": GOTO 310 26 | 410 IF A(I,J)=0 THEN 440 27 | 420 PRINT "SQUARE OCCUPIED. TRY AGAIN...": GOTO 310 28 | 440 A(I,J)=1 29 | 500 REM *** COMPUTER TRIES AN INTELLIGENT MOVE *** 30 | 510 FOR E=-1 TO 1: FOR F=-1 TO 1: IF E+F-E*F=0 THEN 590 31 | 540 X=I+F: Y=J+F: GOSUB 910 32 | 570 IF L=0 THEN 590 33 | 580 IF A(X,Y)=1 THEN 710 34 | 590 NEXT F: NEXT E 35 | 600 REM *** COMPUTER TRIES A RANDOM MOVE *** 36 | 610 X=INT(N*RND(1)+1): Y=INT(N*RND(1)+1): GOSUB 910: IF L=0 THEN 610 37 | 650 IF A(X,Y)<>0 THEN 610 38 | 660 A(X,Y)=2: GOSUB 810: GOTO 310 39 | 710 X=I-E: Y=J-F: GOSUB 910 40 | 750 IF L=0 THEN 610 41 | 760 GOTO 650 42 | 800 REM *** PRINT THE BOARD *** 43 | 810 FOR I=1 TO N: FOR J=1 TO N: PRINT A(I,J); 44 | 840 NEXT J: PRINT: NEXT I: PRINT: RETURN 45 | 910 L=1: IF X<1 THEN 970 46 | 920 IF X>N THEN 970 47 | 930 IF Y<1 THEN 970 48 | 940 IF Y>N THEN 970 49 | 950 RETURN 50 | 970 L=0: RETURN 51 | 980 PRINT: PRINT "THANKS FOR THE GAME!!" 52 | 985 PRINT "PLAY AGAIN (1 FOR YES, 0 FOR NO)";: INPUT Q 53 | 990 IF Q=1 THEN 110 54 | 999 END 55 | -------------------------------------------------------------------------------- /code/disks/H/guess.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(33);"GUESS" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 4 PRINT "THIS IS A NUMBER GUESSING GAME. I'LL THINK" 5 | 5 PRINT "OF A NUMBER BETWEEN 1 AND ANY LIMIT YOU WANT." 6 | 6 PRINT "THEN YOU HAVE TO GUESS WHAT IT IS." 7 | 7 PRINT 8 | 8 PRINT "WHAT LIMIT DO YOU WANT"; 9 | 9 INPUT L 10 | 10 PRINT 11 | 11 L1=INT(LOG(L)/LOG(2))+1 12 | 12 PRINT "I'M THINKING OF A NUMBER BETWEEN 1 AND";L 13 | 13 G=1 14 | 14 PRINT "NOW YOU TRY TO GUESS WHAT IT IS." 15 | 15 M=INT(L*RND(1)+1) 16 | 20 INPUT N 17 | 21 IF N>0 THEN 25 18 | 22 GOSUB 70 19 | 23 GOTO 1 20 | 25 IF N=M THEN 50 21 | 30 G=G+1 22 | 31 IF N>M THEN 40 23 | 32 PRINT "TOO LOW. TRY A BIGGER ANSWER." 24 | 33 GOTO 20 25 | 40 PRINT "TOO HIGH. TRY A SMALLER ANSWER." 26 | 42 GOTO 20 27 | 50 PRINT "THAT'S IT! YOU GOT IT IN";G;"TRIES." 28 | 52 IF G89 THEN 250 36 | 430 IF B<1 THEN 230 37 | 440 S=S+1 38 | 442 IF S<6 THEN 450 39 | 444 PRINT:PRINT "BOOM !!!! YOU HAVE JUST BEEN DESTROYED "; 40 | 446 PRINT "BY THE ENEMY." : PRINT : PRINT : PRINT : GOTO 495 41 | 450 B2=2*B/57.3 : I=R*SIN(B2) : X=T-I : E=INT(X) 42 | 460 IF ABS(E)<100 THEN 320 43 | 470 IF E>100 THEN 290 44 | 480 GOTO 270 45 | 490 PRINT : PRINT : PRINT "TOTAL ROUNDS EXPENDED WERE:";S1 46 | 492 IF S1>18 THEN 495 47 | 493 PRINT "NICE SHOOTING !!" : GOTO 500 48 | 495 PRINT "BETTER GO BACK TO FORT SILL FOR REFRESHER TRAINING!" 49 | 500 PRINT : INPUT "TRY AGAIN (Y OR N)";Z$ 50 | 510 IF Z$="Y" THEN 170 51 | 520 PRINT:PRINT "OK. RETURN TO BASE CAMP." 52 | 999 END 53 | -------------------------------------------------------------------------------- /code/disks/H/hi-lo.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(34);"HI LO" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 100 PRINT "THIS IS THE GAME OF HI LO.":PRINT 5 | 110 PRINT "YOU WILL HAVE 6 TRIES TO GUESS THE AMOUNT OF MONEY IN THE" 6 | 120 PRINT "HI LO JACKPOT, WHICH IS BETWEEN 1 AND 100 DOLLARS. IF YOU" 7 | 130 PRINT "GUESS THE AMOUNT, YOU WIN ALL THE MONEY IN THE JACKPOT!" 8 | 140 PRINT "THEN YOU GET ANOTHER CHANCE TO WIN MORE MONEY. HOWEVER," 9 | 150 PRINT "IF YOU DO NOT GUESS THE AMOUNT, THE GAME ENDS.":PRINT 10 | 160 R=0 11 | 170 B=0:PRINT 12 | 180 Y=INT(100*RND(1)) 13 | 200 PRINT "YOUR GUESS"; 14 | 210 INPUT A 15 | 220 B=B+1 16 | 230 IF A=Y THEN 300 17 | 240 IF A>Y THEN 270 18 | 250 PRINT "YOUR GUESS IS TOO LOW.":GOTO 280 19 | 270 PRINT "YOUR GUESS IS TOO HIGH." 20 | 280 PRINT:IF B<6 THEN 200 21 | 290 PRINT "YOU BLEW IT...TOO BAD...THE NUMBER WAS";Y 22 | 295 R=0:GOTO 350 23 | 300 PRINT "GOT IT!!!!!!!!!! YOU WIN";Y;"DOLLARS." 24 | 310 R=R+Y 25 | 320 PRINT "YOUR TOTAL WINNINGS ARE NOW";R;"DOLLARS." 26 | 350 PRINT:PRINT "PLAY AGAIN (YES OR NO)"; 27 | 360 INPUT A$:IF A$="YES" THEN 170 28 | 380 PRINT:PRINT "SO LONG. HOPE YOU ENJOYED YOURSELF!!!" 29 | 390 END 30 | -------------------------------------------------------------------------------- /code/disks/H/hurkle.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"HURKLE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 110 N=5 5 | 120 G=10 6 | 210 PRINT 7 | 220 PRINT "A HURKLE IS HIDING ON A";G;"BY";G;"GRID. HOMEBASE" 8 | 230 PRINT "ON THE GRID IS POINT 0,0 IN THE SOUTHWEST CORNER," 9 | 235 PRINT "AND ANY POINT ON THE GRID IS DESIGNATED BY A" 10 | 240 PRINT "PAIR OF WHOLE NUMBERS SEPERATED BY A COMMA. THE FIRST" 11 | 245 PRINT "NUMBER IS THE HORIZONTAL POSITION AND THE SECOND NUMBER" 12 | 246 PRINT "IS THE VERTICAL POSITION. YOU MUST TRY TO" 13 | 250 PRINT "GUESS THE HURKLE'S GRIDPOINT. YOU GET";N;"TRIES." 14 | 260 PRINT "AFTER EACH TRY, I WILL TELL YOU THE APPROXIMATE" 15 | 270 PRINT "DIRECTION TO GO TO LOOK FOR THE HURKLE." 16 | 280 PRINT 17 | 285 A=INT(G*RND(1)) 18 | 286 B=INT(G*RND(1)) 19 | 310 FOR K=1 TO N 20 | 320 PRINT "GUESS #";K; 21 | 330 INPUT X,Y 22 | 340 IF ABS(X-A)+ABS(Y-B)=0 THEN 500 23 | 350 REM PRINT INFO 24 | 360 GOSUB 610 25 | 370 PRINT 26 | 380 NEXT K 27 | 410 PRINT 28 | 420 PRINT "SORRY, THAT'S";N;"GUESSES." 29 | 430 PRINT "THE HURKLE IS AT ";A;",";B 30 | 440 PRINT 31 | 450 PRINT "LET'S PLAY AGAIN, HURKLE IS HIDING." 32 | 460 PRINT 33 | 470 GOTO 285 34 | 500 REM 35 | 510 PRINT 36 | 520 PRINT "YOU FOUND HIM IN";K;"GUESSES!" 37 | 540 GOTO 440 38 | 610 PRINT "GO "; 39 | 620 IF Y=B THEN 670 40 | 630 IF YL THEN 480 16 | 460 PRINT "TOO LOW. TRY A HIGHER LETTER.": GOTO 410 17 | 480 PRINT "TOO HIGH. TRY A LOWER LETTER.": GOTO 410 18 | 500 PRINT: PRINT "YOU GOT IT IN";G;"GUESSES!!" 19 | 504 IF G<=5 THEN 508 20 | 506 PRINT "BUT IT SHOULDN'T TAKE MORE THAN 5 GUESSES!": GOTO 515 21 | 508 PRINT "GOOD JOB !!!!!" 22 | 510 FOR N=1 TO 15: PRINT CHR$(7);: NEXT N 23 | 515 PRINT 24 | 520 PRINT "LET'S PLAN AGAIN....." 25 | 530 GOTO 310 26 | 999 END 27 | -------------------------------------------------------------------------------- /code/disks/I/life.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(34);"LIFE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 8 PRINT "ENTER YOUR PATTERN:" 5 | 9 X1=1: Y1=1: X2=24: Y2=70 6 | 10 DIM A(24,70),B$(24) 7 | 20 C=1 8 | 30 INPUT B$(C) 9 | 40 IF B$(C)="DONE" THEN B$(C)="": GOTO 80 10 | 50 IF LEFT$(B$(C),1)="." THEN B$(C)=" "+RIGHT$(B$(C),LEN(B$(C))-1) 11 | 60 C=C+1 12 | 70 GOTO 30 13 | 80 C=C-1: L=0 14 | 90 FOR X=1 TO C-1 15 | 100 IF LEN(B$(X))>L THEN L=LEN(B$(X)) 16 | 110 NEXT X 17 | 120 X1=11-C/2 18 | 130 Y1=33-L/2 19 | 140 FOR X=1 TO C 20 | 150 FOR Y=1 TO LEN(B$(X)) 21 | 160 IF MID$(B$(X),Y,1)<>" " THEN A(X1+X,Y1+Y)=1:P=P+1 22 | 170 NEXT Y 23 | 180 NEXT X 24 | 200 PRINT:PRINT:PRINT 25 | 210 PRINT "GENERATION:";G,"POPULATION:";P;: IF I9 THEN PRINT "INVALID!"; 26 | 215 X3=24:Y3=70:X4=1: Y4=1: P=0 27 | 220 G=G+1 28 | 225 FOR X=1 TO X1-1: PRINT: NEXT X 29 | 230 FOR X=X1 TO X2 30 | 240 PRINT 31 | 250 FOR Y=Y1 TO Y2 32 | 253 IF A(X,Y)=2 THEN A(X,Y)=0:GOTO 270 33 | 256 IF A(X,Y)=3 THEN A(X,Y)=1:GOTO 261 34 | 260 IF A(X,Y)<>1 THEN 270 35 | 261 PRINT TAB(Y);"*"; 36 | 262 IF XX4 THEN X4=X 38 | 266 IF YY4 THEN Y4=Y 40 | 270 NEXT Y 41 | 290 NEXT X 42 | 295 FOR X=X2+1 TO 24: PRINT: NEXT X 43 | 299 X1=X3: X2=X4: Y1=Y3: Y2=Y4 44 | 301 IF X1<3 THEN X1=3:I9=-1 45 | 303 IF X2>22 THEN X2=22:I9=-1 46 | 305 IF Y1<3 THEN Y1=3:I9=-1 47 | 307 IF Y2>68 THEN Y2=68:I9=-1 48 | 309 P=0 49 | 500 FOR X=X1-1 TO X2+1 50 | 510 FOR Y=Y1-1 TO Y2+1 51 | 520 C=0 52 | 530 FOR I=X-1 TO X+1 53 | 540 FOR J=Y-1 TO Y+1 54 | 550 IF A(I,J)=1 OR A(I,J)=2 THEN C=C+1 55 | 560 NEXT J 56 | 570 NEXT I 57 | 580 IF A(X,Y)=0 THEN 610 58 | 590 IF C<3 OR C>4 THEN A(X,Y)=2: GOTO 600 59 | 595 P=P+1 60 | 600 GOTO 620 61 | 610 IF C=3 THEN A(X,Y)=3:P=P+1 62 | 620 NEXT Y 63 | 630 NEXT X 64 | 635 X1=X1-1:Y1=Y1-1:X2=X2+1:Y2=Y2+1 65 | 640 GOTO 210 66 | 650 END 67 | -------------------------------------------------------------------------------- /code/disks/I/lifefortwo.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"LIFE2" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 7 DIM N(6,6),K(18),A(16),X(2),Y(2) 5 | 8 DATA 3,102,103,120,130,121,112,111,12 6 | 9 DATA 21,30,1020,1030,1011,1021,1003,1002,1012 7 | 10 FOR M=1 TO 18: READ K(M): NEXT M 8 | 13 DATA -1,0,1,0,0,-1,0,1,-1,-1,1,-1,-1,1,1,1 9 | 14 FOR O1= 1 TO 16: READ A(O1): NEXT O1 10 | 20 GOTO 500 11 | 50 FOR J=1 TO 5 12 | 51 FOR K=1 TO 5 13 | 55 IF N(J,K)>99 THEN GOSUB 200 14 | 60 NEXT K 15 | 65 NEXT J 16 | 90 K=0: M2=0: M3=0 17 | 99 FOR J=0 TO 6: PRINT 18 | 100 FOR K=0 TO 6 19 | 101 IF J<>0 THEN IF J<>6 THEN 105 20 | 102 IF K=6 THEN PRINT 0;: GOTO 125 21 | 103 PRINT K;: GOTO 120 22 | 105 IF K<>0 THEN IF K<>6 THEN 110 23 | 106 IF J=6 THEN PRINT 0: GOTO 126 24 | 107 PRINT J;: GOTO 120 25 | 110 GOSUB 300 26 | 120 NEXT K 27 | 125 NEXT J 28 | 126 RETURN 29 | 200 B=1: IF N(J,K)>999 THEN B=10 30 | 220 FOR O1= 1 TO 15 STEP 2 31 | 230 N(J+A(O1),K+A(O1+1))=N(J+A(O1),K+A(O1+1))+B 32 | 231 NEXT O1 33 | 239 RETURN 34 | 300 IF N(J,K)<3 THEN 399 35 | 305 FOR O1=1 TO 18 36 | 310 IF N(J,K)=K(O1) THEN 350 37 | 315 NEXT O1 38 | 320 GOTO 399 39 | 350 IF O1>9 THEN 360 40 | 351 N(J,K)=100: M2=M2+1: PRINT " * "; 41 | 355 RETURN 42 | 360 N(J,K)=1000: M3=M3+1: PRINT " # "; 43 | 365 RETURN 44 | 399 N(J,K)=0: PRINT " ";: RETURN 45 | 500 PRINT TAB(10);"U.B. LIFE GAME" 46 | 505 M2=0: M3=0 47 | 510 FOR J=1 TO 5 48 | 511 FOR K=1 TO 5 49 | 515 N(J,K)=0 50 | 516 NEXT K 51 | 517 NEXT J 52 | 519 FOR B=1 TO 2: P1=3: IF B=2 THEN P1=30 53 | 520 PRINT:PRINT "PLAYER";B;" - 3 LIVE PIECES." 54 | 535 FOR K1=1 TO 3: GOSUB 700 55 | 540 N(X(B),Y(B))=P1: NEXT K1 56 | 542 NEXT B 57 | 559 GOSUB 90 58 | 560 PRINT: GOSUB 50 59 | 570 IF M2=0 THEN IF M3=0 THEN 574 60 | 571 IF M3=0 THEN B=1: GOTO 575 61 | 572 IF M2=0 THEN B=2: GOTO 575 62 | 573 GOTO 580 63 | 574 PRINT: PRINT "A DRAW":GOTO 800 64 | 575 PRINT: PRINT "PLAYER";B;"IS THE WINNER":GOTO 800 65 | 580 FOR B=1 TO 2: PRINT: PRINT: PRINT "PLAYER";B;: GOSUB 700 66 | 581 IF B=99 THEN 560 67 | 582 NEXT B 68 | 586 N(X(1),Y(1))=100: N(X(2),Y(2))=1000 69 | 596 GOTO 560 70 | 700 PRINT "X,Y":PRINT"XXXXXX";CHR$(13);"$$$$$$";CHR$(13);"&&&&&&"; 71 | 701 PRINT CHR$(13);: INPUT Y(B),X(B) 72 | 705 IF X(B)<=5 THEN IF X(B)>0 THEN 708 73 | 706 GOTO 750 74 | 708 IF Y(B)<=5 THEN IF Y(B)>0 THEN 715 75 | 710 GOTO 750 76 | 715 IF N(X(B),Y(B))<>0 THEN 750 77 | 720 IF B=1 THEN RETURN 78 | 725 IF X(1)=X(2) THEN IF Y(1)=Y(2) THEN 740 79 | 730 RETURN 80 | 740 PRINT "SAME COORD. SET TO 0" 81 | 741 N(X(B)+1,Y(B)+1)=0: B=99: RETURN 82 | 750 PRINT "ILLEGAL COORDS. RETYPE": GOTO 700 83 | 999 END 84 | -------------------------------------------------------------------------------- /code/disks/I/litquiz.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(25);"LITERATURE QUIZ" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 5 R=0 5 | 10 PRINT "TEST YOUR KNOWLEDGE OF CHILDREN'S LITERATURE." 6 | 12 PRINT: PRINT "THIS IS A MULTIPLE-CHOICE QUIZ." 7 | 13 PRINT "TYPE A 1, 2, 3, OR 4 AFTER THE QUESTION MARK." 8 | 15 PRINT: PRINT "GOOD LUCK!": PRINT: PRINT 9 | 40 PRINT "IN PINOCCHIO, WHAT WAS THE NAME OF THE CAT" 10 | 42 PRINT "1)TIGGER, 2)CICERO, 3)FIGARO, 4)GUIPETTO"; 11 | 43 INPUT A: IF A=3 THEN 46 12 | 44 PRINT "SORRY...FIGARO WAS HIS NAME.": GOTO 50 13 | 46 PRINT "VERY GOOD! HERE'S ANOTHER." 14 | 47 R=R+1 15 | 50 PRINT: PRINT 16 | 51 PRINT "FROM WHOSE GARDEN DID BUGS BUNNY STEAL THE CARROTS?" 17 | 52 PRINT "1)MR. NIXON'S, 2)ELMER FUDD'S, 3)CLEM JUDD'S, 4)STROMBOLI'S"; 18 | 53 INPUT A: IF A=2 THEN 56 19 | 54 PRINT "TOO BAD...IT WAS ELMER FUDD'S GARDEN.": GOTO 60 20 | 56 PRINT "PRETTY GOOD!" 21 | 57 R=R+1 22 | 60 PRINT: PRINT 23 | 61 PRINT "IN THE WIZARD OF OS, DOROTHY'S DOG WAS NAMED" 24 | 62 PRINT "1)CICERO, 2)TRIXIA, 3)KING, 4)TOTO"; 25 | 63 INPUT A: IF A=4 THEN 66 26 | 64 PRINT "BACK TO THE BOOKS,...TOTO WAS HIS NAME.": GOTO 70 27 | 66 PRINT "YEA! YOU'RE A REAL LITERATURE GIANT." 28 | 67 R=R+1 29 | 70 PRINT:PRINT 30 | 71 PRINT "WHO WAS THE FAIR MAIDEN WHO ATE THE POISON APPLE" 31 | 72 PRINT "1)SLEEPING BEAUTY, 2)CINDERELLA, 3)SNOW WHITE, 4)WENDY"; 32 | 73 INPUT A: IF A=3 THEN 76 33 | 74 PRINT "OH, COME ON NOW...IT WAS SNOW WHITE." 34 | 75 GOTO 80 35 | 76 PRINT "GOOD MEMORY!" 36 | 77 R=R+1 37 | 80 PRINT:PRINT 38 | 85 IF R=4 THEN 100 39 | 90 IF R<2 THEN 200 40 | 92 PRINT "NOT BAD, BUT YOU MIGHT SPEND A LITTLE MORE TIME" 41 | 94 PRINT "READING THE NURSERY GREATS." 42 | 96 STOP 43 | 100 PRINT "WOW! THAT'S SUPER! YOU REALLY KNOW YOUR NURSERY" 44 | 110 PRINT "YOUR NEXT QUIZ WILL BE ON 2ND CENTURY CHINESE" 45 | 120 PRINT "LITERATURE (HA, HA, HA)" 46 | 130 STOP 47 | 200 PRINT "UGH. THAT WAS DEFINITELY NOT TOO SWIFT. BACK TO" 48 | 205 PRINT "NURSERY SCHOOL FOR YOU, MY FRIEND." 49 | 999 END 50 | -------------------------------------------------------------------------------- /code/disks/I/love.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"LOVE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 20 PRINT "A TRIBUTE TO THE GREAT AMERICAN ARTIST, ROBERT INDIANA." 5 | 30 PRINT "HIS GREATEST WORK WILL BE REPRODUCED WITH A MESSAGE OF" 6 | 40 PRINT "YOUR CHOICE UP TO 60 CHARACTERS. IF YOU CAN'T THINK OF" 7 | 50 PRINT "A MESSAGE, SIMPLE TYPE THE WORD 'LOVE'": PRINT 8 | 60 INPUT "YOUR MESSAGE, PLEASE";A$: L=LEN(A$) 9 | 70 DIM T$(120): FOR I=1 TO 10: PRINT: NEXT I 10 | 100 FOR J=0 TO INT(60/L) 11 | 110 FOR I=1 TO L 12 | 120 T$(J*L+I)=MID$(A$,I,1) 13 | 130 NEXT I: NEXT J 14 | 140 C=0 15 | 200 A1=1: P=1: C=C+1: IF C=37 THEN 999 16 | 205 PRINT 17 | 210 READ A: A1=A1+A: IF P=1 THEN 300 18 | 240 FOR I=1 TO A: PRINT " ";: NEXT I: P=1: GOTO 400 19 | 300 FOR I=A1-A TO A1-1: PRINT T$(I);: NEXT I: P=0 20 | 400 IF A1>60 THEN 200 21 | 410 GOTO 210 22 | 600 DATA 60,1,12,26,9,12,3,8,24,17,8,4,6,23,21,6,4,6,22,12,5,6,5 23 | 610 DATA 4,6,21,11,8,6,4,4,6,21,10,10,5,4,4,6,21,9,11,5,4 24 | 620 DATA 4,6,21,8,11,6,4,4,6,21,7,11,7,4,4,6,21,6,11,8,4 25 | 630 DATA 4,6,19,1,1,5,11,9,4,4,6,19,1,1,5,10,10,4,4,6,18,2,1,6,8,11,4 26 | 640 DATA 4,6,17,3,1,7,5,13,4,4,6,15,5,2,23,5,1,29,5,17,8 27 | 650 DATA 1,29,9,9,12,1,13,5,40,1,1,13,5,40,1,4,6,13,3,10,6,12,5,1 28 | 660 DATA 5,6,11,3,11,6,14,3,1,5,6,11,3,11,6,15,2,1 29 | 670 DATA 6,6,9,3,12,6,16,1,1,6,6,9,3,12,6,7,1,10 30 | 680 DATA 7,6,7,3,13,6,6,2,10,7,6,7,3,13,14,10,8,6,5,3,14,6,6,2,10 31 | 690 DATA 8,6,5,3,14,6,7,1,10,9,6,3,3,15,6,16,1,1 32 | 700 DATA 9,6,3,3,15,6,15,2,1,10,6,1,3,16,6,14,3,1,10,10,16,6,12,5,1 33 | 710 DATA 11,8,13,27,1,11,8,13,27,1,60 34 | 999 FOR I=1 TO 10: PRINT: NEXT I: END 35 | -------------------------------------------------------------------------------- /code/disks/I/lunar.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"LUNAR" 2 | 20 PRINT TAB(l5);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 25 PRINT:PRINT:PRINT 4 | 30 PRINT "THIS IS A COMPUTER SIMULATION OF AN APOLLO LUNAR" 5 | 40 PRINT "LANDING CAPSULE.": PRINT: PRINT 6 | 50 PRINT "THE ON-BOARD COMPUTER HAS FAILED (IT WAS MADE BY" 7 | 60 PRINT "XEROX) SO YOU HAVE TO LAND THE CAPSULE MANUALLY." 8 | 70 PRINT: PRINT "SET BURN RATE OF RETRO ROCKETS TO ANY VALUE BETWEEN" 9 | 80 PRINT "0 (FREE FALL) AND 200 (MAXIMUM BURN) POUNDS PER SECOND." 10 | 90 PRINT "SET NEW BURN RATE EVERY 10 SECONDS.": PRINT 11 | 100 PRINT "CAPSULE WEIGHT 32,500 LBS; FUEL WEIGHT 16,500 LBS." 12 | 110 PRINT: PRINT: PRINT: PRINT "GOOD LUCK" 13 | 120 L=0 14 | 130 PRINT: PRINT "SEC","MI + FT","MPH","LB FUEL","BURN RATE":PRINT 15 | 140 A=120:V=1:M=33000:N=16500:G=1E-03:Z=1.8 16 | 150 PRINT L,INT(A);INT(5280*(A-INT(A))),3600*V,M-N,:INPUT K:T=10 17 | 160 IF M-N<1E-03 THEN 240 18 | 170 IF T<1E-03 THEN 150 19 | 180 S=T: IF M>=N+S*K THEN 200 20 | 190 S=(M-N)/K 21 | 200 GOSUB 420: IF I<=O THEN 340 22 | 210 IF V<=0 THEN 230 23 | 220 IF J<0 THEN 370 24 | 230 GOSUB 330: GOTO 160 25 | 240 PRINT "FUEL OUT AT";L;"SECONDS":S=(-V+SQR(V*V+2*A*G))/G 26 | 250 V=V+G*S: L=L+S 27 | 260 W=3600*V: PRINT "ON MOON AT";L;"SECONDS - IMPACT VELOCITY";W;"MPH" 28 | 274 IF W<=1.2 THEN PRINT "PERFECT LANDING!": GOTO 440 29 | 280 IF W<=10 THEN PRINT "GOOD LANDING (COULD RE BETTER)":GOTO 440 30 | 282 IF W>60 THEN 300 31 | 284 PRINT "CRAFT DAMAGE... YOU'RE STRANDED HERE UNTIL A RESCUE" 32 | 286 PRINT "PARTY ARRIVES. HOPE YOU HAVE ENOUGH OXYGEN!" 33 | 288 GOTO 440 34 | 300 PRINT "SORRY THERE NERE NO SURVIVORS. YOU BLOW IT!" 35 | 310 PRINT "IN FACT, YOU BLASTED A NEW LUNAR CRATER";W*.227;"FEET DEEP!" 36 | 320 GOTO 440 37 | 330 L=L+S: T=T-S: M=M-S*K: A=I: V=J: RETURN 38 | 340 IF S<5E-03 THEN 260 39 | 350 D=V+SQR(V*V+2*A*(G-Z*K/M)):S=2*A/D 40 | 360 GOSUB 420: GOSUB 330: GOTO 340 41 | 370 W=(1-M*G/(Z*K))/2: S=M*V/(Z*K*(W+SQR(W*W+V/Z)))+.05:GOSUB 420 42 | 380 IF I<=0 THEN 340 43 | 390 GOSUB 330: IF J>0 THEN 160 44 | 400 IF V>0 THEN 370 45 | 410 GOTO 160 46 | 420 Q=S*K/M: J=V+G*S+Z*(-Q-Q*Q/2-Q^3/3-Q^4/4-Q^5/5) 47 | 430 I=A-G*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30):RETURN 48 | 440 PRINT:PRINT:PRINT:PRINT "TRY AGAIN??": GOTO 70 49 | -------------------------------------------------------------------------------- /code/disks/I/mathdice.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(31);"MATH DICE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 40 PRINT "THIS PROGRAM GENERATES SUCCESIVE PICTURES OF TWO DICE." 5 | 50 PRINT "WHEN TWO DICE AND AN EQUAL SIGN FOLLOWED BY A QUESTION" 6 | 60 PRINT "MARK HAVE BEEN PRINTED, TYPE YOUR ANSWER AND THE RETURN KEY." 7 | 70 PRINT "TO CONCLUDE THE LESSON, TYPE CONTROL-C AS YOUR ANSWER." 8 | 80 PRINT 9 | 90 PRINT 10 | 100 N=N+1 11 | 110 D=INT(6*RND(1)+1) 12 | 120 PRINT" ----- " 13 | 130 IF D=1 THEN 200 14 | 140 IF D=2 THEN 180 15 | 150 IF D=3 THEN 180 16 | 160 PRINT "I * * I" 17 | 170 GOTO 210 18 | 180 PRINT "I * I" 19 | 190 GOTO 210 20 | 200 PRINT "I I" 21 | 210 IF D=2 THEN 260 22 | 220 IF D=4 THEN 260 23 | 230 IF D=6 THEN 270 24 | 240 PRINT "I * I" 25 | 250 GOTO 280 26 | 260 PRINT "I I" 27 | 265 GOTO 280 28 | 270 PRINT "I * * I" 29 | 280 IF D=1 THEN 350 30 | 290 IF D=2 THEN 330 31 | 300 IF D=3 THEN 330 32 | 310 PRINT "I * * I" 33 | 320 GOTO 360 34 | 330 PRINT "I * I" 35 | 340 GOTO 360 36 | 350 PRINT "I I" 37 | 360 PRINT " ----- " 38 | 370 PRINT 39 | 375 IF N=2 THEN 500 40 | 380 PRINT " +" 41 | 381 PRINT 42 | 400 A=D 43 | 410 GOTO 100 44 | 500 T=D+A 45 | 510 PRINT " ="; 46 | 520 INPUT T1 47 | 530 IF T1=T THEN 590 48 | 540 PRINT "NO, COUNT THE SPOTS AND GIVE ANOTHER ANSWER." 49 | 541 PRINT " ="; 50 | 550 INPUT T2 51 | 560 IF T2=T THEN 590 52 | 570 PRINT "NO, THE ANSWER IS";T 53 | 580 GOTO 600 54 | 590 PRINT "RIGHT!" 55 | 600 PRINT 56 | 601 PRINT "THE DICE ROLL AGAIN..." 57 | 610 PRINT 58 | 615 N=0 59 | 620 GOTO 100 60 | 999 END 61 | -------------------------------------------------------------------------------- /code/disks/I/mugwump.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(33);"MUGWUMP" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 4 REM COURTESY PEOPLE'S COMPUTER COMPANY 5 | 10 DIM P(4,2) 6 | 20 PRINT "THE OBJECT OF THIS GAME IS TO FIND FOUR MUGWUMPS" 7 | 30 PRINT "HIDDEN ON A 10 BY 10 GRID. HOMEBASE IS POSITION 0,0." 8 | 40 PRINT "ANY GUESS YOU MAKE MUST BE TWO NUMBERS WITH EACH" 9 | 50 PRINT "NUMBER BETWEEN 0 AND 9, INCLUSIVE. FIRST NUMBER" 10 | 60 PRINT "IS DISTANCE TO RIGHT OF HOMEBASE AND SECOND NUMBER" 11 | 70 PRINT "IS DISTANCE ABOVE HOMEBASE." 12 | 80 PRINT 13 | 90 PRINT "YOU GET 10 TRIES. AFTER EACH TRY, I WILL TELL" 14 | 100 PRINT "YOU HOW FAR YOU ARE FROM EACH MUGWUMP." 15 | 110 PRINT 16 | 240 GOSUB 1000 17 | 250 T=0 18 | 260 T=T+1 19 | 270 PRINT 20 | 275 PRINT 21 | 290 PRINT "TURN NO.";T;"-- WHAT IS YOUR GUESS"; 22 | 300 INPUT M,N 23 | 310 FOR I=1 TO 4 24 | 320 IF P(I,1)=-1 THEN 400 25 | 330 IF P(I,1)<>M THEN 380 26 | 340 IF P(I,2)<>N THEN 380 27 | 350 P(I,1)=-1 28 | 360 PRINT "YOU HAVE FOUND MUGWUMP";I 29 | 370 GOTO 400 30 | 380 D=SQR((P(I,1)-M)^2+(P(I,2)-N)^2) 31 | 390 PRINT "YOU ARE";(INT(D*10))/10;"UNITS FROM MUGWUMP";I 32 | 400 NEXT I 33 | 410 FOR J=1 TO 4 34 | 420 IF P(J,1)<>-1 THEN 470 35 | 430 NEXT J 36 | 440 PRINT 37 | 450 PRINT "YOU GOT THEM ALL IN";T;"TURNS!" 38 | 460 GOTO 580 39 | 470 IF T<10 THEN 260 40 | 480 PRINT 41 | 490 PRINT "SORRY, THAT'S 10 TRIES. HERE IS WHERE THEY'RE HIDING:" 42 | 540 FOR I=1 TO 4 43 | 550 IF P(I,1)=-1 THEN 570 44 | 560 PRINT "MUGWUMP";I;"IS AT (";P(I,1);",";P(I,2);")" 45 | 570 NEXT I 46 | 580 PRINT 47 | 600 PRINT "THAT WAS FUN! LET'S PLAY AGAIN......." 48 | 610 PRINT "FOUR MORE MUGWUMPS ARE NOW IN HIDING." 49 | 630 GOTO 240 50 | 1000 FOR J=1 TO 2 51 | 1010 FOR I=1 TO 4 52 | 1020 P(I,J)=INT(10*RND(1)) 53 | 1030 NEXT I 54 | 1040 NEXT J 55 | 1050 RETURN 56 | 1099 END 57 | -------------------------------------------------------------------------------- /code/disks/I/name.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(34);"NAME" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT: PRINT: PRINT 4 | 5 DIM B$(40) 5 | 10 PRINT "HELLO.": PRINT "MY NAME IS CREATIVE COMPUTER." 6 | 20 PRINT "WHAT'S YOUR NAME (FIRST AND LAST";: INPUT A$: L=LEN(A$) 7 | 30 PRINT: PRINT "THANK YOU, "; 8 | 40 FOR I=1 TO L: B$(I)=MID$(A$,I,1): NEXT I 9 | 50 FOR I=L TO 1 STEP -1: PRINT B$(I);: NEXT I 10 | 60 PRINT ".": PRINT "OOPS! I GUESS I GOT IT BACKWARDS. A SMART" 11 | 70 PRINT "COMPUTER LIKE ME SHOULDN'T MAKE A MISTAKE LIKE THAT!": PRINT 12 | 80 PRINT "BUT I JUST NOTICED YOUR LETTERS ARE OUT OF ORDER." 13 | 90 PRINT "LET'S PUT THEM IN ORDER LIKE THIS: "; 14 | 100 FOR J=2 TO L: I=J-1: T$=B$(J) 15 | 110 IF T$>B$(I) THEN 130 16 | 120 B$(I+1)=B$(I): I=I-1: IF I>0 THEN 110 17 | 130 B$(I+1)=T$: NEXT J 18 | 140 FOR I=1 TO L: PRINT B$(I);: NEXT I: PRINT: PRINT 19 | 150 PRINT "DON'T YOU LIKE THAT BETTER";: INPUT D$ 20 | 160 IF D$="YES" THEN 180 21 | 170 PRINT: PRINT "I'M SORRY YOU DON'T LIKE IT THAT WAY.": GOTO 200 22 | 180 PRINT: PRINT "I KNEW YOU'D AGREE!!" 23 | 200 PRINT: PRINT "I REALLY ENJOYED MEETING YOU ";A$;"." 24 | 210 PRINT "HAVE A NICE DAY!" 25 | 999 END 26 | -------------------------------------------------------------------------------- /code/disks/I/nicomachus.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"NICOMA" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 10 PRINT "BOOMERANG PUZZLE FROM ARITHMETICA OF NICOMACHUS -- A.D. 90!" 5 | 20 PRINT 6 | 30 PRINT "PLEASE THINK OF A NUMBER BETWEEN 1 AND 100." 7 | 40 PRINT "YOUR NUMBER DIVIDED BY 3 HAS A REMAINDER OF"; 8 | 45 INPUT A 9 | 50 PRINT "YOUR NUMBER DIVIDED BY 5 HAS A REMAINDER OF"; 10 | 55 INPUT B 11 | 60 PRINT "YOUR NUMBER DIVIDED BY 7 HAS A REMAINDER OF"; 12 | 65 INPUT C 13 | 70 PRINT 14 | 80 PRINT "LET ME THINK A MOMENT..." 15 | 85 PRINT 16 | 90 FOR I=1 TO 1500: NEXT I 17 | 100 D=70*A+21*B+15*C 18 | 110 IF D<=105 THEN 140 19 | 120 D=D-105 20 | 130 GOTO 110 21 | 140 PRINT "YOUR NUMBER WAS";D;", RIGHT"; 22 | 160 INPUT A$ 23 | 165 PRINT 24 | 170 IF A$="YES" THEN 220 25 | 180 IF A$="NO" THEN 240 26 | 190 PRINT "EH? I DON'T UNDERSTAND '";A$;"' TRY 'YES' OR 'NO'." 27 | 200 GOTO 160 28 | 220 PRINT "HOW ABOUT THAT!!" 29 | 230 GOTO 250 30 | 240 PRINT "I FEEL YOUR ARITHMETIC IS IN ERROR." 31 | 250 PRINT 32 | 260 PRINT "LET'S TRY ANOTHER." 33 | 270 GOTO 20 34 | 999 END 35 | -------------------------------------------------------------------------------- /code/disks/I/number.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(33);"NUMBER" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 4 PRINT "YOU HAVE 100 POINTS. BY GUESSING NUMBERS FROM 1 TO 5, YOU" 5 | 5 PRINT "CAN GAIN OR LOSE POINTS DEPENDING UPON HOW CLOSE YOU GET TO" 6 | 6 PRINT "A RANDOM NUMBER SELECTED BY THE COMPUTER.": PRINT 7 | 7 PRINT "YOU OCCASIONALLY WILL GET A JACKPOT WHICH WILL DOUBLE(!)" 8 | 8 PRINT "YOUR POINT COUNT. YOU WIN WHEN YOU GET 500 POINTS." 9 | 9 PRINT: P=100 10 | 10 DEF FNR(X)=INT(5*RND(1)+1) 11 | 12 INPUT "GUESS A NUMBER FROM 1 TO 5";G 12 | 15 R=FNR(1) 13 | 16 S=FNR(1) 14 | 17 T=FNR(1) 15 | 18 U=FNR(1) 16 | 19 V=FNR(1) 17 | 20 IF G=R THEN 30 18 | 21 IF G=S THEN 40 19 | 22 IF G=T THEN 50 20 | 23 IF G=U THEN 60 21 | 24 IF G=V THEN 70 22 | 25 IF G>5 THEN 12 23 | 30 P=P-5 24 | 35 GOTO 80 25 | 40 P=P+5 26 | 45 GOTO 80 27 | 50 P=P+P 28 | 53 PRINT "YOU HIT THE JACKPOT!!!" 29 | 55 GOTO 80 30 | 60 P=P+1 31 | 65 GOTO 80 32 | 70 P=P-(P*.5) 33 | 80 IF P>500 THEN 90 34 | 82 PRINT "YOU HAVE";P;"POINTS.":PRINT 35 | 85 GOTO 12 36 | 90 PRINT "!!!!YOU WIN!!!! WITH ";P;"POINTS." 37 | 99 END 38 | -------------------------------------------------------------------------------- /code/disks/I/onecheck.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(30);"ONE CHECK" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 8 DIM A(64) 5 | 10 PRINT "SOLITAIRE CHECKER PUZZLE BY DAVID AHL" 6 | 15 PRINT 7 | 20 PRINT "48 CHECKERS ARE PLACED ON THE 2 OUTSIDE SPACES OF A" 8 | 25 PRINT "STANDARD 64-SQUARE CHECKERBOARD. THE OBJECT IS TO" 9 | 30 PRINT "REMOVE AS MANY CHECKERS AS POSSIBLE BY DIAGONAL JUMPS" 10 | 35 PRINT "(AS IN STANDARD CHECKERS). USE THE NUMBERED BOARD TO" 11 | 40 PRINT "INDICATE THE SQUARE YOU WISH TO JUMP FROM AND TO. ON" 12 | 45 PRINT "THE BOARD PRINTED OUT ON EACH TURN '1' INDICATES A" 13 | 50 PRINT "CHECKER AND '0' AN EMPTY SQUARE. WHEN YOU HAVE NO" 14 | 55 PRINT "POSSIBLE JUMPS REMAINING, INPUT A '0' IN RESPONSE TO" 15 | 60 PRINT "QUESTION 'JUMP FROM ?'" 16 | 62 PRINT 17 | 63 PRINT "HERE IS THE NUMERICAL BOARD:" 18 | 66 PRINT 19 | 70 FOR J=1 TO 57 STEP 8 20 | 74 PRINT J;TAB(4);J+1;TAB(8);J+2;TAB(12);J+3;TAB(16);J+4;TAB(20);J+5; 21 | 75 PRINT TAB(24);J+6;TAB(28);J+7 22 | 76 NEXT J 23 | 77 PRINT 24 | 78 PRINT "AND HERE IS THE OPENING POSITION OF THE CHECKERS." 25 | 79 PRINT 26 | 80 FOR J=1 TO 64 27 | 82 A(J)=1 28 | 84 NEXT J 29 | 86 FOR J=19 TO 43 STEP 8 30 | 88 FOR I=J TO J+3 31 | 90 A(I)=0 32 | 92 NEXT I 33 | 94 NEXT J 34 | 96 M=0 35 | 98 GOTO 340 36 | 100 INPUT "JUMP FROM";F 37 | 105 IF F=0 THEN 500 38 | 110 INPUT "TO";T 39 | 112 PRINT 40 | 118 REM *** CHECK LEGALITY OF MOVE 41 | 120 F1=INT((F-1)/8) 42 | 130 F2=F-8*F1 43 | 140 T1=INT((T-1)/8) 44 | 150 T2=T-8*T1 45 | 160 IF F1>7 THEN 230 46 | 170 IF T1>7 THEN 230 47 | 180 IF F2>8 THEN 230 48 | 190 IF T2>8 THEN 230 49 | 200 IF ABS(F1-T1)<>2 THEN 230 50 | 210 IF ABS(F2-T2)<>2 THEN 230 51 | 212 IF A((T+F)/2)=0 THEN 230 52 | 215 IF A(F)=0 THEN 230 53 | 220 IF A(T)=1 THEN 230 54 | 225 GOTO 250 55 | 230 PRINT "ILLEGAL MOVE. TRY AGAIN..." 56 | 240 GOTO 100 57 | 245 REM *** UPDATE BOARD 58 | 250 A(T)=1 59 | 260 A(F)=0 60 | 270 A((T+F)/2)=0 61 | 290 M=M+1 62 | 310 REM *** PRINT BOARD 63 | 340 FOR J=1 TO 57 STEP 8 64 | 350 FOR I=J TO J+7 65 | 360 PRINT A(I); 66 | 370 NEXT I 67 | 380 PRINT 68 | 390 NEXT J 69 | 400 PRINT 70 | 410 GOTO 100 71 | 490 REM *** END GAME SUMMARY 72 | 500 S=0 73 | 510 FOR I=1 TO 64 74 | 520 S=S+A(I) 75 | 530 NEXT I 76 | 540 PRINT:PRINT "YOU MADE";M;"JUMPS AND HAD";S;"PIECES" 77 | 550 PRINT "REMAINING ON THE BOARD." 78 | 560 PRINT 79 | 562 INPUT "TRY AGAIN";A$ 80 | 570 IF A$="YES" THEN 70 81 | 575 IF A$="NO" THEN 600 82 | 580 PRINT "PLEASE ANSWER 'YES' OR 'NO'." 83 | 590 GOTO 562 84 | 600 PRINT 85 | 610 PRINT "O.K. HOPE YOU HAD FUN!!" 86 | 999 END 87 | -------------------------------------------------------------------------------- /code/disks/I/pizza.bas: -------------------------------------------------------------------------------- 1 | 5 PRINT TAB(33);"PIZZA" 2 | 10 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 15 PRINT: PRINT: PRINT 4 | 20 DIM S$(16),M$(4) 5 | 30 PRINT "PIZZA DELIVERY GAME": PRINT 6 | 50 INPUT "WHAT IS YOUR FIRST NAME";N$: PRINT 7 | 80 PRINT "HI, ";N$;". IN THIS GAME YOU ARE TO TAKE ORDERS" 8 | 90 PRINT "FOR PIZZAS. THEN YOU ARE TO TELL A DELIVERY BOY" 9 | 100 PRINT "WHERE TO DELIVER THE ORDERED PIZZAS.": PRINT: PRINT 10 | 140 FOR I=1 TO 16 11 | 150 READ S$(I) 12 | 160 NEXT I 13 | 170 FOR I=1 TO 4 14 | 180 READ M$(I) 15 | 190 NEXT I 16 | 200 DATA "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O" 17 | 210 DATA "P","1","2","3","4" 18 | 230 PRINT "MAP OF THE CITY OF HYATTSVILLE": PRINT 19 | 250 PRINT " -----1-----2-----3-----4-----" 20 | 260 K=4 21 | 270 FOR I=1 TO 4 22 | 280 PRINT "-": PRINT "-": PRINT"-": PRINT "-" 23 | 320 PRINT M$(K); 24 | 330 S1=16-4*I+1 25 | 340 PRINT " ";S$(S1);" ";S$(S1+1);" ";S$(S1+2);" "; 26 | 350 PRINT S$(S1+3);" ";M$(K) 27 | 380 K=K-1 28 | 390 NEXT I 29 | 400 PRINT "-": PRINT "-": PRINT "-": PRINT "-" 30 | 440 PRINT " -----1-----2-----3-----4-----": PRINT 31 | 460 PRINT "THE OUTPUT IS A MAP OF THE HOMES WHERE" 32 | 470 PRINT "YOU ARE TO SEND PIZZAS.": PRINT 33 | 490 PRINT "YOUR JOB IS TO GIVE A TRUCK DRIVER" 34 | 500 PRINT "THE LOCATION OR COORDINATES OF THE" 35 | 510 PRINT "HOME ORDERING THE PIZZA.": PRINT 36 | 520 INPUT "DO YOU NEED MORE DIRECTIONS";A$ 37 | 530 IF A$="YES" THEN 590 38 | 540 IF A$="NO" THEN 750 39 | 550 PRINT "'YES' OR 'NO' PLEASE, NOW THEN,": GOTO 520 40 | 590 PRINT: PRINT "SOMEBODY WILL ASK FOR A PIZZA TO BE" 41 | 600 PRINT "DELIVERED. THEN A DELIVERY BOY WILL" 42 | 610 PRINT "ASK YOU FOR THE LOCATION.":PRINT " EXAMPLE:" 43 | 620 PRINT "THIS IS J. PLEASE SEND A PIZZA." 44 | 640 PRINT "DRIVER TO ";N$;". WHERE DOES J LIVE?" 45 | 650 PRINT "YOUR ANSWER WOULD BE 2,3": PRINT 46 | 660 INPUT "UNDERSTAND";A$ 47 | 670 IF A$="YES" THEN 690 48 | 680 PRINT "THIS JOB IS DEFINITELY TOO DIFFICULT FOR YOU. THANKS ANYWAY" 49 | 685 GOTO 999 50 | 690 PRINT "GOOD. YOU ARE NOW READY TO START TAKING ORDERS.": PRINT 51 | 700 PRINT "GOOD LUCK!!": PRINT 52 | 750 FOR I=1 TO 5 53 | 760 S=INT(RND(1)*16+1): PRINT 54 | 770 PRINT "HELLO ";N$;"'S PIZZA. THIS IS ";S$(S);"."; 55 | 775 PRINT " PLEASE SEND A PIZZA." 56 | 780 PRINT " DRIVER TO ";N$;": WHERE DOES ";S$(S);" LIVE"; 57 | 790 INPUT A(1),A(2) 58 | 870 T=A(1)+(A(2)-1)*4 59 | 880 IF T=S THEN 920 60 | 890 PRINT "THIS IS ";S$(T);". I DID NOT ORDER A PIZZA." 61 | 900 PRINT "I LIVE AT ";A(1);",";A(2) 62 | 910 GOTO 780 63 | 920 PRINT "HELLO "N$;". THIS IS ";S$(S);", THANKS FOR THE PIZZA." 64 | 930 NEXT I 65 | 940 PRINT: INPUT "DO YOU WANT TO DELIVER MORE PIZZAS";A$ 66 | 960 IF A$="YES" THEN 750 67 | 970 PRINT: PRINT "O.K. ";N$;", SEE YOU LATER!":PRINT 68 | 999 END 69 | -------------------------------------------------------------------------------- /code/disks/I/poetry.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(30);"POETRY" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 90 ON I GOTO 100,101,102,103,104 5 | 100 PRINT "MIDNIGHT DREARY";:GOTO 210 6 | 101 PRINT "FIERY EYES";:GOTO 210 7 | 102 PRINT "BIRD OR FIEND";:GOTO 210 8 | 103 PRINT "THING OF EVIL";:GOTO 210 9 | 104 PRINT "PROPHET";:GOTO 210 10 | 110 ON I GOTO 111,112,113,114,115 11 | 111 PRINT "BEGUILING ME";:U=2:GOTO 210 12 | 112 PRINT "THRILLED ME";:GOTO 210 13 | 113 PRINT "STILL SITTING....";:GOTO 212 14 | 114 PRINT "NEVER FLITTING";:U=2:GOTO 210 15 | 115 PRINT "BURNED";:GOTO 210 16 | 120 ON I GOTO 121,122,123,124,125 17 | 121 PRINT "AND MY SOUL";:GOTO 210 18 | 122 PRINT "DARKNESS THERE";:GOTO 210 19 | 123 PRINT "SHALL BE LIFTED";:GOTO 210 20 | 124 PRINT "QUOTH THE RAVEN";:GOTO 210 21 | 125 IF U=0 THEN 210 22 | 126 PRINT "SIGN OF PARTING";:GOTO 210 23 | 130 ON I GOTO 131,132,133,134,135 24 | 131 PRINT "NOTHING MORE";:GOTO 210 25 | 132 PRINT "YET AGAIN";:GOTO 210 26 | 133 PRINT "SLOWLY CREEPING";:GOTO 210 27 | 134 PRINT "...EVERMORE";:GOTO 210 28 | 135 PRINT "NEVERMORE"; 29 | 210 IF U=0 OR RND(1)>.19 THEN 212 30 | 211 PRINT ",";:U=2 31 | 212 IF RND(1)>.65 THEN 214 32 | 213 PRINT " ";:U=U+1:GOTO 215 33 | 214 PRINT : U=0 34 | 215 I=INT(INT(10*RND(1))/2)+1 35 | 220 J=J+1 : K=K+1 36 | 230 IF U>0 OR INT(J/2)<>J/2 THEN 240 37 | 235 PRINT " "; 38 | 240 ON J GOTO 90,110,120,130,250 39 | 250 J=0 : PRINT : IF K>20 THEN 270 40 | 260 GOTO 215 41 | 270 PRINT : U=0 : K=0 : GOTO 110 42 | 999 END 43 | -------------------------------------------------------------------------------- /code/disks/I/reverse.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(32);"REVERSE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 100 PRINT "REVERSE -- A GAME OF SKILL": PRINT 5 | 130 DIM A(20) 6 | 140 REM *** N=NUMBER OF NUMBERS 7 | 150 N=9 8 | 160 PRINT "DO YOU WANT THE RULES"; 9 | 170 INPUT A$ 10 | 180 IF A$="NO" THEN 210 11 | 190 GOSUB 710 12 | 200 REM *** MAKE A RANDOM LIST A(1) TO A(N) 13 | 210 A(1)=INT((N-1)*RND(1)+2) 14 | 220 FOR K=2 TO N 15 | 230 A(K)=INT(N*RND(1)+1) 16 | 240 FOR J=1 TO K-1 17 | 250 IF A(K)=A(J) THEN 230 18 | 260 NEXT J:NEXT K 19 | 280 REM *** PRINT ORIGINAL LIST AND START GAME 20 | 290 PRINT: PRINT "HERE WE GO ... THE LIST IS:" 21 | 310 T=0 22 | 320 GOSUB 610 23 | 330 PRINT "HOW MANY SHALL I REVERSE"; 24 | 340 INPUT R 25 | 350 IF R=0 THEN 520 26 | 360 IF R<=N THEN 390 27 | 370 PRINT "OOPS! TOO MANY! I CAN REVERSE AT MOST";N:GOTO 330 28 | 390 T=T+1 29 | 400 REM *** REVERSE R NUMBERS AND PRINT NEW LIST 30 | 410 FOR K=1 TO INT(R/2) 31 | 420 Z=A(K) 32 | 430 A(K)=A(R-K+1) 33 | 440 A(R-K+1)=Z 34 | 450 NEXT K 35 | 460 GOSUB 610 36 | 470 REM *** CHECK FOR A WIN 37 | 480 FOR K=1 TO N 38 | 490 IF A(K)<>K THEN 330 39 | 500 NEXT K 40 | 510 PRINT "YOU WON IT IN";T;"MOVES!!!":PRINT 41 | 520 PRINT 42 | 530 PRINT "TRY AGAIN (YES OR NO)"; 43 | 540 INPUT A$ 44 | 550 IF A$="YES" THEN 210 45 | 560 PRINT: PRINT "O.K. HOPE YOU HAD FUN!!":GOTO 999 46 | 600 REM *** SUBROUTINE TO PRINT LIST 47 | 610 PRINT:FOR K=1 TO N:PRINT A(K);:NEXT K 48 | 650 PRINT:PRINT:RETURN 49 | 700 REM *** SUBROUTINE TO PRINT THE RULES 50 | 710 PRINT:PRINT "THIS IS THE GAME OF 'REVERSE'. TO WIN, ALL YOU HAVE" 51 | 720 PRINT "TO DO IS ARRANGE A LIST OF NUMBERS (1 THROUGH";N;")" 52 | 730 PRINT "IN NUMERICAL ORDER FROM LEFT TO RIGHT. TO MOVE, YOU" 53 | 740 PRINT "TELL ME HOW MANY NUMBERS (COUNTING FROM THE LEFT) TO" 54 | 750 PRINT "REVERSE. FOR EXAMPLE, IF THE CURRENT LIST IS:" 55 | 760 PRINT:PRINT "2 3 4 5 1 6 7 8 9" 56 | 770 PRINT:PRINT "AND YOU REVERSE 4, THE RESULT WILL BE:" 57 | 780 PRINT:PRINT "5 4 3 2 1 6 7 8 9" 58 | 790 PRINT:PRINT "NOW IF YOU REVERSE 5, YOU WIN!" 59 | 800 PRINT:PRINT "1 2 3 4 5 6 7 8 9":PRINT 60 | 810 PRINT "NO DOUBT YOU WILL LIKE THIS GAME, BUT" 61 | 820 PRINT "IF YOU WANT TO QUIT, REVERSE 0 (ZERO).":PRINT: RETURN 62 | 999 END 63 | -------------------------------------------------------------------------------- /code/disks/I/rocket.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(30); "ROCKET" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 70 PRINT "LUNAR LANDING SIMULATION" 5 | 80 PRINT "----- ------- ----------": PRINT 6 | 100 INPUT "DO YOU WANT INSTRUCTIONS (YES OR NO)";A$ 7 | 110 IF A$="NO" THEN 390 8 | 160 PRINT 9 | 200 PRINT"YOU ARE LANDING ON THE MOON AND AND HAVE TAKEN OVER MANUAL" 10 | 210 PRINT"CONTROL 1000 FEET ABOVE A GOOD LANDING SPOT. YOU HAVE A DOWN-" 11 | 220 PRINT"WARD VELOCITY OF 50 FEET/SEC. 150 UNITS OF FUEL REMAIN." 12 | 225 PRINT 13 | 230 PRINT"HERE ARE THE RULES THAT GOVERN YOUR APOLLO SPACE-CRAFT:": PRINT 14 | 240 PRINT"(1) AFTER EACH SECOND THE HEIGHT, VELOCITY, AND REMAINING FUEL" 15 | 250 PRINT" WILL BE REPORTED VIA DIGBY YOUR ON-BOARD COMPUTER." 16 | 260 PRINT"(2) AFTER THE REPORT A '?' WILL APPEAR. ENTER THE NUMBER" 17 | 270 PRINT" OF UNITS OF FUEL YOU WISH TO BURN DURING THE NEXT" 18 | 280 PRINT" SECOND. EACH UNIT OF FUEL WILL SLOW YOUR DESCENT BY" 19 | 290 PRINT" 1 FOOT/SEC." 20 | 310 PRINT"(3) THE MAXIMUM THRUST OF YOUR ENGINE IS 30 FEET/SEC/SEC" 21 | 320 PRINT" OR 30 UNITS OF FUEL PER SECOND." 22 | 330 PRINT"(4) WHEN YOU CONTACT THE LUNAR SURFACE. YOUR DESCENT ENGINE" 23 | 340 PRINT" WILL AUTOMATICALLY SHUT DOWN AND YOU WILL BE GIVEN A" 24 | 350 PRINT" REPORT OF YOUR LANDING SPEED AND REMAINING FUEL." 25 | 360 PRINT"(5) IF YOU RUN OUT OF FUEL THE '?' WILL NO LONGER APPEAR" 26 | 370 PRINT" BUT YOUR SECOND BY SECOND REPORT WILL CONTINUE UNTIL" 27 | 380 PRINT" YOU CONTACT THE LUNAR SURFACE.":PRINT 28 | 390 PRINT"BEGINNING LANDING PROCEDURE..........":PRINT 29 | 400 PRINT"G O O D L U C K ! ! !" 30 | 420 PRINT:PRINT 31 | 430 PRINT"SEC FEET SPEED FUEL PLOT OF DISTANCE" 32 | 450 PRINT 33 | 455 T=0:H=1000:V=50:F=150 34 | 490 PRINT T;TAB(6);H;TAB(16);V;TAB(26);F;TAB(35);"I";TAB(H/15);"*" 35 | 500 INPUT B 36 | 510 IF B<0 THEN 650 37 | 520 IF B>30 THEN B=30 38 | 530 IF B>F THEN B=F 39 | 540 V1=V-B+5 40 | 560 F=F-B 41 | 570 H=H- .5*(V+V1) 42 | 580 IF H<=0 THEN 670 43 | 590 T=T+1 44 | 600 V=V1 45 | 610 IF F>0 THEN 490 46 | 615 IF B=0 THEN 640 47 | 620 PRINT"**** OUT OF FUEL ****" 48 | 640 PRINT T;TAB(4);H;TAB(12);V;TAB(20);F;TAB(29);"I";TAB(H/12+29);"*" 49 | 650 B=0 50 | 660 GOTO 540 51 | 670 PRINT"***** CONTACT *****" 52 | 680 H=H+ .5*(V1+V) 53 | 690 IF B=5 THEN 720 54 | 700 D=(-V+SQR(V*V+H*(10-2*B)))/(5-B) 55 | 710 GOTO 730 56 | 720 D=H/V 57 | 730 V1=V+(5-B)*D 58 | 760 PRINT"TOUCHDOWN AT";T+D;"SECONDS." 59 | 770 PRINT"LANDING VELOCITY=";V1;"FEET/SEC." 60 | 780 PRINT F;"UNITS OF FUEL REMAINING." 61 | 790 IF V1<>0 THEN 810 62 | 800 PRINT"CONGRATULATIONS! A PERFECT LANDING!!" 63 | 805 PRINT"YOUR LICENSE WILL BE RENEWED.......LATER." 64 | 810 IF ABS(V1)<2 THEN 840 65 | 820 PRINT"***** SORRY, BUT YOU BLEW IT!!!!" 66 | 830 PRINT"APPROPRIATE CONDOLENCES WILL BE SENT TO YOUR NEXT OF KIN." 67 | 840 PRINT:PRINT:PRINT 68 | 850 INPUT "ANOTHER MISSION";A$ 69 | 860 IF A$="YES" THEN 390 70 | 870 PRINT: PRINT "CONTROL OUT.": PRINT 71 | 999 END 72 | -------------------------------------------------------------------------------- /code/disks/I/rockscissors.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(21);"GAME OF ROCK, SCISSORS, PAPER" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 25 PRINT:PRINT:PRINT 4 | 30 INPUT "HOW MANY GAMES";Q 5 | 40 IF Q<11 THEN 60 6 | 50 PRINT "SORRY, BUT WE AREN'T ALLOWED TO PLAY THAT MANY.": GOTO 30 7 | 60 FOR G=1 TO Q 8 | 70 PRINT: PRINT "GAME NUMBER";G 9 | 80 X=INT(RND(1)*3+1) 10 | 90 PRINT "3=ROCK...2=SCISSORS...1=PAPER" 11 | 100 INPUT "1...2...3...WHAT'S YOUR CHOICE";K 12 | 110 IF (K-1)*(K-2)*(K-3)<>0 THEN PRINT "INVALID.": GOTO 90 13 | 120 PRINT "THIS IS MY CHOICE..." 14 | 130 ON X GOTO 140,150,160 15 | 140 PRINT "...PAPER": GOTO 170 16 | 150 PRINT "...SCISSORS": GOTO 170 17 | 160 PRINT "...ROCK" 18 | 170 IF X=K THEN 250 19 | 180 IF X>K THEN 230 20 | 190 IF X=1 THEN 210 21 | 200 PRINT "YOU WIN!!!":H=H+1: GOTO 260 22 | 210 IF K<>3 THEN 200 23 | 220 PRINT "WOW! I WIN!!!":C=C+1:GOTO 260 24 | 230 IF K<>1 OR X<>3 THEN 220 25 | 240 GOTO 200 26 | 250 PRINT "TIE GAME. NO WINNER." 27 | 260 NEXT G 28 | 270 PRINT: PRINT "HERE IS THE FINAL GAME SCORE:" 29 | 280 PRINT "I HAVE WON";C;"GAME(S)." 30 | 290 PRINT "YOU HAVE WON";H;"GAME(S)." 31 | 300 PRINT "AND";Q-(C+H);"GAME(S) ENDED IN A TIE." 32 | 310 PRINT: PRINT "THANKS FOR PLAYING!!" 33 | 320 END 34 | -------------------------------------------------------------------------------- /code/disks/I/russianroulette.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(28);"RUSSIAN ROULETTE" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 5 PRINT "THIS IS A GAME OF >>>>>>>>>>RUSSIAN ROULETTE." 5 | 10 PRINT:PRINT "HERE IS A REVOLVER." 6 | 20 PRINT "TYPE '1' TO SPIN CHAMBER AND PULL TRIGGER." 7 | 22 PRINT "TYPE '2' TO GIVE UP." 8 | 23 PRINT "GO"; 9 | 25 N=0 10 | 30 INPUT I 11 | 31 IF I<>2 THEN 35 12 | 32 PRINT " CHICKEN!!!!!" 13 | 33 GOTO 72 14 | 35 N=N+1 15 | 40 IF RND(1)>.833333 THEN 70 16 | 45 IF N>10 THEN 80 17 | 50 PRINT "- CLICK -" 18 | 60 PRINT: GOTO 30 19 | 70 PRINT " BANG!!!!! YOU'RE DEAD!" 20 | 71 PRINT "CONDOLENCES WILL BE SENT TO YOUR RELATIVES." 21 | 72 PRINT:PRINT:PRINT 22 | 75 PRINT "...NEXT VICTIM...":GOTO 20 23 | 80 PRINT "YOU WIN!!!!!" 24 | 85 PRINT "LET SOMEONE ELSE BLOW HIS BRAINS OUT." 25 | 90 GOTO 10 26 | 99 END 27 | -------------------------------------------------------------------------------- /code/disks/I/sinewave.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(30);"SINE WAVE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT: PRINT: PRINT: PRINT: PRINT 4 | 40 REMARKABLE PROGRAM BY DAVID AHL 5 | 50 B=0 6 | 100 REM START LONG LOOP 7 | 110 FOR T=0 TO 40 STEP .25 8 | 120 A=INT(26+25*SIN(T)) 9 | 130 PRINT TAB(A); 10 | 140 IF B=1 THEN 180 11 | 150 PRINT "CREATIVE" 12 | 160 B=1 13 | 170 GOTO 200 14 | 180 PRINT "COMPUTING" 15 | 190 B=0 16 | 200 NEXT T 17 | 999 END 18 | -------------------------------------------------------------------------------- /code/disks/I/slots.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(30);"SLOTS" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT: PRINT: PRINT 4 | 100 REM PRODUCED BY FRED MIRABELLE AND BOB HARPER ON JAN 29, 1973 5 | 110 REM IT SIMULATES THE SLOT MACHINE. 6 | 120 PRINT "YOU ARE IN THE H&M CASINO,IN FRONT OF ONE OF OUR" 7 | 130 PRINT "ONE-ARM BANDITS. BET FROM $1 TO $100." 8 | 140 PRINT "TO PULL THE ARM, PUNCH THE RETURN KEY AFTER MAKING YOUR BET." 9 | 150 LET P=0 10 | 160 PRINT: PRINT"YOUR BET"; 11 | 170 INPUT M 12 | 180 IF M>100 THEN 860 13 | 190 IF M<1 THEN 880 14 | 200 M=INT(M) 15 | 210 GOSUB 1270 16 | 220 PRINT 17 | 230 LET X=INT(6*RND(1)+1) 18 | 240 LET Y=INT(6*RND(1)+1) 19 | 250 LET Z=INT(6*RND(1)+1) 20 | 260 PRINT 21 | 270 IF X=1 THEN 910 22 | 280 IF X=2 THEN 930 23 | 290 IF X=3 THEN 950 24 | 300 IF X=4 THEN 970 25 | 310 IF X=5 THEN 990 26 | 320 IF X=6 THEN 1010 27 | 330 IF Y=1 THEN 1030 28 | 340 IF Y=2 THEN 1050 29 | 350 IF Y=3 THEN 1070 30 | 360 IF Y=4 THEN 1090 31 | 370 IF Y=5 THEN 1110 32 | 380 IF Y=6 THEN 1130 33 | 390 IF Z=1 THEN 1150 34 | 400 IF Z=2 THEN 1170 35 | 410 IF Z=3 THEN 1190 36 | 420 IF Z=4 THEN 1210 37 | 430 IF Z=5 THEN 1230 38 | 440 IF Z=6 THEN 1250 39 | 450 IF X=Y THEN 600 40 | 460 IF X=Z THEN 630 41 | 470 IF Y=Z THEN 650 42 | 480 PRINT 43 | 490 PRINT "YOU LOST." 44 | 500 LET P=P-M 45 | 510 PRINT "YOUR STANDINGS ARE $"P 46 | 520 PRINT "AGAIN"; 47 | 530 INPUT A$ 48 | 540 IF A$="Y" THEN 160 49 | 550 PRINT 50 | 560 IF P<0 THEN 670 51 | 570 IF P=0 THEN 690 52 | 580 IF P>0 THEN 710 53 | 590 GOTO 1350 54 | 600 IF Y=Z THEN 730 55 | 610 IF Y=1 THEN 820 56 | 620 GOTO 1341 57 | 630 IF Z=1 THEN 820 58 | 640 GOTO 470 59 | 650 IF Z=1 THEN 820 60 | 660 GOTO 1341 61 | 670 PRINT "PAY UP! PLEASE LEAVE YOUR MONEY ON THE TERMINAL." 62 | 680 GOTO 1350 63 | 690 PRINT"HEY, YOU BROKE EVEN." 64 | 700 GOTO 1350 65 | 710 PRINT "COLLECT YOUR WINNINGS FROM THE H&M CASHIER." 66 | 720 GOTO 1350 67 | 730 IF Z=1 THEN 780 68 | 740 PRINT: PRINT"**TOP DOLLAR**" 69 | 750 PRINT "YOU WON!" 70 | 760 P=(((10*M)+M)+P) 71 | 770 GOTO 510 72 | 780 PRINT:PRINT"***JACKPOT***" 73 | 790 PRINT "YOU WON!" 74 | 800 P=(((100*M)+M)+P) 75 | 810 GOTO 510 76 | 820 PRINT:PRINT"*DOUBLE BAR*" 77 | 830 PRINT"YOU WON!" 78 | 840 P=(((5*M)+M)+P) 79 | 850 GOTO 510 80 | 860 PRINT"HOUSE LIMITS ARE $100" 81 | 870 GOTO 160 82 | 880 PRINT"MINIMUM BET IS $1" 83 | 890 GOTO 160 84 | 900 GOTO 220 85 | 910 PRINT"BAR";:GOSUB 1310 86 | 920 GOTO 330 87 | 930 PRINT"BELL";:GOSUB 1310 88 | 940 GOTO 330 89 | 950 PRINT"ORANGE";:GOSUB 1310 90 | 960 GOTO 330 91 | 970 PRINT"LEMON";:GOSUB 1310 92 | 980 GOTO 330 93 | 990 PRINT"PLUM";:GOSUB 1310 94 | 1000 GOTO 330 95 | 1010 PRINT"CHERRY";:GOSUB 1310 96 | 1020 GOTO 330 97 | 1030 PRINT" BAR";:GOSUB 1310 98 | 1040 GOTO 390 99 | 1050 PRINT" BELL";:GOSUB 1310 100 | 1060 GOTO 390 101 | 1070 PRINT" ORANGE";:GOSUB 1310 102 | 1080 GOTO 390 103 | 1090 PRINT" LEMON";:GOSUB 1310 104 | 1100 GOTO 390 105 | 1110 PRINT" PLUM";:GOSUB 1310 106 | 1120 GOTO 390 107 | 1130 PRINT" CHERRY";:GOSUB 1310 108 | 1140 GOTO 390 109 | 1150 PRINT" BAR" 110 | 1160 GOTO 450 111 | 1170 PRINT" BELL" 112 | 1180 GOTO 450 113 | 1190 PRINT" ORANGE" 114 | 1200 GOTO 450 115 | 1210 PRINT" LEMON" 116 | 1220 GOTO 450 117 | 1230 PRINT" PLUM" 118 | 1240 GOTO 450 119 | 1250 PRINT" CHERRY" 120 | 1260 GOTO 450 121 | 1270 FOR Q4=1 TO 10 122 | 1280 PRINT CHR$(7); 123 | 1290 NEXT Q4 124 | 1300 RETURN 125 | 1310 FOR T8=1 TO 5 126 | 1320 PRINT CHR$(7); 127 | 1330 NEXT T8 128 | 1340 RETURN 129 | 1341 PRINT: PRINT "DOUBLE!!" 130 | 1342 PRINT"YOU WON!" 131 | 1343 P=(((2*M)+M)+P) 132 | 1344 GOTO 510 133 | 1350 STOP 134 | 9999 END 135 | -------------------------------------------------------------------------------- /code/disks/I/stars.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(34);"STARS" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 100 REM *** STARS - PEOPLE'S COMPUTER CENTER, MENLO PARK, CA 5 | 140 REM *** A IS LIMIT ON NUMBER, M IS NUMBER OF GUESSES 6 | 150 A=100:M=7 7 | 170 INPUT "DO YOU WANT INSTRUCTIONS";A$ 8 | 190 IF LEFT$(A$,1)="N" THEN 280 9 | 200 REM *** INSTRUCTIONS ON HOW TO PLAY 10 | 210 PRINT "I AM THINKING OF A WHOLE NUMBER FROM 1 TO";A 11 | 220 PRINT "TRY TO GUESS MY NUMBER. AFTER YOU GUESS, I" 12 | 230 PRINT "WILL TYPE ONE OR MORE STARS (*). THE MORE" 13 | 240 PRINT "STARS I TYPE, THE CLOSER YOU ARE TO MY NUMBER." 14 | 250 PRINT "ONE STAR (*) MEANS FAR AWAY, SEVEN STARS (*******)" 15 | 260 PRINT "MEANS REALLY CLOSE! YOU GET";M;"GUESSES." 16 | 270 REM *** COMPUTER THINKS OF A NUMBER 17 | 280 PRINT 18 | 290 PRINT 19 | 300 X=INT(A*RND(1)+1) 20 | 310 PRINT "OK, I AM THINKING OF A NUMBER, START GUESSING." 21 | 320 REM *** GUESSING BEGINS, HUMAN GETS M GUESSES 22 | 330 FOR K=1 TO M 23 | 340 PRINT 24 | 350 PRINT "YOUR GUESS"; 25 | 360 INPUT G 26 | 370 IF G=X THEN 600 27 | 380 D=ABS(G-X) 28 | 390 IF D>=64 THEN 510 29 | 400 IF D>=32 THEN 500 30 | 410 IF D>=16 THEN 490 31 | 420 IF D>=8 THEN 480 32 | 430 IF D>=4 THEN 470 33 | 440 IF D>=2 THEN 460 34 | 450 PRINT "*"; 35 | 460 PRINT "*"; 36 | 470 PRINT "*"; 37 | 480 PRINT "*"; 38 | 490 PRINT "*"; 39 | 500 PRINT "*"; 40 | 510 PRINT "*"; 41 | 520 PRINT 42 | 530 NEXT K 43 | 540 REM *** DID NOT GUESS IN M GUESSES 44 | 550 PRINT 45 | 560 PRINT "SORRY, THAT'S";M;"GUESSES. THE NUMBER WAS";X 46 | 580 GOTO 650 47 | 590 REM *** WE HAVE A WINNER 48 | 600 PRINT:FOR N=1 TO 79 49 | 610 PRINT "*"; 50 | 620 NEXT N 51 | 630 PRINT:PRINT 52 | 640 PRINT "YOU GOT IT IN";K;"GUESSES!!! LET'S PLAY AGAIN..." 53 | 650 GOTO 280 54 | 660 END 55 | -------------------------------------------------------------------------------- /code/disks/I/suite.bas: -------------------------------------------------------------------------------- 1 | if 1 then print "hi": print "lo" 2 | if 1 then print "this": print "that" else print "what ?" 3 | if 0 then print "help": print "yours" else print "mine" 4 | if 1 then print "blue" else print "yellow": print "orange" 5 | if 0 then print "brown" else print "fucia": print "azure" 6 | if 1 then print "bark": print "mark" else print "zark": print "flark" endif 7 | if 0 then print "whoops": print "whapps" else print "paps": print "maps" endif 8 | if 1 then 9 | 10 | print "this is 1" 11 | print "this is 2" 12 | 13 | endif 14 | 15 | if 1 then 16 | 17 | print "this is 3" 18 | print "this is 4" 19 | 20 | else 21 | 22 | print "this is 5" 23 | print "this is 6" 24 | 25 | endif 26 | 27 | if 0 then 28 | 29 | print "this is 7" 30 | print "this is 8" 31 | 32 | else 33 | 34 | print "this is 9" 35 | print "this is 10" 36 | 37 | endif 38 | 39 | if 1 then 40 | 41 | print "yes" 42 | if 3 then 43 | print "no" 44 | else 45 | print "why" 46 | endif 47 | 48 | else 49 | 50 | print "no no" 51 | if 0 then 52 | print "who" 53 | else 54 | print "what" 55 | endif 56 | 57 | endif 58 | 59 | if 1 then print "wild" else if 2 then print "bite" else print "camping" 60 | 61 | if 1 then print "carp": if 1 then print "bat": if 1 then 62 | 63 | print "steelhead" 64 | 65 | endif 66 | 67 | if 1 then print "adder" else 68 | 69 | print "whatchacallit" 70 | print "smack" 71 | 72 | endif 73 | 74 | if 0 then print "last" else 75 | 76 | print "yep" 77 | print "howsit" 78 | 79 | endif 80 | 81 | select 1 82 | 83 | case 1: print "one" 84 | case 2: print "two" 85 | case 3: print "three" 86 | other: print "something" 87 | 88 | endsel 89 | 90 | select 2 91 | 92 | case 1: print "one" 93 | case 2: print "two" 94 | case 3: print "three" 95 | other: print "something" 96 | 97 | endsel 98 | 99 | select 3 100 | 101 | case 1: print "one" 102 | case 2: print "two" 103 | case 3: print "three" 104 | other: print "something" 105 | 106 | endsel 107 | 108 | select 4 109 | 110 | case 1: print "one" 111 | case 2: print "two" 112 | case 3: print "three" 113 | other: print "something" 114 | 115 | endsel 116 | 117 | select 234 118 | 119 | case 1: print "one" 120 | case 2: print "two" 121 | case 3: print "three" 122 | other: print "something" 123 | 124 | endsel 125 | 126 | select 10 127 | 128 | case 1: print "one" 129 | case 2: print "two" 130 | case 3: print "three" 131 | 132 | endsel 133 | print "and after" 134 | 135 | select "fork" 136 | 137 | case "knife": print "its a knife" 138 | case "spoon": print "its a spoon" 139 | case "fork": print "its a fork" 140 | other: print "don't know what it is" 141 | 142 | endsel 143 | 144 | select 1.2 145 | 146 | case 1.1: print "point 1" 147 | case 1.2: print "point 2" 148 | case 1.3: print "point 3" 149 | 150 | endsel 151 | 152 | select 1: case 1: print "one": case 2: print "two": case 3: print "three" endsel 153 | 154 | -------------------------------------------------------------------------------- /code/disks/I/synonym.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"SYNONYM" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT: PRINT: PRINT 4 | 10 DIM R$(5),W$(10),L(30),R(30) 5 | 20 R$(1)="RIGHT": R$(2)="CORRECT": R$(3)="FINE": R$(4)="GOOD!" 6 | 30 R$(5)="CHECK" 7 | 70 C=0 8 | 90 PRINT "A SYNONYM OF A WORD MEANS ANOTHER WORD IN THE ENGLISH" 9 | 100 PRINT "LANGUAGE WHICH HAS THE SAME OR VERY NEARLY THE SAME"; 10 | 110 PRINT " MEANING." 11 | 130 PRINT "I CHOOSE A WORD -- YOU TYPE A SYNONYM." 12 | 140 PRINT "IF YOU CAN'T THINK OF A SYNONYM, TYPE THE WORD 'HELP'" 13 | 145 PRINT "AND I WILL TELL YOU A SYNONYM.": PRINT 14 | 150 RESTORE: C=C+1: READ N 15 | 160 IF C>N THEN 420 16 | 170 N1=INT(RND(1)*N+1) 17 | 174 IF R(N1)=1 THEN 170 18 | 176 R(N1)=1 19 | 180 FOR I=1 TO N1 20 | 190 READ N2 21 | 200 FOR J=1 TO N2 22 | 210 READ W$(J) 23 | 220 NEXT J 24 | 230 NEXT I 25 | 232 FOR J=1 TO N2: L(J)=J: NEXT J 26 | 235 L(0)=N2: G=1: PRINT 27 | 237 L(G)=L(L(0)): L(0)=N2-1: PRINT 28 | 240 PRINT " WHAT IS A SYNONYM OF ";W$(G);: INPUT A$ 29 | 250 IF A$="HELP" THEN 340 30 | 260 FOR K=1 TO N2 31 | 270 IF G=K THEN 290 32 | 280 IF A$=W$(K) THEN 320 33 | 290 NEXT K 34 | 300 PRINT " TRY AGAIN.": GOTO 240 35 | 320 PRINT R$(INT(RND(1)*5+1)): GOTO 150 36 | 340 G1=INT(RND(1)*L(0)+1) 37 | 360 PRINT "**** A SYNONYM OF ";W$(G);" IS ";W$(L(G1));".": PRINT 38 | 370 L(G1)=L(L(0)): L(0)=L(0)-1: GOTO 240 39 | 420 PRINT: PRINT "SYNONYM DRILL COMPLETED.": GOTO 999 40 | 500 DATA 10 41 | 510 DATA 5,"FIRST","START","BEGINNING","ONSET","INITIAL" 42 | 520 DATA 5,"SIMILAR","ALIKE","SAME","LIKE","RESEMBLING" 43 | 530 DATA 5,"MODEL","PATTERN","PROTOTYPE","STANDARD","CRITERION" 44 | 540 DATA 5,"SMALL","INSIGNIFICANT","LITTLE","TINY","MINUTE" 45 | 550 DATA 6,"STOP","HALT","STAY","ARREST","CHECK","STANDSTILL" 46 | 560 DATA 6,"HOUSE","DWELLING","RESIDENCE","DOMICILE","LODGING" 47 | 565 DATA "HABITATION" 48 | 570 DATA 7,"PIT","HOLE","HOLLOW","WELL","GULF","CHASM","ABYSS" 49 | 580 DATA 7,"PUSH","SHOVE","THRUST","PROD","POKE","BUTT","PRESS" 50 | 590 DATA 6,"RED","ROUGE","SCARLET","CRIMSON","FLAME","RUBY" 51 | 600 DATA 7,"PAIN","SUFFERING","HURT","MISERY","DISTRESS","ACHE" 52 | 605 DATA "DISCOMFORT" 53 | 999 END 54 | -------------------------------------------------------------------------------- /code/disks/I/target.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(33);"TARGET" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT: PRINT: PRINT 4 | 100 R=1: R1=57.296: P=3.14159 5 | 110 PRINT "YOU ARE THE WEAPONS OFFICER ON THE STARSHIP ENTERPRISE" 6 | 120 PRINT "AND THIS IS A TEST TO SEE HOW ACCURATE A SHOT YOU" 7 | 130 PRINT "ARE IN A THREE-DIMENSIONAL RANGE. YOU WILL BE TOLD" 8 | 140 PRINT "THE RADIAN OFFSET FOR THE X AND Z AXES, THE LOCATION" 9 | 150 PRINT "OF THE TARGET IN THREE DIMENSIONAL RECTANGULAR COORDINATES," 10 | 160 PRINT "THE APPROXIMATE NUMBER OF DEGREES FROM THE X AND Z" 11 | 170 PRINT "AXES, AND THE APPROXIMATE DISTANCE TO THE TARGET." 12 | 180 PRINT "YOU WILL THEN PROCEEED TO SHOOT AT THE TARGET UNTIL IT IS" 13 | 190 PRINT "DESTROYED!": PRINT: PRINT "GOOD LUCK!!":PRINT: PRINT 14 | 220 A=RND(1)*2*P: B=RND(1)*2*P: Q=INT(A*R1): W=INT(B*R1) 15 | 260 PRINT "RADIANS FROM X AXIS =";A;" FROM Z AXIS =";B 16 | 280 P1=100000*RND(1)+RND(1): X=SIN(B)*COS(A)*P1: Y=SIN(B)*SIN(A)*P1 17 | 290 Z=COS(B)*P1 18 | 340 PRINT "TARGET SIGHTED: APPROXIMATE COORDINATES: X=";X;" Y=";Y;" Z=";Z 19 | 345 R=R+1: IF R>5 THEN 390 20 | 350 ON R GOTO 355,360,365,370,375 21 | 355 P3=INT(P1*.05)*20: GOTO 390 22 | 360 P3=INT(P1*.1)*10: GOTO 390 23 | 365 P3=INT(P1*.5)*2: GOTO 390 24 | 370 P3=INT(P1): GOTO 390 25 | 375 P3=P1 26 | 390 PRINT " ESTIMATED DISTANCE:";P3 27 | 400 PRINT:PRINT "INPUT ANGLE DEVIATION FROM X, DEVIATION FROM Z, DISTANCE"; 28 | 405 INPUT A1,B1,P2 29 | 410 PRINT: IF P2<20 THEN PRINT "YOU BLEW YOURSELF UP!!": GOTO 580 30 | 420 A1=A1/R1: B1=B1/R1: PRINT "RADIANS FROM X AXIS =";A1;" "; 31 | 425 PRINT "FROM Z AXIS =";B1 32 | 480 X1=P2*SIN(B1)*COS(A1): Y1=P2*SIN(B1)*SIN(A1): Z1=P2*COS(B1) 33 | 510 D=((X1-X)^2+(Y1-Y)^2+(Z1-Z)^2)^(1/2) 34 | 520 IF D>20 THEN 670 35 | 530 PRINT: PRINT " * * * HIT * * * TARGET IS NON-FUNCTIONAL": PRINT 36 | 550 PRINT "DISTANCE OF EXPLOSION FROM TARGET WAS";D;"KILOMETERS." 37 | 570 PRINT: PRINT "MISSION ACCOMPLISHED IN ";R;" SHOTS." 38 | 580 R=0: FOR I=1 TO 5: PRINT: NEXT I: PRINT "NEXT TARGET...": PRINT 39 | 590 GOTO 220 40 | 670 X2=X1-X: Y2=Y1-Y: Z2=Z1-Z: IF X2<0 THEN 730 41 | 710 PRINT "SHOT IN FRONT OF TARGET";X2;"KILOMETERS.": GOTO 740 42 | 730 PRINT "SHOT BEHIND TARGET";-X2;"KILOMETERS." 43 | 740 IF Y2<0 THEN 770 44 | 750 PRINT "SHOT TO LEFT OF TARGET";Y2;"KILOMETERS.": GOTO 780 45 | 770 PRINT "SHOT TO RIGHT OF TARGET";-Y2;"KILOMETERS." 46 | 780 IF Z2<0 THEN 810 47 | 790 PRINT "SHOT ABOVE TARGET";Z2;"KILOMETERS.": GOTO 820 48 | 810 PRINT "SHOT BELOW TARGET";-Z2;"KILOMETERS." 49 | 820 PRINT "APPROX POSITION OF EXPLOSION: X=";X1;" Y=";Y1;" Z=";Z1 50 | 830 PRINT " DISTANCE FROM TARGET =";D: PRINT: PRINT: PRINT: GOTO 345 51 | 999 END 52 | -------------------------------------------------------------------------------- /code/disks/I/tictact1.bas: -------------------------------------------------------------------------------- 1 | 10 PRINT TAB(30);"TIC TAC TOE" 2 | 20 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 30 PRINT:PRINT:PRINT 4 | 50 REM 5 | 100 REM THIS PROGRAM PLAYS TIC TAC TOE 6 | 110 REM THE MACHINE GOES FIRST 7 | 120 PRINT "THE GAME BOARD IS NUMBERED:": PRINT 8 | 130 PRINT "1 2 3": PRINT "8 9 4": PRINT "7 6 5" 9 | 140 PRINT 10 | 150 REM 11 | 160 REM 12 | 170 REM 13 | 180 DEF FNM(X)=X-8*INT((X-1)/8) 14 | 190 REM 15 | 200 REM MAIN PROGRAM 16 | 210 PRINT 17 | 220 PRINT 18 | 230 A=9 19 | 240 M=A 20 | 250 GOSUB 650 21 | 260 P=M 22 | 270 B=FNM(P+1) 23 | 280 M=B 24 | 290 GOSUB 650 25 | 300 Q=M 26 | 310 IF Q=FNM(B+4) THEN 360 27 | 320 C=FNM(B+4) 28 | 330 M=C 29 | 340 GOSUB 700 30 | 350 GOTO 730 31 | 360 C=FNM(B+2) 32 | 370 M=C 33 | 380 GOSUB 650 34 | 390 R=M 35 | 400 IF R=FNM(C+4) THEN 450 36 | 410 D=FNM(C+4) 37 | 420 M=D 38 | 430 GOSUB 700 39 | 440 GOTO 730 40 | 450 IF P/2<>INT(P/2) THEN 500 41 | 460 D=FNM(C+7) 42 | 470 M=D 43 | 480 GOSUB 700 44 | 490 GOTO 730 45 | 500 D=FNM(C+3) 46 | 510 M=D 47 | 520 GOSUB 650 48 | 530 S=M 49 | 540 IF S=FNM(D+4) THEN 590 50 | 550 E=FNM(D+4) 51 | 560 M=E 52 | 570 GOSUB 700 53 | 580 REM 54 | 590 E=FNM(D+6) 55 | 600 M=E 56 | 610 GOSUB 700 57 | 620 PRINT "THE GAME IS A DRAW." 58 | 630 GOTO 210 59 | 640 REM 60 | 650 GOSUB 700 61 | 660 PRINT "YOUR MOVE"; 62 | 670 INPUT M 63 | 680 RETURN 64 | 700 PRINT "COMPUTER MOVES";M 65 | 710 RETURN 66 | 720 REM 67 | 730 PRINT "AND WINS ********" 68 | 740 GOTO 210 69 | 750 END 70 | -------------------------------------------------------------------------------- /code/disks/I/tictact2.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(30);"TIC-TAC-TOE" 2 | 4 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 6 PRINT:PRINT:PRINT 4 | 8 PRINT "THE BOARD IS NUMBERED:" 5 | 10 PRINT " 1 2 3" 6 | 12 PRINT " 4 5 6" 7 | 14 PRINT " 7 8 9" 8 | 16 PRINT:PRINT:PRINT 9 | 20 DIM S(9) 10 | 50 INPUT"DO YOU WANT 'X' OR 'O'";C$ 11 | 55 IF C$="X"THEN 475 12 | 60 P$="O":Q$="X" 13 | 100 G=-1:H=1:IF S(5)<>0 THEN 103 14 | 102 S(5)=-1:GOTO 195 15 | 103 IF S(5)<>1 THEN 106 16 | 104 IF S(1)<>0 THEN 110 17 | 105 S(1)=-1:GOTO 195 18 | 106 IF S(2)=1 AND S(1)=0 THEN 181 19 | 107 IF S(4)=1 AND S(1)=0 THEN 181 20 | 108 IF S(6)=1 AND S(9)=0 THEN 189 21 | 109 IF S(8)=1 AND S(9)=0 THEN 189 22 | 110 IF G=1 THEN 112 23 | 111 GOTO 118 24 | 112 J=3*INT((M-1)/3)+1 25 | 113 IF 3*INT((M-1)/3)+1=M THEN K=1 26 | 114 IF 3*INT((M-1)/3)+2=M THEN K=2 27 | 115 IF 3*INT((M-1)/3)+3=M THEN K=3 28 | 116 GOTO 120 29 | 118 FOR J=1 TO 7 STEP 3:FOR K=1 TO 3 30 | 120 IF S(J)<>G THEN 130 31 | 122 IF S(J+2)<>G THEN 135 32 | 126 IF S(J+1)<>0 THEN 150 33 | 128 S(J+1)=-1:GOTO 195 34 | 130 IF S(J)=H THEN 150 35 | 131 IF S(J+2)<>G THEN 150 36 | 132 IF S(J+1)<>G THEN 150 37 | 133 S(J)=-1:GOTO 195 38 | 135 IF S(J+2)<>0 THEN 150 39 | 136 IF S(J+1)<>G THEN 150 40 | 138 S(J+2)=-1:GOTO 195 41 | 150 IF S(K)<>G THEN 160 42 | 152 IF S(K+6)<>G THEN 165 43 | 156 IF S(K+3)<>0 THEN 170 44 | 158 S(K+3)=-1:GOTO 195 45 | 160 IF S(K)=H THEN 170 46 | 161 IF S(K+6)<>G THEN 170 47 | 162 IF S(K+3)<>G THEN 170 48 | 163 S(K)=-1:GOTO 195 49 | 165 IF S(K+6)<>0 THEN 170 50 | 166 IF S(K+3)<>G THEN 170 51 | 168 S(K+6)=-1:GOTO 195 52 | 170 GOTO 450 53 | 171 IF S(3)=G AND S(7)=0 THEN 187 54 | 172 IF S(9)=G AND S(1)=0 THEN 181 55 | 173 IF S(7)=G AND S(3)=0 THEN 183 56 | 174 IF S(9)=0 AND S(1)=G THEN 189 57 | 175 IF G=-1 THEN G=1:H=-1:GOTO 110 58 | 176 IF S(9)=1 AND S(3)=0 THEN 182 59 | 177 FOR I=2 TO 9:IF S(I)<>0 THEN 179 60 | 178 S(I)=-1:GOTO 195 61 | 179 NEXT I 62 | 181 S(1)=-1:GOTO 195 63 | 182 IF S(1)=1 THEN 177 64 | 183 S(3)=-1:GOTO 195 65 | 187 S(7)=-1:GOTO 195 66 | 189 S(9)=-1 67 | 195 PRINT:PRINT"THE COMPUTER MOVES TO..." 68 | 202 GOSUB 1000 69 | 205 GOTO 500 70 | 450 IF G=1 THEN 465 71 | 455 IF J=7 AND K=3 THEN 465 72 | 460 NEXT K,J 73 | 465 IF S(5)=G THEN 171 74 | 467 GOTO 175 75 | 475 P$="X":Q$="O" 76 | 500 PRINT:INPUT"WHERE DO YOU MOVE";M 77 | 502 IF M=0 THEN PRINT"THANKS FOR THE GAME.":GOTO 2000 78 | 503 IF M>9 THEN 506 79 | 505 IF S(M)=0 THEN 510 80 | 506 PRINT"THAT SQUARE IS OCCUPIED.":PRINT:PRINT:GOTO 500 81 | 510 G=1:S(M)=1 82 | 520 GOSUB 1000 83 | 530 GOTO 100 84 | 1000 PRINT:FOR I=1 TO 9:PRINT" ";:IF S(I)<>-1 THEN 1014 85 | 1012 PRINT Q$" ";:GOTO 1020 86 | 1014 IF S(I)<>0 THEN 1018 87 | 1016 PRINT" ";:GOTO 1020 88 | 1018 PRINT P$" "; 89 | 1020 IF I<>3 AND I<>6 THEN 1050 90 | 1030 PRINT:PRINT"---+---+---" 91 | 1040 GOTO 1080 92 | 1050 IF I=9 THEN 1080 93 | 1060 PRINT"!"; 94 | 1080 NEXT I:PRINT:PRINT:PRINT 95 | 1095 FOR I=1 TO 7 STEP 3 96 | 1100 IF S(I)<>S(I+1)THEN 1115 97 | 1105 IF S(I)<>S(I+2)THEN 1115 98 | 1110 IF S(I)=-1 THEN 1350 99 | 1112 IF S(I)=1 THEN 1200 100 | 1115 NEXT I:FOR I=1 TO 3:IF S(I)<>S(I+3)THEN 1150 101 | 1130 IF S(I)<>S(I+6)THEN 1150 102 | 1135 IF S(I)=-1 THEN 1350 103 | 1137 IF S(I)=1 THEN 1200 104 | 1150 NEXT I:FOR I=1 TO 9:IF S(I)=0 THEN 1155 105 | 1152 NEXT I:GOTO 1400 106 | 1155 IF S(5)<>G THEN 1170 107 | 1160 IF S(1)=G AND S(9)=G THEN 1180 108 | 1165 IF S(3)=G AND S(7)=G THEN 1180 109 | 1170 RETURN 110 | 1180 IF G=-1 THEN 1350 111 | 1200 PRINT"YOU BEAT ME!! GOOD GAME.":GOTO 2000 112 | 1350 PRINT"I WIN, TURKEY!!!":GOTO 2000 113 | 1400 PRINT"IT'S A DRAW. THANK YOU." 114 | 2000 END 115 | -------------------------------------------------------------------------------- /code/disks/I/train.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(33);"TRAIN" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT: PRINT: PRINT 4 | 4 PRINT "TIME - SPEED DISTANCE EXERCISE": PRINT 5 | 10 C=INT(25*RND(1))+40 6 | 15 D=INT(15*RND(1))+5 7 | 20 T=INT(19*RND(1))+20 8 | 25 PRINT " A CAR TRAVELING";C;"MPH CAN MAKE A CERTAIN TRIP IN" 9 | 30 PRINT D;"HOURS LESS THAN A TRAIN TRAVELING AT";T;"MPH." 10 | 35 PRINT "HOW LONG DOES THE TRIP TAKE BY CAR"; 11 | 40 INPUT A 12 | 45 V=D*T/(C-T) 13 | 50 E=INT(ABS((V-A)*100/A)+.5) 14 | 55 IF E>5 THEN 70 15 | 60 PRINT "GOOD! ANSWER WITHIN";E;"PERCENT." 16 | 65 GOTO 80 17 | 70 PRINT "SORRY. YOU WERE OFF BY";E;"PERCENT." 18 | 80 PRINT "CORRECT ANSWER IS";V;"HOURS." 19 | 90 PRINT 20 | 95 PRINT "ANOTHER PROBLEM (YES OR NO)"; 21 | 100 INPUT A$ 22 | 105 PRINT 23 | 110 IF A$="YES" THEN 10 24 | 999 END 25 | -------------------------------------------------------------------------------- /code/disks/I/trap.bas: -------------------------------------------------------------------------------- 1 | 1 PRINT TAB(34);"TRAP" 2 | 2 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 3 PRINT:PRINT:PRINT 4 | 10 G=6 5 | 20 N=100 6 | 30 REM-TRAP 7 | 40 REM-STEVE ULLMAN, 8-1-72 8 | 50 PRINT "INSTRUCTIONS"; 9 | 60 INPUT Z$ 10 | 70 IF LEFT$(Z$,1)<>"Y" THEN 180 11 | 80 PRINT "I AM THINKING OF A NUMBER BETWEEN 1 AND";N 12 | 90 PRINT "TRY TO GUESS MY NUMBER. ON EACH GUESS," 13 | 100 PRINT "YOU ARE TO ENTER 2 NUMBERS, TRYING TO TRAP" 14 | 110 PRINT "MY NUMBER BETWEEN THE TWO NUMBERS. I WILL" 15 | 120 PRINT "TELL YOU IF YOU HAVE TRAPPED MY NUMBER, IF MY" 16 | 130 PRINT "NUMBER IS LARGER THAN YOUR TWO NUMBERS, OR IF" 17 | 140 PRINT "MY NUMBER IS SMALLER THAN YOUR TWO NUMBERS." 18 | 150 PRINT "IF YOU WANT TO GUESS ONE SINGLE NUMBER, TYPE" 19 | 160 PRINT "YOUR GUESS FOR BOTH YOUR TRAP NUMBERS." 20 | 170 PRINT "YOU GET";G;"GUESSES TO GET MY NUMBER." 21 | 180 X=INT(N*RND(1))+1 22 | 190 FOR Q=1 TO G 23 | 200 PRINT 24 | 210 PRINT "GUESS #";Q; 25 | 220 INPUT A,B 26 | 230 IF A=B AND X=A THEN 400 27 | 240 IF A <= B THEN 260 28 | 250 GOSUB 360 29 | 260 IF A <= X AND X <= B THEN 320 30 | 270 IF XL(J) THEN 340 27 | 320 REM 28 | 330 GOTO 290 29 | 340 NEXT K 30 | 350 NEXT J 31 | 360 P=P+1 32 | 370 M1=L(P) 33 | 380 P=P+1 34 | 390 M2=L(P) 35 | 400 PRINT 36 | 420 PRINT "YOU: ";A$(M1),"COMPUTER: ";A$(M2) 37 | 430 N1=INT((M1-.5)/4) 38 | 440 N2=INT((M2-.5)/4) 39 | 450 IF N1>=N2 THEN 490 40 | 460 A1=A1+1 41 | 470 PRINT "THE COMPUTER WINS!!! YOU HAVE";B1;"AND THE COMPUTER HAS";A1 42 | 480 GOTO 540 43 | 490 IF N1=N2 THEN 530 44 | 500 B1=B1+1 45 | 510 PRINT "YOU WIN. YOU HAVE";B1;"AND THE COMPUTER HAS";A1 46 | 520 GOTO 540 47 | 530 PRINT "TIE. NO SCORE CHANGE." 48 | 540 IF L(P+1)=0 THEN 610 49 | 550 PRINT "DO YOU WANT TO CONTINUE"; 50 | 560 INPUT V$ 51 | 570 IF V$="YES" THEN 360 52 | 580 IF V$="NO" THEN 650 53 | 590 PRINT "YES OR NO, PLEASE. "; 54 | 600 GOTO 540 55 | 610 PRINT 56 | 620 PRINT 57 | 630 PRINT "WE HAVE RUN OUT OF CARDS. FINAL SCORE: YOU: ";B1; 58 | 640 PRINT " THE COMPUTER: ";A1:PRINT 59 | 650 PRINT "THANKS FOR PLAYING. IT WAS FUN." 60 | 655 PRINT 61 | 660 DATA "S-2","H-2","C-2","D-2","S-3","H-3","C-3","D-3" 62 | 670 DATA "S-4","H-4","C-4","D-4","S-5","H-5","C-5","D-5" 63 | 680 DATA "S-6","H-6","C-6","D-6","S-7","H-7","C-7","D-7" 64 | 690 DATA "S-8","H-8","C-8","D-8","S-9","H-9","C-9","D-9" 65 | 700 DATA "S-10","H-10","C-10","D-10","S-J","H-J","C-J","D-J" 66 | 710 DATA "S-Q","H-Q","C-Q","D-Q","S-K","H-K","C-K","D-K" 67 | 720 DATA "S-A","H-A","C-A","D-A" 68 | 999 END 69 | -------------------------------------------------------------------------------- /code/disks/I/word.bas: -------------------------------------------------------------------------------- 1 | 2 PRINT TAB(33);"WORD" 2 | 3 PRINT TAB(15);"CREATIVE COMPUTING MORRISTOWN, NEW JERSEY" 3 | 4 PRINT: PRINT: PRINT 4 | 5 DIM S(7),A(7),L(7),D(7),P(7) 5 | 10 PRINT "I AM THINKING OF A WORD -- YOU GUESS IT. I WILL GIVE YOU" 6 | 15 PRINT "CLUES TO HELP YOU GET IT. GOOD LUCK!!": PRINT: PRINT 7 | 20 REM 8 | 30 PRINT: PRINT: PRINT "YOU ARE STARTING A NEW GAME..." 9 | 35 RESTORE 10 | 40 READ N 11 | 50 C=INT(RND(1)*N+1) 12 | 60 FOR I=1 TO C 13 | 70 READ S$ 14 | 80 NEXT I 15 | 90 G=0 16 | 95 S(0)=LEN(S$) 17 | 100 FOR I=1 TO LEN(S$): S(I)=ASC(MID$(S$,I,1)): NEXT I 18 | 110 FOR I=1 TO 5 19 | 120 A(I)=45 20 | 130 NEXT I 21 | 140 FOR J=1 TO 5 22 | 144 P(J)=0 23 | 146 NEXT J 24 | 150 PRINT "GUESS A FIVE LETTER WORD"; 25 | 160 INPUT L$ 26 | 170 G=G+1 27 | 172 IF S$=G$ THEN 500 28 | 173 FOR I=1 TO 7: P(I)=0: NEXT I 29 | 175 L(0)=LEN(L$) 30 | 180 FOR I=1 TO LEN(L$): L(I)=ASC(MID$(L$,I,1)): NEXT I 31 | 190 IF L(1)=63 THEN 300 32 | 200 IF L(0)<>5 THEN 400 33 | 205 M=0: Q=1 34 | 210 FOR I=1 TO 5 35 | 220 FOR J=1 TO 5 36 | 230 IF S(I)<>L(J) THEN 260 37 | 231 P(Q)=L(J) 38 | 232 Q=Q+1 39 | 233 IF I<>J THEN 250 40 | 240 A(J)=L(J) 41 | 250 M=M+1 42 | 260 NEXT J 43 | 265 NEXT I 44 | 270 A(0)=5 45 | 272 P(0)=M 46 | 275 A$="": FOR I=1 TO A(0): A$=A$+CHR$(A(I)): NEXT I 47 | 277 P$="": FOR I=1 TO P(0): P$=P$+CHR$(P(I)): NEXT I 48 | 280 PRINT "THERE WERE";M;"MATCHES AND THE COMMON LETTERS WERE...";P$ 49 | 285 PRINT "FROM THE EXACT LETTER MATCHES, YOU KNOW................";A$ 50 | 286 IF A$=S$ THEN 500 51 | 287 IF M>1 THEN 289 52 | 288 PRINT: PRINT "IF YOU GIVE UP, TYPE '?' FOR YOUR NEXT GUESS." 53 | 289 PRINT 54 | 290 GOTO 150 55 | 300 S$="": FOR I=1 TO 7: S$=S$+CHR$(S(I)): NEXT I 56 | 310 PRINT "THE SECRET WORD IS ";S$: PRINT 57 | 320 GOTO 30 58 | 400 PRINT "YOU MUST GUESS A 5 LETTER WORD. START AGAIN." 59 | 410 PRINT: G=G-1: GOTO 150 60 | 500 PRINT "YOU HAVE GUESSED THE WORD. IT TOOK";G;"GUESSES!": PRINT 61 | 510 INPUT "WANT TO PLAY AGAIN";Q$ 62 | 520 IF Q$="YES" THEN 30 63 | 530 DATA 12,"DINKY","SMOKE","WATER","GRASS","TRAIN","MIGHT","FIRST" 64 | 540 DATA "CANDY","CHAMP","WOULD","CLUMP","DOPEY" 65 | 999 END 66 | -------------------------------------------------------------------------------- /code/disks/J/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/J/.gitignore -------------------------------------------------------------------------------- /code/disks/K/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/K/.gitignore -------------------------------------------------------------------------------- /code/disks/L/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/L/.gitignore -------------------------------------------------------------------------------- /code/disks/M/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/M/.gitignore -------------------------------------------------------------------------------- /code/disks/M/XMODEM.COM: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/M/XMODEM.COM -------------------------------------------------------------------------------- /code/disks/Makefile: -------------------------------------------------------------------------------- 1 | E5 = "\345" 2 | 3 | CPMCP = /usr/bin/cpmcp 4 | CPMRM = /usr/bin/cpmrm 5 | CPFLAGS = 6 | NEWDISK = printf '%*s' 256256 | tr ' ' $(E5) > 7 | DESKEW = ./deskew.sh 8 | DISKS = A B C D E F G H I J K L M N O 9 | 10 | DISKTARGETS=$(foreach DSK,$(DISKS), DISK_$(DSK).DSK ) 11 | 12 | all : $(DISKTARGETS) 13 | 14 | define HANDLEUNDISK = 15 | undisk$(1): 16 | @echo "[UNDISK] $(1)" 17 | @mkdir -p tmp 18 | @rm -f tmp/*.* 19 | @$(CPMCP) $(CPFLAGS) DISK_$(1).DSK 0:*.* tmp/ 20 | endef 21 | 22 | $(foreach DSK,$(DISKS),$(eval $(call HANDLEUNDISK,$(DSK)))) 23 | 24 | define HANDLEDISK = 25 | DISK_$(1).DSK: $(wildcard $(1)/*.*) 26 | @echo "[MAKEDISK] DISK_$(1).DSK" 27 | @$(NEWDISK) DISK_$(1).DSK 28 | @touch -t 197001010000 DISK_$(1).DSK 29 | @touch $(1)/DUMMY.FIL 30 | @$(CPMCP) $(CPFLAGS) DISK_$(1).DSK $(1)/*.* 0: 31 | @touch DISK_$(1).DSK 32 | @rm $(1)/DUMMY.FIL 33 | @$(CPMRM) $(CPFLAGS) DISK_$(1).DSK 0:DUMMY.FIL 34 | @$(DESKEW) DISK_$(1).DSK 35 | endef 36 | 37 | $(foreach DSK,$(DISKS),$(eval $(call HANDLEDISK,$(DSK)))) 38 | 39 | clean: 40 | @rm -rf *~ 41 | @rm -rf $(DISKTARGETS) 42 | @rm -rf tmp 43 | -------------------------------------------------------------------------------- /code/disks/N/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/N/.gitignore -------------------------------------------------------------------------------- /code/disks/N/400mc.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/N/400mc.com -------------------------------------------------------------------------------- /code/disks/N/cycles.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/N/cycles.com -------------------------------------------------------------------------------- /code/disks/N/cycles.z80: -------------------------------------------------------------------------------- 1 | EMU_CYCLES EQU 0FEh 2 | 3 | ORG 100h 4 | 5 | out (EMU_CYCLES),A 6 | ret 7 | 8 | END 9 | -------------------------------------------------------------------------------- /code/disks/N/exit.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/N/exit.com -------------------------------------------------------------------------------- /code/disks/N/exit.z80: -------------------------------------------------------------------------------- 1 | EMU_EXIT EQU 0FFh 2 | 3 | ORG 100h 4 | 5 | out (EMU_EXIT),A 6 | ret 7 | 8 | END 9 | -------------------------------------------------------------------------------- /code/disks/O/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/disks/O/.gitignore -------------------------------------------------------------------------------- /code/disks/deskew.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | INFILE=$1 4 | WORKFILE=$1_work 5 | 6 | SKEW=6 7 | SECTORS=26 8 | 9 | # BUILD THE SKEW/INTERLEAVE TRANSLATION TABLE 10 | declare -a skewtab 11 | 12 | j=0 13 | for ((i=0; i < $SECTORS; i++)) { 14 | for ((k=0; k<$i; k++)) { 15 | if [ ${skewtab[$k]} -eq $j ]; then break; fi 16 | } 17 | if [[ $k -lt $i ]]; then j=$(( ($j + 1) % $SECTORS )); fi 18 | skewtab[$i]=$j 19 | j=$(( ($j + $SKEW) % $SECTORS )) 20 | } 21 | 22 | # echo "1 7 13 19 25 5 11 17 23 3 9 15 21 2 8 14 20 26 6 12 18 24 4 10 16 22" 23 | # for ((i=0; i < $SECTORS; i++)) { 24 | # x=$(( ${skewtab[$i]} + 1 )) 25 | # echo -n "$x " 26 | # } 27 | # echo 28 | 29 | #Get the file as hex into an array where each entry is a full 128 byte sector 30 | IFS=$'\n' sector=($(od -t x1 -An -v -w128 $INFILE)) 31 | 32 | 33 | # The disk have 77 tracks, with 26 sectors each. 34 | # The first two tracks are reserved for the boot sectors and are not 35 | # interleaved so they can be left as-is. 36 | for TRK in {2..76}; do 37 | # copy all sectors in current track to a holding array 38 | for i in {0..25}; do 39 | hold[$i]=${sector[$(($TRK*26+$i))]} 40 | done 41 | # Re-arrange the sectors from the holding array into the main sector array 42 | for i in {0..25}; do 43 | sector[(($TRK*26+$i))]=${hold[${skewtab[$i]}]} 44 | done 45 | done 46 | 47 | # Convert the entire array from hex back to a binary file 48 | echo ${sector[*]} | xxd -r -p > $WORKFILE 49 | rm $INFILE 50 | mv $WORKFILE $INFILE 51 | 52 | -------------------------------------------------------------------------------- /code/dist/readme.txt: -------------------------------------------------------------------------------- 1 | TL;DR - Quick Start 2 | ------------------- 3 | esptool.py write_flash 0 cpm8266_VERSION.bin -ff 80m -fm dout 4 | Connect to serial with any standard speed between 300 and 115200 baud 5 | Press twice to autobaud 6 | 7 | INTRODUCTION 8 | ------------ 9 | This is the binary distribution of the cpm8266 project. More information 10 | and all the sources required for building the project yourself is available 11 | at https://github.com/SmallRoomLabs/cpm8266 12 | 13 | Please note that an ESP8266 with 4MB memory is required. 14 | 15 | INSTALLING 16 | ---------- 17 | To install the binary onto your ESP8266 give the following command: 18 | 19 | esptool.py -p PORT write_flash 0 cpm8266_VERSION.bin -ff 80m -fm dout 20 | 21 | Change PORT to the serial/USB port your ESP is connected to and also change 22 | VERSION to whatever version is indicated in the binary file. 23 | 24 | Example for Windows: 25 | esptool.py -p COM2 write_flash 0 cpm8266_04.bin -ff 80m -fm dout 26 | 27 | On Linux: 28 | esptool.py -p /dev/ttyUSB0 write_flash 0 cpm8266_04.bin -ff 80m -fm dout 29 | 30 | You might want to add "-b 921600" to the command to increase the speed of 31 | the upload or it will take about 5 minutes to upload all of the 4MB using 32 | the version 1.2 esptool. With the 2.0 tool at 921600 it only takes 35 33 | seconds. 34 | 35 | USING 36 | ----- 37 | Connect to the ESP8266 by a terminal emulator that can connect via the 38 | serial port. 39 | 40 | On windows that might be HyperTerminal or putty. 41 | 42 | On Linux I personally use Putty, screen or minicom from the command prompt. 43 | Screen is not really a terminal emulator, but is easy to use as one. Start 44 | it as "screen /dev/ttyUSB0 9600" and you can type away. It can be exited by 45 | ctrl-A backslash. 46 | 47 | Connect to the ESP with any standard speed between 300 and 115200 baud having 48 | 8 bits, 1 stopbit, no parity. 49 | 50 | After pressing Enter twice to let the emulator detect your baudrate 51 | youy will be greeted by the a> -prompt of CP/M. 52 | 53 | There are 15 pcs of 256KB 8" drives emulated named from A: to O:, currently 54 | some of them have pre-populated files. 55 | 56 | "SCREENSHOT" 57 | ------------ 58 | cpm8266 - Z80 Emulator and CP/M 2.2 system version 0.4 59 | 60 | 62K CP/M v2.2 [cpm8266 v0.4 - SmallRoomLabs] 61 | 62 | a>dir 63 | A: ASM COM : CRC COM : CRC MAC : DDT COM 64 | A: DDTZ COM : DUMP COM : ED COM : FILES TXT 65 | A: LOAD COM : PIP COM : STAT COM : SUBMIT COM 66 | A: XR COM : XS COM : XSUB COM : FREE SUB 67 | A: ZDE COM 68 | a> 69 | 70 | FINAL WORDS 71 | ----------- 72 | This project uses code from a few other projects: 73 | 74 | Lin Ke-Fong @anotherlin made the Z80 Emulator. 75 | https://github.com/anotherlin 76 | 77 | Charles Lohr @CNLohr created the NoSDK for the ESP8266. 78 | https://github.com/cnlohr 79 | 80 | Marcel de Kogel made the Z80 disassembler (to be used) in the Z80 monitor 81 | 82 | If you have any questions, need help with using/installing this project, 83 | have suggestions, ideas or want to help develop this further please contact 84 | me at mats.engstrom@gmail.com 85 | 86 | Happy CP/M'ing. ^__^ 87 | -------------------------------------------------------------------------------- /code/espbin/blank.binary: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/espbin/blank.binary -------------------------------------------------------------------------------- /code/espbin/esp_init_data_default.binary: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/espbin/esp_init_data_default.binary -------------------------------------------------------------------------------- /code/espincludes.h: -------------------------------------------------------------------------------- 1 | #ifndef _ESPINCLUDES_H 2 | #define _ESPINCLUDES_H 3 | 4 | #include "ets_sys.h" 5 | #include "stdint.h" 6 | 7 | #define RODATA_ATTR __attribute__((section(".irom.text"))) __attribute__((aligned(4))) 8 | #define ROMSTR_ATTR __attribute__((section(".irom.text.romstr"))) __attribute__((aligned(4))) 9 | 10 | typedef struct espconn espconn; 11 | 12 | // void *ets_memcpy(void *dest, const void *src, size_t n); 13 | void uart_div_modify(int no, unsigned int freq); 14 | //int os_random(); 15 | char *ets_strcpy(char *dest, const char *src); 16 | char *ets_strncpy(char *dest, const char *src, size_t n); 17 | char *ets_strstr(const char *haystack, const char *needle); 18 | int atoi(const char *nptr); 19 | int ets_memcmp(const void *s1, const void *s2, size_t n); 20 | int ets_printf(const char *fmt, ...); 21 | int ets_sprintf(char *str, const char *format, ...) __attribute__((format(printf, 2, 3))); 22 | int ets_str2macaddr(void *, void *); 23 | int ets_strcmp(const char *s1, const char *s2); 24 | int ets_strncmp(const char *s1, const char *s2, int len); 25 | int os_printf_plus(const char *format, ...) __attribute__((format(printf, 1, 2))); 26 | int os_printf(const char *format, ...) __attribute__((format(printf, 1, 2))); 27 | int os_snprintf(char *str, size_t size, const char *format, ...) __attribute__((format(printf, 3, 4))); 28 | int rand(void); 29 | size_t ets_strlen(const char *s); 30 | uint32 system_get_time(); 31 | uint8 wifi_get_opmode(void); 32 | 33 | //void *ets_memcpy(void *dest, const void *src, size_t n); 34 | void *ets_memset(void *s, int c, size_t n); 35 | 36 | void ets_bzero(void *s, size_t n); 37 | void ets_delay_us(int ms); 38 | void ets_install_putc1(void *routine); 39 | void ets_isr_attach(int intr, void *handler, void *arg); 40 | void ets_isr_mask(unsigned intr); 41 | void ets_isr_unmask(unsigned intr); 42 | void ets_timer_arm_new(ETSTimer *a, int b, int c, int isMstimer); 43 | //void ets_timer_arm_new(volatile os_timer_t *a, int b, int c, int isMstimer); 44 | void ets_timer_disarm(ETSTimer *a); 45 | //void ets_timer_disarm(volatile os_timer_t *a); 46 | void ets_timer_setfn(ETSTimer *t, ETSTimerFunc *fn, void *parg); 47 | //void ets_timer_setfn(volatile os_timer_t *t, ETSTimerFunc *fn, void *parg); 48 | 49 | //void ets_update_cpu_frequency(int freqmhz); 50 | 51 | void *pvPortMalloc(size_t xWantedSize); 52 | void *pvPortZalloc(size_t); 53 | void *vPortMalloc(size_t xWantedSize); 54 | void pvPortFree(void *ptr); 55 | void vPortFree(void *ptr); 56 | 57 | #endif 58 | -------------------------------------------------------------------------------- /code/flash.h: -------------------------------------------------------------------------------- 1 | #ifndef _FLASH_H 2 | #define _FLASH_H 3 | 4 | void ICACHE_FLASH_ATTR FlushDisk(bool standalone); 5 | void ICACHE_FLASH_ATTR ReadDiskBlock(uint16_t mdest, uint8_t sectorNo, uint8_t trackNo, uint8_t diskNo); 6 | void ICACHE_FLASH_ATTR WriteDiskBlock(uint16_t msrc, uint8_t sectorNo, uint8_t trackNo, uint8_t diskNo); 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /code/gpio16.c: -------------------------------------------------------------------------------- 1 | #include "c_types.h" 2 | #include "eagle_soc.h" 3 | #include "espincludes.h" 4 | #include "ets_sys.h" 5 | #include "gpio.h" 6 | #include "nosdk8266.h" 7 | #include "uart.h" 8 | #include "uart_dev.h" 9 | #include "uart_register.h" 10 | #include "gpio16.h" 11 | 12 | void ICACHE_FLASH_ATTR 13 | gpio16_output_conf(void) 14 | { 15 | WRITE_PERI_REG(PAD_XPD_DCDC_CONF, 16 | (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC to output rtc_gpio0 17 | 18 | WRITE_PERI_REG(RTC_GPIO_CONF, 19 | (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable 20 | 21 | WRITE_PERI_REG(RTC_GPIO_ENABLE, 22 | (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1); //out enable 23 | } 24 | 25 | void ICACHE_FLASH_ATTR 26 | gpio16_output_set(uint8 value) 27 | { 28 | WRITE_PERI_REG(RTC_GPIO_OUT, 29 | (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe) | (uint32)(value & 1)); 30 | } 31 | 32 | void ICACHE_FLASH_ATTR 33 | gpio16_input_conf(void) 34 | { 35 | WRITE_PERI_REG(PAD_XPD_DCDC_CONF, 36 | (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); // mux configuration for XPD_DCDC and rtc_gpio0 connection 37 | 38 | WRITE_PERI_REG(RTC_GPIO_CONF, 39 | (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //mux configuration for out enable 40 | 41 | WRITE_PERI_REG(RTC_GPIO_ENABLE, 42 | READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe); //out disable 43 | } 44 | 45 | uint8 ICACHE_FLASH_ATTR 46 | gpio16_input_get(void) 47 | { 48 | return (uint8)(READ_PERI_REG(RTC_GPIO_IN_DATA) & 1); 49 | } 50 | -------------------------------------------------------------------------------- /code/gpio16.h: -------------------------------------------------------------------------------- 1 | #ifndef __GPIO16_H__ 2 | #define __GPIO16_H__ 3 | 4 | void gpio16_output_conf(void); 5 | void gpio16_output_set(uint8 value); 6 | void gpio16_input_conf(void); 7 | uint8 gpio16_input_get(void); 8 | 9 | #endif 10 | -------------------------------------------------------------------------------- /code/include/c_types.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2010 - 2011 Espressif System 3 | * 4 | */ 5 | 6 | #ifndef _C_TYPES_H_ 7 | #define _C_TYPES_H_ 8 | 9 | 10 | #include 11 | 12 | typedef unsigned char uint8; 13 | typedef unsigned char u8; 14 | typedef signed char sint8; 15 | typedef signed char int8; 16 | typedef signed char s8; 17 | typedef unsigned short uint16; 18 | typedef unsigned short u16; 19 | typedef signed short sint16; 20 | typedef signed short s16; 21 | typedef unsigned int uint32; 22 | typedef unsigned int u_int; 23 | typedef unsigned int u32; 24 | typedef signed int sint32; 25 | typedef signed int s32; 26 | typedef int int32; 27 | typedef signed long long sint64; 28 | typedef unsigned long long uint64; 29 | typedef unsigned long long u64; 30 | typedef float real32; 31 | typedef double real64; 32 | 33 | #define __le16 u16 34 | 35 | typedef unsigned int size_t; 36 | 37 | #define __packed __attribute__((packed)) 38 | 39 | #define LOCAL static 40 | 41 | #ifndef NULL 42 | #define NULL (void *)0 43 | #endif /* NULL */ 44 | 45 | /* probably should not put STATUS here */ 46 | typedef enum { 47 | OK = 0, 48 | FAIL, 49 | PENDING, 50 | BUSY, 51 | CANCEL, 52 | } STATUS; 53 | 54 | #define BIT(nr) (1UL << (nr)) 55 | 56 | #define REG_SET_BIT(_r, _b) (*(volatile uint32_t*)(_r) |= (_b)) 57 | #define REG_CLR_BIT(_r, _b) (*(volatile uint32_t*)(_r) &= ~(_b)) 58 | 59 | #define DMEM_ATTR __attribute__((section(".bss"))) 60 | #define SHMEM_ATTR 61 | 62 | #ifdef ICACHE_FLASH 63 | #define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text"))) 64 | #define ICACHE_RODATA_ATTR __attribute__((section(".irom.text"))) 65 | #else 66 | #define ICACHE_FLASH_ATTR 67 | #define ICACHE_RODATA_ATTR 68 | #endif /* ICACHE_FLASH */ 69 | 70 | #define STORE_ATTR __attribute__((aligned(4))) 71 | 72 | #ifndef __cplusplus 73 | typedef unsigned char bool; 74 | #define BOOL bool 75 | #define true (1) 76 | #define false (0) 77 | #define TRUE true 78 | #define FALSE false 79 | 80 | 81 | #endif /* !__cplusplus */ 82 | 83 | #endif /* _C_TYPES_H_ */ 84 | 85 | -------------------------------------------------------------------------------- /code/include/esp8266_auxrom.h: -------------------------------------------------------------------------------- 1 | #ifndef _ESP_ROMAUX_H 2 | #define _ESP_ROMAUX_H 3 | 4 | #include 5 | 6 | typedef struct{ 7 | uint32 deviceId; 8 | uint32 chip_size; // chip size in byte 9 | uint32 block_size; 10 | uint32 sector_size; 11 | uint32 page_size; 12 | uint32 status_mask; 13 | } SpiFlashChip; 14 | 15 | extern SpiFlashChip * flashchip; //don't forget: flashchip->chip_size = 0x01000000; 16 | 17 | //void ets_delay_us( uint32_t us ); 18 | 19 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 20 | 21 | //This is done a little differently than we normally do it. That's so GCC can figure out how to 22 | //re-use the PIN_BASE address. 23 | 24 | extern volatile uint32_t * PIN_BASE; 25 | extern volatile uint32_t * IO_BASE; 26 | 27 | #define PIN_OUT ( PIN_BASE[0] ) 28 | #define PIN_OUT_SET ( PIN_BASE[1] ) 29 | #define PIN_OUT_CLEAR ( PIN_BASE[2] ) 30 | #define PIN_DIR ( PIN_BASE[3] ) 31 | #define PIN_DIR_OUTPUT (PIN_BASE[4] ) 32 | #define PIN_DIR_INPUT ( PIN_BASE[5] ) 33 | #define PIN_IN ( PIN_BASE[6] ) 34 | #define _BV(x) ((1)<<(x)) 35 | 36 | ///////////////////////////////////////////////////////////////////////////////////////////////////// 37 | 38 | void ets_putc( char c ); 39 | //void uart_div_modify( int uart, int divisor ); 40 | 41 | #define putc ets_putc 42 | #define printf ets_uart_printf 43 | 44 | //Part of the romlib 45 | void romlib_init(); 46 | 47 | #endif 48 | 49 | -------------------------------------------------------------------------------- /code/include/esp8266_rom.h: -------------------------------------------------------------------------------- 1 | #ifndef _ESP8266_ROM_FUNCTS 2 | #define _ESP8266_ROM_FUNCTS 3 | 4 | // This is my best guess at some of the ROM functions for the ESP8266. 5 | // I have no idea if this stuff is correct! 6 | 7 | #include "esp8266_auxrom.h" 8 | #include 9 | 10 | void Cache_Read_Disable(); // Can't seem to operate... 11 | void Cache_Read_Enable(); 12 | 13 | // PROVIDE ( Cache_Read_Disable = 0x400047f0 ); 14 | // PROVIDE ( Cache_Read_Enable = 0x40004678 ); 15 | 16 | typedef struct { 17 | uint32_t i[2]; 18 | uint32_t buf[4]; 19 | unsigned char in[64]; 20 | unsigned char digest[16]; 21 | } MD5_CTX; 22 | 23 | void MD5Init(MD5_CTX *mdContext); 24 | void MD5Update(MD5_CTX *mdContext, const unsigned char *inBuf, 25 | unsigned int inLen); 26 | void MD5Final(unsigned char hash[], MD5_CTX *mdContext); 27 | 28 | // SHA Stuff from: 29 | // https://github.com/pvvx/esp8266web/blob/master/app/include/bios/cha1.h 30 | #define SHA1_HASH_LEN 20 31 | typedef struct { 32 | uint32 state[5]; 33 | uint32 count[2]; 34 | uint8 buffer[64]; 35 | uint8 extra[40]; 36 | } SHA1_CTX; 37 | 38 | void SHA1Init(SHA1_CTX *context); 39 | void SHA1Update(SHA1_CTX *context, const uint8 *data, size_t len); 40 | void SHA1Final(uint8 digest[SHA1_HASH_LEN], SHA1_CTX *context); 41 | void SHA1Transform(uint32 state[5], const uint8 buffer[64]); 42 | 43 | #define SPI_FLASH_SEC_SIZE 4096 44 | 45 | typedef enum { 46 | SPI_FLASH_RESULT_OK, 47 | SPI_FLASH_RESULT_ERR, 48 | SPI_FLASH_RESULT_TIMEOUT 49 | } SpiFlashOpResult; 50 | 51 | 52 | 53 | uint32_t SPIEraseSector(uint16 sec); 54 | uint32_t SPIEraseArea(uint32 start, uint32 len); // Doesn't work? 55 | uint32_t SPIEraseBlock(uint16 blk); 56 | SpiFlashOpResult SPIWrite(uint32 des_addr, uint32_t *src_addr, uint32_t size); 57 | SpiFlashOpResult SPIRead(uint32 src_addr, uint32_t *des_addr, uint16_t size); 58 | uint32_t SPILock(uint16_t sec); //??? I don't use this? 59 | uint32_t SPIUnlock(); //??? I don't use this? -> Seems to crash. 60 | 61 | extern SpiFlashChip *flashchip; // don't forget: flashchip->chip_size = 0x01000000; 62 | 63 | /* 64 | flashchip->chip_size = 0x01000000; 65 | 66 | { 67 | uint32_t __attribute__ ((aligned (16))) t[1024]; 68 | t[0] = 0xAABBCCDD; 69 | t[1] = 0xEEFF0011; 70 | for( i = 0; i < 10000; i++ ) uart0_sendStr("A\n"); 71 | SPIEraseSector( 1000000/4096 ); 72 | for( i = 0; i < 10000; i++ ) uart0_sendStr("B\n"); 73 | SPIWrite( 1000000, t, 8 ); 74 | } 75 | 76 | for( i = 0; i < 10000; i++ ) uart0_sendStr("C\n"); 77 | 78 | while(1) 79 | { 80 | char ct[32]; 81 | uint32_t __attribute__ ((aligned (16))) ret = 0x12345678; 82 | // SPIRead( 1000000, &ret, 4 ); 83 | ret = *(uint32_t*)(0x40200000+1000004); 84 | ets_sprintf( ct, "%08x\n", ret ); 85 | printf( ct ); 86 | } 87 | */ 88 | 89 | void system_update_cpu_freq(uint8_t mhz); 90 | void software_reset(); 91 | void ets_memcpy(void *out, const void *in, int len); 92 | void ets_update_cpu_frequency(int freqmhz); 93 | STATUS uart_rx_one_char(uint8_t *pRxChar); 94 | int ets_uart_printf(const char *fmt, ...); 95 | 96 | #endif 97 | -------------------------------------------------------------------------------- /code/include/ets_sys.h: -------------------------------------------------------------------------------- 1 | /* 2 | * copyright (c) 2008 - 2011 Espressif System 3 | * 4 | * Define user specified Event signals and Task priorities here 5 | * 6 | */ 7 | 8 | #ifndef _ETS_SYS_H 9 | #define _ETS_SYS_H 10 | 11 | #include "c_types.h" 12 | 13 | typedef uint32_t ETSSignal; 14 | typedef uint32_t ETSParam; 15 | 16 | typedef struct ETSEventTag ETSEvent; 17 | 18 | struct ETSEventTag { 19 | ETSSignal sig; 20 | ETSParam par; 21 | }; 22 | 23 | typedef void (*ETSTask)(ETSEvent *e); 24 | 25 | /* timer related */ 26 | typedef uint32_t ETSHandle; 27 | typedef void ETSTimerFunc(void *timer_arg); 28 | 29 | typedef struct _ETSTIMER_ { 30 | struct _ETSTIMER_ *timer_next; 31 | uint32_t timer_expire; 32 | uint32_t timer_period; 33 | ETSTimerFunc *timer_func; 34 | void *timer_arg; 35 | } ETSTimer; 36 | 37 | /* interrupt related */ 38 | #define ETS_SDIO_INUM 1 39 | #define ETS_SPI_INUM 2 40 | #define ETS_GPIO_INUM 4 41 | #define ETS_UART_INUM 5 42 | #define ETS_UART1_INUM 5 43 | #define ETS_FRC_TIMER1_INUM 9 /* use edge*/ 44 | 45 | #define ETS_INTR_LOCK() \ 46 | ets_intr_lock() 47 | 48 | #define ETS_INTR_UNLOCK() \ 49 | ets_intr_unlock() 50 | 51 | #define ETS_FRC_TIMER1_INTR_ATTACH(func, arg) \ 52 | ets_isr_attach(ETS_FRC_TIMER1_INUM, (func), (void *)(arg)) 53 | 54 | #define ETS_FRC_TIMER1_NMI_INTR_ATTACH(func) \ 55 | NmiTimSetFunc(func) 56 | 57 | #define ETS_SDIO_INTR_ATTACH(func, arg)\ 58 | ets_isr_attach(ETS_SDIO_INUM, (func), (void *)(arg)) 59 | 60 | #define ETS_GPIO_INTR_ATTACH(func, arg) \ 61 | ets_isr_attach(ETS_GPIO_INUM, (func), (void *)(arg)) 62 | 63 | #define ETS_UART_INTR_ATTACH(func, arg) \ 64 | ets_isr_attach(ETS_UART_INUM, (func), (void *)(arg)) 65 | 66 | #define ETS_SPI_INTR_ATTACH(func, arg) \ 67 | ets_isr_attach(ETS_SPI_INUM, (func), (void *)(arg)) 68 | 69 | #define ETS_INTR_ENABLE(inum) \ 70 | ets_isr_unmask((1< 5 | 6 | // Useful, more bloated ROM functions. 7 | 8 | #if MAIN_MHZ == 52 9 | #define PERIPH_FREQ 52 10 | #elif MAIN_MHZ == 104 11 | #define PERIPH_FREQ 52 12 | #elif MAIN_MHZ == 80 13 | #define PERIPH_FREQ 80 14 | #elif MAIN_MHZ == 115 15 | #define PERIPH_FREQ 115 16 | #elif MAIN_MHZ == 173 17 | #define PERIPH_FREQ 173 18 | #elif MAIN_MHZ == 189 19 | #define PERIPH_FREQ 189 20 | #elif MAIN_MHZ == 160 21 | #define PERIPH_FREQ 160 22 | #elif MAIN_MHZ == 231 23 | #define PERIPH_FREQ 115 24 | #elif MAIN_MHZ == 320 25 | #define PERIPH_FREQ 160 26 | #elif MAIN_MHZ == 346 27 | #define PERIPH_FREQ 173 28 | #elif MAIN_MHZ == 378 // Won't boot on my ESP. PLL@5.5 (how?) 29 | #define PERIPH_FREQ 189 30 | #else 31 | #error System MHz must be 52, 80, or 160 32 | #endif 33 | 34 | extern uint32_t _bss_start; 35 | extern uint32_t _bss_end; 36 | #define HWREG(BASE, OFF) BASE[OFF >> 2] 37 | 38 | #define pico_i2c_writereg rom_i2c_writeReg 39 | void rom_i2c_writeReg(int reg, int hosid, int par, int val); 40 | 41 | #define UART0 0 42 | 43 | // Sets clock frequency, PLL and initializes BSS. 44 | void nosdk8266_init(); 45 | 46 | // For pico, or if all you want is to update the clock, call this. 47 | void nosdk8266_clock(); 48 | 49 | // Zero all global, uninitialized RAM 50 | void nosdk8266_zerobss(); 51 | 52 | // Configure a GPIO 53 | // GPIO 0: PERIPHS_IO_MUX_GPIO0_U -- FUNC_GPIO0 or FUNC_SPICS2 54 | // or FUNC_CLK_OUT 55 | // GPIO 1: PERIPHS_IO_MUX_U0TXD_U -- FUNC_GPIO1 or FUNC_U0TXD 56 | // or 57 | // FUNC_SPICS1 or FUNC_CLK_RTC_BK 58 | // GPIO 2: PERIPHS_IO_MUX_GPIO2_U -- FUNC_GPIO2 or 59 | // FUNC_U1TXD_BK 60 | // or 61 | // FUNC_I2SO_WS or FUNC_U0TXD_BK or FUNC_U1TXD_BK 62 | // GPIO 3: PERIPHS_IO_MUX_U0RXD_U -- FUNC_GPIO3 or FUNC_U0RXD 63 | // or 64 | // FUNC_I2SO_DATA or FUNC_CLK_XTAL_BK 65 | // GPIO 4: PERIPHS_IO_MUX_GPIO4_U -- FUNC_GPIO4 or FUNC_CLK_XTAL 66 | // GPIO 5: PERIPHS_IO_MUX_GPIO5_U -- FUNC_GPIO5 or FUNC_CLK_RTC 67 | // GPIO 6: PERIPHS_IO_MUX_SD_CLK_U -- FUNC_GPIO6 or FUNC_SDCLK 68 | // or 69 | // FUNC_SPICLK or UART1_CTS 70 | // GPIO 7: PERIPHS_IO_MUX_SD_DATA0_U -- FUNC_GPIO7 or FUNC_SDDATA0 71 | // or 72 | // FUNC_SPIQ_MISO or FUNC_U1TXD or FUNC_UART1_TXD 73 | // GPIO 8: PERIPHS_IO_MUX_SD_DATA1_U -- FUNC_GPIO8 or FUNC_SDDATA1 74 | // or 75 | // FUNC_SPID_MOSI or FUNC_U1RXD or FUNC_UART1_RXD 76 | // GPIO 9: PERIPHS_IO_MUX_SD_DATA2_U -- FUNC_GPIO9 or FUNC_SDDATA2 77 | // or 78 | // FUNC_HSPIHD or FUNC_SPIHD 79 | // GPIO 10: PERIPHS_IO_MUX_SD_DATA3_U -- FUNC_GPIO10 or FUNC_SDDATA3 80 | // or FUNC_SPIWP or FUNC_HSPIWP 81 | // GPIO 11: PERIPHS_IO_MUX_SD_CMD_U -- FUNC_GPIO11 or FUNC_SDCMD 82 | // or FUNC_SPICS0 or U1RTS or UART1_RTS 83 | // GPIO 12: PERIPHS_IO_MUX_MTDI_U -- FUNC_GPIO12 or FUNC_MTDI 84 | // or FUNC_I2SI_DATA or FUNC_HSPIQ_MISO or FUNC_UART0_DTR 85 | // GPIO 13: PERIPHS_IO_MUX_MTCK_U -- FUNC_GPIO13 or FUNC_MTCK 86 | // or FUNC_I2SI_BCK or FUNC_HSPID_MOSI or FUNC_UART0_CTS 87 | // GPIO 14: PERIPHS_IO_MUX_MTMS_U -- FUNC_GPIO14 or FUNC_MTMS 88 | // or FUNC_I2SI_WS or FUNC_HSPI_CLK or FUNC_UART0_DSR 89 | // GPIO 15: PERIPHS_IO_MUX_MTDO_U -- FUNC_GPIO15 or FUNC_MTDO 90 | // or FUNC_I2SO_BCK or FUNC_HSPI_CS0 or FUNC_U0RTS or FUNC_UART0_RTS 91 | 92 | // XXX TODO: Do we need to worry about "output" here? 93 | #define nosdk8266_configio(port, FUNC, pd, pu) \ 94 | IOMUX_BASE[(port - PERIPHS_IO_MUX) / 4] = \ 95 | ((((FUNC & BIT2) << 2) | (FUNC & 0x3)) << PERIPHS_IO_MUX_FUNC_S) | \ 96 | (pu << 7) | (pd << 6); 97 | 98 | #endif 99 | -------------------------------------------------------------------------------- /code/include/uart_dev.h: -------------------------------------------------------------------------------- 1 | #ifndef _UART_DEV_H 2 | #define _UART_DEV_H 3 | 4 | #include "uart_register.h" 5 | #include "eagle_soc.h" 6 | #include "c_types.h" 7 | 8 | #define RX_BUFF_SIZE 256 9 | #define TX_BUFF_SIZE 100 10 | #define UART0 0 11 | #define UART1 1 12 | 13 | typedef enum { 14 | FIVE_BITS = 0x0, 15 | SIX_BITS = 0x1, 16 | SEVEN_BITS = 0x2, 17 | EIGHT_BITS = 0x3 18 | } UartBitsNum4Char; 19 | 20 | typedef enum { 21 | ONE_STOP_BIT = 0, 22 | ONE_HALF_STOP_BIT = BIT2, 23 | TWO_STOP_BIT = BIT2 24 | } UartStopBitsNum; 25 | 26 | typedef enum { 27 | NONE_BITS = 0, 28 | ODD_BITS = 0, 29 | EVEN_BITS = BIT4 30 | } UartParityMode; 31 | 32 | typedef enum { 33 | STICK_PARITY_DIS = 0, 34 | STICK_PARITY_EN = BIT3 | BIT5 35 | } UartExistParity; 36 | 37 | typedef enum { 38 | BIT_RATE_9600 = 9600, 39 | BIT_RATE_19200 = 19200, 40 | BIT_RATE_38400 = 38400, 41 | BIT_RATE_57600 = 57600, 42 | BIT_RATE_74880 = 74880, 43 | BIT_RATE_115200 = 115200, 44 | BIT_RATE_230400 = 230400, 45 | BIT_RATE_460800 = 460800, 46 | BIT_RATE_921600 = 921600 47 | } UartBautRate; 48 | 49 | typedef enum { 50 | NONE_CTRL, 51 | HARDWARE_CTRL, 52 | XON_XOFF_CTRL 53 | } UartFlowCtrl; 54 | 55 | typedef enum { 56 | EMPTY, 57 | UNDER_WRITE, 58 | WRITE_OVER 59 | } RcvMsgBuffState; 60 | 61 | typedef struct { 62 | uint32 RcvBuffSize; 63 | uint8 *pRcvMsgBuff; 64 | uint8 *pWritePos; 65 | uint8 *pReadPos; 66 | uint8 TrigLvl; //JLU: may need to pad 67 | RcvMsgBuffState BuffState; 68 | } RcvMsgBuff; 69 | 70 | typedef struct { 71 | uint32 TrxBuffSize; 72 | uint8 *pTrxBuff; 73 | } TrxMsgBuff; 74 | 75 | typedef enum { 76 | BAUD_RATE_DET, 77 | WAIT_SYNC_FRM, 78 | SRCH_MSG_HEAD, 79 | RCV_MSG_BODY, 80 | RCV_ESC_CHAR, 81 | } RcvMsgState; 82 | 83 | typedef struct { 84 | UartBautRate baut_rate; 85 | UartBitsNum4Char data_bits; 86 | UartExistParity exist_parity; 87 | UartParityMode parity; // chip size in byte 88 | UartStopBitsNum stop_bits; 89 | UartFlowCtrl flow_ctrl; 90 | RcvMsgBuff rcv_buff; 91 | TrxMsgBuff trx_buff; 92 | RcvMsgState rcv_state; 93 | int received; 94 | int buff_uart_no; //indicate which uart use tx/rx buffer 95 | } UartDevice; 96 | 97 | #endif 98 | 99 | -------------------------------------------------------------------------------- /code/machine.h: -------------------------------------------------------------------------------- 1 | #ifndef _MACHINE_H_ 2 | #define _MACHINE_H_ 3 | 4 | #include "z80/z80emu.h" 5 | #include "z80/z80user.h" 6 | 7 | void InitMachine(); 8 | void ICACHE_FLASH_ATTR LoadBootSector(); 9 | void RunMachine(int cycles); 10 | 11 | extern MACHINE machine; 12 | 13 | #endif 14 | -------------------------------------------------------------------------------- /code/main.c: -------------------------------------------------------------------------------- 1 | #include "c_types.h" 2 | #include "os_type.h" 3 | #include "espincludes.h" 4 | #ifdef NOSDK 5 | #include "eagle_soc.h" 6 | #include "ets_sys.h" 7 | #include "gpio.h" 8 | #include "nosdk8266.h" 9 | #endif 10 | #ifdef WIFI 11 | #include "osapi.h" 12 | #include "wifi.h" 13 | #endif 14 | 15 | #include "uart.h" 16 | #include "uart_dev.h" 17 | #include "uart_register.h" 18 | #include "gpio16.h" 19 | #include "flash.h" 20 | #include "conio.h" 21 | 22 | // Make sure there always is something in the irom segment or the uploader 23 | // will barf 24 | volatile uint32_t KEEPMEHERE __attribute__((section(".irom.text"))) = 0xDEADBEEF; 25 | 26 | #include "machine.h" 27 | #include "z80/z80emu.h" 28 | #include "z80/z80user.h" 29 | #include "monitor.h" 30 | #include "utils.h" 31 | 32 | #ifdef NOSDK 33 | void ICACHE_FLASH_ATTR main(void) { 34 | uint32_t baud; 35 | 36 | gpio16_output_conf(); 37 | gpio16_output_set(1); 38 | 39 | nosdk8266_init(); 40 | InitUart(); 41 | baud=AutoBaud(); 42 | uart_div_modify(UART0, (PERIPH_FREQ * 1000000) / baud); 43 | 44 | ets_printf("\r\ncpm8266 - Z80 Emulator and CP/M 2.2 system version %d.%d\r\n",VERSION/10,VERSION%10); 45 | ets_delay_us(250000); 46 | EmptyComBuf(); 47 | 48 | InitMachine(); 49 | LoadBootSector(); 50 | for (;;) { 51 | RunMachine(1); // 400MC takes 32 seconds 52 | } 53 | } 54 | #endif 55 | 56 | 57 | 58 | #ifdef WIFI 59 | #endif 60 | -------------------------------------------------------------------------------- /code/monitor.h: -------------------------------------------------------------------------------- 1 | #ifndef _MONITOR_H 2 | #define _MONITOR_H 3 | 4 | #include "c_types.h" 5 | 6 | #define NONUM 0x10000 7 | #define LOWERNULL 0x20 8 | 9 | char ICACHE_FLASH_ATTR *GetLine(void); 10 | uint32_t ICACHE_FLASH_ATTR getHexNum(char **p); 11 | char ICACHE_FLASH_ATTR *getString(char **p); 12 | void ICACHE_FLASH_ATTR HexDump(uint16_t address, uint16_t len, bool intel); 13 | void ICACHE_FLASH_ATTR ModifyMemory(uint16_t address); 14 | void ICACHE_FLASH_ATTR LoadIntelHex(uint16_t offset); 15 | void ICACHE_FLASH_ATTR ShowAllRegisters(); 16 | void ICACHE_FLASH_ATTR ModifyRegister(char *regname, uint16_t val); 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /code/nosdk/startup.S: -------------------------------------------------------------------------------- 1 | .global delay4clk 2 | .align 4 3 | delay4clk: 4 | _addi.n a2, a2, -1 5 | bnez a2, delay4clk 6 | _ret.n 7 | 8 | //Look-alike function to rom_i2c_writeReg 9 | #if MAIN_MHZ==52 || MAIN_MHZ==104 10 | 11 | //No pico_i2c_writereg_asm isneeded if no PLL used. 12 | 13 | #else 14 | 15 | //This is similar to the i2c_writereg found in the ESP8266's ROM, however, we frontload a lot of the mathematics into the compiler. 16 | 17 | .global pico_i2c_writereg_asm 18 | .align 4 19 | pico_i2c_writereg_asm: 20 | _s32i.n a3, a2, 0 21 | _memw 22 | _l32i.n a3, a2, 0 23 | bbci a3, 25, .term_pico_writereg 24 | .reloop_pico_writereg: 25 | _memw 26 | _l32i.n a3, a2, 0 27 | bbsi a3, 25, .reloop_pico_writereg 28 | .term_pico_writereg: 29 | _ret.n 30 | 31 | #endif 32 | 33 | 34 | /* 35 | 36 | //An example function 37 | 38 | .global myfunc 39 | 40 | myfunc: 41 | addi a1, a1, -68 42 | s32i.n a0, a1, 0 // Working reg 43 | s32i.n a2, a1, 4 // Running byte 44 | s32i.n a3, a1, 8 // Running CRC 45 | s32i.n a4, a1, 12 // Anding mask 46 | 47 | movi a0, 320000 48 | movi a2, PIN_BASE 49 | l32i a4, a2, 0 50 | keep_going: 51 | //At 80 MHz, this instruction takes 12 cycles 52 | //At 160 MHz, this instruction takes 12 cycles 53 | //At 320 MHz, this instruction takes 16 cycles 54 | //At 346.6666 MHz, this is 16 cycles. -> We have 28.8888 cycles 55 | 56 | //l32i a3, a4, 0 57 | l8ui a3, a2, 0 //1 cycle!!! 58 | addi a0, a0, -1 59 | bnez a0, keep_going 60 | 61 | 62 | l32i.n a0, a1, 0 63 | l32i.n a2, a1, 4 64 | l32i.n a3, a1, 8 65 | l32i.n a4, a1, 12 66 | addi a1, a1, 68 67 | ret 68 | */ 69 | -------------------------------------------------------------------------------- /code/uart.h: -------------------------------------------------------------------------------- 1 | #ifndef _UART_H 2 | #define _UART_H 3 | 4 | uint32_t AutoBaud(void); 5 | void InitUart(void); 6 | void UartOutChar(char c); 7 | 8 | #endif -------------------------------------------------------------------------------- /code/user_config.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/code/user_config.h -------------------------------------------------------------------------------- /code/utils.c: -------------------------------------------------------------------------------- 1 | #include "utils.h" 2 | 3 | 4 | // 5 | // This reads a byte from the ESP8266 irom0 area 6 | // 7 | uint8_t ICACHE_FLASH_ATTR readRomByte(const uint8_t *addr) { 8 | uint32_t bytes; 9 | bytes = *(uint32_t *)((uint32_t)addr & ~3); 10 | return ((uint8_t *)&bytes)[(uint32_t)addr & 3]; 11 | } 12 | 13 | 14 | // 15 | // Return true if the argument is hex (0..9 A..F a..f) 16 | // 17 | bool ICACHE_FLASH_ATTR isHex(char ch) { 18 | if (ch >= '0' && ch <= '9') return true; 19 | if (ch >= 'A' && ch <= 'F') return true; 20 | if (ch >= 'a' && ch <= 'f') return true; 21 | return false; 22 | } 23 | 24 | // 25 | // Return the converted value of a hex digit (0..9 A..F a..f) 26 | // 27 | uint8_t ICACHE_FLASH_ATTR hexDec1(char ch) { 28 | if (ch >= '0' && ch <= '9') return ch - '0'; 29 | if (ch >= 'A' && ch <= 'F') return ch - 'A' + 10; 30 | if (ch >= 'a' && ch <= 'f') return ch - 'a' + 10; 31 | return 0xFF; 32 | } 33 | 34 | 35 | // 36 | // 37 | // 38 | uint8_t ICACHE_FLASH_ATTR hexDec2p(char *p) { 39 | uint8_t v1 = hexDec1(*p); 40 | p++; 41 | uint8_t v2 = hexDec1(*p); 42 | return v1 * 16 + v2; 43 | } 44 | 45 | 46 | // 47 | // 48 | // 49 | uint16_t ICACHE_FLASH_ATTR hexDec4p(char *p) { 50 | uint8_t v1 = hexDec2p(p); 51 | p += 2; 52 | uint8_t v2 = hexDec2p(p); 53 | return v1 * 256 + v2; 54 | } 55 | -------------------------------------------------------------------------------- /code/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef _UTILS_H 2 | #define _UTILS_H 3 | 4 | #include "c_types.h" 5 | 6 | #define TOLOWER(x) (x | 0x20) 7 | 8 | uint8_t ICACHE_FLASH_ATTR readRomByte(const uint8_t* addr); 9 | bool ICACHE_FLASH_ATTR isHex(char ch); 10 | uint8_t ICACHE_FLASH_ATTR hexDec1(char ch); 11 | uint8_t ICACHE_FLASH_ATTR hexDec2p(char *p); 12 | uint16_t ICACHE_FLASH_ATTR hexDec4p(char *p); 13 | 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /code/wifi.h: -------------------------------------------------------------------------------- 1 | #ifndef _WIFI_H_ 2 | #define _WIFI_H_ 3 | 4 | #endif 5 | -------------------------------------------------------------------------------- /code/z80/README.md: -------------------------------------------------------------------------------- 1 | z80emu 2 | Version 1.1.0 3 | 4 | Copyright (c) 2012-2016 Lin Ke-Fong 5 | 6 | z80emu is a free portable Z80 processor emulator. Its performance is comparable 7 | to other Z80 emulators. It emulates all undocumented features as described in 8 | "The Undocumented Z80 Documented Version 0.91" and passes both the zexdoc and 9 | zexall Z80 instruction exerciser tests. Code is pure ANSI C. 10 | 11 | The Makefile will compile a sample program to run zexdoc.com and zexall.com. 12 | Only needed CP/M BIOS functions are emulated. See zextest.c for details. 13 | 14 | All structures and functions are documented in the code, please read the header 15 | files. To use z80emu in your programs, modify z80config.h to configure the 16 | emulator, and in z80user.h, write the memory read/write and port input/output 17 | macros to interface with your system to emulate. The macros for zextest.c are 18 | simple examples. You shouldn't have to modify z80emu.c or any other files. 19 | 20 | z80emu works a little bit differently from other emulators. Instead of a switch 21 | case for all opcodes, it converts them to "generic" instructions and then do 22 | the switch case. Registers and operands are then decoded during execution. All 23 | of this is done using several tables (see maketables.c). The code is more 24 | compact, which should make it fit inside L1 instruction cache. 25 | 26 | You may find further information regarding the Z80 on http://www.z80.info. This 27 | emulator is heavily based on the information found on this website. And I would 28 | like to thank all its contributors. In particular, Sean Young for "The 29 | Undocumented Z80 Documented" and Christian Dinu for "Decoding Z80 Opcodes". The 30 | zexdoc and zexall programs have been written by Frank D. Cringles. 31 | 32 | I would like to thank Hugo Clement, Guy Hermann, Julien Montmartin, and Pierre 33 | Rousseau for review and testing. 34 | 35 | Sebastien Katz, Pierre Rousseau, and Thibaut Mattern made me start this project 36 | as part of a Sega Master System console emulator. That was long ago, back at 37 | university. I hope I will complete a full emulator someday. 38 | 39 | Feel free to send bug reports, comments, and suggestions to: 40 | 41 | anotherlin@gmail.com 42 | 43 | Revision history: 44 | 45 | 1.1.0 "first-app" (22th December 2016) 46 | 47 | Ten years already! But hopefully, work on the Sega Master System emulator has 48 | restarted. For the first application of z80emu, redesign its user API, the 49 | original being really bad. Add 2 header files for the user to customize instead 50 | of having to modify z80emu.h, update the documentation: make it clear what 51 | variables each macro can expect, compute the register decoding tables only once 52 | at reset, and add a (void *) context for interfacing with the system to 53 | emulate. All these changes should make the API better organized and easier to 54 | use. 55 | 56 | 1.0.2 (12th February 2014) 57 | 58 | Conditional relative jump (JR_DD_E) instructions such as "jr NZ, loop_label" 59 | were not decoded correctly, just a silly bug in a macro to extract bits. The 60 | zexdoc and zexall exercisers have excellent coverage of ALU instructions, but 61 | they both don't feature a single "JR" instruction! Hence this (very obvious) 62 | bug has gone unnoticed. Thank you Marcelo Dantas (marcelo.f.dantas@gmail.com). 63 | 64 | 1.0.1 (14th November 2012) 65 | 66 | Original implementation of zextest used int64_t. In retrospect, this was a poor 67 | choice. Using double to count cycles is ANSI and has more than enough precision 68 | to do so. Thank you Chris Pressey (cpressey@gmail.com). 69 | 70 | 1.0.0 (13th March 2012) 71 | 72 | Initial commit on github. Actually, the code has been almost entirely written 73 | during the summer of 2006. 74 | -------------------------------------------------------------------------------- /code/z80/z80config.h: -------------------------------------------------------------------------------- 1 | /* z80config.h 2 | * Define or comment out macros in this file to configure the emulator. 3 | * 4 | * Copyright (c) 2016 Lin Ke-Fong 5 | * 6 | * This code is free, do whatever you want with it. 7 | */ 8 | 9 | #ifndef __Z80CONFIG_INCLUDED__ 10 | #define __Z80CONFIG_INCLUDED__ 11 | 12 | /* Define this macro if the host processor is big endian. */ 13 | 14 | /* #define Z80_BIG_ENDIAN */ 15 | 16 | /* Emulation can be speed up a little bit by emulating only the documented 17 | * flags. 18 | */ 19 | 20 | /* #define Z80_DOCUMENTED_FLAGS_ONLY */ 21 | 22 | /* HALT, DI, EI, RETI, and RETN instructions can be catched. When such an 23 | * instruction is catched, the emulator is stopped and the PC register points 24 | * at the opcode to be executed next. The catched instruction can be determined 25 | * from the Z80_STATE's status value. Keep in mind that no interrupt can be 26 | * accepted at the instruction right after a DI or EI on an actual processor. 27 | */ 28 | 29 | /* 30 | #define Z80_CATCH_HALT 31 | #define Z80_CATCH_DI 32 | #define Z80_CATCH_EI 33 | #define Z80_CATCH_RETI 34 | #define Z80_CATCH_RETN 35 | */ 36 | 37 | /* Undefined 0xed prefixed opcodes may be catched, otherwise they are treated 38 | * like NOP instructions. When one is catched, Z80_STATUS_ED_UNDEFINED is set 39 | * in Z80_STATE's status member and the PC register points at the 0xed prefix 40 | * before the undefined opcode. 41 | */ 42 | 43 | /* #define Z80_CATCH_ED_UNDEFINED */ 44 | 45 | /* The emulator cannot be stopped between prefixed opcodes. This can be a 46 | * problem if there is a long sequence of 0xdd and/or 0xfd prefixes. But if 47 | * Z80_PREFIX_FAILSAFE is defined, it will always be able to stop after at 48 | * least numbers_cycles are executed, in which case Z80_STATE's status is set 49 | * to Z80_STATUS_PREFIX. Note that if the memory where the opcodes are read, 50 | * has wait states (slow memory), then the additional cycles for a one byte 51 | * fetch (the non executed prefix) must be substracted. Even if it is safer, 52 | * most program won't need this feature. 53 | */ 54 | 55 | /* #define Z80_PREFIX_FAILSAFE */ 56 | 57 | /* By defining this macro, the emulator will always fetch the displacement or 58 | * address of a conditionnal jump or call instruction, even if the condition 59 | * is false and the fetch can be avoided. Define this macro if you need to 60 | * account for memory wait states on code read. 61 | */ 62 | 63 | /* #define Z80_FALSE_CONDITION_FETCH */ 64 | 65 | /* It may be possible to overwrite the opcode of the currently executing LDIR, 66 | * LDDR, INIR, or OTDR instruction. Define this macro if you need to handle 67 | * these pathological cases. 68 | */ 69 | 70 | /* #define Z80_HANDLE_SELF_MODIFYING_CODE */ 71 | 72 | #endif 73 | -------------------------------------------------------------------------------- /doc/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/.DS_Store -------------------------------------------------------------------------------- /doc/22srcimg/22src1.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/22srcimg/22src1.img -------------------------------------------------------------------------------- /doc/22srcimg/22src2.img: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/22srcimg/22src2.img -------------------------------------------------------------------------------- /doc/CPM-ref.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/CPM-ref.txt -------------------------------------------------------------------------------- /doc/How to Bootstrap CPM.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/How to Bootstrap CPM.doc -------------------------------------------------------------------------------- /doc/cpmproref.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/cpmproref.txt -------------------------------------------------------------------------------- /doc/testfiles/zexall.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/testfiles/zexall.com -------------------------------------------------------------------------------- /doc/testfiles/zexdoc.com: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/doc/testfiles/zexdoc.com -------------------------------------------------------------------------------- /pic/boot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/pic/boot1.png -------------------------------------------------------------------------------- /pic/wifi36k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mengstr/cpm8266/e6155eba354c6c75eb961153e7c3bda0d59301bb/pic/wifi36k.png --------------------------------------------------------------------------------