; USE, DISP, inports and exports added Tuesday 06:03:23 pm 06/03/90 ; ; USE error cured ? Friday 08:51:26 pm 09/03/90 ; ; Nasty bug with "U" as an identifier cured (?) Saturday 05:16:55 pm 07/04/90 ; ; Showing 32 bit lables Saturday 06:42:38 pm 11/08/90 ; ; Multiple passes fixed Monday 04:21:00 am 10/09/90 ; ORG #0 datapFormat DEFS 2 dataTemplate DEFS 4 dataFlags DEFS 2 Tab EQU #0A Ccr EQU #18 Esc EQU #1B OUTPUT "A" ORG #9000,#3000 Print EQU #40 Enter EQU #43 ReadKey EQU #46 TestKey EQU #55 WriteHex8 EQU #4C WriteHex16 EQU #4F Variables EQU #C000 Write_AHL EQU #5009 Start LD B,4 CALL fsGetBlock JP C NoRhume LD BC,Variables IN E,(C) OUT (C),A LD (WSblock),A LD A,E LD (WSblockP),A LD HL,cFileName GFNlp POP AF LD (HL),A INC HL OR A JR NZ GFNlp POP HL LD (pObject),HL POP HL LD (pObject+2),HL POP HL LD (pDisplace),HL POP HL LD (pDisplace+2),HL POP AF LD (GlobalHashs),A POP HL LD (ListO),HL LD (iListO),HL POP HL LD (ObjeO),HL LD (iObjeO),HL XOR A LD (TestingO),A LD (iTestingO),A LD HL,PrevBlocks CALL GetwSymA LD (HL),A INC HL CALL GetwSymB LD (HL),A INC HL CALL GetwSymC LD (HL),A CALL InitSymbols JR C PissOff LD DE,sMnemonics LD HL,cMnemBlocks CALL fsGetList JR C ExitFail1 LD DE,cFileName LD HL,cSList CALL fsGetList JP C ExitFail CALL ASSEM JP C ExitFail ReturnBlock CALL KillSymbols PissOff LD HL,(pPC+2) LD DE,(pPC) PUSH HL PUSH DE LD HL,(pDisp+2) LD DE,(pDisp) PUSH HL PUSH DE LD HL,PrevBlocks LD A,(HL) CALL SetwSymA INC HL LD A,(HL) CALL SetwSymB INC HL LD A,(HL) CALL SetwSymC LD C,4 LD A,(WSblock) CALL fsPutBlock LD A,(WSblockP) LD BC,Variables OUT (C),A EXX POP DE POP HL EXX POP DE POP HL RET sMnemonics DEFM /Mnem_68000/ DEFB #0D ExitFail1 CALL PrintStrPC DEFB #0D DEFM /** Mnemonic file missing **/ DEFB #0D DEFM /Load file "Mnem_68000" and try again !/ DEFB #0D,#00 ExitFail CALL ReturnBlock SCF RET NoRhume POP AF OR A JR NZ NoRhume POP HL POP AF POP AF POP AF SCF RET PrintC PUSH AF CALL PrintStrPC DEFM /** C/ DEFB #00 POP AF RET PrintNC PUSH AF CALL PrintStrPC DEFM /** NC/ DEFB #00 POP AF RET PrintFN LD A,(DE) OR A RET Z CP #D RET Z OR %1000 0000 CALL Print INC DE JR PrintFN Cret2 CALL Cret1 Cret1 PUSH AF LD A,#D CALL Print LD A,#1B CALL Print POP AF RET gfBlock PUSH BC LD BC,cSList LD (pSList),BC LD A,(BC) LD BC,TextWind OUT (C),A POP BC LD DE,TextWind RET gnBlock PUSH BC LD BC,(pSList) LD A,(BC) OR A JR Z gnBf INC BC LD A,(BC) OR A JR Z gnBf LD (pSList),BC LD BC,TextWind OUT (C),A POP BC LD DE,TextWind LD A,(DE) OR A JR NZ gnBlock RET gnBf POP BC SCF RET DeclLabel LD C,A LD A,(bNewSym) LD (pLabBlock),A CALL SetwSymC LD HL,(pNewSym) INC L ; EndFlag ; INC L ; SymVal ; INC L ; Block INC L ; NextPtr INC L ; " ; INC L ; Length ; INC L ; Hash 2 LD (pLabText),HL LD (pLabel),HL LD A,C CALL ReadLabel LD (pLabVal),HL LD A,(PassNo) OR A JP NZ DeclLabP2 PUSH DE CALL FindLabel JR C DLexists ; Label does not exist LD HL,(HashPtr) PUSH HL LD A,(HL) INC HL LD E,(HL) INC HL LD D,(HL) LD HL,(pLabText) LD C,IXH DEC L LD (HL),C DEC L LD (HL),B DEC L LD (HL),D DEC L LD (HL),E DEC L LD (HL),A LD DE,wSymB-wSymC ADD HL,DE EX DE,HL POP HL LD A,(bNewSym) LD (HL),A INC HL LD (HL),E INC HL LD (HL),D LD HL,(pNewSym) LD (HL),#FF INC L LD A,(SymO) LD (HL),A LD DE,-33 ADD HL,DE LD (pNewSym),HL LD A,H CP wSymC/256 JP C SymNewBlock LD (HL),0 DLexists POP DE RET DeclLabP2 LD A,(bOldSym) LD (pLabBlock),A CALL SetwSymC LD HL,(pOldSym) INC L INC L INC L INC L INC L LD B,(HL) INC L INC L LD (pLabText),HL LD A,L ADD A,B LD L,A LD (pLabVal),HL PUSH DE LD HL,(pOldSym) LD DE,-32 ADD HL,DE LD (pOldSym),HL LD A,H CP wSymC/256 JR C SymOldBlock POP DE RET SymOldBlock PUSH HL LD HL,(pSymbolList) INC HL LD (pSymbolList),HL LD A,(HL) LD (bOldSym),A CALL SetwSymC POP HL OR A LD HL,wSymC+#FE0 LD (pOldSym),HL POP DE RET EvalLabel LD C,A CP "^" JR Z EL1 LD A,(bNewSym) CALL SetwSymC LD HL,(pNewSym) LD (pLabel),HL PUSH IX LD A,C CALL ReadLabel PUSH DE CALL FindLabel JR NC ELa LD E,(HL) INC L LD D,(HL) INC L PUSH DE LD E,(HL) INC L LD D,(HL) EXX POP HL EXX EX DE,HL EX AF,AF' ELa POP DE POP IX CCF RET NC EXX LD HL,0 EXX LD HL,0 RET ; Import label EL1 CALL AssertGlob JP C ErrorC LD A,(bNewSym) CALL SetwSymC LD HL,(pNewSym) LD (pLabel),HL PUSH IX INC DE ; Skip "^" LD A,(DE) ; First char CALL ReadLabel PUSH DE CALL FindLabel JR NC EL1a LD E,(HL) INC L LD D,(HL) INC L PUSH DE LD E,(HL) INC L LD D,(HL) EXX POP HL EXX EX DE,HL EX AF,AF' EL1a PUSH AF PUSH BC PUSH HL CALL AssertLoc POP HL POP BC POP AF POP DE POP IX CCF RET NC EXX LD HL,0 EXX LD HL,0 RET SymNewBlock PUSH HL LD HL,(pSymbolList) INC HL LD B,4 CALL fsGetBlock LD (HL),A LD (pSymbolList),HL INC HL LD (HL),0 LD (bNewSym),A CALL SetwSymC POP HL OR A LD HL,wSymC+#FE0 LD (pNewSym),HL LD (HL),0 POP DE RET ReadLabel INC DE ; step ptr LD B,1 ; init count LD IXL,A ; init hash 1 LD IXH,A ; init hash 2 RLa LD (HL),A INC HL LD A,(DE) ; read next char CALL Ident ; valid ? RET C ; no, done RLb INC B ; Inc count LD C,A ; Hash value 1 ADD A,IXL ; LD IXL,A ; LD A,C ; Hash value 2 XOR IXH ; LD IXH,A ; LD A,(DE) ; Next char INC DE ; JP RLa ; loop FindLabel LD D,0 ; LD E,IXL ; hash 1 LD HL,HashTable ; get hash list ADD HL,DE ; ADD HL,DE ; ADD HL,DE ; LD (HashPtr),HL ; LD C,(HL) ; block INC HL LD E,(HL) ; addr INC HL ; LD D,(HL) ; FLlp LD A,C ; list end , not found OR A ; RET Z ; CALL SetwSymB ; open window EX DE,HL ; swap ptrs LD C,(HL) ; read pNext entry INC HL ; LD E,(HL) ; INC HL ; LD D,(HL) ; INC HL ; LD A,(HL) ; Compare lengths CP B ; JR NZ FLlp ; INC HL ; Compare hash 2 LD A,(HL) ; CP IXH ; JR NZ FLlp ; INC HL ; point at first char LD A,(HL) ; Check defined flag ADD A,#80 ; into CF' LD A,B ; Save length EX AF,AF' ; PUSH DE ; save pNext LD DE,(pLabel) ; pCompare string FLa LD A,(DE) ; compare ascii strings XOR (HL) ; AND #7F ; JR NZ FLb ; ; INC HL ; INC DE ; ; DJNZ FLa ; FLb EX AF,AF' ; replace length LD B,A ; EX AF,AF' ; POP DE ; JR NZ FLlp ; Loop SCF ; Found , assert CF RET ; InitSymbols LD B,4 ; Ram Disc CALL fsGetBlock RET C CALL SetwSymA CALL SetwSymC LD (LocalHashs),A LD (bNewSym),A LD HL,SymbolList LD (HL),A INC HL LD (HL),0 DEC HL LD (pSymbolList),HL LD HL,HashTable LD DE,HashTable+1 LD BC,#2FF LD (HL),0 LDIR LD HL,SymbolStart LD (pNewSym),HL LD (HL),0 AssertLoc LD A,(LocalHashs) AssSyms CALL SetwSymA OR A RET AssertGlob LD A,(GlobalHashs) OR A SCF RET Z CALL SetwSymA OR A RET KillSymbols LD A,(LocalHashs) CALL SetwSymA LD HL,SymbolList LD B,-1 KSlp LD A,(HL) INC HL INC B OR A JR NZ KSlp DEC HL DEC HL LD C,4 ; Ram disc KSlp2 LD A,(HL) DEC HL PUSH HL PUSH BC CALL fsPutBlock POP BC POP HL DJNZ KSlp2 RET SetwSymA PUSH BC LD BC,wSymA OUT (C),A POP BC RET SetwSymB PUSH BC LD BC,wSymB OUT (C),A POP BC RET SetwSymC PUSH BC LD BC,wSymC OUT (C),A POP BC RET GetwSymA PUSH BC LD BC,wSymA IN A,(C) POP BC RET GetwSymB PUSH BC LD BC,wSymB IN A,(C) POP BC RET GetwSymC PUSH BC LD BC,wSymC IN A,(C) POP BC RET CopypGlobs CALL AssertGlob RET C LD HL,(pNewSym) LD (gpOldSym),HL LD HL,(pSymbolList) LD (gpSymList),HL LD A,(bNewSym) LD (gbOldSym),A JP AssertLoc ; Init pPC, pDisp and pDumpAddr Setup_PC_etc LD HL,(pObject) LD (pPC),HL LD HL,(pObject+2) LD (pPC+2),HL LD HL,(pDisplace) ; Init offset LD (pDisp),HL LD HL,(pDisplace+2); Init offset LD (pDisp+2),HL JP Setup_Dump_Addr ASSEM LD (Stack),SP CALL Setup_PC_etc LD A,(ListO) DEC A JP M ASS1 CALL PrintStrPC DEFM /Assembling :- / DEFB #00 LD DE,cFileName CALL PrintFN CALL PrintCret ASS1 XOR A LD (PassNo),A LD (ErrorFlag),A LD (ListPass),A LD HL,0 LD (P7),HL LD (P1),HL CALL CopypGlobs A0 LD HL,0 LD (Refs),HL LD HL,USEends LD (pUSEends),HL CALL Setup_PC_etc LD BC,AsmCode EXX CALL gfBlock A1 LD A,(DE) OR A CALL NZ gnBlock JP C PassCtrl LD (pCurrLine),DE INC DE INC DE INC DE LD (Line),DE LD BC,(P1) INC BC LD (P1),BC A2 XOR A LD (USEflag),A LD HL,(pPC) LD (Temp),HL LD HL,0 LD (dPC),HL LD (dPC+2),HL LD (P4),DE CALL SkipSpc OR A JR Z AA CP ";" JR Z AA1 CALL AssembleLine PUSH AF ; Skip this instruction LD HL,(pPC) LD BC,(dPC) ADD HL,BC LD (pPC),HL LD HL,(pPC+2) LD BC,(dPC+2) ADC HL,BC LD (pPC+2),HL POP AF JP C Error0 AA CALL SkipSpc ; On Del ? OR A JR Z AA2 CP ";" JP Z,AA1 CP ":" JP Z AA2 JP Error0 AA1 INC DE LD A,(DE) OR A JR NZ,AA1 AA2 LD A,(ListPass) ; dw AssemList OR A JP Z AAfl LD A,(ListO) DEC A JP M AAfl PUSH DE ; Listing LD HL,(Temp) CALL WriteHex16 ; WriteAddr CALL PrintSp EXX LD HL,AsmCode ; Code Buffer LD A,C ; BC = pEnd of buffer , paged SUB L LD D,0 CP 4 JR C,AAj SUB 4 LD D,A LD A,(USEflag) OR A LD A,4 JR Z AAj XOR A LD D,A AAj LD B,A ; D= Remainder B=Loop LD C,#0F ; FieldLength OR A ; JR Z,AAb ; AAa LD A,(HL) INC HL PUSH BC CALL WriteHex8 POP BC DEC C DEC C CALL PrintSp DEC C DJNZ AAa AAb EX (SP),HL ; At this point bytes printed PUSH DE ; Get ptr to end of text LD B,C LD A,#20 AAc CALL Print ; do Tab DJNZ AAc LD DE,(P4) ; ptr to Start of inst text OR A SBC HL,DE ; get text length JR NZ,AA3 CALL PrintCret CALL PrintL1 ; do nLines , test esc etc. JR AA4 AA3 LD B,H ; move inst text into buffer LD C,L EX DE,HL LD DE,Buffer LDIR XOR A LD (DE),A ; add termin LD HL,Buffer CALL PrintL0 ; print line & print1 AA4 LD BC,AsmCode ; dump remaining bytes EXX JP C,Error4 ; esc pressed POP AF ; A := Remainder POP HL ; Buffer ptr AAg LD C,0 CP 4 JR C,AAk SUB 4 LD C,A LD A,4 AAk OR A JR Z,AAf LD B,A CALL PrintStrPC DEFM / / ; tab into byte field NOP AAh LD A,(HL) INC HL PUSH BC CALL WriteHex8 POP BC CALL PrintSp DJNZ AAh CALL PrintCret LD A,C JR AAg ; AAfl EXX LD BC,AsmCode EXX AAf LD A,(DE) INC DE OR A JP Z,A1 ; Newline JP A2 ; New statement ; PassCtrl LD A,(ErrorFlag) OR A SCF RET NZ LD A,(PassNo) LD B,A EXX LD DE,0 LD (P1),DE LD DE,(Refs) LD A,E OR D JR Z PC_NRefs CALL PrintStrPC DEFB "Pass :",0 LD A,(PassNo) LD L,A LD H,0 INC HL CALL Write CALL PrintStrPC DEFB " Unresolved references :",0 LD HL,(Refs) CALL Write CALL PrintStrPC DEFB #0D,0 PC_NRefs LD DE,(Refs) LD A,(PassNo) LD B,A OR A JR Z,NextPass LD A,D OR E JR NZ PassN LD A,(ListPass) OR A JR NZ PassE1 LD A,(ListO) DEC A JP M PassE1 LD A,1 LD (ListPass),A JR NextPass PassE1 LD A,(SymO) DEC A SCF CCF RET M CALL ListSymbols OR A RET PassN LD HL,(UnResRef) OR A SBC HL,DE JR NZ NextPass ; Some unresolved labels CALL PrintStrPC DEFB #0D,"ERROR - There are still unresolved " DEFB "(recursively defined) labels.",#0D,0 OR A RET NextPass LD (UnResRef),DE EXX LD A,B INC A LD (PassNo),A LD HL,(iListO) LD (ListO),HL LD HL,(iObjeO) LD (ObjeO),HL CALL AssertLoc LD HL,SymbolStart LD (pOldSym),HL LD HL,SymbolList LD (pSymbolList),HL LD A,(LocalHashs) LD (bOldSym),A CALL AssertGlob JP C A0 LD HL,(gpOldSym) LD (pOldSym),HL LD HL,(gpSymList) LD (pSymbolList),HL LD A,(gbOldSym) LD (bOldSym),A CALL AssertLoc JP A0 ListFN CALL PrintStrPC DEFB #D,#1B DEFM /Symbol Table for / DEFB 0 LD DE,cFileName JP PrintFN sLocal CALL PrintStrPC DEFM / local labels/ DEFB 0 RET sGlobal CALL PrintStrPC DEFM / global labels/ DEFB 0 RET ListSymbols CALL ListFN CALL sLocal CALL Cret2 CALL AssertLoc PUSH IX LD HL,SymbolStart LD IX,SymbolList CALL ListSlp POP IX CALL AssertGlob RET C CALL Cret2 CALL ListFN CALL sGlobal CALL Cret2 PUSH IX LD IX,(gpSymList) LD HL,(gpOldSym) CALL ListSlp POP IX RET ListSlp LD A,(IX) OR A RET Z CALL SetwSymC ListSlp1 LD A,(HL) INC A RET NZ INC L LD A,(HL) DEC L DEC A JP M ListNot CALL List1S PUSH HL CALL PrintL1 POP HL RET C ListNot LD DE,-32 ADD HL,DE LD A,H CP wSymC/256 JR NC ListSlp1 INC IX LD HL,wSymC + #FE0 JR ListSlp LSx POP IX CALL Cret2 RET List1S PUSH HL INC L INC L INC L INC L INC L LD B,(HL) INC L INC L LD C,B List1Sa LD A,(HL) AND #7F CALL Print INC L DJNZ List1Sa LD A,26 SUB C LD B,A LD A,"." List1Sb CALL Print DJNZ List1Sb LD A,"$" CALL Print PUSH HL INC L INC L LD A,(HL) INC L LD H,(HL) LD L,A CALL WriteHex16 POP HL LD A,(HL) INC L LD H,(HL) LD L,A CALL WriteHex16 CALL Cret1 POP HL RET PrintL LD A,Esc CALL Print LD HL,(P1) CALL Write LD HL,(Line) PrintL0 LD C,0 CALL Expand LD A,Ccr CALL Print PrintL1 CALL TestKey JR NZ,PrintL2 CALL ReadKey CP Esc LD (Flag2),A SCF RET Z CALL ReadKey CP Esc LD (Flag2),A SCF RET Z PrintL2 LD HL,(P7) LD A,H OR L RET Z DEC HL LD A,H OR L LD (P7),HL RET NZ CALL ReadKey CP Esc LD (Flag2),A SCF LD HL,(P3) LD (P7),HL RET Z CALL ReadKey CP Esc LD (Flag2),A SCF LD HL,(P3) LD (P7),HL RET Z OR A RET Expand1 INC HL Expand LD A,(HL) CP Tab JR Z,Expand6 CP #80 JR NC,Expand3 OR A RET Z Expand2 CALL Expand8 JR Expand1 Expand3 CP #EE JR NC,Expand1 ;2 PUSH HL ADD A,A ADD A,Tfil&#FF LD L,A ADC A,Tfil/256 SUB L LD H,A LD A,(HL) INC HL LD H,(HL) LD L,A JR Expand5 Expand4 CALL Expand8 INC HL Expand5 LD A,(HL) CP #20 JR NC,Expand4 POP HL JR Expand1 Expand6 INC HL LD B,(HL) LD A,#20 Expand7 CALL Expand8 DJNZ Expand7 JR Expand1 Expand8 BIT 0,C JP Z,Print BIT 1,C JP NZ,DumpByte LD (DE),A INC DE RET AssembleLine CALL SkipSpc XOR A LD (pLabBlock),A CALL FindStrMnem JP NC ALine1 LD A,(DE) CP "^" ; Exporting a a label ? JR Z AssLine_Exp ; CALL DeclLabel JP C Error6 AssLine_Exp_Ret CALL SkipSpc CALL FindStrMnem RET C LD A,(pLabBlock) ; Define the label CALL SetwSymC ; ; LD IY,(pLabVal) ; ; LD HL,(pPC) ; LD (IY),HL ; ; LD HL,(pPC+2) ; LD (IY+2),HL ; ; ; LD HL,(pLabText) ; SET 7,(HL) ; ALine1 CALL SkipSpc LD HL,(IX+datapFormat) CALL CallHL JP C Error0 RET AssLine_Exp INC DE CALL AssertGlob JP C ErrorC LD A,(DE) CALL DeclLabel JP C ErrorC CALL AssertLoc JP AssLine_Exp_Ret dwORG CALL Evaluate RET C LD HL,(Acc) LD (pPC),HL LD HL,(Acc+2) LD (pPC+2),HL CALL SkipSpc ; "," ? CP "," ; JR NZ dwORG1 ; No, skip target CALL Skip1Spc ; Skip "," CALL Evaluate ; Get target addr RET C LD HL,(Acc) ; Calc Disp LD BC,(pPC) OR A SBC HL,BC LD (pDisp),HL LD HL,(Acc+2) LD BC,(pPC+2) SBC HL,BC LD (pDisp+2),HL ; Done dwORG1 CALL Setup_Dump_Addr LD A,(pLabBlock) OR A RET Z JR ReDefineLabel dwEQU CALL Evaluate JR Z UndefineLabel LD A,(pLabBlock) OR A SCF RET Z ReDefineLabel CALL SetwSymC LD IY,(pLabVal) LD HL,(Acc) LD (IY),HL LD HL,(Acc+2) LD (IY+2),HL LD HL,(pLabText) SET 7,(HL) OR A RET UndefineLabel LD A,(pLabBlock) OR A SCF RET Z CALL SetwSymC LD IY,(pLabVal) LD HL,0 LD (IY),HL LD (IY+2),HL LD HL,(pLabText) RES 7,(HL) OR A RET dwDEFB CALL Evaluate RET C LD A,(Acc+2) OR A JR Z dwB_1 CP #FF SCF RET NZ dwB_1 LD HL,(Acc+1) CP L SCF RET NZ CP H SCF RET NZ LD A,(Acc) CALL DumpByte CALL FindComma CCF RET NC JR dwDEFB dwDEFW CALL Evaluate RET C Dump_Acc_Word LD HL,(Acc+2) LD A,L OR A JR Z dwW_1 CP #FF SCF RET NZ dwW_1 CP H SCF RET NZ LD HL,(Acc) CALL DumpWord CALL FindComma CCF RET NC JR dwDEFW dwDEFL CALL Evaluate RET C LD HL,(Acc+2) CALL DumpWord LD HL,(Acc) CALL DumpWord CALL FindComma CCF RET NC JR dwDEFL dwDEFO SCF RET dwDEFM CALL SkipSpc OR A RET Z LD HL,String INC DE CALL Rdstg JR NC,TP1 DEC DE TP1 LD C,3 LD HL,String CALL Expand JR dwDEFM ; Include another source file . . dwUSE LD HL,String INC DE CALL Rdstg JR NC DWuse1 DEC DE DWuse1 LD A,(PassNo) OR A JR NZ USEP2 ; Pass one LD C,1 LD HL,String PUSH DE ; Stack text ptr ; Expand and terminate filename LD DE,String2 CALL Expand XOR A LD (DE),A CALL SaveWinds ; Save the windows LD HL,USEret ; Stack ptr PUSH HL ; LD HL,(ObjeO) ; Stack options PUSH HL ; LD HL,(ListO) ; PUSH HL ; LD A,(LocalHashs) ; Stack local symbol ptrs PUSH AF ; LD HL,(pDisp+2); Stack Disp PUSH HL ; LD HL,(pDisp) ; PUSH HL ; LD HL,(pPC+2) ; Stack PC PUSH HL ; LD HL,(pPC) ; PUSH HL ; LD HL,String2 ; Stack string LD B,0 DWUa LD A,(HL) INC HL INC B OR A JR NZ DWUa DEC HL DWUb LD A,(HL) DEC HL PUSH AF DJNZ DWUb LD A,1 ; Assert flag LD (USEflag),A ; JP Start ; Recurse ; USE on pass 2 USEP2 LD HL,(pUSEends) ; Point at data area LD C,(HL) ; Low PC INC HL LD B,(HL) INC HL LD (pPC),BC LD C,(HL) ; High PC INC HL LD B,(HL) INC HL LD (pPC+2),BC LD BC,0 LD (dPC),BC LD (dPC+2),BC LD C,(HL) ; Low Disp INC HL LD B,(HL) INC HL LD (pDisp),BC LD C,(HL) ; High Disp INC HL LD B,(HL) INC HL LD (pDisp+2),BC LD A,(HL) ; Get old symbol block LD (bOldSym),A ; INC HL ; LD C,(HL) ; Get pSymbol list INC HL ; LD B,(HL) ; INC HL ; LD (pSymbolList),BC ; LD C,(HL) ; Get pOldSym INC HL ; LD B,(HL) ; INC HL ; LD (pOldSym),BC ; LD (pUSEends),HL ; Save new ptr CALL Setup_Dump_Addr ; ; Setup dump addr Setup_Dump_Addr LD HL,(pPC) LD BC,(pDisp) ADD HL,BC LD (pDumpAddr),HL RET ; Exit from a USE USEret PUSH AF ; Save ACC EXX ; Save disp PUSH HL ; PUSH DE ; EXX ; PUSH HL ; Save pPC PUSH DE ; CALL LoadWinds ; Restore the windows LD HL,(pUSEends) ; Store the exit conditions POP DE ; Low 16 bits of pPC LD (pPC),DE ; Store it LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; POP DE ; High LD (pPC+2),DE ; LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; POP DE ; Low 16 bits of pDisp LD (pDisp),DE ; Store LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; POP DE ; High LD (pDisp+2),DE ; LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; LD A,(bNewSym) ; Store symbol block LD (HL),A ; INC HL ; LD DE,(pSymbolList) ; ptr LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; LD DE,(pNewSym) ; New symbols LD (HL),E ; INC HL ; LD (HL),D ; INC HL ; LD (pUSEends),HL ; Done CALL Setup_Dump_Addr ; Done LD A,(ListO) ; Check list options DEC A ; JP M USEexit ; CALL PrintStrPC ; DEFB #1B ; DEFM /Back in :- / ; DEFB #0 ; LD DE,cFileName ; CALL PrintFN ; CALL Cret2 ; USEexit XOR A ; Reset pass no back to 0 ; CALL PrintPass ; POP AF ; Restore POP DE ; Restore JP C ErrorA ; Error ? RET ; Stack now back ?? LoadWinds LD BC,TextWind ; Setup the windows LD A,(bUSE0) ; OUT (C),A ; LD BC,wSymA ; LD A,(bUSE1) ; OUT (C),A ; LD BC,wSymB ; LD A,(bUSE2) ; OUT (C),A ; LD BC,wSymC ; LD A,(bUSE3) ; OUT (C),A ; RET ; SaveWinds LD BC,TextWind ; Store the windows IN A,(C) ; LD (bUSE0),A ; LD BC,wSymA ; IN A,(C) ; LD (bUSE1),A ; LD BC,wSymB ; IN A,(C) ; LD (bUSE2),A ; LD BC,wSymC ; IN A,(C) ; LD (bUSE3),A ; RET ; dwDEFS CALL Evaluate RET C PUSH DE LD HL,(pDumpAddr) LD DE,(Acc) ADD HL,DE LD (pDumpAddr),HL LD DE,(Acc) LD HL,(pPC) ADD HL,DE LD (pPC),HL LD DE,(Acc+2) LD HL,(pPC+2) ADC HL,DE LD (pPC+2),HL POP DE RET ; Code generates now dwFixed LD HL,(IX+dataTemplate) CALL DumpWord OR A RET dw_Wnnnn CALL dwFixed ; Dump instruction CALL Get_Immediate RET C JP Dump_Acc_Word dwTRAP CALL Get_Immediate RET C LD HL,(Acc+2) LD A,(Acc+1) OR L OR H JP NZ ErrorD LD HL,#4E40 ; TRAP {0} LD A,(Acc) CP #10 JP NC ErrorD OR L LD L,A JP DumpWord dwDBR_e_E JP ErrorE dwDBR CALL SkipSpc ; Get register Dn CALL TestReg ; JR C dwDBR_e_E ; Not a resister CP 8 ; D0..D7 JR NC dwDBR_e_E ; no LD H,(IX+dataTemplate+1) OR (IX+dataTemplate) LD L,A CALL DumpWord ; Dump instruction CALL GetComma ; Skip comma LD A,(PassNo) ; Just dump a dummy OR A ; word on pass 0 JR Z dwBRANCH_P0 ; CALL Get_DBRA_Disp ; Get and check disp JP NC DumpWord ; JP ErrorD ; Out of range dwBRANCH LD A,(DE) ; Default to 16-bit CP "." ; JR NZ dw_BR_W ; INC DE ; Get next char LD A,(DE) ; INC DE ; OR %00 1 00000 ; Case convert CP "w" ; Word ? JR Z dw_BR_W ; yes CP "s" ; Short ? JP NZ Error0 ; No, error LD A,(PassNo) ; Just dump a dummy OR A ; word on pass 0 JR Z dwBRANCH_P0 ; CALL Get_Displacement ; HL := disp JP C ErrorD ; Too large LD A,H ; in range ? OR A ; JR Z dw_BR_Sa ; CP #FF ; JP NZ ErrorD ; No dw_BR_Sa XOR L ; Check sign bit AND %1 0000000 ; JP NZ ErrorD ; Out of range LD A,L ; Disp OR A ; Can't have 0 LD H,(IX+dataTemplate+1) ; Command JP NZ DumpWord ; OK if not 0 Dump it JP ErrorD ; 0 = error dwBRANCH_P0 CALL Get_Displacement ; Step past expression OR A ; JP DumpWord ; dw_BR_W CALL dwFixed ; Dump command LD A,(PassNo) ; Just dump a dummy OR A ; word on pass 0 JR Z dwBRANCH_P0 ; CALL Get_Displacement JP NC DumpWord JP ErrorD ; Fails Get_DBRA_Disp CALL Get_Offset; Calc -$ LD HL,(Acc) ; Now sub 2 (?) LD BC,-2 ; ADD HL,BC ; LD (Acc),HL ; LD HL,(Acc+2) ; LD BC,-1 ; ADC HL,BC ; LD (Acc+2),HL ; JP GD_Test ; Range check dw_Dn CALL SkipTestReg ; Reg ? JR C dw_Dn_e_E ; No CP 8 ; Data Reg ? JR NC dw_Dn_e_E ; No dw_OR_Acc LD H,(IX+dataTemplate+1) OR (IX+dataTemplate) LD L,A JP DumpWord ; Dump it dw_An CALL SkipTestReg ; Reg ? JR C dw_Dn_e_E ; No SUB 8 ; Addr Reg ? JR NC dw_OR_Acc; Dump value dw_Dn_e_E JP ErrorE ; EA Mode error dw_An_nnnn CALL dw_An ; Get rid of Reg LD A,(PassNo) ; Just dump a dummy OR A ; word on pass 0 JP Z DumpWord ; CALL GetComma ; Error if no comma CALL Get_Immediate ; Get value RET C ; LD HL,(Acc+2) ; Does it fit in 16 bits ? CALL GD_Test ; JP NC DumpWord ; Yes. dw_nn_e_D JP ErrorD ; No, fail dw_nn_Dn CALL Get_Immediate ; RET C ; Fail CALL Test_Sign_8 ; Valid 8 bit signed ? JR C dw_nn_e_D ; No LD L,A ; Save value CALL GetComma ; CALL TestReg ; JR C dwEXT_e_E ; Fail CP 8 ; D0..D7 JR NC dwEXT_e_E; RLCA ; 0111RRR0 nnnnnnnn OR (IX+dataTemplate+1) LD H,A JP DumpWord dwEXT_e_E JP ErrorE ; dwEXT LD A,(DE) ; Default to 16-bit CP "." ; JR NZ dwEXT_W ; INC DE ; Get next char LD A,(DE) ; INC DE ; OR %00 1 00000 ; Case convert CP "w" ; Word ? JR Z dwEXT_W ; yes CP "l" ; Short ? JP NZ Error0 ; No, error CALL SkipTestReg ; Get Reg RET C ; Fail CP 8 ; Data reg ? JR NC dwEXT_e_E ; SET 6,A ; Make L JP dw_OR_Acc ; Dump it dwEXT_W CALL SkipTestReg ; Get Reg JP C Error0 CP 8 ; Data reg ? JP C dw_OR_Acc ; Dump It dwEXG_e_E JP ErrorE ; Fail dwEXG CALL SkipTestReg ; Get Reg JR C dwEXG_e_E ; LD L,A ; Save reg CALL GetComma ; Skip comma CALL TestReg ; Get reg JR C dwEXG_e_E ; LD H,A ; Save reg XOR L ; Compare reg type bits BIT 3,A ; Same ? JR Z dwEXG_Same ; Yes BIT 3,L ; This must be addr JR NZ dwEXG_1 ; Ok LD A,L ; Swap registers over LD L,H ; LD H,A ; dwEXG_1 SET 7,L ; %1000 1 RRR LD A,H ; %0000 0 RRR RLCA ; %000 0 RRR 0 OR %1100 000 1 ; %1100 RRR 1 LD H,A ; HL := word JP DumpWord ; Dump it dwEXG_Same SET 6,L ; %0100 X RRR LD A,H RLCA AND %0000 111 0 ; %0000 RRR 0 OR %1100 000 1 ; %1100 RRR 1 LD H,A ; HL := word JP DumpWord ; dw_BCD LD A,(DE) ; CP "." ; JR NZ dw_BCD_1 ; No extention INC DE ; Get ext char LD A,(DE) ; INC DE ; OR %00 1 00000 ; "B" CP "b" ; JP NZ Error0 ; dw_BCD_1 CALL SkipTestReg ; Dn ? JR C dw_BCD_2 ; No CP 8 ; Dn ? JR NC dw_BCD_e_E ; LD L,A ; Source reg CALL GetComma ; CALL TestReg ; Dn ? RET C ; CP 8 ; JR NC dw_BCD_e_E ; RLCA ; OR (IX+dataTemplate+1) LD H,A ; JP DumpWord dw_BCD_e_E JP ErrorE dw_BCD_2 CALL Get_Min ; Read -[An] JR C dw_BCD_e_E ; Fail LD L,A ; Add reg (source) CALL GetComma CALL Get_Min ; Read -[An] JR C dw_BCD_e_E ; AND %00000 111 ; RRR RLCA ; OR (IX+dataTemplate+1) LD H,A ; JP DumpWord dwCMPM LD A,(DE) ; .B,.W,.L LD HL,(IX+dataTemplate) ; .W CP "." ; JR NZ dwCMPM_W ; .W INC DE ; Get ext char LD A,(DE) ; INC DE ; OR %00 1 00000 ; CP "b" ; JR Z dwCMPM_B ; Byte CP "w" ; JR Z dwCMPM_W ; Word CP "l" ; JP NZ Error0 ; Error SET 7,L ; Assert L RES 6,L ; JR dwCMPM_W ; Ok dwCMPM_B RES 6,L ; Assert B dwCMPM_W CALL Get_Plus ; [An]+ ? JR C dwCMPM_e_E ; No OR L ; Save source LD L,A ; CALL GetComma ; CALL Get_Plus ; [An]+ ? JR C dwCMPM_e_E ; RLCA ; AND %0000 111 0 ; OR H ; LD H,A ; JP DumpWord ; Dump it dwCMPM_e_E JP ErrorE dwMOVEP LD A,(DE) ; .W,.L LD HL,(IX+dataTemplate) ; .W CP "." ; JR NZ dwMOVEP_W ; .W INC DE ; Get ext char LD A,(DE) ; INC DE ; OR %00 1 00000 ; CP "w" ; JR Z dwMOVEP_W ; Word CP "l" ; JP NZ Error0 ; Error SET 6,L ; Assert long dwMOVEP_W CALL SkipTestReg ; Dn ? JR C dwMOVEP_1 ; No CP 8 ; Dn ? JR NC dwCMPM_e_E ; RLCA ; Save Data reg OR H ; LD H,A ; CALL GetComma PUSH HL ; Save inst CALL Get_nnnn ; Get An, disp POP HL ; Restore JP C dwCMPM_e_E ; Fail AND %00000 111 ; Save addr reg OR L ; LD L,A ; dwMOVEP_X CALL DumpWord ; LD HL,(disp) ; Dump disp JP DumpWord ; dwMOVEP_1 RES 7,L ; Assert dirn PUSH HL ; Save inst CALL Get_nnnn ; Get An, disp POP HL ; Restore JR C dw_B_e_E ; AND %00000 111 ; Save addr reg OR L ; LD L,A ; CALL GetComma CALL TestReg ; Dn JR C dw_B_e_E ; CP 8 ; Dn ? JR NC dw_B_e_E ; RLCA ; Save Data reg OR H ; LD H,A ; JR dwMOVEP_X dw_B_e_E JP ErrorE dwB_EA1 LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ dw_EA1 ; No ext. INC DE ; LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "b" ; "B" ? JR Z dw_EA1 ; Yes, ok JP ErrorF ; Invalid size dwS_EA1 LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ dw_EA1 ; No ext. INC DE ; LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; "W" ? JR Z dw_EA1 ; Ok CP "b" ; "B" ? JR Z dw_S_EA1_B ; CP "l" ; "L" JP NZ ErrorF ; SET 7,L dw_S_EA1_B RES 6,L dw_EA1 PUSH HL ; Save instr CALL Get_EA ; Do EA1, A := EA POP HL ; RET C ; Fail CP %00 111 010 ; Don't do any above this JR NC dwBIT_e_E ; LD C,A ; Save AND %00 111 000 ; An not allowed CP %00 001 000 ; JR Z dwBIT_e_E ; LD A,C ; OR L ; Put in word LD L,A ; Dump_Instr_Etc CALL DumpWord ; Store instr LD HL,(disp) ; Extra word ? LD A,C ; CP %00 101 000 ; above this have displacements CALL NC DumpWord ; CP %00 111 001 ; This has extra word LD HL,(disp+2) ; CALL Z DumpWord ; OR A ; Exit RET ; dwBIT_e_E JP ErrorE dwBIT LD L,(IX+dataTemplate) CALL SkipSpc ; CP "#" ; JR Z dwBIT_Imm ; CALL TestReg ; RET C ; CP 8 ;Data reg JR NC dwBIT_e_E ; SCF ; RLA ; 0000 RRR 1 LD H,A ; CALL GetComma ; Skip comma PUSH HL ; Save instr CALL Get_EA ; Get an Effective address POP HL ; RET C ; Failure LD C,A ; Save Mode OR L ; Store EA LD L,A ; AND %00 111 000 ; Check not An CP %00 001 000 ; JR Z dwBIT_e_E ; LD A,C ; CP %00 111 010 ; Not greater JR NC dwBIT_BTST1; JR Dump_Instr_Etc; Save instr + disps dwBIT_BTST1 BIT 0,(IX+dataFlags) ; BTST can do more JR Z dwBIT_e_E ; Not BTST CP %00 111 100 ; Immediate JR C Dump_Instr_Etc ; Not imm JR NZ dwBIT_e_E ; Too large CALL DumpWord ; Save Intsr LD HL,(Acc+2) ; Test length LD A,L ; Must be 0 OR H ; JP NZ ErrorD ; LD HL,(Acc) ; Save Imm INC H ; Must be 0 DEC H ; JP NZ ErrorD ; CALL DumpWord OR A ; RET ; dwBIT_Imm LD H,%00001000 ; Assert instr INC DE ; Avoid "#" PUSH HL CALL Evaluate ; Get no. JP C Error0 ; CALL Test_Sign_8 ; Get it into A JP C ErrorD ; CP 32 ; test long JP NC ErrorD ; LD B,A ; Save it PUSH BC ; CALL GetComma ; Skip comma CALL Get_EA ; Get an Effective address POP BC ; POP HL ; JP C Error0 ; Failure LD C,A ; Save Mode OR L ; Store EA LD L,A ; AND %00 111 111 ; Get mode CP %00 111 010 ; Not greater JR NC dwBIT_BTST2; AND %00 111 000 ; Check not An CP %00 001 000 ; JP Z ErrorE ; OR A ; Data reg ? LD A,B ; Length JR Z dwBIT_Imm_D ; Jump if data reg dwBIT_Mem CP 8 ; No, test for memory JP NC ErrorD ; dwBIT_Imm_D CALL DumpWord ; Store instr LD H,0 ; Save bit no. LD L,A ; JP Dump_Instr_Etc; Save bit no + disps dwBIT_BTST2 BIT 0,(IX+dataFlags) ; BTST can do more JP Z ErrorE ; Not BTST CP %00 111 100 ; Less than JP NC ErrorE ; Fail LD A,B ; Test length JR dwBIT_Mem ; Can't be a reg dwEA2_Dn CALL Get_EA ; Get the source JP C Error0 ; LD C,A ; Save mode AND %00 111 000 ; No An CP %00 001 000 ; JP Z ErrorE ; LD A,C ; OR (IX+dataTemplate) LD L,A ; CALL GetComma ; "," CALL TestReg ; Det dest. JP C Error0 ; CP 8 ; Dn JP NC ErrorE ; RLCA ; RRR 0 OR (IX+dataTemplate+1) LD H,A ; LD A,C ; Immediate ? CP %00 111 100 ; JP NZ Dump_Instr_Etc; Dump it CALL DumpWord ; Save instr BIT 0,(IX+dataFlags) ; Signed immediate ? JR NZ dwEA2_Signed ; Yes LD HL,(Acc+2) ; Test imm unsigned LD A,H ; 16 bit OR L ; JP NZ ErrorD ; LD HL,(Acc) ; Dump this dwEA2_X CALL DumpWord ; OR A ; RET ; Ret NC dwEA2_Signed CALL Test_Sign_16; Fits in 16 bit ? JP C ErrorD ; No JR dwEA2_X ; Dump it dwEA3 CALL Get_EA ; Get effective address JP C Error0 ; LD C,A ; Save mode AND %00 111 000 ; Not Dn,An,[An]+,-[An] or #n CP %00 010 000 ; [An] JR Z dwEA3_1 ; Yes JP C ErrorE ; Dn,An CP %00 100 000 ; nnnn[An] JP C ErrorE ; CP %00 111 100 ; #nnnn JP NC ErrorE ; dwEA3_1 LD A,C OR (IX+dataTemplate) LD L,A LD H,(IX+dataTemplate+1) BIT 0,(IX+dataFlags) ; LEA ? JP Z Dump_Instr_Etc; Save it and disps CALL GetComma ; Skip "," CALL TestReg ; An JP C Error0 ; SUB 8 ; JP C ErrorE ; RLCA ; OR H ; LD H,A ; Reg field JP Dump_Instr_Etc; Save it and disps dwMOVES LD HL,(IX+dataTemplate) LD A,(DE) ; Get char CP "." ; "." JR NZ dwMOVES_S ; INC DE ; Get size LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; "W" JR Z dwMOVES_S ; RES 6,L ; Assert byte CP "b" ; "B" JR Z dwMOVES_S ; Yes SET 7,L ; Assert long CP "l" ; "L" JP NZ Error0 ; dwMOVES_S PUSH HL CALL Get_EA ; Get first operand POP HL JP C Error0 ; Fail LD C,A ; Save mode CALL GetComma ; LD A,C ; AND %00 110 000 ; An or Dn ? JR Z dwMOVES_Dn ; Yes, now get EA CALL dwMOVES_Test; Valid EA ? JP C ErrorE ; LD A,C ; Create instr OR L ; LD L,A ; CALL DumpWord ; Save it CALL TestReg ; Get Destn Reg JP C Error0 ; RLCA ; A RRR 0 000 RLCA ; RLCA ; RLCA ; LD H,A ; LD L,0 ; JP Dump_Instr_Etc; Dump word and offsets etc dwMOVES_Dn LD H,C ; Save register PUSH HL ; CALL Get_EA ; POP HL ; JP C Error0 ; Fail LD C,A ; Save mode CALL dwMOVES_Test; Valid EA ? JP C ErrorE ; LD A,C ; Create instr OR L ; LD L,A ; LD A,H ; Get reg LD H,(IX+dataTemplate+1) CALL DumpWord ; Place instr SCF ; RLA ; RLCA ; RLCA ; RLCA ; A RRR 1 000 LD H,A ; LD L,0 ; JP Dump_Instr_Etc; dwMOVES_Test LD A,C ; Mode AND %00 111 000 ; CP %00 010 000 ; RET C ; Fail if Dn,An CP %00 111 001 ; CCF ; RET ; Fail if > x.L dwXOR LD HL,(IX+dataTemplate) ; Assume Dn, LD A,(DE) ; Get char CP "." ; "." JR NZ dwXOR_S ; INC DE ; Get size LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; "W" JR Z dwXOR_S ; RES 6,L ; Assert byte CP "b" ; "B" JR Z dwXOR_S ; Yes SET 7,L ; Assert long CP "l" ; "L" JP NZ Error0 ; dwXOR_S CALL SkipSpc ; Get char CP "#" ; Immediate ? JR Z dwXOR_Imm ; Yes CALL TestReg ; Dn only RET C ; Fail CP 8 ; JP NC ErrorE ; RLCA ; 0000 RRR 0 OR H ; LD H,A ; CALL GetComma ; PUSH HL ; Get valid EA CALL Get_Logic_EA; POP HL ; JP C ErrorE ; Fail OR L ; LD L,A ; Insert EA AND %00 111 000 ; Dn ? JP NZ Dump_Instr_Etc; Dump it LD A,H ; AND %1111 000 1 ; CP %1011 000 1 ; XOR JP Z Dump_Instr_Etc; LD C,H ; Save reg LD A,L ; Get reg RLCA ; XXXX RRR X XOR H ; HHHH RRR H AND %0000 111 0 ; XOR H ; AND %1111 111 0 ; HHHH RRR 0 LD H,A ; LD A,C ; Alt reg RRCA ; XXXXX RRR XOR L ; AND %00 000 111 ; XOR L ; LL LLL RRR LD L,A ; JP DumpWord ; Plant it dwXOR_Imm LD H,(IX+dataTemplate+3) LD A,(IX+dataTemplate+2) XOR L ; AND %00 111 111 ; XOR L ; LD L,A ; Insert length field INC DE ; Skip "#" PUSH HL ; Save instr CALL Evaluate ; Read imm JP C Error0 ; CALL Save_Acc ; Copy Acc to TAcc CALL GetComma ; POP HL ; Get instr CALL Test_SR_CCR ; One of these ? JR NC dwXOR_Stat ; Yes PUSH HL ; CALL Get_Logic_EA; POP HL ; JP C ErrorE ; dwXOR_Stat OR L ; LD L,A ; Insert EA CALL DumpWord ; Store it dwXOR_Save_Imm BIT 7,L ; Long ? JR Z dwXOR_SI_WB ; No LD HL,(TAcc+2) ; Save extra 16 CALL DumpWord ; dwXOR_SI_W LD HL,(TAcc) ; JP Dump_Instr_Etc; Store it, and disps etc dwXOR_SI_WB LD B,L ; Save length flag LD HL,(TAcc+2) ; Test for 0 LD A,H ; XOR L ; JP NZ ErrorD ; Overflow LD A,H ; 00 or FF INC A ; 0 or 1 AND %1111111 0 ; JP NZ ErrorD ; Overflow BIT 6,B ; Word ? JR NZ dwXOR_SI_W ; Yes LD A,H ; LD HL,(TAcc) ; XOR H ; Same ? LD H,A ; Cheap zero JP Z Dump_Instr_Etc ; OK JP ErrorD ; Fail dwAND CALL dwXOR ; Same as Xor except for ,D RET NC ; Ok PUSH HL ; Get the effective addr CALL Get_EA ; POP HL ; JP C ErrorE ; Can't LD C,A ; Save mode AND %00 111 000 ; Can't do An CP %00 001 000 ; JP Z ErrorE ; Fail LD A,C ; Replace EA field OR L ; LD L,A ; CALL GetComma ; CALL TestReg ; Dn only JP C Error0 ; CP 8 ; JP NC ErrorE ; Can't SCF ; RLA ; 0000 RRR 1 XOR H ; LD H,A ; Insert reg field JP Dump_Instr_Etc ; No, dump it dwMOVEM LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ dwMOVEM_W ; INC DE ; Get size char LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; "W" JR Z dwMOVEM_W ; SET 6,L ; Assert Long CP "l" ; JP NZ ErrorF ; dwMOVEM_W PUSH DE ; Save ptr CALL SkipTestReg ; An or Dn POP DE ; JR NC MOVEM_Write; Regs to memory SET 2,H ; Assert mem to regs PUSH HL ; CALL Get_EA ; Get EA POP HL ; JP C ErrorE ; Fail LD C,A ; Mode CP %00 010 000 ; JP C ErrorE ; Dn,An illegal CP %00 100 000 ; JR C MOVEM_1 ; OK CP %00 101 000 ; JP C ErrorE ; Fail CP %00 111 100 ; JP NC ErrorE ; MOVEM_1 OR L ; LD L,A ; Insert EA PUSH BC ; Save EA CALL DumpWord ; Dump the instruction CALL GetComma ; CALL MOVEM_GetRegs ; Get list of regs POP BC ; Restore EA JP C Error0 ; Fail MOVEM_Exit LD HL,(Reg_Mask) ; LD A,C ; Mode AND %00 111 000 ; CP %00 100 000 ; -[An] CALL Z Invert_Reg; Swap HL JP Dump_Instr_Etc; Plant rest MOVEM_Write PUSH HL CALL MOVEM_GetRegs ; Get list of regs JP C Error0 ; CALL GetComma ; CALL Get_EA ; Get EA POP HL ; JP C ErrorE ; Fail LD C,A ; Mode CP %00 010 000 ; JP C ErrorE ; Dn,An illegal CP %00 011 000 ; JR C MOVEM_2 ; OK CP %00 100 000 ; JP C ErrorE ; Fail CP %00 111 010 ; JP NC ErrorE ; MOVEM_2 OR L ; Insert EA LD L,A ; CALL DumpWord ; Plant instr JR MOVEM_Exit ; Plant rest MOVEM_GetRegs LD HL,Reg_Mask ; Clear all LD B,16 ; MGR_Lp1 LD (HL),0 ; INC HL ; DJNZ MGR_Lp1 ; MGR_Lp2 CALL SkipTestReg ; Get reg no JP C Error0 ; No LD C,A ; Save reg no CALL MGR_SetIt ; JP C Error0 ; MGR_Next CALL SkipSpc ; Get next INC DE ; Skip it CP "/" ; JR Z MGR_Lp2 ; Loop CP "-" ; Range ? JR Z MGR_Range ; DEC DE ; Step back JR MGR_X ; Exit MGR_Range CALL SkipTestReg ; JP C Error0 ; INC A MGR_R_Dec DEC A MGR_R_Lp CALL MGR_SetIt ; JP C Error0 ; CP C ; Which way ? JR Z MGR_Next ; Done JR NC MGR_R_Dec ; Step down INC A ; Step up JR MGR_R_Lp ; Loop MGR_X PUSH DE ; Save ptr LD DE,Reg_Mask+15; Read them LD B,16 ; Read them MGR_X_Lp LD A,(DE) ; Get flag DEC DE ; RRA ; Into carry ADC HL,HL ; Into HL DJNZ MGR_X_Lp ; Loop LD (Reg_Mask),HL ; Save POP DE ; OR A ; RET ; MGR_SetIt PUSH AF ; Save flag LD H,Reg_Mask/256; Calc addr ADD A,Reg_Mask & #FF ; LD L,A ; ADC A,H ; SUB L ; LD H,A ; LD (HL),1 ; Set POP AF ; OR A ; RET ; dwROT LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ ROT_S ; Word INC DE ; Get size LD A,(DE) ; OR %00 1 00000 ; INC DE ; CP "w" ; W ? JR Z ROT_S ; RES 6,L ; Assert byte CP "b" ; JR Z ROT_S ; SET 7,L ; CP "l" ; JP NZ ErrorF ; ROT_S PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C Error0 ; LD C,A ; Save mode CP %00 001 000 ; Dn ? JR C ROT_DxDy ; CP %00 010 000 ; An JP C ErrorE ; Yes, error CP %00 111 100 ; Immediate ? JR Z ROT_Imm ; Yes CP %00 111 010 ; x[PC] etc JP NC ErrorE ; Too large, error LD A,L ; Must be of size .W AND %11 000 000 ; CP %01 000 000 ; JP NZ ErrorF ; LD H,(IX+dataTemplate+3) LD A,C OR (IX+dataTemplate+2) LD L,A JP Dump_Instr_Etc; Plant it ROT_DxDy SET 5,L ; Assert reg no ROT_X RLCA ; 0000 RRR 0 OR H ; LD H,A ; Insert reg CALL GetComma ; CALL TestReg ; Get reg JP C Error0 ; CP 8 ; Dn JP NC ErrorE ; OR L ; Insert LD L,A ; JP DumpWord ; ROT_Imm PUSH HL ; CALL Test_Sign_8 ; Get into acc POP HL ; JP C ErrorD ; OR A ; <>0 JP Z ErrorD ; CP 9 ; <9 JP NC ErrorD ; AND %00000 111 ; JR ROT_X ; Get reg dwCMP LD HL,#B040 ; CMP LD A,(DE) ; CP "." ; JR NZ CMP_S ; Word INC DE ; Get size LD A,(DE) ; OR %00 1 00000 ; INC DE ; CP "w" ; W ? JR Z CMP_S ; RES 6,L ; Assert byte CP "b" ; JR Z CMP_S ; SET 7,L ; CP "l" ; JP NZ ErrorF ; CMP_S PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C Error0 ; Fail LD C,A ; CP %00 111 100 ; Imm ? JR Z CMPI ; Yes, go away AND %00 111 000 ; An ? CP %00 001 000 ; JR NZ CMP_1 ; No LD A,L ; Check not .B AND %11 000000 ; JP Z ErrorF ; CMP_1 LD A,C ; OR L ; LD L,A ; Insert EA CALL GetComma ; CALL TestReg ; Get destn JP C Error0 ; CP 8 ; An ? JR NC CMPA ; Yes, go away RLCA ; OR H ; LD H,A ; Insert reg JP Dump_Instr_Etc; Dump it CMPI CALL Save_Acc ; Copy immediate data LD H,#0C ; Modify Instr CALL GetComma ; PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C Error0 ; LD C,A ; CP %00 111 010 ; not x(PC) JP NC ErrorE ; AND %00 111 000 ; nor An CP %00 001 000 ; JP Z ErrorE ; LD A,C ; JP dwXOR_Stat ; Plant it etc CMPA SUB 8 ; Insert reg RLCA ; OR %1011 000 0 ; LD H,A ; LD A,L ; .B ? AND %11 000 000 ; JP Z ErrorF ; Yes, fail RLCA ; L flag into bit 0 AND %0000000 1 ; OR H ; LD H,A ; Size flag moved LD A,L ; OR %11 000 000 ; LD L,A ; JP Dump_Instr_Etc; Dump it dwADDQ LD HL,(IX+dataTemplate) ; LD A,(DE) ; CP "." ; JR NZ ADDQ_S ; Word INC DE ; Get size LD A,(DE) ; OR %00 1 00000 ; INC DE ; CP "w" ; W ? JR Z ADDQ_S ; RES 6,L ; Assert byte CP "b" ; JR Z ADDQ_S ; SET 7,L ; CP "l" ; JP NZ ErrorF ; ADDQ_S CALL SkipSpc ; Get char CP "#" ; Imm JP NZ Error0 ; INC DE ; PUSH HL ; Get imm CALL Evaluate ; POP HL ; JP C Error0 ; PUSH HL ; CALL Test_Sign_8 ; Fit in 8 bits ? POP HL ; JP C ErrorD ; Range CP 9 ; <=8 JP NC ErrorD ; OR A ; >0 JP Z ErrorD ; AND %00000 111 ; RLCA ; OR H ; LD H,A ; CALL GetComma ; PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C Error0 ; LD C,A ; Save mode CP %00 111 010 ; No >x[PC] JP NC ErrorE ; OR L ; LD L,A ; Insert EA AND %00 111 000 ; An ? CP %00 001 000 ; JP NZ Dump_Instr_Etc ; Do it LD A,L ; Check not .B AND %11 000 000 ; JP NZ Dump_Instr_Etc ; Do it JP ErrorF ; Invalid size dwADDX LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ ADDX_S ; No extention INC DE ; Get ext char LD A,(DE) ; INC DE ; OR %00 1 00000 ; "W" CP "w" ; JR Z ADDX_S ; RES 6,L ; Assert byte CP "b" ; "B" JR Z ADDX_S ; SET 7,L ; Assert long CP "l" ; JP NZ ErrorF ; ADDX_S CALL SkipTestReg ; Dn ? JR C ADDX_2 ; No CP 8 ; Dn ? JP NC ErrorE ; OR L ; LD L,A ; Source reg CALL GetComma ; CALL TestReg ; Dn ? JP C Error0 ; CP 8 ; JP NC ErrorE ; RLCA ; OR H ; LD H,A ; JP DumpWord ; ADDX_2 PUSH HL ; CALL Get_Min ; Read -[An] POP HL ; JP C ErrorE OR L ; Add reg {assert T} LD L,A ; CALL GetComma ; CALL Get_Min ; Read -[An] JP C ErrorE ; AND %00000 111 ; RRR RLCA ; OR H ; LD H,A ; JP DumpWord ; dwADD LD HL,(IX+dataTemplate) LD A,(DE) ; CP "." ; JR NZ ADD_S ; No extention INC DE ; Get ext char LD A,(DE) ; INC DE ; OR %00 1 00000 ; "W" CP "w" ; JR Z ADD_S ; RES 6,L ; Assert byte CP "b" ; "B" JR Z ADD_S ; SET 7,L ; Assert long CP "l" ; JP NZ ErrorF ; ADD_S PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C Error0 ; LD C,A ; Save mode CP %00 111 100 ; Immediate ? JR Z ADDI ; Yes, ADDI CP %00 001 000 ; Dn ? JP C ADD_Dn ; Yes, data as dest. JR NZ ADD_S_1 ; Continue if not n LD A,L ; Not .B AND %11 000 000 ; JP Z ErrorF ; ADD_S_1 LD A,C ; Get mode OR L ; LD L,A ; Insert EA CALL GetComma ; CALL TestReg ; An or Dn ? JP C Error0 ; CP 8 ; An JR NC ADD_EA_An ; Yes, dump alt. instr RLCA ; OR H ; LD H,A ; Insert reg JP Dump_Instr_Etc; Plant it ADD_EA_An RLCA ; AND %0000 111 0 ; OR H ; LD H,A ; Insert reg LD A,L ; Get size field AND %11 000 000 ; JP Z ErrorF ; Size RLCA ; AND %0000000 1 ; OR H ; LD H,A ; Plant size LD A,L ; OR %11 000 000 ; LD L,A ; JP Dump_Instr_Etc; Plant it ADDI CALL Save_Acc ; Store Acc CALL GetComma ; PUSH HL ; Get EA CALL Get_EA ; POP HL ; LD C,A ; Save mode CP %00 111 010 ; = nn[PC] JP NC ErrorE ; OR %11 000 000 ; LD L,A ; AND %00 111 000 ; An ? CP %00 001 000 ; JP Z ErrorE ; Yes, fail LD H,#40 ; JP Dump_Instr_Etc; Plant it MOVE_T_USP LD (TempDE),DE ; Save ptr CALL GetLC ; CP "s" ; US JR NZ MOVE_EA_1 ; CALL GetLC ; CP "p" ; USP JR NZ MOVE_EA_1 ; INC DE ; CALL FindComma ; "," JR C MOVE_EA_1 ; No, not SR BIT 4,H ; .L only JP NZ ErrorF ; Size CALL TestReg ; An JP C ErrorE ; CP 8 ; An JP C ErrorE ; OR #60 ; 0110 1 RRR LD L,A ; LD H,#4E ; JP DumpWord ; MOVE_EA_1 LD DE,(TempDE) ; Restore ptr MOVE_EA PUSH HL ; Get EA CALL Get_EA ; POP HL ; JP C MOVE_XTRA ; USP SR LD B,A ; Save mode OR L ; LD L,A ; LD A,B ; Immediate ? CP %00 101 000 ; Above this we must save disp JR C MOVE_1 ; PUSH HL ; Save disp LD HL,(disp) ; LD (F_disp),HL ; LD HL,(disp+2) ; LD (F_disp+2),HL ; POP HL ; CP %00 111 100 ; CALL Z Save_Acc ; Save Acc if so MOVE_1 CALL GetComma ; LD A,(DE) ; Get char OR %00 1 00000 ; lc CP "u" ; Here we go again JR Z MOVE_T_USP1 ; CP "c" ; JR Z MOVE_T_CCR ; CP "s" ; JP NZ MOVE_EA_2 ; Ok LD (TempDE),DE ; Save ptr CALL GetLC ; SR CP "r" ; JP NZ MOVE_EA_3 ; INC DE ; LD A,(DE) ; CALL Ident ; JR NC MOVE_EA_3 ; LD C,#46 ; MOVE ,SR JR MOVE_EA_SR ; Do it MOVE_T_CCR LD (TempDE),DE ; Save Ptr CALL GetLC ; CC CP "c" ; JR NZ MOVE_EA_3 ; CALL GetLC ; CCR CP "r" ; JR NZ MOVE_EA_3 ; INC DE ; LD A,(DE) ; CALL Ident ; JR NC MOVE_EA_3 ; LD C,#44 ; MOVE ,CCR MOVE_EA_SR LD A,H ; .W CPL ; AND %00 11 0000 ; JP NZ ErrorF ; LD H,C ; LD A,L ; OR %11 000 000 ; LD L,A ; AND %00 111 000 ; An ? CP %00 001 000 ; JP Z ErrorE ; Fail LD C,B ; Mode LD A,C ; Imm CP %00 111 100 ; JP NZ Dump_Instr_Etc; Plant it CALL DumpWord ; LD HL,(TAcc+2) ; LD A,H ; OR L ; JP NZ ErrorD ; Out of range LD HL,(TAcc) ; JP DumpWord ; MOVE_T_USP1 LD (TempDE),DE ; Save ptr CALL GetLC ; US CP "s" ; JR NZ MOVE_EA_3 ; CALL GetLC ; USP CP "p" ; JR NZ MOVE_EA_3 ; INC DE ; LD A,(DE) ; CALL Ident ; JR NC MOVE_EA_3 ; BIT 4,H ; .L ? JP NZ ErrorF ; LD A,L ; An ? AND %00 111 000 ; CP %00 001 000 ; JP NZ ErrorE ; LD A,L ; AND %0000 0 111 ; OR %0110 0 000 ; LD L,A ; LD H,#4E ; JP DumpWord ; MOVE_EA_3 LD DE,(TempDE) ; Restore ptr MOVE_EA_2 PUSH HL ; Get EA PUSH BC ; CALL Get_EA ; POP BC ; POP HL ; JP C MOVE_EA_XTRA; USP,SR,CCR ? LD C,A ; Save mode CP %00 111 010 ; >= nn[PC] JP NC ErrorE ; AND %00 111 000 ; An ? CP %00 001 000 ; JP NZ MOVE_2 ; No, don't check size BIT 5,H ; .B ? JP Z ErrorF ; MOVE_2 LD A,C ; RLCA ; RLCA ; RLCA ; MM RRR 00 M AND %11 000 00 0 ; OR L ; LD L,A ; Insert mode LD A,C ; RLCA ; AND %0000 111 0 ; OR H ; LD H,A ; LD A,C ; RLCA ; RLCA ; RLCA ; AND %00 000 00 1 ; OR H ; LD H,A ; HL = 00 SS RRR MMM MMM RRR CALL DumpWord ; Plant instr LD A,B ; CP %00 111 100 ; Immediate ? JR Z MOVE_Imm ; CP %00 101 000 ; above this have displacements LD HL,(F_disp) ; CALL NC DumpWord ; CP %00 111 001 ; This has extra word LD HL,(F_disp+2) ; CALL Z DumpWord ; ; Now dump second LD HL,(disp) ; Extra word ? LD A,C ; CP %00 101 000 ; above this have displacements CALL NC DumpWord ; CP %00 111 001 ; This has extra word LD HL,(disp+2) ; CALL Z DumpWord ; OR A ; RET ; NC MOVE_Imm BIT 4,H ; Long ? JR NZ MOVE_I_WB ; No LD HL,(TAcc+2) ; Save extra 16 CALL DumpWord ; MOVE_I_W LD HL,(TAcc) ; JP Dump_Instr_Etc; MOVE_I_WB LD B,H ; Save length flag LD HL,(TAcc+2) ; Test for 0 LD A,H ; XOR L ; JP NZ ErrorD ; Overflow LD A,H ; 00 or FF INC A ; 0 or 1 AND %1111111 0 ; JP NZ ErrorD ; Overflow BIT 5,B ; Word ? JR NZ MOVE_I_W ; Yes LD A,H ; LD HL,(TAcc) ; XOR H ; Same ? LD H,A ; Cheap zero JP NZ ErrorD ; JP Dump_Instr_Etc; MOVE_XTRA LD DE,(TempDE) ; Restore text ptr CALL SkipSpc ; OR %00 1 00000 ; CP "u" ; U JR Z MX_U ; CP "s" ; S JP NZ Error0 ; CALL GetLC ; CP "r" ; SR JP NZ Error0 ; INC DE ; CALL GetComma ; OR A ; SR RET ; MX_U CALL GetLC ; CP "s" ; US JP NZ Error0 ; CALL GetLC ; CP "p" ; USP JP NZ Error0 ; INC DE ; CALL GetComma ; OR A ; RET ; MOVE_EA_XTRA JP ErrorE Invert_Reg PUSH DE ; Invert the bit order of HL PUSH BC ; LD B,16 IR_Lp ADD HL,HL ; < RR D ; > RR E ; DJNZ IR_Lp ; EX DE,HL ; POP BC ; POP DE ; RET ; Get_Logic_EA CALL Get_EA ; Get an EA RET C ; Fail LD C,A ; Save mode CP %00 111 010 ; CCF ; RET C ; Greater not allowed AND %00 111 000 ; CP %00 001 000 ; Not allowed An SCF ; RET Z ; LD A,C ; OR A ; OK RET ; Test_SR_CCR BIT 7,L ; ".L" ? SCF ; RET NZ ; Fail LD (TempDE),DE ; Save DE LD A,(DE) ; Get Char OR %00 1 00000 ; CP "s" ; "S" JR Z TSC_S ; Yes CP "c" ; "C" SCF ; RET NZ ; CALL GetLC ; Get LC CP "c" ; JR NZ TSC_Fail ; No CALL GetLC ; CP "r" ; JR NZ TSC_Fail ; INC DE ; LD A,(DE) ; CALL Ident ; JR NC TSC_Fail ; BIT 6,L ; Must be ".B" JP NZ ErrorF ; TSC_Ok LD A,%00 111 100 ; CCR or SR OR A RET TSC_Fail LD DE,(TempDE) ; Restore ptr SCF RET TSC_S CALL GetLC ; Get LC CP "r" ; JR NZ TSC_Fail ; No INC DE ; LD A,(DE) ; CALL Ident ; JR NC TSC_Fail ; BIT 6,L ; Must be ".W" JR NZ TSC_Ok ; Ok JP ErrorF ; GetLC INC DE ; Pre inc LD A,(DE) ; Get char OR %00 1 00000 ; lc RET ; Save_Acc PUSH HL ; Save the Acc LD HL,(Acc) ; LD (TAcc),HL ; LD HL,(Acc+2) ; LD (TAcc+2),HL ; POP HL ; RET ; EA_Imm INC DE ; Skip "#" CALL Evaluate ; Get value JP C Error0 LD A,%00 111 100 ; #nnnn RET ; Get_EA CALL SkipSpc ; Get char CP "#" ; Immediate ? JR Z EA_Imm ; Yes LD HL,0 ; Zero disp long LD (disp),HL ; LD (disp+2),HL ; CALL SkipSpc ; Get char CP "[" ; [An.... JR Z EA_< ; Yes CALL TestReg ; Reg ? RET NC ; Return 0000 A RRR LD A,(DE) ; Restore char CP "-" ; Leading minus ? JR NZ EA_Exp ; No, skip INC DE ; Avoid minus LD A,(DE) ; CP "[" ; "-[" JR Z EA_Min< ; DEC DE ; Restore ptr EA_Exp CALL Evaluate ; Get no JP C Error0 ; Fail CALL SkipSpc ; Get next char CP "[" ; "[An..." ? JR Z EA_nn< ; Yes CP "." ; .W or .L JR NZ EA_Addr_W ; No, check word INC DE ; LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; 16 bit ? JR Z EA_Addr_W ; CP "l" ; JP NZ ErrorF ; Invalid size EA_Addr_L LD HL,(Acc+2) ; LD (disp),HL ; LD HL,(Acc) ; LD (disp+2),HL ; LD A,%00 111 001 ; OR A RET EA_Addr_W CALL Test_Sign_16; 16-bit disp ? JP C ErrorD ; LD (disp),HL ; Save LD A,%00 111 000 ; False return OR A RET EA_< CALL Get_An> ; Get address reg JP C Error0 ; AND %00 000 111 ; Lose type bit LD C,A ; Save LD A,(DE) ; Next char CP "+" ; [An]+ JR NZ EA_ ; INC DE ; SkipIt LD A,C ; Reg OR %00 011 000 ; [An]+ RET EA_ LD A,C ; Reg OR %00 010 000 ; [An] RET EA_Min< CALL Get_An> ; Get An JP C Error0 ; Fail AND %00 000 111 ; Lose type bit OR %00 100 000 ; -[An] RET EA_nn< INC DE ; Skip "[" LD A,(DE) ; Get next char OR %00 1 00000 ; lc CP "p" ; "P" JR NZ EA_nn<_1 ; No INC DE ; Skip "P" LD A,(DE) ; OR %00 1 00000 ; CP "c" ; "C" JP NZ Error0 ; Invalid INC DE ; Skip "C" LD C,%1 0000000 ; PC Flag JR EA_nn<_2 ; dw Rest EA_nn<_1 CALL TestReg ; An ? JP C Error0 ; SUB 8 ; JP C ErrorE ; LD C,A ; Save An EA_nn<_2 LD A,(DE) ; INC DE ; CP "]" ; JR Z EA_nnnn ; CP "," ; ",Xn{.W .L}]" JP NZ Error0 ; No, error CALL Test_Sign_8 ; Disp OK ? JP C ErrorD ; No, out of range LD L,A ; Save displacement CALL SkipTestReg ; Get reg JP C ErrorE ; RLCA ; RLCA ; RLCA ; RLCA ; LD H,A ; % A RRR 0000 LD A,(DE) ; "." CP "." JR NZ EA_nn INC DE ; W or L LD A,(DE) ; INC DE ; OR %00 1 00000 ; lc CP "w" ; W JR Z EA_nn CP "l" ; JP NZ ErrorF ; Wrong size SET 3,H ; Assert L EA_nn LD (disp),HL ; LD A,(DE) ; CP "]" ; JP NZ Error0 ; INC DE ; BIT 7,C ; PC flag JR NZ EA_nn ; Yes LD A,C ; AND %00 000 111 ; An OR %00 110 000 ; nn[An,Rn.S] RET ; EA_nn LD A,%00 111 011 ; nn[PC_] OR A ; RET ; Ret NC EA_nnnn CALL Test_Sign_16; Check disp JP C ErrorD ; LD (disp),HL ; BIT 7,C ; PC Flag JR NZ EA_nnnn; Yes LD A,C ; nnnn[An] AND %00 000 111 ; OR %00 101 000 ; RET ; EA_nnnn LD A,%00 111 010 ; nnnn[PC] OR A ; RET ; Ret NC Get_nnnn CALL SkipSpc ; Get char LD HL,0 ; Default to Zero LD (Acc),HL ; LD (Acc+2),HL ; CP "[" ; Exp = 0 ? CALL NZ Evaluate ; If not, get value RET C ; Fail CALL Test_Sign_16 ; Disp ok ? RET C ; No LD (disp),HL ; Save disp Get_ CALL SkipSpc ; Get char CP "[" ; "[" SCF ; RET NZ ; Get_An> INC DE ; Step CALL SkipTestReg ; An RET C ; CP 8 ; Addr ? RET C ; LD C,A ; Save CALL SkipSpc ; Get char CP "]" ; "]" SCF ; RET NZ ; CALL Skip1Spc ; Next char LD A,C ; Return reg val OR A ; RET ; Get_Min CALL SkipSpc ; Get Char CP "-" ; SCF ; RET NZ ; INC DE JR Get_ ; Get [An] Get_Plus CALL Get_ ; Get [An] RET C ; Fail LD C,A LD A,(DE) CP "+" SCF RET NZ INC DE LD A,C OR A RET Get_Displacement CALL Get_Offset; Calc -$ LD HL,(Acc) ; Now subtract 2 LD BC,-2 ; ADD HL,BC ; LD (Acc),HL ; LD HL,(Acc+2) ; LD BC,#FFFF ; ADC HL,BC ; LD (Acc+2),HL ; GD_Test LD A,H ; In range ? OR A ; JR Z GD_1 ; CP #FF ; SCF ; RET NZ ; No. GD_1 CP L ; Same ? SCF ; RET NZ ; No LD HL,(Acc) ; Low word XOR H ; Check sign bit AND %1 0000000 ; SCF ; RET NZ ; No OR A ; RET ; Get_Offset CALL Evaluate ; Get destination RET C ; LD HL,(Acc) ; Calc offset LD BC,(pPC) ; SBC HL,BC ; LD (Acc),HL ; LD HL,(Acc+2) ; LD BC,(pPC+2) ; SBC HL,BC ; LD (Acc+2),HL ; RET Get_Immediate CALL SkipSpc ; "#" ? CP "#" ; No SCF ; RET NZ ; INC DE ; Avoid it JP Evaluate ; Test_Sign_8 LD HL,(Acc+1) ; Does it fit in 8 signed bits LD A,(Acc+3) ; CP H ; SCF ; RET NZ ; No CP L ; SCF ; RET NZ ; No OR A ; JR Z T_S_8 ; Positive CP #FF ; SCF ; RET NZ ; No T_S_8 LD A,(Acc) ; Check sign bits XOR L ; AND %1 0000000 ; SCF ; RET NZ ; Different LD A,(Acc) ; OK OR A ; RET ; Test_Sign_16 LD HL,(Acc+1) ; Does it fit in 8 signed bits LD A,(Acc+3) ; CP H ; SCF ; RET NZ ; No OR A ; JR Z T_S_16 ; Positive CP #FF ; SCF ; RET NZ ; No T_S_16 XOR L ; Check sign bits AND %1 0000000 ; SCF ; RET NZ ; Different LD HL,(Acc) ; OK OR A ; RET ; SkipTestReg CALL SkipSpc TestReg LD A,(DE) ; These are tokenised 80..8F SUB #80 ; RET C ; No INC DE ; Step ptr CP #10 ; SP ? CCF ; RET NC ; Ret value LD A,%0000 1 111 ; A7 really OR A ; RET ; CALL TestReg1 RET C PUSH AF LD A,(DE) CALL Ident JR NC TR_Fail POP AF RET TR_Fail POP AF DEC DE DEC DE SCF RET TestReg1 LD A,(DE) ; Return 0..7 for data OR %0010 0000 ; 8..F for addr CP "d" JR Z TestRega CP "a" JR Z TR_Addr CP "s" SCF RET NZ INC DE LD A,(DE) DEC DE OR %00 1 00000 CP "p" SCF RET NZ LD A,%0000 1 111 ; A7 INC DE INC DE OR A RET TR_Addr CALL TestRega RET C ADD A,8 RET TestRega INC DE LD A,(DE) DEC DE SUB "0" RET C CP 8 CCF RET C INC DE INC DE OR A RET DumpnBytes LD B,A DumpnBytesLp LD A,(HL) INC HL CALL DumpByte DJNZ DumpnBytesLp OR A RET FindComma CALL SkipSpc CP "," SCF RET NZ CALL Skip1Spc OR A RET GetComma CALL SkipSpc CP "," JP NZ Error10 JP Skip1Spc CallHL JP (HL) FindStr LD BC,0 FSlp PUSH DE LD A,(HL) OR A JR Z FSNotFound FSlp1 LD A,(HL) OR A JR Z FS_A LD A,(DE) CP (HL) JR NZ FS_B INC DE INC HL JR FSlp1 FSNotFound POP AF SCF RET FS_A LD A,(DE) CALL Term JR C FS_Found FS_B LD A,(HL) INC HL OR A JR NZ FS_B POP DE INC BC JP FSlp FS_Found POP AF OR A RET FindStrMnem LD HL,MnemBuff PUSH DE LD A,(DE) INC DE LD B,1 LD IXL,A LD IXH,A FSMa LD (HL),A INC HL LD A,(DE) CALL Ident JR C FSMc FSMb INC B LD C,A LD A,IXL RRCA ADD A,C LD IXL,A LD A,C XOR IXH LD IXH,A LD A,(DE) INC DE JP FSMa FSMc PUSH BC CALL PageInMnems POP BC LD (pMnemEnd),DE LD A,IXL LD L,A LD H,0 ADD HL,HL LD A,MnemVectors/256 OR H LD H,A LD E,(HL) INC L LD D,(HL) FSMlp EX DE,HL LD A,L ; null ptr OR H ; JR Z FSMfail ; LD E,(HL) ; get pNext INC HL ; LD D,(HL) ; INC HL ; LD A,(HL) ; compare length CP B ; JR NZ FSMlp ; INC HL LD A,IXH ; compare hash 2 CP (HL) ; JR NZ FSMlp ; INC HL LD A,B EX AF,AF' PUSH DE LD DE,MnemBuff FSMcplp LD A,(DE) ; Compare buffer CP (HL) ; JR NZ FSMlp1 ; ; INC DE ; INC HL ; ; DJNZ FSMcplp ; LD A,(HL) ; Found it , read number INC HL ; LD H,(HL) ; LD L,A ; ADD HL,HL ; * 16 ( bytes per instr) ADD HL,HL ; ADD HL,HL ; ADD HL,HL ; LD DE,InstrData ; Point at data ADD HL,DE ; PUSH HL ; Set up ptr POP IX ; POP DE ; Restore ptr to end CALL PageOutMnems POP AF ; Get rid of pStart LD DE,(pMnemEnd) ; Reload end of str OR A RET ; NC FSMfail CALL PageOutMnems ; Not found ; POP DE ; Restore pStart ; SCF ; ; RET ; PageInMnems LD IY,cMnemBlocks LD BC,MnemPage CALL PIM1 LD BC,MnemPage+#1000 CALL PIM1 LD BC,MnemPage+#2000 PIM1 IN A,(C) LD (IY+3),A LD A,(IY) OUT (C),A INC IY RET PageOutMnems LD IY,cMnemBlocks LD BC,MnemPage CALL POM1 LD BC,MnemPage+#1000 CALL POM1 LD BC,MnemPage+#2000 POM1 LD A,(IY+3) OUT (C),A INC IY RET FSMlp1 EX AF,AF' ; restore cnt LD B,A ; EX AF,AF' ; POP DE ; restore ptr JP FSMlp FindElement PUSH HL PUSH BC CALL FindStr LD A,C POP BC POP HL RET Term CP "0" RET C CP "z"+1 CCF RET C CP "a" RET NC CP "Z"+1 CCF RET C CP "A" RET NC CP "9"+1 CCF RET ReadTable ADD A,E LD E,A ADC A,D SUB E LD D,A LD A,(DE) RET Skip2Spc INC DE Skip1Spc INC DE SkipSpc LD A,(DE) CP #0A JP Z Skip2Spc CP " " JR Z Skip1Spc RET Skipt1 INC DE Skipt LD A,(DE) OR A RET Z CP ":" RET Z CP ";" RET Z JP Skipt1 PrintSp PUSH AF LD A," " JR PrintLit PrintCret PUSH AF LD A,#0D PrintLit CALL Print POP AF RET Write LD C,1 LD DE,-10000 CALL Write1 LD DE,-1000 CALL Write1 LD DE,-100 CALL Write1 LD DE,-10 CALL Write1 LD A,L ADD A,"0 CALL Print WriteS LD A,#20 CALL Print RET Write1 XOR A Write2 INC A ADD HL,DE JR C,Write2 SBC HL,DE CP C JR Z,WriteS DEC C ADD A,#2F CALL Print RET DebugStr PUSH HL PUSH DE PUSH AF EX DE,HL CALL PrintStr POP AF POP DE POP HL RET PrintStrPC EX (SP),HL CALL PrintStr EX (SP),HL RET PrintStr LD A,(HL) OR A RET Z CALL Print INC HL JR PrintStr CmdLet CP "A RET C CP #5B CCF RET Ident1 CP #80 CCF RET C CP ">"+1 RET Ident CP #80 CCF RET C CP "_" RET Z CP "A" JR C Num CP "Z"+1 CCF RET NC CP "a" RET C CP "z"+1 CCF RET Num CP "0 RET C CP #3A CCF RET Pfx CP "# RET Z CP "' RET Z CP #22 RET Hex SUB "0 RET C CP 10 CCF RET NC SUB 7 CP 10 RET C CP 17 CCF RET Level0 CALL Ident1 JR NC,Level0a CP "$" JR Z,Level0b CP "%" JR Z,Level0g CALL Num JR NC,Level0c CP "(" JR Z,Level0d CP #22 JR Z,Level0e CP "*" JR Z,Level0f JP Error0 Level0a CALL EvalLabel RET NC CALL PassChek LD A,#FF LD (Flag),A ; eval error RET PassChek EX AF,AF' LD A,(PassNo) OR A RET Z EX AF,AF' RET NZ JP Error9 Level0b CALL ReadHex RET NC JP Error1 Level0g CALL ReadBin RET NC JP Error1 Level0c CALL ReadDec RET NC JP Error1 Level0d INC DE CALL Level3 CP ") INC DE RET Z JP Error0 Level0e LD HL,Buffer INC DE CALL Rdstg JR NC,Level0e1 DEC DE Level0e1 LD HL,Buffer LD C,1 PUSH DE LD DE,String CALL Expand XOR A LD (DE),A LD HL,0 EXX LD HL,0 EXX LD DE,String StLp LD A,(DE) OR A JR Z,Level0e2 LD A,H OR A JP NZ Error1 LD H,L EXX LD A,H LD H,L EXX LD L,A LD A,(DE) EXX LD L,A EXX INC DE JR StLp Level0e2 POP DE RET Level0f INC DE EXX LD HL,(pPC) EXX LD HL,(pPC+2) RET LevelUs INC DE LevelU CALL SkipSpc CP "- JR Z,LevelUa CP "+ JP NZ,Level0 CALL Skip1Spc JP Level0 LevelUa CALL Skip1Spc CALL Level0 LD A,H CPL LD H,A LD A,L CPL LD L,A EXX LD A,H CPL LD H,A LD A,L CPL LD L,A LD A,1 ADD A,L LD L,A LD A,0 ADC A,H LD H,A EXX LD A,0 ADC A,L LD L,A LD A,0 ADC A,H LD H,A RET Level1s INC DE Level1 CALL LevelU Level1a CALL SkipSpc CP "* JR Z,Level1b CP "/ JR Z,Level1c RET Level1b EXX PUSH HL EXX PUSH HL CALL LevelUs POP BC EXX POP BC EXX CALL Mul JR Level1a Level1c EXX PUSH HL EXX PUSH HL CALL LevelUs POP BC EXX POP BC EXX CALL Div JR Level1a Level2s INC DE Level2 CALL Level1 Level2a LD A,(DE) CP "+ JR Z,Level2b CP "- JR Z,Level2c RET Level2b EXX PUSH HL EXX PUSH HL CALL Level1s POP BC EXX POP BC EXX CALL Add JR Level2a Level2c EXX PUSH HL EXX PUSH HL CALL Level1s POP BC EXX POP BC EXX CALL Sub JR Level2a Level3 CALL Level2 Level3a LD A,(DE) CP "& JR Z,Level3b CP "! JR Z,Level3c CP "| JR Z,Level3d RET Level3b EXX PUSH HL EXX PUSH HL CALL Level2s POP BC EXX POP BC EXX CALL And JR Level3a Level3c EXX PUSH HL EXX PUSH HL CALL Level2s POP BC EXX POP BC EXX CALL Or JR Level3a Level3d EXX PUSH HL EXX PUSH HL CALL Level2s POP BC EXX POP BC EXX CALL Xor JR Level3a And LD A,L AND C LD L,A LD A,H AND B LD H,A EXX LD A,L AND C LD L,A LD A,H AND B LD H,A EXX RET Add EXX ADD HL,BC EXX ADC HL,BC RET Mul PUSH DE LD DE,HL LD HL,0 EXX LD DE,HL LD HL,0 EXX LD A,32 Ml1 EXX ADD HL,HL EXX ADC HL,HL EXX EX DE,HL ADD HL,HL EX DE,HL EXX EX DE,HL ADC HL,HL EX DE,HL JR NC,Ml2 EXX ADD HL,BC EXX ADC HL,BC Ml2 DEC A JR NZ,Ml1 POP DE RET Or LD A,L OR C LD L,A LD A,H OR B LD H,A EXX LD A,L OR C LD L,A LD A,H OR B LD H,A EXX RET Sub EXX LD A,C SUB L LD L,A LD A,B SBC A,H LD H,A EXX LD A,C SBC A,L LD L,A LD A,B SBC A,H LD H,A RET Mod PUSH DE EXX LD A,H OR L EXX OR H OR L JP Z,Error1 EXX LD DE,BC LD BC,HL LD HL,0 EXX LD DE,BC LD BC,HL LD HL,0 LD A,32 Md1 EXX EX DE,HL ADD HL,HL EX DE,HL EXX EX DE,HL ADC HL,HL EX DE,HL EXX ADC HL,HL EXX ADC HL,HL JR C,Md2 EXX SBC HL,BC EXX SBC HL,BC EXX ADD HL,BC EXX ADC HL,BC JR C,Md3 Md2 EXX OR A SBC HL,BC EXX SBC HL,BC EXX INC DE EXX Md3 DEC A JR NZ,Md1 EXX LD BC,DE EXX LD BC,DE POP DE RET Xor EXX LD A,L XOR C LD L,A LD A,H XOR B LD H,A EXX LD A,L XOR C LD L,A LD A,H XOR B LD H,A RET Div CALL Mod EXX LD H,B LD L,C EXX LD H,B LD L,C RET Evaluate EXX PUSH BC EXX PUSH BC XOR A LD (Flag),A CALL Level3 LD (Acc+2),HL EXX LD (Acc),HL EXX LD A,(Flag) ADD A,A POP BC EXX POP BC EXX JR NC E_NZ EXX LD DE,0 LD (Acc),DE LD (Acc+2),DE LD DE,(Refs) INC DE LD (Refs),DE EXX XOR A ; Z RET E_NZ XOR A ; NZ INC A RET Error0 DEFB 62,0,33 Error1 DEFB 62,1,33 Error2 DEFB 62,2,33 Error3 DEFB 62,3,33 Error4 DEFB 62,4,33 Error5 DEFB 62,5,33 Error6 DEFB 62,6,33 Error7 DEFB 62,7,33 Error8 DEFB 62,8,33 Error9 DEFB 62,9,33 ErrorA DEFB 62,10,33 ErrorB DEFB 62,11,33 ErrorC DEFB 62,12,33 ErrorD DEFB 62,13,33 ErrorE DEFB 62,14,33 ErrorF DEFB 62,15,33 Error10 DEFB 62,16 PUSH DE PUSH AF Err0 LD HL,(pCurrLine) INC HL SET 6,(HL) ; Assert Error CALL PrintL JR C,ErrorX POP AF PUSH AF LD HL,Efil LD BC,0 CPIR LD A,(HL) Err1 INC HL CALL Print LD A,(HL) CP #20 JR NC,Err1 CALL PrintStrPC DEFM / - in / DEFB 0 LD DE,cFileName CALL PrintFN LD A,1 LD (ErrorFlag),A CALL PrintCret POP AF POP DE CP 4 LD SP,(Stack) RET Z Err2 LD A,(DE) INC DE OR A JR NZ,Err2 JP A1 ErrorX LD SP,(Stack) OR A RET Efil DEFB 0 DEFM /Illegal symbol/ DEFB 1 DEFM /Expression overflow/ DEFB 2 DEFM /Missing ')'/ DEFB 3 DEFM /Illegal branch/ DEFB 4 DEFM /Escape/ DEFB 5 DEFM /Context error/ DEFB 6 DEFM /Redefined Label/ DEFB 7 DEFM /Missing '('/ DEFB 8 DEFM /Illegal mnemonic/ DEFB 9 DEFM /Undefined label/ DEFB 10 DEFM /Error in USE file/ DEFB 11 DEFM /Unresolved reference/ DEFB 12 DEFM /Fault in global Label/ DEFB 13 DEFM /Out of range/ DEFB 14 DEFM /Illegal operand or addressing mode/ DEFB 15 DEFM /Illegal size/ DEFB 16 DEFM /Missing ","/ DEFB 17 Rdstg LD B,A LD C,0 Rdstg1 LD A,(DE) INC DE CP B JR Z,Rdstg3 OR A JR Z,Rdstg4 CP #20 JR Z,Rdstg2 LD C,#FF Rdstg2 INC C LD (HL),A INC HL JR Rdstg1 Rdstg3 LD (HL),0 INC HL RET Rdstg4 LD (HL),A CP C SCF RET Z DEC HL DEC C JR Rdstg4 ReadDec SUB "0 CALL Ld_A_Acc Read1 INC DE LD A,(DE) CALL Num CCF RET NC SUB "0 LD BC,HL EXX LD BC,HL EXX CALL AddAcc RET C CALL AddAcc RET C EXX ADD HL,BC EXX ADC HL,BC RET C CALL AddAcc RET C CALL Add_A_Acc JR NC Read1 RET ReadHex INC DE LD A,(DE) CALL Hex RET C CALL Ld_A_Acc Read3 INC DE LD A,(DE) CALL Hex CCF RET NC CALL AddAcc RET C CALL AddAcc RET C CALL AddAcc RET C CALL AddAcc RET C CALL Add_A_Acc JR Read3 ReadBin INC DE LD A,(DE) CALL Bin RET C CALL Ld_A_Acc RB1 CALL Skip1Spc CALL Bin CCF RET NC CALL AddAcc RET C CALL Add_A_Acc RET C JR RB1 AddAcc EXX ADD HL,HL EXX ADC HL,HL RET Add_A_Acc EXX LD C,A LD B,0 ADD HL,BC EXX LD BC,0 ADC HL,BC RET Ld_A_Acc EXX LD L,A LD H,0 EXX LD HL,0 RET Bin SUB "0" RET C CP 2 CCF RET sError DEFM /Error !/ DEFB #0D,#00 NYI SCF RET DumpWord PUSH AF ; Fucking motorola format LD A,H ; High byte first (urgh !) CALL DumpByte ; LD A,L ; CALL DumpByte ; POP AF RET DumpByte PUSH HL PUSH DE LD D,A LD A,(PassNo) OR A JR Z DB_B LD A,(ObjeO) DEC A JP M DB_B LD HL,(pDumpAddr) LD A,D CALL Write_AHL DB_B LD A,(ListO) DEC A JP M DB_A LD A,D EXX LD (BC),A INC C EXX DB_A LD HL,(pDumpAddr) INC HL LD (pDumpAddr),HL LD HL,dPC INC (HL) JR NZ DB_C INC HL INC (HL) JR NZ DB_C INC HL INC (HL) JR NZ DB_C INC HL INC (HL) DB_C LD A,D POP DE POP HL RET DataFile EQU $ USE "Mnem68" Tfil EQU $ ; Ptrs to tokens DEFW Z80,Z81,Z82,Z83 DEFW Z84,Z85,Z86,Z87 DEFW Z88,Z89,Z8A,Z8B DEFW Z8C,Z8D,Z8E,Z8F DEFW Z90 Z80 DEFM /D0/ DEFB 0 Z81 DEFM /D1/ DEFB 0 Z82 DEFM /D2/ DEFB 0 Z83 DEFM /D3/ DEFB 0 Z84 DEFM /D4/ DEFB 0 Z85 DEFM /D5/ DEFB 0 Z86 DEFM /D6/ DEFB 0 Z87 DEFM /D7/ DEFB 0 Z88 DEFM /A0/ DEFB 0 Z89 DEFM /A1/ DEFB 0 Z8A DEFM /A2/ DEFB 0 Z8B DEFM /A3/ DEFB 0 Z8C DEFM /A4/ DEFB 0 Z8D DEFM /A5/ DEFB 0 Z8E DEFM /A6/ DEFB 0 Z8F DEFM /A7/ DEFB 0 Z90 DEFM /SP/ DEFB 0 ORG Variables Acc DEFS 4 TAcc DEFS 4 disp DEFS 4 F_disp DEFS 4 TempDE DEFS 2 Reg_Mask DEFS 16 pPC DEFS 4 dPC DEFS 4 pDumpAddr DEFS 2 pDisp DEFS 4 Line DEFS 2 Count DEFS 2 Temp DEFS 2 P1 DEFS 2 P2 DEFS 2 P3 DEFS 2 P4 DEFS 2 P5 DEFS 2 P6 DEFS 2 P7 DEFS 2 P8 DEFS 2 Pmax EQU $ ; PrevBlocks DEFS 3 Flag DEFS 1 Flag2 DEFS 1 ErrorFlag DEFS 1 Refs DEFS 2 UnResRef DEFS 2 Stack DEFS 2 PassNo DEFS 1 WSblock DEFS 1 WSblockP DEFS 1 ListO DEFS 1 SymO DEFS 1 ObjeO DEFS 1 LabelO DEFS 1 TestingO DEFS 1 iListO DEFS 1 iSymO DEFS 1 iObjeO DEFS 1 iLabelO DEFS 1 iTestingO DEFS 1 ListPass DEFS 1 pObject DEFS 4 pDisplace DEFS 4 pSList DEFS 2 pCurrLine DEFS 2 cFileName DEFS 85 cSList DEFS 85 cMnemBlocks DEFS 6 pMnemEnd DEFS 2 ORG ($!#FF)+1 MnemBuff DEFS #40 AsmCode DEFS #40 Buffer DEFS #40 String DEFS #80 String2 DEFS #80 USEends DEFS #80 InstDataBuff DEFS #10 fsGetList EQU #009C fsGetBlock EQU #0096 fsPutBlock EQU #0099 LocalHashs DEFS 1 GlobalHashs DEFS 1 pLabBlock DEFS 1 pLabText DEFS 2 pLabVal DEFS 2 gpOldSym DEFS 2 gpSymList DEFS 2 gbOldSym DEFS 1 USEflag DEFS 1 pUSEends DEFS 2 bUSE0 DEFS 1 ; Save area for windows bUSE1 DEFS 1 bUSE2 DEFS 1 bUSE3 DEFS 1 wSymA EQU #8000 wSymB EQU #7000 wSymC EQU #6000 Ye_End EQU $ ORG wSymA+#BE0 pNewSym DEFS 2 pOldSym DEFS 2 bNewSym DEFS 1 bOldSym DEFS 1 pSymbolList DEFS 2 pLabel DEFS 2 HashPtr DEFS 2 HashTable EQU wSymA+#C00 SymbolList EQU wSymA+#F00 SymbolStart EQU wSymC+#BC0 TextWind EQU #F000 ORG #D000 MnemPage EQU $ MnemVectors DEFS #2000