0000- 10 ; .TF SCIOS_Version_2.bin,BIN ; object file 0000- 11 .TF SCIOS_version_2.hex,INT ; Intel hex file 0000- 12 ; 0F00- 13 RAM .EQ $0F00 0D00- 14 DISPLY .EQ $0D00 0000- 15 ; 0000- 16 ; RAM Offsets 0000- 17 ; 0000- 18 DL .EQ 0 ; Segment for digit 1 0001- 19 DH .EQ 1 ; Segment for digit 2 0002- 20 D3 .EQ 2 ; Segment for digit 3 0003- 21 D4 .EQ 3 ; Segment for digit 4 0004- 22 ADLL .EQ 4 ; Segment for digit 5 0005- 23 ADLH .EQ 5 ; Segment for digit 6 0006- 24 ADHL .EQ 6 ; Segment for digit 7 0007- 25 ADHH .EQ 7 ; Segment for digit 8 0008- 26 D9 .EQ 8 ; Segment for digit 9 0009- 27 CNT .EQ 9 ; Counter 000A- 28 PUSHED .EQ 10 ; Key Pushed 000B- 29 CHAR .EQ 11 ; Char Read 000C- 30 ADL .EQ 12 ; Memory Address Low 000D- 31 WORD .EQ 13 ; Memory Word 000E- 32 ADH .EQ 14 ; Memory High 000F- 33 DDTA .EQ 15 ; First Flag 0010- 34 ROW .EQ 16 ; Row Counter 0011- 35 NEXT .EQ 17 ; Flag for now data 0000- 36 ; 0000- 37 ; RAM Pointers used by SCIOS, P3 is saved elsewhere 0000- 38 ; 0FF9- 39 P1H .EQ $0FF9 0FFA- 40 P1L .EQ $0FFA 0FFB- 41 P2H .EQ $0FFB 0FFC- 42 P2L .EQ $0FFC 0FFD- 43 A .EQ $0FFD 0FFE- 44 EE .EQ $0FFE ('E' is a reserved word) 0FFF- 45 S .EQ $0FFF 0000- 46 ; 0000- 47 ; Monitor Operation Summary 0000- 48 ; 0000- 49 ; Initially in 'Address Entry' Mode 0000- 50 ; 0000- 51 ; TERM: 0000- 52 ; Change to 'Data Entry' Mode 0000- 53 ; 0000- 54 ; MEM: 0000- 55 ; Increment Memory Address 0000- 56 ; 0000- 57 ; GO: 0000- 58 ; The registers are loaded from RAM and program 0000- 59 ; is transferred using XPPC P3. 0000- 60 ; To get back do XPPC P3. 0000- 61 ; 0000- 62 .OR $0000 ; set origin 0000- 63 ; 0000- 64 ; Monitor Listing 0000- 65 ; Source file: scios_version_2.asm *** Warning: Instruction starts at page boundary 66 HALT ; zeros displayed on reset 0000-00 66 ( 8) HALT ; zeros displayed on reset 0001-CF FF 67 ( 18) ST @-1(3) ; SO P3=-1 0003- 68 ; 0003-90 1E 69 ( 11) JMP START 0005- 70 ; 0005- 71 ; Debug Exit 0005- 72 ; Restore Environment 0005- 73 ; 0005-37 74 ( 8) GOOUT: XPAH 3 0006-C2 0C 75 ( 18) LD ADL(2) 0008-33 76 ( 8) XPAL 3 0009-C7 FF 77 ( 18) LD @-1(3) ; fix go address 000B-C0 F2 78 ( 18) LD EE 000D-01 79 ( 7) XAE ; restore registers 000E-C0 EB 80 ( 18) LD P1L 0010-31 81 ( 8) XPAL 1 0011-C0 E7 82 ( 18) LD P1H 0013-35 83 ( 8) XPAH 1 0014-C0 E7 84 ( 18) LD P2L 0016-32 85 ( 8) XPAL 2 0017-C0 E3 86 ( 18) LD P2H 0019-36 87 ( 8) XPAH 2 001A-C0 E4 88 ( 18) LD S 001C-00 89 ( 8) HALT ; reset single step 001D-07 90 ( 6) CAS 001E-C0 DE 91 ( 18) LD A 0020-08 92 ( 5) NOP 0021-05 93 ( 6) IEN 0022-3F 94 ( 7) XPPC 3 0023- 95 ; Entry Point for Debug 0023-C8 D9 96 ( 18) START: ST A 0025-40 97 ( 6) LDE 0026-C8 D7 98 ( 18) ST EE 0028-06 99 ( 5) CSA 0029-C8 D5 100 ( 18) ST S 002B-35 101 ( 8) XPAH 1 002C-C8 CC 102 ( 18) ST P1H 002E-31 103 ( 8) XPAL 1 002F-C8 CA 104 ( 18) ST P1L 0031-C4 0F 105 ( 10) LDI /RAM ; point P2 to RAM 0033-36 106 ( 8) XPAH 2 0034-C8 C6 107 ( 18) ST P2H 0036-C4 00 108 ( 10) LDI #RAM 0038-32 109 ( 8) XPAL 2 0039-C8 C2 110 ( 18) ST P2L 003B-C7 01 111 ( 18) LD @1(3) ; bump P3 for return 003D-33 112 ( 8) XPAL 3 ; save P3 003E-CA 0C 113 ( 18) ST ADL(2) 0040-37 114 ( 8) XPAH 3 0041-CA 0E 115 ( 18) ST ADH(2) 0043-C4 00 116 ( 10) LDI 0 0045-CA 02 117 ( 18) ST D3(2) 0047-CA 03 118 ( 18) ST D4(2) 0049-C4 01 119 ( 10) LDI 1 004B-37 120 ( 8) XPAH 3 004C-90 6D 121 ( 11) ABORT: JMP MEM 004E-C2 0E 122 ( 18) GONOW: LD ADH(2) 0050-90 B3 123 ( 11) JMP GOOUT 0052- 124 ; 0052- 125 ; Tape Interface Routines 0052- 126 ; FFFFFFD5- 127 COUNT .EQ -43 ($D5) FFFFFFD6- 128 LEN .EQ -42 ($D6) 0052- 129 ; 0052- 130 ; Store To Tape = $0052 0052- 131 ; 0052-C5 01 132 ( 18) TOTAPE: LD @1(1) 0054-01 133 ( 7) XAE 0055-C4 01 134 ( 10) LDI 1 0057-CB D5 135 ( 18) NXT: ST COUNT(3) 0059-C4 01 136 ( 10) LDI 1 005B-07 137 ( 6) CAS 005C-8F 08 138 ( 13+) DLY 8 005E-C3 D5 139 ( 18) LD COUNT(3) 0060-50 140 ( 6) ANE 0061-98 07 141 (9/11) JZ ZERO 0063-8F 18 142 ( 13+) DLY $018 0065-C4 00 143 ( 10) LDI 0 0067-07 144 ( 6) CAS 0068-90 05 145 ( 11) JMP DONE 006A-C4 00 146 ( 10) ZERO: LDI 0 006C-07 147 ( 6) CAS 006D-8F 18 148 ( 13+) DLY $018 006F-8F 20 149 ( 13+) DONE: DLY $020 0071-C3 D5 150 ( 18) LD COUNT(3) 0073-F3 D5 151 ( 19) ADD COUNT(3) 0075-9C E0 152 (9/11) JNZ NXT 0077-BB D6 153 ( 22) DLD LEN(3) 0079-9C D7 154 (9/11) JNZ TOTAPE 007B-3F 155 ( 7) XPPC 3 007C- 156 ; 007C- 157 ; Load From Tape = 0007C 007C- 158 ; 007C-C4 08 159 ( 10) FRTAPE: LDI 8 007E-CB D5 160 ( 18) ST COUNT(3) 0080-06 161 ( 5) LOOP: CSA 0081-D4 20 162 ( 10) ANI $20 0083-98 FB 163 (9/11) JZ LOOP 0085-8F 1C 164 ( 13+) DLY $01C 0087-19 165 ( 5) SIO 0088-8F 1C 166 ( 13+) DLY $01C 008A-BB D5 167 ( 22) DLD COUNT(3) 008C-9C F2 168 (9/11) JNZ LOOP 008E-40 169 ( 6) LDE 008F-CD 01 170 ( 18) ST @1(1) 0091-90 E9 171 ( 11) JMP FRTAPE 0093- 172 ; 0093- 173 ; Offset Calculation = 0093 0093- 174 ; 0093-C6 FE 175 ( 18) OFFSET: LD @-2(2) ; subtract 2 from destination address 0095-32 176 ( 8) XPAL 2 ; put low byte in AC 0096-03 177 ( 5) SCL ; set carry for subtraction 0097-FB D8 178 ( 20) CAD -40(3) ; subtract low byte of jump instruction address ($D8) 0099-C9 01 179 ( 18) ST +1(1) ; Put in jump operand 009B-3F 180 ( 7) XPPC 3 ; return to monitor 009C-08 181 ( 5) NOP 009D-AA 0E 182 ( 22) DTACK: ILD ADH(2) 009F-90 36 183 ( 11) JMP DATA 00A1-C2 0E 184 ( 18) MEMDN: LD ADH(2) ; put word in memory 00A3-35 185 ( 8) XPAH 1 00A4-C2 0C 186 ( 18) LD ADL(2) 00A6-31 187 ( 8) XPAL 1 00A7-C2 0D 188 ( 18) LD WORD(2) 00A9-C9 00 189 ( 18) ST (1) 00AB-90 34 190 ( 11) JMP DATACK 00AD-E4 06 191 ( 10) MEMCK: XRI $06 ; check for GO 00AF-98 9D 192 (9/11) JZ GONOW 00B1-E4 05 193 ( 10) XRI $05 ; check for TERM 00B3-98 22 194 (9/11) JZ DATA ; check if done 00B5-AA 0C 195 ( 22) ILD ADL(2) ; update address low 00B7-9C 1E 196 (9/11) JNZ DATA 00B9-90 E2 197 ( 11) JMP DTACK 00BB- 198 ; Mem Key Pushed 00BB-C4 FF 199 ( 10) MEM: LDI -1 00BD-CA 11 200 ( 18) ST NEXT(2) ; set first flag 00BF-CA 0F 201 ( 18) ST DDTA(2) ; set flag for address now 00C1-C2 0E 202 ( 18) MEML: LD ADH(2) 00C3-35 203 ( 8) XPAH 1 ; set P1 for memory address 00C4-C2 0C 204 ( 18) LD ADL(2) 00C6-31 205 ( 8) XPAL 1 00C7-C1 00 206 ( 18) LD (1) 00C9-CA 0D 207 ( 18) ST WORD(2) ; save memory data 00CB-C4 3F 208 ( 10) LDI #DISPD-1 ; fix data segment 00CD-33 209 ( 8) XPAL 3 00CE-3F 210 ( 7) XPPC 3 ; go to DISPD set segment for data 00CF-90 DC 211 ( 11) JMP MEMCK ; command return 00D1-C4 1A 212 ( 10) LDI #ADR-1 ; make address 00D3-33 213 ( 8) XPAL 3 00D4-3F 214 ( 7) XPPC 3 00D5-90 EA 215 ( 11) JMP MEML ; get next character 00D7-C4 FF 216 ( 10) DATA: LDI -1 ; set first flag 00D9-CA 0F 217 ( 18) ST DDTA(2) 00DB-C2 0E 218 ( 18) LD ADH(2) ; set P1 to memory address 00DD-35 219 ( 8) XPAH 1 00DE-C2 0C 220 ( 18) LD ADL(2) 00E0-31 221 ( 8) XPAL 1 00E1-C1 00 222 ( 18) DATACK: LD (1) ; read data word 00E3-CA 0D 223 ( 18) ST WORD(2) ; save for display 00E5-C4 3F 224 ( 10) DATAL: LDI #DISPD-1 ; fix data segment 00E7-33 225 ( 8) XPAL 3 00E8-3F 226 ( 7) XPPC 3 ; fix data segment-GO to DISPD 00E9-90 C2 227 ( 11) JMP MEMCK ; character return 00EB-C4 04 228 ( 10) LDI 4 ; set counter for number of shifts 00ED-CA 09 229 ( 18) ST CNT(2) 00EF-AA 0F 230 ( 22) ILD DDTA(2) ; check if first 00F1-9C 06 231 (9/11) JNZ DNFST 00F3-C4 00 232 ( 10) LDI 0 ; zero word if first 00F5-CA 0D 233 ( 18) ST WORD(2) 00F7-CA 11 234 ( 18) ST NEXT(2) ; set flag for address done 00F9-02 235 ( 5) DNFST: CCL 00FA-C2 0D 236 ( 18) LD WORD(2) ; shift left 00FC-F2 0D 237 ( 19) ADD WORD(2) 00FE-CA 0D 238 ( 18) ST WORD(2) 0100-BA 09 239 ( 22) DLD CNT(2) ; check for 4 shifts 0102-9C F5 240 (9/11) JNZ DNFST 0104-C2 0D 241 ( 18) LD WORD(2) ; add new data 0106-58 242 ( 6) ORE 0107-CA 0D 243 ( 18) ST WORD(2) 0109-90 96 244 ( 11) JMP MEMDN 010B- 245 ; Segment Assignments 0001- 246 SA .EQ 1 0002- 247 SB .EQ 2 0004- 248 SC .EQ 4 0008- 249 SD .EQ 8 0010- 250 SE .EQ 16 0020- 251 SF .EQ 32 0040- 252 SG .EQ 64 010B- 253 ; 'Hex Number to Seven Segment Table' 010B-3F 254 CROM: .DB SA+SB+SC+SD+SE+SF 010C-06 255 .DB SB+SC 010D-5B 256 .DB SA+SB+SD+SE+SG 010E-4F 257 .DB SA+SB+SC+SD+SG 010F-66 258 .DB SB+SC+SF+SG 0110-6D 259 .DB SA+SC+SD+SF+SG 0111-7D 260 .DB SA+SC+SD+SE+SF+SG 0112-07 261 .DB SA+SB+SC 0113-7F 262 .DB SA+SB+SC+SD+SE+SF+SG 0114-67 263 .DB SA+SB+SC+SF+SG 0115-77 264 .DB SA+SB+SC+SE+SF+SG 0116-7C 265 .DB SC+SD+SE+SF+SG 0117-39 266 .DB SA+SD+SE+SF 0118-5E 267 .DB SB+SC+SD+SE+SG 0119-79 268 .DB SA+SD+SE+SF+SG 011A-71 269 .DB SA+SE+SF+SG 011B- 270 ; 'Make 4 Digit Address' 011B- 271 ; Shift address left one digit then add new low hex 011B- 272 ; digit, hex digit in E register, P2 points to RAM 011B-C4 04 273 ( 10) ADR: LDI 4 ; set number of shifts 011D-CA 09 274 ( 18) ST CNT(2) 011F-AA 0F 275 ( 22) ILD DDTA(2) ; check if first) 0121-9C 06 276 (9/11) JNZ NOTFST ; jump if no 0123-C4 00 277 ( 10) LDI 0 ; zero address 0125-CA 0E 278 ( 18) ST ADH(2) 0127-CA 0C 279 ( 18) ST ADL(2) 0129-02 280 ( 5) NOTFST: CCL ; clear link 012A-C2 0C 281 ( 18) LD ADL(2) ; shift address left 4 times 012C-F2 0C 282 ( 19) ADD ADL(2) 012E-CA 0C 283 ( 18) ST ADL(2) ; save it 0130-C2 0E 284 ( 18) LD ADH(2) ; now shift high 0132-F2 0E 285 ( 19) ADD ADH(2) 0134-CA 0E 286 ( 18) ST ADH(2) 0136-BA 09 287 ( 22) DLD CNT(2) ; check if shifted 4 times 0138-9C EF 288 (9/11) JNZ NOTFST ; jump if not done 013A-C2 0C 289 ( 18) LD ADL(2) ; now add new number 013C-58 290 ( 6) ORE 013D-CA 0C 291 ( 18) ST ADL(2) ; number is now updated 013F-3F 292 ( 7) XPPC 3 0140- 293 ; 'Data to Segments' 0140- 294 ; Convert hex data to segments, P2 points to RAM, drops through to hex conversion 0140-C4 01 295 ( 10) DISPD: LDI /CROM ; set address of table 0142-35 296 ( 8) XPAH 1 0143-C4 0B 297 ( 10) LDI #CROM 0145-31 298 ( 8) XPAL 1 0146-C2 0D 299 ( 18) LD WORD(2) ; get memory word 0148-D4 0F 300 ( 10) ANI $0F 014A-01 301 ( 7) XAE 014B-C1 80 302 ( 18) LD -128(1) ; get segment display 014D-CA 00 303 ( 18) ST DL(2) ; save at data low 014F-C2 0D 304 ( 18) LD WORD(2) ; fix high 0151-1C 305 ( 5) SR ; shift high to low 0152-1C 306 ( 5) SR 0153-1C 307 ( 5) SR 0154-1C 308 ( 5) SR 0155-01 309 ( 7) XAE 0156-C1 80 310 ( 18) LD -128(1) ; get segments 0158-CA 01 311 ( 18) ST DH(2) ; save in data high 015A- 312 ; 'Address to Segments' 015A- 313 ; P2 points to RAM, drops through to keyboard and display 015A-03 314 ( 5) DISPA: SCL 015B-C4 01 315 ( 10) LDI /CROM ; set address of table 015D-35 316 ( 8) XPAH 1 015E-C4 0B 317 ( 10) LDI #CROM 0160-31 318 ( 8) XPAL 1 0161-C2 0C 319 ( 18) LOOPD: LD ADL(2) ; get address 0163-D4 0F 320 ( 10) ANI $0F 0165-01 321 ( 7) XAE 0166-C1 80 322 ( 18) LD -128(1) ; get segments 0168-CA 04 323 ( 18) ST ADLL(2) ; save segment of ADR LL 016A-C2 0C 324 ( 18) LD ADL(2) 016C-1C 325 ( 5) SR ; shift high digit to low 016D-1C 326 ( 5) SR 016E-1C 327 ( 5) SR 016F-1C 328 ( 5) SR 0170-01 329 ( 7) XAE 0171-C1 80 330 ( 18) LD -128(1) ; get segments 0173-CA 05 331 ( 18) ST ADLH(2) 0175-06 332 ( 5) CSA ; check if done 0176-D4 80 333 ( 10) ANI $080 0178-98 09 334 (9/11) JZ DONEB 017A-02 335 ( 5) CCL ; clear flag 017B-C4 00 336 ( 10) LDI 0 017D-CA 03 337 ( 18) ST D4(2) ; zero digit 4 017F-C6 02 338 ( 18) LD @2(2) ; fix P2 for next loop 0181-90 DE 339 ( 11) JMP LOOPD 0183-C6 FE 340 ( 18) DONEB: LD @-2(2) ; fix P2 0185- 341 ; 'Display and Keyboard Input' 0185- 342 ; Call XPPC 3 0185- 343 ; Jump command in A GO=6, MEM=7,TERM=3 0185- 344 ; in E GO=22, MEM=23, TERM=27 0185- 345 ; Number return hex number in E register 0185- 346 ; Abort key goes to abort 0185- 347 ; All registers are used 0185- 348 ; P2 must point to RAM, address must be XXX0 0185- 349 ; To re-execute routine do XPPC3 0185-C4 00 350 ( 10) KYBD: LDI 0 ; zero character 0187-CA 0B 351 ( 18) ST CHAR(2) 0189-C4 0D 352 ( 10) LDI /DISPLY ; set display address 018B-35 353 ( 8) XPAH 1 018C-C4 FF 354 ( 10) OFF: LDI -1 ; set row/digit address 018E-CA 10 355 ( 18) ST ROW(2) ; save row counter 0190-C4 0A 356 ( 10) LDI 10 ; set row counter 0192-CA 09 357 ( 18) ST CNT(2) 0194-C4 00 358 ( 10) LDI 0 0196-CA 0A 359 ( 18) ST PUSHED(2) ; zero keyboard input 0198-31 360 ( 8) XPAL 1 ; set display address low 0199-AA 10 361 ( 22) LOOPB: ILD ROW(2) ; update row address 019B-01 362 ( 7) XAE 019C-C2 80 363 ( 18) LD -128(2) ; get segment 019E-C9 80 364 ( 18) ST -128(1) ; send it 01A0-8F 00 365 ( 13+) DLY 0 ; delay for display 01A2-C1 80 366 ( 18) LD -128(1) ; get keyboard input 01A4-E4 FF 367 ( 10) XRI $FF ; check if pushed 01A6-9C 4C 368 (9/11) JNZ KEY ; jump if pushed 01A8-BA 09 369 ( 22) BACK: DLD CNT(2) ; check if done 01AA-9C ED 370 (9/11) JNZ LOOPB ; no if jump 01AC-C2 0A 371 ( 18) LD PUSHED(2) ; check if key 01AE-98 0A 372 (9/11) JZ CKMORE 01B0-C2 0B 373 ( 18) LD CHAR(2) ; was there a character ? 01B2-9C D8 374 (9/11) JNZ OFF ; yes wait for release 01B4-C2 0A 375 ( 18) LD PUSHED(2) ; no set character 01B6-CA 0B 376 ( 18) ST CHAR(2) 01B8-90 D2 377 ( 11) JMP OFF 01BA-C2 0B 378 ( 18) CKMORE: LD CHAR(2) 01BC-98 CE 379 (9/11) JZ OFF 01BE- 380 ; Command Key Processing 01BE-01 381 ( 7) COMAND: XAE ; save character 01BF-40 382 ( 6) LDE ; get character 01C0-D4 20 383 ( 10) ANI $020 ; check for command 01C2-9C 28 384 (9/11) JNZ CMND ; jump if command 01C4-C4 80 385 ( 10) LDI $080 ; find number 01C6-50 386 ( 6) ANE 01C7-9C 1B 387 (9/11) JNZ LT7 ; 0 to 7 01C9-C4 40 388 ( 10) LDI $040 01CB-50 389 ( 6) ANE 01CC-9C 19 390 (9/11) JNZ N89 ; 8 or 9 01CE-C4 0F 391 ( 10) LDI $0F 01D0-50 392 ( 6) ANE 01D1-F4 07 393 ( 11) ADI $7 ; make offset to table 01D3-01 394 ( 7) XAE ; put offset away 01D4-C0 80 395 ( 18) LD -128(0) ; get number 01D6-01 396 ( 7) KEYRTN: XAE ; save in E 01D7-C7 02 397 ( 18) LD @2(3) ; fix return 01D9-3F 398 ( 7) XPPC 3 ; return 01DA-90 A9 399 ( 11) JMP KYBD ; allows XPPC P3 to return 01DC-0A 0B 0C 0D 00 00 0E 0F 400 .DB $0A,$0B,$0C,$0D,$0,$0,$0E,$0F 01E4-60 401 ( 6) LT7: XRE ; keep low digit 01E5-90 EF 402 ( 11) JMP KEYRTN 01E7-60 403 ( 6) N89: XRE ; get low 01E8-F4 08 404 ( 11) ADI $08 ; make digit 8 or 9 01EA-90 EA 405 ( 11) JMP KEYRTN 01EC-60 406 ( 6) CMND: XRE 01ED-E4 04 407 ( 10) XRI $04 ; check if abort 01EF-98 08 408 (9/11) JZ ABRT ; abort 01F1-3F 409 ( 7) XPPC 3 ; in E 23=MEM, 22=GO, 27=TERM 01F2- 410 ; in A 7=MEM, 6=GO, 3=TERM 01F2-90 91 411 ( 11) JMP KYBD ; allows just a XPPC P3 to return 01F4-58 412 ( 6) KEY: ORE ; make character 01F5-CA 0A 413 ( 18) ST PUSHED(2) ; save character 01F7-90 AF 414 ( 11) JMP BACK 01F9-C4 00 415 ( 10) ABRT: LDI \ABORT 01FB-37 416 ( 8) XPAH 3 01FC-C4 4B 417 ( 10) LDI #ABORT-1 01FE-33 418 ( 8) XPAL 3 01FF-3F 419 ( 7) XPPC 3 ; go to abort 0200- 420 .END