INTRODUCTION TO ASSEMBLY LANGUAGE PROGRAMMING CHARLES R. SMITH REPRINTED FROM: THE MAPLE ORCHARD BOX 696, STATION B WILLOWDALE, ONTARIO WHAT IS ASSEMBLER AND MACHINE LANGUAGE ? MOST OF US HAVE SOME FAMILIARITY WITH BASIC, WITH ITS ENGLISH LIKE COMMANDS SUCH AS 'PRINT', 'INPUT' AND 'FOR .. NEXT'. THERE ARE OTHER HIGH-LEVEL LANGUAGES, LIKE FORTRAN AND PASCAL, WHICH SIMILARLY ARE FORMED OF ENGLISH LIKE COMMANDS. THE APPLE'S CENTRAL PROCESSING UNIT (CPU) CANNOT UNDERSTAND SUCH ENGLISH COMMANDS, BUT INSTEAD THE CPU MUST 'INTERPRET' THE COMMANDS OR 'TRANSLATE' THEM INTO A FORM WHICH IT CAN UNDERSTAND. WHEN RUNNING A PROGRAM IN BASIC, THE APPLE TAKES EACH LINE OF THE PROGRAM AND INTERPRETS IT INTO A MACHINE LANGUAGE FORM WHICH FOR THE CPU. ONCE INTERPRETED, THE CPU THEN EXECUTES THE LINE. APPLESOFT IS THEREFORE CALLED A 'BASIC INTERPRETER' OR IS AN 'INTERPRETED BASIC'. THE OPPOSITE OF THE HIGH-LEVEL, STRUCTURED LANGUAGES ARE ASSEMBLER AND MACHINE LANGUAGE. THE TERMS 'ASSEMBLY LANGUAGE' AND 'MACHINE LANGUAGE' ARE OFTEN USED INTERCHANGABLY, ALTHOUGH THERE IS A DIFFERENCE. PROGRAMMING IN MACHINE LANGUAGE IS ACCOMPLISHED WHEN HEXADECIMAL OR BINARY DATA IS LOADED INTO THE COMPUTER BYTE-BY-BYTE (EG. ENTERING THE MONITOR BY CALL -151 AND INPUTTING '300: A9 0A ...'). WHEN COMPUTERS WERE IN THEIR INFANCY, THIS WAS THE ONLY OPTION AVAILABLE. THIS FORM OF PROGRAMMING CAN ONLY BE INTELLIGIBLE TO PEOPLE WHO THINK LIKE A COMPUTER. TO WE LESSER MORTALS, WRITING A PROGRAM IN MACHINE LANGUAGE IS THE ULTIMATE EXERCISE IN FRUSTRATION. (AN ASIDE: WHEN STEVE WOZNIAK AND STEVE JOBS FIRST BUILT AN APPLE I COMPUTER, THEY TOOK IT TO PARTIES AND ENTERED HUNDREDS OF HEX CODES BY HAND JUST TO LOAD IN A PROGRAM TO DEMONSTRATE THIS FIRST APPLE'S ABILITY. ALLEGEDLY, DOS WAS FIRST WRITTEN THIS WAY!) ENTER ASSEMBLERS. AN ASSEMBLER IS SIMPLY A TOOL WHICH ALLOWS A PERSON TO WRITE A PROGRAM USING SOMEWHAT MORE INTELLIGIBLE COMMANDS, AND THEN THE ASSEMBLER PROGRAM CONVERTS ("ASSEMBLES") THE ENGLISH-LIKE COMMANDS INTO THE CORRESPONDING MACHINE-LANGUAGE CODE. WHILE THERE IS A DEFINITE AND SIGNIFICANT DIFFERENCE BETWEEN 'ASSEMBLY' LANGUAGE AND 'MACHINE' LANGUAGE, THE TWO TERMS ARE OFTEN USED INTERCHANGABLY. THROUGHOUT THIS ARTICLE, SUCH INTERCHANGABILITY SHALL BE USED. WHY PROGRAM IN MACHINE LANGUAGE ? IF ASSEMBLY LANGUAGE IS TOUGHER THAN BASIC, WHY BOTHER BEING A GLUTTON FOR PUNISHMENT? IS THERE SOMETHING TO BE SAID FOR SUCH AN ARCANE LANGUAGE? CONSIDER THESE THREE REASONS: SPEED, FLEXIBILITY AND MEMORY MANAGEMENT. THE MOST PROMINENT BENEFIT OF A MACHINE LANGUAGE PROGRAM CAN BE SEEN ANYTIME YOU PLAY A COMMERCIALLY-PRODUCED, ARCADE STYLE GAME. SUCH GAMES ARE INVARIABLY WRITTEN ON AN ASSEMBLER (THE PEOPLE AT SOUTHWESTERN DATA SYSTEMS TELL ME THAT THE GAMES FROM SIRIUS ARE WRITTEN ON MERLIN). THE EXECUTION SPEED OF A MACHINE LANGUAGE PROGRAM IS MUCH FASTER THAN A CORRESPONDING BASIC PROGRAM ARCADE QUALITY GAMES SIMPLY CANNOT BE WRITTEN IN BASIC. EVEN BASIC WHICH HAS BEEN COMPILED INTO MACHINE LANGUAGE (BY APPLESOFT COMPILERS SUCH AS TASC OR SPEEDSTAR) IS STILL SLOWER AND MORE MEMORY-HUNGRY THAN AN EQUIVALENT PROGRAM WRITTEN IN ASSEMBLER. THE ADVANTAGE OF SPEED CAN BE USED IN OTHER SITUATIONS WHICH WILL SIGNIFICANTLY ENHANCE THE APPLE'S CAPABILITY. SORTING, MATRIX OPERATIONS AND DISK UTILITIES ARE BUT A FEW REASONS TO USE THE SPEED OF MACHINE LANGUAGE. THE SECOND REASON TO PROGRAM IN MACHINE LANGUAGE IS THE INCREASED FLEXIBILITY WHICH IT OFFERS. THE COMMANDS IN APPLESOFT CAN BE ENHANCED BY THE USE OF SHORT MACHINE LANGUAGE ROUTINES HIDDEN AWAY IN MEMORY. PRINT FORMATTING FUNCTIONS, SOUND GENERATION, SORTING, STRING HANDLING AND SWAPPING, DECIMAL TO HEX CONVERSIONS, GARBAGE COLLECTION AND MEMORY CLEARANCE, AND ARRAY OPERATIONS ARE BUT SOME OF THE MORE COMMONLY USED SUBROUTINES. WHILE SUCH MACHINE LANGUAGE ENHANCEMENTS ARE AVAILABLE COMMERCIALLY, THEY CAN ALSO BE HAD AT A VERY LOW COST, AS THEY ARE LISTED IN SUCH PUBLICATIONS AS NIBBLE AND CALL-APPLE. THE THIRD ADVANTAGE RELATES TO MEMORY MANAGEMENT. MACHINE LANGUAGE PROGRAMS ARE MORE EFFICIENT IN THEIR COMSUMPTION OF MEMORY THAN ARE THEIR BASIC COUNTERPARTS. BECAUSE OF THIS, IT IS POSSIBLE TO HAVE SEVERAL MACHINE LANGUAGE ROUTINES RESIDING IN MEMORY CUNCURRENTLY, THEREBY ENHANCING APPLESOFT WHILE AT THE SAME TIME AVOIDING A SIGNIFICANT REDUCTION IN THE MEMORY AVAILABLE TO THE USER. WHAT IS NEEDED TO GET STARTED TO BEGIN PROGRAMMING IN ASSEMBLER/ MACHINE LANGUAGE, IT IS NOT NECESSARY TO PURCHASE ANY SOFTWARE TOOLS. A GOOD BOOK, HOWEVER, CAN BE INVALUABLE. ONCE YOUR INTEREST IS SPARKED, YOU MAY DEVELOP A SUDDEN URGE TO PURCHASE AN ASSEMBLER. OTHER MACHINE LANGUAGE UTILITIES ARE HELPFUL. THERE ARE THREE DIFFERENT LEVELS OF SOPHISTICATION AT WHICH YOU MAY ENTER MACHINE LANGUAGE PROGRAMMING: 1) MACHINE LANGUAGE USING THE MONITOR 2) ASSEMBLY LANGUAGE USING THE MINI-ASSEMBLER 3) ASSEMBLY LANGUAGE USING AN ASSEMBLER. LET'S LOOK AT EACH OF THESE IN ORDER. MACHINE LANGUAGE USING THE MONITOR ALTHOUGH NOT THE MOST FLEXIBLE APPROACH TO MACHINE LANGUAGE, THIS IS THE CHEAPEST ROUTE TO GO, AND IT FORMS A GOOD STARTING PLACE. THE WAY TO BEGIN IS TO EXIT APPLESOFT AND GET INTO THE MONITOR BY MEANS OF THE COMMAND: ]CALL -151 WHICH YIELDS THE '*' PROMPT. FROM HERE WE CAN ENTER A PROGRAM BY GIVING THE STARTING ADDRESS AND THE HEXADECIMAL DATA. TRY THE FOLLOWING: *300:AD 30 C0 88 D0 FD 4C 00 30 WHERE YOU ENTERED THE NUMBER 300, A COLON, THEN 9 SETS OF HEXADECIMAL DATA. BE SURE THAT YOU DO NOT LEAVE A SPACE BETWEEN THE COLON AND THE FIRST NUMBER. AT THE END OF THE LINE, ENTER A . UP TO 85 HEXADECIMAL NUMBERS CAN BE ENTERED AT ONCE THIS WAY. WHAT THIS PROGRAM DOES IS TOGGLE THE SPEAKER BY ADDRESSING ITS MEMORY LOCATIO (AD 30 C0), COUNTING DOWNWARDS FROM 255 TO 0 (88 D0 FD) AND THEN JUMPING BACK TO THE START (4C 00 30). IN OTHER WORDS, THIS SHORT ROUTINE KEEPS A CONSTANT TONE GOING ON THE SPEAKER UNTIL YOU HIT TO GET OUT OF IT. TO START THIS CPROGRAM ONCE YOU HAVE TYPED IN THE ABOVE LINE, SIMPLY GO TO LOCATION $300 AND DO WHAT'S THERE BY THE COMMAND: *300G YOU HAVE JUST ENTERED YOUR FIRST MACHINE LANGUAGE PROGRAM (THIS PROGRAM EXAMPLE IS COURTESY OF SC MACRO ASSEMBLER). NOW GO ON TO GREATER THINGS. GRAB AN ASSEMBLY/MACHINE LANGUAGE LISTING AND ENTER IT INTO YOUR COMPUTER. IF YOU ARE ENTERING AN ASSEMBLY LISTING, YOU WILL SEE THE HEX CODE IN THE LEFT HAND COLUMNS. FOR EXAMPLE, THE ABOVE PROGRAM LOOKS LIKE: 0300 - AD 30 C0 1 TONE LDA $C030 0303 - 88 2 LOOP DEY 0304 - D0 FD 3 BNE LOOP 0306 - 4C 00 03 4 JMP TONE REMEMBER TO SAVE YOUR WORK ON DISK. THIS IS DONE WITH THE BSAVE COMMAND. IT IS NECESSARY TO SPECIFY THE STARTING ADDRESS AND LENGTH PARAMETERS USING THE 'A$___' AND 'L$___' COMMANDS. IF A PROGRAM WENT FROM 0300 TO 0320, IT WOULD BE (HEX) 20 OR (DECIMAL) 32 BYTES LONG. THEREFORE IT WOULD BE SAVED BY THE COMMAND: *BSAVE MYPROGRAM,A$300,L$20 WHERE A$ IS THE STARTING ADDRESS IN HEXADECIMAL AND L$ IS THE LENGTH IN HEX. IT COULD ALSO BE SAVED BY THE COMMAND: *BSAVE MYPROGRAM,A768,L32 WHERE A IS THE STARTING ADDRESS IN DECIMAL (768=300 HEX) AND L IS THE LENGTH IN BYTES. TO CHECK A PROGRAM LISTING, ENTER THE START AND END ADDRESS, SEPERATED BY A PERIOD. FOR THE SHORT TONE PROGRAM ABOVE, ENTER: *300.308 IF YOU WANT TO SEE THE DISASSEMBLED CODE, ENTER THE STARTING ADDRESS AND "L" TO LIST 20 COMMANDS. TO SEE THIS PROGRAM, ENTER: *300L (TO MAKE THE ENTRY AND CORRECTION OF MACHINE LANGUAGE PROGRAMS, ONE OF THE DISKS FROM THE INTERNATIONAL APPLE CORE (DISK 25, MACHINE LANGUAGE UTILITIES) CONTAINS A UTILITY TO FACILITATE THIS PROCESS. IT IS CALLED BEU (FOR BINARY ENTRY UTILITY) AND WILL LOCATE ITSELF EITHER ON A 16K RAM CARD OR IN THE APPLE'S 48K RAM.) PROGRAMMING WITH THE MINI-ASSEMBLER IN THE ORIGINAL APPLE II MACHINE WAS A MONITOR FUNCTION ENTITLED THE "MINI-ASSEMBLER". ITS JOB WAS TO FACILITATE ENTRY OF MACHINE CODE INTO THE COMPUTER. WHEN APPLESOFT WAS DEVELOPED FOR THE APPLE II PLUS, THIS FUNCTION (ALONG WITH STEP AND TRACE IN THE MONITOR ROM) WERE DELETED. THAT IS THE BAD NEWS. NOW FOR THE GOOD NEWS. IF YOU HAVE A 16K RAM CARD, LOADING INTEGER BASIC UPON BOOTING UP THE DOS 3.3 SYSTEM MASTER DISK WILL LOAD THE MINI-ASSEMBLER INTO YOUR MACHINE. THIS CAN BE ACCESSED BY ENTERING INTEGER WITH THE COMMAND: ]INT WHICH YIELDS THE '>' PROMPT. THEN ENTER: >CALL -151 TO GET THE MONITOR '*' PROMPT. THEN GO TO THE MINI-ASSEMBLER WITH THE COMMAND: *F666G WHICH YIELDS THE EXCLAMATION (!) PROMPT. THE MINI-ASSEMBLER IS STILL AVAILABLE TO THE OWNER OF A 48K APPLE ][ PLUS, AS IT HAS BEEN MODIFIED AND INCLUDED ON THE IAC DISK #25. INSTRUCTIONS FOR ITS USE ARE GIVEN IN AN ACCOMPANYING FILE, WHILE MORE COMPLETE INSTRUCTIONS ARE GIVEN IN THE APPLE ][ REFERENCE MANUAL. APPLE //E OWNERS CAN ACCESS THE MINI-ASSEMBLER THROUGH INTEGER BASIC. 3) ASSEMBLER ONCE YOU'VE GOTTEN YOUR FEET WET BY GAINING ACCESS TO THE MONITOR AND ENTERING A HEX LISTING, YOU WILL REALIZE THE FACT THAT THERE HAS TO BE A BETTER WAY. OBTAINING AN ASSEMBLER IS THAT WAY. THERE ARE AT LEAST TEN COMMERCIALLY AVAILABLE EDITOR/ASSEMBLERS, AND THE PERFECT ONE IS PROBABLY STILL TO BE WRITTEN. BUYING AN ASSEMBLER IS LIKE OBTAINING ANY OTHER SOFTWARE, AS THE AMOUNT OF MONEY TO BE SPENT AND THE CONFIGURATION OF YOUR MACHINE WILL BE CONTROLLING FACTORS. SEVERAL ASSEMBLERS ARE REVIEWED IN THIS ISSUE. A PUBLIC DOMAIN ASSEMBLER CALLED MASM IS INCLUDED IN THE IAC'S SPECIAL MACHINE LANGUAGE UTILITY DISK. OTHER AIDS OTHER TYPES OF AIDS ARE ALSO WORTHY OF CONSIDERATION. A DISASSEMBLER IS A HANDY TOOL WHICH WILL PERMIT YOU TO TAKE MACHINE LANGUAGE (HEXADECIMAL) CODE AND RE-CONVERT IT INTO AN ASSEMBLER SOURCE LISTING. FROM THERE, YOU CAN EDIT, ALTER AND RE-ASSEMBLE THE CODE TO MAKE IT FUNCTION IN A DIFFERENT MANNER OR AT A NEW MEMORY LOCATION. A DISASSEMBLER IS AVAILABLE IN THE APPLE'S MONITOR AND IS ABLE TO DISASSEMBLE TO THE SCREEN, USING THE *XXXX L COMMAND, WHERE XXXX IS THE MEMORY LOCATION AT WHICH TO BEGIN DISASSEMBLY. A PUBLIC DOMAIN DISASSEMBLER IS INCLUDED ON THE MACHINE LANGUAGE DISK, AND SOME VERY GOOD ASSEMBLERS ARE INCLUDED WITH SOME ASSEMBLER AS PART OF THE PACKAGE (EG. MERLIN AND LISA). OTHERS ARE AVAILABLE AS A STAND-ALONE PRODUCT (SUCH AS DISASM FROM RAK-WARE). DEBUGGERS ARE FOR THOSE WHO ARE VERY SERIOUS - THEY PERMIT STEP AND TRACE FUNCTIONS AND A HOST OF OTHER ADVANCED FEATURES. TWO EXAMPLES OF COMMERCIAL PRODUCTS ARE BUG BYTER AND MUNCH-A-BUG. BEU ON THE MACHINE LANGUAGE DISK ALSO CONTAINS DEBUG ROUTINES. THERE IS EVEN A NEW PRODUCT WHICH WILL TURN YOUR MACHINE INTO A 'VISIBLE' APPLE AS IT SHOWS YOU ON THE HI-RES SCREEN HOW YOUR APPLE WORKS, DISPLAYING THE INSTRUCTIONS, REGISTERS, FLAGS AND MEMORY LOCATIONS AS IT EXECUTES A PROGRAM ONE STEP AT A TIME. AND WHERE WOULD WE BE WITHOUT BOOKS? A VARIETY ARE AVAILABLE, EACH ONE FOR A SLIGHTLY DIFFERENT READER. THERE ARE SOME GENERAL REFERENCES ON PROGRAMMING THE 6502 MICROPROCESSORS, SEVERAL GOOD BOOKS SPECIFICALLY WRITTEN FOR APPLE 6502 MACHINE LANGUAGE (REVIEWED IN THIS ISSUE), AND BOOKS WHICH SERVE AS A ROAD-MAP OR ATLAS TO THE APPLE'S INTERNALS (ALSO REVIEWED HERE). MUCH IS WRITTEN IN THE MONTHLY MAGAZINES, AND THERE IS EVEN A MONTHLY PUBLICATION ON MACHINE LANGUAGE PROGAMMING. BUT THE BEST STARTING PLACE IS THE APPLE ][ REFERENCE MANUAL, WHICH LISTS THE OPCODES AVAILABLE ON THE 6502 AND SOME IMPORTANT INTERNAL ROUTINES. WHEN ALL IS SAID AND DONE, A PERSON WHO KNOWS A FEW BASIC COMMANDS CAN EASILY FIND THEIR WAY AROUND MACHINE LANGUAGE. THERE IS A CERTAIN JOY IN ENTERING, DEBUGGING AND RUNNING A PROGRAM, BE IT IN BASIC, ASSEMBLER OR WHATEVER. AND ISN'T THAT JOY A BIG REASON FOR OWNING AN APPLE?