home *** CD-ROM | disk | FTP | other *** search
Text File | 1984-04-29 | 38.7 KB | 1,777 lines |
- NAME ZXMAIN
- TITLE ZX65 VER 2.1 8/80 RMK
- ;
- ; V 2.1 OF ZX65 IS MODIFIED TO BE LINKED AT ASSEMBLY
- ; TIME WITH ZXLD V 2.1. THIS COMBINATION IS TOTALLY
- ; RELOCATABLE, AND WILL FUNCTION UNDER ANY CPM 1.4
- ; SYSTEM SIZE. FORMAT IS FOR SD SYSTEMS ASSEMBLER
- ; V 3.3 AND LINKER V 3.0
- ;
- ; V 2.1 INCLUDES ALL PREVIOUS MODS PLUS CORRECTED
- ; JSR/JMP/RTS FUNCTIONS.
- ;
- GLOBAL RELBAS
- ;
- BASE EQU $
- HOST EQU BASE+0F00H ; HOST SYSTEM CBIOS
- SYSTK EQU HOST ; SYSTEM STACK
- CPWRM EQU HOST+3 ; CP/M COLD ST
- CONST EQU HOST+6 ; HOST SYSTEM INPUT TEST
- CONIN EQU HOST+9 ; HOST SYSTEM CONS IN
- CONOUT EQU HOST+0CH ; HOST SYSTEM CONS OUT
- HOME EQU HOST+18H ; DRIV HOME
- SETDRV EQU HOST+1BH ; SELECT DRVE
- SETTRK EQU HOST+1EH ; SELECT TRACK
- SETSEC EQU HOST+21H ; SELECT SECTOR
- SETBUF EQU HOST+24H ; SET XFER ADDRESS
- READ EQU HOST+27H ; READ A SECTOR
- WRITE EQU HOST+2AH ; WRITE A SECTOR
- ;
- RELBAS LD SP,SYSTK
- LD C,1
- CALL DRVS ; ACTIVATE DRV B
- CALL HOMB ; AND INIT IT
- LD IY,INTRO
- CALL PRTXT ; PRINT HEADER
- CALL CRLF
- ;
- ; COMMAND LEVEL...RETURN HERE FROM ANY POINT IN PGM
- ;
- CMND LD HL,CMND
- PUSH HL ; RET ADDR ON STACK
- CALL CRLF
- CALL PROM
- CALL GETCHR ; GET COMMAND
- CP 'E'
- JP Z,EXAM ; EXAM MEMORY
- CP 'M'
- JP Z,SUBM ; SUB MEMORY
- LD IX,VREG ; FOR SIMX
- CP 'B'
- JR Z,BRKP-$ ; RUN TO BREAKPOINT
- CP 'C'
- JP Z,RGSTR ; DSPLY/MODIFY CPU REGS
- CP 'G'
- JP Z,RUN ; RUN FROM NPC
- CP 'T'
- JR Z,MULTX-$ ; TRACE/DISPLAY N STEPS
- CP ' '
- JR Z,EXONE-$ ; EX ONE INSTR & STOP
- LD IX,BUFFR ; FOR DOS
- CP 'D'
- JP Z,PDIR ; DOS DIR
- CP 'I'
- JP Z,INIT ; DOS INITIALIZE
- CP 'K'
- JP Z,KILL ; DOS ERASE
- CP 'L'
- JP Z,LOAD ; DOS LOADER
- CP 'R'
- JP Z,LDGO ; LOAD AND RUN PGM
- CP 'S'
- JP Z,SAVE ; DOS SAVER
- LD C,'?'
- CALL PRNC ; INVALID COMMAND
- JR CMND-$
- ;
- ; EXECUTE N STEPS
- ;
- MULTX LD IY,MLTMSG
- CALL PRTXT
- CALL GETWRD ; GET N
- LD A,E
- JR NZ,DOMULT-$
- EXONE LD A,1 ; EXECUTE 1 STEP
- ;
- ; EXECUTE # STEPS IN A
- ;
- DOMULT LD (NSTEPS),A ; STORE N IN TEMP
- CALL STEP ; EXEC & DSPLY INSTR
- CALL DSPLY
- LD A,(NSTEPS)
- DEC A
- RET Z
- PUSH AF
- LD BC,DLYCON ; DELAY FOR VIEWING
- DOLP DEC BC
- LD A,B
- OR C
- JR NZ,DOLP-$
- POP AF
- JR DOMULT-$
- ;
- ; RUN WITHOUT DISPLAY TO BREAKPOINT
- ;
- BRKP LD IY,BKPMSG
- CALL PRTXT
- CALL GETWRD ; GET IT
- LD (BREAK),DE ; STORE IT IN TEMP
- BKLP CALL STEP ; EXEC ONE INSTR
- LD DE,(BREAK)
- LD A,H ; CHECK IF AT BKPT
- CP D
- JR NZ,INTST-$
- LD A,L
- CP E
- JR NZ,INTST-$
- CALL STEP ; DO ONE MORE
- JR DSPLY-$
- INTST CALL KBST ; TEST FOR KBD INP
- JR Z,BKLP-$ ; CONTINUE IF NONE
- JR QDSP-$
- ;
- ; RUN ONLY..NO DISPLAY OR BREAKPOINT
- ;
- RUN CALL STEP ; DO A STEP
- CALL KBST ; CHECK FOR KB INPUT
- JR Z,RUN-$ ; IF NONE JUST REPEAT
- ;
- ; STOP, DISPLAY, & RET TO CMND
- ;
- QDSP CALL KBIN ; CLEAR UART
- JR DSPLY-$ ; DISP CPU & RET
- ;
- ; DISPLAY & UPDATE CPU REGISTERS
- ;
- RGSTR PUSH IX
- CALL CRLF
- LD IY,HEADR+42
- CALL PRN6 ; PRINT RG NAME
- LD DE,(NPC) ; NEXT PC TO DE
- CALL PRTWRD ; PRINT IT
- CALL PROM ; PROMPT FOR CHANGE
- CALL GETWRD
- JR Z,AREG-$ ; SPACE = NO CHANGE
- LD (NPC),DE ; PUT IN NEW VALUE
- AREG LD IY,HEADR+12
- LD B,5
- NREG CALL CRLF ; DO REST OF REGS
- CALL PRN6 ; PRINT NAME
- LD E,(IX+0)
- CALL PRTBYT ; PRINT CONTENTS
- CALL PROM ; PROMPT FOR CHANGE
- CALL GETWRD
- JR Z,NXTREG-$ ; SPACE = NO CHANGE
- LD (IX+0),E
- NXTREG INC IX ; POINT TO NEXT REG
- DJNZ NREG-$ ; DO AGAIN IF MORE
- POP IX
- RET
- ;
- ; DISPLAY PC, INSTRUCTION, AND ALL REGISTERS
- ;
- DSPLY PUSH IX ; SAVE POINTER
- PUSH BC ; SAVE MNEMONIC CODE
- CALL CRLF
- LD IY,HEADR
- CALL PRN6 ; 'CPC'
- LD DE,(CPC)
- CALL PRTWRD ; VALUE
- CALL PRN6 ; 'INS'
- POP BC
- PUSH IY
- PUSH BC
- LD IY,MNMTBL ; DET MNEM FROM BC
- LD A,0FCH
- AND C
- SRL A
- LD E,A
- LD D,0
- ADD IY,DE
- LD E,(IY+0) ; GET PACKED MNEM
- LD D,(IY+1)
- SLA E ; UNPACK IT
- RL D
- LD C,3 ; & PRINT THREE CHRS
- MNM2 XOR A
- LD B,5
- MNM1 SLA E
- RL D
- RLA
- DJNZ MNM1-$
- SET 6,A
- PUSH BC
- CALL PRNA
- POP BC
- DEC C
- JR NZ,MNM2-$
- POP BC ; DECODE ADDR MODE
- LD A,B
- SLA A
- SLA A
- SLA A
- LD E,A
- LD D,0
- LD IY,AMDTBL
- ADD IY,DE
- CALL PRN8 ; PRINT ADDR MODE
- POP IY
- LD B,5
- DSP1 CALL PRN6 ; PRINT ALL REGS
- LD E,(IX+0)
- CALL PRTBYT
- INC IX
- DJNZ DSP1-$
- CALL PRN6 ; PRINT NEXT PC
- LD DE,(NPC)
- CALL PRTWRD
- POP IX
- RET
- ;
- PRN6 LD E,6 ; PRINT 6 CHARS PER IY
- JP PRNLP
- PRN8 LD E,8 ; PRINT 8 CHRS PER IY
- JP PRNLP
- ;
- ; CODE FOR DECODING AND EXECUTING ONE INSTRUCTION
- ; ENTER WITH HL POINTING TO INSTR TO BE DECODED. EXITS
- ; WITH HL POINTING TO NEXT INSTR, B HOLDING ADDRESSING
- ; MODE CODE, C HOLDING MNEMONIC CODE
- ;
- STEP LD HL,(NPC) ; NEXT PC TO HL
- LD (CPC),HL ; BECOMES CURRENT PC
- LD A,(HL) ; OP CODE
- OR A ; ZERO?
- JP Z,PBRK ; IF SO, 'BRK'
- BIT 0,A ; TEST LSD FOR ODD/EVEN
- JP NZ,MLTMOD ; ODD INSTRS MULTI MODE
- AND 0FH
- JR NZ,FLGTST-$
- LD A,(HL) ; RESTORE OP CODE
- BIT 4,A ; MSD ODD/EVEN
- JP NZ,PBRNCH ; IF ODD, BRANCH
- CP 20H
- JP Z,PJSR ; PROCESS JSR
- CP 40H
- JP Z,PRTI ; PROCESS RTI
- CP 60H
- JP Z,PRTS ; PROCESS RTS
- JP MLTMOD ; ELSE MULTI MODE
- FLGTST CP 8
- JR NZ,IMP2-$
- LD A,(HL) ; RESTORE
- BIT 4,A ; MSD ODD/EVEN
- JP Z,PIMPL ; IF EVEN, MST BE IMPLD
- CP 98H ; MSD = 9?
- JP Z,PTYA ; YES, PROC TYA SPECIAL
- JP PFLGS ; ELSE PROCESS FLAG OPS
- IMP2 CP 0AH
- JR NZ,JMPTST-$ ; MUST BE JUMP
- LD A,(HL) ; RESTORE
- AND 0F0H ; TESTS ON MSD
- BIT 4,A ; ODD/EVEN
- JP NZ,PTSS ; PROSESS SP OPS SPECIAL
- CP 70H
- JP C,MLTMOD ; PROCESS ACCUM MODES
- JP PIMPL ; ELSE MORE IMPLIEDS
- JMPTST LD A,(HL) ; RESTORE OP CODE
- CP 4CH
- JP Z,PJABS ; PROCESS ABS JMP
- CP 6CH
- JP Z,PJIND ; PROCESS INDIRECT JMP
- JP MLTMOD
- ;
- ; INSTURCTION PROCESSORS BEGIN HERE.. ENTER WITH
- ; HL = PC, IX POINTING TO SIM CPU
- ;
- ; IF BRK VECTOR (IPOINT) = 0, RETURN TO CMND
- ;
- PBRK SET 4,(IX+1) ; SET BRK STATUS BIT
- LD HL,(IPOINT) ; SEE IF RET TO CMND
- LD A,H
- OR L
- JR NZ,BRK1-$
- POP BC ; ADJUST SP
- LD BC,429H ; RET TO CMND
- JP DSPLY
- BRK1 INC HL ; NORMAL BREAK
- CALL TSPY ; SP TO IY
- LD (IY+0),H ; 'PUSH' PC
- DEC IY
- LD (IY+0),L
- DEC IY
- LD A,(IX+1) ; 'PUSH' P
- LD (IY+0),A
- DEC IY
- CALL TYSP ; IY TO SP
- LD HL,(IPOINT) ; GET INTERRUPT VECTOR
- LD BC,429H ; CODE FOR # BYTES & MNEM
- JP END1 ; AND FINISH
- ;
- ; PROCESS BRANCHES
- ;
- PBRNCH LD B,0 ; FORM INDEX INTO MSKTBL
- LD C,(HL) ; INSTR TO C
- LD IY,MSKTBL
- SRL C ; GET MSD
- SRL C
- SRL C
- SRL C
- DEC C
- ADD IY,BC
- INC HL ; POINT TO OFFSET
- BIT 1,C ; MSD ODD/EVEN
- LD A,(IX+1) ; P REG TO ACC
- LD C,(IY+0) ; # CODE
- LD B,(IY+1) ; FLAG MASK
- JR NZ,BRSET-$ ; ODD/EVEN DET SET/CLR
- AND B ; ISOLATE BIT FOR TEST
- JR Z,TRUE-$
- JR FALSE-$
- BRSET AND B
- JR NZ,TRUE-$
- JR FALSE-$
- TRUE LD D,0 ; CONDITION MET; BRANCH
- LD E,(HL) ; OFFSET TO E
- BIT 7,E ; CHECK SIGN OF OFFSET
- JR Z,TRU1-$
- DEC D ; IF B7 IS SET, DO NEG
- TRU1 ADD HL,DE ; ADD OFFSET FOR NEW PC
- FALSE LD B,0 ; COND NOT MET; GO ON
- JP END
- ;
- ; PROCESS JUMPS AND JSR...JMP 0-4 AND JSR 0-4 GO INTO Z80
- ; ROUTINES PER JUMP TABLE AT USR0. CONTROL THEN RETURNS
- ; TO SIMULATOR UPON Z80 'RET' (C9).. ALL OTHERS PROCESSED
- ; NORMALLY.
- ;
- PJSR LD BC,273H ; JSR
- PUSH BC
- CALL SPCTST ; TEST FOR USER
- JR NZ,PJS2-$
- CALL INUSR ; GO TO USER SR
- POP BC
- JR EE0-$
- PJS2 CALL TSPY ; NORMAL JSR
- LD (IY+0),H ; PUSH CURRENT PC
- DEC IY
- LD (IY+0),L
- DEC IY
- CALL TYSP
- JR DOJ1-$
- PJABS LD BC,26FH ; ABS JMP
- JR DOJP-$
- PJIND LD BC,0C6FH ; INDIRECT JMP
- CALL SPCTST
- EX DE,HL
- DEC HL
- DOJP PUSH BC
- CALL SPCTST ; TEST FOR SPECIALS
- JR NZ,DOJ1-$
- CALL INUSR ; FOR SPECIALS
- CALL PRET ; DO SR RETURN
- POP BC
- JR EE0-$ ; GO TO PC+1
- DOJ1 EX DE,HL ; NEW PC
- POP BC
- JR EE1-$
- ;
- ; PROCESS SR AND INTERRUPT RETURNS
- ;
- PRTS CALL PRET ; RTS...RESTORE PC
- LD BC,4A9H
- EE0 JP END ; GO TO PC+1
- PRTI CALL TSPY ; RTI
- INC IY
- LD A,(IY+0) ; RESTORE FLAGS
- LD (IX+1),A
- CALL PRET1 ; RESTORE PC
- LD BC,4A5H
- EE1 JP END1
- PRET CALL TSPY ; SP TO IY
- PRET1 INC IY ; POINT TO LAST ENTRY
- LD L,(IY+0) ; RESTORE PCL
- INC IY
- LD H,(IY+0) ; RESTORE PCH
- JP TYSP ; RESTORE NEW SP
- ;
- ; TEST FOR USER SUBROUTINE CALLS/JUMPS. IF TARGET
- ; ADDRESS < 0005 THEN RET WITH Z FLG SET, ELSE CLR
- ;
- SPCTST INC HL ; TEST FOR USR SR
- LD E,(HL) ; LO BYTE
- INC HL ; TARGET TO DE
- LD D,(HL) ; HI BYTE
- LD A,0 ; TARGET < 0005?
- OR D
- RET NZ
- LD A,4
- CP E
- RET C
- XOR A ; SET Z FLAG
- RET
- ;
- ; INDEX INTO USER SUBROUTINE TABLE
- ; PASS A, X, & Y TO/FROM USER ROUTINE AS A, B, & C.
- ;
- INUSR LD D,0
- LD A,E
- ADD A,E
- ADD A,E
- LD E,A
- LD IY,USR0
- LD BC,USRET ; RETURN ON STACK
- PUSH BC
- ADD IY,DE
- LD A,(IX+0) ; PASS A,X, & Y
- LD B,(IX+2)
- LD C,(IX+3)
- JP (IY) ; AND GO
- USRET LD (IX+0),A ; RETURN HERE
- LD (IX+2),B ; RETURN PARAMETERS
- LD (IX+3),C
- RET
- NOP ; PAD FOR PATCH
- NOP
- NOP
- ;
- ; PROCESS SP EXCHANGES
- ;
- PTSS CP 90H ; WHICH ONE IS IT?
- JR NZ,PTSX-$
- PTXS LD A,(IX+2) ; MOVE DATA FROM X...
- LD (IX+4),A ; TO SP
- LD BC,4D9H
- JP END
- PTSX LD A,(IX+4) ; MOVE SP
- LD (IX+2),A ; TO X REG
- LD C,0D1H
- JP COMPL ; AND MODIFY FLAGS
- ;
- ; PROCESS ALL REMAINING IMPLIED INSTRUCTIONS
- ;
- PIMPL LD C,A ; OP CODE
- SRL C ; GET MSD
- SRL C
- SRL C
- SRL C
- AND 0FH ; CHECK LSD
- CP 8
- LD IY,IMPTBL ; INDEX INTO TABLE
- JP Z,JPIB
- LD IY,IMPTBL+8
- JP JPIB
- ;
- ; IMPLIED INSTR PROCESSORS
- ;
- PINX INC (IX+2) ; INX
- LD C,65H
- JR IDEFLG-$
- PINY INC (IX+3) ; INY
- LD C,69H
- JR IDEFLG-$
- PDEX DEC (IX+2) ; DEX
- LD C,55H
- JR IDEFLG-$
- PDEY DEC (IX+3) ; DEY
- LD C,59H
- IDEFLG RES 1,(IX+1) ; SET/RES Z FLG
- JR NZ,SINTST-$ ; PER Z80 FLAGS
- SET 1,(IX+1)
- SINTST RES 7,(IX+1) ; ALSO SIGN FLG
- JP P,ENDIT
- SET 7,(IX+1)
- JP ENDIT
- PNOP LD BC,485H ; NOP
- JP END
- PPHA CALL TSPY ; PHA
- LD A,(IX+0) ; ACCUM
- LD C,8DH
- JR DOPUSH-$ ; PUSH IT
- PPHP CALL TSPY ; PHP
- LD A,(IX+1) ; P REG
- LD C,91H
- DOPUSH PUSH BC
- LD (IY+0),A ; PLACE ON STACK
- DEC IY ; BUMP SP DOWN
- CALL TYSP ; & REPLACE IT
- POP BC
- JP ENDIT
- PPLA CALL DOPULL ; PLA
- LD (IX+0),A ; DATA TO ACC
- CALL SINS1 ; SET/RES S,Z FLGS
- CALL TYSP ; RESTORE SP
- LD BC,495H
- JP END
- PPLP CALL DOPULL ; PLP
- LD (IX+1),A ; DATA TO P REG
- CALL TYSP ; RESTORE SP
- LD BC,499H
- JP END
- DOPULL CALL TSPY ; GET SP
- INC IY ; BUMP SP
- LD A,(IY+0) ; GET DATA
- RET
- ;
- ; PROCESS ACC/INDEX TRANSFERS
- ;
- PTAX LD A,(IX+0) ; TAX
- LD (IX+2),A
- LD C,0C9H
- JR COMPL-$
- PTAY LD A,(IX+0) ; TAY
- LD (IX+3),A
- LD C,0CDH
- JR COMPL-$
- PTXA LD A,(IX+2) ; TXA
- LD (IX+0),A
- LD C,0D5H
- JR COMPL-$
- PTYA LD A,(IX+3) ; TYA
- LD (IX+0),A
- LD C,0DDH
- COMPL CALL SINS1 ; SET/RES S,Z FLGS
- JR ENDIT-$
- ;
- ; PROCESS FLAG SET/RES INSTRUCTIONS
- ;
- PFLGS LD IY,FLGTBL ; TABLE START
- LD B,0
- CP 0B8H ; CLV SPECIAL
- JR NZ,PFL1-$
- RES 5,A
- PFL1 RRA ; CHECK MSD
- RRA
- RRA
- RRA
- AND 0EH ; MASK MSD + 1
- BIT 1,A ; TEST FOR SET/RES
- LD C,A ; FORM TABLE INDEX
- ADD IY,BC
- LD C,(IY+0) ; GET MNEM CODE
- LD A,(IY+1) ; GET MASK
- JR NZ,PFL2-$
- CPL ; DO CLEARS
- AND (IX+1)
- JR PFL3-$
- PFL2 OR (IX+1) ; DO SETS
- PFL3 LD (IX+1),A ; AND STUFF IT
- ENDIT LD B,4
- JP END
- ;
- ; PROCESS ALL INSTRUCTIONS HAVING MULTIPLE ADDRESSING
- ;
- MLTMOD LD BC,MLTEND ; PUT RETURN ON STACK
- PUSH BC
- LD A,(HL) ; GET INSTR TO A
- LD C,A ; AND TO C
- SRL C ; TEST EVEN/ODD
- PUSH AF
- SRL C ; ROTATE MSD INTO LSD
- SRL C
- SRL C
- RES 0,C ; MASK LSB
- POP AF
- LD IY,EVNTBL ; JUMP PER TABLES
- JP NC,JPIB
- LD IY,ODDTBL
- JP JPIB
- ;
- ; MULTI-MODE INSTRUCTION PROCESSORS
- ;
- PASL CALL MODBBB ; GET MODE,ADDR,&DATA
- SLA A ; ASL
- CALL SINSET ; SET/RES S,Z,C FLGS
- CALL PUTDAT ; RESTORE DATA
- LD A,8
- RET
- PBTRL BIT 1,A ; BIT OR ROL?
- JR Z,PBIT-$
- CALL MODBBB ; ROL
- CALL CARSET ; SET UP C FLAG
- PROL1 RLA ; DO ROTATE
- CALL SINSET
- CALL PUTDAT
- LD A,9CH
- RET
- PBIT RES 6,(IX+1) ; BIT
- CALL MODBBX
- PUSH BC
- LD B,A ; SAVE IT IN B
- LD A,(IX+0) ; GET SIM ACC
- AND B ; AND IT
- BIT 6,A ; CHECK V BIT
- JR Z,PBIT1-$
- SET 6,(IX+1) ; SET V BIT IF REQD
- PBIT1 CALL SINS1 ; SET/RES S,Z FLGS
- POP BC
- LD A,18H
- RET
- PLSR CALL MODBBB ; LSR
- SRL A
- CALL SINSET
- CALL PUTDAT
- LD A,80H
- RET
- PROR CALL MODBBB ; ROR
- CALL CARSET ; SET UP C FLG
- PROR1 RRA ; DO ROTATE
- CALL SINSET
- CALL PUTDAT
- LD A,0A0H
- RET
- PSTXY BIT 1,A ; WHICH ONE?
- JR Z,PSY-$
- CALL MODBBX ; STX
- LD A,(IX+2)
- CALL PUTDAT
- LD A,0C0H
- RET
- PSY CALL MODBBX ; STY
- LD A,(IX+3)
- CALL PUTDAT
- LD A,0C4H
- RET
- PLDXY BIT 1,A ; WHICH ONE?
- JR Z,PLY-$
- CALL MODDDD ; LDX
- LD (IX+2),A
- CALL SINS1
- LD A,78H
- RET
- PLY CALL MODDDD ; LDY
- LD (IX+3),A
- CALL SINS1
- LD A,7CH
- RET
- PDCY BIT 1,A ; WHICH ONE?
- JR Z,PCPY-$
- CALL MODBBX ; DEC
- DEC A
- CALL SINS1
- CALL PUTDAT
- LD A,50H
- RET
- PICX BIT 1,A ; WHICH ONE?
- JR Z,PCPX-$
- CALL MODBBX ; INC
- INC A
- CALL SINS1
- CALL PUTDAT
- LD A,60H
- RET
- PCPX CALL CXY ; CPX
- CALL SINSET
- LD A,48H
- RET
- PCPY INC IX
- CALL CXY ; CPY
- DEC IX
- CALL SINSET
- LD A,4CH
- RET
- CXY CALL MODCC
- PUSH BC
- LD B,A ; MEM DAT INTO B
- LD A,(IX+2) ; X (Y) INTO A
- SUB B
- CCF ; BORROW = 6502 /C
- POP BC
- RET
- PSBC RES 6,(IX+1) ; SBC...CLR V FLG
- CALL MODAAA
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- CALL CARSET ; SET UP C FLAG
- CCF ; AND COMPLEMENT IT
- PSBC1 BIT 3,(IX+1) ; CHECK FOR DEC MODE
- JR NZ,PSDEC-$
- SBC A,B
- JR PSBC2-$
- PSDEC SBC A,B ; DECIMAL MODE
- DAA
- PSBC2 LD (IX+0),A ; RESULT TO ACCUM
- CCF ; BORROW = 6502 /C
- CALL SINSET
- AND 0C0H ; TEST XOR OF B6 & B7
- JR Z,SBC3-$
- CP 0C0H
- JR Z,SBC3-$
- SET 6,(IX+1) ; SET V FLAG IF XOR = 1
- SBC3 POP BC
- LD A,0ACH
- RET
- PORA CALL MODAAA ; ORA
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- OR B
- LD (IX+0),A ; RESULT TO ACC
- CALL SINS1
- POP BC
- LD A,88H
- RET
- PAND CALL MODAAA ; AND
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- AND B
- LD (IX+0),A ; RESULT TO ACC
- CALL SINS1
- POP BC
- LD A,4
- RET
- PEOR CALL MODAAA ; EOR
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- XOR B
- LD (IX+0),A ; RESULT TO ACC
- CALL SINS1
- POP BC
- LD A,5CH
- RET
- PADC RES 6,(IX+1) ; ADC: CLEAR V FLAG
- CALL MODAAA
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- CALL CARSET ; SET UP C FLG
- PADC1 BIT 3,(IX+1) ; CHECK FOR DEC MODE
- JR NZ,PADEC-$
- ADC A,B ; BINARY MODE
- JR PADC2-$
- PADEC ADC A,B ; DECIMAL MODE
- DAA
- PADC2 LD (IX+0),A ; RESULT TO ACC
- CALL SINSET
- AND 0C0H ; CHECK XOR OF B6 & B7
- JR Z,PADC3-$
- CP 0C0H
- JR Z,PADC3-$
- SET 6,(IX+1) ; SET V FLG IF XOR = 1
- PADC3 POP BC
- LD A,0
- RET
- PSTA CALL MODAAA ; STA
- LD A,(IX+0) ; ACC TO MEM
- CALL PUTDAT
- LD A,0BCH
- RET
- PLDA CALL MODAAA ; LDA
- LD (IX+0),A ; MEM TO ACC
- CALL SINS1
- LD A,74H
- RET
- PCMP CALL MODAAA ; CMP
- PUSH BC
- LD B,A ; DATA TO B
- LD A,(IX+0) ; ACC TO A
- SUB B
- CCF ; BORROW = 6502 /C
- CALL SINSET
- POP BC
- LD A,44H
- RET
- ;
- ; END OF ALL MULTI MODE PROCESSORS
- ;
- MLTEND ADD A,C ; FORM MNEM CODE IN C
- LD C,A
- END INC HL ; POINT TO NXT INSTR
- END1 LD (NPC),HL
- RET ; BACK TO CMND
- ;
- ; VARIOUS SUBROUTINES FOR TRANSLATOR
- ;
- ; SET Z80 C FLAG TO MATCH 6502 C FLG
- ;
- CARSET SCF
- BIT 0,(IX+1)
- RET NZ
- CCF
- RET
- ;
- ; SET SIMULATOR S,Z,C FLAGS PER Z80 RESULTS
- ;
- SINSET RES 0,(IX+1) ; RESET C FLAG
- JR NC,SINS1-$
- SET 0,(IX+1) ; SET C PER Z80 C
- SINS1 RES 1,(IX+1) ; CLEAR Z FLAG
- OR A ; SEE IF ACC = 0
- JR NZ,SINS2-$
- SET 1,(IX+1) ; SET Z FLG
- SINS2 RES 7,(IX+1) ; CLEAR SIGN FLAG
- BIT 7,A ; CHECK SIGN OF ACC
- RET Z
- SET 7,(IX+1) ; SET S IF NECESSARY
- RET
- ;
- ; TRANSFER SIMULATOR SP TO/FROM IY
- ;
- TSPY LD B,1 ; XFER SP TO IY
- LD C,(IX+4)
- PUSH BC
- POP IY
- RET
- TYSP PUSH IY ; XFER IY TO SP
- POP BC
- LD (IX+4),C
- RET
- ;
- ; ADDRESS MODE DECODERS...RETURN WITH DATA TO BE MODIFIED
- ; IN A, ADDRESS MODE CODE IN B, # BYTES IN C, ADDRESS OF
- ; DATA IN DE
- ;
- MODAAA LD IY,AAATBL ; GROUP 1
- JR MOD1-$
- MODBBB LD IY,BBBTBL ; GROUP 2
- JR MOD1-$
- MODDDD LD IY,DDDTBL ; GROUP 3
- CP 0B6H ; LDX ZPG,Y SPECIAL
- JR NZ,DDD1-$
- LD A,10H
- DDD1 CP 0BEH ; LDX ABS,Y SPECIAL
- JR NZ,MOD1-$
- LD A,18H
- JR MOD1-$
- MODBBX LD IY,BBXTBL ; GROUP 4 & 6
- CP 96H ; STX ZPG,Y SPECIAL
- JR Z,BBX-$
- RRA ; EXTRA SHIFT
- AND 0CH ; EXTRA MASK
- JR MOD1-$
- BBX LD A,10H ; SPECIAL
- JR MOD1-$
- MODCC LD IY,CCTBL ; GROUP 5
- MOD1 RRA ; ROTATE MODE INTO LSD
- AND 0EH ; MASK THE REST
- LD B,0 ; FORM OFFSET IN BC
- LD C,A
- ADD IY,BC ; ADD TO TABLE START
- LD C,(IY+0) ; MODE OFFSET
- LD B,(IY+1) ; # CODE
- PUSH BC ; SAVE FOR LATER
- GETDAT LD IY,GETTBL ; JUMP TABLE
- JP JPIB
- PABY INC HL ; ABS,Y
- LD A,(HL) ; 2ND BYTE INSTR
- ADD A,(IX+3) ; PLUS Y INDEX
- LD E,A ; TO E
- INC HL
- LD A,(HL) ; 3RD BYTE INSTR
- ADC A,0 ; PLUS CARRY
- LD D,A ; TO D
- JR EXIT-$
- PIMM INC HL ; IMMEDIATE
- LD A,(HL) ; DATA TO ACC
- JR EX1-$
- PACX LD A,(IX+0) ; ACCUM
- PUSH IX
- POP DE
- JR EX1-$
- PZPG INC HL ; ZPG
- LD E,(HL) ; ADDRESS TO DE
- LD D,0
- JR EXIT-$
- PAB INC HL ; ABSOLUTE
- LD E,(HL) ; ADDRESS TO DE
- INC HL
- LD D,(HL)
- JR EXIT-$
- PZX LD A,(IX+2) ; ZPG,X...GET X INDEX
- JR PZ1-$
- PZY LD A,(IX+3) ; ZPG,Y...GET Y INDEX
- PZ1 INC HL
- ADD A,(HL) ; ADD BASE ADDRESS
- LD E,A ; PUT IN E
- LD D,0 ; ZERO PAGE, NO WRAP
- JR EXIT-$
- PZIX INC HL ; (ZPG,X)
- LD A,(HL) ; 2ND BYTE INSTR
- ADD A,(IX+2) ; ADD X INDEX
- LD E,A ; TO FORM BASE ADDRESS...
- LD D,0 ; IN ZERO PG, NO WRAP
- LD IY,0
- ADD IY,DE ; TRANSFER TO IY
- LD E,(IY+0) ; EFF ADDR TO DE
- LD D,(IY+1)
- JR EXIT-$
- PZIY INC HL ; (ZPG),Y
- LD E,(HL) ; BASE ADDRESS
- LD D,0 ; IN ZERO PAGE
- LD IY,0
- ADD IY,DE ; TRANSFER TO IY
- LD A,(IY+0) ; EFF ADDRESS...
- ADD A,(IX+3) ; PLUS Y INDEX...
- LD E,A ; TO DE
- LD A,(IY+1)
- ADC A,0
- LD D,A
- JR EXIT-$
- PABX INC HL ; ABS,X
- LD A,(HL) ; 2ND BYTE INSTR
- ADD A,(IX+2) ; PLUS X INDEX
- LD E,A ; TO E
- INC HL ; 3RD BYTE INSTR
- LD A,(HL)
- ADC A,0 ; PLUS CARRY
- LD D,A ; TO E
- EXIT LD A,(DE) ; DATA TO ACC
- EX1 POP BC ; RESTORE # CODE
- PUSH AF ; SAVE DATA
- LD A,3
- AND B ; # BYTES...
- LD C,A ; TO C
- SRL B
- SRL B ; B=ADDR MODE
- POP AF ; RESTORE DATA
- RET
- ;
- ; STORE DATA TO ADDRESS FROM GETDAT
- ;
- PUTDAT LD (DE),A
- RET
- ;
- ; INDEX INTO JUMP TABLES...ENTER WITH TABLE START
- ; ADDRESS IN IY AND OFFSET IN C. CALCULATES TABLE
- ; POSITION AND JUMPS TO RESULT
- ;
- JPIB LD B,0 ; INDIRECT JUMP PER TABLE
- ADD IY,BC ; TABLE ADDRESS TO IY
- LD C,(IY+0) ; TABLE ENTRY TO BC
- LD B,(IY+1)
- PUSH BC
- POP IY ; ENTRY TO IY
- JP (IY) ; AND GO TO IT
- ;
- ; ELEMENTARY MONITOR FUNCTIONS TO EXAMINE A BLOCK OF
- ; MEMORY LOCATIONS (E) AND TO CHECK AND UPDATE
- ; INDIVIDUAL LOCATIONS (M)
- ;
- EXAM LD DE,GETADR ; EXAM BLOCK OF MEM
- CALL PRTDE
- CALL GETWRD ; GET START ADDR
- PUSH DE
- CALL LINF
- LD DE,GETN
- CALL PRTDE
- CALL GETWRD ; GET # BYTES
- PUSH DE
- POP BC
- LD E,4 ; CHANGE TO # LINES (/16)
- XOR A
- BYTLN SRL B
- RR C
- JR NC,XXX-$
- INC A
- XXX DEC E
- JR NZ,BYTLN-$
- OR A ; SEE IF PARTIAL LINE
- JR Z,YYY-$
- INC BC
- YYY POP HL ; HL = START, BC = COUNT
- DEC BC ; ONE LESS LINE
- EXLP PUSH BC ; LOOP FOR ONE LINE
- CALL CRLF
- CALL LADR ; PRINT ADDRESS AT START
- CALL TWO ; INSERT TWO SPACES
- PUSH HL ; SAVE ADDRESS FOR ALPHA
- LD E,16 ; 16 ENTRIES PER LINE
- LNLP LD A,(HL) ; GET BYTE FROM MEMORY
- CALL PACC ; PRINT IT HEX
- CALL ONE ; SPACE
- INC HL ; POINT TO NEXT BYTE
- DEC E ; DONE WITH HEX?
- JR NZ,LNLP-$ ; NO, DO NEXT BYTE
- CALL TWO ; YES, SET UP FOR ALPHA
- POP HL ; SAME STARTING ADDRESS
- LD E,16
- ASCII LD A,(HL) ; GET BYTE
- CP 20H ; IS IT PRINTABLE?
- JR C,DOT-$
- CP 80H
- JR C,ASOK-$
- DOT LD A,'.' ; NO, PRINT A DOT
- ASOK CALL PRNA
- INC HL ; BUMP POINTER
- DEC E ; DONE WITH LINE?
- JR NZ,ASCII-$
- POP BC
- LD A,B ; SEE IF ALL DONE
- OR C
- RET Z ; YES, RET TO CMND
- DEC BC
- JR EXLP-$ ; ELSE DO ANOTHER LINE
- ;
- ; SUBSTITUTE MEMORY...ENTER BY 'M'
- ;
- SUBM LD DE,GETADR ; ASK FOR ADDRESS
- CALL PRTDE
- CALL GETWRD ; GET IT
- EX DE,HL ; MOVE IT TO HL
- SULP CALL CRLF
- CALL LADR ; PRINT THE ADDRESS
- CALL TWO
- LD A,(HL)
- CALL PACC ; PRINT THE CONTENTS
- CALL TWO
- JLP CALL GETCHR ; GET INPUT
- CP 2EH ; EXIT ON "."
- RET Z
- CP 20H
- JR Z,FWD-$ ; SKIP AHEAD ON "SPACE"
- CALL CONV ; CONV HEX IF POSSIBLE
- JR Z,JLP-$ ; NOT A HEX NUMBER
- PUSH HL ; SAVE ADDRESS AGAIN
- LD HL,0 ; CLEAR FOR ROTATE
- LLP CALL ROBYT ; ROTATE NYBBLE INTO HL
- KLP CALL GETCHR ; GET ANOTHER CHARACTER
- CP 0DH
- JR Z,PUTIN-$ ; IF "CR" STUFF IT
- CALL CONV ; CONV BINARY
- JR Z,KLP-$ ; NOT A HEX NUMBER
- JR LLP-$ ; CONTINUE
- PUTIN PUSH HL ; DATA TO BC
- POP BC
- POP HL ; RETRIEVE ADDRESS
- LD (HL),C ; STUFF THE DATA
- FWD INC HL ; BUMP POINTER
- JR SULP-$ ; ...AND CONTINUE
- LADR EX DE,HL ; PRINT WORD IN HL
- CALL PRTWRD
- EX DE,HL
- RET
- PACC PUSH DE ; PRINT BYTE IN A
- LD E,A
- CALL PRTBYT
- POP DE
- RET
- TWO CALL ONE ; PRINT 2 SPACES
- ONE PUSH BC ; PRINT SPACE
- LD C,' '
- CALL PRNC
- POP BC
- RET
- ;
- ; ELEMENTARY DOS BEGINS HERE. FILES ARE MAINTAINED ON
- ; DRIVE B ONLY AND ARE NOT CP/M COMPATIBLE. FUNCTIONS
- ; ARE DIRECTORY LIST (D), SAVE (S), LOAD (L), KILL (K)
- ; AND INITIALIZE (I).
- ; FILE NAMES CONSIST OF A PRIMARY FILE NAME OF UP TO
- ; SIX CHARS AND AN OPTIONAL FILE TYPE OF UP TO THREE.
- ;
- ; LIST DIRECTORY
- ;
- PDIR CALL DIR1 ; SET UP FOR DIR SCH
- PAGLP CALL NEWPG ; NEXT DIR PG TO BUFF
- LD B,8 ; 8 ENTRIES/PAGE
- PRPAG LD A,(IX+0) ; STATUS BYTE
- DEC A
- RET Z ; QUIT IF DONE
- DEC A
- JR NZ,NEXT-$
- CALL CRLF
- PRLIN PUSH BC ; PRINT NAME FROM DIR
- PUSH IX
- LD B,10
- PLNLP LD C,(IX+1)
- CALL PRNC
- INC IX
- DJNZ PLNLP-$
- POP IX
- CALL SPAC
- LD E,(IX+11) ; PRINT ADDRESS
- LD D,(IX+12)
- CALL PRTWRD
- CALL SPAC
- LD E,(IX+15) ; PRINT # RECORDS
- CALL PRTBYT
- POP BC
- NEXT LD DE,10H
- ADD IX,DE ; POINT TO NXT ENTRY
- DJNZ PRPAG-$ ; AND REPEAT
- JR PAGLP-$
- ;
- ; LOAD PGM FROM DRIVE B AND RUN FROM START ADDRESS
- ;
- LDGO CALL LOAD ; GET PGM
- LD IX,VREG ; FOR SIMULATOR
- JP RUN
- ;
- ; SEARCH FOR AND LOAD A FILE AT ADDR PER DIRECTORY
- ;
- LOAD CALL ANAME ; LOAD A FILE
- CALL NAMSCH ; TRY TO MATCH NAME
- JP Z,NTFND
- LD L,(IY-5) ; SAVE START ADDR
- LD H,(IY-4)
- LD (NPC),HL
- LOADLP CALL SETDAT ; SET UP FOR LOAD
- CALL RDONE ; AND READ N SECTORS
- CALL INCDAT
- JR NZ,LOADLP-$
- RET
- ;
- ; SAVE A FILE AND ADD IT TO DIRECTORY
- ;
- SAVE CALL ANAME ; SAVE # SECTORS
- CALL NAMSCH ; SEE IF HAVE ALREADY
- JR Z,SAV1-$
- CALL LINF
- LD DE,HAVMSG ; IF SO, INFORM & QUIT
- CALL PRTDE
- RET
- SAV1 LD IY,TEMPS
- LD A,2 ; NEW ACTIVE FILE
- LD (IY+0),A
- CALL LINF
- LD DE,GETADR ; GET RUN ADDR
- CALL PRTDE
- CALL GETWRD
- LD (IY+11),E
- LD (IY+12),D
- CALL LINF
- LD DE,GETN ; GET # BYTES
- CALL PRTDE
- CALL GETWRD
- XOR A ; CONVERT TO SECTORS
- LD B,7 ; DIV BY 128
- SAVX SRL D
- RR E
- JR NC,SAVY-$
- INC A
- SAVY DJNZ SAVX-$
- OR A ; FRACTIONAL SCTR?
- JR Z,SAVZ-$
- INC E ; THEN ADD ONE
- SAVZ LD (IY+15),E ; SAVE IT
- CALL DIR1 ; SET UP FOR DIR SCH
- SAV2 CALL NEWPG ; SEARCH FOR NAME
- LD B,8
- SAV3 LD A,(IX+0) ; STAT BYTE
- DEC A
- JR Z,SAVNEW-$ ; NEW FILE
- SUB 2 ; DEAD FILE?
- JR NZ,SAV4-$
- LD A,(IY+15) ; WILL IT FIT?
- DEC A
- CP (IX+15)
- JR C,SAVOLD-$
- SAV4 LD DE,10H ; CHECK NXT ONE
- ADD IX,DE
- LD D,(IX-3) ; OLD TRACK
- LD E,(IX-2) ; OLD SECTOR
- LD C,(IX-1) ; OLD #
- DJNZ SAV3-$
- JR SAV2-$
- SAVNEW LD A,26 ; NEW ENTRY
- INC C
- NEWLP INC E
- CP E ; >26?
- JR NC,NEW1-$
- INC D ; IF SO, NXT TRK
- LD E,1
- NEW1 DEC C
- JR NZ,NEWLP-$
- JR UPDIR-$
- SAVOLD LD D,(IX+13)
- LD E,(IX+14)
- UPDIR LD (IY+13),D ; PUT NEW TRK & SCTR
- LD (IY+14),E
- CALL PUTDIR ; UPDATE DIR
- SAVER CALL SETDAT ; SET UP FOR SAVE
- CALL WRONE ; & WRITE # SECTORS
- CALL INCDAT
- JR NZ,SAVER-$
- RET
- ;
- ; KILL A FILE (SET INACTIVE STATUS IN DIRECTORY)
- ;
- KILL CALL ANAME ; GET NAME
- CALL NAMSCH ; FIND IT
- JP Z,NTFND
- LD IY,TEMPS
- LD A,3 ; MAKE STAT = 03
- LD (IY+0),3
- JR PUTDIR-$ ; AND UPDATE DIRECTORY
- ;
- ; INITIALIZE DISK (WRITES BLANK DIRECTORY)
- ;
- INIT LD DE,INIMSG ; INITIALIZE DISK
- CALL PRTDE
- CALL GETCHR ; ASK YES OR NO
- CP 'Y'
- RET NZ
- CALL HOMB
- LD IX,BUFFR ; FILL BUFF W/PATTERN
- LD IY,INIMSK ; STORED AT INIMSK
- PUSH IX
- LD C,8
- INLP1 PUSH IY
- LD B,10H
- INLP2 LD A,(IY+0)
- LD (IX+0),A
- INC IX
- INC IY
- DJNZ INLP2-$
- POP IY
- DEC C
- JR NZ,INLP1-$
- POP IX
- LD A,3 ; MAKE 1ST ONE DEAD
- LD (IX+0),A
- LD BC,BUFFR
- CALL BUFS
- LD C,0
- CALL TRKS
- INC C
- CALL SECS
- CALL WRONE ; 1ST DIR PAGE
- LD A,1 ; RESTORE PATTERN
- LD (IX+0),A
- LD BC,1902H
- WRLP PUSH BC ; WRITE REST OF TRK 0
- CALL SECS
- CALL WRONE
- POP BC
- INC C
- DJNZ WRLP-$
- RET
- ;
- ; OVERWRITE CURRENT DIRECTORY PAGE
- ;
- PUTDIR LD B,10H ; UPDATE DIR
- UPLP LD A,(IY+0)
- LD (IX+0),A
- INC IX
- INC IY
- DJNZ UPLP-$
- CALL WRONE ; REWRITE DIR PAGE
- RET
- ;
- ; SEARCH FOR FILE NAME IN DIRECTORY.. RETURN WITH Z FLG
- ; SET IF NOT FOUND, Z CLEAR AND BUFFER FILLED IF FOUND
- ;
- NAMSCH CALL DIR1 ; SET UP FOR DIR SCH
- LDLP CALL NEWPG ; READ PAGE OF NDX
- LD B,8
- LDLP1 LD A,(IX+0) ; CHECK STAT
- DEC A
- JR NZ,LDLP2-$
- RET
- LDLP2 DEC A
- PUSH IX
- PUSH IY
- JR NZ,LDNXT-$ ; INACTIVE?
- LD C,10 ; ELSE COMP NAME
- CMPLP LD A,(IY+1)
- CP (IX+1)
- JR NZ,LDNXT-$
- INC IX
- INC IY
- DEC C
- JR NZ,CMPLP-$
- JR CMPOK-$ ; SAME NAME
- LDNXT POP IY ; TRY NEXT ONE
- POP IX
- LD DE,10H
- ADD IX,DE
- DJNZ LDLP1-$
- JR LDLP-$ ; NEXT PAGE
- CMPOK POP IY ; NAME MATCHES
- POP IX
- LD B,10H ; XFER DIR NTRY TO BUFF
- FILLP LD A,(IX+0)
- LD (IY+0),A
- INC IX
- INC IY
- DJNZ FILLP-$
- LD DE,-10H
- ADD IX,DE
- XOR A
- INC A ; EXIT A = 1
- RET
- NEWPG EXX ; GET NXT DIR PAGE
- LD IX,BUFFR
- INC (IY+14) ; NXT SCTR
- LD C,(IY+14)
- CALL SECS
- CALL RDONE ; READ IT IN
- EXX
- RET
- NTFND CALL LINF ; NOT FOUND
- LD DE,NFMSG
- CALL PRTDE
- LD SP,SYSTK-2 ; RET TO CMND
- RET
- ;
- ; FILL IN DISK DATA. USES SR CALLS IN CBIOS
- ;
- SETDAT LD IY,TEMPS ; SET UP FOR DSK DATA
- LD C,(IY+11)
- LD B,(IY+12)
- CALL BUFS ; XFER ADDR
- LD C,(IY+13)
- CALL TRKS ; TRACK
- LD C,(IY+14)
- JP SECS ; SECTOR
- ;
- ; BUMP SECTOR/TRACK AND XFER ADDRESS FOR MULTI
- ; SECTOR READ OR WRITE
- ;
- INCDAT LD A,(IY+11) ; BUMP DSK DATA
- ADD A,80H ; BUMP XFER ADDR
- LD (IY+11),A
- JR NC,INC1-$
- INC (IY+12)
- INC1 LD A,(IY+14)
- INC A ; BUMP SECTOR
- CP 27
- JR C,INC2-$
- LD A,1
- INC (IY+13) ; AND TRK IF NEEDED
- INC2 LD (IY+14),A
- LD A,(IY+13) ; CHECK FOR VALID TRACK
- CP 77
- JR C,INC3-$
- LD DE,DERMSG ; ERROR
- CALL PRTXT
- POP BC ; RET TO CMND
- RET
- INC3 DEC (IY+15)
- RET
- ;
- ; GET FILE NAME TO BUFFER
- ;
- ANAME LD IY,TEMPS
- PUSH IY
- LD B,10
- LD A,' '
- MPTY LD (IY+1),A ; CLEAR INPUT BUFFER
- INC IY
- DJNZ MPTY-$
- LD DE,NAMSG ; PROMPT FOR NAME
- CALL PRTDE
- POP IY
- PUSH IY
- NAMLP CALL GETCHR
- CP 0DH ; END?
- JR Z,NAMIN-$
- CP '.' ; DELIMITER?
- JR Z,FTYP-$
- LD (IY+1),A ; PUT IT IN BUFFER
- INC IY
- JR NAMLP-$
- FTYP POP IY
- PUSH IY
- LD (IY+7),A
- INC IY
- TYPLP CALL GETCHR
- CP 0DH
- JR Z,NAMIN-$
- LD (IY+7),A
- INC IY
- JR TYPLP-$
- NAMIN POP IY
- RET
- ;
- ; SET UP FOR DIRECTORY SEARCH
- ;
- DIR1 LD IY,TEMPS ; SET UP FOR DIR SCH
- LD BC,BUFFR
- CALL BUFS
- LD C,0 ; TRACK 0
- LD (IY+13),C
- LD (IY+14),C
- JP TRKS
- ;
- ; VARIOUS ROUTINES USED BY TRANSLATOR, MONITOR, AND DOS
- ;
- CRLF LD C,0DH ; PRINT CRLF
- CALL PRNC
- LINF LD C,0AH
- JP PRNC
- PROM LD C,' ' ; PRINT ' >'
- CALL PRNC
- LD C,'>'
- JP PRNC
- ;
- ; GET HEX DATA IN DE. ROTATE CONTINUOUSLY UNTIL A
- ; 'CR' IS INPUT. LSB IN E. SET Z FLG AND RET ON 'SPACE'
- ;
- GETWRD CALL GETCHR ; GET BINARY DATA
- CP ' ' ; RET Z IF SACE
- RET Z
- EX DE,HL
- LD HL,0 ; CLEAR HODING REG
- CALL CONV ; CHANGE TO HEX
- JR Z,GETWRD-$ ; INVALID CHAR
- CALL ROBYT ; ROTATE INTO HL
- WRDLP CALL GETCHR ; GET NEXT CHAR
- CP 0DH ; TERMINATOR
- JR Z,WRDON-$
- CALL CONV
- JR Z,WRDLP-$
- CALL ROBYT
- JR WRDLP-$
- WRDON OR A ; CLEAR Z FLAG
- EX DE,HL ; DATA INTO DE
- RET
- ;
- ; CONVERT ASCII DATA IN A TO HEX. SET Z FLG IF INVALID
- ;
- CONV CP '0' ; CONVERT TO BINARY
- JR C,BAD-$
- CP 3AH
- JR C,GOOD-$
- CP 41H
- JR C,BAD-$
- CP 47H
- JR C,GOOD-$
- BAD LD C,'?'
- CALL PRNC ; NOTIFY BAD INPUT
- XOR A ; SET Z FLAG
- RET
- GOOD SUB 30H
- CP 10
- JR C,GOOD1-$
- SUB 7
- GOOD1 CP 0FFH ; CLEAR Z FLAG
- RET
- ;
- ; ROTATE BYTE IN A INTO HL VIA L
- ;
- ROBYT ADD HL,HL ; ROTATE A INTO HL
- ADD HL,HL ; ROTATE HL 4 BITS LEFT
- ADD HL,HL
- ADD HL,HL
- OR L ; PUT NEW DIGIT INTO L
- LD L,A
- RET
- ;
- ; PRINT FOUR DIGIT VALUE IN DE
- ;
- PRTWRD LD A,D
- CALL PRBIN
- PRTBYT LD A,E ; PRINT VALUE IN E
- PRBIN PUSH AF
- RRC A
- RRC A
- RRC A
- RRC A
- CALL PRB1
- POP AF
- PRB1 AND 0FH
- ADD A,90H
- DAA
- ADC A,40H
- DAA
- JR PRNA-$
- ;
- ; PRINT STRING POINTED TO BY DE. USES PRTXT
- ;
- PRTDE PUSH IY ; PRNT PER DE
- PUSH DE
- POP IY
- CALL PRTXT
- POP IY
- RET
- ;
- ; PRINT ASCII STRING POINTED TO BY IY. CHECK FOR
- ; SPECIALS: '1' PRINTS AS BYTE POINTED TO BY HL, '2'
- ; PRINTS (HL+1), '!' DOES NOT PRINT, '^' TERMINATES.
- ;
- PRTXT LD E,0 ; PRNT UP TO 255 CHRSY
- PRNLP LD A,(IY+0)
- CP '^' ; TERMINATOR?
- RET Z
- CP '!' ; NO PRINT?
- JR Z,DONXT+1-$
- PUSH DE
- LD HL,(CPC)
- INC HL
- CP '2' ; PRINT (HL+1)?
- JR NZ,PRN1-$
- INC HL
- LD E,(HL)
- CALL PRTBYT
- JR DONXT-$
- PRN1 CP '1' ; PRINT (HL)?
- JR NZ,DOALPH-$
- LD E,(HL)
- CALL PRTBYT
- JR DONXT-$
- DOALPH LD C,A ; ALL OTHER CHARACTERS
- CALL PRNC
- DONXT POP DE
- INC IY
- DEC E
- JR NZ,PRNLP-$
- RET
- ;
- SPAC PUSH BC ; PRINT 6 SPACES
- LD B,6
- LD C,' '
- SPLP CALL PRNC
- DJNZ SPLP-$
- POP BC
- RET
- ;
- ; CONSOLE I/O
- ;
- GETCHR CALL KBIN ; GET CHAR & TEST
- CP 3 ; ^C....
- JP Z,CPWRM ; CPM WARM START
- CP 18H ; ^X (CAN)...
- JR NZ,PRNA-$
- LD SP,SYSTK-2 ; FOR RET TO CMND
- LD A,'#'
- PRNA LD C,A ; PRINT CHAR IN A
- PUSH AF
- CALL PRNC
- POP AF
- RET
- ;
- ; JUMPS TO EXTERNAL I/O...MODIFY AS NEEDED
- ;
- KBIN JP CONIN ; GET SINGLE CHAR IN A
- KBST JP CONST ; TEST INPUT STATUS
- PRNC JP CONOUT ; PRINT CHAR IN C
- HOMB JP HOME ; DRIVE HOME
- DRVS JP SETDRV ; SET DRIVE #
- SECS JP SETSEC ; SET SECTOR #
- TRKS JP SETTRK ; SET TRK #
- BUFS JP SETBUF ; SET XFER ADDRESS
- RDONE JP READ ; READ A SECTOR
- WRONE JP WRITE ; WRITE A SECTOR
- ;
- ; JUMP TABLE FOR LINKS TO Z80 ROUTINES...FILL IN AS REQD
- ; FIRST TWO INITIALIZED TO CONSOLE I/O VIA ACC
- ;
- USR0 JP KBIN ; 6502 USER ROUTINES
- USR1 JP PRNA
- USR2 DEFB 0C9H,0,0
- USR3 DEFB 0C9H,0,0
- USR4 DEFB 0C9H,0,0
- ;
- ; 6502 BREAK VECTOR...INIT TO GO TO COMMAND LEVEL
- ;
- IPOINT DEFW 0
- ;
- ; TEMPORARIES FOR TRANSLATOR
- ;
- NSTEPS DEFB 1 ; # STEPS TO EXECUTE
- NBYTES DEFB 0 ; # BYTES IN INSTR
- DLYCON DEFW 0A00H ; TIME DELAY FOR # STEP
- BREAK DEFW 0 ; BREAKPOINT ADDRESS
- ;
- ; SIMULATED 6502 CPU REGISTERS...INIT TO THESE VALUES
- ;
- VREG DEFB 0 ; ACCUMULATOR
- DEFB 0 ; STATUS (P) REG
- DEFB 0 ; X INDEX REG
- DEFB 0 ; Y INDEX REG
- DEFB 0FFH ; STACK POINTER
- CPC DEFW 200H ; PROGRAM COUNTER
- NPC DEFW 200H ; LOCATION OF NXT INSTR
- ;
- ; VARIOUS MESSAGES FOR SYSTEM
- ;
- INTRO DEFM '***** XENTRIX ZX/65 *****^'
- HEADR DEFM ' CPC.. INS.. A.... P....'
- DEFM ' X.... Y.... SP... NPC..'
- NFMSG DEFM 'FILE NOT FOUND^'
- HAVMSG DEFM 'FILE EXISTS^'
- DERMSG DEFM 'BAD TRACK/SECTOR #^'
- GETADR DEFM ' ENTER START ADDRESS: ^'
- GETN DEFM ' ENTER NO. BYTES: ^'
- NAMSG DEFM ' ENTER FILNAM.TYP: ^'
- MLTMSG DEFM ' ENTER # STEPS: ^'
- BKPMSG DEFM ' ENTER BRKP ADDR: ^'
- INIMSG DEFM ' INITIALIZE? (Y/N) ^'
- ;
- ; DOS BUFFERS AND DATA
- ;
- TEMPS DEFS 10H ; DISK ENTRY BUFFER
- BUFFR DEFS 80H ; DIRECTORY PAGE BUFFER
- INIMSK DEFB 1,20H,20H,20H,20H,20H,20H,20H
- DEFB 20H,20H,20H,20H,20H,1,0,0
- ;
- ; DATA TABLES FOR TRANSLATOR BEGIN HERE
- ;
- ; ADDRESSING MODE TABLES
- ;
- AAATBL DEFW 1A0CH ; (ZPG,X)
- DEFW 0E04H ; ZPG
- DEFW 0600H ; IMM
- DEFW 0B06H ; ABS
- DEFW 1E0EH ; (ZPG),Y
- DEFW 2208H ; ZPG,X
- DEFW 2F12H ; ABS,Y
- DEFW 2B10H ; ABS,X
- BBBTBL DEFW 0 ; INVALID
- DEFW 0E04H ; ZPG
- DEFW 1502H ; ACC
- DEFW 0B06H ; ABS
- DEFW 260AH ; ZPG,Y
- DEFW 2208H ; ZPG,X
- DEFW 2F12H ; ABS,Y
- DEFW 2B10H ; ABS,X
- DDDTBL DEFW 0600H ; IMM
- DEFW 0E04H ; ZPG
- DEFW 0 ; INVALID
- DEFW 0B06H ; ABS
- DEFW 260AH ; ZPG,Y
- DEFW 2208H ; ZPG,X
- DEFW 2F12H ; ABS,Y
- DEFW 2B10H ; ABS,X
- BBXTBL DEFW 0E04H ; ZPG
- DEFW 0B06H ; ABS
- DEFW 2208H ; ZPG,X
- DEFW 2B10H ; ABS,X
- DEFW 260AH ; ZPG,Y
- CCTBL DEFW 0600H ; IMM
- DEFW 0E04H ; ZPG
- DEFW 0 ; INVALID
- DEFW 0B06H ; ABS
- ;
- ; BRANCH MASK TABLE
- ;
- MSKTBL DEFW 8026H ; BPL
- DEFW 801EH ; BMI
- DEFW 402EH ; BVC
- DEFW 4032H ; BVS
- DEFW 010EH ; BCC
- DEFW 0112H ; BCS
- DEFW 0222H ; BNE
- DEFW 0216H ; BEQ
- ;
- ; FLAG SET/RESET CODES
- ;
- FLGTBL DEFW 0135H ; CLC
- DEFW 01B1H ; SEC
- DEFW 043DH ; CLI
- DEFW 04B9H ; SEI
- DEFW 4041H ; CLV
- DEFW 0000 ; INVALID
- DEFW 0839H ; CLD
- DEFW 08B5H ; SED
- ;
- ; JUMP TABLES TO IMPLIED INSTRUCTIONS
- ;
- IMPTBL DEFW PPHP ; IMPLIED INSTR TABLE
- DEFW PPLP
- DEFW PPHA
- DEFW PPLA
- DEFW PDEY
- DEFW PTAY
- DEFW PINY
- DEFW PINX
- DEFW PTXA
- DEFW PTAX
- DEFW PDEX
- DEFW PNOP
- ;
- ; JUMP TABLE TO ADDR MODE PROCESSORS
- ;
- GETTBL DEFW PIMM ; INSTR MODE TABLE
- DEFW PACX
- DEFW PZPG
- DEFW PAB
- DEFW PZX
- DEFW PZY
- DEFW PZIX
- DEFW PZIY
- DEFW PABX
- DEFW PABY
- ;
- ; JUMP TABLES TO MULTI-MODE PROCESSORS
- ;
- EVNTBL DEFW PASL ; JUMPS TO PROCESSORS
- DEFW PBTRL
- DEFW PLSR
- DEFW PROR
- DEFW PSTXY
- DEFW PLDXY
- DEFW PDCY
- DEFW PICX
- ODDTBL DEFW PORA
- DEFW PAND
- DEFW PEOR
- DEFW PADC
- DEFW PSTA
- DEFW PLDA
- DEFW PCMP
- DEFW PSBC
- ;
- ; MNEMONIC ASCII CODES (PACKED INTO 2 BYTES)
- ;
- MNMTBL DEFW 0483H ; MNEMONIC TABLE
- DEFW 05C4H
- DEFW 066CH
- DEFW 0863H ; BCC
- DEFW 0873H
- DEFW 08B1H
- DEFW 0934H
- DEFW 09A9H
- DEFW 09C5H
- DEFW 0A0CH
- DEFW 0A4BH
- DEFW 0AC3H
- DEFW 0AD3H
- DEFW 0D83H ; CLC
- DEFW 0D84H
- DEFW 0D89H
- DEFW 0D96H
- DEFW 0DB0H
- DEFW 0E18H
- DEFW 0E19H
- DEFW 10A3H ; DEC
- DEFW 10B8H
- DEFW 10B9H
- DEFW 15F2H ; EOR
- DEFW 25C3H ; INC
- DEFW 25D8H
- DEFW 25D9H
- DEFW 29B0H ; JMP
- DEFW 2A72H
- DEFW 3081H ; LDA
- DEFW 3098H
- DEFW 3099H
- DEFW 3272H
- DEFW 39F0H ; NOP
- DEFW 3E41H ; ORA
- DEFW 4101H ; PHA
- DEFW 4110H
- DEFW 4181H
- DEFW 4190H
- DEFW 49ECH ; ROL
- DEFW 49F2H
- DEFW 4A89H
- DEFW 4A93H
- DEFW 4C43H ; SBC
- DEFW 4CA3H
- DEFW 4CA4H
- DEFW 4CA9H
- DEFW 4E81H
- DEFW 4E98H
- DEFW 4E99H
- DEFW 5038H ; TAX
- DEFW 5039H
- DEFW 5278H
- DEFW 5301H
- DEFW 5313H
- DEFW 5321H
- ;
- ; ADDRESS MODE PRINT TABLE
- ;
- AMDTBL DEFM ' $1 !' ; ADDR MODE TABLE...REL
- DEFM ' #$1 !' ; IMMEDIATE
- DEFM ' $21 !!' ; ABS
- DEFM ' $1 !' ; ZPG
- DEFM ' ' ; IMPLIED
- DEFM ' A ' ; ACCUM
- DEFM ' ($1,X)!' ; (ZPG,X)
- DEFM ' ($1),Y!' ; (ZPG),Y
- DEFM ' $1,X !' ; ZPG,X
- DEFM ' $1,Y !' ; ZPG,Y
- DEFM ' $21,X!!' ; ABS,X
- DEFM ' $21,Y!!' ; ABS,Y
- DEFM ' ($21)!!' ; INDIRECT
- ;
- ; THAT'S ALL!
- ;
- END
-