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