HBSupportController Class Reference
| Inherits from | NSObject |
|---|---|
| Declared in | HBSupportController.h |
Overview
The HBSupportController
class in CepheiPrefs
provides a factory that
configures a TSContactViewController
for immediate use. The
TSContactViewController
class, from
TechSupport by ashikase, provides
a text box for entering a message, as well as the ability to view or remove
pre-defined attachments. After tapping the submit button, the information is
provided to the next step, which most commonly is an email composer.
By providing a link instruction, you can have the message sent to a different
email address or posted to a website. You can also provide one or more
support instructions, which allow more files to be attached. For more
information and for examples of TSContactViewController
usage, refer to the
demos directory
in the TechSupport source.
A TSContactViewController
should be pushed on your view controller stack;
it should not be presented modally.
+ linkInstructionForEmailAddress:
Initialises a TSLinkInstruction
for the provided email address.
+ (TSLinkInstruction *)linkInstructionForEmailAddress:(NSString *)emailAddress
Parameters
emailAddress |
The email address to send an email to. |
|---|
Return Value
A pre-configured instance of TSLinkInstruction
.
Declared In
HBSupportController.h
+ supportViewControllerForBundle:
Initialises a TSContactViewController
by using information provided by a
bundle.
+ (TSContactViewController *)supportViewControllerForBundle:(NSBundle *)bundle
Parameters
bundle |
A bundle included with the package. |
|---|
Return Value
A pre-configured instance of TSContactViewController
.
Discussion
Refer to supportViewControllerForBundle:preferencesIdentifier:linkInstruction:supportInstructions: for information on how the bundle is used.
See Also
Declared In
HBSupportController.h
+ supportViewControllerForBundle:preferencesIdentifier:
Initialises a TSContactViewController
by using information provided by a
bundle and references identifier.
+ (TSContactViewController *)supportViewControllerForBundle:(nullable NSBundle *)bundle preferencesIdentifier:(NSString *)preferencesIdentifier
Parameters
bundle |
A bundle included with the package. |
|---|---|
preferencesIdentifier |
A preferences identifier that is used by the package. |
Return Value
A pre-configured instance of TSContactViewController
.
Discussion
Refer to supportViewControllerForBundle:preferencesIdentifier:linkInstruction:supportInstructions: for information on how the bundle and preferences identifier are used.
See Also
Declared In
HBSupportController.h
+ supportViewControllerForBundle:preferencesIdentifier:linkInstruction:supportInstructions:
Initialises a TSContactViewController
by using information provided by
either a bundle or a preferences identifier, and providing it a custom link
instruction and support instructions.
+ (TSContactViewController *)supportViewControllerForBundle:(nullable NSBundle *)bundle preferencesIdentifier:(nullable NSString *)preferencesIdentifier linkInstruction:(nullable TSLinkInstruction *)linkInstruction supportInstructions:(nullable NSArray<TSIncludeInstruction*> *)supportInstructions
Parameters
bundle |
A bundle included with the package. |
|---|---|
preferencesIdentifier |
The preferences identifier of the package, if it’s different from the package identifier that contains the bundle. |
linkInstruction |
The link instruction to use, or nil. |
supportInstructions |
Support instructions to use in combination with the built-in ones defined by HBSupportController, or nil. |
Return Value
A pre-configured instance of TSContactViewController
.
Discussion
The bundle may set the key HBPackageIdentifier
in its Info.plist,
containing the package identifier to gather information from. Otherwise, the
dpkg file lists are searched to find the package that contains the bundle.
The package’s name, identifier, and author will be used to fill out fields in
the information that the user will submit.
Either a bundle or preferences identifier is required. If both are nil, an
exception will be thrown. If the linkInstruction
argument is nil, a
TSLinkInstruction
is derived from the Author
field of the package’s
control file. HBSupportController
implicitly adds the user’s package
listing (output of dpkg -l
) and the preferences plist as attachments. To
add more, provide an array of TSIncludeInstruction
s to the
supportInstructions
argument.
Declared In
HBSupportController.h


#0 : If the decrypt button does not work, enable scripts.
#1 : Enter student ID into the Student ID text box.
#2 : Press Generate Keys, this will generate a public and private key based on the input.
#3 : Press Encrypt to encrypt the Student ID with the public key.
#4 : Copy the number in output and paste it into the Student ID text input, then press Decrypt to decrypt the Student ID with the private key.
#1 : The two primes used in this app are 19 and 29
#2 : The algorithm assumes that the input is 4 digits long and numerical when using the encrypt function.
#3 : The algorithm assumes that the input it 6 digits long and numerical when using the decrypt function.
#4 : This app uses the 'big-integer' library because javascript cannot accurately calculate large numbers by default.


- Unless terminated in accordance with this Clause, these User Terms constitute a legally valid and binding agreement between mobycabs and You and is perpetual in nature upon downloading the Application.
- You are entitled to terminate the User Terms at all times by permanent deletion of the Application installed on Your smart phone / tablet, thus disabling the use by You of the Application and the Service.
- These User Terms shall be automatically terminated without any notice or action, if the mobycabs services agreement as the case may be, entered by You with us is terminated.
- mobycabs is entitled to terminate the agreement at all times and with immediate effect for convenience without assigning any reason whatsoever. Additionally, mobycabs is entitled to terminate the agreement at all times and with immediate effect (by disabling Your use of the Application and the Service) if You: (a) breach any term of these User Terms, or (b) in the opinion of mobycabs, misuse the Application or the Service. mobycabs is not obliged to give notice of the termination of the agreement in advance. After termination mobycabs will give notice thereof in accordance with these User Terms.
- Termination of this agreement will not prejudice accrued rights of either mobycabs or You.
- Clauses 8 (Indemnification), 9 (Liability), 10, except 10(a), (Application License), 11 (Contents posted on Application), 12 (Term and Termination), 16 (Notices) and 18 (Applicable Law and Dispute Resolution) shall survive the expiry/termination of these User Terms in accordance with their terms


Bushiri suspends church services indefinitely as he remains barred from Botswana entry
by Staff ReporterEnlightened Christian Gathering leader, Prophet Shepherd Bushiri has instructed his Botswana churches to suspend church gatherings pending re registration of the church in the neighbouring country.
In a statement issued by ECG spokespersons Ephraim Nyondo, Maynard Manyowa and Terrance Baloyi the church said, “The indefinite suspension of services is to allow the finalisation of the re-registrative process to satisfy every compliance expectation.”
The church has urged congregants to visit South Africa for services.
Bushiri is expected to travel to Botswana to relaunch the church.
Source – Byo24


×
Home
Logout
Change Password
Dashboard
Campaigns
Surveys
News
Health Topics
Events
Dashboard
Surveys
Add Question


Press n or j to go to the next uncovered block, b, p or k for the previous block.
| File | Statements | Branches | Functions | Lines | |||||
|---|---|---|---|---|---|---|---|---|---|
| area.model.js | 14.02% | 23/164 | 0% | 0/62 | 0% | 0/33 | 14.02% | 23/164 | |
| assetType.model.js | 9.59% | 14/146 | 0% | 0/52 | 0% | 0/35 | 9.59% | 14/146 | |
| bus.model.js | 14.58% | 14/96 | 0% | 0/50 | 0% | 0/21 | 14.58% | 14/96 | |
| company.model.js | 10.68% | 25/234 | 0% | 0/40 | 0% | 0/86 | 10.68% | 25/234 | |
| controlroom.model.js | 26.32% | 20/76 | 0% | 0/14 | 0% | 0/8 | 26.67% | 20/75 | |
| device.model.js | 5.12% | 21/410 | 0% | 0/249 | 0% | 0/109 | 5.12% | 21/410 | |
| emp.model.js | 10.32% | 16/155 | 0% | 0/86 | 0% | 0/31 | 10.32% | 16/155 | |
| foodCart.model.js | 14.58% | 14/96 | 0% | 0/50 | 0% | 0/21 | 14.58% | 14/96 | |
| kpi.model.js | 46.67% | 14/30 | 0% | 0/6 | 0% | 0/6 | 46.67% | 14/30 | |
| network.model.js | 10.94% | 21/192 | 0% | 0/80 | 0% | 0/38 | 10.94% | 21/192 | |
| notification.model.js | 20.25% | 16/79 | 0% | 0/28 | 0% | 0/14 | 20.51% | 16/78 | |
| ota.model.js | 71.43% | 20/28 | 0% | 0/12 | 0% | 0/3 | 71.43% | 20/28 | |
| plant.model.js | 9.02% | 11/122 | 0% | 0/65 | 0% | 0/29 | 9.17% | 11/120 | |
| plantType.model.js | 20% | 4/20 | 0% | 0/6 | 0% | 0/6 | 20% | 4/20 | |
| privilegeUser.model.js | 27.78% | 15/54 | 0% | 0/18 | 0% | 0/10 | 27.78% | 15/54 | |
| provision.model.js | 15.22% | 7/46 | 0% | 0/16 | 0% | 0/7 | 15.22% | 7/46 | |
| refreshToken.model.js | 100% | 14/14 | 100% | 0/0 | 100% | 1/1 | 100% | 14/14 | |
| reporting.model.js | 2.74% | 22/804 | 0% | 0/290 | 0% | 0/145 | 2.78% | 22/791 | |
| rule.model.js | 7.44% | 16/215 | 0% | 0/75 | 0% | 0/37 | 7.44% | 16/215 | |
| user.model.js | 76.47% | 52/68 | 55.88% | 19/34 | 70% | 7/10 | 78.13% | 50/64 | |
| userauth.model.js | 37.1% | 23/62 | 8.33% | 2/24 | 27.27% | 3/11 | 37.1% | 23/62 | |
| zone.model.js | 6.3% | 22/349 | 0% | 0/132 | 0% | 0/71 | 6.32% | 22/348 |


Minus
Plus
Disc
Pause
>
Plasma
Bulb
iPhone
Battery
Empty
>
Full
Video
Paper
Smile
Picture
Reply
Screens
Play
Up
Down
Back
Forward
Camera
Profile
Mic
Home
HD
Temp
Off
Coffee


