[Copyright 1999,2002 Frank Durda IV, All Rights Reserved. Mirroring of any material on this page in any form is expressly prohibited. The official web site for this material is: http://nemesis.lonestar.org Contact this address for use clearances: clearance at nemesis.lonestar.org Comments and queries to this address: web_software at nemesis.lonestar.org]
MISOSYS EDAS-4.3 04/11/99 22:46:25 SYS4 - LS-DOS 6.2 Page 00001
00001 ;SYS4/ASM - LS-DOS 6.2
000A 00003 LF EQU 10
000D 00004 CR EQU 13
00005 *LIST OFF ;Get SYS0/EQU
00321 *LIST ON
0000 00322 *GET COPYCOM:3 ;Copyright message
00323 ; COPYCOM - File for Copyright COMment block
00324 ;
0000 00325 *GET BUILDVER/ASM:3
00326 ;
00327 ; Buildver/asm is a bit of a kludge since not all utilities can load
00328 ; equates from LDOS60 and still compile. LOWCORE and everybody else
00329 ; relies on this setting, and it eventually ends up in LDOS60/EQU
00330 ; for programs that can use that.
00331 ;
FFFF 00332 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B)
00333 ; These switches activate patches made since the 1B release.
00334 ; It is important that all earlier patches be enabled when a higher
00335 ; patch is enabled.
00336 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the
00337 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.)
FFFF 00338 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI)
FFFF 00339 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR)
FFFF 00340 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT)
FFFF 00341 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL)
00342 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19.
FFFF 00343 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *)
FFFF 00344 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY)
00345 ;
00346 ;End of BUILDVER/ASM
00347 IF @BLD631
00349 ELSE
00350 COM '<*(C) 1982,3,4,6 by LSI*>'
00351 ENDIF
00352 ;
1E00 00353 ORG 1E00H
00354 ;
1E00 C3AF1E 00355 SYS4 JP BEGIN
00356 ;
00357 ; Sentence table - Must be totally within one page
00358 ;
1E03 01 00359 MSG0 DB 1,2+80H
82
00360 ; no error
1E05 04 00361 MSG1 DB 4,2,5,6,9+80H
02 05 06 89
00362 ; parity error during header read
1E0A 08 00363 MSG2 DB 8,2,5,9+80H
02 05 89
00364 ; seek error during read
1E0E 0B 00365 MSG3 DB 11,7,5,9+80H
07 05 89
00366 ; lost data during read
1E12 04 00367 MSG4 DB 4,2,5,9+80H
02 05 89
00368 ; parity error during read
1E16 07 00369 MSG5 DB 7,27,12,44,5,9+80H
1B 0C 2C 05 89
00370 ; data record not found during read
1E1C 0D 00371 MSG6 DB 13,9,15,7,27+80H
09 0F 07 9B
00372 ; attempted to read system data record
1E21 0D 00373 MSG7 DB 13,9,14,7,27+80H
09 0E 07 9B
00374 ; attempted to read locked/deleted data record
1E26 2A 00375 MSG8 DB 42,12,51+0C0H
0C F3
00376 ; device not available
1E29 04 00377 MSG9 DB 4,2,5,6,10+80H
02 05 06 8A
00378 ; parity error during header write
1E2E 08 00379 MSG10 DB 8,2,5,10+80H
02 05 8A
00380 ; seek error during write
1E32 0B 00381 MSG11 DB 11,7,5,10+80H
07 05 8A
00382 ; lost data during write
1E36 04 00383 MSG12 DB 4,2,5,10+80H
02 05 8A
00384 ; parity error during write
1E3A 07 00385 MSG13 DB 7,27,12,44,5,10+80H
1B 0C 2C 05 8A
00386 ; data record not found during write
1E40 0A 00387 MSG14 DB 10,21,18,19,48+80H
15 12 13 B0
00388 ; write fault on disk drive
1E45 0A 00389 MSG15 DB 10,22,19+80H
16 93
00390 ; write protected disk
1E48 17 00391 MSG16 DB 23,24,26,25+80H
18 1A 99
00392 ; illegal logical file number
1E4C 10 00393 MSG17 DB 16,9,2+80H
09 82
00394 ; directory read error
1E4F 10 00395 MSG18 DB 16,10,2+80H
0A 82
00396 ; directory write error
1E52 17 00397 MSG19 DB 23,26,41+0C0H
1A E9
00398 ; illegal file name
1E55 22 00399 MSG20 DB 34,9,2+80H
09 82
00400 ; gat read error
1E58 22 00401 MSG21 DB 34,10,2+80H
0A 82
00402 ; gat write error
1E5B 23 00403 MSG22 DB 35,9,2+80H
09 82
00404 ; hit read error
1E5E 23 00405 MSG23 DB 35,10,2+80H
0A 82
00406 ; hit write error
1E61 1A 00407 MSG24 DB 26,12,45,16+0C0H
0C 2D D0
00408 ; file not in directory
1E65 1A 00409 MSG25 DB 26,46,49+0C0H
2E F1
00410 ; file access denied
1E68 01 00411 MSG26 DB 1,16,39,51+0C0H
10 27 F3
00412 ; directory space full
1E6C 13 00413 MSG27 DB 19,39,47+80H
27 AF
00414 ; disk space full
1E6F 1C 00415 MSG28 DB 28,29,26,32+80H
1D 1A A0
00416 ; end of file encountered
1E73 1B 00417 MSG29 DB 27,25,30,29,31+80H
19 1E 1D 9F
00418 ; record number out of range
1E78 10 00419 MSG30 DB 16,47,52,26+80H
2F 34 9A
00420 ; directory full - can't extend file
1E7C 32 00421 MSG31 DB 50,12,44+0C0H
0C EC
00422 ; program not found
1E7F 17 00423 MSG32 DB 23,48,25+0C0H
30 D9
00424 ; illegal drive number
1E82 01 00425 MSG33 DB 1,42,39,51+0C0H
2A 27 F3
00426 ; no device space available
1E86 26 00427 MSG34 DB 38,26,43,2+80H
1A 2B 82
00428 ; load file format error
1E8A 11 00429 MSG35 DB 17,21+80H
95
00430 ; memory fault
1E8C 0D 00431 MSG36 DB 13,38,9,40,17+80H
26 09 28 91
00432 ; attempted to load read only memory
1E91 17 00433 MSG37 DB 23,46,13,22,26+80H
2E 0D 16 9A
00434 ; illegal access attempted to protected file
1E96 1A 00435 MSG38 DB 26,12,53+0C0H
0C F5
00436 ; file not open
1E99 2A 00437 MSG39 DB 42,45,54+80H
2D B6
00438 ; device in use
1E9C 16 00439 MSG40 DB 22,15,42+80H
0F AA
00440 ; protected system device
1E9F 1A 00441 MSG41 DB 26,57,53!0C0H
39 F5
00442 ; file already open
1EA2 18 00443 MSG42 DB 24,27,58,53,21!0C0H
1B 3A 35 D5
00444 ; logical record length open fault
1EA7 38 00445 MSG43 DB 56,20,2!80H
14 82
00446 ; SVC parameter error
1EAA 14 00447 MSG44 DB 20,2!80H
82
00448 ; Parameter error
1EAC 25 00449 MSG45 DB 37,2,33+80H
02 A1
00450 ; unknown error code
1EAF E670 00451 BEGIN AND 70H ;What's the entry?
1EB1 C8 00452 RET Z ;Back on zero
1EB2 F5 00453 PUSH AF
1EB3 3A0D00 00454 LD A,(LSVC$) ;Grab the last SVC
1EB6 325E20 00455 LD (SVSVC+1),A ; and store for later
1EB9 F1 00456 POP AF
1EBA 22461F 00457 LD (EXTEND+1),HL ;Value if extended error
1EBD E3 00458 EX (SP),HL ;Grab return address
1EBE 22BF1F 00459 LD (ERR7+1),HL ; & stuff it
1EC1 E1 00460 POP HL
1EC2 F1 00461 POP AF ;Pop off the error code
1EC3 E3 00462 EX (SP),HL ;Get user ret address
1EC4 22241F 00463 LD (USRET+1),HL ; for long dsply
1EC7 E3 00464 EX (SP),HL
1EC8 E5 00465 PUSH HL ;Save regs
1EC9 D5 00466 PUSH DE
1ECA C5 00467 PUSH BC
1ECB 2A0B00 00468 LD HL,(SVCRET$) ;Grab last SVC return
1ECE 227220 00469 LD (SVRET+1),HL ; and save for dsply
1ED1 47 00470 LD B,A
1ED2 3A7C00 00471 LD A,(SFLAG$) ;Test expanded-error
1ED5 E640 00472 AND 40H ; flag bit in system flag
1ED7 A8 00473 XOR B
1ED8 A0 00474 AND B
1ED9 47 00475 LD B,A ;Xfer the result to B
1EDA F5 00476 PUSH AF ; & save for later
1EDB E63F 00477 AND 3FH ;Strip all but error #
1EDD 4F 00478 LD C,A ;Place error code -> C
1EDE 216C00 00479 LD HL,CFLAG$ ;If system error suppress
1EE1 CB76 00480 BIT 6,(HL) ; flag is set, don't
1EE3 C2B91F 00481 JP NZ,ERR6A ; display error message.
1EE6 CB7E 00482 BIT 7,(HL) ;If error-to-buffer is
1EE8 2005 00483 JR NZ,ERR0 ; set, put to user buf
1EEA 11001D 00484 LD DE,SBUFF$
1EED 1806 00485 JR ERR0A ;Branch around force
1EEF CBF0 00486 ERR0 SET 6,B ;Force buffer to abbrev
1EF1 F1 00487 POP AF
1EF2 CBF7 00488 SET 6,A
1EF4 F5 00489 PUSH AF
1EF5 CB70 00490 ERR0A BIT 6,B ;Expanded error display?
1EF7 0600 00491 LD B,0
1EF9 2044 00492 JR NZ,ERR2 ;Jump if abbreviated
1EFB C5 00493 PUSH BC
1EFC 21C320 00494 LD HL,ERRMSG ;Pt to "< ERRCOD =...
1EFF 0E11 00495 LD C,MLEN ; & move to buffer
1F01 EDB0 00496 LDIR
1F03 C1 00497 POP BC
1F04 EB 00498 EX DE,HL ;Buffer ptr to HL
1F05 79 00499 LD A,C ;Error code to A
1F06 362F 00500 LD (HL),2FH ;Init for digit conv
1F08 34 00501 ERR1 INC (HL) ;Bump ASCII digit
1F09 D60A 00502 SUB 10 ; count by 10
1F0B 30FB 00503 JR NC,ERR1 ;Keep bumping 10's digit
1F0D 2C 00504 INC L ;Bump buffer ptr
1F0E C63A 00505 ADD A,3AH ;Convert rmndr to unit's
1F10 77 00506 LD (HL),A ; & place in buffer
1F11 2C 00507 INC L ;Bump to next pos
1F12 362C 00508 LD (HL),',' ;Stuff a comma & bump
1F14 2C 00509 INC L
1F15 3620 00510 LD (HL),' ' ; & a space
1F17 2C 00511 INC L
1F18 EB 00512 EX DE,HL ;Buffer ptr back to DE
1F19 C5 00513 PUSH BC
1F1A 21D420 00514 LD HL,ERRMSG1 ;"Returns to X'"
1F1D 010D00 00515 LD BC,M1LEN
1F20 EDB0 00516 LDIR
1F22 EB 00517 EX DE,HL ;HL back to buffer
1F23 110000 00518 USRET LD DE,$-$ ;User ret address
1F26 CDBD07 00519 CALL @HEX16
1F29 3E27 00520 LD A,27H ;"'"
1F2B 77 00521 LD (HL),A
1F2C 23 00522 INC HL
1F2D 360A 00523 LD (HL),LF ;End the line
1F2F 23 00524 INC HL
1F30 C1 00525 POP BC
1F31 CB71 00526 BIT 6,C ;Extended error?
1F33 2009 00527 JR NZ,ERR6 ;Go if not
1F35 362A 00528 LD (HL),'*' ;Make long msg look nice
1F37 23 00529 INC HL
1F38 362A 00530 LD (HL),'*'
1F3A 23 00531 INC HL
1F3B 3620 00532 LD (HL),' '
1F3D 23 00533 INC HL
1F3E EB 00534 ERR6 EX DE,HL ;DE back to nxt buff line
1F3F 79 00535 ERR2 LD A,C
1F40 FE3F 00536 CP 63 ;"Extended error"?
1F42 2023 00537 JR NZ,ERR2A
00538 ;
00539 ; Do extended error only
00540 ;
1F44 D5 00541 PUSH DE ;Save buffer ptr
1F45 110000 00542 EXTEND LD DE,$-$ ;Ext. error value fm HL
1F48 21BD20 00543 LD HL,EXT$ERR+26
1F4B CDBD07 00544 CALL @HEX16
1F4E 21A320 00545 LD HL,EXT$ERR ;Point to error msg
1F51 D1 00546 POP DE ;Recvr buffer
1F52 E5 00547 PUSH HL ;Save msg start
1F53 C5 00548 PUSH BC
1F54 012000 00549 LD BC,M2LEN ;Len of error
1F57 EDB0 00550 LDIR ;Move into buffer
1F59 C1 00551 POP BC
1F5A 216C00 00552 LD HL,CFLAG$ ;See if to user buffer
1F5D CB7E 00553 BIT 7,(HL)
1F5F CBBE 00554 RES 7,(HL) ;Don't logot if so
1F61 E1 00555 POP HL
1F62 CC0005 00556 CALL Z,@LOGOT
1F65 1852 00557 JR ERR6A ; and exit
00558 ;
00559 ; Do regular (non-extended) error
00560 ;
1F67 3E2D 00561 ERR2A LD A,45 ;If error code is > 43,
1F69 B9 00562 CP C ; then set to 44 (max)
1F6A D5 00563 PUSH DE ;Save ptr to 1st char
1F6B 3001 00564 JR NC,ERR3
1F6D 4F 00565 LD C,A
1F6E 217821 00566 ERR3 LD HL,CODTAB ;Pt to start of code
1F71 09 00567 ADD HL,BC ; address table & index
1F72 6E 00568 LD L,(HL) ;P/u lo-order vector
1F73 261E 00569 LD H,MSG0<-8 ;Set hi-order vector
00570 ;
00571 ; HL now points to sentence table
00572 ;
1F75 7E 00573 ERR5 LD A,(HL) ;P/u word offset
1F76 E63F 00574 AND 3FH ; & strip any flags
1F78 47 00575 LD B,A ;Xfer word # to reg B
1F79 E5 00576 PUSH HL ;Save sentence pointer
1F7A 21A621 00577 LD HL,WORDS ;Dictionary start
1F7D 7E 00578 LP1 LD A,(HL) ;Scan through the table
1F7E 07 00579 RLCA ; counting words (bit 7
1F7F 23 00580 INC HL ; denotes word end)
1F80 30FB 00581 JR NC,LP1 ; until requested word
1F82 05 00582 DEC B ; is reached
1F83 20F8 00583 JR NZ,LP1
00584 ;
00585 ; Found the start of the desired word
00586 ;
1F85 7E 00587 LP2 LD A,(HL) ;Transfer the word until
1F86 07 00588 RLCA ; bit 7 set (last char)
1F87 CB3F 00589 SRL A ; while resetting bit-7
1F89 12 00590 LD (DE),A ;Stuff letter of word
1F8A 23 00591 INC HL ; & bump pointers
1F8B 13 00592 INC DE
1F8C 30F7 00593 JR NC,LP2
1F8E 3E20 00594 LD A,' ' ;Move a space into buffer
1F90 12 00595 LD (DE),A
1F91 13 00596 INC DE
1F92 E1 00597 POP HL ;Rcvr ptr to sentence
1F93 7E 00598 LD A,(HL) ;P/u this word byte
1F94 23 00599 INC HL
1F95 07 00600 RLCA ;Was this the last word?
1F96 30DD 00601 JR NC,ERR5 ;Loop if still more to go
1F98 E3 00602 EX (SP),HL ;Get ptr to 1st char
1F99 7E 00603 LD A,(HL)
1F9A CBAF 00604 RES 5,A ;Set it to UC
1F9C 77 00605 LD (HL),A
1F9D E1 00606 POP HL ;Get back sentence ptr
1F9E F1 00607 POP AF ;Rcvr error code
1F9F F5 00608 PUSH AF
1FA0 E5 00609 PUSH HL ;Save sentence ptr
1FA1 3E0D 00610 LD A,CR
1FA3 12 00611 LD (DE),A ;Stuff end-of-line
1FA4 216C00 00612 LD HL,CFLAG$ ;If to user buffer,
1FA7 CB7E 00613 BIT 7,(HL) ; then don't LOGOT
1FA9 CBBE 00614 RES 7,(HL)
1FAB 21001D 00615 LD HL,SBUFF$ ;Display the line
1FAE CC0005 00616 CALL Z,@LOGOT
1FB1 E1 00617 POP HL
1FB2 F1 00618 POP AF ;Rcvr word index
1FB3 F5 00619 PUSH AF
1FB4 CB77 00620 BIT 6,A ;Test if a disk error
1FB6 CCC41F 00621 CALL Z,DSPSPEC ;Get filespec if it is
1FB9 F1 00622 ERR6A POP AF
1FBA C1 00623 POP BC
1FBB D1 00624 POP DE
1FBC E1 00625 POP HL
1FBD B7 00626 OR A ;Ret to user if bit 7
1FBE FA0000 00627 ERR7 JP M,0 ; of error code is set
1FC1 C3081B 00628 JP @ABORT ; else abort
00629 ;
00630 ; Routine to display the filespec
00631 ;
1FC4 DDE5 00632 DSPSPEC PUSH IX
1FC6 DD2A2400 00633 LD IX,(JDCB$) ;P/u FCB vector
1FCA 2B 00634 DEC HL
1FCB CB76 00635 BIT 6,(HL)
1FCD 2030 00636 JR NZ,DSPC2
1FCF DD4E06 00637 LD C,(IX+6) ;Device 1st char or drive
1FD2 DD4607 00638 LD B,(IX+7) ;Device 2nd char or DEC
1FD5 DDCB007E 00639 BIT 7,(IX+0) ;Test if file or device
1FD9 205D 00640 JR NZ,RCVSPEC ;Jump if it is a file
1FDB 212821 00641 LD HL,OPN$DCB
1FDE 79 00642 DSPC1 LD A,C ;Possible devspec, 1st char
1FDF FE41 00643 CP 'A'
1FE1 3815 00644 JR C,DCBUNK ;C=do unknown
1FE3 FE5B 00645 CP 'Z'+1
1FE5 3011 00646 JR NC,DCBUNK ;Again, go if bad
1FE7 78 00647 LD A,B ;Check 2nd character
1FE8 FE30 00648 CP '0'
1FEA 380C 00649 JR C,DCBUNK
1FEC FE5B 00650 CP 'Z'+1
1FEE 3008 00651 JR NC,DCBUNK
1FF0 ED433A21 00652 LD (OPN$DCB+18),BC ;Stuff the device name
1FF2 00653 DSPC1A EQU $-2
1FF4 DDE1 00654 POP IX
1FF6 185F 00655 JR RSPC6 ;Go display it
00656 ;
1FF8 213D21 00657 DCBUNK LD HL,UNK$TYP
1FFB DDE1 00658 POP IX
1FFD 1858 00659 JR RSPC6
00660 ;
1FFF DD4E01 00661 DSPC2 LD C,(IX+1) ;P/u 1st char or vector
2002 DD4602 00662 LD B,(IX+2) ;P/u 2nd char or vector
2005 DD7E00 00663 LD A,(IX+0)
2008 21EB20 00664 LD HL,DEV$NAM
200B 22F21F 00665 LD (DSPC1A),HL ;Change dsply message
200E 21E120 00666 LD HL,DEV$EQ
2011 FE2A 00667 CP '*' ;If '*', go to device
2013 28C9 00668 JR Z,DSPC1
2015 DDE5 00669 PUSH IX ; else assume file
2017 E1 00670 POP HL
2018 11F520 00671 LD DE,FILE$EQ+7 ;Init "
[Copyright 1999,2002 Frank Durda IV, All Rights Reserved.
Mirroring of any material on this page in any form is expressly prohibited.
The official web site for this material is: http://nemesis.lonestar.org
Contact this address for use clearances: clearance at nemesis.lonestar.org
Comments and queries to this address: web_software at nemesis.lonestar.org]