+ All Categories
Home > Documents > Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Date post: 12-Sep-2021
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
88
Z80 Based Microcomputer Final Design Report By Matthew Vernon For C. O. Anazia Submitted April 28, 2003
Transcript
Page 1: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Z80 Based Microcomputer

Final Design Report

By Matthew Vernon

For C. O. Anazia

Submitted April 28, 2003

Page 2: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Table of Contents I. Project Description………………………………………………3

II. Block Diagram of Hardware…………………………………….5

III. Schematic Diagram of Hardware………………………………..6

IV. Component Layout Diagram…………………………………….7

V. Parts List and Cost Figures………………………………………8

VI. Technical Specifications…………………………………………9

VII. Operating System Flowchart…………………………………….10

VIII. Development Environment………………………………………11

IX. Development Environment Listing………………………………14

X. Operating System Listing ………………………………………...41

Page 3: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

I. Project Description

The project began for me last summer, when I had a little extra time. I did extensive research on single board computers, processors, PC bus interfaces, VGA display controllers, and various IO devices. I determined that a VGA display would be too complicated for this project. PCI interface chips are available but fairly expensive, so I decided to use an ISA interface of my own design. I began with a standard single board computer design, based on a Z80. I chose the Z80 for the integrated IO package called the Killer IO. I designed the ISA interface around this computer to allow direct access to memory. The interface consists of a latch to hold the high byte of the target address, a counter to control the low byte, and a buffer to pass data to the data buss. Because of the counter, the interface is most efficient when writing or reading blocks of 256 bytes. The interface also uses flip-flops to control the reset and bus request lines on the processor and exports four status lines to the host. While researching, I came across a new technology called FRAM for Ferric RAM. This is a completely nonvolatile RAM product that reads and writes as fast as SRAM. I contacted the manufacturer for more information and was provided samples of two of their products. Both were 32K FRAM chips, and one included an on chip real time clock. Once my design was stable (in no way complete), I ordered all of the necessary parts. I began by constructing the ISA interface. In troubleshooting the interface, I found that the ISA bus on a PC does not exactly match the standards that I have read. Some changes were required to ignore signals on the bus that were not specifically intended for the card (Plug and Play detection, etc.). In order to test and troubleshoot the interface, I connected my board to a logic analyzer and sent signals to the board through simple QBasic programs. Once the interface was complete, I added memory and wrote routines to test the RAM and FRAM. From this point, more advanced software was required on the PC. From Windows 2000 or Windows XP, direct access to hardware is not permitted. I looked on the internet for a simple solution, and found a program called WinDriver. WinDriver uses a device driver that permits access to any hardware address. While this would be unacceptable for production code, it suited my use perfectly. I wrote code using the WinDriver driver to access the board. I finished my hardware with the addition of the Z80 processor, the IO chip, and the RS232 driver. I also added test points for the processor control lines and LEDs to show the status of power, reset, and bus request. In the process of testing, I modified my design slightly, seen as an empty socket.

Page 3 of 3

Page 4: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

At this point, I began writing a development environment to make programming and troubleshooting the board easier. I began with a simple edit window and integrated a macro compiler, TASM. I added features to view and write memory, and to upload software.

Once the hardware was all working correctly, I began work on the operating system. I first designed the system, and then began programming. Since my memory was arranged in banks, I saw the need for a simple memory management system that would switch and copy between banks as needed. I designed the user terminal as stream IO that could be connected to any functioning IO port. I considered a multiprocessing algorithm and a nonvolatile memory disk, but decided that there was not enough time. Once some of the operating system was written, I needed a terminal. I wrote a terminal for the development environment that handled IO by directly accessing streams in the on board memory. In order to access memory, the PC pulls the bus request line of the processor low. When a bus acknowledge signal is received, the PC transfers the data. As the semester grew to a close, I changed directions and began working on the software features that were required for the course. For fun I took time to throw in a date function which accessed the real time clock. While my software was not quite ready at presentation time, I had completed and debugged most of the required functionality.

Page 4 of 4

Page 5: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

II. Block Diagram of Hardware

Z80A0 – A2

RS232 Amp (MAX232)

160K SRAM 32K FRAM w/ Clock

Bank Decoder (74HCT)

Bank Latch (74HCT)

Z80 KIO

(Z86C9010)

Z80

(Z86C0010)

Data Bus

A0 – A7 A8 – A15

Address Bus

BD0 – BD7

Reset / BusReq FF (74HCT76)

Status Buffer(74HCT)

Data Buffer (74HCT)

BD0 – BD7

EN

BA0 – BA2

AEN

Address Counter (LSB) (74HCT)

BA3 – BA9

Address Latch (MSB) (74HCT)

ISA Address Decoder

(74HCT138)

ISA Address Comparator (74HCT688)

ISA Bus

III. Schematic Diagram of Hardware (See Next Page)

Page 5 of 5

Page 6: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Page 6 of 6

Page 7: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

IV. Component Layout Diagram

Page 7 of 7

DIP Switches to Set ISA Address Address Decoder

Latch For Address

Glue Logic For ISA

Flip-Flop For Reset, BusReq

Buffer For Data

Counter For Address Misc Logic

Killer IO Crystal

Z80

Buffers For Memory

Memory Expansion Socket

FRAM + RTC

128K RAM

32K RAM

RS232 Driver Memory Bank Latch

Memory Bank Decoder

Glue Logic for Processor

Page 8: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

V. Parts List and Cost Figures

Part Name Quantity Part Number Retail Price Retail Cost My CostZ80 Processor 1 Z84C0010 2.43$ 2.43$ -$ Z80 KIO 1 Z84C9010 9.69$ 9.69$ -$ ISA Prototype Board 1 PCB4 26.95$ 26.95$ 26.95$ 32K SRAM, 70ns 1 W24257-70L 3.39$ 3.39$ 3.39$ 32K FRAM with Real Time Clock 1 FM3808DK 12.38$ 12.38$ -$ 128K SRAM, 70ns 1 UT621024PC-70L 8.95$ 8.95$ 8.95$ Hex Inverter 2 74HC04 0.25$ 0.50$ 0.50$ Quad AND 1 74HC08 0.19$ 0.19$ 0.19$ Triple 3-Input NAND 1 74HC10 0.29$ 0.29$ 0.29$ Quad 3-State Buffer 1 74HC125 0.39$ 0.39$ 0.39$ 3 to 8 Decoder 1 74HC138 0.35$ 0.35$ 0.35$ 4 to 16 Decoder 1 74HC154 1.19$ 1.19$ 1.19$ Octal 3-State Buffer 1 74HC244 0.45$ 0.45$ 0.45$ Octal 3-State Transciever 2 74HC245 0.45$ 0.90$ 0.90$ Octal D Type Flip-Flop with Reset 1 74HC273 0.69$ 0.69$ 0.69$ Quad OR 4 74HC32 0.22$ 0.88$ 0.88$ Octal 3-State Buffer 2 74HC541 0.69$ 1.38$ 1.38$ Octal D Type Flip-Flop, Tri State 1 74HC574 0.59$ 0.59$ 0.59$ 8-Bit Equality Comparator 1 74HC688 0.69$ 0.69$ 0.69$ Dual D Type Flip-Flop 1 74HC74 0.35$ 0.35$ 0.35$ 8-Bit Binary Counter Register 1 74HC90 0.59$ 0.59$ 0.59$ RS232 Line Driver 1 ST232BN 2.49$ 2.49$ 2.49$ 16 Pin Header Socket 2 70720 0.79$ 1.58$ 1.58$ Single Row Header 1 SMH40 0.45$ 0.45$ 0.45$ Double Row Header 1 923865DS 0.52$ 0.52$ 0.52$ Dip Switch, Bussed 1 ETA-108E 1.95$ 1.95$ 1.95$ Wire Wrap Wire, 100ft 3 22541 4.95$ 14.85$ 14.85$ 14 Pin DIP Socket 10 14MLP 0.42$ 4.20$ 4.20$ 16 Pin DIP Socket 3 16MLP 0.47$ 1.41$ 1.41$ 20 Pin DIP Socket 9 20MLP 0.59$ 5.31$ 5.31$ 24 Pin Dip Socket 1 24SMLP 0.75$ 0.75$ 0.75$ 24 Pin Wide DIP Socket 1 24MLP 0.75$ 0.75$ 0.75$ 28 Pin Wide DIP Socket 2 28MLP 0.85$ 1.70$ 1.70$ 44 Pin PLCC Socket 1 G1P444 1.15$ 1.15$ 1.15$ 84 Pin PLCC Socket 1 G1P484 1.29$ 1.29$ 1.29$ 10MHZ Crystal 1 CY10LP 1.19$ 1.19$ 1.19$ Misc Resistors & Capacitors 1 5.00$ 5.00$ -$

Totals: 117.81$ 88.31$

Page 8 of 8

Page 9: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

VI. Technical Specifications Clock Speed: 5MHz RAM: 160K Nonvolatile RAM: 32K RAM, NVRAM Speed: 70ns RAM, NVRAM Wait States: 0 RAM Expansion Slot: Up To 352K Serial Ports: 2 EIA-232 Compatible Serial Speed: 300 to 19200 bps Parallel Ports: 2 ECP Compatible, 1 Data Only Counters/Timers: 1 Reserved, 3 Available to User IO Expandability: 102 Addresses Interrupts: Infinitely Expandable by Daisy Chain ISA Bus Address: User Selectable to Multiples of 8 ISA 256 Byte Transfer Time: 32.4µs

Page 9 of 9

Page 10: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

VII. Operating System Flowchart

Start

Send Welcome Message

Input Available

?

Check For Input

N

Not Found

Y

Return

help

regs P

Display Help Screen

Copy Registers to Memory

Non-Maskable Interrupt

arse for Command and Parameters

Locate Command

date

out

in

mm

md

Deallocate Memory

Allocate Memory

Display Date

Input Data from Serial Port

Output Data to Serial Port

Modify Memory

Display Memory

Display Registers

Display Memory Table

alloc

free

mem

Send / Receive Next Character Return Serial

Interrupt

Page 10 of 10

Page 11: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

VIII. Development Environment

The main screen of the development environment is shown below. It was programmed in Borland C++ Builder version 5.0 using WinDriver 5.05 to access hardware.

As is shown, the text editor is used to edit assembly code. Clicking the icon showing a document in a press calls an assembler, as configured in the assembly properties dialog. Once assembled, the assembler output is loaded into the bottom window. If there are any error messages, double clicking on the message will take the editor to the appropriate line and highlight the line that caused the error. The icon showing a screen opens the terminal. The icon showing a memory chip opens the memory editor window. The icon showing wires and two lights retrieves the status of the board. Clicking the stopped or reset buttons toggles the state of the bus request or reset line and shows the new status on the button. The status bar on the bottom of the

Page 11 of 11

Page 12: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

window shows from left to right hints, the current line number in the text editor, the size of the current file, and status information if the status button has been clicked. The memory edit window shown below is used to view and edit memory, both RAM and FRAM. Clicking the Get Data button retrieves 32k of data from the selected source. The data is displayed in hex on the left and in ASCII on the right. Clicking on a byte in either pane will highlight the byte in both panes.

Double clicking on the table will bring the edit line, seen at the bottom, to that position in memory. The user can alternately type in the address. Data in the edit line can be modified, and written back to memory by clicking the Write Data button. Clicking on Save or Load opens a dialog that allows binary files to be saved from or loaded into memory at any location. This is how programs are loaded into FRAM.