THE SCHOOL OF FLESH (ECOLE DE lA CHAIR, L') (Director: Benoit Jacquot; cast: Isabelle Huppert (Dominique), Vincent Martinez (Quentin), Vincent Lindon (Chris), Marthe Keller (Madame Thorpe), Dani=E8le Dubroux (Marine Thorpe), Francois Berleand (Soukaz), 1998-France)
Adapted from a novel by Yukio Mishima, THE SCHOOL OF FLESH tries to get us to believe in the sexual relationship and power play between a wealthy middle-aged Parisian woman Dominique (Huppert), who is in the fashion business. She falls madly in love with a much younger, Arabic lower-class boxer, bartender and bisexual hustler named Quentin (Martinez), and is willing to pay him to live with her. His great sex is supposed to be the reason she loses control of herself and can't be without him and will do anything for him, even as he acts nasty and repugnant and they have nothing in common that they can talk about, only sharing in an animal-like lust. This is asking a lot to believe, and though it is possible, it would have been more possible to believe if Quentin possessed some charm or something about him that would give us a clue that he was such a good catch, because he sure couldn't act, and since he is the focal point of all the attention, able to have his way with either men or women, we should also have felt this electricity generated on screen, instead of being forced fed by the director into believing something was happening when we couldn't see it.
Just what was supposed to be so compelling about this relationship, that would make it interesting ? I'm afraid I don't have the answer, since I can't find a thing about this relationship or this movie that kept me tuned into it, as I tended to drift out of the story somewhere in the middle, and just watched for the street scenes of Paris in the background, which I found to be more pleasurable viewing than the movie itself, even more erotic than the unerotic love scenes between the lovers, and this is being said by a big fan of Isabelle Huppert, who is usually quite engaging in the various roles she has played during her long career, but here it is embarrassing for me to watch her vacuous performance.
 But this does not stop this ill-conceived relationship from taking place, as they spend a night together, first in a power struggle to see who is boss, as she takes him to a fancy restaurant which he pretends not to like, and then he takes her to the arcades, which she honestly detests, this culminates in a night of lovemaking, where sex is acclaimed as the sole keeper of the relationship, in fact the sex is so good that he refuses payment for it, but she insists, wanting to keep him on her payroll, not willing to take the chance of losing such a good catch. The only problem with this, is that we didn't see how good the sex was, we had to take the word of the actors that it was so good, as dialogue came out of their mouths that is totally forgetable or regretable or whatever, but their love was not passionate or credible.
Once Quentin is paid for, that is his so-called debts are paid off by Dominque to Chris, who is probably his pimp, the story limply moves along, as some subtext to the already lame story is introduced, about wealthy friends of Dominque's meeting Quentin through Dominque and Quentin marrying their spoiled daughter with her parents' approval, that was unconvincingly done.
There is one line from the film that summed up how I really felt about what I was seeing, when at a fashion party for Dominque's wealthy Parisian fashion clients, Quentin tells her, "seeing all these rich people makes me want to puke." Quentin must be psychic or something, because he was just regurgitating what I was thinking about the characters in this film.
REVIEWED ON 5/11/99 GRADE: D
Dennis Schwartz: "Ozus' World Movie Reviews"
http://www.sover.net/~ozus
=A9 ALL RIGHTS RESERVED DENNIS SCHWARTZ
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


{% extends 'base.html' %} {% block title %}Create new dataset{% endblock %} {% block header %}{% endblock %} {% block content %}
Pack everything in archive, then upload.
Please place dataset in specified format into visartm/data/datasets folder, then select dataset:
Put vocab.txt in dataset folder.


Mr. Joseph Franco
Contact:
Email<EMAIL_ADDRESS>Phone:<PHONE_NUMBER>
M.S. Research: Biomimicry of Cilia Using Carbon Nanotubes
Education
- M.S. Aerospace Engineering, George Washington University, Washington, DC
- B.S. Engineering Science, City University of New York, Staten Island, NY
- A.A.S Mechanical Engineering Technology, City University of New York, Staten Island, NY
- Certificate Manufacturing Technology, City University of New York, Staten Island, NY
- Certificate Industrial Management, City University of New York, Staten Island, NY
Professional Work Experience
- Rockwell Collins – Flight Simulation and Flight Systems
- Applied Resources Inc. – Flight Simulation and Threat Analysis
- Lockheed Martin - Flight Simulation and Flight Systems
- Orange Technology – CAD plug-in development and Test Manager
- Fortner Research LLC – Scientific Software Development and QA Testing
- Louis Berger International – Civil Engineer, Mechanical and Structural Design


FairTest
Datasets
Bug Reports
Post Experiment
Discovering Unwarranted Associations in Data-driven Applications with FairTest
Available Datasets
{%- for item in tree1.children recursive %}
{{item.name}}
{{item.metadata}} {%- endfor %}
Upload Dataset
Post Experiment
*Dataset:
*Sensitive Feature:
Explanatory Features:
*Output Feature:
Investigation Type:
Fairtest Bug Reports
{%- for item in tree2.children recursive %}
{{item.name}}
{%- endfor %}


Warehouse Chief Reed:
Bah! Why does he always have to be so mysterious! Well, that hint should be sufficient. After all, who here is more popular or virtuous than me?
Gerald thinks that I should make more contributions, eh? Very well -- I think I know what will make him happy. Well done!
Have a prosperous journey, and give my respects to Balanki when you see him.


Copyright (c) Pedro Sena 1994
FILM TITLE: GOTHIC DIRECTOR: KEN RUSSELL COUNTRY: ENGLAND 1986 CINEMATOGRAPHY: MIKE SOUTHON MUSIC: THOMAS DOLBY CAST: Gabriel Byrne ( Byron ), Julian Sands ( Shelley ), Natasha Richardson ( Mary ), Myriam Cyr ( Clare ), Timothy Spall ( Polidori ) SUPER FEATURES: Different way of telling things, anyway.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
The stories surrounding the Byrons's and Shelley's that abound, and have been turned into many a myth, are looked at, here, as a link into the creation of the novel of Frankenstein. This film, is the story of the forces that created some literature, the best known of which is Mary Shelley's opus work.
But looking at these romantic writers, in the mountains of the Swiss alps, amidst many thunderstorms, is a bit more than one can really expect, under the hands of the director Ken Russell. The film starts and ends as a freak show. And in between, it REALLY is a freak show. But then, what price creativity, it seems...???
In a suggestive ambience, and amidst many creative binges, this acting ensemble manages to bring forth a bit of the feeling, and lines, that are so famous to many people in the world of literature. I doubt that anyone will appreciate the context through which any of this is done, specially the literati, but much of it has been documented, and told in many stories regarding these romantic heroes and their women, and their jet set life style. The fact remains, that both Byron and Shelley became two of the best poets of the 19th century, and that Mary Shelley's novel was magnanimous, and scared the wits of all of those writers.
The story, that became within the story, is basically what this film is about, and although the imagery is a bit on the weird side, it does kind bring about the many sides of things. Shelley is a bit of a flake, but inspired. Byron is serious, but his seriousness creates some lovely rhymes. Polidori, is a gay, disturbed person, a doctor who decries not having been able to become an alchemist. And the women, well, at first they were just the women. Mary had a long history of political intrigues, her parents having been famous for the women's rights movement in England. Clare was a rich girl having some fun.
 The film tries to bring out that point, but gets lost in the shuffle. We do end up looking at things as a bit of the jaded minds at work, all the time.
Gabriel Byrne as Byron, is interesting. Julian Sands as Shelley, comes off as a bit effeminate, and I wish that someone had infused a bit more of the poetical mind. Natasha Richardson as Mary Shelley is the most interesting of them all, in that she is the curious type amidst it all, and a bit of the nurse trying to keep everyone together.
In the hands of the director Ken Russell, this is an interesting endeavor, and probably one of his less celebrated orgies of visual garbage, but the film is a bit on the loony bin, kept there because the characters inside are a freak show by any standard, even if they were famous. It's a sad treatment, because there is much more literature, than mere words, that affected all of these people, in order to create the minds that changed literature at the time. This, is obviously missed in the hands of Ken Russell, or perhaps we don't care anymore, unless it is a freak show in the first place.
Interesting, but then again, only if the story of the times appeals to your sense of curiosity, as to how these creative forces came together and helped each other write. The one thing that the film does not clarify, is that Byron insisted that some of these meetings be done STRICTLY for writing purposes. The results are famous. The film will be forgotten.
3 GIBLOONS Member of the Internet Movie Critics Association
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Celebrities, co-workers and friends may claim they've lost body mass with cleansing drinks, but as with any fad health lifestyle, you'll most likely regain the body mass once you go back to eating your usual health lifestyle.
About Cleansing Drinks
Cleansing drinks, also referred to as detox drinks, make big claims without much evidence, according to health lifestyleitian Juliette Kellow. The theory is that the exposure to environmental toxins such as cigarette smoke, pesticides and processed foods causes health problems such as body mass gain, cellulite and fatigue, Kellow explains. Proponents of cleansing drinks say that ridding your body of these toxic substances not only helps you lose body mass, but also improves the look and tone of your skin, revitalizes energy levels and banishes bloating forever.
How They Help You Lose
The variety of cleansing drinks includes tea, juice and broth. Most of these drinks offer health lifestyle suggestions that incorporate a lengthy list of banned foods, such as wheat, dairy, meat, caffeine, sugar and all processed foods. These types of drinks and health lifestyle plans help you lose body mass by severely restricting your food and calorie intake.
Truth About Fast body mass Loss
When it comes to body mass loss, cleansing drinks often make big promises such as helping you lose 14 pounds in 10 days. When you lose body mass too quickly, it usually means you're losing water and muscle. This type of body mass loss not only sets you up to regain those lost pounds quickly, but also leaves you feeling drained of energy.
Cleansing and Healthy body mass Loss
Unless they are diseased, your liver and kidneys cleanse your body of toxins every day and eliminate those toxins through sweat, urine and feces. Eating a health lifestyle low in fat and high in fiber may help you lose body mass and keep you, along with your liver and kidneys, healthy. You can include cleansing drinks such as vegetable juices or green smoothies as part of your body mass-loss plan to up your nutrient intake. Keep smoothies low-cal by limiting your ingredients to greens, whole fruits and vegetables, suggests a 2013 article on smoothies published in U.S. News and World Report. To lose fat body mass, you should lose slowly at a rate of 1 to 2 pounds a week, according to FamilyDoctor.org.
Credits to: livestrong.com
Best Exercise for Women to Be Slim & Elongated
You want a svelte Hollywood body, but aren't sure which exercises will both elongate and slim. Take a cue from celebs by considering Pilates. From Reese Witherspoon to Anna Paquin to Cameron Diaz, female stars swear by this exercise program for giving their bodies a toned, lean look. Pilates slims while increasing flexibility, coordination, strengthening and endurance without adding muscle, creating body definition and the appearance of length.
Forward Spine Stretch
Stretching your spine gives the appearance of a longer torso and a slimmer waistline. The forward spine stretch is a staple move that uses no special equipment. Sit on the floor with your legs outstretched. Stretch your arms out over your legs. Imagine stretching your spine as you breathe in and sit up straight. Round your shoulders, neck and head as you reach past your toes and stretch forward while breathing out. Breathe in deeply, hold for one second, then slowly breathe out.  Breathe in as you sit up.
Spine Twist
Imagine the stretching action involved when wringing out wet clothing, this is similar to what happens during a spine twist. The twisting action works the back and stomach muscles stretching them so they elongate and slim the torso.  Breathe in and stretch your spine. As you breathe out, tighten your belly and twist from side to side. Breathe in as you come to center and breathe out on the twist. Only move your upper body; your legs and hips should stay put on the floor or mat.
Front Leg Pull
Besides an elongated trunk, another secret to appearing taller is having slender legs. Front leg pulls stretch the leg muscles, giving the legs a longer look.  While keeping your body straight, lift your hips and bottom from the floor. Lift one leg as high as you can without your hips moving. Hold this position for three seconds before lowering your leg and switching sides.
Reverse Leg Pull
Finish your brief Pilates slimming and elongation workout with a reverse leg pull to work the muscles of the stomach, chest and legs. Tighten your stomach and get into a pushup position. Choose a leg to begin with, lifting it 2 to 5 inches into the air. Hold your leg there for three seconds while pointing your toes toward the floor. Slowly lower your leg and repeat with the opposite leg. Continue the exercise, alternating legs.
By Catherine Field


Greenplum Workshop Presentations
Greenplum
Introduction
Data Distribution
Loading Data
Partitioning
Greenplum and Apache MADlib
PL/Container
PXF - Working with external data
Security - User authentication
Backup and Restore
GPText
Greenplum and PostgreSQL Differences
Greenplum and PostgreSQL
Partitioning in Greenplum and PostgreSQL
GP External Tables and PG Foreign Data Wrappers


abstract fun getCommandsForPrefix(prefix: String): ImmutableCommandMap
Gets an immutable map of alias to commands for the given prefix.
Return ImmutableCommandMap The immutable map of all aliases to commands under the given prefix.


Judges 9:32
Now therefore up by night, thou and the people that is with thee, and lie in wait in the field:


SpotMe is a mobile application where people can rent out private parking spaces, similar to AirBnb. Users searching for parking in
an area can use the application to reserve available spots near them.
We used Ruby on Rails for our backend framework due to the fact that we valued convention over configuration. Through Rails we were able to
create API endpoints to interact with out React Native front end. We created a secure encrypted authentication feature with BCrypt alongside Oauth implementation
with Auth0.
React Native
Through React Native we were able to write code for both iOS and Android devices. Also with
the large community of developers using React Native we were able to gain inspiration
from other projects. With Redux we were able to keep track of a persistant store throughout the
application.
GraphQL
To serve user data to the front end application, we wrote a GraphQL server built on ruby to act as a data layer over our rails backend, as an alternative to a more traditional RESTful API. We made this design choice because we knew that we were going to be building primarily in a native mobile environment where both efficiency in data fetching and flexibility in UI design are at a premium. Instead of having many rigid API endpoints that serve a fixed set of data, GraphQL allows for a single flexible endpoint with a powerful querying language accessible to client applications, effectively eliminating problems of over fetching or under fetching of data. This also allowed for uninhibited iteration of the front end without delay from any prerequisite modification of the backend, greatly increasing development speed of the application. The use GraphQL on the back end allowed us have a more performant and extensible application.
Expo
We used Expo Client as a development platform to build our mobile application. This allow us to develop for both native iOS applications as well as Android mobile application at the same time as well as provided for easier deployment.
Apollo
Our team used Apollo Client to interact with our GraphQL endpoint from our React Native mobile application. Apollo provides an abstracted network interface layer built on our front end to handle our application’s network request and response cycle. We choose to use Apollo because of the numerous optimizations and features Apollo utilizes, including data caching, subscriptions, and higher order UI components that are connected to the network interface. Our implementation of Apollo allowed us to take full advantage of the benefits of the GraphQL specification and sped up our development process.
PostgreSQL
Postgre is the relational database management system our team used to provide end users persisted data. PostgreSQL is a robust and greatly optimized technology that allows for highly relational data and database level protections against corrupted data. PostgreSQL was chosen by our team because it has an extensive track record as an extremely effective database technology as well as being well integrated with heroku, our preferred hosting provider for our back end application.


--- layout: post status: publish published: true draft: false sitemap: true title: Rare Galaxie 500 Tugboat singles up for auction author: display_name: Andy login: admin email<EMAIL_ADDRESS>url: http://www.grange85.co.uk date: 2018-09-02 imageurl: https://media.fullofwishes.co.uk/01-galaxie_500/sleeves/g500_tugboat-auction-2018-a.jpg categories: - galaxie 500 - damon & naomi tags: - tugboat - ebay ---
Damon & Naomi have put up for auction a mint/unplayed copy of Galaxie 500's first single Tugboat with all proceeds going to Beto O'Rourkes senate campaign.
From Damon & Naomi's personal archive, an original copy of Galaxie 500's debut 7" single "Tugboat," on blue vinyl. There were 500 numbered copies of this first pressing sold. This is an UNNUMBERED copy from Damon & Naomi's own collection, never offered for sale. This copy has never been played and although the sleeve shows its age from yellowing and a bit of creasing around the single, this is old new stock and therefore MINT/MINT. (But please note this is also sold AS IS, any flaws should be considered a part of this original artifact.)
We are putting this one-of-a-kind collector's item up for auction to benefit #BETOFORTEXAS, the campaign of Beto O'Rourke to become senator from Texas. As reported recently in the press, Beto was an indie rocker before he was a politician - and among the recordings that have surfaced is one of him playing drums on a cover of Galaxie 500's version of Jonathan Richman's "Don't Let Our Youth Go To Waste." Let's bond together and not let our country go to waste - end the corruption of politics by supporting campaigns that reject corporate money, like Beto O'Rourke's. And wherever you are, VOTE.
100% PURCHASE PRICE TO BE DONATED TO THE BETO FOR TEXAS CAMPAIGN. BE GENEROUS.
Galaxie 500 original Tugboat 7" single blue Mint/Mint TO BENEFIT #BETOFORTEXAS!
Another seller is auctioning TWO copies of Tugboat, also in aid of Beto O'Rourke's campaign:
2 Original copies of Galaxie 500's debut 7" single "Tugboat," #488/500 on Blue Vinyl, along with the Black Vinyl version. Paper Sleeves are bright white with no ripping, about as MINT/MINT as you’re ever going to find. These are historic items, certainly not to be played.
I am following in the footsteps of Damon & Naomi, placing these one-of-a-kind collector's item up for auction to benefit #BETOFORTEXAS, the campaign of Beto O'Rourke to become Senator from Texas.
I have the world’s largest collection of Galaxie 500 music and music memorabilia, with this election giving me cause to part with these two gems. Both records are resting in plastic sleeves, the record jackets are also housed in their own plastic sleeves, as it the altar rare and seldom seen AURORA RECORDS FLYER, also in mint condition.
100% PURCHASE PRICE TO BE DONATED TO THE BETO FOR TEXAS CAMPAIGN. BE GENEROUS.
I can not implore you enough to VOTE, and please encourage your friends to VOTE as well.
2 Galaxie 500 Tugboat 7" Singles Blue & Black Vinyl Flyer BENEFIT #BETOFORTEXAS


To start a full model build in the graphical user interface
1 Do one of the following:
• Select Model > Build Model.
• Click .
The Specify model build parameters dialog box appears.
2 From the Model Name list, select a model name. If you are building the model you just created, the model name appears.
3 From the Model Version list, do one of the following:
• Type a name for the new model version. By default, TODAY appears.
• Select an existing model version you want to build.
4 Click OK.
A status panel appears.
For information on the types of messages that appear in the Model Build Details, see Model Build Information.
5 To cancel building the model, click Cancel Build.
To resume building the model, see Resuming a Model Build.
If the model builds successfully, a line similar to the following appears:
After the model build process is complete, we recommend examining your log files to verify model completeness and correctness, and to analyze and correct any errors.
6 To save the build log, click Save Build Log.
A standard save dialog box appears.
7 Select the file type you want to save the build log as (XML or TXT file).
8 Choose a directory and name for the build log.
9 Click Save.
10 To close the model build log and remove the model from the Builds in progress list in the Navigator panel, click Close.


Qt Linguist Manual
Qt provides excellent support for translating Qt C++ and Qt Quick applications into local languages. Release managers, translators, and developers can use Qt tools to accomplish their tasks.
Release managers bear the overall responsibility for the release of the application. Typically, they coordinate the work of developers and translators. They can use the lupdate tool to synchronize source code and translations and the lrelease tool to create run-time translation files for use by the released application.
Translators can use the Qt Linguist tool to translate text in applications. No computer knowledge beyond the ability to start a program and use a text editor or word processor is required.
Developers must create Qt applications that are able to use translated text. They should also help translators identify the context in which phrases appear. Developers can use tutorials to learn about their tasks.
For more information about the supported languages and writing systems, see Internationalization with Qt.


Things to do with Gulp & Node
Welcome to expressBuilder
This package is for advanced developers who know their way around task managers and npm, and just want a quick launching point. This builder is also brilliant for new and eager up-starts who are eager for a way to get their foot in the door with useful and worth-while open-sourcey skills, learning how to build and manage scaleable HTML5 JavaScript applications using a terminal, node, and gulp alone.
Its up to you if you need to access files through an IDE as an extra step. Its easy enough to network share the project dir that your building, and edit/build from your IDE across some network. Its just easy. You will have to either skip to the Easy setup
section from here, or Read on to continue, depending on your level of patience. Tap-on die-hard coders!
Versatility is key since you never know which direction technology is leading, to which type of application you will build next
Using this builder gives you a way to fully control what type of application, and to help you get it out the door fast. It doesn't matter what tools you want to choose from to do the job. Using npm only is encouraged. This is an anti-bower-need, anti-grunt-need setup to keep things really slim. Any projects GitHub repo URL can simply be added into the gulp task, called "vendor", whether its a RUBY / readthis app, a raw bare-bones framework that your creating in any design pattern, or an Angular/Redux masterpiece, this is a great launching point.
Examples aim to help you rapid start a mainstream HTML5 application
Kick off right away with a working site, with CRUD. The main example uses Express/Mongo with MongooseODM. The site includes a database, with a RESTful API/CRUD.
Live reload
One of the primary features that is core to continue to function flawlessly on all builds of expressBuilder is Live reload. Live reload is integrated into gulp-live-server
so that a watch can be set both on the src build files, and again on the build dir so that after they are compiled they can come up on save (less than a second on all devices). This is superb when your developing RWD, CSS and TEMPLATE authoring, even client and server-side js. This takes efffect on every device/browser opened on the LAN, in a second, by the press of save on your IDE, or :w on vim. This works without browser extensions allowing you to immediately reap from any browsing device.
Easy setup
- git clone into your projects dir onto a machine that has a working nodejs installation configured and ready to run
npm
(can be through a terminal, so long as the port for node is available, currently that is port 3003, you can change it) - cd to the app root dir, run
npm install
First steps for orientation
- run
gulp all
- open any device browsers, browse to url (http://ip:port) where your running gulp, e.g. (http://<IP_ADDRESS>:3003) or (http://sharedhosting.com:3001) etc..
- see that the application loads, be excited to test Live Reload working next!
First steps for development
- branch the app, so you can start development
- cd to the app dir,
gulp all
(reducing togulp
) until you get a clean output and browser refresh, then commit these core changes - Peek and orient yourself with the client-side source files
- cd to the
src/
see models/controllers/views
- Edit and save a file, watch gulp, and device output. (adjust any gulp tasks to your likings)
- This is the amazing part, watch your page come back to life right away as the gulp task brings it back online. The application automatically reaches back out to its mother-ship on all devices that still have it loaded!!
- cd to the
- Peek at the middle-ware
index.js
file in the app root which bootstraps the app - Peek at the back end node server in bin/
Next steps
Changing out or adding in technologies
- branch the app for your new core technologies
- adjust
package.json
file - run
npm install
- edit gulp tasks until the build makes you satisfied, commit the project
Support or Contact
Having trouble with Pages? Check out our documentation or issue.


Original message: "{{ message }}"
Computed reversed message: "{{ reversedMessage }}"
{{ fullName }}
Ask a yes/no question:
{{ answer }}


Our team is happy to answer all of your questions. Fill out the form and we’ll be in touch as soon as possible.


1- Band math and manipulation with HDF-EOS data in R is a pain in the ear. e.g. to read a specific band (e.g. band 1 from MODIS MCD43A4) into R, one has to:
1 bn1 <- "MOD_Grid_BRDF:Nadir_Reflectance_Band1"
2 b01 <- raster(readGDAL(paste("HDF4_EOS:EOS_GRID:","02_HDF_2_mband_geotiff/hdf_in /MCD43A4.A2001033.hdf",":", bn1, sep = "")), silent=T)
2- There are dedicated tools to work with HDF-EOS data formats..
So, we agree that it would be nice to have a neat way to convert whole HDF-EOS files as multi-band raster objects in R. My solution is to write an R function that can stack all the dimensions of a batch of input HDF-EOS into multi-band GeoTIFFs for which R (and any other sensible data language or GIS) has excellent support.
Just to get a feel of the data used in this post, we can plot the image band read in above and overlay an outline of our region of interest (ROI) as follows:
1 #Plot band 1 from MCD43A4.A2001033.hdf
2 par(mar=c(0,0,1,0))
3 plot(b01, axes=F)
4
5 #Import Tsavo ROI shapefile
6 tsavo_diss <- readShapePoly(fn="02_HDF_2_mband_geotiff/tsavo_park_diss.shp",
7 proj4string=CRS("+proj=longlat +datum=WGS84"))
8
9 #Transform Tsavo CRS to match b01
10 tsavo.sin <- spTransform(x=tsavo_diss, CRSobj=b01@crs)
11
12 #Overlay Tsavo ROI
13 plot(tsavo.sin, add=T, asp=1, lwd=2)
14 title("Figure 1: Tsavo ROI within MODIS HDF band 1", line=-1)
We’ll use the same HDF data as that in this post. Load the required libraries as shown below.
1 library("raster")
2 library("rgeos")
3 library("maptools")
4 library("maps")
5 library("rgdal")
Requirements:
An R installation (obviously)
A UNIX shell e.g. BASH. Windows users can install & run BASH using CYGWIN
Next we write a function “hdf2mband” to do the work for us. It contains 4 args:
“in.dir”: path to directory with input HDF files to be processed
“out.dir”: output directory
“prm.path”: path to parameter file. We’ll use the same parameter file as the one here, but with line 10 ending in “.tif” instead of “.hdf”.
nbands: number of spectral bands in your HDF-EOS data. This argument controls how the the output bands are aggregated into multi-band rasters. That means the “nbands” value should be equal to the number of 1’s in the arg “SPECTRAL_SUBSET” of the parameter file. Otherwise expect unexpected behaviour.
And behold, the function:
1 hdf2mband <- function(in.dir, prm.path, out.dir, nbands){
2
3 INLIST <- list.files(path=in.dir, full.names=T)
4 INNAMES<- list.files(path=in.dir, full.names=F)
5
6 #Manufacure output names with .tif extension
7 OUTNAMES <- INNAMES
8 for (i in 1:length(OUTNAMES)){OUTNAMES[i] <- gsub(pattern=".hdf", x=OUTNAMES[i], replacement=".tif")}
9
10 for (i in 1:length(INLIST)){
11
12 #Call mrt to subset and reproject from sinusoidal to geographic CRS
13 system(
14 command=paste(paste("cd ", out.dir, "&&", sep=""),
15
16 #Write hdf file to text file
17 paste("echo ", INLIST[i], " > ", out.dir, "/mosaicinput.txt","&&", sep=""),
18
19 #Run mrt mosaic and write output to hdf file
20 paste("mrtmosaic -i ", out.dir, "/mosaicinput.txt -o ", out.dir,
21 "/mosaic_tmp.hdf","&&", sep=""),
22
23 #Call resample
24 paste("resample -p ", prm.path, " -i ", out.dir, "/mosaic_tmp.hdf -o ",
25 out.dir, "/", OUTNAMES[i], "&&",sep=""),
26
27 paste("exit 0"), sep=""), intern=T
28 )
29 print(paste("Done processing:", INNAMES[i]))
30 }
31
32 #Clean up working files
33 file.remove(paste(out.dir,"/mosaic_tmp.hdf", sep=""))
34 file.remove(paste(out.dir,"/mosaicinput.txt", sep=""))
35 file.remove(paste(out.dir,"/resample.log", sep=""))
36
37 #Aggregate single bands to multiband rasters
38 band.paths <- list.files(path=out.dir, full.names=T)
39
40 repeat{
41
42 stack.i <- stack()
43
44 for (i in 1:nbands){stack.i <- addLayer(stack.i, i=read.ras(x=band.paths[i]))}
45
46 writeRaster(x=stack.i, filename=paste(out.dir, "/",
47 OUTNAMES[1], sep=""), format="GTiff", overwrite=TRUE)
48 file.remove(band.paths[1:nbands])
49
50 #Truncate done jobs
51 band.paths <- band.paths[-(1:nbands)]
52 OUTNAMES <- OUTNAMES[-1]
53
54 if(length(band.paths)==0)
55 break
56 }
57 }
Executing hdf2mband processes the input HDF-EOS dataset as per the settings in the parameter file and arguments supplied to “hdf2mband”:
1 hdf2mband(in.dir=hdfin, nbands=7, prm.path=prm.path, out.dir=out.dir)
1 mb_ras <- stack("02_HDF_2_mband_geotiff/mband_out/MCD43A4.A2014177.tif")
1 nlayers(mb_ras)
## [1] 7
1 NAvalue(mb_ras) <- 32767
1 plot(mb_ras)
One way to visually validate the output would be to plot an RGB composite of one of the output GeoTIFFs like the one above. How to do that will be the subject of my next post =).
R documentation on libraries used


Version 1.11, bugfixes
06:06 PM on Monday, July 28, 2003
Changes in this release:
2003-07-28 17:56 rubys * src/rssvalid/base.py: Check attributes for valid namespaces 2003-07-23 08:49 f8dy * testcases/rss/must/missing_namespace_attr_only.xml: added test case for missing namespace used only in attribute 2003-07-20 13:48 rubys * src/rssvalid/entry.py: Validate that titles are present 2003-07-20 13:44 rubys * src/rssvalid/entry.py, src/rssvalid/item.py, src/rssvalid/logging.py, src/rssvalid/validators.py, testcases/pie/must/entry_id_duplicate_value.xml, testcases/rss/must/guid_duplicate_value.xml: Detect duplicate ids and guids 2003-07-20 12:35 rubys * src/rssvalid/entry.py, testcases/pie/must/entry_issued_multiple.xml, testcases/pie/must/entry_modified_multiple.xml: Ensure that issued and modified are present exactly once 2003-07-19 20:25 rubys * src/rssvalidtest.py: Search for *any* instance of a matching class/params in the log 2003-07-19 18:25 f8dy * src/rssvalidtest.py: fixed bug in test case suite runner, if an element in the expected params didn't match the expected value, it would set the failure message but not raise the appropriate exception, so rssvalidtest.py would claim that certain test cases passed when they didn't (this affected 7 test cases out of 700) 2003-07-19 17:15 f8dy * src/rssvalid/logging.py, src/rssvalid/i18n/en.py, testcases/pie/must/entry_id_duplicate_value.xml, testcases/rss/must/guid_duplicate_value.xml: added tests and logging classes for duplicate guid/id values within a feed (thanks AaronSw for this idea) 2003-07-16 15:47 rubys * src/rssdemo.py: Remove debug statement 2003-07-12 20:32 rubys * src/rssvalid/validators.py: Don't bother checking for local/UTC unless the date is valid... 2003-07-11 19:13 rubys * src/.cvsignore: Ignore python compiled outputs 2003-07-11 13:47 rubys * src/rssvalid/logging.py: not-inline can only be a warning as one can never be totally sure... 2003-07-11 12:36 rubys * src/rssvalid/content.py, testcases/pie/must/entry_content_is_inline.xml: Attempt to detect improper use of inline xml 2003-07-10 17:16 rubys * src/: rssdemo.py, rssvalid/content.py: Get rssdemo back on its feet... 2003-07-10 17:02 rubys * src/rssvalid/content.py: Verify base64 and escaped


WITNESS LIST Urban Affairs Committee April 23, 2003-10:30A HB 1288 For: O'Bannon, Don T. (Dallas Fort Worth International Airport) HB 1632 For: Abitz, Carole (Southwest Community Association) Barbolla, Patrick A. (Self) Cisnero, Louis (Southwest I.S.D.) Gonzales, Maria E. (Self) Henning, Father Phillip (Self) Jack, Darrell G. (Self) Magallanez, Maria (Self) Magill, Albert E. (Self) Sugrue, Mike (Simpson Housing Solutions, LLC) Against: McIver, Diana (Self) Ocanas, Reymundo (Self and TX Assoc of CDCs) On: Henneberger, John (Tx Low Income Housing Information Service) Moore, Wayne (American Housing Foundation) Stewart, Brent (Self and Trammell Crow Residential) HB 1643 For: DeLord, Ron (Combined Law Enforcement Associations of Texas; Houston Police Officers Union) HB 2541 For: Barbolla, Patrick A. (Self) Magill, Albert E. (Self) Against: Henneberger, John (Tx Low Income Housing Information Service) Talerico, Jeanne (Tx Assn of Local Housing Finance Agencies) On: Ocanas, Reymundo (Self and TX Assoc of CDCs) HB 3575 For: Allen, Joe B. (City of Katy) Callender, Doyle G. (City of Katy-Mayor) SB 264 For: Chatham, Donna (Association of Rural Communities in TX) Clark, Michael (Self) Garvin, John (Texas Affiliation of Affordable Housing Provider (TAAHP)) Henneberger, John (Tx Low Income Housing Information Service) Langendorf, Jean (United Cerebral Palsy of Texas) Lee, William J. (Self) McIver, Diana (Self) Mintz, David (Texas Apartment Assoc.) Sugrue, Mike (Simpson Housing Solutions, LLC) Talerico, Jeanne (Texas Assn of Local Housing Finance Agencies) SB 284 For: Chatham, Donna (Association of Rural Communities in TX) Enoch Moore, Dawn (Board of TSAHC) Henneberger, John (TX Low Income Housing Information Service) On: Moore, Wayne (American Housing Foundation) Ocanas, Reymundo (Self and TX Assoc of CDCs)


a carpark
[0, 10]
|
a warehouse
[1, 10]
|
Jelly Avenue
[2, 10]
|
a factory
[3, 10]
|
Newport Alley
[4, 10]
|
Kilpatrick Cinema
[5, 10]
|
Sowth Road
[6, 10]
|
Nositer Crescent
[7, 10]
|
the Pilling Building
[8, 10]
|
Applegate Alley
[9, 10]
|
Membry Grove
[0, 11]
|
Bodilly Alley Railway Station
[1, 11]
|
Smythe Alley School
[2, 11]
|
wasteland
[3, 11]
|
Gillow Drive
[4, 11]
|
Meacham Bank
[5, 11]
|
the Carse Building
[6, 11]
|
Murtaugh Towers
[7, 11]
|
Lowndes Square
[8, 11]
|
Club Santler
[9, 11]
|
Henslow Street School
[0, 12]
|
Warley Alley
[1, 12]
|
Beard Place
[2, 12]
|
a warehouse
[3, 12]
|
Gazzard Avenue School
[4, 12]
|
the Frauley Building
[5, 12]
|
Club Whitelock
[6, 12]
|
Milard Lane
[7, 12]
|
Date Row Railway Station
[8, 12]
|
a warehouse
[9, 12]
|
a carpark
[0, 13]
|
Ladd Park
[1, 13]
|
the Hoddinott Building
[2, 13]
|
the Pollard Building
[3, 13]
|
Maddaford Square
[4, 13]
|
the Millett Building
[5, 13]
|
Havercroft Park
[6, 13]
|
the Stretchbury Monument
[7, 13]
|
the Wadden Building
[8, 13]
|
the Claines Building
[9, 13]
|
Burke Place
[0, 14]
|
the Donaldson Building
[1, 14]
|
Minall Lane
[2, 14]
|
the Ashcroft Hotel
[3, 14]
|
Garson Towers
[4, 14]
|
the Martland Museum
[5, 14]
|
Botreux Bank
[6, 14]
|
Limberye Walk
[7, 14]
|
Club Tarring
[8, 14]
|
a junkyard
[9, 14]
|
Walrond Place Fire Station
[0, 15]
|
a factory
[1, 15]
|
Grist Crescent Railway Station
[2, 15]
|
the Gilesi Building
[3, 15]
|
Hecks Street
[4, 15]
|
Esgar Auto Repair
[5, 15]
|
a junkyard
[6, 15]
|
Ratcliffe Street
[7, 15]
|
the Whitlock Monument
[8, 15]
|
Hackwell Drive
[9, 15]
|
a factory
[0, 16]
|
a junkyard
[1, 16]
|
Withy Walk
[2, 16]
|
Row Drive
[3, 16]
|
Cleeves Way
[4, 16]
|
the Gatley Building
[5, 16]
|
a junkyard
[6, 16]
|
Melbourne Square Fire Station
[7, 16]
|
Cosway Bank
[8, 16]
|
the Purt Building
[9, 16]
|
St Cyprian's Church
[0, 17]
|
St Mary's Church
[1, 17]
|
Wyatt Cinema
[2, 17]
|
a carpark
[3, 17]
|
Monica General Hospital
[4, 17]
|
a carpark
[5, 17]
|
Gerrard Place Police Dept
[6, 17]
|
the Speak Motel
[7, 17]
|
Meaden Bank
[8, 17]
|
St Linus's Hospital
[9, 17]
|
the Grace Arms
[0, 18]
|
Buffery Street
[1, 18]
|
wasteland
[2, 18]
|
the Pinfield Building
[3, 18]
|
Weakley Square
[4, 18]
|
the Carslake Museum
[5, 18]
|
the Willia Hotel
[6, 18]
|
a carpark
[7, 18]
|
wasteland
[8, 18]
|
wasteland
[9, 18]
|
Flew Lane School
[0, 19]
|
a junkyard
[1, 19]
|
Wyche Bank
[2, 19]
|
the Vellacott Museum
[3, 19]
|
St Dismas's Hospital
[4, 19]
|
Owers Way
[5, 19]
|
Hemburrow Library
[6, 19]
|
the Dudoc Hotel
[7, 19]
|
a warehouse
[8, 19]
|
the Cavendish Building
[9, 19]
|
|
Menu
City Map
Find Location
Route Finder
World View
Map Mirror
|


IDE Controller
A description of an IDE interface for a microcontroller
How to connect an IDE disk to a microcontroller using an 8255
By Peter Faasse
faasse AT nlr DOT
nl
Some time ago I have dropped that I had connected an IDE harddisk
to one of my micro-controllers. This has provoked a response that
I had not foreseen. Since that day I have received some one to two
e-mails a day requesting more details about what I had done. At
first I have mailed a more or less cryptic description of my
interface to some of the requestors. That only resulted in more
e-mail asking for more details. As it seems some people out there
are really interested in how my contraption is made. In this
description I will attempt to satisfy the information-hunger of
all you out there who's appetite I seem to have awakened.
This interface first came to my mind when I re-read some old, old
computer magazines. In one of them, the German magazine called
C't there was a short description of how and IDE interface is put
together. This is in the November issue of 1990. The article
describes an IDE interface for both the PC-XT(!) and the PC-AT.
The circuit diagrams of the article indicate that the hardware of
an IDE interface is in fact very simple. It is essentially a data
bus extension from the PC-AT bus to an IDE device. For a PC the
hardware comes down to some bus buffers and some decoding. When a
disk is connected as an IDE device the PC-AT still 'sees' the
old-type control registers of the ancient MFM disk controller. In
the article the entire interface is implemented using simple TTL
chips. The main problem in a PC seems to be how to keep the
harddisk interface and the floppy interface from colliding on
some register addresses. If the IDE interface is implemented
based on some controller system this is of course no problem.
>From a controller point of view an IDE interface could be
described as a set of I/O ports. The IDE interface has a 8/16
bits I/O bus, two /CS lines, a /WR and /RD line, three address
bits and one interrupt. In this description I assume the most
traditional IDE interface. In later IDE interfaces a series of
nice so-called PIO modes where added. These PIO modes add things
like a ready line, DMA facilities and higher speed data
transfers. As you read on you will understand that I only use the
so-called PIO mode 0. This is the slowest communication modus on
an IDE bus. It is also the easiest one to implement. The data bus
on an IDE interface is used mostly for 8-bits transfers. Only the
real disk data reads and writes use the 16-bits bus in full
width. You COULD even implement an IDE interface with an 8-bits
only data bus. That would mean that you use only half the disk
capacity (the lower bytes of the 16-bits-wide bus) but that
should work.
When scanning the net I did find an implementation of an IDE
interface for 8-bit controllers. This interface was for a (hope I
have this correct..) CoCo bus. It was implemented in TTL, just
like the magazine's interface. The main idea was that whenever a
(16-bits) word was read from the IDE bus the upper 8 bits where
stored in a latch. The controller could retrieve them from the
latch later. Writing to the IDE bus was implemented in the same
manner. The IDE bus read/write cycles where in fact simple bus
read and write cycles. At first I was about to copy this design.
When thinking about it I thought that this TTL design was too
complex for what I wanted to do. You need quite some TTL to
implement a 16-bits read/write I/O port in TTL on an 8-bits
controller.
When implementing a 16-bits I/O port all you need is a
bidirectional I/O port and some control bits to generate the /RD,
/WR etc... That is when the 8255 came in view. An 8255 has 3
8-bits I/O ports. It can be switched from output to input and
back under software control. I used 2 of the 8-bits I/O ports for
the data path and use port to generate the IDE control signals.
The 74HC04 came into the design later. Once I had the controller
and the 8255 strapped together with the IDE connector and a disk
I found out that the 8255 has a nasty trait. Whenever you switch
the I/O modus of the chip it resets ALL its memory bits. That
includes ALL output signals too. For the data bus that is not so
much of a problem. The control signals get a real shake when this
happens. In particular: The /RESET line of the interface is
activated. That makes all control of a disk on this interface
impossible (the disk gets a reset at all kinds of odd
moments...). I have solved this by simply inverting all the
control signals from the 8255 to the IDE bus. When the modus of
the 8255 is switched all outputs of the chip go to '0'. That
means that all the (low-active) control signals are made inactive
by the inversion. That is -in fact- the state where I have them
already when I'm about to change the 8255's modus.
At this point I would like to present a nice circuit diagram to
show what the contraption I have made looks like. Unfortunately I
know of no easy way to do that. This beautiful net is a marvel
when it comes down to transporting text, graphics is another
matter. A GIF picture would do the work; I do not have any means
to produce one. Some schematics drawing package could give a good
picture; I have no schematics package and I am not sure what
package would be universal enough to be useable by everyone. So I
am restricted to a more or less cryptic ASCII description of the
hardware. Please, the cryptology is out of need, not out of my
liking. Well here it comes:
1) The IDE bus pin connections themselves:
The IDE connector itself is a 40-pins two-row connector:
1 39 odd-numbered pins
....................
....................
2 40 even-numbered pins
In an IDE bus this connector is used as follows:
pin no: name: function:
--------- ------- ---------
1 /RESET Al low signal level on this pin will reset
all connected devices
2,19,22 GND ground, interconnect them all and tie to
24,26,30 controller's ground signal
40
3,5,7,9,11 D7..D0 low data bus, 3=D7 .. 17=D0. This part of
13,15,17 the bus is used for the command and
parameter transfer. It is also used for
the low byte in 16-bits data transfers.
4,6,8,10 D8..D15 high data bus, 4=D8 .. 18=D15. This part
12,14,16,18 of the bus is used only for the 16-bits
data transfer.
20 - This pin is usually missing. It is used to
prevent mis-connecting the IDE cable.
21 and /IOREADY I do not use or connect to this pin. It is
27 there to slow down a controller when it is
going too fast for the bus. I do not have
that problem...
23 /WR Write strobe of the bus.
25 /RD Read strobe of the bus.
28 ALE Some relic from the XT time. I do not use
it, and I'm not the only one...
31 IRQ Interrupt output from the IDE devices. At
this moment I do not use it. This pin
could be connected to a controller to
generate interrupts when a command is
finished. I have an inverter ready for
this signal (I need a /IRQ for my
controller, an IRQ is of no use to me..)
32 IO16 Used in an AT interface to enable the
upper data bus drivers. I do not use this
signal. It is redundant anyway, the ATA-3
definition has scrapped it.
34 /PDIAG Master/slave interface on the IDE bus
itself. Leave it alone or suffer
master/slave communications problems. Not
used (or connected to ANYTHING) by me.
35 A0 Addresses of the IDE bus. With these
33 A1 you can select which register of the IDE
36 A2 devices you want to communicate.
37 /CS0 The two /CS signals of the IDE bus. Used
38 /CS1 in combination with the A0 .. A2 to select
the register on the IDE device to
communicate with.
39 /ACT A low level on this pin indicates that the
IDE device is busy. I have connected a LED
on this pin. The real busy signal for the
controller I get from the IDE status
register.
Input/Output status of these signals:
The signals:
A0, A1, A2, /CS0, /CS1, /WR, /RD and /RESET are always outputs
from the controller to the IDE bus.
The signals:
IRQ and /ACT are always outputs from the IDE bus to the
controller (IRQ can be tri-stated by the IDE device when two
devices are connected to the IDE bus.) /ACT can drive a LED (with
resistor of course).
The signals:
D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14,
D15 are bi-directional. They are output from the controller to
the IDE bus when writing, output from the IDE device to the
controller when reading information.
2) The 8255 <-> controller
The 8255 is connected to the controller by means of its 8-bit
data bus, the A0 and A1 lines and the /CS, /WR and /RD lines. I
can not give that much info about this. If in doubt: consult the
8255 data sheet. This part depends as much on the controller you
use as anything else. I have the 8255 connected to my controller
(HD63B03R1CP, a Hitachi 6803-derivate..) as an I/O port. Perhaps
some of you have seen my previous e-mails asking for the pinout
of the HD63B03R1CP (52-pins PLCC) chip, well I did find it (Some
department of my work had an old Hitachi databook, voila the
pinout was there). My address decoding puts the 8255 on address
0500H to 0503H in the controller's memory map. That may help if
you decide to try to make sense of my software listing. On this
point you are on your own as to the how to connect a 8255 to your
controller.
3) 8255 <-> IDE connector
I have used the 8255's port A to generate the IDE bus control
signals. Some of these control signals pass through an inverter
before I connected them to the IDE connector itself. All of these
signals are always used as output from the 8255 to the IDE bus.
When a control signal is inverted the 8255 pin is connected to
one of the inputs of the 74HC04 and the (corresponding) output of
the 74HC04 is connected to the IDE bus connector.
The ports B and C are used as the 16-bits data bus. There are no
special things in this, it's just a simple interconnection of the
8255 I/O pins to the D0..D15 pins of the IDE connector.
I have connected this as follows:
PA.7 --> inverter --> IDE bus /RESET
PA.6 --> inverter --> IDE bus /RD
PA.5 --> inverter --> IDE bus /WR
PA.4 --> inverter --> IDE bus /CS1
PA.3 --> inverter --> IDE bus /CS0
PA.2 --> IDE bus A2
PA.1 --> IDE bus A1
PA.0 --> IDE bus A0
PB.7 <--> IDE bus D7
PB.6 <--> IDE bus D6
PB.5 <--> IDE bus D5
PB.4 <--> IDE bus D4
PB.3 <--> IDE bus D3
PB.2 <--> IDE bus D2
PB.1 <--> IDE bus D1
PB.0 <--> IDE bus D0
PC.7 <--> IDE bus D15
PC.6 <--> IDE bus D14
PC.5 <--> IDE bus D13
PC.4 <--> IDE bus D12
PC.3 <--> IDE bus D11
PC.2 <--> IDE bus D10
PC.1 <--> IDE bus D9
PC.0 <--> IDE bus D8
I have put a 10 KOhm pull-down resistor from the IDE bus IRQ to
ground. The IDE IRQ signal is also connected to the input of the
(one-remaining) inverter. The output of the inverter is connected
to the controller's /IRQ input. As you can see, I do have the
hardware for interrupts here, I do not use it. I tried to use it,
but got unexplained errors (I probably did something wrong, I
have not yet found what)..
|\
IDE IRQ o-----+----+ >o--------o CPU's /IRQ
| |/
+++
| |
| | 10 KOhm
+++
|
|
-+- GND
///
The IDE /ACT signal is connected to a 330 Ohm resistor, the other
end of the resistor is connected to a LED, the other end of the
LED is connected to the +5 Volts. This gives a nice LED
indication of when I'm using the disk. This is -as far as I know-
the same hardware a PC uses to produce the disk busy LED you may
find on the front of a PC box.
330 Ohm
+-------+ LED
IDE /ACT o-----+ +------|<-----o +5 Volts
+-------+
So much about the hardware of the IDE interface. I hope that is
all clear now. If I have been less than clear, please ask. If I
have made mistakes, please complain (I said complain, NOT FLAME!!!).
The IDE device appears to the IDE bus as a set of registers. The
register selection is done with the /CS0, CS1 and A0, A1, A2
lines. Reading/writing is done with the /RD and /WR signals. I
have used the 8255 port A signals to make read/write cycles on
the IDE bus. What I do is the following:
read cycle:
1) put the port B and C of the 8255 in input modus.
2) set an address and /CS0 and /CS1 signal on the port A of the
8255.
3) activate the /RD of the IDE bus by setting the equivalent bit
in the port A of the 8255.
4) read the data from port B (and C) of the 8255.
5) deactivate the /RD signal on the IDE bus by resetting the
equivalent bit of port A of the 8255.
write cycle:
1) put the port B and C of the 8255 in output modus.
2) set an address and /CS0 and /CS1 signal on the port A of the
8255.
3) set a data word (or byte) on port B (and C) of the 8255.
4) activate the /WR of the IDE bus by setting the equivalent bit
in the port A of the 8255.
5) deactivate the /WR signal on the IDE bus by resetting the
equivalent bit of port A of the 8255.
The only difference between 8 bits and 16 bits transfers is the
following:
- In an 8-bit transfer I use only the port B of the 8255 for data
transfer. When writing I put data only on the lower byte of the
IDE bus; the upper byte is ignored anyway by the IDE device.
When reading I read only port B of the 8255; I never even
bother to look at the upper byte.
- In an 16-bit transfer I read/write to both the upper and the
lower byte of the IDE bus; thus using both port B and port C.
The IDE device appears as the following registers:
/CS0=0, /CS1=1, A2=A1=A0=0: data I/O register (16-bits)
This is the data I/O register. This is in fact the only 16-bits
wide register of the entire IDE interface. It is used for all data
block transfers from and to the IDE device.
/CS0=0, /CS1=1, A2..A0=001B: This is the error information
register when read; the write precompensation register when
written. I have never bothered with the write precompensation at
all, I only read this register when an error is indicated in the
IDE status register (see below for the IDE status register).
/CS0=0, /CS1=1, A2..A0=010B: Sector counter register. This
register could be used to make multi-sector transfers. You'd have
to write the number of sectors to transfer in this register. I
use one-sector only transfers; So I'll only write 01H into this
register. I do use this register to pass the parameter the
timeout for idle modus command via this register.
/CS0=0, /CS1=1, A2..A0=011B: Start sector register. This register
holds the start sector of the current track to start reading/
writing to. For each transfer I write the start sector in this
register. For some fancy reason the sector count starts at 1 and
runs up to 256, so writing 00H results in sector number 256. Why
that is done is a mystery to me, all other counting in the IDE
interface starts at 0.....
/CS0=0, /CS1=1, A2..A0=100B: Low byte of the cylinder number.
This register holds low byte of the cylinder number for a disk
transfer.
/CS0=0, /CS1=1, A2..A0=101B: High two bits of the cylinder
number. The traditional IDE interface allows only cylinder
numbers in the range 0..1023. This register gets the two upper
bits of this number. I write the cylinder number's upper two bits
into this register before each transfer.
/CS0=0, /CS1=1, A2..A0=110B: Head and device select register. The
bits 3..0 of this register hold the head number (0..15) for a
transfer. The bit 4 is to be written 0 for access to the IDE
master device, 1 for access to the IDE slave device. The bits
7..5 are fixed at 101B in the traditional interface.
/CS0=0, /CS1=1, A2..A0=111B: command/status register. When
written the IDE device regards the data you write to this
register as a command. When read you get the status of the IDE
device. Reading his register also clears any interrupts from the
IDE device to the controller.
/CS0=1, /CS1=0, A2..A0=110B: 2nd status register/interrupt and
reset register. When read this register gives you the same status
byte as the primary (/CS0=0, /CS1=1, A2..A0=111B) status
register. The only difference is that reading this register does
not clear the interrupt from the IDE device when read. When
written you can enable/disable the interrupts the IDE device
generates; Also you can give a software reset to the IDE device.
/CS0=1, /CS1=0, A2..A0=111B: active status of the IDE device. In
this register (read-only) you can find out if the IDE master or
slave is currently active and find the currently selected head
number. In a PC environment you can also find out if the floppy
is currently in the drive. I have not used this register yet.
Some of these registers have bitwise meanings. I'll elaborate on
that here:
head and device register:
A write register that sets the master/slave selection and the
head number.
bits 3..0: head number [0..15]
bit 4 : master/slave select: 0=master,1=slave
bits 7..5: fixed at 101B. This is in fact the bytes/sector
coding. In old (MFM) controllers you could specify if
you wanted 128,256,512 or 1024 bytes/sector. In the
IDE world only 512 bytes/sector is supported. This bit
pattern is a relic from the MFM controllers age. The
bit 6 of this pattern could in fact be used to access
a disk in LBA modus.
Status register:
Both the primary and secondary status register use the same bit
coding. The register is a read register.
bit 0 : error bit. If this bit is set then an error has
occurred while executing the latest command. The error
status itself is to be found in the error register.
bit 1 : index pulse. Each revolution of the disk this bit is
pulsed to '1' once. I have never looked at this bit, I
do not even know if that really happens.
bit 2 : ECC bit. if this bit is set then an ECC correction on
the data was executed. I ignore this bit.
bit 3 : DRQ bit. If this bit is set then the disk either wants
data (disk write) or has data for you (disk read).
bit 4 : SKC bit. Indicates that a seek has been executed with
success. I ignore this bit.
bit 5 : WFT bit. indicates a write error has happened. I do
not know what to do with this bit here and now. I've
never seen it go active.
bit 6 : RDY bit. indicates that the disk has finished its
power-up. Wait for this bit to be active before doing
anything (execpt reset) with the disk. I once ignored
this bit and was rewarded with a completely unusable
disk.
bit 7 : BSY bit. This bit is set when the disk is doing
something for you. You have to wait for this bit to
clear before you can start giving orders to the disk.
interrupt and reset register:
This register has only two bits that do something (that I know
of). It is a write register.
bit 1 : IRQ enable. If this bit is '0' the disk will give and
IRQ when it has finished executing a command. When it
is '1' the disk will not generate interrupts.
bit 2 : RESET bit. If you pulse this bit to '1' the disk will
execute a software reset. The bit is normally '0'. I
do not use it because I have full software control of
the hardware /RESET line.
Active status register:
This is a read register. I have -up till now- ignored this
register. I have only one IDE device (a disk) on my contraption.
bit 0 : master active. If this bit is set then the master IDE
device is active.
bit 1 : slave active. If this bit is set then the slave IDE
device is active.
bits 5..2: complement of the currently active disk head.
bit 6 : write bit. This bit is set when the device is writing.
bit 7 : in a PC environment this bit indicates if a floppy is
present in the floppy drive. Here it has no meaning.
error register:
The error register indicates what went wrong when a command
execution results in an error. The fact that an error has
occurred is indicated in the status register, the explanation is
given in the error register. This is a read register.
bit 0 : AMNF bit. Indicates that an address mark was not
found. What this means I not sure of. I have never
seen this happen.
bit 1 : TK0NF bit. When this bit is set the drive was not able
to find track 0 of the device. I think you will have
to throw away the disk if this happens.
bit 2 : ABRT bit. This bit is set when you have given an
indecent command to the disk. Mostly wrong parameters
(wrong head number etc..) cause the disk to respond
with error flag in the status bit set and the ABRT bit
set. I have gotten this error a lot when I tried to
run the disk with interrupts. Something MUST have been
wrong with my interface program. I have not (yet)
found what.
bit 3 : MCR bit. indicated that a media change was requested.
What that means I do not know. I've ignored this bit
till now.
bit 4 : IDNF bit. Means that a sector ID was not found. I have
never seen this happen, I guess it means that you've
requested a sector that is not there.
bit 5 : MC bit. Indicates that the media has been changed. I
ignore this bit.
bit 6 : UNC bit. Indicates that an uncorrectable data error
happened. Some read or write errors could provoke
this. I have never seen it happen.
bit 7 : reserved.
Note: I have these registers descriptions from two sources:
1) The C't magazine I mentioned before. It's in German, not very
complete (the error register description is missing) and very
old. It does have a hardware description of and IDE interface
however....
2) The document X3T10/2008D: Information Technology-
AT Attachment-3 Interface (ATA-3), Working draft.
This latter document gives an exhaustive overview of the IDE
interface. It states more details of the IDE interface than I
can ever hope to include in this short description. It does
however have one disadvantage: it's BIG. I found the document
on the net (on the Western Digital homepage) in the form of an
.exe file. When you run this file on a PC you are rewarded
with a bigger-than-1 Mbytes .DOC file. That is a Word
document. When you print (Wondows-95 has a Word viewer/printer
application) it you get a nearly-200-pages paper. If you want
to get into the IDE interface seriously I recommend you print
this thing.
I hope the description I have given here will allow those that do
not have a laser printer and a fast internet link available to
get to grips with the IDE bus.
Intermezzo: Disk size limitations on the IDE bus and LBA
modus
In the PC world there has been (and still is) a lot of discussion
about 'limits' in the disk interface.
At first (MSDOS versions till 3.3) the disk interface was not
able to access more than 32MB on one volume. That was a
limitation of the MSDOS file system rather than of the disk
interface. The same DOS version that was unable to access bigger
partitions than 32MB *WAS* able to access 650MB CDROMs. The limit
came from the fact that each disk sector (512 bytes) was
registered in the FAT in a 16-bits word. The total partition size
was limited by the fact that only 65536 sectors could be
addressed. The partition size was thus limited to 65536 x 512
bytes = 32 MBytes.
Later -as the disks became larger- the disk interface itself ran
into its limits. The interface I describe here has room for 16
heads, 256 sectors per track and only 1024 cylinders. With the
standard sector size of 512 bytes that leaves you a maximum disk
size of 16 x 256 x 1024 x 512 = 2048 MBytes. That is a real
limitation of the IDE interface as I describe it here. It can not
access more than some 2 GBytes of disk space.
This was overcome by introducing the so-called LBA modus. In LBA
modus the sectors are simply numbered from 0 to -big-. The lowest
byte of the LBA sector number is written into the sector number
register, the middle 16 bits of the LBA sector number are written
in the cylinder number registers (low and high, all 16 bits are
used). The highest 4 bits of the LBA sector number are written in
the head and device register. That gives you 28 bits of LBA
sector number. The sector size was again fixed at 512bytes, so in
LBA modus you have access to: 2^28 x 512 = 1.37 E 11 (some 137.4
gigabytes) of disk space. This LBA modus has been made mandatory
for all new disks (in the ATA-3 spec.) That should keep the disk
makers busy for some while to come... If you want to connect a
disk larger than 2 GBytes to this IDE interface you too will have
to use the LBA modus. How to do that: the bit 6 of the head and
device register is set to indicate that LBA modus is used (the
fixed pattern of 101B in the bits 7..5 of the head and device
register is to be changed into 111B). All other manipulation of
the IDE interface is the same for Sector/Head/Cylinder modus and
LBA modus.
All other limits in the MSDOS/Windows-whatever disk interface must
be due to the BIOS implementation or the file system used. I can
find no reason in the IDE definition for 512 MB limits or 8 GB
limits at all.
End of intermezzo
Ok, now you know what registers the IDE system uses. Next
question: How to use them? I do not pretend I have tried every
possibility with these registers. As I stated before I have
restricted myself to reading/writing data blocks to/from the
disk. What to do for that is in fact fairly simple:
1) Before doing anything with a device you have to wait till it
indicates that it is ready (RDY bit in the status register)
2) Next you load the parameters of a command into the appropriate
registers. For read/write commands that comes down to writing
the cylinder/head/sector numbers into the registers.
3) You issue a read or write command.
4) You wait till the device signals that it is ready for data
transfer (DRQ in the status register).
5) Feed the device data (for write) or get the data from the
device (for read). In case of a write you could wait for the
operation to complete and read the status register to find out
what has become of your data.
6) Finish!! That's all folks! The IDE interface is a surprisingly
simple thing to get to work. If only I had an IDE disk and this
kind of information when I was still programming my
MSX-computer I'd have had a harddisk connected to it in no
time.
What has been missing in this description till now is the command
set. I do not think I can describe the complete command set here.
The ATA-3 document is a better source for that than I can give
here (All I would be doing is re-entering the ATA-3 document; I
have neither the time nor any liking for that). The most useable
commands I do intend to describe. Mind: When giving a command you
first have to wait for device ready, next put the command
parameters in the registers and only then can you give a command
(by writing a command byte to the command register). The disk
will start executing the command right after you've written the
command into the command register.
IDE command: Description:
------------ ------------
1XH recalibrate the disk. NB: 1XH means that the lower
nibble of the command byte is a don't care. All
commands 10H..1FH will result in a recalibrate
disk command being executed. This command has no
parameters. You simply write the command code to
the command register and wait for ready status to
become active again.
20H Read sector with retry. NB: 21H = read sector
without retry. For this command you have to load
the complete circus of cylinder/head/sector
first. When the command completes (DRQ goes
active) you can read 256 words (16-bits) from the
disk's data register.
30H Write sector (with retry; 31H = without retry).
Here too you have to load cylinder/head/sector.
Then wait for DRQ to become active. Feed the disk
256 words of data in the data register. Next the
disk starts writing. When BSY goes not active you
can read the status from the status register.
7XH Seek. This normally does nothing on modern IDE
drives. Modern drives do not position the head if
you do not command a read or write.
ECH Identify drive. This command prepares a buffer
(256 words) with information about the drive. If
you want the details either look closely at the
interface program I will add at the end of this
description or get the ATA-3 document. To use it:
simply give the command, wait for DRQ and read
the 256 words from the drive. I have found that
the modern drives I used give nice information
about number of heads,sectors,cylinders etc...
One of the disks I tried (a Miniscribe 8051A)
gave wrong answers in this buffer. The disk is
actually a 4 heads/28 sectors disk. It should be
used in a translated modus with 5 heads/17
sectors. In the ident drive response it reported
as 4 heads/28 sectors and it will NOT work in
that modus. Two other disks (a Quantum 127 MB
disk and a Western Digital 212 MB disk) report
nicely. If not for the Miniscribe I would use the
parameters reported to auto-config the interface
to match the disk configuration.
E0H Spins down the drive at once. No parameters. My
Miniscribe 8051A does not respond to this
command, the other disks do execute this command.
E1H Spins up the drive again. Same remarks as E0H
command.
E2H and E3H Auto-power-down the disk. Write in the sector
count register the time (5 seconds units) of
non-activity after which the disk will spin-down.
Write the command to the command register and the
disk is set in an auto-power-save modus. The disk
will automatically spin-up again when you issue
read/write commands. E2H will spin-down, E3H will
keep the disk spinning after the command has been
given. Example: write 10H in the sector count
register, give command E2H and the disk will
spin-down after 80 seconds of non-activity. BTW:
You can use this command easily on a PC disk too.
The harddisk of the computer I am working on now
gets this exact command at boot. That saves a lot
of noise when I'm typing long stories like this
one.
F2H and F3H The same as E2H and E3H, only the unit in the
sector count register is interpreted as 0.1 sec
units. I have not tried this command. I think it
will work (the E0H/E1H/E2H/E3H commands work, why
should this one not work?)
The IDE bus is intended for two devices.  I have not tried anything myself, but the descriptions
indicate that it is in fact very simple to connect two devices to
the IDE bus. All you have to do is:
1) Configure the master/slave jumpers of the devices.
2) Select a device before you start giving commands to the
devices.
The head and device register has the bit you need to switch from
one device to another. You have to write the bit to either 0 for
master or 1 for slave and start controlling the other device.
Mind: BOTH devices will get their registers WRITTEN. Any data or
register READ will come from the selected device. ONLY the
selected device will execute commands.
ravings:
This description should be about what you need to connect an IDE
disk to any controller. The only thing I have left out are my
unsuccessful experiments with the interrupt. What happened there
is that I enabled the interrupt, made an interrupt handler that
simply read the status register (to get the interrupt to
disappear) and re-scheduled the disk interface task. I was
rewarded with occasional errors. Some of the read requests got an
ABRT error. I do not yet know what I did wrong. I can not have
been far off the mark, because most of the commands where
executed without comment from the disk. I do intend to try the
interrupt modus again later. I theory the interrupt modus should
give me a slightly bigger data rate. I have found data rates in
the order of 32 KBytes per second when I was using interrupts.
About interrupts: When you want to use the interrupt mechanism
all you have to do is enable the interrupt modus of the interface
by clearing the interrupt disable bit in the reset and interrupt
register. The disk will generate an interrupts as soon as it
has completed a command. That means that it will generate an
interrupt when it has read a sector from disk (as soon as DRQ
gets active) or when it has finished writing a sector to disk. I
am not sure about the other commands, but the description says
that the disk will generate an interrupt upon the completion of
each command.
About the data rate. This IDE interface will never win any award
for its speed. It is in one word slow. I get data transfer rates
in the order of 25 KBytes per second. I spend most of the time
reading/writing data words from/to the disk on a word-by-word
basis under software control. On the other hand, my controller
has a total (RAM) memory of 24 KBytes. With the current interface
I can dump the complete memory to disk in less than one second.
That in itself makes me think that for this application the low
speed is not so much of an issue.
About the future. I think I will give interrupt modus another
try. Not because it gives me a fantastic data rate, I just can't
stand it that it does not want to work good.
I am thinking about a proper file system to put on the disk. That
will enable me to access the disk in a more normal way that the
current 'sea of sectors' approach I use now. A FAT filesystem
looks like an absolute horror when combined with a controller, so
I'll have to either find something that looks good to me or strap
something together myself.
I think I will give the ATAPI command set a try. I have just
found and printed the 'SFF committee specification of ATA Packet
Interface for CDROMs' (SFF-8020i) document. That document gives a
description of how to control an ATAPI CDROM via the IDE bus. On
the other hand: I would really not know what to begin with a
CDROM connected to a microcontroller. But what the heck, I have
no really good idea what to do with a microcontroller with a 40MB
harddisk connected..... I have seen occasional questions in this
mailing list about how to control a CDROM via its backside
connector: I think this IDE interface with an ATAPI piggy-back
software could just do the work.
Till now I've been concentrating on only one side of the
interface. The IDE interface is in fact no more than a
ready-decoded, buffered interface of a (mostly-PC) hardware
system. I could in fact connect god-knows-what at the other end.
I have an interrupt, DMA and I/O available, what else could you
ask for? A disk or CDROM is only one of the less inspired devices
you can connect to an IDE interface. Given the fact that modern
PC-motherboards have two IDE interfaces aboard I can think of
some nice things I'd like to connect to them. How about some 8
parallel input/output ports, how about a data acquisition system?
Lately I have been able to get a C-mos version of the 8255. My
controller system is quite low-power (10 mA for the entire
thing). I did not feel good about the IDE extension with a 8255
that used some 80 mA all by itself. The controller system with
the D71055C (a C-mos NEC version of the 8255) has gone down to
its normal -about 10 mA- power usage. the change from N-mos 8255
to C-mos D71055C has had no other noticeable effects than a lower
power usage.
Even when I have no disk connected to this contraption it
delivers me three 8-bits I/O ports. I am thinking about what
other things I could connect to that.
conclusions:
As you can see it is far from difficult to connect an IDE disk to
some computer. My implementation with a 8255 and an inverter chip
may not be the fastest thing on earth, it works, it's simple and
may be useable for many applications where a controller with a
large backup store could save the day.
I'll wrap this up with a case-study: The software I use on my
63B03 controller to control the IDE bus. I hope it can clarify
any points I have not covered in this description. I know this
software to work, I hope it can give someone inspiration to do
something similar on some controller system somewhere.
The software I use to control a single IDE harddisk using a 63B03
controller system and a 8255/74HC04 IDE interface.
Notes:
The interface program has been made on a 63B03 controller in
assembly code. The 63B03 code is nearly 6800 code. If in doubt,
consult some source of 6800 or 6803 or 63B03 instructions.
The source of the interface program is of course the most
complete description of how to program this interface, but
certainly not the most un-cryptic description. I try to program
without any 'dirty tricks' but who knows....
This interface program makes sporadic use of the underlying 63B03
real-time schedular. If you see a 'jsr Sys' somewhere that is
where I called the schedular to do something for me. As far as I
can see I only use Sys to produce a 10-ms delay. I have left the
code of the schedular itself out. Not because it is anything but
public domain, but because it is another 150 KBytes of source
file. This description is long enough as it stands here. The
schedular is not really needed, so I left it out. If you are
interested in the schedular as such, drop me a line (the address
is a little up in the text).
The IDE interface software as such I hereby donate to the public
domain. Use it as pleases you. Change it when you think it is
wrong, suffer the consequences if you make mistakes. I do not
take responsibility if you blow up harddisks, interface hardware
or if anything goes wrong when you use it. I have found it to
work on my system and, so sorry, that is all the guarantee I can
give you about it.
Disk interface task for the 63B03 system
Update history:
| 02-02-1998 : |
Started with the thing. The hardware has been
finished today. All seems to work. Now I need
software to get some life into it.
|
| 05-02-1998 : |
Hit a bloody trick of the 8255: When you change
the modus byte ALL outputs are set to 0. I now
know why nobody wants to use this bugger. The
solution for this shit is easy: I plan to put an
inverter in all the control lines. The following
lines will be inverted:
/CS0, /CS1, /IORD, /IOW, /RES, IRQ (the latter
for the 63B03, it has a /IRQ input)..
This is the software change needed to make things
work again...
|
| 06-02-1998 : |
Hardware change done, disk reset works
Started testing the disk interface functions.
The recalibrate command works too, the stop
disk/start disk functions seem to be not
present in this 40 MB disk. I also made a LBA
routine, I can now access the disk as a set of
sequential blocks, without counting heads etc..
It seems the PC hardware starts counting sectors
starting at 1 (WHY???), all other numbers start
at 0...
|
| |
My disk (about 40 MB) tells me it has
980 cyls, 5 heads, 17 secs/track. In fact it does
tell me different numbers, only the label
indicates that it has been translated...
|
| |
At this moment I only support disk block read
and disk block write. I want to make some file-
system too. Besides, this thing works code-bound.
I want to start using interrupts too...
|
| 08-02-1998 : |
/IRQ hardware made ok. The disk can now generate
interrupts. These will come into the system via
the CPU's /IRQ signal. I even crashed the system
by giving /IRQ's with no handler in place...
Start making the disk software /IRQ-driven.
|
| 10-02-1998 : |
Changed the interrupt generation/detection
software Found one nasty bug in the interrupt
usage as I did it: I first gave a disk reset on
the IDE bus, then started giving commends right
away. On this ONE occasion I do NOT have the
disk's interrupt facility available, the disk is
still executing its internal reset. I have to
wait for ready there, THEN start issuing
commands... Also set the bus control signals to
output BEFORE I start using the bus at all... Now
the interrupt mechanism works like the beauty it
is...
|
| 11-02-1998 : |
Cleaned up the data transfer code. The disk I/O
was very slow due to very systematic code.
ReadWord/WriteWord code substituted in the
ReadBlock/WriteBlock code. Routines ReadWord/
WriteWord removed from the code. There was an
error in the writeword routine, I've removed it.
|
| 15-02-1998 : |
I have given up about the interrupt-driven disk
control. It KEEPS on giving unexplained errors.
 What
