home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / 6502 / 6502SIM.LBR / ZX65SIM.MQC / ZX65SIM.MAC
Text File  |  2000-06-30  |  36KB  |  1,570 lines

  1. ; ZX65: SIMULATING A MICRO    1/80    R M KRUSE
  2. ; FOR Z80-BASED SYSTEMS USING THE CP/M DOS
  3. ;
  4. ;
  5. ;
  6. ; THIS FILE IS AN ENHANCED VERSION OF ZX65, BY R.M.KRUSE.
  7. ; THE FOLLOWING CHANGES HAVE BEEN MADE TO THE ORIGINAL:
  8. ;
  9. ;
  10. ; REVISION 1.0:    10/22/82 (RGF)
  11. ; THIS REVISION OF ZX65 ALLOWS ASSEMBLY UNDER THE M80
  12. ; (MICROSOFT RELOCATING ASSEMBLER) 
  13. ;
  14. ; SIMULATOR MODIFIED TO NOT NEED RELOCATION, BY REMAPPING 6502
  15. ; MEMORY REFERENCES THROUGH A COMPANION MODULE (ZX65HOST.MAC)
  16. ; INTO Z80 MEMORY. THE TWO MODULES MUST BE LINKED TOGETHER
  17. ; USING L80. 
  18. ;
  19. ; BUG FIXED 11/05/82 (RGF): FIXED PROBLEM WITH STORES
  20. ;   IN MULTI-MODE INSTRUCTIONS WHERE DESTINATION=ACC
  21. ;   (EG, LSR A)
  22. ;
  23. ; 11/22/82 (RGF) : ADDED IFETCH CALL TO MAPPER MODULE
  24. ;           TO ALLOW INSTRUCTION FETCH SETUP.  ALTHOUGH
  25. ;           NOT CURRENTLY USED, THIS WILL ALLOW SETUP OF
  26. ;           INSTRUCTION FETCH CYCLES IN COMPANION 6502 IN-
  27. ;           CIRCUIT HARDWARE EMULATION THAT MAY SOMEDAY
  28. ;           BE DESIGNED. (ANY TAKERS???)
  29.  
  30. ;
  31. ;           ADDED HISTOGRAM FEATURE, # OF STEPS
  32. ;           SET BY VARIABLE 'HSIZE', WHICH IS
  33. ;           THE # OF PREVIOUS PC'S TO REMEMBER
  34. ;           THIS FEATURE AVAILABLE THROUGH THE "H"
  35. ;           COMMAND.
  36. ;
  37. ;
  38. ;           REMOVED SELF-CONTAINED DOS, WHICH IS
  39. ;           NOT NEEDED WITH THE MEMORY REMAPPING 
  40. ;           FEATURE
  41. ;
  42. ; ZX65SIM IS BASED ON ZX65, A PROGRAM WRITTEN BY R.M. KRUSE.
  43. ; 90% OF THE CODE BELONGS TO MR. KRUSE.     FOR MORE INFORMATION,
  44. ; SEE THE ACCOMPANYING DOCUMENTATION FILES.
  45. ;            RON FOWLER
  46. ;            12/17/82
  47. ;
  48. ;
  49.     .Z80
  50. ;
  51. ;
  52. HSIZE    EQU    40        ;SIZE OF HISTOGRAM BUFFER (IN WORDS)
  53. ;
  54.     EXTRN    FETCHA,SENDA    ;EXTRNAL ROUTINES TO FETCH
  55.                 ;AND SEND BYTE TO 6502
  56.                 ;MEMORY (ADRS IN HL)
  57.     EXTRN    AINIT        ;EXTERNAL INITIALIZATION
  58.     EXTRN    IFETCH        ;INSTRUCTION FETCH SETUP
  59. ;
  60. ; ZX65 BEGINS...
  61. ;
  62.     LD    SP,SYSTK
  63.     CALL    AINIT        ;INITIALIZE ATARI
  64.     LD    HL,(1)        ;GET BIOS BASE
  65.     LD    L,0
  66.     LD    DE,VECTBL    ;MOVE TABLE TO LOCAL AREA
  67.     LD    BC,15*3        ;MOVE FIRST 15 VECTORS
  68.     LDIR
  69.     LD      IY,INTRO
  70.     CALL    PRTXT        ; PRINT HEADER
  71.     CALL    CRLF
  72. ;
  73. ; COMMAND LEVEL...RETURN HERE FROM ANY POINT IN PGM
  74. ;
  75. CMND::    LD      HL,CMND
  76.     PUSH    HL        ; RET ADDR ON STACK
  77.     CALL    CRLF
  78.     CALL    PROM
  79.     CALL    GETCHR        ; GET COMMAND
  80.     CP    'H'        ; PRINT HISTOGRAM
  81.     JP    Z,PRTHIS
  82.     CP    'E'
  83.     JP    Z,EXAM        ; EXAM MEMORY
  84.     CP    'M'
  85.     JP    Z,SUBM        ; SUB MEMORY
  86.     LD    IX,VREG        ; FOR SIMX
  87.     CP      'B'
  88.     JR      Z,BRKP        ; RUN TO BREAKPOINT
  89.     CP    'C'
  90.     JP    Z,RGSTR        ; DSPLY/MODIFY CPU REGS
  91.     CP      'G'
  92.     JP    Z,RUN        ; RUN FROM NPC
  93.     CP    'T'
  94.     JR    Z,MULTX    ; TRACE/DISPLAY N STEPS
  95.     CP      ' '
  96.     JR      Z,EXONE    ; EX ONE INSTR & STOP
  97.     LD    C,'?'
  98.     CALL    PRNC        ; INVALID COMMAND
  99.     JR    CMND
  100. ;
  101. ; EXECUTE N STEPS
  102. ;
  103. MULTX::    LD    IY,MLTMSG
  104.     CALL    PRTXT
  105.     CALL    GETWRD        ; GET N
  106.     LD    A,E
  107.     JR      NZ,DOMULT
  108. EXONE::    LD      A,1        ; EXECUTE 1 STEP
  109. ;
  110. ; EXECUTE # STEPS IN A
  111. ;
  112. DOMULT::LD      (NSTEPS),A      ; STORE N IN TEMP
  113.     CALL    STEP        ; EXEC & DSPLY INSTR
  114.     CALL    DSPLY
  115.     LD      A,(NSTEPS)
  116.     DEC     A
  117.     RET    Z
  118.     PUSH    AF
  119.     LD    BC,DLYCON    ; DELAY FOR VIEWING
  120. DOLP::    DEC    BC
  121.     LD    A,B
  122.     OR    C
  123.     JR    NZ,DOLP
  124.     POP    AF
  125.     JR    DOMULT
  126. ;
  127. ; RUN WITHOUT DISPLAY TO BREAKPOINT
  128. ;
  129. BRKP::    LD    IY,BKPMSG
  130.     CALL    PRTXT
  131.     CALL    GETWRD         ; GET IT
  132.     LD      (BREAK),DE      ; STORE IT IN TEMP
  133. BKLP::    CALL    STEP        ; EXEC ONE INSTR
  134.     LD      DE,(BREAK)
  135.     LD      A,H        ; CHECK IF AT BKPT
  136.     CP      D
  137.     JR      NZ,INTST
  138.     LD      A,L
  139.     CP      E
  140.     JR    NZ,INTST
  141.     CALL    STEP        ; DO ONE MORE
  142.     JR    DSPLY
  143. INTST::    CALL    KBST        ; TEST FOR KBD INP
  144.     JR    Z,BKLP    ; CONTINUE IF NONE
  145.     JR    QDSP
  146. ;
  147. ; RUN ONLY..NO DISPLAY OR BREAKPOINT
  148. ;
  149. RUN::    CALL    STEP        ; DO A STEP
  150.     CALL    KBST        ; CHECK FOR KB INPUT
  151.     JR    Z,RUN        ; IF NONE JUST REPEAT
  152. ;
  153. ; STOP, DISPLAY, & RET TO CMND
  154. ;
  155. QDSP::    CALL    KBIN        ; CLEAR UART
  156.     JR    DSPLY        ; DISP CPU & RET
  157. ; DISPLAY & UPDATE CPU REGISTERS
  158. ;
  159. RGSTR::    PUSH    IX
  160.     CALL    CRLF
  161.     LD      IY,HEADR+42
  162.     CALL    PRN6         ; PRINT RG NAME
  163.     LD      DE,(NPC)     ; NEXT PC TO DE
  164.     CALL    PRTWRD        ; PRINT IT
  165.     CALL    PROM         ; PROMPT FOR CHANGE
  166.     CALL    GETWRD
  167.     JR      Z,AREG     ; SPACE = NO CHANGE
  168.     LD    (NPC),DE    ; PUT IN NEW VALUE
  169. AREG::    LD      IY,HEADR+12
  170.     LD      B,5
  171. NREG::    CALL    CRLF         ; DO REST OF REGS
  172.     CALL    PRN6         ; PRINT NAME
  173.     LD      E,(IX+0)
  174.     CALL    PRTBYT        ; PRINT CONTENTS
  175.     CALL    PROM        ; PROMPT FOR CHANGE
  176.     CALL    GETWRD
  177.     JR      Z,NXTREG      ; SPACE = NO CHANGE
  178.     LD      (IX+0),E
  179. NXTREG::INC     IX        ; POINT TO NEXT REG
  180.     DJNZ    NREG         ; DO AGAIN IF MORE
  181.     POP     IX
  182.     RET
  183. ;
  184. ; DISPLAY PC, INSTRUCTION, AND ALL REGISTERS
  185. ;
  186. DSPLY::    PUSH    IX        ; SAVE POINTER
  187.     PUSH    BC        ; SAVE MNEMONIC CODE
  188.     CALL    CRLF
  189.     LD    IY,HEADR
  190.     CALL    PRN6        ; 'CPC'
  191.     LD    DE,(CPC)
  192.     CALL    PRTWRD        ; VALUE
  193.     CALL    PRN6        ; 'INS'
  194.     POP    BC
  195.     PUSH    IY
  196.     PUSH    BC
  197.     LD    IY,MNMTBL    ; DET MNEM FROM BC
  198.     LD    A,0FCH
  199.     AND    C
  200.     SRL    A
  201.     LD    E,A
  202.     LD    D,0
  203.     ADD    IY,DE
  204.     LD    E,(IY+0)    ; GET PACKED MNEM
  205.     LD    D,(IY+1)
  206.     SLA    E        ; UNPACK IT
  207.     RL    D
  208.     LD    C,3        ; & PRINT THREE CHRS
  209. MNM2::    XOR    A
  210.     LD    B,5
  211. MNM1::    SLA    E
  212.     RL    D
  213.     RLA
  214.     DJNZ    MNM1
  215.     SET    6,A
  216.     PUSH    BC
  217.     CALL    PRNA
  218.     POP    BC
  219.     DEC    C
  220.     JR    NZ,MNM2
  221.     POP    BC        ; DECODE ADDR MODE
  222.     LD    A,B
  223.     SLA    A
  224.     SLA    A
  225.     SLA    A
  226.     LD    E,A
  227.     LD    D,0
  228.     LD    IY,AMDTBL
  229.     ADD    IY,DE
  230.     CALL    PRN8        ; PRINT ADDR MODE
  231.     POP    IY
  232.     LD    B,5
  233. DSP1::    CALL    PRN6        ; PRINT ALL REGS
  234.     LD    E,(IX+0)
  235.     CALL    PRTBYT
  236.     INC    IX
  237.     DJNZ    DSP1
  238.     CALL    PRN6        ; PRINT NEXT PC
  239.     LD    DE,(NPC)
  240.     CALL    PRTWRD
  241.     POP    IX
  242.     RET
  243. ;
  244. PRN6::    LD    E,6        ; PRINT 6 CHARS PER IY
  245.     JP    PRNLP
  246. PRN8::    LD      E,8        ; PRINT 8 CHRS PER IY
  247.     JP      PRNLP
  248. ;
  249. ; QUEUE PC (IN HL)
  250. ;
  251. QUEPC::    PUSH    HL            ; SAVE PC
  252.     LD    HL,HSBUFR+(HSIZE*2)-3    ; GET END OF BUFR-2
  253.     LD    DE,HSBUFR+(HSIZE*2)-1    ; GET END OF BUFFER
  254.     LD    BC,HSIZE*2-2        ; MOVE BUFR-2 WORDS
  255.     LDDR                ; CLEAR BOTTOM OF BUFFER
  256.     POP    DE            ; RESTORE PC TO QUEUE
  257.     LD    HL,HSBUFR        ; QUEUE IT AT START OF BUFR
  258.     LD    (HL),E              ; PUT IT IN THE QUEUE
  259.     INC    HL
  260.     LD    (HL),D        
  261.     EX    DE,HL            ; GET PC BACK TO HL
  262.     RET
  263. ;
  264. ; PRINT QUEUE
  265. ;
  266. PRTHIS::CALL    CRLF            ; TURN UP NEW LINE
  267.     LD    HL,HSBUFR        ; GET POINTER TO HISTO BUFR
  268.     LD    BC,HSIZE        ; GET COUNTER
  269. PHLP:    LD    A,B            ; DONE PRINTING? (BC=0?)
  270.     OR    C
  271.     JR    Z,PHDONE        ; JUMP IF SO
  272.     LD    E,(HL)            ; ELSE FETCH ANOTHER PC
  273.     INC    HL
  274.     LD    D,(HL)
  275.     INC    HL
  276.     PUSH    HL            ; SAVE BUFR PNTR
  277.     PUSH    BC            ; AND COUNT
  278.     CALL    PRTWRD            ; PRINT IT
  279.     LD    A,' '            ; SPACE BETWEEN WORDS
  280.     CALL    PRNA
  281.     POP    BC            ; GET COUNTER
  282.     PUSH    BC
  283.     LD    A,C            ; GET COUNT MOD 8
  284.     AND    7
  285.     CALL    Z,CRLF            ; CRLF EVERY 8 PC'S
  286.     POP    BC            ; GET COUNTER BACK
  287.     POP    HL
  288.     DEC    BC            ; COUNT DOWN
  289.     JR    PHLP
  290. PHDONE:    CALL    CRLF
  291.     RET
  292.  
  293. ;
  294. ; CODE FOR DECODING AND EXECUTING ONE INSTRUCTION
  295. ; ENTER WITH HL POINTING TO INSTR TO BE DECODED. EXITS
  296. ; WITH HL POINTING TO NEXT INSTR, B HOLDING ADDRESSING
  297. ; MODE CODE, C HOLDING MNEMONIC CODE
  298. ;
  299. STEP::    CALL    IFETCH        ; ALERT INSTR FETCH COMING
  300.     LD      HL,(NPC)     ; NEXT PC TO HL
  301.     CALL    QUEPC        ; GO PLACE IN QUEUE
  302.     LD      (CPC),HL     ; BECOMES CURRENT PC
  303.     CALL    FETCHA        ; GET OP CODE
  304.     LD      B,A        ; SAVE IT
  305.     OR      A         ; ZERO?
  306.     JP      Z,PBRK         ; IF SO, 'BRK'
  307.     BIT     0,A        ; TEST LSD FOR ODD/EVEN
  308.     JP      NZ,MLTMOD    ; ODD INSTRS MULTI MODE
  309.     AND     0FH
  310.     JR      NZ,FLGTST
  311.     LD      A,B         ; RESTORE OP CODE
  312.     BIT     4,A        ; MSD ODD/EVEN
  313.     JP      NZ,PBRNCH    ; IF ODD, BRANCH
  314.     CP      20H
  315.     JP      Z,PJSR        ; PROCESS JSR
  316.     CP      40H
  317.     JP      Z,PRTI        ; PROCESS RTI
  318.     CP      60H
  319.     JP      Z,PRTS        ; PROCESS RTS
  320.     JP      MLTMOD        ; ELSE MULTI MODE
  321. FLGTST::CP      8
  322.     JR      NZ,IMP2
  323.     LD      A,B        ; RESTORE
  324.     BIT     4,A        ; MSD ODD/EVEN
  325.     JP      Z,PIMPL        ; IF EVEN, MST BE IMPLD
  326.     CP      98H        ; MSD = 9?
  327.     JP      Z,PTYA        ; YES, PROC TYA SPECIAL
  328.     JP      PFLGS        ; ELSE PROCESS FLAG OPS
  329. IMP2::    CP      0AH
  330.     JR      NZ,JMPTST     ; MUST BE JUMP    
  331.     LD      A,B        ; RESTORE
  332.     AND     0F0H        ; TESTS ON MSD
  333.     BIT     4,A        ; ODD/EVEN
  334.     JP      NZ,PTSS        ; PROSESS SP OPS SPECIAL
  335.     CP      70H
  336.     JP      C,MLTMOD     ; PROCESS ACCUM MODES
  337.     JP      PIMPL       ; ELSE MORE IMPLIEDS
  338. JMPTST::LD      A,B        ; RESTORE OP CODE
  339.     CP      4CH
  340.         JP      Z,PJABS        ; PROCESS ABS JMP
  341.     CP      6CH
  342.         JP      Z,PJIND        ; PROCESS INDIRECT JMP
  343.     JP      MLTMOD
  344. ;
  345. ; INSTURCTION PROCESSORS BEGIN HERE.. ENTER WITH
  346. ; HL = PC, IX POINTING TO SIM CPU
  347. ;
  348. ; IF BRK VECTOR (IPOINT) = 0, RETURN TO CMND
  349. ;
  350. PBRK::    SET     4,(IX+1)    ; SET BRK STATUS BIT
  351.     LD    HL,(IPOINT)    ; SEE IF RET TO CMND
  352.     LD    A,H
  353.     OR    L
  354.     JR    NZ,BRK1
  355.     POP    BC        ; ADJUST SP
  356.     LD    BC,429H        ; RET TO CMND
  357.     JP    DSPLY
  358. BRK1::    INC    HL        ; NORMAL BREAK
  359.         CALL    TSPD          ; SP TO IY
  360.     LD    A,D        ; 'PUSH' PC
  361.     CALL    SENDA
  362.     DEC    HL
  363.     LD    A,E
  364.     CALL    SENDA
  365.     DEC    HL
  366.     LD    A,(IX+1)    ; 'PUSH' P
  367.     CALL    SENDA
  368.     DEC    HL
  369.     CALL    TDSP        ; DE TO SP
  370.     LD      HL,(IPOINT)    ; GET INTERRUPT VECTOR
  371.         LD      BC,429H        ; CODE FOR # BYTES & MNEM
  372.     JP      END1          ; AND FINISH
  373. ;
  374. ; PROCESS BRANCHES
  375. ;
  376. PBRNCH::LD      B,0            ; FORM INDEX INTO MSKTBL
  377.     CALL    FETCHA
  378.     LD      C,A        ; INSTR TO C
  379.     LD    IY,MSKTBL
  380.         SRL     C        ; GET MSD
  381.     SRL     C
  382.         SRL     C
  383.     SRL     C
  384.         DEC     C
  385.     ADD     IY,BC
  386.         INC     HL             ; POINT TO OFFSET
  387.     BIT     1,C        ; MSD ODD/EVEN
  388.     LD    A,(IX+1)    ; P REG TO ACC
  389.         LD      C,(IY+0)    ; # CODE
  390.     LD      B,(IY+1)    ; FLAG MASK
  391.         JR      NZ,BRSET    ; ODD/EVEN DET SET/CLR
  392.     AND     B             ; ISOLATE BIT FOR TEST
  393.         JR      Z,TRUE
  394.     JR      FALSE
  395. BRSET::    AND     B
  396.     JR      NZ,TRUE
  397.         JR      FALSE
  398. TRUE::    LD      D,0           ; CONDITION MET; BRANCH
  399.     CALL    FETCHA
  400.     LD      E,A        ; OFFSET TO E
  401.         BIT    7,E            ; CHECK SIGN OF OFFSET
  402.     JR      Z,TRU1
  403.         DEC     D              ; IF B7 IS SET, DO NEG
  404. TRU1::    ADD     HL,DE         ; ADD OFFSET FOR NEW PC
  405. FALSE::    LD      B,0        ; COND NOT MET; GO ON
  406.     JP      END
  407. ;
  408. ; PROCESS JUMPS AND JSR...JMP 0-4 AND JSR 0-4 GO INTO Z80
  409. ; ROUTINES PER JUMP TABLE AT USR0. CONTROL THEN RETURNS
  410. ; TO SIMULATOR UPON Z80 'RET' (C9).. ALL OTHERS PROCESSED
  411. ; NORMALLY.
  412. ;
  413. PJSR::    INC    HL        ; PROCESS JSR
  414.     CALL    SPCTST        ; TEST FOR SPECIALS
  415.     JR    NZ,PJS2
  416.     CALL    INUSR        ; GO TO USER ROUTINES
  417.     JR    PJS3
  418. PJS2::    PUSH    DE        ; SAVE NEW PC
  419.     CALL    TSPD        ; NORMAL JSR
  420.     LD    A,D        ; PUSH CURRENT PC
  421.     CALL    SENDA
  422.     DEC    HL
  423.     LD    A,E
  424.     CALL    SENDA
  425.     DEC    HL
  426.     CALL    TDSP
  427.     POP    DE        ; RESTORE NEW PC
  428.         EX      DE,HL         ; NEW PC
  429. PJS3::    LD      BC,273H
  430.         JP      END1
  431. PJABS::    INC    HL        ; ABS JUMP
  432.     LD      BC,26FH
  433.         JR      DOJP
  434. PJIND::    INC     HL            ; INDIRECT JUMP
  435.     CALL    FETCHA
  436.     LD    E,A
  437.         INC     HL
  438.     CALL    FETCHA
  439.     LD    D,A
  440.         EX      DE,HL         ; ADDR OF POINTER TO HL
  441.     LD      BC,0C6FH
  442. DOJP::    CALL    SPCTST        ; TEST FOR SPECIALS
  443.     JR    NZ,DOJ1
  444.     PUSH    BC
  445.     CALL    INUSR        ; FOR SPECIALS
  446.     CALL    PRET        ; DO SR RETURN
  447.     POP    BC
  448.     EX    DE,HL
  449. DOJ1::    EX    DE,HL        ; NEW PC
  450.         JP      END1
  451. ;
  452. ; TEST FOR USER SUBROUTINE CALLS/JUMPS. IF TARGET
  453. ; ADDRESS < 0005 THEN RET WITH Z FLG SET, ELSE CLR
  454. ;
  455. SPCTST::CALL    FETCHA        ;TEST FOR USER SPECIALS
  456.     LD    E,A
  457.     INC    HL
  458.     CALL    FETCHA        ;TARGET TO DE
  459.     LD    D,A
  460.     INC    HL        ; NXT INSTR
  461.     LD    A,0        ; TARGET < 0005?
  462.     OR    D
  463.     RET    NZ
  464.     LD    A,4
  465.     CP    E
  466.     RET    C
  467.     XOR    A        ; SET Z FLAG
  468.     RET
  469. ;
  470. ; INDEX INTO USER SUBROUTINE TABLE
  471. ; PASS A, X, & Y TO/FROM USER ROUTINE AS A, B, & C.
  472. ;
  473. INUSR::    PUSH    BC        ; SAVE CODES
  474.     LD    D,0
  475.     LD    A,E
  476.     ADD    A,E
  477.     ADD    A,E
  478.     LD    E,A
  479.     LD    IY,USR0
  480.     LD    BC,USRET    ; RETURN ON STACK
  481.     PUSH    BC
  482.     ADD    IY,DE
  483.     LD    A,(IX+0)    ; PASS A,X, & Y
  484.     LD    B,(IX+2)
  485.     LD    C,(IX+3)
  486.     JP    (IY)        ; AND GO
  487. USRET::    LD    (IX+0),A    ; RETURN HERE
  488.     LD    (IX+2),B    ; RETURN PARAMETERS
  489.     LD    (IX+3),C
  490.     POP    BC
  491.     RET
  492. ;
  493. ; PROCESS SR AND INTERRUPT RETURNS
  494. ;
  495. PRTI::    CALL    TSPD        ; RTI
  496.     INC    HL        ; GET TOS (FLAGS)
  497.     CALL    FETCHA
  498.     LD    (IX+1),A    ; RESTORE
  499.     CALL    PRET1
  500.     LD    BC,04A5H
  501.     JP    END1
  502. PRTS::    CALL    PRET        ; RTS...RESTORE PC
  503.     LD    BC,4A9H
  504.     JP    END1
  505. PRET::    CALL    TSPD
  506. PRET1::    INC    HL        ; POINT TO LAST ENTRY
  507.     CALL    FETCHA        ; RESTORE PC LO
  508.     LD    E,A
  509.     INC    HL        ; RESTORE PC HI
  510.     CALL    FETCHA
  511.     LD    D,A
  512.     JP    TDSP        ; GO RESTORE
  513. ;
  514. ; PROCESS SP EXCHANGES
  515. ;
  516. PTSS::    CP      90H           ; WHICH ONE IS IT?
  517.     JR      NZ,PTSX
  518. PTXS::    LD      A,(IX+2)    ; MOVE DATA FROM X...
  519.     LD      (IX+4),A    ; TO SP
  520.         LD      BC,4D9H
  521.     JP      END
  522. PTSX::    LD      A,(IX+4)    ; MOVE SP
  523.     LD      (IX+2),A    ; TO X REG
  524.         LD      C,0D1H
  525.     JP    COMPL        ; AND MODIFY FLAGS
  526. ;
  527. ; PROCESS ALL REMAINING IMPLIED INSTRUCTIONS
  528. ;
  529. PIMPL::    LD    C,A        ; OP CODE
  530.     SRL     C             ; GET MSD
  531.         SRL     C
  532.     SRL     C
  533.         SRL     C
  534.     AND    0FH        ; CHECK LSD
  535.     CP    8
  536.         LD      IY,IMPTBL    ; INDEX INTO TABLE
  537.     JP    Z,JPIB
  538.     LD      IY,IMPTBL+8
  539.     JP    JPIB
  540. ;
  541. ; IMPLIED INSTR PROCESSORS
  542. ;
  543. PINX::    INC     (IX+2)        ; INX
  544.     LD      C,65H
  545.         JR      IDEFLG
  546. PINY::    INC     (IX+3)        ; INY
  547.     LD      C,69H
  548.         JR      IDEFLG
  549. PDEX::    DEC     (IX+2)        ; DEX
  550.     LD      C,55H
  551.         JR      IDEFLG
  552. PDEY::    DEC     (IX+3)        ; DEY
  553.     LD      C,59H
  554. IDEFLG::RES    1,(IX+1)    ; SET/RES Z FLG
  555.     JR      NZ,SINTST    ; PER Z80 FLAGS
  556.         SET     1,(IX+1)
  557. SINTST::RES    7,(IX+1)    ; ALSO SIGN FLG
  558.         JP      P,ENDIT
  559.     SET     7,(IX+1)
  560.         JP      ENDIT
  561. PNOP::    LD    BC,485H        ; NOP
  562.     JP    END
  563. PPHA::    CALL    TSPD          ; PHA
  564.     LD      A,(IX+0)    ; ACCUM
  565.         LD      C,8DH
  566.     JR      DOPUSH    ; PUSH IT
  567. PPHP::    CALL    TSPD        ; PHP
  568.     LD      A,(IX+1)    ; P REG
  569.         LD      C,91H
  570. DOPUSH::PUSH    BC
  571.     CALL    SENDA        ; PLACE ON STACK
  572.     DEC     HL            ; BUMP SP DOWN
  573.         CALL    TDSP          ; & REPLACE IT
  574.     POP    BC
  575.         JP      ENDIT
  576. PPLA::    CALL    DOPULL        ; PLA
  577.     LD      (IX+0),A    ; DATA TO ACC
  578.     CALL    SINS1         ; SET/RES S,Z FLGS
  579.     CALL    TDSP        ; RESTORE SP
  580.         LD      BC,495H
  581.     JP      END
  582. PPLP::    CALL    DOPULL        ; PLP
  583.     LD      (IX+1),A    ; DATA TO P REG
  584.         CALL    TDSP          ; RESTORE SP
  585.     LD      BC,499H
  586.         JP      END
  587. DOPULL::CALL    TSPD        ; GET SP
  588.     INC     HL            ; BUMP SP
  589.     CALL    FETCHA        ; GET DATA
  590.     RET
  591. ;
  592. ; PROCESS ACC/INDEX TRANSFERS
  593. ;
  594. PTAX::    LD      A,(IX+0)    ; TAX
  595.     LD      (IX+2),A
  596.         LD      C,0C9H
  597.     JR      COMPL
  598. PTAY::    LD      A,(IX+0)    ; TAY
  599.     LD      (IX+3),A
  600.         LD      C,0CDH
  601.     JR      COMPL
  602. PTXA::    LD      A,(IX+2)    ; TXA
  603.     LD      (IX+0),A
  604.         LD      C,0D5H
  605.     JR    COMPL
  606. PTYA::    LD      A,(IX+3)    ; TYA
  607.     LD      (IX+0),A
  608.         LD      C,0DDH
  609. COMPL::    CALL    SINS1        ; SET/RES S,Z FLGS
  610.     JR    ENDIT
  611. ;
  612. ; PROCESS FLAG SET/RES INSTRUCTIONS
  613. ;
  614. PFLGS::    LD    IY,FLGTBL    ; TABLE START
  615.     LD    B,0
  616.     CP    0B8H        ; CLV SPECIAL
  617.     JR    NZ,PFL1
  618.     RES    5,A
  619. PFL1::    RRA            ; CHECK MSD
  620.     RRA
  621.     RRA
  622.     RRA
  623.     AND    0EH        ; MASK MSD + 1
  624.     BIT    1,A        ; TEST FOR SET/RES
  625.     LD    C,A        ; FORM TABLE INDEX
  626.     ADD    IY,BC
  627.     LD    C,(IY+0)    ; GET MNEM CODE
  628.     LD    A,(IY+1)    ; GET MASK
  629.     JR    NZ,PFL2
  630.     CPL            ; DO CLEARS
  631.     AND    (IX+1)
  632.     JR    PFL3
  633. PFL2::    OR    (IX+1)        ; DO SETS
  634. PFL3::    LD    (IX+1),A    ; AND STUFF IT
  635. ENDIT::    LD    B,4
  636.     JP    END
  637. ;
  638. ; PROCESS ALL INSTRUCTIONS HAVING MULTIPLE ADDRESSING
  639. ;
  640. MLTMOD::LD      BC,MLTEND    ; PUT RETURN ON STACK
  641.     PUSH    BC
  642.         CALL    FETCHA        ; GET INSTR TO A
  643.     LD      C,A           ; AND TO C
  644.         SRL     C             ; TEST EVEN/ODD
  645.     PUSH    AF
  646.         SRL     C             ; ROTATE MSD INTO LSD
  647.     SRL     C
  648.         SRL     C
  649.     RES     0,C           ; MASK LSB
  650.     POP    AF
  651.         LD      IY,EVNTBL    ; JUMP PER TABLES
  652.     JP    NC,JPIB
  653.     LD    IY,ODDTBL
  654.     JP    JPIB
  655. ;
  656. ; MULTI-MODE INSTRUCTION PROCESSORS
  657. ;
  658. PASL::    CALL    MODBBB        ; GET MODE,ADDR,&DATA
  659.     SLA     A             ; ASL
  660.         CALL    SINSET        ; SET/RES S,Z,C FLGS
  661.     CALL    PUTDAT        ; RESTORE DATA
  662.         LD      A,8
  663.     RET
  664. PBTRL::    BIT     1,A           ; BIT OR ROL?
  665.     JR      Z,PBIT
  666.         CALL    MODBBB        ; ROL
  667.     CALL    CARSET        ; SET UP C FLAG
  668. PROL1::    RLA                   ; DO ROTATE
  669.     CALL    SINSET
  670.         CALL    PUTDAT
  671.     LD      A,9CH
  672.         RET
  673. PBIT::    RES     6,(IX+1)    ; BIT
  674.     CALL    MODBBX
  675.         PUSH    BC
  676.     LD      B,A           ; SAVE IT IN B
  677.         LD      A,(IX+0)    ; GET SIM ACC
  678.     AND     B             ; AND IT
  679.         BIT     6,A           ; CHECK V BIT
  680.     JR      Z,PBIT1
  681.         SET     6,(IX+1)    ; SET V BIT IF REQD
  682. PBIT1::    CALL    SINS1         ; SET/RES S,Z FLGS
  683.     POP     BC
  684.         LD      A,18H
  685.     RET
  686. PLSR::    CALL    MODBBB        ; LSR
  687.     SRL     A
  688.         CALL    SINSET
  689.     CALL    PUTDAT
  690.         LD      A,80H
  691.     RET
  692. PROR::    CALL    MODBBB        ; ROR
  693.     CALL    CARSET        ; SET UP C FLG
  694. PROR1::    RRA                   ; DO ROTATE
  695.     CALL    SINSET
  696.         CALL    PUTDAT
  697.     LD      A,0A0H
  698.         RET
  699. PSTXY::    BIT     1,A           ; WHICH ONE?
  700.     JR      Z,PSY
  701.         CALL    MODBBX        ; STX
  702.     LD      A,(IX+2)
  703.     CALL    PUTDAT
  704.         LD      A,0C0H
  705.     RET
  706. PSY::    CALL    MODBBX        ; STY
  707.     LD      A,(IX+3)
  708.     CALL    PUTDAT
  709.         LD      A,0C4H
  710.     RET
  711. PLDXY::    BIT     1,A           ; WHICH ONE?
  712.     JR      Z,PLY
  713.         CALL    MODDDD        ; LDX
  714.     LD      (IX+2),A
  715.     CALL    SINS1
  716.         LD      A,78H
  717.     RET
  718. PLY::    CALL    MODDDD        ; LDY
  719.     LD      (IX+3),A
  720.     CALL    SINS1
  721.         LD      A,7CH
  722.     RET
  723. PDCY::    BIT     1,A           ; WHICH ONE?
  724.     JR      Z,PCPY
  725.         CALL    MODBBX        ; DEC
  726.     DEC     A
  727.         CALL    SINS1
  728.     CALL    PUTDAT
  729.         LD      A,50H
  730.     RET
  731. PICX::    BIT     1,A           ; WHICH ONE?
  732.     JR      Z,PCPX
  733.         CALL    MODBBX        ; INC
  734.     INC     A
  735.         CALL    SINS1
  736.     CALL    PUTDAT
  737.         LD      A,60H
  738.     RET
  739. PCPX::    CALL    CXY           ; CPX
  740.     CALL    SINSET
  741.         LD      A,48H
  742.     RET
  743. PCPY::    INC     IX
  744.     CALL    CXY           ; CPY
  745.         DEC     IX
  746.     CALL    SINSET
  747.         LD      A,4CH
  748.     RET
  749. CXY::    CALL    MODCC
  750.     PUSH    BC
  751.         LD      B,A           ; MEM DAT INTO B
  752.     LD      A,(IX+2)    ; X (Y) INTO A
  753.         SUB     B
  754.     CCF                   ; BORROW = 6502 /C
  755.         POP     BC
  756.     RET
  757. PSBC::    RES     6,(IX+1)    ; SBC...CLR V FLG
  758.     CALL    MODAAA
  759.         PUSH    BC
  760.     LD      B,A        ; DATA TO B
  761.         LD      A,(IX+0)    ; ACC TO A
  762.     CALL    CARSET        ; SET UP C FLAG
  763.     CCF            ; AND COMPLEMENT IT
  764. PSBC1::    BIT     3,(IX+1)    ; CHECK FOR DEC MODE
  765.     JR      NZ,PSDEC
  766.         SBC     A,B
  767.     JR      PSBC2
  768. PSDEC::    SBC     A,B           ; DECIMAL MODE
  769.     DAA
  770. PSBC2::    LD      (IX+0),A    ; RESULT TO ACCUM
  771.     CCF            ; BORROW = 6502 /C
  772.     CALL    SINSET
  773.     AND    0C0H        ; TEST XOR OF B6 & B7
  774.     JR    Z,SBC3
  775.     CP    0C0H
  776.     JR    Z,SBC3
  777.     SET     6,(IX+1)    ; SET V FLAG IF XOR = 1
  778. SBC3::    POP     BC
  779.         LD      A,0ACH
  780.     RET
  781. PORA::    CALL    MODAAA        ; ORA
  782.     PUSH    BC
  783.         LD      B,A           ; DATA TO B
  784.     LD      A,(IX+0)    ; ACC TO A
  785.         OR      B
  786.     LD      (IX+0),A    ; RESULT TO ACC
  787.         CALL    SINS1
  788.     POP     BC
  789.         LD      A,88H
  790.     RET
  791. PAND::    CALL    MODAAA        ; AND
  792.     PUSH    BC
  793.         LD      B,A           ; DATA TO B
  794.     LD      A,(IX+0)    ; ACC TO A
  795.         AND     B
  796.     LD      (IX+0),A    ; RESULT TO ACC
  797.         CALL    SINS1
  798.     POP     BC
  799.         LD      A,4
  800.     RET
  801. PEOR::    CALL    MODAAA        ; EOR
  802.     PUSH    BC
  803.         LD      B,A        ; DATA TO B
  804.     LD      A,(IX+0)    ; ACC TO A
  805.         XOR     B
  806.     LD      (IX+0),A    ; RESULT TO ACC
  807.         CALL    SINS1
  808.     POP     BC
  809.         LD      A,5CH
  810.     RET
  811. PADC::    RES     6,(IX+1)    ; ADC: CLEAR V FLAG
  812.     CALL    MODAAA
  813.         PUSH    BC
  814.     LD      B,A        ; DATA TO B
  815.         LD      A,(IX+0)    ; ACC TO A
  816.     CALL    CARSET        ; SET UP C FLG
  817. PADC1::    BIT     3,(IX+1)    ; CHECK FOR DEC MODE
  818.     JR      NZ,PADEC
  819.         ADC     A,B           ; BINARY MODE
  820.     JR      PADC2
  821. PADEC::    ADC     A,B           ; DECIMAL MODE
  822.     DAA
  823. PADC2::    LD      (IX+0),A    ; RESULT TO ACC
  824.     CALL    SINSET
  825.     AND    0C0H        ; CHECK XOR OF B6 & B7
  826.     JR    Z,PADC3
  827.     CP    0C0H
  828.     JR    Z,PADC3
  829.     SET     6,(IX+1)    ; SET V FLG IF XOR = 1
  830. PADC3::    POP     BC
  831.     LD      A,0
  832.         RET
  833. PSTA::    CALL    MODAAA        ; STA
  834.     LD      A,(IX+0)    ; ACC TO MEM
  835.         CALL    PUTDAT
  836.     LD      A,0BCH
  837.         RET
  838. PLDA::    CALL    MODAAA        ; LDA
  839.     LD      (IX+0),A    ; MEM TO ACC
  840.         CALL    SINS1
  841.     LD      A,74H
  842.         RET
  843. PCMP::    CALL    MODAAA        ; CMP
  844.     PUSH    BC
  845.         LD      B,A           ; DATA TO B
  846.     LD      A,(IX+0)    ; ACC TO A
  847.         SUB     B
  848.     CCF                   ; BORROW = 6502 /C
  849.         CALL    SINSET
  850.     POP     BC
  851.         LD      A,44H
  852.     RET
  853. ;
  854. ; END OF ALL MULTI MODE PROCESSORS
  855. ;
  856. MLTEND::PUSH    AF        ; SAVE MNEMONIC CODE
  857.     LD    A,0        ; TURN OFF ACCUM MODE FLAG
  858.     LD    (ACCFLG),A
  859.     POP    AF
  860.     ADD     A,C        ; FORM MNEM CODE IN C
  861.     LD      C,A
  862. END::    INC     HL        ; POINT TO NXT INSTR
  863. END1::    LD      (NPC),HL
  864.     RET            ; BACK TO CMND
  865. ;
  866. ; VARIOUS SUBROUTINES FOR TRANSLATOR
  867. ;
  868. ; SET Z80 C FLAG TO MATCH 6502 C FLG
  869. ;
  870. CARSET::SCF
  871.     BIT    0,(IX+1)
  872.     RET    NZ
  873.     CCF
  874.     RET
  875. ;
  876. ; SET SIMULATOR S,Z,C FLAGS PER Z80 RESULTS
  877. ;
  878. SINSET::RES     0,(IX+1)    ; RESET C FLAG
  879.     JR      NC,SINS1
  880.         SET     0,(IX+1)    ; SET C PER Z80 C
  881. SINS1::    RES     1,(IX+1)    ; CLEAR Z FLAG
  882.     OR      A             ; SEE IF ACC = 0
  883.         JR      NZ,SINS2
  884.     SET     1,(IX+1)    ; SET Z FLG
  885. SINS2::    RES     7,(IX+1)    ; CLEAR SIGN FLAG
  886.     BIT     7,A           ; CHECK SIGN OF ACC
  887.         RET     Z
  888.     SET     7,(IX+1)    ; SET S IF NECESSARY
  889.         RET
  890. ;
  891. ; TRANSFER SIMULATOR SP TO/FROM HL
  892. ;
  893. TSPD::    LD      D,1           ; XFER SP TO DE
  894.         LD      E,(IX+4)
  895.     EX    DE,HL        ; PC TO DE, SP TO HL
  896.     RET
  897. TDSP::    EX    DE,HL        ; PC TO HL, SP TO DE
  898.     LD    (IX+4),E    ; RESTORE SP
  899.         RET
  900. ;
  901. ; ADDRESS MODE DECODERS...RETURN WITH DATA TO BE MODIFIED
  902. ; IN A, ADDRESS MODE CODE IN B, # BYTES IN C, ADDRESS OF
  903. ; DATA IN DE
  904. ;
  905. MODAAA::LD      IY,AAATBL    ; GROUP 1
  906.     JR      MOD1
  907. MODBBB::LD      IY,BBBTBL    ; GROUP 2
  908.     JR      MOD1
  909. MODDDD::LD      IY,DDDTBL    ; GROUP 3
  910.         CP      0B6H          ; LDX ZPG,Y SPECIAL
  911.     JR      NZ,DDD1
  912.         LD      A,10H
  913. DDD1::    CP      0BEH          ; LDX ABS,Y SPECIAL
  914.     JR      NZ,MOD1
  915.         LD      A,18H
  916.     JR      MOD1
  917. MODBBX::LD      IY,BBXTBL    ; GROUP 4 & 6
  918.         CP      96H           ; STX ZPG,Y SPECIAL
  919.     JR      Z,BBX
  920.     RRA            ; EXTRA SHIFT
  921.     AND    0CH        ; EXTRA MASK
  922.     JR    MOD1
  923. BBX::    LD    A,10H        ; SPECIAL
  924.     JR    MOD1
  925. MODCC::    LD      IY,CCTBL    ; GROUP 5
  926. MOD1::    RRA                   ; ROTATE MODE INTO LSD
  927.         AND     0EH           ; MASK THE REST
  928.         LD      B,0           ; FORM OFFSET IN BC
  929.     LD      C,A
  930.         ADD     IY,BC         ; ADD TO TABLE START
  931.     LD      C,(IY+0)    ; MODE OFFSET
  932.         LD      B,(IY+1)    ; # CODE
  933.     PUSH    BC            ; SAVE FOR LATER
  934. GETDAT::LD      IY,GETTBL    ; JUMP TABLE
  935.     JP    JPIB
  936. PABY::    INC     HL            ; ABS,Y
  937.     CALL    FETCHA        ; 2ND BYTE INSTR
  938.         ADD     A,(IX+3)    ; PLUS Y INDEX
  939.     LD      E,A           ; TO E
  940.         INC     HL
  941.     CALL    FETCHA        ; 3RD BYTE INSTR
  942.         ADC     A,0           ; PLUS CARRY
  943.     LD      D,A           ; TO D
  944.         JP      EXIT
  945. PIMM::    INC     HL            ; IMMEDIATE
  946.     CALL    FETCHA        ; DATA TO ACC
  947.         JR      EX1
  948. PACX::    LD    A,1        ; SET ACCUM MODE FLAG
  949.     LD    (ACCFLG),A
  950.     LD      A,(IX+0)    ; ACCUM
  951.     PUSH    IX
  952.         POP     DE
  953.     JR      EX1
  954. PZPG::    INC     HL            ; ZPG
  955.     CALL    FETCHA
  956.     LD      E,A        ; ADDRESS TO DE
  957.         LD      D,0
  958.     JR      EXIT
  959. PAB::    INC     HL            ; ABSOLUTE
  960.     CALL    FETCHA
  961.     LD      E,A        ; ADDRESS TO DE
  962.         INC     HL
  963.     CALL    FETCHA
  964.     LD      D,A
  965.         JR      EXIT
  966. PZX::    LD      A,(IX+2)    ; ZPG,X...GET X INDEX
  967.     JR      PZ1
  968. PZY::    LD      A,(IX+3)    ; ZPG,Y...GET Y INDEX
  969. PZ1::    INC     HL
  970.     PUSH    BC        ; GET A WORK REG
  971.     LD    B,A        ; SAVE IN B
  972.     CALL    FETCHA        ; GET BASE ADRS
  973.     ADD    A,B        ; ADD IT IN
  974.     POP    BC
  975.         LD      E,A           ; PUT IN E
  976.     LD      D,0           ; ZERO PAGE, NO WRAP
  977.         JR      EXIT
  978. PZIX::    INC     HL            ; (ZPG,X)
  979.     CALL    FETCHA        ; 2ND BYTE INSTR
  980.         ADD     A,(IX+2)    ; ADD X INDEX
  981.     LD      E,A           ; TO FORM BASE ADDRESS...
  982.         LD      D,0           ; IN ZERO PG, NO WRAP
  983.     LD      IY,0
  984.         ADD     IY,DE         ; TRANSFER TO IY
  985.     LD      E,(IY+0)    ; EFF ADDR TO DE
  986.         LD      D,(IY+1)
  987.     JR      EXIT
  988. PZIY::    INC     HL            ; (ZPG),Y
  989.     CALL    FETCHA
  990.     LD      E,A        ; BASE ADDRESS
  991.         LD      D,0           ; IN ZERO PAGE
  992.     LD      IY,0
  993.         ADD     IY,DE         ; TRANSFER TO IY
  994.     LD      A,(IY+0)    ; EFF ADDRESS...
  995.         ADD     A,(IX+3)    ; PLUS Y INDEX...
  996.     LD      E,A           ; TO DE
  997.         LD      A,(IY+1)
  998.     ADC     A,0
  999.         LD      D,A
  1000.     JR      EXIT
  1001. PABX::    INC     HL            ; ABS,X
  1002.     CALL    FETCHA        ; 2ND BYTE INSTR
  1003.         ADD     A,(IX+2)    ; PLUS X INDEX
  1004.     LD      E,A           ; TO E
  1005.         INC     HL            ; 3RD BYTE INSTR
  1006.     CALL    FETCHA
  1007.         ADC     A,0           ; PLUS CARRY
  1008.     LD      D,A           ; TO E
  1009. EXIT::    EX    DE,HL
  1010.     CALL    FETCHA        ; GET DATA
  1011.     EX    DE,HL
  1012. EX1::    POP     BC            ; RESTORE # CODE
  1013.     PUSH    AF            ; SAVE DATA
  1014.         LD      A,3
  1015.     AND     B             ; # BYTES...
  1016.         LD      C,A           ; TO C
  1017.     SRL     B
  1018.         SRL     B             ; B=ADDR MODE
  1019.     POP     AF            ; RESTORE DATA
  1020.         RET
  1021. ;
  1022. ; STORE DATA TO ADDRESS FROM GETDAT
  1023. ;
  1024. PUTDAT::EX    DE,HL
  1025.     PUSH    AF        ; SAVE OUTPUT BYTE
  1026.     LD    A,(ACCFLG)    ; GET ACCUMULATOR MODE FLAG
  1027.     OR    A        ; TEST IT
  1028.     JR    Z,P65MEM    ; GO STORE IN 6502 MEMORY IF OFF
  1029.     LD    A,0        ; NOPE, TURN OFF FLAG
  1030.     LD    (ACCFLG),A
  1031.     POP    AF        ; HL HAS POINTER TO ACCUMULATOR
  1032.     LD    (HL),A        ; (IN Z80 MEMORY SPACE)
  1033.     EX    DE,HL
  1034.     RET
  1035. P65MEM:    POP    AF        ; GET BYTE TO SEND
  1036.     CALL    SENDA
  1037.     EX    DE,HL
  1038.     RET
  1039. ;
  1040. ; INDEX INTO JUMP TABLES...ENTER WITH TABLE START
  1041. ; ADDRESS IN IY AND OFFSET IN C. CALCULATES TABLE
  1042. ; POSITION AND JUMPS TO RESULT
  1043. ;
  1044. JPIB::    LD    B,0        ; INDIRECT JUMP PER TABLE
  1045.     ADD    IY,BC        ; TABLE ADDRESS TO IY
  1046.     LD    C,(IY+0)    ; TABLE ENTRY TO BC
  1047.     LD    B,(IY+1)
  1048.     PUSH    BC
  1049.     POP    IY        ; ENTRY TO IY
  1050.     JP    (IY)        ; AND GO TO IT
  1051. ;
  1052. ; ELEMENTARY MONITOR FUNCTIONS TO EXAMINE A BLOCK OF
  1053. ; MEMORY LOCATIONS (E) AND TO CHECK AND UPDATE
  1054. ; INDIVIDUAL LOCATIONS (M)
  1055. ;
  1056. EXAM::    LD    DE,GETADR    ; EXAM BLOCK OF MEM
  1057.     CALL    PRTDE
  1058.     CALL    GETWRD        ; GET START ADDR
  1059.     PUSH    DE
  1060.     CALL    LINF
  1061.     LD    DE,GETN
  1062.     CALL    PRTDE
  1063.     CALL    GETWRD        ; GET # BYTES
  1064.     PUSH    DE
  1065.     POP    BC
  1066.     LD    E,4        ; CHANGE TO # LINES (/16)
  1067.     XOR    A
  1068. BYTLN::    SRL    B
  1069.     RR    C
  1070.     JR    NC,XXX
  1071.     INC    A
  1072. XXX::    DEC    E
  1073.     JR    NZ,BYTLN
  1074.     OR    A        ; SEE IF PARTIAL LINE
  1075.     JR    Z,YYY
  1076.     INC    BC
  1077. YYY::    POP    HL        ; HL = START, BC = COUNT
  1078.     DEC    BC        ; ONE LESS LINE
  1079. EXLP::    PUSH    BC        ; LOOP FOR ONE LINE
  1080.     CALL    CRLF
  1081.     CALL    LADR        ; PRINT ADDRESS AT START
  1082.     CALL    TWO        ; INSERT TWO SPACES
  1083.     PUSH    HL        ; SAVE ADDRESS FOR ALPHA
  1084.     LD    E,16        ; 16 ENTRIES PER LINE
  1085. LNLP::    CALL    FETCHA        ; GET BYTE FROM MEMORY
  1086.     CALL    PACC        ; PRINT IT HEX
  1087.     CALL    ONE        ; SPACE
  1088.     INC    HL        ; POINT TO NEXT BYTE
  1089.     DEC    E        ; DONE WITH HEX?
  1090.     JR    NZ,LNLP    ; NO, DO NEXT BYTE
  1091.     CALL    TWO        ; YES, SET UP FOR ALPHA
  1092.     POP    HL        ; SAME STARTING ADDRESS
  1093.     LD    E,16
  1094. ASCII::    CALL    FETCHA        ; GET BYTE
  1095.     CP    20H        ; IS IT PRINTABLE?
  1096.     JR    C,DOT
  1097.     CP    80H
  1098.     JR    C,ASOK
  1099. DOT::    LD    A,'.'        ; NO, PRINT A DOT
  1100. ASOK::    CALL    PRNA
  1101.     INC    HL        ; BUMP POINTER
  1102.     DEC    E        ; DONE WITH LINE?
  1103.     JR    NZ,ASCII
  1104.     POP    BC
  1105.     LD    A,B        ; SEE IF ALL DONE
  1106.     OR    C
  1107.     RET    Z        ; YES, RET TO CMND
  1108.     DEC    BC
  1109.     JR    EXLP        ; ELSE DO ANOTHER LINE
  1110. ;
  1111. ; SUBSTITUTE MEMORY...ENTER BY 'M'
  1112. ;
  1113. SUBM::    LD    DE,GETADR    ; ASK FOR ADDRESS
  1114.     CALL    PRTDE
  1115.     CALL    GETWRD        ; GET IT
  1116.     EX    DE,HL        ; MOVE IT TO HL
  1117. SULP::    CALL    CRLF
  1118.     CALL    LADR        ; PRINT THE ADDRESS
  1119.     CALL    TWO
  1120.     CALL    FETCHA
  1121.     CALL    PACC        ; PRINT THE CONTENTS
  1122.     CALL    TWO
  1123. JLP::    CALL    GETCHR        ; GET INPUT
  1124.     CP    2EH        ; EXIT ON "."
  1125.     RET    Z
  1126.     CP    20H
  1127.     JR    Z,FWD        ; SKIP AHEAD ON "SPACE"
  1128.     CALL    CONV        ; CONV HEX IF POSSIBLE
  1129.     JR    Z,JLP        ; NOT A HEX NUMBER
  1130.     PUSH    HL        ; SAVE ADDRESS AGAIN
  1131.     LD    HL,0        ; CLEAR FOR ROTATE
  1132. LLP::    CALL    ROBYT        ; ROTATE NYBBLE INTO HL
  1133. KLP::    CALL    GETCHR        ; GET ANOTHER CHARACTER
  1134.     CP    0DH
  1135.     JR    Z,PUTIN    ; IF "CR" STUFF IT
  1136.     CALL    CONV        ; CONV BINARY
  1137.     JR    Z,KLP        ; NOT A HEX NUMBER
  1138.     JR    LLP        ; CONTINUE
  1139. PUTIN::    PUSH    HL        ; DATA TO BC
  1140.     POP    BC
  1141.          POP    HL        ; RETRIEVE ADDRESS
  1142.     LD    A,C
  1143.     CALL    SENDA        ; STUFF THE DATA
  1144. FWD::    INC    HL        ; BUMP POINTER
  1145.     JR    SULP        ; ...AND CONTINUE
  1146. LADR::    EX    DE,HL        ; PRINT WORD IN HL
  1147.     CALL    PRTWRD
  1148.     EX    DE,HL
  1149.     RET
  1150. PACC::    PUSH    DE        ; PRINT BYTE IN A
  1151.     LD    E,A
  1152.     CALL    PRTBYT
  1153.     POP    DE
  1154.     RET
  1155. TWO::    CALL    ONE        ; PRINT 2 SPACES
  1156. ONE::    PUSH    BC        ; PRINT SPACE
  1157.     LD    C,' '
  1158.     CALL    PRNC
  1159.     POP    BC
  1160.     RET
  1161. ;
  1162. ; VARIOUS ROUTINES USED BY TRANSLATOR, MONITOR, AND DOS
  1163. ;
  1164. CRLF::    LD      C,0DH        ; PRINT CRLF
  1165.     CALL    PRNC
  1166. LINF::    LD      C,0AH
  1167.     JP      PRNC
  1168. PROM::    LD      C,' '        ; PRINT ' >'
  1169.     CALL    PRNC
  1170.         LD      C,'>'
  1171.     JP      PRNC
  1172. ;
  1173. ; GET HEX DATA IN DE. ROTATE CONTINUOUSLY UNTIL A
  1174. ; 'CR' IS INPUT. LSB IN E. SET Z FLG AND RET ON 'SPACE'
  1175. ;
  1176. GETWRD::CALL    GETCHR        ; GET BINARY DATA
  1177.     CP      ' '           ; RET Z IF SPACE
  1178.         RET     Z
  1179.     EX      DE,HL
  1180.         LD      HL,0          ; CLEAR HOLDING REG
  1181.     CALL    CONV        ; CHANGE TO HEX
  1182.     JR    Z,GETWRD    ; INVALID CHAR
  1183.     CALL    ROBYT        ; ROTATE INTO HL
  1184. WRDLP::    CALL    GETCHR        ; GET NEXT CHAR
  1185.     CP      0DH           ; TERMINATOR
  1186.     JR    Z,WRDON
  1187.     CALL    CONV
  1188.     JR    Z,WRDLP
  1189.     CALL    ROBYT
  1190.     JR    WRDLP
  1191. WRDON::    OR      A             ; CLEAR Z FLAG
  1192.         EX      DE,HL         ; DATA INTO DE
  1193.     RET
  1194. ;
  1195. ; CONVERT ASCII DATA IN A TO HEX. SET Z FLG IF INVALID
  1196. ;
  1197. CONV::    CP      '0'           ; CONVERT TO BINARY
  1198.     JR      C,BAD
  1199.         CP      3AH
  1200.     JR      C,GOOD
  1201.         CP      41H
  1202.     JR      C,BAD
  1203.         CP      47H
  1204.     JR      C,GOOD
  1205. BAD::    LD      C,'?'
  1206.     CALL    PRNC        ; NOTIFY BAD INPUT
  1207.     XOR    A        ; SET Z FLAG
  1208.     RET
  1209. GOOD::    SUB     30H
  1210.     CP      10
  1211.     JR      C,GOOD1
  1212.     SUB     7
  1213. GOOD1::    CP    0FFH        ; CLEAR Z FLAG
  1214.     RET
  1215. ;
  1216. ; ROTATE BYTE IN A INTO HL VIA L
  1217. ;
  1218. ROBYT::    ADD    HL,HL        ; ROTATE A INTO HL
  1219.     ADD     HL,HL        ; ROTATE HL 4 BITS LEFT
  1220.     ADD     HL,HL
  1221.     ADD     HL,HL
  1222.     OR      L             ; PUT NEW DIGIT INTO L
  1223.     LD      L,A
  1224.     RET
  1225. ;
  1226. ; PRINT FOUR DIGIT VALUE IN DE
  1227. ;
  1228. PRTWRD::LD      A,D
  1229.     CALL    PRBIN
  1230. PRTBYT::LD      A,E           ; PRINT VALUE IN E
  1231. PRBIN::    PUSH    AF
  1232.     RRC     A
  1233.     RRC     A
  1234.     RRC     A
  1235.     RRC     A
  1236.     CALL    PRB1
  1237.     POP     AF
  1238. PRB1::    AND     0FH
  1239.     ADD     A,90H
  1240.     DAA
  1241.     ADC     A,40H
  1242.     DAA
  1243.     JR      PRNA
  1244. ;
  1245. ; PRINT STRING POINTED TO BY DE. USES PRTXT
  1246. ;
  1247. PRTDE::    PUSH    IY        ; PRNT PER DE
  1248.     PUSH    DE
  1249.     POP    IY
  1250.     CALL    PRTXT
  1251.     POP    IY
  1252.     RET
  1253. ;
  1254. ; PRINT ASCII STRING POINTED TO BY IY. CHECK FOR
  1255. ; SPECIALS: '1' PRINTS AS BYTE POINTED TO BY HL, '2'
  1256. ; PRINTS (HL+1), '!' DOES NOT PRINT, '^' TERMINATES.
  1257. ;
  1258. PRTXT::    LD      E,0           ; PRNT UP TO 255 CHRSY
  1259. PRNLP::    LD      A,(IY+0)
  1260.     CP      '^'        ; TERMINATOR?
  1261.     RET     Z
  1262.     CP      '!'        ; NO PRINT?
  1263.     JR      Z,DONXT+1
  1264.     PUSH    DE
  1265.     LD      HL,(CPC)
  1266.     INC     HL
  1267.     CP      '2'        ; PRINT (HL+1)?
  1268.     JR      NZ,PRN1
  1269.     INC     HL
  1270.     CALL    FETCHA
  1271.     LD      E,A
  1272.     CALL    PRTBYT
  1273.     JR      DONXT
  1274. PRN1::    CP      '1'        ; PRINT (HL)?
  1275.     JR      NZ,DOALPH
  1276.     CALL    FETCHA
  1277.     LD      E,A
  1278.     CALL    PRTBYT
  1279.     JR      DONXT
  1280. DOALPH::LD      C,A        ; ALL OTHER CHARACTERS
  1281.     CALL    PRNC
  1282. DONXT::    POP     DE
  1283.     INC     IY
  1284.     DEC     E
  1285.     JR      NZ,PRNLP
  1286.     RET
  1287. ;
  1288. SPAC::    PUSH    BC            ; PRINT 6 SPACES
  1289.     LD      B,6
  1290.     LD      C,' '
  1291. SPLP::    CALL    PRNC
  1292.     DJNZ    SPLP
  1293.     POP     BC
  1294.     RET
  1295. ;
  1296. ; CONSOLE I/O
  1297. ;
  1298. GETCHR::CALL    KBIN         ; GET CHAR & TEST
  1299.     CP    3        ; ^C....
  1300.     JP    Z,CPWRM        ; CP/M WARM START
  1301.     CP    18H        ; ^X (CAN)...
  1302.     JR    NZ,PRNA
  1303.     LD    SP,SYSTK-2    ; FOR RET TO CMND
  1304.     LD    A,'#'
  1305. PRNA::    LD      C,A        ; PRINT CHAR IN A
  1306.     CALL    PRNC
  1307.     RET
  1308. ;
  1309. ; VECTOR TABLE COPY MOVED FROM BIOS
  1310. ;
  1311. VECTBL    EQU    $
  1312. ;
  1313. CPMCLD::JP    $-$        ; VECTOR TABLE FILLED IN..
  1314. CPWRM::    JP    $-$        ; ...AT STARTUP
  1315. KBST::    JP      $-$
  1316. KBIN::    JP    $-$
  1317. PRNC::    JP    $-$
  1318.     JP    $-$        ;LIST
  1319.     JP    $-$        ;PUNCH
  1320.     JP    $-$        ;READER
  1321. HOMB::    JP    $-$
  1322. DRVS::    JP    $-$
  1323. TRKS::    JP    $-$
  1324. SECS::    JP    $-$
  1325. BUFS::    JP    $-$
  1326. RDONE::    JP    $-$
  1327. WRONE::    JP    $-$
  1328. ;
  1329. ; HISTOGRAM BUFFER
  1330. ;
  1331. HSBUFR::
  1332.     REPT    HSIZE
  1333.     DW    0        ;INIT TO ZEROES
  1334.     ENDM
  1335. ;
  1336. ;
  1337. ; JUMP TABLE FOR LINKS TO Z80 ROUTINES...FILL IN AS REQD
  1338. ; FIRST TWO INITIALIZED TO CONSOLE I/O VIA ACC
  1339. ;
  1340. USR0::    JP    KBIN        ; 6502 USER ROUTINES
  1341. USR1::    JP    PRNA
  1342. USR2::    DEFB    0C9H,0,0
  1343. USR3::    DEFB    0C9H,0,0
  1344. USR4::    DEFB    0C9H,0,0
  1345. ;
  1346. ; 6502 BREAK VECTOR...INIT TO GO TO COMMAND LEVEL
  1347. ;
  1348. IPOINT::DEFW    0
  1349. ;
  1350. ; TEMPORARIES FOR TRANSLATOR
  1351. ;
  1352. NSTEPS::DEFB    1             ; # STEPS TO EXECUTE
  1353. NBYTES::DEFB    0             ; # BYTES IN INSTR
  1354. DLYCON::DEFW    0A00H        ; TIME DELAY FOR # STEP
  1355. BREAK:: DEFW    0             ; BREAKPOINT ADDRESS
  1356. ACCFLG::DEFB    0        ; MODE=ACCUM FLAG
  1357. ;
  1358. ; SIMULATED 6502 CPU REGISTERS...INIT TO THESE VALUES
  1359. ;
  1360. VREG::    DEFB    0             ; ACCUMULATOR
  1361.     DEFB    0             ; STATUS (P) REG
  1362.     DEFB    0             ; X INDEX REG
  1363.     DEFB    0             ; Y INDEX REG
  1364.     DEFB    0FFH          ; STACK POINTER
  1365. CPC::    DEFW    1000H         ; PROGRAM COUNTER
  1366. NPC::    DEFW    1000H          ; LOCATION OF NXT INSTR
  1367. ;
  1368. ; VARIOUS MESSAGES FOR SYSTEM
  1369. ;
  1370. INTRO::    DEFM    '*  ZX/65 65xx SIMULATOR *^'
  1371. HEADR::    DEFM    ' CPC:  INS:  A:... P:...'
  1372.     DEFM    ' X:... Y:... SP:.. NPC: '
  1373. GETADR::DEFM    ' ENTER START ADDRESS: ^'
  1374. GETN::    DEFM    ' ENTER NO. BYTES: ^'
  1375. MLTMSG::DEFM    ' ENTER # STEPS: ^'
  1376. BKPMSG::DEFM    ' ENTER BRKP ADDR: ^'
  1377. ;
  1378. ; DATA TABLES FOR TRANSLATOR BEGIN HERE
  1379. ;
  1380. ; ADDRESSING MODE TABLES
  1381. ;
  1382. AAATBL::DEFW    1A0CH         ; (ZPG,X)
  1383.     DEFW    0E04H         ; ZPG
  1384.     DEFW    0600H         ; IMM
  1385.     DEFW    0B06H         ; ABS
  1386.     DEFW    1E0EH         ; (ZPG),Y
  1387.     DEFW    2208H         ; ZPG,X
  1388.     DEFW    2F12H         ; ABS,Y
  1389.     DEFW    2B10H         ; ABS,X
  1390. BBBTBL::DEFW    0             ; INVALID
  1391.     DEFW    0E04H         ; ZPG
  1392.     DEFW    1502H         ; ACC
  1393.     DEFW    0B06H         ; ABS
  1394.     DEFW    260AH         ; ZPG,Y
  1395.     DEFW    2208H         ; ZPG,X
  1396.     DEFW    2F12H         ; ABS,Y
  1397.     DEFW    2B10H         ; ABS,X
  1398. DDDTBL::DEFW    0600H         ; IMM
  1399.     DEFW    0E04H         ; ZPG
  1400.     DEFW    0             ; INVALID
  1401.     DEFW    0B06H         ; ABS
  1402.     DEFW    260AH         ; ZPG,Y
  1403.     DEFW    2208H         ; ZPG,X
  1404.     DEFW    2F12H         ; ABS,Y
  1405.     DEFW    2B10H         ; ABS,X
  1406. BBXTBL::DEFW    0E04H         ; ZPG
  1407.     DEFW    0B06H         ; ABS
  1408.     DEFW    2208H         ; ZPG,X
  1409.     DEFW    2B10H         ; ABS,X
  1410.     DEFW    260AH        ; ZPG,Y
  1411. CCTBL::    DEFW    0600H         ; IMM
  1412.     DEFW    0E04H         ; ZPG
  1413.     DEFW    0             ; INVALID
  1414.     DEFW    0B06H         ; ABS
  1415. ;
  1416. ; BRANCH MASK TABLE
  1417. ;
  1418. MSKTBL::DEFW    8026H         ; BPL
  1419.     DEFW    801EH         ; BMI
  1420.     DEFW    402EH         ; BVC
  1421.     DEFW    4032H         ; BVS
  1422.     DEFW    010EH         ; BCC
  1423.     DEFW    0112H         ; BCS
  1424.     DEFW    0222H         ; BNE
  1425.     DEFW    0216H         ; BEQ
  1426. ;
  1427. ; FLAG SET/RESET CODES
  1428. ;
  1429. FLGTBL::DEFW    0135H          ; CLC
  1430.     DEFW    01B1H        ; SEC
  1431.     DEFW    043DH        ; CLI
  1432.     DEFW    04B9H        ; SEI
  1433.     DEFW    4041H        ; CLV
  1434.     DEFW    0000        ; INVALID
  1435.     DEFW    0839H        ; CLD
  1436.     DEFW    08B5H        ; SED
  1437. ;
  1438. ; JUMP TABLES TO IMPLIED INSTRUCTIONS
  1439. ;
  1440. IMPTBL::DEFW    PPHP          ; IMPLIED INSTR TABLE
  1441.     DEFW    PPLP
  1442.     DEFW    PPHA
  1443.     DEFW    PPLA
  1444.     DEFW    PDEY
  1445.     DEFW    PTAY
  1446.     DEFW    PINY
  1447.     DEFW    PINX
  1448.     DEFW    PTXA
  1449.     DEFW    PTAX
  1450.     DEFW    PDEX
  1451.     DEFW    PNOP
  1452. ;
  1453. ; JUMP TABLE TO ADDR MODE PROCESSORS
  1454. ;
  1455. GETTBL::DEFW    PIMM          ; INSTR MODE TABLE
  1456.     DEFW    PACX
  1457.     DEFW    PZPG
  1458.     DEFW    PAB
  1459.     DEFW    PZX
  1460.     DEFW    PZY
  1461.     DEFW    PZIX
  1462.     DEFW    PZIY
  1463.     DEFW    PABX
  1464.     DEFW    PABY
  1465. ;
  1466. ; JUMP TABLES TO MULTI-MODE PROCESSORS
  1467. ;
  1468. EVNTBL::DEFW    PASL          ; JUMPS TO PROCESSORS
  1469.     DEFW    PBTRL
  1470.     DEFW    PLSR
  1471.     DEFW    PROR
  1472.     DEFW    PSTXY
  1473.     DEFW    PLDXY
  1474.     DEFW    PDCY
  1475.     DEFW    PICX
  1476. ODDTBL::DEFW    PORA
  1477.     DEFW    PAND
  1478.     DEFW    PEOR
  1479.     DEFW    PADC
  1480.     DEFW    PSTA
  1481.     DEFW    PLDA
  1482.     DEFW    PCMP
  1483.     DEFW    PSBC
  1484. ;
  1485. ; MNEMONIC ASCII CODES (PACKED INTO 2 BYTES)
  1486. ;
  1487. MNMTBL::DEFW    0483H          ; MNEMONIC TABLE
  1488.     DEFW    05C4H
  1489.     DEFW    066CH
  1490.     DEFW    0863H         ; BCC
  1491.     DEFW    0873H
  1492.     DEFW    08B1H
  1493.     DEFW    0934H
  1494.     DEFW    09A9H
  1495.     DEFW    09C5H
  1496.     DEFW    0A0CH
  1497.     DEFW    0A4BH
  1498.     DEFW    0AC3H
  1499.     DEFW    0AD3H
  1500.     DEFW    0D83H         ; CLC
  1501.     DEFW    0D84H
  1502.     DEFW    0D89H
  1503.     DEFW    0D96H
  1504.     DEFW    0DB0H
  1505.     DEFW    0E18H
  1506.     DEFW    0E19H
  1507.     DEFW    10A3H        ; DEC
  1508.     DEFW    10B8H
  1509.     DEFW    10B9H
  1510.     DEFW    15F2H        ; EOR
  1511.     DEFW    25C3H        ; INC
  1512.     DEFW    25D8H
  1513.     DEFW    25D9H
  1514.     DEFW    29B0H        ; JMP
  1515.     DEFW    2A72H
  1516.     DEFW    3081H        ; LDA
  1517.     DEFW    3098H
  1518.     DEFW    3099H
  1519.     DEFW    3272H
  1520.     DEFW    39F0H        ; NOP
  1521.     DEFW    3E41H        ; ORA
  1522.     DEFW    4101H        ; PHA
  1523.     DEFW    4110H
  1524.     DEFW    4181H
  1525.     DEFW    4190H
  1526.     DEFW    49ECH        ; ROL
  1527.     DEFW    49F2H
  1528.     DEFW    4A89H
  1529.     DEFW    4A93H
  1530.     DEFW    4C43H        ; SBC
  1531.     DEFW    4CA3H
  1532.     DEFW    4CA4H
  1533.     DEFW    4CA9H
  1534.     DEFW    4E81H
  1535.     DEFW    4E98H
  1536.     DEFW    4E99H
  1537.     DEFW    5038H        ; TAX
  1538.     DEFW    5039H
  1539.     DEFW    5278H
  1540.     DEFW    5301H
  1541.     DEFW    5313H
  1542.     DEFW    5321H
  1543. ;
  1544. ; ADDRESS MODE PRINT TABLE
  1545. ;
  1546. AMDTBL::DEFM    ' $1    !'     ; ADDR MODE TABLE...REL
  1547.     DEFM    ' #$1   !'     ; IMMEDIATE
  1548.     DEFM    ' $21  !!'     ; ABS
  1549.     DEFM    ' $1    !'     ; ZPG
  1550.     DEFM    '        '     ; IMPLIED
  1551.     DEFM    ' A      '     ; ACCUM
  1552.     DEFM    ' ($1,X)!'     ; (ZPG,X)
  1553.     DEFM    ' ($1),Y!'     ; (ZPG),Y
  1554.     DEFM    ' $1,X  !'     ; ZPG,X
  1555.     DEFM    ' $1,Y  !'     ; ZPG,Y
  1556.     DEFM    ' $21,X!!'     ; ABS,X
  1557.     DEFM    ' $21,Y!!'     ; ABS,Y
  1558.     DEFM    ' ($21)!!'     ; INDIRECT
  1559. ;
  1560. ;
  1561.     DEFS    200           ; STACK AREA
  1562. ;
  1563. SYSTK    EQU    $
  1564. ;
  1565. ;
  1566. ; THAT'S ALL!
  1567. ;
  1568.     END
  1569.