Page 12 of 12

Page 13: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

The Zboard Terminal, shown here, is the primary interface between the user and the board. Text typed in the edit line is sent to the processor and echoed to the output display. Clicking the Debug button retrieves the values of all registers and important variables. A few commands are demonstrated in the terminal.

Page 13 of 13

Page 14: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

IX. Development Environment Listing //--------------------------------------------------------------------------- #include <vcl\vcl.h> #pragma hdrstop #include "Main.h" #include "MemEdit.h" #include "Unit2.h" #include <stdio> #include <process> #include "isa_lib.h" #include "ZTerm.h" #define SETTINGSFILE ExtractFilePath(Application->ExeName)+"zboard.nfo" //--------------------------------------------------------------------------- #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { int iFileHandle, status; char *pszBuffer; unsigned char ad_sp; ISA_HANDLE hISA = NULL; ISA_Open(&hISA);//open handle for isa if (FileExists(SETTINGSFILE)) { try { pszBuffer = new char[121]; iFileHandle = FileOpen(SETTINGSFILE, fmOpenRead); FileSeek(iFileHandle,0,0); FileRead(iFileHandle, pszBuffer, 120); Settings.Path = pszBuffer; FileRead(iFileHandle, pszBuffer, 60); Settings.Options = pszBuffer; FileRead(iFileHandle, pszBuffer, 3);

Page 14 of 14

Page 15: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Settings.MemLoc = atoi(pszBuffer); FileClose(iFileHandle); delete [] pszBuffer; } catch(...) { Application->MessageBox("Failed To Open Default Settings", "File Error", IDOK); } } status = ISA_ReadByte(hISA, Settings.MemLoc, 3); if(status&0x01) { SpeedButton6->Caption="Stopped"; SpeedButton6->Glyph->LoadFromFile(ExtractFilePath(Application->ExeName)+"stop.BMP"); } else { SpeedButton6->Glyph->LoadFromFile(ExtractFilePath(Application->ExeName)+"go.BMP"); SpeedButton6->Caption="Running"; } if(status&0x04) SpeedButton9->Caption="Reset"; else SpeedButton9->Caption="Standard"; ISA_Close(hISA); } //---------------------------------------------------------------------------- void __fastcall TMainForm::FormCreate(TObject *Sender) { Application->OnHint = ShowHint; } //---------------------------------------------------------------------------- void __fastcall TMainForm::ShowHint(TObject *Sender) { StatusLine->Panels->Items[0]->Text = Application->Hint; } //----------------------------------------------------------------------------

Page 15 of 15

Page 16: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

void __fastcall TMainForm::FileNew(TObject *Sender) { MainForm->Memo1->Clear(); MainForm->Caption="ZBoard Development Environment"; } //---------------------------------------------------------------------------- void __fastcall TMainForm::FileOpen1(TObject *Sender) { int iFileHandle; int iFileLength; int iBytesRead; char *pszBuffer; if (OpenDialog->Execute()) { try { iFileHandle = FileOpen(OpenDialog->FileName, fmOpenRead); iFileLength = FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); pszBuffer = new char[iFileLength+1]; iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength); FileClose(iFileHandle); MainForm->Memo1->Text = pszBuffer; MainForm->StatusLine->Panels->Items[2]->Text = iBytesRead; FileName =OpenDialog->FileName; MainForm->Caption="ZBoard Development Environment - "+FileName; delete [] pszBuffer; } catch(...) { Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK); } } } //---------------------------------------------------------------------------- void __fastcall TMainForm::FileSave1(TObject *Sender) { int iFileHandle; int iFileLength; int iBytesRead; char *pszBuffer;

Page 16 of 16

Page 17: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

try { if(FileName.IsEmpty()) { SaveDialog->Execute(); FileName = SaveDialog->FileName; } if (FileExists(FileName)) DeleteFile(FileName); iFileHandle = FileCreate(FileName); pszBuffer = new char[Memo1->Text.Length() +1]; strcpy(pszBuffer, Memo1->Text.c_str()); FileWrite(iFileHandle, pszBuffer, Memo1->Text.Length()); FileClose(iFileHandle); delete [] pszBuffer; } catch(...) { Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK); } } //---------------------------------------------------------------------------- void __fastcall TMainForm::FileSaveAs(TObject *Sender) { int iFileHandle; int iFileLength; int iBytesRead; char *pszBuffer; if (SaveDialog->Execute()) { try { if (FileExists(SaveDialog->FileName)) DeleteFile(SaveDialog->FileName); iFileHandle = FileCreate(SaveDialog->FileName); pszBuffer = new char[MainForm->Memo1->Text.Length() +1]; strcpy(pszBuffer, MainForm->Memo1->Text.c_str()); FileWrite(iFileHandle, pszBuffer, MainForm->Memo1->Text.Length());

Page 17 of 17

Page 18: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

FileClose(iFileHandle); FileName=SaveDialog->FileName; MainForm->Caption="ZBoard Development Environment - "+FileName; delete [] pszBuffer; } catch(...) { Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK); } } } //---------------------------------------------------------------------------- void __fastcall TMainForm::FilePrint(TObject *Sender) { if (PrintDialog->Execute()) { //---- Add code to print current file ---- } } //---------------------------------------------------------------------------- void __fastcall TMainForm::FilePrintSetup(TObject *Sender) { PrintSetupDialog->Execute(); } //---------------------------------------------------------------------------- void __fastcall TMainForm::FileExit(TObject *Sender) { Close(); } //---------------------------------------------------------------------------- void __fastcall TMainForm::EditUndo(TObject *Sender) { //---- Add code to perform Edit Undo ---- } //---------------------------------------------------------------------------- void __fastcall TMainForm::EditCut(TObject *Sender) { //---- Add code to perform Edit Cut ---- } //---------------------------------------------------------------------------- void __fastcall TMainForm::EditCopy(TObject *Sender) { //--- Add code to perform Edit Copy ---- }

Page 18 of 18

Page 19: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

//---------------------------------------------------------------------------- void __fastcall TMainForm::EditPaste(TObject *Sender) { //---- Add code to perform Edit Paste ---- } //---------------------------------------------------------------------------- void __fastcall TMainForm::HelpContents(TObject *Sender) { Application->HelpCommand(HELP_CONTENTS, 0); } //---------------------------------------------------------------------------- void __fastcall TMainForm::HelpSearch(TObject *Sender) { Application->HelpCommand(HELP_PARTIALKEY, Longint("")); } //---------------------------------------------------------------------------- void __fastcall TMainForm::HelpHowToUse(TObject *Sender) { Application->HelpCommand(HELP_HELPONHELP, 0); } //---------------------------------------------------------------------------- void __fastcall TMainForm::HelpAbout(TObject *Sender) { //---- Add code to show program's About Box ---- MessageDlg("ZBoard Development Environment\r\nby Matthew Vernon\r\nJan 2003",mtInformation,TMsgDlgButtons()<<mbOK,0); } //---------------------------------------------------------------------------- void __fastcall TMainForm::MemEdit1Click(TObject *Sender) { MemEd->Visible=true; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Settings1Click(TObject *Sender) { Form2->ShowModal(); } //---------------------------------------------------------------------------

Page 19 of 19

Page 20: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

void __fastcall TMainForm::Splitter2Moved(TObject *Sender) { MainForm->Memo1->Height = MainForm->Splitter2->Top - MainForm->Memo1->Top; } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action) { int iFileHandle; char *pszBuffer; try { pszBuffer = new char[121]; if (FileExists(SETTINGSFILE)) DeleteFile(SETTINGSFILE); iFileHandle = FileCreate(SETTINGSFILE); strcpy(pszBuffer, Settings.Path.c_str()); FileWrite(iFileHandle, pszBuffer, 120); strcpy(pszBuffer, Settings.Options.c_str()); FileWrite(iFileHandle, pszBuffer, 60); itoa(Settings.MemLoc, pszBuffer, 10); FileWrite(iFileHandle, pszBuffer, 3); FileClose(iFileHandle); delete [] pszBuffer; } catch(...) { Application->MessageBox("Failed To Save Default Settings", "File Error", IDOK); } } //--------------------------------------------------------------------------- void __fastcall TMainForm::N5Click(TObject *Sender) { StatusLine->Panels->Items[0]->Text = "Compiling..."; FILE* handle; // handle to one end of pipe char message[256]; // buffer for text passed through pipe int status; // function return value AnsiString commandstring, directory; int iFileHandle; int iFileLength; char *pszBuffer;

Page 20 of 20

Page 21: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

AnsiString filed; directory = ExtractFileDir(FileName); filed = directory+"\\bdstat.txt"; DeleteFile(filed); ShellExecute(handle, NULL, Settings.Path.c_str(), (" " + Settings.Options + " " +ExtractFileName(FileName) + " >bdstat.txt").c_str(), directory.c_str(), SW_HIDE); //----------------------------load results into memo2 for(int l=0;l<20000;l++) for(int m=0;m<80000;m++); try { iFileHandle = FileOpen(directory + "\\bdstat.txt", fmOpenRead); iFileLength = FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); pszBuffer = new char[iFileLength+1]; FileRead(iFileHandle, pszBuffer, iFileLength); FileClose(iFileHandle); pszBuffer[iFileLength]='\0'; MainForm->Memo2->Text = pszBuffer; delete [] pszBuffer; } catch(...) { Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK); } StatusLine->Panels->Items[0]->Text = "Done"; } //--------------------------------------------------------------------------- void __fastcall TMainForm::Memo1Change(TObject *Sender) { StatusLine->Panels->Items[1]->Text = "Line " + AnsiString(Memo1->CaretPos.y+1); } //--------------------------------------------------------------------------- void __fastcall TMainForm::Memo1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { StatusLine->Panels->Items[1]->Text = "Line " + AnsiString(Memo1->CaretPos.y+1);

Page 21 of 21

Page 22: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

} //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton6Click(TObject *Sender) { unsigned char ad_sp; ISA_HANDLE hISA = NULL; ISA_Open(&hISA);//open handle for isa ad_sp=Form2->ComboBox1->ItemIndex; if(SpeedButton6->Caption=="Stopped") { SpeedButton6->Glyph->LoadFromFile(ExtractFilePath(Application->ExeName)+"go.BMP"); SpeedButton6->Caption="Running"; ISA_ReadByte(hISA, ad_sp, 6); } else { SpeedButton6->Caption="Stopped"; SpeedButton6->Glyph->LoadFromFile(ExtractFilePath(Application->ExeName)+"stop.BMP"); ISA_WriteByte(hISA, ad_sp, 6, '0'); } ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton7Click(TObject *Sender) { unsigned char ad_sp; int stat; ISA_HANDLE hISA = NULL; ISA_Open(&hISA);//open handle for isa ad_sp=Form2->ComboBox1->ItemIndex; stat = ISA_ReadByte(hISA, ad_sp, 3);

Page 22 of 22

Page 23: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

