* NAM SYS09BUG12 SYSTEM09 MONITOR
|
* NAM SYS09BUG12 SYSTEM09 MONITOR
|
OPT l
|
OPT l
|
PAGE
|
PAGE
|
*
|
*
|
* MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
|
* MONITOR PROGRAM FOR THE SOUTHWEST TECHNICAL
|
* PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
|
* PRODUCTS MP-09 CPU BOARD AS COMMENTED BY....
|
*
|
*
|
* ALLEN CLARK WALLACE WATSON
|
* ALLEN CLARK WALLACE WATSON
|
* 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
|
* 2502 REGAL OAKS LANE 4815 EAST 97th AVE.
|
* LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
|
* LUTZ, FLA. 33549 TEMPLE TERRACE, FLA. 33617
|
* PH. 813-977-0347 PH. 813-985-1359
|
* PH. 813-977-0347 PH. 813-985-1359
|
*
|
*
|
* MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
|
* MODIFIED TO SBUG09 VER 1.8 BY: RANDY JARRETT
|
* 2561 NANTUCKET DR APT. E
|
* 2561 NANTUCKET DR APT. E
|
* ATLANTA, GA 30345
|
* ATLANTA, GA 30345
|
* PH. 404-320-1043
|
* PH. 404-320-1043
|
*
|
*
|
* MODIFIED TO SYS09BUG VER 1.0
|
* MODIFIED TO SYS09BUG VER 1.0
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* BY: JOHN KENT
|
* BY: JOHN KENT
|
* DATE: 21ST NOVEMBER 2006
|
* DATE: 21ST NOVEMBER 2006
|
* REMOVED: DISK BOOTS
|
* REMOVED: DISK BOOTS
|
* MEMORY TEST
|
* MEMORY TEST
|
* ADDED: ADM3A VDU DRIVER
|
* ADDED: ADM3A VDU DRIVER
|
*
|
*
|
* MODIFIED TO SYS09BUG VER 1.1
|
* MODIFIED TO SYS09BUG VER 1.1
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* BY: JOHN KENT
|
* BY: JOHN KENT
|
* DATE: 7TH JANUARY 2007
|
* DATE: 7TH JANUARY 2007
|
* ADDED: 'U' USER EXTENTION COMMANDS AT $F000
|
* ADDED: 'U' USER EXTENTION COMMANDS AT $F000
|
* CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
|
* CONDITIONAL ASSEMBLY OF FLOPPY BOOTS
|
* AND REALTIME CLOCK
|
* AND REALTIME CLOCK
|
*
|
*
|
* MODIFIED TO SYS09BUG VER 1.2
|
* MODIFIED TO SYS09BUG VER 1.2
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* BY: JOHN KENT
|
* BY: JOHN KENT
|
* DATE: 21ST MAY 2007
|
* DATE: 21ST MAY 2007
|
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION
|
* ADDED: COMPACT FLASH BOOT TO FPGA VERSION
|
* REMOVED PORT REDIRECTION ON PUNCH & LOAD
|
* REMOVED PORT REDIRECTION ON PUNCH & LOAD
|
*
|
*
|
* Modified to SYS09BUG VER 1.3
|
* Modified to SYS09BUG VER 1.3
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* BY: JOHN KENT
|
* BY: JOHN KENT
|
* DATE: 8TH JAN 2008
|
* DATE: 8TH JAN 2008
|
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
|
* ADDED: CONDITIONALS FOR SPARTAN3E STARTER BOARD
|
* WITH ONLY 32K OF RAM
|
* WITH ONLY 32K OF RAM
|
*
|
*
|
* Modified to SYS09BUG VER 1.4
|
* Modified to SYS09BUG VER 1.4
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* FOR: SYSTEM09 FPGA SYSTEM
|
* BY: JOHN KENT
|
* BY: JOHN KENT
|
* DATE: 3RD FEB 2008
|
* DATE: 3RD FEB 2008
|
* ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
|
* ADDED: CONDITIONALS FOR XESS BOARD WITH IDE
|
* SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
|
* SEPERATE CONDITIONAL FOR S3 STARTER AND B5-X300
|
* 16 BIT IDE DISK BOOT STRAP ROUTINE
|
* 16 BIT IDE DISK BOOT STRAP ROUTINE
|
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
|
* CHANGED: SEPARARTED OPTIONS EQUATES AND BODY INTO SEPARATE FILES
|
*
|
*
|
* *** COMMANDS ***
|
* *** COMMANDS ***
|
*
|
*
|
* CONTROL A = ALTER THE "A" ACCUMULATOR
|
* CONTROL A = ALTER THE "A" ACCUMULATOR
|
* CONTROL B = ALTER THE "B" ACCUMULATOR
|
* CONTROL B = ALTER THE "B" ACCUMULATOR
|
* CONTROL C = ALTER THE CONDITION CODE REGISTER
|
* CONTROL C = ALTER THE CONDITION CODE REGISTER
|
* CONTROL D = ALTER THE DIRECT PAGE REGISTER
|
* CONTROL D = ALTER THE DIRECT PAGE REGISTER
|
* CONTROL P = ALTER THE PROGRAM COUNTER
|
* CONTROL P = ALTER THE PROGRAM COUNTER
|
* CONTROL U = ALTER USER STACK POINTER
|
* CONTROL U = ALTER USER STACK POINTER
|
* CONTROL X = ALTER "X" INDEX REGISTER
|
* CONTROL X = ALTER "X" INDEX REGISTER
|
* CONTROL Y = ALTER "Y" INDEX REGISTER
|
* CONTROL Y = ALTER "Y" INDEX REGISTER
|
* B hhhh = SET BREAKPOINT AT LOCATION $hhhh
|
* B hhhh = SET BREAKPOINT AT LOCATION $hhhh
|
* D = 5.25" MINIFLOPPY BOOT
|
* D = 5.25" MINIFLOPPY BOOT
|
* E ssss-eeee = EXAMINE MEMORY
|
* E ssss-eeee = EXAMINE MEMORY
|
* FROM STARTING ADDRESS ssss
|
* FROM STARTING ADDRESS ssss
|
* TO ENDING ADDRESS eeee.
|
* TO ENDING ADDRESS eeee.
|
* G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
|
* G = CONTINUE EXECUTION FROM BREAKPOINT OR SWI
|
* L = LOAD TAPE
|
* L = LOAD TAPE
|
* M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
|
* M hhhh = EXAMINE AND CHANGE MEMORY LOCATION hhhh
|
* P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
|
* P ssss-eeee = PUNCH TAPE, START ssss TO END eeee ADDR.
|
* R = DISPLAY REGISTER CONTENTS
|
* R = DISPLAY REGISTER CONTENTS
|
* S = DISPLAY STACK FROM ssss TO $DFC0
|
* S = DISPLAY STACK FROM ssss TO $DFC0
|
* U = 8" DMAF2 FLOPPY BOOT
|
* U = 8" DMAF2 FLOPPY BOOT
|
* U = USER EXTENSION COMMANDS AT $F000
|
* U = USER EXTENSION COMMANDS AT $F000
|
* X = REMOVE ALL BREAKPOINTS
|
* X = REMOVE ALL BREAKPOINTS
|
*
|
*
|
*
|
*
|
***************************************************
|
***************************************************
|
* SYS09BUG VARIABLE SPACE
|
* SYS09BUG VARIABLE SPACE
|
***************************************************
|
***************************************************
|
*
|
*
|
ORG MONRAM
|
ORG MONRAM
|
STACK EQU * TOP OF INTERNAL STACK
|
STACK EQU * TOP OF INTERNAL STACK
|
NMI RMB 2 USER NMI VECTOR
|
NMI RMB 2 USER NMI VECTOR
|
SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
|
SWI3 RMB 2 SOFTWARE INTERRUPT VECTOR #3
|
SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
|
SWI2 RMB 2 SOFTWARE INTERRUPT VECTOR #2
|
FIRQ RMB 2 FAST INTERRUPT VECTOR
|
FIRQ RMB 2 FAST INTERRUPT VECTOR
|
IRQ RMB 2 INTERRUPT VECTOR
|
IRQ RMB 2 INTERRUPT VECTOR
|
SWI RMB 2 SOFTWARE INTERRUPT VECTOR
|
SWI RMB 2 SOFTWARE INTERRUPT VECTOR
|
SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
|
SVCVO RMB 2 SUPERVISOR CALL VECTOR ORGIN
|
SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
|
SVCVL RMB 2 SUPERVISOR CALL VECTOR LIMIT
|
IFD DATOPT
|
IFD DATOPT
|
LRARAM RMB 16 LRA ADDRESSES
|
LRARAM RMB 16 LRA ADDRESSES
|
ENDIF DATOPT
|
ENDIF DATOPT
|
CPORT RMB 2 RE-VECTORABLE CONTROL PORT
|
CPORT RMB 2 RE-VECTORABLE CONTROL PORT
|
ECHO RMB 1 ECHO FLAG
|
ECHO RMB 1 ECHO FLAG
|
BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
|
BPTBL RMB 24 BREAKPOINT TABLE BASE ADDR
|
IFD TRAOPT
|
IFD TRAOPT
|
NMISAV RMB 2 NMI Jump Vector Backup
|
NMISAV RMB 2 NMI Jump Vector Backup
|
TRACNT RMB 2 Trace Count
|
TRACNT RMB 2 Trace Count
|
ENDIF TRAOPT
|
ENDIF TRAOPT
|
IFD VDUOPT
|
IFD VDUOPT
|
*
|
*
|
**************************************************
|
**************************************************
|
* VDU8 DISPLAY DRIVER VARIABLES *
|
* VDU8 DISPLAY DRIVER VARIABLES *
|
**************************************************
|
**************************************************
|
*
|
*
|
**** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
|
**** ALWAYS KEEP COLADX AND ROWADX TOGETHER ******
|
COLADX RMB 1 CURSOR COLUMN
|
COLADX RMB 1 CURSOR COLUMN
|
ROWADX RMB 1 CURSOR ROW
|
ROWADX RMB 1 CURSOR ROW
|
**************************************************
|
**************************************************
|
*
|
*
|
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
|
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
|
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
|
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
|
ENDIF VDUOPT
|
ENDIF VDUOPT
|
IFD DG640OPT
|
IFD DG640OPT
|
*
|
*
|
***************************************************
|
***************************************************
|
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
|
* DG640 MEMORY MAPPED DISPLAY DRIVER VARIABLES *
|
***************************************************
|
***************************************************
|
*
|
*
|
***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
|
***** ALWAYS KEEP THESE TWO BYTES TOGETHER *****
|
COLADX RMB 1 CURSOR COLUMN
|
COLADX RMB 1 CURSOR COLUMN
|
ROWADX RMB 1 CURSOR ROW
|
ROWADX RMB 1 CURSOR ROW
|
*************************************************
|
*************************************************
|
CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
|
CURSOR RMB 2 ABSOLUTE SCREEN ADDRESS
|
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
|
NEWROW RMB 1 NEW ROW TEMP FOR ESCAPE
|
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
|
ESCFLG RMB 1 ESCAPE SEQUENCE ACTIVE
|
ENDIF DG640OPT
|
ENDIF DG640OPT
|
*
|
*
|
*
|
*
|
***************************************************
|
***************************************************
|
* START OF ROM *
|
* START OF ROM *
|
***************************************************
|
***************************************************
|
*
|
*
|
ORG MONROM
|
ORG MONROM
|
FDB MONITOR
|
FDB MONITOR
|
FDB NEXTCMD
|
FDB NEXTCMD
|
FDB INCH
|
FDB INCH
|
FDB INCHE
|
FDB INCHE
|
FDB INCHEK
|
FDB INCHEK
|
FDB OUTCH
|
FDB OUTCH
|
FDB PDATA
|
FDB PDATA
|
FDB PCRLF
|
FDB PCRLF
|
FDB PSTRNG
|
FDB PSTRNG
|
FDB LRA
|
FDB LRA
|
*
|
*
|
IFD ADSOPT
|
IFD ADSOPT
|
FDB PCHK CHECK FOR PRINTER INPUT
|
FDB PCHK CHECK FOR PRINTER INPUT
|
FDB PINIZ INITIATE PRINTER
|
FDB PINIZ INITIATE PRINTER
|
FDB POUTCH OUTPUT CH. TO PRINTER
|
FDB POUTCH OUTPUT CH. TO PRINTER
|
FDB VINIZ
|
FDB VINIZ
|
FDB VOUTCH
|
FDB VOUTCH
|
FDB ACINIZ
|
FDB ACINIZ
|
FDB AOUTCH
|
FDB AOUTCH
|
ENDIF ADSOPT
|
ENDIF ADSOPT
|
*
|
*
|
* MONITOR
|
* MONITOR
|
*
|
*
|
* VECTOR ADDRESS STRING IS.....
|
* VECTOR ADDRESS STRING IS.....
|
* $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
|
* $F8A1-$F8A1-$F8A1-$F8A1-$F8A1-$FAB0-$FFFF-$FFFF
|
*
|
*
|
MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
|
MONITOR LDX #RAMVEC POINT TO VECTOR ADDR. STRING
|
LDY #STACK POINT TO RAM VECTOR LOCATION
|
LDY #STACK POINT TO RAM VECTOR LOCATION
|
LDB #$10 BYTES TO MOVE = 16
|
LDB #$10 BYTES TO MOVE = 16
|
LOOPA LDA ,X+ GET VECTOR BYTE
|
LOOPA LDA ,X+ GET VECTOR BYTE
|
STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
|
STA ,Y+ PUT VECTORS IN RAM / $DFC0-$DFCF
|
DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
|
DECB SUBTRACT 1 FROM NUMBER OF BYTES TO MOVE
|
BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
|
BNE LOOPA CONTINUE UNTIL ALL VECTORS MOVED
|
*
|
*
|
* CONTENTS FROM TO FUNCTION
|
* CONTENTS FROM TO FUNCTION
|
* $F8A1 $FE40 $DFC0 USER-V
|
* $F8A1 $FE40 $DFC0 USER-V
|
* $F8A1 $FE42 $DFC2 SWI3-V
|
* $F8A1 $FE42 $DFC2 SWI3-V
|
* $F8A1 $FE44 $DFC4 SWI2-V
|
* $F8A1 $FE44 $DFC4 SWI2-V
|
* $F8A1 $FE46 $DFC6 FIRQ-V
|
* $F8A1 $FE46 $DFC6 FIRQ-V
|
* $F8A1 $FE48 $DFC8 IRQ-V
|
* $F8A1 $FE48 $DFC8 IRQ-V
|
* $FAB0 $FE4A $DFCA SWI-V
|
* $FAB0 $FE4A $DFCA SWI-V
|
* $FFFF $FE4C $DFCC SVC-VO
|
* $FFFF $FE4C $DFCC SVC-VO
|
* $FFFF $FE4E $DFCE SVC-VL
|
* $FFFF $FE4E $DFCE SVC-VL
|
*
|
*
|
LDX #ACIAS
|
LDX #ACIAS
|
STX CPORT STORE ADDR. IN RAM
|
STX CPORT STORE ADDR. IN RAM
|
LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
|
LBSR XBKPNT CLEAR OUTSTANDING BREAKPOINTS
|
LDB #12 CLEAR 12 BYTES ON STACK
|
LDB #12 CLEAR 12 BYTES ON STACK
|
CLRSTK CLR ,-S
|
CLRSTK CLR ,-S
|
DECB
|
DECB
|
BNE CLRSTK
|
BNE CLRSTK
|
LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
|
LEAX MONITOR,PCR SET PC TO SBUG-E ENTRY
|
STX 10,S ON STACK
|
STX 10,S ON STACK
|
LDA #$D0 PRESET CONDITION CODES ON STACK
|
LDA #$D0 PRESET CONDITION CODES ON STACK
|
STA ,S
|
STA ,S
|
TFR S,U
|
TFR S,U
|
LBSR IOINIZ INITIALIZE CONTROL PORT
|
LBSR IOINIZ INITIALIZE CONTROL PORT
|
LDX #MSG1 POINT TO MONITOR MESSAGE
|
LDX #MSG1 POINT TO MONITOR MESSAGE
|
LBSR PDATA PRINT MSG
|
LBSR PDATA PRINT MSG
|
*
|
*
|
IFD DATOPT
|
IFD DATOPT
|
LDX #LRARAM POINT TO LRA RAM STORAGE AREA
|
LDX #LRARAM POINT TO LRA RAM STORAGE AREA
|
CLRA START TOTAL AT ZERO
|
CLRA START TOTAL AT ZERO
|
LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
|
LDB #13 TOTAL UP ALL ACTIVE RAM MEMORY
|
FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
|
FNDREL TST B,X TEST FOR RAM AT NEXT LOC.
|
BEQ RELPAS IF NO RAM GO TO NEXT LOC.
|
BEQ RELPAS IF NO RAM GO TO NEXT LOC.
|
ADDA #4 ELSE ADD 4K TO TOTAL
|
ADDA #4 ELSE ADD 4K TO TOTAL
|
DAA ADJ. TOTAL FOR DECIMAL
|
DAA ADJ. TOTAL FOR DECIMAL
|
RELPAS DECB SUB. 1 FROM LOCS. TO TEST
|
RELPAS DECB SUB. 1 FROM LOCS. TO TEST
|
BPL FNDREL PRINT TOTAL OF RAM
|
BPL FNDREL PRINT TOTAL OF RAM
|
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
|
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
|
LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
|
LDX #MSG2 POINT TO MSG 'K' CR/LF + 3 NULS
|
LBSR PDATA PRINT MSG
|
LBSR PDATA PRINT MSG
|
ENDIF DATOPT
|
ENDIF DATOPT
|
*
|
*
|
IFD TRAOPT
|
IFD TRAOPT
|
LBSR TRAINZ
|
LBSR TRAINZ
|
ENDIF TRAOPT
|
ENDIF TRAOPT
|
*
|
*
|
***** NEXTCMD *****
|
***** NEXTCMD *****
|
*
|
*
|
NEXTCMD LDX #MSG3 POINT TO MSG ">"
|
NEXTCMD LDX #MSG3 POINT TO MSG ">"
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
LBSR INCH GET ONE CHAR. FROM TERMINAL
|
LBSR INCH GET ONE CHAR. FROM TERMINAL
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
CMPA #$0D IS IT CARRIAGE RETURN ?
|
CMPA #$0D IS IT CARRIAGE RETURN ?
|
BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
|
BEQ NEXTCMD IF CR THEN GET ANOTHER CHAR.
|
TFR A,B PUT CHAR. IN "B" ACCUM.
|
TFR A,B PUT CHAR. IN "B" ACCUM.
|
CMPA #$20 IS IT CONTROL OR DATA CHAR ?
|
CMPA #$20 IS IT CONTROL OR DATA CHAR ?
|
BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
|
BGE PRTCMD IF CMD CHAR IS DATA, PRNT IT
|
LDA #'^ ELSE CNTRL CHAR CMD SO...
|
LDA #'^ ELSE CNTRL CHAR CMD SO...
|
LBSR OUTCH PRINT "^"
|
LBSR OUTCH PRINT "^"
|
TFR B,A RECALL CNTRL CMD CHAR
|
TFR B,A RECALL CNTRL CMD CHAR
|
ADDA #$40 CONVERT IT TO ASCII LETTER
|
ADDA #$40 CONVERT IT TO ASCII LETTER
|
PRTCMD LBSR OUTCH PRNT CMD CHAR
|
PRTCMD LBSR OUTCH PRNT CMD CHAR
|
LBSR OUT1S PRNT SPACE
|
LBSR OUT1S PRNT SPACE
|
CMPB #$60
|
CMPB #$60
|
BLE NXTCH0
|
BLE NXTCH0
|
SUBB #$20
|
SUBB #$20
|
*
|
*
|
***** DO TABLE LOOKUP *****
|
***** DO TABLE LOOKUP *****
|
* FOR COMMAND FUNCTIONS
|
* FOR COMMAND FUNCTIONS
|
*
|
*
|
NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
|
NXTCH0 LDX #JMPTAB POINT TO JUMP TABLE
|
NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
|
NXTCHR CMPB ,X+ DOES COMMAND MATCH TABLE ENTRY ?
|
BEQ JMPCMD BRANCH IF MATCH FOUND
|
BEQ JMPCMD BRANCH IF MATCH FOUND
|
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
|
LEAX 2,X POINT TO NEXT ENTRY IN TABLE
|
CMPX #TABEND REACHED END OF TABLE YET ?
|
CMPX #TABEND REACHED END OF TABLE YET ?
|
BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
|
BNE NXTCHR IF NOT END, CHECK NEXT ENTRY
|
LDX #MSG4 POINT TO MSG "WHAT?"
|
LDX #MSG4 POINT TO MSG "WHAT?"
|
LBSR PDATA PRINT MSG
|
LBSR PDATA PRINT MSG
|
BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
|
BRA NEXTCMD IF NO MATCH, PRMPT FOR NEW CMD
|
JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
|
JMPCMD JSR [,X] JUMP TO COMMAND ROUTINE
|
BRA NEXTCMD PROMPT FOR NEW COMMAND
|
BRA NEXTCMD PROMPT FOR NEW COMMAND
|
*
|
*
|
* "G" GO OR CONTINUE
|
* "G" GO OR CONTINUE
|
*
|
*
|
GO TFR U,S
|
GO TFR U,S
|
RTI RTI
|
RTI RTI
|
*
|
*
|
***** "M" MEMORY EXAMINE AND CHANGE *****
|
***** "M" MEMORY EXAMINE AND CHANGE *****
|
*
|
*
|
MEMCHG LBSR IN1ADR INPUT ADDRESS
|
MEMCHG LBSR IN1ADR INPUT ADDRESS
|
BVS CHRTN IF NOT HEX, RETURN
|
BVS CHRTN IF NOT HEX, RETURN
|
TFR X,Y SAVE ADDR IN "Y"
|
TFR X,Y SAVE ADDR IN "Y"
|
MEMC2 LDX #MSG5 POINT TO MSG " - "
|
MEMC2 LDX #MSG5 POINT TO MSG " - "
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
TFR Y,X FETCH ADDRESS
|
TFR Y,X FETCH ADDRESS
|
LBSR OUT4H PRINT ADDR IN HEX
|
LBSR OUT4H PRINT ADDR IN HEX
|
LBSR OUT1S OUTPUT SPACE
|
LBSR OUT1S OUTPUT SPACE
|
LDA ,Y GET CONTENTS OF CURRENT ADDR.
|
LDA ,Y GET CONTENTS OF CURRENT ADDR.
|
LBSR OUT2H OUTPUT CONTENTS IN ASCII
|
LBSR OUT2H OUTPUT CONTENTS IN ASCII
|
LBSR OUT1S OUTPUT SPACE
|
LBSR OUT1S OUTPUT SPACE
|
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
|
LBSR BYTE LOOP WAITING FOR OPERATOR INPUT
|
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
|
BVC CHANGE IF VALID HEX GO CHANGE MEM. LOC.
|
CMPA #8 IS IT A BACKSPACE (CNTRL H)?
|
CMPA #8 IS IT A BACKSPACE (CNTRL H)?
|
BEQ MEMC2 PROMPT OPERATOR AGAIN
|
BEQ MEMC2 PROMPT OPERATOR AGAIN
|
CMPA #$18 IS IT A CANCEL (CNTRL X)?
|
CMPA #$18 IS IT A CANCEL (CNTRL X)?
|
BEQ MEMC2 PROMPT OPERATOR AGAIN
|
BEQ MEMC2 PROMPT OPERATOR AGAIN
|
CMPA #'^ IS IT AN UP ARROW?
|
CMPA #'^ IS IT AN UP ARROW?
|
BEQ BACK DISPLAY PREVIOUS BYTE
|
BEQ BACK DISPLAY PREVIOUS BYTE
|
CMPA #$D IS IT A CR?
|
CMPA #$D IS IT A CR?
|
BNE FORWRD DISPLAY NEXT BYTE
|
BNE FORWRD DISPLAY NEXT BYTE
|
CHRTN RTS EXIT ROUTINE
|
CHRTN RTS EXIT ROUTINE
|
*
|
*
|
*
|
*
|
CHANGE STA ,Y CHANGE BYTE IN MEMORY
|
CHANGE STA ,Y CHANGE BYTE IN MEMORY
|
CMPA ,Y DID MEMORY BYTE CHANGE?
|
CMPA ,Y DID MEMORY BYTE CHANGE?
|
BEQ FORWRD $F972
|
BEQ FORWRD $F972
|
LBSR OUT1S OUTPUT SPACE
|
LBSR OUT1S OUTPUT SPACE
|
LDA #'? LOAD QUESTION MARK
|
LDA #'? LOAD QUESTION MARK
|
LBSR OUTCH PRINT IT
|
LBSR OUTCH PRINT IT
|
FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
|
FORWRD LEAY 1,Y POINT TO NEXT HIGHER MEM LOCATION
|
BRA MEMC2 PRINT LOCATION & CONTENTS
|
BRA MEMC2 PRINT LOCATION & CONTENTS
|
BACK LEAY -1,Y POINT TO LAST MEM LOCATION
|
BACK LEAY -1,Y POINT TO LAST MEM LOCATION
|
BRA MEMC2 PRINT LOCATION & CONTENTS
|
BRA MEMC2 PRINT LOCATION & CONTENTS
|
*
|
*
|
* "S" DISPLAY STACK
|
* "S" DISPLAY STACK
|
* HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
|
* HEX-ASCII DISPLAY OF CURRENT STACK CONTENTS FROM
|
** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
|
** CURRENT STACK POINTER TO INTERNAL STACK LIMIT.
|
*
|
*
|
DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
|
DISSTK LBSR PRTSP PRINT CURRENT STACK POINTER
|
TFR U,Y
|
TFR U,Y
|
LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
|
LDX #STACK LOAD INTERNAL STACK AS UPPER LIMIT
|
LEAX -1,X POINT TO CURRENT STACK
|
LEAX -1,X POINT TO CURRENT STACK
|
BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
|
BRA MDUMP1 ENTER MEMORY DUMP OF STACK CONTENTS
|
*
|
*
|
* "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
|
* "E" DUMP MEMORY FOR EXAMINE IN HEX AND ASCII
|
* AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
|
* AFTER CALLING 'IN2ADR' LOWER ADDRESS IN Y-REG.
|
* UPPER ADDRESS IN X-REG.
|
* UPPER ADDRESS IN X-REG.
|
* IF HEX ADDRESSES ARE INVALID (V)=1.
|
* IF HEX ADDRESSES ARE INVALID (V)=1.
|
*
|
*
|
MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
|
MEMDUMP LBSR IN2ADR INPUT ADDRESS BOUNDRIES
|
BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
|
BVS EDPRTN NEW COMMAND IF ILLEGAL HEX
|
MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
|
MDUMP1 PSHS Y COMPARE LOWER TO UPPER BOUNDS
|
CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
|
CMPX ,S++ LOWER BOUNDS > UPPER BOUNDS?
|
BCC AJDUMP IF NOT, DUMP HEX AND ASCII
|
BCC AJDUMP IF NOT, DUMP HEX AND ASCII
|
EDPRTN RTS ;
|
EDPRTN RTS ;
|
*
|
*
|
* ADJUST LOWER AND UPPER ADDRESS LIMITS
|
* ADJUST LOWER AND UPPER ADDRESS LIMITS
|
* TO EVEN 16 BYTE BOUNDRIES.
|
* TO EVEN 16 BYTE BOUNDRIES.
|
*
|
*
|
* IF LOWER ADDR = $4532
|
* IF LOWER ADDR = $4532
|
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
|
* LOWER BOUNDS WILL BE ADJUSTED TO = $4530.
|
*
|
*
|
* IF UPPER ADDR = $4567
|
* IF UPPER ADDR = $4567
|
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
|
* UPPER BOUNDS WILL BE ADJUSTED TO = $4570.
|
*
|
*
|
* ENTER WITH LOWER ADDRESS IN X-REG.
|
* ENTER WITH LOWER ADDRESS IN X-REG.
|
* -UPPER ADDRESS ON TOP OF STACK.
|
* -UPPER ADDRESS ON TOP OF STACK.
|
*
|
*
|
AJDUMP TFR X,D GET UPPER ADDR IN D-REG
|
AJDUMP TFR X,D GET UPPER ADDR IN D-REG
|
ADDD #$10 ADD 16 TO UPPER ADDRESS
|
ADDD #$10 ADD 16 TO UPPER ADDRESS
|
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
|
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
|
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
|
PSHS A,B SAVE ON STACK AS UPPER DUMP LIMIT
|
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
|
TFR Y,D $F9A5 GET LOWER ADDRESS IN D-REG
|
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
|
ANDB #$F0 MASK TO EVEN 16 BYTE BOUNDRY
|
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
|
TFR D,X PUT IN X-REG AS LOWER DUMP LIMIT
|
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
|
NXTLIN CMPX ,S COMPARE LOWER TO UPPER LIMIT
|
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
|
BEQ SKPDMP IF EQUAL SKIP HEX-ASCII DUMP
|
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
|
LBSR INCHEK CHECK FOR INPUT FROM KEYBOARD
|
BEQ EDUMP
|
BEQ EDUMP
|
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
|
SKPDMP LEAS 2,S READJUST STACK IF NOT DUMPING
|
RTS ;
|
RTS ;
|
*
|
*
|
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
|
* PRINT 16 HEX BYTES FOLLOWED BY 16 ASCII CHARACTERS
|
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
|
* FOR EACH LINE THROUGHOUT ADDRESS LIMITS.
|
*
|
*
|
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
|
EDUMP PSHS X PUSH LOWER ADDR LIMIT ON STACK
|
LDX #MSG5 POINT TO MSG " - "
|
LDX #MSG5 POINT TO MSG " - "
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
|
LDX ,S LOAD LOWER ADDR FROM TOP OF STACK
|
LBSR OUT4H PRINT THE ADDRESS
|
LBSR OUT4H PRINT THE ADDRESS
|
LBSR OUT2S 2 SPACES
|
LBSR OUT2S 2 SPACES
|
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
|
LDB #$10 LOAD COUNT OF 16 BYTES TO DUMP
|
ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
|
ELOOP LDA ,X+ GET FROM MEMORY HEX BYTE TO PRINT
|
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
|
LBSR OUT2H OUTPUT HEX BYTE AS ASCII
|
LBSR OUT1S OUTPUT SPACE
|
LBSR OUT1S OUTPUT SPACE
|
DECB $F9D1 DECREMENT BYTE COUNT
|
DECB $F9D1 DECREMENT BYTE COUNT
|
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
|
BNE ELOOP CONTINUE TIL 16 HEX BYTES PRINTED
|
*
|
*
|
* PRINT 16 ASCII CHARACTERS
|
* PRINT 16 ASCII CHARACTERS
|
* IF NOT PRINTABLE OR NOT VALID
|
* IF NOT PRINTABLE OR NOT VALID
|
* ASCII PRINT A PERIOD (.)
|
* ASCII PRINT A PERIOD (.)
|
LBSR OUT2S 2 SPACES
|
LBSR OUT2S 2 SPACES
|
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
|
LDX ,S++ GET LOW LIMIT FRM STACK - ADJ STACK
|
LDB #$10 SET ASCII CHAR TO PRINT = 16
|
LDB #$10 SET ASCII CHAR TO PRINT = 16
|
EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
|
EDPASC LDA ,X+ GET CHARACTER FROM MEMORY
|
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
|
CMPA #$20 IF LESS THAN $20, NON-PRINTABLE?
|
BCS PERIOD IF SO, PRINT PERIOD INSTEAD
|
BCS PERIOD IF SO, PRINT PERIOD INSTEAD
|
CMPA #$7E IS IT VALID ASCII?
|
CMPA #$7E IS IT VALID ASCII?
|
BLS PRASC IF SO PRINT IT
|
BLS PRASC IF SO PRINT IT
|
PERIOD LDA #'. LOAD A PERIOD (.)
|
PERIOD LDA #'. LOAD A PERIOD (.)
|
PRASC LBSR OUTCH PRINT ASCII CHARACTER
|
PRASC LBSR OUTCH PRINT ASCII CHARACTER
|
DECB DECREMENT COUNT
|
DECB DECREMENT COUNT
|
BNE EDPASC
|
BNE EDPASC
|
BRA NXTLIN
|
BRA NXTLIN
|
*
|
*
|
***** "B" SET BREAKPOINT *****
|
***** "B" SET BREAKPOINT *****
|
*
|
*
|
BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
|
BRKPNT LBSR IN1ADR GET BREAKPOINT ADDRESS
|
BVS EXITBP EXIT IF INVALID HEX ADDR.
|
BVS EXITBP EXIT IF INVALID HEX ADDR.
|
CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
|
CMPX #STACK ADDRESS ILLEGAL IF >=$DFC0
|
BCC BPERR IF ERROR PRINT (?), EXIT
|
BCC BPERR IF ERROR PRINT (?), EXIT
|
PSHS X $FA82 PUSH BP ADDRESS ON STACK
|
PSHS X $FA82 PUSH BP ADDRESS ON STACK
|
LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
|
LDX #$FFFF LOAD DUMMY ADDR TO TEST BP TABLE
|
BSR BPTEST TEST BP TABLE FOR FREE SPACE
|
BSR BPTEST TEST BP TABLE FOR FREE SPACE
|
PULS X POP BP ADDRESS FROM STACK
|
PULS X POP BP ADDRESS FROM STACK
|
BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
|
BEQ BPERR (Z) SET, OUT OF BP TABLE SPACE
|
LDA ,X GET DATA AT BREAKPOINT ADDRESS
|
LDA ,X GET DATA AT BREAKPOINT ADDRESS
|
CMPA #$3F IS IT A SWI?
|
CMPA #$3F IS IT A SWI?
|
BEQ BPERR IF SWI ALREADY, INDICATE ERROR
|
BEQ BPERR IF SWI ALREADY, INDICATE ERROR
|
STA ,Y+ SAVE DATA BYTE IN BP TABLE
|
STA ,Y+ SAVE DATA BYTE IN BP TABLE
|
STX ,Y SAVE BP ADDRESS IN BP TABLE
|
STX ,Y SAVE BP ADDRESS IN BP TABLE
|
LDA #$3F LOAD A SWI ($3F)
|
LDA #$3F LOAD A SWI ($3F)
|
STA ,X SAVE SWI AT BREAKPOINT ADDRESS
|
STA ,X SAVE SWI AT BREAKPOINT ADDRESS
|
EXITBP RTS ;
|
EXITBP RTS ;
|
*
|
*
|
* INDICATE ERROR SETTING BREAKPOINT
|
* INDICATE ERROR SETTING BREAKPOINT
|
*
|
*
|
BPERR LBSR OUT1S OUTPUT SPACE
|
BPERR LBSR OUT1S OUTPUT SPACE
|
LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
|
LDA #'? LOAD (?), INDICATE BREAKPOINT ERROR
|
LBRA OUTCH PRINT "?"
|
LBRA OUTCH PRINT "?"
|
*
|
*
|
*** "X" CLEAR OUTSTANDING BREAKPOINTS ***
|
*** "X" CLEAR OUTSTANDING BREAKPOINTS ***
|
*
|
*
|
XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
|
XBKPNT LDY #BPTBL POINT TO BREAKPOINT TABLE
|
LDB #8 LOAD BREAKPOINT COUNTER
|
LDB #8 LOAD BREAKPOINT COUNTER
|
XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
|
XBPLP BSR RPLSWI REMOVE USED ENTRY IN BP TABLE
|
DECB $FAAC DECREMENT BP COUNTER
|
DECB $FAAC DECREMENT BP COUNTER
|
BNE XBPLP END OF BREAKPOINT TABLE?
|
BNE XBPLP END OF BREAKPOINT TABLE?
|
RTS
|
RTS
|
*
|
*
|
***** SWI ENTRY POINT *****
|
***** SWI ENTRY POINT *****
|
*
|
*
|
SWIE TFR S,U TRANSFER STACK TO USER POINTER
|
SWIE TFR S,U TRANSFER STACK TO USER POINTER
|
LDX 10,U LOAD PC FROM STACK INTO X-REG
|
LDX 10,U LOAD PC FROM STACK INTO X-REG
|
LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
|
LEAX -1,X ADJUST ADDR DOWN 1 BYTE.
|
BSR BPTEST FIND BREAKPOINT IN BP TABLE
|
BSR BPTEST FIND BREAKPOINT IN BP TABLE
|
BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
|
BEQ REGPR IF FOUND, REPLACE DATA AT BP ADDR
|
STX 10,U SAVE BREAKPOINT ADDR IN STACK
|
STX 10,U SAVE BREAKPOINT ADDR IN STACK
|
BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
|
BSR RPLSWI GO REPLACE SWI WITH ORIGINAL DATA
|
REGPR LBSR REGSTR GO PRINT REGISTERS
|
REGPR LBSR REGSTR GO PRINT REGISTERS
|
*
|
*
|
IFD TRAOPT
|
IFD TRAOPT
|
LDX #0
|
LDX #0
|
STX TRACNT
|
STX TRACNT
|
ENDIF TRAOPT
|
ENDIF TRAOPT
|
*
|
*
|
LBRA NEXTCMD GET NEXT COMMAND
|
LBRA NEXTCMD GET NEXT COMMAND
|
*
|
*
|
RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
|
RPLSWI LDX 1,Y LOAD BP ADDRESS FROM BP TABLE
|
CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
|
CMPX #STACK COMPARE TO TOP AVAILABLE USER MEMORY
|
BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
|
BCC FFSTBL GO RESET TABLE ENTRY TO $FF'S
|
LDA ,X GET DATA FROM BP ADDRESS
|
LDA ,X GET DATA FROM BP ADDRESS
|
CMPA #$3F IS IT SWI?
|
CMPA #$3F IS IT SWI?
|
BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
|
BNE FFSTBL IF NOT, RESET TABLE ENTRY TO $FF'S
|
LDA ,Y GET ORIGINAL DATA FROM BP TABLE
|
LDA ,Y GET ORIGINAL DATA FROM BP TABLE
|
STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
|
STA ,X $FAD3 RESTORE DATA AT BP ADDRESS
|
FFSTBL LDA #$FF LOAD $FF IN A-ACC
|
FFSTBL LDA #$FF LOAD $FF IN A-ACC
|
STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
|
STA ,Y+ RESET BREAKPOINT TABLE DATA TO $FF'S
|
STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
|
STA ,Y+ RESET BREAKPOINT TABLE ADDR TO $FF'S
|
STA ,Y+
|
STA ,Y+
|
RTS
|
RTS
|
*
|
*
|
** SEARCH BREAKPOINT TABLE FOR MATCH **
|
** SEARCH BREAKPOINT TABLE FOR MATCH **
|
*
|
*
|
BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
|
BPTEST LDY #BPTBL POINT TO BREAKPOINT TABLE
|
LDB #8 LOAD BREAKPOINT COUNTER
|
LDB #8 LOAD BREAKPOINT COUNTER
|
FNDBP LDA ,Y+ LOAD DATA BYTE
|
FNDBP LDA ,Y+ LOAD DATA BYTE
|
CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
|
CMPX ,Y++ COMPARE ADDRESS, IS IT SAME?
|
BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
|
BEQ BPADJ IF SO, ADJUST POINTER FOR TABLE ENTRY
|
DECB IF NOT, DECREMENT BREAKPOINT COUNTER
|
DECB IF NOT, DECREMENT BREAKPOINT COUNTER
|
BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
|
BNE FNDBP AND LOOK FOR NEXT POSSIBLE MATCH
|
RTS ;
|
RTS ;
|
*
|
*
|
*
|
*
|
BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
|
BPADJ LEAY -3,Y MOVE POINTER TO BEGIN OF BP ENTRY
|
RTS
|
RTS
|
*
|
*
|
IFD TRAOPT
|
IFD TRAOPT
|
*
|
*
|
** TRACE from address AAAA BB bytes
|
** TRACE from address AAAA BB bytes
|
*
|
*
|
TRACE LBSR ALTPC1 SET UP NEW PC
|
TRACE LBSR ALTPC1 SET UP NEW PC
|
BVS TREXIT ADDRESS ERROR, EXIT
|
BVS TREXIT ADDRESS ERROR, EXIT
|
LBSR OUT1S
|
LBSR OUT1S
|
LBSR IN1ADR Fetch Byte Count
|
LBSR IN1ADR Fetch Byte Count
|
BVS TREXIT Byte Count error, EXIT
|
BVS TREXIT Byte Count error, EXIT
|
STX TRACNT
|
STX TRACNT
|
*
|
*
|
LDX NMI Save NMI Vector
|
LDX NMI Save NMI Vector
|
STX NMISAV
|
STX NMISAV
|
LDX #NMIE Set up NMI for Tracing
|
LDX #NMIE Set up NMI for Tracing
|
STX NMI
|
STX NMI
|
LBSR TRAINZ Initialise Hardware
|
LBSR TRAINZ Initialise Hardware
|
BRA TRACEG Start Trace
|
BRA TRACEG Start Trace
|
TREXIT RTS
|
TREXIT RTS
|
*
|
*
|
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
|
* CRA0 = 0 CA1 IRQ DISAB, CRA0 = 1 CA1 IRQ ENAB
|
* CRA1 = 1 CA1 Rising edge IRQ
|
* CRA1 = 1 CA1 Rising edge IRQ
|
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
|
* CRA2 = 0 TADATA = Data Direction, CRA2 = 1 TADATA = I/O Register
|
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
|
* CRA3 = 0 CA2 = 0 output, CRA3 = 1 CA2 = 1
|
* CRA4 = 1 ] CA2 = Set/Reset output
|
* CRA4 = 1 ] CA2 = Set/Reset output
|
* CRA5 = 1 ]
|
* CRA5 = 1 ]
|
* CRA6 = X CA2 Input Interrupt Flag
|
* CRA6 = X CA2 Input Interrupt Flag
|
* CRA7 = X CA1 Interrupt Flag
|
* CRA7 = X CA1 Interrupt Flag
|
*
|
*
|
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
|
* CRB0 = 0 CB1 IRQ DISAB, CRB0 = 1 CA1 IRQ ENAB
|
* CRB1 = 1 CB1 Rising edge IRQ
|
* CRB1 = 1 CB1 Rising edge IRQ
|
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
|
* CRB2 = 0 TBDATA = Data Direction, CRB2 = 1 TBDATA = I/O Register
|
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
|
* CRB3 = 0 CB2 = 0 output, CRB3 = 1 CB2 = 1
|
* CRB4 = 1 ] CB2 = Set/Reset output
|
* CRB4 = 1 ] CB2 = Set/Reset output
|
* CRB5 = 1 ]
|
* CRB5 = 1 ]
|
* CRB6 = X CB2 Input Interrupt Flag
|
* CRB6 = X CB2 Input Interrupt Flag
|
* CRB7 = X CB1 Interrupt Flag
|
* CRB7 = X CB1 Interrupt Flag
|
*
|
*
|
*
|
*
|
** TRACE NMI ENTRY POINT
|
** TRACE NMI ENTRY POINT
|
*
|
*
|
NMIE TFR S,U
|
NMIE TFR S,U
|
LDA #$36 Disable Interrupt, CA2 Low
|
LDA #$36 Disable Interrupt, CA2 Low
|
STA TACTRL
|
STA TACTRL
|
LDA TADATA Clear Interrupt flag by reading data port
|
LDA TADATA Clear Interrupt flag by reading data port
|
*
|
*
|
LBSR REGSTR DUMP REGISTERS
|
LBSR REGSTR DUMP REGISTERS
|
*
|
*
|
LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
|
LDX 10,U TEST IF NEXT INSTRUCTION IS A SWI
|
LDA ,X
|
LDA ,X
|
CMPA #$3F
|
CMPA #$3F
|
BEQ TRACEX EXIT ON SWI
|
BEQ TRACEX EXIT ON SWI
|
*
|
*
|
LDX TRACNT CHECK IF TRACE COUNT EXPIRED
|
LDX TRACNT CHECK IF TRACE COUNT EXPIRED
|
BEQ TRACEX YES, GO BACK TO THE MONITOR
|
BEQ TRACEX YES, GO BACK TO THE MONITOR
|
LEAX -1,X DECREMENT TRACE COUNT
|
LEAX -1,X DECREMENT TRACE COUNT
|
STX TRACNT
|
STX TRACNT
|
*
|
*
|
** TRACE GO (RESUME SINGLE STEP)
|
** TRACE GO (RESUME SINGLE STEP)
|
*
|
*
|
TRACEG TFR U,S SET UP PROGRAM STACK POINTER
|
TRACEG TFR U,S SET UP PROGRAM STACK POINTER
|
LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
|
LDA #TRADEL SET UP TIMER DELAY (NUMB CYCLES FOR RTI+1)
|
STA TADATA
|
STA TADATA
|
LDA #$36 LOAD STROBE LOW
|
LDA #$36 LOAD STROBE LOW
|
STA TACTRL
|
STA TACTRL
|
LDA TADATA CLEAR INTERRUPT
|
LDA TADATA CLEAR INTERRUPT
|
LDA #$36 RELEASE RESET
|
LDA #$36 RELEASE RESET
|
STA TBCTRL
|
STA TBCTRL
|
LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
|
LDA #$3F RELEASE LOAD, ENABLE CA1 NMI, CA1 RISING EDGE
|
STA TACTRL
|
STA TACTRL
|
RTI GO EXECUTE INSTRUCTION
|
RTI GO EXECUTE INSTRUCTION
|
*
|
*
|
TRACEX LDX NMISAV Restore NMI vector
|
TRACEX LDX NMISAV Restore NMI vector
|
STX NMI
|
STX NMI
|
LBRA NEXTCMD Jump back to the command loop.
|
LBRA NEXTCMD Jump back to the command loop.
|
*
|
*
|
** TRACE HARDWARE INITIALISATION
|
** TRACE HARDWARE INITIALISATION
|
*
|
*
|
TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
|
TRAINZ LDA #$32 SELECT DDRA, CA2 LOW, NMI DISABLED
|
STA TACTRL
|
STA TACTRL
|
LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
|
LDA #$3A SELECT DDRB, CB2 HIGH, FIRQ DISABLED
|
STA TBCTRL
|
STA TBCTRL
|
LDA #$FF PORTA = OUTPUT
|
LDA #$FF PORTA = OUTPUT
|
STA TADATA
|
STA TADATA
|
LDA #$00 PORTB = INPUT
|
LDA #$00 PORTB = INPUT
|
STA TBDATA
|
STA TBDATA
|
LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
|
LDA #$36 SELECT OUTPUT REGISTER A, CA2 LOW
|
STA TACTRL
|
STA TACTRL
|
LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
|
LDA #$3E SELECT OUTPUT REGISTER B, CB2 HIGH
|
STA TBCTRL
|
STA TBCTRL
|
RTS
|
RTS
|
*
|
*
|
ENDIF TRAOPT
|
ENDIF TRAOPT
|
IFD MFDCOPT
|
IFD MFDCOPT
|
*
|
*
|
** "U" MINI DISK BOOT
|
** "U" MINI DISK BOOT
|
*
|
*
|
MINBOOT TST CMDFDC
|
MINBOOT TST CMDFDC
|
CLR DRVFDC
|
CLR DRVFDC
|
LDX #$0000
|
LDX #$0000
|
LOOP LEAX $01,X
|
LOOP LEAX $01,X
|
CMPX #$0000
|
CMPX #$0000
|
BNE LOOP
|
BNE LOOP
|
LDA #$0F
|
LDA #$0F
|
STA CMDFDC
|
STA CMDFDC
|
BSR DELAY
|
BSR DELAY
|
LOOP1 LDB CMDFDC
|
LOOP1 LDB CMDFDC
|
BITB #$01
|
BITB #$01
|
BNE LOOP1
|
BNE LOOP1
|
LDA #$01
|
LDA #$01
|
STA SECFDC
|
STA SECFDC
|
BSR DELAY
|
BSR DELAY
|
LDA #$8C
|
LDA #$8C
|
STA CMDFDC
|
STA CMDFDC
|
BSR DELAY
|
BSR DELAY
|
LDX #$C000
|
LDX #$C000
|
BRA LOOP3
|
BRA LOOP3
|
LOOP2 BITB #$02
|
LOOP2 BITB #$02
|
BEQ LOOP3
|
BEQ LOOP3
|
LDA DATFDC
|
LDA DATFDC
|
STA ,X+
|
STA ,X+
|
LOOP3 LDB CMDFDC
|
LOOP3 LDB CMDFDC
|
BITB #$01
|
BITB #$01
|
BNE LOOP2
|
BNE LOOP2
|
BITB #$2C
|
BITB #$2C
|
BEQ LOOP4
|
BEQ LOOP4
|
RTS
|
RTS
|
*
|
*
|
LOOP4 LDX #$C000
|
LOOP4 LDX #$C000
|
STX $0A,U
|
STX $0A,U
|
TFR U,S
|
TFR U,S
|
RTI
|
RTI
|
*
|
*
|
DELAY LDB #$04
|
DELAY LDB #$04
|
LOOP5 DECB
|
LOOP5 DECB
|
BNE LOOP5
|
BNE LOOP5
|
RTS
|
RTS
|
ENDIF MFDCOPT
|
ENDIF MFDCOPT
|
*
|
*
|
IFD DMAFOPT
|
IFD DMAFOPT
|
*
|
*
|
*** "D" DISK BOOT FOR DMAF2 ***
|
*** "D" DISK BOOT FOR DMAF2 ***
|
*
|
*
|
DBOOT LDA #$DE
|
DBOOT LDA #$DE
|
STA DRVREG
|
STA DRVREG
|
LDA #$FF
|
LDA #$FF
|
STA PRIREG $FAF8
|
STA PRIREG $FAF8
|
STA CCREG
|
STA CCREG
|
STA AAAREG
|
STA AAAREG
|
STA BBBREG
|
STA BBBREG
|
TST CCREG
|
TST CCREG
|
LDA #$D8
|
LDA #$D8
|
STA COMREG
|
STA COMREG
|
LBSR DLY
|
LBSR DLY
|
DBOOT0 LDA COMREG
|
DBOOT0 LDA COMREG
|
BMI DBOOT0
|
BMI DBOOT0
|
LDA #$09
|
LDA #$09
|
STA COMREG
|
STA COMREG
|
LBSR DLY
|
LBSR DLY
|
*
|
*
|
DISKWT LDA COMREG FETCH DRIVE STATUS
|
DISKWT LDA COMREG FETCH DRIVE STATUS
|
BITA #1 TEST BUSY BIT
|
BITA #1 TEST BUSY BIT
|
BNE DISKWT LOOP UNTIL NOT BUSY
|
BNE DISKWT LOOP UNTIL NOT BUSY
|
*
|
*
|
BITA #$10
|
BITA #$10
|
BNE DBOOT
|
BNE DBOOT
|
*
|
*
|
LDX #$C000 LOGICAL ADDR. = $C000
|
LDX #$C000 LOGICAL ADDR. = $C000
|
BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
|
BSR LRA GET 20 BIT PHYSICAL ADDR. OF LOG. ADDR.
|
ORA #$10
|
ORA #$10
|
STA CCCREG
|
STA CCCREG
|
TFR X,D
|
TFR X,D
|
COMA ;
|
COMA ;
|
COMB ;
|
COMB ;
|
STD ADDREG
|
STD ADDREG
|
LDX #$FEFF LOAD DMA BYTE COUNT = $100
|
LDX #$FEFF LOAD DMA BYTE COUNT = $100
|
STX CNTREG STORE IN COUNT REGISTER
|
STX CNTREG STORE IN COUNT REGISTER
|
LDA #$FF LOAD THE CHANNEL REGISTER
|
LDA #$FF LOAD THE CHANNEL REGISTER
|
STA CCREG
|
STA CCREG
|
LDA #$FE SET CHANNEL 0
|
LDA #$FE SET CHANNEL 0
|
STA PRIREG
|
STA PRIREG
|
LDA #1 SET SECTOR TO "1"
|
LDA #1 SET SECTOR TO "1"
|
STA SECREG ISSUE COMMAND
|
STA SECREG ISSUE COMMAND
|
LDA #$8C SET SINGLE SECTOR READ
|
LDA #$8C SET SINGLE SECTOR READ
|
STA COMREG ISSUE COMMAND
|
STA COMREG ISSUE COMMAND
|
BSR DLY
|
BSR DLY
|
*
|
*
|
* THE FOLLOWING CODE TESTS THE STATUS OF THE
|
* THE FOLLOWING CODE TESTS THE STATUS OF THE
|
* CHANNEL CONTROL REGISTER. IF "D7" IS NOT
|
* CHANNEL CONTROL REGISTER. IF "D7" IS NOT
|
* ZERO THEN IT WILL LOOP WAITING FOR "D7"
|
* ZERO THEN IT WILL LOOP WAITING FOR "D7"
|
* TO GO TO ZERO. IF AFTER 65,536 TRIES IT
|
* TO GO TO ZERO. IF AFTER 65,536 TRIES IT
|
* IS STILL A ONE THE BOOT OPERATION WILL
|
* IS STILL A ONE THE BOOT OPERATION WILL
|
* BE STARTED OVER FROM THE BEGINING.
|
* BE STARTED OVER FROM THE BEGINING.
|
*
|
*
|
CLRB ;
|
CLRB ;
|
DBOOT1 PSHS B $FB55
|
DBOOT1 PSHS B $FB55
|
CLRB ;
|
CLRB ;
|
DBOOT2 TST CCREG
|
DBOOT2 TST CCREG
|
BPL DBOOT3
|
BPL DBOOT3
|
DECB ;
|
DECB ;
|
BNE DBOOT2
|
BNE DBOOT2
|
PULS B
|
PULS B
|
DECB
|
DECB
|
BNE DBOOT1
|
BNE DBOOT1
|
BRA DBOOT
|
BRA DBOOT
|
DBOOT3 PULS B
|
DBOOT3 PULS B
|
LDA COMREG
|
LDA COMREG
|
BITA #$1C
|
BITA #$1C
|
BEQ DBOOT4
|
BEQ DBOOT4
|
RTS ;
|
RTS ;
|
*
|
*
|
*
|
*
|
DBOOT4 LDB #$DE
|
DBOOT4 LDB #$DE
|
STB DRVREG
|
STB DRVREG
|
LDX #$C000
|
LDX #$C000
|
STX 10,U
|
STX 10,U
|
TFR U,S $FB7B
|
TFR U,S $FB7B
|
RTI ;
|
RTI ;
|
ENDIF DMAFOPT
|
ENDIF DMAFOPT
|
*
|
*
|
IFD CF8OPT
|
IFD CF8OPT
|
*
|
*
|
* COMPACT FLASH BOOT
|
* COMPACT FLASH BOOT
|
*
|
*
|
CFBOOT BSR WAITRDY
|
CFBOOT BSR WAITRDY
|
LDA #HEADLBA
|
LDA #HEADLBA
|
STA CF_HEAD
|
STA CF_HEAD
|
BSR WAITRDY
|
BSR WAITRDY
|
LDA #FEAT8BIT
|
LDA #FEAT8BIT
|
STA CF_FEATURE
|
STA CF_FEATURE
|
LDA #CMDFEATURE
|
LDA #CMDFEATURE
|
STA CF_COMAND
|
STA CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
CFREAD LDA #$01
|
CFREAD LDA #$01
|
STA CF_SECCNT
|
STA CF_SECCNT
|
CLRA
|
CLRA
|
STA CF_SECNUM
|
STA CF_SECNUM
|
STA CF_CYLLO
|
STA CF_CYLLO
|
STA CF_CYLHI
|
STA CF_CYLHI
|
*
|
*
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
LDA #CMDREAD ; IDE READ MULTIPLE
|
STA CF_COMAND
|
STA CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
LDX #$C000
|
LDX #$C000
|
*
|
*
|
* READ LOOP
|
* READ LOOP
|
*
|
*
|
RDLOOP BSR WAITDRQ
|
RDLOOP BSR WAITDRQ
|
LDA CF_DATA
|
LDA CF_DATA
|
STA ,X+
|
STA ,X+
|
CMPX #$C200
|
CMPX #$C200
|
BNE RDLOOP
|
BNE RDLOOP
|
*
|
*
|
LDX #$C000
|
LDX #$C000
|
STX $0A,U
|
STX $0A,U
|
TFR U,S
|
TFR U,S
|
RTI
|
RTI
|
*
|
*
|
* WAIT UNTIL READY
|
* WAIT UNTIL READY
|
*
|
*
|
WAITRDY LDA CF_STATUS
|
WAITRDY LDA CF_STATUS
|
BITA #BUSY
|
BITA #BUSY
|
BNE WAITRDY
|
BNE WAITRDY
|
LDA CF_STATUS
|
LDA CF_STATUS
|
BITA #DRDY
|
BITA #DRDY
|
BEQ WAITRDY
|
BEQ WAITRDY
|
RTS
|
RTS
|
*
|
*
|
* WAIT FOR DATA REQUEST
|
* WAIT FOR DATA REQUEST
|
*
|
*
|
WAITDRQ LDA CF_STATUS
|
WAITDRQ LDA CF_STATUS
|
BITA #DRQ
|
BITA #DRQ
|
BEQ WAITDRQ
|
BEQ WAITDRQ
|
RTS
|
RTS
|
ENDIF CF8OPT
|
ENDIF CF8OPT
|
*
|
*
|
IFD IDEOPT
|
IFD IDEOPT
|
*
|
*
|
* XESS 16 BIT IDE BOOT
|
* XESS 16 BIT IDE BOOT
|
*
|
*
|
IDEBOOT LDD #AUXRESET
|
IDEBOOT LDD #AUXRESET
|
STD CF_AUX
|
STD CF_AUX
|
LDD #AUXRSTREL
|
LDD #AUXRSTREL
|
STD CF_AUX
|
STD CF_AUX
|
LDD #HEADLBA
|
LDD #HEADLBA
|
STD CF_HEAD
|
STD CF_HEAD
|
BSR WAITRDY
|
BSR WAITRDY
|
*
|
*
|
* READ SECTORS FROM CF
|
* READ SECTORS FROM CF
|
*
|
*
|
LDD #$01
|
LDD #$01
|
STD CF_SECCNT
|
STD CF_SECCNT
|
CLRB
|
CLRB
|
STD CF_SECNUM
|
STD CF_SECNUM
|
STD CF_CYLLO
|
STD CF_CYLLO
|
STD CF_CYLHI
|
STD CF_CYLHI
|
*
|
*
|
LDB #CMDREAD ; IDE READ MULTIPLE
|
LDB #CMDREAD ; IDE READ MULTIPLE
|
STD CF_COMAND
|
STD CF_COMAND
|
BSR WAITRDY
|
BSR WAITRDY
|
LDX #$C000
|
LDX #$C000
|
*
|
*
|
* READ LOOP
|
* READ LOOP
|
*
|
*
|
RDLOOP BSR WAITDRQ
|
RDLOOP BSR WAITDRQ
|
LDD CF_DATA
|
LDD CF_DATA
|
STB ,X+
|
STB ,X+
|
CMPX #$C100
|
CMPX #$C100
|
BNE RDLOOP
|
BNE RDLOOP
|
*
|
*
|
LDX #$C000
|
LDX #$C000
|
STX $0A,U
|
STX $0A,U
|
TFR U,S
|
TFR U,S
|
RTI
|
RTI
|
*
|
*
|
* WAIT UNTIL READY
|
* WAIT UNTIL READY
|
*
|
*
|
WAITRDY LDD CF_STATUS
|
WAITRDY LDD CF_STATUS
|
BITB #BUSY
|
BITB #BUSY
|
BNE WAITRDY
|
BNE WAITRDY
|
LDD CF_STATUS
|
LDD CF_STATUS
|
BITB #DRDY
|
BITB #DRDY
|
BEQ WAITRDY
|
BEQ WAITRDY
|
RTS
|
RTS
|
*
|
*
|
* WAIT FOR DATA REQUEST
|
* WAIT FOR DATA REQUEST
|
*
|
*
|
WAITDRQ LDD CF_STATUS
|
WAITDRQ LDD CF_STATUS
|
BITB #DRQ
|
BITB #DRQ
|
BEQ WAITDRQ
|
BEQ WAITDRQ
|
RTS
|
RTS
|
ENDIF IDEOPT
|
ENDIF IDEOPT
|
*
|
*
|
IFD RTCOPT
|
IFD RTCOPT
|
*
|
*
|
* CLOCK INTER FACE UTILITY
|
* CLOCK INTER FACE UTILITY
|
*
|
*
|
* TIME
|
* TIME
|
* If no argument is specified, the current time
|
* If no argument is specified, the current time
|
* will be displayed.
|
* will be displayed.
|
*
|
*
|
* READ A REGISTER FROM THE COUNTER.
|
* READ A REGISTER FROM THE COUNTER.
|
* The X Index rgister points to the register
|
* The X Index rgister points to the register
|
* to be read. The Status Register is checked
|
* to be read. The Status Register is checked
|
* before and after the register is read before
|
* before and after the register is read before
|
* returning a value in accumulator A
|
* returning a value in accumulator A
|
*
|
*
|
RDCLK TST CLKSTA
|
RDCLK TST CLKSTA
|
BNE RDCLK
|
BNE RDCLK
|
RDCLK1 LDA 0,X
|
RDCLK1 LDA 0,X
|
TST CLKSTA
|
TST CLKSTA
|
BNE RDCLK1
|
BNE RDCLK1
|
RTS
|
RTS
|
*
|
*
|
* MAIN PROGRAM:
|
* MAIN PROGRAM:
|
*
|
*
|
TIMSET LDX #COUNTR POINT TO TIMER
|
TIMSET LDX #COUNTR POINT TO TIMER
|
LBSR BYTE READ HOURS
|
LBSR BYTE READ HOURS
|
BVS SHOWTM NO ARG, DISP TIME
|
BVS SHOWTM NO ARG, DISP TIME
|
STA HOUR,X
|
STA HOUR,X
|
LBSR OUT1S
|
LBSR OUT1S
|
LBSR BYTE READ MINUITES
|
LBSR BYTE READ MINUITES
|
BVS SHOWTM
|
BVS SHOWTM
|
STA MINUIT,X
|
STA MINUIT,X
|
LBSR OUT1S
|
LBSR OUT1S
|
LBSR BYTE SECONDS.
|
LBSR BYTE SECONDS.
|
BVS SHOWTM
|
BVS SHOWTM
|
STA SECOND,X
|
STA SECOND,X
|
*
|
*
|
* DISPLAY CURRENT TIME
|
* DISPLAY CURRENT TIME
|
*
|
*
|
SHOWTM LBSR PCRLF
|
SHOWTM LBSR PCRLF
|
LDX #COUNTR+HOUR
|
LDX #COUNTR+HOUR
|
LDB #3
|
LDB #3
|
SHOWLP BSR RDCLK
|
SHOWLP BSR RDCLK
|
LBSR OUT2H
|
LBSR OUT2H
|
LDA #':
|
LDA #':
|
LBSR OUTCH
|
LBSR OUTCH
|
LEAX -1,X
|
LEAX -1,X
|
DECB
|
DECB
|
BNE SHOWLP
|
BNE SHOWLP
|
RTS
|
RTS
|
*
|
*
|
* INITIATE CLOCK.
|
* INITIATE CLOCK.
|
* MASK INTERRUPTS.
|
* MASK INTERRUPTS.
|
*
|
*
|
CLKINZ CLR CINTCR MASK ALL INTERRUPTS
|
CLKINZ CLR CINTCR MASK ALL INTERRUPTS
|
TST CINTSR CLEAR ANY INTERRUPTS
|
TST CINTSR CLEAR ANY INTERRUPTS
|
RTS
|
RTS
|
ENDIF RTCOPT
|
ENDIF RTCOPT
|
IFD DATOPT
|
IFD DATOPT
|
*
|
*
|
***** LRA LOAD REAL ADDRESS *****
|
***** LRA LOAD REAL ADDRESS *****
|
*
|
*
|
* THE FOLLOWING CODE LOADS THE 20-BIT
|
* THE FOLLOWING CODE LOADS THE 20-BIT
|
* PHYSICAL ADDRESS OF A MEMORY BYTE
|
* PHYSICAL ADDRESS OF A MEMORY BYTE
|
* INTO THE "A" AND "X" REGISTERS. THIS
|
* INTO THE "A" AND "X" REGISTERS. THIS
|
* ROUTINE IS ENTERED WITH THE LOGICAL
|
* ROUTINE IS ENTERED WITH THE LOGICAL
|
* ADDRESS OF A MEMORY BYTE IN THE "IX"
|
* ADDRESS OF A MEMORY BYTE IN THE "IX"
|
* REGISTER. EXIT IS MADE WITH THE HIGH-
|
* REGISTER. EXIT IS MADE WITH THE HIGH-
|
* ORDER FOUR BITS OF THE 20-BIT PHYSICAL
|
* ORDER FOUR BITS OF THE 20-BIT PHYSICAL
|
* ADDRESS IN THE "A" REGISTER, AND THE
|
* ADDRESS IN THE "A" REGISTER, AND THE
|
* LOW-ORDER 16-BITS OF THE 20-BIT
|
* LOW-ORDER 16-BITS OF THE 20-BIT
|
* PHYSICAL ADDRESS IN THE "IX" REGISTER.
|
* PHYSICAL ADDRESS IN THE "IX" REGISTER.
|
* ALL OTHER REGISTERS ARE PRESERVED.
|
* ALL OTHER REGISTERS ARE PRESERVED.
|
* THIS ROUTINE IS REQUIRED SINCE THE
|
* THIS ROUTINE IS REQUIRED SINCE THE
|
* DMAF1 AND DMAF2 DISK CONTROLLERS MUST
|
* DMAF1 AND DMAF2 DISK CONTROLLERS MUST
|
* PRESENT PHYSICAL ADDRESSES ON THE
|
* PRESENT PHYSICAL ADDRESSES ON THE
|
* SYSTEM BUS.
|
* SYSTEM BUS.
|
*
|
*
|
LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
|
LRA PSHS A,B,X,Y PUSH REGISTERS ON STACK
|
LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
|
LDA 2,S GET MSB LOGICAL ADDR FRM X REG ON STACK
|
LSRA ;
|
LSRA ;
|
LSRA ADJ FOR INDEXED INTO
|
LSRA ADJ FOR INDEXED INTO
|
LSRA CORRESPONDING LOCATION
|
LSRA CORRESPONDING LOCATION
|
LSRA IN LRA TABLE
|
LSRA IN LRA TABLE
|
LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
|
LDY #LRARAM LOAD LRA TABLE BASE ADDRESS
|
LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
|
LDB A,Y GET PHYSICAL ADDR. DATA FROM LRA TABLE
|
LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
|
LSRB ADJ. REAL ADDR. TO REFLECT EXTENDED
|
LSRB PHYSICAL ADDRESS.
|
LSRB PHYSICAL ADDRESS.
|
LSRB EXTENDED MS 4-BITS ARE RETURNED
|
LSRB EXTENDED MS 4-BITS ARE RETURNED
|
LSRB IN THE "A" ACCUMULATOR
|
LSRB IN THE "A" ACCUMULATOR
|
STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
|
STB ,S MS 4 BITS IN A ACCUM. STORED ON STACK
|
LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
|
LDB A,Y LOAD REAL ADDRESS DATA FROM LRA TABLE
|
COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
|
COMB COMP TO ADJ FOR PHYSICAL ADDR. IN X REG
|
ASLB ADJ DATA FOR RELOCATION IN X REG
|
ASLB ADJ DATA FOR RELOCATION IN X REG
|
ASLB ;
|
ASLB ;
|
ASLB $FB97
|
ASLB $FB97
|
ASLB ;
|
ASLB ;
|
LDA 2,S GET MS BYTE OF LOGICAL ADDR.
|
LDA 2,S GET MS BYTE OF LOGICAL ADDR.
|
ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
|
ANDA #$0F MASK MS NIBBLE OF LOGICAL ADDRESS
|
STA 2,S SAVE IT IN X REG ON STACK
|
STA 2,S SAVE IT IN X REG ON STACK
|
ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
|
ORB 2,S SET MS BYTE IN X REG TO ADJ PHY ADDR.
|
*
|
*
|
* PLUS LS NIBBLE OF LOGICAL ADDRESS
|
* PLUS LS NIBBLE OF LOGICAL ADDRESS
|
STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
|
STB 2,S SAVE AS LS 16 BITS OF PHY ADDR IN X REG
|
* ON STACK
|
* ON STACK
|
PULS A,B,X,Y,PC POP REGS. FROM STACK
|
PULS A,B,X,Y,PC POP REGS. FROM STACK
|
ENDIF DATOPT
|
ENDIF DATOPT
|
*
|
*
|
* DELAY LOOP
|
* DELAY LOOP
|
*
|
*
|
DLY PSHS B SAVE CONTENTS OF "B"
|
DLY PSHS B SAVE CONTENTS OF "B"
|
LDB #$20 GET LOOP DELAY VALUE
|
LDB #$20 GET LOOP DELAY VALUE
|
SUB1 DECB SUBTRACT ONE FROM VALUE
|
SUB1 DECB SUBTRACT ONE FROM VALUE
|
BNE SUB1 LOOP UNTIL ZERO
|
BNE SUB1 LOOP UNTIL ZERO
|
PULS B,PC RESTORE CONTENTS OF "B"
|
PULS B,PC RESTORE CONTENTS OF "B"
|
* RTS ;
|
* RTS ;
|
*
|
*
|
***** "L" LOAD MIKBUG TAPE *****
|
***** "L" LOAD MIKBUG TAPE *****
|
*
|
*
|
LOAD JSR ACINIZ
|
LOAD JSR ACINIZ
|
LDA #$11 LOAD 'DC1' CASS. READ ON CODE
|
LDA #$11 LOAD 'DC1' CASS. READ ON CODE
|
LBSR OUTCH OUTPUT IT TO TERMINAL PORT
|
LBSR OUTCH OUTPUT IT TO TERMINAL PORT
|
CLR ECHO TURN OFF ECHO FLAG
|
CLR ECHO TURN OFF ECHO FLAG
|
LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
|
LOAD1 LBSR ECHON INPUT 8 BIT BYTE WITH NO ECHO
|
LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
|
LOAD2 CMPA #'S IS IT AN "S", START CHARACTER ?
|
BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
|
BNE LOAD1 IF NOT, DISCARD AND GET NEXT CHAR.
|
LBSR ECHON
|
LBSR ECHON
|
CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
|
CMPA #'9 IS IT A "9" , END OF FILE CHAR ?
|
BEQ LOAD21 IF SO, EXIT LOAD
|
BEQ LOAD21 IF SO, EXIT LOAD
|
CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
|
CMPA #'1 IS IT A "1" , FILE LOAD CHAR ?
|
BNE LOAD2 IF NOT, LOOK FOR START CHAR.
|
BNE LOAD2 IF NOT, LOOK FOR START CHAR.
|
LBSR BYTE INPUT BYTE COUNT
|
LBSR BYTE INPUT BYTE COUNT
|
PSHS A PUSH COUNT ON STACK
|
PSHS A PUSH COUNT ON STACK
|
BVS LODERR (V) C-CODE SET, ILLEGAL HEX
|
BVS LODERR (V) C-CODE SET, ILLEGAL HEX
|
LBSR IN1ADR INPUT LOAD ADDRESS
|
LBSR IN1ADR INPUT LOAD ADDRESS
|
BVS LODERR (V) C-CODE SET, ADDR NOT HEX
|
BVS LODERR (V) C-CODE SET, ADDR NOT HEX
|
PSHS X PUSH ADDR ON STACK
|
PSHS X PUSH ADDR ON STACK
|
LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
|
LDB ,S+ LOAD MSB OF ADDR AS CHECKSUM BYTE
|
ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
|
ADDB ,S+ ADD LSB OF ADDR TO CHECKSUM
|
ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
|
ADDB ,S ADD BYTE COUNT BYTE TO CHECKSUM
|
DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
|
DEC ,S $FC37 DECREMENT BYTE COUNT 2 TO BYPASS
|
DEC ,S ADDRESS BYTES.
|
DEC ,S ADDRESS BYTES.
|
LOAD10 PSHS B PUSH CHECKSUM ON STACK
|
LOAD10 PSHS B PUSH CHECKSUM ON STACK
|
LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
|
LBSR BYTE INPUT DATA BYTE (2 HEX CHAR)
|
PULS B POP CHECKSUM FROM STACK
|
PULS B POP CHECKSUM FROM STACK
|
BVS LODERR (V) SET, DATA BYTE NOT HEX
|
BVS LODERR (V) SET, DATA BYTE NOT HEX
|
PSHS A PUSH DATA BYTE ON STACK
|
PSHS A PUSH DATA BYTE ON STACK
|
ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
|
ADDB ,S+ ADD DATA TO CHECKSUM, AUTO INC STACK
|
DEC ,S DECREMENT BYTE COUNT 1
|
DEC ,S DECREMENT BYTE COUNT 1
|
BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
|
BEQ LOAD16 IF BYTE COUNT ZERO, TEST CHECKSUM
|
STA ,X+ SAVE DATA BYTE IN MEMORY
|
STA ,X+ SAVE DATA BYTE IN MEMORY
|
BRA LOAD10 GET NEXT DATA BYTE
|
BRA LOAD10 GET NEXT DATA BYTE
|
LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
|
LODERR CLRB ;ERROR CONDITION, ZERO CHECKSUM ;
|
LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
|
LOAD16 PULS A ADJUST STACK (REMOVE BYTE COUNT)
|
CMPB #$FF CHECKSUM OK?
|
CMPB #$FF CHECKSUM OK?
|
BEQ LOAD1 IF SO, LOAD NEXT LINE
|
BEQ LOAD1 IF SO, LOAD NEXT LINE
|
LDA #'? LOAD (?) ERROR INDICATOR
|
LDA #'? LOAD (?) ERROR INDICATOR
|
LBSR OUTCH OUTPUT IT TO TERMINAL
|
LBSR OUTCH OUTPUT IT TO TERMINAL
|
LOAD21 COM ECHO TURN ECHO ON
|
LOAD21 COM ECHO TURN ECHO ON
|
LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
|
LDA #$13 $FC5F LOAD 'DC3' CASS. READ OFF CODE
|
LBRA OUTCH OUTPUT IT
|
LBRA OUTCH OUTPUT IT
|
*
|
*
|
***** "P" PUNCH MIKBUG TAPE *****
|
***** "P" PUNCH MIKBUG TAPE *****
|
*
|
*
|
PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
|
PUNCH CLR ,-S CLEAR RESERVED BYTE ON STACK
|
LBSR IN2ADR GET BEGIN AND END ADDRESS
|
LBSR IN2ADR GET BEGIN AND END ADDRESS
|
PSHS X,Y SAVE ADDRESSES ON STACK
|
PSHS X,Y SAVE ADDRESSES ON STACK
|
BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
|
BVS PUNEXT (V) C-CODE SET, EXIT PUNCH
|
CMPX 2,S COMPARE BEGIN TO END ADDR
|
CMPX 2,S COMPARE BEGIN TO END ADDR
|
BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
|
BCS PUNEXT IF BEGIN GREATER THAN END, EXIT PUNCH
|
LEAX 1,X INCREMENT END ADDRESS
|
LEAX 1,X INCREMENT END ADDRESS
|
STX ,S STORE END ADDR ON STACK
|
STX ,S STORE END ADDR ON STACK
|
JSR ACINIZ
|
JSR ACINIZ
|
LDA #$12 LOAD 'DC2' PUNCH ON CODE
|
LDA #$12 LOAD 'DC2' PUNCH ON CODE
|
LBSR OUTCH OUTPUT IT TO TERMINAL
|
LBSR OUTCH OUTPUT IT TO TERMINAL
|
PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
|
PUNCH2 LDD ,S LOAD END ADDR IN D-ACC
|
SUBD 2,S SUBTRACT BEGIN FROM END
|
SUBD 2,S SUBTRACT BEGIN FROM END
|
BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
|
BEQ PUNCH3 SAME, PUNCH 32 BYTES DEFAULT
|
CMPD #$20 LESS THAN 32 BYTES?
|
CMPD #$20 LESS THAN 32 BYTES?
|
BLS PUNCH4 PUNCH THAT MANY BYTES
|
BLS PUNCH4 PUNCH THAT MANY BYTES
|
PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
|
PUNCH3 LDB #$20 LOAD BYTE COUNT OF 32.
|
PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
|
PUNCH4 STB 4,S STORE ON STACK AS BYTE COUNT
|
LDX #MSG20 POINT TO MSG "S1"
|
LDX #MSG20 POINT TO MSG "S1"
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
ADDB #3 ADD 3 BYTES TO BYTE COUNT
|
ADDB #3 ADD 3 BYTES TO BYTE COUNT
|
TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
|
TFR B,A GET BYTE COUNT IN A-ACC TO PUNCH
|
LBSR OUT2H OUTPUT BYTE COUNT
|
LBSR OUT2H OUTPUT BYTE COUNT
|
LDX 2,S LOAD BEGIN ADDRESS
|
LDX 2,S LOAD BEGIN ADDRESS
|
LBSR OUT4H PUNCH ADDRESS
|
LBSR OUT4H PUNCH ADDRESS
|
ADDB 2,S ADD ADDR MSB TO CHECKSUM
|
ADDB 2,S ADD ADDR MSB TO CHECKSUM
|
ADDB 3,S ADD ADDR LSB TO CHECKSUM
|
ADDB 3,S ADD ADDR LSB TO CHECKSUM
|
PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
|
PUNCHL ADDB ,X ADD DATA BYTE TO CHECKSUM
|
LDA ,X+ LOAD DATA BYTE TO PUNCH
|
LDA ,X+ LOAD DATA BYTE TO PUNCH
|
LBSR OUT2H OUTPUT DATA BYTE
|
LBSR OUT2H OUTPUT DATA BYTE
|
DEC 4,S DECREMENT BYTE COUNT
|
DEC 4,S DECREMENT BYTE COUNT
|
BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
|
BNE PUNCHL NOT DONE, PUNCH NEXT BYTE
|
COMB 1's COMPLIMENT CHECKSUM BYTE
|
COMB 1's COMPLIMENT CHECKSUM BYTE
|
TFR B,A GET IT IN A-ACC TO PUNCH
|
TFR B,A GET IT IN A-ACC TO PUNCH
|
LBSR OUT2H OUTPUT CHECKSUM BYTE
|
LBSR OUT2H OUTPUT CHECKSUM BYTE
|
STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
|
STX 2,S SAVE X-REG IN STACK AS NEW PUNCH ADDR
|
CMPX ,S COMPARE IT TO END ADDR
|
CMPX ,S COMPARE IT TO END ADDR
|
BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
|
BNE PUNCH2 $FCB5 PUNCH NOT DONE, CONT.
|
PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
|
PUNEXT LDA #$14 LOAD 'DC4' PUNCH OFF CODE
|
LBSR OUTCH OUTPUT IT
|
LBSR OUTCH OUTPUT IT
|
LEAS 5,S READJUST STACK POINTER
|
LEAS 5,S READJUST STACK POINTER
|
RTS ;
|
RTS ;
|
*
|
*
|
* PRINT STRING PRECEEDED BY A CR & LF.
|
* PRINT STRING PRECEEDED BY A CR & LF.
|
*
|
*
|
PSTRNG BSR PCRLF PRINT CR/LF
|
PSTRNG BSR PCRLF PRINT CR/LF
|
BRA PDATA PRINT STRING POINTED TO BY IX
|
BRA PDATA PRINT STRING POINTED TO BY IX
|
*
|
*
|
* PCRLF
|
* PCRLF
|
*
|
*
|
PCRLF PSHS X SAVE IX
|
PCRLF PSHS X SAVE IX
|
LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
|
LDX #MSG2+1 POINT TO MSG CR/LF + 3 NULS
|
LBSR PDATA PRINT MSG
|
LBSR PDATA PRINT MSG
|
PULS X,PC RESTORE IX & RETURN
|
PULS X,PC RESTORE IX & RETURN
|
*
|
*
|
* LONG BRANCHES TO COMMON ROUTINES
|
* LONG BRANCHES TO COMMON ROUTINES
|
*
|
*
|
JOUT1S LBRA OUT1S
|
JOUT1S LBRA OUT1S
|
JBYTE LBRA BYTE
|
JBYTE LBRA BYTE
|
JIN1ADR LBRA IN1ADR
|
JIN1ADR LBRA IN1ADR
|
*
|
*
|
* ALTER "PC" PROGRAM COUNTER
|
* ALTER "PC" PROGRAM COUNTER
|
*
|
*
|
ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
|
ALTRPC LBSR PRTPC $FCF5 PRINT MSG " PC = "
|
ALTPC1 BSR JOUT1S OUTPUT SPACE
|
ALTPC1 BSR JOUT1S OUTPUT SPACE
|
BSR JIN1ADR GET NEW CONTENTS FOR "PC"
|
BSR JIN1ADR GET NEW CONTENTS FOR "PC"
|
BVS ALTPCD EXIT IF INVALID HEX
|
BVS ALTPCD EXIT IF INVALID HEX
|
STX 10,U POKE IN NEW CONTENTS
|
STX 10,U POKE IN NEW CONTENTS
|
ALTPCD RTS ;
|
ALTPCD RTS ;
|
*
|
*
|
* ALTER "U" USER STACK POINTER
|
* ALTER "U" USER STACK POINTER
|
*
|
*
|
ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
|
ALTRU BSR PRTUS $FCCA PRINT MSG " US = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JIN1ADR
|
BSR JIN1ADR
|
BVS ALTUD
|
BVS ALTUD
|
STX 8,U
|
STX 8,U
|
ALTUD RTS ;
|
ALTUD RTS ;
|
*
|
*
|
* ALTER "Y" INDEX REGISTER
|
* ALTER "Y" INDEX REGISTER
|
*
|
*
|
ALTRY BSR PRTIY PRINT MSG " IY = "
|
ALTRY BSR PRTIY PRINT MSG " IY = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JIN1ADR
|
BSR JIN1ADR
|
BVS ALTYD
|
BVS ALTYD
|
STX 6,U $F8F0
|
STX 6,U $F8F0
|
ALTYD RTS ;
|
ALTYD RTS ;
|
*
|
*
|
* ALTER "X" INDEX REGISTER
|
* ALTER "X" INDEX REGISTER
|
*
|
*
|
ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
|
ALTRX BSR PRTIX $FCE0 PRINT MSG " IX = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JIN1ADR
|
BSR JIN1ADR
|
BVS ALTXD
|
BVS ALTXD
|
STX 4,U
|
STX 4,U
|
ALTXD RTS ;
|
ALTXD RTS ;
|
*
|
*
|
* ALTER "DP" DIRECT PAGE REGISTER
|
* ALTER "DP" DIRECT PAGE REGISTER
|
*
|
*
|
ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
|
ALTRDP BSR PRTDP $FCD5 PRINT MSG " DP = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BVS ALTDPD
|
BVS ALTDPD
|
STA 3,U
|
STA 3,U
|
ALTDPD RTS ;
|
ALTDPD RTS ;
|
*
|
*
|
* ALTER "B" ACCUMULATOR
|
* ALTER "B" ACCUMULATOR
|
*
|
*
|
ALTRB BSR PRTB $FD09 PRINT MSG " B = "
|
ALTRB BSR PRTB $FD09 PRINT MSG " B = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BVS ALTBD
|
BVS ALTBD
|
STA 2,U
|
STA 2,U
|
ALTBD RTS $F91C
|
ALTBD RTS $F91C
|
*
|
*
|
* ALTER "A" ACCUMULATOR
|
* ALTER "A" ACCUMULATOR
|
*
|
*
|
ALTRA BSR PRTA $FCFF RINT MSG " A = "
|
ALTRA BSR PRTA $FCFF RINT MSG " A = "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BVS ALTAD
|
BVS ALTAD
|
STA 1,U
|
STA 1,U
|
ALTAD RTS ;
|
ALTAD RTS ;
|
*
|
*
|
* ALTER "CC" REGISTER
|
* ALTER "CC" REGISTER
|
*
|
*
|
ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
|
ALTRCC BSR PRTCC $FD13 PRINT MSG " CC: "
|
BSR JOUT1S OUTPUT SPACE
|
BSR JOUT1S OUTPUT SPACE
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BSR JBYTE INPUT BYTE (2 HEX CHAR)
|
BVS ALTCCD
|
BVS ALTCCD
|
ORA #$80 SETS "E" FLAG IN PRINT LIST
|
ORA #$80 SETS "E" FLAG IN PRINT LIST
|
STA ,U
|
STA ,U
|
ALTCCD RTS ;
|
ALTCCD RTS ;
|
*
|
*
|
* PDATA
|
* PDATA
|
*
|
*
|
PRINT LBSR OUTCH
|
PRINT LBSR OUTCH
|
PDATA LDA ,X+ GET 1st CHAR. TO PRINT
|
PDATA LDA ,X+ GET 1st CHAR. TO PRINT
|
CMPA #4 IS IT EOT?
|
CMPA #4 IS IT EOT?
|
BNE PRINT IF NOT EOT PRINT IT
|
BNE PRINT IF NOT EOT PRINT IT
|
RTS ;
|
RTS ;
|
*
|
*
|
* PRINT REGISTERS
|
* PRINT REGISTERS
|
*
|
*
|
PRTSP LDX #MSG10 POINT TO MSG "SP="
|
PRTSP LDX #MSG10 POINT TO MSG "SP="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
TFR U,X
|
TFR U,X
|
JOUT4H LBRA OUT4H
|
JOUT4H LBRA OUT4H
|
*
|
*
|
PRTUS LDX #MSG12 POINT TO MSG "US="
|
PRTUS LDX #MSG12 POINT TO MSG "US="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDX 8,U
|
LDX 8,U
|
BRA JOUT4H
|
BRA JOUT4H
|
*
|
*
|
PRTDP LDX #MSG15 POINT TO MSG "DP="
|
PRTDP LDX #MSG15 POINT TO MSG "DP="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDA 3,U
|
LDA 3,U
|
JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
|
JOUT2H LBRA OUT2H OUTPUT HEX BYTE AS ASCII
|
*
|
*
|
PRTIX LDX #MSG14 POINT TO MSG "IX="
|
PRTIX LDX #MSG14 POINT TO MSG "IX="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDX 4,U $FCE6
|
LDX 4,U $FCE6
|
BRA JOUT4H
|
BRA JOUT4H
|
*
|
*
|
PRTIY LDX #MSG13 POINT TO MSG "IY="
|
PRTIY LDX #MSG13 POINT TO MSG "IY="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDX 6,U
|
LDX 6,U
|
BRA JOUT4H
|
BRA JOUT4H
|
*
|
*
|
PRTPC LDX #MSG11 POINT TO MSG "PC="
|
PRTPC LDX #MSG11 POINT TO MSG "PC="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDX 10,U
|
LDX 10,U
|
BRA JOUT4H
|
BRA JOUT4H
|
*
|
*
|
PRTA LDX #MSG16 POINT TO MSG "A="
|
PRTA LDX #MSG16 POINT TO MSG "A="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDA 1,U
|
LDA 1,U
|
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
|
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
|
*
|
*
|
PRTB LDX #MSG17 POINT TO MSG "B="
|
PRTB LDX #MSG17 POINT TO MSG "B="
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDA 2,U
|
LDA 2,U
|
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
|
BRA JOUT2H OUTPUT HEX BYTE AS ASCII
|
*
|
*
|
PRTCC LDX #MSG18 POINT TO MSG "CC:"
|
PRTCC LDX #MSG18 POINT TO MSG "CC:"
|
BSR PDATA PRINT MSG
|
BSR PDATA PRINT MSG
|
LDA ,U
|
LDA ,U
|
LDX #MSG19 POINT TO MSG "EFHINZVC"
|
LDX #MSG19 POINT TO MSG "EFHINZVC"
|
LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
|
LBRA BIASCI OUTPUT IN BINARY/ASCII FORMAT
|
*
|
*
|
* "R" DISPLAY REGISTERS
|
* "R" DISPLAY REGISTERS
|
*
|
*
|
REGSTR LDX #MSG5 POINT TO MSG " - "
|
REGSTR LDX #MSG5 POINT TO MSG " - "
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
BSR PRTSP $FCBF
|
BSR PRTSP $FCBF
|
BSR PRTUS $FCCA
|
BSR PRTUS $FCCA
|
BSR PRTDP $FCD5
|
BSR PRTDP $FCD5
|
BSR PRTIX $FCE0
|
BSR PRTIX $FCE0
|
BSR PRTIY $FCEB
|
BSR PRTIY $FCEB
|
LDX #MSG5 POINT TO MSG " - "
|
LDX #MSG5 POINT TO MSG " - "
|
LBSR PSTRNG PRINT MSG
|
LBSR PSTRNG PRINT MSG
|
BSR PRTPC $FCF5
|
BSR PRTPC $FCF5
|
BSR PRTA $FCFF
|
BSR PRTA $FCFF
|
BSR PRTB $FD09
|
BSR PRTB $FD09
|
BRA PRTCC $FD13
|
BRA PRTCC $FD13
|
*
|
*
|
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
|
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
|
* OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
|
* OPERATOR TO INPUT TWO VALID HEX ADDRESSES.
|
* THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
|
* THE FIRST ADDRESS INPUT IS RETURNED IN "IY".
|
* THE SECOND IS RETURNED IN "IX". THE "V" BIT
|
* THE SECOND IS RETURNED IN "IX". THE "V" BIT
|
* IN THE C-CODE REG. IS SET IF AN INVALID HEX
|
* IN THE C-CODE REG. IS SET IF AN INVALID HEX
|
* ADDRESS IS INPUT.
|
* ADDRESS IS INPUT.
|
*
|
*
|
IN2ADR BSR IN1ADR GET FIRST ADDRESS
|
IN2ADR BSR IN1ADR GET FIRST ADDRESS
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
TFR X,Y SAVE FIRST ADDR. IN "IY"
|
TFR X,Y SAVE FIRST ADDR. IN "IY"
|
LDA #'-
|
LDA #'-
|
LBSR OUTCH PRINT " - "
|
LBSR OUTCH PRINT " - "
|
*
|
*
|
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
|
* THE FOLLOWING ROUTINE LOOPS WAITING FOR THE
|
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
|
* OPERATOR TO INPUT ONE VALID HEX ADDRESS. THE
|
* ADDRESS IS RETURNED IN THE "X" REGISTER.
|
* ADDRESS IS RETURNED IN THE "X" REGISTER.
|
*
|
*
|
IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
|
IN1ADR BSR BYTE INPUT BYTE (2 HEX CHAR)
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
TFR D,X
|
TFR D,X
|
BSR BYTE INPUT BYTE (2 HEX CHAR)
|
BSR BYTE INPUT BYTE (2 HEX CHAR)
|
BVS NOTHEX
|
BVS NOTHEX
|
PSHS X
|
PSHS X
|
STA 1,S
|
STA 1,S
|
PULS X,PC
|
PULS X,PC
|
*
|
*
|
***** INPUT BYTE (2 HEX CHAR.) *****
|
***** INPUT BYTE (2 HEX CHAR.) *****
|
*
|
*
|
BYTE BSR INHEX GET HEX LEFT
|
BYTE BSR INHEX GET HEX LEFT
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
ASLA ;
|
ASLA ;
|
ASLA ;
|
ASLA ;
|
ASLA ; SHIFT INTO LEFT NIBBLE
|
ASLA ; SHIFT INTO LEFT NIBBLE
|
ASLA ;
|
ASLA ;
|
TFR A,B PUT HEXL IN "B"
|
TFR A,B PUT HEXL IN "B"
|
BSR INHEX GET HEX RIGHT
|
BSR INHEX GET HEX RIGHT
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
BVS NOTHEX EXIT IF NOT VALID HEX
|
PSHS B PUSH HEXL ON STACK
|
PSHS B PUSH HEXL ON STACK
|
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
|
ADDA ,S+ ADD HEXL TO HEXR AND ADJ. STK
|
RTS RETURN WITH HEX L&R IN "A"
|
RTS RETURN WITH HEX L&R IN "A"
|
*
|
*
|
*
|
*
|
INHEX BSR ECHON INPUT ASCII CHAR.
|
INHEX BSR ECHON INPUT ASCII CHAR.
|
CMPA #'0 IS IT > OR = "0" ?
|
CMPA #'0 IS IT > OR = "0" ?
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
CMPA #'9 IS IT < OR = "9" ?
|
CMPA #'9 IS IT < OR = "9" ?
|
BHI INHEXA IF > MAYBE IT'S ALPHA
|
BHI INHEXA IF > MAYBE IT'S ALPHA
|
SUBA #$30 ASCII ADJ. NUMERIC
|
SUBA #$30 ASCII ADJ. NUMERIC
|
RTS ;
|
RTS ;
|
*
|
*
|
*
|
*
|
INHEXA CMPA #'A IS IT > OR = "A"
|
INHEXA CMPA #'A IS IT > OR = "A"
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
CMPA #'F IS IT < OR = "F" ?
|
CMPA #'F IS IT < OR = "F" ?
|
BHI INHEXL IF > IT AIN'T HEX
|
BHI INHEXL IF > IT AIN'T HEX
|
SUBA #$37 ASCII ADJ. ALPHA
|
SUBA #$37 ASCII ADJ. ALPHA
|
RTS ;
|
RTS ;
|
*
|
*
|
INHEXL CMPA #'a IS IT > OR = "a"
|
INHEXL CMPA #'a IS IT > OR = "a"
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
BCS NOTHEX IF LESS IT AIN'T HEX
|
CMPA #'f IS IT < "f"
|
CMPA #'f IS IT < "f"
|
BHI NOTHEX IF > IT AIN'T HEX
|
BHI NOTHEX IF > IT AIN'T HEX
|
SUBA #$57 ADJUST TO LOWER CASE
|
SUBA #$57 ADJUST TO LOWER CASE
|
RTS ;
|
RTS ;
|
*
|
*
|
*
|
*
|
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
|
NOTHEX ORCC #2 SET (V) FLAG IN C-CODES REGISTER
|
RTS ;
|
RTS ;
|
*
|
*
|
*
|
*
|
OUT4H PSHS X PUSH X-REG. ON THE STACK
|
OUT4H PSHS X PUSH X-REG. ON THE STACK
|
PULS A POP MS BYTE OF X-REG INTO A-ACC.
|
PULS A POP MS BYTE OF X-REG INTO A-ACC.
|
BSR OUTHL OUTPUT HEX LEFT
|
BSR OUTHL OUTPUT HEX LEFT
|
PULS A POP LS BYTE OF X-REG INTO A-ACC.
|
PULS A POP LS BYTE OF X-REG INTO A-ACC.
|
OUTHL EQU *
|
OUTHL EQU *
|
OUT2H PSHS A SAVE IT BACK ON STACK
|
OUT2H PSHS A SAVE IT BACK ON STACK
|
LSRA CONVERT UPPER HEX NIBBLE TO ASCII
|
LSRA CONVERT UPPER HEX NIBBLE TO ASCII
|
LSRA ;
|
LSRA ;
|
LSRA ;
|
LSRA ;
|
LSRA ;
|
LSRA ;
|
BSR XASCII PRINT HEX NIBBLE AS ASCII
|
BSR XASCII PRINT HEX NIBBLE AS ASCII
|
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
|
OUTHR PULS A CONVERT LOWER HEX NIBBLE TO ASCII
|
ANDA #$0F STRIP LEFT NIBBLE
|
ANDA #$0F STRIP LEFT NIBBLE
|
XASCII ADDA #$30 ASCII ADJ
|
XASCII ADDA #$30 ASCII ADJ
|
CMPA #$39 IS IT < OR = "9" ?
|
CMPA #$39 IS IT < OR = "9" ?
|
BLE OUTC IF LESS, OUTPUT IT
|
BLE OUTC IF LESS, OUTPUT IT
|
ADDA #7 IF > MAKE ASCII LETTER
|
ADDA #7 IF > MAKE ASCII LETTER
|
OUTC BRA OUTCH OUTPUT CHAR
|
OUTC BRA OUTCH OUTPUT CHAR
|
*
|
*
|
* BINARY / ASCII --- THIS ROUTINE
|
* BINARY / ASCII --- THIS ROUTINE
|
* OUTPUTS A BYTE IN ENHANCED
|
* OUTPUTS A BYTE IN ENHANCED
|
* BINARY FORMAT. THE ENHANCEMENT
|
* BINARY FORMAT. THE ENHANCEMENT
|
* IS DONE BY SUBSTITUTING ASCII
|
* IS DONE BY SUBSTITUTING ASCII
|
* LETTERS FOR THE ONES IN THE BYTE.
|
* LETTERS FOR THE ONES IN THE BYTE.
|
* THE ASCII ENHANCEMENT LETTERS
|
* THE ASCII ENHANCEMENT LETTERS
|
* ARE OBTAINED FROM THE STRING
|
* ARE OBTAINED FROM THE STRING
|
* POINTED TO BY THE INDEX REG. "X".
|
* POINTED TO BY THE INDEX REG. "X".
|
*
|
*
|
BIASCI PSHS A SAVE "A" ON STACK
|
BIASCI PSHS A SAVE "A" ON STACK
|
LDB #8 PRESET LOOP# TO BITS PER BYTE
|
LDB #8 PRESET LOOP# TO BITS PER BYTE
|
OUTBA LDA ,X+ GET LETTER FROM STRING
|
OUTBA LDA ,X+ GET LETTER FROM STRING
|
ASL ,S TEST BYTE FOR "1" IN B7
|
ASL ,S TEST BYTE FOR "1" IN B7
|
BCS PRTBA IF ONE PRINT LETTER
|
BCS PRTBA IF ONE PRINT LETTER
|
LDA #'- IF ZERO PRINT "-"
|
LDA #'- IF ZERO PRINT "-"
|
PRTBA BSR OUTCH PRINT IT
|
PRTBA BSR OUTCH PRINT IT
|
BSR OUT1S PRINT SPACE
|
BSR OUT1S PRINT SPACE
|
DECB SUB 1 FROM #BITS YET TO PRINT
|
DECB SUB 1 FROM #BITS YET TO PRINT
|
BNE OUTBA
|
BNE OUTBA
|
PULS A,PC
|
PULS A,PC
|
*
|
*
|
IFD EXTOPT
|
IFD EXTOPT
|
*
|
*
|
* EXTENDED USER COMMANDS
|
* EXTENDED USER COMMANDS
|
*
|
*
|
USRCMD JMP [MONEXT+EXTCMD]
|
USRCMD JMP [MONEXT+EXTCMD]
|
ENDIF EXTOPT
|
ENDIF EXTOPT
|
*
|
*
|
*
|
*
|
ECHON TST ECHO IS ECHO REQUIRED ?
|
ECHON TST ECHO IS ECHO REQUIRED ?
|
BEQ INCH ECHO NOT REQ. IF CLEAR
|
BEQ INCH ECHO NOT REQ. IF CLEAR
|
*
|
*
|
* INCHE
|
* INCHE
|
*
|
*
|
* ---GETS CHARACTER FROM TERMINAL AND
|
* ---GETS CHARACTER FROM TERMINAL AND
|
* ECHOS SAME. THE CHARACTER IS RETURNED
|
* ECHOS SAME. THE CHARACTER IS RETURNED
|
* IN THE "A" ACCUMULATOR WITH THE PARITY
|
* IN THE "A" ACCUMULATOR WITH THE PARITY
|
* BIT MASKED OFF. ALL OTHER REGISTERS
|
* BIT MASKED OFF. ALL OTHER REGISTERS
|
* ARE PRESERVED.
|
* ARE PRESERVED.
|
*
|
*
|
INCHE BSR INCH GET CHAR FROM TERMINAL
|
INCHE BSR INCH GET CHAR FROM TERMINAL
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
ANDA #$7F STRIP PARITY FROM CHAR.
|
BRA OUTCH ECHO CHAR TO TERMINAL
|
BRA OUTCH ECHO CHAR TO TERMINAL
|
*
|
*
|
* INCH
|
* INCH
|
*
|
*
|
* GET CHARACTER FROM TERMINAL. RETURN
|
* GET CHARACTER FROM TERMINAL. RETURN
|
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE
|
* CHARACTER IN "A" ACCUMULATOR AND PRESERVE
|
* ALL OTHER REGISTERS. THE INPUT CHARACTER
|
* ALL OTHER REGISTERS. THE INPUT CHARACTER
|
* IS 8 BITS AND IS NOT ECHOED.
|
* IS 8 BITS AND IS NOT ECHOED.
|
*
|
*
|
*
|
*
|
INCH PSHS X SAVE IX
|
INCH PSHS X SAVE IX
|
GETSTA LDX CPORT POINT TO TERMINAL PORT
|
GETSTA LDX CPORT POINT TO TERMINAL PORT
|
LDA ,X FETCH PORT STATUS
|
LDA ,X FETCH PORT STATUS
|
BITA #1 TEST READY BIT, RDRF ?
|
BITA #1 TEST READY BIT, RDRF ?
|
IFD PS2OPT
|
IFD PS2OPT
|
BNE GETST1
|
BNE GETST1
|
LDX #PS2KBD
|
LDX #PS2KBD
|
LDA ,X
|
LDA ,X
|
BITA #1
|
BITA #1
|
ENDIF PS2OPT
|
ENDIF PS2OPT
|
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
|
BEQ GETSTA IF NOT RDY, THEN TRY AGAIN
|
GETST1 LDA 1,X FETCH CHAR
|
GETST1 LDA 1,X FETCH CHAR
|
PULS X,PC RESTORE IX
|
PULS X,PC RESTORE IX
|
*
|
*
|
* INCHEK
|
* INCHEK
|
*
|
*
|
* CHECK FOR A CHARACTER AVAILABLE FROM
|
* CHECK FOR A CHARACTER AVAILABLE FROM
|
* THE TERMINAL. THE SERIAL PORT IS CHECKED
|
* THE TERMINAL. THE SERIAL PORT IS CHECKED
|
* FOR READ READY. ALL REGISTERS ARE
|
* FOR READ READY. ALL REGISTERS ARE
|
* PRESERVED, AND THE "Z" BIT WILL BE
|
* PRESERVED, AND THE "Z" BIT WILL BE
|
* CLEAR IF A CHARACTER CAN BE READ.
|
* CLEAR IF A CHARACTER CAN BE READ.
|
*
|
*
|
*
|
*
|
INCHEK PSHS A SAVE A ACCUM.
|
INCHEK PSHS A SAVE A ACCUM.
|
LDA [CPORT] FETCH PORT STATUS
|
LDA [CPORT] FETCH PORT STATUS
|
BITA #1 TEST READY BIT, RDRF ?
|
BITA #1 TEST READY BIT, RDRF ?
|
IFD PS2OPT
|
IFD PS2OPT
|
BNE INCHEK1
|
BNE INCHEK1
|
LDA PS2KBD
|
LDA PS2KBD
|
BITA #1 TEST READY BIT< RDRF ?
|
BITA #1 TEST READY BIT< RDRF ?
|
ENDIF PS2OPT
|
ENDIF PS2OPT
|
INCHEK1 PULS A,PC RESTORE A ACCUM.
|
INCHEK1 PULS A,PC RESTORE A ACCUM.
|
*
|
*
|
OUT2S BSR OUT1S OUTPUT 2 SPACES
|
OUT2S BSR OUT1S OUTPUT 2 SPACES
|
OUT1S LDA #$20 OUTPUT 1 SPACE
|
OUT1S LDA #$20 OUTPUT 1 SPACE
|
*
|
*
|
*
|
*
|
* OUTCH
|
* OUTCH
|
*
|
*
|
* OUTPUT CHARACTER TO TERMINAL.
|
* OUTPUT CHARACTER TO TERMINAL.
|
* THE CHAR. TO BE OUTPUT IS
|
* THE CHAR. TO BE OUTPUT IS
|
* PASSED IN THE A REGISTER.
|
* PASSED IN THE A REGISTER.
|
* ALL REGISTERS ARE PRESERVED.
|
* ALL REGISTERS ARE PRESERVED.
|
*
|
*
|
OUTCH IFD VDUOPT
|
OUTCH IFD VDUOPT
|
BSR VOUTCH
|
BSR VOUTCH
|
ENDIF VDUOPT
|
ENDIF VDUOPT
|
IFD DG640OPT
|
IFD DG640OPT
|
BSR VOUTCH
|
BSR VOUTCH
|
ENDIF DG640OPT
|
ENDIF DG640OPT
|
AOUTCH PSHS A,X SAVE A ACCUM AND IX
|
AOUTCH PSHS A,X SAVE A ACCUM AND IX
|
LDX CPORT GET ADDR. OF TERMINAL
|
LDX CPORT GET ADDR. OF TERMINAL
|
FETSTA LDA ,X FETCH PORT STATUS
|
FETSTA LDA ,X FETCH PORT STATUS
|
BITA #2 TEST TDRE, OK TO XMIT ?
|
BITA #2 TEST TDRE, OK TO XMIT ?
|
BEQ FETSTA IF NOT LOOP UNTIL RDY
|
BEQ FETSTA IF NOT LOOP UNTIL RDY
|
PULS A GET CHAR. FOR XMIT
|
PULS A GET CHAR. FOR XMIT
|
STA 1,X XMIT CHAR.
|
STA 1,X XMIT CHAR.
|
PULS X,PC RESTORE IX
|
PULS X,PC RESTORE IX
|
*
|
*
|
* IO INITIALIZATION
|
* IO INITIALIZATION
|
*
|
*
|
IOINIZ EQU *
|
IOINIZ EQU *
|
IFD VDUOPT
|
IFD VDUOPT
|
BSR VINIZ
|
BSR VINIZ
|
ENDIF VDUOPT
|
ENDIF VDUOPT
|
IFD DG640OPT
|
IFD DG640OPT
|
BSR VINIZ
|
BSR VINIZ
|
ENDIF DG640OPT
|
ENDIF DG640OPT
|
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
|
ACINIZ LDX CPORT POINT TO CONTROL PORT ADDRESS
|
LDA #3 RESET ACIA PORT CODE
|
LDA #3 RESET ACIA PORT CODE
|
STA ,X STORE IN CONTROL REGISTER
|
STA ,X STORE IN CONTROL REGISTER
|
LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
|
LDA #$11 SET 8 DATA, 2 STOP AN 0 PARITY
|
STA ,X STORE IN CONTROL REGISTER
|
STA ,X STORE IN CONTROL REGISTER
|
TST 1,X ANYTHING IN DATA REGISTER?
|
TST 1,X ANYTHING IN DATA REGISTER?
|
LDA #$FF TURN ON ECHO FLAG
|
LDA #$FF TURN ON ECHO FLAG
|
STA ECHO
|
STA ECHO
|
RTS
|
RTS
|
*
|
*
|
IFD VDUOPT
|
IFD VDUOPT
|
*
|
*
|
***************************************************
|
***************************************************
|
* VDU8 ADM3A REGISTER-MAPPED EMULATOR *
|
* VDU8 ADM3A REGISTER-MAPPED EMULATOR *
|
* *
|
* *
|
* 80 x 25 Characters
|
* 80 x 25 Characters
|
*
|
*
|
***************************************************
|
***************************************************
|
*
|
*
|
***************************************************
|
***************************************************
|
* INITIALIZE EMULATOR *
|
* INITIALIZE EMULATOR *
|
***************************************************
|
***************************************************
|
*
|
*
|
VINIZ LDX #VDU
|
VINIZ LDX #VDU
|
LDD #0
|
LDD #0
|
STD COLADX AND ROWADX
|
STD COLADX AND ROWADX
|
STA VDUCOL,X
|
STA VDUCOL,X
|
STB VDUROW,X
|
STB VDUROW,X
|
STB VDUOFF,X
|
STB VDUOFF,X
|
STD NEWROW AND ESCFLG
|
STD NEWROW AND ESCFLG
|
LDB #$02
|
LDB #$02
|
STB VDUATT,X
|
STB VDUATT,X
|
CLR ESCFLG
|
CLR ESCFLG
|
LDA #$1B SEND ESCAPE
|
LDA #$1B SEND ESCAPE
|
BSR VOUTCH
|
BSR VOUTCH
|
LDA #'Y CLEAR TO END OF SCREEN
|
LDA #'Y CLEAR TO END OF SCREEN
|
*
|
*
|
** VIDEO OUTPUT ROUTINE
|
** VIDEO OUTPUT ROUTINE
|
*
|
*
|
VOUTCH PSHS A,B,X SAVE REGISTERS
|
VOUTCH PSHS A,B,X SAVE REGISTERS
|
LDX #VDU POINT TO VDU REGISTERS
|
LDX #VDU POINT TO VDU REGISTERS
|
*
|
*
|
** CHECK FOR ESCAPE SEQUENCE
|
** CHECK FOR ESCAPE SEQUENCE
|
*
|
*
|
TST ESCFLG ESCAPE ACTIVE?
|
TST ESCFLG ESCAPE ACTIVE?
|
BEQ SOROU1 BRANCH IF NOT
|
BEQ SOROU1 BRANCH IF NOT
|
BSR ESCAPE ELSE DO ESCAPE
|
BSR ESCAPE ELSE DO ESCAPE
|
BRA RETURN AND RETURN
|
BRA RETURN AND RETURN
|
*
|
*
|
** CHECK FOR CONTROL CHARACTERS
|
** CHECK FOR CONTROL CHARACTERS
|
*
|
*
|
SOROU1 CMPA #$20 CONTROL CODES?
|
SOROU1 CMPA #$20 CONTROL CODES?
|
BHS SOROU2
|
BHS SOROU2
|
BSR CONTRL BRANCH IF SO
|
BSR CONTRL BRANCH IF SO
|
BRA RETURN
|
BRA RETURN
|
*
|
*
|
** OUTPUT TEXT CHARACTER
|
** OUTPUT TEXT CHARACTER
|
*
|
*
|
SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
|
SOROU2 STAA VDUCHR,X DISPLAY CHARACTER
|
LBSR NEWCOL UPDATE COLUMN
|
LBSR NEWCOL UPDATE COLUMN
|
*
|
*
|
** DISPLAY CURSOR AND RETURN
|
** DISPLAY CURSOR AND RETURN
|
*
|
*
|
RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
|
RETURN PULS A,B,X,PC RESTORE REGISTERS AND RETURN
|
*
|
*
|
***************************************************
|
***************************************************
|
* CONTROL CODE HANDLERS *
|
* CONTROL CODE HANDLERS *
|
***************************************************
|
***************************************************
|
*
|
*
|
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
|
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
|
LBEQ BACKSP
|
LBEQ BACKSP
|
CMPA #$1B ESCAPE SEQUENCE?
|
CMPA #$1B ESCAPE SEQUENCE?
|
LBEQ SETESC
|
LBEQ SETESC
|
CMPA #$1A CTRL Z - Clear Screen
|
CMPA #$1A CTRL Z - Clear Screen
|
LBEQ CLRSCR
|
LBEQ CLRSCR
|
CMPA #$16 CTRL ^ - Home
|
CMPA #$16 CTRL ^ - Home
|
LBEQ HOME
|
LBEQ HOME
|
CMPA #$D CTRL M - RETURN?
|
CMPA #$D CTRL M - RETURN?
|
LBEQ CRETN
|
LBEQ CRETN
|
CMPA #$0C CTRL L - CHAR RIGHT
|
CMPA #$0C CTRL L - CHAR RIGHT
|
LBEQ CHRIGHT
|
LBEQ CHRIGHT
|
CMPA #$0B CTRL K - MOVE UP ONE LINE
|
CMPA #$0B CTRL K - MOVE UP ONE LINE
|
LBEQ LINEUP
|
LBEQ LINEUP
|
CMPA #$0A CTRL J - LINE FEED
|
CMPA #$0A CTRL J - LINE FEED
|
BNE RETESC NONE OF THESE, RETURN
|
BNE RETESC NONE OF THESE, RETURN
|
*
|
*
|
***************************************** LINE FEED
|
***************************************** LINE FEED
|
*
|
*
|
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
|
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
|
INCB BUMP ROW
|
INCB BUMP ROW
|
CMPB #NUMLIN SCROLL TIME?
|
CMPB #NUMLIN SCROLL TIME?
|
LBNE NEWCUR POSITION CURSOR IF NOT
|
LBNE NEWCUR POSITION CURSOR IF NOT
|
LBRA SCROLL ELSE SCROLL IT
|
LBRA SCROLL ELSE SCROLL IT
|
*
|
*
|
***************************************** LINE FEED
|
***************************************** LINE FEED
|
*
|
*
|
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
|
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
|
TSTB AT TOP OF SCREEN ?
|
TSTB AT TOP OF SCREEN ?
|
LBEQ RETESC Yes, Ignore
|
LBEQ RETESC Yes, Ignore
|
DECB No, Decrement ROW
|
DECB No, Decrement ROW
|
LBRA NEWCUR POSITION CURSOR
|
LBRA NEWCUR POSITION CURSOR
|
*
|
*
|
*********************************** BACK SPACE
|
*********************************** BACK SPACE
|
*
|
*
|
BACKSP LDA COLADX
|
BACKSP LDA COLADX
|
BEQ RETESC RETURN
|
BEQ RETESC RETURN
|
DECA
|
DECA
|
LBRA POSCOL POSITION CURSOR
|
LBRA POSCOL POSITION CURSOR
|
*
|
*
|
*********************************** CURSOR RIGHT
|
*********************************** CURSOR RIGHT
|
*
|
*
|
CHRIGHT LDA COLADX
|
CHRIGHT LDA COLADX
|
INCA
|
INCA
|
CMPA #LINLEN
|
CMPA #LINLEN
|
LBEQ RETESC
|
LBEQ RETESC
|
LBRA POSCOL
|
LBRA POSCOL
|
*
|
*
|
*********************************** CURSOR RIGHT
|
*********************************** CURSOR RIGHT
|
*
|
*
|
HOME LDD #0 HOME - POSITION TOP OF SCREEN
|
HOME LDD #0 HOME - POSITION TOP OF SCREEN
|
LBRA NEWCUR
|
LBRA NEWCUR
|
*
|
*
|
***************************************************
|
***************************************************
|
* ESCAPE HANDLERS *
|
* ESCAPE HANDLERS *
|
***************************************************
|
***************************************************
|
*
|
*
|
ESCAPE LDAB ESCFLG GET FLAG
|
ESCAPE LDAB ESCFLG GET FLAG
|
CMPB #'= SETTING CURSOR?
|
CMPB #'= SETTING CURSOR?
|
BEQ ESCCUR BRANCH IF SO
|
BEQ ESCCUR BRANCH IF SO
|
CMPA #'Y CLEAR TO END OF SCREEN?
|
CMPA #'Y CLEAR TO END OF SCREEN?
|
LBEQ ESCCLS
|
LBEQ ESCCLS
|
CMPA #'T CLEAR TO END OF LINE?
|
CMPA #'T CLEAR TO END OF LINE?
|
BEQ ESCCLL
|
BEQ ESCCLL
|
CMPA #'= STARTING CURSOR SET?
|
CMPA #'= STARTING CURSOR SET?
|
BNE CLRESC BRANCH IF NOT
|
BNE CLRESC BRANCH IF NOT
|
*
|
*
|
***************************** START ESCAPE SEQUENCE
|
***************************** START ESCAPE SEQUENCE
|
*
|
*
|
SETESC STAA ESCFLG ELSE START CURSORING
|
SETESC STAA ESCFLG ELSE START CURSORING
|
RTS AND RETURN
|
RTS AND RETURN
|
*
|
*
|
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
|
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
|
RETESC RTS SO RETURN
|
RETESC RTS SO RETURN
|
*
|
*
|
********************************* SET SCREEN CURSOR
|
********************************* SET SCREEN CURSOR
|
*
|
*
|
ESCCUR TST NEWROW ROW SET?
|
ESCCUR TST NEWROW ROW SET?
|
BNE ESCCU1 BRANCH IF SO
|
BNE ESCCU1 BRANCH IF SO
|
STAA NEWROW ELSE SET NEW ROW
|
STAA NEWROW ELSE SET NEW ROW
|
RTS AND RETURN
|
RTS AND RETURN
|
*
|
*
|
ESCCU1 CLR ESCFLG
|
ESCCU1 CLR ESCFLG
|
SUBA #$20 ADJUST COLUMN ADDRESS
|
SUBA #$20 ADJUST COLUMN ADDRESS
|
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
|
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
|
BHI RETESC NOT OK, DO NOTHING
|
BHI RETESC NOT OK, DO NOTHING
|
*
|
*
|
ESCCU2 LDAB NEWROW
|
ESCCU2 LDAB NEWROW
|
CLR NEWROW
|
CLR NEWROW
|
SUBB #$20 ADJUST TO ROW ADDRESS
|
SUBB #$20 ADJUST TO ROW ADDRESS
|
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
|
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
|
BHI RETESC ELSE RETURN DOING NOTHING
|
BHI RETESC ELSE RETURN DOING NOTHING
|
BRA NEWCUR GO SET NEW CURSOR IF SO
|
BRA NEWCUR GO SET NEW CURSOR IF SO
|
*
|
*
|
****************** CLEAR FROM CURSOR TO END OF LINE
|
****************** CLEAR FROM CURSOR TO END OF LINE
|
CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
|
CLRSCR LDD #0 CLEAR FROM TOP OF SCREEN
|
BSR NEWCUR
|
BSR NEWCUR
|
ESCCLL LDA COLADX
|
ESCCLL LDA COLADX
|
LDB #$20 AND CLEAR CHAR
|
LDB #$20 AND CLEAR CHAR
|
ESCCL1 STB VDUCHR,X DISPLAY TEXT
|
ESCCL1 STB VDUCHR,X DISPLAY TEXT
|
INCA
|
INCA
|
STA VDUCOL,X
|
STA VDUCOL,X
|
CMPA #LINLEN UNTIL END OF LINE
|
CMPA #LINLEN UNTIL END OF LINE
|
BNE ESCCL1
|
BNE ESCCL1
|
CLR ESCFLG
|
CLR ESCFLG
|
RTS
|
RTS
|
*
|
*
|
*********************************** CARRIAGE RETURN
|
*********************************** CARRIAGE RETURN
|
*
|
*
|
CRETN CLRA SET COLUMN ZERO
|
CRETN CLRA SET COLUMN ZERO
|
POSCOL LDB ROWADX GET CURRENT ROW
|
POSCOL LDB ROWADX GET CURRENT ROW
|
*
|
*
|
*********** GENERATE NEW CURSOR POSITION AND RETURN
|
*********** GENERATE NEW CURSOR POSITION AND RETURN
|
*
|
*
|
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
|
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
|
STA VDUCOL,X SET NEW COLUMN
|
STA VDUCOL,X SET NEW COLUMN
|
STB VDUROW,X SET NEW ROW
|
STB VDUROW,X SET NEW ROW
|
RTS AND RETURN
|
RTS AND RETURN
|
*
|
*
|
********************* UPDATE CURRENT COLUMN AND ROW
|
********************* UPDATE CURRENT COLUMN AND ROW
|
*
|
*
|
NEWCOL LDD COLADX GET ROW AND COLUMN
|
NEWCOL LDD COLADX GET ROW AND COLUMN
|
INCA BUMP COLUMN
|
INCA BUMP COLUMN
|
CMPA #LINLEN ROLL?
|
CMPA #LINLEN ROLL?
|
BNE NEWCUR BRANCH IF NOT
|
BNE NEWCUR BRANCH IF NOT
|
CLRA ELSE RESET TO ZERO
|
CLRA ELSE RESET TO ZERO
|
INCB AND BUMP ROW
|
INCB AND BUMP ROW
|
CMPB #NUMLIN
|
CMPB #NUMLIN
|
BNE NEWCUR
|
BNE NEWCUR
|
DECB BOTTOM ROW
|
DECB BOTTOM ROW
|
BSR NEWCUR
|
BSR NEWCUR
|
*
|
*
|
********************************* SCROLL THE SCREEN
|
********************************* SCROLL THE SCREEN
|
*
|
*
|
SCROLL LDB VDUOFF,X
|
SCROLL LDB VDUOFF,X
|
INCB
|
INCB
|
CMPB #NUMLIN
|
CMPB #NUMLIN
|
BLO SCROL1
|
BLO SCROL1
|
CLRB
|
CLRB
|
SCROL1 STB VDUOFF,X
|
SCROL1 STB VDUOFF,X
|
*
|
*
|
**************** CLEAR FROM CURSOR TO END OF SCREEN
|
**************** CLEAR FROM CURSOR TO END OF SCREEN
|
*
|
*
|
ESCCLS LDB COLADX GET CURSOR
|
ESCCLS LDB COLADX GET CURSOR
|
LDA #$20 GET A SPACE
|
LDA #$20 GET A SPACE
|
ESCCLS1 STB COLADX
|
ESCCLS1 STB COLADX
|
STB VDUCOL,X
|
STB VDUCOL,X
|
STA VDUCHR,X
|
STA VDUCHR,X
|
INCB
|
INCB
|
CMPB #LINLEN
|
CMPB #LINLEN
|
BNE ESCCLS1
|
BNE ESCCLS1
|
*
|
*
|
LDB ROWADX
|
LDB ROWADX
|
INCB
|
INCB
|
CMPB #NUMLIN
|
CMPB #NUMLIN
|
BEQ ESCCLS2
|
BEQ ESCCLS2
|
STB ROWADX
|
STB ROWADX
|
STB VDUROW,X
|
STB VDUROW,X
|
CLRB
|
CLRB
|
BRA ESCCLS1
|
BRA ESCCLS1
|
*
|
*
|
ESCCLS2 CLRB
|
ESCCLS2 CLRB
|
STB COLADX
|
STB COLADX
|
STB VDUCOL,X
|
STB VDUCOL,X
|
STB ESCFLG
|
STB ESCFLG
|
RTS
|
RTS
|
ENDIF VDUOPT
|
ENDIF VDUOPT
|
*
|
*
|
IFD DG640OPT
|
IFD DG640OPT
|
***************************************************
|
***************************************************
|
* TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
|
* TELEVIDEO-TYPE MEMORY-MAPPED EMULATOR *
|
* *
|
* *
|
* FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
|
* FOR HARD-WIRED MEMORY-MAPPED DISPLAYS USING THE *
|
* HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
|
* HIGH ORDER BIT OF EACH BYTE FOR REVERSE VIDEO *
|
* CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
|
* CURSORING (SUCH AS THE THOMAS INSTRUMENTATION *
|
* 16x64 BOARD). *
|
* 16x64 BOARD). *
|
***************************************************
|
***************************************************
|
|
|
***************************************************
|
***************************************************
|
* INITIALIZE EMULATOR *
|
* INITIALIZE EMULATOR *
|
***************************************************
|
***************************************************
|
|
|
VINIZ LDX #0
|
VINIZ LDX #0
|
STX COLADX AND ROWADX
|
STX COLADX AND ROWADX
|
STX NEWROW AND ESCFLG
|
STX NEWROW AND ESCFLG
|
LDX #SCREEN POINT TO SCREEN
|
LDX #SCREEN POINT TO SCREEN
|
STX CURSOR SET PROGRAM CURSOR
|
STX CURSOR SET PROGRAM CURSOR
|
LDA #$1B SEND ESCAPE
|
LDA #$1B SEND ESCAPE
|
BSR VOUTCH
|
BSR VOUTCH
|
LDA #'Y CLEAR TO END OF SCREEN
|
LDA #'Y CLEAR TO END OF SCREEN
|
*
|
*
|
** VIDEO OUTPUT ROUTINE
|
** VIDEO OUTPUT ROUTINE
|
*
|
*
|
VOUTCH PSHS A,B,X SAVE REGISTERS
|
VOUTCH PSHS A,B,X SAVE REGISTERS
|
*
|
*
|
** CLEAR CURSOR
|
** CLEAR CURSOR
|
LDX CURSOR
|
LDX CURSOR
|
LDB 0,X
|
LDB 0,X
|
ANDB #$7F
|
ANDB #$7F
|
STB 0,X
|
STB 0,X
|
*
|
*
|
** CHECK FOR ESCAPE SEQUENCE
|
** CHECK FOR ESCAPE SEQUENCE
|
TST ESCFLG ESCAPE ACTIVE?
|
TST ESCFLG ESCAPE ACTIVE?
|
BEQ SOROU1 BRANCH IF NOT
|
BEQ SOROU1 BRANCH IF NOT
|
BSR ESCAPE ELSE DO ESCAPE
|
BSR ESCAPE ELSE DO ESCAPE
|
BRA RETURN AND RETURN
|
BRA RETURN AND RETURN
|
*
|
*
|
** CHECK FOR CONTROL CHARACTERS
|
** CHECK FOR CONTROL CHARACTERS
|
SOROU1 CMPA #$20 CONTROL CODES?
|
SOROU1 CMPA #$20 CONTROL CODES?
|
BHS SOROU2
|
BHS SOROU2
|
BSR CONTRL BRANCH IF SO
|
BSR CONTRL BRANCH IF SO
|
BRA RETURN
|
BRA RETURN
|
*
|
*
|
** OUTPUT TEXT CHARACTER
|
** OUTPUT TEXT CHARACTER
|
SOROU2 LDX CURSOR ELSE GET CURSOR
|
SOROU2 LDX CURSOR ELSE GET CURSOR
|
STAA 0,X DISPLAY CHARACTER
|
STAA 0,X DISPLAY CHARACTER
|
LBSR NEWCOL UPDATE COLUMN
|
LBSR NEWCOL UPDATE COLUMN
|
*
|
*
|
** DISPLAY CURSOR AND RETURN
|
** DISPLAY CURSOR AND RETURN
|
RETURN LDX CURSOR AND DISPLAY IT
|
RETURN LDX CURSOR AND DISPLAY IT
|
LDB ,X
|
LDB ,X
|
ORAB #$80 WITH REVID
|
ORAB #$80 WITH REVID
|
STB ,X
|
STB ,X
|
PULS A,B,X,PC RESTORE REGISTERS AND RETURN
|
PULS A,B,X,PC RESTORE REGISTERS AND RETURN
|
|
|
***************************************************
|
***************************************************
|
* CONTROL CODE HANDLERS *
|
* CONTROL CODE HANDLERS *
|
***************************************************
|
***************************************************
|
|
|
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
|
CONTRL CMPA #$08 CTRL H - BACKSPACE ?
|
LBEQ BACKSP
|
LBEQ BACKSP
|
CMPA #$1B ESCAPE SEQUENCE?
|
CMPA #$1B ESCAPE SEQUENCE?
|
LBEQ SETESC
|
LBEQ SETESC
|
CMPA #$D CTRL M - RETURN?
|
CMPA #$D CTRL M - RETURN?
|
LBEQ CRETN
|
LBEQ CRETN
|
CMPA #$0A CTRL J - LINE FEED
|
CMPA #$0A CTRL J - LINE FEED
|
BNE RETESC NONE OF THESE, RETURN
|
BNE RETESC NONE OF THESE, RETURN
|
|
|
***************************************** LINE FEED
|
***************************************** LINE FEED
|
|
|
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
|
LINEFD LDD COLADX GET CURRENT COLUMN AND ROW
|
INCB BUMP ROW
|
INCB BUMP ROW
|
CMPB #NUMLIN SCROLL TIME?
|
CMPB #NUMLIN SCROLL TIME?
|
LBNE NEWCUR POSITION CURSOR IF NOT
|
LBNE NEWCUR POSITION CURSOR IF NOT
|
LBRA SCROLL ELSE SCROLL IT
|
LBRA SCROLL ELSE SCROLL IT
|
|
|
***************************************** LINE FEED
|
***************************************** LINE FEED
|
|
|
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
|
LINEUP LDD COLADX GET CURRENT COLUMN AND ROW
|
TSTB AT TOP OF SCREEN ?
|
TSTB AT TOP OF SCREEN ?
|
BEQ RETESC Yes, Ignore
|
BEQ RETESC Yes, Ignore
|
DECB No, Decrement ROW
|
DECB No, Decrement ROW
|
LBRA NEWCUR POSITION CURSOR
|
LBRA NEWCUR POSITION CURSOR
|
|
|
|
|
*********************************** BACK SPACE
|
*********************************** BACK SPACE
|
|
|
BACKSP LDA COLADX
|
BACKSP LDA COLADX
|
BEQ RETESC RETURN
|
BEQ RETESC RETURN
|
DECA
|
DECA
|
LBRA POSCOL POSITION CURSOR
|
LBRA POSCOL POSITION CURSOR
|
|
|
*********************************** CURSOR RIGHT
|
*********************************** CURSOR RIGHT
|
|
|
CHRIGHT LDA COLADX
|
CHRIGHT LDA COLADX
|
INCA
|
INCA
|
CMPA #LINLEN
|
CMPA #LINLEN
|
BEQ RETESC
|
BEQ RETESC
|
LBRA POSCOL
|
LBRA POSCOL
|
|
|
***************************************************
|
***************************************************
|
* ESCAPE HANDLERS *
|
* ESCAPE HANDLERS *
|
***************************************************
|
***************************************************
|
|
|
ESCAPE LDAB ESCFLG GET FLAG
|
ESCAPE LDAB ESCFLG GET FLAG
|
CMPB #'= SETTING CURSOR?
|
CMPB #'= SETTING CURSOR?
|
BEQ ESCCUR BRANCH IF SO
|
BEQ ESCCUR BRANCH IF SO
|
CMPA #'Y CLEAR TO END OF SCREEN?
|
CMPA #'Y CLEAR TO END OF SCREEN?
|
LBEQ ESCCLS
|
LBEQ ESCCLS
|
CMPA #'T CLEAR TO END OF LINE?
|
CMPA #'T CLEAR TO END OF LINE?
|
BEQ ESCCLL
|
BEQ ESCCLL
|
CMPA #'E INSERT LINE?
|
CMPA #'E INSERT LINE?
|
BEQ ESCINL
|
BEQ ESCINL
|
CMPA #'R DELETE LINE?
|
CMPA #'R DELETE LINE?
|
BEQ ESCDLL
|
BEQ ESCDLL
|
CMPA #'= STARTING CURSOR SET?
|
CMPA #'= STARTING CURSOR SET?
|
BNE CLRESC BRANCH IF NOT
|
BNE CLRESC BRANCH IF NOT
|
|
|
***************************** START ESCAPE SEQUENCE
|
***************************** START ESCAPE SEQUENCE
|
|
|
SETESC STAA ESCFLG ELSE START CURSORING
|
SETESC STAA ESCFLG ELSE START CURSORING
|
RTS AND RETURN
|
RTS AND RETURN
|
|
|
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
|
CLRESC CLR ESCFLG NO OTHERS SUPPORTED
|
RETESC RTS SO RETURN
|
RETESC RTS SO RETURN
|
|
|
********************************* SET SCREEN CURSOR
|
********************************* SET SCREEN CURSOR
|
|
|
ESCCUR TST NEWROW ROW SET?
|
ESCCUR TST NEWROW ROW SET?
|
BNE ESCCU1 BRANCH IF SO
|
BNE ESCCU1 BRANCH IF SO
|
STAA NEWROW ELSE SET NEW ROW
|
STAA NEWROW ELSE SET NEW ROW
|
RTS AND RETURN
|
RTS AND RETURN
|
|
|
ESCCU1 CLR ESCFLG
|
ESCCU1 CLR ESCFLG
|
SUBA #$20 ADJUST COLUMN ADDRESS
|
SUBA #$20 ADJUST COLUMN ADDRESS
|
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
|
CMPA #LINLEN-1 CHECK FOR ACCEPTABLE COLUM
|
BHI RETESC NOT OK, DO NOTHING
|
BHI RETESC NOT OK, DO NOTHING
|
|
|
ESCCU2 LDAB NEWROW
|
ESCCU2 LDAB NEWROW
|
CLR NEWROW
|
CLR NEWROW
|
SUBB #$20 ADJUST TO ROW ADDRESS
|
SUBB #$20 ADJUST TO ROW ADDRESS
|
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
|
CMPB #NUMLIN-1 CHECK FOR ACCEPTABLE ROW
|
BHI RETESC ELSE RETURN DOING NOTHING
|
BHI RETESC ELSE RETURN DOING NOTHING
|
BRA NEWCUR GO SET NEW CURSOR IF SO
|
BRA NEWCUR GO SET NEW CURSOR IF SO
|
*
|
*
|
*************************** DELETE LINE FROM SCREEN
|
*************************** DELETE LINE FROM SCREEN
|
|
|
ESCDLL BSR CRETN GO COL. ZERO
|
ESCDLL BSR CRETN GO COL. ZERO
|
LDB ROWADX
|
LDB ROWADX
|
CMPB #NUMLIN-1
|
CMPB #NUMLIN-1
|
BEQ SCROL3
|
BEQ SCROL3
|
BRA SCROL1 AND DELETE THIS LINE
|
BRA SCROL1 AND DELETE THIS LINE
|
|
|
*************************** INSERT LINE INTO SCREEN
|
*************************** INSERT LINE INTO SCREEN
|
|
|
ESCINL BSR CRETN GO TO COL. ZERO
|
ESCINL BSR CRETN GO TO COL. ZERO
|
LDAB ROWADX
|
LDAB ROWADX
|
CMPB #NUMLIN-1
|
CMPB #NUMLIN-1
|
BEQ ESCCLL
|
BEQ ESCCLL
|
*
|
*
|
** SCROLL SCREEN DOWN FROM CURSOR
|
** SCROLL SCREEN DOWN FROM CURSOR
|
*
|
*
|
LDX #SCREEN+SCNLEN-LINLEN
|
LDX #SCREEN+SCNLEN-LINLEN
|
ESCIN0 LDAA 0,-X
|
ESCIN0 LDAA 0,-X
|
STAA LINLEN,X
|
STAA LINLEN,X
|
LDA SCNLEN,X
|
LDA SCNLEN,X
|
STA SCNLEN+LINLEN,X
|
STA SCNLEN+LINLEN,X
|
CPX CURSOR
|
CPX CURSOR
|
BNE ESCIN0
|
BNE ESCIN0
|
|
|
****************** CLEAR FROM CURSOR TO END OF LINE
|
****************** CLEAR FROM CURSOR TO END OF LINE
|
|
|
ESCCLL LDA COLADX GET CURRENT COLUMN
|
ESCCLL LDA COLADX GET CURRENT COLUMN
|
LDX CURSOR GET CURSOR
|
LDX CURSOR GET CURSOR
|
LDB #$20 AND CLEAR CHAR
|
LDB #$20 AND CLEAR CHAR
|
ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
|
ESCLL1 STB SCNLEN,X CLEAR ATTRIBUTE
|
STB ,X+ CLEAR TEXT
|
STB ,X+ CLEAR TEXT
|
INCA
|
INCA
|
CMPA #LINLEN UNTIL END OF LINE
|
CMPA #LINLEN UNTIL END OF LINE
|
BNE ESCLL1
|
BNE ESCLL1
|
CLR ESCFLG
|
CLR ESCFLG
|
RTS
|
RTS
|
|
|
*********************************** CARRIAGE RETURN
|
*********************************** CARRIAGE RETURN
|
|
|
CRETN CLRA SET COLUMN ZERO
|
CRETN CLRA SET COLUMN ZERO
|
POSCOL LDB ROWADX GET CURRENT ROW
|
POSCOL LDB ROWADX GET CURRENT ROW
|
|
|
*********** GENERATE NEW CURSOR POSITION AND RETURN
|
*********** GENERATE NEW CURSOR POSITION AND RETURN
|
|
|
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
|
NEWCUR STD COLADX SAVE NEW ROW AND COLUMN
|
LDA #LINLEN ELSE ADD A LINE
|
LDA #LINLEN ELSE ADD A LINE
|
MUL LINLEN * ROWADX
|
MUL LINLEN * ROWADX
|
ADDB COLADX
|
ADDB COLADX
|
ADCA #0
|
ADCA #0
|
ADDD #SCREEN ADD SCREEN BASE.
|
ADDD #SCREEN ADD SCREEN BASE.
|
STD CURSOR SAVE NEW CURSOR
|
STD CURSOR SAVE NEW CURSOR
|
TFR D,X GET CURSOR IN X
|
TFR D,X GET CURSOR IN X
|
RTS AND RETURN
|
RTS AND RETURN
|
|
|
********************* UPDATE CURRENT COLUMN AND ROW
|
********************* UPDATE CURRENT COLUMN AND ROW
|
|
|
NEWCOL LDD COLADX GET ROW AND COLUMN
|
NEWCOL LDD COLADX GET ROW AND COLUMN
|
INCA BUMP COLUMN
|
INCA BUMP COLUMN
|
CMPA #LINLEN ROLL?
|
CMPA #LINLEN ROLL?
|
BNE NEWCUR BRANCH IF NOT
|
BNE NEWCUR BRANCH IF NOT
|
CLRA ELSE RESET TO ZERO
|
CLRA ELSE RESET TO ZERO
|
INCB AND BUMP ROW
|
INCB AND BUMP ROW
|
CMPB #NUMLIN
|
CMPB #NUMLIN
|
BNE NEWCUR
|
BNE NEWCUR
|
DECB BOTTOM ROW
|
DECB BOTTOM ROW
|
BSR NEWCUR
|
BSR NEWCUR
|
|
|
********************************* SCROLL THE SCREEN
|
********************************* SCROLL THE SCREEN
|
|
|
SCROLL LDX #SCREEN POINT TO SCREEN
|
SCROLL LDX #SCREEN POINT TO SCREEN
|
SCROL1 LDA SCNLEN+LINLEN,X
|
SCROL1 LDA SCNLEN+LINLEN,X
|
STA SCNLEN,X
|
STA SCNLEN,X
|
LDAA LINLEN,X MOVE TWO BYTES
|
LDAA LINLEN,X MOVE TWO BYTES
|
STAA 0,X+ UP ONE LINE
|
STAA 0,X+ UP ONE LINE
|
CMPX #SCREEN+SCNLEN-LINLEN
|
CMPX #SCREEN+SCNLEN-LINLEN
|
BNE SCROL1 LOOP UNTIL DONE
|
BNE SCROL1 LOOP UNTIL DONE
|
BRA SCROL3
|
BRA SCROL3
|
|
|
**************** CLEAR FROM CURSOR TO END OF SCREEN
|
**************** CLEAR FROM CURSOR TO END OF SCREEN
|
|
|
ESCCLS LDX CURSOR GET CURSOR
|
ESCCLS LDX CURSOR GET CURSOR
|
SCROL3 LDAA #$20 GET A SPACE
|
SCROL3 LDAA #$20 GET A SPACE
|
SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
|
SCROL2 STA SCNLEN,X CLEAR ATTRIBUTES
|
STA ,X+ AND TEXT
|
STA ,X+ AND TEXT
|
CMPX #SCREEN+SCNLEN
|
CMPX #SCREEN+SCNLEN
|
BNE SCROL2 UNTIL DONE
|
BNE SCROL2 UNTIL DONE
|
CLR ESCFLG
|
CLR ESCFLG
|
RTS
|
RTS
|
ENDIF DG640OPT
|
ENDIF DG640OPT
|
*
|
*
|
IFD PRTOPT
|
IFD PRTOPT
|
*************************************
|
*************************************
|
*
|
*
|
** PRINTER DRIVER ROUTINES
|
** PRINTER DRIVER ROUTINES
|
*
|
*
|
*************************************
|
*************************************
|
*
|
*
|
** PINIZ - INITIATE PRINTER PORT
|
** PINIZ - INITIATE PRINTER PORT
|
*
|
*
|
PINIZ PSHS B
|
PINIZ PSHS B
|
LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
|
LDD #DIRMSK*256+$04 ACCA=DIRMSK ACCB=$04
|
STD PADATA SET DDR AND SELECT DATA
|
STD PADATA SET DDR AND SELECT DATA
|
*
|
*
|
** RESET PRINTER
|
** RESET PRINTER
|
LDB #PRESET
|
LDB #PRESET
|
STAB PADATA
|
STAB PADATA
|
RESTLP INCB DELAY FOR RESET
|
RESTLP INCB DELAY FOR RESET
|
BNE RESTLP
|
BNE RESTLP
|
STAA PADATA ACCA=DIRMSK
|
STAA PADATA ACCA=DIRMSK
|
*
|
*
|
** INITALIZE PORT B (DATA PORT)
|
** INITALIZE PORT B (DATA PORT)
|
LDAA #$2A
|
LDAA #$2A
|
STAA PBCTRL
|
STAA PBCTRL
|
LDD #$FF2E ACCA=$FF ACCB =%00101110
|
LDD #$FF2E ACCA=$FF ACCB =%00101110
|
STD PBDATA PBDREG PBCTRL
|
STD PBDATA PBDREG PBCTRL
|
*
|
*
|
** SELECT 66 LINES/PAGE
|
** SELECT 66 LINES/PAGE
|
LDAA #$1B
|
LDAA #$1B
|
BSR POUTCH
|
BSR POUTCH
|
LDAA #'C
|
LDAA #'C
|
BSR POUTCH
|
BSR POUTCH
|
LDAA #66
|
LDAA #66
|
PULS B
|
PULS B
|
*************************************
|
*************************************
|
*
|
*
|
** OUTPUT A CHARACTER TO THE PRINTER
|
** OUTPUT A CHARACTER TO THE PRINTER
|
*
|
*
|
*************************************
|
*************************************
|
POUTCH PSHS B
|
POUTCH PSHS B
|
LDAB PBDATA CLEAR INTERRUPT BIT
|
LDAB PBDATA CLEAR INTERRUPT BIT
|
*
|
*
|
** WAIT TILL NOT BUSY
|
** WAIT TILL NOT BUSY
|
BUSYLP LDAB PADATA
|
BUSYLP LDAB PADATA
|
BITB #PERROR
|
BITB #PERROR
|
BEQ PEXIT
|
BEQ PEXIT
|
TSTB
|
TSTB
|
BMI BUSYLP
|
BMI BUSYLP
|
*
|
*
|
** NOW OUTPUT CHARACTER
|
** NOW OUTPUT CHARACTER
|
STAA PBDATA
|
STAA PBDATA
|
PEXIT PULS B,PC
|
PEXIT PULS B,PC
|
*************************************
|
*************************************
|
*
|
*
|
** PCHK TEST IFD PRINTER READY
|
** PCHK TEST IFD PRINTER READY
|
*
|
*
|
*************************************
|
*************************************
|
PCHK TST PBCTRL TEST STATE OF CRB7
|
PCHK TST PBCTRL TEST STATE OF CRB7
|
RTS SET ON ACKNOWLEDGE
|
RTS SET ON ACKNOWLEDGE
|
ENDIF PRTOPT
|
ENDIF PRTOPT
|
*************************************
|
*************************************
|
*
|
*
|
* MONITOR KEYBOARD COMMAND JUMP TABLE
|
* MONITOR KEYBOARD COMMAND JUMP TABLE
|
*
|
*
|
*************************************
|
*************************************
|
*
|
*
|
JMPTAB EQU *
|
JMPTAB EQU *
|
FCB 1 " ^A "
|
FCB 1 " ^A "
|
FDB ALTRA
|
FDB ALTRA
|
FCB 2 " ^B "
|
FCB 2 " ^B "
|
FDB ALTRB
|
FDB ALTRB
|
FCB 3 " ^C "
|
FCB 3 " ^C "
|
FDB ALTRCC
|
FDB ALTRCC
|
FCB 4 " ^D "
|
FCB 4 " ^D "
|
FDB ALTRDP
|
FDB ALTRDP
|
FCB $10 " ^P "
|
FCB $10 " ^P "
|
FDB ALTRPC
|
FDB ALTRPC
|
FCB $15 " ^U "
|
FCB $15 " ^U "
|
FDB ALTRU
|
FDB ALTRU
|
FCB $18 " ^X "
|
FCB $18 " ^X "
|
FDB ALTRX
|
FDB ALTRX
|
FCB $19 " ^Y "
|
FCB $19 " ^Y "
|
FDB ALTRY
|
FDB ALTRY
|
*
|
*
|
FCC 'B'
|
FCC 'B'
|
FDB BRKPNT
|
FDB BRKPNT
|
FCC 'E'
|
FCC 'E'
|
FDB MEMDUMP
|
FDB MEMDUMP
|
FCC 'G'
|
FCC 'G'
|
FDB GO
|
FDB GO
|
FCC 'L'
|
FCC 'L'
|
FDB LOAD
|
FDB LOAD
|
FCC 'P'
|
FCC 'P'
|
FDB PUNCH
|
FDB PUNCH
|
FCC 'M'
|
FCC 'M'
|
FDB MEMCHG
|
FDB MEMCHG
|
FCC 'R'
|
FCC 'R'
|
FDB REGSTR
|
FDB REGSTR
|
FCC 'S'
|
FCC 'S'
|
FDB DISSTK
|
FDB DISSTK
|
FCC 'X'
|
FCC 'X'
|
FDB XBKPNT
|
FDB XBKPNT
|
IFD MFDCOPT
|
IFD MFDCOPT
|
FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
|
FCC 'D' *** SWTPC USES 'U' FOR MINIBOOT
|
FDB MINBOOT
|
FDB MINBOOT
|
ENDIF MFDCOPT
|
ENDIF MFDCOPT
|
IFD CF8OPT
|
IFD CF8OPT
|
FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
|
FCC 'D' *** FPGA 8 BIT USES 'D' FOR CFBOOT
|
FDB CFBOOT
|
FDB CFBOOT
|
ENDIF CF8OPT
|
ENDIF CF8OPT
|
IFD IDEOPT
|
IFD IDEOPT
|
FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
|
FCC 'D' *** XESS FPGA 16 BIT IDE USES 'D' FOR IDEBOOT
|
FDB IDEBOOT
|
FDB IDEBOOT
|
ENDIF IDEOPT
|
ENDIF IDEOPT
|
IFD DMAFOPT
|
IFD DMAFOPT
|
FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
|
FCC 'U' *** SWTPC USES 'D' FOR DMAF2 BOOT
|
FDB DBOOT
|
FDB DBOOT
|
ENDIF DMAFOPT
|
ENDIF DMAFOPT
|
IFD EXTOPT
|
IFD EXTOPT
|
FCC 'U' *** IF FPGA, 'U' IS FOR USER
|
FCC 'U' *** IF FPGA, 'U' IS FOR USER
|
FDB USRCMD
|
FDB USRCMD
|
ENDIF EXTOPT
|
ENDIF EXTOPT
|
IFD RTCOPT
|
IFD RTCOPT
|
FCC 'T'
|
FCC 'T'
|
FDB TIMSET
|
FDB TIMSET
|
ENDIF RTCOPT
|
ENDIF RTCOPT
|
IFD TRAOPT
|
IFD TRAOPT
|
FCC "T"
|
FCC "T"
|
FDB TRACE
|
FDB TRACE
|
ENDIF TRAOPT
|
ENDIF TRAOPT
|
*
|
*
|
TABEND EQU *
|
TABEND EQU *
|
*
|
*
|
* ** 6809 VECTOR ADDRESSES **
|
* ** 6809 VECTOR ADDRESSES **
|
*
|
*
|
* FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
|
* FOLLOWING ARE THE ADDRESSES OF THE VECTOR ROUTINES
|
* FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
|
* FOR THE 6809 PROCESSOR. DURING INITIALIZATION THEY
|
* ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
|
* ARE RELOCATED TO RAM FROM $DFC0 TO $DFCF. THEY ARE
|
* RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
|
* RELOCATED TO RAM SO THAT THE USER MAY REVECTOR TO
|
* HIS OWN ROUTINES IF HE SO DESIRES.
|
* HIS OWN ROUTINES IF HE SO DESIRES.
|
*
|
*
|
*
|
*
|
RAMVEC FDB SWIE USER-V
|
RAMVEC FDB SWIE USER-V
|
FDB RTI SWI3-V
|
FDB RTI SWI3-V
|
FDB RTI SWI2-V
|
FDB RTI SWI2-V
|
FDB RTI FIRQ-V
|
FDB RTI FIRQ-V
|
FDB RTI IRQ-V
|
FDB RTI IRQ-V
|
FDB SWIE SWI-V
|
FDB SWIE SWI-V
|
FDB $FFFF SVC-VO
|
FDB $FFFF SVC-VO
|
FDB $FFFF SVC-VL
|
FDB $FFFF SVC-VL
|
*
|
*
|
* PRINTABLE MESSAGE STRINGS
|
* PRINTABLE MESSAGE STRINGS
|
*
|
*
|
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
|
MSG1 FCB $D,$A,$0,$0,$0 * 0, CR/LF, 0
|
FCC 'SYS09BUG 1.4 FOR '
|
FCC 'SYS09BUG 1.4 FOR '
|
IFD S3EOPT
|
IFD S3EOPT
|
FCC 'S3E '
|
FCC 'S3E '
|
ENDIF S3EOPT
|
ENDIF S3EOPT
|
IFD B5XOPT
|
IFD B5XOPT
|
FCC 'B5-X300 '
|
FCC 'B5-X300 '
|
ENDIF B5XOPT
|
ENDIF B5XOPT
|
IFD S3SOPT
|
IFD S3SOPT
|
FCC 'S3STARTER '
|
FCC 'S3STARTER '
|
ENDIF S3SOPT
|
ENDIF S3SOPT
|
IFD ADSOPT
|
IFD ADSOPT
|
FCC 'ADS6809 '
|
FCC 'ADS6809 '
|
ENDIF ADSOPT
|
ENDIF ADSOPT
|
IFD SWTOPT`
|
IFD SWTOPT`
|
FCC 'SWTPC '
|
FCC 'SWTPC '
|
ENDIF SWTOPT
|
ENDIF SWTOPT
|
IFD XESOPT`
|
IFD XESOPT`
|
FCC 'XESS '
|
FCC 'XESS '
|
ENDIF XESOPT
|
ENDIF XESOPT
|
FCC ' - '
|
FCC ' - '
|
FCB 4
|
FCB 4
|
MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
|
MSG2 FCB 'K,$D,$A,$00,$00,$00,$04 K, * CR/LF + 3 NULS
|
MSG3 FCC '>'
|
MSG3 FCC '>'
|
FCB 4
|
FCB 4
|
MSG4 FCC 'WHAT?'
|
MSG4 FCC 'WHAT?'
|
FCB 4
|
FCB 4
|
MSG5 FCC ' - '
|
MSG5 FCC ' - '
|
FCB 4'
|
FCB 4'
|
MSG10 FCC ' SP='
|
MSG10 FCC ' SP='
|
FCB 4
|
FCB 4
|
MSG11 FCC ' PC='
|
MSG11 FCC ' PC='
|
FCB 4
|
FCB 4
|
MSG12 FCC ' US='
|
MSG12 FCC ' US='
|
FCB 4
|
FCB 4
|
MSG13 FCC ' IY='
|
MSG13 FCC ' IY='
|
FCB 4
|
FCB 4
|
MSG14 FCC ' IX='
|
MSG14 FCC ' IX='
|
FCB 4
|
FCB 4
|
MSG15 FCC ' DP='
|
MSG15 FCC ' DP='
|
FCB 4
|
FCB 4
|
MSG16 FCC ' A='
|
MSG16 FCC ' A='
|
FCB 4
|
FCB 4
|
MSG17 FCC ' B='
|
MSG17 FCC ' B='
|
FCB 4
|
FCB 4
|
MSG18 FCC ' CC: '
|
MSG18 FCC ' CC: '
|
FCB 4
|
FCB 4
|
MSG19 FCC 'EFHINZVC'
|
MSG19 FCC 'EFHINZVC'
|
MSG20 FCC 'S1'
|
MSG20 FCC 'S1'
|
FCB 4
|
FCB 4
|
IFD DATOPT
|
IFD DATOPT
|
*
|
*
|
* POWER UP/ RESET/ NMI ENTRY POINT
|
* POWER UP/ RESET/ NMI ENTRY POINT
|
*
|
*
|
ORG $FF00
|
ORG $FF00
|
*
|
*
|
*
|
*
|
START LDX #IC11 POINT TO DAT RAM IC11
|
START LDX #IC11 POINT TO DAT RAM IC11
|
LDA #$F GET COMPLIMENT OF ZERO
|
LDA #$F GET COMPLIMENT OF ZERO
|
*
|
*
|
*
|
*
|
* INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
|
* INITIALIZE DAT RAM --- LOADS $F-$0 IN LOCATIONS $0-$F
|
* OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
|
* OF DAT RAM, THUS STORING COMPLEMENT OF MSB OF ADDRESS
|
* IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
|
* IN THE DAT RAM. THE COMPLEMENT IS REQUIRED BECAUSE THE
|
* OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
|
* OUTPUT OF IC11, A 74S189, IS THE INVERSE OF THE DATA
|
* STORED IN IT.
|
* STORED IN IT.
|
*
|
*
|
*
|
*
|
DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
|
DATLP STA ,X+ STORE & POINT TO NEXT RAM LOCATION
|
DECA GET COMP. VALUE FOR NEXT LOCATION
|
DECA GET COMP. VALUE FOR NEXT LOCATION
|
BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
|
BNE DATLP ALL 16 LOCATIONS INITIALIZED ?
|
*
|
*
|
* NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
|
* NOTE: IX NOW CONTAINS $0000, DAT RAM IS NO LONGER
|
* ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
|
* ADDRESSED, AND LOGICAL ADDRESSES NOW EQUAL
|
* PHYSICAL ADDRESSES.
|
* PHYSICAL ADDRESSES.
|
*
|
*
|
LDA #$F0
|
LDA #$F0
|
STA ,X STORE $F0 AT $FFFF
|
STA ,X STORE $F0 AT $FFFF
|
LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
|
LDX #$D0A0 ASSUME RAM TO BE AT $D000-$DFFF
|
LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
|
LDY #TSTPAT LOAD TEST DATA PATTERN INTO "Y"
|
TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
|
TSTRAM LDU ,X SAVE DATA FROM TEST LOCATION
|
STY ,X STORE TEST PATTERN AT $D0A0
|
STY ,X STORE TEST PATTERN AT $D0A0
|
CMPY ,X IS THERE RAM AT THIS LOCATION ?
|
CMPY ,X IS THERE RAM AT THIS LOCATION ?
|
BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
|
BEQ CNVADR IF MATCH THERE'S RAM, SO SKIP
|
LEAX -$1000,X ELSE POINT 4K LOWER
|
LEAX -$1000,X ELSE POINT 4K LOWER
|
CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
|
CMPX #$F0A0 DECREMENTED PAST ZER0 YET ?
|
BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
|
BNE TSTRAM IF NOT CONTINUE TESTING FOR RAM
|
BRA START ELSE START ALL OVER AGAIN
|
BRA START ELSE START ALL OVER AGAIN
|
*
|
*
|
*
|
*
|
* THE FOLLOWING CODE STORES THE COMPLEMENT OF
|
* THE FOLLOWING CODE STORES THE COMPLEMENT OF
|
* THE MS CHARACTER OF THE FOUR CHARACTER HEX
|
* THE MS CHARACTER OF THE FOUR CHARACTER HEX
|
* ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
|
* ADDRESS OF THE FIRST 4K BLOCK OF RAM LOCATED
|
* BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
|
* BY THE ROUTINE "TSTRAM" INTO THE DAT RAM. IT
|
* IS STORED IN RAM IN THE LOCATION THAT IS
|
* IS STORED IN RAM IN THE LOCATION THAT IS
|
* ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
|
* ADDRESSED WHEN THE PROCESSOR ADDRESS IS $D---,
|
* THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
|
* THUS IF THE FIRST 4K BLOCK OF RAM IS FOUND
|
* WHEN TESTING LOCATION $70A0, MEANING THERE
|
* WHEN TESTING LOCATION $70A0, MEANING THERE
|
* IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
|
* IS NO RAM PHYSICALLY ADDRESSED IN THE RANGE
|
* $8000-$DFFF, THEN THE COMPLEMENT OF THE
|
* $8000-$DFFF, THEN THE COMPLEMENT OF THE
|
* "7" IN THE $70A0 WILL BE STORED IN
|
* "7" IN THE $70A0 WILL BE STORED IN
|
* THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
|
* THE DAT RAM. THUS WHEN THE PROCESSOR OUTPUTS
|
* AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
|
* AN ADDRESS OF $D---, THE DAT RAM WILL RESPOND
|
* BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
|
* BY RECOMPLEMENTING THE "7" AND OUTPUTTING THE
|
* 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
|
* 7 ONTO THE A12-A15 ADDRESS LINES. THUS THE
|
* RAM THAT IS PHYSICALLY ADDRESSED AT $7---
|
* RAM THAT IS PHYSICALLY ADDRESSED AT $7---
|
* WILL RESPOND AND APPEAR TO THE 6809 THAT IT
|
* WILL RESPOND AND APPEAR TO THE 6809 THAT IT
|
* IS AT $D--- SINCE THAT IS THE ADDRESS THE
|
* IS AT $D--- SINCE THAT IS THE ADDRESS THE
|
* 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
|
* 6809 WILL BE OUTPUTING WHEN THAT 4K BLOCK
|
* OF RAM RESPONDS.
|
* OF RAM RESPONDS.
|
*
|
*
|
*
|
*
|
CNVADR STU ,X RESTORE DATA AT TEST LOCATION
|
CNVADR STU ,X RESTORE DATA AT TEST LOCATION
|
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
|
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
|
COMA COMPLEMENT MSB OF THAT ADDRESS
|
COMA COMPLEMENT MSB OF THAT ADDRESS
|
LSRA PUT MS 4 BITS OF ADDRESS IN
|
LSRA PUT MS 4 BITS OF ADDRESS IN
|
LSRA LOCATION D0-D3 TO ALLOW STORING
|
LSRA LOCATION D0-D3 TO ALLOW STORING
|
LSRA IT IN THE DYNAMIC ADDRESS
|
LSRA IT IN THE DYNAMIC ADDRESS
|
LSRA TRANSLATION RAM.
|
LSRA TRANSLATION RAM.
|
STA $FFFD STORE XLATION FACTOR IN DAT "D"
|
STA $FFFD STORE XLATION FACTOR IN DAT "D"
|
*
|
*
|
LDS #STACK INITIALIZE STACK POINTER
|
LDS #STACK INITIALIZE STACK POINTER
|
*
|
*
|
*
|
*
|
* THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
|
* THE FOLLOWING CHECKS TO FIND THE REAL PHYSICAL ADDRESSES
|
* OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
|
* OF ALL 4K BLKS OF RAM IN THE SYSTEM. WHEN EACH 4K BLK
|
* OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
|
* OF RAM IS LOCATED, THE COMPLEMENT OF IT'S REAL ADDRESS
|
* IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
|
* IS THEN STORED IN A "LOGICAL" TO "REAL" ADDRESS XLATION
|
* TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
|
* TABLE THAT IS BUILT FROM $DFD0 TO $DFDF. FOR EXAMPLE IF
|
* THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
|
* THE SYSTEM HAS RAM THAT IS PHYSICALLY LOCATED (WIRED TO
|
* RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
|
* RESPOND) AT THE HEX LOCATIONS $0--- THRU $F---....
|
*
|
*
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
|
* 4K 4K 4K 4K 4K 4K 4K 4K -- 4K 4K 4K 4K -- -- --
|
*
|
*
|
* ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
|
* ....FOR A TOTAL OF 48K OF RAM, THEN THE TRANSLATION TABLE
|
* CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
|
* CREATED FROM $DFD0 TO $DFDF WILL CONSIST OF THE FOLLOWING....
|
*
|
*
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
|
* 0F 0E 0D 0C 0B 0A 09 08 06 05 00 00 04 03 F1 F0
|
*
|
*
|
*
|
*
|
* HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
|
* HERE WE SEE THE LOGICAL ADDRESSES OF MEMORY FROM $0000-$7FFF
|
* HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
|
* HAVE NOT BEEN SELECTED FOR RELOCATION SO THAT THEIR PHYSICAL
|
* ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
|
* ADDRESS WILL = THEIR LOGICAL ADDRESS; HOWEVER, THE 4K BLOCK
|
* PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
|
* PHYSICALLY AT $9000 WILL HAVE ITS ADDRESS TRANSLATED SO THAT
|
* IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
|
* IT WILL LOGICALLY RESPOND AT $8000. LIKEWISE $A,$B, AND $C000
|
* WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
|
* WILL BE TRANSLATED TO RESPOND TO $9000,$C000, AND $D000
|
* RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
|
* RESPECTIVELY. THE USER SYSTEM WILL LOGICALLY APPEAR TO HAVE
|
* MEMORY ADDRESSED AS FOLLOWS....
|
* MEMORY ADDRESSED AS FOLLOWS....
|
*
|
*
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 0 1 2 3 4 5 6 7 8 9 A B C D E F
|
* 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
|
* 4K 4K 4K 4K 4K 4K 4K 4K 4K 4K -- -- 4K 4K -- --
|
*
|
*
|
*
|
*
|
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
|
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
|
STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
|
STA 13,Y STORE $D--- XLATION FACTOR AT $DFDD
|
CLR 14,Y CLEAR $DFDE
|
CLR 14,Y CLEAR $DFDE
|
LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
|
LDA #$F0 DESTINED FOR IC8 AN MEM EXPANSION ?
|
STA 15,Y STORE AT $DFDF
|
STA 15,Y STORE AT $DFDF
|
LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
|
LDA #$0C PRESET NUMBER OF BYTES TO CLEAR
|
CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
|
CLRLRT CLR A,Y CLEAR $DFDC THRU $DFD0
|
DECA SUB. 1 FROM BYTES LEFT TO CLEAR
|
DECA SUB. 1 FROM BYTES LEFT TO CLEAR
|
BPL CLRLRT CONTINUE IF NOT DONE CLEARING
|
BPL CLRLRT CONTINUE IF NOT DONE CLEARING
|
FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
|
FNDRAM LEAX -$1000,X POINT TO NEXT LOWER 4K OF RAM
|
CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
|
CMPX #$F0A0 TEST FOR DECREMENT PAST ZERO
|
BEQ FINTAB SKIP IF FINISHED
|
BEQ FINTAB SKIP IF FINISHED
|
LDU ,X SAVE DATA AT CURRENT TEST LOCATION
|
LDU ,X SAVE DATA AT CURRENT TEST LOCATION
|
LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
|
LDY #TSTPAT LOAD TEST DATA PATTERN INTO Y REG.
|
STY ,X STORE TEST PATT. INTO RAM TEST LOC.
|
STY ,X STORE TEST PATT. INTO RAM TEST LOC.
|
CMPY ,X VERIFY RAM AT TEST LOCATION
|
CMPY ,X VERIFY RAM AT TEST LOCATION
|
BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
|
BNE FNDRAM IF NO RAM GO LOOK 4K LOWER
|
STU ,X ELSE RESTORE DATA TO TEST LOCATION
|
STU ,X ELSE RESTORE DATA TO TEST LOCATION
|
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
|
LDY #LRARAM POINT TO LOGICAL/REAL ADDR. TABLE
|
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
|
TFR X,D PUT ADDR. OF PRESENT 4K BLOCK IN D
|
LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
|
LSRA PUT MS 4 BITS OF ADDR. IN LOC. D0-D3
|
LSRA TO ALLOW STORING IT IN THE DAT RAM.
|
LSRA TO ALLOW STORING IT IN THE DAT RAM.
|
LSRA
|
LSRA
|
LSRA
|
LSRA
|
TFR A,B SAVE OFFSET INTO LRARAM TABLE
|
TFR A,B SAVE OFFSET INTO LRARAM TABLE
|
EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
|
EORA #$0F INVERT MSB OF ADDR. OF CURRENT 4K BLK
|
STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
|
STA B,Y SAVE TRANSLATION FACTOR IN LRARAM TABLE
|
BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
|
BRA FNDRAM GO TRANSLATE ADDR. OF NEXT 4K BLK
|
FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
|
FINTAB LDA #$F1 DESTINED FOR IC8 AND MEM EXPANSION ?
|
LDY #LRARAM POINT TO LRARAM TABLE
|
LDY #LRARAM POINT TO LRARAM TABLE
|
STA 14,Y STORE $F1 AT $DFCE
|
STA 14,Y STORE $F1 AT $DFCE
|
*
|
*
|
* THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
|
* THE FOLLOWING CHECKS TO SEE IF THERE IS A 4K BLK OF
|
* RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
|
* RAM LOCATED AT $C000-$CFFF. IF NONE THERE IT LOCATES
|
* THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
|
* THE NEXT LOWER 4K BLK AN XLATES ITS ADDR SO IT
|
* LOGICALLY RESPONDS TO THE ADDRESS $C---.
|
* LOGICALLY RESPONDS TO THE ADDRESS $C---.
|
*
|
*
|
*
|
*
|
LDA #$0C PRESET NUMBER HEX "C"
|
LDA #$0C PRESET NUMBER HEX "C"
|
FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
|
FINDC LDB A,Y GET ENTRY FROM LRARAM TABLE
|
BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
|
BNE FOUNDC BRANCH IF RAM THIS PHYSICAL ADDR.
|
DECA ELSE POINT 4K LOWER
|
DECA ELSE POINT 4K LOWER
|
BPL FINDC GO TRY AGAIN
|
BPL FINDC GO TRY AGAIN
|
BRA XFERTF
|
BRA XFERTF
|
FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
|
FOUNDC CLR A,Y CLR XLATION FACTOR OF 4K BLOCK FOUND
|
STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
|
STB $C,Y GIVE IT XLATION FACTOR MOVING IT TO $C---
|
*
|
*
|
* THE FOLLOWING CODE ADJUSTS THE TRANSLATION
|
* THE FOLLOWING CODE ADJUSTS THE TRANSLATION
|
* FACTORS SUCH THAT ALL REMAINING RAM WILL
|
* FACTORS SUCH THAT ALL REMAINING RAM WILL
|
* RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
|
* RESPOND TO A CONTIGUOUS BLOCK OF LOGICAL
|
* ADDRESSES FROM $0000 AND UP....
|
* ADDRESSES FROM $0000 AND UP....
|
*
|
*
|
CLRA START AT ZERO
|
CLRA START AT ZERO
|
TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
|
TFR Y,X START POINTER "X" START OF "LRARAM" TABLE.
|
COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
|
COMPRS LDB A,Y GET ENTRY FROM "LRARAM" TABLE
|
BEQ PNTNXT IF IT'S ZER0 SKIP
|
BEQ PNTNXT IF IT'S ZER0 SKIP
|
CLR A,Y ELSE ERASE FROM TABLE
|
CLR A,Y ELSE ERASE FROM TABLE
|
STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
|
STB ,X+ AND ENTER ABOVE LAST ENTRY- BUMP
|
PNTNXT INCA GET OFFSET TO NEXT ENTRY
|
PNTNXT INCA GET OFFSET TO NEXT ENTRY
|
CMPA #$0C LAST ENTRY YET ?
|
CMPA #$0C LAST ENTRY YET ?
|
BLT COMPRS
|
BLT COMPRS
|
*
|
*
|
* THE FOLLOWING CODE TRANSFER THE TRANSLATION
|
* THE FOLLOWING CODE TRANSFER THE TRANSLATION
|
* FACTORS FROM THE LRARAM TABLE TO IC11 ON
|
* FACTORS FROM THE LRARAM TABLE TO IC11 ON
|
* THE MP-09 CPU CARD.
|
* THE MP-09 CPU CARD.
|
*
|
*
|
XFERTF LDX #IC11 POINT TO DAT RAM IC11
|
XFERTF LDX #IC11 POINT TO DAT RAM IC11
|
LDB #$10 GET NO. OF BYTES TO MOVE
|
LDB #$10 GET NO. OF BYTES TO MOVE
|
FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
|
FETCH LDA ,Y+ GET BYTE AND POINT TO NEXT
|
STA ,X+ POKE XLATION FACTOR IN IC11
|
STA ,X+ POKE XLATION FACTOR IN IC11
|
DECB SUB 1 FROM BYTES TO MOVE
|
DECB SUB 1 FROM BYTES TO MOVE
|
BNE FETCH CONTINUE UNTIL 16 MOVED
|
BNE FETCH CONTINUE UNTIL 16 MOVED
|
*
|
*
|
ELSE
|
ELSE
|
LRA RTS
|
LRA RTS
|
START LDS #STACK INITIALIZE STACK POINTER
|
START LDS #STACK INITIALIZE STACK POINTER
|
CLRB
|
CLRB
|
ENDIF DATOPT
|
ENDIF DATOPT
|
*
|
*
|
COMB SET "B" NON-ZERO
|
COMB SET "B" NON-ZERO
|
STB ECHO TURN ON ECHO FLAG
|
STB ECHO TURN ON ECHO FLAG
|
LBRA MONITOR INITIALIZATION IS COMPLETE
|
LBRA MONITOR INITIALIZATION IS COMPLETE
|
*
|
*
|
** INTERRUPT JUMP VECTORS
|
** INTERRUPT JUMP VECTORS
|
*
|
*
|
V1 JMP [STACK]
|
V1 JMP [STACK]
|
V2 JMP [SWI2]
|
V2 JMP [SWI2]
|
V3 JMP [FIRQ]
|
V3 JMP [FIRQ]
|
V4 JMP [IRQ]
|
V4 JMP [IRQ]
|
V5 JMP [SWI]
|
V5 JMP [SWI]
|
*
|
*
|
* SWI3 ENTRY POINT
|
* SWI3 ENTRY POINT
|
*
|
*
|
SWI3E TFR S,U
|
SWI3E TFR S,U
|
LDX 10,U *$FFC8
|
LDX 10,U *$FFC8
|
LDB ,X+
|
LDB ,X+
|
STX 10,U
|
STX 10,U
|
CLRA
|
CLRA
|
ASLB
|
ASLB
|
ROLA
|
ROLA
|
LDX SVCVO
|
LDX SVCVO
|
CMPX #$FFFF
|
CMPX #$FFFF
|
BEQ SWI3Z
|
BEQ SWI3Z
|
LEAX D,X
|
LEAX D,X
|
CMPX SVCVL
|
CMPX SVCVL
|
BHI SWI3Z
|
BHI SWI3Z
|
PSHS X
|
PSHS X
|
LDD ,U
|
LDD ,U
|
LDX 4,U
|
LDX 4,U
|
JMP [,S++]
|
JMP [,S++]
|
SWI3Z PULU A,B,X,CC,DP
|
SWI3Z PULU A,B,X,CC,DP
|
LDU 2,U
|
LDU 2,U
|
JMP [SWI3]
|
JMP [SWI3]
|
*
|
*
|
* 6809 VECTORS
|
* 6809 VECTORS
|
*
|
*
|
ORG $FFF0
|
ORG $FFF0
|
FDB V1 USER-V
|
FDB V1 USER-V
|
FDB SWI3E SWI3-V
|
FDB SWI3E SWI3-V
|
FDB V2 SWI2-V
|
FDB V2 SWI2-V
|
FDB V3 FIRQ-V
|
FDB V3 FIRQ-V
|
FDB V4 IRQ-V
|
FDB V4 IRQ-V
|
FDB V5 SWI-V
|
FDB V5 SWI-V
|
FDB V1 NMI-V
|
FDB V1 NMI-V
|
FDB START RESTART-V
|
FDB START RESTART-V
|
END START
|
END START
|
|
|