;****************************************************************************** ; OMOTE-SANDO ADV FOR CP/M ;****************************************************************************** ; ;============================================================================== ; 0100H-: TPA ;============================================================================== ORG 0100H RSTENT EQU 0000H ; RESTART CP/M POINT BDOS EQU 0005H ; DOS ENTRY POINT CIN EQU 6 ; DIRECT CONSOLE INPUT/OUTPUT COUT EQU 2 ; CONSOLE OUTPUT PRINTF EQU 9 ; PRINT STRING OPENF EQU 15 ; OPEN FILE CLOSEF EQU 16 ; CLOSE FILE READS EQU 20 ; READ SEQUENTIAL WRITES EQU 21 ; WRITE SEQUENTIAL MAKEF EQU 22 ; MAKE FILE FCB EQU 005CH ; FILE CONTROL BLOCK ADDRESS DMAR EQU 0080H ; READ/WRITE BUFFER ADDRESS BS EQU 08H ; BACK SPACE LF EQU 0AH ; LINE FEED CR EQU 0DH ; CARRIAGE RETURN GS EQU 1DH ; GROUP SEPARATOR ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ; DISK NAME FCBFN EQU FCB+1 ; FILE NAME FCBFT EQU FCB+9 ; DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ; FILE'S CURRENT REEL NUMBER FCBRC EQU FCB+15 ; FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ; CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ; FCB LENGTH OMDR EQU 9000H ; OMOTE-SANDO MACHINE DEPENDENT CODE ADDRESS OMNDR EQU 9100H ; OMOTE-SANDO NON-DEPENDENT CODE ADDRESS SSEC EQU 61 ; SAVE SECTOR NUMBER = 61 (A530-C35F) ;------------------------------------------------------------------------------ ; LOAD NON-DEPENDENT CODE FROM FILE OMOMAIN.DAT ;------------------------------------------------------------------------------ OMLD LD C,OPENF ; OPEN FILE (OMOMAIN.DAT) LD DE,MFCBDN CALL BDOS INC A JR NZ,OMLD1 LD DE,OPERR ; PRINT OPEN FILE ERROR CALL SUBMSG JP RSTENT OMLD1 LD HL,OMDR ; INITIALIZE DESTINATION ADDRESS LD (OMADR),HL OMLD2 LD C,READS ; READ SEQUENTIAL LD DE,MFCBDN CALL BDOS OR A JR NZ,OMDLD0 LD BC,0080H ; COPY CODE AREA LD DE,(OMADR) LD HL,DMAR LDIR LD (OMADR),DE JR OMLD2 ;------------------------------------------------------------------------------ ; COPY MACHINE DEPENDENT CODE (0300H-03FFH -> 9000H-90FFH) ;------------------------------------------------------------------------------ OMDLD0 LD BC,0100H LD DE,OMDR LD HL,OMENT LDIR ;------------------------------------------------------------------------------ ; CHECK/CREATE SAVE FILE ;------------------------------------------------------------------------------ OMSCHK CALL SUBOPN ; OPEN FILE (OMOSAVE.DAT) JR NZ,OMSCHK6 CALL SUBMAK ; MAKE FILE (OMOSAVE.DAT) JR NZ,OMSCHK2 OMSCHK1 LD DE,CRERR ; PRINT CREATE FILE ERROR CALL SUBMSG JP RSTENT OMSCHK2 LD A,00H ; CLEAR READ/WRITE BUFFER LD B,80H LD HL,DMAR OMSCHK3 LD (HL),A INC HL DJNZ OMSCHK3 LD B,SSEC OMSCHK4 PUSH BC CALL SUBWR JR Z,OMSCHK5 POP BC DJNZ OMSCHK4 JR OMSCHK6 OMSCHK5 POP BC LD DE,WRERR ; PRINT WRITE FILE ERROR CALL SUBMSG JP RSTENT OMSCHK6 CALL SUBCLO ; CLOSE FILE (OMOSAVE.DAT) JR NZ,OMSCHK8 OMSCHK7 LD DE,CLERR ; PRINT CLOSE FILE ERROR CALL SUBMSG JP RSTENT OMSCHK8 JP OMDR ; OMOTE-SANDO MAIN ENTRY ;------------------------------------------------------------------------------ ; SUBROUTINES ;------------------------------------------------------------------------------ SUBMSG ; SUBROUTINE PRINT MESSAGE LD C,PRINTF CALL BDOS RET SUBOPN LD C,OPENF ; SUBROUTINE OPEN FILE (OMOSAVE.DAT) LD DE,SFCBDN CALL BDOS INC A RET SUBMAK LD C,MAKEF ; SUBROUTINE MAKE FILE (OMOSAVE.DAT) LD DE,SFCBDN CALL BDOS INC A RET SUBCLO LD C,CLOSEF ; SUBROUTINE CLOSE FILE (OMOSAVE.DAT) LD DE,SFCBDN CALL BDOS INC A RET SUBWR LD C,WRITES ; SUBROUTINE WRITE SEQUENTIAL LD DE,SFCBDN CALL BDOS INC A RET SUBRD LD C,READS ; SUBROUTINE READ SEQUENTIAL LD DE,SFCBDN CALL BDOS INC A RET ;------------------------------------------------------------------------------ ; WORK AREA/MESSAGE STRINGS ;------------------------------------------------------------------------------ OMADR DS 2 OPERR DB "Can't open OMOMAIN.DAT.",CR,LF,'$' CRERR DB "Can't create OMOSAVE.DAT.",CR,LF,'$' CLERR DB "Can't close OMOSAVE.DAT.",CR,LF,'$' WRERR DB "Can't write OMOSAVE.DAT.",CR,LF,'$' SVMSG DB "Save completed.",CR,LF,LF,'$' LDMSG DB "Load completed.",CR,LF,LF,'$' ; FILE CONTROL BLOCK FOR OMOTE-SANDO ADV MAIN PROGRAM FILE MFCBDN DB 00H ; DISK NAME MFCBFN DB 'OMOMAIN ' ; FILE NAME MFCBFT DB 'DAT' ; DISK TYPE TYPE (3 CHARACTERS) MFCBRL DB 00H ; FILE'S CURRENT REEL NUMBER DB 00H,00H MFCBRC DB 00H ; FILE'S RECORD COUNT (0 TO 128) DS 16 MFCBCR DB 00H ; CURRENT (NEXT) RECORD NUMBER (0 TO 127) ; FILE CONTROL BLOCK FOR OMOTE-SANDO ADV SAVE FILE SFCBDN DB 00H ; DISK NAME SFCBFN DB 'OMOSAVE ' ; FILE NAME SFCBFT DB 'DAT' ; DISK TYPE TYPE (3 CHARACTERS) SFCBRL DB 00H ; FILE'S CURRENT REEL NUMBER DB 00H,00H SFCBRC DB 00H ; FILE'S RECORD COUNT (0 TO 128) DS 16 SFCBCR DB 00H ; CURRENT (NEXT) RECORD NUMBER (0 TO 127) ;============================================================================== ; 0300H-03FFH: OMOTE-SANDO ADV MACHINE DEPENDENT CODE AREA ; COPIED TO 9000H-90FFH ; MUST BE WRITTEN IN RELOCATABLE CODE ;============================================================================== ;------------------------------------------------------------------------------ ; ENTRY POINT/JUMP TABLE ;------------------------------------------------------------------------------ ORG 0300H OMENT JP OMNDR ; C3 00 91 OMOTE-SANDO NON-DEPENDENT ENTRY JR CINSUB ; 18 XX JP TABLE (CONSOLE INPUT) JR COUTSUB ; 18 XX JP TABLE (CONSOLE OUTPUT) JR RSTSUB ; 18 XX JP TABLE (HOT RESET) JR SVSUB ; 18 XX JP TABLE (SAVE GAME) JR LDSUB ; 18 XX JP TABLE (LOAD GAME) ;------------------------------------------------------------------------------ ; HOT RESET ROUTINE ;------------------------------------------------------------------------------ RSTSUB JP RSTENT ;------------------------------------------------------------------------------ ; CONSOLE OUTPUT ROUTINE ;------------------------------------------------------------------------------ COUTSUB PUSH AF PUSH BC PUSH DE PUSH HL CP GS ; CONVERT GROUP SEPARATOR -> BS JR NZ,COUTSU1 LD A,BS COUTSU1 LD C,COUT LD E,A CALL BDOS POP HL POP DE POP BC POP AF RET ;------------------------------------------------------------------------------ ; CONSOLE INPUT ROUTINE ;------------------------------------------------------------------------------ CINSUB PUSH BC PUSH DE PUSH HL CINSUB1 LD C,CIN LD E,0FFH CALL BDOS OR A JR Z,CINSUB1 POP HL POP DE POP BC CP 61H RET C CP 7BH RET NC SUB 20H RET ;------------------------------------------------------------------------------ ; SAVE GAME ROUTINE ;------------------------------------------------------------------------------ SVSUB PUSH AF PUSH BC PUSH DE PUSH HL LD A,00H LD B,21 LD HL,SFCBRL SVSUB1 LD (HL),A INC HL DJNZ SVSUB1 CALL SUBOPN LD B,SSEC LD HL,0A530H LD (OMADR),HL SVSUB2 PUSH BC LD BC,0080H LD DE,DMAR LD HL,(OMADR) LDIR LD (OMADR),HL CALL SUBWR POP BC DJNZ SVSUB2 CALL SUBCLO LD DE,SVMSG CALL SUBMSG POP HL POP DE POP BC POP AF JP 92B9H ; RETURN ENTRY = 92B9H ;------------------------------------------------------------------------------ ; LOAD GAME ROUTINE ;------------------------------------------------------------------------------ LDSUB PUSH AF PUSH BC PUSH DE PUSH HL LD A,00H LD B,21 LD HL,SFCBRL LDSUB1 LD (HL),A INC HL DJNZ LDSUB1 CALL SUBOPN LD B,SSEC LD HL,0A530H LD (OMADR),HL LDSUB2 PUSH BC CALL SUBRD LD BC,0080H LD DE,(OMADR) LD HL,DMAR LDIR LD (OMADR),DE POP BC DJNZ LDSUB2 CALL SUBCLO LD DE,LDMSG CALL SUBMSG POP HL POP DE POP BC POP AF JP 92B9H ; RETURN ENTRY = 92B9H END