StatusLine->Panels->Items[3]->Text = "Status " + AnsiString(stat&1) + ", " + AnsiString(stat&2) + ", " + AnsiString(stat&4) + ", " + AnsiString(stat&8); ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMainForm::SpeedButton9Click(TObject *Sender) { unsigned char ad_sp; ISA_HANDLE hISA = NULL; ISA_Open(&hISA);//open handle for isa ad_sp=Form2->ComboBox1->ItemIndex; if(SpeedButton9->Caption=="Reset") { SpeedButton9->Caption="Standard"; ISA_ReadByte(hISA, ad_sp, 7); } else { SpeedButton9->Caption="Reset"; ISA_WriteByte(hISA, ad_sp, 7, '0'); } ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMainForm::Memo2DblClick(TObject *Sender) { //find line int line, lpos, hl=0, hj=0, count; AnsiString textp, text2; line = Memo2->CaretPos.y; textp = Memo2->Lines->Strings[line]; lpos = textp.AnsiPos("line"); try { if (lpos)

Page 23 of 23

Page 24: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

{ text2 = textp.SubString(lpos+5,4); line = text2.ToInt(); for (count=0;count<line;count++) { hj = hl; hl += (Memo1->Lines->Strings[count]).Length()+2; } Memo1->SelStart = hj; Memo1->SelLength = hl - hj; } } catch (const EConvertError &E) { } } //--------------------------------------------------------------------------- void __fastcall TMainForm::Button1Click(TObject *Sender) { ZT->Visible=true; MainForm->Hide(); ZT->prevst=MemEd->Visible; MemEd->Visible=false; ZT->Timer1->Enabled=true; ZT->prevst2=false; if(SpeedButton6->Caption=="Stopped") { ZT->prevst2=true; SpeedButton6Click(this); } } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "MemEdit.h" #include "isa_lib.h" #include "Unit3.h" #include "Unit2.h"

Page 24 of 24

Page 25: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

#include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMemEd *MemEd; //--------------------------------------------------------------------------- __fastcall TMemEd::TMemEd(TComponent* Owner) : TForm(Owner) { int x; MemEd->ComboBox1->ItemIndex=0; MemEd->StringGrid1->ColWidths[0]=55; MemEd->StringGrid3->ColWidths[0]=55; MemEd->StringGrid3->Cells[0][0]="0x0000"; for (x=0;x<4096;x++) MemEd->StringGrid1->Cells[0][x]="0x" + IntToHex(x*8,4); } //--------------------------------------------------------------------------- void __fastcall TMemEd::Button1Click(TObject *Sender) { unsigned char isa_bank, ad_sp=0, data, starter=0, status; ISA_HANDLE hISA = NULL; char str[4] = " \0"; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa status = ISA_ReadByte(hISA, ad_sp, 3); if((status&0x01)||(status&0x04)) { //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; if(RadioButton2->Checked) { ISA_WriteByte(hISA, ad_sp, 2, (BYTE) isa_bank); starter=128; } else starter=0;

Page 25 of 25

Page 26: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

for (int x=0;x<4096;x++) StringGrid1->Cells[0][x]="0x" + IntToHex(x*8+starter*256,4); StringGrid3->Cells[0][0]="0x" + IntToHex(starter*256,4); for(int i=starter; i<starter+128; i++) { //set high byte ISA_WriteByte(hISA, ad_sp, 1, (BYTE) i); data = ISA_ReadByte(hISA, ad_sp , 0); for(int j=0; j<256; j++) { data = ISA_ReadByte(hISA, ad_sp , 0); StringGrid1->Cells[(j%8)+1][int(j/8)+32*(i-starter)]=IntToHex(data,2); str[0]=data; StringGrid2->Cells[(j%8)][int(j/8)+32*(i-starter)]=str; } } data = ISA_ReadByte(hISA, ad_sp , 3); StatusBar1->SimpleText="Status: " + IntToHex(data,2); }//if else ShowMessage("Stop Processor First"); ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1TopLeftChanged(TObject *Sender) { StringGrid2->TopRow=StringGrid1->TopRow; } //--------------------------------------------------------------------------- void __fastcall TMemEd::Read1Click(TObject *Sender) { Button1Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TMemEd::Write1Click(TObject *Sender) { Button2Click(Sender); }

Page 26 of 26

Page 27: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

//--------------------------------------------------------------------------- void __fastcall TMemEd::Button2Click(TObject *Sender) { unsigned char isa_bank, ad_sp=0, data, starter=0; unsigned int address; unsigned char highb, lowb, count; ISA_HANDLE hISA = NULL; AnsiString str; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; if(RadioButton2->Checked) { ISA_WriteByte(hISA, ad_sp, 2, (BYTE) isa_bank); starter=128; } else starter=0; address = UpDown1->Position; highb = address/256+starter; lowb = address%256; ISA_WriteByte(hISA, ad_sp, 1, (BYTE) highb); data = ISA_ReadByte(hISA, ad_sp , 0); count=0; while(count<lowb) { data = ISA_ReadByte(hISA, ad_sp , 0); count++; } for(int j=0; j<8; j++) { str = "0x" + StringGrid3->Cells[j+1][0]; try{ data= StrToInt(str); }catch(const EConvertError &E){ data=0;ShowMessage("Data Error Event"); } ISA_WriteByte(hISA, ad_sp, 0, (BYTE) data); }

Page 27 of 27

Page 28: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMemEd::UpDown1Click(TObject *Sender, TUDBtnType Button) { int i=0; StringGrid3->Cells[0][0]="0x" + IntToHex(UpDown1->Position+StrToInt(StringGrid1->Cells[0][0]),4); for(i==1;i<10;i++) StringGrid3->Cells[i][0]=StringGrid1->Cells[i][UpDown1->Position]; } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid3SetEditText(TObject *Sender, int ACol, int ARow, const AnsiString Value) { try { UpDown1->Position=(StrToInt(StringGrid3->Cells[0][0]) -StrToInt(StringGrid1->Cells[0][0])); } catch(const EConvertError &E) { StringGrid3->Cells[0][0]="0x"; } if(Value.Length()==6) { UpDown1->Position=UpDown1->Position/8; UpDown1Click(Sender, TUDBtnType(0)); } } //--------------------------------------------------------------------------- void __fastcall TMemEd::Save1Click(TObject *Sender) { Form3->ShowModal();

Page 28 of 28

Page 29: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

} //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1DblClick(TObject *Sender) { if(StringGrid1->Col==0) { UpDown1->Position=StringGrid1->Row; UpDown1Click(Sender, TUDBtnType(0)); } } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1Click(TObject *Sender) { if(StringGrid1->Col!=0) { StringGrid2->Row=StringGrid1->Row; StringGrid2->Col=StringGrid1->Col-1; } } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid2Click(TObject *Sender) { StringGrid1->Row=StringGrid2->Row; StringGrid1->Col=StringGrid2->Col+1; } //--------------------------------------------------------------------------- void __fastcall TMemEd::Load1Click(TObject *Sender) { Form1->ShowModal(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "MemEdit.h"

Page 29 of 29

Page 30: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

#include "isa_lib.h" #include "Unit3.h" #include "Unit2.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMemEd *MemEd; //--------------------------------------------------------------------------- __fastcall TMemEd::TMemEd(TComponent* Owner) : TForm(Owner) { int x; MemEd->ComboBox1->ItemIndex=0; MemEd->StringGrid1->ColWidths[0]=55; MemEd->StringGrid3->ColWidths[0]=55; MemEd->StringGrid3->Cells[0][0]="0x0000"; for (x=0;x<4096;x++) MemEd->StringGrid1->Cells[0][x]="0x" + IntToHex(x*8,4); } //--------------------------------------------------------------------------- void __fastcall TMemEd::Button1Click(TObject *Sender) { unsigned char isa_bank, ad_sp=0, data, starter=0, status; ISA_HANDLE hISA = NULL; char str[4] = " \0"; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa status = ISA_ReadByte(hISA, ad_sp, 3); if((status&0x01)||(status&0x04)) { //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; if(RadioButton2->Checked) { ISA_WriteByte(hISA, ad_sp, 2, (BYTE) isa_bank); starter=128;

Page 30 of 30

Page 31: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

} else starter=0; for (int x=0;x<4096;x++) StringGrid1->Cells[0][x]="0x" + IntToHex(x*8+starter*256,4); StringGrid3->Cells[0][0]="0x" + IntToHex(starter*256,4); for(int i=starter; i<starter+128; i++) { //set high byte ISA_WriteByte(hISA, ad_sp, 1, (BYTE) i); data = ISA_ReadByte(hISA, ad_sp , 0); for(int j=0; j<256; j++) { data = ISA_ReadByte(hISA, ad_sp , 0); StringGrid1->Cells[(j%8)+1][int(j/8)+32*(i-starter)]=IntToHex(data,2); str[0]=data; StringGrid2->Cells[(j%8)][int(j/8)+32*(i-starter)]=str; } } data = ISA_ReadByte(hISA, ad_sp , 3); StatusBar1->SimpleText="Status: " + IntToHex(data,2); }//if else ShowMessage("Stop Processor First"); ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1TopLeftChanged(TObject *Sender) { StringGrid2->TopRow=StringGrid1->TopRow; } //--------------------------------------------------------------------------- void __fastcall TMemEd::Read1Click(TObject *Sender) { Button1Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TMemEd::Write1Click(TObject *Sender)

Page 31 of 31

Page 32: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

{ Button2Click(Sender); } //--------------------------------------------------------------------------- void __fastcall TMemEd::Button2Click(TObject *Sender) { unsigned char isa_bank, ad_sp=0, data, starter=0; unsigned int address; unsigned char highb, lowb, count; ISA_HANDLE hISA = NULL; AnsiString str; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; if(RadioButton2->Checked) { ISA_WriteByte(hISA, ad_sp, 2, (BYTE) isa_bank); starter=128; } else starter=0; address = UpDown1->Position; highb = address/256+starter; lowb = address%256; ISA_WriteByte(hISA, ad_sp, 1, (BYTE) highb); data = ISA_ReadByte(hISA, ad_sp , 0); count=0; while(count<lowb) { data = ISA_ReadByte(hISA, ad_sp , 0); count++; } for(int j=0; j<8; j++) { str = "0x" + StringGrid3->Cells[j+1][0]; try{ data= StrToInt(str); }catch(const EConvertError &E){ data=0;ShowMessage("Data Error Event");

Page 32 of 32

Page 33: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

} ISA_WriteByte(hISA, ad_sp, 0, (BYTE) data); } ISA_Close(hISA); } //--------------------------------------------------------------------------- void __fastcall TMemEd::UpDown1Click(TObject *Sender, TUDBtnType Button) { int i=0; StringGrid3->Cells[0][0]="0x" + IntToHex(UpDown1->Position+StrToInt(StringGrid1->Cells[0][0]),4); for(i==1;i<10;i++) StringGrid3->Cells[i][0]=StringGrid1->Cells[i][UpDown1->Position]; } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid3SetEditText(TObject *Sender, int ACol, int ARow, const AnsiString Value) { try { UpDown1->Position=(StrToInt(StringGrid3->Cells[0][0]) -StrToInt(StringGrid1->Cells[0][0])); } catch(const EConvertError &E) { StringGrid3->Cells[0][0]="0x"; } if(Value.Length()==6) { UpDown1->Position=UpDown1->Position/8; UpDown1Click(Sender, TUDBtnType(0)); } } //--------------------------------------------------------------------------- void __fastcall TMemEd::Save1Click(TObject *Sender) {

Page 33 of 33

Page 34: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Form3->ShowModal(); } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1DblClick(TObject *Sender) { if(StringGrid1->Col==0) { UpDown1->Position=StringGrid1->Row; UpDown1Click(Sender, TUDBtnType(0)); } } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid1Click(TObject *Sender) { if(StringGrid1->Col!=0) { StringGrid2->Row=StringGrid1->Row; StringGrid2->Col=StringGrid1->Col-1; } } //--------------------------------------------------------------------------- void __fastcall TMemEd::StringGrid2Click(TObject *Sender) { StringGrid1->Row=StringGrid2->Row; StringGrid1->Col=StringGrid2->Col+1; } //--------------------------------------------------------------------------- void __fastcall TMemEd::Load1Click(TObject *Sender) { Form1->ShowModal(); } //--------------------------------------------------------------------------- //---------------------------------------------------------------------------

