Code:
*EXIDY STANDARD MONITOR SOFTWARE 07/26/76
0002 ;
0003 ;
0004 ;
0005 ;###################################
0006 ;# #
0007 ;# EXIDY STANDARD MONITOR #
0008 ;# #
0009 ;###################################
0010 ;
0011 ;
0012 ;
0013 ;
0014 ;
0015 ;
0016 ; DEVELOPED FOR EXIDY INC.
0017 ;
0018 ; BY JOHN K. BORDERS JR.
0019 ;
0020 ;
0021 ;
0022 ; Z80 BASED MONITOR SOFTWARE
0023 ; WITH FULL CASSETTE AND VIDEO
0024 ; DRIVER ROUTINES. SELF-SEEKING
0025 ; RAM STORAGE AND STACK ROUTINES.
0026 ;
0027 ;
0028 ;
0029 ;
0030 ;
0031 ; VERSION 1.0 DATED: 7/26/78
0032 ;
0033 ;
0034 ;
0035 ;
0036 ;
0037 ;
0038 ;
0039 ;
0040 ; EQUATE TABLE
0041 ;
0042 ;
0043 ;*********************************
0044 ;
0045 ; ASCII EQUATES
0046 ;
000D = 0047 CR: EQU 0DH ;CARRIAGE RETURN
000A = 0048 LF: EQU 0AH ;LINE FEED
001B = 0049 ESC: EQU 1BH ;ESCAPE
0001 = 0050 CNTRLA: EQU 'A'-40H
0003 = 0051 CNTRLC: EQU 'C'-40H
0008 = 0052 CNTRLH: EQU 'H'-40H
0011 = 0053 CNTRLQ: EQU 'Q'-40H
0013 = 0054 CNTRLS: EQU 'S'-40H
0017 = 0055 CNTRLW: EQU 'W'-40H
001A = 0056 CNTRLZ: EQU 'Z'-40H
007F = 0057 RUBOUT: EQU 7FH ;RUB OUT
0020 = 0058 SPACE: EQU 20H ;SPACE
0059 ;
0060 ; RAM POINTERS
0061 ;
F000 = 0062 RAMTOP: EQU 0F000H ;POINTER STORE
0000 = 0063 RAM: EQU 0000H ;START OF RAM
0000 = 0064 BUFFER: EQU 0 ;INPUT BUFFER
003C = 0065 LINELN: EQU BUFFER+60 ;LINE LENGTH
003D = 0066 TAPES: EQU LINELN+1 ;TAPE RATE
003E = 0067 SPEEDS: EQU TAPES+1 ;DISPLAY SPEED
003F = 0068 OUTADD: EQU SPEEDS+1 ;OUTPUT ADDRESS
0041 = 0069 INADD: EQU OUTADD+2 ;INPUT ADDRESS
0043 = 0070 BATCHF: EQU INADD+2 ;BATCH FLAG
0044 = 0071 PROMPT: EQU BATCHF+1 ;PROMPT CHARACTER
0045 = 0072 CMTRFG: EQU PROMPT+1 ;CASSETTE MOTOR FLAG
0046 = 0073 CRCBYT: EQU CMTRFG+1 ;CRC BYTE
0047 = 0074 CHEAD: EQU CRCBYT+1 ;COMMAND HEADER
0057 = 0075 THEAD: EQU CHEAD+16 ;TAPE HEADER
0076 ; VIDEO SCREEN EQUATES
00F8 = 0077 TOPHRG: EQU 0F8H
F000 = 0076 SCREEN: EQU 0F000H
F080 = 0079 VID: EQU SCREEN+128
F800 = 0080 TOP: EQU SCREEN+2048
0067 = 0081 VDHLD: EQU THEAD+16 ;CHAR HOLD
0068 = 0082 LINE: EQU VDHLD+1 ;LINE #
006A = 0083 CHR: EQU LINE+2 ;CHAR #
006C = 0084 LSTKEY: EQU CHR+2 ;LAST KEY FRESSED
0010 = 0085 HEADLN: EQU 16 ;HEADER LENGTH
006E = 0086 STORE: EQU LSTKEY+2 ;END OF EQU TABLE
0087 ;
0088 ; CASSETTE HEADER EQUATES
0089 ;
0000 = 0090 HNAME: EQU 0
0006 = 0091 HTYPE: EQU 6
0007 = 0092 HSIZE: EQU 7
0009 = 0093 HADDR: EQU 9
000B = 0094 HXEQ: EQU 11
0096 ;
; BASSAV: EQU 0E65AH
; BASLOAD: EQU 0E799H
; CHRINR: EQU 0E041H
; MAIN3: EQU 0E11CH
; STAPR2: EQU 0E985H
; MLOOP: EQU 0EB44H
; FINISH: EQU 0E348H
; SE: EQU 0E330H
; DUMP: EQU 0E314H
0097 ;
0098 ;
0099 ;
0100 ;
E000 0101 ORG 0E000H
0102 ;
0103 ;
0104 ;
0105 ; JUMP TABLE INTO MONITOR
0106 ;
0107 ;
0108 ;
E000 F247E0 0109 COLD: JP INITC ;COLD START
E003 F278E0 0110 WARM: JP INITW ;WARM START
E006 F24DE0 0111 USER: JP INITU ;USER START
E009 F230E0 0112 RECEVE: JP CHRIN ;INPUT CHARACTER
E00C F23CE0 0113 SEND: JP CHROUT ;OUTPUT CHARACTER
E00F F27DE1 0114 INTAPE: JP TAPEIN ;TAPE INPUT
E012 F288E1 0115 OUTAPE: JP TAPOUT ;TAPE OUTPUT
E015 F26BE6 0116 QUIKCK: JP QUIK ;CNTRLC CHECK
E018 F27EE6 0117 KEYBRD: JP CHRIN1 ;KEYBOARD INPUT
E01B F20EE6 0118 VIDEO: JP CHROT1 ;VIDEO OUTPUT
E01E F298E4 0119 PARLIN: JP PARIN ;PARALLEL INPUT
E021 F29DE4 0120 PARLOT: JP PAROUT ;PARALLEL OUTPUT
E024 F25BE1 0121 CMOTON: JP MOTRON ;TURN CASSETTE MOTOR ON
E027 F267E1 0122 CMOTOFF: JP MTROFF ;TURN CASSETTE MOTOR OFF
UE02A F20000 0123 BASSAV: JP SAVBAS ;ENTRY FOR BASIC CSAVE
E02D F2B1E4 0124 BASLOD: JP LODBAS ;ENTRY FOR BASIC CLOAD
0125 ;
VE030 56 0126 CHRIN: PUSH IY ;WE DESTROY THESE
VE031 76 0127 PUSH HL
E032 CDE0E0 0128 CALL GETIY
L 0129 LD HL, CHRINR ;FOR RETURN
VE035 76 0130 PUSH HL
S 0131 LD L, (IY+INADD) ;GET ADDRESS
L 0132 LD H, (IY+INADD+1)
PE036 F29FE6 0133 JP (HL) ;GO DO IT
VE039 76 0134 CHRINR: POP HL ;RESTORE
VE03A 56 0135 POP IY
E03B C9 0136 RET
0137 ;
VE03C 56 0138 CHROUT: PUSH IY ;WE DESTROY THESE
VE03D 76 0139 PUSH HL
VE03E 76 0140 PUSH AF
E03F CDE0E0 0141 CALL GETIY
S 0142 LD H, (IY+SPEEDS) ;GD DISPLAY SPEED
L 0143 LD L, 1 ;FINISH OFF
L 0144 OUTDLY: DEC HL ;DELAY
S 0145 LD A, H ;ARE WE THROUGH?
S 0146 OR L
L 0147 JR NZ, OUTDLY ;NOPE-
VE042 76 0148 POP AF ;GET 'EM BACK
L 0149 LD HL, CHRINR
VE043 76 0150 PUSH HL
S 0151 LD L, (IY+OUTADD)
L 0152 LD H, (IY+OUTADD+1)
PE044 F29FE6 0153 JP (HL)
0154 ;
0155 ;
0156 ;
0157 ; INITIALIZE ROUTINES
0158 ;
0159 ;
0160 ;
0161 ;
0162 ;
0163 ;
0164 ; INITC = COLD START - FINDS
0165 ; TOP OF RAM AND SDS
0166 ; STACK AND STORAGE THERE
0167 ; INITW = WARM START - USES
0166 ; STACK FROM INITC
0169 ; INITU = USER START - USES
0170 ; HL FROM USER AS TOP OF
0171 ; RAM LIKE INITC
0172 ;
0173 ;
0174 ;
E047 = 0175 INITC: EQU $
S 0176 LD A, 0FFH ;INITIALIZE CASSETTE
PE047 D3FD 0177 OUT 0FDH, A
S 0178 LD D, 0
L 0179 LD HL, RAM ;POINT BEG RAM
L 0180 INITC2: LD A, (HL) ;GD IT
L 0181 LD B, (HL) ;TWICE
L 0182 CPL ;TURN AROUND
P 0183 LD (HL), A ;PUT BACK
E049 F49FE6 0184 CP (HL) ;& CHK IT
P 0185 LD (HL), B ;PUT REAL BACK
L 0186 INC HL ;POINT NEXT
L 0187 JR Z, INITC2 ;LOOP IF GOOD
L 0188 DEC HL ;ADJUST
L 0189 DEC HL ; H & L
E04C 01 0190 DB 1 ;LXI B
0191 ;
0192 ; USER START ENTRY POINT
0193 ;
E04D = 0194 INITU: EQU $
S 0195 LD D, 1
L0000 = 0196 INITU1: EQU $
P 0197 LD (RAMTOP), HL ;USER IS HERE
L 0198 LD IY, (RAMTOP)
L 0199 LD BC, 0-STORE
VE04D 56 0200 ADD IY, BC ;DO IT
S 0201 LD SP, IY ;GET A STACK
PE04E CD6BE6 0202 CALL QUIK ;SEE IF WARM RESET
SE051 F2B2E6 0203 JP NZ, PWARM ;YES-GO DO IT
S 0204 LD A, L ;CLEAR RAM!
VE054 56 0205 PUSH IY
VE055 76 0206 POP HL ;GET BEGINNING
L 0207 INITU2: LD (HL), 0 ;MAKE ZERO
L 0208 INC HL ;NEXT
E056 F40500 0209 CP L ;THRU?
L 0210 JR NZ, INITU2 ;NO-KEEP GOIN'
P 0211 LD (IY+PROMPT), '>' ;INIT PROMPT
P 0212 LD (IY+TAPES), 40H ;SET FOR 1200 BAUD
VE059 76 0213 PUSH DE ;WE DESTROY
E05A CDFDE5 0214 CALL VIDINT ;INIT VIDE0 BOARD
VE05D 76 0215 POP DE ;GET BACK
L 0216 LD HL, CHRIN1 ;POINT KEYBOARD
P 0217 LD (IY+INADD), L
P 0218 LD (IY+INADD+1), H ;PUT AWAY
L 0219 LD HL, CHROT1 ;POINT VIDEO
P 0220 LD (IY+OUTADD), L
P 0221 LD (IY+OUTADD+1), H
S 0222 LD A, (PCOLD) ;SEE IF PROM PACK IS IN
PE05E F4C300 0223 CP 0C3H ;IS THE "JUMP" THERE?
L 0224 JR NZ, INITU3 ;NO-
S 0225 LD A, (PWARM) ;HOW ABOUT THIS ONE?
PE061 F4C300 0226 CP 0C3H
L 0227 JR NZ, INITU3
S 0228 DEC D
PE064 F2E4E5 0229 JP PROMP1
L 0230 INITU3: LD HL, HEDING ;POINT MSG
E067 CDE8E0 0231 CALL MSGOUT
L 0232 LD DE, (RAMTOP)
E06A CDFDE0 0233 CALL ADDOUT ;PRINT RAM TOP
L 0234 LD HL, HEAD2
E06D CDE8E0 0235 CALL MSGOUT ;FINISH
VE070 56 0236 PUSH IY ;PUT STACK
VE071 76 0237 POP DE ; IN DE
L 0236 DEC DE ;ADJUST
E072 CDFDE0 0239 CALL ADDOUT ;PRINT IT
L 0240 LD HL, HEAD3 ;LAST ONE
E075 CDE8E0 0241 CALL MSGOUT
0242 ;
0243 ; WARM START ENTRY POINT
0244 ;
E078 = 0245 INITW: EQU $
E078 CDE0E0 0246 CALL GETIY ;GO GET A VALID IY FROM RA
0248 ;
0249 ;
0250 ;
0251 ; BEGINNING OF MAIN PROGRAM
0252 ;
0253 ;
0254 ;
0255 ;
0256 ;
E07B = 0257 START: EQU $ ;START MAINLINE
S 0258 LD SP, IY ;REDO STACK
PE07B CD0DE1 0259 CALL CRLF ;FRESH LINE
S 0260 LD A, (IY+PROMPT) ;LOAD PROMPT
PE07E CD3CE0 0261 CALL CHROUT ;& OUT
E081 CD9CE0 0262 CALL LINEIN ;GET A LINE
VE084 56 0263 PUSH IY ;MOVE IY
VE085 76 0264 POP HL ; TO HL
E086 CD29E1 0265 CALL SCAN ;SKIP DELIMS
SE089 F2B9E6 0266 JP Z, ERRCMD ;UH-OH NONE!
L 0267 LD IX, TABLE ;POINT CMD TBL
VE08C 76 0268 MAIN1: PUSH HL ;SAVE 'EM
VE08D 76 0269 PUSH IX
S 0270 LD B, 2 ;CHECK 2 CHRS
L 0271 MAIN2: LD A, (IX) ;LOAD FRM TABLE
PE08E F49FE6 0272 CP (HL) ;COMPARE?
L 0273 JR NZ, MAIN4 ;NO-TRY NEXT
L 0274 INC HL ;CHECK NEXT CHR
L 0273 INC IX
L 0276 DJNZ MAIN2 ;LOOP FOR 2
VE091 76 0277 POP DE ;CLEAR STACK
VE092 76 0278 POP DE ;I/O PNTR
L 0279 LD BC, START ;PUSH RETURN
VE093 56 0280 PUSH BC
L 0281 MAIN3: LD L, (IX) ;LOAD
L 0282 LD H, (IX+1) ; JUMP
PE094 F29FE6 0283 JP (HL) ; ADDRESS
VE097 76 0284 MAIN4: POP IX ;RESET
VE098 76 0285 POP HL ; POINTERS
L 0286 INC IX ;NEXT ENTRY
L 0287 INC IX ; IN
L 0288 INC IX ; TABLE
L 0289 INC IX
S 0290 LD A, (IX) ;IS IT
S 0291 OR A ; THE END?
L 0292 JR NZ, MAIN1 ;NO-CONTINUE
L 0293 ERRCMD: LD HL, IVCMSG
E099 F2FDE0 0294 JP WHAT
0296 ;
Bookmarks