,-BAMDUA 035bDBL4 ASMÍ:°DBL4 COMà}µDBL4 DOCúG•SDBLEPSONASMAñåDBLGEN ASMVà$DBLOKI ASMgŸ»MLOAD23 COM~ÚðNULU CMT”­ÒNULU DOC°ÂbÚNULU11F1ASMrÿBNULU12 COMwxÙ=NULU12 NOTïªNULUTERMASMörZASM COM p@èZASM DOC}żjÿ ÿ ÿ -BAMDUA.035 Thió  librarù  volumå containó thå versioî oæ  NULÕ  thaô  wilì � correcô thå bugó encountereä whilå unsqueezing/extractinç fileó wheî � usinç NULU11® Á utilitù tï "columî-print¢ twï pageó oæ á filå oî  á � singlå sheeô oæ papeò anä á Z8° macrï assembleò arå alsï included. -BAMDUA .035 2k -You'rå readinç iô now® DBL4 .COM 4k -Prograí tï prinô fileó twï pageó aô á timå oî  á �                     singlå sheeô oæ papeò usinç thå compresseä  modå �                     founä oî mosô doô-matriø printers. DBL4 .DOC 10k <--­ Documentatioî foò abovå -­ REAÄ MÅ ! DBL4 .ASM 26ë -Sourcå codå foò thå abovå program. DBLEPSON.ASM 4ë -DBL´ overlaù filå -­ Epsoî RX80/MX80. DBLGEN .ASM 4ë -DBL´ overlaù filå -­ Generalizeä printer. DBLOKI .ASM 4ë -DBL´ overlaù filå -­ Okidatá Microline. NULU12 .COM 16k -Versioî  oæ NULU1± containinç thå buç  fixeó  iî �                     thå NULU11F1.ASÍ file. NULU12 .NOT 2ë <--­ Documentatioî oæ abovå fixeó -­ REAÄ MÅ ! NULU .CMT 4k -Revie÷ oæ thå NULÕ program. NULU .DOC 58k ¼­­­ Documentatioî filå foò thå NULÕ  serieó  oæ �                     programó ­­ REAÄ MÅ !! NULU11F1.ASM   2k  -Patcè  filå incorporatinç thå fixeó oæ thå  bugó �                     encountereä  witè  unsqueezing/extractinç  fileó �                     witè NULU11. NULUTERM.ASM   4k  -Patcè   filå  foò  installinç  NULÕ  witè   youò �                     terminaì characteristics. MLOAD23 .COM 4k -Prograí tï instalì prograí patcheó withouô usinç �                     DDÔ oò á similaò error-pronå utility. ZASM .COM 14ë -Z8° macrï assembleò similaò tï MAà anä RMAC. ZASM .DOC 26ë <--­ Documentatioî foò abovå -­ REAÄ MÅ !! ; ; ; DBL.ASM ; VERSION OF AUGUST, 1985 ; BY: ALAN W WARREN ;-------------------------------; BDOS: EQU 05H FCB: EQU 5CH LBUFER: EQU 80H STAK: EQU 0FEH ORG 0100H JMP START ;103H ; ;SPACE FOR RELOCATING CODE FOR ;EASY ACCESS BY PROGRAM ;-------------------------------; DFMODE: DB 'Epson RX-80',0 DS 11BH-$ ;11BH - 24 (18H) BYTES FOR CODE HGT: DB 0 ;8 BYTES FOR FORMAT WDT: DB 0 LMG: DB 0 RMG: DB 0 CGP: DB 0 MT: DB 0 MB: DB 0 DB 0 ;123H ; ; ;PRINTER CONTROL STRINGS FOR ;EPSON PRINTER (RX-80) ;-------------------------------; ENDPG: DB 6,13,10,10,10,10,10 DS 130H-$ ;13 BYTES NORMAL: DB 2,1BH,40H ;MASTER RESET DS 140H-$ ;16 BYTES ; ; ;MODE CONTROL BLOCKS ; ; MODE ID STRINGS 32 BYTES ; PRINT MODE CONTROL 24 BYTES ; PAGE FORMAT CONSTANTS 8 BYTES ; TOTALS: 64 BYTES ;-------------------------------; MODE1: DB '16.7 CPI, 6 LPI',0 DS 160H-$ ;32 BYTES ; ;24 BYTES FOR PRINT MODE CONTROL ;-------------------------------; DB 2,0FH,8FH DS 178H-$ ;24 BYTES ; ;8 BYTES FOR PAGE LAYOUT ;-------------------------------; DB 66 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 5 ;LEFT MARGIN IN CHARACTERS (DEF=12) DB 8 ;RIGHT MARGIN IN CHARACTERS DB 5 ;CENTER GAP IN CHARACTERS (DEF=8) DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;180H 8 BYTES ; ;MORE OF SAME FOR 2ND MODE ;-------------------------------; MODE2: DB '10 CPI',0 DS 1A0H-$ ;32 BYTES ; DB 2,12H,92H DS 1B8H-$ ;24 BYTES ; DB 66 DB 80 DB 7 DB 5 DB 5 DB 0 DB 6 DB 0 ;1C0H 8 BYTES ; ;MORE OF SAME FOR 3RD MODE ;-------------------------------; MODE3: DB '16.7 CPI, 8 LPI',0 DS 1E0H-$ ;32 BYTES ; DB 4,1BH,'0' DB 0FH,8FH DS 1F8H-$ ;24 BYTES ; DB 88 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;200H 8 BYTES ; ;MORE OF SAME FOR 4TH MODE ;-------------------------------; MODE4: DB 'Teeny Weeny',0 DS 220H-$ ;32 BYTES ; DB 8,0FH,8FH DB 1BH,'A',6 DB 1BH,'S1' DS 238H-$ ;24 BYTES ; DB 132 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 12 ;BOTTOM MARGIN IN LINES DB 0 ;240H 8 BYTES ; ;SPACE FOR 3 MORE MODES ;------------------------------; MODE5: DB 0 DS 63 ;280H 64 BYTES ; MODE6: DB 0 DS 63 ;2C0H 64 BYTES ; MODE7: DB 0 DS 63 ;300H 64 BYTES ; ;--- ; ; ;PROGRAM ACTION STARTS HERE ; ; ;-------------------------------; ; STARTº LXÉ SP,STAK CALL TYPDIS DB 'DBL Version 4.00, setup for a ',0 LXI H,DFMODE CALL TYPSTR CALL TPTHIS DB ' printer',13,10,10,0 LXI H,0 PUSH H STWTLP: XTHL! XTHL DCR L JNZ STWTLP DCR H JNZ STWTLP POP D LDA FCB+17 CPI 'P' JNZ STCLR MVI A,27 STA CURCHR LXI H,FCB+18 CALL GETPAG JC STCLR SHLD STPAGE ; ;BUFFER & COUNTER INITIALIZATIONS ;-------------------------------; STCLR: CALL CLRSCR STINT: LXI SP,STAK LXI H,DBUFER SHLD CURENT SHLD ODDPAG SHLD EVENPG LXI H,DIGIT MVI M,'1' INX H MVI C,5 MVI M,' ' CALL FILLM LXI H,LSPAGE MVI C,0 CALL ZAPMEM LDA FCB+1 CPI ' '+1 JC GTNAME LDA PASS ORA A MVI A,2 STA PASS JNZ OPENER GTNAME: CALL GTFNAM ; ;CHECK FOR EXISTING FILE & OPEN ;-------------------------------; OPENER: XRA A STA FCB+32 LXI D,FCB MVI C,15 ;FILE OPEN CALL BDOS LXI H,NOFI ;FILE ERROR? INR A JZ FINIS ; ;GET PRINT MODE ;-------------------------------; LDA PASS CPI 2 MVI A,0 STA PASS LXI H,MODE1 JZ MODECX CALL CLRSCR RETRY: LXI H,MODE1 LXI B,6 SAYMOD: MOV A,M ORA A JZ NXTMOD MOV A,B ADI '1' STA MDNUM CALL TYPDIS MDNUM: DB '0> Print using ',0 PUSH H CALL TYPSTR POP H NXTMOD: LXI D,64 DAD D INR B DCR C JNZ SAYMOD CALL TYPDIS DB 10,9,'YOUR CHOICE: ',0 ; ;KEY IN THE MODE NUMBER ;-------------------------------; KEYMD: CALL KEYIN CPI 27 JNZ KMDCK XRA A JMP KMDSET ; ;CHECK FOR NUMERIC INPUT ;-------------------------------; KMDCK: CPI '1' JC KEYMD CPI '6' JNC KEYMD DCR A ANI 00001111B KMDSET: MOV L,A MVI H,0 DAD H! DAD H ;*4 DAD H! DAD H ;*16 DAD H! DAD H ;*64 LXI D,MODE1 DAD D ;PLUS OFFSET MODECX: MOV A,M ORA A JZ MODERR ; ;MOVE CHOSEN MODE TO DEFAULT LOC ;-------------------------------; PUSH H MVI A,' ' CALL TYPE CALL TYPSTR CALL TCRLF POP H LXI D,32 DAD D LXI D,DFMODE MVI C,32 MODMOV: MOV A,M STAX D INX H! INX D DCR C JNZ MODMOV ; ;GET START PAGE NUMBER ;-------------------------------; LHLD STPAGE MOV A,H ORA L JNZ STPRT GTPGST: CALL TYPDIS DB 10,10,'Start print ' DB 'on page: ',0 CALL GETPG JZ ZSTPG SHLD STPAGE ZSTPG: LDA CURCHR CPI 27 JZ TFNAME ; ;GET LAST PAGE NUMBER ;-------------------------------; GTLAST: CALL TYPDIS DB 'Last page to print: ',0 CALL GETPG JZ ZLSPG INX H! INX H SHLD LSPAGE XCHG LHLD STPAGE INX H MOV A,D CMP H JC PAGERR JNZ ASKDTA MOV A,E CMP L JC PAGERR ZLSPG: LDA CURCHR CPI 27 JZ TFNAME ; ;ASK FOR PAGE DATA ;-------------------------------; ASKDTA: CALL TCRLF LXI H,PAGSTR LXI D,HGT MVI C,7 ; ;SAY WHAT THE DATA DOES ;-------------------------------; PGLOOP: PUSH B! PUSH D! PUSH H CALL TCRLF CALL TYPSTR PUSH H ; ;SAY WHAT DEFAULT IS ;-------------------------------; CALL TPTHIS DB ' (Default = ',0 LDAX D PUSH D CALL TYPNBR CALL TPTHIS DB '): ',0 ; ;GET REPLY FROM KEYBOARD ;-------------------------------; CALL KEYNUM POP D JC NUMERR ;NUMBER OUT OF RANGE ON CY JZ REPCK ;NO INPUT IF Z STAX D REPCK: LDA CURCHR CPI 27 JZ TFNAME PGDFLT: POP H ;GET NEXT STRING POINTER XTHL ;XCHG WITH LAST POINTER POP H! POP D! POP B ;HL POINTS TO NEXT STRING INX D ;DE POINTS TO NEXT DATA DCR C JNZ PGLOOP ; ;TELL FILENAME ;-------------------------------; TFNAME: CALL CLRSCR CALL TYPDIS DB 10,'Printing: ',0 LXI H,FCB CALL TYPFCB CALL TYPDIS DB 'Start Page: ',0 LHLD STPAGE INX H CALL TYPGNO CALL TPTHIS DB 9,'Finish Page: ',0 LHLD LSPAGE CALL TYPGNO CALL TYPDIS DB 10,'Page Format:',13,10,0 LXI D,HGT MVI C,7 LXI H,PAGSTR SHOFMT: CALL TYPSTR PUSH B! PUSH D! PUSH H LDAX D CALL TYPNBR CALL TCRLF POP H! POP D! POP B INX D DCR C JNZ SHOFMT CALL TYPDIS DB 10,'Press Return when ' DB 'printer is ready',13,10,10,0 PWAIT: CALL KEYIN CPI 27 JZ STPRT CPI 13 JNZ PWAIT STPRT: CALL TTCRLF CALL TYPPMG DB 'Stop/Resume',0 CALL TYPDIS DB 9,'Press Ctl-Q ' DB 'to Exit to System' DB 13,10,10,0 ; ;CHECK START ;-------------------------------; LHLD STPAGE MOV A,H ORA L CZ PRTINT LXI SP,STAK ;EMPTY STACK CALL TTCRLF ; ;CALCULATING TEXT SPACE ;WIDE = (WDT - LMG - RMG - CGP))/2 ;-------------------------------; XRA A LXI H,WDT MOV A,M INX H SUB M ;-LMG INX H SUB M ;-RMG INX H SUB M ;-CGP RRC ANI 01111111B JZ FMTERR STA WIDE ; ;DISTANCE FROM LEFT EDGE TO ;RIGHT COLUMN ;MGAP = WIDE + CGP ;-------------------------------; MOV B,A ADD M JM FMTERR STA MGAP ; ;DISTANCE BETWEEN 'PAGE [ ]' ;CGAP = MGAP - 10 ;-------------------------------; STC! CMC SBI 10 JM FMTERR STA CGAP ; ;DISTANCE TO FIRST 'PAGE [ ]' ;PNOFF = ((WIDE / 2 ) - 6) + LMRG ;-------------------------------; MOV A,B RRC ANI 01111111B ;/2 SBI 6 DCX H! DCX H ADD M ;+LMRG JM FMTERR STA PNOFF ; ;NUMBER OF PRINTABLE LINES ;LINMAX = HGT - MT - MB -2 ;-------------------------------; LXI H,MT LDA HGT SUB M ;-MT INX H SUB M ;-MB DCR A! DCR A STA LINMAX ; ;START THE READ ;-------------------------------; LXI D,DBUFER CALL FILLER ; ;FIND START OF EVEN NUMBERED PAGE ;-------------------------------; FINDPG: LDA LINMAX STA LCOUNT MOV B,A LHLD CURENT SHLD ODDPAG ; ;SEARCH FOR LINEFEED & EOF ;-------------------------------; FINDEV: CALL GNB CPI ' ' JNC FINDEV CPI 26 JZ NULINE CPI 12 JZ GOTEVN CPI 10 JNZ FINDEV DCR B JNZ FINDEV ; GOTEVN: LHLD CURENT MOV A,M CPI 12 JNZ NULINE INX H SHLD CURENT ; ;PRINT MARGIN AT TOP ;-------------------------------; NULINE: LDA MT ORA A JZ MTOFF MOV L,A MTON: CALL QCRLF DCR L JNZ MTON ; ;FLIP ODD & EVEN PAGE POINTERS ;-------------------------------; MTOFF: LHLD CURENT SHLD EVENPG LHLD ODDPAG SHLD CURENT MOV A,M CPI 26 JZ ENDIT ; ;PRINT A LINE ON SHEET OF PAPER ;-------------------------------; LDA LMG MOV C,A CALL SPACES CALL PRTLIN ;ODD PAGE LINE JC ENDIT ; ;FLIP POINTERS AGAIN ;-------------------------------; LHLD CURENT SHLD ODDPAG LHLD EVENPG SHLD CURENT MOV A,M CPI 26 JZ LNFEED CPI 12 JZ LNFEED ; ;CENTER GAP ;-------------------------------; LDA MGAP MOV C,A LDA BCOUNT SUB C CMA MOV C,A CALL SPACES CALL PRTLIN ;EVEN PAGE LNFEED: CALL CRLF JNZ NULINE ; ;END OF PAGE FLAG OCCURRED ;MOVE DOWN PAGE TO END ;-------------------------------; ENDIT: CALL CRLF LDA LCOUNT INR A JNZ ENDIT ; ;PRINT ODD PAGE NUMBER ;-------------------------------; LDA PCHAR STA PCFLG LDA PNOFF MOV C,A CALL PRTNUM ; ;PRINT EVEN PAGE NUMBER ;-------------------------------; LDA CGAP MOV C,A CALL PRTNUM CALL QCRLF ; ;CHECK TO SEE IF PRINTER WAS OFF ;BEFORE DOING END OF PAGE ;-------------------------------; LDA PCFLG ;WILL BE 0C9H IF OFF, ZERO IF ON ORA A LXI H,ENDPG CZ STRING ; ;CHECK FOR PASSING FORM FEED ;-------------------------------; LHLD ODDPAG MOV A,M CPI 12 JNZ ODDOFF INX H SHLD ODDPAG ODDOFF: LHLD CURENT MOV A,M CPI 12 JNZ EOF INX H SHLD CURENT ; ;CHECK FOR END OF PRINTING ;-------------------------------; EOF: LHLD LSPAGE MOV A,H ORA L JZ DONE ; ;CHECK FOR END OF FILE ;-------------------------------; LHLD EVENPG MOV A,M CPI 26 JNZ FINDPG ; ;FINISH MESSAGE ;-------------------------------; DONE: LXI H,GOOD FINIS: CALL TYPSTR CALL DEINIT JMP STINT ; ; ; ;---- ; ; ;START OF SUBROUTINES ; ; ;-------------------------------; ; ; ; ; ;MODE ERROR ;-------------------------------; MODERR: CALL ERROR DB 'Mode out of range',0 CALL TTCRLF JMP RETRY ; ;FORMAT ERROR ;-------------------------------; FMTERR: CALL ERROR DB 'Page format',0 JMP ASKDTA ; ;PAGE ERROR ;-------------------------------; PAGERR: CALL ERROR DB 'Page number',0 LXI H,0 SHLD STPAGE SHLD LSPAGE JMP GTPGST ; ; ;NUMBER ERROR ;-------------------------------; NUMERR: POP H POP H! POP D! POP B LDA CURCHR CPI 27 JZ TFNAME CALL ERROR DB 'Number out of range ' DB '(0 <= N <= 255)',0 JMP PGLOOP ; ; ;--- ; ; ;BUFFER OPERATIONS ; ;-------------------------------; ; ; ; ;MOVE CHARACTER IN A REG TO ;LINE BUFFER & BUMP COUNTERS ;-------------------------------; TOLIN: INX H MOV M,A LDA BCOUNT INR A STA BCOUNT DCR C RET ; ;MOVE FILE LINE TO LINE BUFFER ;-------------------------------; PRTLIN: LXI H,LBUFER XRA A MOV M,A STLINE: LDA WIDE MOV C,A XRA A STA BCOUNT ; ;FILL LINE BUFFER FROM DISK DATA ;-------------------------------; GETBYT: CALL GNB CPI ' ' JC GOTCTL CALL TOLIN JNZ GETBYT ; ;RAN OUT OF SPACE ON LINE ;-------------------------------; FNDEOL: CALL GNB ORA A CPI 26 JZ EOL CPI 13 JZ GOTCR CPI 12 JZ EOL CPI 10 JNZ FNDEOL ; ;GOT END OF LINE FLAG.. ;CHECK FOR EMPTY LINE BUFFER ;-------------------------------; EOL: PUSH PSW LXI H,LBUFER MOV A,M STA BCOUNT MOV D,A XRA A MOV M,A CMP D JZ NOPRT ; ;PRINT LINE BUFFER ;-------------------------------; PRTBUF: INX H MOV A,M CPI ' ' CNC PCHAR DCR D JNZ PRTBUF NOPRT: POP PSW RET ; ;GOT A CONTROL CHARACTER ;-------------------------------; GOTCTL: CPI 26 JZ EOL CPI 9 JZ TABBER CPI 12 JZ EOL CPI 10 JZ EOL CPI 13 JZ GOTCR JMP GETBYT ; ;TAB ENCOUNTERED ;FILL LINE BUFFER WITH SPACES ;TO NEXT MULTIPLE OF 8 ;-------------------------------; TABBER: PUSH D LDA BCOUNT ANI 00000111B MOV D,A MVI A,8 SUB D MOV D,A ; ;NUMBER OF SPACES IN D TO LINE ;-------------------------------; TABLUP: MVI A,' ' CALL TOLIN JZ TABEND DCR D JNZ TABLUP XRA A INR A TABEND: POP D JZ FNDEOL JMP GETBYT ; ;GOT A CARRIAGE RETURN ;CHECK LENGTH & RESET ;LINE BUFFER POINTER ;-------------------------------; GOTCR: CALL SETLIN JMP STLINE ; ;SET LINE LENGTH BYTE ;-------------------------------; SETLIN: LDA BCOUNT LXI H,LBUFER CMP M RC MOV M,A RET ; ;--- ; ; ;DISK BUFFER CONTROL ROUTINES ; ;-------------------------------; ; ; ; ;GET NEXT BYTE FROM FILE ;-------------------------------; GNB: PUSH B! PUSH D! PUSH H CALL KEYCHK ORA A JZ CURCHK CPI 27 JZ PRXIT ; ;CHECK FOR 'P' INPUT ;-------------------------------; PCHECK: ANI 00011111B CPI 16 JNZ CURCHK CALL TYPPMG DB 'Resume',0 CALL TCRLF ; ;CHECK FOR P TO RESUME ;-------------------------------; PCHK: CALL KEYIN CPI 27 JZ PRXIT ANI 00011111B CPI 16 JNZ PCHK CALL TYPPMG DB 'Stop',0 CALL TTCRLF ; ;CHECK CURRENT DISK POINTER ;AGAINST TOP OF MEMORY ;THEN GET BYTE FROM FILE ;-------------------------------; CURCHK: LHLD CURENT CCHK1: CALL TOPCMP CZ FILMEM LHLD CURENT MOV A,M CPI 26 JZ GNBRET INX H CPI 12 JZ GNBRET SHLD CURENT GNBRET: POP H! POP D! POP B RET ; ;ZERO C BYTES OF MEMORY ;-------------------------------; ZAPMEM: MVI M,0 ; ;FILL C BYTES OF MEMORY ;-------------------------------; FILLM: DCR C RZ MOV D,H MOV E,L INX D ; ;MOVE C BYTES OF MEMORY ;-------------------------------; MEMOV: MOV A,M STAX D INX H! INX D DCR C JNZ MEMOV RET ; ;READ BIGGEST POSSIBLE CHUNK OF ;THE DATA FILE INTO MEMORY ;-------------------------------; FILMEM: LHLD ODDPAG MVI L,0 LXI D,DBUFER ; ;MOVE DATA TO LO MEMORY ;-------------------------------; MOVER: MVI C,80H CALL MEMOV CALL TOPCMP JNZ MOVER ; ;READ DISK DATA TO MEMORY AT DE ;-------------------------------; FILLER: PUSH D MVI C,26 CALL BDOS LXI D,FCB MVI C,20 CALL BDOS POP H MVI C,80H ORA A JZ FILTER ; ;UNABLE TO READ DATA MUST BE END ;FILL THIS BLOCK WITH EOF MARKERS ;-------------------------------; SETEND: MVI M,26 INX H DCR C JNZ SETEND CALL TOPCMP JNZ SETEND JMP SETPTR ; ;STRIP PARITY BIT FROM EVERY ;BYTE IN BLOCK JUST READ ;-------------------------------; FILTER: MOV A,M ANI 01111111B MOV M,A INX H DCR C JNZ FILTER CALL TOPCMP XCHG JNZ FILLER ; ;ADJUST PAGE POINTERS TO ;NEW MEMORY LOCATIONS ;-------------------------------; SETPTR: LHLD ODDPAG LXI D,DBUFER MOV A,H SUB D MOV C,A MOV H,D SHLD ODDPAG LDA EVENPG+1 SUB C STA EVENPG+1 LDA CURENT+1 SUB C STA CURENT+1 RET ; ;CHECK FOR HL POINTING ;TO TOP OF MEMORY ;-------------------------------; TOPCMP: LDA BDOS+2 DCR A CMP H RET ; ;--- ; ; ;PRINTER OUTPUT ROUTINES ; ;-------------------------------; ; ; ;PRINT NUMBER OF SPACES IN C REG ;-------------------------------; SPACES: PUSH B MVI A,' ' CALL PCHAR POP B DCR C JNZ SPACES RET ; ;DO CARRIAGE RETURN & LINEFEED ;THEN BUMP LINE COUNT ;-------------------------------; CRLF: CALL QCRLF LDA LCOUNT DCR A STA LCOUNT RET ; ;CARRIAGE RETURN & LINEFEED ONLY ;-------------------------------; QCRLF: MVI A,13 CALL PCHAR MVI A,10 ; ;PRINT CHARACTER IN THE A REG ;-------------------------------; PCHAR: RET ;THIS INSTRUCTION GETS ;CHANGED BY PROGRAM PUSH B! PUSH D! PUSH H MOV E,A MVI C,5 CALL BDOS POP H! POP D! POP B RET ; ;PRINT C SPACES THEN PAGE NUMBER ;-------------------------------; PRTNUM: LDA PCFLG ORA A JNZ PRBUMP CALL SPACES LXI H,PGNUMB CALL STRING PRBUMP: CALL BMPNUM LHLD LSPAGE DCX H SHLD LSPAGE LHLD STPAGE DCX H SHLD STPAGE DCX H MOV A,H ORA L RNZ ; ;INITIALIZE PRINTER ;-------------------------------; PRTINT: XRA A STA PCHAR LXI H,DFMODE ; ;PRINT STRING AT HL ;-------------------------------; STRING: MOV A,M INX H CPI 0 RZ MOV C,A STRGLP: MOV A,M CALL PCHAR INX H DCR C JNZ STRGLP RET ; ;INCREMENT ASCII PAGE NUMBER ;-------------------------------; BMPNUM: LXI H,DIGIT NXTNUM: INR M MOV A,M CPI '9'+1 RNZ ; ;CURRENT DIGIT IS LARGER THAN 9 ;REPLACE WITH ZERO & DO NEXT DIGIT ;-------------------------------; MVI M,'0' DCX H MOV A,M CPI 'A' RNC CPI ' ' JNZ NXTNUM MVI M,'1' RET ; ;--- ; ; ;CONSOLE INPUT/OUTPUT ROUTINES ; ;-------------------------------; ; ; ;DIVDE HL BY DE & PRINT RESULT ;-------------------------------; TSLASH: MVI C,255 TSLOOP: INR C XRA A MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A JNC TSLOOP DAD D MOV A,C ORA A JNZ TDGT ORA B MVI A,' ' JZ TYPE XRA A TDGT: ADI '0' MOV B,A ; ;TYPE CHARACTER IN A ON CONSOLE ;-------------------------------; TYPE: PUSH B! PUSH D! PUSH H MOV E,A MVI C,6 CALL BDOS CALL KEYCHK CPI 19 CZ FREEZE POP H! POP D! POP B RET ; ;FREEZE SCREEN UNTIL CTL-S ENTERED ;-------------------------------; FREEZE: CALL KEYCHK CPI 19 JNZ FREEZE RET ; ;PRINT STRING AT HL ;-------------------------------; TYPSTR: MOV A,M INX H CPI 0 RZ CPI 9 JZ TYPTAB CALL TYPE JMP TYPSTR ; ;PHONEY TAB ;-------------------------------; TYPTAB: PUSH B MVI C,8 TPTAB: MVI A,' ' CALL TYPE DCR C JNZ TPTAB POP B JMP TYPSTR ; ;PRINT STRING FOLLOWING CALL ;-------------------------------; TYPDIS: CALL TCRLF TPTHIS: XTHL CALL TYPSTR XTHL RET ; ;CARRIAGE RETURN & LINE FEED ;-------------------------------; TTCRLF: CALL TCRLF TCRLF: CALL TPTHIS DB 13,10,0 RET ; ;CLEAR SCREEN ;-------------------------------; CLRSCR: MVI C,12 CLS: CALL TTCRLF DCR C JNZ CLS RET ; ;TYPE PRINTER MESSAGE ;-------------------------------; TYPPMG: CALL TYPDIS DB 9,'Press "P" to ',0 XTHL CALL TYPSTR XTHL CALL TPTHIS DB ' Print',13,10 db 9,'Press [Escape] ' DB 'to Exit to Menu',0 RET ; ;DECIMAL PRINT NUMBER IN A REG ;-------------------------------; TYPNBR: MOV L,A MVI H,0 ; ;DECIMAL PRINT NUMBER IN HL ;-------------------------------; TYPNUM: PUSH B! PUSH D MVI B,0 LXI D,10000 CALL TSLASH LXI D,1000 CALL TSLASH LXI D,100 CALL TSLASH LXI D,10 CALL TSLASH POP D! POP B MOV A,L ADI '0' JMP TYPE ; ;TYPE PAGE NUMBER ;-------------------------------; TYPGNO: MOV A,H ORA L JNZ TYPNUM CALL TPTHIS DB ' (Default) ',0 RET ; ;CHECK FOR KEYBOARD INPUT ;-------------------------------; KEYCHK: MVI E,255 MVI C,6 CALL BDOS CPI 24 JZ PRXIT CPI 17 JZ CTLQ ORA A RET ; ;INPUT A CHARACTER - EXIT IF CTL C ;-------------------------------; KEYIN: PUSH B! PUSH D! PUSH H KEYN1: CALL KEYCHK JZ KEYN1 STA CURCHR ; ;ECHO CHARACTER IF NO CONTROL ;-------------------------------; PUSH PSW MOV E,A MVI C,6 CPI ' ' CNC BDOS POP PSW POP H! POP D! POP B RET ; ;CONTROL Q - QUIT ;-------------------------------; CTLQ: LXI SP,STAK CALL CLS CALL DEINIT JMP 0 ; ;CONTROL X ;STOP PRINT & RETURN MAIN ;-------------------------------; PRXIT: CALL DEINIT JMP STCLR ; ;DEINITIALIZATIONS ;-------------------------------; DEINIT: LXI H,0 SHLD STPAGE ; ;RESET PRINTER IF INITIALIZED ;-------------------------------; LDA PCHAR ORA A RNZ LXI H,ENDPG CALL STRING LXI H,NORMAL CALL STRING MVI A,0C9H ;RET STA PCHAR RET ; ;FILL BUFFER FROM KEYBOARD ;-------------------------------; KEYBFR: LXI H,LBUFER PUSH H MVI C,40H CALL ZAPMEM MVI C,3FH POP H ; ;GET A BYTE & CHECK FOR CONTROL ;-------------------------------; KBFR: CALL KEYIN CPI ' ' JNC K2BFR CPI 13 RZ CPI 27 RZ CPI 8 JNZ KBFR MOV A,C CPI 3FH JZ KBFR INR C DCX H MVI M,0 CALL TPTHIS DB 8,' ',8,0 JMP KBFR ; ;MOVE BYTE IN A TO BUFFER ;-------------------------------; K2BFR: MOV M,A INX H MVI M,0 DCR C JNZ KBFR RET ; ;INPUT ERROR OCCURRED ;-------------------------------; ERROR: CALL TTCRLF XTHL CALL TYPSTR XTHL CALL TPTHIS DB 7,' - ERROR! ... ' DB 'Please Retry',13,10,0 RET ; ;CONVERT NUMBER STRING TO BINARY ; RETURNS: ; NUMBER IN HL & ; CARRY FLAG IF HL>255 ; NZ FLAG IF 0UÌ Í �·Ì=¯2ãÍã Í�ÃU ~BŽ 10 CPIp#z³Âà 17!ªÍ9:l2¾:]’Êß!¶Ͱ ¤Ͱ ÊBP16.7 CPI, 8 LPIÀÍ`2š!vÍn!›0�§Ê5 Ͱ›ÍŽ›Í“XŽ Teeny Weeny80Ä=Ãä þÌ=h�AS1 þ$Êu @!Ü„Ž  6.7 CPI, 6 LPIÙ ÍÜæ>UÌ Í �·Ì=¯2ãÍã Í�ÃU ~Ž 0 CPIp#z³Âà 17!ªÍ9:l2¾:]’Êß!¶Ͱ ¤Ͱ ÊBP6.7 CPI, 8 LPIÀÍ`2š!vÍn!›0�§Ê5 Ͱ›ÍŽ›Í“XŽ 1þÍ DBL Version 4.00, setup for a !Íø Í printer !åãã-Â>%Â>Ñ:mþPÂb>2` !nͬ Úb"\ Í+ 1þ!"V "X "Z !Æ 61#6 ÍÆ!^ ÍÄ:]þ!Ú�:T ·>2T  ÍÔ ¯2|\Í!Õ <Ê;:T þ>2T !@Ê2Í+ !@~·ÊðxÆ12ÚÍ 0> Print using åÍø á@ ÂÌÍ YOUR CHOICE: ÍÇ þ¯Ã%þ1Ú þ6Ò =æo&))))))@~·ÊDå> ÍÚ Íø Í$ á  ~# ÂM*\ |µÂÄÍ Start print on page: Í´ Ê�"\ :` þÊÍ Last page to print: Í´ ʾ##"^ ë*\ #z¼ÚqÂÆ{½Úq:` þÊÍ$ !ã ÅÕåÍ$ Íø åÍ (Default = ÕÍx Í ): Ív ÑÚŒÊ:` þÊáãáÑÁ ÂÑÍ+ Í Printing: !\Í— Í Start Page: *\ #ÍŸ Í Finish Page: *^ ÍŸ Í Page Format: !ã Íø ÅÕåÍx Í$ áÑÁ ÂxÍ Press Return when printer is ready ÍÇ þÊÄþ ·Í! Í5 Stop/ResumeÍ Press Ctl-Q to Exit to System *\ |µÌ� 1þÍ! ¯!~#–#–#–æÊ_2c G†ú_2e 7?Þ ú_2g xæÞ++†ú_2f ! :–#–==2d Íç:d 2a G*V "X Íhþ Ò_þʇþ Êzþ Â_Â_*V ~þ ‡#"V : ·Ê–oÍU -Â�*V "Z *X "V ~þÊâ:OÍ> ÍÍÚâ*V "X *Z "V ~þÊÜþ ÊÜ:e O:b ‘/OÍ> ÍÍÍJ ‡ÍJ :a <Ââ:\ 2U :f OÍj :g OÍj ÍU :U ·!#Ì– *X ~þ Â#"X *V ~þ Â'#"V *^ |µÊ8*Z ~þÂR!Ç Íø Íó ÃeÍL Mode out of rangeÍ! ÃÆÍL Page formatÃÆÍL Page number!"\ "^ Ã]ááÑÁ:` þÊÍL Number out of range (0 <= N <= 255)ÃÑ#w:b <2b É!€¯w:c O¯2b Íhþ ÚÍÂÂÚÍh·þÊþ ÊXþ Êþ Âèõ!€~2b W¯wºÊ#~þ Ô\ ÂñÉþÊþ Ê8þ Êþ Êþ ÊXÃÚÕ:b æW>’W> ÍÂÊQÂC¯<ÑÊèÃÚÍ^ÃÒ:b !€¾ØwÉÅÕåÍ´ ·Ê¥þÊí æþÂ¥Í5 ResumeÍ$ ÍÇ þÊí æþ‹Í5 StopÍ! *V Í8 ÌÔ*V ~þÊÀ#þ ÊÀ"V áÑÁÉ6 ÈT]~# ÂËÉ*X .€ÍËÍ8 ÂÜÕÍ\Íá€·Ê 6# ÂüÍ8 Âüà ~æw#  Í8 ëÂç*X |’Ob"X :[ ‘2[ :W ‘2W É:=¼ÉÅ> Í\ Á Â> ÉÍU :a =2a É> Í\ > ÉÅÕå_ÍáÑÁÉ:U ·Âz Í> !¼ Í– ͦ *^ +"^ *\ +"\ +|µÀ¯2\ !~#þÈO~Í\ # œ É!Æ 4~þ:À60+~þAÐþ © 61Éÿ ¯}“o|šgÒ¿ y·Â× °> ÊÚ ¯Æ0GÅÕå_ÍÍ´ þÌï áÑÁÉÍ´ þÂï É~#þÈþ Ê ÍÚ Ãø Å> ÍÚ Â ÁÃø Í$ ãÍø ãÉÍ$ Í É Í! Â- ÉÍ Press "P" to ãÍø ãÍ Print Press [Escape] to Exit to MenuÉo&ÅÕ'ͽ èͽ dͽ  ͽ ÑÁ}Æ0ÃÚ |µÂ{ Í (Default) ÉÿÍþÊí þÊá ·ÉÅÕåÍ´ ÊÊ 2` õ_þ ÔñáÑÁÉ1þÍ- Íó ÃÍó Ãb!"\ :\ ·À!#Í– !0Í– >É2\ É!€å@ÍÄ?áÍÇ þ ÒC þ ÈþÈþ yþ?Ê +6Í  à w#6  ÉÍ! ãÍø ãÍ  - ERROR! ... Please Retry ÉÍ !€åÍ’ ëÑ|þ7ÀµÀæà>É~þ0Øþ:Ðåbk)))æ_ëá#Ã’ ¯/Í| ÷ Ív Èõ}æÂÁ ++}æþoñÉ~#æþaØþ{Ðæ_ÉÍ File to print (D:FILENAME.TYP): !\åh  ÍËáå6#6  ÍÆÍÄÍ :` þÂ2 !h ÑÕ ÍËáåÍ— Ã� !�~+þ:ÂD ~æãwã##ÑÕÍÇ þ!Ú� þ.Êi  ÂI ÍÇ þ!Ú� þ.Â\ ãë! ëãÍÇ þ!Ú�  Âs á#~þ!ÐåÍL Filenameà ~·Ê¦ Æ@ÍÚ >:ÍÚ  #~þ ÄÚ yþ>.ÌÚ Â¨ É Page 1 finished No File Page Height Page Width Left Margin Right Margin Center Gap Top Margin Bottom Margin .heDOCUMENTATION FILE FOR: DBL.COM Version 4.00 FUNCTION: DBL.COÍ waó writteî tï uså thå compresseä modå oæ mosô � printeró iî uså today¬ tï prinô fileó twï pageó aô á � timå oî á singlå sheeô oæ paper¬ sorô oæ likå this: xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxx Pg 1 Pg 2 HISTORY: Thå firsô versionó (whicè werå noô releaseä tï thå � public© useä CP/M'ó randoí disë reaä functioî � extensively® Theså versionó werå harä oî disë drives¬ � thå lighô oî thå driveó woulä comå oî anä staù oî untiì � thå printinç quit® Thå firsô versioî releaseä tï thå � publiã useä alì oæ thå computeró availablå RAÍ spacå aó � á gigantiã disë buffer® Thió versioî coulä reaä mosô � fileó aô onå time¬ theî begiî printinç them¬ greatlù � reducinç thå drivå activity® Thå seconä versioî � releaseä tï thå publiã (DBL2© containeä á ne÷ feature¬ � iô alloweä thå printinç tï starô iî thå middlå oæ thå � file¬ unfortunately¬ iô containeä severaì minoò � inconvienences¬ anä aô leasô onå bug® Iô didn'ô likå � tï starô printinç oî á pagå thaô occurreä afteò thå � seconä disë access® Thå thirä versioî cureä thå � problem¬ oò seemeä tï anä tooë carå oæ somå oæ thå � inconvienence¬ buô neveò goô releaseä tï thå public® � DBL´ cureó thå problemó froí DBL³ anä containó á numbeò � oæ ne÷ options¬ includinç aî assortmenô oæ prinô modå � optionó anä á seô prinô formaô options. MENU OPTIONS: Iæ á filenamå ió specifieä wheî thå prograí ió calleä � uð aó iô waó iî DBL2¬ sucè as: A>DBL4 D:FILENAME.TYP P5 Alì oæ thå defaulô optionó arå takeî anä printinç � proceedó jusô aó iî DBL2. Iæ nï filenamå ió specified¬ thå prograí wilì prompô � foò á filename® Thió filenamå ió entereä iî thå � followinç format: D:FILENAME.TYP Wherå 'D§ ió thå drivå tï bå useä (Á thrõ P)¬ � 'FILENAME§ ió thå primarù filå namå oæ eighô oò lesó � characters¬ 'TYP§ ió thå secondarù namå (TYPE© iî threå � oò feweò characters® Thå prograí assumeó thaô thå � seconä characteò wilì bå á coliî (':')¬ iæ á drivå ió � beinç specified¬ otherwiså thå defaulô drivå wilì bå � used® Iæ thå 'FILENAME§ ió morå thaî eighô (8© � characteró iî lengtè oò iæ thå doô separatinç iô froí � thå 'TYP§ ió omitted¬ alì characteró beyonä thió poinô � wilì bå discardeä untiì eitheò á doô oò thå enä oæ thå � specificatioî ió reached® Althougè iô takeó á carragå � returî oò aî escapå tï terminatå thå entry¬ inter-� pretatioî oæ thå entrù wilì terminatå iæ á spacå ió � entered® Finally¬ thå previouó filenamå ió copieä tï á � buffeò beforå thå ne÷ entrù ió interpreted¬ iæ yoõ wisè � tï uså thå samå filå specification¬ yoõ merelù neeä tï � presó thå [Escape] key. Afteò thå filenamå ió entered¬ eacè valiä printeò modå � ió showî alonç witè á prompô foò youò choice® Aô thió � poinô thå computeò wilì bå waitinç foò yoõ tï presó á � numeriã keù iî thå rangå oæ ± thrõ 7¬ iæ yoõ enteò aî � invaliä option¬ you'lì geô tï dï iô over® Aó sooî aó � yoõ presó á valiä key¬ it'lì prinô thå correspondinç � modå (iæ yoõ goofeä there'ó á waù out). Nexô it'lì asë firsô foò thå starô page¬ theî thå � finisè page® Yoõ caî keù iî anù decimaì numbeò yoõ � want¬ buô iô onlù seeó numberó froí ° thrõ 65535¬ buô � you'lì havå tï presó thå returî keù tï telì iô wheî yoõ � arå enterinç á number® Bù thå way¬ don'ô keù iî � anythinç thaô isn'ô á decimaì digiô (° tï 9)¬ iô � terminateó thå numbeò wheî iô seeó anythinç thaô isn'ô � á decimaì digit® Iæ yoõ enteò á finisè pagå thaô comeó � beforå thå starô page¬ iô wilì noô accepô it¬ � additionally¬ alì startó arå roundeä dowî tï thå � nearesô odä number¬ alì finisheó uð tï thå nearesô eveî � number. Thå pagå formaô comeó next® Thå prograí printó eacè � item¬ theî thå defaulô anä waitó foò youò input® Iô � wantó á number¬ aó above¬ buô onlù acceptó numberó iî � thå rangå oæ ° thrõ 255® Thå promptó are: Page Height (Default = ###): Page Width (Default = ###): Left Margin (Default = ###): Right Margin (Default = ###): Center Gap (Default = ###): Top Margin (Default = ###): Bottom Margin (Default = ###): � Afteò alì oæ thå formaô optionó arå entered¬ iô doeó � somå mathmatics® Iæ somethinç goeó wronç iî thå � mathmatics¬ yoõ geô tï dï thå formaô over. Oncå iô haó alì oæ thå above¬ iô wilì sho÷ whaô iô got¬ � anä waiô foò yoõ tï approvå iô bù pressinç thå returî � key® Iæ yoõ presó thå returî key¬ it'lì reaä thå disë � anä starô printing® Yoõ caî interupô thå printinç bù � pressinç thå 'P§ key¬ theî resumå bù pressinç thå 'P§ � agaiî ¨ 'p§ anä Ctl-Ð dï thå samå thinç )® Wheî thå � printinç ió donå iô wilì returî tï thå filenamå prompt. Yoõ caî exiô thå prograí aô anù timå bù enterinç Ctl-Q¬ � enterinç á Ctl-Ø wilì returî yoõ tï thå filenamå � prompt® Pressinç thå Escapå keù whilå printinç ió � goinç oî wilì alsï returî yoõ tï thå filenamå prompt® � Additionally¬ thå Escapå keù wilì takå thå defaultó foò � alì oæ thå itemó iî á serieó oæ prompts® Á singlå � defaulô caî bå takeî bù merelù pressinç thå Returî keù � foò anù prompô excepô foò thå prinô mode. INSTALLING DIFFERENT PRINTER: Differenô strokeó foò differenô folks® Therå arå morå � differenô printeró oî thå markeô thaî É kno÷ about¬ � eacè oæ theí takeó á differenô sequencå oæ controì � codes® Fortunatelù Epsoî anä Okidatá seeí tï bå takinç � uð thå majoò portioî oæ thå market¬ sï I'vå writteî � overlayó foò botè oæ them® Thå onlù onå thaô É aí � absolutelù surå workó ió thå Epsoî RX-80¬ becauså � that'ó whaô I'vå got® Thå twï overlaù fileó arå nameä � DBLEPSON.OVÒ ¦ DBLOKI.OVR¬ respectively¬ geô thå onå � thaô matcheó youò printeò anä renamå iô witè á .ASÍ � type® Uså ASÍ tï assemblå iô aî makå á .HEØ file® No÷ � uså DDÔ tï combinå DBL4.COÍ anä thå overlaù aó follows: A>DDT DBL4.COM Call up DDT & tell it to read DDT VERS 2.2 DBL4.COM NEXT PC (Note that DDT signs on with 0D80 0100 information about itself and DBL4.COM) -DD40,D5F Tell DDT to display last two lines of program 0D40 20 20 00 09 42 6F 74 74 6F 6D 20 4D 61 72 67 69 ..Bottom Margi 0D50 6E 20 00 00 01 00 00 00 00 00 00 00 00 00 00 00 n .............. -IDBLOKI.HEX Input overlay filename.hex -R Read overlay NEXT PC DDTs reply 0D80 0100 -G0 Exit DDT A>SAVE 13 DBL+.COM Savå thå overlayeä filå witè á ne÷ name - don't use old name. A>DDT Call up DDT again DDT VERS 2.2 This time theres not much sign on because no other file was read -F100,1000,FF Fill bottom of TPA with 0FFH -IDBL+.COM Insert name of modified version -R Read modified version -DD40,D5F Tell DDT to display last two lines of program (should match previous) 0D40 20 20 00 09 42 6F 74 74 6F 6D 20 4D 61 72 67 69 ..Bottom Margi 0D50 6E 20 00 00 01 00 00 00 00 00 00 00 00 00 00 00 n .............. If the line match the previous dump then the new version is all there F5C,5C,0 Clear out the default file control block F5D,67,20 F68,FF,0 G100 Start program running...and test options If it works properly you can rename it otherwise you get to try the proceedure over again. BUGS: Therå haó tï bå á few¬ therå alwayó is¬ additionallù � somå oæ thå ne÷ featureó maù noô bå implimenteä verù � welì anä neeä somå refinement¬ sï don'ô thinë thió ió � thå ultimatå version. OTHER POSSIBLE FEATURES: Á numbeò oæ peoplå havå askeä foò á doô commanä � interpreter® É supposå thaô it'ó possiblå tï do¬ buô � thå problemó thaô comå uð wheî printinç tï pageó aô � oncå seeí monumentaì righô now® Doinç somå oæ thå � thingó thaô programó likå WordStaò dï ió fairlù easù tï � dï wheî there'ó onlù onå page® Wheî there'ó twï pageó � thingó likå emphasizeä prinô that'ó oî severaì lineó oæ � onå pagå buô noô oî thå otheò aô all¬ ió morå thaî á � littlå biô tricky® Doinç headingó anä footingó poså � similaò problems. Thå outpuô froí DBÌ lookó sorô oæ likå thå waù thaô á � printinç companù woulä seô uð theiò printinç foò á � book® Publisheró uså á methoä oæ puttinç thå pageó � togetheò knowî aó á printeró gallery¬ thå lasô anä � firsô pageó arå oî thå samå sidå oæ sheeô (iî thaô � order© anä thå seconä anä nexô tï lasô arå oî thå otheò � (iî thaô order)® Thió meanó thaô thå starô oæ alì oæ � thå pageó havå tï bå locateä beforå thå printinç � begins® Theî alì oæ botè pageó haó tï bå iî memorù aô � thå timå thå printinç begins® Iô coulä bå done¬ buô � noô verù easily...it'ó betteò tï prinô thå pageó onå bù � onå anä tapå theí togetheò iî thå propeò order. Ho÷ abouô sendinç thå outpuô tï thå consolå oò tï á � disë file® Botè arå possible¬ buô I'vå haä abouô alì � oæ thå rampanô featureitiuó thaô É caî takå foò now® � Maybå thió winter. --- Alan Wayne Warren --- Sept 6, 1985; ; ; DBLEPSON.ASM ; DBL4.COM OVERLAY FOR ; EPSON RX80/MX80 PRINTER ; ; VERSION OF SEPT. 6, 1985 ; BY: ALAN W WARREN ;-------------------------------; ORG 0100H DS 3 ;JUMP VECTOR SPACE ; ;SPACE FOR RELOCATING CODE FOR ;EASY ACCESS BY PROGRAM ;-------------------------------; DFMODE: DB 'Epson RX-80',0 DS 11BH-$ ;11BH - 24 (18H) BYTES FOR CODE DB 0,0,0,0,0,0,0,0 ;8 BYTES FOR FORMAT ; ; ;PRINTER CONTROL STRINGS FOR ;EPSON PRINTER (RX-80) ;-------------------------------; ENDPG: DB 1,0CH DS 130H-$ ;13 BYTES NORMAL: DB 2,1BH,40H ;MASTER RESET DS 140H-$ ;16 BYTES ; ; ;MODE CONTROL BLOCKS ; ; MODE ID STRINGS 32 BYTES ; PRINT MODE CONTROL 24 BYTES ; PAGE FORMAT CONSTANTS 8 BYTES ; TOTALS: 64 BYTES ;-------------------------------; MODE1: DB '16.7 CPI, ' DB '6 LPI',0 DS 160H-$ ;32 BYTES ; ;24 BYTES FOR PRINT MODE CONTROL ;-------------------------------; DB 2,0FH,8FH DS 178H-$ ;24 BYTES ; ;8 BYTES FOR PAGE LAYOUT ;-------------------------------; DB 66 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;MORE OF SAME FOR 2ND MODE ;-------------------------------; MODE2: DB '10 CPI',0 DS 1A0H-$ ;32 BYTES ; DB 2,12H,92H DS 1B8H-$ ;24 BYTES ; DB 66 DB 80 DB 7 DB 5 DB 5 DB 0 DB 6 DB 0 ;8 BYTES ; ;MORE OF SAME FOR 3RD MODE ;-------------------------------; MODE3: DB '16.7 CPI, 8 LPI',0 DS 1E0H-$ ;32 BYTES ; DB 4,1BH,'0' DB 0FH,8FH DS 1F8H-$ ;24 BYTES ; DB 88 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;MORE OF SAME FOR 4TH MODE ;-------------------------------; MODE4: DB 'Teeny Weeny',0 DS 220H-$ ;32 BYTES ; DB 8,0FH,8FH DB 1BH,'A',6 DB 1BH,'S1' DS 238H-$ ;24 BYTES ; DB 132 ;PAGE HEIGHT IN LINES DB 142 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 12 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;SPACE FOR 3 MORE MODES ;------------------------------; MODE5: DB 0 DS 63 ;64 BYTES ; MODE6: DB 0 DS 63 ;64 BYTES ; MODE7: DB 0 DS 63 ;64 BYTES END ;300H = NEXT ADDRESS ; ; ; DBLGEN.ASM ; DBL4.COM OVERLAY ; GENERALIZED PRINTER ; ; VERSION OF SEPT. 6, 1985 ; BY: ALAN W WARREN ;-------------------------------; ORG 0100H DS 3 ;JUMP VECTOR SPACE ; ;PRINTER ID STRING ; TERMINATE WITH ZERO ;-------------------------------; DS 123H-$ ;32 BYTES FOR STRING ; ; ;PRINTER CONTROL STRINGS: ; FIRST BYTE TELLS HOW MANY ; BYTES ARE TO BE SENT TO PRINTER ; START ADDRESS = 123H ;-------------------------------; ENDPG: DB 1,12 ;STRING TO PRODUCE FORM FEED DS 130H-$ ;13 BYTES AVAILABLE NORMAL: DB 0 ;RESET PRINTER TO NORMAL DS 140H-$ ;16 BYTES AVAILABLE ; ; ;MODE CONTROL BLOCKS ; ; MODE ID STRINGS 32 BYTES TERMINATES WITH ZERO, ; LEAD ZERO DISABLES MODE ; PRINT MODE CONTROL 24 BYTES TERMINATES WITH ZERO ; PAGE FORMAT CONSTANTS 8 BYTES ; -------- ; TOTALS: 64 BYTES ;-------------------------------; MODE1: DB '10 CPI ' DB '& 6 LPI',0 ;LAST CHARACTER IN STRING IS ZERO DS 160H-$ ;32 BYTES AVAILABLE ; ;24 BYTES FOR PRINT MODE CONTROL ;-------------------------------; DB 0 ;LEAD BYTE TELLS STRING LENGTH DS 178H-$ ;24 BYTES AVAILABLE ; ;8 BYTES FOR PAGE LAYOUT ;-------------------------------; DB 66 ;PAGE HEIGHT IN LINES DB 85 ;PAGE WIDTH IN CHARACTERS DB 8 ;LEFT MARGIN IN CHARACTERS DB 4 ;RIGHT MARGIN IN CHARACTERS DB 4 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;FILLS UP 8 BYTES ; ;MORE OF SAME FOR 2ND MODE ; (ADDRESS SHOULD BE 180) ;-------------------------------; MODE2: DB 0 ;FIRST CHARACTER MUST BE ZERO ;IF MODE IS NOT IN USE DS 63 ;64 BYTES TOTAL ; ; ;SAME FOR 3RD, 4TH, 5TH, 6TH & 7TH ;-------------------------------; MODE3: DB 0 ;ADDRESS = 1C0H DS 63 ;64 BYTES TOTAL ; MODE4: DB 0 ;ADDRESS = 200H DS 63 ;64 BYTES TOTAL ; MODE5: DB 0 ;ADDRESS = 240H DS 63 ;64 BYTES TOTAL ; MODE6: DB 0 ;ADDRESS = 280H DS 63 ;64 BYTES TOTAL ; MODE7: DB 0 ;ADDRESS = 2C0H DS 63 ;64 BYTES TOTAL END ;300H = NEXT ADDRESS ; ; ; DBLEPSON.ASM ; DBL4.COM OVERLAY FOR ; OKIDATA MICROLINE PRINTER ; ; VERSION OF SEPT. 6, 1985 ; BY: ALAN W WARREN ;-------------------------------; ORG 0100H DS 3 ;JUMP VECTOR SPACE ; ;SPACE FOR RELOCATING CODE FOR ;EASY ACCESS BY PROGRAM ;-------------------------------; DFMODE: DB 'Okidata Microline',0 DS 11BH-$ ;11BH - 24 (18H) BYTES FOR CODE DB 0,0,0,0,0,0,0,0 ;8 BYTES FOR FORMAT ; ; ;PRINTER CONTROL STRINGS FOR ;EPSON PRINTER (RX-80) ;-------------------------------; ENDPG: DB 1,12 DS 130H-$ ;13 BYTES NORMAL: DB 2,24 ;MASTER RESET DS 140H-$ ;16 BYTES ; ; ;MODE CONTROL BLOCKS ; ; MODE ID STRINGS 32 BYTES ; PRINT MODE CONTROL 24 BYTES ; PAGE FORMAT CONSTANTS 8 BYTES ; TOTALS: 64 BYTES ;-------------------------------; MODE1: DB '17.1 CPI, at ' DB '6 LPI',0 DS 160H-$ ;32 BYTES ; ;24 BYTES FOR PRINT MODE CONTROL ;-------------------------------; DB 1,29 DS 178H-$ ;24 BYTES ; ;8 BYTES FOR PAGE LAYOUT ;-------------------------------; DB 66 ;PAGE HEIGHT IN LINES DB 145 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;MORE OF SAME FOR 2ND MODE ;-------------------------------; MODE2: DB '10 CPI',0 DS 1A0H-$ ;32 BYTES ; DB 0 DS 1B8H-$ ;24 BYTES ; DB 66 DB 85 DB 7 DB 5 DB 5 DB 0 DB 6 DB 0 ;8 BYTES ; ;MORE OF SAME FOR 3RD MODE ;-------------------------------; MODE3: DB '17.1 CPI, at ' DB '8 LPI',0 DS 1E0H-$ ;32 BYTES ; DB 3,29,27,56 DS 1F8H-$ ;24 BYTES ; DB 88 ;PAGE HEIGHT IN LINES DB 145 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;MORE OF SAME FOR 4TH MODE ;-------------------------------; MODE4: DB 'Teeny Weeny',0 DS 220H-$ ;32 BYTES ; DB 7,29,27,76 DB 27,37,57,12 DS 238H-$ ;24 BYTES ; DB 132 ;PAGE HEIGHT IN LINES DB 145 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 12 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;5TH MODE ;------------------------------; MODE5: DB '12 CPI at ' DB '8 LPI',0 DS 260H-$ DB 3,28,27,56 DS 278-$ DB 88 ;PAGE HEIGHT IN LINES DB 145 ;PAGE WIDTH IN CHARACTERS DB 12 ;LEFT MARGIN IN CHARACTERS DB 8 ;RIGHT MARGIN IN CHARACTERS DB 8 ;CENTER GAP IN CHARACTERS DB 0 ;TOP MARGIN IN LINES DB 6 ;BOTTOM MARGIN IN LINES DB 0 ;8 BYTES ; ;SPACE FOR 2 MORE MODES ;------------------------------; MODE6: DB 0 DS 63 ;64 BYTES ; MODE7: DB 0 DS 63 ;64 BYTES END ;300H = NEXT ADDRESS ÃCOM!9"ã 1I ͇MLOAD ver. 2.3 Copyright (C) 1983, 1984, 1985 by NightOwl Software, Inc. Í�Í ÚsÍ‹ÍzÃdÍ¿€ͽ :Ö !À –Ú*ã ùÉ!— ½ &Í<*Ä ë!€~#·Ê�GÍ<ë6#"È ë*}“O|Ö šGë6# x±Â¿*Ä +ÍF·Ê�#~·Èþ ÂÓÍF·ÈÍUÚi~#ÍUÒû·Âië"½ Éë))))ëƒ_ÒêÃê*Ä \Íß þ=ÂA:Ð þ Âi:â ·Âi<2â –#å![Î  Í<áà þ,ÊK6ÃL#"Ä x·Â–2Æ ]þ 7ÈÕͽ Ñ<Â!e~þ ½6H#6E#6XÃ`Í^ È!ß ~·À4É!ß ~æÂd*½ åÍ1Þ:˜2à WÁÅÍ _·Â°áÉÍ gÍ o:Ç ·Ì– å+:Á •: œÒâ"Á Õë*Ê  "¿ :¼Ú9Ñá Õå*Ý "Ý áë*Ê ÑÍ Í w#Â÷Í ÂØÅåÕÍG!à ~€wxÑáÁÉÍ1ÍNæðõÍ1ÍNÁ°ÉåÕÅ:Æ æÊR_!€~þÊó!Æ 4·ÁÑáÉ\ͽ ·Âó2Æ Ã<4!Í– ë*½ ë*Ê ë!€:¼Ú9åÕͽ \ͽ áѷ£*à € "à Ãv+"¿ *à ë*½ "Á €ͽ É\ÕÕÍ÷ !Î  Í<~þ ÂÙ!Í<Ñͽ Ñͽ <Êà*¿ ë*È {•OzœGx±Êr\ÅÕë!€ãåͽ ÑÕͽ ·ÂÒ*Û #"Û ÑáÁyÖ€OÒxÖGÒÍz͇Loaded *Ý Íí͇ bytes (Í͇H)͇ to file %:ß ·Êš͇ Over a *à Íí͇ byte binary file͇ Start address: *Ì Í͇H Ending address: *Á Í͇H Bias: *½ Í͇H ͇Saved image size: *Û å)ÂÍí͇ bytes (Í͇H, - áÍí͇ records) *Ì }·ÂG|þÈ͇ ++ Warning: program origin NOT at 100H ++ É\ͽ <Ê(ÉãÍ�ãÉ~#·Èþ%ÊœÍ/Ã�åÅ:\·Â©Í‹ <Æ@Í/:[þÿÌ} o&Íí>:Í/!]ÍØ>.Í/ÍØÁáÃ�~þ Êç#Í/ÂØÉ#ÂçÉåÕÅöÿÿÿ Úö ë|µÄí{Æ0Í/ÁÑáÉ> Í/> Ã/|Í}õÍ'ñæÆ�'Î@'åÕÅ_ͽ ÁÑáÉÈ~#Ã=#~þ ÊFÉÍUÚXÉþ0Øþ:ÚfþAØþG?ØÖæÉÍ͇ Command line syntax error Ã�͉ Ambiguous file name: % not allowed.͉ File % not found.͉ Disk full.͉ Directory full.͉ Premature end-of-file in %͉ Checksum error in %͉ Can't close %͉ Memory full while loading %͉ Format error in file %͉ Writing %, nothing loaded͉ MLOAD syntax: MLOAD [=] [,...] [] (brackets denote optional items) is the optional output filename are input file(s) is a hex load offset within the output file may be an optional non-HEX file to be patched by subsequently named HEX files (specifying The filetype enables this function). Note that ZCPR3-style drive/user notation may be used in all file specifications (e.g., "B3:MYFILE.COM, "A14:MDM7.HEX"). ÍáÍ�ÍÃv>2Ç "Ì "Á Õë*È }“o|šg"Ê ÕÅÐ þ ÂÖ !]Í<:â ·ÂÖ !Î Í} w#Í‹ 2â ÁáÑÉÍ÷ Í Í% xþÿÊó Í_ ÉåÕÍ} ÑáÕë6# 6 # 6# ëÑÉͨ À·È#à ÿåͨ #Â( þ:áÀ~ÍU þAÚC Ö@#~#þ:È+x‡‡€‡G~Ö0€G#~þ:ÂK #ÉÍ{ ~þ.À#y·Êu  Ãk Í{ Éͨ È#þ*Ê— þ?‹ ÍU  Â{ à >? ™ ͨ È#à ~þ/Èþ.Èþ,Èþ Èþ:Èþ=È·ÉÍ/ Âò Í "í 2ï =úÒ g¯oÍ Íò õå:ï *í Í áñÉ€ÕÅyþÂÿ ë"ð ëÍÁÑÉÅÕ ÿÍò õÍò gñoÑÁÉÅÕå\Íò áå] Íò áÑÁÉyþÈØþÈþÈþÈþ!Èþ"ÈþÈþÈþÈþÈþ#Èþ$ÉþaØþ{ÐÖ ÉåÕÅe!z æ¾#Âv Âi ÁÑáÉHEXåÕÅ ÿͽ ÁÑáÉåÕÅͽ ÁÑáÉI I PUBLIC DOMAIN / USER-SUPPORTED SOFTWARE REVIEWS: The programs reviewed here are available on the local Lost Dutchman's Gold Mine RCPMs (LD#1 and LD#2). Some are 'user-supported', so if you acquire any of these and find them to be particularly useful, send the author(s) a small donation to show your appreciation. (The donation will usually place you on the author's mailing list for updates and bug fixes... something the commercial software publishers often fail to do for programs costing hundreds of dollars.) NULU11.COM (in NULU11A.LBR) This program has been reviewed previously, but this first update incorporates some significant changes. NULU is a 'library manager', a program that allows the creation, modification, and general manipulation of libraries and library members. It replaces such programs as LUX, LDIR, LSWEEP, and LU301. For com- plete details on the program, see my previous tutorial. NULU11 corrects almost every possible criticism of the original NULU10. The only real problem with NULU10 was that it did not check CRCs. As a consequence of this, a library created with NULU and uploaded to an RCPM would result in a CRC error note when accessed by the RCPM's LDIR program. Though this caused no permanent problem, it was unnerving to the user who didn't know the source of the problem. And it was always possible that the library file was created by some other library manager and that an error DID exist. At any rate, the problem has now been corrected and NULU generates a CRC. The other objections this user had with the program originated out of a sort of greed: It was so good, why couldn't it do EVERYTHING? Well, now it can (almost). NULU was originally designed to combine the advantages of LU300 and LSWEEP (the latter a WASH/SWEEP/NSWP derivative for libraries). It lacked only a mass tagging facility and the ability to delete disk files (like all library managers, it could delete library members from the library). These facilities have now been added. For instance, if you download a library from an RCPM and want to place all of its files on a blank disk, all you need to do is bring up NULU11, open the library, log in the blank disk, and then tag all the files in the library. NULU then asks what operation you wish to perform; you respond with [E]xtract and give the drive/user number for the blank disk. If the files are squeezed, you use the [Q] command (for unsqueeze) and the drive/user info. Before performing the mass tagging operation, you are able to access the sup- posedly blank disk to see if it has any files on it. If it does, and if they are unneeded, you can [Z]ap any or all of them. This is easy since NULU allows the user to use wildcards, eliminating the need to list each file to be zapped. To make things even better, NULU11 now allows such video attributes as reverse video or inverse video. The NULU11A.LBR comes with an installation program for making these changes to fit any computer. It also comes with MLOAD23.COM, the latest version of MLOAD from Ron Fowler. Similar to MDMLNK, MLOAD should be considered a complete replacement for DRI's 'LOAD.COM', as it is much more flexible. (The NULU11A library does not come with documentation for MLOAD23, except as necessary for patching NULU; you will have to access MEX1xx.LBR for that documentation. Unfortunately, it may be contained within MEX1xx.DOC. If so, let me know, and I'll either extract it from that file or write some docs on my own.)  contained within MEX1xx.DOC. NULU.DOC Documentation for NULU.COM as of 02/01/85 Version 1.1 NULU.COM and NULU.DOC are both Copyright 1984 and 1985, by Martin Murray, P.O. Box 35972, Dallas, TX 75235. Both may be used freely for non-commercial purposes, but neither may be sold, included in a package for sale, or used as an incentive to buy, by any person, organization or corporation without prior arrangement with the copyright holder, Martin Murray. Furthermore, Martin Murray will bear no responsibility for losses resulting from the use or inability to use this program. NULU.COM may not be distributed without NULU.DOC, nor may the copyright messages be removed from either file nor caused to not be displayed. ACKNOWLEDGEMENTS This program would not have been possible were it not for the elegant work of Gary P. Novosielski and those others working with the LU library structure. Additionally, I would like to thank the people who have supported the development of NULU in a variety of ways, from suggestions to financial contributions. All comments (good, bad and disasterous) are welcome. Special thanks to Keith W. Antcliff of Mead, Washington for his development of NULUTERM.ASM, a patcher overlay, and to Ron Fowler of Nightowl Software for his gracious permission to include MLOAD23.COM in the NULU release library. Honors for Courage go to Dennis Recla and Sigi Kluger for having the guts to "risk everything" by testing NULU and offering suggestions and pointing out bugs. INTRODUCTION NULU is a complete replacement for LU and LSWEEP. Weighing in at 15k, it includes all features of both programs and then some. It features: Two operation modes with a full menu for each LU style CRC support and verification Viewing and printing of member files, unsqueezing when necessary Extraction of member files with an option to unsqueeze where appropriate Bigger libraries, up to 800 members or more depending on available memory Automatic member sorting, all members kept sorted at all times Faster reorganization Enhanced error handling Access to deleted members Optional read only patch CP/M Plus support General compatibility with LU and NSWEEP syntax Numerous user patches DIFFERENCES BETWEEN NULU AND LU NULU now supports LU style CRC verification. However, because of my desire achieve an orderly transition between the old and new versions, NULU 1.1 will not verify CRC values for members whose initial values were 0000h. In other words, if you use NULU 1.1 to open a library last changed by NULU 1.0, a CRC error will not be the first thing that you see. After changing the library with NULU 1.1, if the directory CRC does not match the next time the library is opened, an error message will be generated. The assumption behind all this is that the likelyhood of a file having a CRC of 0000h is extremely small. In version 1.2 of NULU, all library members will "enjoy" CRC validation even if their initial CRC was 0000h. NULU To the best of my knowledge, NULU will run on any system running CP/M 2.x or higher, however it has only been tested by me on the Osborne 1 and the Osborne Executive computers. It is written entirely in 8080 assembly language. A complete discussion of the nature and advantages of library files is beyond the scope of my endurance, however a short recap is in order. A library file is a single CP/M file which maintains 1 or more smaller files as its members. Each file is written into the library and recorded in the library directory. After that, it may be accessed for viewing, printing, or execution, or may be extracted from the library to assume the status of a stand-alone file once again. The reasons for doing this are many. For one, under CP/M each file occupies a minimum amount of disk space. This amount can range from 1k to 16k, depending on the system. Even though a file may only be 1 byte in length, it will still occupy the minimum required amount; the rest of the space is wasted. Putting these files in a library minimizes the possible waste to 127 bytes. Each file also occupies a directory entry. On most floppy disk systems, the maximum number of file entries per disk is 64. By including a file in a library the directory space it used to occupy is freed for another file. Additionally, using library files can simplify the process of categorization by subsuming several files of similar types or subjects into one file. However, there are also dangers associated with using libraries. The main one is that if a library file is lost or damaged, all of the member files are lost as well. The solution to this problem can be summed up in one word: BACKUP. NULU probably isn't perfect, and we all know that disk systems aren't, so backup your important libraries, please. I don't want to hear any sad stories. Almost as important as backing up libraries is the use of discretion when deciding what to put into them. Let's face it, if a file is in a library it is not as easy to get to. If you need to get to a file every 15 minutes, it probably shouldn't be in a library except as a backup measure. AN ASIDE CONCERNING FILESPECS When specifying a filespec, wildcards may be used freely, however, unlike most programs, NULU doesn't insist that a "." separate the filename from the filetype. For example, the filespec "**" means the same thing as "*.*" to NULU. On the other hand, the filespec "FRED.TXT" should be typed in just like that. "FREDTXT" would make NULU think that no filetype had been specified. The rule is simple: use a dot any time you like, but it is only strictly necessary when it is needed for clarity. When specifying a drive and/or user area the syntax is very liberal. "A15:**" means the same as "15/A:*.*", as does "1A5:**". The colon is absolutely necessary. If a different user area is desired for the default drive, the drive specifier may be omitted, as in "15:**", just as the user area may be omitted as in "A:**". If a drive/user specification is made, but no filespec is indicated, a filespec of ????????.??? is generated. Therefore to indicate the default drive, current user area, and a filespec of ????????.???, just type a colon by itself (e.g., ":") ! NULU OPERATION NULU may be invoked with or without a command tail. A command tail can consist of any combination of valid NULU operators up to 128 characters (the limit imposed by the CCP. Once NULU is running, command lines can be as long as 254 characters.) As in LU, all NULU commands are preceded by a dash. This is a copy of the menu for the command mode of operation: -A Add members -B Brief toggle -C Close the library -D Delete members -E Extract members -F Filesweep mode -G Get filespec -K Krunch the library -L List members -M Menu -N Rename members -O Open a library -P Print members -Q Unsqueeze members -R Replace members -T Replace/Add members -U Drive/User change -V View members -X Exit NULU -Y Disk directory -Z Zap disk files -< Redirect input -> Redirect output Commands may be strung together, each terminated by a space. They are processed left to right. All characters are converted to upper case. The default drive/user area are displayed along with the name of the current command mode each time the console is prompted for input. The commands will be explained in order of their appearance above. All items in [square brackets] indicate optional parameters. The word "filename" refers to an unambiguous file specification, while the term "filespec" refers to a potentially ambiguous file specification. Filespec parameters enclosed in (parenthesis) indicate references to deleted member files. Three dots ("...") after a parameter indicate infinite repetition. During the execution of most commands which receive an ambiguous filespec as a parameter, entering a ^C at the console will interrupt the current process. COMMANDS -A ADD MEMBERS Syntax: -a filespec[ filespec...] Use this command to add files from disk to the current library. NULU will make a series of passes through the directory, adding files as it goes, until the list of matching files is exhausted. If matching filename already exists as an active member in the library, its name will be displayed and the file will not be added. In all file addition and replacement operations, if a deleted entry of identical size can be located, that disk space and directory entry will be used rather than allocating new space for the file. This means that it will be necessary to reclaim wasted disk space less often. An LU style CRC will be generated for each file added. -B BRIEF TOGGLE Syntax: -b This toggles the prompting mode. The release version of NULU is setup to print the full name of the current mode for a prompt, as in "-ADD MEMBERS A0:>". If BRIEF is turned on the user will simply see "-A A0:>". NULU may be permanently patched to default to BRIEF ON or OFF. See NULU MODIFICATION. -C CLOSE THE LIBRARY Syntax: -c This command closes the current library, writing its directory to disk if any changes have been made to the directory. The library directory is NEVER written except when the library is closed, so be sure to do it. If you forget to do so and remove the disk, NULU will prompt you for the disk again and will attempt to recover. Some other operations that cause the current library to be closed are: -k, -o, -x -D DELETE MEMBERS Syntax: -d filespec[ filespec (filespec)...] Member files matching the given filespec will be given deleted status in the library directory, except when the filespec is enclosed in parenthesis. In that case matching deleted members will be given active status. That is, they will be undeleted. If the filename of a matching deleted member file already exists as an active member, the filename will be displayed and the file will not be undeleted. If the member file being deleted has a size of zero sectors, its entry will be entirely REMOVED from the library directory, thereby creating a new, free entry. -E EXTRACT MEMBERS Syntax: -e filespec[=newfilespec filespec...] Use this command to extract active member files. If extraction to the current drive/user area is desired, no further syntax is necessary. To indicate another drive, however, a destination filespec may be included following an equals sign. Example: -e **=a5: would extract all active members to drive A, user area 5. Files may be renamed as well as redirected by indicating a filespec along with, or in place of, a drive user specification. Examples: 1. -e *asm=*bak 2. -e *asm=5:*txt 3. -e fred.txt=sam.txt jane.inf=c8:girls.dbf The examples would produce the following results: 1. Extract all files with a type of .ASM to the default drive/user renaming them with the filetype of .BAK. 2. Extract all files of type .ASM to user area 5 of the default drive, renaming each with the .TXT filetype. 3. Extract the member file FRED.TXT to the default drive/user under the name of SAM.TXT, and extract the member file JANE.INF to user area 8 of drive C: with the filename GIRLS.DBF. The only redirection rule to remember is that if a destination filespec is entered it cannot be any less ambiguous than the source filespec. That is, "*asm=*bak" is valid while "**=*bak" is not valid. During extraction, a CRC is generated for each file. After the destination file has been closed, the CRC so generated is compared to the CRC for that library member that was stored in the library directory, if that value was non-zero. If the results are not identical, an error message will be displayed before the next member file or filespec will be processed. The erroneous destination file will not be deleted from disk by NULU as a result of this error. -F FILESWEEP MODE Syntax: -f This command places NULU in its second operational mode: the filesweep mode. This allows the user to move through the directory of active member files as if they were individual files being examined by a program like NSWEEP. The filesweep mode's command list is as follows: A Next member B Previous member C Close the library D Delete member E Extract member F Find member L Log new drive/user M Mass operations O Open new library P Print member Q Unsqueeze member R Rename member T Tag member U Untag member V View member W Wildcard rename X Exit NULU Y Disk directory Z NULU command mode ? Menu Because of the extreme similarity between these commands and the commands of NULU's command mode, only a short description of each command will be given. A -- Advance to next member (spacebar, cr, or lf will produce the same result) B -- Back up to previous member C -- Close the current library D -- Delete current member file E -- Extract current member file (prompt allows redirection) F -- Find first member matching input filespec L -- Change drive/user defaults (returns file pointer to the top of the file list and untags all member files) M -- Mass operations on all tagged files (allows Deletion, Extraction, Printing, Unsqueezing, or Viewing) O -- Open new library (closes the current library) P -- Dumps the current member file to LST: (unsqueezes if needed) Q -- Extract current member file, unsqueezing if necessary (prompt allows redirection) R -- Rename current member file T -- Tag current member U -- Untag current member V -- View current member file (unsqueezes if needed) W -- Wildcard rename (prompts for oldname & newname) X -- Exit NULU (closes all files) Y -- Get disk directory for default drive/user (returns file pointer to the top of the file list and untags all member files) Z -- Return to NULU command mode (current library remains open) ? -- Print the filesweep mode menu If, when the filesweep mode is entered, or after a library has been closed, there is not a library currently open, the filesweep mode will prompt with: No library open. and will accept only the following commands: L,O,X,Y,Z,? Likewise, if a library is open but only has a directory with no other active members, the message No member files. will be printed and only the commands listed above will be accepted. During filesweep operation, each file will be listed in the order in which it is found in the directory, along with the size in K that the file would occupy if it were extracted to the default drive. If the filesweep mode is terminated by a return to the NULU command mode, any commands that followed the -F command on the previous NULU command line will be executed. -G GET FILESPEC Syntax: -g filespec NULU will search for the filespec indicated. If it is found, processing continues. If not, the user is prompted to insert the disk containing that filespec. The drive is then reset and search again. The program will prompt forever until it receives the proper filespec or until a ^C is entered, forcing NULU to continue without the filespec being found. This command can be useful when attempting to control NULU through a submit utility like DRI's SUBMIT.COM. For example, one might type: nulu -o a:asm -g b5:-work.005 -e **=b10: -g a0:-5.005 -x After loading, NULU would open a library called ASM.LBR on drive A: in the current user area. Next it would search user area 5 of drive B: for filespec -WORK.005 until it was found. Then all active member files would be extracted to user area 10 of drive B:. Finally, NULU would search user area 0 of drive A: for a filespec called -5.005 until found. Then NULU would terminate. Notice here that the ASM.LBR didn't have to be closed before the search for the final filespec because no change had been made to the library directory. If a change had been made, after the new filespec had been loaded, NULU would have demanded the disk with ASM.LBR back so it could update the directory. Therefore the GET operation would be effectively negated. -K KRUNCH LIBRARY Syntax: -k[ -: WAIT FOR RETURN Syntax: -: -failure mode This command will force NULU to wait for the RETURN (0dh) character to be input to the console device. If a RETURN is received, the balance of the command line will be ignored. If a ^C is entered, the remaining commands on the line will be executed. -; COMMENT Syntax: -; comment about this kludge of a JCL This command will cause NULU to ignore all text appearing after the command on the same physical command line. These items together form what I know to be a very incomplete and awkward JCL, or NCL if you will. However, I have found them to be of use in building simple interfaces between people and NULU. More and better stuff to come. -> REDIRECT OUTPUT Syntax: -> filename Syntax: -> With the first form of this command, NULU output will be sent to the filename indicated. The default filetype of ".NOF" will be used if no filetype is specified. If the file already exists, it will be deleted. All special characters that the user may have patched into NULU (see below, NULU MODIFICATION) will be sent to the file as well, with the exception of the EOF character, 26 (1ah). The only output not echoed to the file will be output caused by viewing or printing a member file. Even if the console has been turned off by an NCF file, all console output will continue to be sent to this file. The filename passed must be unambiguous. Under the second form of this command, the current output file, if any will be closed. When NULU is caused to terminate, the current output file is closed along with the current library, if any. ERROR HANDLING NULU should never crash to CP/M anymore. When NULU signs on, it redirects the warm boot BIOS vector, thereby preventing NULU termination due to BDOS errors. Under CP/M Plus, it goes even further, shutting down the console error messages, handling them internally. Therefore, if NULU attempts to perform some operation on a drive where no disk is mounted, one could reasonably expect (on a 2.2 system) for the BIOS to issue some error message. The user then hits RETURN or ^C and NULU should recover. It may think that the disk was full, when there really wasn't one there at all, but it should still take the proper course of action needed to recover. ERROR MESSAGES Most NULU error messages are of the form: ERROR XX: Explanation where "XX" is some number from 0 to 255 and "Explanation" is a clue as to the nature of the error. Each error message is listed below, along with an explanation. Suggestions about ways to handle the error are given when appropriate. ERROR 63: ambiguity error Problem: This means that you entered an ambiguous filespec where an unambiguous filename was required, or that the destination filespec in an extraction or unsqueeze command was less ambiguous than the source filespec. See -E EXTRACT MEMBERS for complete details. ERROR 68: disk full Problem: The library disk became full during file addition or KRUNCHing or the destination disk of an extraction command became full. Solution: If the error occurred during KRUNCHing, NULU should have recovered by itself, reopening the old library. If it did not recover, then you removed the original disk before the KRUNCH was complete or a serious read error occured. If the error occurs during file addition to the library, operation should not be impaired, but no files that required additional disk space can be added to the library until some disk space is cleared. Note that deleted entries can still be overwritten by incoming files as long as the file sizes match. The incoming file that caused the error will be recorded in the library directory as a deleted entry. If the error occurs as a result of attempting to replace a member, the original library member should be unharmed and left as an active member. If the error occurs during file extraction or unsqueezing the destination file is deleted because it is an incomplete file. Extraction can continue as before. ERROR 73: invalid drive Problem: An invalid drive for your system was chosen (see below, NULU MODIFICATION) or a letter higher than "P" was indicated. Solution: Choose another drive or re-patch NULU. ERROR 74: checksum error Problem: During the unsqueezing of a file, the internal checksum generated did not match the explicit checksum stated in the file's squeeze decoding table. Solution: Get a new copy of the member file. Yours has been trashed somehow. ERROR 75: CRC error Problem: When each member file is added to a library, a CRC is created for it and stored in the library directory. If, upon extraction or unsqueezing, the CRC generated at THAT time does not match the original CRC in the directory, that means that the sectors wherein that library entry resides have become corrupted. There is an outside chance that the CRC entry in the library directory has become damaged instead, however that condition would probably also generate ERROR 107. ERROR 77: not enough memory Problem: An attempt was made to open a library with a directory too large to be accounted for with available memory. Solution: Open the library on a computer with a larger TPA and reorganize it so it can be handled by the smaller system. ERROR 78: user cancel Problem: No problem. NULU is simply letting the user know why an operation has been cancelled. Most operations which work on ambiguous filespecs may be interrupted by entering a ^C during their operation. (You may have to hold the key down a while.) The KRUNCH operation may be so interrupted as well. ERROR 79: library is READ ONLY Problem: An attempt was made to use a READ ONLY copy of NULU for some other task than merely viewing member files. ERROR 83: can't make file Problem: An attempt was made to create a file on a disk with no free directory entries. ERROR 85: file not found Problem: The filespec indicated for some operation could not be located. ERROR 86: CP/M 2.x or higher required Problem: An attempt was made to run NULU on a system with an CP/M version number of less than 2.0. ERROR 88: seek to unwritten sector Problem: A sector required to gain access to a file is indicated by CP/M to be unwritten. Solution: The library directory or perhaps the library itself has become trashed at some point. Deleting the entry and KRUNCHing will probably render it harmless, but the safest course to take is to obtain a fresh copy of the library. ERROR 100: no library directory Problem: The file specified could not be opened as a library file. Solution: The directory could be bad, but most likely the file simply isn't a library. Check it out with some disk editor like SPZ or EDFILE. ERROR 107: library directory CRC error Problem: The CRC that was calculated and stored for the directory the last time the library was modified does not match the directory CRC calculated as the library is opened this time. Solution: With most libraries, this error will be valid. In that case, the only remedie is to obtain a new copy of the library. However, there are some libraries that were created with LU, and then modified but never KRUNCHED by NULU 1.0. In that case, it is likely that the old, original CRC stored in the library directory would still be there, even though it is way out of date. My suggestion is, when you first get NULU 1.1, go through all of your .LBR files, if you were using NULU 1.0 previously, and KRUNCH them. This way you will know later on that the CRCs stored in each library should all be accurate. ERROR 115: bad syntax Problem: Improper syntax was used to attempt some operation. ERROR 116: squeeze decode table Problem: A file has a squeeze decoding table, but at some point the table is trashed or perhaps is missing. Solution: None really; get a new copy of the file. If your Data Buffer Size has fallen below 9 sectors, then the reason might be that the entire decode table could not be read into memory. ERROR XX: undefined Problem: Unknown. Solution: Write down all information presented on the terminal. The number following the word ERROR is especially important. Get the information to me. Mail it or call and I will try to help. NULU MODIFICATION Patches are listed in the order in which they appear in NULU.COM. Each patch is explained and the default values are listed immediately next to the patch address. All addresses are absolute hexadecimal. Patch Default Explanation 00149h 00h Non-zero makes NULU use the Z80 instructions LDIR and LDDR for data movement. 0014ah 50h Number of characters each full video line can contain. Not necessarily the same as the number you can see. 0014bh 50h Number of characters visible on a line at any one time. 0014eh 07h This byte indicates the number of files that NULU can have open at any one time. The base number is 4 and should never fall below that. The value of 3 has been added to it to allow 3 level nesting of NCF files. If the NCF value is increased or decreased, identical changes should be made to this byte. (See Patch at 0018bh.) 0014fh 000fh This obscure word controls the number of relocatable tasks that can be controlled by the NULU memory management routines. Because each file is a relocatable task, the same modifications for the previous byte apply here. The base value of this word is 000ch and should never fall below that point. (See Patch at 0018bh.) 00151h 10h Number of contiguously numbered disk drives in your system. If you have drives A and B, set this value to 2. It will prevent you from accessing an invalid drive. 00152h 20h Number of contiguous user areas that NULU will be allowed to access. Under normal CP/M 2.2, Turbo-Dos or a ZCPR system, I understand that this number can be as high as 20h, which is the default. For CP/M Plus or most systems that use time/date stamping this number should not exceed 10h. 00187h 00h Set to a non-zero value to make NULU READ/ONLY. No operators will be executed that could change the library or disk directories in any way. 00188h 00h LU.COM was set up to exit automatically if a command tail was used when LU was invoked. With the release version of NULU, it takes the -X command to exit. Set this byte to a 01h to get it to act like LU in this respect. That is, it will automatically exit after executing the passed command tail, if one was present. 00189h 01h Set to a 00h to start NULU with BRIEF mode ON (long messages not printed). 0018ah 01h Set to zero to prevent users from being able to ESC,RET from the PROMPT AND CHAIN TO PREVIOUS MODE prompts in NCF files. (Be sure to also change the values at 0014eh and 0014fh.) 0018bh 03h This byte indicates the nesting level allowed for NCF files. I have no idea what the upper limit is, but watch that Data Buffer Size! 0018ch '-O',0 Starting here are 39 bytes in which any valid NULU operators may be stored. This line will be automatically executed when NULU is loaded, even before any other parameters passed on the command line. This might be used to create a version of NULU that, after loading, sets the drive/user defaults to B0:, prints the menu, scans the drive for library files, then switches to the open library mode. That command line would look like this: -U B: -M -Y *LBR -O Notice that all characters in this line MUST be UPPER CASE. The entire line MUST be terminated by a null byte. Only 39 bytes are available for text...not a byte more. The 40th byte is for the null terminator. 01944h 0005h This is the address of the BDOS vector. All operating system calls go through this address. If you have some weird, non-standard CP/M implementation you can patch this to try to make NULU work with it. 01a83h 3ch This is the number of lines that NULU will print on each page during member file printing. Change this value in accordance with the line printer patch below. Starting at 01a60h are 5 data areas used to define strings needed to control the console attributes. Each string is preceded by an identification byte and a byte indicating its active length. Then 5 bytes are available for the actual definition. Therefore a total of 7 bytes is consumed for each video control. The attributes are, in order: DIM or REVERSE VIDEO ON (DIM is preferred) DIM or REVERSE VIDEO OFF UNDERLINING ON UNDERLINING OFF CLEAR SCREEN Each control becomes active as soon as it is patched in. Likewise, there is one string defined for the LST: device that will be issued immediately before printing a file. It begins at 01a86h and has the same format as the strings above. FINAL NOTES Please report any bugs or problems to Martin Murray, P.O. Box 35972, Dallas, Tx 75235 or call (214) 351-6117, EVENINGS AND WEEKENDS ONLY. Please specify the version of NULU with which you are working. I anticipate being able to respond with greater speed to any bug reports with this version. The problem with updating version 1.0 was that I didn't have the source code anymore! I was off working on another version. As always, donations will be gratefully accepted. It took a lot of work to produce NULU and if you enjoy it and it benefits you, don't hesitate to show your appreciation with a check! Note: I no longer work for SYSTEM SOLUTIONS, so please, no checks made out to them. I am now working for INOVA, a new company founded specifically to support 8-bit computers running CP/M. Look for new and exciting retail products from that source. (The preceeding has been an official plug.) NEWSOFT}; NULU11F1.ASM NULU V1.1 Patch Fix # 1 5-Feb-85 ; This patch fixes some of the bugs found in NULU11.COM, with regard ; to unsqueezing/extracting files. This patch file is applied to ; to NULU11.COM, and produces NULU12.COM. This file has an unknown ; origin. (See NULU12.NOT) ORG 10BH DB '2' ORG 114H DB '3' ORG 0A4AH DB 0,0,0,0,0,0,0,0,0,0,0,0 ORG 06A7H NOP JMP 17D4H CALL 32D4H JMP 26E1H ORG 1E46H CALL 2B47H CALL 31B7H RZ CALL 3239H CALL 31DDH PUSH PSW LDAX D CALL 324DH POP PSW JMP 06ABH END ÃF NULU 1.2 (02/03/85) Copyright (C) 1984, 1985 by Martin MurrayÃUPPÿF D!9"ð2*L&###:MO ë*ë<ù"!9ë*ODM) "ë<Í+ã-OWORK-LBR.$$$ NCF NOF LBR Add membersBrief toggleClose the libraryDelete membersExtract membersFilesweep modeGet filespecKrunch libraryList membersMenuRename membersOpen a libraryPrint membersUnsqueeze membersReplace membersReplace/Add membersDrive/User changeView membersExit NULUDisk directoryZap disk filesRedirect inputRedirect outputREADYNext memberPrevious memberClose libraryDelete memberExtract memberFind memberLog new drive/userMass operationsOpen new libraryPrint memberUnsqueeze memberRename memberTag memberUntag memberView memberWildcard renameExit NULUDisk directoryNULU command modeMenu?DIJKMNOSUVXdktsambiguity errordisk fullinvalid drivechecksum errorCRC errornot enough memoryuser cancelNULU is READ ONLYcan't make filefile not foundCP/M 2.x or higher requiredseek to unwritten sectorno library directorylibrary directory CRC errorsqueeze decode tablebad syntaxundefined Í<".=}þ1-ÿÔ<:I·ÊÚ!í°"{µ_TmÍ<Ãkþ ÒV>VÍIÃï2*#"ÍÍ<"!ër+sÍÕ22æͺ0!€N#Ë=Í_<ë 6!Œ"�5>2Ûy°Ê›:ˆ2SÍ‚Í" ÛÍÙÃÔÍÔ2Ãá&—2ÀÍlÍÑ*�5>Íu!ÌIÍž—2$%Í;$>2$%ÃÆÍ!3Ã13 Í<·È>ÃD4:õ<2ÛÍÑÍ*3ÍÍÌÍ13 closed. 2Ò:õ<·Ä®*ÃþÀ~þ-À#~GÍîxÊÕ<¿É*æ6éÍlÍSÈ!ÅÍ Í-Í!3Console input to be received from ÍÏ>OÍ¿'ÊŽõ:ö2,ñ2ö*ÃÍZéÍIÃ6Íl:×Íû*Ä“ÍIÈÍåÍVÈ!ÊÍ Í!3Console output to be sent to Í®*ÍÏ2Í„9Í*3>KÍ¿'ÌIÊ”2×:é<ö2é<Í©!ÂÃÊ7Íl!©åÍSÈÍÈ1>UÊI!",Í!3Press ^C to stop...Í®*ÍË:È\!€Íá- =Í ,È:ÒÍû*Ê\*¥+Í€.ÊuÍ!3Deleting: ͵->PÍD1Â6*,#",Ã6ÍlÍÍ*�5Í% :HþþÊœÍ\ÊIÃÊÍ%ÊIëÕÍ‚8ÊIÍ!3Undeleting...Í�%Ê Í!3 åͧ%Íè%*�%å*›%å*é%Í..—Í%á"›%á"�%áÊ Í13 cannot be undeleted--name existsþ—Í &þÑÍ8ÃÇ~þ(À#å>)ÍÕ;Â6 á+É6>þ2HáÉ:‡·ÂX ÍjÂX Íx<ë6:Sî2SÉ> ͦ;2Û 2ç ÍIÊz ÍåÃ} !ä<ÍVÈÍ®*͘2!€Ís2Í'3× ÕÍ<ÑþÿÊø ‡‡‡‡‡!�O å 6áÍ]7.Å~õ>܆3~æÍ;ñ>܆3#Á y°Â½ >=2Û Âî Í*3>2Û Ã• Í13 | Õ ͽ2ÍÝ1õÍM2:R;=Ä*3ÍÃ/Í*3ñÍM2ú0ÕeÍ#<ÑÃh>?Íî!õÍë:—2H<2ÛÉ—2[ ÍlÍѲÕÍ„9*Ãë*�5>ÍÁÑõÍš9ñÊIÉ*�5"J*æ"P!Â"æÍ€ÍÃ/!"4 >O2# :ÒÍû*ÊÍùÍ8:ÒÍû*Í;$y°Ê·`i#" " ëÍ‚8Ê@ͽ<Í�%Êã ës#r#6 #åëͧ%ë:¸=ÍP7ëás#r#ëÿ ëùÍ‚8Ê@Í8!"*4 à Í*3! y°Ê·͸:Òÿ "4 ÍñÍÍ<"D 2v ëÍÍ<"U ÍáÍ*3!ÍFÍ13.>Í4!Í4&ëÍÃ-ëÍ.."�5!m Íê4ë> Í 7>k2s Í13 : ÍC3OÍÇ5ABCDEFLMOPQRTUVWXYZ? Êx õyÍ;ñ!1Ãë:*4 #à *4 +}´Â * ð ÍíÃ� Í13elete?Í÷2Ê- *D Íñ Õ åͧ%Í!3Deleting: Íè%á:‡·>OÂI>þà &Í13xtract to: Í\Ê- ÍêÍ6 Ã- Í13ind what? ÍýÍ\Ê- åO >*w#w#—wáÍ%Ê- Í�%ÍBK͸:ÂK * à Í13Log drive/user: Í\Ê� "�5͹Ã� >*ÍýÍ!3Delete, Extract, Print, Unsqueeze, or View (DEPQV) Enter one: ÍC32+ OÍÇ5EQDPVÊ- õyÍ;ñþÒ# Í!3Destination drive/user? Í\\åÍb,áÌIÊ- Íá-å>:ÍÕ;#6áÍêÍÊH ë>þDÂ7 ÍÛ Ã# õÍ4&Í.."�5ñÍ$ Â# :+ þDÊ• Ã- Í13Library name: Í\Ê� "�5ÍSÃ� ÍïÃ- Í13Unsqueeze to: Í\Ê- ÍêÍéÃ- Í13ename to: Í\Ê- ÍêÍ<Õ Í5þ*Êà >*"22Ó Í13 Tagged = ÍF>kÍ;æ Í5þ Êô ÍÂ:> ÃÅ ÍÃ- Í!3Old filespec: Í\Ê- ö<<OÍ_<ë"�5Í!3New filespec: ë Ía Ã� ÍIùÍ8!"�5!"æÉÍ€Ã- >!ÙÍ/4Ãò5ÍC3OÍÇ5LOXYZ?Èáyþ?Â{ Ã{ Í¥NULU Filesweep Menu>͆3—2“ 2C>28 !\Í%> 2“ ÉÍèNo members. Íg÷ÍèNo library open. ÍgÃÍÍáÍ'3Ã13+ÍÒ9 É!" 2$Éå!#" ͸:Ú—áÉÅÍñÁÍÃ<>·Ê2¾Â #N#F—<áÉ*4 Íñ##~"É #ÍÃ<*É*�5"]*ë<å"�5*æ͇5!"�5áÈåÍáÉ*æ>"¾À#åÍÕ;Ê}6#—"æáÉÍåÊ?ÍÂÔO:# ¹Ê‚2Ây2# ÍÇ5BCFKLMXY>ÂÈyÍÇ5'":;HJÊ‚:ö·ÂÈÍ©ÂÍ" Í©ÂÍI3þÈþ ÂÑ·ÉÍlÍ©ÍSÈÍ®*Í92ÍÈ1ÀÍÙInsert disk containing ÍÏÍ!3 and press RETURNÍÑÈÃëղ̈́9ÑÉղ͚9ÑÉ!Ë="�5"æ!µ~6·Â‚>·ÂÑÍáÍ!3-:‰·:# ÊŸÍÇ5ABCDEFGKLMNOPQRTUVXYZ<>?O!Íš7×Í“7ëÍò5Í(5âÍ;> Í;Íb>:Í\3Í13:>>þÍòÊX*�5:ö·ÂØ:×Íû*ÊØåÍ|&ÌnáÍò5Í]7 Â!Œ͇5"æ*�5É28>Íû*Ê7ÍË:Ê"Í•Ê"å!+" }´áÂý Í·3!" É!" Í6:,2öÍá&Ãõ>ÍD4ÈO*�5> ¾ÚHw# ÂC<É!©åÍIÈÍåÍ}4È}´È" :öÍû*ÈÃ]*õ:R;2�Í­ͳERRORñÍIÍ'3>þÍ”>Ã4—Íë&2Íš9ͳclosed. 2×!Âó7Í!3CONOUT file Ã13ÍlÍÑÍ!3 Krunching...* ëÍ„9Í;$`i"Õ"—ëÍ‚8ͽ<Í�%ÊÕÍ4&Ñ#Íx<ÃúëŽÍ‚8Í8ÍG+!ðÍá-Íí!¶ö<Í“7ÍVÍ®*—ÍD1>͆3!ÙÍá-ÍÍ13will be krunched to >WÍ\3>͆3Í*3ÍÊŽ!"ðͧ%ë"\"!!ðÍVÍú1!"ÿÍ."à%!ö<"¦ÍË:Ê}"ë*à%}´ÄÂ:ÊÔÍ13 CRC ERROR-Continue?Í÷2Ê}!}´Ê×+"ÕÍ!3 Copying: !#"ðå—Í &å#ë!Íx<"ÿá€$Í_<ÍÇ-ãͧ%á s#r###"¦Í`&ÍM+>Í5+Í¡(Í5+Êyå*!"!!"IëáþMŸ*,DM!å"\á>OÍq)Ê}*,"Á(Í.—Ã4·ÊŸÍIÍÏ&—2Ò* ëÍ„9Í13Krunch aborted...reopening old library>K2# *�5å!ð"�5ÍSá"�5Í©ŽÃ8*I}´Êðë*,DM*\>OÍq)Ê}\—ÍD1ÍG+!ð>:ÍÕ;#>.ÍÐ5Í 2ÍÍÌÍ13 krunched.Í©ŽÍ8ÍÍÃÇ!"IÉÍÍÍ*3ÍIÊLÍåÍ% >ÃN!ä<—ÃN*�5å\Íb,áÊIÉ!ä<ÍV!ö<Ãá-Í¥NULU Command Menu>͆3—2„>-2C>28m!Í%>?2„ÉÍ'3Í3Í13 >͆3Ã13ÍSÈÍ®*ÍM2͘2ͺ0é—2Û>·Ê/Íû*>·ÈÍG+*ë<Íá-ÍVÍÈ1ÀÍÙCannot find ÍÏÍ!3Replace it and press RETURNÍÑʤÍÈ1®*Ãîá:# ÍÇ5KOX©Í!3NO LIBRARY OPENéÍíÍSÈÍ®*!ÏÍ Í$ʲ2ÒÍÍÌÍ13 open. (Buffer size: *,ë* ,ÍÂ:>Í–:ÍFÍ13 sectors)Í©·ÃÊþUÂI:‡·>UÂI!ö<> ÍÐ5ÍÍ(5Í13 not found. To make it, enter the number of entries to allow.!"—Í!3 Press RETURN now to abort making the library. Allow how many entries: ÍIÊ~~þ<Â~Íå#åÍ(5áÉ!Ù> Í/4Ê‘Í}4Ê}´>NÊI͸:Úªã͸:Ò¼DM!ö<ÍVÈÍ“ÂiþMÂIÍÙToo many entries.Ã!ä<"Ã*�5>=ÍÕ;È6#ÍD<È"×ÉÍlÍÑÍå3ÍÚ3> Íb3*�5Í% :HÍ õÍå3ÍÚ3ñÊIÉÍ!3Library ÉÍ'322·Ê'3O>·Ê?>Í4ÃBÍ*3>·Ä;yÍ;> Í;Í(5#:2î22Ã+:é<õö2é<Í*3Í(5ñ2é<ÉÍjÀÍaé1ÉÍj©ÍD<2¡ͽ<Í“7>Í;*ë<Ía>ÍD4Êš*�5å͇5áÍò5~þÂÃ:Š·ÂÆÚÍ©ÍÔ*æ6Ã" Íí:×Íû*Ä“Í*3>ÍM2>Íâ2:.=þ1ÚmÍ<*P €Í“7*ð2ùÊ</Ã<!"*P ÍD<Êï2ëÍ}.qëÍ“7*ð2ùbk.ˆs#r.éÍlÍÍ*�5Í% ë*Ãä<͸:>sÊIë:HÍB$ÊIÉ>Oó>Ró:‡·Èá>OÍIéÍ!3Brief now O:‰î2‰·Âš>NÃ;Í73FF:é<î2é<É:# ÍÇ5'":BHIJLMOUY<>ÊÆ>ÃÈ>?2# ÉÍG+å*ë<Íá-> ÍÐ5Í(5áÉÍ‚ÂàÃ" >ÿÃ7 ÍÇ5'":;ABCDEFGHJKLMNOPQRTUVXYZ<>?ÉÍÑ:éÍû*ñõÍ &ÅÕåÌnáÑÁ>Íû*ñuƒ3.²zí6 i Þ OÆ5n<Sïégb¹? a 6”ঠ­ ¼  ÿ  \ € S u { � º é ù ÿ Ñ:CV¦ ¦ ¦ <  "¸\Íb,È:ï<þ?È`i#>Í¥:"ü))Íj&Ú*å!Íö;>PÍ¿'áÈ>2õ<͇:͸:Ò'*ü}´Êï+å !.Í‹&ÂÞáÃÕ" *ø+6s#r*ü+",ÍõÌÏ&ñÈ*¸Í$ÀþM¹<ͽ<>KÍD1Ã*ÍÏ&>M¿Éÿ ͺ02�"‘Í!3Library: Í„*Í!3Name Index Size KiloBytes CRC2$%>!Í%åë"ë<Í�%Ê,åͧ%Á x±ÂÛëÍͶ>͆3Í!3DIRECTORY >͆3ÛÍ*3Íâ%>ÍÄ3ÕÍ­á>ÍÄ3åÍ­>ÍÄ3á:¸=ÍP7Í­>ÍÄ3:ê<õ>2ê<*à%ö<Íê4ë>0Í 7Í(5ñ2ê<Ûá"ë<*U%åjͶ*f%ƒͶá›Ͷ>͆3Í!3Active sectors Í!3Unused Í!3Total <2$%>͆3ÃÆͳÃ(5ö<Íê4ë> à 72w:À+2^'Õ—Í%ÊÜ<ëÍ‚8ÊÜ<á =Íb,Ê%ë\BKÍJ.Ê%Í®*Í!3Extracting...!H'"{/:^'Íû*ÍË:Ê%Í�%Ê$Í.à <õÍ8ñÉÍ!3 ͧ%*é%ëÍÃ-\ÍñÍ13 to Í`&<Í¡(Â`·ÂIÍýÃæ&!H'"¸Í�**ª*"L'*ø+ "I'><´ÍÚ."I'Â�þtÊIôåë*ø+ëÍÂ:"Á(!ö<̓<ÍéÑ*ª*ÍÂ:>tÚI!*/"¸ÍýÍÊÆÍ &Ê÷÷þÂ÷ÍÝ&Ê÷:^'Íû**,ë*à%}´ÄÂ:>KÂIÉ\Íb,BK! =ÃJ.ÍIÃÏ&\Í92͵-!ö<Íá->KÍö;Í¿'ÀáÃI* ëÍ„9:õ<·Êá&Íî%*,>Í–:ë!DMåÍq)áÈÍã(ÍG+Í·1ÈÍ92ÍÝ1õÍM2ñë—Í%ÈÍ!3Deleting...Í�%ÊÓ<åͧ%ÕÍ!3 Íè%Ááy°Â–>ÿÍ &ÍžÃp>þÍ &Ãp*©%+"Ä>2õ< *ø+"º!ºÃ6A õåÍ!3Active entries: *N%ÍFÍ13, Deleted: *_%ÍFÍ13, Free: *\&ÍFÍ13, Total: *©%ÍFÍ13.áñÉ—2õ<>OÍ¿'Èå—!"Z&"^&"\&Íã(áÊú~·Âú #~Ö ÂúÂP#¶Âú#¶Âú#ÍÍ<åëÍÍ<"ÍÍá&áå))Íj&Úò"©%"Ú!ÍÒ9" ëÍš9Íö;*ë<>Í¿'áÈ>Ím:͸:Òóë!€"ü+{²ÊÃDM>O!Íã(Êú*ü+",Íî%{²ÄÂ:>kÄI*ø+ ~ÍB& x±Ââ:À+·ÉáÍ >M¿ÉÍá&>d¿ÉÍ„9Ãá&Í%È:À+2^'ÍË:ÈÍ�%ÊÓ<Ío!Ì3Ì*3ͧ%Íâ%ÍZ Ío!Ê< ÍÍ¡(Âg ·ÂIÉ!H'"{/" !Í�**ª*"L'*ø+ ÍÚ."I'ÂŽ þtÊIû åë*ø+ëÍÂ:"Á(Í13---> !ö<Í(5Ñ*ª*ÍÂ:>tÚI!*/" !Ío!:ƒÂ!>͆3Í!3^C=abort,^X=next file,L=next line,=next page>͆3>2*!Í*3ÍÊ!æþÈÍ!!à !þÈÃIõÍ;ñþ À>=2*!ÀÍo!ÊA!:ƒ2*!> Ãb3ÍC3ÍÇ5 LÊA!!V!Ãë:`!e!j!ß<`!>Ã,!>Ã,!ááà :é<æÉ2" =Íb,È! ="<+!*$Íá-!",}2Â"ÍË:Ê>#!"$—2$%Íö#>þÍö#*,#", =!*$Í ,Ê6#Õë̓<=Í$Âã!!*$>.ÍÕ;#ëÍ$Êã!ÑÕ!!"$á#Í*3Í%Ê1"ÍÍ<"$Í$Ê1">þOÊc"þRÊc"Íè%Í13 already exists--not added.Õ!:"þRÂc" =͵-Í13 not in library--not replacedÕ! =Ͷ.Ò–"͵-Í13: Cannot add an 8 megabyte file!Õ!"¦#Í$>þÄ &Í<$Í�%ÊÁ"åͧ%"�#*¦#ÍÂ:á¤"ÍL#Ã*#>þDÂã"Í13No room for:  =͵-<à #*\&}´>f #Í13No directory space for: ÃÙ"ë*$"�#*©%ÍÂ:ÍL#Â*#õÍ$>Ä &ñ•!2Â"ÍIÕ!*,+}´>Uõ>2$%ñ!\"<+ÉåÍ$Êe#Í13Replacing: Ãt#Í13Adding: á"å#—Í &ë! =Í“7ë̓<͵- q#p#å##"Æ#î#Õ =Íú1*,DM!"ð#>Í5+Í¡(Í5+ÂÊ#·Â¹<"<É*�#>OÍq)"�#*ð#"ð#Êã#—õ#õ!>þÍ &ñÉáq#pÉÍ<$Í�%Èͧ%͸:Úù#"$Ãù#!+|µÈ#åͧ%áÉ!'$Ã.7LBR—!ä<Ã%ÕÍ%áÈÕ =Íb,ë€\ÍJ.áÈ%Í‚8ÈÍ!3Renaming...Í�%Ê÷$Í!3 ͧ%*é%ëÕ€! =ÍJ.*�%å*›%å`iÍ..—Í%á"›%á"�%ÑÊ×$ÍÇ-Í13 can't be renamed--new name existsÃq$<2õ<ÍÃ-Í13 to !� Í_<ÍÃ-Ãq$%Í8Íž—<É2m%\Íb,ͽ<Õ!"_%"N%"U%"f%DM!#åÕÅͧ%Ê~%þÿÊ~%2H%Õ*é%ë!\Í€.ÑÂn%>·Â^%!#"N%!"U%Ãl%!#"_%!"f%þÁÑáÂ&%ës#r#ëÃ&%á"�%DMÑáá"›%y°>UÉ!|µÈ+"�%Õ!^#V#"›%ëÑÉë!ÍÂ:Úâ<*,DM"a&ëÍ4&"é%<~õ ÍÃ<ÕÍÃ<ÕÍÈ<"à%á"d&ëá"g&ñÉÕÍè%ÑÉÃÇ-Å*ø+å " &6#6*,DMáÍ;"ÁÉÕõÍ4&>2õ<~å!Z&·Ê&&<##Ã&^#Vr+sáñwÑÃB&å+>͇:ë*ø+ÑÉõå!Z&·ÊQ&<##ÃG&4ÂWáñÉ!ÉÅåAÍÒ9² Íp9áÁÉ~·ÊÓ<Í &Êû7#Ã|&Åx±Ê�&~Í &Êž&# ÃŒ&<ÁÉÅÕåÍ�**ª*w:é<æÊË&*¬*+|µÂÁ&Í''ÃÞ<*ü+#"ü+ÃÞ<<ÃÞ<åÕÍG+ÍD1ÑáÈÃá&—Ãë&>ÿÃë&>þÃë&ÅÕåÍ�*<Ê'<Ê ':¬**ª*ÍÀ;Í''ÊÞ<ÍG+Í·1ÊÞ<>2¹+Í�+*ú+ëÍ8—<ÃÞ<*ü+DMÍ™.ÍG+*ø+Ís2Íß0>D¹Íû*—Í¡(õ*ø+ "I'Í�**ª*"L'>Íû*ñÂH'·Â¹<>ÉÅå*þ+DMͧ' 'Í*ʤ'!ÃŒ'#"þ+áÁÉå*ü+͸:á>RÈÚ½'å*ø+ ~áÉ¿É2^("D(`i>Í¥:>͇:"'(:À+Íû**×+:NG~·Êî'#Âá'>FÉ:N<�Íû*Íö;*œ94PYëÍÂ:Ú (>Í–:>͇:¼Â$(>€½Ú$(Ê$(—>MÉDMÍÂ:Ú1(BK*ë<ë*ú+s#r`i" ,Í�+!:^(=$Ìx<Êc(Íb,È:ï<þ?È>Íe-È*ø+ë* ,ë*ú+ëÍ‚8È*G+!$>ÍÀ;:À+õÍû*>2¹+:é<ö2é<ñ·* ,DM*ø+É·Ê·("Ä(ë"¸(`i"Á(!",{²*,È!>OÍã(õ"Ä(*¸(ÍÂ:"¸(ñÂU+þM¹<·É+")ë"8)!"1)þOÄM+ÅPY* ,ÍÂ:ÚL)>Í–:|µ>MÊg)DM*ø+Ís2ÍG+!#")̓2Í1ÂQ)Í_+Íg2!#"1)!+"8)|µÊc) x±Ê^)Ã)>RÃg)—>X*)+")Ãd)>MÃd)<Íi+Á*1)ë*)#É+"¦)ë"À)!"¹)PY*ü+ÍÂ:ÊÔ)ÚÔ)>Í–:|µ>LÊû)DM*ø+Ís2ÍG+!#"¦)̓2Í 1ÂÙ)Íg2!#"¹)!+"À)|µÊë) x±Êæ)â)>RÃû)—>D*¦)+"¦)Ãì)>LÃì)<õ*ð<ë*ø+ëÍÂ:DMñ*¹)ë*¦)#Éå!"ü+áÃ*ÅÕå!"F*Í�**¬*>Í–:|µ>MÊÞuÉ:NOß+*ë< ÅÍ‚8Á×+*ë·ÊÐ+O:N¹ÒÕ+—>BÃõ+·!+ "¶+!++ "ú+ÍÈ<"¥+4 "ø+áÁÉÅÕå!"?,!€Ís2áÑÕåÍb,ÊÞ<͘22\,Ã3,ÕÍ<ÑþÿÊ·2O!+"?,}´Â1,y‡‡‡‡‡!€O #Íb,><÷2ÅåÕ:ê<2Y-> 2ê<2ï<—20-ÍÕ22S-Õå! ë>  ÍÀ;áÍ_<ëå>:ÍÕ;ÊÓ,6#ãåÍ}4ʸ,|·Â¸,:Rg}¼Ò¸,2S-á~·ÊÓ,Í6#ʹ,Ö@O:Q¹Ú$-yÃÖ,ÍÝ1áÑ ~#þ*Êî,þ.Êý,Í-ÃÜ,?yÍ->¸ÊÜ,Ãð,xþÚÜ, Ãð,·Ê+-þ?Â-2ï<Ö Ê-20-ÀxÃ+-—>IáÃ,-=áÑõ>·ÂC-> ?bk#ÍÀ;y2ïÍÀ;!#>w>2ê<ñáÍû7#ÁÉͰ<þP›-ÍÈ1Êé1Í13File exists-delete it?Í÷2È>PÍD1ÈÃé1þKÊ’-2©-Íú1Àõ>þMʱ-ñÉñÃé1õå!ö<Íá-Í(5áñÉ—ÃÉ-> åõ!ö<Íá->:ÍÕ;#ñ·ÄÐ5Í(5áÉÅÕåõ͘2:ê<õ> 2ê<åÍÕ2o&ã·ÌÝ1Æ@w#ëãÍê4ëÍD< 6:#ÑëÍx<ë6.#ëÍx<ë6ñ2ê<ñ÷2ÅÕ# >.Í_<ëÑÁÉÅÕå~> 2z.#õ~þ?Êh.þ?Âg.2z.~ñ=ÂT.#PYÍx<>þ?ÃÞ<ÅÕå #~þ?Ê’.–ÂÞ<Â….ÃÞ<õÅå`i—|g}oÒ«.# ."í<áÁñÉÍÈ1È͘2ÅÕÕ#Í<á# —¾ÚÕ.+V+^ë<ÑÁý2ÅÕåÍÍ<vÿ͸: /2t/22/ëÍÍ<"±/!"a/ëö<Í“7 ÍÍ<͸:Ò$/ë"Œ/ÑÃ/áÑÁÉ—Ã/—>tÃ/ÅÕå!]/å>·Ê>/=22/>ÉÍm/þ�ÂY/Ím/·ÂP/>�É==22/:O>·Â„/ÕÍÑʾ/O>=2t/yO!Ò“/##^#Vzæ€Ês/y2q/zþþÊ­/{/É*a/ÍÂ:>ʾ/>J¿ááÃÞ<ÅÕåÍÝ1Æ@2ß/Ö@Í@0ÊÞ<Í13Drive : Total å*¿=]T*»=#—zW{_Ò0+Âõ/:¸=ÖÊ0)=à 0ÍFÍ13k, Used ÑÍÂ:ÍFëÍ13k, Free ÍFÍ13k<ÃÞ<ÅÕ:.=þ1Ú{0*ð<å*ë<åÍs2ÍÝ1=_.Í<Dá^#VáÍs2<Âq0—xÃx0ë>Í–:<ÑÁÉͺ0Í<ë*»=#ÕÑÕÚ—0W+|µÊ¦0ÊŒ0zÃ’0`i:¸=Öʵ0)=°0Ñ<Ãx0õÅÕåÍ<ÍÉ0Ã×<¶=Íx<:.=þ1È—ë+w+wÉ͘2*í<|µÊ½2+"í<ÕÍ<ѷ½2Íg2Ãâ0͘2ÕÍ<ѷý2͘2ÅÕå"Í<·Ã·2͘2ÅÕå!Í<·Ã·2õÅÕë*ð<ë€Í‘< y°Â61ÃØ<ÅÕåͰ<þP˜1ÍÈ1ʲ1=‡‡‡‡‡Æ !€O ~æ€Ê˜1Í13R/O file, delete it? Í=3þNÊÞ<þY„1Í13es ͘2! ~æwÕÍ<ÑÍ<ͽ2—<ÃÞ<ÅÕå͘2Í<<>D÷2ÅÕå͘2!€Ís2Í<<÷2ÅÕåÍ<<ÃÞ<ÅÕå͘2Í<<>S÷2ÅÕå͘2Í<<>U÷2ÅÕå͘2åë\$Í_<Ñë Í_<mÍx<\Í<<>U÷2õÅÕå=Äw:%Í<Ã×<ÅÕå_:Q»Úc2Í<—<ÃÞ<—ÃÞ<Å*ð<€ ÁÃs2õÅÕå"ð<ëÍ<Ã×<Õå͘2!!Ñs#r#6áëý2õåÍÕ22Ä2!#~æÍâ2~æw"Î2áñÉáÑÁý2õåÍÕ2õ>Íâ2ñ·!¶wáñÉÅÕåÿ Í<ÃÞ<õÅÕå_ Í<Ã×<1Ã<Í13 (y/n) ÍC3þNÊ3þYÂ3·õÍ;ñÉ>͆3>2R;ÉÍ*3Ã13Í*3Í13 ÉãÍ(5ãÉãÍ(5áÉÍõ:ð<ÍI3ð<å>ÿÍ7<ÂÜ<*ó<#"ó<ÃJ3Íè;÷3ÅÕåG!„N#~¸Ê{3 ÊÞ<Ãn3#N#ͪ3ÃÞ<ÅÕåG!_N#~¸ÊŸ3 ÊÞ<Ã’3#N#Í·3ÃÞ<å ~6áõÍ5ñwÉå ~6áõÍ(5ñwÉ2Ð3:R;æøþÐ> Í;ÃÇ3õ:é<î2é<ñÉõå! 4:é<õæÊÿ3ñæý2é<ͳ7áñÉñö2é<ÍÊ7áñÉ;44õÍe;ñÅO:R;¹Òà<> Í;à 4å*L4ã++"L4ÍD4##ã"L4áÉÅÕåO:L!É=#å6+q¹ÒY4wë Í<á^#6{·ÃÞ<õÕåö<Íê4ëÍ(5áÑñÉÅÕ—2ç4ÍD<Êâ42ò·Éë"5ëõÅåÍù4áÁñÉÕ:ê Í;> Í;ÂT5Ã5:è<·Ê5G:R;¸Ú5Ê5> Í;> Í;Ã55~#Í;Ã)5Õ+ͽ5"Å5Ë=~·Ê®5þʬ5#Ͳ5Ê•5ͽ5—Ñy°É~ÍÇ5 É#Ͳ5½5ÉãÍ<Íû7ãÉÅÕåOÍÕ;ÊÞ<áåyÍÕ;Êî5T]#ÅÍ“7ÁÃÚ5<ÃÞ<õå~ͰþUõ~̰MÚ¡8*9ë*OÍÂ:¦8>T¿ÑááÉëDM#"9Ñ*!9 ñw#s#rÍ9ͽ<á"ë<ÍU9ÊÓ·Â 9ÍÂ:à 9"Ãñ8áãÃÞ8!|µÈå!#~“#Â09~’Ê;9ã͸:ã#Â#9áÉ++~æ<2V9~>2h9ãbk"^9á<É>·È=2V9!å##"^9á>·ÄÈ<—<ÉÅÕåëÍö;*œ9Í}: ÍÂ:ÃÞ<å*œ9ÍÂ:Ú•9"œ9—<áÉ>M¿áÉå!"œ9áÉÅÕ·ÊÆ9_—2Í9DMÊÌ9ÍÒ9ʱ9W:Í9‚2Í9ñ9!ÃÏ9>·ÑÁÉÅÕ—2:>ëõ—x±Ê:xGyOÒø9Òø9å!:4áë)ëñ=ÂÞ9Ã:ñ>·ÑÁÉy°ÈÅÅë"Q:ëÁÅÅÕ}‘|˜ÚB:3333xÚD:ÅÕ—yOxG—{_zWÃ:ÑÁz³Ê[:}‘o|˜gå!"Q:áÃ:Áë*Q:<ÁÉå`i͇:DMáÉå`iÍ–:DMáÉë͇:ëÉõ}/o|/g#ñÉ·Èõ—}o|gñ=È:·Èõ—|g}oñ=×:·Èõ—|g}oÒ³:#ñ=æ:åÕPYÍÂ:ÑáÉ}“o|šgÀµÉ>ÿÍ7<þÀ>NÉõÅÕå~õwñ# x±ÂÚ:Ã×<Õ_Í <ÑéÅÕåÍ<ÃÞ<ÅÕëy°Ê;Í‘< Ã;ÑÁÃË;ÅÕåõ_:é<Ü<ñþ ÊQ;þ ÒQ;þ ÊU;ÿþÊQ;þ ÂÞ<:R;=æøÆ GÃU;>€G:J¸Ò^;x2R;ÃÞ<ÅÕåõþ _Â~;Í“;:–;=æÊ�;Ão;Í•;ñáÑÁþ Ê�;þ À>2–;É ><2–;:é<Ú<ÉÕW:K ’ʽ;Ú¼;�Ò­;ý; yÑÉõ·ÊÚ ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í1!\ !ÍÇ2*.+"{46ë![5Ù+ ~y°Â!ë"y4Ã!4¾Èw_ÍÉ#~þ ʸ ÞAÉ:4É~ÍÞ~#þ ¼ > ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7ÍÃ1Í/ÍRÍ£:Z·Ê !H 4~þÂ?! ˆÍÇ2rÍGÍïÍDÍ‘$ÃÍù%*ª."p&:©.æ2r&Íþ%:C·Ä[!Í:A Í' :B Í' ÈÍGï Z80MR VER 1.2 FILE 12345678 þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÿÀ!) 0000 ERROR(S) ASSEMBLY COMPLETE !"þ*y4~·Ä!þ}´ÂïÉë! ~·ÈåÕ¾#ÊÑáÚ Nwy#Â"þà Íj ͆Íæ—go2Z2ñ2C "D "F "A 2ã&"å&"ç&"é&É!+~·ÈÍm~#·ÂdÃ^F#N#"Ÿ>ð¡2>ÿ2¡*y4ë*Ÿ·È!~ ©ÕÅÌ¢ÁÑ! ëÃ:¡<2¡ÂÈÍïÍï*ŸëÍëÕƒÍÑÍïÍï:¡þÌïÍûÂÒ> ÍûÍÍ> ÍûÉ> Íû>2¡> ÕÍÑÉ:·ÊPÃGÍõæþ Ú$ÆÆ0ÍûñɃ€UNDEFINED@@DOUBLE DEFINEDERRORREDEFINEDPUBLICEXTRN#ASEGCSEGDSEG SYMBOLSåÕÍÌ!Z w#·Â”Ñ!I 4áÉÍŒþ*Êø!ÜåÍ�Ín!·Í.:C ·À!èÍ.*_ë:þ Âè:þ Â#'É:C ·ÂôÍãþ;Êôþ ÊôÍð&ÍmÉ:C ·Âô!ÜåÍÝ2Íãë"_!Í.áÃôEJECT AHEADIN:INCLUD“LIST WMACLIS^—2I ÍIÉ:H ·ÈÕrÍPÑÉÍe2BÉÍe2<É—2I ÍÝ2ë"_!|Í.Íû&>ÿÉOFF �ON �>É>ÿÉ:ñ·Â!!—w# !# ÕÍÇ2Ñ: 2!þ:ÂØÍ93ÖAÚþÒ<2Íþ.Âõ!"> w#w#w!"ÍÍãþ Êþ;ÊÍû&ÉÕÍÍÑ!ñ4ÉÍ93Í3Àw#ÂÍ93É LIB¾ÂH# Â4^#Vá*_ëéØ~·È ##Ã.!òÍÀþÊ¡þ ʃw#þ Âo>°GxþPÚWÍÀþÊ¡þ Âv6 #6 #6òÉÍÒ2ÍãÍÝ2Íãë"_ëÉ:ñ=òº!ò6 #6E#6N#6D#Ã2ñÃRÍÙæþÊÀþ Ðþ Èþ ÈþÈÃÀ:ñ·Ê# Æþ Êãþ ÊãÉÍÍãþ Êþ;ÊÍû&ÉÕÍÍÑ!ñ4ÉÍ93Í3Àw#ÂÍ93É LIB¾ÂH# Â4^#Vá*_ëÍÈ : þEÐ: þXÊÈ ÐþEÒÈ Õ·ÊkÍ:Ã_ÑÉJ :I ·È:H ·ÊÌ*¿}´>+ʉ2Y :J þ Ê©:B Æ'2B :A Î'2A ÍGÃÌ:B·ÊÌ:8/*C ¥ÂÌ*¿}´o:</¥ÂÌÍP!J >6 #=ÂÑ2I 6 #6 #6!P " ÉåÕÅõ: þX :0·Ê Í !ñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í' ÑáÉÍ* õæþ Ú8 ÆÆ0w2I #ñÉ: þEÐ: þXÊÈ ÐþEÒÈ Õ·ÊkÍ:Ã_ÑÉJ :I ·È:H ·ÊÌ*¿}´>+ʉ2Y :J þ Ê©:B Æ'2B :A Î'2A ÍGÃÌ:B·ÊÌÍÍÒÃÍÈ ÃÍj ÍD͆ÉÕ·ÄÔ ÂÉ ÑÉåÕÅõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_ÍñÁÑáÉñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í'åÕ*Ô >ô¤Ê\ Å÷ ÕÅÍÖ Í·ÁÑÊO >ÃX !€ëÂ4 Á!å÷ ~á#"Ô ÑáÉ!"Ô ! Ö !ÍÇ2!ß 6A#6Z#6M—2ö : Ö@Úž Êž þÒž 2Ö Ö Í­ þÿÀ¼ ø Õ€ÍÑÃINPUT FILE OPEN ERROR Åõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_ÍñÁÑáÉñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í'åÕ*Ô >ô¤Ê\ Å÷ ÕÅÍÖ Í·ÁÑÊO >ÃX !€ëÂ4 Á!å÷ ~á#"Ô ÑáÉ!"Ô ! Ö !ÍÇ2!ß 6A#6Z#6M—2ö : Ö@Úž Êž þÒž 2Ö Ö Í­ þÿÀ¼ ø Õ€ÍÑÃINPUT FILE OPEN ERROR Åõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_ÍñÁÑáÉñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í'åÕ*Ô >ô¤Ê\ Å÷ ÕÅÍÖ Í·ÁÑÊO >ÃX !€ëÂ4 Á!å÷ ~á#"Ô ÑáÉ!"Ô ! Ö !ÍÇ2!ß 6A#6Z#6M—2ö : Ö@Úž Êž þÒž 2Ö Ö Í­ þÿÀ¼ ø Õ€ÍÑÃINPUT FILE OPEN ERROR Åõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_ÍñÁÑáÉñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í'åÕ*Ô >ô¤Ê\ Å÷ ÕÅÍÖ Í·ÁÑÊO >ÃX !€ëÂ4 Á!å÷ ~á#"Ô ÑáÉ!"Ô ! Ö !ÍÇ2!ß 6A#6Z#6M—2ö : Ö@Úž Êž þÒž 2Ö Ö Í­ þÿÀ¼ ø Õ€ÍÑÃINPUT FILE OPEN ERROR Åõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_ÍñÁÑáÉñõÍ' " ñÁÑáÉÍmÍÑ&åÕë!K zÍ' {Í'åÕ*Ô >ô¤Ê\ Å÷ ÕÅÍÖ Í·ÁÑÊO >ÃX !€ëÂ4 Á!å÷ ~á#"Ô ÑáÉ!"Ô ! Ö !ÍÇ2!ß 6A#6Z#6M—2ö : Ö@Úž Êž þÒž 2Ö Ö Í­ þÿÀ¼ ø Õ€ÍÑÃINPUT FILE OPEN ERROR Åõ! þ Âî > ÍÔ ~æÂà Ãü 4þ Âö 6_åÕÅõ>€*ã¥Äñåwá#"ãÁÑáÉÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’Ê’þÒ’2ååÍåÍ!"ãþÿÀ±ø OBJECT FILE CREATE ERROR HEXOBJ>Í÷ÍåÍÉ~æÂà Ãü 4þ Âö 6_åÕÅõ>€*ã¥Äñåwá#"ãÁÑáÉÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’åÕ*>ô¤Ê¿Å:ÕÅÍÍ·ÁÑʲ>û!€ë—Á!å:~á#"ÑáÉ!"—29Í­ þÿÀ!ñÕ ÍÇ2Ñø 12345678ABC INCLUDE FILE OPEN ERROR ÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’åÕ*>ô¤Ê¿Å:ÕÅÍÍ·ÁÑʲ>û!€ë—Á!å:~á#"ÑáÉ!"—29Í­ þÿÀ!ñÕ ÍÇ2Ñø 12345678ABC INCLUDE FILE OPEN ERROR ÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’åÕ*>ô¤Ê¿Å:ÕÅÍÍ·ÁÑʲ>û!€ë—Á!å:~á#"ÑáÉ!"—29Í­ þÿÀ!ñÕ ÍÇ2Ñø 12345678ABC INCLUDE FILE OPEN ERROR ÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’åÕ*>ô¤Ê¿Å:ÕÅÍÍ·ÁÑʲ>û!€ë—Á!å:~á#"ÑáÉ!"—29Í­ þÿÀ!ñÕ ÍÇ2Ñø 12345678ABC INCLUDE FILE OPEN ERROR ÍåÍ!·È/ø OBJECT WRITE ERROR >É2D: þZÂZ>É2÷2ÒÉ! å!ÍÇ2!Ì>·Êr!ÏîÍÇ2—2: Ö@Ú’åÕ*>ô¤Ê¿Å:ÕÅÍÍ·ÁÑʲ>û!€ë—Á!å:~á#"ÑáÉ!"—29Í­ þÿÀ!ñÕ ÍÇ2Ñø 12345678ABC INCLUDE FILE OPEN ERROR ÍåÍ!·È/ø OBJECT WRITåÕÅõ>€*¥ÄW7ñåwá#"ÁÑáÉ7ÍÍ!·Èrø PRINT WRITE ERROR >É2†: þEÚœ>É2:2É! !ÍÇ2!6P#6R#6N—26: Ö@ÚÊÊÊþÒÊ2ÍÍ!"þÿÀéø PRINT FILE CREATE ERROR >Í:ÍWÍÉÍåÍ!·È/ø OBJECT WRITåÕÅõ>€*¥ÄW7ñåwá#"ÁÑáÉ7ÍÍ!·Èrø PRINT WRITE ERROR >É2†: þEÚœ>É2:2É! !ÍÇ2!6P#6R#6N—26COND \ELSE ‚END ÆENDC ¢ENDIF ¢IF \ASEG rCSEG wDATA ÙDB ÙDDB DEFB ÙDEFL JDEFM ÙDEFS 5DEFW $DS 5DSEG |DW $EJEC AENDM EQU QEXTRN ÙLIST LOCAL MACRO ¹NAME •NLIST ORG XPUBLIC¥SPAC TITLE X*¿}´Ä÷&À:þ Ì÷&ÈÕ!ÇÍÒÑÌ÷&È!Å�þ# Í93Í3Âûw#Ãêq Ì÷&#þ,Êá6ÍÜÍ2ÍRÕÍŒÍmÑÕÍ�!XÍÒÑÊzÕÇÍÒÑÊs*4þ ÂUxþÚBp#Ã@Ê\p#þ#Ì�w#þ Â@"4̓Ã!Z4Í÷&*46#"4*_ë:þ Äö&Éå!Á~·ʽÕåÍÜ~·áú²Ñ~#·ò©Ôõþ&ʺñ33áÉ$YM€þ Ì÷&ÈÕ!ÇÍÒÑÌ÷&È!Å�þ# Í93Í3Âûw#Ãêq Ì÷&#þ,Êá6ÍÜÍ2ÍRÍ÷&É*¿|µÌ÷&Èþ#Ä÷&ÀÍ93Í3Ä÷&À!ÂÍ*4+6#Í93Í3ÂQw#ÃA6# Í'  Í' 6#"4þ,ÀÃ"Í·È^#V*_ë|µÈÁÁ:C ·Âôãå*¼å*¾å*4>Áq#p#=œ"4á"¾Í#'!ÀÍ*4"¼6€#:ÀÍ' :ÁÍ' �ÍÑ6#"4̓ÍÜ*¿#"¿ò*¾P~#þÊZ·ú{þ ÚÄþ ÊŸþ#Ê ͵ÃêÕë*¼ë·ÊQþÂå¾#ÊþÊ,áÃ+33ãë>?͵͵~#þÚF͵Ã9á~þ&Âê#ÃêÑ>#͵Ãê*¼>+F+NÅ=Â_"4á"¾á"¼*¿+"¿ÉåG*¼~#¸ÊŽ·Â€áÃê~#·úŠþ ÚŠ͵ÃŽ> > —"¾òÍ£Ãâ È ÉG> ͵ÂÅÃêq# þ'ÊðÍ93þ,ÊÑþ!Øþ;Èw#ÃÚþ Üð&Øþ'Êw#Ãðþ'ÂÚw#Ãð#~Æ'w+~Î'wÉ*{4~·ÈÅÍÒÁÈÅ ÁÃåÕÅÍ·Âk*{4åÁ*y4ë!øÿw#xºÂLy»ÂLøÿ*y4 "y4*{4 "{4ë!ÍÇ2*4ës#r̓ÁÑáÉå:€4<*y4¼Ò54!9%áÀœø MACRO OR EXPRESSION NESTED TOO DEEP-STACK OVERRUN åÅÕÍÜÑÁáɾÀ#ÂÜÉ!"¿"À"Â*}4"4*{4~·È 6#6#ÃûÍÐÍR.:J þ Ày·Äï&À|µÂ%!åÕÍÌ!I 4ÍmÑá+}´Â%É—2I Íã2!‘þ Úˆw#ÂHÈÍÐ!‘þ'À2þ Üû&Úˆþ'Ê�wüû&úˆ#Ãfþ'Êu6 #6 # ˆ6É!¥Íç2Í#'ÉÍ#'>2jÍä2:33þ Ìð&ÈÍú3*w4 ~öwüÿ&æ Äõ&Í93þ,ÀíÍ#'>2jÍä2:33þ Ìð&ÈÍú3*w4 ~öòþwÍ93þ,ÀÃáÿÃÍÐÍ93ÖAØþÐÅO!0 ÁqÍ93þ,ÀÃÿÿÿÿÿÍMͳ'ÉÍMÍ0'ÉÍMÍ ':ã&¹Êg Äï&OÍ�&Í#'É>Ã~>Ã~>2ã&·Êˆ2jÍ#'ÍÝ2:þ Èë"_ë!£Í.Íû&ÉINPAGE¹PAGE ´û:ã&·Ìû&È!Í#=ÂÆqÉ:þ Äö&ÉÍ#'þ'ÊðÍM͆$þ,ÀÃÜ—2«.2©.þ'Ê þÜû&Ø2ª.͆$Ãðþ'ÊÃè!Y$6 åÍ$á6ÉÍ#'ÍMÍÜ#þ,ÀÃ'Í#'ÍMy·Äû&ÕëÍÑ&Í�&ÑÉþ!Üû&þ;Ìû&ÍR.É*D ÍÐ#"D :C ·À"F ÍR.y·Äï&}´ÀÍÜ>2C É*D ÍÐ}´Ìù&ÈåÁ*F }¹À|¸À:C î2C É*D ÍÐ|µÌù&È+"D åÁ*F +x¼Ày½À"F —2C ÉÍ#'ÍR.Í 'y2©.*¿}´Ä÷&*D }´Äí&!Z4ÉÍ#'!®,å¾Â#ÂôÁ~2 #^#V*_ëéþ'ÊÃè!Y$á~·Âîå':ÖAÚQþÒQo&)^#V!ÍbÊ…þ;ÂE·Â<—Í”# ÂTÍù&É~þ`ÚjÖ G¸#Êb+þ/Ê{þ:À~þ;Èþ ЗÉþ/Ê™*_ÍbÂE"_Í©}Í”#þ;™Ã^.Í®þ;ÈÖ0þ Ú¼Ö))))µoÉͪ-:¨.þ&Ê$æ@Â$þ,Âü:¨.Í Ö8Üû&þÔû&懇‡G: æö€2 ͪ-:¨.þ€Äû&: Í”#ÃÜ#þ!À>;Éͪ-þ,Â: :¨.Í Ö8Üû&þÔû&懇‡Æ 2 Íœ-:¨.þ€Äû&:A·ÊS *ª.:©.OÃk ÍÑ&:©.©æÄï&:ª.•o:«.œg++|­üì&yæÄì&|<Ê~ =Äì&}å>€2¨.&"ª.|2©.: Í”#͆$á$È%Äì&ÉÍœ->íÍ”#:¨.þ€Ä':©.·Ä'*ª.|·Ä'}·ü'þÔ'>F-ú”#>VÊ”#>^Ô#Íz-:².Í!Æ@2 :¨.æ Ê!:¨.þaÄû&>íÍ”#: Ô#̓#Üû&þÌû&懇‡É>ÛÍ”#Æ$Íz-:¨.Í!ÆA2 :².æ Ê9!:².Ãô >ÓÍ”#Ã$Íœ-:¨.̓#Òa!:¨.Í["Ú$: Æ*2 Ã5#‡‡‡G: €Ã”#Íœ-:¨.æàî€Ä':©.æÄ'*ª.}æÇ´Ä': …Ô#Íz-:².þ€Äû&:³.æÄû&*´.}æø´Äû&>¥‡‡‡o: …2 ÃÃ!Íœ-:¨.̓#Úß!O: �2 >ËÍ”#: Ô#: õ>Å2 Í5#ñÆÔ#Íz-:¨.æ Êl":².æ ʾ":².̓#Ú2"‡‡‡Æ@2 :¨.̓#Ò±":¨.Í["Ú$: þpÌû&Ã5#:¨.̓#Ú$2 :².Í["Ú$Í”#: ÆpþvÌû&Í”#Í$ÉæþmØþo?Øþm>ÝÈ>ýÉ:¨.æ@!#ÂŒ":².̓#Ò–":².Í["Ò¢"!#:².ÍÓ"ÍÜ#ɇ‡‡ÆÍ”#͆$ÉÍ”#>6Í”#Í$͆$ÉG: €þvÌû&Ô#:².æ@Ìû&!%#:¨.ÍÓ"ÍÕ#ÉGæàî Äû&xæÖÊð"Öüû&<þÔû&æO ~å·Ä”#á#~·Ìû&Ô#:íKí[*í{Ý*ý*!1Ý!ý!2íCíS"ísÝ"ý":¨.Í["Üû&Í”#: ÆÍ”#͆$ÉÍœ-:¨.æ Âd#: ÆFÍ”#͆$É:¨.̓#Ú5#G: €Ã”#Íz-:².þ'ÊP#Ã$þkŠ#>&þ Øþ(?ØæÉå*I-Ì¥#2Ó#!Ò#Ê$þ@Ò´#·ÈõæÌ'ñÉþËØÌ'þÙØÌ'þÝØÌ'þíØÌ'þýÌ'Éå!³.Ãà#å!©.ÕÅõ:Y$O~æ±O#^#V#"}$ÕáÍp$> ¡Ê${ZW>¡Â $Õá>0¡Â$Ä'yæå!Z$…o|ÎgFá>¡Ê0$°ü'æAOÍN%{ÍêÍ„&>0 ÊQ$ly·ÌN%zÍêÍ„&Íf$ñÁÑáÉ€€ ˆ”yæÈÆB2X Éyæ ÈæÂz$ZÉÊPå!³.Ê$å!©.ÕÅõ—Ãæ#*y4:j·È÷ÿ"w4Í©$Í%ÃÉ$Íù%!Ÿ~·Ès&ÍÇ2!o&6#—w#w#6ˆÉ*w4 "w4~·È N> ¡ÂÉ$>¡ÊÉ$y·úÉ$æþÊÉ$#^#Vë:1·Â%>¡Ä.%ÃÉ$Íù%:Î*Í&Í%:Ï*Ï&‡‡�ÆŒ2r&"p&}´Äþ%ÉÍù%"p&>¡Æ€2r&>2o&*w4s&ÍÇ2É:H ·È:>·ÈåÕÅy·Â»%}õ:o&·Ê¡%þÒ¡%_:ã&G:r&¸Â¡%*p&ëÍÑ&z¼Â¡%{½Â¡%s&*o&&ñw!o&4ÁÑáÉÍù%ÍÑ&"p&>2o&y2r&ñ2s&ÁÑáÉÍù%"s&yO:ã&�2r&ÍÑ&"p&>2o&:r&æ þ Âò%>2o&*}$u&ÍÇ2Íù%ÁÑáÉ:o&·ÈåÕÅ*p&U\ë"p&!o&~ÆG>:Í÷:j·Ê6&~Í÷�O#Â&—2o&‘Í÷ÁÑáÉ~ÍW&#�OÂ6&—2o&‘ÍW&> Í÷> Í÷ÁÑáÉÍZ&õæþ Úh&ÆÆ0Í÷ñÉ:ã&G:r&¸Â¡%*p&ëÍÑ&åÅÍÑ&#Í�&ÁáÉAú®&ʲ&"é&:Ð&¼Ú¨&À:Ï&½Ð"Ï&ÃÅ&"å&É"ç&:Î&¼ÚÂ&À:Í&½Ð"Í&:H ·Äú&É*ã&ME*å&ø*ç&È*é&Éãõ:J þ  '++~ÖëæÆA2J 2I ##ñãÉÍ :þ ÈÍ3'ÉÍ�'Í 'ͪ'ÈÕåÅÍó3:H ·Âl'*w4y·ò_'æÁѱw#s#rÑÉÍö&~ö@æwÁáÑÉ>H¡Äî&yæøÄö&yÁÑ©æÄú&z¼Äú&{½Äú&ÑÉåÕÅë!P zÍ' {Í' ÁÑáÉyþØÍö&É:þ Ìö&ÉÍ�'Í 'ͪ'ÈÕåÅÍó3*w4~·òÑ'öOæÊ_'yæ|Áѱw#s#ráëÉ())4)€)Ó)Ó)Ó)Û)@*e*e*++$+L+Ò+Ò+g,ª,ª,ª,ª,ª,ª,ª,ADC:HL,BC/ED4A;ADC:HL,DE/ED5A;ADC:HL,HL/ED6A;ADC:HL,SP/ED7A;ADD:HL,BC/9;ADD:HL,DE/19;ADD:HL,HL/29;ADD:HL,SP/39;ADD:IX,BC/DD09;ADD:IX,DE/DD19;ADD:IX,IX/DD29;ADD:IX,SP/DD39;ADD:IY,BC/FD09;ADD:IY,DE/FD19;ADD:IY,IY/FD29;ADD:IY,SP/FD39;CCF/3F;CPD/EDA9;CPDR/EDB9;CPI/EDA1;CPIR/EDB1;CPL/2F;DAA/27;DEC:BC/B;DEC:DE/1B;DEC:HL/2B;DEC:IX/DD2B;DEC:IY/FD2B;DEC:SP/3B;DI/F3;EI/FB;EX:(SP),HL/E3;EX:(SP),IX/DDE3;EX:(SP),IY/FDE3;EX:AF,AF'/8;EX:DE,HL/EB;EXX/D9;HALT/76;INC:BC/3;INC:DE/13;INC:HL/23;INC:IX/DD23;INC:IY/FD23;INC:SP/33;IND/EDAA;INDR/EDBA;INI/EDA2;INIR/EDB2;JP:(HL)/E9;JP:(IX)/DDE9;JP:(IY)/FDE9;LD:(BC),A/2;LD:(DE),A/12;LD:A,(BC)/A;LD:A,(DE)/1A;LD:A,I/ED57;LD:A,R/ED5F;LD:I,A/ED47;LD:R,A/ED4F;LD:SP,HL/F9;LD:SP,IX/DDF9;LD:SP,IY/FDF9;LDD/EDA8;LDDR/EDB8;LDI/EDA0;LDIR/EDB0;NEG/ED44;NOP/0;OTDR/EDBB;OTIR/EDB3;OUTD/EDAB;OUTI/EDA3;POP:AF/F1;POP:BC/C1;POP:DE/D1;POP:HL/E1;POP:IX/DDE1;POP:IY/FDE1;PUSH:AF/F5;PUSH:BC/C5;PUSH:DE/D5;PUSH:HL/E5;PUSH:IX/DDE5;PUSH:IY/FDE5;RET:C/D8;RET:M/F8;RET:NC/D0;RET:NZ/C0;RET:P/F0;RET:PE/E8;RET:PO/E0;RET:Z/C8;RET/C9;RETI/ED4D;RETN/ED45;RLA/17;RLCA/7;RLD/ED6F;RRA/1F;RRCA/F;RRD/ED67;SBC:HL,BC/ED42;SBC:HL,DE/ED52;SBC:HL,HL/ED62;SBC:HL,SP/ED72;SCF/37;+:;BIT @’!CALLÍÃDJNZ7 IM í¢ IN ÛÛ JP ÃÃJR  OUT Ó!RES €’!SET À’!RLC À!RRC À!RL À!RR À!SLA À!SRA (À!SRL 8À!LD @ñ!ADC ˆu#ADD €u#AND  M#CP ¸M#OR °M#SBC ˜u#SUB �M#XOR ¨M#RST Çl!INC A!DEC A!ͪ-!¨.Õ². ~6#†-Ñþ,Êœ-Íð&ͪ-þ;Èþ!ØÍð&ÉÍê-:¨.þk·->&2¨.æþmÊÔ-þnÊÔ-:¨.æ Ìð&î Ìõ&ÉyæÀ}¬ü'|&"ª.·È<Ä'É!ME"ª."¨.þ(Â.>@2¨.Í.þ)ÈÍð&ÉÕÍä2:33þAÚ..Íú3yæ Ê..:¨.µö 2¨.áÕÑÕÍR.á|ºÂ>.}»ÊF.:¨.ö€2¨.:¨.G*ª.:©.OÉÅ̓xõÍ(2ñGåÅÍÄ.xÁŸÒq.åGÅÃU."Â.2Á.Ááy2©.33"ª.:©.OÉÁ:Á.¸Ê’.Ò.Åå"ª.:©.OÅ*Â.å:Á.GÅÃU.-:¨.þk&2¨.æþ*ÂÚ.þ*ÂÚ.!·0Éþ.Êý.O!C/~¹Âò.#F#~#foÉ·È####Ãä.ÕÍä2:73þ Â?/þ.Â?/!l/Õ33~·Ê>/®±O#Â/ѱÊ6/###Ã/ÁF#~#foÉÑÑÉ\ü0*“1/½1+á0-ê0&1^"1=\0>u0<†0NOT ü0RES 0MOD È1SHR F0SHL .0AND 1OR "1XOR 01EQ \0GT u0LT †0UGT –0ULT ©0HIGHÖ/LOW û/Áy·Äý&Í>1Áx±Äý&:©.±ö2©.Ö‡.2©.lgÇ.Áy·Äý&Í>1Áx±Äý&:©.±ö2©.Ö‡.2©.gÇ.Áy·Äý&Áx±Äý&Ç.ÁÍ…1ÁåÅáÁx·úÛ0x±Ê‡. )Ã<0ÁÍ…1åÁáx±Ê‡. |g}oÃM0ÁÍ…1ÁÍõ0}´Êo0!Ç.!ÿÿÇ.ÁÍ…1ÁÍõ0+|·òo0Ãi0ÁÍ…1ÁÍõ0|·úo0Ãi0ÁÍ…1ÁÍõ0Úi0|µÊi0Ão0ÁÍ…1ÁÍõ0Úo0Ãi0ÁÍ…1Á|·ü'ú‡.Õë!z³Ê×0ÅÍž1ÁÃÉ0ÑÇ.Íý&Ç.ÁÍ>1Á Ç.ÁÍO1ÁÍõ0Ç.y•oxœgÉÁy·Äý&Í…1Áx±Äý&}/o|/gÇ.ÁÍ…1Áx¤gy¥oÇ.ÁÍ…1Áx´gyµoÇ.ÁÍ…1Áx¬gy­oÇ.:©.æÊ|1yæÊ|1Ão1:©.æÊ|1þÊo1:©.©æÂo1:©.±æü2©.É:©.±æü2©.Íï&É:©.±O2©.É:©.±2©.OæÈÃo1ÁÍ…1ÁÍž1Ç.Õë!x·õü@3y°Ê³1 é1ñåÁü@3ÅáÑÉÁÍ…1ÁÍÖ1Ç.ÁÍ…1ÁÍÖ1*¿.Ç.}´Âå1Íý&!"¿.É|õ¨õx·ü@3ÅåÁᯰô@3Õÿÿ —´òû1Í@3 "¿.ÕÁÑñü@3Åá"ª.*¿.åÁñ·ü@3Åá"¿.*ª.ÉÍ93!þ'ÊK2þ(Êg2Í3Àþ:Ò‡2þ0ÒI3Ç2þ Øþ'Ê_2%$Äý&eoÃK2þ'ÊU2É:†2=ú�22†2ÍR.:†2<2†2þ)ÈÍð&É Íä2–2:33þ$ÊÑ&Íú3yæþʲ2yæ Äõ&>€¡Äÿ&>¡OÉåÕÅ!33¬.ÍÇ2ÁÑáÉ~# y°ÂÇ2É!Íç2þ:ÀÉ!Íç2É!93+6 Âé2Í93Í3Àþ:Ò3þ0Ð Ê 3w #Í93Í3ÀÃ3þ_ÐþZÐþ?Ò13þ9Ðþ0Ò13þ%Ðþ$Ðþ!É¿ÉK2þ(Êgþ`ØÖ É>‘O>˜GÉÕͶ3Í93þHʈ3ÑÕÍ¡3Í93þOʈ3þQʈ3ÑÕÍŽ3Í93þBʈ3ÑÕÍÖ3Í93þDʈ3Í3Ìý&33É!Í93Ö0ØþÐ)µoÑ3!Í93Ö0ØþÐ)))µoä3!Í93Ö0Øþ ÚÌ3Öþ ØþÐ))))µoù3!Í93Ö0Øþ Ð Õëo& Âé3ÑÃÙ3!Íý3É!33" 4*y4Õ"w433~·ÊO4¾Â+4#Â4*w4N#~#foÑÉ*w4 Ã4;4ø NOT ENOUGH MEMORY *y4Õ÷ÿÑ"w4"y4:€4<¼Ò54w#Âf46€#p#pÃ4‚4[5�4�4B C D E H L A AF BC DE HL SP IX IY I R NZ Z NC PO PE P M $ 5Ãè5ÍÍ8 ÍåÂÜ5*Ž#åÍ(:ÑÍ=9*Žå*ŽÑÍúÚ´5`i6ÿ#6ÿÃÓ5ÍÍ8 ÍåÂÓ5* Ž+" Ž*Ž+"Ž* Ž6Š*Ž+åÍ(:Ñ*Ž#åÍ(:ÑÃg5ÍÍ8ÍåÂ÷5à 6!å*Žå*þ�åÍË$ÑÑÑ|µÂ6à 6*Ž~#foåÍø ÑÃÔ4ÍÍ8ÍåÊ46!6åÍrcÑÍ�åÍ�†ÑÍ=9*Ž" Ž*Ž"Ž*þ�#~#foåÍø Ñ!åÍ(:Ñ!"Ž*þ�6!ÿÿÃv6ë!9ùëÁÉRead error or no EOFÅ!õÿ9ùDMÍœ:Í�åÍ�†Ñë`is#rz³Âº6!ñ8Íœ:Í’#ë! s#rÍ�6ÿÍ�~#foë! s#rÍ|0"2’Í� ë! s#r*þ�#~#fo"›�Íœ:*›�|µÊõ7Íœ:*›�åÍø Ñ!åÍ(:Ñ*Ž~#fo"›�*Žå*ŽÑÍúÒò7ÍÍ8ë! s! n}þŠÂ–7! ^#Vr+së6 Í�å! ~#foÑÍìÚ�7!åÍ� åÍ�åÍ%†ÑÑÑÍ� ë! s#r! 6 ! ^#Vr+sÕ! nëásÍ�å! ~#foÑÍìÚæ7Íœ:!åÍ� åÍ�åÍ%†ÑÑÑÍ� ë! s#r*Ž#åÍ(:ÑÃ'7Ã7! ^#Vr+së6Í�åÍ� ÑÍú€ëÍËåÍ�åÍ� ÑÍú|¢g}£o|µÊ<8!Ã?8!Ñë! s#rÍœ:Í�åÍ�åÍ� åÍ�åÍ%†ÑÑÑÑÍåÊs8Í…:Ãx8*þ�6Í�6Í�6Íœ:Í�åÍ�†Ñ*2’åÍ­1Ñ*2’åÍÒ3ÑÍœ:!ÿÿñ8ë! 9ùëÁÉÅ!9ùDMÍ�n&ÁÉÁÉÅ*Žn&ÁÉÁÉÅÍœ:!ù8å*€�&çÿå*�&+åÍÐwÑÑÑÁÉSwappin Documentation for ZASM Introduction ZASM is a Z80 macro assembler with syntax closely following RMAC and MAC. It assembles standard Z80 mnemonics into an Intel Hex format. The resulting file (which has a .HEX extension) can be translated to a .COM file with LOAD.COM (on your CP/M disk that you received with your Kaypro) if it ORG's at 100 (hex). If it ORG's elsewhere the .HEX file may be read into memory and manipulated with DDT.COM. Why Z80 The assembler you received with your Kaypro (ASM.COM) is an 8080 assembler. The Kaypro actually runs a Z80 c.p.u. The reason this is possible is that the Z80 actually runs all of the 8080 instructions but in addition there are more instructions unknown to the 8080. The extra instructions were designed for increased speed, easier programming, and more compact code. For this reason it is to your best advantage to program in Z80 code for the Kaypro. Z80 Mnemonics Z80 mnemonics are a great improvement to 8080. Thought was given to logical, universal mnemonics that are much easier to remember and use. I learned assembly language on the 8080 and resisted the change to Z80 at first. But after using Z80 mnemonics for a short time I became very unwilling to do anything with 8080 code. Now I run almost every 8080 program that comes in through a 8080 to Z80 translating program (XLATE2.COM). Even if you are writing programs for the 8080 it is still far easier to write in Z80 mnemonics. There is a special listing command that flags Z80- only instructions for this very reason (described later). Macros Macros are a way of writing subroutines in assembly language and then calling the subroutine by entering the 'macro name' into the source. The macro may be called as many times as necessary anywhere in the program. When the assembler is operated, the lines of source code that make up the macro will be inserted into the file by the assembler. Note that using a macro does not reduce the size of the object code that is produced since all the lines of code that make up the macro definition are assembled into the object file at assembly time. This is called expanding the macro. By using the *MACLIST ON option, the lines of code produced by the expansion of a macro are listed in the .PRN file. Then the code can be examined and at times optimized in certain locations. Assembler Syntax Components and General Form of Assembly Language Programs The structure of an assembly language program is more important to an Šassembler than the actual instructions you write. A program that would run beautifully can fail to assemble if the syntax is not correct. A program with no errors at assembly time is not guaranteed to run correctly ( or as expected ). The assemblers report of 0 errors means that it understood all of the instructions you entered, not that your program is logically correct. Fields Assemblers are almost always field oriented some to a greater degree than others. A field is a flexible position in the line of code with respect to the right margin. This assembler recognizes 4 fields in an assembly language source line. label operation operand comment The assembler knows when it has reached the end of a field when it sees a 'field delimiter'. This can be a space or a tab for this assembler though some require tabs so it is a good habit to always use tab characters as delimiters. Label Field A symbol is a word used to represent a number. Symbols that refer to addresses are called labels. The assignment of a number to a label can either be defined as the lines below TEN EQU 10 START EQU 100H or calculated by the assembler as an address for branching instructions. START: JP FINISH NOP NOP FINISH: JP START Also notice that the label is optional and is only for the programmers conveniance. Labels must appear in the label field. Some assemblers allow you to indent labels but this one won't. START EQU 100H START: JP FINISH Will give you a problem. The EQU must be in the operation field and the label in the label field. Most assemblers require that the undefined labels be terminated in a colon but this assembler does not require a colon for symbols in column 1. START JP FINISH Š will not generate an error but colons are another good habit and also make your code more readable. This assembler only examines the first six characters of any label or symbol so that if the following labels were used in the same program FINISH1 EQU 1000H FINISH2 EQU 2000H A 'D' error (duplicate symbols) would be generated. Operation and Operand Fields The operation field follows the label field and may either contain a Z80 op code mnemonic, an assembler directive (or pseudo op), or a macro call. Assembler directives and macros are described later in this file. This field will usally contain the mnemonic for a Z80 instruction. Some Z80 instructions only use this field while others contain an operand which will be located in the operand field. GOBACK: OR A RET Z LD A,0FFH RET The way Z80 mnemonics were designed, the number of nmenonics in the operation portion of instructions is kept to a minimum since the operands really distinguish the differences between similar instructions. The first line above is a good example of this. The operation is an 'OR' operation on the number in the accumulator (implied) with another register. It makes sense that the operand should be the register containing the other number in the 'OR' operation. In Z80 assembly language this is the case. The first line OR's the accumulator with the accumualator (used to see if the accumulator contains a 0). Notice that the second line uses the operand field to contain the condition for a conditional jump (in this case the zero flag). The third line uses the operand field to contain both the target register for a load and the number to load. The last line is an unconditional return which uses the same operator (RET) as the conditional return but does not use the operand field because there are no conditons to place there. This structure makes Z80 programs much more readable than 8080 programs as well as making the instructions easier to remember. The following is the same code written with 8080 mnemonics. Notice the different philosophy on the use of the fields. GOBACK: ORA RETZ MVI A,0FFH RET Also the LD command in the Z80 is used for all data moves while 8080 users must remember a different mnemonic for different types of moves. 8080 Z80 Š MOV H,A LD H,A MVI H,00 LD H,00 LXI H,0000 LD HL,0000 The Comment Field Comments are not limited to the comment field and can actually be the entire line. All assemblers recognize the semicolon as the beginning of a comment and most ignore the rest of the line. For compatability between assemblers it is a good to begin comments with a semicolon. But for this assembler the following methods of inserting comments are good syntax. 1. Beginning a line with an '*' in column one causes the assembler to ignore therest of the line except if one of the assembler commands (described below) immediately follows the asterisk (no embedded spaces). 2. A semicolon will cause the assembler to consider everything following it to be considered a comment. 3. The first blank encountered following the beginning of the operand field will cause the assembler to consider the rest of the line to be considered a comment. ****************************************** ;An adventure in Comments * A short tale START: JP FINISH ; finish this story NOP ASM can't handle this FINISH: RET Thats all folks Would assemble with no errors. Comments do not appear in the object code. Numbers and Bases The assembler will accept numbers in HEX (base 16) BINARY (base 2) or DECIMAL. Hex numbers must end with an H and binary numbers must end in a B. Decimal numbers should have no suffix letter. When a HEX digit begins with a letter, the letter should be preceded with a 0. LD A,0F3H OR 01001000B LD HL,4000H+28 Commanding the Assembler The primary responsibility of the assembler is to translate Z80 mnemonics into object code. The assembler also recognizes certain commands and directives that the programmer can use to manipulate the assembler's output. ŠThese are often referred to as 'pseudo-ops'. This assembler requires these pseudo-ops to be in upper case. A description of these commands follows: ORG ; Sets the origin of the code or section of code. Actually ; it sets the reference number that the assembler uses to ; generate addresses for labels and instructions. ; could be a number or a previously defined symbol. ; e.g. ORG 0 ; ORG START END ; Determines the end of an assembly language program. ; if present describes the first executable instruction of ; the program. DW wordlist DEFW wordlist ; Both of these have identical meanings. In assembly language ; programs, 8 bit values are called bytes and 16 bit ; values are called words. Addresses are assembled with the ; most significant byte (MSB) following the least significant ; byte (LSB) because this is how the microprocessor handles ; these values. The DW pseudo-op allows us to describe these ; values in the way we are used to (MSB first) and still ; assemble correctly for the processor. ; DW 8000H ; will assemble the same as ; DB 00H ; DB 80H ; ; If more than one word is to follow a DW following values ; should be seperated by commas ; e.g. DW 8000H,0F000H,0000H ; The wordlist can also be symbols ; e.g. START: JP FINISH ; DW START,FINISH ; FINISH: JP START DDB wordlist ; This pseudo-op is a way of assembling 16 bit values with ; the MSB first (opposite of DW). ; DDB 8000H ; will assemble the same as ; DB 80H ; DB 00H DB bytelist DEFB bytelist DEFM bytelist DATA bytelist ; These four pseudo-ops have identical meanings. The bytelist ; can be one byte or multiple bytes seperated with commas. ; The bytes can be any mix of symbols, ascii characters in ; quotes, or numbers on the same line. This is familiar ; code in Kaypro programs: ; Š ;ESC EQU 1BH ;CLRSCR EQU 1AH ;CRLF DDB 0D0AH ; ; ORG 100H ; ; LD DE,MES ; LD C,9 ; CALL 5 ; RET ; ;MES: DB CLRSCR ; DB ESC,'=',12+20H,12+20H ; DB '*Your Message Here *',CRLF ; DB '*Or Here*','$' ; ; END ; ; If you've been waiting for an example to enter assemble ; and run, try this one out. Just enter it (with out the » semicolonó oæ course)¬ uså filå typå .AZM¬ anä ; assemble it using the same conventions as with ASM.COM. ; (For example: ; A>ZASM YOURFILE.BBZ, i.e., ; Input YOURFILE.AZM from Drive B:, output .HEX file to ; Drive B:, and suppress the .PRN file.) ; ; The program clears the screen, positions the cursor at ; row 12 column 12 and prints the message using the BDOS ; function 9 (print string). ; ; The symbol CLRSCR is defined by an EQU to the hex code to ; clear the screen on the Kaypro (^Z). ; ; The cursor positioning sequence on the Kaypro consists of ; the two lead-in characters (escape and an equals sign) and ; then the row+20H and the column+20H. ; ; Since the next bytes are just a carriage return, line feed ; pair the second part of the message will appear at the ; left side of the screen. We could include extra DB's to ; position the cursor anywhere on the screen if we like. ; ; BDOS function 9 (summoned by loading a 9 in the C register ; and calling 0005H) prints the characters it finds at the ; address in the DE registers until it sees a '$'. DS n DEFS n ; Reserve data space ( n bytes ). This is used to position ; allocate or label data storage space in a program. n is ; a number describing the number of bytes reserved. ; DS 16 ; Reserves 16 bytes. The next instruction will be located ; 16 bytes from the location counter when the DS was ; encountered. Š label EQU ; ; The EQU sets the label equal to the expression. The ; label should not be terminated with a colon when used ; with an EQU pseudo-op. The label can be any symbol ; (byte or word) and the a number in any of the ; following forms: ; SWEET EQU 16 ;decimal ; SWEET EQU 10H ;hex ; SWEET EQU 00010000B ;binary ; ; With this assembler the EQU must be located in the ; operation field. ; A label defined with an EQU cannot be redefined later ; in the program. label DEFL ; ; This assigns the value of the to the label like ; the EQU pseudo-op but a label defined with a DEFL can ; be redefined later in the program. *INCLUDE *INCLUDE ; This pseudo-op causes the assembler to stop assembling ; lines in the file it is presently in and read in the ; file . It then begins assembling lines in this ; included file until it reaches the end of the file when ; it returns to the original file and resumes assembling ; lines in it once more. The can be any CPM ; filename.ext though if the extent is left off it looks ; for the given filename with an extent of .LIB. The asterisk ; must appear in column 1 with the word INCLUDE immediately ; following with no embedded spaces. ; ;*INCLUDE DRIVER.AZM ; will begin assembly on ; the file DRIVER.AZM ;*INCLUDE Z80MACRO ; will begin assembly on ; the file Z80MACRO.LIB ; Conditional Assembly Pseudo-Ops............................................ IF ELSE ENDIF Conditional assembly is a way of writing a single program so that it can be assembled different ways or with different options by only changing a couple of lines of codes. When the assembler encounters an IF pseudo-op it evaluates the symbol . IF is non-zero it assembles the following lines until it reaches an ELSE or an ENDIF. If is 0 the lines are ignored until the assembler encounters an ELSE or an ENDIF. If the ELSE is encounter the assembler begins assembling lines again. The ENDIF Š pseudo-op causes the assembler to resume assembling all lines. You can not have an IF without an ENDIF. Any of these pseudo-ops must appear in the operation field. TRUE EQU 0FFH FALSE EQU 0 KPRO2 EQU TRUE KPRO10 EQU FALSE IF KPRO2 BITPRT EQU 1CH ELSE BITPRT EQU 14H ENDIF Operators.................................................................. Operators allow the programmer to make the assembler do arithmetic and logical operations. They are usually used to manipulate operands or generate symbols. Some of them are used to create tests for conditional assembly. There should be no embedded spaces when using these operators as the first blank encountered terminates the operand field. The operands may be symbols or numbers in any of the bases. The operators supported by this assembler are: Arithmetic Operators + ; arithmetic addition. - ; arithmetic subtraction * ; arithmetic multiplication / ; arithmetic division (truncating the result) Logical Operators (Bit Manipulation) & ( or .AND. ) ; logical AND operation ^ ( or .OR. ) ; logical OR operation .XOR. ; logical exclusive OR operation \ ( or .NOT. ) ; logical inversion .SHR. ; shift left operand to right by right operand Š .SHL. ; shift left operand to left by right operand .HIGH. ; byte value is assigned the high byte of a ; 16 bit value .LOW. ; byte value is assigned the low byte of a 16 ; bit value Conditional Assembly Operators ( return TRUE or FALSE to IF ) = ( or .EQU. ) ; logical equivalence > ( or .GT. ) ; greater than .UGT. ; unsigned greater than < ( or .LT. ) ; less than .ULT. ; unsigned less than Listing Options Pseudo-Ops................................................. There are a number of listing options. All of these options only effect the print file (.PRN). The options include some for debugging as well as some for the actual format of the file on the page. The .PRN file is the basic tool assembly language programmers have for examining the output of the assembler. The pseudo-ops beginning with an asterisk must begin in column 1. *EJECT ( or EJEC ) ; The next line of the listing should be placed at the top ; of the next page. *HEADING ; Place the text ( following this command ) on the top of ; each page. Usually used to date the listing file. TITLE 'text' ; Place the text in the quotation marks (either double or ; single on the top of each page in the listing file. SPAC n ; Leave n blank lines in the listing. Used to leave white ; space in the file with out using a page break. *LIST ON *LIST OFF ; Turn the listing on or off. This is usually used to omit ; long comments or certain sections from the .PRN file. *MACLIST ON *MACLIST OFF ; Turn the expansion of macros on or off. Seeing how the ; macros are being expanded is handy for optimizing code ; but can waste paper when that is no longer the area of Š ; interest. LIST options NLIST options ; These pseudo-ops allow you to turn any of the supported ; listing file options on (LIST) or off (NLIST) without ; changing the other options. Both of these pseudo-ops ; must be followed with one or more of the following option ; letters. If these pseudo-ops is used some options are ; on by default ( marked with (on) in the following list. ; ; A ; List all bytes in DB, DW, DDB, etc. Otherwise ; ; only the bytes that can fit in one line are ; ; included in the listing ( others are implied ). ; B ; Place symbol table into object file. ; G ; Place system generated symbols into object files ; I (on); List lines of conditional code following a false ; ; conditional. If off only the code actually ; ; assembled is listed. ; M (on); Expand macros in listing files ; O (on); Produce an object module. That is show the bytes ; ; being generated by the assembler otherwise just ; ; the source and (optionally) macro expansions. ; R ; use absolute displacement for JR and DJNZ ; S (on); List source code in listing file ; T (on); List symbol table in listing file ; X ; Generate and list cross references in listing file ; Z ; Generate an error for Z80 only opcodes. Allows you ; ; to write in Z80 mnemonics for an 8080 processor. ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Error Reporting ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: When the assembler is unable to understand what you are instructing it to do it generates an error message. These are almost always due to typo's or bad form. It displays the error code below and the line the error was found on to the console and also displays the error codes in the listing file. D ; Duplicate symbol definition. You will see this error ; message if you do any of the following: ; Use the same symbol twice. ; FORMATX ; FORMATC ; will generate an error (only 6 significant ; characters). ; Upper and lower case symbols with the same letters ; FORMAT: ; format: ; are identical to the assembler. ; Assigning a different value to a symbol that was ; previously defined with a EQU pseudo-op. ; If you are going to reassign use DEFL. E ; Relocation error. I believe this occurs if the assembler ; cannot reassign an address as expected. Š F ; Format Error. You will see this if you break any of the ; rules regarding field use and macro format. K ; Keyword error. This means you tried to use one of the ; assemblers reserved words or pseudo-ops as a symbol. ; ORG: JP END ; NOP ; END: JP ORG ; is in very bad taste. L ; Label error. The attempt to assign a value to a lable was ; unsuccessful. Also remember that labels do not end in a ; colon when preceding EQU. ; START: EQU 100H ; is bad news ; START EQU 100H ; is perfect M ; Missing label. The symbol you are using was never defined. N ; Macro nesting error. Macros can be nested (that is a macro ; can call another macro) but if the nesting gets to deep ; the assembler will quit and give you one of these. Also, ; you can only call macros that were previously defined. O ; Op code error. If you see this, look in the operation and ; operand fields. Consult the mnemonic table. People ; switching over from 8080 will see a few of these. P ; Phase error. A 2 pass assembler builds a symbol table on ; the first pass and generates the object code on the second. ; If a number that it calculates for a symbol on the first ; pass does not agree with a number it generates in the ; pass this error is shown check the symbols in the line ; the error appeared. Q ; Questionable operand. Actually theres no question about it ; it is a bad operand. Typo's give you these as well as ; blowing op code format. Usally easy to find your mistake. S ; Syntax error. You broke one of the syntax rules described ; above. T ; Symbol table full. Not much you can do with this except ; pare down the code. U ; Undefined symbol. You used a symbol but forgot to define ; it in with an EQU. V ; Value error. Usually means you are trying to do a 16 ; bit operation with an 8 bit number or the other way ; around. Macros ŠThe macro is a powerful method of writing assembly language programs. It makes it possible to write assembly language programs in a way that resembles higher level languages. In fact by creating a library of macros you are in essence creating your own language, and your own compiler. Often times in assembly language (particularly writing for CP/M) each program contains source lines that are used again and again in other programs. By using macros the routines only need to be written once and then may be called in any program. The best thing about a macro library is that only the macros that are called produce object code. So there is no penalty in having a macro library that is large and complete even if you are only going to call one macro. Macros have a form that is unique and must be followed closely for correct results. The general form of a macro is name MACRO #parameter1,#parameter2,.... instruction instruction instruction . . . ENDM The name is the symbol that will be used to invoke the macro. MACRO is a keyword that will indicate to the assembler that a macro is being defined. The parameters always must begin with a '#' sign in macros and they are seperated by commas. The instruction can be Z80 instructions, or any of the assembler commands listed above incuding conditionals. The instruction can also be another macro call (called nested macros) but only if the nested macro has been already defined. The ENDM keyword tells the assembler that it has reached the end of the code that must be assembled when this macro is called. Do not use a colon behind the macro name. The previous message program example can be rewritten to look like this with macros. ORG 100H *INCLUDE Z80MACRO BDOS PRNSTR,MES RET MES: DB ESC,'=',12+20H,12+20H DB '*Your message here*' DDB CRLF DB '*Or here*' END With the following macro library called Z80MACRO.LIB ;Call Bdos function #FUNCT using paramater contained in #DE Š ESC EQU 1BH ; ascii escape CRLF EQU 0D0AH ; ascii carriage return line feed PRNSTR EQU 9 BDOS MACRO #FUNCT,#DE LD C,#FUNCT ; FUNCTION NUMBER GOES TO C LD DE,#DE ; GET PARAMETER CALL 5 ; CALL BDOS ENDM We could also rewrite the cursor positioning sequence into a macro. Note how just this small example can save us time in future programs. Also, the macro library is a great place to keep frequently used symbols like ESC and CRLF. But what about using address symbols in macros? How can we avoid the 'D' error if we call the macro more than once. The other keyword unique to macros is LOCAL. This makes the assembler generate its own unique label every time the macro is expanded in a program. Following the word LOCAL ( which must be on the second line of the macro ) are the symbols we want the compiler to generate unique labels for. These symbols must also be proceded with a '#' sign. AJUMP MACRO LOCAL #ADR_Z,#BACK OR A JR Z,#ADR_Z LD A,40H JR #BACK #ADR_Z: LD A,04H #BACK: LD DE,0 ENDM The macro itself is not really useful but it is correct and shows the use of local labels.