Page 34 of 34

Page 35: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "isa_lib.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { ComboBox1->ItemIndex=0; } //--------------------------------------------------------------------------- void __fastcall TForm1::OpenDialog1CanClose(TObject *Sender, bool &CanClose) { Edit1->Text = OpenDialog1->FileName; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Form1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { OpenDialog1->Execute(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int start=0, end=0; int starth, endh, startl, endl; unsigned char isa_bank, ad_sp=0, status; ISA_HANDLE hISA = NULL; int iFileHandle, flength; char buffer[4]; char *pszBuffer; try { start = StrToInt(Edit2->Text);

Page 35 of 35

Page 36: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

} catch(const EConvertError &E) { ShowMessage(E.Message); } if(start<0||start>65535) { ShowMessage("Please Enter a Valid Range"); } else { //save data to file starth = start/0x0100; startl = start%0x0100; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa iFileHandle = FileOpen(Edit1->Text, fmOpenRead); flength = FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); pszBuffer = new char[flength+1]; FileRead(iFileHandle, pszBuffer, flength); FileClose(iFileHandle); end = start + flength-1; endh = end/0x0100; endl = end%0x0100; status = ISA_ReadByte(hISA, ad_sp, 3); if((status&0x01)||(status&0x04)) { //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; ISA_WriteByte(hISA, ComboBox1->ItemIndex, 2, (BYTE) isa_bank); for(int i=starth; i<=endh; i++) { //set high byte ISA_WriteByte(hISA, ad_sp, 1, (BYTE) i); ISA_ReadByte(hISA, ad_sp , 0); for(int j=0; j<256&&(i!=endh||j<=endl); j++) { if(j>=startl||i!=starth)

Page 36 of 36

Page 37: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

{ ISA_WriteByte(hISA, ad_sp , 0, pszBuffer[i*256+j-start]); } else ISA_ReadByte(hISA, ad_sp , 0); } } }//if else ShowMessage("Stop Processor First"); ISA_Close(hISA); Form1->Close(); }//else } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include "Main.h" #include "Unit3.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { ComboBox1->ItemIndex=0; } //--------------------------------------------------------------------------- void __fastcall TForm2::SpeedButton1Click(TObject *Sender) { if (OpenDialog1->Execute()) Edit1->Text = OpenDialog1->FileName; } //--------------------------------------------------------------------------- void __fastcall TForm2::FormShow(TObject *Sender)

Page 37 of 37

Page 38: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

{ Edit1->Text = MainForm->Settings.Path; Edit2->Text = MainForm->Settings.Options; ComboBox1->ItemIndex = MainForm->Settings.MemLoc; } //--------------------------------------------------------------------------- void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action) { MainForm->Settings.Path = Edit1->Text; MainForm->Settings.Options = Edit2->Text; MainForm->Settings.MemLoc = ComboBox1->ItemIndex; } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { Form2->Close(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit3.h" #include "isa_lib.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm3 *Form3; //--------------------------------------------------------------------------- __fastcall TForm3::TForm3(TComponent* Owner) : TForm(Owner) { ComboBox1->ItemIndex=0; } //--------------------------------------------------------------------------- void __fastcall TForm3::SaveDialog1CanClose(TObject *Sender, bool &CanClose)

Page 38 of 38

Page 39: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

{ Edit1->Text = SaveDialog1->FileName; } //--------------------------------------------------------------------------- void __fastcall TForm3::Button2Click(TObject *Sender) { Form3->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm3::SpeedButton1Click(TObject *Sender) { SaveDialog1->Execute(); } //--------------------------------------------------------------------------- void __fastcall TForm3::Button1Click(TObject *Sender) { int start=0, end=0; int starth, endh, startl, endl; unsigned char isa_bank, ad_sp=0, data, status; ISA_HANDLE hISA = NULL; int iFileHandle; char buffer[4]; try{ start = StrToInt(Edit2->Text); end = StrToInt(Edit3->Text); } catch(const EConvertError &E) { ShowMessage(E.Message); } if(start>=end||start<0||end<0||start>65535||end>65535) { ShowMessage("Please Enter a Valid Range"); } else { //save data to file starth = start/0x0100; startl = start%0x0100; endh = end/0x0100; endl = end%0x0100; ad_sp=Form2->ComboBox1->ItemIndex; ISA_Open(&hISA);//open handle for isa

Page 39 of 39

Page 40: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

