[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:08:13 SYS5 - LS-DOS 6.2 Page 00001 00001 ;SYS5/ASM - LS-DOS 6.2 00003 *LIST OFF ;Get SYS0/EQU 00319 *LIST ON 00320 ; 0000 00321 *GET SYS5A:3 00322 ;SYS5A/ASM - LS-DOS 6.2 00323 ; 00A0 00324 ORG 0A0H 00325 ; 00326 ; References to save area in lowcore 00327 ; 00A0 00328 SAVONE DS 1 00A1 00329 SAVTWO DS 1 00A2 00330 DS 1 ;Space for saved byte (1) 00A3 00331 NXTADR DS 2 00A5 00332 NXTBYT DS 1 00A6 00333 DSPADR DS 2 00A8 00334 AFREG DS 2 ;AF Register save area 00AA 00335 DS 2 ;BC 00AC 00336 DS 2 ;DE 00AE 00337 HLREG DS 2 ;HL 00B0 00338 DS 8 ;AF', BC', DE', HL' 00B8 00339 IXREG DS 2 ;IX 00BA 00340 IYREG DS 2 ;IY 00BC 00341 SPREG DS 1 ;SP 00BD 00342 REGSAV DS 1 00BE 00343 PCREG DS 2 ;PC 00344 IF @BLD631 00346 ELSE 00347 COM '<*(C) 1986,LSI>' 00348 ; 00349 ;Special patch insertion 00350 ; 00351 ORG 23BDH 00352 ; 00353 @PRTBYT PUSH AF ;Print a byte routine 00354 CALL @PRT ; to support SYS9 00355 POP AF 00356 RET 00357 ENDIF 00358 ; 1E00 00359 ORG 1E00H 00360 ; 1E00 E670 00361 SYS5 AND 70H ;If entry = 0, return 1E02 C8 00362 RET Z 1E03 F1 00363 POP AF ;Discard return to SYS0 1E04 F1 00364 POP AF ;Get original reg-AF 1E05 F5 00365 PUSH AF 1E06 FDE5 00366 PUSH IY ;Save remaining regs 1E08 DDE5 00367 PUSH IX 1E0A 08 00368 EX AF,AF' 1E0B D9 00369 EXX 1E0C E5 00370 PUSH HL 1E0D D5 00371 PUSH DE 1E0E C5 00372 PUSH BC 1E0F F5 00373 PUSH AF 1E10 08 00374 EX AF,AF' 1E11 D9 00375 EXX 1E12 E5 00376 PUSH HL 1E13 D5 00377 PUSH DE 1E14 C5 00378 PUSH BC 1E15 F5 00379 PUSH AF 1E16 210000 00380 LD HL,0 1E19 39 00381 ADD HL,SP ;Place SP address into HL 1E1A 11A800 00382 LD DE,AFREG 1E1D 011800 00383 LD BC,24 ;Move the 24 bytes saved 1E20 EDB0 00384 LDIR 1E22 22BC00 00385 LD (SPREG),HL 1E25 F9 00386 LD SP,HL 1E26 2ABE00 00387 LD HL,(PCREG) 1E29 2B 00388 DEC HL 1E2A 7E 00389 LD A,(HL) ;P/u the byte at PC 1E2B FEF7 00390 CP 0F7H ; & check for breakpoint 1E2D 2003 00391 JR NZ,$?1 ;Go if not a breakpoint 1E2F 22BE00 00392 LD (PCREG),HL 00393 ; 00394 ; This next routine picks up the data stored in the 00395 ; instruction storage areas used to hold the 00396 ; address & byte of the inserted RST's used to 00397 ; control the single step mode. If the address 00398 ; save area is zero, then an RST was not inserted. 00399 ; Two areas are needed because DEBUG inserts 00400 ; RST 48's at both CALL origin & destination. 00401 ; 1E32 21A000 00402 $?1 LD HL,SAVONE 1E35 0602 00403 LD B,2 ;Set up loop for 2 areas 1E37 AF 00404 $?2 XOR A ;Clear register A & flags 1E38 5E 00405 LD E,(HL) ;P/u the next 2 bytes 1E39 77 00406 LD (HL),A ; (where an address 1E3A 23 00407 INC HL ; would be stored) while 1E3B 56 00408 LD D,(HL) ; simultaneously setting 1E3C 77 00409 LD (HL),A ; the save area to zero 1E3D 23 00410 INC HL 1E3E 7B 00411 LD A,E ;Ck if the area was zero 1E3F B2 00412 OR D 1E40 2807 00413 JR Z,$?3 ;If zero, no RST entry 1E42 1A 00414 LD A,(DE) ;Address save <> zero, 1E43 FEF7 00415 CP 0F7H ; ck byte for RST 48 1E45 2002 00416 JR NZ,$?3 1E47 7E 00417 LD A,(HL) ; Was RST 48, restore 1E48 12 00418 LD (DE),A ; the program byte 1E49 23 00419 $?3 INC HL 1E4A 10EB 00420 DJNZ $?2 ;Loop thru 2 save areas 1E4C ED7BBC00 00421 CMND LD SP,(SPREG) ;Set up the stack 1E50 CDD51E 00422 CALL WRREGS ; & display normal CRT 1E53 210010 00423 LD HL,16<8!0 ;Move cursor to 16,0 1E56 0603 00424 LD B,3 ;Command 1E58 3E0F 00425 LD A,15 ;Svc @VDCTL 1E5A EF 00426 RST 28H ;Set cursor 1E5B CDC921 00427 CALL INPUT@ ;Get command 1E5E FE67 00428 CP 'g' ;Goto AAAA,(BBBB(,CCCC)) 1E60 CA821F 00429 JP Z,CMD_G 1E63 214C1E 00430 LD HL,CMND ;Set up a return branch 1E66 E5 00431 PUSH HL 1E67 FE73 00432 CP 's' ;Set CRT to full screen? 1E69 2832 00433 JR Z,CMD_S 1E6B FE3B 00434 CP ';' ;Inc CRT one page? 1E6D 2842 00435 JR Z,CMD_INC 1E6F FE2D 00436 CP '-' ;Dec CRT one page? 1E71 2856 00437 JR Z,CMD_DEC 1E73 FE6F 00438 CP 'o' ;Out to DOS 1E75 2857 00439 JR Z,CMD_O 1E77 FE63 00440 CP 'c' ;Single step with CALL? 1E79 2806 00441 JR Z,CMD_C 1E7B FE64 00442 CP 'd' ;Display AAAA1E7D 282C 00443 JR Z,CMD_D 1E7F FE69 00444 CP 'i' ;Single step? 1E81 CA8B20 00445 CMD_C JP Z,CMD_CI 1E84 FE61 00446 CP 'a' ;ASCII modify memory? 1E86 CAD61F 00447 JP Z,CMD_AH 1E89 FE68 00448 CP 'h' ;Hex modify memory AAAA? 1E8B CAD61F 00449 JP Z,CMD_AH 1E8E FE72 00450 CP 'r' ;Modify reg pair RP DDDD? 1E90 CA3F20 00451 JP Z,CMD_R 1E93 FE75 00452 CP 'u' ;Dynamic display update? 1E95 280A 00453 JR Z,CMD_U 1E97 FE78 00454 CP 'x' ;Display register format? 1E99 C23F22 00455 JP NZ,BLOCK ;Try extra commands 00456 ; 00457 ; Command X - Normal display mode 00458 ; 1E9C AF 00459 CMD_X XOR A 1E9D 32A100 00460 CMD_S LD (SAVTWO),A ;Show not full screen 1EA0 C9 00461 RET 00462 ; 00463 ; Command U - Continuously update display 00464 ; 1EA1 CD3506 00465 CMD_U CALL @KBD ;Scan keyboard 1EA4 B7 00466 OR A ;Character entered? 1EA5 C0 00467 RET NZ ;Return to CMND if so 1EA6 CDD51E 00468 CALL WRREGS ; else refresh display 1EA9 18F6 00469 JR CMD_U ; & loop 00470 ; 00471 ; Command D - Display memory at address NNNN 00472 ; 1EAB CDE421 00473 CMD_D CALL HEXIN@ 1EAE C8 00474 RET Z ;Ret to CMND if no char 1EAF 1814 00475 JR $?6 ; else set DSPADR to 00476 ; new address in HL 00477 ; 00478 ; Command ; - Increment memory display one block 00479 ; 1EB1 014000 00480 CMD_INC LD BC,64 ;Init for 64-byte block 1EB4 2AA600 00481 $?4 LD HL,(DSPADR) ;P/u current display addr 1EB7 3AA100 00482 LD A,(SAVTWO) ; =0 -> Normal disp mode 00483 ;<>0 -> Full disp mode 1EBA B7 00484 OR A 1EBB 2807 00485 JR Z,$?5 1EBD 0E00 00486 LD C,0 ;Zero out low order to 00487 ; provide inc or dec of 00488 ; 256 bytes (full disp) 1EBF 78 00489 LD A,B ;B=00 -> inc 1 page, 1EC0 B7 00490 OR A ; make BC = 256 1EC1 2001 00491 JR NZ,$?5 ;B=FF -> Dec 1 page, 1EC3 04 00492 INC B ; just add 1EC4 09 00493 $?5 ADD HL,BC ;HL now points to 1EC5 22A600 00494 $?6 LD (DSPADR),HL ; new display address 1EC8 C9 00495 RET 00496 ; 00497 ; Command - - Decrement memory display 1 block 00498 ; 1EC9 01C0FF 00499 CMD_DEC LD BC,0FFC0H ;Init to 64-byte dec 1ECC 18E6 00500 JR $?4 00501 ; 00502 ; Command O - Exit to DOS 00503 ; 1ECE CDC921 00504 CMD_O CALL INPUT@ ;Fetch valid terminator 1ED1 D0 00505 RET NC ;Back if bad char 1ED2 C30B1B 00506 JP @EXIT ;Else exit to DOS 00507 ; 00508 ; Register display routine 00509 ; 00510 WRREGS 1ED5 3E1C 00511 LD A,1CH ;Home the cursor 1ED7 CD4206 00512 CALL @DSP 00513 IF @MOD4 1EDA 3E0F 00514 LD A,15 ;Turn off the cursor 1EDC CD4206 00515 CALL @DSP 00516 ENDIF 1EDF 3AA100 00517 LD A,(SAVTWO) ;0 = Normal display mode 1EE2 B7 00518 OR A ;<> 0 = Full display mode 1EE3 2068 00519 JR NZ,FULDSP ;No reg display if FULL 1EE5 21A800 00520 LD HL,AFREG ;Pt to register save area 1EE8 E5 00521 PUSH HL 1EE9 21561F 00522 LD HL,REGTBL ;Pt to reg symbol table 1EEC 060C 00523 LD B,12 ;Init for 12 registers 1EEE CD3522 00524 $?8 CALL WR3BYT ;Write 3-character symbol 1EF1 E3 00525 EX (SP),HL ;Exchange reg save ptr 1EF2 5E 00526 LD E,(HL) ;Place reg value -> DE 1EF3 23 00527 INC HL 1EF4 56 00528 LD D,(HL) 1EF5 23 00529 INC HL ;Place next reg save 1EF6 E5 00530 PUSH HL ; pointer on the stack 1EF7 EB 00531 EX DE,HL ;Reg value -> HL 1EF8 3E3D 00532 LD A,'=' 1EFA CD4206 00533 CALL @DSP 1EFD CD3122 00534 CALL WRSPA@ 1F00 7C 00535 LD A,H ;Write hi-order byte 1F01 CD2E22 00536 CALL WRHEX 1F04 7D 00537 LD A,L ;Write lo-order byte 1F05 CD2E22 00538 CALL WRHEX 1F08 78 00539 LD A,B ;Get loop counter & 1F09 E60B 00540 AND 0BH ; ck if 12 => AF pair 1F0B FE08 00541 CP 08H ; or if 8 => AF' pair 1F0D 201C 00542 JR NZ,NOFLG ;Bypass if not flag reg 1F0F 4D 00543 LD C,L ;Transfer 'F' reg to C & 1F10 C5 00544 PUSH BC ; save the loop counter 1F11 217A1F 00545 LD HL,FLGTBL ;Pt to flag synbol table 1F14 0608 00546 LD B,8 ;Init for 8 bits 1F16 CB21 00547 $?9 SLA C ;Shift a bit into carry 1F18 7E 00548 LD A,(HL) ;P/u flag table character 1F19 3802 00549 JR C,$?10 ;Use table char if bit on 1F1B 3E2D 00550 LD A,'-' ; else use a dash 1F1D CD4206 00551 $?10 CALL @DSP 1F20 23 00552 INC HL ;Next flag table char 1F21 10F3 00553 DJNZ $?9 ;Loop for 8 flag bits 1F23 C1 00554 POP BC ;Get main loop counter 1F24 3EFD 00555 LD A,61+0C0H ;Tab 60 to put cursor 1F26 CD4206 00556 CALL @DSP ; on next line 1F29 1803 00557 JR $?11 1F2B CD7321 00558 NOFLG CALL WRMEM 1F2E E1 00559 $?11 POP HL ;Get next reg save ptr 1F2F E3 00560 EX (SP),HL ;Exc with next reg symbol 1F30 10BC 00561 DJNZ $?8 ;Loop end 1F32 E1 00562 POP HL ;Get reg save ptr (fini) 1F33 2AA600 00563 LD HL,(DSPADR) ;P/u memory disp address 1F36 0604 00564 LD B,4 ;Init for 4 lines 1F38 3EC6 00565 $?12 LD A,6+0C0H ;Tab 6 spaces 1F3A CD4206 00566 CALL @DSP 1F3D CD1522 00567 CALL WR2HEX@ ;Write the memory address 1F40 CD3122 00568 CALL WRSPA@ 1F43 CD7321 00569 CALL WRMEM ;Write a line of memory 1F46 10F0 00570 DJNZ $?12 ;Loop until 4 or 16 1F48 3E1F 00571 LD A,1FH ;Clear to end-of-frame 1F4A C34206 00572 JP @DSP 1F4D 2AA600 00573 FULDSP LD HL,(DSPADR) ;P/u display address 1F50 2E00 00574 LD L,0 ;Round to multiple of 256 1F52 0610 00575 LD B,16 ;Init for 16 lines 1F54 18E2 00576 JR $?12 00577 ; 00578 ; Register symbol table 00579 ; 1F56 61 00580 REGTBL DB 'af bc de hl af''bc''de''hl''ix iy sp pc ' 66 20 62 63 20 64 65 20 68 6C 20 61 66 27 62 63 27 64 65 27 68 6C 27 69 78 20 69 79 20 73 70 20 70 63 20 00581 ; 00582 ; Flag register bit symbol table 00583 ; 1F7A 53 00584 FLGTBL DB 'SZ1H1PNC' 5A 31 48 31 50 4E 43 00585 ; 00586 ; Command G - Go to memory address NNNN, 00587 ; Optional breakpoints 00588 ; 1F82 0602 00589 CMD_G LD B,2 ;Init for maximum of 1F84 11A500 00590 LD DE,NXTBYT ; two breakpoints 1F87 CDE421 00591 CALL HEXIN@ ;Get exec address 1F8A 2803 00592 JR Z,$?13 ;Go on end 1F8C 22BE00 00593 LD (PCREG),HL ; else save new start 1F8F 380A 00594 $?13 JR C,$?14 ;Go if used 1F91 CDE421 00595 CALL HEXIN@ ;Get a breakpoint 1F94 F5 00596 PUSH AF 1F95 C4C51F 00597 CALL NZ,$?17 ;Set if brkpt entered 1F98 F1 00598 POP AF 1F99 10F4 00599 DJNZ $?13 00600 $?14 1F9B AF 00601 XOR A 1F9C 329F19 00602 LD (@DBGHK),A ;Init DEBUG on 00603 ; 00604 ; This next section of code picks up the register 00605 ; save area, pushes the save area onto the stack, 00606 ; then pops out into the correct reg assignments. 00607 ; 1F9F 21BD00 00608 $?15 LD HL,REGSAV ;End of reg save area 1FA2 060B 00609 LD B,11 ;Init for 11 regs 1FA4 56 00610 $?16 LD D,(HL) 1FA5 2B 00611 DEC HL 1FA6 5E 00612 LD E,(HL) 1FA7 2B 00613 DEC HL 1FA8 D5 00614 PUSH DE 1FA9 10F9 00615 DJNZ $?16 1FAB F1 00616 POP AF ;Now pop the registers 1FAC C1 00617 POP BC 1FAD D1 00618 POP DE 1FAE E1 00619 POP HL 1FAF 08 00620 EX AF,AF' 1FB0 D9 00621 EXX 1FB1 F1 00622 POP AF 1FB2 C1 00623 POP BC 1FB3 D1 00624 POP DE 1FB4 E1 00625 POP HL 1FB5 08 00626 EX AF,AF' 1FB6 D9 00627 EXX 1FB7 DDE1 00628 POP IX 1FB9 FDE1 00629 POP IY 1FBB E1 00630 POP HL 1FBC F9 00631 LD SP,HL 1FBD 2ABE00 00632 LD HL,(PCREG) ;Init the branch address 1FC0 E5 00633 PUSH HL 1FC1 2AAE00 00634 LD HL,(HLREG) 1FC4 C9 00635 RET ;Go to branch 00636 ; 00637 ; This next routine will insert an RST 48 inst into 00638 ; the target of a single-step or breakpoint 00639 ; providing the target address is a RAM location. 00640 ; If it is, the target byte and its address are 00641 ; saved in one of the instruction save areas. 00642 ; If the target address is ROM or nonexistent, a 00643 ; branch to command INPUT routine is taken instead 00644 ; of the pending operation. 00645 ; 1FC5 7E 00646 $?17 LD A,(HL) ;Save byte of next inst 1FC6 12 00647 LD (DE),A 1FC7 1B 00648 DEC DE 1FC8 3EF7 00649 LD A,0F7H ;Insert RST 48 into 1FCA 77 00650 LD (HL),A ; next INST address 1FCB BE 00651 CP (HL) ;Ck if RAM/ROM/no memory 1FCC C2321E 00652 JP NZ,$?1 ;Go to command if not RAM 1FCF 7C 00653 LD A,H ;Is RAM, save address of 1FD0 12 00654 LD (DE),A ; insertion into buffer 1FD1 1B 00655 DEC DE ; pointed to by DE, DE-1 1FD2 7D 00656 LD A,L 1FD3 12 00657 LD (DE),A 1FD4 1B 00658 DEC DE 1FD5 C9 00659 RET 00660 ; 00661 ; Commands A & H - Modify address NNNN to XX 00662 ; increments address 00663 ; 1FD6 32A000 00664 CMD_AH LD (SAVONE),A ;Save entry condition 1FD9 2AA300 00665 LD HL,(NXTADR) ;Default to current mod addr 1FDC CDE421 00666 CALL HEXIN@ 1FDF 22A300 00667 $?18 LD (NXTADR),HL ;Adjust addr for mod 1FE2 D8 00668 RET C ;Return on 1FE3 E5 00669 PUSH HL 1FE4 CDD51E 00670 CALL WRREGS 1FE7 21000D 00671 LD HL,13<8!0 ;Cursor to 13,0 1FEA 0603 00672 LD B,3 1FEC 3E0F 00673 LD A,15 ;SVC @VDCTL set cursor 1FEE EF 00674 RST 28H 1FEF 2AA300 00675 LD HL,(NXTADR) ;P/u mod address again 1FF2 CD1522 00676 CALL WR2HEX@ ;Write the address & save 1FF5 E5 00677 PUSH HL ; the mod addr again 1FF6 21000E 00678 LD HL,14<8!0 ;Cursor to 14,0 1FF9 0603 00679 LD B,3 1FFB 3E0F 00680 LD A,15 ;SVC @VDCTL set cursor 1FFD EF 00681 RST 28H 1FFE E1 00682 POP HL ;Recover mod addr 1FFF CD1320 00683 CALL AHDSP 2002 3E2D 00684 LD A,'-' 2004 CD4206 00685 CALL @DSP 2007 D1 00686 POP DE ;Recover mod addr in DE 2008 CD2920 00687 CALL AHGET 200B EB 00688 EX DE,HL ;Switch mod addr/value 200C 2801 00689 JR Z,$?19 ;Bypass change on 200E 73 00690 LD (HL),E ;Insert new val in memory 200F D8 00691 $?19 RET C ;To CMND on non-digit 2010 23 00692 INC HL ; else increment address 2011 18CC 00693 JR $?18 ; pointer & loop 2013 3AA000 00694 AHDSP LD A,(SAVONE) 2016 FE61 00695 CP 'a' 2018 C21122 00696 JP NZ,WR1HEX@ ;Write (HL) & bump H 201B 7E 00697 DSPASC@ LD A,(HL) ;Else write in ASCII 201C FE20 00698 CP 20H ;Convert non-displayable 201E 3804 00699 JR C,TYP3 ; values to '.' 2020 FEC0 00700 CP 0C0H 2022 3802 00701 JR C,TYP4 2024 3E2E 00702 TYP3 LD A,'.' 2026 C34206 00703 TYP4 JP @DSP 2029 3AA000 00704 AHGET LD A,(SAVONE) 202C FE61 00705 CP 'a' 202E C2E421 00706 JP NZ,HEXIN@ 2031 E5 00707 GETASC@ PUSH HL ;Provide lower/upper 2032 21D621 00708 LD HL,INPUC@+1 ; case entry in type 2035 366F 00709 LD (HL),6FH ; by modifying sys5 code 2037 CDC921 00710 CALL INPUT@ 203A 36EF 00711 LD (HL),0EFH ;Restore the UC -> lc 203C E1 00712 POP HL ; conversion 203D 6F 00713 LD L,A 203E C9 00714 RET 00715 ; 00716 ; Command R - Load register pair RP with NNNN 00717 ; 203F CDC921 00718 CMD_R CALL INPUT@ ;Get 1st symbol char 2042 C8 00719 RET Z ;Return if end 2043 4F 00720 LD C,A ; else save char in C 2044 CDC921 00721 CALL INPUT@ ;Get 2nd symbol char 2047 C8 00722 RET Z ;Return if end 2048 57 00723 LD D,A ; else save char in D 2049 1E20 00724 LD E,' ' ;Init for space 204B CDC921 00725 CALL INPUT@ ;Get 3rd symbol char 204E D8 00726 RET C ;Return on end 204F 2806 00727 JR Z,$?20 ;Bypass if not primed 2051 5F 00728 LD E,A ; else put "'" into E 2052 CDC921 00729 CALL INPUT@ ;Ck for space separator 2055 C0 00730 RET NZ ;Return if none 2056 D8 00731 RET C 2057 21561F 00732 $?20 LD HL,REGTBL ;Register symbol table 205A 060C 00733 LD B,12 ;Init for 12 registers 205C 7E 00734 $?21 LD A,(HL) ;Match first symbol? 205D B9 00735 CP C 205E 2806 00736 JR Z,$?24 ;If a match, test 2nd 2060 23 00737 INC HL ; else pt to next reg 2061 23 00738 $?22 INC HL 2062 23 00739 $?23 INC HL 2063 10F7 00740 DJNZ $?21 ;Loop for 12 regs 2065 C9 00741 RET ;Return if no match 2066 23 00742 $?24 INC HL ;Pt to 2nd table char 2067 7E 00743 LD A,(HL) ; & p/u the symbol 2068 BA 00744 CP D ;Ck the 2nd char input 2069 20F6 00745 JR NZ,$?22 ;-> next if no match 206B 23 00746 INC HL ;Match, ck 3rd reg symbol 206C 7E 00747 LD A,(HL) ;P/u the 3rd table symbol 206D BB 00748 CP E ; & compare with input 206E 20F2 00749 JR NZ,$?23 ;-> next if no match 2070 3E18 00750 LD A,18H ;Convert counter to index 2072 90 00751 SUB B ; into reg save area 2073 90 00752 SUB B 2074 4F 00753 LD C,A ;Index into BC 2075 0600 00754 LD B,0 2077 21A800 00755 LD HL,AFREG ;Start of reg save area 207A 09 00756 ADD HL,BC ;Add index to get pointer 207B E5 00757 PUSH HL ;Save the pointer 207C 3E1E 00758 LD A,1EH ;Erase to end-of-line 207E CD4206 00759 CALL @DSP 2081 D1 00760 POP DE ;Recover pointer 2082 CDE421 00761 CALL HEXIN@ ;Read in the new value 2085 C8 00762 RET Z ;No update if none 2086 EB 00763 EX DE,HL ;Exchg value/pointer 2087 73 00764 LD (HL),E ;Insert new value into 2088 23 00765 INC HL ; register save area 2089 72 00766 LD (HL),D 208A C9 00767 RET 00768 ; 00769 ; Command I - Step one instruction at a time 00770 ; 208B F5 00771 CMD_CI PUSH AF ;Save whether I or C 208C ED5BBE00 00772 LD DE,(PCREG) ;Point to inst address 2090 1A 00773 LD A,(DE) ; & get it 2091 215721 00774 LD HL,XY_TAB ;IX,IY Table 2094 FEDD 00775 CP 0DDH ;Is inst an IX? 2096 280E 00776 JR Z,$?25 2098 FEFD 00777 CP 0FDH ;Is inst an IY? 209A 280A 00778 JR Z,$?25 209C 211F21 00779 LD HL,OP_TAB ;All X IX, IY, & ED 209F FEED 00780 CP 0EDH ;Is inst an ED? 20A1 2006 00781 JR NZ,$?26 20A3 215021 00782 LD HL,ED_TAB ;ED Table 20A6 13 00783 $?25 INC DE ;Get next byte for 20A7 1A 00784 LD A,(DE) ; IX, IY, and ED inst 20A8 1B 00785 DEC DE ;Reset ptr to 1st byte 20A9 4F 00786 $?26 LD C,A ;Inst byte to reg C 00787 ; 00788 ; This next section of code determines the length 00789 ; of all instructions and whether they 00790 ; are CALLs, JumPs, or RETurns. 00791 ; 20AA 7E 00792 $?27 LD A,(HL) ;P/u table value & 20AB A1 00793 AND C ; strip off certain bits 20AC 23 00794 INC HL ;Pt to table code 20AD BE 00795 CP (HL) ;If a match, the inst is 20AE 23 00796 INC HL ; fully decoded as to 20AF 2806 00797 JR Z,$?28 ; length & type by the 20B1 23 00798 INC HL ; next byte 20B2 7E 00799 LD A,(HL) ;Ck for table end 20B3 FE05 00800 CP 5 20B5 30F3 00801 JR NC,$?27 20B7 7E 00802 $?28 LD A,(HL) ;Get control/length byte 20B8 47 00803 LD B,A ; into reg B 20B9 E60F 00804 AND 0FH ;Strip off the control 20BB 6F 00805 LD L,A ;Put length into reg L 20BC 2600 00806 LD H,0 ;Zero out reg H 20BE 19 00807 ADD HL,DE ;Next address into HL 20BF D5 00808 PUSH DE ;This addr in DE saved 20C0 11A500 00809 LD DE,NXTBYT ;Buffer area 20C3 CDC51F 00810 CALL $?17 ;Insert RST 48 if RAM 20C6 E1 00811 POP HL ;Get this inst address 20C7 78 00812 LD A,B ;Get control/length byte 20C8 E6F0 00813 AND 0F0H ;Strip off length 20CA 282A 00814 JR Z,$?29 ;Go if regular inst 20CC 23 00815 INC HL 20CD FE20 00816 CP 20H 20CF 3846 00817 JR C,$?34 ;Branch if 'JP (HL)' 20D1 2838 00818 JR Z,$?33 ;Go if 'JP (IX/IY)' 20D3 FE40 00819 CP 40H 20D5 382B 00820 JR C,$?32 ;Go if 'JR' or 'DJNZ' 20D7 2823 00821 JR Z,$?31 ;Branch if 'JP' inst 20D9 FE60 00822 CP 60H 20DB 381C 00823 JR C,$?30 ;Branch if 'RET' inst 20DD 2812 00824 JR Z,$?28A ;Branch if CALL inst 20DF 79 00825 LD A,C ; else calc target of 20E0 E638 00826 AND 38H ; the RST inst 20E2 6F 00827 LD L,A 20E3 2600 00828 LD H,0 20E5 F1 00829 POP AF ;Rcvr entry command 20E6 FE63 00830 CP 'c' 20E8 280C 00831 JR Z,$?29 ;Go in "call" mode 20EA 7D 00832 LD A,L ;Must check RST for 20EB FE28 00833 CP 5<3 ; 40, 48, 56 inhibit 20ED 3007 00834 JR NC,$?29 ;Convert to CALL 20EF 1829 00835 JR $?35 ; else single step 20F1 F1 00836 $?28A POP AF ;Recover entry command 20F2 FE69 00837 CP 'i' ;Was command an 'I' 20F4 2806 00838 JR Z,$?31 ;Go for 'CALLs' if 'I' 20F6 C39F1F 00839 $?29 JP $?15 ;Go for 'CALLs' if 'C' 20F9 2ABC00 00840 $?30 LD HL,(SPREG) ;RET inst, p/u RET addr 20FC 7E 00841 $?31 LD A,(HL) ;JP inst, p/u jump addr & 20FD 23 00842 INC HL ; insert into reg HL 20FE 66 00843 LD H,(HL) 20FF 6F 00844 LD L,A 2100 1818 00845 JR $?35 2102 4E 00846 $?32 LD C,(HL) ;'JR' or 'DJNZ', get 'E' 2103 79 00847 LD A,C ;Make A=0 if C is 2104 07 00848 RLCA ; positive, else make 2105 9F 00849 SBC A,A ; A=FF for negative 2106 47 00850 LD B,A ;Put -> B, FF if 'E' neg 2107 23 00851 INC HL ; or 0 if 'E' pos. 2108 09 00852 ADD HL,BC ;Add the displacement 2109 180F 00853 JR $?35 210B 2AB800 00854 $?33 LD HL,(IXREG) ;Init for JP (IX) 210E CB69 00855 BIT 5,C ;Test inst for DD/FD 2110 2808 00856 JR Z,$?35 ;Bit 5 off = DD 2112 2ABA00 00857 LD HL,(IYREG) ;JP (IY), p/u jump addr 2115 1803 00858 JR $?35 2117 2AAE00 00859 $?34 LD HL,(HLREG) ;JP (HL), p/u jump addr 211A CDC51F 00860 $?35 CALL $?17 211D 18D7 00861 JR $?29 00862 ; 00863 ; The next three tables are used to determine the 00864 ; length & instruction type for all instructions 00865 ; used in the single-step mode. Table format uses 00866 ; three bytes for each decoding process. The 1st 00867 ; byte is ANDed with the inst byte to strip off 00868 ; selected bits and include others. The result is 00869 ; compared to the next table byte (test byte) for 00870 ; a match. If matched, then the inst byte has been 00871 ; identified as to its class & length. The 3rd byte 00872 ; denotes the class and length as follows: 00873 ; High order nybble 00874 ; 0 = Regular instruction 00875 ; 1 = JP (HL) instruction 00876 ; 2 = JP (IX) or JP (IY) instruction 00877 ; 3 = JR or DJNZ instructions 00878 ; 4 = JP instructions 00879 ; 5 = RET instructions 00880 ; 6 = CALL instructions 00881 ; 7 = RST instructions 00882 ; Low order nybble = the length 00883 ; The last byte of each table is the length of 00884 ; all other instructions. 00885 ; 00886 ; Table for regular instructions (no IX, IY, ED) 00887 ; 211F C7 00888 OP_TAB DB 0C7H,0C0H,51H ;C8, D8, E8, F8 C0 51 2122 FF 00889 DB 0FFH,0C9H,51H ;C9 C9 51 2125 FF 00890 DB 0FFH,0E9H,11H ;E9 E9 11 2128 CF 00891 DB 0CFH,01H,03H ;01, 11, 21, 31 01 03 212B E7 00892 DB 0E7H,22H,3 ;22, 2A, 32, 3A 22 03 212E C7C2 00893 DW 0C2C7H ;C2, CA, D2, DA, E2, EA, 2130 43 00894 DB 43H ; F2, FA 2131 FF 00895 DB 0FFH,0C3H,43H ;C3 C3 43 2134 C7C4 00896 DW 0C4C7H ;C4, CC, D4, DC, E4, EC, 2136 63 00897 DB 63H ; F4, FC 2137 FF 00898 DB 0FFH,0CDH,63H ;CD CD 63 213A C706 00899 DW 06C7H ;06, 0E, 16, 1E, 26, 2E, 213C 02 00900 DB 02H ; 36, 3E 213D F7 00901 DB 0F7H,0D3H,02 ;D3, DB D3 02 2140 C7C6 00902 DW 0C6C7H ;C6, CE, D6, DE, E6, EE, 2142 02 00903 DB 02H ; F6, FE 2143 FF 00904 DB 0FFH,0CBH,2 ;All CB instructions CB 02 2146 F7 00905 DB 0F7H,10H,32H ;10, 18 10 32 2149 E7 00906 DB 0E7H,20H,32H ;20, 28, 30, 38 20 32 214C C7 00907 DB 0C7H,0C7H,71H ;RST instructions C7 71 214F 01 00908 DB 1 ;All others are 1-byte 00909 ; 00910 ; Next table is for ED - extended instructions 00911 ; 2150 C7 00912 ED_TAB DB 0C7H,43H,04H ;43, 4B, 53, 5B, 73, 7B 43 04 2153 F7 00913 DB 0F7H,45H,52H ;45, 4D 45 52 2156 02 00914 DB 2 ;All other ED are 2-byte 00915 ; 00916 ; IX, IY Index instructions table 00917 ; 2157 FE 00918 XY_TAB DB 0FEH,34H,03 ;34, 35 34 03 215A C0 00919 DB 0C0H,40H,03 ;4X, 5X, 6X, 7X (X = 0-F) 40 03 215D C0 00920 DB 0C0H,80H,03 ;8X, 9X, AX, BX (X= 0-F) 80 03 2160 FF 00921 DB 0FFH,21H,04 ;21 21 04 2163 FF 00922 DB 0FFH,22H,04 ;22 22 04 2166 FF 00923 DB 0FFH,2AH,04 ;2A 2A 04 2169 FF 00924 DB 0FFH,36H,04 ;36 36 04 216C FF 00925 DB 0FFH,0CBH,04 ;CB CB 04 216F FF 00926 DB 0FFH,0E9H,22H ;E9 E9 22 2172 02 00927 DB 02H ;All others are 2-bytes 00928 ; 00929 ; Routine to display memory on CRT screen 00930 ; 2173 C5 00931 WRMEM PUSH BC ;Save main counter 4/16 2174 3E3D 00932 LD A,'=' 2176 CD4206 00933 CALL @DSP 2179 3C 00934 INC A ;'>' 217A CD4206 00935 CALL @DSP 217D 0610 00936 LD B,16 ;Init for 16 lines 217F E5 00937 PUSH HL ;Save memory pointer 2180 CDA421 00938 $?36 CALL GRPHIC ;Ck if need graphic bars 2183 CD1122 00939 CALL WR1HEX@ ;Call on HEX display only 2186 10F8 00940 DJNZ $?36 ;Loop until full line 2188 E1 00941 POP HL ;Rcvr memory pointer 00942 ; 00943 ; Now write the line in ASCII 00944 ; 2189 CD3122 00945 CALL WRSPA@ 218C 0610 00946 LD B,16 218E CDC321 00947 $?37 CALL $?41 ;Space after 8th 2191 7E 00948 LD A,(HL) ;P/u the byte -> reg A 2192 FE20 00949 CP 20H ;Repl controls with '.' 2194 3804 00950 JR C,$?38 2196 FEC0 00951 CP 0C0H ;Tabs/specials with '.' 2198 3802 00952 JR C,$?39 219A 3E2E 00953 $?38 LD A,'.' 219C CD4206 00954 $?39 CALL @DSP 219F 23 00955 INC HL ;Bump memory address 21A0 10EC 00956 DJNZ $?37 21A2 C1 00957 POP BC ;Get line counter 21A3 C9 00958 RET 00959 ; 00960 ; This routine determines if the vertical graphic 00961 ; bars should be surrounding the current character 00962 ; 21A4 ED5BA300 00963 GRPHIC LD DE,(NXTADR) ;P/u modification address 21A8 13 00964 INC DE ; & increment it 21A9 E5 00965 PUSH HL ;Save current memory 21AA AF 00966 XOR A ; display address 21AB ED52 00967 SBC HL,DE ;Ck if mod addr=disp addr 00968 IF @MOD4 21AD 3E95 00969 LD A,95H ;Graphic left bar 00970 ENDIF 00971 IF @MOD2 00972 LD A,15H 00973 ENDIF 21AF 280E 00974 JR Z,$?40 ;Insert graphic if equal 21B1 CDC321 00975 CALL $?41 ;Not =, insert space if 21B4 23 00976 INC HL ; between pos 8 & 9 21B5 7D 00977 LD A,L ;Result is zero if next 21B6 B4 00978 OR H ; char address is also 00979 ; the display address 21B7 E1 00980 POP HL ;Get current mem disp adr 00981 IF @MOD4 21B8 3EAA 00982 LD A,0AAH ;Graphic right bar output 21BA CA4206 00983 JP Z,@DSP ;Go if yes 21BD 1808 00984 JR $?42 ; else continue 00985 ENDIF 00986 IF @MOD2 00987 JR NZ,$?42 ;Go if not 00988 XOR A ; lead in 00989 CALL @DSP ;Init video lead in 00990 LD A,15H 00991 JP @DSP ; and display 00992 ENDIF 21BF 00993 $?40 EQU $ 00994 IF @MOD2 00995 PUSH AF 00996 XOR A 00997 CALL @DSP ;Lead in code 00998 POP AF ;Restore 00999 ENDIF 21BF CD4206 01000 CALL @DSP ;Display char 21C2 E1 01001 POP HL ;Recover current display 21C3 78 01002 $?41 LD A,B ; address & output a 21C4 FE08 01003 CP 8 ; space if between the 21C6 C0 01004 RET NZ ; 8th & 9th bytes 21C7 1868 01005 $?42 JR WRSPA@ ; else just return 01006 ; 01007 ; This routine will return with zero flag set 01008 ; on entry of a comma or a SPACE. Entry of 01009 ; will set carry flag and return 01010 ; 21C9 D5 01011 INPUT@ PUSH DE 21CA CD2806 01012 $?43 CALL @KEY 21CD FE0D 01013 CP 0DH ;ENTER? 21CF 2810 01014 JR Z,$?44 21D1 FE20 01015 CP 20H ;Get another char if 21D3 38F5 01016 JR C,$?43 ; entry was control 21D5 CBEF 01017 INPUC@ SET 5,A ;Cvrt UC to lc 21D7 CD4206 01018 CALL @DSP ;Not control, disp it 21DA D1 01019 POP DE 21DB FE2C 01020 CP ',' ;Return with zero flag 21DD C8 01021 RET Z ; set if a comma 21DE FE20 01022 CP ' ' ;Return with zero flag 21E0 C9 01023 RET ; set if 21E1 D1 01024 $?44 POP DE 21E2 37 01025 SCF ; will set 21E3 C9 01026 RET ; the carry flag 01027 ; 01028 ; This routine will read in digits 01029 ; and convert them to binary 01030 ; 21E4 CDC921 01031 HEXIN@ CALL INPUT@ ;Get char and return on 21E7 C8 01032 RET Z ; SPACE, COMMA, or ENTER 21E8 210000 01033 LD HL,0 ;Init value to zero 21EB CD0022 01034 $?45 CALL CVB ;Convert to binary if ok 21EE DA4C1E 01035 JP C,CMND ; else back on bad digit 21F1 29 01036 ADD HL,HL ;Multiply current value 21F2 29 01037 ADD HL,HL ; by 16 and insert the 21F3 29 01038 ADD HL,HL ; new digit into the 21F4 29 01039 ADD HL,HL ; lo-order nybble of L 21F5 B5 01040 OR L 21F6 6F 01041 LD L,A 21F7 CDC921 01042 CALL INPUT@ ;Get another character 21FA 20EF 01043 JR NZ,$?45 ;Go if not separator 21FC 1F 01044 RRA ;Force to set 21FD CE81 01045 ADC A,81H ; the carry flag 21FF C9 01046 RET 01047 ; 01048 ; Routine to convert expected ASCII hex digit to 01049 ; its binary value. Set Carry-flag on bad digit 01050 ; 2200 D630 01051 CVB SUB '0' ;Convert digit to binary 2202 D8 01052 RET C ;Error if < '0' 2203 C6C9 01053 ADD A,0C9H ;Ck for > F (46H-30H=16H) 01054 ; (16H + E9H = FFH) 2205 D8 01055 RET C ;Error if > ASCII 'F' 2206 C606 01056 ADD A,6 ;(E9H-EFH) to (EFH-05H) 2208 3803 01057 JR C,ATOF ;Carry denotes was 220A C627 01058 ADD A,27H ;(EFH-FFH) to (F6H-06H) 220C D8 01059 RET C ;Error if (3AH-3FH/:-?) 220D C60A 01060 ATOF ADD A,0AH ;(00D-06D) to (10D-16D) 01061 ; or (F6H-FFH) to (0-9) 220F B7 01062 OR A ;Set zero flag on zero 2210 C9 01063 RET 01064 ; 01065 ; Routine to write one byte as two hex digits 01066 ; 2211 7E 01067 WR1HEX@ LD A,(HL) 2212 23 01068 INC HL 2213 1805 01069 JR CV2HEX@ 01070 ; 01071 ; Routine to write 2 bytes (HL) as 4 hex digits 01072 ; 2215 7C 01073 WR2HEX@ LD A,H 2216 CD1A22 01074 CALL CV2HEX@ 2219 7D 01075 LD A,L 01076 ; 01077 ; Routine converts a byte to 2 hex digits 01078 ; 221A F5 01079 CV2HEX@ PUSH AF ;Save the byte in A 221B 1F 01080 RRA ;Move hi-order 221C 1F 01081 RRA ; into lo-order 221D 1F 01082 RRA 221E 1F 01083 RRA 221F CD2322 01084 CALL $?46 ;Strip off hi-order 01085 ; & convert to ASCII 2222 F1 01086 POP AF ;Recover the byte 2223 E60F 01087 $?46 AND 0FH ;Strip off hi-order 01088 ; & convert to ASCII 2225 C690 01089 ADD A,90H 2227 27 01090 DAA 2228 CE40 01091 ADC A,40H 222A 27 01092 DAA 222B C34206 01093 $?47 JP @DSP 01094 ; 01095 ; Miscellaneous routines 01096 ; 222E CD1A22 01097 WRHEX CALL CV2HEX@ 2231 3E20 01098 WRSPA@ LD A,20H 2233 18F6 01099 JR $?47 01100 ; 2235 CD3B22 01101 WR3BYT CALL $?48 2238 CD3B22 01102 CALL $?48 223B 7E 01103 $?48 LD A,(HL) 223C 23 01104 INC HL 223D 18EC 01105 JR $?47 01106 ; 01107 ; Command B - Block move 01108 ; 223F FE62 01109 BLOCK CP 'b' 2241 2048 01110 JR NZ,FILL 2243 2AA600 01111 LD HL,(DSPADR) ;'b'lock move s,d,len 2246 CDE421 01112 CALL HEXIN@ ;Default to display addd 2249 D8 01113 RET C ;Back on 224A 22A600 01114 LD (DSPADR),HL ;Save start addr 224D 2008 01115 JR NZ,BLO1 ;Go if start entered 224F CD1522 01116 CALL WR2HEX@ ; else show default 2252 3E2C 01117 LD A,',' 2254 CD4206 01118 CALL @DSP 2257 2AA300 01119 BLO1 LD HL,(NXTADR) ;Default next address 225A CDE421 01120 CALL HEXIN@ 225D 22A300 01121 LD (NXTADR),HL ;Save dest address 2260 200A 01122 JR NZ,BLO2 ;Go if entered 2262 F5 01123 PUSH AF 2263 CD1522 01124 CALL WR2HEX@ ; else show default 2266 3E2C 01125 LD A,',' 2268 CD4206 01126 CALL @DSP 226B F1 01127 POP AF 226C 210001 01128 BLO2 LD HL,256 ;Default length to 256 226F 3805 01129 JR C,BLO3 ;Go if used prev. 2271 CDE421 01130 CALL HEXIN@ ;Get new length 2274 2005 01131 JR NZ,BLO4 ;Go if entered 2276 E5 01132 BLO3 PUSH HL 2277 CD1522 01133 CALL WR2HEX@ ; else dsply default 227A E1 01134 POP HL 227B 44 01135 BLO4 LD B,H ;Length to BC 227C 4D 01136 LD C,L 227D 2AA600 01137 LD HL,(DSPADR) ;Set source 2280 ED5BA300 01138 LD DE,(NXTADR) ; and dest 2284 EDB0 01139 LDIR 2286 ED53A300 01140 LD (NXTADR),DE ;Set new mod addr 228A C9 01141 RET 01142 ; 01143 ; 'f'ill aaaa,bbbb,cc 01144 ; 228B FE66 01145 FILL CP 'f' 228D 201C 01146 JR NZ,JUMP 228F CDE421 01147 CALL HEXIN@ ;Get starting address 2292 C8 01148 RET Z 2293 E5 01149 PUSH HL ;Save starting address 2294 CDE421 01150 CALL HEXIN@ ;Get ending address 2297 E3 01151 EX (SP),HL ;Place ending into BC 2298 C1 01152 POP BC ; & starting into HL 2299 C8 01153 RET Z 229A E5 01154 PUSH HL ;Save starting again 229B CDE421 01155 CALL HEXIN@ ;Get fill character 229E 5D 01156 LD E,L ;Save fill in E 229F E1 01157 POP HL ;Recover starting addr 22A0 C8 01158 RET Z 22A1 AF 01159 XOR A ;Clear the C-flag 22A2 E5 01160 FIL1 PUSH HL 22A3 ED42 01161 SBC HL,BC 22A5 E1 01162 POP HL 22A6 D0 01163 RET NC ;Return when start = end 22A7 73 01164 LD (HL),E ;Stuff char into memory 22A8 23 01165 INC HL 22A9 18F7 01166 JR FIL1 01167 ; 01168 ; 'j'ump over next instruction 01169 ; 22AB FE6A 01170 JUMP CP 'j' 22AD 2008 01171 JR NZ,QUERY 22AF 2ABE00 01172 LD HL,(PCREG) ;Get current PC location 22B2 23 01173 INC HL ; and increment it 22B3 22BE00 01174 LD (PCREG),HL 22B6 C9 01175 RET 01176 ; 01177 ; 'q'uery ii - 'q'uery oo,dd 01178 ; input/output to port 01179 ; 22B7 FE71 01180 QUERY CP 'q' 22B9 2024 01181 JR NZ,DISKIO 22BB 3E1E 01182 LD A,1EH ;Clear to end of line 22BD CD4206 01183 CALL @DSP 22C0 CDE421 01184 CALL HEXIN@ ;Get port number 22C3 C8 01185 RET Z ;Back if no value 22C4 4D 01186 LD C,L 22C5 3807 01187 JR C,QUE1 ;If , do input 22C7 CDE421 01188 CALL HEXIN@ ;Get byte to output 22CA C8 01189 RET Z ;Quit if none 22CB ED69 01190 OUT (C),L ;Do the output 22CD C9 01191 RET 22CE 3E3D 01192 QUE1 LD A,'=' ;Dsply separator 22D0 CD4206 01193 CALL @DSP 22D3 ED78 01194 IN A,(C) ;Read the port and 22D5 CD1A22 01195 CALL CV2HEX@ ; dsply the value 22D8 C3C921 01196 JP INPUT@ 01197 ; 01198 ; If a command is entered and not found in SYS5, 01199 ; SYS9 will be searched if the extended debugger 01200 ; is active. 01201 ; 22DB 2AA419 01202 EXTDBG LD HL,(EXTDBG$) ;Try extended debug 22DE E9 01203 JP (HL) 01204 ; 01205 ; disk i/o - d,c,s,r/w/*,addr,lth 01206 ; 22DF D630 01207 DISKIO SUB 30H ;Cvrt drive to binary 22E1 FE08 01208 CP 8 ;Check on max drive 22E3 30F6 01209 JR NC,EXTDBG ;Exit if not <0-7> 22E5 4F 01210 LD C,A ;Xfer drive # to reg C 22E6 CD1E1A 01211 CALL @GTDCT ; & get the DCT 22E9 FD7E07 01212 LD A,(IY+7) ;Get sectors/cyl & heads 22EC E6E0 01213 AND 0E0H ;Remove sectors/cyl 22EE 07 01214 RLCA ; & keep # of heads 22EF 07 01215 RLCA ;Shift into bits 0-2 22F0 07 01216 RLCA 22F1 3C 01217 INC A ;Adj for zero offset 22F2 47 01218 LD B,A 22F3 FD7E07 01219 LD A,(IY+7) ;# of sectors per cyl 22F6 E61F 01220 AND 1FH ;Remove heads 22F8 3C 01221 INC A ;Adj for zero offset 22F9 67 01222 LD H,A 22FA AF 01223 XOR A ;Accumulate total # of 22FB 84 01224 DIS1 ADD A,H ;Sectors per cyl 22FC 10FD 01225 DJNZ DIS1 22FE FDCB046E 01226 BIT 5,(IY+4) ;Test if 2-sided drive 2302 2801 01227 JR Z,DIS2 2304 87 01228 ADD A,A ;Times 2 if 2-sided 2305 32A200 01229 DIS2 LD (SAVTWO+1),A ;Save sectors per cyl 2308 3E1E 01230 LD A,1EH ;Clear to end of line 230A CD4206 01231 CALL @DSP 230D CDC921 01232 CALL INPUT@ ;Input CYL # 2310 D8 01233 RET C 2311 CDE421 01234 CALL HEXIN@ 2314 D8 01235 RET C 2315 55 01236 LD D,L ;Cylinder entered? 2316 2003 01237 JR NZ,DIS3 2318 FD5609 01238 LD D,(IY+9) ;P/u directory cyl 231B CDE421 01239 DIS3 CALL HEXIN@ 231E 5D 01240 LD E,L ;Sector entered? 231F 3E01 01241 LD A,1 ;Init to 1 sector i/o 2321 2005 01242 JR NZ,DIS4 2323 1E00 01243 LD E,0 ;Default to sector 0 2325 3AA200 01244 LD A,(SAVTWO+1) ;Default to total sectors 2328 32A500 01245 DIS4 LD (NXTBYT),A 232B D8 01246 RET C 232C CDC921 01247 CALL INPUT@ ;Get I/O direction (RW*) 232F D8 01248 RET C 2330 47 01249 LD B,A ;Save i/o char in B 2331 CDC921 01250 CALL INPUT@ ;Get buffer i/o address 2334 D8 01251 RET C 2335 CDE421 01252 CALL HEXIN@ 2338 E5 01253 PUSH HL ;Save buffer address 2339 380B 01254 JR C,DIS6 233B E5 01255 PUSH HL 233C CDE421 01256 CALL HEXIN@ ;Sector count entered? 233F 7D 01257 LD A,L 2340 E1 01258 POP HL 2341 2803 01259 JR Z,DIS6 ;Go if no sector count 2343 32A500 01260 LD (NXTBYT),A ;Else update count 2346 78 01261 DIS6 LD A,B ;P/u i/o direction 2347 FE72 01262 CP 'r' ;Read? 2349 2830 01263 JR Z,DIS9 234B FE77 01264 CP 'w' ;Write? 234D 2847 01265 JR Z,DIS10 234F FE2A 01266 CP '*' ;Write to directory? 2351 284A 01267 JR Z,DIS11 2353 24 01268 DIS7 INC H ;Bump up a buffer page 2354 1C 01269 INC E ;Bump sector number 2355 3AA200 01270 LD A,(SAVTWO+1) ;P/u max # sectors 2358 3D 01271 DEC A ;Compare max to where 2359 BB 01272 CP E ; we are 235A 3003 01273 JR NC,DIS8 ;Jump if more on cyl 235C 1E00 01274 LD E,0 ;Reset sector # to 0 235E 14 01275 INC D ;Bump cylinder 235F 3AA500 01276 DIS8 LD A,(NXTBYT) ;Reduce i/o sector count 2362 3D 01277 DEC A 2363 32A500 01278 LD (NXTBYT),A 2366 20DE 01279 JR NZ,DIS6 ;Loop if not through 2368 E1 01280 DIS8A POP HL ;Rcvr buffer start addr 2369 78 01281 LD A,B ;P/u i/o direction 236A FE72 01282 CP 'r' ;Read? 236C C0 01283 RET NZ ;Ret if not read 236D 2E00 01284 LD L,0 ;Reset memory buffer ptr 236F 22A600 01285 LD (DSPADR),HL ; to display the 1st 2372 22A300 01286 LD (NXTADR),HL ; sector read 2375 3E73 01287 LD A,'s' ;Set full screen mode 2377 32A100 01288 LD (SAVTWO),A 237A C9 01289 RET 01290 ; 237B 01291 DIS9 EQU $ 237B E5 01292 PUSH HL 237C D5 01293 PUSH DE 237D C5 01294 PUSH BC 237E 54 01295 LD D,H ;Pass buffer to DE 237F 5D 01296 LD E,L 2380 13 01297 INC DE ;Start +1 2381 3600 01298 LD (HL),0 ;Clear a byte 2383 01FF00 01299 LD BC,255 ;Length -1 2386 EDB0 01300 LDIR ;Clear buffer 2388 C1 01301 POP BC ;Unstack 2389 D1 01302 POP DE 238A E1 01303 POP HL 01304 ; 238B CDF419 01305 CALL @RDSEC ;Read the sector 238E 28C3 01306 JR Z,DIS7 ;Loop on read ok 2390 FE06 01307 CP 6 ; or directory read 2392 28BF 01308 JR Z,DIS7 2394 180C 01309 JR DIS12 ; else error 2396 CDE819 01310 DIS10 CALL @WRSEC ;Write sector 2399 28B8 01311 JR Z,DIS7 ;Loop on write ok 239B 1805 01312 JR DIS12 239D CDEC19 01313 DIS11 CALL @WRSSC ;Write system sector 23A0 28B1 01314 JR Z,DIS7 ;Loop on write prot ok 01315 ; 01316 ; disk i/o error output display routine 01317 ; 23A2 D5 01318 DIS12 PUSH DE ;Save track & sector 23A3 F5 01319 PUSH AF ;Save error code 23A4 CD3122 01320 CALL WRSPA@ ;Output a space 23A7 3E2A 01321 LD A,'*' 23A9 CD4206 01322 CALL @DSP ; followed by asterisk 23AC F1 01323 POP AF 23AD CD1A22 01324 CALL CV2HEX@ ;Write error # 23B0 3E2A 01325 LD A,'*' 23B2 CD4206 01326 CALL @DSP ; followed by space 23B5 CDC921 01327 CALL INPUT@ ;Continue? 23B8 D1 01328 POP DE ;Rcvr track/sector 23B9 3098 01329 JR NC,DIS7 ;Loop unless 23BB 18AB 01330 JR DIS8A ;Exit on 01331 ; 23BD 01332 LAST EQU $ 01333 IFGT LAST,MAXCOR$-2 01334 ERR 'Module too big' 01335 ENDIF 23FE 01336 ORG MAXCOR$-2 23FE BD05 01337 DW LAST-SYS5 ;Overlay size 01338 ; 1E00 01339 END SYS5 1E00 is the transfer address 00000 Total errors
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software_2011 at nemesis.lonestar.org]