IMD 1.16: 8/06/2007 13:56:21 ebmmug.012 eastbay micromate users' group rformat, trackrd, xlate3a, iotest, dasm2, empty, wipe, nulu & sd-95 disk issued: february 7, 1985 TRACKRD MACaTRACKRD COMEMPTY COMEMPTY MAC XLATE3A MAC XLATE3A MAC'XLATE3A COM(MAKE SUB DASM2 COML-./01DASM2 MAC23456789:;<=>?@ADASM2 MACBCDEFGHIJKLMNOPQDASM2 MACYRSTUVWDASMZLG MACXYZ[\]^_`DIRZ DOCaDIRZ COMbcDIRZ MACdefghijklIOTEST MACmIOTEST COMnWIPE COM*RFORMAT COMtKAYPRO2 MACsKAYPRO2 FMTpSUBMIT COMRFORMAT MACOyz{|}8INSSSD MACq8INSSSD FMTrNULU COMp!"#$%&'NULU DOC()xEBMDIR12TXT~NULU DOC?OTHERSYSLSTlDASM2 DOCn-EBMMUG BAKuvRFORMAT DOC3RFORMATASUBRFORMATFSUBSD95 DOC+SD95 COM ,oEPSON MAC EPSON FMTDISK DAT-EBMMUG 012wTITLE TRKRD12.MAC 02-01-85 21:00:00 .Z80 ASEG ORG 100H ; LD HL,(6) ; GET STACK SPACE LD SP,HL WRANS: ; WRONG ANS GIVE INSTRUCTIONS CALL PRINT DB 'DISK TRACK READ PROGRAM BY RICH HARRINGTON ' DB 'VER 1.0 08-06-84',0AH,0DH DB 'VER 1.1 11-12-84 REMOVED FILE WRITE ADDED CLOCK SPEED',0DH,0AH DB 'VER 1.2 01-18-85 ADDED SECTOR READ FILE WRITE',0DH,0AH DB 0DH,0AH,9,9,9,9,'OPTIONS',0DH,0AH,0AH DB 'LOG DISK',9,'L DRIVE NAME',0DH,0AH DB 'SET TRACK',9,'T TRACK NUMBER DECIMAL',0DH,0AH DB 'CLOCK RATE',9,'C 5 or 8',0DH,0AH DB 'SET SIDE',9,'H 0 or 1',0DH,0AH DB 'SET DENSITY',9,'Z S or D',0DH,0AH DB 'SET SECTOR',9,'S SECTOR NUMBER IN DECIMAL',0DH,0AH DB 'SET SECTOR SIZE',9,'U 0=128 1=256 2=512 3=1024',0DH,0AH DB 'WRITE SECTOR',9,'W d:filename',0DH,0AH DB 'READ TRACK',9,'R',0DH,0AH DB 'READ SECTOR',9,'P',0DH,0AH DB 'DUMP TRACK',9,'D MUST HAVE READ FIRST',0DH,0AH DB 9,9,' ^X TO STOP DUMP',0DH,0AH DB 'EXIT PROGRAM',9,'^C EXIT TO CP/M',0DH,0AH,0 PROMPT: CALL PRINT DB 0DH,0AH,'$',0 CALL INBUF AND 5FH ; UPER ONLY CP 'L' JP Z,SELDRV CP 'T' JP Z,SETRK CP 'R' JP Z,TRKRD CP 'D' JP Z,DUMPTK CP 'C' JP Z,CLOCK CP 'H' JP Z,HEAD CP 'Z' ; RAN OUT OF LETERS JP Z,SETDEN ; SET DENSITY CP 'P' ; READ SECTOR JP Z,SECRD CP 'U' ; SET SECTOR SIZE JP Z,SECZE CP 'W' ; WRITE SECTOR TO FILE JP Z,WRSECT CP 'S' ; SET SECTOR NUMBER JP Z,SECTN JP NZ,WRANS ; CLOCK: CALL SPACE JP C,WRANS CP '5' ; 5 INCH = 1MC JR NZ,CK8 XOR A LD (CLKRATE),A JP PROMPT CK8: CP '8' ; 8 " = 2MC JP NZ,WRANS LD (CLKRATE),A ; MUST BE '8' JP PROMPT ; SELDRV: CALL SPACE JP C,WRANS CP 'A' ; DRIVE RANGE A-D JP C,WRANS CP 'E' JP NC,WRANS LD (DRIVE),A JP PROMPT ; SETRK: CALL FFDEC JP C,WRANS LD (TRACK),A JP PROMPT ; HEAD: CALL SPACE JP C,WRANS CALL NUMBS JP C,WRANS CP 2 JP NC,WRANS LD (SIDE),A JP PROMPT ; SETDEN: CALL SPACE JP C,WRANS AND 5FH ; ALL CAPS CP 'S' ; SINGLE DEN JR Z,SETSD CP 'D' JP*WDISK TRACK READ PROGRAM BY RICH HARRINGTON VER 1.0 08-06-84 VER 1.1 11-12-84 REMOVED FILE WRITE ADDED CLOCK SPEED VER 1.2 01-18-85 ADDED SECTOR READ FILE WRITE OPTIONS LOG DISK L DRIVE NAME SET TRACK T TRACK NUMBER DECIMAL CLOCK RATE C 5 or 8 SET SIDE H 0 or 1 SET DENSITY Z S or D SET SECTOR S SECTOR NUMBER IN DECIMAL SET SECTOR SIZE U 0=128 1=256 2=512 3=1024 WRITE SECTOR W d:filename READ TRACK R READ SECTOR P DUMP TRACK D MUST HAVE READ FIRST ^X TO STOP DUMP EXIT PROGRAM ^C EXIT TO CP/M W $_LuTʋRuDCYHʗZʮPʤUXWSi5 282AE2͔22_S(D>@2* R:( =(=(,*"!"( # ͔2͔2͖>Ӏ͓:Ӄ>Ӏ͓P  ۀ8:ӂ:Ӂ͖P?2WREAD ERROR(S) TRACK :e SECTOR ::8_( e CRC g(e RECORD NOT FOUND o(e RECORD TYPE WRETRY? (Y) Yä:Ӏ> = ! kۀ ۀ ۀ ۀ ۀ( ۀmӄ"ۀ:AO>( O:y(O: ӄ><(#  =  >:o&6 "B @ B ( @*+"7*~#"*+"  ^#wf!B } 7ÜB M M§ÏBB:A0W 0_+yOW  zl{̓̓{e| !I K>._{<RWZl B GB ( (OxGx0:?0d8d 8 0_>0(0 NZ,WRANS XOR A JR LDDEN SETSD: LD A,40H LDDEN: LD (DENS),A JP PROMPT DUMPTK: XOR A LD HL,(LASTHL) LD DE,RAM SBC HL,DE EX DE,HL ; HL=START DE=LENGTH LD C,0 ; LOOP WHEN L = 0 CALL DUMPA JP PROMPT ; WRSECT: ; PUT SECTOR TO CPM FILE LD A,(SECSIZ) OR A LD E,1 JR Z,SETSS INC E DEC A JR Z,SETSS RLC E ; MULT BY 2 DEC A JR Z,SETSS RLC E ; = 8 SETSS: LD C,2CH ; DOS SET SECTOR SIZE CALL 5 OR A JP NZ,WRANS ; CALL SPACE ; HAVE TO HAVE A FILE NAME JP C,WRANS LD HL,(IBUFPT) ; ADDRESS OF FILE NAME LD (PFCB),HL LD HL,FCB ; WRITE FILE CTRL BLOCK LD (PFCB+2),HL LD DE,PFCB LD C,98H ; PARSE FILENAME CALL 5 ; LD DE,FCB LD C,0FH ; OPEN CALL 5 OR A JR Z,GOPEN ; FILE NOW OPEN ; LD DE,FCB LD C,16H ; MAKE FILE CALL 5 OR A JP NZ,WRANS ; CANT MAKE FILE ; GOPEN: LD DE,FCB ; COMPUTE FILE SIZE LD C,23H ; GET TO END OF FILE CALL 5 ; TO APPEND TO END OR A JP NZ,WRANS ; MOADD: LD DE,RAM LD C,1AH ; SET DMA CALL 5 ;  LD DE,FCB LD C,15H ; WRITE SEQ CALL 5 OR A JP NZ,WRANS ; CLOSE: LD DE,FCB LD C,10H CALL 5 OR A JP NZ,WRANS JP PROMPT ; ; SECZE: ; SET SECTOR SIZE FOR WRITE FILE CALL FFDEC JP C,WRANS CP 4 JP NC,WRANS ; OUT OF RANGE LD (SECSIZ),A JP PROMPT SECTN: ; GET SECTOR NUMBER CALL FFDEC JP C,WRANS LD (SECTOR),A JP PROMPT ; TRKRD: CALL TONDSK LD A,3 ; RESTORE COMMAND OUT (DCTRL),A CALL DBUSY LD A,(TRACK) OUT (DDATA),A LD A,13H ; SEEK COMMAND OUT (DCTRL),A CALL DBUSY LD C,0E4H ; READ TRACK COMMAND CALL READ JP PROMPT ; ; DBUSY: LD BC,8000H ; DELAY DBUSY1: EX (SP),HL EX (SP),HL DEC C JR NZ,DBUSY1 DEC B JR NZ,DBUSY1 DBUSY2: IN A,(DCTRL) RRA JR C,DBUSY2 RET ; SECRD: LD A,(SECTOR) OUT (DSECT),A LD A,(TRACK) OUT (DTRK),A CALL TONDSK LD C,88H ; READ SECTOR COMMAND CALL READ AND 3FH ; CK FOR ERRORS JP Z,PROMPT ; NO ERRORS LD (ERRSTO),A ; CALL PRINT DB 'READ ERROR(S) TRACK ',0 LD A,(TRACK) CALL PRTDEC ; PRINT TRACK NUMBER CALL PTNCR DB ' SECTOR ',0 LD A,(SECTOR) CALL PRTDEC ; PRINT SECTOR NUMBER ; LD A,(ERRSTO) AND 38H ; CK FOR CRC RNF RECTYPE JP Z,PROMPT PTERR: ; ONLY PRINT CRC - RECORD NOT FOUND - RECORD FAULT ; BIT 3,A ; CRC JR Z,RNF PUSH AF CALL PTNCR DB ' CRC ',0 POP AF RNF: BIT 4,A ; RECORD NOT FOUND JR Z,RECTYP PUSH AF CALL PTNCR DB ' RECORD NOT FOUND ',0 POP AF RECTYP: BIT 5,A ; RECORD TYPE JR Z,ASK CALL PTNCR DB ' RECORD TYPE ',0 ASK: CALL PRINT DB 'RETRY? (Y) ',0 CALL INBUF CP 'Y' JP NZ,PROMPT JP SECRD ; READ SECTOR ; ; READ: LD A,(SIDE) ; SELECT HEAD ADD A,A ; BIT 1 OR C ; COMMAND TYPE DI OUT (DCTRL),A ; DO COMMAND ; LD A,10 DELAY: DEC A JR NZ,DELAY ; LD C,DDATA ; DISK DATA ADDRESS LD D,3 ; MASK LD E,2 LD HL,RAM JP RDS1 RDS: INI ; GET DATA RDS1: IN A,(DSTAT) RDS2: AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND D JR Z,RDONE AND E JR NZ,RDS IN A,(DSTAT) JP RDS2 ; ; RDONE: XOR A OUT (DRCTRL),A ; TURN OFF DRIVE LD (LASTHL),HL IN A,(DSTAT) EI RET ; ; TURN ON DISK TONDSK: LD A,(DRIVE) SUB 'A' LD C,A OR A LD A,1 JR Z,GETCLK ; DRIVE = A DRLOOP: RLA DEC C JR NZ,DRLOOP GETCLK: LD C,A LD A,(CLKRATE) OR A LD A,C JR Z,GETDEN OR 80H GETDEN: LD C,A LD A,(DENS) OR C OR 20H ; READY BIT OUT (DRCTRL),A ; LD A,60 DELAYL: LD BC,9000 ; 30 MS APPROX DELAYB: DEC C JR NZ,DELAYB DEC B JR NZ,DELAYB DEC A JR NZ,DELAYL RET ; CLKRATE: DB 0 DRIVE: DB 0 ERRSTO: DB 0 TRACK: DB 0 SECSIZ: DB 0 SECTOR: DB 0 SIDE: DB 0 DENS: DB 0 LASTHL: DW RAM CHPTR: DW RAM PFCB: DW 0 DW FCB FCB: DS 36 ; RAM EQU 2000H ; MEMORY START DTRK EQU 081H ; TRACK MICROMATE FDC DSECT EQU 82H ; SECTOR MICROMATE FDC DCTRL EQU 080H ; CTRL STATUS DDATA EQU 083H ; DATA DRCTRL EQU 084H ; DRIVE SEL MOTOR CTRL DSTAT EQU 080H ; DISK CTRL STATUS ; TITLE RLIB1 RICH LIBRARY-1 INBUFFER 4-2-83 20:59:00 INBUF: LD C,0AH ; READ CON: FOR LINE LD DE,IBUFS LD A,0FFH ; READ 255 CHAR LD (DE),A CALL 5 LD A,(IBUFS+1) ; GET NUM OF CHAR REC LD L,A LD H,0 LD DE,IBUFS+2 ADD HL,DE ; POINT TO LAST CHAR+1 LD (HL),0DH LD A,(DE) ; GET FIRST CHAR EX DE,HL LD (IBUFPT),HL RET IBUFS: DEFS 257 IBUFPT: DEFW IBUFS+2 ; ; ---------------------------------------------- ; SPACE: CALL ITOP CP 0DH ; CR JP Z,SETCR CP ' ' JP NZ,SPACE SPACE1: CALL ITOP CP ' ' JP Z,SPACE1 CP 0DH ; CR JP Z,SETCR PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL AND A ; CLEAR CARRY FLAG RET ; DID NOT FIND CR SETCR: SCF RET ; ; ---------------------------------- ; ; THIS ROUTINE GETS DATEM OUT OF THE ; THE INPUT BUFFER AND LOADS IT INTO 'A' ; ; ---------------------------------- ; ITOP: PUSH HL LD HL,(IBUFPT) LD A,(HL) INC HL LD (IBUFPT),HL POP HL RET ; ; ; ------------------------------------ UNTOP: PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL RET ; ; ----------------------------------- ; ; ; ----------------------------------- ; ; PRINT THE STRING. THE STRING ENDS ; WITH 00H. THE STRING IS IN THE CODE ; JUST AFTER THE CALL TO THIS ROUTINE ; ; ----------------------------------- ; PRINT: LD E,0DH ; CR LD C,2 CALL 5 LD E,0AH ; LF LD C,2 CALL 5 PTNCR: EX (SP),HL ; POINT TO MESSAGE PR1: LD E,(HL) INC HL XOR A CP E ; DONE IF 0 JP Z,PR2 LD C,2 PUSH HL CALL 5 POP HL JP PR1 PR2: EX (SP),HL RET ; TITLE RLIB2 RICH LIBRARY-2 HEX 4-2-83 17:30:00 ; ; -------------------------------------- ; ; THIS ROUTINE LOADS HL FROM THE TTY ; REG USED A B HL ; REG DISTROYED A HL ; ; -------------------------------------- ; NLDHL: CALL SPACE RET C ; LDPHL: LD HL ,0 CALL ITOP CP ' ' JP Z,LDPHL CP 0DH ; CR SCF RET Z JP LHL1 ; LHL2: CALL ITOP CP ' ' JP Z,UNTOP CP 0DH ; CR JP Z,UNTOP LHL1: CALL HEX_4 RET C PUSH BC ; SAVE HEX RLA RLA RLA RLA LD B,4 MTHL: RLA RL L RL H DEC B JP NZ,MTHL POP BC JP LHL2 ; ; ; ; ----------------------------------- ; ; THIS ROUTINE GETS TWO HEX CH FROM ; THE INPUT AND CONVERTS THEM TO ONE BYTE ; IN A ; ; ----------------------------------- ; HEX_M: CALL ITOP HEX_M1: CALL HEX_4 RET C ; ERROR RET RLCA RLCA RLCA RLCA PUSH AF CALL ITOP CALL HEX_4 EX (SP),HL ; GET MS4B INTO H JP C,ERRETH OR H ; MAKE IT 8 BITS ; AND CLEAR CARRY ERRETH: POP HL RET ; ; ----------------------------- ; ; HEX_M RETURNS WITH CARRY SET ; IF ERROR RET. ; HEX_4: CP ':' ; ONE PAST 9 JP C,OUTLO ; IF LESS THAN 9 SUB 30 ; AND RET. CARRY SET IF ; L LESS THAN ZERO SUB 'A' RET C ; RET IF BETWEEN 9 AND A ADD A,0FAH ; IF OVERFLOW THEN NOT A-F RET C SUB 0C0H ; CORRECT A-F +30H OUTLO: SUB 30H RET ; CARRY SET IF LESS THAN 0 ; ; ---------------------------------------- ; ; THIS ROUTINE RETURNS TWO HEX CHARACTERS ; FROM THE REG A IN REG DE. ; ; ------------------------------------------ ; M_HEX: PUSH AF RRCA RRCA RRCA RRCA CALL OHB ; MS4B FIRST LD D,A POP AF OHB: AND 0FH CP 0AH ; IS IT NUMBER JP C,NOADD ADD A,7 NOADD: ADD A,30H LD E,A RET TITLE RLIB6 RICH LIBRARY-6 DUMP WITH ADDRESS 08-06-84 22:01:00 ; ; DUMP ROUTINE DUMPS HEX AND ASCII STARTING ADDRESS ; IN HL LENGTH IN DE END OF LINE FLAG IN C ; DUMPA: PUSH HL ADD HL,DE ; FIND END POP DE ; NOW POINTS TO START DEC HL LD A,C AND 0FH LD C,A STLINE: PUSH BC PUSH DE PUSH HL CALL PRINT NOP LD C,0BH ; CON STATUS CALL 5 CP 01 JR NZ,NOSTOP LD C,1 ; GET CON: CALL 5 CP 18H ; ^X STOP DUMP NOSTOP: POP HL POP DE POP BC RET Z ; LD A,D ; GET ADDRESS CALL PRHEX LD A,E CALL PRHEXS NXTHEX: LD A,(DE) ; GET DATA CALL PRHEXS ; RET HEX IN DE INC DE LD A,E AND 0FH ; SEE IF END OF LINE CP C JP NZ,NXTHEX ; ; START TO PRINT ASCII ; PUSH HL PUSH \(, \: FILE EXISTS $NO DIR SPACE $ `PO %!LA!A$bort (Y/N)? ͿY ɷ  ?ALLMACCOMCTLSYMDOC. Good luck Rich Harrington 31 Blade Way Walnut Creek, CA 94595 TITLE EMPTY.MAC 08-26-84 23:54:00 .Z80 ASEG ORG 100H ; LD C,13 ; DISK RESET CALL 5 LD DE,5CH LD C,0FH ; TRY OPEN IF IT WORKS CALL 5 ; THEN FILE EXISTS CP 0FFH ; FF = NO FILE JR Z,MAKE LD DE,MESS LD C,9 JP 5 ; EXIT MAKE: LD DE,5CH LD C,16H ; MAKE FILE CALL 5 CP 0FFH ; NO SPACE RET NZ LD DE,MESS1 ; NO DIR SPACE LD C,9 JP 5 MESS: DB 'FILE EXISTS',0DH,0AH,'$' MESS1: DB 'NO DIR SPACE',0dh,0ah,'$' END AH,0 JP GETCMD ; ; AN ERROR OCCURRED DURING A WRITE RECORD ATTEMPT ; WRTERR: CALL PSTRNG DEFB '++ Write Error ++',0DH,0AH,0 ; ; WRITE INTO THE DMA BUFFER AND WRITE TO DISK WHEN IT FILLS ; CHAR TO WRITE PASSED IN A ; WRTFILE: PUSH HL LD HL,(DMAPTR) ;GET PTR LD (HL),A ;STORE NEXT CHAR INC L ;PT TO NEXT LD (DMAPTR),HL ;SET NEXT DMA POP HL RET NZ ;IF L REACHED ZERO, BUFFER WAS FULL; RET IF NZ PUSH BC ;WRITE RECORD TO DISK AND REINIT DMA PTR PUSH DE PUSH HL LD DE,FCB ;DOTITLE XLATE3 12-31-83 21:00:00 ; ; Program: XLATE3 ; Author: Richard Conn ; Derivation: Disassembled XLATE.COM of Cromemco's CDOS and Modified ; into XLATE2; XLATE.COM was Version 2.40 ; Version: 1.1 ; Date: 21 July 82 ; Previous Versions: 1.0 (3 May 82) ; ; XLATE2 inputs an Intel-Standard 8080 Assembly Language Source File ; and converts it into a Zilog-Standard Z80 Assembly Language Source File. ; VERS EQU 11 ;VERSION NUMBER ; MODIFIED BY R. J. HARRINGTON 415 932 4331 TO ; NOT PLACE : AFTER LABLES IN EQU STATEMENTS & ; TO PROCESS JPMR AND JRXX. RENAMED TO XLATE3 ; ; USE ZILOG MNEMONICS AND ABSOLUTE SEGMENTS ; .Z80 ASEG ; ; CP/M CONSTANTS ; WBOOT EQU 0 BDOS EQU 5 DEFFCB EQU 5CH FCB2 EQU 6CH ; ; START OF PROGRAM ; ORG 100H CALL HCHECK ;CHECK FOR HELP REQUEST LD SP,OBUFLPOS ;INIT STACK PTR CALL INIT ;INIT THE PROGRAM LOOP: CALL BUILDLINE ; GET LINE FROM SOURCE AND PLACE IT ; IN INLN WITH 0 TERMINATION CALL PROCESSOPS ;CONVERT THE OP CODES JR LOOP ; ; MAIN PROCESSING MODULE ; PROCESSOPS: CALL GETOP ; IF OPCODE RET NZ (ILTOP) PTR TO ; FIRST CH OF OPCODE. (INLNPTR) = ; NEXT NON WHITE AFTER OPCODE JP Z,FLUSHLINE ;IF NONE, FLUSH ; LD HL,OCS1 ;PROCESS OP CODE SET 1 LD BC,10 ;10 CHARS/DUAL ENTRY (OLD OP = 5, NEW OP = 5) CALL CMPOP ;SCAN FOR MATCH IN INLN BUFFER JP Z,DOOCS1 ;PROCESS IF FOUND ; LD HL,OCS2 ;PROCESS OP CODE SET 2 LD BC,10 ;10 CHARS/DUAL ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DOOCS2 ;PROCESS ; LD HL,OCS3 ;PROCESS OP CODE SET 3 LD BC,10 ;10 CHARS/DUAL ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DOOCS3 ;PROCESS ; LD HL,OCS4 ;PROCESS (EXTENDED RET) OP CODE SET 4 LD BC,5 ;5 CHARS/SINGLE ENTRY CALL CMPOP ;SCAN FOR MATCH CALL Z,DOOCS4 ;CONVERT INTO STANDARD RET FORMS IF MATCH ; LD HL,RETS ;PROCESS (NORMAL RET) OP CODE SET 5 LD BC,5 ;5 CHARS/SINGLE ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DORETS ;PROCESS ; LD HL,CALLS ;PROCESS (CALL) OP CODE SET 6 LD BC,5 ;5 CHARS/SINGLE ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DOCALLS ;PROCESS ; LD HL,JMPS ;PROCESS (JMP) OP CODE SET 7 LD BC,5 ;5 CHARS/SINGLE ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DOJMPS ;PROCESS ; LD HL,JMPR ; PROCESS (JRXX) LD BC,5 CALL CMPOP JP Z,DOJMPR LD HL,OCS8 ;PROCESS OP CODE SET 8 LD BC,12 ;12 CHARS/DUAL ENTRY CALL CMPOP ;SCAN FOR MATCH JP Z,DOOCS8 ;PROCESS ; ; NO MATCH IN OP CODE SETS -- PASS TARGET OP CODE AS IS ; LD B,5 ;5 CHARS IN TARGET LD HL,TARGOP ;POINT TO TARGET POPS1: LD A,(HL) ;GET CHAR CP ' ' ;END OF OP? JR Z,POPS2 ;OUTPUT TAB CHAR IF SO CP 9 ;END OF OP? JR Z,POPS2 ;OUTPUT TAB CHAR IF SO CALL DOUTCHAR ;OUTPUT OP CHAR INC HL ;PT TO NEXT DJNZ POPS1 ;CONTINUE FOR 5 CHARS MAX POPS2: LD A,9 ;END OP WITH CALL DOUTCHAR ;OUTPUT TO DISK ; ; COPY REST OF INPUT LINE AS-IS ; COPYARGS: LD HL,(INLNPTR) ;PT TO NEXT CHAR CARGS1: LD C,0 CARGS2: LD A,(HL) ;GET CHAR CP ' ' ;END OF OPERANDS? JR Z,CARGS4 ;SKIP WHITE SPACE AND OUTPUT REST IF SO CP 9 ;END OF OPERANDS? JR Z,CARGS4 ;SKIP WHITE SPACE AND OUTPUT REST IF SO CP 0DH ;END OF LINE? JR Z,FLUSHLINE ;FLUSH IF SO CP ';' ;BEGINNING OF COMMENT = END OF OPERANDS? JR Z,CARGS5 ;COPY REST IF SO CP '''' ;SINGLE QUOTE? JR NZ,CARGS3 DEC C JR Z,CARGS3 LD C,1 CARGS3: CALL DOUTCHAR ;OUTPUT CHAR IN A TO DISK INC HL ;PT TO NEXT JR CARGS2 CARGS4: PUSH HL CALL SKIPWHITE ;SKIP TO NEXT NON-WHITE CHAR POP HL CP 0DH ;END OF LINE? JR Z,FLUSHLINE ;FLUSH IF SO CP ';' ;COMMENT? JR Z,CARGS5 ;PROCESS COMMENT IF SO CALL OUTWHITE ;OUTPUT A TAB JR CARGS2 ;RESTART PROCESSING CARGS5: DEC C INC C JR NZ,CARGS3 CALL SKIPWHITE LD B,41 CARGS6: LD A,(OBUFLPOS) ;CHECK POSITION IN OUTPUT LINE CP B JR NC,FLUSHLINE DEC A ;BACK UP IN OUTPUT LINE AND 0F8H ;ARTIFICALLY TAB ADD A,9 CP B JR Z,FLUSHLINE JR C,CARGS7 LD A,' ' JR CARGS8 CARGS7: LD A,9 CARGS8: CALL DOUTCHAR JR CARGS6 ; ; WRITE REST OF INLN TO DISK ; FLUSHLINE: CALL OUTSTR LD A,1 ;RESET POSITION COUNTER LD (OBUFLPOS),A RET ; ; PRINT PDOT FOR EVERY TEN LINES ; PDOT: LD A,(LCOUNT) ;GET LINE COUNT DEC A ;COUNT DOWN LD (LCOUNT),A ;PUT LINE COUNT RET NZ ;DONE IF NOT ZERO LD A,'.' ;PRINT PDOT CALL PCHAR LD A,10 ;RESET COUNT LD (LCOUNT),A LD A,(NLCOUNT) ;NEW LINE? DEC A LD (NLCOUNT),A RET NZ LD DE,CRLFSTR ;PRINT NEW LINE CALL PMSG LD A,60 ;RESET COUNTER LD (NLCOUNT),A RET ; ; OUTPUT STRING PTED TO BY HL TO DISK (STRING ENDS IN 0) ; OUTSTR: LD A,(HL) ;GET CHAR AND A ;DONE? RET Z ;RET IF SO CALL DOUTCHAR INC HL ;PT TO NEXT CHAR JR OUTSTR ; ; OUTPUT ALL AND CHARS FOUND UNTIL A NON- AND NON- ; ENCOUNTERED ; OUTWHITE: LD A,(HL) ;GET CHAR CP ' ' ;? JR Z,OW1 ;OUTPUT IT CP 9 ;? RET NZ ;DONE IF NOT OW1: CALL DOUTCHAR ;OUTPUT CHAR IN A TO DISK INC HL ;PT TO NEXT CHAR JR OUTWHITE ;CONTINUE ; ; EXTRACT OP CODE FOR INPUT LINE AND PLACE IN BUFFER ; GETOP: LD HL,INLN ;PT TO INPUT LINE LD A,(HL) ;GET 1ST CHAR IN LINE CP ' ' ;NO LABEL? JR Z,GOP3 ;SKIP TO OP CODE CP 9 ;NO LABEL? JR Z,GOP3 ;SKIP TO OP CODE CP ';' ;COMMENT? RET Z ;DONE IF SO ; ; LINE BEGINS WITH A LABEL -- PROCESS IT ; GOP1: LD C,0 ;SET LABEL CHAR CNT GOP2: LD A,(HL) ;GET NEXT CHAR OF LABEL INC HL CP ':' ;END OF LABEL? JR Z,GOP5 CP 9 ;END OF LABEL? JR Z,GOP5 CP 0DH ;END OF LABEL AND NO FURTHER PROCESSING? JR Z,GOP5 CP ';' ;END OF LABEL AND NO FURTHER PROCESSING? JR Z,GOP5 CP ' ' ;END OF LABEL? JR Z,GOP5 CALL DOUTCHAR ;OUTPUT LABEL CHAR TO DISK INC C ;INCR LABEL CHAR CNT JR GOP2 ; ; NO LABEL -- SKIP TO OP CODE ; GOP3: CALL SKIPWHITE ;SKIP OVER WHITE SPACE PUSH HL CALL FTODLM CP ':' ; CK FOR LABEL NOT AT POSITION 1 POP HL JR Z,GOP1 JR GOP7 ; ; END OF LABEL BY ':' CHAR ; GOP4: CALL DOUTCHAR ;OUTPUT THE ':' LD A,(HL) ;CHECK FOR EOL CP 0DH ;DON'T DOUBLE NEW LINE (SKIP NEW LINE AFTER GOP6) JR Z,GOP8 ;JUST CONTINUE PROCESSING WITH NO TAB JR GOP6 ;NOT NEW LINE, SO PROCESS FOR NEW LINE IF LONG LABEL ; ; OUTPUT ':' AT END OF LABEL ; GOP5: ; IF OPCODE IS EQU THEN DO NOT ; PLACE : AFTER THE LABLE ; MODIFIED BY R. J. HARRINGTON ; 6-11-83 PUSH HL CALL SKIPWHITE CP 0DH JP Z,GOP5A CP 'E' JP NZ,GOP5A INC HL LD A,(HL) CP 'Q' JP NZ,GOP5A INC HL LD A,(HL) CP 'U' JP NZ,GOP5A POP HL JP GOP7 GOP5A: POP HL LD A,':' ;OUTPUT THE ':' CALL DOUTCHAR ; ; SEE IF LABEL IS LESS THAN 7 CHARS LONG ; IF <7, THEN TERMINATE WITH ; IF >6, THEN NEW LINE AND ; GOP6: ; LD A,C ;GET LABEL CHAR CNT ; CP 7 ;LESS THAN 7? ; JR C,GOP7 ;JUST TAB IF LESS THAN 7 LD A,0DH ; CALL DOUTCHAR LD A,0AH ; CALL DOUTCHAR ; ; OUTPUT AFTER LABEL TO DISK ; GOP7: LD A,9 ; OUT TO OPCODE FOR OUTPUT CALL DOUTCHAR ; ; SKIP TO OP CODE FIELD AND EXTRACT IT IF PRESENT ; GOP8: CALL SKIPWHITE ;SKIP TO OP CODE FIELD LD A,(HL) ;GET FIRST NON-WHITE CHAR CP ';' ;NO OP CODE IF COMMENT RET Z ;DONE IF COMMENT CP 0DH ;NO OP CODE IF EOL RET Z ;DONE IF EOL LD (ILTOP),HL ;SAVE PTR TO TARGET OP CODE LD B,5 ;5 CHARS MAX IN OP CODE LD DE,TARGOP ;COPY TO TARGOP BUFFER CALL COPYTODELIM ;COPY UNTIL DELIMITER ENCOUNTERED CALL SKIPWHITE ;SKIP OVER WHITE SPACE WHICH FOLLOWS LD (INLNPTR),HL ;SAVE PTR SUB A INC A ;A=1 AND NZ RET ; ; COMPARE OP CODE PTED TO BY HL WITH TARGET OP CODE; RET WITH Z SET IF ; MATCH, NZ IF NO MATCH ; CMPOP: LD A,(HL) ;NO OP CODE TO COMPARE? AND A ;A=0 IF SO JR Z,CMPOP1 ;FAILURE IF SO PUSH BC LD B,5 ;COMPARE 5 BYTES LD DE,TARGOP ;PT TO TARGET OP CODE CALL COMPHLDE ;COMPARE POP BC RET Z ;DONE IF MATCH ADD HL,BC ;PT TO NEXT OP CODE IN TABLE JR CMPOP CMPOP1: INC A ;A=1 AND NZ RET ; ; PROCESS OP CODES IN SET 1 -- OPERAND AND COMMENTS FIELDS ARE UNCHANGED ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DOOCS1: CALL OUTNEWOP5CH ;OUTPUT NEW OP CODE JP COPYARGS ;COPY OPERAND AND COMMENT FIELDS AS-IS ; ; OUTPUT 2ND 5-CHAR-MAX OP CODE FIELD PTED TO BY HL TO DISK AND END IN ; OUTNEWOP5CH: LD BC,5 ;SKIP FIRST 5 CHARS ADD HL,BC ;PT TO 2ND 5-CHAR FIELD ; ; ENTRY PT TO COPY 5-CHAR-MAX FIELD PTED TO BY HL ; ONO5C0: LD B,5 ONO5C1: LD A,(HL) ;GET NEXT CHAR CP ' ' ;? JR Z,ONO5C2 ;DONE IF SO CP 9 ;? JR Z,ONO5C2 ;DONE IF SO CALL DOUTCHAR ;OUTPUT CHAR TO DISK INC HL ;PT TO NEXT DJNZ ONO5C1 ;COUNT DOWN ONO5C2: LD A,9 ;OUTPUT TO DISK JP DOUTCHAR ;OUTPUT TO DISK ; ; PROCESS OP CODES IN SET 2 - OPERAND IS 1 REG OR '(HL)' ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DOOCS2: CALL OUTNEWOP5CH ;OUTPUT NEW 5-CHAR-MAX OP CODE LD HL,(INLNPTR) ;PT TO OPERAND FIELD ATHLCHECK: LD A,(HL) ;CHECK FOR '(HL)' REFERENCE CP 'M' ;TAKES THE FORM OF 'M' IN 8080 MNEMONICS JP NZ,CARGS1 ;OUTPUT NORMALLY IF NOT INC HL ;PT TO CHAR AFTER PUSH HL ;SAVE PTR LD HL,ATHL ;OUTPUT '(HL)' CALL OUTSTR ;OUTPUT TO DISK POP HL ;GET PTR JP CARGS1 ;PROCESS REST OF LINE NORMALLY ATHL: DB '(HL)',0 ; ; PROCESS OP CODES IN SET 3 - OPERAND IS BC, DE, HL, OR PSW REG PAIR ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DOOCS3: CALL OUTNEWOP5CH ;OUTPUT NEW OP CODE RPCHECK: LD HL,(INLNPTR) ;PT TO OPERAND FIELD PUSH HL ;SAVE PTR LD A,(HL) ;GET OPERAND CP 'B' ;FOR BC? JR Z,PRBC ;OUTPUT BC IF SO CP 'D' ;FOR DE? JR Z,PRDE ;OUTPUT DE IF SO CP 'H' ;FOR HL? JR Z,PRHL ;OUTPUT HL IF SO CP 'P' ;FOR PSW? JR NZ,L0309 ;OUTPUT WHATEVER'S THERE IF NOT INC HL ;MAKE SURE IT IS 'PSW' LD A,(HL) CP 'S' JR NZ,L0309 ;OUTPUT WHAT'S THERE IF NOT INC HL LD A,(HL) CP 'W' JR NZ,L0309 ;OUTPUT WHAT'S THERE IF NOT POP HL ;IT IS 'PSW', SO CLEAR STACK AND PT INC HL ; ... TO CHAR AFTER 'PSW' INC HL PUSH HL LD HL,AFSTR ;PRINT 'AF' JR PRREGPAIR ;DO PRINT PRBC: LD HL,BCSTR ;PRINT 'BC' JR PRREGPAIR PRDE: LD HL,DESTR ;PRINT 'DE' JR PRREGPAIR PRHL: LD HL,HLSTR ;PRINT 'HL' PRREGPAIR: CALL OUTSTR ;PRINT STRING PTED TO BY HL AND MAKE HL ON STACK POP HL ; ... PT TO NEXT CHAR INC HL PUSH HL L0309: POP HL ;PRINT WHATEVER OTHER OPERAND IT IS JP CARGS1 ;PRINT THE OPERAND AFSTR: DB 'AF',0 BCSTR: DB 'BC',0 DESTR: DB 'DE',0 HLSTR: DB 'HL',0 ; ; PROCESS OP CODE SET 4 - EQ, NE, LT, GE RETS, CALLS, AND JMPS ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DOOCS4: LD A,(TARGOP+1) ;LOOK AT 2ND LETTER OF TARGET OP LD HL,ZFLG ;PREP FOR ZERO CP 'E' ;IF 'E', THEN FORM IS 'EQ' JR Z,ZCPUT ;CHANGE FORM TO 'XZ ', WHERE X=R,C,J LD HL,NZFLG ;PREP FOR NOT ZERO CP 'N' ;IF 'N', THEN FORM IS 'NE' JR Z,ZCPUT LD HL,CFLG ;PREP FOR CARRY CP 'L' ;IF 'L', THEN FORM IS 'LT' JR Z,ZCPUT LD HL,NCFLG ;FORM MUST BE 'GE', SO NO CARRY ZCPUT: LD A,(HL) ;GET FIRST CHAR LD (TARGOP+1),A ;STORE IT INC HL ;PT TO 2ND CHAR LD A,(HL) ;GET IT LD (TARGOP+2),A ;STORE IT RET ZFLG: DB 'Z ' NZFLG: DB 'NZ' CFLG: DB 'C ' NCFLG: DB 'NC' ; ; PROCESS OP CODE SET 5 -- RETURN FORMS ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DORETS: LD HL,RETSTR ;PT TO STR TO COPY CALL COPY5 ;COPY WITH OPTIONAL COND JP COPYARGS ;COPY REST OF OPERAND FIELD AND COMMENTS AS-IS RETSTR: DB 'RET ',0 DOCALLS: LD HL,CALLSTR JR CP5WITHCOMMA ;COPY AND FOLLOW WITH COMMA CALLSTR: DB 'CALL ',0 DOJMPR: LD HL,JRSTR CALL ONO5C0 ; PLACE JR LD A,(TARGOP+2) CALL DOUTCHAR LD A,(TARGOP+3) CP ' ' JR Z,CP5WC1 CALL DOUTCHAR JR CP5WC1 JRSTR: DB 'JR ',0 DOJMPS: LD HL,JPSTR ;FALL THRU TO DO JP FORMS ; ; COPY STRING AT HL FOLLOWED BY CONDITION CODE, A COMMA, AND REST OF ; OPERAND FIELD ; CP5WITHCOMMA: CALL COPY5 CP5WC1: LD A,',' CALL DOUTCHAR ;OUTPUT COMMA TO DISK JP COPYARGS ;COPY REST OF OPERAND FIELD JPSTR: DB 'JP ',0 ; ; COPY 5-CHAR-MAX STRING PTED TO BY HL FOLLOWED BY AND 2-CHAR COND ; COPY5: CALL ONO5C0 ;COPY 5-CHAR-MAX STRING PTED TO BY HL LD A,(TARGOP+1) ;OUTPUT FIRST CHAR OF COND CALL DOUTCHAR LD A,(TARGOP+2) ;OUTPUT 2ND CHAR OF COND IF NOT CP ' ' RET Z JP DOUTCHAR ; ; PROCESS OP CODE SET 8 - THIS TABLE CONTAINS THE SERVICE ROUTINE ADR ; EMBEDDED IN IT AFTER EACH OP CODE PAIR; ; HL PTS TO OP CODE TABLE ENTRY, 2ND ELT OF WHICH IS TO BE OUTPUT TO DISK ; DOOCS8: PUSH HL ;SAVE PTR TO OLD (1ST) OP LD BC,10 ;PT TO ADR OF SERVICE ROUTINE ADD HL,BC LD C,(HL) ;BC=ROUTINE ADDRESS INC HL LD B,(HL) POP HL ;PT TO OLD (1ST) OP PUSH BC ;ROUTINE ADDRESS ON STACK RET ;JMP TO ROUTINE ; ; THIS CONVERTS 'DAD ' TO 'ADD HL,' ; DO81: CALL OUTNEWOP5CH ;OUTPUT 'ADD' LD HL,DO81S ;OUTPUT 'HL,' CALL OUTSTR JP RPCHECK ;OUTPUT DO81S: DB 'HL,',0 ; ; THIS CONVERTS 'ADD R' TO 'ADD A,R' ; AND 'ADC R' TO 'ADC A,R' ; AND 'SBC R' TO 'SBC A,R' ; DO82: CALL OUTNEWOP5CH ;OUTPUT THE 'IN' LD HL,DO82S ;OUTPUT 'A,' JP DO8F1 ;04C7H DO82S: DB 'A,',0 ; ; THIS CONVERTS 'LDA ' TO 'LD A,()' ; AND 'IN ' TO 'IN A,()' ; DO83: CALL OUTNEWOP5CH LD HL,DO83S JR OUTCLP DO83S: DB 'A,(',0 ; ; THIS CONVERTS 'LDAX ' TO 'LD A,()' ; DO84: CALL OUTNEWOP5CH ;OUTPUT OP CODE LD HL,(INLNPTR) ;PT TO OPERAND LD A,(HL) ;GET 1ST CHAR OF OPERAND CP 'B' ;BC REG PAIR? JR Z,DO841 ;PROCESS IT CP 'D' ;DE REG PAIR? JR Z,DO842 ;PROCESS IT JP CARGS1 ;SOMETHING FUNNY -- PROCESS NORMALLY DO841: LD HL,DO841S JP DO8D3 DO842: LD HL,DO842S JP DO8D3 DO841S: DB 'A,(BC)',0 DO842S: DB 'A,(DE)',0 ; ; THIS CONVERTS 'LHLD ' TO 'LD HL,()' ; DO85: CALL OUTNEWOP5CH LD HL,DO85S ; ; THIS OUTPUTS THE STRING PTED TO BY HL, OUTPUTS THE REST OF THE OPERAND ; FIELD, OUTPUTS A CLOSING ')', AND OUTPUTS THE REST OF THE INPUT LINE ; OUTCLP: CALL OUTSTR ;01F9H CALL OUTOPER ;04D5H LD A,')' ;29H CALL DOUTCHAR ;0631H JP CARGS1 ;0198H DO85S: DB 'HL,(',0 ; ; THIS CONVERTS 'MOV R,R' TO 'LD R,R' ; DO86: CALL OUTNEWOP5CH LD HL,(INLNPTR) ;PT TO 1ST CHAR OF OPERAND FIELD LD A,(HL) ;GET IT CP 'M' ;CONVERT 'M' TO '(HL)'? JR NZ,DO862 ;NO CONVERSION NECESSARY PUSH HL LD HL,ATHL ;OUTPUT '(HL)' CALL OUTSTR POP HL ; ; OUTPUT ',' FOLLOWED BY '(HL)' OR 'R' ; DO861: INC HL ;OUTPUT COMMA AND THEN 2ND R LD A,(HL) ;GET COMMA CALL DOUTCHAR INC HL ;PT TO 2ND R JP ATHLCHECK ;OUTPUT '(HL)' OR R ; ; OUTPUT 'R,' FOLLOWED BY '(HL)' OR 'R' ; DO862: CALL DOUTCHAR ;OUTPUT 'R' JR DO861 ;OUTPUT REST ; ; THIS CONVERTS 'PCHL' TO 'JP(HL)' ; DO88: CALL OUTNEWOP5CH LD HL,ATHL ;OUTPUT THE '(HL)' JP DO8F1 ; ; THIS CONVERTS 'RST N' TO 'RST NNH' ; DO89: CALL OUTNEWOP5CH LD HL,DO89S JP DO8F1 DO89S: DB '8*',0 ;MULTIPLY RESTART NUMBER BY 8 FOR Z80 ; ; THIS CONVERTS 'SHLD ' TO 'LD (),HL' ; DO8A: CALL OUTNEWOP5CH LD A,'(' ;OUTPUT OPENING '(' CALL DOUTCHAR CALL OUTOPER ;OUTPUT OPERAND PUSH HL LD HL,DO8AS ;OUTPUT '),HL' JR DO8C2 DO8AS: DB '),HL',0 ; ; THIS CONVERTS 'SPHL' TO 'LD SP,HL' ; DO8B: CALL OUTNEWOP5CH LD HL,DO8BS JR DO8F1 DO8BS: DB 'SP,HL',0 ; ; THIS CONVERTS 'STA ' TO 'LD (),A' ; AND 'OUT ' TO 'OUT (),A' ; DO8C: CALL OUTNEWOP5CH LD A,'(' ;OUTPUT '(' ; ; THIS OUTPUTS '),A' ; DO8C1: CALL DOUTCHAR ;OUTPUT CHAR IN A CALL OUTOPER ;OUTPUT OPERAND FIELD PUSH HL LD HL,DO8CS ;OUTPUT '),A' DO8C2: CALL OUTSTR ;OUTPUT STRING PTED TO BY HL POP HL ;CLEAR STACK JP CARGS1 ;OUTPUT REST OF INPUT LINE DO8CS: DB '),A',0 ; ; THIS CONVERTS 'STAX ' TO 'LD (),A' ; DO8D: CALL OUTNEWOP5CH LD HL,(INLNPTR) ;PT TO 1ST CHAR OF OPERAND LD A,(HL) ;GET IT CP 'B' ;BC REG PAIR? JR Z,DO8D1 ;OUTPUT IT IF SO CP 'D' ;DE REG PAIR? JR Z,DO8D2 ;OUTPUT IT IF SO JP CARGS1 ;ELSE, OUTPUT WHAT'S THERE DO8D1: LD HL,DO8D1S JR DO8D3 DO8D2: LD HL,DO8D2S DO8D3: CALL OUTSTR LD HL,(INLNPTR) ;PT TO AFTER 'B' OR 'D' INC HL JP CARGS1 DO8D1S: DB '(BC),A',0 DO8D2S: DB '(DE),A',0 ; ; THIS CONVERTS 'XCHG' TO 'EX DE,HL' ; DO8E: CALL OUTNEWOP5CH LD HL,DO8ES JR DO8F1 DO8ES: DB 'DE,HL',0 ; ; THIS CONVERTS 'XTHL' TO 'EX (SP),HL' ; DO8F: CALL OUTNEWOP5CH LD HL,DO8FS DO8F1: CALL OUTSTR ;01F9H JP COPYARGS ;0195H DO8FS: DB '(SP),HL',0 ; ; OUTPUT REST OF OPERAND FIELD UP TO WHITE SPACE BEFORE ENDING COMMENT ; OR END OF LINE ; OUTOPER: LD HL,(INLNPTR) ;PT TO NEXT CHAR IN INPUT LINE BUFFER OOL1: LD A,(HL) ;GET NEXT CHAR CP ';' ;BEGINNING OF COMMENT? JR Z,OOL2 ;CHECK FOR REST OF OPERAND CP 0DH ;END OF LINE? JR Z,OOL2 ;CHECK FOR REST OF OPERAND INC HL ;CONTINUE UNTIL EITHER COMMENT OR EOL FOUND JR OOL1 OOL2: DEC HL ;BACK UP (OVER WHITE SPACE?) LD A,(HL) ;GET CHAR CP ' ' ;WHITE? JR Z,OOL2 ;CONTINUE BACKING CP 9 ;WHITE? JR Z,OOL2 ;CONTINUE BACKING INC HL ;PT TO FIRST WHITE CHAR EX DE,HL ;SAVE PTR IN DE LD HL,(INLNPTR) ;PT TO START OF SCAN OOL3: LD A,D ;ALL OF OPERAND FIELD FLUSHED? CP H ;CHECK FOR PTR MATCH JR NZ,OOL4 ;NO MATCH, SO FLUSH NEXT CHAR LD A,E ;REST OF MATCH? CP L  RET Z ;DONE IF ALL MATCH OOL4: LD A,(HL) ;OUTPUT OPERAND CHAR TO DISK CALL DOUTCHAR INC HL ;PT TO NEXT OPERAND CHAR JR OOL3 ;CONTINUE UNTIL OPERAND ALL OUT ; ; THE FOLLOWING TURNS ON VARIOUS MESSAGES FOR MANUAL TRANSLATION ; DO91: LD A,9 ;ENDIFS LD (XLT1ON),A ;STORE TO ENABLE JR DO941 DO92: LD A,9 ;INCLUDES LD (XLT2ON),A JR DO941 DO93: LD A,9 ;LISTS LD (XLT3ON),A JR DO941 DO94: LD A,9 ;MACROS LD (XLT4ON),A DO941: CALL OUTNEWOP5CH ;OUTPUT NEW CODE LD A,0DH ;TURN ON PRINTED ERR MESSAGE LD (ERR5ON),A ;TURN ON FLAG BY STARTING WITH JP COPYARGS ;COPY REST OF CODE ; ; THE FOLLOWING CHECKS FOR THE SPECIFICATION OF A HELP OPTION AND ; PRINTS THE HELP MESSAGE IF SO ; HCHECK: LD A,(DEFFCB+1) ;GET FIRST CHAR OF FILE NAME CP '/' ;OPTION? RET NZ ;NO HELP REQUESTED IF NOT OPTION LD DE,HEADER ;PRINT PROGRAM BANNER CALL PMSG LD DE,HMSG1 ;PRINT HELP MESSAGE CALL PMSG LD C,1 ;GET ANY CHAR CALL BDOS LD DE,HMSG2 ;PRINT REST OF HELP MESSAGE CALL PMSG POP DE ;CLEAR STACK RET ;RETURN TO CP/M ; ; THE FOLLOWING INITIALIZES THE PROGRAM FOR EXECUTION ; INIT: LD DE,HEADER ;PRINT PROGRAM BANNER CALL PMSG LD A,10 ;INIT PDOT PRINT (LINE) COUNT LD (LCOUNT),A LD A,60 ;INIT NEW LINE PRINT COUNT LD (NLCOUNT),A LD A,1 ;INITIALIZE OUTPUT BUFFER LINE POSITION LD (OBUFLPOS),A CALL MAKEFNS ;SET UP FILE NAMES CALL OPENIN ;OPEN INPUT FILE CALL OPENOUT ;OPEN OUTPUT FILE LD HL,FHDR ;OUTPUT '.Z80' AND 'ASEG' TO MAC FILE INIT1: LD A,(HL) ;GET CHAR OR A ;DONE? JR Z,INIT2 CALL DOUTCHAR ;OUTPUT TO DISK INC HL ;PT TO NEXT JR INIT1 INIT2: LD A,(FCB2+1) ;2ND FILE NAME PRESENT? CP ' ' ; IF NOT RET NZ ;DONE IF SO XOR A ;A=0 LD (OCS4),A ;TURN OFF WEIRD OP CODE SCAN (REQ, ETC) LD (NOXLT),A ;TURN OFF SCAN FOR ENT, NAME, RAM, ROG LD (NOXLT2),A ;TURN OFF SCAN FOR IFC, ICL, MAC, LST RET ; ; SET UP FILE NAMES ; MAKEFNS: LD HL,DEFFCB ;COPY INPUT FILE NAME FROM COMMAND LD DE,FCBASM ;INTO THIS FCB FOR USE LD BC,9 ;9 BYTES LDIR ;COPY LD A,(HL) ;FILE TYPE SPECIFIED? CP ' ' ;NONE IF JR Z,MFN1 LD BC,3 ;3 MORE BYTES LDIR MFN1: LD HL,FCB2+1 ;2ND FILE SPECIFIED? LD A,(HL) ;GET FIRST BYTE OF FILE NAME DEC HL ;PT TO FIRST BYTE OF FCB CP ' ' ;NO 2ND FILE NAME? JR NZ,MFN2 ;SKIP RELOAD OF HL IF THERE IS A 2ND FILE NAME LD HL,DEFFCB ;COPY FILE NAME INTO OUTPUT FCB MFN2: LD DE,FCBZ80 ;OUTPUT FCB LD BC,9 ;9 BYTES LDIR ;COPY LD HL,FCB2+9 ;PT TO FILE TYPE LD A,(HL) ;CHECK FOR A FILE TYPE CP ' ' ;NONE IF JR Z,MFN3 LD BC,3 ;THERE IS ONE, SO COPY IT OVER LDIR MFN3: LD DE,PRFNM1 ;PRINT PART 1 OF FILE NAME MESSAGE CALL PMSG LD HL,FCBASM ;PRINT NAME OF SOURCE FILE CALL PRFNAME LD DE,PRFNM2 ;PRINT PART 2 OF FILE NAME MESSAGE CALL PMSG LD HL,FCBZ80 ;PRINT NAME OF DESTINATION FILE CALL PRFNAME LD DE,CRLFSTR ;END LINE CALL PMSG RET ; ; PRINT FILE NAME MESSAGE ; PRFNAME: LD A,(HL) ;GET DISK NUMBER ADD A,'@' ;ADD IN ASCII BIAS CALL PCHAR LD A,':' ;PRINT COLON CALL PCHAR INC HL ;PT TO FIRST CHAR OF FILE NAME LD B,8 ;8 CHARS CALL PRFNC LD A,'.' ;DOT CALL PCHAR LD B,3 ;3 CHARS CALL PRFNC RET PRFNC: LD A,(HL) ;GET NEXT CHAR INC HL ;PT TO NEXT CALL PCHAR ;PRINT CHAR DJNZ PRFNC RET ; ; OPEN INPUT FILE FOR PROCESSING ; OPENIN: LD DE,FCBASM ;OPEN FILE FOR INPUT LD C,0FH CALL BDOS CP 0FFH ;ERROR? JR Z,OIERR ;ABORT WITH ERROR MESSAGE IF SO LD A,80H ;INIT CHAR COUNT FOR BUFFER LD (IBUFCNT),A RET OIERR: LD DE,ERR2 ;INPUT FILE ERROR MESSAGE JP ENDERR ;ABORT ; ; OPEN FILE FOR OUTPUT ; OPENOUT: LD DE,FCBZ80 ;OPEN OUTPUT FILE LD C,0FH CALL BDOS CP 0FFH ;ERROR? JR NZ,OOERR2 ;ABORT IF NO ERROR (OVERWRITE OLD FILE) OPENO1: LD DE,FCBZ80 ;ELSE CREATE OUTPUT FILE LD C,16H CALL BDOS CP 0FFH ;ERROR? JR Z,OOERR1 LD DE,FCBZ80 ;NOW OPEN OUTPUT FILE (REDUNDANT WITH MAKE) LD C,0FH CALL BDOS LD A,80H ;INIT COUNT OF BYTES REMAINING LD (OBUFBACKCNT),A ;SET COUNT LD HL,OBUF ;INIT ADDRESS OF NEXT BYTE LD (OBUFPTR),HL ;SET PTR RET OOERR1: LD DE,ERR3 ;DISK FULL JP ENDERR ;ABORT ERROR OOERR2: LD DE,ERR4 ;ATTEMPT TO OVERWRITE EXISTING FILE CALL PMSG LD C,1 ;GET RESPONSE CALL BDOS CALL CAPS ;CAPITALIZE CP 'Y' ;CONTINUE IF YES LD DE,ERR4A ;PREP FOR ABORT JP NZ,ENDERR ;ABORT ERROR LD DE,CRLFSTR ;NEW LINE CALL PMSG LD DE,FCBZ80 ;DELETE OLD FILE LD C,19 ;BDOS DELETE FILE CALL BDOS JR OPENO1 ;CREATE NEW FILE AND CONTINUE ; ; CHECK TO SEE IF CHAR PTED TO BY HL IS A DELIMITER AND FLUSH CHARS UNTIL ; IT IS; RET WITH ZERO FLAG SET WHEN DONE ; FTODLM: ;Flush TO DeLiMiter PUSH BC CALL DLIMSCAN ;DO SCAN POP BC RET Z ;MATCH, SO ABORT INC HL ;PT TO NEXT CHAR JR FTODLM ;CONTINUE SCAN ; ; COPY (HL) TO (DE) FOR B BYTES OR UNTIL A DELIMITER IS ENCOUNTERED ; COPYTODELIM: LD C,B ;LET BC=OLD B (FOR LDI INSTR) LD B,0 PUSH BC ;SAVE REGS PUSH DE PUSH HL CALL SPFILL ;FILL DESTINATION BUFFER WITH SPACES (PTED TO BY DE) POP HL ; ... AND C BYTES LONG POP DE POP BC CTD1: PUSH BC ;SAVE COUNT CALL DLIMSCAN ;SCAN FOR DELIMITER IF ENCOUNTERED POP BC RET Z ;DONE IF SO LDI ;COPY NEXT CHAR INTO DESTINATION BUFFER JP PO,DLIMSCAN ;FINAL DELIMITER SCAN IF DONE JR CTD1 ; ; ADVANCE BUFFER POINTER HL UNTIL NON-WHITE (NON-, NON-) ; ENCOUNTERED ; SKIPWHITE: LD A,(HL) ;GET CHAR CP ' ' ;? JR Z,SKPWH1 ;SKIP IF SO CP 9 ;? RET NZ ;DONE IF NOT SKPWH1: INC HL ;PT TO NEXT CHAR JR SKIPWHITE ; ; CHECK TO SEE IF CHAR PTED TO BY HL IS A DELIMITER ; DLIMSCAN: PUSH DE EX DE,HL ;PT TO CHAR WITH DE LD HL,DLIMS ;PT TO TABLE OF DELIMITERS CALL DELIMCHS ;DO SCAN IN GENERAL EX DE,HL ;PT TO CHAR WITH HL LD A,(HL) ;GET CHAR IN A POP DE RET ; ; TABLE OF VALID DELIMITERS ; DLIMS: DB 1,1 ;SCAN 1 BYTE AT A TIME, AND SKIP 1 BYTE IF NO MATCH DB ',' ;DELIMITERS ... DB ':' DB '+' DB '-' DB '/' DB '*' DB ' ' DB ')' DB ';' DB 0DH DB 9 ; ... TO HERE DB 0 ;END OF TABLE ; ; SCAN FOR DELIMITER -- RETURN WITH NZ IF NOT FOUND OR PT TO DELIMITER ; WITH Z IF FOUND; ON INPUT, TABLE PTED TO BY HL WITH 1ST 2 BYTES ; GIVING NUMBER OF BYTES TO CHECK AND NUMBER OF BYTES TO SKIP, RESP, ; ON EACH PARTIAL SCAN ; DELIMCHS: CALL SPCHSCAN ;DO SCAN OF TABLE RET NZ ;NOT FOUND LD C,B ;CHAR OFFSET COUNT IN BC LD B,0 ADD HL,BC ;PT TO CHAR SUB A ;SET ZERO FLAG RET ; ; SCAN SPECIAL CHAR TABLE PTED TO BY HL FOR STRING PTED TO BY DE; ; NUMBER OF SIGNIFICANT BYTES TO SCAN AS FIRST ENTRY IN TABLE, ; NUMBER OF BYTES TO SKIP ON FAILURE AS 2ND ENTRY IN TABLE; ; TABLE ENDS IN A BINARY 0 ; SPCHSCAN: LD B,(HL) ;B=NUMBER OF BYTES TO SCAN INC HL LD C,(HL) ;C=NUMBER OF BYTES TO SKIP ON FAILURE INC HL ;PT TO FIRST VALID BYTE IN TABLE ; ; MAIN SCANNING LOOP ; SPCH1: LD A,(HL) ;CHECK FOR END OF TABLE AND A ;ZERO? JR Z,SPCH2 ;DONE IF SO CALL COMPHLDE ;DO COMPARE RET Z ;RETURN IF MATCH LD A,C ;POINT TO NEXT TABLE ENTRY CALL ADDHLA ;HL=HL+(SIZE OF TABLE ENTRY) JR SPCH1 ; ; NO MATCH -- RETURN NZ ; SPCH2: INC A ;A=1 AND NZ RET ; ; COMPARE CHARS PTED TO BY DE WITH THAT PTED TO BY HL FOR B BYTES ; RET WITH ZERO FLAG SET IF COMPLETE MATCH, NZ IF NO MATCH; ; HL, DE, BC NOT AFFECTED ; COMPHLDE: PUSH HL ;SAVE REGS PUSH DE PUSH BC CMPHD1: LD A,(DE) ;GET DE CHAR CP (HL) ;COMPARE TO HL CHAR JR NZ,CMPHD2 ;NO MATCH INC HL ;PT TO NEXT INC DE DJNZ CMPHD1 ;COUNT DOWN -- ZERO FLAG SET ON END CMPHD2: POP BC ;RESTORE REGS POP DE POP HL RET ; ; HL=HL+A ; ADDHLA: ADD A,L ;DO IT LD L,A RET NC INC HL RET ; ; FILL MEMORY PTED TO BY DE WITH SPACES FOR BC BYTES ; SPFILL: LD A,' ' ; LD (DE),A ;STORE FIRST LD H,D ;MAKE HL PT TO 1ST LD L,E INC DE ;DE PTS TO NEXT BYTE DEC BC ;BC IS 1 BYTE LESS LDIR ;COPY USING LDIR RET ; ; OUTPUT CHAR IN A TO DISK FILE ; DOUTCHAR: PUSH HL ;SAVE REGS PUSH DE PUSH BC PUSH AF LD HL,(OBUFPTR) ;GET ADDRESS OF NEXT CHAR POS IN OUT BUFFER LD (HL),A ;STORE CHAR INTO OUT BUFFER CP 9 ;CHECK FOR TAB JR NZ,NOTABOUT ;NOT TAB -- DON'T UPDATE COUNT LD A,(OBUFLPOS) ;TAB -- UPDATE LOCATION IN LINE DEC A ;A=OUT BUFFER LINE POSITION - 1 AND 0F8H ;MASK FOR TAB ADD A,9 ;AND ADD 9 JR DOUT1 ; NOT A TAB -- JUST INCR POSITION COUNT NOTABOUT: LD A,(OBUFLPOS) ;GET ADDRESS OF NEXT CHAR POS IN OUT BUFFER INC A ;ADD 1 TO IT DOUT1: LD (OBUFLPOS),A ;UPDATE OUT BUFFER LINE POSITION INC HL ;INCREMENT BUFFER PTR LD A,(OBUFBACKCNT) ;GET BUFFER BYTE COUNT DEC A ;BUFFER NOW FULL? JR NZ,DOUT2 ;CONTINUE IF NOT LD DE,OBUF ;WRITE BUFFER TO DISK IF SO LD C,1AH ;SET DMA ADDRESS CALL BDOS LD DE,FCBZ80 ;WRITE BLOCK CALL WRITEBLK LD HL,OBUF ;RESET OUTPUT BUFFER PTR TO 1ST BYTE LD A,80H ;RESET BUFFER BYTE COUNT DOUT2: LD (OBUFPTR),HL ;UPDATE OUTPUT BUFFER PTR LD (OBUFBACKCNT),A ;UPDATE BUFFER BYTE COUNT POP AF ;RESTORE REGS POP BC POP DE POP HL RET ; ; WRITE BLOCK WHOSE FCB IS PTED TO BY DE TO DISK ; WRITEBLK: LD C,15H ;CP/M BDOS WRITE BLOCK CALL BDOS AND A ;ERROR? RET Z ;OK IF NONE LD DE,ERR1 ;ELSE PRINT ERROR MESSAGE AND ABORT JP ENDERR ; ; FILL LAST BLOCK WITH ^Z AND CLOSE OUTPUT FILE ; CTRLZFILL: LD A,(OBUFBACKCNT) ;GET REMAINING COUNT CP 80H ;FULL? JR Z,CLOSEOUT ;CLOSE FILE THEN LD A,1AH ;ELSE WRITE ^Z CALL DOUTCHAR JR CTRLZFILL ; ; CLOSE OUTPUT FILE ; CLOSEOUT: LD DE,FCBZ80 ;OUTPUT FCB LD C,10H ;CLOSE FILE JP BDOS ; ; EXTRACT NEXT INPUT LINE FOR DISK FILE AND PLACE IT AS A 0-TERMINATED ; STRING IN BUFFER 'INLN' ; BUILDLINE: CALL PDOT ;PRINT ACTIVITY DOT XOR A ;A=FALSE OR 0 LD (INCMT),A ;TURN IN COMMENT FLAG OFF LD (INQUOTE),A ;TURN IN QUOTE FLAG OFF LD HL,INLN ;PT TO INLN BUFFER LD B,80 ;80 CHARS MAX ; ; MAIN BUILD LOOP ; NXTLCHAR: LD DE,(IBUFPTR) ;PT TO NEXT CHAR IN FILE LD A,(IBUFCNT) ;CHECK TO SEE IF BUFFER EMPTY CP 80H ;80H IF SO JR NZ,PUTCHAR ;NOT EMPTY, SO PLACE CHAR IN LINE EXX  ;SAVE REGS LD DE,IBUFFER ;READ NEXT BLOCK FROM INPUT FILE LD C,1AH ;SET DMA ADDRESS CALL BDOS LD DE,FCBASM ;READ THE BLOCK LD C,14H CALL BDOS DEC A ;ERROR? JP Z,ENDALL ;DONE IF SO (ASSUME EOF) EXX ;GET REGS BACK LD DE,IBUFFER ;SET PTR TO 1ST BYTE OF BLOCK SUB A ;CHAR COUNT = 0 ; ; PLACE CHAR PTED TO BE DE INTO INLN ; PUTCHAR: LD (IBUFCNT),A ;SAVE CHAR COUNT LD A,(DE) ;GET CHAR INC DE ;PT TO NEXT LD (IBUFPTR),DE ;SAVE PTR PUSH HL LD HL,IBUFCNT ;INCR CHAR COUNT INC (HL) POP HL CALL PCAPS ;CAPITALIZE CHAR OPTIONALLY LD (HL),A ;SAVE CHAR FROM FILE INTO INLN CP 0DH ;END OF LINE? JR Z,ENDBLINE ;DONE IF SO CP 9 ;TAB EXPAND? JR Z,CONTBLINE ;PROCESS AS NORMAL CHAR IF SO CP ' ' ;LESS THAN ? JR C,NXTLCHAR ;DON'T PROCESS IF SO CONTBLINE: DEC B ;IS BUFFER FULL? INC HL ;PT TO NEXT CHAR IN INLN BUFFER JR NZ,NXTLCHAR ;CONTINUE PROCESSING IF NOT FULL INC B ;WRITE OVER LAST CHAR FOR REST OF LINE DEC HL JR NXTLCHAR ;CONTINUE ; ; OPTIONALLY CAPITALIZE CHAR IN A ; PCAPS: PUSH AF ;SAVE CHAR LD A,(INCMT) ;IN A COMMENT? OR A ;0=NO JR NZ,PCAPS5 ;DONE IF SO AND DON'T CAPITALIZE LD A,(INQUOTE) ;IN A QUOTE? OR A ;0=NO JR NZ,PCAPS1 ;DON'T CAPITALIZE IF SO POP AF ;NOT IN COMMENT OR QUOTE, SO CAPITALIZE CALL CAPS JR PCAPS2 PCAPS1: POP AF ;GET CHAR PCAPS2: CP ';' ;COMING INTO A COMMENT? JR NZ,PCAPS3 PUSH AF ;SAVE CHAR LD A,0FFH ;SET INCMT FLAG LD (INCMT),A JR PCAPS5 ;DONE PCAPS3: PUSH AF ;SAVE CHAR LD A,(INQUOTE) ;IN A QUOTE? OR A ;0=NO JR Z,PCAPS4 POP AF ;GET CHAR -- WE ARE IN A QUOTE PUSH AF ;SAVE IT AGAIN CP '''' ;ARE WE LEAVING THE QUOTE? JR NZ,PCAPS5 XOR A ;A=0 LD (INQUOTE),A ;YES, SO SET NOT IN QUOTE JR PCAPS5 PCAPS4: POP AF ;GET CHAR PUSH AF ;SAVE CHAR ONE LAST TIME CP '''' ;COMING INTO A QUOTE? JR NZ,PCAPS5 LD A,0FFH ;SET INQUOTE FLAG LD (INQUOTE),A PCAPS5: POP AF ;GET CHAR RET ;DONE ; ; STORE ENDING AND ; ENDBLINE: INC HL ;PT TO NEXT POSITION LD (HL),0AH ;STORE INC HL LD (HL),0 ;STORE LD (IBUFPTR),DE ;SAVE INPUT FILE PTR ; ; IF LINE STARTS WITH AN ASTERISK (COMMENT LINE), MAKE IT START WITH A ; SEMICOLON ; LD A,(INLN) ;LOOK AT FIRST CHAR CP '*' ;ASTERISK? JR NZ,ENDBL1 LD A,';' ;REPLACE WITH SEMICOLON LD (INLN),A ; ; CHECK FOR EMPTY LINE AND JUST OUTPUT NEW LINE IF SO; ELSE RETURN ; ENDBL1: LD A,B ;LINE EMPTY? SUB 80 ;START OVER IF SO RET NZ ;DONE IF NOT EMPTY LD A,0DH ;OUTPUT TO FILE FOR EMPTY LINE CALL DOUTCHAR LD A,0AH CALL DOUTCHAR JP BUILDLINE ;DO NEXT LINE ; ; CAPITALIZE CHAR IN A ; CAPS: AND 7FH ;MASK OUT MSB CP 61H ;DO NOTHING IF LESS THAN SMALL A RET C CP 7AH+1 ;CAP IF BETWEEN SMALL A AND Z, RESP RET NC AND 5FH ;CAPITALIZE RET ; ; END OF PROCESSING ; ENDALL: CALL CTRLZFILL ;FILL BUFFER WITH ^Z LD DE,ERR5ON ;OPTIONALLY PRINT EACH ERROR MESSAGE IF SET CALL PMSG LD DE,XLT1ON CALL PMSG LD DE,XLT2ON CALL PMSG LD DE,XLT3ON CALL PMSG LD DE,XLT4ON CALL PMSG LD DE,MSG2 ; ; PRINT MESSAGE PTED TO BY DE WITH PRECEEDING AND FINISH UP ; ENDERR: PUSH DE ;SAVE PTR LD DE,CRLFSTR ;PRINT CALL PMSG POP DE CALL PMSG ;PRINT MESSAGE JP WBOOT ;DONE ; ; PRINT STRING PTED TO BY DE AND ENDING IN 0 ; PMSG: LD A,(DE) ;GET CHAR AND A ;ENDING 0? RET Z ;DONE IF SO CALL PCHAR ;OUTPUT CHAR IN A INC DE ;PT TO NEXT CHAR JR PMSG ;CONTINUE ; ; PRINT CHAR IN A ON CON: ; PCHAR: PUSH AF ;SAVE REGS PUSH BC PUSH DE PUSH HL LD E,A ;CHAR IN E LD C,2 ;CON: OUTPUT CALL BDOS POP HL ;RESTORE REGS POP DE POP BC POP AF RET ; ; **** OP CODE TABLE, MESSAGE, AND BUFFER AREA **** ; ; ; OP CODE TABLES ; OCS1: DB 'ANI AND ' DB 'CMA CPL ' DB 'CMC CCF ' DB 'CPI CP ' DB 'HLT HALT ' DB 'JMP JP ' DB 'JMPR JR ' DB 'ORI OR ' DB 'RAL RLA ' DB 'RAR RRA ' DB 'RLC RLCA ' DB 'RRC RRCA ' DB 'STC SCF ' DB 'SUI SUB ' DB 'XRI XOR ' POPS: DB 'DB DEFB ' DB 'DS DEFS ' DB 'DW DEFW ' DB 'SET DEFL ' NOXLT: DB 'ENT ENTRY' DB 'NAM NAME ' DB 'RAM DATA ' DB 'ROG REL ' DB 0 ;END OF TABLE FOR OCS 1 OCS2: DB 'ANA AND ' DB 'CMP CP ' DB 'DCR DEC ' DB 'INR INC ' DB 'MVI LD ' DB 'ORA OR ' DB 'SUB SUB ' DB 'XRA XOR ' DB 0 ;END OF TABLE FOR OCS 2 OCS3: DB 'DCX DEC ' DB 'INX INC ' DB 'LXI LD ' DB 'POP POP ' DB 'PUSH PUSH ' DB 0 ;END OF TABLE FOR OCS 3 OCS4: DB 'REQ RNE RLT RGE CEQ ' DB ' CNE CLT CGE JEQ JNE ' DB ' JLT JGE ' DB 0 ;END OF TABLE FOR OCS 4 RETS: DB 'RC RNC RZ RNZ RP ' DB ' RM RPE RPO ' DB 0 ;END OF TABLE FOR RETS CALLS: DB 'CC CNC CZ CNZ CP ' DB ' CM CPE CPO ' DB 0 ;END OF TABLE FOR CALLS JMPS: DB 'JC JNC JZ JNZ JP ' DB ' JM JPE JPO ' DB 0 ;END OF TABLE FOR JMPS JMPR: DB 'JRNZ JRZ JRNC JRC ',0 OCS8: DB 'DAD ADD ' DW DO81 DB 'ADD ADD ' DW DO82 DB 'ADC ADC ' DW DO82  DB 'SBB SBC ' DW DO82 DB 'ADI ADD ' DW DO82 DB 'ACI ADC ' DW DO82 DB 'SBI SBC ' DW DO82 DB 'IN IN ' DW DO83 DB 'LDA LD ' DW DO83 DB 'LDAX LD ' DW DO84 DB 'LHLD LD ' DW DO85 DB 'MOV LD ' DW DO86 DB 'PCHL JP ' DW DO88 DB 'RST RST ' DW DO89 DB 'SHLD LD ' DW DO8A DB 'SPHL LD ' DW DO8B DB 'STA LD ' DW DO8C DB 'OUT OUT ' DW DO8C DB 'STAX LD ' DW DO8D DB 'XCHG EX ' DW DO8E DB 'XTHL EX ' DW DO8F NOXLT2: DB 'IFC IF ' DW DO91 DB 'ICL *INCL' DW DO92 DB 'LST LIST ' DW DO93 DB 'MAC MACRO' DW DO94 DB 0 ;END OF TABLE FOR OCS8 AND NOXLT2 ; ; VARIOUS MESSAGES AND PROGRAM HEADER ; HEADER: DB 'XLATE3 -- 8080-to-Z80 Translator, Version ' DB VERS/10+'0','.',(VERS MOD 10)+'0' DB 0DH,0AH,0 ; HELP MESSAGES HMSG1: DB 0DH,0AH,0AH DB ' XLATE2 translates 8080 assembly language source',0DH,0AH DB 'code into Zilog-Standard Z80 assembly language',0DH,0AH DB 'source code. It is invoked by a command of the',0DH,0AH DB 'following form:',0DH,0AH,0AH DB ' XLATE2 d:SRCFILE.typ d:destfile.typ',0DH,0AH,0AH DB ' All characters in lower case are optional, and,',0DH,0AH DB 'if omitted, the following values are assumed:',0DH,0AH,0AH DB ' . The Source File will have a type of ASM',0DH,0AH DB ' . The Destination File will have the same name',0DH,0AH DB ' as the Source File',0DH,0AH DB ' . The Destination File will have a type of MAC',0DH,0AH,0AH DB 'Type to Continue - ',0 HMSG2: DB 0DH,0AH,0AH DB 'The following are examples of its use:',0DH,0AH,0AH DB ' XLATE2 DEMO1 <-- Translates DEMO1.ASM to DEMO1.MAC' DB 0DH,0AH DB ' XLATE2 DEMO1 DEMO2 <-- DEMO1.ASM to DEMO2.MAC' DB 0DH,0AH DB ' XLATE2 DEMO1.TXT DEMO2.GGG <-- DEMO1.TXT to DEMO2.GGG' DB 0DH,0AH,0AH DB 'The following functions are also performed by XLATE2:' DB 0DH,0AH,0AH DB ' . The M80 Pseudo-Ops .Z80 and ASEG will be inserted ' DB 'at the front',0DH,0AH DB ' of the MAC File',0DH,0AH DB ' . The text in the Destination File will be ' DB 'capitalized',0DH,0AH DB ' . All comment lines beginning with an asterisk will ' DB 'begin with',0DH,0AH DB ' a semicolon instead',0DH,0AH,0AH DB 0 ; FILE NAME MESSAGES PRFNM1: DB 'Source File: ',0 PRFNM2: DB ' Destination File: ',0 ; FIRST TWO LINES OF MAC FILE FHDR: DB 9,'.Z80',0DH,0AH ;USE ZILOG MNEMONICS DB 9,'ASEG',0DH,0AH ;USE ABSOLUTE SEGMENTS DB 0 ERR1: DB 'Output File Write Error',0DH,0AH,7,0 ERR2: DB 'No Source File Found',0DH,0AH,7,0 ERR3: DB 'No Directory Space',0DH,0AH,7,0 ERR4: DB 'Output File Already Exists -- Delete It and Continue (Y/N)? ' DB 0 ERR4A: DB 'XLATE2 Aborting to CP/M',0 MSG2: DB 'XLATE2 Processing Complete',0 CRLFSTR: DB 0DH,0AH,0 ; ; VARIOUS ERROR MESSAGES ; ERR5ON: DB 0 ;THIS BYTE IS SET TO IF STRING ENABLED ERR5: DB 0AH DB 'The following pseudo-ops ' DB 'have been used in your source ' DB 'and have not',0DH,0AH DB 'been ' DB 'fully translated. You must ' DB 'complete the translation ' DB 'using an editor.',0DH,0AH DB 9,'Original:',9,9,'Must Be Translated To:',0DH,0AH DB 0 ;END OF STRING XLT1ON: DB 0 ;THIS BYTE IS SET TO IF STRING ENABLED XLT1: DB '#ENDIF',9,9,9,'ENDIF',0DH,0AH,0 XLT2ON: DB 0 ;THIS BYTE IS SET TO IF STRINGENABLED XLT2: DB 'ICL',9,9,9,'*INCLUDE',0DH,0AH,0 XLT3ON: DB 0 ;THIS BYTE IS SET TO IF STRING ENABLED XLT3: DB 'LST ',9,9,'LIST ' DB 0DH,0AH,0 XLT4ON: DB 0 ;THIS BYTE IS SET TO IF STRING ENABLED XLT4: DB 'MAC <$parameters>',9,'MACRO <#parameters>',0DH,0AH DB 9,'[ ... ]',9,9,9,'MEND',0DH,0AH DB 9,'#macro-call',9,9,'macro-call',0DH,0AH,0 ; ; INPUT FILE FCB ; FCBASM: DB 0,0,0,0,0,0,0,0,0,'ASM',0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0 ; ; OUTPUT FILE FCB ; FCBZ80: DB 0,0,0,0,0,0,0,0,0,'MAC',0 DB 0,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,0,0,0,0,0 ; ; BUFFERS ; ; STACK AREA DS 128 ; CURRENT POSITION IN LINE OF OUTPUT BUFFER OBUFLPOS: DS 1 ; COUNTER FOR EVERY 10 LINES LCOUNT: DS 1 ; COUNTER FOR EVERY 60*10 LINES NLCOUNT: DS 1 ; IN COMMENT FLAG -- 0 MEANS NOT INCMT: DS 1 ; IN QUOTE FLAG -- 0 MEANS NOT INQUOTE: DS 1 ; PTR TO TARGET OP CODE IN INPUT LINE ILTOP: DS 2 ; OP CODE TO MATCH AGAINST TARGOP: DS 5 ; PTR TO CURRENT POSITION IN CURRENT INPUT LINE INLNPTR: DS 2 ; PTR TO CURRENT POSITION IN OUTPUT BUFFER (BLOCK) OBUFPTR: DS 2 ; COUNT OF CHARS REMAINING IN OUTPUT BUFFER OBUFBACKCNT: DS 1 ; OUTPUT BUFFER (BLOCK) OBUF: DS 128 ; CURRENT INPUT LINE BUFFER INLN: DS 80 ;80 CHARS IN LINE DS 3 ;3 EXTRA FOR ; PTR TO CURRENT POSITION IN INPUT BUFFER IBUFPTR: DS 2 ; COUNT OF NUMBER OF CHARS LEFT IN INPUT BUFFER IBUFCNT: DS 1 ; INPUT BUFFER (BLOCK) IBUFFER: DS 128 END $&͒1ͱ;=! !   !  &!@ v!} ʣ! ʲ! ! ʽ!  !~ ( (Y#> Y*~ ( ( (I;(!'  (Y# (-;(/ ):0= ( 8> > Y&>2:=2>.> 2:=2eͽ><2~Y#~ ( Y#!~ (% (!;~#:(. (* (&;(" (Y :(:Y~ (7& ʢE¢#~Q¢#~U¢ò>:Y> Y> Y> Y~; ""<~(; <Ü ~ ( (Y#> Y*~MŸ#!!&ß(HL)*~B(!D("H(#P (#~S "#~W ##!j !m!p!s&#ßAFBCDEHL:!E(!N( !L(!~2#~2Z NZC NC!ÜRET !'CALL !:Y: (Y JR !>,YÜJP :Y: Y N#F!&)HL,!%3A,!06A,(*~B(D( ß!R!YA,(BC)A,(DE)!t&A>)YßHL,(*~M !!&#~Y#Y!!3!38*>(YA!"),HL!fSP,HL>(YA!&ß),A*~B(D(ß!!&*#ß(BC),A(DE),A!' DE,HL!9&Ü(SP),HL*~;( (#+~ ( (#*z {~Y#> 2 > 22 > 2D> 2s> 2hÜ:]/: ͽj ͽpͽ: ͽ> 2><2>2f~!~(Y#:m 2@ 2 2 !\ ~ (!m~+ !\ !u~ (xͽ!Bͽ!Beͽ~@>:#^>.^~#(>2oï &(>2!"ïͽ̀Y2¯eͽ#HO~ ( #!~,:+-/* ); 'H F#N#~( ;yJ< #Ʌo#> bk *w := :<2#:= ͛!>"2ï:(>Y22!P[m:o p=ʋp2oSm!o4w (P ( 8# +: 7: ̀; >2:( ' 2 ' >2#6 #6Sm:* >;2xP> Y> Yþa{_ͨhͽ ͽ2ͽDͽsͽJeͽͽ_ANI AND CMA CPL CMC CCF CPI CP HLT HALT JMP JP JMPR JR ORI OR RAL RLA RAR RRA RLC RLCA RRC RRCA STC SCF SUI SUB XRI XOR DB DEFB DS DEFS DW DEFW SET DEFL ENT ENTRYNAM NAME RAM DATA ROG REL ANA AND CMP CP DCR DEC INR INC MVI LD ORA OR SUB SUB XRA XOR DCX DEC INX INC LXI LD POP POP PUSH PUSH REQ RNE RLT RGE CEQ CNE CLT CGE JEQ JNE JLT JGE RC RNC RZ RNZ RP RM RPE RPO CC CNC CZ CNZ CP CM CPE CPO JC JNC JZ JNZ JP JM JPE JPO JRNZ JRZ JRNC JRC DAD ADD ADD ADD ADC ADC SBB SBC ADI ADD ACI ADC SBI SBC IN IN (LDA LD (LDAX LD 4LHLD LD `MOV LD yPCHL JP RST RST SHLD LD SPHL LD STA LD OUT OUT STAX LD XCHG EX XTHL EX -IFC IF mICL *INCLtLST LIST {MAC MACROXLATE3 -- 8080-to-Z80 Translator, Version 1.1 XLATE2 translates 8080 assembly language source code into Zilog-Standard Z80 assembly language source code. It is invoked by a command of the following form: XLATE2 d:SRCFILE.typ d:destfile.typ All characters in lower case are optional, and, if omitted, the following values are assumed: . The Source File will have a type of ASM . The Destination File will have the same name as the Source File . The Destination File will have a type of MAC Type to Continue - The following are examples of its use: XLATE2 DEMO1 <-- Translates DEMO1.ASM to DEMO1.MAC XLATE2 DEMO1 DEMO2 <-- DEMO1.ASM to DEMO2.MAC XLATE2 DEMO1.TXT DEMO2.GGG <-- DEMO1.TXT to DEMO2.GGG The following functions are also performed by XLATE2: . The M80 Pseudo-Ops .Z80 and ASEG will be inserted at the front of the MAC File . The text in the Destination File will be capitalized . All comment lines beginning with an asterisk will begin with a semicolon instead Source File: Destination File: .Z80 ASEG Output File Write Error No Source File Found No Directory Space Output File Already Exists -- Delete It and Continue (Y/N)? XLATE2 Aborting to CP/MXLATE2 Processing Complete The following pseudo-ops have been used in your source and have not been fully translated. You must complete the translation using an editor. Original: Must Be Translated To: #ENDIF ENDIF ICL *INCLUDE LST LIST MAC <$parameters> MACRO <#parameters> [ ... ] MEND #macro-call macro-call ASMMACMAC $1 HEXCOM $1 REN $1.FMT=$1.COM WIPE s are the same only applied to the KAYPRO machine. See the RFORMAT.DOC for a complete explaination and RFORMAT.INF on how they are to be used. RFORMAT .COM RFORMAT .DOC RFORMAT .MAC A new formatting program for the PMC MicroMate machine which allows the formatting of any format after an .FMT file has been generated. See the documentation which has been supplied in the appropriate files on this disk. TRACKRD .COM TRACKRD .MAC These files are also associated with the RFORMAT program and are used in setting up a new format. See the documentation for a full explaination. XLATE3A .COM XLATE3A .MAC A 8080 to Z80 translator (version 1.1).  a disk and is used in many cases with the CATALOG program. IOTEST .COM IOTEST .MAC These are hardware orientation p E WILL PUT YOU BACK TO CP/M. WHILE CR or F or Y WILL ALLOW YOU TO FORMAT ANOTHER DISK IN THE SAME DRIVE YOU HAVE SELECTED. If you wish to format a different format you must have a *.FMT file on disk corresponding to the given different format, i.e., KAYPRO2.FMT The command at the B> prompt is as follows, with the resultant display. Where equals a carriage return. B>RFORMAT KAYPRO2 TRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595 KAYPRO2 SSDD FORMAT WHICH DRIVE? (A - D ALLOWED) __ ;TYPE IN YOUR CHOICE AS ABOVE Q or X or E to exit CR or F or Y to format __ ;AGAIN, TYPE IN YOUR CHOICE ;REPEAT TO FORMAT ANOTHER DISK IN THE SAME DRIVE. --------------------------------------------------------------------------- USING TRACKRD.COM The use of TRACKRD allows you to read the tracks of a disk to obtain the data needed to establish a .FMT file for formatting that particular machine format. With TRACKRD.COM on disk type the fÉ NULU COPYRIGHT 1984 SYSTEM SOLUTIONS P.O. BOX 35972, DALLAS, TX 75235 ALL RIGHTS RESERVEDPPF ?8r8%8!9":vO:wo&) *8"4*~)"8!"8'..RWORK-LBR.$$$ Add membersBrief toggleClose the libraryDelete membersExtract membersFilesweep modeGet filespecKrunch the libraryList membersMenuRename membersOpen a libraryPrint membersUnsqueeze membersReplace membersReplace/Add membersDrive/User changeView membersExit NULUDisk directoryRedirect inputRedirect outputAWAITING COMMANDNext memberPrevious memberClose the libraryDelete memberExtract memberLog new libraryPrint memberUnsqueeze memberRename memberDrive/User changeView memberWildcard renameExit NULUDisk directoryNULU command modeMenuDIMNSU?VXdtsdisk fullinvalid drivenot enough memoryuser cancelno directory spacefile not foundambiguity errorCP/M 2.x or higher requiredseek to unwritten sectorbad library directorysqueeze decode tablebad syntaxundefined:qw!"7!"7!"7!#"7!"7(/>/ Written by Martin Murray TYPE -M FOR MENU  ,5ͽ-2nO>18y@2 >Vf ͳ.2s͍,!N# 97 6!"1>2y :2C v : 2<2 >/-- ABORTED --d2@͈͆*1>f n͘!`i" ; $8>P02 >d#:82͆7/>/ closed. 2ͽ-\́';.;.(/>/~-#~Gxʾɷ͈: 'a  >/ Console input will be received from >Oh$2 f & ͈:i'#U !i*>/ Console output will be sent to ́'257/>Kh$yf $2i:828!T3*G(y0͈͂*1@:ʲf G͟!f +4f >/ Undeleting...7"9>/ f"O"*8"*C"!"͟!"C""8".>/ cannot be undeleted--name exists28ͮ"64G~(#>)O7Q+6>2:š* >"š#O7u6#"  *s&80ͭ77͂f & :C ?2C >-722 U ʻ þ!8}.!V.4/$8 !O  6k3.-1>=2 7/>2>/ | ͚.ͽ-;.:6=7/7/;.Í,>?!Ç62^ ͈͆*́'*1>f G>/ ERROR h&͒>/:  i!uʗ O7# ˆ -17/*1" !""1* " !" >O2; :'1 !!#f" ]6 !+} 7/ " " U7/!͒>/.>(0!f"Q:,^3A 0> 3>k2G >/ :D/O1ABCDELPQRUVWXYZ? K y͟6!Ç6* # * +} *  jû >/elete member? /ĕ* >/xtract to:  E  >/ibrary name: ʻ "<O7û  >/Unsqueeze to:   >/ename to:  z* >/New drive/user: ʻ "<O7nû 2 >/ Old filespec:  "<O7>/ New filespec: ) ͤû !"1!"  >!;01D/O1LUXYZ?y?N õ ]NULU Filesweep Menu.͘/2b 2/>2$R !> 2b L No members.  L No library open. 1 U4/>/*1"i *8"1* ͎1!"1ͫ / *1ͫ¾O:; v 2y2; 1BCFKLMXY>v : 2<2v J/ µ ͈ ́'%.ͥ->/ Please insert disk containing >/ and press RETURN͵ 5,5! 9"1" !~6v >aU>/ -::; x O!-ͯ3ͨ31-1{ ͟6> ͟6>:_/>/:>> H *1: º :d(:iʶ '" '1k3 v !͎1" 2 > '# X>P0  97 6/:62=CERRORf 4/>$>(0d#2,5Cclosed. 2i!T3>/ CONOUT file >/& ! ~6'>d#͈͆4/>/Krunching...͘! `i"j""~+4f *8""7"]6ʤf"!"ͨ3 q#p#p#q#"ä*[4f !2+4͍!i*j!8ͨ3́'-.͘/!i*>/will be krunched to >W_/.͘/7/*!f"""!-!"v!"!}s+"j!" 7 6>/ Copying: O"!#"ͮ"6#7s#r#28"s#r!V#^#"v*(DM> (K% (*"!"Mi*(DM!">O,&*("b%f S#2*E5>/Krunch aborted...reopening old library>K2; *1!"1"1[4*}ʌ*(DM*>O,&*~*"g6""""\-͍!>:O7#>.1->/ krunched.[4͂Gif !"͂7/U  @>Ú!8Ú*1\)f !8!8i*]NULU Command Menu.͘/2/>-2/>2$!/>?2/4/ͥ .͘/>/ ́';.}.͍,2>'>͍*8i*ͥ->/ Cannot find >/ Replace it and press RETURN͵ ͥ-'ã:; 1KOX>/ NO LIBRARY OPENj ́'e!<32͚3LBR ͛ʅ2>/ open. (Buffer size: *(*(g6>;6͒>/ sectors)JUf :>Uf !8> 1-1>/ not found. To make it, enter the number of entries to allow.!"~>/ Press RETURN now to abort making the library. Allow how many entries: U e~ ;0x͊0}>Nf ]6ڑ]6ңDM!8ͳ<Mf >/ Too many entries.!8"*1>=O76#ͭ7"͈͆//. }/*1@:O//f >/ Library 4/24/O>+>(0.7/>7͟6y͟6> ͟6-1#:?2!"k3.-1j:i'#>;.>.͈͂*8]6>sf 8)*1@)͹*f #:͟!f +4f >/ Renaming...7"w]6>/ f"!")BK!8͹**8"*C":͟!"C""8"f"NO">/ can't be renamed--new name exists<28Q>/ to ͮ"#] 7f"Q4G>O3>R3:>/ READ ONLY>/ Brief now O:?2>Nß6>/FF:; 1BLMOUY<>>>?2; ͍*8i*> 1-1v : 25>F 2,51ABCDEFGKLMNOPQRTUVXY<>?͆:8O28*1@:O!8qf ɟ6ʁ:d(2|>'## >'2jE i&z~n2Zu |  ; f l a u u u A 1$8!-1>/ Version *t&͒>.͟6oÒͽ-@22@,}>/Drive : Total *,#:,N)=F͒>/k, Used g6͒>/k, Free ͒>/k<~>kZ$A :$$$.SUBʯͭ7##"##d#"\):8?`i#>J6"))"J!p7>Ph$>28,6]6G*}+ !N#"E*(6s#r*("(S#*͛ML'8>K-JS#>M ͘!*" +">28 *("!2A  ͍,2">/ Library: ;'>/ Name Index Size KiloBytes>!͟!"87"Sf" x(.͘/>/ DIRECTORY .͘/7/O">/>/>/:,^3"8*!*!.͘/>/ Active sectors >/ Unused >/ Total .͘/;-180> 32^՗͟!ʋ4ʋ8)\BK͹*>/ Extracting...2!"K"͛ʃf">/ !"k3.-1͍>/ to ><&"t):d(2 $p7>h$)!#"+͑+ **+g6>/ WARNING: CRC error!d#: $')O! "##f S#ͼf )>"K%Gwf ͩ) (!,&"K (sͩ>/ Space too tight)4\͑-)Y4<\)BK!8ù*7"]6ʛ\->>2ʟ6\%.[*>K **E5:8*(>;6!DM,&>d#͟!728>/ Deleting...7"6]6f">/ O"ͮ"6<>/ Active entries: *"͒>/, Deleted: *"͒>/, Free: *"͒>/, Total: *"͒>/.ɗ28h$!̈́%=~= #~ =¼#=#=#^#VJ))"5""d5"E,5p7*8>h$>6]66!̈́%*("(͘!*"*"*"g6"":d(D>MJ>d5>d#͟!7"]6Xf"7/O">K%*( K+ʼ>/---> !8-1G'*b'g6!#"+͑+oð#o¿:8͒X>/ press RETURN ... J/X<>tf :d(2 $*("#g6"b%G'*b'"#:8:v8i.͘/>/ ^C=abort,^X=next file,L=next line,=next page.͘/>2~7/͟6 >=2~:8ʙ:v82~. }/2~ š>2~2F8)@!*(#"(8!!ͮ(4!78{!(!!>.O7#{!(!"[!#7/͟!v28"[!Z!v>OʨRʨO">/ already exists--not added.:FR¨8[*>/ not in library--not replaced8-'+[*>/: Cannot add an 8 megabyte file!" Z!ͮ"6>͙!7" f"" * g6͉ } >D0 >/No room for: 8[*

fY >/No directory space for: & +""*L!" *"g6͉ } Z!| ͮ"62 f Z!ʢ >/Replacing: ñ >/Adding: <28"#!ͮ"6!8ͨ37[* q#p####6#6,!*(DM!".!>h!K%h!!!<ɿ* >O,&" *.!".!!! !ͮ"6q#p*(+}>U͙!7"f"]6C!"L!C!!+|#f"8*G($p6!!<3LBR!8ß!2"\)*8$ !"!"!""""#f"""2!'8!")!\*">ͼ"!!"!"!"!!s#r#!>57bk "C""8"}>UDM!|+"8"!^#V#"C"!"k3.> 1-1*"g6r"ͮ"<~"# 76*(DM""28-8""""+>,6*("!#"""!#""!1d5 5~#####"d#G'<ʍ#<ʃ#:d'*b'B7͢#ʞ#*G(͑-ʞ#>2[(?(*(4<*(DM +*G(*(V.,#!"(<ɗ>Dp7PY*8z#4$###w# #y!]6~#"#:d(2#$>'K%*( "#G'*b'"#>'#1$>*(DMf'K$&Q$*( ~`i"(h$O72%"$`i>J6>,6"$:d('*{(:xG~ʗ$#Š$>F:x<'p7*.52PYg6$>;6>,6$>$$>MDMg6$BK*8*(s#r`i"(?(!:%=$7 %):8?> **(*(*(4*G(!$> B7:d('>2[(:828*(DM*(ɷ[%"e%"\%`i"b%{!>Ö́%"e%*\%g6"\%M‚%ɿ+"%"%!"%Oʜ%*(DMPY*(g6%>;6|>M"&DM*(V.*G(!#"%h.-%!#"%!+"%| & x&*8ù%>R"&>X*%+"%*8&>M&<*8*(g6"(*%*%#+"b&"y&!"r&PY*(g6ʓ&ړ&>;6|>L&DM*(V.*G(!#"b&h.,˜&!#"r&!+"y&|ʭ& xʨ&*8Y&>R&>D*b&+"b&*8õ&>Lî&<*8*(g6DM*r&*b&#!"(&G'!"'*d'>;6|>M7'DM*(*(V.*G(,!'!#"'*8 x&<('*'|>A*'>,6"(*G([**(*("b'*(g6"d'*(|>E~'PYg6>R~'R:d(2' :xҢ''%.y'ʏ'*G(~'! ~###~͑--wwÏ':[(?(2d((ȷ>u:xO(*8 4{(*8x46# '*G(\$p6a(*G(!$(7*X(~2[(a(!$!(7!6>t(O:xy(>BÙ(!+ "X(!++ "(-8"G(2 "(!"(!V.))}.2(($8)O!+"(}(y!O #)><Ú.:12*> 21282)ͳ.2)! >  B77>:O7u)6#͊0Z)|Z)}Z)2)~u) 2#[)@O:)yx)ͽ- ~#*ʐ).ʟ)ͪ)~)?yͪ)>~)Ò)x~) Ò))?¸)28 )2)x)>I)=>)> ?bk#B7y28! >B7!#>wO7#>21 8PA*ͥ-->/File exists-delete it? />P--K8*2O*->MW*-!8i*-1}.:1> 21ͳ.o&̽-@w#0ͭ7 6:#76.#7621Ú.~> 2*#~?*?*2*~=*#PY7>? #~?++ *`i|g}o+#+"8ͥ-}.#$8# F++V+^<Ú.28v]6…+2+2+28"+8ͨ3 28]6҉+"+ɗÂ+>tÂ+!+>ʥ+=2+>+++·+>==2+:+2+OO>+,O>=2+yO!+##^#Vz+y2+z ,{/>+>18N,*8*8V.ͽ-=_.D^#VV.;6<͍,*,#j,W+|y,_,ze,`i:,ʈ,)=ƒ,/R/O file, delete it? ͓6 8Nʍ-YZ->/es }.:e2e$8$8͚.<}.$8<>DÚ.}.!V.$8<Ú.$8<}.$8<>SÚ.}.$8<>UÚ.}.\$7 7m7\$8<>UÚ.=6%$8_:Q.$8.!w $8_ $8*~2/#~=2/#^#V"/!~2x/#~2n/*~2~/#~=2/#^#V"/>/ (y/n) D/N"/Y/͟6.͘/<267/>/ -1J/ 8>͟7]/*8#"8K/b7/.͘/~͟7#~26#ß7>&+DM> =ˆ/ N#ó/>&+DM> =£/ N#/ ~6#1w ~6-1w2/:6> ͟6/:8?28!0:8 0283283ɟ6"0%06O:690> ͟6*0*X0++"X0P0##"X0O:v!9#6+qe0w $8^#6{80-1՗20ͭ7028x01 :1O+~0 ڷ00i&x650Od500!04!85«0<0>"11 ͜5|1{0:1!w#"16~6##1~ʌ1#.1+ ʅ1 ʅ1:8e1G:6e1> ͟6> ͟6Y1Ä1:8ʄ1G:6ڄ1ʄ1> ͟6> ͟6:1~#͟6.1+1"1 9~ʵ1ʳ1#͹1ʜ11y~1 #͹11͌7O7OO71yO71T]#ͨ31<~ 8w#1 8[2A2ɿ3728"2ͬ2"2ͬ2"2ͬ2"2|H2}!g6_2DM)L2`ib2Ͱ2+|i2#"y2#͸2ʐ2!g6ʎ2ڎ2͸2x2!g6ʡ2o2*y2Ͱ2i228|g}o2:3A22222 :3<32p6U~ 8G 8# B3J6)=e3"v3!N#F# ͭ7͋3 bk ͡37ͨ3 ͭ77ͭ7728 x3O7#z´3<2828DM2872828DM2876"4 DM286#q#p!#s#r͖4*4]6ʇ4"n4"t428"|428"c4282828*4+]6W4*8g6DM7!s#r+ DM!s#r!q#p+!s#r+428"8*4+"4*4|*4~°4#~+ʽ4]64##ã4<ͅ7g6>M4*~g64>TDM#"4*8s#r+"8! s#rp7*.5"6 g6*.5g6'5".5<>M!".5շX5_2_5DM^5d5C5W:_52_5C5!a5>՗25>xʕ5xGyOҊ5Ҋ5!54)=p5Ö5>y"5}|53333x5՗yOxG{_zWñ5z5}o|g!"5é5*5<ɷyOxG=5xGyO=6{_zW=6}/o|/g#ɷ}o|g=-6|g}o=<6|g}oX6#=K6PYg6}o|g~w# xt6=_28$8_:8$8 6 6 66 6:6= G6>G:r6x26 _77:7=767 7 >27 ><27:8$8G:s >757 yM7q#=C7O~^7`7#Q7<#f7y*8ͅ7+}O|G*%8#-8O~ʝ7#7x_$8~#~´7 ##S^#~#^#Vz"*#":2!æ*}+"9͙ ͸ !~ʶ ¦Çt !:#S >. S ##^#V*"!{_j)))))>k *#":=2 «:2ͺ ë~#2!Q# D>* >* ** Library Directory for Library Directory for ** Lbr Members in Lbr Members in LBRDrive/User [more] $ $ Error -> >> No detectable file(s) on >> No file(s) on : Drive space used: k : files: (k free) *** There are There are member files in library(s) A468DFLNPRSVSD DIR r F or Y WILL ALLOW YOU TO FORMAT ANOTHER MICROMATE DISK IN THE SAME DRIVE YOU HAVE SELECTED. If you wish to format a different format you must have a *.FMT file on disk corresponding to the given different format, i.e., KAYPRO2.FMT The command at the B> prompt is as follows, with the resultant display. Where equals a carriage return. B>RFORMAT KAYPRO2 TRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595 KAYPRO2 SSDD FORMAT WHICH DRIVE? (A - D ALLOWED) __ ;TYPE IN YOUR CHOICE AS ABOVE Q or X or E to exit CR or F or Y to format __ ;AGAIN, TYPE IN YOUR CHOICE; REPEAT TO FORMAT ANOTHER KAYPRO2 DISK IN THE SAME DRIVE. --------------------------------------------------------------------------- Next, use TRACKRD.COM to obtain the disk format data you will need later. The use of TRACKRD allows you to read the tracks of a disk to obtain the data needed to establish a .FMT file for formatting that particular machine format. Wit SUBJECT: SD super directory program ======================================================================== QUICK SUMMARY OF OPTIONS: B>SD $U4ADL (etc.) (The '$' denotes start of commands) A - All user areas allowed, usually 0-15, less on RCPM systems C - Clear screen (if activated for your CRT) D - All disks starting with 1st available (usually A:) F - Makes a file called DISKMENU.DIR automatically L - Library list option N - No pagination, keeps scrolling if more than one full page P - Printer option - lists to printer R - Reset disk (perhaps a new one installed) S - Shows system files (otherwise doesn't) V - Shows date, version number U8 - Start with user 8 4, 6, or 8 - Displays files in the optional 40, 64 or 80 column format Using the $D option now automatically starts on the 1st available drive (usually A:) drive regardless what drive you were on when you started. It then checks all available drives. Similiarly, using the $A option will now always start with User 0, unless entered as $UnA - where n is a valid user number above zero. You may now use ZCPR2 drive/user# syntax, i.e., A0:, B5:, ect. and there is no need to specify a drive spec in the command line, i.e., SD A: $AD. You You may now vary the number of file names per line on the fly. You may also use (and store) the value used by SD for display at the lo- cation defined by MAXC by enabling the MAXCL equate (YES). Then just have your signon or RBBS program assign the proper value for number of lines, (1-4) and store it at MAXC. This means there is no more need to keep several versions of SD online. - Notes by Irv Hoff ptional 40, 64 or 80 column format Using the $D option now automatically starts on the 1st available drive (usually A:) drive regardless what drive you were on when you started. It then checks all available drives. Similiarly, us643: SD95 - 11/27/84MAXUSR TBL>!9"1!Dw# Gw# S }2  ԙ 222!~#€w\ xʍyʙ22͙ 2<2!\~´:<û>2w!F#~$+~#  ! # 6DA:!\>w:>22Ugg $0g g22>20 o:g22ͺ ] ] !~ʈ #|>? ͺ N :¦>2>2:¹>2>2:>2>2: ̙ :̞ :̒ :\=9 _!&~G2!9 xn !]~$ " 6?#>?2h !\^͙ \##~2#~2##^#V"#^#V{*.;^#~2#~2#^"ê":0ڪ:\=_.͙ !~w+˜ ’**#W+}z»÷i`:)="*#)""*{zҲ :_ ԙ >?!hw#w#w!""" *\͙ <=! o:O~(} o:(#* w#ao&ͼo|gͼo|gr#s#"*#"! *{z(9 Memory)ü͸ *}ʀ2*! s#r# +}*"+}c*|g}oc}o"#"*{ozg"*">  N** **{ozgNN**#{z *:!5͙ <˜͙ <9 Open9 Write͙ <ʇ:ڿ!4͙ <¡5͙ :=2͙ 9 Append!~#!5!5͙ <:=22":+>2:+ ] ͺ *"!""!""*6*"P"R*+"|u*> u##"T*^#V#"*P "P 2͸*"*#"|}*|ʀTV#^:_zW/_zW{_ɯ22:2 2   >0 0x00:>0 : 2 T])))L *T~S >. S t V#^>k *+"| ɯ2*|2:ĺ &] :\@ ڮ͛ P] :5] =] *L] :*  y22o&6"T*P>w#5!4ͺ :O:\@ ԛ >: *R>ʥ*R>ʥ:ʍʍ*R>ʥÎ:¤*R>å*R "R*|ʾ!5?:*| : t :!4:w!~6! !~6 * DASM for ZILOG-Standard Mnemonics Derived from ZZSOURCE/RESOURCE $ *%|(F#*%*%"%#"%F!͞ͻ 8*%#80#"%_!^#V*%~# #~2% > ͂$#~(*%:% #)/5APV\et} <Tbt )8Xt~'W$͉W$ͫW$ͿW$KͿPW$KͿPUW$W$]W$~8͕W$ͫ<*%͉W$ͫ<*%#~ 8[0>'͂$:%W$AF~ 8 ">H͂$W$0͂$W$K#~">H͂$PW$K#~">H͂$P<>A͂$W$t*%<#~_*%VqW$Ϳ<*%RqW$qW$Kx:(2(>>2%RP<>H͂$>L͂$qW$UqW$]<*%RqW$#F"%!u͞ͻËX#"%F!͞ͻڋ*ʋ!#ڈ#ÈY#"%F!u ͞ͻ(ڋ*ʋ##È<͉W$W$KPW$<{X~!(!W$#;W$ͫ<*%#;W$#;<*%͉W$<RqW$K>2%RP<qW$<K>2%RPqW$#;<}##F!u͞ͻx :%*%( *%++"%'##<++ͫ<K>C͂$PW$~>I>D͂$~W$>R͂$W$K>2%RP<*%ͿqW$Ϳ<*%K>2%RPqW$*%+"%*%+$DB ~>,Â$> Â$>;Â$>(Â$>)Â$<>AÂ$~8!yͲ~͂$#~.Ă$~NZZ.NCC.POPEP.M.~!ʛͲ~Â$K>H͂$>L͂$P~Êo$BCDEHLMA~!~!Ͳ~͂$#~Â$BCDEHLSPBCDEHLAFBCDEIXSPBCDEIYSP~0Â$>I͂${Â$>'͂$'‚$͂$Â$#>0͂$#~͂$#1K>+͂$~">H͂$P#^#V "c17:%(! :%AFz>0( z("{#>H͂${ 8"0EX DE,HLEX AF,AF'EXXEX (SP),HL'DAADIEIvHALT/CPL?CCFNOP7SCFJP (HL)RLCARLARRCARRARETLD SP,HLADC A,ADD A,AND CP OR SBC A,SUB XOR DEC INC ADD HL, DEC INC LD A,LD POP PUSH RET RST @ LD  LD ADD A, ADC A, AND CP OR SUB SBC A, XOR IN A, OUT JR DJNZ JR LD JP CALL :LD A,*LD HL,"LD 2LD CALL JP RLC RRC RL RR SLA (SRA 8SRL @BIT RES SET *EX (SP),JP LD SP,POP PUSH ADD #INC +DEC 4INC 5DEC ADD A,ADC A,SUB SBC A,AND XOR OR CP FLD p LD !!LD ""LD *#LD 6$LD %**p*DNEGERETNFIM 0VIM 1^IM 2GLD I,AMRETIOLD R,AWLD A,I_LD A,RgRRDoRLDBSBC HL,JADC HL,@&IN AOUT (C),'LD'CP'IN'OUT'OTC(LD K)LD **1&$ DASM, Version 1.7 $.%:]!8I$ Reading in All Files for !]~͂$#($ -- Read Complete --  $ Type H for Help, ? for Stats .%2%2%2%2%2%1&ͱ$:%G ( GOɯ2%2%$ ** Command Error **  ;+ABCqDE+"F^H` IK"LOPQR SkU~ XZ?*$ HELP on DASM -- Command Summary ;addr,comment Enter Comment at addr ;addr List comment at addr ; List Comments Table ;addr, Delete Comment A (see L) Attempt to find DB's B (see L) Build Symbol Table C Dump Control Table Cnnnn Dump Ctrl Table at nnnn Cnnnn,x Set Ctrl (x=BEHISW) Dnnnn Dump from nnnn on Daaaa,bbbb Dump over range D,bbbb Dump thru bbbb D Dump 80H more D=nn Set Dump Size Default DS Dump the Symbol Table DS.symbol Dump starting at symbol Ennnn,.symbol Enter symbol into table Fnnnn,ssss Find nnnn after ssss F or Fnnnn Cont Find or Find nnnn Issss,oooo Inc addrs>=ssss by oooo K.symbol Kill symbol from table L List next 20 lines Lssss,eeee List over range L,eeee List to eeee Lssss List 20 lines from ssss L=nn[,others] Set list default O Print current offset Onnnn Set new offset Pssss,eeee Generate program prolog Q Quiet prefix Rfilename.COM Read file @ offset+100H Rfilename.CTL Read Control Table Rfilename.SYM Read Symbol Table Rfilename.DOC Read Comments Table Rfilename.ALL Read CTL, SYM, DOC, COM Sfilename.ASM Save ASM File Sfilename.CTL Save CTL File Sfilename.SYM Save SYM File Sfilename.DOC Save DOC File Sfilename.ALL CTL, SYM, DOC, ASM Unnnn Set Comment Table addr X Restart DASM Z Write EOF to ASM File ? Print Statistics $Restart DASM (Y/N)? ͿY $Restarting DASM _v$!&~ !# (, #$Please enter title + date-time O&>P !P&^#6 >2%!Q&~ ($TITLE ~ (͂$#$ $.Z80 ASEG ORG z"{#>H͂$v$!# !-##~ ++~#~8 +~#~#F#~+A8G#~+(A-(=F>2%#~͂$$ EQU ~"+~#>H͂$v$2%##~Ͳ#`%z>2%%!&~# *%*%"%!&~ ^S"=,2!#*%"% ( (, #!#"%*%"%*%"% $Addr +0 +2 +4 +6 +8 +A +C +E ASCII *%`%ͷ##~##}#}#}#} >!͂$~ 88>.͂$#}(#>!͂$v$"%:%:%0 #!##"%,& & |!&~. "!0*%!-^#V#~k#>=͂$F> O#~͂$#A#q`%v$ :%=2%v$>2%$Offset = *%#v$ !&~ (!# "%v$:%2\2h!&:& : ~@2\##]~ (#.(~ .#> >2%2%>2%2%2%2%2%:%2%2%!&~ (N,(> (:= !#!#{ 2%2%~#,( ( !#"% ( (, #!#"%2%`%:%( :%= *%:%:% :%(3*%*%~͜%8##~#͜%0+ͷ*%>B͖"%>I͖*%|(F*%͒8=##F#~;+ $"%.7> 2%F#~\ v$͂$ * "%v$*%=+8###~I(OE#^#V*% "%2%SʖBHW͂$$: Invalid CTL Entry L2%Å:%/o:%/g#>2%$DS |"}#>H͂$v$"%Å>2%$DW *%*%^#VVv$*%##"%Åv$Å2%>2%2%<2%$DB *%*%:%~( 8 8w">H͂$:%2%0͂$#*%#"%:% :%*% ":%2%>,͂$>'͂$:%<2%~͂$~'̂$#*%#"%:% :%(3*% "0(:%<2%#08+~# (~ 8ڄ>'͂$K>'͂$v$Å!&~ !# (, #!# BK!-#~+8 ~8~w#~w+##~ #o>g$Scratch Area Start = !'#$ Scratch Area End = *.#$ COM Start = 0100 COM End = *%#$ SYMTBL = !-#*%#v$$PC = *%#v$$OFFSET = *%#v$*%|($COMNTS = *%#*%#v$2 $CTLTBL = !'#~###< +++#v$$Symbol Comments are O:%>N >F͂$͂$v$!&~ (+!#"%*%"% ( (, #!# *%"%*%`%*%~#"% ~ ͷ+##:%/_:%/W >2%$END 2%:% >4$#2%$++ MAC File Closed ++ ʹ:%!e%W%¿(*!%ͳ$ Reading DOC file... !%ͳ$Reading SYM file... !%ͳ$Reading CTL file... !%ͳ$Reading COM file... e2h!e%W% *!e%W%n V#*%|3ڒ\ $Last Block Read into Memory at #$ Last Block Ends at Relative ͷ"%#v$!e%W% !e%W% *$++ NO, that would overlay the Disassembler because the Offset is too small: ͂$ ++ !-"%##6 *%"%6#6V#ͅ# ( ( (Fs#r##ͅ# ( (w#p T:80))))oͅ#Tʹ:%!e%W%s!%ͳ$ Saving .DOC file... !%ͳ$Saving .SYM file... ͇!%ͳ$Saving .CTL file... ͺ$Create a New .MAC File (Y/N)? ͿY !%ͳ>2%2%#$++ Writing MAC Enabled Use Z Command or E Control to Close File ++ !e%W%͇ !-#^#V#~#Gʳͼ> 4$~4$#> 4$> 4$>4$#z"4$z"4${"4${"4$!e%W%ʴ!e%W%(!e%W%   *%##6*%Ê$++ No File Accessed Permitted until MAC Closed ++ $++ Unexpected EOF ++ |!&~ \!# W (, #~ͧ =+8###Ѿ2%=:%I(W(H(B(S( E(K( ##w!~#+<(  :%K E(H(B( W( I(S !'~###< T]###+~} | s#r#:%w!'~#+<7#z+ {###=!'`%^#V#z< v$ "8|v$~͂$#>:͂$###>=͂$> ͂$~͂$##q#ͺ #!'^#V#z<(ͼ>,4$~4$> 4$> 4$#>4$#*V#!'ͅ#($,(:80))))oͅ#s#r#ͅ#w#6#6 !&~ ʴO #~F( 2% !## ʯ (, ͒8~ *%s#r##w #"%6#6p *%~#+<7#z+ {##~Ͳ#Õ͒*%`%^#V#z< #>;͂$F#~͂$v$#~#<+T]##~Ͳ#~#O2%*% "!H~+(-(# 1>:͂$Aqv$2%##*%#>2%AS%!%6L#z"{"!%!8s#r:%(D[%=+8###~I (:%( >W͖[% >H͖[%=0>I͖2%*%T]xo|g"%##6++DM*%{ z( s#r#p#w!-##~#(,8 OW%( 8~#Ͳ++ѷOW%0HW%(0++"%7!-~# ~( #~7#o0$#~#G7!&!#~ (, #~. "8v$1$ was Killed +++͞""x 8  bk# 6A6! !&~. "! ͞" DM##~#Ͳ*%{ z(`i"%##6#~#+(-(08 :8A8[8 +"w#"w# 80"͂$"Â$|#}#> Â$~.( ~0:8AG0))))o#"! ^#V~!"%2|\<$ File Not Found *%| \! ~#"%8$++ Unexpected EOF ++ >w\\< 2|!"%\ $\<$++ Close Error ++ $++ Write Error ++ *%w,"%\ !"%*%|(AF(#~͂$!"%"%> ͂$> Â$>*_:%:%!%{4${ :%(!%5̀$%>P !%^#6 !%#~ v$a8{0_w2%2%~͂$#~ #>P2%>2%>2%2%!%"%!"%"%"%!M"%!"%!"%"%ɯ2-!-"%> 2&!"'>I2&!"%"%6#6#  (-(v$ $ Abort (Y/N)? ͿY ɷ  ?ALLMACCOMCTLSYMDOC.Aqw ' 9aww g $& ; ; Program: DASM ; Version: 1.6 ; Author: Richard Conn ; Date: 16 Aug 82 ; Previous Versions: 1.3 (23 May 82), 1.4 (12 June 82) ; Previous Versions: 1.0 (1 May 82), 1.1 (8 May 82), 1.2 (15 May 82) ; Derivation: ZZSOURCE and RESOURCE ; ; DASM is a TDL/ZILOG Disassembler derived from Dave Barker's ; ZZSOURCE and Ward Christensen's RESOURCE by Richard Conn. Refer to ; the documentation on RESOURCE and the built-in HELP data for information ; on the commands used for DASM. A Help file is also being planned for DASM. ; VERS equ 17 ; Version Number .Z80 ; USE ZILOG MNEMONICS ASEG ; USE ABSOLUTE SEGMENTS ; Values for TRUE and FALSE FALSE equ 0 TRUE equ NOT FALSE ; Set one and ONLY one of the following to TRUE ZILOG equ TRUE TDL equ FALSE ; Initial Values for DASM RDCOMQ EQU FALSE ;TRUE OF QUERY USER TO READ COM FILE ; WHEN 'ALL' IS FILE TYPE CTLTBL EQU ENDALL ;BEGINNING OF CONTROL TABLE SYMTAB EQU CTLTBL+600H ;BEGINNING OF SYMBOL TABLE INITOFF EQU SYMTAB+2000H ;INITIAL OFFSET VALUE COMTBL EQU INITOFF+4000H ;BEGINNING OF COMMENTS SYMMAX EQU 12 ;MAX NUMBER OF CHARS/SYMBOL (<= 12) INITLCNT EQU 20 ;NUMBER OF LINES TO DISPLAY VIA L, A, B INITDLEN EQU 80H ;NUMBER OF BYTES TO DISPLAY VIA D INITPC EQU 100H ;INITIAL VALUE OF PC INITELST EQU 0FFFFH ;INITIAL END OF LIST VALUE IBUFLEN EQU 80 ;LENGTH OF INPUT LINE BUFFER ; CP/M Constants WBOOT EQU 00H BDOS EQU 05H FCB EQU 5CH FCBNR EQU 7CH FCBTYPE EQU 65H RECLEN EQU 80H ; ; Beginning of Program ; ORG 0100H JP START JP GETCMD ;This is an easy entry point for a restart. ; ; The following INCLUDE is used to include the appropriate file defining ; the Mnemonics for the desired language. Choices at this time are: ; DASMZLG.MAC -- ZILOG-Standard Mnemonics ; DASMTDL.MAC -- TDL Mnemonics ; IF ZILOG INCLUDE DASMZLG.MAC ;Include ZILOG Mnemonic File ENDIF IF TDL INCLUDE DASMTDL.MAC ;Include TDL Mnemonic File ENDIF ; ; PRINT HEADERS ; START: LD SP,OLDST ;SET STACK CALL PSTRNG DEFB 0DH,0AH,'DASM, Version ' DEFB VERS/10+'0','.',(VERS MOD 10)+'0',0DH,0AH,0 ; ; PERFORM REENTRANT INITIALIZATION ; CALL INIT0 ;INITIALIZE BUFFERS SO DASM IS REENTRANT CALL INIT ;CLEANUP INITIALIZATION ; ; READ IN ALL FILES IF A FILE WAS SPECIFIED ; LD A,(FCB+1) ;GET FIRST LETTER OF FILE NAME CP ' '+1 ;VALID CHAR? JR C,SIGNON ;SKIP READ IF NOT VALID CHAR CALL PSTRNG DEFB 0DH,0AH,'Reading in All Files for ',0 LD HL,FCB+1 ;PT TO FILE NAME LD B,8 ;8 CHARS ARDNAME: LD A,(HL) ;GET CHAR CALL COUT ;PRINT IT INC HL ;PT TO NEXT DJNZ ARDNAME CALL ALLRD ;READ IN ALL FILES CALL PSTRNG DEFB 0DH,0AH,'-- Read Complete --',0DH,0AH,0 ; ; PRINT REST OF SIGNON MESSAGE ; SIGNON: LD DE,HEADER ;PRINT HEADER FROM INCLUDE FILE LD C,9 CALL BDOS CALL PSTRNG ;PRINT INITIAL INFO DEFB 0DH,0AH,'Type H for Help, ? for Stats',0DH,0AH,0 JR GETCMD ;PERFORM COMMAND PROCESSING ; ; CLEAN UP DASM AND COMPLETELY REINITIALIZE ; CLEAN: CALL INIT ;DO INITIALIZATION ; ; MAIN COMMAND PROCESSING LOOP ; GETCMD: XOR A ;A=0 LD (DWFLAG),A LD (WRTENAB),A ;DISABLE OUTPUT TO FILE LD (HUSH),A ;SET NOT QUIET LD (XCPTR),A LD (XCPTR+1),A LD SP,OLDST ;RESET STACK ; ; INPUT COMMAND LINE AND CAPITALIZE ; CALL PROMPT ;INPUT COMMAND LINE VIA BDOS ; ; PROCESS COMMAND LINE ; PRCEDE: LD A,(INBUF+2) ;PT TO FIRST CHAR OF COMMAND LINE LD B,A ;GET IT LD DE,CMDTABL ;PT TO COMMAND TABLE PRCLOOP: LD A,(DE) ;GET COMMAND FROM COMMAND TABLE OR A ;END OF TABLE IF 0 JR Z,WHAT ;TELL USER THAT COMMAND WAS INVALID INC DE ;PREP FOR NO MATCH INC DE ;...PT TO NEXT COMMAND INC DE CP B ;MATCH? JR NZ,PRCLOOP ;CONTINUE LOOPING IF NOT DEC DE ;PT TO ADDRESS LD A,(DE) ;GET ADR HIGH LD B,A ;... IN B DEC DE ;PT TO LOW LD A,(DE) ;GET ADR LOW LD C,A ;... IN C PUSH BC ;ADDRESS ON STACK RET ;"JUMP TO" COMMAND ; ; GENERAL ERROR ; WHAT: XOR A LD (WRTENAB),A LD (HUSH),A CALL PSTRNG DEFB 0DH,0AH,'** Command Error **',0DH,0AH,0 JR GETCMD ; ; COMMAND TABLE -- CONTAINS COMMAND LETTER FOLLOWED BY ADDRESS OF ROUTINE ; AND ENDS IN 0 AS THE NEXT COMMAND LETTER ; CMDTABL: DEFB 0DH ;EMPTY LINE DEFW GETCMD DEFB ';' ;COMMENTS DEFW CMNT DEFB 'A' ;BUILD ASCII DEFW ASCASM DEFB 'B' ;BUILD LABELS DEFW BLDASM DEFB 'C' ;CONTROL TABLE DEFW CTL DEFB 'D' ;MEMORY DUMP DEFW DUMP DEFB 'E' ;ENTER SYMBOL DEFW ENTER DEFB 'F' ;FIND LABEL DEFW FIND DEFB 'H' ;HELP DEFW HELP DEFB 'I' ;INCREMENT SYMBOL VALUES DEFW INCMNT DEFB 'K' ;KILL SYMBOL DEFW KILL DEFB 'L' ;LIST CODE DEFW LIST DEFB 'O' ;SET OFFSET DEFW SETOS DEFB 'P' ;GENERATE PROLOG DEFW PROLOG DEFB 'Q' ;QUIET MODE DEFW QUIET DEFB 'R' ;READ FILES DEFW READ DEFB 'S' ;SAVE FILES DEFW SAVE DEFB 'U' ;SET COMMENTS DEFW UAREA DEFB 'X' ;PURGE SYMBOLS AND CONTROL DEFW PURGE DEFB 'Z' ;CLOSE ASM FILE DEFW CLOSE DEFB '?' ;STATISTICS DISPLAY DEFW STAT DEFB 0 ;END OF COMMAND TABLE ; ;COMMAND:  H ; PRINT HELP INFORMATION ; HELP: CALL PSTRNG ;JUST ONE BIG PRINT ;LINE 1 DEFB 0DH,0AH,' HELP on DASM -- Command Summary' ;LINE 2 DEFB 0DH,0AH,';addr,comment Enter Comment at addr ' DEFB ';addr List comment at addr' ;LINE 3 DEFB 0DH,0AH,'; List Comments Table ' DEFB ';addr, Delete Comment' ;LINE 4 DEFB 0DH,0AH,'A (see L) Attempt to find DB''s ' DEFB 'B (see L) Build Symbol Table' ;LINE 5 DEFB 0DH,0AH,'C Dump Control Table ' DEFB 'Cnnnn Dump Ctrl Table at nnnn' ;LINE 6 DEFB 0DH,0AH,'Cnnnn,x Set Ctrl (x=BEHISW) ' DEFB 'Dnnnn Dump from nnnn on' ;LINE 7 DEFB 0DH,0AH,'Daaaa,bbbb Dump over range ' DEFB 'D,bbbb Dump thru bbbb' ;LINE 8 DEFB 0DH,0AH,'D Dump 80H more ' DEFB 'D=nn Set Dump Size Default' ;LINE 9 DEFB 0DH,0AH,'DS Dump the Symbol Table ' DEFB 'DS.symbol Dump starting at symbol' ;LINE 10 DEFB 0DH,0AH,'Ennnn,.symbol Enter symbol into table ' DEFB 'Fnnnn,ssss Find nnnn after ssss' ;LINE 11 DEFB 0DH,0AH,'F or Fnnnn Cont Find or Find nnnn ' DEFB 'Issss,oooo Inc addrs>=ssss by oooo' ;LINE 12 DEFB 0DH,0AH,'K.symbol Kill symbol from table ' DEFB 'L List next ' DEFB (INITLCNT/10)+'0',(INITLCNT MOD 10)+'0' DEFB ' lines' ;LINE 13 DEFB 0DH,0AH,'Lssss,eeee List over range ' DEFB 'L,eeee List to eeee' ;LINE 14 DEFB 0DH,0AH,'Lssss List ' DEFB (INITLCNT/10)+'0',(INITLCNT MOD 10)+'0' DEFB ' lines from ssss ' DEFB 'L=nn[,others] Set list default' ;LINE 15 DEFB 0DH,0AH,'O Print current offset ' DEFB 'Onnnn Set new offset' ;LINE 16 DEFB 0DH,0AH,'Pssss,eeee Generate program prolog ' DEFB 'Q Quiet prefix' ;LINE 17 DEFB 0DH,0AH,'Rfilename.COM Read file @ offset+100H ' DEFB 'Rfilename.CTL Read Control Table' ;LINE 18 DEFB 0DH,0AH,'Rfilename.SYM Read Symbol Table ' DEFB 'Rfilename.DOC Read Comments Table' ;LINE 19 DEFB 0DH,0AH,'Rfilename.ALL Read CTL, SYM, DOC, COM ' DEFB 'Sfilename.ASM Save ASM File' ;LINE 20 DEFB 0DH,0AH,'Sfilename.CTL Save CTL File ' DEFB 'Sfilename.SYM Save SYM File'  ;LINE 21 DEFB 0DH,0AH,'Sfilename.DOC Save DOC File ' DEFB 'Sfilename.ALL CTL, SYM, DOC, ASM' ;LINE 22 DEFB 0DH,0AH,'Unnnn Set Comment Table addr ' DEFB 'X Restart DASM' ;LINE 23 DEFB 0DH,0AH,'Z Write EOF to ASM File ' DEFB '? Print Statistics' ;LINE 24 DEFB 0DH,0AH,0 JP GETCMD ; ;COMMAND: X ; PURGE ALL SYMBOLS AND CONTROL ; PURGE: CALL PSTRNG ;PROMPT USER DEFB 'Restart DASM (Y/N)? ',0 CALL CHIN ;GET SINGLE CHAR AND CAP CP 'Y' JP NZ,GETCMD CALL PSTRNG ;PRINT FUNCTION DEFB 'Restarting DASM',0DH,0AH,0 JP CLEAN ;RESTART DASM AT INIT ; ; INPUT A SINGLE CHAR IN A VIA THE BDOS AND CAPITALIZE IT; FOLLOW WITH ; CHIN: LD C,1 ;GET CHAR FROM CON: CALL BDOS AND 5FH ;CAPITALIZE PUSH AF CALL CRLF POP AF RET ; ;COMMAND: P ; ENTER PROLOG INTO ASSEMBLY LANGUAGE PROGRAM ; PROLOG: LD HL,INBUF+3 ;PT TO STARTING ADDRESS LD A,(HL) ;NO ADDRESS SPECIFIED? CP 0DH ;ERROR IF SO JP Z,WHAT CALL CNVRT ;CONVERT ADDRESS VALUE TO BINARY IN DE CP ' ' ;CHAR AFTER ADDRESS = ? JR Z,PRLG0 ;CONT IF SO CP ',' ;CHAR AFTER ADDRESS = ','? JP NZ,WHAT ;ERROR IF NOT ',' OR PRLG0: INC HL ;PT TO 2ND ADDRESS PUSH DE ;SAVE FIRST ADDRESS ON STACK PUSH HL ;SAVE PTR TO 2ND ADDRESS CALL PSTRNG DB 'Please enter title + date-time',0DH,0AH,0 LD DE,RBUF ; SECOND INPUT BUFFER LD A,80 ; ALLOW 80 CHAR LD (DE),A LD C,10 CALL BDOS LD HL,RBUF+1 ; CHAR COUNT RET LD E,(HL) LD D,0 ADD HL,DE INC HL LD (HL),0DH ; PLACE CR AT END ; LD A,1 ; TURN ON DISK OUTPUT LD (WRTENAB),A ; LD HL,RBUF+2 LD A,(HL) CP 0DH ; IF CR NO TITLE JR Z,PRLG0R ; CALL PSTG DB 'TITLE',09,0 PRLG2R: LD A,(HL) CP 0DH ; END OF STRING? JR Z,PRLG1R CALL COUT INC HL JR PRLG2R PRLG1R: CALL PSTG DB 0DH,0AH,0 PRLG0R: CALL PSTG ;PRINT NEW ORG DEFB '.Z80',0DH,0AH,9,'ASEG',0DH,0AH,9,'ORG',9,0 POP HL POP DE LD A,D ;ORG AT FIRST ADDRESS CALL PASHEX ;PRINT AS 'nnH' LD A,E CALL PHEX LD A,'H' CALL COUT CALL CRLF PUSH DE ;SAVE FIRST ADDRESS CALL CNVRT ;GET 2ND ADDRESS IN DE CP 0DH ;ERROR IF JP NZ,WHAT POP BC ;BC=START ADDRESS, DE=END ADDRESS LD HL,SYMTAB ;PT TO SYMBOL TABLE PRLG1: INC HL ;SKIP OVER SYMBOL ADDRESS INC HL LD A,(HL) ;GET 1ST CHAR OF SYMBOL OR A ;END OF SYMBOL TABLE? (CHAR COUNT = 0) JP Z,GETCMD ;DONE IF SO DEC HL ;PT TO SYMBOL ADDRESS DEC HL LD A,(HL) ;COMPARE SYMBOL ADDRESS TO CURRENT ADDRESS SUB C ;... IN BC INC HL LD A,(HL) SBC A,B JR C,GENEQU ;GENERATE EQU IF SYMBOL < START ADDRESS DEC HL ;PT TO SYMBOL LOW-ORDER ADDRESS AGAIN LD A,(HL) ;COMPARE SYMBOL ADDRESS TO END ADDRESS SUB E INC HL LD A,(HL) SBC A,D JP C,WITHIN ;PROCESS NORMALLY IF START <= SYMBOL <= END ; ; SYMBOL IS NOT IN RANGE OF: ; START ADDRESS <= SYMBOL <= END ADDRESS ; GENERATE EQUATE FOR IT ; GENEQU: PUSH HL ;SAVE PTR TO SYMBOL PUSH BC ;SAVE START ADDRESS INC HL ;PT TO SYMBOL CHAR COUNT LD B,(HL) ;B=CHAR COUNT PUSH HL ;SAVE PTR TO CHAR COUNT I NC HL ;PT TO FIRST LETTER OF SYMBOL LD A,(HL) ;GET IT DEC HL ;PT BACK TO CHAR COUNT CP 'A' ;IF FIRST LETTER IS LESS THAN A, DON'T GENERATE 'EQU' JR C,PRLG3 ; ; SCAN SYMBOL FOR '+' OR '-' AND DON'T GENERATE 'EQU' IF IT CONTAINS ONE ; PRLG2: INC HL ;PT TO NEXT CHAR LD A,(HL) ;GET IT CP '+' ;CHECK JR Z,PRLG3 CP '-' ;CHECK JR Z,PRLG3 DJNZ PRLG2 ;LOOP POP HL ;GET PTR TO SYMBOL CHAR COUNT LD B,(HL) ;B=CHAR COUNT LD A,1 ;ENABLE DISK OUTPUT LD (WRTENAB),A ; ; PRINT SYMBOL EQUATE; HL PTS TO BYTE BEFORE SYMBOL AND B=NUMBER OF CHARS ; LOOPB: INC HL ;PT TO NEXT CHAR LD A,(HL) ;GET IT CALL COUT ;PRINT IT DJNZ LOOPB ;LOOP FOR NUMBER OF CHARS IN B CALL PSTG DB 9,'EQU',9,0 POP BC ;GET START ADR POP HL ;PT TO CHAR COUNT OF CURRENT SYMBOL LD A,(HL) CALL PASHEX DEC HL ;PT TO LOW-ORDER VALUE LD A,(HL) ;GET IT CALL PHEX ;PRINT IT LD A,'H' ;FOLLOWING 'H' FOR 'nnH' AND NEW LINE CALL COUT CALL CRLF XOR A ;DISABLE WRITE TO DISK LD (WRTENAB),A INC HL ;PT TO HIGH-ORDER VALUE OF SYMBOL ; ; SYMBOL IS WITHIN THE DESIRED RANGE (START <= SYMBOL <= END) ; WITHIN: INC HL ;PT TO CHAR COUNT OF SYMBOL LD A,(HL) ;GET IT CALL SKIP ;SKIP TO NEXT SYMBOL INC HL ;PT TO ITS ADDRESS CALL BRKCHK ;CHECK FOR BREAK JP PRLG1 ;CONTINUE GENERATING PROLOG ; ; SKIP CURRENT SYMBOL FOR ONE REASON OR ANOTHER ; PRLG3: POP HL ;RESTORE REGS AND CONTINUE POP BC POP HL JR WITHIN ; ;COMMAND: Q PREFIX ; EXECUTE THE COMMAND IN THE QUIET MODE ; QUIET: LD A,1 ;TURN ON QUIET MODE LD (HUSH),A LD DE,INBUF+2 ;COPY COMMAND LINE LEFT 1 CHARACTER LD HL,INBUF+3 SHFTBF: LD A,(HL) ;COPY IN ORDER TO CONTINUE PROCESSING LD (DE),A ;... NORMALLY INC HL INC DE CP 0DH JR NZ,SHFTBF JP PRCEDE ;RETURN TO MAIN COMMAND PROCESSOR ; ;COMMAND: D ; DUMP THE MEMORY, SYMBOL TABLE, OR SET THE DEFAULT DUMP LENGTH ; DUMP: LD HL,(DMPSTRT) ;GET PTR TO STARTING ADR FOR DUMP PUSH HL EX DE,HL ;... IN DE LD HL,(DMPLEN) ;GET DEFAULT LENGTH OF DUMP ADD HL,DE  ;CALCULATE END ADDRESS OF DUMP LD (DMPEND),HL ;SAVE IT POP DE LD HL,INBUF+3 ;LOOK AT COMMAND LINE LD A,(HL) ;GET CHAR AFTER THE 'D' CP 0DH ;IF , THEN DUMP FROM DMPSTRT TO DMPEND JP Z,DMPHDR CP 'S' ;IF S, THEN DUMP THE SYMBOL TABLE JP Z,DMPSYM CP '=' ;IF =, THEN SET THE DEFAULT DUMP LENGTH JP Z,DUMP5 CP ',' ;IF ',', THEN DUMP FROM CURRENT TO END SPEC JP Z,DUMP1 ; ; NUMBER SHOULD FOLLOW THE D -- PROCESS IT ; DUMP0: CALL CNVRT ;GET VALUE PUSH HL ;SAVE IT LD HL,(DMPLEN) ;GET DEFAULT LENGTH ADD HL,DE ;COMPUTE END OF DUMP LD (DMPEND),HL ;SAVE IT POP HL ;GET START ADDRESS OF DUMP ; ; CHECK FOR DELIMITER AFTER FIRST NUMBER ; DUMP1: CP 0DH ;IF , DUMP FOR THE DEFAULT LENGTH JR Z,DUMP3 CP ' ' ;IF , GET 2ND NUMBER JR Z,DUMP2 CP ',' ;IF ',', GET 2ND NUMBER JP NZ,WHAT ;ERROR IF NOT ; ; EXTRACT 2ND NUMBER FROM DUMP COMMAND ; DUMP2: INC HL ;PT TO NUMBER PUSH DE CALL CNVRT ;RETURN IT IN DE EX DE,HL LD (DMPEND),HL ;SET END ADDRESS OF DUMP POP DE ;GET START ADDRESS OF DUMP IN DE ; ; ADD OFFSET TO BEGINNING AND ENDING DUMP ADDRESSES ; ON INPUT, DE=START OF DUMP ADDRESS ; DUMP3: LD HL,(OFFSET) ;GET OFFSET PUSH HL ;SAVE IT ADD HL,DE ;ADD TO BEGINNING DUMP ADDRESS LD (DMPSTRT),HL ;SET PTR LD HL,(DMPEND) ;GET END ADDRESS OF DUMP POP DE ;GET OFFSET IN DE ADD HL,DE ;ADD OFFSET TO END ADDRESS OF DUMP LD (DMPEND),HL ;NEW END ADDRESS OF DUMP CP 0DH ;MAKE SURE AFTER DUMP COMMAND JP NZ,WHAT ;ERROR IF NOT ; ; PRINT HEADER FOR DUMP AND THEN PERFORM DUMP ; DMPHDR: CALL PSTRNG ;PRINT A HEADER FOR THE DUMP DEFB 'Addr +0 +2 +4 +6 +8 +A +C +E ASCII' DEFB 0DH,0AH,0 ; ; MAIN DUMP LOOP ; CNTDMP: LD HL,(DMPSTRT) ;GET START ADDRESS OF DUMP DUMP4: CALL BRKCHK ;CHECK FOR BREAK PUSH HL ;SAVE PTR TO NEXT BYTE CALL TWOS ;MAKE HL CONTAIN RELATIVE VALUE CALL PVALUE ;... BY SUBTRACTING OFFSET; THEN PRINT IT POP HL ;GET PTR PUSH HL ;SAVE PTR CALL SPACE ;PRINT A SPACE ; ; DUMP AS HEX ; DMPLN: LD A,(HL) ;GET BYTE CALL PHEX ;PRINT AS HEX INC HL ;PT TO NEXT LD A,L ;PRINT ONE SPACE FOR EVERY 2 VALUES AND 1 CALL Z,SPACE LD A,L ;PRINT TWO SPACES EVERY 4 AND 3 CALL Z,SPACE LD A,L ;PRINT THREE SPACES EVERY 8 AND 7 CALL Z,SPACE LD A,L ;CHECK FOR END OF DUMP LINE (EVERY 16) AND 0FH JR NZ,DMPLN LD A,'!' ;PRINT BEGINNING '!' CALL COUT POP HL ;GET PTR TO FIRST BYTE ; ; DUMP AS ASCII ; DMPASC: LD A,(HL) ;GET CHAR CP ' ' ;PRINT . IF LESS THAN JR C,PERIOD CP 7FH ;PRINT . IF GREATER THAN JR C,CHRCTR ; ; PRINT '.' ; PERIOD: LD A,'.' ; ; PRINT CHAR IN A AND ADVANCE FOR UP TO 16 CHARS ; CHRCTR: CALL COUT ;PRINT CHAR INC HL ;PT TO NEXT LD A,L ;END OF LINE? AND 0FH ;EVERY 16 JR Z,LCMPLT ;DONE IF SO AND 7 ;EXTRA SPACE FOR EVERY 8 CALL Z,SPACE JR DMPASC ;CONTINUE ASCII DUMP ; ; TIDY UP THE LINE ; LCMPLT: LD A,'!' ;PRINT ENDING '!' CALL COUT CALL CRLF ;NEW LINE LD (DMPST RT),HL ;COMPARE CURRENT START ADDRESS TO END ADDRESS LD A,(DMPEND) SUB L LD A,(DMPEND+1) SBC A,H JR NC,DUMP4 ;CONTINUE IF CURRENT START <= END JP GETCMD ;RETURN TO COMMAND PROCESSING OTHERWISE ; ; SET THE DEFAULT NUMBER OF BYTES TO DUMP ; DUMP5: INC HL ;PT TO VALUE CALL CNVRT ;RETURN VALUE IN DE INC HL DEC DE EX DE,HL LD (DMPLEN),HL ;SAVE VALUE EX DE,HL CP ',' JP Z,DUMP0 CP ' ' JP Z,DUMP0 CP 0DH JP Z,GETCMD JP WHAT ; ; DS -- DUMP THE SYMBOL TABLE ; DMPSYM: CALL IECNT ;INIT ECNT LD HL,INBUF+4 ;PT TO CHAR AFTER 'DS' LD A,(HL) ;GET IT CP '.' ;SYMBOL SPECIFIED? JR NZ,FRMBGN ;NO, SO DUMP FROM BEGINNING OF TABLE CALL LNGTH ;COMPUTE LENGTH OF GIVEN SYMBOL CALL PLCSYM ;RETURN PTR TO THIS SYMBOL IN HL JR NC,FRMSYM ;PROCESS NORMALLY IF FOUND LD HL,(SYMRKR) JR FRMSYM FRMBGN: LD HL,SYMTAB ;PT TO TABLE FRMSYM: LD E,(HL) ;GET ADDRESS OF SYMBOL IN DE INC HL LD D,(HL) INC HL LD A,(HL) ;GET LENGTH OF SYMBOL IN A OR A ;DONE IF LENGTH = 0 JP Z,SPITCR EX DE,HL ;PRINT VALUE OF SYMBOL CALL PVALUE EX DE,HL LD A,'=' ;PRINT = CALL COUT LD B,(HL) ;GET LENGTH OF SYMBOL IN B LD A,SYMMAX+1 ;COMPUTE DIFF FROM MAX SUB B LD C,A ;DIFFERENCE IN C (NUMBER OF SPACES AFTER SYM) INC HL ; ; PRINT THE SYMBOL PTED TO BY HL; B=NUMBER OF BYTES LONG THE SYMBOL IS ; SPIT: LD A,(HL) ;GET SYMBOL CHAR CALL COUT ;PRINT IT INC HL ;PT TO NEXT DJNZ SPIT ;UNTIL DONE ; ; PRINT TRAILING SPACES AFTER SYMBOL ; LD B,C ;SP COUNT IN B SPIT1: CALL SPACE DJNZ SPIT1 CALL SPCRLF ;NEW LINE CALL BRKCHK ;CHECK FOR BREAK JR FRMSYM ;CONTINUE ; ; PRINT AND EXIT ; SPITCR: CALL CRLF ;NEW LINE JP GETCMD ; ; COUNT DOWN ECNT AND OUTPUT ON ZERO ; SPCRLF: LD A,(ECNT) ;GET COUNT DEC A LD (ECNT),A RET NZ CALL CRLF ;NEW LINE ; ; INIT ECNT ; IECNT: LD A,4 ;SET 4 ENTRIES LD (ECNT),A RET ; ; PRINT THE VALUE OF THE OFFSET. ; PRNTOS: CALL PSTRNG DB 'Offset = ',0 LD HL,(OFFSET) ;GET IT AND PRINT IT CALL PVALUE CALL CRLF ;NEW LINE JP GETCMD ; ;COMMAND: O ; SET OR PRINT OFFSET ADDRESS ; SETOS: LD HL,INBUF+3 ;FORMAT: O c/r LD A,(HL) ;.. or Oxxxx c/r CP 0DH ;IF JUST O, DO IT VIA PRNTOS JR Z,PRNTOS CALL CNVRT ;GET VALUE IN DE CP 0DH ;ERROR? JP NZ,WHAT EX DE,HL ;SAVE AS OFFSET LD (OFFSET),HL CALL CRLF ;NEW LINE AND PRINT NEW VALUE JR PRNTOS ; ; SET UP THE FILE CONTROL BLOCK. ; SETFCB: LD A,(FOPEN) ;FILE OPEN? OR A ;0 IF NOT JP NZ,CANT LD (FCB),A ;SET DEFAULT DRIVE LD (FCB+12),A ;SET EXTENT NUMBER TO ZERO LD HL,INBUF+3 ;PT TO FIRST LETTER OF POSSIBLE FILE NAME LD A,(INBUF+4) ;GET SECOND LETTER CP ' ' ;ERROR IF JUST JP Z,WHAT CP ':' ;GET AND SET DRIVE IF ':' JR NZ,SMDRV LD A,(HL) ;GET SPECIFIED DRIVE SUB '@' ;CONVERT IT TO BINARY LD (FCB),A ;SET DRIVE NUMBER IN FCB INC HL INC HL ; ; WRITE FILE NAME AND TYPE INTO FCB ; SMDRV: LD DE,FCB+1 ;PT TO FILE NAME FIELD OF FCB LD B,8 CALL SLIDE ;PUT FILE NAME LD B,3 CALL SLIDE ;PUT FILE TYPE RET ; ; WRITE CHARS PTED TO BY HL INTO BUFFER PTED TO BY DE; WRITE AT MOST B ; CHARS, AND FILL THE BUFFER PTED TO BY DE ; SLIDE: LD A,(HL) ;GET NEXT CHAR CP 0DH ;DONE? JR Z,BLANK ;BLANK FILL IF SO INC HL ;PT TO NEXT CP '.' ;FILE TYPE FOLLOWS? JR Z,BLANK ;BLANK FILL IF SO LD (DE),A ;PUT CHAR INC DE ;PT TO NEXT DJNZ SLIDE ;COUNT DOWN ; ; CHECK FOR ERROR IF AFTER 8 CHARACTERS IN THE FILENAME ; AFTR8: LD A,(HL) ;GET NEXT CHAR CP 0DH ;OK IF RET Z CP '.' ;OK IF '.' INC HL ;PT TO NEXT AFTER '.' RET Z JR AFTR8 ; ; BLANK FILL FOR THE REMAINDER OF THE NAME ; BLANK: LD A,' ' ;GET LD (DE),A ;PUT IT INC DE ;PT TO NEXT DJNZ BLANK ;COUNT DOWN RET ; ;COMMAND: A ; BUILD ASCII STRINGS USING DB'S ; ASCASM: LD A,1 ;SET FLAG LD (ASCBLD),A XOR A ;TURN OFF BUILD BY B COMMAND LD (BUILD),A JR LIST1 ;PERFORM LIST ; ;COMMAND: B ; BUILD LABELS ; BLDASM: LD A,1 ;TURN ON BUILD BY B COMMAND LD (BUILD),A XOR A ;TURN OFF BUILD BY A COMMAND LD (ASCBLD),A JR LIST1 ; ;COMMAND: L ; DISASSEMBLE WITH THE 'L' OPTION ; LIST: XOR A ;TURN OFF A AND B FLAGS LD (BUILD),A LD (ASCBLD),A LIST1: XOR A ;DISABLE OUTPUT TO DISK LD (WRTENAB),A LD A,(NLINES) ;SET LINE COUNT LD (LCTR),A LD (CNTENAB),A ;ENABLE LINE COUNT LD HL,INBUF+3 ;PT TO CHAR AFTER L, A, OR B COMMAND LD A,(HL) ;GET IT CP 0DH ;DO DEFAULT NUMBER IF EOL JR Z,TENL CP ',' ;USE CURRENT POSITION FOR FIRST ARG IF ',' JR Z,LIST3 CP ' ' ;SAME AS ',' JR Z,LIST3 CP '=' ;SET DEFAULT NUMBER OF LINES IF '=' JR NZ,LIST2 ; ; SET DEFAULT NUMBER OF LINES FOR LIST ; NWLNCT: INC HL ;PT TO ARG CALL CNVRT ;GET IT IN DE LD A,E ;ERROR IF ZERO OR A JP Z,WHAT LD (NLINES),A ;SET COUNTS LD (LCTR),A LD A,(HL) ;GET NEXT CHAR INC HL CP ',' ;CONTINUE IF COMMA OR SPACE JR Z,LIST2 CP ' ' JR Z,LIST2 CP 0DH ;DONE IF JP Z,GETCMD JP WHAT ;ERROR OTHERWISE ; ; GET FIRST ARG FOR L, A, OR B FRO M COMMAND LINE ; LIST2: CALL CNVRT ;GET VALUE IN DE EX DE,HL LD (PC),HL ;SET PC TO IT EX DE,HL CP 0DH ;DONE? JR Z,TENL ;DO DEFAULT NUMBER IF SO CP ' ' ;GET 2ND ARG IF JR Z,LIST3 CP ',' ;SAME IF ',' JP NZ,WHAT ;ERROR OTHERWISE ; ; GET 2ND ARG FOR L, A, OR B COMMAND ; LIST3: INC HL ;PT TO FIRST CHAR OF 2ND ARG CALL CNVRT ;GET ITS VALUE IN DE EX DE,HL LD (ENDLST),HL ;SET END OF LISTING TO IT XOR A ;TURN OFF LINE COUNTING LD (CNTENAB),A ; ; MAIN PROCESSING LOOP FOR L, A, AND B COMMANDS ; TENL: CALL BRKCHK ;CHECK FOR BREAK LD A,(CNTENAB) ;CHECK FOR LINE COUNTING IN PROGRESS OR A ;0 = NO JR Z,CONTL ;CONTINUE IF NOT LD A,(LCTR) ;GET COUNT DEC A ;COUNT DOWN JP M,GETCMD ;RETURN TO COMMAND PROCESSING IF DONE JR FLAGA ; ; COMPARE ENDLST WITH PC ; CONTL: LD HL,(ENDLST) ;DONE WITH DISPLAY? LD A,(PC) SUB L LD A,(PC+1) SBC A,H JP NC,GETCMD ; ; CHECK FOR A OR B COMMANDS ; FLAGA: LD A,(ASCBLD) ;A COMMAND IF ASCBLD NOT ZERO OR A JR Z,MOREL ; ; THIS IS THE MAJOR FUNCTION TO BUILD ASCII DB'S ; BUILDA: LD HL,(PC) ;HL PTS TO NEXT BYTE (RELATIVE) EX DE,HL ;PTR IN DE LD HL,(OFFSET) ;HL CONTAINS OFFSET ADD HL,DE ;HL PTS TO NEXT BYTE ABSOLUTE LD B,8 ;LOOK FOR 8 ASCII CHARS IN A ROW LOOP8: LD A,(HL) ;CHECK FOR ASCII CHAR CALL ISITASC ;IS IT ASCII? JR C,MOREL ;NO, SKIP TO NEXT BYTE INC HL ;YES, PT TO NEXT DJNZ LOOP8 ; ; FIND END OF THIS ASCII STRING ; FOLLOW: LD A,(HL) ;LOOK UNTIL NON-ASCII INC HL ;PT TO NEXT CALL ISITASC JR NC,FOLLOW DEC HL ;PT TO NON-ASCII CHAR CALL TWOS ;SUBTRACT OFFSET FROM LOCATION EX DE,HL ;RESULT IN DE PUSH DE ;SAVE PTR TO BYTE AFTER DB STRING FOR 'I' CONTROL LD HL,(PC) ;GET VALUE OF BEGINNING OF ASCII STRING EX DE,HL ;... IN DE LD A,'B' ;SET B CONTROL POINT CALL FTCTL0 ;A='B', DE=ADDRESS POP HL LD (PC),HL ;SET NEW ADDRESS TO CONTINUE FROM EX DE,HL LD A,'I' ;A='I', DE=ADDRESS FOR INSTR CONTROL CALL FTCTL0 ; ; NOW LOOK FOR ANY COMMENTS AT THIS ADDRESS ; MOREL: LD HL,(COMST) ;COMMENT TABLE IN USE? LD A,H ;ADDRESS IS ZERO IF NOT OR L JR Z,NCMT LD HL,(PC) ;HL PTS TO PC EX DE,HL ;DE PTS TO PC CALL CMCHK ;CHECK COMMENT TABLE FOR MATCH JR C,NCMT ;NO MATCH INC HL ;PT TO CHAR COUNT OF COMMENT INC HL LD B,(HL) ;B=NUMBER OF CHARS IN COMMENT INC HL ;PT TO FIRST CHARACTER LD A,(HL) ;A=FIRST CHAR OF COMMENT CP ';' ;A ';' COMMENT IS LISTED AFTER THE OPCODE DEC HL ;PT BACK TO CHAR COUNT JR NZ,MOREL1 ;CONTINUE IF NO ';' LD (XCPTR),HL ;SAVE THE COMMENT ADDRESS JR NCMT ; ; THIS ROUTINE WILL ; PRINT COMMENTS ; LIKE THIS ; NWLN: SCF NWLN0: LD A,1 ;ENABLE WRITING LD (WRTENAB),A CALL C,SEMI ;OUTPUT SEMI BEFORE NEW COMMENT XOR A OR B ;CHECK CHAR COUNT FOR DONE RET Z ;DONE IF ZERO CHARS LEFT CNTCMT: INC HL ;PT TO NEXT CHAR LD A,(HL) ;GET IT CP '\' ;NEW LINE? JR NZ,NTBKSL CALL CRLF ;NEW LINE DEC B ;DEC CHAR COUNT JR NWLN ;CONT NTBKSL: CALL COUT ;PRINT CHAR DEC B ;DECREMENT COUNT JR NZ,CNTCMT RET MOREL1: CP '*' ; A '*' COMMENT REPLACES THE ENTIRE LINE JR NZ,MOREL2 LD (RPLPTR),HL JR NCMT ; ; PRINT COMMENT PTED TO BY HL AND THEN NEW LINE ; MOREL2: CALL NWLN ;PRINT COMMENT CALL CRLF ; ; NOW PROCESS THE BYTE AS AN INSTRUCTION IF IT IS ; NCMT: LD HL,(PC) ;PT TO PC EX DE,HL ;... IN DE CALL SCHCTL ;CHECK CONTROL TABLE DEC HL ;PT TO CONTROL MODE OF PREVIOUS ENTRY JR C,RDCTL ;IF NO MATCH, CONTROL MODE OF PREVIOUS ENTRY IS IT INC HL ;SINCE MATCH, PT TO CONTROL MODE OF MATCHED ENTRY INC HL INC HL ; ; CHECK CONTROL MODE ; RDCTL: LD A,(HL) ;GET CONTROL MODE CP 'I' ;IS IT INSTRUCTION? JR Z,ICTL ;PROCESS IF SO CP 'E' ;END OF PROGRAM? JP Z,CLOSE ;DONE IF SO PUSH AF ;ELSE SAVE CONTROL MODE INC HL ;PT TO ADDRESS OF NEXT CONTROL MODE LD E,(HL) ;ADDRESS IN DE INC HL LD D,(HL) PUSH DE ;SAVE ADDRESS OF NEXT CONTROL ENTRY LD HL,(PC) ;PT TO PC EX DE,HL ;... IN DE CALL HSYM ;PRINT SYMBOL IF THERE POP HL ;HL IS ADDRESS OF NEXT CONTROL ENTRY LD (NXTCTL),HL ;SAVE IT EX DE,HL ;... IN DE ALSO XOR A ;DISABLE WRITE LD (WRTENAB),A POP AF ;GET CONTROL MODE CP 'S' ;DS? JP Z,DSMODE CP 'B' ;DB? JP Z,BMODE CP 'H' ;DB HEX? JP Z,HMODE CP 'W' ;DW? JP Z,WMODE CALL COUT ;ELSE PRINT AS ERROR CALL PSTRNG DEFB ': Invalid CTL Entry',0DH,0AH,0 JP GETCMD ; ; EXECUTE HERE IF THE 'I' CTL IS IN EFFECT -- INTERPRET AS INSTRUCTION ; DE PTS TO BYTE WHICH IS BEING PROCESSED ; ICTL: CALL DASM ;INVOKE DISASSEMBLER XOR A ;DISABLE WRITE LD (WRTENAB),A JP TENL ; ; DS CTL -- DE CONTAIN NEXT CTL ADDRESS ; DSMODE: PUSH DE ;SAVE NEXT CONTROL LD A,(PC) ;COMPUTE -PC IN HL CPL LD L,A LD A,(PC+1) CPL LD H,A INC HL ADD HL,DE ;HL = LENGTH OF SPACE DEFINED LD A,1 ;ENABLE WRITING LD (WRTENAB),A CALL PSTG ;PRINT 'DS' DEFB 'DS',9,0 LD A,H ;PRINT SIZE OF AREA CALL PASHEX LD A,L CALL PHEX LD A,'H' CALL COUT CALL CRLF POP HL ;GET PTR TO NEXT CONTROL ENTRY LD (PC),HL ;SET PC TO IT JP TENL ;CONTINUE ; ; DW CTL  -- PROCESS DW AND LOOK FOR LABELS ; WMODE: LD A,1 ;ENABLE WRITING LD (WRTENAB),A CALL PSTG ;PRINT 'DW' DEFB 'DW',9,0 LD HL,(PC) ;GET PC EX DE,HL ;... IN DE LD HL,(OFFSET) ;GET OFFSET ADD HL,DE ;HL PTS TO ACTUAL BYTE PAIR LD E,(HL) ;SET DE TO DW VALUE INC HL LD D,(HL) CALL PRNTDE ;PRINT DW VALUE CALL CRLF LD HL,(PC) ;ADVANCE PC TO BYTE AFTER DW VALUE INC HL INC HL LD (PC),HL JP TENL ;CONTINUE PROCESSING ; ; NEW LINE AND CONTINUE ; STPLN: CALL CRLF JP TENL ; ; DB HEX MODE -- BUILD HEX DB'S ; HMODE: XOR A ;SET FLAG LD (ADB),A JR BMODE1 ; ; DB MODE -- BUILD ASCII STRINGS LONGER THAN 8 CHARACTERS ; BMODE: LD A,0FFH ;SET FLAG FOR ASCII LD (ADB),A BMODE1: XOR A ;INIT LENGTH TO ZERO LD (BLNGTH),A INC A ;ENABLE WRITING LD (WRTENAB),A CALL PSTG ;PRINT 'DB' DEFB 'DB',9,0 ; ; PROCESS BYTES OF DB ; MOREB: LD HL,(PC) ;GET RELATIVE ADDRESS EX DE,HL ;... IN DE LD HL,(OFFSET) ;GET OFFSET ADD HL,DE ;PT TO ACTUAL BYTE LD A,(ADB) ;CHECK FOR ASCII BUILD OR A ;0=NO LD A,(HL) ;GET BYTE OF DB JR Z,LTSPC ;XXH BUILD CP 0AH ;? JR C,LTLF ;PROCESS IF LESS THAN CP ' ' ; JR C,LTSPC ;PROCESS IF LESS THAN CP 7FH ;? JP C,LTRUB ;PROCESS IF GREATER THAN ; ; PRINT BYTE AS HEX NUMBER ; LTSPC: CALL PASHEX ;PRINT BYTE IN A AS HEX LD A,'H' CALL COUT LD A,(BLNGTH) ;INCREASE LENGTH BY 2 ADD A,2 LD (BLNGTH),A JR MVUP ; ; CHAR IS LESS THAN -- MAKE IT SINGLE DIGIT (LIKE 9 FOR TAB) ; LTLF: OR '0' ;MASK FOR ASCII CALL COUT ;PRINT DIGIT ; ; ADVANCE TO NEXT BYTE ; MVUP: INC HL ;PT TO NEXT BYTE EX DE,HL ;... IN DE LD HL,(PC) ;PT TO PC INC HL ;ADVANCE PC LD (PC),HL EX DE,HL ;DE PTS TO PC, HL PTS TO NEXT BYTE ; ; CHECK TO SEE IF THE NEXT CONTROL POINT BEEN REACHED ; CNXCTL: LD A,(NXTCTL) ;COMPARE AGAINST PC CP E JR NZ,TRYSYM LD A,(NXTCTL+1) CP D JP Z,QTB ; ; SEE IF WE ARE POINTING TO A SYMBOL'S ADDRESS ; TRYSYM: LD HL,(PC) ;PC IN DE EX DE,HL CALL SYMSCH ;LOOK FOR SYMBOL JP NC,STPLN ;NEW LINE IF THERE IS A SYMBOL LD A,(BLNGTH) ;INCREASE LINE BY 2 ADD A,2 LD (BLNGTH),A CP 27 JP NC,STPLN ;NEW LINE IF STRING EXCEEDS 27 CHARS LD A,',' ;SEPARATE BY COMMA OTHERWISE CALL COUT JP MOREB ; ; VALID CHAR ... BEGIN PROCESSING AS QUOTED STRING ; LTRUB: LD A,'''' ;OUTPUT QUOTE CALL COUT LD A,(BLNGTH) ;INC LENGTH INC A LD (BLNGTH),A LD A,(HL) ;GET CHAR ; ; OUTPUT AS ASCII CHARS ; MORASC: CALL COUT ;PRINT CHAR LD A,(HL) ;CHECK FOR QUOTE CP '''' ;COMPARE CALL Z,COUT ;DOUBLE QUOTE INC HL ;PT TO NEXT CHAR EX DE,HL ;... IN DE LD HL,(PC) ;INCR PC INC HL LD (PC),HL EX DE,HL ;DE=NEXT PC LD A,(NXTCTL) ;CHECK FOR CONTROL CP E JR NZ,YET LD A,(NXTCTL+1) CP D JR Z,FNLQT ; ; CHECK FOR SYMBOL HERE ; YET: PUSH HL LD HL,(PC) EX DE,HL CALL SYMSCH POP HL JR NC,FNLQT ;OUTPUT ENDING QUOTE AND NEW LINE FOR SYMBOL LD A,(BLNGTH) ; BREAK INC A ;INCR LINE LENGTH ; ; KEEP THE LINES LESS THAN 27 LONG ; LD (BLNGTH),A CP 35 JR NC,LASTQT CP 27 JR C,STILL ; ; OVER 17H CHARACTERS HAVE BEEN QUOTED ; DEC HL LD A,(HL) INC HL CP ' ' JR Z,FNLQT STILL: LD A,(HL) CP ' ' JR C,LASTQT CP 7FH JP C,MORASC ; ; PRINT A TRAILING QUOTE ; LASTQT: LD A,'''' ;PRINT QUOTE CALL COUT JP CNXCTL ; ; PRINT ENDING QUOTE AND NEW LINE ; FNLQT: LD A,'''' CALL COUT QTB: CALL CRLF JP TENL ; ;COMMAND: I

, ; INCREMENT SYMBOL TABLE ADDRESSES AFTER AND ON
BY ; FOR DISASSEMBLY OF NEW VERSIONS OF PROGRAMS ; INCMNT: LD HL,INBUF+3 ;LOOK AT COMMAND LINE LD A,(HL) ;GET CHAR AFTER 'I' CP 0DH ;ERROR IF EOL JP Z,WHAT CALL CNVRT ;GET FIRST VALUE IN DE PUSH DE ;SAVE STARTING ADDRESS ON STACK CP ' ' ;CHECK FOR VALID DELIMITER JR Z,INCM1 CP ',' ;' ' OR ',' DELIMITER JP NZ,WHAT INCM1: INC HL ;PT TO FIRST CHAR AFTER DELIMITER CALL CNVRT ;GET OFFSET IN DE CP 0DH ;MUST BE EOL NOW JP NZ,WHAT LD B,D ;BC=OFFSET LD C,E POP DE ;DE=START ADDRESS LD HL,SYMTAB ;PT TO TABLE ; MAJOR LOOP FOR SCANNING SYMBOL TABLE -- HL PTS TO LOW SYM ADDRESS BYTE INCM2: INC HL ;PT TO HI SYM ADDRESS LD A,(HL) ;GET HI DEC HL ;PT TO LOW SYM ADDRESS CP D ;COMPARE JR C,INCM4 ;SKIP SYMBOL ENTRY JR NZ,INCM3 ;SYMBOL IS GREATER SO ADD OFFSET TO IT LD A,(HL) ;GET LOW CP E ;COMPARE JR C,INCM4 ;SKIP SYMBOL ENTRY ; ADD OFFSET TO SYMBOL ADDRESS PTED TO BY HL INCM3: LD A,(HL) ;GET LOW ADDRESS BYTE ADD A,C ;ADD LOW OFFSET BYTE LD (HL),A ;PUT LOW ADDRESS BYTE INC HL ;PT TO HI ADDRESS BYTE LD A,(HL) ;GET HIGH ADDRESS BYTE ADC A,B ;ADD HI OFFSET BYTE LD (HL),A ;PUT HI ADDRESS BYTE DEC HL ;PT TO LOW ADDRESS BYTE ; SKIP TO NEXT SYMBOL -- HL PTS TO LOW ADDRESS BYTE INCM4: INC HL ;PT TO HI ADDRESS INC HL ;PT TO CHAR COUNT LD A,(HL) ;GET CHAR COUNT OR A ;DONE IF ZERO JP Z,GETCMD INC HL ;PT TO FIRST CHAR OF SYMBOL ADD A,L ;ADD SYMBOL LENGTH TO HL LD L,A LD A,0 ;ADD IN HI NOW ADC A,H LD H,A ;HL PTS TO FIRST BYTE OF NEXT SYMBOL JR INCM2 ;CONTINUE PROCESSING ; ;COMMAND: ? ; STATISTIC OUTPUT ; STAT: CALL PSTRNG ;THIS IS RATHER STRAIGHT-FORWARD, SO FEW COMMENTS DEFB 'Scratch Area Start = ',0 LD HL,ENDALL CALL PVALUE ;PRINT VALUE CALL PSTRNG DEFB 0DH,0AH DEFB 'Scratch Area End = ',0 LD HL,(6) LD L,0 CALL PVALUE ;print the beginning of BDOS (not CCP) CALL PSTRNG DEFB 0DH,0AH,0AH DEFB 'COM Start = 0100',0dh,0ah DEFB 'COM End = ',0 LD HL,(RELEND) ;GET END ADDRESS CALL PVALUE CALL PSTRNG DEFB 0DH,0AH,0AH DEFB 'SYMTBL = ',0 LD HL,SYMTAB CALL PVALUE LD HL,(SYMEND) CALL PVALUE CALL CRLF CALL PSTRNG DEFB 'PC = ',0 LD HL,(PC) CALL PVALUE CALL CRLF CALL PSTRNG DEFB 'OFFSET = ',0 LD HL,(OFFSET) CALL PVALUE CALL CRLF LD HL,(COMST) LD A,H OR L JR Z,CTLSTT CALL PSTRNG DEFB 'COMNTS = ',0 LD HL,(COMST) CALL PVALUE LD HL,(COMEND) CALL PVALUE CALL CRLF CTLSTT: CALL CTLST CALL CMNTST JP GETCMD ; ; PRINT PARAMETERS OF CONTROL TABLE ; CTLST: CALL PSTRNG ;PRINT THE START AND END OF CONTROL TABLE DEFB 'CTLTBL = ',0 LD HL,CTLTBL CALL PVALUE ; ; FIND THE END OF THE CTLTBL (FF,FF) ; FNDEND: LD A,(HL) ;GET FIRST BYTE INC HL ;PT TO NEXT AND (HL) ;AND IT IN ... IF BOTH ARE 0FFH, RESULT IS 0FFH INC HL ;PT TO CTL LETTER INC HL ;PT TO NEXT BYTE OF ADDRESS INC A ;IF RESULT WAS 0FFH, A NOW EQUALS 0 JR NZ,FNDEND ;CONTINUE UNTIL A=0 DEC HL ;BACK UP TO PREVIOUS ENTRY (END OF TABLE) DEC HL DEC HL CALL PVALUE ;PRINT THE VALUE 0FFFFH JP CRLF ; ; PRINT THE STATUS MESSAGE OF THE SYMBOL COMMENTS FACILITY ; CMNTST: CALL PSTRNG ;PRINT THE STATUS OF SYMBOL COMMENTS DEFB 'Symbol Comments are O',0 LD A,(XCSW) OR A LD A,'N' JR NZ,CMTST1 LD A,'F' CALL COUT CMTST1: CALL COUT JP CRLF ; ;COMMAND: F ; FIND THE OCCURRENCE OF ADDRESSES ; FIND: LD HL,INBUF+3 LD A,(HL) CP 0DH ;CHECK FOR NO FURTHER ARGS JR Z,PREVF CALL CNVRT ;GET ARG IN DE EX DE,HL ; ... IN HL  LD (FNDADD),HL ;ADDRESS TO LOOK FOR LD HL,(OFFSET) ;GET OFFSET LD (FNDPC),HL ;SET START OF SEARCH ADDRESS EX DE,HL ;RESTORE HL TO PT TO CHAR IN COMMAND LINE CP 0DH ;DONE? JR Z,PREVF CP ' ' ; OR ',' MEAN TO CONTINUE JR Z,FIND0 CP ',' JP NZ,WHAT FIND0: INC HL CALL CNVRT ;GET 2ND ARG FOR FIND CP 0DH JP NZ,WHAT LD HL,(OFFSET) ;SET THIS AS STARTING ADDRESS ADD HL,DE ;WITH PROPER OFFSET LD (FNDPC),HL ;START LOOKING FROM HERE ; ; CONTINUE THE PREVIOUS 'F' COMMAND ; PREVF: LD HL,(FNDADD) ;GET ADDRESS WE ARE LOOKING FOR EX DE,HL ;... IN DE NYET: CALL BRKCHK ;CHECK FOR BREAK LD HL,(FNDPC) ;PT TO PC LD A,(HL) ;GET BYTE AT PC INC HL ;PT TO NEXT LD (FNDPC),HL CP E ;COMPARE BYTE WITH ADDRESS WE ARE LOOKING FOR JR NZ,NYET LD A,(HL) ;PARTIAL MATCH -- TRY HIGH BYTE CP D JR NZ,NYET ; ; WE FOUND ADDRESS IN MEMORY -- PRINT DATA ; PUSH HL PUSH DE CALL TWOS DEC HL CALL PVALUE ;PRINT LOCATION OF FOUND ADDRESS (RELATIVE) POP DE POP HL CALL SPACE ;PRINT JR NYET ; ; HL=HL-OFFSET ; TAKE 2'S COMPLEMENT OF OFFSET AND ADD TO H & L. ; TWOS: LD A,(OFFSET) ;GET 2'S COMP OF OFFSET IN DE CPL LD E,A LD A,(OFFSET+1) CPL LD D,A INC DE ADD HL,DE ;HL=HL+DE RET ; ;COMMAND: Z ; CLOSE THE FILE ; CLOSE: CALL HSYM LD A,1 ;ENABLE WRITING TO DISK FILE LD (WRTENAB),A CALL PSTG ;WRITE END STATEMENT DEFB 'END',0DH,0AH,0 XOR A ;DISABLE WRITING TO FILE LD (WRTENAB),A LD A,(FOPEN) ;CHECK IF FILE WAS OPEN OR A JP Z,GETCMD LD A,1AH ;FILL WITH ^Z CALL WRTFILE CALL NXTRCRD XOR A ;CLOSE FILE LD (FOPEN),A CALL PSTRNG ;PRINT MESSAGE DEFB '++ MAC File Closed ++',0DH,0AH,0 JP GETCMD ; ;COMMAND: R ; READ A FILE OR FILES ; READ: CALL SETFCB ;LOAD THE FCB WITH THE PROPER FILE NAME AND TYPE LD A,(FOPEN) ;CHECK TO SEE IF A FILE IS ALREADY OPENED OR A JP NZ,CANT ;ABORT IF SO LD HL,FCBTYPE ;CHECK FILE TYPE LD DE,TPALL ;IS IT 'ALL'? LD C,3 CALL CHKSTG JP NZ,NOTALL ;PROCEED IF NOT ; ; READ IN DOC, SYM, CTL FILES ; CALL ALLRD ;READ IN ALL FILES JP STAT ;PRINT STATISTICS ; ; READ IN ALL FILES -- COMMON ROUTINE ; ALLRD: LD HL,TPDOC ;SET FILE TYPE TO DOC CALL FIXTYP CALL PSTRNG ;TELL USER WHAT IS HAPPENING DEFB 0dh,0ah DEFB 'Reading DOC file...',0dh,0ah,0 CALL DOCRD ;READ FILE IN LD HL,TPSYM ;SET FILE TYPE TO SYM CALL FIXTYP CALL PSTRNG ;TELL USER WHAT IS HAPPENING DEFB 'Reading SYM file...',0dh,0ah,0 CALL SYMRD ;READ FILE IN LD HL,TPCTL ;SET FILE TYPE TO CTL CALL FIXTYP CALL PSTRNG ;TELL USER WHAT IS HAPPENING DEFB 'Reading CTL file...',0dh,0ah,0 CALL CTLRD ;READ FILE IN IF RDCOMQ ;ENABLE QUESTION OF COM FILE READ? CALL PSTRNG DEFB 'Read in COM File (Y/N)? ',0 CALL CHIN ;GET RESPONSE CP 'Y' JP NZ,STAT ;PRINT STATISTICS ENDIF LD HL,TPCOM ;SET FILE TYPE TO COM CALL FIXTYP CALL PSTRNG ;TELL USER WHAT IS HAPPENING DEFB 'Reading COM file...',0dh,0ah,0 CALL COMRD ;READ FILE IN RET ; ; SET THE FILE TYPE TO THAT PTED TO BY HL ; FIXTYP: LD DE,FCBTYPE LD B,3 XOR A LD (FCB+0CH),A ;zero the extent byte JP SLIDE ; ; FILE TYPE WAS NOT 'ALL', SO CHECK TO SEE WHAT TYPE IT WAS AND PROCESS ; NOTALL: LD HL,FCBTYPE ;CHECK FOR SYM LD DE,TPSYM LD C,3 CALL CHKSTG JR NZ,NOTSYM CALL SYMRD ;READ SYM FILE JP STAT ;PRINT STATS NOTSYM: LD HL,FCBTYPE ;CHECK FOR COM LD DE,TPCOM LD C,3 CALL CHKSTG JP NZ,NOTCOM CALL COMRD ;READ IN A COM FILE JP GETCMD ;CONTINUE COMMAND LINE PROCESSING ; ; READ IN COM FILE ; COMRD: CALL RDOPEN ;OPEN COM FILE FOR READ LD HL,(OFFSET) ;HL=OFFSET LD A,H CP (SYMTAB+600H) SHR 8 ;CHECK FOR NO OVERWRITE OF SYMTABLE JP C,OSERR LD DE,0100H ;SET DMA ADDRESS TO OFFSET PLUS 100H ADD HL,DE SETDMA: PUSH HL ;SET THE DMA ADDRESS. EX DE,HL LD C,1AH CALL BDOS LD DE,FCB ;READ A RECORD. LD C,14H CALL BDOS OR A ;DONE? JR NZ,RDCMPLT POP HL LD DE,RECLEN ;PT TO NEXT BLOCK FOR READ ADD HL,DE JP SETDMA ;CONTINUE ; ; DONE WITH LOAD OF COM FILE ; RDCMPLT: POP HL ;GET DMA ADDRESS OF LAST READ CALL PSTRNG DEFB 'Last Block Read into Memory at ',0 CALL PVALUE CALL PSTRNG DEFB 0DH,0AH DEFB 'Last Block Ends at Relative ',0 CALL TWOS LD (RELEND),HL ;SAVE RELATIVE END ADDRESS CALL PVALUE CALL CRLF LD DE,RECLEN ;RESET THE DMA ADDRESS TO 80H LD C,1AH CALL BDOS RET ; ; THE READ IS NOT A .SYM OR A .COM FILE ; NOTCOM: LD HL,FCBTYPE ;CHECK FOR CTL FILE LD DE,TPCTL LD C,3 CALL CHKSTG JR NZ,NOTCTL JP ISCTL ;READ IN CTL FILE NOTCTL: LD HL,FCBTYPE ;CHECK FOR DOC FILE LD DE,TPDOC LD C,3 CALL CHKSTG JP NZ,WHAT ;ERROR IF NOT COM, SYM, CTL, OR DOC CALL DOCRD ;READ IN DOC FILE JP STAT ; ; ERROR -- ATTEMPT TO OVERLAY THE SYMBOL TABLE OR DISASSEMBLER ; OSERR: CALL PSTRNG DEFB '++ NO, that would overlay ' DEFB 'the Disassembler',0DH,0AH DEFB 'because the Offset is too small: ' DEFB 0 CALL PRNTOS CALL PSTRNG DEFB ' ++',0DH,0AH,0 RET ; ; READ THE SYMBOL TABLE FROM DISK ; SYMRD: LD HL,SYMTAB ;PT TO SYMBOL TABLE CALL READFILE ;READ FILE INTO IT LD (SYMEND),HL ;SET END ADDRESS OF SYMBOL TABL INC HL ;PT TO NEXT SYMBOL CHAR COUNT INC HL LD (HL),0 ;SET CHAR COUNT TO ZERO RET ; ; READ THE DOC (COMMENTS) FILE FROM DISK ; DOCRD: CALL AREACK ;MAKE SURE COMMENTS AREA DEFINED LD HL,(COMST) ;PT TO START OF COMMENTS AREA CALL READFILE ;READ FILE IN LD (COMEND),HL ;SET END OF COMMENTS AREA LD (HL),0FFH ;STORE 0FFFFH AS ADDRESS OF NEXT COMMENT INC HL LD (HL),0FFH RET ; ; READ FILE SET IN FCB INTO MEMORY PTED TO BY HL ; READFILE: CALL RDOPEN ;OPEN FILE RDFL1: CALL READMA ;READ NEXT BYTE (RETURNED IN A) CP 1AH ;RETURN IF EOF EACHED RET Z CP 9 ;IGNORE , , JR Z,RDFL1 CP 0DH JR Z,RDFL1 CP 0AH JR Z,RDFL1 CALL NUM1 ;CONVERT FROM HEX CHARS TO VALUE IN DE LD (HL),E ;SAVE THE ADDRESS INC HL LD (HL),D INC HL PUSH HL INC HL LD B,0 ;COUNT CHARS IN SYMBOL SYMLUP: CALL READMA ;GET NEXT BYTE CP 9 ;DONE IF  OR JR Z,SYMTERM CP 0DH JR Z,SYMTERM LD (HL),A ;STORE BYTE INC HL ;PT TO NEXT INC B ;INCR CHAR COUNT JR SYMLUP SYMTERM: EX (SP),HL LD (HL),B POP HL JP RDFL1 ; ; READ NUMBER FROM DISK FILE (1ST HEX DIGIT IN A ON ENTRY) ; VALUE RETURNED IN DE ; NUM1: LD DE,0 ;INIT NUMBER TO ZERO LUP1: CP ' ' ;DONE IF RET Z CP 1AH ;ERROR IF EOF JP Z,ERROR1 CP '9'+1 ;WITHIN DIGIT RANGE? JR C,NUMER1 ;IS A DIGIT SUB 7 ;CONVERT 'A' TO 'F' TO '9'+1 TO 'E'+1 NUMER1: SUB '0' ;CONVERT TO BINARY IN A EX DE,HL ;OLD VALUE IN HL ADD HL,HL ;*2 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 ADD A,L ;+A LD L,A ;ONLY CHANGES LOW-ORDER BYTE EX DE,HL ;VALUE BACK IN DE CALL READMA CP 1AH JP Z,ERROR1 JR LUP1 ; ;COMMAND: S ; SAVE THE FILES ; SAVE: CALL SETFCB ;LOAD THE FCB FROM THE COMMAND LINE LD A,(FOPEN) ;CHECK FOR FILE ALREADY OPEN OR A ;ABORT IF SO JP NZ,CANT LD HL,FCBTYPE ;CHECK FOR TYPE OF 'ALL' LD DE,TPALL LD C,3 CALL CHKSTG JP NZ,NTALL ;CHECK FOR SPECIFIC TYPE IF NOT ALL LD HL,TPDOC ;SAVE DOC FILE CALL FIXTYP CALL PSTRNG DEFB 0dh,0ah DEFB 'Saving .DOC file...',0dh,0ah,0 CALL DOCSV LD HL,TPSYM ;SAVE SYM FILE CALL FIXTYP CALL PSTRNG DEFB 'Saving .SYM file...',0dh,0ah,00 CALL SYMSV LD HL,TPCTL ;SAVE CTL FILE CALL FIXTYP CALL PSTRNG DEFB 'Saving .CTL file...',0dh,0ah,0 CALL SVCTL0 CALL PSTRNG ;OPTIONALLY SAVE ASM FILE DEFB 'Create a New .MAC File (Y/N)? ',0 CALL CHIN ;GET CHAR CP 'Y' JP NZ,GETCMD LD HL,TPASM ;SAVE ASM FILE CALL FIXTYP ; ; SAVE THE MAC FILE ; SVASM: LD A,1 ;MARK FILE AS OPEN LD (FOPEN),A XOR A ;DISABLE WRITING AT THIS TIME LD (WRTENAB),A CALL OPEN ;OPEN FILE FOR OUTPUT CALL PSTRNG ;PRINT MESSAGE DEFB '++ Writing MAC Enabled' DEFB 0DH,0AH,'Use Z Command or ' DEFB 'E Control to Close File ++' DEFB 0DH,0AH,0 JP GETCMD ;NOW PROCESS USER'S NEXT COMMANDS ; ; TYPE WAS NOT ALL, SO CHECK FOR SPECIFIC FILE TYPES ; NTALL: LD HL,FCBTYPE ;CHECK FOR SYM LD DE,TPSYM LD C,3 CALL CHKSTG JP NZ,NTSYM CALL SYMSV JP GETCMD ; ; ROUTINE TO SAVE THE SYMBOL TABLE ; SYMSV: LD HL,SYMTAB ;PT TO SYMBOL TABLE SVFL: CALL OPEN ;OPEN THE FILE LUP2: LD E,(HL) ;GET ADDRESS OF SYMBOL IN DE INC HL LD D,(HL) INC HL LD A,(HL) ;GET LENGTH OF SYMBOL IN A INC HL LD B,A ;... AND B OR A ;DONE IF LENGTH IS ZERO JP Z,WRTEOF ;WRITE EOF TO FILE IF DONE CALL EXPND ;WRITE ADDRESS IN DE AS ASCII CHARS ON DISK LD A,' ' ;OUTPUT CALL WRTFILE WRTSYM: LD A,(HL) ;GET NEXT CHAR OF SYMBOL CALL WRTFILE ;WRITE TO DISK INC HL ;PT TO NEXT DJNZ WRTSYM ;COUNT DOWN SIZE OF SYMBOL LD A,0DH ;WRITE NEW LINE CHARS CALL WRTFILE LD A,0AH CALL WRTFILE JR LUP2 ; ; WRITE AN EOF ; WRTEOF: LD A,1AH ;WRITE EOF CALL WRTFILE CALL NXTRCRD RET ; ; EXPAND AN ADDRESS IN DE TO ASCII CHARS AND SAVE ON DISK ; EXPND: LD A,D ;OUTPUT HIGH NYBBLE OF HIGH-ORDER BYTE CALL HINIB ;ROUTINE TO DO THIS CALL WRTFILE ;WRITE ASCII CHAR IN A TO DISK LD A,D ;OUTPUT LOW NYBBLE CALL LONIB CALL WRTFILE LD A,E ;HIGH OF LOW-ORDER BYTE CALL HINIB CALL WRTFILE LD A,E ;LOW OF LOW-ORDER BYTE CALL LONIB JP WRTFILE ; ; NOT OF TYPE SYM -- CHECK FOR CTL ; NTSYM: LD HL,FCBTYPE ;CHECK FOR CTL TYPE LD DE,TPCTL LD C,3 CALL CHKSTG JP Z,SVCTL ;YES, SO SAVE CTL FILE LD HL,FCBTYPE ;CHECK FOR DOC TYPE LD DE,TPDOC LD C,3 CALL CHKSTG JR Z,SVDOC ;YES, SO SAVE DOC FILE LD HL,FCBTYPE ;CHECK FOR ASM TYPE LD DE,TPASM LD C,3 CALL CHKSTG JP NZ,WHAT ;ERROR IF NOT ASM AT THIS POINT JP SVASM ;SAVE ASSEMBLY LANGUAGE (TYPE ALREADY ASM) ; ; SAVE THE COMMENT TABLE ; SVDOC: CALL DOCSV JP GETCMD ; ; SAVE COMMENTS ; DOCSV: CALL AREACK ;FIND END OF COMMENTS LD HL,(COMEND) ;GET PTR IN HL INC HL INC HL LD (HL),0 ;SET NULL FINAL COMMENT LD HL,(COMST) ;PT TO START OF TABLE JP SVFL ;PERFORM STRAIGHT SAVE ; ; ATTEMPT TO OPEN ANOTHER FILE WHILE ASM FILE ALREADY OPENED ; CANT: CALL PSTRNG DEFB '++ No File Accessed Permitted ' DEFB 'until MAC Closed ++',0DH,0AH DEFB 0 JP GETCMD ; ; EOF ENCOUNTERED TOO SOON ; ERROR1: CALL PSTRNG DEFB '++ Unexpected EOF ++',0DH,0AH DEFB 0 JP GETCMD ; ;COMMAND: C ; CONTROL TABLE ENTRIES ARE MADE HERE ; CTL: CALL IECNT ;INIT ECNT LD HL,INBUF+3 LD A,(HL) CP 0DH ;DUMP CONTROL TABLE IF JUST A 'C' COMMAND JP Z,CDUMP1 CALL CNVRT ;GET ADDRESS CP 0DH ;ERROR? JP Z,CDUMP ;DUMP IF SO CP ' ' ;DELIMITER? JR Z,CTL0 ;PROCESS 2ND OPERAND IF SO CP ',' ;SAME JP NZ,WHAT ;ERROR OTHERWISE CTL0: INC HL ;PT TO 2ND OPERAND LD A,(HL) ;GET IT (CONTROL TYPE) CALL FTCTL ;PROCESS ENTRY WITH CONTROL TABLE JP GETCMD ; ; PLACE A NEW ENTRY INTO THE CONTROL TABLE ; A=TYPE OF ENTRY (B, E, I, K, S, W) AND DE=ADDRESS ; FTCTL0: PUSH HL ;SAVE REGS PUSH DE ;NEW ADDRESS PUSH AF ;NEW TYPE CALL SCHCTL ;FIND ENTRY IN CONTROL TABLE DEC HL ;PT TO TYPE OF PREVIOUS CONTROL ENTRY JR C,FTCTL1 ;IF CARRY, WE DIDN'T MATCH INC HL ;PT TO TYPE OF CURRENT ENTRY WHICH MATCHES INC HL INC HL FTCTL1: POP AF ;GET NEW TYPE AND POP DE ;... ADDRESS CP (HL) ;DO OUR TYPES MATCH? POP HL ;RESTORE HL RET Z ;NO CHANGE IF THEY DO ; ; PLACE A NEW ENTRY INTO THE CONTROL TABLE ; FTCTL: LD (OPCTP),A ;SAVE TYPE OF ENTRY CALL SCHCTL ;SCAN FOR A MATCH JP C,PLACE ;NO MATCH, SO ENTRY MUST BE ADDED ; ; MATCH OF ADDRESS, SO SIMPLY CHANGE CONTROL MODE AT THAT POINT ; LD A,(OPCTP) ;GET TYPE OF ENTRY CP 'I' ;INSTRUCTION? JR Z,RNCTL CP 'W' ;DW? JR Z,RNCTL CP 'H' ;DB HEX? JR Z,RNCTL CP 'B' ;DB? JR Z,RNCTL CP 'S' ;DS? JR Z,RNCTL CP 'E' ;END OF PROGRAM? JR Z,RNCTL CP 'K' ;KILL SYMBOL? JR Z,DELCTL JP WHAT ;ERROR IF NONE OF THESE ; ; READ A NEW CONTROL MODE ; ENTRY FORM IS: ; DW ADDRESS ; DB CONTROL MODE ; RNCTL: INC HL ;ADDRESS IS SAME INC HL ;PT TO CONTROL MODE LD (HL),A ;ONLY SET NEW CONTROL MODE RET ; ; DELETE THE ENTRY FROM THE CONTROL TABLE ; DELCTL: EX DE,HL ;DE PTS TO ENTRY TO DELETE LD HL,3 ADD HL,DE ;HL PTS TO NEXT ENTRY EX DE,HL ;DE PTS TO NEXT ENTRY, HL PTS TO ENTRY TO DELETE ; ; COPY CONTROL TABLE DOWN ; CMPCT: LD A,(HL) ;CHECK FOR END OF CONTROL TABLE INC HL AND (HL) ;ADDRESS IS 0FFFFH IF END DEC HL INC A ;A=0 MEANS ADDRESS IS 0FFFFH JR Z,PNTHLL LD BC,3 ;NOT AT END -- COPY 3 BYTES DOWN AND CONTINUE EX DE,HL ;HL PTS TO SOURCE, DE TO DEST LDIR ;COPY THE 3 BYTES EX DE,HL ;DE PTS TO NEXT ENTRY, HL PTS TO ENTRY TO DELETE JR CMPCT ;CONTINUE COPY OPERATION ; ; COPY COMPLETE ; PNTHLL: CALL CTLST ;PRINT CONTROL TABLE INFORMATION JP GETCMD ; ; PLACE AN ENTRY INTO THE CONTROL TABLE ; ON ENTRY, HL PTS TO ENTRY TO INSERT BEFORE ; PLACE: LD A,(OPCTP) ;GET TYPE OF COMMAND CP 'K' ;ERROR IF KILL JP Z,WHAT CP 'E' ;SET END OF PROGRAM AREA JR Z,LGLCTL CP 'H' ;DB HEX JR Z,LGLCTL CP 'B' ;DB JR Z,LGLCTL CP 'W' ;DW JR Z,LGLCTL CP 'I' ;INSTRUCTION JR Z,LGLCTL CP 'S' ;DS JP NZ,WHAT ;ERROR IF NONE OF THESE ; ; PLACE ENTRY INTO CONTROL TABLE; A=TYPE, DE=ADDRESS, HL=ADDR OF ENTRY ; TO INSERT BEFORE ; LGLCTL: PUSH DE ;SAVE ADDRESS PUSH HL ;SAVE ADDRESS OF ENTRY TO INSERT BEFORE LD HL,CTLTBL ;PT TO FRONT OF TABLE ; ; LOOP TO THE END OF THE TABLE ; LP2END: LD A,(HL) ;CHECK FOR 0FFFFH AT END OF TABLE INC HL AND (HL) ;A=0FFH IF SO INC HL ;PT TO CURR CONTROL TYPE INC HL ;PT TO NEXT CONTROL ADDRESS INC A ;A=0 AND ZERO FLAG SET IF AT END JR NZ,LP2END ;CONTINUE UNTIL AT END OF TABLE LD D,H ;DE=HL=PTR TO NEW LAST TABLE ENTRY LOC LD E,L INC HL ;PT TO ENTRY AFTER LAST ENTRY IN TABLE INC HL INC HL ;HL PTS TO NEW LAST TABLE ENTRY LOCATION EX DE,HL ;DE PTS TO NEW, HL PTS TO OLD POP BC ;BC=ADDRESS OF ENTRY TO INSERT BEFORE ; ; EXPAND THE TABLE BY 3 PLACES UNTIL THE PROPER PLACE IS REACHED ; EXPTBL: DEC HL ;BACK UP DEC DE LD A,(HL) ;COPY PREVIOUS BYTE INTO NEW TABLE LOCATION LD (DE),A LD A,L ;ARE WE AT ENTRY TO INSERT BEFORE? CP C JR NZ,EXPTBL ;CONTINUE IF NOT LD A,H ;CHECK HIGH BYTES CP B JR NZ,EXPTBL POP DE ;DE=NEW ENTRY ADDRESS, HL=ADDRESS TO INSERT AT LD (HL),E ;PLACE NEW ENTRY ADDRESS INTO TABLE INC HL LD (HL),D INC HL LD A,(OPCTP) ;PLACE NEW ENTRY TYPE INTO TABLE LD (HL),A RET ; ; SEARCH CTL TBL FOR AN ENTRY FOR (DE) ; ON EXIT, HL PTS TO LOW-ORDER BYTE OF CONTROL TABLE ENTRY IF MATCHED ; OR LESS THAN ; MATCH: C=0 ; NO MATCH: C=1 ; SCHCTL: LD HL,CTLTBL ;PT TO TABLE ; ; IF NO MATCH THEN CARRY IS SET ; SMORE: LD A,(HL) ;GET LOW ADDRESS INC HL ;PT TO HIGH AND (HL) ;AND IN HIGH ADDRESS; IF ADDR=0FFFFH, THEN A=0FFH DEC HL ;PT TO LOW ADDRESS INC A ;IF A=0FFH BEFORE, NOW A=0 SCF ;SET CARRY FLAG FOR ERROR RETURN RET Z ;RETURN IF A=0 (WE ARE AT END OF TABLE) INC HL ;PT TO HIGH ADDRESS LD A,D ;GET ADDRESS TO COMPARE AGAINST CP (HL) ;DO COMPARE DEC HL ;PT TO LOW ADDRESS RET C ;RETURN IF ADDRESS IS LESS THAN TABLE ENTRY JR NZ,NXTRY ;CONTINUE IF NOT THE SAME LD A,E ;GET LOW ADDRESS CP (HL) ;COMPARE TO LOW ADDRESS RET Z ;CARRY IS OFF AND ZERO IS SET IF COMPLETE MATCH RET C ;CARRY IS ON AND ZERO IS NOT SET IF TARGET IS LESS ; ; ADVANCE TO THE NEXT TABLE ENTRY ; NXTRY: INC HL ;PT TO HIGH ADDRESS INC HL ;PT TO TYPE OF NEXT CONTROL ENTRY INC HL ;PT TO LOW ADDRESS OF NEXT ENTRY IN TABLE JR SMORE ;CONTINUE ; ; DUMP CONTROL TABLE FROM ADDRESS IN DE ; CDUMP: CALL SCHCTL ;FIND ENTRY IN CONTROL TABLE >= ADDRESS IN DE JR CDUMP2 ; ; DUMP ENTIRE CONTROL TABLE ; CDUMP1: LD HL,CTLTBL ;PT TO FIRST ENTRY IN CONTROL TABLE CDUMP2: CALL BRKCHK ;CHECK FOR ABORT LD E,(HL) ;GET ADDRESS OF CONTROL ENTRY IN DE INC HL LD D,(HL) INC HL LD A,D ;CHECK FOR END OF TABLE AND E ;END IF DE=0FFFFH INC A ;SET A TO 0 IF SO JR NZ,MOREDMP CALL CRLF ;DONE, SO OUTPUT NEW LINE AND PRINT CONTROL INFO CALL CTLST JP GETCMD ; ; DUMP CONTROL TABLE ENTRY TO USER ; MOREDMP: PUSH DE PUSH HL CALL SYMSCH ;SEARCH FOR A SYMBOL WHOSE VALUE = ADDRESS IN DE JR C,AHEAD ;SKIP IF NOT FOUND ; ; PRINT A SYMBOL SINCE IT WAS FOUND; SYMBOL PTED TO BY HL ; CALL IECNT ;INIT ECNT CALL CRLF ;NEW LINE PRNTSYM: LD A,(HL) ;OUTPUT CHARS OF SYMBOL CALL COUT ;... COUNT IN B FROM SYMSCH INC HL DJNZ PRNTSYM LD A,':' ;OUTPUT COLON AFTER SYMBOL CALL COUT ; ; OUTPUT CONTROL TABLE ENTRY ; AHEAD: POP HL ;GET PTR TO CONTROL MODE POP DE ;GET ADDRESS OF ENTRY CALL SPACE ;2 S CALL SPACE EX DE,HL ;ADDRESS IN HL CALL PVALUE ;PRINT VALUE OF ADDRESS LD A,'=' ;PRINT DELIMITERS CALL COUT LD A,' ' CALL COUT EX DE,HL ;RESTORE HL AS PTR TO CONTROL MODE LD A,(HL) ;GET CONTROL MODE LETTER CALL COUT ;PRINT IT CALL SPACE ; OUT CALL SPACE CALL SPCRLF ;OUTPUT NEW LINE OCCASIONALLY INC HL ;PT TO NEXT CONTROL TABLE ENTRY JR CDUMP2 ; ; SAVE THE CONTROL TABLE ON DISK ; SVCTL: CALL SVCTL0 ;USE ROUTINE JP GETCMD ; ; ROUTINE TO SAVE THE CONTROL TABLE ON DISK ; SVCTL0: CALL OPEN ;OPEN FILE LD HL,CTLTBL ;PT TO TABLE SVCTL1: LD E,(HL) ;GET ADDRESS IN DE INC HL LD D,(HL) INC HL LD A,D ;CHECK FOR END (0FFFFH) AND E INC A ;A=0 IF SO JR Z,CTLSVED CALL EXPND ;OUTPUT ADDRESS IN DE AS 4 HEX CHARS LD A,',' ;OUTPUT COMMA CALL WRTFILE LD A,(HL) ;OUTPUT CONTROL MODE CHAR CALL WRTFILE LD A,0DH ;OUTPUT NEW LINE CALL WRTFILE LD A,0AH CALL WRTFILE INC HL ;PT TO NEXT CONTROL TABLE ENTRY JR SVCTL1 ; ; THE CONTROL TABLE HAS BEEN SAVED ; CTLSVED: LD A,1AH ;WRITE EOF CALL WRTFILE CALL NXTRCRD RET ; ; READ IN A CONTROL TABLE ; ISCTL: CALL CTLRD ;READ CONTROL FILE JP STAT ;PRINT STATISTICS ; ; ROUTINE TO READ IN A CONTROL TABLE ; CTLRD: CALL RDOPEN ;OPEN FILE FOR READING LD HL,CTLTBL ;PT TO CONTROL TABLE LUP: CALL READMA ;READ NEXT CHAR LD DE,0 ;SET VALUE = 0 NUMLUP: CP 1AH ;ERROR IF EOF ENCOUNTERED JR Z,TERMF CP ',' ;DONE WITH NUMBER IF COMMA FOUND JR Z,STRDE CP '9'+1 ;CHECK FOR DIGIT JR C,NUM ;PROCESS IF SO SUB 7 ;ADJUST FOR 'A'-'F' NUM: SUB '0' ;CONVERT HEX ASCII TO BINARY EX DE,HL ;VALUE IN HL ADD HL,HL ;*2 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 ADD A,L ;ADD IN NEW VALUE LD L,A EX DE,HL ;VALUE BACK IN DE CALL READMA ;READ NEXT CHAR JR NUMLUP ;CONTINUE ; ; STORE THE ADDRESS ACCUMULATED IN DE INTO THE CONTROL TABLE ; STRDE: LD (HL),E ;STORE ADDRESS INC HL LD (HL),D INC HL CALL READMA ;READ CONTROL MODE CHAR LD (HL),A ;STORE IT INC HL ;PT TO NEXT CONTROL TABLE ENTRY JR LUP ; ; STORE ENDING 0FFFFH IN CONTROL TABLE ; TERMF: LD (HL),0FFH INC HL LD (HL),0FFH RET ; ;COMMAND: ; ; COMMENT ROUTINE. IT ADDS OR LISTS COMMENTS ; CMNT: CALL AREACK ;VERIFY THAT COMMENT TABLE EXISTS LD HL,INBUF+3 ;PT TO CHAR AFTER COMMAND LD A,(HL) ;GET IT CP 0DH ;DONE? JP Z,LSTCMT ;YES, SO LIST COMMENTS CP 'O' ;LOOK FOR 'ON/OFF' SWITCH JR NZ,CMNT1 INC HL LD A,(HL) ;SECOND CHARACTER OF THE COMMENT SBC A,'F' ;CREATE A 0 FOR 'OFF' JR Z,CMNT2 CP 'N'-'F' ;LOOK FOR AN 'N' (FOR 'ON') JP NZ,WHAT CMNT2: LD (XCSW),A ;TURN OFF COMMENTS JP GETCMD ; ; PROCESS NEW COMMENT ENTRY ; CMNT1: CALL CNVRT ;GET ADDRESS IN DE INC HL ;PT TO NEXT CHAR CP 0DH ;IF DONE, WE DELETE COMMENT JP Z,ONECMT CP ' ' ; OR ',' SAYS TEXT FOLLOWS JR Z,CMNT0 CP ',' JP NZ,WHAT ;ERROR IF NOT , , OR ',' CMNT0: PUSH HL ;SAVE PTR TO NEXT CHAR CALL CMCHK ;CHECK FOR COMMENT ALREADY AT ADDRESS IN DE JR C,ADDCMT ;IF NOT, JUST ADD COMMENT CALL DELCMT ;IF SO, FIRST DELETE EXISTING COMMENT ; ; ADD COMMENT TO COMMENT TABLE ; ADDCMT: POP HL ;GET PTR PUSH HL LD A,(HL) ;CHECK FOR ANY TEXT CP 0DH ;IF NONE, OLD COMMENT IS JUST DELETED JP Z,GETCMD LD HL,(COMEND) ;PT TO END OF COMMENT TABLE LD (HL),E ;SAVE NEW ADDRESS OF COMMENT INC HL LD (HL),D INC HL POP DE ;PT TO FIRST CHAR OF COMMENT LD B,0 ;INIT CHAR COUNT TO ZERO PUSH HL ;SAVE ADDRESS TO CHAR COUNT OF COMMENT ; ; SAVE TEXT OF COMMENT ; STRTXT: INC HL ;PT TO POSITION TO STORE AT LD A,(DE) ;GET COMMENT TEXT LD (HL),A ;STORE IT INC DE ;PT TO NEXT INC B ;INCR CHAR COUNT LD A,(DE) ;CHECK FOR DONE CP 0DH ;DONE IF JR NZ,STRTXT ;CONTINUE IF NOT INC HL ;PT TO ADDRESS AFTER LD (COMEND),HL ;SET PTR TO END OF COMMENT TABLE LD (HL),0FFH ;STORE 0FFFFH AS NEXT ENTRY INC HL LD (HL),0FFH POP HL ;GET PTR TO COMMENT CHAR COUNT LD (HL),B ;SAVE CHAR COUNT JP GETCMD ; ; CHECK FOR A COMMENT AT THE ADDRESS IN DE ; MATCH: CARRY IS OFF (NC CONDITION) ; CMCHK: LD HL,(COMST) ;PT TO START OF COMMENT TABLE CMCHK1: LD A,(HL) ;CHECK ADDRESS FOR 0FFFFH INC HL AND (HL) DEC HL INC A ;A=0 IF SO SCF ;PREP FOR ERROR RETURN RET Z ;NOT FOUND IF A=0 INC HL ;PT TO ADDRESS HIGH LD A,D ;GET TARGET ADDRESS IN DE CP (HL) ;COMPARE AGAINST THAT STORED DEC HL ;PT TO ADDRESS LOW JR NZ,NXTC ;IF NOT A MATCH, CONTINUE LD A,E ;COMPARE LOW BYTES CP (HL) RET Z ;THERE IS A COMMENT AT THIS ADDRESS, SO CARRY=1 NXTC: INC HL ;PT TO CHAR COUNT INC HL LD A,(HL) ;GET CHAR COUNT CALL SKIP ;SKIP TO NEXT COMMENT INC HL ;PT TO LOW BYTE OF NEXT COMMENT JP CMCHK1 ; ; DUMP COMMENT TABLE FROM A GIVEN ADDRESS FORWARD ; ONECMT: CALL CMCHK ;FIND COMMENT REFD IN DE JR LSTAGN ; ; DUMP ENTIRE COMMENT TABLE ; LSTCMT: LD HL,(COMST) ;PT TO FIRST COMMENT LSTAGN: CALL BRKCHK ;CHECK FOR ABORT LD E,(HL) ;GET ADDRESS OF COMMENT IN DE INC HL LD D,(HL) INC HL LD A,D ;CHECK FOR 0FFFFH AS END OF TABLE AND E INC A ;A=0 IF SO JP Z,GETCMD ;DONE IF SO EX DE,HL ;VALUE IN HL CALL PVALUE ;PRINT IT EX DE,HL ;VALUE IN DE, PTR TO COMMENT CHAR COUNT IN HL LD A,';' ;PRINT SEMICOLON BEFORE COMMENT CALL COUT LD B,(HL) ;GET CHAR COUNT IN B TEXT: INC HL ;PT TO COMMENT CHAR LD A,(HL) ;GET AND PRINT IT CALL COUT DJNZ TEXT ;CONTINUE UNTIL DONE CALL CRLF ;NEW LINE INC HL ;PT TO ADDRESS OF NEXT COMMENT JR LSTAGN ;CONTINUE ; ; DELETE AN EXISTING COMMENT WHOSE ADDRESS IS IN DE; HL PTS TO CMT TABLE ; DELCMT: LD A,(HL) ;CHECK FOR END OF COMMENT TABLE INC HL AND (HL) INC A ;A=0 IF AT END RET Z DEC HL ;PT TO ADDRESS IN CURRENT COMMENT PUSH DE ;SAVE ADDRESS TO DELETE LD D,H ;SAVE ADDRESS OF CURRENT COMMENT IN DE LD E,L INC HL ;PT TO CHAR COUNT OF CURRENT COMMENT INC HL LD A,(HL) ;GET IT IN A CALL SKIP ;SKIP TO NEXT COMMENT INC HL ;PT TO ITS ADDRESS LD B,0 ;INIT TO NOT DONE FOR LOOP ; ; COPY (HL) TO (DE) UNTIL FFFFH IS ENCOUNTERED ; SHFTCT: LD A,(HL) ;GET CHAR LD (DE),A ;PUT CHAR INC HL ;PT TO NEXT INC DE LD C,A ;DONE IF BC=0FFFFH AND B INC A ;A=0 IF DONE LD B,C JR NZ,SHFTCT ;CONTINUE UNTIL TWO SUCCESSIVE FF'S FOUND EX DE,HL ;SET END OF COMMENT TABLE DEC HL DEC HL LD (COMEND),HL POP DE RET ; ; CHECK TO SEE THAT AREA FOR COMMENTS WAS DEFINED (START <> 0) AND ; ABORT WITH ERROR MESSAGE IF NOT ; AREACK: LD HL,(COMST) ;HL=START ADDRESS LD A,H OR L RET NZ ;ERROR IF ZERO CALL PSTRNG DEFB '++ COMMAND IGNORED ++',0DH DEFB 0AH,'++ Issue ''UNNNN'' to tell ' DEFB 'DASM to use address ' DEFB 'NNNN',0DH,0AH,'as the start ' DEFB 'of the comments table ++',0DH DEFB 0AH,0 JP GETCMD ; ;COMMAND: U ; DEFINE THE COMMENTS AREA ; UAREA: LD HL,INBUF+3 ;CHECK ARGS LD A,(HL) CP 0DH ;ERROR IF JUST JP Z,WHAT CP '.' ;ERROR IF SYMBOL JP Z,WHAT CALL CNVRT ;CONVERT TO NUMBER IN DE EX DE,HL ;... IN HL LD A,H ;CHECK FOR WITHIN RANGE CP (SYMTAB+600H) SHR 8 ;THIS ALLOWS 600H BYTES FOR SYM TBL JR C,UAREA0 ;ERROR IF LESS LD (COMST),HL ;SET START AND END OF TABLE LD (COMEND),HL LD (HL),0FFH ;SET ENDING 0FFFFH IN TABLE INC HL LD (HL),0FFH JP GETCMD UAREA0: CALL PSTRNG ;PRINT ERROR MESSAGE DEFB 'NO!! Address is less than ' DEFB 0 LD HL,SYMTAB+600H LD L,0 CALL PVALUE CALL CRLF JP GETCMD ; ; HANDLE SYMBOLS FOR THE DISASSEMBLER; ADDRESS IN PC ; IF A SYMBOL EXISTS AT THIS ADDRESS, PRINT IT ; HSYM: PUSH DE PUSH HL LD A,1 ;ENABLE DISK OUTPUT LD (WRTENAB),A LD HL,(PC) ;GET ADDRESS OF PC EX DE,HL ;... IN DE CALL SYMSCH ;LOOK FOR SYMBOL JP C,RESUME ;GOTO RESUME IF NO SYMBOL LD C,B ;GET CHAR COUNT OF SYMBOL INTO C PUSH HL ;SAVE PTR TO IT ; ; CHECK TO SEE THAT SYMBOL CONTAINS NO + OR -; DON'T PRINT IF IT DOES ; HSYM0: LD A,(HL) ;GET CHAR CP '+' ;CHECK IT JR Z,HSYM1 CP '-' JR Z,HSYM1 INC HL ;PT TO NEXT DEC C ;CONTINUE TO END OF SYMBOL JR NZ,HSYM0 POP HL ;PT TO SYMBOL CALL PRNT ;PRINT THE SYMBOL LD A,':' ;.. AND A FOLLOWING COLON CALL COUT CALL TAB ;PRINT THE TAB CALL PDERTN ;PRINT THE ADDRESS AS A COMMENT (ADR IN DE) CALL CRLF ;NEW LINE JR RESUME ;CONTINUE HSYM1: POP HL RESUME: XOR A ;PRINT ADDRESS OF PC ON CRT LD (WRTENAB),A ;.. BUT NOT INTO THE FILE CALL SPACE ; OVER CALL SPACE LD HL,(PC) ;PRINT PC VALUE CALL PVALUE LD A,1 ;REENABLE WRITE OF MNEMONIC LD (WRTENAB),A CALL TAB ;TAB FOR FOLLOWING MNEMONIC POP HL POP DE RET ; ; BUILD A SYMBOL IN INBUF FOR THE VALUE IN DE ; BLDSYM: LD (SYMBDE),DE LD HL,INBUF ;PT TO INBUF LD (HL),'L' ;STORE LEADING L INC HL ;PT TO NEXT CHAR LD A,D ;GET VALUE IN DE CALL ACCTOASC ;STORE AS ASCII CHARS IN BUFFER LD A,E CALL ACCTOASC LD HL,INBUF ;PT TO SYMBOL LD B,5 ;SYMBOL IS 5 CHARS LONG ; ; INSERT A SYMBOL ALPHABETICALLY INTO TABLE ; INSERT: CALL PLCSYM ;FIND SYMBOL JR C,NEWSYM ;PROCESS AS NEW IF NOT FOUND LD (HL),E ;IF FOUND, SET NEW ADDRESS FOR IT INC HL LD (HL),D RET ; ; INSERT NEW SYMBOL INTO TABLE; LOCATION TO INSERT AT PTED TO BY HL ; NEWSYM: PUSH HL PUSH DE PUSH BC ; ; FILL CTRL TABLE WITH DW OR DB ; A=1 THEN DB A=2 THEN DW ; A=0 NO DW OR DB LD A,(DWFLAG) OR A JR Z,NEWSY1 ; NO CTRL TBL ENTRY LD DE,(SYMBDE) CALL SCHCTL ; CK TYPE OF ENTRY AT OR BEFORE DEC HL ; PT TO TYPE ENTRY BEFORE JR C,CKTYPE INC HL INC HL ; PT TO MATCH TYPE INC HL CKTYPE: LD A,(HL) CP 'I' JR NZ,DWCTRR ; IF NOT INSTRUCTION DON'T CHANGE ; LD A,(DWFLAG) CP 1 JR Z,DBYTEH ; DB ; LD A,'W' ; MUST BE DW CALL FTCTL0 ; PLACE IN CTRL TBL LD DE,(SYMBDE) INC DE INC DE JR DCKTBL ; IF NO ENRTY MAKE 'I' DBYTEH: LD A,'H'  CALL FTCTL0 LD DE,(SYMBDE) INC DE DCKTBL: CALL SCHCTL ; ENTRY? NC=YES JR NC,DWCTRR ; LD A,'I' CALL FTCTL0 ; MAKE INSTRUCTION DWCTRR: XOR A LD (DWFLAG),A POP BC POP DE POP HL PUSH HL PUSH DE PUSH BC ; RESTORE REG ; NEWSY1: LD HL,(SYMEND) ;MOVE THE TABLE BY LENGTH+3 LD D,H ;DE PTS TO END OF SYMBOL TABLE LD E,L LD A,B ;LENGTH OF SYMBOL IN A ADD A,3 ;LENGTH OF SYMBOL + 3 ADD A,L ;PT TO NEW END OF TABLE LD L,A LD A,H ADC A,0 LD H,A LD (SYMEND),HL ;NEW END OF SYMBOL TABLE INC HL ;PT TO LENGTH OF SYMBOL AFTER LAST ONE INC HL LD (HL),0 ;SET THIS TO ZERO TO MARK END OF TABLE DEC HL DEC HL LD B,H ;ADDRESS OF LAST BYTE IN BC LD C,L LD HL,(SYMRKR) ;ADDRESS OF REV DEST TO MOVE TO IN HL ; ; EXPAND THE TABLE UNTIL SPACE IS MADE AT THE NEW SPOT ; LUP3: LD A,E ;AT DESTINATION? CP L JR NZ,AHD LD A,D CP H JR Z,STICKAD ;DONE IF SO AHD: DEC DE ;COPY BACKWARDS (DE) TO (BC) DEC BC LD A,(DE) LD (BC),A JR LUP3 ; ; ENTER THE ADDRESS AND LENGTH ; STICKAD: POP BC POP DE LD (HL),E ;STORE ADDRESS OF SYMBOL INC HL LD (HL),D INC HL LD (HL),B ;STORE LENGTH OF SYMBOL POP DE ; ; STORE THE SYMBOL STRING ; STICKSM: INC HL LD A,(DE) LD (HL),A INC DE DJNZ STICKSM RET ; ; FIND SPOT FOR NEW SYMBOL PTED TO BY HL, VALUE IN DE, B=LENGTH OF SYMBOL ; RETURN: C=0 FOR MTCH, HL=SYMBOL ; PLCSYM: PUSH DE ;SAVE VALUE PUSH HL ;SAVE ADDRESS OF SYMBOL LD HL,SYMTAB ;PT TO SYMBOL TABLE ANTHR: POP DE ;GET SYMBOL ADDRESS IN DE PUSH DE INC HL ;PT TO SYMBOL CHAR COUNT INC HL PUSH HL LD A,(HL) ;GET CHAR COUNT INC HL ;PT TO FIRST CHAR OR A ;CHECK FOR END OF SYMBOL TABLE JR Z,NONE ;GOTO NONE IF AT END OF TABLE CP B ;COMPARE SYMBOL LENGTHS JR C,LESS ;NO MATCH IF NOT SAME LENGTH JR NZ,NTLESS LD C,A ;SYMBOL LENGTH IN C CALL CHKSTG ;COMPARE (DE) TO (HL) JR Z,FOUND JR C,NONE ; ; TARGET SYMBOL GOES BEHIND CURRENT SYMBOL ; LATER: POP HL ;GET ADDRESS OF SYMBOL TABLE SYMBOL LD A,(HL) INC HL CALL SKIP ;SKIP TO NEXT JR ANTHR ; ; MATCH OF SYMBOLS ; FOUND: POP HL DEC HL DEC HL POP DE POP DE OR A ;RET WITH CARRY CLEAR FOR MATCH RET ; ; CHECK SHORTER STRING FOR PARTIAL MATCH ; LESS: LD C,A CALL CHKSTG JR NC,LATER JR NONE NTLESS: LD C,B CALL CHKSTG JR Z,NONE JR NC,LATER ; ; THERE IS NO SYMBOL FOR THIS VALUE, SO THIS VALUE SHOULD GO AT HL ; NONE: POP HL DEC HL DEC HL LD (SYMRKR),HL ;SET MARKER POP HL POP DE SCF ;SET CARRY FOR NO MATCH RET ; ; SEARCH THE SYMBOL TABLE FOR AN ENTRY WHOSE VALUE IS DE ; MATCH: C=0 ; SYMSCH: LD HL,SYMTAB ;PT TO SYMBOL TABLE ; ; (HL) IS START OF SYMBOL; (B) IS LENGTH ; MORE: LD A,(HL) ;GET AND COMPARE SYMBOL TABLE VALUES INC HL CP E JR NZ,SKPOVR LD A,(HL) CP D JR Z,FNDSYM ; ; GOTO NEXT SYMBOL ; SKPOVR: INC HL ;CHECK CHAR COUNT FOR DONE LD A,(HL) ;0 IF DONE OR A SCF ;SET CARRY FOR NO MATCH IF SO RET Z INC HL ;PT TO NEXT SYMBOL ADD A,L LD L,A JR NC,MORE  INC H JR MORE ; ; RETURN WITH NO CARRY AND LENGTH IN B IF MATCHED ; FNDSYM: INC HL LD A,(HL) INC HL LD B,A OR A ;MATCH RET NZ SCF ;NO MATCH RET ; ;COMMAND: E ; PLACE A SYMBOL IN THE SYMBOL TABLE ; ENTER: LD HL,INBUF+3 ;CHECK FOR CHARS AFTER THE E CALL CNVRT ;GET VALUE LD A,(HL) ;CHECK FOR ERROR CP ' ' ;MUST BE FOLLOWED BY OR ',' JR Z,ENTER0 CP ',' JP NZ,WHAT ; ; GET SYMBOL ; ENTER0: INC HL ;PT TO SYMBOL LD A,(HL) ;GET '.' CP '.' ;MUST BE '.' JP NZ,WHAT PUSH DE ;SAVE THE SYMBOL'S VALUE PUSH HL ;SAVE THE BUFFER PTR CALL SYMSCH ;RETURN WITH C=0 FOR MATCH ;.. B=LENGTH HL=START OF STRING JR C,ENTER1 ;NOTHING TO DELETE PUSH HL CALL CRLF ;PRINT MESSAGE THAT SYMBOL WAS KILLED CALL PRNT CALL PSTRNG DEFB ' was Killed',0DH,0AH,0 POP HL DEC HL DEC HL DEC HL CALL KILL0 ;KILL SYMBOL ENTER1: POP HL PUSH HL CALL LNGTH ;COMPUTE LENGTH OF SYMBOL IN B POP DE LD A,B ;CHECK FOR SYMBOL TOO LONG CP SYMMAX+1 JR C,ENTER2 PUSH HL LD BC,SYMMAX ;SET TO MAX LENGTH LD H,D ;HL=DE LD L,E INC HL ;ADD 1 FOR 1ST CHAR ADD HL,BC LD (HL),0 ;TERMINATE SYMBOL LD B,C ;B=SYMMAX POP HL ENTER2: POP DE CALL INSERT ;INSERT SYMBOL INTO SYMBOL TABLE JP GETCMD ; ;COMMAND: K ; DELETE A SYMBOL FROM THE TABLE ; KILL: LD HL,INBUF+3 ;CHECK FOR SYMBOL SPECIFIED LD A,(HL) ;MUST BE '.' CP '.' JP NZ,WHAT CALL LNGTH ;GET LENGTH IN B CALL PLCSYM ;FIND SYMBOL PTED TO BY HL JP C,WHAT ;ERROR IF NOT FOUND CALL KILL0 ;KILL IT JP GETCMD ; ; KILL THE SYMBOL WHOSE VALUE IS PTED TO BY HL ; KILL0: LD B,H ;SAVE PTR IN BC LD C,L INC HL INC HL LD A,(HL) ;GET THE LENGTH OF THE SYMBOL INC HL CALL SKIP ;SKIP TO NEXT EX DE,HL ;DE PTS TO NEXT SYMBOL LD HL,(SYMEND) ;SHIFT THE SYMBOL TABLE DOWN TO DELETE SYM LUP4: LD A,E ;SHIFT COMPLETE? CP L JR NZ,AHD1 LD A,D CP H JR Z,DEAD AHD1: LD A,(DE) ;COPY DOWN LD (BC),A INC BC INC DE JR LUP4 ; ; THE SYMBOL IS DEAD -- SET NEW END OF SYMBOL TABLE ; DEAD: LD H,B LD L,C LD (SYMEND),HL ;SET END INC HL INC HL LD (HL),0 ;SET END OF TABLE MARKER RET ; ; SCAN SYMBOL STARTING AT (HL) AND RETURN WITH LENGTH IN B, PTR TO FIRST ; CHAR OF SYMBOL IN HL, AND PTR TO CHAR AFTER LAST CHAR IN SYMBOL IN DE ; LNGTH: INC HL ;PT TO FIRST CHAR LD B,0 ;INIT LENGTH PUSH HL CHAROK: LD A,(HL) ;GET CHAR INC HL ;PT TO NEXT INC B ;INCR LENGTH CP '+' ;CHECK FOR END OF SYMBOL MARK JR Z,CHAROK CP '-' JR Z,CHAROK CP '0' JR C,ILLSYM CP '9'+1 JR C,CHAROK CP 'A' JR C,ILLSYM CP 'Z'+1 JR C,CHAROK ; ; AN ILLEGAL CHARACTER FOUND IN A SYMBOL SCAN, SO SCAN IS DONE ; ILLSYM: DEC B ;COMPENSATE FOR COUNT JP Z,WHAT ;ERROR IF NO SYMBOL CHARS DEC HL ;BACK UP EX DE,HL ;PTR TO NEXT CHAR IN DE POP HL ;PT TO FIRST CHAR IN HL RET ; ; CONVERT THE ACCUMULATOR TO HEX ASCII IN MEMORY PTED TO BY HL (2 BYTES) ; ACCTOASC: PUSH AF CALL HINIB ;CONVERT HIGH NYBBLE LD (HL),A ;STORE IT INC HL ;PT TO NEXT POP AF CALL LONIB ;CONVERT LOW NYBBLE LD (HL),A ;STORE IT INC HL ;PT TO NEXT RET ; ; CONVERT THE HIGH NIBBLE OF A TO ASCII CHAR ; HINIB: RRA ;ROTATE HIGH NYBBLE TO LOW NYBBLE RRA RRA RRA ; ; CONVERT THE LOW NYBBLE OF A TO ASCII CHAR ; LONIB: AND 0FH ;MASK OUT NEW HIGH NYBBLE CP 10 ;CHECK FOR DIGIT JR C,AHD2 ;SKIP IF SO ADD A,7 ;ADD OFFSET OF 7 FOR '9' TO 'A' AHD2: ADD A,'0' ;CONVERT TO ASCII IN A RET ; ; PRINT THE HEX CHARACTERS FOR THE VALUE IN A ; PHEX: PUSH AF CALL HINIB ;PRINT HIGH NYBBLE CALL COUT POP AF CALL LONIB ;PRINT LOW NYBBLE JP COUT ; ; PRINT THE 4 HEX CHARACTERS FOR CONTENTS OF HL ; PVALUE: LD A,H ;PRINT HIGH BYTE CALL PHEX LD A,L ;PRINT LOW BYTE CALL PHEX ; ; PRINT A ; SPACE: LD A,' ' ;PRINT JP COUT ; ; READ HEX ASCII FROM COMMAND LINE AND CONVERT AND PLACE IN (DE) ; CNVRT: LD A,(HL) ;GET FIRST CHAR CP '.' ;IT IS A SYMBOL IF '.' JR Z,ITSASYM LD DE,0 ;INIT VALUE TO ZERO AGAIN: LD A,(HL) ;GET CHAR CP '0' ;IN RANGE? RET C ;DONE IF NOT CP '9'+1 ;RANGE? JR C,NUMER ;OK IF SO CP 'A' ;RANGE? RET C ;DONE IF NOT CP 'F'+1 ;RANGE? RET NC ;DONE IF NOT SUB 7 ;CONVERT FOR 'A'-'F' NUMER: SUB '0' ;CONVERT FROM ASCII TO BINARY EX DE,HL ;HL=VALUE ADD HL,HL ;*2 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 ADD A,L ;ADD IN NEW NYBBLE LD L,A EX DE,HL ;DE=VALUE INC HL ;PT TO NEXT CHAR JR AGAIN ;CONTINUE ; ; EVALUATE THE SYMBOL IN MEMORY AND RETURN WITH VALUE IN DE ; ITSASYM: CALL LNGTH ;DETERMINE LENGTH OF SYMBOL PUSH DE CALL PLCSYM ;FIND IT IN TABLE JP C,WHAT ;ERROR IF NOT FOUND LD E,(HL) ;PUT ITS VALUE IN DE INC HL LD D,(HL) POP HL LD A,(HL) RET ; ; OPEN A FILE FOR READING ; RDOPEN: PUSH HL LD HL,0100H ;SET DMA TO 100H LD (DMAPTR),HL XOR A ;SET NEXT RECORD FIELD TO 0 LD (FCBNR),A LD DE,FCB ;PT TO FCB LD C,0FH ;OPEN THE FILE CALL BDOS POP HL INC A ;FILE FOUND? RET NZ ;RET IF SO CALL PSTRNG ;ERROR IF NOT DEFB ' File Not Found',0DH,0AH,0 EX (SP),HL ;SAVE HL ON STACK POP HL ;RESTORE HL RET ; JP GETCMD ;OLD ERROR RETURN ; ; READ NEXT BYTE FROM DMA BUFFER AND RETURN IT IN A ; READMA: PUSH HL ;SAVE HL LD HL,(DMAPTR) ;PT TO NEXT BYTE LD A,H ;BEYOND END OF BUFFER? CP 1 ;1 IF SO JR NZ,NOTREAD ;IF NOT, THEN GET THE BYTE PUSH BC ;SAVE BC, DE PUSH DE LD DE,FCB ;PT TO FCB LD C,14H ;READ RECORD INTO DMA ADDRESS CALL BDOS OR A ;SET FLAG FOR ERROR POP DE ;RESTORE REGS POP BC LD HL,RECLEN ;PT TO FIRST BYTE OF BUFFER JR NZ,ERROR ;ERROR IF EOF ENCOUNTERED NOTREAD: LD A,(HL) ;GET NEXT CHAR IN A INC HL ;PT TO CHAR AFTER LD (DMAPTR),HL ;SET PTR FOR LATER USE POP HL ;RESTORE HL RET ERROR: CP 3 JR C,RDDMA0 CALL PSTRNG DEFB '++ Unexpected EOF ++',0DH,0AH DEFB 0 JP GETCMD ; ; AT EOF ... SET ^Z AS RESPONSE CHAR FROM READ ; RDDMA0: LD A,1AH LD (HL),A JR NOTREAD ; ; OPEN FILE PTED TO BY FCB FOR OUTPUT ; OPEN: PUSH HL LD DE,FCB ;ERASE IT FIRST LD C,13H CALL BDOS LD DE,FCB ;NOW CREATE IT LD C,16H CALL BDOS INC A ;ERROR IN CREATING IT? JP Z,WHAT ;SAY SO (NO ROOM IN DIR) XOR A ;SET RECORD FIELD TO ZERO LD (FCBNR),A LD HL,RECLEN ;SET DMA ADDRESS LD (DMAPTR),HL POP HL RET ; ; WRITE THE NEXT RECORD TO OPEN FILE ; NXTRCRD: LD DE,FCB ;WRITE IT LD C,15H CALL BDOS OR A ;ERROR? JR NZ,WRTERR LD DE,FCB ;CLOSE THE FILE LD C,10H CALL BDOS INC A ;ERROR IN CLOSING? RET NZ CALL PSTRNG ;SAY SO IF SO DEFB '++ Close Error ++',0DH,0AH,0 JP GETCMD ; ; AN ERROR OCCURRED DURING A WRITE RECORD ATTEMPT ; WRTERR: CALL PSTRNG DEFB '++ Write Error ++',0DH,0AH,0 ; ; WRITE INTO THE DMA BUFFER AND WRITE TO DISK WHEN IT FILLS ; CHAR TO WRITE PASSED IN A ; WRTFILE: PUSH HL LD HL,(DMAPTR) ;GET PTR LD (HL),A ;STORE NEXT CHAR INC L ;PT TO NEXT LD (DMAPTR),HL ;SET NEXT DMA POP HL RET NZ ;IF L REACHED ZERO, BUFFER WAS FULL; RET IF NZ PUSH BC ;WRITE RECORD TO DISK AND REINIT DMA PTR PUSH DE PUSH HL LD DE,FCB ;DO THE WRITE LD C,15H CALL BDOS OR A ;ERROR? JR NZ,WRTERR LD HL,RECLEN ;RESET DMA PTR LD (DMAPTR),HL POP HL POP DE POP BC RET ; ; PRINT COMMENT IF PTED TO BY XCPTR ; DCRLF: LD HL,(XCPTR) LD A,H OR L ;LOOK FOR A COMMENT ADDRESS JR Z,DCRLF3 CALL TAB ;TABULATE COMMENT LD B,(HL) ;GET CHAR COUNT XOR A ;CHECK FOR NO COMMENT OR B JR Z,DCRLF2 DCRLF1: INC HL ;OUTPUT COMMENT LD A,(HL) CALL COUT DJNZ DCRLF1 DCRLF2: LD HL,0 ;SET NO COMMENT NOW LD (XCPTR),HL DCRLF3: LD (RPLPTR),HL ;SET RPLPTR=0 ; ; OUTPUT ; CRLF: LD A,0DH CALL COUT LD A,0AH JP COUT ; ; PRINT THE PROMPT ; PRTSTAR: LD A,'*' ; ; PRINT THE CHARACTER IN A ON CON: AND/OR DISK ; THE FOLLOWING FLAGS TAKE EFFECT: ; HUSH (QUIET MODE) -- IF =0, CON: OUTPUT, ELSE NO CON: OUTPUT ; FOPEN (FILE OPEN) AND WRTENAB (WRITE ENABLE) -- IF BOTH <>0, DISK ; OUTPUT ; CNTENAB (COUNT ENABLE) -- IF <>0, ENABLE COUNT (LCTR) ; COUT: PUSH AF ;SAVE REGS PUSH BC PUSH DE PUSH HL LD E,A ;CHAR IN E PUSH DE ;PREP TO PRINT CHAR LD C,2 ;USE BDOS OUTPUT LD A,(HUSH) ;QUIET MODE? OR A ;0=YES CALL Z,BDOS ;PRINT THE CHAR IF NOT QUIET MODE POP DE LD A,(FOPEN) ;GET FILE OPEN FLAG LD HL,WRTENAB ;PT TO FILE WRITE ENABLED FLAG AND (HL) ;IF BOTH ENABLED, WRITE CHAR TO DISK ALSO LD A,E ;CHAR IN A, NOT ZERO FLAG = DISK OUTPUT CALL NZ,WRTFILE ;WRITE TO DISK IF OK LD A,E ;CHECK FOR CP 0AH JR NZ,COUT1 LD A,(CNTENAB) ;DECREMENT THE LINE COUNT IF A WAS SENT OR A ;CHECK IF COUNTING ENABLED JR Z,COUT1 LD HL,LCTR ;PT TO LINE COUNT DEC (HL) ;DECREMENT IT COUT1: POP HL ;RESTORE REGS AND EXIT POP DE POP BC POP AF RET ; ; PROMPT AND READ A COMMAND LINE FROM THE KEYBOARD ; PROMPT: CALL PRTSTAR ;PRINT PROMPT LD DE,INBUF ;PT TO INPUT LINE BUFFER LD A,80 ;SET BUFFER SIZE LD (DE),A LD C,10 ;READ INTO BUFFER FCT CALL BDOS LD HL,INBUF+1 ;PT TO CHAR COUNT READ LD E,(HL) ;GET IT IN DE LD D,0 ADD HL,DE ;PT TO AFTER LAST CHAR IN BUFFER INC HL LD (HL),0DH ;STORE ENDING LD HL,INBUF+1 ;PT TO CHAR COUNT OF BUFFER ; ; CONVERT TO UPPER CASE ; UPPR: INC HL ;PT TO NEXT CHAR LD A,(HL) ;GET IT CP 0DH ;DONE? JP Z,CRLF CP 61H ;SMALL A? JR C,UPPR ;OK IF LESS CP 7BH ;SMALL Z + 1? JR NC,UPPR ;OK IF MORE AND 5FH ;CAPITALIZE LD (HL),A ;PUT CHAR JR UPPR ;CONTINUE ; ; PRINT THE STRING: ADDR AT TOP OF STACK, TERMINATED BY 0 ; PSTRNG: XOR A ;DISABLE QUIET MODE AND DISK OUTPUT LD (WRTENAB),A LD (HUSH),A PSTG: EX (SP),HL ;PT TO STRING IN HL AND SAVE OLD HL LUP5: LD A,(HL) ;OUTPUT CHARS CALL COUT INC HL ;PT TO NEXT LD A,(HL) ;GET NEXT CHAR OR A ;DONE? JR NZ,LUP5 INC HL ;PT TO AFTER STRING EX (SP),HL ;RESTORE HL AND SET NEW RET ADR RET ; ; INITIALIZE SPECIAL CONSTANTS SO CODE IS REENTRANT ; INIT0: LD A,IBUFLEN ;SIZE OF INPUT LINE BUFFER LD (INBUF),A LD A,INITDLEN-1 ;INITIAL SIZE OF MEMORY DUMP LD (DMPLEN),A LD A,INITLCNT ;INITIAL SIZE OF LIST DISPLAY LD (NLINES),A LD (LCTR),A LD HL,BLNGTH ;INITIAL CTL PTR LD (NXTCTL),HL LD HL,INITPC ;INITIAL VALUE OF PC LD (DMPSTRT),HL LD (DMPEND),HL LD (PC),HL LD HL,INITOFF ;INITIAL OFFSET LD (OFFSET),HL LD HL,INITELST ;INITIAL END OF LISTING VALUE LD (ENDLST),HL LD HL,COMTBL ;INITIAL POSITION OF COMMENTS LD (COMST),HL LD (COMEND),HL RET ; ; INITIALIZE SYMBOL TABLE, CONTROL TABLE, AND COMMENTS TABLE ; SET EOL ; INIT: XOR A ;A=0 LD (SYMTAB+2),A ;CLEAR SYMBOL TABLE BY SET CHAR COUNT OF LD HL,SYMTAB ;... FIRST ENTRY TO ZERO LD (SYMEND),HL ;SET END ADDRESS OF SYMBOL TABLE LD A,0DH ;SET END OF INPUT LINE LD (INBUF+3),A LD HL,0FFFFH ;SET NO ENTRIES IN CONTROL TABLE LD (CTLTBL),HL LD A,'I' ;SET FOR INSTRUCTION MODE INITIALLY LD (CTLTBL-1),A ;"PREVIOUS" CONTROL TABLE ENTRY IS SET TO 'I' LD HL,COMTBL ;SET ADDRESS OF COMMENT TABLE LD (COMST),HL ;START ADDRESS LD (COMEND),HL ;END ADDRESS LD (HL),0FFH ;CLEAR FIRST ENTRY TO NO COMMENT INC HL LD (HL),0FFH RET ; ; RETURN WITH ZERO IF STRINGS (DE) AND (HL) MATCH; LENGTH IS (C) ; CHKSTG: LD A,(DE) ;GET CHAR CP (HL) ;COMPARE RET NZ ;NO MATCH INC DE ;PT TO NEXT INC HL DEC C ;COUNT DOWN JR NZ,CHKSTG RET ; ; WATCH THE CONSOLE FOR A BREAK KEY AND ABORT IF SO ; BRKCHK: PUSH BC PUSH DE PUSH HL LD C,0BH ;CHECK FOR KEY PRESS CALL BDOS OR A ;NONE IF ZERO JR Z,AHD3 LD C,1 ;GET NEW CHAR CALL BDOS CP 3 ;CHECK FOR ^C JR Z,ABORT ;ABORT IF SO CALL CRLF ;ELSE NEW LINE JP GETCMD ABORT: CALL PSTRNG ;PROMPT USER DEFB 0DH,0AH,'Abort (Y/N)? ',0 CALL CHIN CP 'Y' JP Z,WBOOT JP GETCMD AHD3: POP HL POP DE POP BC RET ; ; CHECK FOR AN ASCII CHARACTER IN A ; RETURN WITH ZERO TRUE AND NO CARRY FOR , ; RETURN WITH NO CARRY IF PRINTABLE ASCII ; ISITASC: OR A ;NULL RET Z CP 0DH RET Z ;NO CARRY CP 9 ; TAB RET Z CP 7 ; BELL RET Z CP 0CH ; FORM FEED RET Z CP 0AH RET Z ;NO CARRY CP ' ' RET C ;CARRY IF < CP 7FH CCF ;CARRY IF > 7FH RET ; ; FILE TYPES ; TPALL: DEFB 'ALL' ;FILE TYPE FOR ALL (CTL, SYM, DOC, COM, AND ASM) FILES TPASM: DEFB 'MAC' ;MAC FILE TYPE TPCOM: DEFB 'COM' ;COM FILE TYPE TPCTL: DEFB 'CTL' ;CTL FILE TYPE TPSYM: DEFB 'SYM' ;SYM FILE TYPE TPDOC: DEFB 'DOC' ;DOC FILE TYPE DEFB '.' ; ; BUFFERS ; RELEND: DEFS 2 ;RELATIVE END ADDRESS OF COM FILE DMPSTRT: DEFS 2 ;STARTING ADDRESS OF DUMP (CURRENT ADDR ALSO) DMPEND: DEFS 2 ;ENDING ADDRESS OF DUMP DMPLEN: DEFS 2 ;NUMBER OF BYTES TO DUMP AT ONE TIME - 1 OFFSET: DEFS 2 ;OFFSET VALUE SYMEND: DEFS 2 ;END OF SYMBOL TABLE PC: DEFS 2 ;CURRENT VALUE OF PC ENDLST: DEFS 2 ;END OF LISTING PTR BIASED: DEFS 2 ;BIASED OFFSET COMST: DEFS 2 ;START ADDRESS OF COMMENTS COMEND: DEFS 2 ;END ADDRESS OF COMMENTS ADB: DEFS 1 ;FLAG FOR DB BUILD (0=HEX, <>0=ASCII AND HEX) FNDPC: DEFS 2 ;TEMP PC FOR FIND FUNCTION FNDADD: DEFS 2 ;TEMP ADDRESS FOR FIND FUNCTION ECNT: DEFS 1 ;TEMP LINE COUNTER NLINES: DEFS 1 ;NUMBER OF LINES FOR LIST  LCTR: DEFS 1 ;COUNTER FOR LINES CNTENAB: DEFS 1 ;ENABLE LINE COUNT IF <> 0, ELSE DISABLE LINE CNT WRTENAB: DEFS 1 ;OUTPUT TO FILE IS ENABLED IF <> 0, NOT IF 0 RPLPTR: DEFS 2 ;MISC PTR XCPTR: DEFS 2 ;MISC PTR XCSW: DEFS 1 ;MISC PTR FOPEN: DEFS 1 ;FILE IS OPEN IF <> 0, NOT OPEN IF 0 HUSH: DEFS 1 ;DON'T PRINT COMMAND RESULT (QUIET MODE) IF 0 NXTCTL: DEFS 2 ;PTR TO NEXT CTL ENTRY BLNGTH: DEFS 1 ;BUFFER LENGTH SYMRKR: DEFS 2 ;SYMBOL MARKER DMAPTR: DEFS 2 ;PT TO DMA ADDRESS ASCBLD: DEFS 1 ;FLAG FOR A COMMAND (0=NOT A) BUILD: DEFS 1 ;FLAG FOR B COMMAND (0=NOT B) DWFLAG: DB 0 ; FLAG ENTER DB OR DW IN SYM TBL SYMBDE: DW 0 ; USE WITH DWFLAG POINTS TO SYMBOL OPCTP: DEFS 3 ; ; INPUT LINE BUFFER ; INBUF: DEFS 1 ;SIZE OF BUFFER DEFS IBUFLEN+1 ;SIZE OF INPUT LINE AND BUFFER CONTENTS RBUF: ; BUFFER FOR TITLE INFO DEFS 82 ; ; STACK AREA ; DEFS 40 ;STACK SPACE OLDST: DEFS 2 ;OLD STACK PTR ; DEFS 1 ;1 BYTE FOR INITIAL 'I' IN CONTROL TABLE ; ; NEXT PAGE AFTER PROGRAM MARKS BEGINNING OF BUFFER AREAS ; ORG $/100H*100H+100H ENDALL EQU $ END  ;SET RECORD FIELD TO ZERO LD (FCBNR),A LD HL,RECLEN ;SET DMA ADDRESS LD (DMAPTR),HL POP HL RET ; ; WRITE THE NEXT RECORD TO OPEN FILE ; NXTRCRD: LD DE,FCB ;WRITE IT LD C,15H CALL BDOS OR A ;ERROR? JR NZ,WRTERR LD DE,FCB ;CLOSE THE FILE LD C,10H CALL BDOS INC A ;ERROR IN CLOSING? RET NZ CALL PSTRNG ;SAY SO IF SO DEFB '++ Close Error ++',0DH,0AH,0 JP GETCMD ; ; AN ERROR OCCURRED DURING A WRITE RECORD ATTEMPT ; WRTERR: CALL PSTRNG DEFB '++ Write Error ++',0DH,0AH,0 ; ; WRITE INTO THE DMA BUFFER AND WRITE TO DISK WHEN IT FILLS ; CHAR TO WRITE PASSED IN A ; WRTFILE: PUSH HL LD HL,(DMAPTR) ;GET PTR LD (HL),A ;STORE NEXT CHAR INC L ;PT TO NEXT LD (DMAPTR),HL ;SET NEXT DMA POP HL RET NZ ;IF L REACHED ZERO, BUFFER WAS FULL; RET IF NZ PUSH BC ;WRITE RECORD TO DISK AND REINIT DMA PTR PUSH DE PUSH HL LD DE,FCB ;DOTITLE DASMZLG.MAC 07-26-84 00:21:00 ;This routine is the ZILOG mnemonic disassembler module for DASM.MAC. ;It is included into DASM during assembly under M80. ; IF1 .PRINTX /DASM with ZILOG-Standard Mnemonics/ ENDIF ; ; This is the Header to be printed for this module ; HEADER: DEFB 'DASM for ZILOG-Standard Mnemonics',0dh,0ah DEFB ' Derived from ZZSOURCE/RESOURCE',0dh,0ah DEFB '$',0 ; ; This is the Disassembler Module -- Instruction to be disassembled ; is pted to by PC ; DASM: CALL HSYM ;WRITE A SYMBOL IF IT EXISTS ;.. AND PUT PC ON THE CRT LD HL,(RPLPTR) ;SEE IF THIS LINE IS REPLACED LD A,H OR L JR Z,DASM1 LD B,(HL) INC HL ;SKIP THE '*' DEC B CALL NWLN0 ;PRINT THE REPLACING LINE AS A COMMENT DASM1: LD HL,(PC) EX DE,HL LD HL,(OFFSET) ADD HL,DE ;HL IS NOW THE BIASED PC LD (BIASED),HL EX DE,HL ;DE IS NOW THE BIASED PC INC HL LD (PC),HL ;THE NEW PC (NEXT BYTE) EX DE,HL ;DE IS THE BYTE AFTER THE INSTRUCTION LD B,(HL) LD HL,OPC-4 CALL GTCD CALL TYPEOC CP 0AH ;TYPES 0 THRU 9 ARE 1 BYTE JR C,OLDPC ; .. SO DON'T CHANGE THE PC LD HL,(PC) INC HL CP 10H ;TYPES 0A THRU 0FH ARE 2-BYTERS JR C,NEWPC CP 16H ;TYPES 10H THRU 15H ARE 3 BYTES JR NC,NEWPC INC HL NEWPC: LD (PC),HL OLDPC: PUSH DE ;SAVE THE 'E' REGISTER (MAY BE 'X' OR 'Y') LD E,A LD D,0 LD HL,JMPTBL ADD HL,DE ;ADD 2*OPCODE TYPE TO JMPTBL TO GET ADD HL,DE ;.. ROUTINE ADDRESS LD E,(HL) INC HL LD D,(HL) EX DE,HL ;HL NOW CONTAINS THE ROUTINE ADDRESS POP DE PUSH HL LD HL,(BIASED) RET ;'RETURN' TO THE ROUTINE ; GTCD: LD DE,4 NXTCD: ADD HL,DE NXTCD1: LD A,(HL) OR A ;SEE IF WE'RE AT THE NEXT MASK YET INC HL JP P,NXTCD1 ;JUMP IF NOT AND B ;MASK OUT VARIABLES IN THE INSTRUCTION CP (HL) ;CHECK THE GENERIC INSTRUCTION TYPE JR NZ,NXTCD INC HL LD A,(HL) ;AFTER A MATCH, GET THE OPCODE TYPE LD (OPCTP),A RET ; TOC2: CP 20H ;CONVERT SPACES IN THE TABLE TO TABS JR NZ,TOC1 LD A,9 TOC1: CALL COUT TYPEOC: INC HL ;TYPE THE OPCODE THAT HL IS POINTING TO LD A,(HL) OR A JR Z,TYPEOC JP P,TOC2 LD HL,(PC) LD A,(OPCTP) RET ; JMPTBL: DEFW T0 ;SIMPLE 1 BYTE INSTRUCTIONS DEFW T1 ;8 BIT, REGISTER ARITHMETIC & LOGICAL DEFW T2 ;DEC & INC DEFW T3 ;DOUBLE REGISTER SINGLE BYTE ARITHMETIC DEFW T4 ;8 BIT LOAD FROM MEMORY DEFW T5 ;8 BIT LOAD TO MEMORY DEFW T6 ;POP's AND PUSH's DEFW T7 ;CONDITIONAL RETURNS DEFW T8 ;THE RST INSTRUCTIONS DEFW T9 ;REGISTER TO REGISTER LOADS ;2 BYTE INSTRUCTIONS DEFW TA ;8 BIT LOAD IMMEDIATES DEFW TB ;8 BIT IMMEDIATE ARITH. & LOGICAL DEFW TC ;IN A,(n) DEFW TD ;OUT (n),A DEFW TE ;CONDITIONAL, RELATIVE JUMPS DEFW TF ;OTHER RELATIVE JUMPS ;3 BYTE INSTRUCTIONS DEFW T10 ;16 BIT LOADS DEFW T11 ;JUMPS & CALLS DEFW T12 ;DIRECT LOADS DEFW T13 ;DIRECT STORES DEFW T14 ;LD (nn),A DEFW T15 ;CONDITIONAL JUMPS & CALLS ;MULTI-BYTE OPCODES DEFW T16 ;THE 'CB' SERIES {1, 1A, 2A} DEFW T17 ;THE 'DD' SERIES {1B thru 25 & 2A}  DEFW T18 ;THE 'FD' SERIES {1B thru 25 & 2A} DEFW T19 ;THE 'ED' SERIES {0, 2, 3, 26 thru 2A} ;1 BYTE DEFW T1A ;THE BIT, RES & SET FOR 'CB' DEFW T1B ;INDEX REGISTER LOADS DEFW T1C ;JUMP INDIRECT INDEX REGISTER DEFW T1D ;INDEX REGISTER ADD ;2 BYTE DEFW T1E ;INDEX REGISTER ARITH. AND LOGICAL DEFW T1F ;INDEXED LOAD TO REGISTER DEFW T20 ;INDEXED REGISTER STORE ;3 BYTES AFTER 'DD' OR 'FE' DEFW T21 ;LD xx,nn DEFW T22 ;LD (nn),n DEFW T23 ;LD xx,(nn) DEFW T24 ;LD (xx+d),n DEFW T25 ;THE 'CB' EXTENSIONS TO 'DD' OR 'FD' ;1 BYTE AFTER 'ED' DEFW T26 ;IN r,(C) DEFW T27 ;BLOCK MOVES ;3 BYTES AFTER 'ED' DEFW T28 ;LD (nn),dd DEFW T29 ;LD dd,(nn) ;WHATEVER IS LEFT DEFW T2A ;INDEFINED OPCODES ; ;ONE BYTE INSTRUCTIONS, SIMPLE ; T0: JP DCRLF ; ;ARITHMETIC & LOGICAL, 8 BIT, REGISTER ; T1: CALL PSREG ;PRINT THE SOURCE REGISTER JP DCRLF ; ;DEC AND INC INSTRUCTIONS ; T2: CALL PDREG ;PRINT THE DESTINATION REGISTER JP DCRLF ; ;DOUBLE REGISTER SINGLE BYTE ; T3: CALL PXSREG ;PRINT HL, DE, BC, OR SP JP DCRLF T4: CALL LPAR ; LD A,(BC or DE) CALL PXSREG CALL RPAR JP DCRLF T5: CALL LPAR ; LD (BC or DE),A CALL PXSREG CALL RPAR CALL PCMAA JP DCRLF ; ;POP AND PUSH ; T6: CALL PXQREG ;PRINT HL, DE, BC, OR AF JP DCRLF ; ;CONDITIONAL RETURNS ; T7: CALL PRCND JP DCRLF ; ;THE RST INSTRUCTIONS ; T8: LD A,(HL) AND 38H CALL PRST JP DCRLF ; ;REGISTER TO REGISTER LOADS ; T9: CALL PDREG CALL COMMA LD HL,(BIASED) CALL PSREG JP DCRLF ; ;TWO BYTE INSTRUCTIONS ; 8 BIT IMMEDIATE LOADS ; TA: CALL PDREG CALL COMMA LD HL,(BIASED) ;ARITHMETIC & LOGICAL IMMEDIATES TB: INC HL DTABYT: LD A,(HL) CP ' ' JR C,NOTASC CP 5BH JR NC,NOTASC CALL PASCII LD A,'''' CALL COUT LD A,(XCSW) ;WANT SYMBOL COMMENTS? OR A JP Z,DCRLF CALL TAB CALL SEMI NOTASC: LD A,(HL) CP 0AH JR C,NTSC0 CALL PASHEX LD A,'H' CALL COUT JP DCRLF NTSC0: ADD A,'0' CALL COUT JP DCRLF ; ;IN ; TC: CALL LPAR ;FOR 'IN A,(C)' INC HL LD A,(HL) CALL PASHEX LD A,'H' CALL COUT CALL RPAR JP DCRLF ;OUT TD: CALL LPAR INC HL LD A,(HL) CALL PASHEX LD A,'H' CALL COUT CALL RPAR CALL COMMA LD A,'A' CALL COUT JP DCRLF ; ;CONDITIONAL RELATIVE JUMPS ; TE: CALL PRCND1 ;THE SPECIAL CC LIST LD HL,(BIASED) CALL COMMA ;OTHER RELATIVE INSTRUCTIONS TF: INC HL LD A,(HL) LD E,A LD D,0 LD HL,(PC) OR A JP P,PSTV DEC D PSTV: ADD HL,DE EX DE,HL CALL PRNTDE CALL C,PDERTN JP DCRLF ; ;THREE BYTE INSTRUCTIONS ;16 BIT LOADS ; T10: CALL PXSREG CALL COMMA LD HL,(BIASED) ;JUMPS AND CALLS T11: CALL PRNN CALL C,PDERTN JP DCRLF ; ;LOAD DIRECT ; T12: CALL DRADR CALL C,PDERTN JP DCRLF DRADR: CALL LPAR ;PRINT THE VALUE FOR DE IN PARENTHESIS LD A,B ; GET OP CODE TYPE FIND OUT IF DW OR DB CP 3AH ; LD A,(NN) JR Z,DBFILL CP 32H ; LD (NN),A JR Z,DBFILL LD A,2 ; DW TYPE JR DWFILL DBFILL: LD A,1 DWFILL: LD (DWFLAG),A ; CALL PRNN PUSH AF CALL RPAR POP AF RET ; ;STORE DIRECT ; T13: CALL DRADR PUSH AF CALL COMMA LD A,'H' CALL COUT LD A,'L' CALL COUT POP AF CALL C,PDERTN JP DCRLF ; ;STORE ACCUMULATOR DIRECT ; T14: CALL DRADR PUSH AF CALL PCMAA POP AF CALL C,PDERTN JP DCRLF ; ;CONDITIONAL JUMPS & CALLS ; T15: CALL PRCND CALL COMMA LD HL,(BIASED) CALL PRNN CALL C,PDERTN JP DCRLF ; ;THE 'CB' SERIES LEAD IN ; T16: INC HL LD B,(HL) ;THE SECOND BYTE OF THE INSTRUCTION LD (BIASED),HL LD HL,OPC2-4 CALL GTCD ;FIND THE TYPE OF THE 'CB' INSTRUCTION CALL TYPEOC JP OLDPC ; ;THE 'DD' SERIES LEAD IN ; T17: LD E,'X' ;FOR THE 'IX' INSTRUCTIONS T170: PUSH DE INC HL LD (BIASED),HL LD B,(HL) LD HL,OPC3-4 CALL GTCD CALL TYPEOC POP DE CP 1EH JP C,OLDPC CP 2AH JP Z,OLDPC CP 21H INC HL JP C,NEWPC INC HL JP NEWPC ; ;THE 'FD' SERIES LEAD IN ; T18: LD E,'Y' JR T170 ; ;THE 'ED' SERIES LEAD IN ; T19: INC HL LD (BIASED),HL LD B,(HL) LD HL,OPC4-4 CALL GTCD CALL TYPEOC CP 28H JP C,OLDPC CP 2AH JP Z,OLDPC INC HL INC HL JP NEWPC ; ;BIT, RES AND SET ; T1A: CALL PBIT CALL COMMA CALL PSREG JP DCRLF ; ;INDEX REGISTER MOVES ; T1B: CALL PRXX ;TO TYPE EITHER 'IX' OR 'IY' JP DCRLF ; ;JUMP INDIRECT TO INDEX REGISTER ; T1C: CALL LPAR CALL PRXX CALL RPAR JP DCRLF ; ;INDEX REGISTER ADDITION ; T1D: CALL PRXX CALL COMMA LD A,E CP 'X' LD A,(HL) LD HL,IXREGS JR Z,T1D0 LD HL,IYREGS T1D0: CALL PXREG JP DCRLF ; ;INDEX REGISTER ARITHMETIC AND LOGICAL ; T1E: INC HL CALL PDISP ;PRINT '(IX(Y)+d) JP DCRLF ; ;INDEXED LOAD TO REGISTER ; T1F: CALL PDREG CALL COMMA LD HL,(BIASED) INC HL CALL PDISP JP DCRLF ; ;INDEXED REGISTER STORE ; T20: INC HL CALL PDISP CALL COMMA LD HL,(BIASED) CALL PSREG JP DCRLF ; ; LD xx,nn ; T21: CALL PRXX CALL COMMA CALL PRNN CALL C,PDERTN JP DCRLF ; ; LD (nn),xx ; T22: CALL LPAR PUSH DE LD A,2 ; DW TYPE LD (DWFLAG),A CALL PRNN EX DE,HL ;HL NOW CONTAINS THE NUMBER POP DE ;RECOVER THE 'E' REG. ('X' OR 'Y') PUSH AF ;SAVE THE CARRY FOR A LATER 'PEDRTN' CALL RPAR CALL COMMA CALL PRXX POP AF ;THE CARRY FLAG IS RESTORED EX DE,HL ;DE AGAIN CONTAINS THE VALUE FOR nn CALL C,PDERTN JP DCRLF ; ; LD xx,(nn) ; T23: CALL PRXX CALL COMMA CALL LPAR LD A,2 ; DW TYPE LD (DWFLAG),A CALL PRNN PUSH AF ;SAVE Cy VALUE CALL RPAR POP AF CALL C,PDERTN JP DCRLF ; ; LD (xx+d),n ; T24: INC HL CALL PDISP CALL COMMA JP TB ; ;THE 'CB' EXTENSIONS TO 'DD' OR 'FD' ; T25: INC HL INC HL LD B,(HL) LD HL,OPC2-4 PUSH DE ;SAVE 'X' OR 'Y' CALL GTCD CALL TYPEOC POP DE LD A,B ;GET THE O.C. AND 7 CP 6 JR NZ,ILLEG LD A,(OPCTP) LD HL,(BIASED) CP 1AH JP C,T1E JR Z,DD12 ILLEG: LD HL,(PC) DEC HL DEC HL LD (PC),HL JP T2A DD12: INC HL INC HL CALL PBIT CALL COMMA DEC HL DEC HL JP T1E ; ; IN r,(C) ; T26: CALL PDREG CALL COMMA CALL LPAR LD A,'C' CALL COUT CALL RPAR JP DCRLF ; ;THE BLOCK MOVES AND I/O ; T27: LD A,(HL) AND 8 LD A,'I' ;AN INCREMENTING TYPE OF INSTRUCTION? JP Z,T270 LD A,'D' ;NO, IT WAS DECREMENTING T270: CALL COUT LD A,(HL) AND 10H JP Z,DCRLF LD A,'R' ;A REPEATING INSTRUCTION TYPE CALL COUT JP DCRLF ; ; LD (nn),dd ; T28: CALL LPAR LD A,2 ; DW TYPE LD (DWFLAG),A CALL PRNN PUSH AF ;SAVE Cy VALUE PUSH DE ;SAVE THE 'NN' VALUE CALL RPAR CALL COMMA LD HL,(BIASED) CALL PXSREG POP DE POP AF CALL C,PDERTN JP DCRLF ; ; LD dd,(nn) ; T29: CALL PXSREG CALL COMMA LD HL,(BIASED) CALL LPAR LD A,2 ; DW TYPE LD (DWFLAG),A CALL PRNN PUSH AF CALL RPAR POP AF CALL C,PDERTN JP DCRLF ; ;ALL UNDEFINED OPCODES COME HERE FOR A 'DB VALUE' TREATMENT ; T2A: LD HL,(PC) DEC HL LD (PC),HL LD HL,(BIASED) DEC HL CALL PSTG DEFB 'DB',9,0 JP DTABYT ; ; VARIOUS CHARACTERS TO PRINT ; COMMA: LD A,',' JP COUT TAB: LD A,9 JP COUT SEMI: LD A,';' JP COUT LPAR: LD A,'(' JP COUT RPAR: LD A,')' JP COUT PCMAA: CALL COMMA LD A,'A' JP COUT ; ; PRINT THE CONDITION CODE LETTERS FOR THIS INSTRUCTION. ; PRCND: LD A,(HL) AND 38H ;FOR A FULL SET OF CONDITION CODES PRC: RRCA RRCA LD HL,CNDTAB CALL SKIP LD A,(HL) CALL COUT INC HL LD A,(HL) CP '.' CALL NZ,COUT RET PRCND1: LD A,(HL) AND 18H JR PRC CNDTAB: DEFB 'NZZ.NCC.POPEP.M.' ; ; PRINT THE SOURCE REGISTER FOR A BYTE ; PSREG: LD A,(HL) PREG: LD HL,REGTAB AND 7 CP 6 ;MUST CATCH THE (HL) REFERENCES JP Z,PHLREG CALL SKIP LD A,(HL) JP COUT PHLREG: CALL LPAR LD A,'H' CALL COUT LD A,'L' CALL COUT JP RPAR PDREG: LD A,(HL) ;PRINT THE DESTINATION REGISTER FOR A BYTE RRA RRA RRA JP PREG ; ; ADVANCE H&L BY (A) ; SKIP: ADD A,L LD L,A RET NC INC H RET REGTAB: DEFB 'BCDEHLMA' ;'M' IS NEVER PRINTED - '(HL)' IS INSTEAD ; ; PRINT A DOUBLE REGISTER PAIR ; PXSREG: LD A,(HL) LD HL,DREGS JR PXREG PXQREG: LD A,(HL) LD HL,DREGQ PXREG: RRA RRA RRA AND 6 CALL SKIP LD A,(HL) CALL COUT INC HL LD A,(HL) JP COUT DREGS: DEFB 'BCDEHLSP' DREGQ: DEFB 'BCDEHLAF' IXREGS: DEFB 'BCDEIXSP' IYREGS: DEFB 'BCDEIYSP' ; PBIT: LD A,(HL) RRA RRA RRA AND 7 ADD A,'0' JP COUT PRXX: LD A,'I' CALL COUT LD A,E JP COUT ; ;PRINT A LEADING QUOTE AND THEN THE ASCII ;.. (PRINT '' FOR '). ; PASCII: PUSH AF LD A,'''' CALL COUT POP AF CP '''' JP NZ,COUT PUSH AF CALL COUT POP AF JP COUT ;PRINT THE VALUE IN A AS HEX ; WITH A LEADING ZERO IF NECESSARY PASHEX: CP 0A0H JP C,PHEX PUSH AF LD A,'0' CALL COUT POP AF JP PHEX ;PRINT THE STRING AT (HL) FOR (B) CHARACTERS. PRNT: LD A,(HL) CALL COUT INC HL DEC B JP NZ,PRNT RET ; ;PRINT A DISPLACEMENT IN THE FORM '(IX+d)' PDISP: CALL LPAR CALL PRXX LD A,'+' CALL COUT LD A,(HL) CALL PASHEX LD A,'H' CALL COUT JP RPAR ; ;PRINT THE NEXT 2 BYTES AS A SYMBOL (AND RETURN Cy=1) IF POSSIBLE ; PRNN: INC HL LD E,(HL) INC HL LD D,(HL) PRNTDE: PUSH DE CALL SYMSCH JP C,NOMTCH CALL PRNT ;GOT ONE, SO PRINT IT POP DE SCF ;INDICATE THAT A SYMBOL WAS PRINTED RET NOMTCH: LD A,(BUILD) ;DO WE BUILD A SYMBOL? OR A POP DE JR Z,NOBLD ;JUST PRINT THE HEX VALUE PUSH DE CALL BLDSYM POP DE JR NOBLD PDERTN: LD A,(XCSW) OR A RET Z ;DON'T PRINT THE SYMBOL AS A COMMENT CALL TAB ;WE'LL PRINT A VALUE AS A COMMENT CALL SEMI NOBLD: LD A,D OR E LD A,'0' JR Z,NOBLD1 LD A,D OR A JR Z,NOBLD2 CALL PASHEX ;PRINT THE HIGH ORDER BYTE LD A,E CALL PHEX NOBLD0: LD A,'H' NOBLD1: CALL COUT OR A ;CLEAR THE CARRY RET NOBLD2: LD A,E PRST: CP 0AH JR C,NOBLD3 CALL PASHEX JR NOBLD0 NOBLD3: ADD A,'0' JR NOBLD1 ; ; OPCODE TABLES ; OPC: DEFB 0FFH,0EBH,0,'EX DE,HL' DEFB 0FFH,008H,0,'EX AF,AF''' DEFB 0FFH,0D9H,0,'EXX' DEFB 0FFH,0E3H,0,'EX (SP),HL' DEFB 0FFH,027H,0,'DAA' DEFB 0FFH,0F3H,0,'DI' DEFB 0FFH,0FBH,0,'EI' DEFB 0FFH,076H,0,'HALT' DEFB 0FFH,02FH,0,'CPL' DEFB 0FFH,03FH,0,'CCF' DEFB 0FFH,000H,0,'NOP' DEFB 0FFH,037H,0,'SCF' DEFB 0FFH,0E9H,0,'JP (HL)' DEFB 0FFH,007H,0,'RLCA' DEFB 0FFH,017H,0,'RLA' DEFB 0FFH,00FH,0,'RRCA' DEFB 0FFH,01FH,0,'RRA' DEFB 0FFH,0C9H,0,'RET' DEFB 0FFH,0F9H,0,'LD SP,HL' DEFB 0F8H,088H,1,'ADC A,' DEFB 0F8H,080H,1,'ADD A,' DEFB 0F8H,0A0H,1,'AND ' DEFB 0F8H,0B8H,1,'CP ' DEFB 0F8H,0B0H,1,'OR ' DEFB 0F8H,098H,1,'SBC A,' DEFB 0F8H,090H,1,'SUB ' DEFB 0F8H,0A8H,1,'XOR ' DEFB 0C7H,005H,2,'DEC ' DEFB 0C7H,004H,2,'INC ' DEFB 0CFH,009H,3,'ADD HL,' DEFB 0CFH,00BH,3,'DEC ' DEFB 0CFH,003H,3,'INC ' DEFB 0EFH,00AH,4,'LD A,' DEFB 0EFH,002H,5,'LD ' DEFB 0CFH,0C1H,6,'POP ' DEFB 0CFH,0C5H,6,'PUSH ' DEFB 0C7H,0C0H,7,'RET ' DEFB 0C7H,0C7H,8,'RST ' DEFB 0C0H,040H,9,'LD ' DEFB 0C7H,006H,0AH,'LD ' DEFB 0FFH,0C6H,0BH,'ADD A,' DEFB 0FFH,0CEH,0BH,'ADC A,' DEFB 0FFH,0E6H,0BH,'AND ' DEFB 0FFH,0FEH,0BH,'CP ' DEFB 0FFH,0F6H,0BH,'OR ' DEFB 0FFH,0D6H,0BH,'SUB ' DEFB 0FFH,0DEH,0BH,'SBC A,' DEFB 0FFH,0EEH,0BH,'XOR ' DEFB 0FFH,0DBH,0CH,'IN A,' DEFB 0FFH,0D3H,0DH,'OUT ' DEFB 0E7H,020H,0EH,'JR ' DEFB 0FFH,010H,0FH,'DJNZ ' DEFB 0FFH,018H,0FH,'JR ' DEFB 0CFH,001H,10H,'LD ' DEFB 0FFH,0C3H,11H,'JP ' DEFB 0FFH,0CDH,11H,'CALL ' DEFB 0FFH,03AH,12H,'LD A,' DEFB 0FFH,02AH,12H,'LD HL,' DEFB 0FFH,022H,13H,'LD ' DEFB 0FFH,032H,14H,'LD ' DEFB 0C7H,0C4H,15H,'CALL ' DEFB 0C7H,0C2H,15H,'JP ' DEFB 0FFH,0CBH,16H,0,0 DEFB 0FFH,0DDH,17H,0,0 DEFB 0FFH,0FDH,18H,0,0 DEFB 0FFH,0EDH,19H OPC2: DEFB 0F8H,000H,01H,'RLC ' DEFB 0F8H,008H,01H,'RRC ' DEFB 0F8H,010H,01H,'RL ' DEFB 0F8H,018H,01H,'RR ' DEFB 0F8H,020H,01H,'SLA ' DEFB 0F8H,028H,01H,'SRA ' DEFB 0F8H,038H,01H,'SRL ' DEFB 0C0H,040H,1AH,'BIT ' DEFB 0C0H,080H,1AH,'RES ' DEFB 0C0H,0C0H,1AH,'SET ' DEFB 080H,000H,2AH OPC3: DEFB 0FFH,0E3H,1BH,'EX (SP),' DEFB 0FFH,0E9H,1CH,'JP ' DEFB 0FFH,0F9H,1BH,'LD SP,' DEFB 0FFH,0E1H,1BH,'POP ' DEFB 0FFH,0E5H,1BH,'PUSH ' DEFB 0CFH,009H,1DH,'ADD ' DEFB 0FFH,023H,1BH,'INC ' DEFB 0FFH,02BH,1BH,'DEC ' DEFB 0FFH,034H,1EH,'INC ' DEFB 0FFH,035H,1EH,'DEC ' DEFB 0FFH,086H,1EH,'ADD A,' DEFB 0FFH,08EH,1EH,'ADC A,' DEFB 0FFH,096H,1EH,'SUB ' DEFB 0FFH,09EH,1EH,'SBC A,' DEFB 0FFH,0A6H,1EH,'AND ' DEFB 0FFH,0AEH,1EH,'XOR ' DEFB 0FFH,0B6H,1EH,'OR ' DEFB 0FFH,0BEH,1EH,'CP ' DEFB 0C7H,046H,1FH,'LD ' DEFB 0F8H,070H,20H,'LD ' DEFB 0FFH,021H,21H,'LD ' DEFB 0FFH,022H,22H,'LD ' DEFB 0FFH,02AH,23H,'LD ' DEFB 0FFH,036H,24H,'LD ' DEFB 0FFH,0CBH,25H,0,0 DEFB 080H,000H,2AH,0,0 DEFB 080H,080H,2AH OPC4: DEFB 0FEH,070H,2AH,0,0;PREVENTS 'IN (HL),(C)' DEFB 0FFH,044H,00H,'NEG' DEFB 0FFH,045H,00H,'RETN' DEFB 0FFH,046H,00H,'IM 0' DEFB 0FFH,056H,00H,'IM 1' DEFB 0FFH,05EH,00H,'IM 2' DEFB 0FFH,047H,00H,'LD I,A' DEFB 0FFH,04DH,00H,'RETI' DEFB 0FFH,04FH,00H,'LD R,A' DEFB 0FFH,057H,00H,'LD A,I' DEFB 0FFH,05FH,00H,'LD A,R' DEFB 0FFH,067H,00H,'RRD' DEFB 0FFH,06FH,00H,'RLD' DEFB 0CFH,042H,03H,'SBC HL,' DEFB 0CFH,04AH,03H,'ADC HL,' DEFB 0C7H,040H,26H,'IN ' DEFB 0C7H,041H,02H,'OUT (C),' DEFB 0E7H,0A0H,27H,'LD' DEFB 0E7H,0A1H,27H,'CP' DEFB 0E7H,0A2H,27H,'IN' DEFB 0F7H,0A3H,27H,'OUT' DEFB 0F7H,0B3H,27H,'OT' DEFB 0CFH,043H,28H,'LD ' DEFB 0CFH,04BH,29H,'LD ' DEFB 080H,000H,2AH,0,0 DEFB 080H,080H,2AH ; ; END OF OPCODE TABLE ; OF CHARS REMAINING IN OUTPUT BUFFER OBUFBACKCNT: DS 1 ; OUTPUT BUFFER (BLOCK) OBUF: DS 128 ; CURRENT INPUT LINE BUFFER INLN: DS 80 ;80 CHARS IN LINE DS 3 ;3 EXTRA FOR ; PTR TO CURRENT POSITION IN INPUT BUFFER IBUFPTR: DS 2 ; COUNT OF NUMBER OF CHARS LEFT IN INPUT BUFFER IBUFCNT: DS 1 ; INPUT BUFFER (BLOCK) IBUFFER: DS 128 END   DIRZ.DOC This is XDIR modified by Rich Harrington to work on CP/M 3.0. The original program used FUNCTION 27 (Get addr ALLOC) which may not work in 3.0. See CP/M PROGRAMMER'S GUIDE. The modification counts the size of all files on the disk and subtracts them from the disk capacity. ENHANCEMENT If your input line includes "sp>LST:" the output of DIRZ will go to the LST: device and the continue message is suppressed. EXAMPLE DIRZ *.MAC >LST: Good luck Rich Harrington 31 Blade Way Walnut Creek, CA 94595  !9". ! !"w !~>*=# =#/2 ͻ>+ ͼ`>!+ ]}2>) ͼo*. $ D.M.M.Software  : *+"} w !"Return to continue- $!Y 6&l ~$> !Y /H!Y 4:$ !6:\":\=_:] 5 ?]:& D!1 6?O 21  2 ] ?\DMF ! "W *M ##)*W "U *I &#͏"= *M #"?  != ͕"A >!K 2C \20 :0 :0 ƀo&"D ~o*? +"? *D  DMG*" "" *D DM!o*D DMG *U q#p*' "' . *D #DM*U -9*D  *U w*+ #"+ )*W *U s#r*U "U 20 !f 6!"i *+ " >!f *f &g ) ^#V"^ O! ^#V"` :f =2f ` ^ ͯҎ*^ "Z *` "\ *^ ͙)*W ^#V"b \ Z ͯژ*Z )*W N#F*b *Z #"Z *\ )*W ^#V*b DM>*\ +"\ \ Z ͯ*Z )*W ^#V"d *\ )*W *Z )*W N#Fq#p*\ )*W *d s#r*Z #"Z *\ +"\ ^ \ ͯZ ` ͯͨ` Z ͯ:f <2f O!g *Z s#r*f & ) *` s#r*\ "` þ\ ^ ͯ):f <2f O!g *^ s#r*f & ) *\ s#r*Z "^ þ!" " +  ͯN* ") * #" )*W * #" )*W N#Fq#p+  ͯ* )*W * ) *W ^#VN#FH;* #" )*W ^#V"U  *U ^#V" * )*W ^#V"U *U  p *U q#pq!- 6:!- 1 :$ / !:- ' :- <2- !" ͉a)  ͯ:- <2- O:o͉!- 6uM-e * )*W ^#V"U ! 6> ! ڮ* &*U >O: <2 Š:$ / *U ^#V*A {DM K* " =*K #" " " *O " > ͼ:  * +" ! ͕+s#r! 6" * ~2 * #" * +" >ͥʁ: 2 ]* +" : <2 O>;! 6* #" * ~2 ;͉͉*) DM  *' *A {DM  * *A {DM  *? DM  *" * R*A {DM  AO . g - >>!1  ~?4W >#&:% /!:C _ Y#S W j#aN#FogDM!>))Ҋ =‚) ^#V|g}o ™_{ozgi`N#Fogo&og_{_z#W OY:  -{- ! s+p+q*  \ 2 <2 : ! 9  ! 4# ! 6: =! * & N! 4> >3u ́ 03}d Z;w { )ڎ #† File Typ Size : Files Occupying Kbytes of Kbytes Drive Capacity Directory Entries and : >LST: Kbytes Remain on drive 2S :R !S  ͜!S 4# !S 6:T =!S * &U NL0400  L0A06X cL08638V L04B4 L04AB L04EB[ 9 L0A39 ; L0A3B NL0400  L0A06X c Good luck Rich Harrington 31 Blade Way Walnut Creek, CA 94595 TITLE DIRZ.MAC 07-19-84 01:55:00 .Z80 ASEG ORG 0100H DBUF EQU 80H DFCB EQU 5CH L0000 EQU 00H L0001 EQU 01H L0002 EQU 02H L000B EQU 0BH L000D EQU 0DH L000F EQU 0FH L0010 EQU 10H L005D EQU 5DH L006C EQU 6CH LC22 EQU 16H LC23 EQU 17H MULTKK EQU 100AH LD HL,L0000 ADD HL,SP LD (L09D0),HL LD HL,STACK LD SP,HL LD HL,LC23 LD (LINTCT),HL LD DE,SIGNON LD C,9 CALL 5 ; ; *************************************** ; ; REDIRECT OUTPUT TO LST: IF COMMAND LINE ; CONTAINS sp>LST: ON THE END. ; ; ************************************** ; LD HL,80H LOOP1: LD A,(HL) CP '>' ; DO WE REDIRECT JP Z,REDIR OR A JP Z,NOLST ; NO INC HL JP LOOP1 REDIR: LD DE,LSTM LD B,5 ; MATCH 5 CHAR LOOP2: LD A,(DE) CP (HL) JP NZ,NOLST INC HL INC DE DEC B JP NZ,LOOP2 ; MORE TO CHECK ; LD (LSTF),A ; IF NON ZERO PRINT ; NOLST: ; FILL FCB FROM INPUT CALL L01E2 ; GET DIR ENTRIES & CK FOR MATCH CALL L0292 LD A,0 LD DE,L09CD CALL L0877 OR L JP Z,L013C LD A,1 LD HL,L09CD CALL L0882 JP NC,L0139 CALL L033F L0139: CALL L04F4 L013C: LD A,0 LD DE,L09CB CALL L0877 OR L JP Z,L014B CALL L05B6 L014B: CALL TELSIZ LD HL,(L09D0) LD SP,HL RET SIGNON: DB 0DH,'$ D.M.M.Software' L0164: DB 4 ; PRINT CR LF & MESSAGE IF REQUIRED PCRLFM: LD C,0DH CALL CHRCON LD C,0AH CALL CHRCON LD A,(LSTF) ; PRINT CONTINUE MESS OR A RET NZ ; NO LD HL,(LINTCT) DEC HL LD (LINTCT),HL LD A,L OR H RET NZ LD DE,MESS1 ; PRINT MESSAGE RET TO CONTINUE LD C,9 CALL 5 ; WAIT FOR CHAR FROM CON: LD C,1 CALL 5 LD DE,SIGNON LD C,9 CALL 5 LD HL,LC22 LD (LINTCT),HL RET LINTCT: DW 0C9D1H MESS1: DB 'Return to continue- $' L01AC: LD HL,L09FB LD (HL),0 L01B1: RET ; CODE FROM HERE TO 1E1 NOT WORKING NOP ; BUT IF REMOVED PROGRAM DOES NOT WORK NOP LD H,0 LD BC,L006C ADD HL,BC LD A,(HL) SUB '$' ADD A,0FFH SBC A,A PUSH AF LD A,0AH LD HL,L09FB SUB (HL) SBC A,A CPL POP BC LD C,B AND C RRA JP NC,L01D7 L01D0: LD HL,L09FB INC (HL) JP L01B1 L01D7: LD A,(L09C6) RRA RET NC LD HL,L0164 LD (HL),5 RET L01E2: CALL L01AC LD A,(DFCB) CP 0 JP Z,L01F9 LD A,(DFCB) DEC A LD E,A LD D,0 ; SEL DISK LD C,0EH CALL 5 L01F9: LD A,(L005D) CP ' ' JP NZ,L020C LD C,0BH PUSH BC LD E,'?' LD BC,L005D CALL L08AD L020C: LD A,(L09C8) RRA JP NC,L021B L0213: LD HL,L09D3 LD (HL),'?' JP L0226 L021B: LD DE,0FFH ; GET USER # LD C,' ' CALL 5 LD (L09D3),A L0226: LD C,0BH PUSH BC LD DE,L09D4 LD BC,L005D CALL L08A2 LD C,0DH PUSH BC LD E,'?' LD BC,DFCB CALL L08AD LD BC,L000F PUSH BC LD DE,L0000 ; GET DISK PARM BLOCK LD C,1FH CALL 5 LD B,H LD C,L LD DE,DPBSTO ; MOVE DPB CALL L08A2 LD HL,STACK LD (L09F9),HL LD HL,(DPBDRM) INC HL INC HL ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD (L09F7),HL LD HL,(DPBBLM) LD H,0 INC HL LD C,7 CALL L084A LD (L09DF),HL LD HL,(DPBDRM) INC HL LD (DIRLFT),HL LD C,0AH LD HL,L09DF CALL RRCTIM LD (SUSIZE),HL LD A,0FFH LD HL,DPBDSM CALL L0882 SBC A,A LD (LGSMFS),A RET L0292: LD DE,DFCB LD C,11H CALL 5 LD (DRETCD),A L029D: LD A,(DRETCD) CP 0FFH RET Z LD A,(DRETCD) AND 3 ; MULT BY 32 TO GET FILE NAME ADD A,A ; RETURNED BY CPM ADD A,A ADD A,A ADD A,A ADD A,A ADD A,80H LD L,A LD H,0 LD (FILEPT),HL LD A,(HL) ; ERASED FILE GET NEXT FILE CP 0E5H JP Z,L0331 LD HL,(DIRLFT) DEC HL LD (DIRLFT),HL ; ; ************************************ ; ; FIX FILES REMAINING ; LD HL,(FILEPT) LD BC,10H ADD HL,BC LD B,H LD C,L CALL CTFLPR PUSH HL LD HL,(DFILEU) POP BC ADD HL,BC LD (DFILEU),HL ; ; ********************************** ; LD HL,(FILEPT) LD B,H LD C,L ; DOES FILE MATCH WHAT WE ARE LOOKING FOR CALL L07DC RRA ; NO MATCH JP NC,L0331 LD BC,L0010 LD HL,(FILEPT) ADD HL,BC LD B,H LD C,L CALL CTFLPR LD BC,L000D PUSH HL LD HL,(L09F7) ; GET USER # ADD HL,BC POP BC LD (HL),C INC HL LD (HL),B LD HL,(FUSED) ADD HL,BC LD (FUSED),HL LD L,0BH PUSH HL LD HL,(FILEPT) INC HL LD B,H LD C,L LD HL,(L09F7) EX DE,HL POP HL L02FB: LD A,(BC) LD (DE),A INC BC INC DE DEC L JP NZ,L02FB LD HL,(FILEPT) LD BC,L000B PUSH HL LD HL,(L09F7) ADD HL,BC POP DE LD A,(DE) LD (HL),A LD HL,(L09CD) INC HL LD (L09CD),HL ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE PUSH HL LD HL,(L09F7) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D LD DE,L0010 LD HL,(L09F7) ADD HL,DE LD (L09F7),HL L0331: LD DE,L0000 LD C,12H CALL 5 LD (DRETCD),A JP L029D L033F: LD HL,L0A08 LD (HL),1 LD HL,L0001 LD (L0A0B),HL LD HL,(L09CD) LD (L0A23),HL L0350: LD A,0 LD HL,L0A08 CP (HL) RET NC LD HL,(L0A08) LD H,0 LD BC,L0A09 ADD HL,HL ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L0A00),HL DEC BC LD A,(BC) LD C,A LD B,0 LD HL,L0A21  ADD HL,BC ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L0A02),HL LD A,(L0A08) DEC A LD (L0A08),A L0380: LD BC,L0A02 LD DE,L0A00 CALL L086A JP NC,L0350 LD HL,(L0A00) LD (L09FC),HL LD HL,(L0A02) LD (L09FE),HL EX DE,HL LD HL,(L0A00) ADD HL,DE LD C,1 CALL L0854 ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L0A04),HL L03AF: LD DE,L09FE LD BC,L09FC CALL L086A JP C,L045A L03BB: LD HL,(L09FC) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD C,(HL) INC HL LD B,(HL) LD HL,(L0A04) EX DE,HL CALL L07C2 CP 0FFH JP NZ,L03DD LD HL,(L09FC) INC HL LD (L09FC),HL JP L03BB L03DD: LD HL,(L09FE) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) LD HL,(L0A04) LD B,H LD C,L CALL L07C2 CP 0FFH JP NZ,L0400 LD HL,(L09FE) DEC HL LD (L09FE),HL JP L03DD L0400: LD DE,L09FE LD BC,L09FC CALL L086A JP C,L03AF LD HL,(L09FC) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L0A06),HL LD HL,(L09FE) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE PUSH HL LD HL,(L09FC) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE EX (SP),HL LD C,(HL) INC HL LD B,(HL) POP HL LD (HL),C INC HL LD (HL),B LD HL,(L09FE) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE PUSH HL LD HL,(L0A06) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D LD HL,(L09FC) INC HL LD (L09FC),HL LD HL,(L09FE) DEC HL LD (L09FE),HL JP L03AF L045A: LD BC,L0A00 LD DE,L09FE CALL L086A LD BC,L09FC LD DE,L0A02 PUSH HL CALL L086A POP DE CALL L0863 JP NC,L04B4 LD BC,L0A02 LD DE,L09FC CALL L086A JP NC,L04AB LD A,(L0A08) INC A LD (L0A08),A LD C,A LD B,0 LD HL,L0A09 ADD HL,BC ADD HL,BC PUSH HL LD HL,(L09FC) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D LD HL,(L0A08) LD H,0 LD BC,L0A21 ADD HL,HL ADD HL,BC PUSH HL LD HL,(L0A02) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D L04AB: LD HL,(L09FE) LD (L0A02),HL JP L0380 L04B4: LD BC,L09FE LD DE,L0A00 CALL L086A JP NC,L04EB LD A,(L0A08) INC A LD (L0A08),A LD C,A LD B,0 LD HL,L0A09 ADD HL,BC ADD HL,BC PUSH HL LD HL,(L0A00) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D LD HL,(L0A08) LD H,0 LD BC,L0A21 ADD HL,HL ADD HL,BC PUSH HL LD HL,(L09FE) EX DE,HL POP HL LD (HL),E INC HL LD (HL),D L04EB: LD HL,(L09FC) LD (L0A00),HL JP L0380 L04F4: LD HL,L0000 LD (L0A39),HL LD (L0A3B),HL L04FD: LD BC,L09CD LD DE,L0A3B CALL L086A JP C,L0510 LD HL,(L0A39) LD (L09CB),HL RET L0510: LD HL,(L0A3B) INC HL LD (L0A3B),HL ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE PUSH HL LD HL,(L0A39) INC HL LD (L0A39),HL ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE EX (SP),HL LD C,(HL) INC HL LD B,(HL) POP HL LD (HL),C INC HL LD (HL),B L0533: LD BC,L09CD LD DE,L0A3B CALL L086A SBC A,A PUSH AF LD HL,(L0A39) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE PUSH HL LD HL,(L0A3B) LD BC,L0002 ADD HL,HL ADD HL,BC EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) POP HL LD C,(HL) INC HL LD B,(HL) CALL L07C2 SUB 0 SUB 1 SBC A,A POP BC LD C,B AND C RRA JP NC,L04FD LD HL,(L0A3B) INC HL LD (L0A3B),HL ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L09F7),HL LD BC,L000D LD HL,(L09F7) ADD HL,BC LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L0A3D),HL LD HL,(L0A39) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L09F7),HL LD HL,(L09F7) ADD HL,BC LD DE,L0A3D CALL L082B LD BC,L000D PUSH HL LD HL,(L09F7) ADD HL,BC POP BC LD (HL),C INC HL LD (HL),B JP L0533 L05B6: LD HL,L09CF LD (HL),1 L05BB: LD A,(L0164) LD HL,L09CF CP (HL) JP C,L05F3 LD BC,L0943 CALL STRCON LD A,(L09C6) CPL RRA JP NC,L05D9 LD BC,L094F CALL STRCON L05D9: LD HL,L0164 LD A,(L09CF) CP (HL) JP NC,L05E9 LD BC,L0956 CALL STRCON L05E9: LD A,(L09CF) INC A LD (L09CF),A JP NZ,L05BB L05F3: LD HL,L0001 LD (L0A3F),HL CALL PCRLFM CALL L0623 L05FF: LD DE,L09CB LD BC,L0A3F CALL L086A RET C LD A,(L09CF) INC A LD (L09CF),A LD C,A LD A,(L0164) CP C JP NC,L0631 CALL PCRLFM LD HL,L09CF LD (HL),1 JP L0637 L0623: LD B,'M' LD C,'-' L0627: PUSH BC CALL CHRCON POP BC DEC B JP NZ,L0627 RET L0631: LD BC,L095A CALL STRCON L0637: LD HL,(L0A3F) ADD HL,HL EX DE,HL LD HL,(L09F9) ADD HL,DE LD E,(HL) INC HL LD D,(HL) EX DE,HL LD (L09F7),HL LD HL,L0A41 LD (HL),0 L064C: LD A,0AH LD HL,L0A41 CP (HL) JP C,L0670 LD HL,(L0A41) LD H,0 EX DE,HL LD HL,(L09F7) ADD HL,DE LD A,7FH AND (HL) LD C,A CALL CHRCON LD A,(L0A41) INC A LD (L0A41),A JP NZ,L064C L0670: LD A,(L09C6) CPL RRA JP NC,L0694 LD BC,L000D LD HL,(L09F7) ADD HL,BC LD E,(HL) INC HL LD D,(HL) LD HL,(SUSIZE) CALL MULT LD B,H LD C,L LD E,5 CALL PTDEC LD C,'K' CALL CHRCON L0694: LD DE,L0001 LD HL,(L0A3F) ADD HL,DE LD (L0A3F),HL JP NC,L05FF RET TELSIZ: LD HL,(DPBDSM) INC HL LD (FCAP),HL LD (L0A4A),HL LD (L0A4C),HL LD HL,(DPBALO) ; DIR RESERVED BLOCKS LD (AL0AL1),HL L06B5: LD A,0 LD DE,AL0AL1 CALL L0877 OR L ; IF NO DIR SPACE USED JP Z,L06DF LD A,(AL0AL1) RRA JP NC,L06CF LD HL,(FCAP) DEC HL LD (FCAP),HL L06CF: LD C,1 LD HL,AL0AL1 CALL RRCTIM EX DE,HL DEC HL LD (HL),E INC HL LD (HL),D JP L06B5 L06DF: LD HL,L0A4E LD (HL),0 LD DE,L0000 LD C,1BH CALL 5 LD (L0A44),HL LD HL,(L0A44) LD A,(HL) LD (L0A4F),A LD HL,(L0A4C) INC HL LD (L0A42),HL L06FD: LD HL,(L0A42) DEC HL LD (L0A42),HL LD A,0 CALL L0860 OR L JP Z,L0743 LD A,(L0A4F) RLCA LD (L0A4F),A RRA JP NC,L071F LD HL,(L0A4A) DEC HL LD (L0A4A),HL L071F: LD A,(L0A4E) INC A LD (L0A4E),A LD C,A LD A,7 CP C JP NC,L06FD LD HL,L0A4E LD (HL),0 LD HL,(L0A44) INC HL LD (L0A44),HL LD HL,(L0A44) LD A,(HL) LD (L0A4F),A JP L06FD L0743: CALL PCRLFM CALL PCRLFM LD HL,(L09CB) LD B,H LD C,L LD E,1 CALL PTDEC LD BC,L095E CALL STRCON LD HL,(FUSED) EX DE,HL LD HL,(SUSIZE) CALL MULT LD B,H LD C,L LD E,1 CALL PTDEC LD BC,L0970 CALL STRCON LD HL,(FCAP) EX DE,HL LD HL,(SUSIZE) CALL MULT LD B,H LD C,L LD E,1 CALL PTDEC LD BC,L097C CALL STRCON LD HL,(DIRLFT) LD B,H LD C,L LD E,1 CALL PTDEC LD BC,L0995 CALL STRCON LD HL,(DFILEU) EX DE,HL LD HL,(FCAP) ; FIX FILES REMAINING OR A ; NO CARRY SBC HL,DE EX DE,HL LD HL,(SUSIZE) CALL MULT LD B,H LD C,L LD E,1 CALL PTDEC LD BC,L09AD CALL STRCON LD DE,L0000 LD C,19H CALL 5 ADD A,'A' LD C,A CALL CHRCON LD BC,MESS2 ; ':',0DH,0AH,0 JP STRCON L07C2: LD L,0CH L07C4: LD A,(DE) AND 7FH LD H,A LD A,(BC) AND 7FH SUB H JP NZ,L07D6 INC DE INC BC DEC L JP NZ,L07C4 RET L07D6: LD A,0FFH RET C LD A,1 RET L07DC: LD HL,L09D3 LD E,0CH L07E1: LD A,(HL) CP '?' JP Z,L07EF LD D,A LD A,(BC) AND 7FH CP D LD A,0 RET NZ L07EF: INC BC INC HL DEC E JP NZ,L07E1 LD A,(L09C7) OR A RET NZ DEC BC DEC BC LD A,(BC) CPL RLCA AND 1 RET ; COUNT FILE PARTS RET COUNT IN HL CTFLPR: LD HL,L0000 LD A,(LGSMFS) OR A JP NZ,L081A LD E,10H L080E: LD A,(BC) OR A JP Z,L0814 INC HL L0814: INC BC DEC E JP NZ,L080E RET L081A: LD E,8 L081C: LD A,(BC) LD D,A INC BC LD A,(BC) OR D JP Z,L0825 INC HL L0825: INC BC DEC E JP NZ,L081C RET L082B: LD C,(HL) INC HL LD B,(HL) LD A,(DE) ADD A,C LD L,A INC DE LD A,(DE) ADC A,B LD H,A RET MULT: LD B,H LD C,L LD HL,L0000 LD A,10H L083D: ADD HL,HL EX DE,HL ADD HL,HL EX DE,HL JP NC,L0845 ADD HL,BC L0845: DEC A JP NZ,L083D RET L084A: ADD HL,HL DEC C JP NZ,L084A RET ; RR HL C TIMES RRCTIM: LD E,(HL) INC HL LD D,(HL) EX DE,HL L0854: LD A,H ; FILL MSB WITH ZERO OR A RRA LD H,A LD A,L RRA LD L,A ; RR C TIMES DEC C JP NZ,L0854 RET L0860: LD E,A LD D,0 L0863: LD A,E SUB L LD L,A LD A,D SBC A,H LD H,A RET L086A: LD L,C LD H,B LD C,(HL) INC HL LD B,(HL) LD A,(DE) SUB C LD L,A INC DE LD A,(DE) SBC A,B LD H,A RET ; SUB A FROM (DE) RET HL L0877: LD L,A LD H,0 LD A,(DE) SUB L LD L,A INC DE LD A,(DE) SBC A,H LD H,A RET L0882: LD E,A LD D,0 LD A,E SUB (HL) LD E,A LD A,D INC HL SBC A,(HL) LD D,A EX DE,HL RET STRCON: LD A,(BC) CP 0 RET Z PUSH BC LD C,A CALL CHRCON POP BC INC BC JP STRCON CHRCON: LD E,C LD A,(LSTF) OR A JP Z,USECON ; LD C,5 ; TO LST: JP 5 USECON: LD C,2 JP 5 L08A2: POP HL EX (SP),HL L08A4: LD A,(BC) LD (DE),A INC BC INC DE DEC L JP NZ,L08A4 RET L08AD: POP HL EX (SP),HL LD A,E L08B0: LD (BC),A INC BC DEC L JP NZ,L08B0 RET PTDEC: LD HL,L0A52 LD (HL),E DEC HL LD (HL),B DEC HL LD (HL),C LD HL,(L0A50) PUSH HL LD E,6 LD BC,L0A55 CALL L090B LD (L0A54),A INC A LD (L0A53),A L08D2: LD A,(L0A52) LD HL,L0A53 CP (HL) JP C,L08E8 LD C,' ' CALL CHRCON LD HL,L0A53 INC (HL) JP L08D2 L08E8: LD HL,L0A53 LD (HL),0 L08ED: LD A,(L0A54) DEC A LD HL,L0A53 CP (HL) RET C LD HL,(L0A53) LD H,0 LD BC,L0A55 ADD HL,BC LD C,(HL) CALL CHRCON LD HL,L0A53 INC (HL) JP NZ,L08ED RET L090B: POP HL EX (SP),HL LD D,1 LD A,0 PUSH AF INC SP L0913: DEC E JP Z,L0924 INC D CALL L0930 ADD A,'0' PUSH AF INC SP LD A,L OR H JP NZ,L0913 L0924: LD E,D DEC E L0926: DEC SP POP AF LD (BC),A INC BC DEC D JP NZ,L0926 LD A,E RET L0930: PUSH BC LD BC,MULTKK  XOR A L0935: ADD HL,HL RLA CP C JP C,L093D SUB C INC HL L093D: DEC B JP NZ,L0935 POP BC RET L0943: DB 'File Typ',0 L094F: DB ' Size',0 L0956: DB ' ',0 L095A: DB ' : ',0 L095E: DB ' Files Occupying ',0 L0970: DB ' Kbytes of ',0 L097C: DB ' Kbytes Drive Capacity',0DH,0AH,0 L0995: DB ' Directory Entries and ',0 MESS2: DB ':',0DH,0AH,0 LSTM: DB '>LST: ' LSTF: DB 0 L09AD: DB ' Kbytes Remain on drive ',0 DFILEU: DW 0 ; FIX FILES REMAINING L09C6: DB 0 L09C7: DB 0 L09C8: DB 0 FUSED: DB 0,0 L09CB: DB 0,0 L09CD: DB 0 L09CE: DB 0 L09CF: DB '2' L09D0: DB 'S',0AH DRETCD: DB ':' L09D3: DB 'R' L09D4: DB 0AH,'!S',0AH,0BEH,0DAH,0E8H L09DB: DB 8,0EH,' ',0CDH L09DF: DB 9CH,8 DIRLFT: DB '!S' SUSIZE: DB 0AH,'4' LGSMFS: DB 0C3H FILEPT: DW L08D2 DPBSTO: DW 5321H DB 0AH DPBBLM: DB '6',0 DPBDSM: DW 543AH DPBDRM: DW 3D0AH DPBALO: DB '!S' DW 0BE0AH DW 2AD8H L09F7: DW L0A53 L09F9: DB '&' L09FA: DB 0 L09FB: DB 1 L09FC: DB 'U',0AH L09FE: DB 9,'N' L0A00: DB 4,0 L0A02: DB 0,'L' L0A04: DB '04' L0A06: DB '00' L0A08: DB 0 L0A09: DB 0 L0A0A: DB 0 L0A0B: DB 0,5,0C0H,' ',6,0AH,0,0,'L0A06' DB 0F9H,'X',0,0,5,0C0H,' ' L0A1F: DB 'c',8 L0A21: DB 0,0 L0A23: DB 'L' L0A24: DB '08638V',0,0 L0A2C: DB 5,0C0H,' ',0B4H,4,0,0,'L04B4' DB 0 L0A39: DB 0,0 L0A3B: DB 0,5 L0A3D: DB 0C0H,' ' L0A3F: DB 0ABH,4 L0A41: DB 0 L0A42: DB 0,'L' L0A44: DB '04' AL0AL1: DB 'AB' FCAP: DB 0,0 L0A4A: DB 0,0 L0A4C: DB 5,0C0H L0A4E: DB ' ' L0A4F: DB 0EBH L0A50: DB 4,0 L0A52: DB 0 L0A53: DB 'L' L0A54: DB '0' L0A55: DB '4EB',0F9H,'[',0,0,5,0C0H,' 9' DB 0AH,0,0,'L0A39',0 L0A69: DB 0,0 L0A6B: DB 0,5,0C0H,' ' STACK: DB ';',0AH L0A71: DB 0,0,'L0A3B',0,0,0,0,5,0C0H,' ' END ASEG ORG 100H .Z80 AGAIN: LD C,9 ;PRINT PROMPT LD DE,PROMPT CALL 5 LD A,0FFH LD C,10 LD DE,IBUF LD (DE),A ; FF CHAR INPUT CALL 5 LD HL,IBUF+2 LD A,(HL) INC HL LD (IBPTR),HL CP 'I' JP Z, INPUT CP 'O' JP NZ,AGAIN CALL HEX_M JP C,AGAIN LD C,A ; IO ADDRESS CALL HEX_M OUT (C),A JP AGAIN INPUT: CALL HEX_M JP C,AGAIN LD C,A IN A,(C) CALL M_HEX JP AGAIN ; HEX_M: LD HL,(IBPTR) HEX_M1: LD A,(HL) INC HL CP ' ' JP Z,HEX_M1 CALL HEX_4 RET C RLCA RLCA RLCA RLCA PUSH AF LD A,(HL) INC HL LD (IBPTR),HL CALL HEX_4 EX (SP),HL JP C,ERRET OR H ERRET: POP HL RET ; HEX_4: CP ':' JP C,OUTLO SUB 'A' RET C ADD A,0FAH RET C SUB 0C0H OUTLO: SUB 30H RET ; M_HEX: PUSH AF RRCA RRCA RRCA RRCA CALL OHB POP AF OHB: AND 0FH CP 0AH JP C,NOADD ADD A,7 NOADD: ADD A,30H LD E,A LD C,2 JP 5 IBPTR: DEFS 2 PROMPT: DEFB 0DH,0AH DEFM "I = INPUT, O = OUTPUT $" IBUF: DEFS 128 END  > !~#"I4OCOCyCOxu*~# Fe~#"ec:rA0~ ڇ0_ I = INPUT, O = OUTPUT $FILE EXISTS',0DH,0AH,'$' MESS1: DB 'NO DIR SPACE',0dh,0ah,'$' END AH,0 JP GETCMD ; ; AN ERROR OCCURRED DURING A WRITE RECORD ATTEMPT ; WRTERR: CALL PSTRNG DEFB '++ Write Error ++',0DH,0AH,0 ; ; WRITE INTO THE DMA BUFFER AND WRITE TO DISK WHEN IT FILLS ; CHAR TO WRITE PASSED IN A ; WRTFILE: PUSH HL LD HL,(DMAPTR) ;GET PTR LD (HL),A ;STORE NEXT CHAR INC L ;PT TO NEXT LD (DMAPTR),HL ;SET NEXT DMA POP HL RET NZ ;IF L REACHED ZERO, BUFFER WAS FULL; RET IF NZ PUSH BC ;WRITE RECORD TO DISK AND REINIT DMA PTR PUSH DE PUSH HL LD DE,FCB ;DO *6#= ͙ ͙ !~6n !5] :L L ] R ] :\@ c ͛ "] 4:… t >!\4څ :N  ͙  ͙ N : ڵ / Ҧ Gy x0 > > : > M G: *: ͸ ͙ !>p#"=2x_:̙ { I :I :2ͺ ] ] ͺ :e t >!\4e ͺ  ͙ ę :0څ -͙ Ì :̞ ::_̙ *:0ڮ -͙ *}ʼ >D2. >FNpq#= : 1N >2 2 $կ ~#: ,` !` ~ A A <2 #~:a ?6 2 #~:a  G~#:T 0  OxG8 x  2 a ~:h #~,s !ҋ  >?x : G: O>ͥ ~.Ÿ #ͥ ~ ~ *· >?ù #¥ #ý >  ~ ! =_.:;,<>ɾa{ !"2*+"|] t *> ] ##" *|2!:ĺ w] ] *] *^#V#"!; !:ĺ :ʓ ʓ ] Ù ~] :\@ ͛ >: S >. S ͸>k ͺ :\ 26# 9͙ ͙ ͸ !~N!S 0*|,  ++ Not a LIBRARY file ++ ͙ :_ ԙ ͙  > ##S^#~#^#Vz"*#":2!æ*}+"9͙ ͸ !~ʶ ¦Çt !:#S >. S ##^#V*"!{_j)))))>k *#":=2 «:2ͺ ë~#2!Q# D>* >* ** Library Directory for Library Directory for ** Lbr Members in Lbr Members in LBRDrive/User [more] $ $ Error -> >> No detectable file(s) on >> No file(s) on : Drive space used: k : files: (k free) *** There are There are member files in library(s) A468DFLNPRSVSD DIR@N NN NNNNNNNN' KAYPRO2 SSDD FORMAT$NNNNNNNN' 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ; ORG ($ / 256) * 256 + 256 RAM: END MAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH O TO RAM UNTEL 00 FF LD B,(HL) INC HL LD C,(HL) INC HL XOR A OR B ; TEST FOR END OF BLOCK JR Z,TSTEND NOTEND: CALL MOVDAT JR MOVTFF TSTEND: ; IF 00 THEN START NEXT XX-- ; IF FF THEN END ; ELSE PLACE 256 OF ?? AS DATA LD A,C CP 0FFH RET Z OR A JR NZ,NOTEND LD A,0F0H ; RESET L REG TO XXXX 0000 AND L ADD A,10H LD L,A JR MOVTFF ; ; MOVDAT: ; INPUT B = COUNT C = DATA ; MOVE DATA TO RAM FOR COUNT ; PUSH HL LD HL,(RAMPT) RAMFIL: LD (HL),C INC HL DEC B JR NZ,RAMFIL LD (RAMPT),HL POP HL RET ; WRTRK: LD A,(SIDE) ; COMMAND CHANGES DEPENDING ON SIDE ADD A,A OR 0F4H ; WR TRK SIDE 0 ; CHANGE TO F6 IF SIDE 1 ; LD C,DDATA ; DISK DATA PORT LD D,3 ; MASK FOR BUSY AND DR BITS LD E,2 ; MASK FOR DR BIT LD HL,RAM DI ; OUT (DCTRL),A CALL DELAY JP WRTK1 WRTK: OUTI WRTK1: IN A,(DSTAT) WRTK2: AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,TITLE 8" SSSD STANDARD 12-27-84 .Z80 ASEG ORG 100H ; 256 BYTES OF FORMAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; XX00: DB 40,0FFH, 06,00, 01,0FCH, 26,0FFH, 00,0FFH DW 0,0,0 XX10: DB 06,00, 01,0FEH, 00,00 DW 0,0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01 SECSIZE: DB 00, 01,0F7H, 11,0FFH, 06,00, 00,00 XX30: DB 01,0FBH, 128,0E5H, 01,0F7H, 27,0FFH DB 00,0FFH, 00,00, 00,00, 00,00 XX40: DB 255,0FFH, 255,0FFH, 255,0FFH, 255,0FFH DB 255,0FFH, 255,0FFH, 255,0FFH, 00,0FFH XX50: SIDES: DB 0 TS01: DB 0 TS0L: DB 76 TS11: DB 0 TS1L: DB 0 DENS: DB 40H ; 0 = DOUBLE 40H = SINGLE SIZE: DB 80H ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,6,7,8,9,10,11,12,13 DB 14,15,16,17,18,19,20,21,22,23,24,25,26,0FFH DB 0,0,0,0,0 XX80: S1SECT: DB 0FFH,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '8" SSSD STANDARD FORMAT$' END RS JP Z,VLOOP ; NO ERRORS LD (ERRSTO),A ; CALL PRINT DB 'VERIFY ERROR(S) TRACK ',0 LD A,(TRACK) CALL PRTDEC ; PRINT TRACK NUMBER CALL PTNCR DB ' SECTOR ',0 LD A,(SECTOR) CALL PRTDEC ; PRINT SECTOR NUMBER ; LD A,(ERRSTO) AND 38H ; CK FOR CRC RNF RECTYPE JR NZ,PTERR ; IT WAS ONE OF THE ABOVE ; LD C,11 ; CON: STATUS CALL 5 OR A JR Z,RETVFY LD C,1 CALL 5 ; CLEAR CON: JR ASK ; RETVFY: CALL PRINT DB 'RETRING',0DH,0AH,0 JP WRTRK ; PTERR: ; ONLY PRINT CRC - RECORD NOT FOUND - RECORD FAULT ; BIT 3,A ; CRC JR Z,RNF PUSH AF CALL PTNCR DB ' CRC ',0 POP AF RNF: BIT 4,A ; RECORD NOT FOUND JR Z,RECTYP PUSH AF CALL PTNCR DB ' RECORD NOT FOUND ',0 POP AF RECTYP: BIT 5,A ; RECORD TYPE JR Z,ASK CALL PTNCR DB ' RECORD TYPE ',0 ASK: CALL PRINT DB 'RETRY? (Y) ',0 CALL INBUF CP 'Y' JP Z,WRTRK JP DOIT? ; EI RET ; DELAYT: ; 1 SEC DELAY OR UNTEL DISK CTRL CHIP ; IS NOT BUSY RET Z = OK ; RET NZ = DISK CTRL STILL B( L@ 8" SSSD STANDARD FORMAT$L@ 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ; ORG ($ / 256) * 256 + 256 RAM: END MAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH CP 0DH ; CR JP Z,SETCR PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL AND A ; CLEAR CARRY FLAG RET ; DID NOT FIND CR SETCR: SCF RET ; ; ---------------------------------- ; ; THIS ROUTINE GETS DATEM OUT OF THE ; THE INPUT BUFFER AND LOADS IT INTO 'A' ; ; ---------------------------------- ; ITOP: PUSH HL LD HL,(IBUFPT) LD A,(HL) INC HL LD (IBUFPT),HL POP HL RET ; ; ; ------------------------------------ UNTOP: PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL RET ; ; ----------------------------------- ; ; ; ----------------------------------- ; ; PRINT THE STRING. THE STRING ENDS ; WITH 00H. THE STRING IS IN THE CODE ; JUST AFTER THE CALL TO THIS ROUTINE ; ; ----------------------------------- ; PRINT: LD E,0DH ; CR LD C,2 CALL 5 LD E,0AH ; LF LD C,2 CALL 5 PTNCR: EX (SP),HL ; POINT TO MESSAGE PR1: LD E,(HL) INC HL XOR A CP E ; DONE IF 0 JP Z,PR2 LD C,2 PUSH HL CALL 5 POP HL JP PR1 PR2: TITLE KAYPRO2.MAC SSDD 5" 12-30-84 .Z80 ASEG ORG 100H ; 256 BYTES OF FORMAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; XX00: DB 64,4EH, 12,0FFH, 03,0F6H, 01,0FCH, 16,4EH, 00,0FFH DW 0,0 XX10: DB 08,00, 03,0F5H, 01,0FEH, 00,00 DW 0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01 SECSIZE: DB 02, 01,0F7H, 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 00,0E5H, 00,0E5H, 01,0F7H, 28,4EH DB 00,0FFH, 00,00, 00,00 XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 0 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 0 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 0,8,3,6,1,9,4,7,2,5,0FFH,0 DW 0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 0FFH,0,0,0,0,0 DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB 'KAYPRO2 SSDD FORMAT$' END  12,00, 03,0F5H XX30: DB 01,0FBH, 00,0E5H, 00,0E5H, 00,0E5H, 00,0E5H DB 01,0F7H, 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ; ORG ($ / 256) * 256 + 256 RAM: END der, sector or tail. 4*:(*!e6F#6M#6T\,\XTRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595  XWHICH DRIVE? (A - D ALLOWED) ˯A8E02XQ or X or E to exit CR or F or Y to format ˯EʺXʺQʺ ( Y(F›:AO>( O:UG:V ӄ>ӀXSIDE 0 :Q2!Ӂ>02:R2!`"2#:PXSIDE 1 >2#:S2!>02Ӂ:T2!">ӀӄXSORRY CAN NOT RECOVER AWWWWWW----v:_<:8>02>[Ӏ:!<2!G:0!"!G*5!@G~#2%!GF#N#(hyȷ }(>o*q# ":#!ӀÐۀ ۀ ۀ ۀ ۀ ۀ( ۀÒۀWv*"*~#"(=2%:%ӂ:#Ӏۃۀ ۀ ۀ ۀ ۀ( ۀۀ?2XVERIFY ERROR(S) TRACK :!zf SECTOR :%z:8  (PXRETRING v_( f CRC g(f RECORD NOT FOUND o(f RECORD TYPE XRETRY? (Y) ˯YvۀG(   >=>!(#  =  >:o&6 "C A C ) A*+"7*~#"*+"  ^#xg0d8d͜ 8 ͜0_>0(0'`0PN 2N N 6NNNNNNNN''*************** MICROMATE FORMAT *************** *.FMT File required to change formats.$hange formats.$' ; ORG ($ / 256) * 256 + 256 RAM: END  VOLUME 012 DESCRIPTION: DISK FORMATTING, DISASSEMBLY, ETC. UTILITIES NUMBER SIZE NAME COMMENTS 012.1 2K -EBMMUG .012 DISK TITLE & CONTENTS OF EBMMUG.012 (FEB 7,'85) 012.2 2K 8INSSSD .FMT FMT FILE FOR 8" SSSD DISKS 012.3 2K 8INSSSD .MAC SRC FOR FMT FILE 012.4 10K DASM2 .COM DISASSEMBLER 012.5 14K DASM2 .DOC DOCUMENTATION FOR DASM2 012.6 76K DASM2 .MAC SRC FOR DISASSEMBLER 012.7 18K DASMZLG .MAC SRC FOR ZLOG DISASSEMBLER 012.8 4K DIRZ .COM DIR PROG.- ALPHA ORDER LIST 012.9 2K DIRZ .DOC DOC FOR DIRZ 012.10 18K DIRZ .MAC SRC FOR DIRECTORY PROGRAM 012.11 2K DISK .DAT EXTENDED DESCRIPTION OF SOME FILES ON THIS DISK 012.12 2K EBMDIR12.TXT DIRCTORY OF THIS DISK 012.13 2K EMPTY .COM DISKNAMING PROG TO GEN A 0 K DIR NAME 012.14 2K EMPTY .MAC SRC FOR EMPTY 012.15 2K EPSON .FMT FMT FILE FOR EPSON DISK FORMAT 012.16 2K EPSON .MAC SRC FOR EPSON 012.17 2K IOTEST .COM PROG TO TEST HARDWARE I/O PORTS 012.18 2K IOTEST .MAC SRC FOR IOTEST 012.19 2K KAYPRO2 .FMT FMT FILE FOR KAYPRO 2 DISK FORMAT 012.20 2K KAYPRO2 .MAC SRC FOR KAYPRO 2 FMT 012.21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36 6K XLATE3A .COM TRANSLATES 8080 TO Z80 MNEMONICS 2.21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36_o     `i~< #~2#~2#~2*| W \!\~R 2 .n~ >2 6!.t~: +  >2 6!N#F#*" ^q#Vp" N#F##"^q#Vp" 4! 7o |  ! 6   \\ ? >_ 1m :~# yo ɍWARNING: Cannot redirect from BIOS $ERROR: Auxiliary device redirection not implemented $ERROR: Insufficient Memory $""SYSIN SUB_ogDM!>))덑o|gQ =?i`N#Fogo&og_{_z#W00001 : $SYSIN $$$ VOLUME 012 DESCRIPTION: DISK FORMATTING, DISASSEMBLY, ETC. UTILITIES NUMBER SIZE NAME COMMENTS 012.1 2K -EBMMUG .012 DISK NAME & CONTENTS OF VOLUME 012 (FEB 7,'85) 012.2 2K 8INSSSD .FMT FMT FILE FOR 8" SSSD DISKS 012.3 2K 8INSSSD .MAC SRC FOR FMT FILE 012.4 10K DASM2 .COM DISASSEMBLER 012.5 14K DASM2 .DOC DOCUMENTATION FOR DASM2 012.6 76K DASM2 .MAC SRC FOR DISASSEMBLER 012.7 18K DASMZLG .MAC SRC FOR ZLOG DISASSEMBLER 012.8 4K DIRZ .COM DIR PROG.- ALPHA ORDER LIST 012.9 2K DIRZ .DOC DOC FOR DIRZ 012.10 18K DIRZ .MAC SRC FOR DIRECTORY PROGRAM 012.11 2K DISK .DAT EXTENDED DESCRIPTION OF SOME FILES ON THIS DISK 012.12 2K EBMDIR12.TXT DIRCTORY OF THIS DISK 012.13 2K EMPTY .COM DISKNAMING PROG TO GEN A 0 K DIR NAME 012.14 2K EMPTY .MAC SRC FOR EMPTY 012.15 2K EPSON .FMT FMT FILE FOR EPSON DISK FORMAT 012.16 2K EPSON .MAC SRC FOR EPSON 012.17 2K IOTEST .COM PROG TO TEST HARDWARE I/O PORTS 012.18 2K IOTEST  .MAC SRC FOR IOTEST 012.19 2K KAYPRO2 .FMT FMT FILE FOR KAYPRO 2 DISK FORMAT 012.20 2K KAYPRO2 .MAC SRC FOR KAYPRO 2 FMT 012.21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36  on file. However ther ar als danger associate wit usin libraries The mai on i tha i librar fil i los o damaged al o th membe file ar los a well Th solutio t thi proble ca b summe u i on word BACKUP NULՠ probabl isn' perfect an w al kno tha dis system aren't s backu you importan libraries please ɠ don' wan t hea an sa stories. Almos a importan a backin u librarie i th us o discretio whe decidin wha t pu int them Let' fac it i fil i i librar i i no a eas t ge to I yo nee t ge t fil ever 1 minutes i probabl shouldn' b i librar excep a backu measure. AN ASIDE CONCERNING FILESPECS Whe specifyin filespec wildcard ma b use freely however unlik mos programs NUL doesn' insis tha ". separat th filenam fro th filetype Fo example th filespe "** mean th sam thin a "*.* t NULU O th othe hand th filespe "FRED.TXT shoul b type i jus lik that "FREDTXT woul mak NUL thin tha n filetyp ha bee specified Th rul i simple us do an tim yo like bu i i onl strictl necessar whe i i neede fo clarity. Whe specifyin driv and/o use are th synta i ver liberal "A15:** mean th sam a "15/A:*.*" a doe "1A5:**" Th colo i absolutel necessary I differen use are i desire fo th defaul drive th driv specifie ma b omitted a i "15:**" jus a th use are ma b omitte a i "A:**". I drive/use specificatio i made bu n filespe i indicated filespe o ????????.?? i generated Therefor t indicat th defaul drive curren use area an filespe o ????????.??? jus typ colo b itsel (e.g. ":" ! NULU OPERATION NULՠ ma b invoke wit o wTITLE RFORMAT.MAC 12-31-84 03:10:00 .Z80 ASEG ORG 100H ; START: LD HL,(6) ; SET STACK LD SP,HL ; LD A,(80H) ; CHECK COMMAND TAIL COUNT OR A JR Z,NOFILE ; LD HL,65H ; EXTENT LD (HL),'F' INC HL LD (HL),'M' INC HL LD (HL),'T' ; SET EXTENT TO FMT ; LD C,15 ; OPEN FILE LET CP/M DISPLAY ERRORS LD DE,DFCB CALL 5 ; LD C,44 ; MULT SECTOR LD E,2 CALL 5 ; LD DE,XX00 ;START OF FORMAT INFO LD C,26 ; SET DMA CALL 5 ; LD DE,DFCB LD C,20 ; READ 100H BYTES CALL 5 ; NOFILE: CALL PRINT DB 'TRANSIENT FORMAT PROGRAM 12-31-84 BY',0DH,0AH DB 'Rich Harrington 31 Blade Way Walnut Creek, CA 94595',0DH,0AH,0 LD DE,XXA0 ; MESSAGE FROM FILE ; FORMAT TYPE --- LD C,9 CALL 5 ; DRIVE?: CALL PRINT DB 'WHICH DRIVE? (A - D ALLOWED) ',0 CALL INBUF RES 5,A CP 'A' JR C,DRIVE? CP 'E' JR NC,DRIVE? ; NOT IN RANGE LD (DRIVE),A ; DOIT?: CALL PRINT DB 'Q or X or E to exit CR or F or Y to format ',0 CALL INBUF RES 5,A CP 'E' JP Z,EXIT CP 'X' JP Z,EXIT CP 'Q' JP Z,EXIT CP 0DH JR Z,FORMAT CP 'Y' JR Z,FORMAT CP 'F' JP NZ,DRIVE? ; FORMAT: LD A,(DRIVE) SUB 'A' LD C,A OR A LD A,1 JR Z,GDEN ; DRIVE = A DRLOOP: RLA DEC C JR NZ,DRLOOP ; GDEN: LD C,A LD A,(DENS) LD B,A LD A,(SIZE) OR B OR C OR 20H ; TURN ON MOTOR OUT (DRCTRL),A CALL DELAYL ; WAIT FOR DRIVE TO ; COME UP TO SPEED LD A,3 ; RESTORE HOME DRIVE OUT (DCTRL),A CALL DELAYL CALL DELAYT JP NZ,ERREXT ; DID NOT WORK ; ; SET TRACK SIDE SECTOR INIT: CALL PRINT DB 'SIDE 0',0DH,0AH,0 LD A,(TS01) LD (TRACK),A OUT (DTRK),A LD A,'0' LD (USERFO),A LD A,(TS0L) LD (LASTTK),A LD HL,S0SECT LD (STBLAD),HL XOR A LD (SIDE),A ; SET SIDE 0 ; CALL DOSIDE ; LD A,(SIDES) ; TEST FOR DOUBLE SIDED OR A JP Z,DOIT? ; ONLY ONE SIDE CALL PRINT DB 'SIDE 1',0DH,0AH,0 LD A,1 LD (SIDE),A LD A,(TS11) LD (TRACK),A LD A,'0' LD (USERFO),A ; LET USER SEE SOMETHING ON CON: OUT (DTRK),A LD A,(TS1L) LD (LASTTK),A LD HL,S1SECT LD (STBLAD),HL ; LD A,3 ; HOME OUT (DCTRL),A CALL DELAYL CALL DELAYT JP NZ,ERREXT ; CALL DOSIDE JP DOIT? ; EXIT: XOR A ; TURN OFF DRIVE OUT (DRCTRL),A JP 0 ; ERREXT: CALL PRINT DB 'SORRY CAN NOT RECOVER AWWWWWW----',0 JP 0 ; ; DOSIDE: CALL BLDTRK CALL WRTRK ; DOES VERIFY AND RETRIES JP NZ,ERREXT ; FAILED ; LD A,(USERFO) ; PRINT 0-9 AS TRACK ARE CHANGED, LET USER KNOW LD E,A INC A CP 3AH ; PAST 9? JR C,USER1 ; NO LD A,'0' USER1: LD (USERFO),A LD C,2 CALL 5 ; LD A,05BH ; STEP-IN OUT (DCTRL),A CALL DELAYT JP NZ,ERREXT LD A,(TRACK) INC A LD (TRACK),A LD B,A LD A,(LASTTK) CP B JR NC,DOSIDE RET ; ; BLDTRK: LD HL,RAM LD (RAMPT),HL LD HL,XX00 ; HEADER FOR FORMAT CALL MOVTFF LD HL,(STBLAD) ; GET SECTOR TABLE ADDRESS CALL BLDSEC LD HL,XX40 ; TAIL JP MOVTFF ; ; BLDSEC: ; BUILD ALL SECTORS ; START HL = SECTOR TRANS TABLE LD A,(HL) INC HL CP 0FFH ; END FLAG RET Z LD (SECTOR),A PUSH HL LD HL,XX10 ; START OF SECTOR CALL MOVTFF POP HL JR BLDSEC ; ; MOVTFF: ; MOVE INFO TO RAM UNTEL 00 FF LD B,(HL) INC HL LD C,(HL) INC HL XOR A OR B ; TEST FOR END OF BLOCK JR Z,TSTEND NOTEND: CALL MOVDAT JR MOVTFF TSTEND: ; IF 00 THEN START NEXT XX-- ; IF FF THEN END ; ELSE PLACE 256 OF ?? AS DATA LD A,C CP 0FFH RET Z OR A JR NZ,NOTEND LD A,L ; TEST FOR AT 00 NOW AND 0FH JR Z,MOVTFF ; LD A,0F0H ; RESET L REG TO XXXX 0000 AND L ADD A,10H LD L,A JR MOVTFF ; ; MOVDAT: ; INPUT B = COUNT C = DATA ; MOVE DATA TO RAM FOR COUNT ; PUSH HL LD HL,(RAMPT) RAMFIL: LD (HL),C INC HL DEC B JR NZ,RAMFIL LD (RAMPT),HL POP HL RET ; WRTRK: LD A,(SIDE) ; COMMAND CHANGES DEPENDING ON SIDE ADD A,A OR 0F4H ; WR TRK SIDE 0 ; CHANGE TO F6 IF SIDE 1 ; LD C,DDATA ; DISK DATA PORT LD D,3 ; MASK FOR BUSY AND DR BITS LD E,2 ; MASK FOR DR BIT LD HL,RAM DI ; OUT (DCTRL),A CALL DELAY JP WRTK1 WRTK: OUTI WRTK1: IN A,(DSTAT) WRTK2: AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND E JR NZ,WRTK IN A,(DSTAT) AND D JR Z,WRTKDN ; DONE AND E JR NZ,WRTK IN A,(DSTAT) JP WRTK2 WRTKDN: IN A,(DSTAT) ; TEST FOR LOST DATA BIT 2,A JP NZ,WRTRK ; DO IT AGAIN ; VERIFY: ; NOE READ EACH SECTOR ON TRK. IF ANY ERROR ; REPORT IT AND ASK FOR RETRY. LD HL,(STBLAD) LD (VSECAD),HL VLOOP: LD HL,(VSECAD) LD A,(HL) INC HL LD (VSECAD),HL ; VERIFY SECTOR ADDRESS TBL CP 0FFH ; LAST ONE? JR Z,VFYEND LD (SECTOR),A LD A,(SECTOR) OUT (DSEC),A ; TELL DISK CTRL WHICH SECTOR TO READ ; LD D,3 LD E,2 LD A,(SIDE) ADD A,A OR 88H ; READ SECTOR COMMAND OUT (DCTRL),A CALL DELAY JP RDS1 ; RDS: IN A,(DDATA) ; JUST THROW IT AWAY RDS1: IN A,(DSTAT) RDS2: AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND E JR NZ,RDS IN A,(DSTAT) AND D JR Z,RDONE AND E JR NZ,RDS IN A,(DSTAT) JP RDS2 ; VFYEND: EI RET ; RDONE: IN A,(DSTAT) AND 3FH ; CK FOR ERRORS JP Z,VLOOP ; NO ERRORS LD (ERRSTO),A ; CALL PRINT DB 'VERIFY ERROR(S) TRACK ',0 LD A,(TRACK) CALL PRTDEC ; PRINT TRACK NUMBER CALL PTNCR DB ' SECTOR ',0 LD A,(SECTOR) CALL PRTDEC ; PRINT SECTOR NUMBER ; LD A,(ERRSTO) AND 38H ; CK FOR CRC RNF RECTYPE JR NZ,PTERR ; IT WAS ONE OF THE ABOVE ; LD C,11 ; CON: STATUS CALL 5 OR A JR Z,RETVFY LD C,1 CALL 5 ; CLEAR CON: JR ASK ; RETVFY: CALL PRINT DB 'RETRING',0DH,0AH,0 JP WRTRK ; PTERR: ; ONLY PRINT CRC - RECORD NOT FOUND - RECORD FAULT ; BIT 3,A ; CRC JR Z,RNF PUSH AF CALL PTNCR DB ' CRC ',0 POP AF RNF: BIT 4,A ; RECORD NOT FOUND JR Z,RECTYP PUSH AF CALL PTNCR DB ' RECORD NOT FOUND ',0 POP AF RECTYP: BIT 5,A ; RECORD TYPE JR Z,ASK CALL PTNCR DB ' RECORD TYPE ',0 ASK: CALL PRINT DB 'RETRY? (Y) ',0 CALL INBUF RES 5,A CP 'Y' JP Z,WRTRK JP DOIT? ; DELAYT: ; 1 SEC DELAY OR UNTEL DISK CTRL CHIP ; IS NOT BUSY RET Z = OK ; RET NZ = DISK CTRL STILL BUSY ; CALL DELAY PUSH DE LD DE,0FF00H DT1: IN A,(DSTAT) BIT 0,A JR Z,DT2 ; NOT BUSY ; EX (SP),HL EX (SP),HL DEC E JR NZ,DT1 DEC D JR NZ,DT1 INC D ; MAKE NZ DT2: POP DE RET ; ; DELAY: LD A,8 ; 28uS + DELAY1: DEC A JP NZ,DELAY1 RET ; ; DELAYL: ; 1 SEC DELAY LD A,33 DELAYX: PUSH BC DELAYA: LD BC,9000 ; 30 MS APPROX DELAYB: DEC C JR NZ,DELAYB DEC B JR NZ,DELAYB DEC A JR NZ,DELAYA POP BC RET ; TITLE RLIB1 RICH LIBRARY-1 INBUFFER 4-2-83 20:59:00 INBUF: LD C,0AH ; READ CON: FOR LINE LD DE,IBUFS LD A,0FFH ; READ 255 CHAR LD (DE),A CALL 5 LD A,(IBUFS+1) ; GET NUM OF CHAR REC LD L,A LD H,0 LD DE,IBUFS+2 ADD HL,DE ; POINT TO LAST CHAR+1 LD (HL),0DH LD A,(DE) ; GET FIRST CHAR EX DE,HL LD (IBUFPT),HL RET IBUFS: DEFS 257 IBUFPT: DEFW IBUFS+2 ; ; ---------------------------------------------- ; SPACE: CALL ITOP CP 0DH ; CR JP Z,SETCR CP ' ' JP NZ,SPACE SPACE1: CALL ITOP CP ' ' JP Z,SPACE1 CP 0DH ; CR JP Z,SETCR PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL AND A ; CLEAR CARRY FLAG RET ; DID NOT FIND CR SETCR: SCF RET ; ; ---------------------------------- ; ; THIS ROUTINE GETS DATEM OUT OF THE ; THE INPUT BUFFER AND LOADS IT INTO 'A' ; ; ---------------------------------- ; ITOP: PUSH HL LD HL,(IBUFPT) LD A,(HL) INC HL LD (IBUFPT),HL POP HL RET ; ; ; ------------------------------------ UNTOP: PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL RET ; ; ----------------------------------- ; ; ; ----------------------------------- ; ; PRINT THE STRING. THE STRING ENDS ; WITH 00H. THE STRING IS IN THE CODE ; JUST AFTER THE CALL TO THIS ROUTINE ; ; ----------------------------------- ; PRINT: LD E,0DH ; CR LD C,2 CALL 5 LD E,0AH ; LF LD C,2  CALL 5 PTNCR: EX (SP),HL ; POINT TO MESSAGE PR1: LD E,(HL) INC HL XOR A CP E ; DONE IF 0 JP Z,PR2 LD C,2 PUSH HL CALL 5 POP HL JP PR1 PR2: EX (SP),HL RET ; ; PRINT BYTE IN A AS A DEC NUMBER TO CON: ; PRTDEC: LD E,'0' HUNL: SUB 100 JR C,TEN INC E JR HUNL TEN: ADD A,100 CALL PRT? ; PRINT HUN DIGIT IF NOT 0 TENL: SUB 10 JR C,UNIT INC E JR TENL UNIT: ADD A,10 CALL PRT? OR 30H ; MAKE REG A INTO ASCII LD E,A LD C,2 JP 5 ; PROVIDES RET ; PRT?: PUSH AF LD A,'0' CP E JR Z,NOPRT LD C,2 CALL 5 NOPRT: POP AF LD E,'0' RET ; DRIVE: DB 0 ERRSTO: DB 0 LASTTK: DB 39 RAMPT: DW RAM STBLAD: DW S0SECT USERFO: DB '0' VSECAD: DW 0 ; DCTRL EQU 80H DDATA EQU 83H DFCB EQU 5CH DRCTRL EQU 84H DSEC EQU 82H DTRK EQU 81H DSTAT EQU 80H ORG ($ / 256) * 256 + 256 ; ; 256 BYTES OF FORMAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW 0,0 XX10: DB 12,00, 03,0F5H, 01,0FEH, 00,00 DW 0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01,03, 01,0F7H, 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 00,0E5H, 00,0E5H, 00,0E5H, 00,0E5H DB 01,0F7H, 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ; ORG ($ / 256) * 256 + 256 RAM: END  Files: 37 space used: 354k (32k free) -EBMMUG .012 2k : DISK .DAT 2k : MAKE .SUB 2k : SD95 .DOC 2k 8INSSSD .FMT 2k : EBMDIR12.TXT 2k : NULU .COM 14k : SUBMIT .COM 6k 8INSSSD .MAC 2k : EMPTY .COM 2k : NULU .DOC 40k : TRACKRD .COM 2k DASM2 .COM 10k : EMPTY .MAC 2k : OTHERSYS.LST 14k : TRACKRD .MAC 14k DASM2 .DOC 14k : EPSON .FMT 2k : RFORMAT .COM 2k : WIPE .COM 2k DASM2 .MAC 76k : EPSON .MAC 2k : RFORMAT .DOC 24k : XLATE3A .COM 6k DASMZLG .MAC 18k : IOTEST .COM 2k : RFORMAT .MAC 10k : XLATE3A .MAC 38k DIRZ .COM 4k : IOTEST .MAC 2k : RFORMATA.SUB 2k : DIRZ .DOC 2k : KAYPRO2 .FMT 2k : RFORMATF.SUB 2k : DIRZ .MAC 18k : KAYPRO2 .MAC 2k : SD95 .COM 4k :  a disk and is used in many cases with the CATALOG program. IOTEST .COM IOTEST .MAC These are hardware orientation pAYPRO2 .MAC SRC FOR KAYPRO 2 FMT 012.20 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.21 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.22 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.23 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.24 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.25 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.26 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.27 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.28 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.29 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.30 2K SD95 .DOC DOC FOR SD95 012.31 6K SUBMIT .COM D.R.'S SUBMIT UTILITY 012.32 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.33 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.34 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.35 6K XLATE3A .COM TRANSLATES 8080 TO Z80 MNEMONICS PIP B:TEST.ASM=RFORMAT.DOC[SXX00:^ZQ$$'^Z] our new *.FMT residing on disk with no extraneous files. Good luck, Ed Miller, Librarian EastBay MicroMate Users' Group January 22, 1985  a .SYM, .PRN, & .HEX file. Next, at the prompt type in the following: B>HEXCOM *.HEX This will create the .COM file now, B>RENAME *.FMT=*.COM and you will have your new *.FMT file. To execute see above or follow along B>RFORMAT *.FMT This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the file------------------- UNTOP: PUSH HL LD HL,(IBUFPT) DEC HL LD (IBUFPT),HL POP HL RET ; ; ----------------------------------- ; ; ; ----------------------------------- ; ; PRINT THE STRING. THE STRING ENDS ; WITH 00H. THE STRING IS IN THE CODE ; JUST AFTER THE CALL TO THIS ROUTINE ; ; ----------------------------------- ; PRINT: LD E,0DH ; CR LD C,2 CALL 5 LD E,0AH ; LF LD C,2 CALL 5 PTNCR: EX (SP),HL ; POINT TO MESSAGE PR1: LD E,(HL) INC HL XOR A CP E ; DONE IF 0 JP Z,PR2 LD C,2 PUSH HL CALL 5 POP HL JP PR1 PR2: EX (SP),HL RET ; TITLE RLIB2 RICH LIBRARY-2 HEX 4-2-83 17:30:00 ; ; -------------------------------------- ; ; THIS ROUTINE LOADS HL FROM THE TTY ; REG USED A B HL ; REG DISTROYED A HL ; ; -------------------------------------- ; NLDHL: CALL SPACE RET C ; LDPHL: LD HL ,0 CALL ITOP CP ' ' JP Z,LDPHL CP 0DH ; CR SCF RET Z JP LHL1 ; LHL2: CALL ITOP CP ' ' JP Z,UNTOP CP 0DH ; CR JP Z,UNTOP LHL1: ithou comman tail comman tai ca consis o an combinatio o vali NUL operator u t 12 character (th limi impose b th CCP Onc NULՠ i running comman line ca b a lon a 25 characters.) A i LU al NUL command ar precede b dash Thi i cop o th men fo th comman mod o operation: - Ad member - Brie toggle - Clos th librar - Delet members - Extrac member - Fileswee mode - Ge filespe - Krunc th library - Lis member - Menu - Renam member - Ope library - Prin member - Unsqueez members - Replac member - Replace/Ad members - Drive/Use chang - Vie members - Exi NUL - Dis directory - Redirec inpu - Redirec output Command ma b strun together eac terminate b space The ar processe lef t right Al character ar converte to upper case. Th defaul drive/use are ar displaye alon wit th nam o th curren comman mod eac tim th consol i prompte fo input. Th command wil b explaine i orde o thei appearanc above Al item i [squar bracketsݠ indicat堠 optiona parameters Filespe㠠 parameter enclose i (parenthesis indicat reference t delete membe files Thre dot ("..." afte paramete indicat infinit repetition. COMMANDS -AADD MEMBERS Syntax: -a filespec[ filespec...] Us thi comman t ad file fro dis t th curren library NUL wil mak serie o passe throug th directory addin file a i goes unti th lis o matchin file i exhausted I matchin filenam alread exist a a activ membe i th library it nam wil b displaye an th fil wil no b added. I al fil additio an replacemen operations i delete entr o identica siz ca b located tha dis spac an director entr wil b use rathe tha allocatin ne spac fo th file Thi mean tha i wil b necessar t reclai waste dis spac les often. -BBRIEF TOGGLE Syntax: -b Thi toggle th promptin mode Th releas versio o NUL i setu t prin th ful nam o th curren mod fo prompt a i "-AD MEMBER A0:>" I BRIE i turne o th use wil simpl se "- A0:>" NUL ma b permanentl patche t defaul t BRIE OΠ o OFF Se NUL MODIFICATION. -CCLOSE THE LIBRARY Syntax: -c Thi comman close th curren library writin it director t dis i an change hav bee mad t th  directory Th librar director i NEVEҠ writte excep whe th librar i closed s b sur t d it I yo forge t d s an remov th disk NULՠ wil promp yo fo th dis agai an wil attemp t recover bu n guarantees Som othe operation tha caus th curren librar t b close are: -k, -o, -x -DDELETE MEMBERS Syntax: -d filespec[ filespec (filespec)...] Membe file matchin th give filespe wil b give delete statu i th librar directory excep whe th filespe i enclose i parenthesis I tha cas matchin deleted member wil b give active status Tha is the wil b undeleted I th filenam o matchin delete membe fil alread exist a a activ member th filenam wil b displaye an th fil wil not be undeleted.  -EEXTRACT MEMBERS Syntax: -e filespec[=newfilespec filespec...] Us thi comman t extrac activ membe files I extractio t th curren drive/use are i desired n furthe synta i necessary T indicat anothe drive however ᠠ destinatio filespe ma b堠 include following an equals sign. Example: -e **=a5: woul extrac al activ member t driv A use are 5 File ma b rename a wel a redirecte b indicatin filespe alon with o i plac of drive user specification. Examples: 1. -e *asm=*bak 2. -e *asm=5:*txt 3. -e fred.txt=sam.txt jane.inf=c8:girls.dbf Th example woul produc th followin results: 1 Extrac al file wit typ o .AS t th defaul drive/user renaming them with the filetype of .BAK. 2 Extrac al file o typ .AS t use are o th default drive, renaming each with the .BAK filetype. 3 Extrac th membe fil FRED.TX t th defaul drive/use unde th nam o SAM.TXT an extrac th membe fil JANE.IN t use are o driv C wit th filenam GIRLS.DBF. Th onl rul t remembe i tha i destinatio filespe i entere i canno b an les ambiguou tha th sourc filespec Tha is "*asm=*bak i vali whil "**=*bak" is not valid. -FFILESWEEP MODE Syntax: -f Thi comman place NUL i it secon operationa mode th fileswee mode Thi allow th use t mov throug th director o activ membe file a i the wer individua file bein examine b progra lik NSWEEP Th fileswee mode' comman lis i a follows: Nex membe Previou member Clos th librar Delet member Extrac membe Lo ne library Prin membe Unsqueez member Renam membe Drive/Use change Vie membe Wildcar rename Exi NUL Dis directory NUL comman mod Menu Becaus o th extrem similarit betwee thes command an th command o NULU' comman mode onl shor description of each command will be given. A -- Advance to next member (spacebar cr o l wil produc th sam 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) L -- Logon to new library (closes the current library) P -- Dumps the current member file to LST: (unsqueezes if needed) Ѡ -- Extrac curren membe file unsqueezin i necessary (prompt allows redirection) R -- Rename current member file U -- Change drive/user defaults (returns file pointer to the top of the file list) V -- View current member file (unsqueezes if needed) W -- Wildcard rename of members (prompts for both oldname and 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) Z -- Return to NULU command mode (current library remains open) ? -- Print the filesweep mode menu (returns file pointer to the top of the file list) If whe th fileswee mod i entered o afte librar ha bee closed ther i no librar currently open, the filesweep mode will prompt with: No library open. and will accept only the following commands: L,U,X,Y,Z,? Likewise i librar i ope bu onl ha director with no other active members, the message No member files. wil b printe an onl th command liste above wil be accepted. Durin th fileswee mod operation eac fil wil b liste i th orde i whic i i foun i th directory alon wit th siz i tha th fil woul occup i i wer extracte t th defaul drive. I th fileswee mod i terminate b retur t th NULՠ comman mode an command tha followe th - comman o th previou NULՠ comman lin wil b executed. -GGET FILESPEC Syntax: -g filespec NULՠ wil searc fo th filespe indicated I i i found processin continues I not th use i prompte t inser th dis containin tha filespec Th driv i the rese an searc again Th progra wil promp foreve unti i receive th堠 prope filespe o unti cntrl- i entered forcin NUL t continue without the filespec being found. Thi comman ca b usefu whe attemptin t contro NULՠ throug submi utilit lik DRI' SUBMIT.COM For example, one might type: nulu -o a:asm -g b5:-work.005 -e **=b10: -g a0:-5.005 -x Afte loading NUL woul ope librar calle ASM.LB o driv A i th curren use area Nex i woul searc use are o driv B fo filespe -WORK.00 unti i wa found The al activ membe file woul b extracte t use are 1 o driv B: Finally NUL woul searc use are o driv A fo filespe calle -5.00 unti found The NULՠ woul terminate Notic her tha th ASM.LB didn' hav t b close befor th searc fo th fina filespe becaus堠 n chang ha bee mad t th堠 librar directory I chang ha bee made afte th ne filespe ha bee loaded NUL woul hav demande th dis wit ASM.LB bac s i coul updat th directory Therefor堠 th GEԠ operatio woul b堠 effectivel negated. -KKRUNCH THE LIBRARY Syntax: -k[ REDIRECT OUTPUT Syntax: -> filename Syntax: -> Wit th firs for o thi command NUL outpu wil b sen t th filenam indicated I th fil alread exists i wil b deleted Al specia character tha th use ma hav patche int NUL (se below NUL MODIFICATION wil b sen t th fil a well wit th exceptio o th EO character 2 (1ah) Th onl outpu no echoe t th fil wil b outpu cause b viewin o printin membe file. The filename passed must be unambiguous. Unde th secon for o thi command th curren outpu file i an wil b closed Whe NUL i cause t terminate th curren outpu fil i close alon with the current library, if any. ERROR MESSAGES All NULU error messages are of the form: ERROR XX: Explanation wher "XX i som numbe fro t 25 an "Explanation i clu a t th natur o th error Eac erro messag i liste below alon wit a explanation Suggestion abou way t handl th error are given when appropriate. ERROR 63: ambiguity error Problem: Thi mean tha yo entere a ambiguou filespe where an unambiguous filename was required. ERROR 68: disk full Problem: Th librar dis becam ful durin fil additio o KRUNCHin o th destinatio dis o栠 a extractio comman becam full. Solution:I th erro occurre durin KRUNCHing NUL shoul hav recovere b itself reopenin th ol library I i di no recover the yo remove th origina dis befor th KRUNC wa complet o seriou rea erro occured. I th erro occur durin fil additio t th library operatio shoul no b impaired bu n file tha require additiona dis spac ca b adde t th library Not tha delete entrie ca stil b overwritte b incomin file a lon a th fil size match Th origina fil tha cause th erro wil b recorde i th librar director a delete entry. I th erro occur durin fil extractio o unsqueezin砠 th destinatio fil i delete becaus i i a incomplet file Extractio ca continue as before. ERROR 73: invalid drive Problem:A invali driv fo you syste wa chose (se below NUL MODIFICATION o lette highe tha "P" was indicated. Solution:Choose another drive or re-patch NULU. ERROR 77: not enough memory Problem:A attemp wa mad t ope librar wit director to larg t b accounte fo wit available memory. Solution:Ope th librar o compute wit large TP an reorganiz i s i ca b handle b th smaller system. ERROR 78: user cancel Problem:N problem NUL i simply lettin th use kno wh a OPE LIBRAR o KRUNC operatio ha bee cancelled. ERROR 83: no directory space Problem:A attemp wa mad t creat fil o dis with no free directory entries. ERROR 85: file not found Problem:Th filespe indicate fo som operatio coul not be located. ERROR 86: CP/M 2.x or higher required Problem:A attemp wa mad t ru NUL o syste wit a CP/ versio numbe o les tha 2.0. ERROR 88: seek to unwritten sector Problem: secto require t gai acces t fil i indicated by CP/M to be unwritten. Solution:Th librar director o perhap th librar itsel ha becom trashe a som point Deletin th entr an KRUNCHin wil probabl rende i harmless bu th safes cours t tak i t obtai fres cop o th library. ERROR 100: bad library directory Problem:Th fil specifie coul no b opene a librar file Solution:Th director coul b bad bu mos likel th fil simpl isn' library Chec i ou wit some disk editor like SPZ or EDFILE. ERROR 115: bad syntax Problem:Imprope synta wa use t attemp som operation. ERROR 116: squeeze decode table Problem: fil ha squeez decodin table bu a som poin th tabl i trashe o perhap i missing Solution:None really; get a new copy of the file. ERROR XX: undefined Problem:Unknown. Solution:Writ堠 dow al informatio presente o th terminal Th numbe followin th wor ERRO i especiall important Ge th informatio t me Mail it or call and I will try to help. NULU MODIFICATION Patche wil b liste i th orde i whic the appea i NULU.COM Eac patc i explaine an th defaul value ar liste immediatel nex t th patc address Al addresse ar absolut hexadecimal. Patch Default Explanation 00171h 00h Non-zer make NUL us th Z8 instruction LDI an LDD fo dat movement 00172h 50h Numbe o character eac蠠 ful vide lin ca contain No necessaril th sam a th numbe you can see. 00173h 50h Numbe o character visibl o line at any one time. 00180h 10hNumbe o contiguousl numbere dis drive i you system I yo hav drive an B se thi valu t 2 I wil preven yo fro accessing an invalid drive. 001c5h 00hSe t non-zer valu t mak NUL READ/ONLY N operator wil b execute tha coul chang th library directory in any way. 001c6h 00hLU.CO͠ wa se u t exi automaticall i comman tai wa use whe L wa invoked Wit th releas versio o NULU i take th - comman t exit Se thi byt t 01 t ge i t ac lik Lՠ i thi respect Tha is i wil젠 automaticall exi afte executin th passe comman tail i on wa present. 001c7h 01hSe t 00 t star NULՠ wit BRIEƠ mod O (lon message no printed). 001c8h 00hStartin her ar 3 byte i whic an vali NUL operator ma b stored Thi lin堠 wil젠 b automaticall execute whe NUL i loaded eve befor an othe parameter passe o th comman line Thi migh b use t creat versio o NULՠ that afte loading set th堠 drive/use default t B0: print th menu scan th driv fo librar files the switche t th ope librar mode Tha comman lin woul loo lik this: -U B: -M -Y *LBR -O Notic tha al character i thi lin MUSԠ b UPPEҠ CASE Th entir lin MUS b terminate b nul byte Onl 3 byte ar availabl fo text...no byt more Th 40t byt i fo th null terminator. 03103h 0ah I yo hav troubl thinkin i decimal yo ca chang thi byt t ge NUL t outpu al number i whateve bas yo please fro t 24h (36d). 03825h 0005h Thi i th addres o th BDO vector Al operatin syste call g throug thi address I yo hav som weird non-standar CP/ implementatio yo ca patc thi to try to make NULU work with it. 03876h 3ch Thi i th numbe o line tha NUL wil prin o eac pag durin membe fil printing Chang thi valu i accordanc wit th lin printer patch below. Startin a 03848 ar dat area use t defin string neede t contro th consol attributes Eac strin i precede b byt indicatin it activ length The byte ar availabl fo eac definition Therefor tota o byte i consume 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 CURSOR POSITIONING (not used in NULU) CLEAR SCREEN Each control becomes active as soon as it is patched in. Likewise ther i on strin define fo th LST devic tha wil b issue immediatel befor printin file I begin a 038ad an ha th sam forma a th string above. FINAL NOTES Pleas repor an bug o problem t Marti Murray P.O Bo 35972, Dallas, Tx 75235 or call (214) 351-6117. Donation wil b gratefull accepted I too lo o wor t produc NULՠ an i yo enjo i an i benefit you don' hesitate to show your appreciation with a check! iv length The byte ar availabl fo eac definition Therefor tota o byte i consume for each video c Updated on December 2, 1984 By Lindsay Jones ======================== DataTech Network Systems ======================== DataTech 001 Headquarters, San Carlos CA........... (415) 595-0541 * DataTech 002 CrosNest I, Paris France............ 011-33-90-776136 12 DataTech 004 CrosNest II, San Mateo CA............. (415) 341-9336 * DataTech 005 RALPH I, El Sobrante CA............... (415) 223-4579 12 DataTech 007 SERVU, San Jose CA.................... (408) 238-9621 * DataTech 008 Santa Clara Univ., S.C. CA............ DataTech 009 Santa Clara CA........................ (408) ?27-2853 * DataTech 010 Palo Alto CA.......................... (415) 858-2840 12 DataTech 011 Leasametric, Foster City CA....... (415) 574-4427 * DataTec( 012 Chain Reaction Bikes, Redwood City CA. (415) 366-9171 12 DataTech 015 North of 92, San Mateo CA............. (415) 574-3663 12 DataTech 016 South San Francisco CA Police Dept.... (415) 877-5341 12 12=Bell 212A 1200 baud *=Bell 212A and Vidic 3400 1200 baud (Racal-Vadic Triple) X1=Online 6pm to 8am M-F, 24 hrs weekends ==================== Bay Area BBS Systems ==================== These numbers have been collected from other bulletin boards. The SYSOP takes no responsibility for the accuracy of this list. If you know of any additions or deletions that should be made, please leave a message on the DataTech Headquarters system for Lindsay Jones, and the change will be made on the next update. The operating hours very from system to system, most are 24 hr. but some are not. RB=Ringback - call,ring once,hangup,call back again to connect SO=Sexually-oriented Aardwolf/80, Fremont CA........................... (415) 651-4147 Abacus BBS, San Francisco CA...................... (415) 587-8062 ABBS Byte Shop, Hayward CA........................ (415) 881-5662 Airplane, Fremont CA.............................. (415) 793-3325 Alpha-Omega 80, Livermore CA...................... (415) 447-2247 AMIS, San Jose CA................................. (408) 942-6975 AMIS GRAFEX, San Jose CA.......................... (408) 253-5216 AMIS IBBS, San Jose CA............................ (408) 298-6930 Ampro Users BBS, San Jose CA...................... (408) 258-8128 Anola BBS, Hayward CA............................. (415) 889-8506 Atlas Micro, Campbell CA.......................... (408) 379-8086 Baudville, Sunnyvale CA........................... (415) 961-2655 BAUG, San Jose CA................................. (408) 578-2390 Bay City Electronics, Redwood City CA............. (415) 364-8517 BBS, East Bay CA.................................. (415) 448-9145 BBS, Hayward CA................................... (415) 782-4402 BBS C-64, San Francisco CA........................ (415) 477-5051 BBS-16, Santa Rosa CA............................. (707) 527-5908 Blue Boss, Berkeley CA............................ (415) 655-5472 Blue Boss BBS, East Bay CA........................ (415) 845-9462 Buccaneer's Harbor, San Jose CA................... (408) 980-0276 Buccaneer's Harbor III, San Jose CA............... (408) 997-3486 Bull Board, San Francisco CA...................... (415) 387-1241 Bullet-80, Cupertino CA........................... (408) 255-8919 Bullet-80, San Jose CA............................ (408) 241-0769 Caltex-99 CBBS, San Francisco CA.................. (415) 431-3783 Caltex-99 CBBS, Sunnyvale CA...................... (408) 926-8767 Caltex-99 CBBS, Santa Clara, CA................... (408) 296-6533 Caltex-99 CBBS, Fremont CA........................ (415) 794-8050 CBBS Lambda, Oakland CA....................... (415) 658-2919 CBBS Proxima North Star, San Leandro CA........... (415) 357-1130 Children's Apple Tree, San Francisco CA........... (415) 647-2560 Cleo, East Bay CA................................. (415) 482-1550 Cleo, San Jose CA................................. (408) 294-2000 Comet Amis BBS, San Francisco CA.................. (415) 756-3288 Computer Langauge BBS, San Francisco CA........... (415) 957-9370 Computer Outpost, San Jose CA..................... (408) 258-3889 Computers for Christ, San Jose CA................. (408) 997-2790 Computers for Christ, San Mateo CA................ (415) 341-2962 Conference Tree, Redwood City CA.................. (415) 364-4438 Conference Tree, Sausalito CA..................... (415) 332-8115 Conference Tree, Stanford CA...................... (415) 948-1474 Conference Tree #1, Berkeley CA................... (415) 526-7733 Conference Tree #3 Forth Int., Hayward CA......... (415) 538-3580 Conference Tree #4 Apex-Net, San Francisco CA..... (415) 928-0412 Corsair 64, Belmont CA............................ (415) 595-4789 Critical Mass RBBS, Gualala CA.................... (707) 884-4221 Datacom/80, San Leandro CA........................ (415) 895-8980 Dataworks Telecommunications, Alameda CA.......... (415) 522-1986 Dave's BBS, Alamo CA.............................. (415) 831-1681 Dead Zone, East Bay CA............................ (415) 352-3275 Dial Your Match, Daly City CA................. (415) 991-4911 Dial Your Match, Mountain View CA............. (415) 964-3255 Dial Your Match, San Francisco CA............. (415) 467-2588 Disk Byters, Fremont CA........................... (415) 489-0388 Doctors Office The, Redwood City CA............... (415) 365-9124 Download/80, San Rafael CA........................ (415) 488-9145 Draco-Net S.F. Apple Core, San Francisco CA....... (415) 474-8608 Dragons Lair, San Jose CA......................... (408) 996-7464 E-Tree-3, San Francisco CA........................ (415) 864-0774 Earthmind, San Francisco CA....................... (415) 474-9470 Falcon Color BBS, Fairfield CA.................... (707) 437-6336 Fido - IBM PC, San Francisco CA................... (415) 864-1418 FOG #01, Daly City CA............................. (415) 755-2030 FOG #03, Daly City CA............................. (415) 992-8542 FOG #04, Belmont CA............................... (415) 591-6259 FOG #05, Palo Alto CA............................. (415) 424-1482 FOG #12, Woodside CA.............................. (415) 851-7732 Forbidden Realm, San Mateo CA..................... (415) 343-8279 Franklin Mainframe, San Francisco CA.............. (415) 992-8099 Freedom of Choice, San Francisco CA........... (415) 431-8261 Friends of Bill W., Dublin CA..................... (415) 833-1780 Future Positive, Los Gatos CA..................... (408) 356-0567 Gemini-80, Fremont CA............................. (415) 794-7900 General Store, San Jose CA........................ (408) 253-8528 Golden Gate BBS, San Francisco CA................. (415) 283-6138 Golden State BBS, Novato CA....................... (415) 897-2783 Grafex, San Jose CA............................... (408) 996-2689 Grape Line, Santa Rosa CA......................... (707) 538-9124 Great American Dream Machine, Hayward CA.......... (415) 581-3019 Greenpeace, San Francisco CA...................... (415) 621-5492 Hermit System, Fairfield CA....................... (707) 428-3077 Humor & Wisdom, Concord CA........................ (415) 674-0660 IBM RBBS, San Francisco CA........................ (415) 861-5733 Info-Exchange, Vallejo CA......................... (707) 944-8002 Inner Circle, San Francisco CA.................... (415) 932-5847 Institution The, San Carlos CA.................... (415) 592-8418 Junction Box, San Francisco CA................ (415) 861-6489 Kay*Fog RBBS, San Francisco CA.................... (415) 285-2687 Kicks and Tricks, East Bay CA................. (415) 886-2431 Kinky Computer, San Francisco CA.................. (415) 550-7377 Kinky Komputer, San Francisco CA.............. (415) 552-8268 Land of the Lost, San Carlos CA................... (415) 595-8680 Land of the Lost, Redwood City CA................. (415) 364-6649 Livermore BBS, Livermore CA....................... (415) 455-5437 Living BBS, Campbell CA........................... (408) 378-3713 Living BBS, San Francisco CA...................... (415) 565-3037 Living BBS, San Jose CA........................... (408) 997-6148 Living BBS, Sunnyvale CA.......................... (408) 735-8181 Living BBS, Palo Alto CA.......................... (415) 327-8876 MaxBBS, San Jose CA............................... (408) 629-2277 MBBS, East Bay CA................................. (415) 524-4427 Mednet/Compunet, San Leandro CA................... (415) 895-2862 Metal, Los Altos CA............................... (415) 949-1476 Metal RBBS, Palo Alto CA.......................... (415) 949-2563 Metal RCPM, Sunnyvale CA.......................... (408) 733-1364 Micro Age, Fremont CA............................. (415) 791-2017 Micro Flash, Concord CA........................... (415) 680-1022 Micro Smut, San Francisco CA.................. (415) 469-8111 Milpitas TBBS, Milpitas CA........................ (408) 942-8164 Mines of Moria II, Aptos CA....................... (408) 688-9629 Modem Magazine, San Jose CA....................... (408) 289-9151 Morrow, San Leandro CA............................ (415) 632-1951 Motherboard, San Leandro CA....................... (415) 352-8442 MRC, Mountain View CA............................. (415) 968-6501 Mystic Caverns, Fremont CA........................ (415) 657-9096 Networks: Computer Emporium, San Jose CA.......... (408) 227-5416 Networks: Computer Line, Alameda CA............... (415) 865-2831 Networks: Computers at Law, San Jose CA........... (408) 265-8070 Networks: Micro Design Systems, Palo Alto CA...... (415) 322-8026 Networks: Winners Circle, Berkeley CA............. (415) 845-4812 Newbase, San Francisco CA......................... (415) 824-8767 Nibble Works, East Bay CA......................... (415) 569-0461 North Coast RCP/M, Fortuna CA..................... (707) 725-5230 Nwonknu, Redwood City CA.......................... (415) 365-4191 Omnibus, Sunnyvale CA............................. (408) 736-6181 On Broadway, San Mateo CA......................... (415) 571-7056 Oxgate 001, Santa Clara CA........................ (408) 287-5901 Oxgate 002, Militipas CA...................... (408) 263-2588 OxGate-008, Los Gatos CA.......................... (408) 354-5934 OxGate-012 Potpouri, San Jose CA.................. (408) 378-7474 Peacenet, San Francisco CA........................ (415) 896-0893 Peninsula Commodore Users, San Carlos CA.......... (415) 595-5452 PicoNet 003, San Jose CA.......................... (408) 296-5078 PicoNet 004, San Jose CA.......................... (408) 281-7059 Pirate, San Francisco CA.......................... (415) 775-2384 Pirates Warehouse, Corte Madera CA................ (415) 924-6282 PMS, Campbell CA.................................. (408) 370-0873 PMS, Pleasanton CA................................ (415) 462-7419 PMS, Santa Clara CA............................... (408) 554-9036 Production World, Foster City CA.................. (415) 571-6160 Program Land, Palo Alto CA........................ (415) 327-6197 Ralph Records, San Francisco CA................... (415) 546-0881 Rats Nest, San Jose CA............................ (408) 249-6946 RBBS-PC, Hayward CA............................... (415) 481-0252 RCP/M, San Francisco CA........................... (415) 648-3014 RCP/M RBBS, Fairfield CA.......................... (707) 422-7256 RCP/M RBBS, Mill Valley CA........................ (415) 383-0473 RCP/M RBBS, Moraga CA............................. (415) 376-3632 RCP/M RBBS, Napa Valley CA........................ (707) 257-6502 RCP/M RBBS DBase II, San Jose CA.................. (408) 378-8733 RCP/M RBBS Piconet, Mountain View CA.............. (415) 965-4097 Rich and Famous, San Francisco CA................. (415) 552-9968 Rogues Realm, Los Altos CA........................ (415) 941-1990 Schlaraffia BBS, Redwood City CA.................. (415) 364-6877 Screen Alamo, Alamo CA............................ (415) 837-6702 SiMMS 001 HQ, Sunnyvale CA........................ (408) 732-9190 SiMMS Baylist RCP/M, Sunnyvale CA................. (408) 730-8733 64 Direct Connection 1, Crockett CA............... (415) 787-2926 64 Direct Connection 2, San Jose CA............... (707) 554-2424 64 ET, San Francisco CA........................... (415) 821-6438 Skull & Crossbones, San Francisco CA.............. (415) 552-8924 Skyhouse Systems, San Jose CA..................... (408) 578-6185 Sphinx The, San Jose CA........................... (408) 255-8306 Split Infinity, Saratoga CA....................... (408) 867-4455 Starship, San Francisco CA........................ (415) 387-2190 Stuart BBS, Sunnyvale CA.......................... (408) 749-1872 Stuart II, Boulder Creek CA....................... (408) 338-9511 Sunrise OMEGA-80, Oakland CA...................... (415) 452-0350 Synapse BBS, Berkeley............................. (415) 843-0582 System/80, San Leandro CA......................... (415) 895-0699 Tardis, San Rafael CA............................. (415) 453-3989 TBBS, Fremont CA.................................. (415) 490-8083 TI Lines BBS, Pacifica CA......................... (415) 355-3092 Trade-A-Board, San Francisco CA................... (415) 392-6302 Underground Computer, Vallejo CA.................. (707) 996-2427 Vanvision, Sunnyvale CA........................... (408) 732-1079 Walnut Creek RBBS, Walnut Creek CA................ (415) 937-0156 Wellnet BBS, Mountain View CA..................... (415) 968-1126 Wolves Den The, East Bay CA....................... (415) 895-5706 ZCPR3 BBS, Fremont CA............................. (415) 489-9005  BBS, Sunnyvale CA.......................... (408) 749-1872 Stuart II, Boulder Creek CA....................... (408) 338-9511 Sunrise OMEGA-80, Oakland CA...................... (415) 452-0350 Synapse BBS, Berkeley............................. (415) 843-0582 System/80, San Leandro CA......................... (415) 895-0699 Tardis, San Rafael CA............................. (415) 453-3989 TBBS, Fremont CA.................................. (415) 490-8083 TI Lines BBS, Pacifica CA........................PIP B:TEST.FMT=RFORMAT.DOC[SXX00:^ZQ$$'^Z] our new *.FMT residing on disk with no extraneous files. Good luck, Ed Miller, Librarian EastBay MicroMate Users' Group January 22, 1985  a .SYM, .PRN, & .HEX file. Next, at the prompt type in the following: B>HEXCOM *.HEX This will create the .COM file now, B>RENAME *.FMT=*.COM and you will have your new *.FMT file. To execute see above or follow along B>RFORMAT *.FMT This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the file TWO HEX CHARACTERS ; FROM THE REG A IN REG DE. ; ; ------------------------------------------ ; M_HEX: PUSH AF RRCA RRCA RRCA RRCA CALL OHB ; MS4B FIRST LD D,A POP AF OHB: AND 0FH CP 0AH ; IS IT NUMBER JP C,NOADD ADD A,7 NOADD: ADD A,30H LD E,A RET TITLE RLIB6 RICH LIBRARY-6 DUMP WITH ADDRESS 08-06-84 22:01:00 ; ; DUMP ROUTINE DUMPS HEX AND ASCII STARTING ADDRESS ; IN HL LENGTH IN DE END OF LINE FLAG IN C ; DUMPA: PUSH HL ADD HL,DE ; FIND END POP DE ; NOW POINTS TO START DEC HL LD A,C AND 0FH LD C,A STLINE: PUSH BC PUSH DE PUSH HL CALL PRINT NOP LD C,0BH ; CON STATUS CALL 5 CP 01 JR NZ,NOSTOP LD C,1 ; GET CON: CALL 5 CP 18H ; ^X STOP DUMP NOSTOP: POP HL POP DE POP BC RET Z ; LD A,D ; GET ADDRESS CALL PRHEX LD A,E CALL PRHEXS NXTHEX: LD A,(DE) ; GET DATA CALL PRHEXS ; RET HEX IN DE INC DE LD A,E AND 0FH ; SEE IF END OF LINE CP C JP NZ,NXTHEX ; ; START TO PRINT ASCII ; PUSH HL PUSH DE XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW 0,0 XX10: DB 12,00, 03,0F5H, 01,0FEH, 00,00 DW 0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01 SECSIZE: DB 01, 01,0F7H, 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 64,0E5H, 64,0E5H, 64,0E5H, 64,0E5H DB 01,0F7H, 48,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16,0FFH,0 DW  0,0,0,0,0,0,0 XX80: S1SECT: DB 1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16,0FFH,0 DW 0,0,0,0,0,0,0 XXA0: DB '************** EPSON QX-10 FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 01,0E5H, 01,0E5H, 01,0E5H, 01,0E5H DB 01,0F7H, 48,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,5,9,13,2,6,10,14,3,7,11,15,4,8,12,16,0FFH DW PN 2N N @@@@0NNNNNNNN''        ************** EPSON QX-10 FORMAT *************** *.FMT File required to change formats.$    ************** EPSON QX-10 FORMAT *************** *.FMT File required to change formats.$Y=ʣ!=!>ß_!  <~=w4{ > ~7ȷ! @@> C ! p DISK FULL 0505 RNF 04A4 SECRD 05CB SECSIZ 0469 SECTN 05CC SECTOR 0458 SECZE  this should be aligned and show the 3 A1's but don't be concerned if it doesn't. then, 1 FE and, 1 TN 0 to 39 and, 1 SN 0 or 1 and, 1 SN 1 - 5 and, 1 03 Sector size - 00, 01, 02 or 03 (see above under MicroMate format for description) then, 1 F7 this will appear differently, not as F7. then, 22 4E's and, 12 00 and, 3 F5's A1's but all I've been able to get is 14 A1 A1 for the MicroMate! Don't worry if you do too!! then, 1 FB and,   DE PUSH BC CALL PTNCR DB '| ',0 POP BC POP DE ; RESET MEMORY POINTER TO PRINT ASCII LD HL,0FFF0H ADD HL,DE EX DE,HL POP HL ; POINTER NOW BACK 10H ; NXTASC: LD A,(DE) ; GET DATA AGAIN AND 7FH CP 07FH ; RUBOUT JP Z,NXASC2 ; PRINT '.' CP 20H JP NC,NXASC1 ; IF CTRL CH PRINT '.' NXASC2: LD A,'.' NXASC1: PUSH BC PUSH DE PUSH HL LD E,A LD C,2 CALL 5 POP HL POP DE POP BC INC DE LD A,E AND 0FH CP C JP NZ,NXTASC ; PRINT 16 ASCII CHAR PUSH HL XOR A SBC HL,DE POP HL JP NC,STLINE ; START AGAIN WITH HEX CALL PRINT NOP RET PRHEX: PUSH HL PUSH DE PUSH BC CALL M_HEX PUSH DE LD E,D LD C,2 CALL 5 ; PRINT MSHEX POP DE LD C,2 CALL 5 ; PRINT LSHEX POP BC POP DE POP HL RET ; PRHEXS: ; WITH SPACE AT END CALL PRHEX PUSH HL PUSH DE PUSH BC LD E,' ' LD C,2 CALL 5 POP BC POP DE POP HL RET TITLE RLIB7.MAC FFDEC NUMBS 08-06-84 23:10:00 ; FFDEC: ; CONVERTS INPUT IN DEC TO ; BINARY IN A ; CARRY SET ON ERROR ; USES A,B,C ; CALL SPACE RET C FFDEC1: CALL ITOP CP ' ' ; RET OK RET Z CP 0DH RET Z CALL NUMBS RET C ; ERROR LD B,A FFDEC2: CALL ITOP CP ' ' JR Z,DONE CP 0DH JR Z,DONE CALL NUMBS RET C ; ERROR ; ; MS4BITS IN B ; LS4BITS IN A LD C,A LD A,B ADD A,A ; X2 ADD A,A ; X4 ADD A,B ; X5 ADD A,A ; X10 ADD A,C ; ADD IN LS4BITS LD B,A JR FFDEC2 DONE: LD A,B RET ; NUMBS: ; CK RANGE OF NUMBERS ; RET C IN ERROR ; RET NUMBER IN A (NOT ASCII) CP 30H RET C ; BELOW NUMBERS CP 3AH CCF RET C ; PAST NUMBERS AND 0FH RET ; TITLE RLIB8.MAC 12-23-84 22:29:00 ; PRINT BYTE IN A AS A DEC NUMBER TO CON: ; PRTDEC: LD E,'0' HUNL: SUB 100 JR C,TEN INC E JR HUNL TEN: ADD A,100 CALL PRT? ; PRINT HUN DIGIT IF NOT 0 TENL: SUB 10 JR C,UNIT INC E JR TENL UNIT: ADD A,10 CALL PRT? OR 30H ; MAKE REG A INTO ASCII LD E,A LD C,2 JP 5 ; PROVIDES RET ; PRT?: PUSH AF LD A,'0' THIS DOC FILE IS BEING RENAMED DASM2.DOC TO SUPPORT THE DISASSEMBLER OF THE SAME NAME ON THIS DISK. AS CAN BE SEEN THE ORIGINAL PROGRAM WAS "RESOURCE". RESOURCE A disassembler for 8080 programs by Ward Christensen CP/M U.G. 1/80 Suggestions? Call me eve's at (312) 849-6279 RESOURCE commands are inconsistent at best. - RESOURCE is a kludge based on years of disassembler experience and hacking, and was never "planned" - just coded sitting at a tube, and modified over 2 years before being contributed to the CP/M UG. For example, to kill a symbol: k.label but to kill a control value: caddr,k and to kill a comment: ;addr, but RESOURCE does the job like no other I have seen. N-O-T-E: Pardon the editorial, but I feel hardware without good software is useless to 99% of us. Most good software has to be paid for. I strongly support the legitimate purchase of licensed software. I do not regularly use any programs which I have not purchased. (Yes, I do occasionally "try" one, but then buy it if I plan on using it). I have been asked by software businesses to NOT distribute RESOURCE - because of it's ability to produce good .asm source quickly. But, there are so many disassemblers out, why not a good, conversational one? Please use it in the spirit in which it was contributed: to enlarge your understanding of the micro- computer world around you, and to allow you to customize programs which you legitimately own, for your own use. ---- NOTE: any command taking a hex address (Dnnnn, etc) may take a value in the form .label but arithmetic may not be performed. (i.e. d.start is ok, but d.start+8 not) which runs at 100H. It goes thru 1700 or so, then the stack. At 1800 is a 512 entry table for control commands. Each is 3 bytes long, and controls the format of the re-sourced list, i.e. is it DB, DS, DW, instructions, etc. defined length as such. If it is not used, it occupies only 2 bytes. such as a PROM, a program previously loaded in high memory, "CP/M itself", or whatever, you can just do so. which runs at 100H, which is were RESOURCE runs. Bob Van Valzah would have solved that by making resource relocatable and moving itself up under BDOS. I wasn't that industrious. OFFSET. After all, what do you care where it is as long as it LOOKS like it's at 100h? Reading a .COM file (RFOO.COM) causes it to come into 3000 on. If you say D100 or L100 it dumps or lists what LOOKS like your program. Internally, RESOURCE is adding the offset to the D and L addresses. upon how many symbols you will use. O1F00 will load the program at 2000, thus allowing only 1E00-1FFF for symbols, i.e. 512 bytes or about 50-60 labels. If you didn't leave enough space, then used B to build a default symbol table, the table could run into and clobber your .com file! (easy recovery, however: just change the offset to being higher, and read in the .COM file again) Each entry takes 3 bytes + the symbo l length, and if you like 7 byte labels like I do, that means 10 bytes/label. An offset of 2F00 should be adequate. program, you will have to designate an area to Use for the comments. The U command (e.g. U4000) specifies what area is to be used. which will show the JMP to BDOS, which is the highest memory you may use. (Note if you have, for example, an empty 4K memory board in high memory, you can Use THAT for comments). which you want to disassemble. It will have about 300 labels. 300 x 10 is 3000, or call it 4K (what's a K unless your tight). The symbol table starts at 1E00. 4K more is 2E00. Let's load the .COM at 2E00, so since it normally starts at 100H, the offset is 2D00. O2D00 is the command. We then RFOO.COM to read it in. It says 4E00 2100 which means it came into actual memory to 4E00, but 2100 if we are talking with respect to loading at 100. the .COM program - say at 5000: U5000 control, symbol, and comments entries. (no, I never put in anything to keep track of the .COM - you'll just have to do that yourself). to reset the offset to 0: O0 but then set it back. If you are not sure what it is, typing O will tell the current offset. is enough to get you going - hmmm, better give you some of the gotcha's I've discovered... * * * * * * * * * * * * * * * * RESOURCE types an "*" prompt when it is loaded. You may then enter any of the following commands. Each command is a single letter followed by operands. Commas are shown as the delimiter, but a space will also work. ; Attempt to find DB's while listing the program. - Build default sym tbl (LXXXX) labels for each - Control table usage: - dump: - enter symbol: - Find occurrence of address or label. Note this function - kill symbol from table - list (disassemble). This command is used to list the - offset for disassembly - prolog generation - this routine generates an - quiet command: any command which is preceeded by a q - read .com, .ctl, .sym, or .doc file - save .asm, .ctl, .sym, or .doc file - use area of memory for comments table - purge sym tbl and CTL tbl close .asm file (note that a preferred way to close the -------------------------------------------- -------------------------------------------- Here is a sample of the RESOURCE usage. Given: lines preceeded with ---> are typed by you. ---> RESOURCE ---> o2200 ---> rtest.com <<<>>> that all 'L' (disassembly list) and 'D' (dump) If you are disassembling something which is in memory at it's correct address (such as looking at ccp) then don't set the offset. It defaults to 0 when dis is first loaded. ---> ---> NOTE that typically here are the steps to disassembling Use the dump command to find the ASCII DB areas. Note that the 'a' command may be used to automatically find the db's, but you must then check them to insure that they don't extend too far. All printable characters, 0dh, 0ah, and 00h are considered candidates for ascii db's. At least 8 characters in a row must be found to make sure that long sequences of mov instructions won't be taken  as db's. Use the cnnnn,k command to kill erronious entries put in the control table by the a command, but then immediately put in the right address, such as via cnnnn,i if you wanted to scan the program for ascii db's yourself, use the 'c' (control) command to set the beginning and 0100 0103 0117 would show up in the dump as: 0100 c3170144 4f50xxxx xxxxxxxx xxxxxxxx *...copyr ight....* 0110 xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx *xxxxxxxx ........* thus you would want to instruct the disassembler to switch to db mode at 103, and back to instruction mode at 117, thus: Continue doing this, bracketing every ascii db which is in the middle of instructions, by a b control instruction and an i control instruction. Note that multiple db's in a row need not have separate cnnnn,b instructions, but that these do cause a 'line break', i.e. if you have a table of ascii commands, for example: 02e5 02e9 the disassembler would disassemble these as: 02e4 !you could put in an additional control entry: c2e9,b, which would cause the disassembler to generate: 02e4 02e8 which is much more readable and realistic. Note that before generating each byte of a db, a symbol table lookup is done to determine if there is a label at that location, and if so, a new line is started. Thus if 'loadlit' and 'savelit' were in the symbol table, as the labels on the 'load' and 'save' above, no separate 'b' control instruction would be required as the label would cause the break. <<<>>> that at this time the automatic label checking is n-o-t done for ds instructions. Make sure that each ds instrucion references only up to the next label. This means that multiple ds's in a row must each be explicitly entered into the control table. Presence of a label is not sufficient. steps, continued: After building the control entries with cnnnn,b and cnnnn,i put in a control entry cnnnn,e which defines the address of the end of your program. The l command will then automatically stop there, and in addition, if you are in 'save xxx.asm' mode, the output .asm file will be closed. If you do mot define a control 'e' entry, then you will have to use the break facility to stop the l command (don't use control-c as that will re-boot cp/m). If you were writing an .asm file, you would have to user the z command to close the file. Next, you would list your program to determine how it looks. when you recognize a routine by it's function, insert a label. For example, if you saw that location 7ef was a character out routine (type) then enter a label into the symbol table: NOTE that all symbols start with a '.', so as to be dis- tinguished from hex data. NOTE that if you want the disassembler to make default labels for you, use b (for build labels) instead of l (for list program). The b commands causes lnnnn default labels to be inserted in the symbol table for every 2 byte operand encountered (LXI, SHLD, JMP, etc). It will undoubtedly make some you don't want, such as L0000. You will have to: When you encounter data reference instructions, try to determine what type of area the instruction points to. Typically,, LXI instructions may point to a work area which should be defined as a DS, or to an ASCII string, in which case we will have already made it a 'b' control instruction. Operands of LHLD and SHLD instructions should be made DW instructions. For example if you encounter LHLD 0534H, then issue a control instruction: NOTE that whatever mode you are last in will remain in effect. Therefore if 534,w is the last entry in the control table, all data from there on will be taken to be DW's. Suppose that you determine that address 7cf is a 128 byte buffer for disk I/O. You want it to disassemble to: DKBUF You do this as follows: Continue, iteratively using the 'l' command and the 'c' and 'e' commands until you have the listing in a nice format. You will then probably want to save the control symbol, and comments tables. Or, you could have been saving them at checkpoint times (so if you make a major mistake you could go back to a previous one). To save a control file: To save a symbol file: To save a comments file: NOTE that the filetypes must be used as shown, but that any legal filename (or disk:filename such as b:xxxx.CTL) may be used. You could now control-c to return to CP/M, and come back later to resume your disassembly: This will take you back exactly where you left off. If you want to save a .asm file out to disk, do the following: Make sure that there is a control entry defining the end of the program (such as c200,e) or else you will have to specify the ending address and manually type a z command to close the file. A message will indicate that the file is opened. Any subsequent a, b, or l command will have whatever is listed written to disk. Encountering a 'e' control, or typing a z command will then close the .asm file. The listing may be interrupted, and continued. Since the l command types only 10 lines, use laddr,ffff to list thru the end of the assembly. If this is the 'final' save of the .asm file, you will probably want to put an 'org' at the beginning of the output file, as well as generate equ instructions for any references outside of the program. For example, a typical cp/m program will have references to: the 'p' (for prologue) command generates the org, then scans the symbol table and generates equates: If you have a "e" control entry in your file, you can list as follows: laddr,ffff - the listing will continue until the "e" control entry is found additional commands: if you entered a label in the symbol table but now want to get rid of it: note to rename a symbol, such as when you had a system- assigned lnnnn label but now want to make it meaningful: you could even: but tha!t takes more typing. here are some more commands: ? c cnnnn ds ds.symbol ....have fun, and let me know of any problems or Any address may be replaced by .symbol i.e. D.START ;addr,comment ;addr ; ;addr, A(see "L" for operands) B(see "L" for operands) C Cnnnn Cnnnn,x Dxxxx Daaaa,bbbb D,bbbb D D=nn Ds Ds.symbol Ennnn,.symbol Fnnnn,ssss F Fnnnn K.symbol L Lssss,eeee L,eeee Lssss L=nn O Onnnn Pstart addr,end addr Q Rfilename.COM Rfilename.CTL Rfilename.SYM Rfilename.DOC Sfilename.ASM Sfilename.CTL Sfilename.SYM Sfilename.DOS Unnnn X Z ? commands: if you entered a label in the symbol table but now want to get rid of it: note to rename a symbol, such as when you had a system- assigned lnnnn label but now want to make it meaningful: you could even: but tha CP E JR Z,NOPRT LD C,2 CALL 5 NOPRT: POP AF LD E,'0' RET ; END ( ۀmӄ"ۀ:AO>( O:y(O: ӄ><(#  =  >:o&6 "B @ B ( @*+"7*~#"*+"  ^#wf!B } 7ÜB M M§ÏBB:A0W 0_+yOW  zl{̓̓{e| !I K>._{<RWZl B GB ( (OxGx0:?0d8d 8 0_>0(0 X or E to exit CR or F or Y to format __ ;Type in your choice SIDE 0 0123456789012345678901234567890123456789 SIDE 1 0123456789012345678901234567890123456789 Q or X or E to exit CR or F or Y to format -- ;Type in your choice ;i.e., Q or X or E will put you back to CP/M. While CR or F or Y ;will allow you to format another MicroMate disk in the same drive you ;have selected. If you wish to format a different format you must have a *.FMT file on disk corresponding to the given different format, i.e., KAYPRO2.FMT. The command at the B> prompt is as follows, with the resultant display. Where equals a carriage return. B>RFORMAT KAYPRO2 TRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595 KAYPRO2 SSDD FORMAT WHICH DRIVE? (A - D ALLOWED) __ ;Type in your choice as above Q or X or E to exit CR or F or Y to format __ ;Again, type in your choice, repeat to format another KAYPRO2 disk in the same drive. --------------------------------- THIS FILE CONTAINS AN INDICATION OF WHAT THE FILES ARE THAT ARE LOCATED ON THIS DISK: 8INSSSD .FMT 8INSSSD .MAC These files are associated with the program RFORMAT. The RFORMAT.DOC file should be read to see the relationship. In essence, they allow, at least the .FMT, to format an 8 inch single sided single density drive with the PMC MicroMate. DASM2 .COM DASM2 .MAC DASMZLG .MAC These are disassembler files for the needy. DIRZ .COM DIRZ .DOC DIRZ .MAC At last a directory that works with CP/M + (3.0). This program will give you a 4 column display of the files on disk showing the size of each in Kbytes, the number of files, the space used and the space free. EMPTY .COM EMPTY .MAC This program is also known as DISKNAME which some rename DN. The program establishes a 0 K file which is usually associated with the name of a disk and is used in many cases with the CATALOG program. IOTEST .COM IOTEST .MAC These are hardware orientation programs directed towards testing input and output ports. KAYPRO2 .FMT KAYPRO2 .MAC As with 8INSSSD.FMT above these files are the same only applied to the KAYPRO machine. See the RFORMAT.DOC for a complete explanation and data on how they are to be used. RFORMAT .COM RFORMAT .DOC RFORMAT .MAC A new formatting program for the PMC MicroMate machine which allows the formatting of any format after an .FMT file has been generated. See the documentation which has been supplied in the appropriate files on this disk. TRACKRD .COM TRACKRD .MAC These files are also associated with the RFORMAT program and are used in setting up a new format. See the documentation for a full explanation. XLATE3A .COM XLATE3A .MAC A 8080 to Z80 translator (version 1.1).  a disk and is used in many cases with the CATALOG program. IOTEST .COM IOTEST .MAC These are hardware orientation p"6K XLATE3A .COM TRANSLATES 8080 TO Z80 MNEMONICS .21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36 FOR IOTEST 012.19 2K KAYPRO2 .FMT FMT FILE FOR KAYPRO 2 DISK FORMAT 012.20 2K KAYPRO2 .MAC SRC FOR KAYPRO 2 FMT 012.21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36 6K XLATE3A VOLUME 012 DESCRIPTION: DISK FORMATTING, DISASSEMBLY, ETC. UTILITIES NUMBER SIZE NAME COMMENTS 012.1 2K -EBMMUG .012 DISK TITLE & CONTENTS OF EBMMUG VOL. 012 012.2 2K 8INSSSD .FMT FMT FILE FOR 8" SSSD DISKS 012.3 2K 8INSSSD .MAC SRC FOR FMT FILE 012.4 10K DASM2 .COM DISASSEMBLER 012.5 14K DASM2 .DOC DOCUMENTATION FOR DASM2 012.6 76K DASM2 .MAC SRC FOR DISASSEMBLER 012.7 18K DASMZLG .MAC SRC FOR ZLOG DISASSEMBLER 012.8 4K DIRZ .COM DIR PROG.- ALPHA ORDER LIST 012.9 2K DIRZ .DOC DOC FOR DIRZ 012.10 18K DIRZ .MAC SRC FOR DIRECTORY PROGRAM 012.11 2K DISK .DAT EXTENDED DESCRIPTION OF SOME FILES ON THIS DISK 012.12 2K EBMDIR12.TXT DIRCTORY OF THIS DISK 012.13 2K EMPTY .COM DISKNAMING PROG TO GEN A 0 K DIR NAME 012.14 2K EMPTY .MAC SRC FOR EMPTY 012.15 2K EPSON .FMT FMT FILE FOR EPSON DISK FORMAT 012.16 2K EPSON .MAC SRC FOR EPSON 012.17 2K IOTEST .COM PROG TO TEST HARDWARE I/O PORTS 012.18 2K IOTEST .MAC SRC FOR IOTEST 012.19 2K KAYPRO2 .FMT FMT FILE FOR KAYPRO 2 DISK FORMAT 012.20 2K KAYPRO2 .MAC SRC FOR KAYPRO 2 FMT 012.21 2K MAKE .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36 6K XLATE3A .COM TRANSLATES 8080 TO Z80 MNEMONICS PROPOR .DOC DOC FILE-PRINTERS: NEC 8023A & CITOH PROWRITER 011.17 6K WORDSTAR.DOC WS INSTALL & CUSTOM NOTES FOR TT & EPSON PRNTRS 011.18 28K WS-CO .LBR FOOTNOTE, MAGE31, PROPOR,& WORDSTAR FILES ABOVE .ASM SRC OF UTILITY TO SHOW ADDRESSES IN CPM3 009.42 2K TELL .COM UTILITY TO SHOW ADDR'S OF CCP, BIOS, ETC 009.43 6K WCOUNT .COM GIVES LINE- & WORD-COUNT OF A FILE 009.44 6K Z80 .LIB CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER DR'S ASSEMBLER UTILITY: Z80 MNEMONICS OCK BOARD .TXT DIRECTORY OF THIS DISK 006.23 200K GLOBALS .DAT MICRO MUMPS VERSION 4.02 - GLOBALS DATA "ve B. Now, you should have 2 hard copies of track reads; one, your *.FMT and the MicroMate. The next 3 pages of data is reference material which we will apply to your developing your *.FMT. Included are the single and double (dual) density IBM formats, the MicroMate format and the *.FMT outline to be used in developing your *.FMT. The data in the outline is for the MicroMate so it can be used as a guide in developing your *.FMT. To provide some basic information the following data shows the single and double density disk formats of IBM 3740 and 34 respectfully: ------------------------------------------------------------------------------ THE IBM 3740 FORMAT - 128 BYTES/SECTOR Shown below is the IBM single-density format with 128 bytes/sector. In order to format a diskette, the user must issue the Write Track command, and load the data register with the following values. For every byte to be written, there is one Data Request. NUMBER OF BYTES HEX VALUE OF BYTE WRITTEN  .COM TRANSLATES 8080 TO Z80 MNEMONICS E .SUB SUBMIT FILE TO GENERATE FMT FROM MAC 012.22 14K NULU .COM LIBRARY UTILITY (HAS BUGS?) 012.23 40K NULU .DOC DOCUMENTATION FOR NEW LIBRARY UTILITY 012.24 14K OTHERSYS.LST SF BAY AREA RBBS'S DEC 1984 012.25 2K RFORMAT .COM FORMATS A DISK; USES SIMPLE COMMANDS 012.26 24K RFORMAT .DOC DOCUMENTATION FOR NEW FORMATTING PROGRAM 012.27 10K RFORMAT .MAC SRC FOR RICH HARRINGTON'S RFORMAT 012.28 2K RFORMATA.SUB ONE-LINE PIP COMMAND TO COPY ASM FILE 012.29 2K RFORMATF.SUB ONE-LINE PIP COMMAND TO COPY FMT FILE 012.30 4K SD95 .COM "SUPER DIRECTORY" V9.5 012.31 2K SD95 .DOC DOC FOR SD95 012.32 6K SUBMIT .COM CP/M FILE-PROPRIETARY, MUST BE SUPPLIED BY USER 012.33 2K TRACKRD .COM PROG TO READ A TRACK ON ANY DISK 012.34 14K TRACKRD .MAC SRC OF RICH HARRINGTON'S TRACKRD 012.35 2K WIPE .COM ERASES PRN, HEX, SYM, REL & BAK FILES 012.36 6K XLATE3Ae the user must issue the Write Track command and load the data register with the following values. For every byte to be written, there is one Data Request. NUMBER OF BYTES HEX VALUE OF BYTE WRITTEN 80 4E 12 00 3 F6 (Writes C2) 1 FC (Index Mark) * 50 4E -------- 12 00 3 F5 (Writes A1) 1 FE (ID Address Mark) 1 Track Number (0 thru 4C) 1 Side Number (0 or 1) 1 Sector Number (1 thru 1A) 1 01 (Sector Size) 1 F7 (2 CRC's written) 22 4E 12 00 3 F5 (Writes A1) 1 FB (Data Address Mark) 256 DATA 1 F7 (2 CRC's written) 54 4E -------- 598** 4E * Write bracketed field 26 times ** Continue writing until FD179X interrupts out. Approx. 598 bytes. ------------------------------------------------------------------------------ Now we present the same type of format information as it is used in the MicroMate machine. Format programs write a full track at one time. A full track typically has a header, sectors, and a tail filler. THE MICROMATE DSDD DISK FORMAT IS: NAME COUNT DATA COMMENT HEADER 80 4EH 12 00 3 F6 WRITES C2 1 FC WRITES INDEX MARK 50 4E SECTOR REPEAT 5 TIMES FOR MICROMATE 12 00 3 F5 WRITE A1 1 FE INDEX MARK 1 TN TRACK NUNBER 0 - 39 1 SN SIDE 0 or 1 1 SN SECTOR NUMBER 1 - 5 1 03 SECTOR SIZE 00(00)=128, 01(01)=256, 10(02)=512, 11(03)=1024 1 F7 WRITES 2 CRC 22 4E 12 00 3 F5 WRITES A1 1 FB DATA ADDRESS MARK 1024 E5 DATA 1 F7 WRITES 2 CRC 54 4E TAIL 1792 4E WRITES 4E UNTIL END OF TRACK If the MicroMate format were an *.FMT file it would look like: ; 256 BYTES OF FORMAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; ---------THE *.FMT FILE BEGINS BELOW THIS LINE-------------------------------- XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW 0,0 XX10: DB 12,00, 03,0F5H, 01,0FEH, 00,00 DW 0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01 SECSIZE: DB 03, 01,0F7H, 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 00,0E5H, 00,0E5H, 00,0E5H, 00,0E5H DB 01,0F7H, 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH#, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ----------------THE LINE ABOVE THIS LINE ENDS THE *.FMT----------------------- Now lets develope your *.FMT file Your disk in drive A must contain the following files: MAKE.SUB RFORMAT.COM RFORMAT.DOC RFORMATA.SUB RFORMATF.SUB SUBMIT.SUB TRACKRD.COM WIPE.COM PIP the data between the two indicated lines, i.e., "THE *.FMT FILE BEGINS BELOW THIS LINE" and "THE LINE ABOVE THIS LINE ENDS THE *.FMT", with the following command: (Type in exactly as shown. Do not change the TEST.FMT to the name of your FMT as the submit file uses TEST. If you wish you can use the file extension .ASM instead of .FMT as the file will have to be renamed event- ually for the purposes to assembling with MAC. In the latter case use the second command line below). Use the Submit files provided on this disk, RFORMATF.SUB contains the PIP command below for the FMT, while the RFORMATA.SUB contains the PIP command below for the ASM. To use the Submit merely type RFORMATF or RFORMATA at the prompt. Of course you must have the SUBMIT.COM and the RFORMAT.DOC files available. You will note that the destination is B: therefore your files will be on A: and the new TEST file will be PIP'ed to B:. PIP B:TEST.FMT=RFORMAT.DOC[SXX00:^ZQ$'^Z] PIP B:TEST.ASM=RFORMAT.DOC[SXX00:^ZQ$'^Z] No yo wil hav fil o dis wit you name .FM o .AS whic you ca edi changin th appropriat section t correspon t th ne data yo hav obtaine fro th trac read Don' forge t renam th comment lin fro MicroMat t th nam o you FM an en i wit $ mak sure that the comment ending with the $' is before XXFF. Usin you tex edito writ you ow *.FM fil usin th TRACKRĠ progra o know formatte dis (I woul b bette i th dis ha n dat o it) Thi shoul have bee don before i not d i now Wit th dat obtaine yo ar read t tak th "Dump o th MicroMat TRACKRĠ an compar wit th fil i th MicroMat outlin above Usin you FM "dump yo wil buil fil lik th on abov onl fo th ne forma usin th outlin an replacin th necessar dat obtaine fro th trac rea usin you editor. Note 00 00 = goto the next XXX0. That is if you are at XX06 then the next data would come from XX10. Note that 00 FF = end of header, sector or tail. Note that starting at XX00 there should be about 80 4E's (see the IBM dual- density and MicroMate formats above), the H in 80,4EH stands for hex. Next, the "Dump" should have 12 00's then, 3 F6's (which show up as C2's) then, 1 FC and 50 4E's This ends the header - note how this is put into the *.FMT outline for the MicroMate and that the 00,0FFH shows the end of the header. DB (defined byte) 80,4EH(Hex), 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW (defined word) 0,0 This is a filler so that the total of the DB and DW equal 16 decimal or 10H. In this way the ten lines between XX00 and XX10 will be filled. The DB line counts 12 and the DW counts 4 (2 bytes per word or 0) for a total of 16. Now, comes the Sector which is repeated 5 times for the MicroMate. At XX10: DB is 12 00's 3 F5's this is written as A1, sometimes a different byte will show indicating that the disk is out of sync. in later sectors this should be aligned and show the 3 A1's but don't be concerned if it doesn't. and, 1 FE This is an index mark. and, 00,00 This is for the programmer to expand later if so desired. Do not change. then, DW which is 0,0,0,0 Again, these are fillers to make up the total bytes for the space between XX10 and XX20. In this case they represent 8 and with 8 in the DB line we have a total of 16 or 10H. Now, we are at XX20: and, 1 TN 0 to 39 and, 1 SN 0 or 1 and, # 1 SN 1 - 5 and, 1 03 Sector size - 00, 01, 02 or 03 (see above under MicroMate format for description) then, 1 F7 this will appear differently, not as F7. then, 22 4E's and, 12 00's and, 3 F5's A1's but all I've been able to get is 14 A1 A1 for the MicroMate! Don't worry if you do too!! Now, at XX30: then, 1 FB is the data address mark. and, 1024 E5's is the data block. It will be E5's and in one of the following configurations: 4 x 20H or 32 decimal= 128 bytes or, 4 x 40H or 64 decimal= 256 bytes or, 4 x 80H o.PO 0 DOCUMENTATION FOR RFORMAT AND TRACKRD A TRANSIENT FORMAT PROGRAM A formatting program to generate any machine disk format: By Rich Harrington 31 Blade Way Walnut Creek, CA 94595 To use the RFORMAT program of Rich Harrington it is merely necessary to place the disk containing RFORMAT.COM in drive say A and from the A> prompt type RFORMAT. This will allow you to format a disk for the MicroMate on the drive you select and continue to do so until you exit the program at the prompt. The following will be displayed on your console with a (carriage return) after the RFORMAT command. TRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595 *************** MICROMATE FORMAT *************** *.FMT File required to change formats. WHICH DRIVE? (A - D ALLOWED) __ ;Type in the drive for formatting  Q or X or E to exit CR or F or Y to format __ ;Type in your choice SIDE 0 0123456789012345678901234567890123456789 SIDE 1 0123456789012345678901234567890123456789 Q or X or E to exit CR or F or Y to format -- ;Type in your choice ;i.e., Q or X or E will put you back to CP/M. While CR or F or Y ;will allow you to format another MicroMate disk in the same drive you ;have selected. If you wish to format a different format you must have a *.FMT file on disk corresponding to the given different format, i.e., KAYPRO2.FMT. The command at the A> prompt is as follows, with the resultant display. Where equals a carriage return. A>RFORMAT KAYPRO2 TRANSIENT FORMAT PROGRAM 12-31-84 BY Rich Harrington 31 Blade Way Walnut Creek, CA 94595 KAYPRO2 SSDD FORMAT WHICH DRIVE? (A - D ALLOWED) __ ;Type in your choice as above Q or X or E to exit CR or F or Y to format __ ;Again, type in your choice, repeat to format another KAYPRO2 disk in the same drive. --------------------------------------------------------------------------- Next, use TRACKRD.COM to obtain the disk format data you will need later. The use of TRACKRD allows you to read the tracks of a disk to obtain the data needed to establish a .FMT file for formatting that particular machine format. With TRACKRD.COM on disk, type the following at the prompt: A>TRACKRD ;The following will be displayed: DISK TRACK READ PROGRAM BY RICH HARRINGTON VER 1.0 08-06-84 VER 1.1 11-12-84 REMOVED FILE WRITE ADDED CLOCK SPEED VER 1.2 01-18-85 ADDED SECTOR READ FILE WRITE OPTIONS LOG DISK L DRIVE NAME SET TRACK T TRACK NUMBER DECIMAL CLOCK RATE C 5 or 8 SET SIDE H 0 or 1 SET DENSITY Z S or D SET SECTOR S SECTOR NUMBER IN DECIMAL SET SECTOR SIZE U 0=128 1=256 2=512 3=1024 WRITE SECTOR W d:filename READ TRACK R READ SECTOR P DUMP TRACK D MUST HAVE READ FIRST ^X TO STOP DUMP EXIT PROGRAM ^C TO EXIT TO CP/M $ At the $ prompt type in the data for the disk format you are interested in and for which you will develop a .FMT file. Follow the listing displayed answering each after the $ prompt. A indicates a carriage return. The following examples are data for the MicroMate format. $L B ;Where B is the drive which has the formatted disk to ;be read. $T 0 ;This will allow the setting of track 0. $C 5 ;This sets for the disk size, i.e. 5 or 8. The default ;is 5 so leaving out the $C causes the program to ;assume that the disk is 5 inch. $H 0 ;This sets the side to be read, i.e., in this case ;zero. The alternative of course is 1 for side 1, ;which you will use later to read side 1. The default ;is to 0. $Z D ;This sets the disk density, in this case double. ;For single density it would be S instead of D. $S 0 ;This selects the sector to be read...the result ;will be the true sector data as written. A deter- ;mination of th$e number of the sectors is obtained ;from an R read & D dump. $U 3 ;The U input is the sector size which will vary with ;the format and can be ascertained with an R read & ;D dump. Look at the outline above where this data, ;when obtained, is placed, i.e.,SECSIZE. In the ex- ;ample shown the 3 or 03 is equal to a 1024 sector ;size. $W d:filename.ext ;When you wish to write the sector data ;to disk use the W command. Determine which drive & ;and the name of the file to which the data will be ;written and employ with the W command as shown. As ;can be seen the standard CP/M notation is used for ;the drive and filename. $R ;This causes the disk to seek to, and read the entire ;track. $P ;This reads the sector selected by the number you have ;entered using the S command. It does not move the ;head, i.e., it doesn't change tracks. In case you ;select a specific track number and the dump shows a ;different track number you are probably faced with the ;reality that someone (a software artist) has put a ;copy protect scheme onto the disk. $D ;With this command the read disk format is "DUMP"ed ;so the disk read is locatable by tracks with the ;read-out in hex. ;NOTE!! At the be prepared to ^S (control S) ;to stop the scrolling or you will miss the first ;addresses. A ^Q (control Q) will continue the scroll. ;The ^S/^Q is an off/on toggle for scrolling. ;NOTE!! It's a good idea to obtain a hard copy of ;this dump so you should turn on you printer and ;^P (control P) before you send the . Or you can ;use W to write the data to a file. ^X ;A control X will stop the dump and give you the $ ;prompt. $^C ;The ^C (control C) will put you back to CP/M prompt. ------------------------------------------------------------------------------ DEVELOPING A *.FMT FILE: This program allows the user to define different machine disk formats by generating an *.FMT file. NOTE!! NOTE!! It follows that wherever you see the *.FMT throughout this documentation you must replace the * with the name of your file. It should be understood that the *.FMT is used in conjunction with RFORMAT as previously explained. First, obtain a disk (no data, unused preferred) which has been formatted in the format in which you want to develope the *.FMT file. Read the format data with TRACKRD. See above for instructions on the use of TRACKRD.COM. Remove your foreign formatted disk from the B drive! To obtain an exemplar track read it would be a good idea to follow the same TRACKRD instructions indicated above using a formatted MicroMate disk. Thi wil giv yo referenc t mak comparisons Leavthi MicroMate disk in drive B. Now, you should have 2 hard copies of track reads; one, your *.FMT and the MicroMate. The next 3 pages of data is reference material which we will apply to your developing your *.FMT. Included are the single and double (dual) density IBM formats, the MicroMate format and the *.FMT outline to be used in developing your *.FMT. The data in the outline is for the MicroMate so it can be used as a guide in developing your *.FMT. To provide some basic information the following data shows the single and double density disk formats of IBM 3740 and 34 respectfully: ------------------------------------------------------------------------------ THE IBM 3740 FORMAT - 128 BYTES/SECTOR Shown below is the IBM single-density format with 128 bytes/sector. In order to format a diskette, the user must issue the Write Track command, and load the data register with the following values. For every byte to be written, there is one Data Request. NUMBER OF BYTES HEX VALUE OF BYTE WRITTEN  40 FF (or 00)* 6 00 1 FC (Index Mark) ** 26 FF (or 00)* -------- 6 00 1 FE (ID Address Mark) 1 Track Number 1 Side Number (00 or 01) 1 Sector Number (1 thru 1A) 1 00 (Sector Length) 1 F7 (2 CRC's written) 11 FF (or 00)* 6 00 1 FB (Data Address Mark) 128 Data (IBM uses E5) 1 F7 (2 CRC's written) 27 FF (or 00)* -------- 247*** FF (or 00)* * Optional '00' on 1795/7 only. ** Write bracketed field 26 times. *** Continue writing until FD179X interrupts out. Approx. 247 bytes. ------------------------------------------------------------------------------ IBM SYSTEM 34 FORMAT - 256 BYTES/SECTOR Shown below is the IBM dual-density format with 256 bytes/sector. In order to format a disket$te the user must issue the Write Track command and load the data register with the following values. For every byte to be written, there is one Data Request. NUMBER OF BYTES HEX VALUE OF BYTE WRITTEN 80 4E 12 00 3 F6 (Writes C2) 1 FC (Index Mark) * 50 4E -------- 12 00 3 F5 (Writes A1) 1 FE (ID Address Mark) 1 Track Number (0 thru 4C) 1 Side Number (0 or 1) 1 Sector Number (1 thru 1A) 1 01 (Sector Size) 1 F7 (2 CRC's written) 22 4E 12 00 3 F5 (Writes A1) 1 FB (Data Address Mark) 256 DATA 1 F7 (2 CRC's written) 54 4E -------- 598** 4E * Write bracketed field 26 times ** Continue writing until FD179X interrupts out. Approx. 598 bytes. ------------------------------------------------------------------------------ Now we present the same type of format information as it is used in the MicroMate machine. Format programs write a full track at one time. A full track typically has a header, sectors, and a tail filler. THE MICROMATE DSDD DISK FORMAT IS: NAME COUNT DATA COMMENT HEADER 80 4EH 12 00 3 F6 WRITES C2 1 FC WRITES INDEX MARK 50 4E SECTOR REPEAT 5 TIMES FOR MICROMATE 12 00 3 F5 WRITE A1 1 FE INDEX MARK 1 TN TRACK NUNBER 0 - 39 1 SN SIDE 0 or 1 1 SN SECTOR NUMBER 1 - 5 1 03 SECTOR SIZE 00(00)=128, 01(01)=256, 10(02)=512, 11(03)=1024 1 F7 WRITES 2 CRC 22 4E 12 00 3 F5 WRITES A1  1 FB DATA ADDRESS MARK 1024 E5 DATA 1 F7 WRITES 2 CRC 54 4E TAIL 1792 4E WRITES 4E UNTIL END OF TRACK If the MicroMate format were an *.FMT file it would look like: ; 256 BYTES OF FORMAT SPACE OVER-WRITE WITH *.FMT FILE ; TO CHANGE FORMAT TYPE ; ---------THE *.FMT FILE BEGINS BELOW THIS LINE-------------------------------- XX00: DB 80,4EH, 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW 0,0 XX10: DB 12,00, 03,0F5H, 01,0FEH, 00,00 DW 0,0,0,0 XX20: DB 01 TRACK: DB 00 DB 01 SIDE: DB 00 DB 01 SECTOR: DB 01 DB 01 SECSIZE: DB 03, 01,0F7H, 22,4EH, 12,00, 03,0F5H XX30: DB 01,0FBH, 00,0E5H, 00,0E5H, 00,0E5H, 00,0E5H DB 01,0F7H, 54,4EH, 00,0FFH XX40: DB 00,4EH, 00,4EH, 00,4EH, 00,4EH DB 00,4EH, 00,4EH, 00,4EH, 00,0FFH XX50: SIDES: DB 1 TS01: DB 0 TS0L: DB 39 TS11: DB 0 TS1L: DB 39 DENS: DB 0 ; 0 = DOUBLE 40H = SINGLE SIZE: DB 0 ; 0 = 5 INCH 80H = 8 INCH DB 0,0,0,0,0,0,0,0,0 XX60: S0SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XX80: S1SECT: DB 1,2,3,4,5,0FFH DW 0,0,0,0,0,0,0,0,0,0,0,0,0 XXA0: DB '*************** MICROMATE FORMAT ***************' DB 0DH,0AH,'*.FMT File required to change formats.$' ----------------THE LINE ABOVE THIS LINE ENDS THE *.FMT----------------------- Now lets develope your *.FMT file Your disk in drive A must contain the following files: MAKE.SUB RFORMAT.COM RFORMAT.DOC RFORMATA.SUB RFORMATF.SUB SUBMIT.COM TRACKRD.COM WIPE.COM PIP the data between the two indicated lines, i.e., "THE *.FMT FILE BEGINS BELOW THIS LINE" and "THE LINE ABOVE THIS LINE ENDS THE *.FMT", with the following command: (Type in exactly as shown. Do not change the TEST.FMT to the name of your FMT as the submit file uses TEST. If you wish you can use the file extension .ASM instead of .FMT as the file will have to be renamed event- ually for the purposes to assembling with MAC. In the latter case use the second command line below). Use the Submit files provided on this disk, RFORMATF.SUB contains the PIP command below for the FMT, while the RFORMATA.SUB contains the PIP command below for the ASM. To use the Submit merely type RFORMATF or RFORMATA at the prompt. Of course you must have the SUBMIT.COM and the RFORMAT.DOC files available. You will note that the destination is B: therefore your files will be on A: and the new TEST file will be PIP'ed to B:. PIP B:TEST.FMT=RFORMAT.DOC[SXX00:^ZQ$'^Z] PIP B:TEST.ASM=RFORMAT.DOC[SXX00:^ZQ$'^Z] No yo wil hav fil o dis wit you name .FM o .AS whic you ca edi changin th appropriat %section t correspon t th ne data yo hav obtaine fro th trac read Don' forge t renam th comment lin fro MicroMat t th nam o you FM an en i wit $ mak sure that the comment ending with the $' is before XXFF. Usin you tex edito writ you ow *.FM fil usin th TRACKRĠ progra o know formatte dis (I woul b bette i th dis ha n dat o it) Thi shoul have bee don before i not d i now Wit th dat obtaine yo ar read t tak th "Dump o th MicroMat TRACKRĠ an compar wit th fil i th MicroMat outlin above Usin you FM "dump yo wil buil fil lik th on abov onl fo th ne forma usin th outlin an replacin th necessar dat obtaine fro th trac rea usin you editor. Note 00 00 = goto the next XXX0. That is if you are at XX06 then the next data would come from XX10. Note that 00 FF = end of header, sector or tail. Note that starting at XX00 there should be about 80 4E's (see the IBM dual- density and MicroMate formats above), the H in 80,4EH stands for hex. Next, the "Dump" should have 12 00's then, 3 F6's (which show up as C2's) then, 1 FC and 50 4E's This ends the header - note how this is put into the *.FMT outline for the MicroMate and that the 00,0FFH shows the end of the header. DB (defined byte) 80,4EH(Hex), 12,00, 03,0F6H, 01,0FCH, 50,4EH, 00,0FFH DW (defined word) 0,0 This is a filler so that the total of the DB and DW equal 16 decimal or 10H. In this way the ten lines between XX00 and XX10 will be filled. The DB line counts 12 and the DW counts 4 (2 bytes per word or 0) for a total of 16. Now, comes the Sector which is repeated 5 times for the MicroMate. At XX10: DB is 12 00's 3 F5's this is written as A1, sometimes a different byte will show indicating that the disk is out of sync. in later sectors this should be aligned and show the 3 A1's but don't be concerned if it doesn't. and, 1 FE This is an index mark. and, 00,00 This is for the programmer to expand later if so desired. Do not change. then, DW which is 0,0,0,0 Again, these are fillers to make up the total bytes for the space between XX10 and XX20. In this case they represent 8 and with 8 in the DB line we have a total of 16 or 10H. Now, we are at XX20: and, 1 TN 0 to 39 and, 1 SN 0 or 1 and,  1 SN 1 - 5 and, 1 03 Sector size - 00, 01, 02 or 03 (see above under MicroMate format for description) then, 1 F7 this will appear differently, not as F7. then, 22 4E's and, 12 00's and, 3 F5's A1's but all I've been able to get is 14 A1 A1 for the MicroMate! Don't worry if you do too!! Now, at XX30: then, 1 FB is the data address mark. and, 1024 E5's is the data block. It will be E5's and in one of the following configurations: 4 x 20H or 32 decimal= 128 bytes or, 4 x 40H or 64 decimal= 256 bytes or, 4 x 80H or 128 decimal= 512 bytes or, 4 x 00H or 256 decimal=1024 bytes this last is what is seen for the MicroMate in the outline. and, 1 F7 two bytes are written then, 54 4E's Mine writes 85 4E's instead of 54 but it works. This ends the Sector: Note that the sector ends with 00,00FFH Notice also that defined bytes between XX30: and XX40: is also 16 or 10H. The Tail is 1792 4E's and is represented by the data in XX40: again, 16 defined bytes. At this point you should be at XX50: Under SIDES: for the defined byte, i.e., DB 1 enter a 0 or a 1 TS01: DB 0 this is Track 1 Side 0 or the first track on side 0 TS0%L: DB 39 this is the last track on side 0 TS11: DB 0 the first track on side 1 TS1L: DB 39 the last track on side 1 DENS: DB 0 "0" = DOUBLE "40H" = SINGLE SIZE: DB 0 "0" = 5 INCH "80H" = 8 INCH in both cases above do not put in the " " when you enter the data. DB 0,0,0,0,0,0,0,0,0 All of the defined bytes above this are 7 so with 9 more we have the 16 or 10H. At XX60 is the Sector Translation Table (Sector order) for side 0 which ends with FF, the Flag that indicates there are no more sectors. The number sequence is ascertained from the dump reading the byte for the number of the sectors. When the sequence is established it is placed here with each number separated by commas. It should be noted that the DB line must contain an even number including the 0FFHr 128 decimal= 512 bytes or, 4 x 00H or 256 decimal=1024 bytes this last is what is seen for the MicroMate in the outline. and, 1 F7 two bytes are written then, 54 4E's Mine writes 85 4E's instead of 54 but it works. This ends the Sector: Note that the sector ends with 00,00FFH Notice also that defined bytes between XX30: and XX40: is also 16 or 10H. The Tail is 1792 4E's and is represented by the data in XX40: again, 16 defined bytes. At this point you should be at XX50: Under SIDES: for the defined byte, i.e., DB 1 enter a 0 or a 1 TS01: DB 0 this is Track 1 Side 0 or the first track on side 0 TS0L: DB 39 this is the last track on side 0 TS11: DB 0 the first track on side 1 TS1L: DB 39 the last track on side 1 DENS: DB 0 "0" = DOUBLE "40H" = SINGLE SIZE: DB 0 "0" = 5 INCH "80H" = 8 INCH in both cases above do not put in the " " when you enter the data. DB 0,0,0,0,0,0,0,0,0 All of the defined bytes above this are 7 so with 9 more we have the 16 or 10H. At XX60 is the Sector Translation Table (Sector order) for side 0 which ends with FF, the Flag that indicates there are no more sectors. The number sequence is ascertained from the dump reading the byte for the number of the sectors. When the sequence is established it is placed here with each number separated by commas. It should be noted that the DB line must contain an even number including the 0FFH. Therefore, if necessary you must add a ,0 following the 0FFH The 26 bytes of 0's are fillers. This time instead of 16 defined bytes 32 are needed (20H) because we need 20 lines between XX60: and XX80: thus the 6 defined bytes in the first line and the 13 0's (defined words) in the second line representing 26 bytes makes a total of 32 or 20H. XX80: is the same as above but for side 1, in both cases it should be noted that 5 sectors are shown. Again the 26 bytes of 0's represent fillers. Then at XXA0: the text of what format the .FMT represents is shown. The second line follows the 0DH,0AH'. The ending must be $' as shown and be before XXFF. In any event the comments are restricted to a total of 96 characters. The example in the MicroMate outline has 50 in the first line and 45 in the second for a total of 95. Note that the hex notations ODH and OAH are each one character. Next, you should proof-read your data and if everything is OK then follow the indicated procedure below using MAC, the CP/M assembler. Make sure your new *.FMT has the .ASM extension, RENAME the file if it's necessary. Then give the following command at the prompt or go to the # sign below for an alternate method. A>MAC *.ASM This will assemble the *.ASM file and create a .SYM, .PRN, & .HEX file. Print your .PRN file and make sure XX-- is really XX-- which conforms to the outline above. Next, at the prompt type in the following: A>HEXCOM *.HEX This will create the .COM file now, A>RENAME *.FMT=*.COM and you will have your new *.FMT file. A>RFORMAT *.FMT To execute see above (1st page of this documentation). This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the files &WIPE.COM & SUBMIT.COM to be on disk. At the prompt, type as indicated: Don't forget * = the name of your FMT. A>MAKE *.FMT A>DIR You should find your new *.FMT residing on disk with no extraneous files. Good luck, Ed Miller, Librarian EastBay MicroMate Users' Group February 7, 1985 llowing: A>HEXCOM *.HEX This will create the .COM file now, A>RENAME *.FMT=*.COM and you will have your new *.FMT file. A>RFORMAT *.FMT To execute see above (1st page of this documentation). This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the files WIPE.COM & SUBMIT.COM to be on disk. At the prompt, typ. Therefore, if necessary you must add a ,0 following the 0FFH The 26 bytes of 0's are fillers. This time instead of 16 defined bytes 32 are needed (20H) because we need 20 lines between XX60: and XX80: thus the 6 defined bytes in the first line and the 13 0's (defined words) in the second line representing 26 bytes makes a total of 32 or 20H. XX80: is the same as above but for side 1, in both cases it should be noted that 5 sectors are shown. Again the 26 bytes of 0's represent fillers. Then at XXA0: the text of what format the .FMT represents is shown. The second line follows the 0DH,0AH'. The ending must be $' as shown and be before XXFF. In any event the comments are restricted to a total of 96 characters. The example in the MicroMate outline has 50 in the first line and 45 in the second for a total of 95. Note that the hex notations ODH and OAH are each one character. Next, you should proof-read your data and if everything is OK then follow the indicated procedure below using MAC, the CP/M assembler. Make sure your new *.FMT has the .ASM extension, RENAME the file if it's necessary. Then give the following command at the prompt or go to the # sign below for an alternate method. A>MAC *.ASM This will assemble the *.ASM file and create a .SYM, .PRN, & .HEX file. Print your .PRN file and make sure XX-- is really XX-- which conforms to the outline above. Next, at the prompt type in the following: A>HEXCOM *.HEX This will create the .COM file now, A>RENAME *.FMT=*.COM and you will have your new *.FMT file. A>RFORMAT *.FMT To execute see above (1st page of this documentation). This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the files WIPE.COM & SUBMIT.COM to be on disk. At the prompt, type as indicated: Don't forget * = the name of your FMT. A>MAKE *.FMT A>DIR You should find your new *.FMT residing on disk with no extraneous files. Good luck, Ed Miller, Librarian EastBay MicroMate Users' Group February 7, 1985 llowing: A>HEXCOM *.HEX This will create the .COM file now, A>RENAME *.FMT=*.COM and you will have your new *.FMT file. A>RFORMAT *.FMT To execute see above (1st page of this documentation). This will ask for the drive you wish to use to format the new format...just follow the directions given and you will have a newly formatted disk in your new .FMT configuration...if it doesn't work call Rich Harrington anytime!!!! # Alternate assembly using a submit file MAKE.SUB which resides on this disk. The alternate method also requires the files WIPE.COM & SUBMIT.COM to be on disk. At the prompt, typ&''