if (FileExists(Edit1->Text)) DeleteFile(Edit1->Text); iFileHandle = FileCreate(Edit1->Text); status = ISA_ReadByte(hISA, ad_sp, 3); if((status&0x01)||(status&0x04)) { //set bank to combobox selection isa_bank = ComboBox1->ItemIndex; ISA_WriteByte(hISA, ComboBox1->ItemIndex, 2, (BYTE) isa_bank); for(int i=starth; i<=endh; i++) { //set high byte ISA_WriteByte(hISA, ad_sp, 1, (BYTE) i); data = ISA_ReadByte(hISA, ad_sp , 0); for(int j=0; j<256&&(i!=endh||j<=endl); j++) { data = ISA_ReadByte(hISA, ad_sp , 0); if(j>=startl||i!=starth) { buffer[0]=data; buffer[1]='\0'; FileWrite(iFileHandle, buffer, 1); } } } }//if else ShowMessage("Stop Processor First"); FileClose(iFileHandle); ISA_Close(hISA); Form3->Close(); } } //---------------------------------------------------------------------------

Page 40 of 40

Page 41: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

X. Operating System Listing

;Furious OS Version 0.81 ;by Matthew Vernon ;C 2003 #define equ .equ #define EQU .equ ;======================Definitions and Constants==================== ;---RCODE ERROR CODES ; NO ERROR, NO INFO EQU $00 __ERROR_UNKNOWN: EQU $80 ;AN UNKNOWN ERROR OCCURED __ERROR_NOT_FOUND: EQU $81 ;THE DESIRED COMMAND WAS NOT FOUND __ERROR_CALLING: EQU $82 ;AN ERROR OCCURED CALLING A COMMAND __ERROR_RUN: EQU $83 ;ERROR CALLING EXTERNAL PROGRAM __ERROR_MEM_FULL: EQU $91 ;MEMORY IS FULL, CANNOT ALLOCATE __ERROR_MEM_TABLE_FULL: EQU $92 ;MEMORY TABLE IS FULL, CANNOT ALLOCATE __ERROR_MEM_NOTFOUND: EQU $93 ;mID NOT FOUND IN TABLE __ERROR_OUT_OF_RANGE: EQU $94 ;MEMORY ADDRESS WAS OUT OF RANGE __ERROR_NO_DATA: EQU $A1 ;NO DATA AVAILABLE IN BUFFER __ERROR_TX_INT: EQU $A2 ;ERROR IN TRANSMIT INTERRUPT __ERROR_RX_INT: EQU $A3 ;ERROR IN RECEIVE INTERRUPT ;---STDIO DEFINITIONS __IO_DETECT: EQU $00 __IO_ISA: EQU $01 __IO_SERIALA: EQU $02 __IO_SERIALB: EQU $03 ;---MEMORY MANAGER CONSTANTS __FIRST: EQU $8000 __LAST: EQU $FFFF __LASTBANK: EQU $04 ;LAST MEMORY SLOT THAT IS FULL ;---IO ADDRESSES PORTA_DATA: EQU $00

Page 41 of 41

Page 42: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

PORTA_COMMAND: EQU $01 PORTB_DATA: EQU $02 PORTB_COMMAND: EQU $03 CTC_CHANNEL1: EQU $04 CTC_CHANNEL2: EQU $05 SERIALA_DATA: EQU $08 SERIALA_CTRL: EQU $09 SERIALB_DATA: EQU $0A SERIALB_CTRL: EQU $0B PORTC_DATA: EQU $0C PORTC_COMMAND: EQU $0D KIO_COMMAND: EQU $0E BANK_SELECT: EQU $88 ;---MEMORY SPACE _JUMPS: EQU $0000 _COMMANDS: EQU $0080 _EMPTY: EQU $0180 _SYSTEM: EQU $0200 _CONSTANTS: EQU $0280 _MEMTABLE: EQU $0300 _INSTREAM: EQU $0400 _OUTSTREAM: EQU $0500 _XFER: EQU $0600 _STACK: EQU $0700 _STACK_SP: EQU $07FF _CLOCK: EQU $7FF0 ;---VARIABLES - 128B INSTREAM_IN: EQU _SYSTEM+0 INSTREAM_OUT: EQU _SYSTEM+1 OUTSTREAM_IN: EQU _SYSTEM+2 OUTSTREAM_OUT: EQU _SYSTEM+3 INSTREAM_COUNT: EQU _SYSTEM+4 DEBUG: EQU _SYSTEM+5 ;16-BYTES PASS_VALUE0: EQU _SYSTEM+21 PASS_VALUE1: EQU _SYSTEM+22 PASS_VALUE2: EQU _SYSTEM+23 PASS_VALUE3: EQU _SYSTEM+24 PASS_VALUE4: EQU _SYSTEM+25 PASS_VALUE5: EQU _SYSTEM+26 PASS_VALUE6: EQU _SYSTEM+27 PASS_VALUE7: EQU _SYSTEM+28 RCODE: EQU _SYSTEM+29

Page 42 of 42

Page 43: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

IO_STATUS: EQU _SYSTEM+30 R_BANK: EQU _SYSTEM+31 LASTID: EQU _SYSTEM+32 STDIO: EQU _SYSTEM+33 MEM_BANK: EQU _SYSTEM+34 COMMAND: EQU _SYSTEM+40 ;8-BYTE TXA_BANK: EQU _SYSTEM+48 TXA_ADDRESS: EQU _SYSTEM+49 ;2-BYTE TXA_COUNT: EQU _SYSTEM+51 ;2-BYTE RXA_BANK: EQU _SYSTEM+53 RXA_ADDRESS: EQU _SYSTEM+54 ;2-BYTE RXA_COUNT: EQU _SYSTEM+56 ;2-BYTE INT_CTC0: EQU $0260 ;_SYSTEM+96 2-BYTES INT_TXB: EQU $0270 ;_SYSTEM+112 8 2-BYTE REGISTERS INT_RXB: EQU $0274 INT_ERRORB: EQU $0276 INT_TXA: EQU $0278 INT_RXA: EQU $027C INT_ERRORA: EQU $027E CODEPAGE .ORG $1000 ;===================================INIT==================================== Init: DI ;DISABLE INTERRUPTS LD HL, _STACK_SP ;Set Stack Pointer LD SP, HL LD A, $00 ;Set Mem to Bank 0 LD (MEM_BANK), A OUT (BANK_SELECT), A LD A, $0 ;CONFIGURE RTC LD (_CLOCK+8), A LD A, $0 LD (_CLOCK), A LD A, $FB ;Reset KIO OUT (KIO_COMMAND), A

Page 43 of 43

Page 44: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, $0F ;Setup port C OUT (PORTC_COMMAND), A LD A, $00 ;Clear port C OUT (PORTC_DATA), A LD A, $07 ;SETUP BAUD CLOCK FOR SERIAL A OUT (CTC_CHANNEL2), A LD A, $20 ;TIME DIVIDER OUT (CTC_CHANNEL2), A LD A, $01 OUT (CTC_CHANNEL2), A LD A, $18 ;SETUP SERIAL PORT B OUT (SERIALB_CTRL), A ;RESET PORT LD A, $01 ;SET INTERRUPT VECTOR OUT (SERIALB_CTRL), A ;FOR SERIAL PORTS LD A, $04 OUT (SERIALB_CTRL), A LD A, $02 OUT (SERIALB_CTRL), A LD BC, INT_TXB LD A, C OUT (SERIALB_CTRL), A LD A, $18 ;SETUP SERIAL PORT A OUT (SERIALA_CTRL), A ;RESET PORT LD A, $04 OUT (SERIALA_CTRL), A LD A, $04 OUT (SERIALA_CTRL), A ;/1 CLOCK, _N1 LD A, $03 OUT (SERIALA_CTRL), A LD A, $C1 OUT (SERIALA_CTRL), A ;8 BIT RECEIVE, AE, RE LD A, $05 OUT (SERIALA_CTRL), A LD A, $68 OUT (SERIALA_CTRL), A ;8 BIT TRANSMIT, TE LD A, $01 OUT (SERIALA_CTRL), A LD A, $1A ;TURN ON RX, TX INTERRUPTS OUT (SERIALA_CTRL), A LD A, $30 OUT (SERIALA_CTRL), A

Page 44 of 44

Page 45: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, $28 ;reset txint pending OUT (SERIALA_CTRL), A ; LD A, $20 ; OUT (SERIALA_CTRL), A ;enable int on next rx LD BC, Fixit LD (INT_TXB+0), BC LD BC, Fixit LD (INT_TXB+2), BC LD BC, Fixit LD (INT_TXB+4), BC LD BC, Fixit LD (INT_TXB+6), BC LD BC, Fixit LD (INT_TXB+8), BC LD BC, Fixit LD (INT_TXB+10), BC LD BC, Fixit LD (INT_TXB+12), BC LD BC, Fixit LD (INT_TXB+14), BC LD BC, RX_Interrupt ;set INT_RXA entry point LD (INT_RXA), BC LD BC, TX_Interrupt ;set INT_TXA entry point LD (INT_TXA), BC LD A, $00 ;CLEAR STREAM VARIABLES LD (INSTREAM_COUNT), A LD (INSTREAM_IN), A LD (INSTREAM_OUT), A LD (OUTSTREAM_IN), A LD (OUTSTREAM_OUT), A LD (IO_STATUS), A LD (LASTID), A LD HL, _MEMTABLE ;Clear Memory Table Init_Loop: LD (HL), 0 INC HL LD A, L CP 254

Page 45 of 45

Page 46: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

JP P, Init_Loop LD BC, (INT_CTC0) ;SET UP PERIODIC INTERRUPT LD A, C OUT (CTC_CHANNEL1), A ;SET LEAP POINTER AS $XX40 LD A, $A7 OUT (CTC_CHANNEL1), A LD A, $FF ;TIME DIVIDER OUT (CTC_CHANNEL1), A ;enable LD A, $A1 LD A, $01 OUT (CTC_CHANNEL1), A ; LD BC, Periodic ;SET PERIODIC JUMP POINT ; LD (INT_CTC0), BC LD A, $02 ;SET INTERRUPT TABLE TO $02XX LD I, A IM 2 ;set interrupt mode EI ;==============================Main Routine================================= LD A, __IO_ISA LD (STDIO), A ;SET IO TO ISA LD HL, _CONSTANTS+0 ;Send Greeting LD (PASS_VALUE0), HL CALL Ostream Main_Wait: LD A, (OUTSTREAM_IN) ;wait for output to finish LD B, A LD A, (OUTSTREAM_OUT) CP B JP NZ, Main_Wait LD A, __IO_SERIALA LD (STDIO), A ;SET IO TO SERIALA LD HL, _CONSTANTS+0 ;Send Greeting LD (PASS_VALUE0), HL CALL Ostream

Page 46 of 46

Page 47: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Main_Wait2: LD A, (OUTSTREAM_IN) ;wait for output to finish LD B, A LD A, (OUTSTREAM_OUT) CP B JP NZ, Main_Wait2 LD A, __IO_DETECT LD (STDIO), A ;SET IO TO AUTO DETECT Main_Loop: LD A, (INSTREAM_COUNT) ;Loop until input is received CP 0 JP Z, Main_Loop CALL Command JP Main_Loop ;==============================Internal Routines============================= ;-----------------------------------Istream---------------------------------- ;pass in target address as PV1.PV0 ;preserves AF, BC, DE, HL in alternate registers ;does not modify IX, IY Istream: EX AF, AF' ;PRESERVE REGISTERS EXX LD A, (INSTREAM_COUNT) ;check for no data and loop CP 0 JP Z, Istream LD BC, _INSTREAM LD A, (INSTREAM_OUT) LD C, A LD DE, (PASS_VALUE0) Istream_Loop: ;copy until a CR is reached LD A, (BC) ;(inclusive) and save new OUT LD (DE), A INC C ;increment rotating in 256bytes INC DE

Page 47 of 47

Page 48: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

CP 13 JP NZ, Istream_Loop LD A, C LD (INSTREAM_OUT), A LD A, (INSTREAM_COUNT) ;decrement line counter DEC A LD (INSTREAM_COUNT), A EX AF, AF' ;RESTORE REGISTERS EXX RET ;-----------------------------------Ostream---------------------------------- ;pass in source address as PV1.PV0 ;preserves AF, BC, DE, HL in alternate registers ;does not modify IX, IY Ostream: EX AF, AF' ;PRESERVE REGISTERS EXX LD BC, $00FF ;Find length of input string LD HL, (PASS_VALUE0) LD A, 13 CPIR LD A, C CPL LD C, A Ostream_Wait: SCF LD A, (OUTSTREAM_IN) ;Find open size of buffer LD B, A LD A, (OUTSTREAM_OUT) SBC A, B SUB C ;Check for room for string JP C, Ostream_Wait LD BC, _OUTSTREAM LD A, (OUTSTREAM_IN) LD C, A LD DE, (PASS_VALUE0) Ostream_Loop: ;copy until a CR is reached

Page 48 of 48

Page 49: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, (DE) ;(inclusive) and save new OUT LD (BC), A INC C INC DE CP 13 JP NZ, Ostream_Loop LD A, C LD (OUTSTREAM_IN), A LD A, (STDIO) ;Check if serial is stdio CP __IO_SERIALA JP NZ, Ostream_NotSer LD A, $7F ;Initiate a TX sequence LD (PASS_VALUE0), A CALL Transmit LD A, $00 ;set output flag OUT (PORTC_DATA), A JR Ostream_Out Ostream_NotSer: LD A, $FF ;set output flag OUT (PORTC_DATA), A Ostream_Out: EX AF, AF' ;RESTORE REGISTERS EXX RET ;-----------------------------------Bin2Hex---------------------------------- ;Pass binary byte in PASS_VALUE0 ;Return two ASCII Hex Digits in PASS_VALUE1, PASS_VALUE2 ;Preserves all registers Bin2Hex: LD (PASS_VALUE4), A LD A, (PASS_VALUE0) ;GRAB HIGH NIBBLE AND $F0 SRL A SRL A SRL A SRL A ADD A, 48 ;ADJUST TO HEX

Page 49 of 49

Page 50: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

CP 58 JP M, Bin2Hex_Skip1 ADD A, 7 Bin2Hex_Skip1: LD (PASS_VALUE1), A LD A, (PASS_VALUE0) ;GRAB LOW NIBBLE AND $0F ADD A, 48 ;ADJUST TO HEX CP 58 JP M, Bin2Hex_Skip2 ADD A, 7 Bin2Hex_Skip2: LD (PASS_VALUE2), A LD A, (PASS_VALUE4) RET ;-----------------------------------Hex2Bin---------------------------------- ;Pass two ASCII Hex Digits in PASS_VALUE1, PASS_VALUE2 ;Return binary byte in PASS_VALUE0 ;Preserves all registers Hex2Bin: PUSH AF ;PRESERVE REGISTERS PUSH BC LD A, (PASS_VALUE1) ;HIGH NIBBLE FIRST SUB 48 CP 10 JP C, Hex2Bin_Skip1 SUB 7 CP 20 JP C, Hex2Bin_Skip1 SUB 32 Hex2Bin_Skip1: SLA A ;SHIFT UP HIGH NIBBLE SLA A SLA A SLA A LD B, A LD A, (PASS_VALUE2) ;LOW NIBBLE NEXT SUB 48

Page 50 of 50

Page 51: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

CP 10 JP C, Hex2Bin_Skip2 SUB 7 CP 20 JP C, Hex2Bin_Skip2 SUB 32 Hex2Bin_Skip2: ADD A, B ;COMBINE NIBBLES LD (PASS_VALUE0), A POP AF ;RESTORE REGISTERS POP BC RET ;-----------------------------------DEBUG------------------------------------- ; NMI RESPONSE ;Pass nothing ;Return nothing ;Change nothing AFCBEDLHXYSP Debug: LD (DEBUG+2), BC ;COPY ALL REGS TO MEMORY LD (DEBUG+4), DE LD (DEBUG+6), HL LD (DEBUG+8), IX LD (DEBUG+10), IY LD (DEBUG+12), SP PUSH AF POP BC LD (DEBUG+0), BC POP BC PUSH BC LD (DEBUG+14), BC LD BC, (DEBUG+2) RETN ;-----------------------------------Mem_Allocate---------------------------------- ;Pass size in PASS_VALUE1.PASS_VALUE0 ;Return mID in PASS_VALUE2, Address in PASS_VALUE4.PASS_VALUE3, bank in PASS_VALUE5 ;preserve all registers

Page 51 of 51

Page 52: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Mem_Allocate: EX AF, AF' ;PRESERVE REGISTERS EXX PUSH IX PUSH IY LD A, __ERROR_UNKNOWN LD (RCODE), A LD A, 0 LD (PASS_VALUE5), A ;INIT VARIABLES LD IX, _MEMTABLE LD A, (IX+0) ;CHECK FOR EMPTY CP 0 JP NZ, MANext1 LD HL, __FIRST LD (PASS_VALUE3), HL LD A, 1 LD (PASS_VALUE2), A LD (_XFER+3), IX JP MASkip MANext1: LD A, (IX+1) ;CHECK BANK0 > 0 CP 0 JP Z, MANext2 LD HL, __FIRST LD (PASS_VALUE3), HL JP MAPuthere MANext2: LD L, (IX+2) ;CHECK ROOM BEFORE FIRST LD H, (IX+3) LD DE, (PASS_VALUE0) SCF CCF SBC HL, DE LD DE, __FIRST SBC HL, DE JP C, MANext3 LD HL, __FIRST LD (PASS_VALUE3), HL JP MAPuthere MANext3:

Page 52 of 52

Page 53: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD BC, 6 ADD IX, BC ;CHECK ROOM BETWEEN RECORDS LD A, (IX+0) CP 0 JP Z, MALastone LD A, (IX+1) ;SKIP IF SAME BANK LD IY, PASS_VALUE5 CP (IY) JP Z, MANext4 ;BANKS ARE DIFFERENT LD A, (IX-5) LD (PASS_VALUE5), A LD HL, __LAST ;CHECK END-STOP0 >= SIZE SCF CCF LD E, (IX-2) LD D, (IX-1) SBC HL, DE LD DE, (PASS_VALUE0) SBC HL, DE JP C, MANext5 LD C, (IX-2) LD B, (IX-1) LD (PASS_VALUE3), BC JP MAPuthere MANext5: LD A, (IX+1) ;CHECK BANK1>BANK0+1 LD IY, PASS_VALUE5 SUB (IY) JP Z, MANext6 DEC A JP Z, MANext6 INC (IY) LD BC, __FIRST LD (PASS_VALUE3), BC JP MAPuthere MANext6: LD L, (IX+2) ;CHECK START1-FIRST>=SIZE LD H, (IX+3) LD DE, __FIRST SCF CCF SBC HL, DE

Page 53 of 53

Page 54: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD DE, (PASS_VALUE0) SBC HL, DE JP C, MANext3 LD A, (IX+1) LD (PASS_VALUE5), A LD BC, __FIRST LD (PASS_VALUE3), BC JP MAPuthere MANext4: SCF CCF ;BANKS ARE THE SAME LD L, (IX+2) ;CHECK START1-STOP0>=SIZE LD H, (IX+3) LD E, (IX-2) LD D, (IX-1) SBC HL, DE LD DE, (PASS_VALUE0) SBC HL, DE JP C, MANext3 LD A, (IX+1) LD (PASS_VALUE5), A LD C, (IX-2) LD B, (IX-1) LD (PASS_VALUE3), BC JP MAPuthere MALastone: LD A, (IX-5) LD (PASS_VALUE5), A LD HL, __LAST ;CHECK END-STOP0>=SIZE LD E, (IX-2) LD D, (IX-1) SCF CCF SBC HL, DE LD DE, (PASS_VALUE0) SBC HL, DE JP C, MANext7 LD C, (IX-2) LD B, (IX-1) LD (PASS_VALUE3), BC JP MAPuthere MANext7: LD A, __LASTBANK ;CHECK FOR FREE BANKS

Page 54 of 54

Page 55: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD IY, PASS_VALUE5 SUB (IY) DEC A JP C, MANoroom INC (IY) LD BC, __FIRST LD (PASS_VALUE3), BC JP MAPuthere MANoroom: LD A, __ERROR_MEM_FULL LD (RCODE), A POP IX ;RESTORE REGISTERS POP IY EXX EX AF, AF' RET MAPuthere: LD (_XFER+3), IX ;INSERT RECORD HERE LD A, (LASTID) LD (PASS_VALUE2), A LD BC, 6 MALoop: LD IX, _MEMTABLE ;FIND AN OPEN mID LD IY, PASS_VALUE2 INC (IY) JP NZ, MALoop2 INC (IY) MALoop2: LD A, (IX+0) CP 0 JP Z, MAOut LD IY, PASS_VALUE2 CP (IY) JP Z, MALoop ADD IX, BC JP MALoop2 MAOut: SCF CCF ;FIND END OF TABLE LD HL, (_XFER+3)

Page 55 of 55

Page 56: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD BC, 6 SBC HL, BC MALoop3: ADD HL, BC LD A, (HL) CP 0 JP NZ, MALoop3 LD (_XFER+5), HL ;subtract for number of bytes to move LD DE, (_XFER+3) SCF CCF SBC HL, DE JP Z, MASkip JP C, MADie PUSH HL POP BC ;SET COUNT TO SHIFT IN BC INC BC LD HL, (_XFER+5) ;SET HL TO END+5, DE TO END-1 LD DE, 6 ADD HL, DE LD DE, (_XFER+5) EX DE, HL LDDR ;SHIFT TABLE MASkip: LD IX, (_XFER+3) ;SET mID LD A, (PASS_VALUE2) LD (IX+0), A LD (LASTID), A LD A, (PASS_VALUE5) ;BANK LD (IX+1), A LD HL, (PASS_VALUE3) ;BEGINNING LD (IX+2), L LD (IX+3), H LD DE, (PASS_VALUE0) ;END ADD HL, DE LD (IX+4), L LD (IX+5), H LD A, 0 ;SET LD (RCODE), A

Page 56 of 56

Page 57: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

POP IX ;RESTORE REGISTERS POP IY EXX EX AF, AF' RET MADie: LD A, __ERROR_MEM_TABLE_FULL LD (RCODE), A POP IX ;RESTORE REGISTERS POP IY EXX EX AF, AF' RET ;-----------------------------------Mem_Find---------------------------------- ;Pass mID in PASS_VALUE0 ;Return BANK in PASS_VALUE1, Address in PASS_VALUE2, Size in PASS_VALUE4 ;Preserve all registers by ex... Mem_Find: EX AF, AF' ;preserve registers EXX PUSH IX PUSH IY LD A, __ERROR_UNKNOWN ;set return code to unknown error LD (RCODE), A LD A, (PASS_VALUE0) LD D, A LD IX, _MEMTABLE ;loop through mem records LD BC, 6 Mem_Find_Loop: LD A, (IX+0) CP 0 JP Z, Mem_Find_NotFound CP D JP Z, Mem_Find_Foundit ADD IX, BC JP Mem_Find_Loop

Page 57 of 57

Page 58: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Mem_Find_NotFound: LD A, __ERROR_MEM_NOTFOUND ;RETURN mID NOT FOUND LD (RCODE), A POP IY ;RESTORE REGISTERS POP IX EXX EX AF, AF' RET Mem_Find_Foundit: LD A, (IX+1) ;RETURN BANK LD (PASS_VALUE1), A LD C, (IX+2) LD B, (IX+3) LD (PASS_VALUE2), BC ;RETURN ADDRESS LD L, (IX+4) LD H, (IX+5) SCF CCF SBC HL, BC LD (PASS_VALUE4), HL ;RETURN SIZE LD A, 0 ;RETURN NO ERROR LD (RCODE), A POP IY ;RESTORE REGISTERS POP IX EXX EX AF, AF' RET ;-----------------------------------Mem_Free---------------------------------- ;Pass mID in PASS_VALUE0 ;Return nothing ;Preserve all registers by ex... Mem_Free: EX AF, AF' ;preserve registers EXX PUSH IX PUSH IY LD A, __ERROR_UNKNOWN ;set return code to unknown error

Page 58 of 58

Page 59: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (RCODE), A LD A, (PASS_VALUE0) LD D, A LD IX, _MEMTABLE ;loop through mem records LD BC, 6 Mem_Free_Loop: LD A, (IX+0) CP 0 JP Z, Mem_Free_NotFound CP D JP Z, Mem_Free_Foundit ADD IX, BC JP Mem_Free_Loop Mem_Free_NotFound: LD A, __ERROR_MEM_NOTFOUND ;RETURN mID NOT FOUND LD (RCODE), A POP IY ;RESTORE REGISTERS POP IX EXX EX AF, AF' RET Mem_Free_Foundit: PUSH IX ;FIND END OF TABLE LD HL, 0 Mem_Free_Loop2: ADD HL, BC ADD IX, BC LD A, (IX+0) CP 0 JP NZ, Mem_Free_Loop2 LD B, H ;SHIFT TABLE CONENTS LD C, L INC BC POP HL PUSH HL LD DE, 6 ADD HL, DE POP DE LDIR

Page 59 of 59

Page 60: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, 0 ;RETURN NO ERROR LD (RCODE), A POP IY ;RESTORE REGISTERS POP IX EXX EX AF, AF' RET ;-----------------------------------Transmit---------------------------------- ;Pass Bank in PV0(7F for stream), address in PV2.PV1, size in PV4.PV3(zero for CR) ;Return nothing ;Preserve everything including alt registers Transmit: PUSH AF ;PRESERVE REGISTERS PUSH BC PUSH HL Transmit_Loop: LD A, (IO_STATUS) ;WAIT FOR PREVIOUS TX TO FINISH BIT 0, A JP NZ, Transmit_Out LD A, (PASS_VALUE0) ;CHECK FOR STREAMING LD (TXA_BANK), A CP $7F JP NZ, Transmit_Nostream LD HL, _OUTSTREAM LD A, (OUTSTREAM_OUT) ;GET STREAM PARAMETERS LD L, A INC A LD (OUTSTREAM_OUT), A LD A, (HL) LD B, A JR Transmit_First Transmit_Nostream: LD HL, (PASS_VALUE1) ;GET BYTE AND SET ADDRESS LD A, (HL) LD B, A INC HL LD (TXA_ADDRESS), HL

Page 60 of 60

Page 61: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD HL, (PASS_VALUE3) ;GET VALUES AND CHECK EMPTY DEC HL JP Z, Transmit_Out LD (TXA_COUNT), HL Transmit_First: LD A, B OUT (SERIALA_DATA), A ;TRANSMIT FIRST BYTE LD HL, IO_STATUS SET 0, (HL) ;SET TX ACTIVE FLAG Transmit_Out: LD A, 0 LD (RCODE), A POP HL ;RESTORE REGISTERS POP BC POP AF RET ;-----------------------------------TX_Interrupt------------------------------ ;Pass nothing ;Return nothing ;Preserve everything including alt registers TX_Interrupt: PUSH AF ;PRESERVE REGISTERS PUSH BC PUSH HL LD A, __ERROR_TX_INT LD (RCODE), A LD A, (TXA_BANK) ;CHECK FOR STREAM OUT CP $7F JP NZ, TX_Interrupt_Nostream LD HL, _OUTSTREAM ;GET CHAR AND SEND LD A, (OUTSTREAM_OUT) LD L, A INC A LD (OUTSTREAM_OUT), A LD A, (HL)

Page 61 of 61

Page 62: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

OUT (SERIALA_DATA), A LD A, (OUTSTREAM_IN) ;CHECK FOR STREAM EMPTY LD B, A LD A, (OUTSTREAM_OUT) CP B JP NZ, TX_Interrupt_Out TX_Interrupt_Clear: LD A, $00 ;WAIT FOR LAST BYTE TO SEND OUT (SERIALA_CTRL), A IN A, (SERIALA_CTRL) BIT 2, A JP Z, TX_Interrupt_Clear LD A, $28 ;CANCEL INTERRUPT UNTIL NEXT SEND OUT (SERIALA_CTRL), A LD HL, IO_STATUS ;CLEAR TX FLAG RES 0, (HL) JR TX_Interrupt_Out TX_Interrupt_Nostream: OUT (BANK_SELECT), A ;JUMP TO BANK LD HL, (TXA_ADDRESS) ;OUTPUT BYTE LD A, (HL) OUT (SERIALA_DATA), A LD A, (MEM_BANK) ;RETURN TO CURRENT BANK OUT (BANK_SELECT), A INC HL LD (TXA_ADDRESS), HL LD HL, (TXA_COUNT) DEC HL LD (TXA_COUNT), HL LD BC, 0 SCF CCF SBC HL, BC JP Z, TX_Interrupt_Clear TX_Interrupt_Out: LD A, 1

Page 62 of 62

Page 63: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (RCODE), A POP HL ;RESTORE REGISERS POP BC POP AF EI RETI ;-----------------------------------RX_Interrupt------------------------------ ;Pass nothing ;Return nothing ;Preserve everything including alt registers RX_Interrupt: PUSH AF ;PRESERVE REGISTERS PUSH BC PUSH HL IN A, (SERIALA_DATA) LD B, A LD A, __ERROR_RX_INT LD (RCODE), A LD A, (IO_STATUS) ;CHECK IF AN INPUT IS ACTIVE BIT 1, A JP NZ, RX_Interrupt_Nostream LD A, (STDIO) ;STREAM INPUT CP __IO_SERIALA ;CHECK IF THIS IS THE STANDARD IO JP Z, RX_Interrupt_Stream CP __IO_DETECT ;CHECK FOR AUTODETECT STDIO JP NZ, RX_Interrupt_Out LD A, __IO_SERIALA ;SET SERIALA AS STDIO LD (STDIO), A RX_Interrupt_Stream: LD A, (INSTREAM_OUT) ;CHECK FOR BUFFER FULL LD C, A LD A, (INSTREAM_IN) INC A CP C JP Z, RX_Interrupt_Out

Page 63 of 63

Page 64: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (INSTREAM_IN), A ;SAVE CHARACTER AND INCREMENT POINTER DEC A LD HL, _INSTREAM LD L, A LD A, B LD (HL), A CP 13 ;CHECK FOR A RETURN CHARACTER JP NZ, RX_Interrupt_Out LD HL, INSTREAM_COUNT ;INCREMENT LINE COUNTER INC (HL) RX_Interrupt_Nostream: RX_Interrupt_Out: LD A, $02 LD (RCODE), A POP HL ;RESTORE REGITERS POP BC POP AF EI RETI ;-----------------------------------Periodic---------------------------------- ;Pass nothing ;Return nothing ;Preserve everything including alt registers Periodic: PUSH AF LD A, (RCODE) INC A LD (RCODE), A POP AF EI RETI ;===================================OS Routines===============================

Page 64 of 64

Page 65: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

;-----------------------------------Mem_View---------------------------------- ;Pass nothing ;Return nothing Mem_View: LD HL, _CONSTANTS+$18 ;Sent top line to terminal LD (PASS_VALUE0), HL CALL Ostream LD B, 45 LD HL, _XFER LD (PASS_VALUE0), HL LD A, 20 Mem_View_Loop: LD (HL), B ;Send Dotted Line INC HL DEC A CP 0 JP NZ, Mem_View_Loop LD B, 13 LD (HL), B CALL Ostream LD IX, _MEMTABLE Mem_View_Rec: ;Output record of mem LD IY, _XFER LD A, (IX+0) CP 0 JP Z, Mem_View_Out LD (IY+0), 32 ;MEM_ID LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IY+1), A LD A, (PASS_VALUE2) LD (IY+2), A LD (IY+3), 32 LD (IY+4), 32 LD A, (IX+1) ;BANK LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1)

