From 60339ca3891ff72e0bc545f1190a724e690d52ec Mon Sep 17 00:00:00 2001 From: Fred VanEijk Date: Tue, 17 Dec 2024 07:56:55 -0500 Subject: [PATCH] update assembler cpm bios read/write routines to be more robust add cpm-blank.zip with the more robust cpm bios read/write routines --- CPM-sd-image/cpm-blank.zip | Bin 0 -> 163382 bytes CPM-sd-image/cpm_file_copier.py | 27 +- MultiComp.sv | 32 +- .../hexFiles/BASMON.HEX | 686 +- .../hexFiles/CBIOS128.HEX | 121 +- .../hexFiles/CPM22.HEX | 476 +- .../hexFiles/DOWNLOAD.HEX | 38 +- .../hexFiles/FORM128.HEX | 32 +- .../hexFiles/PUTSYS.HEX | 20 +- .../hexFiles/intMon.hex | 633 +- .../source/BASMON.LST | 10110 ++++++++-------- .../source/CBIOS128.LST | 1978 +-- .../source/CPM22.LST | 7626 ++++++------ .../source/DOWNLOAD.LST | 591 +- .../source/FORM128.LST | 486 +- .../source/PUTSYS.LST | 345 +- .../source/cbios128.asm | 184 +- .../source/mon.asm | 90 +- .../source/mon.lst | 9026 +++++++------- build_id.v | 2 +- releases/MultiComp_20241217.rbf | Bin 0 -> 3487956 bytes 21 files changed, 16464 insertions(+), 16039 deletions(-) create mode 100644 CPM-sd-image/cpm-blank.zip create mode 100644 releases/MultiComp_20241217.rbf diff --git a/CPM-sd-image/cpm-blank.zip b/CPM-sd-image/cpm-blank.zip new file mode 100644 index 0000000000000000000000000000000000000000..d20754bd3b046b35d801a8e4ebd49e194394fc51 GIT binary patch literal 163382 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 z' ; Get a ">" -0301 00F5 CF RST 08H ; print it -0302 00F6 -0303 00F6 CD 71 00 MAIN1 CALL RDCHR ; Get a character from the input port -0304 00F9 FE 20 CP ' ' ; or less? -0305 00FB 38 F9 JR C,MAIN1 ; Go back -0306 00FD -0307 00FD FE 3A CP ':' ; ":"? -0308 00FF CA 99 01 JP Z,LOAD ; First character of a HEX load -0309 0102 -0310 0102 CD 7D 00 CALL WRCHR ; Print char on console -0311 0105 -0312 0105 E6 5F AND $5F ; Make character uppercase -0313 0107 -0314 0107 FE 42 CP 'B' -0315 0109 CA DA 01 JP Z,BASIC -0316 010C -0317 010C FE 47 CP 'G' -0318 010E CA 93 01 JP Z,M_GOTO -0319 0111 -0320 0111 FE 58 CP 'X' -0321 0113 CA F1 01 JP Z,CPMLOAD -0322 0116 -0323 0116 3E 3F LD A,'?' ; Get a "?" -0324 0118 CF RST 08H ; Print it -0325 0119 18 D5 JR MAIN0 -0326 011B -0327 011B ;------------------------------------------------------------------------------ -0328 011B ; Print string of characters to Serial A until byte=$00, WITH CR, LF -0329 011B ;------------------------------------------------------------------------------ -0330 011B 7E M_PRINT LD A,(HL) ; Get character -0331 011C B7 OR A ; Is it $00 ? -0332 011D C8 RET Z ; Then RETurn on terminator -0333 011E CF RST 08H ; Print it -0334 011F 23 INC HL ; Next Character -0335 0120 18 F9 JR M_PRINT ; Continue until $00 -0336 0122 -0337 0122 -0338 0122 3E 0D TXCRLF LD A,$0D ; -0339 0124 CF RST 08H ; Print character -0340 0125 3E 0A LD A,$0A ; -0341 0127 CF RST 08H ; Print character -0342 0128 C9 RET -0343 0129 -0344 0129 ;------------------------------------------------------------------------------ -0345 0129 ; Get a character from the console, must be $20-$7F to be valid (no control characters) -0346 0129 ; and breaks with the Zero Flag set -0347 0129 ;------------------------------------------------------------------------------ -0348 0129 CD 71 00 M_GETCHR CALL RDCHR ; RX a Character -0349 012C FE 03 CP $03 ; User break? -0350 012E C8 RET Z -0351 012F FE 20 CP $20 ; or better? -0352 0131 38 F6 JR C,M_GETCHR ; Do it again until we get something usable -0353 0133 C9 RET -0354 0134 ;------------------------------------------------------------------------------ -0355 0134 ; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) -0356 0134 ; Moves them into B and C, converts them into a byte value in A and updates a -0357 0134 ; Checksum value in E -0358 0134 ;------------------------------------------------------------------------------ -0359 0134 CD 29 01 GET2 CALL M_GETCHR ; Get us a valid character to work with -0360 0137 47 LD B,A ; Load it in B -0361 0138 CD 29 01 CALL M_GETCHR ; Get us another character -0362 013B 4F LD C,A ; load it in C -0363 013C CD 73 01 CALL BCTOA ; Convert ASCII to byte -0364 013F 4F LD C,A ; Build the checksum -0365 0140 7B LD A,E -0366 0141 91 SUB C ; The checksum should always equal zero when checked -0367 0142 5F LD E,A ; Save the checksum back where it came from -0368 0143 79 LD A,C ; Retrieve the byte and go back -0369 0144 C9 RET -0370 0145 ;------------------------------------------------------------------------------ -0371 0145 ; Gets four Hex characters from the console, converts them to values in HL -0372 0145 ;------------------------------------------------------------------------------ -0373 0145 21 00 00 GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator -0374 0148 CD 8C 01 CALL ECHO ; RX a Character -0375 014B FE 0D CP $0D ; ? -0376 014D 20 0E JR NZ,GETX2 ; other key -0377 014F 37 SETCY SCF ; Set Carry Flag -0378 0150 C9 RET ; and Return to main program -0379 0151 ;------------------------------------------------------------------------------ -0380 0151 ; This routine converts last four hex characters (0-9 A-F) user types into a value in HL -0381 0151 ; Rotates the old out and replaces with the new until the user hits a terminating character -0382 0151 ;------------------------------------------------------------------------------ -0383 0151 21 00 00 GETX LD HL,$0000 ; CLEAR HL -0384 0154 CD 8C 01 GETX1 CALL ECHO ; RX a character from the console -0385 0157 FE 0D CP $0D ; -0386 0159 C8 RET Z ; quit -0387 015A FE 2C CP $2C ; <,> can be used to safely quit for multiple entries -0388 015C C8 RET Z ; (Like filling both DE and HL from the user) -0389 015D FE 03 GETX2 CP $03 ; Likewise, a will terminate clean, too, but -0390 015F 28 EE JR Z,SETCY ; It also sets the Carry Flag for testing later. -0391 0161 29 ADD HL,HL ; Otherwise, rotate the previous low nibble to high -0392 0162 29 ADD HL,HL ; rather slowly -0393 0163 29 ADD HL,HL ; until we get to the top -0394 0164 29 ADD HL,HL ; and then we can continue on. -0395 0165 D6 30 SUB $30 ; Convert ASCII to byte value -0396 0167 FE 0A CP $0A ; Are we in the 0-9 range? -0397 0169 38 02 JR C,GETX3 ; Then we just need to sub $30, but if it is A-F -0398 016B D6 07 SUB $07 ; We need to take off 7 more to get the value down to -0399 016D E6 0F GETX3 AND $0F ; to the right hex value -0400 016F 85 ADD A,L ; Add the high nibble to the low -0401 0170 6F LD L,A ; Move the byte back to A -0402 0171 18 E1 JR GETX1 ; and go back for next character until he terminates -0403 0173 ;------------------------------------------------------------------------------ -0404 0173 ; Convert ASCII characters in B C registers to a byte value in A -0405 0173 ;------------------------------------------------------------------------------ -0406 0173 78 BCTOA LD A,B ; Move the hi order byte to A -0407 0174 D6 30 SUB $30 ; Take it down from Ascii -0408 0176 FE 0A CP $0A ; Are we in the 0-9 range here? -0409 0178 38 02 JR C,BCTOA1 ; If so, get the next nybble -0410 017A D6 07 SUB $07 ; But if A-F, take it down some more -0411 017C 07 BCTOA1 RLCA ; Rotate the nybble from low to high -0412 017D 07 RLCA ; One bit at a time -0413 017E 07 RLCA ; Until we -0414 017F 07 RLCA ; Get there with it -0415 0180 47 LD B,A ; Save the converted high nybble -0416 0181 79 LD A,C ; Now get the low order byte -0417 0182 D6 30 SUB $30 ; Convert it down from Ascii -0418 0184 FE 0A CP $0A ; 0-9 at this point? -0419 0186 38 02 JR C,BCTOA2 ; Good enough then, but -0420 0188 D6 07 SUB $07 ; Take off 7 more if it's A-F -0421 018A 80 BCTOA2 ADD A,B ; Add in the high order nybble -0422 018B C9 RET -0423 018C -0424 018C ;------------------------------------------------------------------------------ -0425 018C ; Get a character and echo it back to the user -0426 018C ;------------------------------------------------------------------------------ -0427 018C CD 71 00 ECHO CALL RDCHR -0428 018F CD 7D 00 CALL WRCHR -0429 0192 C9 RET -0430 0193 -0431 0193 ;------------------------------------------------------------------------------ -0432 0193 ; GOTO command -0433 0193 ;------------------------------------------------------------------------------ -0434 0193 CD 45 01 M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. -0435 0196 D8 RET C ; Return if invalid -0436 0197 E5 PUSH HL -0437 0198 C9 RET ; Jump to HL address value -0438 0199 -0439 0199 ;------------------------------------------------------------------------------ -0440 0199 ; LOAD Intel Hex format file from the console. -0441 0199 ; [Intel Hex Format is: -0442 0199 ; 1) Colon (Frame 0) -0443 0199 ; 2) Record Length Field (Frames 1 and 2) -0444 0199 ; 3) Load Address Field (Frames 3,4,5,6) -0445 0199 ; 4) Record Type Field (Frames 7 and 8) -0446 0199 ; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 -0447 0199 ; 6) Checksum Field - Sum of all byte values from Record Length to and -0448 0199 ; including Checksum Field = 0 ] -0449 0199 ;------------------------------------------------------------------------------ -0450 0199 1E 00 LOAD LD E,0 ; First two Characters is the Record Length Field -0451 019B CD 34 01 CALL GET2 ; Get us two characters into BC, convert it to a byte -0452 019E 57 LD D,A ; Load Record Length count into D -0453 019F CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address -0454 01A2 67 LD H,A ; put value in H register. -0455 01A3 CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address -0456 01A6 6F LD L,A ; put value in L register. -0457 01A7 CD 34 01 CALL GET2 ; Get next two characters, Record Field Type -0458 01AA FE 01 CP $01 ; Record Field Type 00 is Data, 01 is End of File -0459 01AC 20 09 JR NZ,LOAD2 ; Must be the end of that file -0460 01AE CD 34 01 CALL GET2 ; Get next two characters, assemble into byte -0461 01B1 7B LD A,E ; Recall the Checksum byte -0462 01B2 A7 AND A ; Is it Zero? -0463 01B3 28 1E JR Z,LOAD00 ; Print footer reached message -0464 01B5 18 15 JR LOADERR ; Checksums don't add up, Error out -0465 01B7 -0466 01B7 7A LOAD2 LD A,D ; Retrieve line character counter -0467 01B8 A7 AND A ; Are we done with this line? -0468 01B9 28 0B JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum -0469 01BB CD 34 01 CALL GET2 ; Get next two chars, convert to byte in A, checksum it -0470 01BE 77 LD (HL),A ; Move converted byte in A to memory location -0471 01BF 23 INC HL ; Increment pointer to next memory location -0472 01C0 3E 2E LD A,'.' ; Print out a "." for every byte loaded -0473 01C2 CF RST 08H ; -0474 01C3 15 DEC D ; Decrement line character counter -0475 01C4 18 F1 JR LOAD2 ; and keep loading into memory until line is complete -0476 01C6 -0477 01C6 CD 34 01 LOAD3 CALL GET2 ; Get two chars, build byte and checksum -0478 01C9 7B LD A,E ; Check the checksum value -0479 01CA A7 AND A ; Is it zero? -0480 01CB C8 RET Z -0481 01CC -0482 01CC 21 54 03 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message -0483 01CF CD 1B 01 CALL M_PRINT ; Print Message from (HL) and terminate the load -0484 01D2 C9 RET -0485 01D3 -0486 01D3 21 8A 03 LOAD00 LD HL,LDETXT ; Print load complete message -0487 01D6 CD 1B 01 CALL M_PRINT -0488 01D9 C9 RET -0489 01DA -0490 01DA ;------------------------------------------------------------------------------ -0491 01DA ; Start BASIC command -0492 01DA ;------------------------------------------------------------------------------ -0493 01DA BASIC -0494 01DA 21 42 03 LD HL,M_BASTXT -0495 01DD CD 1B 01 CALL M_PRINT -0496 01E0 CD 29 01 CALL M_GETCHR -0497 01E3 C8 RET Z ; Cancel if CTRL-C -0498 01E4 E6 5F AND $5F ; uppercase -0499 01E6 FE 43 CP 'C' -0500 01E8 CA 95 03 JP Z,COLD -0501 01EB FE 57 CP 'W' -0502 01ED CA 98 03 JP Z,WARM -0503 01F0 C9 RET -0504 01F1 -0505 01F1 ;------------------------------------------------------------------------------ -0506 01F1 ; CP/M load command -0507 01F1 ;------------------------------------------------------------------------------ -0508 01F1 CPMLOAD -0509 01F1 -0510 01F1 21 03 02 LD HL,CPMTXT -0511 01F4 CD 1B 01 CALL M_PRINT -0512 01F7 CD 29 01 CALL M_GETCHR -0513 01FA C8 RET Z ; Cancel if CTRL-C -0514 01FB E6 5F AND $5F ; uppercase -0515 01FD FE 59 CP 'Y' -0516 01FF CA 24 02 JP Z,CPMLOAD2 -0517 0202 C9 RET -0518 0203 CPMTXT -0519 0203 0D 0A .BYTE $0D,$0A -0520 0205 426F6F742043 .TEXT "Boot CP/M?" -0520 020B 502F4D3F -0521 020F 00 .BYTE $00 -0522 0210 -0523 0210 CPMTXT2 -0524 0210 0D 0A .BYTE $0D,$0A -0525 0212 4C6F6164696E .TEXT "Loading CP/M..." -0525 0218 672043502F4D2E2E2E -0526 0221 0D 0A 00 .BYTE $0D,$0A,$00 -0527 0224 -0528 0224 CPMLOAD2 -0529 0224 21 10 02 LD HL,CPMTXT2 -0530 0227 CD 1B 01 CALL M_PRINT -0531 022A -0532 022A 06 18 LD B,numSecs -0533 022C -0534 022C 3E 00 LD A,0 -0535 022E 32 04 30 LD (lba0),A -0536 0231 32 05 30 ld (lba1),A -0537 0234 32 06 30 ld (lba2),A -0538 0237 32 07 30 ld (lba3),A -0539 023A -0540 023A 21 00 D0 LD HL,loadAddr -0541 023D 22 02 30 LD (dmaAddr),HL -0542 0240 processSectors: -0543 0240 -0544 0240 CD 6E 02 call readhst -0545 0243 -0546 0243 11 00 02 LD DE,0200H -0547 0246 2A 02 30 LD HL,(dmaAddr) -0548 0249 19 ADD HL,DE -0549 024A 22 02 30 LD (dmaAddr),HL -0550 024D 3A 04 30 LD A,(lba0) -0551 0250 3C INC A -0552 0251 32 04 30 LD (lba0),A -0553 0254 -0554 0254 10 EA djnz processSectors -0555 0256 -0556 0256 ; Start CP/M using entry at top of BIOS -0557 0256 ; The current active console stream ID is pushed onto the stack -0558 0256 ; to allow the CBIOS to pick it up -0559 0256 ; 0 = ACIA0, 1 = ACIA1 -0560 0256 -0561 0256 3A 00 30 ld A,(primaryIO) -0562 0259 F5 PUSH AF -0563 025A 2A FE FF ld HL,($FFFE) -0564 025D E9 jp (HL) -0565 025E -0566 025E -0567 025E ;------------------------------------------------------------------------------ -0568 025E ; ROUTINES AS USED IN BIOS -0569 025E ;------------------------------------------------------------------------------ -0570 025E -0571 025E ;================================================================================================ -0572 025E ; Convert track/head/sector into LBA for physical access to the disk -0573 025E ;================================================================================================ -0574 025E setLBAaddr: -0575 025E ; Transfer LBA to disk (LBA3 not used on SD card) -0576 025E 3A 06 30 LD A,(lba2) -0577 0261 D3 8C OUT (SD_LBA2),A -0578 0263 3A 05 30 LD A,(lba1) -0579 0266 D3 8B OUT (SD_LBA1),A -0580 0268 3A 04 30 LD A,(lba0) -0581 026B D3 8A OUT (SD_LBA0),A -0582 026D C9 RET -0583 026E -0584 026E ;================================================================================================ -0585 026E ; Read physical sector from host -0586 026E ;================================================================================================ -0587 026E -0588 026E readhst: -0589 026E F5 PUSH AF -0590 026F C5 PUSH BC -0591 0270 E5 PUSH HL -0592 0271 -0593 0271 DB 89 rdWait1: IN A,(SD_STATUS) -0594 0273 FE 80 CP 128 -0595 0275 20 FA JR NZ,rdWait1 -0596 0277 -0597 0277 CD 5E 02 CALL setLBAaddr -0598 027A -0599 027A 3E 00 LD A,$00 ; 00 = Read block -0600 027C D3 89 OUT (SD_CONTROL),A -0601 027E -0602 027E 0E 04 LD c,4 -0603 0280 ; LD HL,hstbuf -0604 0280 rd4secs: -0605 0280 06 80 LD b,128 -0606 0282 rdByte: -0607 0282 -0608 0282 DB 89 rdWait2: IN A,(SD_STATUS) -0609 0284 FE E0 CP 224 ; Read byte waiting -0610 0286 20 FA JR NZ,rdWait2 -0611 0288 -0612 0288 DB 88 IN A,(SD_DATA) -0613 028A -0614 028A 77 LD (HL),A -0615 028B 23 INC HL -0616 028C 05 dec b -0617 028D 20 F3 JR NZ, rdByte -0618 028F 0D dec c -0619 0290 20 EE JR NZ,rd4secs -0620 0292 -0621 0292 E1 POP HL -0622 0293 C1 POP BC -0623 0294 F1 POP AF -0624 0295 -0625 0295 ; XOR a -0626 0295 ; ld (erflag),a -0627 0295 C9 RET -0628 0296 -0629 0296 ;------------------------------------------------------------------------------ -0630 0296 ; END OF ROUTINES AS USED IN BIOS -0631 0296 ;------------------------------------------------------------------------------ -0632 0296 -0633 0296 -0634 0296 43502F4D2042M_SIGNON .BYTE "CP/M Boot ROM 2.0" -0634 029C 6F6F7420524F4D20322E30 -0635 02A7 20627920472E .BYTE " by G. Searle" -0635 02AD 20536561726C65 -0636 02B4 0D 0A .BYTE $0D,$0A -0637 02B6 0D 0A .BYTE $0D,$0A -0638 02B8 4243206F7220 .TEXT "BC or BW - ROM BASIC Cold/Warm" -0638 02BE 4257202D20524F4D20424153494320436F6C642F5761726D -0639 02D6 0D 0A .BYTE $0D,$0A -0640 02D8 582020202020 .TEXT "X - Boot CP/M (load $D000-$FFFF)" -0640 02DE 2020202D20426F6F742043502F4D20286C6F61642024443030302D244646464629 -0641 02FF 0D 0A .BYTE $0D,$0A -0642 0301 3A6E6E6E6E2E .TEXT ":nnnn... - Load Intel-Hex file record" -0642 0307 2E2E202D204C6F616420496E74656C2D4865782066696C65207265636F7264 -0643 0326 0D 0A .BYTE $0D,$0A -0644 0328 476E6E6E6E20 .TEXT "Gnnnn - Run loc nnnn" -0644 032E 2020202D2052756E206C6F63206E6E6E6E -0645 033F 0D 0A .BYTE $0D,$0A -0646 0341 00 .BYTE $00 -0647 0342 -0648 0342 M_BASTXT -0649 0342 0D 0A .BYTE $0D,$0A -0650 0344 436F6C64206F .TEXT "Cold or warm?" -0650 034A 72207761726D3F -0651 0351 0D 0A 00 .BYTE $0D,$0A,$00 -0652 0354 -0653 0354 436865636B73CKSUMERR .BYTE "Checksum error" -0653 035A 756D206572726F72 -0654 0362 0D 0A 00 .BYTE $0D,$0A,$00 -0655 0365 -0656 0365 INITTXT -0657 0365 0C .BYTE $0C -0658 0366 507265737320 .TEXT "Press [SPACE] to activate console" -0658 036C 5B53504143455D20746F20616374697661746520636F6E736F6C65 -0659 0387 0D 0A 00 .BYTE $0D,$0A, $00 -0660 038A -0661 038A LDETXT -0662 038A 436F6D706C65 .TEXT "Complete" -0662 0390 7465 -0663 0392 0D 0A 00 .BYTE $0D,$0A, $00 -0664 0395 -0665 0395 ;=========================================================================================================================== -0666 0395 -0667 0395 ; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft -0668 0395 ; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3 -0669 0395 ; (May-June 1983) to Vol 3, Issue 3 (May-June 1984) -0670 0395 ; Adapted for the freeware Zilog Macro Assembler 2.10 to produce -0671 0395 ; the original ROM code (checksum A934H). PA -0672 0395 -0673 0395 ; GENERAL EQUATES -0674 0395 -0675 0395 CTRLC .EQU 03H ; Control "C" -0676 0395 CTRLG .EQU 07H ; Control "G" -0677 0395 BKSP .EQU 08H ; Back space -0678 0395 LF .EQU 0AH ; Line feed -0679 0395 CS .EQU 0CH ; Clear screen -0680 0395 CR .EQU 0DH ; Carriage return -0681 0395 CTRLO .EQU 0FH ; Control "O" -0682 0395 CTRLQ .EQU 11H ; Control "Q" -0683 0395 CTRLR .EQU 12H ; Control "R" -0684 0395 CTRLS .EQU 13H ; Control "S" -0685 0395 CTRLU .EQU 15H ; Control "U" -0686 0395 ESC .EQU 1BH ; Escape -0687 0395 DEL .EQU 7FH ; Delete -0688 0395 -0689 0395 ; BASIC WORK SPACE LOCATIONS -0690 0395 -0691 0395 WRKSPC .EQU 30B0H ; BASIC Work space -0692 0395 USR .EQU WRKSPC+3H ; "USR (x)" jump -0693 0395 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" -0694 0395 OTPORT .EQU WRKSPC+7H ; Port (p) -0695 0395 DIVSUP .EQU WRKSPC+9H ; Division support routine -0696 0395 DIV1 .EQU WRKSPC+0AH ; <- Values -0697 0395 DIV2 .EQU WRKSPC+0EH ; <- to -0698 0395 DIV3 .EQU WRKSPC+12H ; <- be -0699 0395 DIV4 .EQU WRKSPC+15H ; <-inserted -0700 0395 SEED .EQU WRKSPC+17H ; Random number seed -0701 0395 LSTRND .EQU WRKSPC+3AH ; Last random number -0702 0395 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine -0703 0395 INPORT .EQU WRKSPC+3FH ; PORT (x) -0704 0395 NULLS .EQU WRKSPC+41H ; Number of nulls -0705 0395 LWIDTH .EQU WRKSPC+42H ; Terminal width -0706 0395 COMMAN .EQU WRKSPC+43H ; Width for commas -0707 0395 NULFLG .EQU WRKSPC+44H ; Null after input byte flag -0708 0395 CTLOFG .EQU WRKSPC+45H ; Control "O" flag -0709 0395 LINESC .EQU WRKSPC+46H ; Lines counter -0710 0395 LINESN .EQU WRKSPC+48H ; Lines number -0711 0395 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum -0712 0395 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine -0713 0395 BRKFLG .EQU WRKSPC+4DH ; Break flag -0714 0395 RINPUT .EQU WRKSPC+4EH ; Input reflection -0715 0395 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) -0716 0395 PSET .EQU WRKSPC+54H ; "SET" reflection -0717 0395 RESET .EQU WRKSPC+57H ; "RESET" reflection -0718 0395 STRSPC .EQU WRKSPC+5AH ; Bottom of string space -0719 0395 LINEAT .EQU WRKSPC+5CH ; Current line number -0720 0395 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program -0721 0395 BUFFER .EQU WRKSPC+61H ; Input buffer -0722 0395 STACK .EQU WRKSPC+66H ; Initial stack -0723 0395 CURPOS .EQU WRKSPC+0ABH ; Character position on line -0724 0395 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag -0725 0395 TYPE .EQU WRKSPC+0ADH ; Data type flag -0726 0395 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag -0727 0395 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM -0728 0395 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer -0729 0395 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool -0730 0395 TMPSTR .EQU WRKSPC+0BFH ; Temporary string -0731 0395 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space -0732 0395 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL -0733 0395 LOOPST .EQU WRKSPC+0C7H ; First statement of loop -0734 0395 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item -0735 0395 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag -0736 0395 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered -0737 0395 READFG .EQU WRKSPC+0CDH ; Read/Input flag -0738 0395 BRKLIN .EQU WRKSPC+0CEH ; Line of break -0739 0395 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL -0740 0395 ERRLIN .EQU WRKSPC+0D2H ; Line of error -0741 0395 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue -0742 0395 PROGND .EQU WRKSPC+0D6H ; End of program -0743 0395 VAREND .EQU WRKSPC+0D8H ; End of variables -0744 0395 ARREND .EQU WRKSPC+0DAH ; End of arrays -0745 0395 NXTDAT .EQU WRKSPC+0DCH ; Next data item -0746 0395 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument -0747 0395 FNARG .EQU WRKSPC+0E0H ; FN argument value -0748 0395 FPREG .EQU WRKSPC+0E4H ; Floating point register -0749 0395 FPEXP .EQU FPREG+3 ; Floating point exponent -0750 0395 SGNRES .EQU WRKSPC+0E8H ; Sign of result -0751 0395 PBUFF .EQU WRKSPC+0E9H ; Number print buffer -0752 0395 MULVAL .EQU WRKSPC+0F6H ; Multiplier -0753 0395 PROGST .EQU WRKSPC+0F9H ; Start of program text area -0754 0395 STLOOK .EQU WRKSPC+15DH ; Start of memory test -0755 0395 -0756 0395 ; BASIC ERROR CODE VALUES -0757 0395 -0758 0395 NF .EQU 00H ; NEXT without FOR -0759 0395 SN .EQU 02H ; Syntax error -0760 0395 RG .EQU 04H ; RETURN without GOSUB -0761 0395 OD .EQU 06H ; Out of DATA -0762 0395 FC .EQU 08H ; Function call error -0763 0395 OV .EQU 0AH ; Overflow -0764 0395 OM .EQU 0CH ; Out of memory -0765 0395 UL .EQU 0EH ; Undefined line number -0766 0395 BS .EQU 10H ; Bad subscript -0767 0395 DD .EQU 12H ; Re-DIMensioned array -0768 0395 DZ .EQU 14H ; Division by zero (/0) -0769 0395 ID .EQU 16H ; Illegal direct -0770 0395 TM .EQU 18H ; Type miss-match -0771 0395 OS .EQU 1AH ; Out of string space -0772 0395 LS .EQU 1CH ; String too long -0773 0395 ST .EQU 1EH ; String formula too complex -0774 0395 CN .EQU 20H ; Can't CONTinue -0775 0395 UF .EQU 22H ; UnDEFined FN function -0776 0395 MO .EQU 24H ; Missing operand -0777 0395 HX .EQU 26H ; HEX error -0778 0395 BN .EQU 28H ; BIN error -0779 0395 -0780 0395 ; .ORG 00396H -0781 0395 -0782 0395 C3 9B 03 COLD: JP STARTB ; Jump for cold start -0783 0398 C3 39 04 WARM: JP WARMST ; Jump for warm start -0784 039B STARTB: -0785 039B DD 21 00 00 LD IX,0 ; Flag cold start -0786 039F C3 A6 03 JP CSTART ; Jump to initialise -0787 03A2 -0788 03A2 4C 0C .WORD DEINT ; Get integer -32768 to 32767 -0789 03A4 C2 13 .WORD ABPASS ; Return integer in AB -0790 03A6 -0791 03A6 -0792 03A6 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM -0793 03A9 F9 LD SP,HL ; Set up a temporary stack -0794 03AA C3 E1 1F JP INITST ; Go to initialise -0795 03AD -0796 03AD 11 73 06 INIT: LD DE,INITAB ; Initialise workspace -0797 03B0 06 63 LD B,INITBE-INITAB+3; Bytes to copy -0798 03B2 21 B0 30 LD HL,WRKSPC ; Into workspace RAM -0799 03B5 1A COPY: LD A,(DE) ; Get source -0800 03B6 77 LD (HL),A ; To destination -0801 03B7 23 INC HL ; Next destination -0802 03B8 13 INC DE ; Next source -0803 03B9 05 DEC B ; Count bytes -0804 03BA C2 B5 03 JP NZ,COPY ; More to move -0805 03BD F9 LD SP,HL ; Temporary stack -0806 03BE CD 74 08 CALL CLREG ; Clear registers and stack -0807 03C1 CD 42 0E CALL PRNTCRLF ; Output CRLF -0808 03C4 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer -0809 03C7 32 A9 31 LD (PROGST),A ; Initialise program area -0810 03CA 21 88 04 MSIZE: LD HL,MEMMSG ; Point to message -0811 03CD CD E0 14 CALL PRS ; Output "Memory size" -0812 03D0 CD 91 08 CALL PROMPT ; Get input with '?' -0813 03D3 CD 9A 0B CALL GETCHR ; Get next character -0814 03D6 B7 OR A ; Set flags -0815 03D7 C2 EF 03 JP NZ,TSTMEM ; If number - Test if RAM there -0816 03DA 21 0D 32 LD HL,STLOOK ; Point to start of RAM -0817 03DD 23 MLOOP: INC HL ; Next byte -0818 03DE 7C LD A,H ; Above address FFFF ? -0819 03DF B5 OR L -0820 03E0 CA 01 04 JP Z,SETTOP ; Yes - 64K RAM -0821 03E3 7E LD A,(HL) ; Get contents -0822 03E4 47 LD B,A ; Save it -0823 03E5 2F CPL ; Flip all bits -0824 03E6 77 LD (HL),A ; Put it back -0825 03E7 BE CP (HL) ; RAM there if same -0826 03E8 70 LD (HL),B ; Restore old contents -0827 03E9 CA DD 03 JP Z,MLOOP ; If RAM - test next byte -0828 03EC C3 01 04 JP SETTOP ; Top of RAM found -0829 03EF -0830 03EF CD 66 0C TSTMEM: CALL ATOH ; Get high memory into DE -0831 03F2 B7 OR A ; Set flags on last byte -0832 03F3 C2 42 07 JP NZ,SNERR ; ?SN Error if bad character -0833 03F6 EB EX DE,HL ; Address into HL -0834 03F7 2B DEC HL ; Back one byte -0835 03F8 3E D9 LD A,11011001B ; Test byte -0836 03FA 46 LD B,(HL) ; Get old contents -0837 03FB 77 LD (HL),A ; Load test byte -0838 03FC BE CP (HL) ; RAM there if same -0839 03FD 70 LD (HL),B ; Restore old contents -0840 03FE C2 CA 03 JP NZ,MSIZE ; Ask again if no RAM -0841 0401 -0842 0401 2B SETTOP: DEC HL ; Back one byte -0843 0402 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM -0844 0405 CD 0A 0A CALL CPDEHL ; Compare DE with HL -0845 0408 DA CA 03 JP C,MSIZE ; Ask again if not enough RAM -0846 040B 11 CE FF LD DE,0-50 ; 50 Bytes string space -0847 040E 22 5F 31 LD (LSTRAM),HL ; Save last available RAM -0848 0411 19 ADD HL,DE ; Allocate string space -0849 0412 22 0A 31 LD (STRSPC),HL ; Save string space -0850 0415 CD 4F 08 CALL CLRPTR ; Clear program area -0851 0418 2A 0A 31 LD HL,(STRSPC) ; Get end of memory -0852 041B 11 EF FF LD DE,0-17 ; Offset for free bytes -0853 041E 19 ADD HL,DE ; Adjust HL -0854 041F 11 A9 31 LD DE,PROGST ; Start of program text -0855 0422 7D LD A,L ; Get LSB -0856 0423 93 SUB E ; Adjust it -0857 0424 6F LD L,A ; Re-save -0858 0425 7C LD A,H ; Get MSB -0859 0426 9A SBC A,D ; Adjust it -0860 0427 67 LD H,A ; Re-save -0861 0428 E5 PUSH HL ; Save bytes free -0862 0429 21 51 04 LD HL,SIGNON ; Sign-on message -0863 042C CD E0 14 CALL PRS ; Output string -0864 042F E1 POP HL ; Get bytes free back -0865 0430 CD 83 1B CALL PRNTHL ; Output amount of free memory -0866 0433 21 42 04 LD HL,BFREE ; " Bytes free" message -0867 0436 CD E0 14 CALL PRS ; Output string -0868 0439 -0869 0439 31 16 31 WARMST: LD SP,STACK ; Temporary stack -0870 043C CD 74 08 BRKRET: CALL CLREG ; Clear registers and stack -0871 043F C3 8D 07 JP PRNTOK ; Go to get command line -0872 0442 -0873 0442 204279746573BFREE: .BYTE " Bytes free",CR,LF,0,0 -0873 0448 20667265650D0A0000 -0874 0451 -0875 0451 5A3830204241SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF -0875 0457 5349432056657220342E37620D0A -0876 0465 436F70797269 .BYTE "Copyright ",40,"C",41 -0876 046B 67687420284329 -0877 0472 203139373820 .BYTE " 1978 by Microsoft",CR,LF,0,0 -0877 0478 6279204D6963726F736F66740D0A0000 -0878 0488 -0879 0488 4D656D6F7279MEMMSG: .BYTE "Memory top",0 -0879 048E 20746F7000 -0880 0493 -0881 0493 ; FUNCTION ADDRESS TABLE -0882 0493 -0883 0493 F8 19 FNCTAB: .WORD SGN -0884 0495 BC 1A .WORD INT -0885 0497 0E 1A .WORD ABS -0886 0499 B3 30 .WORD USR -0887 049B A0 13 .WORD FRE -0888 049D 25 17 .WORD INP -0889 049F CE 13 .WORD POS -0890 04A1 82 1C .WORD SQR -0891 04A3 61 1D .WORD RND -0892 04A5 9D 18 .WORD LOG -0893 04A7 D0 1C .WORD EXP -0894 04A9 D6 1D .WORD COS -0895 04AB DC 1D .WORD SIN -0896 04AD 3D 1E .WORD TAN -0897 04AF 52 1E .WORD ATN -0898 04B1 79 17 .WORD PEEK -0899 04B3 BD 1E .WORD DEEK -0900 04B5 01 31 .WORD POINT -0901 04B7 52 16 .WORD LEN -0902 04B9 6A 14 .WORD STR -0903 04BB EC 16 .WORD VAL -0904 04BD 61 16 .WORD ASC -0905 04BF 72 16 .WORD CHR -0906 04C1 DF 1E .WORD HEX -0907 04C3 72 1F .WORD BIN -0908 04C5 82 16 .WORD LEFT -0909 04C7 B2 16 .WORD RIGHT -0910 04C9 BC 16 .WORD MID -0911 04CB -0912 04CB ; RESERVED WORD LIST -0913 04CB -0914 04CB C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" -0915 04CE C6 4F 52 .BYTE 'F'+80H,"OR" -0916 04D1 CE 45 58 54 .BYTE 'N'+80H,"EXT" -0917 04D5 C4 41 54 41 .BYTE 'D'+80H,"ATA" -0918 04D9 C94E505554 .BYTE 'I'+80H,"NPUT" -0919 04DE C4 49 4D .BYTE 'D'+80H,"IM" -0920 04E1 D2 45 41 44 .BYTE 'R'+80H,"EAD" -0921 04E5 CC 45 54 .BYTE 'L'+80H,"ET" -0922 04E8 C7 4F 54 4F .BYTE 'G'+80H,"OTO" -0923 04EC D2 55 4E .BYTE 'R'+80H,"UN" -0924 04EF C9 46 .BYTE 'I'+80H,"F" -0925 04F1 D24553544F52 .BYTE 'R'+80H,"ESTORE" -0925 04F7 45 -0926 04F8 C74F535542 .BYTE 'G'+80H,"OSUB" -0927 04FD D2455455524E .BYTE 'R'+80H,"ETURN" -0928 0503 D2 45 4D .BYTE 'R'+80H,"EM" -0929 0506 D3 54 4F 50 .BYTE 'S'+80H,"TOP" -0930 050A CF 55 54 .BYTE 'O'+80H,"UT" -0931 050D CF 4E .BYTE 'O'+80H,"N" -0932 050F CE 55 4C 4C .BYTE 'N'+80H,"ULL" -0933 0513 D7 41 49 54 .BYTE 'W'+80H,"AIT" -0934 0517 C4 45 46 .BYTE 'D'+80H,"EF" -0935 051A D0 4F 4B 45 .BYTE 'P'+80H,"OKE" -0936 051E C4 4F 4B 45 .BYTE 'D'+80H,"OKE" -0937 0522 D3435245454E .BYTE 'S'+80H,"CREEN" -0938 0528 CC494E4553 .BYTE 'L'+80H,"INES" -0939 052D C3 4C 53 .BYTE 'C'+80H,"LS" -0940 0530 D749445448 .BYTE 'W'+80H,"IDTH" -0941 0535 CD4F4E49544F .BYTE 'M'+80H,"ONITOR" -0941 053B 52 -0942 053C D3 45 54 .BYTE 'S'+80H,"ET" -0943 053F D245534554 .BYTE 'R'+80H,"ESET" -0944 0544 D052494E54 .BYTE 'P'+80H,"RINT" -0945 0549 C3 4F 4E 54 .BYTE 'C'+80H,"ONT" -0946 054D CC 49 53 54 .BYTE 'L'+80H,"IST" -0947 0551 C34C454152 .BYTE 'C'+80H,"LEAR" -0948 0556 C34C4F4144 .BYTE 'C'+80H,"LOAD" -0949 055B C353415645 .BYTE 'C'+80H,"SAVE" -0950 0560 CE 45 57 .BYTE 'N'+80H,"EW" -0951 0563 -0952 0563 D4 41 42 28 .BYTE 'T'+80H,"AB(" -0953 0567 D4 4F .BYTE 'T'+80H,"O" -0954 0569 C6 4E .BYTE 'F'+80H,"N" -0955 056B D3 50 43 28 .BYTE 'S'+80H,"PC(" -0956 056F D4 48 45 4E .BYTE 'T'+80H,"HEN" -0957 0573 CE 4F 54 .BYTE 'N'+80H,"OT" -0958 0576 D3 54 45 50 .BYTE 'S'+80H,"TEP" -0959 057A -0960 057A AB .BYTE '+'+80H -0961 057B AD .BYTE '-'+80H -0962 057C AA .BYTE '*'+80H -0963 057D AF .BYTE '/'+80H -0964 057E DE .BYTE '^'+80H -0965 057F C1 4E 44 .BYTE 'A'+80H,"ND" -0966 0582 CF 52 .BYTE 'O'+80H,"R" -0967 0584 BE .BYTE '>'+80H -0968 0585 BD .BYTE '='+80H -0969 0586 BC .BYTE '<'+80H -0970 0587 -0971 0587 D3 47 4E .BYTE 'S'+80H,"GN" -0972 058A C9 4E 54 .BYTE 'I'+80H,"NT" -0973 058D C1 42 53 .BYTE 'A'+80H,"BS" -0974 0590 D5 53 52 .BYTE 'U'+80H,"SR" -0975 0593 C6 52 45 .BYTE 'F'+80H,"RE" -0976 0596 C9 4E 50 .BYTE 'I'+80H,"NP" -0977 0599 D0 4F 53 .BYTE 'P'+80H,"OS" -0978 059C D3 51 52 .BYTE 'S'+80H,"QR" -0979 059F D2 4E 44 .BYTE 'R'+80H,"ND" -0980 05A2 CC 4F 47 .BYTE 'L'+80H,"OG" -0981 05A5 C5 58 50 .BYTE 'E'+80H,"XP" -0982 05A8 C3 4F 53 .BYTE 'C'+80H,"OS" -0983 05AB D3 49 4E .BYTE 'S'+80H,"IN" -0984 05AE D4 41 4E .BYTE 'T'+80H,"AN" -0985 05B1 C1 54 4E .BYTE 'A'+80H,"TN" -0986 05B4 D0 45 45 4B .BYTE 'P'+80H,"EEK" -0987 05B8 C4 45 45 4B .BYTE 'D'+80H,"EEK" -0988 05BC D04F494E54 .BYTE 'P'+80H,"OINT" -0989 05C1 CC 45 4E .BYTE 'L'+80H,"EN" -0990 05C4 D3 54 52 24 .BYTE 'S'+80H,"TR$" -0991 05C8 D6 41 4C .BYTE 'V'+80H,"AL" -0992 05CB C1 53 43 .BYTE 'A'+80H,"SC" -0993 05CE C3 48 52 24 .BYTE 'C'+80H,"HR$" -0994 05D2 C8 45 58 24 .BYTE 'H'+80H,"EX$" -0995 05D6 C2 49 4E 24 .BYTE 'B'+80H,"IN$" -0996 05DA CC45465424 .BYTE 'L'+80H,"EFT$" -0997 05DF D24947485424 .BYTE 'R'+80H,"IGHT$" -0998 05E5 CD 49 44 24 .BYTE 'M'+80H,"ID$" -0999 05E9 80 .BYTE 80H ; End of list marker -1000 05EA -1001 05EA ; KEYWORD ADDRESS TABLE -1002 05EA -1003 05EA E4 0B WORDTB: .WORD PEND -1004 05EC E1 0A .WORD FOR -1005 05EE BC 0F .WORD NEXT -1006 05F0 31 0D .WORD DATA -1007 05F2 C3 0E .WORD INPUT -1008 05F4 F8 11 .WORD DIM -1009 05F6 F2 0E .WORD READ -1010 05F8 48 0D .WORD LET -1011 05FA EE 0C .WORD GOTO -1012 05FC D1 0C .WORD RUN -1013 05FE C0 0D .WORD IF -1014 0600 AA 0B .WORD RESTOR -1015 0602 DD 0C .WORD GOSUB -1016 0604 0C 0D .WORD RETURN -1017 0606 33 0D .WORD REM -1018 0608 E2 0B .WORD STOP -1019 060A 31 17 .WORD POUT -1020 060C A2 0D .WORD ON -1021 060E 23 0C .WORD NULL -1022 0610 37 17 .WORD WAIT -1023 0612 D6 13 .WORD DEF -1024 0614 80 17 .WORD POKE -1025 0616 C8 1E .WORD DOKE -1026 0618 33 0D .WORD REM -1027 061A AE 1E .WORD LINES -1028 061C A1 1E .WORD CLS -1029 061E A6 1E .WORD WIDTH -1030 0620 DE 1F .WORD MONITR -1031 0622 04 31 .WORD PSET -1032 0624 07 31 .WORD RESET -1033 0626 E4 0D .WORD PRINT -1034 0628 10 0C .WORD CONT -1035 062A 56 0A .WORD LIST -1036 062C 8B 0C .WORD CLEAR -1037 062E 33 0D .WORD REM -1038 0630 33 0D .WORD REM -1039 0632 4E 08 .WORD NEW -1040 0634 -1041 0634 ; RESERVED WORD TOKEN VALUES -1042 0634 -1043 0634 ZEND .EQU 080H ; END -1044 0634 ZFOR .EQU 081H ; FOR -1045 0634 ZDATA .EQU 083H ; DATA -1046 0634 ZGOTO .EQU 088H ; GOTO -1047 0634 ZGOSUB .EQU 08CH ; GOSUB -1048 0634 ZREM .EQU 08EH ; REM -1049 0634 ZPRINT .EQU 09EH ; PRINT -1050 0634 ZNEW .EQU 0A4H ; NEW -1051 0634 -1052 0634 ZTAB .EQU 0A5H ; TAB -1053 0634 ZTO .EQU 0A6H ; TO -1054 0634 ZFN .EQU 0A7H ; FN -1055 0634 ZSPC .EQU 0A8H ; SPC -1056 0634 ZTHEN .EQU 0A9H ; THEN -1057 0634 ZNOT .EQU 0AAH ; NOT -1058 0634 ZSTEP .EQU 0ABH ; STEP -1059 0634 -1060 0634 ZPLUS .EQU 0ACH ; + -1061 0634 ZMINUS .EQU 0ADH ; - -1062 0634 ZTIMES .EQU 0AEH ; * -1063 0634 ZDIV .EQU 0AFH ; / -1064 0634 ZOR .EQU 0B2H ; OR -1065 0634 ZGTR .EQU 0B3H ; > -1066 0634 ZEQUAL .EQU 0B4H ; M -1067 0634 ZLTH .EQU 0B5H ; < -1068 0634 ZSGN .EQU 0B6H ; SGN -1069 0634 ZPOINT .EQU 0C7H ; POINT -1070 0634 ZLEFT .EQU 0CDH +2 ; LEFT$ -1071 0634 -1072 0634 ; ARITHMETIC PRECEDENCE TABLE -1073 0634 -1074 0634 79 PRITAB: .BYTE 79H ; Precedence value -1075 0635 6A 1B .WORD PADD ; FPREG = + FPREG -1076 0637 -1077 0637 79 .BYTE 79H ; Precedence value -1078 0638 9E 17 .WORD PSUB ; FPREG = - FPREG -1079 063A -1080 063A 7C .BYTE 7CH ; Precedence value -1081 063B DC 18 .WORD MULT ; PPREG = * FPREG -1082 063D -1083 063D 7C .BYTE 7CH ; Precedence value -1084 063E 3D 19 .WORD DIV ; FPREG = / FPREG -1085 0640 -1086 0640 7F .BYTE 7FH ; Precedence value -1087 0641 8B 1C .WORD POWER ; FPREG = ^ FPREG -1088 0643 -1089 0643 50 .BYTE 50H ; Precedence value -1090 0644 51 11 .WORD PAND ; FPREG = AND FPREG -1091 0646 -1092 0646 46 .BYTE 46H ; Precedence value -1093 0647 50 11 .WORD POR ; FPREG = OR FPREG -1094 0649 -1095 0649 ; BASIC ERROR CODE LIST -1096 0649 -1097 0649 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR -1098 064B 53 4E .BYTE "SN" ; Syntax error -1099 064D 52 47 .BYTE "RG" ; RETURN without GOSUB -1100 064F 4F 44 .BYTE "OD" ; Out of DATA -1101 0651 46 43 .BYTE "FC" ; Illegal function call -1102 0653 4F 56 .BYTE "OV" ; Overflow error -1103 0655 4F 4D .BYTE "OM" ; Out of memory -1104 0657 55 4C .BYTE "UL" ; Undefined line -1105 0659 42 53 .BYTE "BS" ; Bad subscript -1106 065B 44 44 .BYTE "DD" ; Re-DIMensioned array -1107 065D 2F 30 .BYTE "/0" ; Division by zero -1108 065F 49 44 .BYTE "ID" ; Illegal direct -1109 0661 54 4D .BYTE "TM" ; Type mis-match -1110 0663 4F 53 .BYTE "OS" ; Out of string space -1111 0665 4C 53 .BYTE "LS" ; String too long -1112 0667 53 54 .BYTE "ST" ; String formula too complex -1113 0669 43 4E .BYTE "CN" ; Can't CONTinue -1114 066B 55 46 .BYTE "UF" ; Undefined FN function -1115 066D 4D 4F .BYTE "MO" ; Missing operand -1116 066F 48 58 .BYTE "HX" ; HEX error -1117 0671 42 4E .BYTE "BN" ; BIN error -1118 0673 -1119 0673 ; INITIALISATION TABLE ------------------------------------------------------- -1120 0673 -1121 0673 C3 39 04 INITAB: JP WARMST ; Warm start jump -1122 0676 C3 61 0C JP FCERR ; "USR (X)" jump (Set to Error) -1123 0679 D3 00 OUT (0),A ; "OUT p,n" skeleton -1124 067B C9 RET -1125 067C D6 00 SUB 0 ; Division support routine -1126 067E 6F LD L,A -1127 067F 7C LD A,H -1128 0680 DE 00 SBC A,0 -1129 0682 67 LD H,A -1130 0683 78 LD A,B -1131 0684 DE 00 SBC A,0 -1132 0686 47 LD B,A -1133 0687 3E 00 LD A,0 -1134 0689 C9 RET -1135 068A 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND -1136 068D 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 -1137 0691 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 -1138 0695 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 -1139 0699 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 -1140 069D 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 -1141 06A1 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 -1142 06A5 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 -1143 06A9 D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 -1144 06AD 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number -1145 06B1 DB 00 IN A,(0) ; INP (x) skeleton -1146 06B3 C9 RET -1147 06B4 01 .BYTE 1 ; POS (x) number (1) -1148 06B5 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) -1149 06B6 1C .BYTE 28 ; Width for commas (3 columns) -1150 06B7 00 .BYTE 0 ; No nulls after input bytes -1151 06B8 00 .BYTE 0 ; Output enabled (^O off) -1152 06B9 14 00 .WORD 20 ; Initial lines counter -1153 06BB 14 00 .WORD 20 ; Initial lines number -1154 06BD 00 00 .WORD 0 ; Array load/save check sum -1155 06BF 00 .BYTE 0 ; Break not by NMI -1156 06C0 00 .BYTE 0 ; Break flag -1157 06C1 C3 87 09 JP TTYLIN ; Input reflection (set to TTY) -1158 06C4 C3 00 00 JP $0000 ; POINT reflection unused -1159 06C7 C3 00 00 JP $0000 ; SET reflection -1160 06CA C3 00 00 JP $0000 ; RESET reflection -1161 06CD 0D 32 .WORD STLOOK ; Temp string space -1162 06CF FE FF .WORD -2 ; Current line number (cold) -1163 06D1 AA 31 .WORD PROGST+1 ; Start of program text -1164 06D3 INITBE: -1165 06D3 -1166 06D3 ; END OF INITIALISATION TABLE --------------------------------------------------- -1167 06D3 -1168 06D3 204572726F72ERRMSG: .BYTE " Error",0 -1168 06D9 00 -1169 06DA 20696E2000 INMSG: .BYTE " in ",0 -1170 06DF ZERBYT .EQU $-1 ; A zero byte -1171 06DF 4F6B0D0A0000OKMSG: .BYTE "Ok",CR,LF,0,0 -1172 06E5 427265616B00BRKMSG: .BYTE "Break",0 -1173 06EB -1174 06EB 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with -1175 06EE 39 ADD HL,SP ; same index as specified -1176 06EF 7E LOKFOR: LD A,(HL) ; Get block ID -1177 06F0 23 INC HL ; Point to index address -1178 06F1 FE 81 CP ZFOR ; Is it a "FOR" token -1179 06F3 C0 RET NZ ; No - exit -1180 06F4 4E LD C,(HL) ; BC = Address of "FOR" index -1181 06F5 23 INC HL -1182 06F6 46 LD B,(HL) -1183 06F7 23 INC HL ; Point to sign of STEP -1184 06F8 E5 PUSH HL ; Save pointer to sign -1185 06F9 69 LD L,C ; HL = address of "FOR" index -1186 06FA 60 LD H,B -1187 06FB 7A LD A,D ; See if an index was specified -1188 06FC B3 OR E ; DE = 0 if no index specified -1189 06FD EB EX DE,HL ; Specified index into HL -1190 06FE CA 05 07 JP Z,INDFND ; Skip if no index given -1191 0701 EB EX DE,HL ; Index back into DE -1192 0702 CD 0A 0A CALL CPDEHL ; Compare index with one given -1193 0705 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block -1194 0708 E1 POP HL ; Restore pointer to sign -1195 0709 C8 RET Z ; Return if block found -1196 070A 09 ADD HL,BC ; Point to next block -1197 070B C3 EF 06 JP LOKFOR ; Keep on looking -1198 070E -1199 070E CD 28 07 MOVUP: CALL ENFMEM ; See if enough memory -1200 0711 C5 MOVSTR: PUSH BC ; Save end of source -1201 0712 E3 EX (SP),HL ; Swap source and dest" end -1202 0713 C1 POP BC ; Get end of destination -1203 0714 CD 0A 0A MOVLP: CALL CPDEHL ; See if list moved -1204 0717 7E LD A,(HL) ; Get byte -1205 0718 02 LD (BC),A ; Move it -1206 0719 C8 RET Z ; Exit if all done -1207 071A 0B DEC BC ; Next byte to move to -1208 071B 2B DEC HL ; Next byte to move -1209 071C C3 14 07 JP MOVLP ; Loop until all bytes moved -1210 071F -1211 071F E5 CHKSTK: PUSH HL ; Save code string address -1212 0720 2A 8A 31 LD HL,(ARREND) ; Lowest free memory -1213 0723 06 00 LD B,0 ; BC = Number of levels to test -1214 0725 09 ADD HL,BC ; 2 Bytes for each level -1215 0726 09 ADD HL,BC -1216 0727 3E .BYTE 3EH ; Skip "PUSH HL" -1217 0728 E5 ENFMEM: PUSH HL ; Save code string address -1218 0729 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM -1219 072B 95 SUB L -1220 072C 6F LD L,A -1221 072D 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM -1222 072F 9C SBC A,H -1223 0730 DA 37 07 JP C,OMERR ; Not enough - ?OM Error -1224 0733 67 LD H,A -1225 0734 39 ADD HL,SP ; Test if stack is overflowed -1226 0735 E1 POP HL ; Restore code string address -1227 0736 D8 RET C ; Return if enough mmory -1228 0737 1E 0C OMERR: LD E,OM ; ?OM Error -1229 0739 C3 56 07 JP ERROR -1230 073C -1231 073C 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item -1232 073F 22 0C 31 LD (LINEAT),HL ; Save as current line -1233 0742 1E 02 SNERR: LD E,SN ; ?SN Error -1234 0744 01 .BYTE 01H ; Skip "LD E,DZ" -1235 0745 1E 14 DZERR: LD E,DZ ; ?/0 Error -1236 0747 01 .BYTE 01H ; Skip "LD E,NF" -1237 0748 1E 00 NFERR: LD E,NF ; ?NF Error -1238 074A 01 .BYTE 01H ; Skip "LD E,DD" -1239 074B 1E 12 DDERR: LD E,DD ; ?DD Error -1240 074D 01 .BYTE 01H ; Skip "LD E,UF" -1241 074E 1E 22 UFERR: LD E,UF ; ?UF Error -1242 0750 01 .BYTE 01H ; Skip "LD E,OV -1243 0751 1E 0A OVERR: LD E,OV ; ?OV Error -1244 0753 01 .BYTE 01H ; Skip "LD E,TM" -1245 0754 1E 18 TMERR: LD E,TM ; ?TM Error -1246 0756 -1247 0756 CD 74 08 ERROR: CALL CLREG ; Clear registers and stack -1248 0759 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) -1249 075C CD 35 0E CALL STTLIN ; Start new line -1250 075F 21 49 06 LD HL,ERRORS ; Point to error codes -1251 0762 57 LD D,A ; D = 0 (A is 0) -1252 0763 3E 3F LD A,'?' -1253 0765 CD 1B 0A CALL OUTC ; Output '?' -1254 0768 19 ADD HL,DE ; Offset to correct error code -1255 0769 7E LD A,(HL) ; First character -1256 076A CD 1B 0A CALL OUTC ; Output it -1257 076D CD 9A 0B CALL GETCHR ; Get next character -1258 0770 CD 1B 0A CALL OUTC ; Output it -1259 0773 21 D3 06 LD HL,ERRMSG ; "Error" message -1260 0776 CD E0 14 ERRIN: CALL PRS ; Output message -1261 0779 2A 0C 31 LD HL,(LINEAT) ; Get line of error -1262 077C 11 FE FF LD DE,-2 ; Cold start error if -2 -1263 077F CD 0A 0A CALL CPDEHL ; See if cold start error -1264 0782 CA A6 03 JP Z,CSTART ; Cold start error - Restart -1265 0785 7C LD A,H ; Was it a direct error? -1266 0786 A5 AND L ; Line = -1 if direct error -1267 0787 3C INC A -1268 0788 C4 7B 1B CALL NZ,LINEIN ; No - output line of error -1269 078B 3E .BYTE 3EH ; Skip "POP BC" -1270 078C C1 POPNOK: POP BC ; Drop address in input buffer -1271 078D -1272 078D AF PRNTOK: XOR A ; Output "Ok" and get command -1273 078E 32 F5 30 LD (CTLOFG),A ; Enable output -1274 0791 CD 35 0E CALL STTLIN ; Start new line -1275 0794 21 DF 06 LD HL,OKMSG ; "Ok" message -1276 0797 CD E0 14 CALL PRS ; Output "Ok" -1277 079A 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode -1278 079D 22 0C 31 LD (LINEAT),HL ; Save as current line -1279 07A0 CD 87 09 CALL GETLIN ; Get an input line -1280 07A3 DA 9A 07 JP C,GETCMD ; Get line again if break -1281 07A6 CD 9A 0B CALL GETCHR ; Get first character -1282 07A9 3C INC A ; Test if end of line -1283 07AA 3D DEC A ; Without affecting Carry -1284 07AB CA 9A 07 JP Z,GETCMD ; Nothing entered - Get another -1285 07AE F5 PUSH AF ; Save Carry status -1286 07AF CD 66 0C CALL ATOH ; Get line number into DE -1287 07B2 D5 PUSH DE ; Save line number -1288 07B3 CD 9E 08 CALL CRUNCH ; Tokenise rest of line -1289 07B6 47 LD B,A ; Length of tokenised line -1290 07B7 D1 POP DE ; Restore line number -1291 07B8 F1 POP AF ; Restore Carry -1292 07B9 D2 7A 0B JP NC,EXCUTE ; No line number - Direct mode -1293 07BC D5 PUSH DE ; Save line number -1294 07BD C5 PUSH BC ; Save length of tokenised line -1295 07BE AF XOR A -1296 07BF 32 7C 31 LD (LSTBIN),A ; Clear last byte input -1297 07C2 CD 9A 0B CALL GETCHR ; Get next character -1298 07C5 B7 OR A ; Set flags -1299 07C6 F5 PUSH AF ; And save them -1300 07C7 CD 2E 08 CALL SRCHLN ; Search for line number in DE -1301 07CA DA D3 07 JP C,LINFND ; Jump if line found -1302 07CD F1 POP AF ; Get status -1303 07CE F5 PUSH AF ; And re-save -1304 07CF CA 07 0D JP Z,ULERR ; Nothing after number - Error -1305 07D2 B7 OR A ; Clear Carry -1306 07D3 C5 LINFND: PUSH BC ; Save address of line in prog -1307 07D4 D2 EA 07 JP NC,INEWLN ; Line not found - Insert new -1308 07D7 EB EX DE,HL ; Next line address in DE -1309 07D8 2A 86 31 LD HL,(PROGND) ; End of program -1310 07DB 1A SFTPRG: LD A,(DE) ; Shift rest of program down -1311 07DC 02 LD (BC),A -1312 07DD 03 INC BC ; Next destination -1313 07DE 13 INC DE ; Next source -1314 07DF CD 0A 0A CALL CPDEHL ; All done? -1315 07E2 C2 DB 07 JP NZ,SFTPRG ; More to do -1316 07E5 60 LD H,B ; HL - New end of program -1317 07E6 69 LD L,C -1318 07E7 22 86 31 LD (PROGND),HL ; Update end of program -1319 07EA -1320 07EA D1 INEWLN: POP DE ; Get address of line, -1321 07EB F1 POP AF ; Get status -1322 07EC CA 11 08 JP Z,SETPTR ; No text - Set up pointers -1323 07EF 2A 86 31 LD HL,(PROGND) ; Get end of program -1324 07F2 E3 EX (SP),HL ; Get length of input line -1325 07F3 C1 POP BC ; End of program to BC -1326 07F4 09 ADD HL,BC ; Find new end -1327 07F5 E5 PUSH HL ; Save new end -1328 07F6 CD 0E 07 CALL MOVUP ; Make space for line -1329 07F9 E1 POP HL ; Restore new end -1330 07FA 22 86 31 LD (PROGND),HL ; Update end of program pointer -1331 07FD EB EX DE,HL ; Get line to move up in HL -1332 07FE 74 LD (HL),H ; Save MSB -1333 07FF D1 POP DE ; Get new line number -1334 0800 23 INC HL ; Skip pointer -1335 0801 23 INC HL -1336 0802 73 LD (HL),E ; Save LSB of line number -1337 0803 23 INC HL -1338 0804 72 LD (HL),D ; Save MSB of line number -1339 0805 23 INC HL ; To first byte in line -1340 0806 11 11 31 LD DE,BUFFER ; Copy buffer to program -1341 0809 1A MOVBUF: LD A,(DE) ; Get source -1342 080A 77 LD (HL),A ; Save destinations -1343 080B 23 INC HL ; Next source -1344 080C 13 INC DE ; Next destination -1345 080D B7 OR A ; Done? -1346 080E C2 09 08 JP NZ,MOVBUF ; No - Repeat -1347 0811 CD 5A 08 SETPTR: CALL RUNFST ; Set line pointers -1348 0814 23 INC HL ; To LSB of pointer -1349 0815 EB EX DE,HL ; Address to DE -1350 0816 62 PTRLP: LD H,D ; Address to HL -1351 0817 6B LD L,E -1352 0818 7E LD A,(HL) ; Get LSB of pointer -1353 0819 23 INC HL ; To MSB of pointer -1354 081A B6 OR (HL) ; Compare with MSB pointer -1355 081B CA 9A 07 JP Z,GETCMD ; Get command line if end -1356 081E 23 INC HL ; To LSB of line number -1357 081F 23 INC HL ; Skip line number -1358 0820 23 INC HL ; Point to first byte in line -1359 0821 AF XOR A ; Looking for 00 byte -1360 0822 BE FNDEND: CP (HL) ; Found end of line? -1361 0823 23 INC HL ; Move to next byte -1362 0824 C2 22 08 JP NZ,FNDEND ; No - Keep looking -1363 0827 EB EX DE,HL ; Next line address to HL -1364 0828 73 LD (HL),E ; Save LSB of pointer -1365 0829 23 INC HL -1366 082A 72 LD (HL),D ; Save MSB of pointer -1367 082B C3 16 08 JP PTRLP ; Do next line -1368 082E -1369 082E 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text -1370 0831 44 SRCHLP: LD B,H ; BC = Address to look at -1371 0832 4D LD C,L -1372 0833 7E LD A,(HL) ; Get address of next line -1373 0834 23 INC HL -1374 0835 B6 OR (HL) ; End of program found? -1375 0836 2B DEC HL -1376 0837 C8 RET Z ; Yes - Line not found -1377 0838 23 INC HL -1378 0839 23 INC HL -1379 083A 7E LD A,(HL) ; Get LSB of line number -1380 083B 23 INC HL -1381 083C 66 LD H,(HL) ; Get MSB of line number -1382 083D 6F LD L,A -1383 083E CD 0A 0A CALL CPDEHL ; Compare with line in DE -1384 0841 60 LD H,B ; HL = Start of this line -1385 0842 69 LD L,C -1386 0843 7E LD A,(HL) ; Get LSB of next line address -1387 0844 23 INC HL -1388 0845 66 LD H,(HL) ; Get MSB of next line address -1389 0846 6F LD L,A ; Next line to HL -1390 0847 3F CCF -1391 0848 C8 RET Z ; Lines found - Exit -1392 0849 3F CCF -1393 084A D0 RET NC ; Line not found,at line after -1394 084B C3 31 08 JP SRCHLP ; Keep looking -1395 084E -1396 084E C0 NEW: RET NZ ; Return if any more on line -1397 084F 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program -1398 0852 AF XOR A ; Set program area to empty -1399 0853 77 LD (HL),A ; Save LSB = 00 -1400 0854 23 INC HL -1401 0855 77 LD (HL),A ; Save MSB = 00 -1402 0856 23 INC HL -1403 0857 22 86 31 LD (PROGND),HL ; Set program end -1404 085A -1405 085A 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables -1406 085D 2B DEC HL -1407 085E -1408 085E 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables -1409 0861 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -1410 0864 22 73 31 LD (STRBOT),HL ; Clear string space -1411 0867 AF XOR A -1412 0868 CD AA 0B CALL RESTOR ; Reset DATA pointers -1413 086B 2A 86 31 LD HL,(PROGND) ; Get end of program -1414 086E 22 88 31 LD (VAREND),HL ; Clear variables -1415 0871 22 8A 31 LD (ARREND),HL ; Clear arrays -1416 0874 -1417 0874 C1 CLREG: POP BC ; Save return address -1418 0875 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN -1419 0878 F9 LD SP,HL ; Set stack -1420 0879 21 63 31 LD HL,TMSTPL ; Temporary string pool -1421 087C 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr -1422 087F AF XOR A ; A = 00 -1423 0880 6F LD L,A ; HL = 0000 -1424 0881 67 LD H,A -1425 0882 22 84 31 LD (CONTAD),HL ; No CONTinue -1426 0885 32 7B 31 LD (FORFLG),A ; Clear FOR flag -1427 0888 22 8E 31 LD (FNRGNM),HL ; Clear FN argument -1428 088B E5 PUSH HL ; HL = 0000 -1429 088C C5 PUSH BC ; Put back return -1430 088D 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN -1431 0890 C9 RET ; Return to execution driver -1432 0891 -1433 0891 3E 3F PROMPT: LD A,'?' ; '?' -1434 0893 CD 1B 0A CALL OUTC ; Output character -1435 0896 3E 20 LD A,' ' ; Space -1436 0898 CD 1B 0A CALL OUTC ; Output character -1437 089B C3 FE 30 JP RINPUT ; Get input line -1438 089E -1439 089E AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER -1440 089F 32 5E 31 LD (DATFLG),A ; Reset literal flag -1441 08A2 0E 05 LD C,2+3 ; 2 byte number and 3 nulls -1442 08A4 11 11 31 LD DE,BUFFER ; Start of input buffer -1443 08A7 7E CRNCLP: LD A,(HL) ; Get byte -1444 08A8 FE 20 CP ' ' ; Is it a space? -1445 08AA CA 26 09 JP Z,MOVDIR ; Yes - Copy direct -1446 08AD 47 LD B,A ; Save character -1447 08AE FE 22 CP '"' ; Is it a quote? -1448 08B0 CA 46 09 JP Z,CPYLIT ; Yes - Copy literal string -1449 08B3 B7 OR A ; Is it end of buffer? -1450 08B4 CA 4D 09 JP Z,ENDBUF ; Yes - End buffer -1451 08B7 3A 5E 31 LD A,(DATFLG) ; Get data type -1452 08BA B7 OR A ; Literal? -1453 08BB 7E LD A,(HL) ; Get byte to copy -1454 08BC C2 26 09 JP NZ,MOVDIR ; Literal - Copy direct -1455 08BF FE 3F CP '?' ; Is it '?' short for PRINT -1456 08C1 3E 9E LD A,ZPRINT ; "PRINT" token -1457 08C3 CA 26 09 JP Z,MOVDIR ; Yes - replace it -1458 08C6 7E LD A,(HL) ; Get byte again -1459 08C7 FE 30 CP '0' ; Is it less than '0' -1460 08C9 DA D1 08 JP C,FNDWRD ; Yes - Look for reserved words -1461 08CC FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? -1462 08CE DA 26 09 JP C,MOVDIR ; Yes - copy it direct -1463 08D1 D5 FNDWRD: PUSH DE ; Look for reserved words -1464 08D2 11 CA 04 LD DE,WORDS-1 ; Point to table -1465 08D5 C5 PUSH BC ; Save count -1466 08D6 01 22 09 LD BC,RETNAD ; Where to return to -1467 08D9 C5 PUSH BC ; Save return address -1468 08DA 06 7F LD B,ZEND-1 ; First token value -1 -1469 08DC 7E LD A,(HL) ; Get byte -1470 08DD FE 61 CP 'a' ; Less than 'a' ? -1471 08DF DA EA 08 JP C,SEARCH ; Yes - search for words -1472 08E2 FE 7B CP 'z'+1 ; Greater than 'z' ? -1473 08E4 D2 EA 08 JP NC,SEARCH ; Yes - search for words -1474 08E7 E6 5F AND 01011111B ; Force upper case -1475 08E9 77 LD (HL),A ; Replace byte -1476 08EA 4E SEARCH: LD C,(HL) ; Search for a word -1477 08EB EB EX DE,HL -1478 08EC 23 GETNXT: INC HL ; Get next reserved word -1479 08ED B6 OR (HL) ; Start of word? -1480 08EE F2 EC 08 JP P,GETNXT ; No - move on -1481 08F1 04 INC B ; Increment token value -1482 08F2 7E LD A, (HL) ; Get byte from table -1483 08F3 E6 7F AND 01111111B ; Strip bit 7 -1484 08F5 C8 RET Z ; Return if end of list -1485 08F6 B9 CP C ; Same character as in buffer? -1486 08F7 C2 EC 08 JP NZ,GETNXT ; No - get next word -1487 08FA EB EX DE,HL -1488 08FB E5 PUSH HL ; Save start of word -1489 08FC -1490 08FC 13 NXTBYT: INC DE ; Look through rest of word -1491 08FD 1A LD A,(DE) ; Get byte from table -1492 08FE B7 OR A ; End of word ? -1493 08FF FA 1E 09 JP M,MATCH ; Yes - Match found -1494 0902 4F LD C,A ; Save it -1495 0903 78 LD A,B ; Get token value -1496 0904 FE 88 CP ZGOTO ; Is it "GOTO" token ? -1497 0906 C2 0D 09 JP NZ,NOSPC ; No - Don't allow spaces -1498 0909 CD 9A 0B CALL GETCHR ; Get next character -1499 090C 2B DEC HL ; Cancel increment from GETCHR -1500 090D 23 NOSPC: INC HL ; Next byte -1501 090E 7E LD A,(HL) ; Get byte -1502 090F FE 61 CP 'a' ; Less than 'a' ? -1503 0911 DA 16 09 JP C,NOCHNG ; Yes - don't change -1504 0914 E6 5F AND 01011111B ; Make upper case -1505 0916 B9 NOCHNG: CP C ; Same as in buffer ? -1506 0917 CA FC 08 JP Z,NXTBYT ; Yes - keep testing -1507 091A E1 POP HL ; Get back start of word -1508 091B C3 EA 08 JP SEARCH ; Look at next word -1509 091E -1510 091E 48 MATCH: LD C,B ; Word found - Save token value -1511 091F F1 POP AF ; Throw away return -1512 0920 EB EX DE,HL -1513 0921 C9 RET ; Return to "RETNAD" -1514 0922 EB RETNAD: EX DE,HL ; Get address in string -1515 0923 79 LD A,C ; Get token value -1516 0924 C1 POP BC ; Restore buffer length -1517 0925 D1 POP DE ; Get destination address -1518 0926 23 MOVDIR: INC HL ; Next source in buffer -1519 0927 12 LD (DE),A ; Put byte in buffer -1520 0928 13 INC DE ; Move up buffer -1521 0929 0C INC C ; Increment length of buffer -1522 092A D6 3A SUB ':' ; End of statement? -1523 092C CA 34 09 JP Z,SETLIT ; Jump if multi-statement line -1524 092F FE 49 CP ZDATA-3AH ; Is it DATA statement ? -1525 0931 C2 37 09 JP NZ,TSTREM ; No - see if REM -1526 0934 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag -1527 0937 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? -1528 0939 C2 A7 08 JP NZ,CRNCLP ; No - Leave flag -1529 093C 47 LD B,A ; Copy rest of buffer -1530 093D 7E NXTCHR: LD A,(HL) ; Get byte -1531 093E B7 OR A ; End of line ? -1532 093F CA 4D 09 JP Z,ENDBUF ; Yes - Terminate buffer -1533 0942 B8 CP B ; End of statement ? -1534 0943 CA 26 09 JP Z,MOVDIR ; Yes - Get next one -1535 0946 23 CPYLIT: INC HL ; Move up source string -1536 0947 12 LD (DE),A ; Save in destination -1537 0948 0C INC C ; Increment length -1538 0949 13 INC DE ; Move up destination -1539 094A C3 3D 09 JP NXTCHR ; Repeat -1540 094D -1541 094D 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer -1542 0950 12 LD (DE),A ; Mark end of buffer (A = 00) -1543 0951 13 INC DE -1544 0952 12 LD (DE),A ; A = 00 -1545 0953 13 INC DE -1546 0954 12 LD (DE),A ; A = 00 -1547 0955 C9 RET -1548 0956 -1549 0956 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status -1550 0959 B7 OR A ; Is it zero? -1551 095A 3E 00 LD A,0 ; Zero A - Leave flags -1552 095C 32 F4 30 LD (NULFLG),A ; Zero null flag -1553 095F C2 6A 09 JP NZ,ECHDEL ; Set - Echo it -1554 0962 05 DEC B ; Decrement length -1555 0963 CA 87 09 JP Z,GETLIN ; Get line again if empty -1556 0966 CD 1B 0A CALL OUTC ; Output null character -1557 0969 3E .BYTE 3EH ; Skip "DEC B" -1558 096A 05 ECHDEL: DEC B ; Count bytes in buffer -1559 096B 2B DEC HL ; Back space buffer -1560 096C CA 7E 09 JP Z,OTKLN ; No buffer - Try again -1561 096F 7E LD A,(HL) ; Get deleted byte -1562 0970 CD 1B 0A CALL OUTC ; Echo it -1563 0973 C3 90 09 JP MORINP ; Get more input -1564 0976 -1565 0976 05 DELCHR: DEC B ; Count bytes in buffer -1566 0977 2B DEC HL ; Back space buffer -1567 0978 CD 1B 0A CALL OUTC ; Output character in A -1568 097B C2 90 09 JP NZ,MORINP ; Not end - Get more -1569 097E CD 1B 0A OTKLN: CALL OUTC ; Output character in A -1570 0981 CD 42 0E KILIN: CALL PRNTCRLF ; Output CRLF -1571 0984 C3 87 09 JP TTYLIN ; Get line again -1572 0987 -1573 0987 GETLIN: -1574 0987 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character -1575 098A 06 01 LD B,1 ; Set buffer as empty -1576 098C AF XOR A -1577 098D 32 F4 30 LD (NULFLG),A ; Clear null flag -1578 0990 CD 45 0A MORINP: CALL CLOTST ; Get character and test ^O -1579 0993 4F LD C,A ; Save character in C -1580 0994 FE 7F CP DEL ; Delete character? -1581 0996 CA 56 09 JP Z,DODEL ; Yes - Process it -1582 0999 3A F4 30 LD A,(NULFLG) ; Get null flag -1583 099C B7 OR A ; Test null flag status -1584 099D CA A9 09 JP Z,PROCES ; Reset - Process character -1585 09A0 3E 00 LD A,0 ; Set a null -1586 09A2 CD 1B 0A CALL OUTC ; Output null -1587 09A5 AF XOR A ; Clear A -1588 09A6 32 F4 30 LD (NULFLG),A ; Reset null flag -1589 09A9 79 PROCES: LD A,C ; Get character -1590 09AA FE 07 CP CTRLG ; Bell? -1591 09AC CA ED 09 JP Z,PUTCTL ; Yes - Save it -1592 09AF FE 03 CP CTRLC ; Is it control "C"? -1593 09B1 CC 42 0E CALL Z,PRNTCRLF ; Yes - Output CRLF -1594 09B4 37 SCF ; Flag break -1595 09B5 C8 RET Z ; Return if control "C" -1596 09B6 FE 0D CP CR ; Is it enter? -1597 09B8 CA 3D 0E JP Z,ENDINP ; Yes - Terminate input -1598 09BB FE 15 CP CTRLU ; Is it control "U"? -1599 09BD CA 81 09 JP Z,KILIN ; Yes - Get another line -1600 09C0 FE 40 CP '@' ; Is it "kill line"? -1601 09C2 CA 7E 09 JP Z,OTKLN ; Yes - Kill line -1602 09C5 FE 5F CP '_' ; Is it delete? -1603 09C7 CA 76 09 JP Z,DELCHR ; Yes - Delete character -1604 09CA FE 08 CP BKSP ; Is it backspace? -1605 09CC CA 76 09 JP Z,DELCHR ; Yes - Delete character -1606 09CF FE 12 CP CTRLR ; Is it control "R"? -1607 09D1 C2 E8 09 JP NZ,PUTBUF ; No - Put in buffer -1608 09D4 C5 PUSH BC ; Save buffer length -1609 09D5 D5 PUSH DE ; Save DE -1610 09D6 E5 PUSH HL ; Save buffer address -1611 09D7 36 00 LD (HL),0 ; Mark end of buffer -1612 09D9 CD F2 1F CALL OUTNCR ; Output and do CRLF -1613 09DC 21 11 31 LD HL,BUFFER ; Point to buffer start -1614 09DF CD E0 14 CALL PRS ; Output buffer -1615 09E2 E1 POP HL ; Restore buffer address -1616 09E3 D1 POP DE ; Restore DE -1617 09E4 C1 POP BC ; Restore buffer length -1618 09E5 C3 90 09 JP MORINP ; Get another character -1619 09E8 -1620 09E8 FE 20 PUTBUF: CP ' ' ; Is it a control code? -1621 09EA DA 90 09 JP C,MORINP ; Yes - Ignore -1622 09ED 78 PUTCTL: LD A,B ; Get number of bytes in buffer -1623 09EE FE 49 CP 72+1 ; Test for line overflow -1624 09F0 3E 07 LD A,CTRLG ; Set a bell -1625 09F2 D2 02 0A JP NC,OUTNBS ; Ring bell if buffer full -1626 09F5 79 LD A,C ; Get character -1627 09F6 71 LD (HL),C ; Save in buffer -1628 09F7 32 7C 31 LD (LSTBIN),A ; Save last input byte -1629 09FA 23 INC HL ; Move up buffer -1630 09FB 04 INC B ; Increment length -1631 09FC CD 1B 0A OUTIT: CALL OUTC ; Output the character entered -1632 09FF C3 90 09 JP MORINP ; Get another character -1633 0A02 -1634 0A02 CD 1B 0A OUTNBS: CALL OUTC ; Output bell and back over it -1635 0A05 3E 08 LD A,BKSP ; Set back space -1636 0A07 C3 FC 09 JP OUTIT ; Output it and get more -1637 0A0A -1638 0A0A 7C CPDEHL: LD A,H ; Get H -1639 0A0B 92 SUB D ; Compare with D -1640 0A0C C0 RET NZ ; Different - Exit -1641 0A0D 7D LD A,L ; Get L -1642 0A0E 93 SUB E ; Compare with E -1643 0A0F C9 RET ; Return status -1644 0A10 -1645 0A10 7E CHKSYN: LD A,(HL) ; Check syntax of character -1646 0A11 E3 EX (SP),HL ; Address of test byte -1647 0A12 BE CP (HL) ; Same as in code string? -1648 0A13 23 INC HL ; Return address -1649 0A14 E3 EX (SP),HL ; Put it back -1650 0A15 CA 9A 0B JP Z,GETCHR ; Yes - Get next character -1651 0A18 C3 42 07 JP SNERR ; Different - ?SN Error -1652 0A1B -1653 0A1B F5 OUTC: PUSH AF ; Save character -1654 0A1C 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag -1655 0A1F B7 OR A ; Is it set? -1656 0A20 C2 15 15 JP NZ,POPAF ; Yes - don't output -1657 0A23 F1 POP AF ; Restore character -1658 0A24 C5 PUSH BC ; Save buffer length -1659 0A25 F5 PUSH AF ; Save character -1660 0A26 FE 20 CP ' ' ; Is it a control code? -1661 0A28 DA 3F 0A JP C,DINPOS ; Yes - Don't INC POS(X) -1662 0A2B 3A F2 30 LD A,(LWIDTH) ; Get line width -1663 0A2E 47 LD B,A ; To B -1664 0A2F 3A 5B 31 LD A,(CURPOS) ; Get cursor position -1665 0A32 04 INC B ; Width 255? -1666 0A33 CA 3B 0A JP Z,INCLEN ; Yes - No width limit -1667 0A36 05 DEC B ; Restore width -1668 0A37 B8 CP B ; At end of line? -1669 0A38 CC 42 0E CALL Z,PRNTCRLF ; Yes - output CRLF -1670 0A3B 3C INCLEN: INC A ; Move on one character -1671 0A3C 32 5B 31 LD (CURPOS),A ; Save new position -1672 0A3F F1 DINPOS: POP AF ; Restore character -1673 0A40 C1 POP BC ; Restore buffer length -1674 0A41 CD DB 1F CALL MONOUT ; Send it -1675 0A44 C9 RET -1676 0A45 -1677 0A45 CD 9F 1E CLOTST: CALL GETINP ; Get input character -1678 0A48 E6 7F AND 01111111B ; Strip bit 7 -1679 0A4A FE 0F CP CTRLO ; Is it control "O"? -1680 0A4C C0 RET NZ ; No don't flip flag -1681 0A4D 3A F5 30 LD A,(CTLOFG) ; Get flag -1682 0A50 2F CPL ; Flip it -1683 0A51 32 F5 30 LD (CTLOFG),A ; Put it back -1684 0A54 AF XOR A ; Null character -1685 0A55 C9 RET -1686 0A56 -1687 0A56 CD 66 0C LIST: CALL ATOH ; ASCII number to DE -1688 0A59 C0 RET NZ ; Return if anything extra -1689 0A5A C1 POP BC ; Rubbish - Not needed -1690 0A5B CD 2E 08 CALL SRCHLN ; Search for line number in DE -1691 0A5E C5 PUSH BC ; Save address of line -1692 0A5F CD AC 0A CALL SETLIN ; Set up lines counter -1693 0A62 E1 LISTLP: POP HL ; Restore address of line -1694 0A63 4E LD C,(HL) ; Get LSB of next line -1695 0A64 23 INC HL -1696 0A65 46 LD B,(HL) ; Get MSB of next line -1697 0A66 23 INC HL -1698 0A67 78 LD A,B ; BC = 0 (End of program)? -1699 0A68 B1 OR C -1700 0A69 CA 8D 07 JP Z,PRNTOK ; Yes - Go to command mode -1701 0A6C CD B5 0A CALL COUNT ; Count lines -1702 0A6F CD C5 0B CALL TSTBRK ; Test for break key -1703 0A72 C5 PUSH BC ; Save address of next line -1704 0A73 CD 42 0E CALL PRNTCRLF ; Output CRLF -1705 0A76 5E LD E,(HL) ; Get LSB of line number -1706 0A77 23 INC HL -1707 0A78 56 LD D,(HL) ; Get MSB of line number -1708 0A79 23 INC HL -1709 0A7A E5 PUSH HL ; Save address of line start -1710 0A7B EB EX DE,HL ; Line number to HL -1711 0A7C CD 83 1B CALL PRNTHL ; Output line number in decimal -1712 0A7F 3E 20 LD A,' ' ; Space after line number -1713 0A81 E1 POP HL ; Restore start of line address -1714 0A82 CD 1B 0A LSTLP2: CALL OUTC ; Output character in A -1715 0A85 7E LSTLP3: LD A,(HL) ; Get next byte in line -1716 0A86 B7 OR A ; End of line? -1717 0A87 23 INC HL ; To next byte in line -1718 0A88 CA 62 0A JP Z,LISTLP ; Yes - get next line -1719 0A8B F2 82 0A JP P,LSTLP2 ; No token - output it -1720 0A8E D6 7F SUB ZEND-1 ; Find and output word -1721 0A90 4F LD C,A ; Token offset+1 to C -1722 0A91 11 CB 04 LD DE,WORDS ; Reserved word list -1723 0A94 1A FNDTOK: LD A,(DE) ; Get character in list -1724 0A95 13 INC DE ; Move on to next -1725 0A96 B7 OR A ; Is it start of word? -1726 0A97 F2 94 0A JP P,FNDTOK ; No - Keep looking for word -1727 0A9A 0D DEC C ; Count words -1728 0A9B C2 94 0A JP NZ,FNDTOK ; Not there - keep looking -1729 0A9E E6 7F OUTWRD: AND 01111111B ; Strip bit 7 -1730 0AA0 CD 1B 0A CALL OUTC ; Output first character -1731 0AA3 1A LD A,(DE) ; Get next character -1732 0AA4 13 INC DE ; Move on to next -1733 0AA5 B7 OR A ; Is it end of word? -1734 0AA6 F2 9E 0A JP P,OUTWRD ; No - output the rest -1735 0AA9 C3 85 0A JP LSTLP3 ; Next byte in line -1736 0AAC -1737 0AAC E5 SETLIN: PUSH HL ; Set up LINES counter -1738 0AAD 2A F8 30 LD HL,(LINESN) ; Get LINES number -1739 0AB0 22 F6 30 LD (LINESC),HL ; Save in LINES counter -1740 0AB3 E1 POP HL -1741 0AB4 C9 RET -1742 0AB5 -1743 0AB5 E5 COUNT: PUSH HL ; Save code string address -1744 0AB6 D5 PUSH DE -1745 0AB7 2A F6 30 LD HL,(LINESC) ; Get LINES counter -1746 0ABA 11 FF FF LD DE,-1 -1747 0ABD ED 5A ADC HL,DE ; Decrement -1748 0ABF 22 F6 30 LD (LINESC),HL ; Put it back -1749 0AC2 D1 POP DE -1750 0AC3 E1 POP HL ; Restore code string address -1751 0AC4 F0 RET P ; Return if more lines to go -1752 0AC5 E5 PUSH HL ; Save code string address -1753 0AC6 2A F8 30 LD HL,(LINESN) ; Get LINES number -1754 0AC9 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1755 0ACC CD 9F 1E CALL GETINP ; Get input character -1756 0ACF FE 03 CP CTRLC ; Is it control "C"? -1757 0AD1 CA D8 0A JP Z,RSLNBK ; Yes - Reset LINES and break -1758 0AD4 E1 POP HL ; Restore code string address -1759 0AD5 C3 B5 0A JP COUNT ; Keep on counting -1760 0AD8 -1761 0AD8 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number -1762 0ADB 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1763 0ADE C3 3C 04 JP BRKRET ; Go and output "Break" -1764 0AE1 -1765 0AE1 3E 64 FOR: LD A,64H ; Flag "FOR" assignment -1766 0AE3 32 7B 31 LD (FORFLG),A ; Save "FOR" flag -1767 0AE6 CD 48 0D CALL LET ; Set up initial index -1768 0AE9 C1 POP BC ; Drop RETurn address -1769 0AEA E5 PUSH HL ; Save code string address -1770 0AEB CD 31 0D CALL DATA ; Get next statement address -1771 0AEE 22 77 31 LD (LOOPST),HL ; Save it for start of loop -1772 0AF1 21 02 00 LD HL,2 ; Offset for "FOR" block -1773 0AF4 39 ADD HL,SP ; Point to it -1774 0AF5 CD EF 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block -1775 0AF8 D1 POP DE ; Get code string address -1776 0AF9 C2 11 0B JP NZ,FORFND ; No nesting found -1777 0AFC 09 ADD HL,BC ; Move into "FOR" block -1778 0AFD D5 PUSH DE ; Save code string address -1779 0AFE 2B DEC HL -1780 0AFF 56 LD D,(HL) ; Get MSB of loop statement -1781 0B00 2B DEC HL -1782 0B01 5E LD E,(HL) ; Get LSB of loop statement -1783 0B02 23 INC HL -1784 0B03 23 INC HL -1785 0B04 E5 PUSH HL ; Save block address -1786 0B05 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement -1787 0B08 CD 0A 0A CALL CPDEHL ; Compare the FOR loops -1788 0B0B E1 POP HL ; Restore block address -1789 0B0C C2 F5 0A JP NZ,FORSLP ; Different FORs - Find another -1790 0B0F D1 POP DE ; Restore code string address -1791 0B10 F9 LD SP,HL ; Remove all nested loops -1792 0B11 -1793 0B11 EB FORFND: EX DE,HL ; Code string address to HL -1794 0B12 0E 08 LD C,8 -1795 0B14 CD 1F 07 CALL CHKSTK ; Check for 8 levels of stack -1796 0B17 E5 PUSH HL ; Save code string address -1797 0B18 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop -1798 0B1B E3 EX (SP),HL ; Save and restore code string -1799 0B1C E5 PUSH HL ; Re-save code string address -1800 0B1D 2A 0C 31 LD HL,(LINEAT) ; Get current line number -1801 0B20 E3 EX (SP),HL ; Save and restore code string -1802 0B21 CD 0A 10 CALL TSTNUM ; Make sure it's a number -1803 0B24 CD 10 0A CALL CHKSYN ; Make sure "TO" is next -1804 0B27 A6 .BYTE ZTO ; "TO" token -1805 0B28 CD 07 10 CALL GETNUM ; Get "TO" expression value -1806 0B2B E5 PUSH HL ; Save code string address -1807 0B2C CD 35 1A CALL BCDEFP ; Move "TO" value to BCDE -1808 0B2F E1 POP HL ; Restore code string address -1809 0B30 C5 PUSH BC ; Save "TO" value in block -1810 0B31 D5 PUSH DE -1811 0B32 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) -1812 0B35 51 LD D,C ; C=0 -1813 0B36 5A LD E,D ; D=0 -1814 0B37 7E LD A,(HL) ; Get next byte in code string -1815 0B38 FE AB CP ZSTEP ; See if "STEP" is stated -1816 0B3A 3E 01 LD A,1 ; Sign of step = 1 -1817 0B3C C2 4D 0B JP NZ,SAVSTP ; No STEP given - Default to 1 -1818 0B3F CD 9A 0B CALL GETCHR ; Jump over "STEP" token -1819 0B42 CD 07 10 CALL GETNUM ; Get step value -1820 0B45 E5 PUSH HL ; Save code string address -1821 0B46 CD 35 1A CALL BCDEFP ; Move STEP to BCDE -1822 0B49 CD E9 19 CALL TSTSGN ; Test sign of FPREG -1823 0B4C E1 POP HL ; Restore code string address -1824 0B4D C5 SAVSTP: PUSH BC ; Save the STEP value in block -1825 0B4E D5 PUSH DE -1826 0B4F F5 PUSH AF ; Save sign of STEP -1827 0B50 33 INC SP ; Don't save flags -1828 0B51 E5 PUSH HL ; Save code string address -1829 0B52 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable -1830 0B55 E3 EX (SP),HL ; Save and restore code string -1831 0B56 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker -1832 0B58 C5 PUSH BC ; Save it -1833 0B59 33 INC SP ; Don't save C -1834 0B5A -1835 0B5A CD C5 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break -1836 0B5D 22 7E 31 LD (BRKLIN),HL ; Save code address for break -1837 0B60 7E LD A,(HL) ; Get next byte in code string -1838 0B61 FE 3A CP ':' ; Multi statement line? -1839 0B63 CA 7A 0B JP Z,EXCUTE ; Yes - Execute it -1840 0B66 B7 OR A ; End of line? -1841 0B67 C2 42 07 JP NZ,SNERR ; No - Syntax error -1842 0B6A 23 INC HL ; Point to address of next line -1843 0B6B 7E LD A,(HL) ; Get LSB of line pointer -1844 0B6C 23 INC HL -1845 0B6D B6 OR (HL) ; Is it zero (End of prog)? -1846 0B6E CA EC 0B JP Z,ENDPRG ; Yes - Terminate execution -1847 0B71 23 INC HL ; Point to line number -1848 0B72 5E LD E,(HL) ; Get LSB of line number -1849 0B73 23 INC HL -1850 0B74 56 LD D,(HL) ; Get MSB of line number -1851 0B75 EB EX DE,HL ; Line number to HL -1852 0B76 22 0C 31 LD (LINEAT),HL ; Save as current line number -1853 0B79 EB EX DE,HL ; Line number back to DE -1854 0B7A CD 9A 0B EXCUTE: CALL GETCHR ; Get key word -1855 0B7D 11 5A 0B LD DE,RUNCNT ; Where to RETurn to -1856 0B80 D5 PUSH DE ; Save for RETurn -1857 0B81 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT -1858 0B82 D6 80 ONJMP: SUB ZEND ; Is it a token? -1859 0B84 DA 48 0D JP C,LET ; No - try to assign it -1860 0B87 FE 25 CP ZNEW+1-ZEND ; END to NEW ? -1861 0B89 D2 42 07 JP NC,SNERR ; Not a key word - ?SN Error -1862 0B8C 07 RLCA ; Double it -1863 0B8D 4F LD C,A ; BC = Offset into table -1864 0B8E 06 00 LD B,0 -1865 0B90 EB EX DE,HL ; Save code string address -1866 0B91 21 EA 05 LD HL,WORDTB ; Keyword address table -1867 0B94 09 ADD HL,BC ; Point to routine address -1868 0B95 4E LD C,(HL) ; Get LSB of routine address -1869 0B96 23 INC HL -1870 0B97 46 LD B,(HL) ; Get MSB of routine address -1871 0B98 C5 PUSH BC ; Save routine address -1872 0B99 EB EX DE,HL ; Restore code string address -1873 0B9A -1874 0B9A 23 GETCHR: INC HL ; Point to next character -1875 0B9B 7E LD A,(HL) ; Get next code string byte -1876 0B9C FE 3A CP ':' ; Z if ':' -1877 0B9E D0 RET NC ; NC if > "9" -1878 0B9F FE 20 CP ' ' -1879 0BA1 CA 9A 0B JP Z,GETCHR ; Skip over spaces -1880 0BA4 FE 30 CP '0' -1881 0BA6 3F CCF ; NC if < '0' -1882 0BA7 3C INC A ; Test for zero - Leave carry -1883 0BA8 3D DEC A ; Z if Null -1884 0BA9 C9 RET -1885 0BAA -1886 0BAA EB RESTOR: EX DE,HL ; Save code string address -1887 0BAB 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -1888 0BAE CA BF 0B JP Z,RESTNL ; Just RESTORE - reset pointer -1889 0BB1 EB EX DE,HL ; Restore code string address -1890 0BB2 CD 66 0C CALL ATOH ; Get line number to DE -1891 0BB5 E5 PUSH HL ; Save code string address -1892 0BB6 CD 2E 08 CALL SRCHLN ; Search for line number in DE -1893 0BB9 60 LD H,B ; HL = Address of line -1894 0BBA 69 LD L,C -1895 0BBB D1 POP DE ; Restore code string address -1896 0BBC D2 07 0D JP NC,ULERR ; ?UL Error if not found -1897 0BBF 2B RESTNL: DEC HL ; Byte before DATA statement -1898 0BC0 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer -1899 0BC3 EB EX DE,HL ; Restore code string address -1900 0BC4 C9 RET -1901 0BC5 -1902 0BC5 -1903 0BC5 DF TSTBRK: RST 18H ; Check input status -1904 0BC6 C8 RET Z ; No key, go back -1905 0BC7 D7 RST 10H ; Get the key into A -1906 0BC8 FE 1B CP ESC ; Escape key? -1907 0BCA 28 11 JR Z,BRK ; Yes, break -1908 0BCC FE 03 CP CTRLC ; -1909 0BCE 28 0D JR Z,BRK ; Yes, break -1910 0BD0 FE 13 CP CTRLS ; Stop scrolling? -1911 0BD2 C0 RET NZ ; Other key, ignore -1912 0BD3 -1913 0BD3 -1914 0BD3 D7 STALL: RST 10H ; Wait for key -1915 0BD4 FE 11 CP CTRLQ ; Resume scrolling? -1916 0BD6 C8 RET Z ; Release the chokehold -1917 0BD7 FE 03 CP CTRLC ; Second break? -1918 0BD9 28 07 JR Z,STOP ; Break during hold exits prog -1919 0BDB 18 F6 JR STALL ; Loop until or -1920 0BDD -1921 0BDD 3E FF BRK LD A,$FF ; Set BRKFLG -1922 0BDF 32 FD 30 LD (BRKFLG),A ; Store it -1923 0BE2 -1924 0BE2 -1925 0BE2 C0 STOP: RET NZ ; Exit if anything else -1926 0BE3 F6 .BYTE 0F6H ; Flag "STOP" -1927 0BE4 C0 PEND: RET NZ ; Exit if anything else -1928 0BE5 22 7E 31 LD (BRKLIN),HL ; Save point of break -1929 0BE8 21 .BYTE 21H ; Skip "OR 11111111B" -1930 0BE9 F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted -1931 0BEB C1 POP BC ; Return not needed and more -1932 0BEC 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number -1933 0BEF F5 PUSH AF ; Save STOP / END status -1934 0BF0 7D LD A,L ; Is it direct break? -1935 0BF1 A4 AND H -1936 0BF2 3C INC A ; Line is -1 if direct break -1937 0BF3 CA FF 0B JP Z,NOLIN ; Yes - No line number -1938 0BF6 22 82 31 LD (ERRLIN),HL ; Save line of break -1939 0BF9 2A 7E 31 LD HL,(BRKLIN) ; Get point of break -1940 0BFC 22 84 31 LD (CONTAD),HL ; Save point to CONTinue -1941 0BFF AF NOLIN: XOR A -1942 0C00 32 F5 30 LD (CTLOFG),A ; Enable output -1943 0C03 CD 35 0E CALL STTLIN ; Start a new line -1944 0C06 F1 POP AF ; Restore STOP / END status -1945 0C07 21 E5 06 LD HL,BRKMSG ; "Break" message -1946 0C0A C2 76 07 JP NZ,ERRIN ; "in line" wanted? -1947 0C0D C3 8D 07 JP PRNTOK ; Go to command mode -1948 0C10 -1949 0C10 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address -1950 0C13 7C LD A,H ; Is it zero? -1951 0C14 B5 OR L -1952 0C15 1E 20 LD E,CN ; ?CN Error -1953 0C17 CA 56 07 JP Z,ERROR ; Yes - output "?CN Error" -1954 0C1A EB EX DE,HL ; Save code string address -1955 0C1B 2A 82 31 LD HL,(ERRLIN) ; Get line of last break -1956 0C1E 22 0C 31 LD (LINEAT),HL ; Set up current line number -1957 0C21 EB EX DE,HL ; Restore code string address -1958 0C22 C9 RET ; CONTinue where left off -1959 0C23 -1960 0C23 CD 68 17 NULL: CALL GETINT ; Get integer 0-255 -1961 0C26 C0 RET NZ ; Return if bad value -1962 0C27 32 F1 30 LD (NULLS),A ; Set nulls number -1963 0C2A C9 RET -1964 0C2B -1965 0C2B -1966 0C2B E5 ACCSUM: PUSH HL ; Save address in array -1967 0C2C 2A FA 30 LD HL,(CHKSUM) ; Get check sum -1968 0C2F 06 00 LD B,0 ; BC - Value of byte -1969 0C31 4F LD C,A -1970 0C32 09 ADD HL,BC ; Add byte to check sum -1971 0C33 22 FA 30 LD (CHKSUM),HL ; Re-save check sum -1972 0C36 E1 POP HL ; Restore address in array -1973 0C37 C9 RET -1974 0C38 -1975 0C38 7E CHKLTR: LD A,(HL) ; Get byte -1976 0C39 FE 41 CP 'A' ; < 'a' ? -1977 0C3B D8 RET C ; Carry set if not letter -1978 0C3C FE 5B CP 'Z'+1 ; > 'z' ? -1979 0C3E 3F CCF -1980 0C3F C9 RET ; Carry set if not letter -1981 0C40 -1982 0C40 CD 9A 0B FPSINT: CALL GETCHR ; Get next character -1983 0C43 CD 07 10 POSINT: CALL GETNUM ; Get integer 0 to 32767 -1984 0C46 CD E9 19 DEPINT: CALL TSTSGN ; Test sign of FPREG -1985 0C49 FA 61 0C JP M,FCERR ; Negative - ?FC Error -1986 0C4C 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE -1987 0C4F FE 90 CP 80H+16 ; Exponent in range (16 bits)? -1988 0C51 DA 91 1A JP C,FPINT ; Yes - convert it -1989 0C54 01 80 90 LD BC,9080H ; BCDE = -32768 -1990 0C57 11 00 00 LD DE,0000 -1991 0C5A E5 PUSH HL ; Save code string address -1992 0C5B CD 64 1A CALL CMPNUM ; Compare FPREG with BCDE -1993 0C5E E1 POP HL ; Restore code string address -1994 0C5F 51 LD D,C ; MSB to D -1995 0C60 C8 RET Z ; Return if in range -1996 0C61 1E 08 FCERR: LD E,FC ; ?FC Error -1997 0C63 C3 56 07 JP ERROR ; Output error- -1998 0C66 -1999 0C66 2B ATOH: DEC HL ; ASCII number to DE binary -2000 0C67 11 00 00 GETLN: LD DE,0 ; Get number to DE -2001 0C6A CD 9A 0B GTLNLP: CALL GETCHR ; Get next character -2002 0C6D D0 RET NC ; Exit if not a digit -2003 0C6E E5 PUSH HL ; Save code string address -2004 0C6F F5 PUSH AF ; Save digit -2005 0C70 21 98 19 LD HL,65529/10 ; Largest number 65529 -2006 0C73 CD 0A 0A CALL CPDEHL ; Number in range? -2007 0C76 DA 42 07 JP C,SNERR ; No - ?SN Error -2008 0C79 62 LD H,D ; HL = Number -2009 0C7A 6B LD L,E -2010 0C7B 19 ADD HL,DE ; Times 2 -2011 0C7C 29 ADD HL,HL ; Times 4 -2012 0C7D 19 ADD HL,DE ; Times 5 -2013 0C7E 29 ADD HL,HL ; Times 10 -2014 0C7F F1 POP AF ; Restore digit -2015 0C80 D6 30 SUB '0' ; Make it 0 to 9 -2016 0C82 5F LD E,A ; DE = Value of digit -2017 0C83 16 00 LD D,0 -2018 0C85 19 ADD HL,DE ; Add to number -2019 0C86 EB EX DE,HL ; Number to DE -2020 0C87 E1 POP HL ; Restore code string address -2021 0C88 C3 6A 0C JP GTLNLP ; Go to next character -2022 0C8B -2023 0C8B CA 5E 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters -2024 0C8E CD 43 0C CALL POSINT ; Get integer 0 to 32767 to DE -2025 0C91 2B DEC HL ; Cancel increment -2026 0C92 CD 9A 0B CALL GETCHR ; Get next character -2027 0C95 E5 PUSH HL ; Save code string address -2028 0C96 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -2029 0C99 CA AE 0C JP Z,STORED ; No value given - Use stored -2030 0C9C E1 POP HL ; Restore code string address -2031 0C9D CD 10 0A CALL CHKSYN ; Check for comma -2032 0CA0 2C .BYTE ',' -2033 0CA1 D5 PUSH DE ; Save number -2034 0CA2 CD 43 0C CALL POSINT ; Get integer 0 to 32767 -2035 0CA5 2B DEC HL ; Cancel increment -2036 0CA6 CD 9A 0B CALL GETCHR ; Get next character -2037 0CA9 C2 42 07 JP NZ,SNERR ; ?SN Error if more on line -2038 0CAC E3 EX (SP),HL ; Save code string address -2039 0CAD EB EX DE,HL ; Number to DE -2040 0CAE 7D STORED: LD A,L ; Get LSB of new RAM top -2041 0CAF 93 SUB E ; Subtract LSB of string space -2042 0CB0 5F LD E,A ; Save LSB -2043 0CB1 7C LD A,H ; Get MSB of new RAM top -2044 0CB2 9A SBC A,D ; Subtract MSB of string space -2045 0CB3 57 LD D,A ; Save MSB -2046 0CB4 DA 37 07 JP C,OMERR ; ?OM Error if not enough mem -2047 0CB7 E5 PUSH HL ; Save RAM top -2048 0CB8 2A 86 31 LD HL,(PROGND) ; Get program end -2049 0CBB 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM -2050 0CBE 09 ADD HL,BC ; Get lowest address -2051 0CBF CD 0A 0A CALL CPDEHL ; Enough memory? -2052 0CC2 D2 37 07 JP NC,OMERR ; No - ?OM Error -2053 0CC5 EB EX DE,HL ; RAM top to HL -2054 0CC6 22 0A 31 LD (STRSPC),HL ; Set new string space -2055 0CC9 E1 POP HL ; End of memory to use -2056 0CCA 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM -2057 0CCD E1 POP HL ; Restore code string address -2058 0CCE C3 5E 08 JP INTVAR ; Initialise variables -2059 0CD1 -2060 0CD1 CA 5A 08 RUN: JP Z,RUNFST ; RUN from start if just RUN -2061 0CD4 CD 5E 08 CALL INTVAR ; Initialise variables -2062 0CD7 01 5A 0B LD BC,RUNCNT ; Execution driver loop -2063 0CDA C3 ED 0C JP RUNLIN ; RUN from line number -2064 0CDD -2065 0CDD 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed -2066 0CDF CD 1F 07 CALL CHKSTK ; Check for 3 levels of stack -2067 0CE2 C1 POP BC ; Get return address -2068 0CE3 E5 PUSH HL ; Save code string for RETURN -2069 0CE4 E5 PUSH HL ; And for GOSUB routine -2070 0CE5 2A 0C 31 LD HL,(LINEAT) ; Get current line -2071 0CE8 E3 EX (SP),HL ; Into stack - Code string out -2072 0CE9 3E 8C LD A,ZGOSUB ; "GOSUB" token -2073 0CEB F5 PUSH AF ; Save token -2074 0CEC 33 INC SP ; Don't save flags -2075 0CED -2076 0CED C5 RUNLIN: PUSH BC ; Save return address -2077 0CEE CD 66 0C GOTO: CALL ATOH ; ASCII number to DE binary -2078 0CF1 CD 33 0D CALL REM ; Get end of line -2079 0CF4 E5 PUSH HL ; Save end of line -2080 0CF5 2A 0C 31 LD HL,(LINEAT) ; Get current line -2081 0CF8 CD 0A 0A CALL CPDEHL ; Line after current? -2082 0CFB E1 POP HL ; Restore end of line -2083 0CFC 23 INC HL ; Start of next line -2084 0CFD DC 31 08 CALL C,SRCHLP ; Line is after current line -2085 0D00 D4 2E 08 CALL NC,SRCHLN ; Line is before current line -2086 0D03 60 LD H,B ; Set up code string address -2087 0D04 69 LD L,C -2088 0D05 2B DEC HL ; Incremented after -2089 0D06 D8 RET C ; Line found -2090 0D07 1E 0E ULERR: LD E,UL ; ?UL Error -2091 0D09 C3 56 07 JP ERROR ; Output error message -2092 0D0C -2093 0D0C C0 RETURN: RET NZ ; Return if not just RETURN -2094 0D0D 16 FF LD D,-1 ; Flag "GOSUB" search -2095 0D0F CD EB 06 CALL BAKSTK ; Look "GOSUB" block -2096 0D12 F9 LD SP,HL ; Kill all FORs in subroutine -2097 0D13 FE 8C CP ZGOSUB ; Test for "GOSUB" token -2098 0D15 1E 04 LD E,RG ; ?RG Error -2099 0D17 C2 56 07 JP NZ,ERROR ; Error if no "GOSUB" found -2100 0D1A E1 POP HL ; Get RETURN line number -2101 0D1B 22 0C 31 LD (LINEAT),HL ; Save as current -2102 0D1E 23 INC HL ; Was it from direct statement? -2103 0D1F 7C LD A,H -2104 0D20 B5 OR L ; Return to line -2105 0D21 C2 2B 0D JP NZ,RETLIN ; No - Return to line -2106 0D24 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? -2107 0D27 B7 OR A ; If so buffer is corrupted -2108 0D28 C2 8C 07 JP NZ,POPNOK ; Yes - Go to command mode -2109 0D2B 21 5A 0B RETLIN: LD HL,RUNCNT ; Execution driver loop -2110 0D2E E3 EX (SP),HL ; Into stack - Code string out -2111 0D2F 3E .BYTE 3EH ; Skip "POP HL" -2112 0D30 E1 NXTDTA: POP HL ; Restore code string address -2113 0D31 -2114 0D31 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement -2115 0D33 0E 00 REM: LD C,0 ; 00 End of statement -2116 0D35 06 00 LD B,0 -2117 0D37 79 NXTSTL: LD A,C ; Statement and byte -2118 0D38 48 LD C,B -2119 0D39 47 LD B,A ; Statement end byte -2120 0D3A 7E NXTSTT: LD A,(HL) ; Get byte -2121 0D3B B7 OR A ; End of line? -2122 0D3C C8 RET Z ; Yes - Exit -2123 0D3D B8 CP B ; End of statement? -2124 0D3E C8 RET Z ; Yes - Exit -2125 0D3F 23 INC HL ; Next byte -2126 0D40 FE 22 CP '"' ; Literal string? -2127 0D42 CA 37 0D JP Z,NXTSTL ; Yes - Look for another '"' -2128 0D45 C3 3A 0D JP NXTSTT ; Keep looking -2129 0D48 -2130 0D48 CD FD 11 LET: CALL GETVAR ; Get variable name -2131 0D4B CD 10 0A CALL CHKSYN ; Make sure "=" follows -2132 0D4E B4 .BYTE ZEQUAL ; "=" token -2133 0D4F D5 PUSH DE ; Save address of variable -2134 0D50 3A 5D 31 LD A,(TYPE) ; Get data type -2135 0D53 F5 PUSH AF ; Save type -2136 0D54 CD 19 10 CALL EVAL ; Evaluate expression -2137 0D57 F1 POP AF ; Restore type -2138 0D58 E3 EX (SP),HL ; Save code - Get var addr -2139 0D59 22 7E 31 LD (BRKLIN),HL ; Save address of variable -2140 0D5C 1F RRA ; Adjust type -2141 0D5D CD 0C 10 CALL CHKTYP ; Check types are the same -2142 0D60 CA 9B 0D JP Z,LETNUM ; Numeric - Move value -2143 0D63 E5 LETSTR: PUSH HL ; Save address of string var -2144 0D64 2A 94 31 LD HL,(FPREG) ; Pointer to string entry -2145 0D67 E5 PUSH HL ; Save it on stack -2146 0D68 23 INC HL ; Skip over length -2147 0D69 23 INC HL -2148 0D6A 5E LD E,(HL) ; LSB of string address -2149 0D6B 23 INC HL -2150 0D6C 56 LD D,(HL) ; MSB of string address -2151 0D6D 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -2152 0D70 CD 0A 0A CALL CPDEHL ; Is string before program? -2153 0D73 D2 8A 0D JP NC,CRESTR ; Yes - Create string entry -2154 0D76 2A 0A 31 LD HL,(STRSPC) ; Point to string space -2155 0D79 CD 0A 0A CALL CPDEHL ; Is string literal in program? -2156 0D7C D1 POP DE ; Restore address of string -2157 0D7D D2 92 0D JP NC,MVSTPT ; Yes - Set up pointer -2158 0D80 21 6F 31 LD HL,TMPSTR ; Temporary string pool -2159 0D83 CD 0A 0A CALL CPDEHL ; Is string in temporary pool? -2160 0D86 D2 92 0D JP NC,MVSTPT ; No - Set up pointer -2161 0D89 3E .BYTE 3EH ; Skip "POP DE" -2162 0D8A D1 CRESTR: POP DE ; Restore address of string -2163 0D8B CD 41 16 CALL BAKTMP ; Back to last tmp-str entry -2164 0D8E EB EX DE,HL ; Address of string entry -2165 0D8F CD 7A 14 CALL SAVSTR ; Save string in string area -2166 0D92 CD 41 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry -2167 0D95 E1 POP HL ; Get string pointer -2168 0D96 CD 44 1A CALL DETHL4 ; Move string pointer to var -2169 0D99 E1 POP HL ; Restore code string address -2170 0D9A C9 RET -2171 0D9B -2172 0D9B E5 LETNUM: PUSH HL ; Save address of variable -2173 0D9C CD 41 1A CALL FPTHL ; Move value to variable -2174 0D9F D1 POP DE ; Restore address of variable -2175 0DA0 E1 POP HL ; Restore code string address -2176 0DA1 C9 RET -2177 0DA2 -2178 0DA2 CD 68 17 ON: CALL GETINT ; Get integer 0-255 -2179 0DA5 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token -2180 0DA6 47 LD B,A ; Save in B -2181 0DA7 FE 8C CP ZGOSUB ; "GOSUB" token? -2182 0DA9 CA B1 0D JP Z,ONGO ; Yes - Find line number -2183 0DAC CD 10 0A CALL CHKSYN ; Make sure it's "GOTO" -2184 0DAF 88 .BYTE ZGOTO ; "GOTO" token -2185 0DB0 2B DEC HL ; Cancel increment -2186 0DB1 4B ONGO: LD C,E ; Integer of branch value -2187 0DB2 0D ONGOLP: DEC C ; Count branches -2188 0DB3 78 LD A,B ; Get "GOTO" or "GOSUB" token -2189 0DB4 CA 82 0B JP Z,ONJMP ; Go to that line if right one -2190 0DB7 CD 67 0C CALL GETLN ; Get line number to DE -2191 0DBA FE 2C CP ',' ; Another line number? -2192 0DBC C0 RET NZ ; No - Drop through -2193 0DBD C3 B2 0D JP ONGOLP ; Yes - loop -2194 0DC0 -2195 0DC0 CD 19 10 IF: CALL EVAL ; Evaluate expression -2196 0DC3 7E LD A,(HL) ; Get token -2197 0DC4 FE 88 CP ZGOTO ; "GOTO" token? -2198 0DC6 CA CE 0D JP Z,IFGO ; Yes - Get line -2199 0DC9 CD 10 0A CALL CHKSYN ; Make sure it's "THEN" -2200 0DCC A9 .BYTE ZTHEN ; "THEN" token -2201 0DCD 2B DEC HL ; Cancel increment -2202 0DCE CD 0A 10 IFGO: CALL TSTNUM ; Make sure it's numeric -2203 0DD1 CD E9 19 CALL TSTSGN ; Test state of expression -2204 0DD4 CA 33 0D JP Z,REM ; False - Drop through -2205 0DD7 CD 9A 0B CALL GETCHR ; Get next character -2206 0DDA DA EE 0C JP C,GOTO ; Number - GOTO that line -2207 0DDD C3 81 0B JP IFJMP ; Otherwise do statement -2208 0DE0 -2209 0DE0 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs -2210 0DE1 CD 9A 0B CALL GETCHR ; Get next character -2211 0DE4 CA 42 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT -2212 0DE7 C8 PRNTLP: RET Z ; End of list - Exit -2213 0DE8 FE A5 CP ZTAB ; "TAB(" token? -2214 0DEA CA 75 0E JP Z,DOTAB ; Yes - Do TAB routine -2215 0DED FE A8 CP ZSPC ; "SPC(" token? -2216 0DEF CA 75 0E JP Z,DOTAB ; Yes - Do SPC routine -2217 0DF2 E5 PUSH HL ; Save code string address -2218 0DF3 FE 2C CP ',' ; Comma? -2219 0DF5 CA 5E 0E JP Z,DOCOM ; Yes - Move to next zone -2220 0DF8 FE 3B CP 59 ;";" ; Semi-colon? -2221 0DFA CA 98 0E JP Z,NEXITM ; Do semi-colon routine -2222 0DFD C1 POP BC ; Code string address to BC -2223 0DFE CD 19 10 CALL EVAL ; Evaluate expression -2224 0E01 E5 PUSH HL ; Save code string address -2225 0E02 3A 5D 31 LD A,(TYPE) ; Get variable type -2226 0E05 B7 OR A ; Is it a string variable? -2227 0E06 C2 2E 0E JP NZ,PRNTST ; Yes - Output string contents -2228 0E09 CD 8E 1B CALL NUMASC ; Convert number to text -2229 0E0C CD 9E 14 CALL CRTST ; Create temporary string -2230 0E0F 36 20 LD (HL),' ' ; Followed by a space -2231 0E11 2A 94 31 LD HL,(FPREG) ; Get length of output -2232 0E14 34 INC (HL) ; Plus 1 for the space -2233 0E15 2A 94 31 LD HL,(FPREG) ; < Not needed > -2234 0E18 3A F2 30 LD A,(LWIDTH) ; Get width of line -2235 0E1B 47 LD B,A ; To B -2236 0E1C 04 INC B ; Width 255 (No limit)? -2237 0E1D CA 2A 0E JP Z,PRNTNB ; Yes - Output number string -2238 0E20 04 INC B ; Adjust it -2239 0E21 3A 5B 31 LD A,(CURPOS) ; Get cursor position -2240 0E24 86 ADD A,(HL) ; Add length of string -2241 0E25 3D DEC A ; Adjust it -2242 0E26 B8 CP B ; Will output fit on this line? -2243 0E27 D4 42 0E CALL NC,PRNTCRLF ; No - CRLF first -2244 0E2A CD E3 14 PRNTNB: CALL PRS1 ; Output string at (HL) -2245 0E2D AF XOR A ; Skip CALL by setting 'z' flag -2246 0E2E C4 E3 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) -2247 0E31 E1 POP HL ; Restore code string address -2248 0E32 C3 E0 0D JP MRPRNT ; See if more to PRINT -2249 0E35 -2250 0E35 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line -2251 0E38 B7 OR A ; Already at start? -2252 0E39 C8 RET Z ; Yes - Do nothing -2253 0E3A C3 42 0E JP PRNTCRLF ; Start a new line -2254 0E3D -2255 0E3D 36 00 ENDINP: LD (HL),0 ; Mark end of buffer -2256 0E3F 21 10 31 LD HL,BUFFER-1 ; Point to buffer -2257 0E42 3E 0D PRNTCRLF: LD A,CR ; Load a CR -2258 0E44 CD 1B 0A CALL OUTC ; Output character -2259 0E47 3E 0A LD A,LF ; Load a LF -2260 0E49 CD 1B 0A CALL OUTC ; Output character -2261 0E4C AF DONULL: XOR A ; Set to position 0 -2262 0E4D 32 5B 31 LD (CURPOS),A ; Store it -2263 0E50 3A F1 30 LD A,(NULLS) ; Get number of nulls -2264 0E53 3D NULLP: DEC A ; Count them -2265 0E54 C8 RET Z ; Return if done -2266 0E55 F5 PUSH AF ; Save count -2267 0E56 AF XOR A ; Load a null -2268 0E57 CD 1B 0A CALL OUTC ; Output it -2269 0E5A F1 POP AF ; Restore count -2270 0E5B C3 53 0E JP NULLP ; Keep counting -2271 0E5E -2272 0E5E 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width -2273 0E61 47 LD B,A ; Save in B -2274 0E62 3A 5B 31 LD A,(CURPOS) ; Get current position -2275 0E65 B8 CP B ; Within the limit? -2276 0E66 D4 42 0E CALL NC,PRNTCRLF ; No - output CRLF -2277 0E69 D2 98 0E JP NC,NEXITM ; Get next item -2278 0E6C D6 0E ZONELP: SUB 14 ; Next zone of 14 characters -2279 0E6E D2 6C 0E JP NC,ZONELP ; Repeat if more zones -2280 0E71 2F CPL ; Number of spaces to output -2281 0E72 C3 8D 0E JP ASPCS ; Output them -2282 0E75 -2283 0E75 F5 DOTAB: PUSH AF ; Save token -2284 0E76 CD 65 17 CALL FNDNUM ; Evaluate expression -2285 0E79 CD 10 0A CALL CHKSYN ; Make sure ")" follows -2286 0E7C 29 .BYTE ")" -2287 0E7D 2B DEC HL ; Back space on to ")" -2288 0E7E F1 POP AF ; Restore token -2289 0E7F D6 A8 SUB ZSPC ; Was it "SPC(" ? -2290 0E81 E5 PUSH HL ; Save code string address -2291 0E82 CA 88 0E JP Z,DOSPC ; Yes - Do 'E' spaces -2292 0E85 3A 5B 31 LD A,(CURPOS) ; Get current position -2293 0E88 2F DOSPC: CPL ; Number of spaces to print to -2294 0E89 83 ADD A,E ; Total number to print -2295 0E8A D2 98 0E JP NC,NEXITM ; TAB < Current POS(X) -2296 0E8D 3C ASPCS: INC A ; Output A spaces -2297 0E8E 47 LD B,A ; Save number to print -2298 0E8F 3E 20 LD A,' ' ; Space -2299 0E91 CD 1B 0A SPCLP: CALL OUTC ; Output character in A -2300 0E94 05 DEC B ; Count them -2301 0E95 C2 91 0E JP NZ,SPCLP ; Repeat if more -2302 0E98 E1 NEXITM: POP HL ; Restore code string address -2303 0E99 CD 9A 0B CALL GETCHR ; Get next character -2304 0E9C C3 E7 0D JP PRNTLP ; More to print -2305 0E9F -2306 0E9F 3F5265646F20REDO: .BYTE "?Redo from start",CR,LF,0 -2306 0EA5 66726F6D2073746172740D0A00 -2307 0EB2 -2308 0EB2 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? -2309 0EB5 B7 OR A -2310 0EB6 C2 3C 07 JP NZ,DATSNR ; READ - ?SN Error -2311 0EB9 C1 POP BC ; Throw away code string addr -2312 0EBA 21 9F 0E LD HL,REDO ; "Redo from start" message -2313 0EBD CD E0 14 CALL PRS ; Output string -2314 0EC0 C3 8D 08 JP DOAGN ; Do last INPUT again -2315 0EC3 -2316 0EC3 CD 4B 14 INPUT: CALL IDTEST ; Test for illegal direct -2317 0EC6 7E LD A,(HL) ; Get character after "INPUT" -2318 0EC7 FE 22 CP '"' ; Is there a prompt string? -2319 0EC9 3E 00 LD A,0 ; Clear A and leave flags -2320 0ECB 32 F5 30 LD (CTLOFG),A ; Enable output -2321 0ECE C2 DD 0E JP NZ,NOPMPT ; No prompt - get input -2322 0ED1 CD 9F 14 CALL QTSTR ; Get string terminated by '"' -2323 0ED4 CD 10 0A CALL CHKSYN ; Check for ';' after prompt -2324 0ED7 3B .BYTE ';' -2325 0ED8 E5 PUSH HL ; Save code string address -2326 0ED9 CD E3 14 CALL PRS1 ; Output prompt string -2327 0EDC 3E .BYTE 3EH ; Skip "PUSH HL" -2328 0EDD E5 NOPMPT: PUSH HL ; Save code string address -2329 0EDE CD 91 08 CALL PROMPT ; Get input with "? " prompt -2330 0EE1 C1 POP BC ; Restore code string address -2331 0EE2 DA E9 0B JP C,INPBRK ; Break pressed - Exit -2332 0EE5 23 INC HL ; Next byte -2333 0EE6 7E LD A,(HL) ; Get it -2334 0EE7 B7 OR A ; End of line? -2335 0EE8 2B DEC HL ; Back again -2336 0EE9 C5 PUSH BC ; Re-save code string address -2337 0EEA CA 30 0D JP Z,NXTDTA ; Yes - Find next DATA stmt -2338 0EED 36 2C LD (HL),',' ; Store comma as separator -2339 0EEF C3 F7 0E JP NXTITM ; Get next item -2340 0EF2 -2341 0EF2 E5 READ: PUSH HL ; Save code string address -2342 0EF3 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement -2343 0EF6 F6 .BYTE 0F6H ; Flag "READ" -2344 0EF7 AF NXTITM: XOR A ; Flag "INPUT" -2345 0EF8 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag -2346 0EFB E3 EX (SP),HL ; Get code str' , Save pointer -2347 0EFC C3 03 0F JP GTVLUS ; Get values -2348 0EFF -2349 0EFF CD 10 0A NEDMOR: CALL CHKSYN ; Check for comma between items -2350 0F02 2C .BYTE ',' -2351 0F03 CD FD 11 GTVLUS: CALL GETVAR ; Get variable name -2352 0F06 E3 EX (SP),HL ; Save code str" , Get pointer -2353 0F07 D5 PUSH DE ; Save variable address -2354 0F08 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte -2355 0F09 FE 2C CP ',' ; Comma? -2356 0F0B CA 2B 0F JP Z,ANTVLU ; Yes - Get another value -2357 0F0E 3A 7D 31 LD A,(READFG) ; Is it READ? -2358 0F11 B7 OR A -2359 0F12 C2 98 0F JP NZ,FDTLP ; Yes - Find next DATA stmt -2360 0F15 3E 3F LD A,'?' ; More INPUT needed -2361 0F17 CD 1B 0A CALL OUTC ; Output character -2362 0F1A CD 91 08 CALL PROMPT ; Get INPUT with prompt -2363 0F1D D1 POP DE ; Variable address -2364 0F1E C1 POP BC ; Code string address -2365 0F1F DA E9 0B JP C,INPBRK ; Break pressed -2366 0F22 23 INC HL ; Point to next DATA byte -2367 0F23 7E LD A,(HL) ; Get byte -2368 0F24 B7 OR A ; Is it zero (No input) ? -2369 0F25 2B DEC HL ; Back space INPUT pointer -2370 0F26 C5 PUSH BC ; Save code string address -2371 0F27 CA 30 0D JP Z,NXTDTA ; Find end of buffer -2372 0F2A D5 PUSH DE ; Save variable address -2373 0F2B 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type -2374 0F2E B7 OR A ; Is it numeric? -2375 0F2F CA 55 0F JP Z,INPBIN ; Yes - Convert to binary -2376 0F32 CD 9A 0B CALL GETCHR ; Get next character -2377 0F35 57 LD D,A ; Save input character -2378 0F36 47 LD B,A ; Again -2379 0F37 FE 22 CP '"' ; Start of literal sting? -2380 0F39 CA 49 0F JP Z,STRENT ; Yes - Create string entry -2381 0F3C 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -2382 0F3F B7 OR A -2383 0F40 57 LD D,A ; Save 00 if "INPUT" -2384 0F41 CA 46 0F JP Z,ITMSEP ; "INPUT" - End with 00 -2385 0F44 16 3A LD D,':' ; "DATA" - End with 00 or ':' -2386 0F46 06 2C ITMSEP: LD B,',' ; Item separator -2387 0F48 2B DEC HL ; Back space for DTSTR -2388 0F49 CD A2 14 STRENT: CALL DTSTR ; Get string terminated by D -2389 0F4C EB EX DE,HL ; String address to DE -2390 0F4D 21 60 0F LD HL,LTSTND ; Where to go after LETSTR -2391 0F50 E3 EX (SP),HL ; Save HL , get input pointer -2392 0F51 D5 PUSH DE ; Save address of string -2393 0F52 C3 63 0D JP LETSTR ; Assign string to variable -2394 0F55 -2395 0F55 CD 9A 0B INPBIN: CALL GETCHR ; Get next character -2396 0F58 CD F0 1A CALL ASCTFP ; Convert ASCII to FP number -2397 0F5B E3 EX (SP),HL ; Save input ptr, Get var addr -2398 0F5C CD 41 1A CALL FPTHL ; Move FPREG to variable -2399 0F5F E1 POP HL ; Restore input pointer -2400 0F60 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs -2401 0F61 CD 9A 0B CALL GETCHR ; Get next character -2402 0F64 CA 6C 0F JP Z,MORDT ; End of line - More needed? -2403 0F67 FE 2C CP ',' ; Another value? -2404 0F69 C2 B2 0E JP NZ,BADINP ; No - Bad input -2405 0F6C E3 MORDT: EX (SP),HL ; Get code string address -2406 0F6D 2B DEC HL ; DEC 'cos GETCHR INCs -2407 0F6E CD 9A 0B CALL GETCHR ; Get next character -2408 0F71 C2 FF 0E JP NZ,NEDMOR ; More needed - Get it -2409 0F74 D1 POP DE ; Restore DATA pointer -2410 0F75 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -2411 0F78 B7 OR A -2412 0F79 EB EX DE,HL ; DATA pointer to HL -2413 0F7A C2 C0 0B JP NZ,UPDATA ; Update DATA pointer if "READ" -2414 0F7D D5 PUSH DE ; Save code string address -2415 0F7E B6 OR (HL) ; More input given? -2416 0F7F 21 87 0F LD HL,EXTIG ; "?Extra ignored" message -2417 0F82 C4 E0 14 CALL NZ,PRS ; Output string if extra given -2418 0F85 E1 POP HL ; Restore code string address -2419 0F86 C9 RET -2420 0F87 -2421 0F87 3F4578747261EXTIG: .BYTE "?Extra ignored",CR,LF,0 -2421 0F8D 2069676E6F7265640D0A00 -2422 0F98 -2423 0F98 CD 31 0D FDTLP: CALL DATA ; Get next statement -2424 0F9B B7 OR A ; End of line? -2425 0F9C C2 B1 0F JP NZ,FANDT ; No - See if DATA statement -2426 0F9F 23 INC HL -2427 0FA0 7E LD A,(HL) ; End of program? -2428 0FA1 23 INC HL -2429 0FA2 B6 OR (HL) ; 00 00 Ends program -2430 0FA3 1E 06 LD E,OD ; ?OD Error -2431 0FA5 CA 56 07 JP Z,ERROR ; Yes - Out of DATA -2432 0FA8 23 INC HL -2433 0FA9 5E LD E,(HL) ; LSB of line number -2434 0FAA 23 INC HL -2435 0FAB 56 LD D,(HL) ; MSB of line number -2436 0FAC EB EX DE,HL -2437 0FAD 22 79 31 LD (DATLIN),HL ; Set line of current DATA item -2438 0FB0 EB EX DE,HL -2439 0FB1 CD 9A 0B FANDT: CALL GETCHR ; Get next character -2440 0FB4 FE 83 CP ZDATA ; "DATA" token -2441 0FB6 C2 98 0F JP NZ,FDTLP ; No "DATA" - Keep looking -2442 0FB9 C3 2B 0F JP ANTVLU ; Found - Convert input -2443 0FBC -2444 0FBC 11 00 00 NEXT: LD DE,0 ; In case no index given -2445 0FBF C4 FD 11 NEXT1: CALL NZ,GETVAR ; Get index address -2446 0FC2 22 7E 31 LD (BRKLIN),HL ; Save code string address -2447 0FC5 CD EB 06 CALL BAKSTK ; Look for "FOR" block -2448 0FC8 C2 48 07 JP NZ,NFERR ; No "FOR" - ?NF Error -2449 0FCB F9 LD SP,HL ; Clear nested loops -2450 0FCC D5 PUSH DE ; Save index address -2451 0FCD 7E LD A,(HL) ; Get sign of STEP -2452 0FCE 23 INC HL -2453 0FCF F5 PUSH AF ; Save sign of STEP -2454 0FD0 D5 PUSH DE ; Save index address -2455 0FD1 CD 27 1A CALL PHLTFP ; Move index value to FPREG -2456 0FD4 E3 EX (SP),HL ; Save address of TO value -2457 0FD5 E5 PUSH HL ; Save address of index -2458 0FD6 CD 94 17 CALL ADDPHL ; Add STEP to index value -2459 0FD9 E1 POP HL ; Restore address of index -2460 0FDA CD 41 1A CALL FPTHL ; Move value to index variable -2461 0FDD E1 POP HL ; Restore address of TO value -2462 0FDE CD 38 1A CALL LOADFP ; Move TO value to BCDE -2463 0FE1 E5 PUSH HL ; Save address of line of FOR -2464 0FE2 CD 64 1A CALL CMPNUM ; Compare index with TO value -2465 0FE5 E1 POP HL ; Restore address of line num -2466 0FE6 C1 POP BC ; Address of sign of STEP -2467 0FE7 90 SUB B ; Compare with expected sign -2468 0FE8 CD 38 1A CALL LOADFP ; BC = Loop stmt,DE = Line num -2469 0FEB CA F7 0F JP Z,KILFOR ; Loop finished - Terminate it -2470 0FEE EB EX DE,HL ; Loop statement line number -2471 0FEF 22 0C 31 LD (LINEAT),HL ; Set loop line number -2472 0FF2 69 LD L,C ; Set code string to loop -2473 0FF3 60 LD H,B -2474 0FF4 C3 56 0B JP PUTFID ; Put back "FOR" and continue -2475 0FF7 -2476 0FF7 F9 KILFOR: LD SP,HL ; Remove "FOR" block -2477 0FF8 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" -2478 0FFB 7E LD A,(HL) ; Get next byte in code string -2479 0FFC FE 2C CP ',' ; More NEXTs ? -2480 0FFE C2 5A 0B JP NZ,RUNCNT ; No - Do next statement -2481 1001 CD 9A 0B CALL GETCHR ; Position to index name -2482 1004 CD BF 0F CALL NEXT1 ; Re-enter NEXT routine -2483 1007 ; < will not RETurn to here , Exit to RUNCNT or Loop > -2484 1007 -2485 1007 CD 19 10 GETNUM: CALL EVAL ; Get a numeric expression -2486 100A F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) -2487 100B 37 TSTSTR: SCF ; Set carry (string) -2488 100C 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match -2489 100F 8F ADC A,A ; Expected + actual -2490 1010 B7 OR A ; Clear carry , set parity -2491 1011 E8 RET PE ; Even parity - Types match -2492 1012 C3 54 07 JP TMERR ; Different types - Error -2493 1015 -2494 1015 CD 10 0A OPNPAR: CALL CHKSYN ; Make sure "(" follows -2495 1018 28 .BYTE "(" -2496 1019 2B EVAL: DEC HL ; Evaluate expression & save -2497 101A 16 00 LD D,0 ; Precedence value -2498 101C D5 EVAL1: PUSH DE ; Save precedence -2499 101D 0E 01 LD C,1 -2500 101F CD 1F 07 CALL CHKSTK ; Check for 1 level of stack -2501 1022 CD 90 10 CALL OPRND ; Get next expression value -2502 1025 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator -2503 1028 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr -2504 102B C1 POP BC ; Precedence value and operator -2505 102C 78 LD A,B ; Get precedence value -2506 102D FE 78 CP 78H ; "AND" or "OR" ? -2507 102F D4 0A 10 CALL NC,TSTNUM ; No - Make sure it's a number -2508 1032 7E LD A,(HL) ; Get next operator / function -2509 1033 16 00 LD D,0 ; Clear Last relation -2510 1035 D6 B3 RLTLP: SUB ZGTR ; ">" Token -2511 1037 DA 51 10 JP C,FOPRND ; + - * / ^ AND OR - Test it -2512 103A FE 03 CP ZLTH+1-ZGTR ; < = > -2513 103C D2 51 10 JP NC,FOPRND ; Function - Call it -2514 103F FE 01 CP ZEQUAL-ZGTR ; "=" -2515 1041 17 RLA ; <- Test for legal -2516 1042 AA XOR D ; <- combinations of < = > -2517 1043 BA CP D ; <- by combining last token -2518 1044 57 LD D,A ; <- with current one -2519 1045 DA 42 07 JP C,SNERR ; Error if "<<' '==" or ">>" -2520 1048 22 75 31 LD (CUROPR),HL ; Save address of current token -2521 104B CD 9A 0B CALL GETCHR ; Get next character -2522 104E C3 35 10 JP RLTLP ; Treat the two as one -2523 1051 -2524 1051 7A FOPRND: LD A,D ; < = > found ? -2525 1052 B7 OR A -2526 1053 C2 78 11 JP NZ,TSTRED ; Yes - Test for reduction -2527 1056 7E LD A,(HL) ; Get operator token -2528 1057 22 75 31 LD (CUROPR),HL ; Save operator address -2529 105A D6 AC SUB ZPLUS ; Operator or function? -2530 105C D8 RET C ; Neither - Exit -2531 105D FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? -2532 105F D0 RET NC ; No - Exit -2533 1060 5F LD E,A ; Coded operator -2534 1061 3A 5D 31 LD A,(TYPE) ; Get data type -2535 1064 3D DEC A ; FF = numeric , 00 = string -2536 1065 B3 OR E ; Combine with coded operator -2537 1066 7B LD A,E ; Get coded operator -2538 1067 CA D6 15 JP Z,CONCAT ; String concatenation -2539 106A 07 RLCA ; Times 2 -2540 106B 83 ADD A,E ; Times 3 -2541 106C 5F LD E,A ; To DE (D is 0) -2542 106D 21 34 06 LD HL,PRITAB ; Precedence table -2543 1070 19 ADD HL,DE ; To the operator concerned -2544 1071 78 LD A,B ; Last operator precedence -2545 1072 56 LD D,(HL) ; Get evaluation precedence -2546 1073 BA CP D ; Compare with eval precedence -2547 1074 D0 RET NC ; Exit if higher precedence -2548 1075 23 INC HL ; Point to routine address -2549 1076 CD 0A 10 CALL TSTNUM ; Make sure it's a number -2550 1079 -2551 1079 C5 STKTHS: PUSH BC ; Save last precedence & token -2552 107A 01 28 10 LD BC,EVAL3 ; Where to go on prec' break -2553 107D C5 PUSH BC ; Save on stack for return -2554 107E 43 LD B,E ; Save operator -2555 107F 4A LD C,D ; Save precedence -2556 1080 CD 1A 1A CALL STAKFP ; Move value to stack -2557 1083 58 LD E,B ; Restore operator -2558 1084 51 LD D,C ; Restore precedence -2559 1085 4E LD C,(HL) ; Get LSB of routine address -2560 1086 23 INC HL -2561 1087 46 LD B,(HL) ; Get MSB of routine address -2562 1088 23 INC HL -2563 1089 C5 PUSH BC ; Save routine address -2564 108A 2A 75 31 LD HL,(CUROPR) ; Address of current operator -2565 108D C3 1C 10 JP EVAL1 ; Loop until prec' break -2566 1090 -2567 1090 AF OPRND: XOR A ; Get operand routine -2568 1091 32 5D 31 LD (TYPE),A ; Set numeric expected -2569 1094 CD 9A 0B CALL GETCHR ; Get next character -2570 1097 1E 24 LD E,MO ; ?MO Error -2571 1099 CA 56 07 JP Z,ERROR ; No operand - Error -2572 109C DA F0 1A JP C,ASCTFP ; Number - Get value -2573 109F CD 38 0C CALL CHKLTR ; See if a letter -2574 10A2 D2 F7 10 JP NC,CONVAR ; Letter - Find variable -2575 10A5 FE 26 CP '&' ; &H = HEX, &B = BINARY -2576 10A7 20 12 JR NZ, NOTAMP -2577 10A9 CD 9A 0B CALL GETCHR ; Get next character -2578 10AC FE 48 CP 'H' ; Hex number indicated? [function added] -2579 10AE CA 34 1F JP Z,HEXTFP ; Convert Hex to FPREG -2580 10B1 FE 42 CP 'B' ; Binary number indicated? [function added] -2581 10B3 CA A4 1F JP Z,BINTFP ; Convert Bin to FPREG -2582 10B6 1E 02 LD E,SN ; If neither then a ?SN Error -2583 10B8 CA 56 07 JP Z,ERROR ; -2584 10BB FE AC NOTAMP: CP ZPLUS ; '+' Token ? -2585 10BD CA 90 10 JP Z,OPRND ; Yes - Look for operand -2586 10C0 FE 2E CP '.' ; '.' ? -2587 10C2 CA F0 1A JP Z,ASCTFP ; Yes - Create FP number -2588 10C5 FE AD CP ZMINUS ; '-' Token ? -2589 10C7 CA E6 10 JP Z,MINUS ; Yes - Do minus -2590 10CA FE 22 CP '"' ; Literal string ? -2591 10CC CA 9F 14 JP Z,QTSTR ; Get string terminated by '"' -2592 10CF FE AA CP ZNOT ; "NOT" Token ? -2593 10D1 CA D8 11 JP Z,EVNOT ; Yes - Eval NOT expression -2594 10D4 FE A7 CP ZFN ; "FN" Token ? -2595 10D6 CA 03 14 JP Z,DOFN ; Yes - Do FN routine -2596 10D9 D6 B6 SUB ZSGN ; Is it a function? -2597 10DB D2 08 11 JP NC,FNOFST ; Yes - Evaluate function -2598 10DE CD 15 10 EVLPAR: CALL OPNPAR ; Evaluate expression in "()" -2599 10E1 CD 10 0A CALL CHKSYN ; Make sure ")" follows -2600 10E4 29 .BYTE ")" -2601 10E5 C9 RET -2602 10E6 -2603 10E6 16 7D MINUS: LD D,7DH ; '-' precedence -2604 10E8 CD 1C 10 CALL EVAL1 ; Evaluate until prec' break -2605 10EB 2A 80 31 LD HL,(NXTOPR) ; Get next operator address -2606 10EE E5 PUSH HL ; Save next operator address -2607 10EF CD 12 1A CALL INVSGN ; Negate value -2608 10F2 CD 0A 10 RETNUM: CALL TSTNUM ; Make sure it's a number -2609 10F5 E1 POP HL ; Restore next operator address -2610 10F6 C9 RET -2611 10F7 -2612 10F7 CD FD 11 CONVAR: CALL GETVAR ; Get variable address to DE -2613 10FA E5 FRMEVL: PUSH HL ; Save code string address -2614 10FB EB EX DE,HL ; Variable address to HL -2615 10FC 22 94 31 LD (FPREG),HL ; Save address of variable -2616 10FF 3A 5D 31 LD A,(TYPE) ; Get type -2617 1102 B7 OR A ; Numeric? -2618 1103 CC 27 1A CALL Z,PHLTFP ; Yes - Move contents to FPREG -2619 1106 E1 POP HL ; Restore code string address -2620 1107 C9 RET -2621 1108 -2622 1108 06 00 FNOFST: LD B,0 ; Get address of function -2623 110A 07 RLCA ; Double function offset -2624 110B 4F LD C,A ; BC = Offset in function table -2625 110C C5 PUSH BC ; Save adjusted token value -2626 110D CD 9A 0B CALL GETCHR ; Get next character -2627 1110 79 LD A,C ; Get adjusted token value -2628 1111 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? -2629 1113 DA 2F 11 JP C,FNVAL ; No - Do function -2630 1116 CD 15 10 CALL OPNPAR ; Evaluate expression (X,... -2631 1119 CD 10 0A CALL CHKSYN ; Make sure ',' follows -2632 111C 2C .BYTE ',' -2633 111D CD 0B 10 CALL TSTSTR ; Make sure it's a string -2634 1120 EB EX DE,HL ; Save code string address -2635 1121 2A 94 31 LD HL,(FPREG) ; Get address of string -2636 1124 E3 EX (SP),HL ; Save address of string -2637 1125 E5 PUSH HL ; Save adjusted token value -2638 1126 EB EX DE,HL ; Restore code string address -2639 1127 CD 68 17 CALL GETINT ; Get integer 0-255 -2640 112A EB EX DE,HL ; Save code string address -2641 112B E3 EX (SP),HL ; Save integer,HL = adj' token -2642 112C C3 37 11 JP GOFUNC ; Jump to string function -2643 112F -2644 112F CD DE 10 FNVAL: CALL EVLPAR ; Evaluate expression -2645 1132 E3 EX (SP),HL ; HL = Adjusted token value -2646 1133 11 F2 10 LD DE,RETNUM ; Return number from function -2647 1136 D5 PUSH DE ; Save on stack -2648 1137 01 93 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses -2649 113A 09 ADD HL,BC ; Point to right address -2650 113B 4E LD C,(HL) ; Get LSB of address -2651 113C 23 INC HL ; -2652 113D 66 LD H,(HL) ; Get MSB of address -2653 113E 69 LD L,C ; Address to HL -2654 113F E9 JP (HL) ; Jump to function -2655 1140 -2656 1140 15 SGNEXP: DEC D ; Dee to flag negative exponent -2657 1141 FE AD CP ZMINUS ; '-' token ? -2658 1143 C8 RET Z ; Yes - Return -2659 1144 FE 2D CP '-' ; '-' ASCII ? -2660 1146 C8 RET Z ; Yes - Return -2661 1147 14 INC D ; Inc to flag positive exponent -2662 1148 FE 2B CP '+' ; '+' ASCII ? -2663 114A C8 RET Z ; Yes - Return -2664 114B FE AC CP ZPLUS ; '+' token ? -2665 114D C8 RET Z ; Yes - Return -2666 114E 2B DEC HL ; DEC 'cos GETCHR INCs -2667 114F C9 RET ; Return "NZ" -2668 1150 -2669 1150 F6 POR: .BYTE 0F6H ; Flag "OR" -2670 1151 AF PAND: XOR A ; Flag "AND" -2671 1152 F5 PUSH AF ; Save "AND" / "OR" flag -2672 1153 CD 0A 10 CALL TSTNUM ; Make sure it's a number -2673 1156 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -2674 1159 F1 POP AF ; Restore "AND" / "OR" flag -2675 115A EB EX DE,HL ; <- Get last -2676 115B C1 POP BC ; <- value -2677 115C E3 EX (SP),HL ; <- from -2678 115D EB EX DE,HL ; <- stack -2679 115E CD 2A 1A CALL FPBCDE ; Move last value to FPREG -2680 1161 F5 PUSH AF ; Save "AND" / "OR" flag -2681 1162 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -2682 1165 F1 POP AF ; Restore "AND" / "OR" flag -2683 1166 C1 POP BC ; Get value -2684 1167 79 LD A,C ; Get LSB -2685 1168 21 C1 13 LD HL,ACPASS ; Address of save AC as current -2686 116B C2 73 11 JP NZ,POR1 ; Jump if OR -2687 116E A3 AND E ; "AND" LSBs -2688 116F 4F LD C,A ; Save LSB -2689 1170 78 LD A,B ; Get MBS -2690 1171 A2 AND D ; "AND" MSBs -2691 1172 E9 JP (HL) ; Save AC as current (ACPASS) -2692 1173 -2693 1173 B3 POR1: OR E ; "OR" LSBs -2694 1174 4F LD C,A ; Save LSB -2695 1175 78 LD A,B ; Get MSB -2696 1176 B2 OR D ; "OR" MSBs -2697 1177 E9 JP (HL) ; Save AC as current (ACPASS) -2698 1178 -2699 1178 21 8A 11 TSTRED: LD HL,CMPLOG ; Logical compare routine -2700 117B 3A 5D 31 LD A,(TYPE) ; Get data type -2701 117E 1F RRA ; Carry set = string -2702 117F 7A LD A,D ; Get last precedence value -2703 1180 17 RLA ; Times 2 plus carry -2704 1181 5F LD E,A ; To E -2705 1182 16 64 LD D,64H ; Relational precedence -2706 1184 78 LD A,B ; Get current precedence -2707 1185 BA CP D ; Compare with last -2708 1186 D0 RET NC ; Eval if last was rel' or log' -2709 1187 C3 79 10 JP STKTHS ; Stack this one and get next -2710 118A -2711 118A 8C 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings -2712 118C 79 CMPLG1: LD A,C ; Get data type -2713 118D B7 OR A -2714 118E 1F RRA -2715 118F C1 POP BC ; Get last expression to BCDE -2716 1190 D1 POP DE -2717 1191 F5 PUSH AF ; Save status -2718 1192 CD 0C 10 CALL CHKTYP ; Check that types match -2719 1195 21 CE 11 LD HL,CMPRES ; Result to comparison -2720 1198 E5 PUSH HL ; Save for RETurn -2721 1199 CA 64 1A JP Z,CMPNUM ; Compare values if numeric -2722 119C AF XOR A ; Compare two strings -2723 119D 32 5D 31 LD (TYPE),A ; Set type to numeric -2724 11A0 D5 PUSH DE ; Save string name -2725 11A1 CD 23 16 CALL GSTRCU ; Get current string -2726 11A4 7E LD A,(HL) ; Get length of string -2727 11A5 23 INC HL -2728 11A6 23 INC HL -2729 11A7 4E LD C,(HL) ; Get LSB of address -2730 11A8 23 INC HL -2731 11A9 46 LD B,(HL) ; Get MSB of address -2732 11AA D1 POP DE ; Restore string name -2733 11AB C5 PUSH BC ; Save address of string -2734 11AC F5 PUSH AF ; Save length of string -2735 11AD CD 27 16 CALL GSTRDE ; Get second string -2736 11B0 CD 38 1A CALL LOADFP ; Get address of second string -2737 11B3 F1 POP AF ; Restore length of string 1 -2738 11B4 57 LD D,A ; Length to D -2739 11B5 E1 POP HL ; Restore address of string 1 -2740 11B6 7B CMPSTR: LD A,E ; Bytes of string 2 to do -2741 11B7 B2 OR D ; Bytes of string 1 to do -2742 11B8 C8 RET Z ; Exit if all bytes compared -2743 11B9 7A LD A,D ; Get bytes of string 1 to do -2744 11BA D6 01 SUB 1 -2745 11BC D8 RET C ; Exit if end of string 1 -2746 11BD AF XOR A -2747 11BE BB CP E ; Bytes of string 2 to do -2748 11BF 3C INC A -2749 11C0 D0 RET NC ; Exit if end of string 2 -2750 11C1 15 DEC D ; Count bytes in string 1 -2751 11C2 1D DEC E ; Count bytes in string 2 -2752 11C3 0A LD A,(BC) ; Byte in string 2 -2753 11C4 BE CP (HL) ; Compare to byte in string 1 -2754 11C5 23 INC HL ; Move up string 1 -2755 11C6 03 INC BC ; Move up string 2 -2756 11C7 CA B6 11 JP Z,CMPSTR ; Same - Try next bytes -2757 11CA 3F CCF ; Flag difference (">" or "<") -2758 11CB C3 F4 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 -2759 11CE -2760 11CE 3C CMPRES: INC A ; Increment current value -2761 11CF 8F ADC A,A ; Double plus carry -2762 11D0 C1 POP BC ; Get other value -2763 11D1 A0 AND B ; Combine them -2764 11D2 C6 FF ADD A,-1 ; Carry set if different -2765 11D4 9F SBC A,A ; 00 - Equal , FF - Different -2766 11D5 C3 FB 19 JP FLGREL ; Set current value & continue -2767 11D8 -2768 11D8 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" -2769 11DA CD 1C 10 CALL EVAL1 ; Eval until precedence break -2770 11DD CD 0A 10 CALL TSTNUM ; Make sure it's a number -2771 11E0 CD 4C 0C CALL DEINT ; Get integer -32768 - 32767 -2772 11E3 7B LD A,E ; Get LSB -2773 11E4 2F CPL ; Invert LSB -2774 11E5 4F LD C,A ; Save "NOT" of LSB -2775 11E6 7A LD A,D ; Get MSB -2776 11E7 2F CPL ; Invert MSB -2777 11E8 CD C1 13 CALL ACPASS ; Save AC as current -2778 11EB C1 POP BC ; Clean up stack -2779 11EC C3 28 10 JP EVAL3 ; Continue evaluation -2780 11EF -2781 11EF 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs -2782 11F0 CD 9A 0B CALL GETCHR ; Get next character -2783 11F3 C8 RET Z ; End of DIM statement -2784 11F4 CD 10 0A CALL CHKSYN ; Make sure ',' follows -2785 11F7 2C .BYTE ',' -2786 11F8 01 EF 11 DIM: LD BC,DIMRET ; Return to "DIMRET" -2787 11FB C5 PUSH BC ; Save on stack -2788 11FC F6 .BYTE 0F6H ; Flag "Create" variable -2789 11FD AF GETVAR: XOR A ; Find variable address,to DE -2790 11FE 32 5C 31 LD (LCRFLG),A ; Set locate / create flag -2791 1201 46 LD B,(HL) ; Get First byte of name -2792 1202 CD 38 0C GTFNAM: CALL CHKLTR ; See if a letter -2793 1205 DA 42 07 JP C,SNERR ; ?SN Error if not a letter -2794 1208 AF XOR A -2795 1209 4F LD C,A ; Clear second byte of name -2796 120A 32 5D 31 LD (TYPE),A ; Set type to numeric -2797 120D CD 9A 0B CALL GETCHR ; Get next character -2798 1210 DA 19 12 JP C,SVNAM2 ; Numeric - Save in name -2799 1213 CD 38 0C CALL CHKLTR ; See if a letter -2800 1216 DA 26 12 JP C,CHARTY ; Not a letter - Check type -2801 1219 4F SVNAM2: LD C,A ; Save second byte of name -2802 121A CD 9A 0B ENDNAM: CALL GETCHR ; Get next character -2803 121D DA 1A 12 JP C,ENDNAM ; Numeric - Get another -2804 1220 CD 38 0C CALL CHKLTR ; See if a letter -2805 1223 D2 1A 12 JP NC,ENDNAM ; Letter - Get another -2806 1226 D6 24 CHARTY: SUB '$' ; String variable? -2807 1228 C2 35 12 JP NZ,NOTSTR ; No - Numeric variable -2808 122B 3C INC A ; A = 1 (string type) -2809 122C 32 5D 31 LD (TYPE),A ; Set type to string -2810 122F 0F RRCA ; A = 80H , Flag for string -2811 1230 81 ADD A,C ; 2nd byte of name has bit 7 on -2812 1231 4F LD C,A ; Resave second byte on name -2813 1232 CD 9A 0B CALL GETCHR ; Get next character -2814 1235 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? -2815 1238 3D DEC A -2816 1239 CA E2 12 JP Z,ARLDSV ; Yes - Get array name -2817 123C F2 45 12 JP P,NSCFOR ; No array with "FOR" or "FN" -2818 123F 7E LD A,(HL) ; Get byte again -2819 1240 D6 28 SUB '(' ; Subscripted variable? -2820 1242 CA BA 12 JP Z,SBSCPT ; Yes - Sort out subscript -2821 1245 -2822 1245 AF NSCFOR: XOR A ; Simple variable -2823 1246 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag -2824 1249 E5 PUSH HL ; Save code string address -2825 124A 50 LD D,B ; DE = Variable name to find -2826 124B 59 LD E,C -2827 124C 2A 8E 31 LD HL,(FNRGNM) ; FN argument name -2828 124F CD 0A 0A CALL CPDEHL ; Is it the FN argument? -2829 1252 11 90 31 LD DE,FNARG ; Point to argument value -2830 1255 CA 2A 19 JP Z,POPHRT ; Yes - Return FN argument value -2831 1258 2A 88 31 LD HL,(VAREND) ; End of variables -2832 125B EB EX DE,HL ; Address of end of search -2833 125C 2A 86 31 LD HL,(PROGND) ; Start of variables address -2834 125F CD 0A 0A FNDVAR: CALL CPDEHL ; End of variable list table? -2835 1262 CA 78 12 JP Z,CFEVAL ; Yes - Called from EVAL? -2836 1265 79 LD A,C ; Get second byte of name -2837 1266 96 SUB (HL) ; Compare with name in list -2838 1267 23 INC HL ; Move on to first byte -2839 1268 C2 6D 12 JP NZ,FNTHR ; Different - Find another -2840 126B 78 LD A,B ; Get first byte of name -2841 126C 96 SUB (HL) ; Compare with name in list -2842 126D 23 FNTHR: INC HL ; Move on to LSB of value -2843 126E CA AC 12 JP Z,RETADR ; Found - Return address -2844 1271 23 INC HL ; <- Skip -2845 1272 23 INC HL ; <- over -2846 1273 23 INC HL ; <- F.P. -2847 1274 23 INC HL ; <- value -2848 1275 C3 5F 12 JP FNDVAR ; Keep looking -2849 1278 -2850 1278 E1 CFEVAL: POP HL ; Restore code string address -2851 1279 E3 EX (SP),HL ; Get return address -2852 127A D5 PUSH DE ; Save address of variable -2853 127B 11 FA 10 LD DE,FRMEVL ; Return address in EVAL -2854 127E CD 0A 0A CALL CPDEHL ; Called from EVAL ? -2855 1281 D1 POP DE ; Restore address of variable -2856 1282 CA AF 12 JP Z,RETNUL ; Yes - Return null variable -2857 1285 E3 EX (SP),HL ; Put back return -2858 1286 E5 PUSH HL ; Save code string address -2859 1287 C5 PUSH BC ; Save variable name -2860 1288 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data -2861 128B 2A 8A 31 LD HL,(ARREND) ; End of arrays -2862 128E E5 PUSH HL ; Save end of arrays -2863 128F 09 ADD HL,BC ; Move up 6 bytes -2864 1290 C1 POP BC ; Source address in BC -2865 1291 E5 PUSH HL ; Save new end address -2866 1292 CD 0E 07 CALL MOVUP ; Move arrays up -2867 1295 E1 POP HL ; Restore new end address -2868 1296 22 8A 31 LD (ARREND),HL ; Set new end address -2869 1299 60 LD H,B ; End of variables to HL -2870 129A 69 LD L,C -2871 129B 22 88 31 LD (VAREND),HL ; Set new end address -2872 129E -2873 129E 2B ZEROLP: DEC HL ; Back through to zero variable -2874 129F 36 00 LD (HL),0 ; Zero byte in variable -2875 12A1 CD 0A 0A CALL CPDEHL ; Done them all? -2876 12A4 C2 9E 12 JP NZ,ZEROLP ; No - Keep on going -2877 12A7 D1 POP DE ; Get variable name -2878 12A8 73 LD (HL),E ; Store second character -2879 12A9 23 INC HL -2880 12AA 72 LD (HL),D ; Store first character -2881 12AB 23 INC HL -2882 12AC EB RETADR: EX DE,HL ; Address of variable in DE -2883 12AD E1 POP HL ; Restore code string address -2884 12AE C9 RET -2885 12AF -2886 12AF 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero -2887 12B2 21 DE 06 LD HL,ZERBYT ; Also set a null string -2888 12B5 22 94 31 LD (FPREG),HL ; Save for EVAL -2889 12B8 E1 POP HL ; Restore code string address -2890 12B9 C9 RET -2891 12BA -2892 12BA E5 SBSCPT: PUSH HL ; Save code string address -2893 12BB 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type -2894 12BE E3 EX (SP),HL ; Save and get code string -2895 12BF 57 LD D,A ; Zero number of dimensions -2896 12C0 D5 SCPTLP: PUSH DE ; Save number of dimensions -2897 12C1 C5 PUSH BC ; Save array name -2898 12C2 CD 40 0C CALL FPSINT ; Get subscript (0-32767) -2899 12C5 C1 POP BC ; Restore array name -2900 12C6 F1 POP AF ; Get number of dimensions -2901 12C7 EB EX DE,HL -2902 12C8 E3 EX (SP),HL ; Save subscript value -2903 12C9 E5 PUSH HL ; Save LCRFLG and TYPE -2904 12CA EB EX DE,HL -2905 12CB 3C INC A ; Count dimensions -2906 12CC 57 LD D,A ; Save in D -2907 12CD 7E LD A,(HL) ; Get next byte in code string -2908 12CE FE 2C CP ',' ; Comma (more to come)? -2909 12D0 CA C0 12 JP Z,SCPTLP ; Yes - More subscripts -2910 12D3 CD 10 0A CALL CHKSYN ; Make sure ")" follows -2911 12D6 29 .BYTE ")" -2912 12D7 22 80 31 LD (NXTOPR),HL ; Save code string address -2913 12DA E1 POP HL ; Get LCRFLG and TYPE -2914 12DB 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type -2915 12DE 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* -2916 12E0 D5 PUSH DE ; Save number of dimensions (D) -2917 12E1 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' -2918 12E2 -2919 12E2 E5 ARLDSV: PUSH HL ; Save code string address -2920 12E3 F5 PUSH AF ; A = 00 , Flags set = Z,N -2921 12E4 2A 88 31 LD HL,(VAREND) ; Start of arrays -2922 12E7 3E .BYTE 3EH ; Skip "ADD HL,DE" -2923 12E8 19 FNDARY: ADD HL,DE ; Move to next array start -2924 12E9 EB EX DE,HL -2925 12EA 2A 8A 31 LD HL,(ARREND) ; End of arrays -2926 12ED EB EX DE,HL ; Current array pointer -2927 12EE CD 0A 0A CALL CPDEHL ; End of arrays found? -2928 12F1 CA 1A 13 JP Z,CREARY ; Yes - Create array -2929 12F4 7E LD A,(HL) ; Get second byte of name -2930 12F5 B9 CP C ; Compare with name given -2931 12F6 23 INC HL ; Move on -2932 12F7 C2 FC 12 JP NZ,NXTARY ; Different - Find next array -2933 12FA 7E LD A,(HL) ; Get first byte of name -2934 12FB B8 CP B ; Compare with name given -2935 12FC 23 NXTARY: INC HL ; Move on -2936 12FD 5E LD E,(HL) ; Get LSB of next array address -2937 12FE 23 INC HL -2938 12FF 56 LD D,(HL) ; Get MSB of next array address -2939 1300 23 INC HL -2940 1301 C2 E8 12 JP NZ,FNDARY ; Not found - Keep looking -2941 1304 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? -2942 1307 B7 OR A -2943 1308 C2 4B 07 JP NZ,DDERR ; Create - ?DD Error -2944 130B F1 POP AF ; Locate - Get number of dim'ns -2945 130C 44 LD B,H ; BC Points to array dim'ns -2946 130D 4D LD C,L -2947 130E CA 2A 19 JP Z,POPHRT ; Jump if array load/save -2948 1311 96 SUB (HL) ; Same number of dimensions? -2949 1312 CA 78 13 JP Z,FINDEL ; Yes - Find element -2950 1315 1E 10 BSERR: LD E,BS ; ?BS Error -2951 1317 C3 56 07 JP ERROR ; Output error -2952 131A -2953 131A 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry -2954 131D F1 POP AF ; Array to save or 0 dim'ns? -2955 131E CA 61 0C JP Z,FCERR ; Yes - ?FC Error -2956 1321 71 LD (HL),C ; Save second byte of name -2957 1322 23 INC HL -2958 1323 70 LD (HL),B ; Save first byte of name -2959 1324 23 INC HL -2960 1325 4F LD C,A ; Number of dimensions to C -2961 1326 CD 1F 07 CALL CHKSTK ; Check if enough memory -2962 1329 23 INC HL ; Point to number of dimensions -2963 132A 23 INC HL -2964 132B 22 75 31 LD (CUROPR),HL ; Save address of pointer -2965 132E 71 LD (HL),C ; Set number of dimensions -2966 132F 23 INC HL -2967 1330 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? -2968 1333 17 RLA ; Carry set = Create -2969 1334 79 LD A,C ; Get number of dimensions -2970 1335 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 -2971 1338 D2 3D 13 JP NC,DEFSIZ ; Locate - Set default size -2972 133B C1 POP BC ; Get specified dimension size -2973 133C 03 INC BC ; Include zero element -2974 133D 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size -2975 133E 23 INC HL -2976 133F 70 LD (HL),B ; Save MSB of dimension size -2977 1340 23 INC HL -2978 1341 F5 PUSH AF ; Save num' of dim'ns an status -2979 1342 E5 PUSH HL ; Save address of dim'n size -2980 1343 CD D5 1A CALL MLDEBC ; Multiply DE by BC to find -2981 1346 EB EX DE,HL ; amount of mem needed (to DE) -2982 1347 E1 POP HL ; Restore address of dimension -2983 1348 F1 POP AF ; Restore number of dimensions -2984 1349 3D DEC A ; Count them -2985 134A C2 35 13 JP NZ,CRARLP ; Do next dimension if more -2986 134D F5 PUSH AF ; Save locate/create flag -2987 134E 42 LD B,D ; MSB of memory needed -2988 134F 4B LD C,E ; LSB of memory needed -2989 1350 EB EX DE,HL -2990 1351 19 ADD HL,DE ; Add bytes to array start -2991 1352 DA 37 07 JP C,OMERR ; Too big - Error -2992 1355 CD 28 07 CALL ENFMEM ; See if enough memory -2993 1358 22 8A 31 LD (ARREND),HL ; Save new end of array -2994 135B -2995 135B 2B ZERARY: DEC HL ; Back through array data -2996 135C 36 00 LD (HL),0 ; Set array element to zero -2997 135E CD 0A 0A CALL CPDEHL ; All elements zeroed? -2998 1361 C2 5B 13 JP NZ,ZERARY ; No - Keep on going -2999 1364 03 INC BC ; Number of bytes + 1 -3000 1365 57 LD D,A ; A=0 -3001 1366 2A 75 31 LD HL,(CUROPR) ; Get address of array -3002 1369 5E LD E,(HL) ; Number of dimensions -3003 136A EB EX DE,HL ; To HL -3004 136B 29 ADD HL,HL ; Two bytes per dimension size -3005 136C 09 ADD HL,BC ; Add number of bytes -3006 136D EB EX DE,HL ; Bytes needed to DE -3007 136E 2B DEC HL -3008 136F 2B DEC HL -3009 1370 73 LD (HL),E ; Save LSB of bytes needed -3010 1371 23 INC HL -3011 1372 72 LD (HL),D ; Save MSB of bytes needed -3012 1373 23 INC HL -3013 1374 F1 POP AF ; Locate / Create? -3014 1375 DA 9C 13 JP C,ENDDIM ; A is 0 , End if create -3015 1378 47 FINDEL: LD B,A ; Find array element -3016 1379 4F LD C,A -3017 137A 7E LD A,(HL) ; Number of dimensions -3018 137B 23 INC HL -3019 137C 16 .BYTE 16H ; Skip "POP HL" -3020 137D E1 FNDELP: POP HL ; Address of next dim' size -3021 137E 5E LD E,(HL) ; Get LSB of dim'n size -3022 137F 23 INC HL -3023 1380 56 LD D,(HL) ; Get MSB of dim'n size -3024 1381 23 INC HL -3025 1382 E3 EX (SP),HL ; Save address - Get index -3026 1383 F5 PUSH AF ; Save number of dim'ns -3027 1384 CD 0A 0A CALL CPDEHL ; Dimension too large? -3028 1387 D2 15 13 JP NC,BSERR ; Yes - ?BS Error -3029 138A E5 PUSH HL ; Save index -3030 138B CD D5 1A CALL MLDEBC ; Multiply previous by size -3031 138E D1 POP DE ; Index supplied to DE -3032 138F 19 ADD HL,DE ; Add index to pointer -3033 1390 F1 POP AF ; Number of dimensions -3034 1391 3D DEC A ; Count them -3035 1392 44 LD B,H ; MSB of pointer -3036 1393 4D LD C,L ; LSB of pointer -3037 1394 C2 7D 13 JP NZ,FNDELP ; More - Keep going -3038 1397 29 ADD HL,HL ; 4 Bytes per element -3039 1398 29 ADD HL,HL -3040 1399 C1 POP BC ; Start of array -3041 139A 09 ADD HL,BC ; Point to element -3042 139B EB EX DE,HL ; Address of element to DE -3043 139C 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address -3044 139F C9 RET -3045 13A0 -3046 13A0 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory -3047 13A3 EB EX DE,HL ; To DE -3048 13A4 21 00 00 LD HL,0 ; End of free memory -3049 13A7 39 ADD HL,SP ; Current stack value -3050 13A8 3A 5D 31 LD A,(TYPE) ; Dummy argument type -3051 13AB B7 OR A -3052 13AC CA BC 13 JP Z,FRENUM ; Numeric - Free variable space -3053 13AF CD 23 16 CALL GSTRCU ; Current string to pool -3054 13B2 CD 23 15 CALL GARBGE ; Garbage collection -3055 13B5 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -3056 13B8 EB EX DE,HL ; To DE -3057 13B9 2A 73 31 LD HL,(STRBOT) ; Bottom of string space -3058 13BC 7D FRENUM: LD A,L ; Get LSB of end -3059 13BD 93 SUB E ; Subtract LSB of beginning -3060 13BE 4F LD C,A ; Save difference if C -3061 13BF 7C LD A,H ; Get MSB of end -3062 13C0 9A SBC A,D ; Subtract MSB of beginning -3063 13C1 41 ACPASS: LD B,C ; Return integer AC -3064 13C2 50 ABPASS: LD D,B ; Return integer AB -3065 13C3 1E 00 LD E,0 -3066 13C5 21 5D 31 LD HL,TYPE ; Point to type -3067 13C8 73 LD (HL),E ; Set type to numeric -3068 13C9 06 90 LD B,80H+16 ; 16 bit integer -3069 13CB C3 00 1A JP RETINT ; Return the integr -3070 13CE -3071 13CE 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position -3072 13D1 47 PASSA: LD B,A ; Put A into AB -3073 13D2 AF XOR A ; Zero A -3074 13D3 C3 C2 13 JP ABPASS ; Return integer AB -3075 13D6 -3076 13D6 CD 59 14 DEF: CALL CHEKFN ; Get "FN" and name -3077 13D9 CD 4B 14 CALL IDTEST ; Test for illegal direct -3078 13DC 01 31 0D LD BC,DATA ; To get next statement -3079 13DF C5 PUSH BC ; Save address for RETurn -3080 13E0 D5 PUSH DE ; Save address of function ptr -3081 13E1 CD 10 0A CALL CHKSYN ; Make sure "(" follows -3082 13E4 28 .BYTE "(" -3083 13E5 CD FD 11 CALL GETVAR ; Get argument variable name -3084 13E8 E5 PUSH HL ; Save code string address -3085 13E9 EB EX DE,HL ; Argument address to HL -3086 13EA 2B DEC HL -3087 13EB 56 LD D,(HL) ; Get first byte of arg name -3088 13EC 2B DEC HL -3089 13ED 5E LD E,(HL) ; Get second byte of arg name -3090 13EE E1 POP HL ; Restore code string address -3091 13EF CD 0A 10 CALL TSTNUM ; Make sure numeric argument -3092 13F2 CD 10 0A CALL CHKSYN ; Make sure ")" follows -3093 13F5 29 .BYTE ")" -3094 13F6 CD 10 0A CALL CHKSYN ; Make sure "=" follows -3095 13F9 B4 .BYTE ZEQUAL ; "=" token -3096 13FA 44 LD B,H ; Code string address to BC -3097 13FB 4D LD C,L -3098 13FC E3 EX (SP),HL ; Save code str , Get FN ptr -3099 13FD 71 LD (HL),C ; Save LSB of FN code string -3100 13FE 23 INC HL -3101 13FF 70 LD (HL),B ; Save MSB of FN code string -3102 1400 C3 98 14 JP SVSTAD ; Save address and do function -3103 1403 -3104 1403 CD 59 14 DOFN: CALL CHEKFN ; Make sure FN follows -3105 1406 D5 PUSH DE ; Save function pointer address -3106 1407 CD DE 10 CALL EVLPAR ; Evaluate expression in "()" -3107 140A CD 0A 10 CALL TSTNUM ; Make sure numeric result -3108 140D E3 EX (SP),HL ; Save code str , Get FN ptr -3109 140E 5E LD E,(HL) ; Get LSB of FN code string -3110 140F 23 INC HL -3111 1410 56 LD D,(HL) ; Get MSB of FN code string -3112 1411 23 INC HL -3113 1412 7A LD A,D ; And function DEFined? -3114 1413 B3 OR E -3115 1414 CA 4E 07 JP Z,UFERR ; No - ?UF Error -3116 1417 7E LD A,(HL) ; Get LSB of argument address -3117 1418 23 INC HL -3118 1419 66 LD H,(HL) ; Get MSB of argument address -3119 141A 6F LD L,A ; HL = Arg variable address -3120 141B E5 PUSH HL ; Save it -3121 141C 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name -3122 141F E3 EX (SP),HL ; ; Save old , Get new -3123 1420 22 8E 31 LD (FNRGNM),HL ; Set new argument name -3124 1423 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value -3125 1426 E5 PUSH HL ; Save it -3126 1427 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value -3127 142A E5 PUSH HL ; Save it -3128 142B 21 90 31 LD HL,FNARG ; HL = Value of argument -3129 142E D5 PUSH DE ; Save FN code string address -3130 142F CD 41 1A CALL FPTHL ; Move FPREG to argument -3131 1432 E1 POP HL ; Get FN code string address -3132 1433 CD 07 10 CALL GETNUM ; Get value from function -3133 1436 2B DEC HL ; DEC 'cos GETCHR INCs -3134 1437 CD 9A 0B CALL GETCHR ; Get next character -3135 143A C2 42 07 JP NZ,SNERR ; Bad character in FN - Error -3136 143D E1 POP HL ; Get MSB,EXP of old arg -3137 143E 22 90 31 LD (FNARG),HL ; Restore it -3138 1441 E1 POP HL ; Get LSB,NLSB of old arg -3139 1442 22 92 31 LD (FNARG+2),HL ; Restore it -3140 1445 E1 POP HL ; Get name of old arg -3141 1446 22 8E 31 LD (FNRGNM),HL ; Restore it -3142 1449 E1 POP HL ; Restore code string address -3143 144A C9 RET -3144 144B -3145 144B E5 IDTEST: PUSH HL ; Save code string address -3146 144C 2A 0C 31 LD HL,(LINEAT) ; Get current line number -3147 144F 23 INC HL ; -1 means direct statement -3148 1450 7C LD A,H -3149 1451 B5 OR L -3150 1452 E1 POP HL ; Restore code string address -3151 1453 C0 RET NZ ; Return if in program -3152 1454 1E 16 LD E,ID ; ?ID Error -3153 1456 C3 56 07 JP ERROR -3154 1459 -3155 1459 CD 10 0A CHEKFN: CALL CHKSYN ; Make sure FN follows -3156 145C A7 .BYTE ZFN ; "FN" token -3157 145D 3E 80 LD A,80H -3158 145F 32 7B 31 LD (FORFLG),A ; Flag FN name to find -3159 1462 B6 OR (HL) ; FN name has bit 7 set -3160 1463 47 LD B,A ; in first byte of name -3161 1464 CD 02 12 CALL GTFNAM ; Get FN name -3162 1467 C3 0A 10 JP TSTNUM ; Make sure numeric function -3163 146A -3164 146A CD 0A 10 STR: CALL TSTNUM ; Make sure it's a number -3165 146D CD 8E 1B CALL NUMASC ; Turn number into text -3166 1470 CD 9E 14 STR1: CALL CRTST ; Create string entry for it -3167 1473 CD 23 16 CALL GSTRCU ; Current string to pool -3168 1476 01 7E 16 LD BC,TOPOOL ; Save in string pool -3169 1479 C5 PUSH BC ; Save address on stack -3170 147A -3171 147A 7E SAVSTR: LD A,(HL) ; Get string length -3172 147B 23 INC HL -3173 147C 23 INC HL -3174 147D E5 PUSH HL ; Save pointer to string -3175 147E CD F9 14 CALL TESTR ; See if enough string space -3176 1481 E1 POP HL ; Restore pointer to string -3177 1482 4E LD C,(HL) ; Get LSB of address -3178 1483 23 INC HL -3179 1484 46 LD B,(HL) ; Get MSB of address -3180 1485 CD 92 14 CALL CRTMST ; Create string entry -3181 1488 E5 PUSH HL ; Save pointer to MSB of addr -3182 1489 6F LD L,A ; Length of string -3183 148A CD 16 16 CALL TOSTRA ; Move to string area -3184 148D D1 POP DE ; Restore pointer to MSB -3185 148E C9 RET -3186 148F -3187 148F CD F9 14 MKTMST: CALL TESTR ; See if enough string space -3188 1492 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string -3189 1495 E5 PUSH HL ; Save it -3190 1496 77 LD (HL),A ; Save length of string -3191 1497 23 INC HL -3192 1498 23 SVSTAD: INC HL -3193 1499 73 LD (HL),E ; Save LSB of address -3194 149A 23 INC HL -3195 149B 72 LD (HL),D ; Save MSB of address -3196 149C E1 POP HL ; Restore pointer -3197 149D C9 RET -3198 149E -3199 149E 2B CRTST: DEC HL ; DEC - INCed after -3200 149F 06 22 QTSTR: LD B,'"' ; Terminating quote -3201 14A1 50 LD D,B ; Quote to D -3202 14A2 E5 DTSTR: PUSH HL ; Save start -3203 14A3 0E FF LD C,-1 ; Set counter to -1 -3204 14A5 23 QTSTLP: INC HL ; Move on -3205 14A6 7E LD A,(HL) ; Get byte -3206 14A7 0C INC C ; Count bytes -3207 14A8 B7 OR A ; End of line? -3208 14A9 CA B4 14 JP Z,CRTSTE ; Yes - Create string entry -3209 14AC BA CP D ; Terminator D found? -3210 14AD CA B4 14 JP Z,CRTSTE ; Yes - Create string entry -3211 14B0 B8 CP B ; Terminator B found? -3212 14B1 C2 A5 14 JP NZ,QTSTLP ; No - Keep looking -3213 14B4 FE 22 CRTSTE: CP '"' ; End with '"'? -3214 14B6 CC 9A 0B CALL Z,GETCHR ; Yes - Get next character -3215 14B9 E3 EX (SP),HL ; Starting quote -3216 14BA 23 INC HL ; First byte of string -3217 14BB EB EX DE,HL ; To DE -3218 14BC 79 LD A,C ; Get length -3219 14BD CD 92 14 CALL CRTMST ; Create string entry -3220 14C0 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string -3221 14C3 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -3222 14C6 22 94 31 LD (FPREG),HL ; Save address of string ptr -3223 14C9 3E 01 LD A,1 -3224 14CB 32 5D 31 LD (TYPE),A ; Set type to string -3225 14CE CD 44 1A CALL DETHL4 ; Move string to pool -3226 14D1 CD 0A 0A CALL CPDEHL ; Out of string pool? -3227 14D4 22 61 31 LD (TMSTPT),HL ; Save new pointer -3228 14D7 E1 POP HL ; Restore code string address -3229 14D8 7E LD A,(HL) ; Get next code byte -3230 14D9 C0 RET NZ ; Return if pool OK -3231 14DA 1E 1E LD E,ST ; ?ST Error -3232 14DC C3 56 07 JP ERROR ; String pool overflow -3233 14DF -3234 14DF 23 PRNUMS: INC HL ; Skip leading space -3235 14E0 CD 9E 14 PRS: CALL CRTST ; Create string entry for it -3236 14E3 CD 23 16 PRS1: CALL GSTRCU ; Current string to pool -3237 14E6 CD 38 1A CALL LOADFP ; Move string block to BCDE -3238 14E9 1C INC E ; Length + 1 -3239 14EA 1D PRSLP: DEC E ; Count characters -3240 14EB C8 RET Z ; End of string -3241 14EC 0A LD A,(BC) ; Get byte to output -3242 14ED CD 1B 0A CALL OUTC ; Output character in A -3243 14F0 FE 0D CP CR ; Return? -3244 14F2 CC 4C 0E CALL Z,DONULL ; Yes - Do nulls -3245 14F5 03 INC BC ; Next byte in string -3246 14F6 C3 EA 14 JP PRSLP ; More characters to output -3247 14F9 -3248 14F9 B7 TESTR: OR A ; Test if enough room -3249 14FA 0E .BYTE 0EH ; No garbage collection done -3250 14FB F1 GRBDON: POP AF ; Garbage collection done -3251 14FC F5 PUSH AF ; Save status -3252 14FD 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -3253 1500 EB EX DE,HL ; To DE -3254 1501 2A 73 31 LD HL,(STRBOT) ; Bottom of string area -3255 1504 2F CPL ; Negate length (Top down) -3256 1505 4F LD C,A ; -Length to BC -3257 1506 06 FF LD B,-1 ; BC = -ve length of string -3258 1508 09 ADD HL,BC ; Add to bottom of space in use -3259 1509 23 INC HL ; Plus one for 2's complement -3260 150A CD 0A 0A CALL CPDEHL ; Below string RAM area? -3261 150D DA 17 15 JP C,TESTOS ; Tidy up if not done else err -3262 1510 22 73 31 LD (STRBOT),HL ; Save new bottom of area -3263 1513 23 INC HL ; Point to first byte of string -3264 1514 EB EX DE,HL ; Address to DE -3265 1515 F1 POPAF: POP AF ; Throw away status push -3266 1516 C9 RET -3267 1517 -3268 1517 F1 TESTOS: POP AF ; Garbage collect been done? -3269 1518 1E 1A LD E,OS ; ?OS Error -3270 151A CA 56 07 JP Z,ERROR ; Yes - Not enough string apace -3271 151D BF CP A ; Flag garbage collect done -3272 151E F5 PUSH AF ; Save status -3273 151F 01 FB 14 LD BC,GRBDON ; Garbage collection done -3274 1522 C5 PUSH BC ; Save for RETurn -3275 1523 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer -3276 1526 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer -3277 1529 21 00 00 LD HL,0 -3278 152C E5 PUSH HL ; Flag no string found -3279 152D 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space -3280 1530 E5 PUSH HL ; Save bottom of string space -3281 1531 21 63 31 LD HL,TMSTPL ; Temporary string pool -3282 1534 EB GRBLP: EX DE,HL -3283 1535 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -3284 1538 EB EX DE,HL -3285 1539 CD 0A 0A CALL CPDEHL ; Temporary string pool done? -3286 153C 01 34 15 LD BC,GRBLP ; Loop until string pool done -3287 153F C2 88 15 JP NZ,STPOOL ; No - See if in string area -3288 1542 2A 86 31 LD HL,(PROGND) ; Start of simple variables -3289 1545 EB SMPVAR: EX DE,HL -3290 1546 2A 88 31 LD HL,(VAREND) ; End of simple variables -3291 1549 EB EX DE,HL -3292 154A CD 0A 0A CALL CPDEHL ; All simple strings done? -3293 154D CA 5B 15 JP Z,ARRLP ; Yes - Do string arrays -3294 1550 7E LD A,(HL) ; Get type of variable -3295 1551 23 INC HL -3296 1552 23 INC HL -3297 1553 B7 OR A ; "S" flag set if string -3298 1554 CD 8B 15 CALL STRADD ; See if string in string area -3299 1557 C3 45 15 JP SMPVAR ; Loop until simple ones done -3300 155A -3301 155A C1 GNXARY: POP BC ; Scrap address of this array -3302 155B EB ARRLP: EX DE,HL -3303 155C 2A 8A 31 LD HL,(ARREND) ; End of string arrays -3304 155F EB EX DE,HL -3305 1560 CD 0A 0A CALL CPDEHL ; All string arrays done? -3306 1563 CA B1 15 JP Z,SCNEND ; Yes - Move string if found -3307 1566 CD 38 1A CALL LOADFP ; Get array name to BCDE -3308 1569 7B LD A,E ; Get type of array -3309 156A E5 PUSH HL ; Save address of num of dim'ns -3310 156B 09 ADD HL,BC ; Start of next array -3311 156C B7 OR A ; Test type of array -3312 156D F2 5A 15 JP P,GNXARY ; Numeric array - Ignore it -3313 1570 22 75 31 LD (CUROPR),HL ; Save address of next array -3314 1573 E1 POP HL ; Get address of num of dim'ns -3315 1574 4E LD C,(HL) ; BC = Number of dimensions -3316 1575 06 00 LD B,0 -3317 1577 09 ADD HL,BC ; Two bytes per dimension size -3318 1578 09 ADD HL,BC -3319 1579 23 INC HL ; Plus one for number of dim'ns -3320 157A EB GRBARY: EX DE,HL -3321 157B 2A 75 31 LD HL,(CUROPR) ; Get address of next array -3322 157E EB EX DE,HL -3323 157F CD 0A 0A CALL CPDEHL ; Is this array finished? -3324 1582 CA 5B 15 JP Z,ARRLP ; Yes - Get next one -3325 1585 01 7A 15 LD BC,GRBARY ; Loop until array all done -3326 1588 C5 STPOOL: PUSH BC ; Save return address -3327 1589 F6 80 OR 80H ; Flag string type -3328 158B 7E STRADD: LD A,(HL) ; Get string length -3329 158C 23 INC HL -3330 158D 23 INC HL -3331 158E 5E LD E,(HL) ; Get LSB of string address -3332 158F 23 INC HL -3333 1590 56 LD D,(HL) ; Get MSB of string address -3334 1591 23 INC HL -3335 1592 F0 RET P ; Not a string - Return -3336 1593 B7 OR A ; Set flags on string length -3337 1594 C8 RET Z ; Null string - Return -3338 1595 44 LD B,H ; Save variable pointer -3339 1596 4D LD C,L -3340 1597 2A 73 31 LD HL,(STRBOT) ; Bottom of new area -3341 159A CD 0A 0A CALL CPDEHL ; String been done? -3342 159D 60 LD H,B ; Restore variable pointer -3343 159E 69 LD L,C -3344 159F D8 RET C ; String done - Ignore -3345 15A0 E1 POP HL ; Return address -3346 15A1 E3 EX (SP),HL ; Lowest available string area -3347 15A2 CD 0A 0A CALL CPDEHL ; String within string area? -3348 15A5 E3 EX (SP),HL ; Lowest available string area -3349 15A6 E5 PUSH HL ; Re-save return address -3350 15A7 60 LD H,B ; Restore variable pointer -3351 15A8 69 LD L,C -3352 15A9 D0 RET NC ; Outside string area - Ignore -3353 15AA C1 POP BC ; Get return , Throw 2 away -3354 15AB F1 POP AF ; -3355 15AC F1 POP AF ; -3356 15AD E5 PUSH HL ; Save variable pointer -3357 15AE D5 PUSH DE ; Save address of current -3358 15AF C5 PUSH BC ; Put back return address -3359 15B0 C9 RET ; Go to it -3360 15B1 -3361 15B1 D1 SCNEND: POP DE ; Addresses of strings -3362 15B2 E1 POP HL ; -3363 15B3 7D LD A,L ; HL = 0 if no more to do -3364 15B4 B4 OR H -3365 15B5 C8 RET Z ; No more to do - Return -3366 15B6 2B DEC HL -3367 15B7 46 LD B,(HL) ; MSB of address of string -3368 15B8 2B DEC HL -3369 15B9 4E LD C,(HL) ; LSB of address of string -3370 15BA E5 PUSH HL ; Save variable address -3371 15BB 2B DEC HL -3372 15BC 2B DEC HL -3373 15BD 6E LD L,(HL) ; HL = Length of string -3374 15BE 26 00 LD H,0 -3375 15C0 09 ADD HL,BC ; Address of end of string+1 -3376 15C1 50 LD D,B ; String address to DE -3377 15C2 59 LD E,C -3378 15C3 2B DEC HL ; Last byte in string -3379 15C4 44 LD B,H ; Address to BC -3380 15C5 4D LD C,L -3381 15C6 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -3382 15C9 CD 11 07 CALL MOVSTR ; Move string to new address -3383 15CC E1 POP HL ; Restore variable address -3384 15CD 71 LD (HL),C ; Save new LSB of address -3385 15CE 23 INC HL -3386 15CF 70 LD (HL),B ; Save new MSB of address -3387 15D0 69 LD L,C ; Next string area+1 to HL -3388 15D1 60 LD H,B -3389 15D2 2B DEC HL ; Next string area address -3390 15D3 C3 26 15 JP GARBLP ; Look for more strings -3391 15D6 -3392 15D6 C5 CONCAT: PUSH BC ; Save prec' opr & code string -3393 15D7 E5 PUSH HL ; -3394 15D8 2A 94 31 LD HL,(FPREG) ; Get first string -3395 15DB E3 EX (SP),HL ; Save first string -3396 15DC CD 90 10 CALL OPRND ; Get second string -3397 15DF E3 EX (SP),HL ; Restore first string -3398 15E0 CD 0B 10 CALL TSTSTR ; Make sure it's a string -3399 15E3 7E LD A,(HL) ; Get length of second string -3400 15E4 E5 PUSH HL ; Save first string -3401 15E5 2A 94 31 LD HL,(FPREG) ; Get second string -3402 15E8 E5 PUSH HL ; Save second string -3403 15E9 86 ADD A,(HL) ; Add length of second string -3404 15EA 1E 1C LD E,LS ; ?LS Error -3405 15EC DA 56 07 JP C,ERROR ; String too long - Error -3406 15EF CD 8F 14 CALL MKTMST ; Make temporary string -3407 15F2 D1 POP DE ; Get second string to DE -3408 15F3 CD 27 16 CALL GSTRDE ; Move to string pool if needed -3409 15F6 E3 EX (SP),HL ; Get first string -3410 15F7 CD 26 16 CALL GSTRHL ; Move to string pool if needed -3411 15FA E5 PUSH HL ; Save first string -3412 15FB 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address -3413 15FE EB EX DE,HL ; To DE -3414 15FF CD 0D 16 CALL SSTSA ; First string to string area -3415 1602 CD 0D 16 CALL SSTSA ; Second string to string area -3416 1605 21 25 10 LD HL,EVAL2 ; Return to evaluation loop -3417 1608 E3 EX (SP),HL ; Save return,get code string -3418 1609 E5 PUSH HL ; Save code string address -3419 160A C3 C0 14 JP TSTOPL ; To temporary string to pool -3420 160D -3421 160D E1 SSTSA: POP HL ; Return address -3422 160E E3 EX (SP),HL ; Get string block,save return -3423 160F 7E LD A,(HL) ; Get length of string -3424 1610 23 INC HL -3425 1611 23 INC HL -3426 1612 4E LD C,(HL) ; Get LSB of string address -3427 1613 23 INC HL -3428 1614 46 LD B,(HL) ; Get MSB of string address -3429 1615 6F LD L,A ; Length to L -3430 1616 2C TOSTRA: INC L ; INC - DECed after -3431 1617 2D TSALP: DEC L ; Count bytes moved -3432 1618 C8 RET Z ; End of string - Return -3433 1619 0A LD A,(BC) ; Get source -3434 161A 12 LD (DE),A ; Save destination -3435 161B 03 INC BC ; Next source -3436 161C 13 INC DE ; Next destination -3437 161D C3 17 16 JP TSALP ; Loop until string moved -3438 1620 -3439 1620 CD 0B 10 GETSTR: CALL TSTSTR ; Make sure it's a string -3440 1623 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string -3441 1626 EB GSTRHL: EX DE,HL ; Save DE -3442 1627 CD 41 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? -3443 162A EB EX DE,HL ; Restore DE -3444 162B C0 RET NZ ; No - Return -3445 162C D5 PUSH DE ; Save string -3446 162D 50 LD D,B ; String block address to DE -3447 162E 59 LD E,C -3448 162F 1B DEC DE ; Point to length -3449 1630 4E LD C,(HL) ; Get string length -3450 1631 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -3451 1634 CD 0A 0A CALL CPDEHL ; Last one in string area? -3452 1637 C2 3F 16 JP NZ,POPHL ; No - Return -3453 163A 47 LD B,A ; Clear B (A=0) -3454 163B 09 ADD HL,BC ; Remove string from str' area -3455 163C 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area -3456 163F E1 POPHL: POP HL ; Restore string -3457 1640 C9 RET -3458 1641 -3459 1641 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top -3460 1644 2B DEC HL ; Back -3461 1645 46 LD B,(HL) ; Get MSB of address -3462 1646 2B DEC HL ; Back -3463 1647 4E LD C,(HL) ; Get LSB of address -3464 1648 2B DEC HL ; Back -3465 1649 2B DEC HL ; Back -3466 164A CD 0A 0A CALL CPDEHL ; String last in string pool? -3467 164D C0 RET NZ ; Yes - Leave it -3468 164E 22 61 31 LD (TMSTPT),HL ; Save new string pool top -3469 1651 C9 RET -3470 1652 -3471 1652 01 D1 13 LEN: LD BC,PASSA ; To return integer A -3472 1655 C5 PUSH BC ; Save address -3473 1656 CD 20 16 GETLEN: CALL GETSTR ; Get string and its length -3474 1659 AF XOR A -3475 165A 57 LD D,A ; Clear D -3476 165B 32 5D 31 LD (TYPE),A ; Set type to numeric -3477 165E 7E LD A,(HL) ; Get length of string -3478 165F B7 OR A ; Set status flags -3479 1660 C9 RET -3480 1661 -3481 1661 01 D1 13 ASC: LD BC,PASSA ; To return integer A -3482 1664 C5 PUSH BC ; Save address -3483 1665 CD 56 16 GTFLNM: CALL GETLEN ; Get length of string -3484 1668 CA 61 0C JP Z,FCERR ; Null string - Error -3485 166B 23 INC HL -3486 166C 23 INC HL -3487 166D 5E LD E,(HL) ; Get LSB of address -3488 166E 23 INC HL -3489 166F 56 LD D,(HL) ; Get MSB of address -3490 1670 1A LD A,(DE) ; Get first byte of string -3491 1671 C9 RET -3492 1672 -3493 1672 3E 01 CHR: LD A,1 ; One character string -3494 1674 CD 8F 14 CALL MKTMST ; Make a temporary string -3495 1677 CD 6B 17 CALL MAKINT ; Make it integer A -3496 167A 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string -3497 167D 73 LD (HL),E ; Save character -3498 167E C1 TOPOOL: POP BC ; Clean up stack -3499 167F C3 C0 14 JP TSTOPL ; Temporary string to pool -3500 1682 -3501 1682 CD 1B 17 LEFT: CALL LFRGNM ; Get number and ending ")" -3502 1685 AF XOR A ; Start at first byte in string -3503 1686 E3 RIGHT1: EX (SP),HL ; Save code string,Get string -3504 1687 4F LD C,A ; Starting position in string -3505 1688 E5 MID1: PUSH HL ; Save string block address -3506 1689 7E LD A,(HL) ; Get length of string -3507 168A B8 CP B ; Compare with number given -3508 168B DA 90 16 JP C,ALLFOL ; All following bytes required -3509 168E 78 LD A,B ; Get new length -3510 168F 11 .BYTE 11H ; Skip "LD C,0" -3511 1690 0E 00 ALLFOL: LD C,0 ; First byte of string -3512 1692 C5 PUSH BC ; Save position in string -3513 1693 CD F9 14 CALL TESTR ; See if enough string space -3514 1696 C1 POP BC ; Get position in string -3515 1697 E1 POP HL ; Restore string block address -3516 1698 E5 PUSH HL ; And re-save it -3517 1699 23 INC HL -3518 169A 23 INC HL -3519 169B 46 LD B,(HL) ; Get LSB of address -3520 169C 23 INC HL -3521 169D 66 LD H,(HL) ; Get MSB of address -3522 169E 68 LD L,B ; HL = address of string -3523 169F 06 00 LD B,0 ; BC = starting address -3524 16A1 09 ADD HL,BC ; Point to that byte -3525 16A2 44 LD B,H ; BC = source string -3526 16A3 4D LD C,L -3527 16A4 CD 92 14 CALL CRTMST ; Create a string entry -3528 16A7 6F LD L,A ; Length of new string -3529 16A8 CD 16 16 CALL TOSTRA ; Move string to string area -3530 16AB D1 POP DE ; Clear stack -3531 16AC CD 27 16 CALL GSTRDE ; Move to string pool if needed -3532 16AF C3 C0 14 JP TSTOPL ; Temporary string to pool -3533 16B2 -3534 16B2 CD 1B 17 RIGHT: CALL LFRGNM ; Get number and ending ")" -3535 16B5 D1 POP DE ; Get string length -3536 16B6 D5 PUSH DE ; And re-save -3537 16B7 1A LD A,(DE) ; Get length -3538 16B8 90 SUB B ; Move back N bytes -3539 16B9 C3 86 16 JP RIGHT1 ; Go and get sub-string -3540 16BC -3541 16BC EB MID: EX DE,HL ; Get code string address -3542 16BD 7E LD A,(HL) ; Get next byte ',' or ")" -3543 16BE CD 20 17 CALL MIDNUM ; Get number supplied -3544 16C1 04 INC B ; Is it character zero? -3545 16C2 05 DEC B -3546 16C3 CA 61 0C JP Z,FCERR ; Yes - Error -3547 16C6 C5 PUSH BC ; Save starting position -3548 16C7 1E FF LD E,255 ; All of string -3549 16C9 FE 29 CP ')' ; Any length given? -3550 16CB CA D5 16 JP Z,RSTSTR ; No - Rest of string -3551 16CE CD 10 0A CALL CHKSYN ; Make sure ',' follows -3552 16D1 2C .BYTE ',' -3553 16D2 CD 68 17 CALL GETINT ; Get integer 0-255 -3554 16D5 CD 10 0A RSTSTR: CALL CHKSYN ; Make sure ")" follows -3555 16D8 29 .BYTE ")" -3556 16D9 F1 POP AF ; Restore starting position -3557 16DA E3 EX (SP),HL ; Get string,8ave code string -3558 16DB 01 88 16 LD BC,MID1 ; Continuation of MID$ routine -3559 16DE C5 PUSH BC ; Save for return -3560 16DF 3D DEC A ; Starting position-1 -3561 16E0 BE CP (HL) ; Compare with length -3562 16E1 06 00 LD B,0 ; Zero bytes length -3563 16E3 D0 RET NC ; Null string if start past end -3564 16E4 4F LD C,A ; Save starting position-1 -3565 16E5 7E LD A,(HL) ; Get length of string -3566 16E6 91 SUB C ; Subtract start -3567 16E7 BB CP E ; Enough string for it? -3568 16E8 47 LD B,A ; Save maximum length available -3569 16E9 D8 RET C ; Truncate string if needed -3570 16EA 43 LD B,E ; Set specified length -3571 16EB C9 RET ; Go and create string -3572 16EC -3573 16EC CD 56 16 VAL: CALL GETLEN ; Get length of string -3574 16EF CA 09 18 JP Z,RESZER ; Result zero -3575 16F2 5F LD E,A ; Save length -3576 16F3 23 INC HL -3577 16F4 23 INC HL -3578 16F5 7E LD A,(HL) ; Get LSB of address -3579 16F6 23 INC HL -3580 16F7 66 LD H,(HL) ; Get MSB of address -3581 16F8 6F LD L,A ; HL = String address -3582 16F9 E5 PUSH HL ; Save string address -3583 16FA 19 ADD HL,DE -3584 16FB 46 LD B,(HL) ; Get end of string+1 byte -3585 16FC 72 LD (HL),D ; Zero it to terminate -3586 16FD E3 EX (SP),HL ; Save string end,get start -3587 16FE C5 PUSH BC ; Save end+1 byte -3588 16FF 7E LD A,(HL) ; Get starting byte -3589 1700 FE 24 CP '$' ; Hex number indicated? [function added] -3590 1702 C2 0A 17 JP NZ,VAL1 -3591 1705 CD 34 1F CALL HEXTFP ; Convert Hex to FPREG -3592 1708 18 0D JR VAL3 -3593 170A FE 25 VAL1: CP '%' ; Binary number indicated? [function added] -3594 170C C2 14 17 JP NZ,VAL2 -3595 170F CD A4 1F CALL BINTFP ; Convert Bin to FPREG -3596 1712 18 03 JR VAL3 -3597 1714 CD F0 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP -3598 1717 C1 VAL3: POP BC ; Restore end+1 byte -3599 1718 E1 POP HL ; Restore end+1 address -3600 1719 70 LD (HL),B ; Put back original byte -3601 171A C9 RET -3602 171B -3603 171B EB LFRGNM: EX DE,HL ; Code string address to HL -3604 171C CD 10 0A CALL CHKSYN ; Make sure ")" follows -3605 171F 29 .BYTE ")" -3606 1720 C1 MIDNUM: POP BC ; Get return address -3607 1721 D1 POP DE ; Get number supplied -3608 1722 C5 PUSH BC ; Re-save return address -3609 1723 43 LD B,E ; Number to B -3610 1724 C9 RET -3611 1725 -3612 1725 CD 6B 17 INP: CALL MAKINT ; Make it integer A -3613 1728 32 EF 30 LD (INPORT),A ; Set input port -3614 172B CD EE 30 CALL INPSUB ; Get input from port -3615 172E C3 D1 13 JP PASSA ; Return integer A -3616 1731 -3617 1731 CD 55 17 POUT: CALL SETIO ; Set up port number -3618 1734 C3 B6 30 JP OUTSUB ; Output data and return -3619 1737 -3620 1737 CD 55 17 WAIT: CALL SETIO ; Set up port number -3621 173A F5 PUSH AF ; Save AND mask -3622 173B 1E 00 LD E,0 ; Assume zero if none given -3623 173D 2B DEC HL ; DEC 'cos GETCHR INCs -3624 173E CD 9A 0B CALL GETCHR ; Get next character -3625 1741 CA 4B 17 JP Z,NOXOR ; No XOR byte given -3626 1744 CD 10 0A CALL CHKSYN ; Make sure ',' follows -3627 1747 2C .BYTE ',' -3628 1748 CD 68 17 CALL GETINT ; Get integer 0-255 to XOR with -3629 174B C1 NOXOR: POP BC ; Restore AND mask -3630 174C CD EE 30 WAITLP: CALL INPSUB ; Get input -3631 174F AB XOR E ; Flip selected bits -3632 1750 A0 AND B ; Result non-zero? -3633 1751 CA 4C 17 JP Z,WAITLP ; No = keep waiting -3634 1754 C9 RET -3635 1755 -3636 1755 CD 68 17 SETIO: CALL GETINT ; Get integer 0-255 -3637 1758 32 EF 30 LD (INPORT),A ; Set input port -3638 175B 32 B7 30 LD (OTPORT),A ; Set output port -3639 175E CD 10 0A CALL CHKSYN ; Make sure ',' follows -3640 1761 2C .BYTE ',' -3641 1762 C3 68 17 JP GETINT ; Get integer 0-255 and return -3642 1765 -3643 1765 CD 9A 0B FNDNUM: CALL GETCHR ; Get next character -3644 1768 CD 07 10 GETINT: CALL GETNUM ; Get a number from 0 to 255 -3645 176B CD 46 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 -3646 176E 7A LD A,D ; Get MSB of number -3647 176F B7 OR A ; Zero? -3648 1770 C2 61 0C JP NZ,FCERR ; No - Error -3649 1773 2B DEC HL ; DEC 'cos GETCHR INCs -3650 1774 CD 9A 0B CALL GETCHR ; Get next character -3651 1777 7B LD A,E ; Get number to A -3652 1778 C9 RET -3653 1779 -3654 1779 CD 4C 0C PEEK: CALL DEINT ; Get memory address -3655 177C 1A LD A,(DE) ; Get byte in memory -3656 177D C3 D1 13 JP PASSA ; Return integer A -3657 1780 -3658 1780 CD 07 10 POKE: CALL GETNUM ; Get memory address -3659 1783 CD 4C 0C CALL DEINT ; Get integer -32768 to 3276 -3660 1786 D5 PUSH DE ; Save memory address -3661 1787 CD 10 0A CALL CHKSYN ; Make sure ',' follows -3662 178A 2C .BYTE ',' -3663 178B CD 68 17 CALL GETINT ; Get integer 0-255 -3664 178E D1 POP DE ; Restore memory address -3665 178F 12 LD (DE),A ; Load it into memory -3666 1790 C9 RET -3667 1791 -3668 1791 21 67 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG -3669 1794 CD 38 1A ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE -3670 1797 C3 A3 17 JP FPADD ; Add BCDE to FPREG -3671 179A -3672 179A CD 38 1A SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL -3673 179D 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3674 179E C1 PSUB: POP BC ; Get FP number from stack -3675 179F D1 POP DE -3676 17A0 CD 12 1A SUBCDE: CALL INVSGN ; Negate FPREG -3677 17A3 78 FPADD: LD A,B ; Get FP exponent -3678 17A4 B7 OR A ; Is number zero? -3679 17A5 C8 RET Z ; Yes - Nothing to add -3680 17A6 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent -3681 17A9 B7 OR A ; Is this number zero? -3682 17AA CA 2A 1A JP Z,FPBCDE ; Yes - Move BCDE to FPREG -3683 17AD 90 SUB B ; BCDE number larger? -3684 17AE D2 BD 17 JP NC,NOSWAP ; No - Don't swap them -3685 17B1 2F CPL ; Two's complement -3686 17B2 3C INC A ; FP exponent -3687 17B3 EB EX DE,HL -3688 17B4 CD 1A 1A CALL STAKFP ; Put FPREG on stack -3689 17B7 EB EX DE,HL -3690 17B8 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG -3691 17BB C1 POP BC ; Restore number from stack -3692 17BC D1 POP DE -3693 17BD FE 19 NOSWAP: CP 24+1 ; Second number insignificant? -3694 17BF D0 RET NC ; Yes - First number is result -3695 17C0 F5 PUSH AF ; Save number of bits to scale -3696 17C1 CD 4F 1A CALL SIGNS ; Set MSBs & sign of result -3697 17C4 67 LD H,A ; Save sign of result -3698 17C5 F1 POP AF ; Restore scaling factor -3699 17C6 CD 68 18 CALL SCALE ; Scale BCDE to same exponent -3700 17C9 B4 OR H ; Result to be positive? -3701 17CA 21 94 31 LD HL,FPREG ; Point to FPREG -3702 17CD F2 E3 17 JP P,MINCDE ; No - Subtract FPREG from CDE -3703 17D0 CD 48 18 CALL PLUCDE ; Add FPREG to CDE -3704 17D3 D2 29 18 JP NC,RONDUP ; No overflow - Round it up -3705 17D6 23 INC HL ; Point to exponent -3706 17D7 34 INC (HL) ; Increment it -3707 17D8 CA 51 07 JP Z,OVERR ; Number overflowed - Error -3708 17DB 2E 01 LD L,1 ; 1 bit to shift right -3709 17DD CD 7E 18 CALL SHRT1 ; Shift result right -3710 17E0 C3 29 18 JP RONDUP ; Round it up -3711 17E3 -3712 17E3 AF MINCDE: XOR A ; Clear A and carry -3713 17E4 90 SUB B ; Negate exponent -3714 17E5 47 LD B,A ; Re-save exponent -3715 17E6 7E LD A,(HL) ; Get LSB of FPREG -3716 17E7 9B SBC A, E ; Subtract LSB of BCDE -3717 17E8 5F LD E,A ; Save LSB of BCDE -3718 17E9 23 INC HL -3719 17EA 7E LD A,(HL) ; Get NMSB of FPREG -3720 17EB 9A SBC A,D ; Subtract NMSB of BCDE -3721 17EC 57 LD D,A ; Save NMSB of BCDE -3722 17ED 23 INC HL -3723 17EE 7E LD A,(HL) ; Get MSB of FPREG -3724 17EF 99 SBC A,C ; Subtract MSB of BCDE -3725 17F0 4F LD C,A ; Save MSB of BCDE -3726 17F1 DC 54 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive -3727 17F4 -3728 17F4 68 BNORM: LD L,B ; L = Exponent -3729 17F5 63 LD H,E ; H = LSB -3730 17F6 AF XOR A -3731 17F7 47 BNRMLP: LD B,A ; Save bit count -3732 17F8 79 LD A,C ; Get MSB -3733 17F9 B7 OR A ; Is it zero? -3734 17FA C2 16 18 JP NZ,PNORM ; No - Do it bit at a time -3735 17FD 4A LD C,D ; MSB = NMSB -3736 17FE 54 LD D,H ; NMSB= LSB -3737 17FF 65 LD H,L ; LSB = VLSB -3738 1800 6F LD L,A ; VLSB= 0 -3739 1801 78 LD A,B ; Get exponent -3740 1802 D6 08 SUB 8 ; Count 8 bits -3741 1804 FE E0 CP -24-8 ; Was number zero? -3742 1806 C2 F7 17 JP NZ,BNRMLP ; No - Keep normalising -3743 1809 AF RESZER: XOR A ; Result is zero -3744 180A 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero -3745 180D C9 RET -3746 180E -3747 180E 05 NORMAL: DEC B ; Count bits -3748 180F 29 ADD HL,HL ; Shift HL left -3749 1810 7A LD A,D ; Get NMSB -3750 1811 17 RLA ; Shift left with last bit -3751 1812 57 LD D,A ; Save NMSB -3752 1813 79 LD A,C ; Get MSB -3753 1814 8F ADC A,A ; Shift left with last bit -3754 1815 4F LD C,A ; Save MSB -3755 1816 F2 0E 18 PNORM: JP P,NORMAL ; Not done - Keep going -3756 1819 78 LD A,B ; Number of bits shifted -3757 181A 5C LD E,H ; Save HL in EB -3758 181B 45 LD B,L -3759 181C B7 OR A ; Any shifting done? -3760 181D CA 29 18 JP Z,RONDUP ; No - Round it up -3761 1820 21 97 31 LD HL,FPEXP ; Point to exponent -3762 1823 86 ADD A,(HL) ; Add shifted bits -3763 1824 77 LD (HL),A ; Re-save exponent -3764 1825 D2 09 18 JP NC,RESZER ; Underflow - Result is zero -3765 1828 C8 RET Z ; Result is zero -3766 1829 78 RONDUP: LD A,B ; Get VLSB of number -3767 182A 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent -3768 182D B7 OR A ; Any rounding? -3769 182E FC 3B 18 CALL M,FPROND ; Yes - Round number up -3770 1831 46 LD B,(HL) ; B = Exponent -3771 1832 23 INC HL -3772 1833 7E LD A,(HL) ; Get sign of result -3773 1834 E6 80 AND 10000000B ; Only bit 7 needed -3774 1836 A9 XOR C ; Set correct sign -3775 1837 4F LD C,A ; Save correct sign in number -3776 1838 C3 2A 1A JP FPBCDE ; Move BCDE to FPREG -3777 183B -3778 183B 1C FPROND: INC E ; Round LSB -3779 183C C0 RET NZ ; Return if ok -3780 183D 14 INC D ; Round NMSB -3781 183E C0 RET NZ ; Return if ok -3782 183F 0C INC C ; Round MSB -3783 1840 C0 RET NZ ; Return if ok -3784 1841 0E 80 LD C,80H ; Set normal value -3785 1843 34 INC (HL) ; Increment exponent -3786 1844 C0 RET NZ ; Return if ok -3787 1845 C3 51 07 JP OVERR ; Overflow error -3788 1848 -3789 1848 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG -3790 1849 83 ADD A,E ; Add LSB of BCDE -3791 184A 5F LD E,A ; Save LSB of BCDE -3792 184B 23 INC HL -3793 184C 7E LD A,(HL) ; Get NMSB of FPREG -3794 184D 8A ADC A,D ; Add NMSB of BCDE -3795 184E 57 LD D,A ; Save NMSB of BCDE -3796 184F 23 INC HL -3797 1850 7E LD A,(HL) ; Get MSB of FPREG -3798 1851 89 ADC A,C ; Add MSB of BCDE -3799 1852 4F LD C,A ; Save MSB of BCDE -3800 1853 C9 RET -3801 1854 -3802 1854 21 98 31 COMPL: LD HL,SGNRES ; Sign of result -3803 1857 7E LD A,(HL) ; Get sign of result -3804 1858 2F CPL ; Negate it -3805 1859 77 LD (HL),A ; Put it back -3806 185A AF XOR A -3807 185B 6F LD L,A ; Set L to zero -3808 185C 90 SUB B ; Negate exponent,set carry -3809 185D 47 LD B,A ; Re-save exponent -3810 185E 7D LD A,L ; Load zero -3811 185F 9B SBC A,E ; Negate LSB -3812 1860 5F LD E,A ; Re-save LSB -3813 1861 7D LD A,L ; Load zero -3814 1862 9A SBC A,D ; Negate NMSB -3815 1863 57 LD D,A ; Re-save NMSB -3816 1864 7D LD A,L ; Load zero -3817 1865 99 SBC A,C ; Negate MSB -3818 1866 4F LD C,A ; Re-save MSB -3819 1867 C9 RET -3820 1868 -3821 1868 06 00 SCALE: LD B,0 ; Clear underflow -3822 186A D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? -3823 186C DA 77 18 JP C,SHRITE ; No - Shift right A bits -3824 186F 43 LD B,E ; <- Shift -3825 1870 5A LD E,D ; <- right -3826 1871 51 LD D,C ; <- eight -3827 1872 0E 00 LD C,0 ; <- bits -3828 1874 C3 6A 18 JP SCALLP ; More bits to shift -3829 1877 -3830 1877 C6 09 SHRITE: ADD A,8+1 ; Adjust count -3831 1879 6F LD L,A ; Save bits to shift -3832 187A AF SHRLP: XOR A ; Flag for all done -3833 187B 2D DEC L ; All shifting done? -3834 187C C8 RET Z ; Yes - Return -3835 187D 79 LD A,C ; Get MSB -3836 187E 1F SHRT1: RRA ; Shift it right -3837 187F 4F LD C,A ; Re-save -3838 1880 7A LD A,D ; Get NMSB -3839 1881 1F RRA ; Shift right with last bit -3840 1882 57 LD D,A ; Re-save it -3841 1883 7B LD A,E ; Get LSB -3842 1884 1F RRA ; Shift right with last bit -3843 1885 5F LD E,A ; Re-save it -3844 1886 78 LD A,B ; Get underflow -3845 1887 1F RRA ; Shift right with last bit -3846 1888 47 LD B,A ; Re-save underflow -3847 1889 C3 7A 18 JP SHRLP ; More bits to do -3848 188C -3849 188C 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 -3850 1890 -3851 1890 03 LOGTAB: .BYTE 3 ; Table used by LOG -3852 1891 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 -3853 1895 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 -3854 1899 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 -3855 189D -3856 189D CD E9 19 LOG: CALL TSTSGN ; Test sign of value -3857 18A0 B7 OR A -3858 18A1 EA 61 0C JP PE,FCERR ; ?FC Error if <= zero -3859 18A4 21 97 31 LD HL,FPEXP ; Point to exponent -3860 18A7 7E LD A,(HL) ; Get exponent -3861 18A8 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) -3862 18AB 11 F3 04 LD DE,04F3H -3863 18AE 90 SUB B ; Scale value to be < 1 -3864 18AF F5 PUSH AF ; Save scale factor -3865 18B0 70 LD (HL),B ; Save new exponent -3866 18B1 D5 PUSH DE ; Save SQR(1/2) -3867 18B2 C5 PUSH BC -3868 18B3 CD A3 17 CALL FPADD ; Add SQR(1/2) to value -3869 18B6 C1 POP BC ; Restore SQR(1/2) -3870 18B7 D1 POP DE -3871 18B8 04 INC B ; Make it SQR(2) -3872 18B9 CD 3F 19 CALL DVBCDE ; Divide by SQR(2) -3873 18BC 21 8C 18 LD HL,UNITY ; Point to 1. -3874 18BF CD 9A 17 CALL SUBPHL ; Subtract FPREG from 1 -3875 18C2 21 90 18 LD HL,LOGTAB ; Coefficient table -3876 18C5 CD 31 1D CALL SUMSER ; Evaluate sum of series -3877 18C8 01 80 80 LD BC,8080H ; BCDE = -0.5 -3878 18CB 11 00 00 LD DE,0000H -3879 18CE CD A3 17 CALL FPADD ; Subtract 0.5 from FPREG -3880 18D1 F1 POP AF ; Restore scale factor -3881 18D2 CD 64 1B CALL RSCALE ; Re-scale number -3882 18D5 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) -3883 18D8 11 18 72 LD DE,7218H -3884 18DB 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3885 18DC -3886 18DC C1 MULT: POP BC ; Get number from stack -3887 18DD D1 POP DE -3888 18DE CD E9 19 FPMULT: CALL TSTSGN ; Test sign of FPREG -3889 18E1 C8 RET Z ; Return zero if zero -3890 18E2 2E 00 LD L,0 ; Flag add exponents -3891 18E4 CD A7 19 CALL ADDEXP ; Add exponents -3892 18E7 79 LD A,C ; Get MSB of multiplier -3893 18E8 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier -3894 18EB EB EX DE,HL -3895 18EC 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier -3896 18EF 01 00 00 LD BC,0 ; Partial product (BCDE) = zero -3897 18F2 50 LD D,B -3898 18F3 58 LD E,B -3899 18F4 21 F4 17 LD HL,BNORM ; Address of normalise -3900 18F7 E5 PUSH HL ; Save for return -3901 18F8 21 00 19 LD HL,MULT8 ; Address of 8 bit multiply -3902 18FB E5 PUSH HL ; Save for NMSB,MSB -3903 18FC E5 PUSH HL ; -3904 18FD 21 94 31 LD HL,FPREG ; Point to number -3905 1900 7E MULT8: LD A,(HL) ; Get LSB of number -3906 1901 23 INC HL ; Point to NMSB -3907 1902 B7 OR A ; Test LSB -3908 1903 CA 2C 19 JP Z,BYTSFT ; Zero - shift to next byte -3909 1906 E5 PUSH HL ; Save address of number -3910 1907 2E 08 LD L,8 ; 8 bits to multiply by -3911 1909 1F MUL8LP: RRA ; Shift LSB right -3912 190A 67 LD H,A ; Save LSB -3913 190B 79 LD A,C ; Get MSB -3914 190C D2 1A 19 JP NC,NOMADD ; Bit was zero - Don't add -3915 190F E5 PUSH HL ; Save LSB and count -3916 1910 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB -3917 1913 19 ADD HL,DE ; Add NMSB and LSB -3918 1914 EB EX DE,HL ; Leave sum in DE -3919 1915 E1 POP HL ; Restore MSB and count -3920 1916 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier -3921 1919 89 ADC A,C ; Add MSB -3922 191A 1F NOMADD: RRA ; Shift MSB right -3923 191B 4F LD C,A ; Re-save MSB -3924 191C 7A LD A,D ; Get NMSB -3925 191D 1F RRA ; Shift NMSB right -3926 191E 57 LD D,A ; Re-save NMSB -3927 191F 7B LD A,E ; Get LSB -3928 1920 1F RRA ; Shift LSB right -3929 1921 5F LD E,A ; Re-save LSB -3930 1922 78 LD A,B ; Get VLSB -3931 1923 1F RRA ; Shift VLSB right -3932 1924 47 LD B,A ; Re-save VLSB -3933 1925 2D DEC L ; Count bits multiplied -3934 1926 7C LD A,H ; Get LSB of multiplier -3935 1927 C2 09 19 JP NZ,MUL8LP ; More - Do it -3936 192A E1 POPHRT: POP HL ; Restore address of number -3937 192B C9 RET -3938 192C -3939 192C 43 BYTSFT: LD B,E ; Shift partial product left -3940 192D 5A LD E,D -3941 192E 51 LD D,C -3942 192F 4F LD C,A -3943 1930 C9 RET -3944 1931 -3945 1931 CD 1A 1A DIV10: CALL STAKFP ; Save FPREG on stack -3946 1934 01 20 84 LD BC,8420H ; BCDE = 10. -3947 1937 11 00 00 LD DE,0000H -3948 193A CD 2A 1A CALL FPBCDE ; Move 10 to FPREG -3949 193D -3950 193D C1 DIV: POP BC ; Get number from stack -3951 193E D1 POP DE -3952 193F CD E9 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG -3953 1942 CA 45 07 JP Z,DZERR ; Error if division by zero -3954 1945 2E FF LD L,-1 ; Flag subtract exponents -3955 1947 CD A7 19 CALL ADDEXP ; Subtract exponents -3956 194A 34 INC (HL) ; Add 2 to exponent to adjust -3957 194B 34 INC (HL) -3958 194C 2B DEC HL ; Point to MSB -3959 194D 7E LD A,(HL) ; Get MSB of dividend -3960 194E 32 C2 30 LD (DIV3),A ; Save for subtraction -3961 1951 2B DEC HL -3962 1952 7E LD A,(HL) ; Get NMSB of dividend -3963 1953 32 BE 30 LD (DIV2),A ; Save for subtraction -3964 1956 2B DEC HL -3965 1957 7E LD A,(HL) ; Get MSB of dividend -3966 1958 32 BA 30 LD (DIV1),A ; Save for subtraction -3967 195B 41 LD B,C ; Get MSB -3968 195C EB EX DE,HL ; NMSB,LSB to HL -3969 195D AF XOR A -3970 195E 4F LD C,A ; Clear MSB of quotient -3971 195F 57 LD D,A ; Clear NMSB of quotient -3972 1960 5F LD E,A ; Clear LSB of quotient -3973 1961 32 C5 30 LD (DIV4),A ; Clear overflow count -3974 1964 E5 DIVLP: PUSH HL ; Save divisor -3975 1965 C5 PUSH BC -3976 1966 7D LD A,L ; Get LSB of number -3977 1967 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend -3978 196A DE 00 SBC A,0 ; Count for overflows -3979 196C 3F CCF -3980 196D D2 77 19 JP NC,RESDIV ; Restore divisor if borrow -3981 1970 32 C5 30 LD (DIV4),A ; Re-save overflow count -3982 1973 F1 POP AF ; Scrap divisor -3983 1974 F1 POP AF -3984 1975 37 SCF ; Set carry to -3985 1976 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" -3986 1977 -3987 1977 C1 RESDIV: POP BC ; Restore divisor -3988 1978 E1 POP HL -3989 1979 79 LD A,C ; Get MSB of quotient -3990 197A 3C INC A -3991 197B 3D DEC A -3992 197C 1F RRA ; Bit 0 to bit 7 -3993 197D FA 2A 18 JP M,RONDB ; Done - Normalise result -3994 1980 17 RLA ; Restore carry -3995 1981 7B LD A,E ; Get LSB of quotient -3996 1982 17 RLA ; Double it -3997 1983 5F LD E,A ; Put it back -3998 1984 7A LD A,D ; Get NMSB of quotient -3999 1985 17 RLA ; Double it -4000 1986 57 LD D,A ; Put it back -4001 1987 79 LD A,C ; Get MSB of quotient -4002 1988 17 RLA ; Double it -4003 1989 4F LD C,A ; Put it back -4004 198A 29 ADD HL,HL ; Double NMSB,LSB of divisor -4005 198B 78 LD A,B ; Get MSB of divisor -4006 198C 17 RLA ; Double it -4007 198D 47 LD B,A ; Put it back -4008 198E 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient -4009 1991 17 RLA ; Double it -4010 1992 32 C5 30 LD (DIV4),A ; Put it back -4011 1995 79 LD A,C ; Get MSB of quotient -4012 1996 B2 OR D ; Merge NMSB -4013 1997 B3 OR E ; Merge LSB -4014 1998 C2 64 19 JP NZ,DIVLP ; Not done - Keep dividing -4015 199B E5 PUSH HL ; Save divisor -4016 199C 21 97 31 LD HL,FPEXP ; Point to exponent -4017 199F 35 DEC (HL) ; Divide by 2 -4018 19A0 E1 POP HL ; Restore divisor -4019 19A1 C2 64 19 JP NZ,DIVLP ; Ok - Keep going -4020 19A4 C3 51 07 JP OVERR ; Overflow error -4021 19A7 -4022 19A7 78 ADDEXP: LD A,B ; Get exponent of dividend -4023 19A8 B7 OR A ; Test it -4024 19A9 CA CB 19 JP Z,OVTST3 ; Zero - Result zero -4025 19AC 7D LD A,L ; Get add/subtract flag -4026 19AD 21 97 31 LD HL,FPEXP ; Point to exponent -4027 19B0 AE XOR (HL) ; Add or subtract it -4028 19B1 80 ADD A,B ; Add the other exponent -4029 19B2 47 LD B,A ; Save new exponent -4030 19B3 1F RRA ; Test exponent for overflow -4031 19B4 A8 XOR B -4032 19B5 78 LD A,B ; Get exponent -4033 19B6 F2 CA 19 JP P,OVTST2 ; Positive - Test for overflow -4034 19B9 C6 80 ADD A,80H ; Add excess 128 -4035 19BB 77 LD (HL),A ; Save new exponent -4036 19BC CA 2A 19 JP Z,POPHRT ; Zero - Result zero -4037 19BF CD 4F 1A CALL SIGNS ; Set MSBs and sign of result -4038 19C2 77 LD (HL),A ; Save new exponent -4039 19C3 2B DEC HL ; Point to MSB -4040 19C4 C9 RET -4041 19C5 -4042 19C5 CD E9 19 OVTST1: CALL TSTSGN ; Test sign of FPREG -4043 19C8 2F CPL ; Invert sign -4044 19C9 E1 POP HL ; Clean up stack -4045 19CA B7 OVTST2: OR A ; Test if new exponent zero -4046 19CB E1 OVTST3: POP HL ; Clear off return address -4047 19CC F2 09 18 JP P,RESZER ; Result zero -4048 19CF C3 51 07 JP OVERR ; Overflow error -4049 19D2 -4050 19D2 CD 35 1A MLSP10: CALL BCDEFP ; Move FPREG to BCDE -4051 19D5 78 LD A,B ; Get exponent -4052 19D6 B7 OR A ; Is it zero? -4053 19D7 C8 RET Z ; Yes - Result is zero -4054 19D8 C6 02 ADD A,2 ; Multiply by 4 -4055 19DA DA 51 07 JP C,OVERR ; Overflow - ?OV Error -4056 19DD 47 LD B,A ; Re-save exponent -4057 19DE CD A3 17 CALL FPADD ; Add BCDE to FPREG (Times 5) -4058 19E1 21 97 31 LD HL,FPEXP ; Point to exponent -4059 19E4 34 INC (HL) ; Double number (Times 10) -4060 19E5 C0 RET NZ ; Ok - Return -4061 19E6 C3 51 07 JP OVERR ; Overflow error -4062 19E9 -4063 19E9 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG -4064 19EC B7 OR A -4065 19ED C8 RET Z ; RETurn if number is zero -4066 19EE 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG -4067 19F1 FE .BYTE 0FEH ; Test sign -4068 19F2 2F RETREL: CPL ; Invert sign -4069 19F3 17 RLA ; Sign bit to carry -4070 19F4 9F FLGDIF: SBC A,A ; Carry to all bits of A -4071 19F5 C0 RET NZ ; Return -1 if negative -4072 19F6 3C INC A ; Bump to +1 -4073 19F7 C9 RET ; Positive - Return +1 -4074 19F8 -4075 19F8 CD E9 19 SGN: CALL TSTSGN ; Test sign of FPREG -4076 19FB 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent -4077 19FD 11 00 00 LD DE,0 ; Zero NMSB and LSB -4078 1A00 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent -4079 1A03 4F LD C,A ; CDE = MSB,NMSB and LSB -4080 1A04 70 LD (HL),B ; Save exponent -4081 1A05 06 00 LD B,0 ; CDE = integer to normalise -4082 1A07 23 INC HL ; Point to sign of result -4083 1A08 36 80 LD (HL),80H ; Set sign of result -4084 1A0A 17 RLA ; Carry = sign of integer -4085 1A0B C3 F1 17 JP CONPOS ; Set sign of result -4086 1A0E -4087 1A0E CD E9 19 ABS: CALL TSTSGN ; Test sign of FPREG -4088 1A11 F0 RET P ; Return if positive -4089 1A12 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB -4090 1A15 7E LD A,(HL) ; Get sign of mantissa -4091 1A16 EE 80 XOR 80H ; Invert sign of mantissa -4092 1A18 77 LD (HL),A ; Re-save sign of mantissa -4093 1A19 C9 RET -4094 1A1A -4095 1A1A EB STAKFP: EX DE,HL ; Save code string address -4096 1A1B 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG -4097 1A1E E3 EX (SP),HL ; Stack them,get return -4098 1A1F E5 PUSH HL ; Re-save return -4099 1A20 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG -4100 1A23 E3 EX (SP),HL ; Stack them,get return -4101 1A24 E5 PUSH HL ; Re-save return -4102 1A25 EB EX DE,HL ; Restore code string address -4103 1A26 C9 RET -4104 1A27 -4105 1A27 CD 38 1A PHLTFP: CALL LOADFP ; Number at HL to BCDE -4106 1A2A EB FPBCDE: EX DE,HL ; Save code string address -4107 1A2B 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number -4108 1A2E 60 LD H,B ; Exponent of number -4109 1A2F 69 LD L,C ; MSB of number -4110 1A30 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent -4111 1A33 EB EX DE,HL ; Restore code string address -4112 1A34 C9 RET -4113 1A35 -4114 1A35 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG -4115 1A38 5E LOADFP: LD E,(HL) ; Get LSB of number -4116 1A39 23 INC HL -4117 1A3A 56 LD D,(HL) ; Get NMSB of number -4118 1A3B 23 INC HL -4119 1A3C 4E LD C,(HL) ; Get MSB of number -4120 1A3D 23 INC HL -4121 1A3E 46 LD B,(HL) ; Get exponent of number -4122 1A3F 23 INCHL: INC HL ; Used for conditional "INC HL" -4123 1A40 C9 RET -4124 1A41 -4125 1A41 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG -4126 1A44 06 04 DETHL4: LD B,4 ; 4 bytes to move -4127 1A46 1A DETHLB: LD A,(DE) ; Get source -4128 1A47 77 LD (HL),A ; Save destination -4129 1A48 13 INC DE ; Next source -4130 1A49 23 INC HL ; Next destination -4131 1A4A 05 DEC B ; Count bytes -4132 1A4B C2 46 1A JP NZ,DETHLB ; Loop if more -4133 1A4E C9 RET -4134 1A4F -4135 1A4F 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG -4136 1A52 7E LD A,(HL) ; Get MSB -4137 1A53 07 RLCA ; Old sign to carry -4138 1A54 37 SCF ; Set MSBit -4139 1A55 1F RRA ; Set MSBit of MSB -4140 1A56 77 LD (HL),A ; Save new MSB -4141 1A57 3F CCF ; Complement sign -4142 1A58 1F RRA ; Old sign to carry -4143 1A59 23 INC HL -4144 1A5A 23 INC HL -4145 1A5B 77 LD (HL),A ; Set sign of result -4146 1A5C 79 LD A,C ; Get MSB -4147 1A5D 07 RLCA ; Old sign to carry -4148 1A5E 37 SCF ; Set MSBit -4149 1A5F 1F RRA ; Set MSBit of MSB -4150 1A60 4F LD C,A ; Save MSB -4151 1A61 1F RRA -4152 1A62 AE XOR (HL) ; New sign of result -4153 1A63 C9 RET -4154 1A64 -4155 1A64 78 CMPNUM: LD A,B ; Get exponent of number -4156 1A65 B7 OR A -4157 1A66 CA E9 19 JP Z,TSTSGN ; Zero - Test sign of FPREG -4158 1A69 21 F2 19 LD HL,RETREL ; Return relation routine -4159 1A6C E5 PUSH HL ; Save for return -4160 1A6D CD E9 19 CALL TSTSGN ; Test sign of FPREG -4161 1A70 79 LD A,C ; Get MSB of number -4162 1A71 C8 RET Z ; FPREG zero - Number's MSB -4163 1A72 21 96 31 LD HL,FPREG+2 ; MSB of FPREG -4164 1A75 AE XOR (HL) ; Combine signs -4165 1A76 79 LD A,C ; Get MSB of number -4166 1A77 F8 RET M ; Exit if signs different -4167 1A78 CD 7E 1A CALL CMPFP ; Compare FP numbers -4168 1A7B 1F RRA ; Get carry to sign -4169 1A7C A9 XOR C ; Combine with MSB of number -4170 1A7D C9 RET -4171 1A7E -4172 1A7E 23 CMPFP: INC HL ; Point to exponent -4173 1A7F 78 LD A,B ; Get exponent -4174 1A80 BE CP (HL) ; Compare exponents -4175 1A81 C0 RET NZ ; Different -4176 1A82 2B DEC HL ; Point to MBS -4177 1A83 79 LD A,C ; Get MSB -4178 1A84 BE CP (HL) ; Compare MSBs -4179 1A85 C0 RET NZ ; Different -4180 1A86 2B DEC HL ; Point to NMSB -4181 1A87 7A LD A,D ; Get NMSB -4182 1A88 BE CP (HL) ; Compare NMSBs -4183 1A89 C0 RET NZ ; Different -4184 1A8A 2B DEC HL ; Point to LSB -4185 1A8B 7B LD A,E ; Get LSB -4186 1A8C 96 SUB (HL) ; Compare LSBs -4187 1A8D C0 RET NZ ; Different -4188 1A8E E1 POP HL ; Drop RETurn -4189 1A8F E1 POP HL ; Drop another RETurn -4190 1A90 C9 RET -4191 1A91 -4192 1A91 47 FPINT: LD B,A ; <- Move -4193 1A92 4F LD C,A ; <- exponent -4194 1A93 57 LD D,A ; <- to all -4195 1A94 5F LD E,A ; <- bits -4196 1A95 B7 OR A ; Test exponent -4197 1A96 C8 RET Z ; Zero - Return zero -4198 1A97 E5 PUSH HL ; Save pointer to number -4199 1A98 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE -4200 1A9B CD 4F 1A CALL SIGNS ; Set MSBs & sign of result -4201 1A9E AE XOR (HL) ; Combine with sign of FPREG -4202 1A9F 67 LD H,A ; Save combined signs -4203 1AA0 FC B5 1A CALL M,DCBCDE ; Negative - Decrement BCDE -4204 1AA3 3E 98 LD A,80H+24 ; 24 bits -4205 1AA5 90 SUB B ; Bits to shift -4206 1AA6 CD 68 18 CALL SCALE ; Shift BCDE -4207 1AA9 7C LD A,H ; Get combined sign -4208 1AAA 17 RLA ; Sign to carry -4209 1AAB DC 3B 18 CALL C,FPROND ; Negative - Round number up -4210 1AAE 06 00 LD B,0 ; Zero exponent -4211 1AB0 DC 54 18 CALL C,COMPL ; If negative make positive -4212 1AB3 E1 POP HL ; Restore pointer to number -4213 1AB4 C9 RET -4214 1AB5 -4215 1AB5 1B DCBCDE: DEC DE ; Decrement BCDE -4216 1AB6 7A LD A,D ; Test LSBs -4217 1AB7 A3 AND E -4218 1AB8 3C INC A -4219 1AB9 C0 RET NZ ; Exit if LSBs not FFFF -4220 1ABA 0B DEC BC ; Decrement MSBs -4221 1ABB C9 RET -4222 1ABC -4223 1ABC 21 97 31 INT: LD HL,FPEXP ; Point to exponent -4224 1ABF 7E LD A,(HL) ; Get exponent -4225 1AC0 FE 98 CP 80H+24 ; Integer accuracy only? -4226 1AC2 3A 94 31 LD A,(FPREG) ; Get LSB -4227 1AC5 D0 RET NC ; Yes - Already integer -4228 1AC6 7E LD A,(HL) ; Get exponent -4229 1AC7 CD 91 1A CALL FPINT ; F.P to integer -4230 1ACA 36 98 LD (HL),80H+24 ; Save 24 bit integer -4231 1ACC 7B LD A,E ; Get LSB of number -4232 1ACD F5 PUSH AF ; Save LSB -4233 1ACE 79 LD A,C ; Get MSB of number -4234 1ACF 17 RLA ; Sign to carry -4235 1AD0 CD F1 17 CALL CONPOS ; Set sign of result -4236 1AD3 F1 POP AF ; Restore LSB of number -4237 1AD4 C9 RET -4238 1AD5 -4239 1AD5 21 00 00 MLDEBC: LD HL,0 ; Clear partial product -4240 1AD8 78 LD A,B ; Test multiplier -4241 1AD9 B1 OR C -4242 1ADA C8 RET Z ; Return zero if zero -4243 1ADB 3E 10 LD A,16 ; 16 bits -4244 1ADD 29 MLDBLP: ADD HL,HL ; Shift P.P left -4245 1ADE DA 15 13 JP C,BSERR ; ?BS Error if overflow -4246 1AE1 EB EX DE,HL -4247 1AE2 29 ADD HL,HL ; Shift multiplier left -4248 1AE3 EB EX DE,HL -4249 1AE4 D2 EB 1A JP NC,NOMLAD ; Bit was zero - No add -4250 1AE7 09 ADD HL,BC ; Add multiplicand -4251 1AE8 DA 15 13 JP C,BSERR ; ?BS Error if overflow -4252 1AEB 3D NOMLAD: DEC A ; Count bits -4253 1AEC C2 DD 1A JP NZ,MLDBLP ; More -4254 1AEF C9 RET -4255 1AF0 -4256 1AF0 FE 2D ASCTFP: CP '-' ; Negative? -4257 1AF2 F5 PUSH AF ; Save it and flags -4258 1AF3 CA FC 1A JP Z,CNVNUM ; Yes - Convert number -4259 1AF6 FE 2B CP '+' ; Positive? -4260 1AF8 CA FC 1A JP Z,CNVNUM ; Yes - Convert number -4261 1AFB 2B DEC HL ; DEC 'cos GETCHR INCs -4262 1AFC CD 09 18 CNVNUM: CALL RESZER ; Set result to zero -4263 1AFF 47 LD B,A ; Digits after point counter -4264 1B00 57 LD D,A ; Sign of exponent -4265 1B01 5F LD E,A ; Exponent of ten -4266 1B02 2F CPL -4267 1B03 4F LD C,A ; Before or after point flag -4268 1B04 CD 9A 0B MANLP: CALL GETCHR ; Get next character -4269 1B07 DA 4D 1B JP C,ADDIG ; Digit - Add to number -4270 1B0A FE 2E CP '.' -4271 1B0C CA 28 1B JP Z,DPOINT ; '.' - Flag point -4272 1B0F FE 45 CP 'E' -4273 1B11 C2 2C 1B JP NZ,CONEXP ; Not 'E' - Scale number -4274 1B14 CD 9A 0B CALL GETCHR ; Get next character -4275 1B17 CD 40 11 CALL SGNEXP ; Get sign of exponent -4276 1B1A CD 9A 0B EXPLP: CALL GETCHR ; Get next character -4277 1B1D DA 6F 1B JP C,EDIGIT ; Digit - Add to exponent -4278 1B20 14 INC D ; Is sign negative? -4279 1B21 C2 2C 1B JP NZ,CONEXP ; No - Scale number -4280 1B24 AF XOR A -4281 1B25 93 SUB E ; Negate exponent -4282 1B26 5F LD E,A ; And re-save it -4283 1B27 0C INC C ; Flag end of number -4284 1B28 0C DPOINT: INC C ; Flag point passed -4285 1B29 CA 04 1B JP Z,MANLP ; Zero - Get another digit -4286 1B2C E5 CONEXP: PUSH HL ; Save code string address -4287 1B2D 7B LD A,E ; Get exponent -4288 1B2E 90 SUB B ; Subtract digits after point -4289 1B2F F4 45 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number -4290 1B32 F2 3B 1B JP P,ENDCON ; Positive - All done -4291 1B35 F5 PUSH AF ; Save number of times to /10 -4292 1B36 CD 31 19 CALL DIV10 ; Divide by 10 -4293 1B39 F1 POP AF ; Restore count -4294 1B3A 3C INC A ; Count divides -4295 1B3B -4296 1B3B C2 2F 1B ENDCON: JP NZ,SCALMI ; More to do -4297 1B3E D1 POP DE ; Restore code string address -4298 1B3F F1 POP AF ; Restore sign of number -4299 1B40 CC 12 1A CALL Z,INVSGN ; Negative - Negate number -4300 1B43 EB EX DE,HL ; Code string address to HL -4301 1B44 C9 RET -4302 1B45 -4303 1B45 C8 SCALPL: RET Z ; Exit if no scaling needed -4304 1B46 F5 MULTEN: PUSH AF ; Save count -4305 1B47 CD D2 19 CALL MLSP10 ; Multiply number by 10 -4306 1B4A F1 POP AF ; Restore count -4307 1B4B 3D DEC A ; Count multiplies -4308 1B4C C9 RET -4309 1B4D -4310 1B4D D5 ADDIG: PUSH DE ; Save sign of exponent -4311 1B4E 57 LD D,A ; Save digit -4312 1B4F 78 LD A,B ; Get digits after point -4313 1B50 89 ADC A,C ; Add one if after point -4314 1B51 47 LD B,A ; Re-save counter -4315 1B52 C5 PUSH BC ; Save point flags -4316 1B53 E5 PUSH HL ; Save code string address -4317 1B54 D5 PUSH DE ; Save digit -4318 1B55 CD D2 19 CALL MLSP10 ; Multiply number by 10 -4319 1B58 F1 POP AF ; Restore digit -4320 1B59 D6 30 SUB '0' ; Make it absolute -4321 1B5B CD 64 1B CALL RSCALE ; Re-scale number -4322 1B5E E1 POP HL ; Restore code string address -4323 1B5F C1 POP BC ; Restore point flags -4324 1B60 D1 POP DE ; Restore sign of exponent -4325 1B61 C3 04 1B JP MANLP ; Get another digit -4326 1B64 -4327 1B64 CD 1A 1A RSCALE: CALL STAKFP ; Put number on stack -4328 1B67 CD FB 19 CALL FLGREL ; Digit to add to FPREG -4329 1B6A C1 PADD: POP BC ; Restore number -4330 1B6B D1 POP DE -4331 1B6C C3 A3 17 JP FPADD ; Add BCDE to FPREG and return -4332 1B6F -4333 1B6F 7B EDIGIT: LD A,E ; Get digit -4334 1B70 07 RLCA ; Times 2 -4335 1B71 07 RLCA ; Times 4 -4336 1B72 83 ADD A,E ; Times 5 -4337 1B73 07 RLCA ; Times 10 -4338 1B74 86 ADD A,(HL) ; Add next digit -4339 1B75 D6 30 SUB '0' ; Make it absolute -4340 1B77 5F LD E,A ; Save new digit -4341 1B78 C3 1A 1B JP EXPLP ; Look for another digit -4342 1B7B -4343 1B7B E5 LINEIN: PUSH HL ; Save code string address -4344 1B7C 21 DA 06 LD HL,INMSG ; Output " in " -4345 1B7F CD E0 14 CALL PRS ; Output string at HL -4346 1B82 E1 POP HL ; Restore code string address -4347 1B83 EB PRNTHL: EX DE,HL ; Code string address to DE -4348 1B84 AF XOR A -4349 1B85 06 98 LD B,80H+24 ; 24 bits -4350 1B87 CD 00 1A CALL RETINT ; Return the integer -4351 1B8A 21 DF 14 LD HL,PRNUMS ; Print number string -4352 1B8D E5 PUSH HL ; Save for return -4353 1B8E 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII -4354 1B91 E5 PUSH HL ; Save for return -4355 1B92 CD E9 19 CALL TSTSGN ; Test sign of FPREG -4356 1B95 36 20 LD (HL),' ' ; Space at start -4357 1B97 F2 9C 1B JP P,SPCFST ; Positive - Space to start -4358 1B9A 36 2D LD (HL),'-' ; '-' sign at start -4359 1B9C 23 SPCFST: INC HL ; First byte of number -4360 1B9D 36 30 LD (HL),'0' ; '0' if zero -4361 1B9F CA 52 1C JP Z,JSTZER ; Return '0' if zero -4362 1BA2 E5 PUSH HL ; Save buffer address -4363 1BA3 FC 12 1A CALL M,INVSGN ; Negate FPREG if negative -4364 1BA6 AF XOR A ; Zero A -4365 1BA7 F5 PUSH AF ; Save it -4366 1BA8 CD 58 1C CALL RNGTST ; Test number is in range -4367 1BAB 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 -4368 1BAE 11 F8 4F LD DE,4FF8H -4369 1BB1 CD 64 1A CALL CMPNUM ; Compare numbers -4370 1BB4 B7 OR A -4371 1BB5 E2 C9 1B JP PO,INRNG ; > 99999.9 - Sort it out -4372 1BB8 F1 POP AF ; Restore count -4373 1BB9 CD 46 1B CALL MULTEN ; Multiply by ten -4374 1BBC F5 PUSH AF ; Re-save count -4375 1BBD C3 AB 1B JP SIXDIG ; Test it again -4376 1BC0 -4377 1BC0 CD 31 19 GTSIXD: CALL DIV10 ; Divide by 10 -4378 1BC3 F1 POP AF ; Get count -4379 1BC4 3C INC A ; Count divides -4380 1BC5 F5 PUSH AF ; Re-save count -4381 1BC6 CD 58 1C CALL RNGTST ; Test number is in range -4382 1BC9 CD 91 17 INRNG: CALL ROUND ; Add 0.5 to FPREG -4383 1BCC 3C INC A -4384 1BCD CD 91 1A CALL FPINT ; F.P to integer -4385 1BD0 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG -4386 1BD3 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range -4387 1BD6 F1 POP AF ; Restore count -4388 1BD7 81 ADD A,C ; 6 digits before point -4389 1BD8 3C INC A ; Add one -4390 1BD9 FA E5 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 -4391 1BDC FE 08 CP 6+1+1 ; More than 999999 ? -4392 1BDE D2 E5 1B JP NC,MAKNUM ; Yes - Do it in 'E' form -4393 1BE1 3C INC A ; Adjust for exponent -4394 1BE2 47 LD B,A ; Exponent of number -4395 1BE3 3E 02 LD A,2 ; Make it zero after -4396 1BE5 -4397 1BE5 3D MAKNUM: DEC A ; Adjust for digits to do -4398 1BE6 3D DEC A -4399 1BE7 E1 POP HL ; Restore buffer address -4400 1BE8 F5 PUSH AF ; Save count -4401 1BE9 11 6B 1C LD DE,POWERS ; Powers of ten -4402 1BEC 05 DEC B ; Count digits before point -4403 1BED C2 F6 1B JP NZ,DIGTXT ; Not zero - Do number -4404 1BF0 36 2E LD (HL),'.' ; Save point -4405 1BF2 23 INC HL ; Move on -4406 1BF3 36 30 LD (HL),'0' ; Save zero -4407 1BF5 23 INC HL ; Move on -4408 1BF6 05 DIGTXT: DEC B ; Count digits before point -4409 1BF7 36 2E LD (HL),'.' ; Save point in case -4410 1BF9 CC 3F 1A CALL Z,INCHL ; Last digit - move on -4411 1BFC C5 PUSH BC ; Save digits before point -4412 1BFD E5 PUSH HL ; Save buffer address -4413 1BFE D5 PUSH DE ; Save powers of ten -4414 1BFF CD 35 1A CALL BCDEFP ; Move FPREG to BCDE -4415 1C02 E1 POP HL ; Powers of ten table -4416 1C03 06 2F LD B, '0'-1 ; ASCII '0' - 1 -4417 1C05 04 TRYAGN: INC B ; Count subtractions -4418 1C06 7B LD A,E ; Get LSB -4419 1C07 96 SUB (HL) ; Subtract LSB -4420 1C08 5F LD E,A ; Save LSB -4421 1C09 23 INC HL -4422 1C0A 7A LD A,D ; Get NMSB -4423 1C0B 9E SBC A,(HL) ; Subtract NMSB -4424 1C0C 57 LD D,A ; Save NMSB -4425 1C0D 23 INC HL -4426 1C0E 79 LD A,C ; Get MSB -4427 1C0F 9E SBC A,(HL) ; Subtract MSB -4428 1C10 4F LD C,A ; Save MSB -4429 1C11 2B DEC HL ; Point back to start -4430 1C12 2B DEC HL -4431 1C13 D2 05 1C JP NC,TRYAGN ; No overflow - Try again -4432 1C16 CD 48 18 CALL PLUCDE ; Restore number -4433 1C19 23 INC HL ; Start of next number -4434 1C1A CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG -4435 1C1D EB EX DE,HL ; Save point in table -4436 1C1E E1 POP HL ; Restore buffer address -4437 1C1F 70 LD (HL),B ; Save digit in buffer -4438 1C20 23 INC HL ; And move on -4439 1C21 C1 POP BC ; Restore digit count -4440 1C22 0D DEC C ; Count digits -4441 1C23 C2 F6 1B JP NZ,DIGTXT ; More - Do them -4442 1C26 05 DEC B ; Any decimal part? -4443 1C27 CA 36 1C JP Z,DOEBIT ; No - Do 'E' bit -4444 1C2A 2B SUPTLZ: DEC HL ; Move back through buffer -4445 1C2B 7E LD A,(HL) ; Get character -4446 1C2C FE 30 CP '0' ; '0' character? -4447 1C2E CA 2A 1C JP Z,SUPTLZ ; Yes - Look back for more -4448 1C31 FE 2E CP '.' ; A decimal point? -4449 1C33 C4 3F 1A CALL NZ,INCHL ; Move back over digit -4450 1C36 -4451 1C36 F1 DOEBIT: POP AF ; Get 'E' flag -4452 1C37 CA 55 1C JP Z,NOENED ; No 'E' needed - End buffer -4453 1C3A 36 45 LD (HL),'E' ; Put 'E' in buffer -4454 1C3C 23 INC HL ; And move on -4455 1C3D 36 2B LD (HL),'+' ; Put '+' in buffer -4456 1C3F F2 46 1C JP P,OUTEXP ; Positive - Output exponent -4457 1C42 36 2D LD (HL),'-' ; Put '-' in buffer -4458 1C44 2F CPL ; Negate exponent -4459 1C45 3C INC A -4460 1C46 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 -4461 1C48 04 EXPTEN: INC B ; Count subtractions -4462 1C49 D6 0A SUB 10 ; Tens digit -4463 1C4B D2 48 1C JP NC,EXPTEN ; More to do -4464 1C4E C6 3A ADD A,'0'+10 ; Restore and make ASCII -4465 1C50 23 INC HL ; Move on -4466 1C51 70 LD (HL),B ; Save MSB of exponent -4467 1C52 23 JSTZER: INC HL ; -4468 1C53 77 LD (HL),A ; Save LSB of exponent -4469 1C54 23 INC HL -4470 1C55 71 NOENED: LD (HL),C ; Mark end of buffer -4471 1C56 E1 POP HL ; Restore code string address -4472 1C57 C9 RET -4473 1C58 -4474 1C58 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. -4475 1C5B 11 F7 23 LD DE,23F7H -4476 1C5E CD 64 1A CALL CMPNUM ; Compare numbers -4477 1C61 B7 OR A -4478 1C62 E1 POP HL ; Return address to HL -4479 1C63 E2 C0 1B JP PO,GTSIXD ; Too big - Divide by ten -4480 1C66 E9 JP (HL) ; Otherwise return to caller -4481 1C67 -4482 1C67 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 -4483 1C6B -4484 1C6B A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 -4485 1C6E 10 27 00 .BYTE 010H,027H,000H ; 10000 -4486 1C71 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 -4487 1C74 64 00 00 .BYTE 064H,000H,000H ; 100 -4488 1C77 0A 00 00 .BYTE 00AH,000H,000H ; 10 -4489 1C7A 01 00 00 .BYTE 001H,000H,000H ; 1 -4490 1C7D -4491 1C7D 21 12 1A NEGAFT: LD HL,INVSGN ; Negate result -4492 1C80 E3 EX (SP),HL ; To be done after caller -4493 1C81 E9 JP (HL) ; Return to caller -4494 1C82 -4495 1C82 CD 1A 1A SQR: CALL STAKFP ; Put value on stack -4496 1C85 21 67 1C LD HL,HALF ; Set power to 1/2 -4497 1C88 CD 27 1A CALL PHLTFP ; Move 1/2 to FPREG -4498 1C8B -4499 1C8B C1 POWER: POP BC ; Get base -4500 1C8C D1 POP DE -4501 1C8D CD E9 19 CALL TSTSGN ; Test sign of power -4502 1C90 78 LD A,B ; Get exponent of base -4503 1C91 CA D0 1C JP Z,EXP ; Make result 1 if zero -4504 1C94 F2 9B 1C JP P,POWER1 ; Positive base - Ok -4505 1C97 B7 OR A ; Zero to negative power? -4506 1C98 CA 45 07 JP Z,DZERR ; Yes - ?/0 Error -4507 1C9B B7 POWER1: OR A ; Base zero? -4508 1C9C CA 0A 18 JP Z,SAVEXP ; Yes - Return zero -4509 1C9F D5 PUSH DE ; Save base -4510 1CA0 C5 PUSH BC -4511 1CA1 79 LD A,C ; Get MSB of base -4512 1CA2 F6 7F OR 01111111B ; Get sign status -4513 1CA4 CD 35 1A CALL BCDEFP ; Move power to BCDE -4514 1CA7 F2 B8 1C JP P,POWER2 ; Positive base - Ok -4515 1CAA D5 PUSH DE ; Save power -4516 1CAB C5 PUSH BC -4517 1CAC CD BC 1A CALL INT ; Get integer of power -4518 1CAF C1 POP BC ; Restore power -4519 1CB0 D1 POP DE -4520 1CB1 F5 PUSH AF ; MSB of base -4521 1CB2 CD 64 1A CALL CMPNUM ; Power an integer? -4522 1CB5 E1 POP HL ; Restore MSB of base -4523 1CB6 7C LD A,H ; but don't affect flags -4524 1CB7 1F RRA ; Exponent odd or even? -4525 1CB8 E1 POWER2: POP HL ; Restore MSB and exponent -4526 1CB9 22 96 31 LD (FPREG+2),HL ; Save base in FPREG -4527 1CBC E1 POP HL ; LSBs of base -4528 1CBD 22 94 31 LD (FPREG),HL ; Save in FPREG -4529 1CC0 DC 7D 1C CALL C,NEGAFT ; Odd power - Negate result -4530 1CC3 CC 12 1A CALL Z,INVSGN ; Negative base - Negate it -4531 1CC6 D5 PUSH DE ; Save power -4532 1CC7 C5 PUSH BC -4533 1CC8 CD 9D 18 CALL LOG ; Get LOG of base -4534 1CCB C1 POP BC ; Restore power -4535 1CCC D1 POP DE -4536 1CCD CD DE 18 CALL FPMULT ; Multiply LOG by power -4537 1CD0 -4538 1CD0 CD 1A 1A EXP: CALL STAKFP ; Put value on stack -4539 1CD3 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) -4540 1CD6 11 3B AA LD DE,0AA3BH -4541 1CD9 CD DE 18 CALL FPMULT ; Multiply value by 1/LN(2) -4542 1CDC 3A 97 31 LD A,(FPEXP) ; Get exponent -4543 1CDF FE 88 CP 80H+8 ; Is it in range? -4544 1CE1 D2 C5 19 JP NC,OVTST1 ; No - Test for overflow -4545 1CE4 CD BC 1A CALL INT ; Get INT of FPREG -4546 1CE7 C6 80 ADD A,80H ; For excess 128 -4547 1CE9 C6 02 ADD A,2 ; Exponent > 126? -4548 1CEB DA C5 19 JP C,OVTST1 ; Yes - Test for overflow -4549 1CEE F5 PUSH AF ; Save scaling factor -4550 1CEF 21 8C 18 LD HL,UNITY ; Point to 1. -4551 1CF2 CD 94 17 CALL ADDPHL ; Add 1 to FPREG -4552 1CF5 CD D5 18 CALL MULLN2 ; Multiply by LN(2) -4553 1CF8 F1 POP AF ; Restore scaling factor -4554 1CF9 C1 POP BC ; Restore exponent -4555 1CFA D1 POP DE -4556 1CFB F5 PUSH AF ; Save scaling factor -4557 1CFC CD A0 17 CALL SUBCDE ; Subtract exponent from FPREG -4558 1CFF CD 12 1A CALL INVSGN ; Negate result -4559 1D02 21 10 1D LD HL,EXPTAB ; Coefficient table -4560 1D05 CD 40 1D CALL SMSER1 ; Sum the series -4561 1D08 11 00 00 LD DE,0 ; Zero LSBs -4562 1D0B C1 POP BC ; Scaling factor -4563 1D0C 4A LD C,D ; Zero MSB -4564 1D0D C3 DE 18 JP FPMULT ; Scale result to correct value -4565 1D10 -4566 1D10 08 EXPTAB: .BYTE 8 ; Table used by EXP -4567 1D11 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) -4568 1D15 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) -4569 1D19 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) -4570 1D1D E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) -4571 1D21 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) -4572 1D25 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) -4573 1D29 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) -4574 1D2D 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) -4575 1D31 -4576 1D31 CD 1A 1A SUMSER: CALL STAKFP ; Put FPREG on stack -4577 1D34 11 DC 18 LD DE,MULT ; Multiply by "X" -4578 1D37 D5 PUSH DE ; To be done after -4579 1D38 E5 PUSH HL ; Save address of table -4580 1D39 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE -4581 1D3C CD DE 18 CALL FPMULT ; Square the value -4582 1D3F E1 POP HL ; Restore address of table -4583 1D40 CD 1A 1A SMSER1: CALL STAKFP ; Put value on stack -4584 1D43 7E LD A,(HL) ; Get number of coefficients -4585 1D44 23 INC HL ; Point to start of table -4586 1D45 CD 27 1A CALL PHLTFP ; Move coefficient to FPREG -4587 1D48 06 .BYTE 06H ; Skip "POP AF" -4588 1D49 F1 SUMLP: POP AF ; Restore count -4589 1D4A C1 POP BC ; Restore number -4590 1D4B D1 POP DE -4591 1D4C 3D DEC A ; Cont coefficients -4592 1D4D C8 RET Z ; All done -4593 1D4E D5 PUSH DE ; Save number -4594 1D4F C5 PUSH BC -4595 1D50 F5 PUSH AF ; Save count -4596 1D51 E5 PUSH HL ; Save address in table -4597 1D52 CD DE 18 CALL FPMULT ; Multiply FPREG by BCDE -4598 1D55 E1 POP HL ; Restore address in table -4599 1D56 CD 38 1A CALL LOADFP ; Number at HL to BCDE -4600 1D59 E5 PUSH HL ; Save address in table -4601 1D5A CD A3 17 CALL FPADD ; Add coefficient to FPREG -4602 1D5D E1 POP HL ; Restore address in table -4603 1D5E C3 49 1D JP SUMLP ; More coefficients -4604 1D61 -4605 1D61 CD E9 19 RND: CALL TSTSGN ; Test sign of FPREG -4606 1D64 21 C9 30 LD HL,SEED+2 ; Random number seed -4607 1D67 FA C2 1D JP M,RESEED ; Negative - Re-seed -4608 1D6A 21 EA 30 LD HL,LSTRND ; Last random number -4609 1D6D CD 27 1A CALL PHLTFP ; Move last RND to FPREG -4610 1D70 21 C9 30 LD HL,SEED+2 ; Random number seed -4611 1D73 C8 RET Z ; Return if RND(0) -4612 1D74 86 ADD A,(HL) ; Add (SEED)+2) -4613 1D75 E6 07 AND 00000111B ; 0 to 7 -4614 1D77 06 00 LD B,0 -4615 1D79 77 LD (HL),A ; Re-save seed -4616 1D7A 23 INC HL ; Move to coefficient table -4617 1D7B 87 ADD A,A ; 4 bytes -4618 1D7C 87 ADD A,A ; per entry -4619 1D7D 4F LD C,A ; BC = Offset into table -4620 1D7E 09 ADD HL,BC ; Point to coefficient -4621 1D7F CD 38 1A CALL LOADFP ; Coefficient to BCDE -4622 1D82 CD DE 18 CALL FPMULT ; ; Multiply FPREG by coefficient -4623 1D85 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) -4624 1D88 3C INC A ; Add 1 -4625 1D89 E6 03 AND 00000011B ; 0 to 3 -4626 1D8B 06 00 LD B,0 -4627 1D8D FE 01 CP 1 ; Is it zero? -4628 1D8F 88 ADC A,B ; Yes - Make it 1 -4629 1D90 32 C8 30 LD (SEED+1),A ; Re-save seed -4630 1D93 21 C6 1D LD HL,RNDTAB-4 ; Addition table -4631 1D96 87 ADD A,A ; 4 bytes -4632 1D97 87 ADD A,A ; per entry -4633 1D98 4F LD C,A ; BC = Offset into table -4634 1D99 09 ADD HL,BC ; Point to value -4635 1D9A CD 94 17 CALL ADDPHL ; Add value to FPREG -4636 1D9D CD 35 1A RND1: CALL BCDEFP ; Move FPREG to BCDE -4637 1DA0 7B LD A,E ; Get LSB -4638 1DA1 59 LD E,C ; LSB = MSB -4639 1DA2 EE 4F XOR 01001111B ; Fiddle around -4640 1DA4 4F LD C,A ; New MSB -4641 1DA5 36 80 LD (HL),80H ; Set exponent -4642 1DA7 2B DEC HL ; Point to MSB -4643 1DA8 46 LD B,(HL) ; Get MSB -4644 1DA9 36 80 LD (HL),80H ; Make value -0.5 -4645 1DAB 21 C7 30 LD HL,SEED ; Random number seed -4646 1DAE 34 INC (HL) ; Count seed -4647 1DAF 7E LD A,(HL) ; Get seed -4648 1DB0 D6 AB SUB 171 ; Do it modulo 171 -4649 1DB2 C2 B9 1D JP NZ,RND2 ; Non-zero - Ok -4650 1DB5 77 LD (HL),A ; Zero seed -4651 1DB6 0C INC C ; Fillde about -4652 1DB7 15 DEC D ; with the -4653 1DB8 1C INC E ; number -4654 1DB9 CD F4 17 RND2: CALL BNORM ; Normalise number -4655 1DBC 21 EA 30 LD HL,LSTRND ; Save random number -4656 1DBF C3 41 1A JP FPTHL ; Move FPREG to last and return -4657 1DC2 -4658 1DC2 77 RESEED: LD (HL),A ; Re-seed random numbers -4659 1DC3 2B DEC HL -4660 1DC4 77 LD (HL),A -4661 1DC5 2B DEC HL -4662 1DC6 77 LD (HL),A -4663 1DC7 C3 9D 1D JP RND1 ; Return RND seed -4664 1DCA -4665 1DCA 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND -4666 1DCE 99 E9 92 69 .BYTE 099H,0E9H,092H,069H -4667 1DD2 10 D1 75 68 .BYTE 010H,0D1H,075H,068H -4668 1DD6 -4669 1DD6 21 20 1E COS: LD HL,HALFPI ; Point to PI/2 -4670 1DD9 CD 94 17 CALL ADDPHL ; Add it to PPREG -4671 1DDC CD 1A 1A SIN: CALL STAKFP ; Put angle on stack -4672 1DDF 01 49 83 LD BC,8349H ; BCDE = 2 PI -4673 1DE2 11 DB 0F LD DE,0FDBH -4674 1DE5 CD 2A 1A CALL FPBCDE ; Move 2 PI to FPREG -4675 1DE8 C1 POP BC ; Restore angle -4676 1DE9 D1 POP DE -4677 1DEA CD 3F 19 CALL DVBCDE ; Divide angle by 2 PI -4678 1DED CD 1A 1A CALL STAKFP ; Put it on stack -4679 1DF0 CD BC 1A CALL INT ; Get INT of result -4680 1DF3 C1 POP BC ; Restore number -4681 1DF4 D1 POP DE -4682 1DF5 CD A0 17 CALL SUBCDE ; Make it 0 <= value < 1 -4683 1DF8 21 24 1E LD HL,QUARTR ; Point to 0.25 -4684 1DFB CD 9A 17 CALL SUBPHL ; Subtract value from 0.25 -4685 1DFE CD E9 19 CALL TSTSGN ; Test sign of value -4686 1E01 37 SCF ; Flag positive -4687 1E02 F2 0C 1E JP P,SIN1 ; Positive - Ok -4688 1E05 CD 91 17 CALL ROUND ; Add 0.5 to value -4689 1E08 CD E9 19 CALL TSTSGN ; Test sign of value -4690 1E0B B7 OR A ; Flag negative -4691 1E0C F5 SIN1: PUSH AF ; Save sign -4692 1E0D F4 12 1A CALL P,INVSGN ; Negate value if positive -4693 1E10 21 24 1E LD HL,QUARTR ; Point to 0.25 -4694 1E13 CD 94 17 CALL ADDPHL ; Add 0.25 to value -4695 1E16 F1 POP AF ; Restore sign -4696 1E17 D4 12 1A CALL NC,INVSGN ; Negative - Make positive -4697 1E1A 21 28 1E LD HL,SINTAB ; Coefficient table -4698 1E1D C3 31 1D JP SUMSER ; Evaluate sum of series -4699 1E20 -4700 1E20 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) -4701 1E24 -4702 1E24 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 -4703 1E28 -4704 1E28 05 SINTAB: .BYTE 5 ; Table used by SIN -4705 1E29 BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 -4706 1E2D 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 -4707 1E31 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 -4708 1E35 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 -4709 1E39 DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 -4710 1E3D -4711 1E3D CD 1A 1A TAN: CALL STAKFP ; Put angle on stack -4712 1E40 CD DC 1D CALL SIN ; Get SIN of angle -4713 1E43 C1 POP BC ; Restore angle -4714 1E44 E1 POP HL -4715 1E45 CD 1A 1A CALL STAKFP ; Save SIN of angle -4716 1E48 EB EX DE,HL ; BCDE = Angle -4717 1E49 CD 2A 1A CALL FPBCDE ; Angle to FPREG -4718 1E4C CD D6 1D CALL COS ; Get COS of angle -4719 1E4F C3 3D 19 JP DIV ; TAN = SIN / COS -4720 1E52 -4721 1E52 CD E9 19 ATN: CALL TSTSGN ; Test sign of value -4722 1E55 FC 7D 1C CALL M,NEGAFT ; Negate result after if -ve -4723 1E58 FC 12 1A CALL M,INVSGN ; Negate value if -ve -4724 1E5B 3A 97 31 LD A,(FPEXP) ; Get exponent -4725 1E5E FE 81 CP 81H ; Number less than 1? -4726 1E60 DA 6F 1E JP C,ATN1 ; Yes - Get arc tangnt -4727 1E63 01 00 81 LD BC,8100H ; BCDE = 1 -4728 1E66 51 LD D,C -4729 1E67 59 LD E,C -4730 1E68 CD 3F 19 CALL DVBCDE ; Get reciprocal of number -4731 1E6B 21 9A 17 LD HL,SUBPHL ; Sub angle from PI/2 -4732 1E6E E5 PUSH HL ; Save for angle > 1 -4733 1E6F 21 79 1E ATN1: LD HL,ATNTAB ; Coefficient table -4734 1E72 CD 31 1D CALL SUMSER ; Evaluate sum of series -4735 1E75 21 20 1E LD HL,HALFPI ; PI/2 - angle in case > 1 -4736 1E78 C9 RET ; Number > 1 - Sub from PI/2 -4737 1E79 -4738 1E79 09 ATNTAB: .BYTE 9 ; Table used by ATN -4739 1E7A 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 -4740 1E7E 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 -4741 1E82 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 -4742 1E86 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 -4743 1E8A 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 -4744 1E8E C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 -4745 1E92 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 -4746 1E96 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 -4747 1E9A 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 -4748 1E9E -4749 1E9E -4750 1E9E C9 ARET: RET ; A RETurn instruction -4751 1E9F -4752 1E9F D7 GETINP: RST 10H ;input a character -4753 1EA0 C9 RET -4754 1EA1 -4755 1EA1 CLS: -4756 1EA1 3E 0C LD A,CS ; ASCII Clear screen -4757 1EA3 C3 DB 1F JP MONOUT ; Output character -4758 1EA6 -4759 1EA6 CD 68 17 WIDTH: CALL GETINT ; Get integer 0-255 -4760 1EA9 7B LD A,E ; Width to A -4761 1EAA 32 F2 30 LD (LWIDTH),A ; Set width -4762 1EAD C9 RET -4763 1EAE -4764 1EAE CD 07 10 LINES: CALL GETNUM ; Get a number -4765 1EB1 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -4766 1EB4 ED 53 F6 30 LD (LINESC),DE ; Set lines counter -4767 1EB8 ED 53 F8 30 LD (LINESN),DE ; Set lines number -4768 1EBC C9 RET -4769 1EBD -4770 1EBD CD 4C 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 -4771 1EC0 D5 PUSH DE ; Save number -4772 1EC1 E1 POP HL ; Number to HL -4773 1EC2 46 LD B,(HL) ; Get LSB of contents -4774 1EC3 23 INC HL -4775 1EC4 7E LD A,(HL) ; Get MSB of contents -4776 1EC5 C3 C2 13 JP ABPASS ; Return integer AB -4777 1EC8 -4778 1EC8 CD 07 10 DOKE: CALL GETNUM ; Get a number -4779 1ECB CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -4780 1ECE D5 PUSH DE ; Save address -4781 1ECF CD 10 0A CALL CHKSYN ; Make sure ',' follows -4782 1ED2 2C .BYTE ',' -4783 1ED3 CD 07 10 CALL GETNUM ; Get a number -4784 1ED6 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -4785 1ED9 E3 EX (SP),HL ; Save value,get address -4786 1EDA 73 LD (HL),E ; Save LSB of value -4787 1EDB 23 INC HL -4788 1EDC 72 LD (HL),D ; Save MSB of value -4789 1EDD E1 POP HL ; Restore code string address -4790 1EDE C9 RET -4791 1EDF -4792 1EDF -4793 1EDF ; HEX$(nn) Convert 16 bit number to Hexadecimal string -4794 1EDF -4795 1EDF CD 0A 10 HEX: CALL TSTNUM ; Verify it's a number -4796 1EE2 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -4797 1EE5 C5 PUSH BC ; Save contents of BC -4798 1EE6 21 99 31 LD HL,PBUFF -4799 1EE9 7A LD A,D ; Get high order into A -4800 1EEA FE 00 CP $0 -4801 1EEC 28 0C JR Z,HEX2 ; Skip output if both high digits are zero -4802 1EEE CD 17 1F CALL BYT2ASC ; Convert D to ASCII -4803 1EF1 78 LD A,B -4804 1EF2 FE 30 CP '0' -4805 1EF4 28 02 JR Z,HEX1 ; Don't store high digit if zero -4806 1EF6 70 LD (HL),B ; Store it to PBUFF -4807 1EF7 23 INC HL ; Next location -4808 1EF8 71 HEX1: LD (HL),C ; Store C to PBUFF+1 -4809 1EF9 23 INC HL ; Next location -4810 1EFA 7B HEX2: LD A,E ; Get lower byte -4811 1EFB CD 17 1F CALL BYT2ASC ; Convert E to ASCII -4812 1EFE 7A LD A,D -4813 1EFF FE 00 CP $0 -4814 1F01 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte -4815 1F03 78 LD A,B -4816 1F04 FE 30 CP '0' ; If high digit of lower byte is zero then don't print -4817 1F06 28 02 JR Z,HEX4 -4818 1F08 70 HEX3: LD (HL),B ; to PBUFF+2 -4819 1F09 23 INC HL ; Next location -4820 1F0A 71 HEX4: LD (HL),C ; to PBUFF+3 -4821 1F0B 23 INC HL ; PBUFF+4 to zero -4822 1F0C AF XOR A ; Terminating character -4823 1F0D 77 LD (HL),A ; Store zero to terminate -4824 1F0E 23 INC HL ; Make sure PBUFF is terminated -4825 1F0F 77 LD (HL),A ; Store the double zero there -4826 1F10 C1 POP BC ; Get BC back -4827 1F11 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF -4828 1F14 C3 70 14 JP STR1 ; Convert the PBUFF to a string and return it -4829 1F17 -4830 1F17 47 BYT2ASC LD B,A ; Save original value -4831 1F18 E6 0F AND $0F ; Strip off upper nybble -4832 1F1A FE 0A CP $0A ; 0-9? -4833 1F1C 38 02 JR C,ADD30 ; If A-F, add 7 more -4834 1F1E C6 07 ADD A,$07 ; Bring value up to ASCII A-F -4835 1F20 C6 30 ADD30 ADD A,$30 ; And make ASCII -4836 1F22 4F LD C,A ; Save converted char to C -4837 1F23 78 LD A,B ; Retrieve original value -4838 1F24 0F RRCA ; and Rotate it right -4839 1F25 0F RRCA -4840 1F26 0F RRCA -4841 1F27 0F RRCA -4842 1F28 E6 0F AND $0F ; Mask off upper nybble -4843 1F2A FE 0A CP $0A ; 0-9? < A hex? -4844 1F2C 38 02 JR C,ADD301 ; Skip Add 7 -4845 1F2E C6 07 ADD A,$07 ; Bring it up to ASCII A-F -4846 1F30 C6 30 ADD301 ADD A,$30 ; And make it full ASCII -4847 1F32 47 LD B,A ; Store high order byte -4848 1F33 C9 RET -4849 1F34 -4850 1F34 ; Convert "&Hnnnn" to FPREG -4851 1F34 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" -4852 1F34 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 -4853 1F34 EB HEXTFP EX DE,HL ; Move code string pointer to DE -4854 1F35 21 00 00 LD HL,$0000 ; Zero out the value -4855 1F38 CD 4D 1F CALL GETHEX ; Check the number for valid hex -4856 1F3B DA 6D 1F JP C,HXERR ; First value wasn't hex, HX error -4857 1F3E 18 05 JR HEXLP1 ; Convert first character -4858 1F40 CD 4D 1F HEXLP CALL GETHEX ; Get second and addtional characters -4859 1F43 38 1F JR C,HEXIT ; Exit if not a hex character -4860 1F45 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left -4861 1F46 29 ADD HL,HL -4862 1F47 29 ADD HL,HL -4863 1F48 29 ADD HL,HL -4864 1F49 B5 OR L ; Add in D0-D3 into L -4865 1F4A 6F LD L,A ; Save new value -4866 1F4B 18 F3 JR HEXLP ; And continue until all hex characters are in -4867 1F4D -4868 1F4D 13 GETHEX INC DE ; Next location -4869 1F4E 1A LD A,(DE) ; Load character at pointer -4870 1F4F FE 20 CP ' ' -4871 1F51 CA 4D 1F JP Z,GETHEX ; Skip spaces -4872 1F54 D6 30 SUB $30 ; Get absolute value -4873 1F56 D8 RET C ; < "0", error -4874 1F57 FE 0A CP $0A -4875 1F59 38 05 JR C,NOSUB7 ; Is already in the range 0-9 -4876 1F5B D6 07 SUB $07 ; Reduce to A-F -4877 1F5D FE 0A CP $0A ; Value should be $0A-$0F at this point -4878 1F5F D8 RET C ; CY set if was : ; < = > ? @ -4879 1F60 FE 10 NOSUB7 CP $10 ; > Greater than "F"? -4880 1F62 3F CCF -4881 1F63 C9 RET ; CY set if it wasn't valid hex -4882 1F64 -4883 1F64 EB HEXIT EX DE,HL ; Value into DE, Code string into HL -4884 1F65 7A LD A,D ; Load DE into AC -4885 1F66 4B LD C,E ; For prep to -4886 1F67 E5 PUSH HL -4887 1F68 CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4888 1F6B E1 POP HL -4889 1F6C C9 RET -4890 1F6D -4891 1F6D 1E 26 HXERR: LD E,HX ; ?HEX Error -4892 1F6F C3 56 07 JP ERROR -4893 1F72 -4894 1F72 ; BIN$(NN) Convert integer to a 1-16 char binary string -4895 1F72 CD 0A 10 BIN: CALL TSTNUM ; Verify it's a number -4896 1F75 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 -4897 1F78 C5 BIN2: PUSH BC ; Save contents of BC -4898 1F79 21 99 31 LD HL,PBUFF -4899 1F7C 06 11 LD B,17 ; One higher than max char count -4900 1F7E ZEROSUP: ; Suppress leading zeros -4901 1F7E 05 DEC B ; Max 16 chars -4902 1F7F 78 LD A,B -4903 1F80 FE 01 CP $01 -4904 1F82 28 08 JR Z,BITOUT ; Always output at least one character -4905 1F84 CB 13 RL E -4906 1F86 CB 12 RL D -4907 1F88 30 F4 JR NC,ZEROSUP -4908 1F8A 18 04 JR BITOUT2 -4909 1F8C BITOUT: -4910 1F8C CB 13 RL E -4911 1F8E CB 12 RL D ; Top bit now in carry -4912 1F90 BITOUT2: -4913 1F90 3E 30 LD A,'0' ; Char for '0' -4914 1F92 CE 00 ADC A,0 ; If carry set then '0' --> '1' -4915 1F94 77 LD (HL),A -4916 1F95 23 INC HL -4917 1F96 05 DEC B -4918 1F97 20 F3 JR NZ,BITOUT -4919 1F99 AF XOR A ; Terminating character -4920 1F9A 77 LD (HL),A ; Store zero to terminate -4921 1F9B 23 INC HL ; Make sure PBUFF is terminated -4922 1F9C 77 LD (HL),A ; Store the double zero there -4923 1F9D C1 POP BC -4924 1F9E 21 99 31 LD HL,PBUFF -4925 1FA1 C3 70 14 JP STR1 -4926 1FA4 -4927 1FA4 ; Convert "&Bnnnn" to FPREG -4928 1FA4 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" -4929 1FA4 EB BINTFP: EX DE,HL ; Move code string pointer to DE -4930 1FA5 21 00 00 LD HL,$0000 ; Zero out the value -4931 1FA8 CD C1 1F CALL CHKBIN ; Check the number for valid bin -4932 1FAB DA CF 1F JP C,BINERR ; First value wasn't bin, HX error -4933 1FAE D6 30 BINIT: SUB '0' -4934 1FB0 29 ADD HL,HL ; Rotate HL left -4935 1FB1 B5 OR L -4936 1FB2 6F LD L,A -4937 1FB3 CD C1 1F CALL CHKBIN ; Get second and addtional characters -4938 1FB6 30 F6 JR NC,BINIT ; Process if a bin character -4939 1FB8 EB EX DE,HL ; Value into DE, Code string into HL -4940 1FB9 7A LD A,D ; Load DE into AC -4941 1FBA 4B LD C,E ; For prep to -4942 1FBB E5 PUSH HL -4943 1FBC CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4944 1FBF E1 POP HL -4945 1FC0 C9 RET -4946 1FC1 -4947 1FC1 ; Char is in A, NC if char is 0 or 1 -4948 1FC1 13 CHKBIN: INC DE -4949 1FC2 1A LD A,(DE) -4950 1FC3 FE 20 CP ' ' -4951 1FC5 CA C1 1F JP Z,CHKBIN ; Skip spaces -4952 1FC8 FE 30 CP '0' ; Set C if < '0' -4953 1FCA D8 RET C -4954 1FCB FE 32 CP '2' -4955 1FCD 3F CCF ; Set C if > '1' -4956 1FCE C9 RET -4957 1FCF -4958 1FCF 1E 28 BINERR: LD E,BN ; ?BIN Error -4959 1FD1 C3 56 07 JP ERROR -4960 1FD4 -4961 1FD4 -4962 1FD4 JJUMP1: -4963 1FD4 DD 21 FF FF LD IX,-1 ; Flag cold start -4964 1FD8 C3 A6 03 JP CSTART ; Go and initialise -4965 1FDB -4966 1FDB MONOUT: -4967 1FDB C3 08 00 JP $0008 ; output a char -4968 1FDE -4969 1FDE -4970 1FDE MONITR: -4971 1FDE C3 00 00 JP $0000 ; Restart (Normally Monitor Start) -4972 1FE1 -4973 1FE1 -4974 1FE1 3E 00 INITST: LD A,0 ; Clear break flag -4975 1FE3 32 FD 30 LD (BRKFLG),A -4976 1FE6 C3 AD 03 JP INIT -4977 1FE9 -4978 1FE9 ED 45 ARETN: RETN ; Return from NMI -4979 1FEB -4980 1FEB -4981 1FEB F5 TSTBIT: PUSH AF ; Save bit mask -4982 1FEC A0 AND B ; Get common bits -4983 1FED C1 POP BC ; Restore bit mask -4984 1FEE B8 CP B ; Same bit set? -4985 1FEF 3E 00 LD A,0 ; Return 0 in A -4986 1FF1 C9 RET -4987 1FF2 -4988 1FF2 CD 1B 0A OUTNCR: CALL OUTC ; Output character in A -4989 1FF5 C3 42 0E JP PRNTCRLF ; Output CRLF -4990 1FF8 -4991 1FF8 .end -4992 1FF8 -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; The updates to the original BASIC within this file are copyright Grant Searle +0003 0000 ; +0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0006 0000 ; +0007 0000 ; http://searle.hostei.com/grant/index.html +0008 0000 ; +0009 0000 ; eMail: home.micros01@btinternet.com +0010 0000 ; +0011 0000 ; If the above don't work, please perform an Internet search to see if I have +0012 0000 ; updated the web page hosting service. +0013 0000 ; +0014 0000 ;================================================================================== +0015 0000 +0016 0000 +0017 0000 ;================================================================================== +0018 0000 ; Contents of this file are copyright Grant Searle +0019 0000 ; HEX routines from Joel Owens. +0020 0000 ; +0021 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0022 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0023 0000 ; +0024 0000 ; http://searle.hostei.com/grant/index.html +0025 0000 ; +0026 0000 ; eMail: home.micros01@btinternet.com +0027 0000 ; +0028 0000 ; If the above don't work, please perform an Internet search to see if I have +0029 0000 ; updated the web page hosting service. +0030 0000 ; +0031 0000 ;================================================================================== +0032 0000 +0033 0000 ;------------------------------------------------------------------------------ +0034 0000 ; +0035 0000 ; Z80 Monitor Rom +0036 0000 ; +0037 0000 ;------------------------------------------------------------------------------ +0038 0000 ; General Equates +0039 0000 ;------------------------------------------------------------------------------ +0040 0000 +0041 0000 ;CR .EQU 0DH +0042 0000 ;LF .EQU 0AH +0043 0000 ;ESC .EQU 1BH +0044 0000 ;CTRLC .EQU 03H +0045 0000 M_CLS .EQU 0CH +0046 0000 +0047 0000 +0048 0000 loadAddr .EQU 0D000h ; CP/M load address +0049 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded +0050 0000 +0051 0000 +0052 0000 RTS_HIGH .EQU 0D5H +0053 0000 RTS_LOW .EQU 095H +0054 0000 +0055 0000 ACIA0_D .EQU $81 +0056 0000 ACIA0_C .EQU $80 +0057 0000 ACIA1_D .EQU $83 +0058 0000 ACIA1_C .EQU $82 +0059 0000 +0060 0000 SD_DATA .EQU 088H +0061 0000 SD_CONTROL .EQU 089H +0062 0000 SD_STATUS .EQU 089H +0063 0000 SD_LBA0 .EQU 08AH +0064 0000 SD_LBA1 .EQU 08BH +0065 0000 SD_LBA2 .EQU 08CH +0066 0000 +0067 3000 .ORG $3000 +0068 3000 +0069 3000 primaryIO .ds 1 +0070 3001 secNo .ds 1 +0071 3002 dmaAddr .ds 2 +0072 3004 +0073 3004 00 lba0 .DB 00h +0074 3005 00 lba1 .DB 00h +0075 3006 00 lba2 .DB 00h +0076 3007 00 lba3 .DB 00h +0077 3008 +0078 3008 stackSpace .ds 32 +0079 3028 M_STACK .EQU $ ; Stack top +0080 3028 +0081 3028 +0082 3028 ;------------------------------------------------------------------------------ +0083 3028 ; START OF MONITOR ROM +0084 3028 ;------------------------------------------------------------------------------ +0085 3028 +0086 0000 MON .ORG $0000 ; MONITOR ROM RESET VECTOR +0087 0000 ;------------------------------------------------------------------------------ +0088 0000 ; Reset +0089 0000 ;------------------------------------------------------------------------------ +0090 0000 F3 RST00 DI ;Disable INTerrupts +0091 0001 C3 94 00 JP M_INIT ;Initialize Hardware and go +0092 0004 00 NOP +0093 0005 00 NOP +0094 0006 00 NOP +0095 0007 00 NOP +0096 0008 ;------------------------------------------------------------------------------ +0097 0008 ; TX a character over RS232 wait for TXDONE first. +0098 0008 ;------------------------------------------------------------------------------ +0099 0008 C3 32 00 RST08 JP conout +0100 000B 00 NOP +0101 000C 00 NOP +0102 000D 00 NOP +0103 000E 00 NOP +0104 000F 00 NOP +0105 0010 ;------------------------------------------------------------------------------ +0106 0010 ; RX a character from buffer wait until char ready. +0107 0010 ;------------------------------------------------------------------------------ +0108 0010 C3 1B 00 RST10 JP conin +0109 0013 00 NOP +0110 0014 00 NOP +0111 0015 00 NOP +0112 0016 00 NOP +0113 0017 00 NOP +0114 0018 ;------------------------------------------------------------------------------ +0115 0018 ; Check input buffer status +0116 0018 ;------------------------------------------------------------------------------ +0117 0018 C3 5C 00 RST18 JP CKINCHAR +0118 001B +0119 001B +0120 001B ;------------------------------------------------------------------------------ +0121 001B ; Console input routine +0122 001B ; Use the "primaryIO" flag to determine which input port to monitor. +0123 001B ;------------------------------------------------------------------------------ +0124 001B conin: +0125 001B 3A 00 30 LD A,(primaryIO) +0126 001E FE 00 CP 0 +0127 0020 20 08 JR NZ,coninB +0128 0022 coninA: +0129 0022 +0130 0022 waitForCharA: +0131 0022 CD 63 00 call ckincharA +0132 0025 28 FB JR Z, waitForCharA +0133 0027 DB 81 IN A,(ACIA0_D) +0134 0029 C9 RET ; Char ready in A +0135 002A +0136 002A coninB: +0137 002A +0138 002A waitForCharB: +0139 002A CD 6A 00 call ckincharB +0140 002D 28 FB JR Z, waitForCharB +0141 002F DB 83 IN A,(ACIA1_D) +0142 0031 C9 RET ; Char ready in A +0143 0032 +0144 0032 ;------------------------------------------------------------------------------ +0145 0032 ; Console output routine +0146 0032 ; Use the "primaryIO" flag to determine which output port to send a character. +0147 0032 ;------------------------------------------------------------------------------ +0148 0032 F5 conout: PUSH AF ; Store character +0149 0033 3A 00 30 LD A,(primaryIO) +0150 0036 FE 00 CP 0 +0151 0038 20 0D JR NZ,conoutB1 +0152 003A 18 01 JR conoutA1 +0153 003C conoutA: +0154 003C F5 PUSH AF +0155 003D +0156 003D CD 50 00 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting +0157 0040 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready +0158 0042 F1 POP AF ; RETrieve character +0159 0043 D3 81 OUT (ACIA0_D),A ; OUTput the character +0160 0045 C9 RET +0161 0046 +0162 0046 conoutB: +0163 0046 F5 PUSH AF +0164 0047 +0165 0047 CD 56 00 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting +0166 004A 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready +0167 004C F1 POP AF ; RETrieve character +0168 004D D3 83 OUT (ACIA1_D),A ; OUTput the character +0169 004F C9 RET +0170 0050 +0171 0050 ;------------------------------------------------------------------------------ +0172 0050 ; I/O status check routine +0173 0050 ; Use the "primaryIO" flag to determine which port to check. +0174 0050 ;------------------------------------------------------------------------------ +0175 0050 CKACIA0 +0176 0050 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0177 0052 0F RRCA ; Rotates RX status into Carry Flag, +0178 0053 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0179 0055 C9 RET +0180 0056 +0181 0056 CKACIA1 +0182 0056 DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0183 0058 0F RRCA ; Rotates RX status into Carry Flag, +0184 0059 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0185 005B C9 RET +0186 005C +0187 005C ;------------------------------------------------------------------------------ +0188 005C ; Check if there is a character in the input buffer +0189 005C ; Use the "primaryIO" flag to determine which port to check. +0190 005C ;------------------------------------------------------------------------------ +0191 005C CKINCHAR +0192 005C 3A 00 30 LD A,(primaryIO) +0193 005F FE 00 CP 0 +0194 0061 20 07 JR NZ,ckincharB +0195 0063 +0196 0063 ckincharA: +0197 0063 +0198 0063 DB 80 IN A,(ACIA0_C) ; Status byte +0199 0065 E6 01 AND $01 +0200 0067 FE 00 CP $0 ; Z flag set if no char +0201 0069 C9 RET +0202 006A +0203 006A ckincharB: +0204 006A +0205 006A DB 82 IN A,(ACIA1_C) ; Status byte +0206 006C E6 01 AND $01 +0207 006E FE 00 CP $0 ; Z flag set if no char +0208 0070 C9 RET +0209 0071 +0210 0071 ;------------------------------------------------------------------------------ +0211 0071 ; Filtered Character I/O +0212 0071 ;------------------------------------------------------------------------------ +0213 0071 +0214 0071 D7 RDCHR RST 10H +0215 0072 FE 0A CP LF +0216 0074 28 FB JR Z,RDCHR ; Ignore LF +0217 0076 FE 1B CP ESC +0218 0078 20 02 JR NZ,RDCHR1 +0219 007A 3E 03 LD A,CTRLC ; Change ESC to CTRL-C +0220 007C C9 RDCHR1 RET +0221 007D +0222 007D FE 0D WRCHR CP CR +0223 007F 28 0A JR Z,WRCRLF ; When CR, write CRLF +0224 0081 FE 0C CP M_CLS +0225 0083 28 04 JR Z,WR ; Allow write of "CLS" +0226 0085 FE 20 CP ' ' ; Don't write out any other control codes +0227 0087 38 01 JR C,NOWR ; ie. < space +0228 0089 CF WR RST 08H +0229 008A C9 NOWR RET +0230 008B +0231 008B 3E 0D WRCRLF LD A,CR +0232 008D CF RST 08H +0233 008E 3E 0A LD A,LF +0234 0090 CF RST 08H +0235 0091 3E 0D LD A,CR +0236 0093 C9 RET +0237 0094 +0238 0094 +0239 0094 ;------------------------------------------------------------------------------ +0240 0094 ; Initialise hardware and start main loop +0241 0094 ;------------------------------------------------------------------------------ +0242 0094 31 28 30 M_INIT LD SP,M_STACK ; Set the Stack Pointer +0243 0097 +0244 0097 3E 95 LD A,RTS_LOW +0245 0099 D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 +0246 009B D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 +0247 009D ; Display the "Press space to start" message on both consoles +0248 009D 3E 00 LD A,$00 +0249 009F 32 00 30 LD (primaryIO),A +0250 00A2 21 65 03 LD HL,INITTXT +0251 00A5 CD 1B 01 CALL M_PRINT +0252 00A8 3E 01 LD A,$01 +0253 00AA 32 00 30 LD (primaryIO),A +0254 00AD 21 65 03 LD HL,INITTXT +0255 00B0 CD 1B 01 CALL M_PRINT +0256 00B3 +0257 00B3 ; Wait until space is in one of the buffers to determine the active console +0258 00B3 +0259 00B3 waitForSpace: +0260 00B3 +0261 00B3 CD 63 00 CALL ckincharA +0262 00B6 28 0F jr Z,notInA +0263 00B8 3E 00 LD A,$00 +0264 00BA 32 00 30 LD (primaryIO),A +0265 00BD CD 1B 00 CALL conin +0266 00C0 FE 20 CP ' ' +0267 00C2 C2 B3 00 JP NZ, waitForSpace +0268 00C5 18 14 JR spacePressed +0269 00C7 +0270 00C7 notInA: +0271 00C7 CD 6A 00 CALL ckincharB +0272 00CA 28 E7 JR Z,waitForSpace +0273 00CC 3E 01 LD A,$01 +0274 00CE 32 00 30 LD (primaryIO),A +0275 00D1 CD 1B 00 CALL conin +0276 00D4 FE 20 CP ' ' +0277 00D6 C2 B3 00 JP NZ, waitForSpace +0278 00D9 18 00 JR spacePressed +0279 00DB +0280 00DB spacePressed: +0281 00DB +0282 00DB ; Clear message on both consoles +0283 00DB 3E 0C LD A,$0C +0284 00DD CD 3C 00 CALL conoutA +0285 00E0 CD 46 00 CALL conoutB +0286 00E3 +0287 00E3 ; primaryIO is now set to the channel where SPACE was pressed +0288 00E3 +0289 00E3 +0290 00E3 CD 22 01 CALL TXCRLF ; TXCRLF +0291 00E6 21 96 02 LD HL,M_SIGNON ; Print SIGNON message +0292 00E9 CD 1B 01 CALL M_PRINT +0293 00EC +0294 00EC ;------------------------------------------------------------------------------ +0295 00EC ; Monitor command loop +0296 00EC ;------------------------------------------------------------------------------ +0297 00EC 21 EC 00 MAIN LD HL,MAIN ; Save entry point for Monitor +0298 00EF E5 PUSH HL ; This is the return address +0299 00F0 CD 22 01 MAIN0 CALL TXCRLF ; Entry point for Monitor, Normal +0300 00F3 3E 3E LD A,'>' ; Get a ">" +0301 00F5 CF RST 08H ; print it +0302 00F6 +0303 00F6 CD 71 00 MAIN1 CALL RDCHR ; Get a character from the input port +0304 00F9 FE 20 CP ' ' ; or less? +0305 00FB 38 F9 JR C,MAIN1 ; Go back +0306 00FD +0307 00FD FE 3A CP ':' ; ":"? +0308 00FF CA 99 01 JP Z,LOAD ; First character of a HEX load +0309 0102 +0310 0102 CD 7D 00 CALL WRCHR ; Print char on console +0311 0105 +0312 0105 E6 5F AND $5F ; Make character uppercase +0313 0107 +0314 0107 FE 42 CP 'B' +0315 0109 CA DA 01 JP Z,BASIC +0316 010C +0317 010C FE 47 CP 'G' +0318 010E CA 93 01 JP Z,M_GOTO +0319 0111 +0320 0111 FE 58 CP 'X' +0321 0113 CA F1 01 JP Z,CPMLOAD +0322 0116 +0323 0116 3E 3F LD A,'?' ; Get a "?" +0324 0118 CF RST 08H ; Print it +0325 0119 18 D5 JR MAIN0 +0326 011B +0327 011B ;------------------------------------------------------------------------------ +0328 011B ; Print string of characters to Serial A until byte=$00, WITH CR, LF +0329 011B ;------------------------------------------------------------------------------ +0330 011B 7E M_PRINT LD A,(HL) ; Get character +0331 011C B7 OR A ; Is it $00 ? +0332 011D C8 RET Z ; Then RETurn on terminator +0333 011E CF RST 08H ; Print it +0334 011F 23 INC HL ; Next Character +0335 0120 18 F9 JR M_PRINT ; Continue until $00 +0336 0122 +0337 0122 +0338 0122 3E 0D TXCRLF LD A,$0D ; +0339 0124 CF RST 08H ; Print character +0340 0125 3E 0A LD A,$0A ; +0341 0127 CF RST 08H ; Print character +0342 0128 C9 RET +0343 0129 +0344 0129 ;------------------------------------------------------------------------------ +0345 0129 ; Get a character from the console, must be $20-$7F to be valid (no control characters) +0346 0129 ; and breaks with the Zero Flag set +0347 0129 ;------------------------------------------------------------------------------ +0348 0129 CD 71 00 M_GETCHR CALL RDCHR ; RX a Character +0349 012C FE 03 CP $03 ; User break? +0350 012E C8 RET Z +0351 012F FE 20 CP $20 ; or better? +0352 0131 38 F6 JR C,M_GETCHR ; Do it again until we get something usable +0353 0133 C9 RET +0354 0134 ;------------------------------------------------------------------------------ +0355 0134 ; Gets two ASCII characters from the console (assuming them to be HEX 0-9 A-F) +0356 0134 ; Moves them into B and C, converts them into a byte value in A and updates a +0357 0134 ; Checksum value in E +0358 0134 ;------------------------------------------------------------------------------ +0359 0134 CD 29 01 GET2 CALL M_GETCHR ; Get us a valid character to work with +0360 0137 47 LD B,A ; Load it in B +0361 0138 CD 29 01 CALL M_GETCHR ; Get us another character +0362 013B 4F LD C,A ; load it in C +0363 013C CD 73 01 CALL BCTOA ; Convert ASCII to byte +0364 013F 4F LD C,A ; Build the checksum +0365 0140 7B LD A,E +0366 0141 91 SUB C ; The checksum should always equal zero when checked +0367 0142 5F LD E,A ; Save the checksum back where it came from +0368 0143 79 LD A,C ; Retrieve the byte and go back +0369 0144 C9 RET +0370 0145 ;------------------------------------------------------------------------------ +0371 0145 ; Gets four Hex characters from the console, converts them to values in HL +0372 0145 ;------------------------------------------------------------------------------ +0373 0145 21 00 00 GETHL LD HL,$0000 ; Gets xxxx but sets Carry Flag on any Terminator +0374 0148 CD 8C 01 CALL ECHO ; RX a Character +0375 014B FE 0D CP $0D ; ? +0376 014D 20 0E JR NZ,GETX2 ; other key +0377 014F 37 SETCY SCF ; Set Carry Flag +0378 0150 C9 RET ; and Return to main program +0379 0151 ;------------------------------------------------------------------------------ +0380 0151 ; This routine converts last four hex characters (0-9 A-F) user types into a value in HL +0381 0151 ; Rotates the old out and replaces with the new until the user hits a terminating character +0382 0151 ;------------------------------------------------------------------------------ +0383 0151 21 00 00 GETX LD HL,$0000 ; CLEAR HL +0384 0154 CD 8C 01 GETX1 CALL ECHO ; RX a character from the console +0385 0157 FE 0D CP $0D ; +0386 0159 C8 RET Z ; quit +0387 015A FE 2C CP $2C ; <,> can be used to safely quit for multiple entries +0388 015C C8 RET Z ; (Like filling both DE and HL from the user) +0389 015D FE 03 GETX2 CP $03 ; Likewise, a will terminate clean, too, but +0390 015F 28 EE JR Z,SETCY ; It also sets the Carry Flag for testing later. +0391 0161 29 ADD HL,HL ; Otherwise, rotate the previous low nibble to high +0392 0162 29 ADD HL,HL ; rather slowly +0393 0163 29 ADD HL,HL ; until we get to the top +0394 0164 29 ADD HL,HL ; and then we can continue on. +0395 0165 D6 30 SUB $30 ; Convert ASCII to byte value +0396 0167 FE 0A CP $0A ; Are we in the 0-9 range? +0397 0169 38 02 JR C,GETX3 ; Then we just need to sub $30, but if it is A-F +0398 016B D6 07 SUB $07 ; We need to take off 7 more to get the value down to +0399 016D E6 0F GETX3 AND $0F ; to the right hex value +0400 016F 85 ADD A,L ; Add the high nibble to the low +0401 0170 6F LD L,A ; Move the byte back to A +0402 0171 18 E1 JR GETX1 ; and go back for next character until he terminates +0403 0173 ;------------------------------------------------------------------------------ +0404 0173 ; Convert ASCII characters in B C registers to a byte value in A +0405 0173 ;------------------------------------------------------------------------------ +0406 0173 78 BCTOA LD A,B ; Move the hi order byte to A +0407 0174 D6 30 SUB $30 ; Take it down from Ascii +0408 0176 FE 0A CP $0A ; Are we in the 0-9 range here? +0409 0178 38 02 JR C,BCTOA1 ; If so, get the next nybble +0410 017A D6 07 SUB $07 ; But if A-F, take it down some more +0411 017C 07 BCTOA1 RLCA ; Rotate the nybble from low to high +0412 017D 07 RLCA ; One bit at a time +0413 017E 07 RLCA ; Until we +0414 017F 07 RLCA ; Get there with it +0415 0180 47 LD B,A ; Save the converted high nybble +0416 0181 79 LD A,C ; Now get the low order byte +0417 0182 D6 30 SUB $30 ; Convert it down from Ascii +0418 0184 FE 0A CP $0A ; 0-9 at this point? +0419 0186 38 02 JR C,BCTOA2 ; Good enough then, but +0420 0188 D6 07 SUB $07 ; Take off 7 more if it's A-F +0421 018A 80 BCTOA2 ADD A,B ; Add in the high order nybble +0422 018B C9 RET +0423 018C +0424 018C ;------------------------------------------------------------------------------ +0425 018C ; Get a character and echo it back to the user +0426 018C ;------------------------------------------------------------------------------ +0427 018C CD 71 00 ECHO CALL RDCHR +0428 018F CD 7D 00 CALL WRCHR +0429 0192 C9 RET +0430 0193 +0431 0193 ;------------------------------------------------------------------------------ +0432 0193 ; GOTO command +0433 0193 ;------------------------------------------------------------------------------ +0434 0193 CD 45 01 M_GOTO CALL GETHL ; ENTRY POINT FOR oto addr. Get XXXX from user. +0435 0196 D8 RET C ; Return if invalid +0436 0197 E5 PUSH HL +0437 0198 C9 RET ; Jump to HL address value +0438 0199 +0439 0199 ;------------------------------------------------------------------------------ +0440 0199 ; LOAD Intel Hex format file from the console. +0441 0199 ; [Intel Hex Format is: +0442 0199 ; 1) Colon (Frame 0) +0443 0199 ; 2) Record Length Field (Frames 1 and 2) +0444 0199 ; 3) Load Address Field (Frames 3,4,5,6) +0445 0199 ; 4) Record Type Field (Frames 7 and 8) +0446 0199 ; 5) Data Field (Frames 9 to 9+2*(Record Length)-1 +0447 0199 ; 6) Checksum Field - Sum of all byte values from Record Length to and +0448 0199 ; including Checksum Field = 0 ] +0449 0199 ;------------------------------------------------------------------------------ +0450 0199 1E 00 LOAD LD E,0 ; First two Characters is the Record Length Field +0451 019B CD 34 01 CALL GET2 ; Get us two characters into BC, convert it to a byte +0452 019E 57 LD D,A ; Load Record Length count into D +0453 019F CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address +0454 01A2 67 LD H,A ; put value in H register. +0455 01A3 CD 34 01 CALL GET2 ; Get next two characters, Memory Load Address +0456 01A6 6F LD L,A ; put value in L register. +0457 01A7 CD 34 01 CALL GET2 ; Get next two characters, Record Field Type +0458 01AA FE 01 CP $01 ; Record Field Type 00 is Data, 01 is End of File +0459 01AC 20 09 JR NZ,LOAD2 ; Must be the end of that file +0460 01AE CD 34 01 CALL GET2 ; Get next two characters, assemble into byte +0461 01B1 7B LD A,E ; Recall the Checksum byte +0462 01B2 A7 AND A ; Is it Zero? +0463 01B3 28 1E JR Z,LOAD00 ; Print footer reached message +0464 01B5 18 15 JR LOADERR ; Checksums don't add up, Error out +0465 01B7 +0466 01B7 7A LOAD2 LD A,D ; Retrieve line character counter +0467 01B8 A7 AND A ; Are we done with this line? +0468 01B9 28 0B JR Z,LOAD3 ; Get two more ascii characters, build a byte and checksum +0469 01BB CD 34 01 CALL GET2 ; Get next two chars, convert to byte in A, checksum it +0470 01BE 77 LD (HL),A ; Move converted byte in A to memory location +0471 01BF 23 INC HL ; Increment pointer to next memory location +0472 01C0 3E 2E LD A,'.' ; Print out a "." for every byte loaded +0473 01C2 CF RST 08H ; +0474 01C3 15 DEC D ; Decrement line character counter +0475 01C4 18 F1 JR LOAD2 ; and keep loading into memory until line is complete +0476 01C6 +0477 01C6 CD 34 01 LOAD3 CALL GET2 ; Get two chars, build byte and checksum +0478 01C9 7B LD A,E ; Check the checksum value +0479 01CA A7 AND A ; Is it zero? +0480 01CB C8 RET Z +0481 01CC +0482 01CC 21 54 03 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message +0483 01CF CD 1B 01 CALL M_PRINT ; Print Message from (HL) and terminate the load +0484 01D2 C9 RET +0485 01D3 +0486 01D3 21 8A 03 LOAD00 LD HL,LDETXT ; Print load complete message +0487 01D6 CD 1B 01 CALL M_PRINT +0488 01D9 C9 RET +0489 01DA +0490 01DA ;------------------------------------------------------------------------------ +0491 01DA ; Start BASIC command +0492 01DA ;------------------------------------------------------------------------------ +0493 01DA BASIC +0494 01DA 21 42 03 LD HL,M_BASTXT +0495 01DD CD 1B 01 CALL M_PRINT +0496 01E0 CD 29 01 CALL M_GETCHR +0497 01E3 C8 RET Z ; Cancel if CTRL-C +0498 01E4 E6 5F AND $5F ; uppercase +0499 01E6 FE 43 CP 'C' +0500 01E8 CA 95 03 JP Z,COLD +0501 01EB FE 57 CP 'W' +0502 01ED CA 98 03 JP Z,WARM +0503 01F0 C9 RET +0504 01F1 +0505 01F1 ;------------------------------------------------------------------------------ +0506 01F1 ; CP/M load command +0507 01F1 ;------------------------------------------------------------------------------ +0508 01F1 CPMLOAD +0509 01F1 +0510 01F1 21 03 02 LD HL,CPMTXT +0511 01F4 CD 1B 01 CALL M_PRINT +0512 01F7 CD 29 01 CALL M_GETCHR +0513 01FA C8 RET Z ; Cancel if CTRL-C +0514 01FB E6 5F AND $5F ; uppercase +0515 01FD FE 59 CP 'Y' +0516 01FF CA 24 02 JP Z,CPMLOAD2 +0517 0202 C9 RET +0518 0203 CPMTXT +0519 0203 0D 0A .BYTE $0D,$0A +0520 0205 42 6F 6F 74 .TEXT "Boot CP/M?" +0520 0209 20 43 50 2F +0520 020D 4D 3F +0521 020F 00 .BYTE $00 +0522 0210 +0523 0210 CPMTXT2 +0524 0210 0D 0A .BYTE $0D,$0A +0525 0212 4C 6F 61 64 .TEXT "Loading CP/M..." +0525 0216 69 6E 67 20 +0525 021A 43 50 2F 4D +0525 021E 2E 2E 2E +0526 0221 0D 0A 00 .BYTE $0D,$0A,$00 +0527 0224 +0528 0224 CPMLOAD2 +0529 0224 21 10 02 LD HL,CPMTXT2 +0530 0227 CD 1B 01 CALL M_PRINT +0531 022A +0532 022A 06 18 LD B,numSecs +0533 022C +0534 022C 3E 00 LD A,0 +0535 022E 32 04 30 LD (lba0),A +0536 0231 32 05 30 ld (lba1),A +0537 0234 32 06 30 ld (lba2),A +0538 0237 32 07 30 ld (lba3),A +0539 023A +0540 023A 21 00 D0 LD HL,loadAddr +0541 023D 22 02 30 LD (dmaAddr),HL +0542 0240 processSectors: +0543 0240 +0544 0240 CD 6E 02 call readhst +0545 0243 +0546 0243 11 00 02 LD DE,0200H +0547 0246 2A 02 30 LD HL,(dmaAddr) +0548 0249 19 ADD HL,DE +0549 024A 22 02 30 LD (dmaAddr),HL +0550 024D 3A 04 30 LD A,(lba0) +0551 0250 3C INC A +0552 0251 32 04 30 LD (lba0),A +0553 0254 +0554 0254 10 EA djnz processSectors +0555 0256 +0556 0256 ; Start CP/M using entry at top of BIOS +0557 0256 ; The current active console stream ID is pushed onto the stack +0558 0256 ; to allow the CBIOS to pick it up +0559 0256 ; 0 = ACIA0, 1 = ACIA1 +0560 0256 +0561 0256 3A 00 30 ld A,(primaryIO) +0562 0259 F5 PUSH AF +0563 025A 2A FE FF ld HL,($FFFE) +0564 025D E9 jp (HL) +0565 025E +0566 025E +0567 025E ;------------------------------------------------------------------------------ +0568 025E ; ROUTINES AS USED IN BIOS +0569 025E ;------------------------------------------------------------------------------ +0570 025E +0571 025E ;================================================================================================ +0572 025E ; Convert track/head/sector into LBA for physical access to the disk +0573 025E ;================================================================================================ +0574 025E setLBAaddr: +0575 025E ; Transfer LBA to disk (LBA3 not used on SD card) +0576 025E 3A 06 30 LD A,(lba2) +0577 0261 D3 8C OUT (SD_LBA2),A +0578 0263 3A 05 30 LD A,(lba1) +0579 0266 D3 8B OUT (SD_LBA1),A +0580 0268 3A 04 30 LD A,(lba0) +0581 026B D3 8A OUT (SD_LBA0),A +0582 026D C9 RET +0583 026E +0584 026E ;================================================================================================ +0585 026E ; Read physical sector from host +0586 026E ;================================================================================================ +0587 026E +0588 026E readhst: +0589 026E F5 PUSH AF +0590 026F C5 PUSH BC +0591 0270 E5 PUSH HL +0592 0271 +0593 0271 DB 89 rdWait1: IN A,(SD_STATUS) +0594 0273 FE 80 CP 128 +0595 0275 20 FA JR NZ,rdWait1 +0596 0277 +0597 0277 CD 5E 02 CALL setLBAaddr +0598 027A +0599 027A 3E 00 LD A,$00 ; 00 = Read block +0600 027C D3 89 OUT (SD_CONTROL),A +0601 027E +0602 027E 0E 04 LD c,4 +0603 0280 ; LD HL,hstbuf +0604 0280 rd4secs: +0605 0280 06 80 LD b,128 +0606 0282 rdByte: +0607 0282 +0608 0282 DB 89 rdWait2: IN A,(SD_STATUS) +0609 0284 FE E0 CP 224 ; Read byte waiting +0610 0286 20 FA JR NZ,rdWait2 +0611 0288 +0612 0288 DB 88 IN A,(SD_DATA) +0613 028A +0614 028A 77 LD (HL),A +0615 028B 23 INC HL +0616 028C 05 dec b +0617 028D 20 F3 JR NZ, rdByte +0618 028F 0D dec c +0619 0290 20 EE JR NZ,rd4secs +0620 0292 +0621 0292 E1 POP HL +0622 0293 C1 POP BC +0623 0294 F1 POP AF +0624 0295 +0625 0295 ; XOR a +0626 0295 ; ld (erflag),a +0627 0295 C9 RET +0628 0296 +0629 0296 ;------------------------------------------------------------------------------ +0630 0296 ; END OF ROUTINES AS USED IN BIOS +0631 0296 ;------------------------------------------------------------------------------ +0632 0296 +0633 0296 +0634 0296 43 50 2F 4D M_SIGNON .BYTE "CP/M Boot ROM 2.0" +0634 029A 20 42 6F 6F +0634 029E 74 20 52 4F +0634 02A2 4D 20 32 2E +0634 02A6 30 +0635 02A7 20 62 79 20 .BYTE " by G. Searle" +0635 02AB 47 2E 20 53 +0635 02AF 65 61 72 6C +0635 02B3 65 +0636 02B4 0D 0A .BYTE $0D,$0A +0637 02B6 0D 0A .BYTE $0D,$0A +0638 02B8 42 43 20 6F .TEXT "BC or BW - ROM BASIC Cold/Warm" +0638 02BC 72 20 42 57 +0638 02C0 20 2D 20 52 +0638 02C4 4F 4D 20 42 +0638 02C8 41 53 49 43 +0638 02CC 20 43 6F 6C +0638 02D0 64 2F 57 61 +0638 02D4 72 6D +0639 02D6 0D 0A .BYTE $0D,$0A +0640 02D8 58 20 20 20 .TEXT "X - Boot CP/M (load $D000-$FFFF)" +0640 02DC 20 20 20 20 +0640 02E0 20 2D 20 42 +0640 02E4 6F 6F 74 20 +0640 02E8 43 50 2F 4D +0640 02EC 20 28 6C 6F +0640 02F0 61 64 20 24 +0640 02F4 44 30 30 30 +0640 02F8 2D 24 46 46 +0640 02FC 46 46 29 +0641 02FF 0D 0A .BYTE $0D,$0A +0642 0301 3A 6E 6E 6E .TEXT ":nnnn... - Load Intel-Hex file record" +0642 0305 6E 2E 2E 2E +0642 0309 20 2D 20 4C +0642 030D 6F 61 64 20 +0642 0311 49 6E 74 65 +0642 0315 6C 2D 48 65 +0642 0319 78 20 66 69 +0642 031D 6C 65 20 72 +0642 0321 65 63 6F 72 +0642 0325 64 +0643 0326 0D 0A .BYTE $0D,$0A +0644 0328 47 6E 6E 6E .TEXT "Gnnnn - Run loc nnnn" +0644 032C 6E 20 20 20 +0644 0330 20 2D 20 52 +0644 0334 75 6E 20 6C +0644 0338 6F 63 20 6E +0644 033C 6E 6E 6E +0645 033F 0D 0A .BYTE $0D,$0A +0646 0341 00 .BYTE $00 +0647 0342 +0648 0342 M_BASTXT +0649 0342 0D 0A .BYTE $0D,$0A +0650 0344 43 6F 6C 64 .TEXT "Cold or warm?" +0650 0348 20 6F 72 20 +0650 034C 77 61 72 6D +0650 0350 3F +0651 0351 0D 0A 00 .BYTE $0D,$0A,$00 +0652 0354 +0653 0354 43 68 65 63 CKSUMERR .BYTE "Checksum error" +0653 0358 6B 73 75 6D +0653 035C 20 65 72 72 +0653 0360 6F 72 +0654 0362 0D 0A 00 .BYTE $0D,$0A,$00 +0655 0365 +0656 0365 INITTXT +0657 0365 0C .BYTE $0C +0658 0366 50 72 65 73 .TEXT "Press [SPACE] to activate console" +0658 036A 73 20 5B 53 +0658 036E 50 41 43 45 +0658 0372 5D 20 74 6F +0658 0376 20 61 63 74 +0658 037A 69 76 61 74 +0658 037E 65 20 63 6F +0658 0382 6E 73 6F 6C +0658 0386 65 +0659 0387 0D 0A 00 .BYTE $0D,$0A, $00 +0660 038A +0661 038A LDETXT +0662 038A 43 6F 6D 70 .TEXT "Complete" +0662 038E 6C 65 74 65 +0663 0392 0D 0A 00 .BYTE $0D,$0A, $00 +0664 0395 +0665 0395 ;=========================================================================================================================== +0666 0395 +0667 0395 ; NASCOM ROM BASIC Ver 4.7, (C) 1978 Microsoft +0668 0395 ; Scanned from source published in 80-BUS NEWS from Vol 2, Issue 3 +0669 0395 ; (May-June 1983) to Vol 3, Issue 3 (May-June 1984) +0670 0395 ; Adapted for the freeware Zilog Macro Assembler 2.10 to produce +0671 0395 ; the original ROM code (checksum A934H). PA +0672 0395 +0673 0395 ; GENERAL EQUATES +0674 0395 +0675 0395 CTRLC .EQU 03H ; Control "C" +0676 0395 CTRLG .EQU 07H ; Control "G" +0677 0395 BKSP .EQU 08H ; Back space +0678 0395 LF .EQU 0AH ; Line feed +0679 0395 CS .EQU 0CH ; Clear screen +0680 0395 CR .EQU 0DH ; Carriage return +0681 0395 CTRLO .EQU 0FH ; Control "O" +0682 0395 CTRLQ .EQU 11H ; Control "Q" +0683 0395 CTRLR .EQU 12H ; Control "R" +0684 0395 CTRLS .EQU 13H ; Control "S" +0685 0395 CTRLU .EQU 15H ; Control "U" +0686 0395 ESC .EQU 1BH ; Escape +0687 0395 DEL .EQU 7FH ; Delete +0688 0395 +0689 0395 ; BASIC WORK SPACE LOCATIONS +0690 0395 +0691 0395 WRKSPC .EQU 30B0H ; BASIC Work space +0692 0395 USR .EQU WRKSPC+3H ; "USR (x)" jump +0693 0395 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" +0694 0395 OTPORT .EQU WRKSPC+7H ; Port (p) +0695 0395 DIVSUP .EQU WRKSPC+9H ; Division support routine +0696 0395 DIV1 .EQU WRKSPC+0AH ; <- Values +0697 0395 DIV2 .EQU WRKSPC+0EH ; <- to +0698 0395 DIV3 .EQU WRKSPC+12H ; <- be +0699 0395 DIV4 .EQU WRKSPC+15H ; <-inserted +0700 0395 SEED .EQU WRKSPC+17H ; Random number seed +0701 0395 LSTRND .EQU WRKSPC+3AH ; Last random number +0702 0395 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine +0703 0395 INPORT .EQU WRKSPC+3FH ; PORT (x) +0704 0395 NULLS .EQU WRKSPC+41H ; Number of nulls +0705 0395 LWIDTH .EQU WRKSPC+42H ; Terminal width +0706 0395 COMMAN .EQU WRKSPC+43H ; Width for commas +0707 0395 NULFLG .EQU WRKSPC+44H ; Null after input byte flag +0708 0395 CTLOFG .EQU WRKSPC+45H ; Control "O" flag +0709 0395 LINESC .EQU WRKSPC+46H ; Lines counter +0710 0395 LINESN .EQU WRKSPC+48H ; Lines number +0711 0395 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum +0712 0395 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine +0713 0395 BRKFLG .EQU WRKSPC+4DH ; Break flag +0714 0395 RINPUT .EQU WRKSPC+4EH ; Input reflection +0715 0395 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +0716 0395 PSET .EQU WRKSPC+54H ; "SET" reflection +0717 0395 RESET .EQU WRKSPC+57H ; "RESET" reflection +0718 0395 STRSPC .EQU WRKSPC+5AH ; Bottom of string space +0719 0395 LINEAT .EQU WRKSPC+5CH ; Current line number +0720 0395 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program +0721 0395 BUFFER .EQU WRKSPC+61H ; Input buffer +0722 0395 STACK .EQU WRKSPC+66H ; Initial stack +0723 0395 CURPOS .EQU WRKSPC+0ABH ; Character position on line +0724 0395 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag +0725 0395 TYPE .EQU WRKSPC+0ADH ; Data type flag +0726 0395 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag +0727 0395 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM +0728 0395 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer +0729 0395 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool +0730 0395 TMPSTR .EQU WRKSPC+0BFH ; Temporary string +0731 0395 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space +0732 0395 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL +0733 0395 LOOPST .EQU WRKSPC+0C7H ; First statement of loop +0734 0395 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item +0735 0395 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag +0736 0395 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered +0737 0395 READFG .EQU WRKSPC+0CDH ; Read/Input flag +0738 0395 BRKLIN .EQU WRKSPC+0CEH ; Line of break +0739 0395 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL +0740 0395 ERRLIN .EQU WRKSPC+0D2H ; Line of error +0741 0395 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue +0742 0395 PROGND .EQU WRKSPC+0D6H ; End of program +0743 0395 VAREND .EQU WRKSPC+0D8H ; End of variables +0744 0395 ARREND .EQU WRKSPC+0DAH ; End of arrays +0745 0395 NXTDAT .EQU WRKSPC+0DCH ; Next data item +0746 0395 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument +0747 0395 FNARG .EQU WRKSPC+0E0H ; FN argument value +0748 0395 FPREG .EQU WRKSPC+0E4H ; Floating point register +0749 0395 FPEXP .EQU FPREG+3 ; Floating point exponent +0750 0395 SGNRES .EQU WRKSPC+0E8H ; Sign of result +0751 0395 PBUFF .EQU WRKSPC+0E9H ; Number print buffer +0752 0395 MULVAL .EQU WRKSPC+0F6H ; Multiplier +0753 0395 PROGST .EQU WRKSPC+0F9H ; Start of program text area +0754 0395 STLOOK .EQU WRKSPC+15DH ; Start of memory test +0755 0395 +0756 0395 ; BASIC ERROR CODE VALUES +0757 0395 +0758 0395 NF .EQU 00H ; NEXT without FOR +0759 0395 SN .EQU 02H ; Syntax error +0760 0395 RG .EQU 04H ; RETURN without GOSUB +0761 0395 OD .EQU 06H ; Out of DATA +0762 0395 FC .EQU 08H ; Function call error +0763 0395 OV .EQU 0AH ; Overflow +0764 0395 OM .EQU 0CH ; Out of memory +0765 0395 UL .EQU 0EH ; Undefined line number +0766 0395 BS .EQU 10H ; Bad subscript +0767 0395 DD .EQU 12H ; Re-DIMensioned array +0768 0395 DZ .EQU 14H ; Division by zero (/0) +0769 0395 ID .EQU 16H ; Illegal direct +0770 0395 TM .EQU 18H ; Type miss-match +0771 0395 OS .EQU 1AH ; Out of string space +0772 0395 LS .EQU 1CH ; String too long +0773 0395 ST .EQU 1EH ; String formula too complex +0774 0395 CN .EQU 20H ; Can't CONTinue +0775 0395 UF .EQU 22H ; UnDEFined FN function +0776 0395 MO .EQU 24H ; Missing operand +0777 0395 HX .EQU 26H ; HEX error +0778 0395 BN .EQU 28H ; BIN error +0779 0395 +0780 0395 ; .ORG 00396H +0781 0395 +0782 0395 C3 9B 03 COLD: JP STARTB ; Jump for cold start +0783 0398 C3 39 04 WARM: JP WARMST ; Jump for warm start +0784 039B STARTB: +0785 039B DD 21 00 00 LD IX,0 ; Flag cold start +0786 039F C3 A6 03 JP CSTART ; Jump to initialise +0787 03A2 +0788 03A2 4C 0C .WORD DEINT ; Get integer -32768 to 32767 +0789 03A4 C2 13 .WORD ABPASS ; Return integer in AB +0790 03A6 +0791 03A6 +0792 03A6 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM +0793 03A9 F9 LD SP,HL ; Set up a temporary stack +0794 03AA C3 E1 1F JP INITST ; Go to initialise +0795 03AD +0796 03AD 11 73 06 INIT: LD DE,INITAB ; Initialise workspace +0797 03B0 06 63 LD B,INITBE-INITAB+3; Bytes to copy +0798 03B2 21 B0 30 LD HL,WRKSPC ; Into workspace RAM +0799 03B5 1A COPY: LD A,(DE) ; Get source +0800 03B6 77 LD (HL),A ; To destination +0801 03B7 23 INC HL ; Next destination +0802 03B8 13 INC DE ; Next source +0803 03B9 05 DEC B ; Count bytes +0804 03BA C2 B5 03 JP NZ,COPY ; More to move +0805 03BD F9 LD SP,HL ; Temporary stack +0806 03BE CD 74 08 CALL CLREG ; Clear registers and stack +0807 03C1 CD 42 0E CALL PRNTCRLF ; Output CRLF +0808 03C4 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer +0809 03C7 32 A9 31 LD (PROGST),A ; Initialise program area +0810 03CA 21 88 04 MSIZE: LD HL,MEMMSG ; Point to message +0811 03CD CD E0 14 CALL PRS ; Output "Memory size" +0812 03D0 CD 91 08 CALL PROMPT ; Get input with '?' +0813 03D3 CD 9A 0B CALL GETCHR ; Get next character +0814 03D6 B7 OR A ; Set flags +0815 03D7 C2 EF 03 JP NZ,TSTMEM ; If number - Test if RAM there +0816 03DA 21 0D 32 LD HL,STLOOK ; Point to start of RAM +0817 03DD 23 MLOOP: INC HL ; Next byte +0818 03DE 7C LD A,H ; Above address FFFF ? +0819 03DF B5 OR L +0820 03E0 CA 01 04 JP Z,SETTOP ; Yes - 64K RAM +0821 03E3 7E LD A,(HL) ; Get contents +0822 03E4 47 LD B,A ; Save it +0823 03E5 2F CPL ; Flip all bits +0824 03E6 77 LD (HL),A ; Put it back +0825 03E7 BE CP (HL) ; RAM there if same +0826 03E8 70 LD (HL),B ; Restore old contents +0827 03E9 CA DD 03 JP Z,MLOOP ; If RAM - test next byte +0828 03EC C3 01 04 JP SETTOP ; Top of RAM found +0829 03EF +0830 03EF CD 66 0C TSTMEM: CALL ATOH ; Get high memory into DE +0831 03F2 B7 OR A ; Set flags on last byte +0832 03F3 C2 42 07 JP NZ,SNERR ; ?SN Error if bad character +0833 03F6 EB EX DE,HL ; Address into HL +0834 03F7 2B DEC HL ; Back one byte +0835 03F8 3E D9 LD A,11011001B ; Test byte +0836 03FA 46 LD B,(HL) ; Get old contents +0837 03FB 77 LD (HL),A ; Load test byte +0838 03FC BE CP (HL) ; RAM there if same +0839 03FD 70 LD (HL),B ; Restore old contents +0840 03FE C2 CA 03 JP NZ,MSIZE ; Ask again if no RAM +0841 0401 +0842 0401 2B SETTOP: DEC HL ; Back one byte +0843 0402 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM +0844 0405 CD 0A 0A CALL CPDEHL ; Compare DE with HL +0845 0408 DA CA 03 JP C,MSIZE ; Ask again if not enough RAM +0846 040B 11 CE FF LD DE,0-50 ; 50 Bytes string space +0847 040E 22 5F 31 LD (LSTRAM),HL ; Save last available RAM +0848 0411 19 ADD HL,DE ; Allocate string space +0849 0412 22 0A 31 LD (STRSPC),HL ; Save string space +0850 0415 CD 4F 08 CALL CLRPTR ; Clear program area +0851 0418 2A 0A 31 LD HL,(STRSPC) ; Get end of memory +0852 041B 11 EF FF LD DE,0-17 ; Offset for free bytes +0853 041E 19 ADD HL,DE ; Adjust HL +0854 041F 11 A9 31 LD DE,PROGST ; Start of program text +0855 0422 7D LD A,L ; Get LSB +0856 0423 93 SUB E ; Adjust it +0857 0424 6F LD L,A ; Re-save +0858 0425 7C LD A,H ; Get MSB +0859 0426 9A SBC A,D ; Adjust it +0860 0427 67 LD H,A ; Re-save +0861 0428 E5 PUSH HL ; Save bytes free +0862 0429 21 51 04 LD HL,SIGNON ; Sign-on message +0863 042C CD E0 14 CALL PRS ; Output string +0864 042F E1 POP HL ; Get bytes free back +0865 0430 CD 83 1B CALL PRNTHL ; Output amount of free memory +0866 0433 21 42 04 LD HL,BFREE ; " Bytes free" message +0867 0436 CD E0 14 CALL PRS ; Output string +0868 0439 +0869 0439 31 16 31 WARMST: LD SP,STACK ; Temporary stack +0870 043C CD 74 08 BRKRET: CALL CLREG ; Clear registers and stack +0871 043F C3 8D 07 JP PRNTOK ; Go to get command line +0872 0442 +0873 0442 20 42 79 74 BFREE: .BYTE " Bytes free",CR,LF,0,0 +0873 0446 65 73 20 66 +0873 044A 72 65 65 0D +0873 044E 0A 00 00 +0874 0451 +0875 0451 5A 38 30 20 SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF +0875 0455 42 41 53 49 +0875 0459 43 20 56 65 +0875 045D 72 20 34 2E +0875 0461 37 62 0D 0A +0876 0465 43 6F 70 79 .BYTE "Copyright ",40,"C",41 +0876 0469 72 69 67 68 +0876 046D 74 20 28 43 +0876 0471 29 +0877 0472 20 31 39 37 .BYTE " 1978 by Microsoft",CR,LF,0,0 +0877 0476 38 20 62 79 +0877 047A 20 4D 69 63 +0877 047E 72 6F 73 6F +0877 0482 66 74 0D 0A +0877 0486 00 00 +0878 0488 +0879 0488 4D 65 6D 6F MEMMSG: .BYTE "Memory top",0 +0879 048C 72 79 20 74 +0879 0490 6F 70 00 +0880 0493 +0881 0493 ; FUNCTION ADDRESS TABLE +0882 0493 +0883 0493 F8 19 FNCTAB: .WORD SGN +0884 0495 BC 1A .WORD INT +0885 0497 0E 1A .WORD ABS +0886 0499 B3 30 .WORD USR +0887 049B A0 13 .WORD FRE +0888 049D 25 17 .WORD INP +0889 049F CE 13 .WORD POS +0890 04A1 82 1C .WORD SQR +0891 04A3 61 1D .WORD RND +0892 04A5 9D 18 .WORD LOG +0893 04A7 D0 1C .WORD EXP +0894 04A9 D6 1D .WORD COS +0895 04AB DC 1D .WORD SIN +0896 04AD 3D 1E .WORD TAN +0897 04AF 52 1E .WORD ATN +0898 04B1 79 17 .WORD PEEK +0899 04B3 BD 1E .WORD DEEK +0900 04B5 01 31 .WORD POINT +0901 04B7 52 16 .WORD LEN +0902 04B9 6A 14 .WORD STR +0903 04BB EC 16 .WORD VAL +0904 04BD 61 16 .WORD ASC +0905 04BF 72 16 .WORD CHR +0906 04C1 DF 1E .WORD HEX +0907 04C3 72 1F .WORD BIN +0908 04C5 82 16 .WORD LEFT +0909 04C7 B2 16 .WORD RIGHT +0910 04C9 BC 16 .WORD MID +0911 04CB +0912 04CB ; RESERVED WORD LIST +0913 04CB +0914 04CB C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" +0915 04CE C6 4F 52 .BYTE 'F'+80H,"OR" +0916 04D1 CE 45 58 54 .BYTE 'N'+80H,"EXT" +0917 04D5 C4 41 54 41 .BYTE 'D'+80H,"ATA" +0918 04D9 C9 4E 50 55 .BYTE 'I'+80H,"NPUT" +0918 04DD 54 +0919 04DE C4 49 4D .BYTE 'D'+80H,"IM" +0920 04E1 D2 45 41 44 .BYTE 'R'+80H,"EAD" +0921 04E5 CC 45 54 .BYTE 'L'+80H,"ET" +0922 04E8 C7 4F 54 4F .BYTE 'G'+80H,"OTO" +0923 04EC D2 55 4E .BYTE 'R'+80H,"UN" +0924 04EF C9 46 .BYTE 'I'+80H,"F" +0925 04F1 D2 45 53 54 .BYTE 'R'+80H,"ESTORE" +0925 04F5 4F 52 45 +0926 04F8 C7 4F 53 55 .BYTE 'G'+80H,"OSUB" +0926 04FC 42 +0927 04FD D2 45 54 55 .BYTE 'R'+80H,"ETURN" +0927 0501 52 4E +0928 0503 D2 45 4D .BYTE 'R'+80H,"EM" +0929 0506 D3 54 4F 50 .BYTE 'S'+80H,"TOP" +0930 050A CF 55 54 .BYTE 'O'+80H,"UT" +0931 050D CF 4E .BYTE 'O'+80H,"N" +0932 050F CE 55 4C 4C .BYTE 'N'+80H,"ULL" +0933 0513 D7 41 49 54 .BYTE 'W'+80H,"AIT" +0934 0517 C4 45 46 .BYTE 'D'+80H,"EF" +0935 051A D0 4F 4B 45 .BYTE 'P'+80H,"OKE" +0936 051E C4 4F 4B 45 .BYTE 'D'+80H,"OKE" +0937 0522 D3 43 52 45 .BYTE 'S'+80H,"CREEN" +0937 0526 45 4E +0938 0528 CC 49 4E 45 .BYTE 'L'+80H,"INES" +0938 052C 53 +0939 052D C3 4C 53 .BYTE 'C'+80H,"LS" +0940 0530 D7 49 44 54 .BYTE 'W'+80H,"IDTH" +0940 0534 48 +0941 0535 CD 4F 4E 49 .BYTE 'M'+80H,"ONITOR" +0941 0539 54 4F 52 +0942 053C D3 45 54 .BYTE 'S'+80H,"ET" +0943 053F D2 45 53 45 .BYTE 'R'+80H,"ESET" +0943 0543 54 +0944 0544 D0 52 49 4E .BYTE 'P'+80H,"RINT" +0944 0548 54 +0945 0549 C3 4F 4E 54 .BYTE 'C'+80H,"ONT" +0946 054D CC 49 53 54 .BYTE 'L'+80H,"IST" +0947 0551 C3 4C 45 41 .BYTE 'C'+80H,"LEAR" +0947 0555 52 +0948 0556 C3 4C 4F 41 .BYTE 'C'+80H,"LOAD" +0948 055A 44 +0949 055B C3 53 41 56 .BYTE 'C'+80H,"SAVE" +0949 055F 45 +0950 0560 CE 45 57 .BYTE 'N'+80H,"EW" +0951 0563 +0952 0563 D4 41 42 28 .BYTE 'T'+80H,"AB(" +0953 0567 D4 4F .BYTE 'T'+80H,"O" +0954 0569 C6 4E .BYTE 'F'+80H,"N" +0955 056B D3 50 43 28 .BYTE 'S'+80H,"PC(" +0956 056F D4 48 45 4E .BYTE 'T'+80H,"HEN" +0957 0573 CE 4F 54 .BYTE 'N'+80H,"OT" +0958 0576 D3 54 45 50 .BYTE 'S'+80H,"TEP" +0959 057A +0960 057A AB .BYTE '+'+80H +0961 057B AD .BYTE '-'+80H +0962 057C AA .BYTE '*'+80H +0963 057D AF .BYTE '/'+80H +0964 057E DE .BYTE '^'+80H +0965 057F C1 4E 44 .BYTE 'A'+80H,"ND" +0966 0582 CF 52 .BYTE 'O'+80H,"R" +0967 0584 BE .BYTE '>'+80H +0968 0585 BD .BYTE '='+80H +0969 0586 BC .BYTE '<'+80H +0970 0587 +0971 0587 D3 47 4E .BYTE 'S'+80H,"GN" +0972 058A C9 4E 54 .BYTE 'I'+80H,"NT" +0973 058D C1 42 53 .BYTE 'A'+80H,"BS" +0974 0590 D5 53 52 .BYTE 'U'+80H,"SR" +0975 0593 C6 52 45 .BYTE 'F'+80H,"RE" +0976 0596 C9 4E 50 .BYTE 'I'+80H,"NP" +0977 0599 D0 4F 53 .BYTE 'P'+80H,"OS" +0978 059C D3 51 52 .BYTE 'S'+80H,"QR" +0979 059F D2 4E 44 .BYTE 'R'+80H,"ND" +0980 05A2 CC 4F 47 .BYTE 'L'+80H,"OG" +0981 05A5 C5 58 50 .BYTE 'E'+80H,"XP" +0982 05A8 C3 4F 53 .BYTE 'C'+80H,"OS" +0983 05AB D3 49 4E .BYTE 'S'+80H,"IN" +0984 05AE D4 41 4E .BYTE 'T'+80H,"AN" +0985 05B1 C1 54 4E .BYTE 'A'+80H,"TN" +0986 05B4 D0 45 45 4B .BYTE 'P'+80H,"EEK" +0987 05B8 C4 45 45 4B .BYTE 'D'+80H,"EEK" +0988 05BC D0 4F 49 4E .BYTE 'P'+80H,"OINT" +0988 05C0 54 +0989 05C1 CC 45 4E .BYTE 'L'+80H,"EN" +0990 05C4 D3 54 52 24 .BYTE 'S'+80H,"TR$" +0991 05C8 D6 41 4C .BYTE 'V'+80H,"AL" +0992 05CB C1 53 43 .BYTE 'A'+80H,"SC" +0993 05CE C3 48 52 24 .BYTE 'C'+80H,"HR$" +0994 05D2 C8 45 58 24 .BYTE 'H'+80H,"EX$" +0995 05D6 C2 49 4E 24 .BYTE 'B'+80H,"IN$" +0996 05DA CC 45 46 54 .BYTE 'L'+80H,"EFT$" +0996 05DE 24 +0997 05DF D2 49 47 48 .BYTE 'R'+80H,"IGHT$" +0997 05E3 54 24 +0998 05E5 CD 49 44 24 .BYTE 'M'+80H,"ID$" +0999 05E9 80 .BYTE 80H ; End of list marker +1000 05EA +1001 05EA ; KEYWORD ADDRESS TABLE +1002 05EA +1003 05EA E4 0B WORDTB: .WORD PEND +1004 05EC E1 0A .WORD FOR +1005 05EE BC 0F .WORD NEXT +1006 05F0 31 0D .WORD DATA +1007 05F2 C3 0E .WORD INPUT +1008 05F4 F8 11 .WORD DIM +1009 05F6 F2 0E .WORD READ +1010 05F8 48 0D .WORD LET +1011 05FA EE 0C .WORD GOTO +1012 05FC D1 0C .WORD RUN +1013 05FE C0 0D .WORD IF +1014 0600 AA 0B .WORD RESTOR +1015 0602 DD 0C .WORD GOSUB +1016 0604 0C 0D .WORD RETURN +1017 0606 33 0D .WORD REM +1018 0608 E2 0B .WORD STOP +1019 060A 31 17 .WORD POUT +1020 060C A2 0D .WORD ON +1021 060E 23 0C .WORD NULL +1022 0610 37 17 .WORD WAIT +1023 0612 D6 13 .WORD DEF +1024 0614 80 17 .WORD POKE +1025 0616 C8 1E .WORD DOKE +1026 0618 33 0D .WORD REM +1027 061A AE 1E .WORD LINES +1028 061C A1 1E .WORD CLS +1029 061E A6 1E .WORD WIDTH +1030 0620 DE 1F .WORD MONITR +1031 0622 04 31 .WORD PSET +1032 0624 07 31 .WORD RESET +1033 0626 E4 0D .WORD PRINT +1034 0628 10 0C .WORD CONT +1035 062A 56 0A .WORD LIST +1036 062C 8B 0C .WORD CLEAR +1037 062E 33 0D .WORD REM +1038 0630 33 0D .WORD REM +1039 0632 4E 08 .WORD NEW +1040 0634 +1041 0634 ; RESERVED WORD TOKEN VALUES +1042 0634 +1043 0634 ZEND .EQU 080H ; END +1044 0634 ZFOR .EQU 081H ; FOR +1045 0634 ZDATA .EQU 083H ; DATA +1046 0634 ZGOTO .EQU 088H ; GOTO +1047 0634 ZGOSUB .EQU 08CH ; GOSUB +1048 0634 ZREM .EQU 08EH ; REM +1049 0634 ZPRINT .EQU 09EH ; PRINT +1050 0634 ZNEW .EQU 0A4H ; NEW +1051 0634 +1052 0634 ZTAB .EQU 0A5H ; TAB +1053 0634 ZTO .EQU 0A6H ; TO +1054 0634 ZFN .EQU 0A7H ; FN +1055 0634 ZSPC .EQU 0A8H ; SPC +1056 0634 ZTHEN .EQU 0A9H ; THEN +1057 0634 ZNOT .EQU 0AAH ; NOT +1058 0634 ZSTEP .EQU 0ABH ; STEP +1059 0634 +1060 0634 ZPLUS .EQU 0ACH ; + +1061 0634 ZMINUS .EQU 0ADH ; - +1062 0634 ZTIMES .EQU 0AEH ; * +1063 0634 ZDIV .EQU 0AFH ; / +1064 0634 ZOR .EQU 0B2H ; OR +1065 0634 ZGTR .EQU 0B3H ; > +1066 0634 ZEQUAL .EQU 0B4H ; M +1067 0634 ZLTH .EQU 0B5H ; < +1068 0634 ZSGN .EQU 0B6H ; SGN +1069 0634 ZPOINT .EQU 0C7H ; POINT +1070 0634 ZLEFT .EQU 0CDH +2 ; LEFT$ +1071 0634 +1072 0634 ; ARITHMETIC PRECEDENCE TABLE +1073 0634 +1074 0634 79 PRITAB: .BYTE 79H ; Precedence value +1075 0635 6A 1B .WORD PADD ; FPREG = + FPREG +1076 0637 +1077 0637 79 .BYTE 79H ; Precedence value +1078 0638 9E 17 .WORD PSUB ; FPREG = - FPREG +1079 063A +1080 063A 7C .BYTE 7CH ; Precedence value +1081 063B DC 18 .WORD MULT ; PPREG = * FPREG +1082 063D +1083 063D 7C .BYTE 7CH ; Precedence value +1084 063E 3D 19 .WORD DIV ; FPREG = / FPREG +1085 0640 +1086 0640 7F .BYTE 7FH ; Precedence value +1087 0641 8B 1C .WORD POWER ; FPREG = ^ FPREG +1088 0643 +1089 0643 50 .BYTE 50H ; Precedence value +1090 0644 51 11 .WORD PAND ; FPREG = AND FPREG +1091 0646 +1092 0646 46 .BYTE 46H ; Precedence value +1093 0647 50 11 .WORD POR ; FPREG = OR FPREG +1094 0649 +1095 0649 ; BASIC ERROR CODE LIST +1096 0649 +1097 0649 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR +1098 064B 53 4E .BYTE "SN" ; Syntax error +1099 064D 52 47 .BYTE "RG" ; RETURN without GOSUB +1100 064F 4F 44 .BYTE "OD" ; Out of DATA +1101 0651 46 43 .BYTE "FC" ; Illegal function call +1102 0653 4F 56 .BYTE "OV" ; Overflow error +1103 0655 4F 4D .BYTE "OM" ; Out of memory +1104 0657 55 4C .BYTE "UL" ; Undefined line +1105 0659 42 53 .BYTE "BS" ; Bad subscript +1106 065B 44 44 .BYTE "DD" ; Re-DIMensioned array +1107 065D 2F 30 .BYTE "/0" ; Division by zero +1108 065F 49 44 .BYTE "ID" ; Illegal direct +1109 0661 54 4D .BYTE "TM" ; Type mis-match +1110 0663 4F 53 .BYTE "OS" ; Out of string space +1111 0665 4C 53 .BYTE "LS" ; String too long +1112 0667 53 54 .BYTE "ST" ; String formula too complex +1113 0669 43 4E .BYTE "CN" ; Can't CONTinue +1114 066B 55 46 .BYTE "UF" ; Undefined FN function +1115 066D 4D 4F .BYTE "MO" ; Missing operand +1116 066F 48 58 .BYTE "HX" ; HEX error +1117 0671 42 4E .BYTE "BN" ; BIN error +1118 0673 +1119 0673 ; INITIALISATION TABLE ------------------------------------------------------- +1120 0673 +1121 0673 C3 39 04 INITAB: JP WARMST ; Warm start jump +1122 0676 C3 61 0C JP FCERR ; "USR (X)" jump (Set to Error) +1123 0679 D3 00 OUT (0),A ; "OUT p,n" skeleton +1124 067B C9 RET +1125 067C D6 00 SUB 0 ; Division support routine +1126 067E 6F LD L,A +1127 067F 7C LD A,H +1128 0680 DE 00 SBC A,0 +1129 0682 67 LD H,A +1130 0683 78 LD A,B +1131 0684 DE 00 SBC A,0 +1132 0686 47 LD B,A +1133 0687 3E 00 LD A,0 +1134 0689 C9 RET +1135 068A 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND +1136 068D 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 +1137 0691 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 +1138 0695 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 +1139 0699 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 +1140 069D 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 +1141 06A1 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 +1142 06A5 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 +1143 06A9 D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 +1144 06AD 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number +1145 06B1 DB 00 IN A,(0) ; INP (x) skeleton +1146 06B3 C9 RET +1147 06B4 01 .BYTE 1 ; POS (x) number (1) +1148 06B5 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) +1149 06B6 1C .BYTE 28 ; Width for commas (3 columns) +1150 06B7 00 .BYTE 0 ; No nulls after input bytes +1151 06B8 00 .BYTE 0 ; Output enabled (^O off) +1152 06B9 14 00 .WORD 20 ; Initial lines counter +1153 06BB 14 00 .WORD 20 ; Initial lines number +1154 06BD 00 00 .WORD 0 ; Array load/save check sum +1155 06BF 00 .BYTE 0 ; Break not by NMI +1156 06C0 00 .BYTE 0 ; Break flag +1157 06C1 C3 87 09 JP TTYLIN ; Input reflection (set to TTY) +1158 06C4 C3 00 00 JP $0000 ; POINT reflection unused +1159 06C7 C3 00 00 JP $0000 ; SET reflection +1160 06CA C3 00 00 JP $0000 ; RESET reflection +1161 06CD 0D 32 .WORD STLOOK ; Temp string space +1162 06CF FE FF .WORD -2 ; Current line number (cold) +1163 06D1 AA 31 .WORD PROGST+1 ; Start of program text +1164 06D3 INITBE: +1165 06D3 +1166 06D3 ; END OF INITIALISATION TABLE --------------------------------------------------- +1167 06D3 +1168 06D3 20 45 72 72 ERRMSG: .BYTE " Error",0 +1168 06D7 6F 72 00 +1169 06DA 20 69 6E 20 INMSG: .BYTE " in ",0 +1169 06DE 00 +1170 06DF ZERBYT .EQU $-1 ; A zero byte +1171 06DF 4F 6B 0D 0A OKMSG: .BYTE "Ok",CR,LF,0,0 +1171 06E3 00 00 +1172 06E5 42 72 65 61 BRKMSG: .BYTE "Break",0 +1172 06E9 6B 00 +1173 06EB +1174 06EB 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with +1175 06EE 39 ADD HL,SP ; same index as specified +1176 06EF 7E LOKFOR: LD A,(HL) ; Get block ID +1177 06F0 23 INC HL ; Point to index address +1178 06F1 FE 81 CP ZFOR ; Is it a "FOR" token +1179 06F3 C0 RET NZ ; No - exit +1180 06F4 4E LD C,(HL) ; BC = Address of "FOR" index +1181 06F5 23 INC HL +1182 06F6 46 LD B,(HL) +1183 06F7 23 INC HL ; Point to sign of STEP +1184 06F8 E5 PUSH HL ; Save pointer to sign +1185 06F9 69 LD L,C ; HL = address of "FOR" index +1186 06FA 60 LD H,B +1187 06FB 7A LD A,D ; See if an index was specified +1188 06FC B3 OR E ; DE = 0 if no index specified +1189 06FD EB EX DE,HL ; Specified index into HL +1190 06FE CA 05 07 JP Z,INDFND ; Skip if no index given +1191 0701 EB EX DE,HL ; Index back into DE +1192 0702 CD 0A 0A CALL CPDEHL ; Compare index with one given +1193 0705 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block +1194 0708 E1 POP HL ; Restore pointer to sign +1195 0709 C8 RET Z ; Return if block found +1196 070A 09 ADD HL,BC ; Point to next block +1197 070B C3 EF 06 JP LOKFOR ; Keep on looking +1198 070E +1199 070E CD 28 07 MOVUP: CALL ENFMEM ; See if enough memory +1200 0711 C5 MOVSTR: PUSH BC ; Save end of source +1201 0712 E3 EX (SP),HL ; Swap source and dest" end +1202 0713 C1 POP BC ; Get end of destination +1203 0714 CD 0A 0A MOVLP: CALL CPDEHL ; See if list moved +1204 0717 7E LD A,(HL) ; Get byte +1205 0718 02 LD (BC),A ; Move it +1206 0719 C8 RET Z ; Exit if all done +1207 071A 0B DEC BC ; Next byte to move to +1208 071B 2B DEC HL ; Next byte to move +1209 071C C3 14 07 JP MOVLP ; Loop until all bytes moved +1210 071F +1211 071F E5 CHKSTK: PUSH HL ; Save code string address +1212 0720 2A 8A 31 LD HL,(ARREND) ; Lowest free memory +1213 0723 06 00 LD B,0 ; BC = Number of levels to test +1214 0725 09 ADD HL,BC ; 2 Bytes for each level +1215 0726 09 ADD HL,BC +1216 0727 3E .BYTE 3EH ; Skip "PUSH HL" +1217 0728 E5 ENFMEM: PUSH HL ; Save code string address +1218 0729 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM +1219 072B 95 SUB L +1220 072C 6F LD L,A +1221 072D 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM +1222 072F 9C SBC A,H +1223 0730 DA 37 07 JP C,OMERR ; Not enough - ?OM Error +1224 0733 67 LD H,A +1225 0734 39 ADD HL,SP ; Test if stack is overflowed +1226 0735 E1 POP HL ; Restore code string address +1227 0736 D8 RET C ; Return if enough mmory +1228 0737 1E 0C OMERR: LD E,OM ; ?OM Error +1229 0739 C3 56 07 JP ERROR +1230 073C +1231 073C 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item +1232 073F 22 0C 31 LD (LINEAT),HL ; Save as current line +1233 0742 1E 02 SNERR: LD E,SN ; ?SN Error +1234 0744 01 .BYTE 01H ; Skip "LD E,DZ" +1235 0745 1E 14 DZERR: LD E,DZ ; ?/0 Error +1236 0747 01 .BYTE 01H ; Skip "LD E,NF" +1237 0748 1E 00 NFERR: LD E,NF ; ?NF Error +1238 074A 01 .BYTE 01H ; Skip "LD E,DD" +1239 074B 1E 12 DDERR: LD E,DD ; ?DD Error +1240 074D 01 .BYTE 01H ; Skip "LD E,UF" +1241 074E 1E 22 UFERR: LD E,UF ; ?UF Error +1242 0750 01 .BYTE 01H ; Skip "LD E,OV +1243 0751 1E 0A OVERR: LD E,OV ; ?OV Error +1244 0753 01 .BYTE 01H ; Skip "LD E,TM" +1245 0754 1E 18 TMERR: LD E,TM ; ?TM Error +1246 0756 +1247 0756 CD 74 08 ERROR: CALL CLREG ; Clear registers and stack +1248 0759 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) +1249 075C CD 35 0E CALL STTLIN ; Start new line +1250 075F 21 49 06 LD HL,ERRORS ; Point to error codes +1251 0762 57 LD D,A ; D = 0 (A is 0) +1252 0763 3E 3F LD A,'?' +1253 0765 CD 1B 0A CALL OUTC ; Output '?' +1254 0768 19 ADD HL,DE ; Offset to correct error code +1255 0769 7E LD A,(HL) ; First character +1256 076A CD 1B 0A CALL OUTC ; Output it +1257 076D CD 9A 0B CALL GETCHR ; Get next character +1258 0770 CD 1B 0A CALL OUTC ; Output it +1259 0773 21 D3 06 LD HL,ERRMSG ; "Error" message +1260 0776 CD E0 14 ERRIN: CALL PRS ; Output message +1261 0779 2A 0C 31 LD HL,(LINEAT) ; Get line of error +1262 077C 11 FE FF LD DE,-2 ; Cold start error if -2 +1263 077F CD 0A 0A CALL CPDEHL ; See if cold start error +1264 0782 CA A6 03 JP Z,CSTART ; Cold start error - Restart +1265 0785 7C LD A,H ; Was it a direct error? +1266 0786 A5 AND L ; Line = -1 if direct error +1267 0787 3C INC A +1268 0788 C4 7B 1B CALL NZ,LINEIN ; No - output line of error +1269 078B 3E .BYTE 3EH ; Skip "POP BC" +1270 078C C1 POPNOK: POP BC ; Drop address in input buffer +1271 078D +1272 078D AF PRNTOK: XOR A ; Output "Ok" and get command +1273 078E 32 F5 30 LD (CTLOFG),A ; Enable output +1274 0791 CD 35 0E CALL STTLIN ; Start new line +1275 0794 21 DF 06 LD HL,OKMSG ; "Ok" message +1276 0797 CD E0 14 CALL PRS ; Output "Ok" +1277 079A 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode +1278 079D 22 0C 31 LD (LINEAT),HL ; Save as current line +1279 07A0 CD 87 09 CALL GETLIN ; Get an input line +1280 07A3 DA 9A 07 JP C,GETCMD ; Get line again if break +1281 07A6 CD 9A 0B CALL GETCHR ; Get first character +1282 07A9 3C INC A ; Test if end of line +1283 07AA 3D DEC A ; Without affecting Carry +1284 07AB CA 9A 07 JP Z,GETCMD ; Nothing entered - Get another +1285 07AE F5 PUSH AF ; Save Carry status +1286 07AF CD 66 0C CALL ATOH ; Get line number into DE +1287 07B2 D5 PUSH DE ; Save line number +1288 07B3 CD 9E 08 CALL CRUNCH ; Tokenise rest of line +1289 07B6 47 LD B,A ; Length of tokenised line +1290 07B7 D1 POP DE ; Restore line number +1291 07B8 F1 POP AF ; Restore Carry +1292 07B9 D2 7A 0B JP NC,EXCUTE ; No line number - Direct mode +1293 07BC D5 PUSH DE ; Save line number +1294 07BD C5 PUSH BC ; Save length of tokenised line +1295 07BE AF XOR A +1296 07BF 32 7C 31 LD (LSTBIN),A ; Clear last byte input +1297 07C2 CD 9A 0B CALL GETCHR ; Get next character +1298 07C5 B7 OR A ; Set flags +1299 07C6 F5 PUSH AF ; And save them +1300 07C7 CD 2E 08 CALL SRCHLN ; Search for line number in DE +1301 07CA DA D3 07 JP C,LINFND ; Jump if line found +1302 07CD F1 POP AF ; Get status +1303 07CE F5 PUSH AF ; And re-save +1304 07CF CA 07 0D JP Z,ULERR ; Nothing after number - Error +1305 07D2 B7 OR A ; Clear Carry +1306 07D3 C5 LINFND: PUSH BC ; Save address of line in prog +1307 07D4 D2 EA 07 JP NC,INEWLN ; Line not found - Insert new +1308 07D7 EB EX DE,HL ; Next line address in DE +1309 07D8 2A 86 31 LD HL,(PROGND) ; End of program +1310 07DB 1A SFTPRG: LD A,(DE) ; Shift rest of program down +1311 07DC 02 LD (BC),A +1312 07DD 03 INC BC ; Next destination +1313 07DE 13 INC DE ; Next source +1314 07DF CD 0A 0A CALL CPDEHL ; All done? +1315 07E2 C2 DB 07 JP NZ,SFTPRG ; More to do +1316 07E5 60 LD H,B ; HL - New end of program +1317 07E6 69 LD L,C +1318 07E7 22 86 31 LD (PROGND),HL ; Update end of program +1319 07EA +1320 07EA D1 INEWLN: POP DE ; Get address of line, +1321 07EB F1 POP AF ; Get status +1322 07EC CA 11 08 JP Z,SETPTR ; No text - Set up pointers +1323 07EF 2A 86 31 LD HL,(PROGND) ; Get end of program +1324 07F2 E3 EX (SP),HL ; Get length of input line +1325 07F3 C1 POP BC ; End of program to BC +1326 07F4 09 ADD HL,BC ; Find new end +1327 07F5 E5 PUSH HL ; Save new end +1328 07F6 CD 0E 07 CALL MOVUP ; Make space for line +1329 07F9 E1 POP HL ; Restore new end +1330 07FA 22 86 31 LD (PROGND),HL ; Update end of program pointer +1331 07FD EB EX DE,HL ; Get line to move up in HL +1332 07FE 74 LD (HL),H ; Save MSB +1333 07FF D1 POP DE ; Get new line number +1334 0800 23 INC HL ; Skip pointer +1335 0801 23 INC HL +1336 0802 73 LD (HL),E ; Save LSB of line number +1337 0803 23 INC HL +1338 0804 72 LD (HL),D ; Save MSB of line number +1339 0805 23 INC HL ; To first byte in line +1340 0806 11 11 31 LD DE,BUFFER ; Copy buffer to program +1341 0809 1A MOVBUF: LD A,(DE) ; Get source +1342 080A 77 LD (HL),A ; Save destinations +1343 080B 23 INC HL ; Next source +1344 080C 13 INC DE ; Next destination +1345 080D B7 OR A ; Done? +1346 080E C2 09 08 JP NZ,MOVBUF ; No - Repeat +1347 0811 CD 5A 08 SETPTR: CALL RUNFST ; Set line pointers +1348 0814 23 INC HL ; To LSB of pointer +1349 0815 EB EX DE,HL ; Address to DE +1350 0816 62 PTRLP: LD H,D ; Address to HL +1351 0817 6B LD L,E +1352 0818 7E LD A,(HL) ; Get LSB of pointer +1353 0819 23 INC HL ; To MSB of pointer +1354 081A B6 OR (HL) ; Compare with MSB pointer +1355 081B CA 9A 07 JP Z,GETCMD ; Get command line if end +1356 081E 23 INC HL ; To LSB of line number +1357 081F 23 INC HL ; Skip line number +1358 0820 23 INC HL ; Point to first byte in line +1359 0821 AF XOR A ; Looking for 00 byte +1360 0822 BE FNDEND: CP (HL) ; Found end of line? +1361 0823 23 INC HL ; Move to next byte +1362 0824 C2 22 08 JP NZ,FNDEND ; No - Keep looking +1363 0827 EB EX DE,HL ; Next line address to HL +1364 0828 73 LD (HL),E ; Save LSB of pointer +1365 0829 23 INC HL +1366 082A 72 LD (HL),D ; Save MSB of pointer +1367 082B C3 16 08 JP PTRLP ; Do next line +1368 082E +1369 082E 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text +1370 0831 44 SRCHLP: LD B,H ; BC = Address to look at +1371 0832 4D LD C,L +1372 0833 7E LD A,(HL) ; Get address of next line +1373 0834 23 INC HL +1374 0835 B6 OR (HL) ; End of program found? +1375 0836 2B DEC HL +1376 0837 C8 RET Z ; Yes - Line not found +1377 0838 23 INC HL +1378 0839 23 INC HL +1379 083A 7E LD A,(HL) ; Get LSB of line number +1380 083B 23 INC HL +1381 083C 66 LD H,(HL) ; Get MSB of line number +1382 083D 6F LD L,A +1383 083E CD 0A 0A CALL CPDEHL ; Compare with line in DE +1384 0841 60 LD H,B ; HL = Start of this line +1385 0842 69 LD L,C +1386 0843 7E LD A,(HL) ; Get LSB of next line address +1387 0844 23 INC HL +1388 0845 66 LD H,(HL) ; Get MSB of next line address +1389 0846 6F LD L,A ; Next line to HL +1390 0847 3F CCF +1391 0848 C8 RET Z ; Lines found - Exit +1392 0849 3F CCF +1393 084A D0 RET NC ; Line not found,at line after +1394 084B C3 31 08 JP SRCHLP ; Keep looking +1395 084E +1396 084E C0 NEW: RET NZ ; Return if any more on line +1397 084F 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program +1398 0852 AF XOR A ; Set program area to empty +1399 0853 77 LD (HL),A ; Save LSB = 00 +1400 0854 23 INC HL +1401 0855 77 LD (HL),A ; Save MSB = 00 +1402 0856 23 INC HL +1403 0857 22 86 31 LD (PROGND),HL ; Set program end +1404 085A +1405 085A 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables +1406 085D 2B DEC HL +1407 085E +1408 085E 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables +1409 0861 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +1410 0864 22 73 31 LD (STRBOT),HL ; Clear string space +1411 0867 AF XOR A +1412 0868 CD AA 0B CALL RESTOR ; Reset DATA pointers +1413 086B 2A 86 31 LD HL,(PROGND) ; Get end of program +1414 086E 22 88 31 LD (VAREND),HL ; Clear variables +1415 0871 22 8A 31 LD (ARREND),HL ; Clear arrays +1416 0874 +1417 0874 C1 CLREG: POP BC ; Save return address +1418 0875 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN +1419 0878 F9 LD SP,HL ; Set stack +1420 0879 21 63 31 LD HL,TMSTPL ; Temporary string pool +1421 087C 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr +1422 087F AF XOR A ; A = 00 +1423 0880 6F LD L,A ; HL = 0000 +1424 0881 67 LD H,A +1425 0882 22 84 31 LD (CONTAD),HL ; No CONTinue +1426 0885 32 7B 31 LD (FORFLG),A ; Clear FOR flag +1427 0888 22 8E 31 LD (FNRGNM),HL ; Clear FN argument +1428 088B E5 PUSH HL ; HL = 0000 +1429 088C C5 PUSH BC ; Put back return +1430 088D 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN +1431 0890 C9 RET ; Return to execution driver +1432 0891 +1433 0891 3E 3F PROMPT: LD A,'?' ; '?' +1434 0893 CD 1B 0A CALL OUTC ; Output character +1435 0896 3E 20 LD A,' ' ; Space +1436 0898 CD 1B 0A CALL OUTC ; Output character +1437 089B C3 FE 30 JP RINPUT ; Get input line +1438 089E +1439 089E AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER +1440 089F 32 5E 31 LD (DATFLG),A ; Reset literal flag +1441 08A2 0E 05 LD C,2+3 ; 2 byte number and 3 nulls +1442 08A4 11 11 31 LD DE,BUFFER ; Start of input buffer +1443 08A7 7E CRNCLP: LD A,(HL) ; Get byte +1444 08A8 FE 20 CP ' ' ; Is it a space? +1445 08AA CA 26 09 JP Z,MOVDIR ; Yes - Copy direct +1446 08AD 47 LD B,A ; Save character +1447 08AE FE 22 CP '"' ; Is it a quote? +1448 08B0 CA 46 09 JP Z,CPYLIT ; Yes - Copy literal string +1449 08B3 B7 OR A ; Is it end of buffer? +1450 08B4 CA 4D 09 JP Z,ENDBUF ; Yes - End buffer +1451 08B7 3A 5E 31 LD A,(DATFLG) ; Get data type +1452 08BA B7 OR A ; Literal? +1453 08BB 7E LD A,(HL) ; Get byte to copy +1454 08BC C2 26 09 JP NZ,MOVDIR ; Literal - Copy direct +1455 08BF FE 3F CP '?' ; Is it '?' short for PRINT +1456 08C1 3E 9E LD A,ZPRINT ; "PRINT" token +1457 08C3 CA 26 09 JP Z,MOVDIR ; Yes - replace it +1458 08C6 7E LD A,(HL) ; Get byte again +1459 08C7 FE 30 CP '0' ; Is it less than '0' +1460 08C9 DA D1 08 JP C,FNDWRD ; Yes - Look for reserved words +1461 08CC FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? +1462 08CE DA 26 09 JP C,MOVDIR ; Yes - copy it direct +1463 08D1 D5 FNDWRD: PUSH DE ; Look for reserved words +1464 08D2 11 CA 04 LD DE,WORDS-1 ; Point to table +1465 08D5 C5 PUSH BC ; Save count +1466 08D6 01 22 09 LD BC,RETNAD ; Where to return to +1467 08D9 C5 PUSH BC ; Save return address +1468 08DA 06 7F LD B,ZEND-1 ; First token value -1 +1469 08DC 7E LD A,(HL) ; Get byte +1470 08DD FE 61 CP 'a' ; Less than 'a' ? +1471 08DF DA EA 08 JP C,SEARCH ; Yes - search for words +1472 08E2 FE 7B CP 'z'+1 ; Greater than 'z' ? +1473 08E4 D2 EA 08 JP NC,SEARCH ; Yes - search for words +1474 08E7 E6 5F AND 01011111B ; Force upper case +1475 08E9 77 LD (HL),A ; Replace byte +1476 08EA 4E SEARCH: LD C,(HL) ; Search for a word +1477 08EB EB EX DE,HL +1478 08EC 23 GETNXT: INC HL ; Get next reserved word +1479 08ED B6 OR (HL) ; Start of word? +1480 08EE F2 EC 08 JP P,GETNXT ; No - move on +1481 08F1 04 INC B ; Increment token value +1482 08F2 7E LD A, (HL) ; Get byte from table +1483 08F3 E6 7F AND 01111111B ; Strip bit 7 +1484 08F5 C8 RET Z ; Return if end of list +1485 08F6 B9 CP C ; Same character as in buffer? +1486 08F7 C2 EC 08 JP NZ,GETNXT ; No - get next word +1487 08FA EB EX DE,HL +1488 08FB E5 PUSH HL ; Save start of word +1489 08FC +1490 08FC 13 NXTBYT: INC DE ; Look through rest of word +1491 08FD 1A LD A,(DE) ; Get byte from table +1492 08FE B7 OR A ; End of word ? +1493 08FF FA 1E 09 JP M,MATCH ; Yes - Match found +1494 0902 4F LD C,A ; Save it +1495 0903 78 LD A,B ; Get token value +1496 0904 FE 88 CP ZGOTO ; Is it "GOTO" token ? +1497 0906 C2 0D 09 JP NZ,NOSPC ; No - Don't allow spaces +1498 0909 CD 9A 0B CALL GETCHR ; Get next character +1499 090C 2B DEC HL ; Cancel increment from GETCHR +1500 090D 23 NOSPC: INC HL ; Next byte +1501 090E 7E LD A,(HL) ; Get byte +1502 090F FE 61 CP 'a' ; Less than 'a' ? +1503 0911 DA 16 09 JP C,NOCHNG ; Yes - don't change +1504 0914 E6 5F AND 01011111B ; Make upper case +1505 0916 B9 NOCHNG: CP C ; Same as in buffer ? +1506 0917 CA FC 08 JP Z,NXTBYT ; Yes - keep testing +1507 091A E1 POP HL ; Get back start of word +1508 091B C3 EA 08 JP SEARCH ; Look at next word +1509 091E +1510 091E 48 MATCH: LD C,B ; Word found - Save token value +1511 091F F1 POP AF ; Throw away return +1512 0920 EB EX DE,HL +1513 0921 C9 RET ; Return to "RETNAD" +1514 0922 EB RETNAD: EX DE,HL ; Get address in string +1515 0923 79 LD A,C ; Get token value +1516 0924 C1 POP BC ; Restore buffer length +1517 0925 D1 POP DE ; Get destination address +1518 0926 23 MOVDIR: INC HL ; Next source in buffer +1519 0927 12 LD (DE),A ; Put byte in buffer +1520 0928 13 INC DE ; Move up buffer +1521 0929 0C INC C ; Increment length of buffer +1522 092A D6 3A SUB ':' ; End of statement? +1523 092C CA 34 09 JP Z,SETLIT ; Jump if multi-statement line +1524 092F FE 49 CP ZDATA-3AH ; Is it DATA statement ? +1525 0931 C2 37 09 JP NZ,TSTREM ; No - see if REM +1526 0934 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag +1527 0937 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? +1528 0939 C2 A7 08 JP NZ,CRNCLP ; No - Leave flag +1529 093C 47 LD B,A ; Copy rest of buffer +1530 093D 7E NXTCHR: LD A,(HL) ; Get byte +1531 093E B7 OR A ; End of line ? +1532 093F CA 4D 09 JP Z,ENDBUF ; Yes - Terminate buffer +1533 0942 B8 CP B ; End of statement ? +1534 0943 CA 26 09 JP Z,MOVDIR ; Yes - Get next one +1535 0946 23 CPYLIT: INC HL ; Move up source string +1536 0947 12 LD (DE),A ; Save in destination +1537 0948 0C INC C ; Increment length +1538 0949 13 INC DE ; Move up destination +1539 094A C3 3D 09 JP NXTCHR ; Repeat +1540 094D +1541 094D 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer +1542 0950 12 LD (DE),A ; Mark end of buffer (A = 00) +1543 0951 13 INC DE +1544 0952 12 LD (DE),A ; A = 00 +1545 0953 13 INC DE +1546 0954 12 LD (DE),A ; A = 00 +1547 0955 C9 RET +1548 0956 +1549 0956 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status +1550 0959 B7 OR A ; Is it zero? +1551 095A 3E 00 LD A,0 ; Zero A - Leave flags +1552 095C 32 F4 30 LD (NULFLG),A ; Zero null flag +1553 095F C2 6A 09 JP NZ,ECHDEL ; Set - Echo it +1554 0962 05 DEC B ; Decrement length +1555 0963 CA 87 09 JP Z,GETLIN ; Get line again if empty +1556 0966 CD 1B 0A CALL OUTC ; Output null character +1557 0969 3E .BYTE 3EH ; Skip "DEC B" +1558 096A 05 ECHDEL: DEC B ; Count bytes in buffer +1559 096B 2B DEC HL ; Back space buffer +1560 096C CA 7E 09 JP Z,OTKLN ; No buffer - Try again +1561 096F 7E LD A,(HL) ; Get deleted byte +1562 0970 CD 1B 0A CALL OUTC ; Echo it +1563 0973 C3 90 09 JP MORINP ; Get more input +1564 0976 +1565 0976 05 DELCHR: DEC B ; Count bytes in buffer +1566 0977 2B DEC HL ; Back space buffer +1567 0978 CD 1B 0A CALL OUTC ; Output character in A +1568 097B C2 90 09 JP NZ,MORINP ; Not end - Get more +1569 097E CD 1B 0A OTKLN: CALL OUTC ; Output character in A +1570 0981 CD 42 0E KILIN: CALL PRNTCRLF ; Output CRLF +1571 0984 C3 87 09 JP TTYLIN ; Get line again +1572 0987 +1573 0987 GETLIN: +1574 0987 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character +1575 098A 06 01 LD B,1 ; Set buffer as empty +1576 098C AF XOR A +1577 098D 32 F4 30 LD (NULFLG),A ; Clear null flag +1578 0990 CD 45 0A MORINP: CALL CLOTST ; Get character and test ^O +1579 0993 4F LD C,A ; Save character in C +1580 0994 FE 7F CP DEL ; Delete character? +1581 0996 CA 56 09 JP Z,DODEL ; Yes - Process it +1582 0999 3A F4 30 LD A,(NULFLG) ; Get null flag +1583 099C B7 OR A ; Test null flag status +1584 099D CA A9 09 JP Z,PROCES ; Reset - Process character +1585 09A0 3E 00 LD A,0 ; Set a null +1586 09A2 CD 1B 0A CALL OUTC ; Output null +1587 09A5 AF XOR A ; Clear A +1588 09A6 32 F4 30 LD (NULFLG),A ; Reset null flag +1589 09A9 79 PROCES: LD A,C ; Get character +1590 09AA FE 07 CP CTRLG ; Bell? +1591 09AC CA ED 09 JP Z,PUTCTL ; Yes - Save it +1592 09AF FE 03 CP CTRLC ; Is it control "C"? +1593 09B1 CC 42 0E CALL Z,PRNTCRLF ; Yes - Output CRLF +1594 09B4 37 SCF ; Flag break +1595 09B5 C8 RET Z ; Return if control "C" +1596 09B6 FE 0D CP CR ; Is it enter? +1597 09B8 CA 3D 0E JP Z,ENDINP ; Yes - Terminate input +1598 09BB FE 15 CP CTRLU ; Is it control "U"? +1599 09BD CA 81 09 JP Z,KILIN ; Yes - Get another line +1600 09C0 FE 40 CP '@' ; Is it "kill line"? +1601 09C2 CA 7E 09 JP Z,OTKLN ; Yes - Kill line +1602 09C5 FE 5F CP '_' ; Is it delete? +1603 09C7 CA 76 09 JP Z,DELCHR ; Yes - Delete character +1604 09CA FE 08 CP BKSP ; Is it backspace? +1605 09CC CA 76 09 JP Z,DELCHR ; Yes - Delete character +1606 09CF FE 12 CP CTRLR ; Is it control "R"? +1607 09D1 C2 E8 09 JP NZ,PUTBUF ; No - Put in buffer +1608 09D4 C5 PUSH BC ; Save buffer length +1609 09D5 D5 PUSH DE ; Save DE +1610 09D6 E5 PUSH HL ; Save buffer address +1611 09D7 36 00 LD (HL),0 ; Mark end of buffer +1612 09D9 CD F2 1F CALL OUTNCR ; Output and do CRLF +1613 09DC 21 11 31 LD HL,BUFFER ; Point to buffer start +1614 09DF CD E0 14 CALL PRS ; Output buffer +1615 09E2 E1 POP HL ; Restore buffer address +1616 09E3 D1 POP DE ; Restore DE +1617 09E4 C1 POP BC ; Restore buffer length +1618 09E5 C3 90 09 JP MORINP ; Get another character +1619 09E8 +1620 09E8 FE 20 PUTBUF: CP ' ' ; Is it a control code? +1621 09EA DA 90 09 JP C,MORINP ; Yes - Ignore +1622 09ED 78 PUTCTL: LD A,B ; Get number of bytes in buffer +1623 09EE FE 49 CP 72+1 ; Test for line overflow +1624 09F0 3E 07 LD A,CTRLG ; Set a bell +1625 09F2 D2 02 0A JP NC,OUTNBS ; Ring bell if buffer full +1626 09F5 79 LD A,C ; Get character +1627 09F6 71 LD (HL),C ; Save in buffer +1628 09F7 32 7C 31 LD (LSTBIN),A ; Save last input byte +1629 09FA 23 INC HL ; Move up buffer +1630 09FB 04 INC B ; Increment length +1631 09FC CD 1B 0A OUTIT: CALL OUTC ; Output the character entered +1632 09FF C3 90 09 JP MORINP ; Get another character +1633 0A02 +1634 0A02 CD 1B 0A OUTNBS: CALL OUTC ; Output bell and back over it +1635 0A05 3E 08 LD A,BKSP ; Set back space +1636 0A07 C3 FC 09 JP OUTIT ; Output it and get more +1637 0A0A +1638 0A0A 7C CPDEHL: LD A,H ; Get H +1639 0A0B 92 SUB D ; Compare with D +1640 0A0C C0 RET NZ ; Different - Exit +1641 0A0D 7D LD A,L ; Get L +1642 0A0E 93 SUB E ; Compare with E +1643 0A0F C9 RET ; Return status +1644 0A10 +1645 0A10 7E CHKSYN: LD A,(HL) ; Check syntax of character +1646 0A11 E3 EX (SP),HL ; Address of test byte +1647 0A12 BE CP (HL) ; Same as in code string? +1648 0A13 23 INC HL ; Return address +1649 0A14 E3 EX (SP),HL ; Put it back +1650 0A15 CA 9A 0B JP Z,GETCHR ; Yes - Get next character +1651 0A18 C3 42 07 JP SNERR ; Different - ?SN Error +1652 0A1B +1653 0A1B F5 OUTC: PUSH AF ; Save character +1654 0A1C 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag +1655 0A1F B7 OR A ; Is it set? +1656 0A20 C2 15 15 JP NZ,POPAF ; Yes - don't output +1657 0A23 F1 POP AF ; Restore character +1658 0A24 C5 PUSH BC ; Save buffer length +1659 0A25 F5 PUSH AF ; Save character +1660 0A26 FE 20 CP ' ' ; Is it a control code? +1661 0A28 DA 3F 0A JP C,DINPOS ; Yes - Don't INC POS(X) +1662 0A2B 3A F2 30 LD A,(LWIDTH) ; Get line width +1663 0A2E 47 LD B,A ; To B +1664 0A2F 3A 5B 31 LD A,(CURPOS) ; Get cursor position +1665 0A32 04 INC B ; Width 255? +1666 0A33 CA 3B 0A JP Z,INCLEN ; Yes - No width limit +1667 0A36 05 DEC B ; Restore width +1668 0A37 B8 CP B ; At end of line? +1669 0A38 CC 42 0E CALL Z,PRNTCRLF ; Yes - output CRLF +1670 0A3B 3C INCLEN: INC A ; Move on one character +1671 0A3C 32 5B 31 LD (CURPOS),A ; Save new position +1672 0A3F F1 DINPOS: POP AF ; Restore character +1673 0A40 C1 POP BC ; Restore buffer length +1674 0A41 CD DB 1F CALL MONOUT ; Send it +1675 0A44 C9 RET +1676 0A45 +1677 0A45 CD 9F 1E CLOTST: CALL GETINP ; Get input character +1678 0A48 E6 7F AND 01111111B ; Strip bit 7 +1679 0A4A FE 0F CP CTRLO ; Is it control "O"? +1680 0A4C C0 RET NZ ; No don't flip flag +1681 0A4D 3A F5 30 LD A,(CTLOFG) ; Get flag +1682 0A50 2F CPL ; Flip it +1683 0A51 32 F5 30 LD (CTLOFG),A ; Put it back +1684 0A54 AF XOR A ; Null character +1685 0A55 C9 RET +1686 0A56 +1687 0A56 CD 66 0C LIST: CALL ATOH ; ASCII number to DE +1688 0A59 C0 RET NZ ; Return if anything extra +1689 0A5A C1 POP BC ; Rubbish - Not needed +1690 0A5B CD 2E 08 CALL SRCHLN ; Search for line number in DE +1691 0A5E C5 PUSH BC ; Save address of line +1692 0A5F CD AC 0A CALL SETLIN ; Set up lines counter +1693 0A62 E1 LISTLP: POP HL ; Restore address of line +1694 0A63 4E LD C,(HL) ; Get LSB of next line +1695 0A64 23 INC HL +1696 0A65 46 LD B,(HL) ; Get MSB of next line +1697 0A66 23 INC HL +1698 0A67 78 LD A,B ; BC = 0 (End of program)? +1699 0A68 B1 OR C +1700 0A69 CA 8D 07 JP Z,PRNTOK ; Yes - Go to command mode +1701 0A6C CD B5 0A CALL COUNT ; Count lines +1702 0A6F CD C5 0B CALL TSTBRK ; Test for break key +1703 0A72 C5 PUSH BC ; Save address of next line +1704 0A73 CD 42 0E CALL PRNTCRLF ; Output CRLF +1705 0A76 5E LD E,(HL) ; Get LSB of line number +1706 0A77 23 INC HL +1707 0A78 56 LD D,(HL) ; Get MSB of line number +1708 0A79 23 INC HL +1709 0A7A E5 PUSH HL ; Save address of line start +1710 0A7B EB EX DE,HL ; Line number to HL +1711 0A7C CD 83 1B CALL PRNTHL ; Output line number in decimal +1712 0A7F 3E 20 LD A,' ' ; Space after line number +1713 0A81 E1 POP HL ; Restore start of line address +1714 0A82 CD 1B 0A LSTLP2: CALL OUTC ; Output character in A +1715 0A85 7E LSTLP3: LD A,(HL) ; Get next byte in line +1716 0A86 B7 OR A ; End of line? +1717 0A87 23 INC HL ; To next byte in line +1718 0A88 CA 62 0A JP Z,LISTLP ; Yes - get next line +1719 0A8B F2 82 0A JP P,LSTLP2 ; No token - output it +1720 0A8E D6 7F SUB ZEND-1 ; Find and output word +1721 0A90 4F LD C,A ; Token offset+1 to C +1722 0A91 11 CB 04 LD DE,WORDS ; Reserved word list +1723 0A94 1A FNDTOK: LD A,(DE) ; Get character in list +1724 0A95 13 INC DE ; Move on to next +1725 0A96 B7 OR A ; Is it start of word? +1726 0A97 F2 94 0A JP P,FNDTOK ; No - Keep looking for word +1727 0A9A 0D DEC C ; Count words +1728 0A9B C2 94 0A JP NZ,FNDTOK ; Not there - keep looking +1729 0A9E E6 7F OUTWRD: AND 01111111B ; Strip bit 7 +1730 0AA0 CD 1B 0A CALL OUTC ; Output first character +1731 0AA3 1A LD A,(DE) ; Get next character +1732 0AA4 13 INC DE ; Move on to next +1733 0AA5 B7 OR A ; Is it end of word? +1734 0AA6 F2 9E 0A JP P,OUTWRD ; No - output the rest +1735 0AA9 C3 85 0A JP LSTLP3 ; Next byte in line +1736 0AAC +1737 0AAC E5 SETLIN: PUSH HL ; Set up LINES counter +1738 0AAD 2A F8 30 LD HL,(LINESN) ; Get LINES number +1739 0AB0 22 F6 30 LD (LINESC),HL ; Save in LINES counter +1740 0AB3 E1 POP HL +1741 0AB4 C9 RET +1742 0AB5 +1743 0AB5 E5 COUNT: PUSH HL ; Save code string address +1744 0AB6 D5 PUSH DE +1745 0AB7 2A F6 30 LD HL,(LINESC) ; Get LINES counter +1746 0ABA 11 FF FF LD DE,-1 +1747 0ABD ED 5A ADC HL,DE ; Decrement +1748 0ABF 22 F6 30 LD (LINESC),HL ; Put it back +1749 0AC2 D1 POP DE +1750 0AC3 E1 POP HL ; Restore code string address +1751 0AC4 F0 RET P ; Return if more lines to go +1752 0AC5 E5 PUSH HL ; Save code string address +1753 0AC6 2A F8 30 LD HL,(LINESN) ; Get LINES number +1754 0AC9 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1755 0ACC CD 9F 1E CALL GETINP ; Get input character +1756 0ACF FE 03 CP CTRLC ; Is it control "C"? +1757 0AD1 CA D8 0A JP Z,RSLNBK ; Yes - Reset LINES and break +1758 0AD4 E1 POP HL ; Restore code string address +1759 0AD5 C3 B5 0A JP COUNT ; Keep on counting +1760 0AD8 +1761 0AD8 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number +1762 0ADB 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1763 0ADE C3 3C 04 JP BRKRET ; Go and output "Break" +1764 0AE1 +1765 0AE1 3E 64 FOR: LD A,64H ; Flag "FOR" assignment +1766 0AE3 32 7B 31 LD (FORFLG),A ; Save "FOR" flag +1767 0AE6 CD 48 0D CALL LET ; Set up initial index +1768 0AE9 C1 POP BC ; Drop RETurn address +1769 0AEA E5 PUSH HL ; Save code string address +1770 0AEB CD 31 0D CALL DATA ; Get next statement address +1771 0AEE 22 77 31 LD (LOOPST),HL ; Save it for start of loop +1772 0AF1 21 02 00 LD HL,2 ; Offset for "FOR" block +1773 0AF4 39 ADD HL,SP ; Point to it +1774 0AF5 CD EF 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block +1775 0AF8 D1 POP DE ; Get code string address +1776 0AF9 C2 11 0B JP NZ,FORFND ; No nesting found +1777 0AFC 09 ADD HL,BC ; Move into "FOR" block +1778 0AFD D5 PUSH DE ; Save code string address +1779 0AFE 2B DEC HL +1780 0AFF 56 LD D,(HL) ; Get MSB of loop statement +1781 0B00 2B DEC HL +1782 0B01 5E LD E,(HL) ; Get LSB of loop statement +1783 0B02 23 INC HL +1784 0B03 23 INC HL +1785 0B04 E5 PUSH HL ; Save block address +1786 0B05 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement +1787 0B08 CD 0A 0A CALL CPDEHL ; Compare the FOR loops +1788 0B0B E1 POP HL ; Restore block address +1789 0B0C C2 F5 0A JP NZ,FORSLP ; Different FORs - Find another +1790 0B0F D1 POP DE ; Restore code string address +1791 0B10 F9 LD SP,HL ; Remove all nested loops +1792 0B11 +1793 0B11 EB FORFND: EX DE,HL ; Code string address to HL +1794 0B12 0E 08 LD C,8 +1795 0B14 CD 1F 07 CALL CHKSTK ; Check for 8 levels of stack +1796 0B17 E5 PUSH HL ; Save code string address +1797 0B18 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop +1798 0B1B E3 EX (SP),HL ; Save and restore code string +1799 0B1C E5 PUSH HL ; Re-save code string address +1800 0B1D 2A 0C 31 LD HL,(LINEAT) ; Get current line number +1801 0B20 E3 EX (SP),HL ; Save and restore code string +1802 0B21 CD 0A 10 CALL TSTNUM ; Make sure it's a number +1803 0B24 CD 10 0A CALL CHKSYN ; Make sure "TO" is next +1804 0B27 A6 .BYTE ZTO ; "TO" token +1805 0B28 CD 07 10 CALL GETNUM ; Get "TO" expression value +1806 0B2B E5 PUSH HL ; Save code string address +1807 0B2C CD 35 1A CALL BCDEFP ; Move "TO" value to BCDE +1808 0B2F E1 POP HL ; Restore code string address +1809 0B30 C5 PUSH BC ; Save "TO" value in block +1810 0B31 D5 PUSH DE +1811 0B32 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) +1812 0B35 51 LD D,C ; C=0 +1813 0B36 5A LD E,D ; D=0 +1814 0B37 7E LD A,(HL) ; Get next byte in code string +1815 0B38 FE AB CP ZSTEP ; See if "STEP" is stated +1816 0B3A 3E 01 LD A,1 ; Sign of step = 1 +1817 0B3C C2 4D 0B JP NZ,SAVSTP ; No STEP given - Default to 1 +1818 0B3F CD 9A 0B CALL GETCHR ; Jump over "STEP" token +1819 0B42 CD 07 10 CALL GETNUM ; Get step value +1820 0B45 E5 PUSH HL ; Save code string address +1821 0B46 CD 35 1A CALL BCDEFP ; Move STEP to BCDE +1822 0B49 CD E9 19 CALL TSTSGN ; Test sign of FPREG +1823 0B4C E1 POP HL ; Restore code string address +1824 0B4D C5 SAVSTP: PUSH BC ; Save the STEP value in block +1825 0B4E D5 PUSH DE +1826 0B4F F5 PUSH AF ; Save sign of STEP +1827 0B50 33 INC SP ; Don't save flags +1828 0B51 E5 PUSH HL ; Save code string address +1829 0B52 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable +1830 0B55 E3 EX (SP),HL ; Save and restore code string +1831 0B56 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker +1832 0B58 C5 PUSH BC ; Save it +1833 0B59 33 INC SP ; Don't save C +1834 0B5A +1835 0B5A CD C5 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break +1836 0B5D 22 7E 31 LD (BRKLIN),HL ; Save code address for break +1837 0B60 7E LD A,(HL) ; Get next byte in code string +1838 0B61 FE 3A CP ':' ; Multi statement line? +1839 0B63 CA 7A 0B JP Z,EXCUTE ; Yes - Execute it +1840 0B66 B7 OR A ; End of line? +1841 0B67 C2 42 07 JP NZ,SNERR ; No - Syntax error +1842 0B6A 23 INC HL ; Point to address of next line +1843 0B6B 7E LD A,(HL) ; Get LSB of line pointer +1844 0B6C 23 INC HL +1845 0B6D B6 OR (HL) ; Is it zero (End of prog)? +1846 0B6E CA EC 0B JP Z,ENDPRG ; Yes - Terminate execution +1847 0B71 23 INC HL ; Point to line number +1848 0B72 5E LD E,(HL) ; Get LSB of line number +1849 0B73 23 INC HL +1850 0B74 56 LD D,(HL) ; Get MSB of line number +1851 0B75 EB EX DE,HL ; Line number to HL +1852 0B76 22 0C 31 LD (LINEAT),HL ; Save as current line number +1853 0B79 EB EX DE,HL ; Line number back to DE +1854 0B7A CD 9A 0B EXCUTE: CALL GETCHR ; Get key word +1855 0B7D 11 5A 0B LD DE,RUNCNT ; Where to RETurn to +1856 0B80 D5 PUSH DE ; Save for RETurn +1857 0B81 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT +1858 0B82 D6 80 ONJMP: SUB ZEND ; Is it a token? +1859 0B84 DA 48 0D JP C,LET ; No - try to assign it +1860 0B87 FE 25 CP ZNEW+1-ZEND ; END to NEW ? +1861 0B89 D2 42 07 JP NC,SNERR ; Not a key word - ?SN Error +1862 0B8C 07 RLCA ; Double it +1863 0B8D 4F LD C,A ; BC = Offset into table +1864 0B8E 06 00 LD B,0 +1865 0B90 EB EX DE,HL ; Save code string address +1866 0B91 21 EA 05 LD HL,WORDTB ; Keyword address table +1867 0B94 09 ADD HL,BC ; Point to routine address +1868 0B95 4E LD C,(HL) ; Get LSB of routine address +1869 0B96 23 INC HL +1870 0B97 46 LD B,(HL) ; Get MSB of routine address +1871 0B98 C5 PUSH BC ; Save routine address +1872 0B99 EB EX DE,HL ; Restore code string address +1873 0B9A +1874 0B9A 23 GETCHR: INC HL ; Point to next character +1875 0B9B 7E LD A,(HL) ; Get next code string byte +1876 0B9C FE 3A CP ':' ; Z if ':' +1877 0B9E D0 RET NC ; NC if > "9" +1878 0B9F FE 20 CP ' ' +1879 0BA1 CA 9A 0B JP Z,GETCHR ; Skip over spaces +1880 0BA4 FE 30 CP '0' +1881 0BA6 3F CCF ; NC if < '0' +1882 0BA7 3C INC A ; Test for zero - Leave carry +1883 0BA8 3D DEC A ; Z if Null +1884 0BA9 C9 RET +1885 0BAA +1886 0BAA EB RESTOR: EX DE,HL ; Save code string address +1887 0BAB 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1888 0BAE CA BF 0B JP Z,RESTNL ; Just RESTORE - reset pointer +1889 0BB1 EB EX DE,HL ; Restore code string address +1890 0BB2 CD 66 0C CALL ATOH ; Get line number to DE +1891 0BB5 E5 PUSH HL ; Save code string address +1892 0BB6 CD 2E 08 CALL SRCHLN ; Search for line number in DE +1893 0BB9 60 LD H,B ; HL = Address of line +1894 0BBA 69 LD L,C +1895 0BBB D1 POP DE ; Restore code string address +1896 0BBC D2 07 0D JP NC,ULERR ; ?UL Error if not found +1897 0BBF 2B RESTNL: DEC HL ; Byte before DATA statement +1898 0BC0 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer +1899 0BC3 EB EX DE,HL ; Restore code string address +1900 0BC4 C9 RET +1901 0BC5 +1902 0BC5 +1903 0BC5 DF TSTBRK: RST 18H ; Check input status +1904 0BC6 C8 RET Z ; No key, go back +1905 0BC7 D7 RST 10H ; Get the key into A +1906 0BC8 FE 1B CP ESC ; Escape key? +1907 0BCA 28 11 JR Z,BRK ; Yes, break +1908 0BCC FE 03 CP CTRLC ; +1909 0BCE 28 0D JR Z,BRK ; Yes, break +1910 0BD0 FE 13 CP CTRLS ; Stop scrolling? +1911 0BD2 C0 RET NZ ; Other key, ignore +1912 0BD3 +1913 0BD3 +1914 0BD3 D7 STALL: RST 10H ; Wait for key +1915 0BD4 FE 11 CP CTRLQ ; Resume scrolling? +1916 0BD6 C8 RET Z ; Release the chokehold +1917 0BD7 FE 03 CP CTRLC ; Second break? +1918 0BD9 28 07 JR Z,STOP ; Break during hold exits prog +1919 0BDB 18 F6 JR STALL ; Loop until or +1920 0BDD +1921 0BDD 3E FF BRK LD A,$FF ; Set BRKFLG +1922 0BDF 32 FD 30 LD (BRKFLG),A ; Store it +1923 0BE2 +1924 0BE2 +1925 0BE2 C0 STOP: RET NZ ; Exit if anything else +1926 0BE3 F6 .BYTE 0F6H ; Flag "STOP" +1927 0BE4 C0 PEND: RET NZ ; Exit if anything else +1928 0BE5 22 7E 31 LD (BRKLIN),HL ; Save point of break +1929 0BE8 21 .BYTE 21H ; Skip "OR 11111111B" +1930 0BE9 F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted +1931 0BEB C1 POP BC ; Return not needed and more +1932 0BEC 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number +1933 0BEF F5 PUSH AF ; Save STOP / END status +1934 0BF0 7D LD A,L ; Is it direct break? +1935 0BF1 A4 AND H +1936 0BF2 3C INC A ; Line is -1 if direct break +1937 0BF3 CA FF 0B JP Z,NOLIN ; Yes - No line number +1938 0BF6 22 82 31 LD (ERRLIN),HL ; Save line of break +1939 0BF9 2A 7E 31 LD HL,(BRKLIN) ; Get point of break +1940 0BFC 22 84 31 LD (CONTAD),HL ; Save point to CONTinue +1941 0BFF AF NOLIN: XOR A +1942 0C00 32 F5 30 LD (CTLOFG),A ; Enable output +1943 0C03 CD 35 0E CALL STTLIN ; Start a new line +1944 0C06 F1 POP AF ; Restore STOP / END status +1945 0C07 21 E5 06 LD HL,BRKMSG ; "Break" message +1946 0C0A C2 76 07 JP NZ,ERRIN ; "in line" wanted? +1947 0C0D C3 8D 07 JP PRNTOK ; Go to command mode +1948 0C10 +1949 0C10 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address +1950 0C13 7C LD A,H ; Is it zero? +1951 0C14 B5 OR L +1952 0C15 1E 20 LD E,CN ; ?CN Error +1953 0C17 CA 56 07 JP Z,ERROR ; Yes - output "?CN Error" +1954 0C1A EB EX DE,HL ; Save code string address +1955 0C1B 2A 82 31 LD HL,(ERRLIN) ; Get line of last break +1956 0C1E 22 0C 31 LD (LINEAT),HL ; Set up current line number +1957 0C21 EB EX DE,HL ; Restore code string address +1958 0C22 C9 RET ; CONTinue where left off +1959 0C23 +1960 0C23 CD 68 17 NULL: CALL GETINT ; Get integer 0-255 +1961 0C26 C0 RET NZ ; Return if bad value +1962 0C27 32 F1 30 LD (NULLS),A ; Set nulls number +1963 0C2A C9 RET +1964 0C2B +1965 0C2B +1966 0C2B E5 ACCSUM: PUSH HL ; Save address in array +1967 0C2C 2A FA 30 LD HL,(CHKSUM) ; Get check sum +1968 0C2F 06 00 LD B,0 ; BC - Value of byte +1969 0C31 4F LD C,A +1970 0C32 09 ADD HL,BC ; Add byte to check sum +1971 0C33 22 FA 30 LD (CHKSUM),HL ; Re-save check sum +1972 0C36 E1 POP HL ; Restore address in array +1973 0C37 C9 RET +1974 0C38 +1975 0C38 7E CHKLTR: LD A,(HL) ; Get byte +1976 0C39 FE 41 CP 'A' ; < 'a' ? +1977 0C3B D8 RET C ; Carry set if not letter +1978 0C3C FE 5B CP 'Z'+1 ; > 'z' ? +1979 0C3E 3F CCF +1980 0C3F C9 RET ; Carry set if not letter +1981 0C40 +1982 0C40 CD 9A 0B FPSINT: CALL GETCHR ; Get next character +1983 0C43 CD 07 10 POSINT: CALL GETNUM ; Get integer 0 to 32767 +1984 0C46 CD E9 19 DEPINT: CALL TSTSGN ; Test sign of FPREG +1985 0C49 FA 61 0C JP M,FCERR ; Negative - ?FC Error +1986 0C4C 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE +1987 0C4F FE 90 CP 80H+16 ; Exponent in range (16 bits)? +1988 0C51 DA 91 1A JP C,FPINT ; Yes - convert it +1989 0C54 01 80 90 LD BC,9080H ; BCDE = -32768 +1990 0C57 11 00 00 LD DE,0000 +1991 0C5A E5 PUSH HL ; Save code string address +1992 0C5B CD 64 1A CALL CMPNUM ; Compare FPREG with BCDE +1993 0C5E E1 POP HL ; Restore code string address +1994 0C5F 51 LD D,C ; MSB to D +1995 0C60 C8 RET Z ; Return if in range +1996 0C61 1E 08 FCERR: LD E,FC ; ?FC Error +1997 0C63 C3 56 07 JP ERROR ; Output error- +1998 0C66 +1999 0C66 2B ATOH: DEC HL ; ASCII number to DE binary +2000 0C67 11 00 00 GETLN: LD DE,0 ; Get number to DE +2001 0C6A CD 9A 0B GTLNLP: CALL GETCHR ; Get next character +2002 0C6D D0 RET NC ; Exit if not a digit +2003 0C6E E5 PUSH HL ; Save code string address +2004 0C6F F5 PUSH AF ; Save digit +2005 0C70 21 98 19 LD HL,65529/10 ; Largest number 65529 +2006 0C73 CD 0A 0A CALL CPDEHL ; Number in range? +2007 0C76 DA 42 07 JP C,SNERR ; No - ?SN Error +2008 0C79 62 LD H,D ; HL = Number +2009 0C7A 6B LD L,E +2010 0C7B 19 ADD HL,DE ; Times 2 +2011 0C7C 29 ADD HL,HL ; Times 4 +2012 0C7D 19 ADD HL,DE ; Times 5 +2013 0C7E 29 ADD HL,HL ; Times 10 +2014 0C7F F1 POP AF ; Restore digit +2015 0C80 D6 30 SUB '0' ; Make it 0 to 9 +2016 0C82 5F LD E,A ; DE = Value of digit +2017 0C83 16 00 LD D,0 +2018 0C85 19 ADD HL,DE ; Add to number +2019 0C86 EB EX DE,HL ; Number to DE +2020 0C87 E1 POP HL ; Restore code string address +2021 0C88 C3 6A 0C JP GTLNLP ; Go to next character +2022 0C8B +2023 0C8B CA 5E 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters +2024 0C8E CD 43 0C CALL POSINT ; Get integer 0 to 32767 to DE +2025 0C91 2B DEC HL ; Cancel increment +2026 0C92 CD 9A 0B CALL GETCHR ; Get next character +2027 0C95 E5 PUSH HL ; Save code string address +2028 0C96 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +2029 0C99 CA AE 0C JP Z,STORED ; No value given - Use stored +2030 0C9C E1 POP HL ; Restore code string address +2031 0C9D CD 10 0A CALL CHKSYN ; Check for comma +2032 0CA0 2C .BYTE ',' +2033 0CA1 D5 PUSH DE ; Save number +2034 0CA2 CD 43 0C CALL POSINT ; Get integer 0 to 32767 +2035 0CA5 2B DEC HL ; Cancel increment +2036 0CA6 CD 9A 0B CALL GETCHR ; Get next character +2037 0CA9 C2 42 07 JP NZ,SNERR ; ?SN Error if more on line +2038 0CAC E3 EX (SP),HL ; Save code string address +2039 0CAD EB EX DE,HL ; Number to DE +2040 0CAE 7D STORED: LD A,L ; Get LSB of new RAM top +2041 0CAF 93 SUB E ; Subtract LSB of string space +2042 0CB0 5F LD E,A ; Save LSB +2043 0CB1 7C LD A,H ; Get MSB of new RAM top +2044 0CB2 9A SBC A,D ; Subtract MSB of string space +2045 0CB3 57 LD D,A ; Save MSB +2046 0CB4 DA 37 07 JP C,OMERR ; ?OM Error if not enough mem +2047 0CB7 E5 PUSH HL ; Save RAM top +2048 0CB8 2A 86 31 LD HL,(PROGND) ; Get program end +2049 0CBB 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM +2050 0CBE 09 ADD HL,BC ; Get lowest address +2051 0CBF CD 0A 0A CALL CPDEHL ; Enough memory? +2052 0CC2 D2 37 07 JP NC,OMERR ; No - ?OM Error +2053 0CC5 EB EX DE,HL ; RAM top to HL +2054 0CC6 22 0A 31 LD (STRSPC),HL ; Set new string space +2055 0CC9 E1 POP HL ; End of memory to use +2056 0CCA 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM +2057 0CCD E1 POP HL ; Restore code string address +2058 0CCE C3 5E 08 JP INTVAR ; Initialise variables +2059 0CD1 +2060 0CD1 CA 5A 08 RUN: JP Z,RUNFST ; RUN from start if just RUN +2061 0CD4 CD 5E 08 CALL INTVAR ; Initialise variables +2062 0CD7 01 5A 0B LD BC,RUNCNT ; Execution driver loop +2063 0CDA C3 ED 0C JP RUNLIN ; RUN from line number +2064 0CDD +2065 0CDD 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed +2066 0CDF CD 1F 07 CALL CHKSTK ; Check for 3 levels of stack +2067 0CE2 C1 POP BC ; Get return address +2068 0CE3 E5 PUSH HL ; Save code string for RETURN +2069 0CE4 E5 PUSH HL ; And for GOSUB routine +2070 0CE5 2A 0C 31 LD HL,(LINEAT) ; Get current line +2071 0CE8 E3 EX (SP),HL ; Into stack - Code string out +2072 0CE9 3E 8C LD A,ZGOSUB ; "GOSUB" token +2073 0CEB F5 PUSH AF ; Save token +2074 0CEC 33 INC SP ; Don't save flags +2075 0CED +2076 0CED C5 RUNLIN: PUSH BC ; Save return address +2077 0CEE CD 66 0C GOTO: CALL ATOH ; ASCII number to DE binary +2078 0CF1 CD 33 0D CALL REM ; Get end of line +2079 0CF4 E5 PUSH HL ; Save end of line +2080 0CF5 2A 0C 31 LD HL,(LINEAT) ; Get current line +2081 0CF8 CD 0A 0A CALL CPDEHL ; Line after current? +2082 0CFB E1 POP HL ; Restore end of line +2083 0CFC 23 INC HL ; Start of next line +2084 0CFD DC 31 08 CALL C,SRCHLP ; Line is after current line +2085 0D00 D4 2E 08 CALL NC,SRCHLN ; Line is before current line +2086 0D03 60 LD H,B ; Set up code string address +2087 0D04 69 LD L,C +2088 0D05 2B DEC HL ; Incremented after +2089 0D06 D8 RET C ; Line found +2090 0D07 1E 0E ULERR: LD E,UL ; ?UL Error +2091 0D09 C3 56 07 JP ERROR ; Output error message +2092 0D0C +2093 0D0C C0 RETURN: RET NZ ; Return if not just RETURN +2094 0D0D 16 FF LD D,-1 ; Flag "GOSUB" search +2095 0D0F CD EB 06 CALL BAKSTK ; Look "GOSUB" block +2096 0D12 F9 LD SP,HL ; Kill all FORs in subroutine +2097 0D13 FE 8C CP ZGOSUB ; Test for "GOSUB" token +2098 0D15 1E 04 LD E,RG ; ?RG Error +2099 0D17 C2 56 07 JP NZ,ERROR ; Error if no "GOSUB" found +2100 0D1A E1 POP HL ; Get RETURN line number +2101 0D1B 22 0C 31 LD (LINEAT),HL ; Save as current +2102 0D1E 23 INC HL ; Was it from direct statement? +2103 0D1F 7C LD A,H +2104 0D20 B5 OR L ; Return to line +2105 0D21 C2 2B 0D JP NZ,RETLIN ; No - Return to line +2106 0D24 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? +2107 0D27 B7 OR A ; If so buffer is corrupted +2108 0D28 C2 8C 07 JP NZ,POPNOK ; Yes - Go to command mode +2109 0D2B 21 5A 0B RETLIN: LD HL,RUNCNT ; Execution driver loop +2110 0D2E E3 EX (SP),HL ; Into stack - Code string out +2111 0D2F 3E .BYTE 3EH ; Skip "POP HL" +2112 0D30 E1 NXTDTA: POP HL ; Restore code string address +2113 0D31 +2114 0D31 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement +2115 0D33 0E 00 REM: LD C,0 ; 00 End of statement +2116 0D35 06 00 LD B,0 +2117 0D37 79 NXTSTL: LD A,C ; Statement and byte +2118 0D38 48 LD C,B +2119 0D39 47 LD B,A ; Statement end byte +2120 0D3A 7E NXTSTT: LD A,(HL) ; Get byte +2121 0D3B B7 OR A ; End of line? +2122 0D3C C8 RET Z ; Yes - Exit +2123 0D3D B8 CP B ; End of statement? +2124 0D3E C8 RET Z ; Yes - Exit +2125 0D3F 23 INC HL ; Next byte +2126 0D40 FE 22 CP '"' ; Literal string? +2127 0D42 CA 37 0D JP Z,NXTSTL ; Yes - Look for another '"' +2128 0D45 C3 3A 0D JP NXTSTT ; Keep looking +2129 0D48 +2130 0D48 CD FD 11 LET: CALL GETVAR ; Get variable name +2131 0D4B CD 10 0A CALL CHKSYN ; Make sure "=" follows +2132 0D4E B4 .BYTE ZEQUAL ; "=" token +2133 0D4F D5 PUSH DE ; Save address of variable +2134 0D50 3A 5D 31 LD A,(TYPE) ; Get data type +2135 0D53 F5 PUSH AF ; Save type +2136 0D54 CD 19 10 CALL EVAL ; Evaluate expression +2137 0D57 F1 POP AF ; Restore type +2138 0D58 E3 EX (SP),HL ; Save code - Get var addr +2139 0D59 22 7E 31 LD (BRKLIN),HL ; Save address of variable +2140 0D5C 1F RRA ; Adjust type +2141 0D5D CD 0C 10 CALL CHKTYP ; Check types are the same +2142 0D60 CA 9B 0D JP Z,LETNUM ; Numeric - Move value +2143 0D63 E5 LETSTR: PUSH HL ; Save address of string var +2144 0D64 2A 94 31 LD HL,(FPREG) ; Pointer to string entry +2145 0D67 E5 PUSH HL ; Save it on stack +2146 0D68 23 INC HL ; Skip over length +2147 0D69 23 INC HL +2148 0D6A 5E LD E,(HL) ; LSB of string address +2149 0D6B 23 INC HL +2150 0D6C 56 LD D,(HL) ; MSB of string address +2151 0D6D 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +2152 0D70 CD 0A 0A CALL CPDEHL ; Is string before program? +2153 0D73 D2 8A 0D JP NC,CRESTR ; Yes - Create string entry +2154 0D76 2A 0A 31 LD HL,(STRSPC) ; Point to string space +2155 0D79 CD 0A 0A CALL CPDEHL ; Is string literal in program? +2156 0D7C D1 POP DE ; Restore address of string +2157 0D7D D2 92 0D JP NC,MVSTPT ; Yes - Set up pointer +2158 0D80 21 6F 31 LD HL,TMPSTR ; Temporary string pool +2159 0D83 CD 0A 0A CALL CPDEHL ; Is string in temporary pool? +2160 0D86 D2 92 0D JP NC,MVSTPT ; No - Set up pointer +2161 0D89 3E .BYTE 3EH ; Skip "POP DE" +2162 0D8A D1 CRESTR: POP DE ; Restore address of string +2163 0D8B CD 41 16 CALL BAKTMP ; Back to last tmp-str entry +2164 0D8E EB EX DE,HL ; Address of string entry +2165 0D8F CD 7A 14 CALL SAVSTR ; Save string in string area +2166 0D92 CD 41 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry +2167 0D95 E1 POP HL ; Get string pointer +2168 0D96 CD 44 1A CALL DETHL4 ; Move string pointer to var +2169 0D99 E1 POP HL ; Restore code string address +2170 0D9A C9 RET +2171 0D9B +2172 0D9B E5 LETNUM: PUSH HL ; Save address of variable +2173 0D9C CD 41 1A CALL FPTHL ; Move value to variable +2174 0D9F D1 POP DE ; Restore address of variable +2175 0DA0 E1 POP HL ; Restore code string address +2176 0DA1 C9 RET +2177 0DA2 +2178 0DA2 CD 68 17 ON: CALL GETINT ; Get integer 0-255 +2179 0DA5 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token +2180 0DA6 47 LD B,A ; Save in B +2181 0DA7 FE 8C CP ZGOSUB ; "GOSUB" token? +2182 0DA9 CA B1 0D JP Z,ONGO ; Yes - Find line number +2183 0DAC CD 10 0A CALL CHKSYN ; Make sure it's "GOTO" +2184 0DAF 88 .BYTE ZGOTO ; "GOTO" token +2185 0DB0 2B DEC HL ; Cancel increment +2186 0DB1 4B ONGO: LD C,E ; Integer of branch value +2187 0DB2 0D ONGOLP: DEC C ; Count branches +2188 0DB3 78 LD A,B ; Get "GOTO" or "GOSUB" token +2189 0DB4 CA 82 0B JP Z,ONJMP ; Go to that line if right one +2190 0DB7 CD 67 0C CALL GETLN ; Get line number to DE +2191 0DBA FE 2C CP ',' ; Another line number? +2192 0DBC C0 RET NZ ; No - Drop through +2193 0DBD C3 B2 0D JP ONGOLP ; Yes - loop +2194 0DC0 +2195 0DC0 CD 19 10 IF: CALL EVAL ; Evaluate expression +2196 0DC3 7E LD A,(HL) ; Get token +2197 0DC4 FE 88 CP ZGOTO ; "GOTO" token? +2198 0DC6 CA CE 0D JP Z,IFGO ; Yes - Get line +2199 0DC9 CD 10 0A CALL CHKSYN ; Make sure it's "THEN" +2200 0DCC A9 .BYTE ZTHEN ; "THEN" token +2201 0DCD 2B DEC HL ; Cancel increment +2202 0DCE CD 0A 10 IFGO: CALL TSTNUM ; Make sure it's numeric +2203 0DD1 CD E9 19 CALL TSTSGN ; Test state of expression +2204 0DD4 CA 33 0D JP Z,REM ; False - Drop through +2205 0DD7 CD 9A 0B CALL GETCHR ; Get next character +2206 0DDA DA EE 0C JP C,GOTO ; Number - GOTO that line +2207 0DDD C3 81 0B JP IFJMP ; Otherwise do statement +2208 0DE0 +2209 0DE0 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs +2210 0DE1 CD 9A 0B CALL GETCHR ; Get next character +2211 0DE4 CA 42 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT +2212 0DE7 C8 PRNTLP: RET Z ; End of list - Exit +2213 0DE8 FE A5 CP ZTAB ; "TAB(" token? +2214 0DEA CA 75 0E JP Z,DOTAB ; Yes - Do TAB routine +2215 0DED FE A8 CP ZSPC ; "SPC(" token? +2216 0DEF CA 75 0E JP Z,DOTAB ; Yes - Do SPC routine +2217 0DF2 E5 PUSH HL ; Save code string address +2218 0DF3 FE 2C CP ',' ; Comma? +2219 0DF5 CA 5E 0E JP Z,DOCOM ; Yes - Move to next zone +2220 0DF8 FE 3B CP 59 ;";" ; Semi-colon? +2221 0DFA CA 98 0E JP Z,NEXITM ; Do semi-colon routine +2222 0DFD C1 POP BC ; Code string address to BC +2223 0DFE CD 19 10 CALL EVAL ; Evaluate expression +2224 0E01 E5 PUSH HL ; Save code string address +2225 0E02 3A 5D 31 LD A,(TYPE) ; Get variable type +2226 0E05 B7 OR A ; Is it a string variable? +2227 0E06 C2 2E 0E JP NZ,PRNTST ; Yes - Output string contents +2228 0E09 CD 8E 1B CALL NUMASC ; Convert number to text +2229 0E0C CD 9E 14 CALL CRTST ; Create temporary string +2230 0E0F 36 20 LD (HL),' ' ; Followed by a space +2231 0E11 2A 94 31 LD HL,(FPREG) ; Get length of output +2232 0E14 34 INC (HL) ; Plus 1 for the space +2233 0E15 2A 94 31 LD HL,(FPREG) ; < Not needed > +2234 0E18 3A F2 30 LD A,(LWIDTH) ; Get width of line +2235 0E1B 47 LD B,A ; To B +2236 0E1C 04 INC B ; Width 255 (No limit)? +2237 0E1D CA 2A 0E JP Z,PRNTNB ; Yes - Output number string +2238 0E20 04 INC B ; Adjust it +2239 0E21 3A 5B 31 LD A,(CURPOS) ; Get cursor position +2240 0E24 86 ADD A,(HL) ; Add length of string +2241 0E25 3D DEC A ; Adjust it +2242 0E26 B8 CP B ; Will output fit on this line? +2243 0E27 D4 42 0E CALL NC,PRNTCRLF ; No - CRLF first +2244 0E2A CD E3 14 PRNTNB: CALL PRS1 ; Output string at (HL) +2245 0E2D AF XOR A ; Skip CALL by setting 'z' flag +2246 0E2E C4 E3 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) +2247 0E31 E1 POP HL ; Restore code string address +2248 0E32 C3 E0 0D JP MRPRNT ; See if more to PRINT +2249 0E35 +2250 0E35 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line +2251 0E38 B7 OR A ; Already at start? +2252 0E39 C8 RET Z ; Yes - Do nothing +2253 0E3A C3 42 0E JP PRNTCRLF ; Start a new line +2254 0E3D +2255 0E3D 36 00 ENDINP: LD (HL),0 ; Mark end of buffer +2256 0E3F 21 10 31 LD HL,BUFFER-1 ; Point to buffer +2257 0E42 3E 0D PRNTCRLF: LD A,CR ; Load a CR +2258 0E44 CD 1B 0A CALL OUTC ; Output character +2259 0E47 3E 0A LD A,LF ; Load a LF +2260 0E49 CD 1B 0A CALL OUTC ; Output character +2261 0E4C AF DONULL: XOR A ; Set to position 0 +2262 0E4D 32 5B 31 LD (CURPOS),A ; Store it +2263 0E50 3A F1 30 LD A,(NULLS) ; Get number of nulls +2264 0E53 3D NULLP: DEC A ; Count them +2265 0E54 C8 RET Z ; Return if done +2266 0E55 F5 PUSH AF ; Save count +2267 0E56 AF XOR A ; Load a null +2268 0E57 CD 1B 0A CALL OUTC ; Output it +2269 0E5A F1 POP AF ; Restore count +2270 0E5B C3 53 0E JP NULLP ; Keep counting +2271 0E5E +2272 0E5E 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width +2273 0E61 47 LD B,A ; Save in B +2274 0E62 3A 5B 31 LD A,(CURPOS) ; Get current position +2275 0E65 B8 CP B ; Within the limit? +2276 0E66 D4 42 0E CALL NC,PRNTCRLF ; No - output CRLF +2277 0E69 D2 98 0E JP NC,NEXITM ; Get next item +2278 0E6C D6 0E ZONELP: SUB 14 ; Next zone of 14 characters +2279 0E6E D2 6C 0E JP NC,ZONELP ; Repeat if more zones +2280 0E71 2F CPL ; Number of spaces to output +2281 0E72 C3 8D 0E JP ASPCS ; Output them +2282 0E75 +2283 0E75 F5 DOTAB: PUSH AF ; Save token +2284 0E76 CD 65 17 CALL FNDNUM ; Evaluate expression +2285 0E79 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2286 0E7C 29 .BYTE ")" +2287 0E7D 2B DEC HL ; Back space on to ")" +2288 0E7E F1 POP AF ; Restore token +2289 0E7F D6 A8 SUB ZSPC ; Was it "SPC(" ? +2290 0E81 E5 PUSH HL ; Save code string address +2291 0E82 CA 88 0E JP Z,DOSPC ; Yes - Do 'E' spaces +2292 0E85 3A 5B 31 LD A,(CURPOS) ; Get current position +2293 0E88 2F DOSPC: CPL ; Number of spaces to print to +2294 0E89 83 ADD A,E ; Total number to print +2295 0E8A D2 98 0E JP NC,NEXITM ; TAB < Current POS(X) +2296 0E8D 3C ASPCS: INC A ; Output A spaces +2297 0E8E 47 LD B,A ; Save number to print +2298 0E8F 3E 20 LD A,' ' ; Space +2299 0E91 CD 1B 0A SPCLP: CALL OUTC ; Output character in A +2300 0E94 05 DEC B ; Count them +2301 0E95 C2 91 0E JP NZ,SPCLP ; Repeat if more +2302 0E98 E1 NEXITM: POP HL ; Restore code string address +2303 0E99 CD 9A 0B CALL GETCHR ; Get next character +2304 0E9C C3 E7 0D JP PRNTLP ; More to print +2305 0E9F +2306 0E9F 3F 52 65 64 REDO: .BYTE "?Redo from start",CR,LF,0 +2306 0EA3 6F 20 66 72 +2306 0EA7 6F 6D 20 73 +2306 0EAB 74 61 72 74 +2306 0EAF 0D 0A 00 +2307 0EB2 +2308 0EB2 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? +2309 0EB5 B7 OR A +2310 0EB6 C2 3C 07 JP NZ,DATSNR ; READ - ?SN Error +2311 0EB9 C1 POP BC ; Throw away code string addr +2312 0EBA 21 9F 0E LD HL,REDO ; "Redo from start" message +2313 0EBD CD E0 14 CALL PRS ; Output string +2314 0EC0 C3 8D 08 JP DOAGN ; Do last INPUT again +2315 0EC3 +2316 0EC3 CD 4B 14 INPUT: CALL IDTEST ; Test for illegal direct +2317 0EC6 7E LD A,(HL) ; Get character after "INPUT" +2318 0EC7 FE 22 CP '"' ; Is there a prompt string? +2319 0EC9 3E 00 LD A,0 ; Clear A and leave flags +2320 0ECB 32 F5 30 LD (CTLOFG),A ; Enable output +2321 0ECE C2 DD 0E JP NZ,NOPMPT ; No prompt - get input +2322 0ED1 CD 9F 14 CALL QTSTR ; Get string terminated by '"' +2323 0ED4 CD 10 0A CALL CHKSYN ; Check for ';' after prompt +2324 0ED7 3B .BYTE ';' +2325 0ED8 E5 PUSH HL ; Save code string address +2326 0ED9 CD E3 14 CALL PRS1 ; Output prompt string +2327 0EDC 3E .BYTE 3EH ; Skip "PUSH HL" +2328 0EDD E5 NOPMPT: PUSH HL ; Save code string address +2329 0EDE CD 91 08 CALL PROMPT ; Get input with "? " prompt +2330 0EE1 C1 POP BC ; Restore code string address +2331 0EE2 DA E9 0B JP C,INPBRK ; Break pressed - Exit +2332 0EE5 23 INC HL ; Next byte +2333 0EE6 7E LD A,(HL) ; Get it +2334 0EE7 B7 OR A ; End of line? +2335 0EE8 2B DEC HL ; Back again +2336 0EE9 C5 PUSH BC ; Re-save code string address +2337 0EEA CA 30 0D JP Z,NXTDTA ; Yes - Find next DATA stmt +2338 0EED 36 2C LD (HL),',' ; Store comma as separator +2339 0EEF C3 F7 0E JP NXTITM ; Get next item +2340 0EF2 +2341 0EF2 E5 READ: PUSH HL ; Save code string address +2342 0EF3 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement +2343 0EF6 F6 .BYTE 0F6H ; Flag "READ" +2344 0EF7 AF NXTITM: XOR A ; Flag "INPUT" +2345 0EF8 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag +2346 0EFB E3 EX (SP),HL ; Get code str' , Save pointer +2347 0EFC C3 03 0F JP GTVLUS ; Get values +2348 0EFF +2349 0EFF CD 10 0A NEDMOR: CALL CHKSYN ; Check for comma between items +2350 0F02 2C .BYTE ',' +2351 0F03 CD FD 11 GTVLUS: CALL GETVAR ; Get variable name +2352 0F06 E3 EX (SP),HL ; Save code str" , Get pointer +2353 0F07 D5 PUSH DE ; Save variable address +2354 0F08 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte +2355 0F09 FE 2C CP ',' ; Comma? +2356 0F0B CA 2B 0F JP Z,ANTVLU ; Yes - Get another value +2357 0F0E 3A 7D 31 LD A,(READFG) ; Is it READ? +2358 0F11 B7 OR A +2359 0F12 C2 98 0F JP NZ,FDTLP ; Yes - Find next DATA stmt +2360 0F15 3E 3F LD A,'?' ; More INPUT needed +2361 0F17 CD 1B 0A CALL OUTC ; Output character +2362 0F1A CD 91 08 CALL PROMPT ; Get INPUT with prompt +2363 0F1D D1 POP DE ; Variable address +2364 0F1E C1 POP BC ; Code string address +2365 0F1F DA E9 0B JP C,INPBRK ; Break pressed +2366 0F22 23 INC HL ; Point to next DATA byte +2367 0F23 7E LD A,(HL) ; Get byte +2368 0F24 B7 OR A ; Is it zero (No input) ? +2369 0F25 2B DEC HL ; Back space INPUT pointer +2370 0F26 C5 PUSH BC ; Save code string address +2371 0F27 CA 30 0D JP Z,NXTDTA ; Find end of buffer +2372 0F2A D5 PUSH DE ; Save variable address +2373 0F2B 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type +2374 0F2E B7 OR A ; Is it numeric? +2375 0F2F CA 55 0F JP Z,INPBIN ; Yes - Convert to binary +2376 0F32 CD 9A 0B CALL GETCHR ; Get next character +2377 0F35 57 LD D,A ; Save input character +2378 0F36 47 LD B,A ; Again +2379 0F37 FE 22 CP '"' ; Start of literal sting? +2380 0F39 CA 49 0F JP Z,STRENT ; Yes - Create string entry +2381 0F3C 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +2382 0F3F B7 OR A +2383 0F40 57 LD D,A ; Save 00 if "INPUT" +2384 0F41 CA 46 0F JP Z,ITMSEP ; "INPUT" - End with 00 +2385 0F44 16 3A LD D,':' ; "DATA" - End with 00 or ':' +2386 0F46 06 2C ITMSEP: LD B,',' ; Item separator +2387 0F48 2B DEC HL ; Back space for DTSTR +2388 0F49 CD A2 14 STRENT: CALL DTSTR ; Get string terminated by D +2389 0F4C EB EX DE,HL ; String address to DE +2390 0F4D 21 60 0F LD HL,LTSTND ; Where to go after LETSTR +2391 0F50 E3 EX (SP),HL ; Save HL , get input pointer +2392 0F51 D5 PUSH DE ; Save address of string +2393 0F52 C3 63 0D JP LETSTR ; Assign string to variable +2394 0F55 +2395 0F55 CD 9A 0B INPBIN: CALL GETCHR ; Get next character +2396 0F58 CD F0 1A CALL ASCTFP ; Convert ASCII to FP number +2397 0F5B E3 EX (SP),HL ; Save input ptr, Get var addr +2398 0F5C CD 41 1A CALL FPTHL ; Move FPREG to variable +2399 0F5F E1 POP HL ; Restore input pointer +2400 0F60 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs +2401 0F61 CD 9A 0B CALL GETCHR ; Get next character +2402 0F64 CA 6C 0F JP Z,MORDT ; End of line - More needed? +2403 0F67 FE 2C CP ',' ; Another value? +2404 0F69 C2 B2 0E JP NZ,BADINP ; No - Bad input +2405 0F6C E3 MORDT: EX (SP),HL ; Get code string address +2406 0F6D 2B DEC HL ; DEC 'cos GETCHR INCs +2407 0F6E CD 9A 0B CALL GETCHR ; Get next character +2408 0F71 C2 FF 0E JP NZ,NEDMOR ; More needed - Get it +2409 0F74 D1 POP DE ; Restore DATA pointer +2410 0F75 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +2411 0F78 B7 OR A +2412 0F79 EB EX DE,HL ; DATA pointer to HL +2413 0F7A C2 C0 0B JP NZ,UPDATA ; Update DATA pointer if "READ" +2414 0F7D D5 PUSH DE ; Save code string address +2415 0F7E B6 OR (HL) ; More input given? +2416 0F7F 21 87 0F LD HL,EXTIG ; "?Extra ignored" message +2417 0F82 C4 E0 14 CALL NZ,PRS ; Output string if extra given +2418 0F85 E1 POP HL ; Restore code string address +2419 0F86 C9 RET +2420 0F87 +2421 0F87 3F 45 78 74 EXTIG: .BYTE "?Extra ignored",CR,LF,0 +2421 0F8B 72 61 20 69 +2421 0F8F 67 6E 6F 72 +2421 0F93 65 64 0D 0A +2421 0F97 00 +2422 0F98 +2423 0F98 CD 31 0D FDTLP: CALL DATA ; Get next statement +2424 0F9B B7 OR A ; End of line? +2425 0F9C C2 B1 0F JP NZ,FANDT ; No - See if DATA statement +2426 0F9F 23 INC HL +2427 0FA0 7E LD A,(HL) ; End of program? +2428 0FA1 23 INC HL +2429 0FA2 B6 OR (HL) ; 00 00 Ends program +2430 0FA3 1E 06 LD E,OD ; ?OD Error +2431 0FA5 CA 56 07 JP Z,ERROR ; Yes - Out of DATA +2432 0FA8 23 INC HL +2433 0FA9 5E LD E,(HL) ; LSB of line number +2434 0FAA 23 INC HL +2435 0FAB 56 LD D,(HL) ; MSB of line number +2436 0FAC EB EX DE,HL +2437 0FAD 22 79 31 LD (DATLIN),HL ; Set line of current DATA item +2438 0FB0 EB EX DE,HL +2439 0FB1 CD 9A 0B FANDT: CALL GETCHR ; Get next character +2440 0FB4 FE 83 CP ZDATA ; "DATA" token +2441 0FB6 C2 98 0F JP NZ,FDTLP ; No "DATA" - Keep looking +2442 0FB9 C3 2B 0F JP ANTVLU ; Found - Convert input +2443 0FBC +2444 0FBC 11 00 00 NEXT: LD DE,0 ; In case no index given +2445 0FBF C4 FD 11 NEXT1: CALL NZ,GETVAR ; Get index address +2446 0FC2 22 7E 31 LD (BRKLIN),HL ; Save code string address +2447 0FC5 CD EB 06 CALL BAKSTK ; Look for "FOR" block +2448 0FC8 C2 48 07 JP NZ,NFERR ; No "FOR" - ?NF Error +2449 0FCB F9 LD SP,HL ; Clear nested loops +2450 0FCC D5 PUSH DE ; Save index address +2451 0FCD 7E LD A,(HL) ; Get sign of STEP +2452 0FCE 23 INC HL +2453 0FCF F5 PUSH AF ; Save sign of STEP +2454 0FD0 D5 PUSH DE ; Save index address +2455 0FD1 CD 27 1A CALL PHLTFP ; Move index value to FPREG +2456 0FD4 E3 EX (SP),HL ; Save address of TO value +2457 0FD5 E5 PUSH HL ; Save address of index +2458 0FD6 CD 94 17 CALL ADDPHL ; Add STEP to index value +2459 0FD9 E1 POP HL ; Restore address of index +2460 0FDA CD 41 1A CALL FPTHL ; Move value to index variable +2461 0FDD E1 POP HL ; Restore address of TO value +2462 0FDE CD 38 1A CALL LOADFP ; Move TO value to BCDE +2463 0FE1 E5 PUSH HL ; Save address of line of FOR +2464 0FE2 CD 64 1A CALL CMPNUM ; Compare index with TO value +2465 0FE5 E1 POP HL ; Restore address of line num +2466 0FE6 C1 POP BC ; Address of sign of STEP +2467 0FE7 90 SUB B ; Compare with expected sign +2468 0FE8 CD 38 1A CALL LOADFP ; BC = Loop stmt,DE = Line num +2469 0FEB CA F7 0F JP Z,KILFOR ; Loop finished - Terminate it +2470 0FEE EB EX DE,HL ; Loop statement line number +2471 0FEF 22 0C 31 LD (LINEAT),HL ; Set loop line number +2472 0FF2 69 LD L,C ; Set code string to loop +2473 0FF3 60 LD H,B +2474 0FF4 C3 56 0B JP PUTFID ; Put back "FOR" and continue +2475 0FF7 +2476 0FF7 F9 KILFOR: LD SP,HL ; Remove "FOR" block +2477 0FF8 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" +2478 0FFB 7E LD A,(HL) ; Get next byte in code string +2479 0FFC FE 2C CP ',' ; More NEXTs ? +2480 0FFE C2 5A 0B JP NZ,RUNCNT ; No - Do next statement +2481 1001 CD 9A 0B CALL GETCHR ; Position to index name +2482 1004 CD BF 0F CALL NEXT1 ; Re-enter NEXT routine +2483 1007 ; < will not RETurn to here , Exit to RUNCNT or Loop > +2484 1007 +2485 1007 CD 19 10 GETNUM: CALL EVAL ; Get a numeric expression +2486 100A F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) +2487 100B 37 TSTSTR: SCF ; Set carry (string) +2488 100C 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match +2489 100F 8F ADC A,A ; Expected + actual +2490 1010 B7 OR A ; Clear carry , set parity +2491 1011 E8 RET PE ; Even parity - Types match +2492 1012 C3 54 07 JP TMERR ; Different types - Error +2493 1015 +2494 1015 CD 10 0A OPNPAR: CALL CHKSYN ; Make sure "(" follows +2495 1018 28 .BYTE "(" +2496 1019 2B EVAL: DEC HL ; Evaluate expression & save +2497 101A 16 00 LD D,0 ; Precedence value +2498 101C D5 EVAL1: PUSH DE ; Save precedence +2499 101D 0E 01 LD C,1 +2500 101F CD 1F 07 CALL CHKSTK ; Check for 1 level of stack +2501 1022 CD 90 10 CALL OPRND ; Get next expression value +2502 1025 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator +2503 1028 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr +2504 102B C1 POP BC ; Precedence value and operator +2505 102C 78 LD A,B ; Get precedence value +2506 102D FE 78 CP 78H ; "AND" or "OR" ? +2507 102F D4 0A 10 CALL NC,TSTNUM ; No - Make sure it's a number +2508 1032 7E LD A,(HL) ; Get next operator / function +2509 1033 16 00 LD D,0 ; Clear Last relation +2510 1035 D6 B3 RLTLP: SUB ZGTR ; ">" Token +2511 1037 DA 51 10 JP C,FOPRND ; + - * / ^ AND OR - Test it +2512 103A FE 03 CP ZLTH+1-ZGTR ; < = > +2513 103C D2 51 10 JP NC,FOPRND ; Function - Call it +2514 103F FE 01 CP ZEQUAL-ZGTR ; "=" +2515 1041 17 RLA ; <- Test for legal +2516 1042 AA XOR D ; <- combinations of < = > +2517 1043 BA CP D ; <- by combining last token +2518 1044 57 LD D,A ; <- with current one +2519 1045 DA 42 07 JP C,SNERR ; Error if "<<' '==" or ">>" +2520 1048 22 75 31 LD (CUROPR),HL ; Save address of current token +2521 104B CD 9A 0B CALL GETCHR ; Get next character +2522 104E C3 35 10 JP RLTLP ; Treat the two as one +2523 1051 +2524 1051 7A FOPRND: LD A,D ; < = > found ? +2525 1052 B7 OR A +2526 1053 C2 78 11 JP NZ,TSTRED ; Yes - Test for reduction +2527 1056 7E LD A,(HL) ; Get operator token +2528 1057 22 75 31 LD (CUROPR),HL ; Save operator address +2529 105A D6 AC SUB ZPLUS ; Operator or function? +2530 105C D8 RET C ; Neither - Exit +2531 105D FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? +2532 105F D0 RET NC ; No - Exit +2533 1060 5F LD E,A ; Coded operator +2534 1061 3A 5D 31 LD A,(TYPE) ; Get data type +2535 1064 3D DEC A ; FF = numeric , 00 = string +2536 1065 B3 OR E ; Combine with coded operator +2537 1066 7B LD A,E ; Get coded operator +2538 1067 CA D6 15 JP Z,CONCAT ; String concatenation +2539 106A 07 RLCA ; Times 2 +2540 106B 83 ADD A,E ; Times 3 +2541 106C 5F LD E,A ; To DE (D is 0) +2542 106D 21 34 06 LD HL,PRITAB ; Precedence table +2543 1070 19 ADD HL,DE ; To the operator concerned +2544 1071 78 LD A,B ; Last operator precedence +2545 1072 56 LD D,(HL) ; Get evaluation precedence +2546 1073 BA CP D ; Compare with eval precedence +2547 1074 D0 RET NC ; Exit if higher precedence +2548 1075 23 INC HL ; Point to routine address +2549 1076 CD 0A 10 CALL TSTNUM ; Make sure it's a number +2550 1079 +2551 1079 C5 STKTHS: PUSH BC ; Save last precedence & token +2552 107A 01 28 10 LD BC,EVAL3 ; Where to go on prec' break +2553 107D C5 PUSH BC ; Save on stack for return +2554 107E 43 LD B,E ; Save operator +2555 107F 4A LD C,D ; Save precedence +2556 1080 CD 1A 1A CALL STAKFP ; Move value to stack +2557 1083 58 LD E,B ; Restore operator +2558 1084 51 LD D,C ; Restore precedence +2559 1085 4E LD C,(HL) ; Get LSB of routine address +2560 1086 23 INC HL +2561 1087 46 LD B,(HL) ; Get MSB of routine address +2562 1088 23 INC HL +2563 1089 C5 PUSH BC ; Save routine address +2564 108A 2A 75 31 LD HL,(CUROPR) ; Address of current operator +2565 108D C3 1C 10 JP EVAL1 ; Loop until prec' break +2566 1090 +2567 1090 AF OPRND: XOR A ; Get operand routine +2568 1091 32 5D 31 LD (TYPE),A ; Set numeric expected +2569 1094 CD 9A 0B CALL GETCHR ; Get next character +2570 1097 1E 24 LD E,MO ; ?MO Error +2571 1099 CA 56 07 JP Z,ERROR ; No operand - Error +2572 109C DA F0 1A JP C,ASCTFP ; Number - Get value +2573 109F CD 38 0C CALL CHKLTR ; See if a letter +2574 10A2 D2 F7 10 JP NC,CONVAR ; Letter - Find variable +2575 10A5 FE 26 CP '&' ; &H = HEX, &B = BINARY +2576 10A7 20 12 JR NZ, NOTAMP +2577 10A9 CD 9A 0B CALL GETCHR ; Get next character +2578 10AC FE 48 CP 'H' ; Hex number indicated? [function added] +2579 10AE CA 34 1F JP Z,HEXTFP ; Convert Hex to FPREG +2580 10B1 FE 42 CP 'B' ; Binary number indicated? [function added] +2581 10B3 CA A4 1F JP Z,BINTFP ; Convert Bin to FPREG +2582 10B6 1E 02 LD E,SN ; If neither then a ?SN Error +2583 10B8 CA 56 07 JP Z,ERROR ; +2584 10BB FE AC NOTAMP: CP ZPLUS ; '+' Token ? +2585 10BD CA 90 10 JP Z,OPRND ; Yes - Look for operand +2586 10C0 FE 2E CP '.' ; '.' ? +2587 10C2 CA F0 1A JP Z,ASCTFP ; Yes - Create FP number +2588 10C5 FE AD CP ZMINUS ; '-' Token ? +2589 10C7 CA E6 10 JP Z,MINUS ; Yes - Do minus +2590 10CA FE 22 CP '"' ; Literal string ? +2591 10CC CA 9F 14 JP Z,QTSTR ; Get string terminated by '"' +2592 10CF FE AA CP ZNOT ; "NOT" Token ? +2593 10D1 CA D8 11 JP Z,EVNOT ; Yes - Eval NOT expression +2594 10D4 FE A7 CP ZFN ; "FN" Token ? +2595 10D6 CA 03 14 JP Z,DOFN ; Yes - Do FN routine +2596 10D9 D6 B6 SUB ZSGN ; Is it a function? +2597 10DB D2 08 11 JP NC,FNOFST ; Yes - Evaluate function +2598 10DE CD 15 10 EVLPAR: CALL OPNPAR ; Evaluate expression in "()" +2599 10E1 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2600 10E4 29 .BYTE ")" +2601 10E5 C9 RET +2602 10E6 +2603 10E6 16 7D MINUS: LD D,7DH ; '-' precedence +2604 10E8 CD 1C 10 CALL EVAL1 ; Evaluate until prec' break +2605 10EB 2A 80 31 LD HL,(NXTOPR) ; Get next operator address +2606 10EE E5 PUSH HL ; Save next operator address +2607 10EF CD 12 1A CALL INVSGN ; Negate value +2608 10F2 CD 0A 10 RETNUM: CALL TSTNUM ; Make sure it's a number +2609 10F5 E1 POP HL ; Restore next operator address +2610 10F6 C9 RET +2611 10F7 +2612 10F7 CD FD 11 CONVAR: CALL GETVAR ; Get variable address to DE +2613 10FA E5 FRMEVL: PUSH HL ; Save code string address +2614 10FB EB EX DE,HL ; Variable address to HL +2615 10FC 22 94 31 LD (FPREG),HL ; Save address of variable +2616 10FF 3A 5D 31 LD A,(TYPE) ; Get type +2617 1102 B7 OR A ; Numeric? +2618 1103 CC 27 1A CALL Z,PHLTFP ; Yes - Move contents to FPREG +2619 1106 E1 POP HL ; Restore code string address +2620 1107 C9 RET +2621 1108 +2622 1108 06 00 FNOFST: LD B,0 ; Get address of function +2623 110A 07 RLCA ; Double function offset +2624 110B 4F LD C,A ; BC = Offset in function table +2625 110C C5 PUSH BC ; Save adjusted token value +2626 110D CD 9A 0B CALL GETCHR ; Get next character +2627 1110 79 LD A,C ; Get adjusted token value +2628 1111 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? +2629 1113 DA 2F 11 JP C,FNVAL ; No - Do function +2630 1116 CD 15 10 CALL OPNPAR ; Evaluate expression (X,... +2631 1119 CD 10 0A CALL CHKSYN ; Make sure ',' follows +2632 111C 2C .BYTE ',' +2633 111D CD 0B 10 CALL TSTSTR ; Make sure it's a string +2634 1120 EB EX DE,HL ; Save code string address +2635 1121 2A 94 31 LD HL,(FPREG) ; Get address of string +2636 1124 E3 EX (SP),HL ; Save address of string +2637 1125 E5 PUSH HL ; Save adjusted token value +2638 1126 EB EX DE,HL ; Restore code string address +2639 1127 CD 68 17 CALL GETINT ; Get integer 0-255 +2640 112A EB EX DE,HL ; Save code string address +2641 112B E3 EX (SP),HL ; Save integer,HL = adj' token +2642 112C C3 37 11 JP GOFUNC ; Jump to string function +2643 112F +2644 112F CD DE 10 FNVAL: CALL EVLPAR ; Evaluate expression +2645 1132 E3 EX (SP),HL ; HL = Adjusted token value +2646 1133 11 F2 10 LD DE,RETNUM ; Return number from function +2647 1136 D5 PUSH DE ; Save on stack +2648 1137 01 93 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses +2649 113A 09 ADD HL,BC ; Point to right address +2650 113B 4E LD C,(HL) ; Get LSB of address +2651 113C 23 INC HL ; +2652 113D 66 LD H,(HL) ; Get MSB of address +2653 113E 69 LD L,C ; Address to HL +2654 113F E9 JP (HL) ; Jump to function +2655 1140 +2656 1140 15 SGNEXP: DEC D ; Dee to flag negative exponent +2657 1141 FE AD CP ZMINUS ; '-' token ? +2658 1143 C8 RET Z ; Yes - Return +2659 1144 FE 2D CP '-' ; '-' ASCII ? +2660 1146 C8 RET Z ; Yes - Return +2661 1147 14 INC D ; Inc to flag positive exponent +2662 1148 FE 2B CP '+' ; '+' ASCII ? +2663 114A C8 RET Z ; Yes - Return +2664 114B FE AC CP ZPLUS ; '+' token ? +2665 114D C8 RET Z ; Yes - Return +2666 114E 2B DEC HL ; DEC 'cos GETCHR INCs +2667 114F C9 RET ; Return "NZ" +2668 1150 +2669 1150 F6 POR: .BYTE 0F6H ; Flag "OR" +2670 1151 AF PAND: XOR A ; Flag "AND" +2671 1152 F5 PUSH AF ; Save "AND" / "OR" flag +2672 1153 CD 0A 10 CALL TSTNUM ; Make sure it's a number +2673 1156 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +2674 1159 F1 POP AF ; Restore "AND" / "OR" flag +2675 115A EB EX DE,HL ; <- Get last +2676 115B C1 POP BC ; <- value +2677 115C E3 EX (SP),HL ; <- from +2678 115D EB EX DE,HL ; <- stack +2679 115E CD 2A 1A CALL FPBCDE ; Move last value to FPREG +2680 1161 F5 PUSH AF ; Save "AND" / "OR" flag +2681 1162 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +2682 1165 F1 POP AF ; Restore "AND" / "OR" flag +2683 1166 C1 POP BC ; Get value +2684 1167 79 LD A,C ; Get LSB +2685 1168 21 C1 13 LD HL,ACPASS ; Address of save AC as current +2686 116B C2 73 11 JP NZ,POR1 ; Jump if OR +2687 116E A3 AND E ; "AND" LSBs +2688 116F 4F LD C,A ; Save LSB +2689 1170 78 LD A,B ; Get MBS +2690 1171 A2 AND D ; "AND" MSBs +2691 1172 E9 JP (HL) ; Save AC as current (ACPASS) +2692 1173 +2693 1173 B3 POR1: OR E ; "OR" LSBs +2694 1174 4F LD C,A ; Save LSB +2695 1175 78 LD A,B ; Get MSB +2696 1176 B2 OR D ; "OR" MSBs +2697 1177 E9 JP (HL) ; Save AC as current (ACPASS) +2698 1178 +2699 1178 21 8A 11 TSTRED: LD HL,CMPLOG ; Logical compare routine +2700 117B 3A 5D 31 LD A,(TYPE) ; Get data type +2701 117E 1F RRA ; Carry set = string +2702 117F 7A LD A,D ; Get last precedence value +2703 1180 17 RLA ; Times 2 plus carry +2704 1181 5F LD E,A ; To E +2705 1182 16 64 LD D,64H ; Relational precedence +2706 1184 78 LD A,B ; Get current precedence +2707 1185 BA CP D ; Compare with last +2708 1186 D0 RET NC ; Eval if last was rel' or log' +2709 1187 C3 79 10 JP STKTHS ; Stack this one and get next +2710 118A +2711 118A 8C 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings +2712 118C 79 CMPLG1: LD A,C ; Get data type +2713 118D B7 OR A +2714 118E 1F RRA +2715 118F C1 POP BC ; Get last expression to BCDE +2716 1190 D1 POP DE +2717 1191 F5 PUSH AF ; Save status +2718 1192 CD 0C 10 CALL CHKTYP ; Check that types match +2719 1195 21 CE 11 LD HL,CMPRES ; Result to comparison +2720 1198 E5 PUSH HL ; Save for RETurn +2721 1199 CA 64 1A JP Z,CMPNUM ; Compare values if numeric +2722 119C AF XOR A ; Compare two strings +2723 119D 32 5D 31 LD (TYPE),A ; Set type to numeric +2724 11A0 D5 PUSH DE ; Save string name +2725 11A1 CD 23 16 CALL GSTRCU ; Get current string +2726 11A4 7E LD A,(HL) ; Get length of string +2727 11A5 23 INC HL +2728 11A6 23 INC HL +2729 11A7 4E LD C,(HL) ; Get LSB of address +2730 11A8 23 INC HL +2731 11A9 46 LD B,(HL) ; Get MSB of address +2732 11AA D1 POP DE ; Restore string name +2733 11AB C5 PUSH BC ; Save address of string +2734 11AC F5 PUSH AF ; Save length of string +2735 11AD CD 27 16 CALL GSTRDE ; Get second string +2736 11B0 CD 38 1A CALL LOADFP ; Get address of second string +2737 11B3 F1 POP AF ; Restore length of string 1 +2738 11B4 57 LD D,A ; Length to D +2739 11B5 E1 POP HL ; Restore address of string 1 +2740 11B6 7B CMPSTR: LD A,E ; Bytes of string 2 to do +2741 11B7 B2 OR D ; Bytes of string 1 to do +2742 11B8 C8 RET Z ; Exit if all bytes compared +2743 11B9 7A LD A,D ; Get bytes of string 1 to do +2744 11BA D6 01 SUB 1 +2745 11BC D8 RET C ; Exit if end of string 1 +2746 11BD AF XOR A +2747 11BE BB CP E ; Bytes of string 2 to do +2748 11BF 3C INC A +2749 11C0 D0 RET NC ; Exit if end of string 2 +2750 11C1 15 DEC D ; Count bytes in string 1 +2751 11C2 1D DEC E ; Count bytes in string 2 +2752 11C3 0A LD A,(BC) ; Byte in string 2 +2753 11C4 BE CP (HL) ; Compare to byte in string 1 +2754 11C5 23 INC HL ; Move up string 1 +2755 11C6 03 INC BC ; Move up string 2 +2756 11C7 CA B6 11 JP Z,CMPSTR ; Same - Try next bytes +2757 11CA 3F CCF ; Flag difference (">" or "<") +2758 11CB C3 F4 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 +2759 11CE +2760 11CE 3C CMPRES: INC A ; Increment current value +2761 11CF 8F ADC A,A ; Double plus carry +2762 11D0 C1 POP BC ; Get other value +2763 11D1 A0 AND B ; Combine them +2764 11D2 C6 FF ADD A,-1 ; Carry set if different +2765 11D4 9F SBC A,A ; 00 - Equal , FF - Different +2766 11D5 C3 FB 19 JP FLGREL ; Set current value & continue +2767 11D8 +2768 11D8 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" +2769 11DA CD 1C 10 CALL EVAL1 ; Eval until precedence break +2770 11DD CD 0A 10 CALL TSTNUM ; Make sure it's a number +2771 11E0 CD 4C 0C CALL DEINT ; Get integer -32768 - 32767 +2772 11E3 7B LD A,E ; Get LSB +2773 11E4 2F CPL ; Invert LSB +2774 11E5 4F LD C,A ; Save "NOT" of LSB +2775 11E6 7A LD A,D ; Get MSB +2776 11E7 2F CPL ; Invert MSB +2777 11E8 CD C1 13 CALL ACPASS ; Save AC as current +2778 11EB C1 POP BC ; Clean up stack +2779 11EC C3 28 10 JP EVAL3 ; Continue evaluation +2780 11EF +2781 11EF 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs +2782 11F0 CD 9A 0B CALL GETCHR ; Get next character +2783 11F3 C8 RET Z ; End of DIM statement +2784 11F4 CD 10 0A CALL CHKSYN ; Make sure ',' follows +2785 11F7 2C .BYTE ',' +2786 11F8 01 EF 11 DIM: LD BC,DIMRET ; Return to "DIMRET" +2787 11FB C5 PUSH BC ; Save on stack +2788 11FC F6 .BYTE 0F6H ; Flag "Create" variable +2789 11FD AF GETVAR: XOR A ; Find variable address,to DE +2790 11FE 32 5C 31 LD (LCRFLG),A ; Set locate / create flag +2791 1201 46 LD B,(HL) ; Get First byte of name +2792 1202 CD 38 0C GTFNAM: CALL CHKLTR ; See if a letter +2793 1205 DA 42 07 JP C,SNERR ; ?SN Error if not a letter +2794 1208 AF XOR A +2795 1209 4F LD C,A ; Clear second byte of name +2796 120A 32 5D 31 LD (TYPE),A ; Set type to numeric +2797 120D CD 9A 0B CALL GETCHR ; Get next character +2798 1210 DA 19 12 JP C,SVNAM2 ; Numeric - Save in name +2799 1213 CD 38 0C CALL CHKLTR ; See if a letter +2800 1216 DA 26 12 JP C,CHARTY ; Not a letter - Check type +2801 1219 4F SVNAM2: LD C,A ; Save second byte of name +2802 121A CD 9A 0B ENDNAM: CALL GETCHR ; Get next character +2803 121D DA 1A 12 JP C,ENDNAM ; Numeric - Get another +2804 1220 CD 38 0C CALL CHKLTR ; See if a letter +2805 1223 D2 1A 12 JP NC,ENDNAM ; Letter - Get another +2806 1226 D6 24 CHARTY: SUB '$' ; String variable? +2807 1228 C2 35 12 JP NZ,NOTSTR ; No - Numeric variable +2808 122B 3C INC A ; A = 1 (string type) +2809 122C 32 5D 31 LD (TYPE),A ; Set type to string +2810 122F 0F RRCA ; A = 80H , Flag for string +2811 1230 81 ADD A,C ; 2nd byte of name has bit 7 on +2812 1231 4F LD C,A ; Resave second byte on name +2813 1232 CD 9A 0B CALL GETCHR ; Get next character +2814 1235 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? +2815 1238 3D DEC A +2816 1239 CA E2 12 JP Z,ARLDSV ; Yes - Get array name +2817 123C F2 45 12 JP P,NSCFOR ; No array with "FOR" or "FN" +2818 123F 7E LD A,(HL) ; Get byte again +2819 1240 D6 28 SUB '(' ; Subscripted variable? +2820 1242 CA BA 12 JP Z,SBSCPT ; Yes - Sort out subscript +2821 1245 +2822 1245 AF NSCFOR: XOR A ; Simple variable +2823 1246 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag +2824 1249 E5 PUSH HL ; Save code string address +2825 124A 50 LD D,B ; DE = Variable name to find +2826 124B 59 LD E,C +2827 124C 2A 8E 31 LD HL,(FNRGNM) ; FN argument name +2828 124F CD 0A 0A CALL CPDEHL ; Is it the FN argument? +2829 1252 11 90 31 LD DE,FNARG ; Point to argument value +2830 1255 CA 2A 19 JP Z,POPHRT ; Yes - Return FN argument value +2831 1258 2A 88 31 LD HL,(VAREND) ; End of variables +2832 125B EB EX DE,HL ; Address of end of search +2833 125C 2A 86 31 LD HL,(PROGND) ; Start of variables address +2834 125F CD 0A 0A FNDVAR: CALL CPDEHL ; End of variable list table? +2835 1262 CA 78 12 JP Z,CFEVAL ; Yes - Called from EVAL? +2836 1265 79 LD A,C ; Get second byte of name +2837 1266 96 SUB (HL) ; Compare with name in list +2838 1267 23 INC HL ; Move on to first byte +2839 1268 C2 6D 12 JP NZ,FNTHR ; Different - Find another +2840 126B 78 LD A,B ; Get first byte of name +2841 126C 96 SUB (HL) ; Compare with name in list +2842 126D 23 FNTHR: INC HL ; Move on to LSB of value +2843 126E CA AC 12 JP Z,RETADR ; Found - Return address +2844 1271 23 INC HL ; <- Skip +2845 1272 23 INC HL ; <- over +2846 1273 23 INC HL ; <- F.P. +2847 1274 23 INC HL ; <- value +2848 1275 C3 5F 12 JP FNDVAR ; Keep looking +2849 1278 +2850 1278 E1 CFEVAL: POP HL ; Restore code string address +2851 1279 E3 EX (SP),HL ; Get return address +2852 127A D5 PUSH DE ; Save address of variable +2853 127B 11 FA 10 LD DE,FRMEVL ; Return address in EVAL +2854 127E CD 0A 0A CALL CPDEHL ; Called from EVAL ? +2855 1281 D1 POP DE ; Restore address of variable +2856 1282 CA AF 12 JP Z,RETNUL ; Yes - Return null variable +2857 1285 E3 EX (SP),HL ; Put back return +2858 1286 E5 PUSH HL ; Save code string address +2859 1287 C5 PUSH BC ; Save variable name +2860 1288 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data +2861 128B 2A 8A 31 LD HL,(ARREND) ; End of arrays +2862 128E E5 PUSH HL ; Save end of arrays +2863 128F 09 ADD HL,BC ; Move up 6 bytes +2864 1290 C1 POP BC ; Source address in BC +2865 1291 E5 PUSH HL ; Save new end address +2866 1292 CD 0E 07 CALL MOVUP ; Move arrays up +2867 1295 E1 POP HL ; Restore new end address +2868 1296 22 8A 31 LD (ARREND),HL ; Set new end address +2869 1299 60 LD H,B ; End of variables to HL +2870 129A 69 LD L,C +2871 129B 22 88 31 LD (VAREND),HL ; Set new end address +2872 129E +2873 129E 2B ZEROLP: DEC HL ; Back through to zero variable +2874 129F 36 00 LD (HL),0 ; Zero byte in variable +2875 12A1 CD 0A 0A CALL CPDEHL ; Done them all? +2876 12A4 C2 9E 12 JP NZ,ZEROLP ; No - Keep on going +2877 12A7 D1 POP DE ; Get variable name +2878 12A8 73 LD (HL),E ; Store second character +2879 12A9 23 INC HL +2880 12AA 72 LD (HL),D ; Store first character +2881 12AB 23 INC HL +2882 12AC EB RETADR: EX DE,HL ; Address of variable in DE +2883 12AD E1 POP HL ; Restore code string address +2884 12AE C9 RET +2885 12AF +2886 12AF 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero +2887 12B2 21 DE 06 LD HL,ZERBYT ; Also set a null string +2888 12B5 22 94 31 LD (FPREG),HL ; Save for EVAL +2889 12B8 E1 POP HL ; Restore code string address +2890 12B9 C9 RET +2891 12BA +2892 12BA E5 SBSCPT: PUSH HL ; Save code string address +2893 12BB 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type +2894 12BE E3 EX (SP),HL ; Save and get code string +2895 12BF 57 LD D,A ; Zero number of dimensions +2896 12C0 D5 SCPTLP: PUSH DE ; Save number of dimensions +2897 12C1 C5 PUSH BC ; Save array name +2898 12C2 CD 40 0C CALL FPSINT ; Get subscript (0-32767) +2899 12C5 C1 POP BC ; Restore array name +2900 12C6 F1 POP AF ; Get number of dimensions +2901 12C7 EB EX DE,HL +2902 12C8 E3 EX (SP),HL ; Save subscript value +2903 12C9 E5 PUSH HL ; Save LCRFLG and TYPE +2904 12CA EB EX DE,HL +2905 12CB 3C INC A ; Count dimensions +2906 12CC 57 LD D,A ; Save in D +2907 12CD 7E LD A,(HL) ; Get next byte in code string +2908 12CE FE 2C CP ',' ; Comma (more to come)? +2909 12D0 CA C0 12 JP Z,SCPTLP ; Yes - More subscripts +2910 12D3 CD 10 0A CALL CHKSYN ; Make sure ")" follows +2911 12D6 29 .BYTE ")" +2912 12D7 22 80 31 LD (NXTOPR),HL ; Save code string address +2913 12DA E1 POP HL ; Get LCRFLG and TYPE +2914 12DB 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type +2915 12DE 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* +2916 12E0 D5 PUSH DE ; Save number of dimensions (D) +2917 12E1 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' +2918 12E2 +2919 12E2 E5 ARLDSV: PUSH HL ; Save code string address +2920 12E3 F5 PUSH AF ; A = 00 , Flags set = Z,N +2921 12E4 2A 88 31 LD HL,(VAREND) ; Start of arrays +2922 12E7 3E .BYTE 3EH ; Skip "ADD HL,DE" +2923 12E8 19 FNDARY: ADD HL,DE ; Move to next array start +2924 12E9 EB EX DE,HL +2925 12EA 2A 8A 31 LD HL,(ARREND) ; End of arrays +2926 12ED EB EX DE,HL ; Current array pointer +2927 12EE CD 0A 0A CALL CPDEHL ; End of arrays found? +2928 12F1 CA 1A 13 JP Z,CREARY ; Yes - Create array +2929 12F4 7E LD A,(HL) ; Get second byte of name +2930 12F5 B9 CP C ; Compare with name given +2931 12F6 23 INC HL ; Move on +2932 12F7 C2 FC 12 JP NZ,NXTARY ; Different - Find next array +2933 12FA 7E LD A,(HL) ; Get first byte of name +2934 12FB B8 CP B ; Compare with name given +2935 12FC 23 NXTARY: INC HL ; Move on +2936 12FD 5E LD E,(HL) ; Get LSB of next array address +2937 12FE 23 INC HL +2938 12FF 56 LD D,(HL) ; Get MSB of next array address +2939 1300 23 INC HL +2940 1301 C2 E8 12 JP NZ,FNDARY ; Not found - Keep looking +2941 1304 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? +2942 1307 B7 OR A +2943 1308 C2 4B 07 JP NZ,DDERR ; Create - ?DD Error +2944 130B F1 POP AF ; Locate - Get number of dim'ns +2945 130C 44 LD B,H ; BC Points to array dim'ns +2946 130D 4D LD C,L +2947 130E CA 2A 19 JP Z,POPHRT ; Jump if array load/save +2948 1311 96 SUB (HL) ; Same number of dimensions? +2949 1312 CA 78 13 JP Z,FINDEL ; Yes - Find element +2950 1315 1E 10 BSERR: LD E,BS ; ?BS Error +2951 1317 C3 56 07 JP ERROR ; Output error +2952 131A +2953 131A 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry +2954 131D F1 POP AF ; Array to save or 0 dim'ns? +2955 131E CA 61 0C JP Z,FCERR ; Yes - ?FC Error +2956 1321 71 LD (HL),C ; Save second byte of name +2957 1322 23 INC HL +2958 1323 70 LD (HL),B ; Save first byte of name +2959 1324 23 INC HL +2960 1325 4F LD C,A ; Number of dimensions to C +2961 1326 CD 1F 07 CALL CHKSTK ; Check if enough memory +2962 1329 23 INC HL ; Point to number of dimensions +2963 132A 23 INC HL +2964 132B 22 75 31 LD (CUROPR),HL ; Save address of pointer +2965 132E 71 LD (HL),C ; Set number of dimensions +2966 132F 23 INC HL +2967 1330 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? +2968 1333 17 RLA ; Carry set = Create +2969 1334 79 LD A,C ; Get number of dimensions +2970 1335 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 +2971 1338 D2 3D 13 JP NC,DEFSIZ ; Locate - Set default size +2972 133B C1 POP BC ; Get specified dimension size +2973 133C 03 INC BC ; Include zero element +2974 133D 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size +2975 133E 23 INC HL +2976 133F 70 LD (HL),B ; Save MSB of dimension size +2977 1340 23 INC HL +2978 1341 F5 PUSH AF ; Save num' of dim'ns an status +2979 1342 E5 PUSH HL ; Save address of dim'n size +2980 1343 CD D5 1A CALL MLDEBC ; Multiply DE by BC to find +2981 1346 EB EX DE,HL ; amount of mem needed (to DE) +2982 1347 E1 POP HL ; Restore address of dimension +2983 1348 F1 POP AF ; Restore number of dimensions +2984 1349 3D DEC A ; Count them +2985 134A C2 35 13 JP NZ,CRARLP ; Do next dimension if more +2986 134D F5 PUSH AF ; Save locate/create flag +2987 134E 42 LD B,D ; MSB of memory needed +2988 134F 4B LD C,E ; LSB of memory needed +2989 1350 EB EX DE,HL +2990 1351 19 ADD HL,DE ; Add bytes to array start +2991 1352 DA 37 07 JP C,OMERR ; Too big - Error +2992 1355 CD 28 07 CALL ENFMEM ; See if enough memory +2993 1358 22 8A 31 LD (ARREND),HL ; Save new end of array +2994 135B +2995 135B 2B ZERARY: DEC HL ; Back through array data +2996 135C 36 00 LD (HL),0 ; Set array element to zero +2997 135E CD 0A 0A CALL CPDEHL ; All elements zeroed? +2998 1361 C2 5B 13 JP NZ,ZERARY ; No - Keep on going +2999 1364 03 INC BC ; Number of bytes + 1 +3000 1365 57 LD D,A ; A=0 +3001 1366 2A 75 31 LD HL,(CUROPR) ; Get address of array +3002 1369 5E LD E,(HL) ; Number of dimensions +3003 136A EB EX DE,HL ; To HL +3004 136B 29 ADD HL,HL ; Two bytes per dimension size +3005 136C 09 ADD HL,BC ; Add number of bytes +3006 136D EB EX DE,HL ; Bytes needed to DE +3007 136E 2B DEC HL +3008 136F 2B DEC HL +3009 1370 73 LD (HL),E ; Save LSB of bytes needed +3010 1371 23 INC HL +3011 1372 72 LD (HL),D ; Save MSB of bytes needed +3012 1373 23 INC HL +3013 1374 F1 POP AF ; Locate / Create? +3014 1375 DA 9C 13 JP C,ENDDIM ; A is 0 , End if create +3015 1378 47 FINDEL: LD B,A ; Find array element +3016 1379 4F LD C,A +3017 137A 7E LD A,(HL) ; Number of dimensions +3018 137B 23 INC HL +3019 137C 16 .BYTE 16H ; Skip "POP HL" +3020 137D E1 FNDELP: POP HL ; Address of next dim' size +3021 137E 5E LD E,(HL) ; Get LSB of dim'n size +3022 137F 23 INC HL +3023 1380 56 LD D,(HL) ; Get MSB of dim'n size +3024 1381 23 INC HL +3025 1382 E3 EX (SP),HL ; Save address - Get index +3026 1383 F5 PUSH AF ; Save number of dim'ns +3027 1384 CD 0A 0A CALL CPDEHL ; Dimension too large? +3028 1387 D2 15 13 JP NC,BSERR ; Yes - ?BS Error +3029 138A E5 PUSH HL ; Save index +3030 138B CD D5 1A CALL MLDEBC ; Multiply previous by size +3031 138E D1 POP DE ; Index supplied to DE +3032 138F 19 ADD HL,DE ; Add index to pointer +3033 1390 F1 POP AF ; Number of dimensions +3034 1391 3D DEC A ; Count them +3035 1392 44 LD B,H ; MSB of pointer +3036 1393 4D LD C,L ; LSB of pointer +3037 1394 C2 7D 13 JP NZ,FNDELP ; More - Keep going +3038 1397 29 ADD HL,HL ; 4 Bytes per element +3039 1398 29 ADD HL,HL +3040 1399 C1 POP BC ; Start of array +3041 139A 09 ADD HL,BC ; Point to element +3042 139B EB EX DE,HL ; Address of element to DE +3043 139C 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address +3044 139F C9 RET +3045 13A0 +3046 13A0 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory +3047 13A3 EB EX DE,HL ; To DE +3048 13A4 21 00 00 LD HL,0 ; End of free memory +3049 13A7 39 ADD HL,SP ; Current stack value +3050 13A8 3A 5D 31 LD A,(TYPE) ; Dummy argument type +3051 13AB B7 OR A +3052 13AC CA BC 13 JP Z,FRENUM ; Numeric - Free variable space +3053 13AF CD 23 16 CALL GSTRCU ; Current string to pool +3054 13B2 CD 23 15 CALL GARBGE ; Garbage collection +3055 13B5 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +3056 13B8 EB EX DE,HL ; To DE +3057 13B9 2A 73 31 LD HL,(STRBOT) ; Bottom of string space +3058 13BC 7D FRENUM: LD A,L ; Get LSB of end +3059 13BD 93 SUB E ; Subtract LSB of beginning +3060 13BE 4F LD C,A ; Save difference if C +3061 13BF 7C LD A,H ; Get MSB of end +3062 13C0 9A SBC A,D ; Subtract MSB of beginning +3063 13C1 41 ACPASS: LD B,C ; Return integer AC +3064 13C2 50 ABPASS: LD D,B ; Return integer AB +3065 13C3 1E 00 LD E,0 +3066 13C5 21 5D 31 LD HL,TYPE ; Point to type +3067 13C8 73 LD (HL),E ; Set type to numeric +3068 13C9 06 90 LD B,80H+16 ; 16 bit integer +3069 13CB C3 00 1A JP RETINT ; Return the integr +3070 13CE +3071 13CE 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position +3072 13D1 47 PASSA: LD B,A ; Put A into AB +3073 13D2 AF XOR A ; Zero A +3074 13D3 C3 C2 13 JP ABPASS ; Return integer AB +3075 13D6 +3076 13D6 CD 59 14 DEF: CALL CHEKFN ; Get "FN" and name +3077 13D9 CD 4B 14 CALL IDTEST ; Test for illegal direct +3078 13DC 01 31 0D LD BC,DATA ; To get next statement +3079 13DF C5 PUSH BC ; Save address for RETurn +3080 13E0 D5 PUSH DE ; Save address of function ptr +3081 13E1 CD 10 0A CALL CHKSYN ; Make sure "(" follows +3082 13E4 28 .BYTE "(" +3083 13E5 CD FD 11 CALL GETVAR ; Get argument variable name +3084 13E8 E5 PUSH HL ; Save code string address +3085 13E9 EB EX DE,HL ; Argument address to HL +3086 13EA 2B DEC HL +3087 13EB 56 LD D,(HL) ; Get first byte of arg name +3088 13EC 2B DEC HL +3089 13ED 5E LD E,(HL) ; Get second byte of arg name +3090 13EE E1 POP HL ; Restore code string address +3091 13EF CD 0A 10 CALL TSTNUM ; Make sure numeric argument +3092 13F2 CD 10 0A CALL CHKSYN ; Make sure ")" follows +3093 13F5 29 .BYTE ")" +3094 13F6 CD 10 0A CALL CHKSYN ; Make sure "=" follows +3095 13F9 B4 .BYTE ZEQUAL ; "=" token +3096 13FA 44 LD B,H ; Code string address to BC +3097 13FB 4D LD C,L +3098 13FC E3 EX (SP),HL ; Save code str , Get FN ptr +3099 13FD 71 LD (HL),C ; Save LSB of FN code string +3100 13FE 23 INC HL +3101 13FF 70 LD (HL),B ; Save MSB of FN code string +3102 1400 C3 98 14 JP SVSTAD ; Save address and do function +3103 1403 +3104 1403 CD 59 14 DOFN: CALL CHEKFN ; Make sure FN follows +3105 1406 D5 PUSH DE ; Save function pointer address +3106 1407 CD DE 10 CALL EVLPAR ; Evaluate expression in "()" +3107 140A CD 0A 10 CALL TSTNUM ; Make sure numeric result +3108 140D E3 EX (SP),HL ; Save code str , Get FN ptr +3109 140E 5E LD E,(HL) ; Get LSB of FN code string +3110 140F 23 INC HL +3111 1410 56 LD D,(HL) ; Get MSB of FN code string +3112 1411 23 INC HL +3113 1412 7A LD A,D ; And function DEFined? +3114 1413 B3 OR E +3115 1414 CA 4E 07 JP Z,UFERR ; No - ?UF Error +3116 1417 7E LD A,(HL) ; Get LSB of argument address +3117 1418 23 INC HL +3118 1419 66 LD H,(HL) ; Get MSB of argument address +3119 141A 6F LD L,A ; HL = Arg variable address +3120 141B E5 PUSH HL ; Save it +3121 141C 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name +3122 141F E3 EX (SP),HL ; ; Save old , Get new +3123 1420 22 8E 31 LD (FNRGNM),HL ; Set new argument name +3124 1423 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value +3125 1426 E5 PUSH HL ; Save it +3126 1427 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value +3127 142A E5 PUSH HL ; Save it +3128 142B 21 90 31 LD HL,FNARG ; HL = Value of argument +3129 142E D5 PUSH DE ; Save FN code string address +3130 142F CD 41 1A CALL FPTHL ; Move FPREG to argument +3131 1432 E1 POP HL ; Get FN code string address +3132 1433 CD 07 10 CALL GETNUM ; Get value from function +3133 1436 2B DEC HL ; DEC 'cos GETCHR INCs +3134 1437 CD 9A 0B CALL GETCHR ; Get next character +3135 143A C2 42 07 JP NZ,SNERR ; Bad character in FN - Error +3136 143D E1 POP HL ; Get MSB,EXP of old arg +3137 143E 22 90 31 LD (FNARG),HL ; Restore it +3138 1441 E1 POP HL ; Get LSB,NLSB of old arg +3139 1442 22 92 31 LD (FNARG+2),HL ; Restore it +3140 1445 E1 POP HL ; Get name of old arg +3141 1446 22 8E 31 LD (FNRGNM),HL ; Restore it +3142 1449 E1 POP HL ; Restore code string address +3143 144A C9 RET +3144 144B +3145 144B E5 IDTEST: PUSH HL ; Save code string address +3146 144C 2A 0C 31 LD HL,(LINEAT) ; Get current line number +3147 144F 23 INC HL ; -1 means direct statement +3148 1450 7C LD A,H +3149 1451 B5 OR L +3150 1452 E1 POP HL ; Restore code string address +3151 1453 C0 RET NZ ; Return if in program +3152 1454 1E 16 LD E,ID ; ?ID Error +3153 1456 C3 56 07 JP ERROR +3154 1459 +3155 1459 CD 10 0A CHEKFN: CALL CHKSYN ; Make sure FN follows +3156 145C A7 .BYTE ZFN ; "FN" token +3157 145D 3E 80 LD A,80H +3158 145F 32 7B 31 LD (FORFLG),A ; Flag FN name to find +3159 1462 B6 OR (HL) ; FN name has bit 7 set +3160 1463 47 LD B,A ; in first byte of name +3161 1464 CD 02 12 CALL GTFNAM ; Get FN name +3162 1467 C3 0A 10 JP TSTNUM ; Make sure numeric function +3163 146A +3164 146A CD 0A 10 STR: CALL TSTNUM ; Make sure it's a number +3165 146D CD 8E 1B CALL NUMASC ; Turn number into text +3166 1470 CD 9E 14 STR1: CALL CRTST ; Create string entry for it +3167 1473 CD 23 16 CALL GSTRCU ; Current string to pool +3168 1476 01 7E 16 LD BC,TOPOOL ; Save in string pool +3169 1479 C5 PUSH BC ; Save address on stack +3170 147A +3171 147A 7E SAVSTR: LD A,(HL) ; Get string length +3172 147B 23 INC HL +3173 147C 23 INC HL +3174 147D E5 PUSH HL ; Save pointer to string +3175 147E CD F9 14 CALL TESTR ; See if enough string space +3176 1481 E1 POP HL ; Restore pointer to string +3177 1482 4E LD C,(HL) ; Get LSB of address +3178 1483 23 INC HL +3179 1484 46 LD B,(HL) ; Get MSB of address +3180 1485 CD 92 14 CALL CRTMST ; Create string entry +3181 1488 E5 PUSH HL ; Save pointer to MSB of addr +3182 1489 6F LD L,A ; Length of string +3183 148A CD 16 16 CALL TOSTRA ; Move to string area +3184 148D D1 POP DE ; Restore pointer to MSB +3185 148E C9 RET +3186 148F +3187 148F CD F9 14 MKTMST: CALL TESTR ; See if enough string space +3188 1492 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string +3189 1495 E5 PUSH HL ; Save it +3190 1496 77 LD (HL),A ; Save length of string +3191 1497 23 INC HL +3192 1498 23 SVSTAD: INC HL +3193 1499 73 LD (HL),E ; Save LSB of address +3194 149A 23 INC HL +3195 149B 72 LD (HL),D ; Save MSB of address +3196 149C E1 POP HL ; Restore pointer +3197 149D C9 RET +3198 149E +3199 149E 2B CRTST: DEC HL ; DEC - INCed after +3200 149F 06 22 QTSTR: LD B,'"' ; Terminating quote +3201 14A1 50 LD D,B ; Quote to D +3202 14A2 E5 DTSTR: PUSH HL ; Save start +3203 14A3 0E FF LD C,-1 ; Set counter to -1 +3204 14A5 23 QTSTLP: INC HL ; Move on +3205 14A6 7E LD A,(HL) ; Get byte +3206 14A7 0C INC C ; Count bytes +3207 14A8 B7 OR A ; End of line? +3208 14A9 CA B4 14 JP Z,CRTSTE ; Yes - Create string entry +3209 14AC BA CP D ; Terminator D found? +3210 14AD CA B4 14 JP Z,CRTSTE ; Yes - Create string entry +3211 14B0 B8 CP B ; Terminator B found? +3212 14B1 C2 A5 14 JP NZ,QTSTLP ; No - Keep looking +3213 14B4 FE 22 CRTSTE: CP '"' ; End with '"'? +3214 14B6 CC 9A 0B CALL Z,GETCHR ; Yes - Get next character +3215 14B9 E3 EX (SP),HL ; Starting quote +3216 14BA 23 INC HL ; First byte of string +3217 14BB EB EX DE,HL ; To DE +3218 14BC 79 LD A,C ; Get length +3219 14BD CD 92 14 CALL CRTMST ; Create string entry +3220 14C0 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string +3221 14C3 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +3222 14C6 22 94 31 LD (FPREG),HL ; Save address of string ptr +3223 14C9 3E 01 LD A,1 +3224 14CB 32 5D 31 LD (TYPE),A ; Set type to string +3225 14CE CD 44 1A CALL DETHL4 ; Move string to pool +3226 14D1 CD 0A 0A CALL CPDEHL ; Out of string pool? +3227 14D4 22 61 31 LD (TMSTPT),HL ; Save new pointer +3228 14D7 E1 POP HL ; Restore code string address +3229 14D8 7E LD A,(HL) ; Get next code byte +3230 14D9 C0 RET NZ ; Return if pool OK +3231 14DA 1E 1E LD E,ST ; ?ST Error +3232 14DC C3 56 07 JP ERROR ; String pool overflow +3233 14DF +3234 14DF 23 PRNUMS: INC HL ; Skip leading space +3235 14E0 CD 9E 14 PRS: CALL CRTST ; Create string entry for it +3236 14E3 CD 23 16 PRS1: CALL GSTRCU ; Current string to pool +3237 14E6 CD 38 1A CALL LOADFP ; Move string block to BCDE +3238 14E9 1C INC E ; Length + 1 +3239 14EA 1D PRSLP: DEC E ; Count characters +3240 14EB C8 RET Z ; End of string +3241 14EC 0A LD A,(BC) ; Get byte to output +3242 14ED CD 1B 0A CALL OUTC ; Output character in A +3243 14F0 FE 0D CP CR ; Return? +3244 14F2 CC 4C 0E CALL Z,DONULL ; Yes - Do nulls +3245 14F5 03 INC BC ; Next byte in string +3246 14F6 C3 EA 14 JP PRSLP ; More characters to output +3247 14F9 +3248 14F9 B7 TESTR: OR A ; Test if enough room +3249 14FA 0E .BYTE 0EH ; No garbage collection done +3250 14FB F1 GRBDON: POP AF ; Garbage collection done +3251 14FC F5 PUSH AF ; Save status +3252 14FD 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +3253 1500 EB EX DE,HL ; To DE +3254 1501 2A 73 31 LD HL,(STRBOT) ; Bottom of string area +3255 1504 2F CPL ; Negate length (Top down) +3256 1505 4F LD C,A ; -Length to BC +3257 1506 06 FF LD B,-1 ; BC = -ve length of string +3258 1508 09 ADD HL,BC ; Add to bottom of space in use +3259 1509 23 INC HL ; Plus one for 2's complement +3260 150A CD 0A 0A CALL CPDEHL ; Below string RAM area? +3261 150D DA 17 15 JP C,TESTOS ; Tidy up if not done else err +3262 1510 22 73 31 LD (STRBOT),HL ; Save new bottom of area +3263 1513 23 INC HL ; Point to first byte of string +3264 1514 EB EX DE,HL ; Address to DE +3265 1515 F1 POPAF: POP AF ; Throw away status push +3266 1516 C9 RET +3267 1517 +3268 1517 F1 TESTOS: POP AF ; Garbage collect been done? +3269 1518 1E 1A LD E,OS ; ?OS Error +3270 151A CA 56 07 JP Z,ERROR ; Yes - Not enough string apace +3271 151D BF CP A ; Flag garbage collect done +3272 151E F5 PUSH AF ; Save status +3273 151F 01 FB 14 LD BC,GRBDON ; Garbage collection done +3274 1522 C5 PUSH BC ; Save for RETurn +3275 1523 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer +3276 1526 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer +3277 1529 21 00 00 LD HL,0 +3278 152C E5 PUSH HL ; Flag no string found +3279 152D 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space +3280 1530 E5 PUSH HL ; Save bottom of string space +3281 1531 21 63 31 LD HL,TMSTPL ; Temporary string pool +3282 1534 EB GRBLP: EX DE,HL +3283 1535 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +3284 1538 EB EX DE,HL +3285 1539 CD 0A 0A CALL CPDEHL ; Temporary string pool done? +3286 153C 01 34 15 LD BC,GRBLP ; Loop until string pool done +3287 153F C2 88 15 JP NZ,STPOOL ; No - See if in string area +3288 1542 2A 86 31 LD HL,(PROGND) ; Start of simple variables +3289 1545 EB SMPVAR: EX DE,HL +3290 1546 2A 88 31 LD HL,(VAREND) ; End of simple variables +3291 1549 EB EX DE,HL +3292 154A CD 0A 0A CALL CPDEHL ; All simple strings done? +3293 154D CA 5B 15 JP Z,ARRLP ; Yes - Do string arrays +3294 1550 7E LD A,(HL) ; Get type of variable +3295 1551 23 INC HL +3296 1552 23 INC HL +3297 1553 B7 OR A ; "S" flag set if string +3298 1554 CD 8B 15 CALL STRADD ; See if string in string area +3299 1557 C3 45 15 JP SMPVAR ; Loop until simple ones done +3300 155A +3301 155A C1 GNXARY: POP BC ; Scrap address of this array +3302 155B EB ARRLP: EX DE,HL +3303 155C 2A 8A 31 LD HL,(ARREND) ; End of string arrays +3304 155F EB EX DE,HL +3305 1560 CD 0A 0A CALL CPDEHL ; All string arrays done? +3306 1563 CA B1 15 JP Z,SCNEND ; Yes - Move string if found +3307 1566 CD 38 1A CALL LOADFP ; Get array name to BCDE +3308 1569 7B LD A,E ; Get type of array +3309 156A E5 PUSH HL ; Save address of num of dim'ns +3310 156B 09 ADD HL,BC ; Start of next array +3311 156C B7 OR A ; Test type of array +3312 156D F2 5A 15 JP P,GNXARY ; Numeric array - Ignore it +3313 1570 22 75 31 LD (CUROPR),HL ; Save address of next array +3314 1573 E1 POP HL ; Get address of num of dim'ns +3315 1574 4E LD C,(HL) ; BC = Number of dimensions +3316 1575 06 00 LD B,0 +3317 1577 09 ADD HL,BC ; Two bytes per dimension size +3318 1578 09 ADD HL,BC +3319 1579 23 INC HL ; Plus one for number of dim'ns +3320 157A EB GRBARY: EX DE,HL +3321 157B 2A 75 31 LD HL,(CUROPR) ; Get address of next array +3322 157E EB EX DE,HL +3323 157F CD 0A 0A CALL CPDEHL ; Is this array finished? +3324 1582 CA 5B 15 JP Z,ARRLP ; Yes - Get next one +3325 1585 01 7A 15 LD BC,GRBARY ; Loop until array all done +3326 1588 C5 STPOOL: PUSH BC ; Save return address +3327 1589 F6 80 OR 80H ; Flag string type +3328 158B 7E STRADD: LD A,(HL) ; Get string length +3329 158C 23 INC HL +3330 158D 23 INC HL +3331 158E 5E LD E,(HL) ; Get LSB of string address +3332 158F 23 INC HL +3333 1590 56 LD D,(HL) ; Get MSB of string address +3334 1591 23 INC HL +3335 1592 F0 RET P ; Not a string - Return +3336 1593 B7 OR A ; Set flags on string length +3337 1594 C8 RET Z ; Null string - Return +3338 1595 44 LD B,H ; Save variable pointer +3339 1596 4D LD C,L +3340 1597 2A 73 31 LD HL,(STRBOT) ; Bottom of new area +3341 159A CD 0A 0A CALL CPDEHL ; String been done? +3342 159D 60 LD H,B ; Restore variable pointer +3343 159E 69 LD L,C +3344 159F D8 RET C ; String done - Ignore +3345 15A0 E1 POP HL ; Return address +3346 15A1 E3 EX (SP),HL ; Lowest available string area +3347 15A2 CD 0A 0A CALL CPDEHL ; String within string area? +3348 15A5 E3 EX (SP),HL ; Lowest available string area +3349 15A6 E5 PUSH HL ; Re-save return address +3350 15A7 60 LD H,B ; Restore variable pointer +3351 15A8 69 LD L,C +3352 15A9 D0 RET NC ; Outside string area - Ignore +3353 15AA C1 POP BC ; Get return , Throw 2 away +3354 15AB F1 POP AF ; +3355 15AC F1 POP AF ; +3356 15AD E5 PUSH HL ; Save variable pointer +3357 15AE D5 PUSH DE ; Save address of current +3358 15AF C5 PUSH BC ; Put back return address +3359 15B0 C9 RET ; Go to it +3360 15B1 +3361 15B1 D1 SCNEND: POP DE ; Addresses of strings +3362 15B2 E1 POP HL ; +3363 15B3 7D LD A,L ; HL = 0 if no more to do +3364 15B4 B4 OR H +3365 15B5 C8 RET Z ; No more to do - Return +3366 15B6 2B DEC HL +3367 15B7 46 LD B,(HL) ; MSB of address of string +3368 15B8 2B DEC HL +3369 15B9 4E LD C,(HL) ; LSB of address of string +3370 15BA E5 PUSH HL ; Save variable address +3371 15BB 2B DEC HL +3372 15BC 2B DEC HL +3373 15BD 6E LD L,(HL) ; HL = Length of string +3374 15BE 26 00 LD H,0 +3375 15C0 09 ADD HL,BC ; Address of end of string+1 +3376 15C1 50 LD D,B ; String address to DE +3377 15C2 59 LD E,C +3378 15C3 2B DEC HL ; Last byte in string +3379 15C4 44 LD B,H ; Address to BC +3380 15C5 4D LD C,L +3381 15C6 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +3382 15C9 CD 11 07 CALL MOVSTR ; Move string to new address +3383 15CC E1 POP HL ; Restore variable address +3384 15CD 71 LD (HL),C ; Save new LSB of address +3385 15CE 23 INC HL +3386 15CF 70 LD (HL),B ; Save new MSB of address +3387 15D0 69 LD L,C ; Next string area+1 to HL +3388 15D1 60 LD H,B +3389 15D2 2B DEC HL ; Next string area address +3390 15D3 C3 26 15 JP GARBLP ; Look for more strings +3391 15D6 +3392 15D6 C5 CONCAT: PUSH BC ; Save prec' opr & code string +3393 15D7 E5 PUSH HL ; +3394 15D8 2A 94 31 LD HL,(FPREG) ; Get first string +3395 15DB E3 EX (SP),HL ; Save first string +3396 15DC CD 90 10 CALL OPRND ; Get second string +3397 15DF E3 EX (SP),HL ; Restore first string +3398 15E0 CD 0B 10 CALL TSTSTR ; Make sure it's a string +3399 15E3 7E LD A,(HL) ; Get length of second string +3400 15E4 E5 PUSH HL ; Save first string +3401 15E5 2A 94 31 LD HL,(FPREG) ; Get second string +3402 15E8 E5 PUSH HL ; Save second string +3403 15E9 86 ADD A,(HL) ; Add length of second string +3404 15EA 1E 1C LD E,LS ; ?LS Error +3405 15EC DA 56 07 JP C,ERROR ; String too long - Error +3406 15EF CD 8F 14 CALL MKTMST ; Make temporary string +3407 15F2 D1 POP DE ; Get second string to DE +3408 15F3 CD 27 16 CALL GSTRDE ; Move to string pool if needed +3409 15F6 E3 EX (SP),HL ; Get first string +3410 15F7 CD 26 16 CALL GSTRHL ; Move to string pool if needed +3411 15FA E5 PUSH HL ; Save first string +3412 15FB 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address +3413 15FE EB EX DE,HL ; To DE +3414 15FF CD 0D 16 CALL SSTSA ; First string to string area +3415 1602 CD 0D 16 CALL SSTSA ; Second string to string area +3416 1605 21 25 10 LD HL,EVAL2 ; Return to evaluation loop +3417 1608 E3 EX (SP),HL ; Save return,get code string +3418 1609 E5 PUSH HL ; Save code string address +3419 160A C3 C0 14 JP TSTOPL ; To temporary string to pool +3420 160D +3421 160D E1 SSTSA: POP HL ; Return address +3422 160E E3 EX (SP),HL ; Get string block,save return +3423 160F 7E LD A,(HL) ; Get length of string +3424 1610 23 INC HL +3425 1611 23 INC HL +3426 1612 4E LD C,(HL) ; Get LSB of string address +3427 1613 23 INC HL +3428 1614 46 LD B,(HL) ; Get MSB of string address +3429 1615 6F LD L,A ; Length to L +3430 1616 2C TOSTRA: INC L ; INC - DECed after +3431 1617 2D TSALP: DEC L ; Count bytes moved +3432 1618 C8 RET Z ; End of string - Return +3433 1619 0A LD A,(BC) ; Get source +3434 161A 12 LD (DE),A ; Save destination +3435 161B 03 INC BC ; Next source +3436 161C 13 INC DE ; Next destination +3437 161D C3 17 16 JP TSALP ; Loop until string moved +3438 1620 +3439 1620 CD 0B 10 GETSTR: CALL TSTSTR ; Make sure it's a string +3440 1623 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string +3441 1626 EB GSTRHL: EX DE,HL ; Save DE +3442 1627 CD 41 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? +3443 162A EB EX DE,HL ; Restore DE +3444 162B C0 RET NZ ; No - Return +3445 162C D5 PUSH DE ; Save string +3446 162D 50 LD D,B ; String block address to DE +3447 162E 59 LD E,C +3448 162F 1B DEC DE ; Point to length +3449 1630 4E LD C,(HL) ; Get string length +3450 1631 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +3451 1634 CD 0A 0A CALL CPDEHL ; Last one in string area? +3452 1637 C2 3F 16 JP NZ,POPHL ; No - Return +3453 163A 47 LD B,A ; Clear B (A=0) +3454 163B 09 ADD HL,BC ; Remove string from str' area +3455 163C 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area +3456 163F E1 POPHL: POP HL ; Restore string +3457 1640 C9 RET +3458 1641 +3459 1641 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top +3460 1644 2B DEC HL ; Back +3461 1645 46 LD B,(HL) ; Get MSB of address +3462 1646 2B DEC HL ; Back +3463 1647 4E LD C,(HL) ; Get LSB of address +3464 1648 2B DEC HL ; Back +3465 1649 2B DEC HL ; Back +3466 164A CD 0A 0A CALL CPDEHL ; String last in string pool? +3467 164D C0 RET NZ ; Yes - Leave it +3468 164E 22 61 31 LD (TMSTPT),HL ; Save new string pool top +3469 1651 C9 RET +3470 1652 +3471 1652 01 D1 13 LEN: LD BC,PASSA ; To return integer A +3472 1655 C5 PUSH BC ; Save address +3473 1656 CD 20 16 GETLEN: CALL GETSTR ; Get string and its length +3474 1659 AF XOR A +3475 165A 57 LD D,A ; Clear D +3476 165B 32 5D 31 LD (TYPE),A ; Set type to numeric +3477 165E 7E LD A,(HL) ; Get length of string +3478 165F B7 OR A ; Set status flags +3479 1660 C9 RET +3480 1661 +3481 1661 01 D1 13 ASC: LD BC,PASSA ; To return integer A +3482 1664 C5 PUSH BC ; Save address +3483 1665 CD 56 16 GTFLNM: CALL GETLEN ; Get length of string +3484 1668 CA 61 0C JP Z,FCERR ; Null string - Error +3485 166B 23 INC HL +3486 166C 23 INC HL +3487 166D 5E LD E,(HL) ; Get LSB of address +3488 166E 23 INC HL +3489 166F 56 LD D,(HL) ; Get MSB of address +3490 1670 1A LD A,(DE) ; Get first byte of string +3491 1671 C9 RET +3492 1672 +3493 1672 3E 01 CHR: LD A,1 ; One character string +3494 1674 CD 8F 14 CALL MKTMST ; Make a temporary string +3495 1677 CD 6B 17 CALL MAKINT ; Make it integer A +3496 167A 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string +3497 167D 73 LD (HL),E ; Save character +3498 167E C1 TOPOOL: POP BC ; Clean up stack +3499 167F C3 C0 14 JP TSTOPL ; Temporary string to pool +3500 1682 +3501 1682 CD 1B 17 LEFT: CALL LFRGNM ; Get number and ending ")" +3502 1685 AF XOR A ; Start at first byte in string +3503 1686 E3 RIGHT1: EX (SP),HL ; Save code string,Get string +3504 1687 4F LD C,A ; Starting position in string +3505 1688 E5 MID1: PUSH HL ; Save string block address +3506 1689 7E LD A,(HL) ; Get length of string +3507 168A B8 CP B ; Compare with number given +3508 168B DA 90 16 JP C,ALLFOL ; All following bytes required +3509 168E 78 LD A,B ; Get new length +3510 168F 11 .BYTE 11H ; Skip "LD C,0" +3511 1690 0E 00 ALLFOL: LD C,0 ; First byte of string +3512 1692 C5 PUSH BC ; Save position in string +3513 1693 CD F9 14 CALL TESTR ; See if enough string space +3514 1696 C1 POP BC ; Get position in string +3515 1697 E1 POP HL ; Restore string block address +3516 1698 E5 PUSH HL ; And re-save it +3517 1699 23 INC HL +3518 169A 23 INC HL +3519 169B 46 LD B,(HL) ; Get LSB of address +3520 169C 23 INC HL +3521 169D 66 LD H,(HL) ; Get MSB of address +3522 169E 68 LD L,B ; HL = address of string +3523 169F 06 00 LD B,0 ; BC = starting address +3524 16A1 09 ADD HL,BC ; Point to that byte +3525 16A2 44 LD B,H ; BC = source string +3526 16A3 4D LD C,L +3527 16A4 CD 92 14 CALL CRTMST ; Create a string entry +3528 16A7 6F LD L,A ; Length of new string +3529 16A8 CD 16 16 CALL TOSTRA ; Move string to string area +3530 16AB D1 POP DE ; Clear stack +3531 16AC CD 27 16 CALL GSTRDE ; Move to string pool if needed +3532 16AF C3 C0 14 JP TSTOPL ; Temporary string to pool +3533 16B2 +3534 16B2 CD 1B 17 RIGHT: CALL LFRGNM ; Get number and ending ")" +3535 16B5 D1 POP DE ; Get string length +3536 16B6 D5 PUSH DE ; And re-save +3537 16B7 1A LD A,(DE) ; Get length +3538 16B8 90 SUB B ; Move back N bytes +3539 16B9 C3 86 16 JP RIGHT1 ; Go and get sub-string +3540 16BC +3541 16BC EB MID: EX DE,HL ; Get code string address +3542 16BD 7E LD A,(HL) ; Get next byte ',' or ")" +3543 16BE CD 20 17 CALL MIDNUM ; Get number supplied +3544 16C1 04 INC B ; Is it character zero? +3545 16C2 05 DEC B +3546 16C3 CA 61 0C JP Z,FCERR ; Yes - Error +3547 16C6 C5 PUSH BC ; Save starting position +3548 16C7 1E FF LD E,255 ; All of string +3549 16C9 FE 29 CP ')' ; Any length given? +3550 16CB CA D5 16 JP Z,RSTSTR ; No - Rest of string +3551 16CE CD 10 0A CALL CHKSYN ; Make sure ',' follows +3552 16D1 2C .BYTE ',' +3553 16D2 CD 68 17 CALL GETINT ; Get integer 0-255 +3554 16D5 CD 10 0A RSTSTR: CALL CHKSYN ; Make sure ")" follows +3555 16D8 29 .BYTE ")" +3556 16D9 F1 POP AF ; Restore starting position +3557 16DA E3 EX (SP),HL ; Get string,8ave code string +3558 16DB 01 88 16 LD BC,MID1 ; Continuation of MID$ routine +3559 16DE C5 PUSH BC ; Save for return +3560 16DF 3D DEC A ; Starting position-1 +3561 16E0 BE CP (HL) ; Compare with length +3562 16E1 06 00 LD B,0 ; Zero bytes length +3563 16E3 D0 RET NC ; Null string if start past end +3564 16E4 4F LD C,A ; Save starting position-1 +3565 16E5 7E LD A,(HL) ; Get length of string +3566 16E6 91 SUB C ; Subtract start +3567 16E7 BB CP E ; Enough string for it? +3568 16E8 47 LD B,A ; Save maximum length available +3569 16E9 D8 RET C ; Truncate string if needed +3570 16EA 43 LD B,E ; Set specified length +3571 16EB C9 RET ; Go and create string +3572 16EC +3573 16EC CD 56 16 VAL: CALL GETLEN ; Get length of string +3574 16EF CA 09 18 JP Z,RESZER ; Result zero +3575 16F2 5F LD E,A ; Save length +3576 16F3 23 INC HL +3577 16F4 23 INC HL +3578 16F5 7E LD A,(HL) ; Get LSB of address +3579 16F6 23 INC HL +3580 16F7 66 LD H,(HL) ; Get MSB of address +3581 16F8 6F LD L,A ; HL = String address +3582 16F9 E5 PUSH HL ; Save string address +3583 16FA 19 ADD HL,DE +3584 16FB 46 LD B,(HL) ; Get end of string+1 byte +3585 16FC 72 LD (HL),D ; Zero it to terminate +3586 16FD E3 EX (SP),HL ; Save string end,get start +3587 16FE C5 PUSH BC ; Save end+1 byte +3588 16FF 7E LD A,(HL) ; Get starting byte +3589 1700 FE 24 CP '$' ; Hex number indicated? [function added] +3590 1702 C2 0A 17 JP NZ,VAL1 +3591 1705 CD 34 1F CALL HEXTFP ; Convert Hex to FPREG +3592 1708 18 0D JR VAL3 +3593 170A FE 25 VAL1: CP '%' ; Binary number indicated? [function added] +3594 170C C2 14 17 JP NZ,VAL2 +3595 170F CD A4 1F CALL BINTFP ; Convert Bin to FPREG +3596 1712 18 03 JR VAL3 +3597 1714 CD F0 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP +3598 1717 C1 VAL3: POP BC ; Restore end+1 byte +3599 1718 E1 POP HL ; Restore end+1 address +3600 1719 70 LD (HL),B ; Put back original byte +3601 171A C9 RET +3602 171B +3603 171B EB LFRGNM: EX DE,HL ; Code string address to HL +3604 171C CD 10 0A CALL CHKSYN ; Make sure ")" follows +3605 171F 29 .BYTE ")" +3606 1720 C1 MIDNUM: POP BC ; Get return address +3607 1721 D1 POP DE ; Get number supplied +3608 1722 C5 PUSH BC ; Re-save return address +3609 1723 43 LD B,E ; Number to B +3610 1724 C9 RET +3611 1725 +3612 1725 CD 6B 17 INP: CALL MAKINT ; Make it integer A +3613 1728 32 EF 30 LD (INPORT),A ; Set input port +3614 172B CD EE 30 CALL INPSUB ; Get input from port +3615 172E C3 D1 13 JP PASSA ; Return integer A +3616 1731 +3617 1731 CD 55 17 POUT: CALL SETIO ; Set up port number +3618 1734 C3 B6 30 JP OUTSUB ; Output data and return +3619 1737 +3620 1737 CD 55 17 WAIT: CALL SETIO ; Set up port number +3621 173A F5 PUSH AF ; Save AND mask +3622 173B 1E 00 LD E,0 ; Assume zero if none given +3623 173D 2B DEC HL ; DEC 'cos GETCHR INCs +3624 173E CD 9A 0B CALL GETCHR ; Get next character +3625 1741 CA 4B 17 JP Z,NOXOR ; No XOR byte given +3626 1744 CD 10 0A CALL CHKSYN ; Make sure ',' follows +3627 1747 2C .BYTE ',' +3628 1748 CD 68 17 CALL GETINT ; Get integer 0-255 to XOR with +3629 174B C1 NOXOR: POP BC ; Restore AND mask +3630 174C CD EE 30 WAITLP: CALL INPSUB ; Get input +3631 174F AB XOR E ; Flip selected bits +3632 1750 A0 AND B ; Result non-zero? +3633 1751 CA 4C 17 JP Z,WAITLP ; No = keep waiting +3634 1754 C9 RET +3635 1755 +3636 1755 CD 68 17 SETIO: CALL GETINT ; Get integer 0-255 +3637 1758 32 EF 30 LD (INPORT),A ; Set input port +3638 175B 32 B7 30 LD (OTPORT),A ; Set output port +3639 175E CD 10 0A CALL CHKSYN ; Make sure ',' follows +3640 1761 2C .BYTE ',' +3641 1762 C3 68 17 JP GETINT ; Get integer 0-255 and return +3642 1765 +3643 1765 CD 9A 0B FNDNUM: CALL GETCHR ; Get next character +3644 1768 CD 07 10 GETINT: CALL GETNUM ; Get a number from 0 to 255 +3645 176B CD 46 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 +3646 176E 7A LD A,D ; Get MSB of number +3647 176F B7 OR A ; Zero? +3648 1770 C2 61 0C JP NZ,FCERR ; No - Error +3649 1773 2B DEC HL ; DEC 'cos GETCHR INCs +3650 1774 CD 9A 0B CALL GETCHR ; Get next character +3651 1777 7B LD A,E ; Get number to A +3652 1778 C9 RET +3653 1779 +3654 1779 CD 4C 0C PEEK: CALL DEINT ; Get memory address +3655 177C 1A LD A,(DE) ; Get byte in memory +3656 177D C3 D1 13 JP PASSA ; Return integer A +3657 1780 +3658 1780 CD 07 10 POKE: CALL GETNUM ; Get memory address +3659 1783 CD 4C 0C CALL DEINT ; Get integer -32768 to 3276 +3660 1786 D5 PUSH DE ; Save memory address +3661 1787 CD 10 0A CALL CHKSYN ; Make sure ',' follows +3662 178A 2C .BYTE ',' +3663 178B CD 68 17 CALL GETINT ; Get integer 0-255 +3664 178E D1 POP DE ; Restore memory address +3665 178F 12 LD (DE),A ; Load it into memory +3666 1790 C9 RET +3667 1791 +3668 1791 21 67 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG +3669 1794 CD 38 1A ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE +3670 1797 C3 A3 17 JP FPADD ; Add BCDE to FPREG +3671 179A +3672 179A CD 38 1A SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL +3673 179D 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3674 179E C1 PSUB: POP BC ; Get FP number from stack +3675 179F D1 POP DE +3676 17A0 CD 12 1A SUBCDE: CALL INVSGN ; Negate FPREG +3677 17A3 78 FPADD: LD A,B ; Get FP exponent +3678 17A4 B7 OR A ; Is number zero? +3679 17A5 C8 RET Z ; Yes - Nothing to add +3680 17A6 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent +3681 17A9 B7 OR A ; Is this number zero? +3682 17AA CA 2A 1A JP Z,FPBCDE ; Yes - Move BCDE to FPREG +3683 17AD 90 SUB B ; BCDE number larger? +3684 17AE D2 BD 17 JP NC,NOSWAP ; No - Don't swap them +3685 17B1 2F CPL ; Two's complement +3686 17B2 3C INC A ; FP exponent +3687 17B3 EB EX DE,HL +3688 17B4 CD 1A 1A CALL STAKFP ; Put FPREG on stack +3689 17B7 EB EX DE,HL +3690 17B8 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +3691 17BB C1 POP BC ; Restore number from stack +3692 17BC D1 POP DE +3693 17BD FE 19 NOSWAP: CP 24+1 ; Second number insignificant? +3694 17BF D0 RET NC ; Yes - First number is result +3695 17C0 F5 PUSH AF ; Save number of bits to scale +3696 17C1 CD 4F 1A CALL SIGNS ; Set MSBs & sign of result +3697 17C4 67 LD H,A ; Save sign of result +3698 17C5 F1 POP AF ; Restore scaling factor +3699 17C6 CD 68 18 CALL SCALE ; Scale BCDE to same exponent +3700 17C9 B4 OR H ; Result to be positive? +3701 17CA 21 94 31 LD HL,FPREG ; Point to FPREG +3702 17CD F2 E3 17 JP P,MINCDE ; No - Subtract FPREG from CDE +3703 17D0 CD 48 18 CALL PLUCDE ; Add FPREG to CDE +3704 17D3 D2 29 18 JP NC,RONDUP ; No overflow - Round it up +3705 17D6 23 INC HL ; Point to exponent +3706 17D7 34 INC (HL) ; Increment it +3707 17D8 CA 51 07 JP Z,OVERR ; Number overflowed - Error +3708 17DB 2E 01 LD L,1 ; 1 bit to shift right +3709 17DD CD 7E 18 CALL SHRT1 ; Shift result right +3710 17E0 C3 29 18 JP RONDUP ; Round it up +3711 17E3 +3712 17E3 AF MINCDE: XOR A ; Clear A and carry +3713 17E4 90 SUB B ; Negate exponent +3714 17E5 47 LD B,A ; Re-save exponent +3715 17E6 7E LD A,(HL) ; Get LSB of FPREG +3716 17E7 9B SBC A, E ; Subtract LSB of BCDE +3717 17E8 5F LD E,A ; Save LSB of BCDE +3718 17E9 23 INC HL +3719 17EA 7E LD A,(HL) ; Get NMSB of FPREG +3720 17EB 9A SBC A,D ; Subtract NMSB of BCDE +3721 17EC 57 LD D,A ; Save NMSB of BCDE +3722 17ED 23 INC HL +3723 17EE 7E LD A,(HL) ; Get MSB of FPREG +3724 17EF 99 SBC A,C ; Subtract MSB of BCDE +3725 17F0 4F LD C,A ; Save MSB of BCDE +3726 17F1 DC 54 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive +3727 17F4 +3728 17F4 68 BNORM: LD L,B ; L = Exponent +3729 17F5 63 LD H,E ; H = LSB +3730 17F6 AF XOR A +3731 17F7 47 BNRMLP: LD B,A ; Save bit count +3732 17F8 79 LD A,C ; Get MSB +3733 17F9 B7 OR A ; Is it zero? +3734 17FA C2 16 18 JP NZ,PNORM ; No - Do it bit at a time +3735 17FD 4A LD C,D ; MSB = NMSB +3736 17FE 54 LD D,H ; NMSB= LSB +3737 17FF 65 LD H,L ; LSB = VLSB +3738 1800 6F LD L,A ; VLSB= 0 +3739 1801 78 LD A,B ; Get exponent +3740 1802 D6 08 SUB 8 ; Count 8 bits +3741 1804 FE E0 CP -24-8 ; Was number zero? +3742 1806 C2 F7 17 JP NZ,BNRMLP ; No - Keep normalising +3743 1809 AF RESZER: XOR A ; Result is zero +3744 180A 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero +3745 180D C9 RET +3746 180E +3747 180E 05 NORMAL: DEC B ; Count bits +3748 180F 29 ADD HL,HL ; Shift HL left +3749 1810 7A LD A,D ; Get NMSB +3750 1811 17 RLA ; Shift left with last bit +3751 1812 57 LD D,A ; Save NMSB +3752 1813 79 LD A,C ; Get MSB +3753 1814 8F ADC A,A ; Shift left with last bit +3754 1815 4F LD C,A ; Save MSB +3755 1816 F2 0E 18 PNORM: JP P,NORMAL ; Not done - Keep going +3756 1819 78 LD A,B ; Number of bits shifted +3757 181A 5C LD E,H ; Save HL in EB +3758 181B 45 LD B,L +3759 181C B7 OR A ; Any shifting done? +3760 181D CA 29 18 JP Z,RONDUP ; No - Round it up +3761 1820 21 97 31 LD HL,FPEXP ; Point to exponent +3762 1823 86 ADD A,(HL) ; Add shifted bits +3763 1824 77 LD (HL),A ; Re-save exponent +3764 1825 D2 09 18 JP NC,RESZER ; Underflow - Result is zero +3765 1828 C8 RET Z ; Result is zero +3766 1829 78 RONDUP: LD A,B ; Get VLSB of number +3767 182A 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent +3768 182D B7 OR A ; Any rounding? +3769 182E FC 3B 18 CALL M,FPROND ; Yes - Round number up +3770 1831 46 LD B,(HL) ; B = Exponent +3771 1832 23 INC HL +3772 1833 7E LD A,(HL) ; Get sign of result +3773 1834 E6 80 AND 10000000B ; Only bit 7 needed +3774 1836 A9 XOR C ; Set correct sign +3775 1837 4F LD C,A ; Save correct sign in number +3776 1838 C3 2A 1A JP FPBCDE ; Move BCDE to FPREG +3777 183B +3778 183B 1C FPROND: INC E ; Round LSB +3779 183C C0 RET NZ ; Return if ok +3780 183D 14 INC D ; Round NMSB +3781 183E C0 RET NZ ; Return if ok +3782 183F 0C INC C ; Round MSB +3783 1840 C0 RET NZ ; Return if ok +3784 1841 0E 80 LD C,80H ; Set normal value +3785 1843 34 INC (HL) ; Increment exponent +3786 1844 C0 RET NZ ; Return if ok +3787 1845 C3 51 07 JP OVERR ; Overflow error +3788 1848 +3789 1848 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG +3790 1849 83 ADD A,E ; Add LSB of BCDE +3791 184A 5F LD E,A ; Save LSB of BCDE +3792 184B 23 INC HL +3793 184C 7E LD A,(HL) ; Get NMSB of FPREG +3794 184D 8A ADC A,D ; Add NMSB of BCDE +3795 184E 57 LD D,A ; Save NMSB of BCDE +3796 184F 23 INC HL +3797 1850 7E LD A,(HL) ; Get MSB of FPREG +3798 1851 89 ADC A,C ; Add MSB of BCDE +3799 1852 4F LD C,A ; Save MSB of BCDE +3800 1853 C9 RET +3801 1854 +3802 1854 21 98 31 COMPL: LD HL,SGNRES ; Sign of result +3803 1857 7E LD A,(HL) ; Get sign of result +3804 1858 2F CPL ; Negate it +3805 1859 77 LD (HL),A ; Put it back +3806 185A AF XOR A +3807 185B 6F LD L,A ; Set L to zero +3808 185C 90 SUB B ; Negate exponent,set carry +3809 185D 47 LD B,A ; Re-save exponent +3810 185E 7D LD A,L ; Load zero +3811 185F 9B SBC A,E ; Negate LSB +3812 1860 5F LD E,A ; Re-save LSB +3813 1861 7D LD A,L ; Load zero +3814 1862 9A SBC A,D ; Negate NMSB +3815 1863 57 LD D,A ; Re-save NMSB +3816 1864 7D LD A,L ; Load zero +3817 1865 99 SBC A,C ; Negate MSB +3818 1866 4F LD C,A ; Re-save MSB +3819 1867 C9 RET +3820 1868 +3821 1868 06 00 SCALE: LD B,0 ; Clear underflow +3822 186A D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? +3823 186C DA 77 18 JP C,SHRITE ; No - Shift right A bits +3824 186F 43 LD B,E ; <- Shift +3825 1870 5A LD E,D ; <- right +3826 1871 51 LD D,C ; <- eight +3827 1872 0E 00 LD C,0 ; <- bits +3828 1874 C3 6A 18 JP SCALLP ; More bits to shift +3829 1877 +3830 1877 C6 09 SHRITE: ADD A,8+1 ; Adjust count +3831 1879 6F LD L,A ; Save bits to shift +3832 187A AF SHRLP: XOR A ; Flag for all done +3833 187B 2D DEC L ; All shifting done? +3834 187C C8 RET Z ; Yes - Return +3835 187D 79 LD A,C ; Get MSB +3836 187E 1F SHRT1: RRA ; Shift it right +3837 187F 4F LD C,A ; Re-save +3838 1880 7A LD A,D ; Get NMSB +3839 1881 1F RRA ; Shift right with last bit +3840 1882 57 LD D,A ; Re-save it +3841 1883 7B LD A,E ; Get LSB +3842 1884 1F RRA ; Shift right with last bit +3843 1885 5F LD E,A ; Re-save it +3844 1886 78 LD A,B ; Get underflow +3845 1887 1F RRA ; Shift right with last bit +3846 1888 47 LD B,A ; Re-save underflow +3847 1889 C3 7A 18 JP SHRLP ; More bits to do +3848 188C +3849 188C 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 +3850 1890 +3851 1890 03 LOGTAB: .BYTE 3 ; Table used by LOG +3852 1891 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 +3853 1895 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 +3854 1899 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 +3855 189D +3856 189D CD E9 19 LOG: CALL TSTSGN ; Test sign of value +3857 18A0 B7 OR A +3858 18A1 EA 61 0C JP PE,FCERR ; ?FC Error if <= zero +3859 18A4 21 97 31 LD HL,FPEXP ; Point to exponent +3860 18A7 7E LD A,(HL) ; Get exponent +3861 18A8 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) +3862 18AB 11 F3 04 LD DE,04F3H +3863 18AE 90 SUB B ; Scale value to be < 1 +3864 18AF F5 PUSH AF ; Save scale factor +3865 18B0 70 LD (HL),B ; Save new exponent +3866 18B1 D5 PUSH DE ; Save SQR(1/2) +3867 18B2 C5 PUSH BC +3868 18B3 CD A3 17 CALL FPADD ; Add SQR(1/2) to value +3869 18B6 C1 POP BC ; Restore SQR(1/2) +3870 18B7 D1 POP DE +3871 18B8 04 INC B ; Make it SQR(2) +3872 18B9 CD 3F 19 CALL DVBCDE ; Divide by SQR(2) +3873 18BC 21 8C 18 LD HL,UNITY ; Point to 1. +3874 18BF CD 9A 17 CALL SUBPHL ; Subtract FPREG from 1 +3875 18C2 21 90 18 LD HL,LOGTAB ; Coefficient table +3876 18C5 CD 31 1D CALL SUMSER ; Evaluate sum of series +3877 18C8 01 80 80 LD BC,8080H ; BCDE = -0.5 +3878 18CB 11 00 00 LD DE,0000H +3879 18CE CD A3 17 CALL FPADD ; Subtract 0.5 from FPREG +3880 18D1 F1 POP AF ; Restore scale factor +3881 18D2 CD 64 1B CALL RSCALE ; Re-scale number +3882 18D5 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) +3883 18D8 11 18 72 LD DE,7218H +3884 18DB 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3885 18DC +3886 18DC C1 MULT: POP BC ; Get number from stack +3887 18DD D1 POP DE +3888 18DE CD E9 19 FPMULT: CALL TSTSGN ; Test sign of FPREG +3889 18E1 C8 RET Z ; Return zero if zero +3890 18E2 2E 00 LD L,0 ; Flag add exponents +3891 18E4 CD A7 19 CALL ADDEXP ; Add exponents +3892 18E7 79 LD A,C ; Get MSB of multiplier +3893 18E8 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier +3894 18EB EB EX DE,HL +3895 18EC 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier +3896 18EF 01 00 00 LD BC,0 ; Partial product (BCDE) = zero +3897 18F2 50 LD D,B +3898 18F3 58 LD E,B +3899 18F4 21 F4 17 LD HL,BNORM ; Address of normalise +3900 18F7 E5 PUSH HL ; Save for return +3901 18F8 21 00 19 LD HL,MULT8 ; Address of 8 bit multiply +3902 18FB E5 PUSH HL ; Save for NMSB,MSB +3903 18FC E5 PUSH HL ; +3904 18FD 21 94 31 LD HL,FPREG ; Point to number +3905 1900 7E MULT8: LD A,(HL) ; Get LSB of number +3906 1901 23 INC HL ; Point to NMSB +3907 1902 B7 OR A ; Test LSB +3908 1903 CA 2C 19 JP Z,BYTSFT ; Zero - shift to next byte +3909 1906 E5 PUSH HL ; Save address of number +3910 1907 2E 08 LD L,8 ; 8 bits to multiply by +3911 1909 1F MUL8LP: RRA ; Shift LSB right +3912 190A 67 LD H,A ; Save LSB +3913 190B 79 LD A,C ; Get MSB +3914 190C D2 1A 19 JP NC,NOMADD ; Bit was zero - Don't add +3915 190F E5 PUSH HL ; Save LSB and count +3916 1910 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB +3917 1913 19 ADD HL,DE ; Add NMSB and LSB +3918 1914 EB EX DE,HL ; Leave sum in DE +3919 1915 E1 POP HL ; Restore MSB and count +3920 1916 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier +3921 1919 89 ADC A,C ; Add MSB +3922 191A 1F NOMADD: RRA ; Shift MSB right +3923 191B 4F LD C,A ; Re-save MSB +3924 191C 7A LD A,D ; Get NMSB +3925 191D 1F RRA ; Shift NMSB right +3926 191E 57 LD D,A ; Re-save NMSB +3927 191F 7B LD A,E ; Get LSB +3928 1920 1F RRA ; Shift LSB right +3929 1921 5F LD E,A ; Re-save LSB +3930 1922 78 LD A,B ; Get VLSB +3931 1923 1F RRA ; Shift VLSB right +3932 1924 47 LD B,A ; Re-save VLSB +3933 1925 2D DEC L ; Count bits multiplied +3934 1926 7C LD A,H ; Get LSB of multiplier +3935 1927 C2 09 19 JP NZ,MUL8LP ; More - Do it +3936 192A E1 POPHRT: POP HL ; Restore address of number +3937 192B C9 RET +3938 192C +3939 192C 43 BYTSFT: LD B,E ; Shift partial product left +3940 192D 5A LD E,D +3941 192E 51 LD D,C +3942 192F 4F LD C,A +3943 1930 C9 RET +3944 1931 +3945 1931 CD 1A 1A DIV10: CALL STAKFP ; Save FPREG on stack +3946 1934 01 20 84 LD BC,8420H ; BCDE = 10. +3947 1937 11 00 00 LD DE,0000H +3948 193A CD 2A 1A CALL FPBCDE ; Move 10 to FPREG +3949 193D +3950 193D C1 DIV: POP BC ; Get number from stack +3951 193E D1 POP DE +3952 193F CD E9 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG +3953 1942 CA 45 07 JP Z,DZERR ; Error if division by zero +3954 1945 2E FF LD L,-1 ; Flag subtract exponents +3955 1947 CD A7 19 CALL ADDEXP ; Subtract exponents +3956 194A 34 INC (HL) ; Add 2 to exponent to adjust +3957 194B 34 INC (HL) +3958 194C 2B DEC HL ; Point to MSB +3959 194D 7E LD A,(HL) ; Get MSB of dividend +3960 194E 32 C2 30 LD (DIV3),A ; Save for subtraction +3961 1951 2B DEC HL +3962 1952 7E LD A,(HL) ; Get NMSB of dividend +3963 1953 32 BE 30 LD (DIV2),A ; Save for subtraction +3964 1956 2B DEC HL +3965 1957 7E LD A,(HL) ; Get MSB of dividend +3966 1958 32 BA 30 LD (DIV1),A ; Save for subtraction +3967 195B 41 LD B,C ; Get MSB +3968 195C EB EX DE,HL ; NMSB,LSB to HL +3969 195D AF XOR A +3970 195E 4F LD C,A ; Clear MSB of quotient +3971 195F 57 LD D,A ; Clear NMSB of quotient +3972 1960 5F LD E,A ; Clear LSB of quotient +3973 1961 32 C5 30 LD (DIV4),A ; Clear overflow count +3974 1964 E5 DIVLP: PUSH HL ; Save divisor +3975 1965 C5 PUSH BC +3976 1966 7D LD A,L ; Get LSB of number +3977 1967 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend +3978 196A DE 00 SBC A,0 ; Count for overflows +3979 196C 3F CCF +3980 196D D2 77 19 JP NC,RESDIV ; Restore divisor if borrow +3981 1970 32 C5 30 LD (DIV4),A ; Re-save overflow count +3982 1973 F1 POP AF ; Scrap divisor +3983 1974 F1 POP AF +3984 1975 37 SCF ; Set carry to +3985 1976 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" +3986 1977 +3987 1977 C1 RESDIV: POP BC ; Restore divisor +3988 1978 E1 POP HL +3989 1979 79 LD A,C ; Get MSB of quotient +3990 197A 3C INC A +3991 197B 3D DEC A +3992 197C 1F RRA ; Bit 0 to bit 7 +3993 197D FA 2A 18 JP M,RONDB ; Done - Normalise result +3994 1980 17 RLA ; Restore carry +3995 1981 7B LD A,E ; Get LSB of quotient +3996 1982 17 RLA ; Double it +3997 1983 5F LD E,A ; Put it back +3998 1984 7A LD A,D ; Get NMSB of quotient +3999 1985 17 RLA ; Double it +4000 1986 57 LD D,A ; Put it back +4001 1987 79 LD A,C ; Get MSB of quotient +4002 1988 17 RLA ; Double it +4003 1989 4F LD C,A ; Put it back +4004 198A 29 ADD HL,HL ; Double NMSB,LSB of divisor +4005 198B 78 LD A,B ; Get MSB of divisor +4006 198C 17 RLA ; Double it +4007 198D 47 LD B,A ; Put it back +4008 198E 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient +4009 1991 17 RLA ; Double it +4010 1992 32 C5 30 LD (DIV4),A ; Put it back +4011 1995 79 LD A,C ; Get MSB of quotient +4012 1996 B2 OR D ; Merge NMSB +4013 1997 B3 OR E ; Merge LSB +4014 1998 C2 64 19 JP NZ,DIVLP ; Not done - Keep dividing +4015 199B E5 PUSH HL ; Save divisor +4016 199C 21 97 31 LD HL,FPEXP ; Point to exponent +4017 199F 35 DEC (HL) ; Divide by 2 +4018 19A0 E1 POP HL ; Restore divisor +4019 19A1 C2 64 19 JP NZ,DIVLP ; Ok - Keep going +4020 19A4 C3 51 07 JP OVERR ; Overflow error +4021 19A7 +4022 19A7 78 ADDEXP: LD A,B ; Get exponent of dividend +4023 19A8 B7 OR A ; Test it +4024 19A9 CA CB 19 JP Z,OVTST3 ; Zero - Result zero +4025 19AC 7D LD A,L ; Get add/subtract flag +4026 19AD 21 97 31 LD HL,FPEXP ; Point to exponent +4027 19B0 AE XOR (HL) ; Add or subtract it +4028 19B1 80 ADD A,B ; Add the other exponent +4029 19B2 47 LD B,A ; Save new exponent +4030 19B3 1F RRA ; Test exponent for overflow +4031 19B4 A8 XOR B +4032 19B5 78 LD A,B ; Get exponent +4033 19B6 F2 CA 19 JP P,OVTST2 ; Positive - Test for overflow +4034 19B9 C6 80 ADD A,80H ; Add excess 128 +4035 19BB 77 LD (HL),A ; Save new exponent +4036 19BC CA 2A 19 JP Z,POPHRT ; Zero - Result zero +4037 19BF CD 4F 1A CALL SIGNS ; Set MSBs and sign of result +4038 19C2 77 LD (HL),A ; Save new exponent +4039 19C3 2B DEC HL ; Point to MSB +4040 19C4 C9 RET +4041 19C5 +4042 19C5 CD E9 19 OVTST1: CALL TSTSGN ; Test sign of FPREG +4043 19C8 2F CPL ; Invert sign +4044 19C9 E1 POP HL ; Clean up stack +4045 19CA B7 OVTST2: OR A ; Test if new exponent zero +4046 19CB E1 OVTST3: POP HL ; Clear off return address +4047 19CC F2 09 18 JP P,RESZER ; Result zero +4048 19CF C3 51 07 JP OVERR ; Overflow error +4049 19D2 +4050 19D2 CD 35 1A MLSP10: CALL BCDEFP ; Move FPREG to BCDE +4051 19D5 78 LD A,B ; Get exponent +4052 19D6 B7 OR A ; Is it zero? +4053 19D7 C8 RET Z ; Yes - Result is zero +4054 19D8 C6 02 ADD A,2 ; Multiply by 4 +4055 19DA DA 51 07 JP C,OVERR ; Overflow - ?OV Error +4056 19DD 47 LD B,A ; Re-save exponent +4057 19DE CD A3 17 CALL FPADD ; Add BCDE to FPREG (Times 5) +4058 19E1 21 97 31 LD HL,FPEXP ; Point to exponent +4059 19E4 34 INC (HL) ; Double number (Times 10) +4060 19E5 C0 RET NZ ; Ok - Return +4061 19E6 C3 51 07 JP OVERR ; Overflow error +4062 19E9 +4063 19E9 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG +4064 19EC B7 OR A +4065 19ED C8 RET Z ; RETurn if number is zero +4066 19EE 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG +4067 19F1 FE .BYTE 0FEH ; Test sign +4068 19F2 2F RETREL: CPL ; Invert sign +4069 19F3 17 RLA ; Sign bit to carry +4070 19F4 9F FLGDIF: SBC A,A ; Carry to all bits of A +4071 19F5 C0 RET NZ ; Return -1 if negative +4072 19F6 3C INC A ; Bump to +1 +4073 19F7 C9 RET ; Positive - Return +1 +4074 19F8 +4075 19F8 CD E9 19 SGN: CALL TSTSGN ; Test sign of FPREG +4076 19FB 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent +4077 19FD 11 00 00 LD DE,0 ; Zero NMSB and LSB +4078 1A00 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent +4079 1A03 4F LD C,A ; CDE = MSB,NMSB and LSB +4080 1A04 70 LD (HL),B ; Save exponent +4081 1A05 06 00 LD B,0 ; CDE = integer to normalise +4082 1A07 23 INC HL ; Point to sign of result +4083 1A08 36 80 LD (HL),80H ; Set sign of result +4084 1A0A 17 RLA ; Carry = sign of integer +4085 1A0B C3 F1 17 JP CONPOS ; Set sign of result +4086 1A0E +4087 1A0E CD E9 19 ABS: CALL TSTSGN ; Test sign of FPREG +4088 1A11 F0 RET P ; Return if positive +4089 1A12 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB +4090 1A15 7E LD A,(HL) ; Get sign of mantissa +4091 1A16 EE 80 XOR 80H ; Invert sign of mantissa +4092 1A18 77 LD (HL),A ; Re-save sign of mantissa +4093 1A19 C9 RET +4094 1A1A +4095 1A1A EB STAKFP: EX DE,HL ; Save code string address +4096 1A1B 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG +4097 1A1E E3 EX (SP),HL ; Stack them,get return +4098 1A1F E5 PUSH HL ; Re-save return +4099 1A20 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG +4100 1A23 E3 EX (SP),HL ; Stack them,get return +4101 1A24 E5 PUSH HL ; Re-save return +4102 1A25 EB EX DE,HL ; Restore code string address +4103 1A26 C9 RET +4104 1A27 +4105 1A27 CD 38 1A PHLTFP: CALL LOADFP ; Number at HL to BCDE +4106 1A2A EB FPBCDE: EX DE,HL ; Save code string address +4107 1A2B 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number +4108 1A2E 60 LD H,B ; Exponent of number +4109 1A2F 69 LD L,C ; MSB of number +4110 1A30 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent +4111 1A33 EB EX DE,HL ; Restore code string address +4112 1A34 C9 RET +4113 1A35 +4114 1A35 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG +4115 1A38 5E LOADFP: LD E,(HL) ; Get LSB of number +4116 1A39 23 INC HL +4117 1A3A 56 LD D,(HL) ; Get NMSB of number +4118 1A3B 23 INC HL +4119 1A3C 4E LD C,(HL) ; Get MSB of number +4120 1A3D 23 INC HL +4121 1A3E 46 LD B,(HL) ; Get exponent of number +4122 1A3F 23 INCHL: INC HL ; Used for conditional "INC HL" +4123 1A40 C9 RET +4124 1A41 +4125 1A41 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG +4126 1A44 06 04 DETHL4: LD B,4 ; 4 bytes to move +4127 1A46 1A DETHLB: LD A,(DE) ; Get source +4128 1A47 77 LD (HL),A ; Save destination +4129 1A48 13 INC DE ; Next source +4130 1A49 23 INC HL ; Next destination +4131 1A4A 05 DEC B ; Count bytes +4132 1A4B C2 46 1A JP NZ,DETHLB ; Loop if more +4133 1A4E C9 RET +4134 1A4F +4135 1A4F 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG +4136 1A52 7E LD A,(HL) ; Get MSB +4137 1A53 07 RLCA ; Old sign to carry +4138 1A54 37 SCF ; Set MSBit +4139 1A55 1F RRA ; Set MSBit of MSB +4140 1A56 77 LD (HL),A ; Save new MSB +4141 1A57 3F CCF ; Complement sign +4142 1A58 1F RRA ; Old sign to carry +4143 1A59 23 INC HL +4144 1A5A 23 INC HL +4145 1A5B 77 LD (HL),A ; Set sign of result +4146 1A5C 79 LD A,C ; Get MSB +4147 1A5D 07 RLCA ; Old sign to carry +4148 1A5E 37 SCF ; Set MSBit +4149 1A5F 1F RRA ; Set MSBit of MSB +4150 1A60 4F LD C,A ; Save MSB +4151 1A61 1F RRA +4152 1A62 AE XOR (HL) ; New sign of result +4153 1A63 C9 RET +4154 1A64 +4155 1A64 78 CMPNUM: LD A,B ; Get exponent of number +4156 1A65 B7 OR A +4157 1A66 CA E9 19 JP Z,TSTSGN ; Zero - Test sign of FPREG +4158 1A69 21 F2 19 LD HL,RETREL ; Return relation routine +4159 1A6C E5 PUSH HL ; Save for return +4160 1A6D CD E9 19 CALL TSTSGN ; Test sign of FPREG +4161 1A70 79 LD A,C ; Get MSB of number +4162 1A71 C8 RET Z ; FPREG zero - Number's MSB +4163 1A72 21 96 31 LD HL,FPREG+2 ; MSB of FPREG +4164 1A75 AE XOR (HL) ; Combine signs +4165 1A76 79 LD A,C ; Get MSB of number +4166 1A77 F8 RET M ; Exit if signs different +4167 1A78 CD 7E 1A CALL CMPFP ; Compare FP numbers +4168 1A7B 1F RRA ; Get carry to sign +4169 1A7C A9 XOR C ; Combine with MSB of number +4170 1A7D C9 RET +4171 1A7E +4172 1A7E 23 CMPFP: INC HL ; Point to exponent +4173 1A7F 78 LD A,B ; Get exponent +4174 1A80 BE CP (HL) ; Compare exponents +4175 1A81 C0 RET NZ ; Different +4176 1A82 2B DEC HL ; Point to MBS +4177 1A83 79 LD A,C ; Get MSB +4178 1A84 BE CP (HL) ; Compare MSBs +4179 1A85 C0 RET NZ ; Different +4180 1A86 2B DEC HL ; Point to NMSB +4181 1A87 7A LD A,D ; Get NMSB +4182 1A88 BE CP (HL) ; Compare NMSBs +4183 1A89 C0 RET NZ ; Different +4184 1A8A 2B DEC HL ; Point to LSB +4185 1A8B 7B LD A,E ; Get LSB +4186 1A8C 96 SUB (HL) ; Compare LSBs +4187 1A8D C0 RET NZ ; Different +4188 1A8E E1 POP HL ; Drop RETurn +4189 1A8F E1 POP HL ; Drop another RETurn +4190 1A90 C9 RET +4191 1A91 +4192 1A91 47 FPINT: LD B,A ; <- Move +4193 1A92 4F LD C,A ; <- exponent +4194 1A93 57 LD D,A ; <- to all +4195 1A94 5F LD E,A ; <- bits +4196 1A95 B7 OR A ; Test exponent +4197 1A96 C8 RET Z ; Zero - Return zero +4198 1A97 E5 PUSH HL ; Save pointer to number +4199 1A98 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4200 1A9B CD 4F 1A CALL SIGNS ; Set MSBs & sign of result +4201 1A9E AE XOR (HL) ; Combine with sign of FPREG +4202 1A9F 67 LD H,A ; Save combined signs +4203 1AA0 FC B5 1A CALL M,DCBCDE ; Negative - Decrement BCDE +4204 1AA3 3E 98 LD A,80H+24 ; 24 bits +4205 1AA5 90 SUB B ; Bits to shift +4206 1AA6 CD 68 18 CALL SCALE ; Shift BCDE +4207 1AA9 7C LD A,H ; Get combined sign +4208 1AAA 17 RLA ; Sign to carry +4209 1AAB DC 3B 18 CALL C,FPROND ; Negative - Round number up +4210 1AAE 06 00 LD B,0 ; Zero exponent +4211 1AB0 DC 54 18 CALL C,COMPL ; If negative make positive +4212 1AB3 E1 POP HL ; Restore pointer to number +4213 1AB4 C9 RET +4214 1AB5 +4215 1AB5 1B DCBCDE: DEC DE ; Decrement BCDE +4216 1AB6 7A LD A,D ; Test LSBs +4217 1AB7 A3 AND E +4218 1AB8 3C INC A +4219 1AB9 C0 RET NZ ; Exit if LSBs not FFFF +4220 1ABA 0B DEC BC ; Decrement MSBs +4221 1ABB C9 RET +4222 1ABC +4223 1ABC 21 97 31 INT: LD HL,FPEXP ; Point to exponent +4224 1ABF 7E LD A,(HL) ; Get exponent +4225 1AC0 FE 98 CP 80H+24 ; Integer accuracy only? +4226 1AC2 3A 94 31 LD A,(FPREG) ; Get LSB +4227 1AC5 D0 RET NC ; Yes - Already integer +4228 1AC6 7E LD A,(HL) ; Get exponent +4229 1AC7 CD 91 1A CALL FPINT ; F.P to integer +4230 1ACA 36 98 LD (HL),80H+24 ; Save 24 bit integer +4231 1ACC 7B LD A,E ; Get LSB of number +4232 1ACD F5 PUSH AF ; Save LSB +4233 1ACE 79 LD A,C ; Get MSB of number +4234 1ACF 17 RLA ; Sign to carry +4235 1AD0 CD F1 17 CALL CONPOS ; Set sign of result +4236 1AD3 F1 POP AF ; Restore LSB of number +4237 1AD4 C9 RET +4238 1AD5 +4239 1AD5 21 00 00 MLDEBC: LD HL,0 ; Clear partial product +4240 1AD8 78 LD A,B ; Test multiplier +4241 1AD9 B1 OR C +4242 1ADA C8 RET Z ; Return zero if zero +4243 1ADB 3E 10 LD A,16 ; 16 bits +4244 1ADD 29 MLDBLP: ADD HL,HL ; Shift P.P left +4245 1ADE DA 15 13 JP C,BSERR ; ?BS Error if overflow +4246 1AE1 EB EX DE,HL +4247 1AE2 29 ADD HL,HL ; Shift multiplier left +4248 1AE3 EB EX DE,HL +4249 1AE4 D2 EB 1A JP NC,NOMLAD ; Bit was zero - No add +4250 1AE7 09 ADD HL,BC ; Add multiplicand +4251 1AE8 DA 15 13 JP C,BSERR ; ?BS Error if overflow +4252 1AEB 3D NOMLAD: DEC A ; Count bits +4253 1AEC C2 DD 1A JP NZ,MLDBLP ; More +4254 1AEF C9 RET +4255 1AF0 +4256 1AF0 FE 2D ASCTFP: CP '-' ; Negative? +4257 1AF2 F5 PUSH AF ; Save it and flags +4258 1AF3 CA FC 1A JP Z,CNVNUM ; Yes - Convert number +4259 1AF6 FE 2B CP '+' ; Positive? +4260 1AF8 CA FC 1A JP Z,CNVNUM ; Yes - Convert number +4261 1AFB 2B DEC HL ; DEC 'cos GETCHR INCs +4262 1AFC CD 09 18 CNVNUM: CALL RESZER ; Set result to zero +4263 1AFF 47 LD B,A ; Digits after point counter +4264 1B00 57 LD D,A ; Sign of exponent +4265 1B01 5F LD E,A ; Exponent of ten +4266 1B02 2F CPL +4267 1B03 4F LD C,A ; Before or after point flag +4268 1B04 CD 9A 0B MANLP: CALL GETCHR ; Get next character +4269 1B07 DA 4D 1B JP C,ADDIG ; Digit - Add to number +4270 1B0A FE 2E CP '.' +4271 1B0C CA 28 1B JP Z,DPOINT ; '.' - Flag point +4272 1B0F FE 45 CP 'E' +4273 1B11 C2 2C 1B JP NZ,CONEXP ; Not 'E' - Scale number +4274 1B14 CD 9A 0B CALL GETCHR ; Get next character +4275 1B17 CD 40 11 CALL SGNEXP ; Get sign of exponent +4276 1B1A CD 9A 0B EXPLP: CALL GETCHR ; Get next character +4277 1B1D DA 6F 1B JP C,EDIGIT ; Digit - Add to exponent +4278 1B20 14 INC D ; Is sign negative? +4279 1B21 C2 2C 1B JP NZ,CONEXP ; No - Scale number +4280 1B24 AF XOR A +4281 1B25 93 SUB E ; Negate exponent +4282 1B26 5F LD E,A ; And re-save it +4283 1B27 0C INC C ; Flag end of number +4284 1B28 0C DPOINT: INC C ; Flag point passed +4285 1B29 CA 04 1B JP Z,MANLP ; Zero - Get another digit +4286 1B2C E5 CONEXP: PUSH HL ; Save code string address +4287 1B2D 7B LD A,E ; Get exponent +4288 1B2E 90 SUB B ; Subtract digits after point +4289 1B2F F4 45 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number +4290 1B32 F2 3B 1B JP P,ENDCON ; Positive - All done +4291 1B35 F5 PUSH AF ; Save number of times to /10 +4292 1B36 CD 31 19 CALL DIV10 ; Divide by 10 +4293 1B39 F1 POP AF ; Restore count +4294 1B3A 3C INC A ; Count divides +4295 1B3B +4296 1B3B C2 2F 1B ENDCON: JP NZ,SCALMI ; More to do +4297 1B3E D1 POP DE ; Restore code string address +4298 1B3F F1 POP AF ; Restore sign of number +4299 1B40 CC 12 1A CALL Z,INVSGN ; Negative - Negate number +4300 1B43 EB EX DE,HL ; Code string address to HL +4301 1B44 C9 RET +4302 1B45 +4303 1B45 C8 SCALPL: RET Z ; Exit if no scaling needed +4304 1B46 F5 MULTEN: PUSH AF ; Save count +4305 1B47 CD D2 19 CALL MLSP10 ; Multiply number by 10 +4306 1B4A F1 POP AF ; Restore count +4307 1B4B 3D DEC A ; Count multiplies +4308 1B4C C9 RET +4309 1B4D +4310 1B4D D5 ADDIG: PUSH DE ; Save sign of exponent +4311 1B4E 57 LD D,A ; Save digit +4312 1B4F 78 LD A,B ; Get digits after point +4313 1B50 89 ADC A,C ; Add one if after point +4314 1B51 47 LD B,A ; Re-save counter +4315 1B52 C5 PUSH BC ; Save point flags +4316 1B53 E5 PUSH HL ; Save code string address +4317 1B54 D5 PUSH DE ; Save digit +4318 1B55 CD D2 19 CALL MLSP10 ; Multiply number by 10 +4319 1B58 F1 POP AF ; Restore digit +4320 1B59 D6 30 SUB '0' ; Make it absolute +4321 1B5B CD 64 1B CALL RSCALE ; Re-scale number +4322 1B5E E1 POP HL ; Restore code string address +4323 1B5F C1 POP BC ; Restore point flags +4324 1B60 D1 POP DE ; Restore sign of exponent +4325 1B61 C3 04 1B JP MANLP ; Get another digit +4326 1B64 +4327 1B64 CD 1A 1A RSCALE: CALL STAKFP ; Put number on stack +4328 1B67 CD FB 19 CALL FLGREL ; Digit to add to FPREG +4329 1B6A C1 PADD: POP BC ; Restore number +4330 1B6B D1 POP DE +4331 1B6C C3 A3 17 JP FPADD ; Add BCDE to FPREG and return +4332 1B6F +4333 1B6F 7B EDIGIT: LD A,E ; Get digit +4334 1B70 07 RLCA ; Times 2 +4335 1B71 07 RLCA ; Times 4 +4336 1B72 83 ADD A,E ; Times 5 +4337 1B73 07 RLCA ; Times 10 +4338 1B74 86 ADD A,(HL) ; Add next digit +4339 1B75 D6 30 SUB '0' ; Make it absolute +4340 1B77 5F LD E,A ; Save new digit +4341 1B78 C3 1A 1B JP EXPLP ; Look for another digit +4342 1B7B +4343 1B7B E5 LINEIN: PUSH HL ; Save code string address +4344 1B7C 21 DA 06 LD HL,INMSG ; Output " in " +4345 1B7F CD E0 14 CALL PRS ; Output string at HL +4346 1B82 E1 POP HL ; Restore code string address +4347 1B83 EB PRNTHL: EX DE,HL ; Code string address to DE +4348 1B84 AF XOR A +4349 1B85 06 98 LD B,80H+24 ; 24 bits +4350 1B87 CD 00 1A CALL RETINT ; Return the integer +4351 1B8A 21 DF 14 LD HL,PRNUMS ; Print number string +4352 1B8D E5 PUSH HL ; Save for return +4353 1B8E 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII +4354 1B91 E5 PUSH HL ; Save for return +4355 1B92 CD E9 19 CALL TSTSGN ; Test sign of FPREG +4356 1B95 36 20 LD (HL),' ' ; Space at start +4357 1B97 F2 9C 1B JP P,SPCFST ; Positive - Space to start +4358 1B9A 36 2D LD (HL),'-' ; '-' sign at start +4359 1B9C 23 SPCFST: INC HL ; First byte of number +4360 1B9D 36 30 LD (HL),'0' ; '0' if zero +4361 1B9F CA 52 1C JP Z,JSTZER ; Return '0' if zero +4362 1BA2 E5 PUSH HL ; Save buffer address +4363 1BA3 FC 12 1A CALL M,INVSGN ; Negate FPREG if negative +4364 1BA6 AF XOR A ; Zero A +4365 1BA7 F5 PUSH AF ; Save it +4366 1BA8 CD 58 1C CALL RNGTST ; Test number is in range +4367 1BAB 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 +4368 1BAE 11 F8 4F LD DE,4FF8H +4369 1BB1 CD 64 1A CALL CMPNUM ; Compare numbers +4370 1BB4 B7 OR A +4371 1BB5 E2 C9 1B JP PO,INRNG ; > 99999.9 - Sort it out +4372 1BB8 F1 POP AF ; Restore count +4373 1BB9 CD 46 1B CALL MULTEN ; Multiply by ten +4374 1BBC F5 PUSH AF ; Re-save count +4375 1BBD C3 AB 1B JP SIXDIG ; Test it again +4376 1BC0 +4377 1BC0 CD 31 19 GTSIXD: CALL DIV10 ; Divide by 10 +4378 1BC3 F1 POP AF ; Get count +4379 1BC4 3C INC A ; Count divides +4380 1BC5 F5 PUSH AF ; Re-save count +4381 1BC6 CD 58 1C CALL RNGTST ; Test number is in range +4382 1BC9 CD 91 17 INRNG: CALL ROUND ; Add 0.5 to FPREG +4383 1BCC 3C INC A +4384 1BCD CD 91 1A CALL FPINT ; F.P to integer +4385 1BD0 CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +4386 1BD3 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range +4387 1BD6 F1 POP AF ; Restore count +4388 1BD7 81 ADD A,C ; 6 digits before point +4389 1BD8 3C INC A ; Add one +4390 1BD9 FA E5 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 +4391 1BDC FE 08 CP 6+1+1 ; More than 999999 ? +4392 1BDE D2 E5 1B JP NC,MAKNUM ; Yes - Do it in 'E' form +4393 1BE1 3C INC A ; Adjust for exponent +4394 1BE2 47 LD B,A ; Exponent of number +4395 1BE3 3E 02 LD A,2 ; Make it zero after +4396 1BE5 +4397 1BE5 3D MAKNUM: DEC A ; Adjust for digits to do +4398 1BE6 3D DEC A +4399 1BE7 E1 POP HL ; Restore buffer address +4400 1BE8 F5 PUSH AF ; Save count +4401 1BE9 11 6B 1C LD DE,POWERS ; Powers of ten +4402 1BEC 05 DEC B ; Count digits before point +4403 1BED C2 F6 1B JP NZ,DIGTXT ; Not zero - Do number +4404 1BF0 36 2E LD (HL),'.' ; Save point +4405 1BF2 23 INC HL ; Move on +4406 1BF3 36 30 LD (HL),'0' ; Save zero +4407 1BF5 23 INC HL ; Move on +4408 1BF6 05 DIGTXT: DEC B ; Count digits before point +4409 1BF7 36 2E LD (HL),'.' ; Save point in case +4410 1BF9 CC 3F 1A CALL Z,INCHL ; Last digit - move on +4411 1BFC C5 PUSH BC ; Save digits before point +4412 1BFD E5 PUSH HL ; Save buffer address +4413 1BFE D5 PUSH DE ; Save powers of ten +4414 1BFF CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4415 1C02 E1 POP HL ; Powers of ten table +4416 1C03 06 2F LD B, '0'-1 ; ASCII '0' - 1 +4417 1C05 04 TRYAGN: INC B ; Count subtractions +4418 1C06 7B LD A,E ; Get LSB +4419 1C07 96 SUB (HL) ; Subtract LSB +4420 1C08 5F LD E,A ; Save LSB +4421 1C09 23 INC HL +4422 1C0A 7A LD A,D ; Get NMSB +4423 1C0B 9E SBC A,(HL) ; Subtract NMSB +4424 1C0C 57 LD D,A ; Save NMSB +4425 1C0D 23 INC HL +4426 1C0E 79 LD A,C ; Get MSB +4427 1C0F 9E SBC A,(HL) ; Subtract MSB +4428 1C10 4F LD C,A ; Save MSB +4429 1C11 2B DEC HL ; Point back to start +4430 1C12 2B DEC HL +4431 1C13 D2 05 1C JP NC,TRYAGN ; No overflow - Try again +4432 1C16 CD 48 18 CALL PLUCDE ; Restore number +4433 1C19 23 INC HL ; Start of next number +4434 1C1A CD 2A 1A CALL FPBCDE ; Move BCDE to FPREG +4435 1C1D EB EX DE,HL ; Save point in table +4436 1C1E E1 POP HL ; Restore buffer address +4437 1C1F 70 LD (HL),B ; Save digit in buffer +4438 1C20 23 INC HL ; And move on +4439 1C21 C1 POP BC ; Restore digit count +4440 1C22 0D DEC C ; Count digits +4441 1C23 C2 F6 1B JP NZ,DIGTXT ; More - Do them +4442 1C26 05 DEC B ; Any decimal part? +4443 1C27 CA 36 1C JP Z,DOEBIT ; No - Do 'E' bit +4444 1C2A 2B SUPTLZ: DEC HL ; Move back through buffer +4445 1C2B 7E LD A,(HL) ; Get character +4446 1C2C FE 30 CP '0' ; '0' character? +4447 1C2E CA 2A 1C JP Z,SUPTLZ ; Yes - Look back for more +4448 1C31 FE 2E CP '.' ; A decimal point? +4449 1C33 C4 3F 1A CALL NZ,INCHL ; Move back over digit +4450 1C36 +4451 1C36 F1 DOEBIT: POP AF ; Get 'E' flag +4452 1C37 CA 55 1C JP Z,NOENED ; No 'E' needed - End buffer +4453 1C3A 36 45 LD (HL),'E' ; Put 'E' in buffer +4454 1C3C 23 INC HL ; And move on +4455 1C3D 36 2B LD (HL),'+' ; Put '+' in buffer +4456 1C3F F2 46 1C JP P,OUTEXP ; Positive - Output exponent +4457 1C42 36 2D LD (HL),'-' ; Put '-' in buffer +4458 1C44 2F CPL ; Negate exponent +4459 1C45 3C INC A +4460 1C46 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 +4461 1C48 04 EXPTEN: INC B ; Count subtractions +4462 1C49 D6 0A SUB 10 ; Tens digit +4463 1C4B D2 48 1C JP NC,EXPTEN ; More to do +4464 1C4E C6 3A ADD A,'0'+10 ; Restore and make ASCII +4465 1C50 23 INC HL ; Move on +4466 1C51 70 LD (HL),B ; Save MSB of exponent +4467 1C52 23 JSTZER: INC HL ; +4468 1C53 77 LD (HL),A ; Save LSB of exponent +4469 1C54 23 INC HL +4470 1C55 71 NOENED: LD (HL),C ; Mark end of buffer +4471 1C56 E1 POP HL ; Restore code string address +4472 1C57 C9 RET +4473 1C58 +4474 1C58 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. +4475 1C5B 11 F7 23 LD DE,23F7H +4476 1C5E CD 64 1A CALL CMPNUM ; Compare numbers +4477 1C61 B7 OR A +4478 1C62 E1 POP HL ; Return address to HL +4479 1C63 E2 C0 1B JP PO,GTSIXD ; Too big - Divide by ten +4480 1C66 E9 JP (HL) ; Otherwise return to caller +4481 1C67 +4482 1C67 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 +4483 1C6B +4484 1C6B A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 +4485 1C6E 10 27 00 .BYTE 010H,027H,000H ; 10000 +4486 1C71 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 +4487 1C74 64 00 00 .BYTE 064H,000H,000H ; 100 +4488 1C77 0A 00 00 .BYTE 00AH,000H,000H ; 10 +4489 1C7A 01 00 00 .BYTE 001H,000H,000H ; 1 +4490 1C7D +4491 1C7D 21 12 1A NEGAFT: LD HL,INVSGN ; Negate result +4492 1C80 E3 EX (SP),HL ; To be done after caller +4493 1C81 E9 JP (HL) ; Return to caller +4494 1C82 +4495 1C82 CD 1A 1A SQR: CALL STAKFP ; Put value on stack +4496 1C85 21 67 1C LD HL,HALF ; Set power to 1/2 +4497 1C88 CD 27 1A CALL PHLTFP ; Move 1/2 to FPREG +4498 1C8B +4499 1C8B C1 POWER: POP BC ; Get base +4500 1C8C D1 POP DE +4501 1C8D CD E9 19 CALL TSTSGN ; Test sign of power +4502 1C90 78 LD A,B ; Get exponent of base +4503 1C91 CA D0 1C JP Z,EXP ; Make result 1 if zero +4504 1C94 F2 9B 1C JP P,POWER1 ; Positive base - Ok +4505 1C97 B7 OR A ; Zero to negative power? +4506 1C98 CA 45 07 JP Z,DZERR ; Yes - ?/0 Error +4507 1C9B B7 POWER1: OR A ; Base zero? +4508 1C9C CA 0A 18 JP Z,SAVEXP ; Yes - Return zero +4509 1C9F D5 PUSH DE ; Save base +4510 1CA0 C5 PUSH BC +4511 1CA1 79 LD A,C ; Get MSB of base +4512 1CA2 F6 7F OR 01111111B ; Get sign status +4513 1CA4 CD 35 1A CALL BCDEFP ; Move power to BCDE +4514 1CA7 F2 B8 1C JP P,POWER2 ; Positive base - Ok +4515 1CAA D5 PUSH DE ; Save power +4516 1CAB C5 PUSH BC +4517 1CAC CD BC 1A CALL INT ; Get integer of power +4518 1CAF C1 POP BC ; Restore power +4519 1CB0 D1 POP DE +4520 1CB1 F5 PUSH AF ; MSB of base +4521 1CB2 CD 64 1A CALL CMPNUM ; Power an integer? +4522 1CB5 E1 POP HL ; Restore MSB of base +4523 1CB6 7C LD A,H ; but don't affect flags +4524 1CB7 1F RRA ; Exponent odd or even? +4525 1CB8 E1 POWER2: POP HL ; Restore MSB and exponent +4526 1CB9 22 96 31 LD (FPREG+2),HL ; Save base in FPREG +4527 1CBC E1 POP HL ; LSBs of base +4528 1CBD 22 94 31 LD (FPREG),HL ; Save in FPREG +4529 1CC0 DC 7D 1C CALL C,NEGAFT ; Odd power - Negate result +4530 1CC3 CC 12 1A CALL Z,INVSGN ; Negative base - Negate it +4531 1CC6 D5 PUSH DE ; Save power +4532 1CC7 C5 PUSH BC +4533 1CC8 CD 9D 18 CALL LOG ; Get LOG of base +4534 1CCB C1 POP BC ; Restore power +4535 1CCC D1 POP DE +4536 1CCD CD DE 18 CALL FPMULT ; Multiply LOG by power +4537 1CD0 +4538 1CD0 CD 1A 1A EXP: CALL STAKFP ; Put value on stack +4539 1CD3 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) +4540 1CD6 11 3B AA LD DE,0AA3BH +4541 1CD9 CD DE 18 CALL FPMULT ; Multiply value by 1/LN(2) +4542 1CDC 3A 97 31 LD A,(FPEXP) ; Get exponent +4543 1CDF FE 88 CP 80H+8 ; Is it in range? +4544 1CE1 D2 C5 19 JP NC,OVTST1 ; No - Test for overflow +4545 1CE4 CD BC 1A CALL INT ; Get INT of FPREG +4546 1CE7 C6 80 ADD A,80H ; For excess 128 +4547 1CE9 C6 02 ADD A,2 ; Exponent > 126? +4548 1CEB DA C5 19 JP C,OVTST1 ; Yes - Test for overflow +4549 1CEE F5 PUSH AF ; Save scaling factor +4550 1CEF 21 8C 18 LD HL,UNITY ; Point to 1. +4551 1CF2 CD 94 17 CALL ADDPHL ; Add 1 to FPREG +4552 1CF5 CD D5 18 CALL MULLN2 ; Multiply by LN(2) +4553 1CF8 F1 POP AF ; Restore scaling factor +4554 1CF9 C1 POP BC ; Restore exponent +4555 1CFA D1 POP DE +4556 1CFB F5 PUSH AF ; Save scaling factor +4557 1CFC CD A0 17 CALL SUBCDE ; Subtract exponent from FPREG +4558 1CFF CD 12 1A CALL INVSGN ; Negate result +4559 1D02 21 10 1D LD HL,EXPTAB ; Coefficient table +4560 1D05 CD 40 1D CALL SMSER1 ; Sum the series +4561 1D08 11 00 00 LD DE,0 ; Zero LSBs +4562 1D0B C1 POP BC ; Scaling factor +4563 1D0C 4A LD C,D ; Zero MSB +4564 1D0D C3 DE 18 JP FPMULT ; Scale result to correct value +4565 1D10 +4566 1D10 08 EXPTAB: .BYTE 8 ; Table used by EXP +4567 1D11 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) +4568 1D15 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) +4569 1D19 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) +4570 1D1D E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) +4571 1D21 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) +4572 1D25 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) +4573 1D29 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) +4574 1D2D 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) +4575 1D31 +4576 1D31 CD 1A 1A SUMSER: CALL STAKFP ; Put FPREG on stack +4577 1D34 11 DC 18 LD DE,MULT ; Multiply by "X" +4578 1D37 D5 PUSH DE ; To be done after +4579 1D38 E5 PUSH HL ; Save address of table +4580 1D39 CD 35 1A CALL BCDEFP ; Move FPREG to BCDE +4581 1D3C CD DE 18 CALL FPMULT ; Square the value +4582 1D3F E1 POP HL ; Restore address of table +4583 1D40 CD 1A 1A SMSER1: CALL STAKFP ; Put value on stack +4584 1D43 7E LD A,(HL) ; Get number of coefficients +4585 1D44 23 INC HL ; Point to start of table +4586 1D45 CD 27 1A CALL PHLTFP ; Move coefficient to FPREG +4587 1D48 06 .BYTE 06H ; Skip "POP AF" +4588 1D49 F1 SUMLP: POP AF ; Restore count +4589 1D4A C1 POP BC ; Restore number +4590 1D4B D1 POP DE +4591 1D4C 3D DEC A ; Cont coefficients +4592 1D4D C8 RET Z ; All done +4593 1D4E D5 PUSH DE ; Save number +4594 1D4F C5 PUSH BC +4595 1D50 F5 PUSH AF ; Save count +4596 1D51 E5 PUSH HL ; Save address in table +4597 1D52 CD DE 18 CALL FPMULT ; Multiply FPREG by BCDE +4598 1D55 E1 POP HL ; Restore address in table +4599 1D56 CD 38 1A CALL LOADFP ; Number at HL to BCDE +4600 1D59 E5 PUSH HL ; Save address in table +4601 1D5A CD A3 17 CALL FPADD ; Add coefficient to FPREG +4602 1D5D E1 POP HL ; Restore address in table +4603 1D5E C3 49 1D JP SUMLP ; More coefficients +4604 1D61 +4605 1D61 CD E9 19 RND: CALL TSTSGN ; Test sign of FPREG +4606 1D64 21 C9 30 LD HL,SEED+2 ; Random number seed +4607 1D67 FA C2 1D JP M,RESEED ; Negative - Re-seed +4608 1D6A 21 EA 30 LD HL,LSTRND ; Last random number +4609 1D6D CD 27 1A CALL PHLTFP ; Move last RND to FPREG +4610 1D70 21 C9 30 LD HL,SEED+2 ; Random number seed +4611 1D73 C8 RET Z ; Return if RND(0) +4612 1D74 86 ADD A,(HL) ; Add (SEED)+2) +4613 1D75 E6 07 AND 00000111B ; 0 to 7 +4614 1D77 06 00 LD B,0 +4615 1D79 77 LD (HL),A ; Re-save seed +4616 1D7A 23 INC HL ; Move to coefficient table +4617 1D7B 87 ADD A,A ; 4 bytes +4618 1D7C 87 ADD A,A ; per entry +4619 1D7D 4F LD C,A ; BC = Offset into table +4620 1D7E 09 ADD HL,BC ; Point to coefficient +4621 1D7F CD 38 1A CALL LOADFP ; Coefficient to BCDE +4622 1D82 CD DE 18 CALL FPMULT ; ; Multiply FPREG by coefficient +4623 1D85 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) +4624 1D88 3C INC A ; Add 1 +4625 1D89 E6 03 AND 00000011B ; 0 to 3 +4626 1D8B 06 00 LD B,0 +4627 1D8D FE 01 CP 1 ; Is it zero? +4628 1D8F 88 ADC A,B ; Yes - Make it 1 +4629 1D90 32 C8 30 LD (SEED+1),A ; Re-save seed +4630 1D93 21 C6 1D LD HL,RNDTAB-4 ; Addition table +4631 1D96 87 ADD A,A ; 4 bytes +4632 1D97 87 ADD A,A ; per entry +4633 1D98 4F LD C,A ; BC = Offset into table +4634 1D99 09 ADD HL,BC ; Point to value +4635 1D9A CD 94 17 CALL ADDPHL ; Add value to FPREG +4636 1D9D CD 35 1A RND1: CALL BCDEFP ; Move FPREG to BCDE +4637 1DA0 7B LD A,E ; Get LSB +4638 1DA1 59 LD E,C ; LSB = MSB +4639 1DA2 EE 4F XOR 01001111B ; Fiddle around +4640 1DA4 4F LD C,A ; New MSB +4641 1DA5 36 80 LD (HL),80H ; Set exponent +4642 1DA7 2B DEC HL ; Point to MSB +4643 1DA8 46 LD B,(HL) ; Get MSB +4644 1DA9 36 80 LD (HL),80H ; Make value -0.5 +4645 1DAB 21 C7 30 LD HL,SEED ; Random number seed +4646 1DAE 34 INC (HL) ; Count seed +4647 1DAF 7E LD A,(HL) ; Get seed +4648 1DB0 D6 AB SUB 171 ; Do it modulo 171 +4649 1DB2 C2 B9 1D JP NZ,RND2 ; Non-zero - Ok +4650 1DB5 77 LD (HL),A ; Zero seed +4651 1DB6 0C INC C ; Fillde about +4652 1DB7 15 DEC D ; with the +4653 1DB8 1C INC E ; number +4654 1DB9 CD F4 17 RND2: CALL BNORM ; Normalise number +4655 1DBC 21 EA 30 LD HL,LSTRND ; Save random number +4656 1DBF C3 41 1A JP FPTHL ; Move FPREG to last and return +4657 1DC2 +4658 1DC2 77 RESEED: LD (HL),A ; Re-seed random numbers +4659 1DC3 2B DEC HL +4660 1DC4 77 LD (HL),A +4661 1DC5 2B DEC HL +4662 1DC6 77 LD (HL),A +4663 1DC7 C3 9D 1D JP RND1 ; Return RND seed +4664 1DCA +4665 1DCA 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND +4666 1DCE 99 E9 92 69 .BYTE 099H,0E9H,092H,069H +4667 1DD2 10 D1 75 68 .BYTE 010H,0D1H,075H,068H +4668 1DD6 +4669 1DD6 21 20 1E COS: LD HL,HALFPI ; Point to PI/2 +4670 1DD9 CD 94 17 CALL ADDPHL ; Add it to PPREG +4671 1DDC CD 1A 1A SIN: CALL STAKFP ; Put angle on stack +4672 1DDF 01 49 83 LD BC,8349H ; BCDE = 2 PI +4673 1DE2 11 DB 0F LD DE,0FDBH +4674 1DE5 CD 2A 1A CALL FPBCDE ; Move 2 PI to FPREG +4675 1DE8 C1 POP BC ; Restore angle +4676 1DE9 D1 POP DE +4677 1DEA CD 3F 19 CALL DVBCDE ; Divide angle by 2 PI +4678 1DED CD 1A 1A CALL STAKFP ; Put it on stack +4679 1DF0 CD BC 1A CALL INT ; Get INT of result +4680 1DF3 C1 POP BC ; Restore number +4681 1DF4 D1 POP DE +4682 1DF5 CD A0 17 CALL SUBCDE ; Make it 0 <= value < 1 +4683 1DF8 21 24 1E LD HL,QUARTR ; Point to 0.25 +4684 1DFB CD 9A 17 CALL SUBPHL ; Subtract value from 0.25 +4685 1DFE CD E9 19 CALL TSTSGN ; Test sign of value +4686 1E01 37 SCF ; Flag positive +4687 1E02 F2 0C 1E JP P,SIN1 ; Positive - Ok +4688 1E05 CD 91 17 CALL ROUND ; Add 0.5 to value +4689 1E08 CD E9 19 CALL TSTSGN ; Test sign of value +4690 1E0B B7 OR A ; Flag negative +4691 1E0C F5 SIN1: PUSH AF ; Save sign +4692 1E0D F4 12 1A CALL P,INVSGN ; Negate value if positive +4693 1E10 21 24 1E LD HL,QUARTR ; Point to 0.25 +4694 1E13 CD 94 17 CALL ADDPHL ; Add 0.25 to value +4695 1E16 F1 POP AF ; Restore sign +4696 1E17 D4 12 1A CALL NC,INVSGN ; Negative - Make positive +4697 1E1A 21 28 1E LD HL,SINTAB ; Coefficient table +4698 1E1D C3 31 1D JP SUMSER ; Evaluate sum of series +4699 1E20 +4700 1E20 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) +4701 1E24 +4702 1E24 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 +4703 1E28 +4704 1E28 05 SINTAB: .BYTE 5 ; Table used by SIN +4705 1E29 BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 +4706 1E2D 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 +4707 1E31 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 +4708 1E35 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 +4709 1E39 DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 +4710 1E3D +4711 1E3D CD 1A 1A TAN: CALL STAKFP ; Put angle on stack +4712 1E40 CD DC 1D CALL SIN ; Get SIN of angle +4713 1E43 C1 POP BC ; Restore angle +4714 1E44 E1 POP HL +4715 1E45 CD 1A 1A CALL STAKFP ; Save SIN of angle +4716 1E48 EB EX DE,HL ; BCDE = Angle +4717 1E49 CD 2A 1A CALL FPBCDE ; Angle to FPREG +4718 1E4C CD D6 1D CALL COS ; Get COS of angle +4719 1E4F C3 3D 19 JP DIV ; TAN = SIN / COS +4720 1E52 +4721 1E52 CD E9 19 ATN: CALL TSTSGN ; Test sign of value +4722 1E55 FC 7D 1C CALL M,NEGAFT ; Negate result after if -ve +4723 1E58 FC 12 1A CALL M,INVSGN ; Negate value if -ve +4724 1E5B 3A 97 31 LD A,(FPEXP) ; Get exponent +4725 1E5E FE 81 CP 81H ; Number less than 1? +4726 1E60 DA 6F 1E JP C,ATN1 ; Yes - Get arc tangnt +4727 1E63 01 00 81 LD BC,8100H ; BCDE = 1 +4728 1E66 51 LD D,C +4729 1E67 59 LD E,C +4730 1E68 CD 3F 19 CALL DVBCDE ; Get reciprocal of number +4731 1E6B 21 9A 17 LD HL,SUBPHL ; Sub angle from PI/2 +4732 1E6E E5 PUSH HL ; Save for angle > 1 +4733 1E6F 21 79 1E ATN1: LD HL,ATNTAB ; Coefficient table +4734 1E72 CD 31 1D CALL SUMSER ; Evaluate sum of series +4735 1E75 21 20 1E LD HL,HALFPI ; PI/2 - angle in case > 1 +4736 1E78 C9 RET ; Number > 1 - Sub from PI/2 +4737 1E79 +4738 1E79 09 ATNTAB: .BYTE 9 ; Table used by ATN +4739 1E7A 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 +4740 1E7E 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 +4741 1E82 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 +4742 1E86 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 +4743 1E8A 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 +4744 1E8E C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 +4745 1E92 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 +4746 1E96 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 +4747 1E9A 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 +4748 1E9E +4749 1E9E +4750 1E9E C9 ARET: RET ; A RETurn instruction +4751 1E9F +4752 1E9F D7 GETINP: RST 10H ;input a character +4753 1EA0 C9 RET +4754 1EA1 +4755 1EA1 CLS: +4756 1EA1 3E 0C LD A,CS ; ASCII Clear screen +4757 1EA3 C3 DB 1F JP MONOUT ; Output character +4758 1EA6 +4759 1EA6 CD 68 17 WIDTH: CALL GETINT ; Get integer 0-255 +4760 1EA9 7B LD A,E ; Width to A +4761 1EAA 32 F2 30 LD (LWIDTH),A ; Set width +4762 1EAD C9 RET +4763 1EAE +4764 1EAE CD 07 10 LINES: CALL GETNUM ; Get a number +4765 1EB1 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4766 1EB4 ED 53 F6 30 LD (LINESC),DE ; Set lines counter +4767 1EB8 ED 53 F8 30 LD (LINESN),DE ; Set lines number +4768 1EBC C9 RET +4769 1EBD +4770 1EBD CD 4C 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 +4771 1EC0 D5 PUSH DE ; Save number +4772 1EC1 E1 POP HL ; Number to HL +4773 1EC2 46 LD B,(HL) ; Get LSB of contents +4774 1EC3 23 INC HL +4775 1EC4 7E LD A,(HL) ; Get MSB of contents +4776 1EC5 C3 C2 13 JP ABPASS ; Return integer AB +4777 1EC8 +4778 1EC8 CD 07 10 DOKE: CALL GETNUM ; Get a number +4779 1ECB CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4780 1ECE D5 PUSH DE ; Save address +4781 1ECF CD 10 0A CALL CHKSYN ; Make sure ',' follows +4782 1ED2 2C .BYTE ',' +4783 1ED3 CD 07 10 CALL GETNUM ; Get a number +4784 1ED6 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4785 1ED9 E3 EX (SP),HL ; Save value,get address +4786 1EDA 73 LD (HL),E ; Save LSB of value +4787 1EDB 23 INC HL +4788 1EDC 72 LD (HL),D ; Save MSB of value +4789 1EDD E1 POP HL ; Restore code string address +4790 1EDE C9 RET +4791 1EDF +4792 1EDF +4793 1EDF ; HEX$(nn) Convert 16 bit number to Hexadecimal string +4794 1EDF +4795 1EDF CD 0A 10 HEX: CALL TSTNUM ; Verify it's a number +4796 1EE2 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4797 1EE5 C5 PUSH BC ; Save contents of BC +4798 1EE6 21 99 31 LD HL,PBUFF +4799 1EE9 7A LD A,D ; Get high order into A +4800 1EEA FE 00 CP $0 +4801 1EEC 28 0C JR Z,HEX2 ; Skip output if both high digits are zero +4802 1EEE CD 17 1F CALL BYT2ASC ; Convert D to ASCII +4803 1EF1 78 LD A,B +4804 1EF2 FE 30 CP '0' +4805 1EF4 28 02 JR Z,HEX1 ; Don't store high digit if zero +4806 1EF6 70 LD (HL),B ; Store it to PBUFF +4807 1EF7 23 INC HL ; Next location +4808 1EF8 71 HEX1: LD (HL),C ; Store C to PBUFF+1 +4809 1EF9 23 INC HL ; Next location +4810 1EFA 7B HEX2: LD A,E ; Get lower byte +4811 1EFB CD 17 1F CALL BYT2ASC ; Convert E to ASCII +4812 1EFE 7A LD A,D +4813 1EFF FE 00 CP $0 +4814 1F01 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte +4815 1F03 78 LD A,B +4816 1F04 FE 30 CP '0' ; If high digit of lower byte is zero then don't print +4817 1F06 28 02 JR Z,HEX4 +4818 1F08 70 HEX3: LD (HL),B ; to PBUFF+2 +4819 1F09 23 INC HL ; Next location +4820 1F0A 71 HEX4: LD (HL),C ; to PBUFF+3 +4821 1F0B 23 INC HL ; PBUFF+4 to zero +4822 1F0C AF XOR A ; Terminating character +4823 1F0D 77 LD (HL),A ; Store zero to terminate +4824 1F0E 23 INC HL ; Make sure PBUFF is terminated +4825 1F0F 77 LD (HL),A ; Store the double zero there +4826 1F10 C1 POP BC ; Get BC back +4827 1F11 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF +4828 1F14 C3 70 14 JP STR1 ; Convert the PBUFF to a string and return it +4829 1F17 +4830 1F17 47 BYT2ASC LD B,A ; Save original value +4831 1F18 E6 0F AND $0F ; Strip off upper nybble +4832 1F1A FE 0A CP $0A ; 0-9? +4833 1F1C 38 02 JR C,ADD30 ; If A-F, add 7 more +4834 1F1E C6 07 ADD A,$07 ; Bring value up to ASCII A-F +4835 1F20 C6 30 ADD30 ADD A,$30 ; And make ASCII +4836 1F22 4F LD C,A ; Save converted char to C +4837 1F23 78 LD A,B ; Retrieve original value +4838 1F24 0F RRCA ; and Rotate it right +4839 1F25 0F RRCA +4840 1F26 0F RRCA +4841 1F27 0F RRCA +4842 1F28 E6 0F AND $0F ; Mask off upper nybble +4843 1F2A FE 0A CP $0A ; 0-9? < A hex? +4844 1F2C 38 02 JR C,ADD301 ; Skip Add 7 +4845 1F2E C6 07 ADD A,$07 ; Bring it up to ASCII A-F +4846 1F30 C6 30 ADD301 ADD A,$30 ; And make it full ASCII +4847 1F32 47 LD B,A ; Store high order byte +4848 1F33 C9 RET +4849 1F34 +4850 1F34 ; Convert "&Hnnnn" to FPREG +4851 1F34 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +4852 1F34 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +4853 1F34 EB HEXTFP EX DE,HL ; Move code string pointer to DE +4854 1F35 21 00 00 LD HL,$0000 ; Zero out the value +4855 1F38 CD 4D 1F CALL GETHEX ; Check the number for valid hex +4856 1F3B DA 6D 1F JP C,HXERR ; First value wasn't hex, HX error +4857 1F3E 18 05 JR HEXLP1 ; Convert first character +4858 1F40 CD 4D 1F HEXLP CALL GETHEX ; Get second and addtional characters +4859 1F43 38 1F JR C,HEXIT ; Exit if not a hex character +4860 1F45 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left +4861 1F46 29 ADD HL,HL +4862 1F47 29 ADD HL,HL +4863 1F48 29 ADD HL,HL +4864 1F49 B5 OR L ; Add in D0-D3 into L +4865 1F4A 6F LD L,A ; Save new value +4866 1F4B 18 F3 JR HEXLP ; And continue until all hex characters are in +4867 1F4D +4868 1F4D 13 GETHEX INC DE ; Next location +4869 1F4E 1A LD A,(DE) ; Load character at pointer +4870 1F4F FE 20 CP ' ' +4871 1F51 CA 4D 1F JP Z,GETHEX ; Skip spaces +4872 1F54 D6 30 SUB $30 ; Get absolute value +4873 1F56 D8 RET C ; < "0", error +4874 1F57 FE 0A CP $0A +4875 1F59 38 05 JR C,NOSUB7 ; Is already in the range 0-9 +4876 1F5B D6 07 SUB $07 ; Reduce to A-F +4877 1F5D FE 0A CP $0A ; Value should be $0A-$0F at this point +4878 1F5F D8 RET C ; CY set if was : ; < = > ? @ +4879 1F60 FE 10 NOSUB7 CP $10 ; > Greater than "F"? +4880 1F62 3F CCF +4881 1F63 C9 RET ; CY set if it wasn't valid hex +4882 1F64 +4883 1F64 EB HEXIT EX DE,HL ; Value into DE, Code string into HL +4884 1F65 7A LD A,D ; Load DE into AC +4885 1F66 4B LD C,E ; For prep to +4886 1F67 E5 PUSH HL +4887 1F68 CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4888 1F6B E1 POP HL +4889 1F6C C9 RET +4890 1F6D +4891 1F6D 1E 26 HXERR: LD E,HX ; ?HEX Error +4892 1F6F C3 56 07 JP ERROR +4893 1F72 +4894 1F72 ; BIN$(NN) Convert integer to a 1-16 char binary string +4895 1F72 CD 0A 10 BIN: CALL TSTNUM ; Verify it's a number +4896 1F75 CD 4C 0C CALL DEINT ; Get integer -32768 to 32767 +4897 1F78 C5 BIN2: PUSH BC ; Save contents of BC +4898 1F79 21 99 31 LD HL,PBUFF +4899 1F7C 06 11 LD B,17 ; One higher than max char count +4900 1F7E ZEROSUP: ; Suppress leading zeros +4901 1F7E 05 DEC B ; Max 16 chars +4902 1F7F 78 LD A,B +4903 1F80 FE 01 CP $01 +4904 1F82 28 08 JR Z,BITOUT ; Always output at least one character +4905 1F84 CB 13 RL E +4906 1F86 CB 12 RL D +4907 1F88 30 F4 JR NC,ZEROSUP +4908 1F8A 18 04 JR BITOUT2 +4909 1F8C BITOUT: +4910 1F8C CB 13 RL E +4911 1F8E CB 12 RL D ; Top bit now in carry +4912 1F90 BITOUT2: +4913 1F90 3E 30 LD A,'0' ; Char for '0' +4914 1F92 CE 00 ADC A,0 ; If carry set then '0' --> '1' +4915 1F94 77 LD (HL),A +4916 1F95 23 INC HL +4917 1F96 05 DEC B +4918 1F97 20 F3 JR NZ,BITOUT +4919 1F99 AF XOR A ; Terminating character +4920 1F9A 77 LD (HL),A ; Store zero to terminate +4921 1F9B 23 INC HL ; Make sure PBUFF is terminated +4922 1F9C 77 LD (HL),A ; Store the double zero there +4923 1F9D C1 POP BC +4924 1F9E 21 99 31 LD HL,PBUFF +4925 1FA1 C3 70 14 JP STR1 +4926 1FA4 +4927 1FA4 ; Convert "&Bnnnn" to FPREG +4928 1FA4 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +4929 1FA4 EB BINTFP: EX DE,HL ; Move code string pointer to DE +4930 1FA5 21 00 00 LD HL,$0000 ; Zero out the value +4931 1FA8 CD C1 1F CALL CHKBIN ; Check the number for valid bin +4932 1FAB DA CF 1F JP C,BINERR ; First value wasn't bin, HX error +4933 1FAE D6 30 BINIT: SUB '0' +4934 1FB0 29 ADD HL,HL ; Rotate HL left +4935 1FB1 B5 OR L +4936 1FB2 6F LD L,A +4937 1FB3 CD C1 1F CALL CHKBIN ; Get second and addtional characters +4938 1FB6 30 F6 JR NC,BINIT ; Process if a bin character +4939 1FB8 EB EX DE,HL ; Value into DE, Code string into HL +4940 1FB9 7A LD A,D ; Load DE into AC +4941 1FBA 4B LD C,E ; For prep to +4942 1FBB E5 PUSH HL +4943 1FBC CD C1 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4944 1FBF E1 POP HL +4945 1FC0 C9 RET +4946 1FC1 +4947 1FC1 ; Char is in A, NC if char is 0 or 1 +4948 1FC1 13 CHKBIN: INC DE +4949 1FC2 1A LD A,(DE) +4950 1FC3 FE 20 CP ' ' +4951 1FC5 CA C1 1F JP Z,CHKBIN ; Skip spaces +4952 1FC8 FE 30 CP '0' ; Set C if < '0' +4953 1FCA D8 RET C +4954 1FCB FE 32 CP '2' +4955 1FCD 3F CCF ; Set C if > '1' +4956 1FCE C9 RET +4957 1FCF +4958 1FCF 1E 28 BINERR: LD E,BN ; ?BIN Error +4959 1FD1 C3 56 07 JP ERROR +4960 1FD4 +4961 1FD4 +4962 1FD4 JJUMP1: +4963 1FD4 DD 21 FF FF LD IX,-1 ; Flag cold start +4964 1FD8 C3 A6 03 JP CSTART ; Go and initialise +4965 1FDB +4966 1FDB MONOUT: +4967 1FDB C3 08 00 JP $0008 ; output a char +4968 1FDE +4969 1FDE +4970 1FDE MONITR: +4971 1FDE C3 00 00 JP $0000 ; Restart (Normally Monitor Start) +4972 1FE1 +4973 1FE1 +4974 1FE1 3E 00 INITST: LD A,0 ; Clear break flag +4975 1FE3 32 FD 30 LD (BRKFLG),A +4976 1FE6 C3 AD 03 JP INIT +4977 1FE9 +4978 1FE9 ED 45 ARETN: RETN ; Return from NMI +4979 1FEB +4980 1FEB +4981 1FEB F5 TSTBIT: PUSH AF ; Save bit mask +4982 1FEC A0 AND B ; Get common bits +4983 1FED C1 POP BC ; Restore bit mask +4984 1FEE B8 CP B ; Same bit set? +4985 1FEF 3E 00 LD A,0 ; Return 0 in A +4986 1FF1 C9 RET +4987 1FF2 +4988 1FF2 CD 1B 0A OUTNCR: CALL OUTC ; Output character in A +4989 1FF5 C3 42 0E JP PRNTCRLF ; Output CRLF +4990 1FF8 +4991 1FF8 .end +4992 1FF8 +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/CBIOS128.LST b/Z80 CPM and bootloader (basmon)/source/CBIOS128.LST index 250e562..6c9e157 100644 --- a/Z80 CPM and bootloader (basmon)/source/CBIOS128.LST +++ b/Z80 CPM and bootloader (basmon)/source/CBIOS128.LST @@ -1,947 +1,1031 @@ -0001 0000 ;================================================================================== -0002 0000 ; Contents of this file are copyright Grant Searle -0003 0000 ; Blocking/unblocking routines are the published version by Digital Research -0004 0000 ; (bugfixed, as found on the web) -0005 0000 ; -0006 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0007 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0008 0000 ; -0009 0000 ; http://searle.hostei.com/grant/index.html -0010 0000 ; -0011 0000 ; eMail: home.micros01@btinternet.com -0012 0000 ; -0013 0000 ; If the above don't work, please perform an Internet search to see if I have -0014 0000 ; updated the web page hosting service. -0015 0000 ; -0016 0000 ;================================================================================== -0017 0000 -0018 0000 ccp .EQU 0D000h ; Base of CCP. -0019 0000 bdos .EQU ccp + 0806h ; Base of BDOS. -0020 0000 bios .EQU ccp + 1600h ; Base of BIOS. -0021 0000 -0022 0000 ; Set CP/M low memory datA, vector and buffer addresses. -0023 0000 -0024 0000 iobyte .EQU 03h ; Intel standard I/O definition byte. -0025 0000 userdrv .EQU 04h ; Current user number and drive. -0026 0000 tpabuf .EQU 80h ; Default I/O buffer and command line storage. -0027 0000 -0028 0000 -0029 0000 SD_DATA .EQU 088H -0030 0000 SD_CONTROL .EQU 089H -0031 0000 SD_STATUS .EQU 089H -0032 0000 SD_LBA0 .EQU 08AH -0033 0000 SD_LBA1 .EQU 08BH -0034 0000 SD_LBA2 .EQU 08CH -0035 0000 -0036 0000 RTS_HIGH .EQU 0D5H -0037 0000 RTS_LOW .EQU 095H -0038 0000 -0039 0000 ACIA0_D .EQU $81 -0040 0000 ACIA0_C .EQU $80 -0041 0000 ACIA1_D .EQU $83 -0042 0000 ACIA1_C .EQU $82 -0043 0000 -0044 0000 nmi .EQU 66H -0045 0000 -0046 0000 blksiz .equ 4096 ;CP/M allocation size -0047 0000 hstsiz .equ 512 ;host disk sector size -0048 0000 hstspt .equ 32 ;host disk sectors/trk -0049 0000 hstblk .equ hstsiz/128 ;CP/M sects/host buff -0050 0000 cpmspt .equ hstblk * hstspt ;CP/M sectors/track -0051 0000 secmsk .equ hstblk-1 ;sector mask -0052 0000 ;compute sector mask -0053 0000 ;secshf .equ 2 ;log2(hstblk) -0054 0000 -0055 0000 wrall .equ 0 ;write to allocated -0056 0000 wrdir .equ 1 ;write to directory -0057 0000 wrual .equ 2 ;write to unallocated -0058 0000 -0059 0000 LF .EQU 0AH ;line feed -0060 0000 FF .EQU 0CH ;form feed -0061 0000 CR .EQU 0DH ;carriage RETurn -0062 0000 -0063 0000 ;================================================================================================ -0064 0000 -0065 E600 .ORG bios ; BIOS origin. -0066 E600 -0067 E600 ;================================================================================================ -0068 E600 ; BIOS jump table. -0069 E600 ;================================================================================================ -0070 E600 C3 51 E7 JP boot ; 0 Initialize. -0071 E603 C3 B5 E7 wboote: JP wboot ; 1 Warm boot. -0072 E606 C3 1D E8 JP const ; 2 Console status. -0073 E609 C3 58 E8 JP conin ; 3 Console input. -0074 E60C C3 96 E8 JP conout ; 4 Console OUTput. -0075 E60F C3 7E E8 JP list ; 5 List OUTput. -0076 E612 C3 8A E8 JP punch ; 6 punch OUTput. -0077 E615 C3 4C E8 JP reader ; 7 Reader input. -0078 E618 C3 EF E8 JP home ; 8 Home disk. -0079 E61B C3 C7 E8 JP seldsk ; 9 Select disk. -0080 E61E C3 FB E8 JP settrk ; 10 Select track. -0081 E621 C3 00 E9 JP setsec ; 11 Select sector. -0082 E624 C3 05 E9 JP setdma ; 12 Set DMA ADDress. -0083 E627 C3 0D E9 JP read ; 13 Read 128 bytes. -0084 E62A C3 21 E9 JP write ; 14 Write 128 bytes. -0085 E62D C3 C4 E8 JP listst ; 15 List status. -0086 E630 C3 0A E9 JP sectran ; 16 Sector translate. -0087 E633 -0088 E633 ;================================================================================================ -0089 E633 ; Disk parameter headers for disk 0 to 15 -0090 E633 ;================================================================================================ -0091 E633 dpbase: -0092 E633 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb0,0000h,alv00 -0092 E639 00000DEB33E700008DEB -0093 E643 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv01 -0093 E649 00000DEB42E700008EEC -0094 E653 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv02 -0094 E659 00000DEB42E700008FED -0095 E663 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv03 -0095 E669 00000DEB42E7000090EE -0096 E673 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv04 -0096 E679 00000DEB42E7000091EF -0097 E683 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv05 -0097 E689 00000DEB42E7000092F0 -0098 E693 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv06 -0098 E699 00000DEB42E7000093F1 -0099 E6A3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv07 -0099 E6A9 00000DEB42E7000094F2 -0100 E6B3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv08 -0100 E6B9 00000DEB42E7000095F3 -0101 E6C3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv09 -0101 E6C9 00000DEB42E7000096F4 -0102 E6D3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv10 -0102 E6D9 00000DEB42E7000097F5 -0103 E6E3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv11 -0103 E6E9 00000DEB42E7000098F6 -0104 E6F3 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv12 -0104 E6F9 00000DEB42E7000099F7 -0105 E703 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv13 -0105 E709 00000DEB42E700009AF8 -0106 E713 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv14 -0106 E719 00000DEB42E700009BF9 -0107 E723 000000000000 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv15 -0107 E729 00000DEB42E700009CFA -0108 E733 -0109 E733 ; First drive has a reserved track for CP/M -0110 E733 dpb0: -0111 E733 80 00 .DW 128 ;SPT - sectors per track -0112 E735 05 .DB 5 ;BSH - block shift factor -0113 E736 1F .DB 31 ;BLM - block mask -0114 E737 01 .DB 1 ;EXM - Extent mask -0115 E738 FB 07 .DW 2043 ; (2047-4) DSM - Storage size (blocks - 1) -0116 E73A FF 01 .DW 511 ;DRM - Number of directory entries - 1 -0117 E73C F0 .DB 240 ;AL0 - 1 bit set per directory block -0118 E73D 00 .DB 0 ;AL1 - " -0119 E73E 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) -0120 E740 01 00 .DW 1 ;OFF - Reserved tracks -0121 E742 -0122 E742 dpb: -0123 E742 80 00 .DW 128 ;SPT - sectors per track -0124 E744 05 .DB 5 ;BSH - block shift factor -0125 E745 1F .DB 31 ;BLM - block mask -0126 E746 01 .DB 1 ;EXM - Extent mask -0127 E747 FF 07 .DW 2047 ;DSM - Storage size (blocks - 1) -0128 E749 FF 01 .DW 511 ;DRM - Number of directory entries - 1 -0129 E74B F0 .DB 240 ;AL0 - 1 bit set per directory block -0130 E74C 00 .DB 0 ;AL1 - " -0131 E74D 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) -0132 E74F 00 00 .DW 0 ;OFF - Reserved tracks -0133 E751 -0134 E751 ;================================================================================================ -0135 E751 ; Cold boot -0136 E751 ;================================================================================================ -0137 E751 -0138 E751 boot: -0139 E751 F3 DI ; Disable interrupts. -0140 E752 31 C1 FB LD SP,biosstack ; Set default stack. -0141 E755 -0142 E755 ; Turn off ROM -0143 E755 -0144 E755 3E 01 LD A,$01 -0145 E757 D3 38 OUT ($38),A -0146 E759 -0147 E759 3E 95 LD A,RTS_LOW -0148 E75B D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 -0149 E75D D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 -0150 E75F -0151 E75F CD F9 EA CALL printInline -0152 E762 0C .DB FF -0153 E763 43502F4D2042 .TEXT "CP/M BIOS 2.0 by G. Searle 2013" -0153 E769 494F5320322E3020627920472E20536561726C652032303133 -0154 E782 0D 0A .DB CR,LF -0155 E784 0D 0A .DB CR,LF -0156 E786 43502F4D2032 .TEXT "CP/M 2.2 " -0156 E78C 2E3220 -0157 E78F 28 63 29 .TEXT "(c)" -0158 E792 203139373920 .TEXT " 1979 by Digital Research" -0158 E798 6279204469676974616C205265736561726368 -0159 E7AB 0D 0A 00 .DB CR,LF,0 -0160 E7AE -0161 E7AE ; CALL sdPreamble?? -0162 E7AE -0163 E7AE AF XOR a ; Clear I/O & drive bytes. -0164 E7AF 32 04 00 LD (userdrv),A -0165 E7B2 C3 F5 E7 JP gocpm -0166 E7B5 -0167 E7B5 ;================================================================================================ -0168 E7B5 ; Warm boot -0169 E7B5 ;================================================================================================ -0170 E7B5 -0171 E7B5 wboot: -0172 E7B5 F3 DI ; Disable interrupts. -0173 E7B6 31 C1 FB LD SP,biosstack ; Set default stack. -0174 E7B9 -0175 E7B9 06 0B LD B,11 ; Number of sectors to reload -0176 E7BB -0177 E7BB 3E 00 LD A,0 -0178 E7BD 32 C9 FB LD (hstsec),A -0179 E7C0 D3 8C OUT (SD_LBA2),A -0180 E7C2 D3 8B OUT (SD_LBA1),A -0181 E7C4 -0182 E7C4 21 00 D0 LD HL,ccp -0183 E7C7 -0184 E7C7 wbRdAllSecs: -0185 E7C7 -0186 E7C7 DB 89 wBrdWait1: IN A,(SD_STATUS) -0187 E7C9 FE 80 CP 128 -0188 E7CB 20 FA JR NZ,wBrdWait1 -0189 E7CD -0190 E7CD 3A C9 FB LD A,(hstsec) -0191 E7D0 D3 8A OUT (SD_LBA0),A -0192 E7D2 -0193 E7D2 3E 00 LD A,$00 ; 00 = Read block -0194 E7D4 D3 89 OUT (SD_CONTROL),A -0195 E7D6 C5 PUSH BC -0196 E7D7 -0197 E7D7 0E 04 LD c,4 -0198 E7D9 wBrd4secs: -0199 E7D9 06 80 LD b,128 -0200 E7DB wBrdByte: -0201 E7DB -0202 E7DB DB 89 wBrdWait2: IN A,(SD_STATUS) -0203 E7DD FE E0 CP 224 ; Read byte waiting -0204 E7DF 20 FA JR NZ,wBrdWait2 -0205 E7E1 -0206 E7E1 DB 88 IN A,(SD_DATA) -0207 E7E3 -0208 E7E3 77 LD (HL),A -0209 E7E4 23 INC HL -0210 E7E5 05 dec b -0211 E7E6 20 F3 JR NZ, wBrdByte -0212 E7E8 -0213 E7E8 0D dec c -0214 E7E9 20 EE JR NZ,wBrd4secs -0215 E7EB -0216 E7EB 3A C9 FB LD A,(hstsec) -0217 E7EE 3C INC A -0218 E7EF 32 C9 FB LD (hstsec),A -0219 E7F2 -0220 E7F2 C1 POP BC -0221 E7F3 -0222 E7F3 10 D2 DJNZ wbRdAllSecs -0223 E7F5 ;================================================================================================ -0224 E7F5 ; Common code for cold and warm boot -0225 E7F5 ;================================================================================================ -0226 E7F5 -0227 E7F5 gocpm: -0228 E7F5 AF xor a ;0 to accumulator -0229 E7F6 32 CB FB ld (hstact),a ;host buffer inactive -0230 E7F9 32 CD FB ld (unacnt),a ;clear unalloc count -0231 E7FC -0232 E7FC 21 80 00 LD HL,tpabuf ; Address of BIOS DMA buffer. -0233 E7FF 22 D6 FB LD (dmaAddr),HL -0234 E802 3E C3 LD A,0C3h ; Opcode for 'JP'. -0235 E804 32 00 00 LD (00h),A ; Load at start of RAM. -0236 E807 21 03 E6 LD HL,wboote ; Address of jump for a warm boot. -0237 E80A 22 01 00 LD (01h),HL -0238 E80D 32 05 00 LD (05h),A ; Opcode for 'JP'. -0239 E810 21 06 D8 LD HL,bdos ; Address of jump for the BDOS. -0240 E813 22 06 00 LD (06h),HL -0241 E816 3A 04 00 LD A,(userdrv) ; Save new drive number (0). -0242 E819 4F LD c,A ; Pass drive number in C. -0243 E81A -0244 E81A C3 00 D0 JP ccp ; Start CP/M by jumping to the CCP. -0245 E81D -0246 E81D ;================================================================================================ -0247 E81D ; Console I/O routines -0248 E81D ;================================================================================================ -0249 E81D -0250 E81D -0251 E81D ;------------------------------------------------------------------------------------------------ -0252 E81D const: -0253 E81D 3A 03 00 LD A,(iobyte) -0254 E820 E6 0B AND 00001011b ; Mask off console and high bit of reader -0255 E822 FE 0A CP 00001010b ; redirected to reader on UR1/2 (Serial A) -0256 E824 28 0A JR Z,constA -0257 E826 FE 02 CP 00000010b ; redirected to reader on TTY/RDR (Serial B) -0258 E828 28 14 JR Z,constB -0259 E82A -0260 E82A E6 03 AND $03 ; remove the reader from the mask - only console bits then remain -0261 E82C FE 01 CP $01 -0262 E82E 20 0E JR NZ,constB -0263 E830 constA: -0264 E830 DB 80 IN A,(ACIA0_C) ; Status byte -0265 E832 E6 01 AND $01 -0266 E834 FE 00 CP $0 ; Z flag set if no char -0267 E836 28 03 JR Z, dataAEmpty -0268 E838 3E FF LD A,0FFH -0269 E83A C9 RET -0270 E83B dataAEmpty: -0271 E83B 3E 00 LD A,0 -0272 E83D C9 RET -0273 E83E -0274 E83E -0275 E83E constB: -0276 E83E DB 82 IN A,(ACIA1_C) ; Status byte -0277 E840 E6 01 AND $01 -0278 E842 FE 00 CP $0 ; Z flag set if no char -0279 E844 28 03 JR Z, dataBEmpty -0280 E846 3E FF LD A,0FFH -0281 E848 C9 RET -0282 E849 dataBEmpty: -0283 E849 3E 00 LD A,0 -0284 E84B C9 RET -0285 E84C -0286 E84C ;------------------------------------------------------------------------------------------------ -0287 E84C reader: -0288 E84C F5 PUSH AF -0289 E84D 3A 03 00 reader2: LD A,(iobyte) -0290 E850 E6 08 AND $08 -0291 E852 FE 08 CP $08 -0292 E854 20 1C JR NZ,coninB -0293 E856 18 0E JR coninA -0294 E858 ;------------------------------------------------------------------------------------------------ -0295 E858 conin: -0296 E858 F5 PUSH AF -0297 E859 3A 03 00 LD A,(iobyte) -0298 E85C E6 03 AND $03 -0299 E85E FE 02 CP $02 -0300 E860 28 EB JR Z,reader2 ; "BAT:" redirect -0301 E862 FE 01 CP $01 -0302 E864 20 0C JR NZ,coninB -0303 E866 -0304 E866 -0305 E866 coninA: -0306 E866 F1 POP AF -0307 E867 waitForCharA: -0308 E867 DB 80 IN A,(ACIA0_C) ; Status byte -0309 E869 E6 01 AND $01 -0310 E86B FE 00 CP $0 ; Z flag set if no char -0311 E86D 28 F8 JR Z, waitForCharA -0312 E86F DB 81 IN A,(ACIA0_D) -0313 E871 -0314 E871 C9 RET ; Char ready in A -0315 E872 -0316 E872 -0317 E872 coninB: -0318 E872 F1 POP AF -0319 E873 waitForCharB: -0320 E873 DB 82 IN A,(ACIA1_C) ; Status byte -0321 E875 E6 01 AND $01 -0322 E877 FE 00 CP $0 ; Z flag set if no char -0323 E879 28 F8 JR Z, waitForCharB -0324 E87B DB 83 IN A,(ACIA1_D) -0325 E87D -0326 E87D C9 RET ; Char ready in A -0327 E87E -0328 E87E ;------------------------------------------------------------------------------------------------ -0329 E87E F5 list: PUSH AF ; Store character -0330 E87F 3A 03 00 list2: LD A,(iobyte) -0331 E882 E6 C0 AND $C0 -0332 E884 FE 40 CP $40 -0333 E886 20 26 JR NZ,conoutB1 -0334 E888 18 1A JR conoutA1 -0335 E88A -0336 E88A ;------------------------------------------------------------------------------------------------ -0337 E88A F5 punch: PUSH AF ; Store character -0338 E88B 3A 03 00 LD A,(iobyte) -0339 E88E E6 20 AND $20 -0340 E890 FE 20 CP $20 -0341 E892 20 1A JR NZ,conoutB1 -0342 E894 18 0E JR conoutA1 -0343 E896 -0344 E896 ;------------------------------------------------------------------------------------------------ -0345 E896 F5 conout: PUSH AF -0346 E897 3A 03 00 LD A,(iobyte) -0347 E89A E6 03 AND $03 -0348 E89C FE 02 CP $02 -0349 E89E 28 DF JR Z,list2 ; "BAT:" redirect -0350 E8A0 FE 01 CP $01 -0351 E8A2 20 0A JR NZ,conoutB1 -0352 E8A4 -0353 E8A4 CD B8 E8 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting -0354 E8A7 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready -0355 E8A9 79 LD A,C -0356 E8AA D3 81 OUT (ACIA0_D),A ; OUTput the character -0357 E8AC F1 POP AF -0358 E8AD C9 RET -0359 E8AE -0360 E8AE CD BE E8 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting -0361 E8B1 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready -0362 E8B3 79 LD A,C -0363 E8B4 D3 83 OUT (ACIA1_D),A ; OUTput the character -0364 E8B6 F1 POP AF -0365 E8B7 C9 RET -0366 E8B8 -0367 E8B8 ;------------------------------------------------------------------------------------------------ -0368 E8B8 CKACIA0 -0369 E8B8 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready -0370 E8BA 0F RRCA ; Rotates RX status into Carry Flag, -0371 E8BB CB 47 BIT 0,A ; Set Zero flag if still transmitting character -0372 E8BD C9 RET -0373 E8BE -0374 E8BE CKACIA1 -0375 E8BE DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready -0376 E8C0 0F RRCA ; Rotates RX status into Carry Flag, -0377 E8C1 CB 47 BIT 0,A ; Set Zero flag if still transmitting character -0378 E8C3 C9 RET -0379 E8C4 -0380 E8C4 ;------------------------------------------------------------------------------------------------ -0381 E8C4 3E FF listst: LD A,$FF ; Return list status of 0xFF (ready). -0382 E8C6 C9 RET -0383 E8C7 -0384 E8C7 ;================================================================================================ -0385 E8C7 ; Disk processing entry points -0386 E8C7 ;================================================================================================ -0387 E8C7 -0388 E8C7 seldsk: -0389 E8C7 21 00 00 LD HL,$0000 -0390 E8CA 79 LD A,C -0391 E8CB FE 10 CP 16 ; 16 for 128MB disk, 8 for 64MB disk -0392 E8CD 38 0D jr C,chgdsk ; if invalid drive will give BDOS error -0393 E8CF 3A 04 00 LD A,(userdrv) ; so set the drive back to a: -0394 E8D2 B9 CP C ; If the default disk is not the same as the -0395 E8D3 C0 RET NZ ; selected drive then return, -0396 E8D4 AF XOR A ; else reset default back to a: -0397 E8D5 32 04 00 LD (userdrv),A ; otherwise will be stuck in a loop -0398 E8D8 32 C1 FB LD (sekdsk),A -0399 E8DB C9 ret -0400 E8DC -0401 E8DC 32 C1 FB chgdsk: LD (sekdsk),A -0402 E8DF CB 07 RLC a ;*2 -0403 E8E1 CB 07 RLC a ;*4 -0404 E8E3 CB 07 RLC a ;*8 -0405 E8E5 CB 07 RLC a ;*16 -0406 E8E7 21 33 E6 LD HL,dpbase -0407 E8EA 06 00 LD b,0 -0408 E8EC 4F LD c,A -0409 E8ED 09 ADD HL,BC -0410 E8EE -0411 E8EE C9 RET -0412 E8EF -0413 E8EF ;------------------------------------------------------------------------------------------------ -0414 E8EF home: -0415 E8EF 3A CC FB ld a,(hstwrt) ;check for pending write -0416 E8F2 B7 or a -0417 E8F3 20 03 jr nz,homed -0418 E8F5 32 CB FB ld (hstact),a ;clear host active flag -0419 E8F8 homed: -0420 E8F8 01 00 00 LD BC,0000h -0421 E8FB -0422 E8FB ;------------------------------------------------------------------------------------------------ -0423 E8FB ED 43 C2 FB settrk: LD (sektrk),BC ; Set track passed from BDOS in register BC. -0424 E8FF C9 RET -0425 E900 -0426 E900 ;------------------------------------------------------------------------------------------------ -0427 E900 ED 43 C4 FB setsec: LD (seksec),BC ; Set sector passed from BDOS in register BC. -0428 E904 C9 RET -0429 E905 -0430 E905 ;------------------------------------------------------------------------------------------------ -0431 E905 ED 43 D6 FB setdma: LD (dmaAddr),BC ; Set DMA ADDress given by registers BC. -0432 E909 C9 RET -0433 E90A -0434 E90A ;------------------------------------------------------------------------------------------------ -0435 E90A C5 sectran: PUSH BC -0436 E90B E1 POP HL -0437 E90C C9 RET -0438 E90D -0439 E90D ;------------------------------------------------------------------------------------------------ -0440 E90D read: -0441 E90D ;read the selected CP/M sector -0442 E90D AF xor a -0443 E90E 32 CD FB ld (unacnt),a -0444 E911 3E 01 ld a,1 -0445 E913 32 D4 FB ld (readop),a ;read operation -0446 E916 32 D3 FB ld (rsflag),a ;must read data -0447 E919 3E 02 ld a,wrual -0448 E91B 32 D5 FB ld (wrtype),a ;treat as unalloc -0449 E91E C3 88 E9 jp rwoper ;to perform the read -0450 E921 -0451 E921 -0452 E921 ;------------------------------------------------------------------------------------------------ -0453 E921 write: -0454 E921 ;write the selected CP/M sector -0455 E921 AF xor a ;0 to accumulator -0456 E922 32 D4 FB ld (readop),a ;not a read operation -0457 E925 79 ld a,c ;write type in c -0458 E926 32 D5 FB ld (wrtype),a -0459 E929 FE 02 cp wrual ;write unallocated? -0460 E92B 20 17 jr nz,chkuna ;check for unalloc -0461 E92D ; -0462 E92D ; write to unallocated, set parameters -0463 E92D 3E 20 ld a,blksiz/128 ;next unalloc recs -0464 E92F 32 CD FB ld (unacnt),a -0465 E932 3A C1 FB ld a,(sekdsk) ;disk to seek -0466 E935 32 CE FB ld (unadsk),a ;unadsk = sekdsk -0467 E938 2A C2 FB ld hl,(sektrk) -0468 E93B 22 CF FB ld (unatrk),hl ;unatrk = sectrk -0469 E93E 3A C4 FB ld a,(seksec) -0470 E941 32 D1 FB ld (unasec),a ;unasec = seksec -0471 E944 ; -0472 E944 chkuna: -0473 E944 ; check for write to unallocated sector -0474 E944 3A CD FB ld a,(unacnt) ;any unalloc remain? -0475 E947 B7 or a -0476 E948 28 36 jr z,alloc ;skip if not -0477 E94A ; -0478 E94A ; more unallocated records remain -0479 E94A 3D dec a ;unacnt = unacnt-1 -0480 E94B 32 CD FB ld (unacnt),a -0481 E94E 3A C1 FB ld a,(sekdsk) ;same disk? -0482 E951 21 CE FB ld hl,unadsk -0483 E954 BE cp (hl) ;sekdsk = unadsk? -0484 E955 C2 80 E9 jp nz,alloc ;skip if not -0485 E958 ; -0486 E958 ; disks are the same -0487 E958 21 CF FB ld hl,unatrk -0488 E95B CD 1F EA call sektrkcmp ;sektrk = unatrk? -0489 E95E C2 80 E9 jp nz,alloc ;skip if not -0490 E961 ; -0491 E961 ; tracks are the same -0492 E961 3A C4 FB ld a,(seksec) ;same sector? -0493 E964 21 D1 FB ld hl,unasec -0494 E967 BE cp (hl) ;seksec = unasec? -0495 E968 C2 80 E9 jp nz,alloc ;skip if not -0496 E96B ; -0497 E96B ; match, move to next sector for future ref -0498 E96B 34 inc (hl) ;unasec = unasec+1 -0499 E96C 7E ld a,(hl) ;end of track? -0500 E96D FE 80 cp cpmspt ;count CP/M sectors -0501 E96F 38 09 jr c,noovf ;skip if no overflow -0502 E971 ; -0503 E971 ; overflow to next track -0504 E971 36 00 ld (hl),0 ;unasec = 0 -0505 E973 2A CF FB ld hl,(unatrk) -0506 E976 23 inc hl -0507 E977 22 CF FB ld (unatrk),hl ;unatrk = unatrk+1 -0508 E97A ; -0509 E97A noovf: -0510 E97A ;match found, mark as unnecessary read -0511 E97A AF xor a ;0 to accumulator -0512 E97B 32 D3 FB ld (rsflag),a ;rsflag = 0 -0513 E97E 18 08 jr rwoper ;to perform the write -0514 E980 ; -0515 E980 alloc: -0516 E980 ;not an unallocated record, requires pre-read -0517 E980 AF xor a ;0 to accum -0518 E981 32 CD FB ld (unacnt),a ;unacnt = 0 -0519 E984 3C inc a ;1 to accum -0520 E985 32 D3 FB ld (rsflag),a ;rsflag = 1 -0521 E988 -0522 E988 ;------------------------------------------------------------------------------------------------ -0523 E988 rwoper: -0524 E988 ;enter here to perform the read/write -0525 E988 AF xor a ;zero to accum -0526 E989 32 D2 FB ld (erflag),a ;no errors (yet) -0527 E98C 3A C4 FB ld a,(seksec) ;compute host sector -0528 E98F B7 or a ;carry = 0 -0529 E990 1F rra ;shift right -0530 E991 B7 or a ;carry = 0 -0531 E992 1F rra ;shift right -0532 E993 32 CA FB ld (sekhst),a ;host sector to seek -0533 E996 ; -0534 E996 ; active host sector? -0535 E996 21 CB FB ld hl,hstact ;host active flag -0536 E999 7E ld a,(hl) -0537 E99A 36 01 ld (hl),1 ;always becomes 1 -0538 E99C B7 or a ;was it already? -0539 E99D 28 21 jr z,filhst ;fill host if not -0540 E99F ; -0541 E99F ; host buffer active, same as seek buffer? -0542 E99F 3A C1 FB ld a,(sekdsk) -0543 E9A2 21 C6 FB ld hl,hstdsk ;same disk? -0544 E9A5 BE cp (hl) ;sekdsk = hstdsk? -0545 E9A6 20 11 jr nz,nomatch -0546 E9A8 ; -0547 E9A8 ; same disk, same track? -0548 E9A8 21 C7 FB ld hl,hsttrk -0549 E9AB CD 1F EA call sektrkcmp ;sektrk = hsttrk? -0550 E9AE 20 09 jr nz,nomatch -0551 E9B0 ; -0552 E9B0 ; same disk, same track, same buffer? -0553 E9B0 3A CA FB ld a,(sekhst) -0554 E9B3 21 C9 FB ld hl,hstsec ;sekhst = hstsec? -0555 E9B6 BE cp (hl) -0556 E9B7 28 24 jr z,match ;skip if match -0557 E9B9 ; -0558 E9B9 nomatch: -0559 E9B9 ;proper disk, but not correct sector -0560 E9B9 3A CC FB ld a,(hstwrt) ;host written? -0561 E9BC B7 or a -0562 E9BD C4 C4 EA call nz,writehst ;clear host buff -0563 E9C0 ; -0564 E9C0 filhst: -0565 E9C0 ;may have to fill the host buffer -0566 E9C0 3A C1 FB ld a,(sekdsk) -0567 E9C3 32 C6 FB ld (hstdsk),a -0568 E9C6 2A C2 FB ld hl,(sektrk) -0569 E9C9 22 C7 FB ld (hsttrk),hl -0570 E9CC 3A CA FB ld a,(sekhst) -0571 E9CF 32 C9 FB ld (hstsec),a -0572 E9D2 3A D3 FB ld a,(rsflag) ;need to read? -0573 E9D5 B7 or a -0574 E9D6 C4 95 EA call nz,readhst ;yes, if 1 -0575 E9D9 AF xor a ;0 to accum -0576 E9DA 32 CC FB ld (hstwrt),a ;no pending write -0577 E9DD ; -0578 E9DD match: -0579 E9DD ;copy data to or from buffer -0580 E9DD 3A C4 FB ld a,(seksec) ;mask buffer number -0581 E9E0 E6 03 and secmsk ;least signif bits -0582 E9E2 6F ld l,a ;ready to shift -0583 E9E3 26 00 ld h,0 ;double count -0584 E9E5 29 add hl,hl -0585 E9E6 29 add hl,hl -0586 E9E7 29 add hl,hl -0587 E9E8 29 add hl,hl -0588 E9E9 29 add hl,hl -0589 E9EA 29 add hl,hl -0590 E9EB 29 add hl,hl -0591 E9EC ; hl has relative host buffer address -0592 E9EC 11 D8 FB ld de,hstbuf -0593 E9EF 19 add hl,de ;hl = host address -0594 E9F0 EB ex de,hl ;now in DE -0595 E9F1 2A D6 FB ld hl,(dmaAddr) ;get/put CP/M data -0596 E9F4 0E 80 ld c,128 ;length of move -0597 E9F6 3A D4 FB ld a,(readop) ;which way? -0598 E9F9 B7 or a -0599 E9FA 20 06 jr nz,rwmove ;skip if read -0600 E9FC ; -0601 E9FC ; write operation, mark and switch direction -0602 E9FC 3E 01 ld a,1 -0603 E9FE 32 CC FB ld (hstwrt),a ;hstwrt = 1 -0604 EA01 EB ex de,hl ;source/dest swap -0605 EA02 ; -0606 EA02 rwmove: -0607 EA02 ;C initially 128, DE is source, HL is dest -0608 EA02 1A ld a,(de) ;source character -0609 EA03 13 inc de -0610 EA04 77 ld (hl),a ;to dest -0611 EA05 23 inc hl -0612 EA06 0D dec c ;loop 128 times -0613 EA07 20 F9 jr nz,rwmove -0614 EA09 ; -0615 EA09 ; data has been moved to/from host buffer -0616 EA09 3A D5 FB ld a,(wrtype) ;write type -0617 EA0C FE 01 cp wrdir ;to directory? -0618 EA0E 3A D2 FB ld a,(erflag) ;in case of errors -0619 EA11 C0 ret nz ;no further processing -0620 EA12 ; -0621 EA12 ; clear host buffer for directory write -0622 EA12 B7 or a ;errors? -0623 EA13 C0 ret nz ;skip if so -0624 EA14 AF xor a ;0 to accum -0625 EA15 32 CC FB ld (hstwrt),a ;buffer written -0626 EA18 CD C4 EA call writehst -0627 EA1B 3A D2 FB ld a,(erflag) -0628 EA1E C9 ret -0629 EA1F -0630 EA1F ;------------------------------------------------------------------------------------------------ -0631 EA1F ;Utility subroutine for 16-bit compare -0632 EA1F sektrkcmp: -0633 EA1F ;HL = .unatrk or .hsttrk, compare with sektrk -0634 EA1F EB ex de,hl -0635 EA20 21 C2 FB ld hl,sektrk -0636 EA23 1A ld a,(de) ;low byte compare -0637 EA24 BE cp (HL) ;same? -0638 EA25 C0 ret nz ;return if not -0639 EA26 ; low bytes equal, test high 1s -0640 EA26 13 inc de -0641 EA27 23 inc hl -0642 EA28 1A ld a,(de) -0643 EA29 BE cp (hl) ;sets flags -0644 EA2A C9 ret -0645 EA2B -0646 EA2B ;================================================================================================ -0647 EA2B ; Convert track/head/sector into LBA for physical access to the disk -0648 EA2B ;================================================================================================ -0649 EA2B setLBAaddr: -0650 EA2B 2A C7 FB LD HL,(hsttrk) -0651 EA2E CB 05 RLC L -0652 EA30 CB 05 RLC L -0653 EA32 CB 05 RLC L -0654 EA34 CB 05 RLC L -0655 EA36 CB 05 RLC L -0656 EA38 7D LD A,L -0657 EA39 E6 E0 AND 0E0H -0658 EA3B 6F LD L,A -0659 EA3C 3A C9 FB LD A,(hstsec) -0660 EA3F 85 ADD A,L -0661 EA40 32 9D FB LD (lba0),A -0662 EA43 -0663 EA43 2A C7 FB LD HL,(hsttrk) -0664 EA46 CB 0D RRC L -0665 EA48 CB 0D RRC L -0666 EA4A CB 0D RRC L -0667 EA4C 7D LD A,L -0668 EA4D E6 1F AND 01FH -0669 EA4F 6F LD L,A -0670 EA50 CB 04 RLC H -0671 EA52 CB 04 RLC H -0672 EA54 CB 04 RLC H -0673 EA56 CB 04 RLC H -0674 EA58 CB 04 RLC H -0675 EA5A 7C LD A,H -0676 EA5B E6 20 AND 020H -0677 EA5D 67 LD H,A -0678 EA5E 3A C6 FB LD A,(hstdsk) -0679 EA61 CB 07 RLC a -0680 EA63 CB 07 RLC a -0681 EA65 CB 07 RLC a -0682 EA67 CB 07 RLC a -0683 EA69 CB 07 RLC a -0684 EA6B CB 07 RLC a -0685 EA6D E6 C0 AND 0C0H -0686 EA6F 84 ADD A,H -0687 EA70 85 ADD A,L -0688 EA71 32 9E FB LD (lba1),A -0689 EA74 -0690 EA74 3A C6 FB LD A,(hstdsk) -0691 EA77 CB 0F RRC A -0692 EA79 CB 0F RRC A -0693 EA7B E6 03 AND 03H -0694 EA7D 32 9F FB LD (lba2),A -0695 EA80 -0696 EA80 3E 00 LD a,00H -0697 EA82 32 A0 FB LD (lba3),A -0698 EA85 -0699 EA85 ; Transfer LBA to disk (LBA3 not used on SD card) -0700 EA85 3A 9F FB LD A,(lba2) -0701 EA88 D3 8C OUT (SD_LBA2),A -0702 EA8A 3A 9E FB LD A,(lba1) -0703 EA8D D3 8B OUT (SD_LBA1),A -0704 EA8F 3A 9D FB LD A,(lba0) -0705 EA92 D3 8A OUT (SD_LBA0),A -0706 EA94 C9 RET -0707 EA95 -0708 EA95 ;================================================================================================ -0709 EA95 ; Read physical sector from host -0710 EA95 ;================================================================================================ -0711 EA95 -0712 EA95 readhst: -0713 EA95 F5 PUSH AF -0714 EA96 C5 PUSH BC -0715 EA97 E5 PUSH HL -0716 EA98 -0717 EA98 DB 89 rdWait1: IN A,(SD_STATUS) -0718 EA9A FE 80 CP 128 -0719 EA9C 20 FA JR NZ,rdWait1 -0720 EA9E -0721 EA9E CD 2B EA CALL setLBAaddr -0722 EAA1 -0723 EAA1 3E 00 LD A,$00 ; 00 = Read block -0724 EAA3 D3 89 OUT (SD_CONTROL),A -0725 EAA5 -0726 EAA5 0E 04 LD c,4 -0727 EAA7 21 D8 FB LD HL,hstbuf -0728 EAAA rd4secs: -0729 EAAA 06 80 LD b,128 -0730 EAAC rdByte: -0731 EAAC -0732 EAAC DB 89 rdWait2: IN A,(SD_STATUS) -0733 EAAE FE E0 CP 224 ; Read byte waiting -0734 EAB0 20 FA JR NZ,rdWait2 -0735 EAB2 -0736 EAB2 DB 88 IN A,(SD_DATA) -0737 EAB4 -0738 EAB4 77 LD (HL),A -0739 EAB5 23 INC HL -0740 EAB6 05 dec b -0741 EAB7 20 F3 JR NZ, rdByte -0742 EAB9 0D dec c -0743 EABA 20 EE JR NZ,rd4secs -0744 EABC -0745 EABC E1 POP HL -0746 EABD C1 POP BC -0747 EABE F1 POP AF -0748 EABF -0749 EABF AF XOR a -0750 EAC0 32 D2 FB ld (erflag),a -0751 EAC3 C9 RET -0752 EAC4 -0753 EAC4 -0754 EAC4 ;================================================================================================ -0755 EAC4 ; Write physical sector to host -0756 EAC4 ;================================================================================================ -0757 EAC4 -0758 EAC4 writehst: -0759 EAC4 F5 PUSH AF -0760 EAC5 C5 PUSH BC -0761 EAC6 E5 PUSH HL -0762 EAC7 -0763 EAC7 DB 89 wrWait1: IN A,(SD_STATUS) -0764 EAC9 FE 80 CP 128 -0765 EACB 20 FA JR NZ,wrWait1 -0766 EACD -0767 EACD CD 2B EA CALL setLBAaddr -0768 EAD0 -0769 EAD0 3E 01 LD A,$01 ; 01 = Write block -0770 EAD2 D3 89 OUT (SD_CONTROL),A -0771 EAD4 -0772 EAD4 0E 04 LD c,4 -0773 EAD6 21 D8 FB LD HL,hstbuf -0774 EAD9 wr4secs: -0775 EAD9 06 80 LD b,128 -0776 EADB wrByte: -0777 EADB -0778 EADB DB 89 wrWait2: IN A,(SD_STATUS) -0779 EADD FE A0 CP 160 ; Write buffer empty -0780 EADF 20 FA JR NZ,wrWait2 -0781 EAE1 -0782 EAE1 ; UPDATE S0urceror, inserted wait cycle between IN and OUT -0783 EAE1 ; to resolve unknown write issue in sd_controller.vhd in combination -0784 EAE1 ; with MISTer virtual SD interface sys/sd_card.sv -0785 EAE1 ; which results in hangs or write errors. -0786 EAE1 C5 push bc -0787 EAE2 06 32 ld b,50 -0788 EAE4 _again: -0789 EAE4 10 FE djnz _again -0790 EAE6 C1 pop bc -0791 EAE7 ; END UPDATE -0792 EAE7 -0793 EAE7 7E LD A,(HL) -0794 EAE8 D3 88 OUT (SD_DATA),A -0795 EAEA 23 INC HL -0796 EAEB 05 dec b -0797 EAEC 20 ED JR NZ, wrByte -0798 EAEE -0799 EAEE 0D dec c -0800 EAEF 20 E8 JR NZ,wr4secs -0801 EAF1 -0802 EAF1 E1 POP HL -0803 EAF2 C1 POP BC -0804 EAF3 F1 POP AF -0805 EAF4 -0806 EAF4 AF XOR a -0807 EAF5 32 D2 FB ld (erflag),a -0808 EAF8 C9 RET -0809 EAF9 -0810 EAF9 ;================================================================================================ -0811 EAF9 ; Utilities -0812 EAF9 ;================================================================================================ -0813 EAF9 -0814 EAF9 printInline: -0815 EAF9 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL -0816 EAFA F5 PUSH AF -0817 EAFB C5 PUSH BC -0818 EAFC 7E nextILChar: LD A,(HL) -0819 EAFD FE 00 CP 0 -0820 EAFF 28 07 JR Z,endOfPrint -0821 EB01 4F LD C,A -0822 EB02 CD 96 E8 CALL conout ; Print to TTY -0823 EB05 23 iNC HL -0824 EB06 18 F4 JR nextILChar -0825 EB08 23 endOfPrint: INC HL ; Get past "null" terminator -0826 EB09 C1 POP BC -0827 EB0A F1 POP AF -0828 EB0B E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL -0829 EB0C C9 RET -0830 EB0D -0831 EB0D ;================================================================================================ -0832 EB0D ; Data storage -0833 EB0D ;================================================================================================ -0834 EB0D -0835 EB0D dirbuf: .ds 128 ;scratch directory area -0836 EB8D alv00: .ds 257 ;allocation vector 0 -0837 EC8E alv01: .ds 257 ;allocation vector 1 -0838 ED8F alv02: .ds 257 ;allocation vector 2 -0839 EE90 alv03: .ds 257 ;allocation vector 3 -0840 EF91 alv04: .ds 257 ;allocation vector 4 -0841 F092 alv05: .ds 257 ;allocation vector 5 -0842 F193 alv06: .ds 257 ;allocation vector 6 -0843 F294 alv07: .ds 257 ;allocation vector 7 -0844 F395 alv08: .ds 257 ;allocation vector 8 -0845 F496 alv09: .ds 257 ;allocation vector 9 -0846 F597 alv10: .ds 257 ;allocation vector 10 -0847 F698 alv11: .ds 257 ;allocation vector 11 -0848 F799 alv12: .ds 257 ;allocation vector 12 -0849 F89A alv13: .ds 257 ;allocation vector 13 -0850 F99B alv14: .ds 257 ;allocation vector 14 -0851 FA9C alv15: .ds 257 ;allocation vector 15 -0852 FB9D -0853 FB9D 00 lba0 .DB 00h -0854 FB9E 00 lba1 .DB 00h -0855 FB9F 00 lba2 .DB 00h -0856 FBA0 00 lba3 .DB 00h -0857 FBA1 -0858 FBA1 .DS 020h ; Start of BIOS stack area. -0859 FBC1 biosstack: .EQU $ -0860 FBC1 -0861 FBC1 sekdsk: .ds 1 ;seek disk number -0862 FBC2 sektrk: .ds 2 ;seek track number -0863 FBC4 seksec: .ds 2 ;seek sector number -0864 FBC6 ; -0865 FBC6 hstdsk: .ds 1 ;host disk number -0866 FBC7 hsttrk: .ds 2 ;host track number -0867 FBC9 hstsec: .ds 1 ;host sector number -0868 FBCA ; -0869 FBCA sekhst: .ds 1 ;seek shr secshf -0870 FBCB hstact: .ds 1 ;host active flag -0871 FBCC hstwrt: .ds 1 ;host written flag -0872 FBCD ; -0873 FBCD unacnt: .ds 1 ;unalloc rec cnt -0874 FBCE unadsk: .ds 1 ;last unalloc disk -0875 FBCF unatrk: .ds 2 ;last unalloc track -0876 FBD1 unasec: .ds 1 ;last unalloc sector -0877 FBD2 ; -0878 FBD2 erflag: .ds 1 ;error reporting -0879 FBD3 rsflag: .ds 1 ;read sector flag -0880 FBD4 readop: .ds 1 ;1 if read operation -0881 FBD5 wrtype: .ds 1 ;write operation type -0882 FBD6 dmaAddr: .ds 2 ;last dma address -0883 FBD8 hstbuf: .ds 512 ;host buffer -0884 FDD8 -0885 FDD8 hstBufEnd: .EQU $ -0886 FDD8 -0887 FDD8 biosEnd: .EQU $ -0888 FDD8 -0889 FDD8 ; Disable the ROM, pop the active IO port from the stack (supplied by monitor), -0890 FDD8 ; then start CP/M -0891 FDD8 popAndRun: -0892 FDD8 3E 01 LD A,$01 -0893 FDDA D3 38 OUT ($38),A -0894 FDDC -0895 FDDC F1 POP AF -0896 FDDD FE 01 CP $01 -0897 FDDF 28 04 JR Z,consoleAtB -0898 FDE1 3E 01 LD A,$01 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:) -0899 FDE3 18 02 JR setIOByte -0900 FDE5 3E 00 consoleAtB: LD A,$00 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is TTY:) -0901 FDE7 32 03 00 setIOByte: LD (iobyte),A -0902 FDEA C3 00 E6 JP bios -0903 FDED -0904 FDED -0905 FDED ;================================================================================= -0906 FDED ; Relocate TPA area from 4100 to 0100 then start CP/M -0907 FDED ; Used to manually transfer a loaded program after CP/M was previously loaded -0908 FDED ;================================================================================= -0909 FDED -0910 FFE8 .org 0FFE8H -0911 FFE8 3E 01 LD A,$01 -0912 FFEA D3 38 OUT ($38),A -0913 FFEC -0914 FFEC 21 00 41 LD HL,04100H -0915 FFEF 11 00 01 LD DE,00100H -0916 FFF2 01 00 8F LD BC,08F00H -0917 FFF5 ED B0 LDIR -0918 FFF7 C3 00 E6 JP bios -0919 FFFA -0920 FFFA ;================================================================================= -0921 FFFA ; Normal start CP/M vector -0922 FFFA ;================================================================================= -0923 FFFA -0924 FFFE .ORG 0FFFEH -0925 FFFE D8 FD .dw popAndRun -0926 0000 -0927 0000 .END -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; Contents of this file are copyright Grant Searle +0003 0000 ; Blocking/unblocking routines are the published version by Digital Research +0004 0000 ; (bugfixed, as found on the web) +0005 0000 ; +0006 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0007 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0008 0000 ; +0009 0000 ; http://searle.hostei.com/grant/index.html +0010 0000 ; +0011 0000 ; eMail: home.micros01@btinternet.com +0012 0000 ; +0013 0000 ; If the above don't work, please perform an Internet search to see if I have +0014 0000 ; updated the web page hosting service. +0015 0000 ; +0016 0000 ;================================================================================== +0017 0000 +0018 0000 ccp .EQU 0D000h ; Base of CCP. +0019 0000 bdos .EQU ccp + 0806h ; Base of BDOS. +0020 0000 bios .EQU ccp + 1600h ; Base of BIOS. +0021 0000 +0022 0000 ; Set CP/M low memory datA, vector and buffer addresses. +0023 0000 +0024 0000 iobyte .EQU 03h ; Intel standard I/O definition byte. +0025 0000 userdrv .EQU 04h ; Current user number and drive. +0026 0000 tpabuf .EQU 80h ; Default I/O buffer and command line storage. +0027 0000 +0028 0000 +0029 0000 SD_DATA .EQU 088H +0030 0000 SD_CONTROL .EQU 089H +0031 0000 SD_STATUS .EQU 089H +0032 0000 SD_LBA0 .EQU 08AH +0033 0000 SD_LBA1 .EQU 08BH +0034 0000 SD_LBA2 .EQU 08CH +0035 0000 +0036 0000 RTS_HIGH .EQU 0D5H +0037 0000 RTS_LOW .EQU 095H +0038 0000 +0039 0000 ACIA0_D .EQU $81 +0040 0000 ACIA0_C .EQU $80 +0041 0000 ACIA1_D .EQU $83 +0042 0000 ACIA1_C .EQU $82 +0043 0000 +0044 0000 nmi .EQU 66H +0045 0000 +0046 0000 blksiz .equ 4096 ;CP/M allocation size +0047 0000 hstsiz .equ 512 ;host disk sector size +0048 0000 hstspt .equ 32 ;host disk sectors/trk +0049 0000 hstblk .equ hstsiz/128 ;CP/M sects/host buff +0050 0000 cpmspt .equ hstblk * hstspt ;CP/M sectors/track +0051 0000 secmsk .equ hstblk-1 ;sector mask +0052 0000 ;compute sector mask +0053 0000 ;secshf .equ 2 ;log2(hstblk) +0054 0000 +0055 0000 wrall .equ 0 ;write to allocated +0056 0000 wrdir .equ 1 ;write to directory +0057 0000 wrual .equ 2 ;write to unallocated +0058 0000 +0059 0000 LF .EQU 0AH ;line feed +0060 0000 FF .EQU 0CH ;form feed +0061 0000 CR .EQU 0DH ;carriage RETurn +0062 0000 +0063 0000 ;================================================================================================ +0064 0000 +0065 E600 .ORG bios ; BIOS origin. +0066 E600 +0067 E600 ;================================================================================================ +0068 E600 ; BIOS jump table. +0069 E600 ;================================================================================================ +0070 E600 C3 51 E7 JP boot ; 0 Initialize. +0071 E603 C3 B5 E7 wboote: JP wboot ; 1 Warm boot. +0072 E606 C3 1D E8 JP const ; 2 Console status. +0073 E609 C3 58 E8 JP conin ; 3 Console input. +0074 E60C C3 96 E8 JP conout ; 4 Console OUTput. +0075 E60F C3 7E E8 JP list ; 5 List OUTput. +0076 E612 C3 8A E8 JP punch ; 6 punch OUTput. +0077 E615 C3 4C E8 JP reader ; 7 Reader input. +0078 E618 C3 EF E8 JP home ; 8 Home disk. +0079 E61B C3 C7 E8 JP seldsk ; 9 Select disk. +0080 E61E C3 FB E8 JP settrk ; 10 Select track. +0081 E621 C3 00 E9 JP setsec ; 11 Select sector. +0082 E624 C3 05 E9 JP setdma ; 12 Set DMA ADDress. +0083 E627 C3 0D E9 JP read ; 13 Read 128 bytes. +0084 E62A C3 21 E9 JP write ; 14 Write 128 bytes. +0085 E62D C3 C4 E8 JP listst ; 15 List status. +0086 E630 C3 0A E9 JP sectran ; 16 Sector translate. +0087 E633 +0088 E633 ;================================================================================================ +0089 E633 ; Disk parameter headers for disk 0 to 15 +0090 E633 ;================================================================================================ +0091 E633 dpbase: +0092 E633 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb0,0000h,alv00 +0092 E637 00 00 00 00 +0092 E63B 43 EB 33 E7 +0092 E63F 00 00 C3 EB +0093 E643 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv01 +0093 E647 00 00 00 00 +0093 E64B 43 EB 42 E7 +0093 E64F 00 00 C4 EC +0094 E653 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv02 +0094 E657 00 00 00 00 +0094 E65B 43 EB 42 E7 +0094 E65F 00 00 C5 ED +0095 E663 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv03 +0095 E667 00 00 00 00 +0095 E66B 43 EB 42 E7 +0095 E66F 00 00 C6 EE +0096 E673 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv04 +0096 E677 00 00 00 00 +0096 E67B 43 EB 42 E7 +0096 E67F 00 00 C7 EF +0097 E683 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv05 +0097 E687 00 00 00 00 +0097 E68B 43 EB 42 E7 +0097 E68F 00 00 C8 F0 +0098 E693 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv06 +0098 E697 00 00 00 00 +0098 E69B 43 EB 42 E7 +0098 E69F 00 00 C9 F1 +0099 E6A3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv07 +0099 E6A7 00 00 00 00 +0099 E6AB 43 EB 42 E7 +0099 E6AF 00 00 CA F2 +0100 E6B3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv08 +0100 E6B7 00 00 00 00 +0100 E6BB 43 EB 42 E7 +0100 E6BF 00 00 CB F3 +0101 E6C3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv09 +0101 E6C7 00 00 00 00 +0101 E6CB 43 EB 42 E7 +0101 E6CF 00 00 CC F4 +0102 E6D3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv10 +0102 E6D7 00 00 00 00 +0102 E6DB 43 EB 42 E7 +0102 E6DF 00 00 CD F5 +0103 E6E3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv11 +0103 E6E7 00 00 00 00 +0103 E6EB 43 EB 42 E7 +0103 E6EF 00 00 CE F6 +0104 E6F3 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv12 +0104 E6F7 00 00 00 00 +0104 E6FB 43 EB 42 E7 +0104 E6FF 00 00 CF F7 +0105 E703 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv13 +0105 E707 00 00 00 00 +0105 E70B 43 EB 42 E7 +0105 E70F 00 00 D0 F8 +0106 E713 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv14 +0106 E717 00 00 00 00 +0106 E71B 43 EB 42 E7 +0106 E71F 00 00 D1 F9 +0107 E723 00 00 00 00 .DW 0000h,0000h,0000h,0000h,dirbuf,dpb,0000h,alv15 +0107 E727 00 00 00 00 +0107 E72B 43 EB 42 E7 +0107 E72F 00 00 D2 FA +0108 E733 +0109 E733 ; First drive has a reserved track for CP/M +0110 E733 dpb0: +0111 E733 80 00 .DW 128 ;SPT - sectors per track +0112 E735 05 .DB 5 ;BSH - block shift factor +0113 E736 1F .DB 31 ;BLM - block mask +0114 E737 01 .DB 1 ;EXM - Extent mask +0115 E738 FB 07 .DW 2043 ; (2047-4) DSM - Storage size (blocks - 1) +0116 E73A FF 01 .DW 511 ;DRM - Number of directory entries - 1 +0117 E73C F0 .DB 240 ;AL0 - 1 bit set per directory block +0118 E73D 00 .DB 0 ;AL1 - " +0119 E73E 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) +0120 E740 01 00 .DW 1 ;OFF - Reserved tracks +0121 E742 +0122 E742 dpb: +0123 E742 80 00 .DW 128 ;SPT - sectors per track +0124 E744 05 .DB 5 ;BSH - block shift factor +0125 E745 1F .DB 31 ;BLM - block mask +0126 E746 01 .DB 1 ;EXM - Extent mask +0127 E747 FF 07 .DW 2047 ;DSM - Storage size (blocks - 1) +0128 E749 FF 01 .DW 511 ;DRM - Number of directory entries - 1 +0129 E74B F0 .DB 240 ;AL0 - 1 bit set per directory block +0130 E74C 00 .DB 0 ;AL1 - " +0131 E74D 00 00 .DW 0 ;CKS - DIR check vector size (DRM+1)/4 (0=fixed disk) +0132 E74F 00 00 .DW 0 ;OFF - Reserved tracks +0133 E751 +0134 E751 ;================================================================================================ +0135 E751 ; Cold boot +0136 E751 ;================================================================================================ +0137 E751 +0138 E751 boot: +0139 E751 F3 DI ; Disable interrupts. +0140 E752 31 F7 FB LD SP,biosstack ; Set default stack. +0141 E755 +0142 E755 ; Turn off ROM +0143 E755 +0144 E755 3E 01 LD A,$01 +0145 E757 D3 38 OUT ($38),A +0146 E759 +0147 E759 3E 95 LD A,RTS_LOW +0148 E75B D3 80 OUT (ACIA0_C),A ; Initialise ACIA0 +0149 E75D D3 82 OUT (ACIA1_C),A ; Initialise ACIA1 +0150 E75F +0151 E75F CD 2F EB CALL printInline +0152 E762 0C .DB FF +0153 E763 43 50 2F 4D .TEXT "CP/M BIOS 2.0 by G. Searle 2013" +0153 E767 20 42 49 4F +0153 E76B 53 20 32 2E +0153 E76F 30 20 62 79 +0153 E773 20 47 2E 20 +0153 E777 53 65 61 72 +0153 E77B 6C 65 20 32 +0153 E77F 30 31 33 +0154 E782 0D 0A .DB CR,LF +0155 E784 0D 0A .DB CR,LF +0156 E786 43 50 2F 4D .TEXT "CP/M 2.2 " +0156 E78A 20 32 2E 32 +0156 E78E 20 +0157 E78F 28 63 29 .TEXT "(c)" +0158 E792 20 31 39 37 .TEXT " 1979 by Digital Research" +0158 E796 39 20 62 79 +0158 E79A 20 44 69 67 +0158 E79E 69 74 61 6C +0158 E7A2 20 52 65 73 +0158 E7A6 65 61 72 63 +0158 E7AA 68 +0159 E7AB 0D 0A 00 .DB CR,LF,0 +0160 E7AE +0161 E7AE ; CALL sdPreamble?? +0162 E7AE +0163 E7AE AF XOR a ; Clear I/O & drive bytes. +0164 E7AF 32 04 00 LD (userdrv),A +0165 E7B2 C3 F5 E7 JP gocpm +0166 E7B5 +0167 E7B5 ;================================================================================================ +0168 E7B5 ; Warm boot +0169 E7B5 ;================================================================================================ +0170 E7B5 +0171 E7B5 wboot: +0172 E7B5 F3 DI ; Disable interrupts. +0173 E7B6 31 F7 FB LD SP,biosstack ; Set default stack. +0174 E7B9 +0175 E7B9 06 0B LD B,11 ; Number of sectors to reload +0176 E7BB +0177 E7BB 3E 00 LD A,0 +0178 E7BD 32 FF FB LD (hstsec),A +0179 E7C0 D3 8C OUT (SD_LBA2),A +0180 E7C2 D3 8B OUT (SD_LBA1),A +0181 E7C4 +0182 E7C4 21 00 D0 LD HL,ccp +0183 E7C7 +0184 E7C7 wbRdAllSecs: +0185 E7C7 +0186 E7C7 DB 89 wBrdWait1: IN A,(SD_STATUS) +0187 E7C9 FE 80 CP 128 +0188 E7CB 20 FA JR NZ,wBrdWait1 +0189 E7CD +0190 E7CD 3A FF FB LD A,(hstsec) +0191 E7D0 D3 8A OUT (SD_LBA0),A +0192 E7D2 +0193 E7D2 3E 00 LD A,$00 ; 00 = Read block +0194 E7D4 D3 89 OUT (SD_CONTROL),A +0195 E7D6 C5 PUSH BC +0196 E7D7 +0197 E7D7 0E 04 LD c,4 +0198 E7D9 wBrd4secs: +0199 E7D9 06 80 LD b,128 +0200 E7DB wBrdByte: +0201 E7DB +0202 E7DB DB 89 wBrdWait2: IN A,(SD_STATUS) +0203 E7DD FE E0 CP 224 ; Read byte waiting +0204 E7DF 20 FA JR NZ,wBrdWait2 +0205 E7E1 +0206 E7E1 DB 88 IN A,(SD_DATA) +0207 E7E3 +0208 E7E3 77 LD (HL),A +0209 E7E4 23 INC HL +0210 E7E5 05 dec b +0211 E7E6 20 F3 JR NZ, wBrdByte +0212 E7E8 +0213 E7E8 0D dec c +0214 E7E9 20 EE JR NZ,wBrd4secs +0215 E7EB +0216 E7EB 3A FF FB LD A,(hstsec) +0217 E7EE 3C INC A +0218 E7EF 32 FF FB LD (hstsec),A +0219 E7F2 +0220 E7F2 C1 POP BC +0221 E7F3 +0222 E7F3 10 D2 DJNZ wbRdAllSecs +0223 E7F5 ;================================================================================================ +0224 E7F5 ; Common code for cold and warm boot +0225 E7F5 ;================================================================================================ +0226 E7F5 +0227 E7F5 gocpm: +0228 E7F5 AF xor a ;0 to accumulator +0229 E7F6 32 01 FC ld (hstact),a ;host buffer inactive +0230 E7F9 32 03 FC ld (unacnt),a ;clear unalloc count +0231 E7FC +0232 E7FC 21 80 00 LD HL,tpabuf ; Address of BIOS DMA buffer. +0233 E7FF 22 0C FC LD (dmaAddr),HL +0234 E802 3E C3 LD A,0C3h ; Opcode for 'JP'. +0235 E804 32 00 00 LD (00h),A ; Load at start of RAM. +0236 E807 21 03 E6 LD HL,wboote ; Address of jump for a warm boot. +0237 E80A 22 01 00 LD (01h),HL +0238 E80D 32 05 00 LD (05h),A ; Opcode for 'JP'. +0239 E810 21 06 D8 LD HL,bdos ; Address of jump for the BDOS. +0240 E813 22 06 00 LD (06h),HL +0241 E816 3A 04 00 LD A,(userdrv) ; Save new drive number (0). +0242 E819 4F LD c,A ; Pass drive number in C. +0243 E81A +0244 E81A C3 00 D0 JP ccp ; Start CP/M by jumping to the CCP. +0245 E81D +0246 E81D ;================================================================================================ +0247 E81D ; Console I/O routines +0248 E81D ;================================================================================================ +0249 E81D +0250 E81D +0251 E81D ;------------------------------------------------------------------------------------------------ +0252 E81D const: +0253 E81D 3A 03 00 LD A,(iobyte) +0254 E820 E6 0B AND 00001011b ; Mask off console and high bit of reader +0255 E822 FE 0A CP 00001010b ; redirected to reader on UR1/2 (Serial A) +0256 E824 28 0A JR Z,constA +0257 E826 FE 02 CP 00000010b ; redirected to reader on TTY/RDR (Serial B) +0258 E828 28 14 JR Z,constB +0259 E82A +0260 E82A E6 03 AND $03 ; remove the reader from the mask - only console bits then remain +0261 E82C FE 01 CP $01 +0262 E82E 20 0E JR NZ,constB +0263 E830 constA: +0264 E830 DB 80 IN A,(ACIA0_C) ; Status byte +0265 E832 E6 01 AND $01 +0266 E834 FE 00 CP $0 ; Z flag set if no char +0267 E836 28 03 JR Z, dataAEmpty +0268 E838 3E FF LD A,0FFH +0269 E83A C9 RET +0270 E83B dataAEmpty: +0271 E83B 3E 00 LD A,0 +0272 E83D C9 RET +0273 E83E +0274 E83E +0275 E83E constB: +0276 E83E DB 82 IN A,(ACIA1_C) ; Status byte +0277 E840 E6 01 AND $01 +0278 E842 FE 00 CP $0 ; Z flag set if no char +0279 E844 28 03 JR Z, dataBEmpty +0280 E846 3E FF LD A,0FFH +0281 E848 C9 RET +0282 E849 dataBEmpty: +0283 E849 3E 00 LD A,0 +0284 E84B C9 RET +0285 E84C +0286 E84C ;------------------------------------------------------------------------------------------------ +0287 E84C reader: +0288 E84C F5 PUSH AF +0289 E84D 3A 03 00 reader2: LD A,(iobyte) +0290 E850 E6 08 AND $08 +0291 E852 FE 08 CP $08 +0292 E854 20 1C JR NZ,coninB +0293 E856 18 0E JR coninA +0294 E858 ;------------------------------------------------------------------------------------------------ +0295 E858 conin: +0296 E858 F5 PUSH AF +0297 E859 3A 03 00 LD A,(iobyte) +0298 E85C E6 03 AND $03 +0299 E85E FE 02 CP $02 +0300 E860 28 EB JR Z,reader2 ; "BAT:" redirect +0301 E862 FE 01 CP $01 +0302 E864 20 0C JR NZ,coninB +0303 E866 +0304 E866 +0305 E866 coninA: +0306 E866 F1 POP AF +0307 E867 waitForCharA: +0308 E867 DB 80 IN A,(ACIA0_C) ; Status byte +0309 E869 E6 01 AND $01 +0310 E86B FE 00 CP $0 ; Z flag set if no char +0311 E86D 28 F8 JR Z, waitForCharA +0312 E86F DB 81 IN A,(ACIA0_D) +0313 E871 +0314 E871 C9 RET ; Char ready in A +0315 E872 +0316 E872 +0317 E872 coninB: +0318 E872 F1 POP AF +0319 E873 waitForCharB: +0320 E873 DB 82 IN A,(ACIA1_C) ; Status byte +0321 E875 E6 01 AND $01 +0322 E877 FE 00 CP $0 ; Z flag set if no char +0323 E879 28 F8 JR Z, waitForCharB +0324 E87B DB 83 IN A,(ACIA1_D) +0325 E87D +0326 E87D C9 RET ; Char ready in A +0327 E87E +0328 E87E ;------------------------------------------------------------------------------------------------ +0329 E87E F5 list: PUSH AF ; Store character +0330 E87F 3A 03 00 list2: LD A,(iobyte) +0331 E882 E6 C0 AND $C0 +0332 E884 FE 40 CP $40 +0333 E886 20 26 JR NZ,conoutB1 +0334 E888 18 1A JR conoutA1 +0335 E88A +0336 E88A ;------------------------------------------------------------------------------------------------ +0337 E88A F5 punch: PUSH AF ; Store character +0338 E88B 3A 03 00 LD A,(iobyte) +0339 E88E E6 20 AND $20 +0340 E890 FE 20 CP $20 +0341 E892 20 1A JR NZ,conoutB1 +0342 E894 18 0E JR conoutA1 +0343 E896 +0344 E896 ;------------------------------------------------------------------------------------------------ +0345 E896 F5 conout: PUSH AF +0346 E897 3A 03 00 LD A,(iobyte) +0347 E89A E6 03 AND $03 +0348 E89C FE 02 CP $02 +0349 E89E 28 DF JR Z,list2 ; "BAT:" redirect +0350 E8A0 FE 01 CP $01 +0351 E8A2 20 0A JR NZ,conoutB1 +0352 E8A4 +0353 E8A4 CD B8 E8 conoutA1: CALL CKACIA0 ; See if ACIA channel A is finished transmitting +0354 E8A7 28 FB JR Z,conoutA1 ; Loop until ACIA flag signals ready +0355 E8A9 79 LD A,C +0356 E8AA D3 81 OUT (ACIA0_D),A ; OUTput the character +0357 E8AC F1 POP AF +0358 E8AD C9 RET +0359 E8AE +0360 E8AE CD BE E8 conoutB1: CALL CKACIA1 ; See if ACIA channel B is finished transmitting +0361 E8B1 28 FB JR Z,conoutB1 ; Loop until ACIA flag signals ready +0362 E8B3 79 LD A,C +0363 E8B4 D3 83 OUT (ACIA1_D),A ; OUTput the character +0364 E8B6 F1 POP AF +0365 E8B7 C9 RET +0366 E8B8 +0367 E8B8 ;------------------------------------------------------------------------------------------------ +0368 E8B8 CKACIA0 +0369 E8B8 DB 80 IN A,(ACIA0_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0370 E8BA 0F RRCA ; Rotates RX status into Carry Flag, +0371 E8BB CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0372 E8BD C9 RET +0373 E8BE +0374 E8BE CKACIA1 +0375 E8BE DB 82 IN A,(ACIA1_C) ; Status byte D1=TX Buff Empty, D0=RX char ready +0376 E8C0 0F RRCA ; Rotates RX status into Carry Flag, +0377 E8C1 CB 47 BIT 0,A ; Set Zero flag if still transmitting character +0378 E8C3 C9 RET +0379 E8C4 +0380 E8C4 ;------------------------------------------------------------------------------------------------ +0381 E8C4 3E FF listst: LD A,$FF ; Return list status of 0xFF (ready). +0382 E8C6 C9 RET +0383 E8C7 +0384 E8C7 ;================================================================================================ +0385 E8C7 ; Disk processing entry points +0386 E8C7 ;================================================================================================ +0387 E8C7 +0388 E8C7 seldsk: +0389 E8C7 21 00 00 LD HL,$0000 +0390 E8CA 79 LD A,C +0391 E8CB FE 10 CP 16 ; 16 for 128MB disk, 8 for 64MB disk +0392 E8CD 38 0D jr C,chgdsk ; if invalid drive will give BDOS error +0393 E8CF 3A 04 00 LD A,(userdrv) ; so set the drive back to a: +0394 E8D2 B9 CP C ; If the default disk is not the same as the +0395 E8D3 C0 RET NZ ; selected drive then return, +0396 E8D4 AF XOR A ; else reset default back to a: +0397 E8D5 32 04 00 LD (userdrv),A ; otherwise will be stuck in a loop +0398 E8D8 32 F7 FB LD (sekdsk),A +0399 E8DB C9 ret +0400 E8DC +0401 E8DC 32 F7 FB chgdsk: LD (sekdsk),A +0402 E8DF CB 07 RLC a ;*2 +0403 E8E1 CB 07 RLC a ;*4 +0404 E8E3 CB 07 RLC a ;*8 +0405 E8E5 CB 07 RLC a ;*16 +0406 E8E7 21 33 E6 LD HL,dpbase +0407 E8EA 06 00 LD b,0 +0408 E8EC 4F LD c,A +0409 E8ED 09 ADD HL,BC +0410 E8EE +0411 E8EE C9 RET +0412 E8EF +0413 E8EF ;------------------------------------------------------------------------------------------------ +0414 E8EF home: +0415 E8EF 3A 02 FC ld a,(hstwrt) ;check for pending write +0416 E8F2 B7 or a +0417 E8F3 20 03 jr nz,homed +0418 E8F5 32 01 FC ld (hstact),a ;clear host active flag +0419 E8F8 homed: +0420 E8F8 01 00 00 LD BC,0000h +0421 E8FB +0422 E8FB ;------------------------------------------------------------------------------------------------ +0423 E8FB ED 43 F8 FB settrk: LD (sektrk),BC ; Set track passed from BDOS in register BC. +0424 E8FF C9 RET +0425 E900 +0426 E900 ;------------------------------------------------------------------------------------------------ +0427 E900 ED 43 FA FB setsec: LD (seksec),BC ; Set sector passed from BDOS in register BC. +0428 E904 C9 RET +0429 E905 +0430 E905 ;------------------------------------------------------------------------------------------------ +0431 E905 ED 43 0C FC setdma: LD (dmaAddr),BC ; Set DMA ADDress given by registers BC. +0432 E909 C9 RET +0433 E90A +0434 E90A ;------------------------------------------------------------------------------------------------ +0435 E90A C5 sectran: PUSH BC +0436 E90B E1 POP HL +0437 E90C C9 RET +0438 E90D +0439 E90D ;------------------------------------------------------------------------------------------------ +0440 E90D read: +0441 E90D ;read the selected CP/M sector +0442 E90D AF xor a +0443 E90E 32 03 FC ld (unacnt),a +0444 E911 3E 01 ld a,1 +0445 E913 32 0A FC ld (readop),a ;read operation +0446 E916 32 09 FC ld (rsflag),a ;must read data +0447 E919 3E 02 ld a,wrual +0448 E91B 32 0B FC ld (wrtype),a ;treat as unalloc +0449 E91E C3 88 E9 jp rwoper ;to perform the read +0450 E921 +0451 E921 +0452 E921 ;------------------------------------------------------------------------------------------------ +0453 E921 write: +0454 E921 ;write the selected CP/M sector +0455 E921 AF xor a ;0 to accumulator +0456 E922 32 0A FC ld (readop),a ;not a read operation +0457 E925 79 ld a,c ;write type in c +0458 E926 32 0B FC ld (wrtype),a +0459 E929 FE 02 cp wrual ;write unallocated? +0460 E92B 20 17 jr nz,chkuna ;check for unalloc +0461 E92D ; +0462 E92D ; write to unallocated, set parameters +0463 E92D 3E 20 ld a,blksiz/128 ;next unalloc recs +0464 E92F 32 03 FC ld (unacnt),a +0465 E932 3A F7 FB ld a,(sekdsk) ;disk to seek +0466 E935 32 04 FC ld (unadsk),a ;unadsk = sekdsk +0467 E938 2A F8 FB ld hl,(sektrk) +0468 E93B 22 05 FC ld (unatrk),hl ;unatrk = sectrk +0469 E93E 3A FA FB ld a,(seksec) +0470 E941 32 07 FC ld (unasec),a ;unasec = seksec +0471 E944 ; +0472 E944 chkuna: +0473 E944 ; check for write to unallocated sector +0474 E944 3A 03 FC ld a,(unacnt) ;any unalloc remain? +0475 E947 B7 or a +0476 E948 28 36 jr z,alloc ;skip if not +0477 E94A ; +0478 E94A ; more unallocated records remain +0479 E94A 3D dec a ;unacnt = unacnt-1 +0480 E94B 32 03 FC ld (unacnt),a +0481 E94E 3A F7 FB ld a,(sekdsk) ;same disk? +0482 E951 21 04 FC ld hl,unadsk +0483 E954 BE cp (hl) ;sekdsk = unadsk? +0484 E955 C2 80 E9 jp nz,alloc ;skip if not +0485 E958 ; +0486 E958 ; disks are the same +0487 E958 21 05 FC ld hl,unatrk +0488 E95B CD 1F EA call sektrkcmp ;sektrk = unatrk? +0489 E95E C2 80 E9 jp nz,alloc ;skip if not +0490 E961 ; +0491 E961 ; tracks are the same +0492 E961 3A FA FB ld a,(seksec) ;same sector? +0493 E964 21 07 FC ld hl,unasec +0494 E967 BE cp (hl) ;seksec = unasec? +0495 E968 C2 80 E9 jp nz,alloc ;skip if not +0496 E96B ; +0497 E96B ; match, move to next sector for future ref +0498 E96B 34 inc (hl) ;unasec = unasec+1 +0499 E96C 7E ld a,(hl) ;end of track? +0500 E96D FE 80 cp cpmspt ;count CP/M sectors +0501 E96F 38 09 jr c,noovf ;skip if no overflow +0502 E971 ; +0503 E971 ; overflow to next track +0504 E971 36 00 ld (hl),0 ;unasec = 0 +0505 E973 2A 05 FC ld hl,(unatrk) +0506 E976 23 inc hl +0507 E977 22 05 FC ld (unatrk),hl ;unatrk = unatrk+1 +0508 E97A ; +0509 E97A noovf: +0510 E97A ;match found, mark as unnecessary read +0511 E97A AF xor a ;0 to accumulator +0512 E97B 32 09 FC ld (rsflag),a ;rsflag = 0 +0513 E97E 18 08 jr rwoper ;to perform the write +0514 E980 ; +0515 E980 alloc: +0516 E980 ;not an unallocated record, requires pre-read +0517 E980 AF xor a ;0 to accum +0518 E981 32 03 FC ld (unacnt),a ;unacnt = 0 +0519 E984 3C inc a ;1 to accum +0520 E985 32 09 FC ld (rsflag),a ;rsflag = 1 +0521 E988 +0522 E988 ;------------------------------------------------------------------------------------------------ +0523 E988 rwoper: +0524 E988 ;enter here to perform the read/write +0525 E988 AF xor a ;zero to accum +0526 E989 32 08 FC ld (erflag),a ;no errors (yet) +0527 E98C 3A FA FB ld a,(seksec) ;compute host sector +0528 E98F B7 or a ;carry = 0 +0529 E990 1F rra ;shift right +0530 E991 B7 or a ;carry = 0 +0531 E992 1F rra ;shift right +0532 E993 32 00 FC ld (sekhst),a ;host sector to seek +0533 E996 ; +0534 E996 ; active host sector? +0535 E996 21 01 FC ld hl,hstact ;host active flag +0536 E999 7E ld a,(hl) +0537 E99A 36 01 ld (hl),1 ;always becomes 1 +0538 E99C B7 or a ;was it already? +0539 E99D 28 21 jr z,filhst ;fill host if not +0540 E99F ; +0541 E99F ; host buffer active, same as seek buffer? +0542 E99F 3A F7 FB ld a,(sekdsk) +0543 E9A2 21 FC FB ld hl,hstdsk ;same disk? +0544 E9A5 BE cp (hl) ;sekdsk = hstdsk? +0545 E9A6 20 11 jr nz,nomatch +0546 E9A8 ; +0547 E9A8 ; same disk, same track? +0548 E9A8 21 FD FB ld hl,hsttrk +0549 E9AB CD 1F EA call sektrkcmp ;sektrk = hsttrk? +0550 E9AE 20 09 jr nz,nomatch +0551 E9B0 ; +0552 E9B0 ; same disk, same track, same buffer? +0553 E9B0 3A 00 FC ld a,(sekhst) +0554 E9B3 21 FF FB ld hl,hstsec ;sekhst = hstsec? +0555 E9B6 BE cp (hl) +0556 E9B7 28 24 jr z,match ;skip if match +0557 E9B9 ; +0558 E9B9 nomatch: +0559 E9B9 ;proper disk, but not correct sector +0560 E9B9 3A 02 FC ld a,(hstwrt) ;host written? +0561 E9BC B7 or a +0562 E9BD C4 EA EA call nz,writehst ;clear host buff +0563 E9C0 ; +0564 E9C0 filhst: +0565 E9C0 ;may have to fill the host buffer +0566 E9C0 3A F7 FB ld a,(sekdsk) +0567 E9C3 32 FC FB ld (hstdsk),a +0568 E9C6 2A F8 FB ld hl,(sektrk) +0569 E9C9 22 FD FB ld (hsttrk),hl +0570 E9CC 3A 00 FC ld a,(sekhst) +0571 E9CF 32 FF FB ld (hstsec),a +0572 E9D2 3A 09 FC ld a,(rsflag) ;need to read? +0573 E9D5 B7 or a +0574 E9D6 C4 95 EA call nz,readhst ;yes, if 1 +0575 E9D9 AF xor a ;0 to accum +0576 E9DA 32 02 FC ld (hstwrt),a ;no pending write +0577 E9DD ; +0578 E9DD match: +0579 E9DD ;copy data to or from buffer +0580 E9DD 3A FA FB ld a,(seksec) ;mask buffer number +0581 E9E0 E6 03 and secmsk ;least signif bits +0582 E9E2 6F ld l,a ;ready to shift +0583 E9E3 26 00 ld h,0 ;double count +0584 E9E5 29 add hl,hl +0585 E9E6 29 add hl,hl +0586 E9E7 29 add hl,hl +0587 E9E8 29 add hl,hl +0588 E9E9 29 add hl,hl +0589 E9EA 29 add hl,hl +0590 E9EB 29 add hl,hl +0591 E9EC ; hl has relative host buffer address +0592 E9EC 11 0E FC ld de,hstbuf +0593 E9EF 19 add hl,de ;hl = host address +0594 E9F0 EB ex de,hl ;now in DE +0595 E9F1 2A 0C FC ld hl,(dmaAddr) ;get/put CP/M data +0596 E9F4 0E 80 ld c,128 ;length of move +0597 E9F6 3A 0A FC ld a,(readop) ;which way? +0598 E9F9 B7 or a +0599 E9FA 20 06 jr nz,rwmove ;skip if read +0600 E9FC ; +0601 E9FC ; write operation, mark and switch direction +0602 E9FC 3E 01 ld a,1 +0603 E9FE 32 02 FC ld (hstwrt),a ;hstwrt = 1 +0604 EA01 EB ex de,hl ;source/dest swap +0605 EA02 ; +0606 EA02 rwmove: +0607 EA02 ;C initially 128, DE is source, HL is dest +0608 EA02 1A ld a,(de) ;source character +0609 EA03 13 inc de +0610 EA04 77 ld (hl),a ;to dest +0611 EA05 23 inc hl +0612 EA06 0D dec c ;loop 128 times +0613 EA07 20 F9 jr nz,rwmove +0614 EA09 ; +0615 EA09 ; data has been moved to/from host buffer +0616 EA09 3A 0B FC ld a,(wrtype) ;write type +0617 EA0C FE 01 cp wrdir ;to directory? +0618 EA0E 3A 08 FC ld a,(erflag) ;in case of errors +0619 EA11 C0 ret nz ;no further processing +0620 EA12 ; +0621 EA12 ; clear host buffer for directory write +0622 EA12 B7 or a ;errors? +0623 EA13 C0 ret nz ;skip if so +0624 EA14 AF xor a ;0 to accum +0625 EA15 32 02 FC ld (hstwrt),a ;buffer written +0626 EA18 CD EA EA call writehst +0627 EA1B 3A 08 FC ld a,(erflag) +0628 EA1E C9 ret +0629 EA1F +0630 EA1F ;------------------------------------------------------------------------------------------------ +0631 EA1F ;Utility subroutine for 16-bit compare +0632 EA1F sektrkcmp: +0633 EA1F ;HL = .unatrk or .hsttrk, compare with sektrk +0634 EA1F EB ex de,hl +0635 EA20 21 F8 FB ld hl,sektrk +0636 EA23 1A ld a,(de) ;low byte compare +0637 EA24 BE cp (HL) ;same? +0638 EA25 C0 ret nz ;return if not +0639 EA26 ; low bytes equal, test high 1s +0640 EA26 13 inc de +0641 EA27 23 inc hl +0642 EA28 1A ld a,(de) +0643 EA29 BE cp (hl) ;sets flags +0644 EA2A C9 ret +0645 EA2B +0646 EA2B ;================================================================================================ +0647 EA2B ; Convert track/head/sector into LBA for physical access to the disk +0648 EA2B ;================================================================================================ +0649 EA2B setLBAaddr: +0650 EA2B 2A FD FB LD HL,(hsttrk) +0651 EA2E CB 05 RLC L +0652 EA30 CB 05 RLC L +0653 EA32 CB 05 RLC L +0654 EA34 CB 05 RLC L +0655 EA36 CB 05 RLC L +0656 EA38 7D LD A,L +0657 EA39 E6 E0 AND 0E0H +0658 EA3B 6F LD L,A +0659 EA3C 3A FF FB LD A,(hstsec) +0660 EA3F 85 ADD A,L +0661 EA40 32 D3 FB LD (lba0),A +0662 EA43 +0663 EA43 2A FD FB LD HL,(hsttrk) +0664 EA46 CB 0D RRC L +0665 EA48 CB 0D RRC L +0666 EA4A CB 0D RRC L +0667 EA4C 7D LD A,L +0668 EA4D E6 1F AND 01FH +0669 EA4F 6F LD L,A +0670 EA50 CB 04 RLC H +0671 EA52 CB 04 RLC H +0672 EA54 CB 04 RLC H +0673 EA56 CB 04 RLC H +0674 EA58 CB 04 RLC H +0675 EA5A 7C LD A,H +0676 EA5B E6 20 AND 020H +0677 EA5D 67 LD H,A +0678 EA5E 3A FC FB LD A,(hstdsk) +0679 EA61 CB 07 RLC a +0680 EA63 CB 07 RLC a +0681 EA65 CB 07 RLC a +0682 EA67 CB 07 RLC a +0683 EA69 CB 07 RLC a +0684 EA6B CB 07 RLC a +0685 EA6D E6 C0 AND 0C0H +0686 EA6F 84 ADD A,H +0687 EA70 85 ADD A,L +0688 EA71 32 D4 FB LD (lba1),A +0689 EA74 +0690 EA74 3A FC FB LD A,(hstdsk) +0691 EA77 CB 0F RRC A +0692 EA79 CB 0F RRC A +0693 EA7B E6 03 AND 03H +0694 EA7D 32 D5 FB LD (lba2),A +0695 EA80 +0696 EA80 3E 00 LD a,00H +0697 EA82 32 D6 FB LD (lba3),A +0698 EA85 +0699 EA85 ; Transfer LBA to disk (LBA3 not used on SD card) +0700 EA85 3A D5 FB LD A,(lba2) +0701 EA88 D3 8C OUT (SD_LBA2),A +0702 EA8A 3A D4 FB LD A,(lba1) +0703 EA8D D3 8B OUT (SD_LBA1),A +0704 EA8F 3A D3 FB LD A,(lba0) +0705 EA92 D3 8A OUT (SD_LBA0),A +0706 EA94 C9 RET +0707 EA95 +0708 EA95 ;================================================================================================ +0709 EA95 ; Read physical sector from host +0710 EA95 ;================================================================================================ +0711 EA95 +0712 EA95 readhst: +0713 EA95 F5 PUSH AF +0714 EA96 C5 PUSH BC +0715 EA97 E5 PUSH HL +0716 EA98 +0717 EA98 DB 89 rdWait1: IN A,(SD_STATUS) +0718 EA9A FE 80 CP 128 ; Check for ready status +0719 EA9C 20 FA JR NZ,rdWait1 +0720 EA9E +0721 EA9E ; Add multiple status checks before starting read +0722 EA9E 06 03 LD B,3 ; Check status 3 times +0723 EAA0 rdCheck1: +0724 EAA0 DB 89 IN A,(SD_STATUS) +0725 EAA2 FE 80 CP 128 +0726 EAA4 20 FA JR NZ,rdCheck1 +0727 EAA6 10 F8 DJNZ rdCheck1 +0728 EAA8 +0729 EAA8 CD 2B EA CALL setLBAaddr +0730 EAAB +0731 EAAB 3E 00 LD A,$00 ; 00 = Read block +0732 EAAD D3 89 OUT (SD_CONTROL),A +0733 EAAF +0734 EAAF 0E 04 LD c,4 +0735 EAB1 21 0E FC LD HL,hstbuf +0736 EAB4 rd4secs: +0737 EAB4 06 80 LD b,128 +0738 EAB6 rdByte: +0739 EAB6 +0740 EAB6 DB 89 rdWait2: IN A,(SD_STATUS) +0741 EAB8 FE E0 CP 224 ; Read byte waiting +0742 EABA 20 FA JR NZ,rdWait2 +0743 EABC +0744 EABC ; Add extra validation checks before each read +0745 EABC C5 PUSH BC ; Save main counters +0746 EABD 06 02 LD B,2 ; Check status twice +0747 EABF rdCheck2: +0748 EABF DB 89 IN A,(SD_STATUS) +0749 EAC1 FE E0 CP 224 +0750 EAC3 20 FA JR NZ,rdCheck2 +0751 EAC5 10 F8 DJNZ rdCheck2 +0752 EAC7 C1 POP BC ; Restore main counters +0753 EAC8 +0754 EAC8 DB 88 IN A,(SD_DATA) +0755 EACA +0756 EACA ; Add small delay after read before store +0757 EACA C5 PUSH BC +0758 EACB 06 0A LD B,10 +0759 EACD rdDelay: +0760 EACD 10 FE DJNZ rdDelay +0761 EACF C1 POP BC +0762 EAD0 +0763 EAD0 77 LD (HL),A +0764 EAD1 23 INC HL +0765 EAD2 05 dec b +0766 EAD3 20 E1 JR NZ, rdByte +0767 EAD5 0D dec c +0768 EAD6 20 DC JR NZ,rd4secs +0769 EAD8 +0770 EAD8 ; Add final wait before returning +0771 EAD8 06 00 LD B,0 +0772 EADA rdWaitFinal: +0773 EADA DB 89 IN A,(SD_STATUS) +0774 EADC FE 80 CP 128 ; Wait for ready status +0775 EADE 20 FA JR NZ,rdWaitFinal +0776 EAE0 10 F8 DJNZ rdWaitFinal +0777 EAE2 +0778 EAE2 E1 POP HL +0779 EAE3 C1 POP BC +0780 EAE4 F1 POP AF +0781 EAE5 +0782 EAE5 AF XOR a +0783 EAE6 32 08 FC ld (erflag),a +0784 EAE9 C9 RET +0785 EAEA +0786 EAEA +0787 EAEA ;================================================================================================ +0788 EAEA ; Write physical sector to host +0789 EAEA ;================================================================================================ +0790 EAEA +0791 EAEA writehst: +0792 EAEA F5 PUSH AF +0793 EAEB C5 PUSH BC +0794 EAEC E5 PUSH HL +0795 EAED +0796 EAED DB 89 wrWait1: IN A,(SD_STATUS) +0797 EAEF FE 80 CP 128 +0798 EAF1 20 FA JR NZ,wrWait1 +0799 EAF3 +0800 EAF3 CD 2B EA CALL setLBAaddr +0801 EAF6 +0802 EAF6 3E 01 LD A,$01 ; 01 = Write block +0803 EAF8 D3 89 OUT (SD_CONTROL),A +0804 EAFA +0805 EAFA 0E 04 LD c,4 +0806 EAFC 21 0E FC LD HL,hstbuf +0807 EAFF wr4secs: +0808 EAFF 06 80 LD b,128 +0809 EB01 wrByte: +0810 EB01 +0811 EB01 DB 89 wrWait2: IN A,(SD_STATUS) +0812 EB03 FE A0 CP 160 ; Write buffer empty +0813 EB05 20 FA JR NZ,wrWait2 +0814 EB07 +0815 EB07 ; Add multiple status checks before proceeding with write +0816 EB07 C5 PUSH BC ; Save main counters +0817 EB08 06 03 LD B,3 ; Check status 3 times +0818 EB0A wrCheck: +0819 EB0A DB 89 IN A,(SD_STATUS) +0820 EB0C FE A0 CP 160 +0821 EB0E 20 FA JR NZ,wrCheck +0822 EB10 10 F8 DJNZ wrCheck +0823 EB12 C1 POP BC ; Restore main counters +0824 EB13 +0825 EB13 7E LD A,(HL) +0826 EB14 D3 88 OUT (SD_DATA),A +0827 EB16 23 INC HL +0828 EB17 05 dec b +0829 EB18 20 E7 JR NZ,wrByte +0830 EB1A +0831 EB1A 0D dec c +0832 EB1B 20 E2 JR NZ,wr4secs +0833 EB1D +0834 EB1D ; Add final wait before returning +0835 EB1D 06 00 LD B,0 +0836 EB1F wrWaitFinal: +0837 EB1F DB 89 IN A,(SD_STATUS) +0838 EB21 FE 80 CP 128 ; Wait for ready status +0839 EB23 20 FA JR NZ,wrWaitFinal +0840 EB25 10 F8 DJNZ wrWaitFinal +0841 EB27 +0842 EB27 E1 POP HL +0843 EB28 C1 POP BC +0844 EB29 F1 POP AF +0845 EB2A +0846 EB2A AF XOR a +0847 EB2B 32 08 FC ld (erflag),a +0848 EB2E C9 RET +0849 EB2F +0850 EB2F ;================================================================================================ +0851 EB2F ; Utilities +0852 EB2F ;================================================================================================ +0853 EB2F +0854 EB2F printInline: +0855 EB2F E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL +0856 EB30 F5 PUSH AF +0857 EB31 C5 PUSH BC +0858 EB32 7E nextILChar: LD A,(HL) +0859 EB33 FE 00 CP 0 +0860 EB35 28 07 JR Z,endOfPrint +0861 EB37 4F LD C,A +0862 EB38 CD 96 E8 CALL conout ; Print to TTY +0863 EB3B 23 iNC HL +0864 EB3C 18 F4 JR nextILChar +0865 EB3E 23 endOfPrint: INC HL ; Get past "null" terminator +0866 EB3F C1 POP BC +0867 EB40 F1 POP AF +0868 EB41 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL +0869 EB42 C9 RET +0870 EB43 +0871 EB43 ;================================================================================================ +0872 EB43 ; Data storage +0873 EB43 ;================================================================================================ +0874 EB43 +0875 EB43 dirbuf: .ds 128 ;scratch directory area +0876 EBC3 alv00: .ds 257 ;allocation vector 0 +0877 ECC4 alv01: .ds 257 ;allocation vector 1 +0878 EDC5 alv02: .ds 257 ;allocation vector 2 +0879 EEC6 alv03: .ds 257 ;allocation vector 3 +0880 EFC7 alv04: .ds 257 ;allocation vector 4 +0881 F0C8 alv05: .ds 257 ;allocation vector 5 +0882 F1C9 alv06: .ds 257 ;allocation vector 6 +0883 F2CA alv07: .ds 257 ;allocation vector 7 +0884 F3CB alv08: .ds 257 ;allocation vector 8 +0885 F4CC alv09: .ds 257 ;allocation vector 9 +0886 F5CD alv10: .ds 257 ;allocation vector 10 +0887 F6CE alv11: .ds 257 ;allocation vector 11 +0888 F7CF alv12: .ds 257 ;allocation vector 12 +0889 F8D0 alv13: .ds 257 ;allocation vector 13 +0890 F9D1 alv14: .ds 257 ;allocation vector 14 +0891 FAD2 alv15: .ds 257 ;allocation vector 15 +0892 FBD3 +0893 FBD3 00 lba0 .DB 00h +0894 FBD4 00 lba1 .DB 00h +0895 FBD5 00 lba2 .DB 00h +0896 FBD6 00 lba3 .DB 00h +0897 FBD7 +0898 FBD7 .DS 020h ; Start of BIOS stack area. +0899 FBF7 biosstack: .EQU $ +0900 FBF7 +0901 FBF7 sekdsk: .ds 1 ;seek disk number +0902 FBF8 sektrk: .ds 2 ;seek track number +0903 FBFA seksec: .ds 2 ;seek sector number +0904 FBFC ; +0905 FBFC hstdsk: .ds 1 ;host disk number +0906 FBFD hsttrk: .ds 2 ;host track number +0907 FBFF hstsec: .ds 1 ;host sector number +0908 FC00 ; +0909 FC00 sekhst: .ds 1 ;seek shr secshf +0910 FC01 hstact: .ds 1 ;host active flag +0911 FC02 hstwrt: .ds 1 ;host written flag +0912 FC03 ; +0913 FC03 unacnt: .ds 1 ;unalloc rec cnt +0914 FC04 unadsk: .ds 1 ;last unalloc disk +0915 FC05 unatrk: .ds 2 ;last unalloc track +0916 FC07 unasec: .ds 1 ;last unalloc sector +0917 FC08 ; +0918 FC08 erflag: .ds 1 ;error reporting +0919 FC09 rsflag: .ds 1 ;read sector flag +0920 FC0A readop: .ds 1 ;1 if read operation +0921 FC0B wrtype: .ds 1 ;write operation type +0922 FC0C dmaAddr: .ds 2 ;last dma address +0923 FC0E hstbuf: .ds 512 ;host buffer +0924 FE0E +0925 FE0E hstBufEnd: .EQU $ +0926 FE0E +0927 FE0E biosEnd: .EQU $ +0928 FE0E +0929 FE0E ; Disable the ROM, pop the active IO port from the stack (supplied by monitor), +0930 FE0E ; then start CP/M +0931 FE0E popAndRun: +0932 FE0E 3E 01 LD A,$01 +0933 FE10 D3 38 OUT ($38),A +0934 FE12 +0935 FE12 F1 POP AF +0936 FE13 FE 01 CP $01 +0937 FE15 28 04 JR Z,consoleAtB +0938 FE17 3E 01 LD A,$01 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is CRT:) +0939 FE19 18 02 JR setIOByte +0940 FE1B 3E 00 consoleAtB: LD A,$00 ;(List is TTY:, Punch is TTY:, Reader is TTY:, Console is TTY:) +0941 FE1D 32 03 00 setIOByte: LD (iobyte),A +0942 FE20 C3 00 E6 JP bios +0943 FE23 +0944 FE23 +0945 FE23 ;================================================================================= +0946 FE23 ; Relocate TPA area from 4100 to 0100 then start CP/M +0947 FE23 ; Used to manually transfer a loaded program after CP/M was previously loaded +0948 FE23 ;================================================================================= +0949 FE23 +0950 FFE8 .org 0FFE8H +0951 FFE8 3E 01 LD A,$01 +0952 FFEA D3 38 OUT ($38),A +0953 FFEC +0954 FFEC 21 00 41 LD HL,04100H +0955 FFEF 11 00 01 LD DE,00100H +0956 FFF2 01 00 8F LD BC,08F00H +0957 FFF5 ED B0 LDIR +0958 FFF7 C3 00 E6 JP bios +0959 FFFA +0960 FFFA ;================================================================================= +0961 FFFA ; Normal start CP/M vector +0962 FFFA ;================================================================================= +0963 FFFA +0964 FFFE .ORG 0FFFEH +0965 FFFE 0E FE .dw popAndRun +0966 10000 +0967 10000 .END +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/CPM22.LST b/Z80 CPM and bootloader (basmon)/source/CPM22.LST index 8bcb096..3981708 100644 --- a/Z80 CPM and bootloader (basmon)/source/CPM22.LST +++ b/Z80 CPM and bootloader (basmon)/source/CPM22.LST @@ -1,3781 +1,3845 @@ -0001 0000 ;************************************************************** -0002 0000 ;* -0003 0000 ;* C P / M version 2 . 2 -0004 0000 ;* -0005 0000 ;* Reconstructed from memory image on February 27, 1981 -0006 0000 ;* -0007 0000 ;* by Clark A. Calkins -0008 0000 ;* -0009 0000 ;************************************************************** -0010 0000 ; -0011 0000 ; Set memory limit here. This is the amount of contigeous -0012 0000 ; ram starting from 0000. CP/M will reside at the end of this space. -0013 0000 ; -0014 0000 -0015 0000 IOBYTE .EQU 3 ;i/o definition byte. -0016 0000 TDRIVE .EQU 4 ;current drive name and user number. -0017 0000 ENTRY .EQU 5 ;entry point for the cp/m bdos. -0018 0000 TFCB .EQU 5CH ;default file control block. -0019 0000 TBUFF .EQU 80H ;i/o buffer and command line storage. -0020 0000 TBASE .EQU 100H ;transiant program storage area. -0021 0000 ; -0022 0000 ; Set control character equates. -0023 0000 ; -0024 0000 CNTRLC .EQU 3 ;control-c -0025 0000 CNTRLE .EQU 05H ;control-e -0026 0000 BS .EQU 08H ;backspace -0027 0000 TAB .EQU 09H ;tab -0028 0000 LF .EQU 0AH ;line feed -0029 0000 FF .EQU 0CH ;form feed -0030 0000 CR .EQU 0DH ;carriage return -0031 0000 CNTRLP .EQU 10H ;control-p -0032 0000 CNTRLR .EQU 12H ;control-r -0033 0000 CNTRLS .EQU 13H ;control-s -0034 0000 CNTRLU .EQU 15H ;control-u -0035 0000 CNTRLX .EQU 18H ;control-x -0036 0000 CNTRLZ .EQU 1AH ;control-z (end-of-file mark) -0037 0000 DEL .EQU 7FH ;rubout -0038 0000 ; -0039 0000 ; Set origin for CP/M -0040 0000 ; -0041 D000 .ORG 0D000H -0042 D000 ; -0043 D000 C3 5C D3 CBASE: JP COMMAND ;execute command processor (ccp). -0044 D003 C3 58 D3 JP CLEARBUF ;entry to empty input buffer before starting ccp. -0045 D006 -0046 D006 ; -0047 D006 ; Standard cp/m ccp input buffer. Format is (max length), -0048 D006 ; (actual length), (char #1), (char #2), (char #3), etc. -0049 D006 ; -0050 D006 7F INBUFF: .DB 127 ;length of input buffer. -0051 D007 00 .DB 0 ;current length of contents. -0052 D008 436F70797269 .TEXT "Copyright" -0052 D00E 676874 -0053 D011 203139373920 .TEXT " 1979 (c) by Digital Research " -0053 D017 286329206279204469676974616C205265736561726368202020202020 -0054 D034 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0054 D03A 0000000000000000000000000000000000 -0055 D04B 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0055 D051 0000000000000000000000000000000000 -0056 D062 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0056 D068 0000000000000000000000000000000000 -0057 D079 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -0057 D07F 000000000000000000 -0058 D088 08 D0 INPOINT:.DW INBUFF+2 ;input line pointer -0059 D08A 00 00 NAMEPNT:.DW 0 ;input line pointer used for error message. Points to -0060 D08C ; ;start of name in error. -0061 D08C ; -0062 D08C ; Routine to print (A) on the console. All registers used. -0063 D08C ; -0064 D08C 5F PRINT: LD E,A ;setup bdos call. -0065 D08D 0E 02 LD C,2 -0066 D08F C3 05 00 JP ENTRY -0067 D092 ; -0068 D092 ; Routine to print (A) on the console and to save (BC). -0069 D092 ; -0070 D092 C5 PRINTB: PUSH BC -0071 D093 CD 8C D0 CALL PRINT -0072 D096 C1 POP BC -0073 D097 C9 RET -0074 D098 ; -0075 D098 ; Routine to send a carriage return, line feed combination -0076 D098 ; to the console. -0077 D098 ; -0078 D098 3E 0D CRLF: LD A,CR -0079 D09A CD 92 D0 CALL PRINTB -0080 D09D 3E 0A LD A,LF -0081 D09F C3 92 D0 JP PRINTB -0082 D0A2 ; -0083 D0A2 ; Routine to send one space to the console and save (BC). -0084 D0A2 ; -0085 D0A2 3E 20 SPACE: LD A,' ' -0086 D0A4 C3 92 D0 JP PRINTB -0087 D0A7 ; -0088 D0A7 ; Routine to print character string pointed to be (BC) on the -0089 D0A7 ; console. It must terminate with a null byte. -0090 D0A7 ; -0091 D0A7 C5 PLINE: PUSH BC -0092 D0A8 CD 98 D0 CALL CRLF -0093 D0AB E1 POP HL -0094 D0AC 7E PLINE2: LD A,(HL) -0095 D0AD B7 OR A -0096 D0AE C8 RET Z -0097 D0AF 23 INC HL -0098 D0B0 E5 PUSH HL -0099 D0B1 CD 8C D0 CALL PRINT -0100 D0B4 E1 POP HL -0101 D0B5 C3 AC D0 JP PLINE2 -0102 D0B8 ; -0103 D0B8 ; Routine to reset the disk system. -0104 D0B8 ; -0105 D0B8 0E 0D RESDSK: LD C,13 -0106 D0BA C3 05 00 JP ENTRY -0107 D0BD ; -0108 D0BD ; Routine to select disk (A). -0109 D0BD ; -0110 D0BD 5F DSKSEL: LD E,A -0111 D0BE 0E 0E LD C,14 -0112 D0C0 C3 05 00 JP ENTRY -0113 D0C3 ; -0114 D0C3 ; Routine to call bdos and save the return code. The zero -0115 D0C3 ; flag is set on a return of 0ffh. -0116 D0C3 ; -0117 D0C3 CD 05 00 ENTRY1: CALL ENTRY -0118 D0C6 32 EE D7 LD (RTNCODE),A ;save return code. -0119 D0C9 3C INC A ;set zero if 0ffh returned. -0120 D0CA C9 RET -0121 D0CB ; -0122 D0CB ; Routine to open a file. (DE) must point to the FCB. -0123 D0CB ; -0124 D0CB 0E 0F OPEN: LD C,15 -0125 D0CD C3 C3 D0 JP ENTRY1 -0126 D0D0 ; -0127 D0D0 ; Routine to open file at (FCB). -0128 D0D0 ; -0129 D0D0 AF OPENFCB:XOR A ;clear the record number byte at fcb+32 -0130 D0D1 32 ED D7 LD (FCB+32),A -0131 D0D4 11 CD D7 LD DE,FCB -0132 D0D7 C3 CB D0 JP OPEN -0133 D0DA ; -0134 D0DA ; Routine to close a file. (DE) points to FCB. -0135 D0DA ; -0136 D0DA 0E 10 CLOSE: LD C,16 -0137 D0DC C3 C3 D0 JP ENTRY1 -0138 D0DF ; -0139 D0DF ; Routine to search for the first file with ambigueous name -0140 D0DF ; (DE). -0141 D0DF ; -0142 D0DF 0E 11 SRCHFST:LD C,17 -0143 D0E1 C3 C3 D0 JP ENTRY1 -0144 D0E4 ; -0145 D0E4 ; Search for the next ambigeous file name. -0146 D0E4 ; -0147 D0E4 0E 12 SRCHNXT:LD C,18 -0148 D0E6 C3 C3 D0 JP ENTRY1 -0149 D0E9 ; -0150 D0E9 ; Search for file at (FCB). -0151 D0E9 ; -0152 D0E9 11 CD D7 SRCHFCB:LD DE,FCB -0153 D0EC C3 DF D0 JP SRCHFST -0154 D0EF ; -0155 D0EF ; Routine to delete a file pointed to by (DE). -0156 D0EF ; -0157 D0EF 0E 13 DELETE: LD C,19 -0158 D0F1 C3 05 00 JP ENTRY -0159 D0F4 ; -0160 D0F4 ; Routine to call the bdos and set the zero flag if a zero -0161 D0F4 ; status is returned. -0162 D0F4 ; -0163 D0F4 CD 05 00 ENTRY2: CALL ENTRY -0164 D0F7 B7 OR A ;set zero flag if appropriate. -0165 D0F8 C9 RET -0166 D0F9 ; -0167 D0F9 ; Routine to read the next record from a sequential file. -0168 D0F9 ; (DE) points to the FCB. -0169 D0F9 ; -0170 D0F9 0E 14 RDREC: LD C,20 -0171 D0FB C3 F4 D0 JP ENTRY2 -0172 D0FE ; -0173 D0FE ; Routine to read file at (FCB). -0174 D0FE ; -0175 D0FE 11 CD D7 READFCB:LD DE,FCB -0176 D101 C3 F9 D0 JP RDREC -0177 D104 ; -0178 D104 ; Routine to write the next record of a sequential file. -0179 D104 ; (DE) points to the FCB. -0180 D104 ; -0181 D104 0E 15 WRTREC: LD C,21 -0182 D106 C3 F4 D0 JP ENTRY2 -0183 D109 ; -0184 D109 ; Routine to create the file pointed to by (DE). -0185 D109 ; -0186 D109 0E 16 CREATE: LD C,22 -0187 D10B C3 C3 D0 JP ENTRY1 -0188 D10E ; -0189 D10E ; Routine to rename the file pointed to by (DE). Note that -0190 D10E ; the new name starts at (DE+16). -0191 D10E ; -0192 D10E 0E 17 RENAM: LD C,23 -0193 D110 C3 05 00 JP ENTRY -0194 D113 ; -0195 D113 ; Get the current user code. -0196 D113 ; -0197 D113 1E FF GETUSR: LD E,0FFH -0198 D115 ; -0199 D115 ; Routne to get or set the current user code. -0200 D115 ; If (E) is FF then this is a GET, else it is a SET. -0201 D115 ; -0202 D115 0E 20 GETSETUC: LD C,32 -0203 D117 C3 05 00 JP ENTRY -0204 D11A ; -0205 D11A ; Routine to set the current drive byte at (TDRIVE). -0206 D11A ; -0207 D11A CD 13 D1 SETCDRV:CALL GETUSR ;get user number -0208 D11D 87 ADD A,A ;and shift into the upper 4 bits. -0209 D11E 87 ADD A,A -0210 D11F 87 ADD A,A -0211 D120 87 ADD A,A -0212 D121 21 EF D7 LD HL,CDRIVE ;now add in the current drive number. -0213 D124 B6 OR (HL) -0214 D125 32 04 00 LD (TDRIVE),A ;and save. -0215 D128 C9 RET -0216 D129 ; -0217 D129 ; Move currently active drive down to (TDRIVE). -0218 D129 ; -0219 D129 3A EF D7 MOVECD: LD A,(CDRIVE) -0220 D12C 32 04 00 LD (TDRIVE),A -0221 D12F C9 RET -0222 D130 ; -0223 D130 ; Routine to convert (A) into upper case ascii. Only letters -0224 D130 ; are affected. -0225 D130 ; -0226 D130 FE 61 UPPER: CP 'a' ;check for letters in the range of 'a' to 'z'. -0227 D132 D8 RET C -0228 D133 FE 7B CP '{' -0229 D135 D0 RET NC -0230 D136 E6 5F AND 5FH ;convert it if found. -0231 D138 C9 RET -0232 D139 ; -0233 D139 ; Routine to get a line of input. We must check to see if the -0234 D139 ; user is in (BATCH) mode. If so, then read the input from file -0235 D139 ; ($$$.SUB). At the end, reset to console input. -0236 D139 ; -0237 D139 3A AB D7 GETINP: LD A,(BATCH) ;if =0, then use console input. -0238 D13C B7 OR A -0239 D13D CA 96 D1 JP Z,GETINP1 -0240 D140 ; -0241 D140 ; Use the submit file ($$$.sub) which is prepared by a -0242 D140 ; SUBMIT run. It must be on drive (A) and it will be deleted -0243 D140 ; if and error occures (like eof). -0244 D140 ; -0245 D140 3A EF D7 LD A,(CDRIVE) ;select drive 0 if need be. -0246 D143 B7 OR A -0247 D144 3E 00 LD A,0 ;always use drive A for submit. -0248 D146 C4 BD D0 CALL NZ,DSKSEL ;select it if required. -0249 D149 11 AC D7 LD DE,BATCHFCB -0250 D14C CD CB D0 CALL OPEN ;look for it. -0251 D14F CA 96 D1 JP Z,GETINP1 ;if not there, use normal input. -0252 D152 3A BB D7 LD A,(BATCHFCB+15) ;get last record number+1. -0253 D155 3D DEC A -0254 D156 32 CC D7 LD (BATCHFCB+32),A -0255 D159 11 AC D7 LD DE,BATCHFCB -0256 D15C CD F9 D0 CALL RDREC ;read last record. -0257 D15F C2 96 D1 JP NZ,GETINP1 ;quit on end of file. -0258 D162 ; -0259 D162 ; Move this record into input buffer. -0260 D162 ; -0261 D162 11 07 D0 LD DE,INBUFF+1 -0262 D165 21 80 00 LD HL,TBUFF ;data was read into buffer here. -0263 D168 06 80 LD B,128 ;all 128 characters may be used. -0264 D16A CD 42 D4 CALL HL2DE ;(HL) to (DE), (B) bytes. -0265 D16D 21 BA D7 LD HL,BATCHFCB+14 -0266 D170 36 00 LD (HL),0 ;zero out the 's2' byte. -0267 D172 23 INC HL ;and decrement the record count. -0268 D173 35 DEC (HL) -0269 D174 11 AC D7 LD DE,BATCHFCB ;close the batch file now. -0270 D177 CD DA D0 CALL CLOSE -0271 D17A CA 96 D1 JP Z,GETINP1 ;quit on an error. -0272 D17D 3A EF D7 LD A,(CDRIVE) ;re-select previous drive if need be. -0273 D180 B7 OR A -0274 D181 C4 BD D0 CALL NZ,DSKSEL ;don't do needless selects. -0275 D184 ; -0276 D184 ; Print line just read on console. -0277 D184 ; -0278 D184 21 08 D0 LD HL,INBUFF+2 -0279 D187 CD AC D0 CALL PLINE2 -0280 D18A CD C2 D1 CALL CHKCON ;check console, quit on a key. -0281 D18D CA A7 D1 JP Z,GETINP2 ;jump if no key is pressed. -0282 D190 ; -0283 D190 ; Terminate the submit job on any keyboard input. Delete this -0284 D190 ; file such that it is not re-started and jump to normal keyboard -0285 D190 ; input section. -0286 D190 ; -0287 D190 CD DD D1 CALL DELBATCH ;delete the batch file. -0288 D193 C3 82 D3 JP CMMND1 ;and restart command input. -0289 D196 ; -0290 D196 ; Get here for normal keyboard input. Delete the submit file -0291 D196 ; incase there was one. -0292 D196 ; -0293 D196 CD DD D1 GETINP1:CALL DELBATCH ;delete file ($$$.sub). -0294 D199 CD 1A D1 CALL SETCDRV ;reset active disk. -0295 D19C 0E 0A LD C,10 ;get line from console device. -0296 D19E 11 06 D0 LD DE,INBUFF -0297 D1A1 CD 05 00 CALL ENTRY -0298 D1A4 CD 29 D1 CALL MOVECD ;reset current drive (again). -0299 D1A7 ; -0300 D1A7 ; Convert input line to upper case. -0301 D1A7 ; -0302 D1A7 21 07 D0 GETINP2:LD HL,INBUFF+1 -0303 D1AA 46 LD B,(HL) ;(B)=character counter. -0304 D1AB 23 GETINP3:INC HL -0305 D1AC 78 LD A,B ;end of the line? -0306 D1AD B7 OR A -0307 D1AE CA BA D1 JP Z,GETINP4 -0308 D1B1 7E LD A,(HL) ;convert to upper case. -0309 D1B2 CD 30 D1 CALL UPPER -0310 D1B5 77 LD (HL),A -0311 D1B6 05 DEC B ;adjust character count. -0312 D1B7 C3 AB D1 JP GETINP3 -0313 D1BA 77 GETINP4:LD (HL),A ;add trailing null. -0314 D1BB 21 08 D0 LD HL,INBUFF+2 -0315 D1BE 22 88 D0 LD (INPOINT),HL ;reset input line pointer. -0316 D1C1 C9 RET -0317 D1C2 ; -0318 D1C2 ; Routine to check the console for a key pressed. The zero -0319 D1C2 ; flag is set is none, else the character is returned in (A). -0320 D1C2 ; -0321 D1C2 0E 0B CHKCON: LD C,11 ;check console. -0322 D1C4 CD 05 00 CALL ENTRY -0323 D1C7 B7 OR A -0324 D1C8 C8 RET Z ;return if nothing. -0325 D1C9 0E 01 LD C,1 ;else get character. -0326 D1CB CD 05 00 CALL ENTRY -0327 D1CE B7 OR A ;clear zero flag and return. -0328 D1CF C9 RET -0329 D1D0 ; -0330 D1D0 ; Routine to get the currently active drive number. -0331 D1D0 ; -0332 D1D0 0E 19 GETDSK: LD C,25 -0333 D1D2 C3 05 00 JP ENTRY -0334 D1D5 ; -0335 D1D5 ; Set the stabdard dma address. -0336 D1D5 ; -0337 D1D5 11 80 00 STDDMA: LD DE,TBUFF -0338 D1D8 ; -0339 D1D8 ; Routine to set the dma address to (DE). -0340 D1D8 ; -0341 D1D8 0E 1A DMASET: LD C,26 -0342 D1DA C3 05 00 JP ENTRY -0343 D1DD ; -0344 D1DD ; Delete the batch file created by SUBMIT. -0345 D1DD ; -0346 D1DD 21 AB D7 DELBATCH: LD HL,BATCH ;is batch active? -0347 D1E0 7E LD A,(HL) -0348 D1E1 B7 OR A -0349 D1E2 C8 RET Z -0350 D1E3 36 00 LD (HL),0 ;yes, de-activate it. -0351 D1E5 AF XOR A -0352 D1E6 CD BD D0 CALL DSKSEL ;select drive 0 for sure. -0353 D1E9 11 AC D7 LD DE,BATCHFCB ;and delete this file. -0354 D1EC CD EF D0 CALL DELETE -0355 D1EF 3A EF D7 LD A,(CDRIVE) ;reset current drive. -0356 D1F2 C3 BD D0 JP DSKSEL -0357 D1F5 ; -0358 D1F5 ; Check to two strings at (PATTRN1) and (PATTRN2). They must be -0359 D1F5 ; the same or we halt.... -0360 D1F5 ; -0361 D1F5 11 28 D3 VERIFY: LD DE,PATTRN1 ;these are the serial number bytes. -0362 D1F8 21 00 D8 LD HL,PATTRN2 ;ditto, but how could they be different? -0363 D1FB 06 06 LD B,6 ;6 bytes each. -0364 D1FD 1A VERIFY1:LD A,(DE) -0365 D1FE BE CP (HL) -0366 D1FF C2 CF D3 JP NZ,HALT ;jump to halt routine. -0367 D202 13 INC DE -0368 D203 23 INC HL -0369 D204 05 DEC B -0370 D205 C2 FD D1 JP NZ,VERIFY1 -0371 D208 C9 RET -0372 D209 ; -0373 D209 ; Print back file name with a '?' to indicate a syntax error. -0374 D209 ; -0375 D209 CD 98 D0 SYNERR: CALL CRLF ;end current line. -0376 D20C 2A 8A D0 LD HL,(NAMEPNT) ;this points to name in error. -0377 D20F 7E SYNERR1:LD A,(HL) ;print it until a space or null is found. -0378 D210 FE 20 CP ' ' -0379 D212 CA 22 D2 JP Z,SYNERR2 -0380 D215 B7 OR A -0381 D216 CA 22 D2 JP Z,SYNERR2 -0382 D219 E5 PUSH HL -0383 D21A CD 8C D0 CALL PRINT -0384 D21D E1 POP HL -0385 D21E 23 INC HL -0386 D21F C3 0F D2 JP SYNERR1 -0387 D222 3E 3F SYNERR2:LD A,'?' ;add trailing '?'. -0388 D224 CD 8C D0 CALL PRINT -0389 D227 CD 98 D0 CALL CRLF -0390 D22A CD DD D1 CALL DELBATCH ;delete any batch file. -0391 D22D C3 82 D3 JP CMMND1 ;and restart from console input. -0392 D230 ; -0393 D230 ; Check character at (DE) for legal command input. Note that the -0394 D230 ; zero flag is set if the character is a delimiter. -0395 D230 ; -0396 D230 1A CHECK: LD A,(DE) -0397 D231 B7 OR A -0398 D232 C8 RET Z -0399 D233 FE 20 CP ' ' ;control characters are not legal here. -0400 D235 DA 09 D2 JP C,SYNERR -0401 D238 C8 RET Z ;check for valid delimiter. -0402 D239 FE 3D CP '=' -0403 D23B C8 RET Z -0404 D23C FE 5F CP '_' -0405 D23E C8 RET Z -0406 D23F FE 2E CP '.' -0407 D241 C8 RET Z -0408 D242 FE 3A CP ':' -0409 D244 C8 RET Z -0410 D245 FE 3B CP 03BH ; ';' -0411 D247 C8 RET Z -0412 D248 FE 3C CP '<' -0413 D24A C8 RET Z -0414 D24B FE 3E CP '>' -0415 D24D C8 RET Z -0416 D24E C9 RET -0417 D24F ; -0418 D24F ; Get the next non-blank character from (DE). -0419 D24F ; -0420 D24F 1A NONBLANK: LD A,(DE) -0421 D250 B7 OR A ;string ends with a null. -0422 D251 C8 RET Z -0423 D252 FE 20 CP ' ' -0424 D254 C0 RET NZ -0425 D255 13 INC DE -0426 D256 C3 4F D2 JP NONBLANK -0427 D259 ; -0428 D259 ; Add (HL)=(HL)+(A) -0429 D259 ; -0430 D259 85 ADDHL: ADD A,L -0431 D25A 6F LD L,A -0432 D25B D0 RET NC ;take care of any carry. -0433 D25C 24 INC H -0434 D25D C9 RET -0435 D25E ; -0436 D25E ; Convert the first name in (FCB). -0437 D25E ; -0438 D25E 3E 00 CONVFST:LD A,0 -0439 D260 ; -0440 D260 ; Format a file name (convert * to '?', etc.). On return, -0441 D260 ; (A)=0 is an unambigeous name was specified. Enter with (A) equal to -0442 D260 ; the position within the fcb for the name (either 0 or 16). -0443 D260 ; -0444 D260 21 CD D7 CONVERT:LD HL,FCB -0445 D263 CD 59 D2 CALL ADDHL -0446 D266 E5 PUSH HL -0447 D267 E5 PUSH HL -0448 D268 AF XOR A -0449 D269 32 F0 D7 LD (CHGDRV),A ;initialize drive change flag. -0450 D26C 2A 88 D0 LD HL,(INPOINT) ;set (HL) as pointer into input line. -0451 D26F EB EX DE,HL -0452 D270 CD 4F D2 CALL NONBLANK ;get next non-blank character. -0453 D273 EB EX DE,HL -0454 D274 22 8A D0 LD (NAMEPNT),HL ;save pointer here for any error message. -0455 D277 EB EX DE,HL -0456 D278 E1 POP HL -0457 D279 1A LD A,(DE) ;get first character. -0458 D27A B7 OR A -0459 D27B CA 89 D2 JP Z,CONVRT1 -0460 D27E DE 40 SBC A,'A'-1 ;might be a drive name, convert to binary. -0461 D280 47 LD B,A ;and save. -0462 D281 13 INC DE ;check next character for a ':'. -0463 D282 1A LD A,(DE) -0464 D283 FE 3A CP ':' -0465 D285 CA 90 D2 JP Z,CONVRT2 -0466 D288 1B DEC DE ;nope, move pointer back to the start of the line. -0467 D289 3A EF D7 CONVRT1:LD A,(CDRIVE) -0468 D28C 77 LD (HL),A -0469 D28D C3 96 D2 JP CONVRT3 -0470 D290 78 CONVRT2:LD A,B -0471 D291 32 F0 D7 LD (CHGDRV),A ;set change in drives flag. -0472 D294 70 LD (HL),B -0473 D295 13 INC DE -0474 D296 ; -0475 D296 ; Convert the basic file name. -0476 D296 ; -0477 D296 06 08 CONVRT3:LD B,08H -0478 D298 CD 30 D2 CONVRT4:CALL CHECK -0479 D29B CA B9 D2 JP Z,CONVRT8 -0480 D29E 23 INC HL -0481 D29F FE 2A CP '*' ;note that an '*' will fill the remaining -0482 D2A1 C2 A9 D2 JP NZ,CONVRT5 ;field with '?'. -0483 D2A4 36 3F LD (HL),'?' -0484 D2A6 C3 AB D2 JP CONVRT6 -0485 D2A9 77 CONVRT5:LD (HL),A -0486 D2AA 13 INC DE -0487 D2AB 05 CONVRT6:DEC B -0488 D2AC C2 98 D2 JP NZ,CONVRT4 -0489 D2AF CD 30 D2 CONVRT7:CALL CHECK ;get next delimiter. -0490 D2B2 CA C0 D2 JP Z,GETEXT -0491 D2B5 13 INC DE -0492 D2B6 C3 AF D2 JP CONVRT7 -0493 D2B9 23 CONVRT8:INC HL ;blank fill the file name. -0494 D2BA 36 20 LD (HL),' ' -0495 D2BC 05 DEC B -0496 D2BD C2 B9 D2 JP NZ,CONVRT8 -0497 D2C0 ; -0498 D2C0 ; Get the extension and convert it. -0499 D2C0 ; -0500 D2C0 06 03 GETEXT: LD B,03H -0501 D2C2 FE 2E CP '.' -0502 D2C4 C2 E9 D2 JP NZ,GETEXT5 -0503 D2C7 13 INC DE -0504 D2C8 CD 30 D2 GETEXT1:CALL CHECK -0505 D2CB CA E9 D2 JP Z,GETEXT5 -0506 D2CE 23 INC HL -0507 D2CF FE 2A CP '*' -0508 D2D1 C2 D9 D2 JP NZ,GETEXT2 -0509 D2D4 36 3F LD (HL),'?' -0510 D2D6 C3 DB D2 JP GETEXT3 -0511 D2D9 77 GETEXT2:LD (HL),A -0512 D2DA 13 INC DE -0513 D2DB 05 GETEXT3:DEC B -0514 D2DC C2 C8 D2 JP NZ,GETEXT1 -0515 D2DF CD 30 D2 GETEXT4:CALL CHECK -0516 D2E2 CA F0 D2 JP Z,GETEXT6 -0517 D2E5 13 INC DE -0518 D2E6 C3 DF D2 JP GETEXT4 -0519 D2E9 23 GETEXT5:INC HL -0520 D2EA 36 20 LD (HL),' ' -0521 D2EC 05 DEC B -0522 D2ED C2 E9 D2 JP NZ,GETEXT5 -0523 D2F0 06 03 GETEXT6:LD B,3 -0524 D2F2 23 GETEXT7:INC HL -0525 D2F3 36 00 LD (HL),0 -0526 D2F5 05 DEC B -0527 D2F6 C2 F2 D2 JP NZ,GETEXT7 -0528 D2F9 EB EX DE,HL -0529 D2FA 22 88 D0 LD (INPOINT),HL ;save input line pointer. -0530 D2FD E1 POP HL -0531 D2FE ; -0532 D2FE ; Check to see if this is an ambigeous file name specification. -0533 D2FE ; Set the (A) register to non zero if it is. -0534 D2FE ; -0535 D2FE 01 0B 00 LD BC,11 ;set name length. -0536 D301 23 GETEXT8:INC HL -0537 D302 7E LD A,(HL) -0538 D303 FE 3F CP '?' ;any question marks? -0539 D305 C2 09 D3 JP NZ,GETEXT9 -0540 D308 04 INC B ;count them. -0541 D309 0D GETEXT9:DEC C -0542 D30A C2 01 D3 JP NZ,GETEXT8 -0543 D30D 78 LD A,B -0544 D30E B7 OR A -0545 D30F C9 RET -0546 D310 ; -0547 D310 ; CP/M command table. Note commands can be either 3 or 4 characters long. -0548 D310 ; -0549 D310 NUMCMDS .EQU 6 ;number of commands -0550 D310 44 49 52 20 CMDTBL: .TEXT "DIR " -0551 D314 45 52 41 20 .TEXT "ERA " -0552 D318 54 59 50 45 .TEXT "TYPE" -0553 D31C 53 41 56 45 .TEXT "SAVE" -0554 D320 52 45 4E 20 .TEXT "REN " -0555 D324 55 53 45 52 .TEXT "USER" -0556 D328 ; -0557 D328 ; The following six bytes must agree with those at (PATTRN2) -0558 D328 ; or cp/m will HALT. Why? -0559 D328 ; -0560 D328 001600000000PATTRN1:.DB 0,22,0,0,0,0 ;(* serial number bytes *). -0561 D32E ; -0562 D32E ; Search the command table for a match with what has just -0563 D32E ; been entered. If a match is found, then we jump to the -0564 D32E ; proper section. Else jump to (UNKNOWN). -0565 D32E ; On return, the (C) register is set to the command number -0566 D32E ; that matched (or NUMCMDS+1 if no match). -0567 D32E ; -0568 D32E 21 10 D3 SEARCH: LD HL,CMDTBL -0569 D331 0E 00 LD C,0 -0570 D333 79 SEARCH1:LD A,C -0571 D334 FE 06 CP NUMCMDS ;this commands exists. -0572 D336 D0 RET NC -0573 D337 11 CE D7 LD DE,FCB+1 ;check this one. -0574 D33A 06 04 LD B,4 ;max command length. -0575 D33C 1A SEARCH2:LD A,(DE) -0576 D33D BE CP (HL) -0577 D33E C2 4F D3 JP NZ,SEARCH3 ;not a match. -0578 D341 13 INC DE -0579 D342 23 INC HL -0580 D343 05 DEC B -0581 D344 C2 3C D3 JP NZ,SEARCH2 -0582 D347 1A LD A,(DE) ;allow a 3 character command to match. -0583 D348 FE 20 CP ' ' -0584 D34A C2 54 D3 JP NZ,SEARCH4 -0585 D34D 79 LD A,C ;set return register for this command. -0586 D34E C9 RET -0587 D34F 23 SEARCH3:INC HL -0588 D350 05 DEC B -0589 D351 C2 4F D3 JP NZ,SEARCH3 -0590 D354 0C SEARCH4:INC C -0591 D355 C3 33 D3 JP SEARCH1 -0592 D358 ; -0593 D358 ; Set the input buffer to empty and then start the command -0594 D358 ; processor (ccp). -0595 D358 ; -0596 D358 AF CLEARBUF: XOR A -0597 D359 32 07 D0 LD (INBUFF+1),A ;second byte is actual length. -0598 D35C ; -0599 D35C ;************************************************************** -0600 D35C ;* -0601 D35C ;* -0602 D35C ;* C C P - C o n s o l e C o m m a n d P r o c e s s o r -0603 D35C ;* -0604 D35C ;************************************************************** -0605 D35C ;* -0606 D35C 31 AB D7 COMMAND:LD SP,CCPSTACK ;setup stack area. -0607 D35F C5 PUSH BC ;note that (C) should be equal to: -0608 D360 79 LD A,C ;(uuuudddd) where 'uuuu' is the user number -0609 D361 1F RRA ;and 'dddd' is the drive number. -0610 D362 1F RRA -0611 D363 1F RRA -0612 D364 1F RRA -0613 D365 E6 0F AND 0FH ;isolate the user number. -0614 D367 5F LD E,A -0615 D368 CD 15 D1 CALL GETSETUC ;and set it. -0616 D36B CD B8 D0 CALL RESDSK ;reset the disk system. -0617 D36E 32 AB D7 LD (BATCH),A ;clear batch mode flag. -0618 D371 C1 POP BC -0619 D372 79 LD A,C -0620 D373 E6 0F AND 0FH ;isolate the drive number. -0621 D375 32 EF D7 LD (CDRIVE),A ;and save. -0622 D378 CD BD D0 CALL DSKSEL ;...and select. -0623 D37B 3A 07 D0 LD A,(INBUFF+1) -0624 D37E B7 OR A ;anything in input buffer already? -0625 D37F C2 98 D3 JP NZ,CMMND2 ;yes, we just process it. -0626 D382 ; -0627 D382 ; Entry point to get a command line from the console. -0628 D382 ; -0629 D382 31 AB D7 CMMND1: LD SP,CCPSTACK ;set stack straight. -0630 D385 CD 98 D0 CALL CRLF ;start a new line on the screen. -0631 D388 CD D0 D1 CALL GETDSK ;get current drive. -0632 D38B C6 41 ADD A,'A' -0633 D38D CD 8C D0 CALL PRINT ;print current drive. -0634 D390 3E 3E LD A,'>' -0635 D392 CD 8C D0 CALL PRINT ;and add prompt. -0636 D395 CD 39 D1 CALL GETINP ;get line from user. -0637 D398 ; -0638 D398 ; Process command line here. -0639 D398 ; -0640 D398 11 80 00 CMMND2: LD DE,TBUFF -0641 D39B CD D8 D1 CALL DMASET ;set standard dma address. -0642 D39E CD D0 D1 CALL GETDSK -0643 D3A1 32 EF D7 LD (CDRIVE),A ;set current drive. -0644 D3A4 CD 5E D2 CALL CONVFST ;convert name typed in. -0645 D3A7 C4 09 D2 CALL NZ,SYNERR ;wild cards are not allowed. -0646 D3AA 3A F0 D7 LD A,(CHGDRV) ;if a change in drives was indicated, -0647 D3AD B7 OR A ;then treat this as an unknown command -0648 D3AE C2 A5 D6 JP NZ,UNKNOWN ;which gets executed. -0649 D3B1 CD 2E D3 CALL SEARCH ;else search command table for a match. -0650 D3B4 ; -0651 D3B4 ; Note that an unknown command returns -0652 D3B4 ; with (A) pointing to the last address -0653 D3B4 ; in our table which is (UNKNOWN). -0654 D3B4 ; -0655 D3B4 21 C1 D3 LD HL,CMDADR ;now, look thru our address table for command (A). -0656 D3B7 5F LD E,A ;set (DE) to command number. -0657 D3B8 16 00 LD D,0 -0658 D3BA 19 ADD HL,DE -0659 D3BB 19 ADD HL,DE ;(HL)=(CMDADR)+2*(command number). -0660 D3BC 7E LD A,(HL) ;now pick out this address. -0661 D3BD 23 INC HL -0662 D3BE 66 LD H,(HL) -0663 D3BF 6F LD L,A -0664 D3C0 E9 JP (HL) ;now execute it. -0665 D3C1 ; -0666 D3C1 ; CP/M command address table. -0667 D3C1 ; -0668 D3C1 77D41FD55DD5CMDADR: .DW DIRECT,ERASE,TYPE,SAVE -0668 D3C7 ADD5 -0669 D3C9 10D68ED6A5D6 .DW RENAME,USER,UNKNOWN -0670 D3CF ; -0671 D3CF ; Halt the system. Reason for this is unknown at present. -0672 D3CF ; -0673 D3CF 21 F3 76 HALT: LD HL,76F3H ;'DI HLT' instructions. -0674 D3D2 22 00 D0 LD (CBASE),HL -0675 D3D5 21 00 D0 LD HL,CBASE -0676 D3D8 E9 JP (HL) -0677 D3D9 ; -0678 D3D9 ; Read error while TYPEing a file. -0679 D3D9 ; -0680 D3D9 01 DF D3 RDERROR:LD BC,RDERR -0681 D3DC C3 A7 D0 JP PLINE -0682 D3DF 526561642065RDERR: .TEXT "Read error" -0682 D3E5 72726F72 -0683 D3E9 00 .DB 0 -0684 D3EA ; -0685 D3EA ; Required file was not located. -0686 D3EA ; -0687 D3EA 01 F0 D3 NONE: LD BC,NOFILE -0688 D3ED C3 A7 D0 JP PLINE -0689 D3F0 4E6F2066696CNOFILE: .TEXT "No file" -0689 D3F6 65 -0690 D3F7 00 .DB 0 -0691 D3F8 ; -0692 D3F8 ; Decode a command of the form 'A>filename number{ filename}. -0693 D3F8 ; Note that a drive specifier is not allowed on the first file -0694 D3F8 ; name. On return, the number is in register (A). Any error -0695 D3F8 ; causes 'filename?' to be printed and the command is aborted. -0696 D3F8 ; -0697 D3F8 CD 5E D2 DECODE: CALL CONVFST ;convert filename. -0698 D3FB 3A F0 D7 LD A,(CHGDRV) ;do not allow a drive to be specified. -0699 D3FE B7 OR A -0700 D3FF C2 09 D2 JP NZ,SYNERR -0701 D402 21 CE D7 LD HL,FCB+1 ;convert number now. -0702 D405 01 0B 00 LD BC,11 ;(B)=sum register, (C)=max digit count. -0703 D408 7E DECODE1:LD A,(HL) -0704 D409 FE 20 CP ' ' ;a space terminates the numeral. -0705 D40B CA 33 D4 JP Z,DECODE3 -0706 D40E 23 INC HL -0707 D40F D6 30 SUB '0' ;make binary from ascii. -0708 D411 FE 0A CP 10 ;legal digit? -0709 D413 D2 09 D2 JP NC,SYNERR -0710 D416 57 LD D,A ;yes, save it in (D). -0711 D417 78 LD A,B ;compute (B)=(B)*10 and check for overflow. -0712 D418 E6 E0 AND 0E0H -0713 D41A C2 09 D2 JP NZ,SYNERR -0714 D41D 78 LD A,B -0715 D41E 07 RLCA -0716 D41F 07 RLCA -0717 D420 07 RLCA ;(A)=(B)*8 -0718 D421 80 ADD A,B ;.......*9 -0719 D422 DA 09 D2 JP C,SYNERR -0720 D425 80 ADD A,B ;.......*10 -0721 D426 DA 09 D2 JP C,SYNERR -0722 D429 82 ADD A,D ;add in new digit now. -0723 D42A DA 09 D2 DECODE2:JP C,SYNERR -0724 D42D 47 LD B,A ;and save result. -0725 D42E 0D DEC C ;only look at 11 digits. -0726 D42F C2 08 D4 JP NZ,DECODE1 -0727 D432 C9 RET -0728 D433 7E DECODE3:LD A,(HL) ;spaces must follow (why?). -0729 D434 FE 20 CP ' ' -0730 D436 C2 09 D2 JP NZ,SYNERR -0731 D439 23 INC HL -0732 D43A 0D DECODE4:DEC C -0733 D43B C2 33 D4 JP NZ,DECODE3 -0734 D43E 78 LD A,B ;set (A)=the numeric value entered. -0735 D43F C9 RET -0736 D440 ; -0737 D440 ; Move 3 bytes from (HL) to (DE). Note that there is only -0738 D440 ; one reference to this at (A2D5h). -0739 D440 ; -0740 D440 06 03 MOVE3: LD B,3 -0741 D442 ; -0742 D442 ; Move (B) bytes from (HL) to (DE). -0743 D442 ; -0744 D442 7E HL2DE: LD A,(HL) -0745 D443 12 LD (DE),A -0746 D444 23 INC HL -0747 D445 13 INC DE -0748 D446 05 DEC B -0749 D447 C2 42 D4 JP NZ,HL2DE -0750 D44A C9 RET -0751 D44B ; -0752 D44B ; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here. -0753 D44B ; -0754 D44B 21 80 00 EXTRACT:LD HL,TBUFF -0755 D44E 81 ADD A,C -0756 D44F CD 59 D2 CALL ADDHL -0757 D452 7E LD A,(HL) -0758 D453 C9 RET -0759 D454 ; -0760 D454 ; Check drive specified. If it means a change, then the new -0761 D454 ; drive will be selected. In any case, the drive byte of the -0762 D454 ; fcb will be set to null (means use current drive). -0763 D454 ; -0764 D454 AF DSELECT:XOR A ;null out first byte of fcb. -0765 D455 32 CD D7 LD (FCB),A -0766 D458 3A F0 D7 LD A,(CHGDRV) ;a drive change indicated? -0767 D45B B7 OR A -0768 D45C C8 RET Z -0769 D45D 3D DEC A ;yes, is it the same as the current drive? -0770 D45E 21 EF D7 LD HL,CDRIVE -0771 D461 BE CP (HL) -0772 D462 C8 RET Z -0773 D463 C3 BD D0 JP DSKSEL ;no. Select it then. -0774 D466 ; -0775 D466 ; Check the drive selection and reset it to the previous -0776 D466 ; drive if it was changed for the preceeding command. -0777 D466 ; -0778 D466 3A F0 D7 RESETDR:LD A,(CHGDRV) ;drive change indicated? -0779 D469 B7 OR A -0780 D46A C8 RET Z -0781 D46B 3D DEC A ;yes, was it a different drive? -0782 D46C 21 EF D7 LD HL,CDRIVE -0783 D46F BE CP (HL) -0784 D470 C8 RET Z -0785 D471 3A EF D7 LD A,(CDRIVE) ;yes, re-select our old drive. -0786 D474 C3 BD D0 JP DSKSEL -0787 D477 ; -0788 D477 ;************************************************************** -0789 D477 ;* -0790 D477 ;* D I R E C T O R Y C O M M A N D -0791 D477 ;* -0792 D477 ;************************************************************** -0793 D477 ; -0794 D477 CD 5E D2 DIRECT: CALL CONVFST ;convert file name. -0795 D47A CD 54 D4 CALL DSELECT ;select indicated drive. -0796 D47D 21 CE D7 LD HL,FCB+1 ;was any file indicated? -0797 D480 7E LD A,(HL) -0798 D481 FE 20 CP ' ' -0799 D483 C2 8F D4 JP NZ,DIRECT2 -0800 D486 06 0B LD B,11 ;no. Fill field with '?' - same as *.*. -0801 D488 36 3F DIRECT1:LD (HL),'?' -0802 D48A 23 INC HL -0803 D48B 05 DEC B -0804 D48C C2 88 D4 JP NZ,DIRECT1 -0805 D48F 1E 00 DIRECT2:LD E,0 ;set initial cursor position. -0806 D491 D5 PUSH DE -0807 D492 CD E9 D0 CALL SRCHFCB ;get first file name. -0808 D495 CC EA D3 CALL Z,NONE ;none found at all? -0809 D498 CA 1B D5 DIRECT3:JP Z,DIRECT9 ;terminate if no more names. -0810 D49B 3A EE D7 LD A,(RTNCODE) ;get file's position in segment (0-3). -0811 D49E 0F RRCA -0812 D49F 0F RRCA -0813 D4A0 0F RRCA -0814 D4A1 E6 60 AND 60H ;(A)=position*32 -0815 D4A3 4F LD C,A -0816 D4A4 3E 0A LD A,10 -0817 D4A6 CD 4B D4 CALL EXTRACT ;extract the tenth entry in fcb. -0818 D4A9 17 RLA ;check system file status bit. -0819 D4AA DA 0F D5 JP C,DIRECT8 ;we don't list them. -0820 D4AD D1 POP DE -0821 D4AE 7B LD A,E ;bump name count. -0822 D4AF 1C INC E -0823 D4B0 D5 PUSH DE -0824 D4B1 E6 03 AND 03H ;at end of line? -0825 D4B3 F5 PUSH AF -0826 D4B4 C2 CC D4 JP NZ,DIRECT4 -0827 D4B7 CD 98 D0 CALL CRLF ;yes, end this line and start another. -0828 D4BA C5 PUSH BC -0829 D4BB CD D0 D1 CALL GETDSK ;start line with ('A:'). -0830 D4BE C1 POP BC -0831 D4BF C6 41 ADD A,'A' -0832 D4C1 CD 92 D0 CALL PRINTB -0833 D4C4 3E 3A LD A,':' -0834 D4C6 CD 92 D0 CALL PRINTB -0835 D4C9 C3 D4 D4 JP DIRECT5 -0836 D4CC CD A2 D0 DIRECT4:CALL SPACE ;add seperator between file names. -0837 D4CF 3E 3A LD A,':' -0838 D4D1 CD 92 D0 CALL PRINTB -0839 D4D4 CD A2 D0 DIRECT5:CALL SPACE -0840 D4D7 06 01 LD B,1 ;'extract' each file name character at a time. -0841 D4D9 78 DIRECT6:LD A,B -0842 D4DA CD 4B D4 CALL EXTRACT -0843 D4DD E6 7F AND 7FH ;strip bit 7 (status bit). -0844 D4DF FE 20 CP ' ' ;are we at the end of the name? -0845 D4E1 C2 F9 D4 JP NZ,DRECT65 -0846 D4E4 F1 POP AF ;yes, don't print spaces at the end of a line. -0847 D4E5 F5 PUSH AF -0848 D4E6 FE 03 CP 3 -0849 D4E8 C2 F7 D4 JP NZ,DRECT63 -0850 D4EB 3E 09 LD A,9 ;first check for no extension. -0851 D4ED CD 4B D4 CALL EXTRACT -0852 D4F0 E6 7F AND 7FH -0853 D4F2 FE 20 CP ' ' -0854 D4F4 CA 0E D5 JP Z,DIRECT7 ;don't print spaces. -0855 D4F7 3E 20 DRECT63:LD A,' ' ;else print them. -0856 D4F9 CD 92 D0 DRECT65:CALL PRINTB -0857 D4FC 04 INC B ;bump to next character psoition. -0858 D4FD 78 LD A,B -0859 D4FE FE 0C CP 12 ;end of the name? -0860 D500 D2 0E D5 JP NC,DIRECT7 -0861 D503 FE 09 CP 9 ;nope, starting extension? -0862 D505 C2 D9 D4 JP NZ,DIRECT6 -0863 D508 CD A2 D0 CALL SPACE ;yes, add seperating space. -0864 D50B C3 D9 D4 JP DIRECT6 -0865 D50E F1 DIRECT7:POP AF ;get the next file name. -0866 D50F CD C2 D1 DIRECT8:CALL CHKCON ;first check console, quit on anything. -0867 D512 C2 1B D5 JP NZ,DIRECT9 -0868 D515 CD E4 D0 CALL SRCHNXT ;get next name. -0869 D518 C3 98 D4 JP DIRECT3 ;and continue with our list. -0870 D51B D1 DIRECT9:POP DE ;restore the stack and return to command level. -0871 D51C C3 86 D7 JP GETBACK -0872 D51F ; -0873 D51F ;************************************************************** -0874 D51F ;* -0875 D51F ;* E R A S E C O M M A N D -0876 D51F ;* -0877 D51F ;************************************************************** -0878 D51F ; -0879 D51F CD 5E D2 ERASE: CALL CONVFST ;convert file name. -0880 D522 FE 0B CP 11 ;was '*.*' entered? -0881 D524 C2 42 D5 JP NZ,ERASE1 -0882 D527 01 52 D5 LD BC,YESNO ;yes, ask for confirmation. -0883 D52A CD A7 D0 CALL PLINE -0884 D52D CD 39 D1 CALL GETINP -0885 D530 21 07 D0 LD HL,INBUFF+1 -0886 D533 35 DEC (HL) ;must be exactly 'y'. -0887 D534 C2 82 D3 JP NZ,CMMND1 -0888 D537 23 INC HL -0889 D538 7E LD A,(HL) -0890 D539 FE 59 CP 'Y' -0891 D53B C2 82 D3 JP NZ,CMMND1 -0892 D53E 23 INC HL -0893 D53F 22 88 D0 LD (INPOINT),HL ;save input line pointer. -0894 D542 CD 54 D4 ERASE1: CALL DSELECT ;select desired disk. -0895 D545 11 CD D7 LD DE,FCB -0896 D548 CD EF D0 CALL DELETE ;delete the file. -0897 D54B 3C INC A -0898 D54C CC EA D3 CALL Z,NONE ;not there? -0899 D54F C3 86 D7 JP GETBACK ;return to command level now. -0900 D552 416C6C202879YESNO: .TEXT "All (y/n)?" -0900 D558 2F6E293F -0901 D55C 00 .DB 0 -0902 D55D ; -0903 D55D ;************************************************************** -0904 D55D ;* -0905 D55D ;* T Y P E C O M M A N D -0906 D55D ;* -0907 D55D ;************************************************************** -0908 D55D ; -0909 D55D CD 5E D2 TYPE: CALL CONVFST ;convert file name. -0910 D560 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. -0911 D563 CD 54 D4 CALL DSELECT ;select indicated drive. -0912 D566 CD D0 D0 CALL OPENFCB ;open the file. -0913 D569 CA A7 D5 JP Z,TYPE5 ;not there? -0914 D56C CD 98 D0 CALL CRLF ;ok, start a new line on the screen. -0915 D56F 21 F1 D7 LD HL,NBYTES ;initialize byte counter. -0916 D572 36 FF LD (HL),0FFH ;set to read first sector. -0917 D574 21 F1 D7 TYPE1: LD HL,NBYTES -0918 D577 7E TYPE2: LD A,(HL) ;have we written the entire sector? -0919 D578 FE 80 CP 128 -0920 D57A DA 87 D5 JP C,TYPE3 -0921 D57D E5 PUSH HL ;yes, read in the next one. -0922 D57E CD FE D0 CALL READFCB -0923 D581 E1 POP HL -0924 D582 C2 A0 D5 JP NZ,TYPE4 ;end or error? -0925 D585 AF XOR A ;ok, clear byte counter. -0926 D586 77 LD (HL),A -0927 D587 34 TYPE3: INC (HL) ;count this byte. -0928 D588 21 80 00 LD HL,TBUFF ;and get the (A)th one from the buffer (TBUFF). -0929 D58B CD 59 D2 CALL ADDHL -0930 D58E 7E LD A,(HL) -0931 D58F FE 1A CP CNTRLZ ;end of file mark? -0932 D591 CA 86 D7 JP Z,GETBACK -0933 D594 CD 8C D0 CALL PRINT ;no, print it. -0934 D597 CD C2 D1 CALL CHKCON ;check console, quit if anything ready. -0935 D59A C2 86 D7 JP NZ,GETBACK -0936 D59D C3 74 D5 JP TYPE1 -0937 D5A0 ; -0938 D5A0 ; Get here on an end of file or read error. -0939 D5A0 ; -0940 D5A0 3D TYPE4: DEC A ;read error? -0941 D5A1 CA 86 D7 JP Z,GETBACK -0942 D5A4 CD D9 D3 CALL RDERROR ;yes, print message. -0943 D5A7 CD 66 D4 TYPE5: CALL RESETDR ;and reset proper drive -0944 D5AA C3 09 D2 JP SYNERR ;now print file name with problem. -0945 D5AD ; -0946 D5AD ;************************************************************** -0947 D5AD ;* -0948 D5AD ;* S A V E C O M M A N D -0949 D5AD ;* -0950 D5AD ;************************************************************** -0951 D5AD ; -0952 D5AD CD F8 D3 SAVE: CALL DECODE ;get numeric number that follows SAVE. -0953 D5B0 F5 PUSH AF ;save number of pages to write. -0954 D5B1 CD 5E D2 CALL CONVFST ;convert file name. -0955 D5B4 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. -0956 D5B7 CD 54 D4 CALL DSELECT ;select specified drive. -0957 D5BA 11 CD D7 LD DE,FCB ;now delete this file. -0958 D5BD D5 PUSH DE -0959 D5BE CD EF D0 CALL DELETE -0960 D5C1 D1 POP DE -0961 D5C2 CD 09 D1 CALL CREATE ;and create it again. -0962 D5C5 CA FB D5 JP Z,SAVE3 ;can't create? -0963 D5C8 AF XOR A ;clear record number byte. -0964 D5C9 32 ED D7 LD (FCB+32),A -0965 D5CC F1 POP AF ;convert pages to sectors. -0966 D5CD 6F LD L,A -0967 D5CE 26 00 LD H,0 -0968 D5D0 29 ADD HL,HL ;(HL)=number of sectors to write. -0969 D5D1 11 00 01 LD DE,TBASE ;and we start from here. -0970 D5D4 7C SAVE1: LD A,H ;done yet? -0971 D5D5 B5 OR L -0972 D5D6 CA F1 D5 JP Z,SAVE2 -0973 D5D9 2B DEC HL ;nope, count this and compute the start -0974 D5DA E5 PUSH HL ;of the next 128 byte sector. -0975 D5DB 21 80 00 LD HL,128 -0976 D5DE 19 ADD HL,DE -0977 D5DF E5 PUSH HL ;save it and set the transfer address. -0978 D5E0 CD D8 D1 CALL DMASET -0979 D5E3 11 CD D7 LD DE,FCB ;write out this sector now. -0980 D5E6 CD 04 D1 CALL WRTREC -0981 D5E9 D1 POP DE ;reset (DE) to the start of the last sector. -0982 D5EA E1 POP HL ;restore sector count. -0983 D5EB C2 FB D5 JP NZ,SAVE3 ;write error? -0984 D5EE C3 D4 D5 JP SAVE1 -0985 D5F1 ; -0986 D5F1 ; Get here after writing all of the file. -0987 D5F1 ; -0988 D5F1 11 CD D7 SAVE2: LD DE,FCB ;now close the file. -0989 D5F4 CD DA D0 CALL CLOSE -0990 D5F7 3C INC A ;did it close ok? -0991 D5F8 C2 01 D6 JP NZ,SAVE4 -0992 D5FB ; -0993 D5FB ; Print out error message (no space). -0994 D5FB ; -0995 D5FB 01 07 D6 SAVE3: LD BC,NOSPACE -0996 D5FE CD A7 D0 CALL PLINE -0997 D601 CD D5 D1 SAVE4: CALL STDDMA ;reset the standard dma address. -0998 D604 C3 86 D7 JP GETBACK -0999 D607 4E6F20737061NOSPACE:.TEXT "No space" -0999 D60D 6365 -1000 D60F 00 .DB 0 -1001 D610 ; -1002 D610 ;************************************************************** -1003 D610 ;* -1004 D610 ;* R E N A M E C O M M A N D -1005 D610 ;* -1006 D610 ;************************************************************** -1007 D610 ; -1008 D610 CD 5E D2 RENAME: CALL CONVFST ;convert first file name. -1009 D613 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. -1010 D616 3A F0 D7 LD A,(CHGDRV) ;remember any change in drives specified. -1011 D619 F5 PUSH AF -1012 D61A CD 54 D4 CALL DSELECT ;and select this drive. -1013 D61D CD E9 D0 CALL SRCHFCB ;is this file present? -1014 D620 C2 79 D6 JP NZ,RENAME6 ;yes, print error message. -1015 D623 21 CD D7 LD HL,FCB ;yes, move this name into second slot. -1016 D626 11 DD D7 LD DE,FCB+16 -1017 D629 06 10 LD B,16 -1018 D62B CD 42 D4 CALL HL2DE -1019 D62E 2A 88 D0 LD HL,(INPOINT) ;get input pointer. -1020 D631 EB EX DE,HL -1021 D632 CD 4F D2 CALL NONBLANK ;get next non blank character. -1022 D635 FE 3D CP '=' ;only allow an '=' or '_' seperator. -1023 D637 CA 3F D6 JP Z,RENAME1 -1024 D63A FE 5F CP '_' -1025 D63C C2 73 D6 JP NZ,RENAME5 -1026 D63F EB RENAME1:EX DE,HL -1027 D640 23 INC HL ;ok, skip seperator. -1028 D641 22 88 D0 LD (INPOINT),HL ;save input line pointer. -1029 D644 CD 5E D2 CALL CONVFST ;convert this second file name now. -1030 D647 C2 73 D6 JP NZ,RENAME5 ;again, no wild cards. -1031 D64A F1 POP AF ;if a drive was specified, then it -1032 D64B 47 LD B,A ;must be the same as before. -1033 D64C 21 F0 D7 LD HL,CHGDRV -1034 D64F 7E LD A,(HL) -1035 D650 B7 OR A -1036 D651 CA 59 D6 JP Z,RENAME2 -1037 D654 B8 CP B -1038 D655 70 LD (HL),B -1039 D656 C2 73 D6 JP NZ,RENAME5 ;they were different, error. -1040 D659 70 RENAME2:LD (HL),B ; reset as per the first file specification. -1041 D65A AF XOR A -1042 D65B 32 CD D7 LD (FCB),A ;clear the drive byte of the fcb. -1043 D65E CD E9 D0 RENAME3:CALL SRCHFCB ;and go look for second file. -1044 D661 CA 6D D6 JP Z,RENAME4 ;doesn't exist? -1045 D664 11 CD D7 LD DE,FCB -1046 D667 CD 0E D1 CALL RENAM ;ok, rename the file. -1047 D66A C3 86 D7 JP GETBACK -1048 D66D ; -1049 D66D ; Process rename errors here. -1050 D66D ; -1051 D66D CD EA D3 RENAME4:CALL NONE ;file not there. -1052 D670 C3 86 D7 JP GETBACK -1053 D673 CD 66 D4 RENAME5:CALL RESETDR ;bad command format. -1054 D676 C3 09 D2 JP SYNERR -1055 D679 01 82 D6 RENAME6:LD BC,EXISTS ;destination file already exists. -1056 D67C CD A7 D0 CALL PLINE -1057 D67F C3 86 D7 JP GETBACK -1058 D682 46696C652065EXISTS: .TEXT "File exists" -1058 D688 7869737473 -1059 D68D 00 .DB 0 -1060 D68E ; -1061 D68E ;************************************************************** -1062 D68E ;* -1063 D68E ;* U S E R C O M M A N D -1064 D68E ;* -1065 D68E ;************************************************************** -1066 D68E ; -1067 D68E CD F8 D3 USER: CALL DECODE ;get numeric value following command. -1068 D691 FE 10 CP 16 ;legal user number? -1069 D693 D2 09 D2 JP NC,SYNERR -1070 D696 5F LD E,A ;yes but is there anything else? -1071 D697 3A CE D7 LD A,(FCB+1) -1072 D69A FE 20 CP ' ' -1073 D69C CA 09 D2 JP Z,SYNERR ;yes, that is not allowed. -1074 D69F CD 15 D1 CALL GETSETUC ;ok, set user code. -1075 D6A2 C3 89 D7 JP GETBACK1 -1076 D6A5 ; -1077 D6A5 ;************************************************************** -1078 D6A5 ;* -1079 D6A5 ;* T R A N S I A N T P R O G R A M C O M M A N D -1080 D6A5 ;* -1081 D6A5 ;************************************************************** -1082 D6A5 ; -1083 D6A5 CD F5 D1 UNKNOWN:CALL VERIFY ;check for valid system (why?). -1084 D6A8 3A CE D7 LD A,(FCB+1) ;anything to execute? -1085 D6AB FE 20 CP ' ' -1086 D6AD C2 C4 D6 JP NZ,UNKWN1 -1087 D6B0 3A F0 D7 LD A,(CHGDRV) ;nope, only a drive change? -1088 D6B3 B7 OR A -1089 D6B4 CA 89 D7 JP Z,GETBACK1 ;neither??? -1090 D6B7 3D DEC A -1091 D6B8 32 EF D7 LD (CDRIVE),A ;ok, store new drive. -1092 D6BB CD 29 D1 CALL MOVECD ;set (TDRIVE) also. -1093 D6BE CD BD D0 CALL DSKSEL ;and select this drive. -1094 D6C1 C3 89 D7 JP GETBACK1 ;then return. -1095 D6C4 ; -1096 D6C4 ; Here a file name was typed. Prepare to execute it. -1097 D6C4 ; -1098 D6C4 11 D6 D7 UNKWN1: LD DE,FCB+9 ;an extension specified? -1099 D6C7 1A LD A,(DE) -1100 D6C8 FE 20 CP ' ' -1101 D6CA C2 09 D2 JP NZ,SYNERR ;yes, not allowed. -1102 D6CD D5 UNKWN2: PUSH DE -1103 D6CE CD 54 D4 CALL DSELECT ;select specified drive. -1104 D6D1 D1 POP DE -1105 D6D2 21 83 D7 LD HL,COMFILE ;set the extension to 'COM'. -1106 D6D5 CD 40 D4 CALL MOVE3 -1107 D6D8 CD D0 D0 CALL OPENFCB ;and open this file. -1108 D6DB CA 6B D7 JP Z,UNKWN9 ;not present? -1109 D6DE ; -1110 D6DE ; Load in the program. -1111 D6DE ; -1112 D6DE 21 00 01 LD HL,TBASE ;store the program starting here. -1113 D6E1 E5 UNKWN3: PUSH HL -1114 D6E2 EB EX DE,HL -1115 D6E3 CD D8 D1 CALL DMASET ;set transfer address. -1116 D6E6 11 CD D7 LD DE,FCB ;and read the next record. -1117 D6E9 CD F9 D0 CALL RDREC -1118 D6EC C2 01 D7 JP NZ,UNKWN4 ;end of file or read error? -1119 D6EF E1 POP HL ;nope, bump pointer for next sector. -1120 D6F0 11 80 00 LD DE,128 -1121 D6F3 19 ADD HL,DE -1122 D6F4 11 00 D0 LD DE,CBASE ;enough room for the whole file? -1123 D6F7 7D LD A,L -1124 D6F8 93 SUB E -1125 D6F9 7C LD A,H -1126 D6FA 9A SBC A,D -1127 D6FB D2 71 D7 JP NC,UNKWN0 ;no, it can't fit. -1128 D6FE C3 E1 D6 JP UNKWN3 -1129 D701 ; -1130 D701 ; Get here after finished reading. -1131 D701 ; -1132 D701 E1 UNKWN4: POP HL -1133 D702 3D DEC A ;normal end of file? -1134 D703 C2 71 D7 JP NZ,UNKWN0 -1135 D706 CD 66 D4 CALL RESETDR ;yes, reset previous drive. -1136 D709 CD 5E D2 CALL CONVFST ;convert the first file name that follows -1137 D70C 21 F0 D7 LD HL,CHGDRV ;command name. -1138 D70F E5 PUSH HL -1139 D710 7E LD A,(HL) ;set drive code in default fcb. -1140 D711 32 CD D7 LD (FCB),A -1141 D714 3E 10 LD A,16 ;put second name 16 bytes later. -1142 D716 CD 60 D2 CALL CONVERT ;convert second file name. -1143 D719 E1 POP HL -1144 D71A 7E LD A,(HL) ;and set the drive for this second file. -1145 D71B 32 DD D7 LD (FCB+16),A -1146 D71E AF XOR A ;clear record byte in fcb. -1147 D71F 32 ED D7 LD (FCB+32),A -1148 D722 11 5C 00 LD DE,TFCB ;move it into place at(005Ch). -1149 D725 21 CD D7 LD HL,FCB -1150 D728 06 21 LD B,33 -1151 D72A CD 42 D4 CALL HL2DE -1152 D72D 21 08 D0 LD HL,INBUFF+2 ;now move the remainder of the input -1153 D730 7E UNKWN5: LD A,(HL) ;line down to (0080h). Look for a non blank. -1154 D731 B7 OR A ;or a null. -1155 D732 CA 3E D7 JP Z,UNKWN6 -1156 D735 FE 20 CP ' ' -1157 D737 CA 3E D7 JP Z,UNKWN6 -1158 D73A 23 INC HL -1159 D73B C3 30 D7 JP UNKWN5 -1160 D73E ; -1161 D73E ; Do the line move now. It ends in a null byte. -1162 D73E ; -1163 D73E 06 00 UNKWN6: LD B,0 ;keep a character count. -1164 D740 11 81 00 LD DE,TBUFF+1 ;data gets put here. -1165 D743 7E UNKWN7: LD A,(HL) ;move it now. -1166 D744 12 LD (DE),A -1167 D745 B7 OR A -1168 D746 CA 4F D7 JP Z,UNKWN8 -1169 D749 04 INC B -1170 D74A 23 INC HL -1171 D74B 13 INC DE -1172 D74C C3 43 D7 JP UNKWN7 -1173 D74F 78 UNKWN8: LD A,B ;now store the character count. -1174 D750 32 80 00 LD (TBUFF),A -1175 D753 CD 98 D0 CALL CRLF ;clean up the screen. -1176 D756 CD D5 D1 CALL STDDMA ;set standard transfer address. -1177 D759 CD 1A D1 CALL SETCDRV ;reset current drive. -1178 D75C CD 00 01 CALL TBASE ;and execute the program. -1179 D75F ; -1180 D75F ; Transiant programs return here (or reboot). -1181 D75F ; -1182 D75F 31 AB D7 LD SP,BATCH ;set stack first off. -1183 D762 CD 29 D1 CALL MOVECD ;move current drive into place (TDRIVE). -1184 D765 CD BD D0 CALL DSKSEL ;and reselect it. -1185 D768 C3 82 D3 JP CMMND1 ;back to comand mode. -1186 D76B ; -1187 D76B ; Get here if some error occured. -1188 D76B ; -1189 D76B CD 66 D4 UNKWN9: CALL RESETDR ;inproper format. -1190 D76E C3 09 D2 JP SYNERR -1191 D771 01 7A D7 UNKWN0: LD BC,BADLOAD ;read error or won't fit. -1192 D774 CD A7 D0 CALL PLINE -1193 D777 C3 86 D7 JP GETBACK -1194 D77A 426164206C6FBADLOAD:.TEXT "Bad load" -1194 D780 6164 -1195 D782 00 .DB 0 -1196 D783 43 4F 4D COMFILE:.TEXT "COM" ;command file extension. -1197 D786 ; -1198 D786 ; Get here to return to command level. We will reset the -1199 D786 ; previous active drive and then either return to command -1200 D786 ; level directly or print error message and then return. -1201 D786 ; -1202 D786 CD 66 D4 GETBACK:CALL RESETDR ;reset previous drive. -1203 D789 CD 5E D2 GETBACK1: CALL CONVFST ;convert first name in (FCB). -1204 D78C 3A CE D7 LD A,(FCB+1) ;if this was just a drive change request, -1205 D78F D6 20 SUB ' ' ;make sure it was valid. -1206 D791 21 F0 D7 LD HL,CHGDRV -1207 D794 B6 OR (HL) -1208 D795 C2 09 D2 JP NZ,SYNERR -1209 D798 C3 82 D3 JP CMMND1 ;ok, return to command level. -1210 D79B ; -1211 D79B ; ccp stack area. -1212 D79B ; -1213 D79B 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -1213 D7A1 00000000000000000000 -1214 D7AB CCPSTACK .EQU $ ;end of ccp stack area. -1215 D7AB ; -1216 D7AB ; Batch (or SUBMIT) processing information storage. -1217 D7AB ; -1218 D7AB 00 BATCH: .DB 0 ;batch mode flag (0=not active). -1219 D7AC 00 BATCHFCB: .DB 0, -1220 D7AD 242424202020 .TEXT "$$$ SUB" -1220 D7B3 2020535542 -1221 D7B8 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -1221 D7BE 000000000000000000000000000000 -1222 D7CD ; -1223 D7CD ; File control block setup by the CCP. -1224 D7CD ; -1225 D7CD 00 FCB: .DB 0 -1226 D7CE 202020202020 .TEXT " " -1226 D7D4 2020202020 -1227 D7D9 0000000000 .DB 0,0,0,0,0 -1228 D7DE 202020202020 .TEXT " " -1228 D7E4 2020202020 -1229 D7E9 0000000000 .DB 0,0,0,0,0 -1230 D7EE 00 RTNCODE:.DB 0 ;status returned from bdos call. -1231 D7EF 00 CDRIVE: .DB 0 ;currently active drive. -1232 D7F0 00 CHGDRV: .DB 0 ;change in drives flag (0=no change). -1233 D7F1 00 00 NBYTES: .DW 0 ;byte counter used by TYPE. -1234 D7F3 ; -1235 D7F3 ; Room for expansion? -1236 D7F3 ; -1237 D7F3 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0 -1237 D7F9 00000000000000 -1238 D800 ; -1239 D800 ; Note that the following six bytes must match those at -1240 D800 ; (PATTRN1) or cp/m will HALT. Why? -1241 D800 ; -1242 D800 001600000000PATTRN2:.DB 0,22,0,0,0,0 ;(* serial number bytes *). -1243 D806 ; -1244 D806 ;************************************************************** -1245 D806 ;* -1246 D806 ;* B D O S E N T R Y -1247 D806 ;* -1248 D806 ;************************************************************** -1249 D806 ; -1250 D806 C3 11 D8 FBASE: JP FBASE1 -1251 D809 ; -1252 D809 ; Bdos error table. -1253 D809 ; -1254 D809 99 D8 BADSCTR:.DW ERROR1 ;bad sector on read or write. -1255 D80B A5 D8 BADSLCT:.DW ERROR2 ;bad disk select. -1256 D80D AB D8 RODISK: .DW ERROR3 ;disk is read only. -1257 D80F B1 D8 ROFILE: .DW ERROR4 ;file is read only. -1258 D811 ; -1259 D811 ; Entry into bdos. (DE) or (E) are the parameters passed. The -1260 D811 ; function number desired is in register (C). -1261 D811 ; -1262 D811 EB FBASE1: EX DE,HL ;save the (DE) parameters. -1263 D812 22 43 DB LD (PARAMS),HL -1264 D815 EB EX DE,HL -1265 D816 7B LD A,E ;and save register (E) in particular. -1266 D817 32 D6 E5 LD (EPARAM),A -1267 D81A 21 00 00 LD HL,0 -1268 D81D 22 45 DB LD (STATUS),HL ;clear return status. -1269 D820 39 ADD HL,SP -1270 D821 22 0F DB LD (USRSTACK),HL ;save users stack pointer. -1271 D824 31 41 DB LD SP,STKAREA ;and set our own. -1272 D827 AF XOR A ;clear auto select storage space. -1273 D828 32 E0 E5 LD (AUTOFLAG),A -1274 D82B 32 DE E5 LD (AUTO),A -1275 D82E 21 74 E5 LD HL,GOBACK ;set return address. -1276 D831 E5 PUSH HL -1277 D832 79 LD A,C ;get function number. -1278 D833 FE 29 CP NFUNCTS ;valid function number? -1279 D835 D0 RET NC -1280 D836 4B LD C,E ;keep single register function here. -1281 D837 21 47 D8 LD HL,FUNCTNS ;now look thru the function table. -1282 D83A 5F LD E,A -1283 D83B 16 00 LD D,0 ;(DE)=function number. -1284 D83D 19 ADD HL,DE -1285 D83E 19 ADD HL,DE ;(HL)=(start of table)+2*(function number). -1286 D83F 5E LD E,(HL) -1287 D840 23 INC HL -1288 D841 56 LD D,(HL) ;now (DE)=address for this function. -1289 D842 2A 43 DB LD HL,(PARAMS) ;retrieve parameters. -1290 D845 EB EX DE,HL ;now (DE) has the original parameters. -1291 D846 E9 JP (HL) ;execute desired function. -1292 D847 ; -1293 D847 ; BDOS function jump table. -1294 D847 ; -1295 D847 NFUNCTS .EQU 41 ;number of functions in followin table. -1296 D847 ; -1297 D847 03E6C8DA90D9FUNCTNS:.DW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB -1297 D84D CEDA12E60FE6D4DAEDDA -1298 D857 F3DAF8DAE1D9 .DW SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL -1298 D85D FEDA7EE483E445E49CE4 -1299 D867 A5E4ABE4C8E4 .DW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE -1299 D86D D7E4E0E4E6E4ECE4 -1300 D875 F5E4FEE404E5 .DW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR -1300 D87B 0AE511E52CDD17E51DE5 -1301 D885 26E52DE541E5 .DW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN -1301 D88B 47E54DE50EE453E504DB -1302 D895 04 DB 9B E5 .DW RTN,WTSPECL -1303 D899 ; -1304 D899 ; Bdos error message section. -1305 D899 ; -1306 D899 21 CA D8 ERROR1: LD HL,BADSEC ;bad sector message. -1307 D89C CD E5 D8 CALL PRTERR ;print it and get a 1 char responce. -1308 D89F FE 03 CP CNTRLC ;re-boot request (control-c)? -1309 D8A1 CA 00 00 JP Z,0 ;yes. -1310 D8A4 C9 RET ;no, return to retry i/o function. -1311 D8A5 ; -1312 D8A5 21 D5 D8 ERROR2: LD HL,BADSEL ;bad drive selected. -1313 D8A8 C3 B4 D8 JP ERROR5 -1314 D8AB ; -1315 D8AB 21 E1 D8 ERROR3: LD HL,DISKRO ;disk is read only. -1316 D8AE C3 B4 D8 JP ERROR5 -1317 D8B1 ; -1318 D8B1 21 DC D8 ERROR4: LD HL,FILERO ;file is read only. -1319 D8B4 ; -1320 D8B4 CD E5 D8 ERROR5: CALL PRTERR -1321 D8B7 C3 00 00 JP 0 ;always reboot on these errors. -1322 D8BA ; -1323 D8BA 42646F732045BDOSERR:.TEXT "Bdos Err On " -1323 D8C0 7272204F6E20 -1324 D8C6 20 3A 20 24 BDOSDRV:.TEXT " : $" -1325 D8CA 426164205365BADSEC: .TEXT "Bad Sector$" -1325 D8D0 63746F7224 -1326 D8D5 53656C656374BADSEL: .TEXT "Select$" -1326 D8DB 24 -1327 D8DC 46696C6520 FILERO: .TEXT "File " -1328 D8E1 52 2F 4F 24 DISKRO: .TEXT "R/O$" -1329 D8E5 ; -1330 D8E5 ; Print bdos error message. -1331 D8E5 ; -1332 D8E5 E5 PRTERR: PUSH HL ;save second message pointer. -1333 D8E6 CD C9 D9 CALL OUTCRLF ;send (cr)(lf). -1334 D8E9 3A 42 DB LD A,(ACTIVE) ;get active drive. -1335 D8EC C6 41 ADD A,'A' ;make ascii. -1336 D8EE 32 C6 D8 LD (BDOSDRV),A ;and put in message. -1337 D8F1 01 BA D8 LD BC,BDOSERR ;and print it. -1338 D8F4 CD D3 D9 CALL PRTMESG -1339 D8F7 C1 POP BC ;print second message line now. -1340 D8F8 CD D3 D9 CALL PRTMESG -1341 D8FB ; -1342 D8FB ; Get an input character. We will check our 1 character -1343 D8FB ; buffer first. This may be set by the console status routine. -1344 D8FB ; -1345 D8FB 21 0E DB GETCHAR:LD HL,CHARBUF ;check character buffer. -1346 D8FE 7E LD A,(HL) ;anything present already? -1347 D8FF 36 00 LD (HL),0 ;...either case clear it. -1348 D901 B7 OR A -1349 D902 C0 RET NZ ;yes, use it. -1350 D903 C3 09 E6 JP CONIN ;nope, go get a character responce. -1351 D906 ; -1352 D906 ; Input and echo a character. -1353 D906 ; -1354 D906 CD FB D8 GETECHO:CALL GETCHAR ;input a character. -1355 D909 CD 14 D9 CALL CHKCHAR ;carriage control? -1356 D90C D8 RET C ;no, a regular control char so don't echo. -1357 D90D F5 PUSH AF ;ok, save character now. -1358 D90E 4F LD C,A -1359 D90F CD 90 D9 CALL OUTCON ;and echo it. -1360 D912 F1 POP AF ;get character and return. -1361 D913 C9 RET -1362 D914 ; -1363 D914 ; Check character in (A). Set the zero flag on a carriage -1364 D914 ; control character and the carry flag on any other control -1365 D914 ; character. -1366 D914 ; -1367 D914 FE 0D CHKCHAR:CP CR ;check for carriage return, line feed, backspace, -1368 D916 C8 RET Z ;or a tab. -1369 D917 FE 0A CP LF -1370 D919 C8 RET Z -1371 D91A FE 09 CP TAB -1372 D91C C8 RET Z -1373 D91D FE 08 CP BS -1374 D91F C8 RET Z -1375 D920 FE 20 CP ' ' ;other control char? Set carry flag. -1376 D922 C9 RET -1377 D923 ; -1378 D923 ; Check the console during output. Halt on a control-s, then -1379 D923 ; reboot on a control-c. If anything else is ready, clear the -1380 D923 ; zero flag and return (the calling routine may want to do -1381 D923 ; something). -1382 D923 ; -1383 D923 3A 0E DB CKCONSOL: LD A,(CHARBUF) ;check buffer. -1384 D926 B7 OR A ;if anything, just return without checking. -1385 D927 C2 45 D9 JP NZ,CKCON2 -1386 D92A CD 06 E6 CALL CONST ;nothing in buffer. Check console. -1387 D92D E6 01 AND 01H ;look at bit 0. -1388 D92F C8 RET Z ;return if nothing. -1389 D930 CD 09 E6 CALL CONIN ;ok, get it. -1390 D933 FE 13 CP CNTRLS ;if not control-s, return with zero cleared. -1391 D935 C2 42 D9 JP NZ,CKCON1 -1392 D938 CD 09 E6 CALL CONIN ;halt processing until another char -1393 D93B FE 03 CP CNTRLC ;is typed. Control-c? -1394 D93D CA 00 00 JP Z,0 ;yes, reboot now. -1395 D940 AF XOR A ;no, just pretend nothing was ever ready. -1396 D941 C9 RET -1397 D942 32 0E DB CKCON1: LD (CHARBUF),A ;save character in buffer for later processing. -1398 D945 3E 01 CKCON2: LD A,1 ;set (A) to non zero to mean something is ready. -1399 D947 C9 RET -1400 D948 ; -1401 D948 ; Output (C) to the screen. If the printer flip-flop flag -1402 D948 ; is set, we will send character to printer also. The console -1403 D948 ; will be checked in the process. -1404 D948 ; -1405 D948 3A 0A DB OUTCHAR:LD A,(OUTFLAG) ;check output flag. -1406 D94B B7 OR A ;anything and we won't generate output. -1407 D94C C2 62 D9 JP NZ,OUTCHR1 -1408 D94F C5 PUSH BC -1409 D950 CD 23 D9 CALL CKCONSOL ;check console (we don't care whats there). -1410 D953 C1 POP BC -1411 D954 C5 PUSH BC -1412 D955 CD 0C E6 CALL CONOUT ;output (C) to the screen. -1413 D958 C1 POP BC -1414 D959 C5 PUSH BC -1415 D95A 3A 0D DB LD A,(PRTFLAG) ;check printer flip-flop flag. -1416 D95D B7 OR A -1417 D95E C4 0F E6 CALL NZ,LIST ;print it also if non-zero. -1418 D961 C1 POP BC -1419 D962 79 OUTCHR1:LD A,C ;update cursors position. -1420 D963 21 0C DB LD HL,CURPOS -1421 D966 FE 7F CP DEL ;rubouts don't do anything here. -1422 D968 C8 RET Z -1423 D969 34 INC (HL) ;bump line pointer. -1424 D96A FE 20 CP ' ' ;and return if a normal character. -1425 D96C D0 RET NC -1426 D96D 35 DEC (HL) ;restore and check for the start of the line. -1427 D96E 7E LD A,(HL) -1428 D96F B7 OR A -1429 D970 C8 RET Z ;ingnore control characters at the start of the line. -1430 D971 79 LD A,C -1431 D972 FE 08 CP BS ;is it a backspace? -1432 D974 C2 79 D9 JP NZ,OUTCHR2 -1433 D977 35 DEC (HL) ;yes, backup pointer. -1434 D978 C9 RET -1435 D979 FE 0A OUTCHR2:CP LF ;is it a line feed? -1436 D97B C0 RET NZ ;ignore anything else. -1437 D97C 36 00 LD (HL),0 ;reset pointer to start of line. -1438 D97E C9 RET -1439 D97F ; -1440 D97F ; Output (A) to the screen. If it is a control character -1441 D97F ; (other than carriage control), use ^x format. -1442 D97F ; -1443 D97F 79 SHOWIT: LD A,C -1444 D980 CD 14 D9 CALL CHKCHAR ;check character. -1445 D983 D2 90 D9 JP NC,OUTCON ;not a control, use normal output. -1446 D986 F5 PUSH AF -1447 D987 0E 5E LD C,'^' ;for a control character, preceed it with '^'. -1448 D989 CD 48 D9 CALL OUTCHAR -1449 D98C F1 POP AF -1450 D98D F6 40 OR '@' ;and then use the letter equivelant. -1451 D98F 4F LD C,A -1452 D990 ; -1453 D990 ; Function to output (C) to the console device and expand tabs -1454 D990 ; if necessary. -1455 D990 ; -1456 D990 79 OUTCON: LD A,C -1457 D991 FE 09 CP TAB ;is it a tab? -1458 D993 C2 48 D9 JP NZ,OUTCHAR ;use regular output. -1459 D996 0E 20 OUTCON1:LD C,' ' ;yes it is, use spaces instead. -1460 D998 CD 48 D9 CALL OUTCHAR -1461 D99B 3A 0C DB LD A,(CURPOS) ;go until the cursor is at a multiple of 8 -1462 D99E -1463 D99E E6 07 AND 07H ;position. -1464 D9A0 C2 96 D9 JP NZ,OUTCON1 -1465 D9A3 C9 RET -1466 D9A4 ; -1467 D9A4 ; Echo a backspace character. Erase the prevoius character -1468 D9A4 ; on the screen. -1469 D9A4 ; -1470 D9A4 CD AC D9 BACKUP: CALL BACKUP1 ;backup the screen 1 place. -1471 D9A7 0E 20 LD C,' ' ;then blank that character. -1472 D9A9 CD 0C E6 CALL CONOUT -1473 D9AC 0E 08 BACKUP1:LD C,BS ;then back space once more. -1474 D9AE C3 0C E6 JP CONOUT -1475 D9B1 ; -1476 D9B1 ; Signal a deleted line. Print a '#' at the end and start -1477 D9B1 ; over. -1478 D9B1 ; -1479 D9B1 0E 23 NEWLINE:LD C,'#' -1480 D9B3 CD 48 D9 CALL OUTCHAR ;print this. -1481 D9B6 CD C9 D9 CALL OUTCRLF ;start new line. -1482 D9B9 3A 0C DB NEWLN1: LD A,(CURPOS) ;move the cursor to the starting position. -1483 D9BC 21 0B DB LD HL,STARTING -1484 D9BF BE CP (HL) -1485 D9C0 D0 RET NC ;there yet? -1486 D9C1 0E 20 LD C,' ' -1487 D9C3 CD 48 D9 CALL OUTCHAR ;nope, keep going. -1488 D9C6 C3 B9 D9 JP NEWLN1 -1489 D9C9 ; -1490 D9C9 ; Output a (cr) (lf) to the console device (screen). -1491 D9C9 ; -1492 D9C9 0E 0D OUTCRLF:LD C,CR -1493 D9CB CD 48 D9 CALL OUTCHAR -1494 D9CE 0E 0A LD C,LF -1495 D9D0 C3 48 D9 JP OUTCHAR -1496 D9D3 ; -1497 D9D3 ; Print message pointed to by (BC). It will end with a '$'. -1498 D9D3 ; -1499 D9D3 0A PRTMESG:LD A,(BC) ;check for terminating character. -1500 D9D4 FE 24 CP '$' -1501 D9D6 C8 RET Z -1502 D9D7 03 INC BC -1503 D9D8 C5 PUSH BC ;otherwise, bump pointer and print it. -1504 D9D9 4F LD C,A -1505 D9DA CD 90 D9 CALL OUTCON -1506 D9DD C1 POP BC -1507 D9DE C3 D3 D9 JP PRTMESG -1508 D9E1 ; -1509 D9E1 ; Function to execute a buffered read. -1510 D9E1 ; -1511 D9E1 3A 0C DB RDBUFF: LD A,(CURPOS) ;use present location as starting one. -1512 D9E4 32 0B DB LD (STARTING),A -1513 D9E7 2A 43 DB LD HL,(PARAMS) ;get the maximum buffer space. -1514 D9EA 4E LD C,(HL) -1515 D9EB 23 INC HL ;point to first available space. -1516 D9EC E5 PUSH HL ;and save. -1517 D9ED 06 00 LD B,0 ;keep a character count. -1518 D9EF C5 RDBUF1: PUSH BC -1519 D9F0 E5 PUSH HL -1520 D9F1 CD FB D8 RDBUF2: CALL GETCHAR ;get the next input character. -1521 D9F4 E6 7F AND 7FH ;strip bit 7. -1522 D9F6 E1 POP HL ;reset registers. -1523 D9F7 C1 POP BC -1524 D9F8 FE 0D CP CR ;en of the line? -1525 D9FA CA C1 DA JP Z,RDBUF17 -1526 D9FD FE 0A CP LF -1527 D9FF CA C1 DA JP Z,RDBUF17 -1528 DA02 FE 08 CP BS ;how about a backspace? -1529 DA04 C2 16 DA JP NZ,RDBUF3 -1530 DA07 78 LD A,B ;yes, but ignore at the beginning of the line. -1531 DA08 B7 OR A -1532 DA09 CA EF D9 JP Z,RDBUF1 -1533 DA0C 05 DEC B ;ok, update counter. -1534 DA0D 3A 0C DB LD A,(CURPOS) ;if we backspace to the start of the line, -1535 DA10 32 0A DB LD (OUTFLAG),A ;treat as a cancel (control-x). -1536 DA13 C3 70 DA JP RDBUF10 -1537 DA16 FE 7F RDBUF3: CP DEL ;user typed a rubout? -1538 DA18 C2 26 DA JP NZ,RDBUF4 -1539 DA1B 78 LD A,B ;ignore at the start of the line. -1540 DA1C B7 OR A -1541 DA1D CA EF D9 JP Z,RDBUF1 -1542 DA20 7E LD A,(HL) ;ok, echo the prevoius character. -1543 DA21 05 DEC B ;and reset pointers (counters). -1544 DA22 2B DEC HL -1545 DA23 C3 A9 DA JP RDBUF15 -1546 DA26 FE 05 RDBUF4: CP CNTRLE ;physical end of line? -1547 DA28 C2 37 DA JP NZ,RDBUF5 -1548 DA2B C5 PUSH BC ;yes, do it. -1549 DA2C E5 PUSH HL -1550 DA2D CD C9 D9 CALL OUTCRLF -1551 DA30 AF XOR A ;and update starting position. -1552 DA31 32 0B DB LD (STARTING),A -1553 DA34 C3 F1 D9 JP RDBUF2 -1554 DA37 FE 10 RDBUF5: CP CNTRLP ;control-p? -1555 DA39 C2 48 DA JP NZ,RDBUF6 -1556 DA3C E5 PUSH HL ;yes, flip the print flag filp-flop byte. -1557 DA3D 21 0D DB LD HL,PRTFLAG -1558 DA40 3E 01 LD A,1 ;PRTFLAG=1-PRTFLAG -1559 DA42 96 SUB (HL) -1560 DA43 77 LD (HL),A -1561 DA44 E1 POP HL -1562 DA45 C3 EF D9 JP RDBUF1 -1563 DA48 FE 18 RDBUF6: CP CNTRLX ;control-x (cancel)? -1564 DA4A C2 5F DA JP NZ,RDBUF8 -1565 DA4D E1 POP HL -1566 DA4E 3A 0B DB RDBUF7: LD A,(STARTING) ;yes, backup the cursor to here. -1567 DA51 21 0C DB LD HL,CURPOS -1568 DA54 BE CP (HL) -1569 DA55 D2 E1 D9 JP NC,RDBUFF ;done yet? -1570 DA58 35 DEC (HL) ;no, decrement pointer and output back up one space. -1571 DA59 CD A4 D9 CALL BACKUP -1572 DA5C C3 4E DA JP RDBUF7 -1573 DA5F FE 15 RDBUF8: CP CNTRLU ;cntrol-u (cancel line)? -1574 DA61 C2 6B DA JP NZ,RDBUF9 -1575 DA64 CD B1 D9 CALL NEWLINE ;start a new line. -1576 DA67 E1 POP HL -1577 DA68 C3 E1 D9 JP RDBUFF -1578 DA6B FE 12 RDBUF9: CP CNTRLR ;control-r? -1579 DA6D C2 A6 DA JP NZ,RDBUF14 -1580 DA70 C5 RDBUF10:PUSH BC ;yes, start a new line and retype the old one. -1581 DA71 CD B1 D9 CALL NEWLINE -1582 DA74 C1 POP BC -1583 DA75 E1 POP HL -1584 DA76 E5 PUSH HL -1585 DA77 C5 PUSH BC -1586 DA78 78 RDBUF11:LD A,B ;done whole line yet? -1587 DA79 B7 OR A -1588 DA7A CA 8A DA JP Z,RDBUF12 -1589 DA7D 23 INC HL ;nope, get next character. -1590 DA7E 4E LD C,(HL) -1591 DA7F 05 DEC B ;count it. -1592 DA80 C5 PUSH BC -1593 DA81 E5 PUSH HL -1594 DA82 CD 7F D9 CALL SHOWIT ;and display it. -1595 DA85 E1 POP HL -1596 DA86 C1 POP BC -1597 DA87 C3 78 DA JP RDBUF11 -1598 DA8A E5 RDBUF12:PUSH HL ;done with line. If we were displaying -1599 DA8B 3A 0A DB LD A,(OUTFLAG) ;then update cursor position. -1600 DA8E B7 OR A -1601 DA8F CA F1 D9 JP Z,RDBUF2 -1602 DA92 21 0C DB LD HL,CURPOS ;because this line is shorter, we must -1603 DA95 96 SUB (HL) ;back up the cursor (not the screen however) -1604 DA96 32 0A DB LD (OUTFLAG),A ;some number of positions. -1605 DA99 CD A4 D9 RDBUF13:CALL BACKUP ;note that as long as (OUTFLAG) is non -1606 DA9C 21 0A DB LD HL,OUTFLAG ;zero, the screen will not be changed. -1607 DA9F 35 DEC (HL) -1608 DAA0 C2 99 DA JP NZ,RDBUF13 -1609 DAA3 C3 F1 D9 JP RDBUF2 ;now just get the next character. -1610 DAA6 ; -1611 DAA6 ; Just a normal character, put this in our buffer and echo. -1612 DAA6 ; -1613 DAA6 23 RDBUF14:INC HL -1614 DAA7 77 LD (HL),A ;store character. -1615 DAA8 04 INC B ;and count it. -1616 DAA9 C5 RDBUF15:PUSH BC -1617 DAAA E5 PUSH HL -1618 DAAB 4F LD C,A ;echo it now. -1619 DAAC CD 7F D9 CALL SHOWIT -1620 DAAF E1 POP HL -1621 DAB0 C1 POP BC -1622 DAB1 7E LD A,(HL) ;was it an abort request? -1623 DAB2 FE 03 CP CNTRLC ;control-c abort? -1624 DAB4 78 LD A,B -1625 DAB5 C2 BD DA JP NZ,RDBUF16 -1626 DAB8 FE 01 CP 1 ;only if at start of line. -1627 DABA CA 00 00 JP Z,0 -1628 DABD B9 RDBUF16:CP C ;nope, have we filled the buffer? -1629 DABE DA EF D9 JP C,RDBUF1 -1630 DAC1 E1 RDBUF17:POP HL ;yes end the line and return. -1631 DAC2 70 LD (HL),B -1632 DAC3 0E 0D LD C,CR -1633 DAC5 C3 48 D9 JP OUTCHAR ;output (cr) and return. -1634 DAC8 ; -1635 DAC8 ; Function to get a character from the console device. -1636 DAC8 ; -1637 DAC8 CD 06 D9 GETCON: CALL GETECHO ;get and echo. -1638 DACB C3 01 DB JP SETSTAT ;save status and return. -1639 DACE ; -1640 DACE ; Function to get a character from the tape reader device. -1641 DACE ; -1642 DACE CD 15 E6 GETRDR: CALL READER ;get a character from reader, set status and return. -1643 DAD1 C3 01 DB JP SETSTAT -1644 DAD4 ; -1645 DAD4 ; Function to perform direct console i/o. If (C) contains (FF) -1646 DAD4 ; then this is an input request. If (C) contains (FE) then -1647 DAD4 ; this is a status request. Otherwise we are to output (C). -1648 DAD4 ; -1649 DAD4 79 DIRCIO: LD A,C ;test for (FF). -1650 DAD5 3C INC A -1651 DAD6 CA E0 DA JP Z,DIRC1 -1652 DAD9 3C INC A ;test for (FE). -1653 DADA CA 06 E6 JP Z,CONST -1654 DADD C3 0C E6 JP CONOUT ;just output (C). -1655 DAE0 CD 06 E6 DIRC1: CALL CONST ;this is an input request. -1656 DAE3 B7 OR A -1657 DAE4 CA 91 E5 JP Z,GOBACK1 ;not ready? Just return (directly). -1658 DAE7 CD 09 E6 CALL CONIN ;yes, get character. -1659 DAEA C3 01 DB JP SETSTAT ;set status and return. -1660 DAED ; -1661 DAED ; Function to return the i/o byte. -1662 DAED ; -1663 DAED 3A 03 00 GETIOB: LD A,(IOBYTE) -1664 DAF0 C3 01 DB JP SETSTAT -1665 DAF3 ; -1666 DAF3 ; Function to set the i/o byte. -1667 DAF3 ; -1668 DAF3 21 03 00 SETIOB: LD HL,IOBYTE -1669 DAF6 71 LD (HL),C -1670 DAF7 C9 RET -1671 DAF8 ; -1672 DAF8 ; Function to print the character string pointed to by (DE) -1673 DAF8 ; on the console device. The string ends with a '$'. -1674 DAF8 ; -1675 DAF8 EB PRTSTR: EX DE,HL -1676 DAF9 4D LD C,L -1677 DAFA 44 LD B,H ;now (BC) points to it. -1678 DAFB C3 D3 D9 JP PRTMESG -1679 DAFE ; -1680 DAFE ; Function to interigate the console device. -1681 DAFE ; -1682 DAFE CD 23 D9 GETCSTS:CALL CKCONSOL -1683 DB01 ; -1684 DB01 ; Get here to set the status and return to the cleanup -1685 DB01 ; section. Then back to the user. -1686 DB01 ; -1687 DB01 32 45 DB SETSTAT:LD (STATUS),A -1688 DB04 C9 RTN: RET -1689 DB05 ; -1690 DB05 ; Set the status to 1 (read or write error code). -1691 DB05 ; -1692 DB05 3E 01 IOERR1: LD A,1 -1693 DB07 C3 01 DB JP SETSTAT -1694 DB0A ; -1695 DB0A 00 OUTFLAG:.DB 0 ;output flag (non zero means no output). -1696 DB0B 02 STARTING: .DB 2 ;starting position for cursor. -1697 DB0C 00 CURPOS: .DB 0 ;cursor position (0=start of line). -1698 DB0D 00 PRTFLAG:.DB 0 ;printer flag (control-p toggle). List if non zero. -1699 DB0E 00 CHARBUF:.DB 0 ;single input character buffer. -1700 DB0F ; -1701 DB0F ; Stack area for BDOS calls. -1702 DB0F ; -1703 DB0F 00 00 USRSTACK: .DW 0 ;save users stack pointer here. -1704 DB11 ; -1705 DB11 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -1705 DB17 000000000000000000000000000000000000 -1706 DB29 000000000000 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -1706 DB2F 000000000000000000000000000000000000 -1707 DB41 STKAREA .EQU $ ;end of stack area. -1708 DB41 ; -1709 DB41 00 USERNO: .DB 0 ;current user number. -1710 DB42 00 ACTIVE: .DB 0 ;currently active drive. -1711 DB43 00 00 PARAMS: .DW 0 ;save (DE) parameters here on entry. -1712 DB45 00 00 STATUS: .DW 0 ;status returned from bdos function. -1713 DB47 ; -1714 DB47 ; Select error occured, jump to error routine. -1715 DB47 ; -1716 DB47 21 0B D8 SLCTERR:LD HL,BADSLCT -1717 DB4A ; -1718 DB4A ; Jump to (HL) indirectly. -1719 DB4A ; -1720 DB4A 5E JUMPHL: LD E,(HL) -1721 DB4B 23 INC HL -1722 DB4C 56 LD D,(HL) ;now (DE) contain the desired address. -1723 DB4D EB EX DE,HL -1724 DB4E E9 JP (HL) -1725 DB4F ; -1726 DB4F ; Block move. (DE) to (HL), (C) bytes total. -1727 DB4F ; -1728 DB4F 0C DE2HL: INC C ;is count down to zero? -1729 DB50 0D DE2HL1: DEC C -1730 DB51 C8 RET Z ;yes, we are done. -1731 DB52 1A LD A,(DE) ;no, move one more byte. -1732 DB53 77 LD (HL),A -1733 DB54 13 INC DE -1734 DB55 23 INC HL -1735 DB56 C3 50 DB JP DE2HL1 ;and repeat. -1736 DB59 ; -1737 DB59 ; Select the desired drive. -1738 DB59 ; -1739 DB59 3A 42 DB SELECT: LD A,(ACTIVE) ;get active disk. -1740 DB5C 4F LD C,A -1741 DB5D CD 1B E6 CALL SELDSK ;select it. -1742 DB60 7C LD A,H ;valid drive? -1743 DB61 B5 OR L ;valid drive? -1744 DB62 C8 RET Z ;return if not. -1745 DB63 ; -1746 DB63 ; Here, the BIOS returned the address of the parameter block -1747 DB63 ; in (HL). We will extract the necessary pointers and save them. -1748 DB63 ; -1749 DB63 5E LD E,(HL) ;yes, get address of translation table into (DE). -1750 DB64 23 INC HL -1751 DB65 56 LD D,(HL) -1752 DB66 23 INC HL -1753 DB67 22 B3 E5 LD (SCRATCH1),HL ;save pointers to scratch areas. -1754 DB6A 23 INC HL -1755 DB6B 23 INC HL -1756 DB6C 22 B5 E5 LD (SCRATCH2),HL ;ditto. -1757 DB6F 23 INC HL -1758 DB70 23 INC HL -1759 DB71 22 B7 E5 LD (SCRATCH3),HL ;ditto. -1760 DB74 23 INC HL -1761 DB75 23 INC HL -1762 DB76 EB EX DE,HL ;now save the translation table address. -1763 DB77 22 D0 E5 LD (XLATE),HL -1764 DB7A 21 B9 E5 LD HL,DIRBUF ;put the next 8 bytes here. -1765 DB7D 0E 08 LD C,8 ;they consist of the directory buffer -1766 DB7F CD 4F DB CALL DE2HL ;pointer, parameter block pointer, -1767 DB82 2A BB E5 LD HL,(DISKPB) ;check and allocation vectors. -1768 DB85 EB EX DE,HL -1769 DB86 21 C1 E5 LD HL,SECTORS ;move parameter block into our ram. -1770 DB89 0E 0F LD C,15 ;it is 15 bytes long. -1771 DB8B CD 4F DB CALL DE2HL -1772 DB8E 2A C6 E5 LD HL,(DSKSIZE) ;check disk size. -1773 DB91 7C LD A,H ;more than 256 blocks on this? -1774 DB92 21 DD E5 LD HL,BIGDISK -1775 DB95 36 FF LD (HL),0FFH ;set to samll. -1776 DB97 B7 OR A -1777 DB98 CA 9D DB JP Z,SELECT1 -1778 DB9B 36 00 LD (HL),0 ;wrong, set to large. -1779 DB9D 3E FF SELECT1:LD A,0FFH ;clear the zero flag. -1780 DB9F B7 OR A -1781 DBA0 C9 RET -1782 DBA1 ; -1783 DBA1 ; Routine to home the disk track head and clear pointers. -1784 DBA1 ; -1785 DBA1 CD 18 E6 HOMEDRV:CALL HOME ;home the head. -1786 DBA4 AF XOR A -1787 DBA5 2A B5 E5 LD HL,(SCRATCH2) ;set our track pointer also. -1788 DBA8 77 LD (HL),A -1789 DBA9 23 INC HL -1790 DBAA 77 LD (HL),A -1791 DBAB 2A B7 E5 LD HL,(SCRATCH3) ;and our sector pointer. -1792 DBAE 77 LD (HL),A -1793 DBAF 23 INC HL -1794 DBB0 77 LD (HL),A -1795 DBB1 C9 RET -1796 DBB2 ; -1797 DBB2 ; Do the actual disk read and check the error return status. -1798 DBB2 ; -1799 DBB2 CD 27 E6 DOREAD: CALL READ -1800 DBB5 C3 BB DB JP IORET -1801 DBB8 ; -1802 DBB8 ; Do the actual disk write and handle any bios error. -1803 DBB8 ; -1804 DBB8 CD 2A E6 DOWRITE:CALL WRITE -1805 DBBB B7 IORET: OR A -1806 DBBC C8 RET Z ;return unless an error occured. -1807 DBBD 21 09 D8 LD HL,BADSCTR ;bad read/write on this sector. -1808 DBC0 C3 4A DB JP JUMPHL -1809 DBC3 ; -1810 DBC3 ; Routine to select the track and sector that the desired -1811 DBC3 ; block number falls in. -1812 DBC3 ; -1813 DBC3 2A EA E5 TRKSEC: LD HL,(FILEPOS) ;get position of last accessed file -1814 DBC6 0E 02 LD C,2 ;in directory and compute sector #. -1815 DBC8 CD EA DC CALL SHIFTR ;sector #=file-position/4. -1816 DBCB 22 E5 E5 LD (BLKNMBR),HL ;save this as the block number of interest. -1817 DBCE 22 EC E5 LD (CKSUMTBL),HL ;what's it doing here too? -1818 DBD1 ; -1819 DBD1 ; if the sector number has already been set (BLKNMBR), enter -1820 DBD1 ; at this point. -1821 DBD1 ; -1822 DBD1 21 E5 E5 TRKSEC1:LD HL,BLKNMBR -1823 DBD4 4E LD C,(HL) ;move sector number into (BC). -1824 DBD5 23 INC HL -1825 DBD6 46 LD B,(HL) -1826 DBD7 2A B7 E5 LD HL,(SCRATCH3) ;get current sector number and -1827 DBDA 5E LD E,(HL) ;move this into (DE). -1828 DBDB 23 INC HL -1829 DBDC 56 LD D,(HL) -1830 DBDD 2A B5 E5 LD HL,(SCRATCH2) ;get current track number. -1831 DBE0 7E LD A,(HL) ;and this into (HL). -1832 DBE1 23 INC HL -1833 DBE2 66 LD H,(HL) -1834 DBE3 6F LD L,A -1835 DBE4 79 TRKSEC2:LD A,C ;is desired sector before current one? -1836 DBE5 93 SUB E -1837 DBE6 78 LD A,B -1838 DBE7 9A SBC A,D -1839 DBE8 D2 FA DB JP NC,TRKSEC3 -1840 DBEB E5 PUSH HL ;yes, decrement sectors by one track. -1841 DBEC 2A C1 E5 LD HL,(SECTORS) ;get sectors per track. -1842 DBEF 7B LD A,E -1843 DBF0 95 SUB L -1844 DBF1 5F LD E,A -1845 DBF2 7A LD A,D -1846 DBF3 9C SBC A,H -1847 DBF4 57 LD D,A ;now we have backed up one full track. -1848 DBF5 E1 POP HL -1849 DBF6 2B DEC HL ;adjust track counter. -1850 DBF7 C3 E4 DB JP TRKSEC2 -1851 DBFA E5 TRKSEC3:PUSH HL ;desired sector is after current one. -1852 DBFB 2A C1 E5 LD HL,(SECTORS) ;get sectors per track. -1853 DBFE 19 ADD HL,DE ;bump sector pointer to next track. -1854 DBFF DA 0F DC JP C,TRKSEC4 -1855 DC02 79 LD A,C ;is desired sector now before current one? -1856 DC03 95 SUB L -1857 DC04 78 LD A,B -1858 DC05 9C SBC A,H -1859 DC06 DA 0F DC JP C,TRKSEC4 -1860 DC09 EB EX DE,HL ;not yes, increment track counter -1861 DC0A E1 POP HL ;and continue until it is. -1862 DC0B 23 INC HL -1863 DC0C C3 FA DB JP TRKSEC3 -1864 DC0F ; -1865 DC0F ; here we have determined the track number that contains the -1866 DC0F ; desired sector. -1867 DC0F ; -1868 DC0F E1 TRKSEC4:POP HL ;get track number (HL). -1869 DC10 C5 PUSH BC -1870 DC11 D5 PUSH DE -1871 DC12 E5 PUSH HL -1872 DC13 EB EX DE,HL -1873 DC14 2A CE E5 LD HL,(OFFSET) ;adjust for first track offset. -1874 DC17 19 ADD HL,DE -1875 DC18 44 LD B,H -1876 DC19 4D LD C,L -1877 DC1A CD 1E E6 CALL SETTRK ;select this track. -1878 DC1D D1 POP DE ;reset current track pointer. -1879 DC1E 2A B5 E5 LD HL,(SCRATCH2) -1880 DC21 73 LD (HL),E -1881 DC22 23 INC HL -1882 DC23 72 LD (HL),D -1883 DC24 D1 POP DE -1884 DC25 2A B7 E5 LD HL,(SCRATCH3) ;reset the first sector on this track. -1885 DC28 73 LD (HL),E -1886 DC29 23 INC HL -1887 DC2A 72 LD (HL),D -1888 DC2B C1 POP BC -1889 DC2C 79 LD A,C ;now subtract the desired one. -1890 DC2D 93 SUB E ;to make it relative (1-# sectors/track). -1891 DC2E 4F LD C,A -1892 DC2F 78 LD A,B -1893 DC30 9A SBC A,D -1894 DC31 47 LD B,A -1895 DC32 2A D0 E5 LD HL,(XLATE) ;translate this sector according to this table. -1896 DC35 EB EX DE,HL -1897 DC36 CD 30 E6 CALL SECTRN ;let the bios translate it. -1898 DC39 4D LD C,L -1899 DC3A 44 LD B,H -1900 DC3B C3 21 E6 JP SETSEC ;and select it. -1901 DC3E ; -1902 DC3E ; Compute block number from record number (SAVNREC) and -1903 DC3E ; extent number (SAVEXT). -1904 DC3E ; -1905 DC3E 21 C3 E5 GETBLOCK: LD HL,BLKSHFT ;get logical to physical conversion. -1906 DC41 4E LD C,(HL) ;note that this is base 2 log of ratio. -1907 DC42 3A E3 E5 LD A,(SAVNREC) ;get record number. -1908 DC45 B7 GETBLK1:OR A ;compute (A)=(A)/2^BLKSHFT. -1909 DC46 1F RRA -1910 DC47 0D DEC C -1911 DC48 C2 45 DC JP NZ,GETBLK1 -1912 DC4B 47 LD B,A ;save result in (B). -1913 DC4C 3E 08 LD A,8 -1914 DC4E 96 SUB (HL) -1915 DC4F 4F LD C,A ;compute (C)=8-BLKSHFT. -1916 DC50 3A E2 E5 LD A,(SAVEXT) -1917 DC53 0D GETBLK2:DEC C ;compute (A)=SAVEXT*2^(8-BLKSHFT). -1918 DC54 CA 5C DC JP Z,GETBLK3 -1919 DC57 B7 OR A -1920 DC58 17 RLA -1921 DC59 C3 53 DC JP GETBLK2 -1922 DC5C 80 GETBLK3:ADD A,B -1923 DC5D C9 RET -1924 DC5E ; -1925 DC5E ; Routine to extract the (BC) block byte from the fcb pointed -1926 DC5E ; to by (PARAMS). If this is a big-disk, then these are 16 bit -1927 DC5E ; block numbers, else they are 8 bit numbers. -1928 DC5E ; Number is returned in (HL). -1929 DC5E ; -1930 DC5E 2A 43 DB EXTBLK: LD HL,(PARAMS) ;get fcb address. -1931 DC61 11 10 00 LD DE,16 ;block numbers start 16 bytes into fcb. -1932 DC64 19 ADD HL,DE -1933 DC65 09 ADD HL,BC -1934 DC66 3A DD E5 LD A,(BIGDISK) ;are we using a big-disk? -1935 DC69 B7 OR A -1936 DC6A CA 71 DC JP Z,EXTBLK1 -1937 DC6D 6E LD L,(HL) ;no, extract an 8 bit number from the fcb. -1938 DC6E 26 00 LD H,0 -1939 DC70 C9 RET -1940 DC71 09 EXTBLK1:ADD HL,BC ;yes, extract a 16 bit number. -1941 DC72 5E LD E,(HL) -1942 DC73 23 INC HL -1943 DC74 56 LD D,(HL) -1944 DC75 EB EX DE,HL ;return in (HL). -1945 DC76 C9 RET -1946 DC77 ; -1947 DC77 ; Compute block number. -1948 DC77 ; -1949 DC77 CD 3E DC COMBLK: CALL GETBLOCK -1950 DC7A 4F LD C,A -1951 DC7B 06 00 LD B,0 -1952 DC7D CD 5E DC CALL EXTBLK -1953 DC80 22 E5 E5 LD (BLKNMBR),HL -1954 DC83 C9 RET -1955 DC84 ; -1956 DC84 ; Check for a zero block number (unused). -1957 DC84 ; -1958 DC84 2A E5 E5 CHKBLK: LD HL,(BLKNMBR) -1959 DC87 7D LD A,L ;is it zero? -1960 DC88 B4 OR H -1961 DC89 C9 RET -1962 DC8A ; -1963 DC8A ; Adjust physical block (BLKNMBR) and convert to logical -1964 DC8A ; sector (LOGSECT). This is the starting sector of this block. -1965 DC8A ; The actual sector of interest is then added to this and the -1966 DC8A ; resulting sector number is stored back in (BLKNMBR). This -1967 DC8A ; will still have to be adjusted for the track number. -1968 DC8A ; -1969 DC8A 3A C3 E5 LOGICAL:LD A,(BLKSHFT) ;get log2(physical/logical sectors). -1970 DC8D 2A E5 E5 LD HL,(BLKNMBR) ;get physical sector desired. -1971 DC90 29 LOGICL1:ADD HL,HL ;compute logical sector number. -1972 DC91 3D DEC A ;note logical sectors are 128 bytes long. -1973 DC92 C2 90 DC JP NZ,LOGICL1 -1974 DC95 22 E7 E5 LD (LOGSECT),HL ;save logical sector. -1975 DC98 3A C4 E5 LD A,(BLKMASK) ;get block mask. -1976 DC9B 4F LD C,A -1977 DC9C 3A E3 E5 LD A,(SAVNREC) ;get next sector to access. -1978 DC9F A1 AND C ;extract the relative position within physical block. -1979 DCA0 B5 OR L ;and add it too logical sector. -1980 DCA1 6F LD L,A -1981 DCA2 22 E5 E5 LD (BLKNMBR),HL ;and store. -1982 DCA5 C9 RET -1983 DCA6 ; -1984 DCA6 ; Set (HL) to point to extent byte in fcb. -1985 DCA6 ; -1986 DCA6 2A 43 DB SETEXT: LD HL,(PARAMS) -1987 DCA9 11 0C 00 LD DE,12 ;it is the twelth byte. -1988 DCAC 19 ADD HL,DE -1989 DCAD C9 RET -1990 DCAE ; -1991 DCAE ; Set (HL) to point to record count byte in fcb and (DE) to -1992 DCAE ; next record number byte. -1993 DCAE ; -1994 DCAE 2A 43 DB SETHLDE:LD HL,(PARAMS) -1995 DCB1 11 0F 00 LD DE,15 ;record count byte (#15). -1996 DCB4 19 ADD HL,DE -1997 DCB5 EB EX DE,HL -1998 DCB6 21 11 00 LD HL,17 ;next record number (#32). -1999 DCB9 19 ADD HL,DE -2000 DCBA C9 RET -2001 DCBB ; -2002 DCBB ; Save current file data from fcb. -2003 DCBB ; -2004 DCBB CD AE DC STRDATA:CALL SETHLDE -2005 DCBE 7E LD A,(HL) ;get and store record count byte. -2006 DCBF 32 E3 E5 LD (SAVNREC),A -2007 DCC2 EB EX DE,HL -2008 DCC3 7E LD A,(HL) ;get and store next record number byte. -2009 DCC4 32 E1 E5 LD (SAVNXT),A -2010 DCC7 CD A6 DC CALL SETEXT ;point to extent byte. -2011 DCCA 3A C5 E5 LD A,(EXTMASK) ;get extent mask. -2012 DCCD A6 AND (HL) -2013 DCCE 32 E2 E5 LD (SAVEXT),A ;and save extent here. -2014 DCD1 C9 RET -2015 DCD2 ; -2016 DCD2 ; Set the next record to access. If (MODE) is set to 2, then -2017 DCD2 ; the last record byte (SAVNREC) has the correct number to access. -2018 DCD2 ; For sequential access, (MODE) will be equal to 1. -2019 DCD2 ; -2020 DCD2 CD AE DC SETNREC:CALL SETHLDE -2021 DCD5 3A D5 E5 LD A,(MODE) ;get sequential flag (=1). -2022 DCD8 FE 02 CP 2 ;a 2 indicates that no adder is needed. -2023 DCDA C2 DE DC JP NZ,STNREC1 -2024 DCDD AF XOR A ;clear adder (random access?). -2025 DCDE 4F STNREC1:LD C,A -2026 DCDF 3A E3 E5 LD A,(SAVNREC) ;get last record number. -2027 DCE2 81 ADD A,C ;increment record count. -2028 DCE3 77 LD (HL),A ;and set fcb's next record byte. -2029 DCE4 EB EX DE,HL -2030 DCE5 3A E1 E5 LD A,(SAVNXT) ;get next record byte from storage. -2031 DCE8 77 LD (HL),A ;and put this into fcb as number of records used. -2032 DCE9 C9 RET -2033 DCEA ; -2034 DCEA ; Shift (HL) right (C) bits. -2035 DCEA ; -2036 DCEA 0C SHIFTR: INC C -2037 DCEB 0D SHIFTR1:DEC C -2038 DCEC C8 RET Z -2039 DCED 7C LD A,H -2040 DCEE B7 OR A -2041 DCEF 1F RRA -2042 DCF0 67 LD H,A -2043 DCF1 7D LD A,L -2044 DCF2 1F RRA -2045 DCF3 6F LD L,A -2046 DCF4 C3 EB DC JP SHIFTR1 -2047 DCF7 ; -2048 DCF7 ; Compute the check-sum for the directory buffer. Return -2049 DCF7 ; integer sum in (A). -2050 DCF7 ; -2051 DCF7 0E 80 CHECKSUM: LD C,128 ;length of buffer. -2052 DCF9 2A B9 E5 LD HL,(DIRBUF) ;get its location. -2053 DCFC AF XOR A ;clear summation byte. -2054 DCFD 86 CHKSUM1:ADD A,(HL) ;and compute sum ignoring carries. -2055 DCFE 23 INC HL -2056 DCFF 0D DEC C -2057 DD00 C2 FD DC JP NZ,CHKSUM1 -2058 DD03 C9 RET -2059 DD04 ; -2060 DD04 ; Shift (HL) left (C) bits. -2061 DD04 ; -2062 DD04 0C SHIFTL: INC C -2063 DD05 0D SHIFTL1:DEC C -2064 DD06 C8 RET Z -2065 DD07 29 ADD HL,HL ;shift left 1 bit. -2066 DD08 C3 05 DD JP SHIFTL1 -2067 DD0B ; -2068 DD0B ; Routine to set a bit in a 16 bit value contained in (BC). -2069 DD0B ; The bit set depends on the current drive selection. -2070 DD0B ; -2071 DD0B C5 SETBIT: PUSH BC ;save 16 bit word. -2072 DD0C 3A 42 DB LD A,(ACTIVE) ;get active drive. -2073 DD0F 4F LD C,A -2074 DD10 21 01 00 LD HL,1 -2075 DD13 CD 04 DD CALL SHIFTL ;shift bit 0 into place. -2076 DD16 C1 POP BC ;now 'or' this with the original word. -2077 DD17 79 LD A,C -2078 DD18 B5 OR L -2079 DD19 6F LD L,A ;low byte done, do high byte. -2080 DD1A 78 LD A,B -2081 DD1B B4 OR H -2082 DD1C 67 LD H,A -2083 DD1D C9 RET -2084 DD1E ; -2085 DD1E ; Extract the write protect status bit for the current drive. -2086 DD1E ; The result is returned in (A), bit 0. -2087 DD1E ; -2088 DD1E 2A AD E5 GETWPRT:LD HL,(WRTPRT) ;get status bytes. -2089 DD21 3A 42 DB LD A,(ACTIVE) ;which drive is current? -2090 DD24 4F LD C,A -2091 DD25 CD EA DC CALL SHIFTR ;shift status such that bit 0 is the -2092 DD28 7D LD A,L ;one of interest for this drive. -2093 DD29 E6 01 AND 01H ;and isolate it. -2094 DD2B C9 RET -2095 DD2C ; -2096 DD2C ; Function to write protect the current disk. -2097 DD2C ; -2098 DD2C 21 AD E5 WRTPRTD:LD HL,WRTPRT ;point to status word. -2099 DD2F 4E LD C,(HL) ;set (BC) equal to the status. -2100 DD30 23 INC HL -2101 DD31 46 LD B,(HL) -2102 DD32 CD 0B DD CALL SETBIT ;and set this bit according to current drive. -2103 DD35 22 AD E5 LD (WRTPRT),HL ;then save. -2104 DD38 2A C8 E5 LD HL,(DIRSIZE) ;now save directory size limit. -2105 DD3B 23 INC HL ;remember the last one. -2106 DD3C EB EX DE,HL -2107 DD3D 2A B3 E5 LD HL,(SCRATCH1) ;and store it here. -2108 DD40 73 LD (HL),E ;put low byte. -2109 DD41 23 INC HL -2110 DD42 72 LD (HL),D ;then high byte. -2111 DD43 C9 RET -2112 DD44 ; -2113 DD44 ; Check for a read only file. -2114 DD44 ; -2115 DD44 CD 5E DD CHKROFL:CALL FCB2HL ;set (HL) to file entry in directory buffer. -2116 DD47 11 09 00 CKROF1: LD DE,9 ;look at bit 7 of the ninth byte. -2117 DD4A 19 ADD HL,DE -2118 DD4B 7E LD A,(HL) -2119 DD4C 17 RLA -2120 DD4D D0 RET NC ;return if ok. -2121 DD4E 21 0F D8 LD HL,ROFILE ;else, print error message and terminate. -2122 DD51 C3 4A DB JP JUMPHL -2123 DD54 ; -2124 DD54 ; Check the write protect status of the active disk. -2125 DD54 ; -2126 DD54 CD 1E DD CHKWPRT:CALL GETWPRT -2127 DD57 C8 RET Z ;return if ok. -2128 DD58 21 0D D8 LD HL,RODISK ;else print message and terminate. -2129 DD5B C3 4A DB JP JUMPHL -2130 DD5E ; -2131 DD5E ; Routine to set (HL) pointing to the proper entry in the -2132 DD5E ; directory buffer. -2133 DD5E ; -2134 DD5E 2A B9 E5 FCB2HL: LD HL,(DIRBUF) ;get address of buffer. -2135 DD61 3A E9 E5 LD A,(FCBPOS) ;relative position of file. -2136 DD64 ; -2137 DD64 ; Routine to add (A) to (HL). -2138 DD64 ; -2139 DD64 85 ADDA2HL:ADD A,L -2140 DD65 6F LD L,A -2141 DD66 D0 RET NC -2142 DD67 24 INC H ;take care of any carry. -2143 DD68 C9 RET -2144 DD69 ; -2145 DD69 ; Routine to get the 's2' byte from the fcb supplied in -2146 DD69 ; the initial parameter specification. -2147 DD69 ; -2148 DD69 2A 43 DB GETS2: LD HL,(PARAMS) ;get address of fcb. -2149 DD6C 11 0E 00 LD DE,14 ;relative position of 's2'. -2150 DD6F 19 ADD HL,DE -2151 DD70 7E LD A,(HL) ;extract this byte. -2152 DD71 C9 RET -2153 DD72 ; -2154 DD72 ; Clear the 's2' byte in the fcb. -2155 DD72 ; -2156 DD72 CD 69 DD CLEARS2:CALL GETS2 ;this sets (HL) pointing to it. -2157 DD75 36 00 LD (HL),0 ;now clear it. -2158 DD77 C9 RET -2159 DD78 ; -2160 DD78 ; Set bit 7 in the 's2' byte of the fcb. -2161 DD78 ; -2162 DD78 CD 69 DD SETS2B7:CALL GETS2 ;get the byte. -2163 DD7B F6 80 OR 80H ;and set bit 7. -2164 DD7D 77 LD (HL),A ;then store. -2165 DD7E C9 RET -2166 DD7F ; -2167 DD7F ; Compare (FILEPOS) with (SCRATCH1) and set flags based on -2168 DD7F ; the difference. This checks to see if there are more file -2169 DD7F ; names in the directory. We are at (FILEPOS) and there are -2170 DD7F ; (SCRATCH1) of them to check. -2171 DD7F ; -2172 DD7F 2A EA E5 MOREFLS:LD HL,(FILEPOS) ;we are here. -2173 DD82 EB EX DE,HL -2174 DD83 2A B3 E5 LD HL,(SCRATCH1) ;and don't go past here. -2175 DD86 7B LD A,E ;compute difference but don't keep. -2176 DD87 96 SUB (HL) -2177 DD88 23 INC HL -2178 DD89 7A LD A,D -2179 DD8A 9E SBC A,(HL) ;set carry if no more names. -2180 DD8B C9 RET -2181 DD8C ; -2182 DD8C ; Call this routine to prevent (SCRATCH1) from being greater -2183 DD8C ; than (FILEPOS). -2184 DD8C ; -2185 DD8C CD 7F DD CHKNMBR:CALL MOREFLS ;SCRATCH1 too big? -2186 DD8F D8 RET C -2187 DD90 13 INC DE ;yes, reset it to (FILEPOS). -2188 DD91 72 LD (HL),D -2189 DD92 2B DEC HL -2190 DD93 73 LD (HL),E -2191 DD94 C9 RET -2192 DD95 ; -2193 DD95 ; Compute (HL)=(DE)-(HL) -2194 DD95 ; -2195 DD95 7B SUBHL: LD A,E ;compute difference. -2196 DD96 95 SUB L -2197 DD97 6F LD L,A ;store low byte. -2198 DD98 7A LD A,D -2199 DD99 9C SBC A,H -2200 DD9A 67 LD H,A ;and then high byte. -2201 DD9B C9 RET -2202 DD9C ; -2203 DD9C ; Set the directory checksum byte. -2204 DD9C ; -2205 DD9C 0E FF SETDIR: LD C,0FFH -2206 DD9E ; -2207 DD9E ; Routine to set or compare the directory checksum byte. If -2208 DD9E ; (C)=0ffh, then this will set the checksum byte. Else the byte -2209 DD9E ; will be checked. If the check fails (the disk has been changed), -2210 DD9E ; then this disk will be write protected. -2211 DD9E ; -2212 DD9E 2A EC E5 CHECKDIR: LD HL,(CKSUMTBL) -2213 DDA1 EB EX DE,HL -2214 DDA2 2A CC E5 LD HL,(ALLOC1) -2215 DDA5 CD 95 DD CALL SUBHL -2216 DDA8 D0 RET NC ;ok if (CKSUMTBL) > (ALLOC1), so return. -2217 DDA9 C5 PUSH BC -2218 DDAA CD F7 DC CALL CHECKSUM ;else compute checksum. -2219 DDAD 2A BD E5 LD HL,(CHKVECT) ;get address of checksum table. -2220 DDB0 EB EX DE,HL -2221 DDB1 2A EC E5 LD HL,(CKSUMTBL) -2222 DDB4 19 ADD HL,DE ;set (HL) to point to byte for this drive. -2223 DDB5 C1 POP BC -2224 DDB6 0C INC C ;set or check ? -2225 DDB7 CA C4 DD JP Z,CHKDIR1 -2226 DDBA BE CP (HL) ;check them. -2227 DDBB C8 RET Z ;return if they are the same. -2228 DDBC CD 7F DD CALL MOREFLS ;not the same, do we care? -2229 DDBF D0 RET NC -2230 DDC0 CD 2C DD CALL WRTPRTD ;yes, mark this as write protected. -2231 DDC3 C9 RET -2232 DDC4 77 CHKDIR1:LD (HL),A ;just set the byte. -2233 DDC5 C9 RET -2234 DDC6 ; -2235 DDC6 ; Do a write to the directory of the current disk. -2236 DDC6 ; -2237 DDC6 CD 9C DD DIRWRITE: CALL SETDIR ;set checksum byte. -2238 DDC9 CD E0 DD CALL DIRDMA ;set directory dma address. -2239 DDCC 0E 01 LD C,1 ;tell the bios to actually write. -2240 DDCE CD B8 DB CALL DOWRITE ;then do the write. -2241 DDD1 C3 DA DD JP DEFDMA -2242 DDD4 ; -2243 DDD4 ; Read from the directory. -2244 DDD4 ; -2245 DDD4 CD E0 DD DIRREAD:CALL DIRDMA ;set the directory dma address. -2246 DDD7 CD B2 DB CALL DOREAD ;and read it. -2247 DDDA ; -2248 DDDA ; Routine to set the dma address to the users choice. -2249 DDDA ; -2250 DDDA 21 B1 E5 DEFDMA: LD HL,USERDMA ;reset the default dma address and return. -2251 DDDD C3 E3 DD JP DIRDMA1 -2252 DDE0 ; -2253 DDE0 ; Routine to set the dma address for directory work. -2254 DDE0 ; -2255 DDE0 21 B9 E5 DIRDMA: LD HL,DIRBUF -2256 DDE3 ; -2257 DDE3 ; Set the dma address. On entry, (HL) points to -2258 DDE3 ; word containing the desired dma address. -2259 DDE3 ; -2260 DDE3 4E DIRDMA1:LD C,(HL) -2261 DDE4 23 INC HL -2262 DDE5 46 LD B,(HL) ;setup (BC) and go to the bios to set it. -2263 DDE6 C3 24 E6 JP SETDMA -2264 DDE9 ; -2265 DDE9 ; Move the directory buffer into user's dma space. -2266 DDE9 ; -2267 DDE9 2A B9 E5 MOVEDIR:LD HL,(DIRBUF) ;buffer is located here, and -2268 DDEC EB EX DE,HL -2269 DDED 2A B1 E5 LD HL,(USERDMA) ; put it here. -2270 DDF0 0E 80 LD C,128 ;this is its length. -2271 DDF2 C3 4F DB JP DE2HL ;move it now and return. -2272 DDF5 ; -2273 DDF5 ; Check (FILEPOS) and set the zero flag if it equals 0ffffh. -2274 DDF5 ; -2275 DDF5 21 EA E5 CKFILPOS: LD HL,FILEPOS -2276 DDF8 7E LD A,(HL) -2277 DDF9 23 INC HL -2278 DDFA BE CP (HL) ;are both bytes the same? -2279 DDFB C0 RET NZ -2280 DDFC 3C INC A ;yes, but are they each 0ffh? -2281 DDFD C9 RET -2282 DDFE ; -2283 DDFE ; Set location (FILEPOS) to 0ffffh. -2284 DDFE ; -2285 DDFE 21 FF FF STFILPOS: LD HL,0FFFFH -2286 DE01 22 EA E5 LD (FILEPOS),HL -2287 DE04 C9 RET -2288 DE05 ; -2289 DE05 ; Move on to the next file position within the current -2290 DE05 ; directory buffer. If no more exist, set pointer to 0ffffh -2291 DE05 ; and the calling routine will check for this. Enter with (C) -2292 DE05 ; equal to 0ffh to cause the checksum byte to be set, else we -2293 DE05 ; will check this disk and set write protect if checksums are -2294 DE05 ; not the same (applies only if another directory sector must -2295 DE05 ; be read). -2296 DE05 ; -2297 DE05 2A C8 E5 NXENTRY:LD HL,(DIRSIZE) ;get directory entry size limit. -2298 DE08 EB EX DE,HL -2299 DE09 2A EA E5 LD HL,(FILEPOS) ;get current count. -2300 DE0C 23 INC HL ;go on to the next one. -2301 DE0D 22 EA E5 LD (FILEPOS),HL -2302 DE10 CD 95 DD CALL SUBHL ;(HL)=(DIRSIZE)-(FILEPOS) -2303 DE13 D2 19 DE JP NC,NXENT1 ;is there more room left? -2304 DE16 C3 FE DD JP STFILPOS ;no. Set this flag and return. -2305 DE19 3A EA E5 NXENT1: LD A,(FILEPOS) ;get file position within directory. -2306 DE1C E6 03 AND 03H ;only look within this sector (only 4 entries fit). -2307 DE1E 06 05 LD B,5 ;convert to relative position (32 bytes each). -2308 DE20 87 NXENT2: ADD A,A ;note that this is not efficient code. -2309 DE21 05 DEC B ;5 'ADD A's would be better. -2310 DE22 C2 20 DE JP NZ,NXENT2 -2311 DE25 32 E9 E5 LD (FCBPOS),A ;save it as position of fcb. -2312 DE28 B7 OR A -2313 DE29 C0 RET NZ ;return if we are within buffer. -2314 DE2A C5 PUSH BC -2315 DE2B CD C3 DB CALL TRKSEC ;we need the next directory sector. -2316 DE2E CD D4 DD CALL DIRREAD -2317 DE31 C1 POP BC -2318 DE32 C3 9E DD JP CHECKDIR -2319 DE35 ; -2320 DE35 ; Routine to to get a bit from the disk space allocation -2321 DE35 ; map. It is returned in (A), bit position 0. On entry to here, -2322 DE35 ; set (BC) to the block number on the disk to check. -2323 DE35 ; On return, (D) will contain the original bit position for -2324 DE35 ; this block number and (HL) will point to the address for it. -2325 DE35 ; -2326 DE35 79 CKBITMAP: LD A,C ;determine bit number of interest. -2327 DE36 E6 07 AND 07H ;compute (D)=(E)=(C and 7)+1. -2328 DE38 3C INC A -2329 DE39 5F LD E,A ;save particular bit number. -2330 DE3A 57 LD D,A -2331 DE3B ; -2332 DE3B ; compute (BC)=(BC)/8. -2333 DE3B ; -2334 DE3B 79 LD A,C -2335 DE3C 0F RRCA ;now shift right 3 bits. -2336 DE3D 0F RRCA -2337 DE3E 0F RRCA -2338 DE3F E6 1F AND 1FH ;and clear bits 7,6,5. -2339 DE41 4F LD C,A -2340 DE42 78 LD A,B -2341 DE43 87 ADD A,A ;now shift (B) into bits 7,6,5. -2342 DE44 87 ADD A,A -2343 DE45 87 ADD A,A -2344 DE46 87 ADD A,A -2345 DE47 87 ADD A,A -2346 DE48 B1 OR C ;and add in (C). -2347 DE49 4F LD C,A ;ok, (C) ha been completed. -2348 DE4A 78 LD A,B ;is there a better way of doing this? -2349 DE4B 0F RRCA -2350 DE4C 0F RRCA -2351 DE4D 0F RRCA -2352 DE4E E6 1F AND 1FH -2353 DE50 47 LD B,A ;and now (B) is completed. -2354 DE51 ; -2355 DE51 ; use this as an offset into the disk space allocation -2356 DE51 ; table. -2357 DE51 ; -2358 DE51 2A BF E5 LD HL,(ALOCVECT) -2359 DE54 09 ADD HL,BC -2360 DE55 7E LD A,(HL) ;now get correct byte. -2361 DE56 07 CKBMAP1:RLCA ;get correct bit into position 0. -2362 DE57 1D DEC E -2363 DE58 C2 56 DE JP NZ,CKBMAP1 -2364 DE5B C9 RET -2365 DE5C ; -2366 DE5C ; Set or clear the bit map such that block number (BC) will be marked -2367 DE5C ; as used. On entry, if (E)=0 then this bit will be cleared, if it equals -2368 DE5C ; 1 then it will be set (don't use anyother values). -2369 DE5C ; -2370 DE5C D5 STBITMAP: PUSH DE -2371 DE5D CD 35 DE CALL CKBITMAP ;get the byte of interest. -2372 DE60 E6 FE AND 0FEH ;clear the affected bit. -2373 DE62 C1 POP BC -2374 DE63 B1 OR C ;and now set it acording to (C). -2375 DE64 ; -2376 DE64 ; entry to restore the original bit position and then store -2377 DE64 ; in table. (A) contains the value, (D) contains the bit -2378 DE64 ; position (1-8), and (HL) points to the address within the -2379 DE64 ; space allocation table for this byte. -2380 DE64 ; -2381 DE64 0F STBMAP1:RRCA ;restore original bit position. -2382 DE65 15 DEC D -2383 DE66 C2 64 DE JP NZ,STBMAP1 -2384 DE69 77 LD (HL),A ;and stor byte in table. -2385 DE6A C9 RET -2386 DE6B ; -2387 DE6B ; Set/clear space used bits in allocation map for this file. -2388 DE6B ; On entry, (C)=1 to set the map and (C)=0 to clear it. -2389 DE6B ; -2390 DE6B CD 5E DD SETFILE:CALL FCB2HL ;get address of fcb -2391 DE6E 11 10 00 LD DE,16 -2392 DE71 19 ADD HL,DE ;get to block number bytes. -2393 DE72 C5 PUSH BC -2394 DE73 0E 11 LD C,17 ;check all 17 bytes (max) of table. -2395 DE75 D1 SETFL1: POP DE -2396 DE76 0D DEC C ;done all bytes yet? -2397 DE77 C8 RET Z -2398 DE78 D5 PUSH DE -2399 DE79 3A DD E5 LD A,(BIGDISK) ;check disk size for 16 bit block numbers. -2400 DE7C B7 OR A -2401 DE7D CA 88 DE JP Z,SETFL2 -2402 DE80 C5 PUSH BC ;only 8 bit numbers. set (BC) to this one. -2403 DE81 E5 PUSH HL -2404 DE82 4E LD C,(HL) ;get low byte from table, always -2405 DE83 06 00 LD B,0 ;set high byte to zero. -2406 DE85 C3 8E DE JP SETFL3 -2407 DE88 0D SETFL2: DEC C ;for 16 bit block numbers, adjust counter. -2408 DE89 C5 PUSH BC -2409 DE8A 4E LD C,(HL) ;now get both the low and high bytes. -2410 DE8B 23 INC HL -2411 DE8C 46 LD B,(HL) -2412 DE8D E5 PUSH HL -2413 DE8E 79 SETFL3: LD A,C ;block used? -2414 DE8F B0 OR B -2415 DE90 CA 9D DE JP Z,SETFL4 -2416 DE93 2A C6 E5 LD HL,(DSKSIZE) ;is this block number within the -2417 DE96 7D LD A,L ;space on the disk? -2418 DE97 91 SUB C -2419 DE98 7C LD A,H -2420 DE99 98 SBC A,B -2421 DE9A D4 5C DE CALL NC,STBITMAP ;yes, set the proper bit. -2422 DE9D E1 SETFL4: POP HL ;point to next block number in fcb. -2423 DE9E 23 INC HL -2424 DE9F C1 POP BC -2425 DEA0 C3 75 DE JP SETFL1 -2426 DEA3 ; -2427 DEA3 ; Construct the space used allocation bit map for the active -2428 DEA3 ; drive. If a file name starts with '$' and it is under the -2429 DEA3 ; current user number, then (STATUS) is set to minus 1. Otherwise -2430 DEA3 ; it is not set at all. -2431 DEA3 ; -2432 DEA3 2A C6 E5 BITMAP: LD HL,(DSKSIZE) ;compute size of allocation table. -2433 DEA6 0E 03 LD C,3 -2434 DEA8 CD EA DC CALL SHIFTR ;(HL)=(HL)/8. -2435 DEAB 23 INC HL ;at lease 1 byte. -2436 DEAC 44 LD B,H -2437 DEAD 4D LD C,L ;set (BC) to the allocation table length. -2438 DEAE ; -2439 DEAE ; Initialize the bitmap for this drive. Right now, the first -2440 DEAE ; two bytes are specified by the disk parameter block. However -2441 DEAE ; a patch could be entered here if it were necessary to setup -2442 DEAE ; this table in a special mannor. For example, the bios could -2443 DEAE ; determine locations of 'bad blocks' and set them as already -2444 DEAE ; 'used' in the map. -2445 DEAE ; -2446 DEAE 2A BF E5 LD HL,(ALOCVECT) ;now zero out the table now. -2447 DEB1 36 00 BITMAP1:LD (HL),0 -2448 DEB3 23 INC HL -2449 DEB4 0B DEC BC -2450 DEB5 78 LD A,B -2451 DEB6 B1 OR C -2452 DEB7 C2 B1 DE JP NZ,BITMAP1 -2453 DEBA 2A CA E5 LD HL,(ALLOC0) ;get initial space used by directory. -2454 DEBD EB EX DE,HL -2455 DEBE 2A BF E5 LD HL,(ALOCVECT) ;and put this into map. -2456 DEC1 73 LD (HL),E -2457 DEC2 23 INC HL -2458 DEC3 72 LD (HL),D -2459 DEC4 ; -2460 DEC4 ; End of initialization portion. -2461 DEC4 ; -2462 DEC4 CD A1 DB CALL HOMEDRV ;now home the drive. -2463 DEC7 2A B3 E5 LD HL,(SCRATCH1) -2464 DECA 36 03 LD (HL),3 ;force next directory request to read -2465 DECC 23 INC HL ;in a sector. -2466 DECD 36 00 LD (HL),0 -2467 DECF CD FE DD CALL STFILPOS ;clear initial file position also. -2468 DED2 0E FF BITMAP2:LD C,0FFH ;read next file name in directory -2469 DED4 CD 05 DE CALL NXENTRY ;and set checksum byte. -2470 DED7 CD F5 DD CALL CKFILPOS ;is there another file? -2471 DEDA C8 RET Z -2472 DEDB CD 5E DD CALL FCB2HL ;yes, get its address. -2473 DEDE 3E E5 LD A,0E5H -2474 DEE0 BE CP (HL) ;empty file entry? -2475 DEE1 CA D2 DE JP Z,BITMAP2 -2476 DEE4 3A 41 DB LD A,(USERNO) ;no, correct user number? -2477 DEE7 BE CP (HL) -2478 DEE8 C2 F6 DE JP NZ,BITMAP3 -2479 DEEB 23 INC HL -2480 DEEC 7E LD A,(HL) ;yes, does name start with a '$'? -2481 DEED D6 24 SUB '$' -2482 DEEF C2 F6 DE JP NZ,BITMAP3 -2483 DEF2 3D DEC A ;yes, set atatus to minus one. -2484 DEF3 32 45 DB LD (STATUS),A -2485 DEF6 0E 01 BITMAP3:LD C,1 ;now set this file's space as used in bit map. -2486 DEF8 CD 6B DE CALL SETFILE -2487 DEFB CD 8C DD CALL CHKNMBR ;keep (SCRATCH1) in bounds. -2488 DEFE C3 D2 DE JP BITMAP2 -2489 DF01 ; -2490 DF01 ; Set the status (STATUS) and return. -2491 DF01 ; -2492 DF01 3A D4 E5 STSTATUS: LD A,(FNDSTAT) -2493 DF04 C3 01 DB JP SETSTAT -2494 DF07 ; -2495 DF07 ; Check extents in (A) and (C). Set the zero flag if they -2496 DF07 ; are the same. The number of 16k chunks of disk space that -2497 DF07 ; the directory extent covers is expressad is (EXTMASK+1). -2498 DF07 ; No registers are modified. -2499 DF07 ; -2500 DF07 C5 SAMEXT: PUSH BC -2501 DF08 F5 PUSH AF -2502 DF09 3A C5 E5 LD A,(EXTMASK) ;get extent mask and use it to -2503 DF0C 2F CPL ;to compare both extent numbers. -2504 DF0D 47 LD B,A ;save resulting mask here. -2505 DF0E 79 LD A,C ;mask first extent and save in (C). -2506 DF0F A0 AND B -2507 DF10 4F LD C,A -2508 DF11 F1 POP AF ;now mask second extent and compare -2509 DF12 A0 AND B ;with the first one. -2510 DF13 91 SUB C -2511 DF14 E6 1F AND 1FH ;(* only check buts 0-4 *) -2512 DF16 C1 POP BC ;the zero flag is set if they are the same. -2513 DF17 C9 RET ;restore (BC) and return. -2514 DF18 ; -2515 DF18 ; Search for the first occurence of a file name. On entry, -2516 DF18 ; register (C) should contain the number of bytes of the fcb -2517 DF18 ; that must match. -2518 DF18 ; -2519 DF18 3E FF FINDFST:LD A,0FFH -2520 DF1A 32 D4 E5 LD (FNDSTAT),A -2521 DF1D 21 D8 E5 LD HL,COUNTER ;save character count. -2522 DF20 71 LD (HL),C -2523 DF21 2A 43 DB LD HL,(PARAMS) ;get filename to match. -2524 DF24 22 D9 E5 LD (SAVEFCB),HL ;and save. -2525 DF27 CD FE DD CALL STFILPOS ;clear initial file position (set to 0ffffh). -2526 DF2A CD A1 DB CALL HOMEDRV ;home the drive. -2527 DF2D ; -2528 DF2D ; Entry to locate the next occurence of a filename within the -2529 DF2D ; directory. The disk is not expected to have been changed. If -2530 DF2D ; it was, then it will be write protected. -2531 DF2D ; -2532 DF2D 0E 00 FINDNXT:LD C,0 ;write protect the disk if changed. -2533 DF2F CD 05 DE CALL NXENTRY ;get next filename entry in directory. -2534 DF32 CD F5 DD CALL CKFILPOS ;is file position = 0ffffh? -2535 DF35 CA 94 DF JP Z,FNDNXT6 ;yes, exit now then. -2536 DF38 2A D9 E5 LD HL,(SAVEFCB) ;set (DE) pointing to filename to match. -2537 DF3B EB EX DE,HL -2538 DF3C 1A LD A,(DE) -2539 DF3D FE E5 CP 0E5H ;empty directory entry? -2540 DF3F CA 4A DF JP Z,FNDNXT1 ;(* are we trying to reserect erased entries? *) -2541 DF42 D5 PUSH DE -2542 DF43 CD 7F DD CALL MOREFLS ;more files in directory? -2543 DF46 D1 POP DE -2544 DF47 D2 94 DF JP NC,FNDNXT6 ;no more. Exit now. -2545 DF4A CD 5E DD FNDNXT1:CALL FCB2HL ;get address of this fcb in directory. -2546 DF4D 3A D8 E5 LD A,(COUNTER) ;get number of bytes (characters) to check. -2547 DF50 4F LD C,A -2548 DF51 06 00 LD B,0 ;initialize byte position counter. -2549 DF53 79 FNDNXT2:LD A,C ;are we done with the compare? -2550 DF54 B7 OR A -2551 DF55 CA 83 DF JP Z,FNDNXT5 -2552 DF58 1A LD A,(DE) ;no, check next byte. -2553 DF59 FE 3F CP '?' ;don't care about this character? -2554 DF5B CA 7C DF JP Z,FNDNXT4 -2555 DF5E 78 LD A,B ;get bytes position in fcb. -2556 DF5F FE 0D CP 13 ;don't care about the thirteenth byte either. -2557 DF61 CA 7C DF JP Z,FNDNXT4 -2558 DF64 FE 0C CP 12 ;extent byte? -2559 DF66 1A LD A,(DE) -2560 DF67 CA 73 DF JP Z,FNDNXT3 -2561 DF6A 96 SUB (HL) ;otherwise compare characters. -2562 DF6B E6 7F AND 7FH -2563 DF6D C2 2D DF JP NZ,FINDNXT ;not the same, check next entry. -2564 DF70 C3 7C DF JP FNDNXT4 ;so far so good, keep checking. -2565 DF73 C5 FNDNXT3:PUSH BC ;check the extent byte here. -2566 DF74 4E LD C,(HL) -2567 DF75 CD 07 DF CALL SAMEXT -2568 DF78 C1 POP BC -2569 DF79 C2 2D DF JP NZ,FINDNXT ;not the same, look some more. -2570 DF7C ; -2571 DF7C ; So far the names compare. Bump pointers to the next byte -2572 DF7C ; and continue until all (C) characters have been checked. -2573 DF7C ; -2574 DF7C 13 FNDNXT4:INC DE ;bump pointers. -2575 DF7D 23 INC HL -2576 DF7E 04 INC B -2577 DF7F 0D DEC C ;adjust character counter. -2578 DF80 C3 53 DF JP FNDNXT2 -2579 DF83 3A EA E5 FNDNXT5:LD A,(FILEPOS) ;return the position of this entry. -2580 DF86 E6 03 AND 03H -2581 DF88 32 45 DB LD (STATUS),A -2582 DF8B 21 D4 E5 LD HL,FNDSTAT -2583 DF8E 7E LD A,(HL) -2584 DF8F 17 RLA -2585 DF90 D0 RET NC -2586 DF91 AF XOR A -2587 DF92 77 LD (HL),A -2588 DF93 C9 RET -2589 DF94 ; -2590 DF94 ; Filename was not found. Set appropriate status. -2591 DF94 ; -2592 DF94 CD FE DD FNDNXT6:CALL STFILPOS ;set (FILEPOS) to 0ffffh. -2593 DF97 3E FF LD A,0FFH ;say not located. -2594 DF99 C3 01 DB JP SETSTAT -2595 DF9C ; -2596 DF9C ; Erase files from the directory. Only the first byte of the -2597 DF9C ; fcb will be affected. It is set to (E5). -2598 DF9C ; -2599 DF9C CD 54 DD ERAFILE:CALL CHKWPRT ;is disk write protected? -2600 DF9F 0E 0C LD C,12 ;only compare file names. -2601 DFA1 CD 18 DF CALL FINDFST ;get first file name. -2602 DFA4 CD F5 DD ERAFIL1:CALL CKFILPOS ;any found? -2603 DFA7 C8 RET Z ;nope, we must be done. -2604 DFA8 CD 44 DD CALL CHKROFL ;is file read only? -2605 DFAB CD 5E DD CALL FCB2HL ;nope, get address of fcb and -2606 DFAE 36 E5 LD (HL),0E5H ;set first byte to 'empty'. -2607 DFB0 0E 00 LD C,0 ;clear the space from the bit map. -2608 DFB2 CD 6B DE CALL SETFILE -2609 DFB5 CD C6 DD CALL DIRWRITE ;now write the directory sector back out. -2610 DFB8 CD 2D DF CALL FINDNXT ;find the next file name. -2611 DFBB C3 A4 DF JP ERAFIL1 ;and repeat process. -2612 DFBE ; -2613 DFBE ; Look through the space allocation map (bit map) for the -2614 DFBE ; next available block. Start searching at block number (BC-1). -2615 DFBE ; The search procedure is to look for an empty block that is -2616 DFBE ; before the starting block. If not empty, look at a later -2617 DFBE ; block number. In this way, we return the closest empty block -2618 DFBE ; on either side of the 'target' block number. This will speed -2619 DFBE ; access on random devices. For serial devices, this should be -2620 DFBE ; changed to look in the forward direction first and then start -2621 DFBE ; at the front and search some more. -2622 DFBE ; -2623 DFBE ; On return, (DE)= block number that is empty and (HL) =0 -2624 DFBE ; if no empry block was found. -2625 DFBE ; -2626 DFBE 50 FNDSPACE: LD D,B ;set (DE) as the block that is checked. -2627 DFBF 59 LD E,C -2628 DFC0 ; -2629 DFC0 ; Look before target block. Registers (BC) are used as the lower -2630 DFC0 ; pointer and (DE) as the upper pointer. -2631 DFC0 ; -2632 DFC0 79 FNDSPA1:LD A,C ;is block 0 specified? -2633 DFC1 B0 OR B -2634 DFC2 CA D1 DF JP Z,FNDSPA2 -2635 DFC5 0B DEC BC ;nope, check previous block. -2636 DFC6 D5 PUSH DE -2637 DFC7 C5 PUSH BC -2638 DFC8 CD 35 DE CALL CKBITMAP -2639 DFCB 1F RRA ;is this block empty? -2640 DFCC D2 EC DF JP NC,FNDSPA3 ;yes. use this. -2641 DFCF ; -2642 DFCF ; Note that the above logic gets the first block that it finds -2643 DFCF ; that is empty. Thus a file could be written 'backward' making -2644 DFCF ; it very slow to access. This could be changed to look for the -2645 DFCF ; first empty block and then continue until the start of this -2646 DFCF ; empty space is located and then used that starting block. -2647 DFCF ; This should help speed up access to some files especially on -2648 DFCF ; a well used disk with lots of fairly small 'holes'. -2649 DFCF ; -2650 DFCF C1 POP BC ;nope, check some more. -2651 DFD0 D1 POP DE -2652 DFD1 ; -2653 DFD1 ; Now look after target block. -2654 DFD1 ; -2655 DFD1 2A C6 E5 FNDSPA2:LD HL,(DSKSIZE) ;is block (DE) within disk limits? -2656 DFD4 7B LD A,E -2657 DFD5 95 SUB L -2658 DFD6 7A LD A,D -2659 DFD7 9C SBC A,H -2660 DFD8 D2 F4 DF JP NC,FNDSPA4 -2661 DFDB 13 INC DE ;yes, move on to next one. -2662 DFDC C5 PUSH BC -2663 DFDD D5 PUSH DE -2664 DFDE 42 LD B,D -2665 DFDF 4B LD C,E -2666 DFE0 CD 35 DE CALL CKBITMAP ;check it. -2667 DFE3 1F RRA ;empty? -2668 DFE4 D2 EC DF JP NC,FNDSPA3 -2669 DFE7 D1 POP DE ;nope, continue searching. -2670 DFE8 C1 POP BC -2671 DFE9 C3 C0 DF JP FNDSPA1 -2672 DFEC ; -2673 DFEC ; Empty block found. Set it as used and return with (HL) -2674 DFEC ; pointing to it (true?). -2675 DFEC ; -2676 DFEC 17 FNDSPA3:RLA ;reset byte. -2677 DFED 3C INC A ;and set bit 0. -2678 DFEE CD 64 DE CALL STBMAP1 ;update bit map. -2679 DFF1 E1 POP HL ;set return registers. -2680 DFF2 D1 POP DE -2681 DFF3 C9 RET -2682 DFF4 ; -2683 DFF4 ; Free block was not found. If (BC) is not zero, then we have -2684 DFF4 ; not checked all of the disk space. -2685 DFF4 ; -2686 DFF4 79 FNDSPA4:LD A,C -2687 DFF5 B0 OR B -2688 DFF6 C2 C0 DF JP NZ,FNDSPA1 -2689 DFF9 21 00 00 LD HL,0 ;set 'not found' status. -2690 DFFC C9 RET -2691 DFFD ; -2692 DFFD ; Move a complete fcb entry into the directory and write it. -2693 DFFD ; -2694 DFFD 0E 00 FCBSET: LD C,0 -2695 DFFF 1E 20 LD E,32 ;length of each entry. -2696 E001 ; -2697 E001 ; Move (E) bytes from the fcb pointed to by (PARAMS) into -2698 E001 ; fcb in directory starting at relative byte (C). This updated -2699 E001 ; directory buffer is then written to the disk. -2700 E001 ; -2701 E001 D5 UPDATE: PUSH DE -2702 E002 06 00 LD B,0 ;set (BC) to relative byte position. -2703 E004 2A 43 DB LD HL,(PARAMS) ;get address of fcb. -2704 E007 09 ADD HL,BC ;compute starting byte. -2705 E008 EB EX DE,HL -2706 E009 CD 5E DD CALL FCB2HL ;get address of fcb to update in directory. -2707 E00C C1 POP BC ;set (C) to number of bytes to change. -2708 E00D CD 4F DB CALL DE2HL -2709 E010 CD C3 DB UPDATE1:CALL TRKSEC ;determine the track and sector affected. -2710 E013 C3 C6 DD JP DIRWRITE ;then write this sector out. -2711 E016 ; -2712 E016 ; Routine to change the name of all files on the disk with a -2713 E016 ; specified name. The fcb contains the current name as the -2714 E016 ; first 12 characters and the new name 16 bytes into the fcb. -2715 E016 ; -2716 E016 CD 54 DD CHGNAMES: CALL CHKWPRT ;check for a write protected disk. -2717 E019 0E 0C LD C,12 ;match first 12 bytes of fcb only. -2718 E01B CD 18 DF CALL FINDFST ;get first name. -2719 E01E 2A 43 DB LD HL,(PARAMS) ;get address of fcb. -2720 E021 7E LD A,(HL) ;get user number. -2721 E022 11 10 00 LD DE,16 ;move over to desired name. -2722 E025 19 ADD HL,DE -2723 E026 77 LD (HL),A ;keep same user number. -2724 E027 CD F5 DD CHGNAM1:CALL CKFILPOS ;any matching file found? -2725 E02A C8 RET Z ;no, we must be done. -2726 E02B CD 44 DD CALL CHKROFL ;check for read only file. -2727 E02E 0E 10 LD C,16 ;start 16 bytes into fcb. -2728 E030 1E 0C LD E,12 ;and update the first 12 bytes of directory. -2729 E032 CD 01 E0 CALL UPDATE -2730 E035 CD 2D DF CALL FINDNXT ;get te next file name. -2731 E038 C3 27 E0 JP CHGNAM1 ;and continue. -2732 E03B ; -2733 E03B ; Update a files attributes. The procedure is to search for -2734 E03B ; every file with the same name as shown in fcb (ignoring bit 7) -2735 E03B ; and then to update it (which includes bit 7). No other changes -2736 E03B ; are made. -2737 E03B ; -2738 E03B 0E 0C SAVEATTR: LD C,12 ;match first 12 bytes. -2739 E03D CD 18 DF CALL FINDFST ;look for first filename. -2740 E040 CD F5 DD SAVATR1:CALL CKFILPOS ;was one found? -2741 E043 C8 RET Z ;nope, we must be done. -2742 E044 0E 00 LD C,0 ;yes, update the first 12 bytes now. -2743 E046 1E 0C LD E,12 -2744 E048 CD 01 E0 CALL UPDATE ;update filename and write directory. -2745 E04B CD 2D DF CALL FINDNXT ;and get the next file. -2746 E04E C3 40 E0 JP SAVATR1 ;then continue until done. -2747 E051 ; -2748 E051 ; Open a file (name specified in fcb). -2749 E051 ; -2750 E051 0E 0F OPENIT: LD C,15 ;compare the first 15 bytes. -2751 E053 CD 18 DF CALL FINDFST ;get the first one in directory. -2752 E056 CD F5 DD CALL CKFILPOS ;any at all? -2753 E059 C8 RET Z -2754 E05A CD A6 DC OPENIT1:CALL SETEXT ;point to extent byte within users fcb. -2755 E05D 7E LD A,(HL) ;and get it. -2756 E05E F5 PUSH AF ;save it and address. -2757 E05F E5 PUSH HL -2758 E060 CD 5E DD CALL FCB2HL ;point to fcb in directory. -2759 E063 EB EX DE,HL -2760 E064 2A 43 DB LD HL,(PARAMS) ;this is the users copy. -2761 E067 0E 20 LD C,32 ;move it into users space. -2762 E069 D5 PUSH DE -2763 E06A CD 4F DB CALL DE2HL -2764 E06D CD 78 DD CALL SETS2B7 ;set bit 7 in 's2' byte (unmodified). -2765 E070 D1 POP DE ;now get the extent byte from this fcb. -2766 E071 21 0C 00 LD HL,12 -2767 E074 19 ADD HL,DE -2768 E075 4E LD C,(HL) ;into (C). -2769 E076 21 0F 00 LD HL,15 ;now get the record count byte into (B). -2770 E079 19 ADD HL,DE -2771 E07A 46 LD B,(HL) -2772 E07B E1 POP HL ;keep the same extent as the user had originally. -2773 E07C F1 POP AF -2774 E07D 77 LD (HL),A -2775 E07E 79 LD A,C ;is it the same as in the directory fcb? -2776 E07F BE CP (HL) -2777 E080 78 LD A,B ;if yes, then use the same record count. -2778 E081 CA 8B E0 JP Z,OPENIT2 -2779 E084 3E 00 LD A,0 ;if the user specified an extent greater than -2780 E086 DA 8B E0 JP C,OPENIT2 ;the one in the directory, then set record count to 0. -2781 E089 3E 80 LD A,128 ;otherwise set to maximum. -2782 E08B 2A 43 DB OPENIT2:LD HL,(PARAMS) ;set record count in users fcb to (A). -2783 E08E 11 0F 00 LD DE,15 -2784 E091 19 ADD HL,DE ;compute relative position. -2785 E092 77 LD (HL),A ;and set the record count. -2786 E093 C9 RET -2787 E094 ; -2788 E094 ; Move two bytes from (DE) to (HL) if (and only if) (HL) -2789 E094 ; point to a zero value (16 bit). -2790 E094 ; Return with zero flag set it (DE) was moved. Registers (DE) -2791 E094 ; and (HL) are not changed. However (A) is. -2792 E094 ; -2793 E094 7E MOVEWORD: LD A,(HL) ;check for a zero word. -2794 E095 23 INC HL -2795 E096 B6 OR (HL) ;both bytes zero? -2796 E097 2B DEC HL -2797 E098 C0 RET NZ ;nope, just return. -2798 E099 1A LD A,(DE) ;yes, move two bytes from (DE) into -2799 E09A 77 LD (HL),A ;this zero space. -2800 E09B 13 INC DE -2801 E09C 23 INC HL -2802 E09D 1A LD A,(DE) -2803 E09E 77 LD (HL),A -2804 E09F 1B DEC DE ;don't disturb these registers. -2805 E0A0 2B DEC HL -2806 E0A1 C9 RET -2807 E0A2 ; -2808 E0A2 ; Get here to close a file specified by (fcb). -2809 E0A2 ; -2810 E0A2 AF CLOSEIT:XOR A ;clear status and file position bytes. -2811 E0A3 32 45 DB LD (STATUS),A -2812 E0A6 32 EA E5 LD (FILEPOS),A -2813 E0A9 32 EB E5 LD (FILEPOS+1),A -2814 E0AC CD 1E DD CALL GETWPRT ;get write protect bit for this drive. -2815 E0AF C0 RET NZ ;just return if it is set. -2816 E0B0 CD 69 DD CALL GETS2 ;else get the 's2' byte. -2817 E0B3 E6 80 AND 80H ;and look at bit 7 (file unmodified?). -2818 E0B5 C0 RET NZ ;just return if set. -2819 E0B6 0E 0F LD C,15 ;else look up this file in directory. -2820 E0B8 CD 18 DF CALL FINDFST -2821 E0BB CD F5 DD CALL CKFILPOS ;was it found? -2822 E0BE C8 RET Z ;just return if not. -2823 E0BF 01 10 00 LD BC,16 ;set (HL) pointing to records used section. -2824 E0C2 CD 5E DD CALL FCB2HL -2825 E0C5 09 ADD HL,BC -2826 E0C6 EB EX DE,HL -2827 E0C7 2A 43 DB LD HL,(PARAMS) ;do the same for users specified fcb. -2828 E0CA 09 ADD HL,BC -2829 E0CB 0E 10 LD C,16 ;this many bytes are present in this extent. -2830 E0CD 3A DD E5 CLOSEIT1: LD A,(BIGDISK) ;8 or 16 bit record numbers? -2831 E0D0 B7 OR A -2832 E0D1 CA E8 E0 JP Z,CLOSEIT4 -2833 E0D4 7E LD A,(HL) ;just 8 bit. Get one from users fcb. -2834 E0D5 B7 OR A -2835 E0D6 1A LD A,(DE) ;now get one from directory fcb. -2836 E0D7 C2 DB E0 JP NZ,CLOSEIT2 -2837 E0DA 77 LD (HL),A ;users byte was zero. Update from directory. -2838 E0DB B7 CLOSEIT2: OR A -2839 E0DC C2 E1 E0 JP NZ,CLOSEIT3 -2840 E0DF 7E LD A,(HL) ;directories byte was zero, update from users fcb. -2841 E0E0 12 LD (DE),A -2842 E0E1 BE CLOSEIT3: CP (HL) ;if neither one of these bytes were zero, -2843 E0E2 C2 1F E1 JP NZ,CLOSEIT7 ;then close error if they are not the same. -2844 E0E5 C3 FD E0 JP CLOSEIT5 ;ok so far, get to next byte in fcbs. -2845 E0E8 CD 94 E0 CLOSEIT4: CALL MOVEWORD ;update users fcb if it is zero. -2846 E0EB EB EX DE,HL -2847 E0EC CD 94 E0 CALL MOVEWORD ;update directories fcb if it is zero. -2848 E0EF EB EX DE,HL -2849 E0F0 1A LD A,(DE) ;if these two values are no different, -2850 E0F1 BE CP (HL) ;then a close error occured. -2851 E0F2 C2 1F E1 JP NZ,CLOSEIT7 -2852 E0F5 13 INC DE ;check second byte. -2853 E0F6 23 INC HL -2854 E0F7 1A LD A,(DE) -2855 E0F8 BE CP (HL) -2856 E0F9 C2 1F E1 JP NZ,CLOSEIT7 -2857 E0FC 0D DEC C ;remember 16 bit values. -2858 E0FD 13 CLOSEIT5: INC DE ;bump to next item in table. -2859 E0FE 23 INC HL -2860 E0FF 0D DEC C ;there are 16 entries only. -2861 E100 C2 CD E0 JP NZ,CLOSEIT1 ;continue if more to do. -2862 E103 01 EC FF LD BC,0FFECH ;backup 20 places (extent byte). -2863 E106 09 ADD HL,BC -2864 E107 EB EX DE,HL -2865 E108 09 ADD HL,BC -2866 E109 1A LD A,(DE) -2867 E10A BE CP (HL) ;directory's extent already greater than the -2868 E10B DA 17 E1 JP C,CLOSEIT6 ;users extent? -2869 E10E 77 LD (HL),A ;no, update directory extent. -2870 E10F 01 03 00 LD BC,3 ;and update the record count byte in -2871 E112 09 ADD HL,BC ;directories fcb. -2872 E113 EB EX DE,HL -2873 E114 09 ADD HL,BC -2874 E115 7E LD A,(HL) ;get from user. -2875 E116 12 LD (DE),A ;and put in directory. -2876 E117 3E FF CLOSEIT6: LD A,0FFH ;set 'was open and is now closed' byte. -2877 E119 32 D2 E5 LD (CLOSEFLG),A -2878 E11C C3 10 E0 JP UPDATE1 ;update the directory now. -2879 E11F 21 45 DB CLOSEIT7: LD HL,STATUS ;set return status and then return. -2880 E122 35 DEC (HL) -2881 E123 C9 RET -2882 E124 ; -2883 E124 ; Routine to get the next empty space in the directory. It -2884 E124 ; will then be cleared for use. -2885 E124 ; -2886 E124 CD 54 DD GETEMPTY: CALL CHKWPRT ;make sure disk is not write protected. -2887 E127 2A 43 DB LD HL,(PARAMS) ;save current parameters (fcb). -2888 E12A E5 PUSH HL -2889 E12B 21 AC E5 LD HL,EMPTYFCB ;use special one for empty space. -2890 E12E 22 43 DB LD (PARAMS),HL -2891 E131 0E 01 LD C,1 ;search for first empty spot in directory. -2892 E133 CD 18 DF CALL FINDFST ;(* only check first byte *) -2893 E136 CD F5 DD CALL CKFILPOS ;none? -2894 E139 E1 POP HL -2895 E13A 22 43 DB LD (PARAMS),HL ;restore original fcb address. -2896 E13D C8 RET Z ;return if no more space. -2897 E13E EB EX DE,HL -2898 E13F 21 0F 00 LD HL,15 ;point to number of records for this file. -2899 E142 19 ADD HL,DE -2900 E143 0E 11 LD C,17 ;and clear all of this space. -2901 E145 AF XOR A -2902 E146 77 GETMT1: LD (HL),A -2903 E147 23 INC HL -2904 E148 0D DEC C -2905 E149 C2 46 E1 JP NZ,GETMT1 -2906 E14C 21 0D 00 LD HL,13 ;clear the 's1' byte also. -2907 E14F 19 ADD HL,DE -2908 E150 77 LD (HL),A -2909 E151 CD 8C DD CALL CHKNMBR ;keep (SCRATCH1) within bounds. -2910 E154 CD FD DF CALL FCBSET ;write out this fcb entry to directory. -2911 E157 C3 78 DD JP SETS2B7 ;set 's2' byte bit 7 (unmodified at present). -2912 E15A ; -2913 E15A ; Routine to close the current extent and open the next one -2914 E15A ; for reading. -2915 E15A ; -2916 E15A AF GETNEXT:XOR A -2917 E15B 32 D2 E5 LD (CLOSEFLG),A ;clear close flag. -2918 E15E CD A2 E0 CALL CLOSEIT ;close this extent. -2919 E161 CD F5 DD CALL CKFILPOS -2920 E164 C8 RET Z ;not there??? -2921 E165 2A 43 DB LD HL,(PARAMS) ;get extent byte. -2922 E168 01 0C 00 LD BC,12 -2923 E16B 09 ADD HL,BC -2924 E16C 7E LD A,(HL) ;and increment it. -2925 E16D 3C INC A -2926 E16E E6 1F AND 1FH ;keep within range 0-31. -2927 E170 77 LD (HL),A -2928 E171 CA 83 E1 JP Z,GTNEXT1 ;overflow? -2929 E174 47 LD B,A ;mask extent byte. -2930 E175 3A C5 E5 LD A,(EXTMASK) -2931 E178 A0 AND B -2932 E179 21 D2 E5 LD HL,CLOSEFLG ;check close flag (0ffh is ok). -2933 E17C A6 AND (HL) -2934 E17D CA 8E E1 JP Z,GTNEXT2 ;if zero, we must read in next extent. -2935 E180 C3 AC E1 JP GTNEXT3 ;else, it is already in memory. -2936 E183 01 02 00 GTNEXT1:LD BC,2 ;Point to the 's2' byte. -2937 E186 09 ADD HL,BC -2938 E187 34 INC (HL) ;and bump it. -2939 E188 7E LD A,(HL) ;too many extents? -2940 E189 E6 0F AND 0FH -2941 E18B CA B6 E1 JP Z,GTNEXT5 ;yes, set error code. -2942 E18E ; -2943 E18E ; Get here to open the next extent. -2944 E18E ; -2945 E18E 0E 0F GTNEXT2:LD C,15 ;set to check first 15 bytes of fcb. -2946 E190 CD 18 DF CALL FINDFST ;find the first one. -2947 E193 CD F5 DD CALL CKFILPOS ;none available? -2948 E196 C2 AC E1 JP NZ,GTNEXT3 -2949 E199 3A D3 E5 LD A,(RDWRTFLG) ;no extent present. Can we open an empty one? -2950 E19C 3C INC A ;0ffh means reading (so not possible). -2951 E19D CA B6 E1 JP Z,GTNEXT5 ;or an error. -2952 E1A0 CD 24 E1 CALL GETEMPTY ;we are writing, get an empty entry. -2953 E1A3 CD F5 DD CALL CKFILPOS ;none? -2954 E1A6 CA B6 E1 JP Z,GTNEXT5 ;error if true. -2955 E1A9 C3 AF E1 JP GTNEXT4 ;else we are almost done. -2956 E1AC CD 5A E0 GTNEXT3:CALL OPENIT1 ;open this extent. -2957 E1AF CD BB DC GTNEXT4:CALL STRDATA ;move in updated data (rec #, extent #, etc.) -2958 E1B2 AF XOR A ;clear status and return. -2959 E1B3 C3 01 DB JP SETSTAT -2960 E1B6 ; -2961 E1B6 ; Error in extending the file. Too many extents were needed -2962 E1B6 ; or not enough space on the disk. -2963 E1B6 ; -2964 E1B6 CD 05 DB GTNEXT5:CALL IOERR1 ;set error code, clear bit 7 of 's2' -2965 E1B9 C3 78 DD JP SETS2B7 ;so this is not written on a close. -2966 E1BC ; -2967 E1BC ; Read a sequential file. -2968 E1BC ; -2969 E1BC 3E 01 RDSEQ: LD A,1 ;set sequential access mode. -2970 E1BE 32 D5 E5 LD (MODE),A -2971 E1C1 3E FF RDSEQ1: LD A,0FFH ;don't allow reading unwritten space. -2972 E1C3 32 D3 E5 LD (RDWRTFLG),A -2973 E1C6 CD BB DC CALL STRDATA ;put rec# and ext# into fcb. -2974 E1C9 3A E3 E5 LD A,(SAVNREC) ;get next record to read. -2975 E1CC 21 E1 E5 LD HL,SAVNXT ;get number of records in extent. -2976 E1CF BE CP (HL) ;within this extent? -2977 E1D0 DA E6 E1 JP C,RDSEQ2 -2978 E1D3 FE 80 CP 128 ;no. Is this extent fully used? -2979 E1D5 C2 FB E1 JP NZ,RDSEQ3 ;no. End-of-file. -2980 E1D8 CD 5A E1 CALL GETNEXT ;yes, open the next one. -2981 E1DB AF XOR A ;reset next record to read. -2982 E1DC 32 E3 E5 LD (SAVNREC),A -2983 E1DF 3A 45 DB LD A,(STATUS) ;check on open, successful? -2984 E1E2 B7 OR A -2985 E1E3 C2 FB E1 JP NZ,RDSEQ3 ;no, error. -2986 E1E6 CD 77 DC RDSEQ2: CALL COMBLK ;ok. compute block number to read. -2987 E1E9 CD 84 DC CALL CHKBLK ;check it. Within bounds? -2988 E1EC CA FB E1 JP Z,RDSEQ3 ;no, error. -2989 E1EF CD 8A DC CALL LOGICAL ;convert (BLKNMBR) to logical sector (128 byte). -2990 E1F2 CD D1 DB CALL TRKSEC1 ;set the track and sector for this block #. -2991 E1F5 CD B2 DB CALL DOREAD ;and read it. -2992 E1F8 C3 D2 DC JP SETNREC ;and set the next record to be accessed. -2993 E1FB ; -2994 E1FB ; Read error occured. Set status and return. -2995 E1FB ; -2996 E1FB C3 05 DB RDSEQ3: JP IOERR1 -2997 E1FE ; -2998 E1FE ; Write the next sequential record. -2999 E1FE ; -3000 E1FE 3E 01 WTSEQ: LD A,1 ;set sequential access mode. -3001 E200 32 D5 E5 LD (MODE),A -3002 E203 3E 00 WTSEQ1: LD A,0 ;allow an addition empty extent to be opened. -3003 E205 32 D3 E5 LD (RDWRTFLG),A -3004 E208 CD 54 DD CALL CHKWPRT ;check write protect status. -3005 E20B 2A 43 DB LD HL,(PARAMS) -3006 E20E CD 47 DD CALL CKROF1 ;check for read only file, (HL) already set to fcb. -3007 E211 CD BB DC CALL STRDATA ;put updated data into fcb. -3008 E214 3A E3 E5 LD A,(SAVNREC) ;get record number to write. -3009 E217 FE 80 CP 128 ;within range? -3010 E219 D2 05 DB JP NC,IOERR1 ;no, error(?). -3011 E21C CD 77 DC CALL COMBLK ;compute block number. -3012 E21F CD 84 DC CALL CHKBLK ;check number. -3013 E222 0E 00 LD C,0 ;is there one to write to? -3014 E224 C2 6E E2 JP NZ,WTSEQ6 ;yes, go do it. -3015 E227 CD 3E DC CALL GETBLOCK ;get next block number within fcb to use. -3016 E22A 32 D7 E5 LD (RELBLOCK),A ;and save. -3017 E22D 01 00 00 LD BC,0 ;start looking for space from the start -3018 E230 B7 OR A ;if none allocated as yet. -3019 E231 CA 3B E2 JP Z,WTSEQ2 -3020 E234 4F LD C,A ;extract previous block number from fcb -3021 E235 0B DEC BC ;so we can be closest to it. -3022 E236 CD 5E DC CALL EXTBLK -3023 E239 44 LD B,H -3024 E23A 4D LD C,L -3025 E23B CD BE DF WTSEQ2: CALL FNDSPACE ;find the next empty block nearest number (BC). -3026 E23E 7D LD A,L ;check for a zero number. -3027 E23F B4 OR H -3028 E240 C2 48 E2 JP NZ,WTSEQ3 -3029 E243 3E 02 LD A,2 ;no more space? -3030 E245 C3 01 DB JP SETSTAT -3031 E248 22 E5 E5 WTSEQ3: LD (BLKNMBR),HL ;save block number to access. -3032 E24B EB EX DE,HL ;put block number into (DE). -3033 E24C 2A 43 DB LD HL,(PARAMS) ;now we must update the fcb for this -3034 E24F 01 10 00 LD BC,16 ;newly allocated block. -3035 E252 09 ADD HL,BC -3036 E253 3A DD E5 LD A,(BIGDISK) ;8 or 16 bit block numbers? -3037 E256 B7 OR A -3038 E257 3A D7 E5 LD A,(RELBLOCK) ;(* update this entry *) -3039 E25A CA 64 E2 JP Z,WTSEQ4 ;zero means 16 bit ones. -3040 E25D CD 64 DD CALL ADDA2HL ;(HL)=(HL)+(A) -3041 E260 73 LD (HL),E ;store new block number. -3042 E261 C3 6C E2 JP WTSEQ5 -3043 E264 4F WTSEQ4: LD C,A ;compute spot in this 16 bit table. -3044 E265 06 00 LD B,0 -3045 E267 09 ADD HL,BC -3046 E268 09 ADD HL,BC -3047 E269 73 LD (HL),E ;stuff block number (DE) there. -3048 E26A 23 INC HL -3049 E26B 72 LD (HL),D -3050 E26C 0E 02 WTSEQ5: LD C,2 ;set (C) to indicate writing to un-used disk space. -3051 E26E 3A 45 DB WTSEQ6: LD A,(STATUS) ;are we ok so far? -3052 E271 B7 OR A -3053 E272 C0 RET NZ -3054 E273 C5 PUSH BC ;yes, save write flag for bios (register C). -3055 E274 CD 8A DC CALL LOGICAL ;convert (BLKNMBR) over to loical sectors. -3056 E277 3A D5 E5 LD A,(MODE) ;get access mode flag (1=sequential, -3057 E27A 3D DEC A ;0=random, 2=special?). -3058 E27B 3D DEC A -3059 E27C C2 BB E2 JP NZ,WTSEQ9 -3060 E27F ; -3061 E27F ; Special random i/o from function #40. Maybe for M/PM, but the -3062 E27F ; current block, if it has not been written to, will be zeroed -3063 E27F ; out and then written (reason?). -3064 E27F ; -3065 E27F C1 POP BC -3066 E280 C5 PUSH BC -3067 E281 79 LD A,C ;get write status flag (2=writing unused space). -3068 E282 3D DEC A -3069 E283 3D DEC A -3070 E284 C2 BB E2 JP NZ,WTSEQ9 -3071 E287 E5 PUSH HL -3072 E288 2A B9 E5 LD HL,(DIRBUF) ;zero out the directory buffer. -3073 E28B 57 LD D,A ;note that (A) is zero here. -3074 E28C 77 WTSEQ7: LD (HL),A -3075 E28D 23 INC HL -3076 E28E 14 INC D ;do 128 bytes. -3077 E28F F2 8C E2 JP P,WTSEQ7 -3078 E292 CD E0 DD CALL DIRDMA ;tell the bios the dma address for directory access. -3079 E295 2A E7 E5 LD HL,(LOGSECT) ;get sector that starts current block. -3080 E298 0E 02 LD C,2 ;set 'writing to unused space' flag. -3081 E29A 22 E5 E5 WTSEQ8: LD (BLKNMBR),HL ;save sector to write. -3082 E29D C5 PUSH BC -3083 E29E CD D1 DB CALL TRKSEC1 ;determine its track and sector numbers. -3084 E2A1 C1 POP BC -3085 E2A2 CD B8 DB CALL DOWRITE ;now write out 128 bytes of zeros. -3086 E2A5 2A E5 E5 LD HL,(BLKNMBR) ;get sector number. -3087 E2A8 0E 00 LD C,0 ;set normal write flag. -3088 E2AA 3A C4 E5 LD A,(BLKMASK) ;determine if we have written the entire -3089 E2AD 47 LD B,A ;physical block. -3090 E2AE A5 AND L -3091 E2AF B8 CP B -3092 E2B0 23 INC HL ;prepare for the next one. -3093 E2B1 C2 9A E2 JP NZ,WTSEQ8 ;continue until (BLKMASK+1) sectors written. -3094 E2B4 E1 POP HL ;reset next sector number. -3095 E2B5 22 E5 E5 LD (BLKNMBR),HL -3096 E2B8 CD DA DD CALL DEFDMA ;and reset dma address. -3097 E2BB ; -3098 E2BB ; Normal disk write. Set the desired track and sector then -3099 E2BB ; do the actual write. -3100 E2BB ; -3101 E2BB CD D1 DB WTSEQ9: CALL TRKSEC1 ;determine track and sector for this write. -3102 E2BE C1 POP BC ;get write status flag. -3103 E2BF C5 PUSH BC -3104 E2C0 CD B8 DB CALL DOWRITE ;and write this out. -3105 E2C3 C1 POP BC -3106 E2C4 3A E3 E5 LD A,(SAVNREC) ;get number of records in file. -3107 E2C7 21 E1 E5 LD HL,SAVNXT ;get last record written. -3108 E2CA BE CP (HL) -3109 E2CB DA D2 E2 JP C,WTSEQ10 -3110 E2CE 77 LD (HL),A ;we have to update record count. -3111 E2CF 34 INC (HL) -3112 E2D0 0E 02 LD C,2 -3113 E2D2 ; -3114 E2D2 ;* This area has been patched to correct disk update problem -3115 E2D2 ;* when using blocking and de-blocking in the BIOS. -3116 E2D2 ; -3117 E2D2 00 WTSEQ10:NOP ;was 'dcr c' -3118 E2D3 00 NOP ;was 'dcr c' -3119 E2D4 21 00 00 LD HL,0 ;was 'jnz wtseq99' -3120 E2D7 ; -3121 E2D7 ; * End of patch. -3122 E2D7 ; -3123 E2D7 F5 PUSH AF -3124 E2D8 CD 69 DD CALL GETS2 ;set 'extent written to' flag. -3125 E2DB E6 7F AND 7FH ;(* clear bit 7 *) -3126 E2DD 77 LD (HL),A -3127 E2DE F1 POP AF ;get record count for this extent. -3128 E2DF FE 7F WTSEQ99:CP 127 ;is it full? -3129 E2E1 C2 00 E3 JP NZ,WTSEQ12 -3130 E2E4 3A D5 E5 LD A,(MODE) ;yes, are we in sequential mode? -3131 E2E7 FE 01 CP 1 -3132 E2E9 C2 00 E3 JP NZ,WTSEQ12 -3133 E2EC CD D2 DC CALL SETNREC ;yes, set next record number. -3134 E2EF CD 5A E1 CALL GETNEXT ;and get next empty space in directory. -3135 E2F2 21 45 DB LD HL,STATUS ;ok? -3136 E2F5 7E LD A,(HL) -3137 E2F6 B7 OR A -3138 E2F7 C2 FE E2 JP NZ,WTSEQ11 -3139 E2FA 3D DEC A ;yes, set record count to -1. -3140 E2FB 32 E3 E5 LD (SAVNREC),A -3141 E2FE 36 00 WTSEQ11:LD (HL),0 ;clear status. -3142 E300 C3 D2 DC WTSEQ12:JP SETNREC ;set next record to access. -3143 E303 ; -3144 E303 ; For random i/o, set the fcb for the desired record number -3145 E303 ; based on the 'r0,r1,r2' bytes. These bytes in the fcb are -3146 E303 ; used as follows: -3147 E303 ; -3148 E303 ; fcb+35 fcb+34 fcb+33 -3149 E303 ; | 'r-2' | 'r-1' | 'r-0' | -3150 E303 ; |7 0 | 7 0 | 7 0| -3151 E303 ; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0| -3152 E303 ; | overflow | | extra | extent | record # | -3153 E303 ; | ______________| |_extent|__number___|_____________| -3154 E303 ; also 's2' -3155 E303 ; -3156 E303 ; On entry, register (C) contains 0ffh if this is a read -3157 E303 ; and thus we can not access unwritten disk space. Otherwise, -3158 E303 ; another extent will be opened (for writing) if required. -3159 E303 ; -3160 E303 AF POSITION: XOR A ;set random i/o flag. -3161 E304 32 D5 E5 LD (MODE),A -3162 E307 ; -3163 E307 ; Special entry (function #40). M/PM ? -3164 E307 ; -3165 E307 C5 POSITN1:PUSH BC ;save read/write flag. -3166 E308 2A 43 DB LD HL,(PARAMS) ;get address of fcb. -3167 E30B EB EX DE,HL -3168 E30C 21 21 00 LD HL,33 ;now get byte 'r0'. -3169 E30F 19 ADD HL,DE -3170 E310 7E LD A,(HL) -3171 E311 E6 7F AND 7FH ;keep bits 0-6 for the record number to access. -3172 E313 F5 PUSH AF -3173 E314 7E LD A,(HL) ;now get bit 7 of 'r0' and bits 0-3 of 'r1'. -3174 E315 17 RLA -3175 E316 23 INC HL -3176 E317 7E LD A,(HL) -3177 E318 17 RLA -3178 E319 E6 1F AND 1FH ;and save this in bits 0-4 of (C). -3179 E31B 4F LD C,A ;this is the extent byte. -3180 E31C 7E LD A,(HL) ;now get the extra extent byte. -3181 E31D 1F RRA -3182 E31E 1F RRA -3183 E31F 1F RRA -3184 E320 1F RRA -3185 E321 E6 0F AND 0FH -3186 E323 47 LD B,A ;and save it in (B). -3187 E324 F1 POP AF ;get record number back to (A). -3188 E325 23 INC HL ;check overflow byte 'r2'. -3189 E326 6E LD L,(HL) -3190 E327 2C INC L -3191 E328 2D DEC L -3192 E329 2E 06 LD L,6 ;prepare for error. -3193 E32B C2 8B E3 JP NZ,POSITN5 ;out of disk space error. -3194 E32E 21 20 00 LD HL,32 ;store record number into fcb. -3195 E331 19 ADD HL,DE -3196 E332 77 LD (HL),A -3197 E333 21 0C 00 LD HL,12 ;and now check the extent byte. -3198 E336 19 ADD HL,DE -3199 E337 79 LD A,C -3200 E338 96 SUB (HL) ;same extent as before? -3201 E339 C2 47 E3 JP NZ,POSITN2 -3202 E33C 21 0E 00 LD HL,14 ;yes, check extra extent byte 's2' also. -3203 E33F 19 ADD HL,DE -3204 E340 78 LD A,B -3205 E341 96 SUB (HL) -3206 E342 E6 7F AND 7FH -3207 E344 CA 7F E3 JP Z,POSITN3 ;same, we are almost done then. -3208 E347 ; -3209 E347 ; Get here when another extent is required. -3210 E347 ; -3211 E347 C5 POSITN2:PUSH BC -3212 E348 D5 PUSH DE -3213 E349 CD A2 E0 CALL CLOSEIT ;close current extent. -3214 E34C D1 POP DE -3215 E34D C1 POP BC -3216 E34E 2E 03 LD L,3 ;prepare for error. -3217 E350 3A 45 DB LD A,(STATUS) -3218 E353 3C INC A -3219 E354 CA 84 E3 JP Z,POSITN4 ;close error. -3220 E357 21 0C 00 LD HL,12 ;put desired extent into fcb now. -3221 E35A 19 ADD HL,DE -3222 E35B 71 LD (HL),C -3223 E35C 21 0E 00 LD HL,14 ;and store extra extent byte 's2'. -3224 E35F 19 ADD HL,DE -3225 E360 70 LD (HL),B -3226 E361 CD 51 E0 CALL OPENIT ;try and get this extent. -3227 E364 3A 45 DB LD A,(STATUS) ;was it there? -3228 E367 3C INC A -3229 E368 C2 7F E3 JP NZ,POSITN3 -3230 E36B C1 POP BC ;no. can we create a new one (writing?). -3231 E36C C5 PUSH BC -3232 E36D 2E 04 LD L,4 ;prepare for error. -3233 E36F 0C INC C -3234 E370 CA 84 E3 JP Z,POSITN4 ;nope, reading unwritten space error. -3235 E373 CD 24 E1 CALL GETEMPTY ;yes we can, try to find space. -3236 E376 2E 05 LD L,5 ;prepare for error. -3237 E378 3A 45 DB LD A,(STATUS) -3238 E37B 3C INC A -3239 E37C CA 84 E3 JP Z,POSITN4 ;out of space? -3240 E37F ; -3241 E37F ; Normal return location. Clear error code and return. -3242 E37F ; -3243 E37F C1 POSITN3:POP BC ;restore stack. -3244 E380 AF XOR A ;and clear error code byte. -3245 E381 C3 01 DB JP SETSTAT -3246 E384 ; -3247 E384 ; Error. Set the 's2' byte to indicate this (why?). -3248 E384 ; -3249 E384 E5 POSITN4:PUSH HL -3250 E385 CD 69 DD CALL GETS2 -3251 E388 36 C0 LD (HL),0C0H -3252 E38A E1 POP HL -3253 E38B ; -3254 E38B ; Return with error code (presently in L). -3255 E38B ; -3256 E38B C1 POSITN5:POP BC -3257 E38C 7D LD A,L ;get error code. -3258 E38D 32 45 DB LD (STATUS),A -3259 E390 C3 78 DD JP SETS2B7 -3260 E393 ; -3261 E393 ; Read a random record. -3262 E393 ; -3263 E393 0E FF READRAN:LD C,0FFH ;set 'read' status. -3264 E395 CD 03 E3 CALL POSITION ;position the file to proper record. -3265 E398 CC C1 E1 CALL Z,RDSEQ1 ;and read it as usual (if no errors). -3266 E39B C9 RET -3267 E39C ; -3268 E39C ; Write to a random record. -3269 E39C ; -3270 E39C 0E 00 WRITERAN: LD C,0 ;set 'writing' flag. -3271 E39E CD 03 E3 CALL POSITION ;position the file to proper record. -3272 E3A1 CC 03 E2 CALL Z,WTSEQ1 ;and write as usual (if no errors). -3273 E3A4 C9 RET -3274 E3A5 ; -3275 E3A5 ; Compute the random record number. Enter with (HL) pointing -3276 E3A5 ; to a fcb an (DE) contains a relative location of a record -3277 E3A5 ; number. On exit, (C) contains the 'r0' byte, (B) the 'r1' -3278 E3A5 ; byte, and (A) the 'r2' byte. -3279 E3A5 ; -3280 E3A5 ; On return, the zero flag is set if the record is within -3281 E3A5 ; bounds. Otherwise, an overflow occured. -3282 E3A5 ; -3283 E3A5 EB COMPRAND: EX DE,HL ;save fcb pointer in (DE). -3284 E3A6 19 ADD HL,DE ;compute relative position of record #. -3285 E3A7 4E LD C,(HL) ;get record number into (BC). -3286 E3A8 06 00 LD B,0 -3287 E3AA 21 0C 00 LD HL,12 ;now get extent. -3288 E3AD 19 ADD HL,DE -3289 E3AE 7E LD A,(HL) ;compute (BC)=(record #)+(extent)*128. -3290 E3AF 0F RRCA ;move lower bit into bit 7. -3291 E3B0 E6 80 AND 80H ;and ignore all other bits. -3292 E3B2 81 ADD A,C ;add to our record number. -3293 E3B3 4F LD C,A -3294 E3B4 3E 00 LD A,0 ;take care of any carry. -3295 E3B6 88 ADC A,B -3296 E3B7 47 LD B,A -3297 E3B8 7E LD A,(HL) ;now get the upper bits of extent into -3298 E3B9 0F RRCA ;bit positions 0-3. -3299 E3BA E6 0F AND 0FH ;and ignore all others. -3300 E3BC 80 ADD A,B ;add this in to 'r1' byte. -3301 E3BD 47 LD B,A -3302 E3BE 21 0E 00 LD HL,14 ;get the 's2' byte (extra extent). -3303 E3C1 19 ADD HL,DE -3304 E3C2 7E LD A,(HL) -3305 E3C3 87 ADD A,A ;and shift it left 4 bits (bits 4-7). -3306 E3C4 87 ADD A,A -3307 E3C5 87 ADD A,A -3308 E3C6 87 ADD A,A -3309 E3C7 F5 PUSH AF ;save carry flag (bit 0 of flag byte). -3310 E3C8 80 ADD A,B ;now add extra extent into 'r1'. -3311 E3C9 47 LD B,A -3312 E3CA F5 PUSH AF ;and save carry (overflow byte 'r2'). -3313 E3CB E1 POP HL ;bit 0 of (L) is the overflow indicator. -3314 E3CC 7D LD A,L -3315 E3CD E1 POP HL ;and same for first carry flag. -3316 E3CE B5 OR L ;either one of these set? -3317 E3CF E6 01 AND 01H ;only check the carry flags. -3318 E3D1 C9 RET -3319 E3D2 ; -3320 E3D2 ; Routine to setup the fcb (bytes 'r0', 'r1', 'r2') to -3321 E3D2 ; reflect the last record used for a random (or other) file. -3322 E3D2 ; This reads the directory and looks at all extents computing -3323 E3D2 ; the largerst record number for each and keeping the maximum -3324 E3D2 ; value only. Then 'r0', 'r1', and 'r2' will reflect this -3325 E3D2 ; maximum record number. This is used to compute the space used -3326 E3D2 ; by a random file. -3327 E3D2 ; -3328 E3D2 0E 0C RANSIZE:LD C,12 ;look thru directory for first entry with -3329 E3D4 CD 18 DF CALL FINDFST ;this name. -3330 E3D7 2A 43 DB LD HL,(PARAMS) ;zero out the 'r0, r1, r2' bytes. -3331 E3DA 11 21 00 LD DE,33 -3332 E3DD 19 ADD HL,DE -3333 E3DE E5 PUSH HL -3334 E3DF 72 LD (HL),D ;note that (D)=0. -3335 E3E0 23 INC HL -3336 E3E1 72 LD (HL),D -3337 E3E2 23 INC HL -3338 E3E3 72 LD (HL),D -3339 E3E4 CD F5 DD RANSIZ1:CALL CKFILPOS ;is there an extent to process? -3340 E3E7 CA 0C E4 JP Z,RANSIZ3 ;no, we are done. -3341 E3EA CD 5E DD CALL FCB2HL ;set (HL) pointing to proper fcb in dir. -3342 E3ED 11 0F 00 LD DE,15 ;point to last record in extent. -3343 E3F0 CD A5 E3 CALL COMPRAND ;and compute random parameters. -3344 E3F3 E1 POP HL -3345 E3F4 E5 PUSH HL ;now check these values against those -3346 E3F5 5F LD E,A ;already in fcb. -3347 E3F6 79 LD A,C ;the carry flag will be set if those -3348 E3F7 96 SUB (HL) ;in the fcb represent a larger size than -3349 E3F8 23 INC HL ;this extent does. -3350 E3F9 78 LD A,B -3351 E3FA 9E SBC A,(HL) -3352 E3FB 23 INC HL -3353 E3FC 7B LD A,E -3354 E3FD 9E SBC A,(HL) -3355 E3FE DA 06 E4 JP C,RANSIZ2 -3356 E401 73 LD (HL),E ;we found a larger (in size) extent. -3357 E402 2B DEC HL ;stuff these values into fcb. -3358 E403 70 LD (HL),B -3359 E404 2B DEC HL -3360 E405 71 LD (HL),C -3361 E406 CD 2D DF RANSIZ2:CALL FINDNXT ;now get the next extent. -3362 E409 C3 E4 E3 JP RANSIZ1 ;continue til all done. -3363 E40C E1 RANSIZ3:POP HL ;we are done, restore the stack and -3364 E40D C9 RET ;return. -3365 E40E ; -3366 E40E ; Function to return the random record position of a given -3367 E40E ; file which has been read in sequential mode up to now. -3368 E40E ; -3369 E40E 2A 43 DB SETRAN: LD HL,(PARAMS) ;point to fcb. -3370 E411 11 20 00 LD DE,32 ;and to last used record. -3371 E414 CD A5 E3 CALL COMPRAND ;compute random position. -3372 E417 21 21 00 LD HL,33 ;now stuff these values into fcb. -3373 E41A 19 ADD HL,DE -3374 E41B 71 LD (HL),C ;move 'r0'. -3375 E41C 23 INC HL -3376 E41D 70 LD (HL),B ;and 'r1'. -3377 E41E 23 INC HL -3378 E41F 77 LD (HL),A ;and lastly 'r2'. -3379 E420 C9 RET -3380 E421 ; -3381 E421 ; This routine select the drive specified in (ACTIVE) and -3382 E421 ; update the login vector and bitmap table if this drive was -3383 E421 ; not already active. -3384 E421 ; -3385 E421 2A AF E5 LOGINDRV: LD HL,(LOGIN) ;get the login vector. -3386 E424 3A 42 DB LD A,(ACTIVE) ;get the default drive. -3387 E427 4F LD C,A -3388 E428 CD EA DC CALL SHIFTR ;position active bit for this drive -3389 E42B E5 PUSH HL ;into bit 0. -3390 E42C EB EX DE,HL -3391 E42D CD 59 DB CALL SELECT ;select this drive. -3392 E430 E1 POP HL -3393 E431 CC 47 DB CALL Z,SLCTERR ;valid drive? -3394 E434 7D LD A,L ;is this a newly activated drive? -3395 E435 1F RRA -3396 E436 D8 RET C -3397 E437 2A AF E5 LD HL,(LOGIN) ;yes, update the login vector. -3398 E43A 4D LD C,L -3399 E43B 44 LD B,H -3400 E43C CD 0B DD CALL SETBIT -3401 E43F 22 AF E5 LD (LOGIN),HL ;and save. -3402 E442 C3 A3 DE JP BITMAP ;now update the bitmap. -3403 E445 ; -3404 E445 ; Function to set the active disk number. -3405 E445 ; -3406 E445 3A D6 E5 SETDSK: LD A,(EPARAM) ;get parameter passed and see if this -3407 E448 21 42 DB LD HL,ACTIVE ;represents a change in drives. -3408 E44B BE CP (HL) -3409 E44C C8 RET Z -3410 E44D 77 LD (HL),A ;yes it does, log it in. -3411 E44E C3 21 E4 JP LOGINDRV -3412 E451 ; -3413 E451 ; This is the 'auto disk select' routine. The firsst byte -3414 E451 ; of the fcb is examined for a drive specification. If non -3415 E451 ; zero then the drive will be selected and loged in. -3416 E451 ; -3417 E451 3E FF AUTOSEL:LD A,0FFH ;say 'auto-select activated'. -3418 E453 32 DE E5 LD (AUTO),A -3419 E456 2A 43 DB LD HL,(PARAMS) ;get drive specified. -3420 E459 7E LD A,(HL) -3421 E45A E6 1F AND 1FH ;look at lower 5 bits. -3422 E45C 3D DEC A ;adjust for (1=A, 2=B) etc. -3423 E45D 32 D6 E5 LD (EPARAM),A ;and save for the select routine. -3424 E460 FE 1E CP 1EH ;check for 'no change' condition. -3425 E462 D2 75 E4 JP NC,AUTOSL1 ;yes, don't change. -3426 E465 3A 42 DB LD A,(ACTIVE) ;we must change, save currently active -3427 E468 32 DF E5 LD (OLDDRV),A ;drive. -3428 E46B 7E LD A,(HL) ;and save first byte of fcb also. -3429 E46C 32 E0 E5 LD (AUTOFLAG),A ;this must be non-zero. -3430 E46F E6 E0 AND 0E0H ;whats this for (bits 6,7 are used for -3431 E471 77 LD (HL),A ;something)? -3432 E472 CD 45 E4 CALL SETDSK ;select and log in this drive. -3433 E475 3A 41 DB AUTOSL1:LD A,(USERNO) ;move user number into fcb. -3434 E478 2A 43 DB LD HL,(PARAMS) ;(* upper half of first byte *) -3435 E47B B6 OR (HL) -3436 E47C 77 LD (HL),A -3437 E47D C9 RET ;and return (all done). -3438 E47E ; -3439 E47E ; Function to return the current cp/m version number. -3440 E47E ; -3441 E47E 3E 22 GETVER: LD A,022H ;version 2.2 -3442 E480 C3 01 DB JP SETSTAT -3443 E483 ; -3444 E483 ; Function to reset the disk system. -3445 E483 ; -3446 E483 21 00 00 RSTDSK: LD HL,0 ;clear write protect status and log -3447 E486 22 AD E5 LD (WRTPRT),HL ;in vector. -3448 E489 22 AF E5 LD (LOGIN),HL -3449 E48C AF XOR A ;select drive 'A'. -3450 E48D 32 42 DB LD (ACTIVE),A -3451 E490 21 80 00 LD HL,TBUFF ;setup default dma address. -3452 E493 22 B1 E5 LD (USERDMA),HL -3453 E496 CD DA DD CALL DEFDMA -3454 E499 C3 21 E4 JP LOGINDRV ;now log in drive 'A'. -3455 E49C ; -3456 E49C ; Function to open a specified file. -3457 E49C ; -3458 E49C CD 72 DD OPENFIL:CALL CLEARS2 ;clear 's2' byte. -3459 E49F CD 51 E4 CALL AUTOSEL ;select proper disk. -3460 E4A2 C3 51 E0 JP OPENIT ;and open the file. -3461 E4A5 ; -3462 E4A5 ; Function to close a specified file. -3463 E4A5 ; -3464 E4A5 CD 51 E4 CLOSEFIL: CALL AUTOSEL ;select proper disk. -3465 E4A8 C3 A2 E0 JP CLOSEIT ;and close the file. -3466 E4AB ; -3467 E4AB ; Function to return the first occurence of a specified file -3468 E4AB ; name. If the first byte of the fcb is '?' then the name will -3469 E4AB ; not be checked (get the first entry no matter what). -3470 E4AB ; -3471 E4AB 0E 00 GETFST: LD C,0 ;prepare for special search. -3472 E4AD EB EX DE,HL -3473 E4AE 7E LD A,(HL) ;is first byte a '?'? -3474 E4AF FE 3F CP '?' -3475 E4B1 CA C2 E4 JP Z,GETFST1 ;yes, just get very first entry (zero length match). -3476 E4B4 CD A6 DC CALL SETEXT ;get the extension byte from fcb. -3477 E4B7 7E LD A,(HL) ;is it '?'? if yes, then we want -3478 E4B8 FE 3F CP '?' ;an entry with a specific 's2' byte. -3479 E4BA C4 72 DD CALL NZ,CLEARS2 ;otherwise, look for a zero 's2' byte. -3480 E4BD CD 51 E4 CALL AUTOSEL ;select proper drive. -3481 E4C0 0E 0F LD C,15 ;compare bytes 0-14 in fcb (12&13 excluded). -3482 E4C2 CD 18 DF GETFST1:CALL FINDFST ;find an entry and then move it into -3483 E4C5 C3 E9 DD JP MOVEDIR ;the users dma space. -3484 E4C8 ; -3485 E4C8 ; Function to return the next occurence of a file name. -3486 E4C8 ; -3487 E4C8 2A D9 E5 GETNXT: LD HL,(SAVEFCB) ;restore pointers. note that no -3488 E4CB 22 43 DB LD (PARAMS),HL ;other dbos calls are allowed. -3489 E4CE CD 51 E4 CALL AUTOSEL ;no error will be returned, but the -3490 E4D1 CD 2D DF CALL FINDNXT ;results will be wrong. -3491 E4D4 C3 E9 DD JP MOVEDIR -3492 E4D7 ; -3493 E4D7 ; Function to delete a file by name. -3494 E4D7 ; -3495 E4D7 CD 51 E4 DELFILE:CALL AUTOSEL ;select proper drive. -3496 E4DA CD 9C DF CALL ERAFILE ;erase the file. -3497 E4DD C3 01 DF JP STSTATUS ;set status and return. -3498 E4E0 ; -3499 E4E0 ; Function to execute a sequential read of the specified -3500 E4E0 ; record number. -3501 E4E0 ; -3502 E4E0 CD 51 E4 READSEQ:CALL AUTOSEL ;select proper drive then read. -3503 E4E3 C3 BC E1 JP RDSEQ -3504 E4E6 ; -3505 E4E6 ; Function to write the net sequential record. -3506 E4E6 ; -3507 E4E6 CD 51 E4 WRTSEQ: CALL AUTOSEL ;select proper drive then write. -3508 E4E9 C3 FE E1 JP WTSEQ -3509 E4EC ; -3510 E4EC ; Create a file function. -3511 E4EC ; -3512 E4EC CD 72 DD FCREATE:CALL CLEARS2 ;clear the 's2' byte on all creates. -3513 E4EF CD 51 E4 CALL AUTOSEL ;select proper drive and get the next -3514 E4F2 C3 24 E1 JP GETEMPTY ;empty directory space. -3515 E4F5 ; -3516 E4F5 ; Function to rename a file. -3517 E4F5 ; -3518 E4F5 CD 51 E4 RENFILE:CALL AUTOSEL ;select proper drive and then switch -3519 E4F8 CD 16 E0 CALL CHGNAMES ;file names. -3520 E4FB C3 01 DF JP STSTATUS -3521 E4FE ; -3522 E4FE ; Function to return the login vector. -3523 E4FE ; -3524 E4FE 2A AF E5 GETLOG: LD HL,(LOGIN) -3525 E501 C3 29 E5 JP GETPRM1 -3526 E504 ; -3527 E504 ; Function to return the current disk assignment. -3528 E504 ; -3529 E504 3A 42 DB GETCRNT:LD A,(ACTIVE) -3530 E507 C3 01 DB JP SETSTAT -3531 E50A ; -3532 E50A ; Function to set the dma address. -3533 E50A ; -3534 E50A EB PUTDMA: EX DE,HL -3535 E50B 22 B1 E5 LD (USERDMA),HL ;save in our space and then get to -3536 E50E C3 DA DD JP DEFDMA ;the bios with this also. -3537 E511 ; -3538 E511 ; Function to return the allocation vector. -3539 E511 ; -3540 E511 2A BF E5 GETALOC:LD HL,(ALOCVECT) -3541 E514 C3 29 E5 JP GETPRM1 -3542 E517 ; -3543 E517 ; Function to return the read-only status vector. -3544 E517 ; -3545 E517 2A AD E5 GETROV: LD HL,(WRTPRT) -3546 E51A C3 29 E5 JP GETPRM1 -3547 E51D ; -3548 E51D ; Function to set the file attributes (read-only, system). -3549 E51D ; -3550 E51D CD 51 E4 SETATTR:CALL AUTOSEL ;select proper drive then save attributes. -3551 E520 CD 3B E0 CALL SAVEATTR -3552 E523 C3 01 DF JP STSTATUS -3553 E526 ; -3554 E526 ; Function to return the address of the disk parameter block -3555 E526 ; for the current drive. -3556 E526 ; -3557 E526 2A BB E5 GETPARM:LD HL,(DISKPB) -3558 E529 22 45 DB GETPRM1:LD (STATUS),HL -3559 E52C C9 RET -3560 E52D ; -3561 E52D ; Function to get or set the user number. If (E) was (FF) -3562 E52D ; then this is a request to return the current user number. -3563 E52D ; Else set the user number from (E). -3564 E52D ; -3565 E52D 3A D6 E5 GETUSER:LD A,(EPARAM) ;get parameter. -3566 E530 FE FF CP 0FFH ;get user number? -3567 E532 C2 3B E5 JP NZ,SETUSER -3568 E535 3A 41 DB LD A,(USERNO) ;yes, just do it. -3569 E538 C3 01 DB JP SETSTAT -3570 E53B E6 1F SETUSER:AND 1FH ;no, we should set it instead. keep low -3571 E53D 32 41 DB LD (USERNO),A ;bits (0-4) only. -3572 E540 C9 RET -3573 E541 ; -3574 E541 ; Function to read a random record from a file. -3575 E541 ; -3576 E541 CD 51 E4 RDRANDOM: CALL AUTOSEL ;select proper drive and read. -3577 E544 C3 93 E3 JP READRAN -3578 E547 ; -3579 E547 ; Function to compute the file size for random files. -3580 E547 ; -3581 E547 CD 51 E4 WTRANDOM: CALL AUTOSEL ;select proper drive and write. -3582 E54A C3 9C E3 JP WRITERAN -3583 E54D ; -3584 E54D ; Function to compute the size of a random file. -3585 E54D ; -3586 E54D CD 51 E4 FILESIZE: CALL AUTOSEL ;select proper drive and check file length -3587 E550 C3 D2 E3 JP RANSIZE -3588 E553 ; -3589 E553 ; Function #37. This allows a program to log off any drives. -3590 E553 ; On entry, set (DE) to contain a word with bits set for those -3591 E553 ; drives that are to be logged off. The log-in vector and the -3592 E553 ; write protect vector will be updated. This must be a M/PM -3593 E553 ; special function. -3594 E553 ; -3595 E553 2A 43 DB LOGOFF: LD HL,(PARAMS) ;get drives to log off. -3596 E556 7D LD A,L ;for each bit that is set, we want -3597 E557 2F CPL ;to clear that bit in (LOGIN) -3598 E558 5F LD E,A ;and (WRTPRT). -3599 E559 7C LD A,H -3600 E55A 2F CPL -3601 E55B 2A AF E5 LD HL,(LOGIN) ;reset the login vector. -3602 E55E A4 AND H -3603 E55F 57 LD D,A -3604 E560 7D LD A,L -3605 E561 A3 AND E -3606 E562 5F LD E,A -3607 E563 2A AD E5 LD HL,(WRTPRT) -3608 E566 EB EX DE,HL -3609 E567 22 AF E5 LD (LOGIN),HL ;and save. -3610 E56A 7D LD A,L ;now do the write protect vector. -3611 E56B A3 AND E -3612 E56C 6F LD L,A -3613 E56D 7C LD A,H -3614 E56E A2 AND D -3615 E56F 67 LD H,A -3616 E570 22 AD E5 LD (WRTPRT),HL ;and save. all done. -3617 E573 C9 RET -3618 E574 ; -3619 E574 ; Get here to return to the user. -3620 E574 ; -3621 E574 3A DE E5 GOBACK: LD A,(AUTO) ;was auto select activated? -3622 E577 B7 OR A -3623 E578 CA 91 E5 JP Z,GOBACK1 -3624 E57B 2A 43 DB LD HL,(PARAMS) ;yes, but was a change made? -3625 E57E 36 00 LD (HL),0 ;(* reset first byte of fcb *) -3626 E580 3A E0 E5 LD A,(AUTOFLAG) -3627 E583 B7 OR A -3628 E584 CA 91 E5 JP Z,GOBACK1 -3629 E587 77 LD (HL),A ;yes, reset first byte properly. -3630 E588 3A DF E5 LD A,(OLDDRV) ;and get the old drive and select it. -3631 E58B 32 D6 E5 LD (EPARAM),A -3632 E58E CD 45 E4 CALL SETDSK -3633 E591 2A 0F DB GOBACK1:LD HL,(USRSTACK) ;reset the users stack pointer. -3634 E594 F9 LD SP,HL -3635 E595 2A 45 DB LD HL,(STATUS) ;get return status. -3636 E598 7D LD A,L ;force version 1.4 compatability. -3637 E599 44 LD B,H -3638 E59A C9 RET ;and go back to user. -3639 E59B ; -3640 E59B ; Function #40. This is a special entry to do random i/o. -3641 E59B ; For the case where we are writing to unused disk space, this -3642 E59B ; space will be zeroed out first. This must be a M/PM special -3643 E59B ; purpose function, because why would any normal program even -3644 E59B ; care about the previous contents of a sector about to be -3645 E59B ; written over. -3646 E59B ; -3647 E59B CD 51 E4 WTSPECL:CALL AUTOSEL ;select proper drive. -3648 E59E 3E 02 LD A,2 ;use special write mode. -3649 E5A0 32 D5 E5 LD (MODE),A -3650 E5A3 0E 00 LD C,0 ;set write indicator. -3651 E5A5 CD 07 E3 CALL POSITN1 ;position the file. -3652 E5A8 CC 03 E2 CALL Z,WTSEQ1 ;and write (if no errors). -3653 E5AB C9 RET -3654 E5AC ; -3655 E5AC ;************************************************************** -3656 E5AC ;* -3657 E5AC ;* BDOS data storage pool. -3658 E5AC ;* -3659 E5AC ;************************************************************** -3660 E5AC ; -3661 E5AC E5 EMPTYFCB: .DB 0E5H ;empty directory segment indicator. -3662 E5AD 00 00 WRTPRT: .DW 0 ;write protect status for all 16 drives. -3663 E5AF 00 00 LOGIN: .DW 0 ;drive active word (1 bit per drive). -3664 E5B1 80 00 USERDMA:.DW 080H ;user's dma address (defaults to 80h). -3665 E5B3 ; -3666 E5B3 ; Scratch areas from parameter block. -3667 E5B3 ; -3668 E5B3 00 00 SCRATCH1: .DW 0 ;relative position within dir segment for file (0-3). -3669 E5B5 00 00 SCRATCH2: .DW 0 ;last selected track number. -3670 E5B7 00 00 SCRATCH3: .DW 0 ;last selected sector number. -3671 E5B9 ; -3672 E5B9 ; Disk storage areas from parameter block. -3673 E5B9 ; -3674 E5B9 00 00 DIRBUF: .DW 0 ;address of directory buffer to use. -3675 E5BB 00 00 DISKPB: .DW 0 ;contains address of disk parameter block. -3676 E5BD 00 00 CHKVECT:.DW 0 ;address of check vector. -3677 E5BF 00 00 ALOCVECT: .DW 0 ;address of allocation vector (bit map). -3678 E5C1 ; -3679 E5C1 ; Parameter block returned from the bios. -3680 E5C1 ; -3681 E5C1 00 00 SECTORS:.DW 0 ;sectors per track from bios. -3682 E5C3 00 BLKSHFT:.DB 0 ;block shift. -3683 E5C4 00 BLKMASK:.DB 0 ;block mask. -3684 E5C5 00 EXTMASK:.DB 0 ;extent mask. -3685 E5C6 00 00 DSKSIZE:.DW 0 ;disk size from bios (number of blocks-1). -3686 E5C8 00 00 DIRSIZE:.DW 0 ;directory size. -3687 E5CA 00 00 ALLOC0: .DW 0 ;storage for first bytes of bit map (dir space used). -3688 E5CC 00 00 ALLOC1: .DW 0 -3689 E5CE 00 00 OFFSET: .DW 0 ;first usable track number. -3690 E5D0 00 00 XLATE: .DW 0 ;sector translation table address. -3691 E5D2 ; -3692 E5D2 ; -3693 E5D2 00 CLOSEFLG: .DB 0 ;close flag (=0ffh is extent written ok). -3694 E5D3 00 RDWRTFLG: .DB 0 ;read/write flag (0ffh=read, 0=write). -3695 E5D4 00 FNDSTAT:.DB 0 ;filename found status (0=found first entry). -3696 E5D5 00 MODE: .DB 0 ;I/o mode select (0=random, 1=sequential, 2=special random). -3697 E5D6 00 EPARAM: .DB 0 ;storage for register (E) on entry to bdos. -3698 E5D7 00 RELBLOCK: .DB 0 ;relative position within fcb of block number written. -3699 E5D8 00 COUNTER:.DB 0 ;byte counter for directory name searches. -3700 E5D9 00 00 00 00 SAVEFCB:.DW 0,0 ;save space for address of fcb (for directory searches). -3701 E5DD 00 BIGDISK:.DB 0 ;if =0 then disk is > 256 blocks long. -3702 E5DE 00 AUTO: .DB 0 ;if non-zero, then auto select activated. -3703 E5DF 00 OLDDRV: .DB 0 ;on auto select, storage for previous drive. -3704 E5E0 00 AUTOFLAG: .DB 0 ;if non-zero, then auto select changed drives. -3705 E5E1 00 SAVNXT: .DB 0 ;storage for next record number to access. -3706 E5E2 00 SAVEXT: .DB 0 ;storage for extent number of file. -3707 E5E3 00 00 SAVNREC:.DW 0 ;storage for number of records in file. -3708 E5E5 00 00 BLKNMBR:.DW 0 ;block number (physical sector) used within a file or logical sect -3709 E5E7 00 00 LOGSECT:.DW 0 ;starting logical (128 byte) sector of block (physical sector). -3710 E5E9 00 FCBPOS: .DB 0 ;relative position within buffer for fcb of file of interest. -3711 E5EA 00 00 FILEPOS:.DW 0 ;files position within directory (0 to max entries -1). -3712 E5EC ; -3713 E5EC ; Disk directory buffer checksum bytes. One for each of the -3714 E5EC ; 16 possible drives. -3715 E5EC ; -3716 E5EC 000000000000CKSUMTBL: .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -3716 E5F2 00000000000000000000 -3717 E5FC ; -3718 E5FC ; Extra space ? -3719 E5FC ; -3720 E5FC 00 00 00 00 .DB 0,0,0,0 -3721 E600 ; -3722 E600 ;************************************************************** -3723 E600 ;* -3724 E600 ;* B I O S J U M P T A B L E -3725 E600 ;* -3726 E600 ;************************************************************** -3727 E600 ; -3728 E600 C3 00 00 BOOT: JP 0 ;NOTE WE USE FAKE DESTINATIONS -3729 E603 C3 00 00 WBOOT: JP 0 -3730 E606 C3 00 00 CONST: JP 0 -3731 E609 C3 00 00 CONIN: JP 0 -3732 E60C C3 00 00 CONOUT: JP 0 -3733 E60F C3 00 00 LIST: JP 0 -3734 E612 C3 00 00 PUNCH: JP 0 -3735 E615 C3 00 00 READER: JP 0 -3736 E618 C3 00 00 HOME: JP 0 -3737 E61B C3 00 00 SELDSK: JP 0 -3738 E61E C3 00 00 SETTRK: JP 0 -3739 E621 C3 00 00 SETSEC: JP 0 -3740 E624 C3 00 00 SETDMA: JP 0 -3741 E627 C3 00 00 READ: JP 0 -3742 E62A C3 00 00 WRITE: JP 0 -3743 E62D C3 00 00 PRSTAT: JP 0 -3744 E630 C3 00 00 SECTRN: JP 0 -3745 E633 ; -3746 E633 ;* -3747 E633 ;****************** E N D O F C P / M ***************** -3748 E633 ;* -3749 E633 -3750 E633 .END -tasm: Number of errors = 0 +0001 0000 ;************************************************************** +0002 0000 ;* +0003 0000 ;* C P / M version 2 . 2 +0004 0000 ;* +0005 0000 ;* Reconstructed from memory image on February 27, 1981 +0006 0000 ;* +0007 0000 ;* by Clark A. Calkins +0008 0000 ;* +0009 0000 ;************************************************************** +0010 0000 ; +0011 0000 ; Set memory limit here. This is the amount of contigeous +0012 0000 ; ram starting from 0000. CP/M will reside at the end of this space. +0013 0000 ; +0014 0000 +0015 0000 IOBYTE .EQU 3 ;i/o definition byte. +0016 0000 TDRIVE .EQU 4 ;current drive name and user number. +0017 0000 ENTRY .EQU 5 ;entry point for the cp/m bdos. +0018 0000 TFCB .EQU 5CH ;default file control block. +0019 0000 TBUFF .EQU 80H ;i/o buffer and command line storage. +0020 0000 TBASE .EQU 100H ;transiant program storage area. +0021 0000 ; +0022 0000 ; Set control character equates. +0023 0000 ; +0024 0000 CNTRLC .EQU 3 ;control-c +0025 0000 CNTRLE .EQU 05H ;control-e +0026 0000 BS .EQU 08H ;backspace +0027 0000 TAB .EQU 09H ;tab +0028 0000 LF .EQU 0AH ;line feed +0029 0000 FF .EQU 0CH ;form feed +0030 0000 CR .EQU 0DH ;carriage return +0031 0000 CNTRLP .EQU 10H ;control-p +0032 0000 CNTRLR .EQU 12H ;control-r +0033 0000 CNTRLS .EQU 13H ;control-s +0034 0000 CNTRLU .EQU 15H ;control-u +0035 0000 CNTRLX .EQU 18H ;control-x +0036 0000 CNTRLZ .EQU 1AH ;control-z (end-of-file mark) +0037 0000 DEL .EQU 7FH ;rubout +0038 0000 ; +0039 0000 ; Set origin for CP/M +0040 0000 ; +0041 D000 .ORG 0D000H +0042 D000 ; +0043 D000 C3 5C D3 CBASE: JP COMMAND ;execute command processor (ccp). +0044 D003 C3 58 D3 JP CLEARBUF ;entry to empty input buffer before starting ccp. +0045 D006 +0046 D006 ; +0047 D006 ; Standard cp/m ccp input buffer. Format is (max length), +0048 D006 ; (actual length), (char #1), (char #2), (char #3), etc. +0049 D006 ; +0050 D006 7F INBUFF: .DB 127 ;length of input buffer. +0051 D007 00 .DB 0 ;current length of contents. +0052 D008 43 6F 70 79 .TEXT "Copyright" +0052 D00C 72 69 67 68 +0052 D010 74 +0053 D011 20 31 39 37 .TEXT " 1979 (c) by Digital Research " +0053 D015 39 20 28 63 +0053 D019 29 20 62 79 +0053 D01D 20 44 69 67 +0053 D021 69 74 61 6C +0053 D025 20 52 65 73 +0053 D029 65 61 72 63 +0053 D02D 68 20 20 20 +0053 D031 20 20 20 +0054 D034 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0054 D038 00 00 00 00 +0054 D03C 00 00 00 00 +0054 D040 00 00 00 00 +0054 D044 00 00 00 00 +0054 D048 00 00 00 +0055 D04B 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0055 D04F 00 00 00 00 +0055 D053 00 00 00 00 +0055 D057 00 00 00 00 +0055 D05B 00 00 00 00 +0055 D05F 00 00 00 +0056 D062 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0056 D066 00 00 00 00 +0056 D06A 00 00 00 00 +0056 D06E 00 00 00 00 +0056 D072 00 00 00 00 +0056 D076 00 00 00 +0057 D079 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +0057 D07D 00 00 00 00 +0057 D081 00 00 00 00 +0057 D085 00 00 00 +0058 D088 08 D0 INPOINT:.DW INBUFF+2 ;input line pointer +0059 D08A 00 00 NAMEPNT:.DW 0 ;input line pointer used for error message. Points to +0060 D08C ; ;start of name in error. +0061 D08C ; +0062 D08C ; Routine to print (A) on the console. All registers used. +0063 D08C ; +0064 D08C 5F PRINT: LD E,A ;setup bdos call. +0065 D08D 0E 02 LD C,2 +0066 D08F C3 05 00 JP ENTRY +0067 D092 ; +0068 D092 ; Routine to print (A) on the console and to save (BC). +0069 D092 ; +0070 D092 C5 PRINTB: PUSH BC +0071 D093 CD 8C D0 CALL PRINT +0072 D096 C1 POP BC +0073 D097 C9 RET +0074 D098 ; +0075 D098 ; Routine to send a carriage return, line feed combination +0076 D098 ; to the console. +0077 D098 ; +0078 D098 3E 0D CRLF: LD A,CR +0079 D09A CD 92 D0 CALL PRINTB +0080 D09D 3E 0A LD A,LF +0081 D09F C3 92 D0 JP PRINTB +0082 D0A2 ; +0083 D0A2 ; Routine to send one space to the console and save (BC). +0084 D0A2 ; +0085 D0A2 3E 20 SPACE: LD A,' ' +0086 D0A4 C3 92 D0 JP PRINTB +0087 D0A7 ; +0088 D0A7 ; Routine to print character string pointed to be (BC) on the +0089 D0A7 ; console. It must terminate with a null byte. +0090 D0A7 ; +0091 D0A7 C5 PLINE: PUSH BC +0092 D0A8 CD 98 D0 CALL CRLF +0093 D0AB E1 POP HL +0094 D0AC 7E PLINE2: LD A,(HL) +0095 D0AD B7 OR A +0096 D0AE C8 RET Z +0097 D0AF 23 INC HL +0098 D0B0 E5 PUSH HL +0099 D0B1 CD 8C D0 CALL PRINT +0100 D0B4 E1 POP HL +0101 D0B5 C3 AC D0 JP PLINE2 +0102 D0B8 ; +0103 D0B8 ; Routine to reset the disk system. +0104 D0B8 ; +0105 D0B8 0E 0D RESDSK: LD C,13 +0106 D0BA C3 05 00 JP ENTRY +0107 D0BD ; +0108 D0BD ; Routine to select disk (A). +0109 D0BD ; +0110 D0BD 5F DSKSEL: LD E,A +0111 D0BE 0E 0E LD C,14 +0112 D0C0 C3 05 00 JP ENTRY +0113 D0C3 ; +0114 D0C3 ; Routine to call bdos and save the return code. The zero +0115 D0C3 ; flag is set on a return of 0ffh. +0116 D0C3 ; +0117 D0C3 CD 05 00 ENTRY1: CALL ENTRY +0118 D0C6 32 EE D7 LD (RTNCODE),A ;save return code. +0119 D0C9 3C INC A ;set zero if 0ffh returned. +0120 D0CA C9 RET +0121 D0CB ; +0122 D0CB ; Routine to open a file. (DE) must point to the FCB. +0123 D0CB ; +0124 D0CB 0E 0F OPEN: LD C,15 +0125 D0CD C3 C3 D0 JP ENTRY1 +0126 D0D0 ; +0127 D0D0 ; Routine to open file at (FCB). +0128 D0D0 ; +0129 D0D0 AF OPENFCB:XOR A ;clear the record number byte at fcb+32 +0130 D0D1 32 ED D7 LD (FCB+32),A +0131 D0D4 11 CD D7 LD DE,FCB +0132 D0D7 C3 CB D0 JP OPEN +0133 D0DA ; +0134 D0DA ; Routine to close a file. (DE) points to FCB. +0135 D0DA ; +0136 D0DA 0E 10 CLOSE: LD C,16 +0137 D0DC C3 C3 D0 JP ENTRY1 +0138 D0DF ; +0139 D0DF ; Routine to search for the first file with ambigueous name +0140 D0DF ; (DE). +0141 D0DF ; +0142 D0DF 0E 11 SRCHFST:LD C,17 +0143 D0E1 C3 C3 D0 JP ENTRY1 +0144 D0E4 ; +0145 D0E4 ; Search for the next ambigeous file name. +0146 D0E4 ; +0147 D0E4 0E 12 SRCHNXT:LD C,18 +0148 D0E6 C3 C3 D0 JP ENTRY1 +0149 D0E9 ; +0150 D0E9 ; Search for file at (FCB). +0151 D0E9 ; +0152 D0E9 11 CD D7 SRCHFCB:LD DE,FCB +0153 D0EC C3 DF D0 JP SRCHFST +0154 D0EF ; +0155 D0EF ; Routine to delete a file pointed to by (DE). +0156 D0EF ; +0157 D0EF 0E 13 DELETE: LD C,19 +0158 D0F1 C3 05 00 JP ENTRY +0159 D0F4 ; +0160 D0F4 ; Routine to call the bdos and set the zero flag if a zero +0161 D0F4 ; status is returned. +0162 D0F4 ; +0163 D0F4 CD 05 00 ENTRY2: CALL ENTRY +0164 D0F7 B7 OR A ;set zero flag if appropriate. +0165 D0F8 C9 RET +0166 D0F9 ; +0167 D0F9 ; Routine to read the next record from a sequential file. +0168 D0F9 ; (DE) points to the FCB. +0169 D0F9 ; +0170 D0F9 0E 14 RDREC: LD C,20 +0171 D0FB C3 F4 D0 JP ENTRY2 +0172 D0FE ; +0173 D0FE ; Routine to read file at (FCB). +0174 D0FE ; +0175 D0FE 11 CD D7 READFCB:LD DE,FCB +0176 D101 C3 F9 D0 JP RDREC +0177 D104 ; +0178 D104 ; Routine to write the next record of a sequential file. +0179 D104 ; (DE) points to the FCB. +0180 D104 ; +0181 D104 0E 15 WRTREC: LD C,21 +0182 D106 C3 F4 D0 JP ENTRY2 +0183 D109 ; +0184 D109 ; Routine to create the file pointed to by (DE). +0185 D109 ; +0186 D109 0E 16 CREATE: LD C,22 +0187 D10B C3 C3 D0 JP ENTRY1 +0188 D10E ; +0189 D10E ; Routine to rename the file pointed to by (DE). Note that +0190 D10E ; the new name starts at (DE+16). +0191 D10E ; +0192 D10E 0E 17 RENAM: LD C,23 +0193 D110 C3 05 00 JP ENTRY +0194 D113 ; +0195 D113 ; Get the current user code. +0196 D113 ; +0197 D113 1E FF GETUSR: LD E,0FFH +0198 D115 ; +0199 D115 ; Routne to get or set the current user code. +0200 D115 ; If (E) is FF then this is a GET, else it is a SET. +0201 D115 ; +0202 D115 0E 20 GETSETUC: LD C,32 +0203 D117 C3 05 00 JP ENTRY +0204 D11A ; +0205 D11A ; Routine to set the current drive byte at (TDRIVE). +0206 D11A ; +0207 D11A CD 13 D1 SETCDRV:CALL GETUSR ;get user number +0208 D11D 87 ADD A,A ;and shift into the upper 4 bits. +0209 D11E 87 ADD A,A +0210 D11F 87 ADD A,A +0211 D120 87 ADD A,A +0212 D121 21 EF D7 LD HL,CDRIVE ;now add in the current drive number. +0213 D124 B6 OR (HL) +0214 D125 32 04 00 LD (TDRIVE),A ;and save. +0215 D128 C9 RET +0216 D129 ; +0217 D129 ; Move currently active drive down to (TDRIVE). +0218 D129 ; +0219 D129 3A EF D7 MOVECD: LD A,(CDRIVE) +0220 D12C 32 04 00 LD (TDRIVE),A +0221 D12F C9 RET +0222 D130 ; +0223 D130 ; Routine to convert (A) into upper case ascii. Only letters +0224 D130 ; are affected. +0225 D130 ; +0226 D130 FE 61 UPPER: CP 'a' ;check for letters in the range of 'a' to 'z'. +0227 D132 D8 RET C +0228 D133 FE 7B CP '{' +0229 D135 D0 RET NC +0230 D136 E6 5F AND 5FH ;convert it if found. +0231 D138 C9 RET +0232 D139 ; +0233 D139 ; Routine to get a line of input. We must check to see if the +0234 D139 ; user is in (BATCH) mode. If so, then read the input from file +0235 D139 ; ($$$.SUB). At the end, reset to console input. +0236 D139 ; +0237 D139 3A AB D7 GETINP: LD A,(BATCH) ;if =0, then use console input. +0238 D13C B7 OR A +0239 D13D CA 96 D1 JP Z,GETINP1 +0240 D140 ; +0241 D140 ; Use the submit file ($$$.sub) which is prepared by a +0242 D140 ; SUBMIT run. It must be on drive (A) and it will be deleted +0243 D140 ; if and error occures (like eof). +0244 D140 ; +0245 D140 3A EF D7 LD A,(CDRIVE) ;select drive 0 if need be. +0246 D143 B7 OR A +0247 D144 3E 00 LD A,0 ;always use drive A for submit. +0248 D146 C4 BD D0 CALL NZ,DSKSEL ;select it if required. +0249 D149 11 AC D7 LD DE,BATCHFCB +0250 D14C CD CB D0 CALL OPEN ;look for it. +0251 D14F CA 96 D1 JP Z,GETINP1 ;if not there, use normal input. +0252 D152 3A BB D7 LD A,(BATCHFCB+15) ;get last record number+1. +0253 D155 3D DEC A +0254 D156 32 CC D7 LD (BATCHFCB+32),A +0255 D159 11 AC D7 LD DE,BATCHFCB +0256 D15C CD F9 D0 CALL RDREC ;read last record. +0257 D15F C2 96 D1 JP NZ,GETINP1 ;quit on end of file. +0258 D162 ; +0259 D162 ; Move this record into input buffer. +0260 D162 ; +0261 D162 11 07 D0 LD DE,INBUFF+1 +0262 D165 21 80 00 LD HL,TBUFF ;data was read into buffer here. +0263 D168 06 80 LD B,128 ;all 128 characters may be used. +0264 D16A CD 42 D4 CALL HL2DE ;(HL) to (DE), (B) bytes. +0265 D16D 21 BA D7 LD HL,BATCHFCB+14 +0266 D170 36 00 LD (HL),0 ;zero out the 's2' byte. +0267 D172 23 INC HL ;and decrement the record count. +0268 D173 35 DEC (HL) +0269 D174 11 AC D7 LD DE,BATCHFCB ;close the batch file now. +0270 D177 CD DA D0 CALL CLOSE +0271 D17A CA 96 D1 JP Z,GETINP1 ;quit on an error. +0272 D17D 3A EF D7 LD A,(CDRIVE) ;re-select previous drive if need be. +0273 D180 B7 OR A +0274 D181 C4 BD D0 CALL NZ,DSKSEL ;don't do needless selects. +0275 D184 ; +0276 D184 ; Print line just read on console. +0277 D184 ; +0278 D184 21 08 D0 LD HL,INBUFF+2 +0279 D187 CD AC D0 CALL PLINE2 +0280 D18A CD C2 D1 CALL CHKCON ;check console, quit on a key. +0281 D18D CA A7 D1 JP Z,GETINP2 ;jump if no key is pressed. +0282 D190 ; +0283 D190 ; Terminate the submit job on any keyboard input. Delete this +0284 D190 ; file such that it is not re-started and jump to normal keyboard +0285 D190 ; input section. +0286 D190 ; +0287 D190 CD DD D1 CALL DELBATCH ;delete the batch file. +0288 D193 C3 82 D3 JP CMMND1 ;and restart command input. +0289 D196 ; +0290 D196 ; Get here for normal keyboard input. Delete the submit file +0291 D196 ; incase there was one. +0292 D196 ; +0293 D196 CD DD D1 GETINP1:CALL DELBATCH ;delete file ($$$.sub). +0294 D199 CD 1A D1 CALL SETCDRV ;reset active disk. +0295 D19C 0E 0A LD C,10 ;get line from console device. +0296 D19E 11 06 D0 LD DE,INBUFF +0297 D1A1 CD 05 00 CALL ENTRY +0298 D1A4 CD 29 D1 CALL MOVECD ;reset current drive (again). +0299 D1A7 ; +0300 D1A7 ; Convert input line to upper case. +0301 D1A7 ; +0302 D1A7 21 07 D0 GETINP2:LD HL,INBUFF+1 +0303 D1AA 46 LD B,(HL) ;(B)=character counter. +0304 D1AB 23 GETINP3:INC HL +0305 D1AC 78 LD A,B ;end of the line? +0306 D1AD B7 OR A +0307 D1AE CA BA D1 JP Z,GETINP4 +0308 D1B1 7E LD A,(HL) ;convert to upper case. +0309 D1B2 CD 30 D1 CALL UPPER +0310 D1B5 77 LD (HL),A +0311 D1B6 05 DEC B ;adjust character count. +0312 D1B7 C3 AB D1 JP GETINP3 +0313 D1BA 77 GETINP4:LD (HL),A ;add trailing null. +0314 D1BB 21 08 D0 LD HL,INBUFF+2 +0315 D1BE 22 88 D0 LD (INPOINT),HL ;reset input line pointer. +0316 D1C1 C9 RET +0317 D1C2 ; +0318 D1C2 ; Routine to check the console for a key pressed. The zero +0319 D1C2 ; flag is set is none, else the character is returned in (A). +0320 D1C2 ; +0321 D1C2 0E 0B CHKCON: LD C,11 ;check console. +0322 D1C4 CD 05 00 CALL ENTRY +0323 D1C7 B7 OR A +0324 D1C8 C8 RET Z ;return if nothing. +0325 D1C9 0E 01 LD C,1 ;else get character. +0326 D1CB CD 05 00 CALL ENTRY +0327 D1CE B7 OR A ;clear zero flag and return. +0328 D1CF C9 RET +0329 D1D0 ; +0330 D1D0 ; Routine to get the currently active drive number. +0331 D1D0 ; +0332 D1D0 0E 19 GETDSK: LD C,25 +0333 D1D2 C3 05 00 JP ENTRY +0334 D1D5 ; +0335 D1D5 ; Set the stabdard dma address. +0336 D1D5 ; +0337 D1D5 11 80 00 STDDMA: LD DE,TBUFF +0338 D1D8 ; +0339 D1D8 ; Routine to set the dma address to (DE). +0340 D1D8 ; +0341 D1D8 0E 1A DMASET: LD C,26 +0342 D1DA C3 05 00 JP ENTRY +0343 D1DD ; +0344 D1DD ; Delete the batch file created by SUBMIT. +0345 D1DD ; +0346 D1DD 21 AB D7 DELBATCH: LD HL,BATCH ;is batch active? +0347 D1E0 7E LD A,(HL) +0348 D1E1 B7 OR A +0349 D1E2 C8 RET Z +0350 D1E3 36 00 LD (HL),0 ;yes, de-activate it. +0351 D1E5 AF XOR A +0352 D1E6 CD BD D0 CALL DSKSEL ;select drive 0 for sure. +0353 D1E9 11 AC D7 LD DE,BATCHFCB ;and delete this file. +0354 D1EC CD EF D0 CALL DELETE +0355 D1EF 3A EF D7 LD A,(CDRIVE) ;reset current drive. +0356 D1F2 C3 BD D0 JP DSKSEL +0357 D1F5 ; +0358 D1F5 ; Check to two strings at (PATTRN1) and (PATTRN2). They must be +0359 D1F5 ; the same or we halt.... +0360 D1F5 ; +0361 D1F5 11 28 D3 VERIFY: LD DE,PATTRN1 ;these are the serial number bytes. +0362 D1F8 21 00 D8 LD HL,PATTRN2 ;ditto, but how could they be different? +0363 D1FB 06 06 LD B,6 ;6 bytes each. +0364 D1FD 1A VERIFY1:LD A,(DE) +0365 D1FE BE CP (HL) +0366 D1FF C2 CF D3 JP NZ,HALT ;jump to halt routine. +0367 D202 13 INC DE +0368 D203 23 INC HL +0369 D204 05 DEC B +0370 D205 C2 FD D1 JP NZ,VERIFY1 +0371 D208 C9 RET +0372 D209 ; +0373 D209 ; Print back file name with a '?' to indicate a syntax error. +0374 D209 ; +0375 D209 CD 98 D0 SYNERR: CALL CRLF ;end current line. +0376 D20C 2A 8A D0 LD HL,(NAMEPNT) ;this points to name in error. +0377 D20F 7E SYNERR1:LD A,(HL) ;print it until a space or null is found. +0378 D210 FE 20 CP ' ' +0379 D212 CA 22 D2 JP Z,SYNERR2 +0380 D215 B7 OR A +0381 D216 CA 22 D2 JP Z,SYNERR2 +0382 D219 E5 PUSH HL +0383 D21A CD 8C D0 CALL PRINT +0384 D21D E1 POP HL +0385 D21E 23 INC HL +0386 D21F C3 0F D2 JP SYNERR1 +0387 D222 3E 3F SYNERR2:LD A,'?' ;add trailing '?'. +0388 D224 CD 8C D0 CALL PRINT +0389 D227 CD 98 D0 CALL CRLF +0390 D22A CD DD D1 CALL DELBATCH ;delete any batch file. +0391 D22D C3 82 D3 JP CMMND1 ;and restart from console input. +0392 D230 ; +0393 D230 ; Check character at (DE) for legal command input. Note that the +0394 D230 ; zero flag is set if the character is a delimiter. +0395 D230 ; +0396 D230 1A CHECK: LD A,(DE) +0397 D231 B7 OR A +0398 D232 C8 RET Z +0399 D233 FE 20 CP ' ' ;control characters are not legal here. +0400 D235 DA 09 D2 JP C,SYNERR +0401 D238 C8 RET Z ;check for valid delimiter. +0402 D239 FE 3D CP '=' +0403 D23B C8 RET Z +0404 D23C FE 5F CP '_' +0405 D23E C8 RET Z +0406 D23F FE 2E CP '.' +0407 D241 C8 RET Z +0408 D242 FE 3A CP ':' +0409 D244 C8 RET Z +0410 D245 FE 3B CP 03BH ; ';' +0411 D247 C8 RET Z +0412 D248 FE 3C CP '<' +0413 D24A C8 RET Z +0414 D24B FE 3E CP '>' +0415 D24D C8 RET Z +0416 D24E C9 RET +0417 D24F ; +0418 D24F ; Get the next non-blank character from (DE). +0419 D24F ; +0420 D24F 1A NONBLANK: LD A,(DE) +0421 D250 B7 OR A ;string ends with a null. +0422 D251 C8 RET Z +0423 D252 FE 20 CP ' ' +0424 D254 C0 RET NZ +0425 D255 13 INC DE +0426 D256 C3 4F D2 JP NONBLANK +0427 D259 ; +0428 D259 ; Add (HL)=(HL)+(A) +0429 D259 ; +0430 D259 85 ADDHL: ADD A,L +0431 D25A 6F LD L,A +0432 D25B D0 RET NC ;take care of any carry. +0433 D25C 24 INC H +0434 D25D C9 RET +0435 D25E ; +0436 D25E ; Convert the first name in (FCB). +0437 D25E ; +0438 D25E 3E 00 CONVFST:LD A,0 +0439 D260 ; +0440 D260 ; Format a file name (convert * to '?', etc.). On return, +0441 D260 ; (A)=0 is an unambigeous name was specified. Enter with (A) equal to +0442 D260 ; the position within the fcb for the name (either 0 or 16). +0443 D260 ; +0444 D260 21 CD D7 CONVERT:LD HL,FCB +0445 D263 CD 59 D2 CALL ADDHL +0446 D266 E5 PUSH HL +0447 D267 E5 PUSH HL +0448 D268 AF XOR A +0449 D269 32 F0 D7 LD (CHGDRV),A ;initialize drive change flag. +0450 D26C 2A 88 D0 LD HL,(INPOINT) ;set (HL) as pointer into input line. +0451 D26F EB EX DE,HL +0452 D270 CD 4F D2 CALL NONBLANK ;get next non-blank character. +0453 D273 EB EX DE,HL +0454 D274 22 8A D0 LD (NAMEPNT),HL ;save pointer here for any error message. +0455 D277 EB EX DE,HL +0456 D278 E1 POP HL +0457 D279 1A LD A,(DE) ;get first character. +0458 D27A B7 OR A +0459 D27B CA 89 D2 JP Z,CONVRT1 +0460 D27E DE 40 SBC A,'A'-1 ;might be a drive name, convert to binary. +0461 D280 47 LD B,A ;and save. +0462 D281 13 INC DE ;check next character for a ':'. +0463 D282 1A LD A,(DE) +0464 D283 FE 3A CP ':' +0465 D285 CA 90 D2 JP Z,CONVRT2 +0466 D288 1B DEC DE ;nope, move pointer back to the start of the line. +0467 D289 3A EF D7 CONVRT1:LD A,(CDRIVE) +0468 D28C 77 LD (HL),A +0469 D28D C3 96 D2 JP CONVRT3 +0470 D290 78 CONVRT2:LD A,B +0471 D291 32 F0 D7 LD (CHGDRV),A ;set change in drives flag. +0472 D294 70 LD (HL),B +0473 D295 13 INC DE +0474 D296 ; +0475 D296 ; Convert the basic file name. +0476 D296 ; +0477 D296 06 08 CONVRT3:LD B,08H +0478 D298 CD 30 D2 CONVRT4:CALL CHECK +0479 D29B CA B9 D2 JP Z,CONVRT8 +0480 D29E 23 INC HL +0481 D29F FE 2A CP '*' ;note that an '*' will fill the remaining +0482 D2A1 C2 A9 D2 JP NZ,CONVRT5 ;field with '?'. +0483 D2A4 36 3F LD (HL),'?' +0484 D2A6 C3 AB D2 JP CONVRT6 +0485 D2A9 77 CONVRT5:LD (HL),A +0486 D2AA 13 INC DE +0487 D2AB 05 CONVRT6:DEC B +0488 D2AC C2 98 D2 JP NZ,CONVRT4 +0489 D2AF CD 30 D2 CONVRT7:CALL CHECK ;get next delimiter. +0490 D2B2 CA C0 D2 JP Z,GETEXT +0491 D2B5 13 INC DE +0492 D2B6 C3 AF D2 JP CONVRT7 +0493 D2B9 23 CONVRT8:INC HL ;blank fill the file name. +0494 D2BA 36 20 LD (HL),' ' +0495 D2BC 05 DEC B +0496 D2BD C2 B9 D2 JP NZ,CONVRT8 +0497 D2C0 ; +0498 D2C0 ; Get the extension and convert it. +0499 D2C0 ; +0500 D2C0 06 03 GETEXT: LD B,03H +0501 D2C2 FE 2E CP '.' +0502 D2C4 C2 E9 D2 JP NZ,GETEXT5 +0503 D2C7 13 INC DE +0504 D2C8 CD 30 D2 GETEXT1:CALL CHECK +0505 D2CB CA E9 D2 JP Z,GETEXT5 +0506 D2CE 23 INC HL +0507 D2CF FE 2A CP '*' +0508 D2D1 C2 D9 D2 JP NZ,GETEXT2 +0509 D2D4 36 3F LD (HL),'?' +0510 D2D6 C3 DB D2 JP GETEXT3 +0511 D2D9 77 GETEXT2:LD (HL),A +0512 D2DA 13 INC DE +0513 D2DB 05 GETEXT3:DEC B +0514 D2DC C2 C8 D2 JP NZ,GETEXT1 +0515 D2DF CD 30 D2 GETEXT4:CALL CHECK +0516 D2E2 CA F0 D2 JP Z,GETEXT6 +0517 D2E5 13 INC DE +0518 D2E6 C3 DF D2 JP GETEXT4 +0519 D2E9 23 GETEXT5:INC HL +0520 D2EA 36 20 LD (HL),' ' +0521 D2EC 05 DEC B +0522 D2ED C2 E9 D2 JP NZ,GETEXT5 +0523 D2F0 06 03 GETEXT6:LD B,3 +0524 D2F2 23 GETEXT7:INC HL +0525 D2F3 36 00 LD (HL),0 +0526 D2F5 05 DEC B +0527 D2F6 C2 F2 D2 JP NZ,GETEXT7 +0528 D2F9 EB EX DE,HL +0529 D2FA 22 88 D0 LD (INPOINT),HL ;save input line pointer. +0530 D2FD E1 POP HL +0531 D2FE ; +0532 D2FE ; Check to see if this is an ambigeous file name specification. +0533 D2FE ; Set the (A) register to non zero if it is. +0534 D2FE ; +0535 D2FE 01 0B 00 LD BC,11 ;set name length. +0536 D301 23 GETEXT8:INC HL +0537 D302 7E LD A,(HL) +0538 D303 FE 3F CP '?' ;any question marks? +0539 D305 C2 09 D3 JP NZ,GETEXT9 +0540 D308 04 INC B ;count them. +0541 D309 0D GETEXT9:DEC C +0542 D30A C2 01 D3 JP NZ,GETEXT8 +0543 D30D 78 LD A,B +0544 D30E B7 OR A +0545 D30F C9 RET +0546 D310 ; +0547 D310 ; CP/M command table. Note commands can be either 3 or 4 characters long. +0548 D310 ; +0549 D310 NUMCMDS .EQU 6 ;number of commands +0550 D310 44 49 52 20 CMDTBL: .TEXT "DIR " +0551 D314 45 52 41 20 .TEXT "ERA " +0552 D318 54 59 50 45 .TEXT "TYPE" +0553 D31C 53 41 56 45 .TEXT "SAVE" +0554 D320 52 45 4E 20 .TEXT "REN " +0555 D324 55 53 45 52 .TEXT "USER" +0556 D328 ; +0557 D328 ; The following six bytes must agree with those at (PATTRN2) +0558 D328 ; or cp/m will HALT. Why? +0559 D328 ; +0560 D328 00 16 00 00 PATTRN1:.DB 0,22,0,0,0,0 ;(* serial number bytes *). +0560 D32C 00 00 +0561 D32E ; +0562 D32E ; Search the command table for a match with what has just +0563 D32E ; been entered. If a match is found, then we jump to the +0564 D32E ; proper section. Else jump to (UNKNOWN). +0565 D32E ; On return, the (C) register is set to the command number +0566 D32E ; that matched (or NUMCMDS+1 if no match). +0567 D32E ; +0568 D32E 21 10 D3 SEARCH: LD HL,CMDTBL +0569 D331 0E 00 LD C,0 +0570 D333 79 SEARCH1:LD A,C +0571 D334 FE 06 CP NUMCMDS ;this commands exists. +0572 D336 D0 RET NC +0573 D337 11 CE D7 LD DE,FCB+1 ;check this one. +0574 D33A 06 04 LD B,4 ;max command length. +0575 D33C 1A SEARCH2:LD A,(DE) +0576 D33D BE CP (HL) +0577 D33E C2 4F D3 JP NZ,SEARCH3 ;not a match. +0578 D341 13 INC DE +0579 D342 23 INC HL +0580 D343 05 DEC B +0581 D344 C2 3C D3 JP NZ,SEARCH2 +0582 D347 1A LD A,(DE) ;allow a 3 character command to match. +0583 D348 FE 20 CP ' ' +0584 D34A C2 54 D3 JP NZ,SEARCH4 +0585 D34D 79 LD A,C ;set return register for this command. +0586 D34E C9 RET +0587 D34F 23 SEARCH3:INC HL +0588 D350 05 DEC B +0589 D351 C2 4F D3 JP NZ,SEARCH3 +0590 D354 0C SEARCH4:INC C +0591 D355 C3 33 D3 JP SEARCH1 +0592 D358 ; +0593 D358 ; Set the input buffer to empty and then start the command +0594 D358 ; processor (ccp). +0595 D358 ; +0596 D358 AF CLEARBUF: XOR A +0597 D359 32 07 D0 LD (INBUFF+1),A ;second byte is actual length. +0598 D35C ; +0599 D35C ;************************************************************** +0600 D35C ;* +0601 D35C ;* +0602 D35C ;* C C P - C o n s o l e C o m m a n d P r o c e s s o r +0603 D35C ;* +0604 D35C ;************************************************************** +0605 D35C ;* +0606 D35C 31 AB D7 COMMAND:LD SP,CCPSTACK ;setup stack area. +0607 D35F C5 PUSH BC ;note that (C) should be equal to: +0608 D360 79 LD A,C ;(uuuudddd) where 'uuuu' is the user number +0609 D361 1F RRA ;and 'dddd' is the drive number. +0610 D362 1F RRA +0611 D363 1F RRA +0612 D364 1F RRA +0613 D365 E6 0F AND 0FH ;isolate the user number. +0614 D367 5F LD E,A +0615 D368 CD 15 D1 CALL GETSETUC ;and set it. +0616 D36B CD B8 D0 CALL RESDSK ;reset the disk system. +0617 D36E 32 AB D7 LD (BATCH),A ;clear batch mode flag. +0618 D371 C1 POP BC +0619 D372 79 LD A,C +0620 D373 E6 0F AND 0FH ;isolate the drive number. +0621 D375 32 EF D7 LD (CDRIVE),A ;and save. +0622 D378 CD BD D0 CALL DSKSEL ;...and select. +0623 D37B 3A 07 D0 LD A,(INBUFF+1) +0624 D37E B7 OR A ;anything in input buffer already? +0625 D37F C2 98 D3 JP NZ,CMMND2 ;yes, we just process it. +0626 D382 ; +0627 D382 ; Entry point to get a command line from the console. +0628 D382 ; +0629 D382 31 AB D7 CMMND1: LD SP,CCPSTACK ;set stack straight. +0630 D385 CD 98 D0 CALL CRLF ;start a new line on the screen. +0631 D388 CD D0 D1 CALL GETDSK ;get current drive. +0632 D38B C6 41 ADD A,'A' +0633 D38D CD 8C D0 CALL PRINT ;print current drive. +0634 D390 3E 3E LD A,'>' +0635 D392 CD 8C D0 CALL PRINT ;and add prompt. +0636 D395 CD 39 D1 CALL GETINP ;get line from user. +0637 D398 ; +0638 D398 ; Process command line here. +0639 D398 ; +0640 D398 11 80 00 CMMND2: LD DE,TBUFF +0641 D39B CD D8 D1 CALL DMASET ;set standard dma address. +0642 D39E CD D0 D1 CALL GETDSK +0643 D3A1 32 EF D7 LD (CDRIVE),A ;set current drive. +0644 D3A4 CD 5E D2 CALL CONVFST ;convert name typed in. +0645 D3A7 C4 09 D2 CALL NZ,SYNERR ;wild cards are not allowed. +0646 D3AA 3A F0 D7 LD A,(CHGDRV) ;if a change in drives was indicated, +0647 D3AD B7 OR A ;then treat this as an unknown command +0648 D3AE C2 A5 D6 JP NZ,UNKNOWN ;which gets executed. +0649 D3B1 CD 2E D3 CALL SEARCH ;else search command table for a match. +0650 D3B4 ; +0651 D3B4 ; Note that an unknown command returns +0652 D3B4 ; with (A) pointing to the last address +0653 D3B4 ; in our table which is (UNKNOWN). +0654 D3B4 ; +0655 D3B4 21 C1 D3 LD HL,CMDADR ;now, look thru our address table for command (A). +0656 D3B7 5F LD E,A ;set (DE) to command number. +0657 D3B8 16 00 LD D,0 +0658 D3BA 19 ADD HL,DE +0659 D3BB 19 ADD HL,DE ;(HL)=(CMDADR)+2*(command number). +0660 D3BC 7E LD A,(HL) ;now pick out this address. +0661 D3BD 23 INC HL +0662 D3BE 66 LD H,(HL) +0663 D3BF 6F LD L,A +0664 D3C0 E9 JP (HL) ;now execute it. +0665 D3C1 ; +0666 D3C1 ; CP/M command address table. +0667 D3C1 ; +0668 D3C1 77 D4 1F D5 CMDADR: .DW DIRECT,ERASE,TYPE,SAVE +0668 D3C5 5D D5 AD D5 +0669 D3C9 10 D6 8E D6 .DW RENAME,USER,UNKNOWN +0669 D3CD A5 D6 +0670 D3CF ; +0671 D3CF ; Halt the system. Reason for this is unknown at present. +0672 D3CF ; +0673 D3CF 21 F3 76 HALT: LD HL,76F3H ;'DI HLT' instructions. +0674 D3D2 22 00 D0 LD (CBASE),HL +0675 D3D5 21 00 D0 LD HL,CBASE +0676 D3D8 E9 JP (HL) +0677 D3D9 ; +0678 D3D9 ; Read error while TYPEing a file. +0679 D3D9 ; +0680 D3D9 01 DF D3 RDERROR:LD BC,RDERR +0681 D3DC C3 A7 D0 JP PLINE +0682 D3DF 52 65 61 64 RDERR: .TEXT "Read error" +0682 D3E3 20 65 72 72 +0682 D3E7 6F 72 +0683 D3E9 00 .DB 0 +0684 D3EA ; +0685 D3EA ; Required file was not located. +0686 D3EA ; +0687 D3EA 01 F0 D3 NONE: LD BC,NOFILE +0688 D3ED C3 A7 D0 JP PLINE +0689 D3F0 4E 6F 20 66 NOFILE: .TEXT "No file" +0689 D3F4 69 6C 65 +0690 D3F7 00 .DB 0 +0691 D3F8 ; +0692 D3F8 ; Decode a command of the form 'A>filename number{ filename}. +0693 D3F8 ; Note that a drive specifier is not allowed on the first file +0694 D3F8 ; name. On return, the number is in register (A). Any error +0695 D3F8 ; causes 'filename?' to be printed and the command is aborted. +0696 D3F8 ; +0697 D3F8 CD 5E D2 DECODE: CALL CONVFST ;convert filename. +0698 D3FB 3A F0 D7 LD A,(CHGDRV) ;do not allow a drive to be specified. +0699 D3FE B7 OR A +0700 D3FF C2 09 D2 JP NZ,SYNERR +0701 D402 21 CE D7 LD HL,FCB+1 ;convert number now. +0702 D405 01 0B 00 LD BC,11 ;(B)=sum register, (C)=max digit count. +0703 D408 7E DECODE1:LD A,(HL) +0704 D409 FE 20 CP ' ' ;a space terminates the numeral. +0705 D40B CA 33 D4 JP Z,DECODE3 +0706 D40E 23 INC HL +0707 D40F D6 30 SUB '0' ;make binary from ascii. +0708 D411 FE 0A CP 10 ;legal digit? +0709 D413 D2 09 D2 JP NC,SYNERR +0710 D416 57 LD D,A ;yes, save it in (D). +0711 D417 78 LD A,B ;compute (B)=(B)*10 and check for overflow. +0712 D418 E6 E0 AND 0E0H +0713 D41A C2 09 D2 JP NZ,SYNERR +0714 D41D 78 LD A,B +0715 D41E 07 RLCA +0716 D41F 07 RLCA +0717 D420 07 RLCA ;(A)=(B)*8 +0718 D421 80 ADD A,B ;.......*9 +0719 D422 DA 09 D2 JP C,SYNERR +0720 D425 80 ADD A,B ;.......*10 +0721 D426 DA 09 D2 JP C,SYNERR +0722 D429 82 ADD A,D ;add in new digit now. +0723 D42A DA 09 D2 DECODE2:JP C,SYNERR +0724 D42D 47 LD B,A ;and save result. +0725 D42E 0D DEC C ;only look at 11 digits. +0726 D42F C2 08 D4 JP NZ,DECODE1 +0727 D432 C9 RET +0728 D433 7E DECODE3:LD A,(HL) ;spaces must follow (why?). +0729 D434 FE 20 CP ' ' +0730 D436 C2 09 D2 JP NZ,SYNERR +0731 D439 23 INC HL +0732 D43A 0D DECODE4:DEC C +0733 D43B C2 33 D4 JP NZ,DECODE3 +0734 D43E 78 LD A,B ;set (A)=the numeric value entered. +0735 D43F C9 RET +0736 D440 ; +0737 D440 ; Move 3 bytes from (HL) to (DE). Note that there is only +0738 D440 ; one reference to this at (A2D5h). +0739 D440 ; +0740 D440 06 03 MOVE3: LD B,3 +0741 D442 ; +0742 D442 ; Move (B) bytes from (HL) to (DE). +0743 D442 ; +0744 D442 7E HL2DE: LD A,(HL) +0745 D443 12 LD (DE),A +0746 D444 23 INC HL +0747 D445 13 INC DE +0748 D446 05 DEC B +0749 D447 C2 42 D4 JP NZ,HL2DE +0750 D44A C9 RET +0751 D44B ; +0752 D44B ; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here. +0753 D44B ; +0754 D44B 21 80 00 EXTRACT:LD HL,TBUFF +0755 D44E 81 ADD A,C +0756 D44F CD 59 D2 CALL ADDHL +0757 D452 7E LD A,(HL) +0758 D453 C9 RET +0759 D454 ; +0760 D454 ; Check drive specified. If it means a change, then the new +0761 D454 ; drive will be selected. In any case, the drive byte of the +0762 D454 ; fcb will be set to null (means use current drive). +0763 D454 ; +0764 D454 AF DSELECT:XOR A ;null out first byte of fcb. +0765 D455 32 CD D7 LD (FCB),A +0766 D458 3A F0 D7 LD A,(CHGDRV) ;a drive change indicated? +0767 D45B B7 OR A +0768 D45C C8 RET Z +0769 D45D 3D DEC A ;yes, is it the same as the current drive? +0770 D45E 21 EF D7 LD HL,CDRIVE +0771 D461 BE CP (HL) +0772 D462 C8 RET Z +0773 D463 C3 BD D0 JP DSKSEL ;no. Select it then. +0774 D466 ; +0775 D466 ; Check the drive selection and reset it to the previous +0776 D466 ; drive if it was changed for the preceeding command. +0777 D466 ; +0778 D466 3A F0 D7 RESETDR:LD A,(CHGDRV) ;drive change indicated? +0779 D469 B7 OR A +0780 D46A C8 RET Z +0781 D46B 3D DEC A ;yes, was it a different drive? +0782 D46C 21 EF D7 LD HL,CDRIVE +0783 D46F BE CP (HL) +0784 D470 C8 RET Z +0785 D471 3A EF D7 LD A,(CDRIVE) ;yes, re-select our old drive. +0786 D474 C3 BD D0 JP DSKSEL +0787 D477 ; +0788 D477 ;************************************************************** +0789 D477 ;* +0790 D477 ;* D I R E C T O R Y C O M M A N D +0791 D477 ;* +0792 D477 ;************************************************************** +0793 D477 ; +0794 D477 CD 5E D2 DIRECT: CALL CONVFST ;convert file name. +0795 D47A CD 54 D4 CALL DSELECT ;select indicated drive. +0796 D47D 21 CE D7 LD HL,FCB+1 ;was any file indicated? +0797 D480 7E LD A,(HL) +0798 D481 FE 20 CP ' ' +0799 D483 C2 8F D4 JP NZ,DIRECT2 +0800 D486 06 0B LD B,11 ;no. Fill field with '?' - same as *.*. +0801 D488 36 3F DIRECT1:LD (HL),'?' +0802 D48A 23 INC HL +0803 D48B 05 DEC B +0804 D48C C2 88 D4 JP NZ,DIRECT1 +0805 D48F 1E 00 DIRECT2:LD E,0 ;set initial cursor position. +0806 D491 D5 PUSH DE +0807 D492 CD E9 D0 CALL SRCHFCB ;get first file name. +0808 D495 CC EA D3 CALL Z,NONE ;none found at all? +0809 D498 CA 1B D5 DIRECT3:JP Z,DIRECT9 ;terminate if no more names. +0810 D49B 3A EE D7 LD A,(RTNCODE) ;get file's position in segment (0-3). +0811 D49E 0F RRCA +0812 D49F 0F RRCA +0813 D4A0 0F RRCA +0814 D4A1 E6 60 AND 60H ;(A)=position*32 +0815 D4A3 4F LD C,A +0816 D4A4 3E 0A LD A,10 +0817 D4A6 CD 4B D4 CALL EXTRACT ;extract the tenth entry in fcb. +0818 D4A9 17 RLA ;check system file status bit. +0819 D4AA DA 0F D5 JP C,DIRECT8 ;we don't list them. +0820 D4AD D1 POP DE +0821 D4AE 7B LD A,E ;bump name count. +0822 D4AF 1C INC E +0823 D4B0 D5 PUSH DE +0824 D4B1 E6 03 AND 03H ;at end of line? +0825 D4B3 F5 PUSH AF +0826 D4B4 C2 CC D4 JP NZ,DIRECT4 +0827 D4B7 CD 98 D0 CALL CRLF ;yes, end this line and start another. +0828 D4BA C5 PUSH BC +0829 D4BB CD D0 D1 CALL GETDSK ;start line with ('A:'). +0830 D4BE C1 POP BC +0831 D4BF C6 41 ADD A,'A' +0832 D4C1 CD 92 D0 CALL PRINTB +0833 D4C4 3E 3A LD A,':' +0834 D4C6 CD 92 D0 CALL PRINTB +0835 D4C9 C3 D4 D4 JP DIRECT5 +0836 D4CC CD A2 D0 DIRECT4:CALL SPACE ;add seperator between file names. +0837 D4CF 3E 3A LD A,':' +0838 D4D1 CD 92 D0 CALL PRINTB +0839 D4D4 CD A2 D0 DIRECT5:CALL SPACE +0840 D4D7 06 01 LD B,1 ;'extract' each file name character at a time. +0841 D4D9 78 DIRECT6:LD A,B +0842 D4DA CD 4B D4 CALL EXTRACT +0843 D4DD E6 7F AND 7FH ;strip bit 7 (status bit). +0844 D4DF FE 20 CP ' ' ;are we at the end of the name? +0845 D4E1 C2 F9 D4 JP NZ,DRECT65 +0846 D4E4 F1 POP AF ;yes, don't print spaces at the end of a line. +0847 D4E5 F5 PUSH AF +0848 D4E6 FE 03 CP 3 +0849 D4E8 C2 F7 D4 JP NZ,DRECT63 +0850 D4EB 3E 09 LD A,9 ;first check for no extension. +0851 D4ED CD 4B D4 CALL EXTRACT +0852 D4F0 E6 7F AND 7FH +0853 D4F2 FE 20 CP ' ' +0854 D4F4 CA 0E D5 JP Z,DIRECT7 ;don't print spaces. +0855 D4F7 3E 20 DRECT63:LD A,' ' ;else print them. +0856 D4F9 CD 92 D0 DRECT65:CALL PRINTB +0857 D4FC 04 INC B ;bump to next character psoition. +0858 D4FD 78 LD A,B +0859 D4FE FE 0C CP 12 ;end of the name? +0860 D500 D2 0E D5 JP NC,DIRECT7 +0861 D503 FE 09 CP 9 ;nope, starting extension? +0862 D505 C2 D9 D4 JP NZ,DIRECT6 +0863 D508 CD A2 D0 CALL SPACE ;yes, add seperating space. +0864 D50B C3 D9 D4 JP DIRECT6 +0865 D50E F1 DIRECT7:POP AF ;get the next file name. +0866 D50F CD C2 D1 DIRECT8:CALL CHKCON ;first check console, quit on anything. +0867 D512 C2 1B D5 JP NZ,DIRECT9 +0868 D515 CD E4 D0 CALL SRCHNXT ;get next name. +0869 D518 C3 98 D4 JP DIRECT3 ;and continue with our list. +0870 D51B D1 DIRECT9:POP DE ;restore the stack and return to command level. +0871 D51C C3 86 D7 JP GETBACK +0872 D51F ; +0873 D51F ;************************************************************** +0874 D51F ;* +0875 D51F ;* E R A S E C O M M A N D +0876 D51F ;* +0877 D51F ;************************************************************** +0878 D51F ; +0879 D51F CD 5E D2 ERASE: CALL CONVFST ;convert file name. +0880 D522 FE 0B CP 11 ;was '*.*' entered? +0881 D524 C2 42 D5 JP NZ,ERASE1 +0882 D527 01 52 D5 LD BC,YESNO ;yes, ask for confirmation. +0883 D52A CD A7 D0 CALL PLINE +0884 D52D CD 39 D1 CALL GETINP +0885 D530 21 07 D0 LD HL,INBUFF+1 +0886 D533 35 DEC (HL) ;must be exactly 'y'. +0887 D534 C2 82 D3 JP NZ,CMMND1 +0888 D537 23 INC HL +0889 D538 7E LD A,(HL) +0890 D539 FE 59 CP 'Y' +0891 D53B C2 82 D3 JP NZ,CMMND1 +0892 D53E 23 INC HL +0893 D53F 22 88 D0 LD (INPOINT),HL ;save input line pointer. +0894 D542 CD 54 D4 ERASE1: CALL DSELECT ;select desired disk. +0895 D545 11 CD D7 LD DE,FCB +0896 D548 CD EF D0 CALL DELETE ;delete the file. +0897 D54B 3C INC A +0898 D54C CC EA D3 CALL Z,NONE ;not there? +0899 D54F C3 86 D7 JP GETBACK ;return to command level now. +0900 D552 41 6C 6C 20 YESNO: .TEXT "All (y/n)?" +0900 D556 28 79 2F 6E +0900 D55A 29 3F +0901 D55C 00 .DB 0 +0902 D55D ; +0903 D55D ;************************************************************** +0904 D55D ;* +0905 D55D ;* T Y P E C O M M A N D +0906 D55D ;* +0907 D55D ;************************************************************** +0908 D55D ; +0909 D55D CD 5E D2 TYPE: CALL CONVFST ;convert file name. +0910 D560 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. +0911 D563 CD 54 D4 CALL DSELECT ;select indicated drive. +0912 D566 CD D0 D0 CALL OPENFCB ;open the file. +0913 D569 CA A7 D5 JP Z,TYPE5 ;not there? +0914 D56C CD 98 D0 CALL CRLF ;ok, start a new line on the screen. +0915 D56F 21 F1 D7 LD HL,NBYTES ;initialize byte counter. +0916 D572 36 FF LD (HL),0FFH ;set to read first sector. +0917 D574 21 F1 D7 TYPE1: LD HL,NBYTES +0918 D577 7E TYPE2: LD A,(HL) ;have we written the entire sector? +0919 D578 FE 80 CP 128 +0920 D57A DA 87 D5 JP C,TYPE3 +0921 D57D E5 PUSH HL ;yes, read in the next one. +0922 D57E CD FE D0 CALL READFCB +0923 D581 E1 POP HL +0924 D582 C2 A0 D5 JP NZ,TYPE4 ;end or error? +0925 D585 AF XOR A ;ok, clear byte counter. +0926 D586 77 LD (HL),A +0927 D587 34 TYPE3: INC (HL) ;count this byte. +0928 D588 21 80 00 LD HL,TBUFF ;and get the (A)th one from the buffer (TBUFF). +0929 D58B CD 59 D2 CALL ADDHL +0930 D58E 7E LD A,(HL) +0931 D58F FE 1A CP CNTRLZ ;end of file mark? +0932 D591 CA 86 D7 JP Z,GETBACK +0933 D594 CD 8C D0 CALL PRINT ;no, print it. +0934 D597 CD C2 D1 CALL CHKCON ;check console, quit if anything ready. +0935 D59A C2 86 D7 JP NZ,GETBACK +0936 D59D C3 74 D5 JP TYPE1 +0937 D5A0 ; +0938 D5A0 ; Get here on an end of file or read error. +0939 D5A0 ; +0940 D5A0 3D TYPE4: DEC A ;read error? +0941 D5A1 CA 86 D7 JP Z,GETBACK +0942 D5A4 CD D9 D3 CALL RDERROR ;yes, print message. +0943 D5A7 CD 66 D4 TYPE5: CALL RESETDR ;and reset proper drive +0944 D5AA C3 09 D2 JP SYNERR ;now print file name with problem. +0945 D5AD ; +0946 D5AD ;************************************************************** +0947 D5AD ;* +0948 D5AD ;* S A V E C O M M A N D +0949 D5AD ;* +0950 D5AD ;************************************************************** +0951 D5AD ; +0952 D5AD CD F8 D3 SAVE: CALL DECODE ;get numeric number that follows SAVE. +0953 D5B0 F5 PUSH AF ;save number of pages to write. +0954 D5B1 CD 5E D2 CALL CONVFST ;convert file name. +0955 D5B4 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. +0956 D5B7 CD 54 D4 CALL DSELECT ;select specified drive. +0957 D5BA 11 CD D7 LD DE,FCB ;now delete this file. +0958 D5BD D5 PUSH DE +0959 D5BE CD EF D0 CALL DELETE +0960 D5C1 D1 POP DE +0961 D5C2 CD 09 D1 CALL CREATE ;and create it again. +0962 D5C5 CA FB D5 JP Z,SAVE3 ;can't create? +0963 D5C8 AF XOR A ;clear record number byte. +0964 D5C9 32 ED D7 LD (FCB+32),A +0965 D5CC F1 POP AF ;convert pages to sectors. +0966 D5CD 6F LD L,A +0967 D5CE 26 00 LD H,0 +0968 D5D0 29 ADD HL,HL ;(HL)=number of sectors to write. +0969 D5D1 11 00 01 LD DE,TBASE ;and we start from here. +0970 D5D4 7C SAVE1: LD A,H ;done yet? +0971 D5D5 B5 OR L +0972 D5D6 CA F1 D5 JP Z,SAVE2 +0973 D5D9 2B DEC HL ;nope, count this and compute the start +0974 D5DA E5 PUSH HL ;of the next 128 byte sector. +0975 D5DB 21 80 00 LD HL,128 +0976 D5DE 19 ADD HL,DE +0977 D5DF E5 PUSH HL ;save it and set the transfer address. +0978 D5E0 CD D8 D1 CALL DMASET +0979 D5E3 11 CD D7 LD DE,FCB ;write out this sector now. +0980 D5E6 CD 04 D1 CALL WRTREC +0981 D5E9 D1 POP DE ;reset (DE) to the start of the last sector. +0982 D5EA E1 POP HL ;restore sector count. +0983 D5EB C2 FB D5 JP NZ,SAVE3 ;write error? +0984 D5EE C3 D4 D5 JP SAVE1 +0985 D5F1 ; +0986 D5F1 ; Get here after writing all of the file. +0987 D5F1 ; +0988 D5F1 11 CD D7 SAVE2: LD DE,FCB ;now close the file. +0989 D5F4 CD DA D0 CALL CLOSE +0990 D5F7 3C INC A ;did it close ok? +0991 D5F8 C2 01 D6 JP NZ,SAVE4 +0992 D5FB ; +0993 D5FB ; Print out error message (no space). +0994 D5FB ; +0995 D5FB 01 07 D6 SAVE3: LD BC,NOSPACE +0996 D5FE CD A7 D0 CALL PLINE +0997 D601 CD D5 D1 SAVE4: CALL STDDMA ;reset the standard dma address. +0998 D604 C3 86 D7 JP GETBACK +0999 D607 4E 6F 20 73 NOSPACE:.TEXT "No space" +0999 D60B 70 61 63 65 +1000 D60F 00 .DB 0 +1001 D610 ; +1002 D610 ;************************************************************** +1003 D610 ;* +1004 D610 ;* R E N A M E C O M M A N D +1005 D610 ;* +1006 D610 ;************************************************************** +1007 D610 ; +1008 D610 CD 5E D2 RENAME: CALL CONVFST ;convert first file name. +1009 D613 C2 09 D2 JP NZ,SYNERR ;wild cards not allowed. +1010 D616 3A F0 D7 LD A,(CHGDRV) ;remember any change in drives specified. +1011 D619 F5 PUSH AF +1012 D61A CD 54 D4 CALL DSELECT ;and select this drive. +1013 D61D CD E9 D0 CALL SRCHFCB ;is this file present? +1014 D620 C2 79 D6 JP NZ,RENAME6 ;yes, print error message. +1015 D623 21 CD D7 LD HL,FCB ;yes, move this name into second slot. +1016 D626 11 DD D7 LD DE,FCB+16 +1017 D629 06 10 LD B,16 +1018 D62B CD 42 D4 CALL HL2DE +1019 D62E 2A 88 D0 LD HL,(INPOINT) ;get input pointer. +1020 D631 EB EX DE,HL +1021 D632 CD 4F D2 CALL NONBLANK ;get next non blank character. +1022 D635 FE 3D CP '=' ;only allow an '=' or '_' seperator. +1023 D637 CA 3F D6 JP Z,RENAME1 +1024 D63A FE 5F CP '_' +1025 D63C C2 73 D6 JP NZ,RENAME5 +1026 D63F EB RENAME1:EX DE,HL +1027 D640 23 INC HL ;ok, skip seperator. +1028 D641 22 88 D0 LD (INPOINT),HL ;save input line pointer. +1029 D644 CD 5E D2 CALL CONVFST ;convert this second file name now. +1030 D647 C2 73 D6 JP NZ,RENAME5 ;again, no wild cards. +1031 D64A F1 POP AF ;if a drive was specified, then it +1032 D64B 47 LD B,A ;must be the same as before. +1033 D64C 21 F0 D7 LD HL,CHGDRV +1034 D64F 7E LD A,(HL) +1035 D650 B7 OR A +1036 D651 CA 59 D6 JP Z,RENAME2 +1037 D654 B8 CP B +1038 D655 70 LD (HL),B +1039 D656 C2 73 D6 JP NZ,RENAME5 ;they were different, error. +1040 D659 70 RENAME2:LD (HL),B ; reset as per the first file specification. +1041 D65A AF XOR A +1042 D65B 32 CD D7 LD (FCB),A ;clear the drive byte of the fcb. +1043 D65E CD E9 D0 RENAME3:CALL SRCHFCB ;and go look for second file. +1044 D661 CA 6D D6 JP Z,RENAME4 ;doesn't exist? +1045 D664 11 CD D7 LD DE,FCB +1046 D667 CD 0E D1 CALL RENAM ;ok, rename the file. +1047 D66A C3 86 D7 JP GETBACK +1048 D66D ; +1049 D66D ; Process rename errors here. +1050 D66D ; +1051 D66D CD EA D3 RENAME4:CALL NONE ;file not there. +1052 D670 C3 86 D7 JP GETBACK +1053 D673 CD 66 D4 RENAME5:CALL RESETDR ;bad command format. +1054 D676 C3 09 D2 JP SYNERR +1055 D679 01 82 D6 RENAME6:LD BC,EXISTS ;destination file already exists. +1056 D67C CD A7 D0 CALL PLINE +1057 D67F C3 86 D7 JP GETBACK +1058 D682 46 69 6C 65 EXISTS: .TEXT "File exists" +1058 D686 20 65 78 69 +1058 D68A 73 74 73 +1059 D68D 00 .DB 0 +1060 D68E ; +1061 D68E ;************************************************************** +1062 D68E ;* +1063 D68E ;* U S E R C O M M A N D +1064 D68E ;* +1065 D68E ;************************************************************** +1066 D68E ; +1067 D68E CD F8 D3 USER: CALL DECODE ;get numeric value following command. +1068 D691 FE 10 CP 16 ;legal user number? +1069 D693 D2 09 D2 JP NC,SYNERR +1070 D696 5F LD E,A ;yes but is there anything else? +1071 D697 3A CE D7 LD A,(FCB+1) +1072 D69A FE 20 CP ' ' +1073 D69C CA 09 D2 JP Z,SYNERR ;yes, that is not allowed. +1074 D69F CD 15 D1 CALL GETSETUC ;ok, set user code. +1075 D6A2 C3 89 D7 JP GETBACK1 +1076 D6A5 ; +1077 D6A5 ;************************************************************** +1078 D6A5 ;* +1079 D6A5 ;* T R A N S I A N T P R O G R A M C O M M A N D +1080 D6A5 ;* +1081 D6A5 ;************************************************************** +1082 D6A5 ; +1083 D6A5 CD F5 D1 UNKNOWN:CALL VERIFY ;check for valid system (why?). +1084 D6A8 3A CE D7 LD A,(FCB+1) ;anything to execute? +1085 D6AB FE 20 CP ' ' +1086 D6AD C2 C4 D6 JP NZ,UNKWN1 +1087 D6B0 3A F0 D7 LD A,(CHGDRV) ;nope, only a drive change? +1088 D6B3 B7 OR A +1089 D6B4 CA 89 D7 JP Z,GETBACK1 ;neither??? +1090 D6B7 3D DEC A +1091 D6B8 32 EF D7 LD (CDRIVE),A ;ok, store new drive. +1092 D6BB CD 29 D1 CALL MOVECD ;set (TDRIVE) also. +1093 D6BE CD BD D0 CALL DSKSEL ;and select this drive. +1094 D6C1 C3 89 D7 JP GETBACK1 ;then return. +1095 D6C4 ; +1096 D6C4 ; Here a file name was typed. Prepare to execute it. +1097 D6C4 ; +1098 D6C4 11 D6 D7 UNKWN1: LD DE,FCB+9 ;an extension specified? +1099 D6C7 1A LD A,(DE) +1100 D6C8 FE 20 CP ' ' +1101 D6CA C2 09 D2 JP NZ,SYNERR ;yes, not allowed. +1102 D6CD D5 UNKWN2: PUSH DE +1103 D6CE CD 54 D4 CALL DSELECT ;select specified drive. +1104 D6D1 D1 POP DE +1105 D6D2 21 83 D7 LD HL,COMFILE ;set the extension to 'COM'. +1106 D6D5 CD 40 D4 CALL MOVE3 +1107 D6D8 CD D0 D0 CALL OPENFCB ;and open this file. +1108 D6DB CA 6B D7 JP Z,UNKWN9 ;not present? +1109 D6DE ; +1110 D6DE ; Load in the program. +1111 D6DE ; +1112 D6DE 21 00 01 LD HL,TBASE ;store the program starting here. +1113 D6E1 E5 UNKWN3: PUSH HL +1114 D6E2 EB EX DE,HL +1115 D6E3 CD D8 D1 CALL DMASET ;set transfer address. +1116 D6E6 11 CD D7 LD DE,FCB ;and read the next record. +1117 D6E9 CD F9 D0 CALL RDREC +1118 D6EC C2 01 D7 JP NZ,UNKWN4 ;end of file or read error? +1119 D6EF E1 POP HL ;nope, bump pointer for next sector. +1120 D6F0 11 80 00 LD DE,128 +1121 D6F3 19 ADD HL,DE +1122 D6F4 11 00 D0 LD DE,CBASE ;enough room for the whole file? +1123 D6F7 7D LD A,L +1124 D6F8 93 SUB E +1125 D6F9 7C LD A,H +1126 D6FA 9A SBC A,D +1127 D6FB D2 71 D7 JP NC,UNKWN0 ;no, it can't fit. +1128 D6FE C3 E1 D6 JP UNKWN3 +1129 D701 ; +1130 D701 ; Get here after finished reading. +1131 D701 ; +1132 D701 E1 UNKWN4: POP HL +1133 D702 3D DEC A ;normal end of file? +1134 D703 C2 71 D7 JP NZ,UNKWN0 +1135 D706 CD 66 D4 CALL RESETDR ;yes, reset previous drive. +1136 D709 CD 5E D2 CALL CONVFST ;convert the first file name that follows +1137 D70C 21 F0 D7 LD HL,CHGDRV ;command name. +1138 D70F E5 PUSH HL +1139 D710 7E LD A,(HL) ;set drive code in default fcb. +1140 D711 32 CD D7 LD (FCB),A +1141 D714 3E 10 LD A,16 ;put second name 16 bytes later. +1142 D716 CD 60 D2 CALL CONVERT ;convert second file name. +1143 D719 E1 POP HL +1144 D71A 7E LD A,(HL) ;and set the drive for this second file. +1145 D71B 32 DD D7 LD (FCB+16),A +1146 D71E AF XOR A ;clear record byte in fcb. +1147 D71F 32 ED D7 LD (FCB+32),A +1148 D722 11 5C 00 LD DE,TFCB ;move it into place at(005Ch). +1149 D725 21 CD D7 LD HL,FCB +1150 D728 06 21 LD B,33 +1151 D72A CD 42 D4 CALL HL2DE +1152 D72D 21 08 D0 LD HL,INBUFF+2 ;now move the remainder of the input +1153 D730 7E UNKWN5: LD A,(HL) ;line down to (0080h). Look for a non blank. +1154 D731 B7 OR A ;or a null. +1155 D732 CA 3E D7 JP Z,UNKWN6 +1156 D735 FE 20 CP ' ' +1157 D737 CA 3E D7 JP Z,UNKWN6 +1158 D73A 23 INC HL +1159 D73B C3 30 D7 JP UNKWN5 +1160 D73E ; +1161 D73E ; Do the line move now. It ends in a null byte. +1162 D73E ; +1163 D73E 06 00 UNKWN6: LD B,0 ;keep a character count. +1164 D740 11 81 00 LD DE,TBUFF+1 ;data gets put here. +1165 D743 7E UNKWN7: LD A,(HL) ;move it now. +1166 D744 12 LD (DE),A +1167 D745 B7 OR A +1168 D746 CA 4F D7 JP Z,UNKWN8 +1169 D749 04 INC B +1170 D74A 23 INC HL +1171 D74B 13 INC DE +1172 D74C C3 43 D7 JP UNKWN7 +1173 D74F 78 UNKWN8: LD A,B ;now store the character count. +1174 D750 32 80 00 LD (TBUFF),A +1175 D753 CD 98 D0 CALL CRLF ;clean up the screen. +1176 D756 CD D5 D1 CALL STDDMA ;set standard transfer address. +1177 D759 CD 1A D1 CALL SETCDRV ;reset current drive. +1178 D75C CD 00 01 CALL TBASE ;and execute the program. +1179 D75F ; +1180 D75F ; Transiant programs return here (or reboot). +1181 D75F ; +1182 D75F 31 AB D7 LD SP,BATCH ;set stack first off. +1183 D762 CD 29 D1 CALL MOVECD ;move current drive into place (TDRIVE). +1184 D765 CD BD D0 CALL DSKSEL ;and reselect it. +1185 D768 C3 82 D3 JP CMMND1 ;back to comand mode. +1186 D76B ; +1187 D76B ; Get here if some error occured. +1188 D76B ; +1189 D76B CD 66 D4 UNKWN9: CALL RESETDR ;inproper format. +1190 D76E C3 09 D2 JP SYNERR +1191 D771 01 7A D7 UNKWN0: LD BC,BADLOAD ;read error or won't fit. +1192 D774 CD A7 D0 CALL PLINE +1193 D777 C3 86 D7 JP GETBACK +1194 D77A 42 61 64 20 BADLOAD:.TEXT "Bad load" +1194 D77E 6C 6F 61 64 +1195 D782 00 .DB 0 +1196 D783 43 4F 4D COMFILE:.TEXT "COM" ;command file extension. +1197 D786 ; +1198 D786 ; Get here to return to command level. We will reset the +1199 D786 ; previous active drive and then either return to command +1200 D786 ; level directly or print error message and then return. +1201 D786 ; +1202 D786 CD 66 D4 GETBACK:CALL RESETDR ;reset previous drive. +1203 D789 CD 5E D2 GETBACK1: CALL CONVFST ;convert first name in (FCB). +1204 D78C 3A CE D7 LD A,(FCB+1) ;if this was just a drive change request, +1205 D78F D6 20 SUB ' ' ;make sure it was valid. +1206 D791 21 F0 D7 LD HL,CHGDRV +1207 D794 B6 OR (HL) +1208 D795 C2 09 D2 JP NZ,SYNERR +1209 D798 C3 82 D3 JP CMMND1 ;ok, return to command level. +1210 D79B ; +1211 D79B ; ccp stack area. +1212 D79B ; +1213 D79B 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1213 D79F 00 00 00 00 +1213 D7A3 00 00 00 00 +1213 D7A7 00 00 00 00 +1214 D7AB CCPSTACK .EQU $ ;end of ccp stack area. +1215 D7AB ; +1216 D7AB ; Batch (or SUBMIT) processing information storage. +1217 D7AB ; +1218 D7AB 00 BATCH: .DB 0 ;batch mode flag (0=not active). +1219 D7AC 00 BATCHFCB: .DB 0, +1220 D7AD 24 24 24 20 .TEXT "$$$ SUB" +1220 D7B1 20 20 20 20 +1220 D7B5 53 55 42 +1221 D7B8 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1221 D7BC 00 00 00 00 +1221 D7C0 00 00 00 00 +1221 D7C4 00 00 00 00 +1221 D7C8 00 00 00 00 +1221 D7CC 00 +1222 D7CD ; +1223 D7CD ; File control block setup by the CCP. +1224 D7CD ; +1225 D7CD 00 FCB: .DB 0 +1226 D7CE 20 20 20 20 .TEXT " " +1226 D7D2 20 20 20 20 +1226 D7D6 20 20 20 +1227 D7D9 00 00 00 00 .DB 0,0,0,0,0 +1227 D7DD 00 +1228 D7DE 20 20 20 20 .TEXT " " +1228 D7E2 20 20 20 20 +1228 D7E6 20 20 20 +1229 D7E9 00 00 00 00 .DB 0,0,0,0,0 +1229 D7ED 00 +1230 D7EE 00 RTNCODE:.DB 0 ;status returned from bdos call. +1231 D7EF 00 CDRIVE: .DB 0 ;currently active drive. +1232 D7F0 00 CHGDRV: .DB 0 ;change in drives flag (0=no change). +1233 D7F1 00 00 NBYTES: .DW 0 ;byte counter used by TYPE. +1234 D7F3 ; +1235 D7F3 ; Room for expansion? +1236 D7F3 ; +1237 D7F3 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0 +1237 D7F7 00 00 00 00 +1237 D7FB 00 00 00 00 +1237 D7FF 00 +1238 D800 ; +1239 D800 ; Note that the following six bytes must match those at +1240 D800 ; (PATTRN1) or cp/m will HALT. Why? +1241 D800 ; +1242 D800 00 16 00 00 PATTRN2:.DB 0,22,0,0,0,0 ;(* serial number bytes *). +1242 D804 00 00 +1243 D806 ; +1244 D806 ;************************************************************** +1245 D806 ;* +1246 D806 ;* B D O S E N T R Y +1247 D806 ;* +1248 D806 ;************************************************************** +1249 D806 ; +1250 D806 C3 11 D8 FBASE: JP FBASE1 +1251 D809 ; +1252 D809 ; Bdos error table. +1253 D809 ; +1254 D809 99 D8 BADSCTR:.DW ERROR1 ;bad sector on read or write. +1255 D80B A5 D8 BADSLCT:.DW ERROR2 ;bad disk select. +1256 D80D AB D8 RODISK: .DW ERROR3 ;disk is read only. +1257 D80F B1 D8 ROFILE: .DW ERROR4 ;file is read only. +1258 D811 ; +1259 D811 ; Entry into bdos. (DE) or (E) are the parameters passed. The +1260 D811 ; function number desired is in register (C). +1261 D811 ; +1262 D811 EB FBASE1: EX DE,HL ;save the (DE) parameters. +1263 D812 22 43 DB LD (PARAMS),HL +1264 D815 EB EX DE,HL +1265 D816 7B LD A,E ;and save register (E) in particular. +1266 D817 32 D6 E5 LD (EPARAM),A +1267 D81A 21 00 00 LD HL,0 +1268 D81D 22 45 DB LD (STATUS),HL ;clear return status. +1269 D820 39 ADD HL,SP +1270 D821 22 0F DB LD (USRSTACK),HL ;save users stack pointer. +1271 D824 31 41 DB LD SP,STKAREA ;and set our own. +1272 D827 AF XOR A ;clear auto select storage space. +1273 D828 32 E0 E5 LD (AUTOFLAG),A +1274 D82B 32 DE E5 LD (AUTO),A +1275 D82E 21 74 E5 LD HL,GOBACK ;set return address. +1276 D831 E5 PUSH HL +1277 D832 79 LD A,C ;get function number. +1278 D833 FE 29 CP NFUNCTS ;valid function number? +1279 D835 D0 RET NC +1280 D836 4B LD C,E ;keep single register function here. +1281 D837 21 47 D8 LD HL,FUNCTNS ;now look thru the function table. +1282 D83A 5F LD E,A +1283 D83B 16 00 LD D,0 ;(DE)=function number. +1284 D83D 19 ADD HL,DE +1285 D83E 19 ADD HL,DE ;(HL)=(start of table)+2*(function number). +1286 D83F 5E LD E,(HL) +1287 D840 23 INC HL +1288 D841 56 LD D,(HL) ;now (DE)=address for this function. +1289 D842 2A 43 DB LD HL,(PARAMS) ;retrieve parameters. +1290 D845 EB EX DE,HL ;now (DE) has the original parameters. +1291 D846 E9 JP (HL) ;execute desired function. +1292 D847 ; +1293 D847 ; BDOS function jump table. +1294 D847 ; +1295 D847 NFUNCTS .EQU 41 ;number of functions in followin table. +1296 D847 ; +1297 D847 03 E6 C8 DA FUNCTNS:.DW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB +1297 D84B 90 D9 CE DA +1297 D84F 12 E6 0F E6 +1297 D853 D4 DA ED DA +1298 D857 F3 DA F8 DA .DW SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL +1298 D85B E1 D9 FE DA +1298 D85F 7E E4 83 E4 +1298 D863 45 E4 9C E4 +1299 D867 A5 E4 AB E4 .DW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE +1299 D86B C8 E4 D7 E4 +1299 D86F E0 E4 E6 E4 +1299 D873 EC E4 +1300 D875 F5 E4 FE E4 .DW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR +1300 D879 04 E5 0A E5 +1300 D87D 11 E5 2C DD +1300 D881 17 E5 1D E5 +1301 D885 26 E5 2D E5 .DW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN +1301 D889 41 E5 47 E5 +1301 D88D 4D E5 0E E4 +1301 D891 53 E5 04 DB +1302 D895 04 DB 9B E5 .DW RTN,WTSPECL +1303 D899 ; +1304 D899 ; Bdos error message section. +1305 D899 ; +1306 D899 21 CA D8 ERROR1: LD HL,BADSEC ;bad sector message. +1307 D89C CD E5 D8 CALL PRTERR ;print it and get a 1 char responce. +1308 D89F FE 03 CP CNTRLC ;re-boot request (control-c)? +1309 D8A1 CA 00 00 JP Z,0 ;yes. +1310 D8A4 C9 RET ;no, return to retry i/o function. +1311 D8A5 ; +1312 D8A5 21 D5 D8 ERROR2: LD HL,BADSEL ;bad drive selected. +1313 D8A8 C3 B4 D8 JP ERROR5 +1314 D8AB ; +1315 D8AB 21 E1 D8 ERROR3: LD HL,DISKRO ;disk is read only. +1316 D8AE C3 B4 D8 JP ERROR5 +1317 D8B1 ; +1318 D8B1 21 DC D8 ERROR4: LD HL,FILERO ;file is read only. +1319 D8B4 ; +1320 D8B4 CD E5 D8 ERROR5: CALL PRTERR +1321 D8B7 C3 00 00 JP 0 ;always reboot on these errors. +1322 D8BA ; +1323 D8BA 42 64 6F 73 BDOSERR:.TEXT "Bdos Err On " +1323 D8BE 20 45 72 72 +1323 D8C2 20 4F 6E 20 +1324 D8C6 20 3A 20 24 BDOSDRV:.TEXT " : $" +1325 D8CA 42 61 64 20 BADSEC: .TEXT "Bad Sector$" +1325 D8CE 53 65 63 74 +1325 D8D2 6F 72 24 +1326 D8D5 53 65 6C 65 BADSEL: .TEXT "Select$" +1326 D8D9 63 74 24 +1327 D8DC 46 69 6C 65 FILERO: .TEXT "File " +1327 D8E0 20 +1328 D8E1 52 2F 4F 24 DISKRO: .TEXT "R/O$" +1329 D8E5 ; +1330 D8E5 ; Print bdos error message. +1331 D8E5 ; +1332 D8E5 E5 PRTERR: PUSH HL ;save second message pointer. +1333 D8E6 CD C9 D9 CALL OUTCRLF ;send (cr)(lf). +1334 D8E9 3A 42 DB LD A,(ACTIVE) ;get active drive. +1335 D8EC C6 41 ADD A,'A' ;make ascii. +1336 D8EE 32 C6 D8 LD (BDOSDRV),A ;and put in message. +1337 D8F1 01 BA D8 LD BC,BDOSERR ;and print it. +1338 D8F4 CD D3 D9 CALL PRTMESG +1339 D8F7 C1 POP BC ;print second message line now. +1340 D8F8 CD D3 D9 CALL PRTMESG +1341 D8FB ; +1342 D8FB ; Get an input character. We will check our 1 character +1343 D8FB ; buffer first. This may be set by the console status routine. +1344 D8FB ; +1345 D8FB 21 0E DB GETCHAR:LD HL,CHARBUF ;check character buffer. +1346 D8FE 7E LD A,(HL) ;anything present already? +1347 D8FF 36 00 LD (HL),0 ;...either case clear it. +1348 D901 B7 OR A +1349 D902 C0 RET NZ ;yes, use it. +1350 D903 C3 09 E6 JP CONIN ;nope, go get a character responce. +1351 D906 ; +1352 D906 ; Input and echo a character. +1353 D906 ; +1354 D906 CD FB D8 GETECHO:CALL GETCHAR ;input a character. +1355 D909 CD 14 D9 CALL CHKCHAR ;carriage control? +1356 D90C D8 RET C ;no, a regular control char so don't echo. +1357 D90D F5 PUSH AF ;ok, save character now. +1358 D90E 4F LD C,A +1359 D90F CD 90 D9 CALL OUTCON ;and echo it. +1360 D912 F1 POP AF ;get character and return. +1361 D913 C9 RET +1362 D914 ; +1363 D914 ; Check character in (A). Set the zero flag on a carriage +1364 D914 ; control character and the carry flag on any other control +1365 D914 ; character. +1366 D914 ; +1367 D914 FE 0D CHKCHAR:CP CR ;check for carriage return, line feed, backspace, +1368 D916 C8 RET Z ;or a tab. +1369 D917 FE 0A CP LF +1370 D919 C8 RET Z +1371 D91A FE 09 CP TAB +1372 D91C C8 RET Z +1373 D91D FE 08 CP BS +1374 D91F C8 RET Z +1375 D920 FE 20 CP ' ' ;other control char? Set carry flag. +1376 D922 C9 RET +1377 D923 ; +1378 D923 ; Check the console during output. Halt on a control-s, then +1379 D923 ; reboot on a control-c. If anything else is ready, clear the +1380 D923 ; zero flag and return (the calling routine may want to do +1381 D923 ; something). +1382 D923 ; +1383 D923 3A 0E DB CKCONSOL: LD A,(CHARBUF) ;check buffer. +1384 D926 B7 OR A ;if anything, just return without checking. +1385 D927 C2 45 D9 JP NZ,CKCON2 +1386 D92A CD 06 E6 CALL CONST ;nothing in buffer. Check console. +1387 D92D E6 01 AND 01H ;look at bit 0. +1388 D92F C8 RET Z ;return if nothing. +1389 D930 CD 09 E6 CALL CONIN ;ok, get it. +1390 D933 FE 13 CP CNTRLS ;if not control-s, return with zero cleared. +1391 D935 C2 42 D9 JP NZ,CKCON1 +1392 D938 CD 09 E6 CALL CONIN ;halt processing until another char +1393 D93B FE 03 CP CNTRLC ;is typed. Control-c? +1394 D93D CA 00 00 JP Z,0 ;yes, reboot now. +1395 D940 AF XOR A ;no, just pretend nothing was ever ready. +1396 D941 C9 RET +1397 D942 32 0E DB CKCON1: LD (CHARBUF),A ;save character in buffer for later processing. +1398 D945 3E 01 CKCON2: LD A,1 ;set (A) to non zero to mean something is ready. +1399 D947 C9 RET +1400 D948 ; +1401 D948 ; Output (C) to the screen. If the printer flip-flop flag +1402 D948 ; is set, we will send character to printer also. The console +1403 D948 ; will be checked in the process. +1404 D948 ; +1405 D948 3A 0A DB OUTCHAR:LD A,(OUTFLAG) ;check output flag. +1406 D94B B7 OR A ;anything and we won't generate output. +1407 D94C C2 62 D9 JP NZ,OUTCHR1 +1408 D94F C5 PUSH BC +1409 D950 CD 23 D9 CALL CKCONSOL ;check console (we don't care whats there). +1410 D953 C1 POP BC +1411 D954 C5 PUSH BC +1412 D955 CD 0C E6 CALL CONOUT ;output (C) to the screen. +1413 D958 C1 POP BC +1414 D959 C5 PUSH BC +1415 D95A 3A 0D DB LD A,(PRTFLAG) ;check printer flip-flop flag. +1416 D95D B7 OR A +1417 D95E C4 0F E6 CALL NZ,LIST ;print it also if non-zero. +1418 D961 C1 POP BC +1419 D962 79 OUTCHR1:LD A,C ;update cursors position. +1420 D963 21 0C DB LD HL,CURPOS +1421 D966 FE 7F CP DEL ;rubouts don't do anything here. +1422 D968 C8 RET Z +1423 D969 34 INC (HL) ;bump line pointer. +1424 D96A FE 20 CP ' ' ;and return if a normal character. +1425 D96C D0 RET NC +1426 D96D 35 DEC (HL) ;restore and check for the start of the line. +1427 D96E 7E LD A,(HL) +1428 D96F B7 OR A +1429 D970 C8 RET Z ;ingnore control characters at the start of the line. +1430 D971 79 LD A,C +1431 D972 FE 08 CP BS ;is it a backspace? +1432 D974 C2 79 D9 JP NZ,OUTCHR2 +1433 D977 35 DEC (HL) ;yes, backup pointer. +1434 D978 C9 RET +1435 D979 FE 0A OUTCHR2:CP LF ;is it a line feed? +1436 D97B C0 RET NZ ;ignore anything else. +1437 D97C 36 00 LD (HL),0 ;reset pointer to start of line. +1438 D97E C9 RET +1439 D97F ; +1440 D97F ; Output (A) to the screen. If it is a control character +1441 D97F ; (other than carriage control), use ^x format. +1442 D97F ; +1443 D97F 79 SHOWIT: LD A,C +1444 D980 CD 14 D9 CALL CHKCHAR ;check character. +1445 D983 D2 90 D9 JP NC,OUTCON ;not a control, use normal output. +1446 D986 F5 PUSH AF +1447 D987 0E 5E LD C,'^' ;for a control character, preceed it with '^'. +1448 D989 CD 48 D9 CALL OUTCHAR +1449 D98C F1 POP AF +1450 D98D F6 40 OR '@' ;and then use the letter equivelant. +1451 D98F 4F LD C,A +1452 D990 ; +1453 D990 ; Function to output (C) to the console device and expand tabs +1454 D990 ; if necessary. +1455 D990 ; +1456 D990 79 OUTCON: LD A,C +1457 D991 FE 09 CP TAB ;is it a tab? +1458 D993 C2 48 D9 JP NZ,OUTCHAR ;use regular output. +1459 D996 0E 20 OUTCON1:LD C,' ' ;yes it is, use spaces instead. +1460 D998 CD 48 D9 CALL OUTCHAR +1461 D99B 3A 0C DB LD A,(CURPOS) ;go until the cursor is at a multiple of 8 +1462 D99E +1463 D99E E6 07 AND 07H ;position. +1464 D9A0 C2 96 D9 JP NZ,OUTCON1 +1465 D9A3 C9 RET +1466 D9A4 ; +1467 D9A4 ; Echo a backspace character. Erase the prevoius character +1468 D9A4 ; on the screen. +1469 D9A4 ; +1470 D9A4 CD AC D9 BACKUP: CALL BACKUP1 ;backup the screen 1 place. +1471 D9A7 0E 20 LD C,' ' ;then blank that character. +1472 D9A9 CD 0C E6 CALL CONOUT +1473 D9AC 0E 08 BACKUP1:LD C,BS ;then back space once more. +1474 D9AE C3 0C E6 JP CONOUT +1475 D9B1 ; +1476 D9B1 ; Signal a deleted line. Print a '#' at the end and start +1477 D9B1 ; over. +1478 D9B1 ; +1479 D9B1 0E 23 NEWLINE:LD C,'#' +1480 D9B3 CD 48 D9 CALL OUTCHAR ;print this. +1481 D9B6 CD C9 D9 CALL OUTCRLF ;start new line. +1482 D9B9 3A 0C DB NEWLN1: LD A,(CURPOS) ;move the cursor to the starting position. +1483 D9BC 21 0B DB LD HL,STARTING +1484 D9BF BE CP (HL) +1485 D9C0 D0 RET NC ;there yet? +1486 D9C1 0E 20 LD C,' ' +1487 D9C3 CD 48 D9 CALL OUTCHAR ;nope, keep going. +1488 D9C6 C3 B9 D9 JP NEWLN1 +1489 D9C9 ; +1490 D9C9 ; Output a (cr) (lf) to the console device (screen). +1491 D9C9 ; +1492 D9C9 0E 0D OUTCRLF:LD C,CR +1493 D9CB CD 48 D9 CALL OUTCHAR +1494 D9CE 0E 0A LD C,LF +1495 D9D0 C3 48 D9 JP OUTCHAR +1496 D9D3 ; +1497 D9D3 ; Print message pointed to by (BC). It will end with a '$'. +1498 D9D3 ; +1499 D9D3 0A PRTMESG:LD A,(BC) ;check for terminating character. +1500 D9D4 FE 24 CP '$' +1501 D9D6 C8 RET Z +1502 D9D7 03 INC BC +1503 D9D8 C5 PUSH BC ;otherwise, bump pointer and print it. +1504 D9D9 4F LD C,A +1505 D9DA CD 90 D9 CALL OUTCON +1506 D9DD C1 POP BC +1507 D9DE C3 D3 D9 JP PRTMESG +1508 D9E1 ; +1509 D9E1 ; Function to execute a buffered read. +1510 D9E1 ; +1511 D9E1 3A 0C DB RDBUFF: LD A,(CURPOS) ;use present location as starting one. +1512 D9E4 32 0B DB LD (STARTING),A +1513 D9E7 2A 43 DB LD HL,(PARAMS) ;get the maximum buffer space. +1514 D9EA 4E LD C,(HL) +1515 D9EB 23 INC HL ;point to first available space. +1516 D9EC E5 PUSH HL ;and save. +1517 D9ED 06 00 LD B,0 ;keep a character count. +1518 D9EF C5 RDBUF1: PUSH BC +1519 D9F0 E5 PUSH HL +1520 D9F1 CD FB D8 RDBUF2: CALL GETCHAR ;get the next input character. +1521 D9F4 E6 7F AND 7FH ;strip bit 7. +1522 D9F6 E1 POP HL ;reset registers. +1523 D9F7 C1 POP BC +1524 D9F8 FE 0D CP CR ;en of the line? +1525 D9FA CA C1 DA JP Z,RDBUF17 +1526 D9FD FE 0A CP LF +1527 D9FF CA C1 DA JP Z,RDBUF17 +1528 DA02 FE 08 CP BS ;how about a backspace? +1529 DA04 C2 16 DA JP NZ,RDBUF3 +1530 DA07 78 LD A,B ;yes, but ignore at the beginning of the line. +1531 DA08 B7 OR A +1532 DA09 CA EF D9 JP Z,RDBUF1 +1533 DA0C 05 DEC B ;ok, update counter. +1534 DA0D 3A 0C DB LD A,(CURPOS) ;if we backspace to the start of the line, +1535 DA10 32 0A DB LD (OUTFLAG),A ;treat as a cancel (control-x). +1536 DA13 C3 70 DA JP RDBUF10 +1537 DA16 FE 7F RDBUF3: CP DEL ;user typed a rubout? +1538 DA18 C2 26 DA JP NZ,RDBUF4 +1539 DA1B 78 LD A,B ;ignore at the start of the line. +1540 DA1C B7 OR A +1541 DA1D CA EF D9 JP Z,RDBUF1 +1542 DA20 7E LD A,(HL) ;ok, echo the prevoius character. +1543 DA21 05 DEC B ;and reset pointers (counters). +1544 DA22 2B DEC HL +1545 DA23 C3 A9 DA JP RDBUF15 +1546 DA26 FE 05 RDBUF4: CP CNTRLE ;physical end of line? +1547 DA28 C2 37 DA JP NZ,RDBUF5 +1548 DA2B C5 PUSH BC ;yes, do it. +1549 DA2C E5 PUSH HL +1550 DA2D CD C9 D9 CALL OUTCRLF +1551 DA30 AF XOR A ;and update starting position. +1552 DA31 32 0B DB LD (STARTING),A +1553 DA34 C3 F1 D9 JP RDBUF2 +1554 DA37 FE 10 RDBUF5: CP CNTRLP ;control-p? +1555 DA39 C2 48 DA JP NZ,RDBUF6 +1556 DA3C E5 PUSH HL ;yes, flip the print flag filp-flop byte. +1557 DA3D 21 0D DB LD HL,PRTFLAG +1558 DA40 3E 01 LD A,1 ;PRTFLAG=1-PRTFLAG +1559 DA42 96 SUB (HL) +1560 DA43 77 LD (HL),A +1561 DA44 E1 POP HL +1562 DA45 C3 EF D9 JP RDBUF1 +1563 DA48 FE 18 RDBUF6: CP CNTRLX ;control-x (cancel)? +1564 DA4A C2 5F DA JP NZ,RDBUF8 +1565 DA4D E1 POP HL +1566 DA4E 3A 0B DB RDBUF7: LD A,(STARTING) ;yes, backup the cursor to here. +1567 DA51 21 0C DB LD HL,CURPOS +1568 DA54 BE CP (HL) +1569 DA55 D2 E1 D9 JP NC,RDBUFF ;done yet? +1570 DA58 35 DEC (HL) ;no, decrement pointer and output back up one space. +1571 DA59 CD A4 D9 CALL BACKUP +1572 DA5C C3 4E DA JP RDBUF7 +1573 DA5F FE 15 RDBUF8: CP CNTRLU ;cntrol-u (cancel line)? +1574 DA61 C2 6B DA JP NZ,RDBUF9 +1575 DA64 CD B1 D9 CALL NEWLINE ;start a new line. +1576 DA67 E1 POP HL +1577 DA68 C3 E1 D9 JP RDBUFF +1578 DA6B FE 12 RDBUF9: CP CNTRLR ;control-r? +1579 DA6D C2 A6 DA JP NZ,RDBUF14 +1580 DA70 C5 RDBUF10:PUSH BC ;yes, start a new line and retype the old one. +1581 DA71 CD B1 D9 CALL NEWLINE +1582 DA74 C1 POP BC +1583 DA75 E1 POP HL +1584 DA76 E5 PUSH HL +1585 DA77 C5 PUSH BC +1586 DA78 78 RDBUF11:LD A,B ;done whole line yet? +1587 DA79 B7 OR A +1588 DA7A CA 8A DA JP Z,RDBUF12 +1589 DA7D 23 INC HL ;nope, get next character. +1590 DA7E 4E LD C,(HL) +1591 DA7F 05 DEC B ;count it. +1592 DA80 C5 PUSH BC +1593 DA81 E5 PUSH HL +1594 DA82 CD 7F D9 CALL SHOWIT ;and display it. +1595 DA85 E1 POP HL +1596 DA86 C1 POP BC +1597 DA87 C3 78 DA JP RDBUF11 +1598 DA8A E5 RDBUF12:PUSH HL ;done with line. If we were displaying +1599 DA8B 3A 0A DB LD A,(OUTFLAG) ;then update cursor position. +1600 DA8E B7 OR A +1601 DA8F CA F1 D9 JP Z,RDBUF2 +1602 DA92 21 0C DB LD HL,CURPOS ;because this line is shorter, we must +1603 DA95 96 SUB (HL) ;back up the cursor (not the screen however) +1604 DA96 32 0A DB LD (OUTFLAG),A ;some number of positions. +1605 DA99 CD A4 D9 RDBUF13:CALL BACKUP ;note that as long as (OUTFLAG) is non +1606 DA9C 21 0A DB LD HL,OUTFLAG ;zero, the screen will not be changed. +1607 DA9F 35 DEC (HL) +1608 DAA0 C2 99 DA JP NZ,RDBUF13 +1609 DAA3 C3 F1 D9 JP RDBUF2 ;now just get the next character. +1610 DAA6 ; +1611 DAA6 ; Just a normal character, put this in our buffer and echo. +1612 DAA6 ; +1613 DAA6 23 RDBUF14:INC HL +1614 DAA7 77 LD (HL),A ;store character. +1615 DAA8 04 INC B ;and count it. +1616 DAA9 C5 RDBUF15:PUSH BC +1617 DAAA E5 PUSH HL +1618 DAAB 4F LD C,A ;echo it now. +1619 DAAC CD 7F D9 CALL SHOWIT +1620 DAAF E1 POP HL +1621 DAB0 C1 POP BC +1622 DAB1 7E LD A,(HL) ;was it an abort request? +1623 DAB2 FE 03 CP CNTRLC ;control-c abort? +1624 DAB4 78 LD A,B +1625 DAB5 C2 BD DA JP NZ,RDBUF16 +1626 DAB8 FE 01 CP 1 ;only if at start of line. +1627 DABA CA 00 00 JP Z,0 +1628 DABD B9 RDBUF16:CP C ;nope, have we filled the buffer? +1629 DABE DA EF D9 JP C,RDBUF1 +1630 DAC1 E1 RDBUF17:POP HL ;yes end the line and return. +1631 DAC2 70 LD (HL),B +1632 DAC3 0E 0D LD C,CR +1633 DAC5 C3 48 D9 JP OUTCHAR ;output (cr) and return. +1634 DAC8 ; +1635 DAC8 ; Function to get a character from the console device. +1636 DAC8 ; +1637 DAC8 CD 06 D9 GETCON: CALL GETECHO ;get and echo. +1638 DACB C3 01 DB JP SETSTAT ;save status and return. +1639 DACE ; +1640 DACE ; Function to get a character from the tape reader device. +1641 DACE ; +1642 DACE CD 15 E6 GETRDR: CALL READER ;get a character from reader, set status and return. +1643 DAD1 C3 01 DB JP SETSTAT +1644 DAD4 ; +1645 DAD4 ; Function to perform direct console i/o. If (C) contains (FF) +1646 DAD4 ; then this is an input request. If (C) contains (FE) then +1647 DAD4 ; this is a status request. Otherwise we are to output (C). +1648 DAD4 ; +1649 DAD4 79 DIRCIO: LD A,C ;test for (FF). +1650 DAD5 3C INC A +1651 DAD6 CA E0 DA JP Z,DIRC1 +1652 DAD9 3C INC A ;test for (FE). +1653 DADA CA 06 E6 JP Z,CONST +1654 DADD C3 0C E6 JP CONOUT ;just output (C). +1655 DAE0 CD 06 E6 DIRC1: CALL CONST ;this is an input request. +1656 DAE3 B7 OR A +1657 DAE4 CA 91 E5 JP Z,GOBACK1 ;not ready? Just return (directly). +1658 DAE7 CD 09 E6 CALL CONIN ;yes, get character. +1659 DAEA C3 01 DB JP SETSTAT ;set status and return. +1660 DAED ; +1661 DAED ; Function to return the i/o byte. +1662 DAED ; +1663 DAED 3A 03 00 GETIOB: LD A,(IOBYTE) +1664 DAF0 C3 01 DB JP SETSTAT +1665 DAF3 ; +1666 DAF3 ; Function to set the i/o byte. +1667 DAF3 ; +1668 DAF3 21 03 00 SETIOB: LD HL,IOBYTE +1669 DAF6 71 LD (HL),C +1670 DAF7 C9 RET +1671 DAF8 ; +1672 DAF8 ; Function to print the character string pointed to by (DE) +1673 DAF8 ; on the console device. The string ends with a '$'. +1674 DAF8 ; +1675 DAF8 EB PRTSTR: EX DE,HL +1676 DAF9 4D LD C,L +1677 DAFA 44 LD B,H ;now (BC) points to it. +1678 DAFB C3 D3 D9 JP PRTMESG +1679 DAFE ; +1680 DAFE ; Function to interigate the console device. +1681 DAFE ; +1682 DAFE CD 23 D9 GETCSTS:CALL CKCONSOL +1683 DB01 ; +1684 DB01 ; Get here to set the status and return to the cleanup +1685 DB01 ; section. Then back to the user. +1686 DB01 ; +1687 DB01 32 45 DB SETSTAT:LD (STATUS),A +1688 DB04 C9 RTN: RET +1689 DB05 ; +1690 DB05 ; Set the status to 1 (read or write error code). +1691 DB05 ; +1692 DB05 3E 01 IOERR1: LD A,1 +1693 DB07 C3 01 DB JP SETSTAT +1694 DB0A ; +1695 DB0A 00 OUTFLAG:.DB 0 ;output flag (non zero means no output). +1696 DB0B 02 STARTING: .DB 2 ;starting position for cursor. +1697 DB0C 00 CURPOS: .DB 0 ;cursor position (0=start of line). +1698 DB0D 00 PRTFLAG:.DB 0 ;printer flag (control-p toggle). List if non zero. +1699 DB0E 00 CHARBUF:.DB 0 ;single input character buffer. +1700 DB0F ; +1701 DB0F ; Stack area for BDOS calls. +1702 DB0F ; +1703 DB0F 00 00 USRSTACK: .DW 0 ;save users stack pointer here. +1704 DB11 ; +1705 DB11 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1705 DB15 00 00 00 00 +1705 DB19 00 00 00 00 +1705 DB1D 00 00 00 00 +1705 DB21 00 00 00 00 +1705 DB25 00 00 00 00 +1706 DB29 00 00 00 00 .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +1706 DB2D 00 00 00 00 +1706 DB31 00 00 00 00 +1706 DB35 00 00 00 00 +1706 DB39 00 00 00 00 +1706 DB3D 00 00 00 00 +1707 DB41 STKAREA .EQU $ ;end of stack area. +1708 DB41 ; +1709 DB41 00 USERNO: .DB 0 ;current user number. +1710 DB42 00 ACTIVE: .DB 0 ;currently active drive. +1711 DB43 00 00 PARAMS: .DW 0 ;save (DE) parameters here on entry. +1712 DB45 00 00 STATUS: .DW 0 ;status returned from bdos function. +1713 DB47 ; +1714 DB47 ; Select error occured, jump to error routine. +1715 DB47 ; +1716 DB47 21 0B D8 SLCTERR:LD HL,BADSLCT +1717 DB4A ; +1718 DB4A ; Jump to (HL) indirectly. +1719 DB4A ; +1720 DB4A 5E JUMPHL: LD E,(HL) +1721 DB4B 23 INC HL +1722 DB4C 56 LD D,(HL) ;now (DE) contain the desired address. +1723 DB4D EB EX DE,HL +1724 DB4E E9 JP (HL) +1725 DB4F ; +1726 DB4F ; Block move. (DE) to (HL), (C) bytes total. +1727 DB4F ; +1728 DB4F 0C DE2HL: INC C ;is count down to zero? +1729 DB50 0D DE2HL1: DEC C +1730 DB51 C8 RET Z ;yes, we are done. +1731 DB52 1A LD A,(DE) ;no, move one more byte. +1732 DB53 77 LD (HL),A +1733 DB54 13 INC DE +1734 DB55 23 INC HL +1735 DB56 C3 50 DB JP DE2HL1 ;and repeat. +1736 DB59 ; +1737 DB59 ; Select the desired drive. +1738 DB59 ; +1739 DB59 3A 42 DB SELECT: LD A,(ACTIVE) ;get active disk. +1740 DB5C 4F LD C,A +1741 DB5D CD 1B E6 CALL SELDSK ;select it. +1742 DB60 7C LD A,H ;valid drive? +1743 DB61 B5 OR L ;valid drive? +1744 DB62 C8 RET Z ;return if not. +1745 DB63 ; +1746 DB63 ; Here, the BIOS returned the address of the parameter block +1747 DB63 ; in (HL). We will extract the necessary pointers and save them. +1748 DB63 ; +1749 DB63 5E LD E,(HL) ;yes, get address of translation table into (DE). +1750 DB64 23 INC HL +1751 DB65 56 LD D,(HL) +1752 DB66 23 INC HL +1753 DB67 22 B3 E5 LD (SCRATCH1),HL ;save pointers to scratch areas. +1754 DB6A 23 INC HL +1755 DB6B 23 INC HL +1756 DB6C 22 B5 E5 LD (SCRATCH2),HL ;ditto. +1757 DB6F 23 INC HL +1758 DB70 23 INC HL +1759 DB71 22 B7 E5 LD (SCRATCH3),HL ;ditto. +1760 DB74 23 INC HL +1761 DB75 23 INC HL +1762 DB76 EB EX DE,HL ;now save the translation table address. +1763 DB77 22 D0 E5 LD (XLATE),HL +1764 DB7A 21 B9 E5 LD HL,DIRBUF ;put the next 8 bytes here. +1765 DB7D 0E 08 LD C,8 ;they consist of the directory buffer +1766 DB7F CD 4F DB CALL DE2HL ;pointer, parameter block pointer, +1767 DB82 2A BB E5 LD HL,(DISKPB) ;check and allocation vectors. +1768 DB85 EB EX DE,HL +1769 DB86 21 C1 E5 LD HL,SECTORS ;move parameter block into our ram. +1770 DB89 0E 0F LD C,15 ;it is 15 bytes long. +1771 DB8B CD 4F DB CALL DE2HL +1772 DB8E 2A C6 E5 LD HL,(DSKSIZE) ;check disk size. +1773 DB91 7C LD A,H ;more than 256 blocks on this? +1774 DB92 21 DD E5 LD HL,BIGDISK +1775 DB95 36 FF LD (HL),0FFH ;set to samll. +1776 DB97 B7 OR A +1777 DB98 CA 9D DB JP Z,SELECT1 +1778 DB9B 36 00 LD (HL),0 ;wrong, set to large. +1779 DB9D 3E FF SELECT1:LD A,0FFH ;clear the zero flag. +1780 DB9F B7 OR A +1781 DBA0 C9 RET +1782 DBA1 ; +1783 DBA1 ; Routine to home the disk track head and clear pointers. +1784 DBA1 ; +1785 DBA1 CD 18 E6 HOMEDRV:CALL HOME ;home the head. +1786 DBA4 AF XOR A +1787 DBA5 2A B5 E5 LD HL,(SCRATCH2) ;set our track pointer also. +1788 DBA8 77 LD (HL),A +1789 DBA9 23 INC HL +1790 DBAA 77 LD (HL),A +1791 DBAB 2A B7 E5 LD HL,(SCRATCH3) ;and our sector pointer. +1792 DBAE 77 LD (HL),A +1793 DBAF 23 INC HL +1794 DBB0 77 LD (HL),A +1795 DBB1 C9 RET +1796 DBB2 ; +1797 DBB2 ; Do the actual disk read and check the error return status. +1798 DBB2 ; +1799 DBB2 CD 27 E6 DOREAD: CALL READ +1800 DBB5 C3 BB DB JP IORET +1801 DBB8 ; +1802 DBB8 ; Do the actual disk write and handle any bios error. +1803 DBB8 ; +1804 DBB8 CD 2A E6 DOWRITE:CALL WRITE +1805 DBBB B7 IORET: OR A +1806 DBBC C8 RET Z ;return unless an error occured. +1807 DBBD 21 09 D8 LD HL,BADSCTR ;bad read/write on this sector. +1808 DBC0 C3 4A DB JP JUMPHL +1809 DBC3 ; +1810 DBC3 ; Routine to select the track and sector that the desired +1811 DBC3 ; block number falls in. +1812 DBC3 ; +1813 DBC3 2A EA E5 TRKSEC: LD HL,(FILEPOS) ;get position of last accessed file +1814 DBC6 0E 02 LD C,2 ;in directory and compute sector #. +1815 DBC8 CD EA DC CALL SHIFTR ;sector #=file-position/4. +1816 DBCB 22 E5 E5 LD (BLKNMBR),HL ;save this as the block number of interest. +1817 DBCE 22 EC E5 LD (CKSUMTBL),HL ;what's it doing here too? +1818 DBD1 ; +1819 DBD1 ; if the sector number has already been set (BLKNMBR), enter +1820 DBD1 ; at this point. +1821 DBD1 ; +1822 DBD1 21 E5 E5 TRKSEC1:LD HL,BLKNMBR +1823 DBD4 4E LD C,(HL) ;move sector number into (BC). +1824 DBD5 23 INC HL +1825 DBD6 46 LD B,(HL) +1826 DBD7 2A B7 E5 LD HL,(SCRATCH3) ;get current sector number and +1827 DBDA 5E LD E,(HL) ;move this into (DE). +1828 DBDB 23 INC HL +1829 DBDC 56 LD D,(HL) +1830 DBDD 2A B5 E5 LD HL,(SCRATCH2) ;get current track number. +1831 DBE0 7E LD A,(HL) ;and this into (HL). +1832 DBE1 23 INC HL +1833 DBE2 66 LD H,(HL) +1834 DBE3 6F LD L,A +1835 DBE4 79 TRKSEC2:LD A,C ;is desired sector before current one? +1836 DBE5 93 SUB E +1837 DBE6 78 LD A,B +1838 DBE7 9A SBC A,D +1839 DBE8 D2 FA DB JP NC,TRKSEC3 +1840 DBEB E5 PUSH HL ;yes, decrement sectors by one track. +1841 DBEC 2A C1 E5 LD HL,(SECTORS) ;get sectors per track. +1842 DBEF 7B LD A,E +1843 DBF0 95 SUB L +1844 DBF1 5F LD E,A +1845 DBF2 7A LD A,D +1846 DBF3 9C SBC A,H +1847 DBF4 57 LD D,A ;now we have backed up one full track. +1848 DBF5 E1 POP HL +1849 DBF6 2B DEC HL ;adjust track counter. +1850 DBF7 C3 E4 DB JP TRKSEC2 +1851 DBFA E5 TRKSEC3:PUSH HL ;desired sector is after current one. +1852 DBFB 2A C1 E5 LD HL,(SECTORS) ;get sectors per track. +1853 DBFE 19 ADD HL,DE ;bump sector pointer to next track. +1854 DBFF DA 0F DC JP C,TRKSEC4 +1855 DC02 79 LD A,C ;is desired sector now before current one? +1856 DC03 95 SUB L +1857 DC04 78 LD A,B +1858 DC05 9C SBC A,H +1859 DC06 DA 0F DC JP C,TRKSEC4 +1860 DC09 EB EX DE,HL ;not yes, increment track counter +1861 DC0A E1 POP HL ;and continue until it is. +1862 DC0B 23 INC HL +1863 DC0C C3 FA DB JP TRKSEC3 +1864 DC0F ; +1865 DC0F ; here we have determined the track number that contains the +1866 DC0F ; desired sector. +1867 DC0F ; +1868 DC0F E1 TRKSEC4:POP HL ;get track number (HL). +1869 DC10 C5 PUSH BC +1870 DC11 D5 PUSH DE +1871 DC12 E5 PUSH HL +1872 DC13 EB EX DE,HL +1873 DC14 2A CE E5 LD HL,(OFFSET) ;adjust for first track offset. +1874 DC17 19 ADD HL,DE +1875 DC18 44 LD B,H +1876 DC19 4D LD C,L +1877 DC1A CD 1E E6 CALL SETTRK ;select this track. +1878 DC1D D1 POP DE ;reset current track pointer. +1879 DC1E 2A B5 E5 LD HL,(SCRATCH2) +1880 DC21 73 LD (HL),E +1881 DC22 23 INC HL +1882 DC23 72 LD (HL),D +1883 DC24 D1 POP DE +1884 DC25 2A B7 E5 LD HL,(SCRATCH3) ;reset the first sector on this track. +1885 DC28 73 LD (HL),E +1886 DC29 23 INC HL +1887 DC2A 72 LD (HL),D +1888 DC2B C1 POP BC +1889 DC2C 79 LD A,C ;now subtract the desired one. +1890 DC2D 93 SUB E ;to make it relative (1-# sectors/track). +1891 DC2E 4F LD C,A +1892 DC2F 78 LD A,B +1893 DC30 9A SBC A,D +1894 DC31 47 LD B,A +1895 DC32 2A D0 E5 LD HL,(XLATE) ;translate this sector according to this table. +1896 DC35 EB EX DE,HL +1897 DC36 CD 30 E6 CALL SECTRN ;let the bios translate it. +1898 DC39 4D LD C,L +1899 DC3A 44 LD B,H +1900 DC3B C3 21 E6 JP SETSEC ;and select it. +1901 DC3E ; +1902 DC3E ; Compute block number from record number (SAVNREC) and +1903 DC3E ; extent number (SAVEXT). +1904 DC3E ; +1905 DC3E 21 C3 E5 GETBLOCK: LD HL,BLKSHFT ;get logical to physical conversion. +1906 DC41 4E LD C,(HL) ;note that this is base 2 log of ratio. +1907 DC42 3A E3 E5 LD A,(SAVNREC) ;get record number. +1908 DC45 B7 GETBLK1:OR A ;compute (A)=(A)/2^BLKSHFT. +1909 DC46 1F RRA +1910 DC47 0D DEC C +1911 DC48 C2 45 DC JP NZ,GETBLK1 +1912 DC4B 47 LD B,A ;save result in (B). +1913 DC4C 3E 08 LD A,8 +1914 DC4E 96 SUB (HL) +1915 DC4F 4F LD C,A ;compute (C)=8-BLKSHFT. +1916 DC50 3A E2 E5 LD A,(SAVEXT) +1917 DC53 0D GETBLK2:DEC C ;compute (A)=SAVEXT*2^(8-BLKSHFT). +1918 DC54 CA 5C DC JP Z,GETBLK3 +1919 DC57 B7 OR A +1920 DC58 17 RLA +1921 DC59 C3 53 DC JP GETBLK2 +1922 DC5C 80 GETBLK3:ADD A,B +1923 DC5D C9 RET +1924 DC5E ; +1925 DC5E ; Routine to extract the (BC) block byte from the fcb pointed +1926 DC5E ; to by (PARAMS). If this is a big-disk, then these are 16 bit +1927 DC5E ; block numbers, else they are 8 bit numbers. +1928 DC5E ; Number is returned in (HL). +1929 DC5E ; +1930 DC5E 2A 43 DB EXTBLK: LD HL,(PARAMS) ;get fcb address. +1931 DC61 11 10 00 LD DE,16 ;block numbers start 16 bytes into fcb. +1932 DC64 19 ADD HL,DE +1933 DC65 09 ADD HL,BC +1934 DC66 3A DD E5 LD A,(BIGDISK) ;are we using a big-disk? +1935 DC69 B7 OR A +1936 DC6A CA 71 DC JP Z,EXTBLK1 +1937 DC6D 6E LD L,(HL) ;no, extract an 8 bit number from the fcb. +1938 DC6E 26 00 LD H,0 +1939 DC70 C9 RET +1940 DC71 09 EXTBLK1:ADD HL,BC ;yes, extract a 16 bit number. +1941 DC72 5E LD E,(HL) +1942 DC73 23 INC HL +1943 DC74 56 LD D,(HL) +1944 DC75 EB EX DE,HL ;return in (HL). +1945 DC76 C9 RET +1946 DC77 ; +1947 DC77 ; Compute block number. +1948 DC77 ; +1949 DC77 CD 3E DC COMBLK: CALL GETBLOCK +1950 DC7A 4F LD C,A +1951 DC7B 06 00 LD B,0 +1952 DC7D CD 5E DC CALL EXTBLK +1953 DC80 22 E5 E5 LD (BLKNMBR),HL +1954 DC83 C9 RET +1955 DC84 ; +1956 DC84 ; Check for a zero block number (unused). +1957 DC84 ; +1958 DC84 2A E5 E5 CHKBLK: LD HL,(BLKNMBR) +1959 DC87 7D LD A,L ;is it zero? +1960 DC88 B4 OR H +1961 DC89 C9 RET +1962 DC8A ; +1963 DC8A ; Adjust physical block (BLKNMBR) and convert to logical +1964 DC8A ; sector (LOGSECT). This is the starting sector of this block. +1965 DC8A ; The actual sector of interest is then added to this and the +1966 DC8A ; resulting sector number is stored back in (BLKNMBR). This +1967 DC8A ; will still have to be adjusted for the track number. +1968 DC8A ; +1969 DC8A 3A C3 E5 LOGICAL:LD A,(BLKSHFT) ;get log2(physical/logical sectors). +1970 DC8D 2A E5 E5 LD HL,(BLKNMBR) ;get physical sector desired. +1971 DC90 29 LOGICL1:ADD HL,HL ;compute logical sector number. +1972 DC91 3D DEC A ;note logical sectors are 128 bytes long. +1973 DC92 C2 90 DC JP NZ,LOGICL1 +1974 DC95 22 E7 E5 LD (LOGSECT),HL ;save logical sector. +1975 DC98 3A C4 E5 LD A,(BLKMASK) ;get block mask. +1976 DC9B 4F LD C,A +1977 DC9C 3A E3 E5 LD A,(SAVNREC) ;get next sector to access. +1978 DC9F A1 AND C ;extract the relative position within physical block. +1979 DCA0 B5 OR L ;and add it too logical sector. +1980 DCA1 6F LD L,A +1981 DCA2 22 E5 E5 LD (BLKNMBR),HL ;and store. +1982 DCA5 C9 RET +1983 DCA6 ; +1984 DCA6 ; Set (HL) to point to extent byte in fcb. +1985 DCA6 ; +1986 DCA6 2A 43 DB SETEXT: LD HL,(PARAMS) +1987 DCA9 11 0C 00 LD DE,12 ;it is the twelth byte. +1988 DCAC 19 ADD HL,DE +1989 DCAD C9 RET +1990 DCAE ; +1991 DCAE ; Set (HL) to point to record count byte in fcb and (DE) to +1992 DCAE ; next record number byte. +1993 DCAE ; +1994 DCAE 2A 43 DB SETHLDE:LD HL,(PARAMS) +1995 DCB1 11 0F 00 LD DE,15 ;record count byte (#15). +1996 DCB4 19 ADD HL,DE +1997 DCB5 EB EX DE,HL +1998 DCB6 21 11 00 LD HL,17 ;next record number (#32). +1999 DCB9 19 ADD HL,DE +2000 DCBA C9 RET +2001 DCBB ; +2002 DCBB ; Save current file data from fcb. +2003 DCBB ; +2004 DCBB CD AE DC STRDATA:CALL SETHLDE +2005 DCBE 7E LD A,(HL) ;get and store record count byte. +2006 DCBF 32 E3 E5 LD (SAVNREC),A +2007 DCC2 EB EX DE,HL +2008 DCC3 7E LD A,(HL) ;get and store next record number byte. +2009 DCC4 32 E1 E5 LD (SAVNXT),A +2010 DCC7 CD A6 DC CALL SETEXT ;point to extent byte. +2011 DCCA 3A C5 E5 LD A,(EXTMASK) ;get extent mask. +2012 DCCD A6 AND (HL) +2013 DCCE 32 E2 E5 LD (SAVEXT),A ;and save extent here. +2014 DCD1 C9 RET +2015 DCD2 ; +2016 DCD2 ; Set the next record to access. If (MODE) is set to 2, then +2017 DCD2 ; the last record byte (SAVNREC) has the correct number to access. +2018 DCD2 ; For sequential access, (MODE) will be equal to 1. +2019 DCD2 ; +2020 DCD2 CD AE DC SETNREC:CALL SETHLDE +2021 DCD5 3A D5 E5 LD A,(MODE) ;get sequential flag (=1). +2022 DCD8 FE 02 CP 2 ;a 2 indicates that no adder is needed. +2023 DCDA C2 DE DC JP NZ,STNREC1 +2024 DCDD AF XOR A ;clear adder (random access?). +2025 DCDE 4F STNREC1:LD C,A +2026 DCDF 3A E3 E5 LD A,(SAVNREC) ;get last record number. +2027 DCE2 81 ADD A,C ;increment record count. +2028 DCE3 77 LD (HL),A ;and set fcb's next record byte. +2029 DCE4 EB EX DE,HL +2030 DCE5 3A E1 E5 LD A,(SAVNXT) ;get next record byte from storage. +2031 DCE8 77 LD (HL),A ;and put this into fcb as number of records used. +2032 DCE9 C9 RET +2033 DCEA ; +2034 DCEA ; Shift (HL) right (C) bits. +2035 DCEA ; +2036 DCEA 0C SHIFTR: INC C +2037 DCEB 0D SHIFTR1:DEC C +2038 DCEC C8 RET Z +2039 DCED 7C LD A,H +2040 DCEE B7 OR A +2041 DCEF 1F RRA +2042 DCF0 67 LD H,A +2043 DCF1 7D LD A,L +2044 DCF2 1F RRA +2045 DCF3 6F LD L,A +2046 DCF4 C3 EB DC JP SHIFTR1 +2047 DCF7 ; +2048 DCF7 ; Compute the check-sum for the directory buffer. Return +2049 DCF7 ; integer sum in (A). +2050 DCF7 ; +2051 DCF7 0E 80 CHECKSUM: LD C,128 ;length of buffer. +2052 DCF9 2A B9 E5 LD HL,(DIRBUF) ;get its location. +2053 DCFC AF XOR A ;clear summation byte. +2054 DCFD 86 CHKSUM1:ADD A,(HL) ;and compute sum ignoring carries. +2055 DCFE 23 INC HL +2056 DCFF 0D DEC C +2057 DD00 C2 FD DC JP NZ,CHKSUM1 +2058 DD03 C9 RET +2059 DD04 ; +2060 DD04 ; Shift (HL) left (C) bits. +2061 DD04 ; +2062 DD04 0C SHIFTL: INC C +2063 DD05 0D SHIFTL1:DEC C +2064 DD06 C8 RET Z +2065 DD07 29 ADD HL,HL ;shift left 1 bit. +2066 DD08 C3 05 DD JP SHIFTL1 +2067 DD0B ; +2068 DD0B ; Routine to set a bit in a 16 bit value contained in (BC). +2069 DD0B ; The bit set depends on the current drive selection. +2070 DD0B ; +2071 DD0B C5 SETBIT: PUSH BC ;save 16 bit word. +2072 DD0C 3A 42 DB LD A,(ACTIVE) ;get active drive. +2073 DD0F 4F LD C,A +2074 DD10 21 01 00 LD HL,1 +2075 DD13 CD 04 DD CALL SHIFTL ;shift bit 0 into place. +2076 DD16 C1 POP BC ;now 'or' this with the original word. +2077 DD17 79 LD A,C +2078 DD18 B5 OR L +2079 DD19 6F LD L,A ;low byte done, do high byte. +2080 DD1A 78 LD A,B +2081 DD1B B4 OR H +2082 DD1C 67 LD H,A +2083 DD1D C9 RET +2084 DD1E ; +2085 DD1E ; Extract the write protect status bit for the current drive. +2086 DD1E ; The result is returned in (A), bit 0. +2087 DD1E ; +2088 DD1E 2A AD E5 GETWPRT:LD HL,(WRTPRT) ;get status bytes. +2089 DD21 3A 42 DB LD A,(ACTIVE) ;which drive is current? +2090 DD24 4F LD C,A +2091 DD25 CD EA DC CALL SHIFTR ;shift status such that bit 0 is the +2092 DD28 7D LD A,L ;one of interest for this drive. +2093 DD29 E6 01 AND 01H ;and isolate it. +2094 DD2B C9 RET +2095 DD2C ; +2096 DD2C ; Function to write protect the current disk. +2097 DD2C ; +2098 DD2C 21 AD E5 WRTPRTD:LD HL,WRTPRT ;point to status word. +2099 DD2F 4E LD C,(HL) ;set (BC) equal to the status. +2100 DD30 23 INC HL +2101 DD31 46 LD B,(HL) +2102 DD32 CD 0B DD CALL SETBIT ;and set this bit according to current drive. +2103 DD35 22 AD E5 LD (WRTPRT),HL ;then save. +2104 DD38 2A C8 E5 LD HL,(DIRSIZE) ;now save directory size limit. +2105 DD3B 23 INC HL ;remember the last one. +2106 DD3C EB EX DE,HL +2107 DD3D 2A B3 E5 LD HL,(SCRATCH1) ;and store it here. +2108 DD40 73 LD (HL),E ;put low byte. +2109 DD41 23 INC HL +2110 DD42 72 LD (HL),D ;then high byte. +2111 DD43 C9 RET +2112 DD44 ; +2113 DD44 ; Check for a read only file. +2114 DD44 ; +2115 DD44 CD 5E DD CHKROFL:CALL FCB2HL ;set (HL) to file entry in directory buffer. +2116 DD47 11 09 00 CKROF1: LD DE,9 ;look at bit 7 of the ninth byte. +2117 DD4A 19 ADD HL,DE +2118 DD4B 7E LD A,(HL) +2119 DD4C 17 RLA +2120 DD4D D0 RET NC ;return if ok. +2121 DD4E 21 0F D8 LD HL,ROFILE ;else, print error message and terminate. +2122 DD51 C3 4A DB JP JUMPHL +2123 DD54 ; +2124 DD54 ; Check the write protect status of the active disk. +2125 DD54 ; +2126 DD54 CD 1E DD CHKWPRT:CALL GETWPRT +2127 DD57 C8 RET Z ;return if ok. +2128 DD58 21 0D D8 LD HL,RODISK ;else print message and terminate. +2129 DD5B C3 4A DB JP JUMPHL +2130 DD5E ; +2131 DD5E ; Routine to set (HL) pointing to the proper entry in the +2132 DD5E ; directory buffer. +2133 DD5E ; +2134 DD5E 2A B9 E5 FCB2HL: LD HL,(DIRBUF) ;get address of buffer. +2135 DD61 3A E9 E5 LD A,(FCBPOS) ;relative position of file. +2136 DD64 ; +2137 DD64 ; Routine to add (A) to (HL). +2138 DD64 ; +2139 DD64 85 ADDA2HL:ADD A,L +2140 DD65 6F LD L,A +2141 DD66 D0 RET NC +2142 DD67 24 INC H ;take care of any carry. +2143 DD68 C9 RET +2144 DD69 ; +2145 DD69 ; Routine to get the 's2' byte from the fcb supplied in +2146 DD69 ; the initial parameter specification. +2147 DD69 ; +2148 DD69 2A 43 DB GETS2: LD HL,(PARAMS) ;get address of fcb. +2149 DD6C 11 0E 00 LD DE,14 ;relative position of 's2'. +2150 DD6F 19 ADD HL,DE +2151 DD70 7E LD A,(HL) ;extract this byte. +2152 DD71 C9 RET +2153 DD72 ; +2154 DD72 ; Clear the 's2' byte in the fcb. +2155 DD72 ; +2156 DD72 CD 69 DD CLEARS2:CALL GETS2 ;this sets (HL) pointing to it. +2157 DD75 36 00 LD (HL),0 ;now clear it. +2158 DD77 C9 RET +2159 DD78 ; +2160 DD78 ; Set bit 7 in the 's2' byte of the fcb. +2161 DD78 ; +2162 DD78 CD 69 DD SETS2B7:CALL GETS2 ;get the byte. +2163 DD7B F6 80 OR 80H ;and set bit 7. +2164 DD7D 77 LD (HL),A ;then store. +2165 DD7E C9 RET +2166 DD7F ; +2167 DD7F ; Compare (FILEPOS) with (SCRATCH1) and set flags based on +2168 DD7F ; the difference. This checks to see if there are more file +2169 DD7F ; names in the directory. We are at (FILEPOS) and there are +2170 DD7F ; (SCRATCH1) of them to check. +2171 DD7F ; +2172 DD7F 2A EA E5 MOREFLS:LD HL,(FILEPOS) ;we are here. +2173 DD82 EB EX DE,HL +2174 DD83 2A B3 E5 LD HL,(SCRATCH1) ;and don't go past here. +2175 DD86 7B LD A,E ;compute difference but don't keep. +2176 DD87 96 SUB (HL) +2177 DD88 23 INC HL +2178 DD89 7A LD A,D +2179 DD8A 9E SBC A,(HL) ;set carry if no more names. +2180 DD8B C9 RET +2181 DD8C ; +2182 DD8C ; Call this routine to prevent (SCRATCH1) from being greater +2183 DD8C ; than (FILEPOS). +2184 DD8C ; +2185 DD8C CD 7F DD CHKNMBR:CALL MOREFLS ;SCRATCH1 too big? +2186 DD8F D8 RET C +2187 DD90 13 INC DE ;yes, reset it to (FILEPOS). +2188 DD91 72 LD (HL),D +2189 DD92 2B DEC HL +2190 DD93 73 LD (HL),E +2191 DD94 C9 RET +2192 DD95 ; +2193 DD95 ; Compute (HL)=(DE)-(HL) +2194 DD95 ; +2195 DD95 7B SUBHL: LD A,E ;compute difference. +2196 DD96 95 SUB L +2197 DD97 6F LD L,A ;store low byte. +2198 DD98 7A LD A,D +2199 DD99 9C SBC A,H +2200 DD9A 67 LD H,A ;and then high byte. +2201 DD9B C9 RET +2202 DD9C ; +2203 DD9C ; Set the directory checksum byte. +2204 DD9C ; +2205 DD9C 0E FF SETDIR: LD C,0FFH +2206 DD9E ; +2207 DD9E ; Routine to set or compare the directory checksum byte. If +2208 DD9E ; (C)=0ffh, then this will set the checksum byte. Else the byte +2209 DD9E ; will be checked. If the check fails (the disk has been changed), +2210 DD9E ; then this disk will be write protected. +2211 DD9E ; +2212 DD9E 2A EC E5 CHECKDIR: LD HL,(CKSUMTBL) +2213 DDA1 EB EX DE,HL +2214 DDA2 2A CC E5 LD HL,(ALLOC1) +2215 DDA5 CD 95 DD CALL SUBHL +2216 DDA8 D0 RET NC ;ok if (CKSUMTBL) > (ALLOC1), so return. +2217 DDA9 C5 PUSH BC +2218 DDAA CD F7 DC CALL CHECKSUM ;else compute checksum. +2219 DDAD 2A BD E5 LD HL,(CHKVECT) ;get address of checksum table. +2220 DDB0 EB EX DE,HL +2221 DDB1 2A EC E5 LD HL,(CKSUMTBL) +2222 DDB4 19 ADD HL,DE ;set (HL) to point to byte for this drive. +2223 DDB5 C1 POP BC +2224 DDB6 0C INC C ;set or check ? +2225 DDB7 CA C4 DD JP Z,CHKDIR1 +2226 DDBA BE CP (HL) ;check them. +2227 DDBB C8 RET Z ;return if they are the same. +2228 DDBC CD 7F DD CALL MOREFLS ;not the same, do we care? +2229 DDBF D0 RET NC +2230 DDC0 CD 2C DD CALL WRTPRTD ;yes, mark this as write protected. +2231 DDC3 C9 RET +2232 DDC4 77 CHKDIR1:LD (HL),A ;just set the byte. +2233 DDC5 C9 RET +2234 DDC6 ; +2235 DDC6 ; Do a write to the directory of the current disk. +2236 DDC6 ; +2237 DDC6 CD 9C DD DIRWRITE: CALL SETDIR ;set checksum byte. +2238 DDC9 CD E0 DD CALL DIRDMA ;set directory dma address. +2239 DDCC 0E 01 LD C,1 ;tell the bios to actually write. +2240 DDCE CD B8 DB CALL DOWRITE ;then do the write. +2241 DDD1 C3 DA DD JP DEFDMA +2242 DDD4 ; +2243 DDD4 ; Read from the directory. +2244 DDD4 ; +2245 DDD4 CD E0 DD DIRREAD:CALL DIRDMA ;set the directory dma address. +2246 DDD7 CD B2 DB CALL DOREAD ;and read it. +2247 DDDA ; +2248 DDDA ; Routine to set the dma address to the users choice. +2249 DDDA ; +2250 DDDA 21 B1 E5 DEFDMA: LD HL,USERDMA ;reset the default dma address and return. +2251 DDDD C3 E3 DD JP DIRDMA1 +2252 DDE0 ; +2253 DDE0 ; Routine to set the dma address for directory work. +2254 DDE0 ; +2255 DDE0 21 B9 E5 DIRDMA: LD HL,DIRBUF +2256 DDE3 ; +2257 DDE3 ; Set the dma address. On entry, (HL) points to +2258 DDE3 ; word containing the desired dma address. +2259 DDE3 ; +2260 DDE3 4E DIRDMA1:LD C,(HL) +2261 DDE4 23 INC HL +2262 DDE5 46 LD B,(HL) ;setup (BC) and go to the bios to set it. +2263 DDE6 C3 24 E6 JP SETDMA +2264 DDE9 ; +2265 DDE9 ; Move the directory buffer into user's dma space. +2266 DDE9 ; +2267 DDE9 2A B9 E5 MOVEDIR:LD HL,(DIRBUF) ;buffer is located here, and +2268 DDEC EB EX DE,HL +2269 DDED 2A B1 E5 LD HL,(USERDMA) ; put it here. +2270 DDF0 0E 80 LD C,128 ;this is its length. +2271 DDF2 C3 4F DB JP DE2HL ;move it now and return. +2272 DDF5 ; +2273 DDF5 ; Check (FILEPOS) and set the zero flag if it equals 0ffffh. +2274 DDF5 ; +2275 DDF5 21 EA E5 CKFILPOS: LD HL,FILEPOS +2276 DDF8 7E LD A,(HL) +2277 DDF9 23 INC HL +2278 DDFA BE CP (HL) ;are both bytes the same? +2279 DDFB C0 RET NZ +2280 DDFC 3C INC A ;yes, but are they each 0ffh? +2281 DDFD C9 RET +2282 DDFE ; +2283 DDFE ; Set location (FILEPOS) to 0ffffh. +2284 DDFE ; +2285 DDFE 21 FF FF STFILPOS: LD HL,0FFFFH +2286 DE01 22 EA E5 LD (FILEPOS),HL +2287 DE04 C9 RET +2288 DE05 ; +2289 DE05 ; Move on to the next file position within the current +2290 DE05 ; directory buffer. If no more exist, set pointer to 0ffffh +2291 DE05 ; and the calling routine will check for this. Enter with (C) +2292 DE05 ; equal to 0ffh to cause the checksum byte to be set, else we +2293 DE05 ; will check this disk and set write protect if checksums are +2294 DE05 ; not the same (applies only if another directory sector must +2295 DE05 ; be read). +2296 DE05 ; +2297 DE05 2A C8 E5 NXENTRY:LD HL,(DIRSIZE) ;get directory entry size limit. +2298 DE08 EB EX DE,HL +2299 DE09 2A EA E5 LD HL,(FILEPOS) ;get current count. +2300 DE0C 23 INC HL ;go on to the next one. +2301 DE0D 22 EA E5 LD (FILEPOS),HL +2302 DE10 CD 95 DD CALL SUBHL ;(HL)=(DIRSIZE)-(FILEPOS) +2303 DE13 D2 19 DE JP NC,NXENT1 ;is there more room left? +2304 DE16 C3 FE DD JP STFILPOS ;no. Set this flag and return. +2305 DE19 3A EA E5 NXENT1: LD A,(FILEPOS) ;get file position within directory. +2306 DE1C E6 03 AND 03H ;only look within this sector (only 4 entries fit). +2307 DE1E 06 05 LD B,5 ;convert to relative position (32 bytes each). +2308 DE20 87 NXENT2: ADD A,A ;note that this is not efficient code. +2309 DE21 05 DEC B ;5 'ADD A's would be better. +2310 DE22 C2 20 DE JP NZ,NXENT2 +2311 DE25 32 E9 E5 LD (FCBPOS),A ;save it as position of fcb. +2312 DE28 B7 OR A +2313 DE29 C0 RET NZ ;return if we are within buffer. +2314 DE2A C5 PUSH BC +2315 DE2B CD C3 DB CALL TRKSEC ;we need the next directory sector. +2316 DE2E CD D4 DD CALL DIRREAD +2317 DE31 C1 POP BC +2318 DE32 C3 9E DD JP CHECKDIR +2319 DE35 ; +2320 DE35 ; Routine to to get a bit from the disk space allocation +2321 DE35 ; map. It is returned in (A), bit position 0. On entry to here, +2322 DE35 ; set (BC) to the block number on the disk to check. +2323 DE35 ; On return, (D) will contain the original bit position for +2324 DE35 ; this block number and (HL) will point to the address for it. +2325 DE35 ; +2326 DE35 79 CKBITMAP: LD A,C ;determine bit number of interest. +2327 DE36 E6 07 AND 07H ;compute (D)=(E)=(C and 7)+1. +2328 DE38 3C INC A +2329 DE39 5F LD E,A ;save particular bit number. +2330 DE3A 57 LD D,A +2331 DE3B ; +2332 DE3B ; compute (BC)=(BC)/8. +2333 DE3B ; +2334 DE3B 79 LD A,C +2335 DE3C 0F RRCA ;now shift right 3 bits. +2336 DE3D 0F RRCA +2337 DE3E 0F RRCA +2338 DE3F E6 1F AND 1FH ;and clear bits 7,6,5. +2339 DE41 4F LD C,A +2340 DE42 78 LD A,B +2341 DE43 87 ADD A,A ;now shift (B) into bits 7,6,5. +2342 DE44 87 ADD A,A +2343 DE45 87 ADD A,A +2344 DE46 87 ADD A,A +2345 DE47 87 ADD A,A +2346 DE48 B1 OR C ;and add in (C). +2347 DE49 4F LD C,A ;ok, (C) ha been completed. +2348 DE4A 78 LD A,B ;is there a better way of doing this? +2349 DE4B 0F RRCA +2350 DE4C 0F RRCA +2351 DE4D 0F RRCA +2352 DE4E E6 1F AND 1FH +2353 DE50 47 LD B,A ;and now (B) is completed. +2354 DE51 ; +2355 DE51 ; use this as an offset into the disk space allocation +2356 DE51 ; table. +2357 DE51 ; +2358 DE51 2A BF E5 LD HL,(ALOCVECT) +2359 DE54 09 ADD HL,BC +2360 DE55 7E LD A,(HL) ;now get correct byte. +2361 DE56 07 CKBMAP1:RLCA ;get correct bit into position 0. +2362 DE57 1D DEC E +2363 DE58 C2 56 DE JP NZ,CKBMAP1 +2364 DE5B C9 RET +2365 DE5C ; +2366 DE5C ; Set or clear the bit map such that block number (BC) will be marked +2367 DE5C ; as used. On entry, if (E)=0 then this bit will be cleared, if it equals +2368 DE5C ; 1 then it will be set (don't use anyother values). +2369 DE5C ; +2370 DE5C D5 STBITMAP: PUSH DE +2371 DE5D CD 35 DE CALL CKBITMAP ;get the byte of interest. +2372 DE60 E6 FE AND 0FEH ;clear the affected bit. +2373 DE62 C1 POP BC +2374 DE63 B1 OR C ;and now set it acording to (C). +2375 DE64 ; +2376 DE64 ; entry to restore the original bit position and then store +2377 DE64 ; in table. (A) contains the value, (D) contains the bit +2378 DE64 ; position (1-8), and (HL) points to the address within the +2379 DE64 ; space allocation table for this byte. +2380 DE64 ; +2381 DE64 0F STBMAP1:RRCA ;restore original bit position. +2382 DE65 15 DEC D +2383 DE66 C2 64 DE JP NZ,STBMAP1 +2384 DE69 77 LD (HL),A ;and stor byte in table. +2385 DE6A C9 RET +2386 DE6B ; +2387 DE6B ; Set/clear space used bits in allocation map for this file. +2388 DE6B ; On entry, (C)=1 to set the map and (C)=0 to clear it. +2389 DE6B ; +2390 DE6B CD 5E DD SETFILE:CALL FCB2HL ;get address of fcb +2391 DE6E 11 10 00 LD DE,16 +2392 DE71 19 ADD HL,DE ;get to block number bytes. +2393 DE72 C5 PUSH BC +2394 DE73 0E 11 LD C,17 ;check all 17 bytes (max) of table. +2395 DE75 D1 SETFL1: POP DE +2396 DE76 0D DEC C ;done all bytes yet? +2397 DE77 C8 RET Z +2398 DE78 D5 PUSH DE +2399 DE79 3A DD E5 LD A,(BIGDISK) ;check disk size for 16 bit block numbers. +2400 DE7C B7 OR A +2401 DE7D CA 88 DE JP Z,SETFL2 +2402 DE80 C5 PUSH BC ;only 8 bit numbers. set (BC) to this one. +2403 DE81 E5 PUSH HL +2404 DE82 4E LD C,(HL) ;get low byte from table, always +2405 DE83 06 00 LD B,0 ;set high byte to zero. +2406 DE85 C3 8E DE JP SETFL3 +2407 DE88 0D SETFL2: DEC C ;for 16 bit block numbers, adjust counter. +2408 DE89 C5 PUSH BC +2409 DE8A 4E LD C,(HL) ;now get both the low and high bytes. +2410 DE8B 23 INC HL +2411 DE8C 46 LD B,(HL) +2412 DE8D E5 PUSH HL +2413 DE8E 79 SETFL3: LD A,C ;block used? +2414 DE8F B0 OR B +2415 DE90 CA 9D DE JP Z,SETFL4 +2416 DE93 2A C6 E5 LD HL,(DSKSIZE) ;is this block number within the +2417 DE96 7D LD A,L ;space on the disk? +2418 DE97 91 SUB C +2419 DE98 7C LD A,H +2420 DE99 98 SBC A,B +2421 DE9A D4 5C DE CALL NC,STBITMAP ;yes, set the proper bit. +2422 DE9D E1 SETFL4: POP HL ;point to next block number in fcb. +2423 DE9E 23 INC HL +2424 DE9F C1 POP BC +2425 DEA0 C3 75 DE JP SETFL1 +2426 DEA3 ; +2427 DEA3 ; Construct the space used allocation bit map for the active +2428 DEA3 ; drive. If a file name starts with '$' and it is under the +2429 DEA3 ; current user number, then (STATUS) is set to minus 1. Otherwise +2430 DEA3 ; it is not set at all. +2431 DEA3 ; +2432 DEA3 2A C6 E5 BITMAP: LD HL,(DSKSIZE) ;compute size of allocation table. +2433 DEA6 0E 03 LD C,3 +2434 DEA8 CD EA DC CALL SHIFTR ;(HL)=(HL)/8. +2435 DEAB 23 INC HL ;at lease 1 byte. +2436 DEAC 44 LD B,H +2437 DEAD 4D LD C,L ;set (BC) to the allocation table length. +2438 DEAE ; +2439 DEAE ; Initialize the bitmap for this drive. Right now, the first +2440 DEAE ; two bytes are specified by the disk parameter block. However +2441 DEAE ; a patch could be entered here if it were necessary to setup +2442 DEAE ; this table in a special mannor. For example, the bios could +2443 DEAE ; determine locations of 'bad blocks' and set them as already +2444 DEAE ; 'used' in the map. +2445 DEAE ; +2446 DEAE 2A BF E5 LD HL,(ALOCVECT) ;now zero out the table now. +2447 DEB1 36 00 BITMAP1:LD (HL),0 +2448 DEB3 23 INC HL +2449 DEB4 0B DEC BC +2450 DEB5 78 LD A,B +2451 DEB6 B1 OR C +2452 DEB7 C2 B1 DE JP NZ,BITMAP1 +2453 DEBA 2A CA E5 LD HL,(ALLOC0) ;get initial space used by directory. +2454 DEBD EB EX DE,HL +2455 DEBE 2A BF E5 LD HL,(ALOCVECT) ;and put this into map. +2456 DEC1 73 LD (HL),E +2457 DEC2 23 INC HL +2458 DEC3 72 LD (HL),D +2459 DEC4 ; +2460 DEC4 ; End of initialization portion. +2461 DEC4 ; +2462 DEC4 CD A1 DB CALL HOMEDRV ;now home the drive. +2463 DEC7 2A B3 E5 LD HL,(SCRATCH1) +2464 DECA 36 03 LD (HL),3 ;force next directory request to read +2465 DECC 23 INC HL ;in a sector. +2466 DECD 36 00 LD (HL),0 +2467 DECF CD FE DD CALL STFILPOS ;clear initial file position also. +2468 DED2 0E FF BITMAP2:LD C,0FFH ;read next file name in directory +2469 DED4 CD 05 DE CALL NXENTRY ;and set checksum byte. +2470 DED7 CD F5 DD CALL CKFILPOS ;is there another file? +2471 DEDA C8 RET Z +2472 DEDB CD 5E DD CALL FCB2HL ;yes, get its address. +2473 DEDE 3E E5 LD A,0E5H +2474 DEE0 BE CP (HL) ;empty file entry? +2475 DEE1 CA D2 DE JP Z,BITMAP2 +2476 DEE4 3A 41 DB LD A,(USERNO) ;no, correct user number? +2477 DEE7 BE CP (HL) +2478 DEE8 C2 F6 DE JP NZ,BITMAP3 +2479 DEEB 23 INC HL +2480 DEEC 7E LD A,(HL) ;yes, does name start with a '$'? +2481 DEED D6 24 SUB '$' +2482 DEEF C2 F6 DE JP NZ,BITMAP3 +2483 DEF2 3D DEC A ;yes, set atatus to minus one. +2484 DEF3 32 45 DB LD (STATUS),A +2485 DEF6 0E 01 BITMAP3:LD C,1 ;now set this file's space as used in bit map. +2486 DEF8 CD 6B DE CALL SETFILE +2487 DEFB CD 8C DD CALL CHKNMBR ;keep (SCRATCH1) in bounds. +2488 DEFE C3 D2 DE JP BITMAP2 +2489 DF01 ; +2490 DF01 ; Set the status (STATUS) and return. +2491 DF01 ; +2492 DF01 3A D4 E5 STSTATUS: LD A,(FNDSTAT) +2493 DF04 C3 01 DB JP SETSTAT +2494 DF07 ; +2495 DF07 ; Check extents in (A) and (C). Set the zero flag if they +2496 DF07 ; are the same. The number of 16k chunks of disk space that +2497 DF07 ; the directory extent covers is expressad is (EXTMASK+1). +2498 DF07 ; No registers are modified. +2499 DF07 ; +2500 DF07 C5 SAMEXT: PUSH BC +2501 DF08 F5 PUSH AF +2502 DF09 3A C5 E5 LD A,(EXTMASK) ;get extent mask and use it to +2503 DF0C 2F CPL ;to compare both extent numbers. +2504 DF0D 47 LD B,A ;save resulting mask here. +2505 DF0E 79 LD A,C ;mask first extent and save in (C). +2506 DF0F A0 AND B +2507 DF10 4F LD C,A +2508 DF11 F1 POP AF ;now mask second extent and compare +2509 DF12 A0 AND B ;with the first one. +2510 DF13 91 SUB C +2511 DF14 E6 1F AND 1FH ;(* only check buts 0-4 *) +2512 DF16 C1 POP BC ;the zero flag is set if they are the same. +2513 DF17 C9 RET ;restore (BC) and return. +2514 DF18 ; +2515 DF18 ; Search for the first occurence of a file name. On entry, +2516 DF18 ; register (C) should contain the number of bytes of the fcb +2517 DF18 ; that must match. +2518 DF18 ; +2519 DF18 3E FF FINDFST:LD A,0FFH +2520 DF1A 32 D4 E5 LD (FNDSTAT),A +2521 DF1D 21 D8 E5 LD HL,COUNTER ;save character count. +2522 DF20 71 LD (HL),C +2523 DF21 2A 43 DB LD HL,(PARAMS) ;get filename to match. +2524 DF24 22 D9 E5 LD (SAVEFCB),HL ;and save. +2525 DF27 CD FE DD CALL STFILPOS ;clear initial file position (set to 0ffffh). +2526 DF2A CD A1 DB CALL HOMEDRV ;home the drive. +2527 DF2D ; +2528 DF2D ; Entry to locate the next occurence of a filename within the +2529 DF2D ; directory. The disk is not expected to have been changed. If +2530 DF2D ; it was, then it will be write protected. +2531 DF2D ; +2532 DF2D 0E 00 FINDNXT:LD C,0 ;write protect the disk if changed. +2533 DF2F CD 05 DE CALL NXENTRY ;get next filename entry in directory. +2534 DF32 CD F5 DD CALL CKFILPOS ;is file position = 0ffffh? +2535 DF35 CA 94 DF JP Z,FNDNXT6 ;yes, exit now then. +2536 DF38 2A D9 E5 LD HL,(SAVEFCB) ;set (DE) pointing to filename to match. +2537 DF3B EB EX DE,HL +2538 DF3C 1A LD A,(DE) +2539 DF3D FE E5 CP 0E5H ;empty directory entry? +2540 DF3F CA 4A DF JP Z,FNDNXT1 ;(* are we trying to reserect erased entries? *) +2541 DF42 D5 PUSH DE +2542 DF43 CD 7F DD CALL MOREFLS ;more files in directory? +2543 DF46 D1 POP DE +2544 DF47 D2 94 DF JP NC,FNDNXT6 ;no more. Exit now. +2545 DF4A CD 5E DD FNDNXT1:CALL FCB2HL ;get address of this fcb in directory. +2546 DF4D 3A D8 E5 LD A,(COUNTER) ;get number of bytes (characters) to check. +2547 DF50 4F LD C,A +2548 DF51 06 00 LD B,0 ;initialize byte position counter. +2549 DF53 79 FNDNXT2:LD A,C ;are we done with the compare? +2550 DF54 B7 OR A +2551 DF55 CA 83 DF JP Z,FNDNXT5 +2552 DF58 1A LD A,(DE) ;no, check next byte. +2553 DF59 FE 3F CP '?' ;don't care about this character? +2554 DF5B CA 7C DF JP Z,FNDNXT4 +2555 DF5E 78 LD A,B ;get bytes position in fcb. +2556 DF5F FE 0D CP 13 ;don't care about the thirteenth byte either. +2557 DF61 CA 7C DF JP Z,FNDNXT4 +2558 DF64 FE 0C CP 12 ;extent byte? +2559 DF66 1A LD A,(DE) +2560 DF67 CA 73 DF JP Z,FNDNXT3 +2561 DF6A 96 SUB (HL) ;otherwise compare characters. +2562 DF6B E6 7F AND 7FH +2563 DF6D C2 2D DF JP NZ,FINDNXT ;not the same, check next entry. +2564 DF70 C3 7C DF JP FNDNXT4 ;so far so good, keep checking. +2565 DF73 C5 FNDNXT3:PUSH BC ;check the extent byte here. +2566 DF74 4E LD C,(HL) +2567 DF75 CD 07 DF CALL SAMEXT +2568 DF78 C1 POP BC +2569 DF79 C2 2D DF JP NZ,FINDNXT ;not the same, look some more. +2570 DF7C ; +2571 DF7C ; So far the names compare. Bump pointers to the next byte +2572 DF7C ; and continue until all (C) characters have been checked. +2573 DF7C ; +2574 DF7C 13 FNDNXT4:INC DE ;bump pointers. +2575 DF7D 23 INC HL +2576 DF7E 04 INC B +2577 DF7F 0D DEC C ;adjust character counter. +2578 DF80 C3 53 DF JP FNDNXT2 +2579 DF83 3A EA E5 FNDNXT5:LD A,(FILEPOS) ;return the position of this entry. +2580 DF86 E6 03 AND 03H +2581 DF88 32 45 DB LD (STATUS),A +2582 DF8B 21 D4 E5 LD HL,FNDSTAT +2583 DF8E 7E LD A,(HL) +2584 DF8F 17 RLA +2585 DF90 D0 RET NC +2586 DF91 AF XOR A +2587 DF92 77 LD (HL),A +2588 DF93 C9 RET +2589 DF94 ; +2590 DF94 ; Filename was not found. Set appropriate status. +2591 DF94 ; +2592 DF94 CD FE DD FNDNXT6:CALL STFILPOS ;set (FILEPOS) to 0ffffh. +2593 DF97 3E FF LD A,0FFH ;say not located. +2594 DF99 C3 01 DB JP SETSTAT +2595 DF9C ; +2596 DF9C ; Erase files from the directory. Only the first byte of the +2597 DF9C ; fcb will be affected. It is set to (E5). +2598 DF9C ; +2599 DF9C CD 54 DD ERAFILE:CALL CHKWPRT ;is disk write protected? +2600 DF9F 0E 0C LD C,12 ;only compare file names. +2601 DFA1 CD 18 DF CALL FINDFST ;get first file name. +2602 DFA4 CD F5 DD ERAFIL1:CALL CKFILPOS ;any found? +2603 DFA7 C8 RET Z ;nope, we must be done. +2604 DFA8 CD 44 DD CALL CHKROFL ;is file read only? +2605 DFAB CD 5E DD CALL FCB2HL ;nope, get address of fcb and +2606 DFAE 36 E5 LD (HL),0E5H ;set first byte to 'empty'. +2607 DFB0 0E 00 LD C,0 ;clear the space from the bit map. +2608 DFB2 CD 6B DE CALL SETFILE +2609 DFB5 CD C6 DD CALL DIRWRITE ;now write the directory sector back out. +2610 DFB8 CD 2D DF CALL FINDNXT ;find the next file name. +2611 DFBB C3 A4 DF JP ERAFIL1 ;and repeat process. +2612 DFBE ; +2613 DFBE ; Look through the space allocation map (bit map) for the +2614 DFBE ; next available block. Start searching at block number (BC-1). +2615 DFBE ; The search procedure is to look for an empty block that is +2616 DFBE ; before the starting block. If not empty, look at a later +2617 DFBE ; block number. In this way, we return the closest empty block +2618 DFBE ; on either side of the 'target' block number. This will speed +2619 DFBE ; access on random devices. For serial devices, this should be +2620 DFBE ; changed to look in the forward direction first and then start +2621 DFBE ; at the front and search some more. +2622 DFBE ; +2623 DFBE ; On return, (DE)= block number that is empty and (HL) =0 +2624 DFBE ; if no empry block was found. +2625 DFBE ; +2626 DFBE 50 FNDSPACE: LD D,B ;set (DE) as the block that is checked. +2627 DFBF 59 LD E,C +2628 DFC0 ; +2629 DFC0 ; Look before target block. Registers (BC) are used as the lower +2630 DFC0 ; pointer and (DE) as the upper pointer. +2631 DFC0 ; +2632 DFC0 79 FNDSPA1:LD A,C ;is block 0 specified? +2633 DFC1 B0 OR B +2634 DFC2 CA D1 DF JP Z,FNDSPA2 +2635 DFC5 0B DEC BC ;nope, check previous block. +2636 DFC6 D5 PUSH DE +2637 DFC7 C5 PUSH BC +2638 DFC8 CD 35 DE CALL CKBITMAP +2639 DFCB 1F RRA ;is this block empty? +2640 DFCC D2 EC DF JP NC,FNDSPA3 ;yes. use this. +2641 DFCF ; +2642 DFCF ; Note that the above logic gets the first block that it finds +2643 DFCF ; that is empty. Thus a file could be written 'backward' making +2644 DFCF ; it very slow to access. This could be changed to look for the +2645 DFCF ; first empty block and then continue until the start of this +2646 DFCF ; empty space is located and then used that starting block. +2647 DFCF ; This should help speed up access to some files especially on +2648 DFCF ; a well used disk with lots of fairly small 'holes'. +2649 DFCF ; +2650 DFCF C1 POP BC ;nope, check some more. +2651 DFD0 D1 POP DE +2652 DFD1 ; +2653 DFD1 ; Now look after target block. +2654 DFD1 ; +2655 DFD1 2A C6 E5 FNDSPA2:LD HL,(DSKSIZE) ;is block (DE) within disk limits? +2656 DFD4 7B LD A,E +2657 DFD5 95 SUB L +2658 DFD6 7A LD A,D +2659 DFD7 9C SBC A,H +2660 DFD8 D2 F4 DF JP NC,FNDSPA4 +2661 DFDB 13 INC DE ;yes, move on to next one. +2662 DFDC C5 PUSH BC +2663 DFDD D5 PUSH DE +2664 DFDE 42 LD B,D +2665 DFDF 4B LD C,E +2666 DFE0 CD 35 DE CALL CKBITMAP ;check it. +2667 DFE3 1F RRA ;empty? +2668 DFE4 D2 EC DF JP NC,FNDSPA3 +2669 DFE7 D1 POP DE ;nope, continue searching. +2670 DFE8 C1 POP BC +2671 DFE9 C3 C0 DF JP FNDSPA1 +2672 DFEC ; +2673 DFEC ; Empty block found. Set it as used and return with (HL) +2674 DFEC ; pointing to it (true?). +2675 DFEC ; +2676 DFEC 17 FNDSPA3:RLA ;reset byte. +2677 DFED 3C INC A ;and set bit 0. +2678 DFEE CD 64 DE CALL STBMAP1 ;update bit map. +2679 DFF1 E1 POP HL ;set return registers. +2680 DFF2 D1 POP DE +2681 DFF3 C9 RET +2682 DFF4 ; +2683 DFF4 ; Free block was not found. If (BC) is not zero, then we have +2684 DFF4 ; not checked all of the disk space. +2685 DFF4 ; +2686 DFF4 79 FNDSPA4:LD A,C +2687 DFF5 B0 OR B +2688 DFF6 C2 C0 DF JP NZ,FNDSPA1 +2689 DFF9 21 00 00 LD HL,0 ;set 'not found' status. +2690 DFFC C9 RET +2691 DFFD ; +2692 DFFD ; Move a complete fcb entry into the directory and write it. +2693 DFFD ; +2694 DFFD 0E 00 FCBSET: LD C,0 +2695 DFFF 1E 20 LD E,32 ;length of each entry. +2696 E001 ; +2697 E001 ; Move (E) bytes from the fcb pointed to by (PARAMS) into +2698 E001 ; fcb in directory starting at relative byte (C). This updated +2699 E001 ; directory buffer is then written to the disk. +2700 E001 ; +2701 E001 D5 UPDATE: PUSH DE +2702 E002 06 00 LD B,0 ;set (BC) to relative byte position. +2703 E004 2A 43 DB LD HL,(PARAMS) ;get address of fcb. +2704 E007 09 ADD HL,BC ;compute starting byte. +2705 E008 EB EX DE,HL +2706 E009 CD 5E DD CALL FCB2HL ;get address of fcb to update in directory. +2707 E00C C1 POP BC ;set (C) to number of bytes to change. +2708 E00D CD 4F DB CALL DE2HL +2709 E010 CD C3 DB UPDATE1:CALL TRKSEC ;determine the track and sector affected. +2710 E013 C3 C6 DD JP DIRWRITE ;then write this sector out. +2711 E016 ; +2712 E016 ; Routine to change the name of all files on the disk with a +2713 E016 ; specified name. The fcb contains the current name as the +2714 E016 ; first 12 characters and the new name 16 bytes into the fcb. +2715 E016 ; +2716 E016 CD 54 DD CHGNAMES: CALL CHKWPRT ;check for a write protected disk. +2717 E019 0E 0C LD C,12 ;match first 12 bytes of fcb only. +2718 E01B CD 18 DF CALL FINDFST ;get first name. +2719 E01E 2A 43 DB LD HL,(PARAMS) ;get address of fcb. +2720 E021 7E LD A,(HL) ;get user number. +2721 E022 11 10 00 LD DE,16 ;move over to desired name. +2722 E025 19 ADD HL,DE +2723 E026 77 LD (HL),A ;keep same user number. +2724 E027 CD F5 DD CHGNAM1:CALL CKFILPOS ;any matching file found? +2725 E02A C8 RET Z ;no, we must be done. +2726 E02B CD 44 DD CALL CHKROFL ;check for read only file. +2727 E02E 0E 10 LD C,16 ;start 16 bytes into fcb. +2728 E030 1E 0C LD E,12 ;and update the first 12 bytes of directory. +2729 E032 CD 01 E0 CALL UPDATE +2730 E035 CD 2D DF CALL FINDNXT ;get te next file name. +2731 E038 C3 27 E0 JP CHGNAM1 ;and continue. +2732 E03B ; +2733 E03B ; Update a files attributes. The procedure is to search for +2734 E03B ; every file with the same name as shown in fcb (ignoring bit 7) +2735 E03B ; and then to update it (which includes bit 7). No other changes +2736 E03B ; are made. +2737 E03B ; +2738 E03B 0E 0C SAVEATTR: LD C,12 ;match first 12 bytes. +2739 E03D CD 18 DF CALL FINDFST ;look for first filename. +2740 E040 CD F5 DD SAVATR1:CALL CKFILPOS ;was one found? +2741 E043 C8 RET Z ;nope, we must be done. +2742 E044 0E 00 LD C,0 ;yes, update the first 12 bytes now. +2743 E046 1E 0C LD E,12 +2744 E048 CD 01 E0 CALL UPDATE ;update filename and write directory. +2745 E04B CD 2D DF CALL FINDNXT ;and get the next file. +2746 E04E C3 40 E0 JP SAVATR1 ;then continue until done. +2747 E051 ; +2748 E051 ; Open a file (name specified in fcb). +2749 E051 ; +2750 E051 0E 0F OPENIT: LD C,15 ;compare the first 15 bytes. +2751 E053 CD 18 DF CALL FINDFST ;get the first one in directory. +2752 E056 CD F5 DD CALL CKFILPOS ;any at all? +2753 E059 C8 RET Z +2754 E05A CD A6 DC OPENIT1:CALL SETEXT ;point to extent byte within users fcb. +2755 E05D 7E LD A,(HL) ;and get it. +2756 E05E F5 PUSH AF ;save it and address. +2757 E05F E5 PUSH HL +2758 E060 CD 5E DD CALL FCB2HL ;point to fcb in directory. +2759 E063 EB EX DE,HL +2760 E064 2A 43 DB LD HL,(PARAMS) ;this is the users copy. +2761 E067 0E 20 LD C,32 ;move it into users space. +2762 E069 D5 PUSH DE +2763 E06A CD 4F DB CALL DE2HL +2764 E06D CD 78 DD CALL SETS2B7 ;set bit 7 in 's2' byte (unmodified). +2765 E070 D1 POP DE ;now get the extent byte from this fcb. +2766 E071 21 0C 00 LD HL,12 +2767 E074 19 ADD HL,DE +2768 E075 4E LD C,(HL) ;into (C). +2769 E076 21 0F 00 LD HL,15 ;now get the record count byte into (B). +2770 E079 19 ADD HL,DE +2771 E07A 46 LD B,(HL) +2772 E07B E1 POP HL ;keep the same extent as the user had originally. +2773 E07C F1 POP AF +2774 E07D 77 LD (HL),A +2775 E07E 79 LD A,C ;is it the same as in the directory fcb? +2776 E07F BE CP (HL) +2777 E080 78 LD A,B ;if yes, then use the same record count. +2778 E081 CA 8B E0 JP Z,OPENIT2 +2779 E084 3E 00 LD A,0 ;if the user specified an extent greater than +2780 E086 DA 8B E0 JP C,OPENIT2 ;the one in the directory, then set record count to 0. +2781 E089 3E 80 LD A,128 ;otherwise set to maximum. +2782 E08B 2A 43 DB OPENIT2:LD HL,(PARAMS) ;set record count in users fcb to (A). +2783 E08E 11 0F 00 LD DE,15 +2784 E091 19 ADD HL,DE ;compute relative position. +2785 E092 77 LD (HL),A ;and set the record count. +2786 E093 C9 RET +2787 E094 ; +2788 E094 ; Move two bytes from (DE) to (HL) if (and only if) (HL) +2789 E094 ; point to a zero value (16 bit). +2790 E094 ; Return with zero flag set it (DE) was moved. Registers (DE) +2791 E094 ; and (HL) are not changed. However (A) is. +2792 E094 ; +2793 E094 7E MOVEWORD: LD A,(HL) ;check for a zero word. +2794 E095 23 INC HL +2795 E096 B6 OR (HL) ;both bytes zero? +2796 E097 2B DEC HL +2797 E098 C0 RET NZ ;nope, just return. +2798 E099 1A LD A,(DE) ;yes, move two bytes from (DE) into +2799 E09A 77 LD (HL),A ;this zero space. +2800 E09B 13 INC DE +2801 E09C 23 INC HL +2802 E09D 1A LD A,(DE) +2803 E09E 77 LD (HL),A +2804 E09F 1B DEC DE ;don't disturb these registers. +2805 E0A0 2B DEC HL +2806 E0A1 C9 RET +2807 E0A2 ; +2808 E0A2 ; Get here to close a file specified by (fcb). +2809 E0A2 ; +2810 E0A2 AF CLOSEIT:XOR A ;clear status and file position bytes. +2811 E0A3 32 45 DB LD (STATUS),A +2812 E0A6 32 EA E5 LD (FILEPOS),A +2813 E0A9 32 EB E5 LD (FILEPOS+1),A +2814 E0AC CD 1E DD CALL GETWPRT ;get write protect bit for this drive. +2815 E0AF C0 RET NZ ;just return if it is set. +2816 E0B0 CD 69 DD CALL GETS2 ;else get the 's2' byte. +2817 E0B3 E6 80 AND 80H ;and look at bit 7 (file unmodified?). +2818 E0B5 C0 RET NZ ;just return if set. +2819 E0B6 0E 0F LD C,15 ;else look up this file in directory. +2820 E0B8 CD 18 DF CALL FINDFST +2821 E0BB CD F5 DD CALL CKFILPOS ;was it found? +2822 E0BE C8 RET Z ;just return if not. +2823 E0BF 01 10 00 LD BC,16 ;set (HL) pointing to records used section. +2824 E0C2 CD 5E DD CALL FCB2HL +2825 E0C5 09 ADD HL,BC +2826 E0C6 EB EX DE,HL +2827 E0C7 2A 43 DB LD HL,(PARAMS) ;do the same for users specified fcb. +2828 E0CA 09 ADD HL,BC +2829 E0CB 0E 10 LD C,16 ;this many bytes are present in this extent. +2830 E0CD 3A DD E5 CLOSEIT1: LD A,(BIGDISK) ;8 or 16 bit record numbers? +2831 E0D0 B7 OR A +2832 E0D1 CA E8 E0 JP Z,CLOSEIT4 +2833 E0D4 7E LD A,(HL) ;just 8 bit. Get one from users fcb. +2834 E0D5 B7 OR A +2835 E0D6 1A LD A,(DE) ;now get one from directory fcb. +2836 E0D7 C2 DB E0 JP NZ,CLOSEIT2 +2837 E0DA 77 LD (HL),A ;users byte was zero. Update from directory. +2838 E0DB B7 CLOSEIT2: OR A +2839 E0DC C2 E1 E0 JP NZ,CLOSEIT3 +2840 E0DF 7E LD A,(HL) ;directories byte was zero, update from users fcb. +2841 E0E0 12 LD (DE),A +2842 E0E1 BE CLOSEIT3: CP (HL) ;if neither one of these bytes were zero, +2843 E0E2 C2 1F E1 JP NZ,CLOSEIT7 ;then close error if they are not the same. +2844 E0E5 C3 FD E0 JP CLOSEIT5 ;ok so far, get to next byte in fcbs. +2845 E0E8 CD 94 E0 CLOSEIT4: CALL MOVEWORD ;update users fcb if it is zero. +2846 E0EB EB EX DE,HL +2847 E0EC CD 94 E0 CALL MOVEWORD ;update directories fcb if it is zero. +2848 E0EF EB EX DE,HL +2849 E0F0 1A LD A,(DE) ;if these two values are no different, +2850 E0F1 BE CP (HL) ;then a close error occured. +2851 E0F2 C2 1F E1 JP NZ,CLOSEIT7 +2852 E0F5 13 INC DE ;check second byte. +2853 E0F6 23 INC HL +2854 E0F7 1A LD A,(DE) +2855 E0F8 BE CP (HL) +2856 E0F9 C2 1F E1 JP NZ,CLOSEIT7 +2857 E0FC 0D DEC C ;remember 16 bit values. +2858 E0FD 13 CLOSEIT5: INC DE ;bump to next item in table. +2859 E0FE 23 INC HL +2860 E0FF 0D DEC C ;there are 16 entries only. +2861 E100 C2 CD E0 JP NZ,CLOSEIT1 ;continue if more to do. +2862 E103 01 EC FF LD BC,0FFECH ;backup 20 places (extent byte). +2863 E106 09 ADD HL,BC +2864 E107 EB EX DE,HL +2865 E108 09 ADD HL,BC +2866 E109 1A LD A,(DE) +2867 E10A BE CP (HL) ;directory's extent already greater than the +2868 E10B DA 17 E1 JP C,CLOSEIT6 ;users extent? +2869 E10E 77 LD (HL),A ;no, update directory extent. +2870 E10F 01 03 00 LD BC,3 ;and update the record count byte in +2871 E112 09 ADD HL,BC ;directories fcb. +2872 E113 EB EX DE,HL +2873 E114 09 ADD HL,BC +2874 E115 7E LD A,(HL) ;get from user. +2875 E116 12 LD (DE),A ;and put in directory. +2876 E117 3E FF CLOSEIT6: LD A,0FFH ;set 'was open and is now closed' byte. +2877 E119 32 D2 E5 LD (CLOSEFLG),A +2878 E11C C3 10 E0 JP UPDATE1 ;update the directory now. +2879 E11F 21 45 DB CLOSEIT7: LD HL,STATUS ;set return status and then return. +2880 E122 35 DEC (HL) +2881 E123 C9 RET +2882 E124 ; +2883 E124 ; Routine to get the next empty space in the directory. It +2884 E124 ; will then be cleared for use. +2885 E124 ; +2886 E124 CD 54 DD GETEMPTY: CALL CHKWPRT ;make sure disk is not write protected. +2887 E127 2A 43 DB LD HL,(PARAMS) ;save current parameters (fcb). +2888 E12A E5 PUSH HL +2889 E12B 21 AC E5 LD HL,EMPTYFCB ;use special one for empty space. +2890 E12E 22 43 DB LD (PARAMS),HL +2891 E131 0E 01 LD C,1 ;search for first empty spot in directory. +2892 E133 CD 18 DF CALL FINDFST ;(* only check first byte *) +2893 E136 CD F5 DD CALL CKFILPOS ;none? +2894 E139 E1 POP HL +2895 E13A 22 43 DB LD (PARAMS),HL ;restore original fcb address. +2896 E13D C8 RET Z ;return if no more space. +2897 E13E EB EX DE,HL +2898 E13F 21 0F 00 LD HL,15 ;point to number of records for this file. +2899 E142 19 ADD HL,DE +2900 E143 0E 11 LD C,17 ;and clear all of this space. +2901 E145 AF XOR A +2902 E146 77 GETMT1: LD (HL),A +2903 E147 23 INC HL +2904 E148 0D DEC C +2905 E149 C2 46 E1 JP NZ,GETMT1 +2906 E14C 21 0D 00 LD HL,13 ;clear the 's1' byte also. +2907 E14F 19 ADD HL,DE +2908 E150 77 LD (HL),A +2909 E151 CD 8C DD CALL CHKNMBR ;keep (SCRATCH1) within bounds. +2910 E154 CD FD DF CALL FCBSET ;write out this fcb entry to directory. +2911 E157 C3 78 DD JP SETS2B7 ;set 's2' byte bit 7 (unmodified at present). +2912 E15A ; +2913 E15A ; Routine to close the current extent and open the next one +2914 E15A ; for reading. +2915 E15A ; +2916 E15A AF GETNEXT:XOR A +2917 E15B 32 D2 E5 LD (CLOSEFLG),A ;clear close flag. +2918 E15E CD A2 E0 CALL CLOSEIT ;close this extent. +2919 E161 CD F5 DD CALL CKFILPOS +2920 E164 C8 RET Z ;not there??? +2921 E165 2A 43 DB LD HL,(PARAMS) ;get extent byte. +2922 E168 01 0C 00 LD BC,12 +2923 E16B 09 ADD HL,BC +2924 E16C 7E LD A,(HL) ;and increment it. +2925 E16D 3C INC A +2926 E16E E6 1F AND 1FH ;keep within range 0-31. +2927 E170 77 LD (HL),A +2928 E171 CA 83 E1 JP Z,GTNEXT1 ;overflow? +2929 E174 47 LD B,A ;mask extent byte. +2930 E175 3A C5 E5 LD A,(EXTMASK) +2931 E178 A0 AND B +2932 E179 21 D2 E5 LD HL,CLOSEFLG ;check close flag (0ffh is ok). +2933 E17C A6 AND (HL) +2934 E17D CA 8E E1 JP Z,GTNEXT2 ;if zero, we must read in next extent. +2935 E180 C3 AC E1 JP GTNEXT3 ;else, it is already in memory. +2936 E183 01 02 00 GTNEXT1:LD BC,2 ;Point to the 's2' byte. +2937 E186 09 ADD HL,BC +2938 E187 34 INC (HL) ;and bump it. +2939 E188 7E LD A,(HL) ;too many extents? +2940 E189 E6 0F AND 0FH +2941 E18B CA B6 E1 JP Z,GTNEXT5 ;yes, set error code. +2942 E18E ; +2943 E18E ; Get here to open the next extent. +2944 E18E ; +2945 E18E 0E 0F GTNEXT2:LD C,15 ;set to check first 15 bytes of fcb. +2946 E190 CD 18 DF CALL FINDFST ;find the first one. +2947 E193 CD F5 DD CALL CKFILPOS ;none available? +2948 E196 C2 AC E1 JP NZ,GTNEXT3 +2949 E199 3A D3 E5 LD A,(RDWRTFLG) ;no extent present. Can we open an empty one? +2950 E19C 3C INC A ;0ffh means reading (so not possible). +2951 E19D CA B6 E1 JP Z,GTNEXT5 ;or an error. +2952 E1A0 CD 24 E1 CALL GETEMPTY ;we are writing, get an empty entry. +2953 E1A3 CD F5 DD CALL CKFILPOS ;none? +2954 E1A6 CA B6 E1 JP Z,GTNEXT5 ;error if true. +2955 E1A9 C3 AF E1 JP GTNEXT4 ;else we are almost done. +2956 E1AC CD 5A E0 GTNEXT3:CALL OPENIT1 ;open this extent. +2957 E1AF CD BB DC GTNEXT4:CALL STRDATA ;move in updated data (rec #, extent #, etc.) +2958 E1B2 AF XOR A ;clear status and return. +2959 E1B3 C3 01 DB JP SETSTAT +2960 E1B6 ; +2961 E1B6 ; Error in extending the file. Too many extents were needed +2962 E1B6 ; or not enough space on the disk. +2963 E1B6 ; +2964 E1B6 CD 05 DB GTNEXT5:CALL IOERR1 ;set error code, clear bit 7 of 's2' +2965 E1B9 C3 78 DD JP SETS2B7 ;so this is not written on a close. +2966 E1BC ; +2967 E1BC ; Read a sequential file. +2968 E1BC ; +2969 E1BC 3E 01 RDSEQ: LD A,1 ;set sequential access mode. +2970 E1BE 32 D5 E5 LD (MODE),A +2971 E1C1 3E FF RDSEQ1: LD A,0FFH ;don't allow reading unwritten space. +2972 E1C3 32 D3 E5 LD (RDWRTFLG),A +2973 E1C6 CD BB DC CALL STRDATA ;put rec# and ext# into fcb. +2974 E1C9 3A E3 E5 LD A,(SAVNREC) ;get next record to read. +2975 E1CC 21 E1 E5 LD HL,SAVNXT ;get number of records in extent. +2976 E1CF BE CP (HL) ;within this extent? +2977 E1D0 DA E6 E1 JP C,RDSEQ2 +2978 E1D3 FE 80 CP 128 ;no. Is this extent fully used? +2979 E1D5 C2 FB E1 JP NZ,RDSEQ3 ;no. End-of-file. +2980 E1D8 CD 5A E1 CALL GETNEXT ;yes, open the next one. +2981 E1DB AF XOR A ;reset next record to read. +2982 E1DC 32 E3 E5 LD (SAVNREC),A +2983 E1DF 3A 45 DB LD A,(STATUS) ;check on open, successful? +2984 E1E2 B7 OR A +2985 E1E3 C2 FB E1 JP NZ,RDSEQ3 ;no, error. +2986 E1E6 CD 77 DC RDSEQ2: CALL COMBLK ;ok. compute block number to read. +2987 E1E9 CD 84 DC CALL CHKBLK ;check it. Within bounds? +2988 E1EC CA FB E1 JP Z,RDSEQ3 ;no, error. +2989 E1EF CD 8A DC CALL LOGICAL ;convert (BLKNMBR) to logical sector (128 byte). +2990 E1F2 CD D1 DB CALL TRKSEC1 ;set the track and sector for this block #. +2991 E1F5 CD B2 DB CALL DOREAD ;and read it. +2992 E1F8 C3 D2 DC JP SETNREC ;and set the next record to be accessed. +2993 E1FB ; +2994 E1FB ; Read error occured. Set status and return. +2995 E1FB ; +2996 E1FB C3 05 DB RDSEQ3: JP IOERR1 +2997 E1FE ; +2998 E1FE ; Write the next sequential record. +2999 E1FE ; +3000 E1FE 3E 01 WTSEQ: LD A,1 ;set sequential access mode. +3001 E200 32 D5 E5 LD (MODE),A +3002 E203 3E 00 WTSEQ1: LD A,0 ;allow an addition empty extent to be opened. +3003 E205 32 D3 E5 LD (RDWRTFLG),A +3004 E208 CD 54 DD CALL CHKWPRT ;check write protect status. +3005 E20B 2A 43 DB LD HL,(PARAMS) +3006 E20E CD 47 DD CALL CKROF1 ;check for read only file, (HL) already set to fcb. +3007 E211 CD BB DC CALL STRDATA ;put updated data into fcb. +3008 E214 3A E3 E5 LD A,(SAVNREC) ;get record number to write. +3009 E217 FE 80 CP 128 ;within range? +3010 E219 D2 05 DB JP NC,IOERR1 ;no, error(?). +3011 E21C CD 77 DC CALL COMBLK ;compute block number. +3012 E21F CD 84 DC CALL CHKBLK ;check number. +3013 E222 0E 00 LD C,0 ;is there one to write to? +3014 E224 C2 6E E2 JP NZ,WTSEQ6 ;yes, go do it. +3015 E227 CD 3E DC CALL GETBLOCK ;get next block number within fcb to use. +3016 E22A 32 D7 E5 LD (RELBLOCK),A ;and save. +3017 E22D 01 00 00 LD BC,0 ;start looking for space from the start +3018 E230 B7 OR A ;if none allocated as yet. +3019 E231 CA 3B E2 JP Z,WTSEQ2 +3020 E234 4F LD C,A ;extract previous block number from fcb +3021 E235 0B DEC BC ;so we can be closest to it. +3022 E236 CD 5E DC CALL EXTBLK +3023 E239 44 LD B,H +3024 E23A 4D LD C,L +3025 E23B CD BE DF WTSEQ2: CALL FNDSPACE ;find the next empty block nearest number (BC). +3026 E23E 7D LD A,L ;check for a zero number. +3027 E23F B4 OR H +3028 E240 C2 48 E2 JP NZ,WTSEQ3 +3029 E243 3E 02 LD A,2 ;no more space? +3030 E245 C3 01 DB JP SETSTAT +3031 E248 22 E5 E5 WTSEQ3: LD (BLKNMBR),HL ;save block number to access. +3032 E24B EB EX DE,HL ;put block number into (DE). +3033 E24C 2A 43 DB LD HL,(PARAMS) ;now we must update the fcb for this +3034 E24F 01 10 00 LD BC,16 ;newly allocated block. +3035 E252 09 ADD HL,BC +3036 E253 3A DD E5 LD A,(BIGDISK) ;8 or 16 bit block numbers? +3037 E256 B7 OR A +3038 E257 3A D7 E5 LD A,(RELBLOCK) ;(* update this entry *) +3039 E25A CA 64 E2 JP Z,WTSEQ4 ;zero means 16 bit ones. +3040 E25D CD 64 DD CALL ADDA2HL ;(HL)=(HL)+(A) +3041 E260 73 LD (HL),E ;store new block number. +3042 E261 C3 6C E2 JP WTSEQ5 +3043 E264 4F WTSEQ4: LD C,A ;compute spot in this 16 bit table. +3044 E265 06 00 LD B,0 +3045 E267 09 ADD HL,BC +3046 E268 09 ADD HL,BC +3047 E269 73 LD (HL),E ;stuff block number (DE) there. +3048 E26A 23 INC HL +3049 E26B 72 LD (HL),D +3050 E26C 0E 02 WTSEQ5: LD C,2 ;set (C) to indicate writing to un-used disk space. +3051 E26E 3A 45 DB WTSEQ6: LD A,(STATUS) ;are we ok so far? +3052 E271 B7 OR A +3053 E272 C0 RET NZ +3054 E273 C5 PUSH BC ;yes, save write flag for bios (register C). +3055 E274 CD 8A DC CALL LOGICAL ;convert (BLKNMBR) over to loical sectors. +3056 E277 3A D5 E5 LD A,(MODE) ;get access mode flag (1=sequential, +3057 E27A 3D DEC A ;0=random, 2=special?). +3058 E27B 3D DEC A +3059 E27C C2 BB E2 JP NZ,WTSEQ9 +3060 E27F ; +3061 E27F ; Special random i/o from function #40. Maybe for M/PM, but the +3062 E27F ; current block, if it has not been written to, will be zeroed +3063 E27F ; out and then written (reason?). +3064 E27F ; +3065 E27F C1 POP BC +3066 E280 C5 PUSH BC +3067 E281 79 LD A,C ;get write status flag (2=writing unused space). +3068 E282 3D DEC A +3069 E283 3D DEC A +3070 E284 C2 BB E2 JP NZ,WTSEQ9 +3071 E287 E5 PUSH HL +3072 E288 2A B9 E5 LD HL,(DIRBUF) ;zero out the directory buffer. +3073 E28B 57 LD D,A ;note that (A) is zero here. +3074 E28C 77 WTSEQ7: LD (HL),A +3075 E28D 23 INC HL +3076 E28E 14 INC D ;do 128 bytes. +3077 E28F F2 8C E2 JP P,WTSEQ7 +3078 E292 CD E0 DD CALL DIRDMA ;tell the bios the dma address for directory access. +3079 E295 2A E7 E5 LD HL,(LOGSECT) ;get sector that starts current block. +3080 E298 0E 02 LD C,2 ;set 'writing to unused space' flag. +3081 E29A 22 E5 E5 WTSEQ8: LD (BLKNMBR),HL ;save sector to write. +3082 E29D C5 PUSH BC +3083 E29E CD D1 DB CALL TRKSEC1 ;determine its track and sector numbers. +3084 E2A1 C1 POP BC +3085 E2A2 CD B8 DB CALL DOWRITE ;now write out 128 bytes of zeros. +3086 E2A5 2A E5 E5 LD HL,(BLKNMBR) ;get sector number. +3087 E2A8 0E 00 LD C,0 ;set normal write flag. +3088 E2AA 3A C4 E5 LD A,(BLKMASK) ;determine if we have written the entire +3089 E2AD 47 LD B,A ;physical block. +3090 E2AE A5 AND L +3091 E2AF B8 CP B +3092 E2B0 23 INC HL ;prepare for the next one. +3093 E2B1 C2 9A E2 JP NZ,WTSEQ8 ;continue until (BLKMASK+1) sectors written. +3094 E2B4 E1 POP HL ;reset next sector number. +3095 E2B5 22 E5 E5 LD (BLKNMBR),HL +3096 E2B8 CD DA DD CALL DEFDMA ;and reset dma address. +3097 E2BB ; +3098 E2BB ; Normal disk write. Set the desired track and sector then +3099 E2BB ; do the actual write. +3100 E2BB ; +3101 E2BB CD D1 DB WTSEQ9: CALL TRKSEC1 ;determine track and sector for this write. +3102 E2BE C1 POP BC ;get write status flag. +3103 E2BF C5 PUSH BC +3104 E2C0 CD B8 DB CALL DOWRITE ;and write this out. +3105 E2C3 C1 POP BC +3106 E2C4 3A E3 E5 LD A,(SAVNREC) ;get number of records in file. +3107 E2C7 21 E1 E5 LD HL,SAVNXT ;get last record written. +3108 E2CA BE CP (HL) +3109 E2CB DA D2 E2 JP C,WTSEQ10 +3110 E2CE 77 LD (HL),A ;we have to update record count. +3111 E2CF 34 INC (HL) +3112 E2D0 0E 02 LD C,2 +3113 E2D2 ; +3114 E2D2 ;* This area has been patched to correct disk update problem +3115 E2D2 ;* when using blocking and de-blocking in the BIOS. +3116 E2D2 ; +3117 E2D2 00 WTSEQ10:NOP ;was 'dcr c' +3118 E2D3 00 NOP ;was 'dcr c' +3119 E2D4 21 00 00 LD HL,0 ;was 'jnz wtseq99' +3120 E2D7 ; +3121 E2D7 ; * End of patch. +3122 E2D7 ; +3123 E2D7 F5 PUSH AF +3124 E2D8 CD 69 DD CALL GETS2 ;set 'extent written to' flag. +3125 E2DB E6 7F AND 7FH ;(* clear bit 7 *) +3126 E2DD 77 LD (HL),A +3127 E2DE F1 POP AF ;get record count for this extent. +3128 E2DF FE 7F WTSEQ99:CP 127 ;is it full? +3129 E2E1 C2 00 E3 JP NZ,WTSEQ12 +3130 E2E4 3A D5 E5 LD A,(MODE) ;yes, are we in sequential mode? +3131 E2E7 FE 01 CP 1 +3132 E2E9 C2 00 E3 JP NZ,WTSEQ12 +3133 E2EC CD D2 DC CALL SETNREC ;yes, set next record number. +3134 E2EF CD 5A E1 CALL GETNEXT ;and get next empty space in directory. +3135 E2F2 21 45 DB LD HL,STATUS ;ok? +3136 E2F5 7E LD A,(HL) +3137 E2F6 B7 OR A +3138 E2F7 C2 FE E2 JP NZ,WTSEQ11 +3139 E2FA 3D DEC A ;yes, set record count to -1. +3140 E2FB 32 E3 E5 LD (SAVNREC),A +3141 E2FE 36 00 WTSEQ11:LD (HL),0 ;clear status. +3142 E300 C3 D2 DC WTSEQ12:JP SETNREC ;set next record to access. +3143 E303 ; +3144 E303 ; For random i/o, set the fcb for the desired record number +3145 E303 ; based on the 'r0,r1,r2' bytes. These bytes in the fcb are +3146 E303 ; used as follows: +3147 E303 ; +3148 E303 ; fcb+35 fcb+34 fcb+33 +3149 E303 ; | 'r-2' | 'r-1' | 'r-0' | +3150 E303 ; |7 0 | 7 0 | 7 0| +3151 E303 ; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0| +3152 E303 ; | overflow | | extra | extent | record # | +3153 E303 ; | ______________| |_extent|__number___|_____________| +3154 E303 ; also 's2' +3155 E303 ; +3156 E303 ; On entry, register (C) contains 0ffh if this is a read +3157 E303 ; and thus we can not access unwritten disk space. Otherwise, +3158 E303 ; another extent will be opened (for writing) if required. +3159 E303 ; +3160 E303 AF POSITION: XOR A ;set random i/o flag. +3161 E304 32 D5 E5 LD (MODE),A +3162 E307 ; +3163 E307 ; Special entry (function #40). M/PM ? +3164 E307 ; +3165 E307 C5 POSITN1:PUSH BC ;save read/write flag. +3166 E308 2A 43 DB LD HL,(PARAMS) ;get address of fcb. +3167 E30B EB EX DE,HL +3168 E30C 21 21 00 LD HL,33 ;now get byte 'r0'. +3169 E30F 19 ADD HL,DE +3170 E310 7E LD A,(HL) +3171 E311 E6 7F AND 7FH ;keep bits 0-6 for the record number to access. +3172 E313 F5 PUSH AF +3173 E314 7E LD A,(HL) ;now get bit 7 of 'r0' and bits 0-3 of 'r1'. +3174 E315 17 RLA +3175 E316 23 INC HL +3176 E317 7E LD A,(HL) +3177 E318 17 RLA +3178 E319 E6 1F AND 1FH ;and save this in bits 0-4 of (C). +3179 E31B 4F LD C,A ;this is the extent byte. +3180 E31C 7E LD A,(HL) ;now get the extra extent byte. +3181 E31D 1F RRA +3182 E31E 1F RRA +3183 E31F 1F RRA +3184 E320 1F RRA +3185 E321 E6 0F AND 0FH +3186 E323 47 LD B,A ;and save it in (B). +3187 E324 F1 POP AF ;get record number back to (A). +3188 E325 23 INC HL ;check overflow byte 'r2'. +3189 E326 6E LD L,(HL) +3190 E327 2C INC L +3191 E328 2D DEC L +3192 E329 2E 06 LD L,6 ;prepare for error. +3193 E32B C2 8B E3 JP NZ,POSITN5 ;out of disk space error. +3194 E32E 21 20 00 LD HL,32 ;store record number into fcb. +3195 E331 19 ADD HL,DE +3196 E332 77 LD (HL),A +3197 E333 21 0C 00 LD HL,12 ;and now check the extent byte. +3198 E336 19 ADD HL,DE +3199 E337 79 LD A,C +3200 E338 96 SUB (HL) ;same extent as before? +3201 E339 C2 47 E3 JP NZ,POSITN2 +3202 E33C 21 0E 00 LD HL,14 ;yes, check extra extent byte 's2' also. +3203 E33F 19 ADD HL,DE +3204 E340 78 LD A,B +3205 E341 96 SUB (HL) +3206 E342 E6 7F AND 7FH +3207 E344 CA 7F E3 JP Z,POSITN3 ;same, we are almost done then. +3208 E347 ; +3209 E347 ; Get here when another extent is required. +3210 E347 ; +3211 E347 C5 POSITN2:PUSH BC +3212 E348 D5 PUSH DE +3213 E349 CD A2 E0 CALL CLOSEIT ;close current extent. +3214 E34C D1 POP DE +3215 E34D C1 POP BC +3216 E34E 2E 03 LD L,3 ;prepare for error. +3217 E350 3A 45 DB LD A,(STATUS) +3218 E353 3C INC A +3219 E354 CA 84 E3 JP Z,POSITN4 ;close error. +3220 E357 21 0C 00 LD HL,12 ;put desired extent into fcb now. +3221 E35A 19 ADD HL,DE +3222 E35B 71 LD (HL),C +3223 E35C 21 0E 00 LD HL,14 ;and store extra extent byte 's2'. +3224 E35F 19 ADD HL,DE +3225 E360 70 LD (HL),B +3226 E361 CD 51 E0 CALL OPENIT ;try and get this extent. +3227 E364 3A 45 DB LD A,(STATUS) ;was it there? +3228 E367 3C INC A +3229 E368 C2 7F E3 JP NZ,POSITN3 +3230 E36B C1 POP BC ;no. can we create a new one (writing?). +3231 E36C C5 PUSH BC +3232 E36D 2E 04 LD L,4 ;prepare for error. +3233 E36F 0C INC C +3234 E370 CA 84 E3 JP Z,POSITN4 ;nope, reading unwritten space error. +3235 E373 CD 24 E1 CALL GETEMPTY ;yes we can, try to find space. +3236 E376 2E 05 LD L,5 ;prepare for error. +3237 E378 3A 45 DB LD A,(STATUS) +3238 E37B 3C INC A +3239 E37C CA 84 E3 JP Z,POSITN4 ;out of space? +3240 E37F ; +3241 E37F ; Normal return location. Clear error code and return. +3242 E37F ; +3243 E37F C1 POSITN3:POP BC ;restore stack. +3244 E380 AF XOR A ;and clear error code byte. +3245 E381 C3 01 DB JP SETSTAT +3246 E384 ; +3247 E384 ; Error. Set the 's2' byte to indicate this (why?). +3248 E384 ; +3249 E384 E5 POSITN4:PUSH HL +3250 E385 CD 69 DD CALL GETS2 +3251 E388 36 C0 LD (HL),0C0H +3252 E38A E1 POP HL +3253 E38B ; +3254 E38B ; Return with error code (presently in L). +3255 E38B ; +3256 E38B C1 POSITN5:POP BC +3257 E38C 7D LD A,L ;get error code. +3258 E38D 32 45 DB LD (STATUS),A +3259 E390 C3 78 DD JP SETS2B7 +3260 E393 ; +3261 E393 ; Read a random record. +3262 E393 ; +3263 E393 0E FF READRAN:LD C,0FFH ;set 'read' status. +3264 E395 CD 03 E3 CALL POSITION ;position the file to proper record. +3265 E398 CC C1 E1 CALL Z,RDSEQ1 ;and read it as usual (if no errors). +3266 E39B C9 RET +3267 E39C ; +3268 E39C ; Write to a random record. +3269 E39C ; +3270 E39C 0E 00 WRITERAN: LD C,0 ;set 'writing' flag. +3271 E39E CD 03 E3 CALL POSITION ;position the file to proper record. +3272 E3A1 CC 03 E2 CALL Z,WTSEQ1 ;and write as usual (if no errors). +3273 E3A4 C9 RET +3274 E3A5 ; +3275 E3A5 ; Compute the random record number. Enter with (HL) pointing +3276 E3A5 ; to a fcb an (DE) contains a relative location of a record +3277 E3A5 ; number. On exit, (C) contains the 'r0' byte, (B) the 'r1' +3278 E3A5 ; byte, and (A) the 'r2' byte. +3279 E3A5 ; +3280 E3A5 ; On return, the zero flag is set if the record is within +3281 E3A5 ; bounds. Otherwise, an overflow occured. +3282 E3A5 ; +3283 E3A5 EB COMPRAND: EX DE,HL ;save fcb pointer in (DE). +3284 E3A6 19 ADD HL,DE ;compute relative position of record #. +3285 E3A7 4E LD C,(HL) ;get record number into (BC). +3286 E3A8 06 00 LD B,0 +3287 E3AA 21 0C 00 LD HL,12 ;now get extent. +3288 E3AD 19 ADD HL,DE +3289 E3AE 7E LD A,(HL) ;compute (BC)=(record #)+(extent)*128. +3290 E3AF 0F RRCA ;move lower bit into bit 7. +3291 E3B0 E6 80 AND 80H ;and ignore all other bits. +3292 E3B2 81 ADD A,C ;add to our record number. +3293 E3B3 4F LD C,A +3294 E3B4 3E 00 LD A,0 ;take care of any carry. +3295 E3B6 88 ADC A,B +3296 E3B7 47 LD B,A +3297 E3B8 7E LD A,(HL) ;now get the upper bits of extent into +3298 E3B9 0F RRCA ;bit positions 0-3. +3299 E3BA E6 0F AND 0FH ;and ignore all others. +3300 E3BC 80 ADD A,B ;add this in to 'r1' byte. +3301 E3BD 47 LD B,A +3302 E3BE 21 0E 00 LD HL,14 ;get the 's2' byte (extra extent). +3303 E3C1 19 ADD HL,DE +3304 E3C2 7E LD A,(HL) +3305 E3C3 87 ADD A,A ;and shift it left 4 bits (bits 4-7). +3306 E3C4 87 ADD A,A +3307 E3C5 87 ADD A,A +3308 E3C6 87 ADD A,A +3309 E3C7 F5 PUSH AF ;save carry flag (bit 0 of flag byte). +3310 E3C8 80 ADD A,B ;now add extra extent into 'r1'. +3311 E3C9 47 LD B,A +3312 E3CA F5 PUSH AF ;and save carry (overflow byte 'r2'). +3313 E3CB E1 POP HL ;bit 0 of (L) is the overflow indicator. +3314 E3CC 7D LD A,L +3315 E3CD E1 POP HL ;and same for first carry flag. +3316 E3CE B5 OR L ;either one of these set? +3317 E3CF E6 01 AND 01H ;only check the carry flags. +3318 E3D1 C9 RET +3319 E3D2 ; +3320 E3D2 ; Routine to setup the fcb (bytes 'r0', 'r1', 'r2') to +3321 E3D2 ; reflect the last record used for a random (or other) file. +3322 E3D2 ; This reads the directory and looks at all extents computing +3323 E3D2 ; the largerst record number for each and keeping the maximum +3324 E3D2 ; value only. Then 'r0', 'r1', and 'r2' will reflect this +3325 E3D2 ; maximum record number. This is used to compute the space used +3326 E3D2 ; by a random file. +3327 E3D2 ; +3328 E3D2 0E 0C RANSIZE:LD C,12 ;look thru directory for first entry with +3329 E3D4 CD 18 DF CALL FINDFST ;this name. +3330 E3D7 2A 43 DB LD HL,(PARAMS) ;zero out the 'r0, r1, r2' bytes. +3331 E3DA 11 21 00 LD DE,33 +3332 E3DD 19 ADD HL,DE +3333 E3DE E5 PUSH HL +3334 E3DF 72 LD (HL),D ;note that (D)=0. +3335 E3E0 23 INC HL +3336 E3E1 72 LD (HL),D +3337 E3E2 23 INC HL +3338 E3E3 72 LD (HL),D +3339 E3E4 CD F5 DD RANSIZ1:CALL CKFILPOS ;is there an extent to process? +3340 E3E7 CA 0C E4 JP Z,RANSIZ3 ;no, we are done. +3341 E3EA CD 5E DD CALL FCB2HL ;set (HL) pointing to proper fcb in dir. +3342 E3ED 11 0F 00 LD DE,15 ;point to last record in extent. +3343 E3F0 CD A5 E3 CALL COMPRAND ;and compute random parameters. +3344 E3F3 E1 POP HL +3345 E3F4 E5 PUSH HL ;now check these values against those +3346 E3F5 5F LD E,A ;already in fcb. +3347 E3F6 79 LD A,C ;the carry flag will be set if those +3348 E3F7 96 SUB (HL) ;in the fcb represent a larger size than +3349 E3F8 23 INC HL ;this extent does. +3350 E3F9 78 LD A,B +3351 E3FA 9E SBC A,(HL) +3352 E3FB 23 INC HL +3353 E3FC 7B LD A,E +3354 E3FD 9E SBC A,(HL) +3355 E3FE DA 06 E4 JP C,RANSIZ2 +3356 E401 73 LD (HL),E ;we found a larger (in size) extent. +3357 E402 2B DEC HL ;stuff these values into fcb. +3358 E403 70 LD (HL),B +3359 E404 2B DEC HL +3360 E405 71 LD (HL),C +3361 E406 CD 2D DF RANSIZ2:CALL FINDNXT ;now get the next extent. +3362 E409 C3 E4 E3 JP RANSIZ1 ;continue til all done. +3363 E40C E1 RANSIZ3:POP HL ;we are done, restore the stack and +3364 E40D C9 RET ;return. +3365 E40E ; +3366 E40E ; Function to return the random record position of a given +3367 E40E ; file which has been read in sequential mode up to now. +3368 E40E ; +3369 E40E 2A 43 DB SETRAN: LD HL,(PARAMS) ;point to fcb. +3370 E411 11 20 00 LD DE,32 ;and to last used record. +3371 E414 CD A5 E3 CALL COMPRAND ;compute random position. +3372 E417 21 21 00 LD HL,33 ;now stuff these values into fcb. +3373 E41A 19 ADD HL,DE +3374 E41B 71 LD (HL),C ;move 'r0'. +3375 E41C 23 INC HL +3376 E41D 70 LD (HL),B ;and 'r1'. +3377 E41E 23 INC HL +3378 E41F 77 LD (HL),A ;and lastly 'r2'. +3379 E420 C9 RET +3380 E421 ; +3381 E421 ; This routine select the drive specified in (ACTIVE) and +3382 E421 ; update the login vector and bitmap table if this drive was +3383 E421 ; not already active. +3384 E421 ; +3385 E421 2A AF E5 LOGINDRV: LD HL,(LOGIN) ;get the login vector. +3386 E424 3A 42 DB LD A,(ACTIVE) ;get the default drive. +3387 E427 4F LD C,A +3388 E428 CD EA DC CALL SHIFTR ;position active bit for this drive +3389 E42B E5 PUSH HL ;into bit 0. +3390 E42C EB EX DE,HL +3391 E42D CD 59 DB CALL SELECT ;select this drive. +3392 E430 E1 POP HL +3393 E431 CC 47 DB CALL Z,SLCTERR ;valid drive? +3394 E434 7D LD A,L ;is this a newly activated drive? +3395 E435 1F RRA +3396 E436 D8 RET C +3397 E437 2A AF E5 LD HL,(LOGIN) ;yes, update the login vector. +3398 E43A 4D LD C,L +3399 E43B 44 LD B,H +3400 E43C CD 0B DD CALL SETBIT +3401 E43F 22 AF E5 LD (LOGIN),HL ;and save. +3402 E442 C3 A3 DE JP BITMAP ;now update the bitmap. +3403 E445 ; +3404 E445 ; Function to set the active disk number. +3405 E445 ; +3406 E445 3A D6 E5 SETDSK: LD A,(EPARAM) ;get parameter passed and see if this +3407 E448 21 42 DB LD HL,ACTIVE ;represents a change in drives. +3408 E44B BE CP (HL) +3409 E44C C8 RET Z +3410 E44D 77 LD (HL),A ;yes it does, log it in. +3411 E44E C3 21 E4 JP LOGINDRV +3412 E451 ; +3413 E451 ; This is the 'auto disk select' routine. The firsst byte +3414 E451 ; of the fcb is examined for a drive specification. If non +3415 E451 ; zero then the drive will be selected and loged in. +3416 E451 ; +3417 E451 3E FF AUTOSEL:LD A,0FFH ;say 'auto-select activated'. +3418 E453 32 DE E5 LD (AUTO),A +3419 E456 2A 43 DB LD HL,(PARAMS) ;get drive specified. +3420 E459 7E LD A,(HL) +3421 E45A E6 1F AND 1FH ;look at lower 5 bits. +3422 E45C 3D DEC A ;adjust for (1=A, 2=B) etc. +3423 E45D 32 D6 E5 LD (EPARAM),A ;and save for the select routine. +3424 E460 FE 1E CP 1EH ;check for 'no change' condition. +3425 E462 D2 75 E4 JP NC,AUTOSL1 ;yes, don't change. +3426 E465 3A 42 DB LD A,(ACTIVE) ;we must change, save currently active +3427 E468 32 DF E5 LD (OLDDRV),A ;drive. +3428 E46B 7E LD A,(HL) ;and save first byte of fcb also. +3429 E46C 32 E0 E5 LD (AUTOFLAG),A ;this must be non-zero. +3430 E46F E6 E0 AND 0E0H ;whats this for (bits 6,7 are used for +3431 E471 77 LD (HL),A ;something)? +3432 E472 CD 45 E4 CALL SETDSK ;select and log in this drive. +3433 E475 3A 41 DB AUTOSL1:LD A,(USERNO) ;move user number into fcb. +3434 E478 2A 43 DB LD HL,(PARAMS) ;(* upper half of first byte *) +3435 E47B B6 OR (HL) +3436 E47C 77 LD (HL),A +3437 E47D C9 RET ;and return (all done). +3438 E47E ; +3439 E47E ; Function to return the current cp/m version number. +3440 E47E ; +3441 E47E 3E 22 GETVER: LD A,022H ;version 2.2 +3442 E480 C3 01 DB JP SETSTAT +3443 E483 ; +3444 E483 ; Function to reset the disk system. +3445 E483 ; +3446 E483 21 00 00 RSTDSK: LD HL,0 ;clear write protect status and log +3447 E486 22 AD E5 LD (WRTPRT),HL ;in vector. +3448 E489 22 AF E5 LD (LOGIN),HL +3449 E48C AF XOR A ;select drive 'A'. +3450 E48D 32 42 DB LD (ACTIVE),A +3451 E490 21 80 00 LD HL,TBUFF ;setup default dma address. +3452 E493 22 B1 E5 LD (USERDMA),HL +3453 E496 CD DA DD CALL DEFDMA +3454 E499 C3 21 E4 JP LOGINDRV ;now log in drive 'A'. +3455 E49C ; +3456 E49C ; Function to open a specified file. +3457 E49C ; +3458 E49C CD 72 DD OPENFIL:CALL CLEARS2 ;clear 's2' byte. +3459 E49F CD 51 E4 CALL AUTOSEL ;select proper disk. +3460 E4A2 C3 51 E0 JP OPENIT ;and open the file. +3461 E4A5 ; +3462 E4A5 ; Function to close a specified file. +3463 E4A5 ; +3464 E4A5 CD 51 E4 CLOSEFIL: CALL AUTOSEL ;select proper disk. +3465 E4A8 C3 A2 E0 JP CLOSEIT ;and close the file. +3466 E4AB ; +3467 E4AB ; Function to return the first occurence of a specified file +3468 E4AB ; name. If the first byte of the fcb is '?' then the name will +3469 E4AB ; not be checked (get the first entry no matter what). +3470 E4AB ; +3471 E4AB 0E 00 GETFST: LD C,0 ;prepare for special search. +3472 E4AD EB EX DE,HL +3473 E4AE 7E LD A,(HL) ;is first byte a '?'? +3474 E4AF FE 3F CP '?' +3475 E4B1 CA C2 E4 JP Z,GETFST1 ;yes, just get very first entry (zero length match). +3476 E4B4 CD A6 DC CALL SETEXT ;get the extension byte from fcb. +3477 E4B7 7E LD A,(HL) ;is it '?'? if yes, then we want +3478 E4B8 FE 3F CP '?' ;an entry with a specific 's2' byte. +3479 E4BA C4 72 DD CALL NZ,CLEARS2 ;otherwise, look for a zero 's2' byte. +3480 E4BD CD 51 E4 CALL AUTOSEL ;select proper drive. +3481 E4C0 0E 0F LD C,15 ;compare bytes 0-14 in fcb (12&13 excluded). +3482 E4C2 CD 18 DF GETFST1:CALL FINDFST ;find an entry and then move it into +3483 E4C5 C3 E9 DD JP MOVEDIR ;the users dma space. +3484 E4C8 ; +3485 E4C8 ; Function to return the next occurence of a file name. +3486 E4C8 ; +3487 E4C8 2A D9 E5 GETNXT: LD HL,(SAVEFCB) ;restore pointers. note that no +3488 E4CB 22 43 DB LD (PARAMS),HL ;other dbos calls are allowed. +3489 E4CE CD 51 E4 CALL AUTOSEL ;no error will be returned, but the +3490 E4D1 CD 2D DF CALL FINDNXT ;results will be wrong. +3491 E4D4 C3 E9 DD JP MOVEDIR +3492 E4D7 ; +3493 E4D7 ; Function to delete a file by name. +3494 E4D7 ; +3495 E4D7 CD 51 E4 DELFILE:CALL AUTOSEL ;select proper drive. +3496 E4DA CD 9C DF CALL ERAFILE ;erase the file. +3497 E4DD C3 01 DF JP STSTATUS ;set status and return. +3498 E4E0 ; +3499 E4E0 ; Function to execute a sequential read of the specified +3500 E4E0 ; record number. +3501 E4E0 ; +3502 E4E0 CD 51 E4 READSEQ:CALL AUTOSEL ;select proper drive then read. +3503 E4E3 C3 BC E1 JP RDSEQ +3504 E4E6 ; +3505 E4E6 ; Function to write the net sequential record. +3506 E4E6 ; +3507 E4E6 CD 51 E4 WRTSEQ: CALL AUTOSEL ;select proper drive then write. +3508 E4E9 C3 FE E1 JP WTSEQ +3509 E4EC ; +3510 E4EC ; Create a file function. +3511 E4EC ; +3512 E4EC CD 72 DD FCREATE:CALL CLEARS2 ;clear the 's2' byte on all creates. +3513 E4EF CD 51 E4 CALL AUTOSEL ;select proper drive and get the next +3514 E4F2 C3 24 E1 JP GETEMPTY ;empty directory space. +3515 E4F5 ; +3516 E4F5 ; Function to rename a file. +3517 E4F5 ; +3518 E4F5 CD 51 E4 RENFILE:CALL AUTOSEL ;select proper drive and then switch +3519 E4F8 CD 16 E0 CALL CHGNAMES ;file names. +3520 E4FB C3 01 DF JP STSTATUS +3521 E4FE ; +3522 E4FE ; Function to return the login vector. +3523 E4FE ; +3524 E4FE 2A AF E5 GETLOG: LD HL,(LOGIN) +3525 E501 C3 29 E5 JP GETPRM1 +3526 E504 ; +3527 E504 ; Function to return the current disk assignment. +3528 E504 ; +3529 E504 3A 42 DB GETCRNT:LD A,(ACTIVE) +3530 E507 C3 01 DB JP SETSTAT +3531 E50A ; +3532 E50A ; Function to set the dma address. +3533 E50A ; +3534 E50A EB PUTDMA: EX DE,HL +3535 E50B 22 B1 E5 LD (USERDMA),HL ;save in our space and then get to +3536 E50E C3 DA DD JP DEFDMA ;the bios with this also. +3537 E511 ; +3538 E511 ; Function to return the allocation vector. +3539 E511 ; +3540 E511 2A BF E5 GETALOC:LD HL,(ALOCVECT) +3541 E514 C3 29 E5 JP GETPRM1 +3542 E517 ; +3543 E517 ; Function to return the read-only status vector. +3544 E517 ; +3545 E517 2A AD E5 GETROV: LD HL,(WRTPRT) +3546 E51A C3 29 E5 JP GETPRM1 +3547 E51D ; +3548 E51D ; Function to set the file attributes (read-only, system). +3549 E51D ; +3550 E51D CD 51 E4 SETATTR:CALL AUTOSEL ;select proper drive then save attributes. +3551 E520 CD 3B E0 CALL SAVEATTR +3552 E523 C3 01 DF JP STSTATUS +3553 E526 ; +3554 E526 ; Function to return the address of the disk parameter block +3555 E526 ; for the current drive. +3556 E526 ; +3557 E526 2A BB E5 GETPARM:LD HL,(DISKPB) +3558 E529 22 45 DB GETPRM1:LD (STATUS),HL +3559 E52C C9 RET +3560 E52D ; +3561 E52D ; Function to get or set the user number. If (E) was (FF) +3562 E52D ; then this is a request to return the current user number. +3563 E52D ; Else set the user number from (E). +3564 E52D ; +3565 E52D 3A D6 E5 GETUSER:LD A,(EPARAM) ;get parameter. +3566 E530 FE FF CP 0FFH ;get user number? +3567 E532 C2 3B E5 JP NZ,SETUSER +3568 E535 3A 41 DB LD A,(USERNO) ;yes, just do it. +3569 E538 C3 01 DB JP SETSTAT +3570 E53B E6 1F SETUSER:AND 1FH ;no, we should set it instead. keep low +3571 E53D 32 41 DB LD (USERNO),A ;bits (0-4) only. +3572 E540 C9 RET +3573 E541 ; +3574 E541 ; Function to read a random record from a file. +3575 E541 ; +3576 E541 CD 51 E4 RDRANDOM: CALL AUTOSEL ;select proper drive and read. +3577 E544 C3 93 E3 JP READRAN +3578 E547 ; +3579 E547 ; Function to compute the file size for random files. +3580 E547 ; +3581 E547 CD 51 E4 WTRANDOM: CALL AUTOSEL ;select proper drive and write. +3582 E54A C3 9C E3 JP WRITERAN +3583 E54D ; +3584 E54D ; Function to compute the size of a random file. +3585 E54D ; +3586 E54D CD 51 E4 FILESIZE: CALL AUTOSEL ;select proper drive and check file length +3587 E550 C3 D2 E3 JP RANSIZE +3588 E553 ; +3589 E553 ; Function #37. This allows a program to log off any drives. +3590 E553 ; On entry, set (DE) to contain a word with bits set for those +3591 E553 ; drives that are to be logged off. The log-in vector and the +3592 E553 ; write protect vector will be updated. This must be a M/PM +3593 E553 ; special function. +3594 E553 ; +3595 E553 2A 43 DB LOGOFF: LD HL,(PARAMS) ;get drives to log off. +3596 E556 7D LD A,L ;for each bit that is set, we want +3597 E557 2F CPL ;to clear that bit in (LOGIN) +3598 E558 5F LD E,A ;and (WRTPRT). +3599 E559 7C LD A,H +3600 E55A 2F CPL +3601 E55B 2A AF E5 LD HL,(LOGIN) ;reset the login vector. +3602 E55E A4 AND H +3603 E55F 57 LD D,A +3604 E560 7D LD A,L +3605 E561 A3 AND E +3606 E562 5F LD E,A +3607 E563 2A AD E5 LD HL,(WRTPRT) +3608 E566 EB EX DE,HL +3609 E567 22 AF E5 LD (LOGIN),HL ;and save. +3610 E56A 7D LD A,L ;now do the write protect vector. +3611 E56B A3 AND E +3612 E56C 6F LD L,A +3613 E56D 7C LD A,H +3614 E56E A2 AND D +3615 E56F 67 LD H,A +3616 E570 22 AD E5 LD (WRTPRT),HL ;and save. all done. +3617 E573 C9 RET +3618 E574 ; +3619 E574 ; Get here to return to the user. +3620 E574 ; +3621 E574 3A DE E5 GOBACK: LD A,(AUTO) ;was auto select activated? +3622 E577 B7 OR A +3623 E578 CA 91 E5 JP Z,GOBACK1 +3624 E57B 2A 43 DB LD HL,(PARAMS) ;yes, but was a change made? +3625 E57E 36 00 LD (HL),0 ;(* reset first byte of fcb *) +3626 E580 3A E0 E5 LD A,(AUTOFLAG) +3627 E583 B7 OR A +3628 E584 CA 91 E5 JP Z,GOBACK1 +3629 E587 77 LD (HL),A ;yes, reset first byte properly. +3630 E588 3A DF E5 LD A,(OLDDRV) ;and get the old drive and select it. +3631 E58B 32 D6 E5 LD (EPARAM),A +3632 E58E CD 45 E4 CALL SETDSK +3633 E591 2A 0F DB GOBACK1:LD HL,(USRSTACK) ;reset the users stack pointer. +3634 E594 F9 LD SP,HL +3635 E595 2A 45 DB LD HL,(STATUS) ;get return status. +3636 E598 7D LD A,L ;force version 1.4 compatability. +3637 E599 44 LD B,H +3638 E59A C9 RET ;and go back to user. +3639 E59B ; +3640 E59B ; Function #40. This is a special entry to do random i/o. +3641 E59B ; For the case where we are writing to unused disk space, this +3642 E59B ; space will be zeroed out first. This must be a M/PM special +3643 E59B ; purpose function, because why would any normal program even +3644 E59B ; care about the previous contents of a sector about to be +3645 E59B ; written over. +3646 E59B ; +3647 E59B CD 51 E4 WTSPECL:CALL AUTOSEL ;select proper drive. +3648 E59E 3E 02 LD A,2 ;use special write mode. +3649 E5A0 32 D5 E5 LD (MODE),A +3650 E5A3 0E 00 LD C,0 ;set write indicator. +3651 E5A5 CD 07 E3 CALL POSITN1 ;position the file. +3652 E5A8 CC 03 E2 CALL Z,WTSEQ1 ;and write (if no errors). +3653 E5AB C9 RET +3654 E5AC ; +3655 E5AC ;************************************************************** +3656 E5AC ;* +3657 E5AC ;* BDOS data storage pool. +3658 E5AC ;* +3659 E5AC ;************************************************************** +3660 E5AC ; +3661 E5AC E5 EMPTYFCB: .DB 0E5H ;empty directory segment indicator. +3662 E5AD 00 00 WRTPRT: .DW 0 ;write protect status for all 16 drives. +3663 E5AF 00 00 LOGIN: .DW 0 ;drive active word (1 bit per drive). +3664 E5B1 80 00 USERDMA:.DW 080H ;user's dma address (defaults to 80h). +3665 E5B3 ; +3666 E5B3 ; Scratch areas from parameter block. +3667 E5B3 ; +3668 E5B3 00 00 SCRATCH1: .DW 0 ;relative position within dir segment for file (0-3). +3669 E5B5 00 00 SCRATCH2: .DW 0 ;last selected track number. +3670 E5B7 00 00 SCRATCH3: .DW 0 ;last selected sector number. +3671 E5B9 ; +3672 E5B9 ; Disk storage areas from parameter block. +3673 E5B9 ; +3674 E5B9 00 00 DIRBUF: .DW 0 ;address of directory buffer to use. +3675 E5BB 00 00 DISKPB: .DW 0 ;contains address of disk parameter block. +3676 E5BD 00 00 CHKVECT:.DW 0 ;address of check vector. +3677 E5BF 00 00 ALOCVECT: .DW 0 ;address of allocation vector (bit map). +3678 E5C1 ; +3679 E5C1 ; Parameter block returned from the bios. +3680 E5C1 ; +3681 E5C1 00 00 SECTORS:.DW 0 ;sectors per track from bios. +3682 E5C3 00 BLKSHFT:.DB 0 ;block shift. +3683 E5C4 00 BLKMASK:.DB 0 ;block mask. +3684 E5C5 00 EXTMASK:.DB 0 ;extent mask. +3685 E5C6 00 00 DSKSIZE:.DW 0 ;disk size from bios (number of blocks-1). +3686 E5C8 00 00 DIRSIZE:.DW 0 ;directory size. +3687 E5CA 00 00 ALLOC0: .DW 0 ;storage for first bytes of bit map (dir space used). +3688 E5CC 00 00 ALLOC1: .DW 0 +3689 E5CE 00 00 OFFSET: .DW 0 ;first usable track number. +3690 E5D0 00 00 XLATE: .DW 0 ;sector translation table address. +3691 E5D2 ; +3692 E5D2 ; +3693 E5D2 00 CLOSEFLG: .DB 0 ;close flag (=0ffh is extent written ok). +3694 E5D3 00 RDWRTFLG: .DB 0 ;read/write flag (0ffh=read, 0=write). +3695 E5D4 00 FNDSTAT:.DB 0 ;filename found status (0=found first entry). +3696 E5D5 00 MODE: .DB 0 ;I/o mode select (0=random, 1=sequential, 2=special random). +3697 E5D6 00 EPARAM: .DB 0 ;storage for register (E) on entry to bdos. +3698 E5D7 00 RELBLOCK: .DB 0 ;relative position within fcb of block number written. +3699 E5D8 00 COUNTER:.DB 0 ;byte counter for directory name searches. +3700 E5D9 00 00 00 00 SAVEFCB:.DW 0,0 ;save space for address of fcb (for directory searches). +3701 E5DD 00 BIGDISK:.DB 0 ;if =0 then disk is > 256 blocks long. +3702 E5DE 00 AUTO: .DB 0 ;if non-zero, then auto select activated. +3703 E5DF 00 OLDDRV: .DB 0 ;on auto select, storage for previous drive. +3704 E5E0 00 AUTOFLAG: .DB 0 ;if non-zero, then auto select changed drives. +3705 E5E1 00 SAVNXT: .DB 0 ;storage for next record number to access. +3706 E5E2 00 SAVEXT: .DB 0 ;storage for extent number of file. +3707 E5E3 00 00 SAVNREC:.DW 0 ;storage for number of records in file. +3708 E5E5 00 00 BLKNMBR:.DW 0 ;block number (physical sector) used within a file or logical sect +3709 E5E7 00 00 LOGSECT:.DW 0 ;starting logical (128 byte) sector of block (physical sector). +3710 E5E9 00 FCBPOS: .DB 0 ;relative position within buffer for fcb of file of interest. +3711 E5EA 00 00 FILEPOS:.DW 0 ;files position within directory (0 to max entries -1). +3712 E5EC ; +3713 E5EC ; Disk directory buffer checksum bytes. One for each of the +3714 E5EC ; 16 possible drives. +3715 E5EC ; +3716 E5EC 00 00 00 00 CKSUMTBL: .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +3716 E5F0 00 00 00 00 +3716 E5F4 00 00 00 00 +3716 E5F8 00 00 00 00 +3717 E5FC ; +3718 E5FC ; Extra space ? +3719 E5FC ; +3720 E5FC 00 00 00 00 .DB 0,0,0,0 +3721 E600 ; +3722 E600 ;************************************************************** +3723 E600 ;* +3724 E600 ;* B I O S J U M P T A B L E +3725 E600 ;* +3726 E600 ;************************************************************** +3727 E600 ; +3728 E600 C3 00 00 BOOT: JP 0 ;NOTE WE USE FAKE DESTINATIONS +3729 E603 C3 00 00 WBOOT: JP 0 +3730 E606 C3 00 00 CONST: JP 0 +3731 E609 C3 00 00 CONIN: JP 0 +3732 E60C C3 00 00 CONOUT: JP 0 +3733 E60F C3 00 00 LIST: JP 0 +3734 E612 C3 00 00 PUNCH: JP 0 +3735 E615 C3 00 00 READER: JP 0 +3736 E618 C3 00 00 HOME: JP 0 +3737 E61B C3 00 00 SELDSK: JP 0 +3738 E61E C3 00 00 SETTRK: JP 0 +3739 E621 C3 00 00 SETSEC: JP 0 +3740 E624 C3 00 00 SETDMA: JP 0 +3741 E627 C3 00 00 READ: JP 0 +3742 E62A C3 00 00 WRITE: JP 0 +3743 E62D C3 00 00 PRSTAT: JP 0 +3744 E630 C3 00 00 SECTRN: JP 0 +3745 E633 ; +3746 E633 ;* +3747 E633 ;****************** E N D O F C P / M ***************** +3748 E633 ;* +3749 E633 +3750 E633 .END +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/DOWNLOAD.LST b/Z80 CPM and bootloader (basmon)/source/DOWNLOAD.LST index 98fa498..55369a5 100644 --- a/Z80 CPM and bootloader (basmon)/source/DOWNLOAD.LST +++ b/Z80 CPM and bootloader (basmon)/source/DOWNLOAD.LST @@ -1,290 +1,301 @@ -0001 0000 ;================================================================================== -0002 0000 ; Contents of this file are copyright Grant Searle -0003 0000 ; HEX routine from Joel Owens. -0004 0000 ; -0005 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0006 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0007 0000 ; -0008 0000 ; http://searle.hostei.com/grant/index.html -0009 0000 ; -0010 0000 ; eMail: home.micros01@btinternet.com -0011 0000 ; -0012 0000 ; If the above don't work, please perform an Internet search to see if I have -0013 0000 ; updated the web page hosting service. -0014 0000 ; -0015 0000 ;================================================================================== -0016 0000 -0017 0000 TPA .EQU 100H -0018 0000 REBOOT .EQU 0H -0019 0000 BDOS .EQU 5H -0020 0000 CONIO .EQU 6 -0021 0000 CONINP .EQU 1 -0022 0000 CONOUT .EQU 2 -0023 0000 PSTRING .EQU 9 -0024 0000 MAKEF .EQU 22 -0025 0000 CLOSEF .EQU 16 -0026 0000 WRITES .EQU 21 -0027 0000 DELF .EQU 19 -0028 0000 SETUSR .EQU 32 -0029 0000 -0030 0000 CR .EQU 0DH -0031 0000 LF .EQU 0AH -0032 0000 -0033 0000 FCB .EQU 05CH -0034 0000 BUFF .EQU 080H -0035 0000 -0036 0100 .ORG TPA -0037 0100 -0038 0100 -0039 0100 3E 00 LD A,0 -0040 0102 32 6D 02 LD (buffPos),A -0041 0105 32 71 02 LD (checkSum),A -0042 0108 32 72 02 LD (byteCount),A -0043 010B 32 70 02 LD (printCount),A -0044 010E 21 80 00 LD HL,BUFF -0045 0111 22 6E 02 LD (buffPtr),HL -0046 0114 -0047 0114 -0048 0114 CD 39 02 WAITLT: CALL GETCHR -0049 0117 FE 55 CP 'U' -0050 0119 CA 2A 02 JP Z,SETUSER -0051 011C FE 3A CP ':' -0052 011E 20 F4 JR NZ,WAITLT -0053 0120 -0054 0120 -0055 0120 0E 13 LD C,DELF -0056 0122 11 5C 00 LD DE,FCB -0057 0125 CD 05 00 CALL BDOS -0058 0128 -0059 0128 0E 16 LD C,MAKEF -0060 012A 11 5C 00 LD DE,FCB -0061 012D CD 05 00 CALL BDOS -0062 0130 -0063 0130 GETHEX: -0064 0130 CD 39 02 CALL GETCHR -0065 0133 FE 3E CP '>' -0066 0135 28 61 JR Z,CLOSE -0067 0137 47 LD B,A -0068 0138 C5 PUSH BC -0069 0139 CD 39 02 CALL GETCHR -0070 013C C1 POP BC -0071 013D 4F LD C,A -0072 013E -0073 013E CD 4C 02 CALL BCTOA -0074 0141 -0075 0141 47 LD B,A -0076 0142 3A 71 02 LD A,(checkSum) -0077 0145 80 ADD A,B -0078 0146 32 71 02 LD (checkSum),A -0079 0149 3A 72 02 LD A,(byteCount) -0080 014C 3C INC A -0081 014D 32 72 02 LD (byteCount),A -0082 0150 -0083 0150 78 LD A,B -0084 0151 -0085 0151 2A 6E 02 LD HL,(buffPtr) -0086 0154 -0087 0154 77 LD (HL),A -0088 0155 23 INC HL -0089 0156 22 6E 02 LD (buffPtr),HL -0090 0159 -0091 0159 3A 6D 02 LD A,(buffPos) -0092 015C 3C INC A -0093 015D 32 6D 02 LD (buffPos),A -0094 0160 FE 80 CP 80H -0095 0162 -0096 0162 20 32 JR NZ,NOWRITE -0097 0164 -0098 0164 0E 15 LD C,WRITES -0099 0166 11 5C 00 LD DE,FCB -0100 0169 CD 05 00 CALL BDOS -0101 016C 3E 2E LD A,'.' -0102 016E CD 45 02 CALL PUTCHR -0103 0171 -0104 0171 ; New line every 8K (64 dots) -0105 0171 3A 70 02 LD A,(printCount) -0106 0174 3C INC A -0107 0175 FE 40 CP 64 -0108 0177 20 0F JR NZ,noCRLF -0109 0179 32 70 02 LD (printCount),A -0110 017C 3E 0D LD A,CR -0111 017E CD 45 02 CALL PUTCHR -0112 0181 3E 0A LD A,LF -0113 0183 CD 45 02 CALL PUTCHR -0114 0186 3E 00 LD A,0 -0115 0188 32 70 02 noCRLF: LD (printCount),A -0116 018B -0117 018B 21 80 00 LD HL,BUFF -0118 018E 22 6E 02 LD (buffPtr),HL -0119 0191 -0120 0191 3E 00 LD A,0 -0121 0193 32 6D 02 LD (buffPos),A -0122 0196 NOWRITE: -0123 0196 18 98 JR GETHEX -0124 0198 -0125 0198 -0126 0198 CLOSE: -0127 0198 -0128 0198 3A 6D 02 LD A,(buffPos) -0129 019B FE 00 CP 0 -0130 019D 28 0D JR Z,NOWRITE2 -0131 019F -0132 019F 0E 15 LD C,WRITES -0133 01A1 11 5C 00 LD DE,FCB -0134 01A4 CD 05 00 CALL BDOS -0135 01A7 3E 2E LD A,'.' -0136 01A9 CD 45 02 CALL PUTCHR -0137 01AC -0138 01AC NOWRITE2: -0139 01AC 0E 10 LD C,CLOSEF -0140 01AE 11 5C 00 LD DE,FCB -0141 01B1 CD 05 00 CALL BDOS -0142 01B4 -0143 01B4 ; Byte count (lower 8 bits) -0144 01B4 CD 39 02 CALL GETCHR -0145 01B7 47 LD B,A -0146 01B8 C5 PUSH BC -0147 01B9 CD 39 02 CALL GETCHR -0148 01BC C1 POP BC -0149 01BD 4F LD C,A -0150 01BE -0151 01BE CD 4C 02 CALL BCTOA -0152 01C1 47 LD B,A -0153 01C2 3A 72 02 LD A,(byteCount) -0154 01C5 90 SUB B -0155 01C6 FE 00 CP 0 -0156 01C8 28 1A JR Z,byteCountOK -0157 01CA -0158 01CA 3E 0D LD A,CR -0159 01CC CD 45 02 CALL PUTCHR -0160 01CF 3E 0A LD A,LF -0161 01D1 CD 45 02 CALL PUTCHR -0162 01D4 -0163 01D4 11 91 02 LD DE,countErrMess -0164 01D7 0E 09 LD C,PSTRING -0165 01D9 CD 05 00 CALL BDOS -0166 01DC -0167 01DC ; Sink remaining 2 bytes -0168 01DC CD 39 02 CALL GETCHR -0169 01DF CD 39 02 CALL GETCHR -0170 01E2 -0171 01E2 18 3C JR FINISH -0172 01E4 -0173 01E4 byteCountOK: -0174 01E4 -0175 01E4 ; Checksum -0176 01E4 CD 39 02 CALL GETCHR -0177 01E7 47 LD B,A -0178 01E8 C5 PUSH BC -0179 01E9 CD 39 02 CALL GETCHR -0180 01EC C1 POP BC -0181 01ED 4F LD C,A -0182 01EE -0183 01EE CD 4C 02 CALL BCTOA -0184 01F1 47 LD B,A -0185 01F2 3A 71 02 LD A,(checkSum) -0186 01F5 90 SUB B -0187 01F6 FE 00 CP 0 -0188 01F8 28 14 JR Z,checksumOK -0189 01FA -0190 01FA 3E 0D LD A,CR -0191 01FC CD 45 02 CALL PUTCHR -0192 01FF 3E 0A LD A,LF -0193 0201 CD 45 02 CALL PUTCHR -0194 0204 -0195 0204 11 76 02 LD DE,chkErrMess -0196 0207 0E 09 LD C,PSTRING -0197 0209 CD 05 00 CALL BDOS -0198 020C 18 12 JR FINISH -0199 020E -0200 020E checksumOK: -0201 020E 3E 0D LD A,CR -0202 0210 CD 45 02 CALL PUTCHR -0203 0213 3E 0A LD A,LF -0204 0215 CD 45 02 CALL PUTCHR -0205 0218 -0206 0218 11 73 02 LD DE,OKMess -0207 021B 0E 09 LD C,PSTRING -0208 021D CD 05 00 CALL BDOS -0209 0220 -0210 0220 -0211 0220 -0212 0220 FINISH: -0213 0220 0E 20 LD C,SETUSR -0214 0222 1E 00 LD E,0 -0215 0224 CD 05 00 CALL BDOS -0216 0227 -0217 0227 C3 00 00 JP REBOOT -0218 022A -0219 022A -0220 022A SETUSER: -0221 022A CD 39 02 CALL GETCHR -0222 022D CD 65 02 CALL HEX2VAL -0223 0230 5F LD E,A -0224 0231 0E 20 LD C,SETUSR -0225 0233 CD 05 00 CALL BDOS -0226 0236 C3 14 01 JP WAITLT -0227 0239 -0228 0239 -0229 0239 ; Get a char into A -0230 0239 ;GETCHR: LD C,CONINP -0231 0239 ; CALL BDOS -0232 0239 ; RET -0233 0239 -0234 0239 ; Wait for a char into A (no echo) -0235 0239 GETCHR: -0236 0239 1E FF LD E,$FF -0237 023B 0E 06 LD C,CONIO -0238 023D CD 05 00 CALL BDOS -0239 0240 FE 00 CP 0 -0240 0242 28 F5 JR Z,GETCHR -0241 0244 C9 RET -0242 0245 -0243 0245 ; Write A to output -0244 0245 0E 02 PUTCHR: LD C,CONOUT -0245 0247 5F LD E,A -0246 0248 CD 05 00 CALL BDOS -0247 024B C9 RET -0248 024C -0249 024C -0250 024C ;------------------------------------------------------------------------------ -0251 024C ; Convert ASCII characters in B C registers to a byte value in A -0252 024C ;------------------------------------------------------------------------------ -0253 024C 78 BCTOA LD A,B ; Move the hi order byte to A -0254 024D D6 30 SUB $30 ; Take it down from Ascii -0255 024F FE 0A CP $0A ; Are we in the 0-9 range here? -0256 0251 38 02 JR C,BCTOA1 ; If so, get the next nybble -0257 0253 D6 07 SUB $07 ; But if A-F, take it down some more -0258 0255 07 BCTOA1 RLCA ; Rotate the nybble from low to high -0259 0256 07 RLCA ; One bit at a time -0260 0257 07 RLCA ; Until we -0261 0258 07 RLCA ; Get there with it -0262 0259 47 LD B,A ; Save the converted high nybble -0263 025A 79 LD A,C ; Now get the low order byte -0264 025B D6 30 SUB $30 ; Convert it down from Ascii -0265 025D FE 0A CP $0A ; 0-9 at this point? -0266 025F 38 02 JR C,BCTOA2 ; Good enough then, but -0267 0261 D6 07 SUB $07 ; Take off 7 more if it's A-F -0268 0263 80 BCTOA2 ADD A,B ; Add in the high order nybble -0269 0264 C9 RET -0270 0265 -0271 0265 ; Change Hex in A to actual value in A -0272 0265 D6 30 HEX2VAL SUB $30 -0273 0267 FE 0A CP $0A -0274 0269 D8 RET C -0275 026A D6 07 SUB $07 -0276 026C C9 RET -0277 026D -0278 026D -0279 026D 00 buffPos .DB 0H -0280 026E 00 00 buffPtr .DW 0000H -0281 0270 00 printCount .DB 0H -0282 0271 00 checkSum .DB 0H -0283 0272 00 byteCount .DB 0H -0284 0273 4F 4B 24 OKMess .BYTE "OK$" -0285 0276 3D3D3D3D3D3DchkErrMess .BYTE "======Checksum Error======$" -0285 027C 436865636B73756D204572726F723D3D3D3D3D3D24 -0286 0291 3D3D3D3D3D3DcountErrMess .BYTE "======File Length Error======$" -0286 0297 46696C65204C656E677468204572726F723D3D3D3D3D3D24 -0287 02AF .END -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; Contents of this file are copyright Grant Searle +0003 0000 ; HEX routine from Joel Owens. +0004 0000 ; +0005 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0006 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0007 0000 ; +0008 0000 ; http://searle.hostei.com/grant/index.html +0009 0000 ; +0010 0000 ; eMail: home.micros01@btinternet.com +0011 0000 ; +0012 0000 ; If the above don't work, please perform an Internet search to see if I have +0013 0000 ; updated the web page hosting service. +0014 0000 ; +0015 0000 ;================================================================================== +0016 0000 +0017 0000 TPA .EQU 100H +0018 0000 REBOOT .EQU 0H +0019 0000 BDOS .EQU 5H +0020 0000 CONIO .EQU 6 +0021 0000 CONINP .EQU 1 +0022 0000 CONOUT .EQU 2 +0023 0000 PSTRING .EQU 9 +0024 0000 MAKEF .EQU 22 +0025 0000 CLOSEF .EQU 16 +0026 0000 WRITES .EQU 21 +0027 0000 DELF .EQU 19 +0028 0000 SETUSR .EQU 32 +0029 0000 +0030 0000 CR .EQU 0DH +0031 0000 LF .EQU 0AH +0032 0000 +0033 0000 FCB .EQU 05CH +0034 0000 BUFF .EQU 080H +0035 0000 +0036 0100 .ORG TPA +0037 0100 +0038 0100 +0039 0100 3E 00 LD A,0 +0040 0102 32 6D 02 LD (buffPos),A +0041 0105 32 71 02 LD (checkSum),A +0042 0108 32 72 02 LD (byteCount),A +0043 010B 32 70 02 LD (printCount),A +0044 010E 21 80 00 LD HL,BUFF +0045 0111 22 6E 02 LD (buffPtr),HL +0046 0114 +0047 0114 +0048 0114 CD 39 02 WAITLT: CALL GETCHR +0049 0117 FE 55 CP 'U' +0050 0119 CA 2A 02 JP Z,SETUSER +0051 011C FE 3A CP ':' +0052 011E 20 F4 JR NZ,WAITLT +0053 0120 +0054 0120 +0055 0120 0E 13 LD C,DELF +0056 0122 11 5C 00 LD DE,FCB +0057 0125 CD 05 00 CALL BDOS +0058 0128 +0059 0128 0E 16 LD C,MAKEF +0060 012A 11 5C 00 LD DE,FCB +0061 012D CD 05 00 CALL BDOS +0062 0130 +0063 0130 GETHEX: +0064 0130 CD 39 02 CALL GETCHR +0065 0133 FE 3E CP '>' +0066 0135 28 61 JR Z,CLOSE +0067 0137 47 LD B,A +0068 0138 C5 PUSH BC +0069 0139 CD 39 02 CALL GETCHR +0070 013C C1 POP BC +0071 013D 4F LD C,A +0072 013E +0073 013E CD 4C 02 CALL BCTOA +0074 0141 +0075 0141 47 LD B,A +0076 0142 3A 71 02 LD A,(checkSum) +0077 0145 80 ADD A,B +0078 0146 32 71 02 LD (checkSum),A +0079 0149 3A 72 02 LD A,(byteCount) +0080 014C 3C INC A +0081 014D 32 72 02 LD (byteCount),A +0082 0150 +0083 0150 78 LD A,B +0084 0151 +0085 0151 2A 6E 02 LD HL,(buffPtr) +0086 0154 +0087 0154 77 LD (HL),A +0088 0155 23 INC HL +0089 0156 22 6E 02 LD (buffPtr),HL +0090 0159 +0091 0159 3A 6D 02 LD A,(buffPos) +0092 015C 3C INC A +0093 015D 32 6D 02 LD (buffPos),A +0094 0160 FE 80 CP 80H +0095 0162 +0096 0162 20 32 JR NZ,NOWRITE +0097 0164 +0098 0164 0E 15 LD C,WRITES +0099 0166 11 5C 00 LD DE,FCB +0100 0169 CD 05 00 CALL BDOS +0101 016C 3E 2E LD A,'.' +0102 016E CD 45 02 CALL PUTCHR +0103 0171 +0104 0171 ; New line every 8K (64 dots) +0105 0171 3A 70 02 LD A,(printCount) +0106 0174 3C INC A +0107 0175 FE 40 CP 64 +0108 0177 20 0F JR NZ,noCRLF +0109 0179 32 70 02 LD (printCount),A +0110 017C 3E 0D LD A,CR +0111 017E CD 45 02 CALL PUTCHR +0112 0181 3E 0A LD A,LF +0113 0183 CD 45 02 CALL PUTCHR +0114 0186 3E 00 LD A,0 +0115 0188 32 70 02 noCRLF: LD (printCount),A +0116 018B +0117 018B 21 80 00 LD HL,BUFF +0118 018E 22 6E 02 LD (buffPtr),HL +0119 0191 +0120 0191 3E 00 LD A,0 +0121 0193 32 6D 02 LD (buffPos),A +0122 0196 NOWRITE: +0123 0196 18 98 JR GETHEX +0124 0198 +0125 0198 +0126 0198 CLOSE: +0127 0198 +0128 0198 3A 6D 02 LD A,(buffPos) +0129 019B FE 00 CP 0 +0130 019D 28 0D JR Z,NOWRITE2 +0131 019F +0132 019F 0E 15 LD C,WRITES +0133 01A1 11 5C 00 LD DE,FCB +0134 01A4 CD 05 00 CALL BDOS +0135 01A7 3E 2E LD A,'.' +0136 01A9 CD 45 02 CALL PUTCHR +0137 01AC +0138 01AC NOWRITE2: +0139 01AC 0E 10 LD C,CLOSEF +0140 01AE 11 5C 00 LD DE,FCB +0141 01B1 CD 05 00 CALL BDOS +0142 01B4 +0143 01B4 ; Byte count (lower 8 bits) +0144 01B4 CD 39 02 CALL GETCHR +0145 01B7 47 LD B,A +0146 01B8 C5 PUSH BC +0147 01B9 CD 39 02 CALL GETCHR +0148 01BC C1 POP BC +0149 01BD 4F LD C,A +0150 01BE +0151 01BE CD 4C 02 CALL BCTOA +0152 01C1 47 LD B,A +0153 01C2 3A 72 02 LD A,(byteCount) +0154 01C5 90 SUB B +0155 01C6 FE 00 CP 0 +0156 01C8 28 1A JR Z,byteCountOK +0157 01CA +0158 01CA 3E 0D LD A,CR +0159 01CC CD 45 02 CALL PUTCHR +0160 01CF 3E 0A LD A,LF +0161 01D1 CD 45 02 CALL PUTCHR +0162 01D4 +0163 01D4 11 91 02 LD DE,countErrMess +0164 01D7 0E 09 LD C,PSTRING +0165 01D9 CD 05 00 CALL BDOS +0166 01DC +0167 01DC ; Sink remaining 2 bytes +0168 01DC CD 39 02 CALL GETCHR +0169 01DF CD 39 02 CALL GETCHR +0170 01E2 +0171 01E2 18 3C JR FINISH +0172 01E4 +0173 01E4 byteCountOK: +0174 01E4 +0175 01E4 ; Checksum +0176 01E4 CD 39 02 CALL GETCHR +0177 01E7 47 LD B,A +0178 01E8 C5 PUSH BC +0179 01E9 CD 39 02 CALL GETCHR +0180 01EC C1 POP BC +0181 01ED 4F LD C,A +0182 01EE +0183 01EE CD 4C 02 CALL BCTOA +0184 01F1 47 LD B,A +0185 01F2 3A 71 02 LD A,(checkSum) +0186 01F5 90 SUB B +0187 01F6 FE 00 CP 0 +0188 01F8 28 14 JR Z,checksumOK +0189 01FA +0190 01FA 3E 0D LD A,CR +0191 01FC CD 45 02 CALL PUTCHR +0192 01FF 3E 0A LD A,LF +0193 0201 CD 45 02 CALL PUTCHR +0194 0204 +0195 0204 11 76 02 LD DE,chkErrMess +0196 0207 0E 09 LD C,PSTRING +0197 0209 CD 05 00 CALL BDOS +0198 020C 18 12 JR FINISH +0199 020E +0200 020E checksumOK: +0201 020E 3E 0D LD A,CR +0202 0210 CD 45 02 CALL PUTCHR +0203 0213 3E 0A LD A,LF +0204 0215 CD 45 02 CALL PUTCHR +0205 0218 +0206 0218 11 73 02 LD DE,OKMess +0207 021B 0E 09 LD C,PSTRING +0208 021D CD 05 00 CALL BDOS +0209 0220 +0210 0220 +0211 0220 +0212 0220 FINISH: +0213 0220 0E 20 LD C,SETUSR +0214 0222 1E 00 LD E,0 +0215 0224 CD 05 00 CALL BDOS +0216 0227 +0217 0227 C3 00 00 JP REBOOT +0218 022A +0219 022A +0220 022A SETUSER: +0221 022A CD 39 02 CALL GETCHR +0222 022D CD 65 02 CALL HEX2VAL +0223 0230 5F LD E,A +0224 0231 0E 20 LD C,SETUSR +0225 0233 CD 05 00 CALL BDOS +0226 0236 C3 14 01 JP WAITLT +0227 0239 +0228 0239 +0229 0239 ; Get a char into A +0230 0239 ;GETCHR: LD C,CONINP +0231 0239 ; CALL BDOS +0232 0239 ; RET +0233 0239 +0234 0239 ; Wait for a char into A (no echo) +0235 0239 GETCHR: +0236 0239 1E FF LD E,$FF +0237 023B 0E 06 LD C,CONIO +0238 023D CD 05 00 CALL BDOS +0239 0240 FE 00 CP 0 +0240 0242 28 F5 JR Z,GETCHR +0241 0244 C9 RET +0242 0245 +0243 0245 ; Write A to output +0244 0245 0E 02 PUTCHR: LD C,CONOUT +0245 0247 5F LD E,A +0246 0248 CD 05 00 CALL BDOS +0247 024B C9 RET +0248 024C +0249 024C +0250 024C ;------------------------------------------------------------------------------ +0251 024C ; Convert ASCII characters in B C registers to a byte value in A +0252 024C ;------------------------------------------------------------------------------ +0253 024C 78 BCTOA LD A,B ; Move the hi order byte to A +0254 024D D6 30 SUB $30 ; Take it down from Ascii +0255 024F FE 0A CP $0A ; Are we in the 0-9 range here? +0256 0251 38 02 JR C,BCTOA1 ; If so, get the next nybble +0257 0253 D6 07 SUB $07 ; But if A-F, take it down some more +0258 0255 07 BCTOA1 RLCA ; Rotate the nybble from low to high +0259 0256 07 RLCA ; One bit at a time +0260 0257 07 RLCA ; Until we +0261 0258 07 RLCA ; Get there with it +0262 0259 47 LD B,A ; Save the converted high nybble +0263 025A 79 LD A,C ; Now get the low order byte +0264 025B D6 30 SUB $30 ; Convert it down from Ascii +0265 025D FE 0A CP $0A ; 0-9 at this point? +0266 025F 38 02 JR C,BCTOA2 ; Good enough then, but +0267 0261 D6 07 SUB $07 ; Take off 7 more if it's A-F +0268 0263 80 BCTOA2 ADD A,B ; Add in the high order nybble +0269 0264 C9 RET +0270 0265 +0271 0265 ; Change Hex in A to actual value in A +0272 0265 D6 30 HEX2VAL SUB $30 +0273 0267 FE 0A CP $0A +0274 0269 D8 RET C +0275 026A D6 07 SUB $07 +0276 026C C9 RET +0277 026D +0278 026D +0279 026D 00 buffPos .DB 0H +0280 026E 00 00 buffPtr .DW 0000H +0281 0270 00 printCount .DB 0H +0282 0271 00 checkSum .DB 0H +0283 0272 00 byteCount .DB 0H +0284 0273 4F 4B 24 OKMess .BYTE "OK$" +0285 0276 3D 3D 3D 3D chkErrMess .BYTE "======Checksum Error======$" +0285 027A 3D 3D 43 68 +0285 027E 65 63 6B 73 +0285 0282 75 6D 20 45 +0285 0286 72 72 6F 72 +0285 028A 3D 3D 3D 3D +0285 028E 3D 3D 24 +0286 0291 3D 3D 3D 3D countErrMess .BYTE "======File Length Error======$" +0286 0295 3D 3D 46 69 +0286 0299 6C 65 20 4C +0286 029D 65 6E 67 74 +0286 02A1 68 20 45 72 +0286 02A5 72 6F 72 3D +0286 02A9 3D 3D 3D 3D +0286 02AD 3D 24 +0287 02AF .END +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/FORM128.LST b/Z80 CPM and bootloader (basmon)/source/FORM128.LST index 6e1d005..69d614e 100644 --- a/Z80 CPM and bootloader (basmon)/source/FORM128.LST +++ b/Z80 CPM and bootloader (basmon)/source/FORM128.LST @@ -1,230 +1,256 @@ -0001 0000 ;================================================================================== -0002 0000 ; Contents of this file are copyright Grant Searle -0003 0000 ; -0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0006 0000 ; -0007 0000 ; http://searle.hostei.com/grant/index.html -0008 0000 ; -0009 0000 ; eMail: home.micros01@btinternet.com -0010 0000 ; -0011 0000 ; If the above don't work, please perform an Internet search to see if I have -0012 0000 ; updated the web page hosting service. -0013 0000 ; -0014 0000 ;================================================================================== -0015 0000 -0016 0000 numDrives .EQU 15 ; Not including A: -0017 0000 -0018 0000 -0019 0000 SD_DATA .EQU 088H -0020 0000 SD_CONTROL .EQU 089H -0021 0000 SD_STATUS .EQU 089H -0022 0000 SD_LBA0 .EQU 08AH -0023 0000 SD_LBA1 .EQU 08BH -0024 0000 SD_LBA2 .EQU 08CH -0025 0000 -0026 0000 LF .EQU 0AH ;line feed -0027 0000 FF .EQU 0CH ;form feed -0028 0000 CR .EQU 0DH ;carriage RETurn -0029 0000 -0030 0000 ;==================================================================================== -0031 0000 -0032 5000 .ORG 5000H ; Format program origin. -0033 5000 -0034 5000 -0035 5000 CD D5 50 CALL printInline -0036 5003 43502F4D2046 .TEXT "CP/M Formatter 2.0 by G. Searle 2013" -0036 5009 6F726D617474657220322E3020627920472E20536561726C652032303133 -0037 5027 0D 0A 00 .DB CR,LF,0 -0038 502A -0039 502A 3E 41 LD A,'A' -0040 502C 32 E7 50 LD (drvName),A -0041 502F -0042 502F ; There are 512 directory entries per disk, 4 DIR entries per sector -0043 502F ; So 128 x 128 byte sectors are to be initialised -0044 502F ; The drive uses 512 byte sectors, so 32 x 512 byte sectors per disk -0045 502F ; require initialisation -0046 502F -0047 502F ;Drive 0 (A:) is slightly different due to reserved track, so DIR sector starts at 32 -0048 502F 3A E7 50 LD A,(drvName) -0049 5032 CF RST 08H ; Print drive letter -0050 5033 3C INC A -0051 5034 32 E7 50 LD (drvName),A -0052 5037 -0053 5037 3E 20 LD A,$20 -0054 5039 32 E6 50 LD (secNo),A -0055 503C -0056 503C processSectorA: -0057 503C -0058 503C 3A E6 50 LD A,(secNo) -0059 503F D3 8A OUT (SD_LBA0),A -0060 5041 3E 00 LD A,0 -0061 5043 D3 8B OUT (SD_LBA1),A -0062 5045 3E 00 LD A,0 -0063 5047 D3 8C OUT (SD_LBA2),A -0064 5049 3E E0 LD a,$E0 -0065 504B -0066 504B CD A7 50 call writehst -0067 504E -0068 504E 3A E6 50 LD A,(secNo) -0069 5051 3C INC A -0070 5052 32 E6 50 LD (secNo),A -0071 5055 FE 40 CP $40 -0072 5057 20 E3 JR NZ, processSectorA -0073 5059 -0074 5059 -0075 5059 -0076 5059 ;Drive 1 onwards (B: etc) don't have reserved tracks, so sector starts at 0 -0077 5059 -0078 5059 11 40 00 LD DE,$0040 ; HL increment -0079 505C 21 40 00 LD HL,$0040 ; H = LBA2, L=LBA1, initialise for drive 1 (B:) -0080 505F -0081 505F 06 0F LD B,numDrives -0082 5061 -0083 5061 processDirs: -0084 5061 -0085 5061 3A E7 50 LD A,(drvName) -0086 5064 CF RST 08H ; Print drive letter -0087 5065 3C INC A -0088 5066 32 E7 50 LD (drvName),A -0089 5069 -0090 5069 3E 00 LD A,0 -0091 506B 32 E6 50 LD (secNo),A -0092 506E -0093 506E processSector: -0094 506E 3A E6 50 LD A,(secNo) -0095 5071 D3 8A OUT (SD_LBA0),A -0096 5073 7D LD A,L -0097 5074 D3 8B OUT (SD_LBA1),A -0098 5076 7C LD A,H -0099 5077 D3 8C OUT (SD_LBA2),A -0100 5079 -0101 5079 CD A7 50 call writehst -0102 507C -0103 507C 3A E6 50 LD A,(secNo) -0104 507F 3C INC A -0105 5080 32 E6 50 LD (secNo),A -0106 5083 FE 20 CP $20 -0107 5085 20 E7 JR NZ, processSector -0108 5087 -0109 5087 19 ADD HL,DE -0110 5088 -0111 5088 05 DEC B -0112 5089 20 D6 JR NZ,processDirs -0113 508B -0114 508B CD D5 50 CALL printInline -0115 508E 0D 0A .DB CR,LF -0116 5090 466F726D6174 .TEXT "Formatting complete" -0116 5096 74696E6720636F6D706C657465 -0117 50A3 0D 0A 00 .DB CR,LF,0 -0118 50A6 -0119 50A6 C9 RET -0120 50A7 -0121 50A7 ;================================================================================================ -0122 50A7 ; Write physical sector to host -0123 50A7 ;================================================================================================ -0124 50A7 -0125 50A7 writehst: -0126 50A7 F5 PUSH AF -0127 50A8 C5 PUSH BC -0128 50A9 E5 PUSH HL -0129 50AA -0130 50AA DB 89 wrWait1: IN A,(SD_STATUS) -0131 50AC FE 80 CP 128 -0132 50AE 20 FA JR NZ,wrWait1 -0133 50B0 -0134 50B0 ;CALL setLBAaddr -0135 50B0 -0136 50B0 3E 01 LD A,$01 ; 01 = Write block -0137 50B2 D3 89 OUT (SD_CONTROL),A -0138 50B4 -0139 50B4 0E 04 LD c,4 -0140 50B6 wr4secs: -0141 50B6 21 E8 50 LD HL,dirData -0142 50B9 06 80 LD b,128 -0143 50BB wrByte: -0144 50BB DB 89 wrWait2: IN A,(SD_STATUS) -0145 50BD FE A0 CP 160 ; Write buffer empty -0146 50BF 20 FA JR NZ,wrWait2 -0147 50C1 -0148 50C1 ;LD A,'.' -0149 50C1 ;RST 08H -0150 50C1 -0151 50C1 ; UPDATE S0urceror, inserted wait cycle between IN and OUT -0152 50C1 ; to resolve unknown write issue in sd_controller.vhd in combination -0153 50C1 ; with MISTer virtual SD interface sys/sd_card.sv -0154 50C1 ; which results in hangs or write errors. -0155 50C1 C5 push bc -0156 50C2 06 32 ld b,50 -0157 50C4 _again: -0158 50C4 10 FE djnz _again -0159 50C6 C1 pop bc -0160 50C7 ; END UPDATE -0161 50C7 -0162 50C7 7E LD A,(HL) -0163 50C8 D3 88 OUT (SD_DATA),A -0164 50CA -0165 50CA 23 INC HL -0166 50CB 05 dec b -0167 50CC 20 ED JR NZ, wrByte -0168 50CE -0169 50CE 0D dec c -0170 50CF 20 E5 JR NZ,wr4secs -0171 50D1 -0172 50D1 E1 POP HL -0173 50D2 C1 POP BC -0174 50D3 F1 POP AF -0175 50D4 -0176 50D4 ;XOR a -0177 50D4 ;ld (erflag),a -0178 50D4 C9 RET -0179 50D5 -0180 50D5 ;================================================================================================ -0181 50D5 ; Utilities -0182 50D5 ;================================================================================================ -0183 50D5 -0184 50D5 printInline: -0185 50D5 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL -0186 50D6 F5 PUSH AF -0187 50D7 C5 PUSH BC -0188 50D8 7E nextILChar: LD A,(HL) -0189 50D9 FE 00 CP 0 -0190 50DB 28 04 JR Z,endOfPrint -0191 50DD CF RST 08H -0192 50DE 23 INC HL -0193 50DF 18 F7 JR nextILChar -0194 50E1 23 endOfPrint: INC HL ; Get past "null" terminator -0195 50E2 C1 POP BC -0196 50E3 F1 POP AF -0197 50E4 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL -0198 50E5 C9 RET -0199 50E6 -0200 50E6 -0201 50E6 00 secNo .db 0 -0202 50E7 00 drvName .db 0 -0203 50E8 -0204 50E8 -0205 50E8 ; Directory data for 1 x 128 byte sector -0206 50E8 dirData: -0207 50E8 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 -0207 50EE 20202020202000000000 -0208 50F8 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -0208 50FE 00000000000000000000 -0209 5108 -0210 5108 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 -0210 510E 20202020202000000000 -0211 5118 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -0211 511E 00000000000000000000 -0212 5128 -0213 5128 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 -0213 512E 20202020202000000000 -0214 5138 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -0214 513E 00000000000000000000 -0215 5148 -0216 5148 E52020202020 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 -0216 514E 20202020202000000000 -0217 5158 000000000000 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 -0217 515E 00000000000000000000 -0218 5168 -0219 5168 .END -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; Contents of this file are copyright Grant Searle +0003 0000 ; +0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0006 0000 ; +0007 0000 ; http://searle.hostei.com/grant/index.html +0008 0000 ; +0009 0000 ; eMail: home.micros01@btinternet.com +0010 0000 ; +0011 0000 ; If the above don't work, please perform an Internet search to see if I have +0012 0000 ; updated the web page hosting service. +0013 0000 ; +0014 0000 ;================================================================================== +0015 0000 +0016 0000 numDrives .EQU 15 ; Not including A: +0017 0000 +0018 0000 +0019 0000 SD_DATA .EQU 088H +0020 0000 SD_CONTROL .EQU 089H +0021 0000 SD_STATUS .EQU 089H +0022 0000 SD_LBA0 .EQU 08AH +0023 0000 SD_LBA1 .EQU 08BH +0024 0000 SD_LBA2 .EQU 08CH +0025 0000 +0026 0000 LF .EQU 0AH ;line feed +0027 0000 FF .EQU 0CH ;form feed +0028 0000 CR .EQU 0DH ;carriage RETurn +0029 0000 +0030 0000 ;==================================================================================== +0031 0000 +0032 5000 .ORG 5000H ; Format program origin. +0033 5000 +0034 5000 +0035 5000 CD D5 50 CALL printInline +0036 5003 43 50 2F 4D .TEXT "CP/M Formatter 2.0 by G. Searle 2013" +0036 5007 20 46 6F 72 +0036 500B 6D 61 74 74 +0036 500F 65 72 20 32 +0036 5013 2E 30 20 62 +0036 5017 79 20 47 2E +0036 501B 20 53 65 61 +0036 501F 72 6C 65 20 +0036 5023 32 30 31 33 +0037 5027 0D 0A 00 .DB CR,LF,0 +0038 502A +0039 502A 3E 41 LD A,'A' +0040 502C 32 E7 50 LD (drvName),A +0041 502F +0042 502F ; There are 512 directory entries per disk, 4 DIR entries per sector +0043 502F ; So 128 x 128 byte sectors are to be initialised +0044 502F ; The drive uses 512 byte sectors, so 32 x 512 byte sectors per disk +0045 502F ; require initialisation +0046 502F +0047 502F ;Drive 0 (A:) is slightly different due to reserved track, so DIR sector starts at 32 +0048 502F 3A E7 50 LD A,(drvName) +0049 5032 CF RST 08H ; Print drive letter +0050 5033 3C INC A +0051 5034 32 E7 50 LD (drvName),A +0052 5037 +0053 5037 3E 20 LD A,$20 +0054 5039 32 E6 50 LD (secNo),A +0055 503C +0056 503C processSectorA: +0057 503C +0058 503C 3A E6 50 LD A,(secNo) +0059 503F D3 8A OUT (SD_LBA0),A +0060 5041 3E 00 LD A,0 +0061 5043 D3 8B OUT (SD_LBA1),A +0062 5045 3E 00 LD A,0 +0063 5047 D3 8C OUT (SD_LBA2),A +0064 5049 3E E0 LD a,$E0 +0065 504B +0066 504B CD A7 50 call writehst +0067 504E +0068 504E 3A E6 50 LD A,(secNo) +0069 5051 3C INC A +0070 5052 32 E6 50 LD (secNo),A +0071 5055 FE 40 CP $40 +0072 5057 20 E3 JR NZ, processSectorA +0073 5059 +0074 5059 +0075 5059 +0076 5059 ;Drive 1 onwards (B: etc) don't have reserved tracks, so sector starts at 0 +0077 5059 +0078 5059 11 40 00 LD DE,$0040 ; HL increment +0079 505C 21 40 00 LD HL,$0040 ; H = LBA2, L=LBA1, initialise for drive 1 (B:) +0080 505F +0081 505F 06 0F LD B,numDrives +0082 5061 +0083 5061 processDirs: +0084 5061 +0085 5061 3A E7 50 LD A,(drvName) +0086 5064 CF RST 08H ; Print drive letter +0087 5065 3C INC A +0088 5066 32 E7 50 LD (drvName),A +0089 5069 +0090 5069 3E 00 LD A,0 +0091 506B 32 E6 50 LD (secNo),A +0092 506E +0093 506E processSector: +0094 506E 3A E6 50 LD A,(secNo) +0095 5071 D3 8A OUT (SD_LBA0),A +0096 5073 7D LD A,L +0097 5074 D3 8B OUT (SD_LBA1),A +0098 5076 7C LD A,H +0099 5077 D3 8C OUT (SD_LBA2),A +0100 5079 +0101 5079 CD A7 50 call writehst +0102 507C +0103 507C 3A E6 50 LD A,(secNo) +0104 507F 3C INC A +0105 5080 32 E6 50 LD (secNo),A +0106 5083 FE 20 CP $20 +0107 5085 20 E7 JR NZ, processSector +0108 5087 +0109 5087 19 ADD HL,DE +0110 5088 +0111 5088 05 DEC B +0112 5089 20 D6 JR NZ,processDirs +0113 508B +0114 508B CD D5 50 CALL printInline +0115 508E 0D 0A .DB CR,LF +0116 5090 46 6F 72 6D .TEXT "Formatting complete" +0116 5094 61 74 74 69 +0116 5098 6E 67 20 63 +0116 509C 6F 6D 70 6C +0116 50A0 65 74 65 +0117 50A3 0D 0A 00 .DB CR,LF,0 +0118 50A6 +0119 50A6 C9 RET +0120 50A7 +0121 50A7 ;================================================================================================ +0122 50A7 ; Write physical sector to host +0123 50A7 ;================================================================================================ +0124 50A7 +0125 50A7 writehst: +0126 50A7 F5 PUSH AF +0127 50A8 C5 PUSH BC +0128 50A9 E5 PUSH HL +0129 50AA +0130 50AA DB 89 wrWait1: IN A,(SD_STATUS) +0131 50AC FE 80 CP 128 +0132 50AE 20 FA JR NZ,wrWait1 +0133 50B0 +0134 50B0 ;CALL setLBAaddr +0135 50B0 +0136 50B0 3E 01 LD A,$01 ; 01 = Write block +0137 50B2 D3 89 OUT (SD_CONTROL),A +0138 50B4 +0139 50B4 0E 04 LD c,4 +0140 50B6 wr4secs: +0141 50B6 21 E8 50 LD HL,dirData +0142 50B9 06 80 LD b,128 +0143 50BB wrByte: +0144 50BB DB 89 wrWait2: IN A,(SD_STATUS) +0145 50BD FE A0 CP 160 ; Write buffer empty +0146 50BF 20 FA JR NZ,wrWait2 +0147 50C1 +0148 50C1 ;LD A,'.' +0149 50C1 ;RST 08H +0150 50C1 +0151 50C1 ; UPDATE S0urceror, inserted wait cycle between IN and OUT +0152 50C1 ; to resolve unknown write issue in sd_controller.vhd in combination +0153 50C1 ; with MISTer virtual SD interface sys/sd_card.sv +0154 50C1 ; which results in hangs or write errors. +0155 50C1 C5 push bc +0156 50C2 06 32 ld b,50 +0157 50C4 _again: +0158 50C4 10 FE djnz _again +0159 50C6 C1 pop bc +0160 50C7 ; END UPDATE +0161 50C7 +0162 50C7 7E LD A,(HL) +0163 50C8 D3 88 OUT (SD_DATA),A +0164 50CA +0165 50CA 23 INC HL +0166 50CB 05 dec b +0167 50CC 20 ED JR NZ, wrByte +0168 50CE +0169 50CE 0D dec c +0170 50CF 20 E5 JR NZ,wr4secs +0171 50D1 +0172 50D1 E1 POP HL +0173 50D2 C1 POP BC +0174 50D3 F1 POP AF +0175 50D4 +0176 50D4 ;XOR a +0177 50D4 ;ld (erflag),a +0178 50D4 C9 RET +0179 50D5 +0180 50D5 ;================================================================================================ +0181 50D5 ; Utilities +0182 50D5 ;================================================================================================ +0183 50D5 +0184 50D5 printInline: +0185 50D5 E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL +0186 50D6 F5 PUSH AF +0187 50D7 C5 PUSH BC +0188 50D8 7E nextILChar: LD A,(HL) +0189 50D9 FE 00 CP 0 +0190 50DB 28 04 JR Z,endOfPrint +0191 50DD CF RST 08H +0192 50DE 23 INC HL +0193 50DF 18 F7 JR nextILChar +0194 50E1 23 endOfPrint: INC HL ; Get past "null" terminator +0195 50E2 C1 POP BC +0196 50E3 F1 POP AF +0197 50E4 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL +0198 50E5 C9 RET +0199 50E6 +0200 50E6 +0201 50E6 00 secNo .db 0 +0202 50E7 00 drvName .db 0 +0203 50E8 +0204 50E8 +0205 50E8 ; Directory data for 1 x 128 byte sector +0206 50E8 dirData: +0207 50E8 E5 20 20 20 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 +0207 50EC 20 20 20 20 +0207 50F0 20 20 20 20 +0207 50F4 00 00 00 00 +0208 50F8 00 00 00 00 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +0208 50FC 00 00 00 00 +0208 5100 00 00 00 00 +0208 5104 00 00 00 00 +0209 5108 +0210 5108 E5 20 20 20 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 +0210 510C 20 20 20 20 +0210 5110 20 20 20 20 +0210 5114 00 00 00 00 +0211 5118 00 00 00 00 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +0211 511C 00 00 00 00 +0211 5120 00 00 00 00 +0211 5124 00 00 00 00 +0212 5128 +0213 5128 E5 20 20 20 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 +0213 512C 20 20 20 20 +0213 5130 20 20 20 20 +0213 5134 00 00 00 00 +0214 5138 00 00 00 00 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +0214 513C 00 00 00 00 +0214 5140 00 00 00 00 +0214 5144 00 00 00 00 +0215 5148 +0216 5148 E5 20 20 20 .DB $E5,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$20,$00,$00,$00,$00 +0216 514C 20 20 20 20 +0216 5150 20 20 20 20 +0216 5154 00 00 00 00 +0217 5158 00 00 00 00 .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 +0217 515C 00 00 00 00 +0217 5160 00 00 00 00 +0217 5164 00 00 00 00 +0218 5168 +0219 5168 .END +0220 5168 tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/PUTSYS.LST b/Z80 CPM and bootloader (basmon)/source/PUTSYS.LST index 8f755bc..3db955d 100644 --- a/Z80 CPM and bootloader (basmon)/source/PUTSYS.LST +++ b/Z80 CPM and bootloader (basmon)/source/PUTSYS.LST @@ -1,166 +1,179 @@ -0001 0000 ;================================================================================== -0002 0000 ; Contents of this file are copyright Grant Searle -0003 0000 ; -0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY -0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. -0006 0000 ; -0007 0000 ; http://searle.hostei.com/grant/index.html -0008 0000 ; -0009 0000 ; eMail: home.micros01@btinternet.com -0010 0000 ; -0011 0000 ; If the above don't work, please perform an Internet search to see if I have -0012 0000 ; updated the web page hosting service. -0013 0000 ; -0014 0000 ;================================================================================== -0015 0000 -0016 0000 loadAddr .EQU 0D000h -0017 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded -0018 0000 -0019 0000 SD_DATA .EQU 088H -0020 0000 SD_CONTROL .EQU 089H -0021 0000 SD_STATUS .EQU 089H -0022 0000 SD_LBA0 .EQU 08AH -0023 0000 SD_LBA1 .EQU 08BH -0024 0000 SD_LBA2 .EQU 08CH -0025 0000 -0026 0000 LF .EQU 0AH ;line feed -0027 0000 FF .EQU 0CH ;form feed -0028 0000 CR .EQU 0DH ;carriage RETurn -0029 0000 -0030 0000 ;================================================================================================ -0031 0000 -0032 5000 .ORG 5000H ; Loader origin. -0033 5000 -0034 5000 CD BA 50 CALL printInline -0035 5003 43502F4D2053 .TEXT "CP/M System Transfer by G. Searle 2012-13" -0035 5009 797374656D205472616E7366657220627920472E20536561726C6520323031322D3133 -0036 502C 0D 0A 00 .DB CR,LF,0 -0037 502F -0038 502F 06 18 LD B,numSecs -0039 5031 -0040 5031 3E 00 LD A,0 -0041 5033 32 CB 50 LD (lba0),A -0042 5036 32 CC 50 ld (lba1),A -0043 5039 32 CD 50 ld (lba2),A -0044 503C 32 CE 50 ld (lba3),A -0045 503F 21 00 D0 LD HL,loadAddr -0046 5042 22 CF 50 LD (dmaAddr),HL -0047 5045 processSectors: -0048 5045 -0049 5045 CD 8C 50 call writehst -0050 5048 -0051 5048 11 00 02 LD DE,0200H -0052 504B 2A CF 50 LD HL,(dmaAddr) -0053 504E 19 ADD HL,DE -0054 504F 22 CF 50 LD (dmaAddr),HL -0055 5052 3A CB 50 LD A,(lba0) -0056 5055 3C INC A -0057 5056 32 CB 50 LD (lba0),A -0058 5059 -0059 5059 10 EA djnz processSectors -0060 505B -0061 505B CD BA 50 CALL printInline -0062 505E 0D 0A .DB CR,LF -0063 5060 53797374656D .TEXT "System transfer complete" -0063 5066 207472616E7366657220636F6D706C657465 -0064 5078 0D 0A 00 .DB CR,LF,0 -0065 507B -0066 507B C9 RET -0067 507C -0068 507C ; ========================================================================= -0069 507C ; Disk routines as used in CBIOS -0070 507C ; ========================================================================= -0071 507C setLBAaddr: -0072 507C 3A CD 50 LD A,(lba2) -0073 507F D3 8C OUT (SD_LBA2),A -0074 5081 3A CC 50 LD A,(lba1) -0075 5084 D3 8B OUT (SD_LBA1),A -0076 5086 3A CB 50 LD A,(lba0) -0077 5089 D3 8A OUT (SD_LBA0),A -0078 508B C9 ret -0079 508C -0080 508C ;================================================================================================ -0081 508C ; Write physical sector to host -0082 508C ;================================================================================================ -0083 508C -0084 508C writehst: -0085 508C F5 PUSH AF -0086 508D C5 PUSH BC -0087 508E E5 PUSH HL -0088 508F -0089 508F DB 89 wrWait1: IN A,(SD_STATUS) -0090 5091 FE 80 CP 128 -0091 5093 20 FA JR NZ,wrWait1 -0092 5095 -0093 5095 CD 7C 50 CALL setLBAaddr -0094 5098 -0095 5098 3E 01 LD A,$01 ; 01 = Write block -0096 509A D3 89 OUT (SD_CONTROL),A -0097 509C -0098 509C 0E 04 LD c,4 -0099 509E ;LD HL,hstbuf -0100 509E wr4secs: -0101 509E 06 80 LD b,128 -0102 50A0 wrByte: -0103 50A0 -0104 50A0 DB 89 wrWait2: IN A,(SD_STATUS) -0105 50A2 FE A0 CP 160 ; Write buffer empty -0106 50A4 20 FA JR NZ,wrWait2 -0107 50A6 -0108 50A6 ; UPDATE S0urceror, inserted wait cycle between IN and OUT -0109 50A6 ; to resolve unknown write issue in sd_controller.vhd in combination -0110 50A6 ; with MISTer virtual SD interface sys/sd_card.sv -0111 50A6 ; which results in hangs or write errors. -0112 50A6 C5 push bc -0113 50A7 06 32 ld b,50 -0114 50A9 _again: -0115 50A9 10 FE djnz _again -0116 50AB C1 pop bc -0117 50AC ; END UPDATE -0118 50AC -0119 50AC 7E LD A,(HL) -0120 50AD D3 88 OUT (SD_DATA),A -0121 50AF 23 INC HL -0122 50B0 05 dec b -0123 50B1 20 ED JR NZ, wrByte -0124 50B3 -0125 50B3 0D dec c -0126 50B4 20 E8 JR NZ,wr4secs -0127 50B6 -0128 50B6 E1 POP HL -0129 50B7 C1 POP BC -0130 50B8 F1 POP AF -0131 50B9 -0132 50B9 ;XOR a -0133 50B9 ;ld (erflag),a -0134 50B9 C9 RET -0135 50BA -0136 50BA -0137 50BA ;================================================================================================ -0138 50BA ; Utilities -0139 50BA ;================================================================================================ -0140 50BA -0141 50BA printInline: -0142 50BA E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL -0143 50BB F5 PUSH AF -0144 50BC C5 PUSH BC -0145 50BD 7E nextILChar: LD A,(HL) -0146 50BE FE 00 CP 0 -0147 50C0 28 04 JR Z,endOfPrint -0148 50C2 CF RST 08H -0149 50C3 23 INC HL -0150 50C4 18 F7 JR nextILChar -0151 50C6 23 endOfPrint: INC HL ; Get past "null" terminator -0152 50C7 C1 POP BC -0153 50C8 F1 POP AF -0154 50C9 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL -0155 50CA C9 RET -0156 50CB -0157 50CB 00 lba0 .DB 00h -0158 50CC 00 lba1 .DB 00h -0159 50CD 00 lba2 .DB 00h -0160 50CE 00 lba3 .DB 00h -0161 50CF 00 00 dmaAddr .dw 0 -0162 50D1 -0163 50D1 .END -tasm: Number of errors = 0 +0001 0000 ;================================================================================== +0002 0000 ; Contents of this file are copyright Grant Searle +0003 0000 ; +0004 0000 ; You have permission to use this for NON COMMERCIAL USE ONLY +0005 0000 ; If you wish to use it elsewhere, please include an acknowledgement to myself. +0006 0000 ; +0007 0000 ; http://searle.hostei.com/grant/index.html +0008 0000 ; +0009 0000 ; eMail: home.micros01@btinternet.com +0010 0000 ; +0011 0000 ; If the above don't work, please perform an Internet search to see if I have +0012 0000 ; updated the web page hosting service. +0013 0000 ; +0014 0000 ;================================================================================== +0015 0000 +0016 0000 loadAddr .EQU 0D000h +0017 0000 numSecs .EQU 24 ; Number of 512 sectors to be loaded +0018 0000 +0019 0000 SD_DATA .EQU 088H +0020 0000 SD_CONTROL .EQU 089H +0021 0000 SD_STATUS .EQU 089H +0022 0000 SD_LBA0 .EQU 08AH +0023 0000 SD_LBA1 .EQU 08BH +0024 0000 SD_LBA2 .EQU 08CH +0025 0000 +0026 0000 LF .EQU 0AH ;line feed +0027 0000 FF .EQU 0CH ;form feed +0028 0000 CR .EQU 0DH ;carriage RETurn +0029 0000 +0030 0000 ;================================================================================================ +0031 0000 +0032 5000 .ORG 5000H ; Loader origin. +0033 5000 +0034 5000 CD BA 50 CALL printInline +0035 5003 43 50 2F 4D .TEXT "CP/M System Transfer by G. Searle 2012-13" +0035 5007 20 53 79 73 +0035 500B 74 65 6D 20 +0035 500F 54 72 61 6E +0035 5013 73 66 65 72 +0035 5017 20 62 79 20 +0035 501B 47 2E 20 53 +0035 501F 65 61 72 6C +0035 5023 65 20 32 30 +0035 5027 31 32 2D 31 +0035 502B 33 +0036 502C 0D 0A 00 .DB CR,LF,0 +0037 502F +0038 502F 06 18 LD B,numSecs +0039 5031 +0040 5031 3E 00 LD A,0 +0041 5033 32 CB 50 LD (lba0),A +0042 5036 32 CC 50 ld (lba1),A +0043 5039 32 CD 50 ld (lba2),A +0044 503C 32 CE 50 ld (lba3),A +0045 503F 21 00 D0 LD HL,loadAddr +0046 5042 22 CF 50 LD (dmaAddr),HL +0047 5045 processSectors: +0048 5045 +0049 5045 CD 8C 50 call writehst +0050 5048 +0051 5048 11 00 02 LD DE,0200H +0052 504B 2A CF 50 LD HL,(dmaAddr) +0053 504E 19 ADD HL,DE +0054 504F 22 CF 50 LD (dmaAddr),HL +0055 5052 3A CB 50 LD A,(lba0) +0056 5055 3C INC A +0057 5056 32 CB 50 LD (lba0),A +0058 5059 +0059 5059 10 EA djnz processSectors +0060 505B +0061 505B CD BA 50 CALL printInline +0062 505E 0D 0A .DB CR,LF +0063 5060 53 79 73 74 .TEXT "System transfer complete" +0063 5064 65 6D 20 74 +0063 5068 72 61 6E 73 +0063 506C 66 65 72 20 +0063 5070 63 6F 6D 70 +0063 5074 6C 65 74 65 +0064 5078 0D 0A 00 .DB CR,LF,0 +0065 507B +0066 507B C9 RET +0067 507C +0068 507C ; ========================================================================= +0069 507C ; Disk routines as used in CBIOS +0070 507C ; ========================================================================= +0071 507C setLBAaddr: +0072 507C 3A CD 50 LD A,(lba2) +0073 507F D3 8C OUT (SD_LBA2),A +0074 5081 3A CC 50 LD A,(lba1) +0075 5084 D3 8B OUT (SD_LBA1),A +0076 5086 3A CB 50 LD A,(lba0) +0077 5089 D3 8A OUT (SD_LBA0),A +0078 508B C9 ret +0079 508C +0080 508C ;================================================================================================ +0081 508C ; Write physical sector to host +0082 508C ;================================================================================================ +0083 508C +0084 508C writehst: +0085 508C F5 PUSH AF +0086 508D C5 PUSH BC +0087 508E E5 PUSH HL +0088 508F +0089 508F DB 89 wrWait1: IN A,(SD_STATUS) +0090 5091 FE 80 CP 128 +0091 5093 20 FA JR NZ,wrWait1 +0092 5095 +0093 5095 CD 7C 50 CALL setLBAaddr +0094 5098 +0095 5098 3E 01 LD A,$01 ; 01 = Write block +0096 509A D3 89 OUT (SD_CONTROL),A +0097 509C +0098 509C 0E 04 LD c,4 +0099 509E ;LD HL,hstbuf +0100 509E wr4secs: +0101 509E 06 80 LD b,128 +0102 50A0 wrByte: +0103 50A0 +0104 50A0 DB 89 wrWait2: IN A,(SD_STATUS) +0105 50A2 FE A0 CP 160 ; Write buffer empty +0106 50A4 20 FA JR NZ,wrWait2 +0107 50A6 +0108 50A6 ; UPDATE S0urceror, inserted wait cycle between IN and OUT +0109 50A6 ; to resolve unknown write issue in sd_controller.vhd in combination +0110 50A6 ; with MISTer virtual SD interface sys/sd_card.sv +0111 50A6 ; which results in hangs or write errors. +0112 50A6 C5 push bc +0113 50A7 06 32 ld b,50 +0114 50A9 _again: +0115 50A9 10 FE djnz _again +0116 50AB C1 pop bc +0117 50AC ; END UPDATE +0118 50AC +0119 50AC 7E LD A,(HL) +0120 50AD D3 88 OUT (SD_DATA),A +0121 50AF 23 INC HL +0122 50B0 05 dec b +0123 50B1 20 ED JR NZ, wrByte +0124 50B3 +0125 50B3 0D dec c +0126 50B4 20 E8 JR NZ,wr4secs +0127 50B6 +0128 50B6 E1 POP HL +0129 50B7 C1 POP BC +0130 50B8 F1 POP AF +0131 50B9 +0132 50B9 ;XOR a +0133 50B9 ;ld (erflag),a +0134 50B9 C9 RET +0135 50BA +0136 50BA +0137 50BA ;================================================================================================ +0138 50BA ; Utilities +0139 50BA ;================================================================================================ +0140 50BA +0141 50BA printInline: +0142 50BA E3 EX (SP),HL ; PUSH HL and put RET ADDress into HL +0143 50BB F5 PUSH AF +0144 50BC C5 PUSH BC +0145 50BD 7E nextILChar: LD A,(HL) +0146 50BE FE 00 CP 0 +0147 50C0 28 04 JR Z,endOfPrint +0148 50C2 CF RST 08H +0149 50C3 23 INC HL +0150 50C4 18 F7 JR nextILChar +0151 50C6 23 endOfPrint: INC HL ; Get past "null" terminator +0152 50C7 C1 POP BC +0153 50C8 F1 POP AF +0154 50C9 E3 EX (SP),HL ; PUSH new RET ADDress on stack and restore HL +0155 50CA C9 RET +0156 50CB +0157 50CB 00 lba0 .DB 00h +0158 50CC 00 lba1 .DB 00h +0159 50CD 00 lba2 .DB 00h +0160 50CE 00 lba3 .DB 00h +0161 50CF 00 00 dmaAddr .dw 0 +0162 50D1 +0163 50D1 .END +tasm: Number of errors = 0 diff --git a/Z80 CPM and bootloader (basmon)/source/cbios128.asm b/Z80 CPM and bootloader (basmon)/source/cbios128.asm index 7110247..ce43c2e 100644 --- a/Z80 CPM and bootloader (basmon)/source/cbios128.asm +++ b/Z80 CPM and bootloader (basmon)/source/cbios128.asm @@ -710,45 +710,78 @@ setLBAaddr: ;================================================================================================ readhst: - PUSH AF - PUSH BC - PUSH HL + PUSH AF + PUSH BC + PUSH HL -rdWait1: IN A,(SD_STATUS) - CP 128 - JR NZ,rdWait1 - - CALL setLBAaddr - - LD A,$00 ; 00 = Read block - OUT (SD_CONTROL),A +rdWait1: IN A,(SD_STATUS) + CP 128 ; Check for ready status + JR NZ,rdWait1 - LD c,4 - LD HL,hstbuf + ; Add multiple status checks before starting read + LD B,3 ; Check status 3 times +rdCheck1: + IN A,(SD_STATUS) + CP 128 + JR NZ,rdCheck1 + DJNZ rdCheck1 + + CALL setLBAaddr + + LD A,$00 ; 00 = Read block + OUT (SD_CONTROL),A + + LD c,4 + LD HL,hstbuf rd4secs: - LD b,128 + LD b,128 rdByte: -rdWait2: IN A,(SD_STATUS) - CP 224 ; Read byte waiting - JR NZ,rdWait2 +rdWait2: IN A,(SD_STATUS) + CP 224 ; Read byte waiting + JR NZ,rdWait2 - IN A,(SD_DATA) + ; Add extra validation checks before each read + PUSH BC ; Save main counters + LD B,2 ; Check status twice +rdCheck2: + IN A,(SD_STATUS) + CP 224 + JR NZ,rdCheck2 + DJNZ rdCheck2 + POP BC ; Restore main counters - LD (HL),A - INC HL - dec b - JR NZ, rdByte - dec c - JR NZ,rd4secs + IN A,(SD_DATA) - POP HL - POP BC - POP AF + ; Add small delay after read before store + PUSH BC + LD B,10 +rdDelay: + DJNZ rdDelay + POP BC - XOR a - ld (erflag),a - RET + LD (HL),A + INC HL + dec b + JR NZ, rdByte + dec c + JR NZ,rd4secs + + ; Add final wait before returning + LD B,0 +rdWaitFinal: + IN A,(SD_STATUS) + CP 128 ; Wait for ready status + JR NZ,rdWaitFinal + DJNZ rdWaitFinal + + POP HL + POP BC + POP AF + + XOR a + ld (erflag),a + RET ;================================================================================================ @@ -756,56 +789,63 @@ rdWait2: IN A,(SD_STATUS) ;================================================================================================ writehst: - PUSH AF - PUSH BC - PUSH HL + PUSH AF + PUSH BC + PUSH HL -wrWait1: IN A,(SD_STATUS) - CP 128 - JR NZ,wrWait1 +wrWait1: IN A,(SD_STATUS) + CP 128 + JR NZ,wrWait1 - CALL setLBAaddr - - LD A,$01 ; 01 = Write block - OUT (SD_CONTROL),A - - LD c,4 - LD HL,hstbuf + CALL setLBAaddr + + LD A,$01 ; 01 = Write block + OUT (SD_CONTROL),A + + LD c,4 + LD HL,hstbuf wr4secs: - LD b,128 + LD b,128 wrByte: - -wrWait2: IN A,(SD_STATUS) - CP 160 ; Write buffer empty - JR NZ,wrWait2 + +wrWait2: IN A,(SD_STATUS) + CP 160 ; Write buffer empty + JR NZ,wrWait2 - ; UPDATE S0urceror, inserted wait cycle between IN and OUT - ; to resolve unknown write issue in sd_controller.vhd in combination - ; with MISTer virtual SD interface sys/sd_card.sv - ; which results in hangs or write errors. - push bc - ld b,50 -_again: - djnz _again - pop bc - ; END UPDATE + ; Add multiple status checks before proceeding with write + PUSH BC ; Save main counters + LD B,3 ; Check status 3 times +wrCheck: + IN A,(SD_STATUS) + CP 160 + JR NZ,wrCheck + DJNZ wrCheck + POP BC ; Restore main counters - LD A,(HL) - OUT (SD_DATA),A - INC HL - dec b - JR NZ, wrByte + LD A,(HL) + OUT (SD_DATA),A + INC HL + dec b + JR NZ,wrByte - dec c - JR NZ,wr4secs + dec c + JR NZ,wr4secs - POP HL - POP BC - POP AF - - XOR a - ld (erflag),a - RET + ; Add final wait before returning + LD B,0 +wrWaitFinal: + IN A,(SD_STATUS) + CP 128 ; Wait for ready status + JR NZ,wrWaitFinal + DJNZ wrWaitFinal + + POP HL + POP BC + POP AF + + XOR a + ld (erflag),a + RET ;================================================================================================ ; Utilities diff --git a/Z80 CPM and bootloader (basmon)/source/mon.asm b/Z80 CPM and bootloader (basmon)/source/mon.asm index 81f0c86..6fd30d9 100644 --- a/Z80 CPM and bootloader (basmon)/source/mon.asm +++ b/Z80 CPM and bootloader (basmon)/source/mon.asm @@ -589,45 +589,75 @@ setLBAaddr: ;================================================================================================ readhst: - PUSH AF - PUSH BC - PUSH HL + PUSH AF + PUSH BC + PUSH HL -rdWait1: IN A,(SD_STATUS) - CP 128 - JR NZ,rdWait1 - - CALL setLBAaddr - - LD A,$00 ; 00 = Read block - OUT (SD_CONTROL),A +rdWait1: IN A,(SD_STATUS) + CP 128 ; Check for ready status + JR NZ,rdWait1 - LD c,4 -; LD HL,hstbuf + ; Add multiple status checks before starting read + LD B,3 ; Check status 3 times +rdCheck1: + IN A,(SD_STATUS) + CP 128 + JR NZ,rdCheck1 + DJNZ rdCheck1 + + CALL setLBAaddr + + LD A,$00 ; 00 = Read block + OUT (SD_CONTROL),A + + LD c,4 rd4secs: - LD b,128 + LD b,128 rdByte: -rdWait2: IN A,(SD_STATUS) - CP 224 ; Read byte waiting - JR NZ,rdWait2 +rdWait2: IN A,(SD_STATUS) + CP 224 ; Read byte waiting + JR NZ,rdWait2 - IN A,(SD_DATA) + ; Add extra validation checks before each read + PUSH BC ; Save main counters + LD B,2 ; Check status twice +rdCheck2: + IN A,(SD_STATUS) + CP 224 + JR NZ,rdCheck2 + DJNZ rdCheck2 + POP BC ; Restore main counters - LD (HL),A - INC HL - dec b - JR NZ, rdByte - dec c - JR NZ,rd4secs + IN A,(SD_DATA) - POP HL - POP BC - POP AF + ; Add small delay after read before store + PUSH BC + LD B,10 +rdDelay: + DJNZ rdDelay + POP BC -; XOR a -; ld (erflag),a - RET + LD (HL),A + INC HL + dec b + JR NZ, rdByte + dec c + JR NZ,rd4secs + + ; Add final wait before returning + LD B,0 +rdWaitFinal: + IN A,(SD_STATUS) + CP 128 ; Wait for ready status + JR NZ,rdWaitFinal + DJNZ rdWaitFinal + + POP HL + POP BC + POP AF + + RET ;------------------------------------------------------------------------------ ; END OF ROUTINES AS USED IN BIOS diff --git a/Z80 CPM and bootloader (basmon)/source/mon.lst b/Z80 CPM and bootloader (basmon)/source/mon.lst index 69d66b0..addafc3 100644 --- a/Z80 CPM and bootloader (basmon)/source/mon.lst +++ b/Z80 CPM and bootloader (basmon)/source/mon.lst @@ -251,10 +251,10 @@ 0251 00AD ; Display the "Press space to start" message on both consoles 0252 00AD 3E 00 LD A,$00 0253 00AF 32 00 30 LD (primaryIO),A -0254 00B2 21 0E 03 LD HL,INITTXT +0254 00B2 21 34 03 LD HL,INITTXT 0255 00B5 CD 37 01 CALL M_PRINT 0256 00B8 ; On Display B we need to take care that it does not hang. -0257 00B8 21 0E 03 LD HL,INITTXT +0257 00B8 21 34 03 LD HL,INITTXT 0258 00BB 22 04 30 LD (InitTxtB),HL 0259 00BE 0260 00BE 2A 04 30 printInitB: LD HL,(InitTxtB) @@ -299,7 +299,7 @@ 0299 00FF 0300 00FF ; primaryIO is now set to the channel where SPACE was pressed 0301 00FF CD 3E 01 CALL TXCRLF ; TXCRLF -0302 0102 21 9C 02 LD HL,M_SIGNON ; Print SIGNON message +0302 0102 21 C2 02 LD HL,M_SIGNON ; Print SIGNON message 0303 0105 CD 37 01 CALL M_PRINT 0304 0108 0305 0108 ;------------------------------------------------------------------------------ @@ -490,11 +490,11 @@ 0490 01E6 A7 AND A ; Is it zero? 0491 01E7 C8 RET Z 0492 01E8 -0493 01E8 21 FD 02 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message +0493 01E8 21 23 03 LOADERR LD HL,CKSUMERR ; Get "Checksum Error" message 0494 01EB CD 37 01 CALL M_PRINT ; Print Message from (HL) and terminate the load 0495 01EE C9 RET 0496 01EF -0497 01EF 21 34 03 LOAD00 LD HL,LDETXT ; Print load complete message +0497 01EF 21 5A 03 LOAD00 LD HL,LDETXT ; Print load complete message 0498 01F2 CD 37 01 CALL M_PRINT 0499 01F5 C9 RET 0500 01F6 @@ -502,7 +502,7 @@ 0502 01F6 ; Start Interpreter 0503 01F6 ;------------------------------------------------------------------------------ 0504 01F6 INTERPRT -0505 01F6 C3 3F 03 JP STARTINT +0505 01F6 C3 65 03 JP STARTINT 0506 01F9 C9 RET 0507 01FA 0508 01FA ;------------------------------------------------------------------------------ @@ -593,4497 +593,4527 @@ 0589 0274 ;================================================================================================ 0590 0274 0591 0274 readhst: -0592 0274 F5 PUSH AF -0593 0275 C5 PUSH BC -0594 0276 E5 PUSH HL +0592 0274 F5 PUSH AF +0593 0275 C5 PUSH BC +0594 0276 E5 PUSH HL 0595 0277 -0596 0277 DB 89 rdWait1: IN A,(SD_STATUS) -0597 0279 FE 80 CP 128 -0598 027B 20 FA JR NZ,rdWait1 -0599 027D -0600 027D CD 64 02 CALL setLBAaddr -0601 0280 -0602 0280 3E 00 LD A,$00 ; 00 = Read block -0603 0282 D3 89 OUT (SD_CONTROL),A -0604 0284 -0605 0284 0E 04 LD c,4 -0606 0286 ; LD HL,hstbuf -0607 0286 rd4secs: -0608 0286 06 80 LD b,128 -0609 0288 rdByte: -0610 0288 -0611 0288 DB 89 rdWait2: IN A,(SD_STATUS) -0612 028A FE E0 CP 224 ; Read byte waiting -0613 028C 20 FA JR NZ,rdWait2 -0614 028E -0615 028E DB 88 IN A,(SD_DATA) -0616 0290 -0617 0290 77 LD (HL),A -0618 0291 23 INC HL -0619 0292 05 dec b -0620 0293 20 F3 JR NZ, rdByte -0621 0295 0D dec c -0622 0296 20 EE JR NZ,rd4secs -0623 0298 -0624 0298 E1 POP HL -0625 0299 C1 POP BC -0626 029A F1 POP AF -0627 029B -0628 029B ; XOR a -0629 029B ; ld (erflag),a -0630 029B C9 RET -0631 029C -0632 029C ;------------------------------------------------------------------------------ -0633 029C ; END OF ROUTINES AS USED IN BIOS -0634 029C ;------------------------------------------------------------------------------ -0635 029C -0636 029C -0637 029C 43 50 2F 4D M_SIGNON .BYTE "CP/M Boot ROM 2.0" -0637 02A0 20 42 6F 6F -0637 02A4 74 20 52 4F -0637 02A8 4D 20 32 2E -0637 02AC 30 -0638 02AD ; .BYTE " based on design by G. Searle" -0639 02AD ; .BYTE $0D,$0A -0640 02AD 0D 0A .BYTE $0D,$0A -0641 02AF 49 2D 53 74 .TEXT "I-Strt Intrp" -0641 02B3 72 74 20 49 -0641 02B7 6E 74 72 70 -0642 02BB 0D 0A .BYTE $0D,$0A -0643 02BD 58 2D 42 6F .TEXT "X-Boot CP/M" -0643 02C1 6F 74 20 43 -0643 02C5 50 2F 4D -0644 02C8 0D 0A .BYTE $0D,$0A -0645 02CA 3A 6E 6E 6E .TEXT ":nnnn-Load I rcrd" -0645 02CE 6E 2D 4C 6F -0645 02D2 61 64 20 49 -0645 02D6 20 72 63 72 -0645 02DA 64 -0646 02DB 0D 0A .BYTE $0D,$0A -0647 02DD 47 6E 6E 6E .TEXT "Gnnnn-R loc" -0647 02E1 6E 2D 52 20 -0647 02E5 6C 6F 63 -0648 02E8 0D 0A .BYTE $0D,$0A -0649 02EA 00 .BYTE $00 -0650 02EB -0651 02EB M_BASTXT -0652 02EB 0D 0A .BYTE $0D,$0A -0653 02ED 43 6F 6C 64 .TEXT "Cold or warm?" -0653 02F1 20 6F 72 20 -0653 02F5 77 61 72 6D -0653 02F9 3F -0654 02FA 0D 0A 00 .BYTE $0D,$0A,$00 -0655 02FD -0656 02FD 43 68 65 63 CKSUMERR .BYTE "Checksum error" -0656 0301 6B 73 75 6D -0656 0305 20 65 72 72 -0656 0309 6F 72 -0657 030B 0D 0A 00 .BYTE $0D,$0A,$00 -0658 030E -0659 030E INITTXT -0660 030E 0C .BYTE $0C -0661 030F 50 72 65 73 .TEXT "Press [space] to activate console." -0661 0313 73 20 5B 73 -0661 0317 70 61 63 65 -0661 031B 5D 20 74 6F -0661 031F 20 61 63 74 -0661 0323 69 76 61 74 -0661 0327 65 20 63 6F -0661 032B 6E 73 6F 6C -0661 032F 65 2E -0662 0331 0D 0A 00 .BYTE $0D,$0A, $00 -0663 0334 -0664 0334 LDETXT -0665 0334 43 6F 6D 70 .TEXT "Complete" -0665 0338 6C 65 74 65 -0666 033C 0D 0A 00 .BYTE $0D,$0A, $00 -0667 033F -0668 033F ; ========================================================================================================================== -0669 033F ; GENERAL EQUATES -0670 033F -0671 033F CTRLC .EQU 03H ; Control "C" -0672 033F CTRLG .EQU 07H ; Control "G" -0673 033F BKSP .EQU 08H ; Back space -0674 033F LF .EQU 0AH ; Line feed -0675 033F CS .EQU 0CH ; Clear screen -0676 033F CR .EQU 0DH ; Carriage return -0677 033F CTRLO .EQU 0FH ; Control "O" -0678 033F CTRLQ .EQU 11H ; Control "Q" -0679 033F CTRLR .EQU 12H ; Control "R" -0680 033F CTRLS .EQU 13H ; Control "S" -0681 033F CTRLU .EQU 15H ; Control "U" -0682 033F ESC .EQU 1BH ; Escape -0683 033F DEL .EQU 7FH ; Delete -0684 033F -0685 033F -0686 033F ;=========================================================================================================================== -0687 033F -0688 033F ; NASCOM ROM BASIC Ver 4.7, -0689 033F ; used to be here, removed to get rid of the '(C) 1978 Microsoft' -0690 033F -0691 033F STARTINT: -0692 033F #INCLUDE "SOURCE\\INTPRT.ASM" -0001+ 033F ;------------------------------------------------------------------------------ -0002+ 033F ; Start BASIC command -0003+ 033F ;------------------------------------------------------------------------------ -0004+ 033F BASIC -0005+ 033F 21 EB 02 LD HL,M_BASTXT -0006+ 0342 CD 37 01 CALL M_PRINT -0007+ 0345 CD 45 01 CALL M_GETCHR -0008+ 0348 C8 RET Z ; Cancel if CTRL-C -0009+ 0349 E6 5F AND $5F ; uppercase -0010+ 034B FE 43 CP 'C' -0011+ 034D CA 56 03 JP Z,COLD -0012+ 0350 FE 57 CP 'W' -0013+ 0352 CA 59 03 JP Z,WARM -0014+ 0355 C9 RET -0015+ 0356 -0016+ 0356 ; BASIC WORK SPACE LOCATIONS -0017+ 0356 -0018+ 0356 WRKSPC .EQU 30B0H ; BASIC Work space -0019+ 0356 USR .EQU WRKSPC+3H ; "USR (x)" jump -0020+ 0356 OUTSUB .EQU WRKSPC+6H ; "OUT p,n" -0021+ 0356 OTPORT .EQU WRKSPC+7H ; Port (p) -0022+ 0356 DIVSUP .EQU WRKSPC+9H ; Division support routine -0023+ 0356 DIV1 .EQU WRKSPC+0AH ; <- Values -0024+ 0356 DIV2 .EQU WRKSPC+0EH ; <- to -0025+ 0356 DIV3 .EQU WRKSPC+12H ; <- be -0026+ 0356 DIV4 .EQU WRKSPC+15H ; <-inserted -0027+ 0356 SEED .EQU WRKSPC+17H ; Random number seed -0028+ 0356 LSTRND .EQU WRKSPC+3AH ; Last random number -0029+ 0356 INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine -0030+ 0356 INPORT .EQU WRKSPC+3FH ; PORT (x) -0031+ 0356 NULLS .EQU WRKSPC+41H ; Number of nulls -0032+ 0356 LWIDTH .EQU WRKSPC+42H ; Terminal width -0033+ 0356 COMMAN .EQU WRKSPC+43H ; Width for commas -0034+ 0356 NULFLG .EQU WRKSPC+44H ; Null after input byte flag -0035+ 0356 CTLOFG .EQU WRKSPC+45H ; Control "O" flag -0036+ 0356 LINESC .EQU WRKSPC+46H ; Lines counter -0037+ 0356 LINESN .EQU WRKSPC+48H ; Lines number -0038+ 0356 CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum -0039+ 0356 NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine -0040+ 0356 BRKFLG .EQU WRKSPC+4DH ; Break flag -0041+ 0356 RINPUT .EQU WRKSPC+4EH ; Input reflection -0042+ 0356 POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) -0043+ 0356 PSET .EQU WRKSPC+54H ; "SET" reflection -0044+ 0356 RESET .EQU WRKSPC+57H ; "RESET" reflection -0045+ 0356 STRSPC .EQU WRKSPC+5AH ; Bottom of string space -0046+ 0356 LINEAT .EQU WRKSPC+5CH ; Current line number -0047+ 0356 BASTXT .EQU WRKSPC+5EH ; Pointer to start of program -0048+ 0356 BUFFER .EQU WRKSPC+61H ; Input buffer -0049+ 0356 STACK .EQU WRKSPC+66H ; Initial stack -0050+ 0356 CURPOS .EQU WRKSPC+0ABH ; Character position on line -0051+ 0356 LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag -0052+ 0356 TYPE .EQU WRKSPC+0ADH ; Data type flag -0053+ 0356 DATFLG .EQU WRKSPC+0AEH ; Literal statement flag -0054+ 0356 LSTRAM .EQU WRKSPC+0AFH ; Last available RAM -0055+ 0356 TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer -0056+ 0356 TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool -0057+ 0356 TMPSTR .EQU WRKSPC+0BFH ; Temporary string -0058+ 0356 STRBOT .EQU WRKSPC+0C3H ; Bottom of string space -0059+ 0356 CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL -0060+ 0356 LOOPST .EQU WRKSPC+0C7H ; First statement of loop -0061+ 0356 DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item -0062+ 0356 FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag -0063+ 0356 LSTBIN .EQU WRKSPC+0CCH ; Last byte entered -0064+ 0356 READFG .EQU WRKSPC+0CDH ; Read/Input flag -0065+ 0356 BRKLIN .EQU WRKSPC+0CEH ; Line of break -0066+ 0356 NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL -0067+ 0356 ERRLIN .EQU WRKSPC+0D2H ; Line of error -0068+ 0356 CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue -0069+ 0356 PROGND .EQU WRKSPC+0D6H ; End of program -0070+ 0356 VAREND .EQU WRKSPC+0D8H ; End of variables -0071+ 0356 ARREND .EQU WRKSPC+0DAH ; End of arrays -0072+ 0356 NXTDAT .EQU WRKSPC+0DCH ; Next data item -0073+ 0356 FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument -0074+ 0356 FNARG .EQU WRKSPC+0E0H ; FN argument value -0075+ 0356 FPREG .EQU WRKSPC+0E4H ; Floating point register -0076+ 0356 FPEXP .EQU FPREG+3 ; Floating point exponent -0077+ 0356 SGNRES .EQU WRKSPC+0E8H ; Sign of result -0078+ 0356 PBUFF .EQU WRKSPC+0E9H ; Number print buffer -0079+ 0356 MULVAL .EQU WRKSPC+0F6H ; Multiplier -0080+ 0356 PROGST .EQU WRKSPC+0F9H ; Start of program text area -0081+ 0356 STLOOK .EQU WRKSPC+15DH ; Start of memory test -0082+ 0356 -0083+ 0356 ; BASIC ERROR CODE VALUES -0084+ 0356 -0085+ 0356 NF .EQU 00H ; NEXT without FOR -0086+ 0356 SN .EQU 02H ; Syntax error -0087+ 0356 RG .EQU 04H ; RETURN without GOSUB -0088+ 0356 OD .EQU 06H ; Out of DATA -0089+ 0356 FC .EQU 08H ; Function call error -0090+ 0356 OV .EQU 0AH ; Overflow -0091+ 0356 OM .EQU 0CH ; Out of memory -0092+ 0356 UL .EQU 0EH ; Undefined line number -0093+ 0356 BS .EQU 10H ; Bad subscript -0094+ 0356 DD .EQU 12H ; Re-DIMensioned array -0095+ 0356 DZ .EQU 14H ; Division by zero (/0) -0096+ 0356 ID .EQU 16H ; Illegal direct -0097+ 0356 TM .EQU 18H ; Type miss-match -0098+ 0356 OS .EQU 1AH ; Out of string space -0099+ 0356 LS .EQU 1CH ; String too long -0100+ 0356 ST .EQU 1EH ; String formula too complex -0101+ 0356 CN .EQU 20H ; Can't CONTinue -0102+ 0356 UF .EQU 22H ; UnDEFined FN function -0103+ 0356 MO .EQU 24H ; Missing operand -0104+ 0356 HX .EQU 26H ; HEX error -0105+ 0356 BN .EQU 28H ; BIN error -0106+ 0356 -0107+ 0356 ; .ORG 00396H -0108+ 0356 -0109+ 0356 C3 5C 03 COLD: JP STARTB ; Jump for cold start -0110+ 0359 C3 FA 03 WARM: JP WARMST ; Jump for warm start -0111+ 035C STARTB: -0112+ 035C DD 21 00 00 LD IX,0 ; Flag cold start -0113+ 0360 C3 67 03 JP CSTART ; Jump to initialise -0114+ 0363 -0115+ 0363 0D 0C .WORD DEINT ; Get integer -32768 to 32767 -0116+ 0365 83 13 .WORD ABPASS ; Return integer in AB -0117+ 0367 -0118+ 0367 -0119+ 0367 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM -0120+ 036A F9 LD SP,HL ; Set up a temporary stack -0121+ 036B C3 A2 1F JP INITST ; Go to initialise -0122+ 036E -0123+ 036E 11 34 06 INIT: LD DE,INITAB ; Initialise workspace -0124+ 0371 06 63 LD B,INITBE-INITAB+3; Bytes to copy -0125+ 0373 21 B0 30 LD HL,WRKSPC ; Into workspace RAM -0126+ 0376 1A COPY: LD A,(DE) ; Get source -0127+ 0377 77 LD (HL),A ; To destination -0128+ 0378 23 INC HL ; Next destination -0129+ 0379 13 INC DE ; Next source -0130+ 037A 05 DEC B ; Count bytes -0131+ 037B C2 76 03 JP NZ,COPY ; More to move -0132+ 037E F9 LD SP,HL ; Temporary stack -0133+ 037F CD 35 08 CALL CLREG ; Clear registers and stack -0134+ 0382 CD 03 0E CALL PRNTCRLF ; Output CRLF -0135+ 0385 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer -0136+ 0388 32 A9 31 LD (PROGST),A ; Initialise program area -0137+ 038B 21 49 04 MSIZE: LD HL,MEMMSG ; Point to message -0138+ 038E CD A1 14 CALL PRS ; Output "Memory size" -0139+ 0391 CD 52 08 CALL PROMPT ; Get input with '?' -0140+ 0394 CD 5B 0B CALL GETCHR ; Get next character -0141+ 0397 B7 OR A ; Set flags -0142+ 0398 C2 B0 03 JP NZ,TSTMEM ; If number - Test if RAM there -0143+ 039B 21 0D 32 LD HL,STLOOK ; Point to start of RAM -0144+ 039E 23 MLOOP: INC HL ; Next byte -0145+ 039F 7C LD A,H ; Above address FFFF ? -0146+ 03A0 B5 OR L -0147+ 03A1 CA C2 03 JP Z,SETTOP ; Yes - 64K RAM -0148+ 03A4 7E LD A,(HL) ; Get contents -0149+ 03A5 47 LD B,A ; Save it -0150+ 03A6 2F CPL ; Flip all bits -0151+ 03A7 77 LD (HL),A ; Put it back -0152+ 03A8 BE CP (HL) ; RAM there if same -0153+ 03A9 70 LD (HL),B ; Restore old contents -0154+ 03AA CA 9E 03 JP Z,MLOOP ; If RAM - test next byte -0155+ 03AD C3 C2 03 JP SETTOP ; Top of RAM found -0156+ 03B0 -0157+ 03B0 CD 27 0C TSTMEM: CALL ATOH ; Get high memory into DE -0158+ 03B3 B7 OR A ; Set flags on last byte -0159+ 03B4 C2 03 07 JP NZ,SNERR ; ?SN Error if bad character -0160+ 03B7 EB EX DE,HL ; Address into HL -0161+ 03B8 2B DEC HL ; Back one byte -0162+ 03B9 3E D9 LD A,11011001B ; Test byte -0163+ 03BB 46 LD B,(HL) ; Get old contents -0164+ 03BC 77 LD (HL),A ; Load test byte -0165+ 03BD BE CP (HL) ; RAM there if same -0166+ 03BE 70 LD (HL),B ; Restore old contents -0167+ 03BF C2 8B 03 JP NZ,MSIZE ; Ask again if no RAM -0168+ 03C2 -0169+ 03C2 2B SETTOP: DEC HL ; Back one byte -0170+ 03C3 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM -0171+ 03C6 CD CB 09 CALL CPDEHL ; Compare DE with HL -0172+ 03C9 DA 8B 03 JP C,MSIZE ; Ask again if not enough RAM -0173+ 03CC 11 CE FF LD DE,0-50 ; 50 Bytes string space -0174+ 03CF 22 5F 31 LD (LSTRAM),HL ; Save last available RAM -0175+ 03D2 19 ADD HL,DE ; Allocate string space -0176+ 03D3 22 0A 31 LD (STRSPC),HL ; Save string space -0177+ 03D6 CD 10 08 CALL CLRPTR ; Clear program area -0178+ 03D9 2A 0A 31 LD HL,(STRSPC) ; Get end of memory -0179+ 03DC 11 EF FF LD DE,0-17 ; Offset for free bytes -0180+ 03DF 19 ADD HL,DE ; Adjust HL -0181+ 03E0 11 A9 31 LD DE,PROGST ; Start of program text -0182+ 03E3 7D LD A,L ; Get LSB -0183+ 03E4 93 SUB E ; Adjust it -0184+ 03E5 6F LD L,A ; Re-save -0185+ 03E6 7C LD A,H ; Get MSB -0186+ 03E7 9A SBC A,D ; Adjust it -0187+ 03E8 67 LD H,A ; Re-save -0188+ 03E9 E5 PUSH HL ; Save bytes free -0189+ 03EA 21 12 04 LD HL,SIGNON ; Sign-on message -0190+ 03ED CD A1 14 CALL PRS ; Output string -0191+ 03F0 E1 POP HL ; Get bytes free back -0192+ 03F1 CD 44 1B CALL PRNTHL ; Output amount of free memory -0193+ 03F4 21 03 04 LD HL,BFREE ; " Bytes free" message -0194+ 03F7 CD A1 14 CALL PRS ; Output string -0195+ 03FA -0196+ 03FA 31 16 31 WARMST: LD SP,STACK ; Temporary stack -0197+ 03FD CD 35 08 BRKRET: CALL CLREG ; Clear registers and stack -0198+ 0400 C3 4E 07 JP PRNTOK ; Go to get command line -0199+ 0403 -0200+ 0403 20 42 79 74 BFREE: .BYTE " Bytes free",CR,LF,0,0 -0200+ 0407 65 73 20 66 -0200+ 040B 72 65 65 0D -0200+ 040F 0A 00 00 -0201+ 0412 -0202+ 0412 5A 38 30 20 SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF -0202+ 0416 42 41 53 49 -0202+ 041A 43 20 56 65 -0202+ 041E 72 20 34 2E -0202+ 0422 37 62 0D 0A -0203+ 0426 43 6F 70 79 .BYTE "Copyright ",40,"C",41 -0203+ 042A 72 69 67 68 -0203+ 042E 74 20 28 43 -0203+ 0432 29 -0204+ 0433 20 31 39 37 .BYTE " 1978 by Microsoft",CR,LF,0,0 -0204+ 0437 38 20 62 79 -0204+ 043B 20 4D 69 63 -0204+ 043F 72 6F 73 6F -0204+ 0443 66 74 0D 0A -0204+ 0447 00 00 -0205+ 0449 -0206+ 0449 4D 65 6D 6F MEMMSG: .BYTE "Memory top",0 -0206+ 044D 72 79 20 74 -0206+ 0451 6F 70 00 -0207+ 0454 -0208+ 0454 ; FUNCTION ADDRESS TABLE -0209+ 0454 -0210+ 0454 B9 19 FNCTAB: .WORD SGN -0211+ 0456 7D 1A .WORD INT -0212+ 0458 CF 19 .WORD ABS -0213+ 045A B3 30 .WORD USR -0214+ 045C 61 13 .WORD FRE -0215+ 045E E6 16 .WORD INP -0216+ 0460 8F 13 .WORD POS -0217+ 0462 43 1C .WORD SQR -0218+ 0464 22 1D .WORD RND -0219+ 0466 5E 18 .WORD LOG -0220+ 0468 91 1C .WORD EXP -0221+ 046A 97 1D .WORD COS -0222+ 046C 9D 1D .WORD SIN -0223+ 046E FE 1D .WORD TAN -0224+ 0470 13 1E .WORD ATN -0225+ 0472 3A 17 .WORD PEEK -0226+ 0474 7E 1E .WORD DEEK -0227+ 0476 01 31 .WORD POINT -0228+ 0478 13 16 .WORD LEN -0229+ 047A 2B 14 .WORD STR -0230+ 047C AD 16 .WORD VAL -0231+ 047E 22 16 .WORD ASC -0232+ 0480 33 16 .WORD CHR -0233+ 0482 A0 1E .WORD HEX -0234+ 0484 33 1F .WORD BIN -0235+ 0486 43 16 .WORD LEFT -0236+ 0488 73 16 .WORD RIGHT -0237+ 048A 7D 16 .WORD MID -0238+ 048C -0239+ 048C ; RESERVED WORD LIST -0240+ 048C -0241+ 048C C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" -0242+ 048F C6 4F 52 .BYTE 'F'+80H,"OR" -0243+ 0492 CE 45 58 54 .BYTE 'N'+80H,"EXT" -0244+ 0496 C4 41 54 41 .BYTE 'D'+80H,"ATA" -0245+ 049A C9 4E 50 55 .BYTE 'I'+80H,"NPUT" -0245+ 049E 54 -0246+ 049F C4 49 4D .BYTE 'D'+80H,"IM" -0247+ 04A2 D2 45 41 44 .BYTE 'R'+80H,"EAD" -0248+ 04A6 CC 45 54 .BYTE 'L'+80H,"ET" -0249+ 04A9 C7 4F 54 4F .BYTE 'G'+80H,"OTO" -0250+ 04AD D2 55 4E .BYTE 'R'+80H,"UN" -0251+ 04B0 C9 46 .BYTE 'I'+80H,"F" -0252+ 04B2 D2 45 53 54 .BYTE 'R'+80H,"ESTORE" -0252+ 04B6 4F 52 45 -0253+ 04B9 C7 4F 53 55 .BYTE 'G'+80H,"OSUB" -0253+ 04BD 42 -0254+ 04BE D2 45 54 55 .BYTE 'R'+80H,"ETURN" -0254+ 04C2 52 4E -0255+ 04C4 D2 45 4D .BYTE 'R'+80H,"EM" -0256+ 04C7 D3 54 4F 50 .BYTE 'S'+80H,"TOP" -0257+ 04CB CF 55 54 .BYTE 'O'+80H,"UT" -0258+ 04CE CF 4E .BYTE 'O'+80H,"N" -0259+ 04D0 CE 55 4C 4C .BYTE 'N'+80H,"ULL" -0260+ 04D4 D7 41 49 54 .BYTE 'W'+80H,"AIT" -0261+ 04D8 C4 45 46 .BYTE 'D'+80H,"EF" -0262+ 04DB D0 4F 4B 45 .BYTE 'P'+80H,"OKE" -0263+ 04DF C4 4F 4B 45 .BYTE 'D'+80H,"OKE" -0264+ 04E3 D3 43 52 45 .BYTE 'S'+80H,"CREEN" -0264+ 04E7 45 4E -0265+ 04E9 CC 49 4E 45 .BYTE 'L'+80H,"INES" -0265+ 04ED 53 -0266+ 04EE C3 4C 53 .BYTE 'C'+80H,"LS" -0267+ 04F1 D7 49 44 54 .BYTE 'W'+80H,"IDTH" -0267+ 04F5 48 -0268+ 04F6 CD 4F 4E 49 .BYTE 'M'+80H,"ONITOR" -0268+ 04FA 54 4F 52 -0269+ 04FD D3 45 54 .BYTE 'S'+80H,"ET" -0270+ 0500 D2 45 53 45 .BYTE 'R'+80H,"ESET" -0270+ 0504 54 -0271+ 0505 D0 52 49 4E .BYTE 'P'+80H,"RINT" -0271+ 0509 54 -0272+ 050A C3 4F 4E 54 .BYTE 'C'+80H,"ONT" -0273+ 050E CC 49 53 54 .BYTE 'L'+80H,"IST" -0274+ 0512 C3 4C 45 41 .BYTE 'C'+80H,"LEAR" -0274+ 0516 52 -0275+ 0517 C3 4C 4F 41 .BYTE 'C'+80H,"LOAD" -0275+ 051B 44 -0276+ 051C C3 53 41 56 .BYTE 'C'+80H,"SAVE" -0276+ 0520 45 -0277+ 0521 CE 45 57 .BYTE 'N'+80H,"EW" -0278+ 0524 -0279+ 0524 D4 41 42 28 .BYTE 'T'+80H,"AB(" -0280+ 0528 D4 4F .BYTE 'T'+80H,"O" -0281+ 052A C6 4E .BYTE 'F'+80H,"N" -0282+ 052C D3 50 43 28 .BYTE 'S'+80H,"PC(" -0283+ 0530 D4 48 45 4E .BYTE 'T'+80H,"HEN" -0284+ 0534 CE 4F 54 .BYTE 'N'+80H,"OT" -0285+ 0537 D3 54 45 50 .BYTE 'S'+80H,"TEP" -0286+ 053B -0287+ 053B AB .BYTE '+'+80H -0288+ 053C AD .BYTE '-'+80H -0289+ 053D AA .BYTE '*'+80H -0290+ 053E AF .BYTE '/'+80H -0291+ 053F DE .BYTE '^'+80H -0292+ 0540 C1 4E 44 .BYTE 'A'+80H,"ND" -0293+ 0543 CF 52 .BYTE 'O'+80H,"R" -0294+ 0545 BE .BYTE '>'+80H -0295+ 0546 BD .BYTE '='+80H -0296+ 0547 BC .BYTE '<'+80H -0297+ 0548 -0298+ 0548 D3 47 4E .BYTE 'S'+80H,"GN" -0299+ 054B C9 4E 54 .BYTE 'I'+80H,"NT" -0300+ 054E C1 42 53 .BYTE 'A'+80H,"BS" -0301+ 0551 D5 53 52 .BYTE 'U'+80H,"SR" -0302+ 0554 C6 52 45 .BYTE 'F'+80H,"RE" -0303+ 0557 C9 4E 50 .BYTE 'I'+80H,"NP" -0304+ 055A D0 4F 53 .BYTE 'P'+80H,"OS" -0305+ 055D D3 51 52 .BYTE 'S'+80H,"QR" -0306+ 0560 D2 4E 44 .BYTE 'R'+80H,"ND" -0307+ 0563 CC 4F 47 .BYTE 'L'+80H,"OG" -0308+ 0566 C5 58 50 .BYTE 'E'+80H,"XP" -0309+ 0569 C3 4F 53 .BYTE 'C'+80H,"OS" -0310+ 056C D3 49 4E .BYTE 'S'+80H,"IN" -0311+ 056F D4 41 4E .BYTE 'T'+80H,"AN" -0312+ 0572 C1 54 4E .BYTE 'A'+80H,"TN" -0313+ 0575 D0 45 45 4B .BYTE 'P'+80H,"EEK" -0314+ 0579 C4 45 45 4B .BYTE 'D'+80H,"EEK" -0315+ 057D D0 4F 49 4E .BYTE 'P'+80H,"OINT" -0315+ 0581 54 -0316+ 0582 CC 45 4E .BYTE 'L'+80H,"EN" -0317+ 0585 D3 54 52 24 .BYTE 'S'+80H,"TR$" -0318+ 0589 D6 41 4C .BYTE 'V'+80H,"AL" -0319+ 058C C1 53 43 .BYTE 'A'+80H,"SC" -0320+ 058F C3 48 52 24 .BYTE 'C'+80H,"HR$" -0321+ 0593 C8 45 58 24 .BYTE 'H'+80H,"EX$" -0322+ 0597 C2 49 4E 24 .BYTE 'B'+80H,"IN$" -0323+ 059B CC 45 46 54 .BYTE 'L'+80H,"EFT$" -0323+ 059F 24 -0324+ 05A0 D2 49 47 48 .BYTE 'R'+80H,"IGHT$" -0324+ 05A4 54 24 -0325+ 05A6 CD 49 44 24 .BYTE 'M'+80H,"ID$" -0326+ 05AA 80 .BYTE 80H ; End of list marker -0327+ 05AB -0328+ 05AB ; KEYWORD ADDRESS TABLE -0329+ 05AB -0330+ 05AB A5 0B WORDTB: .WORD PEND -0331+ 05AD A2 0A .WORD FOR -0332+ 05AF 7D 0F .WORD NEXT -0333+ 05B1 F2 0C .WORD DATA -0334+ 05B3 84 0E .WORD INPUT -0335+ 05B5 B9 11 .WORD DIM -0336+ 05B7 B3 0E .WORD READ -0337+ 05B9 09 0D .WORD LET -0338+ 05BB AF 0C .WORD GOTO -0339+ 05BD 92 0C .WORD RUN -0340+ 05BF 81 0D .WORD IF -0341+ 05C1 6B 0B .WORD RESTOR -0342+ 05C3 9E 0C .WORD GOSUB -0343+ 05C5 CD 0C .WORD RETURN -0344+ 05C7 F4 0C .WORD REM -0345+ 05C9 A3 0B .WORD STOP -0346+ 05CB F2 16 .WORD POUT -0347+ 05CD 63 0D .WORD ON -0348+ 05CF E4 0B .WORD NULL -0349+ 05D1 F8 16 .WORD WAIT -0350+ 05D3 97 13 .WORD DEF -0351+ 05D5 41 17 .WORD POKE -0352+ 05D7 89 1E .WORD DOKE -0353+ 05D9 F4 0C .WORD REM -0354+ 05DB 6F 1E .WORD LINES -0355+ 05DD 62 1E .WORD CLS -0356+ 05DF 67 1E .WORD WIDTH -0357+ 05E1 9F 1F .WORD MONITR -0358+ 05E3 04 31 .WORD PSET -0359+ 05E5 07 31 .WORD RESET -0360+ 05E7 A5 0D .WORD PRINT -0361+ 05E9 D1 0B .WORD CONT -0362+ 05EB 17 0A .WORD LIST -0363+ 05ED 4C 0C .WORD CLEAR -0364+ 05EF F4 0C .WORD REM -0365+ 05F1 F4 0C .WORD REM -0366+ 05F3 0F 08 .WORD NEW -0367+ 05F5 -0368+ 05F5 ; RESERVED WORD TOKEN VALUES -0369+ 05F5 -0370+ 05F5 ZEND .EQU 080H ; END -0371+ 05F5 ZFOR .EQU 081H ; FOR -0372+ 05F5 ZDATA .EQU 083H ; DATA -0373+ 05F5 ZGOTO .EQU 088H ; GOTO -0374+ 05F5 ZGOSUB .EQU 08CH ; GOSUB -0375+ 05F5 ZREM .EQU 08EH ; REM -0376+ 05F5 ZPRINT .EQU 09EH ; PRINT -0377+ 05F5 ZNEW .EQU 0A4H ; NEW -0378+ 05F5 -0379+ 05F5 ZTAB .EQU 0A5H ; TAB -0380+ 05F5 ZTO .EQU 0A6H ; TO -0381+ 05F5 ZFN .EQU 0A7H ; FN -0382+ 05F5 ZSPC .EQU 0A8H ; SPC -0383+ 05F5 ZTHEN .EQU 0A9H ; THEN -0384+ 05F5 ZNOT .EQU 0AAH ; NOT -0385+ 05F5 ZSTEP .EQU 0ABH ; STEP -0386+ 05F5 -0387+ 05F5 ZPLUS .EQU 0ACH ; + -0388+ 05F5 ZMINUS .EQU 0ADH ; - -0389+ 05F5 ZTIMES .EQU 0AEH ; * -0390+ 05F5 ZDIV .EQU 0AFH ; / -0391+ 05F5 ZOR .EQU 0B2H ; OR -0392+ 05F5 ZGTR .EQU 0B3H ; > -0393+ 05F5 ZEQUAL .EQU 0B4H ; M -0394+ 05F5 ZLTH .EQU 0B5H ; < -0395+ 05F5 ZSGN .EQU 0B6H ; SGN -0396+ 05F5 ZPOINT .EQU 0C7H ; POINT -0397+ 05F5 ZLEFT .EQU 0CDH +2 ; LEFT$ -0398+ 05F5 -0399+ 05F5 ; ARITHMETIC PRECEDENCE TABLE -0400+ 05F5 -0401+ 05F5 79 PRITAB: .BYTE 79H ; Precedence value -0402+ 05F6 2B 1B .WORD PADD ; FPREG = + FPREG -0403+ 05F8 -0404+ 05F8 79 .BYTE 79H ; Precedence value -0405+ 05F9 5F 17 .WORD PSUB ; FPREG = - FPREG -0406+ 05FB -0407+ 05FB 7C .BYTE 7CH ; Precedence value -0408+ 05FC 9D 18 .WORD MULT ; PPREG = * FPREG -0409+ 05FE -0410+ 05FE 7C .BYTE 7CH ; Precedence value -0411+ 05FF FE 18 .WORD DIV ; FPREG = / FPREG -0412+ 0601 -0413+ 0601 7F .BYTE 7FH ; Precedence value -0414+ 0602 4C 1C .WORD POWER ; FPREG = ^ FPREG -0415+ 0604 -0416+ 0604 50 .BYTE 50H ; Precedence value -0417+ 0605 12 11 .WORD PAND ; FPREG = AND FPREG -0418+ 0607 -0419+ 0607 46 .BYTE 46H ; Precedence value -0420+ 0608 11 11 .WORD POR ; FPREG = OR FPREG -0421+ 060A -0422+ 060A ; BASIC ERROR CODE LIST -0423+ 060A -0424+ 060A 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR -0425+ 060C 53 4E .BYTE "SN" ; Syntax error -0426+ 060E 52 47 .BYTE "RG" ; RETURN without GOSUB -0427+ 0610 4F 44 .BYTE "OD" ; Out of DATA -0428+ 0612 46 43 .BYTE "FC" ; Illegal function call -0429+ 0614 4F 56 .BYTE "OV" ; Overflow error -0430+ 0616 4F 4D .BYTE "OM" ; Out of memory -0431+ 0618 55 4C .BYTE "UL" ; Undefined line -0432+ 061A 42 53 .BYTE "BS" ; Bad subscript -0433+ 061C 44 44 .BYTE "DD" ; Re-DIMensioned array -0434+ 061E 2F 30 .BYTE "/0" ; Division by zero -0435+ 0620 49 44 .BYTE "ID" ; Illegal direct -0436+ 0622 54 4D .BYTE "TM" ; Type mis-match -0437+ 0624 4F 53 .BYTE "OS" ; Out of string space -0438+ 0626 4C 53 .BYTE "LS" ; String too long -0439+ 0628 53 54 .BYTE "ST" ; String formula too complex -0440+ 062A 43 4E .BYTE "CN" ; Can't CONTinue -0441+ 062C 55 46 .BYTE "UF" ; Undefined FN function -0442+ 062E 4D 4F .BYTE "MO" ; Missing operand -0443+ 0630 48 58 .BYTE "HX" ; HEX error -0444+ 0632 42 4E .BYTE "BN" ; BIN error -0445+ 0634 -0446+ 0634 ; INITIALISATION TABLE ------------------------------------------------------- -0447+ 0634 -0448+ 0634 C3 FA 03 INITAB: JP WARMST ; Warm start jump -0449+ 0637 C3 22 0C JP FCERR ; "USR (X)" jump (Set to Error) -0450+ 063A D3 00 OUT (0),A ; "OUT p,n" skeleton -0451+ 063C C9 RET -0452+ 063D D6 00 SUB 0 ; Division support routine -0453+ 063F 6F LD L,A -0454+ 0640 7C LD A,H -0455+ 0641 DE 00 SBC A,0 -0456+ 0643 67 LD H,A -0457+ 0644 78 LD A,B -0458+ 0645 DE 00 SBC A,0 -0459+ 0647 47 LD B,A -0460+ 0648 3E 00 LD A,0 -0461+ 064A C9 RET -0462+ 064B 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND -0463+ 064E 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 -0464+ 0652 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 -0465+ 0656 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 -0466+ 065A 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 -0467+ 065E 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 -0468+ 0662 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 -0469+ 0666 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 -0470+ 066A D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 -0471+ 066E 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number -0472+ 0672 DB 00 IN A,(0) ; INP (x) skeleton -0473+ 0674 C9 RET -0474+ 0675 01 .BYTE 1 ; POS (x) number (1) -0475+ 0676 FF .BYTE 255 ; Terminal width (255 = no auto CRLF) -0476+ 0677 1C .BYTE 28 ; Width for commas (3 columns) -0477+ 0678 00 .BYTE 0 ; No nulls after input bytes -0478+ 0679 00 .BYTE 0 ; Output enabled (^O off) -0479+ 067A 14 00 .WORD 20 ; Initial lines counter -0480+ 067C 14 00 .WORD 20 ; Initial lines number -0481+ 067E 00 00 .WORD 0 ; Array load/save check sum -0482+ 0680 00 .BYTE 0 ; Break not by NMI -0483+ 0681 00 .BYTE 0 ; Break flag -0484+ 0682 C3 48 09 JP TTYLIN ; Input reflection (set to TTY) -0485+ 0685 C3 00 00 JP $0000 ; POINT reflection unused -0486+ 0688 C3 00 00 JP $0000 ; SET reflection -0487+ 068B C3 00 00 JP $0000 ; RESET reflection -0488+ 068E 0D 32 .WORD STLOOK ; Temp string space -0489+ 0690 FE FF .WORD -2 ; Current line number (cold) -0490+ 0692 AA 31 .WORD PROGST+1 ; Start of program text -0491+ 0694 INITBE: -0492+ 0694 -0493+ 0694 ; END OF INITIALISATION TABLE --------------------------------------------------- -0494+ 0694 -0495+ 0694 20 45 72 72 ERRMSG: .BYTE " Error",0 -0495+ 0698 6F 72 00 -0496+ 069B 20 69 6E 20 INMSG: .BYTE " in ",0 -0496+ 069F 00 -0497+ 06A0 ZERBYT .EQU $-1 ; A zero byte -0498+ 06A0 4F 6B 0D 0A OKMSG: .BYTE "Ok",CR,LF,0,0 -0498+ 06A4 00 00 -0499+ 06A6 42 72 65 61 BRKMSG: .BYTE "Break",0 -0499+ 06AA 6B 00 -0500+ 06AC -0501+ 06AC 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with -0502+ 06AF 39 ADD HL,SP ; same index as specified -0503+ 06B0 7E LOKFOR: LD A,(HL) ; Get block ID -0504+ 06B1 23 INC HL ; Point to index address -0505+ 06B2 FE 81 CP ZFOR ; Is it a "FOR" token -0506+ 06B4 C0 RET NZ ; No - exit -0507+ 06B5 4E LD C,(HL) ; BC = Address of "FOR" index -0508+ 06B6 23 INC HL -0509+ 06B7 46 LD B,(HL) -0510+ 06B8 23 INC HL ; Point to sign of STEP -0511+ 06B9 E5 PUSH HL ; Save pointer to sign -0512+ 06BA 69 LD L,C ; HL = address of "FOR" index -0513+ 06BB 60 LD H,B -0514+ 06BC 7A LD A,D ; See if an index was specified -0515+ 06BD B3 OR E ; DE = 0 if no index specified -0516+ 06BE EB EX DE,HL ; Specified index into HL -0517+ 06BF CA C6 06 JP Z,INDFND ; Skip if no index given -0518+ 06C2 EB EX DE,HL ; Index back into DE -0519+ 06C3 CD CB 09 CALL CPDEHL ; Compare index with one given -0520+ 06C6 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block -0521+ 06C9 E1 POP HL ; Restore pointer to sign -0522+ 06CA C8 RET Z ; Return if block found -0523+ 06CB 09 ADD HL,BC ; Point to next block -0524+ 06CC C3 B0 06 JP LOKFOR ; Keep on looking -0525+ 06CF -0526+ 06CF CD E9 06 MOVUP: CALL ENFMEM ; See if enough memory -0527+ 06D2 C5 MOVSTR: PUSH BC ; Save end of source -0528+ 06D3 E3 EX (SP),HL ; Swap source and dest" end -0529+ 06D4 C1 POP BC ; Get end of destination -0530+ 06D5 CD CB 09 MOVLP: CALL CPDEHL ; See if list moved -0531+ 06D8 7E LD A,(HL) ; Get byte -0532+ 06D9 02 LD (BC),A ; Move it -0533+ 06DA C8 RET Z ; Exit if all done -0534+ 06DB 0B DEC BC ; Next byte to move to -0535+ 06DC 2B DEC HL ; Next byte to move -0536+ 06DD C3 D5 06 JP MOVLP ; Loop until all bytes moved -0537+ 06E0 -0538+ 06E0 E5 CHKSTK: PUSH HL ; Save code string address -0539+ 06E1 2A 8A 31 LD HL,(ARREND) ; Lowest free memory -0540+ 06E4 06 00 LD B,0 ; BC = Number of levels to test -0541+ 06E6 09 ADD HL,BC ; 2 Bytes for each level -0542+ 06E7 09 ADD HL,BC -0543+ 06E8 3E .BYTE 3EH ; Skip "PUSH HL" -0544+ 06E9 E5 ENFMEM: PUSH HL ; Save code string address -0545+ 06EA 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM -0546+ 06EC 95 SUB L -0547+ 06ED 6F LD L,A -0548+ 06EE 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM -0549+ 06F0 9C SBC A,H -0550+ 06F1 DA F8 06 JP C,OMERR ; Not enough - ?OM Error -0551+ 06F4 67 LD H,A -0552+ 06F5 39 ADD HL,SP ; Test if stack is overflowed -0553+ 06F6 E1 POP HL ; Restore code string address -0554+ 06F7 D8 RET C ; Return if enough mmory -0555+ 06F8 1E 0C OMERR: LD E,OM ; ?OM Error -0556+ 06FA C3 17 07 JP ERROR -0557+ 06FD -0558+ 06FD 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item -0559+ 0700 22 0C 31 LD (LINEAT),HL ; Save as current line -0560+ 0703 1E 02 SNERR: LD E,SN ; ?SN Error -0561+ 0705 01 .BYTE 01H ; Skip "LD E,DZ" -0562+ 0706 1E 14 DZERR: LD E,DZ ; ?/0 Error -0563+ 0708 01 .BYTE 01H ; Skip "LD E,NF" -0564+ 0709 1E 00 NFERR: LD E,NF ; ?NF Error -0565+ 070B 01 .BYTE 01H ; Skip "LD E,DD" -0566+ 070C 1E 12 DDERR: LD E,DD ; ?DD Error -0567+ 070E 01 .BYTE 01H ; Skip "LD E,UF" -0568+ 070F 1E 22 UFERR: LD E,UF ; ?UF Error -0569+ 0711 01 .BYTE 01H ; Skip "LD E,OV -0570+ 0712 1E 0A OVERR: LD E,OV ; ?OV Error -0571+ 0714 01 .BYTE 01H ; Skip "LD E,TM" -0572+ 0715 1E 18 TMERR: LD E,TM ; ?TM Error -0573+ 0717 -0574+ 0717 CD 35 08 ERROR: CALL CLREG ; Clear registers and stack -0575+ 071A 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) -0576+ 071D CD F6 0D CALL STTLIN ; Start new line -0577+ 0720 21 0A 06 LD HL,ERRORS ; Point to error codes -0578+ 0723 57 LD D,A ; D = 0 (A is 0) -0579+ 0724 3E 3F LD A,'?' -0580+ 0726 CD DC 09 CALL OUTC ; Output '?' -0581+ 0729 19 ADD HL,DE ; Offset to correct error code -0582+ 072A 7E LD A,(HL) ; First character -0583+ 072B CD DC 09 CALL OUTC ; Output it -0584+ 072E CD 5B 0B CALL GETCHR ; Get next character -0585+ 0731 CD DC 09 CALL OUTC ; Output it -0586+ 0734 21 94 06 LD HL,ERRMSG ; "Error" message -0587+ 0737 CD A1 14 ERRIN: CALL PRS ; Output message -0588+ 073A 2A 0C 31 LD HL,(LINEAT) ; Get line of error -0589+ 073D 11 FE FF LD DE,-2 ; Cold start error if -2 -0590+ 0740 CD CB 09 CALL CPDEHL ; See if cold start error -0591+ 0743 CA 67 03 JP Z,CSTART ; Cold start error - Restart -0592+ 0746 7C LD A,H ; Was it a direct error? -0593+ 0747 A5 AND L ; Line = -1 if direct error -0594+ 0748 3C INC A -0595+ 0749 C4 3C 1B CALL NZ,LINEIN ; No - output line of error -0596+ 074C 3E .BYTE 3EH ; Skip "POP BC" -0597+ 074D C1 POPNOK: POP BC ; Drop address in input buffer -0598+ 074E -0599+ 074E AF PRNTOK: XOR A ; Output "Ok" and get command -0600+ 074F 32 F5 30 LD (CTLOFG),A ; Enable output -0601+ 0752 CD F6 0D CALL STTLIN ; Start new line -0602+ 0755 21 A0 06 LD HL,OKMSG ; "Ok" message -0603+ 0758 CD A1 14 CALL PRS ; Output "Ok" -0604+ 075B 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode -0605+ 075E 22 0C 31 LD (LINEAT),HL ; Save as current line -0606+ 0761 CD 48 09 CALL GETLIN ; Get an input line -0607+ 0764 DA 5B 07 JP C,GETCMD ; Get line again if break -0608+ 0767 CD 5B 0B CALL GETCHR ; Get first character -0609+ 076A 3C INC A ; Test if end of line -0610+ 076B 3D DEC A ; Without affecting Carry -0611+ 076C CA 5B 07 JP Z,GETCMD ; Nothing entered - Get another -0612+ 076F F5 PUSH AF ; Save Carry status -0613+ 0770 CD 27 0C CALL ATOH ; Get line number into DE -0614+ 0773 D5 PUSH DE ; Save line number -0615+ 0774 CD 5F 08 CALL CRUNCH ; Tokenise rest of line -0616+ 0777 47 LD B,A ; Length of tokenised line -0617+ 0778 D1 POP DE ; Restore line number -0618+ 0779 F1 POP AF ; Restore Carry -0619+ 077A D2 3B 0B JP NC,EXCUTE ; No line number - Direct mode -0620+ 077D D5 PUSH DE ; Save line number -0621+ 077E C5 PUSH BC ; Save length of tokenised line -0622+ 077F AF XOR A -0623+ 0780 32 7C 31 LD (LSTBIN),A ; Clear last byte input -0624+ 0783 CD 5B 0B CALL GETCHR ; Get next character -0625+ 0786 B7 OR A ; Set flags -0626+ 0787 F5 PUSH AF ; And save them -0627+ 0788 CD EF 07 CALL SRCHLN ; Search for line number in DE -0628+ 078B DA 94 07 JP C,LINFND ; Jump if line found -0629+ 078E F1 POP AF ; Get status -0630+ 078F F5 PUSH AF ; And re-save -0631+ 0790 CA C8 0C JP Z,ULERR ; Nothing after number - Error -0632+ 0793 B7 OR A ; Clear Carry -0633+ 0794 C5 LINFND: PUSH BC ; Save address of line in prog -0634+ 0795 D2 AB 07 JP NC,INEWLN ; Line not found - Insert new -0635+ 0798 EB EX DE,HL ; Next line address in DE -0636+ 0799 2A 86 31 LD HL,(PROGND) ; End of program -0637+ 079C 1A SFTPRG: LD A,(DE) ; Shift rest of program down -0638+ 079D 02 LD (BC),A -0639+ 079E 03 INC BC ; Next destination -0640+ 079F 13 INC DE ; Next source -0641+ 07A0 CD CB 09 CALL CPDEHL ; All done? -0642+ 07A3 C2 9C 07 JP NZ,SFTPRG ; More to do -0643+ 07A6 60 LD H,B ; HL - New end of program -0644+ 07A7 69 LD L,C -0645+ 07A8 22 86 31 LD (PROGND),HL ; Update end of program -0646+ 07AB -0647+ 07AB D1 INEWLN: POP DE ; Get address of line, -0648+ 07AC F1 POP AF ; Get status -0649+ 07AD CA D2 07 JP Z,SETPTR ; No text - Set up pointers -0650+ 07B0 2A 86 31 LD HL,(PROGND) ; Get end of program -0651+ 07B3 E3 EX (SP),HL ; Get length of input line -0652+ 07B4 C1 POP BC ; End of program to BC -0653+ 07B5 09 ADD HL,BC ; Find new end -0654+ 07B6 E5 PUSH HL ; Save new end -0655+ 07B7 CD CF 06 CALL MOVUP ; Make space for line -0656+ 07BA E1 POP HL ; Restore new end -0657+ 07BB 22 86 31 LD (PROGND),HL ; Update end of program pointer -0658+ 07BE EB EX DE,HL ; Get line to move up in HL -0659+ 07BF 74 LD (HL),H ; Save MSB -0660+ 07C0 D1 POP DE ; Get new line number -0661+ 07C1 23 INC HL ; Skip pointer -0662+ 07C2 23 INC HL -0663+ 07C3 73 LD (HL),E ; Save LSB of line number -0664+ 07C4 23 INC HL -0665+ 07C5 72 LD (HL),D ; Save MSB of line number -0666+ 07C6 23 INC HL ; To first byte in line -0667+ 07C7 11 11 31 LD DE,BUFFER ; Copy buffer to program -0668+ 07CA 1A MOVBUF: LD A,(DE) ; Get source -0669+ 07CB 77 LD (HL),A ; Save destinations -0670+ 07CC 23 INC HL ; Next source -0671+ 07CD 13 INC DE ; Next destination -0672+ 07CE B7 OR A ; Done? -0673+ 07CF C2 CA 07 JP NZ,MOVBUF ; No - Repeat -0674+ 07D2 CD 1B 08 SETPTR: CALL RUNFST ; Set line pointers -0675+ 07D5 23 INC HL ; To LSB of pointer -0676+ 07D6 EB EX DE,HL ; Address to DE -0677+ 07D7 62 PTRLP: LD H,D ; Address to HL -0678+ 07D8 6B LD L,E -0679+ 07D9 7E LD A,(HL) ; Get LSB of pointer -0680+ 07DA 23 INC HL ; To MSB of pointer -0681+ 07DB B6 OR (HL) ; Compare with MSB pointer -0682+ 07DC CA 5B 07 JP Z,GETCMD ; Get command line if end -0683+ 07DF 23 INC HL ; To LSB of line number -0684+ 07E0 23 INC HL ; Skip line number -0685+ 07E1 23 INC HL ; Point to first byte in line -0686+ 07E2 AF XOR A ; Looking for 00 byte -0687+ 07E3 BE FNDEND: CP (HL) ; Found end of line? -0688+ 07E4 23 INC HL ; Move to next byte -0689+ 07E5 C2 E3 07 JP NZ,FNDEND ; No - Keep looking -0690+ 07E8 EB EX DE,HL ; Next line address to HL -0691+ 07E9 73 LD (HL),E ; Save LSB of pointer -0692+ 07EA 23 INC HL -0693+ 07EB 72 LD (HL),D ; Save MSB of pointer -0694+ 07EC C3 D7 07 JP PTRLP ; Do next line -0695+ 07EF -0696+ 07EF 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text -0697+ 07F2 44 SRCHLP: LD B,H ; BC = Address to look at -0698+ 07F3 4D LD C,L -0699+ 07F4 7E LD A,(HL) ; Get address of next line -0700+ 07F5 23 INC HL -0701+ 07F6 B6 OR (HL) ; End of program found? -0702+ 07F7 2B DEC HL -0703+ 07F8 C8 RET Z ; Yes - Line not found -0704+ 07F9 23 INC HL -0705+ 07FA 23 INC HL -0706+ 07FB 7E LD A,(HL) ; Get LSB of line number -0707+ 07FC 23 INC HL -0708+ 07FD 66 LD H,(HL) ; Get MSB of line number -0709+ 07FE 6F LD L,A -0710+ 07FF CD CB 09 CALL CPDEHL ; Compare with line in DE -0711+ 0802 60 LD H,B ; HL = Start of this line -0712+ 0803 69 LD L,C -0713+ 0804 7E LD A,(HL) ; Get LSB of next line address -0714+ 0805 23 INC HL -0715+ 0806 66 LD H,(HL) ; Get MSB of next line address -0716+ 0807 6F LD L,A ; Next line to HL -0717+ 0808 3F CCF -0718+ 0809 C8 RET Z ; Lines found - Exit -0719+ 080A 3F CCF -0720+ 080B D0 RET NC ; Line not found,at line after -0721+ 080C C3 F2 07 JP SRCHLP ; Keep looking -0722+ 080F -0723+ 080F C0 NEW: RET NZ ; Return if any more on line -0724+ 0810 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program -0725+ 0813 AF XOR A ; Set program area to empty -0726+ 0814 77 LD (HL),A ; Save LSB = 00 -0727+ 0815 23 INC HL -0728+ 0816 77 LD (HL),A ; Save MSB = 00 -0729+ 0817 23 INC HL -0730+ 0818 22 86 31 LD (PROGND),HL ; Set program end -0731+ 081B -0732+ 081B 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables -0733+ 081E 2B DEC HL -0734+ 081F -0735+ 081F 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables -0736+ 0822 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -0737+ 0825 22 73 31 LD (STRBOT),HL ; Clear string space -0738+ 0828 AF XOR A -0739+ 0829 CD 6B 0B CALL RESTOR ; Reset DATA pointers -0740+ 082C 2A 86 31 LD HL,(PROGND) ; Get end of program -0741+ 082F 22 88 31 LD (VAREND),HL ; Clear variables -0742+ 0832 22 8A 31 LD (ARREND),HL ; Clear arrays -0743+ 0835 -0744+ 0835 C1 CLREG: POP BC ; Save return address -0745+ 0836 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN -0746+ 0839 F9 LD SP,HL ; Set stack -0747+ 083A 21 63 31 LD HL,TMSTPL ; Temporary string pool -0748+ 083D 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr -0749+ 0840 AF XOR A ; A = 00 -0750+ 0841 6F LD L,A ; HL = 0000 -0751+ 0842 67 LD H,A -0752+ 0843 22 84 31 LD (CONTAD),HL ; No CONTinue -0753+ 0846 32 7B 31 LD (FORFLG),A ; Clear FOR flag -0754+ 0849 22 8E 31 LD (FNRGNM),HL ; Clear FN argument -0755+ 084C E5 PUSH HL ; HL = 0000 -0756+ 084D C5 PUSH BC ; Put back return -0757+ 084E 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN -0758+ 0851 C9 RET ; Return to execution driver -0759+ 0852 -0760+ 0852 3E 3F PROMPT: LD A,'?' ; '?' -0761+ 0854 CD DC 09 CALL OUTC ; Output character -0762+ 0857 3E 20 LD A,' ' ; Space -0763+ 0859 CD DC 09 CALL OUTC ; Output character -0764+ 085C C3 FE 30 JP RINPUT ; Get input line -0765+ 085F -0766+ 085F AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER -0767+ 0860 32 5E 31 LD (DATFLG),A ; Reset literal flag -0768+ 0863 0E 05 LD C,2+3 ; 2 byte number and 3 nulls -0769+ 0865 11 11 31 LD DE,BUFFER ; Start of input buffer -0770+ 0868 7E CRNCLP: LD A,(HL) ; Get byte -0771+ 0869 FE 20 CP ' ' ; Is it a space? -0772+ 086B CA E7 08 JP Z,MOVDIR ; Yes - Copy direct -0773+ 086E 47 LD B,A ; Save character -0774+ 086F FE 22 CP '"' ; Is it a quote? -0775+ 0871 CA 07 09 JP Z,CPYLIT ; Yes - Copy literal string -0776+ 0874 B7 OR A ; Is it end of buffer? -0777+ 0875 CA 0E 09 JP Z,ENDBUF ; Yes - End buffer -0778+ 0878 3A 5E 31 LD A,(DATFLG) ; Get data type -0779+ 087B B7 OR A ; Literal? -0780+ 087C 7E LD A,(HL) ; Get byte to copy -0781+ 087D C2 E7 08 JP NZ,MOVDIR ; Literal - Copy direct -0782+ 0880 FE 3F CP '?' ; Is it '?' short for PRINT -0783+ 0882 3E 9E LD A,ZPRINT ; "PRINT" token -0784+ 0884 CA E7 08 JP Z,MOVDIR ; Yes - replace it -0785+ 0887 7E LD A,(HL) ; Get byte again -0786+ 0888 FE 30 CP '0' ; Is it less than '0' -0787+ 088A DA 92 08 JP C,FNDWRD ; Yes - Look for reserved words -0788+ 088D FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? -0789+ 088F DA E7 08 JP C,MOVDIR ; Yes - copy it direct -0790+ 0892 D5 FNDWRD: PUSH DE ; Look for reserved words -0791+ 0893 11 8B 04 LD DE,WORDS-1 ; Point to table -0792+ 0896 C5 PUSH BC ; Save count -0793+ 0897 01 E3 08 LD BC,RETNAD ; Where to return to -0794+ 089A C5 PUSH BC ; Save return address -0795+ 089B 06 7F LD B,ZEND-1 ; First token value -1 -0796+ 089D 7E LD A,(HL) ; Get byte -0797+ 089E FE 61 CP 'a' ; Less than 'a' ? -0798+ 08A0 DA AB 08 JP C,SEARCH ; Yes - search for words -0799+ 08A3 FE 7B CP 'z'+1 ; Greater than 'z' ? -0800+ 08A5 D2 AB 08 JP NC,SEARCH ; Yes - search for words -0801+ 08A8 E6 5F AND 01011111B ; Force upper case -0802+ 08AA 77 LD (HL),A ; Replace byte -0803+ 08AB 4E SEARCH: LD C,(HL) ; Search for a word -0804+ 08AC EB EX DE,HL -0805+ 08AD 23 GETNXT: INC HL ; Get next reserved word -0806+ 08AE B6 OR (HL) ; Start of word? -0807+ 08AF F2 AD 08 JP P,GETNXT ; No - move on -0808+ 08B2 04 INC B ; Increment token value -0809+ 08B3 7E LD A, (HL) ; Get byte from table -0810+ 08B4 E6 7F AND 01111111B ; Strip bit 7 -0811+ 08B6 C8 RET Z ; Return if end of list -0812+ 08B7 B9 CP C ; Same character as in buffer? -0813+ 08B8 C2 AD 08 JP NZ,GETNXT ; No - get next word -0814+ 08BB EB EX DE,HL -0815+ 08BC E5 PUSH HL ; Save start of word -0816+ 08BD -0817+ 08BD 13 NXTBYT: INC DE ; Look through rest of word -0818+ 08BE 1A LD A,(DE) ; Get byte from table -0819+ 08BF B7 OR A ; End of word ? -0820+ 08C0 FA DF 08 JP M,MATCH ; Yes - Match found -0821+ 08C3 4F LD C,A ; Save it -0822+ 08C4 78 LD A,B ; Get token value -0823+ 08C5 FE 88 CP ZGOTO ; Is it "GOTO" token ? -0824+ 08C7 C2 CE 08 JP NZ,NOSPC ; No - Don't allow spaces -0825+ 08CA CD 5B 0B CALL GETCHR ; Get next character -0826+ 08CD 2B DEC HL ; Cancel increment from GETCHR -0827+ 08CE 23 NOSPC: INC HL ; Next byte -0828+ 08CF 7E LD A,(HL) ; Get byte -0829+ 08D0 FE 61 CP 'a' ; Less than 'a' ? -0830+ 08D2 DA D7 08 JP C,NOCHNG ; Yes - don't change -0831+ 08D5 E6 5F AND 01011111B ; Make upper case -0832+ 08D7 B9 NOCHNG: CP C ; Same as in buffer ? -0833+ 08D8 CA BD 08 JP Z,NXTBYT ; Yes - keep testing -0834+ 08DB E1 POP HL ; Get back start of word -0835+ 08DC C3 AB 08 JP SEARCH ; Look at next word -0836+ 08DF -0837+ 08DF 48 MATCH: LD C,B ; Word found - Save token value -0838+ 08E0 F1 POP AF ; Throw away return -0839+ 08E1 EB EX DE,HL -0840+ 08E2 C9 RET ; Return to "RETNAD" -0841+ 08E3 EB RETNAD: EX DE,HL ; Get address in string -0842+ 08E4 79 LD A,C ; Get token value -0843+ 08E5 C1 POP BC ; Restore buffer length -0844+ 08E6 D1 POP DE ; Get destination address -0845+ 08E7 23 MOVDIR: INC HL ; Next source in buffer -0846+ 08E8 12 LD (DE),A ; Put byte in buffer -0847+ 08E9 13 INC DE ; Move up buffer -0848+ 08EA 0C INC C ; Increment length of buffer -0849+ 08EB D6 3A SUB ':' ; End of statement? -0850+ 08ED CA F5 08 JP Z,SETLIT ; Jump if multi-statement line -0851+ 08F0 FE 49 CP ZDATA-3AH ; Is it DATA statement ? -0852+ 08F2 C2 F8 08 JP NZ,TSTREM ; No - see if REM -0853+ 08F5 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag -0854+ 08F8 D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? -0855+ 08FA C2 68 08 JP NZ,CRNCLP ; No - Leave flag -0856+ 08FD 47 LD B,A ; Copy rest of buffer -0857+ 08FE 7E NXTCHR: LD A,(HL) ; Get byte -0858+ 08FF B7 OR A ; End of line ? -0859+ 0900 CA 0E 09 JP Z,ENDBUF ; Yes - Terminate buffer -0860+ 0903 B8 CP B ; End of statement ? -0861+ 0904 CA E7 08 JP Z,MOVDIR ; Yes - Get next one -0862+ 0907 23 CPYLIT: INC HL ; Move up source string -0863+ 0908 12 LD (DE),A ; Save in destination -0864+ 0909 0C INC C ; Increment length -0865+ 090A 13 INC DE ; Move up destination -0866+ 090B C3 FE 08 JP NXTCHR ; Repeat -0867+ 090E -0868+ 090E 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer -0869+ 0911 12 LD (DE),A ; Mark end of buffer (A = 00) -0870+ 0912 13 INC DE -0871+ 0913 12 LD (DE),A ; A = 00 -0872+ 0914 13 INC DE -0873+ 0915 12 LD (DE),A ; A = 00 -0874+ 0916 C9 RET -0875+ 0917 -0876+ 0917 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status -0877+ 091A B7 OR A ; Is it zero? -0878+ 091B 3E 00 LD A,0 ; Zero A - Leave flags -0879+ 091D 32 F4 30 LD (NULFLG),A ; Zero null flag -0880+ 0920 C2 2B 09 JP NZ,ECHDEL ; Set - Echo it -0881+ 0923 05 DEC B ; Decrement length -0882+ 0924 CA 48 09 JP Z,GETLIN ; Get line again if empty -0883+ 0927 CD DC 09 CALL OUTC ; Output null character -0884+ 092A 3E .BYTE 3EH ; Skip "DEC B" -0885+ 092B 05 ECHDEL: DEC B ; Count bytes in buffer -0886+ 092C 2B DEC HL ; Back space buffer -0887+ 092D CA 3F 09 JP Z,OTKLN ; No buffer - Try again -0888+ 0930 7E LD A,(HL) ; Get deleted byte -0889+ 0931 CD DC 09 CALL OUTC ; Echo it -0890+ 0934 C3 51 09 JP MORINP ; Get more input -0891+ 0937 -0892+ 0937 05 DELCHR: DEC B ; Count bytes in buffer -0893+ 0938 2B DEC HL ; Back space buffer -0894+ 0939 CD DC 09 CALL OUTC ; Output character in A -0895+ 093C C2 51 09 JP NZ,MORINP ; Not end - Get more -0896+ 093F CD DC 09 OTKLN: CALL OUTC ; Output character in A -0897+ 0942 CD 03 0E KILIN: CALL PRNTCRLF ; Output CRLF -0898+ 0945 C3 48 09 JP TTYLIN ; Get line again -0899+ 0948 -0900+ 0948 GETLIN: -0901+ 0948 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character -0902+ 094B 06 01 LD B,1 ; Set buffer as empty -0903+ 094D AF XOR A -0904+ 094E 32 F4 30 LD (NULFLG),A ; Clear null flag -0905+ 0951 CD 06 0A MORINP: CALL CLOTST ; Get character and test ^O -0906+ 0954 4F LD C,A ; Save character in C -0907+ 0955 FE 7F CP DEL ; Delete character? -0908+ 0957 CA 17 09 JP Z,DODEL ; Yes - Process it -0909+ 095A 3A F4 30 LD A,(NULFLG) ; Get null flag -0910+ 095D B7 OR A ; Test null flag status -0911+ 095E CA 6A 09 JP Z,PROCES ; Reset - Process character -0912+ 0961 3E 00 LD A,0 ; Set a null -0913+ 0963 CD DC 09 CALL OUTC ; Output null -0914+ 0966 AF XOR A ; Clear A -0915+ 0967 32 F4 30 LD (NULFLG),A ; Reset null flag -0916+ 096A 79 PROCES: LD A,C ; Get character -0917+ 096B FE 07 CP CTRLG ; Bell? -0918+ 096D CA AE 09 JP Z,PUTCTL ; Yes - Save it -0919+ 0970 FE 03 CP CTRLC ; Is it control "C"? -0920+ 0972 CC 03 0E CALL Z,PRNTCRLF ; Yes - Output CRLF -0921+ 0975 37 SCF ; Flag break -0922+ 0976 C8 RET Z ; Return if control "C" -0923+ 0977 FE 0D CP CR ; Is it enter? -0924+ 0979 CA FE 0D JP Z,ENDINP ; Yes - Terminate input -0925+ 097C FE 15 CP CTRLU ; Is it control "U"? -0926+ 097E CA 42 09 JP Z,KILIN ; Yes - Get another line -0927+ 0981 FE 40 CP '@' ; Is it "kill line"? -0928+ 0983 CA 3F 09 JP Z,OTKLN ; Yes - Kill line -0929+ 0986 FE 5F CP '_' ; Is it delete? -0930+ 0988 CA 37 09 JP Z,DELCHR ; Yes - Delete character -0931+ 098B FE 08 CP BKSP ; Is it backspace? -0932+ 098D CA 37 09 JP Z,DELCHR ; Yes - Delete character -0933+ 0990 FE 12 CP CTRLR ; Is it control "R"? -0934+ 0992 C2 A9 09 JP NZ,PUTBUF ; No - Put in buffer -0935+ 0995 C5 PUSH BC ; Save buffer length -0936+ 0996 D5 PUSH DE ; Save DE -0937+ 0997 E5 PUSH HL ; Save buffer address -0938+ 0998 36 00 LD (HL),0 ; Mark end of buffer -0939+ 099A CD B3 1F CALL OUTNCR ; Output and do CRLF -0940+ 099D 21 11 31 LD HL,BUFFER ; Point to buffer start -0941+ 09A0 CD A1 14 CALL PRS ; Output buffer -0942+ 09A3 E1 POP HL ; Restore buffer address -0943+ 09A4 D1 POP DE ; Restore DE -0944+ 09A5 C1 POP BC ; Restore buffer length -0945+ 09A6 C3 51 09 JP MORINP ; Get another character -0946+ 09A9 -0947+ 09A9 FE 20 PUTBUF: CP ' ' ; Is it a control code? -0948+ 09AB DA 51 09 JP C,MORINP ; Yes - Ignore -0949+ 09AE 78 PUTCTL: LD A,B ; Get number of bytes in buffer -0950+ 09AF FE 49 CP 72+1 ; Test for line overflow -0951+ 09B1 3E 07 LD A,CTRLG ; Set a bell -0952+ 09B3 D2 C3 09 JP NC,OUTNBS ; Ring bell if buffer full -0953+ 09B6 79 LD A,C ; Get character -0954+ 09B7 71 LD (HL),C ; Save in buffer -0955+ 09B8 32 7C 31 LD (LSTBIN),A ; Save last input byte -0956+ 09BB 23 INC HL ; Move up buffer -0957+ 09BC 04 INC B ; Increment length -0958+ 09BD CD DC 09 OUTIT: CALL OUTC ; Output the character entered -0959+ 09C0 C3 51 09 JP MORINP ; Get another character -0960+ 09C3 -0961+ 09C3 CD DC 09 OUTNBS: CALL OUTC ; Output bell and back over it -0962+ 09C6 3E 08 LD A,BKSP ; Set back space -0963+ 09C8 C3 BD 09 JP OUTIT ; Output it and get more -0964+ 09CB -0965+ 09CB 7C CPDEHL: LD A,H ; Get H -0966+ 09CC 92 SUB D ; Compare with D -0967+ 09CD C0 RET NZ ; Different - Exit -0968+ 09CE 7D LD A,L ; Get L -0969+ 09CF 93 SUB E ; Compare with E -0970+ 09D0 C9 RET ; Return status -0971+ 09D1 -0972+ 09D1 7E CHKSYN: LD A,(HL) ; Check syntax of character -0973+ 09D2 E3 EX (SP),HL ; Address of test byte -0974+ 09D3 BE CP (HL) ; Same as in code string? -0975+ 09D4 23 INC HL ; Return address -0976+ 09D5 E3 EX (SP),HL ; Put it back -0977+ 09D6 CA 5B 0B JP Z,GETCHR ; Yes - Get next character -0978+ 09D9 C3 03 07 JP SNERR ; Different - ?SN Error -0979+ 09DC -0980+ 09DC F5 OUTC: PUSH AF ; Save character -0981+ 09DD 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag -0982+ 09E0 B7 OR A ; Is it set? -0983+ 09E1 C2 D6 14 JP NZ,POPAF ; Yes - don't output -0984+ 09E4 F1 POP AF ; Restore character -0985+ 09E5 C5 PUSH BC ; Save buffer length -0986+ 09E6 F5 PUSH AF ; Save character -0987+ 09E7 FE 20 CP ' ' ; Is it a control code? -0988+ 09E9 DA 00 0A JP C,DINPOS ; Yes - Don't INC POS(X) -0989+ 09EC 3A F2 30 LD A,(LWIDTH) ; Get line width -0990+ 09EF 47 LD B,A ; To B -0991+ 09F0 3A 5B 31 LD A,(CURPOS) ; Get cursor position -0992+ 09F3 04 INC B ; Width 255? -0993+ 09F4 CA FC 09 JP Z,INCLEN ; Yes - No width limit -0994+ 09F7 05 DEC B ; Restore width -0995+ 09F8 B8 CP B ; At end of line? -0996+ 09F9 CC 03 0E CALL Z,PRNTCRLF ; Yes - output CRLF -0997+ 09FC 3C INCLEN: INC A ; Move on one character -0998+ 09FD 32 5B 31 LD (CURPOS),A ; Save new position -0999+ 0A00 F1 DINPOS: POP AF ; Restore character -1000+ 0A01 C1 POP BC ; Restore buffer length -1001+ 0A02 CD 9C 1F CALL MONOUT ; Send it -1002+ 0A05 C9 RET -1003+ 0A06 -1004+ 0A06 CD 60 1E CLOTST: CALL GETINP ; Get input character -1005+ 0A09 E6 7F AND 01111111B ; Strip bit 7 -1006+ 0A0B FE 0F CP CTRLO ; Is it control "O"? -1007+ 0A0D C0 RET NZ ; No don't flip flag -1008+ 0A0E 3A F5 30 LD A,(CTLOFG) ; Get flag -1009+ 0A11 2F CPL ; Flip it -1010+ 0A12 32 F5 30 LD (CTLOFG),A ; Put it back -1011+ 0A15 AF XOR A ; Null character -1012+ 0A16 C9 RET -1013+ 0A17 -1014+ 0A17 CD 27 0C LIST: CALL ATOH ; ASCII number to DE -1015+ 0A1A C0 RET NZ ; Return if anything extra -1016+ 0A1B C1 POP BC ; Rubbish - Not needed -1017+ 0A1C CD EF 07 CALL SRCHLN ; Search for line number in DE -1018+ 0A1F C5 PUSH BC ; Save address of line -1019+ 0A20 CD 6D 0A CALL SETLIN ; Set up lines counter -1020+ 0A23 E1 LISTLP: POP HL ; Restore address of line -1021+ 0A24 4E LD C,(HL) ; Get LSB of next line -1022+ 0A25 23 INC HL -1023+ 0A26 46 LD B,(HL) ; Get MSB of next line -1024+ 0A27 23 INC HL -1025+ 0A28 78 LD A,B ; BC = 0 (End of program)? -1026+ 0A29 B1 OR C -1027+ 0A2A CA 4E 07 JP Z,PRNTOK ; Yes - Go to command mode -1028+ 0A2D CD 76 0A CALL COUNT ; Count lines -1029+ 0A30 CD 86 0B CALL TSTBRK ; Test for break key -1030+ 0A33 C5 PUSH BC ; Save address of next line -1031+ 0A34 CD 03 0E CALL PRNTCRLF ; Output CRLF -1032+ 0A37 5E LD E,(HL) ; Get LSB of line number -1033+ 0A38 23 INC HL -1034+ 0A39 56 LD D,(HL) ; Get MSB of line number -1035+ 0A3A 23 INC HL -1036+ 0A3B E5 PUSH HL ; Save address of line start -1037+ 0A3C EB EX DE,HL ; Line number to HL -1038+ 0A3D CD 44 1B CALL PRNTHL ; Output line number in decimal -1039+ 0A40 3E 20 LD A,' ' ; Space after line number -1040+ 0A42 E1 POP HL ; Restore start of line address -1041+ 0A43 CD DC 09 LSTLP2: CALL OUTC ; Output character in A -1042+ 0A46 7E LSTLP3: LD A,(HL) ; Get next byte in line -1043+ 0A47 B7 OR A ; End of line? -1044+ 0A48 23 INC HL ; To next byte in line -1045+ 0A49 CA 23 0A JP Z,LISTLP ; Yes - get next line -1046+ 0A4C F2 43 0A JP P,LSTLP2 ; No token - output it -1047+ 0A4F D6 7F SUB ZEND-1 ; Find and output word -1048+ 0A51 4F LD C,A ; Token offset+1 to C -1049+ 0A52 11 8C 04 LD DE,WORDS ; Reserved word list -1050+ 0A55 1A FNDTOK: LD A,(DE) ; Get character in list -1051+ 0A56 13 INC DE ; Move on to next -1052+ 0A57 B7 OR A ; Is it start of word? -1053+ 0A58 F2 55 0A JP P,FNDTOK ; No - Keep looking for word -1054+ 0A5B 0D DEC C ; Count words -1055+ 0A5C C2 55 0A JP NZ,FNDTOK ; Not there - keep looking -1056+ 0A5F E6 7F OUTWRD: AND 01111111B ; Strip bit 7 -1057+ 0A61 CD DC 09 CALL OUTC ; Output first character -1058+ 0A64 1A LD A,(DE) ; Get next character -1059+ 0A65 13 INC DE ; Move on to next -1060+ 0A66 B7 OR A ; Is it end of word? -1061+ 0A67 F2 5F 0A JP P,OUTWRD ; No - output the rest -1062+ 0A6A C3 46 0A JP LSTLP3 ; Next byte in line -1063+ 0A6D -1064+ 0A6D E5 SETLIN: PUSH HL ; Set up LINES counter -1065+ 0A6E 2A F8 30 LD HL,(LINESN) ; Get LINES number -1066+ 0A71 22 F6 30 LD (LINESC),HL ; Save in LINES counter -1067+ 0A74 E1 POP HL -1068+ 0A75 C9 RET -1069+ 0A76 -1070+ 0A76 E5 COUNT: PUSH HL ; Save code string address -1071+ 0A77 D5 PUSH DE -1072+ 0A78 2A F6 30 LD HL,(LINESC) ; Get LINES counter -1073+ 0A7B 11 FF FF LD DE,-1 -1074+ 0A7E ED 5A ADC HL,DE ; Decrement -1075+ 0A80 22 F6 30 LD (LINESC),HL ; Put it back -1076+ 0A83 D1 POP DE -1077+ 0A84 E1 POP HL ; Restore code string address -1078+ 0A85 F0 RET P ; Return if more lines to go -1079+ 0A86 E5 PUSH HL ; Save code string address -1080+ 0A87 2A F8 30 LD HL,(LINESN) ; Get LINES number -1081+ 0A8A 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1082+ 0A8D CD 60 1E CALL GETINP ; Get input character -1083+ 0A90 FE 03 CP CTRLC ; Is it control "C"? -1084+ 0A92 CA 99 0A JP Z,RSLNBK ; Yes - Reset LINES and break -1085+ 0A95 E1 POP HL ; Restore code string address -1086+ 0A96 C3 76 0A JP COUNT ; Keep on counting -1087+ 0A99 -1088+ 0A99 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number -1089+ 0A9C 22 F6 30 LD (LINESC),HL ; Reset LINES counter -1090+ 0A9F C3 FD 03 JP BRKRET ; Go and output "Break" -1091+ 0AA2 -1092+ 0AA2 3E 64 FOR: LD A,64H ; Flag "FOR" assignment -1093+ 0AA4 32 7B 31 LD (FORFLG),A ; Save "FOR" flag -1094+ 0AA7 CD 09 0D CALL LET ; Set up initial index -1095+ 0AAA C1 POP BC ; Drop RETurn address -1096+ 0AAB E5 PUSH HL ; Save code string address -1097+ 0AAC CD F2 0C CALL DATA ; Get next statement address -1098+ 0AAF 22 77 31 LD (LOOPST),HL ; Save it for start of loop -1099+ 0AB2 21 02 00 LD HL,2 ; Offset for "FOR" block -1100+ 0AB5 39 ADD HL,SP ; Point to it -1101+ 0AB6 CD B0 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block -1102+ 0AB9 D1 POP DE ; Get code string address -1103+ 0ABA C2 D2 0A JP NZ,FORFND ; No nesting found -1104+ 0ABD 09 ADD HL,BC ; Move into "FOR" block -1105+ 0ABE D5 PUSH DE ; Save code string address -1106+ 0ABF 2B DEC HL -1107+ 0AC0 56 LD D,(HL) ; Get MSB of loop statement -1108+ 0AC1 2B DEC HL -1109+ 0AC2 5E LD E,(HL) ; Get LSB of loop statement -1110+ 0AC3 23 INC HL -1111+ 0AC4 23 INC HL -1112+ 0AC5 E5 PUSH HL ; Save block address -1113+ 0AC6 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement -1114+ 0AC9 CD CB 09 CALL CPDEHL ; Compare the FOR loops -1115+ 0ACC E1 POP HL ; Restore block address -1116+ 0ACD C2 B6 0A JP NZ,FORSLP ; Different FORs - Find another -1117+ 0AD0 D1 POP DE ; Restore code string address -1118+ 0AD1 F9 LD SP,HL ; Remove all nested loops -1119+ 0AD2 -1120+ 0AD2 EB FORFND: EX DE,HL ; Code string address to HL -1121+ 0AD3 0E 08 LD C,8 -1122+ 0AD5 CD E0 06 CALL CHKSTK ; Check for 8 levels of stack -1123+ 0AD8 E5 PUSH HL ; Save code string address -1124+ 0AD9 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop -1125+ 0ADC E3 EX (SP),HL ; Save and restore code string -1126+ 0ADD E5 PUSH HL ; Re-save code string address -1127+ 0ADE 2A 0C 31 LD HL,(LINEAT) ; Get current line number -1128+ 0AE1 E3 EX (SP),HL ; Save and restore code string -1129+ 0AE2 CD CB 0F CALL TSTNUM ; Make sure it's a number -1130+ 0AE5 CD D1 09 CALL CHKSYN ; Make sure "TO" is next -1131+ 0AE8 A6 .BYTE ZTO ; "TO" token -1132+ 0AE9 CD C8 0F CALL GETNUM ; Get "TO" expression value -1133+ 0AEC E5 PUSH HL ; Save code string address -1134+ 0AED CD F6 19 CALL BCDEFP ; Move "TO" value to BCDE -1135+ 0AF0 E1 POP HL ; Restore code string address -1136+ 0AF1 C5 PUSH BC ; Save "TO" value in block -1137+ 0AF2 D5 PUSH DE -1138+ 0AF3 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) -1139+ 0AF6 51 LD D,C ; C=0 -1140+ 0AF7 5A LD E,D ; D=0 -1141+ 0AF8 7E LD A,(HL) ; Get next byte in code string -1142+ 0AF9 FE AB CP ZSTEP ; See if "STEP" is stated -1143+ 0AFB 3E 01 LD A,1 ; Sign of step = 1 -1144+ 0AFD C2 0E 0B JP NZ,SAVSTP ; No STEP given - Default to 1 -1145+ 0B00 CD 5B 0B CALL GETCHR ; Jump over "STEP" token -1146+ 0B03 CD C8 0F CALL GETNUM ; Get step value -1147+ 0B06 E5 PUSH HL ; Save code string address -1148+ 0B07 CD F6 19 CALL BCDEFP ; Move STEP to BCDE -1149+ 0B0A CD AA 19 CALL TSTSGN ; Test sign of FPREG -1150+ 0B0D E1 POP HL ; Restore code string address -1151+ 0B0E C5 SAVSTP: PUSH BC ; Save the STEP value in block -1152+ 0B0F D5 PUSH DE -1153+ 0B10 F5 PUSH AF ; Save sign of STEP -1154+ 0B11 33 INC SP ; Don't save flags -1155+ 0B12 E5 PUSH HL ; Save code string address -1156+ 0B13 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable -1157+ 0B16 E3 EX (SP),HL ; Save and restore code string -1158+ 0B17 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker -1159+ 0B19 C5 PUSH BC ; Save it -1160+ 0B1A 33 INC SP ; Don't save C -1161+ 0B1B -1162+ 0B1B CD 86 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break -1163+ 0B1E 22 7E 31 LD (BRKLIN),HL ; Save code address for break -1164+ 0B21 7E LD A,(HL) ; Get next byte in code string -1165+ 0B22 FE 3A CP ':' ; Multi statement line? -1166+ 0B24 CA 3B 0B JP Z,EXCUTE ; Yes - Execute it -1167+ 0B27 B7 OR A ; End of line? -1168+ 0B28 C2 03 07 JP NZ,SNERR ; No - Syntax error -1169+ 0B2B 23 INC HL ; Point to address of next line -1170+ 0B2C 7E LD A,(HL) ; Get LSB of line pointer -1171+ 0B2D 23 INC HL -1172+ 0B2E B6 OR (HL) ; Is it zero (End of prog)? -1173+ 0B2F CA AD 0B JP Z,ENDPRG ; Yes - Terminate execution -1174+ 0B32 23 INC HL ; Point to line number -1175+ 0B33 5E LD E,(HL) ; Get LSB of line number -1176+ 0B34 23 INC HL -1177+ 0B35 56 LD D,(HL) ; Get MSB of line number -1178+ 0B36 EB EX DE,HL ; Line number to HL -1179+ 0B37 22 0C 31 LD (LINEAT),HL ; Save as current line number -1180+ 0B3A EB EX DE,HL ; Line number back to DE -1181+ 0B3B CD 5B 0B EXCUTE: CALL GETCHR ; Get key word -1182+ 0B3E 11 1B 0B LD DE,RUNCNT ; Where to RETurn to -1183+ 0B41 D5 PUSH DE ; Save for RETurn -1184+ 0B42 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT -1185+ 0B43 D6 80 ONJMP: SUB ZEND ; Is it a token? -1186+ 0B45 DA 09 0D JP C,LET ; No - try to assign it -1187+ 0B48 FE 25 CP ZNEW+1-ZEND ; END to NEW ? -1188+ 0B4A D2 03 07 JP NC,SNERR ; Not a key word - ?SN Error -1189+ 0B4D 07 RLCA ; Double it -1190+ 0B4E 4F LD C,A ; BC = Offset into table -1191+ 0B4F 06 00 LD B,0 -1192+ 0B51 EB EX DE,HL ; Save code string address -1193+ 0B52 21 AB 05 LD HL,WORDTB ; Keyword address table -1194+ 0B55 09 ADD HL,BC ; Point to routine address -1195+ 0B56 4E LD C,(HL) ; Get LSB of routine address -1196+ 0B57 23 INC HL -1197+ 0B58 46 LD B,(HL) ; Get MSB of routine address -1198+ 0B59 C5 PUSH BC ; Save routine address -1199+ 0B5A EB EX DE,HL ; Restore code string address -1200+ 0B5B -1201+ 0B5B 23 GETCHR: INC HL ; Point to next character -1202+ 0B5C 7E LD A,(HL) ; Get next code string byte -1203+ 0B5D FE 3A CP ':' ; Z if ':' -1204+ 0B5F D0 RET NC ; NC if > "9" -1205+ 0B60 FE 20 CP ' ' -1206+ 0B62 CA 5B 0B JP Z,GETCHR ; Skip over spaces -1207+ 0B65 FE 30 CP '0' -1208+ 0B67 3F CCF ; NC if < '0' -1209+ 0B68 3C INC A ; Test for zero - Leave carry -1210+ 0B69 3D DEC A ; Z if Null -1211+ 0B6A C9 RET -1212+ 0B6B -1213+ 0B6B EB RESTOR: EX DE,HL ; Save code string address -1214+ 0B6C 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -1215+ 0B6F CA 80 0B JP Z,RESTNL ; Just RESTORE - reset pointer -1216+ 0B72 EB EX DE,HL ; Restore code string address -1217+ 0B73 CD 27 0C CALL ATOH ; Get line number to DE -1218+ 0B76 E5 PUSH HL ; Save code string address -1219+ 0B77 CD EF 07 CALL SRCHLN ; Search for line number in DE -1220+ 0B7A 60 LD H,B ; HL = Address of line -1221+ 0B7B 69 LD L,C -1222+ 0B7C D1 POP DE ; Restore code string address -1223+ 0B7D D2 C8 0C JP NC,ULERR ; ?UL Error if not found -1224+ 0B80 2B RESTNL: DEC HL ; Byte before DATA statement -1225+ 0B81 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer -1226+ 0B84 EB EX DE,HL ; Restore code string address -1227+ 0B85 C9 RET -1228+ 0B86 -1229+ 0B86 -1230+ 0B86 DF TSTBRK: RST 18H ; Check input status -1231+ 0B87 C8 RET Z ; No key, go back -1232+ 0B88 D7 RST 10H ; Get the key into A -1233+ 0B89 FE 1B CP ESC ; Escape key? -1234+ 0B8B 28 11 JR Z,BRK ; Yes, break -1235+ 0B8D FE 03 CP CTRLC ; -1236+ 0B8F 28 0D JR Z,BRK ; Yes, break -1237+ 0B91 FE 13 CP CTRLS ; Stop scrolling? -1238+ 0B93 C0 RET NZ ; Other key, ignore -1239+ 0B94 -1240+ 0B94 -1241+ 0B94 D7 STALL: RST 10H ; Wait for key -1242+ 0B95 FE 11 CP CTRLQ ; Resume scrolling? -1243+ 0B97 C8 RET Z ; Release the chokehold -1244+ 0B98 FE 03 CP CTRLC ; Second break? -1245+ 0B9A 28 07 JR Z,STOP ; Break during hold exits prog -1246+ 0B9C 18 F6 JR STALL ; Loop until or -1247+ 0B9E -1248+ 0B9E 3E FF BRK LD A,$FF ; Set BRKFLG -1249+ 0BA0 32 FD 30 LD (BRKFLG),A ; Store it -1250+ 0BA3 -1251+ 0BA3 -1252+ 0BA3 C0 STOP: RET NZ ; Exit if anything else -1253+ 0BA4 F6 .BYTE 0F6H ; Flag "STOP" -1254+ 0BA5 C0 PEND: RET NZ ; Exit if anything else -1255+ 0BA6 22 7E 31 LD (BRKLIN),HL ; Save point of break -1256+ 0BA9 21 .BYTE 21H ; Skip "OR 11111111B" -1257+ 0BAA F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted -1258+ 0BAC C1 POP BC ; Return not needed and more -1259+ 0BAD 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number -1260+ 0BB0 F5 PUSH AF ; Save STOP / END status -1261+ 0BB1 7D LD A,L ; Is it direct break? -1262+ 0BB2 A4 AND H -1263+ 0BB3 3C INC A ; Line is -1 if direct break -1264+ 0BB4 CA C0 0B JP Z,NOLIN ; Yes - No line number -1265+ 0BB7 22 82 31 LD (ERRLIN),HL ; Save line of break -1266+ 0BBA 2A 7E 31 LD HL,(BRKLIN) ; Get point of break -1267+ 0BBD 22 84 31 LD (CONTAD),HL ; Save point to CONTinue -1268+ 0BC0 AF NOLIN: XOR A -1269+ 0BC1 32 F5 30 LD (CTLOFG),A ; Enable output -1270+ 0BC4 CD F6 0D CALL STTLIN ; Start a new line -1271+ 0BC7 F1 POP AF ; Restore STOP / END status -1272+ 0BC8 21 A6 06 LD HL,BRKMSG ; "Break" message -1273+ 0BCB C2 37 07 JP NZ,ERRIN ; "in line" wanted? -1274+ 0BCE C3 4E 07 JP PRNTOK ; Go to command mode -1275+ 0BD1 -1276+ 0BD1 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address -1277+ 0BD4 7C LD A,H ; Is it zero? -1278+ 0BD5 B5 OR L -1279+ 0BD6 1E 20 LD E,CN ; ?CN Error -1280+ 0BD8 CA 17 07 JP Z,ERROR ; Yes - output "?CN Error" -1281+ 0BDB EB EX DE,HL ; Save code string address -1282+ 0BDC 2A 82 31 LD HL,(ERRLIN) ; Get line of last break -1283+ 0BDF 22 0C 31 LD (LINEAT),HL ; Set up current line number -1284+ 0BE2 EB EX DE,HL ; Restore code string address -1285+ 0BE3 C9 RET ; CONTinue where left off -1286+ 0BE4 -1287+ 0BE4 CD 29 17 NULL: CALL GETINT ; Get integer 0-255 -1288+ 0BE7 C0 RET NZ ; Return if bad value -1289+ 0BE8 32 F1 30 LD (NULLS),A ; Set nulls number -1290+ 0BEB C9 RET -1291+ 0BEC -1292+ 0BEC -1293+ 0BEC E5 ACCSUM: PUSH HL ; Save address in array -1294+ 0BED 2A FA 30 LD HL,(CHKSUM) ; Get check sum -1295+ 0BF0 06 00 LD B,0 ; BC - Value of byte -1296+ 0BF2 4F LD C,A -1297+ 0BF3 09 ADD HL,BC ; Add byte to check sum -1298+ 0BF4 22 FA 30 LD (CHKSUM),HL ; Re-save check sum -1299+ 0BF7 E1 POP HL ; Restore address in array -1300+ 0BF8 C9 RET -1301+ 0BF9 -1302+ 0BF9 7E CHKLTR: LD A,(HL) ; Get byte -1303+ 0BFA FE 41 CP 'A' ; < 'a' ? -1304+ 0BFC D8 RET C ; Carry set if not letter -1305+ 0BFD FE 5B CP 'Z'+1 ; > 'z' ? -1306+ 0BFF 3F CCF -1307+ 0C00 C9 RET ; Carry set if not letter -1308+ 0C01 -1309+ 0C01 CD 5B 0B FPSINT: CALL GETCHR ; Get next character -1310+ 0C04 CD C8 0F POSINT: CALL GETNUM ; Get integer 0 to 32767 -1311+ 0C07 CD AA 19 DEPINT: CALL TSTSGN ; Test sign of FPREG -1312+ 0C0A FA 22 0C JP M,FCERR ; Negative - ?FC Error -1313+ 0C0D 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE -1314+ 0C10 FE 90 CP 80H+16 ; Exponent in range (16 bits)? -1315+ 0C12 DA 52 1A JP C,FPINT ; Yes - convert it -1316+ 0C15 01 80 90 LD BC,9080H ; BCDE = -32768 -1317+ 0C18 11 00 00 LD DE,0000 -1318+ 0C1B E5 PUSH HL ; Save code string address -1319+ 0C1C CD 25 1A CALL CMPNUM ; Compare FPREG with BCDE -1320+ 0C1F E1 POP HL ; Restore code string address -1321+ 0C20 51 LD D,C ; MSB to D -1322+ 0C21 C8 RET Z ; Return if in range -1323+ 0C22 1E 08 FCERR: LD E,FC ; ?FC Error -1324+ 0C24 C3 17 07 JP ERROR ; Output error- -1325+ 0C27 -1326+ 0C27 2B ATOH: DEC HL ; ASCII number to DE binary -1327+ 0C28 11 00 00 GETLN: LD DE,0 ; Get number to DE -1328+ 0C2B CD 5B 0B GTLNLP: CALL GETCHR ; Get next character -1329+ 0C2E D0 RET NC ; Exit if not a digit -1330+ 0C2F E5 PUSH HL ; Save code string address -1331+ 0C30 F5 PUSH AF ; Save digit -1332+ 0C31 21 98 19 LD HL,65529/10 ; Largest number 65529 -1333+ 0C34 CD CB 09 CALL CPDEHL ; Number in range? -1334+ 0C37 DA 03 07 JP C,SNERR ; No - ?SN Error -1335+ 0C3A 62 LD H,D ; HL = Number -1336+ 0C3B 6B LD L,E -1337+ 0C3C 19 ADD HL,DE ; Times 2 -1338+ 0C3D 29 ADD HL,HL ; Times 4 -1339+ 0C3E 19 ADD HL,DE ; Times 5 -1340+ 0C3F 29 ADD HL,HL ; Times 10 -1341+ 0C40 F1 POP AF ; Restore digit -1342+ 0C41 D6 30 SUB '0' ; Make it 0 to 9 -1343+ 0C43 5F LD E,A ; DE = Value of digit -1344+ 0C44 16 00 LD D,0 -1345+ 0C46 19 ADD HL,DE ; Add to number -1346+ 0C47 EB EX DE,HL ; Number to DE -1347+ 0C48 E1 POP HL ; Restore code string address -1348+ 0C49 C3 2B 0C JP GTLNLP ; Go to next character -1349+ 0C4C -1350+ 0C4C CA 1F 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters -1351+ 0C4F CD 04 0C CALL POSINT ; Get integer 0 to 32767 to DE -1352+ 0C52 2B DEC HL ; Cancel increment -1353+ 0C53 CD 5B 0B CALL GETCHR ; Get next character -1354+ 0C56 E5 PUSH HL ; Save code string address -1355+ 0C57 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM -1356+ 0C5A CA 6F 0C JP Z,STORED ; No value given - Use stored -1357+ 0C5D E1 POP HL ; Restore code string address -1358+ 0C5E CD D1 09 CALL CHKSYN ; Check for comma -1359+ 0C61 2C .BYTE ',' -1360+ 0C62 D5 PUSH DE ; Save number -1361+ 0C63 CD 04 0C CALL POSINT ; Get integer 0 to 32767 -1362+ 0C66 2B DEC HL ; Cancel increment -1363+ 0C67 CD 5B 0B CALL GETCHR ; Get next character -1364+ 0C6A C2 03 07 JP NZ,SNERR ; ?SN Error if more on line -1365+ 0C6D E3 EX (SP),HL ; Save code string address -1366+ 0C6E EB EX DE,HL ; Number to DE -1367+ 0C6F 7D STORED: LD A,L ; Get LSB of new RAM top -1368+ 0C70 93 SUB E ; Subtract LSB of string space -1369+ 0C71 5F LD E,A ; Save LSB -1370+ 0C72 7C LD A,H ; Get MSB of new RAM top -1371+ 0C73 9A SBC A,D ; Subtract MSB of string space -1372+ 0C74 57 LD D,A ; Save MSB -1373+ 0C75 DA F8 06 JP C,OMERR ; ?OM Error if not enough mem -1374+ 0C78 E5 PUSH HL ; Save RAM top -1375+ 0C79 2A 86 31 LD HL,(PROGND) ; Get program end -1376+ 0C7C 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM -1377+ 0C7F 09 ADD HL,BC ; Get lowest address -1378+ 0C80 CD CB 09 CALL CPDEHL ; Enough memory? -1379+ 0C83 D2 F8 06 JP NC,OMERR ; No - ?OM Error -1380+ 0C86 EB EX DE,HL ; RAM top to HL -1381+ 0C87 22 0A 31 LD (STRSPC),HL ; Set new string space -1382+ 0C8A E1 POP HL ; End of memory to use -1383+ 0C8B 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM -1384+ 0C8E E1 POP HL ; Restore code string address -1385+ 0C8F C3 1F 08 JP INTVAR ; Initialise variables -1386+ 0C92 -1387+ 0C92 CA 1B 08 RUN: JP Z,RUNFST ; RUN from start if just RUN -1388+ 0C95 CD 1F 08 CALL INTVAR ; Initialise variables -1389+ 0C98 01 1B 0B LD BC,RUNCNT ; Execution driver loop -1390+ 0C9B C3 AE 0C JP RUNLIN ; RUN from line number -1391+ 0C9E -1392+ 0C9E 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed -1393+ 0CA0 CD E0 06 CALL CHKSTK ; Check for 3 levels of stack -1394+ 0CA3 C1 POP BC ; Get return address -1395+ 0CA4 E5 PUSH HL ; Save code string for RETURN -1396+ 0CA5 E5 PUSH HL ; And for GOSUB routine -1397+ 0CA6 2A 0C 31 LD HL,(LINEAT) ; Get current line -1398+ 0CA9 E3 EX (SP),HL ; Into stack - Code string out -1399+ 0CAA 3E 8C LD A,ZGOSUB ; "GOSUB" token -1400+ 0CAC F5 PUSH AF ; Save token -1401+ 0CAD 33 INC SP ; Don't save flags -1402+ 0CAE -1403+ 0CAE C5 RUNLIN: PUSH BC ; Save return address -1404+ 0CAF CD 27 0C GOTO: CALL ATOH ; ASCII number to DE binary -1405+ 0CB2 CD F4 0C CALL REM ; Get end of line -1406+ 0CB5 E5 PUSH HL ; Save end of line -1407+ 0CB6 2A 0C 31 LD HL,(LINEAT) ; Get current line -1408+ 0CB9 CD CB 09 CALL CPDEHL ; Line after current? -1409+ 0CBC E1 POP HL ; Restore end of line -1410+ 0CBD 23 INC HL ; Start of next line -1411+ 0CBE DC F2 07 CALL C,SRCHLP ; Line is after current line -1412+ 0CC1 D4 EF 07 CALL NC,SRCHLN ; Line is before current line -1413+ 0CC4 60 LD H,B ; Set up code string address -1414+ 0CC5 69 LD L,C -1415+ 0CC6 2B DEC HL ; Incremented after -1416+ 0CC7 D8 RET C ; Line found -1417+ 0CC8 1E 0E ULERR: LD E,UL ; ?UL Error -1418+ 0CCA C3 17 07 JP ERROR ; Output error message -1419+ 0CCD -1420+ 0CCD C0 RETURN: RET NZ ; Return if not just RETURN -1421+ 0CCE 16 FF LD D,-1 ; Flag "GOSUB" search -1422+ 0CD0 CD AC 06 CALL BAKSTK ; Look "GOSUB" block -1423+ 0CD3 F9 LD SP,HL ; Kill all FORs in subroutine -1424+ 0CD4 FE 8C CP ZGOSUB ; Test for "GOSUB" token -1425+ 0CD6 1E 04 LD E,RG ; ?RG Error -1426+ 0CD8 C2 17 07 JP NZ,ERROR ; Error if no "GOSUB" found -1427+ 0CDB E1 POP HL ; Get RETURN line number -1428+ 0CDC 22 0C 31 LD (LINEAT),HL ; Save as current -1429+ 0CDF 23 INC HL ; Was it from direct statement? -1430+ 0CE0 7C LD A,H -1431+ 0CE1 B5 OR L ; Return to line -1432+ 0CE2 C2 EC 0C JP NZ,RETLIN ; No - Return to line -1433+ 0CE5 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? -1434+ 0CE8 B7 OR A ; If so buffer is corrupted -1435+ 0CE9 C2 4D 07 JP NZ,POPNOK ; Yes - Go to command mode -1436+ 0CEC 21 1B 0B RETLIN: LD HL,RUNCNT ; Execution driver loop -1437+ 0CEF E3 EX (SP),HL ; Into stack - Code string out -1438+ 0CF0 3E .BYTE 3EH ; Skip "POP HL" -1439+ 0CF1 E1 NXTDTA: POP HL ; Restore code string address -1440+ 0CF2 -1441+ 0CF2 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement -1442+ 0CF4 0E 00 REM: LD C,0 ; 00 End of statement -1443+ 0CF6 06 00 LD B,0 -1444+ 0CF8 79 NXTSTL: LD A,C ; Statement and byte -1445+ 0CF9 48 LD C,B -1446+ 0CFA 47 LD B,A ; Statement end byte -1447+ 0CFB 7E NXTSTT: LD A,(HL) ; Get byte -1448+ 0CFC B7 OR A ; End of line? -1449+ 0CFD C8 RET Z ; Yes - Exit -1450+ 0CFE B8 CP B ; End of statement? -1451+ 0CFF C8 RET Z ; Yes - Exit -1452+ 0D00 23 INC HL ; Next byte -1453+ 0D01 FE 22 CP '"' ; Literal string? -1454+ 0D03 CA F8 0C JP Z,NXTSTL ; Yes - Look for another '"' -1455+ 0D06 C3 FB 0C JP NXTSTT ; Keep looking -1456+ 0D09 -1457+ 0D09 CD BE 11 LET: CALL GETVAR ; Get variable name -1458+ 0D0C CD D1 09 CALL CHKSYN ; Make sure "=" follows -1459+ 0D0F B4 .BYTE ZEQUAL ; "=" token -1460+ 0D10 D5 PUSH DE ; Save address of variable -1461+ 0D11 3A 5D 31 LD A,(TYPE) ; Get data type -1462+ 0D14 F5 PUSH AF ; Save type -1463+ 0D15 CD DA 0F CALL EVAL ; Evaluate expression -1464+ 0D18 F1 POP AF ; Restore type -1465+ 0D19 E3 EX (SP),HL ; Save code - Get var addr -1466+ 0D1A 22 7E 31 LD (BRKLIN),HL ; Save address of variable -1467+ 0D1D 1F RRA ; Adjust type -1468+ 0D1E CD CD 0F CALL CHKTYP ; Check types are the same -1469+ 0D21 CA 5C 0D JP Z,LETNUM ; Numeric - Move value -1470+ 0D24 E5 LETSTR: PUSH HL ; Save address of string var -1471+ 0D25 2A 94 31 LD HL,(FPREG) ; Pointer to string entry -1472+ 0D28 E5 PUSH HL ; Save it on stack -1473+ 0D29 23 INC HL ; Skip over length -1474+ 0D2A 23 INC HL -1475+ 0D2B 5E LD E,(HL) ; LSB of string address -1476+ 0D2C 23 INC HL -1477+ 0D2D 56 LD D,(HL) ; MSB of string address -1478+ 0D2E 2A 0E 31 LD HL,(BASTXT) ; Point to start of program -1479+ 0D31 CD CB 09 CALL CPDEHL ; Is string before program? -1480+ 0D34 D2 4B 0D JP NC,CRESTR ; Yes - Create string entry -1481+ 0D37 2A 0A 31 LD HL,(STRSPC) ; Point to string space -1482+ 0D3A CD CB 09 CALL CPDEHL ; Is string literal in program? -1483+ 0D3D D1 POP DE ; Restore address of string -1484+ 0D3E D2 53 0D JP NC,MVSTPT ; Yes - Set up pointer -1485+ 0D41 21 6F 31 LD HL,TMPSTR ; Temporary string pool -1486+ 0D44 CD CB 09 CALL CPDEHL ; Is string in temporary pool? -1487+ 0D47 D2 53 0D JP NC,MVSTPT ; No - Set up pointer -1488+ 0D4A 3E .BYTE 3EH ; Skip "POP DE" -1489+ 0D4B D1 CRESTR: POP DE ; Restore address of string -1490+ 0D4C CD 02 16 CALL BAKTMP ; Back to last tmp-str entry -1491+ 0D4F EB EX DE,HL ; Address of string entry -1492+ 0D50 CD 3B 14 CALL SAVSTR ; Save string in string area -1493+ 0D53 CD 02 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry -1494+ 0D56 E1 POP HL ; Get string pointer -1495+ 0D57 CD 05 1A CALL DETHL4 ; Move string pointer to var -1496+ 0D5A E1 POP HL ; Restore code string address -1497+ 0D5B C9 RET -1498+ 0D5C -1499+ 0D5C E5 LETNUM: PUSH HL ; Save address of variable -1500+ 0D5D CD 02 1A CALL FPTHL ; Move value to variable -1501+ 0D60 D1 POP DE ; Restore address of variable -1502+ 0D61 E1 POP HL ; Restore code string address -1503+ 0D62 C9 RET -1504+ 0D63 -1505+ 0D63 CD 29 17 ON: CALL GETINT ; Get integer 0-255 -1506+ 0D66 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token -1507+ 0D67 47 LD B,A ; Save in B -1508+ 0D68 FE 8C CP ZGOSUB ; "GOSUB" token? -1509+ 0D6A CA 72 0D JP Z,ONGO ; Yes - Find line number -1510+ 0D6D CD D1 09 CALL CHKSYN ; Make sure it's "GOTO" -1511+ 0D70 88 .BYTE ZGOTO ; "GOTO" token -1512+ 0D71 2B DEC HL ; Cancel increment -1513+ 0D72 4B ONGO: LD C,E ; Integer of branch value -1514+ 0D73 0D ONGOLP: DEC C ; Count branches -1515+ 0D74 78 LD A,B ; Get "GOTO" or "GOSUB" token -1516+ 0D75 CA 43 0B JP Z,ONJMP ; Go to that line if right one -1517+ 0D78 CD 28 0C CALL GETLN ; Get line number to DE -1518+ 0D7B FE 2C CP ',' ; Another line number? -1519+ 0D7D C0 RET NZ ; No - Drop through -1520+ 0D7E C3 73 0D JP ONGOLP ; Yes - loop -1521+ 0D81 -1522+ 0D81 CD DA 0F IF: CALL EVAL ; Evaluate expression -1523+ 0D84 7E LD A,(HL) ; Get token -1524+ 0D85 FE 88 CP ZGOTO ; "GOTO" token? -1525+ 0D87 CA 8F 0D JP Z,IFGO ; Yes - Get line -1526+ 0D8A CD D1 09 CALL CHKSYN ; Make sure it's "THEN" -1527+ 0D8D A9 .BYTE ZTHEN ; "THEN" token -1528+ 0D8E 2B DEC HL ; Cancel increment -1529+ 0D8F CD CB 0F IFGO: CALL TSTNUM ; Make sure it's numeric -1530+ 0D92 CD AA 19 CALL TSTSGN ; Test state of expression -1531+ 0D95 CA F4 0C JP Z,REM ; False - Drop through -1532+ 0D98 CD 5B 0B CALL GETCHR ; Get next character -1533+ 0D9B DA AF 0C JP C,GOTO ; Number - GOTO that line -1534+ 0D9E C3 42 0B JP IFJMP ; Otherwise do statement -1535+ 0DA1 -1536+ 0DA1 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs -1537+ 0DA2 CD 5B 0B CALL GETCHR ; Get next character -1538+ 0DA5 CA 03 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT -1539+ 0DA8 C8 PRNTLP: RET Z ; End of list - Exit -1540+ 0DA9 FE A5 CP ZTAB ; "TAB(" token? -1541+ 0DAB CA 36 0E JP Z,DOTAB ; Yes - Do TAB routine -1542+ 0DAE FE A8 CP ZSPC ; "SPC(" token? -1543+ 0DB0 CA 36 0E JP Z,DOTAB ; Yes - Do SPC routine -1544+ 0DB3 E5 PUSH HL ; Save code string address -1545+ 0DB4 FE 2C CP ',' ; Comma? -1546+ 0DB6 CA 1F 0E JP Z,DOCOM ; Yes - Move to next zone -1547+ 0DB9 FE 3B CP 59 ;";" ; Semi-colon? -1548+ 0DBB CA 59 0E JP Z,NEXITM ; Do semi-colon routine -1549+ 0DBE C1 POP BC ; Code string address to BC -1550+ 0DBF CD DA 0F CALL EVAL ; Evaluate expression -1551+ 0DC2 E5 PUSH HL ; Save code string address -1552+ 0DC3 3A 5D 31 LD A,(TYPE) ; Get variable type -1553+ 0DC6 B7 OR A ; Is it a string variable? -1554+ 0DC7 C2 EF 0D JP NZ,PRNTST ; Yes - Output string contents -1555+ 0DCA CD 4F 1B CALL NUMASC ; Convert number to text -1556+ 0DCD CD 5F 14 CALL CRTST ; Create temporary string -1557+ 0DD0 36 20 LD (HL),' ' ; Followed by a space -1558+ 0DD2 2A 94 31 LD HL,(FPREG) ; Get length of output -1559+ 0DD5 34 INC (HL) ; Plus 1 for the space -1560+ 0DD6 2A 94 31 LD HL,(FPREG) ; < Not needed > -1561+ 0DD9 3A F2 30 LD A,(LWIDTH) ; Get width of line -1562+ 0DDC 47 LD B,A ; To B -1563+ 0DDD 04 INC B ; Width 255 (No limit)? -1564+ 0DDE CA EB 0D JP Z,PRNTNB ; Yes - Output number string -1565+ 0DE1 04 INC B ; Adjust it -1566+ 0DE2 3A 5B 31 LD A,(CURPOS) ; Get cursor position -1567+ 0DE5 86 ADD A,(HL) ; Add length of string -1568+ 0DE6 3D DEC A ; Adjust it -1569+ 0DE7 B8 CP B ; Will output fit on this line? -1570+ 0DE8 D4 03 0E CALL NC,PRNTCRLF ; No - CRLF first -1571+ 0DEB CD A4 14 PRNTNB: CALL PRS1 ; Output string at (HL) -1572+ 0DEE AF XOR A ; Skip CALL by setting 'z' flag -1573+ 0DEF C4 A4 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) -1574+ 0DF2 E1 POP HL ; Restore code string address -1575+ 0DF3 C3 A1 0D JP MRPRNT ; See if more to PRINT -1576+ 0DF6 -1577+ 0DF6 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line -1578+ 0DF9 B7 OR A ; Already at start? -1579+ 0DFA C8 RET Z ; Yes - Do nothing -1580+ 0DFB C3 03 0E JP PRNTCRLF ; Start a new line -1581+ 0DFE -1582+ 0DFE 36 00 ENDINP: LD (HL),0 ; Mark end of buffer -1583+ 0E00 21 10 31 LD HL,BUFFER-1 ; Point to buffer -1584+ 0E03 3E 0D PRNTCRLF: LD A,CR ; Load a CR -1585+ 0E05 CD DC 09 CALL OUTC ; Output character -1586+ 0E08 3E 0A LD A,LF ; Load a LF -1587+ 0E0A CD DC 09 CALL OUTC ; Output character -1588+ 0E0D AF DONULL: XOR A ; Set to position 0 -1589+ 0E0E 32 5B 31 LD (CURPOS),A ; Store it -1590+ 0E11 3A F1 30 LD A,(NULLS) ; Get number of nulls -1591+ 0E14 3D NULLP: DEC A ; Count them -1592+ 0E15 C8 RET Z ; Return if done -1593+ 0E16 F5 PUSH AF ; Save count -1594+ 0E17 AF XOR A ; Load a null -1595+ 0E18 CD DC 09 CALL OUTC ; Output it -1596+ 0E1B F1 POP AF ; Restore count -1597+ 0E1C C3 14 0E JP NULLP ; Keep counting -1598+ 0E1F -1599+ 0E1F 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width -1600+ 0E22 47 LD B,A ; Save in B -1601+ 0E23 3A 5B 31 LD A,(CURPOS) ; Get current position -1602+ 0E26 B8 CP B ; Within the limit? -1603+ 0E27 D4 03 0E CALL NC,PRNTCRLF ; No - output CRLF -1604+ 0E2A D2 59 0E JP NC,NEXITM ; Get next item -1605+ 0E2D D6 0E ZONELP: SUB 14 ; Next zone of 14 characters -1606+ 0E2F D2 2D 0E JP NC,ZONELP ; Repeat if more zones -1607+ 0E32 2F CPL ; Number of spaces to output -1608+ 0E33 C3 4E 0E JP ASPCS ; Output them -1609+ 0E36 -1610+ 0E36 F5 DOTAB: PUSH AF ; Save token -1611+ 0E37 CD 26 17 CALL FNDNUM ; Evaluate expression -1612+ 0E3A CD D1 09 CALL CHKSYN ; Make sure ")" follows -1613+ 0E3D 29 .BYTE ")" -1614+ 0E3E 2B DEC HL ; Back space on to ")" -1615+ 0E3F F1 POP AF ; Restore token -1616+ 0E40 D6 A8 SUB ZSPC ; Was it "SPC(" ? -1617+ 0E42 E5 PUSH HL ; Save code string address -1618+ 0E43 CA 49 0E JP Z,DOSPC ; Yes - Do 'E' spaces -1619+ 0E46 3A 5B 31 LD A,(CURPOS) ; Get current position -1620+ 0E49 2F DOSPC: CPL ; Number of spaces to print to -1621+ 0E4A 83 ADD A,E ; Total number to print -1622+ 0E4B D2 59 0E JP NC,NEXITM ; TAB < Current POS(X) -1623+ 0E4E 3C ASPCS: INC A ; Output A spaces -1624+ 0E4F 47 LD B,A ; Save number to print -1625+ 0E50 3E 20 LD A,' ' ; Space -1626+ 0E52 CD DC 09 SPCLP: CALL OUTC ; Output character in A -1627+ 0E55 05 DEC B ; Count them -1628+ 0E56 C2 52 0E JP NZ,SPCLP ; Repeat if more -1629+ 0E59 E1 NEXITM: POP HL ; Restore code string address -1630+ 0E5A CD 5B 0B CALL GETCHR ; Get next character -1631+ 0E5D C3 A8 0D JP PRNTLP ; More to print -1632+ 0E60 -1633+ 0E60 3F 52 65 64 REDO: .BYTE "?Redo from start",CR,LF,0 -1633+ 0E64 6F 20 66 72 -1633+ 0E68 6F 6D 20 73 -1633+ 0E6C 74 61 72 74 -1633+ 0E70 0D 0A 00 -1634+ 0E73 -1635+ 0E73 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? -1636+ 0E76 B7 OR A -1637+ 0E77 C2 FD 06 JP NZ,DATSNR ; READ - ?SN Error -1638+ 0E7A C1 POP BC ; Throw away code string addr -1639+ 0E7B 21 60 0E LD HL,REDO ; "Redo from start" message -1640+ 0E7E CD A1 14 CALL PRS ; Output string -1641+ 0E81 C3 4E 08 JP DOAGN ; Do last INPUT again -1642+ 0E84 -1643+ 0E84 CD 0C 14 INPUT: CALL IDTEST ; Test for illegal direct -1644+ 0E87 7E LD A,(HL) ; Get character after "INPUT" -1645+ 0E88 FE 22 CP '"' ; Is there a prompt string? -1646+ 0E8A 3E 00 LD A,0 ; Clear A and leave flags -1647+ 0E8C 32 F5 30 LD (CTLOFG),A ; Enable output -1648+ 0E8F C2 9E 0E JP NZ,NOPMPT ; No prompt - get input -1649+ 0E92 CD 60 14 CALL QTSTR ; Get string terminated by '"' -1650+ 0E95 CD D1 09 CALL CHKSYN ; Check for ';' after prompt -1651+ 0E98 3B .BYTE ';' -1652+ 0E99 E5 PUSH HL ; Save code string address -1653+ 0E9A CD A4 14 CALL PRS1 ; Output prompt string -1654+ 0E9D 3E .BYTE 3EH ; Skip "PUSH HL" -1655+ 0E9E E5 NOPMPT: PUSH HL ; Save code string address -1656+ 0E9F CD 52 08 CALL PROMPT ; Get input with "? " prompt -1657+ 0EA2 C1 POP BC ; Restore code string address -1658+ 0EA3 DA AA 0B JP C,INPBRK ; Break pressed - Exit -1659+ 0EA6 23 INC HL ; Next byte -1660+ 0EA7 7E LD A,(HL) ; Get it -1661+ 0EA8 B7 OR A ; End of line? -1662+ 0EA9 2B DEC HL ; Back again -1663+ 0EAA C5 PUSH BC ; Re-save code string address -1664+ 0EAB CA F1 0C JP Z,NXTDTA ; Yes - Find next DATA stmt -1665+ 0EAE 36 2C LD (HL),',' ; Store comma as separator -1666+ 0EB0 C3 B8 0E JP NXTITM ; Get next item -1667+ 0EB3 -1668+ 0EB3 E5 READ: PUSH HL ; Save code string address -1669+ 0EB4 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement -1670+ 0EB7 F6 .BYTE 0F6H ; Flag "READ" -1671+ 0EB8 AF NXTITM: XOR A ; Flag "INPUT" -1672+ 0EB9 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag -1673+ 0EBC E3 EX (SP),HL ; Get code str' , Save pointer -1674+ 0EBD C3 C4 0E JP GTVLUS ; Get values -1675+ 0EC0 -1676+ 0EC0 CD D1 09 NEDMOR: CALL CHKSYN ; Check for comma between items -1677+ 0EC3 2C .BYTE ',' -1678+ 0EC4 CD BE 11 GTVLUS: CALL GETVAR ; Get variable name -1679+ 0EC7 E3 EX (SP),HL ; Save code str" , Get pointer -1680+ 0EC8 D5 PUSH DE ; Save variable address -1681+ 0EC9 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte -1682+ 0ECA FE 2C CP ',' ; Comma? -1683+ 0ECC CA EC 0E JP Z,ANTVLU ; Yes - Get another value -1684+ 0ECF 3A 7D 31 LD A,(READFG) ; Is it READ? -1685+ 0ED2 B7 OR A -1686+ 0ED3 C2 59 0F JP NZ,FDTLP ; Yes - Find next DATA stmt -1687+ 0ED6 3E 3F LD A,'?' ; More INPUT needed -1688+ 0ED8 CD DC 09 CALL OUTC ; Output character -1689+ 0EDB CD 52 08 CALL PROMPT ; Get INPUT with prompt -1690+ 0EDE D1 POP DE ; Variable address -1691+ 0EDF C1 POP BC ; Code string address -1692+ 0EE0 DA AA 0B JP C,INPBRK ; Break pressed -1693+ 0EE3 23 INC HL ; Point to next DATA byte -1694+ 0EE4 7E LD A,(HL) ; Get byte -1695+ 0EE5 B7 OR A ; Is it zero (No input) ? -1696+ 0EE6 2B DEC HL ; Back space INPUT pointer -1697+ 0EE7 C5 PUSH BC ; Save code string address -1698+ 0EE8 CA F1 0C JP Z,NXTDTA ; Find end of buffer -1699+ 0EEB D5 PUSH DE ; Save variable address -1700+ 0EEC 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type -1701+ 0EEF B7 OR A ; Is it numeric? -1702+ 0EF0 CA 16 0F JP Z,INPBIN ; Yes - Convert to binary -1703+ 0EF3 CD 5B 0B CALL GETCHR ; Get next character -1704+ 0EF6 57 LD D,A ; Save input character -1705+ 0EF7 47 LD B,A ; Again -1706+ 0EF8 FE 22 CP '"' ; Start of literal sting? -1707+ 0EFA CA 0A 0F JP Z,STRENT ; Yes - Create string entry -1708+ 0EFD 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -1709+ 0F00 B7 OR A -1710+ 0F01 57 LD D,A ; Save 00 if "INPUT" -1711+ 0F02 CA 07 0F JP Z,ITMSEP ; "INPUT" - End with 00 -1712+ 0F05 16 3A LD D,':' ; "DATA" - End with 00 or ':' -1713+ 0F07 06 2C ITMSEP: LD B,',' ; Item separator -1714+ 0F09 2B DEC HL ; Back space for DTSTR -1715+ 0F0A CD 63 14 STRENT: CALL DTSTR ; Get string terminated by D -1716+ 0F0D EB EX DE,HL ; String address to DE -1717+ 0F0E 21 21 0F LD HL,LTSTND ; Where to go after LETSTR -1718+ 0F11 E3 EX (SP),HL ; Save HL , get input pointer -1719+ 0F12 D5 PUSH DE ; Save address of string -1720+ 0F13 C3 24 0D JP LETSTR ; Assign string to variable -1721+ 0F16 -1722+ 0F16 CD 5B 0B INPBIN: CALL GETCHR ; Get next character -1723+ 0F19 CD B1 1A CALL ASCTFP ; Convert ASCII to FP number -1724+ 0F1C E3 EX (SP),HL ; Save input ptr, Get var addr -1725+ 0F1D CD 02 1A CALL FPTHL ; Move FPREG to variable -1726+ 0F20 E1 POP HL ; Restore input pointer -1727+ 0F21 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs -1728+ 0F22 CD 5B 0B CALL GETCHR ; Get next character -1729+ 0F25 CA 2D 0F JP Z,MORDT ; End of line - More needed? -1730+ 0F28 FE 2C CP ',' ; Another value? -1731+ 0F2A C2 73 0E JP NZ,BADINP ; No - Bad input -1732+ 0F2D E3 MORDT: EX (SP),HL ; Get code string address -1733+ 0F2E 2B DEC HL ; DEC 'cos GETCHR INCs -1734+ 0F2F CD 5B 0B CALL GETCHR ; Get next character -1735+ 0F32 C2 C0 0E JP NZ,NEDMOR ; More needed - Get it -1736+ 0F35 D1 POP DE ; Restore DATA pointer -1737+ 0F36 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? -1738+ 0F39 B7 OR A -1739+ 0F3A EB EX DE,HL ; DATA pointer to HL -1740+ 0F3B C2 81 0B JP NZ,UPDATA ; Update DATA pointer if "READ" -1741+ 0F3E D5 PUSH DE ; Save code string address -1742+ 0F3F B6 OR (HL) ; More input given? -1743+ 0F40 21 48 0F LD HL,EXTIG ; "?Extra ignored" message -1744+ 0F43 C4 A1 14 CALL NZ,PRS ; Output string if extra given -1745+ 0F46 E1 POP HL ; Restore code string address -1746+ 0F47 C9 RET -1747+ 0F48 -1748+ 0F48 3F 45 78 74 EXTIG: .BYTE "?Extra ignored",CR,LF,0 -1748+ 0F4C 72 61 20 69 -1748+ 0F50 67 6E 6F 72 -1748+ 0F54 65 64 0D 0A -1748+ 0F58 00 -1749+ 0F59 -1750+ 0F59 CD F2 0C FDTLP: CALL DATA ; Get next statement -1751+ 0F5C B7 OR A ; End of line? -1752+ 0F5D C2 72 0F JP NZ,FANDT ; No - See if DATA statement -1753+ 0F60 23 INC HL -1754+ 0F61 7E LD A,(HL) ; End of program? -1755+ 0F62 23 INC HL -1756+ 0F63 B6 OR (HL) ; 00 00 Ends program -1757+ 0F64 1E 06 LD E,OD ; ?OD Error -1758+ 0F66 CA 17 07 JP Z,ERROR ; Yes - Out of DATA -1759+ 0F69 23 INC HL -1760+ 0F6A 5E LD E,(HL) ; LSB of line number -1761+ 0F6B 23 INC HL -1762+ 0F6C 56 LD D,(HL) ; MSB of line number -1763+ 0F6D EB EX DE,HL -1764+ 0F6E 22 79 31 LD (DATLIN),HL ; Set line of current DATA item -1765+ 0F71 EB EX DE,HL -1766+ 0F72 CD 5B 0B FANDT: CALL GETCHR ; Get next character -1767+ 0F75 FE 83 CP ZDATA ; "DATA" token -1768+ 0F77 C2 59 0F JP NZ,FDTLP ; No "DATA" - Keep looking -1769+ 0F7A C3 EC 0E JP ANTVLU ; Found - Convert input -1770+ 0F7D -1771+ 0F7D 11 00 00 NEXT: LD DE,0 ; In case no index given -1772+ 0F80 C4 BE 11 NEXT1: CALL NZ,GETVAR ; Get index address -1773+ 0F83 22 7E 31 LD (BRKLIN),HL ; Save code string address -1774+ 0F86 CD AC 06 CALL BAKSTK ; Look for "FOR" block -1775+ 0F89 C2 09 07 JP NZ,NFERR ; No "FOR" - ?NF Error -1776+ 0F8C F9 LD SP,HL ; Clear nested loops -1777+ 0F8D D5 PUSH DE ; Save index address -1778+ 0F8E 7E LD A,(HL) ; Get sign of STEP -1779+ 0F8F 23 INC HL -1780+ 0F90 F5 PUSH AF ; Save sign of STEP -1781+ 0F91 D5 PUSH DE ; Save index address -1782+ 0F92 CD E8 19 CALL PHLTFP ; Move index value to FPREG -1783+ 0F95 E3 EX (SP),HL ; Save address of TO value -1784+ 0F96 E5 PUSH HL ; Save address of index -1785+ 0F97 CD 55 17 CALL ADDPHL ; Add STEP to index value -1786+ 0F9A E1 POP HL ; Restore address of index -1787+ 0F9B CD 02 1A CALL FPTHL ; Move value to index variable -1788+ 0F9E E1 POP HL ; Restore address of TO value -1789+ 0F9F CD F9 19 CALL LOADFP ; Move TO value to BCDE -1790+ 0FA2 E5 PUSH HL ; Save address of line of FOR -1791+ 0FA3 CD 25 1A CALL CMPNUM ; Compare index with TO value -1792+ 0FA6 E1 POP HL ; Restore address of line num -1793+ 0FA7 C1 POP BC ; Address of sign of STEP -1794+ 0FA8 90 SUB B ; Compare with expected sign -1795+ 0FA9 CD F9 19 CALL LOADFP ; BC = Loop stmt,DE = Line num -1796+ 0FAC CA B8 0F JP Z,KILFOR ; Loop finished - Terminate it -1797+ 0FAF EB EX DE,HL ; Loop statement line number -1798+ 0FB0 22 0C 31 LD (LINEAT),HL ; Set loop line number -1799+ 0FB3 69 LD L,C ; Set code string to loop -1800+ 0FB4 60 LD H,B -1801+ 0FB5 C3 17 0B JP PUTFID ; Put back "FOR" and continue -1802+ 0FB8 -1803+ 0FB8 F9 KILFOR: LD SP,HL ; Remove "FOR" block -1804+ 0FB9 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" -1805+ 0FBC 7E LD A,(HL) ; Get next byte in code string -1806+ 0FBD FE 2C CP ',' ; More NEXTs ? -1807+ 0FBF C2 1B 0B JP NZ,RUNCNT ; No - Do next statement -1808+ 0FC2 CD 5B 0B CALL GETCHR ; Position to index name -1809+ 0FC5 CD 80 0F CALL NEXT1 ; Re-enter NEXT routine -1810+ 0FC8 ; < will not RETurn to here , Exit to RUNCNT or Loop > -1811+ 0FC8 -1812+ 0FC8 CD DA 0F GETNUM: CALL EVAL ; Get a numeric expression -1813+ 0FCB F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) -1814+ 0FCC 37 TSTSTR: SCF ; Set carry (string) -1815+ 0FCD 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match -1816+ 0FD0 8F ADC A,A ; Expected + actual -1817+ 0FD1 B7 OR A ; Clear carry , set parity -1818+ 0FD2 E8 RET PE ; Even parity - Types match -1819+ 0FD3 C3 15 07 JP TMERR ; Different types - Error -1820+ 0FD6 -1821+ 0FD6 CD D1 09 OPNPAR: CALL CHKSYN ; Make sure "(" follows -1822+ 0FD9 28 .BYTE "(" -1823+ 0FDA 2B EVAL: DEC HL ; Evaluate expression & save -1824+ 0FDB 16 00 LD D,0 ; Precedence value -1825+ 0FDD D5 EVAL1: PUSH DE ; Save precedence -1826+ 0FDE 0E 01 LD C,1 -1827+ 0FE0 CD E0 06 CALL CHKSTK ; Check for 1 level of stack -1828+ 0FE3 CD 51 10 CALL OPRND ; Get next expression value -1829+ 0FE6 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator -1830+ 0FE9 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr -1831+ 0FEC C1 POP BC ; Precedence value and operator -1832+ 0FED 78 LD A,B ; Get precedence value -1833+ 0FEE FE 78 CP 78H ; "AND" or "OR" ? -1834+ 0FF0 D4 CB 0F CALL NC,TSTNUM ; No - Make sure it's a number -1835+ 0FF3 7E LD A,(HL) ; Get next operator / function -1836+ 0FF4 16 00 LD D,0 ; Clear Last relation -1837+ 0FF6 D6 B3 RLTLP: SUB ZGTR ; ">" Token -1838+ 0FF8 DA 12 10 JP C,FOPRND ; + - * / ^ AND OR - Test it -1839+ 0FFB FE 03 CP ZLTH+1-ZGTR ; < = > -1840+ 0FFD D2 12 10 JP NC,FOPRND ; Function - Call it -1841+ 1000 FE 01 CP ZEQUAL-ZGTR ; "=" -1842+ 1002 17 RLA ; <- Test for legal -1843+ 1003 AA XOR D ; <- combinations of < = > -1844+ 1004 BA CP D ; <- by combining last token -1845+ 1005 57 LD D,A ; <- with current one -1846+ 1006 DA 03 07 JP C,SNERR ; Error if "<<' '==" or ">>" -1847+ 1009 22 75 31 LD (CUROPR),HL ; Save address of current token -1848+ 100C CD 5B 0B CALL GETCHR ; Get next character -1849+ 100F C3 F6 0F JP RLTLP ; Treat the two as one -1850+ 1012 -1851+ 1012 7A FOPRND: LD A,D ; < = > found ? -1852+ 1013 B7 OR A -1853+ 1014 C2 39 11 JP NZ,TSTRED ; Yes - Test for reduction -1854+ 1017 7E LD A,(HL) ; Get operator token -1855+ 1018 22 75 31 LD (CUROPR),HL ; Save operator address -1856+ 101B D6 AC SUB ZPLUS ; Operator or function? -1857+ 101D D8 RET C ; Neither - Exit -1858+ 101E FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? -1859+ 1020 D0 RET NC ; No - Exit -1860+ 1021 5F LD E,A ; Coded operator -1861+ 1022 3A 5D 31 LD A,(TYPE) ; Get data type -1862+ 1025 3D DEC A ; FF = numeric , 00 = string -1863+ 1026 B3 OR E ; Combine with coded operator -1864+ 1027 7B LD A,E ; Get coded operator -1865+ 1028 CA 97 15 JP Z,CONCAT ; String concatenation -1866+ 102B 07 RLCA ; Times 2 -1867+ 102C 83 ADD A,E ; Times 3 -1868+ 102D 5F LD E,A ; To DE (D is 0) -1869+ 102E 21 F5 05 LD HL,PRITAB ; Precedence table -1870+ 1031 19 ADD HL,DE ; To the operator concerned -1871+ 1032 78 LD A,B ; Last operator precedence -1872+ 1033 56 LD D,(HL) ; Get evaluation precedence -1873+ 1034 BA CP D ; Compare with eval precedence -1874+ 1035 D0 RET NC ; Exit if higher precedence -1875+ 1036 23 INC HL ; Point to routine address -1876+ 1037 CD CB 0F CALL TSTNUM ; Make sure it's a number -1877+ 103A -1878+ 103A C5 STKTHS: PUSH BC ; Save last precedence & token -1879+ 103B 01 E9 0F LD BC,EVAL3 ; Where to go on prec' break -1880+ 103E C5 PUSH BC ; Save on stack for return -1881+ 103F 43 LD B,E ; Save operator -1882+ 1040 4A LD C,D ; Save precedence -1883+ 1041 CD DB 19 CALL STAKFP ; Move value to stack -1884+ 1044 58 LD E,B ; Restore operator -1885+ 1045 51 LD D,C ; Restore precedence -1886+ 1046 4E LD C,(HL) ; Get LSB of routine address -1887+ 1047 23 INC HL -1888+ 1048 46 LD B,(HL) ; Get MSB of routine address -1889+ 1049 23 INC HL -1890+ 104A C5 PUSH BC ; Save routine address -1891+ 104B 2A 75 31 LD HL,(CUROPR) ; Address of current operator -1892+ 104E C3 DD 0F JP EVAL1 ; Loop until prec' break -1893+ 1051 -1894+ 1051 AF OPRND: XOR A ; Get operand routine -1895+ 1052 32 5D 31 LD (TYPE),A ; Set numeric expected -1896+ 1055 CD 5B 0B CALL GETCHR ; Get next character -1897+ 1058 1E 24 LD E,MO ; ?MO Error -1898+ 105A CA 17 07 JP Z,ERROR ; No operand - Error -1899+ 105D DA B1 1A JP C,ASCTFP ; Number - Get value -1900+ 1060 CD F9 0B CALL CHKLTR ; See if a letter -1901+ 1063 D2 B8 10 JP NC,CONVAR ; Letter - Find variable -1902+ 1066 FE 26 CP '&' ; &H = HEX, &B = BINARY -1903+ 1068 20 12 JR NZ, NOTAMP -1904+ 106A CD 5B 0B CALL GETCHR ; Get next character -1905+ 106D FE 48 CP 'H' ; Hex number indicated? [function added] -1906+ 106F CA F5 1E JP Z,HEXTFP ; Convert Hex to FPREG -1907+ 1072 FE 42 CP 'B' ; Binary number indicated? [function added] -1908+ 1074 CA 65 1F JP Z,BINTFP ; Convert Bin to FPREG -1909+ 1077 1E 02 LD E,SN ; If neither then a ?SN Error -1910+ 1079 CA 17 07 JP Z,ERROR ; -1911+ 107C FE AC NOTAMP: CP ZPLUS ; '+' Token ? -1912+ 107E CA 51 10 JP Z,OPRND ; Yes - Look for operand -1913+ 1081 FE 2E CP '.' ; '.' ? -1914+ 1083 CA B1 1A JP Z,ASCTFP ; Yes - Create FP number -1915+ 1086 FE AD CP ZMINUS ; '-' Token ? -1916+ 1088 CA A7 10 JP Z,MINUS ; Yes - Do minus -1917+ 108B FE 22 CP '"' ; Literal string ? -1918+ 108D CA 60 14 JP Z,QTSTR ; Get string terminated by '"' -1919+ 1090 FE AA CP ZNOT ; "NOT" Token ? -1920+ 1092 CA 99 11 JP Z,EVNOT ; Yes - Eval NOT expression -1921+ 1095 FE A7 CP ZFN ; "FN" Token ? -1922+ 1097 CA C4 13 JP Z,DOFN ; Yes - Do FN routine -1923+ 109A D6 B6 SUB ZSGN ; Is it a function? -1924+ 109C D2 C9 10 JP NC,FNOFST ; Yes - Evaluate function -1925+ 109F CD D6 0F EVLPAR: CALL OPNPAR ; Evaluate expression in "()" -1926+ 10A2 CD D1 09 CALL CHKSYN ; Make sure ")" follows -1927+ 10A5 29 .BYTE ")" -1928+ 10A6 C9 RET -1929+ 10A7 -1930+ 10A7 16 7D MINUS: LD D,7DH ; '-' precedence -1931+ 10A9 CD DD 0F CALL EVAL1 ; Evaluate until prec' break -1932+ 10AC 2A 80 31 LD HL,(NXTOPR) ; Get next operator address -1933+ 10AF E5 PUSH HL ; Save next operator address -1934+ 10B0 CD D3 19 CALL INVSGN ; Negate value -1935+ 10B3 CD CB 0F RETNUM: CALL TSTNUM ; Make sure it's a number -1936+ 10B6 E1 POP HL ; Restore next operator address -1937+ 10B7 C9 RET -1938+ 10B8 -1939+ 10B8 CD BE 11 CONVAR: CALL GETVAR ; Get variable address to DE -1940+ 10BB E5 FRMEVL: PUSH HL ; Save code string address -1941+ 10BC EB EX DE,HL ; Variable address to HL -1942+ 10BD 22 94 31 LD (FPREG),HL ; Save address of variable -1943+ 10C0 3A 5D 31 LD A,(TYPE) ; Get type -1944+ 10C3 B7 OR A ; Numeric? -1945+ 10C4 CC E8 19 CALL Z,PHLTFP ; Yes - Move contents to FPREG -1946+ 10C7 E1 POP HL ; Restore code string address -1947+ 10C8 C9 RET -1948+ 10C9 -1949+ 10C9 06 00 FNOFST: LD B,0 ; Get address of function -1950+ 10CB 07 RLCA ; Double function offset -1951+ 10CC 4F LD C,A ; BC = Offset in function table -1952+ 10CD C5 PUSH BC ; Save adjusted token value -1953+ 10CE CD 5B 0B CALL GETCHR ; Get next character -1954+ 10D1 79 LD A,C ; Get adjusted token value -1955+ 10D2 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? -1956+ 10D4 DA F0 10 JP C,FNVAL ; No - Do function -1957+ 10D7 CD D6 0F CALL OPNPAR ; Evaluate expression (X,... -1958+ 10DA CD D1 09 CALL CHKSYN ; Make sure ',' follows -1959+ 10DD 2C .BYTE ',' -1960+ 10DE CD CC 0F CALL TSTSTR ; Make sure it's a string -1961+ 10E1 EB EX DE,HL ; Save code string address -1962+ 10E2 2A 94 31 LD HL,(FPREG) ; Get address of string -1963+ 10E5 E3 EX (SP),HL ; Save address of string -1964+ 10E6 E5 PUSH HL ; Save adjusted token value -1965+ 10E7 EB EX DE,HL ; Restore code string address -1966+ 10E8 CD 29 17 CALL GETINT ; Get integer 0-255 -1967+ 10EB EB EX DE,HL ; Save code string address -1968+ 10EC E3 EX (SP),HL ; Save integer,HL = adj' token -1969+ 10ED C3 F8 10 JP GOFUNC ; Jump to string function -1970+ 10F0 -1971+ 10F0 CD 9F 10 FNVAL: CALL EVLPAR ; Evaluate expression -1972+ 10F3 E3 EX (SP),HL ; HL = Adjusted token value -1973+ 10F4 11 B3 10 LD DE,RETNUM ; Return number from function -1974+ 10F7 D5 PUSH DE ; Save on stack -1975+ 10F8 01 54 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses -1976+ 10FB 09 ADD HL,BC ; Point to right address -1977+ 10FC 4E LD C,(HL) ; Get LSB of address -1978+ 10FD 23 INC HL ; -1979+ 10FE 66 LD H,(HL) ; Get MSB of address -1980+ 10FF 69 LD L,C ; Address to HL -1981+ 1100 E9 JP (HL) ; Jump to function -1982+ 1101 -1983+ 1101 15 SGNEXP: DEC D ; Dee to flag negative exponent -1984+ 1102 FE AD CP ZMINUS ; '-' token ? -1985+ 1104 C8 RET Z ; Yes - Return -1986+ 1105 FE 2D CP '-' ; '-' ASCII ? -1987+ 1107 C8 RET Z ; Yes - Return -1988+ 1108 14 INC D ; Inc to flag positive exponent -1989+ 1109 FE 2B CP '+' ; '+' ASCII ? -1990+ 110B C8 RET Z ; Yes - Return -1991+ 110C FE AC CP ZPLUS ; '+' token ? -1992+ 110E C8 RET Z ; Yes - Return -1993+ 110F 2B DEC HL ; DEC 'cos GETCHR INCs -1994+ 1110 C9 RET ; Return "NZ" -1995+ 1111 -1996+ 1111 F6 POR: .BYTE 0F6H ; Flag "OR" -1997+ 1112 AF PAND: XOR A ; Flag "AND" -1998+ 1113 F5 PUSH AF ; Save "AND" / "OR" flag -1999+ 1114 CD CB 0F CALL TSTNUM ; Make sure it's a number -2000+ 1117 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -2001+ 111A F1 POP AF ; Restore "AND" / "OR" flag -2002+ 111B EB EX DE,HL ; <- Get last -2003+ 111C C1 POP BC ; <- value -2004+ 111D E3 EX (SP),HL ; <- from -2005+ 111E EB EX DE,HL ; <- stack -2006+ 111F CD EB 19 CALL FPBCDE ; Move last value to FPREG -2007+ 1122 F5 PUSH AF ; Save "AND" / "OR" flag -2008+ 1123 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -2009+ 1126 F1 POP AF ; Restore "AND" / "OR" flag -2010+ 1127 C1 POP BC ; Get value -2011+ 1128 79 LD A,C ; Get LSB -2012+ 1129 21 82 13 LD HL,ACPASS ; Address of save AC as current -2013+ 112C C2 34 11 JP NZ,POR1 ; Jump if OR -2014+ 112F A3 AND E ; "AND" LSBs -2015+ 1130 4F LD C,A ; Save LSB -2016+ 1131 78 LD A,B ; Get MBS -2017+ 1132 A2 AND D ; "AND" MSBs -2018+ 1133 E9 JP (HL) ; Save AC as current (ACPASS) -2019+ 1134 -2020+ 1134 B3 POR1: OR E ; "OR" LSBs -2021+ 1135 4F LD C,A ; Save LSB -2022+ 1136 78 LD A,B ; Get MSB -2023+ 1137 B2 OR D ; "OR" MSBs -2024+ 1138 E9 JP (HL) ; Save AC as current (ACPASS) -2025+ 1139 -2026+ 1139 21 4B 11 TSTRED: LD HL,CMPLOG ; Logical compare routine -2027+ 113C 3A 5D 31 LD A,(TYPE) ; Get data type -2028+ 113F 1F RRA ; Carry set = string -2029+ 1140 7A LD A,D ; Get last precedence value -2030+ 1141 17 RLA ; Times 2 plus carry -2031+ 1142 5F LD E,A ; To E -2032+ 1143 16 64 LD D,64H ; Relational precedence -2033+ 1145 78 LD A,B ; Get current precedence -2034+ 1146 BA CP D ; Compare with last -2035+ 1147 D0 RET NC ; Eval if last was rel' or log' -2036+ 1148 C3 3A 10 JP STKTHS ; Stack this one and get next -2037+ 114B -2038+ 114B 4D 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings -2039+ 114D 79 CMPLG1: LD A,C ; Get data type -2040+ 114E B7 OR A -2041+ 114F 1F RRA -2042+ 1150 C1 POP BC ; Get last expression to BCDE -2043+ 1151 D1 POP DE -2044+ 1152 F5 PUSH AF ; Save status -2045+ 1153 CD CD 0F CALL CHKTYP ; Check that types match -2046+ 1156 21 8F 11 LD HL,CMPRES ; Result to comparison -2047+ 1159 E5 PUSH HL ; Save for RETurn -2048+ 115A CA 25 1A JP Z,CMPNUM ; Compare values if numeric -2049+ 115D AF XOR A ; Compare two strings -2050+ 115E 32 5D 31 LD (TYPE),A ; Set type to numeric -2051+ 1161 D5 PUSH DE ; Save string name -2052+ 1162 CD E4 15 CALL GSTRCU ; Get current string -2053+ 1165 7E LD A,(HL) ; Get length of string -2054+ 1166 23 INC HL -2055+ 1167 23 INC HL -2056+ 1168 4E LD C,(HL) ; Get LSB of address -2057+ 1169 23 INC HL -2058+ 116A 46 LD B,(HL) ; Get MSB of address -2059+ 116B D1 POP DE ; Restore string name -2060+ 116C C5 PUSH BC ; Save address of string -2061+ 116D F5 PUSH AF ; Save length of string -2062+ 116E CD E8 15 CALL GSTRDE ; Get second string -2063+ 1171 CD F9 19 CALL LOADFP ; Get address of second string -2064+ 1174 F1 POP AF ; Restore length of string 1 -2065+ 1175 57 LD D,A ; Length to D -2066+ 1176 E1 POP HL ; Restore address of string 1 -2067+ 1177 7B CMPSTR: LD A,E ; Bytes of string 2 to do -2068+ 1178 B2 OR D ; Bytes of string 1 to do -2069+ 1179 C8 RET Z ; Exit if all bytes compared -2070+ 117A 7A LD A,D ; Get bytes of string 1 to do -2071+ 117B D6 01 SUB 1 -2072+ 117D D8 RET C ; Exit if end of string 1 -2073+ 117E AF XOR A -2074+ 117F BB CP E ; Bytes of string 2 to do -2075+ 1180 3C INC A -2076+ 1181 D0 RET NC ; Exit if end of string 2 -2077+ 1182 15 DEC D ; Count bytes in string 1 -2078+ 1183 1D DEC E ; Count bytes in string 2 -2079+ 1184 0A LD A,(BC) ; Byte in string 2 -2080+ 1185 BE CP (HL) ; Compare to byte in string 1 -2081+ 1186 23 INC HL ; Move up string 1 -2082+ 1187 03 INC BC ; Move up string 2 -2083+ 1188 CA 77 11 JP Z,CMPSTR ; Same - Try next bytes -2084+ 118B 3F CCF ; Flag difference (">" or "<") -2085+ 118C C3 B5 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 -2086+ 118F -2087+ 118F 3C CMPRES: INC A ; Increment current value -2088+ 1190 8F ADC A,A ; Double plus carry -2089+ 1191 C1 POP BC ; Get other value -2090+ 1192 A0 AND B ; Combine them -2091+ 1193 C6 FF ADD A,-1 ; Carry set if different -2092+ 1195 9F SBC A,A ; 00 - Equal , FF - Different -2093+ 1196 C3 BC 19 JP FLGREL ; Set current value & continue -2094+ 1199 -2095+ 1199 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" -2096+ 119B CD DD 0F CALL EVAL1 ; Eval until precedence break -2097+ 119E CD CB 0F CALL TSTNUM ; Make sure it's a number -2098+ 11A1 CD 0D 0C CALL DEINT ; Get integer -32768 - 32767 -2099+ 11A4 7B LD A,E ; Get LSB -2100+ 11A5 2F CPL ; Invert LSB -2101+ 11A6 4F LD C,A ; Save "NOT" of LSB -2102+ 11A7 7A LD A,D ; Get MSB -2103+ 11A8 2F CPL ; Invert MSB -2104+ 11A9 CD 82 13 CALL ACPASS ; Save AC as current -2105+ 11AC C1 POP BC ; Clean up stack -2106+ 11AD C3 E9 0F JP EVAL3 ; Continue evaluation -2107+ 11B0 -2108+ 11B0 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs -2109+ 11B1 CD 5B 0B CALL GETCHR ; Get next character -2110+ 11B4 C8 RET Z ; End of DIM statement -2111+ 11B5 CD D1 09 CALL CHKSYN ; Make sure ',' follows -2112+ 11B8 2C .BYTE ',' -2113+ 11B9 01 B0 11 DIM: LD BC,DIMRET ; Return to "DIMRET" -2114+ 11BC C5 PUSH BC ; Save on stack -2115+ 11BD F6 .BYTE 0F6H ; Flag "Create" variable -2116+ 11BE AF GETVAR: XOR A ; Find variable address,to DE -2117+ 11BF 32 5C 31 LD (LCRFLG),A ; Set locate / create flag -2118+ 11C2 46 LD B,(HL) ; Get First byte of name -2119+ 11C3 CD F9 0B GTFNAM: CALL CHKLTR ; See if a letter -2120+ 11C6 DA 03 07 JP C,SNERR ; ?SN Error if not a letter -2121+ 11C9 AF XOR A -2122+ 11CA 4F LD C,A ; Clear second byte of name -2123+ 11CB 32 5D 31 LD (TYPE),A ; Set type to numeric -2124+ 11CE CD 5B 0B CALL GETCHR ; Get next character -2125+ 11D1 DA DA 11 JP C,SVNAM2 ; Numeric - Save in name -2126+ 11D4 CD F9 0B CALL CHKLTR ; See if a letter -2127+ 11D7 DA E7 11 JP C,CHARTY ; Not a letter - Check type -2128+ 11DA 4F SVNAM2: LD C,A ; Save second byte of name -2129+ 11DB CD 5B 0B ENDNAM: CALL GETCHR ; Get next character -2130+ 11DE DA DB 11 JP C,ENDNAM ; Numeric - Get another -2131+ 11E1 CD F9 0B CALL CHKLTR ; See if a letter -2132+ 11E4 D2 DB 11 JP NC,ENDNAM ; Letter - Get another -2133+ 11E7 D6 24 CHARTY: SUB '$' ; String variable? -2134+ 11E9 C2 F6 11 JP NZ,NOTSTR ; No - Numeric variable -2135+ 11EC 3C INC A ; A = 1 (string type) -2136+ 11ED 32 5D 31 LD (TYPE),A ; Set type to string -2137+ 11F0 0F RRCA ; A = 80H , Flag for string -2138+ 11F1 81 ADD A,C ; 2nd byte of name has bit 7 on -2139+ 11F2 4F LD C,A ; Resave second byte on name -2140+ 11F3 CD 5B 0B CALL GETCHR ; Get next character -2141+ 11F6 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? -2142+ 11F9 3D DEC A -2143+ 11FA CA A3 12 JP Z,ARLDSV ; Yes - Get array name -2144+ 11FD F2 06 12 JP P,NSCFOR ; No array with "FOR" or "FN" -2145+ 1200 7E LD A,(HL) ; Get byte again -2146+ 1201 D6 28 SUB '(' ; Subscripted variable? -2147+ 1203 CA 7B 12 JP Z,SBSCPT ; Yes - Sort out subscript -2148+ 1206 -2149+ 1206 AF NSCFOR: XOR A ; Simple variable -2150+ 1207 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag -2151+ 120A E5 PUSH HL ; Save code string address -2152+ 120B 50 LD D,B ; DE = Variable name to find -2153+ 120C 59 LD E,C -2154+ 120D 2A 8E 31 LD HL,(FNRGNM) ; FN argument name -2155+ 1210 CD CB 09 CALL CPDEHL ; Is it the FN argument? -2156+ 1213 11 90 31 LD DE,FNARG ; Point to argument value -2157+ 1216 CA EB 18 JP Z,POPHRT ; Yes - Return FN argument value -2158+ 1219 2A 88 31 LD HL,(VAREND) ; End of variables -2159+ 121C EB EX DE,HL ; Address of end of search -2160+ 121D 2A 86 31 LD HL,(PROGND) ; Start of variables address -2161+ 1220 CD CB 09 FNDVAR: CALL CPDEHL ; End of variable list table? -2162+ 1223 CA 39 12 JP Z,CFEVAL ; Yes - Called from EVAL? -2163+ 1226 79 LD A,C ; Get second byte of name -2164+ 1227 96 SUB (HL) ; Compare with name in list -2165+ 1228 23 INC HL ; Move on to first byte -2166+ 1229 C2 2E 12 JP NZ,FNTHR ; Different - Find another -2167+ 122C 78 LD A,B ; Get first byte of name -2168+ 122D 96 SUB (HL) ; Compare with name in list -2169+ 122E 23 FNTHR: INC HL ; Move on to LSB of value -2170+ 122F CA 6D 12 JP Z,RETADR ; Found - Return address -2171+ 1232 23 INC HL ; <- Skip -2172+ 1233 23 INC HL ; <- over -2173+ 1234 23 INC HL ; <- F.P. -2174+ 1235 23 INC HL ; <- value -2175+ 1236 C3 20 12 JP FNDVAR ; Keep looking -2176+ 1239 -2177+ 1239 E1 CFEVAL: POP HL ; Restore code string address -2178+ 123A E3 EX (SP),HL ; Get return address -2179+ 123B D5 PUSH DE ; Save address of variable -2180+ 123C 11 BB 10 LD DE,FRMEVL ; Return address in EVAL -2181+ 123F CD CB 09 CALL CPDEHL ; Called from EVAL ? -2182+ 1242 D1 POP DE ; Restore address of variable -2183+ 1243 CA 70 12 JP Z,RETNUL ; Yes - Return null variable -2184+ 1246 E3 EX (SP),HL ; Put back return -2185+ 1247 E5 PUSH HL ; Save code string address -2186+ 1248 C5 PUSH BC ; Save variable name -2187+ 1249 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data -2188+ 124C 2A 8A 31 LD HL,(ARREND) ; End of arrays -2189+ 124F E5 PUSH HL ; Save end of arrays -2190+ 1250 09 ADD HL,BC ; Move up 6 bytes -2191+ 1251 C1 POP BC ; Source address in BC -2192+ 1252 E5 PUSH HL ; Save new end address -2193+ 1253 CD CF 06 CALL MOVUP ; Move arrays up -2194+ 1256 E1 POP HL ; Restore new end address -2195+ 1257 22 8A 31 LD (ARREND),HL ; Set new end address -2196+ 125A 60 LD H,B ; End of variables to HL -2197+ 125B 69 LD L,C -2198+ 125C 22 88 31 LD (VAREND),HL ; Set new end address -2199+ 125F -2200+ 125F 2B ZEROLP: DEC HL ; Back through to zero variable -2201+ 1260 36 00 LD (HL),0 ; Zero byte in variable -2202+ 1262 CD CB 09 CALL CPDEHL ; Done them all? -2203+ 1265 C2 5F 12 JP NZ,ZEROLP ; No - Keep on going -2204+ 1268 D1 POP DE ; Get variable name -2205+ 1269 73 LD (HL),E ; Store second character -2206+ 126A 23 INC HL -2207+ 126B 72 LD (HL),D ; Store first character -2208+ 126C 23 INC HL -2209+ 126D EB RETADR: EX DE,HL ; Address of variable in DE -2210+ 126E E1 POP HL ; Restore code string address -2211+ 126F C9 RET -2212+ 1270 -2213+ 1270 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero -2214+ 1273 21 9F 06 LD HL,ZERBYT ; Also set a null string -2215+ 1276 22 94 31 LD (FPREG),HL ; Save for EVAL -2216+ 1279 E1 POP HL ; Restore code string address -2217+ 127A C9 RET -2218+ 127B -2219+ 127B E5 SBSCPT: PUSH HL ; Save code string address -2220+ 127C 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type -2221+ 127F E3 EX (SP),HL ; Save and get code string -2222+ 1280 57 LD D,A ; Zero number of dimensions -2223+ 1281 D5 SCPTLP: PUSH DE ; Save number of dimensions -2224+ 1282 C5 PUSH BC ; Save array name -2225+ 1283 CD 01 0C CALL FPSINT ; Get subscript (0-32767) -2226+ 1286 C1 POP BC ; Restore array name -2227+ 1287 F1 POP AF ; Get number of dimensions -2228+ 1288 EB EX DE,HL -2229+ 1289 E3 EX (SP),HL ; Save subscript value -2230+ 128A E5 PUSH HL ; Save LCRFLG and TYPE -2231+ 128B EB EX DE,HL -2232+ 128C 3C INC A ; Count dimensions -2233+ 128D 57 LD D,A ; Save in D -2234+ 128E 7E LD A,(HL) ; Get next byte in code string -2235+ 128F FE 2C CP ',' ; Comma (more to come)? -2236+ 1291 CA 81 12 JP Z,SCPTLP ; Yes - More subscripts -2237+ 1294 CD D1 09 CALL CHKSYN ; Make sure ")" follows -2238+ 1297 29 .BYTE ")" -2239+ 1298 22 80 31 LD (NXTOPR),HL ; Save code string address -2240+ 129B E1 POP HL ; Get LCRFLG and TYPE -2241+ 129C 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type -2242+ 129F 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* -2243+ 12A1 D5 PUSH DE ; Save number of dimensions (D) -2244+ 12A2 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' -2245+ 12A3 -2246+ 12A3 E5 ARLDSV: PUSH HL ; Save code string address -2247+ 12A4 F5 PUSH AF ; A = 00 , Flags set = Z,N -2248+ 12A5 2A 88 31 LD HL,(VAREND) ; Start of arrays -2249+ 12A8 3E .BYTE 3EH ; Skip "ADD HL,DE" -2250+ 12A9 19 FNDARY: ADD HL,DE ; Move to next array start -2251+ 12AA EB EX DE,HL -2252+ 12AB 2A 8A 31 LD HL,(ARREND) ; End of arrays -2253+ 12AE EB EX DE,HL ; Current array pointer -2254+ 12AF CD CB 09 CALL CPDEHL ; End of arrays found? -2255+ 12B2 CA DB 12 JP Z,CREARY ; Yes - Create array -2256+ 12B5 7E LD A,(HL) ; Get second byte of name -2257+ 12B6 B9 CP C ; Compare with name given -2258+ 12B7 23 INC HL ; Move on -2259+ 12B8 C2 BD 12 JP NZ,NXTARY ; Different - Find next array -2260+ 12BB 7E LD A,(HL) ; Get first byte of name -2261+ 12BC B8 CP B ; Compare with name given -2262+ 12BD 23 NXTARY: INC HL ; Move on -2263+ 12BE 5E LD E,(HL) ; Get LSB of next array address -2264+ 12BF 23 INC HL -2265+ 12C0 56 LD D,(HL) ; Get MSB of next array address -2266+ 12C1 23 INC HL -2267+ 12C2 C2 A9 12 JP NZ,FNDARY ; Not found - Keep looking -2268+ 12C5 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? -2269+ 12C8 B7 OR A -2270+ 12C9 C2 0C 07 JP NZ,DDERR ; Create - ?DD Error -2271+ 12CC F1 POP AF ; Locate - Get number of dim'ns -2272+ 12CD 44 LD B,H ; BC Points to array dim'ns -2273+ 12CE 4D LD C,L -2274+ 12CF CA EB 18 JP Z,POPHRT ; Jump if array load/save -2275+ 12D2 96 SUB (HL) ; Same number of dimensions? -2276+ 12D3 CA 39 13 JP Z,FINDEL ; Yes - Find element -2277+ 12D6 1E 10 BSERR: LD E,BS ; ?BS Error -2278+ 12D8 C3 17 07 JP ERROR ; Output error -2279+ 12DB -2280+ 12DB 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry -2281+ 12DE F1 POP AF ; Array to save or 0 dim'ns? -2282+ 12DF CA 22 0C JP Z,FCERR ; Yes - ?FC Error -2283+ 12E2 71 LD (HL),C ; Save second byte of name -2284+ 12E3 23 INC HL -2285+ 12E4 70 LD (HL),B ; Save first byte of name -2286+ 12E5 23 INC HL -2287+ 12E6 4F LD C,A ; Number of dimensions to C -2288+ 12E7 CD E0 06 CALL CHKSTK ; Check if enough memory -2289+ 12EA 23 INC HL ; Point to number of dimensions -2290+ 12EB 23 INC HL -2291+ 12EC 22 75 31 LD (CUROPR),HL ; Save address of pointer -2292+ 12EF 71 LD (HL),C ; Set number of dimensions -2293+ 12F0 23 INC HL -2294+ 12F1 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? -2295+ 12F4 17 RLA ; Carry set = Create -2296+ 12F5 79 LD A,C ; Get number of dimensions -2297+ 12F6 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 -2298+ 12F9 D2 FE 12 JP NC,DEFSIZ ; Locate - Set default size -2299+ 12FC C1 POP BC ; Get specified dimension size -2300+ 12FD 03 INC BC ; Include zero element -2301+ 12FE 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size -2302+ 12FF 23 INC HL -2303+ 1300 70 LD (HL),B ; Save MSB of dimension size -2304+ 1301 23 INC HL -2305+ 1302 F5 PUSH AF ; Save num' of dim'ns an status -2306+ 1303 E5 PUSH HL ; Save address of dim'n size -2307+ 1304 CD 96 1A CALL MLDEBC ; Multiply DE by BC to find -2308+ 1307 EB EX DE,HL ; amount of mem needed (to DE) -2309+ 1308 E1 POP HL ; Restore address of dimension -2310+ 1309 F1 POP AF ; Restore number of dimensions -2311+ 130A 3D DEC A ; Count them -2312+ 130B C2 F6 12 JP NZ,CRARLP ; Do next dimension if more -2313+ 130E F5 PUSH AF ; Save locate/create flag -2314+ 130F 42 LD B,D ; MSB of memory needed -2315+ 1310 4B LD C,E ; LSB of memory needed -2316+ 1311 EB EX DE,HL -2317+ 1312 19 ADD HL,DE ; Add bytes to array start -2318+ 1313 DA F8 06 JP C,OMERR ; Too big - Error -2319+ 1316 CD E9 06 CALL ENFMEM ; See if enough memory -2320+ 1319 22 8A 31 LD (ARREND),HL ; Save new end of array -2321+ 131C -2322+ 131C 2B ZERARY: DEC HL ; Back through array data -2323+ 131D 36 00 LD (HL),0 ; Set array element to zero -2324+ 131F CD CB 09 CALL CPDEHL ; All elements zeroed? -2325+ 1322 C2 1C 13 JP NZ,ZERARY ; No - Keep on going -2326+ 1325 03 INC BC ; Number of bytes + 1 -2327+ 1326 57 LD D,A ; A=0 -2328+ 1327 2A 75 31 LD HL,(CUROPR) ; Get address of array -2329+ 132A 5E LD E,(HL) ; Number of dimensions -2330+ 132B EB EX DE,HL ; To HL -2331+ 132C 29 ADD HL,HL ; Two bytes per dimension size -2332+ 132D 09 ADD HL,BC ; Add number of bytes -2333+ 132E EB EX DE,HL ; Bytes needed to DE -2334+ 132F 2B DEC HL -2335+ 1330 2B DEC HL -2336+ 1331 73 LD (HL),E ; Save LSB of bytes needed -2337+ 1332 23 INC HL -2338+ 1333 72 LD (HL),D ; Save MSB of bytes needed -2339+ 1334 23 INC HL -2340+ 1335 F1 POP AF ; Locate / Create? -2341+ 1336 DA 5D 13 JP C,ENDDIM ; A is 0 , End if create -2342+ 1339 47 FINDEL: LD B,A ; Find array element -2343+ 133A 4F LD C,A -2344+ 133B 7E LD A,(HL) ; Number of dimensions -2345+ 133C 23 INC HL -2346+ 133D 16 .BYTE 16H ; Skip "POP HL" -2347+ 133E E1 FNDELP: POP HL ; Address of next dim' size -2348+ 133F 5E LD E,(HL) ; Get LSB of dim'n size -2349+ 1340 23 INC HL -2350+ 1341 56 LD D,(HL) ; Get MSB of dim'n size -2351+ 1342 23 INC HL -2352+ 1343 E3 EX (SP),HL ; Save address - Get index -2353+ 1344 F5 PUSH AF ; Save number of dim'ns -2354+ 1345 CD CB 09 CALL CPDEHL ; Dimension too large? -2355+ 1348 D2 D6 12 JP NC,BSERR ; Yes - ?BS Error -2356+ 134B E5 PUSH HL ; Save index -2357+ 134C CD 96 1A CALL MLDEBC ; Multiply previous by size -2358+ 134F D1 POP DE ; Index supplied to DE -2359+ 1350 19 ADD HL,DE ; Add index to pointer -2360+ 1351 F1 POP AF ; Number of dimensions -2361+ 1352 3D DEC A ; Count them -2362+ 1353 44 LD B,H ; MSB of pointer -2363+ 1354 4D LD C,L ; LSB of pointer -2364+ 1355 C2 3E 13 JP NZ,FNDELP ; More - Keep going -2365+ 1358 29 ADD HL,HL ; 4 Bytes per element -2366+ 1359 29 ADD HL,HL -2367+ 135A C1 POP BC ; Start of array -2368+ 135B 09 ADD HL,BC ; Point to element -2369+ 135C EB EX DE,HL ; Address of element to DE -2370+ 135D 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address -2371+ 1360 C9 RET -2372+ 1361 -2373+ 1361 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory -2374+ 1364 EB EX DE,HL ; To DE -2375+ 1365 21 00 00 LD HL,0 ; End of free memory -2376+ 1368 39 ADD HL,SP ; Current stack value -2377+ 1369 3A 5D 31 LD A,(TYPE) ; Dummy argument type -2378+ 136C B7 OR A -2379+ 136D CA 7D 13 JP Z,FRENUM ; Numeric - Free variable space -2380+ 1370 CD E4 15 CALL GSTRCU ; Current string to pool -2381+ 1373 CD E4 14 CALL GARBGE ; Garbage collection -2382+ 1376 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -2383+ 1379 EB EX DE,HL ; To DE -2384+ 137A 2A 73 31 LD HL,(STRBOT) ; Bottom of string space -2385+ 137D 7D FRENUM: LD A,L ; Get LSB of end -2386+ 137E 93 SUB E ; Subtract LSB of beginning -2387+ 137F 4F LD C,A ; Save difference if C -2388+ 1380 7C LD A,H ; Get MSB of end -2389+ 1381 9A SBC A,D ; Subtract MSB of beginning -2390+ 1382 41 ACPASS: LD B,C ; Return integer AC -2391+ 1383 50 ABPASS: LD D,B ; Return integer AB -2392+ 1384 1E 00 LD E,0 -2393+ 1386 21 5D 31 LD HL,TYPE ; Point to type -2394+ 1389 73 LD (HL),E ; Set type to numeric -2395+ 138A 06 90 LD B,80H+16 ; 16 bit integer -2396+ 138C C3 C1 19 JP RETINT ; Return the integr -2397+ 138F -2398+ 138F 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position -2399+ 1392 47 PASSA: LD B,A ; Put A into AB -2400+ 1393 AF XOR A ; Zero A -2401+ 1394 C3 83 13 JP ABPASS ; Return integer AB -2402+ 1397 -2403+ 1397 CD 1A 14 DEF: CALL CHEKFN ; Get "FN" and name -2404+ 139A CD 0C 14 CALL IDTEST ; Test for illegal direct -2405+ 139D 01 F2 0C LD BC,DATA ; To get next statement -2406+ 13A0 C5 PUSH BC ; Save address for RETurn -2407+ 13A1 D5 PUSH DE ; Save address of function ptr -2408+ 13A2 CD D1 09 CALL CHKSYN ; Make sure "(" follows -2409+ 13A5 28 .BYTE "(" -2410+ 13A6 CD BE 11 CALL GETVAR ; Get argument variable name -2411+ 13A9 E5 PUSH HL ; Save code string address -2412+ 13AA EB EX DE,HL ; Argument address to HL -2413+ 13AB 2B DEC HL -2414+ 13AC 56 LD D,(HL) ; Get first byte of arg name -2415+ 13AD 2B DEC HL -2416+ 13AE 5E LD E,(HL) ; Get second byte of arg name -2417+ 13AF E1 POP HL ; Restore code string address -2418+ 13B0 CD CB 0F CALL TSTNUM ; Make sure numeric argument -2419+ 13B3 CD D1 09 CALL CHKSYN ; Make sure ")" follows -2420+ 13B6 29 .BYTE ")" -2421+ 13B7 CD D1 09 CALL CHKSYN ; Make sure "=" follows -2422+ 13BA B4 .BYTE ZEQUAL ; "=" token -2423+ 13BB 44 LD B,H ; Code string address to BC -2424+ 13BC 4D LD C,L -2425+ 13BD E3 EX (SP),HL ; Save code str , Get FN ptr -2426+ 13BE 71 LD (HL),C ; Save LSB of FN code string -2427+ 13BF 23 INC HL -2428+ 13C0 70 LD (HL),B ; Save MSB of FN code string -2429+ 13C1 C3 59 14 JP SVSTAD ; Save address and do function -2430+ 13C4 -2431+ 13C4 CD 1A 14 DOFN: CALL CHEKFN ; Make sure FN follows -2432+ 13C7 D5 PUSH DE ; Save function pointer address -2433+ 13C8 CD 9F 10 CALL EVLPAR ; Evaluate expression in "()" -2434+ 13CB CD CB 0F CALL TSTNUM ; Make sure numeric result -2435+ 13CE E3 EX (SP),HL ; Save code str , Get FN ptr -2436+ 13CF 5E LD E,(HL) ; Get LSB of FN code string -2437+ 13D0 23 INC HL -2438+ 13D1 56 LD D,(HL) ; Get MSB of FN code string -2439+ 13D2 23 INC HL -2440+ 13D3 7A LD A,D ; And function DEFined? -2441+ 13D4 B3 OR E -2442+ 13D5 CA 0F 07 JP Z,UFERR ; No - ?UF Error -2443+ 13D8 7E LD A,(HL) ; Get LSB of argument address -2444+ 13D9 23 INC HL -2445+ 13DA 66 LD H,(HL) ; Get MSB of argument address -2446+ 13DB 6F LD L,A ; HL = Arg variable address -2447+ 13DC E5 PUSH HL ; Save it -2448+ 13DD 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name -2449+ 13E0 E3 EX (SP),HL ; ; Save old , Get new -2450+ 13E1 22 8E 31 LD (FNRGNM),HL ; Set new argument name -2451+ 13E4 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value -2452+ 13E7 E5 PUSH HL ; Save it -2453+ 13E8 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value -2454+ 13EB E5 PUSH HL ; Save it -2455+ 13EC 21 90 31 LD HL,FNARG ; HL = Value of argument -2456+ 13EF D5 PUSH DE ; Save FN code string address -2457+ 13F0 CD 02 1A CALL FPTHL ; Move FPREG to argument -2458+ 13F3 E1 POP HL ; Get FN code string address -2459+ 13F4 CD C8 0F CALL GETNUM ; Get value from function -2460+ 13F7 2B DEC HL ; DEC 'cos GETCHR INCs -2461+ 13F8 CD 5B 0B CALL GETCHR ; Get next character -2462+ 13FB C2 03 07 JP NZ,SNERR ; Bad character in FN - Error -2463+ 13FE E1 POP HL ; Get MSB,EXP of old arg -2464+ 13FF 22 90 31 LD (FNARG),HL ; Restore it -2465+ 1402 E1 POP HL ; Get LSB,NLSB of old arg -2466+ 1403 22 92 31 LD (FNARG+2),HL ; Restore it -2467+ 1406 E1 POP HL ; Get name of old arg -2468+ 1407 22 8E 31 LD (FNRGNM),HL ; Restore it -2469+ 140A E1 POP HL ; Restore code string address -2470+ 140B C9 RET -2471+ 140C -2472+ 140C E5 IDTEST: PUSH HL ; Save code string address -2473+ 140D 2A 0C 31 LD HL,(LINEAT) ; Get current line number -2474+ 1410 23 INC HL ; -1 means direct statement -2475+ 1411 7C LD A,H -2476+ 1412 B5 OR L -2477+ 1413 E1 POP HL ; Restore code string address -2478+ 1414 C0 RET NZ ; Return if in program -2479+ 1415 1E 16 LD E,ID ; ?ID Error -2480+ 1417 C3 17 07 JP ERROR -2481+ 141A -2482+ 141A CD D1 09 CHEKFN: CALL CHKSYN ; Make sure FN follows -2483+ 141D A7 .BYTE ZFN ; "FN" token -2484+ 141E 3E 80 LD A,80H -2485+ 1420 32 7B 31 LD (FORFLG),A ; Flag FN name to find -2486+ 1423 B6 OR (HL) ; FN name has bit 7 set -2487+ 1424 47 LD B,A ; in first byte of name -2488+ 1425 CD C3 11 CALL GTFNAM ; Get FN name -2489+ 1428 C3 CB 0F JP TSTNUM ; Make sure numeric function -2490+ 142B -2491+ 142B CD CB 0F STR: CALL TSTNUM ; Make sure it's a number -2492+ 142E CD 4F 1B CALL NUMASC ; Turn number into text -2493+ 1431 CD 5F 14 STR1: CALL CRTST ; Create string entry for it -2494+ 1434 CD E4 15 CALL GSTRCU ; Current string to pool -2495+ 1437 01 3F 16 LD BC,TOPOOL ; Save in string pool -2496+ 143A C5 PUSH BC ; Save address on stack -2497+ 143B -2498+ 143B 7E SAVSTR: LD A,(HL) ; Get string length -2499+ 143C 23 INC HL -2500+ 143D 23 INC HL -2501+ 143E E5 PUSH HL ; Save pointer to string -2502+ 143F CD BA 14 CALL TESTR ; See if enough string space -2503+ 1442 E1 POP HL ; Restore pointer to string -2504+ 1443 4E LD C,(HL) ; Get LSB of address -2505+ 1444 23 INC HL -2506+ 1445 46 LD B,(HL) ; Get MSB of address -2507+ 1446 CD 53 14 CALL CRTMST ; Create string entry -2508+ 1449 E5 PUSH HL ; Save pointer to MSB of addr -2509+ 144A 6F LD L,A ; Length of string -2510+ 144B CD D7 15 CALL TOSTRA ; Move to string area -2511+ 144E D1 POP DE ; Restore pointer to MSB -2512+ 144F C9 RET -2513+ 1450 -2514+ 1450 CD BA 14 MKTMST: CALL TESTR ; See if enough string space -2515+ 1453 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string -2516+ 1456 E5 PUSH HL ; Save it -2517+ 1457 77 LD (HL),A ; Save length of string -2518+ 1458 23 INC HL -2519+ 1459 23 SVSTAD: INC HL -2520+ 145A 73 LD (HL),E ; Save LSB of address -2521+ 145B 23 INC HL -2522+ 145C 72 LD (HL),D ; Save MSB of address -2523+ 145D E1 POP HL ; Restore pointer -2524+ 145E C9 RET -2525+ 145F -2526+ 145F 2B CRTST: DEC HL ; DEC - INCed after -2527+ 1460 06 22 QTSTR: LD B,'"' ; Terminating quote -2528+ 1462 50 LD D,B ; Quote to D -2529+ 1463 E5 DTSTR: PUSH HL ; Save start -2530+ 1464 0E FF LD C,-1 ; Set counter to -1 -2531+ 1466 23 QTSTLP: INC HL ; Move on -2532+ 1467 7E LD A,(HL) ; Get byte -2533+ 1468 0C INC C ; Count bytes -2534+ 1469 B7 OR A ; End of line? -2535+ 146A CA 75 14 JP Z,CRTSTE ; Yes - Create string entry -2536+ 146D BA CP D ; Terminator D found? -2537+ 146E CA 75 14 JP Z,CRTSTE ; Yes - Create string entry -2538+ 1471 B8 CP B ; Terminator B found? -2539+ 1472 C2 66 14 JP NZ,QTSTLP ; No - Keep looking -2540+ 1475 FE 22 CRTSTE: CP '"' ; End with '"'? -2541+ 1477 CC 5B 0B CALL Z,GETCHR ; Yes - Get next character -2542+ 147A E3 EX (SP),HL ; Starting quote -2543+ 147B 23 INC HL ; First byte of string -2544+ 147C EB EX DE,HL ; To DE -2545+ 147D 79 LD A,C ; Get length -2546+ 147E CD 53 14 CALL CRTMST ; Create string entry -2547+ 1481 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string -2548+ 1484 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -2549+ 1487 22 94 31 LD (FPREG),HL ; Save address of string ptr -2550+ 148A 3E 01 LD A,1 -2551+ 148C 32 5D 31 LD (TYPE),A ; Set type to string -2552+ 148F CD 05 1A CALL DETHL4 ; Move string to pool -2553+ 1492 CD CB 09 CALL CPDEHL ; Out of string pool? -2554+ 1495 22 61 31 LD (TMSTPT),HL ; Save new pointer -2555+ 1498 E1 POP HL ; Restore code string address -2556+ 1499 7E LD A,(HL) ; Get next code byte -2557+ 149A C0 RET NZ ; Return if pool OK -2558+ 149B 1E 1E LD E,ST ; ?ST Error -2559+ 149D C3 17 07 JP ERROR ; String pool overflow -2560+ 14A0 -2561+ 14A0 23 PRNUMS: INC HL ; Skip leading space -2562+ 14A1 CD 5F 14 PRS: CALL CRTST ; Create string entry for it -2563+ 14A4 CD E4 15 PRS1: CALL GSTRCU ; Current string to pool -2564+ 14A7 CD F9 19 CALL LOADFP ; Move string block to BCDE -2565+ 14AA 1C INC E ; Length + 1 -2566+ 14AB 1D PRSLP: DEC E ; Count characters -2567+ 14AC C8 RET Z ; End of string -2568+ 14AD 0A LD A,(BC) ; Get byte to output -2569+ 14AE CD DC 09 CALL OUTC ; Output character in A -2570+ 14B1 FE 0D CP CR ; Return? -2571+ 14B3 CC 0D 0E CALL Z,DONULL ; Yes - Do nulls -2572+ 14B6 03 INC BC ; Next byte in string -2573+ 14B7 C3 AB 14 JP PRSLP ; More characters to output -2574+ 14BA -2575+ 14BA B7 TESTR: OR A ; Test if enough room -2576+ 14BB 0E .BYTE 0EH ; No garbage collection done -2577+ 14BC F1 GRBDON: POP AF ; Garbage collection done -2578+ 14BD F5 PUSH AF ; Save status -2579+ 14BE 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use -2580+ 14C1 EB EX DE,HL ; To DE -2581+ 14C2 2A 73 31 LD HL,(STRBOT) ; Bottom of string area -2582+ 14C5 2F CPL ; Negate length (Top down) -2583+ 14C6 4F LD C,A ; -Length to BC -2584+ 14C7 06 FF LD B,-1 ; BC = -ve length of string -2585+ 14C9 09 ADD HL,BC ; Add to bottom of space in use -2586+ 14CA 23 INC HL ; Plus one for 2's complement -2587+ 14CB CD CB 09 CALL CPDEHL ; Below string RAM area? -2588+ 14CE DA D8 14 JP C,TESTOS ; Tidy up if not done else err -2589+ 14D1 22 73 31 LD (STRBOT),HL ; Save new bottom of area -2590+ 14D4 23 INC HL ; Point to first byte of string -2591+ 14D5 EB EX DE,HL ; Address to DE -2592+ 14D6 F1 POPAF: POP AF ; Throw away status push -2593+ 14D7 C9 RET -2594+ 14D8 -2595+ 14D8 F1 TESTOS: POP AF ; Garbage collect been done? -2596+ 14D9 1E 1A LD E,OS ; ?OS Error -2597+ 14DB CA 17 07 JP Z,ERROR ; Yes - Not enough string apace -2598+ 14DE BF CP A ; Flag garbage collect done -2599+ 14DF F5 PUSH AF ; Save status -2600+ 14E0 01 BC 14 LD BC,GRBDON ; Garbage collection done -2601+ 14E3 C5 PUSH BC ; Save for RETurn -2602+ 14E4 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer -2603+ 14E7 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer -2604+ 14EA 21 00 00 LD HL,0 -2605+ 14ED E5 PUSH HL ; Flag no string found -2606+ 14EE 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space -2607+ 14F1 E5 PUSH HL ; Save bottom of string space -2608+ 14F2 21 63 31 LD HL,TMSTPL ; Temporary string pool -2609+ 14F5 EB GRBLP: EX DE,HL -2610+ 14F6 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer -2611+ 14F9 EB EX DE,HL -2612+ 14FA CD CB 09 CALL CPDEHL ; Temporary string pool done? -2613+ 14FD 01 F5 14 LD BC,GRBLP ; Loop until string pool done -2614+ 1500 C2 49 15 JP NZ,STPOOL ; No - See if in string area -2615+ 1503 2A 86 31 LD HL,(PROGND) ; Start of simple variables -2616+ 1506 EB SMPVAR: EX DE,HL -2617+ 1507 2A 88 31 LD HL,(VAREND) ; End of simple variables -2618+ 150A EB EX DE,HL -2619+ 150B CD CB 09 CALL CPDEHL ; All simple strings done? -2620+ 150E CA 1C 15 JP Z,ARRLP ; Yes - Do string arrays -2621+ 1511 7E LD A,(HL) ; Get type of variable -2622+ 1512 23 INC HL -2623+ 1513 23 INC HL -2624+ 1514 B7 OR A ; "S" flag set if string -2625+ 1515 CD 4C 15 CALL STRADD ; See if string in string area -2626+ 1518 C3 06 15 JP SMPVAR ; Loop until simple ones done -2627+ 151B -2628+ 151B C1 GNXARY: POP BC ; Scrap address of this array -2629+ 151C EB ARRLP: EX DE,HL -2630+ 151D 2A 8A 31 LD HL,(ARREND) ; End of string arrays -2631+ 1520 EB EX DE,HL -2632+ 1521 CD CB 09 CALL CPDEHL ; All string arrays done? -2633+ 1524 CA 72 15 JP Z,SCNEND ; Yes - Move string if found -2634+ 1527 CD F9 19 CALL LOADFP ; Get array name to BCDE -2635+ 152A 7B LD A,E ; Get type of array -2636+ 152B E5 PUSH HL ; Save address of num of dim'ns -2637+ 152C 09 ADD HL,BC ; Start of next array -2638+ 152D B7 OR A ; Test type of array -2639+ 152E F2 1B 15 JP P,GNXARY ; Numeric array - Ignore it -2640+ 1531 22 75 31 LD (CUROPR),HL ; Save address of next array -2641+ 1534 E1 POP HL ; Get address of num of dim'ns -2642+ 1535 4E LD C,(HL) ; BC = Number of dimensions -2643+ 1536 06 00 LD B,0 -2644+ 1538 09 ADD HL,BC ; Two bytes per dimension size -2645+ 1539 09 ADD HL,BC -2646+ 153A 23 INC HL ; Plus one for number of dim'ns -2647+ 153B EB GRBARY: EX DE,HL -2648+ 153C 2A 75 31 LD HL,(CUROPR) ; Get address of next array -2649+ 153F EB EX DE,HL -2650+ 1540 CD CB 09 CALL CPDEHL ; Is this array finished? -2651+ 1543 CA 1C 15 JP Z,ARRLP ; Yes - Get next one -2652+ 1546 01 3B 15 LD BC,GRBARY ; Loop until array all done -2653+ 1549 C5 STPOOL: PUSH BC ; Save return address -2654+ 154A F6 80 OR 80H ; Flag string type -2655+ 154C 7E STRADD: LD A,(HL) ; Get string length -2656+ 154D 23 INC HL -2657+ 154E 23 INC HL -2658+ 154F 5E LD E,(HL) ; Get LSB of string address -2659+ 1550 23 INC HL -2660+ 1551 56 LD D,(HL) ; Get MSB of string address -2661+ 1552 23 INC HL -2662+ 1553 F0 RET P ; Not a string - Return -2663+ 1554 B7 OR A ; Set flags on string length -2664+ 1555 C8 RET Z ; Null string - Return -2665+ 1556 44 LD B,H ; Save variable pointer -2666+ 1557 4D LD C,L -2667+ 1558 2A 73 31 LD HL,(STRBOT) ; Bottom of new area -2668+ 155B CD CB 09 CALL CPDEHL ; String been done? -2669+ 155E 60 LD H,B ; Restore variable pointer -2670+ 155F 69 LD L,C -2671+ 1560 D8 RET C ; String done - Ignore -2672+ 1561 E1 POP HL ; Return address -2673+ 1562 E3 EX (SP),HL ; Lowest available string area -2674+ 1563 CD CB 09 CALL CPDEHL ; String within string area? -2675+ 1566 E3 EX (SP),HL ; Lowest available string area -2676+ 1567 E5 PUSH HL ; Re-save return address -2677+ 1568 60 LD H,B ; Restore variable pointer -2678+ 1569 69 LD L,C -2679+ 156A D0 RET NC ; Outside string area - Ignore -2680+ 156B C1 POP BC ; Get return , Throw 2 away -2681+ 156C F1 POP AF ; -2682+ 156D F1 POP AF ; -2683+ 156E E5 PUSH HL ; Save variable pointer -2684+ 156F D5 PUSH DE ; Save address of current -2685+ 1570 C5 PUSH BC ; Put back return address -2686+ 1571 C9 RET ; Go to it -2687+ 1572 -2688+ 1572 D1 SCNEND: POP DE ; Addresses of strings -2689+ 1573 E1 POP HL ; -2690+ 1574 7D LD A,L ; HL = 0 if no more to do -2691+ 1575 B4 OR H -2692+ 1576 C8 RET Z ; No more to do - Return -2693+ 1577 2B DEC HL -2694+ 1578 46 LD B,(HL) ; MSB of address of string -2695+ 1579 2B DEC HL -2696+ 157A 4E LD C,(HL) ; LSB of address of string -2697+ 157B E5 PUSH HL ; Save variable address -2698+ 157C 2B DEC HL -2699+ 157D 2B DEC HL -2700+ 157E 6E LD L,(HL) ; HL = Length of string -2701+ 157F 26 00 LD H,0 -2702+ 1581 09 ADD HL,BC ; Address of end of string+1 -2703+ 1582 50 LD D,B ; String address to DE -2704+ 1583 59 LD E,C -2705+ 1584 2B DEC HL ; Last byte in string -2706+ 1585 44 LD B,H ; Address to BC -2707+ 1586 4D LD C,L -2708+ 1587 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -2709+ 158A CD D2 06 CALL MOVSTR ; Move string to new address -2710+ 158D E1 POP HL ; Restore variable address -2711+ 158E 71 LD (HL),C ; Save new LSB of address -2712+ 158F 23 INC HL -2713+ 1590 70 LD (HL),B ; Save new MSB of address -2714+ 1591 69 LD L,C ; Next string area+1 to HL -2715+ 1592 60 LD H,B -2716+ 1593 2B DEC HL ; Next string area address -2717+ 1594 C3 E7 14 JP GARBLP ; Look for more strings -2718+ 1597 -2719+ 1597 C5 CONCAT: PUSH BC ; Save prec' opr & code string -2720+ 1598 E5 PUSH HL ; -2721+ 1599 2A 94 31 LD HL,(FPREG) ; Get first string -2722+ 159C E3 EX (SP),HL ; Save first string -2723+ 159D CD 51 10 CALL OPRND ; Get second string -2724+ 15A0 E3 EX (SP),HL ; Restore first string -2725+ 15A1 CD CC 0F CALL TSTSTR ; Make sure it's a string -2726+ 15A4 7E LD A,(HL) ; Get length of second string -2727+ 15A5 E5 PUSH HL ; Save first string -2728+ 15A6 2A 94 31 LD HL,(FPREG) ; Get second string -2729+ 15A9 E5 PUSH HL ; Save second string -2730+ 15AA 86 ADD A,(HL) ; Add length of second string -2731+ 15AB 1E 1C LD E,LS ; ?LS Error -2732+ 15AD DA 17 07 JP C,ERROR ; String too long - Error -2733+ 15B0 CD 50 14 CALL MKTMST ; Make temporary string -2734+ 15B3 D1 POP DE ; Get second string to DE -2735+ 15B4 CD E8 15 CALL GSTRDE ; Move to string pool if needed -2736+ 15B7 E3 EX (SP),HL ; Get first string -2737+ 15B8 CD E7 15 CALL GSTRHL ; Move to string pool if needed -2738+ 15BB E5 PUSH HL ; Save first string -2739+ 15BC 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address -2740+ 15BF EB EX DE,HL ; To DE -2741+ 15C0 CD CE 15 CALL SSTSA ; First string to string area -2742+ 15C3 CD CE 15 CALL SSTSA ; Second string to string area -2743+ 15C6 21 E6 0F LD HL,EVAL2 ; Return to evaluation loop -2744+ 15C9 E3 EX (SP),HL ; Save return,get code string -2745+ 15CA E5 PUSH HL ; Save code string address -2746+ 15CB C3 81 14 JP TSTOPL ; To temporary string to pool -2747+ 15CE -2748+ 15CE E1 SSTSA: POP HL ; Return address -2749+ 15CF E3 EX (SP),HL ; Get string block,save return -2750+ 15D0 7E LD A,(HL) ; Get length of string -2751+ 15D1 23 INC HL -2752+ 15D2 23 INC HL -2753+ 15D3 4E LD C,(HL) ; Get LSB of string address -2754+ 15D4 23 INC HL -2755+ 15D5 46 LD B,(HL) ; Get MSB of string address -2756+ 15D6 6F LD L,A ; Length to L -2757+ 15D7 2C TOSTRA: INC L ; INC - DECed after -2758+ 15D8 2D TSALP: DEC L ; Count bytes moved -2759+ 15D9 C8 RET Z ; End of string - Return -2760+ 15DA 0A LD A,(BC) ; Get source -2761+ 15DB 12 LD (DE),A ; Save destination -2762+ 15DC 03 INC BC ; Next source -2763+ 15DD 13 INC DE ; Next destination -2764+ 15DE C3 D8 15 JP TSALP ; Loop until string moved -2765+ 15E1 -2766+ 15E1 CD CC 0F GETSTR: CALL TSTSTR ; Make sure it's a string -2767+ 15E4 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string -2768+ 15E7 EB GSTRHL: EX DE,HL ; Save DE -2769+ 15E8 CD 02 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? -2770+ 15EB EB EX DE,HL ; Restore DE -2771+ 15EC C0 RET NZ ; No - Return -2772+ 15ED D5 PUSH DE ; Save string -2773+ 15EE 50 LD D,B ; String block address to DE -2774+ 15EF 59 LD E,C -2775+ 15F0 1B DEC DE ; Point to length -2776+ 15F1 4E LD C,(HL) ; Get string length -2777+ 15F2 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area -2778+ 15F5 CD CB 09 CALL CPDEHL ; Last one in string area? -2779+ 15F8 C2 00 16 JP NZ,POPHL ; No - Return -2780+ 15FB 47 LD B,A ; Clear B (A=0) -2781+ 15FC 09 ADD HL,BC ; Remove string from str' area -2782+ 15FD 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area -2783+ 1600 E1 POPHL: POP HL ; Restore string -2784+ 1601 C9 RET -2785+ 1602 -2786+ 1602 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top -2787+ 1605 2B DEC HL ; Back -2788+ 1606 46 LD B,(HL) ; Get MSB of address -2789+ 1607 2B DEC HL ; Back -2790+ 1608 4E LD C,(HL) ; Get LSB of address -2791+ 1609 2B DEC HL ; Back -2792+ 160A 2B DEC HL ; Back -2793+ 160B CD CB 09 CALL CPDEHL ; String last in string pool? -2794+ 160E C0 RET NZ ; Yes - Leave it -2795+ 160F 22 61 31 LD (TMSTPT),HL ; Save new string pool top -2796+ 1612 C9 RET -2797+ 1613 -2798+ 1613 01 92 13 LEN: LD BC,PASSA ; To return integer A -2799+ 1616 C5 PUSH BC ; Save address -2800+ 1617 CD E1 15 GETLEN: CALL GETSTR ; Get string and its length -2801+ 161A AF XOR A -2802+ 161B 57 LD D,A ; Clear D -2803+ 161C 32 5D 31 LD (TYPE),A ; Set type to numeric -2804+ 161F 7E LD A,(HL) ; Get length of string -2805+ 1620 B7 OR A ; Set status flags -2806+ 1621 C9 RET -2807+ 1622 -2808+ 1622 01 92 13 ASC: LD BC,PASSA ; To return integer A -2809+ 1625 C5 PUSH BC ; Save address -2810+ 1626 CD 17 16 GTFLNM: CALL GETLEN ; Get length of string -2811+ 1629 CA 22 0C JP Z,FCERR ; Null string - Error -2812+ 162C 23 INC HL -2813+ 162D 23 INC HL -2814+ 162E 5E LD E,(HL) ; Get LSB of address -2815+ 162F 23 INC HL -2816+ 1630 56 LD D,(HL) ; Get MSB of address -2817+ 1631 1A LD A,(DE) ; Get first byte of string -2818+ 1632 C9 RET -2819+ 1633 -2820+ 1633 3E 01 CHR: LD A,1 ; One character string -2821+ 1635 CD 50 14 CALL MKTMST ; Make a temporary string -2822+ 1638 CD 2C 17 CALL MAKINT ; Make it integer A -2823+ 163B 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string -2824+ 163E 73 LD (HL),E ; Save character -2825+ 163F C1 TOPOOL: POP BC ; Clean up stack -2826+ 1640 C3 81 14 JP TSTOPL ; Temporary string to pool -2827+ 1643 -2828+ 1643 CD DC 16 LEFT: CALL LFRGNM ; Get number and ending ")" -2829+ 1646 AF XOR A ; Start at first byte in string -2830+ 1647 E3 RIGHT1: EX (SP),HL ; Save code string,Get string -2831+ 1648 4F LD C,A ; Starting position in string -2832+ 1649 E5 MID1: PUSH HL ; Save string block address -2833+ 164A 7E LD A,(HL) ; Get length of string -2834+ 164B B8 CP B ; Compare with number given -2835+ 164C DA 51 16 JP C,ALLFOL ; All following bytes required -2836+ 164F 78 LD A,B ; Get new length -2837+ 1650 11 .BYTE 11H ; Skip "LD C,0" -2838+ 1651 0E 00 ALLFOL: LD C,0 ; First byte of string -2839+ 1653 C5 PUSH BC ; Save position in string -2840+ 1654 CD BA 14 CALL TESTR ; See if enough string space -2841+ 1657 C1 POP BC ; Get position in string -2842+ 1658 E1 POP HL ; Restore string block address -2843+ 1659 E5 PUSH HL ; And re-save it -2844+ 165A 23 INC HL -2845+ 165B 23 INC HL -2846+ 165C 46 LD B,(HL) ; Get LSB of address -2847+ 165D 23 INC HL -2848+ 165E 66 LD H,(HL) ; Get MSB of address -2849+ 165F 68 LD L,B ; HL = address of string -2850+ 1660 06 00 LD B,0 ; BC = starting address -2851+ 1662 09 ADD HL,BC ; Point to that byte -2852+ 1663 44 LD B,H ; BC = source string -2853+ 1664 4D LD C,L -2854+ 1665 CD 53 14 CALL CRTMST ; Create a string entry -2855+ 1668 6F LD L,A ; Length of new string -2856+ 1669 CD D7 15 CALL TOSTRA ; Move string to string area -2857+ 166C D1 POP DE ; Clear stack -2858+ 166D CD E8 15 CALL GSTRDE ; Move to string pool if needed -2859+ 1670 C3 81 14 JP TSTOPL ; Temporary string to pool -2860+ 1673 -2861+ 1673 CD DC 16 RIGHT: CALL LFRGNM ; Get number and ending ")" -2862+ 1676 D1 POP DE ; Get string length -2863+ 1677 D5 PUSH DE ; And re-save -2864+ 1678 1A LD A,(DE) ; Get length -2865+ 1679 90 SUB B ; Move back N bytes -2866+ 167A C3 47 16 JP RIGHT1 ; Go and get sub-string -2867+ 167D -2868+ 167D EB MID: EX DE,HL ; Get code string address -2869+ 167E 7E LD A,(HL) ; Get next byte ',' or ")" -2870+ 167F CD E1 16 CALL MIDNUM ; Get number supplied -2871+ 1682 04 INC B ; Is it character zero? -2872+ 1683 05 DEC B -2873+ 1684 CA 22 0C JP Z,FCERR ; Yes - Error -2874+ 1687 C5 PUSH BC ; Save starting position -2875+ 1688 1E FF LD E,255 ; All of string -2876+ 168A FE 29 CP ')' ; Any length given? -2877+ 168C CA 96 16 JP Z,RSTSTR ; No - Rest of string -2878+ 168F CD D1 09 CALL CHKSYN ; Make sure ',' follows -2879+ 1692 2C .BYTE ',' -2880+ 1693 CD 29 17 CALL GETINT ; Get integer 0-255 -2881+ 1696 CD D1 09 RSTSTR: CALL CHKSYN ; Make sure ")" follows -2882+ 1699 29 .BYTE ")" -2883+ 169A F1 POP AF ; Restore starting position -2884+ 169B E3 EX (SP),HL ; Get string,8ave code string -2885+ 169C 01 49 16 LD BC,MID1 ; Continuation of MID$ routine -2886+ 169F C5 PUSH BC ; Save for return -2887+ 16A0 3D DEC A ; Starting position-1 -2888+ 16A1 BE CP (HL) ; Compare with length -2889+ 16A2 06 00 LD B,0 ; Zero bytes length -2890+ 16A4 D0 RET NC ; Null string if start past end -2891+ 16A5 4F LD C,A ; Save starting position-1 -2892+ 16A6 7E LD A,(HL) ; Get length of string -2893+ 16A7 91 SUB C ; Subtract start -2894+ 16A8 BB CP E ; Enough string for it? -2895+ 16A9 47 LD B,A ; Save maximum length available -2896+ 16AA D8 RET C ; Truncate string if needed -2897+ 16AB 43 LD B,E ; Set specified length -2898+ 16AC C9 RET ; Go and create string -2899+ 16AD -2900+ 16AD CD 17 16 VAL: CALL GETLEN ; Get length of string -2901+ 16B0 CA CA 17 JP Z,RESZER ; Result zero -2902+ 16B3 5F LD E,A ; Save length -2903+ 16B4 23 INC HL -2904+ 16B5 23 INC HL -2905+ 16B6 7E LD A,(HL) ; Get LSB of address -2906+ 16B7 23 INC HL -2907+ 16B8 66 LD H,(HL) ; Get MSB of address -2908+ 16B9 6F LD L,A ; HL = String address -2909+ 16BA E5 PUSH HL ; Save string address -2910+ 16BB 19 ADD HL,DE -2911+ 16BC 46 LD B,(HL) ; Get end of string+1 byte -2912+ 16BD 72 LD (HL),D ; Zero it to terminate -2913+ 16BE E3 EX (SP),HL ; Save string end,get start -2914+ 16BF C5 PUSH BC ; Save end+1 byte -2915+ 16C0 7E LD A,(HL) ; Get starting byte -2916+ 16C1 FE 24 CP '$' ; Hex number indicated? [function added] -2917+ 16C3 C2 CB 16 JP NZ,VAL1 -2918+ 16C6 CD F5 1E CALL HEXTFP ; Convert Hex to FPREG -2919+ 16C9 18 0D JR VAL3 -2920+ 16CB FE 25 VAL1: CP '%' ; Binary number indicated? [function added] -2921+ 16CD C2 D5 16 JP NZ,VAL2 -2922+ 16D0 CD 65 1F CALL BINTFP ; Convert Bin to FPREG -2923+ 16D3 18 03 JR VAL3 -2924+ 16D5 CD B1 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP -2925+ 16D8 C1 VAL3: POP BC ; Restore end+1 byte -2926+ 16D9 E1 POP HL ; Restore end+1 address -2927+ 16DA 70 LD (HL),B ; Put back original byte -2928+ 16DB C9 RET -2929+ 16DC -2930+ 16DC EB LFRGNM: EX DE,HL ; Code string address to HL -2931+ 16DD CD D1 09 CALL CHKSYN ; Make sure ")" follows -2932+ 16E0 29 .BYTE ")" -2933+ 16E1 C1 MIDNUM: POP BC ; Get return address -2934+ 16E2 D1 POP DE ; Get number supplied -2935+ 16E3 C5 PUSH BC ; Re-save return address -2936+ 16E4 43 LD B,E ; Number to B -2937+ 16E5 C9 RET -2938+ 16E6 -2939+ 16E6 CD 2C 17 INP: CALL MAKINT ; Make it integer A -2940+ 16E9 32 EF 30 LD (INPORT),A ; Set input port -2941+ 16EC CD EE 30 CALL INPSUB ; Get input from port -2942+ 16EF C3 92 13 JP PASSA ; Return integer A -2943+ 16F2 -2944+ 16F2 CD 16 17 POUT: CALL SETIO ; Set up port number -2945+ 16F5 C3 B6 30 JP OUTSUB ; Output data and return -2946+ 16F8 -2947+ 16F8 CD 16 17 WAIT: CALL SETIO ; Set up port number -2948+ 16FB F5 PUSH AF ; Save AND mask -2949+ 16FC 1E 00 LD E,0 ; Assume zero if none given -2950+ 16FE 2B DEC HL ; DEC 'cos GETCHR INCs -2951+ 16FF CD 5B 0B CALL GETCHR ; Get next character -2952+ 1702 CA 0C 17 JP Z,NOXOR ; No XOR byte given -2953+ 1705 CD D1 09 CALL CHKSYN ; Make sure ',' follows -2954+ 1708 2C .BYTE ',' -2955+ 1709 CD 29 17 CALL GETINT ; Get integer 0-255 to XOR with -2956+ 170C C1 NOXOR: POP BC ; Restore AND mask -2957+ 170D CD EE 30 WAITLP: CALL INPSUB ; Get input -2958+ 1710 AB XOR E ; Flip selected bits -2959+ 1711 A0 AND B ; Result non-zero? -2960+ 1712 CA 0D 17 JP Z,WAITLP ; No = keep waiting -2961+ 1715 C9 RET -2962+ 1716 -2963+ 1716 CD 29 17 SETIO: CALL GETINT ; Get integer 0-255 -2964+ 1719 32 EF 30 LD (INPORT),A ; Set input port -2965+ 171C 32 B7 30 LD (OTPORT),A ; Set output port -2966+ 171F CD D1 09 CALL CHKSYN ; Make sure ',' follows -2967+ 1722 2C .BYTE ',' -2968+ 1723 C3 29 17 JP GETINT ; Get integer 0-255 and return -2969+ 1726 -2970+ 1726 CD 5B 0B FNDNUM: CALL GETCHR ; Get next character -2971+ 1729 CD C8 0F GETINT: CALL GETNUM ; Get a number from 0 to 255 -2972+ 172C CD 07 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 -2973+ 172F 7A LD A,D ; Get MSB of number -2974+ 1730 B7 OR A ; Zero? -2975+ 1731 C2 22 0C JP NZ,FCERR ; No - Error -2976+ 1734 2B DEC HL ; DEC 'cos GETCHR INCs -2977+ 1735 CD 5B 0B CALL GETCHR ; Get next character -2978+ 1738 7B LD A,E ; Get number to A -2979+ 1739 C9 RET -2980+ 173A -2981+ 173A CD 0D 0C PEEK: CALL DEINT ; Get memory address -2982+ 173D 1A LD A,(DE) ; Get byte in memory -2983+ 173E C3 92 13 JP PASSA ; Return integer A -2984+ 1741 -2985+ 1741 CD C8 0F POKE: CALL GETNUM ; Get memory address -2986+ 1744 CD 0D 0C CALL DEINT ; Get integer -32768 to 3276 -2987+ 1747 D5 PUSH DE ; Save memory address -2988+ 1748 CD D1 09 CALL CHKSYN ; Make sure ',' follows -2989+ 174B 2C .BYTE ',' -2990+ 174C CD 29 17 CALL GETINT ; Get integer 0-255 -2991+ 174F D1 POP DE ; Restore memory address -2992+ 1750 12 LD (DE),A ; Load it into memory -2993+ 1751 C9 RET -2994+ 1752 -2995+ 1752 21 28 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG -2996+ 1755 CD F9 19 ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE -2997+ 1758 C3 64 17 JP FPADD ; Add BCDE to FPREG -2998+ 175B -2999+ 175B CD F9 19 SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL -3000+ 175E 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3001+ 175F C1 PSUB: POP BC ; Get FP number from stack -3002+ 1760 D1 POP DE -3003+ 1761 CD D3 19 SUBCDE: CALL INVSGN ; Negate FPREG -3004+ 1764 78 FPADD: LD A,B ; Get FP exponent -3005+ 1765 B7 OR A ; Is number zero? -3006+ 1766 C8 RET Z ; Yes - Nothing to add -3007+ 1767 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent -3008+ 176A B7 OR A ; Is this number zero? -3009+ 176B CA EB 19 JP Z,FPBCDE ; Yes - Move BCDE to FPREG -3010+ 176E 90 SUB B ; BCDE number larger? -3011+ 176F D2 7E 17 JP NC,NOSWAP ; No - Don't swap them -3012+ 1772 2F CPL ; Two's complement -3013+ 1773 3C INC A ; FP exponent -3014+ 1774 EB EX DE,HL -3015+ 1775 CD DB 19 CALL STAKFP ; Put FPREG on stack -3016+ 1778 EB EX DE,HL -3017+ 1779 CD EB 19 CALL FPBCDE ; Move BCDE to FPREG -3018+ 177C C1 POP BC ; Restore number from stack -3019+ 177D D1 POP DE -3020+ 177E FE 19 NOSWAP: CP 24+1 ; Second number insignificant? -3021+ 1780 D0 RET NC ; Yes - First number is result -3022+ 1781 F5 PUSH AF ; Save number of bits to scale -3023+ 1782 CD 10 1A CALL SIGNS ; Set MSBs & sign of result -3024+ 1785 67 LD H,A ; Save sign of result -3025+ 1786 F1 POP AF ; Restore scaling factor -3026+ 1787 CD 29 18 CALL SCALE ; Scale BCDE to same exponent -3027+ 178A B4 OR H ; Result to be positive? -3028+ 178B 21 94 31 LD HL,FPREG ; Point to FPREG -3029+ 178E F2 A4 17 JP P,MINCDE ; No - Subtract FPREG from CDE -3030+ 1791 CD 09 18 CALL PLUCDE ; Add FPREG to CDE -3031+ 1794 D2 EA 17 JP NC,RONDUP ; No overflow - Round it up -3032+ 1797 23 INC HL ; Point to exponent -3033+ 1798 34 INC (HL) ; Increment it -3034+ 1799 CA 12 07 JP Z,OVERR ; Number overflowed - Error -3035+ 179C 2E 01 LD L,1 ; 1 bit to shift right -3036+ 179E CD 3F 18 CALL SHRT1 ; Shift result right -3037+ 17A1 C3 EA 17 JP RONDUP ; Round it up -3038+ 17A4 -3039+ 17A4 AF MINCDE: XOR A ; Clear A and carry -3040+ 17A5 90 SUB B ; Negate exponent -3041+ 17A6 47 LD B,A ; Re-save exponent -3042+ 17A7 7E LD A,(HL) ; Get LSB of FPREG -3043+ 17A8 9B SBC A, E ; Subtract LSB of BCDE -3044+ 17A9 5F LD E,A ; Save LSB of BCDE -3045+ 17AA 23 INC HL -3046+ 17AB 7E LD A,(HL) ; Get NMSB of FPREG -3047+ 17AC 9A SBC A,D ; Subtract NMSB of BCDE -3048+ 17AD 57 LD D,A ; Save NMSB of BCDE -3049+ 17AE 23 INC HL -3050+ 17AF 7E LD A,(HL) ; Get MSB of FPREG -3051+ 17B0 99 SBC A,C ; Subtract MSB of BCDE -3052+ 17B1 4F LD C,A ; Save MSB of BCDE -3053+ 17B2 DC 15 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive -3054+ 17B5 -3055+ 17B5 68 BNORM: LD L,B ; L = Exponent -3056+ 17B6 63 LD H,E ; H = LSB -3057+ 17B7 AF XOR A -3058+ 17B8 47 BNRMLP: LD B,A ; Save bit count -3059+ 17B9 79 LD A,C ; Get MSB -3060+ 17BA B7 OR A ; Is it zero? -3061+ 17BB C2 D7 17 JP NZ,PNORM ; No - Do it bit at a time -3062+ 17BE 4A LD C,D ; MSB = NMSB -3063+ 17BF 54 LD D,H ; NMSB= LSB -3064+ 17C0 65 LD H,L ; LSB = VLSB -3065+ 17C1 6F LD L,A ; VLSB= 0 -3066+ 17C2 78 LD A,B ; Get exponent -3067+ 17C3 D6 08 SUB 8 ; Count 8 bits -3068+ 17C5 FE E0 CP -24-8 ; Was number zero? -3069+ 17C7 C2 B8 17 JP NZ,BNRMLP ; No - Keep normalising -3070+ 17CA AF RESZER: XOR A ; Result is zero -3071+ 17CB 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero -3072+ 17CE C9 RET -3073+ 17CF -3074+ 17CF 05 NORMAL: DEC B ; Count bits -3075+ 17D0 29 ADD HL,HL ; Shift HL left -3076+ 17D1 7A LD A,D ; Get NMSB -3077+ 17D2 17 RLA ; Shift left with last bit -3078+ 17D3 57 LD D,A ; Save NMSB -3079+ 17D4 79 LD A,C ; Get MSB -3080+ 17D5 8F ADC A,A ; Shift left with last bit -3081+ 17D6 4F LD C,A ; Save MSB -3082+ 17D7 F2 CF 17 PNORM: JP P,NORMAL ; Not done - Keep going -3083+ 17DA 78 LD A,B ; Number of bits shifted -3084+ 17DB 5C LD E,H ; Save HL in EB -3085+ 17DC 45 LD B,L -3086+ 17DD B7 OR A ; Any shifting done? -3087+ 17DE CA EA 17 JP Z,RONDUP ; No - Round it up -3088+ 17E1 21 97 31 LD HL,FPEXP ; Point to exponent -3089+ 17E4 86 ADD A,(HL) ; Add shifted bits -3090+ 17E5 77 LD (HL),A ; Re-save exponent -3091+ 17E6 D2 CA 17 JP NC,RESZER ; Underflow - Result is zero -3092+ 17E9 C8 RET Z ; Result is zero -3093+ 17EA 78 RONDUP: LD A,B ; Get VLSB of number -3094+ 17EB 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent -3095+ 17EE B7 OR A ; Any rounding? -3096+ 17EF FC FC 17 CALL M,FPROND ; Yes - Round number up -3097+ 17F2 46 LD B,(HL) ; B = Exponent -3098+ 17F3 23 INC HL -3099+ 17F4 7E LD A,(HL) ; Get sign of result -3100+ 17F5 E6 80 AND 10000000B ; Only bit 7 needed -3101+ 17F7 A9 XOR C ; Set correct sign -3102+ 17F8 4F LD C,A ; Save correct sign in number -3103+ 17F9 C3 EB 19 JP FPBCDE ; Move BCDE to FPREG -3104+ 17FC -3105+ 17FC 1C FPROND: INC E ; Round LSB -3106+ 17FD C0 RET NZ ; Return if ok -3107+ 17FE 14 INC D ; Round NMSB -3108+ 17FF C0 RET NZ ; Return if ok -3109+ 1800 0C INC C ; Round MSB -3110+ 1801 C0 RET NZ ; Return if ok -3111+ 1802 0E 80 LD C,80H ; Set normal value -3112+ 1804 34 INC (HL) ; Increment exponent -3113+ 1805 C0 RET NZ ; Return if ok -3114+ 1806 C3 12 07 JP OVERR ; Overflow error -3115+ 1809 -3116+ 1809 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG -3117+ 180A 83 ADD A,E ; Add LSB of BCDE -3118+ 180B 5F LD E,A ; Save LSB of BCDE -3119+ 180C 23 INC HL -3120+ 180D 7E LD A,(HL) ; Get NMSB of FPREG -3121+ 180E 8A ADC A,D ; Add NMSB of BCDE -3122+ 180F 57 LD D,A ; Save NMSB of BCDE -3123+ 1810 23 INC HL -3124+ 1811 7E LD A,(HL) ; Get MSB of FPREG -3125+ 1812 89 ADC A,C ; Add MSB of BCDE -3126+ 1813 4F LD C,A ; Save MSB of BCDE -3127+ 1814 C9 RET -3128+ 1815 -3129+ 1815 21 98 31 COMPL: LD HL,SGNRES ; Sign of result -3130+ 1818 7E LD A,(HL) ; Get sign of result -3131+ 1819 2F CPL ; Negate it -3132+ 181A 77 LD (HL),A ; Put it back -3133+ 181B AF XOR A -3134+ 181C 6F LD L,A ; Set L to zero -3135+ 181D 90 SUB B ; Negate exponent,set carry -3136+ 181E 47 LD B,A ; Re-save exponent -3137+ 181F 7D LD A,L ; Load zero -3138+ 1820 9B SBC A,E ; Negate LSB -3139+ 1821 5F LD E,A ; Re-save LSB -3140+ 1822 7D LD A,L ; Load zero -3141+ 1823 9A SBC A,D ; Negate NMSB -3142+ 1824 57 LD D,A ; Re-save NMSB -3143+ 1825 7D LD A,L ; Load zero -3144+ 1826 99 SBC A,C ; Negate MSB -3145+ 1827 4F LD C,A ; Re-save MSB -3146+ 1828 C9 RET -3147+ 1829 -3148+ 1829 06 00 SCALE: LD B,0 ; Clear underflow -3149+ 182B D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? -3150+ 182D DA 38 18 JP C,SHRITE ; No - Shift right A bits -3151+ 1830 43 LD B,E ; <- Shift -3152+ 1831 5A LD E,D ; <- right -3153+ 1832 51 LD D,C ; <- eight -3154+ 1833 0E 00 LD C,0 ; <- bits -3155+ 1835 C3 2B 18 JP SCALLP ; More bits to shift -3156+ 1838 -3157+ 1838 C6 09 SHRITE: ADD A,8+1 ; Adjust count -3158+ 183A 6F LD L,A ; Save bits to shift -3159+ 183B AF SHRLP: XOR A ; Flag for all done -3160+ 183C 2D DEC L ; All shifting done? -3161+ 183D C8 RET Z ; Yes - Return -3162+ 183E 79 LD A,C ; Get MSB -3163+ 183F 1F SHRT1: RRA ; Shift it right -3164+ 1840 4F LD C,A ; Re-save -3165+ 1841 7A LD A,D ; Get NMSB -3166+ 1842 1F RRA ; Shift right with last bit -3167+ 1843 57 LD D,A ; Re-save it -3168+ 1844 7B LD A,E ; Get LSB -3169+ 1845 1F RRA ; Shift right with last bit -3170+ 1846 5F LD E,A ; Re-save it -3171+ 1847 78 LD A,B ; Get underflow -3172+ 1848 1F RRA ; Shift right with last bit -3173+ 1849 47 LD B,A ; Re-save underflow -3174+ 184A C3 3B 18 JP SHRLP ; More bits to do -3175+ 184D -3176+ 184D 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 -3177+ 1851 -3178+ 1851 03 LOGTAB: .BYTE 3 ; Table used by LOG -3179+ 1852 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 -3180+ 1856 F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 -3181+ 185A 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 -3182+ 185E -3183+ 185E CD AA 19 LOG: CALL TSTSGN ; Test sign of value -3184+ 1861 B7 OR A -3185+ 1862 EA 22 0C JP PE,FCERR ; ?FC Error if <= zero -3186+ 1865 21 97 31 LD HL,FPEXP ; Point to exponent -3187+ 1868 7E LD A,(HL) ; Get exponent -3188+ 1869 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) -3189+ 186C 11 F3 04 LD DE,04F3H -3190+ 186F 90 SUB B ; Scale value to be < 1 -3191+ 1870 F5 PUSH AF ; Save scale factor -3192+ 1871 70 LD (HL),B ; Save new exponent -3193+ 1872 D5 PUSH DE ; Save SQR(1/2) -3194+ 1873 C5 PUSH BC -3195+ 1874 CD 64 17 CALL FPADD ; Add SQR(1/2) to value -3196+ 1877 C1 POP BC ; Restore SQR(1/2) -3197+ 1878 D1 POP DE -3198+ 1879 04 INC B ; Make it SQR(2) -3199+ 187A CD 00 19 CALL DVBCDE ; Divide by SQR(2) -3200+ 187D 21 4D 18 LD HL,UNITY ; Point to 1. -3201+ 1880 CD 5B 17 CALL SUBPHL ; Subtract FPREG from 1 -3202+ 1883 21 51 18 LD HL,LOGTAB ; Coefficient table -3203+ 1886 CD F2 1C CALL SUMSER ; Evaluate sum of series -3204+ 1889 01 80 80 LD BC,8080H ; BCDE = -0.5 -3205+ 188C 11 00 00 LD DE,0000H -3206+ 188F CD 64 17 CALL FPADD ; Subtract 0.5 from FPREG -3207+ 1892 F1 POP AF ; Restore scale factor -3208+ 1893 CD 25 1B CALL RSCALE ; Re-scale number -3209+ 1896 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) -3210+ 1899 11 18 72 LD DE,7218H -3211+ 189C 21 .BYTE 21H ; Skip "POP BC" and "POP DE" -3212+ 189D -3213+ 189D C1 MULT: POP BC ; Get number from stack -3214+ 189E D1 POP DE -3215+ 189F CD AA 19 FPMULT: CALL TSTSGN ; Test sign of FPREG -3216+ 18A2 C8 RET Z ; Return zero if zero -3217+ 18A3 2E 00 LD L,0 ; Flag add exponents -3218+ 18A5 CD 68 19 CALL ADDEXP ; Add exponents -3219+ 18A8 79 LD A,C ; Get MSB of multiplier -3220+ 18A9 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier -3221+ 18AC EB EX DE,HL -3222+ 18AD 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier -3223+ 18B0 01 00 00 LD BC,0 ; Partial product (BCDE) = zero -3224+ 18B3 50 LD D,B -3225+ 18B4 58 LD E,B -3226+ 18B5 21 B5 17 LD HL,BNORM ; Address of normalise -3227+ 18B8 E5 PUSH HL ; Save for return -3228+ 18B9 21 C1 18 LD HL,MULT8 ; Address of 8 bit multiply -3229+ 18BC E5 PUSH HL ; Save for NMSB,MSB -3230+ 18BD E5 PUSH HL ; -3231+ 18BE 21 94 31 LD HL,FPREG ; Point to number -3232+ 18C1 7E MULT8: LD A,(HL) ; Get LSB of number -3233+ 18C2 23 INC HL ; Point to NMSB -3234+ 18C3 B7 OR A ; Test LSB -3235+ 18C4 CA ED 18 JP Z,BYTSFT ; Zero - shift to next byte -3236+ 18C7 E5 PUSH HL ; Save address of number -3237+ 18C8 2E 08 LD L,8 ; 8 bits to multiply by -3238+ 18CA 1F MUL8LP: RRA ; Shift LSB right -3239+ 18CB 67 LD H,A ; Save LSB -3240+ 18CC 79 LD A,C ; Get MSB -3241+ 18CD D2 DB 18 JP NC,NOMADD ; Bit was zero - Don't add -3242+ 18D0 E5 PUSH HL ; Save LSB and count -3243+ 18D1 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB -3244+ 18D4 19 ADD HL,DE ; Add NMSB and LSB -3245+ 18D5 EB EX DE,HL ; Leave sum in DE -3246+ 18D6 E1 POP HL ; Restore MSB and count -3247+ 18D7 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier -3248+ 18DA 89 ADC A,C ; Add MSB -3249+ 18DB 1F NOMADD: RRA ; Shift MSB right -3250+ 18DC 4F LD C,A ; Re-save MSB -3251+ 18DD 7A LD A,D ; Get NMSB -3252+ 18DE 1F RRA ; Shift NMSB right -3253+ 18DF 57 LD D,A ; Re-save NMSB -3254+ 18E0 7B LD A,E ; Get LSB -3255+ 18E1 1F RRA ; Shift LSB right -3256+ 18E2 5F LD E,A ; Re-save LSB -3257+ 18E3 78 LD A,B ; Get VLSB -3258+ 18E4 1F RRA ; Shift VLSB right -3259+ 18E5 47 LD B,A ; Re-save VLSB -3260+ 18E6 2D DEC L ; Count bits multiplied -3261+ 18E7 7C LD A,H ; Get LSB of multiplier -3262+ 18E8 C2 CA 18 JP NZ,MUL8LP ; More - Do it -3263+ 18EB E1 POPHRT: POP HL ; Restore address of number -3264+ 18EC C9 RET -3265+ 18ED -3266+ 18ED 43 BYTSFT: LD B,E ; Shift partial product left -3267+ 18EE 5A LD E,D -3268+ 18EF 51 LD D,C -3269+ 18F0 4F LD C,A -3270+ 18F1 C9 RET -3271+ 18F2 -3272+ 18F2 CD DB 19 DIV10: CALL STAKFP ; Save FPREG on stack -3273+ 18F5 01 20 84 LD BC,8420H ; BCDE = 10. -3274+ 18F8 11 00 00 LD DE,0000H -3275+ 18FB CD EB 19 CALL FPBCDE ; Move 10 to FPREG -3276+ 18FE -3277+ 18FE C1 DIV: POP BC ; Get number from stack -3278+ 18FF D1 POP DE -3279+ 1900 CD AA 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG -3280+ 1903 CA 06 07 JP Z,DZERR ; Error if division by zero -3281+ 1906 2E FF LD L,-1 ; Flag subtract exponents -3282+ 1908 CD 68 19 CALL ADDEXP ; Subtract exponents -3283+ 190B 34 INC (HL) ; Add 2 to exponent to adjust -3284+ 190C 34 INC (HL) -3285+ 190D 2B DEC HL ; Point to MSB -3286+ 190E 7E LD A,(HL) ; Get MSB of dividend -3287+ 190F 32 C2 30 LD (DIV3),A ; Save for subtraction -3288+ 1912 2B DEC HL -3289+ 1913 7E LD A,(HL) ; Get NMSB of dividend -3290+ 1914 32 BE 30 LD (DIV2),A ; Save for subtraction -3291+ 1917 2B DEC HL -3292+ 1918 7E LD A,(HL) ; Get MSB of dividend -3293+ 1919 32 BA 30 LD (DIV1),A ; Save for subtraction -3294+ 191C 41 LD B,C ; Get MSB -3295+ 191D EB EX DE,HL ; NMSB,LSB to HL -3296+ 191E AF XOR A -3297+ 191F 4F LD C,A ; Clear MSB of quotient -3298+ 1920 57 LD D,A ; Clear NMSB of quotient -3299+ 1921 5F LD E,A ; Clear LSB of quotient -3300+ 1922 32 C5 30 LD (DIV4),A ; Clear overflow count -3301+ 1925 E5 DIVLP: PUSH HL ; Save divisor -3302+ 1926 C5 PUSH BC -3303+ 1927 7D LD A,L ; Get LSB of number -3304+ 1928 CD B9 30 CALL DIVSUP ; Subt' divisor from dividend -3305+ 192B DE 00 SBC A,0 ; Count for overflows -3306+ 192D 3F CCF -3307+ 192E D2 38 19 JP NC,RESDIV ; Restore divisor if borrow -3308+ 1931 32 C5 30 LD (DIV4),A ; Re-save overflow count -3309+ 1934 F1 POP AF ; Scrap divisor -3310+ 1935 F1 POP AF -3311+ 1936 37 SCF ; Set carry to -3312+ 1937 D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" -3313+ 1938 -3314+ 1938 C1 RESDIV: POP BC ; Restore divisor -3315+ 1939 E1 POP HL -3316+ 193A 79 LD A,C ; Get MSB of quotient -3317+ 193B 3C INC A -3318+ 193C 3D DEC A -3319+ 193D 1F RRA ; Bit 0 to bit 7 -3320+ 193E FA EB 17 JP M,RONDB ; Done - Normalise result -3321+ 1941 17 RLA ; Restore carry -3322+ 1942 7B LD A,E ; Get LSB of quotient -3323+ 1943 17 RLA ; Double it -3324+ 1944 5F LD E,A ; Put it back -3325+ 1945 7A LD A,D ; Get NMSB of quotient -3326+ 1946 17 RLA ; Double it -3327+ 1947 57 LD D,A ; Put it back -3328+ 1948 79 LD A,C ; Get MSB of quotient -3329+ 1949 17 RLA ; Double it -3330+ 194A 4F LD C,A ; Put it back -3331+ 194B 29 ADD HL,HL ; Double NMSB,LSB of divisor -3332+ 194C 78 LD A,B ; Get MSB of divisor -3333+ 194D 17 RLA ; Double it -3334+ 194E 47 LD B,A ; Put it back -3335+ 194F 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient -3336+ 1952 17 RLA ; Double it -3337+ 1953 32 C5 30 LD (DIV4),A ; Put it back -3338+ 1956 79 LD A,C ; Get MSB of quotient -3339+ 1957 B2 OR D ; Merge NMSB -3340+ 1958 B3 OR E ; Merge LSB -3341+ 1959 C2 25 19 JP NZ,DIVLP ; Not done - Keep dividing -3342+ 195C E5 PUSH HL ; Save divisor -3343+ 195D 21 97 31 LD HL,FPEXP ; Point to exponent -3344+ 1960 35 DEC (HL) ; Divide by 2 -3345+ 1961 E1 POP HL ; Restore divisor -3346+ 1962 C2 25 19 JP NZ,DIVLP ; Ok - Keep going -3347+ 1965 C3 12 07 JP OVERR ; Overflow error -3348+ 1968 -3349+ 1968 78 ADDEXP: LD A,B ; Get exponent of dividend -3350+ 1969 B7 OR A ; Test it -3351+ 196A CA 8C 19 JP Z,OVTST3 ; Zero - Result zero -3352+ 196D 7D LD A,L ; Get add/subtract flag -3353+ 196E 21 97 31 LD HL,FPEXP ; Point to exponent -3354+ 1971 AE XOR (HL) ; Add or subtract it -3355+ 1972 80 ADD A,B ; Add the other exponent -3356+ 1973 47 LD B,A ; Save new exponent -3357+ 1974 1F RRA ; Test exponent for overflow -3358+ 1975 A8 XOR B -3359+ 1976 78 LD A,B ; Get exponent -3360+ 1977 F2 8B 19 JP P,OVTST2 ; Positive - Test for overflow -3361+ 197A C6 80 ADD A,80H ; Add excess 128 -3362+ 197C 77 LD (HL),A ; Save new exponent -3363+ 197D CA EB 18 JP Z,POPHRT ; Zero - Result zero -3364+ 1980 CD 10 1A CALL SIGNS ; Set MSBs and sign of result -3365+ 1983 77 LD (HL),A ; Save new exponent -3366+ 1984 2B DEC HL ; Point to MSB -3367+ 1985 C9 RET -3368+ 1986 -3369+ 1986 CD AA 19 OVTST1: CALL TSTSGN ; Test sign of FPREG -3370+ 1989 2F CPL ; Invert sign -3371+ 198A E1 POP HL ; Clean up stack -3372+ 198B B7 OVTST2: OR A ; Test if new exponent zero -3373+ 198C E1 OVTST3: POP HL ; Clear off return address -3374+ 198D F2 CA 17 JP P,RESZER ; Result zero -3375+ 1990 C3 12 07 JP OVERR ; Overflow error -3376+ 1993 -3377+ 1993 CD F6 19 MLSP10: CALL BCDEFP ; Move FPREG to BCDE -3378+ 1996 78 LD A,B ; Get exponent -3379+ 1997 B7 OR A ; Is it zero? -3380+ 1998 C8 RET Z ; Yes - Result is zero -3381+ 1999 C6 02 ADD A,2 ; Multiply by 4 -3382+ 199B DA 12 07 JP C,OVERR ; Overflow - ?OV Error -3383+ 199E 47 LD B,A ; Re-save exponent -3384+ 199F CD 64 17 CALL FPADD ; Add BCDE to FPREG (Times 5) -3385+ 19A2 21 97 31 LD HL,FPEXP ; Point to exponent -3386+ 19A5 34 INC (HL) ; Double number (Times 10) -3387+ 19A6 C0 RET NZ ; Ok - Return -3388+ 19A7 C3 12 07 JP OVERR ; Overflow error -3389+ 19AA -3390+ 19AA 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG -3391+ 19AD B7 OR A -3392+ 19AE C8 RET Z ; RETurn if number is zero -3393+ 19AF 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG -3394+ 19B2 FE .BYTE 0FEH ; Test sign -3395+ 19B3 2F RETREL: CPL ; Invert sign -3396+ 19B4 17 RLA ; Sign bit to carry -3397+ 19B5 9F FLGDIF: SBC A,A ; Carry to all bits of A -3398+ 19B6 C0 RET NZ ; Return -1 if negative -3399+ 19B7 3C INC A ; Bump to +1 -3400+ 19B8 C9 RET ; Positive - Return +1 -3401+ 19B9 -3402+ 19B9 CD AA 19 SGN: CALL TSTSGN ; Test sign of FPREG -3403+ 19BC 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent -3404+ 19BE 11 00 00 LD DE,0 ; Zero NMSB and LSB -3405+ 19C1 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent -3406+ 19C4 4F LD C,A ; CDE = MSB,NMSB and LSB -3407+ 19C5 70 LD (HL),B ; Save exponent -3408+ 19C6 06 00 LD B,0 ; CDE = integer to normalise -3409+ 19C8 23 INC HL ; Point to sign of result -3410+ 19C9 36 80 LD (HL),80H ; Set sign of result -3411+ 19CB 17 RLA ; Carry = sign of integer -3412+ 19CC C3 B2 17 JP CONPOS ; Set sign of result -3413+ 19CF -3414+ 19CF CD AA 19 ABS: CALL TSTSGN ; Test sign of FPREG -3415+ 19D2 F0 RET P ; Return if positive -3416+ 19D3 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB -3417+ 19D6 7E LD A,(HL) ; Get sign of mantissa -3418+ 19D7 EE 80 XOR 80H ; Invert sign of mantissa -3419+ 19D9 77 LD (HL),A ; Re-save sign of mantissa -3420+ 19DA C9 RET -3421+ 19DB -3422+ 19DB EB STAKFP: EX DE,HL ; Save code string address -3423+ 19DC 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG -3424+ 19DF E3 EX (SP),HL ; Stack them,get return -3425+ 19E0 E5 PUSH HL ; Re-save return -3426+ 19E1 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG -3427+ 19E4 E3 EX (SP),HL ; Stack them,get return -3428+ 19E5 E5 PUSH HL ; Re-save return -3429+ 19E6 EB EX DE,HL ; Restore code string address -3430+ 19E7 C9 RET -3431+ 19E8 -3432+ 19E8 CD F9 19 PHLTFP: CALL LOADFP ; Number at HL to BCDE -3433+ 19EB EB FPBCDE: EX DE,HL ; Save code string address -3434+ 19EC 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number -3435+ 19EF 60 LD H,B ; Exponent of number -3436+ 19F0 69 LD L,C ; MSB of number -3437+ 19F1 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent -3438+ 19F4 EB EX DE,HL ; Restore code string address -3439+ 19F5 C9 RET -3440+ 19F6 -3441+ 19F6 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG -3442+ 19F9 5E LOADFP: LD E,(HL) ; Get LSB of number -3443+ 19FA 23 INC HL -3444+ 19FB 56 LD D,(HL) ; Get NMSB of number -3445+ 19FC 23 INC HL -3446+ 19FD 4E LD C,(HL) ; Get MSB of number -3447+ 19FE 23 INC HL -3448+ 19FF 46 LD B,(HL) ; Get exponent of number -3449+ 1A00 23 INCHL: INC HL ; Used for conditional "INC HL" -3450+ 1A01 C9 RET -3451+ 1A02 -3452+ 1A02 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG -3453+ 1A05 06 04 DETHL4: LD B,4 ; 4 bytes to move -3454+ 1A07 1A DETHLB: LD A,(DE) ; Get source -3455+ 1A08 77 LD (HL),A ; Save destination -3456+ 1A09 13 INC DE ; Next source -3457+ 1A0A 23 INC HL ; Next destination -3458+ 1A0B 05 DEC B ; Count bytes -3459+ 1A0C C2 07 1A JP NZ,DETHLB ; Loop if more -3460+ 1A0F C9 RET -3461+ 1A10 -3462+ 1A10 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG -3463+ 1A13 7E LD A,(HL) ; Get MSB -3464+ 1A14 07 RLCA ; Old sign to carry -3465+ 1A15 37 SCF ; Set MSBit -3466+ 1A16 1F RRA ; Set MSBit of MSB -3467+ 1A17 77 LD (HL),A ; Save new MSB -3468+ 1A18 3F CCF ; Complement sign -3469+ 1A19 1F RRA ; Old sign to carry -3470+ 1A1A 23 INC HL -3471+ 1A1B 23 INC HL -3472+ 1A1C 77 LD (HL),A ; Set sign of result -3473+ 1A1D 79 LD A,C ; Get MSB -3474+ 1A1E 07 RLCA ; Old sign to carry -3475+ 1A1F 37 SCF ; Set MSBit -3476+ 1A20 1F RRA ; Set MSBit of MSB -3477+ 1A21 4F LD C,A ; Save MSB -3478+ 1A22 1F RRA -3479+ 1A23 AE XOR (HL) ; New sign of result -3480+ 1A24 C9 RET -3481+ 1A25 -3482+ 1A25 78 CMPNUM: LD A,B ; Get exponent of number -3483+ 1A26 B7 OR A -3484+ 1A27 CA AA 19 JP Z,TSTSGN ; Zero - Test sign of FPREG -3485+ 1A2A 21 B3 19 LD HL,RETREL ; Return relation routine -3486+ 1A2D E5 PUSH HL ; Save for return -3487+ 1A2E CD AA 19 CALL TSTSGN ; Test sign of FPREG -3488+ 1A31 79 LD A,C ; Get MSB of number -3489+ 1A32 C8 RET Z ; FPREG zero - Number's MSB -3490+ 1A33 21 96 31 LD HL,FPREG+2 ; MSB of FPREG -3491+ 1A36 AE XOR (HL) ; Combine signs -3492+ 1A37 79 LD A,C ; Get MSB of number -3493+ 1A38 F8 RET M ; Exit if signs different -3494+ 1A39 CD 3F 1A CALL CMPFP ; Compare FP numbers -3495+ 1A3C 1F RRA ; Get carry to sign -3496+ 1A3D A9 XOR C ; Combine with MSB of number -3497+ 1A3E C9 RET -3498+ 1A3F -3499+ 1A3F 23 CMPFP: INC HL ; Point to exponent -3500+ 1A40 78 LD A,B ; Get exponent -3501+ 1A41 BE CP (HL) ; Compare exponents -3502+ 1A42 C0 RET NZ ; Different -3503+ 1A43 2B DEC HL ; Point to MBS -3504+ 1A44 79 LD A,C ; Get MSB -3505+ 1A45 BE CP (HL) ; Compare MSBs -3506+ 1A46 C0 RET NZ ; Different -3507+ 1A47 2B DEC HL ; Point to NMSB -3508+ 1A48 7A LD A,D ; Get NMSB -3509+ 1A49 BE CP (HL) ; Compare NMSBs -3510+ 1A4A C0 RET NZ ; Different -3511+ 1A4B 2B DEC HL ; Point to LSB -3512+ 1A4C 7B LD A,E ; Get LSB -3513+ 1A4D 96 SUB (HL) ; Compare LSBs -3514+ 1A4E C0 RET NZ ; Different -3515+ 1A4F E1 POP HL ; Drop RETurn -3516+ 1A50 E1 POP HL ; Drop another RETurn -3517+ 1A51 C9 RET -3518+ 1A52 -3519+ 1A52 47 FPINT: LD B,A ; <- Move -3520+ 1A53 4F LD C,A ; <- exponent -3521+ 1A54 57 LD D,A ; <- to all -3522+ 1A55 5F LD E,A ; <- bits -3523+ 1A56 B7 OR A ; Test exponent -3524+ 1A57 C8 RET Z ; Zero - Return zero -3525+ 1A58 E5 PUSH HL ; Save pointer to number -3526+ 1A59 CD F6 19 CALL BCDEFP ; Move FPREG to BCDE -3527+ 1A5C CD 10 1A CALL SIGNS ; Set MSBs & sign of result -3528+ 1A5F AE XOR (HL) ; Combine with sign of FPREG -3529+ 1A60 67 LD H,A ; Save combined signs -3530+ 1A61 FC 76 1A CALL M,DCBCDE ; Negative - Decrement BCDE -3531+ 1A64 3E 98 LD A,80H+24 ; 24 bits -3532+ 1A66 90 SUB B ; Bits to shift -3533+ 1A67 CD 29 18 CALL SCALE ; Shift BCDE -3534+ 1A6A 7C LD A,H ; Get combined sign -3535+ 1A6B 17 RLA ; Sign to carry -3536+ 1A6C DC FC 17 CALL C,FPROND ; Negative - Round number up -3537+ 1A6F 06 00 LD B,0 ; Zero exponent -3538+ 1A71 DC 15 18 CALL C,COMPL ; If negative make positive -3539+ 1A74 E1 POP HL ; Restore pointer to number -3540+ 1A75 C9 RET -3541+ 1A76 -3542+ 1A76 1B DCBCDE: DEC DE ; Decrement BCDE -3543+ 1A77 7A LD A,D ; Test LSBs -3544+ 1A78 A3 AND E -3545+ 1A79 3C INC A -3546+ 1A7A C0 RET NZ ; Exit if LSBs not FFFF -3547+ 1A7B 0B DEC BC ; Decrement MSBs -3548+ 1A7C C9 RET -3549+ 1A7D -3550+ 1A7D 21 97 31 INT: LD HL,FPEXP ; Point to exponent -3551+ 1A80 7E LD A,(HL) ; Get exponent -3552+ 1A81 FE 98 CP 80H+24 ; Integer accuracy only? -3553+ 1A83 3A 94 31 LD A,(FPREG) ; Get LSB -3554+ 1A86 D0 RET NC ; Yes - Already integer -3555+ 1A87 7E LD A,(HL) ; Get exponent -3556+ 1A88 CD 52 1A CALL FPINT ; F.P to integer -3557+ 1A8B 36 98 LD (HL),80H+24 ; Save 24 bit integer -3558+ 1A8D 7B LD A,E ; Get LSB of number -3559+ 1A8E F5 PUSH AF ; Save LSB -3560+ 1A8F 79 LD A,C ; Get MSB of number -3561+ 1A90 17 RLA ; Sign to carry -3562+ 1A91 CD B2 17 CALL CONPOS ; Set sign of result -3563+ 1A94 F1 POP AF ; Restore LSB of number -3564+ 1A95 C9 RET -3565+ 1A96 -3566+ 1A96 21 00 00 MLDEBC: LD HL,0 ; Clear partial product -3567+ 1A99 78 LD A,B ; Test multiplier -3568+ 1A9A B1 OR C -3569+ 1A9B C8 RET Z ; Return zero if zero -3570+ 1A9C 3E 10 LD A,16 ; 16 bits -3571+ 1A9E 29 MLDBLP: ADD HL,HL ; Shift P.P left -3572+ 1A9F DA D6 12 JP C,BSERR ; ?BS Error if overflow -3573+ 1AA2 EB EX DE,HL -3574+ 1AA3 29 ADD HL,HL ; Shift multiplier left -3575+ 1AA4 EB EX DE,HL -3576+ 1AA5 D2 AC 1A JP NC,NOMLAD ; Bit was zero - No add -3577+ 1AA8 09 ADD HL,BC ; Add multiplicand -3578+ 1AA9 DA D6 12 JP C,BSERR ; ?BS Error if overflow -3579+ 1AAC 3D NOMLAD: DEC A ; Count bits -3580+ 1AAD C2 9E 1A JP NZ,MLDBLP ; More -3581+ 1AB0 C9 RET -3582+ 1AB1 -3583+ 1AB1 FE 2D ASCTFP: CP '-' ; Negative? -3584+ 1AB3 F5 PUSH AF ; Save it and flags -3585+ 1AB4 CA BD 1A JP Z,CNVNUM ; Yes - Convert number -3586+ 1AB7 FE 2B CP '+' ; Positive? -3587+ 1AB9 CA BD 1A JP Z,CNVNUM ; Yes - Convert number -3588+ 1ABC 2B DEC HL ; DEC 'cos GETCHR INCs -3589+ 1ABD CD CA 17 CNVNUM: CALL RESZER ; Set result to zero -3590+ 1AC0 47 LD B,A ; Digits after point counter -3591+ 1AC1 57 LD D,A ; Sign of exponent -3592+ 1AC2 5F LD E,A ; Exponent of ten -3593+ 1AC3 2F CPL -3594+ 1AC4 4F LD C,A ; Before or after point flag -3595+ 1AC5 CD 5B 0B MANLP: CALL GETCHR ; Get next character -3596+ 1AC8 DA 0E 1B JP C,ADDIG ; Digit - Add to number -3597+ 1ACB FE 2E CP '.' -3598+ 1ACD CA E9 1A JP Z,DPOINT ; '.' - Flag point -3599+ 1AD0 FE 45 CP 'E' -3600+ 1AD2 C2 ED 1A JP NZ,CONEXP ; Not 'E' - Scale number -3601+ 1AD5 CD 5B 0B CALL GETCHR ; Get next character -3602+ 1AD8 CD 01 11 CALL SGNEXP ; Get sign of exponent -3603+ 1ADB CD 5B 0B EXPLP: CALL GETCHR ; Get next character -3604+ 1ADE DA 30 1B JP C,EDIGIT ; Digit - Add to exponent -3605+ 1AE1 14 INC D ; Is sign negative? -3606+ 1AE2 C2 ED 1A JP NZ,CONEXP ; No - Scale number -3607+ 1AE5 AF XOR A -3608+ 1AE6 93 SUB E ; Negate exponent -3609+ 1AE7 5F LD E,A ; And re-save it -3610+ 1AE8 0C INC C ; Flag end of number -3611+ 1AE9 0C DPOINT: INC C ; Flag point passed -3612+ 1AEA CA C5 1A JP Z,MANLP ; Zero - Get another digit -3613+ 1AED E5 CONEXP: PUSH HL ; Save code string address -3614+ 1AEE 7B LD A,E ; Get exponent -3615+ 1AEF 90 SUB B ; Subtract digits after point -3616+ 1AF0 F4 06 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number -3617+ 1AF3 F2 FC 1A JP P,ENDCON ; Positive - All done -3618+ 1AF6 F5 PUSH AF ; Save number of times to /10 -3619+ 1AF7 CD F2 18 CALL DIV10 ; Divide by 10 -3620+ 1AFA F1 POP AF ; Restore count -3621+ 1AFB 3C INC A ; Count divides -3622+ 1AFC -3623+ 1AFC C2 F0 1A ENDCON: JP NZ,SCALMI ; More to do -3624+ 1AFF D1 POP DE ; Restore code string address -3625+ 1B00 F1 POP AF ; Restore sign of number -3626+ 1B01 CC D3 19 CALL Z,INVSGN ; Negative - Negate number -3627+ 1B04 EB EX DE,HL ; Code string address to HL -3628+ 1B05 C9 RET -3629+ 1B06 -3630+ 1B06 C8 SCALPL: RET Z ; Exit if no scaling needed -3631+ 1B07 F5 MULTEN: PUSH AF ; Save count -3632+ 1B08 CD 93 19 CALL MLSP10 ; Multiply number by 10 -3633+ 1B0B F1 POP AF ; Restore count -3634+ 1B0C 3D DEC A ; Count multiplies -3635+ 1B0D C9 RET -3636+ 1B0E -3637+ 1B0E D5 ADDIG: PUSH DE ; Save sign of exponent -3638+ 1B0F 57 LD D,A ; Save digit -3639+ 1B10 78 LD A,B ; Get digits after point -3640+ 1B11 89 ADC A,C ; Add one if after point -3641+ 1B12 47 LD B,A ; Re-save counter -3642+ 1B13 C5 PUSH BC ; Save point flags -3643+ 1B14 E5 PUSH HL ; Save code string address -3644+ 1B15 D5 PUSH DE ; Save digit -3645+ 1B16 CD 93 19 CALL MLSP10 ; Multiply number by 10 -3646+ 1B19 F1 POP AF ; Restore digit -3647+ 1B1A D6 30 SUB '0' ; Make it absolute -3648+ 1B1C CD 25 1B CALL RSCALE ; Re-scale number -3649+ 1B1F E1 POP HL ; Restore code string address -3650+ 1B20 C1 POP BC ; Restore point flags -3651+ 1B21 D1 POP DE ; Restore sign of exponent -3652+ 1B22 C3 C5 1A JP MANLP ; Get another digit -3653+ 1B25 -3654+ 1B25 CD DB 19 RSCALE: CALL STAKFP ; Put number on stack -3655+ 1B28 CD BC 19 CALL FLGREL ; Digit to add to FPREG -3656+ 1B2B C1 PADD: POP BC ; Restore number -3657+ 1B2C D1 POP DE -3658+ 1B2D C3 64 17 JP FPADD ; Add BCDE to FPREG and return -3659+ 1B30 -3660+ 1B30 7B EDIGIT: LD A,E ; Get digit -3661+ 1B31 07 RLCA ; Times 2 -3662+ 1B32 07 RLCA ; Times 4 -3663+ 1B33 83 ADD A,E ; Times 5 -3664+ 1B34 07 RLCA ; Times 10 -3665+ 1B35 86 ADD A,(HL) ; Add next digit -3666+ 1B36 D6 30 SUB '0' ; Make it absolute -3667+ 1B38 5F LD E,A ; Save new digit -3668+ 1B39 C3 DB 1A JP EXPLP ; Look for another digit -3669+ 1B3C -3670+ 1B3C E5 LINEIN: PUSH HL ; Save code string address -3671+ 1B3D 21 9B 06 LD HL,INMSG ; Output " in " -3672+ 1B40 CD A1 14 CALL PRS ; Output string at HL -3673+ 1B43 E1 POP HL ; Restore code string address -3674+ 1B44 EB PRNTHL: EX DE,HL ; Code string address to DE -3675+ 1B45 AF XOR A -3676+ 1B46 06 98 LD B,80H+24 ; 24 bits -3677+ 1B48 CD C1 19 CALL RETINT ; Return the integer -3678+ 1B4B 21 A0 14 LD HL,PRNUMS ; Print number string -3679+ 1B4E E5 PUSH HL ; Save for return -3680+ 1B4F 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII -3681+ 1B52 E5 PUSH HL ; Save for return -3682+ 1B53 CD AA 19 CALL TSTSGN ; Test sign of FPREG -3683+ 1B56 36 20 LD (HL),' ' ; Space at start -3684+ 1B58 F2 5D 1B JP P,SPCFST ; Positive - Space to start -3685+ 1B5B 36 2D LD (HL),'-' ; '-' sign at start -3686+ 1B5D 23 SPCFST: INC HL ; First byte of number -3687+ 1B5E 36 30 LD (HL),'0' ; '0' if zero -3688+ 1B60 CA 13 1C JP Z,JSTZER ; Return '0' if zero -3689+ 1B63 E5 PUSH HL ; Save buffer address -3690+ 1B64 FC D3 19 CALL M,INVSGN ; Negate FPREG if negative -3691+ 1B67 AF XOR A ; Zero A -3692+ 1B68 F5 PUSH AF ; Save it -3693+ 1B69 CD 19 1C CALL RNGTST ; Test number is in range -3694+ 1B6C 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 -3695+ 1B6F 11 F8 4F LD DE,4FF8H -3696+ 1B72 CD 25 1A CALL CMPNUM ; Compare numbers -3697+ 1B75 B7 OR A -3698+ 1B76 E2 8A 1B JP PO,INRNG ; > 99999.9 - Sort it out -3699+ 1B79 F1 POP AF ; Restore count -3700+ 1B7A CD 07 1B CALL MULTEN ; Multiply by ten -3701+ 1B7D F5 PUSH AF ; Re-save count -3702+ 1B7E C3 6C 1B JP SIXDIG ; Test it again -3703+ 1B81 -3704+ 1B81 CD F2 18 GTSIXD: CALL DIV10 ; Divide by 10 -3705+ 1B84 F1 POP AF ; Get count -3706+ 1B85 3C INC A ; Count divides -3707+ 1B86 F5 PUSH AF ; Re-save count -3708+ 1B87 CD 19 1C CALL RNGTST ; Test number is in range -3709+ 1B8A CD 52 17 INRNG: CALL ROUND ; Add 0.5 to FPREG -3710+ 1B8D 3C INC A -3711+ 1B8E CD 52 1A CALL FPINT ; F.P to integer -3712+ 1B91 CD EB 19 CALL FPBCDE ; Move BCDE to FPREG -3713+ 1B94 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range -3714+ 1B97 F1 POP AF ; Restore count -3715+ 1B98 81 ADD A,C ; 6 digits before point -3716+ 1B99 3C INC A ; Add one -3717+ 1B9A FA A6 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 -3718+ 1B9D FE 08 CP 6+1+1 ; More than 999999 ? -3719+ 1B9F D2 A6 1B JP NC,MAKNUM ; Yes - Do it in 'E' form -3720+ 1BA2 3C INC A ; Adjust for exponent -3721+ 1BA3 47 LD B,A ; Exponent of number -3722+ 1BA4 3E 02 LD A,2 ; Make it zero after -3723+ 1BA6 -3724+ 1BA6 3D MAKNUM: DEC A ; Adjust for digits to do -3725+ 1BA7 3D DEC A -3726+ 1BA8 E1 POP HL ; Restore buffer address -3727+ 1BA9 F5 PUSH AF ; Save count -3728+ 1BAA 11 2C 1C LD DE,POWERS ; Powers of ten -3729+ 1BAD 05 DEC B ; Count digits before point -3730+ 1BAE C2 B7 1B JP NZ,DIGTXT ; Not zero - Do number -3731+ 1BB1 36 2E LD (HL),'.' ; Save point -3732+ 1BB3 23 INC HL ; Move on -3733+ 1BB4 36 30 LD (HL),'0' ; Save zero -3734+ 1BB6 23 INC HL ; Move on -3735+ 1BB7 05 DIGTXT: DEC B ; Count digits before point -3736+ 1BB8 36 2E LD (HL),'.' ; Save point in case -3737+ 1BBA CC 00 1A CALL Z,INCHL ; Last digit - move on -3738+ 1BBD C5 PUSH BC ; Save digits before point -3739+ 1BBE E5 PUSH HL ; Save buffer address -3740+ 1BBF D5 PUSH DE ; Save powers of ten -3741+ 1BC0 CD F6 19 CALL BCDEFP ; Move FPREG to BCDE -3742+ 1BC3 E1 POP HL ; Powers of ten table -3743+ 1BC4 06 2F LD B, '0'-1 ; ASCII '0' - 1 -3744+ 1BC6 04 TRYAGN: INC B ; Count subtractions -3745+ 1BC7 7B LD A,E ; Get LSB -3746+ 1BC8 96 SUB (HL) ; Subtract LSB -3747+ 1BC9 5F LD E,A ; Save LSB -3748+ 1BCA 23 INC HL -3749+ 1BCB 7A LD A,D ; Get NMSB -3750+ 1BCC 9E SBC A,(HL) ; Subtract NMSB -3751+ 1BCD 57 LD D,A ; Save NMSB -3752+ 1BCE 23 INC HL -3753+ 1BCF 79 LD A,C ; Get MSB -3754+ 1BD0 9E SBC A,(HL) ; Subtract MSB -3755+ 1BD1 4F LD C,A ; Save MSB -3756+ 1BD2 2B DEC HL ; Point back to start -3757+ 1BD3 2B DEC HL -3758+ 1BD4 D2 C6 1B JP NC,TRYAGN ; No overflow - Try again -3759+ 1BD7 CD 09 18 CALL PLUCDE ; Restore number -3760+ 1BDA 23 INC HL ; Start of next number -3761+ 1BDB CD EB 19 CALL FPBCDE ; Move BCDE to FPREG -3762+ 1BDE EB EX DE,HL ; Save point in table -3763+ 1BDF E1 POP HL ; Restore buffer address -3764+ 1BE0 70 LD (HL),B ; Save digit in buffer -3765+ 1BE1 23 INC HL ; And move on -3766+ 1BE2 C1 POP BC ; Restore digit count -3767+ 1BE3 0D DEC C ; Count digits -3768+ 1BE4 C2 B7 1B JP NZ,DIGTXT ; More - Do them -3769+ 1BE7 05 DEC B ; Any decimal part? -3770+ 1BE8 CA F7 1B JP Z,DOEBIT ; No - Do 'E' bit -3771+ 1BEB 2B SUPTLZ: DEC HL ; Move back through buffer -3772+ 1BEC 7E LD A,(HL) ; Get character -3773+ 1BED FE 30 CP '0' ; '0' character? -3774+ 1BEF CA EB 1B JP Z,SUPTLZ ; Yes - Look back for more -3775+ 1BF2 FE 2E CP '.' ; A decimal point? -3776+ 1BF4 C4 00 1A CALL NZ,INCHL ; Move back over digit -3777+ 1BF7 -3778+ 1BF7 F1 DOEBIT: POP AF ; Get 'E' flag -3779+ 1BF8 CA 16 1C JP Z,NOENED ; No 'E' needed - End buffer -3780+ 1BFB 36 45 LD (HL),'E' ; Put 'E' in buffer -3781+ 1BFD 23 INC HL ; And move on -3782+ 1BFE 36 2B LD (HL),'+' ; Put '+' in buffer -3783+ 1C00 F2 07 1C JP P,OUTEXP ; Positive - Output exponent -3784+ 1C03 36 2D LD (HL),'-' ; Put '-' in buffer -3785+ 1C05 2F CPL ; Negate exponent -3786+ 1C06 3C INC A -3787+ 1C07 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 -3788+ 1C09 04 EXPTEN: INC B ; Count subtractions -3789+ 1C0A D6 0A SUB 10 ; Tens digit -3790+ 1C0C D2 09 1C JP NC,EXPTEN ; More to do -3791+ 1C0F C6 3A ADD A,'0'+10 ; Restore and make ASCII -3792+ 1C11 23 INC HL ; Move on -3793+ 1C12 70 LD (HL),B ; Save MSB of exponent -3794+ 1C13 23 JSTZER: INC HL ; -3795+ 1C14 77 LD (HL),A ; Save LSB of exponent -3796+ 1C15 23 INC HL -3797+ 1C16 71 NOENED: LD (HL),C ; Mark end of buffer -3798+ 1C17 E1 POP HL ; Restore code string address -3799+ 1C18 C9 RET -3800+ 1C19 -3801+ 1C19 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. -3802+ 1C1C 11 F7 23 LD DE,23F7H -3803+ 1C1F CD 25 1A CALL CMPNUM ; Compare numbers -3804+ 1C22 B7 OR A -3805+ 1C23 E1 POP HL ; Return address to HL -3806+ 1C24 E2 81 1B JP PO,GTSIXD ; Too big - Divide by ten -3807+ 1C27 E9 JP (HL) ; Otherwise return to caller -3808+ 1C28 -3809+ 1C28 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 -3810+ 1C2C -3811+ 1C2C A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 -3812+ 1C2F 10 27 00 .BYTE 010H,027H,000H ; 10000 -3813+ 1C32 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 -3814+ 1C35 64 00 00 .BYTE 064H,000H,000H ; 100 -3815+ 1C38 0A 00 00 .BYTE 00AH,000H,000H ; 10 -3816+ 1C3B 01 00 00 .BYTE 001H,000H,000H ; 1 -3817+ 1C3E -3818+ 1C3E 21 D3 19 NEGAFT: LD HL,INVSGN ; Negate result -3819+ 1C41 E3 EX (SP),HL ; To be done after caller -3820+ 1C42 E9 JP (HL) ; Return to caller -3821+ 1C43 -3822+ 1C43 CD DB 19 SQR: CALL STAKFP ; Put value on stack -3823+ 1C46 21 28 1C LD HL,HALF ; Set power to 1/2 -3824+ 1C49 CD E8 19 CALL PHLTFP ; Move 1/2 to FPREG -3825+ 1C4C -3826+ 1C4C C1 POWER: POP BC ; Get base -3827+ 1C4D D1 POP DE -3828+ 1C4E CD AA 19 CALL TSTSGN ; Test sign of power -3829+ 1C51 78 LD A,B ; Get exponent of base -3830+ 1C52 CA 91 1C JP Z,EXP ; Make result 1 if zero -3831+ 1C55 F2 5C 1C JP P,POWER1 ; Positive base - Ok -3832+ 1C58 B7 OR A ; Zero to negative power? -3833+ 1C59 CA 06 07 JP Z,DZERR ; Yes - ?/0 Error -3834+ 1C5C B7 POWER1: OR A ; Base zero? -3835+ 1C5D CA CB 17 JP Z,SAVEXP ; Yes - Return zero -3836+ 1C60 D5 PUSH DE ; Save base -3837+ 1C61 C5 PUSH BC -3838+ 1C62 79 LD A,C ; Get MSB of base -3839+ 1C63 F6 7F OR 01111111B ; Get sign status -3840+ 1C65 CD F6 19 CALL BCDEFP ; Move power to BCDE -3841+ 1C68 F2 79 1C JP P,POWER2 ; Positive base - Ok -3842+ 1C6B D5 PUSH DE ; Save power -3843+ 1C6C C5 PUSH BC -3844+ 1C6D CD 7D 1A CALL INT ; Get integer of power -3845+ 1C70 C1 POP BC ; Restore power -3846+ 1C71 D1 POP DE -3847+ 1C72 F5 PUSH AF ; MSB of base -3848+ 1C73 CD 25 1A CALL CMPNUM ; Power an integer? -3849+ 1C76 E1 POP HL ; Restore MSB of base -3850+ 1C77 7C LD A,H ; but don't affect flags -3851+ 1C78 1F RRA ; Exponent odd or even? -3852+ 1C79 E1 POWER2: POP HL ; Restore MSB and exponent -3853+ 1C7A 22 96 31 LD (FPREG+2),HL ; Save base in FPREG -3854+ 1C7D E1 POP HL ; LSBs of base -3855+ 1C7E 22 94 31 LD (FPREG),HL ; Save in FPREG -3856+ 1C81 DC 3E 1C CALL C,NEGAFT ; Odd power - Negate result -3857+ 1C84 CC D3 19 CALL Z,INVSGN ; Negative base - Negate it -3858+ 1C87 D5 PUSH DE ; Save power -3859+ 1C88 C5 PUSH BC -3860+ 1C89 CD 5E 18 CALL LOG ; Get LOG of base -3861+ 1C8C C1 POP BC ; Restore power -3862+ 1C8D D1 POP DE -3863+ 1C8E CD 9F 18 CALL FPMULT ; Multiply LOG by power -3864+ 1C91 -3865+ 1C91 CD DB 19 EXP: CALL STAKFP ; Put value on stack -3866+ 1C94 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) -3867+ 1C97 11 3B AA LD DE,0AA3BH -3868+ 1C9A CD 9F 18 CALL FPMULT ; Multiply value by 1/LN(2) -3869+ 1C9D 3A 97 31 LD A,(FPEXP) ; Get exponent -3870+ 1CA0 FE 88 CP 80H+8 ; Is it in range? -3871+ 1CA2 D2 86 19 JP NC,OVTST1 ; No - Test for overflow -3872+ 1CA5 CD 7D 1A CALL INT ; Get INT of FPREG -3873+ 1CA8 C6 80 ADD A,80H ; For excess 128 -3874+ 1CAA C6 02 ADD A,2 ; Exponent > 126? -3875+ 1CAC DA 86 19 JP C,OVTST1 ; Yes - Test for overflow -3876+ 1CAF F5 PUSH AF ; Save scaling factor -3877+ 1CB0 21 4D 18 LD HL,UNITY ; Point to 1. -3878+ 1CB3 CD 55 17 CALL ADDPHL ; Add 1 to FPREG -3879+ 1CB6 CD 96 18 CALL MULLN2 ; Multiply by LN(2) -3880+ 1CB9 F1 POP AF ; Restore scaling factor -3881+ 1CBA C1 POP BC ; Restore exponent -3882+ 1CBB D1 POP DE -3883+ 1CBC F5 PUSH AF ; Save scaling factor -3884+ 1CBD CD 61 17 CALL SUBCDE ; Subtract exponent from FPREG -3885+ 1CC0 CD D3 19 CALL INVSGN ; Negate result -3886+ 1CC3 21 D1 1C LD HL,EXPTAB ; Coefficient table -3887+ 1CC6 CD 01 1D CALL SMSER1 ; Sum the series -3888+ 1CC9 11 00 00 LD DE,0 ; Zero LSBs -3889+ 1CCC C1 POP BC ; Scaling factor -3890+ 1CCD 4A LD C,D ; Zero MSB -3891+ 1CCE C3 9F 18 JP FPMULT ; Scale result to correct value -3892+ 1CD1 -3893+ 1CD1 08 EXPTAB: .BYTE 8 ; Table used by EXP -3894+ 1CD2 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) -3895+ 1CD6 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) -3896+ 1CDA 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) -3897+ 1CDE E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) -3898+ 1CE2 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) -3899+ 1CE6 FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) -3900+ 1CEA 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) -3901+ 1CEE 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) -3902+ 1CF2 -3903+ 1CF2 CD DB 19 SUMSER: CALL STAKFP ; Put FPREG on stack -3904+ 1CF5 11 9D 18 LD DE,MULT ; Multiply by "X" -3905+ 1CF8 D5 PUSH DE ; To be done after -3906+ 1CF9 E5 PUSH HL ; Save address of table -3907+ 1CFA CD F6 19 CALL BCDEFP ; Move FPREG to BCDE -3908+ 1CFD CD 9F 18 CALL FPMULT ; Square the value -3909+ 1D00 E1 POP HL ; Restore address of table -3910+ 1D01 CD DB 19 SMSER1: CALL STAKFP ; Put value on stack -3911+ 1D04 7E LD A,(HL) ; Get number of coefficients -3912+ 1D05 23 INC HL ; Point to start of table -3913+ 1D06 CD E8 19 CALL PHLTFP ; Move coefficient to FPREG -3914+ 1D09 06 .BYTE 06H ; Skip "POP AF" -3915+ 1D0A F1 SUMLP: POP AF ; Restore count -3916+ 1D0B C1 POP BC ; Restore number -3917+ 1D0C D1 POP DE -3918+ 1D0D 3D DEC A ; Cont coefficients -3919+ 1D0E C8 RET Z ; All done -3920+ 1D0F D5 PUSH DE ; Save number -3921+ 1D10 C5 PUSH BC -3922+ 1D11 F5 PUSH AF ; Save count -3923+ 1D12 E5 PUSH HL ; Save address in table -3924+ 1D13 CD 9F 18 CALL FPMULT ; Multiply FPREG by BCDE -3925+ 1D16 E1 POP HL ; Restore address in table -3926+ 1D17 CD F9 19 CALL LOADFP ; Number at HL to BCDE -3927+ 1D1A E5 PUSH HL ; Save address in table -3928+ 1D1B CD 64 17 CALL FPADD ; Add coefficient to FPREG -3929+ 1D1E E1 POP HL ; Restore address in table -3930+ 1D1F C3 0A 1D JP SUMLP ; More coefficients -3931+ 1D22 -3932+ 1D22 CD AA 19 RND: CALL TSTSGN ; Test sign of FPREG -3933+ 1D25 21 C9 30 LD HL,SEED+2 ; Random number seed -3934+ 1D28 FA 83 1D JP M,RESEED ; Negative - Re-seed -3935+ 1D2B 21 EA 30 LD HL,LSTRND ; Last random number -3936+ 1D2E CD E8 19 CALL PHLTFP ; Move last RND to FPREG -3937+ 1D31 21 C9 30 LD HL,SEED+2 ; Random number seed -3938+ 1D34 C8 RET Z ; Return if RND(0) -3939+ 1D35 86 ADD A,(HL) ; Add (SEED)+2) -3940+ 1D36 E6 07 AND 00000111B ; 0 to 7 -3941+ 1D38 06 00 LD B,0 -3942+ 1D3A 77 LD (HL),A ; Re-save seed -3943+ 1D3B 23 INC HL ; Move to coefficient table -3944+ 1D3C 87 ADD A,A ; 4 bytes -3945+ 1D3D 87 ADD A,A ; per entry -3946+ 1D3E 4F LD C,A ; BC = Offset into table -3947+ 1D3F 09 ADD HL,BC ; Point to coefficient -3948+ 1D40 CD F9 19 CALL LOADFP ; Coefficient to BCDE -3949+ 1D43 CD 9F 18 CALL FPMULT ; ; Multiply FPREG by coefficient -3950+ 1D46 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) -3951+ 1D49 3C INC A ; Add 1 -3952+ 1D4A E6 03 AND 00000011B ; 0 to 3 -3953+ 1D4C 06 00 LD B,0 -3954+ 1D4E FE 01 CP 1 ; Is it zero? -3955+ 1D50 88 ADC A,B ; Yes - Make it 1 -3956+ 1D51 32 C8 30 LD (SEED+1),A ; Re-save seed -3957+ 1D54 21 87 1D LD HL,RNDTAB-4 ; Addition table -3958+ 1D57 87 ADD A,A ; 4 bytes -3959+ 1D58 87 ADD A,A ; per entry -3960+ 1D59 4F LD C,A ; BC = Offset into table -3961+ 1D5A 09 ADD HL,BC ; Point to value -3962+ 1D5B CD 55 17 CALL ADDPHL ; Add value to FPREG -3963+ 1D5E CD F6 19 RND1: CALL BCDEFP ; Move FPREG to BCDE -3964+ 1D61 7B LD A,E ; Get LSB -3965+ 1D62 59 LD E,C ; LSB = MSB -3966+ 1D63 EE 4F XOR 01001111B ; Fiddle around -3967+ 1D65 4F LD C,A ; New MSB -3968+ 1D66 36 80 LD (HL),80H ; Set exponent -3969+ 1D68 2B DEC HL ; Point to MSB -3970+ 1D69 46 LD B,(HL) ; Get MSB -3971+ 1D6A 36 80 LD (HL),80H ; Make value -0.5 -3972+ 1D6C 21 C7 30 LD HL,SEED ; Random number seed -3973+ 1D6F 34 INC (HL) ; Count seed -3974+ 1D70 7E LD A,(HL) ; Get seed -3975+ 1D71 D6 AB SUB 171 ; Do it modulo 171 -3976+ 1D73 C2 7A 1D JP NZ,RND2 ; Non-zero - Ok -3977+ 1D76 77 LD (HL),A ; Zero seed -3978+ 1D77 0C INC C ; Fillde about -3979+ 1D78 15 DEC D ; with the -3980+ 1D79 1C INC E ; number -3981+ 1D7A CD B5 17 RND2: CALL BNORM ; Normalise number -3982+ 1D7D 21 EA 30 LD HL,LSTRND ; Save random number -3983+ 1D80 C3 02 1A JP FPTHL ; Move FPREG to last and return -3984+ 1D83 -3985+ 1D83 77 RESEED: LD (HL),A ; Re-seed random numbers -3986+ 1D84 2B DEC HL -3987+ 1D85 77 LD (HL),A -3988+ 1D86 2B DEC HL -3989+ 1D87 77 LD (HL),A -3990+ 1D88 C3 5E 1D JP RND1 ; Return RND seed -3991+ 1D8B -3992+ 1D8B 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND -3993+ 1D8F 99 E9 92 69 .BYTE 099H,0E9H,092H,069H -3994+ 1D93 10 D1 75 68 .BYTE 010H,0D1H,075H,068H -3995+ 1D97 -3996+ 1D97 21 E1 1D COS: LD HL,HALFPI ; Point to PI/2 -3997+ 1D9A CD 55 17 CALL ADDPHL ; Add it to PPREG -3998+ 1D9D CD DB 19 SIN: CALL STAKFP ; Put angle on stack -3999+ 1DA0 01 49 83 LD BC,8349H ; BCDE = 2 PI -4000+ 1DA3 11 DB 0F LD DE,0FDBH -4001+ 1DA6 CD EB 19 CALL FPBCDE ; Move 2 PI to FPREG -4002+ 1DA9 C1 POP BC ; Restore angle -4003+ 1DAA D1 POP DE -4004+ 1DAB CD 00 19 CALL DVBCDE ; Divide angle by 2 PI -4005+ 1DAE CD DB 19 CALL STAKFP ; Put it on stack -4006+ 1DB1 CD 7D 1A CALL INT ; Get INT of result -4007+ 1DB4 C1 POP BC ; Restore number -4008+ 1DB5 D1 POP DE -4009+ 1DB6 CD 61 17 CALL SUBCDE ; Make it 0 <= value < 1 -4010+ 1DB9 21 E5 1D LD HL,QUARTR ; Point to 0.25 -4011+ 1DBC CD 5B 17 CALL SUBPHL ; Subtract value from 0.25 -4012+ 1DBF CD AA 19 CALL TSTSGN ; Test sign of value -4013+ 1DC2 37 SCF ; Flag positive -4014+ 1DC3 F2 CD 1D JP P,SIN1 ; Positive - Ok -4015+ 1DC6 CD 52 17 CALL ROUND ; Add 0.5 to value -4016+ 1DC9 CD AA 19 CALL TSTSGN ; Test sign of value -4017+ 1DCC B7 OR A ; Flag negative -4018+ 1DCD F5 SIN1: PUSH AF ; Save sign -4019+ 1DCE F4 D3 19 CALL P,INVSGN ; Negate value if positive -4020+ 1DD1 21 E5 1D LD HL,QUARTR ; Point to 0.25 -4021+ 1DD4 CD 55 17 CALL ADDPHL ; Add 0.25 to value -4022+ 1DD7 F1 POP AF ; Restore sign -4023+ 1DD8 D4 D3 19 CALL NC,INVSGN ; Negative - Make positive -4024+ 1DDB 21 E9 1D LD HL,SINTAB ; Coefficient table -4025+ 1DDE C3 F2 1C JP SUMSER ; Evaluate sum of series -4026+ 1DE1 -4027+ 1DE1 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) -4028+ 1DE5 -4029+ 1DE5 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 -4030+ 1DE9 -4031+ 1DE9 05 SINTAB: .BYTE 5 ; Table used by SIN -4032+ 1DEA BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 -4033+ 1DEE 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 -4034+ 1DF2 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 -4035+ 1DF6 E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 -4036+ 1DFA DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 -4037+ 1DFE -4038+ 1DFE CD DB 19 TAN: CALL STAKFP ; Put angle on stack -4039+ 1E01 CD 9D 1D CALL SIN ; Get SIN of angle -4040+ 1E04 C1 POP BC ; Restore angle -4041+ 1E05 E1 POP HL -4042+ 1E06 CD DB 19 CALL STAKFP ; Save SIN of angle -4043+ 1E09 EB EX DE,HL ; BCDE = Angle -4044+ 1E0A CD EB 19 CALL FPBCDE ; Angle to FPREG -4045+ 1E0D CD 97 1D CALL COS ; Get COS of angle -4046+ 1E10 C3 FE 18 JP DIV ; TAN = SIN / COS -4047+ 1E13 -4048+ 1E13 CD AA 19 ATN: CALL TSTSGN ; Test sign of value -4049+ 1E16 FC 3E 1C CALL M,NEGAFT ; Negate result after if -ve -4050+ 1E19 FC D3 19 CALL M,INVSGN ; Negate value if -ve -4051+ 1E1C 3A 97 31 LD A,(FPEXP) ; Get exponent -4052+ 1E1F FE 81 CP 81H ; Number less than 1? -4053+ 1E21 DA 30 1E JP C,ATN1 ; Yes - Get arc tangnt -4054+ 1E24 01 00 81 LD BC,8100H ; BCDE = 1 -4055+ 1E27 51 LD D,C -4056+ 1E28 59 LD E,C -4057+ 1E29 CD 00 19 CALL DVBCDE ; Get reciprocal of number -4058+ 1E2C 21 5B 17 LD HL,SUBPHL ; Sub angle from PI/2 -4059+ 1E2F E5 PUSH HL ; Save for angle > 1 -4060+ 1E30 21 3A 1E ATN1: LD HL,ATNTAB ; Coefficient table -4061+ 1E33 CD F2 1C CALL SUMSER ; Evaluate sum of series -4062+ 1E36 21 E1 1D LD HL,HALFPI ; PI/2 - angle in case > 1 -4063+ 1E39 C9 RET ; Number > 1 - Sub from PI/2 -4064+ 1E3A -4065+ 1E3A 09 ATNTAB: .BYTE 9 ; Table used by ATN -4066+ 1E3B 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 -4067+ 1E3F 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 -4068+ 1E43 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 -4069+ 1E47 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 -4070+ 1E4B 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 -4071+ 1E4F C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 -4072+ 1E53 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 -4073+ 1E57 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 -4074+ 1E5B 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 -4075+ 1E5F -4076+ 1E5F -4077+ 1E5F C9 ARET: RET ; A RETurn instruction -4078+ 1E60 -4079+ 1E60 D7 GETINP: RST 10H ;input a character -4080+ 1E61 C9 RET -4081+ 1E62 -4082+ 1E62 CLS: -4083+ 1E62 3E 0C LD A,CS ; ASCII Clear screen -4084+ 1E64 C3 9C 1F JP MONOUT ; Output character -4085+ 1E67 -4086+ 1E67 CD 29 17 WIDTH: CALL GETINT ; Get integer 0-255 -4087+ 1E6A 7B LD A,E ; Width to A -4088+ 1E6B 32 F2 30 LD (LWIDTH),A ; Set width -4089+ 1E6E C9 RET -4090+ 1E6F -4091+ 1E6F CD C8 0F LINES: CALL GETNUM ; Get a number -4092+ 1E72 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -4093+ 1E75 ED 53 F6 30 LD (LINESC),DE ; Set lines counter -4094+ 1E79 ED 53 F8 30 LD (LINESN),DE ; Set lines number -4095+ 1E7D C9 RET -4096+ 1E7E -4097+ 1E7E CD 0D 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 -4098+ 1E81 D5 PUSH DE ; Save number -4099+ 1E82 E1 POP HL ; Number to HL -4100+ 1E83 46 LD B,(HL) ; Get LSB of contents -4101+ 1E84 23 INC HL -4102+ 1E85 7E LD A,(HL) ; Get MSB of contents -4103+ 1E86 C3 83 13 JP ABPASS ; Return integer AB -4104+ 1E89 -4105+ 1E89 CD C8 0F DOKE: CALL GETNUM ; Get a number -4106+ 1E8C CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -4107+ 1E8F D5 PUSH DE ; Save address -4108+ 1E90 CD D1 09 CALL CHKSYN ; Make sure ',' follows -4109+ 1E93 2C .BYTE ',' -4110+ 1E94 CD C8 0F CALL GETNUM ; Get a number -4111+ 1E97 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -4112+ 1E9A E3 EX (SP),HL ; Save value,get address -4113+ 1E9B 73 LD (HL),E ; Save LSB of value -4114+ 1E9C 23 INC HL -4115+ 1E9D 72 LD (HL),D ; Save MSB of value -4116+ 1E9E E1 POP HL ; Restore code string address -4117+ 1E9F C9 RET -4118+ 1EA0 -4119+ 1EA0 -4120+ 1EA0 ; HEX$(nn) Convert 16 bit number to Hexadecimal string -4121+ 1EA0 -4122+ 1EA0 CD CB 0F HEX: CALL TSTNUM ; Verify it's a number -4123+ 1EA3 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -4124+ 1EA6 C5 PUSH BC ; Save contents of BC -4125+ 1EA7 21 99 31 LD HL,PBUFF -4126+ 1EAA 7A LD A,D ; Get high order into A -4127+ 1EAB FE 00 CP $0 -4128+ 1EAD 28 0C JR Z,HEX2 ; Skip output if both high digits are zero -4129+ 1EAF CD D8 1E CALL BYT2ASC ; Convert D to ASCII -4130+ 1EB2 78 LD A,B -4131+ 1EB3 FE 30 CP '0' -4132+ 1EB5 28 02 JR Z,HEX1 ; Don't store high digit if zero -4133+ 1EB7 70 LD (HL),B ; Store it to PBUFF -4134+ 1EB8 23 INC HL ; Next location -4135+ 1EB9 71 HEX1: LD (HL),C ; Store C to PBUFF+1 -4136+ 1EBA 23 INC HL ; Next location -4137+ 1EBB 7B HEX2: LD A,E ; Get lower byte -4138+ 1EBC CD D8 1E CALL BYT2ASC ; Convert E to ASCII -4139+ 1EBF 7A LD A,D -4140+ 1EC0 FE 00 CP $0 -4141+ 1EC2 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte -4142+ 1EC4 78 LD A,B -4143+ 1EC5 FE 30 CP '0' ; If high digit of lower byte is zero then don't print -4144+ 1EC7 28 02 JR Z,HEX4 -4145+ 1EC9 70 HEX3: LD (HL),B ; to PBUFF+2 -4146+ 1ECA 23 INC HL ; Next location -4147+ 1ECB 71 HEX4: LD (HL),C ; to PBUFF+3 -4148+ 1ECC 23 INC HL ; PBUFF+4 to zero -4149+ 1ECD AF XOR A ; Terminating character -4150+ 1ECE 77 LD (HL),A ; Store zero to terminate -4151+ 1ECF 23 INC HL ; Make sure PBUFF is terminated -4152+ 1ED0 77 LD (HL),A ; Store the double zero there -4153+ 1ED1 C1 POP BC ; Get BC back -4154+ 1ED2 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF -4155+ 1ED5 C3 31 14 JP STR1 ; Convert the PBUFF to a string and return it -4156+ 1ED8 -4157+ 1ED8 47 BYT2ASC LD B,A ; Save original value -4158+ 1ED9 E6 0F AND $0F ; Strip off upper nybble -4159+ 1EDB FE 0A CP $0A ; 0-9? -4160+ 1EDD 38 02 JR C,ADD30 ; If A-F, add 7 more -4161+ 1EDF C6 07 ADD A,$07 ; Bring value up to ASCII A-F -4162+ 1EE1 C6 30 ADD30 ADD A,$30 ; And make ASCII -4163+ 1EE3 4F LD C,A ; Save converted char to C -4164+ 1EE4 78 LD A,B ; Retrieve original value -4165+ 1EE5 0F RRCA ; and Rotate it right -4166+ 1EE6 0F RRCA -4167+ 1EE7 0F RRCA -4168+ 1EE8 0F RRCA -4169+ 1EE9 E6 0F AND $0F ; Mask off upper nybble -4170+ 1EEB FE 0A CP $0A ; 0-9? < A hex? -4171+ 1EED 38 02 JR C,ADD301 ; Skip Add 7 -4172+ 1EEF C6 07 ADD A,$07 ; Bring it up to ASCII A-F -4173+ 1EF1 C6 30 ADD301 ADD A,$30 ; And make it full ASCII -4174+ 1EF3 47 LD B,A ; Store high order byte -4175+ 1EF4 C9 RET -4176+ 1EF5 -4177+ 1EF5 ; Convert "&Hnnnn" to FPREG -4178+ 1EF5 ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" -4179+ 1EF5 ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 -4180+ 1EF5 EB HEXTFP EX DE,HL ; Move code string pointer to DE -4181+ 1EF6 21 00 00 LD HL,$0000 ; Zero out the value -4182+ 1EF9 CD 0E 1F CALL GETHEX ; Check the number for valid hex -4183+ 1EFC DA 2E 1F JP C,HXERR ; First value wasn't hex, HX error -4184+ 1EFF 18 05 JR HEXLP1 ; Convert first character -4185+ 1F01 CD 0E 1F HEXLP CALL GETHEX ; Get second and addtional characters -4186+ 1F04 38 1F JR C,HEXIT ; Exit if not a hex character -4187+ 1F06 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left -4188+ 1F07 29 ADD HL,HL -4189+ 1F08 29 ADD HL,HL -4190+ 1F09 29 ADD HL,HL -4191+ 1F0A B5 OR L ; Add in D0-D3 into L -4192+ 1F0B 6F LD L,A ; Save new value -4193+ 1F0C 18 F3 JR HEXLP ; And continue until all hex characters are in -4194+ 1F0E -4195+ 1F0E 13 GETHEX INC DE ; Next location -4196+ 1F0F 1A LD A,(DE) ; Load character at pointer -4197+ 1F10 FE 20 CP ' ' -4198+ 1F12 CA 0E 1F JP Z,GETHEX ; Skip spaces -4199+ 1F15 D6 30 SUB $30 ; Get absolute value -4200+ 1F17 D8 RET C ; < "0", error -4201+ 1F18 FE 0A CP $0A -4202+ 1F1A 38 05 JR C,NOSUB7 ; Is already in the range 0-9 -4203+ 1F1C D6 07 SUB $07 ; Reduce to A-F -4204+ 1F1E FE 0A CP $0A ; Value should be $0A-$0F at this point -4205+ 1F20 D8 RET C ; CY set if was : ; < = > ? @ -4206+ 1F21 FE 10 NOSUB7 CP $10 ; > Greater than "F"? -4207+ 1F23 3F CCF -4208+ 1F24 C9 RET ; CY set if it wasn't valid hex -4209+ 1F25 -4210+ 1F25 EB HEXIT EX DE,HL ; Value into DE, Code string into HL -4211+ 1F26 7A LD A,D ; Load DE into AC -4212+ 1F27 4B LD C,E ; For prep to -4213+ 1F28 E5 PUSH HL -4214+ 1F29 CD 82 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4215+ 1F2C E1 POP HL -4216+ 1F2D C9 RET -4217+ 1F2E -4218+ 1F2E 1E 26 HXERR: LD E,HX ; ?HEX Error -4219+ 1F30 C3 17 07 JP ERROR -4220+ 1F33 -4221+ 1F33 ; BIN$(NN) Convert integer to a 1-16 char binary string -4222+ 1F33 CD CB 0F BIN: CALL TSTNUM ; Verify it's a number -4223+ 1F36 CD 0D 0C CALL DEINT ; Get integer -32768 to 32767 -4224+ 1F39 C5 BIN2: PUSH BC ; Save contents of BC -4225+ 1F3A 21 99 31 LD HL,PBUFF -4226+ 1F3D 06 11 LD B,17 ; One higher than max char count -4227+ 1F3F ZEROSUP: ; Suppress leading zeros -4228+ 1F3F 05 DEC B ; Max 16 chars -4229+ 1F40 78 LD A,B -4230+ 1F41 FE 01 CP $01 -4231+ 1F43 28 08 JR Z,BITOUT ; Always output at least one character -4232+ 1F45 CB 13 RL E -4233+ 1F47 CB 12 RL D -4234+ 1F49 30 F4 JR NC,ZEROSUP -4235+ 1F4B 18 04 JR BITOUT2 -4236+ 1F4D BITOUT: -4237+ 1F4D CB 13 RL E -4238+ 1F4F CB 12 RL D ; Top bit now in carry -4239+ 1F51 BITOUT2: -4240+ 1F51 3E 30 LD A,'0' ; Char for '0' -4241+ 1F53 CE 00 ADC A,0 ; If carry set then '0' --> '1' -4242+ 1F55 77 LD (HL),A -4243+ 1F56 23 INC HL -4244+ 1F57 05 DEC B -4245+ 1F58 20 F3 JR NZ,BITOUT -4246+ 1F5A AF XOR A ; Terminating character -4247+ 1F5B 77 LD (HL),A ; Store zero to terminate -4248+ 1F5C 23 INC HL ; Make sure PBUFF is terminated -4249+ 1F5D 77 LD (HL),A ; Store the double zero there -4250+ 1F5E C1 POP BC -4251+ 1F5F 21 99 31 LD HL,PBUFF -4252+ 1F62 C3 31 14 JP STR1 -4253+ 1F65 -4254+ 1F65 ; Convert "&Bnnnn" to FPREG -4255+ 1F65 ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" -4256+ 1F65 EB BINTFP: EX DE,HL ; Move code string pointer to DE -4257+ 1F66 21 00 00 LD HL,$0000 ; Zero out the value -4258+ 1F69 CD 82 1F CALL CHKBIN ; Check the number for valid bin -4259+ 1F6C DA 90 1F JP C,BINERR ; First value wasn't bin, HX error -4260+ 1F6F D6 30 BINIT: SUB '0' -4261+ 1F71 29 ADD HL,HL ; Rotate HL left -4262+ 1F72 B5 OR L -4263+ 1F73 6F LD L,A -4264+ 1F74 CD 82 1F CALL CHKBIN ; Get second and addtional characters -4265+ 1F77 30 F6 JR NC,BINIT ; Process if a bin character -4266+ 1F79 EB EX DE,HL ; Value into DE, Code string into HL -4267+ 1F7A 7A LD A,D ; Load DE into AC -4268+ 1F7B 4B LD C,E ; For prep to -4269+ 1F7C E5 PUSH HL -4270+ 1F7D CD 82 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG -4271+ 1F80 E1 POP HL -4272+ 1F81 C9 RET -4273+ 1F82 -4274+ 1F82 ; Char is in A, NC if char is 0 or 1 -4275+ 1F82 13 CHKBIN: INC DE -4276+ 1F83 1A LD A,(DE) -4277+ 1F84 FE 20 CP ' ' -4278+ 1F86 CA 82 1F JP Z,CHKBIN ; Skip spaces -4279+ 1F89 FE 30 CP '0' ; Set C if < '0' -4280+ 1F8B D8 RET C -4281+ 1F8C FE 32 CP '2' -4282+ 1F8E 3F CCF ; Set C if > '1' -4283+ 1F8F C9 RET -4284+ 1F90 -4285+ 1F90 1E 28 BINERR: LD E,BN ; ?BIN Error -4286+ 1F92 C3 17 07 JP ERROR -4287+ 1F95 -4288+ 1F95 -4289+ 1F95 JJUMP1: -4290+ 1F95 DD 21 FF FF LD IX,-1 ; Flag cold start -4291+ 1F99 C3 67 03 JP CSTART ; Go and initialise -4292+ 1F9C -4293+ 1F9C MONOUT: -4294+ 1F9C C3 08 00 JP $0008 ; output a char -4295+ 1F9F -4296+ 1F9F -4297+ 1F9F MONITR: -4298+ 1F9F C3 00 00 JP $0000 ; Restart (Normally Monitor Start) -4299+ 1FA2 -4300+ 1FA2 -4301+ 1FA2 3E 00 INITST: LD A,0 ; Clear break flag -4302+ 1FA4 32 FD 30 LD (BRKFLG),A -4303+ 1FA7 C3 6E 03 JP INIT -4304+ 1FAA -4305+ 1FAA ED 45 ARETN: RETN ; Return from NMI -4306+ 1FAC -4307+ 1FAC -4308+ 1FAC F5 TSTBIT: PUSH AF ; Save bit mask -4309+ 1FAD A0 AND B ; Get common bits -4310+ 1FAE C1 POP BC ; Restore bit mask -4311+ 1FAF B8 CP B ; Same bit set? -4312+ 1FB0 3E 00 LD A,0 ; Return 0 in A -4313+ 1FB2 C9 RET -4314+ 1FB3 -4315+ 1FB3 CD DC 09 OUTNCR: CALL OUTC ; Output character in A -4316+ 1FB6 C3 03 0E JP PRNTCRLF ; Output CRLF -4317+ 1FB9 -0693 1FB9 .end +0596 0277 DB 89 rdWait1: IN A,(SD_STATUS) +0597 0279 FE 80 CP 128 ; Check for ready status +0598 027B 20 FA JR NZ,rdWait1 +0599 027D +0600 027D ; Add multiple status checks before starting read +0601 027D 06 03 LD B,3 ; Check status 3 times +0602 027F rdCheck1: +0603 027F DB 89 IN A,(SD_STATUS) +0604 0281 FE 80 CP 128 +0605 0283 20 FA JR NZ,rdCheck1 +0606 0285 10 F8 DJNZ rdCheck1 +0607 0287 +0608 0287 CD 64 02 CALL setLBAaddr +0609 028A +0610 028A 3E 00 LD A,$00 ; 00 = Read block +0611 028C D3 89 OUT (SD_CONTROL),A +0612 028E +0613 028E 0E 04 LD c,4 +0614 0290 rd4secs: +0615 0290 06 80 LD b,128 +0616 0292 rdByte: +0617 0292 +0618 0292 DB 89 rdWait2: IN A,(SD_STATUS) +0619 0294 FE E0 CP 224 ; Read byte waiting +0620 0296 20 FA JR NZ,rdWait2 +0621 0298 +0622 0298 ; Add extra validation checks before each read +0623 0298 C5 PUSH BC ; Save main counters +0624 0299 06 02 LD B,2 ; Check status twice +0625 029B rdCheck2: +0626 029B DB 89 IN A,(SD_STATUS) +0627 029D FE E0 CP 224 +0628 029F 20 FA JR NZ,rdCheck2 +0629 02A1 10 F8 DJNZ rdCheck2 +0630 02A3 C1 POP BC ; Restore main counters +0631 02A4 +0632 02A4 DB 88 IN A,(SD_DATA) +0633 02A6 +0634 02A6 ; Add small delay after read before store +0635 02A6 C5 PUSH BC +0636 02A7 06 0A LD B,10 +0637 02A9 rdDelay: +0638 02A9 10 FE DJNZ rdDelay +0639 02AB C1 POP BC +0640 02AC +0641 02AC 77 LD (HL),A +0642 02AD 23 INC HL +0643 02AE 05 dec b +0644 02AF 20 E1 JR NZ, rdByte +0645 02B1 0D dec c +0646 02B2 20 DC JR NZ,rd4secs +0647 02B4 +0648 02B4 ; Add final wait before returning +0649 02B4 06 00 LD B,0 +0650 02B6 rdWaitFinal: +0651 02B6 DB 89 IN A,(SD_STATUS) +0652 02B8 FE 80 CP 128 ; Wait for ready status +0653 02BA 20 FA JR NZ,rdWaitFinal +0654 02BC 10 F8 DJNZ rdWaitFinal +0655 02BE +0656 02BE E1 POP HL +0657 02BF C1 POP BC +0658 02C0 F1 POP AF +0659 02C1 +0660 02C1 C9 RET +0661 02C2 +0662 02C2 ;------------------------------------------------------------------------------ +0663 02C2 ; END OF ROUTINES AS USED IN BIOS +0664 02C2 ;------------------------------------------------------------------------------ +0665 02C2 +0666 02C2 +0667 02C2 43 50 2F 4D M_SIGNON .BYTE "CP/M Boot ROM 2.0" +0667 02C6 20 42 6F 6F +0667 02CA 74 20 52 4F +0667 02CE 4D 20 32 2E +0667 02D2 30 +0668 02D3 ; .BYTE " based on design by G. Searle" +0669 02D3 ; .BYTE $0D,$0A +0670 02D3 0D 0A .BYTE $0D,$0A +0671 02D5 49 2D 53 74 .TEXT "I-Strt Intrp" +0671 02D9 72 74 20 49 +0671 02DD 6E 74 72 70 +0672 02E1 0D 0A .BYTE $0D,$0A +0673 02E3 58 2D 42 6F .TEXT "X-Boot CP/M" +0673 02E7 6F 74 20 43 +0673 02EB 50 2F 4D +0674 02EE 0D 0A .BYTE $0D,$0A +0675 02F0 3A 6E 6E 6E .TEXT ":nnnn-Load I rcrd" +0675 02F4 6E 2D 4C 6F +0675 02F8 61 64 20 49 +0675 02FC 20 72 63 72 +0675 0300 64 +0676 0301 0D 0A .BYTE $0D,$0A +0677 0303 47 6E 6E 6E .TEXT "Gnnnn-R loc" +0677 0307 6E 2D 52 20 +0677 030B 6C 6F 63 +0678 030E 0D 0A .BYTE $0D,$0A +0679 0310 00 .BYTE $00 +0680 0311 +0681 0311 M_BASTXT +0682 0311 0D 0A .BYTE $0D,$0A +0683 0313 43 6F 6C 64 .TEXT "Cold or warm?" +0683 0317 20 6F 72 20 +0683 031B 77 61 72 6D +0683 031F 3F +0684 0320 0D 0A 00 .BYTE $0D,$0A,$00 +0685 0323 +0686 0323 43 68 65 63 CKSUMERR .BYTE "Checksum error" +0686 0327 6B 73 75 6D +0686 032B 20 65 72 72 +0686 032F 6F 72 +0687 0331 0D 0A 00 .BYTE $0D,$0A,$00 +0688 0334 +0689 0334 INITTXT +0690 0334 0C .BYTE $0C +0691 0335 50 72 65 73 .TEXT "Press [space] to activate console." +0691 0339 73 20 5B 73 +0691 033D 70 61 63 65 +0691 0341 5D 20 74 6F +0691 0345 20 61 63 74 +0691 0349 69 76 61 74 +0691 034D 65 20 63 6F +0691 0351 6E 73 6F 6C +0691 0355 65 2E +0692 0357 0D 0A 00 .BYTE $0D,$0A, $00 +0693 035A +0694 035A LDETXT +0695 035A 43 6F 6D 70 .TEXT "Complete" +0695 035E 6C 65 74 65 +0696 0362 0D 0A 00 .BYTE $0D,$0A, $00 +0697 0365 +0698 0365 ; ========================================================================================================================== +0699 0365 ; GENERAL EQUATES +0700 0365 +0701 0365 CTRLC .EQU 03H ; Control "C" +0702 0365 CTRLG .EQU 07H ; Control "G" +0703 0365 BKSP .EQU 08H ; Back space +0704 0365 LF .EQU 0AH ; Line feed +0705 0365 CS .EQU 0CH ; Clear screen +0706 0365 CR .EQU 0DH ; Carriage return +0707 0365 CTRLO .EQU 0FH ; Control "O" +0708 0365 CTRLQ .EQU 11H ; Control "Q" +0709 0365 CTRLR .EQU 12H ; Control "R" +0710 0365 CTRLS .EQU 13H ; Control "S" +0711 0365 CTRLU .EQU 15H ; Control "U" +0712 0365 ESC .EQU 1BH ; Escape +0713 0365 DEL .EQU 7FH ; Delete +0714 0365 +0715 0365 +0716 0365 ;=========================================================================================================================== +0717 0365 +0718 0365 ; NASCOM ROM BASIC Ver 4.7, +0719 0365 ; used to be here, removed to get rid of the '(C) 1978 Microsoft' +0720 0365 +0721 0365 STARTINT: +0722 0365 #INCLUDE "SOURCE\\INTPRT.ASM" +0001+ 0365 ;------------------------------------------------------------------------------ +0002+ 0365 ; Start BASIC command +0003+ 0365 ;------------------------------------------------------------------------------ +0004+ 0365 BASIC +0005+ 0365 21 11 03 LD HL,M_BASTXT +0006+ 0368 CD 37 01 CALL M_PRINT +0007+ 036B CD 45 01 CALL M_GETCHR +0008+ 036E C8 RET Z ; Cancel if CTRL-C +0009+ 036F E6 5F AND $5F ; uppercase +0010+ 0371 FE 43 CP 'C' +0011+ 0373 CA 7C 03 JP Z,COLD +0012+ 0376 FE 57 CP 'W' +0013+ 0378 CA 7F 03 JP Z,WARM +0014+ 037B C9 RET +0015+ 037C +0016+ 037C ; BASIC WORK SPACE LOCATIONS +0017+ 037C +0018+ 037C WRKSPC .EQU 30B0H ; BASIC Work space +0019+ 037C USR .EQU WRKSPC+3H ; "USR (x)" jump +0020+ 037C OUTSUB .EQU WRKSPC+6H ; "OUT p,n" +0021+ 037C OTPORT .EQU WRKSPC+7H ; Port (p) +0022+ 037C DIVSUP .EQU WRKSPC+9H ; Division support routine +0023+ 037C DIV1 .EQU WRKSPC+0AH ; <- Values +0024+ 037C DIV2 .EQU WRKSPC+0EH ; <- to +0025+ 037C DIV3 .EQU WRKSPC+12H ; <- be +0026+ 037C DIV4 .EQU WRKSPC+15H ; <-inserted +0027+ 037C SEED .EQU WRKSPC+17H ; Random number seed +0028+ 037C LSTRND .EQU WRKSPC+3AH ; Last random number +0029+ 037C INPSUB .EQU WRKSPC+3EH ; #INP (x)" Routine +0030+ 037C INPORT .EQU WRKSPC+3FH ; PORT (x) +0031+ 037C NULLS .EQU WRKSPC+41H ; Number of nulls +0032+ 037C LWIDTH .EQU WRKSPC+42H ; Terminal width +0033+ 037C COMMAN .EQU WRKSPC+43H ; Width for commas +0034+ 037C NULFLG .EQU WRKSPC+44H ; Null after input byte flag +0035+ 037C CTLOFG .EQU WRKSPC+45H ; Control "O" flag +0036+ 037C LINESC .EQU WRKSPC+46H ; Lines counter +0037+ 037C LINESN .EQU WRKSPC+48H ; Lines number +0038+ 037C CHKSUM .EQU WRKSPC+4AH ; Array load/save check sum +0039+ 037C NMIFLG .EQU WRKSPC+4CH ; Flag for NMI break routine +0040+ 037C BRKFLG .EQU WRKSPC+4DH ; Break flag +0041+ 037C RINPUT .EQU WRKSPC+4EH ; Input reflection +0042+ 037C POINT .EQU WRKSPC+51H ; "POINT" reflection (unused) +0043+ 037C PSET .EQU WRKSPC+54H ; "SET" reflection +0044+ 037C RESET .EQU WRKSPC+57H ; "RESET" reflection +0045+ 037C STRSPC .EQU WRKSPC+5AH ; Bottom of string space +0046+ 037C LINEAT .EQU WRKSPC+5CH ; Current line number +0047+ 037C BASTXT .EQU WRKSPC+5EH ; Pointer to start of program +0048+ 037C BUFFER .EQU WRKSPC+61H ; Input buffer +0049+ 037C STACK .EQU WRKSPC+66H ; Initial stack +0050+ 037C CURPOS .EQU WRKSPC+0ABH ; Character position on line +0051+ 037C LCRFLG .EQU WRKSPC+0ACH ; Locate/Create flag +0052+ 037C TYPE .EQU WRKSPC+0ADH ; Data type flag +0053+ 037C DATFLG .EQU WRKSPC+0AEH ; Literal statement flag +0054+ 037C LSTRAM .EQU WRKSPC+0AFH ; Last available RAM +0055+ 037C TMSTPT .EQU WRKSPC+0B1H ; Temporary string pointer +0056+ 037C TMSTPL .EQU WRKSPC+0B3H ; Temporary string pool +0057+ 037C TMPSTR .EQU WRKSPC+0BFH ; Temporary string +0058+ 037C STRBOT .EQU WRKSPC+0C3H ; Bottom of string space +0059+ 037C CUROPR .EQU WRKSPC+0C5H ; Current operator in EVAL +0060+ 037C LOOPST .EQU WRKSPC+0C7H ; First statement of loop +0061+ 037C DATLIN .EQU WRKSPC+0C9H ; Line of current DATA item +0062+ 037C FORFLG .EQU WRKSPC+0CBH ; "FOR" loop flag +0063+ 037C LSTBIN .EQU WRKSPC+0CCH ; Last byte entered +0064+ 037C READFG .EQU WRKSPC+0CDH ; Read/Input flag +0065+ 037C BRKLIN .EQU WRKSPC+0CEH ; Line of break +0066+ 037C NXTOPR .EQU WRKSPC+0D0H ; Next operator in EVAL +0067+ 037C ERRLIN .EQU WRKSPC+0D2H ; Line of error +0068+ 037C CONTAD .EQU WRKSPC+0D4H ; Where to CONTinue +0069+ 037C PROGND .EQU WRKSPC+0D6H ; End of program +0070+ 037C VAREND .EQU WRKSPC+0D8H ; End of variables +0071+ 037C ARREND .EQU WRKSPC+0DAH ; End of arrays +0072+ 037C NXTDAT .EQU WRKSPC+0DCH ; Next data item +0073+ 037C FNRGNM .EQU WRKSPC+0DEH ; Name of FN argument +0074+ 037C FNARG .EQU WRKSPC+0E0H ; FN argument value +0075+ 037C FPREG .EQU WRKSPC+0E4H ; Floating point register +0076+ 037C FPEXP .EQU FPREG+3 ; Floating point exponent +0077+ 037C SGNRES .EQU WRKSPC+0E8H ; Sign of result +0078+ 037C PBUFF .EQU WRKSPC+0E9H ; Number print buffer +0079+ 037C MULVAL .EQU WRKSPC+0F6H ; Multiplier +0080+ 037C PROGST .EQU WRKSPC+0F9H ; Start of program text area +0081+ 037C STLOOK .EQU WRKSPC+15DH ; Start of memory test +0082+ 037C +0083+ 037C ; BASIC ERROR CODE VALUES +0084+ 037C +0085+ 037C NF .EQU 00H ; NEXT without FOR +0086+ 037C SN .EQU 02H ; Syntax error +0087+ 037C RG .EQU 04H ; RETURN without GOSUB +0088+ 037C OD .EQU 06H ; Out of DATA +0089+ 037C FC .EQU 08H ; Function call error +0090+ 037C OV .EQU 0AH ; Overflow +0091+ 037C OM .EQU 0CH ; Out of memory +0092+ 037C UL .EQU 0EH ; Undefined line number +0093+ 037C BS .EQU 10H ; Bad subscript +0094+ 037C DD .EQU 12H ; Re-DIMensioned array +0095+ 037C DZ .EQU 14H ; Division by zero (/0) +0096+ 037C ID .EQU 16H ; Illegal direct +0097+ 037C TM .EQU 18H ; Type miss-match +0098+ 037C OS .EQU 1AH ; Out of string space +0099+ 037C LS .EQU 1CH ; String too long +0100+ 037C ST .EQU 1EH ; String formula too complex +0101+ 037C CN .EQU 20H ; Can't CONTinue +0102+ 037C UF .EQU 22H ; UnDEFined FN function +0103+ 037C MO .EQU 24H ; Missing operand +0104+ 037C HX .EQU 26H ; HEX error +0105+ 037C BN .EQU 28H ; BIN error +0106+ 037C +0107+ 037C ; .ORG 00396H +0108+ 037C +0109+ 037C C3 82 03 COLD: JP STARTB ; Jump for cold start +0110+ 037F C3 20 04 WARM: JP WARMST ; Jump for warm start +0111+ 0382 STARTB: +0112+ 0382 DD 21 00 00 LD IX,0 ; Flag cold start +0113+ 0386 C3 8D 03 JP CSTART ; Jump to initialise +0114+ 0389 +0115+ 0389 33 0C .WORD DEINT ; Get integer -32768 to 32767 +0116+ 038B A9 13 .WORD ABPASS ; Return integer in AB +0117+ 038D +0118+ 038D +0119+ 038D 21 B0 30 CSTART: LD HL,WRKSPC ; Start of workspace RAM +0120+ 0390 F9 LD SP,HL ; Set up a temporary stack +0121+ 0391 C3 C8 1F JP INITST ; Go to initialise +0122+ 0394 +0123+ 0394 11 5A 06 INIT: LD DE,INITAB ; Initialise workspace +0124+ 0397 06 63 LD B,INITBE-INITAB+3; Bytes to copy +0125+ 0399 21 B0 30 LD HL,WRKSPC ; Into workspace RAM +0126+ 039C 1A COPY: LD A,(DE) ; Get source +0127+ 039D 77 LD (HL),A ; To destination +0128+ 039E 23 INC HL ; Next destination +0129+ 039F 13 INC DE ; Next source +0130+ 03A0 05 DEC B ; Count bytes +0131+ 03A1 C2 9C 03 JP NZ,COPY ; More to move +0132+ 03A4 F9 LD SP,HL ; Temporary stack +0133+ 03A5 CD 5B 08 CALL CLREG ; Clear registers and stack +0134+ 03A8 CD 29 0E CALL PRNTCRLF ; Output CRLF +0135+ 03AB 32 5A 31 LD (BUFFER+72+1),A ; Mark end of buffer +0136+ 03AE 32 A9 31 LD (PROGST),A ; Initialise program area +0137+ 03B1 21 6F 04 MSIZE: LD HL,MEMMSG ; Point to message +0138+ 03B4 CD C7 14 CALL PRS ; Output "Memory size" +0139+ 03B7 CD 78 08 CALL PROMPT ; Get input with '?' +0140+ 03BA CD 81 0B CALL GETCHR ; Get next character +0141+ 03BD B7 OR A ; Set flags +0142+ 03BE C2 D6 03 JP NZ,TSTMEM ; If number - Test if RAM there +0143+ 03C1 21 0D 32 LD HL,STLOOK ; Point to start of RAM +0144+ 03C4 23 MLOOP: INC HL ; Next byte +0145+ 03C5 7C LD A,H ; Above address FFFF ? +0146+ 03C6 B5 OR L +0147+ 03C7 CA E8 03 JP Z,SETTOP ; Yes - 64K RAM +0148+ 03CA 7E LD A,(HL) ; Get contents +0149+ 03CB 47 LD B,A ; Save it +0150+ 03CC 2F CPL ; Flip all bits +0151+ 03CD 77 LD (HL),A ; Put it back +0152+ 03CE BE CP (HL) ; RAM there if same +0153+ 03CF 70 LD (HL),B ; Restore old contents +0154+ 03D0 CA C4 03 JP Z,MLOOP ; If RAM - test next byte +0155+ 03D3 C3 E8 03 JP SETTOP ; Top of RAM found +0156+ 03D6 +0157+ 03D6 CD 4D 0C TSTMEM: CALL ATOH ; Get high memory into DE +0158+ 03D9 B7 OR A ; Set flags on last byte +0159+ 03DA C2 29 07 JP NZ,SNERR ; ?SN Error if bad character +0160+ 03DD EB EX DE,HL ; Address into HL +0161+ 03DE 2B DEC HL ; Back one byte +0162+ 03DF 3E D9 LD A,11011001B ; Test byte +0163+ 03E1 46 LD B,(HL) ; Get old contents +0164+ 03E2 77 LD (HL),A ; Load test byte +0165+ 03E3 BE CP (HL) ; RAM there if same +0166+ 03E4 70 LD (HL),B ; Restore old contents +0167+ 03E5 C2 B1 03 JP NZ,MSIZE ; Ask again if no RAM +0168+ 03E8 +0169+ 03E8 2B SETTOP: DEC HL ; Back one byte +0170+ 03E9 11 0C 32 LD DE,STLOOK-1 ; See if enough RAM +0171+ 03EC CD F1 09 CALL CPDEHL ; Compare DE with HL +0172+ 03EF DA B1 03 JP C,MSIZE ; Ask again if not enough RAM +0173+ 03F2 11 CE FF LD DE,0-50 ; 50 Bytes string space +0174+ 03F5 22 5F 31 LD (LSTRAM),HL ; Save last available RAM +0175+ 03F8 19 ADD HL,DE ; Allocate string space +0176+ 03F9 22 0A 31 LD (STRSPC),HL ; Save string space +0177+ 03FC CD 36 08 CALL CLRPTR ; Clear program area +0178+ 03FF 2A 0A 31 LD HL,(STRSPC) ; Get end of memory +0179+ 0402 11 EF FF LD DE,0-17 ; Offset for free bytes +0180+ 0405 19 ADD HL,DE ; Adjust HL +0181+ 0406 11 A9 31 LD DE,PROGST ; Start of program text +0182+ 0409 7D LD A,L ; Get LSB +0183+ 040A 93 SUB E ; Adjust it +0184+ 040B 6F LD L,A ; Re-save +0185+ 040C 7C LD A,H ; Get MSB +0186+ 040D 9A SBC A,D ; Adjust it +0187+ 040E 67 LD H,A ; Re-save +0188+ 040F E5 PUSH HL ; Save bytes free +0189+ 0410 21 38 04 LD HL,SIGNON ; Sign-on message +0190+ 0413 CD C7 14 CALL PRS ; Output string +0191+ 0416 E1 POP HL ; Get bytes free back +0192+ 0417 CD 6A 1B CALL PRNTHL ; Output amount of free memory +0193+ 041A 21 29 04 LD HL,BFREE ; " Bytes free" message +0194+ 041D CD C7 14 CALL PRS ; Output string +0195+ 0420 +0196+ 0420 31 16 31 WARMST: LD SP,STACK ; Temporary stack +0197+ 0423 CD 5B 08 BRKRET: CALL CLREG ; Clear registers and stack +0198+ 0426 C3 74 07 JP PRNTOK ; Go to get command line +0199+ 0429 +0200+ 0429 20 42 79 74 BFREE: .BYTE " Bytes free",CR,LF,0,0 +0200+ 042D 65 73 20 66 +0200+ 0431 72 65 65 0D +0200+ 0435 0A 00 00 +0201+ 0438 +0202+ 0438 5A 38 30 20 SIGNON: .BYTE "Z80 BASIC Ver 4.7b",CR,LF +0202+ 043C 42 41 53 49 +0202+ 0440 43 20 56 65 +0202+ 0444 72 20 34 2E +0202+ 0448 37 62 0D 0A +0203+ 044C 43 6F 70 79 .BYTE "Copyright ",40,"C",41 +0203+ 0450 72 69 67 68 +0203+ 0454 74 20 28 43 +0203+ 0458 29 +0204+ 0459 20 31 39 37 .BYTE " 1978 by Microsoft",CR,LF,0,0 +0204+ 045D 38 20 62 79 +0204+ 0461 20 4D 69 63 +0204+ 0465 72 6F 73 6F +0204+ 0469 66 74 0D 0A +0204+ 046D 00 00 +0205+ 046F +0206+ 046F 4D 65 6D 6F MEMMSG: .BYTE "Memory top",0 +0206+ 0473 72 79 20 74 +0206+ 0477 6F 70 00 +0207+ 047A +0208+ 047A ; FUNCTION ADDRESS TABLE +0209+ 047A +0210+ 047A DF 19 FNCTAB: .WORD SGN +0211+ 047C A3 1A .WORD INT +0212+ 047E F5 19 .WORD ABS +0213+ 0480 B3 30 .WORD USR +0214+ 0482 87 13 .WORD FRE +0215+ 0484 0C 17 .WORD INP +0216+ 0486 B5 13 .WORD POS +0217+ 0488 69 1C .WORD SQR +0218+ 048A 48 1D .WORD RND +0219+ 048C 84 18 .WORD LOG +0220+ 048E B7 1C .WORD EXP +0221+ 0490 BD 1D .WORD COS +0222+ 0492 C3 1D .WORD SIN +0223+ 0494 24 1E .WORD TAN +0224+ 0496 39 1E .WORD ATN +0225+ 0498 60 17 .WORD PEEK +0226+ 049A A4 1E .WORD DEEK +0227+ 049C 01 31 .WORD POINT +0228+ 049E 39 16 .WORD LEN +0229+ 04A0 51 14 .WORD STR +0230+ 04A2 D3 16 .WORD VAL +0231+ 04A4 48 16 .WORD ASC +0232+ 04A6 59 16 .WORD CHR +0233+ 04A8 C6 1E .WORD HEX +0234+ 04AA 59 1F .WORD BIN +0235+ 04AC 69 16 .WORD LEFT +0236+ 04AE 99 16 .WORD RIGHT +0237+ 04B0 A3 16 .WORD MID +0238+ 04B2 +0239+ 04B2 ; RESERVED WORD LIST +0240+ 04B2 +0241+ 04B2 C5 4E 44 WORDS: .BYTE 'E'+80H,"ND" +0242+ 04B5 C6 4F 52 .BYTE 'F'+80H,"OR" +0243+ 04B8 CE 45 58 54 .BYTE 'N'+80H,"EXT" +0244+ 04BC C4 41 54 41 .BYTE 'D'+80H,"ATA" +0245+ 04C0 C9 4E 50 55 .BYTE 'I'+80H,"NPUT" +0245+ 04C4 54 +0246+ 04C5 C4 49 4D .BYTE 'D'+80H,"IM" +0247+ 04C8 D2 45 41 44 .BYTE 'R'+80H,"EAD" +0248+ 04CC CC 45 54 .BYTE 'L'+80H,"ET" +0249+ 04CF C7 4F 54 4F .BYTE 'G'+80H,"OTO" +0250+ 04D3 D2 55 4E .BYTE 'R'+80H,"UN" +0251+ 04D6 C9 46 .BYTE 'I'+80H,"F" +0252+ 04D8 D2 45 53 54 .BYTE 'R'+80H,"ESTORE" +0252+ 04DC 4F 52 45 +0253+ 04DF C7 4F 53 55 .BYTE 'G'+80H,"OSUB" +0253+ 04E3 42 +0254+ 04E4 D2 45 54 55 .BYTE 'R'+80H,"ETURN" +0254+ 04E8 52 4E +0255+ 04EA D2 45 4D .BYTE 'R'+80H,"EM" +0256+ 04ED D3 54 4F 50 .BYTE 'S'+80H,"TOP" +0257+ 04F1 CF 55 54 .BYTE 'O'+80H,"UT" +0258+ 04F4 CF 4E .BYTE 'O'+80H,"N" +0259+ 04F6 CE 55 4C 4C .BYTE 'N'+80H,"ULL" +0260+ 04FA D7 41 49 54 .BYTE 'W'+80H,"AIT" +0261+ 04FE C4 45 46 .BYTE 'D'+80H,"EF" +0262+ 0501 D0 4F 4B 45 .BYTE 'P'+80H,"OKE" +0263+ 0505 C4 4F 4B 45 .BYTE 'D'+80H,"OKE" +0264+ 0509 D3 43 52 45 .BYTE 'S'+80H,"CREEN" +0264+ 050D 45 4E +0265+ 050F CC 49 4E 45 .BYTE 'L'+80H,"INES" +0265+ 0513 53 +0266+ 0514 C3 4C 53 .BYTE 'C'+80H,"LS" +0267+ 0517 D7 49 44 54 .BYTE 'W'+80H,"IDTH" +0267+ 051B 48 +0268+ 051C CD 4F 4E 49 .BYTE 'M'+80H,"ONITOR" +0268+ 0520 54 4F 52 +0269+ 0523 D3 45 54 .BYTE 'S'+80H,"ET" +0270+ 0526 D2 45 53 45 .BYTE 'R'+80H,"ESET" +0270+ 052A 54 +0271+ 052B D0 52 49 4E .BYTE 'P'+80H,"RINT" +0271+ 052F 54 +0272+ 0530 C3 4F 4E 54 .BYTE 'C'+80H,"ONT" +0273+ 0534 CC 49 53 54 .BYTE 'L'+80H,"IST" +0274+ 0538 C3 4C 45 41 .BYTE 'C'+80H,"LEAR" +0274+ 053C 52 +0275+ 053D C3 4C 4F 41 .BYTE 'C'+80H,"LOAD" +0275+ 0541 44 +0276+ 0542 C3 53 41 56 .BYTE 'C'+80H,"SAVE" +0276+ 0546 45 +0277+ 0547 CE 45 57 .BYTE 'N'+80H,"EW" +0278+ 054A +0279+ 054A D4 41 42 28 .BYTE 'T'+80H,"AB(" +0280+ 054E D4 4F .BYTE 'T'+80H,"O" +0281+ 0550 C6 4E .BYTE 'F'+80H,"N" +0282+ 0552 D3 50 43 28 .BYTE 'S'+80H,"PC(" +0283+ 0556 D4 48 45 4E .BYTE 'T'+80H,"HEN" +0284+ 055A CE 4F 54 .BYTE 'N'+80H,"OT" +0285+ 055D D3 54 45 50 .BYTE 'S'+80H,"TEP" +0286+ 0561 +0287+ 0561 AB .BYTE '+'+80H +0288+ 0562 AD .BYTE '-'+80H +0289+ 0563 AA .BYTE '*'+80H +0290+ 0564 AF .BYTE '/'+80H +0291+ 0565 DE .BYTE '^'+80H +0292+ 0566 C1 4E 44 .BYTE 'A'+80H,"ND" +0293+ 0569 CF 52 .BYTE 'O'+80H,"R" +0294+ 056B BE .BYTE '>'+80H +0295+ 056C BD .BYTE '='+80H +0296+ 056D BC .BYTE '<'+80H +0297+ 056E +0298+ 056E D3 47 4E .BYTE 'S'+80H,"GN" +0299+ 0571 C9 4E 54 .BYTE 'I'+80H,"NT" +0300+ 0574 C1 42 53 .BYTE 'A'+80H,"BS" +0301+ 0577 D5 53 52 .BYTE 'U'+80H,"SR" +0302+ 057A C6 52 45 .BYTE 'F'+80H,"RE" +0303+ 057D C9 4E 50 .BYTE 'I'+80H,"NP" +0304+ 0580 D0 4F 53 .BYTE 'P'+80H,"OS" +0305+ 0583 D3 51 52 .BYTE 'S'+80H,"QR" +0306+ 0586 D2 4E 44 .BYTE 'R'+80H,"ND" +0307+ 0589 CC 4F 47 .BYTE 'L'+80H,"OG" +0308+ 058C C5 58 50 .BYTE 'E'+80H,"XP" +0309+ 058F C3 4F 53 .BYTE 'C'+80H,"OS" +0310+ 0592 D3 49 4E .BYTE 'S'+80H,"IN" +0311+ 0595 D4 41 4E .BYTE 'T'+80H,"AN" +0312+ 0598 C1 54 4E .BYTE 'A'+80H,"TN" +0313+ 059B D0 45 45 4B .BYTE 'P'+80H,"EEK" +0314+ 059F C4 45 45 4B .BYTE 'D'+80H,"EEK" +0315+ 05A3 D0 4F 49 4E .BYTE 'P'+80H,"OINT" +0315+ 05A7 54 +0316+ 05A8 CC 45 4E .BYTE 'L'+80H,"EN" +0317+ 05AB D3 54 52 24 .BYTE 'S'+80H,"TR$" +0318+ 05AF D6 41 4C .BYTE 'V'+80H,"AL" +0319+ 05B2 C1 53 43 .BYTE 'A'+80H,"SC" +0320+ 05B5 C3 48 52 24 .BYTE 'C'+80H,"HR$" +0321+ 05B9 C8 45 58 24 .BYTE 'H'+80H,"EX$" +0322+ 05BD C2 49 4E 24 .BYTE 'B'+80H,"IN$" +0323+ 05C1 CC 45 46 54 .BYTE 'L'+80H,"EFT$" +0323+ 05C5 24 +0324+ 05C6 D2 49 47 48 .BYTE 'R'+80H,"IGHT$" +0324+ 05CA 54 24 +0325+ 05CC CD 49 44 24 .BYTE 'M'+80H,"ID$" +0326+ 05D0 80 .BYTE 80H ; End of list marker +0327+ 05D1 +0328+ 05D1 ; KEYWORD ADDRESS TABLE +0329+ 05D1 +0330+ 05D1 CB 0B WORDTB: .WORD PEND +0331+ 05D3 C8 0A .WORD FOR +0332+ 05D5 A3 0F .WORD NEXT +0333+ 05D7 18 0D .WORD DATA +0334+ 05D9 AA 0E .WORD INPUT +0335+ 05DB DF 11 .WORD DIM +0336+ 05DD D9 0E .WORD READ +0337+ 05DF 2F 0D .WORD LET +0338+ 05E1 D5 0C .WORD GOTO +0339+ 05E3 B8 0C .WORD RUN +0340+ 05E5 A7 0D .WORD IF +0341+ 05E7 91 0B .WORD RESTOR +0342+ 05E9 C4 0C .WORD GOSUB +0343+ 05EB F3 0C .WORD RETURN +0344+ 05ED 1A 0D .WORD REM +0345+ 05EF C9 0B .WORD STOP +0346+ 05F1 18 17 .WORD POUT +0347+ 05F3 89 0D .WORD ON +0348+ 05F5 0A 0C .WORD NULL +0349+ 05F7 1E 17 .WORD WAIT +0350+ 05F9 BD 13 .WORD DEF +0351+ 05FB 67 17 .WORD POKE +0352+ 05FD AF 1E .WORD DOKE +0353+ 05FF 1A 0D .WORD REM +0354+ 0601 95 1E .WORD LINES +0355+ 0603 88 1E .WORD CLS +0356+ 0605 8D 1E .WORD WIDTH +0357+ 0607 C5 1F .WORD MONITR +0358+ 0609 04 31 .WORD PSET +0359+ 060B 07 31 .WORD RESET +0360+ 060D CB 0D .WORD PRINT +0361+ 060F F7 0B .WORD CONT +0362+ 0611 3D 0A .WORD LIST +0363+ 0613 72 0C .WORD CLEAR +0364+ 0615 1A 0D .WORD REM +0365+ 0617 1A 0D .WORD REM +0366+ 0619 35 08 .WORD NEW +0367+ 061B +0368+ 061B ; RESERVED WORD TOKEN VALUES +0369+ 061B +0370+ 061B ZEND .EQU 080H ; END +0371+ 061B ZFOR .EQU 081H ; FOR +0372+ 061B ZDATA .EQU 083H ; DATA +0373+ 061B ZGOTO .EQU 088H ; GOTO +0374+ 061B ZGOSUB .EQU 08CH ; GOSUB +0375+ 061B ZREM .EQU 08EH ; REM +0376+ 061B ZPRINT .EQU 09EH ; PRINT +0377+ 061B ZNEW .EQU 0A4H ; NEW +0378+ 061B +0379+ 061B ZTAB .EQU 0A5H ; TAB +0380+ 061B ZTO .EQU 0A6H ; TO +0381+ 061B ZFN .EQU 0A7H ; FN +0382+ 061B ZSPC .EQU 0A8H ; SPC +0383+ 061B ZTHEN .EQU 0A9H ; THEN +0384+ 061B ZNOT .EQU 0AAH ; NOT +0385+ 061B ZSTEP .EQU 0ABH ; STEP +0386+ 061B +0387+ 061B ZPLUS .EQU 0ACH ; + +0388+ 061B ZMINUS .EQU 0ADH ; - +0389+ 061B ZTIMES .EQU 0AEH ; * +0390+ 061B ZDIV .EQU 0AFH ; / +0391+ 061B ZOR .EQU 0B2H ; OR +0392+ 061B ZGTR .EQU 0B3H ; > +0393+ 061B ZEQUAL .EQU 0B4H ; M +0394+ 061B ZLTH .EQU 0B5H ; < +0395+ 061B ZSGN .EQU 0B6H ; SGN +0396+ 061B ZPOINT .EQU 0C7H ; POINT +0397+ 061B ZLEFT .EQU 0CDH +2 ; LEFT$ +0398+ 061B +0399+ 061B ; ARITHMETIC PRECEDENCE TABLE +0400+ 061B +0401+ 061B 79 PRITAB: .BYTE 79H ; Precedence value +0402+ 061C 51 1B .WORD PADD ; FPREG = + FPREG +0403+ 061E +0404+ 061E 79 .BYTE 79H ; Precedence value +0405+ 061F 85 17 .WORD PSUB ; FPREG = - FPREG +0406+ 0621 +0407+ 0621 7C .BYTE 7CH ; Precedence value +0408+ 0622 C3 18 .WORD MULT ; PPREG = * FPREG +0409+ 0624 +0410+ 0624 7C .BYTE 7CH ; Precedence value +0411+ 0625 24 19 .WORD DIV ; FPREG = / FPREG +0412+ 0627 +0413+ 0627 7F .BYTE 7FH ; Precedence value +0414+ 0628 72 1C .WORD POWER ; FPREG = ^ FPREG +0415+ 062A +0416+ 062A 50 .BYTE 50H ; Precedence value +0417+ 062B 38 11 .WORD PAND ; FPREG = AND FPREG +0418+ 062D +0419+ 062D 46 .BYTE 46H ; Precedence value +0420+ 062E 37 11 .WORD POR ; FPREG = OR FPREG +0421+ 0630 +0422+ 0630 ; BASIC ERROR CODE LIST +0423+ 0630 +0424+ 0630 4E 46 ERRORS: .BYTE "NF" ; NEXT without FOR +0425+ 0632 53 4E .BYTE "SN" ; Syntax error +0426+ 0634 52 47 .BYTE "RG" ; RETURN without GOSUB +0427+ 0636 4F 44 .BYTE "OD" ; Out of DATA +0428+ 0638 46 43 .BYTE "FC" ; Illegal function call +0429+ 063A 4F 56 .BYTE "OV" ; Overflow error +0430+ 063C 4F 4D .BYTE "OM" ; Out of memory +0431+ 063E 55 4C .BYTE "UL" ; Undefined line +0432+ 0640 42 53 .BYTE "BS" ; Bad subscript +0433+ 0642 44 44 .BYTE "DD" ; Re-DIMensioned array +0434+ 0644 2F 30 .BYTE "/0" ; Division by zero +0435+ 0646 49 44 .BYTE "ID" ; Illegal direct +0436+ 0648 54 4D .BYTE "TM" ; Type mis-match +0437+ 064A 4F 53 .BYTE "OS" ; Out of string space +0438+ 064C 4C 53 .BYTE "LS" ; String too long +0439+ 064E 53 54 .BYTE "ST" ; String formula too complex +0440+ 0650 43 4E .BYTE "CN" ; Can't CONTinue +0441+ 0652 55 46 .BYTE "UF" ; Undefined FN function +0442+ 0654 4D 4F .BYTE "MO" ; Missing operand +0443+ 0656 48 58 .BYTE "HX" ; HEX error +0444+ 0658 42 4E .BYTE "BN" ; BIN error +0445+ 065A +0446+ 065A ; INITIALISATION TABLE ------------------------------------------------------- +0447+ 065A +0448+ 065A C3 20 04 INITAB: JP WARMST ; Warm start jump +0449+ 065D C3 48 0C JP FCERR ; "USR (X)" jump (Set to Error) +0450+ 0660 D3 00 OUT (0),A ; "OUT p,n" skeleton +0451+ 0662 C9 RET +0452+ 0663 D6 00 SUB 0 ; Division support routine +0453+ 0665 6F LD L,A +0454+ 0666 7C LD A,H +0455+ 0667 DE 00 SBC A,0 +0456+ 0669 67 LD H,A +0457+ 066A 78 LD A,B +0458+ 066B DE 00 SBC A,0 +0459+ 066D 47 LD B,A +0460+ 066E 3E 00 LD A,0 +0461+ 0670 C9 RET +0462+ 0671 00 00 00 .BYTE 0,0,0 ; Random number seed table used by RND +0463+ 0674 35 4A CA 99 .BYTE 035H,04AH,0CAH,099H ;-2.65145E+07 +0464+ 0678 39 1C 76 98 .BYTE 039H,01CH,076H,098H ; 1.61291E+07 +0465+ 067C 22 95 B3 98 .BYTE 022H,095H,0B3H,098H ;-1.17691E+07 +0466+ 0680 0A DD 47 98 .BYTE 00AH,0DDH,047H,098H ; 1.30983E+07 +0467+ 0684 53 D1 99 99 .BYTE 053H,0D1H,099H,099H ;-2-01612E+07 +0468+ 0688 0A 1A 9F 98 .BYTE 00AH,01AH,09FH,098H ;-1.04269E+07 +0469+ 068C 65 BC CD 98 .BYTE 065H,0BCH,0CDH,098H ;-1.34831E+07 +0470+ 0690 D6 77 3E 98 .BYTE 0D6H,077H,03EH,098H ; 1.24825E+07 +0471+ 0694 52 C7 4F 80 .BYTE 052H,0C7H,04FH,080H ; Last random number +0472+ 0698 DB 00 IN A,(0) ; INP (x) skeleton +0473+ 069A C9 RET +0474+ 069B 01 .BYTE 1 ; POS (x) number (1) +0475+ 069C FF .BYTE 255 ; Terminal width (255 = no auto CRLF) +0476+ 069D 1C .BYTE 28 ; Width for commas (3 columns) +0477+ 069E 00 .BYTE 0 ; No nulls after input bytes +0478+ 069F 00 .BYTE 0 ; Output enabled (^O off) +0479+ 06A0 14 00 .WORD 20 ; Initial lines counter +0480+ 06A2 14 00 .WORD 20 ; Initial lines number +0481+ 06A4 00 00 .WORD 0 ; Array load/save check sum +0482+ 06A6 00 .BYTE 0 ; Break not by NMI +0483+ 06A7 00 .BYTE 0 ; Break flag +0484+ 06A8 C3 6E 09 JP TTYLIN ; Input reflection (set to TTY) +0485+ 06AB C3 00 00 JP $0000 ; POINT reflection unused +0486+ 06AE C3 00 00 JP $0000 ; SET reflection +0487+ 06B1 C3 00 00 JP $0000 ; RESET reflection +0488+ 06B4 0D 32 .WORD STLOOK ; Temp string space +0489+ 06B6 FE FF .WORD -2 ; Current line number (cold) +0490+ 06B8 AA 31 .WORD PROGST+1 ; Start of program text +0491+ 06BA INITBE: +0492+ 06BA +0493+ 06BA ; END OF INITIALISATION TABLE --------------------------------------------------- +0494+ 06BA +0495+ 06BA 20 45 72 72 ERRMSG: .BYTE " Error",0 +0495+ 06BE 6F 72 00 +0496+ 06C1 20 69 6E 20 INMSG: .BYTE " in ",0 +0496+ 06C5 00 +0497+ 06C6 ZERBYT .EQU $-1 ; A zero byte +0498+ 06C6 4F 6B 0D 0A OKMSG: .BYTE "Ok",CR,LF,0,0 +0498+ 06CA 00 00 +0499+ 06CC 42 72 65 61 BRKMSG: .BYTE "Break",0 +0499+ 06D0 6B 00 +0500+ 06D2 +0501+ 06D2 21 04 00 BAKSTK: LD HL,4 ; Look for "FOR" block with +0502+ 06D5 39 ADD HL,SP ; same index as specified +0503+ 06D6 7E LOKFOR: LD A,(HL) ; Get block ID +0504+ 06D7 23 INC HL ; Point to index address +0505+ 06D8 FE 81 CP ZFOR ; Is it a "FOR" token +0506+ 06DA C0 RET NZ ; No - exit +0507+ 06DB 4E LD C,(HL) ; BC = Address of "FOR" index +0508+ 06DC 23 INC HL +0509+ 06DD 46 LD B,(HL) +0510+ 06DE 23 INC HL ; Point to sign of STEP +0511+ 06DF E5 PUSH HL ; Save pointer to sign +0512+ 06E0 69 LD L,C ; HL = address of "FOR" index +0513+ 06E1 60 LD H,B +0514+ 06E2 7A LD A,D ; See if an index was specified +0515+ 06E3 B3 OR E ; DE = 0 if no index specified +0516+ 06E4 EB EX DE,HL ; Specified index into HL +0517+ 06E5 CA EC 06 JP Z,INDFND ; Skip if no index given +0518+ 06E8 EB EX DE,HL ; Index back into DE +0519+ 06E9 CD F1 09 CALL CPDEHL ; Compare index with one given +0520+ 06EC 01 0D 00 INDFND: LD BC,16-3 ; Offset to next block +0521+ 06EF E1 POP HL ; Restore pointer to sign +0522+ 06F0 C8 RET Z ; Return if block found +0523+ 06F1 09 ADD HL,BC ; Point to next block +0524+ 06F2 C3 D6 06 JP LOKFOR ; Keep on looking +0525+ 06F5 +0526+ 06F5 CD 0F 07 MOVUP: CALL ENFMEM ; See if enough memory +0527+ 06F8 C5 MOVSTR: PUSH BC ; Save end of source +0528+ 06F9 E3 EX (SP),HL ; Swap source and dest" end +0529+ 06FA C1 POP BC ; Get end of destination +0530+ 06FB CD F1 09 MOVLP: CALL CPDEHL ; See if list moved +0531+ 06FE 7E LD A,(HL) ; Get byte +0532+ 06FF 02 LD (BC),A ; Move it +0533+ 0700 C8 RET Z ; Exit if all done +0534+ 0701 0B DEC BC ; Next byte to move to +0535+ 0702 2B DEC HL ; Next byte to move +0536+ 0703 C3 FB 06 JP MOVLP ; Loop until all bytes moved +0537+ 0706 +0538+ 0706 E5 CHKSTK: PUSH HL ; Save code string address +0539+ 0707 2A 8A 31 LD HL,(ARREND) ; Lowest free memory +0540+ 070A 06 00 LD B,0 ; BC = Number of levels to test +0541+ 070C 09 ADD HL,BC ; 2 Bytes for each level +0542+ 070D 09 ADD HL,BC +0543+ 070E 3E .BYTE 3EH ; Skip "PUSH HL" +0544+ 070F E5 ENFMEM: PUSH HL ; Save code string address +0545+ 0710 3E D0 LD A,0D0H ;LOW -48 ; 48 Bytes minimum RAM +0546+ 0712 95 SUB L +0547+ 0713 6F LD L,A +0548+ 0714 3E FF LD A,0FFH; HIGH (-48) ; 48 Bytes minimum RAM +0549+ 0716 9C SBC A,H +0550+ 0717 DA 1E 07 JP C,OMERR ; Not enough - ?OM Error +0551+ 071A 67 LD H,A +0552+ 071B 39 ADD HL,SP ; Test if stack is overflowed +0553+ 071C E1 POP HL ; Restore code string address +0554+ 071D D8 RET C ; Return if enough mmory +0555+ 071E 1E 0C OMERR: LD E,OM ; ?OM Error +0556+ 0720 C3 3D 07 JP ERROR +0557+ 0723 +0558+ 0723 2A 79 31 DATSNR: LD HL,(DATLIN) ; Get line of current DATA item +0559+ 0726 22 0C 31 LD (LINEAT),HL ; Save as current line +0560+ 0729 1E 02 SNERR: LD E,SN ; ?SN Error +0561+ 072B 01 .BYTE 01H ; Skip "LD E,DZ" +0562+ 072C 1E 14 DZERR: LD E,DZ ; ?/0 Error +0563+ 072E 01 .BYTE 01H ; Skip "LD E,NF" +0564+ 072F 1E 00 NFERR: LD E,NF ; ?NF Error +0565+ 0731 01 .BYTE 01H ; Skip "LD E,DD" +0566+ 0732 1E 12 DDERR: LD E,DD ; ?DD Error +0567+ 0734 01 .BYTE 01H ; Skip "LD E,UF" +0568+ 0735 1E 22 UFERR: LD E,UF ; ?UF Error +0569+ 0737 01 .BYTE 01H ; Skip "LD E,OV +0570+ 0738 1E 0A OVERR: LD E,OV ; ?OV Error +0571+ 073A 01 .BYTE 01H ; Skip "LD E,TM" +0572+ 073B 1E 18 TMERR: LD E,TM ; ?TM Error +0573+ 073D +0574+ 073D CD 5B 08 ERROR: CALL CLREG ; Clear registers and stack +0575+ 0740 32 F5 30 LD (CTLOFG),A ; Enable output (A is 0) +0576+ 0743 CD 1C 0E CALL STTLIN ; Start new line +0577+ 0746 21 30 06 LD HL,ERRORS ; Point to error codes +0578+ 0749 57 LD D,A ; D = 0 (A is 0) +0579+ 074A 3E 3F LD A,'?' +0580+ 074C CD 02 0A CALL OUTC ; Output '?' +0581+ 074F 19 ADD HL,DE ; Offset to correct error code +0582+ 0750 7E LD A,(HL) ; First character +0583+ 0751 CD 02 0A CALL OUTC ; Output it +0584+ 0754 CD 81 0B CALL GETCHR ; Get next character +0585+ 0757 CD 02 0A CALL OUTC ; Output it +0586+ 075A 21 BA 06 LD HL,ERRMSG ; "Error" message +0587+ 075D CD C7 14 ERRIN: CALL PRS ; Output message +0588+ 0760 2A 0C 31 LD HL,(LINEAT) ; Get line of error +0589+ 0763 11 FE FF LD DE,-2 ; Cold start error if -2 +0590+ 0766 CD F1 09 CALL CPDEHL ; See if cold start error +0591+ 0769 CA 8D 03 JP Z,CSTART ; Cold start error - Restart +0592+ 076C 7C LD A,H ; Was it a direct error? +0593+ 076D A5 AND L ; Line = -1 if direct error +0594+ 076E 3C INC A +0595+ 076F C4 62 1B CALL NZ,LINEIN ; No - output line of error +0596+ 0772 3E .BYTE 3EH ; Skip "POP BC" +0597+ 0773 C1 POPNOK: POP BC ; Drop address in input buffer +0598+ 0774 +0599+ 0774 AF PRNTOK: XOR A ; Output "Ok" and get command +0600+ 0775 32 F5 30 LD (CTLOFG),A ; Enable output +0601+ 0778 CD 1C 0E CALL STTLIN ; Start new line +0602+ 077B 21 C6 06 LD HL,OKMSG ; "Ok" message +0603+ 077E CD C7 14 CALL PRS ; Output "Ok" +0604+ 0781 21 FF FF GETCMD: LD HL,-1 ; Flag direct mode +0605+ 0784 22 0C 31 LD (LINEAT),HL ; Save as current line +0606+ 0787 CD 6E 09 CALL GETLIN ; Get an input line +0607+ 078A DA 81 07 JP C,GETCMD ; Get line again if break +0608+ 078D CD 81 0B CALL GETCHR ; Get first character +0609+ 0790 3C INC A ; Test if end of line +0610+ 0791 3D DEC A ; Without affecting Carry +0611+ 0792 CA 81 07 JP Z,GETCMD ; Nothing entered - Get another +0612+ 0795 F5 PUSH AF ; Save Carry status +0613+ 0796 CD 4D 0C CALL ATOH ; Get line number into DE +0614+ 0799 D5 PUSH DE ; Save line number +0615+ 079A CD 85 08 CALL CRUNCH ; Tokenise rest of line +0616+ 079D 47 LD B,A ; Length of tokenised line +0617+ 079E D1 POP DE ; Restore line number +0618+ 079F F1 POP AF ; Restore Carry +0619+ 07A0 D2 61 0B JP NC,EXCUTE ; No line number - Direct mode +0620+ 07A3 D5 PUSH DE ; Save line number +0621+ 07A4 C5 PUSH BC ; Save length of tokenised line +0622+ 07A5 AF XOR A +0623+ 07A6 32 7C 31 LD (LSTBIN),A ; Clear last byte input +0624+ 07A9 CD 81 0B CALL GETCHR ; Get next character +0625+ 07AC B7 OR A ; Set flags +0626+ 07AD F5 PUSH AF ; And save them +0627+ 07AE CD 15 08 CALL SRCHLN ; Search for line number in DE +0628+ 07B1 DA BA 07 JP C,LINFND ; Jump if line found +0629+ 07B4 F1 POP AF ; Get status +0630+ 07B5 F5 PUSH AF ; And re-save +0631+ 07B6 CA EE 0C JP Z,ULERR ; Nothing after number - Error +0632+ 07B9 B7 OR A ; Clear Carry +0633+ 07BA C5 LINFND: PUSH BC ; Save address of line in prog +0634+ 07BB D2 D1 07 JP NC,INEWLN ; Line not found - Insert new +0635+ 07BE EB EX DE,HL ; Next line address in DE +0636+ 07BF 2A 86 31 LD HL,(PROGND) ; End of program +0637+ 07C2 1A SFTPRG: LD A,(DE) ; Shift rest of program down +0638+ 07C3 02 LD (BC),A +0639+ 07C4 03 INC BC ; Next destination +0640+ 07C5 13 INC DE ; Next source +0641+ 07C6 CD F1 09 CALL CPDEHL ; All done? +0642+ 07C9 C2 C2 07 JP NZ,SFTPRG ; More to do +0643+ 07CC 60 LD H,B ; HL - New end of program +0644+ 07CD 69 LD L,C +0645+ 07CE 22 86 31 LD (PROGND),HL ; Update end of program +0646+ 07D1 +0647+ 07D1 D1 INEWLN: POP DE ; Get address of line, +0648+ 07D2 F1 POP AF ; Get status +0649+ 07D3 CA F8 07 JP Z,SETPTR ; No text - Set up pointers +0650+ 07D6 2A 86 31 LD HL,(PROGND) ; Get end of program +0651+ 07D9 E3 EX (SP),HL ; Get length of input line +0652+ 07DA C1 POP BC ; End of program to BC +0653+ 07DB 09 ADD HL,BC ; Find new end +0654+ 07DC E5 PUSH HL ; Save new end +0655+ 07DD CD F5 06 CALL MOVUP ; Make space for line +0656+ 07E0 E1 POP HL ; Restore new end +0657+ 07E1 22 86 31 LD (PROGND),HL ; Update end of program pointer +0658+ 07E4 EB EX DE,HL ; Get line to move up in HL +0659+ 07E5 74 LD (HL),H ; Save MSB +0660+ 07E6 D1 POP DE ; Get new line number +0661+ 07E7 23 INC HL ; Skip pointer +0662+ 07E8 23 INC HL +0663+ 07E9 73 LD (HL),E ; Save LSB of line number +0664+ 07EA 23 INC HL +0665+ 07EB 72 LD (HL),D ; Save MSB of line number +0666+ 07EC 23 INC HL ; To first byte in line +0667+ 07ED 11 11 31 LD DE,BUFFER ; Copy buffer to program +0668+ 07F0 1A MOVBUF: LD A,(DE) ; Get source +0669+ 07F1 77 LD (HL),A ; Save destinations +0670+ 07F2 23 INC HL ; Next source +0671+ 07F3 13 INC DE ; Next destination +0672+ 07F4 B7 OR A ; Done? +0673+ 07F5 C2 F0 07 JP NZ,MOVBUF ; No - Repeat +0674+ 07F8 CD 41 08 SETPTR: CALL RUNFST ; Set line pointers +0675+ 07FB 23 INC HL ; To LSB of pointer +0676+ 07FC EB EX DE,HL ; Address to DE +0677+ 07FD 62 PTRLP: LD H,D ; Address to HL +0678+ 07FE 6B LD L,E +0679+ 07FF 7E LD A,(HL) ; Get LSB of pointer +0680+ 0800 23 INC HL ; To MSB of pointer +0681+ 0801 B6 OR (HL) ; Compare with MSB pointer +0682+ 0802 CA 81 07 JP Z,GETCMD ; Get command line if end +0683+ 0805 23 INC HL ; To LSB of line number +0684+ 0806 23 INC HL ; Skip line number +0685+ 0807 23 INC HL ; Point to first byte in line +0686+ 0808 AF XOR A ; Looking for 00 byte +0687+ 0809 BE FNDEND: CP (HL) ; Found end of line? +0688+ 080A 23 INC HL ; Move to next byte +0689+ 080B C2 09 08 JP NZ,FNDEND ; No - Keep looking +0690+ 080E EB EX DE,HL ; Next line address to HL +0691+ 080F 73 LD (HL),E ; Save LSB of pointer +0692+ 0810 23 INC HL +0693+ 0811 72 LD (HL),D ; Save MSB of pointer +0694+ 0812 C3 FD 07 JP PTRLP ; Do next line +0695+ 0815 +0696+ 0815 2A 0E 31 SRCHLN: LD HL,(BASTXT) ; Start of program text +0697+ 0818 44 SRCHLP: LD B,H ; BC = Address to look at +0698+ 0819 4D LD C,L +0699+ 081A 7E LD A,(HL) ; Get address of next line +0700+ 081B 23 INC HL +0701+ 081C B6 OR (HL) ; End of program found? +0702+ 081D 2B DEC HL +0703+ 081E C8 RET Z ; Yes - Line not found +0704+ 081F 23 INC HL +0705+ 0820 23 INC HL +0706+ 0821 7E LD A,(HL) ; Get LSB of line number +0707+ 0822 23 INC HL +0708+ 0823 66 LD H,(HL) ; Get MSB of line number +0709+ 0824 6F LD L,A +0710+ 0825 CD F1 09 CALL CPDEHL ; Compare with line in DE +0711+ 0828 60 LD H,B ; HL = Start of this line +0712+ 0829 69 LD L,C +0713+ 082A 7E LD A,(HL) ; Get LSB of next line address +0714+ 082B 23 INC HL +0715+ 082C 66 LD H,(HL) ; Get MSB of next line address +0716+ 082D 6F LD L,A ; Next line to HL +0717+ 082E 3F CCF +0718+ 082F C8 RET Z ; Lines found - Exit +0719+ 0830 3F CCF +0720+ 0831 D0 RET NC ; Line not found,at line after +0721+ 0832 C3 18 08 JP SRCHLP ; Keep looking +0722+ 0835 +0723+ 0835 C0 NEW: RET NZ ; Return if any more on line +0724+ 0836 2A 0E 31 CLRPTR: LD HL,(BASTXT) ; Point to start of program +0725+ 0839 AF XOR A ; Set program area to empty +0726+ 083A 77 LD (HL),A ; Save LSB = 00 +0727+ 083B 23 INC HL +0728+ 083C 77 LD (HL),A ; Save MSB = 00 +0729+ 083D 23 INC HL +0730+ 083E 22 86 31 LD (PROGND),HL ; Set program end +0731+ 0841 +0732+ 0841 2A 0E 31 RUNFST: LD HL,(BASTXT) ; Clear all variables +0733+ 0844 2B DEC HL +0734+ 0845 +0735+ 0845 22 7E 31 INTVAR: LD (BRKLIN),HL ; Initialise RUN variables +0736+ 0848 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +0737+ 084B 22 73 31 LD (STRBOT),HL ; Clear string space +0738+ 084E AF XOR A +0739+ 084F CD 91 0B CALL RESTOR ; Reset DATA pointers +0740+ 0852 2A 86 31 LD HL,(PROGND) ; Get end of program +0741+ 0855 22 88 31 LD (VAREND),HL ; Clear variables +0742+ 0858 22 8A 31 LD (ARREND),HL ; Clear arrays +0743+ 085B +0744+ 085B C1 CLREG: POP BC ; Save return address +0745+ 085C 2A 0A 31 LD HL,(STRSPC) ; Get end of working RAN +0746+ 085F F9 LD SP,HL ; Set stack +0747+ 0860 21 63 31 LD HL,TMSTPL ; Temporary string pool +0748+ 0863 22 61 31 LD (TMSTPT),HL ; Reset temporary string ptr +0749+ 0866 AF XOR A ; A = 00 +0750+ 0867 6F LD L,A ; HL = 0000 +0751+ 0868 67 LD H,A +0752+ 0869 22 84 31 LD (CONTAD),HL ; No CONTinue +0753+ 086C 32 7B 31 LD (FORFLG),A ; Clear FOR flag +0754+ 086F 22 8E 31 LD (FNRGNM),HL ; Clear FN argument +0755+ 0872 E5 PUSH HL ; HL = 0000 +0756+ 0873 C5 PUSH BC ; Put back return +0757+ 0874 2A 7E 31 DOAGN: LD HL,(BRKLIN) ; Get address of code to RUN +0758+ 0877 C9 RET ; Return to execution driver +0759+ 0878 +0760+ 0878 3E 3F PROMPT: LD A,'?' ; '?' +0761+ 087A CD 02 0A CALL OUTC ; Output character +0762+ 087D 3E 20 LD A,' ' ; Space +0763+ 087F CD 02 0A CALL OUTC ; Output character +0764+ 0882 C3 FE 30 JP RINPUT ; Get input line +0765+ 0885 +0766+ 0885 AF CRUNCH: XOR A ; Tokenise line @ HL to BUFFER +0767+ 0886 32 5E 31 LD (DATFLG),A ; Reset literal flag +0768+ 0889 0E 05 LD C,2+3 ; 2 byte number and 3 nulls +0769+ 088B 11 11 31 LD DE,BUFFER ; Start of input buffer +0770+ 088E 7E CRNCLP: LD A,(HL) ; Get byte +0771+ 088F FE 20 CP ' ' ; Is it a space? +0772+ 0891 CA 0D 09 JP Z,MOVDIR ; Yes - Copy direct +0773+ 0894 47 LD B,A ; Save character +0774+ 0895 FE 22 CP '"' ; Is it a quote? +0775+ 0897 CA 2D 09 JP Z,CPYLIT ; Yes - Copy literal string +0776+ 089A B7 OR A ; Is it end of buffer? +0777+ 089B CA 34 09 JP Z,ENDBUF ; Yes - End buffer +0778+ 089E 3A 5E 31 LD A,(DATFLG) ; Get data type +0779+ 08A1 B7 OR A ; Literal? +0780+ 08A2 7E LD A,(HL) ; Get byte to copy +0781+ 08A3 C2 0D 09 JP NZ,MOVDIR ; Literal - Copy direct +0782+ 08A6 FE 3F CP '?' ; Is it '?' short for PRINT +0783+ 08A8 3E 9E LD A,ZPRINT ; "PRINT" token +0784+ 08AA CA 0D 09 JP Z,MOVDIR ; Yes - replace it +0785+ 08AD 7E LD A,(HL) ; Get byte again +0786+ 08AE FE 30 CP '0' ; Is it less than '0' +0787+ 08B0 DA B8 08 JP C,FNDWRD ; Yes - Look for reserved words +0788+ 08B3 FE 3C CP 60; ";"+1 ; Is it "0123456789:;" ? +0789+ 08B5 DA 0D 09 JP C,MOVDIR ; Yes - copy it direct +0790+ 08B8 D5 FNDWRD: PUSH DE ; Look for reserved words +0791+ 08B9 11 B1 04 LD DE,WORDS-1 ; Point to table +0792+ 08BC C5 PUSH BC ; Save count +0793+ 08BD 01 09 09 LD BC,RETNAD ; Where to return to +0794+ 08C0 C5 PUSH BC ; Save return address +0795+ 08C1 06 7F LD B,ZEND-1 ; First token value -1 +0796+ 08C3 7E LD A,(HL) ; Get byte +0797+ 08C4 FE 61 CP 'a' ; Less than 'a' ? +0798+ 08C6 DA D1 08 JP C,SEARCH ; Yes - search for words +0799+ 08C9 FE 7B CP 'z'+1 ; Greater than 'z' ? +0800+ 08CB D2 D1 08 JP NC,SEARCH ; Yes - search for words +0801+ 08CE E6 5F AND 01011111B ; Force upper case +0802+ 08D0 77 LD (HL),A ; Replace byte +0803+ 08D1 4E SEARCH: LD C,(HL) ; Search for a word +0804+ 08D2 EB EX DE,HL +0805+ 08D3 23 GETNXT: INC HL ; Get next reserved word +0806+ 08D4 B6 OR (HL) ; Start of word? +0807+ 08D5 F2 D3 08 JP P,GETNXT ; No - move on +0808+ 08D8 04 INC B ; Increment token value +0809+ 08D9 7E LD A, (HL) ; Get byte from table +0810+ 08DA E6 7F AND 01111111B ; Strip bit 7 +0811+ 08DC C8 RET Z ; Return if end of list +0812+ 08DD B9 CP C ; Same character as in buffer? +0813+ 08DE C2 D3 08 JP NZ,GETNXT ; No - get next word +0814+ 08E1 EB EX DE,HL +0815+ 08E2 E5 PUSH HL ; Save start of word +0816+ 08E3 +0817+ 08E3 13 NXTBYT: INC DE ; Look through rest of word +0818+ 08E4 1A LD A,(DE) ; Get byte from table +0819+ 08E5 B7 OR A ; End of word ? +0820+ 08E6 FA 05 09 JP M,MATCH ; Yes - Match found +0821+ 08E9 4F LD C,A ; Save it +0822+ 08EA 78 LD A,B ; Get token value +0823+ 08EB FE 88 CP ZGOTO ; Is it "GOTO" token ? +0824+ 08ED C2 F4 08 JP NZ,NOSPC ; No - Don't allow spaces +0825+ 08F0 CD 81 0B CALL GETCHR ; Get next character +0826+ 08F3 2B DEC HL ; Cancel increment from GETCHR +0827+ 08F4 23 NOSPC: INC HL ; Next byte +0828+ 08F5 7E LD A,(HL) ; Get byte +0829+ 08F6 FE 61 CP 'a' ; Less than 'a' ? +0830+ 08F8 DA FD 08 JP C,NOCHNG ; Yes - don't change +0831+ 08FB E6 5F AND 01011111B ; Make upper case +0832+ 08FD B9 NOCHNG: CP C ; Same as in buffer ? +0833+ 08FE CA E3 08 JP Z,NXTBYT ; Yes - keep testing +0834+ 0901 E1 POP HL ; Get back start of word +0835+ 0902 C3 D1 08 JP SEARCH ; Look at next word +0836+ 0905 +0837+ 0905 48 MATCH: LD C,B ; Word found - Save token value +0838+ 0906 F1 POP AF ; Throw away return +0839+ 0907 EB EX DE,HL +0840+ 0908 C9 RET ; Return to "RETNAD" +0841+ 0909 EB RETNAD: EX DE,HL ; Get address in string +0842+ 090A 79 LD A,C ; Get token value +0843+ 090B C1 POP BC ; Restore buffer length +0844+ 090C D1 POP DE ; Get destination address +0845+ 090D 23 MOVDIR: INC HL ; Next source in buffer +0846+ 090E 12 LD (DE),A ; Put byte in buffer +0847+ 090F 13 INC DE ; Move up buffer +0848+ 0910 0C INC C ; Increment length of buffer +0849+ 0911 D6 3A SUB ':' ; End of statement? +0850+ 0913 CA 1B 09 JP Z,SETLIT ; Jump if multi-statement line +0851+ 0916 FE 49 CP ZDATA-3AH ; Is it DATA statement ? +0852+ 0918 C2 1E 09 JP NZ,TSTREM ; No - see if REM +0853+ 091B 32 5E 31 SETLIT: LD (DATFLG),A ; Set literal flag +0854+ 091E D6 54 TSTREM: SUB ZREM-3AH ; Is it REM? +0855+ 0920 C2 8E 08 JP NZ,CRNCLP ; No - Leave flag +0856+ 0923 47 LD B,A ; Copy rest of buffer +0857+ 0924 7E NXTCHR: LD A,(HL) ; Get byte +0858+ 0925 B7 OR A ; End of line ? +0859+ 0926 CA 34 09 JP Z,ENDBUF ; Yes - Terminate buffer +0860+ 0929 B8 CP B ; End of statement ? +0861+ 092A CA 0D 09 JP Z,MOVDIR ; Yes - Get next one +0862+ 092D 23 CPYLIT: INC HL ; Move up source string +0863+ 092E 12 LD (DE),A ; Save in destination +0864+ 092F 0C INC C ; Increment length +0865+ 0930 13 INC DE ; Move up destination +0866+ 0931 C3 24 09 JP NXTCHR ; Repeat +0867+ 0934 +0868+ 0934 21 10 31 ENDBUF: LD HL,BUFFER-1 ; Point to start of buffer +0869+ 0937 12 LD (DE),A ; Mark end of buffer (A = 00) +0870+ 0938 13 INC DE +0871+ 0939 12 LD (DE),A ; A = 00 +0872+ 093A 13 INC DE +0873+ 093B 12 LD (DE),A ; A = 00 +0874+ 093C C9 RET +0875+ 093D +0876+ 093D 3A F4 30 DODEL: LD A,(NULFLG) ; Get null flag status +0877+ 0940 B7 OR A ; Is it zero? +0878+ 0941 3E 00 LD A,0 ; Zero A - Leave flags +0879+ 0943 32 F4 30 LD (NULFLG),A ; Zero null flag +0880+ 0946 C2 51 09 JP NZ,ECHDEL ; Set - Echo it +0881+ 0949 05 DEC B ; Decrement length +0882+ 094A CA 6E 09 JP Z,GETLIN ; Get line again if empty +0883+ 094D CD 02 0A CALL OUTC ; Output null character +0884+ 0950 3E .BYTE 3EH ; Skip "DEC B" +0885+ 0951 05 ECHDEL: DEC B ; Count bytes in buffer +0886+ 0952 2B DEC HL ; Back space buffer +0887+ 0953 CA 65 09 JP Z,OTKLN ; No buffer - Try again +0888+ 0956 7E LD A,(HL) ; Get deleted byte +0889+ 0957 CD 02 0A CALL OUTC ; Echo it +0890+ 095A C3 77 09 JP MORINP ; Get more input +0891+ 095D +0892+ 095D 05 DELCHR: DEC B ; Count bytes in buffer +0893+ 095E 2B DEC HL ; Back space buffer +0894+ 095F CD 02 0A CALL OUTC ; Output character in A +0895+ 0962 C2 77 09 JP NZ,MORINP ; Not end - Get more +0896+ 0965 CD 02 0A OTKLN: CALL OUTC ; Output character in A +0897+ 0968 CD 29 0E KILIN: CALL PRNTCRLF ; Output CRLF +0898+ 096B C3 6E 09 JP TTYLIN ; Get line again +0899+ 096E +0900+ 096E GETLIN: +0901+ 096E 21 11 31 TTYLIN: LD HL,BUFFER ; Get a line by character +0902+ 0971 06 01 LD B,1 ; Set buffer as empty +0903+ 0973 AF XOR A +0904+ 0974 32 F4 30 LD (NULFLG),A ; Clear null flag +0905+ 0977 CD 2C 0A MORINP: CALL CLOTST ; Get character and test ^O +0906+ 097A 4F LD C,A ; Save character in C +0907+ 097B FE 7F CP DEL ; Delete character? +0908+ 097D CA 3D 09 JP Z,DODEL ; Yes - Process it +0909+ 0980 3A F4 30 LD A,(NULFLG) ; Get null flag +0910+ 0983 B7 OR A ; Test null flag status +0911+ 0984 CA 90 09 JP Z,PROCES ; Reset - Process character +0912+ 0987 3E 00 LD A,0 ; Set a null +0913+ 0989 CD 02 0A CALL OUTC ; Output null +0914+ 098C AF XOR A ; Clear A +0915+ 098D 32 F4 30 LD (NULFLG),A ; Reset null flag +0916+ 0990 79 PROCES: LD A,C ; Get character +0917+ 0991 FE 07 CP CTRLG ; Bell? +0918+ 0993 CA D4 09 JP Z,PUTCTL ; Yes - Save it +0919+ 0996 FE 03 CP CTRLC ; Is it control "C"? +0920+ 0998 CC 29 0E CALL Z,PRNTCRLF ; Yes - Output CRLF +0921+ 099B 37 SCF ; Flag break +0922+ 099C C8 RET Z ; Return if control "C" +0923+ 099D FE 0D CP CR ; Is it enter? +0924+ 099F CA 24 0E JP Z,ENDINP ; Yes - Terminate input +0925+ 09A2 FE 15 CP CTRLU ; Is it control "U"? +0926+ 09A4 CA 68 09 JP Z,KILIN ; Yes - Get another line +0927+ 09A7 FE 40 CP '@' ; Is it "kill line"? +0928+ 09A9 CA 65 09 JP Z,OTKLN ; Yes - Kill line +0929+ 09AC FE 5F CP '_' ; Is it delete? +0930+ 09AE CA 5D 09 JP Z,DELCHR ; Yes - Delete character +0931+ 09B1 FE 08 CP BKSP ; Is it backspace? +0932+ 09B3 CA 5D 09 JP Z,DELCHR ; Yes - Delete character +0933+ 09B6 FE 12 CP CTRLR ; Is it control "R"? +0934+ 09B8 C2 CF 09 JP NZ,PUTBUF ; No - Put in buffer +0935+ 09BB C5 PUSH BC ; Save buffer length +0936+ 09BC D5 PUSH DE ; Save DE +0937+ 09BD E5 PUSH HL ; Save buffer address +0938+ 09BE 36 00 LD (HL),0 ; Mark end of buffer +0939+ 09C0 CD D9 1F CALL OUTNCR ; Output and do CRLF +0940+ 09C3 21 11 31 LD HL,BUFFER ; Point to buffer start +0941+ 09C6 CD C7 14 CALL PRS ; Output buffer +0942+ 09C9 E1 POP HL ; Restore buffer address +0943+ 09CA D1 POP DE ; Restore DE +0944+ 09CB C1 POP BC ; Restore buffer length +0945+ 09CC C3 77 09 JP MORINP ; Get another character +0946+ 09CF +0947+ 09CF FE 20 PUTBUF: CP ' ' ; Is it a control code? +0948+ 09D1 DA 77 09 JP C,MORINP ; Yes - Ignore +0949+ 09D4 78 PUTCTL: LD A,B ; Get number of bytes in buffer +0950+ 09D5 FE 49 CP 72+1 ; Test for line overflow +0951+ 09D7 3E 07 LD A,CTRLG ; Set a bell +0952+ 09D9 D2 E9 09 JP NC,OUTNBS ; Ring bell if buffer full +0953+ 09DC 79 LD A,C ; Get character +0954+ 09DD 71 LD (HL),C ; Save in buffer +0955+ 09DE 32 7C 31 LD (LSTBIN),A ; Save last input byte +0956+ 09E1 23 INC HL ; Move up buffer +0957+ 09E2 04 INC B ; Increment length +0958+ 09E3 CD 02 0A OUTIT: CALL OUTC ; Output the character entered +0959+ 09E6 C3 77 09 JP MORINP ; Get another character +0960+ 09E9 +0961+ 09E9 CD 02 0A OUTNBS: CALL OUTC ; Output bell and back over it +0962+ 09EC 3E 08 LD A,BKSP ; Set back space +0963+ 09EE C3 E3 09 JP OUTIT ; Output it and get more +0964+ 09F1 +0965+ 09F1 7C CPDEHL: LD A,H ; Get H +0966+ 09F2 92 SUB D ; Compare with D +0967+ 09F3 C0 RET NZ ; Different - Exit +0968+ 09F4 7D LD A,L ; Get L +0969+ 09F5 93 SUB E ; Compare with E +0970+ 09F6 C9 RET ; Return status +0971+ 09F7 +0972+ 09F7 7E CHKSYN: LD A,(HL) ; Check syntax of character +0973+ 09F8 E3 EX (SP),HL ; Address of test byte +0974+ 09F9 BE CP (HL) ; Same as in code string? +0975+ 09FA 23 INC HL ; Return address +0976+ 09FB E3 EX (SP),HL ; Put it back +0977+ 09FC CA 81 0B JP Z,GETCHR ; Yes - Get next character +0978+ 09FF C3 29 07 JP SNERR ; Different - ?SN Error +0979+ 0A02 +0980+ 0A02 F5 OUTC: PUSH AF ; Save character +0981+ 0A03 3A F5 30 LD A,(CTLOFG) ; Get control "O" flag +0982+ 0A06 B7 OR A ; Is it set? +0983+ 0A07 C2 FC 14 JP NZ,POPAF ; Yes - don't output +0984+ 0A0A F1 POP AF ; Restore character +0985+ 0A0B C5 PUSH BC ; Save buffer length +0986+ 0A0C F5 PUSH AF ; Save character +0987+ 0A0D FE 20 CP ' ' ; Is it a control code? +0988+ 0A0F DA 26 0A JP C,DINPOS ; Yes - Don't INC POS(X) +0989+ 0A12 3A F2 30 LD A,(LWIDTH) ; Get line width +0990+ 0A15 47 LD B,A ; To B +0991+ 0A16 3A 5B 31 LD A,(CURPOS) ; Get cursor position +0992+ 0A19 04 INC B ; Width 255? +0993+ 0A1A CA 22 0A JP Z,INCLEN ; Yes - No width limit +0994+ 0A1D 05 DEC B ; Restore width +0995+ 0A1E B8 CP B ; At end of line? +0996+ 0A1F CC 29 0E CALL Z,PRNTCRLF ; Yes - output CRLF +0997+ 0A22 3C INCLEN: INC A ; Move on one character +0998+ 0A23 32 5B 31 LD (CURPOS),A ; Save new position +0999+ 0A26 F1 DINPOS: POP AF ; Restore character +1000+ 0A27 C1 POP BC ; Restore buffer length +1001+ 0A28 CD C2 1F CALL MONOUT ; Send it +1002+ 0A2B C9 RET +1003+ 0A2C +1004+ 0A2C CD 86 1E CLOTST: CALL GETINP ; Get input character +1005+ 0A2F E6 7F AND 01111111B ; Strip bit 7 +1006+ 0A31 FE 0F CP CTRLO ; Is it control "O"? +1007+ 0A33 C0 RET NZ ; No don't flip flag +1008+ 0A34 3A F5 30 LD A,(CTLOFG) ; Get flag +1009+ 0A37 2F CPL ; Flip it +1010+ 0A38 32 F5 30 LD (CTLOFG),A ; Put it back +1011+ 0A3B AF XOR A ; Null character +1012+ 0A3C C9 RET +1013+ 0A3D +1014+ 0A3D CD 4D 0C LIST: CALL ATOH ; ASCII number to DE +1015+ 0A40 C0 RET NZ ; Return if anything extra +1016+ 0A41 C1 POP BC ; Rubbish - Not needed +1017+ 0A42 CD 15 08 CALL SRCHLN ; Search for line number in DE +1018+ 0A45 C5 PUSH BC ; Save address of line +1019+ 0A46 CD 93 0A CALL SETLIN ; Set up lines counter +1020+ 0A49 E1 LISTLP: POP HL ; Restore address of line +1021+ 0A4A 4E LD C,(HL) ; Get LSB of next line +1022+ 0A4B 23 INC HL +1023+ 0A4C 46 LD B,(HL) ; Get MSB of next line +1024+ 0A4D 23 INC HL +1025+ 0A4E 78 LD A,B ; BC = 0 (End of program)? +1026+ 0A4F B1 OR C +1027+ 0A50 CA 74 07 JP Z,PRNTOK ; Yes - Go to command mode +1028+ 0A53 CD 9C 0A CALL COUNT ; Count lines +1029+ 0A56 CD AC 0B CALL TSTBRK ; Test for break key +1030+ 0A59 C5 PUSH BC ; Save address of next line +1031+ 0A5A CD 29 0E CALL PRNTCRLF ; Output CRLF +1032+ 0A5D 5E LD E,(HL) ; Get LSB of line number +1033+ 0A5E 23 INC HL +1034+ 0A5F 56 LD D,(HL) ; Get MSB of line number +1035+ 0A60 23 INC HL +1036+ 0A61 E5 PUSH HL ; Save address of line start +1037+ 0A62 EB EX DE,HL ; Line number to HL +1038+ 0A63 CD 6A 1B CALL PRNTHL ; Output line number in decimal +1039+ 0A66 3E 20 LD A,' ' ; Space after line number +1040+ 0A68 E1 POP HL ; Restore start of line address +1041+ 0A69 CD 02 0A LSTLP2: CALL OUTC ; Output character in A +1042+ 0A6C 7E LSTLP3: LD A,(HL) ; Get next byte in line +1043+ 0A6D B7 OR A ; End of line? +1044+ 0A6E 23 INC HL ; To next byte in line +1045+ 0A6F CA 49 0A JP Z,LISTLP ; Yes - get next line +1046+ 0A72 F2 69 0A JP P,LSTLP2 ; No token - output it +1047+ 0A75 D6 7F SUB ZEND-1 ; Find and output word +1048+ 0A77 4F LD C,A ; Token offset+1 to C +1049+ 0A78 11 B2 04 LD DE,WORDS ; Reserved word list +1050+ 0A7B 1A FNDTOK: LD A,(DE) ; Get character in list +1051+ 0A7C 13 INC DE ; Move on to next +1052+ 0A7D B7 OR A ; Is it start of word? +1053+ 0A7E F2 7B 0A JP P,FNDTOK ; No - Keep looking for word +1054+ 0A81 0D DEC C ; Count words +1055+ 0A82 C2 7B 0A JP NZ,FNDTOK ; Not there - keep looking +1056+ 0A85 E6 7F OUTWRD: AND 01111111B ; Strip bit 7 +1057+ 0A87 CD 02 0A CALL OUTC ; Output first character +1058+ 0A8A 1A LD A,(DE) ; Get next character +1059+ 0A8B 13 INC DE ; Move on to next +1060+ 0A8C B7 OR A ; Is it end of word? +1061+ 0A8D F2 85 0A JP P,OUTWRD ; No - output the rest +1062+ 0A90 C3 6C 0A JP LSTLP3 ; Next byte in line +1063+ 0A93 +1064+ 0A93 E5 SETLIN: PUSH HL ; Set up LINES counter +1065+ 0A94 2A F8 30 LD HL,(LINESN) ; Get LINES number +1066+ 0A97 22 F6 30 LD (LINESC),HL ; Save in LINES counter +1067+ 0A9A E1 POP HL +1068+ 0A9B C9 RET +1069+ 0A9C +1070+ 0A9C E5 COUNT: PUSH HL ; Save code string address +1071+ 0A9D D5 PUSH DE +1072+ 0A9E 2A F6 30 LD HL,(LINESC) ; Get LINES counter +1073+ 0AA1 11 FF FF LD DE,-1 +1074+ 0AA4 ED 5A ADC HL,DE ; Decrement +1075+ 0AA6 22 F6 30 LD (LINESC),HL ; Put it back +1076+ 0AA9 D1 POP DE +1077+ 0AAA E1 POP HL ; Restore code string address +1078+ 0AAB F0 RET P ; Return if more lines to go +1079+ 0AAC E5 PUSH HL ; Save code string address +1080+ 0AAD 2A F8 30 LD HL,(LINESN) ; Get LINES number +1081+ 0AB0 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1082+ 0AB3 CD 86 1E CALL GETINP ; Get input character +1083+ 0AB6 FE 03 CP CTRLC ; Is it control "C"? +1084+ 0AB8 CA BF 0A JP Z,RSLNBK ; Yes - Reset LINES and break +1085+ 0ABB E1 POP HL ; Restore code string address +1086+ 0ABC C3 9C 0A JP COUNT ; Keep on counting +1087+ 0ABF +1088+ 0ABF 2A F8 30 RSLNBK: LD HL,(LINESN) ; Get LINES number +1089+ 0AC2 22 F6 30 LD (LINESC),HL ; Reset LINES counter +1090+ 0AC5 C3 23 04 JP BRKRET ; Go and output "Break" +1091+ 0AC8 +1092+ 0AC8 3E 64 FOR: LD A,64H ; Flag "FOR" assignment +1093+ 0ACA 32 7B 31 LD (FORFLG),A ; Save "FOR" flag +1094+ 0ACD CD 2F 0D CALL LET ; Set up initial index +1095+ 0AD0 C1 POP BC ; Drop RETurn address +1096+ 0AD1 E5 PUSH HL ; Save code string address +1097+ 0AD2 CD 18 0D CALL DATA ; Get next statement address +1098+ 0AD5 22 77 31 LD (LOOPST),HL ; Save it for start of loop +1099+ 0AD8 21 02 00 LD HL,2 ; Offset for "FOR" block +1100+ 0ADB 39 ADD HL,SP ; Point to it +1101+ 0ADC CD D6 06 FORSLP: CALL LOKFOR ; Look for existing "FOR" block +1102+ 0ADF D1 POP DE ; Get code string address +1103+ 0AE0 C2 F8 0A JP NZ,FORFND ; No nesting found +1104+ 0AE3 09 ADD HL,BC ; Move into "FOR" block +1105+ 0AE4 D5 PUSH DE ; Save code string address +1106+ 0AE5 2B DEC HL +1107+ 0AE6 56 LD D,(HL) ; Get MSB of loop statement +1108+ 0AE7 2B DEC HL +1109+ 0AE8 5E LD E,(HL) ; Get LSB of loop statement +1110+ 0AE9 23 INC HL +1111+ 0AEA 23 INC HL +1112+ 0AEB E5 PUSH HL ; Save block address +1113+ 0AEC 2A 77 31 LD HL,(LOOPST) ; Get address of loop statement +1114+ 0AEF CD F1 09 CALL CPDEHL ; Compare the FOR loops +1115+ 0AF2 E1 POP HL ; Restore block address +1116+ 0AF3 C2 DC 0A JP NZ,FORSLP ; Different FORs - Find another +1117+ 0AF6 D1 POP DE ; Restore code string address +1118+ 0AF7 F9 LD SP,HL ; Remove all nested loops +1119+ 0AF8 +1120+ 0AF8 EB FORFND: EX DE,HL ; Code string address to HL +1121+ 0AF9 0E 08 LD C,8 +1122+ 0AFB CD 06 07 CALL CHKSTK ; Check for 8 levels of stack +1123+ 0AFE E5 PUSH HL ; Save code string address +1124+ 0AFF 2A 77 31 LD HL,(LOOPST) ; Get first statement of loop +1125+ 0B02 E3 EX (SP),HL ; Save and restore code string +1126+ 0B03 E5 PUSH HL ; Re-save code string address +1127+ 0B04 2A 0C 31 LD HL,(LINEAT) ; Get current line number +1128+ 0B07 E3 EX (SP),HL ; Save and restore code string +1129+ 0B08 CD F1 0F CALL TSTNUM ; Make sure it's a number +1130+ 0B0B CD F7 09 CALL CHKSYN ; Make sure "TO" is next +1131+ 0B0E A6 .BYTE ZTO ; "TO" token +1132+ 0B0F CD EE 0F CALL GETNUM ; Get "TO" expression value +1133+ 0B12 E5 PUSH HL ; Save code string address +1134+ 0B13 CD 1C 1A CALL BCDEFP ; Move "TO" value to BCDE +1135+ 0B16 E1 POP HL ; Restore code string address +1136+ 0B17 C5 PUSH BC ; Save "TO" value in block +1137+ 0B18 D5 PUSH DE +1138+ 0B19 01 00 81 LD BC,8100H ; BCDE - 1 (default STEP) +1139+ 0B1C 51 LD D,C ; C=0 +1140+ 0B1D 5A LD E,D ; D=0 +1141+ 0B1E 7E LD A,(HL) ; Get next byte in code string +1142+ 0B1F FE AB CP ZSTEP ; See if "STEP" is stated +1143+ 0B21 3E 01 LD A,1 ; Sign of step = 1 +1144+ 0B23 C2 34 0B JP NZ,SAVSTP ; No STEP given - Default to 1 +1145+ 0B26 CD 81 0B CALL GETCHR ; Jump over "STEP" token +1146+ 0B29 CD EE 0F CALL GETNUM ; Get step value +1147+ 0B2C E5 PUSH HL ; Save code string address +1148+ 0B2D CD 1C 1A CALL BCDEFP ; Move STEP to BCDE +1149+ 0B30 CD D0 19 CALL TSTSGN ; Test sign of FPREG +1150+ 0B33 E1 POP HL ; Restore code string address +1151+ 0B34 C5 SAVSTP: PUSH BC ; Save the STEP value in block +1152+ 0B35 D5 PUSH DE +1153+ 0B36 F5 PUSH AF ; Save sign of STEP +1154+ 0B37 33 INC SP ; Don't save flags +1155+ 0B38 E5 PUSH HL ; Save code string address +1156+ 0B39 2A 7E 31 LD HL,(BRKLIN) ; Get address of index variable +1157+ 0B3C E3 EX (SP),HL ; Save and restore code string +1158+ 0B3D 06 81 PUTFID: LD B,ZFOR ; "FOR" block marker +1159+ 0B3F C5 PUSH BC ; Save it +1160+ 0B40 33 INC SP ; Don't save C +1161+ 0B41 +1162+ 0B41 CD AC 0B RUNCNT: CALL TSTBRK ; Execution driver - Test break +1163+ 0B44 22 7E 31 LD (BRKLIN),HL ; Save code address for break +1164+ 0B47 7E LD A,(HL) ; Get next byte in code string +1165+ 0B48 FE 3A CP ':' ; Multi statement line? +1166+ 0B4A CA 61 0B JP Z,EXCUTE ; Yes - Execute it +1167+ 0B4D B7 OR A ; End of line? +1168+ 0B4E C2 29 07 JP NZ,SNERR ; No - Syntax error +1169+ 0B51 23 INC HL ; Point to address of next line +1170+ 0B52 7E LD A,(HL) ; Get LSB of line pointer +1171+ 0B53 23 INC HL +1172+ 0B54 B6 OR (HL) ; Is it zero (End of prog)? +1173+ 0B55 CA D3 0B JP Z,ENDPRG ; Yes - Terminate execution +1174+ 0B58 23 INC HL ; Point to line number +1175+ 0B59 5E LD E,(HL) ; Get LSB of line number +1176+ 0B5A 23 INC HL +1177+ 0B5B 56 LD D,(HL) ; Get MSB of line number +1178+ 0B5C EB EX DE,HL ; Line number to HL +1179+ 0B5D 22 0C 31 LD (LINEAT),HL ; Save as current line number +1180+ 0B60 EB EX DE,HL ; Line number back to DE +1181+ 0B61 CD 81 0B EXCUTE: CALL GETCHR ; Get key word +1182+ 0B64 11 41 0B LD DE,RUNCNT ; Where to RETurn to +1183+ 0B67 D5 PUSH DE ; Save for RETurn +1184+ 0B68 C8 IFJMP: RET Z ; Go to RUNCNT if end of STMT +1185+ 0B69 D6 80 ONJMP: SUB ZEND ; Is it a token? +1186+ 0B6B DA 2F 0D JP C,LET ; No - try to assign it +1187+ 0B6E FE 25 CP ZNEW+1-ZEND ; END to NEW ? +1188+ 0B70 D2 29 07 JP NC,SNERR ; Not a key word - ?SN Error +1189+ 0B73 07 RLCA ; Double it +1190+ 0B74 4F LD C,A ; BC = Offset into table +1191+ 0B75 06 00 LD B,0 +1192+ 0B77 EB EX DE,HL ; Save code string address +1193+ 0B78 21 D1 05 LD HL,WORDTB ; Keyword address table +1194+ 0B7B 09 ADD HL,BC ; Point to routine address +1195+ 0B7C 4E LD C,(HL) ; Get LSB of routine address +1196+ 0B7D 23 INC HL +1197+ 0B7E 46 LD B,(HL) ; Get MSB of routine address +1198+ 0B7F C5 PUSH BC ; Save routine address +1199+ 0B80 EB EX DE,HL ; Restore code string address +1200+ 0B81 +1201+ 0B81 23 GETCHR: INC HL ; Point to next character +1202+ 0B82 7E LD A,(HL) ; Get next code string byte +1203+ 0B83 FE 3A CP ':' ; Z if ':' +1204+ 0B85 D0 RET NC ; NC if > "9" +1205+ 0B86 FE 20 CP ' ' +1206+ 0B88 CA 81 0B JP Z,GETCHR ; Skip over spaces +1207+ 0B8B FE 30 CP '0' +1208+ 0B8D 3F CCF ; NC if < '0' +1209+ 0B8E 3C INC A ; Test for zero - Leave carry +1210+ 0B8F 3D DEC A ; Z if Null +1211+ 0B90 C9 RET +1212+ 0B91 +1213+ 0B91 EB RESTOR: EX DE,HL ; Save code string address +1214+ 0B92 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1215+ 0B95 CA A6 0B JP Z,RESTNL ; Just RESTORE - reset pointer +1216+ 0B98 EB EX DE,HL ; Restore code string address +1217+ 0B99 CD 4D 0C CALL ATOH ; Get line number to DE +1218+ 0B9C E5 PUSH HL ; Save code string address +1219+ 0B9D CD 15 08 CALL SRCHLN ; Search for line number in DE +1220+ 0BA0 60 LD H,B ; HL = Address of line +1221+ 0BA1 69 LD L,C +1222+ 0BA2 D1 POP DE ; Restore code string address +1223+ 0BA3 D2 EE 0C JP NC,ULERR ; ?UL Error if not found +1224+ 0BA6 2B RESTNL: DEC HL ; Byte before DATA statement +1225+ 0BA7 22 8C 31 UPDATA: LD (NXTDAT),HL ; Update DATA pointer +1226+ 0BAA EB EX DE,HL ; Restore code string address +1227+ 0BAB C9 RET +1228+ 0BAC +1229+ 0BAC +1230+ 0BAC DF TSTBRK: RST 18H ; Check input status +1231+ 0BAD C8 RET Z ; No key, go back +1232+ 0BAE D7 RST 10H ; Get the key into A +1233+ 0BAF FE 1B CP ESC ; Escape key? +1234+ 0BB1 28 11 JR Z,BRK ; Yes, break +1235+ 0BB3 FE 03 CP CTRLC ; +1236+ 0BB5 28 0D JR Z,BRK ; Yes, break +1237+ 0BB7 FE 13 CP CTRLS ; Stop scrolling? +1238+ 0BB9 C0 RET NZ ; Other key, ignore +1239+ 0BBA +1240+ 0BBA +1241+ 0BBA D7 STALL: RST 10H ; Wait for key +1242+ 0BBB FE 11 CP CTRLQ ; Resume scrolling? +1243+ 0BBD C8 RET Z ; Release the chokehold +1244+ 0BBE FE 03 CP CTRLC ; Second break? +1245+ 0BC0 28 07 JR Z,STOP ; Break during hold exits prog +1246+ 0BC2 18 F6 JR STALL ; Loop until or +1247+ 0BC4 +1248+ 0BC4 3E FF BRK LD A,$FF ; Set BRKFLG +1249+ 0BC6 32 FD 30 LD (BRKFLG),A ; Store it +1250+ 0BC9 +1251+ 0BC9 +1252+ 0BC9 C0 STOP: RET NZ ; Exit if anything else +1253+ 0BCA F6 .BYTE 0F6H ; Flag "STOP" +1254+ 0BCB C0 PEND: RET NZ ; Exit if anything else +1255+ 0BCC 22 7E 31 LD (BRKLIN),HL ; Save point of break +1256+ 0BCF 21 .BYTE 21H ; Skip "OR 11111111B" +1257+ 0BD0 F6 FF INPBRK: OR 11111111B ; Flag "Break" wanted +1258+ 0BD2 C1 POP BC ; Return not needed and more +1259+ 0BD3 2A 0C 31 ENDPRG: LD HL,(LINEAT) ; Get current line number +1260+ 0BD6 F5 PUSH AF ; Save STOP / END status +1261+ 0BD7 7D LD A,L ; Is it direct break? +1262+ 0BD8 A4 AND H +1263+ 0BD9 3C INC A ; Line is -1 if direct break +1264+ 0BDA CA E6 0B JP Z,NOLIN ; Yes - No line number +1265+ 0BDD 22 82 31 LD (ERRLIN),HL ; Save line of break +1266+ 0BE0 2A 7E 31 LD HL,(BRKLIN) ; Get point of break +1267+ 0BE3 22 84 31 LD (CONTAD),HL ; Save point to CONTinue +1268+ 0BE6 AF NOLIN: XOR A +1269+ 0BE7 32 F5 30 LD (CTLOFG),A ; Enable output +1270+ 0BEA CD 1C 0E CALL STTLIN ; Start a new line +1271+ 0BED F1 POP AF ; Restore STOP / END status +1272+ 0BEE 21 CC 06 LD HL,BRKMSG ; "Break" message +1273+ 0BF1 C2 5D 07 JP NZ,ERRIN ; "in line" wanted? +1274+ 0BF4 C3 74 07 JP PRNTOK ; Go to command mode +1275+ 0BF7 +1276+ 0BF7 2A 84 31 CONT: LD HL,(CONTAD) ; Get CONTinue address +1277+ 0BFA 7C LD A,H ; Is it zero? +1278+ 0BFB B5 OR L +1279+ 0BFC 1E 20 LD E,CN ; ?CN Error +1280+ 0BFE CA 3D 07 JP Z,ERROR ; Yes - output "?CN Error" +1281+ 0C01 EB EX DE,HL ; Save code string address +1282+ 0C02 2A 82 31 LD HL,(ERRLIN) ; Get line of last break +1283+ 0C05 22 0C 31 LD (LINEAT),HL ; Set up current line number +1284+ 0C08 EB EX DE,HL ; Restore code string address +1285+ 0C09 C9 RET ; CONTinue where left off +1286+ 0C0A +1287+ 0C0A CD 4F 17 NULL: CALL GETINT ; Get integer 0-255 +1288+ 0C0D C0 RET NZ ; Return if bad value +1289+ 0C0E 32 F1 30 LD (NULLS),A ; Set nulls number +1290+ 0C11 C9 RET +1291+ 0C12 +1292+ 0C12 +1293+ 0C12 E5 ACCSUM: PUSH HL ; Save address in array +1294+ 0C13 2A FA 30 LD HL,(CHKSUM) ; Get check sum +1295+ 0C16 06 00 LD B,0 ; BC - Value of byte +1296+ 0C18 4F LD C,A +1297+ 0C19 09 ADD HL,BC ; Add byte to check sum +1298+ 0C1A 22 FA 30 LD (CHKSUM),HL ; Re-save check sum +1299+ 0C1D E1 POP HL ; Restore address in array +1300+ 0C1E C9 RET +1301+ 0C1F +1302+ 0C1F 7E CHKLTR: LD A,(HL) ; Get byte +1303+ 0C20 FE 41 CP 'A' ; < 'a' ? +1304+ 0C22 D8 RET C ; Carry set if not letter +1305+ 0C23 FE 5B CP 'Z'+1 ; > 'z' ? +1306+ 0C25 3F CCF +1307+ 0C26 C9 RET ; Carry set if not letter +1308+ 0C27 +1309+ 0C27 CD 81 0B FPSINT: CALL GETCHR ; Get next character +1310+ 0C2A CD EE 0F POSINT: CALL GETNUM ; Get integer 0 to 32767 +1311+ 0C2D CD D0 19 DEPINT: CALL TSTSGN ; Test sign of FPREG +1312+ 0C30 FA 48 0C JP M,FCERR ; Negative - ?FC Error +1313+ 0C33 3A 97 31 DEINT: LD A,(FPEXP) ; Get integer value to DE +1314+ 0C36 FE 90 CP 80H+16 ; Exponent in range (16 bits)? +1315+ 0C38 DA 78 1A JP C,FPINT ; Yes - convert it +1316+ 0C3B 01 80 90 LD BC,9080H ; BCDE = -32768 +1317+ 0C3E 11 00 00 LD DE,0000 +1318+ 0C41 E5 PUSH HL ; Save code string address +1319+ 0C42 CD 4B 1A CALL CMPNUM ; Compare FPREG with BCDE +1320+ 0C45 E1 POP HL ; Restore code string address +1321+ 0C46 51 LD D,C ; MSB to D +1322+ 0C47 C8 RET Z ; Return if in range +1323+ 0C48 1E 08 FCERR: LD E,FC ; ?FC Error +1324+ 0C4A C3 3D 07 JP ERROR ; Output error- +1325+ 0C4D +1326+ 0C4D 2B ATOH: DEC HL ; ASCII number to DE binary +1327+ 0C4E 11 00 00 GETLN: LD DE,0 ; Get number to DE +1328+ 0C51 CD 81 0B GTLNLP: CALL GETCHR ; Get next character +1329+ 0C54 D0 RET NC ; Exit if not a digit +1330+ 0C55 E5 PUSH HL ; Save code string address +1331+ 0C56 F5 PUSH AF ; Save digit +1332+ 0C57 21 98 19 LD HL,65529/10 ; Largest number 65529 +1333+ 0C5A CD F1 09 CALL CPDEHL ; Number in range? +1334+ 0C5D DA 29 07 JP C,SNERR ; No - ?SN Error +1335+ 0C60 62 LD H,D ; HL = Number +1336+ 0C61 6B LD L,E +1337+ 0C62 19 ADD HL,DE ; Times 2 +1338+ 0C63 29 ADD HL,HL ; Times 4 +1339+ 0C64 19 ADD HL,DE ; Times 5 +1340+ 0C65 29 ADD HL,HL ; Times 10 +1341+ 0C66 F1 POP AF ; Restore digit +1342+ 0C67 D6 30 SUB '0' ; Make it 0 to 9 +1343+ 0C69 5F LD E,A ; DE = Value of digit +1344+ 0C6A 16 00 LD D,0 +1345+ 0C6C 19 ADD HL,DE ; Add to number +1346+ 0C6D EB EX DE,HL ; Number to DE +1347+ 0C6E E1 POP HL ; Restore code string address +1348+ 0C6F C3 51 0C JP GTLNLP ; Go to next character +1349+ 0C72 +1350+ 0C72 CA 45 08 CLEAR: JP Z,INTVAR ; Just "CLEAR" Keep parameters +1351+ 0C75 CD 2A 0C CALL POSINT ; Get integer 0 to 32767 to DE +1352+ 0C78 2B DEC HL ; Cancel increment +1353+ 0C79 CD 81 0B CALL GETCHR ; Get next character +1354+ 0C7C E5 PUSH HL ; Save code string address +1355+ 0C7D 2A 5F 31 LD HL,(LSTRAM) ; Get end of RAM +1356+ 0C80 CA 95 0C JP Z,STORED ; No value given - Use stored +1357+ 0C83 E1 POP HL ; Restore code string address +1358+ 0C84 CD F7 09 CALL CHKSYN ; Check for comma +1359+ 0C87 2C .BYTE ',' +1360+ 0C88 D5 PUSH DE ; Save number +1361+ 0C89 CD 2A 0C CALL POSINT ; Get integer 0 to 32767 +1362+ 0C8C 2B DEC HL ; Cancel increment +1363+ 0C8D CD 81 0B CALL GETCHR ; Get next character +1364+ 0C90 C2 29 07 JP NZ,SNERR ; ?SN Error if more on line +1365+ 0C93 E3 EX (SP),HL ; Save code string address +1366+ 0C94 EB EX DE,HL ; Number to DE +1367+ 0C95 7D STORED: LD A,L ; Get LSB of new RAM top +1368+ 0C96 93 SUB E ; Subtract LSB of string space +1369+ 0C97 5F LD E,A ; Save LSB +1370+ 0C98 7C LD A,H ; Get MSB of new RAM top +1371+ 0C99 9A SBC A,D ; Subtract MSB of string space +1372+ 0C9A 57 LD D,A ; Save MSB +1373+ 0C9B DA 1E 07 JP C,OMERR ; ?OM Error if not enough mem +1374+ 0C9E E5 PUSH HL ; Save RAM top +1375+ 0C9F 2A 86 31 LD HL,(PROGND) ; Get program end +1376+ 0CA2 01 28 00 LD BC,40 ; 40 Bytes minimum working RAM +1377+ 0CA5 09 ADD HL,BC ; Get lowest address +1378+ 0CA6 CD F1 09 CALL CPDEHL ; Enough memory? +1379+ 0CA9 D2 1E 07 JP NC,OMERR ; No - ?OM Error +1380+ 0CAC EB EX DE,HL ; RAM top to HL +1381+ 0CAD 22 0A 31 LD (STRSPC),HL ; Set new string space +1382+ 0CB0 E1 POP HL ; End of memory to use +1383+ 0CB1 22 5F 31 LD (LSTRAM),HL ; Set new top of RAM +1384+ 0CB4 E1 POP HL ; Restore code string address +1385+ 0CB5 C3 45 08 JP INTVAR ; Initialise variables +1386+ 0CB8 +1387+ 0CB8 CA 41 08 RUN: JP Z,RUNFST ; RUN from start if just RUN +1388+ 0CBB CD 45 08 CALL INTVAR ; Initialise variables +1389+ 0CBE 01 41 0B LD BC,RUNCNT ; Execution driver loop +1390+ 0CC1 C3 D4 0C JP RUNLIN ; RUN from line number +1391+ 0CC4 +1392+ 0CC4 0E 03 GOSUB: LD C,3 ; 3 Levels of stack needed +1393+ 0CC6 CD 06 07 CALL CHKSTK ; Check for 3 levels of stack +1394+ 0CC9 C1 POP BC ; Get return address +1395+ 0CCA E5 PUSH HL ; Save code string for RETURN +1396+ 0CCB E5 PUSH HL ; And for GOSUB routine +1397+ 0CCC 2A 0C 31 LD HL,(LINEAT) ; Get current line +1398+ 0CCF E3 EX (SP),HL ; Into stack - Code string out +1399+ 0CD0 3E 8C LD A,ZGOSUB ; "GOSUB" token +1400+ 0CD2 F5 PUSH AF ; Save token +1401+ 0CD3 33 INC SP ; Don't save flags +1402+ 0CD4 +1403+ 0CD4 C5 RUNLIN: PUSH BC ; Save return address +1404+ 0CD5 CD 4D 0C GOTO: CALL ATOH ; ASCII number to DE binary +1405+ 0CD8 CD 1A 0D CALL REM ; Get end of line +1406+ 0CDB E5 PUSH HL ; Save end of line +1407+ 0CDC 2A 0C 31 LD HL,(LINEAT) ; Get current line +1408+ 0CDF CD F1 09 CALL CPDEHL ; Line after current? +1409+ 0CE2 E1 POP HL ; Restore end of line +1410+ 0CE3 23 INC HL ; Start of next line +1411+ 0CE4 DC 18 08 CALL C,SRCHLP ; Line is after current line +1412+ 0CE7 D4 15 08 CALL NC,SRCHLN ; Line is before current line +1413+ 0CEA 60 LD H,B ; Set up code string address +1414+ 0CEB 69 LD L,C +1415+ 0CEC 2B DEC HL ; Incremented after +1416+ 0CED D8 RET C ; Line found +1417+ 0CEE 1E 0E ULERR: LD E,UL ; ?UL Error +1418+ 0CF0 C3 3D 07 JP ERROR ; Output error message +1419+ 0CF3 +1420+ 0CF3 C0 RETURN: RET NZ ; Return if not just RETURN +1421+ 0CF4 16 FF LD D,-1 ; Flag "GOSUB" search +1422+ 0CF6 CD D2 06 CALL BAKSTK ; Look "GOSUB" block +1423+ 0CF9 F9 LD SP,HL ; Kill all FORs in subroutine +1424+ 0CFA FE 8C CP ZGOSUB ; Test for "GOSUB" token +1425+ 0CFC 1E 04 LD E,RG ; ?RG Error +1426+ 0CFE C2 3D 07 JP NZ,ERROR ; Error if no "GOSUB" found +1427+ 0D01 E1 POP HL ; Get RETURN line number +1428+ 0D02 22 0C 31 LD (LINEAT),HL ; Save as current +1429+ 0D05 23 INC HL ; Was it from direct statement? +1430+ 0D06 7C LD A,H +1431+ 0D07 B5 OR L ; Return to line +1432+ 0D08 C2 12 0D JP NZ,RETLIN ; No - Return to line +1433+ 0D0B 3A 7C 31 LD A,(LSTBIN) ; Any INPUT in subroutine? +1434+ 0D0E B7 OR A ; If so buffer is corrupted +1435+ 0D0F C2 73 07 JP NZ,POPNOK ; Yes - Go to command mode +1436+ 0D12 21 41 0B RETLIN: LD HL,RUNCNT ; Execution driver loop +1437+ 0D15 E3 EX (SP),HL ; Into stack - Code string out +1438+ 0D16 3E .BYTE 3EH ; Skip "POP HL" +1439+ 0D17 E1 NXTDTA: POP HL ; Restore code string address +1440+ 0D18 +1441+ 0D18 01 3A DATA: .BYTE 01H,3AH ; ':' End of statement +1442+ 0D1A 0E 00 REM: LD C,0 ; 00 End of statement +1443+ 0D1C 06 00 LD B,0 +1444+ 0D1E 79 NXTSTL: LD A,C ; Statement and byte +1445+ 0D1F 48 LD C,B +1446+ 0D20 47 LD B,A ; Statement end byte +1447+ 0D21 7E NXTSTT: LD A,(HL) ; Get byte +1448+ 0D22 B7 OR A ; End of line? +1449+ 0D23 C8 RET Z ; Yes - Exit +1450+ 0D24 B8 CP B ; End of statement? +1451+ 0D25 C8 RET Z ; Yes - Exit +1452+ 0D26 23 INC HL ; Next byte +1453+ 0D27 FE 22 CP '"' ; Literal string? +1454+ 0D29 CA 1E 0D JP Z,NXTSTL ; Yes - Look for another '"' +1455+ 0D2C C3 21 0D JP NXTSTT ; Keep looking +1456+ 0D2F +1457+ 0D2F CD E4 11 LET: CALL GETVAR ; Get variable name +1458+ 0D32 CD F7 09 CALL CHKSYN ; Make sure "=" follows +1459+ 0D35 B4 .BYTE ZEQUAL ; "=" token +1460+ 0D36 D5 PUSH DE ; Save address of variable +1461+ 0D37 3A 5D 31 LD A,(TYPE) ; Get data type +1462+ 0D3A F5 PUSH AF ; Save type +1463+ 0D3B CD 00 10 CALL EVAL ; Evaluate expression +1464+ 0D3E F1 POP AF ; Restore type +1465+ 0D3F E3 EX (SP),HL ; Save code - Get var addr +1466+ 0D40 22 7E 31 LD (BRKLIN),HL ; Save address of variable +1467+ 0D43 1F RRA ; Adjust type +1468+ 0D44 CD F3 0F CALL CHKTYP ; Check types are the same +1469+ 0D47 CA 82 0D JP Z,LETNUM ; Numeric - Move value +1470+ 0D4A E5 LETSTR: PUSH HL ; Save address of string var +1471+ 0D4B 2A 94 31 LD HL,(FPREG) ; Pointer to string entry +1472+ 0D4E E5 PUSH HL ; Save it on stack +1473+ 0D4F 23 INC HL ; Skip over length +1474+ 0D50 23 INC HL +1475+ 0D51 5E LD E,(HL) ; LSB of string address +1476+ 0D52 23 INC HL +1477+ 0D53 56 LD D,(HL) ; MSB of string address +1478+ 0D54 2A 0E 31 LD HL,(BASTXT) ; Point to start of program +1479+ 0D57 CD F1 09 CALL CPDEHL ; Is string before program? +1480+ 0D5A D2 71 0D JP NC,CRESTR ; Yes - Create string entry +1481+ 0D5D 2A 0A 31 LD HL,(STRSPC) ; Point to string space +1482+ 0D60 CD F1 09 CALL CPDEHL ; Is string literal in program? +1483+ 0D63 D1 POP DE ; Restore address of string +1484+ 0D64 D2 79 0D JP NC,MVSTPT ; Yes - Set up pointer +1485+ 0D67 21 6F 31 LD HL,TMPSTR ; Temporary string pool +1486+ 0D6A CD F1 09 CALL CPDEHL ; Is string in temporary pool? +1487+ 0D6D D2 79 0D JP NC,MVSTPT ; No - Set up pointer +1488+ 0D70 3E .BYTE 3EH ; Skip "POP DE" +1489+ 0D71 D1 CRESTR: POP DE ; Restore address of string +1490+ 0D72 CD 28 16 CALL BAKTMP ; Back to last tmp-str entry +1491+ 0D75 EB EX DE,HL ; Address of string entry +1492+ 0D76 CD 61 14 CALL SAVSTR ; Save string in string area +1493+ 0D79 CD 28 16 MVSTPT: CALL BAKTMP ; Back to last tmp-str entry +1494+ 0D7C E1 POP HL ; Get string pointer +1495+ 0D7D CD 2B 1A CALL DETHL4 ; Move string pointer to var +1496+ 0D80 E1 POP HL ; Restore code string address +1497+ 0D81 C9 RET +1498+ 0D82 +1499+ 0D82 E5 LETNUM: PUSH HL ; Save address of variable +1500+ 0D83 CD 28 1A CALL FPTHL ; Move value to variable +1501+ 0D86 D1 POP DE ; Restore address of variable +1502+ 0D87 E1 POP HL ; Restore code string address +1503+ 0D88 C9 RET +1504+ 0D89 +1505+ 0D89 CD 4F 17 ON: CALL GETINT ; Get integer 0-255 +1506+ 0D8C 7E LD A,(HL) ; Get "GOTO" or "GOSUB" token +1507+ 0D8D 47 LD B,A ; Save in B +1508+ 0D8E FE 8C CP ZGOSUB ; "GOSUB" token? +1509+ 0D90 CA 98 0D JP Z,ONGO ; Yes - Find line number +1510+ 0D93 CD F7 09 CALL CHKSYN ; Make sure it's "GOTO" +1511+ 0D96 88 .BYTE ZGOTO ; "GOTO" token +1512+ 0D97 2B DEC HL ; Cancel increment +1513+ 0D98 4B ONGO: LD C,E ; Integer of branch value +1514+ 0D99 0D ONGOLP: DEC C ; Count branches +1515+ 0D9A 78 LD A,B ; Get "GOTO" or "GOSUB" token +1516+ 0D9B CA 69 0B JP Z,ONJMP ; Go to that line if right one +1517+ 0D9E CD 4E 0C CALL GETLN ; Get line number to DE +1518+ 0DA1 FE 2C CP ',' ; Another line number? +1519+ 0DA3 C0 RET NZ ; No - Drop through +1520+ 0DA4 C3 99 0D JP ONGOLP ; Yes - loop +1521+ 0DA7 +1522+ 0DA7 CD 00 10 IF: CALL EVAL ; Evaluate expression +1523+ 0DAA 7E LD A,(HL) ; Get token +1524+ 0DAB FE 88 CP ZGOTO ; "GOTO" token? +1525+ 0DAD CA B5 0D JP Z,IFGO ; Yes - Get line +1526+ 0DB0 CD F7 09 CALL CHKSYN ; Make sure it's "THEN" +1527+ 0DB3 A9 .BYTE ZTHEN ; "THEN" token +1528+ 0DB4 2B DEC HL ; Cancel increment +1529+ 0DB5 CD F1 0F IFGO: CALL TSTNUM ; Make sure it's numeric +1530+ 0DB8 CD D0 19 CALL TSTSGN ; Test state of expression +1531+ 0DBB CA 1A 0D JP Z,REM ; False - Drop through +1532+ 0DBE CD 81 0B CALL GETCHR ; Get next character +1533+ 0DC1 DA D5 0C JP C,GOTO ; Number - GOTO that line +1534+ 0DC4 C3 68 0B JP IFJMP ; Otherwise do statement +1535+ 0DC7 +1536+ 0DC7 2B MRPRNT: DEC HL ; DEC 'cos GETCHR INCs +1537+ 0DC8 CD 81 0B CALL GETCHR ; Get next character +1538+ 0DCB CA 29 0E PRINT: JP Z,PRNTCRLF ; CRLF if just PRINT +1539+ 0DCE C8 PRNTLP: RET Z ; End of list - Exit +1540+ 0DCF FE A5 CP ZTAB ; "TAB(" token? +1541+ 0DD1 CA 5C 0E JP Z,DOTAB ; Yes - Do TAB routine +1542+ 0DD4 FE A8 CP ZSPC ; "SPC(" token? +1543+ 0DD6 CA 5C 0E JP Z,DOTAB ; Yes - Do SPC routine +1544+ 0DD9 E5 PUSH HL ; Save code string address +1545+ 0DDA FE 2C CP ',' ; Comma? +1546+ 0DDC CA 45 0E JP Z,DOCOM ; Yes - Move to next zone +1547+ 0DDF FE 3B CP 59 ;";" ; Semi-colon? +1548+ 0DE1 CA 7F 0E JP Z,NEXITM ; Do semi-colon routine +1549+ 0DE4 C1 POP BC ; Code string address to BC +1550+ 0DE5 CD 00 10 CALL EVAL ; Evaluate expression +1551+ 0DE8 E5 PUSH HL ; Save code string address +1552+ 0DE9 3A 5D 31 LD A,(TYPE) ; Get variable type +1553+ 0DEC B7 OR A ; Is it a string variable? +1554+ 0DED C2 15 0E JP NZ,PRNTST ; Yes - Output string contents +1555+ 0DF0 CD 75 1B CALL NUMASC ; Convert number to text +1556+ 0DF3 CD 85 14 CALL CRTST ; Create temporary string +1557+ 0DF6 36 20 LD (HL),' ' ; Followed by a space +1558+ 0DF8 2A 94 31 LD HL,(FPREG) ; Get length of output +1559+ 0DFB 34 INC (HL) ; Plus 1 for the space +1560+ 0DFC 2A 94 31 LD HL,(FPREG) ; < Not needed > +1561+ 0DFF 3A F2 30 LD A,(LWIDTH) ; Get width of line +1562+ 0E02 47 LD B,A ; To B +1563+ 0E03 04 INC B ; Width 255 (No limit)? +1564+ 0E04 CA 11 0E JP Z,PRNTNB ; Yes - Output number string +1565+ 0E07 04 INC B ; Adjust it +1566+ 0E08 3A 5B 31 LD A,(CURPOS) ; Get cursor position +1567+ 0E0B 86 ADD A,(HL) ; Add length of string +1568+ 0E0C 3D DEC A ; Adjust it +1569+ 0E0D B8 CP B ; Will output fit on this line? +1570+ 0E0E D4 29 0E CALL NC,PRNTCRLF ; No - CRLF first +1571+ 0E11 CD CA 14 PRNTNB: CALL PRS1 ; Output string at (HL) +1572+ 0E14 AF XOR A ; Skip CALL by setting 'z' flag +1573+ 0E15 C4 CA 14 PRNTST: CALL NZ,PRS1 ; Output string at (HL) +1574+ 0E18 E1 POP HL ; Restore code string address +1575+ 0E19 C3 C7 0D JP MRPRNT ; See if more to PRINT +1576+ 0E1C +1577+ 0E1C 3A 5B 31 STTLIN: LD A,(CURPOS) ; Make sure on new line +1578+ 0E1F B7 OR A ; Already at start? +1579+ 0E20 C8 RET Z ; Yes - Do nothing +1580+ 0E21 C3 29 0E JP PRNTCRLF ; Start a new line +1581+ 0E24 +1582+ 0E24 36 00 ENDINP: LD (HL),0 ; Mark end of buffer +1583+ 0E26 21 10 31 LD HL,BUFFER-1 ; Point to buffer +1584+ 0E29 3E 0D PRNTCRLF: LD A,CR ; Load a CR +1585+ 0E2B CD 02 0A CALL OUTC ; Output character +1586+ 0E2E 3E 0A LD A,LF ; Load a LF +1587+ 0E30 CD 02 0A CALL OUTC ; Output character +1588+ 0E33 AF DONULL: XOR A ; Set to position 0 +1589+ 0E34 32 5B 31 LD (CURPOS),A ; Store it +1590+ 0E37 3A F1 30 LD A,(NULLS) ; Get number of nulls +1591+ 0E3A 3D NULLP: DEC A ; Count them +1592+ 0E3B C8 RET Z ; Return if done +1593+ 0E3C F5 PUSH AF ; Save count +1594+ 0E3D AF XOR A ; Load a null +1595+ 0E3E CD 02 0A CALL OUTC ; Output it +1596+ 0E41 F1 POP AF ; Restore count +1597+ 0E42 C3 3A 0E JP NULLP ; Keep counting +1598+ 0E45 +1599+ 0E45 3A F3 30 DOCOM: LD A,(COMMAN) ; Get comma width +1600+ 0E48 47 LD B,A ; Save in B +1601+ 0E49 3A 5B 31 LD A,(CURPOS) ; Get current position +1602+ 0E4C B8 CP B ; Within the limit? +1603+ 0E4D D4 29 0E CALL NC,PRNTCRLF ; No - output CRLF +1604+ 0E50 D2 7F 0E JP NC,NEXITM ; Get next item +1605+ 0E53 D6 0E ZONELP: SUB 14 ; Next zone of 14 characters +1606+ 0E55 D2 53 0E JP NC,ZONELP ; Repeat if more zones +1607+ 0E58 2F CPL ; Number of spaces to output +1608+ 0E59 C3 74 0E JP ASPCS ; Output them +1609+ 0E5C +1610+ 0E5C F5 DOTAB: PUSH AF ; Save token +1611+ 0E5D CD 4C 17 CALL FNDNUM ; Evaluate expression +1612+ 0E60 CD F7 09 CALL CHKSYN ; Make sure ")" follows +1613+ 0E63 29 .BYTE ")" +1614+ 0E64 2B DEC HL ; Back space on to ")" +1615+ 0E65 F1 POP AF ; Restore token +1616+ 0E66 D6 A8 SUB ZSPC ; Was it "SPC(" ? +1617+ 0E68 E5 PUSH HL ; Save code string address +1618+ 0E69 CA 6F 0E JP Z,DOSPC ; Yes - Do 'E' spaces +1619+ 0E6C 3A 5B 31 LD A,(CURPOS) ; Get current position +1620+ 0E6F 2F DOSPC: CPL ; Number of spaces to print to +1621+ 0E70 83 ADD A,E ; Total number to print +1622+ 0E71 D2 7F 0E JP NC,NEXITM ; TAB < Current POS(X) +1623+ 0E74 3C ASPCS: INC A ; Output A spaces +1624+ 0E75 47 LD B,A ; Save number to print +1625+ 0E76 3E 20 LD A,' ' ; Space +1626+ 0E78 CD 02 0A SPCLP: CALL OUTC ; Output character in A +1627+ 0E7B 05 DEC B ; Count them +1628+ 0E7C C2 78 0E JP NZ,SPCLP ; Repeat if more +1629+ 0E7F E1 NEXITM: POP HL ; Restore code string address +1630+ 0E80 CD 81 0B CALL GETCHR ; Get next character +1631+ 0E83 C3 CE 0D JP PRNTLP ; More to print +1632+ 0E86 +1633+ 0E86 3F 52 65 64 REDO: .BYTE "?Redo from start",CR,LF,0 +1633+ 0E8A 6F 20 66 72 +1633+ 0E8E 6F 6D 20 73 +1633+ 0E92 74 61 72 74 +1633+ 0E96 0D 0A 00 +1634+ 0E99 +1635+ 0E99 3A 7D 31 BADINP: LD A,(READFG) ; READ or INPUT? +1636+ 0E9C B7 OR A +1637+ 0E9D C2 23 07 JP NZ,DATSNR ; READ - ?SN Error +1638+ 0EA0 C1 POP BC ; Throw away code string addr +1639+ 0EA1 21 86 0E LD HL,REDO ; "Redo from start" message +1640+ 0EA4 CD C7 14 CALL PRS ; Output string +1641+ 0EA7 C3 74 08 JP DOAGN ; Do last INPUT again +1642+ 0EAA +1643+ 0EAA CD 32 14 INPUT: CALL IDTEST ; Test for illegal direct +1644+ 0EAD 7E LD A,(HL) ; Get character after "INPUT" +1645+ 0EAE FE 22 CP '"' ; Is there a prompt string? +1646+ 0EB0 3E 00 LD A,0 ; Clear A and leave flags +1647+ 0EB2 32 F5 30 LD (CTLOFG),A ; Enable output +1648+ 0EB5 C2 C4 0E JP NZ,NOPMPT ; No prompt - get input +1649+ 0EB8 CD 86 14 CALL QTSTR ; Get string terminated by '"' +1650+ 0EBB CD F7 09 CALL CHKSYN ; Check for ';' after prompt +1651+ 0EBE 3B .BYTE ';' +1652+ 0EBF E5 PUSH HL ; Save code string address +1653+ 0EC0 CD CA 14 CALL PRS1 ; Output prompt string +1654+ 0EC3 3E .BYTE 3EH ; Skip "PUSH HL" +1655+ 0EC4 E5 NOPMPT: PUSH HL ; Save code string address +1656+ 0EC5 CD 78 08 CALL PROMPT ; Get input with "? " prompt +1657+ 0EC8 C1 POP BC ; Restore code string address +1658+ 0EC9 DA D0 0B JP C,INPBRK ; Break pressed - Exit +1659+ 0ECC 23 INC HL ; Next byte +1660+ 0ECD 7E LD A,(HL) ; Get it +1661+ 0ECE B7 OR A ; End of line? +1662+ 0ECF 2B DEC HL ; Back again +1663+ 0ED0 C5 PUSH BC ; Re-save code string address +1664+ 0ED1 CA 17 0D JP Z,NXTDTA ; Yes - Find next DATA stmt +1665+ 0ED4 36 2C LD (HL),',' ; Store comma as separator +1666+ 0ED6 C3 DE 0E JP NXTITM ; Get next item +1667+ 0ED9 +1668+ 0ED9 E5 READ: PUSH HL ; Save code string address +1669+ 0EDA 2A 8C 31 LD HL,(NXTDAT) ; Next DATA statement +1670+ 0EDD F6 .BYTE 0F6H ; Flag "READ" +1671+ 0EDE AF NXTITM: XOR A ; Flag "INPUT" +1672+ 0EDF 32 7D 31 LD (READFG),A ; Save "READ"/"INPUT" flag +1673+ 0EE2 E3 EX (SP),HL ; Get code str' , Save pointer +1674+ 0EE3 C3 EA 0E JP GTVLUS ; Get values +1675+ 0EE6 +1676+ 0EE6 CD F7 09 NEDMOR: CALL CHKSYN ; Check for comma between items +1677+ 0EE9 2C .BYTE ',' +1678+ 0EEA CD E4 11 GTVLUS: CALL GETVAR ; Get variable name +1679+ 0EED E3 EX (SP),HL ; Save code str" , Get pointer +1680+ 0EEE D5 PUSH DE ; Save variable address +1681+ 0EEF 7E LD A,(HL) ; Get next "INPUT"/"DATA" byte +1682+ 0EF0 FE 2C CP ',' ; Comma? +1683+ 0EF2 CA 12 0F JP Z,ANTVLU ; Yes - Get another value +1684+ 0EF5 3A 7D 31 LD A,(READFG) ; Is it READ? +1685+ 0EF8 B7 OR A +1686+ 0EF9 C2 7F 0F JP NZ,FDTLP ; Yes - Find next DATA stmt +1687+ 0EFC 3E 3F LD A,'?' ; More INPUT needed +1688+ 0EFE CD 02 0A CALL OUTC ; Output character +1689+ 0F01 CD 78 08 CALL PROMPT ; Get INPUT with prompt +1690+ 0F04 D1 POP DE ; Variable address +1691+ 0F05 C1 POP BC ; Code string address +1692+ 0F06 DA D0 0B JP C,INPBRK ; Break pressed +1693+ 0F09 23 INC HL ; Point to next DATA byte +1694+ 0F0A 7E LD A,(HL) ; Get byte +1695+ 0F0B B7 OR A ; Is it zero (No input) ? +1696+ 0F0C 2B DEC HL ; Back space INPUT pointer +1697+ 0F0D C5 PUSH BC ; Save code string address +1698+ 0F0E CA 17 0D JP Z,NXTDTA ; Find end of buffer +1699+ 0F11 D5 PUSH DE ; Save variable address +1700+ 0F12 3A 5D 31 ANTVLU: LD A,(TYPE) ; Check data type +1701+ 0F15 B7 OR A ; Is it numeric? +1702+ 0F16 CA 3C 0F JP Z,INPBIN ; Yes - Convert to binary +1703+ 0F19 CD 81 0B CALL GETCHR ; Get next character +1704+ 0F1C 57 LD D,A ; Save input character +1705+ 0F1D 47 LD B,A ; Again +1706+ 0F1E FE 22 CP '"' ; Start of literal sting? +1707+ 0F20 CA 30 0F JP Z,STRENT ; Yes - Create string entry +1708+ 0F23 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +1709+ 0F26 B7 OR A +1710+ 0F27 57 LD D,A ; Save 00 if "INPUT" +1711+ 0F28 CA 2D 0F JP Z,ITMSEP ; "INPUT" - End with 00 +1712+ 0F2B 16 3A LD D,':' ; "DATA" - End with 00 or ':' +1713+ 0F2D 06 2C ITMSEP: LD B,',' ; Item separator +1714+ 0F2F 2B DEC HL ; Back space for DTSTR +1715+ 0F30 CD 89 14 STRENT: CALL DTSTR ; Get string terminated by D +1716+ 0F33 EB EX DE,HL ; String address to DE +1717+ 0F34 21 47 0F LD HL,LTSTND ; Where to go after LETSTR +1718+ 0F37 E3 EX (SP),HL ; Save HL , get input pointer +1719+ 0F38 D5 PUSH DE ; Save address of string +1720+ 0F39 C3 4A 0D JP LETSTR ; Assign string to variable +1721+ 0F3C +1722+ 0F3C CD 81 0B INPBIN: CALL GETCHR ; Get next character +1723+ 0F3F CD D7 1A CALL ASCTFP ; Convert ASCII to FP number +1724+ 0F42 E3 EX (SP),HL ; Save input ptr, Get var addr +1725+ 0F43 CD 28 1A CALL FPTHL ; Move FPREG to variable +1726+ 0F46 E1 POP HL ; Restore input pointer +1727+ 0F47 2B LTSTND: DEC HL ; DEC 'cos GETCHR INCs +1728+ 0F48 CD 81 0B CALL GETCHR ; Get next character +1729+ 0F4B CA 53 0F JP Z,MORDT ; End of line - More needed? +1730+ 0F4E FE 2C CP ',' ; Another value? +1731+ 0F50 C2 99 0E JP NZ,BADINP ; No - Bad input +1732+ 0F53 E3 MORDT: EX (SP),HL ; Get code string address +1733+ 0F54 2B DEC HL ; DEC 'cos GETCHR INCs +1734+ 0F55 CD 81 0B CALL GETCHR ; Get next character +1735+ 0F58 C2 E6 0E JP NZ,NEDMOR ; More needed - Get it +1736+ 0F5B D1 POP DE ; Restore DATA pointer +1737+ 0F5C 3A 7D 31 LD A,(READFG) ; "READ" or "INPUT" ? +1738+ 0F5F B7 OR A +1739+ 0F60 EB EX DE,HL ; DATA pointer to HL +1740+ 0F61 C2 A7 0B JP NZ,UPDATA ; Update DATA pointer if "READ" +1741+ 0F64 D5 PUSH DE ; Save code string address +1742+ 0F65 B6 OR (HL) ; More input given? +1743+ 0F66 21 6E 0F LD HL,EXTIG ; "?Extra ignored" message +1744+ 0F69 C4 C7 14 CALL NZ,PRS ; Output string if extra given +1745+ 0F6C E1 POP HL ; Restore code string address +1746+ 0F6D C9 RET +1747+ 0F6E +1748+ 0F6E 3F 45 78 74 EXTIG: .BYTE "?Extra ignored",CR,LF,0 +1748+ 0F72 72 61 20 69 +1748+ 0F76 67 6E 6F 72 +1748+ 0F7A 65 64 0D 0A +1748+ 0F7E 00 +1749+ 0F7F +1750+ 0F7F CD 18 0D FDTLP: CALL DATA ; Get next statement +1751+ 0F82 B7 OR A ; End of line? +1752+ 0F83 C2 98 0F JP NZ,FANDT ; No - See if DATA statement +1753+ 0F86 23 INC HL +1754+ 0F87 7E LD A,(HL) ; End of program? +1755+ 0F88 23 INC HL +1756+ 0F89 B6 OR (HL) ; 00 00 Ends program +1757+ 0F8A 1E 06 LD E,OD ; ?OD Error +1758+ 0F8C CA 3D 07 JP Z,ERROR ; Yes - Out of DATA +1759+ 0F8F 23 INC HL +1760+ 0F90 5E LD E,(HL) ; LSB of line number +1761+ 0F91 23 INC HL +1762+ 0F92 56 LD D,(HL) ; MSB of line number +1763+ 0F93 EB EX DE,HL +1764+ 0F94 22 79 31 LD (DATLIN),HL ; Set line of current DATA item +1765+ 0F97 EB EX DE,HL +1766+ 0F98 CD 81 0B FANDT: CALL GETCHR ; Get next character +1767+ 0F9B FE 83 CP ZDATA ; "DATA" token +1768+ 0F9D C2 7F 0F JP NZ,FDTLP ; No "DATA" - Keep looking +1769+ 0FA0 C3 12 0F JP ANTVLU ; Found - Convert input +1770+ 0FA3 +1771+ 0FA3 11 00 00 NEXT: LD DE,0 ; In case no index given +1772+ 0FA6 C4 E4 11 NEXT1: CALL NZ,GETVAR ; Get index address +1773+ 0FA9 22 7E 31 LD (BRKLIN),HL ; Save code string address +1774+ 0FAC CD D2 06 CALL BAKSTK ; Look for "FOR" block +1775+ 0FAF C2 2F 07 JP NZ,NFERR ; No "FOR" - ?NF Error +1776+ 0FB2 F9 LD SP,HL ; Clear nested loops +1777+ 0FB3 D5 PUSH DE ; Save index address +1778+ 0FB4 7E LD A,(HL) ; Get sign of STEP +1779+ 0FB5 23 INC HL +1780+ 0FB6 F5 PUSH AF ; Save sign of STEP +1781+ 0FB7 D5 PUSH DE ; Save index address +1782+ 0FB8 CD 0E 1A CALL PHLTFP ; Move index value to FPREG +1783+ 0FBB E3 EX (SP),HL ; Save address of TO value +1784+ 0FBC E5 PUSH HL ; Save address of index +1785+ 0FBD CD 7B 17 CALL ADDPHL ; Add STEP to index value +1786+ 0FC0 E1 POP HL ; Restore address of index +1787+ 0FC1 CD 28 1A CALL FPTHL ; Move value to index variable +1788+ 0FC4 E1 POP HL ; Restore address of TO value +1789+ 0FC5 CD 1F 1A CALL LOADFP ; Move TO value to BCDE +1790+ 0FC8 E5 PUSH HL ; Save address of line of FOR +1791+ 0FC9 CD 4B 1A CALL CMPNUM ; Compare index with TO value +1792+ 0FCC E1 POP HL ; Restore address of line num +1793+ 0FCD C1 POP BC ; Address of sign of STEP +1794+ 0FCE 90 SUB B ; Compare with expected sign +1795+ 0FCF CD 1F 1A CALL LOADFP ; BC = Loop stmt,DE = Line num +1796+ 0FD2 CA DE 0F JP Z,KILFOR ; Loop finished - Terminate it +1797+ 0FD5 EB EX DE,HL ; Loop statement line number +1798+ 0FD6 22 0C 31 LD (LINEAT),HL ; Set loop line number +1799+ 0FD9 69 LD L,C ; Set code string to loop +1800+ 0FDA 60 LD H,B +1801+ 0FDB C3 3D 0B JP PUTFID ; Put back "FOR" and continue +1802+ 0FDE +1803+ 0FDE F9 KILFOR: LD SP,HL ; Remove "FOR" block +1804+ 0FDF 2A 7E 31 LD HL,(BRKLIN) ; Code string after "NEXT" +1805+ 0FE2 7E LD A,(HL) ; Get next byte in code string +1806+ 0FE3 FE 2C CP ',' ; More NEXTs ? +1807+ 0FE5 C2 41 0B JP NZ,RUNCNT ; No - Do next statement +1808+ 0FE8 CD 81 0B CALL GETCHR ; Position to index name +1809+ 0FEB CD A6 0F CALL NEXT1 ; Re-enter NEXT routine +1810+ 0FEE ; < will not RETurn to here , Exit to RUNCNT or Loop > +1811+ 0FEE +1812+ 0FEE CD 00 10 GETNUM: CALL EVAL ; Get a numeric expression +1813+ 0FF1 F6 TSTNUM: .BYTE 0F6H ; Clear carry (numeric) +1814+ 0FF2 37 TSTSTR: SCF ; Set carry (string) +1815+ 0FF3 3A 5D 31 CHKTYP: LD A,(TYPE) ; Check types match +1816+ 0FF6 8F ADC A,A ; Expected + actual +1817+ 0FF7 B7 OR A ; Clear carry , set parity +1818+ 0FF8 E8 RET PE ; Even parity - Types match +1819+ 0FF9 C3 3B 07 JP TMERR ; Different types - Error +1820+ 0FFC +1821+ 0FFC CD F7 09 OPNPAR: CALL CHKSYN ; Make sure "(" follows +1822+ 0FFF 28 .BYTE "(" +1823+ 1000 2B EVAL: DEC HL ; Evaluate expression & save +1824+ 1001 16 00 LD D,0 ; Precedence value +1825+ 1003 D5 EVAL1: PUSH DE ; Save precedence +1826+ 1004 0E 01 LD C,1 +1827+ 1006 CD 06 07 CALL CHKSTK ; Check for 1 level of stack +1828+ 1009 CD 77 10 CALL OPRND ; Get next expression value +1829+ 100C 22 80 31 EVAL2: LD (NXTOPR),HL ; Save address of next operator +1830+ 100F 2A 80 31 EVAL3: LD HL,(NXTOPR) ; Restore address of next opr +1831+ 1012 C1 POP BC ; Precedence value and operator +1832+ 1013 78 LD A,B ; Get precedence value +1833+ 1014 FE 78 CP 78H ; "AND" or "OR" ? +1834+ 1016 D4 F1 0F CALL NC,TSTNUM ; No - Make sure it's a number +1835+ 1019 7E LD A,(HL) ; Get next operator / function +1836+ 101A 16 00 LD D,0 ; Clear Last relation +1837+ 101C D6 B3 RLTLP: SUB ZGTR ; ">" Token +1838+ 101E DA 38 10 JP C,FOPRND ; + - * / ^ AND OR - Test it +1839+ 1021 FE 03 CP ZLTH+1-ZGTR ; < = > +1840+ 1023 D2 38 10 JP NC,FOPRND ; Function - Call it +1841+ 1026 FE 01 CP ZEQUAL-ZGTR ; "=" +1842+ 1028 17 RLA ; <- Test for legal +1843+ 1029 AA XOR D ; <- combinations of < = > +1844+ 102A BA CP D ; <- by combining last token +1845+ 102B 57 LD D,A ; <- with current one +1846+ 102C DA 29 07 JP C,SNERR ; Error if "<<' '==" or ">>" +1847+ 102F 22 75 31 LD (CUROPR),HL ; Save address of current token +1848+ 1032 CD 81 0B CALL GETCHR ; Get next character +1849+ 1035 C3 1C 10 JP RLTLP ; Treat the two as one +1850+ 1038 +1851+ 1038 7A FOPRND: LD A,D ; < = > found ? +1852+ 1039 B7 OR A +1853+ 103A C2 5F 11 JP NZ,TSTRED ; Yes - Test for reduction +1854+ 103D 7E LD A,(HL) ; Get operator token +1855+ 103E 22 75 31 LD (CUROPR),HL ; Save operator address +1856+ 1041 D6 AC SUB ZPLUS ; Operator or function? +1857+ 1043 D8 RET C ; Neither - Exit +1858+ 1044 FE 07 CP ZOR+1-ZPLUS ; Is it + - * / ^ AND OR ? +1859+ 1046 D0 RET NC ; No - Exit +1860+ 1047 5F LD E,A ; Coded operator +1861+ 1048 3A 5D 31 LD A,(TYPE) ; Get data type +1862+ 104B 3D DEC A ; FF = numeric , 00 = string +1863+ 104C B3 OR E ; Combine with coded operator +1864+ 104D 7B LD A,E ; Get coded operator +1865+ 104E CA BD 15 JP Z,CONCAT ; String concatenation +1866+ 1051 07 RLCA ; Times 2 +1867+ 1052 83 ADD A,E ; Times 3 +1868+ 1053 5F LD E,A ; To DE (D is 0) +1869+ 1054 21 1B 06 LD HL,PRITAB ; Precedence table +1870+ 1057 19 ADD HL,DE ; To the operator concerned +1871+ 1058 78 LD A,B ; Last operator precedence +1872+ 1059 56 LD D,(HL) ; Get evaluation precedence +1873+ 105A BA CP D ; Compare with eval precedence +1874+ 105B D0 RET NC ; Exit if higher precedence +1875+ 105C 23 INC HL ; Point to routine address +1876+ 105D CD F1 0F CALL TSTNUM ; Make sure it's a number +1877+ 1060 +1878+ 1060 C5 STKTHS: PUSH BC ; Save last precedence & token +1879+ 1061 01 0F 10 LD BC,EVAL3 ; Where to go on prec' break +1880+ 1064 C5 PUSH BC ; Save on stack for return +1881+ 1065 43 LD B,E ; Save operator +1882+ 1066 4A LD C,D ; Save precedence +1883+ 1067 CD 01 1A CALL STAKFP ; Move value to stack +1884+ 106A 58 LD E,B ; Restore operator +1885+ 106B 51 LD D,C ; Restore precedence +1886+ 106C 4E LD C,(HL) ; Get LSB of routine address +1887+ 106D 23 INC HL +1888+ 106E 46 LD B,(HL) ; Get MSB of routine address +1889+ 106F 23 INC HL +1890+ 1070 C5 PUSH BC ; Save routine address +1891+ 1071 2A 75 31 LD HL,(CUROPR) ; Address of current operator +1892+ 1074 C3 03 10 JP EVAL1 ; Loop until prec' break +1893+ 1077 +1894+ 1077 AF OPRND: XOR A ; Get operand routine +1895+ 1078 32 5D 31 LD (TYPE),A ; Set numeric expected +1896+ 107B CD 81 0B CALL GETCHR ; Get next character +1897+ 107E 1E 24 LD E,MO ; ?MO Error +1898+ 1080 CA 3D 07 JP Z,ERROR ; No operand - Error +1899+ 1083 DA D7 1A JP C,ASCTFP ; Number - Get value +1900+ 1086 CD 1F 0C CALL CHKLTR ; See if a letter +1901+ 1089 D2 DE 10 JP NC,CONVAR ; Letter - Find variable +1902+ 108C FE 26 CP '&' ; &H = HEX, &B = BINARY +1903+ 108E 20 12 JR NZ, NOTAMP +1904+ 1090 CD 81 0B CALL GETCHR ; Get next character +1905+ 1093 FE 48 CP 'H' ; Hex number indicated? [function added] +1906+ 1095 CA 1B 1F JP Z,HEXTFP ; Convert Hex to FPREG +1907+ 1098 FE 42 CP 'B' ; Binary number indicated? [function added] +1908+ 109A CA 8B 1F JP Z,BINTFP ; Convert Bin to FPREG +1909+ 109D 1E 02 LD E,SN ; If neither then a ?SN Error +1910+ 109F CA 3D 07 JP Z,ERROR ; +1911+ 10A2 FE AC NOTAMP: CP ZPLUS ; '+' Token ? +1912+ 10A4 CA 77 10 JP Z,OPRND ; Yes - Look for operand +1913+ 10A7 FE 2E CP '.' ; '.' ? +1914+ 10A9 CA D7 1A JP Z,ASCTFP ; Yes - Create FP number +1915+ 10AC FE AD CP ZMINUS ; '-' Token ? +1916+ 10AE CA CD 10 JP Z,MINUS ; Yes - Do minus +1917+ 10B1 FE 22 CP '"' ; Literal string ? +1918+ 10B3 CA 86 14 JP Z,QTSTR ; Get string terminated by '"' +1919+ 10B6 FE AA CP ZNOT ; "NOT" Token ? +1920+ 10B8 CA BF 11 JP Z,EVNOT ; Yes - Eval NOT expression +1921+ 10BB FE A7 CP ZFN ; "FN" Token ? +1922+ 10BD CA EA 13 JP Z,DOFN ; Yes - Do FN routine +1923+ 10C0 D6 B6 SUB ZSGN ; Is it a function? +1924+ 10C2 D2 EF 10 JP NC,FNOFST ; Yes - Evaluate function +1925+ 10C5 CD FC 0F EVLPAR: CALL OPNPAR ; Evaluate expression in "()" +1926+ 10C8 CD F7 09 CALL CHKSYN ; Make sure ")" follows +1927+ 10CB 29 .BYTE ")" +1928+ 10CC C9 RET +1929+ 10CD +1930+ 10CD 16 7D MINUS: LD D,7DH ; '-' precedence +1931+ 10CF CD 03 10 CALL EVAL1 ; Evaluate until prec' break +1932+ 10D2 2A 80 31 LD HL,(NXTOPR) ; Get next operator address +1933+ 10D5 E5 PUSH HL ; Save next operator address +1934+ 10D6 CD F9 19 CALL INVSGN ; Negate value +1935+ 10D9 CD F1 0F RETNUM: CALL TSTNUM ; Make sure it's a number +1936+ 10DC E1 POP HL ; Restore next operator address +1937+ 10DD C9 RET +1938+ 10DE +1939+ 10DE CD E4 11 CONVAR: CALL GETVAR ; Get variable address to DE +1940+ 10E1 E5 FRMEVL: PUSH HL ; Save code string address +1941+ 10E2 EB EX DE,HL ; Variable address to HL +1942+ 10E3 22 94 31 LD (FPREG),HL ; Save address of variable +1943+ 10E6 3A 5D 31 LD A,(TYPE) ; Get type +1944+ 10E9 B7 OR A ; Numeric? +1945+ 10EA CC 0E 1A CALL Z,PHLTFP ; Yes - Move contents to FPREG +1946+ 10ED E1 POP HL ; Restore code string address +1947+ 10EE C9 RET +1948+ 10EF +1949+ 10EF 06 00 FNOFST: LD B,0 ; Get address of function +1950+ 10F1 07 RLCA ; Double function offset +1951+ 10F2 4F LD C,A ; BC = Offset in function table +1952+ 10F3 C5 PUSH BC ; Save adjusted token value +1953+ 10F4 CD 81 0B CALL GETCHR ; Get next character +1954+ 10F7 79 LD A,C ; Get adjusted token value +1955+ 10F8 FE 31 CP 2*(ZLEFT-ZSGN)-1; Adj' LEFT$,RIGHT$ or MID$ ? +1956+ 10FA DA 16 11 JP C,FNVAL ; No - Do function +1957+ 10FD CD FC 0F CALL OPNPAR ; Evaluate expression (X,... +1958+ 1100 CD F7 09 CALL CHKSYN ; Make sure ',' follows +1959+ 1103 2C .BYTE ',' +1960+ 1104 CD F2 0F CALL TSTSTR ; Make sure it's a string +1961+ 1107 EB EX DE,HL ; Save code string address +1962+ 1108 2A 94 31 LD HL,(FPREG) ; Get address of string +1963+ 110B E3 EX (SP),HL ; Save address of string +1964+ 110C E5 PUSH HL ; Save adjusted token value +1965+ 110D EB EX DE,HL ; Restore code string address +1966+ 110E CD 4F 17 CALL GETINT ; Get integer 0-255 +1967+ 1111 EB EX DE,HL ; Save code string address +1968+ 1112 E3 EX (SP),HL ; Save integer,HL = adj' token +1969+ 1113 C3 1E 11 JP GOFUNC ; Jump to string function +1970+ 1116 +1971+ 1116 CD C5 10 FNVAL: CALL EVLPAR ; Evaluate expression +1972+ 1119 E3 EX (SP),HL ; HL = Adjusted token value +1973+ 111A 11 D9 10 LD DE,RETNUM ; Return number from function +1974+ 111D D5 PUSH DE ; Save on stack +1975+ 111E 01 7A 04 GOFUNC: LD BC,FNCTAB ; Function routine addresses +1976+ 1121 09 ADD HL,BC ; Point to right address +1977+ 1122 4E LD C,(HL) ; Get LSB of address +1978+ 1123 23 INC HL ; +1979+ 1124 66 LD H,(HL) ; Get MSB of address +1980+ 1125 69 LD L,C ; Address to HL +1981+ 1126 E9 JP (HL) ; Jump to function +1982+ 1127 +1983+ 1127 15 SGNEXP: DEC D ; Dee to flag negative exponent +1984+ 1128 FE AD CP ZMINUS ; '-' token ? +1985+ 112A C8 RET Z ; Yes - Return +1986+ 112B FE 2D CP '-' ; '-' ASCII ? +1987+ 112D C8 RET Z ; Yes - Return +1988+ 112E 14 INC D ; Inc to flag positive exponent +1989+ 112F FE 2B CP '+' ; '+' ASCII ? +1990+ 1131 C8 RET Z ; Yes - Return +1991+ 1132 FE AC CP ZPLUS ; '+' token ? +1992+ 1134 C8 RET Z ; Yes - Return +1993+ 1135 2B DEC HL ; DEC 'cos GETCHR INCs +1994+ 1136 C9 RET ; Return "NZ" +1995+ 1137 +1996+ 1137 F6 POR: .BYTE 0F6H ; Flag "OR" +1997+ 1138 AF PAND: XOR A ; Flag "AND" +1998+ 1139 F5 PUSH AF ; Save "AND" / "OR" flag +1999+ 113A CD F1 0F CALL TSTNUM ; Make sure it's a number +2000+ 113D CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +2001+ 1140 F1 POP AF ; Restore "AND" / "OR" flag +2002+ 1141 EB EX DE,HL ; <- Get last +2003+ 1142 C1 POP BC ; <- value +2004+ 1143 E3 EX (SP),HL ; <- from +2005+ 1144 EB EX DE,HL ; <- stack +2006+ 1145 CD 11 1A CALL FPBCDE ; Move last value to FPREG +2007+ 1148 F5 PUSH AF ; Save "AND" / "OR" flag +2008+ 1149 CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +2009+ 114C F1 POP AF ; Restore "AND" / "OR" flag +2010+ 114D C1 POP BC ; Get value +2011+ 114E 79 LD A,C ; Get LSB +2012+ 114F 21 A8 13 LD HL,ACPASS ; Address of save AC as current +2013+ 1152 C2 5A 11 JP NZ,POR1 ; Jump if OR +2014+ 1155 A3 AND E ; "AND" LSBs +2015+ 1156 4F LD C,A ; Save LSB +2016+ 1157 78 LD A,B ; Get MBS +2017+ 1158 A2 AND D ; "AND" MSBs +2018+ 1159 E9 JP (HL) ; Save AC as current (ACPASS) +2019+ 115A +2020+ 115A B3 POR1: OR E ; "OR" LSBs +2021+ 115B 4F LD C,A ; Save LSB +2022+ 115C 78 LD A,B ; Get MSB +2023+ 115D B2 OR D ; "OR" MSBs +2024+ 115E E9 JP (HL) ; Save AC as current (ACPASS) +2025+ 115F +2026+ 115F 21 71 11 TSTRED: LD HL,CMPLOG ; Logical compare routine +2027+ 1162 3A 5D 31 LD A,(TYPE) ; Get data type +2028+ 1165 1F RRA ; Carry set = string +2029+ 1166 7A LD A,D ; Get last precedence value +2030+ 1167 17 RLA ; Times 2 plus carry +2031+ 1168 5F LD E,A ; To E +2032+ 1169 16 64 LD D,64H ; Relational precedence +2033+ 116B 78 LD A,B ; Get current precedence +2034+ 116C BA CP D ; Compare with last +2035+ 116D D0 RET NC ; Eval if last was rel' or log' +2036+ 116E C3 60 10 JP STKTHS ; Stack this one and get next +2037+ 1171 +2038+ 1171 73 11 CMPLOG: .WORD CMPLG1 ; Compare two values / strings +2039+ 1173 79 CMPLG1: LD A,C ; Get data type +2040+ 1174 B7 OR A +2041+ 1175 1F RRA +2042+ 1176 C1 POP BC ; Get last expression to BCDE +2043+ 1177 D1 POP DE +2044+ 1178 F5 PUSH AF ; Save status +2045+ 1179 CD F3 0F CALL CHKTYP ; Check that types match +2046+ 117C 21 B5 11 LD HL,CMPRES ; Result to comparison +2047+ 117F E5 PUSH HL ; Save for RETurn +2048+ 1180 CA 4B 1A JP Z,CMPNUM ; Compare values if numeric +2049+ 1183 AF XOR A ; Compare two strings +2050+ 1184 32 5D 31 LD (TYPE),A ; Set type to numeric +2051+ 1187 D5 PUSH DE ; Save string name +2052+ 1188 CD 0A 16 CALL GSTRCU ; Get current string +2053+ 118B 7E LD A,(HL) ; Get length of string +2054+ 118C 23 INC HL +2055+ 118D 23 INC HL +2056+ 118E 4E LD C,(HL) ; Get LSB of address +2057+ 118F 23 INC HL +2058+ 1190 46 LD B,(HL) ; Get MSB of address +2059+ 1191 D1 POP DE ; Restore string name +2060+ 1192 C5 PUSH BC ; Save address of string +2061+ 1193 F5 PUSH AF ; Save length of string +2062+ 1194 CD 0E 16 CALL GSTRDE ; Get second string +2063+ 1197 CD 1F 1A CALL LOADFP ; Get address of second string +2064+ 119A F1 POP AF ; Restore length of string 1 +2065+ 119B 57 LD D,A ; Length to D +2066+ 119C E1 POP HL ; Restore address of string 1 +2067+ 119D 7B CMPSTR: LD A,E ; Bytes of string 2 to do +2068+ 119E B2 OR D ; Bytes of string 1 to do +2069+ 119F C8 RET Z ; Exit if all bytes compared +2070+ 11A0 7A LD A,D ; Get bytes of string 1 to do +2071+ 11A1 D6 01 SUB 1 +2072+ 11A3 D8 RET C ; Exit if end of string 1 +2073+ 11A4 AF XOR A +2074+ 11A5 BB CP E ; Bytes of string 2 to do +2075+ 11A6 3C INC A +2076+ 11A7 D0 RET NC ; Exit if end of string 2 +2077+ 11A8 15 DEC D ; Count bytes in string 1 +2078+ 11A9 1D DEC E ; Count bytes in string 2 +2079+ 11AA 0A LD A,(BC) ; Byte in string 2 +2080+ 11AB BE CP (HL) ; Compare to byte in string 1 +2081+ 11AC 23 INC HL ; Move up string 1 +2082+ 11AD 03 INC BC ; Move up string 2 +2083+ 11AE CA 9D 11 JP Z,CMPSTR ; Same - Try next bytes +2084+ 11B1 3F CCF ; Flag difference (">" or "<") +2085+ 11B2 C3 DB 19 JP FLGDIF ; "<" gives -1 , ">" gives +1 +2086+ 11B5 +2087+ 11B5 3C CMPRES: INC A ; Increment current value +2088+ 11B6 8F ADC A,A ; Double plus carry +2089+ 11B7 C1 POP BC ; Get other value +2090+ 11B8 A0 AND B ; Combine them +2091+ 11B9 C6 FF ADD A,-1 ; Carry set if different +2092+ 11BB 9F SBC A,A ; 00 - Equal , FF - Different +2093+ 11BC C3 E2 19 JP FLGREL ; Set current value & continue +2094+ 11BF +2095+ 11BF 16 5A EVNOT: LD D,5AH ; Precedence value for "NOT" +2096+ 11C1 CD 03 10 CALL EVAL1 ; Eval until precedence break +2097+ 11C4 CD F1 0F CALL TSTNUM ; Make sure it's a number +2098+ 11C7 CD 33 0C CALL DEINT ; Get integer -32768 - 32767 +2099+ 11CA 7B LD A,E ; Get LSB +2100+ 11CB 2F CPL ; Invert LSB +2101+ 11CC 4F LD C,A ; Save "NOT" of LSB +2102+ 11CD 7A LD A,D ; Get MSB +2103+ 11CE 2F CPL ; Invert MSB +2104+ 11CF CD A8 13 CALL ACPASS ; Save AC as current +2105+ 11D2 C1 POP BC ; Clean up stack +2106+ 11D3 C3 0F 10 JP EVAL3 ; Continue evaluation +2107+ 11D6 +2108+ 11D6 2B DIMRET: DEC HL ; DEC 'cos GETCHR INCs +2109+ 11D7 CD 81 0B CALL GETCHR ; Get next character +2110+ 11DA C8 RET Z ; End of DIM statement +2111+ 11DB CD F7 09 CALL CHKSYN ; Make sure ',' follows +2112+ 11DE 2C .BYTE ',' +2113+ 11DF 01 D6 11 DIM: LD BC,DIMRET ; Return to "DIMRET" +2114+ 11E2 C5 PUSH BC ; Save on stack +2115+ 11E3 F6 .BYTE 0F6H ; Flag "Create" variable +2116+ 11E4 AF GETVAR: XOR A ; Find variable address,to DE +2117+ 11E5 32 5C 31 LD (LCRFLG),A ; Set locate / create flag +2118+ 11E8 46 LD B,(HL) ; Get First byte of name +2119+ 11E9 CD 1F 0C GTFNAM: CALL CHKLTR ; See if a letter +2120+ 11EC DA 29 07 JP C,SNERR ; ?SN Error if not a letter +2121+ 11EF AF XOR A +2122+ 11F0 4F LD C,A ; Clear second byte of name +2123+ 11F1 32 5D 31 LD (TYPE),A ; Set type to numeric +2124+ 11F4 CD 81 0B CALL GETCHR ; Get next character +2125+ 11F7 DA 00 12 JP C,SVNAM2 ; Numeric - Save in name +2126+ 11FA CD 1F 0C CALL CHKLTR ; See if a letter +2127+ 11FD DA 0D 12 JP C,CHARTY ; Not a letter - Check type +2128+ 1200 4F SVNAM2: LD C,A ; Save second byte of name +2129+ 1201 CD 81 0B ENDNAM: CALL GETCHR ; Get next character +2130+ 1204 DA 01 12 JP C,ENDNAM ; Numeric - Get another +2131+ 1207 CD 1F 0C CALL CHKLTR ; See if a letter +2132+ 120A D2 01 12 JP NC,ENDNAM ; Letter - Get another +2133+ 120D D6 24 CHARTY: SUB '$' ; String variable? +2134+ 120F C2 1C 12 JP NZ,NOTSTR ; No - Numeric variable +2135+ 1212 3C INC A ; A = 1 (string type) +2136+ 1213 32 5D 31 LD (TYPE),A ; Set type to string +2137+ 1216 0F RRCA ; A = 80H , Flag for string +2138+ 1217 81 ADD A,C ; 2nd byte of name has bit 7 on +2139+ 1218 4F LD C,A ; Resave second byte on name +2140+ 1219 CD 81 0B CALL GETCHR ; Get next character +2141+ 121C 3A 7B 31 NOTSTR: LD A,(FORFLG) ; Array name needed ? +2142+ 121F 3D DEC A +2143+ 1220 CA C9 12 JP Z,ARLDSV ; Yes - Get array name +2144+ 1223 F2 2C 12 JP P,NSCFOR ; No array with "FOR" or "FN" +2145+ 1226 7E LD A,(HL) ; Get byte again +2146+ 1227 D6 28 SUB '(' ; Subscripted variable? +2147+ 1229 CA A1 12 JP Z,SBSCPT ; Yes - Sort out subscript +2148+ 122C +2149+ 122C AF NSCFOR: XOR A ; Simple variable +2150+ 122D 32 7B 31 LD (FORFLG),A ; Clear "FOR" flag +2151+ 1230 E5 PUSH HL ; Save code string address +2152+ 1231 50 LD D,B ; DE = Variable name to find +2153+ 1232 59 LD E,C +2154+ 1233 2A 8E 31 LD HL,(FNRGNM) ; FN argument name +2155+ 1236 CD F1 09 CALL CPDEHL ; Is it the FN argument? +2156+ 1239 11 90 31 LD DE,FNARG ; Point to argument value +2157+ 123C CA 11 19 JP Z,POPHRT ; Yes - Return FN argument value +2158+ 123F 2A 88 31 LD HL,(VAREND) ; End of variables +2159+ 1242 EB EX DE,HL ; Address of end of search +2160+ 1243 2A 86 31 LD HL,(PROGND) ; Start of variables address +2161+ 1246 CD F1 09 FNDVAR: CALL CPDEHL ; End of variable list table? +2162+ 1249 CA 5F 12 JP Z,CFEVAL ; Yes - Called from EVAL? +2163+ 124C 79 LD A,C ; Get second byte of name +2164+ 124D 96 SUB (HL) ; Compare with name in list +2165+ 124E 23 INC HL ; Move on to first byte +2166+ 124F C2 54 12 JP NZ,FNTHR ; Different - Find another +2167+ 1252 78 LD A,B ; Get first byte of name +2168+ 1253 96 SUB (HL) ; Compare with name in list +2169+ 1254 23 FNTHR: INC HL ; Move on to LSB of value +2170+ 1255 CA 93 12 JP Z,RETADR ; Found - Return address +2171+ 1258 23 INC HL ; <- Skip +2172+ 1259 23 INC HL ; <- over +2173+ 125A 23 INC HL ; <- F.P. +2174+ 125B 23 INC HL ; <- value +2175+ 125C C3 46 12 JP FNDVAR ; Keep looking +2176+ 125F +2177+ 125F E1 CFEVAL: POP HL ; Restore code string address +2178+ 1260 E3 EX (SP),HL ; Get return address +2179+ 1261 D5 PUSH DE ; Save address of variable +2180+ 1262 11 E1 10 LD DE,FRMEVL ; Return address in EVAL +2181+ 1265 CD F1 09 CALL CPDEHL ; Called from EVAL ? +2182+ 1268 D1 POP DE ; Restore address of variable +2183+ 1269 CA 96 12 JP Z,RETNUL ; Yes - Return null variable +2184+ 126C E3 EX (SP),HL ; Put back return +2185+ 126D E5 PUSH HL ; Save code string address +2186+ 126E C5 PUSH BC ; Save variable name +2187+ 126F 01 06 00 LD BC,6 ; 2 byte name plus 4 byte data +2188+ 1272 2A 8A 31 LD HL,(ARREND) ; End of arrays +2189+ 1275 E5 PUSH HL ; Save end of arrays +2190+ 1276 09 ADD HL,BC ; Move up 6 bytes +2191+ 1277 C1 POP BC ; Source address in BC +2192+ 1278 E5 PUSH HL ; Save new end address +2193+ 1279 CD F5 06 CALL MOVUP ; Move arrays up +2194+ 127C E1 POP HL ; Restore new end address +2195+ 127D 22 8A 31 LD (ARREND),HL ; Set new end address +2196+ 1280 60 LD H,B ; End of variables to HL +2197+ 1281 69 LD L,C +2198+ 1282 22 88 31 LD (VAREND),HL ; Set new end address +2199+ 1285 +2200+ 1285 2B ZEROLP: DEC HL ; Back through to zero variable +2201+ 1286 36 00 LD (HL),0 ; Zero byte in variable +2202+ 1288 CD F1 09 CALL CPDEHL ; Done them all? +2203+ 128B C2 85 12 JP NZ,ZEROLP ; No - Keep on going +2204+ 128E D1 POP DE ; Get variable name +2205+ 128F 73 LD (HL),E ; Store second character +2206+ 1290 23 INC HL +2207+ 1291 72 LD (HL),D ; Store first character +2208+ 1292 23 INC HL +2209+ 1293 EB RETADR: EX DE,HL ; Address of variable in DE +2210+ 1294 E1 POP HL ; Restore code string address +2211+ 1295 C9 RET +2212+ 1296 +2213+ 1296 32 97 31 RETNUL: LD (FPEXP),A ; Set result to zero +2214+ 1299 21 C5 06 LD HL,ZERBYT ; Also set a null string +2215+ 129C 22 94 31 LD (FPREG),HL ; Save for EVAL +2216+ 129F E1 POP HL ; Restore code string address +2217+ 12A0 C9 RET +2218+ 12A1 +2219+ 12A1 E5 SBSCPT: PUSH HL ; Save code string address +2220+ 12A2 2A 5C 31 LD HL,(LCRFLG) ; Locate/Create and Type +2221+ 12A5 E3 EX (SP),HL ; Save and get code string +2222+ 12A6 57 LD D,A ; Zero number of dimensions +2223+ 12A7 D5 SCPTLP: PUSH DE ; Save number of dimensions +2224+ 12A8 C5 PUSH BC ; Save array name +2225+ 12A9 CD 27 0C CALL FPSINT ; Get subscript (0-32767) +2226+ 12AC C1 POP BC ; Restore array name +2227+ 12AD F1 POP AF ; Get number of dimensions +2228+ 12AE EB EX DE,HL +2229+ 12AF E3 EX (SP),HL ; Save subscript value +2230+ 12B0 E5 PUSH HL ; Save LCRFLG and TYPE +2231+ 12B1 EB EX DE,HL +2232+ 12B2 3C INC A ; Count dimensions +2233+ 12B3 57 LD D,A ; Save in D +2234+ 12B4 7E LD A,(HL) ; Get next byte in code string +2235+ 12B5 FE 2C CP ',' ; Comma (more to come)? +2236+ 12B7 CA A7 12 JP Z,SCPTLP ; Yes - More subscripts +2237+ 12BA CD F7 09 CALL CHKSYN ; Make sure ")" follows +2238+ 12BD 29 .BYTE ")" +2239+ 12BE 22 80 31 LD (NXTOPR),HL ; Save code string address +2240+ 12C1 E1 POP HL ; Get LCRFLG and TYPE +2241+ 12C2 22 5C 31 LD (LCRFLG),HL ; Restore Locate/create & type +2242+ 12C5 1E 00 LD E,0 ; Flag not CSAVE* or CLOAD* +2243+ 12C7 D5 PUSH DE ; Save number of dimensions (D) +2244+ 12C8 11 .BYTE 11H ; Skip "PUSH HL" and "PUSH AF' +2245+ 12C9 +2246+ 12C9 E5 ARLDSV: PUSH HL ; Save code string address +2247+ 12CA F5 PUSH AF ; A = 00 , Flags set = Z,N +2248+ 12CB 2A 88 31 LD HL,(VAREND) ; Start of arrays +2249+ 12CE 3E .BYTE 3EH ; Skip "ADD HL,DE" +2250+ 12CF 19 FNDARY: ADD HL,DE ; Move to next array start +2251+ 12D0 EB EX DE,HL +2252+ 12D1 2A 8A 31 LD HL,(ARREND) ; End of arrays +2253+ 12D4 EB EX DE,HL ; Current array pointer +2254+ 12D5 CD F1 09 CALL CPDEHL ; End of arrays found? +2255+ 12D8 CA 01 13 JP Z,CREARY ; Yes - Create array +2256+ 12DB 7E LD A,(HL) ; Get second byte of name +2257+ 12DC B9 CP C ; Compare with name given +2258+ 12DD 23 INC HL ; Move on +2259+ 12DE C2 E3 12 JP NZ,NXTARY ; Different - Find next array +2260+ 12E1 7E LD A,(HL) ; Get first byte of name +2261+ 12E2 B8 CP B ; Compare with name given +2262+ 12E3 23 NXTARY: INC HL ; Move on +2263+ 12E4 5E LD E,(HL) ; Get LSB of next array address +2264+ 12E5 23 INC HL +2265+ 12E6 56 LD D,(HL) ; Get MSB of next array address +2266+ 12E7 23 INC HL +2267+ 12E8 C2 CF 12 JP NZ,FNDARY ; Not found - Keep looking +2268+ 12EB 3A 5C 31 LD A,(LCRFLG) ; Found Locate or Create it? +2269+ 12EE B7 OR A +2270+ 12EF C2 32 07 JP NZ,DDERR ; Create - ?DD Error +2271+ 12F2 F1 POP AF ; Locate - Get number of dim'ns +2272+ 12F3 44 LD B,H ; BC Points to array dim'ns +2273+ 12F4 4D LD C,L +2274+ 12F5 CA 11 19 JP Z,POPHRT ; Jump if array load/save +2275+ 12F8 96 SUB (HL) ; Same number of dimensions? +2276+ 12F9 CA 5F 13 JP Z,FINDEL ; Yes - Find element +2277+ 12FC 1E 10 BSERR: LD E,BS ; ?BS Error +2278+ 12FE C3 3D 07 JP ERROR ; Output error +2279+ 1301 +2280+ 1301 11 04 00 CREARY: LD DE,4 ; 4 Bytes per entry +2281+ 1304 F1 POP AF ; Array to save or 0 dim'ns? +2282+ 1305 CA 48 0C JP Z,FCERR ; Yes - ?FC Error +2283+ 1308 71 LD (HL),C ; Save second byte of name +2284+ 1309 23 INC HL +2285+ 130A 70 LD (HL),B ; Save first byte of name +2286+ 130B 23 INC HL +2287+ 130C 4F LD C,A ; Number of dimensions to C +2288+ 130D CD 06 07 CALL CHKSTK ; Check if enough memory +2289+ 1310 23 INC HL ; Point to number of dimensions +2290+ 1311 23 INC HL +2291+ 1312 22 75 31 LD (CUROPR),HL ; Save address of pointer +2292+ 1315 71 LD (HL),C ; Set number of dimensions +2293+ 1316 23 INC HL +2294+ 1317 3A 5C 31 LD A,(LCRFLG) ; Locate of Create? +2295+ 131A 17 RLA ; Carry set = Create +2296+ 131B 79 LD A,C ; Get number of dimensions +2297+ 131C 01 0B 00 CRARLP: LD BC,10+1 ; Default dimension size 10 +2298+ 131F D2 24 13 JP NC,DEFSIZ ; Locate - Set default size +2299+ 1322 C1 POP BC ; Get specified dimension size +2300+ 1323 03 INC BC ; Include zero element +2301+ 1324 71 DEFSIZ: LD (HL),C ; Save LSB of dimension size +2302+ 1325 23 INC HL +2303+ 1326 70 LD (HL),B ; Save MSB of dimension size +2304+ 1327 23 INC HL +2305+ 1328 F5 PUSH AF ; Save num' of dim'ns an status +2306+ 1329 E5 PUSH HL ; Save address of dim'n size +2307+ 132A CD BC 1A CALL MLDEBC ; Multiply DE by BC to find +2308+ 132D EB EX DE,HL ; amount of mem needed (to DE) +2309+ 132E E1 POP HL ; Restore address of dimension +2310+ 132F F1 POP AF ; Restore number of dimensions +2311+ 1330 3D DEC A ; Count them +2312+ 1331 C2 1C 13 JP NZ,CRARLP ; Do next dimension if more +2313+ 1334 F5 PUSH AF ; Save locate/create flag +2314+ 1335 42 LD B,D ; MSB of memory needed +2315+ 1336 4B LD C,E ; LSB of memory needed +2316+ 1337 EB EX DE,HL +2317+ 1338 19 ADD HL,DE ; Add bytes to array start +2318+ 1339 DA 1E 07 JP C,OMERR ; Too big - Error +2319+ 133C CD 0F 07 CALL ENFMEM ; See if enough memory +2320+ 133F 22 8A 31 LD (ARREND),HL ; Save new end of array +2321+ 1342 +2322+ 1342 2B ZERARY: DEC HL ; Back through array data +2323+ 1343 36 00 LD (HL),0 ; Set array element to zero +2324+ 1345 CD F1 09 CALL CPDEHL ; All elements zeroed? +2325+ 1348 C2 42 13 JP NZ,ZERARY ; No - Keep on going +2326+ 134B 03 INC BC ; Number of bytes + 1 +2327+ 134C 57 LD D,A ; A=0 +2328+ 134D 2A 75 31 LD HL,(CUROPR) ; Get address of array +2329+ 1350 5E LD E,(HL) ; Number of dimensions +2330+ 1351 EB EX DE,HL ; To HL +2331+ 1352 29 ADD HL,HL ; Two bytes per dimension size +2332+ 1353 09 ADD HL,BC ; Add number of bytes +2333+ 1354 EB EX DE,HL ; Bytes needed to DE +2334+ 1355 2B DEC HL +2335+ 1356 2B DEC HL +2336+ 1357 73 LD (HL),E ; Save LSB of bytes needed +2337+ 1358 23 INC HL +2338+ 1359 72 LD (HL),D ; Save MSB of bytes needed +2339+ 135A 23 INC HL +2340+ 135B F1 POP AF ; Locate / Create? +2341+ 135C DA 83 13 JP C,ENDDIM ; A is 0 , End if create +2342+ 135F 47 FINDEL: LD B,A ; Find array element +2343+ 1360 4F LD C,A +2344+ 1361 7E LD A,(HL) ; Number of dimensions +2345+ 1362 23 INC HL +2346+ 1363 16 .BYTE 16H ; Skip "POP HL" +2347+ 1364 E1 FNDELP: POP HL ; Address of next dim' size +2348+ 1365 5E LD E,(HL) ; Get LSB of dim'n size +2349+ 1366 23 INC HL +2350+ 1367 56 LD D,(HL) ; Get MSB of dim'n size +2351+ 1368 23 INC HL +2352+ 1369 E3 EX (SP),HL ; Save address - Get index +2353+ 136A F5 PUSH AF ; Save number of dim'ns +2354+ 136B CD F1 09 CALL CPDEHL ; Dimension too large? +2355+ 136E D2 FC 12 JP NC,BSERR ; Yes - ?BS Error +2356+ 1371 E5 PUSH HL ; Save index +2357+ 1372 CD BC 1A CALL MLDEBC ; Multiply previous by size +2358+ 1375 D1 POP DE ; Index supplied to DE +2359+ 1376 19 ADD HL,DE ; Add index to pointer +2360+ 1377 F1 POP AF ; Number of dimensions +2361+ 1378 3D DEC A ; Count them +2362+ 1379 44 LD B,H ; MSB of pointer +2363+ 137A 4D LD C,L ; LSB of pointer +2364+ 137B C2 64 13 JP NZ,FNDELP ; More - Keep going +2365+ 137E 29 ADD HL,HL ; 4 Bytes per element +2366+ 137F 29 ADD HL,HL +2367+ 1380 C1 POP BC ; Start of array +2368+ 1381 09 ADD HL,BC ; Point to element +2369+ 1382 EB EX DE,HL ; Address of element to DE +2370+ 1383 2A 80 31 ENDDIM: LD HL,(NXTOPR) ; Got code string address +2371+ 1386 C9 RET +2372+ 1387 +2373+ 1387 2A 8A 31 FRE: LD HL,(ARREND) ; Start of free memory +2374+ 138A EB EX DE,HL ; To DE +2375+ 138B 21 00 00 LD HL,0 ; End of free memory +2376+ 138E 39 ADD HL,SP ; Current stack value +2377+ 138F 3A 5D 31 LD A,(TYPE) ; Dummy argument type +2378+ 1392 B7 OR A +2379+ 1393 CA A3 13 JP Z,FRENUM ; Numeric - Free variable space +2380+ 1396 CD 0A 16 CALL GSTRCU ; Current string to pool +2381+ 1399 CD 0A 15 CALL GARBGE ; Garbage collection +2382+ 139C 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +2383+ 139F EB EX DE,HL ; To DE +2384+ 13A0 2A 73 31 LD HL,(STRBOT) ; Bottom of string space +2385+ 13A3 7D FRENUM: LD A,L ; Get LSB of end +2386+ 13A4 93 SUB E ; Subtract LSB of beginning +2387+ 13A5 4F LD C,A ; Save difference if C +2388+ 13A6 7C LD A,H ; Get MSB of end +2389+ 13A7 9A SBC A,D ; Subtract MSB of beginning +2390+ 13A8 41 ACPASS: LD B,C ; Return integer AC +2391+ 13A9 50 ABPASS: LD D,B ; Return integer AB +2392+ 13AA 1E 00 LD E,0 +2393+ 13AC 21 5D 31 LD HL,TYPE ; Point to type +2394+ 13AF 73 LD (HL),E ; Set type to numeric +2395+ 13B0 06 90 LD B,80H+16 ; 16 bit integer +2396+ 13B2 C3 E7 19 JP RETINT ; Return the integr +2397+ 13B5 +2398+ 13B5 3A 5B 31 POS: LD A,(CURPOS) ; Get cursor position +2399+ 13B8 47 PASSA: LD B,A ; Put A into AB +2400+ 13B9 AF XOR A ; Zero A +2401+ 13BA C3 A9 13 JP ABPASS ; Return integer AB +2402+ 13BD +2403+ 13BD CD 40 14 DEF: CALL CHEKFN ; Get "FN" and name +2404+ 13C0 CD 32 14 CALL IDTEST ; Test for illegal direct +2405+ 13C3 01 18 0D LD BC,DATA ; To get next statement +2406+ 13C6 C5 PUSH BC ; Save address for RETurn +2407+ 13C7 D5 PUSH DE ; Save address of function ptr +2408+ 13C8 CD F7 09 CALL CHKSYN ; Make sure "(" follows +2409+ 13CB 28 .BYTE "(" +2410+ 13CC CD E4 11 CALL GETVAR ; Get argument variable name +2411+ 13CF E5 PUSH HL ; Save code string address +2412+ 13D0 EB EX DE,HL ; Argument address to HL +2413+ 13D1 2B DEC HL +2414+ 13D2 56 LD D,(HL) ; Get first byte of arg name +2415+ 13D3 2B DEC HL +2416+ 13D4 5E LD E,(HL) ; Get second byte of arg name +2417+ 13D5 E1 POP HL ; Restore code string address +2418+ 13D6 CD F1 0F CALL TSTNUM ; Make sure numeric argument +2419+ 13D9 CD F7 09 CALL CHKSYN ; Make sure ")" follows +2420+ 13DC 29 .BYTE ")" +2421+ 13DD CD F7 09 CALL CHKSYN ; Make sure "=" follows +2422+ 13E0 B4 .BYTE ZEQUAL ; "=" token +2423+ 13E1 44 LD B,H ; Code string address to BC +2424+ 13E2 4D LD C,L +2425+ 13E3 E3 EX (SP),HL ; Save code str , Get FN ptr +2426+ 13E4 71 LD (HL),C ; Save LSB of FN code string +2427+ 13E5 23 INC HL +2428+ 13E6 70 LD (HL),B ; Save MSB of FN code string +2429+ 13E7 C3 7F 14 JP SVSTAD ; Save address and do function +2430+ 13EA +2431+ 13EA CD 40 14 DOFN: CALL CHEKFN ; Make sure FN follows +2432+ 13ED D5 PUSH DE ; Save function pointer address +2433+ 13EE CD C5 10 CALL EVLPAR ; Evaluate expression in "()" +2434+ 13F1 CD F1 0F CALL TSTNUM ; Make sure numeric result +2435+ 13F4 E3 EX (SP),HL ; Save code str , Get FN ptr +2436+ 13F5 5E LD E,(HL) ; Get LSB of FN code string +2437+ 13F6 23 INC HL +2438+ 13F7 56 LD D,(HL) ; Get MSB of FN code string +2439+ 13F8 23 INC HL +2440+ 13F9 7A LD A,D ; And function DEFined? +2441+ 13FA B3 OR E +2442+ 13FB CA 35 07 JP Z,UFERR ; No - ?UF Error +2443+ 13FE 7E LD A,(HL) ; Get LSB of argument address +2444+ 13FF 23 INC HL +2445+ 1400 66 LD H,(HL) ; Get MSB of argument address +2446+ 1401 6F LD L,A ; HL = Arg variable address +2447+ 1402 E5 PUSH HL ; Save it +2448+ 1403 2A 8E 31 LD HL,(FNRGNM) ; Get old argument name +2449+ 1406 E3 EX (SP),HL ; ; Save old , Get new +2450+ 1407 22 8E 31 LD (FNRGNM),HL ; Set new argument name +2451+ 140A 2A 92 31 LD HL,(FNARG+2) ; Get LSB,NLSB of old arg value +2452+ 140D E5 PUSH HL ; Save it +2453+ 140E 2A 90 31 LD HL,(FNARG) ; Get MSB,EXP of old arg value +2454+ 1411 E5 PUSH HL ; Save it +2455+ 1412 21 90 31 LD HL,FNARG ; HL = Value of argument +2456+ 1415 D5 PUSH DE ; Save FN code string address +2457+ 1416 CD 28 1A CALL FPTHL ; Move FPREG to argument +2458+ 1419 E1 POP HL ; Get FN code string address +2459+ 141A CD EE 0F CALL GETNUM ; Get value from function +2460+ 141D 2B DEC HL ; DEC 'cos GETCHR INCs +2461+ 141E CD 81 0B CALL GETCHR ; Get next character +2462+ 1421 C2 29 07 JP NZ,SNERR ; Bad character in FN - Error +2463+ 1424 E1 POP HL ; Get MSB,EXP of old arg +2464+ 1425 22 90 31 LD (FNARG),HL ; Restore it +2465+ 1428 E1 POP HL ; Get LSB,NLSB of old arg +2466+ 1429 22 92 31 LD (FNARG+2),HL ; Restore it +2467+ 142C E1 POP HL ; Get name of old arg +2468+ 142D 22 8E 31 LD (FNRGNM),HL ; Restore it +2469+ 1430 E1 POP HL ; Restore code string address +2470+ 1431 C9 RET +2471+ 1432 +2472+ 1432 E5 IDTEST: PUSH HL ; Save code string address +2473+ 1433 2A 0C 31 LD HL,(LINEAT) ; Get current line number +2474+ 1436 23 INC HL ; -1 means direct statement +2475+ 1437 7C LD A,H +2476+ 1438 B5 OR L +2477+ 1439 E1 POP HL ; Restore code string address +2478+ 143A C0 RET NZ ; Return if in program +2479+ 143B 1E 16 LD E,ID ; ?ID Error +2480+ 143D C3 3D 07 JP ERROR +2481+ 1440 +2482+ 1440 CD F7 09 CHEKFN: CALL CHKSYN ; Make sure FN follows +2483+ 1443 A7 .BYTE ZFN ; "FN" token +2484+ 1444 3E 80 LD A,80H +2485+ 1446 32 7B 31 LD (FORFLG),A ; Flag FN name to find +2486+ 1449 B6 OR (HL) ; FN name has bit 7 set +2487+ 144A 47 LD B,A ; in first byte of name +2488+ 144B CD E9 11 CALL GTFNAM ; Get FN name +2489+ 144E C3 F1 0F JP TSTNUM ; Make sure numeric function +2490+ 1451 +2491+ 1451 CD F1 0F STR: CALL TSTNUM ; Make sure it's a number +2492+ 1454 CD 75 1B CALL NUMASC ; Turn number into text +2493+ 1457 CD 85 14 STR1: CALL CRTST ; Create string entry for it +2494+ 145A CD 0A 16 CALL GSTRCU ; Current string to pool +2495+ 145D 01 65 16 LD BC,TOPOOL ; Save in string pool +2496+ 1460 C5 PUSH BC ; Save address on stack +2497+ 1461 +2498+ 1461 7E SAVSTR: LD A,(HL) ; Get string length +2499+ 1462 23 INC HL +2500+ 1463 23 INC HL +2501+ 1464 E5 PUSH HL ; Save pointer to string +2502+ 1465 CD E0 14 CALL TESTR ; See if enough string space +2503+ 1468 E1 POP HL ; Restore pointer to string +2504+ 1469 4E LD C,(HL) ; Get LSB of address +2505+ 146A 23 INC HL +2506+ 146B 46 LD B,(HL) ; Get MSB of address +2507+ 146C CD 79 14 CALL CRTMST ; Create string entry +2508+ 146F E5 PUSH HL ; Save pointer to MSB of addr +2509+ 1470 6F LD L,A ; Length of string +2510+ 1471 CD FD 15 CALL TOSTRA ; Move to string area +2511+ 1474 D1 POP DE ; Restore pointer to MSB +2512+ 1475 C9 RET +2513+ 1476 +2514+ 1476 CD E0 14 MKTMST: CALL TESTR ; See if enough string space +2515+ 1479 21 6F 31 CRTMST: LD HL,TMPSTR ; Temporary string +2516+ 147C E5 PUSH HL ; Save it +2517+ 147D 77 LD (HL),A ; Save length of string +2518+ 147E 23 INC HL +2519+ 147F 23 SVSTAD: INC HL +2520+ 1480 73 LD (HL),E ; Save LSB of address +2521+ 1481 23 INC HL +2522+ 1482 72 LD (HL),D ; Save MSB of address +2523+ 1483 E1 POP HL ; Restore pointer +2524+ 1484 C9 RET +2525+ 1485 +2526+ 1485 2B CRTST: DEC HL ; DEC - INCed after +2527+ 1486 06 22 QTSTR: LD B,'"' ; Terminating quote +2528+ 1488 50 LD D,B ; Quote to D +2529+ 1489 E5 DTSTR: PUSH HL ; Save start +2530+ 148A 0E FF LD C,-1 ; Set counter to -1 +2531+ 148C 23 QTSTLP: INC HL ; Move on +2532+ 148D 7E LD A,(HL) ; Get byte +2533+ 148E 0C INC C ; Count bytes +2534+ 148F B7 OR A ; End of line? +2535+ 1490 CA 9B 14 JP Z,CRTSTE ; Yes - Create string entry +2536+ 1493 BA CP D ; Terminator D found? +2537+ 1494 CA 9B 14 JP Z,CRTSTE ; Yes - Create string entry +2538+ 1497 B8 CP B ; Terminator B found? +2539+ 1498 C2 8C 14 JP NZ,QTSTLP ; No - Keep looking +2540+ 149B FE 22 CRTSTE: CP '"' ; End with '"'? +2541+ 149D CC 81 0B CALL Z,GETCHR ; Yes - Get next character +2542+ 14A0 E3 EX (SP),HL ; Starting quote +2543+ 14A1 23 INC HL ; First byte of string +2544+ 14A2 EB EX DE,HL ; To DE +2545+ 14A3 79 LD A,C ; Get length +2546+ 14A4 CD 79 14 CALL CRTMST ; Create string entry +2547+ 14A7 11 6F 31 TSTOPL: LD DE,TMPSTR ; Temporary string +2548+ 14AA 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +2549+ 14AD 22 94 31 LD (FPREG),HL ; Save address of string ptr +2550+ 14B0 3E 01 LD A,1 +2551+ 14B2 32 5D 31 LD (TYPE),A ; Set type to string +2552+ 14B5 CD 2B 1A CALL DETHL4 ; Move string to pool +2553+ 14B8 CD F1 09 CALL CPDEHL ; Out of string pool? +2554+ 14BB 22 61 31 LD (TMSTPT),HL ; Save new pointer +2555+ 14BE E1 POP HL ; Restore code string address +2556+ 14BF 7E LD A,(HL) ; Get next code byte +2557+ 14C0 C0 RET NZ ; Return if pool OK +2558+ 14C1 1E 1E LD E,ST ; ?ST Error +2559+ 14C3 C3 3D 07 JP ERROR ; String pool overflow +2560+ 14C6 +2561+ 14C6 23 PRNUMS: INC HL ; Skip leading space +2562+ 14C7 CD 85 14 PRS: CALL CRTST ; Create string entry for it +2563+ 14CA CD 0A 16 PRS1: CALL GSTRCU ; Current string to pool +2564+ 14CD CD 1F 1A CALL LOADFP ; Move string block to BCDE +2565+ 14D0 1C INC E ; Length + 1 +2566+ 14D1 1D PRSLP: DEC E ; Count characters +2567+ 14D2 C8 RET Z ; End of string +2568+ 14D3 0A LD A,(BC) ; Get byte to output +2569+ 14D4 CD 02 0A CALL OUTC ; Output character in A +2570+ 14D7 FE 0D CP CR ; Return? +2571+ 14D9 CC 33 0E CALL Z,DONULL ; Yes - Do nulls +2572+ 14DC 03 INC BC ; Next byte in string +2573+ 14DD C3 D1 14 JP PRSLP ; More characters to output +2574+ 14E0 +2575+ 14E0 B7 TESTR: OR A ; Test if enough room +2576+ 14E1 0E .BYTE 0EH ; No garbage collection done +2577+ 14E2 F1 GRBDON: POP AF ; Garbage collection done +2578+ 14E3 F5 PUSH AF ; Save status +2579+ 14E4 2A 0A 31 LD HL,(STRSPC) ; Bottom of string space in use +2580+ 14E7 EB EX DE,HL ; To DE +2581+ 14E8 2A 73 31 LD HL,(STRBOT) ; Bottom of string area +2582+ 14EB 2F CPL ; Negate length (Top down) +2583+ 14EC 4F LD C,A ; -Length to BC +2584+ 14ED 06 FF LD B,-1 ; BC = -ve length of string +2585+ 14EF 09 ADD HL,BC ; Add to bottom of space in use +2586+ 14F0 23 INC HL ; Plus one for 2's complement +2587+ 14F1 CD F1 09 CALL CPDEHL ; Below string RAM area? +2588+ 14F4 DA FE 14 JP C,TESTOS ; Tidy up if not done else err +2589+ 14F7 22 73 31 LD (STRBOT),HL ; Save new bottom of area +2590+ 14FA 23 INC HL ; Point to first byte of string +2591+ 14FB EB EX DE,HL ; Address to DE +2592+ 14FC F1 POPAF: POP AF ; Throw away status push +2593+ 14FD C9 RET +2594+ 14FE +2595+ 14FE F1 TESTOS: POP AF ; Garbage collect been done? +2596+ 14FF 1E 1A LD E,OS ; ?OS Error +2597+ 1501 CA 3D 07 JP Z,ERROR ; Yes - Not enough string apace +2598+ 1504 BF CP A ; Flag garbage collect done +2599+ 1505 F5 PUSH AF ; Save status +2600+ 1506 01 E2 14 LD BC,GRBDON ; Garbage collection done +2601+ 1509 C5 PUSH BC ; Save for RETurn +2602+ 150A 2A 5F 31 GARBGE: LD HL,(LSTRAM) ; Get end of RAM pointer +2603+ 150D 22 73 31 GARBLP: LD (STRBOT),HL ; Reset string pointer +2604+ 1510 21 00 00 LD HL,0 +2605+ 1513 E5 PUSH HL ; Flag no string found +2606+ 1514 2A 0A 31 LD HL,(STRSPC) ; Get bottom of string space +2607+ 1517 E5 PUSH HL ; Save bottom of string space +2608+ 1518 21 63 31 LD HL,TMSTPL ; Temporary string pool +2609+ 151B EB GRBLP: EX DE,HL +2610+ 151C 2A 61 31 LD HL,(TMSTPT) ; Temporary string pool pointer +2611+ 151F EB EX DE,HL +2612+ 1520 CD F1 09 CALL CPDEHL ; Temporary string pool done? +2613+ 1523 01 1B 15 LD BC,GRBLP ; Loop until string pool done +2614+ 1526 C2 6F 15 JP NZ,STPOOL ; No - See if in string area +2615+ 1529 2A 86 31 LD HL,(PROGND) ; Start of simple variables +2616+ 152C EB SMPVAR: EX DE,HL +2617+ 152D 2A 88 31 LD HL,(VAREND) ; End of simple variables +2618+ 1530 EB EX DE,HL +2619+ 1531 CD F1 09 CALL CPDEHL ; All simple strings done? +2620+ 1534 CA 42 15 JP Z,ARRLP ; Yes - Do string arrays +2621+ 1537 7E LD A,(HL) ; Get type of variable +2622+ 1538 23 INC HL +2623+ 1539 23 INC HL +2624+ 153A B7 OR A ; "S" flag set if string +2625+ 153B CD 72 15 CALL STRADD ; See if string in string area +2626+ 153E C3 2C 15 JP SMPVAR ; Loop until simple ones done +2627+ 1541 +2628+ 1541 C1 GNXARY: POP BC ; Scrap address of this array +2629+ 1542 EB ARRLP: EX DE,HL +2630+ 1543 2A 8A 31 LD HL,(ARREND) ; End of string arrays +2631+ 1546 EB EX DE,HL +2632+ 1547 CD F1 09 CALL CPDEHL ; All string arrays done? +2633+ 154A CA 98 15 JP Z,SCNEND ; Yes - Move string if found +2634+ 154D CD 1F 1A CALL LOADFP ; Get array name to BCDE +2635+ 1550 7B LD A,E ; Get type of array +2636+ 1551 E5 PUSH HL ; Save address of num of dim'ns +2637+ 1552 09 ADD HL,BC ; Start of next array +2638+ 1553 B7 OR A ; Test type of array +2639+ 1554 F2 41 15 JP P,GNXARY ; Numeric array - Ignore it +2640+ 1557 22 75 31 LD (CUROPR),HL ; Save address of next array +2641+ 155A E1 POP HL ; Get address of num of dim'ns +2642+ 155B 4E LD C,(HL) ; BC = Number of dimensions +2643+ 155C 06 00 LD B,0 +2644+ 155E 09 ADD HL,BC ; Two bytes per dimension size +2645+ 155F 09 ADD HL,BC +2646+ 1560 23 INC HL ; Plus one for number of dim'ns +2647+ 1561 EB GRBARY: EX DE,HL +2648+ 1562 2A 75 31 LD HL,(CUROPR) ; Get address of next array +2649+ 1565 EB EX DE,HL +2650+ 1566 CD F1 09 CALL CPDEHL ; Is this array finished? +2651+ 1569 CA 42 15 JP Z,ARRLP ; Yes - Get next one +2652+ 156C 01 61 15 LD BC,GRBARY ; Loop until array all done +2653+ 156F C5 STPOOL: PUSH BC ; Save return address +2654+ 1570 F6 80 OR 80H ; Flag string type +2655+ 1572 7E STRADD: LD A,(HL) ; Get string length +2656+ 1573 23 INC HL +2657+ 1574 23 INC HL +2658+ 1575 5E LD E,(HL) ; Get LSB of string address +2659+ 1576 23 INC HL +2660+ 1577 56 LD D,(HL) ; Get MSB of string address +2661+ 1578 23 INC HL +2662+ 1579 F0 RET P ; Not a string - Return +2663+ 157A B7 OR A ; Set flags on string length +2664+ 157B C8 RET Z ; Null string - Return +2665+ 157C 44 LD B,H ; Save variable pointer +2666+ 157D 4D LD C,L +2667+ 157E 2A 73 31 LD HL,(STRBOT) ; Bottom of new area +2668+ 1581 CD F1 09 CALL CPDEHL ; String been done? +2669+ 1584 60 LD H,B ; Restore variable pointer +2670+ 1585 69 LD L,C +2671+ 1586 D8 RET C ; String done - Ignore +2672+ 1587 E1 POP HL ; Return address +2673+ 1588 E3 EX (SP),HL ; Lowest available string area +2674+ 1589 CD F1 09 CALL CPDEHL ; String within string area? +2675+ 158C E3 EX (SP),HL ; Lowest available string area +2676+ 158D E5 PUSH HL ; Re-save return address +2677+ 158E 60 LD H,B ; Restore variable pointer +2678+ 158F 69 LD L,C +2679+ 1590 D0 RET NC ; Outside string area - Ignore +2680+ 1591 C1 POP BC ; Get return , Throw 2 away +2681+ 1592 F1 POP AF ; +2682+ 1593 F1 POP AF ; +2683+ 1594 E5 PUSH HL ; Save variable pointer +2684+ 1595 D5 PUSH DE ; Save address of current +2685+ 1596 C5 PUSH BC ; Put back return address +2686+ 1597 C9 RET ; Go to it +2687+ 1598 +2688+ 1598 D1 SCNEND: POP DE ; Addresses of strings +2689+ 1599 E1 POP HL ; +2690+ 159A 7D LD A,L ; HL = 0 if no more to do +2691+ 159B B4 OR H +2692+ 159C C8 RET Z ; No more to do - Return +2693+ 159D 2B DEC HL +2694+ 159E 46 LD B,(HL) ; MSB of address of string +2695+ 159F 2B DEC HL +2696+ 15A0 4E LD C,(HL) ; LSB of address of string +2697+ 15A1 E5 PUSH HL ; Save variable address +2698+ 15A2 2B DEC HL +2699+ 15A3 2B DEC HL +2700+ 15A4 6E LD L,(HL) ; HL = Length of string +2701+ 15A5 26 00 LD H,0 +2702+ 15A7 09 ADD HL,BC ; Address of end of string+1 +2703+ 15A8 50 LD D,B ; String address to DE +2704+ 15A9 59 LD E,C +2705+ 15AA 2B DEC HL ; Last byte in string +2706+ 15AB 44 LD B,H ; Address to BC +2707+ 15AC 4D LD C,L +2708+ 15AD 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +2709+ 15B0 CD F8 06 CALL MOVSTR ; Move string to new address +2710+ 15B3 E1 POP HL ; Restore variable address +2711+ 15B4 71 LD (HL),C ; Save new LSB of address +2712+ 15B5 23 INC HL +2713+ 15B6 70 LD (HL),B ; Save new MSB of address +2714+ 15B7 69 LD L,C ; Next string area+1 to HL +2715+ 15B8 60 LD H,B +2716+ 15B9 2B DEC HL ; Next string area address +2717+ 15BA C3 0D 15 JP GARBLP ; Look for more strings +2718+ 15BD +2719+ 15BD C5 CONCAT: PUSH BC ; Save prec' opr & code string +2720+ 15BE E5 PUSH HL ; +2721+ 15BF 2A 94 31 LD HL,(FPREG) ; Get first string +2722+ 15C2 E3 EX (SP),HL ; Save first string +2723+ 15C3 CD 77 10 CALL OPRND ; Get second string +2724+ 15C6 E3 EX (SP),HL ; Restore first string +2725+ 15C7 CD F2 0F CALL TSTSTR ; Make sure it's a string +2726+ 15CA 7E LD A,(HL) ; Get length of second string +2727+ 15CB E5 PUSH HL ; Save first string +2728+ 15CC 2A 94 31 LD HL,(FPREG) ; Get second string +2729+ 15CF E5 PUSH HL ; Save second string +2730+ 15D0 86 ADD A,(HL) ; Add length of second string +2731+ 15D1 1E 1C LD E,LS ; ?LS Error +2732+ 15D3 DA 3D 07 JP C,ERROR ; String too long - Error +2733+ 15D6 CD 76 14 CALL MKTMST ; Make temporary string +2734+ 15D9 D1 POP DE ; Get second string to DE +2735+ 15DA CD 0E 16 CALL GSTRDE ; Move to string pool if needed +2736+ 15DD E3 EX (SP),HL ; Get first string +2737+ 15DE CD 0D 16 CALL GSTRHL ; Move to string pool if needed +2738+ 15E1 E5 PUSH HL ; Save first string +2739+ 15E2 2A 71 31 LD HL,(TMPSTR+2) ; Temporary string address +2740+ 15E5 EB EX DE,HL ; To DE +2741+ 15E6 CD F4 15 CALL SSTSA ; First string to string area +2742+ 15E9 CD F4 15 CALL SSTSA ; Second string to string area +2743+ 15EC 21 0C 10 LD HL,EVAL2 ; Return to evaluation loop +2744+ 15EF E3 EX (SP),HL ; Save return,get code string +2745+ 15F0 E5 PUSH HL ; Save code string address +2746+ 15F1 C3 A7 14 JP TSTOPL ; To temporary string to pool +2747+ 15F4 +2748+ 15F4 E1 SSTSA: POP HL ; Return address +2749+ 15F5 E3 EX (SP),HL ; Get string block,save return +2750+ 15F6 7E LD A,(HL) ; Get length of string +2751+ 15F7 23 INC HL +2752+ 15F8 23 INC HL +2753+ 15F9 4E LD C,(HL) ; Get LSB of string address +2754+ 15FA 23 INC HL +2755+ 15FB 46 LD B,(HL) ; Get MSB of string address +2756+ 15FC 6F LD L,A ; Length to L +2757+ 15FD 2C TOSTRA: INC L ; INC - DECed after +2758+ 15FE 2D TSALP: DEC L ; Count bytes moved +2759+ 15FF C8 RET Z ; End of string - Return +2760+ 1600 0A LD A,(BC) ; Get source +2761+ 1601 12 LD (DE),A ; Save destination +2762+ 1602 03 INC BC ; Next source +2763+ 1603 13 INC DE ; Next destination +2764+ 1604 C3 FE 15 JP TSALP ; Loop until string moved +2765+ 1607 +2766+ 1607 CD F2 0F GETSTR: CALL TSTSTR ; Make sure it's a string +2767+ 160A 2A 94 31 GSTRCU: LD HL,(FPREG) ; Get current string +2768+ 160D EB GSTRHL: EX DE,HL ; Save DE +2769+ 160E CD 28 16 GSTRDE: CALL BAKTMP ; Was it last tmp-str? +2770+ 1611 EB EX DE,HL ; Restore DE +2771+ 1612 C0 RET NZ ; No - Return +2772+ 1613 D5 PUSH DE ; Save string +2773+ 1614 50 LD D,B ; String block address to DE +2774+ 1615 59 LD E,C +2775+ 1616 1B DEC DE ; Point to length +2776+ 1617 4E LD C,(HL) ; Get string length +2777+ 1618 2A 73 31 LD HL,(STRBOT) ; Current bottom of string area +2778+ 161B CD F1 09 CALL CPDEHL ; Last one in string area? +2779+ 161E C2 26 16 JP NZ,POPHL ; No - Return +2780+ 1621 47 LD B,A ; Clear B (A=0) +2781+ 1622 09 ADD HL,BC ; Remove string from str' area +2782+ 1623 22 73 31 LD (STRBOT),HL ; Save new bottom of str' area +2783+ 1626 E1 POPHL: POP HL ; Restore string +2784+ 1627 C9 RET +2785+ 1628 +2786+ 1628 2A 61 31 BAKTMP: LD HL,(TMSTPT) ; Get temporary string pool top +2787+ 162B 2B DEC HL ; Back +2788+ 162C 46 LD B,(HL) ; Get MSB of address +2789+ 162D 2B DEC HL ; Back +2790+ 162E 4E LD C,(HL) ; Get LSB of address +2791+ 162F 2B DEC HL ; Back +2792+ 1630 2B DEC HL ; Back +2793+ 1631 CD F1 09 CALL CPDEHL ; String last in string pool? +2794+ 1634 C0 RET NZ ; Yes - Leave it +2795+ 1635 22 61 31 LD (TMSTPT),HL ; Save new string pool top +2796+ 1638 C9 RET +2797+ 1639 +2798+ 1639 01 B8 13 LEN: LD BC,PASSA ; To return integer A +2799+ 163C C5 PUSH BC ; Save address +2800+ 163D CD 07 16 GETLEN: CALL GETSTR ; Get string and its length +2801+ 1640 AF XOR A +2802+ 1641 57 LD D,A ; Clear D +2803+ 1642 32 5D 31 LD (TYPE),A ; Set type to numeric +2804+ 1645 7E LD A,(HL) ; Get length of string +2805+ 1646 B7 OR A ; Set status flags +2806+ 1647 C9 RET +2807+ 1648 +2808+ 1648 01 B8 13 ASC: LD BC,PASSA ; To return integer A +2809+ 164B C5 PUSH BC ; Save address +2810+ 164C CD 3D 16 GTFLNM: CALL GETLEN ; Get length of string +2811+ 164F CA 48 0C JP Z,FCERR ; Null string - Error +2812+ 1652 23 INC HL +2813+ 1653 23 INC HL +2814+ 1654 5E LD E,(HL) ; Get LSB of address +2815+ 1655 23 INC HL +2816+ 1656 56 LD D,(HL) ; Get MSB of address +2817+ 1657 1A LD A,(DE) ; Get first byte of string +2818+ 1658 C9 RET +2819+ 1659 +2820+ 1659 3E 01 CHR: LD A,1 ; One character string +2821+ 165B CD 76 14 CALL MKTMST ; Make a temporary string +2822+ 165E CD 52 17 CALL MAKINT ; Make it integer A +2823+ 1661 2A 71 31 LD HL,(TMPSTR+2) ; Get address of string +2824+ 1664 73 LD (HL),E ; Save character +2825+ 1665 C1 TOPOOL: POP BC ; Clean up stack +2826+ 1666 C3 A7 14 JP TSTOPL ; Temporary string to pool +2827+ 1669 +2828+ 1669 CD 02 17 LEFT: CALL LFRGNM ; Get number and ending ")" +2829+ 166C AF XOR A ; Start at first byte in string +2830+ 166D E3 RIGHT1: EX (SP),HL ; Save code string,Get string +2831+ 166E 4F LD C,A ; Starting position in string +2832+ 166F E5 MID1: PUSH HL ; Save string block address +2833+ 1670 7E LD A,(HL) ; Get length of string +2834+ 1671 B8 CP B ; Compare with number given +2835+ 1672 DA 77 16 JP C,ALLFOL ; All following bytes required +2836+ 1675 78 LD A,B ; Get new length +2837+ 1676 11 .BYTE 11H ; Skip "LD C,0" +2838+ 1677 0E 00 ALLFOL: LD C,0 ; First byte of string +2839+ 1679 C5 PUSH BC ; Save position in string +2840+ 167A CD E0 14 CALL TESTR ; See if enough string space +2841+ 167D C1 POP BC ; Get position in string +2842+ 167E E1 POP HL ; Restore string block address +2843+ 167F E5 PUSH HL ; And re-save it +2844+ 1680 23 INC HL +2845+ 1681 23 INC HL +2846+ 1682 46 LD B,(HL) ; Get LSB of address +2847+ 1683 23 INC HL +2848+ 1684 66 LD H,(HL) ; Get MSB of address +2849+ 1685 68 LD L,B ; HL = address of string +2850+ 1686 06 00 LD B,0 ; BC = starting address +2851+ 1688 09 ADD HL,BC ; Point to that byte +2852+ 1689 44 LD B,H ; BC = source string +2853+ 168A 4D LD C,L +2854+ 168B CD 79 14 CALL CRTMST ; Create a string entry +2855+ 168E 6F LD L,A ; Length of new string +2856+ 168F CD FD 15 CALL TOSTRA ; Move string to string area +2857+ 1692 D1 POP DE ; Clear stack +2858+ 1693 CD 0E 16 CALL GSTRDE ; Move to string pool if needed +2859+ 1696 C3 A7 14 JP TSTOPL ; Temporary string to pool +2860+ 1699 +2861+ 1699 CD 02 17 RIGHT: CALL LFRGNM ; Get number and ending ")" +2862+ 169C D1 POP DE ; Get string length +2863+ 169D D5 PUSH DE ; And re-save +2864+ 169E 1A LD A,(DE) ; Get length +2865+ 169F 90 SUB B ; Move back N bytes +2866+ 16A0 C3 6D 16 JP RIGHT1 ; Go and get sub-string +2867+ 16A3 +2868+ 16A3 EB MID: EX DE,HL ; Get code string address +2869+ 16A4 7E LD A,(HL) ; Get next byte ',' or ")" +2870+ 16A5 CD 07 17 CALL MIDNUM ; Get number supplied +2871+ 16A8 04 INC B ; Is it character zero? +2872+ 16A9 05 DEC B +2873+ 16AA CA 48 0C JP Z,FCERR ; Yes - Error +2874+ 16AD C5 PUSH BC ; Save starting position +2875+ 16AE 1E FF LD E,255 ; All of string +2876+ 16B0 FE 29 CP ')' ; Any length given? +2877+ 16B2 CA BC 16 JP Z,RSTSTR ; No - Rest of string +2878+ 16B5 CD F7 09 CALL CHKSYN ; Make sure ',' follows +2879+ 16B8 2C .BYTE ',' +2880+ 16B9 CD 4F 17 CALL GETINT ; Get integer 0-255 +2881+ 16BC CD F7 09 RSTSTR: CALL CHKSYN ; Make sure ")" follows +2882+ 16BF 29 .BYTE ")" +2883+ 16C0 F1 POP AF ; Restore starting position +2884+ 16C1 E3 EX (SP),HL ; Get string,8ave code string +2885+ 16C2 01 6F 16 LD BC,MID1 ; Continuation of MID$ routine +2886+ 16C5 C5 PUSH BC ; Save for return +2887+ 16C6 3D DEC A ; Starting position-1 +2888+ 16C7 BE CP (HL) ; Compare with length +2889+ 16C8 06 00 LD B,0 ; Zero bytes length +2890+ 16CA D0 RET NC ; Null string if start past end +2891+ 16CB 4F LD C,A ; Save starting position-1 +2892+ 16CC 7E LD A,(HL) ; Get length of string +2893+ 16CD 91 SUB C ; Subtract start +2894+ 16CE BB CP E ; Enough string for it? +2895+ 16CF 47 LD B,A ; Save maximum length available +2896+ 16D0 D8 RET C ; Truncate string if needed +2897+ 16D1 43 LD B,E ; Set specified length +2898+ 16D2 C9 RET ; Go and create string +2899+ 16D3 +2900+ 16D3 CD 3D 16 VAL: CALL GETLEN ; Get length of string +2901+ 16D6 CA F0 17 JP Z,RESZER ; Result zero +2902+ 16D9 5F LD E,A ; Save length +2903+ 16DA 23 INC HL +2904+ 16DB 23 INC HL +2905+ 16DC 7E LD A,(HL) ; Get LSB of address +2906+ 16DD 23 INC HL +2907+ 16DE 66 LD H,(HL) ; Get MSB of address +2908+ 16DF 6F LD L,A ; HL = String address +2909+ 16E0 E5 PUSH HL ; Save string address +2910+ 16E1 19 ADD HL,DE +2911+ 16E2 46 LD B,(HL) ; Get end of string+1 byte +2912+ 16E3 72 LD (HL),D ; Zero it to terminate +2913+ 16E4 E3 EX (SP),HL ; Save string end,get start +2914+ 16E5 C5 PUSH BC ; Save end+1 byte +2915+ 16E6 7E LD A,(HL) ; Get starting byte +2916+ 16E7 FE 24 CP '$' ; Hex number indicated? [function added] +2917+ 16E9 C2 F1 16 JP NZ,VAL1 +2918+ 16EC CD 1B 1F CALL HEXTFP ; Convert Hex to FPREG +2919+ 16EF 18 0D JR VAL3 +2920+ 16F1 FE 25 VAL1: CP '%' ; Binary number indicated? [function added] +2921+ 16F3 C2 FB 16 JP NZ,VAL2 +2922+ 16F6 CD 8B 1F CALL BINTFP ; Convert Bin to FPREG +2923+ 16F9 18 03 JR VAL3 +2924+ 16FB CD D7 1A VAL2: CALL ASCTFP ; Convert ASCII string to FP +2925+ 16FE C1 VAL3: POP BC ; Restore end+1 byte +2926+ 16FF E1 POP HL ; Restore end+1 address +2927+ 1700 70 LD (HL),B ; Put back original byte +2928+ 1701 C9 RET +2929+ 1702 +2930+ 1702 EB LFRGNM: EX DE,HL ; Code string address to HL +2931+ 1703 CD F7 09 CALL CHKSYN ; Make sure ")" follows +2932+ 1706 29 .BYTE ")" +2933+ 1707 C1 MIDNUM: POP BC ; Get return address +2934+ 1708 D1 POP DE ; Get number supplied +2935+ 1709 C5 PUSH BC ; Re-save return address +2936+ 170A 43 LD B,E ; Number to B +2937+ 170B C9 RET +2938+ 170C +2939+ 170C CD 52 17 INP: CALL MAKINT ; Make it integer A +2940+ 170F 32 EF 30 LD (INPORT),A ; Set input port +2941+ 1712 CD EE 30 CALL INPSUB ; Get input from port +2942+ 1715 C3 B8 13 JP PASSA ; Return integer A +2943+ 1718 +2944+ 1718 CD 3C 17 POUT: CALL SETIO ; Set up port number +2945+ 171B C3 B6 30 JP OUTSUB ; Output data and return +2946+ 171E +2947+ 171E CD 3C 17 WAIT: CALL SETIO ; Set up port number +2948+ 1721 F5 PUSH AF ; Save AND mask +2949+ 1722 1E 00 LD E,0 ; Assume zero if none given +2950+ 1724 2B DEC HL ; DEC 'cos GETCHR INCs +2951+ 1725 CD 81 0B CALL GETCHR ; Get next character +2952+ 1728 CA 32 17 JP Z,NOXOR ; No XOR byte given +2953+ 172B CD F7 09 CALL CHKSYN ; Make sure ',' follows +2954+ 172E 2C .BYTE ',' +2955+ 172F CD 4F 17 CALL GETINT ; Get integer 0-255 to XOR with +2956+ 1732 C1 NOXOR: POP BC ; Restore AND mask +2957+ 1733 CD EE 30 WAITLP: CALL INPSUB ; Get input +2958+ 1736 AB XOR E ; Flip selected bits +2959+ 1737 A0 AND B ; Result non-zero? +2960+ 1738 CA 33 17 JP Z,WAITLP ; No = keep waiting +2961+ 173B C9 RET +2962+ 173C +2963+ 173C CD 4F 17 SETIO: CALL GETINT ; Get integer 0-255 +2964+ 173F 32 EF 30 LD (INPORT),A ; Set input port +2965+ 1742 32 B7 30 LD (OTPORT),A ; Set output port +2966+ 1745 CD F7 09 CALL CHKSYN ; Make sure ',' follows +2967+ 1748 2C .BYTE ',' +2968+ 1749 C3 4F 17 JP GETINT ; Get integer 0-255 and return +2969+ 174C +2970+ 174C CD 81 0B FNDNUM: CALL GETCHR ; Get next character +2971+ 174F CD EE 0F GETINT: CALL GETNUM ; Get a number from 0 to 255 +2972+ 1752 CD 2D 0C MAKINT: CALL DEPINT ; Make sure value 0 - 255 +2973+ 1755 7A LD A,D ; Get MSB of number +2974+ 1756 B7 OR A ; Zero? +2975+ 1757 C2 48 0C JP NZ,FCERR ; No - Error +2976+ 175A 2B DEC HL ; DEC 'cos GETCHR INCs +2977+ 175B CD 81 0B CALL GETCHR ; Get next character +2978+ 175E 7B LD A,E ; Get number to A +2979+ 175F C9 RET +2980+ 1760 +2981+ 1760 CD 33 0C PEEK: CALL DEINT ; Get memory address +2982+ 1763 1A LD A,(DE) ; Get byte in memory +2983+ 1764 C3 B8 13 JP PASSA ; Return integer A +2984+ 1767 +2985+ 1767 CD EE 0F POKE: CALL GETNUM ; Get memory address +2986+ 176A CD 33 0C CALL DEINT ; Get integer -32768 to 3276 +2987+ 176D D5 PUSH DE ; Save memory address +2988+ 176E CD F7 09 CALL CHKSYN ; Make sure ',' follows +2989+ 1771 2C .BYTE ',' +2990+ 1772 CD 4F 17 CALL GETINT ; Get integer 0-255 +2991+ 1775 D1 POP DE ; Restore memory address +2992+ 1776 12 LD (DE),A ; Load it into memory +2993+ 1777 C9 RET +2994+ 1778 +2995+ 1778 21 4E 1C ROUND: LD HL,HALF ; Add 0.5 to FPREG +2996+ 177B CD 1F 1A ADDPHL: CALL LOADFP ; Load FP at (HL) to BCDE +2997+ 177E C3 8A 17 JP FPADD ; Add BCDE to FPREG +2998+ 1781 +2999+ 1781 CD 1F 1A SUBPHL: CALL LOADFP ; FPREG = -FPREG + number at HL +3000+ 1784 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3001+ 1785 C1 PSUB: POP BC ; Get FP number from stack +3002+ 1786 D1 POP DE +3003+ 1787 CD F9 19 SUBCDE: CALL INVSGN ; Negate FPREG +3004+ 178A 78 FPADD: LD A,B ; Get FP exponent +3005+ 178B B7 OR A ; Is number zero? +3006+ 178C C8 RET Z ; Yes - Nothing to add +3007+ 178D 3A 97 31 LD A,(FPEXP) ; Get FPREG exponent +3008+ 1790 B7 OR A ; Is this number zero? +3009+ 1791 CA 11 1A JP Z,FPBCDE ; Yes - Move BCDE to FPREG +3010+ 1794 90 SUB B ; BCDE number larger? +3011+ 1795 D2 A4 17 JP NC,NOSWAP ; No - Don't swap them +3012+ 1798 2F CPL ; Two's complement +3013+ 1799 3C INC A ; FP exponent +3014+ 179A EB EX DE,HL +3015+ 179B CD 01 1A CALL STAKFP ; Put FPREG on stack +3016+ 179E EB EX DE,HL +3017+ 179F CD 11 1A CALL FPBCDE ; Move BCDE to FPREG +3018+ 17A2 C1 POP BC ; Restore number from stack +3019+ 17A3 D1 POP DE +3020+ 17A4 FE 19 NOSWAP: CP 24+1 ; Second number insignificant? +3021+ 17A6 D0 RET NC ; Yes - First number is result +3022+ 17A7 F5 PUSH AF ; Save number of bits to scale +3023+ 17A8 CD 36 1A CALL SIGNS ; Set MSBs & sign of result +3024+ 17AB 67 LD H,A ; Save sign of result +3025+ 17AC F1 POP AF ; Restore scaling factor +3026+ 17AD CD 4F 18 CALL SCALE ; Scale BCDE to same exponent +3027+ 17B0 B4 OR H ; Result to be positive? +3028+ 17B1 21 94 31 LD HL,FPREG ; Point to FPREG +3029+ 17B4 F2 CA 17 JP P,MINCDE ; No - Subtract FPREG from CDE +3030+ 17B7 CD 2F 18 CALL PLUCDE ; Add FPREG to CDE +3031+ 17BA D2 10 18 JP NC,RONDUP ; No overflow - Round it up +3032+ 17BD 23 INC HL ; Point to exponent +3033+ 17BE 34 INC (HL) ; Increment it +3034+ 17BF CA 38 07 JP Z,OVERR ; Number overflowed - Error +3035+ 17C2 2E 01 LD L,1 ; 1 bit to shift right +3036+ 17C4 CD 65 18 CALL SHRT1 ; Shift result right +3037+ 17C7 C3 10 18 JP RONDUP ; Round it up +3038+ 17CA +3039+ 17CA AF MINCDE: XOR A ; Clear A and carry +3040+ 17CB 90 SUB B ; Negate exponent +3041+ 17CC 47 LD B,A ; Re-save exponent +3042+ 17CD 7E LD A,(HL) ; Get LSB of FPREG +3043+ 17CE 9B SBC A, E ; Subtract LSB of BCDE +3044+ 17CF 5F LD E,A ; Save LSB of BCDE +3045+ 17D0 23 INC HL +3046+ 17D1 7E LD A,(HL) ; Get NMSB of FPREG +3047+ 17D2 9A SBC A,D ; Subtract NMSB of BCDE +3048+ 17D3 57 LD D,A ; Save NMSB of BCDE +3049+ 17D4 23 INC HL +3050+ 17D5 7E LD A,(HL) ; Get MSB of FPREG +3051+ 17D6 99 SBC A,C ; Subtract MSB of BCDE +3052+ 17D7 4F LD C,A ; Save MSB of BCDE +3053+ 17D8 DC 3B 18 CONPOS: CALL C,COMPL ; Overflow - Make it positive +3054+ 17DB +3055+ 17DB 68 BNORM: LD L,B ; L = Exponent +3056+ 17DC 63 LD H,E ; H = LSB +3057+ 17DD AF XOR A +3058+ 17DE 47 BNRMLP: LD B,A ; Save bit count +3059+ 17DF 79 LD A,C ; Get MSB +3060+ 17E0 B7 OR A ; Is it zero? +3061+ 17E1 C2 FD 17 JP NZ,PNORM ; No - Do it bit at a time +3062+ 17E4 4A LD C,D ; MSB = NMSB +3063+ 17E5 54 LD D,H ; NMSB= LSB +3064+ 17E6 65 LD H,L ; LSB = VLSB +3065+ 17E7 6F LD L,A ; VLSB= 0 +3066+ 17E8 78 LD A,B ; Get exponent +3067+ 17E9 D6 08 SUB 8 ; Count 8 bits +3068+ 17EB FE E0 CP -24-8 ; Was number zero? +3069+ 17ED C2 DE 17 JP NZ,BNRMLP ; No - Keep normalising +3070+ 17F0 AF RESZER: XOR A ; Result is zero +3071+ 17F1 32 97 31 SAVEXP: LD (FPEXP),A ; Save result as zero +3072+ 17F4 C9 RET +3073+ 17F5 +3074+ 17F5 05 NORMAL: DEC B ; Count bits +3075+ 17F6 29 ADD HL,HL ; Shift HL left +3076+ 17F7 7A LD A,D ; Get NMSB +3077+ 17F8 17 RLA ; Shift left with last bit +3078+ 17F9 57 LD D,A ; Save NMSB +3079+ 17FA 79 LD A,C ; Get MSB +3080+ 17FB 8F ADC A,A ; Shift left with last bit +3081+ 17FC 4F LD C,A ; Save MSB +3082+ 17FD F2 F5 17 PNORM: JP P,NORMAL ; Not done - Keep going +3083+ 1800 78 LD A,B ; Number of bits shifted +3084+ 1801 5C LD E,H ; Save HL in EB +3085+ 1802 45 LD B,L +3086+ 1803 B7 OR A ; Any shifting done? +3087+ 1804 CA 10 18 JP Z,RONDUP ; No - Round it up +3088+ 1807 21 97 31 LD HL,FPEXP ; Point to exponent +3089+ 180A 86 ADD A,(HL) ; Add shifted bits +3090+ 180B 77 LD (HL),A ; Re-save exponent +3091+ 180C D2 F0 17 JP NC,RESZER ; Underflow - Result is zero +3092+ 180F C8 RET Z ; Result is zero +3093+ 1810 78 RONDUP: LD A,B ; Get VLSB of number +3094+ 1811 21 97 31 RONDB: LD HL,FPEXP ; Point to exponent +3095+ 1814 B7 OR A ; Any rounding? +3096+ 1815 FC 22 18 CALL M,FPROND ; Yes - Round number up +3097+ 1818 46 LD B,(HL) ; B = Exponent +3098+ 1819 23 INC HL +3099+ 181A 7E LD A,(HL) ; Get sign of result +3100+ 181B E6 80 AND 10000000B ; Only bit 7 needed +3101+ 181D A9 XOR C ; Set correct sign +3102+ 181E 4F LD C,A ; Save correct sign in number +3103+ 181F C3 11 1A JP FPBCDE ; Move BCDE to FPREG +3104+ 1822 +3105+ 1822 1C FPROND: INC E ; Round LSB +3106+ 1823 C0 RET NZ ; Return if ok +3107+ 1824 14 INC D ; Round NMSB +3108+ 1825 C0 RET NZ ; Return if ok +3109+ 1826 0C INC C ; Round MSB +3110+ 1827 C0 RET NZ ; Return if ok +3111+ 1828 0E 80 LD C,80H ; Set normal value +3112+ 182A 34 INC (HL) ; Increment exponent +3113+ 182B C0 RET NZ ; Return if ok +3114+ 182C C3 38 07 JP OVERR ; Overflow error +3115+ 182F +3116+ 182F 7E PLUCDE: LD A,(HL) ; Get LSB of FPREG +3117+ 1830 83 ADD A,E ; Add LSB of BCDE +3118+ 1831 5F LD E,A ; Save LSB of BCDE +3119+ 1832 23 INC HL +3120+ 1833 7E LD A,(HL) ; Get NMSB of FPREG +3121+ 1834 8A ADC A,D ; Add NMSB of BCDE +3122+ 1835 57 LD D,A ; Save NMSB of BCDE +3123+ 1836 23 INC HL +3124+ 1837 7E LD A,(HL) ; Get MSB of FPREG +3125+ 1838 89 ADC A,C ; Add MSB of BCDE +3126+ 1839 4F LD C,A ; Save MSB of BCDE +3127+ 183A C9 RET +3128+ 183B +3129+ 183B 21 98 31 COMPL: LD HL,SGNRES ; Sign of result +3130+ 183E 7E LD A,(HL) ; Get sign of result +3131+ 183F 2F CPL ; Negate it +3132+ 1840 77 LD (HL),A ; Put it back +3133+ 1841 AF XOR A +3134+ 1842 6F LD L,A ; Set L to zero +3135+ 1843 90 SUB B ; Negate exponent,set carry +3136+ 1844 47 LD B,A ; Re-save exponent +3137+ 1845 7D LD A,L ; Load zero +3138+ 1846 9B SBC A,E ; Negate LSB +3139+ 1847 5F LD E,A ; Re-save LSB +3140+ 1848 7D LD A,L ; Load zero +3141+ 1849 9A SBC A,D ; Negate NMSB +3142+ 184A 57 LD D,A ; Re-save NMSB +3143+ 184B 7D LD A,L ; Load zero +3144+ 184C 99 SBC A,C ; Negate MSB +3145+ 184D 4F LD C,A ; Re-save MSB +3146+ 184E C9 RET +3147+ 184F +3148+ 184F 06 00 SCALE: LD B,0 ; Clear underflow +3149+ 1851 D6 08 SCALLP: SUB 8 ; 8 bits (a whole byte)? +3150+ 1853 DA 5E 18 JP C,SHRITE ; No - Shift right A bits +3151+ 1856 43 LD B,E ; <- Shift +3152+ 1857 5A LD E,D ; <- right +3153+ 1858 51 LD D,C ; <- eight +3154+ 1859 0E 00 LD C,0 ; <- bits +3155+ 185B C3 51 18 JP SCALLP ; More bits to shift +3156+ 185E +3157+ 185E C6 09 SHRITE: ADD A,8+1 ; Adjust count +3158+ 1860 6F LD L,A ; Save bits to shift +3159+ 1861 AF SHRLP: XOR A ; Flag for all done +3160+ 1862 2D DEC L ; All shifting done? +3161+ 1863 C8 RET Z ; Yes - Return +3162+ 1864 79 LD A,C ; Get MSB +3163+ 1865 1F SHRT1: RRA ; Shift it right +3164+ 1866 4F LD C,A ; Re-save +3165+ 1867 7A LD A,D ; Get NMSB +3166+ 1868 1F RRA ; Shift right with last bit +3167+ 1869 57 LD D,A ; Re-save it +3168+ 186A 7B LD A,E ; Get LSB +3169+ 186B 1F RRA ; Shift right with last bit +3170+ 186C 5F LD E,A ; Re-save it +3171+ 186D 78 LD A,B ; Get underflow +3172+ 186E 1F RRA ; Shift right with last bit +3173+ 186F 47 LD B,A ; Re-save underflow +3174+ 1870 C3 61 18 JP SHRLP ; More bits to do +3175+ 1873 +3176+ 1873 00 00 00 81 UNITY: .BYTE 000H,000H,000H,081H ; 1.00000 +3177+ 1877 +3178+ 1877 03 LOGTAB: .BYTE 3 ; Table used by LOG +3179+ 1878 AA 56 19 80 .BYTE 0AAH,056H,019H,080H ; 0.59898 +3180+ 187C F1 22 76 80 .BYTE 0F1H,022H,076H,080H ; 0.96147 +3181+ 1880 45 AA 38 82 .BYTE 045H,0AAH,038H,082H ; 2.88539 +3182+ 1884 +3183+ 1884 CD D0 19 LOG: CALL TSTSGN ; Test sign of value +3184+ 1887 B7 OR A +3185+ 1888 EA 48 0C JP PE,FCERR ; ?FC Error if <= zero +3186+ 188B 21 97 31 LD HL,FPEXP ; Point to exponent +3187+ 188E 7E LD A,(HL) ; Get exponent +3188+ 188F 01 35 80 LD BC,8035H ; BCDE = SQR(1/2) +3189+ 1892 11 F3 04 LD DE,04F3H +3190+ 1895 90 SUB B ; Scale value to be < 1 +3191+ 1896 F5 PUSH AF ; Save scale factor +3192+ 1897 70 LD (HL),B ; Save new exponent +3193+ 1898 D5 PUSH DE ; Save SQR(1/2) +3194+ 1899 C5 PUSH BC +3195+ 189A CD 8A 17 CALL FPADD ; Add SQR(1/2) to value +3196+ 189D C1 POP BC ; Restore SQR(1/2) +3197+ 189E D1 POP DE +3198+ 189F 04 INC B ; Make it SQR(2) +3199+ 18A0 CD 26 19 CALL DVBCDE ; Divide by SQR(2) +3200+ 18A3 21 73 18 LD HL,UNITY ; Point to 1. +3201+ 18A6 CD 81 17 CALL SUBPHL ; Subtract FPREG from 1 +3202+ 18A9 21 77 18 LD HL,LOGTAB ; Coefficient table +3203+ 18AC CD 18 1D CALL SUMSER ; Evaluate sum of series +3204+ 18AF 01 80 80 LD BC,8080H ; BCDE = -0.5 +3205+ 18B2 11 00 00 LD DE,0000H +3206+ 18B5 CD 8A 17 CALL FPADD ; Subtract 0.5 from FPREG +3207+ 18B8 F1 POP AF ; Restore scale factor +3208+ 18B9 CD 4B 1B CALL RSCALE ; Re-scale number +3209+ 18BC 01 31 80 MULLN2: LD BC,8031H ; BCDE = Ln(2) +3210+ 18BF 11 18 72 LD DE,7218H +3211+ 18C2 21 .BYTE 21H ; Skip "POP BC" and "POP DE" +3212+ 18C3 +3213+ 18C3 C1 MULT: POP BC ; Get number from stack +3214+ 18C4 D1 POP DE +3215+ 18C5 CD D0 19 FPMULT: CALL TSTSGN ; Test sign of FPREG +3216+ 18C8 C8 RET Z ; Return zero if zero +3217+ 18C9 2E 00 LD L,0 ; Flag add exponents +3218+ 18CB CD 8E 19 CALL ADDEXP ; Add exponents +3219+ 18CE 79 LD A,C ; Get MSB of multiplier +3220+ 18CF 32 A6 31 LD (MULVAL),A ; Save MSB of multiplier +3221+ 18D2 EB EX DE,HL +3222+ 18D3 22 A7 31 LD (MULVAL+1),HL ; Save rest of multiplier +3223+ 18D6 01 00 00 LD BC,0 ; Partial product (BCDE) = zero +3224+ 18D9 50 LD D,B +3225+ 18DA 58 LD E,B +3226+ 18DB 21 DB 17 LD HL,BNORM ; Address of normalise +3227+ 18DE E5 PUSH HL ; Save for return +3228+ 18DF 21 E7 18 LD HL,MULT8 ; Address of 8 bit multiply +3229+ 18E2 E5 PUSH HL ; Save for NMSB,MSB +3230+ 18E3 E5 PUSH HL ; +3231+ 18E4 21 94 31 LD HL,FPREG ; Point to number +3232+ 18E7 7E MULT8: LD A,(HL) ; Get LSB of number +3233+ 18E8 23 INC HL ; Point to NMSB +3234+ 18E9 B7 OR A ; Test LSB +3235+ 18EA CA 13 19 JP Z,BYTSFT ; Zero - shift to next byte +3236+ 18ED E5 PUSH HL ; Save address of number +3237+ 18EE 2E 08 LD L,8 ; 8 bits to multiply by +3238+ 18F0 1F MUL8LP: RRA ; Shift LSB right +3239+ 18F1 67 LD H,A ; Save LSB +3240+ 18F2 79 LD A,C ; Get MSB +3241+ 18F3 D2 01 19 JP NC,NOMADD ; Bit was zero - Don't add +3242+ 18F6 E5 PUSH HL ; Save LSB and count +3243+ 18F7 2A A7 31 LD HL,(MULVAL+1) ; Get LSB and NMSB +3244+ 18FA 19 ADD HL,DE ; Add NMSB and LSB +3245+ 18FB EB EX DE,HL ; Leave sum in DE +3246+ 18FC E1 POP HL ; Restore MSB and count +3247+ 18FD 3A A6 31 LD A,(MULVAL) ; Get MSB of multiplier +3248+ 1900 89 ADC A,C ; Add MSB +3249+ 1901 1F NOMADD: RRA ; Shift MSB right +3250+ 1902 4F LD C,A ; Re-save MSB +3251+ 1903 7A LD A,D ; Get NMSB +3252+ 1904 1F RRA ; Shift NMSB right +3253+ 1905 57 LD D,A ; Re-save NMSB +3254+ 1906 7B LD A,E ; Get LSB +3255+ 1907 1F RRA ; Shift LSB right +3256+ 1908 5F LD E,A ; Re-save LSB +3257+ 1909 78 LD A,B ; Get VLSB +3258+ 190A 1F RRA ; Shift VLSB right +3259+ 190B 47 LD B,A ; Re-save VLSB +3260+ 190C 2D DEC L ; Count bits multiplied +3261+ 190D 7C LD A,H ; Get LSB of multiplier +3262+ 190E C2 F0 18 JP NZ,MUL8LP ; More - Do it +3263+ 1911 E1 POPHRT: POP HL ; Restore address of number +3264+ 1912 C9 RET +3265+ 1913 +3266+ 1913 43 BYTSFT: LD B,E ; Shift partial product left +3267+ 1914 5A LD E,D +3268+ 1915 51 LD D,C +3269+ 1916 4F LD C,A +3270+ 1917 C9 RET +3271+ 1918 +3272+ 1918 CD 01 1A DIV10: CALL STAKFP ; Save FPREG on stack +3273+ 191B 01 20 84 LD BC,8420H ; BCDE = 10. +3274+ 191E 11 00 00 LD DE,0000H +3275+ 1921 CD 11 1A CALL FPBCDE ; Move 10 to FPREG +3276+ 1924 +3277+ 1924 C1 DIV: POP BC ; Get number from stack +3278+ 1925 D1 POP DE +3279+ 1926 CD D0 19 DVBCDE: CALL TSTSGN ; Test sign of FPREG +3280+ 1929 CA 2C 07 JP Z,DZERR ; Error if division by zero +3281+ 192C 2E FF LD L,-1 ; Flag subtract exponents +3282+ 192E CD 8E 19 CALL ADDEXP ; Subtract exponents +3283+ 1931 34 INC (HL) ; Add 2 to exponent to adjust +3284+ 1932 34 INC (HL) +3285+ 1933 2B DEC HL ; Point to MSB +3286+ 1934 7E LD A,(HL) ; Get MSB of dividend +3287+ 1935 32 C2 30 LD (DIV3),A ; Save for subtraction +3288+ 1938 2B DEC HL +3289+ 1939 7E LD A,(HL) ; Get NMSB of dividend +3290+ 193A 32 BE 30 LD (DIV2),A ; Save for subtraction +3291+ 193D 2B DEC HL +3292+ 193E 7E LD A,(HL) ; Get MSB of dividend +3293+ 193F 32 BA 30 LD (DIV1),A ; Save for subtraction +3294+ 1942 41 LD B,C ; Get MSB +3295+ 1943 EB EX DE,HL ; NMSB,LSB to HL +3296+ 1944 AF XOR A +3297+ 1945 4F LD C,A ; Clear MSB of quotient +3298+ 1946 57 LD D,A ; Clear NMSB of quotient +3299+ 1947 5F LD E,A ; Clear LSB of quotient +3300+ 1948 32 C5 30 LD (DIV4),A ; Clear overflow count +3301+ 194B E5 DIVLP: PUSH HL ; Save divisor +3302+ 194C C5 PUSH BC +3303+ 194D 7D LD A,L ; Get LSB of number +3304+ 194E CD B9 30 CALL DIVSUP ; Subt' divisor from dividend +3305+ 1951 DE 00 SBC A,0 ; Count for overflows +3306+ 1953 3F CCF +3307+ 1954 D2 5E 19 JP NC,RESDIV ; Restore divisor if borrow +3308+ 1957 32 C5 30 LD (DIV4),A ; Re-save overflow count +3309+ 195A F1 POP AF ; Scrap divisor +3310+ 195B F1 POP AF +3311+ 195C 37 SCF ; Set carry to +3312+ 195D D2 .BYTE 0D2H ; Skip "POP BC" and "POP HL" +3313+ 195E +3314+ 195E C1 RESDIV: POP BC ; Restore divisor +3315+ 195F E1 POP HL +3316+ 1960 79 LD A,C ; Get MSB of quotient +3317+ 1961 3C INC A +3318+ 1962 3D DEC A +3319+ 1963 1F RRA ; Bit 0 to bit 7 +3320+ 1964 FA 11 18 JP M,RONDB ; Done - Normalise result +3321+ 1967 17 RLA ; Restore carry +3322+ 1968 7B LD A,E ; Get LSB of quotient +3323+ 1969 17 RLA ; Double it +3324+ 196A 5F LD E,A ; Put it back +3325+ 196B 7A LD A,D ; Get NMSB of quotient +3326+ 196C 17 RLA ; Double it +3327+ 196D 57 LD D,A ; Put it back +3328+ 196E 79 LD A,C ; Get MSB of quotient +3329+ 196F 17 RLA ; Double it +3330+ 1970 4F LD C,A ; Put it back +3331+ 1971 29 ADD HL,HL ; Double NMSB,LSB of divisor +3332+ 1972 78 LD A,B ; Get MSB of divisor +3333+ 1973 17 RLA ; Double it +3334+ 1974 47 LD B,A ; Put it back +3335+ 1975 3A C5 30 LD A,(DIV4) ; Get VLSB of quotient +3336+ 1978 17 RLA ; Double it +3337+ 1979 32 C5 30 LD (DIV4),A ; Put it back +3338+ 197C 79 LD A,C ; Get MSB of quotient +3339+ 197D B2 OR D ; Merge NMSB +3340+ 197E B3 OR E ; Merge LSB +3341+ 197F C2 4B 19 JP NZ,DIVLP ; Not done - Keep dividing +3342+ 1982 E5 PUSH HL ; Save divisor +3343+ 1983 21 97 31 LD HL,FPEXP ; Point to exponent +3344+ 1986 35 DEC (HL) ; Divide by 2 +3345+ 1987 E1 POP HL ; Restore divisor +3346+ 1988 C2 4B 19 JP NZ,DIVLP ; Ok - Keep going +3347+ 198B C3 38 07 JP OVERR ; Overflow error +3348+ 198E +3349+ 198E 78 ADDEXP: LD A,B ; Get exponent of dividend +3350+ 198F B7 OR A ; Test it +3351+ 1990 CA B2 19 JP Z,OVTST3 ; Zero - Result zero +3352+ 1993 7D LD A,L ; Get add/subtract flag +3353+ 1994 21 97 31 LD HL,FPEXP ; Point to exponent +3354+ 1997 AE XOR (HL) ; Add or subtract it +3355+ 1998 80 ADD A,B ; Add the other exponent +3356+ 1999 47 LD B,A ; Save new exponent +3357+ 199A 1F RRA ; Test exponent for overflow +3358+ 199B A8 XOR B +3359+ 199C 78 LD A,B ; Get exponent +3360+ 199D F2 B1 19 JP P,OVTST2 ; Positive - Test for overflow +3361+ 19A0 C6 80 ADD A,80H ; Add excess 128 +3362+ 19A2 77 LD (HL),A ; Save new exponent +3363+ 19A3 CA 11 19 JP Z,POPHRT ; Zero - Result zero +3364+ 19A6 CD 36 1A CALL SIGNS ; Set MSBs and sign of result +3365+ 19A9 77 LD (HL),A ; Save new exponent +3366+ 19AA 2B DEC HL ; Point to MSB +3367+ 19AB C9 RET +3368+ 19AC +3369+ 19AC CD D0 19 OVTST1: CALL TSTSGN ; Test sign of FPREG +3370+ 19AF 2F CPL ; Invert sign +3371+ 19B0 E1 POP HL ; Clean up stack +3372+ 19B1 B7 OVTST2: OR A ; Test if new exponent zero +3373+ 19B2 E1 OVTST3: POP HL ; Clear off return address +3374+ 19B3 F2 F0 17 JP P,RESZER ; Result zero +3375+ 19B6 C3 38 07 JP OVERR ; Overflow error +3376+ 19B9 +3377+ 19B9 CD 1C 1A MLSP10: CALL BCDEFP ; Move FPREG to BCDE +3378+ 19BC 78 LD A,B ; Get exponent +3379+ 19BD B7 OR A ; Is it zero? +3380+ 19BE C8 RET Z ; Yes - Result is zero +3381+ 19BF C6 02 ADD A,2 ; Multiply by 4 +3382+ 19C1 DA 38 07 JP C,OVERR ; Overflow - ?OV Error +3383+ 19C4 47 LD B,A ; Re-save exponent +3384+ 19C5 CD 8A 17 CALL FPADD ; Add BCDE to FPREG (Times 5) +3385+ 19C8 21 97 31 LD HL,FPEXP ; Point to exponent +3386+ 19CB 34 INC (HL) ; Double number (Times 10) +3387+ 19CC C0 RET NZ ; Ok - Return +3388+ 19CD C3 38 07 JP OVERR ; Overflow error +3389+ 19D0 +3390+ 19D0 3A 97 31 TSTSGN: LD A,(FPEXP) ; Get sign of FPREG +3391+ 19D3 B7 OR A +3392+ 19D4 C8 RET Z ; RETurn if number is zero +3393+ 19D5 3A 96 31 LD A,(FPREG+2) ; Get MSB of FPREG +3394+ 19D8 FE .BYTE 0FEH ; Test sign +3395+ 19D9 2F RETREL: CPL ; Invert sign +3396+ 19DA 17 RLA ; Sign bit to carry +3397+ 19DB 9F FLGDIF: SBC A,A ; Carry to all bits of A +3398+ 19DC C0 RET NZ ; Return -1 if negative +3399+ 19DD 3C INC A ; Bump to +1 +3400+ 19DE C9 RET ; Positive - Return +1 +3401+ 19DF +3402+ 19DF CD D0 19 SGN: CALL TSTSGN ; Test sign of FPREG +3403+ 19E2 06 88 FLGREL: LD B,80H+8 ; 8 bit integer in exponent +3404+ 19E4 11 00 00 LD DE,0 ; Zero NMSB and LSB +3405+ 19E7 21 97 31 RETINT: LD HL,FPEXP ; Point to exponent +3406+ 19EA 4F LD C,A ; CDE = MSB,NMSB and LSB +3407+ 19EB 70 LD (HL),B ; Save exponent +3408+ 19EC 06 00 LD B,0 ; CDE = integer to normalise +3409+ 19EE 23 INC HL ; Point to sign of result +3410+ 19EF 36 80 LD (HL),80H ; Set sign of result +3411+ 19F1 17 RLA ; Carry = sign of integer +3412+ 19F2 C3 D8 17 JP CONPOS ; Set sign of result +3413+ 19F5 +3414+ 19F5 CD D0 19 ABS: CALL TSTSGN ; Test sign of FPREG +3415+ 19F8 F0 RET P ; Return if positive +3416+ 19F9 21 96 31 INVSGN: LD HL,FPREG+2 ; Point to MSB +3417+ 19FC 7E LD A,(HL) ; Get sign of mantissa +3418+ 19FD EE 80 XOR 80H ; Invert sign of mantissa +3419+ 19FF 77 LD (HL),A ; Re-save sign of mantissa +3420+ 1A00 C9 RET +3421+ 1A01 +3422+ 1A01 EB STAKFP: EX DE,HL ; Save code string address +3423+ 1A02 2A 94 31 LD HL,(FPREG) ; LSB,NLSB of FPREG +3424+ 1A05 E3 EX (SP),HL ; Stack them,get return +3425+ 1A06 E5 PUSH HL ; Re-save return +3426+ 1A07 2A 96 31 LD HL,(FPREG+2) ; MSB and exponent of FPREG +3427+ 1A0A E3 EX (SP),HL ; Stack them,get return +3428+ 1A0B E5 PUSH HL ; Re-save return +3429+ 1A0C EB EX DE,HL ; Restore code string address +3430+ 1A0D C9 RET +3431+ 1A0E +3432+ 1A0E CD 1F 1A PHLTFP: CALL LOADFP ; Number at HL to BCDE +3433+ 1A11 EB FPBCDE: EX DE,HL ; Save code string address +3434+ 1A12 22 94 31 LD (FPREG),HL ; Save LSB,NLSB of number +3435+ 1A15 60 LD H,B ; Exponent of number +3436+ 1A16 69 LD L,C ; MSB of number +3437+ 1A17 22 96 31 LD (FPREG+2),HL ; Save MSB and exponent +3438+ 1A1A EB EX DE,HL ; Restore code string address +3439+ 1A1B C9 RET +3440+ 1A1C +3441+ 1A1C 21 94 31 BCDEFP: LD HL,FPREG ; Point to FPREG +3442+ 1A1F 5E LOADFP: LD E,(HL) ; Get LSB of number +3443+ 1A20 23 INC HL +3444+ 1A21 56 LD D,(HL) ; Get NMSB of number +3445+ 1A22 23 INC HL +3446+ 1A23 4E LD C,(HL) ; Get MSB of number +3447+ 1A24 23 INC HL +3448+ 1A25 46 LD B,(HL) ; Get exponent of number +3449+ 1A26 23 INCHL: INC HL ; Used for conditional "INC HL" +3450+ 1A27 C9 RET +3451+ 1A28 +3452+ 1A28 11 94 31 FPTHL: LD DE,FPREG ; Point to FPREG +3453+ 1A2B 06 04 DETHL4: LD B,4 ; 4 bytes to move +3454+ 1A2D 1A DETHLB: LD A,(DE) ; Get source +3455+ 1A2E 77 LD (HL),A ; Save destination +3456+ 1A2F 13 INC DE ; Next source +3457+ 1A30 23 INC HL ; Next destination +3458+ 1A31 05 DEC B ; Count bytes +3459+ 1A32 C2 2D 1A JP NZ,DETHLB ; Loop if more +3460+ 1A35 C9 RET +3461+ 1A36 +3462+ 1A36 21 96 31 SIGNS: LD HL,FPREG+2 ; Point to MSB of FPREG +3463+ 1A39 7E LD A,(HL) ; Get MSB +3464+ 1A3A 07 RLCA ; Old sign to carry +3465+ 1A3B 37 SCF ; Set MSBit +3466+ 1A3C 1F RRA ; Set MSBit of MSB +3467+ 1A3D 77 LD (HL),A ; Save new MSB +3468+ 1A3E 3F CCF ; Complement sign +3469+ 1A3F 1F RRA ; Old sign to carry +3470+ 1A40 23 INC HL +3471+ 1A41 23 INC HL +3472+ 1A42 77 LD (HL),A ; Set sign of result +3473+ 1A43 79 LD A,C ; Get MSB +3474+ 1A44 07 RLCA ; Old sign to carry +3475+ 1A45 37 SCF ; Set MSBit +3476+ 1A46 1F RRA ; Set MSBit of MSB +3477+ 1A47 4F LD C,A ; Save MSB +3478+ 1A48 1F RRA +3479+ 1A49 AE XOR (HL) ; New sign of result +3480+ 1A4A C9 RET +3481+ 1A4B +3482+ 1A4B 78 CMPNUM: LD A,B ; Get exponent of number +3483+ 1A4C B7 OR A +3484+ 1A4D CA D0 19 JP Z,TSTSGN ; Zero - Test sign of FPREG +3485+ 1A50 21 D9 19 LD HL,RETREL ; Return relation routine +3486+ 1A53 E5 PUSH HL ; Save for return +3487+ 1A54 CD D0 19 CALL TSTSGN ; Test sign of FPREG +3488+ 1A57 79 LD A,C ; Get MSB of number +3489+ 1A58 C8 RET Z ; FPREG zero - Number's MSB +3490+ 1A59 21 96 31 LD HL,FPREG+2 ; MSB of FPREG +3491+ 1A5C AE XOR (HL) ; Combine signs +3492+ 1A5D 79 LD A,C ; Get MSB of number +3493+ 1A5E F8 RET M ; Exit if signs different +3494+ 1A5F CD 65 1A CALL CMPFP ; Compare FP numbers +3495+ 1A62 1F RRA ; Get carry to sign +3496+ 1A63 A9 XOR C ; Combine with MSB of number +3497+ 1A64 C9 RET +3498+ 1A65 +3499+ 1A65 23 CMPFP: INC HL ; Point to exponent +3500+ 1A66 78 LD A,B ; Get exponent +3501+ 1A67 BE CP (HL) ; Compare exponents +3502+ 1A68 C0 RET NZ ; Different +3503+ 1A69 2B DEC HL ; Point to MBS +3504+ 1A6A 79 LD A,C ; Get MSB +3505+ 1A6B BE CP (HL) ; Compare MSBs +3506+ 1A6C C0 RET NZ ; Different +3507+ 1A6D 2B DEC HL ; Point to NMSB +3508+ 1A6E 7A LD A,D ; Get NMSB +3509+ 1A6F BE CP (HL) ; Compare NMSBs +3510+ 1A70 C0 RET NZ ; Different +3511+ 1A71 2B DEC HL ; Point to LSB +3512+ 1A72 7B LD A,E ; Get LSB +3513+ 1A73 96 SUB (HL) ; Compare LSBs +3514+ 1A74 C0 RET NZ ; Different +3515+ 1A75 E1 POP HL ; Drop RETurn +3516+ 1A76 E1 POP HL ; Drop another RETurn +3517+ 1A77 C9 RET +3518+ 1A78 +3519+ 1A78 47 FPINT: LD B,A ; <- Move +3520+ 1A79 4F LD C,A ; <- exponent +3521+ 1A7A 57 LD D,A ; <- to all +3522+ 1A7B 5F LD E,A ; <- bits +3523+ 1A7C B7 OR A ; Test exponent +3524+ 1A7D C8 RET Z ; Zero - Return zero +3525+ 1A7E E5 PUSH HL ; Save pointer to number +3526+ 1A7F CD 1C 1A CALL BCDEFP ; Move FPREG to BCDE +3527+ 1A82 CD 36 1A CALL SIGNS ; Set MSBs & sign of result +3528+ 1A85 AE XOR (HL) ; Combine with sign of FPREG +3529+ 1A86 67 LD H,A ; Save combined signs +3530+ 1A87 FC 9C 1A CALL M,DCBCDE ; Negative - Decrement BCDE +3531+ 1A8A 3E 98 LD A,80H+24 ; 24 bits +3532+ 1A8C 90 SUB B ; Bits to shift +3533+ 1A8D CD 4F 18 CALL SCALE ; Shift BCDE +3534+ 1A90 7C LD A,H ; Get combined sign +3535+ 1A91 17 RLA ; Sign to carry +3536+ 1A92 DC 22 18 CALL C,FPROND ; Negative - Round number up +3537+ 1A95 06 00 LD B,0 ; Zero exponent +3538+ 1A97 DC 3B 18 CALL C,COMPL ; If negative make positive +3539+ 1A9A E1 POP HL ; Restore pointer to number +3540+ 1A9B C9 RET +3541+ 1A9C +3542+ 1A9C 1B DCBCDE: DEC DE ; Decrement BCDE +3543+ 1A9D 7A LD A,D ; Test LSBs +3544+ 1A9E A3 AND E +3545+ 1A9F 3C INC A +3546+ 1AA0 C0 RET NZ ; Exit if LSBs not FFFF +3547+ 1AA1 0B DEC BC ; Decrement MSBs +3548+ 1AA2 C9 RET +3549+ 1AA3 +3550+ 1AA3 21 97 31 INT: LD HL,FPEXP ; Point to exponent +3551+ 1AA6 7E LD A,(HL) ; Get exponent +3552+ 1AA7 FE 98 CP 80H+24 ; Integer accuracy only? +3553+ 1AA9 3A 94 31 LD A,(FPREG) ; Get LSB +3554+ 1AAC D0 RET NC ; Yes - Already integer +3555+ 1AAD 7E LD A,(HL) ; Get exponent +3556+ 1AAE CD 78 1A CALL FPINT ; F.P to integer +3557+ 1AB1 36 98 LD (HL),80H+24 ; Save 24 bit integer +3558+ 1AB3 7B LD A,E ; Get LSB of number +3559+ 1AB4 F5 PUSH AF ; Save LSB +3560+ 1AB5 79 LD A,C ; Get MSB of number +3561+ 1AB6 17 RLA ; Sign to carry +3562+ 1AB7 CD D8 17 CALL CONPOS ; Set sign of result +3563+ 1ABA F1 POP AF ; Restore LSB of number +3564+ 1ABB C9 RET +3565+ 1ABC +3566+ 1ABC 21 00 00 MLDEBC: LD HL,0 ; Clear partial product +3567+ 1ABF 78 LD A,B ; Test multiplier +3568+ 1AC0 B1 OR C +3569+ 1AC1 C8 RET Z ; Return zero if zero +3570+ 1AC2 3E 10 LD A,16 ; 16 bits +3571+ 1AC4 29 MLDBLP: ADD HL,HL ; Shift P.P left +3572+ 1AC5 DA FC 12 JP C,BSERR ; ?BS Error if overflow +3573+ 1AC8 EB EX DE,HL +3574+ 1AC9 29 ADD HL,HL ; Shift multiplier left +3575+ 1ACA EB EX DE,HL +3576+ 1ACB D2 D2 1A JP NC,NOMLAD ; Bit was zero - No add +3577+ 1ACE 09 ADD HL,BC ; Add multiplicand +3578+ 1ACF DA FC 12 JP C,BSERR ; ?BS Error if overflow +3579+ 1AD2 3D NOMLAD: DEC A ; Count bits +3580+ 1AD3 C2 C4 1A JP NZ,MLDBLP ; More +3581+ 1AD6 C9 RET +3582+ 1AD7 +3583+ 1AD7 FE 2D ASCTFP: CP '-' ; Negative? +3584+ 1AD9 F5 PUSH AF ; Save it and flags +3585+ 1ADA CA E3 1A JP Z,CNVNUM ; Yes - Convert number +3586+ 1ADD FE 2B CP '+' ; Positive? +3587+ 1ADF CA E3 1A JP Z,CNVNUM ; Yes - Convert number +3588+ 1AE2 2B DEC HL ; DEC 'cos GETCHR INCs +3589+ 1AE3 CD F0 17 CNVNUM: CALL RESZER ; Set result to zero +3590+ 1AE6 47 LD B,A ; Digits after point counter +3591+ 1AE7 57 LD D,A ; Sign of exponent +3592+ 1AE8 5F LD E,A ; Exponent of ten +3593+ 1AE9 2F CPL +3594+ 1AEA 4F LD C,A ; Before or after point flag +3595+ 1AEB CD 81 0B MANLP: CALL GETCHR ; Get next character +3596+ 1AEE DA 34 1B JP C,ADDIG ; Digit - Add to number +3597+ 1AF1 FE 2E CP '.' +3598+ 1AF3 CA 0F 1B JP Z,DPOINT ; '.' - Flag point +3599+ 1AF6 FE 45 CP 'E' +3600+ 1AF8 C2 13 1B JP NZ,CONEXP ; Not 'E' - Scale number +3601+ 1AFB CD 81 0B CALL GETCHR ; Get next character +3602+ 1AFE CD 27 11 CALL SGNEXP ; Get sign of exponent +3603+ 1B01 CD 81 0B EXPLP: CALL GETCHR ; Get next character +3604+ 1B04 DA 56 1B JP C,EDIGIT ; Digit - Add to exponent +3605+ 1B07 14 INC D ; Is sign negative? +3606+ 1B08 C2 13 1B JP NZ,CONEXP ; No - Scale number +3607+ 1B0B AF XOR A +3608+ 1B0C 93 SUB E ; Negate exponent +3609+ 1B0D 5F LD E,A ; And re-save it +3610+ 1B0E 0C INC C ; Flag end of number +3611+ 1B0F 0C DPOINT: INC C ; Flag point passed +3612+ 1B10 CA EB 1A JP Z,MANLP ; Zero - Get another digit +3613+ 1B13 E5 CONEXP: PUSH HL ; Save code string address +3614+ 1B14 7B LD A,E ; Get exponent +3615+ 1B15 90 SUB B ; Subtract digits after point +3616+ 1B16 F4 2C 1B SCALMI: CALL P,SCALPL ; Positive - Multiply number +3617+ 1B19 F2 22 1B JP P,ENDCON ; Positive - All done +3618+ 1B1C F5 PUSH AF ; Save number of times to /10 +3619+ 1B1D CD 18 19 CALL DIV10 ; Divide by 10 +3620+ 1B20 F1 POP AF ; Restore count +3621+ 1B21 3C INC A ; Count divides +3622+ 1B22 +3623+ 1B22 C2 16 1B ENDCON: JP NZ,SCALMI ; More to do +3624+ 1B25 D1 POP DE ; Restore code string address +3625+ 1B26 F1 POP AF ; Restore sign of number +3626+ 1B27 CC F9 19 CALL Z,INVSGN ; Negative - Negate number +3627+ 1B2A EB EX DE,HL ; Code string address to HL +3628+ 1B2B C9 RET +3629+ 1B2C +3630+ 1B2C C8 SCALPL: RET Z ; Exit if no scaling needed +3631+ 1B2D F5 MULTEN: PUSH AF ; Save count +3632+ 1B2E CD B9 19 CALL MLSP10 ; Multiply number by 10 +3633+ 1B31 F1 POP AF ; Restore count +3634+ 1B32 3D DEC A ; Count multiplies +3635+ 1B33 C9 RET +3636+ 1B34 +3637+ 1B34 D5 ADDIG: PUSH DE ; Save sign of exponent +3638+ 1B35 57 LD D,A ; Save digit +3639+ 1B36 78 LD A,B ; Get digits after point +3640+ 1B37 89 ADC A,C ; Add one if after point +3641+ 1B38 47 LD B,A ; Re-save counter +3642+ 1B39 C5 PUSH BC ; Save point flags +3643+ 1B3A E5 PUSH HL ; Save code string address +3644+ 1B3B D5 PUSH DE ; Save digit +3645+ 1B3C CD B9 19 CALL MLSP10 ; Multiply number by 10 +3646+ 1B3F F1 POP AF ; Restore digit +3647+ 1B40 D6 30 SUB '0' ; Make it absolute +3648+ 1B42 CD 4B 1B CALL RSCALE ; Re-scale number +3649+ 1B45 E1 POP HL ; Restore code string address +3650+ 1B46 C1 POP BC ; Restore point flags +3651+ 1B47 D1 POP DE ; Restore sign of exponent +3652+ 1B48 C3 EB 1A JP MANLP ; Get another digit +3653+ 1B4B +3654+ 1B4B CD 01 1A RSCALE: CALL STAKFP ; Put number on stack +3655+ 1B4E CD E2 19 CALL FLGREL ; Digit to add to FPREG +3656+ 1B51 C1 PADD: POP BC ; Restore number +3657+ 1B52 D1 POP DE +3658+ 1B53 C3 8A 17 JP FPADD ; Add BCDE to FPREG and return +3659+ 1B56 +3660+ 1B56 7B EDIGIT: LD A,E ; Get digit +3661+ 1B57 07 RLCA ; Times 2 +3662+ 1B58 07 RLCA ; Times 4 +3663+ 1B59 83 ADD A,E ; Times 5 +3664+ 1B5A 07 RLCA ; Times 10 +3665+ 1B5B 86 ADD A,(HL) ; Add next digit +3666+ 1B5C D6 30 SUB '0' ; Make it absolute +3667+ 1B5E 5F LD E,A ; Save new digit +3668+ 1B5F C3 01 1B JP EXPLP ; Look for another digit +3669+ 1B62 +3670+ 1B62 E5 LINEIN: PUSH HL ; Save code string address +3671+ 1B63 21 C1 06 LD HL,INMSG ; Output " in " +3672+ 1B66 CD C7 14 CALL PRS ; Output string at HL +3673+ 1B69 E1 POP HL ; Restore code string address +3674+ 1B6A EB PRNTHL: EX DE,HL ; Code string address to DE +3675+ 1B6B AF XOR A +3676+ 1B6C 06 98 LD B,80H+24 ; 24 bits +3677+ 1B6E CD E7 19 CALL RETINT ; Return the integer +3678+ 1B71 21 C6 14 LD HL,PRNUMS ; Print number string +3679+ 1B74 E5 PUSH HL ; Save for return +3680+ 1B75 21 99 31 NUMASC: LD HL,PBUFF ; Convert number to ASCII +3681+ 1B78 E5 PUSH HL ; Save for return +3682+ 1B79 CD D0 19 CALL TSTSGN ; Test sign of FPREG +3683+ 1B7C 36 20 LD (HL),' ' ; Space at start +3684+ 1B7E F2 83 1B JP P,SPCFST ; Positive - Space to start +3685+ 1B81 36 2D LD (HL),'-' ; '-' sign at start +3686+ 1B83 23 SPCFST: INC HL ; First byte of number +3687+ 1B84 36 30 LD (HL),'0' ; '0' if zero +3688+ 1B86 CA 39 1C JP Z,JSTZER ; Return '0' if zero +3689+ 1B89 E5 PUSH HL ; Save buffer address +3690+ 1B8A FC F9 19 CALL M,INVSGN ; Negate FPREG if negative +3691+ 1B8D AF XOR A ; Zero A +3692+ 1B8E F5 PUSH AF ; Save it +3693+ 1B8F CD 3F 1C CALL RNGTST ; Test number is in range +3694+ 1B92 01 43 91 SIXDIG: LD BC,9143H ; BCDE - 99999.9 +3695+ 1B95 11 F8 4F LD DE,4FF8H +3696+ 1B98 CD 4B 1A CALL CMPNUM ; Compare numbers +3697+ 1B9B B7 OR A +3698+ 1B9C E2 B0 1B JP PO,INRNG ; > 99999.9 - Sort it out +3699+ 1B9F F1 POP AF ; Restore count +3700+ 1BA0 CD 2D 1B CALL MULTEN ; Multiply by ten +3701+ 1BA3 F5 PUSH AF ; Re-save count +3702+ 1BA4 C3 92 1B JP SIXDIG ; Test it again +3703+ 1BA7 +3704+ 1BA7 CD 18 19 GTSIXD: CALL DIV10 ; Divide by 10 +3705+ 1BAA F1 POP AF ; Get count +3706+ 1BAB 3C INC A ; Count divides +3707+ 1BAC F5 PUSH AF ; Re-save count +3708+ 1BAD CD 3F 1C CALL RNGTST ; Test number is in range +3709+ 1BB0 CD 78 17 INRNG: CALL ROUND ; Add 0.5 to FPREG +3710+ 1BB3 3C INC A +3711+ 1BB4 CD 78 1A CALL FPINT ; F.P to integer +3712+ 1BB7 CD 11 1A CALL FPBCDE ; Move BCDE to FPREG +3713+ 1BBA 01 06 03 LD BC,0306H ; 1E+06 to 1E-03 range +3714+ 1BBD F1 POP AF ; Restore count +3715+ 1BBE 81 ADD A,C ; 6 digits before point +3716+ 1BBF 3C INC A ; Add one +3717+ 1BC0 FA CC 1B JP M,MAKNUM ; Do it in 'E' form if < 1E-02 +3718+ 1BC3 FE 08 CP 6+1+1 ; More than 999999 ? +3719+ 1BC5 D2 CC 1B JP NC,MAKNUM ; Yes - Do it in 'E' form +3720+ 1BC8 3C INC A ; Adjust for exponent +3721+ 1BC9 47 LD B,A ; Exponent of number +3722+ 1BCA 3E 02 LD A,2 ; Make it zero after +3723+ 1BCC +3724+ 1BCC 3D MAKNUM: DEC A ; Adjust for digits to do +3725+ 1BCD 3D DEC A +3726+ 1BCE E1 POP HL ; Restore buffer address +3727+ 1BCF F5 PUSH AF ; Save count +3728+ 1BD0 11 52 1C LD DE,POWERS ; Powers of ten +3729+ 1BD3 05 DEC B ; Count digits before point +3730+ 1BD4 C2 DD 1B JP NZ,DIGTXT ; Not zero - Do number +3731+ 1BD7 36 2E LD (HL),'.' ; Save point +3732+ 1BD9 23 INC HL ; Move on +3733+ 1BDA 36 30 LD (HL),'0' ; Save zero +3734+ 1BDC 23 INC HL ; Move on +3735+ 1BDD 05 DIGTXT: DEC B ; Count digits before point +3736+ 1BDE 36 2E LD (HL),'.' ; Save point in case +3737+ 1BE0 CC 26 1A CALL Z,INCHL ; Last digit - move on +3738+ 1BE3 C5 PUSH BC ; Save digits before point +3739+ 1BE4 E5 PUSH HL ; Save buffer address +3740+ 1BE5 D5 PUSH DE ; Save powers of ten +3741+ 1BE6 CD 1C 1A CALL BCDEFP ; Move FPREG to BCDE +3742+ 1BE9 E1 POP HL ; Powers of ten table +3743+ 1BEA 06 2F LD B, '0'-1 ; ASCII '0' - 1 +3744+ 1BEC 04 TRYAGN: INC B ; Count subtractions +3745+ 1BED 7B LD A,E ; Get LSB +3746+ 1BEE 96 SUB (HL) ; Subtract LSB +3747+ 1BEF 5F LD E,A ; Save LSB +3748+ 1BF0 23 INC HL +3749+ 1BF1 7A LD A,D ; Get NMSB +3750+ 1BF2 9E SBC A,(HL) ; Subtract NMSB +3751+ 1BF3 57 LD D,A ; Save NMSB +3752+ 1BF4 23 INC HL +3753+ 1BF5 79 LD A,C ; Get MSB +3754+ 1BF6 9E SBC A,(HL) ; Subtract MSB +3755+ 1BF7 4F LD C,A ; Save MSB +3756+ 1BF8 2B DEC HL ; Point back to start +3757+ 1BF9 2B DEC HL +3758+ 1BFA D2 EC 1B JP NC,TRYAGN ; No overflow - Try again +3759+ 1BFD CD 2F 18 CALL PLUCDE ; Restore number +3760+ 1C00 23 INC HL ; Start of next number +3761+ 1C01 CD 11 1A CALL FPBCDE ; Move BCDE to FPREG +3762+ 1C04 EB EX DE,HL ; Save point in table +3763+ 1C05 E1 POP HL ; Restore buffer address +3764+ 1C06 70 LD (HL),B ; Save digit in buffer +3765+ 1C07 23 INC HL ; And move on +3766+ 1C08 C1 POP BC ; Restore digit count +3767+ 1C09 0D DEC C ; Count digits +3768+ 1C0A C2 DD 1B JP NZ,DIGTXT ; More - Do them +3769+ 1C0D 05 DEC B ; Any decimal part? +3770+ 1C0E CA 1D 1C JP Z,DOEBIT ; No - Do 'E' bit +3771+ 1C11 2B SUPTLZ: DEC HL ; Move back through buffer +3772+ 1C12 7E LD A,(HL) ; Get character +3773+ 1C13 FE 30 CP '0' ; '0' character? +3774+ 1C15 CA 11 1C JP Z,SUPTLZ ; Yes - Look back for more +3775+ 1C18 FE 2E CP '.' ; A decimal point? +3776+ 1C1A C4 26 1A CALL NZ,INCHL ; Move back over digit +3777+ 1C1D +3778+ 1C1D F1 DOEBIT: POP AF ; Get 'E' flag +3779+ 1C1E CA 3C 1C JP Z,NOENED ; No 'E' needed - End buffer +3780+ 1C21 36 45 LD (HL),'E' ; Put 'E' in buffer +3781+ 1C23 23 INC HL ; And move on +3782+ 1C24 36 2B LD (HL),'+' ; Put '+' in buffer +3783+ 1C26 F2 2D 1C JP P,OUTEXP ; Positive - Output exponent +3784+ 1C29 36 2D LD (HL),'-' ; Put '-' in buffer +3785+ 1C2B 2F CPL ; Negate exponent +3786+ 1C2C 3C INC A +3787+ 1C2D 06 2F OUTEXP: LD B,'0'-1 ; ASCII '0' - 1 +3788+ 1C2F 04 EXPTEN: INC B ; Count subtractions +3789+ 1C30 D6 0A SUB 10 ; Tens digit +3790+ 1C32 D2 2F 1C JP NC,EXPTEN ; More to do +3791+ 1C35 C6 3A ADD A,'0'+10 ; Restore and make ASCII +3792+ 1C37 23 INC HL ; Move on +3793+ 1C38 70 LD (HL),B ; Save MSB of exponent +3794+ 1C39 23 JSTZER: INC HL ; +3795+ 1C3A 77 LD (HL),A ; Save LSB of exponent +3796+ 1C3B 23 INC HL +3797+ 1C3C 71 NOENED: LD (HL),C ; Mark end of buffer +3798+ 1C3D E1 POP HL ; Restore code string address +3799+ 1C3E C9 RET +3800+ 1C3F +3801+ 1C3F 01 74 94 RNGTST: LD BC,9474H ; BCDE = 999999. +3802+ 1C42 11 F7 23 LD DE,23F7H +3803+ 1C45 CD 4B 1A CALL CMPNUM ; Compare numbers +3804+ 1C48 B7 OR A +3805+ 1C49 E1 POP HL ; Return address to HL +3806+ 1C4A E2 A7 1B JP PO,GTSIXD ; Too big - Divide by ten +3807+ 1C4D E9 JP (HL) ; Otherwise return to caller +3808+ 1C4E +3809+ 1C4E 00 00 00 80 HALF: .BYTE 00H,00H,00H,80H ; 0.5 +3810+ 1C52 +3811+ 1C52 A0 86 01 POWERS: .BYTE 0A0H,086H,001H ; 100000 +3812+ 1C55 10 27 00 .BYTE 010H,027H,000H ; 10000 +3813+ 1C58 E8 03 00 .BYTE 0E8H,003H,000H ; 1000 +3814+ 1C5B 64 00 00 .BYTE 064H,000H,000H ; 100 +3815+ 1C5E 0A 00 00 .BYTE 00AH,000H,000H ; 10 +3816+ 1C61 01 00 00 .BYTE 001H,000H,000H ; 1 +3817+ 1C64 +3818+ 1C64 21 F9 19 NEGAFT: LD HL,INVSGN ; Negate result +3819+ 1C67 E3 EX (SP),HL ; To be done after caller +3820+ 1C68 E9 JP (HL) ; Return to caller +3821+ 1C69 +3822+ 1C69 CD 01 1A SQR: CALL STAKFP ; Put value on stack +3823+ 1C6C 21 4E 1C LD HL,HALF ; Set power to 1/2 +3824+ 1C6F CD 0E 1A CALL PHLTFP ; Move 1/2 to FPREG +3825+ 1C72 +3826+ 1C72 C1 POWER: POP BC ; Get base +3827+ 1C73 D1 POP DE +3828+ 1C74 CD D0 19 CALL TSTSGN ; Test sign of power +3829+ 1C77 78 LD A,B ; Get exponent of base +3830+ 1C78 CA B7 1C JP Z,EXP ; Make result 1 if zero +3831+ 1C7B F2 82 1C JP P,POWER1 ; Positive base - Ok +3832+ 1C7E B7 OR A ; Zero to negative power? +3833+ 1C7F CA 2C 07 JP Z,DZERR ; Yes - ?/0 Error +3834+ 1C82 B7 POWER1: OR A ; Base zero? +3835+ 1C83 CA F1 17 JP Z,SAVEXP ; Yes - Return zero +3836+ 1C86 D5 PUSH DE ; Save base +3837+ 1C87 C5 PUSH BC +3838+ 1C88 79 LD A,C ; Get MSB of base +3839+ 1C89 F6 7F OR 01111111B ; Get sign status +3840+ 1C8B CD 1C 1A CALL BCDEFP ; Move power to BCDE +3841+ 1C8E F2 9F 1C JP P,POWER2 ; Positive base - Ok +3842+ 1C91 D5 PUSH DE ; Save power +3843+ 1C92 C5 PUSH BC +3844+ 1C93 CD A3 1A CALL INT ; Get integer of power +3845+ 1C96 C1 POP BC ; Restore power +3846+ 1C97 D1 POP DE +3847+ 1C98 F5 PUSH AF ; MSB of base +3848+ 1C99 CD 4B 1A CALL CMPNUM ; Power an integer? +3849+ 1C9C E1 POP HL ; Restore MSB of base +3850+ 1C9D 7C LD A,H ; but don't affect flags +3851+ 1C9E 1F RRA ; Exponent odd or even? +3852+ 1C9F E1 POWER2: POP HL ; Restore MSB and exponent +3853+ 1CA0 22 96 31 LD (FPREG+2),HL ; Save base in FPREG +3854+ 1CA3 E1 POP HL ; LSBs of base +3855+ 1CA4 22 94 31 LD (FPREG),HL ; Save in FPREG +3856+ 1CA7 DC 64 1C CALL C,NEGAFT ; Odd power - Negate result +3857+ 1CAA CC F9 19 CALL Z,INVSGN ; Negative base - Negate it +3858+ 1CAD D5 PUSH DE ; Save power +3859+ 1CAE C5 PUSH BC +3860+ 1CAF CD 84 18 CALL LOG ; Get LOG of base +3861+ 1CB2 C1 POP BC ; Restore power +3862+ 1CB3 D1 POP DE +3863+ 1CB4 CD C5 18 CALL FPMULT ; Multiply LOG by power +3864+ 1CB7 +3865+ 1CB7 CD 01 1A EXP: CALL STAKFP ; Put value on stack +3866+ 1CBA 01 38 81 LD BC,08138H ; BCDE = 1/Ln(2) +3867+ 1CBD 11 3B AA LD DE,0AA3BH +3868+ 1CC0 CD C5 18 CALL FPMULT ; Multiply value by 1/LN(2) +3869+ 1CC3 3A 97 31 LD A,(FPEXP) ; Get exponent +3870+ 1CC6 FE 88 CP 80H+8 ; Is it in range? +3871+ 1CC8 D2 AC 19 JP NC,OVTST1 ; No - Test for overflow +3872+ 1CCB CD A3 1A CALL INT ; Get INT of FPREG +3873+ 1CCE C6 80 ADD A,80H ; For excess 128 +3874+ 1CD0 C6 02 ADD A,2 ; Exponent > 126? +3875+ 1CD2 DA AC 19 JP C,OVTST1 ; Yes - Test for overflow +3876+ 1CD5 F5 PUSH AF ; Save scaling factor +3877+ 1CD6 21 73 18 LD HL,UNITY ; Point to 1. +3878+ 1CD9 CD 7B 17 CALL ADDPHL ; Add 1 to FPREG +3879+ 1CDC CD BC 18 CALL MULLN2 ; Multiply by LN(2) +3880+ 1CDF F1 POP AF ; Restore scaling factor +3881+ 1CE0 C1 POP BC ; Restore exponent +3882+ 1CE1 D1 POP DE +3883+ 1CE2 F5 PUSH AF ; Save scaling factor +3884+ 1CE3 CD 87 17 CALL SUBCDE ; Subtract exponent from FPREG +3885+ 1CE6 CD F9 19 CALL INVSGN ; Negate result +3886+ 1CE9 21 F7 1C LD HL,EXPTAB ; Coefficient table +3887+ 1CEC CD 27 1D CALL SMSER1 ; Sum the series +3888+ 1CEF 11 00 00 LD DE,0 ; Zero LSBs +3889+ 1CF2 C1 POP BC ; Scaling factor +3890+ 1CF3 4A LD C,D ; Zero MSB +3891+ 1CF4 C3 C5 18 JP FPMULT ; Scale result to correct value +3892+ 1CF7 +3893+ 1CF7 08 EXPTAB: .BYTE 8 ; Table used by EXP +3894+ 1CF8 40 2E 94 74 .BYTE 040H,02EH,094H,074H ; -1/7! (-1/5040) +3895+ 1CFC 70 4F 2E 77 .BYTE 070H,04FH,02EH,077H ; 1/6! ( 1/720) +3896+ 1D00 6E 02 88 7A .BYTE 06EH,002H,088H,07AH ; -1/5! (-1/120) +3897+ 1D04 E6 A0 2A 7C .BYTE 0E6H,0A0H,02AH,07CH ; 1/4! ( 1/24) +3898+ 1D08 50 AA AA 7E .BYTE 050H,0AAH,0AAH,07EH ; -1/3! (-1/6) +3899+ 1D0C FF FF 7F 7F .BYTE 0FFH,0FFH,07FH,07FH ; 1/2! ( 1/2) +3900+ 1D10 00 00 80 81 .BYTE 000H,000H,080H,081H ; -1/1! (-1/1) +3901+ 1D14 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/0! ( 1/1) +3902+ 1D18 +3903+ 1D18 CD 01 1A SUMSER: CALL STAKFP ; Put FPREG on stack +3904+ 1D1B 11 C3 18 LD DE,MULT ; Multiply by "X" +3905+ 1D1E D5 PUSH DE ; To be done after +3906+ 1D1F E5 PUSH HL ; Save address of table +3907+ 1D20 CD 1C 1A CALL BCDEFP ; Move FPREG to BCDE +3908+ 1D23 CD C5 18 CALL FPMULT ; Square the value +3909+ 1D26 E1 POP HL ; Restore address of table +3910+ 1D27 CD 01 1A SMSER1: CALL STAKFP ; Put value on stack +3911+ 1D2A 7E LD A,(HL) ; Get number of coefficients +3912+ 1D2B 23 INC HL ; Point to start of table +3913+ 1D2C CD 0E 1A CALL PHLTFP ; Move coefficient to FPREG +3914+ 1D2F 06 .BYTE 06H ; Skip "POP AF" +3915+ 1D30 F1 SUMLP: POP AF ; Restore count +3916+ 1D31 C1 POP BC ; Restore number +3917+ 1D32 D1 POP DE +3918+ 1D33 3D DEC A ; Cont coefficients +3919+ 1D34 C8 RET Z ; All done +3920+ 1D35 D5 PUSH DE ; Save number +3921+ 1D36 C5 PUSH BC +3922+ 1D37 F5 PUSH AF ; Save count +3923+ 1D38 E5 PUSH HL ; Save address in table +3924+ 1D39 CD C5 18 CALL FPMULT ; Multiply FPREG by BCDE +3925+ 1D3C E1 POP HL ; Restore address in table +3926+ 1D3D CD 1F 1A CALL LOADFP ; Number at HL to BCDE +3927+ 1D40 E5 PUSH HL ; Save address in table +3928+ 1D41 CD 8A 17 CALL FPADD ; Add coefficient to FPREG +3929+ 1D44 E1 POP HL ; Restore address in table +3930+ 1D45 C3 30 1D JP SUMLP ; More coefficients +3931+ 1D48 +3932+ 1D48 CD D0 19 RND: CALL TSTSGN ; Test sign of FPREG +3933+ 1D4B 21 C9 30 LD HL,SEED+2 ; Random number seed +3934+ 1D4E FA A9 1D JP M,RESEED ; Negative - Re-seed +3935+ 1D51 21 EA 30 LD HL,LSTRND ; Last random number +3936+ 1D54 CD 0E 1A CALL PHLTFP ; Move last RND to FPREG +3937+ 1D57 21 C9 30 LD HL,SEED+2 ; Random number seed +3938+ 1D5A C8 RET Z ; Return if RND(0) +3939+ 1D5B 86 ADD A,(HL) ; Add (SEED)+2) +3940+ 1D5C E6 07 AND 00000111B ; 0 to 7 +3941+ 1D5E 06 00 LD B,0 +3942+ 1D60 77 LD (HL),A ; Re-save seed +3943+ 1D61 23 INC HL ; Move to coefficient table +3944+ 1D62 87 ADD A,A ; 4 bytes +3945+ 1D63 87 ADD A,A ; per entry +3946+ 1D64 4F LD C,A ; BC = Offset into table +3947+ 1D65 09 ADD HL,BC ; Point to coefficient +3948+ 1D66 CD 1F 1A CALL LOADFP ; Coefficient to BCDE +3949+ 1D69 CD C5 18 CALL FPMULT ; ; Multiply FPREG by coefficient +3950+ 1D6C 3A C8 30 LD A,(SEED+1) ; Get (SEED+1) +3951+ 1D6F 3C INC A ; Add 1 +3952+ 1D70 E6 03 AND 00000011B ; 0 to 3 +3953+ 1D72 06 00 LD B,0 +3954+ 1D74 FE 01 CP 1 ; Is it zero? +3955+ 1D76 88 ADC A,B ; Yes - Make it 1 +3956+ 1D77 32 C8 30 LD (SEED+1),A ; Re-save seed +3957+ 1D7A 21 AD 1D LD HL,RNDTAB-4 ; Addition table +3958+ 1D7D 87 ADD A,A ; 4 bytes +3959+ 1D7E 87 ADD A,A ; per entry +3960+ 1D7F 4F LD C,A ; BC = Offset into table +3961+ 1D80 09 ADD HL,BC ; Point to value +3962+ 1D81 CD 7B 17 CALL ADDPHL ; Add value to FPREG +3963+ 1D84 CD 1C 1A RND1: CALL BCDEFP ; Move FPREG to BCDE +3964+ 1D87 7B LD A,E ; Get LSB +3965+ 1D88 59 LD E,C ; LSB = MSB +3966+ 1D89 EE 4F XOR 01001111B ; Fiddle around +3967+ 1D8B 4F LD C,A ; New MSB +3968+ 1D8C 36 80 LD (HL),80H ; Set exponent +3969+ 1D8E 2B DEC HL ; Point to MSB +3970+ 1D8F 46 LD B,(HL) ; Get MSB +3971+ 1D90 36 80 LD (HL),80H ; Make value -0.5 +3972+ 1D92 21 C7 30 LD HL,SEED ; Random number seed +3973+ 1D95 34 INC (HL) ; Count seed +3974+ 1D96 7E LD A,(HL) ; Get seed +3975+ 1D97 D6 AB SUB 171 ; Do it modulo 171 +3976+ 1D99 C2 A0 1D JP NZ,RND2 ; Non-zero - Ok +3977+ 1D9C 77 LD (HL),A ; Zero seed +3978+ 1D9D 0C INC C ; Fillde about +3979+ 1D9E 15 DEC D ; with the +3980+ 1D9F 1C INC E ; number +3981+ 1DA0 CD DB 17 RND2: CALL BNORM ; Normalise number +3982+ 1DA3 21 EA 30 LD HL,LSTRND ; Save random number +3983+ 1DA6 C3 28 1A JP FPTHL ; Move FPREG to last and return +3984+ 1DA9 +3985+ 1DA9 77 RESEED: LD (HL),A ; Re-seed random numbers +3986+ 1DAA 2B DEC HL +3987+ 1DAB 77 LD (HL),A +3988+ 1DAC 2B DEC HL +3989+ 1DAD 77 LD (HL),A +3990+ 1DAE C3 84 1D JP RND1 ; Return RND seed +3991+ 1DB1 +3992+ 1DB1 68 B1 46 68 RNDTAB: .BYTE 068H,0B1H,046H,068H ; Table used by RND +3993+ 1DB5 99 E9 92 69 .BYTE 099H,0E9H,092H,069H +3994+ 1DB9 10 D1 75 68 .BYTE 010H,0D1H,075H,068H +3995+ 1DBD +3996+ 1DBD 21 07 1E COS: LD HL,HALFPI ; Point to PI/2 +3997+ 1DC0 CD 7B 17 CALL ADDPHL ; Add it to PPREG +3998+ 1DC3 CD 01 1A SIN: CALL STAKFP ; Put angle on stack +3999+ 1DC6 01 49 83 LD BC,8349H ; BCDE = 2 PI +4000+ 1DC9 11 DB 0F LD DE,0FDBH +4001+ 1DCC CD 11 1A CALL FPBCDE ; Move 2 PI to FPREG +4002+ 1DCF C1 POP BC ; Restore angle +4003+ 1DD0 D1 POP DE +4004+ 1DD1 CD 26 19 CALL DVBCDE ; Divide angle by 2 PI +4005+ 1DD4 CD 01 1A CALL STAKFP ; Put it on stack +4006+ 1DD7 CD A3 1A CALL INT ; Get INT of result +4007+ 1DDA C1 POP BC ; Restore number +4008+ 1DDB D1 POP DE +4009+ 1DDC CD 87 17 CALL SUBCDE ; Make it 0 <= value < 1 +4010+ 1DDF 21 0B 1E LD HL,QUARTR ; Point to 0.25 +4011+ 1DE2 CD 81 17 CALL SUBPHL ; Subtract value from 0.25 +4012+ 1DE5 CD D0 19 CALL TSTSGN ; Test sign of value +4013+ 1DE8 37 SCF ; Flag positive +4014+ 1DE9 F2 F3 1D JP P,SIN1 ; Positive - Ok +4015+ 1DEC CD 78 17 CALL ROUND ; Add 0.5 to value +4016+ 1DEF CD D0 19 CALL TSTSGN ; Test sign of value +4017+ 1DF2 B7 OR A ; Flag negative +4018+ 1DF3 F5 SIN1: PUSH AF ; Save sign +4019+ 1DF4 F4 F9 19 CALL P,INVSGN ; Negate value if positive +4020+ 1DF7 21 0B 1E LD HL,QUARTR ; Point to 0.25 +4021+ 1DFA CD 7B 17 CALL ADDPHL ; Add 0.25 to value +4022+ 1DFD F1 POP AF ; Restore sign +4023+ 1DFE D4 F9 19 CALL NC,INVSGN ; Negative - Make positive +4024+ 1E01 21 0F 1E LD HL,SINTAB ; Coefficient table +4025+ 1E04 C3 18 1D JP SUMSER ; Evaluate sum of series +4026+ 1E07 +4027+ 1E07 DB 0F 49 81 HALFPI: .BYTE 0DBH,00FH,049H,081H ; 1.5708 (PI/2) +4028+ 1E0B +4029+ 1E0B 00 00 00 7F QUARTR: .BYTE 000H,000H,000H,07FH ; 0.25 +4030+ 1E0F +4031+ 1E0F 05 SINTAB: .BYTE 5 ; Table used by SIN +4032+ 1E10 BA D7 1E 86 .BYTE 0BAH,0D7H,01EH,086H ; 39.711 +4033+ 1E14 64 26 99 87 .BYTE 064H,026H,099H,087H ;-76.575 +4034+ 1E18 58 34 23 87 .BYTE 058H,034H,023H,087H ; 81.602 +4035+ 1E1C E0 5D A5 86 .BYTE 0E0H,05DH,0A5H,086H ;-41.342 +4036+ 1E20 DA 0F 49 83 .BYTE 0DAH,00FH,049H,083H ; 6.2832 +4037+ 1E24 +4038+ 1E24 CD 01 1A TAN: CALL STAKFP ; Put angle on stack +4039+ 1E27 CD C3 1D CALL SIN ; Get SIN of angle +4040+ 1E2A C1 POP BC ; Restore angle +4041+ 1E2B E1 POP HL +4042+ 1E2C CD 01 1A CALL STAKFP ; Save SIN of angle +4043+ 1E2F EB EX DE,HL ; BCDE = Angle +4044+ 1E30 CD 11 1A CALL FPBCDE ; Angle to FPREG +4045+ 1E33 CD BD 1D CALL COS ; Get COS of angle +4046+ 1E36 C3 24 19 JP DIV ; TAN = SIN / COS +4047+ 1E39 +4048+ 1E39 CD D0 19 ATN: CALL TSTSGN ; Test sign of value +4049+ 1E3C FC 64 1C CALL M,NEGAFT ; Negate result after if -ve +4050+ 1E3F FC F9 19 CALL M,INVSGN ; Negate value if -ve +4051+ 1E42 3A 97 31 LD A,(FPEXP) ; Get exponent +4052+ 1E45 FE 81 CP 81H ; Number less than 1? +4053+ 1E47 DA 56 1E JP C,ATN1 ; Yes - Get arc tangnt +4054+ 1E4A 01 00 81 LD BC,8100H ; BCDE = 1 +4055+ 1E4D 51 LD D,C +4056+ 1E4E 59 LD E,C +4057+ 1E4F CD 26 19 CALL DVBCDE ; Get reciprocal of number +4058+ 1E52 21 81 17 LD HL,SUBPHL ; Sub angle from PI/2 +4059+ 1E55 E5 PUSH HL ; Save for angle > 1 +4060+ 1E56 21 60 1E ATN1: LD HL,ATNTAB ; Coefficient table +4061+ 1E59 CD 18 1D CALL SUMSER ; Evaluate sum of series +4062+ 1E5C 21 07 1E LD HL,HALFPI ; PI/2 - angle in case > 1 +4063+ 1E5F C9 RET ; Number > 1 - Sub from PI/2 +4064+ 1E60 +4065+ 1E60 09 ATNTAB: .BYTE 9 ; Table used by ATN +4066+ 1E61 4A D7 3B 78 .BYTE 04AH,0D7H,03BH,078H ; 1/17 +4067+ 1E65 02 6E 84 7B .BYTE 002H,06EH,084H,07BH ;-1/15 +4068+ 1E69 FE C1 2F 7C .BYTE 0FEH,0C1H,02FH,07CH ; 1/13 +4069+ 1E6D 74 31 9A 7D .BYTE 074H,031H,09AH,07DH ;-1/11 +4070+ 1E71 84 3D 5A 7D .BYTE 084H,03DH,05AH,07DH ; 1/9 +4071+ 1E75 C8 7F 91 7E .BYTE 0C8H,07FH,091H,07EH ;-1/7 +4072+ 1E79 E4 BB 4C 7E .BYTE 0E4H,0BBH,04CH,07EH ; 1/5 +4073+ 1E7D 6C AA AA 7F .BYTE 06CH,0AAH,0AAH,07FH ;-1/3 +4074+ 1E81 00 00 00 81 .BYTE 000H,000H,000H,081H ; 1/1 +4075+ 1E85 +4076+ 1E85 +4077+ 1E85 C9 ARET: RET ; A RETurn instruction +4078+ 1E86 +4079+ 1E86 D7 GETINP: RST 10H ;input a character +4080+ 1E87 C9 RET +4081+ 1E88 +4082+ 1E88 CLS: +4083+ 1E88 3E 0C LD A,CS ; ASCII Clear screen +4084+ 1E8A C3 C2 1F JP MONOUT ; Output character +4085+ 1E8D +4086+ 1E8D CD 4F 17 WIDTH: CALL GETINT ; Get integer 0-255 +4087+ 1E90 7B LD A,E ; Width to A +4088+ 1E91 32 F2 30 LD (LWIDTH),A ; Set width +4089+ 1E94 C9 RET +4090+ 1E95 +4091+ 1E95 CD EE 0F LINES: CALL GETNUM ; Get a number +4092+ 1E98 CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +4093+ 1E9B ED 53 F6 30 LD (LINESC),DE ; Set lines counter +4094+ 1E9F ED 53 F8 30 LD (LINESN),DE ; Set lines number +4095+ 1EA3 C9 RET +4096+ 1EA4 +4097+ 1EA4 CD 33 0C DEEK: CALL DEINT ; Get integer -32768 to 32767 +4098+ 1EA7 D5 PUSH DE ; Save number +4099+ 1EA8 E1 POP HL ; Number to HL +4100+ 1EA9 46 LD B,(HL) ; Get LSB of contents +4101+ 1EAA 23 INC HL +4102+ 1EAB 7E LD A,(HL) ; Get MSB of contents +4103+ 1EAC C3 A9 13 JP ABPASS ; Return integer AB +4104+ 1EAF +4105+ 1EAF CD EE 0F DOKE: CALL GETNUM ; Get a number +4106+ 1EB2 CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +4107+ 1EB5 D5 PUSH DE ; Save address +4108+ 1EB6 CD F7 09 CALL CHKSYN ; Make sure ',' follows +4109+ 1EB9 2C .BYTE ',' +4110+ 1EBA CD EE 0F CALL GETNUM ; Get a number +4111+ 1EBD CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +4112+ 1EC0 E3 EX (SP),HL ; Save value,get address +4113+ 1EC1 73 LD (HL),E ; Save LSB of value +4114+ 1EC2 23 INC HL +4115+ 1EC3 72 LD (HL),D ; Save MSB of value +4116+ 1EC4 E1 POP HL ; Restore code string address +4117+ 1EC5 C9 RET +4118+ 1EC6 +4119+ 1EC6 +4120+ 1EC6 ; HEX$(nn) Convert 16 bit number to Hexadecimal string +4121+ 1EC6 +4122+ 1EC6 CD F1 0F HEX: CALL TSTNUM ; Verify it's a number +4123+ 1EC9 CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +4124+ 1ECC C5 PUSH BC ; Save contents of BC +4125+ 1ECD 21 99 31 LD HL,PBUFF +4126+ 1ED0 7A LD A,D ; Get high order into A +4127+ 1ED1 FE 00 CP $0 +4128+ 1ED3 28 0C JR Z,HEX2 ; Skip output if both high digits are zero +4129+ 1ED5 CD FE 1E CALL BYT2ASC ; Convert D to ASCII +4130+ 1ED8 78 LD A,B +4131+ 1ED9 FE 30 CP '0' +4132+ 1EDB 28 02 JR Z,HEX1 ; Don't store high digit if zero +4133+ 1EDD 70 LD (HL),B ; Store it to PBUFF +4134+ 1EDE 23 INC HL ; Next location +4135+ 1EDF 71 HEX1: LD (HL),C ; Store C to PBUFF+1 +4136+ 1EE0 23 INC HL ; Next location +4137+ 1EE1 7B HEX2: LD A,E ; Get lower byte +4138+ 1EE2 CD FE 1E CALL BYT2ASC ; Convert E to ASCII +4139+ 1EE5 7A LD A,D +4140+ 1EE6 FE 00 CP $0 +4141+ 1EE8 20 05 JR NZ,HEX3 ; If upper byte was not zero then always print lower byte +4142+ 1EEA 78 LD A,B +4143+ 1EEB FE 30 CP '0' ; If high digit of lower byte is zero then don't print +4144+ 1EED 28 02 JR Z,HEX4 +4145+ 1EEF 70 HEX3: LD (HL),B ; to PBUFF+2 +4146+ 1EF0 23 INC HL ; Next location +4147+ 1EF1 71 HEX4: LD (HL),C ; to PBUFF+3 +4148+ 1EF2 23 INC HL ; PBUFF+4 to zero +4149+ 1EF3 AF XOR A ; Terminating character +4150+ 1EF4 77 LD (HL),A ; Store zero to terminate +4151+ 1EF5 23 INC HL ; Make sure PBUFF is terminated +4152+ 1EF6 77 LD (HL),A ; Store the double zero there +4153+ 1EF7 C1 POP BC ; Get BC back +4154+ 1EF8 21 99 31 LD HL,PBUFF ; Reset to start of PBUFF +4155+ 1EFB C3 57 14 JP STR1 ; Convert the PBUFF to a string and return it +4156+ 1EFE +4157+ 1EFE 47 BYT2ASC LD B,A ; Save original value +4158+ 1EFF E6 0F AND $0F ; Strip off upper nybble +4159+ 1F01 FE 0A CP $0A ; 0-9? +4160+ 1F03 38 02 JR C,ADD30 ; If A-F, add 7 more +4161+ 1F05 C6 07 ADD A,$07 ; Bring value up to ASCII A-F +4162+ 1F07 C6 30 ADD30 ADD A,$30 ; And make ASCII +4163+ 1F09 4F LD C,A ; Save converted char to C +4164+ 1F0A 78 LD A,B ; Retrieve original value +4165+ 1F0B 0F RRCA ; and Rotate it right +4166+ 1F0C 0F RRCA +4167+ 1F0D 0F RRCA +4168+ 1F0E 0F RRCA +4169+ 1F0F E6 0F AND $0F ; Mask off upper nybble +4170+ 1F11 FE 0A CP $0A ; 0-9? < A hex? +4171+ 1F13 38 02 JR C,ADD301 ; Skip Add 7 +4172+ 1F15 C6 07 ADD A,$07 ; Bring it up to ASCII A-F +4173+ 1F17 C6 30 ADD301 ADD A,$30 ; And make it full ASCII +4174+ 1F19 47 LD B,A ; Store high order byte +4175+ 1F1A C9 RET +4176+ 1F1B +4177+ 1F1B ; Convert "&Hnnnn" to FPREG +4178+ 1F1B ; Gets a character from (HL) checks for Hexadecimal ASCII numbers "&Hnnnn" +4179+ 1F1B ; Char is in A, NC if char is ;<=>?@ A-z, CY is set if 0-9 +4180+ 1F1B EB HEXTFP EX DE,HL ; Move code string pointer to DE +4181+ 1F1C 21 00 00 LD HL,$0000 ; Zero out the value +4182+ 1F1F CD 34 1F CALL GETHEX ; Check the number for valid hex +4183+ 1F22 DA 54 1F JP C,HXERR ; First value wasn't hex, HX error +4184+ 1F25 18 05 JR HEXLP1 ; Convert first character +4185+ 1F27 CD 34 1F HEXLP CALL GETHEX ; Get second and addtional characters +4186+ 1F2A 38 1F JR C,HEXIT ; Exit if not a hex character +4187+ 1F2C 29 HEXLP1 ADD HL,HL ; Rotate 4 bits to the left +4188+ 1F2D 29 ADD HL,HL +4189+ 1F2E 29 ADD HL,HL +4190+ 1F2F 29 ADD HL,HL +4191+ 1F30 B5 OR L ; Add in D0-D3 into L +4192+ 1F31 6F LD L,A ; Save new value +4193+ 1F32 18 F3 JR HEXLP ; And continue until all hex characters are in +4194+ 1F34 +4195+ 1F34 13 GETHEX INC DE ; Next location +4196+ 1F35 1A LD A,(DE) ; Load character at pointer +4197+ 1F36 FE 20 CP ' ' +4198+ 1F38 CA 34 1F JP Z,GETHEX ; Skip spaces +4199+ 1F3B D6 30 SUB $30 ; Get absolute value +4200+ 1F3D D8 RET C ; < "0", error +4201+ 1F3E FE 0A CP $0A +4202+ 1F40 38 05 JR C,NOSUB7 ; Is already in the range 0-9 +4203+ 1F42 D6 07 SUB $07 ; Reduce to A-F +4204+ 1F44 FE 0A CP $0A ; Value should be $0A-$0F at this point +4205+ 1F46 D8 RET C ; CY set if was : ; < = > ? @ +4206+ 1F47 FE 10 NOSUB7 CP $10 ; > Greater than "F"? +4207+ 1F49 3F CCF +4208+ 1F4A C9 RET ; CY set if it wasn't valid hex +4209+ 1F4B +4210+ 1F4B EB HEXIT EX DE,HL ; Value into DE, Code string into HL +4211+ 1F4C 7A LD A,D ; Load DE into AC +4212+ 1F4D 4B LD C,E ; For prep to +4213+ 1F4E E5 PUSH HL +4214+ 1F4F CD A8 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4215+ 1F52 E1 POP HL +4216+ 1F53 C9 RET +4217+ 1F54 +4218+ 1F54 1E 26 HXERR: LD E,HX ; ?HEX Error +4219+ 1F56 C3 3D 07 JP ERROR +4220+ 1F59 +4221+ 1F59 ; BIN$(NN) Convert integer to a 1-16 char binary string +4222+ 1F59 CD F1 0F BIN: CALL TSTNUM ; Verify it's a number +4223+ 1F5C CD 33 0C CALL DEINT ; Get integer -32768 to 32767 +4224+ 1F5F C5 BIN2: PUSH BC ; Save contents of BC +4225+ 1F60 21 99 31 LD HL,PBUFF +4226+ 1F63 06 11 LD B,17 ; One higher than max char count +4227+ 1F65 ZEROSUP: ; Suppress leading zeros +4228+ 1F65 05 DEC B ; Max 16 chars +4229+ 1F66 78 LD A,B +4230+ 1F67 FE 01 CP $01 +4231+ 1F69 28 08 JR Z,BITOUT ; Always output at least one character +4232+ 1F6B CB 13 RL E +4233+ 1F6D CB 12 RL D +4234+ 1F6F 30 F4 JR NC,ZEROSUP +4235+ 1F71 18 04 JR BITOUT2 +4236+ 1F73 BITOUT: +4237+ 1F73 CB 13 RL E +4238+ 1F75 CB 12 RL D ; Top bit now in carry +4239+ 1F77 BITOUT2: +4240+ 1F77 3E 30 LD A,'0' ; Char for '0' +4241+ 1F79 CE 00 ADC A,0 ; If carry set then '0' --> '1' +4242+ 1F7B 77 LD (HL),A +4243+ 1F7C 23 INC HL +4244+ 1F7D 05 DEC B +4245+ 1F7E 20 F3 JR NZ,BITOUT +4246+ 1F80 AF XOR A ; Terminating character +4247+ 1F81 77 LD (HL),A ; Store zero to terminate +4248+ 1F82 23 INC HL ; Make sure PBUFF is terminated +4249+ 1F83 77 LD (HL),A ; Store the double zero there +4250+ 1F84 C1 POP BC +4251+ 1F85 21 99 31 LD HL,PBUFF +4252+ 1F88 C3 57 14 JP STR1 +4253+ 1F8B +4254+ 1F8B ; Convert "&Bnnnn" to FPREG +4255+ 1F8B ; Gets a character from (HL) checks for Binary ASCII numbers "&Bnnnn" +4256+ 1F8B EB BINTFP: EX DE,HL ; Move code string pointer to DE +4257+ 1F8C 21 00 00 LD HL,$0000 ; Zero out the value +4258+ 1F8F CD A8 1F CALL CHKBIN ; Check the number for valid bin +4259+ 1F92 DA B6 1F JP C,BINERR ; First value wasn't bin, HX error +4260+ 1F95 D6 30 BINIT: SUB '0' +4261+ 1F97 29 ADD HL,HL ; Rotate HL left +4262+ 1F98 B5 OR L +4263+ 1F99 6F LD L,A +4264+ 1F9A CD A8 1F CALL CHKBIN ; Get second and addtional characters +4265+ 1F9D 30 F6 JR NC,BINIT ; Process if a bin character +4266+ 1F9F EB EX DE,HL ; Value into DE, Code string into HL +4267+ 1FA0 7A LD A,D ; Load DE into AC +4268+ 1FA1 4B LD C,E ; For prep to +4269+ 1FA2 E5 PUSH HL +4270+ 1FA3 CD A8 13 CALL ACPASS ; ACPASS to set AC as integer into FPREG +4271+ 1FA6 E1 POP HL +4272+ 1FA7 C9 RET +4273+ 1FA8 +4274+ 1FA8 ; Char is in A, NC if char is 0 or 1 +4275+ 1FA8 13 CHKBIN: INC DE +4276+ 1FA9 1A LD A,(DE) +4277+ 1FAA FE 20 CP ' ' +4278+ 1FAC CA A8 1F JP Z,CHKBIN ; Skip spaces +4279+ 1FAF FE 30 CP '0' ; Set C if < '0' +4280+ 1FB1 D8 RET C +4281+ 1FB2 FE 32 CP '2' +4282+ 1FB4 3F CCF ; Set C if > '1' +4283+ 1FB5 C9 RET +4284+ 1FB6 +4285+ 1FB6 1E 28 BINERR: LD E,BN ; ?BIN Error +4286+ 1FB8 C3 3D 07 JP ERROR +4287+ 1FBB +4288+ 1FBB +4289+ 1FBB JJUMP1: +4290+ 1FBB DD 21 FF FF LD IX,-1 ; Flag cold start +4291+ 1FBF C3 8D 03 JP CSTART ; Go and initialise +4292+ 1FC2 +4293+ 1FC2 MONOUT: +4294+ 1FC2 C3 08 00 JP $0008 ; output a char +4295+ 1FC5 +4296+ 1FC5 +4297+ 1FC5 MONITR: +4298+ 1FC5 C3 00 00 JP $0000 ; Restart (Normally Monitor Start) +4299+ 1FC8 +4300+ 1FC8 +4301+ 1FC8 3E 00 INITST: LD A,0 ; Clear break flag +4302+ 1FCA 32 FD 30 LD (BRKFLG),A +4303+ 1FCD C3 94 03 JP INIT +4304+ 1FD0 +4305+ 1FD0 ED 45 ARETN: RETN ; Return from NMI +4306+ 1FD2 +4307+ 1FD2 +4308+ 1FD2 F5 TSTBIT: PUSH AF ; Save bit mask +4309+ 1FD3 A0 AND B ; Get common bits +4310+ 1FD4 C1 POP BC ; Restore bit mask +4311+ 1FD5 B8 CP B ; Same bit set? +4312+ 1FD6 3E 00 LD A,0 ; Return 0 in A +4313+ 1FD8 C9 RET +4314+ 1FD9 +4315+ 1FD9 CD 02 0A OUTNCR: CALL OUTC ; Output character in A +4316+ 1FDC C3 29 0E JP PRNTCRLF ; Output CRLF +4317+ 1FDF +0723 1FDF .end tasm: Number of errors = 0 diff --git a/build_id.v b/build_id.v index 077f20d..9eddd91 100644 --- a/build_id.v +++ b/build_id.v @@ -1 +1 @@ -`define BUILD_DATE "241216" \ No newline at end of file +`define BUILD_DATE "241217" \ No newline at end of file diff --git a/releases/MultiComp_20241217.rbf b/releases/MultiComp_20241217.rbf new file mode 100644 index 0000000000000000000000000000000000000000..6b7992ab1e75a1378a2b0a3db52c428400aaf7d6 GIT binary patch literal 3487956 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

{6AYpG(x~~a2X@X34sH%# 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 z zNQ3UMSMwL!)Lj!Q5@@JfD-Q7tq(+&pLdV#PX_CruV^FQ@FSd(Qe?4$z@8Prx^a_f_ zKHU5~Ceg9?@M=YR6kmYj*yr&p;IDOs;}lJ>S_3#v@qz{akQ@5%AK5B+I2@Pt>o3>e zrM$l%&xs}sdH!J+_iR4-`z?1To4L&bZSfrIEUE2_=jU&$7pZ<*j&fnaRrJeZsG}Nk zRDDQNoU$4`;Hsy_)~HS&%7wACo3zeYUOCt4xlY#=nJD(H)*2VWbGHixwPcQ4p3=A8 z^^TW*Sh74n#ghLiGc9S=#X$gvhl!y}o; z9NBf#eArCtAw-A5^^$cpTMrH#{?p z>Dc9aKkaBFkA;GFMt4^uMgFHKpitWGT+Obo7g?4!i`ggyOUnX_ONgzSMCIXWcdqWP zMl0FIjv-E(KU%Re!Xf;t)B4TZHkJ^M>ZAl*w{`RNYb?bi4quvJWAZwL_Wgcq==(hH zVyvDU19QaHu-MZQ4(jVz1J#MInHr@T3 zdw#g*jt_gJ#pHh1;D?LG4Isuy(Xd=1okbdv-Gn?7+vi;lJn5sRbJz((+}bH}Gde#{ zr5PGVXZK5QsZ-d0Lh&d~`eaon^phRVm117DbF-m?heXYeQKm_}Y-=>!#Wr`B-8Pl> zgQ{pq?D5!?ENo+>qjW!JY7COYXZGn26N78ugpH0^y>f zoX1?J5B1P3#L(yLCO*tvTZ(PrG1=026Z)L_+|q4VwxvA+rNNpp6x1mtYdJKGiXg4A zEJx*95%p8X6sWWfKz0(hsRZ~F`*McOw$;8tb?H`1CJ~{Qv|HSnAw=*KOz}#G^_WkG z4F|<8GJplE9NgfbFP&&cvZANctDIm@z9{7ImSEbcd&o4dv%BuF1s@80vygIlFcy$S z(R20MyW3lpO(Qp5-@{TNR24iNXp9e`yEpfp0OtoyR86nY=>j6GshjLHfd)g-j^%Fl z>KwAKG-rcB&0Px1O;81=P>u=I2ehsClNNk{)(m2o!YD_1m&EEEt)zreHJpT)4nbEL zF4UKsP=`#~tnp8B$JH$_P$Z-kQ0{W6Hv~;AIG+wA`+#5XA@cgHFHOU?2uh4BPDzC| z=phF!WW-%pE@<{NXA_$5A{2_8&2Zxkuh})=2X$G%QL<%;uu@0PdMb6!*q+=>ukAh!8+sHNHMu-^FqL3n}pOJ-xS@4>hjJPD^4#h z?cG9C-YqT+yjZ6IEz*#+Z~>hvjhIZUMw9Mkn~59F8D7GuDNoEC7$LNRuSw{SJE-z!J%Is{3qpCKl-m=LBUW@Q6Y?uG;pY{9MncXP0oYm z%|7AeCg`*$4LJkB>w!|IPA8|CpgdPH*`giM_;Yp+JX_U#0z49?YRyQNEroqoE_=C- zbO#R0@gsGr&!^<1uad$(T`M^cTgO#Yjr2cY73{yW)db{-jp8bBpYO*xWdTI=Qy{XaKdpX z?r8;~G8mr)AZvyc@CC~*%Es8RIT;G;d0Nz_v7U2ezbhg_LBnXxcQ98@*m|b`sUy~< zkj4t0y-GqZ5NZvzu^Lzkh5hfcA>TPDQZn!4yFwkMI z2DUL2YQAE9XMI-Q_3t0@4NIRS%{D3oywaBYP<(V7KV@uQM-LbaW7bD!kLcY`N6=y=7#ymxNANUswuEqU|ey3j7W!op{xOc!vJ@FPvLboT%!{m;vcY~x3vxW9 z1$;~iBJQvezOm%VMk&`Ab06ZB)0too*Z7OJkID&04QRWgRU|$khfyC3UeuZHY=od~ zkFA}No7G$NR4-X*v?I9y=4@%}yxo!yIBm155l1+5b8_Jx&+H5)miYk z1G%bpXk~Wo+U&v8>aYI$hYOCjf;(aaHmSX6gw;K~V++W$jp(pvPdh`NWRbO^X0hRA zafn%66v7oolld8Q+=Dr{FCoL6a1s^dU4>WMg*;M9lAaQVV(n2yO!YQf_u>M>>Tg)YN9etxDK;y1WXUuQ0I{;b6w4mdTxqknnTJ(QK^rF(Qs~=;5#!sMJ+1D>n597(&)Z&11#+*2kq}kV*6u)Y zo`Qy%{^1^#OFVW6E$aO`t%s`En3QV%6HZXb2uWC`iajJLPiY?WT`@ zPW?r=RFWV3@BYDx^8>k*{%%dP}%3kA&@KK|m z^2U+2dNbqPb(URhA8udUo|7&_lyKWhFdUHQ`SE#_2Hxtdj;p7urBfbgdaAJ$O`Op^ zc)8*Bk*Ftc%qP*gY05ViJ$Fd&egJ8-mt0?KLYE#dywYco93P5?wP|#g-t3^#C+BT6 z`$L^=^F|`)dK;JcxES(;BR)?=$o`^XdfxbyR}2iFSHR@jTroC;Ql8}5!I(WV=k4I* z^&G|-HEeSaKDu=O5qoSoaOI}qrGbZOoGUhxKGLF&P;F?eGPTAYN9lQ*8fIsO?r#|A z;4OCdj8lTEN11TGSlzm#eApcFrWQhu!S|bCXYb^^8#|wo&X5~fp3pm)jr8W2 zO|)PLYQ+%k)wSqz#HC4x>t0~Ns`{nbWaJqDw&@?BW83jg%90^1ygJ-R|C?u;N4}z6 z7^`@a*q9@A_uDb`lnx|7?U1FooR~*x5hE@RSZ-0@_Eh_+s?K#JiA>wI*zXSv|LAzB zY2jwOpo5BkRb8!*;8!gbLeK((%&gZ z*RtSA?JjC3p+UD+&=sAi$eB15S~i7PG)zSuCRbGhrZ_8o96I;JLw%*#}kj6brU z>+-13!zXQbh6K-dO104f7NKJok)pg#;dS#t(N`1yl2_~}^dLkeZ2ppkYA})TE?<6V z`y)4g?zL4PtYz#CZqGO|U*ie4b8#kAuynaJW&2c3g_+uXyUi0`Xc+am4h`82hlv$i zBt@#`V)nzeBviMlTXde0Y5yVbXjsg9X@=B$YauJ7#GcJ*lg+K_j}`Y@PJ1{4F-U)iPCmCN3}9 z@rql}$!ZZ+MVqo!f#OU>Zu|)e6vK&w6=*J&2mcPu(D773uh>AThLFX1+B^`1{Wzl_I1g0w3 z4t<&#bvPH^lBN4@3h6yv!GmI%dY{s~;>uwdVaoU>;D{G|n4KcVs&3fM1CdN_v7cZ@RJAF`U}5%~9>pva)S|YL zpJHOjjWVr4b;EN^l)VTrP3mB;6+4egn}ZIjrM6P-lm`kvxuhN5V`z;hbE<7PU7SGQ zmoyJ%dISxmqfVE*c?`#z-x-N_PlR)#D@KB>@98*WD*^YVkYmTZ9!D(0tiORdx>2VX zV7yoNl%0Y?FGa7qW9)kJQ8cKH3*mLHPQ?TYtFt*qU>yHI&1Y+OK zlg95B_J!1~)=oyY>9osD?trW7cKM$9qBTznuv0**c379lLh^>A?skza#r2!Q3a5^q zjipfW@2)lW2-!|-wYE55Xv!{3&D)laT5vCXQ!5)V1RXFI3mNVKFcz^;cLE%4){2Rp zuk`4q65W!C3^!S?FIlUQqA1a^TIIqrn1!jAbcyg~lI@VAd16Zkcgw9QG@~A3%=0Z_ z!l((e)gF(kVh>fTu#aq<#1{fv>kXu7k8uQXETQ;4`3@Ip1kUpv=s7FseU?3Jv?x79 z1@~(6a7T|;ayvQvqzE|r)WxS3LL`EIqd1z?L?+|Kjyj7|)P+4LjJCjBCBE%{{qTYR`wu5>{9q}=PR8VcCnZ9%%M1DgcI*Zq4RxS} zATjssn8;XSE3)<_2!jNBsQ!NHHLCtl)Z?7DsOX>&B}7HZ5)v-kmXYo+17Md**@k}K z8w#44Jj_}l*D-s+e8L2pqSRZ44Jx77@SN1cZPf+3IYeSkyFzE`k>X7F(1|+1G@tb3 zg9ShOazGUTCu5GG-C3&l?Bl}PjFe?#Xe#L{ptB==a$Fwoa4L1HTC{=|#s|hS!B#hr zMc8@SQ|tkT)B+k-VxE!zl;wbj4f_HhwbBSOI~dt!(gF!w@UcoRVT3reTc|D{rvQ0lPVeVveDZExBiG0fWiGX&qBy z8tPFM0r(YVB-p4A8ImtO!3{5_0#_uk3Fwf)#x#o_2eSq@aG$WIhl1es{qK)gUi=^M z2WpRLQE(jFGgO$}>di(rP8l!`z-NS)&-<-|sxPsseyKC4^7vx** z-2BiENy?F;_Z7xBbAPKGw?Q)?w60irDbzFvNN&I=DwOKd5N})Nx|PqzW`y@j7v^Ei z&h-&Hs(3Vtv)d1!yhKj~AULrI@|az1A!>CfF=6>uV5KRIdRc5%`$C+lg<6aCqUse) zz^XC%w93csOv8=K!grI#Z1M(^{lq#omS^FcjBr%rCXLIl5={BiE7oX2min9PZnzEn z=mt>>^G>TCQ%}qNAk|t4Ec0PeQv9hrsZ%_E4>EVd$d_?e(U@AYP5^>Foj1~y@YfxS zS^HR}572^TAmS28@%w`|Sf{AyWlnC}OA-v0q$~hrL3U_bECh$Y&xeTj3u=+trt;$|v~VsV#g; z7usnLHIY*I2O;SR(*yJp6L}*_0#+2h(xlXRi^%N)wz(EjwNGk(;sFt}vb>+QE&FOg zmVg)0z{!bk86~#Gfd^zavLnv4ZA_5TJ|tXiFrcPrJYcXrn=NHCq#OxM(k&eMxd_PiapmLm$T7w9iHvlvw@G+Vy zBJ{+%a72|v&4DS%u?)UR(xV=Fbak_cjQHtvL&EcLB zVhW%ec)mHtiB#vnR12~eK1Rc9>zLB6NWu75rK}W$Zw%~P<$_Ig*$gm27A_JTN*Ki}<%Ev0`n)F!O31*qrMEe6+&pDZJwPO9RQ!vFU(J3x=~+VmR`E zw8|c&&WgDK>>->?c)O+#2}zp3?uBOt^pXIfk=~wv@P$vW+Vq+0(}ro)qF4l;6$4l| zR0N`Dx>#dleoLywLEj}1x=V<}9Mo=$SPXoYn{rxkNG+hsHNDGIqCnVtX;|}f_J7hJy3`0ulo)&|p^g-Yujd6w*R{J`E zX$g9$hxrh;UDjf&uLH2SttSA+Ytn$QYe9T`AsSQzkCa{vFe5CCAxQ~k0udS$-xDVq zv zW?PzuZ{*MzIMpGlwZ)hEQNHFYjN%^kAgnx48v~xXkoI$q1KF|Zl1;r+A-s08LpTPG zRSv8vZ%i%bsALzEu;LzLP?fj`4qUu$F&HWmNm`T=9E}}4>>Laa!A!4&57H73 zbLS41G5Ojl5U2$x@WSN*1F}F41YIoN0fmBIC}fHfnhy+p15A0X&bHvVO=HcwJZaAo ztOv;$Xc$`5DbjicZm@vNSfJ{*E0ZY&bl$fH*0owg+?6R6r-&qk zbHT%{5Q-=c_Ri_mZrBD*L-;L-m#GQRF5BD%9W%wUOIE?xH7OL76pKh!w5DFA7RW4s z>{6Od__*&nu99_f7-vmg-rl?wvW??UtpRH7on#E6Vg*=bywGwQye=ENt6Pfq*D@n027%om9Q)cB0=jqG6k;;{Jj!Y!l1}sXLm7t90?i-3vd8X z;z75_*C!88OTNGwdA3?`SL1giycCtBAA9dT{2yDPMC~m{HDU6k{DhdQJGZdn2OLiaWz_crD+QAp`F_SqBY^HG%;TZ*2AzLfZqMXf}dCR@l&LnbTqX%fjkm(6-dC zONKycoe8TrztmH#kb?GbW0)w5Cg!{nG+-T;IqaG8R+-RyWMnK5bx0We6ffN{6u823 z!fY?g*kYO`)M;9%DY#IboU2VC54$Bqf~ITAr=TKgbupw#F>C}GOA%9&YT!s-{KmJJ zU)XeQ^>1ftZ^2_I2;-*2DIc1xASX0EM%khz(SoHoI1yBQyxMOL;OQs<@tCOdNC%&H z45=`T??&#mBU}YA90W#aQdZ&#^tdrMhuXQzyqq0g?P9rX>}AO-R4K-5TgdYv1Rh3aggv6wD1CGw@e34jy&;caqSP`` zPkANmHMTrEytM!!fTUkHAu!Wrxt3WaN%PX-0z-2Qa6e)S2yR74 zn7IPJdKJdXq?oQ*iC~yW;Rz+yq=hqnL6&T`4(6gHokFl)tb1lNKu6&$U?EJuvq~MAMm{nJG)eiB^P`k2&x_6P~#eo zQ3$*FgEc`xiNTqXkh3B7*e--aE6CwhIHR%3RUD56TsRWP2hK=R7!_K$9TRq#g{j7E zf#n73UYnZOjcNN7!E0n6`2?W-@?^{{Bm_w)AUd?2-;N*iyG5}r{h^Br7_Rbo+$wWDSL_=6AHtVept0? zGF4+6$IuOK4Ur&x=o3j*>5g_R_~eguUPr8OpIJTnP)M5pSN z?6_J2H?Brw_EC%MdH1*f@c!E$d!{xQcmNcL!3l%(FJZKV)uktiagziQ#aCig?B+2!0J)xzf z7@6b!kmOZmv`r3c1z0K!wWCe=K74o}V-|4w)&5nmAiyq?9dxDTCZjGOLY3-D#&wNe zr!-)?edq`u`Ir%gfp7yDJDdY640VnZMm7K9x%&_lK%UcOS7{xo)j1G;!#jCgM?aOweL*#Guhp{E|{R+)R>-0+bBp)`XqhH-S_pH8A zbS#VNy1A!b8Fr`6^Wmw&l73*=9EcW%`=*2F3e6WM?FY-WVS-oegnu$OKl|0;!==18 z>}{-{+}Kkk8$u84^D@q{r)S!R=>@?aC@1CqrZFL#?W29jJRT{F6~`LwSP^%4{lSHe zS=Xzd`ZWzjp9}HU+ehxO_L=1K;@!YGJ!_8-CJe5hJb8uIPhAPt+Fv*JywZ)h^LWSP zOyMv8pF{b^k)r58 zb}Yzd#4Po4`~@;B?&hg)Hnpc&!WngP-c+Wy}HuQr#D8Vesabe>>u`uocC zWZBwspI*FwYMb#y)1Jg>cBUfwEMyzjt6Q-!LiTyj!=iy+6YG|E9ed0zo(SB$aiM#7 zDiU=gtNtzDaFJxJ623OF%8${d2wyi(*V%{7@{z_p)ZgdM1sn8JU1!dx6eoD;aHP5z zf(N_UKo3|!3;U6&I8)v{JILtZ)~C*gtgB9hxfj?>Uqh9hKDIQDraFIbvL7zlzU(D6 z+A!wrWoJJA-P2e9_D2^!edCAn_S2QdzQ}no+(iyJ*?W1b6U6tjl}c#TSn2qsS?TC) z?sF=~V;?yYm>0b(XV?B~mbafgH=Mh`|6ur$XL}Mmw;cSZ)Rt4m9N9N$eZG1r!?LXB z;ag)}_QaWW#ble!@|{tV_b%{@M=B0|o9jQIw=!#^Q_6Kbcw)R`+`NFC^ZW1T_}A5OI)c_n1-S+Yh(ho1{O?>J8BO_6OJstheXkolOsK6IXC^TDIu z!-u`Zv6aIctDgrmEnhMwAMQQ=yt6i+JcsS@gOR@HS`Xa3=oN|cs7D{4i&hM;`0>%L za;U#=doE;l{KT_9&ibaTD`eeZci`>HEc1tj{#v~k4|2_X!fMibJ^M6ctsmnwasODW zJ!YIVM-y#V0_3hfa)y4>w4;v(;Ktb9A3ShVsluh#nvt0Md2h`rr}WU+5hSIYV*ej} z^?g|8)_}TU@h~fyZQlNLwKTdUj9l=g^8-u#Zexh_FFo0o2?gI<>`y)z@P7R@Ue&Eq ziVkW`X;NnML2QJV_D%NMRrcp*e>r|-iS`@8Um@O*n|P+{iI&0q&a;0X?LYt{#K#v; znFnamUi`xNy1{?J`{UUwv-DfI*gJcrnBDN?3+XMhyV}pDezQCD$=??3P3hn4-tpZKZ=WY8|+==W%`@;yLMSu;`W9kFAP31QMBcfa(lM|VDJt#7~lt-;nOo32#!UG0yiDv?iPELT%j@|{_ImyL_T%eZK{nu;Vb zfJk;z`Y+ht$k_;#=w#z3-@yQkmz-}$uGB{IlJjI_SI3pz4I9&+!Y^LXm+3#^rB~WR z8`Hb2|GJ2rul=U|(Ywxm{EEG!_LIEaK0A2#?ADiU{P;G0e0%QE^jD(4mpYhyG<}q; zx4+%?@pRu6EA?ah5Ig)w-S6gaVbkkk$u`PGE?|K@y zebB%!c2$0z+A?WiKu2)H@8k`P=m;kBVB*~dy1nge>avr*+uFY2tbTb87rP?w**iAk z;^t>JrIsdE!d)$;s5+ z)}0$(*!i2fRIE%a?uDn(jZbJ-B*^J(KP~awl6qfm`l>a=UZ&5bpVM z{!s0z9arp)?aoi1y^?I$kBgOWL24$xEmmgV!_RkxbMNsNQr`})F88XT?ZWz85f@*h+pJB+_m1!U8r^QZyc6U2v2!Bva_act zpR2#8OhmV8|>ef#wqL)l;0qG;&>;@^F#dXwg72{7I_L5BA7z#C~n%K6MI?%uWRF@O3 zIAP0e`U;pU)gj;esP0?-N4)ko4$pOwFRMj)o38IS+O4@R^NUVOf8ZQ>$rly62OX~* z@^XmGq}GYrci4{Y>>%xN_3(642=rPke%P0AU7R8HC_vXk9T-iVGbQBSocbiQ->|B> zaVH_W0%LK)b@dB8^pa<9DPAAf%YLHjhvog`#gHuyS+#-1JN^Bn*?Gwewy@11+WrZ5 zZiCOZ@pTzCB;u9BMbRB%(a^kwS&ffnm}G4X6>~;om9@E-DX|WC!}nwuX;f7ReF`p<6uAaWuVkWdju98nGndAb^F5=^e4nLuSkk7i7z2t3PztANRygwg3ma_BU| zfl^#1NnIrl1>Wc?F&F+%?O(t=Nd20kyW2^E^Ku3rYC`6*_^42#i%#4YK1z|?PIn+9 z$m{5-L#CU;hJ&J*S&zwM3urTpKC7W2!}kFJ;S=kR*V^4DAv&!hY=DkiaJlBO;kW#7DRVAMmVE$IxbmY2i6I zcqB;3@NcF4MxF1d4LlEcB`p%Xe3`R-F|KG@%dCeeumIJp;XM01Cee7U2veB?22rP{RU$B*;4{GyXSywL6o zx4ZgP^W4&iai%RkrXO~8f@yljs2-yuB6aks-J;iVsMA{9NFNEo=Zwp7D_u>d$VQTw zA&K@C!$yhgs}Hm!kkn zN=K^?h;2<%XNgb!5h{Plh<={Uvp)BHe%?9I)So|~PuMq|?slH>{Mj5I*Q-VMQhDCN zf+}l;pEwkZ8v?bQ`P9_Qm3e1vGC5LwnT^crnQAoGWk=QM{?2FfGyTr4j(KOhvty~Z zYiiW%Ntb8J_gP4k;+HbDv6l>|DySW`^7>F}kKg-2^?*x3%IuDb7bK0#0&Qtc4Z5Royky?+xOkY_4rb z<3NUwr=RHNlcaG(C?saPwt+#2BTmP2U2MBKpM><5l(9vBoUr68^OJ=2%~ONMDWf~c z0AUVqzVgkkAHM%P2frnMC|sS3NVebOJ?lo=7$mDgE}VEwtQ;9602)rDdn#0nITh9? z+edoXpHvsxdMo?e;ynB0q$4HeY_&umtJt|`_iyN(YtI(@c8lPV5GwbP7uT!zlhSci z%Vn#5yQ{oER7OFdkkZB7`KheqBwo&Et2|rIaWdX?fPSe7&aB?wKJGXj{zB74{t#<5 zhD$8}`fYQA0c@Cu9Q)KN~;aH_u)@%}Q^HtHPuUL5o&gHS1>XsR>w|A;}1Jfm*RA zGgy-_emc(*ltOFY(8Xqn`zrkglfP!X7@y}Ie!eS+w`4N0Rc1fjg+s;@p!gYhnfv&f z3F~NgU1&4>gs=9VUnjw9XdBcY}fzAV)*q4tF}KWDJXE|w-h!Q)hhY=Ql+ z-}+VG|61aE4qQhKq02Of+Pz2icx|h{lRNyHZN8Q@`@b1qsSc9;esAR<9W{oTK8dQc zMdQpOM5aCQC*o`X1-2nRWr0MX3j)@ zVr&EgH^|0QHa7qB=7D^DH>)YMp{_|@ykV0*9Bgcu8hL3kzxK}LV>N~5>)^Ho;{+XA z0JSv!K%ysr1Nfvl+R{O$GED=} zX`!0P?O5my0szvp9QRg?X9gP`)_#d(2#qUULFDPJvm%}8huBs6zAS%6r|XFv@5$WC zi^X(?b)PxsK3&`@uam1y893&n%sT4u$*#u34NrtbtCNb@X_o9}hZcw;{bh; zDb-%5zY-oXew1-$7)bV~SvUb4V#Oc}PH$yAHSO#?>8L1IN+xaRIB6UWA`myExcXJ} z?vszr5RohKys)9Vhuh5<(fS?F?+uc6mlI#pQf0Sl#bt-A#;Na^oz?xqxIO2`fM$4V zNinBJyd+wL?$nBMy*LMeAjAM{t>MZ1Ay_^xYGVw;VC7{&Zz4n2zoSCi<#f5LGL?0G zD6R4qr&^Gs%v0?o%22B$i83sF$;<$YTBg;gg$k~D!T|?*;yl||M)Jx8sDEcz8Gm;N z_#P4U6r=r|Gwe?@-e?+m2c>nXjv?cCdP+oAm5@E#JD1doXni}(?SaAY8fsl}z1TGPqPk#IsS41j9uF_CZH23axD9 zeS_7bl1=INDRG-22=lR5DdH#tRYQs^27CLn%e&sX@rR`kP113mmn=h*g89F?bIps7y=BVXt(e4bZGsTQm#M1lYw2&<_8*~wa zfq~3e2*4OE?H0T+O405#L;d?#1U1-mgqA%G0)RTM!J>J?{^n?YzEGi!=NSggQ901f z=`GDu*$OqCoea%jbF}E16*@kj$X8goQf<^g29aU0r|H4@3Td2UWgK@g-c4-+EI&Ke z@4$_ypFyXq+nhcVhnE*oZ=EA%_&B6sv~-q@(qSGSWX6o3$ddv2+?Jx+s1?(2O_15Z z=~8*G$x^H(UyP4BX$oOrW{~hZMo~3)o72d;9g<{Dw-bEa@2-sdk+q{^Sy22Q7vU@) zs1NF!GM(Z!ByDG^lpgnjQP)D>;RpS@ol{0*24YDE>Un4&EAHZ|h?ijnCA9j0$wjJh zKamk-vx47*kkaRi`-zz^dL2PU#8S~9BD?yVtHMXj0}J(Y!W3U{P|BGh`m3`ne2!I? zriBS@8nJeu#Tvqah$=Pezhmvx^kP+*WusPR-k8x5M?+TN9Hfs~i`0y*if2JzNfJIf zOvEn#P5zt5_T2Mf6#vEf=-+yeE$k&%=C}Sqkofn>^obv3L%+zdXI~?` zE7A4h4SjCsx@+_H;%&EYYcKuQ`Tg;q9~>J=Uvn-#VkWasZqk2o%c~RHo9W~Hav$kE zIoUXV>EQV8>g1(Inv##DUgFnY*|EXjl+G?i{&^|Yb+GiwhbJT7BRB7Ur0L8Ry6$=U zd&y1a==W#Y|9oum$)E8z9$MymGgo}}2Ti-Ljja1&_Uae6ZYXYIi+vB~i@zAPewttA z@0gA2r+!*_CAVq(joipTjN0!mxwqc)`^9^b8}s{(M=}Q=+B<*gTTfrwG&+eP^>&Gwm**o8H_{C9u)(#w4#hu-NZt#|fy-?Os#;7UJfrR^(|mucm#cl`XFcl38`zvGSS=qrEH z{doVM9nDmKNxoWf8qe!<&1)xaCXMg=p;y1|ADrL8#^=9x^?|E-p=k`xiHzu2k<`7g;vr&vrDv&qKZb`lHtz^U43r1jWCd zyXrJ0M{a+Kzh8D+5B=f2c)$N>=6&A>c~x7g__q_kn5jfJ9d@tqt&zPy@%KHmm%Zto z#hvoS19-cHVUohR4E-Nwx4#q2X1p4su% zzIE>}^sMju$#d_!o&8h0x<6I@!X1s7dk?VUGY{`?IP>ducWg3FF#DwYPDX4ywB0(t zHrR1SjCavV{mhlj9j)g6TyQfPAHHjE`bRqY4CCbQW8?J9f0_VE4zizx-gmbg{JWgl zb56g+cd&aW5*N*`{A;A^bksk4K0BApK6{X6#lZwL@B{v(Mt8I-8wX+QeTQY| z4$|G#iEOnzO65(4+?o-mocLjI7i7imEGc_!?Z?<(4e~DyR>$*GsfR@48K)6=<)NSz zo(1!G;+kj_r4@0-Xo6y0Kp1+b2FGvkUz-|=%bT|H?uUK6mooZ{o9x!0nRqf(9QAkmp)uOcitU-Epw(y`efoa?HV_>8FcST)e0)u!eZ=-h z?bT~_bihq?7sWs4HwN*Q(x^ALV6?NgQGeCi%+71Y#@hdl=d18HVsgaFe0tzhQ|Zr6 z9r;K<+a4^#-Dsj#G9L`oj6c7W=@UKq;4W=p0O`tg`Cv9TF`N5VOiQFlf-3PF;w_&V zWV4a;Tjyc?4OiFA2Y178G=jv_EX|6=bFAfv36EndzG+7(wyHSC_IL69a6%df2|Bhb zelo+@#M4U$y^4Dvbbzfltu9{-8E|W9^K)IzRigv`vKoJ&8o#lZB;1O62`OdF=&0l0dT8Nq%{@DU?EMq@ z^jIe?joPaKt*uS=JL{7#vBwS_o?F{i^v<%(F|T#Oj*94UQh&y|(}Wy$%m*#$r3X)p z=`3w7nBlw+n!Tbh8X45@xtbT~cQMR~=zv|3T6)mgFDhf5$?`9Z3Nu9MKK}q-??V7@ z&-;@l)WKAio51( z^}nSrajmEWKWYqWvZoJx3etD(p?UUY1l`T46G9f$3X1ZqYd##jnwxSDupPnLU|@Jp z5&%mn11mncQ%ew7&l2#I%?wf0asy;9GTMeSMJ_T3W#c z1PV>17;ufHkZp<@PFW2HSy5Cw^5_MNr0!%2+l*(0575+%4Ldcc5}0c2I#ju;zMNv! zlC6qHB>`&)DQ;LQaQy<4v(;h^RAoXs?&eYKCZT?fk5MMy+~nwW7Wue?Pqc-%xgxwh z$V3hS$K|%?0Z#>9?>ImO*R%kpL{3(>k31pdc@|em6R^cVZl|<>Hmwq?uo#nJ(Q7c( zz_*Z){YF;o!e1(W0b4aNcvM3Jks|<3koPH=EMjs!Jbd7__{az#)m0(rI1yrHxCs_Y z5#fOXz2xvdhnzsv0k1XlK71~Xz-g%Y9@0RjP6nlZF8IieiwPmeQY5SrV6K1g+%0dueGoZH*B?pS)4iMls`j+b z!@_dPYlsUk26Xc?dci_{`G@GYXE{>eutOQI5)TW~WMY9hG7`%$c0+8ziJJ^CDw2l= z^b%TH`Mpk(8W}Q2Yf$)19fPN(*o`w)q!b$*6w%dQCw9?K5jyRly$05^=xR2Q=DaoC zL{r5s9wc_KS&#br9AV4#<-8~w;5Px>oT2T6GWY_=1%*=x)$hlZ2plDSj@9$Bn~8vl zjK`IV4U?K-Rbt)6ATsQ`_H0pk!bCo3Z86~mD6{G`^JA6+pUoQ*uIE$wgb7W?MS8Ok zp6^o1?7#{uvvCuYU!t&v7g&XHoCExIwv2!P>hodqXRw(2jh&2>If6uZBOHxwmLWyM!fg7+STJ%>ALbcq?ct%BjP{$oYJqE-FxXE-%Y+h(@Tz%F9=ZCUVWC7 zI!`_~GI6@S{PZ)8{4MJz$;9$jw#;((93Ib*-h6-i_D4X^O9lai_NDalh`!85+3?01 zFx9ZJjJ5f?-oJFmUe`KL$6uUYuGx4Pj`^AIRN&Z3?kg-?+zTf z#W~29i+tH%5pDPAym>BoGLpuD@~Qcy{l>klv{KAuDpXB!S|jlWqu z-F)vudy{!G&|`H4#reMIqdI_O|BIva4!?iqGXS&y5wKSAFOH^@<@DgcjeLW?boAG4 zhFEJ)ykX4;cZi2NXJ#w(g%tV9mNVzr&&2zd{(wVA`S<^S;@&?#ZtBbzmQ=xK%ChgB zk!445hGZnmjyyO&Yl6$tGLkhDdEz*+vBT8OCbrjsS#NHDY@l8~-0tXDGnOY#oTR2r ze|sk5FgSrUG@-Ohx3O_ruV0n|H&9+~-z5%)X0vP?XhL&CTi)*(+adhA`{R#ym5il1 z(n#k#dVW9WJkLZqn`9sMf3NaW-~7C~TR0&YH){m`tuFWb&Z*ebV+~6Bg5x_pUKGK+ z9WAn={?=~mjC8^JtpBO{*WAvg!xz*WYT<3}>>UgX8*{ryOW$_>;ahJ@=CW^b-@S8I zk^jR?z^-sAw)F~kNuBx0C?uz6F%&uJe zg5gX5-tZBVq~L5#eN{_AwR}7d&)GpsQG27aZvB$TkL)Snw0%y_xFs2D1BfBL!`+hG zT>{MBq^*-P<>52db|Iso+r3COI3E4BSaC@c`={l0r)112`|oDi?}5+aE{fCUHN8zy zCBJpSf?YYdxgOACF>zyDe9VHyxkDL_FN$Vno%}nUJC^ipH(r5jBnv%!DbP8(GM`q) z^6N0A@0D_W<5!ouTgsY9y7?PpUuQ8%$8BtIZ=dMjGBp|l9=}rG)RcuX6o=;(QLc_; zS$zDiyjwnP#3q9qV`M;V?^`FeyZD5|@$u71CId7$t}uB?AMabr#H@D?{bYyo>CXOs6QA%3ByBg>KIR7^o^Y;lU>{Y7Wh z*7B;>a<>{Tyyj?WbM!kM-xM}=e9een(uLf7Hqv92wZ?+YrR3`w^XpH$3xozYIO>+; z|DOz(cUzzSrl5XvWlqh_Z--;nk)!bGJ#40bZxvg+WK7>gSRJ_+mfL=f@0pfvwbB=? z6}zJquji+muvR9#K~j4VkA6npJ=!4OcKG){IB@=#3$Jiyqbhg-+IInIpD?G^bPCTZ zX=v+E)#0ek>TYJU{m;l+ zatvXc`9R#W$^FIsv66-TTQZRKO)mtGS@M%GAqt^`j+2Y?&SJO0DL+igtF~LiW4+Da zLDaC_t&NZC8|u#*-PYMijWzP12Ct;B+e!`BrM4tjBWQIjE**=pO4s3q! z{=YikLA6b~g}0NV_R{S&)=Qn2P@bToeKh=A^7Lf3LYls-X2F|UNi4oLRg~W*m26a( zNmYl{di}xFUyo)gYLXjv_$IR@t72%+n_Xv!zUedb4=>$Tliau?mFdJU{P4#3bK5>I zjc=Kf4y(c2C&K1|XO>E<>i3b`aH3Q<-ywGNOzL(kxx@MX=;4x;CymEPbK8P!_;=*# zqQ`_j{XzSv{g{9vTWeDbtaG^{2WLjp>QBYwoiz*UYi_xHYxw@2Ogz{=dJ-cUbzZU> zC*%cI^gu~(dw5mP5n14g4I&Ocn$RTSGQE;##TX_bGxXA$}VJL3M` zqYIV>YyA(}-yfyW*wp!F^<8(8@hvY2`HHR%dpvw}^l)`a?3uOXX6YPhAKmg>Vi)Dq zh0=J-(b0T03cRf)pTk(_so!Bxxy}I_hhNbrU+Za{2;(;682HA>68l-b>mA8o;(tTR z-TGzeEs}JRzJ6@rlkHN(I?OJG+O35=}Ew(=k|JanLl^uQfYm|68%h< zzH!3;r2SY);gP%b$!Vg;nwJ13Z`h3!cS#HCwOej~2Cp?^bs=hUANKKHJL!MI&Q+nP z#s>99ck&NUL zbBVoR>*Nzs=dRl`UA0d-5r;UUSengec970wsjK$^?np(l96;)9*M~%khX3_w`!$+g}r~+97 zl^k=1(PCzEPMU|6f<L4U#iaBCP3!%_U zX(cQwHF|~U@dcYv0*vIOXfP}iI4NL-Mt6x(F6~ff(FxnA;1MDTj%jAPT8>@^qi7~T zA_qGO((YuVBM2^Q^@RXQw7IDeAVE-}L^|ovs!Zmv(=ihwp@FiH*pYN93h|MkV{49s z7iy9XF*-IYZ}kwcx@?JOxwFAS%nw2r55efH?D{5$7-mJxq2q(A2!>Lq)2@Z-yHE>5 za%#Lx446hbod<{bNG{@$U1NO|<4#T|o1C;b6Cgo)YfFXhoDA&u;eE7V@{rQl%Crh+ zwQAW##7}k+luMRhXV}CSMfoWo!X=g`S#Eg-3?xrLfov?9W`=XPai5LeE|45?xm^g4 zAZFI5BRrxw%?OR4O1m0i(?}ii*1<3T>g(To;+h#WIIRY!)gUyk2&{<6)EcvW4YWxJ z=B(5}5WnwsAePUNn7Z3+iw@Nz3n}J||BcfDSK2R|RQ!KTHSj;XK+JZHTJyAiNaxDb z*;5^EFbd)9KrCk_m%_J4KNW9TRXGQenF{BT2`ZVfL}a3vG;44cHK|>sWwf$sYh_dRE1l7=s7-aj z!TAjcV;kQQ>Th|WAy@WGE7pqX2T}QzSSC8qgo-y3>V6NHtyD1EOOtI))S)(=-l1U5 z$O?q;4eHjVGI=K{->x-hA&<|}yg6Ax8-X|;r($`u|E^;d4@UmVDvw9YD?LVfDk;4V zi41XkW;9k&zdib|#`dWCq?Ivxrfu~s7Ux4AZ+MW5kj3K-&f@XlRxy|t`>UOjm&Nvz ztKG;(XPc9R+2jTxlP7wG?^p+?+|JTSx6_#nQ;EDY70!<>-Z!y$pS8HvS{#jF)`vBn zYI3$guN<)+nH)@a#_%5wV{yZi4kk57kj=6s*BJLi%jr~+daGp`!s8r1Bf0W?Zn5J& zY`VkaKuNcG<3Gh$yPM+0ZoEI*t-CdrYkw7MJNkN!m!$SxK1k(;Yzwh4pK`eT3$6du zvB;QO@`OBod|8})8t6V}l$MApOJ=T)g%j$O{WtS?eku~KT zz6jD2%28C$9L`PbT9G~#J7B>DhouPyiPYE)wh>uj!3lRp`h7ve9FJCPal&`1;Z@dZ zwO53E)}|q%7xi7-Re65F&t@4~)pfUaRSg(%aaS?|o9OeV_^d);8C6|&gogBL?U|Um zv_Gt9Q&CmcMqnEauG89q$FPfl$0>ChE-mfO-~zFKI!ICZmmO|HRqCu^P$e@T71LD1 z?1Z*dFO@#N#H46!Jgx;X6EEEwBt(5eZ=DvaqZa;O^ z;DnIwEKbLLX-wnjlp?n{z~W7s+ImI?7QYTGCOw_euZhY-Ipf=+^VKuXG_qx_e4+l9 zeH4XXM0`056h_FdYQciZgQdH2#h0vH$=N2YId+;LIFVj#ATWW?BIBsl{ruyWQ3y`N zva^aMWQnL{8}e&~{vVA`(eT9BU1D~)vWXaJ`T7R;i_#{y5lB2WDy6nZ$JK{VSp%l* zw%c@Gh!%M;)s-we8|gOsyN%prgD?1uuO9~OLaJJhuXZ>1rw!jI*f+XqaLoK7+#228#6S;B~Mj?U0n{M86(zI z@XcBD4bO1lofW`fMAdc_(6?PnmB(Y4Bif*aACKQ+_67M!CVHpbou@c_cx7J|#oz{E zn_D$y#bF|eq`-(HKXUY297yrfF(JLu*sU)19o%lUQzZU2W}m! zY3xvPok1J3NAn19P(<#I=-|Z0u+~&M>BuTIj5Yz07rF(@9<2CL<>6*ToiKj|U8!n^ zWqtL9o<7%r%ITqL8 zoFWs8g#rtX%~E8OXxoZeM3-M7KM$Id(RRJVs0Df-%T{I_X_|8lA|Jgg7r z{`+^qe*qsDMmCU_vft`pb4)4ESi4m6^}leaZNEr?Wv_$%Mk{0c$t?S=($8r+Wxwt) zKkPhZkyEkPv{SwU_k|b1A^vVlsixfbHR(<9>F83iztf1sIwRYimDcK9f&2EKk^0~M z;r)x!o@JM2y;7m={bLYzMDG+y$h_B8MpUWF=UnI15|2`9nzH6WFw0T+{tYUljVXZ| zokm0~vRiXZqRpc*5vvRuPB>#dXB(1rM(uEHb$!W*!=6eha5jhcbij$j`4V?KmSs!3GQVG2g3qzg!avHXCB zqF#E`>ehHMvO-au@@cCY+F*Ad^hJBE;LTdfdZVveMs~3<-0a=zb&EyCT3>1rqmA5- zi7N{+Be>jFw!#uc(8S`Tmtv}0hRmPqqi*#G^gdhd#(b@M%=`_BZnr55mh}iGS(ZJ>C~QLh0kzZddc+&u9vA?o4{?;|qudFBnP7%rgbLaEf@S;cyx4|WO~HPC z7%unctoAIHGmKhHxlIGTseST!P0S&vl5$z3gc# z#&;vurLS~qRneO0)6)E+ul;V~$oX&HFe`!I-#PCeVsa=ZyJInZp$YjH0`#j|`1bxE z`~atBwh#RH{Ywbe>C?;-A)cn8_}I;2uy$bf3@!>3j_0nXnQaQk^xy+q0{3N*Jmljx zENcJg_U>z&-?`?!&&)2%VG`9O5JPqz$FUY7(@6s9{{vjeeFLQun3Q0MSjwPu*y$|l z2hq_-w5%cx39yt5Qx0)RrHlHB9pZxqSK@J^9=`_xJyQ|*5>E*-f?Y zQr?&VUJH2DXA(KV)dGNgf*WIM5*%WUjN>SQ6joap6y&ZFbvO+fENSdu__!m3nsSfs6Ux#r}cqasRG{mfvX&_q~?de(VkBrRgd0*QqIK+W;*@x(oG6 zd(Uq9Qhw9@+qBi>*YS1sl>gjgQ{tDWVkoh>EA`Xctu248ZCtfYsrdbrwbVbk^l;VW z^YQMnFUIe>HM#Nr-mxtY-?__wZiDsgxskWVv*%D`^cN^4dTYhTFIPOc@JPkL(;0Z7 zUR!c(YD#@_>iPHssozSeyJ~tze|6tLZPOpS-mdXaz5{-Fcwtq3Veji-s_E_gQq4|f z_?>v};i;~7x^I}g92a+wE%2vNYjpbNn%v?VtfaPjQ@x|-{@5)&+rG18_tT3up>F1D zzT|^Fjqc6eJC&cInr73RzlK9@8Nih8er?Kn@HPGSz4MYg27Z-l+PY2q`P9*~zfNU- zy-nIZezU)R$J6?QM}9GJ@9tmqpr&T(?J9p1XXBV`7wzt8kKXKGSdXr4{M%KR4wr0; z|NKm*3bO+bm(+Ln=sTWn{|9>R%iFY9$EF6}St3rp@mS{UqTQp;&60VuzhdL2-k#Tg zwfh~-zi0q|qEAduRsH>x-95Hu$IsxC+S2p-qpN$zF5}d*`Ey6dpTMcq^KN(VU-Z0w zch9e$KX*Z+5W4l1ynpi8=xF|~8q^JKw|{lv^V;i6UY^Ko-38$J(@#zPW%5gyB%gZC zZu<2m)EeD7@KWZ@fw7ErF5@nswMO;s-q%nNbVKaT$+zRuv!f{FIk9MC#=31`d*-g1 z+?TpHX@ydxlaH0$xE1Q^j@L$0D9?Jiw|ENFc{Yl=uTRUn#%}hP zJh1F%r590$bZchu&oLDSRZ8DX{VLd9+pgUvp2;+Sc~#TjZn#vnaFg|qC6kB6$=oef zmx!$1?Eh-(m+^m-^{O$2a-%r$`H2M!Z|#0sfBWgOlGuYKvF`66ZAND8fHCENYI>^X zsi~)X<~>z)>10{&D2Cbm`_@wvnYFw8&qmX~9e=v$(w5J>_r{;z-8AP5sj2!ZszfI5 zCv5mmEV!x|x>MLaidQ{KYil+lMKL@`&f0}tN~Uuqw0mi{ZJ?qoymRoi-bvOjj4B7V zt~%?_i+*im{HDfuIb!o~kU=qeXV2uFWcTQ#t^G0{gYK~sKI8N_)ccD3n~B5zDs7`x z{?}UbDx}nW!OCoPCJ&ZOkgA$dD802CpXh0_f;-@VTq;c-7BF%48A6iHt9nPb+_*iK z>*}R`O$4kn6GZi)@qb#eY;ZfAxV<{rCZ!LTRMpsOvA$7B*5@mF+q-U&M&1M=qrKZ^ zZ>~vRpNvg+t(3aD?A@bX8CS7@em6C`;Ye&Nyt!S-K3jDVYt3UtD7Tu7Z7o4FN{gNY z78pArz;4o;iw5lGt@p>aM$e=(a8{@(MT73VDszRh1?};b$-`TNnW_cCMA5h0V(vaYRxs_?n(ViinlhyKe`y}p=GlQ9Df(P6&f6Zvs%K}&JoHQ}q zoG_VN*4iLYw1#K^xq;^NDnwuKdz#OTZiTC^ z?B2hqaMER<4>$~lf+H$2jY2d18M|!o4_}{pZqr;YjTFo1GaW~_A=+t*!US?c`RMQ0 zTOxXZqkzXz3%7t8!Xb@kh%YZpokF05Wo$=A14*#uEEXOhl`PF@+Y#atfSQJBM0Bu# zRYLF#SsgYbGq%cfahP3&A0cs)rgBK81XG1R05wc8vP5Cbp;�Rq#v4q{GD+0xBmn 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

oGAYi~J;H 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%0DYI#` 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 J_)E{g{|_d8

fI%)#Qj~~jn<=7WV4~5Ho6kgj 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�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