|
"Emergency" (The title screen says "The Emergency", but it was just "Emergency" on the I/O magazine article) was 3D wireframe shooter published in I/O magazine February 1984 issue. The game was pretty simple. You need to strafe a target moving on the ground. The game was boasting blazingly fast 5 frames per second, which was blazing in 1984 8-bit computer standard. Actually the 3D scene consists of only up to 22 lines. Nonetheless, it was impressive back then. It is one of the games that FM-7 users remember.
The secret of the blazingly fast graphics was from the nearly 100% usage of the two 6809s of FM-7. Many of the FM-7 programs used main CPU for general computation and sub CPU for graphics. That made considerable idle time of the sub CPU. This title let sub CPU do more task. For example, sub CPU detects space-key press, render bullets on the screen, then notified main CPU that the player shot a gun.
Now it multi-threaded programming is so common, and running programs in parallel is nothing special. However, in 1984, there was a discussion if 2-CPU design of FM-7 was a right decision. Having multiple CPUs a waste? This title, "Emergency", shot down those questions. Yes, having two CPUs was a very much a good design. Fujitsu had been making personal computers that were three steps, four steps, ahead of other computers. But, always Fujitsu was too early and never able to become a majority. This tradition continued all the way up to FM TOWNS series, until Fujitsu gave up on designing own computers with boring FM-V.
Emergency is one of the FM-7 games that needs to be remembered. However, it does not support a joystick. Probably it is difficult for younger gamers to fly with num keys. So, I wrote a patch for supporting joysticks. If your FM-7 has YM2203 card, or if you have FM77AV or newer model, you can play this title with a MSX joystick (not ATARI although both ATARI and MSX joysticks connects to D-Sub 9. Pin assignments are different.)
Since you need to modify F-BASIC part, you need to make a media with an FM-7 emulator, or actual FM-7 hardware. You can probably do it with an actual hardware + Tape Bios Redicrector, or Disk Bios Redirector.
(1) Get an empty cassette-tape media, a floppy disk, or an empty tape/disk image if you do on an emulator or with a BIOS redirector.
(2) In FM-7, type in the following F-BASIC code, and SAVE "EMERGJS"
10 CLEAR ,&H3AFF
20 LOADM "EMERGJSM"
30 LOADM "emerg.m"
40 RUN
"EMER"
(3) Type the following command in the F-BASIC prompt.
CLEAR ,&H3AFF
(4) Type in following dump list, and SAVEM "EMERGJSM",&H3B00,&H3C20,&H3B00
Add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Sum
3B00 20 1C 20 06 20 01 00 16 00 AF 34 06 6F 8C F7 4F :C3 | . . .....4.o..O
3B10 17 00 B1 84 30 81 30 27 03 6C 8C EA 35 86 17 00 :0B |....0.0'.l..5...
3B20 98 B6 FD 05 2B FB 86 80 B7 FD 05 B6 FD 05 2A FB :12 |....+.........*.
3B30 30 8D 00 C0 10 8E FC 80 C6 2D A6 80 A7 A0 5A 26 :77 |0........-....Z&
3B40 F9 7F FD 05 B6 FD 05 2B FB 86 BD B7 63 5E 8E C9 :6A |......+....c^..
3B50 00 BF 63 5F 8E C8 FF BF 63 66 8E 12 12 BF 56 C5 :EA |..c_....cf....V.
3B60 86 BD B7 56 90 30 8C 06 BF 56 91 7E 53 00 34 7D :CA |...V.0...V.~S.4}
3B70 4F 8D 51 85 10 26 06 C6 80 DA 39 D7 39 1F 89 C4 :C3 |O.Q..&....9.9...
3B80 0F C1 0F 26 05 A1 8C 30 27 29 C6 30 85 04 26 04 :60 |...&...0').0..&.
3B90 C6 37 20 18 85 08 26 04 C6 39 20 10 85 01 26 04 :CB |.7 ...&..9 ...&.
3BA0 C6 38 20 08 85 02 26 04 C6 32 20 00 A7 8C 09 1F :4A |.8 ...&..2 .....
3BB0 98 35 FD B6 FD 01 35 FD 00 CC 0F 7F 8D 20 CC 07 :8A |.5....5..... ..
3BC0 BF 20 1B 39 C6 2F 84 01 27 02 C6 5F 86 0F 8D 0E :2B |. .9./..'.._....
3BD0 86 0E 8D 13 86 09 B7 FD 15 B6 FD 16 20 11 8D 07 :1A |............ ...
3BE0 F7 FD 16 86 02 20 05 B7 FD 16 86 03 B7 FD 15 7F :52 |..... .........
3BF0 FD 15 39 00 00 00 3F 59 41 4D 41 55 43 48 49 91 :6C |..9...?YAMAUCHI.
---------------------------------------------------------
39 8C 79 5C C9 2A D4 36 4A DC 1F D0 27 09 CC 92
Add +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F Sum
3C00 D3 93 C9 00 00 1A 90 B6 D4 01 B7 C8 FF B6 D3 80 :EB |................
3C10 2A 09 86 01 97 04 86 20 B7 C8 FF 96 04 7F D3 81 :E6 |*...... .......
3C20 39 :39 |9...............
---------------------------------------------------------
36 9C 4F 01 97 1E 16 D6 8B C9 B6 5E 03 35 A6 01
(5) Load the binary part of the Emergency from whatever media you have. Probably you have to do LOADM "emerg.m" on F-BASIC prompt.
(6) Set the media you prepared in step (1) and
SAVEM "emerg.m",&H3D00,&H6FFF,&H5300
("emerg.m" looks to be the file name used in the package version sold from COMPAC. I typed in the list published on the I/O magazine, so I couldn't confirm it was really the filename used by COMPAC version.)
(7) Load the F-BASIC part of the Emergency from whatever media you have, and make the following modifications.
1100 CLEAR 300,&H3AFF:SCREEN 7,7:DIM HIS(5):COLOR 5
1105 EXEC &H3B04
2350 EXEC &H3B00
1190 A$=INKEY$:EXEC &H3B02:IF A$<>" " AND PEEK(&H3B06)=0 THEN 1190
1900 A$=INKEY$:EXEC &H3B02:IF A$<>" " AND PEEK(&H3B06)=0 THEN 1900
2370 A$=INKEY$:EXEC &H3B02:IF A$<>" " AND PEEK(&H3B06)=0 THEN 2370
3210 A$=INKEY$:EXEC &H3B02:IF A$<>" " AND PEEK(&H3B06)=0 THEN 3210
3800 A$=INKEY$:EXEC &H3B02:IF A$<>" " AND PEEK(&H3B06)=0 THEN 3800
(8) Set the media you prepared in step (1) and then type:
SAVE "EMER"
After doing this, you should be able to start Emergency with joystick support by typing RUN "EMER"
ORG $3B00
JS_FLAG_UP EQU 1
JS_FLAG_DOWN EQU 2
JS_FLAG_LEFT EQU 4
JS_FLAG_RIGHT EQU 8
JS_FLAG_ABUTTON EQU 16
JS_FLAG_BBUTTON EQU 32
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INSTALL_AND_RUN BRA INSTALL_MAIN ; $3B00
BRA EMERGENCY_READ_JOYSTICK_BUTTON ; $3B02
BRA EMERGENCY_JSINIT
BUTTONPRESS FCB 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EMERGENCY_JSINIT LBRA JSInit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EMERGENCY_READ_JOYSTICK_BUTTON
; For F-BASIC part
PSHS A,B
CLR BUTTONPRESS,PCR
CLRA
LBSR JSRead
ANDA #JS_FLAG_ABUTTON+JS_FLAG_BBUTTON
CMPA #JS_FLAG_ABUTTON+JS_FLAG_BBUTTON
BEQ EXIT_EMERGENCY_READ_JOYSTICK_BUTTON
INC BUTTONPRESS,PCR
EXIT_EMERGENCY_READ_JOYSTICK_BUTTON
PULS A,B,PC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INSTALL_MAIN LBSR JSInit
SUBSYS_READY_WAIT LDA $FD05
BMI SUBSYS_READY_WAIT
LDA #$80
STA $FD05
SUBSYS_HALT_WAIT LDA $FD05
BPL SUBSYS_HALT_WAIT
LEAX SUBSYS_CMD,PCR
LDY #$FC80
LDB #SUBSYS_CMD_END-SUBSYS_CMD
SUBSYS_TFR_LOOP LDA ,X+
STA ,Y+
DECB
BNE SUBSYS_TFR_LOOP
CLR $FD05
SUBSYS_UNHALT_WAIT LDA $FD05
BMI SUBSYS_UNHALT_WAIT
; 635E(C05E) CLR $D381 -> JSR $C900
LDA #$BD
STA $635E
LDX #$C900
STX $635F
; 6365(C065) LDA $D401 -> LDA $C8FF
LDX #$C8FF
STX $6366
; Stop with '5' key
LDX #$1212
STX $56C5
; 5690 LDA $FD01
LDA #$BD
STA $5690
LEAX EMERGENCY_JOYSCAN,PCR
STX $5691
JMP $5300
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EMERGENCY_JOYSCAN PSHS B,X,Y,U,CC,DP
CLRA
BSR JSRead
BITA #JS_FLAG_ABUTTON
BNE JOYSCAN_NO_ABUTTON
LDB #$80
ORB <$39
STB <$39
JOYSCAN_NO_ABUTTON
TFR A,B
ANDB #JS_FLAG_LEFT+JS_FLAG_RIGHT+JS_FLAG_UP+JS_FLAG_DOWN
CMPB #JS_FLAG_LEFT+JS_FLAG_RIGHT+JS_FLAG_UP+JS_FLAG_DOWN
BNE JOYSCAN_DIRECTION_INPUT
CMPA EMERGENCY_PREV_JS_STATE,PCR
BEQ EMERGENCY_JOYSCAN_NOJSINPUT
JOYSCAN_DIRECTION_INPUT
LDB #'0' ; Tentative. Stop
BITA #JS_FLAG_LEFT
BNE JOYSCAN_NOT_LEFT
LDB #'7'
BRA EMERGENCY_JOYSCAN_JSINPUT
JOYSCAN_NOT_LEFT
BITA #JS_FLAG_RIGHT
BNE JOYSCAN_NOT_RIGHT
LDB #'9'
BRA EMERGENCY_JOYSCAN_JSINPUT
JOYSCAN_NOT_RIGHT
BITA #JS_FLAG_UP
BNE JOYSCAN_NOT_UP
LDB #'8'
BRA EMERGENCY_JOYSCAN_JSINPUT
JOYSCAN_NOT_UP
BITA #JS_FLAG_DOWN
BNE JOYSCAN_NOT_DOWN
LDB #'2'
BRA EMERGENCY_JOYSCAN_JSINPUT
JOYSCAN_NOT_DOWN
EMERGENCY_JOYSCAN_JSINPUT
STA EMERGENCY_PREV_JS_STATE,PCR
TFR B,A
PULS B,X,Y,U,CC,DP,PC
EMERGENCY_JOYSCAN_NOJSINPUT
LDA $FD01
PULS B,X,Y,U,CC,DP,PC
EMERGENCY_PREV_JS_STATE FCB 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IO_FM_CMD EQU $FD15
IO_FM_DATA EQU $FD16
FM_CMD_LATCH EQU 3
FM_CMD_WRITE EQU 2
FM_CMD_READ EQU 9
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JSInit LDD #$0F7F ; Reg 15 <- $7F
BSR FMWrite
LDD #$07BF ; Reg 7 <- $BF
BRA FMWrite
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A 0->JS0 1->JS1
JSRead LDB #$2F
ANDA #1
BEQ JSRead0
LDB #$5F
JSRead0 LDA #$0F ; Reg 15 < $2F or $5F
BSR FMWrite
LDA #14
BSR FMLatchRegister
LDA #9
STA IO_FM_CMD
LDA IO_FM_DATA
BRA FMClearCommand
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A Register
; B Data
FMWrite BSR FMLatchRegister
STB IO_FM_DATA
LDA #FM_CMD_WRITE
BRA FMWriteCommand
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; A Register
FMLatchRegister STA IO_FM_DATA
LDA #FM_CMD_LATCH
FMWriteCommand STA IO_FM_CMD
FMClearCommand CLR IO_FM_CMD
RTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LAST_JOYSTICK_STATUS FCB 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SUBSYS_CMD FCB 0,0
FCB $3F ; SubCPU Control
FCB "YAMAUCHI"
FCB $91
FDB $D380+(SUBCPU_HOOK_BEGIN-SUBSYS_CMD)
FDB $C900
FDB #SUBCPU_HOOK_END-SUBCPU_HOOK_BEGIN
FCB $90
SUBCPU_HOOK_BEGIN
LDA $D401
STA $C8FF
LDA $D380
BPL NO_MISSILE_FROM_MAINCPU
LDA #1
STA <$04
LDA #$20
STA $C8FF
NO_MISSILE_FROM_MAINCPU
LDA <$04
CLR $D381
RTS
SUBCPU_HOOK_END
SUBSYS_CMD_END
| Comments are welcome.
Send E-Mail to:
|