Page 65 of 65

Page 66: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (IY+5), A LD A, (PASS_VALUE2) LD (IY+6), A LD (IY+7), 32 LD (IY+8), 32 LD A, (IX+3) LD (PASS_VALUE0), A ;START CALL Bin2Hex LD A, (PASS_VALUE1) LD (IY+9), A LD A, (PASS_VALUE2) LD (IY+10), A LD A, (IX+2) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IY+11), A LD A, (PASS_VALUE2) LD (IY+12), A LD (IY+13), 32 LD (IY+14), 32 LD A, (IX+5) LD (PASS_VALUE0), A ;END CALL Bin2Hex LD A, (PASS_VALUE1) LD (IY+15), A LD A, (PASS_VALUE2) LD (IY+16), A LD A, (IX+4) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IY+17), A LD A, (PASS_VALUE2) LD (IY+18), A LD (IY+19), 32 LD (IY+20), 32 LD (IY+21), 13 LD HL, _XFER LD (PASS_VALUE0), HL CALL Ostream LD DE, $6

Page 66 of 66

Page 67: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

ADD IX, DE LD DE, $22 ADD IY, DE JP Mem_View_Rec Mem_View_Out: LD A, 0 LD (RCODE), A RET ;-----------------------------------Command---------------------------------- ;Pass NOTHING ;Return NOTHING Command: LD A, __ERROR_UNKNOWN LD (RCODE), A LD HL, $00 ;CLEAR COMMAND LD (COMMAND), HL LD (COMMAND+2), HL LD (COMMAND+4), HL LD (COMMAND+6), HL LD HL, _XFER ;GET LINE OF INPUT LD (PASS_VALUE0), HL CALL Istream LD A, 0 ;TEMP RANGE FOR PASS VALUES LD (_XFER+128), A LD (_XFER+129), A LD (_XFER+130), A LD (_XFER+131), A LD (_XFER+132), A LD (_XFER+133), A LD (_XFER+134), A LD (_XFER+135), A LD B, 8 ;COPY COMMAND DATA TO COMMAND LD IX, COMMAND Command_Loop: LD A, (HL) CP 13 JP Z, Command_EndLine