exactly goes wrong I have no idea about. I now
use the scheduler's delay routines to get ready
status from the disk and that works fine. Both
the 40 MB disk and the 127 MB disk run like the
sunshine in this modus. The non-interrupt modus
does in fact not make any significant difference
for the transfer speed. I dropped from 32 KB/s to
25 KB/s. That is very acceptable for this
microcontroller. The controller is in this modus
a lot slower than the disk....
|
| |
I'm now going to set the thing up for the 127 MB
disk with proper track/head numbers. Works ok
too.
|
| |
Next test is with the 212 MB disk. I have to take
care that I stay below track 600 for this disk,
tracks 630 .. 660 are bad... Sunshine again..
|
| 16-02-1998 : |
Made Identify working. It now dumps a nice
display of what the disk can do. My antique 42MB
disk gives only half an answer (and a wrong one
as well, it does NOT tell about the 5 heads,17
sectors translation it does..) but the other ones
like this ident command/display a lot. Also
shifted the buffers in memory a bit. I now want
to start writing to the disk (till now I have
only been reading...).
Ok, I really messed up the data on my 42 MB disk,
but it DOES write as well as read. I get back
what I have written, so far, so good. Now I have
to make:
- A proper disk I/O task. That means that I have
to implement some way of communicating with
the disk I/O task. signals?
For that I will have to extend my scheduler.
- Some sort of file-system. I am already
contemplating a MFS (Microcontroller File
System) for some time now. It's about time to
start working on one..
|
| 18-02-1998 : |
Started making task # 0E into a disk monitor. |
I have left out the remainder of the code as it is fairly specific to the processor it
was written for.
Copyright © 1999 Wesley Moore,
<EMAIL_ADDRESS>(last updated 10 Oct, 1999)
(reproduced with permission from Peter Faasse and Wesley Moore)
URL: http://minyos.its.rmit.edu.au/~s9906768/pic/IDE_to_8255.html
|


Modules and Module Owners
Review Process
- Propose a feature on the mailing list.
- Create a bug on bugzilla.
- Implement the patches.
- Flag for peer review (r?).
- UX, security, product, and QA.
- Incorporate feedback.
- Land the patch.
Bugzilla is the Devil we Know
- The way things get done.
- The primary communication tool for coders.
- Flags: r?, r+, r-, ni?
- Flags are how you will get UX, Security, and QA reviews.
Open Source is Built in the Open
- Get community review of feature proposals in mailing lists.
- Build relationships with module owners.
- Publish your code in a reviewable repository.
- Attach patches to Bugzilla bugs for review.
- Github would be best.
- Bugzilla understands Github pull request URLs.
Mailing Lists
- dev-b2g
- dev-gaia
- dev-platform
IRC
irc.mozilla.org
- #dev-b2g
- #dev-gaia
- #dev-platform