Page 67 of 67

Page 68: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

CP 32 JP Z, Command_Loop_Out LD (IX), A INC IX INC HL DEC B LD A, B CP 0 JP NZ, Command_Loop Command_Loop_Out: NOP ;COMMAND ARGUMENT HANDLER LD D, 0 ;PARSE FOR SPACE, CR, '-' LD IX, _XFER+128 JR Command_PSkip Command_Parse: LD A, D CP 7 JP Z, Command_EndLine INC D INC IX Command_PSkip: INC HL LD A, (HL) CP 13 JP Z, Command_EndLine CP 32 JP Z, Command_PSkip CP 45 JP Z, Command_Text LD (PASS_VALUE1), A ;PASS A BYTE INTEGER INC HL LD A, (HL) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (IX), A JP Command_Parse Command_Text: ;PASS A CHARACTER STRING JP Command_Parse Command_EndLine: LD HL, _COMMANDS ;find command

Page 68 of 68

Page 69: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD D, $FF LD BC, 0 Command_OLoop: ;loop through commands ADD HL, BC LD BC, 8 INC D LD IX, COMMAND-1 LD A, (HL) CP 0 JP Z, Command_NotFound Command_ILoop: ;loop through characters in command INC IX LD A, (IX+0) CPI JP NZ, Command_OLoop JP PO, Command_FoundIt JR Command_ILoop Command_NotFound: LD A, __ERROR_NOT_FOUND LD (RCODE), A RET Command_FoundIt: LD BC, 3 ;DETERMINE ADDRESS OF TARGET LD HL, 0 LD A, D Command_In: SUB 1 JP M, Command_Out ADD HL, BC JR Command_In Command_Out: LD A, D LD (_XFER+32), A LD A, __ERROR_CALLING ;CALL TARGET ADDRESS LD (RCODE), A LD A, (_XFER+128) ;SET PASS VALUES LD (PASS_VALUE0), A LD A, (_XFER+129) LD (PASS_VALUE1), A LD A, (_XFER+130) LD (PASS_VALUE2), A

Page 69 of 69

Page 70: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, (_XFER+131) LD (PASS_VALUE3), A LD A, (_XFER+132) LD (PASS_VALUE4), A LD A, (_XFER+133) LD (PASS_VALUE5), A LD A, (_XFER+134) LD (PASS_VALUE6), A LD A, (_XFER+135) LD (PASS_VALUE7), A JP (HL) ;-----------------------------------Alloc---------------------------------- ;Pass size (high, low) in PV0,PV1 ;Return nothing ;preserves Alloc: LD BC, (PASS_VALUE0) LD A, B LD B, C LD C, A LD (PASS_VALUE0), BC CALL Mem_Allocate LD A, (RCODE) LD (_XFER+6), A LD BC, (PASS_VALUE0) LD (_XFER+0), BC LD BC, (PASS_VALUE2) LD (_XFER+2), BC LD BC, (PASS_VALUE4) LD (_XFER+4), BC LD A, 65 ;Print Allocate LD (_XFER+8), A LD A, 108 LD (_XFER+9), A LD A, 108 LD (_XFER+10), A LD A, 111 LD (_XFER+11), A LD A, 99 LD (_XFER+12), A LD A, 97 LD (_XFER+13), A LD A, 116

Page 70 of 70

Page 71: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (_XFER+14), A LD A, 101 LD (_XFER+15), A LD A, 58 LD (_XFER+16), A LD A, 32 LD (_XFER+17), A LD A, (_XFER+1) ;Print (Size) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+18), A LD A, (PASS_VALUE2) LD (_XFER+19), A LD A, (_XFER+0) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+20), A LD A, (PASS_VALUE2) LD (_XFER+21), A LD A, 13 LD (_XFER+22), A LD HL, _XFER+8 LD (PASS_VALUE0), HL CALL Ostream LD A, (_XFER+6) CP 0 JP NZ, Alloc_Error ;If error, jump to message LD A, 66 ;Print Bank LD (_XFER+8), A LD A, 97 LD (_XFER+9), A LD A, 110 LD (_XFER+10), A LD A, 107 LD (_XFER+11), A LD A, 32 LD (_XFER+12), A LD A, (_XFER+5) ;Print (Bank) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1)

Page 71 of 71

Page 72: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (_XFER+13), A LD A, (PASS_VALUE2) LD (_XFER+14), A LD A, 44 LD (_XFER+15), A LD A, 32 LD (_XFER+16), A LD A, 76 ;Print Loc LD (_XFER+17), A LD A, 111 LD (_XFER+18), A LD A, 99 LD (_XFER+19), A LD A, 32 LD (_XFER+20), A LD A, (_XFER+4) ;Print (Address) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+21), A LD A, (PASS_VALUE2) LD (_XFER+22), A LD A, (_XFER+3) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+23), A LD A, (PASS_VALUE2) LD (_XFER+24), A LD A, 44 LD (_XFER+25), A LD A, 32 LD (_XFER+26), A LD A, 109 ;Print mID LD (_XFER+27), A LD A, 73 LD (_XFER+28), A LD A, 68 LD (_XFER+29), A LD A, 32 LD (_XFER+30), A LD A, (_XFER+2) ;Print (mID) LD (PASS_VALUE0), A CALL Bin2Hex

Page 72 of 72

Page 73: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, (PASS_VALUE1) LD (_XFER+31), A LD A, (PASS_VALUE2) LD (_XFER+32), A LD A, 13 LD (_XFER+33), A LD HL, _XFER+8 LD (PASS_VALUE0), HL CALL Ostream RET Alloc_Error: LD A, (RCODE) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_CONSTANTS+$67), A LD A, (PASS_VALUE2) LD (_CONSTANTS+$68), A LD HL, _CONSTANTS+$60 LD (PASS_VALUE0), HL CALL Ostream RET ;-----------------------------------Free---------------------------------- ;Pass mID in PV1 ;Return nothing ;preserves Free: CALL Mem_Free LD A, (RCODE) CP 0 JP NZ, Free_Error LD HL, _CONSTANTS+$52 LD (PASS_VALUE0), HL CALL Ostream RET Free_Error: LD A, (RCODE) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_CONSTANTS+$67), A

Page 73 of 73

Page 74: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, (PASS_VALUE2) LD (_CONSTANTS+$68), A LD HL, _CONSTANTS+$60 LD (PASS_VALUE0), HL CALL Ostream RET ;-----------------------------------Regs---------------------------------- ;Pass nothing ;Return nothing ;preserves AF,HL,BC in _XFER+64 Regs: PUSH AF ;Preserve Registers LD (_XFER+66), HL LD (_XFER+68), BC POP BC LD (_XFER+64), BC LD HL, _CONSTANTS+$2E ;Sent top line to terminal LD (PASS_VALUE0), HL CALL Ostream LD B, 45 LD HL, _XFER LD (PASS_VALUE0), HL LD A, 36 Regs_Loop: LD (HL), B ;Send Dotted Line INC HL DEC A CP 0 JP NZ, Regs_Loop LD B, 13 LD (HL), B CALL Ostream LD A, (_XFER+64) ;OUTPUT A LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+0), A LD A, (PASS_VALUE2) LD (_XFER+1), A

Page 74 of 74

Page 75: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, 32 ;OUTPUT F LD (_XFER+2), A LD A, (_XFER+65) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+3), A LD A, (PASS_VALUE2) LD (_XFER+4), A LD A, 32 ;OUTPUT BC LD (_XFER+5), A LD A, (_XFER+69) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+6), A LD A, (PASS_VALUE2) LD (_XFER+7), A LD A, (_XFER+68) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+8), A LD A, (PASS_VALUE2) LD (_XFER+9), A LD A, 32 ;OUTPUT DE LD (_XFER+10), A LD A, D LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+11), A LD A, (PASS_VALUE2) LD (_XFER+12), A LD A, E LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+13), A LD A, (PASS_VALUE2) LD (_XFER+14), A LD A, 32 ;OUTPUT HL

Page 75 of 75

Page 76: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (_XFER+15), A LD A, (_XFER+67) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+16), A LD A, (PASS_VALUE2) LD (_XFER+17), A LD A, (_XFER+66) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+18), A LD A, (PASS_VALUE2) LD (_XFER+19), A LD A, 32 ;OUTPUT IX LD (_XFER+20), A LD (_XFER+74), IX LD BC, (_XFER+74) LD A, B LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+21), A LD A, (PASS_VALUE2) LD (_XFER+22), A LD A, C LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+23), A LD A, (PASS_VALUE2) LD (_XFER+24), A LD A, 32 ;OUTPUT IY LD (_XFER+25), A LD (_XFER+74), IY LD BC, (_XFER+74) LD A, B LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+26), A LD A, (PASS_VALUE2) LD (_XFER+27), A

Page 76 of 76

Page 77: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, C LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+28), A LD A, (PASS_VALUE2) LD (_XFER+29), A LD A, 32 ;OUTPUT SP LD (_XFER+30), A LD (_XFER+74), SP LD BC, (_XFER+74) LD A, B LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+31), A LD A, (PASS_VALUE2) LD (_XFER+32), A LD A, C LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_XFER+33), A LD A, (PASS_VALUE2) LD (_XFER+34), A LD A, 13 ;Output line LD (_XFER+35), A LD HL, _XFER LD (PASS_VALUE0), HL CALL Ostream LD A, 0 ;set return code LD (RCODE), A LD BC, (_XFER+64) ;Preserve Registers PUSH BC POP AF LD HL, (_XFER+66) LD BC, (_XFER+68) RET ;-----------------------------------MModify-------------------------------- ;Pass mID in PV0, address in PV1.PV2

Page 77 of 77

Page 78: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

;-----------------------------------MDump---------------------------------- ;Pass bank in PV0, address in PV1.PV2 ;Return nothing ;preserves MDump: LD BC, (PASS_VALUE1) LD A, C LD C, B LD B, A LD A, (PASS_VALUE0) LD (PASS_VALUE1), A LD A, $99 LD (PASS_VALUE7), A JR MDump_In MModify: LD A, $0 LD (PASS_VALUE7), A LD BC, (PASS_VALUE1) LD A, C LD C, B LD B, A CALL Mem_Find ;check memory range LD HL, (PASS_VALUE4) LD DE, (PASS_VALUE2) ADD HL, DE SCF CCF LD DE, 8 SBC HL, DE SBC HL, BC ;CHECK END-ADDRESS JP C, MModify_Error LD HL, (PASS_VALUE2) DEC HL SCF CCF SBC HL, BC ;CHECK START-ADDRESS JP NC, MModify_Error MDump_In: LD A, (PASS_VALUE1) ;ENTER BANK OUT (BANK_SELECT), A

Page 78 of 78

Page 79: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD D, 0 LD H, B LD L, C LD IX, _XFER MModify_Loop: LD A, (HL) LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD (IX), 32 INC IX INC HL INC D LD A, D CP 8 JP NZ, MModify_Loop LD (IX), 13 LD IX, _XFER LD (PASS_VALUE0), IX CALL Ostream LD A, (PASS_VALUE7) CP $99 JP Z, MDump_Out LD IX, _XFER LD (PASS_VALUE0), IX CALL Istream LD H, B LD L, C LD A, (IX+0) LD (PASS_VALUE1), A LD A, (IX+1) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0)

Page 79 of 79

Page 80: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (HL), A INC HL LD A, (IX+3) LD (PASS_VALUE1), A LD A, (IX+4) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL LD A, (IX+6) LD (PASS_VALUE1), A LD A, (IX+7) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL LD A, (IX+9) LD (PASS_VALUE1), A LD A, (IX+10) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL LD A, (IX+12) LD (PASS_VALUE1), A LD A, (IX+13) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL LD A, (IX+15) LD (PASS_VALUE1), A LD A, (IX+16) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A

Page 80 of 80

Page 81: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

INC HL LD A, (IX+18) LD (PASS_VALUE1), A LD A, (IX+19) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL LD A, (IX+21) LD (PASS_VALUE1), A LD A, (IX+22) LD (PASS_VALUE2), A CALL Hex2Bin LD A, (PASS_VALUE0) LD (HL), A INC HL MDump_Out: LD A, (MEM_BANK) ;RETURN TO CURRENT BANK OUT (BANK_SELECT), A LD A, 0 LD (RCODE), A RET MModify_Error: LD A, (MEM_BANK) ;RETURN TO CURRENT BANK OUT (BANK_SELECT), A LD A, __ERROR_OUT_OF_RANGE ;PRINT ERROR LD (RCODE), A LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (_CONSTANTS+$67), A LD A, (PASS_VALUE2) LD (_CONSTANTS+$68), A LD HL, _CONSTANTS+$60 LD (PASS_VALUE0), HL CALL Ostream

Page 81 of 81

Page 82: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

RET ;-----------------------------------Run---------------------------------- ;Pass bank in PV0, address in PV1.PV2 ;Return nothing ;preserves Run: LD A, __ERROR_RUN ;SET RCODE LD (RCODE), A LD HL, (PASS_VALUE1) ;FIX ADDRESS LD A, L LD L, H LD H, A LD (PASS_VALUE1), HL LD A, (MEM_BANK) ;PRESERVE BANK LD (R_BANK), A LD A, (PASS_VALUE0) ;CHANGE BANK LD (MEM_BANK), A OUT (BANK_SELECT), A LD IX, Run_Reentry ;CALL THE FUNCTION PUSH IX JP (HL) Run_Reentry: LD A, (R_BANK) ;RESTORE BANK LD (MEM_BANK), A OUT (BANK_SELECT), A LD A, $0 ;SET RCODE LD (RCODE), A RET ;-----------------------------------DATE---------------------------------- ;Pass nothing or WWYYMMDDHHMMSS ;Return nothing ;preserves Date: LD A, (PASS_VALUE0) ;CHECK FOR PASSED DATA

Page 82 of 82

Page 83: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

CP 0 JP Z, Date_Noset LD A, $02 ;ORDER A WRITE LD (_CLOCK), A LD A, (PASS_VALUE0) ;WRITE DAY OF WEEK LD (_CLOCK+$C), A LD A, (PASS_VALUE1) ;WRITE YEAR LD (_CLOCK+$F), A LD A, (PASS_VALUE2) ;WRITE MONTH LD (_CLOCK+$E), A LD A, (PASS_VALUE3) ;WRITE DAY LD (_CLOCK+$D), A LD A, (PASS_VALUE4) ;WRITE HOUR LD (_CLOCK+$B), A LD A, (PASS_VALUE5) ;WRITE MINUTE LD (_CLOCK+$A), A LD A, (PASS_VALUE6) ;WRITE SECOND LD (_CLOCK+$9), A LD A, $00 ;END READ LD (_CLOCK), A Date_Noset: LD A, $01 ;ORDER A READ LD (_CLOCK), A LD IX, _XFER LD A, (_CLOCK+$C) ;SEND DAY OF WEEK FROM MEM DEC A LD B, 0 LD C, A LD HL, _CONSTANTS+$6B ADD HL, BC PUSH HL POP IY LD A, (IY) LD (IX), A INC IX LD A, (IY+7) LD (IX), A

Page 83 of 83

Page 84: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

INC IX LD A, (IY+14) LD (IX), A INC IX LD A, ' ' ;SEND '20' LD (IX), A INC IX LD A, '2' LD (IX), A INC IX LD A, '0' LD (IX), A INC IX LD A, (_CLOCK+$F) ;SEND YEAR LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD A, '-' LD (IX), A INC IX LD A, (_CLOCK+$E) ;SEND MONTH LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD A, '-' LD (IX), A INC IX LD A, (_CLOCK+$D) ;SEND DAY LD (PASS_VALUE0), A CALL Bin2Hex

Page 84 of 84

Page 85: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD A, ' ' LD (IX), A INC IX LD A, (_CLOCK+$B) ;SEND HOUR LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD A, ':' LD (IX), A INC IX LD A, (_CLOCK+$A) ;SEND MINUTE LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2) LD (IX), A INC IX LD A, ':' LD (IX), A INC IX LD A, (_CLOCK+$9) ;SEND SECOND LD (PASS_VALUE0), A CALL Bin2Hex LD A, (PASS_VALUE1) LD (IX), A INC IX LD A, (PASS_VALUE2)

Page 85 of 85

Page 86: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

LD (IX), A INC IX LD A, 13 LD (IX), A INC IX LD A, $00 ;END READ LD (_CLOCK), A LD IX, _XFER ;SEND DATA TO OUTSTREAM LD (PASS_VALUE0), IX CALL Ostream RET ;-----------------------------------Out---------------------------------- ;Pass bank in PV0, address in PV1.PV2, size in PV3.PV4 ;Return nothing ;preserves Out: LD BC, (PASS_VALUE1) LD A, B LD B, C LD C, A LD (PASS_VALUE1), BC LD BC, (PASS_VALUE3) LD A, B LD B, C LD C, A LD (PASS_VALUE3), BC CALL Transmit RET ;-----------------------------------Help--------------------------------- ;Pass nothing ;Return nothing ;preserves

Page 86 of 86

Page 87: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Help: LD HL, $0800 LD DE, 20 LD B, 15 HLP: LD (PASS_VALUE0), HL CALL Ostream ADD HL, DE DJNZ HLP RET ;-----------------------------------Fixit--------------------------------- Fixit: LD A, $30 OUT (SERIALA_DATA), A LD A, $10 OUT (SERIALA_DATA), A RET ;---------------------- Test: LD A, 0 OUT (SERIALA_CTRL), A IN A, (SERIALA_CTRL) LD A, (PASS_VALUE0) OUT (SERIALA_DATA), A SBC HL, BC SBC HL, BC SBC HL, BC SBC HL, BC SBC HL, BC LD A, 0 OUT (SERIALA_CTRL), A IN A, (SERIALA_CTRL) IN A, (SERIALA_DATA) LD (RCODE), A RET Try: LD A, 0

Page 87 of 87

Page 88: Z80 Based Microcomputer Final Design Report By Matthew Vernon For

Page 88 of 88

LD (PASS_VALUE0), A LD BC, $0280 LD (PASS_VALUE1), BC LD BC, $0020 LD (PASS_VALUE3), BC CALL Transmit RET NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP JP $1000 ;00 JP Mem_View JP Regs JP Alloc JP Free JP MModify ;0F JP MDump JP Run JP Date ;18 JP Out JP Help JP 0 JP 0 ;24 JP Test JP Try JP Debug NOP NOP NOP NOP .END .end


Recommended